summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2020-03-05 00:48:46 +0000
committerKarl Berry <karl@freefriends.org>2020-03-05 00:48:46 +0000
commitf210bce174e1f2f05305ab03e88e120a1cbfc4da (patch)
tree5c4e2ad096b5c745e859516ac3196fa0864292d5
parent35fd641a3546acc0c62e0aa7f134888e36da30d4 (diff)
context (from cont-tmf.zip of Feb 17 16:00, size 116339406)
git-svn-id: svn://tug.org/texlive/trunk@54086 c570f23f-e606-0410-a88d-b1316a301751
-rwxr-xr-xBuild/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun3434
-rwxr-xr-xMaster/bin/win32/mtxrun.lua3434
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-context.lua4
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua16
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metafun.lua4
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metapost.lua4
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-tex.lua6
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-cpp.lua11
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-json.lua7
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-lua.lua16
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-mps.lua4
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-sas.lua102
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-web-snippets.lua3
-rw-r--r--Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer.lua4
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context-data-context.properties221
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context-data-interfaces.properties2911
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context-data-metafun.properties80
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context-data-metapost.properties91
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context-data-tex.properties240
-rw-r--r--Master/texmf-dist/context/data/scite/context/scite-context.properties14
-rw-r--r--Master/texmf-dist/context/data/textadept/context/data/scite-context-data-context.lua4
-rw-r--r--Master/texmf-dist/context/data/textadept/context/data/scite-context-data-interfaces.lua16
-rw-r--r--Master/texmf-dist/context/data/textadept/context/data/scite-context-data-metafun.lua4
-rw-r--r--Master/texmf-dist/context/data/textadept/context/data/scite-context-data-metapost.lua4
-rw-r--r--Master/texmf-dist/context/data/textadept/context/data/scite-context-data-tex.lua6
-rw-r--r--Master/texmf-dist/context/data/textadept/context/lexers/lexer.lua4
-rw-r--r--Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-cpp.lua11
-rw-r--r--Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-json.lua7
-rw-r--r--Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-lua.lua16
-rw-r--r--Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-mps.lua4
-rw-r--r--Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-sas.lua102
-rw-r--r--Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-web-snippets.lua3
-rw-r--r--Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer.lua4
-rw-r--r--Master/texmf-dist/context/data/textadept/context/modules/textadept-context-files.lua386
-rw-r--r--Master/texmf-dist/context/data/textadept/context/modules/textadept-context-runner.lua850
-rw-r--r--Master/texmf-dist/context/data/textadept/context/modules/textadept-context-settings.lua1
-rw-r--r--Master/texmf-dist/context/data/textadept/context/modules/textadept-context-types.lua10
-rw-r--r--Master/texmf-dist/context/data/textadept/context/textadept-context.cmd54
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/keybindings/context.json20
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/package.json170
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/package.nls.json4
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-bibtex.json14
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-bnf.json11
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-cld.json21
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-cpp.json17
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-json.json14
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-lua.json21
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-mps.json20
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-pdf.json17
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-sql.json2
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-tex.json20
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-xml.json5
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-bibtex.json267
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-bnf.json74
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-cld.json209
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-cpp.json143
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-json.json278
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-lua.json184
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-mps.json179
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-pdf.json271
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-sql.json120
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-tex.json240
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-xml.json222
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/tasks/context.json73
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/themes/context.json356
-rw-r--r--Master/texmf-dist/context/data/vscode/extensions/context/vscode-context.readme5
-rw-r--r--Master/texmf-dist/context/data/vscode/settings.json45
-rw-r--r--Master/texmf-dist/context/data/vscode/vscode-context.cmd7
-rw-r--r--Master/texmf-dist/doc/context/documents/general/leaflets/leaflet-context.pdfbin0 -> 86621 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/leaflets/leaflet-luametatex.pdfbin0 -> 82912 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/leaflets/leaflet-mixing.pdfbin0 -> 65347 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/magazines/mag-1104-mkiv.pdfbin0 -> 751131 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/bidi.pdfbin136679 -> 121014 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/ecmascript-mkiv.pdfbin0 -> 41363 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/evenmore.pdfbin0 -> 1538298 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/followingup.pdfbin0 -> 559412 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/fonts-mkiv.pdf (renamed from Master/texmf-dist/doc/context/documents/general/fonts/fonts-mkiv.pdf)bin1216898 -> 1216898 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/libraries-mkiv.pdfbin64761 -> 44532 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-boxes.pdfbin0 -> 75834 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-conditionals.pdfbin0 -> 95412 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-expansion.pdfbin0 -> 48778 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-registers.pdfbin0 -> 43435 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/luametafun.pdfbin0 -> 1697432 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/luametatex.pdfbin0 -> 1183610 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/luatex.pdfbin1543776 -> 1542992 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/musings.pdfbin5761926 -> 6002933 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/sql-mkiv.pdfbin94186 -> 53962 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/svg-lmtx.pdfbin0 -> 209324 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/workflows-mkiv.pdfbin121251 -> 82860 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/xml-mkiv.pdfbin1008282 -> 899449 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-cs.pdfbin858390 -> 932229 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-de.pdfbin858974 -> 932682 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-en.pdfbin865151 -> 930546 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-fr.pdfbin857046 -> 930422 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-it.pdfbin862653 -> 934059 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-cs.pdfbin348660 -> 352043 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-de.pdfbin432927 -> 351418 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-en.pdfbin345819 -> 349070 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-fr.pdfbin348878 -> 351319 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-it.pdfbin347523 -> 350931 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-nl.pdfbin346492 -> 349696 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-ro.pdfbin510258 -> 552014 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-nl.pdfbin852048 -> 926927 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-ro.pdfbin856114 -> 930145 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/bachotex/2017/bachotex-2017-emoji-demo.pdfbin46443 -> 34029 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/bachotex/2017/bachotex-2017-emoji.pdfbin308972 -> 295505 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/bachotex/2019/bachotex-2019-followingup.pdfbin0 -> 60987 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/bachotex/2019/bachotex-2019-followingup.tex302
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-css-selectors.pdfbin0 -> 130327 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-css-selectors.tex238
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-chaintest.pdfbin0 -> 15666 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-chaintest.tex49
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-kerntest.pdfbin0 -> 15259 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-kerntest.tex25
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-pairtest.pdfbin0 -> 15703 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-pairtest.tex26
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-singletest.pdfbin0 -> 15672 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-singletest.tex25
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-spacetest.pdfbin0 -> 15716 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-spacetest.tex43
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-substitutiontest.pdfbin0 -> 17567 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-substitutiontest.tex141
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features.pdfbin0 -> 58197 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features.tex153
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-performance.pdfbin0 -> 51156 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-performance.tex65
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-synctex.pdfbin0 -> 58760 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-synctex.tex102
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-tables.pdfbin0 -> 46060 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2017/context-2017-tables.tex175
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2019/context-2019-lmtx.pdfbin0 -> 41345 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2019/context-2019-lmtx.tex201
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/pdftools.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texexec.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html3
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man9
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml3
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/textools.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texutil.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/tmftools.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/xmltools.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/context.html12
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/context.man15
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/context.xml24
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/luatools.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.html2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man8
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.xml4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html12
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man15
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml24
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-dvi.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-evohome.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.html4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man8
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.xml4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.html61
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man48
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.xml34
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.html2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man6
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.xml2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-unicode.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.html3
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man9
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.xml3
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.html53
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.man30
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.xml26
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.html3
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man9
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.xml3
-rw-r--r--Master/texmf-dist/doc/context/sources/general/fonts/manuals-explaining-contents.tex11
-rw-r--r--Master/texmf-dist/doc/context/sources/general/fonts/manuals-explaining-cover.tex199
-rw-r--r--Master/texmf-dist/doc/context/sources/general/fonts/manuals-explaining-environment.tex325
-rw-r--r--Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-common.tex80
-rw-r--r--Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-context.tex129
-rw-r--r--Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-luametatex.tex106
-rw-r--r--Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-mixing.tex450
-rw-r--r--Master/texmf-dist/doc/context/sources/general/magazines/mag-1104-mkiv.tex813
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-contents.tex9
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-fonts.tex99
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-introduction.tex53
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-lua.tex38
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-mixed.tex178
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-numbering.tex19
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-style.tex123
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-titlepage.tex33
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-vertical.tex18
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi.tex517
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-basics.tex5
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-contents.tex11
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-expansion.tex148
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-fonts.tex732
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-introduction.tex38
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-libraries.tex188
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-normalization.tex239
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-pi.tex134
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-style.tex67
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-threesix.tex739
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-titlepage.tex45
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-whattex.tex155
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore.tex25
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/mozilla-svg-001.svg72
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-bitmaps.tex189
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-cleanup.tex332
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-compilation.tex84
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-contents.tex11
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-directions.tex778
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-evolution.tex373
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-feedback.tex306
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-introduction.tex104
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-logging.tex58
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-lua.tex151
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-mp.tex166
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-performance.tex107
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-rejected.tex83
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-retrospect.tex188
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-stripping.tex369
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-stubs.tex262
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-style.tex66
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-tex.tex125
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-titlepage.tex58
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-whatsits.tex78
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup.tex34
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-appendix.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-appendix.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-demo-rule.lua (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-demo-rule.lua)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-environment.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-environment.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-extensions.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-extensions.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-features.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-features.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-formats.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-formats.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-hooks.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-hooks.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-introduction.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-introduction.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-lookups.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-lookups.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-math.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-math.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-methods.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-methods.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-mkiv.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-mkiv.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-modes.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-modes.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-scripts.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-scripts.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-tricks.tex (renamed from Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-tricks.tex)0
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/libraries/ecmascript-mkiv.tex420
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/libraries/libraries-mkiv.tex152
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-boxes.tex698
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-conditionals.tex1409
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-expansion.tex442
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-registers.tex251
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-style.tex104
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-arrow.tex166
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-axis.tex83
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-chart.tex441
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-contents.tex11
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-contour.tex771
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-followtext.tex124
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-fonts.tex328
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-function.tex296
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-grid.tex11
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-groups.tex52
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-interface.tex155
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-introduction.tex88
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-mesh-examples.tex161
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-mesh.tex78
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-outline.tex188
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-placeholder.tex163
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-shade.tex230
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-style.tex64
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-surface.tex96
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-svg.tex75
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-text.tex137
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-titlepage.tex41
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun.tex34
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/mozilla-svg-001.svg72
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/mozilla-svg-002.svg11
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-callbacks.tex822
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-contents.tex19
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-differences.tex213
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-enhancements.tex1777
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-firstpage.tex36
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-fonts.tex597
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-introduction.tex142
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-languages.tex1095
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-libraries.tex573
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-lua.tex224
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-math.tex1587
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-metapost.tex453
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-modifications.tex440
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-nodes.tex2527
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-pdf.tex565
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-preamble.tex166
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-primitives.tex395
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-registers.tex47
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-statistics.tex17
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-style.tex478
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-tex.tex2481
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-titlepage.tex53
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-fonts.tex16
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-modifications.tex14
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-preamble.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex.tex3
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-basics.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-names.tex325
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-plain.tex553
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings.tex5
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-53.tex262
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-execute.tex152
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/publications/122176.pdfbin226229 -> 226353 bytes
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/publications/124484.pdfbin50884 -> 51009 bytes
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/publications/4953942.pdfbin54853 -> 54978 bytes
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/publications/971.pdfbin30653 -> 30796 bytes
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/sql/sql-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/svg/mozilla-tiger.svg1
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx-microsoft.lua113
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx-mozilla.lua365
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx.tex547
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/svg/svglogo.svg261
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.pdfbin20433 -> 20555 bytes
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-graphics.tex51
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex2
-rw-r--r--Master/texmf-dist/doc/man/man1/context.115
-rw-r--r--Master/texmf-dist/doc/man/man1/context.man1.pdfbin23317 -> 23360 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/luatools.14
-rw-r--r--Master/texmf-dist/doc/man/man1/luatools.man1.pdfbin18487 -> 18392 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-babel.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-babel.man1.pdfbin16153 -> 16048 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-base.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-base.man1.pdfbin18506 -> 18413 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-bibtex.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-bibtex.man1.pdfbin14862 -> 14776 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-cache.18
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-cache.man1.pdfbin15965 -> 15581 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-chars.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-chars.man1.pdfbin15852 -> 15759 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-check.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-check.man1.pdfbin16048 -> 15949 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-colors.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-colors.man1.pdfbin14848 -> 14751 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-context.115
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-context.man1.pdfbin23317 -> 23360 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-dvi.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-dvi.man1.pdfbin15469 -> 15371 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-epub.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-epub.man1.pdfbin16566 -> 16473 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-evohome.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-evohome.man1.pdfbin16189 -> 16080 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-fcd.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-fcd.man1.pdfbin16810 -> 16710 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-flac.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-flac.man1.pdfbin15820 -> 15727 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-fonts.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-fonts.man1.pdfbin17404 -> 17300 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-grep.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-grep.man1.pdfbin16518 -> 16416 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-interface.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-interface.man1.pdfbin17502 -> 17405 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-metapost.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-metapost.man1.pdfbin15806 -> 15704 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-modules.18
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-modules.man1.pdfbin16197 -> 16097 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-package.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-package.man1.pdfbin15808 -> 15709 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-patterns.148
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-patterns.man1.pdfbin0 -> 16828 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-pdf.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-pdf.man1.pdfbin16111 -> 16017 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-plain.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-plain.man1.pdfbin15855 -> 15755 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-profile.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-profile.man1.pdfbin16451 -> 16345 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-rsync.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-rsync.man1.pdfbin15868 -> 15762 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-scite.16
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-scite.man1.pdfbin15958 -> 15853 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-server.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-server.man1.pdfbin16082 -> 15983 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-texworks.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-texworks.man1.pdfbin15361 -> 15266 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-timing.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-timing.man1.pdfbin15536 -> 15445 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-tools.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-tools.man1.pdfbin17913 -> 17811 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-unicode.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-unicode.man1.pdfbin15269 -> 15177 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-unzip.19
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-unzip.man1.pdfbin15741 -> 15345 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-update.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-update.man1.pdfbin17941 -> 17841 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-vscode.130
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-vscode.man1.pdfbin0 -> 14962 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-watch.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-watch.man1.pdfbin16638 -> 16550 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-youless.14
-rw-r--r--Master/texmf-dist/doc/man/man1/mtx-youless.man1.pdfbin16209 -> 16103 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/mtxrun.19
-rw-r--r--Master/texmf-dist/doc/man/man1/mtxrun.man1.pdfbin20457 -> 20538 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/texexec.14
-rw-r--r--Master/texmf-dist/doc/man/man1/texexec.man1.pdfbin17372 -> 17288 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/texmfstart.19
-rw-r--r--Master/texmf-dist/doc/man/man1/texmfstart.man1.pdfbin20457 -> 20538 bytes
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/metafun.mpiv44
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/metafun.mpxl46
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/minifun.mpiv15
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/minifun.mpxl35
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-base.mpiv6
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-blob.mpiv11
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-char.mpiv7
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-chem.mpiv13
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-cont.mpiv158
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-cont.mpxl158
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-crop.mpiv32
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-lmtx.mpxl2253
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-luas.mpiv107
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-luas.mpxl250
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-math.mpxl161
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-mlib.mpiv149
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-page.mpiv180
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-page.mpxl243
-rw-r--r--Master/texmf-dist/metapost/context/base/mpiv/mp-tool.mpiv84
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-base.lua8
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-cache.lua99
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-check.lua3
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-context.lua408
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-context.xml24
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-convert.lua2
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-fonts.lua26
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-grep.lua20
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-install.lua178
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-modules.lua11
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-patterns.lua3
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-pdf.lua1
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-plain.lua6
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-scite.lua2
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-unicode.lua32
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-unzip.lua132
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-update.lua135
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-vscode.lua3179
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-watch.lua4
-rwxr-xr-xMaster/texmf-dist/scripts/context/lua/mtxrun.lua3434
-rwxr-xr-xMaster/texmf-dist/scripts/context/stubs/install/first-setup.sh23
-rw-r--r--Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua3434
-rwxr-xr-xMaster/texmf-dist/scripts/context/stubs/unix/mtxrun3434
-rw-r--r--Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua3434
-rw-r--r--Master/texmf-dist/tex/context/base/mkii/cont-new.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/mkii/context.mkii5
-rw-r--r--Master/texmf-dist/tex/context/base/mkii/grph-trf.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/mkii/mult-cs.mkii19
-rw-r--r--Master/texmf-dist/tex/context/base/mkii/mult-de.mkii19
-rw-r--r--Master/texmf-dist/tex/context/base/mkii/mult-en.mkii19
-rw-r--r--Master/texmf-dist/tex/context/base/mkii/mult-fr.mkii20
-rw-r--r--Master/texmf-dist/tex/context/base/mkii/mult-it.mkii19
-rw-r--r--Master/texmf-dist/tex/context/base/mkii/mult-nl.mkii19
-rw-r--r--Master/texmf-dist/tex/context/base/mkii/mult-pe.mkii20
-rw-r--r--Master/texmf-dist/tex/context/base/mkii/mult-ro.mkii19
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/anch-bar.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/anch-pgr.lua10
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/anch-pgr.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/anch-pos.lua217
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/anch-pos.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/anch-snc.lua25
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/attr-col.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/attr-ini.lua12
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/attr-ini.mkiv78
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/attr-lay.lua1
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-exp.lua131
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-exp.mkiv7
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-ini.lua162
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-ini.mkiv133
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-ini.mkxl81
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-lua.lua354
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-lua.mkxl18
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-mps.lua205
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-mps.mkxl18
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-out.lua259
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-out.mkxl23
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-pdf.lua31
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-pdf.mkiv493
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-pdf.mkxl156
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-pdp.lua228
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-res.lua167
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-res.mkiv32
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-trf.lua164
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/back-trf.mkiv79
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/bibl-tra.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/buff-imp-default.mkiv12
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/buff-imp-xml.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/buff-ini.lua48
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/buff-ini.mkiv11
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/buff-ver.lua3
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/buff-ver.mkiv218
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/buff-ver.mkxl1005
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/catc-sym.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/char-def.lua4010
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/char-emj.lua375
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/char-fio.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/char-ini.lua32
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/char-tex.lua1
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/chem-str.lua11
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cldf-bas.lua32
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cldf-ini.lua116
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cldf-int.lua391
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/colo-ini.lua85
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/colo-ini.mkiv297
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/colo-ini.mkxl1407
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-cs.mkxl21
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-de.mkxl21
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-en.mkxl21
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-fil.mkiv269
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-fr.mkxl21
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-gb.mkxl21
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-it.mkxl21
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-log.mkiv75
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-new.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-nl.mkxl21
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-pe.mkxl22
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-ro.mkxl21
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/cont-run.lua5
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/context-error.lmx2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/context-lmtx-error.pdfbin0 -> 4171 bytes
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/context-lmtx-error.tex8
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/context-todo.tex58
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/context.mkiv89
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/context.mkxl619
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/core-con.lua20
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/core-con.mkiv53
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/core-def.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/core-env.mkiv122
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/core-lmt.mkxl (renamed from Master/texmf-dist/tex/context/base/mkiv/core-lmt.mkiv)11
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/core-sys.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/core-sys.mkiv12
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/core-uti.lua10
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-aux.lua18
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-bin.lua11
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-con.lua55
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-crl.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-env.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-exp.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-fil.lua83
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-ini.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-lst.lua37
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-lua.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-met.lua56
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-out.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-pre.lua22
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-res.lua647
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-sch.lua27
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-tex.lua64
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-tmp.lua318
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-tre.lua407
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-use.lua111
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-vir.lua40
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/data-zip.lua141
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/driv-ini.lua134
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/driv-ini.mkiv15
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/driv-ini.mkxl20
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/driv-shp.lua1328
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/driv-shp.mkxl18
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/export-example.css52
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/file-job.lua20
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/file-lib.lua41
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/file-mod.lua17
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-age.lua13
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-agl.lua15
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-aux.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-cff.lua340
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-con.lua53
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-ctx.lua579
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-def.lua10
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-dsp.lua225
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-emp.mklx256
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-emp.mkvi33
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-enc.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-fbk.lua3
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-fea.mkvi13
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-fil.mklx422
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-fil.mkvi20
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-imp-dimensions.lua43
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-imp-properties.lua1
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-imp-quality.lua188
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-imp-spacekerns.lua258
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-ini.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-ini.mklx2563
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-ini.mkvi477
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-lib.mkvi41
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-mat.mklx500
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-mis.lua57
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-mps.lua41
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-nod.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-ocl.lua251
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-off.lua230
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-ogr.lua670
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-one.lua42
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-onr.lua5
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-osd.lua1015
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-ota.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-otc.lua18
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-otj.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-otl.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-oto.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-otr.lua195
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-ots.lua127
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-ott.lua85
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-oup.lua46
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-pre.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-prv.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-run.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-shp.lua150
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-sol.lua3
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-sty.mklx458
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-sty.mkvi11
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-sym.mklx245
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-sym.mkvi31
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-syn.lua12
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-tfm.lua504
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-tpk.lua1304
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-tra.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/font-ttf.lua10
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/grph-bmp.lua96
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/grph-chk.lua277
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/grph-con.lua47
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/grph-fil.lua28
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/grph-img.lua738
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/grph-inc.lua124
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/grph-inc.mkiv109
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/grph-mem.lua168
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/grph-rul.lua257
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/grph-trf.mkiv58
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/hand-ini.mkiv7
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/hand-ini.mkxl111
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/java-ini.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-file.lua20
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-gzip.lua198
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-io.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-lpeg.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-lua.lua12
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-macro.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-md5.lua28
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-os.lua15
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-pdfview.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-sandbox.lua24
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-string.lua12
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-table.lua149
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/l-unicode.lua84
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lang-hyp.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lang-ini.mkiv40
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lang-ini.mkxl730
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lang-lab.mkiv47
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lang-lab.mkxl390
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lang-rep.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lang-txt.lua143
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/libs-imp-curl.lua296
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/libs-imp-ghostscript.lua111
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/libs-imp-graphicsmagick.lua77
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/libs-imp-mujs.lua126
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/libs-imp-mujs.mkxl121
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/libs-imp-mysql.lua220
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/libs-imp-postgress.lua200
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/libs-imp-sqlite.lua187
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/libs-imp-zint.lua161
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/libs-imp-zint.mkxl64
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/libs-ini.lua196
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/libs-ini.mkxl31
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-ano.lua268
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-col.lua87
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-emb.lua2224
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-eng.lua96
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-epa.lua22
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-epd.lua1313
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-fld.lua91
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-fmt.lua172
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-fnt.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-grp.lua11
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-img.lua1340
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-ini.lua128
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-lmt.lua2762
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-mis.lua25
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-nod.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-pde.lua317
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-swf.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-tag.lua206
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-u3d.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lpdf-wid.lua350
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/luat-bwc.lua44
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/luat-cnf.lua59
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/luat-cod.lua29
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/luat-env.lua13
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/luat-fio.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/luat-fmt.lua327
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/luat-ini.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/luat-ini.mkiv114
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/luat-lib.mkiv23
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/luat-mac.lua89
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/luat-run.lua88
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/luat-sto.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lxml-css.lua145
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lxml-ini.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lxml-ini.mkiv15
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lxml-lpt.lua45
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lxml-tab.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/lxml-tex.lua36
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/m-fonts-plugins.mkiv1
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/m-gnuplot.mkxl97
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/math-act.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/math-ali.mkiv88
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/math-ext.lua1
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/math-ini.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/math-ini.mkiv30
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/math-noa.lua212
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/math-stc.mkvi159
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/math-tag.lua36
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/math-vfu.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-blb.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-fig.mkiv7
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-fnt.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-imp-dum.mkiv131
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-imp-gamesymbols.mkxl349
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-imp-symbols.mkxl99
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-imp-tab.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-imp-threesix.mkxl253
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-imp-txt.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-ini.mkiv109
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-ini.mkxl1465
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-mac.mkxl66
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-pag.mkiv42
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-pag.mkxl26
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-pdf.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/meta-tex.mkiv86
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-cnt.lua2021
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.lua20
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.mkiv66
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.mkxl31
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-int.lua387
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-lmp.lua215
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-lmt.lua63
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-lua.lua663
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-mat.lua137
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.lua119
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.mkiv41
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.mkxl171
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-pps.lua227
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-run.lua570
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-scn.lua777
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mlib-svg.lua3118
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mtx-context-copy.tex10
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mtx-context-listing.tex8
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mtx-context-markdown.tex92
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mult-aux.mkiv603
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mult-aux.mkxl1170
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mult-chk.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mult-def.lua84
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mult-def.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mult-fun.lua28
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mult-ini.mkiv60
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mult-low.lua22
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mult-mes.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mult-mps.lua11
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mult-prm.lua127
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/mult-sys.mkiv55
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-aux.lua372
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-bck.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-cmp.lua232
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-dir.lua146
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-fin.lua222
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-fnt.lua15
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-ini.lua319
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-ini.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-ltp.lua1840
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-met.lua246
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-mig.lua28
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-nut.lua349
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-par.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-pro.lua5
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-ref.lua248
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-res.lua72
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-rul.lua111
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-rul.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-scn.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-syn.lua29
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/node-tra.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/pack-bck.mkvi7
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/pack-box.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/pack-com.mkiv84
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/pack-lyr.mkiv85
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/pack-lyr.mkxl794
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/pack-mrl.mkiv64
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/pack-obj.mkiv20
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/pack-ori.lua70
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/pack-ori.mkxl88
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/pack-rul.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/pack-rul.mkiv207
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/pack-rul.mkxl3089
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-box.mkvi4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-col.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-cst.lua39
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-cst.mkiv29
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-ffl.mkiv64
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-flt.lua45
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-flt.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-imp.mkiv29
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-ini.lua32
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-ini.mkiv33
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-inj.mkvi2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-lay.mkiv72
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-lin.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-lin.mkvi37
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-mix.lua74
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-mix.mkiv29
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-mul.mkiv15
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-not.mkiv26
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-one.mkiv76
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-otr.mkvi4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-pcl.mkiv34
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-run.lua35
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-run.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-sid.mkiv38
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-str.lua98
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-txt.mklx969
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/page-txt.mkvi52
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/phys-dim.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/publ-imp-apa.mkvi10
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/publ-imp-aps.mkvi6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/publ-imp-chicago.lua560
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/publ-imp-chicago.mkvi1686
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/publ-imp-cite.mkvi6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/publ-ini.lua80
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/publ-ini.mkiv5
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/publ-tra.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/regi-ini.lua35
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/regi-ini.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/scrn-bar.mkvi4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/scrn-but.mkvi4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/scrn-wid.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/scrn-wid.mkvi5
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/scrp-ini.lua17
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/spac-ali.lua18
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/spac-ali.mkiv50
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/spac-chr.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/spac-flr.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/spac-hor.mkiv31
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/spac-par.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/spac-prf.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/spac-ver.lua120
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/spac-ver.mkiv229
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/spac-ver.mkxl2605
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/status-files.pdfbin26606 -> 26753 bytes
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/status-lua.pdfbin265935 -> 269549 bytes
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-bkm.lua13
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-blk.lua10
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-con.mkvi3
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-def.mkiv146
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-doc.lua29
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-flt.mkvi278
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-itm.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-itm.mklx1882
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-itm.mkvi196
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-lnt.mkvi7
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-lst.mkvi6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-mar.lua78
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-not.mkvi24
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-pag.lua37
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-ref.lua49
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-ref.mkvi20
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-reg.lua154
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-reg.mkiv104
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-ren.mkiv24
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-sec.mkiv84
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-tag.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-tag.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/strc-tnt.mkiv120
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/supp-box.lua223
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/supp-box.mkiv527
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/supp-box.mkxl2952
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/supp-mat.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/supp-ran.lua22
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/symb-emj.lua1
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/symb-ini.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/syst-aux.lua57
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/syst-aux.mkiv1602
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/syst-aux.mkxl6587
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/syst-con.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/syst-con.mkiv105
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/syst-con.mkxl93
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/syst-ini.mkiv160
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/syst-ini.mkxl1111
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/syst-lua.lua242
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/syst-lua.mkiv122
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/syst-lua.mkxl100
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/syst-mes.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/tabl-frm.mkiv52
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/tabl-ltb.mkiv57
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/tabl-ntb.mkiv245
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/tabl-ntb.mkxl2202
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/tabl-tab.mkiv11
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/tabl-tbl.mkiv222
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/tabl-tbl.mkxl3022
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/tabl-tsp.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/tabl-xtb.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/tabl-xtb.mkvi11
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/toks-ini.lua120
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/toks-scn.lua26
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/trac-ctx.lua14
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/trac-deb.lua290
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/trac-exp.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/trac-inf.lua127
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/trac-lmx.lua3
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/trac-log.lua81
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/trac-set.lua11
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/trac-tex.mkiv31
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/trac-vis.lua68
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/type-ini.lua11
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/type-ini.mklx618
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/type-ini.mkvi47
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/type-set.mkiv12
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-bld.lua67
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-brk.lua14
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-cap.lua8
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-chr.lua22
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-chr.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-del.mkiv15
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-dha.lua3
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-drp.lua422
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-drp.mkiv20
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-dua.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-dub.lua5
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-duc.lua5
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-fln.lua72
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-fln.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-inj.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-itc.lua93
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-krn.lua13
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-lin.lua5
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-mar.lua17
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-ovl.lua24
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-pag.lua143
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-par.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-scr.mkiv24
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-sus.lua1
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-tal.lua23
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-tal.mkiv34
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/typo-wrp.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-deb.lua10
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-dim.lua14
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-jsn.lua486
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-lib.lua55
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-lua.lua14
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-pck.lua11
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-sac.lua85
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-sbx.lua81
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-sci.lua90
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-seq.lua14
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-sha.lua248
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-soc-imp-copas.lua10
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-sql-imp-ffi.lua5
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-sql-imp-sqlite.lua1
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-sql.lua49
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-sta.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-str.lua106
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-tab.lua257
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-tpl.lua68
-rw-r--r--Master/texmf-dist/tex/context/base/mkiv/util-zip.lua563
-rw-r--r--Master/texmf-dist/tex/context/filenames.pdfbin0 -> 25145 bytes
-rw-r--r--Master/texmf-dist/tex/context/filenames.tex119
-rw-r--r--Master/texmf-dist/tex/context/fonts/mkiv/type-imp-cambria.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/fonts/mkiv/type-imp-cow.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/fonts/mkiv/type-imp-dejavu.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/fonts/mkiv/type-imp-ebgaramond.mkiv40
-rw-r--r--Master/texmf-dist/tex/context/fonts/mkiv/type-imp-libertinus.mkiv7
-rw-r--r--Master/texmf-dist/tex/context/fonts/mkiv/type-imp-opendyslexic.mkiv55
-rw-r--r--Master/texmf-dist/tex/context/fonts/mkiv/type-imp-plex.mkiv27
-rw-r--r--Master/texmf-dist/tex/context/fonts/mkiv/type-imp-texgyre.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/interface/mkii/keys-cs.xml19
-rw-r--r--Master/texmf-dist/tex/context/interface/mkii/keys-de.xml19
-rw-r--r--Master/texmf-dist/tex/context/interface/mkii/keys-en.xml19
-rw-r--r--Master/texmf-dist/tex/context/interface/mkii/keys-fr.xml20
-rw-r--r--Master/texmf-dist/tex/context/interface/mkii/keys-it.xml19
-rw-r--r--Master/texmf-dist/tex/context/interface/mkii/keys-nl.xml19
-rw-r--r--Master/texmf-dist/tex/context/interface/mkii/keys-pe.xml20
-rw-r--r--Master/texmf-dist/tex/context/interface/mkii/keys-ro.xml19
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/context-en.xml2273
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-align.xml1
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-attachment.xml3
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-boxes.xml125
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-capitals.xml18
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-chart.xml3
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-columns.xml10
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-common-argument.xml24
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-common-instance.xml1
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-common-string.xml22
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-common-value.xml127
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-context.pdfbin865151 -> 930546 bytes
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-context.xml2
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-conversion.xml15
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-direction.xml18
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-fittingpage.xml62
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-floats.xml10
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-graphics.xml2
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-interactionscreen.xml3
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-itemgroup.xml728
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-layout.xml6
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-logo.xml84
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-math.xml56
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-mathfence.xml51
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-mixedcolumns.xml10
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-note.xml51
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-pagegrid.xml24
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-pagenumber.xml34
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-paragraphs.xml1
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-readme.pdfbin61161 -> 25081 bytes
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-register.xml609
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-section.xml28
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-simplecolumns.xml34
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-symbol.xml13
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-texts.xml331
-rw-r--r--Master/texmf-dist/tex/context/interface/mkiv/i-vspace.xml6
-rw-r--r--Master/texmf-dist/tex/context/modules/common/s-abbreviations-logos.tex38
-rw-r--r--Master/texmf-dist/tex/context/modules/common/s-abbreviations-mixed.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/m-asymptote.lua4
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/m-catchword.mkiv136
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/m-chart.lua7
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/m-chart.mkvi2
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/m-markdown.lua824
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/m-markdown.mkiv88
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/m-punk.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/m-scite.mkiv20
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/m-simulate.mkiv222
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/m-sql.mkiv5
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/m-zint.mkiv112
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/s-abbreviations-mixed.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/s-cgj.mkiv750
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/s-fonts-features.lua1
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/s-fonts-system.lua2
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/s-fonts-tables.lua2
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.mkiv34
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/s-inf-01.mkvi52
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/s-inf-03.mkiv11
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/s-magazine-basic.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/s-maps.mkiv820
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/s-present-luatex.mkiv118
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/s-tugboat.mkiv818
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/x-asciimath.lua35
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/x-pandoc.mkiv152
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/x-setups-basics.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/modules/mkiv/x-setups-overview.mkiv39
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-af.rme28
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-agr.rme58
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-ala.rme36
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-bg.rme889
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-ca.rme71
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-cs.rme31
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-cy.rme46
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-da.rme41
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-de.rme72
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-deo.rme72
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-es.rme43
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-et.rme46
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-eu.rme58
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-fi.rme23
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-fr.rme49
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-gb.rme59
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-hr.rme52
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-hu.rme45
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-is.rme25
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-it.rme44
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-la.rme147
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-lt.rme46
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-lv.rme14
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-mk.rme3
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-ml.rme27
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-mn.rme52
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-nb.rme34
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-nl.rme44
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-nn.rme34
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-pl.rme35
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-pt.rme57
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-ro.rme56
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-ru.rme23
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-sk.rme29
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-sl.rme56
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-sr.rme26
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-sv.rme58
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-th.rme19
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-tk.rme29
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-tr.rme35
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-uk.rme17
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-us.rme39
-rw-r--r--Master/texmf-dist/tex/context/patterns/common/lang-zh.rme34
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkii/lang-de.pat15245
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkii/lang-deo.pat16820
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkii/lang-mk.hyp8
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkii/lang-mk.pat732
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkii/lang-zh.pat551
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-af.lua29
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-agr.lua59
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-ala.lua37
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-bg.lua890
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-ca.lua72
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-cs.lua32
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-cy.lua47
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-da.lua42
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-de.lua81
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-deo.lua81
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-es.lua44
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-et.lua47
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-eu.lua59
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-fi.lua24
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-fr.lua50
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-gb.lua60
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-hr.lua53
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-hu.lua46
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-is.lua26
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-it.lua45
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-la.lua148
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-lt.lua47
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-lv.lua15
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-mk.lua20
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-ml.lua28
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-mn.lua53
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-nb.lua35
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-nl.lua45
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-nn.lua35
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-pl.lua36
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-pt.lua58
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-ro.lua57
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-ru.lua24
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-sk.lua30
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-sl.lua57
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-sr.lua27
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-sv.lua59
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-th.lua20
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-tk.lua30
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-tr.lua36
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-uk.lua18
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-us.lua40
-rw-r--r--Master/texmf-dist/tex/context/patterns/mkiv/lang-zh.lua43
-rw-r--r--Master/texmf-dist/tex/context/sample/common/gray.tex3
-rw-r--r--Master/texmf-dist/tex/context/sample/common/samples.tex1
-rw-r--r--Master/texmf-dist/tex/context/sample/third/dyrynk-cz.tex6
-rw-r--r--Master/texmf-dist/tex/context/sample/third/dyrynk-vlnka-cz.tex7
-rw-r--r--Master/texmf-dist/tex/context/sample/third/hviezdoslav-sk.tex39
-rw-r--r--Master/texmf-dist/tex/context/sample/third/hviezdoslav-vlnka-sk.tex39
-rw-r--r--Master/texmf-dist/tex/context/sample/third/jaros-sk.tex5
-rw-r--r--Master/texmf-dist/tex/context/sample/third/jaros-vlnka-sk.tex5
-rw-r--r--Master/texmf-dist/tex/context/sample/third/kollar-cz.tex1
-rw-r--r--Master/texmf-dist/tex/context/sample/third/komensky-cz.tex2
-rw-r--r--Master/texmf-dist/tex/context/sample/third/komensky-vlnka-cz.tex2
-rw-r--r--Master/texmf-dist/tex/context/sample/third/slova-sk.tex5
-rw-r--r--Master/texmf-dist/tex/context/sample/third/smrek-sk.tex40
-rw-r--r--Master/texmf-dist/tex/context/sample/third/smrek-vlnka-sk.tex40
-rw-r--r--Master/texmf-dist/tex/context/test/mkiv/pdf-a1a-2005.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/test/mkiv/pdf-a1b-2005.mkiv12
-rw-r--r--Master/texmf-dist/tex/context/test/mkiv/pdf-a2a.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/test/mkiv/pdf-a2b.mkiv48
-rw-r--r--Master/texmf-dist/tex/context/test/mkiv/pdf-a2u.mkiv48
-rw-r--r--Master/texmf-dist/tex/context/test/mkiv/pdf-a3a.mkiv18
-rw-r--r--Master/texmf-dist/tex/context/test/mkiv/pdf-a3b.mkiv47
-rw-r--r--Master/texmf-dist/tex/context/test/mkiv/pdf-a3u.mkiv47
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-basics-chr.lua409
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua137
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-basics-prepare.tex32
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-core.lua217
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua2723
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-tfm.lua654
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua6
-rwxr-xr-xMaster/tlpkg/bin/tlpkginfo2
1190 files changed, 176906 insertions, 52697 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun b/Build/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun
index 98fe7f752e3..5907fa33c66 100755
--- a/Build/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun
+++ b/Build/source/texk/texlive/linked_scripts/context/stubs/unix/mtxrun
@@ -194,7 +194,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 6330, stripped down to: 2831
+-- original size: 6529, stripped down to: 2933
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -313,6 +313,9 @@ elseif not ffi.number then
end
if LUAVERSION>5.3 then
end
+if status and os.setenv then
+ os.setenv("engine",string.lower(status.luatex_engine or "unknown"))
+end
end -- of closure
@@ -321,7 +324,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-macro"] = package.loaded["l-macro"] or true
--- original size: 10131, stripped down to: 5991
+-- original size: 10130, stripped down to: 5990
if not modules then modules={} end modules ['l-macros']={
version=1.001,
@@ -546,7 +549,7 @@ end
macros.loaded=loaded
function required(name,trace)
local filename=file.addsuffix(name,"lua")
- local fullname=resolvers and resolvers.find_file(filename) or filename
+ local fullname=resolvers and resolvers.findfile(filename) or filename
if not fullname or fullname=="" then
return false
end
@@ -576,7 +579,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-sandbox"] = package.loaded["l-sandbox"] or true
--- original size: 9747, stripped down to: 6313
+-- original size: 9604, stripped down to: 6394
if not modules then modules={} end modules ['l-sandbox']={
version=1.001,
@@ -808,6 +811,9 @@ local function supported(library)
return l
end
loadfile=register(loadfile,"loadfile")
+if supported("lua") then
+ lua.openfile=register(lua.openfile,"lua.openfile")
+end
if supported("io") then
io.open=register(io.open,"io.open")
io.popen=register(io.popen,"io.popen")
@@ -1168,7 +1174,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true
--- original size: 38434, stripped down to: 19310
+-- original size: 38440, stripped down to: 19316
if not modules then modules={} end modules ['l-lpeg']={
version=1.001,
@@ -1337,7 +1343,7 @@ patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+unders
patterns.somecontent=(anything-newline-space)^1
patterns.beginline=#(1-newline)
patterns.longtostring=Cs(whitespace^0/""*((patterns.quoted+nonwhitespace^1+whitespace^1/""*(endofstring+Cc(" ")))^0))
-function anywhere(pattern)
+local function anywhere(pattern)
return (1-P(pattern))^0*P(pattern)
end
lpeg.anywhere=anywhere
@@ -1967,7 +1973,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-string"] = package.loaded["l-string"] or true
--- original size: 6461, stripped down to: 3255
+-- original size: 6644, stripped down to: 3410
if not modules then modules={} end modules ['l-string']={
version=1.001,
@@ -2031,9 +2037,11 @@ function string.is_empty(str)
end
end
local anything=patterns.anything
-local allescapes=Cc("%")*S(".-+%?()[]*")
-local someescapes=Cc("%")*S(".-+%()[]")
-local matchescapes=Cc(".")*S("*?")
+local moreescapes=Cc("%")*S(".-+%?()[]*$^{}")
+local allescapes=Cc("%")*S(".-+%?()[]*")
+local someescapes=Cc("%")*S(".-+%()[]")
+local matchescapes=Cc(".")*S("*?")
+local pattern_m=Cs ((moreescapes+anything )^0 )
local pattern_a=Cs ((allescapes+anything )^0 )
local pattern_b=Cs ((someescapes+matchescapes+anything )^0 )
local pattern_c=Cs (Cc("^")*(someescapes+matchescapes+anything )^0*Cc("$") )
@@ -2043,6 +2051,8 @@ end
function string.topattern(str,lowercase,strict)
if str=="" or type(str)~="string" then
return ".*"
+ elseif strict=="all" then
+ str=lpegmatch(pattern_m,str)
elseif strict then
str=lpegmatch(pattern_c,str)
else
@@ -2092,7 +2102,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-table"] = package.loaded["l-table"] or true
--- original size: 41332, stripped down to: 21508
+-- original size: 41758, stripped down to: 22643
if not modules then modules={} end modules ['l-table']={
version=1.001,
@@ -2101,7 +2111,7 @@ if not modules then modules={} end modules ['l-table']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local type,next,tostring,tonumber,select=type,next,tostring,tonumber,select
+local type,next,tostring,tonumber,select,rawget=type,next,tostring,tonumber,select,rawget
local table,string=table,string
local concat,sort=table.concat,table.sort
local format,lower,dump=string.format,string.lower,string.dump
@@ -2435,13 +2445,13 @@ function table.fromhash(t)
end
return hsh
end
-local noquotes,hexify,handle,compact,inline,functions,metacheck
+local noquotes,hexify,handle,compact,inline,functions,metacheck,accurate
local reserved=table.tohash {
'and','break','do','else','elseif','end','false','for','function','if',
'in','local','nil','not','or','repeat','return','then','true','until','while',
- 'NaN','goto',
+ 'NaN','goto','const',
}
-local function is_simple_table(t,hexify)
+local function is_simple_table(t,hexify,accurate)
local nt=#t
if nt>0 then
local n=0
@@ -2460,6 +2470,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i]=format("0x%X",v)
+ elseif accurate then
+ tt[i]=format("%q",v)
else
tt[i]=v
end
@@ -2480,6 +2492,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i+1]=format("0x%X",v)
+ elseif accurate then
+ tt[i+1]=format("%q",v)
else
tt[i+1]=v
end
@@ -2551,6 +2565,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tv=="number" then
if hexify then
handle(format("%s 0x%X,",depth,v))
+ elseif accurate then
+ handle(format("%s %q,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -2560,7 +2576,7 @@ local function do_serialize(root,name,depth,level,indexed)
if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
handle(format("%s { %s },",depth,concat(st,", ")))
else
@@ -2588,12 +2604,16 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
@@ -2601,12 +2621,16 @@ local function do_serialize(root,name,depth,level,indexed)
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
handle(format("%s %s=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s %s=%q,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
handle(format("%s [%q]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -2615,6 +2639,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -2631,6 +2657,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={},",depth,k))
+ elseif accurate then
+ handle(format("%s [%q]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -2643,11 +2671,13 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s [%q]={},",depth,k))
end
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
+ elseif accurate then
+ handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -2669,6 +2699,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
+ elseif accurate then
+ handle(format("%s [%q]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -2688,6 +2720,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=load(%q),",depth,k,f))
+ elseif accurate then
+ handle(format("%s [%q]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -2705,6 +2739,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -2728,6 +2764,7 @@ local function serialize(_handle,root,name,specification)
if type(specification)=="table" then
noquotes=specification.noquotes
hexify=specification.hexify
+ accurate=specification.accurate
handle=_handle or specification.handle or print
functions=specification.functions
compact=specification.compact
@@ -3043,7 +3080,7 @@ end
local function sequenced(t,sep,simple)
if not t then
return ""
- elseif type(t)=="string" then
+ elseif type(t)~="table" then
return t
end
local n=#t
@@ -3082,7 +3119,11 @@ local function sequenced(t,sep,simple)
end
end
end
- return concat(s,sep or " | ")
+ if sep==true then
+ return "{ "..concat(s,", ").." }"
+ else
+ return concat(s,sep or " | ")
+ end
end
table.sequenced=sequenced
function table.print(t,...)
@@ -3213,7 +3254,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-io"] = package.loaded["l-io"] or true
--- original size: 11823, stripped down to: 6325
+-- original size: 11829, stripped down to: 6331
if not modules then modules={} end modules ['l-io']={
version=1.001,
@@ -3227,7 +3268,7 @@ local open,flush,write,read=io.open,io.flush,io.write,io.read
local byte,find,gsub,format=string.byte,string.find,string.gsub,string.format
local concat=table.concat
local type=type
-if string.find(os.getenv("PATH"),";",1,true) then
+if string.find(os.getenv("PATH") or "",";",1,true) then
io.fileseparator,io.pathseparator="\\",";"
else
io.fileseparator,io.pathseparator="/",":"
@@ -3765,7 +3806,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 18916, stripped down to: 10126
+-- original size: 19102, stripped down to: 10192
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -3779,7 +3820,7 @@ local date,time=os.date,os.time
local find,format,gsub,upper,gmatch=string.find,string.format,string.gsub,string.upper,string.gmatch
local concat=table.concat
local random,ceil,randomseed=math.random,math.ceil,math.randomseed
-local rawget,rawset,type,getmetatable,setmetatable,tonumber,tostring=rawget,rawset,type,getmetatable,setmetatable,tonumber,tostring
+local type,setmetatable,tonumber,tostring=type,setmetatable,tonumber,tostring
do
local selfdir=os.selfdir
if selfdir=="" then
@@ -3930,7 +3971,8 @@ local launchers={
unix="xdg-open %s &> /dev/null &",
}
function os.launch(str)
- execute(format(launchers[os.name] or launchers.unix,str))
+ local command=format(launchers[os.name] or launchers.unix,str)
+ execute(command)
end
local gettimeofday=os.gettimeofday or os.clock
os.gettimeofday=gettimeofday
@@ -4185,6 +4227,12 @@ function os.validdate(year,month,day)
end
return year,month,day
end
+function os.date(fmt,...)
+ if not fmt then
+ fmt="%Y-%m-%d %H:%M"
+ end
+ return date(fmt,...)
+end
local osexit=os.exit
local exitcode=nil
function os.setexitcode(code)
@@ -4207,7 +4255,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 21984, stripped down to: 10148
+-- original size: 22175, stripped down to: 10302
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -4229,15 +4277,24 @@ local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
local attributes=lfs.attributes
function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
+ if name then
+ return attributes(name,"mode")=="directory"
+ end
end
function lfs.isfile(name)
- local a=attributes(name,"mode")
- return a=="file" or a=="link" or nil
+ if name then
+ local a=attributes(name,"mode")
+ return a=="file" or a=="link" or nil
+ end
end
function lfs.isfound(name)
- local a=attributes(name,"mode")
- return (a=="file" or a=="link") and name or nil
+ if name then
+ local a=attributes(name,"mode")
+ return (a=="file" or a=="link") and name or nil
+ end
+end
+function lfs.modification(name)
+ return name and attributes(name,"modification") or nil
end
if sandbox then
sandbox.redefine(lfs.isfile,"lfs.isfile")
@@ -4616,7 +4673,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-gzip"] = package.loaded["l-gzip"] or true
--- original size: 1211, stripped down to: 951
+-- original size: 5115, stripped down to: 1699
if not modules then modules={} end modules ['l-gzip']={
version=1.001,
@@ -4624,43 +4681,75 @@ if not modules then modules={} end modules ['l-gzip']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-if not gzip then
- return
-end
-local suffix,suffixes=file.suffix,file.suffixes
-function gzip.load(filename)
- local f=io.open(filename,"rb")
- if not f then
- elseif suffix(filename)=="gz" then
- f:close()
- local g=gzip.open(filename,"rb")
- if g then
- local str=g:read("*all")
- g:close()
- return str
+gzip=gzip or {}
+if not zlib then
+ zlib=xzip
+elseif not xzip then
+ xzip=zlib
+end
+if zlib then
+ local suffix=file.suffix
+ local suffixes=file.suffixes
+ local find=string.find
+ local openfile=io.open
+ local gzipwindow=15+16
+ local gziplevel=3
+ local identifier="^\x1F\x8B\x08"
+ local compress=zlib.compress
+ local decompress=zlib.decompress
+ function gzip.load(filename)
+ local f=openfile(filename,"rb")
+ if not f then
+ else
+ local data=f:read("*all")
+ f:close()
+ if data and data~="" then
+ if suffix(filename)=="gz" then
+ data=decompress(data,gzipwindow)
+ end
+ return data
+ end
end
- else
- local str=f:read("*all")
- f:close()
- return str
end
-end
-function gzip.save(filename,data)
- if suffix(filename)~="gz" then
- filename=filename..".gz"
+ function gzip.save(filename,data,level)
+ if suffix(filename)~="gz" then
+ filename=filename..".gz"
+ end
+ local f=openfile(filename,"wb")
+ if f then
+ data=compress(data or "",level or gziplevel,nil,gzipwindow)
+ f:write(data)
+ f:close()
+ return #data
+ end
end
- local f=io.open(filename,"wb")
- if f then
- local s=zlib.compress(data or "",9,nil,15+16)
- f:write(s)
- f:close()
- return #s
+ function gzip.suffix(filename)
+ local suffix,extra=suffixes(filename)
+ local gzipped=extra=="gz"
+ return suffix,gzipped
+ end
+ function gzip.compressed(s)
+ return s and find(s,identifier)
+ end
+ function gzip.compress(s,level)
+ if s and not find(s,identifier) then
+ if not level then
+ level=gziplevel
+ elseif level<=0 then
+ return s
+ elseif level>9 then
+ level=9
+ end
+ return compress(s,level or gziplevel,nil,gzipwindow) or s
+ end
+ end
+ function gzip.decompress(s)
+ if s and find(s,identifier) then
+ return decompress(s,gzipwindow)
+ else
+ return s
+ end
end
-end
-function gzip.suffix(filename)
- local suffix,extra=suffixes(filename)
- local gzipped=extra=="gz"
- return suffix,gzipped
end
@@ -4670,7 +4759,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-md5"] = package.loaded["l-md5"] or true
--- original size: 3309, stripped down to: 2218
+-- original size: 3414, stripped down to: 2307
if not modules then modules={} end modules ['l-md5']={
version=1.001,
@@ -4689,6 +4778,8 @@ if not md5 then
end
local md5,file=md5,file
local gsub=string.gsub
+local modification,isfile,touch=lfs.modification,lfs.isfile,lfs.touch
+local loaddata,savedata=io.loaddata,io.savedata
do
local patterns=lpeg and lpeg.patterns
if patterns then
@@ -4704,10 +4795,11 @@ do
md5.sumHEXA=md5.HEX
end
end
+local md5HEX=md5.HEX
function file.needsupdating(oldname,newname,threshold)
- local oldtime=lfs.attributes(oldname,"modification")
+ local oldtime=modification(oldname)
if oldtime then
- local newtime=lfs.attributes(newname,"modification")
+ local newtime=modification(newname)
if not newtime then
return true
elseif newtime>=oldtime then
@@ -4723,31 +4815,32 @@ function file.needsupdating(oldname,newname,threshold)
end
file.needs_updating=file.needsupdating
function file.syncmtimes(oldname,newname)
- local oldtime=lfs.attributes(oldname,"modification")
- if oldtime and lfs.isfile(newname) then
- lfs.touch(newname,oldtime,oldtime)
+ local oldtime=modification(oldname)
+ if oldtime and isfile(newname) then
+ touch(newname,oldtime,oldtime)
end
end
-function file.checksum(name)
+local function checksum(name)
if md5 then
- local data=io.loaddata(name)
+ local data=loaddata(name)
if data then
- return md5.HEX(data)
+ return md5HEX(data)
end
end
return nil
end
+file.checksum=checksum
function file.loadchecksum(name)
if md5 then
- local data=io.loaddata(name..".md5")
+ local data=loaddata(name..".md5")
return data and (gsub(data,"%s",""))
end
return nil
end
function file.savechecksum(name,checksum)
- if not checksum then checksum=file.checksum(name) end
+ if not checksum then checksum=checksum(name) end
if checksum then
- io.savedata(name..".md5",checksum)
+ savedata(name..".md5",checksum)
return checksum
end
return nil
@@ -5636,7 +5729,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-unicode"] = package.loaded["l-unicode"] or true
--- original size: 41047, stripped down to: 17171
+-- original size: 41281, stripped down to: 17261
if not modules then modules={} end modules ['l-unicode']={
version=1.001,
@@ -6151,49 +6244,52 @@ end
function utf.utf32_to_utf8_t(t,endian)
return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(b)
- if b<0x10000 then
- return char(b%256,rshift(b,8))
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+if bit32 then
+ local rshift=bit32.rshift
+ local function little(b)
+ if b<0x10000 then
+ return char(b%256,rshift(b,8))
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+ end
end
-end
-local function big(b)
- if b<0x10000 then
- return char(rshift(b,8),b%256)
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ local function big(b)
+ if b<0x10000 then
+ return char(rshift(b,8),b%256)
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ end
end
-end
-local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
-local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
-local function utf8_to_utf16_be(str,nobom)
- if nobom then
- return lpegmatch(b_remap,str)
- else
- return char(254,255)..lpegmatch(b_remap,str)
+ local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+ local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+ local function utf8_to_utf16_be(str,nobom)
+ if nobom then
+ return lpegmatch(b_remap,str)
+ else
+ return char(254,255)..lpegmatch(b_remap,str)
+ end
end
-end
-local function utf8_to_utf16_le(str,nobom)
- if nobom then
- return lpegmatch(l_remap,str)
- else
- return char(255,254)..lpegmatch(l_remap,str)
+ local function utf8_to_utf16_le(str,nobom)
+ if nobom then
+ return lpegmatch(l_remap,str)
+ else
+ return char(255,254)..lpegmatch(l_remap,str)
+ end
end
-end
-utf.utf8_to_utf16_be=utf8_to_utf16_be
-utf.utf8_to_utf16_le=utf8_to_utf16_le
-function utf.utf8_to_utf16(str,littleendian,nobom)
- if littleendian then
- return utf8_to_utf16_le(str,nobom)
- else
- return utf8_to_utf16_be(str,nobom)
+ utf.utf8_to_utf16_be=utf8_to_utf16_be
+ utf.utf8_to_utf16_le=utf8_to_utf16_le
+ function utf.utf8_to_utf16(str,littleendian,nobom)
+ if littleendian then
+ return utf8_to_utf16_le(str,nobom)
+ else
+ return utf8_to_utf16_be(str,nobom)
+ end
end
end
local pattern=Cs (
@@ -6467,7 +6563,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 43488, stripped down to: 21595
+-- original size: 45188, stripped down to: 22734
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -6797,6 +6893,13 @@ local template=[[
%s
return function(%s) return %s end
]]
+local pattern=Cs(Cc('"')*(
+ (1-S('"\\\n\r'))^1+P('"')/'\\"'+P('\\')/'\\\\'+P('\n')/'\\n'+P('\r')/'\\r'
+)^0*Cc('"'))
+patterns.escapedquotes=pattern
+function string.escapedquotes(s)
+ return lpegmatch(pattern,s)
+end
local preamble=""
local environment={
global=global or _G,
@@ -6821,9 +6924,10 @@ local environment={
formattednumber=number.formatted,
sparseexponent=number.sparseexponent,
formattedfloat=number.formattedfloat,
- stripzero=lpeg.patterns.stripzero,
- stripzeros=lpeg.patterns.stripzeros,
- FORMAT=string.f9,
+ stripzero=patterns.stripzero,
+ stripzeros=patterns.stripzeros,
+ escapedquotes=string.escapedquotes,
+ FORMAT=string.f6,
}
local arguments={ "a1" }
setmetatable(arguments,{ __index=function(t,k)
@@ -6874,13 +6978,16 @@ local format_left=function(f)
return format("a%s..utfpadding(a%s,%i)",n,n,-f)
end
end
-local format_q=function()
+local format_q=JITSUPPORTED and function()
n=n+1
return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n)
+end or function()
+ n=n+1
+ return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n)
end
local format_Q=function()
n=n+1
- return format("format('%%q',tostring(a%s))",n)
+ return format("escapedquotes(tostring(a%s))",n)
end
local format_i=function(f)
n=n+1
@@ -7031,12 +7138,25 @@ local format_n=function()
n=n+1
return format("((a%s %% 1 == 0) and format('%%i',a%s) or tostring(a%s))",n,n,n)
end
-local format_N=function(f)
- n=n+1
- if not f or f=="" then
- f=".9"
- end
- return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+local format_N if environment.FORMAT then
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ return format("FORMAT(a%s,'%%.9f')",n)
+ elseif f==".6" or f=="0.6" then
+ return format("FORMAT(a%s)",n)
+ else
+ return format("FORMAT(a%s,'%%%sf')",n,f)
+ end
+ end
+else
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ f=".9"
+ end
+ return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+ end
end
local format_a=function(f)
n=n+1
@@ -7265,9 +7385,9 @@ patterns.xmlescape=Cs((P("<")/"&lt;"+P(">")/"&gt;"+P("&")/"&amp;"+P('"')/"&quot;
patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+anything)^0)
patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0)
patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"'))
-add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=lpeg.patterns.xmlescape })
-add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
-add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
+add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=patterns.xmlescape })
+add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=patterns.texescape })
+add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=patterns.luaescape })
local dquote=patterns.dquote
local equote=patterns.escaped+dquote/'\\"'+1
local cquote=Cc('"')
@@ -7299,6 +7419,27 @@ local f_16_16=formatters["%0.5N"]
function number.to16dot16(n)
return f_16_16(n/65536.0)
end
+if not string.explode then
+ local tsplitat=lpeg.tsplitat
+ local p_utf=patterns.utf8character
+ local p_check=C(p_utf)*(P("+")*Cc(true))^0
+ local p_split=Ct(C(p_utf)^0)
+ local p_space=Ct((C(1-P(" ")^1)+P(" ")^1)^0)
+ function string.explode(str,symbol)
+ if symbol=="" then
+ return lpegmatch(p_split,str)
+ elseif symbol then
+ local a,b=lpegmatch(p_check,symbol)
+ if b then
+ return lpegmatch(tsplitat(P(a)^1),str)
+ else
+ return lpegmatch(tsplitat(a),str)
+ end
+ else
+ return lpegmatch(p_space,str)
+ end
+ end
+end
end -- of closure
@@ -7307,7 +7448,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 28866, stripped down to: 16134
+-- original size: 32649, stripped down to: 18257
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -7544,78 +7685,160 @@ function tables.encapsulate(core,capsule,protect)
} )
end
end
-local f_hashed_string=formatters["[%q]=%q,"]
-local f_hashed_number=formatters["[%q]=%s,"]
-local f_hashed_boolean=formatters["[%q]=%l,"]
-local f_hashed_table=formatters["[%q]="]
-local f_indexed_string=formatters["[%s]=%q,"]
-local f_indexed_number=formatters["[%s]=%s,"]
-local f_indexed_boolean=formatters["[%s]=%l,"]
-local f_indexed_table=formatters["[%s]="]
-local f_ordered_string=formatters["%q,"]
-local f_ordered_number=formatters["%s,"]
-local f_ordered_boolean=formatters["%l,"]
-function table.fastserialize(t,prefix)
- local r={ type(prefix)=="string" and prefix or "return" }
- local m=1
- local function fastserialize(t,outer)
- local n=#t
- m=m+1
- r[m]="{"
- if n>0 then
- for i=0,n do
- local v=t[i]
- local tv=type(v)
- if tv=="string" then
- m=m+1 r[m]=f_ordered_string(v)
- elseif tv=="number" then
- m=m+1 r[m]=f_ordered_number(v)
- elseif tv=="table" then
- fastserialize(v)
- elseif tv=="boolean" then
- m=m+1 r[m]=f_ordered_boolean(v)
+if JITSUPPORTED then
+ local f_hashed_string=formatters["[%Q]=%Q,"]
+ local f_hashed_number=formatters["[%Q]=%s,"]
+ local f_hashed_boolean=formatters["[%Q]=%l,"]
+ local f_hashed_table=formatters["[%Q]="]
+ local f_indexed_string=formatters["[%s]=%Q,"]
+ local f_indexed_number=formatters["[%s]=%s,"]
+ local f_indexed_boolean=formatters["[%s]=%l,"]
+ local f_indexed_table=formatters["[%s]="]
+ local f_ordered_string=formatters["%Q,"]
+ local f_ordered_number=formatters["%s,"]
+ local f_ordered_boolean=formatters["%l,"]
+ function table.fastserialize(t,prefix)
+ local r={ type(prefix)=="string" and prefix or "return" }
+ local m=1
+ local function fastserialize(t,outer)
+ local n=#t
+ m=m+1
+ r[m]="{"
+ if n>0 then
+ local v=t[0]
+ if v then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(0,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(0,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(0)
+ fastserialize(v)
+ m=m+1 r[m]=f_indexed_table(0)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(0,v)
+ end
+ end
+ for i=1,n do
+ local v=t[i]
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_ordered_string(v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_ordered_number(v)
+ elseif tv=="table" then
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_ordered_boolean(v)
+ end
end
end
- end
- for k,v in next,t do
- local tk=type(k)
- if tk=="number" then
- if k>n or k<0 then
+ for k,v in next,t do
+ local tk=type(k)
+ if tk=="number" then
+ if k>n or k<0 then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(k,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(k,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(k)
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(k,v)
+ end
+ end
+ else
local tv=type(v)
if tv=="string" then
- m=m+1 r[m]=f_indexed_string(k,v)
+ m=m+1 r[m]=f_hashed_string(k,v)
elseif tv=="number" then
- m=m+1 r[m]=f_indexed_number(k,v)
+ m=m+1 r[m]=f_hashed_number(k,v)
elseif tv=="table" then
- m=m+1 r[m]=f_indexed_table(k)
+ m=m+1 r[m]=f_hashed_table(k)
fastserialize(v)
elseif tv=="boolean" then
- m=m+1 r[m]=f_indexed_boolean(k,v)
+ m=m+1 r[m]=f_hashed_boolean(k,v)
end
end
+ end
+ m=m+1
+ if outer then
+ r[m]="}"
else
- local tv=type(v)
- if tv=="string" then
- m=m+1 r[m]=f_hashed_string(k,v)
- elseif tv=="number" then
- m=m+1 r[m]=f_hashed_number(k,v)
- elseif tv=="table" then
- m=m+1 r[m]=f_hashed_table(k)
- fastserialize(v)
- elseif tv=="boolean" then
- m=m+1 r[m]=f_hashed_boolean(k,v)
- end
+ r[m]="},"
end
+ return r
end
- m=m+1
- if outer then
- r[m]="}"
- else
- r[m]="},"
+ return concat(fastserialize(t,true))
+ end
+else
+ local f_v=formatters["[%q]=%q,"]
+ local f_t=formatters["[%q]="]
+ local f_q=formatters["%q,"]
+ function table.fastserialize(t,prefix)
+ local r={ type(prefix)=="string" and prefix or "return" }
+ local m=1
+ local function fastserialize(t,outer)
+ local n=#t
+ m=m+1
+ r[m]="{"
+ if n>0 then
+ local v=t[0]
+ if v then
+ m=m+1
+ r[m]="[0]='"
+ if type(v)=="table" then
+ fastserialize(v)
+ else
+ r[m]=format("%q,",v)
+ end
+ end
+ for i=1,n do
+ local v=t[i]
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%i]=",i)
+ fastserialize(v)
+ else
+ r[m]=format("[%i]=%q,",i,v)
+ end
+ end
+ end
+ for k,v in next,t do
+ local tk=type(k)
+ if tk=="number" then
+ if k>n or k<0 then
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%i]=",k)
+ fastserialize(v)
+ else
+ r[m]=format("[%i]=%q,",k,v)
+ end
+ end
+ else
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%q]=",k)
+ fastserialize(v)
+ else
+ r[m]=format("[%q]=%q,",k,v)
+ end
+ end
+ end
+ m=m+1
+ if outer then
+ r[m]="}"
+ else
+ r[m]="},"
+ end
+ return r
end
- return r
+ return concat(fastserialize(t,true))
end
- return concat(fastserialize(t,true))
end
function table.deserialize(str)
if not str or str=="" then
@@ -7709,28 +7932,28 @@ function table.twowaymapper(t)
return t
end
local f_start_key_idx=formatters["%w{"]
-local f_start_key_num=formatters["%w[%s]={"]
+local f_start_key_num=JITSUPPORTED and formatters["%w[%s]={"] or formatters["%w[%q]={"]
local f_start_key_str=formatters["%w[%q]={"]
local f_start_key_boo=formatters["%w[%l]={"]
local f_start_key_nop=formatters["%w{"]
local f_stop=formatters["%w},"]
-local f_key_num_value_num=formatters["%w[%s]=%s,"]
-local f_key_str_value_num=formatters["%w[%q]=%s,"]
-local f_key_boo_value_num=formatters["%w[%l]=%s,"]
-local f_key_num_value_str=formatters["%w[%s]=%q,"]
-local f_key_str_value_str=formatters["%w[%q]=%q,"]
-local f_key_boo_value_str=formatters["%w[%l]=%q,"]
-local f_key_num_value_boo=formatters["%w[%s]=%l,"]
-local f_key_str_value_boo=formatters["%w[%q]=%l,"]
+local f_key_num_value_num=JITSUPPORTED and formatters["%w[%s]=%s,"] or formatters["%w[%s]=%q,"]
+local f_key_str_value_num=JITSUPPORTED and formatters["%w[%Q]=%s,"] or formatters["%w[%Q]=%q,"]
+local f_key_boo_value_num=JITSUPPORTED and formatters["%w[%l]=%s,"] or formatters["%w[%l]=%q,"]
+local f_key_num_value_str=JITSUPPORTED and formatters["%w[%s]=%Q,"] or formatters["%w[%q]=%Q,"]
+local f_key_str_value_str=formatters["%w[%Q]=%Q,"]
+local f_key_boo_value_str=formatters["%w[%l]=%Q,"]
+local f_key_num_value_boo=JITSUPPORTED and formatters["%w[%s]=%l,"] or formatters["%w[%q]=%l,"]
+local f_key_str_value_boo=formatters["%w[%Q]=%l,"]
local f_key_boo_value_boo=formatters["%w[%l]=%l,"]
-local f_key_num_value_not=formatters["%w[%s]={},"]
-local f_key_str_value_not=formatters["%w[%q]={},"]
+local f_key_num_value_not=JITSUPPORTED and formatters["%w[%s]={},"] or formatters["%w[%q]={},"]
+local f_key_str_value_not=formatters["%w[%Q]={},"]
local f_key_boo_value_not=formatters["%w[%l]={},"]
-local f_key_num_value_seq=formatters["%w[%s]={ %, t },"]
-local f_key_str_value_seq=formatters["%w[%q]={ %, t },"]
+local f_key_num_value_seq=JITSUPPORTED and formatters["%w[%s]={ %, t },"] or formatters["%w[%q]={ %, t },"]
+local f_key_str_value_seq=formatters["%w[%Q]={ %, t },"]
local f_key_boo_value_seq=formatters["%w[%l]={ %, t },"]
-local f_val_num=formatters["%w%s,"]
-local f_val_str=formatters["%w%q,"]
+local f_val_num=JITSUPPORTED and formatters["%w%s,"] or formatters["%w%q,"]
+local f_val_str=formatters["%w%Q,"]
local f_val_boo=formatters["%w%l,"]
local f_val_not=formatters["%w{},"]
local f_val_seq=formatters["%w{ %, t },"]
@@ -7738,7 +7961,7 @@ local f_fin_seq=formatters[" %, t }"]
local f_table_return=formatters["return {"]
local f_table_name=formatters["%s={"]
local f_table_direct=formatters["{"]
-local f_table_entry=formatters["[%q]={"]
+local f_table_entry=formatters["[%Q]={"]
local f_table_finish=formatters["}"]
local spaces=utilities.strings.newrepeater(" ")
local original_serialize=table.serialize
@@ -8339,7 +8562,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sac"] = package.loaded["util-sac"] or true
--- original size: 11332, stripped down to: 8420
+-- original size: 12946, stripped down to: 9507
if not modules then modules={} end modules ['util-sac']={
version=1.001,
@@ -8374,6 +8597,7 @@ end
function streams.size(f)
return f and f[3] or 0
end
+streams.getsize=streams.size
function streams.setposition(f,i)
if f[4] then
if i<=0 then
@@ -8566,9 +8790,9 @@ function streams.readfixed2(f)
f[2]=j+1
local a,b=byte(f[1],i,j)
if a>=0x80 then
- tonumber((a-0x100).."."..b)
+ return tonumber((a-0x100).."."..b) or 0
else
- tonumber((a ).."."..b)
+ return tonumber((a ).."."..b) or 0
end
end
function streams.readfixed4(f)
@@ -8577,9 +8801,9 @@ function streams.readfixed4(f)
f[2]=j+1
local a,b,c,d=byte(f[1],i,j)
if a>=0x80 then
- tonumber((0x100*a+b-0x10000).."."..(0x100*c+d))
+ return tonumber((0x100*a+b-0x10000).."."..(0x100*c+d)) or 0
else
- tonumber((0x100*a+b ).."."..(0x100*c+d))
+ return tonumber((0x100*a+b ).."."..(0x100*c+d)) or 0
end
end
if bit32 then
@@ -8659,6 +8883,16 @@ if sio and sio.readcardinal2 then
f[2]=i+4
return readinteger4(f[1],i)
end
+ function streams.readfixed2(f)
+ local i=f[2]
+ f[2]=i+2
+ return readfixed2(f[1],i)
+ end
+ function streams.readfixed4(f)
+ local i=f[2]
+ f[2]=i+4
+ return readfixed4(f[1],i)
+ end
function streams.read2dot4(f)
local i=f[2]
f[2]=i+2
@@ -8758,6 +8992,50 @@ else
return t
end
end
+do
+ local files=utilities.files
+ if files then
+ local openfile=files.open
+ local openstream=streams.open
+ local openstring=streams.openstring
+ local setmetatable=setmetatable
+ function io.newreader(str,method)
+ local f,m
+ if method=="string" then
+ f=openstring(str)
+ m=streams
+ elseif method=="stream" then
+ f=openstream(str)
+ m=streams
+ else
+ f=openfile(str,"rb")
+ m=files
+ end
+ if f then
+ local t={}
+ setmetatable(t,{
+ __index=function(t,k)
+ local r=m[k]
+ if k=="close" then
+ if f then
+ m.close(f)
+ f=nil
+ end
+ return function() end
+ elseif r then
+ local v=function(_,a,b) return r(f,a,b) end
+ t[k]=v
+ return v
+ else
+ print("unknown key",k)
+ end
+ end
+ } )
+ return t
+ end
+ end
+ end
+end
end -- of closure
@@ -9801,7 +10079,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-copas"] = package.loaded["util-soc-imp-copas"] or true
--- original size: 25844, stripped down to: 14821
+-- original size: 25959, stripped down to: 14893
local socket=socket or require("socket")
@@ -9838,6 +10116,7 @@ local copas={
autoclose=true,
running=false,
report=report,
+ trace=false,
}
local function statushandler(status,...)
if status then
@@ -9847,7 +10126,9 @@ local function statushandler(status,...)
if type(err)=="table" then
err=err[1]
end
- report("error: %s",tostring(err))
+ if copas.trace then
+ report("error: %s",tostring(err))
+ end
return nil,err
end
function socket.protect(func)
@@ -9861,7 +10142,9 @@ function socket.newtry(finalizer)
if not status then
local detail=select(2,...)
pcall(finalizer,detail)
- report("error: %s",tostring(detail))
+ if copas.trace then
+ report("error: %s",tostring(detail))
+ end
return
end
return...
@@ -12429,7 +12712,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-set"] = package.loaded["trac-set"] or true
--- original size: 13340, stripped down to: 8826
+-- original size: 13394, stripped down to: 8882
if not modules then modules={} end modules ['trac-set']={
version=1.001,
@@ -12439,8 +12722,9 @@ if not modules then modules={} end modules ['trac-set']={
license="see context related readme files"
}
local type,next,tostring,tonumber=type,next,tostring,tonumber
+local print=print
local concat,sortedhash=table.concat,table.sortedhash
-local format,find,lower,gsub,topattern=string.format,string.find,string.lower,string.gsub,string.topattern
+local formatters,find,lower,gsub,topattern=string.formatters,string.find,string.lower,string.gsub,string.topattern
local is_boolean=string.is_boolean
local settings_to_hash=utilities.parsers.settings_to_hash
local allocate=utilities.storage.allocate
@@ -12450,10 +12734,10 @@ local setters=utilities.setters or {}
utilities.setters=setters
local data={}
local trace_initialize=false
+local frozen=true
function setters.initialize(filename,name,values)
local setter=data[name]
if setter then
- frozen=true
local data=setter.data
if data then
for key,newvalue in sortedhash(values) do
@@ -12647,8 +12931,8 @@ function setters.show(t)
end
end
local enable,disable,register,list,show=setters.enable,setters.disable,setters.register,setters.list,setters.show
-function setters.report(setter,...)
- print(format("%-15s : %s\n",setter.name,format(...)))
+function setters.report(setter,fmt,...)
+ print(formatters["%-15s : %s\n"](setter.name,formatters[fmt](...)))
end
local function default(setter,name)
local d=setter.data[name]
@@ -12668,7 +12952,7 @@ function setters.new(name)
disable=function(...) disable (setter,...) end,
reset=function(...) reset (setter,...) end,
register=function(...) register(setter,...) end,
- list=function(...) list (setter,...) end,
+ list=function(...) return list (setter,...) end,
show=function(...) show (setter,...) end,
default=function(...) return default (setter,...) end,
value=function(...) return value (setter,...) end,
@@ -12771,7 +13055,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 32618, stripped down to: 20935
+-- original size: 33003, stripped down to: 21667
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -12816,14 +13100,30 @@ local function ignore() end
setmetatableindex(logs,function(t,k) t[k]=ignore;return ignore end)
local report,subreport,status,settarget,setformats,settranslations
local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
+local function ansisupported(specification)
+ if specification~="ansi" and specification~="ansilog" then
+ return false
+ elseif os and os.enableansi then
+ return os.enableansi()
+ else
+ return false
+ end
+end
if runningtex and texio then
if texio.setescape then
texio.setescape(0)
end
- if arg then
+ if arg and ansisupported then
for k,v in next,arg do
if v=="--ansi" or v=="--c:ansi" then
- variant="ansi"
+ if ansisupported("ansi") then
+ variant="ansi"
+ end
+ break
+ elseif v=="--ansilog" or v=="--c:ansilog" then
+ if ansisupported("ansilog") then
+ variant="ansilog"
+ end
break
end
end
@@ -12928,6 +13228,10 @@ if runningtex and texio then
},
}
}
+ variants.ansilog={
+ formats=variants.ansi.formats,
+ targets=variants.default.targets,
+ }
logs.flush=io.flush
writer=function(...)
write_nl(target,...)
@@ -13034,6 +13338,9 @@ if runningtex and texio then
t=specification.targets
f=specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification="default"
+ end
local v=variants[specification]
if v then
t=v.targets
@@ -13060,7 +13367,7 @@ if runningtex and texio then
subdirect_nop=f.subdirect_nop
status_yes=f.status_yes
status_nop=f.status_nop
- if variant=="ansi" then
+ if variant=="ansi" or variant=="ansilog" then
useluawrites()
end
settarget(whereto)
@@ -13153,6 +13460,9 @@ else
if type(specification)=="table" then
f=specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification="default"
+ end
local v=variants[specification]
if v then
f=v.formats
@@ -13408,12 +13718,6 @@ end
local nesting=0
local verbose=false
local hasscheme=url.hasscheme
-function logs.show_open(name)
-end
-function logs.show_close(name)
-end
-function logs.show_load(name)
-end
local simple=logs.reporter("comment")
logs.simple=simple
logs.simpleline=simple
@@ -13480,6 +13784,13 @@ local exporters={
logs.reporters=reporters
logs.exporters=exporters
function logs.application(t)
+ local arguments=environment and environment.arguments
+ if arguments then
+ local ansi=arguments.ansi or arguments.ansilog
+ if ansi then
+ logs.setformatters(arguments.ansi and "ansi" or "ansilog")
+ end
+ end
t.name=t.name or "unknown"
t.banner=t.banner
t.moreinfo=moreinfo
@@ -13553,8 +13864,6 @@ else
print(format(...))
end
end
-io.stdout:setvbuf('no')
-io.stderr:setvbuf('no')
if package.helpers.report then
package.helpers.report=logs.reporter("package loader")
end
@@ -13652,7 +13961,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-inf"] = package.loaded["trac-inf"] or true
--- original size: 8966, stripped down to: 5972
+-- original size: 9973, stripped down to: 7492
if not modules then modules={} end modules ['trac-inf']={
version=1.001,
@@ -13674,7 +13983,7 @@ statistics.enable=true
statistics.threshold=0.01
local statusinfo,n,registered,timers={},0,{},{}
setmetatableindex(timers,function(t,k)
- local v={ timing=0,loadtime=0 }
+ local v={ timing=0,loadtime=0,offset=0 }
t[k]=v
return v
end)
@@ -13682,10 +13991,40 @@ local function hastiming(instance)
return instance and timers[instance]
end
local function resettiming(instance)
- timers[instance or "notimer"]={ timing=0,loadtime=0 }
+ timers[instance or "notimer"]={ timing=0,loadtime=0,offset=0 }
end
local ticks=clock
local seconds=function(n) return n or 0 end
+if lua.getpreciseticks then
+ ticks=lua.getpreciseticks
+ seconds=lua.getpreciseseconds
+elseif FFISUPPORTED and ffi and os.type=="windows" then
+ local okay,kernel=pcall(ffi.load,"kernel32")
+ if kernel then
+ local tonumber=ffi.number or tonumber
+ ffi.cdef[[
+ int QueryPerformanceFrequency(int64_t *lpFrequency);
+ int QueryPerformanceCounter(int64_t *lpPerformanceCount);
+ ]]
+ local target=ffi.new("__int64[1]")
+ ticks=function()
+ if kernel.QueryPerformanceCounter(target)==1 then
+ return tonumber(target[0])
+ else
+ return 0
+ end
+ end
+ local target=ffi.new("__int64[1]")
+ seconds=function(ticks)
+ if kernel.QueryPerformanceFrequency(target)==1 then
+ return ticks/tonumber(target[0])
+ else
+ return 0
+ end
+ end
+ end
+else
+end
local function starttiming(instance,reset)
local timer=timers[instance or "notimer"]
local it=timer.timing
@@ -13720,12 +14059,26 @@ local function stoptiming(instance)
end
return 0
end
+local function benchmarktimer(instance)
+ local timer=timers[instance or "notimer"]
+ local it=timer.timing
+ if it>1 then
+ timer.timing=it-1
+ else
+ local starttime=timer.starttime
+ if starttime and starttime>0 then
+ timer.offset=ticks()-starttime
+ else
+ timer.offset=0
+ end
+ end
+end
local function elapsed(instance)
if type(instance)=="number" then
return instance
else
local timer=timers[instance or "notimer"]
- return timer and seconds(timer.loadtime) or 0
+ return timer and seconds(timer.loadtime-2*(timer.offset or 0)) or 0
end
end
local function currenttime(instance)
@@ -13738,7 +14091,7 @@ local function currenttime(instance)
else
local starttime=timer.starttime
if starttime and starttime>0 then
- return seconds(timer.loadtime+ticks()-starttime)
+ return seconds(timer.loadtime+ticks()-starttime-2*(timer.offset or 0))
end
end
return 0
@@ -13764,6 +14117,7 @@ statistics.elapsed=elapsed
statistics.elapsedtime=elapsedtime
statistics.elapsedindeed=elapsedindeed
statistics.elapsedseconds=elapsedseconds
+statistics.benchmarktimer=benchmarktimer
function statistics.register(tag,fnc)
if statistics.enable and type(fnc)=="function" then
local rt=registered[tag] or (#statusinfo+1)
@@ -13780,10 +14134,17 @@ function statistics.show()
return format("%s, type: %s, binary subtree: %s",
os.platform or "unknown",os.type or "unknown",environment.texos or "unknown")
end)
- register("used engine",function()
- return format("%s version %s with functionality level %s, banner: %s",
- LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner))
- end)
+ if LUATEXENGINE=="luametatex" then
+ register("used engine",function()
+ return format("%s version %s, functionality level %s, format id %s",
+ LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,LUATEXFORMATID)
+ end)
+ else
+ register("used engine",function()
+ return format("%s version %s with functionality level %s, banner: %s",
+ LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner))
+ end)
+ end
register("control sequences",function()
return format("%s of %s + %s",status.cs_count,status.hash_size,status.hash_extra)
end)
@@ -13822,7 +14183,11 @@ function statistics.show()
end
function statistics.memused()
local round=math.round or math.floor
- return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000),round(status.luastate_bytes/1000000))
+ return format("%s MB, ctx: %s MB, max: %s MB)",
+ round(collectgarbage("count")/1000),
+ round(status.luastate_bytes/1000000),
+ status.luastate_bytes_max and round(status.luastate_bytes_max/1000000) or "unknown"
+ )
end
starttiming(statistics)
function statistics.formatruntime(runtime)
@@ -14013,7 +14378,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-lua"] = package.loaded["util-lua"] or true
--- original size: 6664, stripped down to: 4589
+-- original size: 7149, stripped down to: 4997
if not modules then modules={} end modules ['util-lua']={
version=1.001,
@@ -14038,16 +14403,21 @@ luautilities.nofstrippedchunks=0
luautilities.nofstrippedbytes=0
local strippedchunks={}
luautilities.strippedchunks=strippedchunks
+if not LUATEXENGINE then
+ LUATEXENGINE=status.luatex_engine and string.lower(status.luatex_engine)
+ JITSUPPORTED=LUATEXENGINE=="luajittex" or jit
+ CONTEXTLMTXMODE=CONTEXTLMTXMODE or (LUATEXENGINE=="luametatex" and 1) or 0
+end
luautilities.suffixes={
tma="tma",
- tmc=jit and "tmb" or "tmc",
+ tmc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tmd") or (jit and "tmb") or "tmc",
lua="lua",
- luc=jit and "lub" or "luc",
+ luc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "lud") or (jit and "lub") or "luc",
lui="lui",
luv="luv",
luj="luj",
tua="tua",
- tuc="tuc",
+ tuc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tud") or (jit and "tub") or "tuc",
}
local function register(name)
if tracestripping then
@@ -14186,7 +14556,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-deb"] = package.loaded["util-deb"] or true
--- original size: 9955, stripped down to: 6693
+-- original size: 10136, stripped down to: 6832
if not modules then modules={} end modules ['util-deb']={
version=1.001,
@@ -14210,7 +14580,13 @@ local dummycalls=10*1000
local nesting=0
local names={}
local initialize=false
-if not (FFISUPPORTED and ffi) then
+if lua.getpreciseticks then
+ initialize=function()
+ ticks=lua.getpreciseticks
+ seconds=lua.getpreciseseconds
+ initialize=false
+ end
+elseif not (FFISUPPORTED and ffi) then
elseif os.type=="windows" then
initialize=function()
local kernel=ffilib("kernel32","system")
@@ -14482,7 +14858,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tpl"] = package.loaded["util-tpl"] or true
--- original size: 7112, stripped down to: 3887
+-- original size: 7722, stripped down to: 4212
if not modules then modules={} end modules ['util-tpl']={
version=1.001,
@@ -14498,6 +14874,7 @@ local report_template=logs.reporter("template")
local tostring,next=tostring,next
local format,sub,byte=string.format,string.sub,string.byte
local P,C,R,Cs,Cc,Carg,lpegmatch,lpegpatterns=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.match,lpeg.patterns
+local formatters=string.formatters
local replacer
local function replacekey(k,t,how,recursive)
local v=t[k]
@@ -14566,6 +14943,10 @@ local function replaceoptional(l,m,r,t,how,recurse)
local v=t[l]
return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
+local function replaceformatted(l,m,r,t,how,recurse)
+ local v=t[r]
+ return v and formatters[l](v)
+end
local single=P("%")
local double=P("%%")
local lquoted=P("%[")
@@ -14579,16 +14960,19 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
+local nolformatted=P(":")/"%%"
+local norformatted=P(":")/""
local noloptional=P("%?")/''
local noroptional=P("?%")/''
local nomoptional=P(":")/''
local args=Carg(1)*Carg(2)*Carg(3)
-local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local key=nosingle*((C((1-nosingle)^1)*args)/replacekey)*nosingle
+local quoted=nolquotedq*((C((1-norquotedq)^1)*args)/replacekeyquoted)*norquotedq
+local unquoted=nolquoted*((C((1-norquoted)^1)*args)/replacekeyunquoted)*norquoted
local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
+local formatted=nosingle*((Cs(nolformatted*(1-norformatted )^1)*norformatted*C((1-nosingle)^1)*args)/replaceformatted)*nosingle
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
+ replacer=Cs((unquoted+quoted+formatted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
@@ -14627,7 +15011,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sbx"] = package.loaded["util-sbx"] or true
--- original size: 20393, stripped down to: 13121
+-- original size: 21084, stripped down to: 13214
if not modules then modules={} end modules ['util-sbx']={
version=1.001,
@@ -14873,37 +15257,50 @@ local iopopen=sandbox.original(io.popen)
local reported={}
local function validcommand(name,program,template,checkers,defaults,variables,reporter,strict)
if validbinaries~=false and (validbinaries==true or validbinaries[program]) then
+ local binpath=nil
if variables then
for variable,value in next,variables do
- local checker=validators[checkers[variable]]
- if checker then
- value=checker(unquoted(value),strict)
- if value then
- variables[variable]=optionalquoted(value)
+ local chktype=checkers[variable]
+ if chktype=="verbose" then
+ else
+ local checker=validators[chktype]
+ if checker then
+ value=checker(unquoted(value),strict)
+ if value then
+ variables[variable]=optionalquoted(value)
+ else
+ report("variable %a with value %a fails the check",variable,value)
+ return
+ end
else
- report("variable %a with value %a fails the check",variable,value)
+ report("variable %a has no checker",variable)
return
end
- else
- report("variable %a has no checker",variable)
- return
end
end
for variable,default in next,defaults do
local value=variables[variable]
if not value or value=="" then
- local checker=validators[checkers[variable]]
- if checker then
- default=checker(unquoted(default),strict)
- if default then
- variables[variable]=optionalquoted(default)
- else
- report("variable %a with default %a fails the check",variable,default)
- return
+ local chktype=checkers[variable]
+ if chktype=="verbose" then
+ else
+ local checker=validators[chktype]
+ if checker then
+ default=checker(unquoted(default),strict)
+ if default then
+ variables[variable]=optionalquoted(default)
+ else
+ report("variable %a with default %a fails the check",variable,default)
+ return
+ end
end
end
end
end
+ binpath=variables.binarypath
+ end
+ if type(binpath)=="string" and binpath~="" then
+ program=binpath.."/"..program
end
local command=program.." "..replace(template,variables)
if reporter then
@@ -14938,7 +15335,8 @@ local runners={
if trace then
report("execute: %s",command)
end
- return osexecute(command)
+ local okay=osexecute(command)
+ return okay
end
end,
pipeto=function(...)
@@ -14972,7 +15370,7 @@ function sandbox.registerrunner(specification)
return
end
if validrunners[name] then
- report("invalid name, runner %a already defined")
+ report("invalid name, runner %a already defined",name)
return
end
local program=specification.program
@@ -15090,8 +15488,8 @@ if io then
end
if os then
overload(os.execute,binaryrunner,"os.execute")
- overload(os.spawn,dummyrunner,"os.spawn")
- overload(os.exec,dummyrunner,"os.exec")
+ overload(os.spawn,dummyrunner,"os.spawn")
+ overload(os.exec,dummyrunner,"os.exec")
overload(os.resultof,binaryrunner,"os.resultof")
overload(os.pipeto,binaryrunner,"os.pipeto")
overload(os.rename,filehandlertwo,"os.rename")
@@ -15116,13 +15514,6 @@ end
if zip then
zip.open=register(zip.open,filehandlerone,"zip.open")
end
-if fontloader then
- fontloader.open=register(fontloader.open,filehandlerone,"fontloader.open")
- fontloader.info=register(fontloader.info,filehandlerone,"fontloader.info")
-end
-if epdf then
- epdf.open=register(epdf.open,filehandlerone,"epdf.open")
-end
sandbox.registerroot=registerroot
sandbox.registerbinary=registerbinary
sandbox.registerlibrary=registerlibrary
@@ -15528,7 +15919,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-env"] = package.loaded["luat-env"] or true
--- original size: 6134, stripped down to: 4118
+-- original size: 6551, stripped down to: 4315
if not modules then modules={} end modules ['luat-env']={
version=1.001,
@@ -15537,7 +15928,7 @@ package.loaded["luat-env"] = package.loaded["luat-env"] or true
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local rawset,rawget,loadfile=rawset,rawget,loadfile
+local rawset,loadfile=rawset,loadfile
local gsub=string.gsub
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_lua=logs.reporter("resolvers","lua")
@@ -15584,6 +15975,12 @@ function environment.texfile(filename)
return resolvers.findfile(filename,'tex')
end
function environment.luafile(filename)
+ if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and file.suffix(filename)=="lua" then
+ local resolved=resolvers.findfile(file.replacesuffix(filename,"lmt")) or ""
+ if resolved~="" then
+ return resolved
+ end
+ end
local resolved=resolvers.findfile(filename,'tex') or ""
if resolved~="" then
return resolved
@@ -15695,7 +16092,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-zip"] = package.loaded["util-zip"] or true
--- original size: 18645, stripped down to: 11291
+-- original size: 19496, stripped down to: 10858
if not modules then modules={} end modules ['util-zip']={
version=1.001,
@@ -15706,7 +16103,7 @@ if not modules then modules={} end modules ['util-zip']={
local type,tostring,tonumber=type,tostring,tonumber
local sort=table.sort
local find,format,sub,gsub=string.find,string.format,string.sub,string.gsub
-local osdate,ostime=os.date,os.time
+local osdate,ostime,osclock=os.date,os.time,os.clock
local ioopen=io.open
local loaddata,savedata=io.loaddata,io.savedata
local filejoin,isdir,dirname,mkdirs=file.join,lfs.isdir,file.dirname,dir.mkdirs
@@ -15721,25 +16118,19 @@ local getposition=files.getposition
local band=bit32.band
local rshift=bit32.rshift
local lshift=bit32.lshift
-local decompress,calculatecrc
-if flate then
- decompress=flate.flate_decompress
- calculatecrc=flate.update_crc32
-else
+local decompress,expandsize,calculatecrc
local zlibdecompress=zlib.decompress
+ local zlibexpandsize=zlib.expandsize
local zlibchecksum=zlib.crc32
- decompress=function(source,targetsize)
- local target=zlibdecompress(source,-15)
- if target then
- return target
- else
- return false,1
- end
+ decompress=function(source)
+ return zlibdecompress(source,-15)
end
+ expandsize=zlibexpandsize and function(source,targetsize)
+ return zlibexpandsize(source,targetsize,-15)
+ end or decompress
calculatecrc=function(buffer,initial)
return zlibchecksum(initial or 0,buffer)
end
-end
local zipfiles={}
utilities.zipfiles=zipfiles
local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
@@ -15864,7 +16255,11 @@ local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
setposition(handle,position)
local result=readstring(handle,compressed)
if data.method==8 then
- result=decompress(result,data.uncompressed)
+ if expandsize then
+ result=expandsize(result,data.uncompressed)
+ else
+ result=decompress(result)
+ end
end
if check and data.crc32~=calculatecrc(result) then
print("checksum mismatch")
@@ -15883,14 +16278,14 @@ local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
zipfiles.list=getziplist
zipfiles.found=foundzipfile
end
-if flate then do
+if xzip then
local writecardinal1=files.writebyte
local writecardinal2=files.writecardinal2le
local writecardinal4=files.writecardinal4le
local logwriter=logs.writer
local globpattern=dir.globpattern
- local compress=flate.flate_compress
- local checksum=flate.update_crc32
+ local compress=xzip.compress
+ local checksum=xzip.crc32
local function fromdostime(dostime,dosdate)
return ostime {
year=rshift(dosdate,9)+1980,
@@ -16087,27 +16482,33 @@ if flate then do
local count=#list
local step=number.idiv(count,10)
local done=0
+ local steps=verbose=="steps"
+ local time=steps and osclock()
for i=1,count do
local l=list[i]
local n=l.filename
local d=unzipfile(z,n)
- local p=filejoin(path,n)
- if mkdirs(dirname(p)) then
- if verbose=="steps" then
- total=total+#d
- done=done+1
- if done>=step then
- done=0
- logwriter(format("%4i files of %4i done, %10i bytes",i,count,total))
+ if d then
+ local p=filejoin(path,n)
+ if mkdirs(dirname(p)) then
+ if steps then
+ total=total+#d
+ done=done+1
+ if done>=step then
+ done=0
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",i,count,total,osclock()-time))
+ end
+ elseif verbose then
+ logwriter(n)
end
- elseif verbose then
- logwriter(n)
+ savedata(p,d)
end
- savedata(p,d)
+ else
+ logwriter(format("problem with file %s",n))
end
end
- if verbose=="steps" then
- logwriter(format("%4i files of %4i done, %10i bytes",count,count,total))
+ if steps then
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",count,count,total,osclock()-time))
end
closezipfile(z)
return true
@@ -16118,37 +16519,8 @@ if flate then do
end
zipfiles.zipdir=zipdir
zipfiles.unzipdir=unzipdir
-end end
-if flate then
- local streams=utilities.streams
- local openfile=streams.open
- local closestream=streams.close
- local setposition=streams.setposition
- local getsize=streams.size
- local readcardinal4=streams.readcardinal4le
- local getstring=streams.getstring
- local decompress=flate.gz_decompress
- function zipfiles.gunzipfile(filename)
- local strm=openfile(filename)
- if strm then
- setposition(strm,getsize(strm)-4+1)
- local size=readcardinal4(strm)
- local data=decompress(getstring(strm),size)
- closestream(strm)
- return data
- end
- end
-elseif gzip then
- local openfile=gzip.open
- function zipfiles.gunzipfile(filename)
- local g=openfile(filename,"rb")
- if g then
- local d=g:read("*a")
- d:close()
- return d
- end
- end
end
+zipfiles.gunzipfile=gzip.load
end -- of closure
@@ -16157,7 +16529,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
--- original size: 60383, stripped down to: 35698
+-- original size: 61191, stripped down to: 35864
if not modules then modules={} end modules ['lxml-tab']={
version=1.001,
@@ -16881,7 +17253,10 @@ local slash=P('/')
local colon=P(':')
local semicolon=P(';')
local ampersand=P('&')
-local valid=R('az','AZ','09')+S('_-.')
+local valid_0=R("\128\255")
+local valid_1=R('az','AZ')+S('_')+valid_0
+local valid_2=valid_1+R('09')+S('-.')
+local valid=valid_1*valid_2^0
local name_yes=C(valid^1)*colon*C(valid^1)
local name_nop=C(P(true))*C(valid^1)
local name=name_yes+name_nop
@@ -16917,8 +17292,9 @@ end
local function entityfile(pattern,k,v,n)
if n then
local okay,data
- if resolvers then
- okay,data=resolvers.loadbinfile(n)
+ local loadbinfile=resolvers and resolvers.loadbinfile
+ if loadbinfile then
+ okay,data=loadbinfile(n)
else
data=io.loaddata(n)
okay=data and data~=""
@@ -17027,12 +17403,14 @@ publicentityfile+publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*op
}
return grammar_parsed_text_one,grammar_parsed_text_two,grammar_unparsed_text
end
-grammar_parsed_text_one_nop,
-grammar_parsed_text_two_nop,
-grammar_unparsed_text_nop=install(space,spacing,anything)
-grammar_parsed_text_one_yes,
-grammar_parsed_text_two_yes,
-grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl)
+local
+ grammar_parsed_text_one_nop,
+ grammar_parsed_text_two_nop,
+ grammar_unparsed_text_nop=install(space,spacing,anything)
+local
+ grammar_parsed_text_one_yes,
+ grammar_parsed_text_two_yes,
+ grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl)
local function _xmlconvert_(data,settings,detail)
settings=settings or {}
preparexmlstate(settings)
@@ -17613,7 +17991,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-lpt"] = package.loaded["lxml-lpt"] or true
--- original size: 55145, stripped down to: 30992
+-- original size: 54626, stripped down to: 31255
if not modules then modules={} end modules ['lxml-lpt']={
version=1.001,
@@ -18095,6 +18473,8 @@ local builtin={
lastindex="(#ll.__p__.dt or 1)",
lastelement="(ll.__p__.en or 1)",
last="#list",
+ list="list",
+ self="ll",
rootposition="order",
order="order",
element="(ll.ei or 1)",
@@ -18203,7 +18583,8 @@ local function register_selector(specification)
end
local function register_expression(expression)
local converted=lpegmatch(converter,expression)
- local runner=load(format(template_e,converted))
+ local wrapped=format(template_e,converted)
+ local runner=load(wrapped)
runner=(runner and runner()) or function() errorrunner_e(expression,converted) end
return { kind="expression",expression=expression,converted=converted,evaluator=runner }
end
@@ -18575,6 +18956,20 @@ expressions.count=function(e,pattern)
local collected=applylpath(e,pattern)
return pattern and (collected and #collected) or 0
end
+expressions.attribute=function(e,name,value)
+ if type(e)=="table" and name then
+ local a=e.at
+ if a then
+ local v=a[name]
+ if value then
+ return v==value
+ else
+ return v
+ end
+ end
+ end
+ return nil
+end
expressions.oneof=function(s,...)
for i=1,select("#",...) do
if s==select(i,...) then
@@ -18621,7 +19016,7 @@ function expressions.contains(str,pattern)
end
return false
end
-function xml.expressions.idstring(str)
+function expressions.idstring(str)
return type(str)=="string" and gsub(str,"^#","") or ""
end
local function traverse(root,pattern,handle)
@@ -20394,7 +20789,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 11099, stripped down to: 7152
+-- original size: 11019, stripped down to: 7086
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -20407,9 +20802,9 @@ local next,type,getmetatable,rawset=next,type,getmetatable,rawset
local gsub,find,gmatch,char=string.gsub,string.find,string.gmatch,string.char
local filedirname,filebasename,filejoin=file.dirname,file.basename,file.join
local ostype,osname,osuname,ossetenv,osgetenv=os.type,os.name,os.uname,os.setenv,os.getenv
+local sortedpairs=table.sortedpairs
local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
-local trace_detail=false trackers.register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers.register("resolvers.expansions",function(v) trace_expansions=v end)
local report_initialization=logs.reporter("resolvers","initialization")
resolvers=resolvers or {}
@@ -20618,7 +21013,7 @@ if ostype=="unix" then
rawset(t,k,v)
end
local colon=P(":")
- for k,v in table.sortedpairs(prefixes) do
+ for k,v in sortedpairs(prefixes) do
if p then
p=P(k)+p
else
@@ -20645,7 +21040,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 18154, stripped down to: 10416
+-- original size: 18179, stripped down to: 10432
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -20929,7 +21324,7 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
scancache[sub(full,1,-2)]=files
return files,remap,n,m,r
end
-function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+local function scanfiles(path,branch,usecache,onlyonce,tolerant)
local realpath=resolveprefix(path)
if usecache then
local content=fullcache[realpath]
@@ -20984,8 +21379,9 @@ function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
statistics.stoptiming(timer)
return content
end
+resolvers.scanfiles=scanfiles
function resolvers.simplescanfiles(path,branch,usecache)
- return resolvers.scanfiles(path,branch,usecache,true,true)
+ return scanfiles(path,branch,usecache,true,true)
end
function resolvers.scandata()
table.sort(scanned)
@@ -21052,7 +21448,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-env"] = package.loaded["data-env"] or true
--- original size: 9360, stripped down to: 6312
+-- original size: 9400, stripped down to: 6347
if not modules then modules={} end modules ['data-env']={
version=1.001,
@@ -21062,7 +21458,7 @@ if not modules then modules={} end modules ['data-env']={
license="see context related readme files",
}
local lower,gsub=string.lower,string.gsub
-local next=next
+local next,rawget=next,rawget
local resolvers=resolvers
local allocate=utilities.storage.allocate
local setmetatableindex=table.setmetatableindex
@@ -21143,13 +21539,13 @@ local relations=allocate {
mp={
names={ "mp" },
variable='MPINPUTS',
- suffixes={ 'mp','mpvi','mpiv','mpii' },
+ suffixes={ 'mp','mpvi','mpiv','mpxl','mpii' },
usertype=true,
},
tex={
names={ "tex" },
variable='TEXINPUTS',
- suffixes={ "tex","mkvi","mkiv","mkii","cld","lfg","xml" },
+ suffixes={ "tex","mkiv","mkvi","mkxl","mklx","mkii","cld","lfg","xml" },
usertype=true,
},
icc={
@@ -21337,7 +21733,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 16284, stripped down to: 10938
+-- original size: 16099, stripped down to: 11379
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -21346,48 +21742,83 @@ if not modules then modules={} end modules ['data-tmp']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local format,lower,gsub,concat=string.format,string.lower,string.gsub,table.concat
-local concat=table.concat
-local mkdirs,isdir,isfile=dir.mkdirs,lfs.isdir,lfs.isfile
-local addsuffix,is_writable,is_readable=file.addsuffix,file.is_writable,file.is_readable
-local formatters=string.formatters
local next,type=next,type
+local pcall,loadfile,collectgarbage=pcall,loadfile,collectgarbage
+local format,lower,gsub=string.format,string.lower,string.gsub
+local concat,serialize,fastserialize,serializetofile=table.concat,table.serialize,table.fastserialize,table.tofile
+local mkdirs,expanddirname,isdir,isfile=dir.mkdirs,dir.expandname,lfs.isdir,lfs.isfile
+local is_writable,is_readable=file.is_writable,file.is_readable
+local collapsepath,joinfile,addsuffix,dirname=file.collapsepath,file.join,file.addsuffix,file.dirname
+local savedata=file.savedata
+local formatters=string.formatters
+local osexit,osdate,osuuid=os.exit,os.date,os.uuid
+local removefile=os.remove
+local md5hex=md5.hex
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local report_caches=logs.reporter("resolvers","caches")
local report_resolvers=logs.reporter("resolvers","caching")
local resolvers=resolvers
local cleanpath=resolvers.cleanpath
-local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
-local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
-local compile=utilities.lua.compile
-function utilities.lua.compile(luafile,lucfile,cleanup,strip)
- if cleanup==nil then cleanup=directive_cleanup end
- if strip==nil then strip=directive_strip end
- return compile(luafile,lucfile,cleanup,strip)
+local resolvepath=resolvers.resolve
+local luautilities=utilities.lua
+do
+ local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
+ local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
+ local compilelua=luautilities.compile
+ function luautilities.compile(luafile,lucfile,cleanup,strip)
+ if cleanup==nil then cleanup=directive_cleanup end
+ if strip==nil then strip=directive_strip end
+ return compilelua(luafile,lucfile,cleanup,strip)
+ end
end
caches=caches or {}
local caches=caches
-local luasuffixes=utilities.lua.suffixes
-caches.base=caches.base or "luatex-cache"
-caches.more=caches.more or "context"
-caches.direct=false
-caches.tree=false
-caches.force=true
-caches.ask=false
-caches.relocate=false
+local writable=nil
+local readables={}
+local usedreadables={}
+local compilelua=luautilities.compile
+local luasuffixes=luautilities.suffixes
+caches.base=caches.base or "luatex-cache"
+caches.more=caches.more or "context"
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
-directives.register("system.caches.fast",function(v) caches.fast=true end)
-local writable,readables,usedreadables=nil,{},{}
+local direct_cache=false
+local fast_cache=false
+local cache_tree=false
+directives.register("system.caches.direct",function(v) direct_cache=true end)
+directives.register("system.caches.fast",function(v) fast_cache=true end)
+local function configfiles()
+ return concat(resolvers.configurationfiles(),";")
+end
+local function hashed(tree)
+ tree=gsub(tree,"[\\/]+$","")
+ tree=lower(tree)
+ local hash=md5hex(tree)
+ if trace_cache or trace_locating then
+ report_caches("hashing tree %a, hash %a",tree,hash)
+ end
+ return hash
+end
+local function treehash()
+ local tree=configfiles()
+ if not tree or tree=="" then
+ return false
+ else
+ return hashed(tree)
+ end
+end
+caches.hashed=hashed
+caches.treehash=treehash
+caches.configfiles=configfiles
local function identify()
local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
if texmfcaches then
for k=1,#texmfcaches do
local cachepath=texmfcaches[k]
if cachepath~="" then
- cachepath=resolvers.resolve(cachepath)
- cachepath=resolvers.cleanpath(cachepath)
- cachepath=file.collapsepath(cachepath)
+ cachepath=resolvepath(cachepath)
+ cachepath=cleanpath(cachepath)
+ cachepath=collapsepath(cachepath)
local valid=isdir(cachepath)
if valid then
if is_readable(cachepath) then
@@ -21396,16 +21827,14 @@ local function identify()
writable=cachepath
end
end
- elseif not writable and caches.force then
- local cacheparent=file.dirname(cachepath)
- if is_writable(cacheparent) and true then
- if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath),"no",{ "yes","no" })=="yes" then
- mkdirs(cachepath)
- if isdir(cachepath) and is_writable(cachepath) then
- report_caches("path %a created",cachepath)
- writable=cachepath
- readables[#readables+1]=cachepath
- end
+ elseif not writable then
+ local cacheparent=dirname(cachepath)
+ if is_writable(cacheparent) then
+ mkdirs(cachepath)
+ if isdir(cachepath) and is_writable(cachepath) then
+ report_caches("path %a created",cachepath)
+ writable=cachepath
+ readables[#readables+1]=cachepath
end
end
end
@@ -21418,8 +21847,8 @@ local function identify()
local cachepath=texmfcaches[k]
cachepath=resolvers.expansion(cachepath)
if cachepath~="" then
- cachepath=resolvers.resolve(cachepath)
- cachepath=resolvers.cleanpath(cachepath)
+ cachepath=resolvepath(cachepath)
+ cachepath=cleanpath(cachepath)
local valid=isdir(cachepath)
if valid and is_readable(cachepath) then
if not writable and is_writable(cachepath) then
@@ -21433,23 +21862,25 @@ local function identify()
end
if not writable then
report_caches("fatal error: there is no valid writable cache path defined")
- os.exit()
+ osexit()
elseif #readables==0 then
report_caches("fatal error: there is no valid readable cache path defined")
- os.exit()
+ osexit()
end
- writable=dir.expandname(resolvers.cleanpath(writable))
- local base,more,tree=caches.base,caches.more,caches.tree or caches.treehash()
+ writable=expanddirname(cleanpath(writable))
+ local base=caches.base
+ local more=caches.more
+ local tree=cache_tree or treehash()
if tree then
- caches.tree=tree
+ cache_tree=tree
writable=mkdirs(writable,base,more,tree)
for i=1,#readables do
- readables[i]=file.join(readables[i],base,more,tree)
+ readables[i]=joinfile(readables[i],base,more,tree)
end
else
writable=mkdirs(writable,base,more)
for i=1,#readables do
- readables[i]=file.join(readables[i],base,more)
+ readables[i]=joinfile(readables[i],base,more)
end
end
if trace_cache then
@@ -21486,27 +21917,8 @@ function caches.usedpaths(separator)
return writable or "?"
end
end
-function caches.configfiles()
- return concat(resolvers.configurationfiles(),";")
-end
-function caches.hashed(tree)
- tree=gsub(tree,"[\\/]+$","")
- tree=lower(tree)
- local hash=md5.hex(tree)
- if trace_cache or trace_locating then
- report_caches("hashing tree %a, hash %a",tree,hash)
- end
- return hash
-end
-function caches.treehash()
- local tree=caches.configfiles()
- if not tree or tree=="" then
- return false
- else
- return caches.hashed(tree)
- end
-end
-local r_cache,w_cache={},{}
+local r_cache={}
+local w_cache={}
local function getreadablepaths(...)
local tags={... }
local hash=concat(tags,"/")
@@ -21516,7 +21928,7 @@ local function getreadablepaths(...)
if #tags>0 then
done={}
for i=1,#readables do
- done[i]=file.join(readables[i],...)
+ done[i]=joinfile(readables[i],...)
end
else
done=readables
@@ -21540,17 +21952,25 @@ local function getwritablepath(...)
end
return done
end
-caches.getreadablepaths=getreadablepaths
-caches.getwritablepath=getwritablepath
-function caches.getfirstreadablefile(filename,...)
- local fullname,path=caches.setfirstwritablefile(filename,...)
+local function setfirstwritablefile(filename,...)
+ local wr=getwritablepath(...)
+ local fullname=joinfile(wr,filename)
+ return fullname,wr
+end
+local function setluanames(path,name)
+ return
+ format("%s/%s.%s",path,name,luasuffixes.tma),
+ format("%s/%s.%s",path,name,luasuffixes.tmc)
+end
+local function getfirstreadablefile(filename,...)
+ local fullname,path=setfirstwritablefile(filename,...)
if is_readable(fullname) then
return fullname,path
end
local rd=getreadablepaths(...)
for i=1,#rd do
local path=rd[i]
- local fullname=file.join(path,filename)
+ local fullname=joinfile(path,filename)
if is_readable(fullname) then
usedreadables[i]=true
return fullname,path
@@ -21558,19 +21978,11 @@ function caches.getfirstreadablefile(filename,...)
end
return fullname,path
end
-function caches.setfirstwritablefile(filename,...)
- local wr=getwritablepath(...)
- local fullname=file.join(wr,filename)
- return fullname,wr
-end
-function caches.define(category,subcategory)
- return function()
- return getwritablepath(category,subcategory)
- end
-end
-function caches.setluanames(path,name)
- return format("%s/%s.%s",path,name,luasuffixes.tma),format("%s/%s.%s",path,name,luasuffixes.tmc)
-end
+caches.getreadablepaths=getreadablepaths
+caches.getwritablepath=getwritablepath
+caches.setfirstwritablefile=setfirstwritablefile
+caches.getfirstreadablefile=getfirstreadablefile
+caches.setluanames=setluanames
function caches.loaddata(readables,name,writable)
if type(readables)=="string" then
readables={ readables }
@@ -21578,21 +21990,22 @@ function caches.loaddata(readables,name,writable)
for i=1,#readables do
local path=readables[i]
local loader=false
- local tmaname,tmcname=caches.setluanames(path,name)
+ local state=false
+ local tmaname,tmcname=setluanames(path,name)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
if not loader and isfile(tmaname) then
- local tmacrap,tmcname=caches.setluanames(writable,name)
+ local tmacrap,tmcname=setluanames(writable,name)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
if not loader then
- loader=loadfile(tmaname)
+ state,loader=pcall(loadfile,tmaname)
end
end
if loader then
@@ -21604,21 +22017,21 @@ function caches.loaddata(readables,name,writable)
return false
end
function caches.is_writable(filepath,filename)
- local tmaname,tmcname=caches.setluanames(filepath,filename)
+ local tmaname,tmcname=setluanames(filepath,filename)
return is_writable(tmaname)
end
-local saveoptions={ compact=true }
-function caches.savedata(filepath,filename,data,raw)
- local tmaname,tmcname=caches.setluanames(filepath,filename)
- data.cache_uuid=os.uuid()
- if caches.fast then
- file.savedata(tmaname,table.fastserialize(data,true))
- elseif caches.direct then
- file.savedata(tmaname,table.serialize(data,true,saveoptions))
+local saveoptions={ compact=true,accurate=not JITSUPPORTED }
+function caches.savedata(filepath,filename,data,fast)
+ local tmaname,tmcname=setluanames(filepath,filename)
+ data.cache_uuid=osuuid()
+ if fast or fast_cache then
+ savedata(tmaname,fastserialize(data,true))
+ elseif direct_cache then
+ savedata(tmaname,serialize(data,true,saveoptions))
else
- table.tofile(tmaname,data,true,saveoptions)
+ serializetofile(tmaname,data,true,saveoptions)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
end
local content_state={}
function caches.contentstate()
@@ -21626,11 +22039,14 @@ function caches.contentstate()
end
function caches.loadcontent(cachename,dataname,filename)
if not filename then
- local name=caches.hashed(cachename)
- local full,path=caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename=file.join(path,name)
+ local name=hashed(cachename)
+ local full,path=getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=joinfile(path,name)
+ end
+ local state,blob=pcall(loadfile,addsuffix(filename,luasuffixes.luc))
+ if not blob then
+ state,blob=pcall(loadfile,addsuffix(filename,luasuffixes.lua))
end
- local blob=loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data=blob()
if data and data.content then
@@ -21663,9 +22079,9 @@ function caches.collapsecontent(content)
end
function caches.savecontent(cachename,dataname,content,filename)
if not filename then
- local name=caches.hashed(cachename)
- local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename=file.join(path,name)
+ local name=hashed(cachename)
+ local full,path=setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=joinfile(path,name)
end
local luaname=addsuffix(filename,luasuffixes.lua)
local lucname=addsuffix(filename,luasuffixes.luc)
@@ -21676,17 +22092,17 @@ function caches.savecontent(cachename,dataname,content,filename)
type=dataname,
root=cachename,
version=resolvers.cacheversion,
- date=os.date("%Y-%m-%d"),
- time=os.date("%H:%M:%S"),
+ date=osdate("%Y-%m-%d"),
+ time=osdate("%H:%M:%S"),
content=content,
- uuid=os.uuid(),
+ uuid=osuuid(),
}
- local ok=io.savedata(luaname,table.serialize(data,true))
+ local ok=savedata(luaname,serialize(data,true))
if ok then
if trace_locating then
report_resolvers("category %a, cachename %a saved in %a",dataname,cachename,luaname)
end
- if utilities.lua.compile(luaname,lucname) then
+ if compilelua(luaname,lucname) then
if trace_locating then
report_resolvers("%a compiled to %a",dataname,lucname)
end
@@ -21695,7 +22111,7 @@ function caches.savecontent(cachename,dataname,content,filename)
if trace_locating then
report_resolvers("compiling failed for %a, deleting file %a",dataname,lucname)
end
- os.remove(lucname)
+ removefile(lucname)
end
elseif trace_locating then
report_resolvers("unable to save %a in %a (access error)",dataname,luaname)
@@ -21709,7 +22125,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-met"] = package.loaded["data-met"] or true
--- original size: 5310, stripped down to: 3784
+-- original size: 5518, stripped down to: 3854
if not modules then modules={} end modules ['data-met']={
version=1.100,
@@ -21718,31 +22134,45 @@ if not modules then modules={} end modules ['data-met']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,format=string.find,string.format
-local sequenced=table.sequenced
+local type=type
+local find=string.find
local addurlscheme,urlhashed=url.addscheme,url.hashed
+local collapsepath,joinfile=file.collapsepath,file.join
+local report_methods=logs.reporter("resolvers","methods")
local trace_locating=false
local trace_methods=false
trackers.register("resolvers.locating",function(v) trace_methods=v end)
trackers.register("resolvers.methods",function(v) trace_methods=v end)
-local report_methods=logs.reporter("resolvers","methods")
local allocate=utilities.storage.allocate
local resolvers=resolvers
local registered={}
local function splitmethod(filename)
if not filename then
- return { scheme="unknown",original=filename }
+ return {
+ scheme="unknown",
+ original=filename,
+ }
end
if type(filename)=="table" then
return filename
end
- filename=file.collapsepath(filename,".")
+ filename=collapsepath(filename,".")
if not find(filename,"://",1,true) then
- return { scheme="file",path=filename,original=filename,filename=filename }
+ return {
+ scheme="file",
+ path=filename,
+ original=filename,
+ filename=filename,
+ }
end
- local specification=url.hashed(filename)
+ local specification=urlhashed(filename)
if not specification.scheme or specification.scheme=="" then
- return { scheme="file",path=filename,original=filename,filename=filename }
+ return {
+ scheme="file",
+ path=filename,
+ original=filename,
+ filename=filename,
+ }
else
return specification
end
@@ -21751,7 +22181,8 @@ resolvers.splitmethod=splitmethod
local function methodhandler(what,first,...)
local method=registered[what]
if method then
- local how,namespace=method.how,method.namespace
+ local how=method.how
+ local namespace=method.namespace
if how=="uri" or how=="url" then
local specification=splitmethod(first)
local scheme=specification.scheme
@@ -21797,7 +22228,10 @@ local function methodhandler(what,first,...)
end
resolvers.methodhandler=methodhandler
function resolvers.registermethod(name,namespace,how)
- registered[name]={ how=how or "tag",namespace=namespace }
+ registered[name]={
+ how=how or "tag",
+ namespace=namespace
+ }
namespace["byscheme"]=function(scheme,filename,...)
if scheme=="file" then
return methodhandler(name,filename,...)
@@ -21806,7 +22240,7 @@ function resolvers.registermethod(name,namespace,how)
end
end
end
-local concatinators=allocate { notfound=file.join }
+local concatinators=allocate { notfound=joinfile }
local locators=allocate { notfound=function() end }
local hashers=allocate { notfound=function() end }
local generators=allocate { notfound=function() end }
@@ -21827,7 +22261,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 68195, stripped down to: 43680
+-- original size: 69576, stripped down to: 44470
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -21838,7 +22272,8 @@ if not modules then modules={} end modules ['data-res']={
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
local concat,insert,remove=table.concat,table.insert,table.remove
-local next,type,rawget=next,type,rawget
+local next,type,rawget,loadfile=next,type,rawget,loadfile
+local mergedtable=table.merged
local os=os
local P,S,R,C,Cc,Cs,Ct,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cc,lpeg.Cs,lpeg.Ct,lpeg.Carg
local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
@@ -21854,13 +22289,14 @@ local joinpath=file.joinpath
local is_qualified_path=file.is_qualified_path
local allocate=utilities.storage.allocate
local settings_to_array=utilities.parsers.settings_to_array
+local urlhasscheme=url.hasscheme
local getcurrentdir=lfs.currentdir
local isfile=lfs.isfile
local isdir=lfs.isdir
local setmetatableindex=table.setmetatableindex
local luasuffixes=utilities.lua.suffixes
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
-local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
+local trace_details=false trackers .register("resolvers.details",function(v) trace_details=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
@@ -21879,10 +22315,17 @@ local ostype,osname,osenv,ossetenv,osgetenv=os.type,os.name,os.env,os.setenv,os.
resolvers.cacheversion="1.100"
resolvers.configbanner=""
resolvers.homedir=environment.homedir
-resolvers.criticalvars=allocate { "SELFAUTOLOC","SELFAUTODIR","SELFAUTOPARENT","TEXMFCNF","TEXMF","TEXOS" }
resolvers.luacnfname="texmfcnf.lua"
resolvers.luacnffallback="contextcnf.lua"
resolvers.luacnfstate="unknown"
+local criticalvars={
+ "SELFAUTOLOC",
+ "SELFAUTODIR",
+ "SELFAUTOPARENT",
+ "TEXMFCNF",
+ "TEXMF",
+ "TEXOS",
+}
if environment.default_texmfcnf then
resolvers.luacnfspec="home:texmf/web2c;"..environment.default_texmfcnf
else
@@ -21902,13 +22345,20 @@ local dangerous=resolvers.dangerous
local suffixmap=resolvers.suffixmap
resolvers.defaultsuffixes={ "tex" }
local instance=nil
-function resolvers.setenv(key,value,raw)
+local variable
+local expansion
+local setenv
+local getenv
+local formatofsuffix=resolvers.formatofsuffix
+local splitpath=resolvers.splitpath
+local splitmethod=resolvers.splitmethod
+setenv=function(key,value,raw)
if instance then
instance.environment[key]=value
ossetenv(key,raw and value or resolveprefix(value))
end
end
-local function getenv(key)
+getenv=function(key)
local value=rawget(instance.environment,key)
if value and value~="" then
return value
@@ -21918,94 +22368,97 @@ local function getenv(key)
end
end
resolvers.getenv=getenv
-resolvers.env=getenv
-local function resolvevariable(k)
- return instance.expansions[k]
-end
+resolvers.setenv=setenv
local dollarstripper=lpeg.stripper("$")
local inhibitstripper=P("!")^0*Cs(P(1)^0)
-local somevariable=P("$")/""
-local somekey=C(R("az","AZ","09","__","--")^1)
-local somethingelse=P(";")*((1-S("!{}/\\"))^1*P(";")/"")+P(";")*(P(";")/"")+P(1)
-local variableexpander=Cs((somevariable*(somekey/resolvevariable)+somethingelse)^1 )
-local cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
-local variablecleaner=Cs((cleaner+P(1))^0)
-local somevariable=R("az","AZ","09","__","--")^1/resolvevariable
-local variable=(P("$")/"")*(somevariable+(P("{")/"")*somevariable*(P("}")/""))
-local variableresolver=Cs((variable+P(1))^0)
-local function expandedvariable(var)
- return lpegmatch(variableexpander,var) or var
-end
-function resolvers.reset()
- if trace_locating then
- report_resolving("creating instance")
- end
- local environment={}
- local variables={}
- local expansions={}
- local order={}
- instance={
- environment=environment,
- variables=variables,
- expansions=expansions,
- order=order,
- files={},
- setups={},
- found={},
- foundintrees={},
- hashes={},
- hashed={},
- pathlists=false,
- specification={},
- lists={},
- data={},
- fakepaths={},
- remember=true,
- diskcache=true,
- renewcache=false,
- renewtree=false,
- loaderror=false,
- savelists=true,
- pattern=nil,
- force_suffixes=true,
- pathstack={},
- }
- setmetatableindex(variables,function(t,k)
- local v
- for i=1,#order do
- v=order[i][k]
+local expandedvariable,resolvedvariable do
+ local function resolveinstancevariable(k)
+ return instance.expansions[k]
+ end
+ local p_variable=P("$")/""
+ local p_key=C(R("az","AZ","09","__","--")^1)
+ local p_whatever=P(";")*((1-S("!{}/\\"))^1*P(";")/"")+P(";")*(P(";")/"")+P(1)
+ local variableexpander=Cs((p_variable*(p_key/resolveinstancevariable)+p_whatever)^1 )
+ local p_cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
+ local variablecleaner=Cs((p_cleaner+P(1))^0)
+ local p_variable=R("az","AZ","09","__","--")^1/resolveinstancevariable
+ local p_variable=(P("$")/"")*(p_variable+(P("{")/"")*p_variable*(P("}")/""))
+ local variableresolver=Cs((p_variable+P(1))^0)
+ expandedvariable=function(var)
+ return lpegmatch(variableexpander,var) or var
+ end
+ function resolvers.reset()
+ if trace_locating then
+ report_resolving("creating instance")
+ end
+ local environment={}
+ local variables={}
+ local expansions={}
+ local order={}
+ instance={
+ environment=environment,
+ variables=variables,
+ expansions=expansions,
+ order=order,
+ files={},
+ setups={},
+ found={},
+ foundintrees={},
+ hashes={},
+ hashed={},
+ pathlists=false,
+ specification={},
+ lists={},
+ data={},
+ fakepaths={},
+ remember=true,
+ diskcache=true,
+ renewcache=false,
+ renewtree=false,
+ loaderror=false,
+ savelists=true,
+ pattern=nil,
+ force_suffixes=true,
+ pathstack={},
+ }
+ setmetatableindex(variables,function(t,k)
+ local v
+ for i=1,#order do
+ v=order[i][k]
+ if v~=nil then
+ t[k]=v
+ return v
+ end
+ end
+ if v==nil then
+ v=""
+ end
+ t[k]=v
+ return v
+ end)
+ local repath=resolvers.repath
+ setmetatableindex(environment,function(t,k)
+ local v=osgetenv(k)
+ if v==nil then
+ v=variables[k]
+ end
if v~=nil then
- t[k]=v
- return v
+ v=checkedvariable(v) or ""
end
- end
- if v==nil then
- v=""
- end
- t[k]=v
- return v
- end)
- setmetatableindex(environment,function(t,k)
- local v=osgetenv(k)
- if v==nil then
- v=variables[k]
- end
- if v~=nil then
- v=checkedvariable(v) or ""
- end
- v=resolvers.repath(v)
- t[k]=v
- return v
- end)
- setmetatableindex(expansions,function(t,k)
- local v=environment[k]
- if type(v)=="string" then
- v=lpegmatch(variableresolver,v)
- v=lpegmatch(variablecleaner,v)
- end
- t[k]=v
- return v
- end)
+ v=repath(v)
+ t[k]=v
+ return v
+ end)
+ setmetatableindex(expansions,function(t,k)
+ local v=environment[k]
+ if type(v)=="string" then
+ v=lpegmatch(variableresolver,v)
+ v=lpegmatch(variablecleaner,v)
+ end
+ t[k]=v
+ return v
+ end)
+ end
end
function resolvers.initialized()
return instance~=nil
@@ -22019,31 +22472,33 @@ local function reset_caches()
instance.lists={}
instance.pathlists=false
end
-local slash=P("/")
-local pathexpressionpattern=Cs (
- Cc("^")*(
- Cc("%")*S(".-")+slash^2*P(-1)/"/.*"
+local makepathexpression do
+ local slash=P("/")
+ local pathexpressionpattern=Cs (
+ Cc("^")*(
+ Cc("%")*S(".-")+slash^2*P(-1)/"/.*"
+slash^2/"/"+(1-slash)*P(-1)*Cc("/")+P(1)
- )^1*Cc("$")
-)
-local cache={}
-local function makepathexpression(str)
- if str=="." then
- return "^%./$"
- else
- local c=cache[str]
- if not c then
- c=lpegmatch(pathexpressionpattern,str)
- cache[str]=c
+ )^1*Cc("$")
+ )
+ local cache={}
+ makepathexpression=function(str)
+ if str=="." then
+ return "^%./$"
+ else
+ local c=cache[str]
+ if not c then
+ c=lpegmatch(pathexpressionpattern,str)
+ cache[str]=c
+ end
+ return c
end
- return c
end
end
local function reportcriticalvariables(cnfspec)
if trace_locating then
- for i=1,#resolvers.criticalvars do
- local k=resolvers.criticalvars[i]
- local v=resolvers.getenv(k) or "unknown"
+ for i=1,#criticalvars do
+ local k=criticalvars[i]
+ local v=getenv(k) or "unknown"
report_resolving("variable %a set to %a",k,v)
end
report_resolving()
@@ -22065,7 +22520,7 @@ local function identify_configuration_files()
resolvers.luacnfstate="environment"
end
reportcriticalvariables(cnfspec)
- local cnfpaths=expandedpathfromlist(resolvers.splitpath(cnfspec))
+ local cnfpaths=expandedpathfromlist(splitpath(cnfspec))
local function locatecnf(luacnfname,kind)
for i=1,#cnfpaths do
local filepath=cnfpaths[i]
@@ -22098,6 +22553,8 @@ local function identify_configuration_files()
end
local function load_configuration_files()
local specification=instance.specification
+ local setups=instance.setups
+ local order=instance.order
if #specification>0 then
local luacnfname=resolvers.luacnfname
for i=1,#specification do
@@ -22107,7 +22564,6 @@ local function load_configuration_files()
local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
- local setups=instance.setups
local data=blob()
local parent=data and data.parent
if parent then
@@ -22118,7 +22574,7 @@ local function load_configuration_files()
local parentdata=blob()
if parentdata then
report_resolving("loading configuration file %a",filename)
- data=table.merged(parentdata,data)
+ data=mergedtable(parentdata,data)
end
end
end
@@ -22150,7 +22606,7 @@ local function load_configuration_files()
if trace_locating then
report_resolving("reloading configuration due to TEXMF redefinition")
end
- resolvers.setenv("TEXMFCNF",cnfspec)
+ setenv("TEXMFCNF",cnfspec)
instance.specification={}
identify_configuration_files()
load_configuration_files()
@@ -22168,7 +22624,7 @@ local function load_configuration_files()
elseif trace_locating then
report_resolving("skipping configuration file %a (no valid format)",filename)
end
- instance.order[#instance.order+1]=instance.setups[pathname]
+ order[#order+1]=setups[pathname]
if instance.loaderror then
break
end
@@ -22177,6 +22633,8 @@ local function load_configuration_files()
report_resolving("warning: no lua configuration files found")
end
end
+local expandedpathlist
+local unexpandedpathlist
function resolvers.configurationfiles()
return instance.specification or {}
end
@@ -22193,7 +22651,7 @@ local function load_file_databases()
end
end
local function locate_file_databases()
- local texmfpaths=resolvers.expandedpathlist("TEXMF")
+ local texmfpaths=expandedpathlist("TEXMF")
if #texmfpaths>0 then
for i=1,#texmfpaths do
local path=collapsepath(texmfpaths[i])
@@ -22202,7 +22660,7 @@ local function locate_file_databases()
if stripped~="" then
local runtime=stripped==path
path=cleanpath(path)
- local spec=resolvers.splitmethod(stripped)
+ local spec=splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme=="file") then
stripped="tree:///"..stripped
elseif spec.scheme=="cache" or spec.scheme=="file" then
@@ -22236,11 +22694,13 @@ local function generate_file_databases()
end
end
local function save_file_databases()
- for i=1,#instance.hashes do
- local hash=instance.hashes[i]
+ local hashes=instance.hashes
+ local files=instance.files
+ for i=1,#hashes do
+ local hash=hashes[i]
local cachename=hash.name
if hash.cache then
- local content=instance.files[cachename]
+ local content=files[cachename]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",cachename)
@@ -22252,8 +22712,9 @@ local function save_file_databases()
end
end
function resolvers.renew(hashname)
+ local files=instance.files
if hashname and hashname~="" then
- local expanded=resolvers.expansion(hashname) or ""
+ local expanded=expansion(hashname) or ""
if expanded~="" then
if trace_locating then
report_resolving("identifying tree %a from %a",expanded,hashname)
@@ -22270,7 +22731,7 @@ function resolvers.renew(hashname)
report_resolving("using path %a",realpath)
end
methodhandler('generators',hashname)
- local content=instance.files[hashname]
+ local content=files[hashname]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",hashname)
@@ -22297,38 +22758,46 @@ local function load_databases()
end
end
function resolvers.appendhash(type,name,cache)
- if not instance.hashed[name] then
+ local hashed=instance.hashed
+ local hashes=instance.hashes
+ if hashed[name] then
+ else
if trace_locating then
report_resolving("hash %a appended",name)
end
- insert(instance.hashes,{ type=type,name=name,cache=cache } )
- instance.hashed[name]=cache
+ insert(hashes,{ type=type,name=name,cache=cache } )
+ hashed[name]=cache
end
end
function resolvers.prependhash(type,name,cache)
- if not instance.hashed[name] then
+ local hashed=instance.hashed
+ local hashes=instance.hashes
+ if hashed[name] then
+ else
if trace_locating then
report_resolving("hash %a prepended",name)
end
- insert(instance.hashes,1,{ type=type,name=name,cache=cache } )
- instance.hashed[name]=cache
+ insert(hashes,1,{ type=type,name=name,cache=cache } )
+ hashed[name]=cache
end
end
function resolvers.extendtexmfvariable(specification)
- local t=resolvers.splitpath(getenv("TEXMF"))
- insert(t,1,specification)
- local newspec=concat(t,",")
- if instance.environment["TEXMF"] then
- instance.environment["TEXMF"]=newspec
- elseif instance.variables["TEXMF"] then
- instance.variables["TEXMF"]=newspec
+ local environment=instance.environment
+ local variables=instance.variables
+ local texmftrees=splitpath(getenv("TEXMF"))
+ insert(texmftrees,1,specification)
+ texmftrees=concat(texmftrees,",")
+ if environment["TEXMF"] then
+ environment["TEXMF"]=texmftrees
+ elseif variables["TEXMF"] then
+ variables["TEXMF"]=texmftrees
else
end
reset_hashes()
end
function resolvers.splitexpansions()
- local ie=instance.expansions
- for k,v in next,ie do
+ local expansions=instance.expansions
+ for k,v in next,expansions do
local t,tn,h,p={},0,{},splitconfigurationpath(v)
for kk=1,#p do
local vv=p[kk]
@@ -22338,33 +22807,37 @@ function resolvers.splitexpansions()
h[vv]=true
end
end
- if #t>1 then
- ie[k]=t
+ if tn>1 then
+ expansions[k]=t
else
- ie[k]=t[1]
+ expansions[k]=t[1]
end
end
end
function resolvers.datastate()
return caches.contentstate()
end
-function resolvers.variable(name)
+variable=function(name)
+ local variables=instance.variables
local name=name and lpegmatch(dollarstripper,name)
- local result=name and instance.variables[name]
+ local result=name and variables[name]
return result~=nil and result or ""
end
-function resolvers.expansion(name)
+expansion=function(name)
+ local expansions=instance.expansions
local name=name and lpegmatch(dollarstripper,name)
- local result=name and instance.expansions[name]
+ local result=name and expansions[name]
return result~=nil and result or ""
end
-function resolvers.unexpandedpathlist(str)
- local pth=resolvers.variable(str)
- local lst=resolvers.splitpath(pth)
+resolvers.variable=variable
+resolvers.expansion=expansion
+unexpandedpathlist=function(str)
+ local pth=variable(str)
+ local lst=splitpath(pth)
return expandedpathfromlist(lst)
end
function resolvers.unexpandedpath(str)
- return joinpath(resolvers.unexpandedpathlist(str))
+ return joinpath(unexpandedpathlist(str))
end
function resolvers.pushpath(name)
local pathstack=instance.pathstack
@@ -22394,8 +22867,8 @@ function resolvers.stackpath()
end
local done={}
function resolvers.resetextrapaths()
- local ep=instance.extra_paths
- if not ep then
+ local extra_paths=instance.extra_paths
+ if not extra_paths then
done={}
instance.extra_paths={}
elseif #ep>0 then
@@ -22416,8 +22889,8 @@ function resolvers.registerextrapath(paths,subpaths)
end
local paths=settings_to_array(paths)
local subpaths=settings_to_array(subpaths)
- local ep=instance.extra_paths or {}
- local oldn=#ep
+ local extra_paths=instance.extra_paths or {}
+ local oldn=#extra_paths
local newn=oldn
local nofpaths=#paths
local nofsubpaths=#subpaths
@@ -22430,7 +22903,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=p.."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=cleanpath(ps)
+ extra_paths[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -22440,7 +22913,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p=paths[i]
if not done[p] then
newn=newn+1
- ep[newn]=cleanpath(p)
+ extra_paths[newn]=cleanpath(p)
done[p]=true
end
end
@@ -22449,17 +22922,17 @@ function resolvers.registerextrapath(paths,subpaths)
for i=1,oldn do
for j=1,nofsubpaths do
local s=subpaths[j]
- local ps=ep[i].."/"..s
+ local ps=extra_paths[i].."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=cleanpath(ps)
+ extra_paths[newn]=cleanpath(ps)
done[ps]=true
end
end
end
end
if newn>0 then
- instance.extra_paths=ep
+ instance.extra_paths=extra_paths
end
if newn~=oldn then
reset_caches()
@@ -22467,17 +22940,19 @@ function resolvers.registerextrapath(paths,subpaths)
end
function resolvers.pushextrapath(path)
local paths=settings_to_array(path)
- if instance.extra_stack then
- insert(instance.extra_stack,1,paths)
+ local extra_stack=instance.extra_stack
+ if extra_stack then
+ insert(extra_stack,1,paths)
else
instance.extra_stack={ paths }
end
reset_caches()
end
function resolvers.popextrapath()
- if instance.extra_stack then
+ local extra_stack=instance.extra_stack
+ if extra_stack then
reset_caches()
- return remove(instance.extra_stack,1)
+ return remove(extra_stack,1)
end
end
local function made_list(instance,list,extra_too)
@@ -22506,33 +22981,21 @@ local function made_list(instance,list,extra_too)
end
end
if extra_too then
- local es=instance.extra_stack
- if es and #es>0 then
- for k=1,#es do
- add(es[k])
+ local extra_stack=instance.extra_stack
+ local extra_paths=instance.extra_paths
+ if extra_stack and #extra_stack>0 then
+ for k=1,#extra_stack do
+ add(extra_stack[k])
end
end
- local ep=instance.extra_paths
- if ep and #ep>0 then
- add(ep)
+ if extra_paths and #extra_paths>0 then
+ add(extra_paths)
end
end
add(list)
return new
end
-function resolvers.cleanpathlist(str)
- local t=resolvers.expandedpathlist(str)
- if t then
- for i=1,#t do
- t[i]=collapsepath(cleanpath(t[i]))
- end
- end
- return t
-end
-function resolvers.expandpath(str)
- return joinpath(resolvers.expandedpathlist(str))
-end
-function resolvers.expandedpathlist(str,extra_too)
+expandedpathlist=function(str,extra_too)
if not str then
return {}
elseif instance.savelists then
@@ -22540,40 +23003,56 @@ function resolvers.expandedpathlist(str,extra_too)
local lists=instance.lists
local lst=lists[str]
if not lst then
- local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
+ local l=made_list(instance,splitpath(expansion(str)),extra_too)
lst=expandedpathfromlist(l)
lists[str]=lst
end
return lst
else
- local lst=resolvers.splitpath(resolvers.expansion(str))
+ local lst=splitpath(expansion(str))
return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
-function resolvers.expandedpathlistfromvariable(str)
+resolvers.expandedpathlist=expandedpathlist
+resolvers.unexpandedpathlist=unexpandedpathlist
+function resolvers.cleanpathlist(str)
+ local t=expandedpathlist(str)
+ if t then
+ for i=1,#t do
+ t[i]=collapsepath(cleanpath(t[i]))
+ end
+ end
+ return t
+end
+function resolvers.expandpath(str)
+ return joinpath(expandedpathlist(str))
+end
+local function expandedpathlistfromvariable(str)
str=lpegmatch(dollarstripper,str)
local tmp=resolvers.variableofformatorsuffix(str)
- return resolvers.expandedpathlist(tmp~="" and tmp or str)
+ return expandedpathlist(tmp~="" and tmp or str)
end
function resolvers.expandpathfromvariable(str)
- return joinpath(resolvers.expandedpathlistfromvariable(str))
+ return joinpath(expandedpathlistfromvariable(str))
end
+resolvers.expandedpathlistfromvariable=expandedpathlistfromvariable
function resolvers.cleanedpathlist(v)
- local t=resolvers.expandedpathlist(v)
+ local t=expandedpathlist(v)
for i=1,#t do
- t[i]=resolvers.resolve(resolvers.cleanpath(t[i]))
+ t[i]=resolveprefix(cleanpath(t[i]))
end
return t
end
function resolvers.expandbraces(str)
- local pth=expandedpathfromlist(resolvers.splitpath(str))
+ local pth=expandedpathfromlist(splitpath(str))
return joinpath(pth)
end
function resolvers.registerfilehash(name,content,someerror)
+ local files=instance.files
if content then
- instance.files[name]=content
+ files[name]=content
else
- instance.files[name]={}
+ files[name]={}
if somerror==true then
instance.loaderror=someerror
end
@@ -22592,7 +23071,7 @@ function resolvers.renewcache()
end
local function isreadable(name)
local readable=isfile(name)
- if trace_detail then
+ if trace_details then
if readable then
report_resolving("file %a is readable",name)
else
@@ -22609,7 +23088,7 @@ local function collect_files(names)
local variant=hash.type
local search=filejoin(root,path,name)
local result=methodhandler('concatinators',variant,root,path,name)
- if trace_detail then
+ if trace_details then
report_resolving("match: variant %a, search %a, result %a",variant,search,result)
end
noffiles=noffiles+1
@@ -22618,7 +23097,7 @@ local function collect_files(names)
end
for k=1,#names do
local filename=names[k]
- if trace_detail then
+ if trace_details then
report_resolving("checking name %a",filename)
end
local basename=filebasename(filename)
@@ -22630,12 +23109,13 @@ local function collect_files(names)
pathname="/"..pathname.."$"
end
local hashes=instance.hashes
+ local files=instance.files
for h=1,#hashes do
local hash=hashes[h]
local hashname=hash.name
- local content=hashname and instance.files[hashname]
+ local content=hashname and files[hashname]
if content then
- if trace_detail then
+ if trace_details then
report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
local path,name=lookup(content,basename)
@@ -22703,7 +23183,6 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat=="" then
if filesuffix=="" or not suffixmap[filesuffix] then
local defaultsuffixes=resolvers.defaultsuffixes
- local formatofsuffix=resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname=filename..'.'..defaultsuffixes[i]
wantedfiles[#wantedfiles+1]=forcedname
@@ -22713,7 +23192,7 @@ local function find_analyze(filename,askedformat,allresults)
end
end
else
- filetype=resolvers.formatofsuffix(filename)
+ filetype=formatofsuffix(filename)
if trace_locating then
report_resolving("using suffix based filetype %a",filetype)
end
@@ -22736,7 +23215,7 @@ local function find_analyze(filename,askedformat,allresults)
end
local function find_direct(filename,allresults)
if not dangerous[askedformat] and isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("file %a found directly",filename)
end
return "direct",{ filename }
@@ -22761,12 +23240,12 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
report_resolving("checking qualified name %a",filename)
end
if isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("qualified file %a found",filename)
end
return "qualified",{ filename }
end
- if trace_detail then
+ if trace_details then
report_resolving("locating qualified file %a",filename)
end
local forcedname,suffix="",suffixonly(filename)
@@ -22774,11 +23253,11 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
local format_suffixes=askedformat=="" and resolvers.defaultsuffixes or suffixes[askedformat]
if format_suffixes then
for i=1,#format_suffixes do
- local s=format_suffixes[i]
- forcedname=filename.."."..s
+ local suffix=format_suffixes[i]
+ forcedname=filename.."."..suffix
if isreadable(forcedname) then
if trace_locating then
- report_resolving("no suffix, forcing format filetype %a",s)
+ report_resolving("no suffix, forcing format filetype %a",suffix)
end
return "qualified",{ forcedname }
end
@@ -22791,7 +23270,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
local savedformat=askedformat
local format=savedformat or ""
if format=="" then
- askedformat=resolvers.formatofsuffix(suffix)
+ askedformat=formatofsuffix(suffix)
end
if not format then
askedformat="othertextfiles"
@@ -22822,7 +23301,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
end
local function check_subpath(fname)
if isreadable(fname) then
- if trace_detail then
+ if trace_details then
report_resolving("found %a by deep scanning",fname)
end
return fname
@@ -22830,7 +23309,7 @@ local function check_subpath(fname)
end
local function makepathlist(list,filetype)
local typespec=resolvers.variableofformat(filetype)
- local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
+ local pathlist=expandedpathlist(typespec,filetype and usertypes[filetype])
local entry={}
if pathlist and #pathlist>0 then
for k=1,#pathlist do
@@ -22841,7 +23320,7 @@ local function makepathlist(list,filetype)
local expression=makepathexpression(pathname)
local barename=gsub(pathname,"/+$","")
barename=resolveprefix(barename)
- local scheme=url.hasscheme(barename)
+ local scheme=urlhasscheme(barename)
local schemename=gsub(barename,"%.%*$",'')
entry[k]={
path=path,
@@ -22878,7 +23357,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
dirlist[i]=filedirname(filelist[i][3]).."/"
end
end
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a in tree",filename)
end
for k=1,#pathlist do
@@ -22888,7 +23367,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local done=false
if filelist then
local expression=entry.expression
- if trace_detail then
+ if trace_details then
report_resolving("using pattern %a for path %a",expression,pathname)
end
for k=1,#filelist do
@@ -22899,16 +23378,16 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
result[#result+1]=resolveprefix(fl[3])
done=true
if allresults then
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, continue scanning",expression,f,d)
end
else
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, quit scanning",expression,f,d)
end
break
end
- elseif trace_detail then
+ elseif trace_details then
report_resolving("no match to %a in hash for file %a and path %a",expression,f,d)
end
end
@@ -22923,7 +23402,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
if not done and not entry.prescanned then
- if trace_detail then
+ if trace_details then
report_resolving("quick root scan for %a",pname)
end
for k=1,#wantedfiles do
@@ -22938,7 +23417,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if not done and entry.recursive then
- if trace_detail then
+ if trace_details then
report_resolving("scanning filesystem for %a",pname)
end
local files=resolvers.simplescanfiles(pname,false,true)
@@ -23004,7 +23483,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
local function find_onpath(filename,filetype,wantedfiles,allresults)
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a, filetype %a, wanted files %a",filename,filetype,concat(wantedfiles," | "))
end
local result={}
@@ -23046,7 +23525,9 @@ collect_instance_files=function(filename,askedformat,allresults)
{ find_onpath (filename,filetype,wantedfiles,true) },
{ find_otherwise(filename,filetype,wantedfiles,true) },
}
- local result,status,done={},{},{}
+ local result={}
+ local status={}
+ local done={}
for k,r in next,results do
local method,list=r[1],r[2]
if method and list then
@@ -23060,7 +23541,7 @@ collect_instance_files=function(filename,askedformat,allresults)
end
end
end
- if trace_detail then
+ if trace_details then
report_resolving("lookup status: %s",table.serialize(status,filename))
end
return result,status
@@ -23117,6 +23598,9 @@ local function findfiles(filename,filetype,allresults)
if not filename or filename=="" then
return {}
end
+ if allresults==nil then
+ allresults=true
+ end
local result,status=collect_instance_files(filename,filetype or "",allresults)
if not result or #result==0 then
local lowered=lower(filename)
@@ -23126,27 +23610,25 @@ local function findfiles(filename,filetype,allresults)
end
return result or {},status
end
-function resolvers.findfiles(filename,filetype)
- if not filename or filename=="" then
- return ""
- else
- return findfiles(filename,filetype,true)
- end
-end
-function resolvers.findfile(filename,filetype)
+local function findfile(filename,filetype)
if not filename or filename=="" then
return ""
else
return findfiles(filename,filetype,false)[1] or ""
end
end
+resolvers.findfiles=findfiles
+resolvers.findfile=findfile
+resolvers.find_file=findfile
+resolvers.find_files=findfiles
function resolvers.findpath(filename,filetype)
return filedirname(findfiles(filename,filetype,false)[1] or "")
end
local function findgivenfiles(filename,allresults)
+ local hashes=instance.hashes
+ local files=instance.files
local base=filebasename(filename)
local result={}
- local hashes=instance.hashes
local function okay(hash,path,name)
local found=methodhandler('concatinators',hash.type,hash.name,path,name)
if found and found~="" then
@@ -23156,7 +23638,7 @@ local function findgivenfiles(filename,allresults)
end
for k=1,#hashes do
local hash=hashes[k]
- local content=instance.files[hash.name]
+ local content=files[hash.name]
if content then
local path,name=lookup(content,base)
if not path then
@@ -23188,14 +23670,14 @@ function resolvers.wildcardpattern(pattern)
return lpegmatch(makewildcard,pattern) or pattern
end
local function findwildcardfiles(filename,allresults,result)
+ local files=instance.files
+ local hashes=instance.hashes
local result=result or {}
local base=filebasename(filename)
local dirn=filedirname(filename)
local path=lower(lpegmatch(makewildcard,dirn) or dirn)
local name=lower(lpegmatch(makewildcard,base) or base)
- local files=instance.files
if find(name,"*",1,true) then
- local hashes=instance.hashes
local function okay(found,path,base,hashname,hashtype)
if find(found,path) then
local full=methodhandler('concatinators',hashtype,hashname,found,base)
@@ -23235,7 +23717,6 @@ local function findwildcardfiles(filename,allresults,result)
end
end
end
- local hashes=instance.hashes
for k=1,#hashes do
local hash=hashes[k]
local hashname=hash.name
@@ -23265,13 +23746,21 @@ end
function resolvers.findwildcardfile(filename)
return findwildcardfiles(filename,false)[1] or ""
end
-function resolvers.automount()
-end
-function resolvers.starttiming()
- statistics.starttiming(instance)
+do
+ local starttiming=statistics.starttiming
+ local stoptiming=statistics.stoptiming
+ local elapsedtime=statistics.elapsedtime
+ function resolvers.starttiming()
+ starttiming(instance)
+ end
+ function resolvers.stoptiming()
+ stoptiming(instance)
+ end
+ function resolvers.loadtime()
+ return elapsedtime(instance)
+ end
end
-function resolvers.stoptiming()
- statistics.stoptiming(instance)
+function resolvers.automount()
end
function resolvers.load(option)
resolvers.starttiming()
@@ -23285,9 +23774,6 @@ function resolvers.load(option)
local files=instance.files
return files and next(files) and true
end
-function resolvers.loadtime()
- return statistics.elapsedtime(instance)
-end
local function report(str)
if trace_locating then
report_resolving(str)
@@ -23317,7 +23803,7 @@ function resolvers.dowithfilesandreport(command,files,...)
end
end
function resolvers.showpath(str)
- return joinpath(resolvers.expandedpathlist(resolvers.formatofvariable(str)))
+ return joinpath(expandedpathlist(resolvers.formatofvariable(str)))
end
function resolvers.registerfile(files,name,path)
if files[name] then
@@ -23331,7 +23817,7 @@ function resolvers.registerfile(files,name,path)
end
end
function resolvers.dowithpath(name,func)
- local pathlist=resolvers.expandedpathlist(name)
+ local pathlist=expandedpathlist(name)
for i=1,#pathlist do
func("^"..cleanpath(pathlist[i]))
end
@@ -23341,11 +23827,11 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
local engine=environment.ownmain or "luatex"
- local barename=removesuffix(name)
+ local barename=removesuffix(file.basename(name))
local fullname=addsuffix(barename,"fmt")
local fmtname=caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname=="" then
- fmtname=resolvers.findfile(fullname)
+ fmtname=findfile(fullname)
fmtname=cleanpath(fmtname)
end
if fmtname~="" then
@@ -23354,17 +23840,17 @@ function resolvers.locateformat(name)
local lucname=addsuffix(barename,luasuffixes.luc)
local luiname=addsuffix(barename,luasuffixes.lui)
if isfile(luiname) then
- return barename,luiname
+ return fmtname,luiname
elseif isfile(lucname) then
- return barename,lucname
+ return fmtname,lucname
elseif isfile(luaname) then
- return barename,luaname
+ return fmtname,luaname
end
end
return nil,nil
end
function resolvers.booleanvariable(str,default)
- local b=resolvers.expansion(str)
+ local b=expansion(str)
if b=="" then
return default
else
@@ -23374,6 +23860,7 @@ function resolvers.booleanvariable(str,default)
end
function resolvers.dowithfilesintree(pattern,handle,before,after)
local hashes=instance.hashes
+ local files=instance.files
for i=1,#hashes do
local hash=hashes[i]
local blobtype=hash.type
@@ -23385,7 +23872,7 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
if before then
before(blobtype,blobpath,pattern)
end
- for path,name in filtered(instance.files[blobpath],pattern) do
+ for path,name in filtered(files[blobpath],pattern) do
if type(path)=="string" then
checked=checked+1
if handle(blobtype,blobpath,path,name) then
@@ -23406,10 +23893,6 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
end
end
end
-local obsolete=resolvers.obsolete or {}
-resolvers.obsolete=obsolete
-resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile
-resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles
function resolvers.knownvariables(pattern)
if instance then
local environment=instance.environment
@@ -23443,7 +23926,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 4854, stripped down to: 2889
+-- original size: 5088, stripped down to: 3144
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -23452,6 +23935,7 @@ if not modules then modules={} end modules ['data-pre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local insert,remove=table.insert,table.remove
local resolvers=resolvers
local prefixes=resolvers.prefixes
local cleanpath=resolvers.cleanpath
@@ -23529,8 +24013,9 @@ prefixes.kpse=prefixes.locate
prefixes.full=prefixes.locate
prefixes.file=prefixes.filename
prefixes.path=prefixes.pathname
+local inputstack={}
+local stackpath=resolvers.stackpath
local function toppath()
- local inputstack=resolvers.inputstack
if not inputstack then
return "."
end
@@ -23542,15 +24027,23 @@ local function toppath()
end
end
local function jobpath()
- local path=resolvers.stackpath()
+ local path=stackpath()
if not path or path=="" then
return "."
else
return path
end
end
+local function pushinputname(name)
+ insert(inputstack,name)
+end
+local function popinputname(name)
+ return remove(inputstack)
+end
resolvers.toppath=toppath
resolvers.jobpath=jobpath
+resolvers.pushinputname=pushinputname
+resolvers.popinputname=popinputname
prefixes.toppath=function(str) return cleanpath(joinpath(toppath(),str)) end
prefixes.jobpath=function(str) return cleanpath(joinpath(jobpath(),str)) end
resolvers.setdynamic("toppath")
@@ -23593,7 +24086,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-out"] = package.loaded["data-out"] or true
--- original size: 530, stripped down to: 470
+-- original size: 551, stripped down to: 470
if not modules then modules={} end modules ['data-out']={
version=1.001,
@@ -23616,7 +24109,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-fil"] = package.loaded["data-fil"] or true
--- original size: 3863, stripped down to: 3170
+-- original size: 4365, stripped down to: 3588
if not modules then modules={} end modules ['data-fil']={
version=1.001,
@@ -23625,39 +24118,46 @@ if not modules then modules={} end modules ['data-fil']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local ioopen=io.open
+local isdir=lfs.isdir
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_files=logs.reporter("resolvers","files")
local resolvers=resolvers
local resolveprefix=resolvers.resolve
-local finders,openers,loaders,savers=resolvers.finders,resolvers.openers,resolvers.loaders,resolvers.savers
-local locators,hashers,generators,concatinators=resolvers.locators,resolvers.hashers,resolvers.generators,resolvers.concatinators
+local findfile=resolvers.findfile
+local scanfiles=resolvers.scanfiles
+local registerfilehash=resolvers.registerfilehash
+local appendhash=resolvers.appendhash
+local loadcachecontent=caches.loadcontent
local checkgarbage=utilities.garbagecollector and utilities.garbagecollector.check
-function locators.file(specification)
+function resolvers.locators.file(specification)
local filename=specification.filename
local realname=resolveprefix(filename)
- if realname and realname~='' and lfs.isdir(realname) then
+ if realname and realname~='' and isdir(realname) then
if trace_locating then
report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',filename,true)
+ appendhash('file',filename,true)
elseif trace_locating then
report_files("file locator %a not found",filename)
end
end
-function hashers.file(specification)
+function resolvers.hashers.file(specification)
local pathname=specification.filename
- local content=caches.loadcontent(pathname,'files')
- resolvers.registerfilehash(pathname,content,content==nil)
+ local content=loadcachecontent(pathname,'files')
+ registerfilehash(pathname,content,content==nil)
end
-function generators.file(specification)
+function resolvers.generators.file(specification)
local pathname=specification.filename
- local content=resolvers.scanfiles(pathname,false,true)
- resolvers.registerfilehash(pathname,content,true)
+ local content=scanfiles(pathname,false,true)
+ registerfilehash(pathname,content,true)
end
-concatinators.file=file.join
+resolvers.concatinators.file=file.join
+local finders=resolvers.finders
+local notfound=finders.notfound
function finders.file(specification,filetype)
local filename=specification.filename
- local foundname=resolvers.findfile(filename,filetype)
+ local foundname=findfile(filename,filetype)
if foundname and foundname~="" then
if trace_locating then
report_files("file finder: %a found",filename)
@@ -23667,37 +24167,55 @@ function finders.file(specification,filetype)
if trace_locating then
report_files("file finder: %a not found",filename)
end
- return finders.notfound()
+ return notfound()
end
end
-function openers.helpers.textopener(tag,filename,f)
+local openers=resolvers.openers
+local notfound=openers.notfound
+local overloaded=false
+local function textopener(tag,filename,f)
return {
- reader=function() return f:read () end,
- close=function() logs.show_close(filename) return f:close() end,
+ reader=function() return f:read () end,
+ close=function() return f:close() end,
}
end
+function openers.helpers.textopener(...)
+ return textopener(...)
+end
+function openers.helpers.settextopener(opener)
+ if overloaded then
+ report_files("file opener: %s overloaded","already")
+ else
+ if trace_locating then
+ report_files("file opener: %s overloaded","once")
+ end
+ overloaded=true
+ textopener=opener
+ end
+end
function openers.file(specification,filetype)
local filename=specification.filename
if filename and filename~="" then
- local f=io.open(filename,"r")
+ local f=ioopen(filename,"r")
if f then
if trace_locating then
report_files("file opener: %a opened",filename)
end
- return openers.helpers.textopener("file",filename,f)
+ return textopener("file",filename,f)
end
end
if trace_locating then
report_files("file opener: %a not found",filename)
end
- return openers.notfound()
+ return notfound()
end
+local loaders=resolvers.loaders
+local notfound=loaders.notfound
function loaders.file(specification,filetype)
local filename=specification.filename
if filename and filename~="" then
- local f=io.open(filename,"rb")
+ local f=ioopen(filename,"rb")
if f then
- logs.show_load(filename)
if trace_locating then
report_files("file loader: %a loaded",filename)
end
@@ -23714,7 +24232,7 @@ function loaders.file(specification,filetype)
if trace_locating then
report_files("file loader: %a not found",filename)
end
- return loaders.notfound()
+ return notfound()
end
@@ -23724,7 +24242,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-con"] = package.loaded["data-con"] or true
--- original size: 5029, stripped down to: 3432
+-- original size: 5388, stripped down to: 3685
if not modules then modules={} end modules ['data-con']={
version=1.100,
@@ -23733,6 +24251,7 @@ if not modules then modules={} end modules ['data-con']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local setmetatable=setmetatable
local format,lower,gsub=string.format,string.lower,string.gsub
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local trace_containers=false trackers.register("resolvers.containers",function(v) trace_containers=v end)
@@ -23740,16 +24259,21 @@ local trace_storage=false trackers.register("resolvers.storage",function(v) tra
containers=containers or {}
local containers=containers
containers.usecache=true
+local getwritablepath=caches.getwritablepath
+local getreadablepaths=caches.getreadablepaths
+local cacheiswritable=caches.is_writable
+local loaddatafromcache=caches.loaddata
+local savedataincache=caches.savedata
local report_containers=logs.reporter("resolvers","containers")
local allocated={}
local mt={
__index=function(t,k)
if k=="writable" then
- local writable=caches.getwritablepath(t.category,t.subcategory) or { "." }
+ local writable=getwritablepath(t.category,t.subcategory) or { "." }
t.writable=writable
return writable
elseif k=="readables" then
- local readables=caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ local readables=getreadablepaths(t.category,t.subcategory) or { "." }
t.readables=readables
return readables
end
@@ -23780,7 +24304,7 @@ function containers.define(category,subcategory,version,enabled)
end
end
function containers.is_usable(container,name)
- return container.enabled and caches and caches.is_writable(container.writable,name)
+ return container.enabled and caches and cacheiswritable(container.writable,name)
end
function containers.is_valid(container,name)
if name and name~="" then
@@ -23794,7 +24318,7 @@ function containers.read(container,name)
local storage=container.storage
local stored=storage[name]
if not stored and container.enabled and caches and containers.usecache then
- stored=caches.loaddata(container.readables,name,container.writable)
+ stored=loaddatafromcache(container.readables,name,container.writable)
if stored and stored.cache_version==container.version then
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","load",container.subcategory,name)
@@ -23810,17 +24334,20 @@ function containers.read(container,name)
end
return stored
end
-function containers.write(container,name,data)
+function containers.write(container,name,data,fast)
if data then
data.cache_version=container.version
if container.enabled and caches then
- local unique,shared=data.unique,data.shared
- data.unique,data.shared=nil,nil
- caches.savedata(container.writable,name,data)
+ local unique=data.unique
+ local shared=data.shared
+ data.unique=nil
+ data.shared=nil
+ savedataincache(container.writable,name,data,fast)
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","save",container.subcategory,name)
end
- data.unique,data.shared=unique,shared
+ data.unique=unique
+ data.shared=shared
end
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","store",container.subcategory,name)
@@ -23843,7 +24370,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-use"] = package.loaded["data-use"] or true
--- original size: 4434, stripped down to: 3180
+-- original size: 5790, stripped down to: 2910
if not modules then modules={} end modules ['data-use']={
version=1.001,
@@ -23852,40 +24379,11 @@ if not modules then modules={} end modules ['data-use']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local format,lower,gsub,find=string.format,string.lower,string.gsub,string.find
+local format=string.format
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_mounts=logs.reporter("resolvers","mounts")
local resolvers=resolvers
-resolvers.automounted=resolvers.automounted or {}
-function resolvers.automount(usecache)
- local mountpaths=resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
- if (not mountpaths or #mountpaths==0) and usecache then
- mountpaths=caches.getreadablepaths("mount")
- end
- if mountpaths and #mountpaths>0 then
- resolvers.starttiming()
- for k=1,#mountpaths do
- local root=mountpaths[k]
- local f=io.open(root.."/url.tmi")
- if f then
- for line in f:lines() do
- if line then
- if find(line,"^[%%#%-]") then
- elseif find(line,"^zip://") then
- if trace_locating then
- report_mounts("mounting %a",line)
- end
- table.insert(resolvers.automounted,line)
- resolvers.usezipfile(line)
- end
- end
- end
- f:close()
- end
- end
- resolvers.stoptiming()
- end
-end
+local findfile=resolvers.findfile
statistics.register("used config file",function() return caches.configfiles() end)
statistics.register("used cache path",function() return caches.usedpaths() end)
function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner)
@@ -23895,9 +24393,11 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner)
local luvdata={
enginebanner=enginebanner,
formatbanner=formatbanner,
- sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"),
+ sourcehash=md5.hex(io.loaddata(findfile(sourcefile)) or "unknown"),
sourcefile=sourcefile,
luaversion=LUAVERSION,
+ formatid=LUATEXFORMATID,
+ functionality=LUATEXFUNCTIONALITY,
}
io.savedata(luvname,table.serialize(luvdata,true))
lua.registerfinalizer(function()
@@ -23917,7 +24417,7 @@ function statistics.checkfmtstatus(texname)
if lfs.isfile(luvname) then
local luv=dofile(luvname)
if luv and luv.sourcefile then
- local sourcehash=md5.hex(io.loaddata(resolvers.findfile(luv.sourcefile)) or "unknown")
+ local sourcehash=md5.hex(io.loaddata(findfile(luv.sourcefile)) or "unknown")
local luvbanner=luv.enginebanner or "?"
if luvbanner~=enginebanner then
return format("engine mismatch (luv: %s <> bin: %s)",luvbanner,enginebanner)
@@ -23927,8 +24427,19 @@ function statistics.checkfmtstatus(texname)
return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash)
end
local luvluaversion=luv.luaversion or 0
- if luvluaversion~=LUAVERSION then
- return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION)
+ local engluaversion=LUAVERSION or 0
+ if luvluaversion~=engluaversion then
+ return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,engluaversion)
+ end
+ local luvfunctionality=luv.functionality or 0
+ local engfunctionality=status.development_id or 0
+ if luvfunctionality~=engfunctionality then
+ return format("functionality mismatch (luv: %s <> bin: %s)",luvfunctionality,engfunctionality)
+ end
+ local luvformatid=luv.formatid or 0
+ local engformatid=status.format_id or 0
+ if luvformatid~=engformatid then
+ return format("formatid mismatch (luv: %s <> bin: %s)",luvformatid,engformatid)
end
else
return "invalid status file"
@@ -23947,7 +24458,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 10263, stripped down to: 7556
+-- original size: 10725, stripped down to: 7949
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -23960,6 +24471,14 @@ local format,find,match=string.format,string.find,string.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_zip=logs.reporter("resolvers","zip")
local resolvers=resolvers
+local findfile=resolvers.findfile
+local registerfile=resolvers.registerfile
+local splitmethod=resolvers.splitmethod
+local prependhash=resolvers.prependhash
+local starttiming=resolvers.starttiming
+local extendtexmf=resolvers.extendtexmfvariable
+local stoptiming=resolvers.stoptiming
+local urlquery=url.query
zip=zip or {}
local zip=zip
local archives=zip.archives or {}
@@ -23974,8 +24493,9 @@ if zipfiles then
closezip=zipfiles.close
validfile=zipfiles.found
wholefile=zipfiles.unzip
+ local listzip=zipfiles.list
traversezip=function(zfile)
- return ipairs(zipfiles.list(zfile))
+ return ipairs(listzip(zfile))
end
local streams=utilities.streams
local openstream=streams.open
@@ -24032,28 +24552,30 @@ local function validzip(str)
return str
end
end
-function zip.openarchive(name)
+local function openarchive(name)
if not name or name=="" then
return nil
else
local arch=archives[name]
if not arch then
- local full=resolvers.findfile(name) or ""
+ local full=findfile(name) or ""
arch=full~="" and openzip(full) or false
archives[name]=arch
end
return arch
end
end
-function zip.closearchive(name)
+local function closearchive(name)
if not name or (name=="" and archives[name]) then
closezip(archives[name])
archives[name]=nil
end
end
+zip.openarchive=openarchive
+zip.closearchive=closearchive
function resolvers.locators.zip(specification)
local archive=specification.filename
- local zipfile=archive and archive~="" and zip.openarchive(archive)
+ local zipfile=archive and archive~="" and openarchive(archive)
if trace_locating then
if zipfile then
report_zip("locator: archive %a found",archive)
@@ -24062,13 +24584,6 @@ function resolvers.locators.zip(specification)
end
end
end
-function resolvers.hashers.zip(specification)
- local archive=specification.filename
- if trace_locating then
- report_zip("loading file %a",archive)
- end
- resolvers.usezipfile(specification.original)
-end
function resolvers.concatinators.zip(zipfile,path,name)
if not path or path=="" then
return format('%s?name=%s',zipfile,name)
@@ -24076,14 +24591,16 @@ function resolvers.concatinators.zip(zipfile,path,name)
return format('%s?name=%s/%s',zipfile,path,name)
end
end
-function resolvers.finders.zip(specification)
+local finders=resolvers.finders
+local notfound=finders.notfound
+function finders.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("finder: archive %a found",archive)
@@ -24104,16 +24621,19 @@ function resolvers.finders.zip(specification)
if trace_locating then
report_zip("finder: %a not found",original)
end
- return resolvers.finders.notfound()
+ return notfound()
end
-function resolvers.openers.zip(specification)
+local openers=resolvers.openers
+local notfound=openers.notfound
+local textopener=openers.helpers.textopener
+function openers.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("opener; archive %a opened",archive)
@@ -24123,7 +24643,7 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: file %a found",queryname)
end
- return resolvers.openers.helpers.textopener('zip',original,handle)
+ return textopener('zip',original,handle)
elseif trace_locating then
report_zip("opener: file %a not found",queryname)
end
@@ -24135,23 +24655,24 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: %a not found",original)
end
- return resolvers.openers.notfound()
+ return notfound()
end
-function resolvers.loaders.zip(specification)
+local loaders=resolvers.loaders
+local notfound=loaders.notfound
+function loaders.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("loader: archive %a opened",archive)
end
local data=wholefile(zfile,queryname)
if data then
- logs.show_load(original)
if trace_locating then
report_zip("loader; file %a loaded",original)
end
@@ -24167,47 +24688,24 @@ function resolvers.loaders.zip(specification)
if trace_locating then
report_zip("loader: %a not found",original)
end
- return resolvers.openers.notfound()
-end
-function resolvers.usezipfile(archive)
- local specification=resolvers.splitmethod(archive)
- local archive=specification.filename
- if archive and not registeredfiles[archive] then
- local z=zip.openarchive(archive)
- if z then
- local tree=url.query(specification.query).tree or ""
- if trace_locating then
- report_zip("registering: archive %a",archive)
- end
- resolvers.starttiming()
- resolvers.prependhash('zip',archive)
- resolvers.extendtexmfvariable(archive)
- registeredfiles[archive]=z
- resolvers.registerfilehash(archive,resolvers.registerzipfile(z,tree))
- resolvers.stoptiming()
- elseif trace_locating then
- report_zip("registering: unknown archive %a",archive)
- end
- elseif trace_locating then
- report_zip("registering: archive %a not found",archive)
- end
+ return notfound()
end
-function resolvers.registerzipfile(z,tree)
+local function registerzipfile(z,tree)
local names={}
local files={}
local remap={}
local n=0
local filter=tree=="" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
- local register=resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
+ starttiming()
for i in traversezip(z) do
local filename=i.filename
local path,name=match(filename,filter)
if not path then
n=n+1
- register(names,filename,"")
+ registerfile(names,filename,"")
local usedname=lower(filename)
files[usedname]=""
if usedname~=filename then
@@ -24224,12 +24722,43 @@ function resolvers.registerzipfile(z,tree)
else
end
end
+ stoptiming()
report_zip("registering: %s files registered",n)
return {
files=files,
remap=remap,
}
end
+local function usezipfile(archive)
+ local specification=splitmethod(archive)
+ local archive=specification.filename
+ if archive and not registeredfiles[archive] then
+ local z=openarchive(archive)
+ if z then
+ local tree=urlquery(specification.query).tree or ""
+ if trace_locating then
+ report_zip("registering: archive %a",archive)
+ end
+ prependhash('zip',archive)
+ extendtexmf(archive)
+ registeredfiles[archive]=z
+ registerfilehash(archive,registerzipfile(z,tree))
+ elseif trace_locating then
+ report_zip("registering: unknown archive %a",archive)
+ end
+ elseif trace_locating then
+ report_zip("registering: archive %a not found",archive)
+ end
+end
+resolvers.usezipfile=usezipfile
+resolvers.registerzipfile=registerzipfile
+function resolvers.hashers.zip(specification)
+ local archive=specification.filename
+ if trace_locating then
+ report_zip("loading file %a",archive)
+ end
+ usezipfile(specification.original)
+end
end -- of closure
@@ -24238,7 +24767,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tre"] = package.loaded["data-tre"] or true
--- original size: 8478, stripped down to: 5223
+-- original size: 10802, stripped down to: 6619
if not modules then modules={} end modules ['data-tre']={
version=1.001,
@@ -24247,180 +24776,255 @@ if not modules then modules={} end modules ['data-tre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local type=type
local find,gsub,lower=string.find,string.gsub,string.lower
-local basename,dirname,joinname=file.basename,file.dirname,file .join
+local basename,dirname,joinname=file.basename,file.dirname,file.join
local globdir,isdir,isfile=dir.glob,lfs.isdir,lfs.isfile
local P,lpegmatch=lpeg.P,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_trees=logs.reporter("resolvers","trees")
local resolvers=resolvers
-local resolveprefix=resolvers.resolve
-local notfound=resolvers.finders.notfound
-local lookup=resolvers.get_from_content
-local collectors={}
-local found={}
-function resolvers.finders.tree(specification)
- local spec=specification.filename
- local okay=found[spec]
- if okay==nil then
- if spec~="" then
- local path=dirname(spec)
- local name=basename(spec)
- if path=="" then
- path="."
- end
- local names=collectors[path]
- if not names then
- local pattern=find(path,"/%*+$") and path or (path.."/*")
- names=globdir(pattern)
- collectors[path]=names
- end
- local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
- for i=1,#names do
- local fullname=names[i]
- if find(fullname,pattern) then
- found[spec]=fullname
- return fullname
- end
- end
- local pattern=lower(pattern)
- for i=1,#names do
- local fullname=lower(names[i])
- if find(fullname,pattern) then
- if isfile(fullname) then
+local finders=resolvers.finders
+local openers=resolvers.openers
+local loaders=resolvers.loaders
+local locators=resolvers.locators
+local hashers=resolvers.hashers
+local generators=resolvers.generators
+do
+ local collectors={}
+ local found={}
+ local notfound=finders.notfound
+ function finders.tree(specification)
+ local spec=specification.filename
+ local okay=found[spec]
+ if okay==nil then
+ if spec~="" then
+ local path=dirname(spec)
+ local name=basename(spec)
+ if path=="" then
+ path="."
+ end
+ local names=collectors[path]
+ if not names then
+ local pattern=find(path,"/%*+$") and path or (path.."/*")
+ names=globdir(pattern)
+ collectors[path]=names
+ end
+ local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
+ for i=1,#names do
+ local fullname=names[i]
+ if find(fullname,pattern) then
found[spec]=fullname
return fullname
- else
- break
+ end
+ end
+ local pattern=lower(pattern)
+ for i=1,#names do
+ local fullname=lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec]=fullname
+ return fullname
+ else
+ break
+ end
end
end
end
+ okay=notfound()
+ found[spec]=okay
end
- okay=notfound()
- found[spec]=okay
+ return okay
end
- return okay
end
-function resolvers.locators.tree(specification)
- local name=specification.filename
- local realname=resolveprefix(name)
- if realname and realname~='' and isdir(realname) then
- if trace_locating then
- report_trees("locator %a found",realname)
+do
+ local resolveprefix=resolvers.resolve
+ local appendhash=resolvers.appendhash
+ local function dolocate(specification)
+ local name=specification.filename
+ local realname=resolveprefix(name)
+ if realname and realname~='' and isdir(realname) then
+ if trace_locating then
+ report_trees("locator %a found",realname)
+ end
+ appendhash('tree',name,false)
+ elseif trace_locating then
+ report_trees("locator %a not found",name)
end
- resolvers.appendhash('tree',name,false)
- elseif trace_locating then
- report_trees("locator %a not found",name)
end
+ locators.tree=dolocate
+ locators.dirlist=dolocate
+ locators.dirfile=dolocate
end
-function resolvers.hashers.tree(specification)
- local name=specification.filename
- if trace_locating then
- report_trees("analyzing %a",name)
- end
- resolvers.methodhandler("hashers",name)
- resolvers.generators.file(specification)
-end
-local collectors={}
-local splitter=lpeg.splitat("/**/")
-local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
-table.setmetatableindex(collectors,function(t,k)
- local rootname=lpegmatch(stripper,k)
- local dataname=joinname(rootname,"dirlist")
- local content=caches.loadcontent(dataname,"files",dataname)
- if not content then
- content=resolvers.scanfiles(rootname,nil,nil,false,true)
- caches.savecontent(dataname,"files",content,dataname)
- end
- t[k]=content
- return content
-end)
-local function checked(root,p,n)
- if p then
- if type(p)=="table" then
- for i=1,#p do
- local fullname=joinname(root,p[i],n)
+do
+ local filegenerator=generators.file
+ generators.dirlist=filegenerator
+ generators.dirfile=filegenerator
+end
+do
+ local filegenerator=generators.file
+ local methodhandler=resolvers.methodhandler
+ local function dohash(specification)
+ local name=specification.filename
+ if trace_locating then
+ report_trees("analyzing %a",name)
+ end
+ methodhandler("hashers",name)
+ filegenerator(specification)
+ end
+ hashers.tree=dohash
+ hashers.dirlist=dohash
+ hashers.dirfile=dohash
+end
+local resolve do
+ local collectors={}
+ local splitter=lpeg.splitat("/**/")
+ local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
+ local loadcontent=caches.loadcontent
+ local savecontent=caches.savecontent
+ local notfound=finders.notfound
+ local scanfiles=resolvers.scanfiles
+ local lookup=resolvers.get_from_content
+ table.setmetatableindex(collectors,function(t,k)
+ local rootname=lpegmatch(stripper,k)
+ local dataname=joinname(rootname,"dirlist")
+ local content=loadcontent(dataname,"files",dataname)
+ if not content then
+ content=scanfiles(rootname,nil,nil,false,true)
+ savecontent(dataname,"files",content,dataname)
+ end
+ t[k]=content
+ return content
+ end)
+ local function checked(root,p,n)
+ if p then
+ if type(p)=="table" then
+ for i=1,#p do
+ local fullname=joinname(root,p[i],n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ else
+ local fullname=joinname(root,p,n)
if isfile(fullname) then
return fullname
end
end
- else
- local fullname=joinname(root,p,n)
- if isfile(fullname) then
- return fullname
- end
end
+ return notfound()
end
- return notfound()
-end
-local function resolve(specification)
- local filename=specification.filename
- if filename~="" then
- local root,rest=lpegmatch(splitter,filename)
- if root and rest then
- local path,name=dirname(rest),basename(rest)
- if name~=rest then
- local content=collectors[root]
- local p,n=lookup(content,name)
- if not p then
- return notfound()
- end
- local pattern=".*/"..path.."$"
- local istable=type(p)=="table"
- if istable then
- for i=1,#p do
- local pi=p[i]
- if pi==path or find(pi,pattern) then
- local fullname=joinname(root,pi,n)
- if isfile(fullname) then
- return fullname
+ resolve=function(specification)
+ local filename=specification.filename
+ if filename~="" then
+ local root,rest=lpegmatch(splitter,filename)
+ if root and rest then
+ local path,name=dirname(rest),basename(rest)
+ if name~=rest then
+ local content=collectors[root]
+ local p,n=lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern=".*/"..path.."$"
+ local istable=type(p)=="table"
+ if istable then
+ for i=1,#p do
+ local pi=p[i]
+ if pi==path or find(pi,pattern) then
+ local fullname=joinname(root,pi,n)
+ if isfile(fullname) then
+ return fullname
+ end
end
end
+ elseif p==path or find(p,pattern) then
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
end
- elseif p==path or find(p,pattern) then
- local fullname=joinname(root,p,n)
- if isfile(fullname) then
- return fullname
+ local queries=specification.queries
+ if queries and queries.option=="fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
end
end
- local queries=specification.queries
- if queries and queries.option=="fileonly" then
- return checked(root,p,n)
- else
- return notfound()
- end
+ end
+ local path=dirname(filename)
+ local name=basename(filename)
+ local root=lpegmatch(stripper,path)
+ local content=collectors[path]
+ local p,n=lookup(content,name)
+ if p then
+ return checked(root,p,n)
end
end
- local path,name=dirname(filename),basename(filename)
- local root=lpegmatch(stripper,path)
- local content=collectors[path]
- local p,n=lookup(content,name)
- if p then
- return checked(root,p,n)
+ return notfound()
+ end
+ finders.dirlist=resolve
+ function finders.dirfile(specification)
+ local queries=specification.queries
+ if queries then
+ queries.option="fileonly"
+ else
+ specification.queries={ option="fileonly" }
end
+ return resolve(specification)
end
- return notfound()
end
-resolvers.finders .dirlist=resolve
-resolvers.locators .dirlist=resolvers.locators .tree
-resolvers.hashers .dirlist=resolvers.hashers .tree
-resolvers.generators.dirlist=resolvers.generators.file
-resolvers.openers .dirlist=resolvers.openers .file
-resolvers.loaders .dirlist=resolvers.loaders .file
-function resolvers.finders.dirfile(specification)
- local queries=specification.queries
- if queries then
- queries.option="fileonly"
- else
- specification.queries={ option="fileonly" }
+do
+ local fileopener=openers.file
+ local fileloader=loaders.file
+ openers.dirlist=fileopener
+ loaders.dirlist=fileloader
+ openers.dirfile=fileopener
+ loaders.dirfile=fileloader
+end
+do
+ local hashfile="dirhash.lua"
+ local kind="HASH256"
+ local version=1.0
+ local loadtable=table.load
+ local savetable=table.save
+ local loaddata=io.loaddata
+ function resolvers.dirstatus(patterns)
+ local t=type(patterns)
+ if t=="string" then
+ patterns={ patterns }
+ elseif t~="table" then
+ return false
+ end
+ local status=loadtable(hashfile)
+ if not status or status.version~=version or status.kind~=kind then
+ status={
+ version=1.0,
+ kind=kind,
+ hashes={},
+ }
+ end
+ local hashes=status.hashes
+ local changed={}
+ local action=sha2[kind]
+ local update={}
+ for i=1,#patterns do
+ local pattern=patterns[i]
+ local files=globdir(pattern)
+ for i=1,#files do
+ local name=files[i]
+ local hash=action(loaddata(name))
+ if hashes[name]~=hash then
+ changed[#changed+1]=name
+ end
+ update[name]=hash
+ end
+ end
+ status.hashes=update
+ savetable(hashfile,status)
+ return #changed>0 and changed or false
end
- return resolve(specification)
end
-resolvers.locators .dirfile=resolvers.locators .dirlist
-resolvers.hashers .dirfile=resolvers.hashers .dirlist
-resolvers.generators.dirfile=resolvers.generators.dirlist
-resolvers.openers .dirfile=resolvers.openers .dirlist
-resolvers.loaders .dirfile=resolvers.loaders .dirlist
end -- of closure
@@ -24429,7 +25033,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-sch"] = package.loaded["data-sch"] or true
--- original size: 6753, stripped down to: 5268
+-- original size: 6945, stripped down to: 5408
if not modules then modules={} end modules ['data-sch']={
version=1.001,
@@ -24439,8 +25043,11 @@ if not modules then modules={} end modules ['data-sch']={
license="see context related readme files"
}
local load,tonumber=load,tonumber
-local gsub,concat,format=string.gsub,table.concat,string.format
+local gsub,format=string.gsub,string.format
+local sortedhash,concat=table.sortedhash,table.concat
local finders,openers,loaders=resolvers.finders,resolvers.openers,resolvers.loaders
+local addsuffix,suffix,splitbase=file.addsuffix,file.suffix,file.splitbase
+local md5hex=md5.hex
local trace_schemes=false trackers.register("resolvers.schemes",function(v) trace_schemes=v end)
local report_schemes=logs.reporter("resolvers","schemes")
local http=require("socket.http")
@@ -24457,7 +25064,7 @@ function cleaners.none(specification)
return specification.original
end
function cleaners.strip(specification)
- local path,name=file.splitbase(specification.original)
+ local path,name=splitbase(specification.original)
if path=="" then
return (gsub(name,"[^%a%d%.]+","-"))
else
@@ -24465,7 +25072,7 @@ function cleaners.strip(specification)
end
end
function cleaners.md5(specification)
- return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
+ return addsuffix(md5hex(specification.original),suffix(specification.path))
end
local cleaner=cleaners.strip
directives.register("schemes.cleanmethod",function(v) cleaner=cleaners[v] or cleaners.strip end)
@@ -24485,7 +25092,7 @@ local runner=sandbox.registerrunner {
name="curl resolver",
method="execute",
program="curl",
- template="--silent --insecure --create-dirs --output %cachename% %original%",
+ template='--silent --insecure --create-dirs --output "%cachename%" "%original%"',
checkers={
cachename="cache",
original="url",
@@ -24556,10 +25163,10 @@ end
schemes.install=install
local function http_handler(specification,cachename)
local tempname=cachename..".tmp"
- local f=io.open(tempname,"wb")
+ local handle=io.open(tempname,"wb")
local status,message=http.request {
url=specification.original,
- sink=ltn12.sink.file(f)
+ sink=ltn12.sink.file(handle)
}
if not status then
os.remove(tempname)
@@ -24574,13 +25181,13 @@ install('https')
install('ftp')
statistics.register("scheme handling time",function()
local l,r,nl,nr={},{},0,0
- for k,v in table.sortedhash(loaded) do
+ for k,v in sortedhash(loaded) do
if v>0 then
nl=nl+1
l[nl]=k..":"..v
end
end
- for k,v in table.sortedhash(reused) do
+ for k,v in sortedhash(reused) do
if v>0 then
nr=nr+1
r[nr]=k..":"..v
@@ -24588,10 +25195,10 @@ statistics.register("scheme handling time",function()
end
local n=nl+nr
if n>0 then
- l=nl>0 and concat(l) or "none"
- r=nr>0 and concat(r) or "none"
+ if nl==0 then l={ "none" } end
+ if nr==0 then r={ "none" } end
return format("%s seconds, %s processed, threshold %s seconds, loaded: %s, reused: %s",
- statistics.elapsedtime(schemes),n,threshold,l,r)
+ statistics.elapsedtime(schemes),n,threshold,concat(l," "),concat(l," "))
else
return nil
end
@@ -24624,7 +25231,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lua"] = package.loaded["data-lua"] or true
--- original size: 4207, stripped down to: 3041
+-- original size: 4227, stripped down to: 3049
if not modules then modules={} end modules ['data-lua']={
version=1.001,
@@ -24634,8 +25241,7 @@ if not modules then modules={} end modules ['data-lua']={
license="see context related readme files"
}
local package,lpeg=package,lpeg
-local gsub=string.gsub
-local concat=table.concat
+local loadfile=loadfile
local addsuffix=file.addsuffix
local P,S,Cs,lpegmatch=lpeg.P,lpeg.S,lpeg.Cs,lpeg.match
local luasuffixes={ 'tex','lua' }
@@ -24646,6 +25252,8 @@ local helpers=package.helpers or {}
local methods=helpers.methods or {}
local resolvers=resolvers
local resolveprefix=resolvers.resolve
+local expandedpaths=resolvers.expandedpathlistfromvariable
+local findfile=resolvers.findfile
helpers.report=logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries",function(v) helpers.trace=v end)
trackers.register("resolvers.locating",function(v) helpers.trace=v end)
@@ -24674,7 +25282,7 @@ local function getluaformatpaths()
if not luaformatpaths then
luaformatpaths={}
for i=1,#luaformats do
- registerpath("lua format","lua",luaformatpaths,resolvers.expandedpathlistfromvariable(luaformats[i]))
+ registerpath("lua format","lua",luaformatpaths,expandedpaths(luaformats[i]))
end
end
return luaformatpaths
@@ -24683,7 +25291,7 @@ local function getlibformatpaths()
if not libformatpaths then
libformatpaths={}
for i=1,#libformats do
- registerpath("lib format","lib",libformatpaths,resolvers.expandedpathlistfromvariable(libformats[i]))
+ registerpath("lib format","lib",libformatpaths,expandedpaths(libformats[i]))
end
end
return libformatpaths
@@ -24693,7 +25301,7 @@ local function loadedbyformat(name,rawname,suffixes,islib,what)
local report=helpers.report
for i=1,#suffixes do
local format=suffixes[i]
- local resolved=resolvers.findfile(name,format) or ""
+ local resolved=findfile(name,format) or ""
if trace then
report("%s format, identifying %a using format %a",what,name,format)
end
@@ -24731,7 +25339,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-aux"] = package.loaded["data-aux"] or true
--- original size: 2452, stripped down to: 1877
+-- original size: 2610, stripped down to: 2019
if not modules then modules={} end modules ['data-aux']={
version=1.001,
@@ -24742,24 +25350,28 @@ if not modules then modules={} end modules ['data-aux']={
}
local find=string.find
local type,next=type,next
+local addsuffix,removesuffix=file.addsuffix,file.removesuffix
+local loaddata,savedata=io.loaddata,io.savedata
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local resolvers=resolvers
+local cleanpath=resolvers.cleanpath
+local findfiles=resolvers.findfiles
local report_scripts=logs.reporter("resolvers","scripts")
function resolvers.updatescript(oldname,newname)
local scriptpath="context/lua"
- newname=file.addsuffix(newname,"lua")
- local oldscript=resolvers.cleanpath(oldname)
+ local oldscript=cleanpath(oldname)
+ local newname=addsuffix(newname,"lua")
+ local newscripts=findfiles(newname) or {}
if trace_locating then
report_scripts("to be replaced old script %a",oldscript)
end
- local newscripts=resolvers.findfiles(newname) or {}
if #newscripts==0 then
if trace_locating then
report_scripts("unable to locate new script")
end
else
for i=1,#newscripts do
- local newscript=resolvers.cleanpath(newscripts[i])
+ local newscript=cleanpath(newscripts[i])
if trace_locating then
report_scripts("checking new script %a",newscript)
end
@@ -24771,17 +25383,17 @@ function resolvers.updatescript(oldname,newname)
if trace_locating then
report_scripts("new script should come from %a",scriptpath)
end
- elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
+ elseif not (find(oldscript,removesuffix(newname).."$") or find(oldscript,newname.."$")) then
if trace_locating then
report_scripts("invalid new script name")
end
else
- local newdata=io.loaddata(newscript)
+ local newdata=loaddata(newscript)
if newdata then
if trace_locating then
report_scripts("old script content replaced by new content: %s",oldscript)
end
- io.savedata(oldscript,newdata)
+ savedata(oldscript,newdata)
break
elseif trace_locating then
report_scripts("unable to load new script")
@@ -24854,7 +25466,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lst"] = package.loaded["data-lst"] or true
--- original size: 1823, stripped down to: 1542
+-- original size: 2038, stripped down to: 1696
if not modules then modules={} end modules ['data-lst']={
version=1.001,
@@ -24864,15 +25476,22 @@ if not modules then modules={} end modules ['data-lst']={
license="see context related readme files"
}
local type=type
-local concat,sortedhash=table.concat,table.sortedhash
+local sortedhash=table.sortedhash
+local isdir=lfs.isdir
local resolvers=resolvers
local listers=resolvers.listers or {}
resolvers.listers=listers
local resolveprefix=resolvers.resolve
+local configurationfiles=resolvers.configurationfiles
+local expandedpathfromlist=resolvers.expandedpathfromlist
+local splitpath=resolvers.splitpath
+local knownvariables=resolvers.knownvariables
local report_lists=logs.reporter("resolvers","lists")
local report_resolved=logs.reporter("system","resolved")
local function tabstr(str)
- if type(str)=='table' then
+ if not str then
+ return "unset"
+ elseif type(str)=='table' then
return concat(str," | ")
else
return str
@@ -24882,22 +25501,22 @@ function listers.variables(pattern)
local result=resolvers.knownvariables(pattern)
for key,value in sortedhash(result) do
report_lists(key)
- report_lists(" env: %s",tabstr(value.environment or "unset"))
- report_lists(" var: %s",tabstr(value.variable or "unset"))
- report_lists(" exp: %s",tabstr(value.expansion or "unset"))
- report_lists(" res: %s",tabstr(value.resolved or "unset"))
+ report_lists(" env: %s",tabstr(value.environment))
+ report_lists(" var: %s",tabstr(value.variable))
+ report_lists(" exp: %s",tabstr(value.expansion))
+ report_lists(" res: %s",tabstr(value.resolved))
end
end
function listers.configurations()
- local configurations=resolvers.configurationfiles()
+ local configurations=configurationfiles()
for i=1,#configurations do
report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
- local list=resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
+ local list=expandedpathfromlist(splitpath(resolvers.luacnfspec))
for i=1,#list do
local li=resolveprefix(list[i])
- if lfs.isdir(li) then
+ if isdir(li) then
report_resolved("path - %s",li)
else
report_resolved("path + %s",li)
@@ -24910,318 +25529,147 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-package.loaded["util-lib"] = package.loaded["util-lib"] or true
+package.loaded["libs-ini"] = package.loaded["libs-ini"] or true
--- original size: 16094, stripped down to: 8443
+-- original size: 5822, stripped down to: 3629
-if not modules then modules={} end modules ['util-lib']={
+if not modules then modules={} end modules ['libs-ini']={
version=1.001,
comment="companion to luat-lib.mkiv",
author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files",
+ license="see context related readme files"
}
+local type,unpack=type,unpack
local type=type
-local next=next
-local pcall=pcall
-local gsub=string.gsub
-local find=string.find
-local sort=table.sort
-local pathpart=file.pathpart
local nameonly=file.nameonly
local joinfile=file.join
-local removesuffix=file.removesuffix
local addsuffix=file.addsuffix
-local findfile=resolvers.findfile
-local findfiles=resolvers.findfiles
-local expandpaths=resolvers.expandedpathlistfromvariable
local qualifiedpath=file.is_qualified_path
local isfile=lfs.isfile
-local done=false
-local function locate(required,version,trace,report,action)
- if type(required)~="string" then
- report("provide a proper library name")
- return
- end
- if trace then
- report("requiring library %a with version %a",required,version or "any")
- end
- local found_library=nil
- local required_full=gsub(required,"%.","/")
- local required_path=pathpart(required_full)
- local required_base=nameonly(required_full)
- if qualifiedpath(required) then
- if isfile(addsuffix(required,os.libsuffix)) then
- if trace then
- report("qualified name %a found",required)
+local findfile=resolvers.findfile
+local expandpaths=resolvers.expandedpathlistfromvariable
+local report=logs.reporter("resolvers","libraries")
+local trace=false
+trackers.register("resolvers.lib",function(v) trace=v end)
+local function findlib(required)
+ local suffix=os.libsuffix or "so"
+ if not qualifiedpath(required) then
+ local list=directives.value("system.librarynames" )
+ local only=nameonly(required)
+ if type(list)=="table" then
+ list=list[only]
+ if type(list)~="table" then
+ list={ only }
end
- found_library=required
else
- if trace then
- report("qualified name %a not found",required)
- end
+ list={ only }
end
- else
- local required_name=required_base.."."..os.libsuffix
- local version=type(version)=="string" and version~="" and version or false
- local engine="luatex"
- if trace and not done then
- local list=expandpaths("lib")
- for i=1,#list do
- report("tds path %i: %s",i,list[i])
- end
- end
- local function found(locate,asked_library,how,...)
- if trace then
- report("checking %s: %a",how,asked_library)
- end
- return locate(asked_library,...)
+ if trace then
+ report("using lookup list for library %a: % | t",only,list)
end
- local function check(locate,...)
- local found=nil
- if version then
- local asked_library=joinfile(required_path,version,required_name)
- if trace then
- report("checking %s: %a","with version",asked_library)
- end
- found=locate(asked_library,...)
+ for i=1,#list do
+ local name=list[i]
+ local found=findfile(name,"lib")
+ if not found then
+ found=findfile(addsuffix(name,suffix),"lib")
end
- if not found or found=="" then
- local asked_library=joinfile(required_path,required_name)
+ if found then
if trace then
- report("checking %s: %a","with version",asked_library)
+ report("library %a resolved via %a path to %a",name,"tds lib",found)
end
- found=locate(asked_library,...)
- end
- return found and found~="" and found or false
- end
- local function attempt(checkpattern)
- if trace then
- report("checking tds lib paths strictly")
- end
- local found=findfile and check(findfile,"lib")
- if found and (not checkpattern or find(found,checkpattern)) then
return found
end
- if trace then
- report("checking tds lib paths with wildcard")
- end
- local asked_library=joinfile(required_path,".*",required_name)
- if trace then
- report("checking %s: %a","latest version",asked_library)
- end
- local list=findfiles(asked_library,"lib",true)
- if list and #list>0 then
- sort(list)
- local found=list[#list]
- if found and (not checkpattern or find(found,checkpattern)) then
- return found
- end
- end
- if trace then
- report("checking lib paths")
- end
- package.extralibpath(environment.ownpath)
- local paths=package.libpaths()
- local pattern="/[^/]+%."..os.libsuffix.."$"
- for i=1,#paths do
- required_path=gsub(paths[i],pattern,"")
- local found=check(lfs.isfound)
- if type(found)=="string" and (not checkpattern or find(found,checkpattern)) then
- return found
- end
- end
- return false
end
- if engine then
- if trace then
- report("attemp 1, engine %a",engine)
- end
- found_library=attempt("/"..engine.."/")
- if not found_library then
- if trace then
- report("attemp 2, no engine",asked_library)
+ if expandpaths then
+ local list=expandpaths("PATH")
+ local base=addsuffix(only,suffix)
+ for i=1,#list do
+ local full=joinfile(list[i],base)
+ local found=isfile(full) and full
+ if found then
+ if trace then
+ report("library %a resolved via %a path to %a",name,"system",found)
+ end
+ return found
end
- found_library=attempt()
end
- else
- found_library=attempt()
end
- end
- if not found_library then
+ elseif isfile(addsuffix(required,suffix)) then
if trace then
- report("not found: %a",required)
+ report("library with qualified name %a %sfound",required,"")
end
- library=false
+ return required
else
if trace then
- report("found: %a",found_library)
- end
- local result,message=action(found_library,required_base)
- if result then
- library=result
- else
- library=false
- report("load error: message %a, library %a",tostring(message or "unknown"),found_library or "no library")
+ report("library with qualified name %a %sfound",required,"not ")
end
end
- if trace then
- if not library then
- report("unknown library: %a",required)
- else
- report("stored library: %a",required)
- end
- end
- return library or nil
+ return false
end
-do
- local report_swiglib=logs.reporter("swiglib")
- local trace_swiglib=false
- local savedrequire=require
- local loadedlibs={}
- local loadlib=package.loadlib
- local pushdir=dir.push
- local popdir=dir.pop
- trackers.register("resolvers.swiglib",function(v) trace_swiglib=v end)
- function requireswiglib(required,version)
- local library=loadedlibs[library]
- if library==nil then
- local trace_swiglib=trace_swiglib or package.helpers.trace
- library=locate(required,version,trace_swiglib,report_swiglib,function(name,base)
- pushdir(pathpart(name))
- local opener="luaopen_"..base
- if trace_swiglib then
- report_swiglib("opening: %a with %a",name,opener)
- end
- local library,message=loadlib(name,opener)
- local libtype=type(library)
- if libtype=="function" then
- library=library()
+local foundlibraries=table.setmetatableindex(function(t,k)
+ local v=findlib(k)
+ t[k]=v
+ return v
+end)
+function resolvers.findlib(required)
+ return foundlibraries[required]
+end
+local libraries={}
+resolvers.libraries=libraries
+local report=logs.reporter("optional")
+if optional then optional.loaded={} end
+function libraries.validoptional(name)
+ local thelib=optional and optional[name]
+ if not thelib then
+ elseif thelib.initialize then
+ return thelib
+ else
+ report("invalid optional library %a",libname)
+ end
+end
+function libraries.optionalloaded(name,libnames)
+ local thelib=optional and optional[name]
+ if not thelib then
+ report("no optional %a library found",name)
+ else
+ local thelib_initialize=thelib.initialize
+ if not thelib_initialize then
+ report("invalid optional library %a",name)
+ else
+ if type(libnames)=="string" then
+ libnames={ libnames }
+ end
+ if type(libnames)=="table" then
+ for i=1,#libnames do
+ local libname=libnames[i]
+ local filename=foundlibraries[libname]
+ if filename then
+ libnames[i]=filename
+ else
+ report("unable to locate library %a",libname)
+ return
+ end
+ end
+ local initialized=thelib_initialize(unpack(libnames))
+ if initialized then
+ report("using library '% + t'",libnames)
else
- report_swiglib("load error: %a returns %a, message %a, library %a",opener,libtype,(string.gsub(message or "no message","[%s]+$","")),found_library or "no library")
- library=false
+ report("unable to initialize library '% + t'",libnames)
end
- popdir()
- return library
- end)
- loadedlibs[required]=library or false
- end
- return library
- end
- function require(name,version)
- if find(name,"^swiglib%.") then
- return requireswiglib(name,version)
- else
- return savedrequire(name)
- end
- end
- local swiglibs={}
- local initializer="core"
- function swiglib(name,version)
- local library=swiglibs[name]
- if not library then
- statistics.starttiming(swiglibs)
- if trace_swiglib then
- report_swiglib("loading %a",name)
- end
- if not find(name,"%."..initializer.."$") then
- fullname="swiglib."..name.."."..initializer
- else
- fullname="swiglib."..name
+ return initialized
end
- library=requireswiglib(fullname,version)
- swiglibs[name]=library
- statistics.stoptiming(swiglibs)
end
- return library
end
- statistics.register("used swiglibs",function()
- if next(swiglibs) then
- return string.format("%s, initial load time %s seconds",table.concat(table.sortedkeys(swiglibs)," "),statistics.elapsedtime(swiglibs))
- end
- end)
end
if FFISUPPORTED and ffi and ffi.load then
- local report_ffilib=logs.reporter("ffilib")
- local trace_ffilib=false
- local savedffiload=ffi.load
- trackers.register("resolvers.ffilib",function(v) trace_ffilib=v end)
- local loaded={}
- local function locateindeed(name)
- name=removesuffix(name)
- local l=loaded[name]
- if l==nil then
- local state,library=pcall(savedffiload,name)
- if type(library)=="userdata" then
- l=library
- elseif type(state)=="userdata" then
- l=state
- else
- l=false
- end
- loaded[name]=l
- elseif trace_ffilib then
- report_ffilib("reusing already loaded %a",name)
- end
- return l
- end
- local function getlist(required)
- local list=directives.value("system.librarynames" )
- if type(list)=="table" then
- list=list[required]
- if type(list)=="table" then
- if trace then
- report("using lookup list for library %a: % | t",required,list)
- end
- return list
- end
- end
- return { required }
- end
- function ffilib(name,version)
- name=removesuffix(name)
- local l=loaded[name]
- if l~=nil then
- if trace_ffilib then
- report_ffilib("reusing already loaded %a",name)
- end
- return l
- end
- local list=getlist(name)
- if version=="system" then
- for i=1,#list do
- local library=locateindeed(list[i])
- if type(library)=="userdata" then
- return library
- end
- end
- else
- for i=1,#list do
- local library=locate(list[i],version,trace_ffilib,report_ffilib,locateindeed)
- if type(library)=="userdata" then
- return library
- end
- end
- end
- end
+ local ffiload=ffi.load
function ffi.load(name)
- local list=getlist(name)
- for i=1,#list do
- local library=ffilib(list[i])
- if type(library)=="userdata" then
- return library
- end
- end
- if trace_ffilib then
- report_ffilib("trying to load %a using normal loader",name)
- end
- for i=1,#list do
- local state,library=pcall(savedffiload,list[i])
- if type(library)=="userdata" then
- return library
- elseif type(state)=="userdata" then
- return library
- end
+ local full=name and foundlibraries[name]
+ if full then
+ return ffiload(full)
+ else
+ return ffiload(name)
end
end
end
@@ -25336,7 +25784,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 9637, stripped down to: 7253
+-- original size: 13964, stripped down to: 10026
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -25350,16 +25798,14 @@ local concat=table.concat
local quoted=string.quoted
local luasuffixes=utilities.lua.suffixes
local report_format=logs.reporter("resolvers","formats")
-local function primaryflags()
- local arguments=environment.arguments
+local function primaryflags(arguments)
local flags={}
if arguments.silent then
flags[#flags+1]="--interaction=batchmode"
end
return concat(flags," ")
end
-local function secondaryflags()
- local arguments=environment.arguments
+local function secondaryflags(arguments)
local trackers=arguments.trackers
local directives=arguments.directives
local flags={}
@@ -25381,6 +25827,9 @@ local function secondaryflags()
if arguments.ansi then
flags[#flags+1]="--c:ansi"
end
+ if arguments.ansilog then
+ flags[#flags+1]="--c:ansilog"
+ end
if arguments.strip then
flags[#flags+1]="--c:strip"
end
@@ -25391,12 +25840,13 @@ local function secondaryflags()
end
local template=[[--ini %primaryflags% --lua=%luafile% %texfile% %secondaryflags% %dump% %redirect%]]
local checkers={
- primaryflags="string",
- secondaryflags="string",
+ primaryflags="verbose",
+ secondaryflags="verbose",
luafile="readable",
texfile="readable",
redirect="string",
dump="string",
+ binarypath="string",
}
local runners={
luatex=sandbox.registerrunner {
@@ -25421,46 +25871,88 @@ local runners={
reporter=report_format,
},
}
-function environment.make_format(name,arguments)
+local function validbinarypath()
+ if not environment.arguments.nobinarypath then
+ local path=environment.ownpath or file.dirname(environment.ownname)
+ if path and path~="" then
+ path=dir.expandname(path)
+ if path~="" and lfs.isdir(path) then
+ return path
+ end
+ end
+ end
+end
+function environment.make_format(formatname)
+ local arguments=environment.arguments
local engine=environment.ownmain or "luatex"
- local silent=environment.arguments.silent
- local errors=environment.arguments.errors
- local olddir=dir.current()
- local path=caches.getwritablepath("formats",engine) or ""
- if path~="" then
- lfs.chdir(path)
- end
- report_format("using format path %a",dir.current())
- local texsourcename=file.addsuffix(name,"mkiv")
- local fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ local silent=arguments.silent
+ local errors=arguments.errors
+ local texsourcename=""
+ local texsourcepath=""
+ local fulltexsourcename=""
+ if engine=="luametatex" then
+ texsourcename=file.addsuffix(formatname,"mkxl")
+ fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ end
+ if fulltexsourcename=="" then
+ texsourcename=file.addsuffix(formatname,"mkiv")
+ fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ end
if fulltexsourcename=="" then
- texsourcename=file.addsuffix(name,"tex")
+ texsourcename=file.addsuffix(formatname,"tex")
fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
end
if fulltexsourcename=="" then
- report_format("no tex source file with name %a (mkiv or tex)",name)
- lfs.chdir(olddir)
+ report_format("no tex source file with name %a (mkiv or tex)",formatname)
return
- else
- report_format("using tex source file %a",fulltexsourcename)
end
- local texsourcepath=dir.expandname(file.dirname(fulltexsourcename))
- local specificationname=file.replacesuffix(fulltexsourcename,"lus")
- local fullspecificationname=resolvers.findfile(specificationname,"tex") or ""
- if fullspecificationname=="" then
- specificationname=file.join(texsourcepath,"context.lus")
- fullspecificationname=resolvers.findfile(specificationname,"tex") or ""
+ report_format("using tex source file %a",fulltexsourcename)
+ fulltexsourcename=dir.expandname(fulltexsourcename)
+ texsourcepath=file.dirname(fulltexsourcename)
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
end
+ local specificationname="context.lus"
+ local specificationpath=""
+ local fullspecificationname=resolvers.findfile(specificationname) or ""
if fullspecificationname=="" then
- report_format("unknown stub specification %a",specificationname)
- lfs.chdir(olddir)
+ report_format("unable to locate specification file %a",specificationname)
+ return
+ end
+ report_format("using specification file %a",fullspecificationname)
+ fullspecificationname=dir.expandname(fullspecificationname)
+ specificationpath=file.dirname(fullspecificationname)
+ if texsourcepath~=specificationpath then
+ report_format("tex source file and specification file are on different paths")
+ return
+ end
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
+ end
+ if not lfs.isfile(fullspecificationname) then
+ report_format("no accessible specification file with name %a",fulltexsourcename)
+ return
+ end
+ report_format("using tex source path %a",texsourcepath)
+ local validformatpath=caches.getwritablepath("formats",engine) or ""
+ local startupdir=dir.current()
+ if validformatpath=="" then
+ report_format("invalid format path, insufficient write access")
+ return
+ end
+ local binarypath=validbinarypath()
+ report_format("changing to format path %a",validformatpath)
+ lfs.chdir(validformatpath)
+ if dir.current()~=validformatpath then
+ report_format("unable to change to format path %a",validformatpath)
return
end
- local specificationpath=file.dirname(fullspecificationname)
local usedluastub=nil
local usedlualibs=dofile(fullspecificationname)
if type(usedlualibs)=="string" then
- usedluastub=file.join(file.dirname(fullspecificationname),usedlualibs)
+ usedluastub=file.join(specificationpath,usedlualibs)
elseif type(usedlualibs)=="table" then
report_format("using stub specification %a",fullspecificationname)
local texbasename=file.basename(name)
@@ -25477,48 +25969,57 @@ function environment.make_format(name,arguments)
end
else
report_format("invalid stub specification %a",fullspecificationname)
- lfs.chdir(olddir)
+ lfs.chdir(startupdir)
return
end
+ local runner=runners[engine]
+ if not runner then
+ report_format("the format %a cannot be generated, no runner available for engine %a",name,engine)
+ lfs.chdir(startupdir)
+ return
+ end
+ local primaryflags=primaryflags(arguments)
+ local secondaryflags=secondaryflags(arguments)
local specification={
- primaryflags=primaryflags(),
- secondaryflags=secondaryflags(),
+ binarypath=binarypath,
+ primaryflags=primaryflags,
+ secondaryflags=secondaryflags,
luafile=quoted(usedluastub),
texfile=quoted(fulltexsourcename),
dump=os.platform=="unix" and "\\\\dump" or "\\dump",
}
- local runner=runners[engine]
- if not runner then
- report_format("format %a cannot be generated, no runner available for engine %a",name,engine)
- elseif silent then
- statistics.starttiming()
+ if silent then
specification.redirect="> temp.log"
- local result=runner(specification)
- local runtime=statistics.stoptiming()
- if result~=0 then
- print(format("%s silent make > fatal error when making format %q",engine,name))
- else
- print(format("%s silent make > format %q made in %.3f seconds",engine,name,runtime))
- end
+ end
+ statistics.starttiming()
+ local result=runner(specification)
+ local runtime=statistics.stoptiming()
+ if silent then
os.remove("temp.log")
- else
- runner(specification)
end
- local pattern=file.removesuffix(file.basename(usedluastub)).."-*.mem"
- local mp=dir.glob(pattern)
- if mp then
- for i=1,#mp do
- local name=mp[i]
- report_format("removing related mplib format %a",file.basename(name))
- os.remove(name)
+ report_format()
+ if binarypath and binarypath~="" then
+ report_format("binary path : %s",binarypath or "?")
end
- end
- lfs.chdir(olddir)
+ report_format("format path : %s",validformatpath)
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",usedluastub)
+ if primaryflags~="" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags~="" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("context file : %s",fulltexsourcename)
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result==0 and "okay" or "error")
+ report_format()
+ lfs.chdir(startupdir)
end
-local template=[[%flags% --fmt=%fmtfile% --lua=%luafile% %texfile% %more%]]
+local template=[[%primaryflags% --fmt=%fmtfile% --lua=%luafile% %texfile% %secondaryflags%]]
local checkers={
- flags="string",
- more="string",
+ primaryflags="verbose",
+ secondaryflags="verbose",
fmtfile="readable",
luafile="readable",
texfile="readable",
@@ -25531,6 +26032,13 @@ local runners={
checkers=checkers,
reporter=report_format,
},
+ luametatex=sandbox.registerrunner {
+ name="run luametatex format",
+ program="luametatex",
+ template=template,
+ checkers=checkers,
+ reporter=report_format,
+ },
luajittex=sandbox.registerrunner {
name="run luajittex format",
program="luajittex",
@@ -25539,51 +26047,78 @@ local runners={
reporter=report_format,
},
}
-function environment.run_format(name,data,more)
- if name and name~="" then
- local engine=environment.ownmain or "luatex"
- local barename=file.removesuffix(name)
- local fmtname=caches.getfirstreadablefile(file.addsuffix(barename,"fmt"),"formats",engine)
- if fmtname=="" then
- fmtname=resolvers.findfile(file.addsuffix(barename,"fmt")) or ""
- end
- fmtname=resolvers.cleanpath(fmtname)
- if fmtname=="" then
- report_format("no format with name %a",name)
- else
- local barename=file.removesuffix(name)
- local luaname=file.addsuffix(barename,"luc")
- if not lfs.isfile(luaname) then
- luaname=file.addsuffix(barename,"lua")
- end
- if not lfs.isfile(luaname) then
- report_format("using format name %a",fmtname)
- report_format("no luc/lua file with name %a",barename)
- else
- local runner=runners[engine]
- if not runner then
- report_format("format %a cannot be run, no runner available for engine %a",name,engine)
- else
- runner {
- flags=primaryflags(),
- fmtfile=quoted(barename),
- luafile=quoted(luaname),
- texfile=quoted(data),
- more=more,
- }
- end
- end
- end
+function environment.run_format(formatname,scriptname,filename,primaryflags,secondaryflags,verbose)
+ local engine=environment.ownmain or "luatex"
+ if not formatname or formatname=="" then
+ report_format("missing format name")
+ return
+ end
+ if not scriptname or scriptname=="" then
+ report_format("missing script name")
+ return
+ end
+ if not lfs.isfile(formatname) or not lfs.isfile(scriptname) then
+ formatname,scriptname=resolvers.locateformat(formatname)
end
+ if not formatname or formatname=="" then
+ report_format("invalid format name")
+ return
+ end
+ if not scriptname or scriptname=="" then
+ report_format("invalid script name")
+ return
+ end
+ local runner=runners[engine]
+ if not runner then
+ report_format("format %a cannot be run, no runner available for engine %a",file.nameonly(name),engine)
+ return
+ end
+ if not filename then
+ filename ""
+ end
+ local binarypath=validbinarypath()
+ local specification={
+ binarypath=binarypath,
+ primaryflags=primaryflags or "",
+ secondaryflags=secondaryflags or "",
+ fmtfile=quoted(formatname),
+ luafile=quoted(scriptname),
+ texfile=filename~="" and quoted(filename) or "",
+ }
+ statistics.starttiming()
+ local result=runner(specification)
+ local runtime=statistics.stoptiming()
+ if verbose then
+ report_format()
+ if binarypath and binarypath~="" then
+ report_format("binary path : %s",binarypath)
+ end
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",scriptname)
+ report_format("tex format file : %s",formatname)
+ if filename~="" then
+ report_format("tex input file : %s",filename)
+ end
+ if primaryflags~="" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags~="" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result==0 and "okay" or "error")
+ report_format()
+ end
+ return result
end
end -- of closure
--- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
+-- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua libs-ini.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 1019480
--- stripped bytes : 403728
+-- original bytes : 1038245
+-- stripped bytes : 409841
-- end library merge
@@ -25697,7 +26232,7 @@ local ownlibs = { -- order can be made better
'data-tmf.lua',
'data-lst.lua',
- 'util-lib.lua', -- swiglib
+ 'libs-ini.lua',
'luat-sta.lua',
'luat-fmt.lua',
@@ -25846,7 +26381,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
- <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -25865,6 +26400,7 @@ local helpinfo = [[
<flag name="stubpath" value="binpath"><short>paths where stubs wil be written</short></flag>
<flag name="windows"><short>create windows (mswin) stubs</short></flag>
<flag name="unix"><short>create unix (linux) stubs</short></flag>
+ <flag name="addbinarypath"><short>prepend the (found) binarypath to runners</short></flag>
</subcategory>
<subcategory>
<flag name="verbose"><short>give a bit more info</short></flag>
@@ -26086,8 +26622,7 @@ end
report()
io.flush()
end
- -- no os.exec because otherwise we get the wrong return value
- local code = os.execute(command) -- maybe spawn
+ local code = os.execute(command)
if code == 0 then
return true
else
@@ -26130,7 +26665,7 @@ function runners.execute_program(fullname)
report()
report()
io.flush()
- local code = os.exec(command) -- (fullname,unpack(after)) does not work / maybe spawn
+ local code = os.execute(command)
return code == 0
end
end
@@ -26517,16 +27052,22 @@ function runners.associate(filename)
end
function runners.evaluate(code,filename) -- for Luigi
+ local environment = table.setmetatableindex(_G)
if code == "loop" then
while true do
- io.write("> ")
+ io.write("lua > ")
local code = io.read()
- if code ~= "" then
+ if code == "quit" or code == "exit" then
+ break
+ elseif code ~= "" then
local temp = string.match(code,"^= (.*)$")
if temp then
- code = "print("..temp..")"
+ code = "inspect("..temp..")"
+ end
+ local compiled, message = load(code,"console","t",environment)
+ if type(compiled) ~= "function" then
+ compiled = load("inspect("..code..")","console","t",environment)
end
- local compiled, message = loadstring(code)
if type(compiled) ~= "function" then
io.write("! " .. (message or code).."\n")
else
@@ -26539,7 +27080,10 @@ function runners.evaluate(code,filename) -- for Luigi
code = filename
end
if code ~= "" then
- local compiled, message = loadstring(code)
+ local compiled, message = load(code,"console","t",environment)
+ if type(compiled) ~= "function" then
+ compiled = load("inspect("..code..")","console","t",environment)
+ end
if type(compiled) ~= "function" then
io.write("invalid lua code: " .. (message or code))
return
@@ -26716,17 +27260,17 @@ do
end
-if e_argument("ansi") then
+-- if e_argument("ansi") or e_argument("ansilog") then
- logs.setformatters("ansi")
+-- logs.setformatters(e_argument("ansi") and "ansi" or "ansilog")
- local script = e_argument("script") or e_argument("scripts")
+-- -- local script = e_argument("script") or e_argument("scripts")
+-- --
+-- -- if type(script) == "string" then
+-- -- logs.writer("]0;"..script.."") -- for Alan to test
+-- -- end
- if type(script) == "string" then
- logs.writer("]0;"..script.."") -- for Alan to test
- end
-
-end
+-- end
if e_argument("script") or e_argument("scripts") then
@@ -26975,11 +27519,11 @@ elseif e_argument("format-path") then
resolvers.load()
report(caches.getwritablepath("format"))
-elseif e_argument("pattern") then
-
- -- luatools
-
- runners.execute_ctx_script("mtx-base","--pattern='" .. e_argument("pattern") .. "'",filename)
+-- elseif e_argument("pattern") then
+--
+-- -- luatools
+--
+-- runners.execute_ctx_script("mtx-base","--pattern='" .. e_argument("pattern") .. "'",filename)
elseif e_argument("generate") then
diff --git a/Master/bin/win32/mtxrun.lua b/Master/bin/win32/mtxrun.lua
index 98fe7f752e3..5907fa33c66 100755
--- a/Master/bin/win32/mtxrun.lua
+++ b/Master/bin/win32/mtxrun.lua
@@ -194,7 +194,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 6330, stripped down to: 2831
+-- original size: 6529, stripped down to: 2933
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -313,6 +313,9 @@ elseif not ffi.number then
end
if LUAVERSION>5.3 then
end
+if status and os.setenv then
+ os.setenv("engine",string.lower(status.luatex_engine or "unknown"))
+end
end -- of closure
@@ -321,7 +324,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-macro"] = package.loaded["l-macro"] or true
--- original size: 10131, stripped down to: 5991
+-- original size: 10130, stripped down to: 5990
if not modules then modules={} end modules ['l-macros']={
version=1.001,
@@ -546,7 +549,7 @@ end
macros.loaded=loaded
function required(name,trace)
local filename=file.addsuffix(name,"lua")
- local fullname=resolvers and resolvers.find_file(filename) or filename
+ local fullname=resolvers and resolvers.findfile(filename) or filename
if not fullname or fullname=="" then
return false
end
@@ -576,7 +579,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-sandbox"] = package.loaded["l-sandbox"] or true
--- original size: 9747, stripped down to: 6313
+-- original size: 9604, stripped down to: 6394
if not modules then modules={} end modules ['l-sandbox']={
version=1.001,
@@ -808,6 +811,9 @@ local function supported(library)
return l
end
loadfile=register(loadfile,"loadfile")
+if supported("lua") then
+ lua.openfile=register(lua.openfile,"lua.openfile")
+end
if supported("io") then
io.open=register(io.open,"io.open")
io.popen=register(io.popen,"io.popen")
@@ -1168,7 +1174,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true
--- original size: 38434, stripped down to: 19310
+-- original size: 38440, stripped down to: 19316
if not modules then modules={} end modules ['l-lpeg']={
version=1.001,
@@ -1337,7 +1343,7 @@ patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+unders
patterns.somecontent=(anything-newline-space)^1
patterns.beginline=#(1-newline)
patterns.longtostring=Cs(whitespace^0/""*((patterns.quoted+nonwhitespace^1+whitespace^1/""*(endofstring+Cc(" ")))^0))
-function anywhere(pattern)
+local function anywhere(pattern)
return (1-P(pattern))^0*P(pattern)
end
lpeg.anywhere=anywhere
@@ -1967,7 +1973,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-string"] = package.loaded["l-string"] or true
--- original size: 6461, stripped down to: 3255
+-- original size: 6644, stripped down to: 3410
if not modules then modules={} end modules ['l-string']={
version=1.001,
@@ -2031,9 +2037,11 @@ function string.is_empty(str)
end
end
local anything=patterns.anything
-local allescapes=Cc("%")*S(".-+%?()[]*")
-local someescapes=Cc("%")*S(".-+%()[]")
-local matchescapes=Cc(".")*S("*?")
+local moreescapes=Cc("%")*S(".-+%?()[]*$^{}")
+local allescapes=Cc("%")*S(".-+%?()[]*")
+local someescapes=Cc("%")*S(".-+%()[]")
+local matchescapes=Cc(".")*S("*?")
+local pattern_m=Cs ((moreescapes+anything )^0 )
local pattern_a=Cs ((allescapes+anything )^0 )
local pattern_b=Cs ((someescapes+matchescapes+anything )^0 )
local pattern_c=Cs (Cc("^")*(someescapes+matchescapes+anything )^0*Cc("$") )
@@ -2043,6 +2051,8 @@ end
function string.topattern(str,lowercase,strict)
if str=="" or type(str)~="string" then
return ".*"
+ elseif strict=="all" then
+ str=lpegmatch(pattern_m,str)
elseif strict then
str=lpegmatch(pattern_c,str)
else
@@ -2092,7 +2102,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-table"] = package.loaded["l-table"] or true
--- original size: 41332, stripped down to: 21508
+-- original size: 41758, stripped down to: 22643
if not modules then modules={} end modules ['l-table']={
version=1.001,
@@ -2101,7 +2111,7 @@ if not modules then modules={} end modules ['l-table']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local type,next,tostring,tonumber,select=type,next,tostring,tonumber,select
+local type,next,tostring,tonumber,select,rawget=type,next,tostring,tonumber,select,rawget
local table,string=table,string
local concat,sort=table.concat,table.sort
local format,lower,dump=string.format,string.lower,string.dump
@@ -2435,13 +2445,13 @@ function table.fromhash(t)
end
return hsh
end
-local noquotes,hexify,handle,compact,inline,functions,metacheck
+local noquotes,hexify,handle,compact,inline,functions,metacheck,accurate
local reserved=table.tohash {
'and','break','do','else','elseif','end','false','for','function','if',
'in','local','nil','not','or','repeat','return','then','true','until','while',
- 'NaN','goto',
+ 'NaN','goto','const',
}
-local function is_simple_table(t,hexify)
+local function is_simple_table(t,hexify,accurate)
local nt=#t
if nt>0 then
local n=0
@@ -2460,6 +2470,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i]=format("0x%X",v)
+ elseif accurate then
+ tt[i]=format("%q",v)
else
tt[i]=v
end
@@ -2480,6 +2492,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i+1]=format("0x%X",v)
+ elseif accurate then
+ tt[i+1]=format("%q",v)
else
tt[i+1]=v
end
@@ -2551,6 +2565,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tv=="number" then
if hexify then
handle(format("%s 0x%X,",depth,v))
+ elseif accurate then
+ handle(format("%s %q,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -2560,7 +2576,7 @@ local function do_serialize(root,name,depth,level,indexed)
if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
handle(format("%s { %s },",depth,concat(st,", ")))
else
@@ -2588,12 +2604,16 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
@@ -2601,12 +2621,16 @@ local function do_serialize(root,name,depth,level,indexed)
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
handle(format("%s %s=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s %s=%q,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
handle(format("%s [%q]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -2615,6 +2639,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -2631,6 +2657,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={},",depth,k))
+ elseif accurate then
+ handle(format("%s [%q]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -2643,11 +2671,13 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s [%q]={},",depth,k))
end
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
+ elseif accurate then
+ handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -2669,6 +2699,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
+ elseif accurate then
+ handle(format("%s [%q]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -2688,6 +2720,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=load(%q),",depth,k,f))
+ elseif accurate then
+ handle(format("%s [%q]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -2705,6 +2739,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -2728,6 +2764,7 @@ local function serialize(_handle,root,name,specification)
if type(specification)=="table" then
noquotes=specification.noquotes
hexify=specification.hexify
+ accurate=specification.accurate
handle=_handle or specification.handle or print
functions=specification.functions
compact=specification.compact
@@ -3043,7 +3080,7 @@ end
local function sequenced(t,sep,simple)
if not t then
return ""
- elseif type(t)=="string" then
+ elseif type(t)~="table" then
return t
end
local n=#t
@@ -3082,7 +3119,11 @@ local function sequenced(t,sep,simple)
end
end
end
- return concat(s,sep or " | ")
+ if sep==true then
+ return "{ "..concat(s,", ").." }"
+ else
+ return concat(s,sep or " | ")
+ end
end
table.sequenced=sequenced
function table.print(t,...)
@@ -3213,7 +3254,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-io"] = package.loaded["l-io"] or true
--- original size: 11823, stripped down to: 6325
+-- original size: 11829, stripped down to: 6331
if not modules then modules={} end modules ['l-io']={
version=1.001,
@@ -3227,7 +3268,7 @@ local open,flush,write,read=io.open,io.flush,io.write,io.read
local byte,find,gsub,format=string.byte,string.find,string.gsub,string.format
local concat=table.concat
local type=type
-if string.find(os.getenv("PATH"),";",1,true) then
+if string.find(os.getenv("PATH") or "",";",1,true) then
io.fileseparator,io.pathseparator="\\",";"
else
io.fileseparator,io.pathseparator="/",":"
@@ -3765,7 +3806,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 18916, stripped down to: 10126
+-- original size: 19102, stripped down to: 10192
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -3779,7 +3820,7 @@ local date,time=os.date,os.time
local find,format,gsub,upper,gmatch=string.find,string.format,string.gsub,string.upper,string.gmatch
local concat=table.concat
local random,ceil,randomseed=math.random,math.ceil,math.randomseed
-local rawget,rawset,type,getmetatable,setmetatable,tonumber,tostring=rawget,rawset,type,getmetatable,setmetatable,tonumber,tostring
+local type,setmetatable,tonumber,tostring=type,setmetatable,tonumber,tostring
do
local selfdir=os.selfdir
if selfdir=="" then
@@ -3930,7 +3971,8 @@ local launchers={
unix="xdg-open %s &> /dev/null &",
}
function os.launch(str)
- execute(format(launchers[os.name] or launchers.unix,str))
+ local command=format(launchers[os.name] or launchers.unix,str)
+ execute(command)
end
local gettimeofday=os.gettimeofday or os.clock
os.gettimeofday=gettimeofday
@@ -4185,6 +4227,12 @@ function os.validdate(year,month,day)
end
return year,month,day
end
+function os.date(fmt,...)
+ if not fmt then
+ fmt="%Y-%m-%d %H:%M"
+ end
+ return date(fmt,...)
+end
local osexit=os.exit
local exitcode=nil
function os.setexitcode(code)
@@ -4207,7 +4255,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 21984, stripped down to: 10148
+-- original size: 22175, stripped down to: 10302
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -4229,15 +4277,24 @@ local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
local attributes=lfs.attributes
function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
+ if name then
+ return attributes(name,"mode")=="directory"
+ end
end
function lfs.isfile(name)
- local a=attributes(name,"mode")
- return a=="file" or a=="link" or nil
+ if name then
+ local a=attributes(name,"mode")
+ return a=="file" or a=="link" or nil
+ end
end
function lfs.isfound(name)
- local a=attributes(name,"mode")
- return (a=="file" or a=="link") and name or nil
+ if name then
+ local a=attributes(name,"mode")
+ return (a=="file" or a=="link") and name or nil
+ end
+end
+function lfs.modification(name)
+ return name and attributes(name,"modification") or nil
end
if sandbox then
sandbox.redefine(lfs.isfile,"lfs.isfile")
@@ -4616,7 +4673,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-gzip"] = package.loaded["l-gzip"] or true
--- original size: 1211, stripped down to: 951
+-- original size: 5115, stripped down to: 1699
if not modules then modules={} end modules ['l-gzip']={
version=1.001,
@@ -4624,43 +4681,75 @@ if not modules then modules={} end modules ['l-gzip']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-if not gzip then
- return
-end
-local suffix,suffixes=file.suffix,file.suffixes
-function gzip.load(filename)
- local f=io.open(filename,"rb")
- if not f then
- elseif suffix(filename)=="gz" then
- f:close()
- local g=gzip.open(filename,"rb")
- if g then
- local str=g:read("*all")
- g:close()
- return str
+gzip=gzip or {}
+if not zlib then
+ zlib=xzip
+elseif not xzip then
+ xzip=zlib
+end
+if zlib then
+ local suffix=file.suffix
+ local suffixes=file.suffixes
+ local find=string.find
+ local openfile=io.open
+ local gzipwindow=15+16
+ local gziplevel=3
+ local identifier="^\x1F\x8B\x08"
+ local compress=zlib.compress
+ local decompress=zlib.decompress
+ function gzip.load(filename)
+ local f=openfile(filename,"rb")
+ if not f then
+ else
+ local data=f:read("*all")
+ f:close()
+ if data and data~="" then
+ if suffix(filename)=="gz" then
+ data=decompress(data,gzipwindow)
+ end
+ return data
+ end
end
- else
- local str=f:read("*all")
- f:close()
- return str
end
-end
-function gzip.save(filename,data)
- if suffix(filename)~="gz" then
- filename=filename..".gz"
+ function gzip.save(filename,data,level)
+ if suffix(filename)~="gz" then
+ filename=filename..".gz"
+ end
+ local f=openfile(filename,"wb")
+ if f then
+ data=compress(data or "",level or gziplevel,nil,gzipwindow)
+ f:write(data)
+ f:close()
+ return #data
+ end
end
- local f=io.open(filename,"wb")
- if f then
- local s=zlib.compress(data or "",9,nil,15+16)
- f:write(s)
- f:close()
- return #s
+ function gzip.suffix(filename)
+ local suffix,extra=suffixes(filename)
+ local gzipped=extra=="gz"
+ return suffix,gzipped
+ end
+ function gzip.compressed(s)
+ return s and find(s,identifier)
+ end
+ function gzip.compress(s,level)
+ if s and not find(s,identifier) then
+ if not level then
+ level=gziplevel
+ elseif level<=0 then
+ return s
+ elseif level>9 then
+ level=9
+ end
+ return compress(s,level or gziplevel,nil,gzipwindow) or s
+ end
+ end
+ function gzip.decompress(s)
+ if s and find(s,identifier) then
+ return decompress(s,gzipwindow)
+ else
+ return s
+ end
end
-end
-function gzip.suffix(filename)
- local suffix,extra=suffixes(filename)
- local gzipped=extra=="gz"
- return suffix,gzipped
end
@@ -4670,7 +4759,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-md5"] = package.loaded["l-md5"] or true
--- original size: 3309, stripped down to: 2218
+-- original size: 3414, stripped down to: 2307
if not modules then modules={} end modules ['l-md5']={
version=1.001,
@@ -4689,6 +4778,8 @@ if not md5 then
end
local md5,file=md5,file
local gsub=string.gsub
+local modification,isfile,touch=lfs.modification,lfs.isfile,lfs.touch
+local loaddata,savedata=io.loaddata,io.savedata
do
local patterns=lpeg and lpeg.patterns
if patterns then
@@ -4704,10 +4795,11 @@ do
md5.sumHEXA=md5.HEX
end
end
+local md5HEX=md5.HEX
function file.needsupdating(oldname,newname,threshold)
- local oldtime=lfs.attributes(oldname,"modification")
+ local oldtime=modification(oldname)
if oldtime then
- local newtime=lfs.attributes(newname,"modification")
+ local newtime=modification(newname)
if not newtime then
return true
elseif newtime>=oldtime then
@@ -4723,31 +4815,32 @@ function file.needsupdating(oldname,newname,threshold)
end
file.needs_updating=file.needsupdating
function file.syncmtimes(oldname,newname)
- local oldtime=lfs.attributes(oldname,"modification")
- if oldtime and lfs.isfile(newname) then
- lfs.touch(newname,oldtime,oldtime)
+ local oldtime=modification(oldname)
+ if oldtime and isfile(newname) then
+ touch(newname,oldtime,oldtime)
end
end
-function file.checksum(name)
+local function checksum(name)
if md5 then
- local data=io.loaddata(name)
+ local data=loaddata(name)
if data then
- return md5.HEX(data)
+ return md5HEX(data)
end
end
return nil
end
+file.checksum=checksum
function file.loadchecksum(name)
if md5 then
- local data=io.loaddata(name..".md5")
+ local data=loaddata(name..".md5")
return data and (gsub(data,"%s",""))
end
return nil
end
function file.savechecksum(name,checksum)
- if not checksum then checksum=file.checksum(name) end
+ if not checksum then checksum=checksum(name) end
if checksum then
- io.savedata(name..".md5",checksum)
+ savedata(name..".md5",checksum)
return checksum
end
return nil
@@ -5636,7 +5729,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-unicode"] = package.loaded["l-unicode"] or true
--- original size: 41047, stripped down to: 17171
+-- original size: 41281, stripped down to: 17261
if not modules then modules={} end modules ['l-unicode']={
version=1.001,
@@ -6151,49 +6244,52 @@ end
function utf.utf32_to_utf8_t(t,endian)
return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(b)
- if b<0x10000 then
- return char(b%256,rshift(b,8))
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+if bit32 then
+ local rshift=bit32.rshift
+ local function little(b)
+ if b<0x10000 then
+ return char(b%256,rshift(b,8))
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+ end
end
-end
-local function big(b)
- if b<0x10000 then
- return char(rshift(b,8),b%256)
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ local function big(b)
+ if b<0x10000 then
+ return char(rshift(b,8),b%256)
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ end
end
-end
-local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
-local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
-local function utf8_to_utf16_be(str,nobom)
- if nobom then
- return lpegmatch(b_remap,str)
- else
- return char(254,255)..lpegmatch(b_remap,str)
+ local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+ local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+ local function utf8_to_utf16_be(str,nobom)
+ if nobom then
+ return lpegmatch(b_remap,str)
+ else
+ return char(254,255)..lpegmatch(b_remap,str)
+ end
end
-end
-local function utf8_to_utf16_le(str,nobom)
- if nobom then
- return lpegmatch(l_remap,str)
- else
- return char(255,254)..lpegmatch(l_remap,str)
+ local function utf8_to_utf16_le(str,nobom)
+ if nobom then
+ return lpegmatch(l_remap,str)
+ else
+ return char(255,254)..lpegmatch(l_remap,str)
+ end
end
-end
-utf.utf8_to_utf16_be=utf8_to_utf16_be
-utf.utf8_to_utf16_le=utf8_to_utf16_le
-function utf.utf8_to_utf16(str,littleendian,nobom)
- if littleendian then
- return utf8_to_utf16_le(str,nobom)
- else
- return utf8_to_utf16_be(str,nobom)
+ utf.utf8_to_utf16_be=utf8_to_utf16_be
+ utf.utf8_to_utf16_le=utf8_to_utf16_le
+ function utf.utf8_to_utf16(str,littleendian,nobom)
+ if littleendian then
+ return utf8_to_utf16_le(str,nobom)
+ else
+ return utf8_to_utf16_be(str,nobom)
+ end
end
end
local pattern=Cs (
@@ -6467,7 +6563,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 43488, stripped down to: 21595
+-- original size: 45188, stripped down to: 22734
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -6797,6 +6893,13 @@ local template=[[
%s
return function(%s) return %s end
]]
+local pattern=Cs(Cc('"')*(
+ (1-S('"\\\n\r'))^1+P('"')/'\\"'+P('\\')/'\\\\'+P('\n')/'\\n'+P('\r')/'\\r'
+)^0*Cc('"'))
+patterns.escapedquotes=pattern
+function string.escapedquotes(s)
+ return lpegmatch(pattern,s)
+end
local preamble=""
local environment={
global=global or _G,
@@ -6821,9 +6924,10 @@ local environment={
formattednumber=number.formatted,
sparseexponent=number.sparseexponent,
formattedfloat=number.formattedfloat,
- stripzero=lpeg.patterns.stripzero,
- stripzeros=lpeg.patterns.stripzeros,
- FORMAT=string.f9,
+ stripzero=patterns.stripzero,
+ stripzeros=patterns.stripzeros,
+ escapedquotes=string.escapedquotes,
+ FORMAT=string.f6,
}
local arguments={ "a1" }
setmetatable(arguments,{ __index=function(t,k)
@@ -6874,13 +6978,16 @@ local format_left=function(f)
return format("a%s..utfpadding(a%s,%i)",n,n,-f)
end
end
-local format_q=function()
+local format_q=JITSUPPORTED and function()
n=n+1
return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n)
+end or function()
+ n=n+1
+ return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n)
end
local format_Q=function()
n=n+1
- return format("format('%%q',tostring(a%s))",n)
+ return format("escapedquotes(tostring(a%s))",n)
end
local format_i=function(f)
n=n+1
@@ -7031,12 +7138,25 @@ local format_n=function()
n=n+1
return format("((a%s %% 1 == 0) and format('%%i',a%s) or tostring(a%s))",n,n,n)
end
-local format_N=function(f)
- n=n+1
- if not f or f=="" then
- f=".9"
- end
- return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+local format_N if environment.FORMAT then
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ return format("FORMAT(a%s,'%%.9f')",n)
+ elseif f==".6" or f=="0.6" then
+ return format("FORMAT(a%s)",n)
+ else
+ return format("FORMAT(a%s,'%%%sf')",n,f)
+ end
+ end
+else
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ f=".9"
+ end
+ return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+ end
end
local format_a=function(f)
n=n+1
@@ -7265,9 +7385,9 @@ patterns.xmlescape=Cs((P("<")/"&lt;"+P(">")/"&gt;"+P("&")/"&amp;"+P('"')/"&quot;
patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+anything)^0)
patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0)
patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"'))
-add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=lpeg.patterns.xmlescape })
-add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
-add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
+add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=patterns.xmlescape })
+add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=patterns.texescape })
+add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=patterns.luaescape })
local dquote=patterns.dquote
local equote=patterns.escaped+dquote/'\\"'+1
local cquote=Cc('"')
@@ -7299,6 +7419,27 @@ local f_16_16=formatters["%0.5N"]
function number.to16dot16(n)
return f_16_16(n/65536.0)
end
+if not string.explode then
+ local tsplitat=lpeg.tsplitat
+ local p_utf=patterns.utf8character
+ local p_check=C(p_utf)*(P("+")*Cc(true))^0
+ local p_split=Ct(C(p_utf)^0)
+ local p_space=Ct((C(1-P(" ")^1)+P(" ")^1)^0)
+ function string.explode(str,symbol)
+ if symbol=="" then
+ return lpegmatch(p_split,str)
+ elseif symbol then
+ local a,b=lpegmatch(p_check,symbol)
+ if b then
+ return lpegmatch(tsplitat(P(a)^1),str)
+ else
+ return lpegmatch(tsplitat(a),str)
+ end
+ else
+ return lpegmatch(p_space,str)
+ end
+ end
+end
end -- of closure
@@ -7307,7 +7448,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 28866, stripped down to: 16134
+-- original size: 32649, stripped down to: 18257
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -7544,78 +7685,160 @@ function tables.encapsulate(core,capsule,protect)
} )
end
end
-local f_hashed_string=formatters["[%q]=%q,"]
-local f_hashed_number=formatters["[%q]=%s,"]
-local f_hashed_boolean=formatters["[%q]=%l,"]
-local f_hashed_table=formatters["[%q]="]
-local f_indexed_string=formatters["[%s]=%q,"]
-local f_indexed_number=formatters["[%s]=%s,"]
-local f_indexed_boolean=formatters["[%s]=%l,"]
-local f_indexed_table=formatters["[%s]="]
-local f_ordered_string=formatters["%q,"]
-local f_ordered_number=formatters["%s,"]
-local f_ordered_boolean=formatters["%l,"]
-function table.fastserialize(t,prefix)
- local r={ type(prefix)=="string" and prefix or "return" }
- local m=1
- local function fastserialize(t,outer)
- local n=#t
- m=m+1
- r[m]="{"
- if n>0 then
- for i=0,n do
- local v=t[i]
- local tv=type(v)
- if tv=="string" then
- m=m+1 r[m]=f_ordered_string(v)
- elseif tv=="number" then
- m=m+1 r[m]=f_ordered_number(v)
- elseif tv=="table" then
- fastserialize(v)
- elseif tv=="boolean" then
- m=m+1 r[m]=f_ordered_boolean(v)
+if JITSUPPORTED then
+ local f_hashed_string=formatters["[%Q]=%Q,"]
+ local f_hashed_number=formatters["[%Q]=%s,"]
+ local f_hashed_boolean=formatters["[%Q]=%l,"]
+ local f_hashed_table=formatters["[%Q]="]
+ local f_indexed_string=formatters["[%s]=%Q,"]
+ local f_indexed_number=formatters["[%s]=%s,"]
+ local f_indexed_boolean=formatters["[%s]=%l,"]
+ local f_indexed_table=formatters["[%s]="]
+ local f_ordered_string=formatters["%Q,"]
+ local f_ordered_number=formatters["%s,"]
+ local f_ordered_boolean=formatters["%l,"]
+ function table.fastserialize(t,prefix)
+ local r={ type(prefix)=="string" and prefix or "return" }
+ local m=1
+ local function fastserialize(t,outer)
+ local n=#t
+ m=m+1
+ r[m]="{"
+ if n>0 then
+ local v=t[0]
+ if v then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(0,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(0,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(0)
+ fastserialize(v)
+ m=m+1 r[m]=f_indexed_table(0)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(0,v)
+ end
+ end
+ for i=1,n do
+ local v=t[i]
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_ordered_string(v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_ordered_number(v)
+ elseif tv=="table" then
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_ordered_boolean(v)
+ end
end
end
- end
- for k,v in next,t do
- local tk=type(k)
- if tk=="number" then
- if k>n or k<0 then
+ for k,v in next,t do
+ local tk=type(k)
+ if tk=="number" then
+ if k>n or k<0 then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(k,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(k,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(k)
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(k,v)
+ end
+ end
+ else
local tv=type(v)
if tv=="string" then
- m=m+1 r[m]=f_indexed_string(k,v)
+ m=m+1 r[m]=f_hashed_string(k,v)
elseif tv=="number" then
- m=m+1 r[m]=f_indexed_number(k,v)
+ m=m+1 r[m]=f_hashed_number(k,v)
elseif tv=="table" then
- m=m+1 r[m]=f_indexed_table(k)
+ m=m+1 r[m]=f_hashed_table(k)
fastserialize(v)
elseif tv=="boolean" then
- m=m+1 r[m]=f_indexed_boolean(k,v)
+ m=m+1 r[m]=f_hashed_boolean(k,v)
end
end
+ end
+ m=m+1
+ if outer then
+ r[m]="}"
else
- local tv=type(v)
- if tv=="string" then
- m=m+1 r[m]=f_hashed_string(k,v)
- elseif tv=="number" then
- m=m+1 r[m]=f_hashed_number(k,v)
- elseif tv=="table" then
- m=m+1 r[m]=f_hashed_table(k)
- fastserialize(v)
- elseif tv=="boolean" then
- m=m+1 r[m]=f_hashed_boolean(k,v)
- end
+ r[m]="},"
end
+ return r
end
- m=m+1
- if outer then
- r[m]="}"
- else
- r[m]="},"
+ return concat(fastserialize(t,true))
+ end
+else
+ local f_v=formatters["[%q]=%q,"]
+ local f_t=formatters["[%q]="]
+ local f_q=formatters["%q,"]
+ function table.fastserialize(t,prefix)
+ local r={ type(prefix)=="string" and prefix or "return" }
+ local m=1
+ local function fastserialize(t,outer)
+ local n=#t
+ m=m+1
+ r[m]="{"
+ if n>0 then
+ local v=t[0]
+ if v then
+ m=m+1
+ r[m]="[0]='"
+ if type(v)=="table" then
+ fastserialize(v)
+ else
+ r[m]=format("%q,",v)
+ end
+ end
+ for i=1,n do
+ local v=t[i]
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%i]=",i)
+ fastserialize(v)
+ else
+ r[m]=format("[%i]=%q,",i,v)
+ end
+ end
+ end
+ for k,v in next,t do
+ local tk=type(k)
+ if tk=="number" then
+ if k>n or k<0 then
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%i]=",k)
+ fastserialize(v)
+ else
+ r[m]=format("[%i]=%q,",k,v)
+ end
+ end
+ else
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%q]=",k)
+ fastserialize(v)
+ else
+ r[m]=format("[%q]=%q,",k,v)
+ end
+ end
+ end
+ m=m+1
+ if outer then
+ r[m]="}"
+ else
+ r[m]="},"
+ end
+ return r
end
- return r
+ return concat(fastserialize(t,true))
end
- return concat(fastserialize(t,true))
end
function table.deserialize(str)
if not str or str=="" then
@@ -7709,28 +7932,28 @@ function table.twowaymapper(t)
return t
end
local f_start_key_idx=formatters["%w{"]
-local f_start_key_num=formatters["%w[%s]={"]
+local f_start_key_num=JITSUPPORTED and formatters["%w[%s]={"] or formatters["%w[%q]={"]
local f_start_key_str=formatters["%w[%q]={"]
local f_start_key_boo=formatters["%w[%l]={"]
local f_start_key_nop=formatters["%w{"]
local f_stop=formatters["%w},"]
-local f_key_num_value_num=formatters["%w[%s]=%s,"]
-local f_key_str_value_num=formatters["%w[%q]=%s,"]
-local f_key_boo_value_num=formatters["%w[%l]=%s,"]
-local f_key_num_value_str=formatters["%w[%s]=%q,"]
-local f_key_str_value_str=formatters["%w[%q]=%q,"]
-local f_key_boo_value_str=formatters["%w[%l]=%q,"]
-local f_key_num_value_boo=formatters["%w[%s]=%l,"]
-local f_key_str_value_boo=formatters["%w[%q]=%l,"]
+local f_key_num_value_num=JITSUPPORTED and formatters["%w[%s]=%s,"] or formatters["%w[%s]=%q,"]
+local f_key_str_value_num=JITSUPPORTED and formatters["%w[%Q]=%s,"] or formatters["%w[%Q]=%q,"]
+local f_key_boo_value_num=JITSUPPORTED and formatters["%w[%l]=%s,"] or formatters["%w[%l]=%q,"]
+local f_key_num_value_str=JITSUPPORTED and formatters["%w[%s]=%Q,"] or formatters["%w[%q]=%Q,"]
+local f_key_str_value_str=formatters["%w[%Q]=%Q,"]
+local f_key_boo_value_str=formatters["%w[%l]=%Q,"]
+local f_key_num_value_boo=JITSUPPORTED and formatters["%w[%s]=%l,"] or formatters["%w[%q]=%l,"]
+local f_key_str_value_boo=formatters["%w[%Q]=%l,"]
local f_key_boo_value_boo=formatters["%w[%l]=%l,"]
-local f_key_num_value_not=formatters["%w[%s]={},"]
-local f_key_str_value_not=formatters["%w[%q]={},"]
+local f_key_num_value_not=JITSUPPORTED and formatters["%w[%s]={},"] or formatters["%w[%q]={},"]
+local f_key_str_value_not=formatters["%w[%Q]={},"]
local f_key_boo_value_not=formatters["%w[%l]={},"]
-local f_key_num_value_seq=formatters["%w[%s]={ %, t },"]
-local f_key_str_value_seq=formatters["%w[%q]={ %, t },"]
+local f_key_num_value_seq=JITSUPPORTED and formatters["%w[%s]={ %, t },"] or formatters["%w[%q]={ %, t },"]
+local f_key_str_value_seq=formatters["%w[%Q]={ %, t },"]
local f_key_boo_value_seq=formatters["%w[%l]={ %, t },"]
-local f_val_num=formatters["%w%s,"]
-local f_val_str=formatters["%w%q,"]
+local f_val_num=JITSUPPORTED and formatters["%w%s,"] or formatters["%w%q,"]
+local f_val_str=formatters["%w%Q,"]
local f_val_boo=formatters["%w%l,"]
local f_val_not=formatters["%w{},"]
local f_val_seq=formatters["%w{ %, t },"]
@@ -7738,7 +7961,7 @@ local f_fin_seq=formatters[" %, t }"]
local f_table_return=formatters["return {"]
local f_table_name=formatters["%s={"]
local f_table_direct=formatters["{"]
-local f_table_entry=formatters["[%q]={"]
+local f_table_entry=formatters["[%Q]={"]
local f_table_finish=formatters["}"]
local spaces=utilities.strings.newrepeater(" ")
local original_serialize=table.serialize
@@ -8339,7 +8562,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sac"] = package.loaded["util-sac"] or true
--- original size: 11332, stripped down to: 8420
+-- original size: 12946, stripped down to: 9507
if not modules then modules={} end modules ['util-sac']={
version=1.001,
@@ -8374,6 +8597,7 @@ end
function streams.size(f)
return f and f[3] or 0
end
+streams.getsize=streams.size
function streams.setposition(f,i)
if f[4] then
if i<=0 then
@@ -8566,9 +8790,9 @@ function streams.readfixed2(f)
f[2]=j+1
local a,b=byte(f[1],i,j)
if a>=0x80 then
- tonumber((a-0x100).."."..b)
+ return tonumber((a-0x100).."."..b) or 0
else
- tonumber((a ).."."..b)
+ return tonumber((a ).."."..b) or 0
end
end
function streams.readfixed4(f)
@@ -8577,9 +8801,9 @@ function streams.readfixed4(f)
f[2]=j+1
local a,b,c,d=byte(f[1],i,j)
if a>=0x80 then
- tonumber((0x100*a+b-0x10000).."."..(0x100*c+d))
+ return tonumber((0x100*a+b-0x10000).."."..(0x100*c+d)) or 0
else
- tonumber((0x100*a+b ).."."..(0x100*c+d))
+ return tonumber((0x100*a+b ).."."..(0x100*c+d)) or 0
end
end
if bit32 then
@@ -8659,6 +8883,16 @@ if sio and sio.readcardinal2 then
f[2]=i+4
return readinteger4(f[1],i)
end
+ function streams.readfixed2(f)
+ local i=f[2]
+ f[2]=i+2
+ return readfixed2(f[1],i)
+ end
+ function streams.readfixed4(f)
+ local i=f[2]
+ f[2]=i+4
+ return readfixed4(f[1],i)
+ end
function streams.read2dot4(f)
local i=f[2]
f[2]=i+2
@@ -8758,6 +8992,50 @@ else
return t
end
end
+do
+ local files=utilities.files
+ if files then
+ local openfile=files.open
+ local openstream=streams.open
+ local openstring=streams.openstring
+ local setmetatable=setmetatable
+ function io.newreader(str,method)
+ local f,m
+ if method=="string" then
+ f=openstring(str)
+ m=streams
+ elseif method=="stream" then
+ f=openstream(str)
+ m=streams
+ else
+ f=openfile(str,"rb")
+ m=files
+ end
+ if f then
+ local t={}
+ setmetatable(t,{
+ __index=function(t,k)
+ local r=m[k]
+ if k=="close" then
+ if f then
+ m.close(f)
+ f=nil
+ end
+ return function() end
+ elseif r then
+ local v=function(_,a,b) return r(f,a,b) end
+ t[k]=v
+ return v
+ else
+ print("unknown key",k)
+ end
+ end
+ } )
+ return t
+ end
+ end
+ end
+end
end -- of closure
@@ -9801,7 +10079,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-copas"] = package.loaded["util-soc-imp-copas"] or true
--- original size: 25844, stripped down to: 14821
+-- original size: 25959, stripped down to: 14893
local socket=socket or require("socket")
@@ -9838,6 +10116,7 @@ local copas={
autoclose=true,
running=false,
report=report,
+ trace=false,
}
local function statushandler(status,...)
if status then
@@ -9847,7 +10126,9 @@ local function statushandler(status,...)
if type(err)=="table" then
err=err[1]
end
- report("error: %s",tostring(err))
+ if copas.trace then
+ report("error: %s",tostring(err))
+ end
return nil,err
end
function socket.protect(func)
@@ -9861,7 +10142,9 @@ function socket.newtry(finalizer)
if not status then
local detail=select(2,...)
pcall(finalizer,detail)
- report("error: %s",tostring(detail))
+ if copas.trace then
+ report("error: %s",tostring(detail))
+ end
return
end
return...
@@ -12429,7 +12712,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-set"] = package.loaded["trac-set"] or true
--- original size: 13340, stripped down to: 8826
+-- original size: 13394, stripped down to: 8882
if not modules then modules={} end modules ['trac-set']={
version=1.001,
@@ -12439,8 +12722,9 @@ if not modules then modules={} end modules ['trac-set']={
license="see context related readme files"
}
local type,next,tostring,tonumber=type,next,tostring,tonumber
+local print=print
local concat,sortedhash=table.concat,table.sortedhash
-local format,find,lower,gsub,topattern=string.format,string.find,string.lower,string.gsub,string.topattern
+local formatters,find,lower,gsub,topattern=string.formatters,string.find,string.lower,string.gsub,string.topattern
local is_boolean=string.is_boolean
local settings_to_hash=utilities.parsers.settings_to_hash
local allocate=utilities.storage.allocate
@@ -12450,10 +12734,10 @@ local setters=utilities.setters or {}
utilities.setters=setters
local data={}
local trace_initialize=false
+local frozen=true
function setters.initialize(filename,name,values)
local setter=data[name]
if setter then
- frozen=true
local data=setter.data
if data then
for key,newvalue in sortedhash(values) do
@@ -12647,8 +12931,8 @@ function setters.show(t)
end
end
local enable,disable,register,list,show=setters.enable,setters.disable,setters.register,setters.list,setters.show
-function setters.report(setter,...)
- print(format("%-15s : %s\n",setter.name,format(...)))
+function setters.report(setter,fmt,...)
+ print(formatters["%-15s : %s\n"](setter.name,formatters[fmt](...)))
end
local function default(setter,name)
local d=setter.data[name]
@@ -12668,7 +12952,7 @@ function setters.new(name)
disable=function(...) disable (setter,...) end,
reset=function(...) reset (setter,...) end,
register=function(...) register(setter,...) end,
- list=function(...) list (setter,...) end,
+ list=function(...) return list (setter,...) end,
show=function(...) show (setter,...) end,
default=function(...) return default (setter,...) end,
value=function(...) return value (setter,...) end,
@@ -12771,7 +13055,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 32618, stripped down to: 20935
+-- original size: 33003, stripped down to: 21667
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -12816,14 +13100,30 @@ local function ignore() end
setmetatableindex(logs,function(t,k) t[k]=ignore;return ignore end)
local report,subreport,status,settarget,setformats,settranslations
local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
+local function ansisupported(specification)
+ if specification~="ansi" and specification~="ansilog" then
+ return false
+ elseif os and os.enableansi then
+ return os.enableansi()
+ else
+ return false
+ end
+end
if runningtex and texio then
if texio.setescape then
texio.setescape(0)
end
- if arg then
+ if arg and ansisupported then
for k,v in next,arg do
if v=="--ansi" or v=="--c:ansi" then
- variant="ansi"
+ if ansisupported("ansi") then
+ variant="ansi"
+ end
+ break
+ elseif v=="--ansilog" or v=="--c:ansilog" then
+ if ansisupported("ansilog") then
+ variant="ansilog"
+ end
break
end
end
@@ -12928,6 +13228,10 @@ if runningtex and texio then
},
}
}
+ variants.ansilog={
+ formats=variants.ansi.formats,
+ targets=variants.default.targets,
+ }
logs.flush=io.flush
writer=function(...)
write_nl(target,...)
@@ -13034,6 +13338,9 @@ if runningtex and texio then
t=specification.targets
f=specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification="default"
+ end
local v=variants[specification]
if v then
t=v.targets
@@ -13060,7 +13367,7 @@ if runningtex and texio then
subdirect_nop=f.subdirect_nop
status_yes=f.status_yes
status_nop=f.status_nop
- if variant=="ansi" then
+ if variant=="ansi" or variant=="ansilog" then
useluawrites()
end
settarget(whereto)
@@ -13153,6 +13460,9 @@ else
if type(specification)=="table" then
f=specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification="default"
+ end
local v=variants[specification]
if v then
f=v.formats
@@ -13408,12 +13718,6 @@ end
local nesting=0
local verbose=false
local hasscheme=url.hasscheme
-function logs.show_open(name)
-end
-function logs.show_close(name)
-end
-function logs.show_load(name)
-end
local simple=logs.reporter("comment")
logs.simple=simple
logs.simpleline=simple
@@ -13480,6 +13784,13 @@ local exporters={
logs.reporters=reporters
logs.exporters=exporters
function logs.application(t)
+ local arguments=environment and environment.arguments
+ if arguments then
+ local ansi=arguments.ansi or arguments.ansilog
+ if ansi then
+ logs.setformatters(arguments.ansi and "ansi" or "ansilog")
+ end
+ end
t.name=t.name or "unknown"
t.banner=t.banner
t.moreinfo=moreinfo
@@ -13553,8 +13864,6 @@ else
print(format(...))
end
end
-io.stdout:setvbuf('no')
-io.stderr:setvbuf('no')
if package.helpers.report then
package.helpers.report=logs.reporter("package loader")
end
@@ -13652,7 +13961,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-inf"] = package.loaded["trac-inf"] or true
--- original size: 8966, stripped down to: 5972
+-- original size: 9973, stripped down to: 7492
if not modules then modules={} end modules ['trac-inf']={
version=1.001,
@@ -13674,7 +13983,7 @@ statistics.enable=true
statistics.threshold=0.01
local statusinfo,n,registered,timers={},0,{},{}
setmetatableindex(timers,function(t,k)
- local v={ timing=0,loadtime=0 }
+ local v={ timing=0,loadtime=0,offset=0 }
t[k]=v
return v
end)
@@ -13682,10 +13991,40 @@ local function hastiming(instance)
return instance and timers[instance]
end
local function resettiming(instance)
- timers[instance or "notimer"]={ timing=0,loadtime=0 }
+ timers[instance or "notimer"]={ timing=0,loadtime=0,offset=0 }
end
local ticks=clock
local seconds=function(n) return n or 0 end
+if lua.getpreciseticks then
+ ticks=lua.getpreciseticks
+ seconds=lua.getpreciseseconds
+elseif FFISUPPORTED and ffi and os.type=="windows" then
+ local okay,kernel=pcall(ffi.load,"kernel32")
+ if kernel then
+ local tonumber=ffi.number or tonumber
+ ffi.cdef[[
+ int QueryPerformanceFrequency(int64_t *lpFrequency);
+ int QueryPerformanceCounter(int64_t *lpPerformanceCount);
+ ]]
+ local target=ffi.new("__int64[1]")
+ ticks=function()
+ if kernel.QueryPerformanceCounter(target)==1 then
+ return tonumber(target[0])
+ else
+ return 0
+ end
+ end
+ local target=ffi.new("__int64[1]")
+ seconds=function(ticks)
+ if kernel.QueryPerformanceFrequency(target)==1 then
+ return ticks/tonumber(target[0])
+ else
+ return 0
+ end
+ end
+ end
+else
+end
local function starttiming(instance,reset)
local timer=timers[instance or "notimer"]
local it=timer.timing
@@ -13720,12 +14059,26 @@ local function stoptiming(instance)
end
return 0
end
+local function benchmarktimer(instance)
+ local timer=timers[instance or "notimer"]
+ local it=timer.timing
+ if it>1 then
+ timer.timing=it-1
+ else
+ local starttime=timer.starttime
+ if starttime and starttime>0 then
+ timer.offset=ticks()-starttime
+ else
+ timer.offset=0
+ end
+ end
+end
local function elapsed(instance)
if type(instance)=="number" then
return instance
else
local timer=timers[instance or "notimer"]
- return timer and seconds(timer.loadtime) or 0
+ return timer and seconds(timer.loadtime-2*(timer.offset or 0)) or 0
end
end
local function currenttime(instance)
@@ -13738,7 +14091,7 @@ local function currenttime(instance)
else
local starttime=timer.starttime
if starttime and starttime>0 then
- return seconds(timer.loadtime+ticks()-starttime)
+ return seconds(timer.loadtime+ticks()-starttime-2*(timer.offset or 0))
end
end
return 0
@@ -13764,6 +14117,7 @@ statistics.elapsed=elapsed
statistics.elapsedtime=elapsedtime
statistics.elapsedindeed=elapsedindeed
statistics.elapsedseconds=elapsedseconds
+statistics.benchmarktimer=benchmarktimer
function statistics.register(tag,fnc)
if statistics.enable and type(fnc)=="function" then
local rt=registered[tag] or (#statusinfo+1)
@@ -13780,10 +14134,17 @@ function statistics.show()
return format("%s, type: %s, binary subtree: %s",
os.platform or "unknown",os.type or "unknown",environment.texos or "unknown")
end)
- register("used engine",function()
- return format("%s version %s with functionality level %s, banner: %s",
- LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner))
- end)
+ if LUATEXENGINE=="luametatex" then
+ register("used engine",function()
+ return format("%s version %s, functionality level %s, format id %s",
+ LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,LUATEXFORMATID)
+ end)
+ else
+ register("used engine",function()
+ return format("%s version %s with functionality level %s, banner: %s",
+ LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner))
+ end)
+ end
register("control sequences",function()
return format("%s of %s + %s",status.cs_count,status.hash_size,status.hash_extra)
end)
@@ -13822,7 +14183,11 @@ function statistics.show()
end
function statistics.memused()
local round=math.round or math.floor
- return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000),round(status.luastate_bytes/1000000))
+ return format("%s MB, ctx: %s MB, max: %s MB)",
+ round(collectgarbage("count")/1000),
+ round(status.luastate_bytes/1000000),
+ status.luastate_bytes_max and round(status.luastate_bytes_max/1000000) or "unknown"
+ )
end
starttiming(statistics)
function statistics.formatruntime(runtime)
@@ -14013,7 +14378,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-lua"] = package.loaded["util-lua"] or true
--- original size: 6664, stripped down to: 4589
+-- original size: 7149, stripped down to: 4997
if not modules then modules={} end modules ['util-lua']={
version=1.001,
@@ -14038,16 +14403,21 @@ luautilities.nofstrippedchunks=0
luautilities.nofstrippedbytes=0
local strippedchunks={}
luautilities.strippedchunks=strippedchunks
+if not LUATEXENGINE then
+ LUATEXENGINE=status.luatex_engine and string.lower(status.luatex_engine)
+ JITSUPPORTED=LUATEXENGINE=="luajittex" or jit
+ CONTEXTLMTXMODE=CONTEXTLMTXMODE or (LUATEXENGINE=="luametatex" and 1) or 0
+end
luautilities.suffixes={
tma="tma",
- tmc=jit and "tmb" or "tmc",
+ tmc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tmd") or (jit and "tmb") or "tmc",
lua="lua",
- luc=jit and "lub" or "luc",
+ luc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "lud") or (jit and "lub") or "luc",
lui="lui",
luv="luv",
luj="luj",
tua="tua",
- tuc="tuc",
+ tuc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tud") or (jit and "tub") or "tuc",
}
local function register(name)
if tracestripping then
@@ -14186,7 +14556,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-deb"] = package.loaded["util-deb"] or true
--- original size: 9955, stripped down to: 6693
+-- original size: 10136, stripped down to: 6832
if not modules then modules={} end modules ['util-deb']={
version=1.001,
@@ -14210,7 +14580,13 @@ local dummycalls=10*1000
local nesting=0
local names={}
local initialize=false
-if not (FFISUPPORTED and ffi) then
+if lua.getpreciseticks then
+ initialize=function()
+ ticks=lua.getpreciseticks
+ seconds=lua.getpreciseseconds
+ initialize=false
+ end
+elseif not (FFISUPPORTED and ffi) then
elseif os.type=="windows" then
initialize=function()
local kernel=ffilib("kernel32","system")
@@ -14482,7 +14858,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tpl"] = package.loaded["util-tpl"] or true
--- original size: 7112, stripped down to: 3887
+-- original size: 7722, stripped down to: 4212
if not modules then modules={} end modules ['util-tpl']={
version=1.001,
@@ -14498,6 +14874,7 @@ local report_template=logs.reporter("template")
local tostring,next=tostring,next
local format,sub,byte=string.format,string.sub,string.byte
local P,C,R,Cs,Cc,Carg,lpegmatch,lpegpatterns=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.match,lpeg.patterns
+local formatters=string.formatters
local replacer
local function replacekey(k,t,how,recursive)
local v=t[k]
@@ -14566,6 +14943,10 @@ local function replaceoptional(l,m,r,t,how,recurse)
local v=t[l]
return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
+local function replaceformatted(l,m,r,t,how,recurse)
+ local v=t[r]
+ return v and formatters[l](v)
+end
local single=P("%")
local double=P("%%")
local lquoted=P("%[")
@@ -14579,16 +14960,19 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
+local nolformatted=P(":")/"%%"
+local norformatted=P(":")/""
local noloptional=P("%?")/''
local noroptional=P("?%")/''
local nomoptional=P(":")/''
local args=Carg(1)*Carg(2)*Carg(3)
-local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local key=nosingle*((C((1-nosingle)^1)*args)/replacekey)*nosingle
+local quoted=nolquotedq*((C((1-norquotedq)^1)*args)/replacekeyquoted)*norquotedq
+local unquoted=nolquoted*((C((1-norquoted)^1)*args)/replacekeyunquoted)*norquoted
local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
+local formatted=nosingle*((Cs(nolformatted*(1-norformatted )^1)*norformatted*C((1-nosingle)^1)*args)/replaceformatted)*nosingle
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
+ replacer=Cs((unquoted+quoted+formatted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
@@ -14627,7 +15011,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sbx"] = package.loaded["util-sbx"] or true
--- original size: 20393, stripped down to: 13121
+-- original size: 21084, stripped down to: 13214
if not modules then modules={} end modules ['util-sbx']={
version=1.001,
@@ -14873,37 +15257,50 @@ local iopopen=sandbox.original(io.popen)
local reported={}
local function validcommand(name,program,template,checkers,defaults,variables,reporter,strict)
if validbinaries~=false and (validbinaries==true or validbinaries[program]) then
+ local binpath=nil
if variables then
for variable,value in next,variables do
- local checker=validators[checkers[variable]]
- if checker then
- value=checker(unquoted(value),strict)
- if value then
- variables[variable]=optionalquoted(value)
+ local chktype=checkers[variable]
+ if chktype=="verbose" then
+ else
+ local checker=validators[chktype]
+ if checker then
+ value=checker(unquoted(value),strict)
+ if value then
+ variables[variable]=optionalquoted(value)
+ else
+ report("variable %a with value %a fails the check",variable,value)
+ return
+ end
else
- report("variable %a with value %a fails the check",variable,value)
+ report("variable %a has no checker",variable)
return
end
- else
- report("variable %a has no checker",variable)
- return
end
end
for variable,default in next,defaults do
local value=variables[variable]
if not value or value=="" then
- local checker=validators[checkers[variable]]
- if checker then
- default=checker(unquoted(default),strict)
- if default then
- variables[variable]=optionalquoted(default)
- else
- report("variable %a with default %a fails the check",variable,default)
- return
+ local chktype=checkers[variable]
+ if chktype=="verbose" then
+ else
+ local checker=validators[chktype]
+ if checker then
+ default=checker(unquoted(default),strict)
+ if default then
+ variables[variable]=optionalquoted(default)
+ else
+ report("variable %a with default %a fails the check",variable,default)
+ return
+ end
end
end
end
end
+ binpath=variables.binarypath
+ end
+ if type(binpath)=="string" and binpath~="" then
+ program=binpath.."/"..program
end
local command=program.." "..replace(template,variables)
if reporter then
@@ -14938,7 +15335,8 @@ local runners={
if trace then
report("execute: %s",command)
end
- return osexecute(command)
+ local okay=osexecute(command)
+ return okay
end
end,
pipeto=function(...)
@@ -14972,7 +15370,7 @@ function sandbox.registerrunner(specification)
return
end
if validrunners[name] then
- report("invalid name, runner %a already defined")
+ report("invalid name, runner %a already defined",name)
return
end
local program=specification.program
@@ -15090,8 +15488,8 @@ if io then
end
if os then
overload(os.execute,binaryrunner,"os.execute")
- overload(os.spawn,dummyrunner,"os.spawn")
- overload(os.exec,dummyrunner,"os.exec")
+ overload(os.spawn,dummyrunner,"os.spawn")
+ overload(os.exec,dummyrunner,"os.exec")
overload(os.resultof,binaryrunner,"os.resultof")
overload(os.pipeto,binaryrunner,"os.pipeto")
overload(os.rename,filehandlertwo,"os.rename")
@@ -15116,13 +15514,6 @@ end
if zip then
zip.open=register(zip.open,filehandlerone,"zip.open")
end
-if fontloader then
- fontloader.open=register(fontloader.open,filehandlerone,"fontloader.open")
- fontloader.info=register(fontloader.info,filehandlerone,"fontloader.info")
-end
-if epdf then
- epdf.open=register(epdf.open,filehandlerone,"epdf.open")
-end
sandbox.registerroot=registerroot
sandbox.registerbinary=registerbinary
sandbox.registerlibrary=registerlibrary
@@ -15528,7 +15919,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-env"] = package.loaded["luat-env"] or true
--- original size: 6134, stripped down to: 4118
+-- original size: 6551, stripped down to: 4315
if not modules then modules={} end modules ['luat-env']={
version=1.001,
@@ -15537,7 +15928,7 @@ package.loaded["luat-env"] = package.loaded["luat-env"] or true
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local rawset,rawget,loadfile=rawset,rawget,loadfile
+local rawset,loadfile=rawset,loadfile
local gsub=string.gsub
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_lua=logs.reporter("resolvers","lua")
@@ -15584,6 +15975,12 @@ function environment.texfile(filename)
return resolvers.findfile(filename,'tex')
end
function environment.luafile(filename)
+ if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and file.suffix(filename)=="lua" then
+ local resolved=resolvers.findfile(file.replacesuffix(filename,"lmt")) or ""
+ if resolved~="" then
+ return resolved
+ end
+ end
local resolved=resolvers.findfile(filename,'tex') or ""
if resolved~="" then
return resolved
@@ -15695,7 +16092,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-zip"] = package.loaded["util-zip"] or true
--- original size: 18645, stripped down to: 11291
+-- original size: 19496, stripped down to: 10858
if not modules then modules={} end modules ['util-zip']={
version=1.001,
@@ -15706,7 +16103,7 @@ if not modules then modules={} end modules ['util-zip']={
local type,tostring,tonumber=type,tostring,tonumber
local sort=table.sort
local find,format,sub,gsub=string.find,string.format,string.sub,string.gsub
-local osdate,ostime=os.date,os.time
+local osdate,ostime,osclock=os.date,os.time,os.clock
local ioopen=io.open
local loaddata,savedata=io.loaddata,io.savedata
local filejoin,isdir,dirname,mkdirs=file.join,lfs.isdir,file.dirname,dir.mkdirs
@@ -15721,25 +16118,19 @@ local getposition=files.getposition
local band=bit32.band
local rshift=bit32.rshift
local lshift=bit32.lshift
-local decompress,calculatecrc
-if flate then
- decompress=flate.flate_decompress
- calculatecrc=flate.update_crc32
-else
+local decompress,expandsize,calculatecrc
local zlibdecompress=zlib.decompress
+ local zlibexpandsize=zlib.expandsize
local zlibchecksum=zlib.crc32
- decompress=function(source,targetsize)
- local target=zlibdecompress(source,-15)
- if target then
- return target
- else
- return false,1
- end
+ decompress=function(source)
+ return zlibdecompress(source,-15)
end
+ expandsize=zlibexpandsize and function(source,targetsize)
+ return zlibexpandsize(source,targetsize,-15)
+ end or decompress
calculatecrc=function(buffer,initial)
return zlibchecksum(initial or 0,buffer)
end
-end
local zipfiles={}
utilities.zipfiles=zipfiles
local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
@@ -15864,7 +16255,11 @@ local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
setposition(handle,position)
local result=readstring(handle,compressed)
if data.method==8 then
- result=decompress(result,data.uncompressed)
+ if expandsize then
+ result=expandsize(result,data.uncompressed)
+ else
+ result=decompress(result)
+ end
end
if check and data.crc32~=calculatecrc(result) then
print("checksum mismatch")
@@ -15883,14 +16278,14 @@ local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
zipfiles.list=getziplist
zipfiles.found=foundzipfile
end
-if flate then do
+if xzip then
local writecardinal1=files.writebyte
local writecardinal2=files.writecardinal2le
local writecardinal4=files.writecardinal4le
local logwriter=logs.writer
local globpattern=dir.globpattern
- local compress=flate.flate_compress
- local checksum=flate.update_crc32
+ local compress=xzip.compress
+ local checksum=xzip.crc32
local function fromdostime(dostime,dosdate)
return ostime {
year=rshift(dosdate,9)+1980,
@@ -16087,27 +16482,33 @@ if flate then do
local count=#list
local step=number.idiv(count,10)
local done=0
+ local steps=verbose=="steps"
+ local time=steps and osclock()
for i=1,count do
local l=list[i]
local n=l.filename
local d=unzipfile(z,n)
- local p=filejoin(path,n)
- if mkdirs(dirname(p)) then
- if verbose=="steps" then
- total=total+#d
- done=done+1
- if done>=step then
- done=0
- logwriter(format("%4i files of %4i done, %10i bytes",i,count,total))
+ if d then
+ local p=filejoin(path,n)
+ if mkdirs(dirname(p)) then
+ if steps then
+ total=total+#d
+ done=done+1
+ if done>=step then
+ done=0
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",i,count,total,osclock()-time))
+ end
+ elseif verbose then
+ logwriter(n)
end
- elseif verbose then
- logwriter(n)
+ savedata(p,d)
end
- savedata(p,d)
+ else
+ logwriter(format("problem with file %s",n))
end
end
- if verbose=="steps" then
- logwriter(format("%4i files of %4i done, %10i bytes",count,count,total))
+ if steps then
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",count,count,total,osclock()-time))
end
closezipfile(z)
return true
@@ -16118,37 +16519,8 @@ if flate then do
end
zipfiles.zipdir=zipdir
zipfiles.unzipdir=unzipdir
-end end
-if flate then
- local streams=utilities.streams
- local openfile=streams.open
- local closestream=streams.close
- local setposition=streams.setposition
- local getsize=streams.size
- local readcardinal4=streams.readcardinal4le
- local getstring=streams.getstring
- local decompress=flate.gz_decompress
- function zipfiles.gunzipfile(filename)
- local strm=openfile(filename)
- if strm then
- setposition(strm,getsize(strm)-4+1)
- local size=readcardinal4(strm)
- local data=decompress(getstring(strm),size)
- closestream(strm)
- return data
- end
- end
-elseif gzip then
- local openfile=gzip.open
- function zipfiles.gunzipfile(filename)
- local g=openfile(filename,"rb")
- if g then
- local d=g:read("*a")
- d:close()
- return d
- end
- end
end
+zipfiles.gunzipfile=gzip.load
end -- of closure
@@ -16157,7 +16529,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
--- original size: 60383, stripped down to: 35698
+-- original size: 61191, stripped down to: 35864
if not modules then modules={} end modules ['lxml-tab']={
version=1.001,
@@ -16881,7 +17253,10 @@ local slash=P('/')
local colon=P(':')
local semicolon=P(';')
local ampersand=P('&')
-local valid=R('az','AZ','09')+S('_-.')
+local valid_0=R("\128\255")
+local valid_1=R('az','AZ')+S('_')+valid_0
+local valid_2=valid_1+R('09')+S('-.')
+local valid=valid_1*valid_2^0
local name_yes=C(valid^1)*colon*C(valid^1)
local name_nop=C(P(true))*C(valid^1)
local name=name_yes+name_nop
@@ -16917,8 +17292,9 @@ end
local function entityfile(pattern,k,v,n)
if n then
local okay,data
- if resolvers then
- okay,data=resolvers.loadbinfile(n)
+ local loadbinfile=resolvers and resolvers.loadbinfile
+ if loadbinfile then
+ okay,data=loadbinfile(n)
else
data=io.loaddata(n)
okay=data and data~=""
@@ -17027,12 +17403,14 @@ publicentityfile+publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*op
}
return grammar_parsed_text_one,grammar_parsed_text_two,grammar_unparsed_text
end
-grammar_parsed_text_one_nop,
-grammar_parsed_text_two_nop,
-grammar_unparsed_text_nop=install(space,spacing,anything)
-grammar_parsed_text_one_yes,
-grammar_parsed_text_two_yes,
-grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl)
+local
+ grammar_parsed_text_one_nop,
+ grammar_parsed_text_two_nop,
+ grammar_unparsed_text_nop=install(space,spacing,anything)
+local
+ grammar_parsed_text_one_yes,
+ grammar_parsed_text_two_yes,
+ grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl)
local function _xmlconvert_(data,settings,detail)
settings=settings or {}
preparexmlstate(settings)
@@ -17613,7 +17991,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-lpt"] = package.loaded["lxml-lpt"] or true
--- original size: 55145, stripped down to: 30992
+-- original size: 54626, stripped down to: 31255
if not modules then modules={} end modules ['lxml-lpt']={
version=1.001,
@@ -18095,6 +18473,8 @@ local builtin={
lastindex="(#ll.__p__.dt or 1)",
lastelement="(ll.__p__.en or 1)",
last="#list",
+ list="list",
+ self="ll",
rootposition="order",
order="order",
element="(ll.ei or 1)",
@@ -18203,7 +18583,8 @@ local function register_selector(specification)
end
local function register_expression(expression)
local converted=lpegmatch(converter,expression)
- local runner=load(format(template_e,converted))
+ local wrapped=format(template_e,converted)
+ local runner=load(wrapped)
runner=(runner and runner()) or function() errorrunner_e(expression,converted) end
return { kind="expression",expression=expression,converted=converted,evaluator=runner }
end
@@ -18575,6 +18956,20 @@ expressions.count=function(e,pattern)
local collected=applylpath(e,pattern)
return pattern and (collected and #collected) or 0
end
+expressions.attribute=function(e,name,value)
+ if type(e)=="table" and name then
+ local a=e.at
+ if a then
+ local v=a[name]
+ if value then
+ return v==value
+ else
+ return v
+ end
+ end
+ end
+ return nil
+end
expressions.oneof=function(s,...)
for i=1,select("#",...) do
if s==select(i,...) then
@@ -18621,7 +19016,7 @@ function expressions.contains(str,pattern)
end
return false
end
-function xml.expressions.idstring(str)
+function expressions.idstring(str)
return type(str)=="string" and gsub(str,"^#","") or ""
end
local function traverse(root,pattern,handle)
@@ -20394,7 +20789,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 11099, stripped down to: 7152
+-- original size: 11019, stripped down to: 7086
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -20407,9 +20802,9 @@ local next,type,getmetatable,rawset=next,type,getmetatable,rawset
local gsub,find,gmatch,char=string.gsub,string.find,string.gmatch,string.char
local filedirname,filebasename,filejoin=file.dirname,file.basename,file.join
local ostype,osname,osuname,ossetenv,osgetenv=os.type,os.name,os.uname,os.setenv,os.getenv
+local sortedpairs=table.sortedpairs
local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
-local trace_detail=false trackers.register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers.register("resolvers.expansions",function(v) trace_expansions=v end)
local report_initialization=logs.reporter("resolvers","initialization")
resolvers=resolvers or {}
@@ -20618,7 +21013,7 @@ if ostype=="unix" then
rawset(t,k,v)
end
local colon=P(":")
- for k,v in table.sortedpairs(prefixes) do
+ for k,v in sortedpairs(prefixes) do
if p then
p=P(k)+p
else
@@ -20645,7 +21040,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 18154, stripped down to: 10416
+-- original size: 18179, stripped down to: 10432
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -20929,7 +21324,7 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
scancache[sub(full,1,-2)]=files
return files,remap,n,m,r
end
-function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+local function scanfiles(path,branch,usecache,onlyonce,tolerant)
local realpath=resolveprefix(path)
if usecache then
local content=fullcache[realpath]
@@ -20984,8 +21379,9 @@ function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
statistics.stoptiming(timer)
return content
end
+resolvers.scanfiles=scanfiles
function resolvers.simplescanfiles(path,branch,usecache)
- return resolvers.scanfiles(path,branch,usecache,true,true)
+ return scanfiles(path,branch,usecache,true,true)
end
function resolvers.scandata()
table.sort(scanned)
@@ -21052,7 +21448,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-env"] = package.loaded["data-env"] or true
--- original size: 9360, stripped down to: 6312
+-- original size: 9400, stripped down to: 6347
if not modules then modules={} end modules ['data-env']={
version=1.001,
@@ -21062,7 +21458,7 @@ if not modules then modules={} end modules ['data-env']={
license="see context related readme files",
}
local lower,gsub=string.lower,string.gsub
-local next=next
+local next,rawget=next,rawget
local resolvers=resolvers
local allocate=utilities.storage.allocate
local setmetatableindex=table.setmetatableindex
@@ -21143,13 +21539,13 @@ local relations=allocate {
mp={
names={ "mp" },
variable='MPINPUTS',
- suffixes={ 'mp','mpvi','mpiv','mpii' },
+ suffixes={ 'mp','mpvi','mpiv','mpxl','mpii' },
usertype=true,
},
tex={
names={ "tex" },
variable='TEXINPUTS',
- suffixes={ "tex","mkvi","mkiv","mkii","cld","lfg","xml" },
+ suffixes={ "tex","mkiv","mkvi","mkxl","mklx","mkii","cld","lfg","xml" },
usertype=true,
},
icc={
@@ -21337,7 +21733,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 16284, stripped down to: 10938
+-- original size: 16099, stripped down to: 11379
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -21346,48 +21742,83 @@ if not modules then modules={} end modules ['data-tmp']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local format,lower,gsub,concat=string.format,string.lower,string.gsub,table.concat
-local concat=table.concat
-local mkdirs,isdir,isfile=dir.mkdirs,lfs.isdir,lfs.isfile
-local addsuffix,is_writable,is_readable=file.addsuffix,file.is_writable,file.is_readable
-local formatters=string.formatters
local next,type=next,type
+local pcall,loadfile,collectgarbage=pcall,loadfile,collectgarbage
+local format,lower,gsub=string.format,string.lower,string.gsub
+local concat,serialize,fastserialize,serializetofile=table.concat,table.serialize,table.fastserialize,table.tofile
+local mkdirs,expanddirname,isdir,isfile=dir.mkdirs,dir.expandname,lfs.isdir,lfs.isfile
+local is_writable,is_readable=file.is_writable,file.is_readable
+local collapsepath,joinfile,addsuffix,dirname=file.collapsepath,file.join,file.addsuffix,file.dirname
+local savedata=file.savedata
+local formatters=string.formatters
+local osexit,osdate,osuuid=os.exit,os.date,os.uuid
+local removefile=os.remove
+local md5hex=md5.hex
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local report_caches=logs.reporter("resolvers","caches")
local report_resolvers=logs.reporter("resolvers","caching")
local resolvers=resolvers
local cleanpath=resolvers.cleanpath
-local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
-local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
-local compile=utilities.lua.compile
-function utilities.lua.compile(luafile,lucfile,cleanup,strip)
- if cleanup==nil then cleanup=directive_cleanup end
- if strip==nil then strip=directive_strip end
- return compile(luafile,lucfile,cleanup,strip)
+local resolvepath=resolvers.resolve
+local luautilities=utilities.lua
+do
+ local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
+ local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
+ local compilelua=luautilities.compile
+ function luautilities.compile(luafile,lucfile,cleanup,strip)
+ if cleanup==nil then cleanup=directive_cleanup end
+ if strip==nil then strip=directive_strip end
+ return compilelua(luafile,lucfile,cleanup,strip)
+ end
end
caches=caches or {}
local caches=caches
-local luasuffixes=utilities.lua.suffixes
-caches.base=caches.base or "luatex-cache"
-caches.more=caches.more or "context"
-caches.direct=false
-caches.tree=false
-caches.force=true
-caches.ask=false
-caches.relocate=false
+local writable=nil
+local readables={}
+local usedreadables={}
+local compilelua=luautilities.compile
+local luasuffixes=luautilities.suffixes
+caches.base=caches.base or "luatex-cache"
+caches.more=caches.more or "context"
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
-directives.register("system.caches.fast",function(v) caches.fast=true end)
-local writable,readables,usedreadables=nil,{},{}
+local direct_cache=false
+local fast_cache=false
+local cache_tree=false
+directives.register("system.caches.direct",function(v) direct_cache=true end)
+directives.register("system.caches.fast",function(v) fast_cache=true end)
+local function configfiles()
+ return concat(resolvers.configurationfiles(),";")
+end
+local function hashed(tree)
+ tree=gsub(tree,"[\\/]+$","")
+ tree=lower(tree)
+ local hash=md5hex(tree)
+ if trace_cache or trace_locating then
+ report_caches("hashing tree %a, hash %a",tree,hash)
+ end
+ return hash
+end
+local function treehash()
+ local tree=configfiles()
+ if not tree or tree=="" then
+ return false
+ else
+ return hashed(tree)
+ end
+end
+caches.hashed=hashed
+caches.treehash=treehash
+caches.configfiles=configfiles
local function identify()
local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
if texmfcaches then
for k=1,#texmfcaches do
local cachepath=texmfcaches[k]
if cachepath~="" then
- cachepath=resolvers.resolve(cachepath)
- cachepath=resolvers.cleanpath(cachepath)
- cachepath=file.collapsepath(cachepath)
+ cachepath=resolvepath(cachepath)
+ cachepath=cleanpath(cachepath)
+ cachepath=collapsepath(cachepath)
local valid=isdir(cachepath)
if valid then
if is_readable(cachepath) then
@@ -21396,16 +21827,14 @@ local function identify()
writable=cachepath
end
end
- elseif not writable and caches.force then
- local cacheparent=file.dirname(cachepath)
- if is_writable(cacheparent) and true then
- if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath),"no",{ "yes","no" })=="yes" then
- mkdirs(cachepath)
- if isdir(cachepath) and is_writable(cachepath) then
- report_caches("path %a created",cachepath)
- writable=cachepath
- readables[#readables+1]=cachepath
- end
+ elseif not writable then
+ local cacheparent=dirname(cachepath)
+ if is_writable(cacheparent) then
+ mkdirs(cachepath)
+ if isdir(cachepath) and is_writable(cachepath) then
+ report_caches("path %a created",cachepath)
+ writable=cachepath
+ readables[#readables+1]=cachepath
end
end
end
@@ -21418,8 +21847,8 @@ local function identify()
local cachepath=texmfcaches[k]
cachepath=resolvers.expansion(cachepath)
if cachepath~="" then
- cachepath=resolvers.resolve(cachepath)
- cachepath=resolvers.cleanpath(cachepath)
+ cachepath=resolvepath(cachepath)
+ cachepath=cleanpath(cachepath)
local valid=isdir(cachepath)
if valid and is_readable(cachepath) then
if not writable and is_writable(cachepath) then
@@ -21433,23 +21862,25 @@ local function identify()
end
if not writable then
report_caches("fatal error: there is no valid writable cache path defined")
- os.exit()
+ osexit()
elseif #readables==0 then
report_caches("fatal error: there is no valid readable cache path defined")
- os.exit()
+ osexit()
end
- writable=dir.expandname(resolvers.cleanpath(writable))
- local base,more,tree=caches.base,caches.more,caches.tree or caches.treehash()
+ writable=expanddirname(cleanpath(writable))
+ local base=caches.base
+ local more=caches.more
+ local tree=cache_tree or treehash()
if tree then
- caches.tree=tree
+ cache_tree=tree
writable=mkdirs(writable,base,more,tree)
for i=1,#readables do
- readables[i]=file.join(readables[i],base,more,tree)
+ readables[i]=joinfile(readables[i],base,more,tree)
end
else
writable=mkdirs(writable,base,more)
for i=1,#readables do
- readables[i]=file.join(readables[i],base,more)
+ readables[i]=joinfile(readables[i],base,more)
end
end
if trace_cache then
@@ -21486,27 +21917,8 @@ function caches.usedpaths(separator)
return writable or "?"
end
end
-function caches.configfiles()
- return concat(resolvers.configurationfiles(),";")
-end
-function caches.hashed(tree)
- tree=gsub(tree,"[\\/]+$","")
- tree=lower(tree)
- local hash=md5.hex(tree)
- if trace_cache or trace_locating then
- report_caches("hashing tree %a, hash %a",tree,hash)
- end
- return hash
-end
-function caches.treehash()
- local tree=caches.configfiles()
- if not tree or tree=="" then
- return false
- else
- return caches.hashed(tree)
- end
-end
-local r_cache,w_cache={},{}
+local r_cache={}
+local w_cache={}
local function getreadablepaths(...)
local tags={... }
local hash=concat(tags,"/")
@@ -21516,7 +21928,7 @@ local function getreadablepaths(...)
if #tags>0 then
done={}
for i=1,#readables do
- done[i]=file.join(readables[i],...)
+ done[i]=joinfile(readables[i],...)
end
else
done=readables
@@ -21540,17 +21952,25 @@ local function getwritablepath(...)
end
return done
end
-caches.getreadablepaths=getreadablepaths
-caches.getwritablepath=getwritablepath
-function caches.getfirstreadablefile(filename,...)
- local fullname,path=caches.setfirstwritablefile(filename,...)
+local function setfirstwritablefile(filename,...)
+ local wr=getwritablepath(...)
+ local fullname=joinfile(wr,filename)
+ return fullname,wr
+end
+local function setluanames(path,name)
+ return
+ format("%s/%s.%s",path,name,luasuffixes.tma),
+ format("%s/%s.%s",path,name,luasuffixes.tmc)
+end
+local function getfirstreadablefile(filename,...)
+ local fullname,path=setfirstwritablefile(filename,...)
if is_readable(fullname) then
return fullname,path
end
local rd=getreadablepaths(...)
for i=1,#rd do
local path=rd[i]
- local fullname=file.join(path,filename)
+ local fullname=joinfile(path,filename)
if is_readable(fullname) then
usedreadables[i]=true
return fullname,path
@@ -21558,19 +21978,11 @@ function caches.getfirstreadablefile(filename,...)
end
return fullname,path
end
-function caches.setfirstwritablefile(filename,...)
- local wr=getwritablepath(...)
- local fullname=file.join(wr,filename)
- return fullname,wr
-end
-function caches.define(category,subcategory)
- return function()
- return getwritablepath(category,subcategory)
- end
-end
-function caches.setluanames(path,name)
- return format("%s/%s.%s",path,name,luasuffixes.tma),format("%s/%s.%s",path,name,luasuffixes.tmc)
-end
+caches.getreadablepaths=getreadablepaths
+caches.getwritablepath=getwritablepath
+caches.setfirstwritablefile=setfirstwritablefile
+caches.getfirstreadablefile=getfirstreadablefile
+caches.setluanames=setluanames
function caches.loaddata(readables,name,writable)
if type(readables)=="string" then
readables={ readables }
@@ -21578,21 +21990,22 @@ function caches.loaddata(readables,name,writable)
for i=1,#readables do
local path=readables[i]
local loader=false
- local tmaname,tmcname=caches.setluanames(path,name)
+ local state=false
+ local tmaname,tmcname=setluanames(path,name)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
if not loader and isfile(tmaname) then
- local tmacrap,tmcname=caches.setluanames(writable,name)
+ local tmacrap,tmcname=setluanames(writable,name)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
if not loader then
- loader=loadfile(tmaname)
+ state,loader=pcall(loadfile,tmaname)
end
end
if loader then
@@ -21604,21 +22017,21 @@ function caches.loaddata(readables,name,writable)
return false
end
function caches.is_writable(filepath,filename)
- local tmaname,tmcname=caches.setluanames(filepath,filename)
+ local tmaname,tmcname=setluanames(filepath,filename)
return is_writable(tmaname)
end
-local saveoptions={ compact=true }
-function caches.savedata(filepath,filename,data,raw)
- local tmaname,tmcname=caches.setluanames(filepath,filename)
- data.cache_uuid=os.uuid()
- if caches.fast then
- file.savedata(tmaname,table.fastserialize(data,true))
- elseif caches.direct then
- file.savedata(tmaname,table.serialize(data,true,saveoptions))
+local saveoptions={ compact=true,accurate=not JITSUPPORTED }
+function caches.savedata(filepath,filename,data,fast)
+ local tmaname,tmcname=setluanames(filepath,filename)
+ data.cache_uuid=osuuid()
+ if fast or fast_cache then
+ savedata(tmaname,fastserialize(data,true))
+ elseif direct_cache then
+ savedata(tmaname,serialize(data,true,saveoptions))
else
- table.tofile(tmaname,data,true,saveoptions)
+ serializetofile(tmaname,data,true,saveoptions)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
end
local content_state={}
function caches.contentstate()
@@ -21626,11 +22039,14 @@ function caches.contentstate()
end
function caches.loadcontent(cachename,dataname,filename)
if not filename then
- local name=caches.hashed(cachename)
- local full,path=caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename=file.join(path,name)
+ local name=hashed(cachename)
+ local full,path=getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=joinfile(path,name)
+ end
+ local state,blob=pcall(loadfile,addsuffix(filename,luasuffixes.luc))
+ if not blob then
+ state,blob=pcall(loadfile,addsuffix(filename,luasuffixes.lua))
end
- local blob=loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data=blob()
if data and data.content then
@@ -21663,9 +22079,9 @@ function caches.collapsecontent(content)
end
function caches.savecontent(cachename,dataname,content,filename)
if not filename then
- local name=caches.hashed(cachename)
- local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename=file.join(path,name)
+ local name=hashed(cachename)
+ local full,path=setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=joinfile(path,name)
end
local luaname=addsuffix(filename,luasuffixes.lua)
local lucname=addsuffix(filename,luasuffixes.luc)
@@ -21676,17 +22092,17 @@ function caches.savecontent(cachename,dataname,content,filename)
type=dataname,
root=cachename,
version=resolvers.cacheversion,
- date=os.date("%Y-%m-%d"),
- time=os.date("%H:%M:%S"),
+ date=osdate("%Y-%m-%d"),
+ time=osdate("%H:%M:%S"),
content=content,
- uuid=os.uuid(),
+ uuid=osuuid(),
}
- local ok=io.savedata(luaname,table.serialize(data,true))
+ local ok=savedata(luaname,serialize(data,true))
if ok then
if trace_locating then
report_resolvers("category %a, cachename %a saved in %a",dataname,cachename,luaname)
end
- if utilities.lua.compile(luaname,lucname) then
+ if compilelua(luaname,lucname) then
if trace_locating then
report_resolvers("%a compiled to %a",dataname,lucname)
end
@@ -21695,7 +22111,7 @@ function caches.savecontent(cachename,dataname,content,filename)
if trace_locating then
report_resolvers("compiling failed for %a, deleting file %a",dataname,lucname)
end
- os.remove(lucname)
+ removefile(lucname)
end
elseif trace_locating then
report_resolvers("unable to save %a in %a (access error)",dataname,luaname)
@@ -21709,7 +22125,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-met"] = package.loaded["data-met"] or true
--- original size: 5310, stripped down to: 3784
+-- original size: 5518, stripped down to: 3854
if not modules then modules={} end modules ['data-met']={
version=1.100,
@@ -21718,31 +22134,45 @@ if not modules then modules={} end modules ['data-met']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,format=string.find,string.format
-local sequenced=table.sequenced
+local type=type
+local find=string.find
local addurlscheme,urlhashed=url.addscheme,url.hashed
+local collapsepath,joinfile=file.collapsepath,file.join
+local report_methods=logs.reporter("resolvers","methods")
local trace_locating=false
local trace_methods=false
trackers.register("resolvers.locating",function(v) trace_methods=v end)
trackers.register("resolvers.methods",function(v) trace_methods=v end)
-local report_methods=logs.reporter("resolvers","methods")
local allocate=utilities.storage.allocate
local resolvers=resolvers
local registered={}
local function splitmethod(filename)
if not filename then
- return { scheme="unknown",original=filename }
+ return {
+ scheme="unknown",
+ original=filename,
+ }
end
if type(filename)=="table" then
return filename
end
- filename=file.collapsepath(filename,".")
+ filename=collapsepath(filename,".")
if not find(filename,"://",1,true) then
- return { scheme="file",path=filename,original=filename,filename=filename }
+ return {
+ scheme="file",
+ path=filename,
+ original=filename,
+ filename=filename,
+ }
end
- local specification=url.hashed(filename)
+ local specification=urlhashed(filename)
if not specification.scheme or specification.scheme=="" then
- return { scheme="file",path=filename,original=filename,filename=filename }
+ return {
+ scheme="file",
+ path=filename,
+ original=filename,
+ filename=filename,
+ }
else
return specification
end
@@ -21751,7 +22181,8 @@ resolvers.splitmethod=splitmethod
local function methodhandler(what,first,...)
local method=registered[what]
if method then
- local how,namespace=method.how,method.namespace
+ local how=method.how
+ local namespace=method.namespace
if how=="uri" or how=="url" then
local specification=splitmethod(first)
local scheme=specification.scheme
@@ -21797,7 +22228,10 @@ local function methodhandler(what,first,...)
end
resolvers.methodhandler=methodhandler
function resolvers.registermethod(name,namespace,how)
- registered[name]={ how=how or "tag",namespace=namespace }
+ registered[name]={
+ how=how or "tag",
+ namespace=namespace
+ }
namespace["byscheme"]=function(scheme,filename,...)
if scheme=="file" then
return methodhandler(name,filename,...)
@@ -21806,7 +22240,7 @@ function resolvers.registermethod(name,namespace,how)
end
end
end
-local concatinators=allocate { notfound=file.join }
+local concatinators=allocate { notfound=joinfile }
local locators=allocate { notfound=function() end }
local hashers=allocate { notfound=function() end }
local generators=allocate { notfound=function() end }
@@ -21827,7 +22261,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 68195, stripped down to: 43680
+-- original size: 69576, stripped down to: 44470
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -21838,7 +22272,8 @@ if not modules then modules={} end modules ['data-res']={
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
local concat,insert,remove=table.concat,table.insert,table.remove
-local next,type,rawget=next,type,rawget
+local next,type,rawget,loadfile=next,type,rawget,loadfile
+local mergedtable=table.merged
local os=os
local P,S,R,C,Cc,Cs,Ct,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cc,lpeg.Cs,lpeg.Ct,lpeg.Carg
local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
@@ -21854,13 +22289,14 @@ local joinpath=file.joinpath
local is_qualified_path=file.is_qualified_path
local allocate=utilities.storage.allocate
local settings_to_array=utilities.parsers.settings_to_array
+local urlhasscheme=url.hasscheme
local getcurrentdir=lfs.currentdir
local isfile=lfs.isfile
local isdir=lfs.isdir
local setmetatableindex=table.setmetatableindex
local luasuffixes=utilities.lua.suffixes
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
-local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
+local trace_details=false trackers .register("resolvers.details",function(v) trace_details=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
@@ -21879,10 +22315,17 @@ local ostype,osname,osenv,ossetenv,osgetenv=os.type,os.name,os.env,os.setenv,os.
resolvers.cacheversion="1.100"
resolvers.configbanner=""
resolvers.homedir=environment.homedir
-resolvers.criticalvars=allocate { "SELFAUTOLOC","SELFAUTODIR","SELFAUTOPARENT","TEXMFCNF","TEXMF","TEXOS" }
resolvers.luacnfname="texmfcnf.lua"
resolvers.luacnffallback="contextcnf.lua"
resolvers.luacnfstate="unknown"
+local criticalvars={
+ "SELFAUTOLOC",
+ "SELFAUTODIR",
+ "SELFAUTOPARENT",
+ "TEXMFCNF",
+ "TEXMF",
+ "TEXOS",
+}
if environment.default_texmfcnf then
resolvers.luacnfspec="home:texmf/web2c;"..environment.default_texmfcnf
else
@@ -21902,13 +22345,20 @@ local dangerous=resolvers.dangerous
local suffixmap=resolvers.suffixmap
resolvers.defaultsuffixes={ "tex" }
local instance=nil
-function resolvers.setenv(key,value,raw)
+local variable
+local expansion
+local setenv
+local getenv
+local formatofsuffix=resolvers.formatofsuffix
+local splitpath=resolvers.splitpath
+local splitmethod=resolvers.splitmethod
+setenv=function(key,value,raw)
if instance then
instance.environment[key]=value
ossetenv(key,raw and value or resolveprefix(value))
end
end
-local function getenv(key)
+getenv=function(key)
local value=rawget(instance.environment,key)
if value and value~="" then
return value
@@ -21918,94 +22368,97 @@ local function getenv(key)
end
end
resolvers.getenv=getenv
-resolvers.env=getenv
-local function resolvevariable(k)
- return instance.expansions[k]
-end
+resolvers.setenv=setenv
local dollarstripper=lpeg.stripper("$")
local inhibitstripper=P("!")^0*Cs(P(1)^0)
-local somevariable=P("$")/""
-local somekey=C(R("az","AZ","09","__","--")^1)
-local somethingelse=P(";")*((1-S("!{}/\\"))^1*P(";")/"")+P(";")*(P(";")/"")+P(1)
-local variableexpander=Cs((somevariable*(somekey/resolvevariable)+somethingelse)^1 )
-local cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
-local variablecleaner=Cs((cleaner+P(1))^0)
-local somevariable=R("az","AZ","09","__","--")^1/resolvevariable
-local variable=(P("$")/"")*(somevariable+(P("{")/"")*somevariable*(P("}")/""))
-local variableresolver=Cs((variable+P(1))^0)
-local function expandedvariable(var)
- return lpegmatch(variableexpander,var) or var
-end
-function resolvers.reset()
- if trace_locating then
- report_resolving("creating instance")
- end
- local environment={}
- local variables={}
- local expansions={}
- local order={}
- instance={
- environment=environment,
- variables=variables,
- expansions=expansions,
- order=order,
- files={},
- setups={},
- found={},
- foundintrees={},
- hashes={},
- hashed={},
- pathlists=false,
- specification={},
- lists={},
- data={},
- fakepaths={},
- remember=true,
- diskcache=true,
- renewcache=false,
- renewtree=false,
- loaderror=false,
- savelists=true,
- pattern=nil,
- force_suffixes=true,
- pathstack={},
- }
- setmetatableindex(variables,function(t,k)
- local v
- for i=1,#order do
- v=order[i][k]
+local expandedvariable,resolvedvariable do
+ local function resolveinstancevariable(k)
+ return instance.expansions[k]
+ end
+ local p_variable=P("$")/""
+ local p_key=C(R("az","AZ","09","__","--")^1)
+ local p_whatever=P(";")*((1-S("!{}/\\"))^1*P(";")/"")+P(";")*(P(";")/"")+P(1)
+ local variableexpander=Cs((p_variable*(p_key/resolveinstancevariable)+p_whatever)^1 )
+ local p_cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
+ local variablecleaner=Cs((p_cleaner+P(1))^0)
+ local p_variable=R("az","AZ","09","__","--")^1/resolveinstancevariable
+ local p_variable=(P("$")/"")*(p_variable+(P("{")/"")*p_variable*(P("}")/""))
+ local variableresolver=Cs((p_variable+P(1))^0)
+ expandedvariable=function(var)
+ return lpegmatch(variableexpander,var) or var
+ end
+ function resolvers.reset()
+ if trace_locating then
+ report_resolving("creating instance")
+ end
+ local environment={}
+ local variables={}
+ local expansions={}
+ local order={}
+ instance={
+ environment=environment,
+ variables=variables,
+ expansions=expansions,
+ order=order,
+ files={},
+ setups={},
+ found={},
+ foundintrees={},
+ hashes={},
+ hashed={},
+ pathlists=false,
+ specification={},
+ lists={},
+ data={},
+ fakepaths={},
+ remember=true,
+ diskcache=true,
+ renewcache=false,
+ renewtree=false,
+ loaderror=false,
+ savelists=true,
+ pattern=nil,
+ force_suffixes=true,
+ pathstack={},
+ }
+ setmetatableindex(variables,function(t,k)
+ local v
+ for i=1,#order do
+ v=order[i][k]
+ if v~=nil then
+ t[k]=v
+ return v
+ end
+ end
+ if v==nil then
+ v=""
+ end
+ t[k]=v
+ return v
+ end)
+ local repath=resolvers.repath
+ setmetatableindex(environment,function(t,k)
+ local v=osgetenv(k)
+ if v==nil then
+ v=variables[k]
+ end
if v~=nil then
- t[k]=v
- return v
+ v=checkedvariable(v) or ""
end
- end
- if v==nil then
- v=""
- end
- t[k]=v
- return v
- end)
- setmetatableindex(environment,function(t,k)
- local v=osgetenv(k)
- if v==nil then
- v=variables[k]
- end
- if v~=nil then
- v=checkedvariable(v) or ""
- end
- v=resolvers.repath(v)
- t[k]=v
- return v
- end)
- setmetatableindex(expansions,function(t,k)
- local v=environment[k]
- if type(v)=="string" then
- v=lpegmatch(variableresolver,v)
- v=lpegmatch(variablecleaner,v)
- end
- t[k]=v
- return v
- end)
+ v=repath(v)
+ t[k]=v
+ return v
+ end)
+ setmetatableindex(expansions,function(t,k)
+ local v=environment[k]
+ if type(v)=="string" then
+ v=lpegmatch(variableresolver,v)
+ v=lpegmatch(variablecleaner,v)
+ end
+ t[k]=v
+ return v
+ end)
+ end
end
function resolvers.initialized()
return instance~=nil
@@ -22019,31 +22472,33 @@ local function reset_caches()
instance.lists={}
instance.pathlists=false
end
-local slash=P("/")
-local pathexpressionpattern=Cs (
- Cc("^")*(
- Cc("%")*S(".-")+slash^2*P(-1)/"/.*"
+local makepathexpression do
+ local slash=P("/")
+ local pathexpressionpattern=Cs (
+ Cc("^")*(
+ Cc("%")*S(".-")+slash^2*P(-1)/"/.*"
+slash^2/"/"+(1-slash)*P(-1)*Cc("/")+P(1)
- )^1*Cc("$")
-)
-local cache={}
-local function makepathexpression(str)
- if str=="." then
- return "^%./$"
- else
- local c=cache[str]
- if not c then
- c=lpegmatch(pathexpressionpattern,str)
- cache[str]=c
+ )^1*Cc("$")
+ )
+ local cache={}
+ makepathexpression=function(str)
+ if str=="." then
+ return "^%./$"
+ else
+ local c=cache[str]
+ if not c then
+ c=lpegmatch(pathexpressionpattern,str)
+ cache[str]=c
+ end
+ return c
end
- return c
end
end
local function reportcriticalvariables(cnfspec)
if trace_locating then
- for i=1,#resolvers.criticalvars do
- local k=resolvers.criticalvars[i]
- local v=resolvers.getenv(k) or "unknown"
+ for i=1,#criticalvars do
+ local k=criticalvars[i]
+ local v=getenv(k) or "unknown"
report_resolving("variable %a set to %a",k,v)
end
report_resolving()
@@ -22065,7 +22520,7 @@ local function identify_configuration_files()
resolvers.luacnfstate="environment"
end
reportcriticalvariables(cnfspec)
- local cnfpaths=expandedpathfromlist(resolvers.splitpath(cnfspec))
+ local cnfpaths=expandedpathfromlist(splitpath(cnfspec))
local function locatecnf(luacnfname,kind)
for i=1,#cnfpaths do
local filepath=cnfpaths[i]
@@ -22098,6 +22553,8 @@ local function identify_configuration_files()
end
local function load_configuration_files()
local specification=instance.specification
+ local setups=instance.setups
+ local order=instance.order
if #specification>0 then
local luacnfname=resolvers.luacnfname
for i=1,#specification do
@@ -22107,7 +22564,6 @@ local function load_configuration_files()
local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
- local setups=instance.setups
local data=blob()
local parent=data and data.parent
if parent then
@@ -22118,7 +22574,7 @@ local function load_configuration_files()
local parentdata=blob()
if parentdata then
report_resolving("loading configuration file %a",filename)
- data=table.merged(parentdata,data)
+ data=mergedtable(parentdata,data)
end
end
end
@@ -22150,7 +22606,7 @@ local function load_configuration_files()
if trace_locating then
report_resolving("reloading configuration due to TEXMF redefinition")
end
- resolvers.setenv("TEXMFCNF",cnfspec)
+ setenv("TEXMFCNF",cnfspec)
instance.specification={}
identify_configuration_files()
load_configuration_files()
@@ -22168,7 +22624,7 @@ local function load_configuration_files()
elseif trace_locating then
report_resolving("skipping configuration file %a (no valid format)",filename)
end
- instance.order[#instance.order+1]=instance.setups[pathname]
+ order[#order+1]=setups[pathname]
if instance.loaderror then
break
end
@@ -22177,6 +22633,8 @@ local function load_configuration_files()
report_resolving("warning: no lua configuration files found")
end
end
+local expandedpathlist
+local unexpandedpathlist
function resolvers.configurationfiles()
return instance.specification or {}
end
@@ -22193,7 +22651,7 @@ local function load_file_databases()
end
end
local function locate_file_databases()
- local texmfpaths=resolvers.expandedpathlist("TEXMF")
+ local texmfpaths=expandedpathlist("TEXMF")
if #texmfpaths>0 then
for i=1,#texmfpaths do
local path=collapsepath(texmfpaths[i])
@@ -22202,7 +22660,7 @@ local function locate_file_databases()
if stripped~="" then
local runtime=stripped==path
path=cleanpath(path)
- local spec=resolvers.splitmethod(stripped)
+ local spec=splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme=="file") then
stripped="tree:///"..stripped
elseif spec.scheme=="cache" or spec.scheme=="file" then
@@ -22236,11 +22694,13 @@ local function generate_file_databases()
end
end
local function save_file_databases()
- for i=1,#instance.hashes do
- local hash=instance.hashes[i]
+ local hashes=instance.hashes
+ local files=instance.files
+ for i=1,#hashes do
+ local hash=hashes[i]
local cachename=hash.name
if hash.cache then
- local content=instance.files[cachename]
+ local content=files[cachename]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",cachename)
@@ -22252,8 +22712,9 @@ local function save_file_databases()
end
end
function resolvers.renew(hashname)
+ local files=instance.files
if hashname and hashname~="" then
- local expanded=resolvers.expansion(hashname) or ""
+ local expanded=expansion(hashname) or ""
if expanded~="" then
if trace_locating then
report_resolving("identifying tree %a from %a",expanded,hashname)
@@ -22270,7 +22731,7 @@ function resolvers.renew(hashname)
report_resolving("using path %a",realpath)
end
methodhandler('generators',hashname)
- local content=instance.files[hashname]
+ local content=files[hashname]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",hashname)
@@ -22297,38 +22758,46 @@ local function load_databases()
end
end
function resolvers.appendhash(type,name,cache)
- if not instance.hashed[name] then
+ local hashed=instance.hashed
+ local hashes=instance.hashes
+ if hashed[name] then
+ else
if trace_locating then
report_resolving("hash %a appended",name)
end
- insert(instance.hashes,{ type=type,name=name,cache=cache } )
- instance.hashed[name]=cache
+ insert(hashes,{ type=type,name=name,cache=cache } )
+ hashed[name]=cache
end
end
function resolvers.prependhash(type,name,cache)
- if not instance.hashed[name] then
+ local hashed=instance.hashed
+ local hashes=instance.hashes
+ if hashed[name] then
+ else
if trace_locating then
report_resolving("hash %a prepended",name)
end
- insert(instance.hashes,1,{ type=type,name=name,cache=cache } )
- instance.hashed[name]=cache
+ insert(hashes,1,{ type=type,name=name,cache=cache } )
+ hashed[name]=cache
end
end
function resolvers.extendtexmfvariable(specification)
- local t=resolvers.splitpath(getenv("TEXMF"))
- insert(t,1,specification)
- local newspec=concat(t,",")
- if instance.environment["TEXMF"] then
- instance.environment["TEXMF"]=newspec
- elseif instance.variables["TEXMF"] then
- instance.variables["TEXMF"]=newspec
+ local environment=instance.environment
+ local variables=instance.variables
+ local texmftrees=splitpath(getenv("TEXMF"))
+ insert(texmftrees,1,specification)
+ texmftrees=concat(texmftrees,",")
+ if environment["TEXMF"] then
+ environment["TEXMF"]=texmftrees
+ elseif variables["TEXMF"] then
+ variables["TEXMF"]=texmftrees
else
end
reset_hashes()
end
function resolvers.splitexpansions()
- local ie=instance.expansions
- for k,v in next,ie do
+ local expansions=instance.expansions
+ for k,v in next,expansions do
local t,tn,h,p={},0,{},splitconfigurationpath(v)
for kk=1,#p do
local vv=p[kk]
@@ -22338,33 +22807,37 @@ function resolvers.splitexpansions()
h[vv]=true
end
end
- if #t>1 then
- ie[k]=t
+ if tn>1 then
+ expansions[k]=t
else
- ie[k]=t[1]
+ expansions[k]=t[1]
end
end
end
function resolvers.datastate()
return caches.contentstate()
end
-function resolvers.variable(name)
+variable=function(name)
+ local variables=instance.variables
local name=name and lpegmatch(dollarstripper,name)
- local result=name and instance.variables[name]
+ local result=name and variables[name]
return result~=nil and result or ""
end
-function resolvers.expansion(name)
+expansion=function(name)
+ local expansions=instance.expansions
local name=name and lpegmatch(dollarstripper,name)
- local result=name and instance.expansions[name]
+ local result=name and expansions[name]
return result~=nil and result or ""
end
-function resolvers.unexpandedpathlist(str)
- local pth=resolvers.variable(str)
- local lst=resolvers.splitpath(pth)
+resolvers.variable=variable
+resolvers.expansion=expansion
+unexpandedpathlist=function(str)
+ local pth=variable(str)
+ local lst=splitpath(pth)
return expandedpathfromlist(lst)
end
function resolvers.unexpandedpath(str)
- return joinpath(resolvers.unexpandedpathlist(str))
+ return joinpath(unexpandedpathlist(str))
end
function resolvers.pushpath(name)
local pathstack=instance.pathstack
@@ -22394,8 +22867,8 @@ function resolvers.stackpath()
end
local done={}
function resolvers.resetextrapaths()
- local ep=instance.extra_paths
- if not ep then
+ local extra_paths=instance.extra_paths
+ if not extra_paths then
done={}
instance.extra_paths={}
elseif #ep>0 then
@@ -22416,8 +22889,8 @@ function resolvers.registerextrapath(paths,subpaths)
end
local paths=settings_to_array(paths)
local subpaths=settings_to_array(subpaths)
- local ep=instance.extra_paths or {}
- local oldn=#ep
+ local extra_paths=instance.extra_paths or {}
+ local oldn=#extra_paths
local newn=oldn
local nofpaths=#paths
local nofsubpaths=#subpaths
@@ -22430,7 +22903,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=p.."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=cleanpath(ps)
+ extra_paths[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -22440,7 +22913,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p=paths[i]
if not done[p] then
newn=newn+1
- ep[newn]=cleanpath(p)
+ extra_paths[newn]=cleanpath(p)
done[p]=true
end
end
@@ -22449,17 +22922,17 @@ function resolvers.registerextrapath(paths,subpaths)
for i=1,oldn do
for j=1,nofsubpaths do
local s=subpaths[j]
- local ps=ep[i].."/"..s
+ local ps=extra_paths[i].."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=cleanpath(ps)
+ extra_paths[newn]=cleanpath(ps)
done[ps]=true
end
end
end
end
if newn>0 then
- instance.extra_paths=ep
+ instance.extra_paths=extra_paths
end
if newn~=oldn then
reset_caches()
@@ -22467,17 +22940,19 @@ function resolvers.registerextrapath(paths,subpaths)
end
function resolvers.pushextrapath(path)
local paths=settings_to_array(path)
- if instance.extra_stack then
- insert(instance.extra_stack,1,paths)
+ local extra_stack=instance.extra_stack
+ if extra_stack then
+ insert(extra_stack,1,paths)
else
instance.extra_stack={ paths }
end
reset_caches()
end
function resolvers.popextrapath()
- if instance.extra_stack then
+ local extra_stack=instance.extra_stack
+ if extra_stack then
reset_caches()
- return remove(instance.extra_stack,1)
+ return remove(extra_stack,1)
end
end
local function made_list(instance,list,extra_too)
@@ -22506,33 +22981,21 @@ local function made_list(instance,list,extra_too)
end
end
if extra_too then
- local es=instance.extra_stack
- if es and #es>0 then
- for k=1,#es do
- add(es[k])
+ local extra_stack=instance.extra_stack
+ local extra_paths=instance.extra_paths
+ if extra_stack and #extra_stack>0 then
+ for k=1,#extra_stack do
+ add(extra_stack[k])
end
end
- local ep=instance.extra_paths
- if ep and #ep>0 then
- add(ep)
+ if extra_paths and #extra_paths>0 then
+ add(extra_paths)
end
end
add(list)
return new
end
-function resolvers.cleanpathlist(str)
- local t=resolvers.expandedpathlist(str)
- if t then
- for i=1,#t do
- t[i]=collapsepath(cleanpath(t[i]))
- end
- end
- return t
-end
-function resolvers.expandpath(str)
- return joinpath(resolvers.expandedpathlist(str))
-end
-function resolvers.expandedpathlist(str,extra_too)
+expandedpathlist=function(str,extra_too)
if not str then
return {}
elseif instance.savelists then
@@ -22540,40 +23003,56 @@ function resolvers.expandedpathlist(str,extra_too)
local lists=instance.lists
local lst=lists[str]
if not lst then
- local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
+ local l=made_list(instance,splitpath(expansion(str)),extra_too)
lst=expandedpathfromlist(l)
lists[str]=lst
end
return lst
else
- local lst=resolvers.splitpath(resolvers.expansion(str))
+ local lst=splitpath(expansion(str))
return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
-function resolvers.expandedpathlistfromvariable(str)
+resolvers.expandedpathlist=expandedpathlist
+resolvers.unexpandedpathlist=unexpandedpathlist
+function resolvers.cleanpathlist(str)
+ local t=expandedpathlist(str)
+ if t then
+ for i=1,#t do
+ t[i]=collapsepath(cleanpath(t[i]))
+ end
+ end
+ return t
+end
+function resolvers.expandpath(str)
+ return joinpath(expandedpathlist(str))
+end
+local function expandedpathlistfromvariable(str)
str=lpegmatch(dollarstripper,str)
local tmp=resolvers.variableofformatorsuffix(str)
- return resolvers.expandedpathlist(tmp~="" and tmp or str)
+ return expandedpathlist(tmp~="" and tmp or str)
end
function resolvers.expandpathfromvariable(str)
- return joinpath(resolvers.expandedpathlistfromvariable(str))
+ return joinpath(expandedpathlistfromvariable(str))
end
+resolvers.expandedpathlistfromvariable=expandedpathlistfromvariable
function resolvers.cleanedpathlist(v)
- local t=resolvers.expandedpathlist(v)
+ local t=expandedpathlist(v)
for i=1,#t do
- t[i]=resolvers.resolve(resolvers.cleanpath(t[i]))
+ t[i]=resolveprefix(cleanpath(t[i]))
end
return t
end
function resolvers.expandbraces(str)
- local pth=expandedpathfromlist(resolvers.splitpath(str))
+ local pth=expandedpathfromlist(splitpath(str))
return joinpath(pth)
end
function resolvers.registerfilehash(name,content,someerror)
+ local files=instance.files
if content then
- instance.files[name]=content
+ files[name]=content
else
- instance.files[name]={}
+ files[name]={}
if somerror==true then
instance.loaderror=someerror
end
@@ -22592,7 +23071,7 @@ function resolvers.renewcache()
end
local function isreadable(name)
local readable=isfile(name)
- if trace_detail then
+ if trace_details then
if readable then
report_resolving("file %a is readable",name)
else
@@ -22609,7 +23088,7 @@ local function collect_files(names)
local variant=hash.type
local search=filejoin(root,path,name)
local result=methodhandler('concatinators',variant,root,path,name)
- if trace_detail then
+ if trace_details then
report_resolving("match: variant %a, search %a, result %a",variant,search,result)
end
noffiles=noffiles+1
@@ -22618,7 +23097,7 @@ local function collect_files(names)
end
for k=1,#names do
local filename=names[k]
- if trace_detail then
+ if trace_details then
report_resolving("checking name %a",filename)
end
local basename=filebasename(filename)
@@ -22630,12 +23109,13 @@ local function collect_files(names)
pathname="/"..pathname.."$"
end
local hashes=instance.hashes
+ local files=instance.files
for h=1,#hashes do
local hash=hashes[h]
local hashname=hash.name
- local content=hashname and instance.files[hashname]
+ local content=hashname and files[hashname]
if content then
- if trace_detail then
+ if trace_details then
report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
local path,name=lookup(content,basename)
@@ -22703,7 +23183,6 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat=="" then
if filesuffix=="" or not suffixmap[filesuffix] then
local defaultsuffixes=resolvers.defaultsuffixes
- local formatofsuffix=resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname=filename..'.'..defaultsuffixes[i]
wantedfiles[#wantedfiles+1]=forcedname
@@ -22713,7 +23192,7 @@ local function find_analyze(filename,askedformat,allresults)
end
end
else
- filetype=resolvers.formatofsuffix(filename)
+ filetype=formatofsuffix(filename)
if trace_locating then
report_resolving("using suffix based filetype %a",filetype)
end
@@ -22736,7 +23215,7 @@ local function find_analyze(filename,askedformat,allresults)
end
local function find_direct(filename,allresults)
if not dangerous[askedformat] and isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("file %a found directly",filename)
end
return "direct",{ filename }
@@ -22761,12 +23240,12 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
report_resolving("checking qualified name %a",filename)
end
if isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("qualified file %a found",filename)
end
return "qualified",{ filename }
end
- if trace_detail then
+ if trace_details then
report_resolving("locating qualified file %a",filename)
end
local forcedname,suffix="",suffixonly(filename)
@@ -22774,11 +23253,11 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
local format_suffixes=askedformat=="" and resolvers.defaultsuffixes or suffixes[askedformat]
if format_suffixes then
for i=1,#format_suffixes do
- local s=format_suffixes[i]
- forcedname=filename.."."..s
+ local suffix=format_suffixes[i]
+ forcedname=filename.."."..suffix
if isreadable(forcedname) then
if trace_locating then
- report_resolving("no suffix, forcing format filetype %a",s)
+ report_resolving("no suffix, forcing format filetype %a",suffix)
end
return "qualified",{ forcedname }
end
@@ -22791,7 +23270,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
local savedformat=askedformat
local format=savedformat or ""
if format=="" then
- askedformat=resolvers.formatofsuffix(suffix)
+ askedformat=formatofsuffix(suffix)
end
if not format then
askedformat="othertextfiles"
@@ -22822,7 +23301,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
end
local function check_subpath(fname)
if isreadable(fname) then
- if trace_detail then
+ if trace_details then
report_resolving("found %a by deep scanning",fname)
end
return fname
@@ -22830,7 +23309,7 @@ local function check_subpath(fname)
end
local function makepathlist(list,filetype)
local typespec=resolvers.variableofformat(filetype)
- local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
+ local pathlist=expandedpathlist(typespec,filetype and usertypes[filetype])
local entry={}
if pathlist and #pathlist>0 then
for k=1,#pathlist do
@@ -22841,7 +23320,7 @@ local function makepathlist(list,filetype)
local expression=makepathexpression(pathname)
local barename=gsub(pathname,"/+$","")
barename=resolveprefix(barename)
- local scheme=url.hasscheme(barename)
+ local scheme=urlhasscheme(barename)
local schemename=gsub(barename,"%.%*$",'')
entry[k]={
path=path,
@@ -22878,7 +23357,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
dirlist[i]=filedirname(filelist[i][3]).."/"
end
end
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a in tree",filename)
end
for k=1,#pathlist do
@@ -22888,7 +23367,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local done=false
if filelist then
local expression=entry.expression
- if trace_detail then
+ if trace_details then
report_resolving("using pattern %a for path %a",expression,pathname)
end
for k=1,#filelist do
@@ -22899,16 +23378,16 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
result[#result+1]=resolveprefix(fl[3])
done=true
if allresults then
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, continue scanning",expression,f,d)
end
else
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, quit scanning",expression,f,d)
end
break
end
- elseif trace_detail then
+ elseif trace_details then
report_resolving("no match to %a in hash for file %a and path %a",expression,f,d)
end
end
@@ -22923,7 +23402,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
if not done and not entry.prescanned then
- if trace_detail then
+ if trace_details then
report_resolving("quick root scan for %a",pname)
end
for k=1,#wantedfiles do
@@ -22938,7 +23417,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if not done and entry.recursive then
- if trace_detail then
+ if trace_details then
report_resolving("scanning filesystem for %a",pname)
end
local files=resolvers.simplescanfiles(pname,false,true)
@@ -23004,7 +23483,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
local function find_onpath(filename,filetype,wantedfiles,allresults)
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a, filetype %a, wanted files %a",filename,filetype,concat(wantedfiles," | "))
end
local result={}
@@ -23046,7 +23525,9 @@ collect_instance_files=function(filename,askedformat,allresults)
{ find_onpath (filename,filetype,wantedfiles,true) },
{ find_otherwise(filename,filetype,wantedfiles,true) },
}
- local result,status,done={},{},{}
+ local result={}
+ local status={}
+ local done={}
for k,r in next,results do
local method,list=r[1],r[2]
if method and list then
@@ -23060,7 +23541,7 @@ collect_instance_files=function(filename,askedformat,allresults)
end
end
end
- if trace_detail then
+ if trace_details then
report_resolving("lookup status: %s",table.serialize(status,filename))
end
return result,status
@@ -23117,6 +23598,9 @@ local function findfiles(filename,filetype,allresults)
if not filename or filename=="" then
return {}
end
+ if allresults==nil then
+ allresults=true
+ end
local result,status=collect_instance_files(filename,filetype or "",allresults)
if not result or #result==0 then
local lowered=lower(filename)
@@ -23126,27 +23610,25 @@ local function findfiles(filename,filetype,allresults)
end
return result or {},status
end
-function resolvers.findfiles(filename,filetype)
- if not filename or filename=="" then
- return ""
- else
- return findfiles(filename,filetype,true)
- end
-end
-function resolvers.findfile(filename,filetype)
+local function findfile(filename,filetype)
if not filename or filename=="" then
return ""
else
return findfiles(filename,filetype,false)[1] or ""
end
end
+resolvers.findfiles=findfiles
+resolvers.findfile=findfile
+resolvers.find_file=findfile
+resolvers.find_files=findfiles
function resolvers.findpath(filename,filetype)
return filedirname(findfiles(filename,filetype,false)[1] or "")
end
local function findgivenfiles(filename,allresults)
+ local hashes=instance.hashes
+ local files=instance.files
local base=filebasename(filename)
local result={}
- local hashes=instance.hashes
local function okay(hash,path,name)
local found=methodhandler('concatinators',hash.type,hash.name,path,name)
if found and found~="" then
@@ -23156,7 +23638,7 @@ local function findgivenfiles(filename,allresults)
end
for k=1,#hashes do
local hash=hashes[k]
- local content=instance.files[hash.name]
+ local content=files[hash.name]
if content then
local path,name=lookup(content,base)
if not path then
@@ -23188,14 +23670,14 @@ function resolvers.wildcardpattern(pattern)
return lpegmatch(makewildcard,pattern) or pattern
end
local function findwildcardfiles(filename,allresults,result)
+ local files=instance.files
+ local hashes=instance.hashes
local result=result or {}
local base=filebasename(filename)
local dirn=filedirname(filename)
local path=lower(lpegmatch(makewildcard,dirn) or dirn)
local name=lower(lpegmatch(makewildcard,base) or base)
- local files=instance.files
if find(name,"*",1,true) then
- local hashes=instance.hashes
local function okay(found,path,base,hashname,hashtype)
if find(found,path) then
local full=methodhandler('concatinators',hashtype,hashname,found,base)
@@ -23235,7 +23717,6 @@ local function findwildcardfiles(filename,allresults,result)
end
end
end
- local hashes=instance.hashes
for k=1,#hashes do
local hash=hashes[k]
local hashname=hash.name
@@ -23265,13 +23746,21 @@ end
function resolvers.findwildcardfile(filename)
return findwildcardfiles(filename,false)[1] or ""
end
-function resolvers.automount()
-end
-function resolvers.starttiming()
- statistics.starttiming(instance)
+do
+ local starttiming=statistics.starttiming
+ local stoptiming=statistics.stoptiming
+ local elapsedtime=statistics.elapsedtime
+ function resolvers.starttiming()
+ starttiming(instance)
+ end
+ function resolvers.stoptiming()
+ stoptiming(instance)
+ end
+ function resolvers.loadtime()
+ return elapsedtime(instance)
+ end
end
-function resolvers.stoptiming()
- statistics.stoptiming(instance)
+function resolvers.automount()
end
function resolvers.load(option)
resolvers.starttiming()
@@ -23285,9 +23774,6 @@ function resolvers.load(option)
local files=instance.files
return files and next(files) and true
end
-function resolvers.loadtime()
- return statistics.elapsedtime(instance)
-end
local function report(str)
if trace_locating then
report_resolving(str)
@@ -23317,7 +23803,7 @@ function resolvers.dowithfilesandreport(command,files,...)
end
end
function resolvers.showpath(str)
- return joinpath(resolvers.expandedpathlist(resolvers.formatofvariable(str)))
+ return joinpath(expandedpathlist(resolvers.formatofvariable(str)))
end
function resolvers.registerfile(files,name,path)
if files[name] then
@@ -23331,7 +23817,7 @@ function resolvers.registerfile(files,name,path)
end
end
function resolvers.dowithpath(name,func)
- local pathlist=resolvers.expandedpathlist(name)
+ local pathlist=expandedpathlist(name)
for i=1,#pathlist do
func("^"..cleanpath(pathlist[i]))
end
@@ -23341,11 +23827,11 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
local engine=environment.ownmain or "luatex"
- local barename=removesuffix(name)
+ local barename=removesuffix(file.basename(name))
local fullname=addsuffix(barename,"fmt")
local fmtname=caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname=="" then
- fmtname=resolvers.findfile(fullname)
+ fmtname=findfile(fullname)
fmtname=cleanpath(fmtname)
end
if fmtname~="" then
@@ -23354,17 +23840,17 @@ function resolvers.locateformat(name)
local lucname=addsuffix(barename,luasuffixes.luc)
local luiname=addsuffix(barename,luasuffixes.lui)
if isfile(luiname) then
- return barename,luiname
+ return fmtname,luiname
elseif isfile(lucname) then
- return barename,lucname
+ return fmtname,lucname
elseif isfile(luaname) then
- return barename,luaname
+ return fmtname,luaname
end
end
return nil,nil
end
function resolvers.booleanvariable(str,default)
- local b=resolvers.expansion(str)
+ local b=expansion(str)
if b=="" then
return default
else
@@ -23374,6 +23860,7 @@ function resolvers.booleanvariable(str,default)
end
function resolvers.dowithfilesintree(pattern,handle,before,after)
local hashes=instance.hashes
+ local files=instance.files
for i=1,#hashes do
local hash=hashes[i]
local blobtype=hash.type
@@ -23385,7 +23872,7 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
if before then
before(blobtype,blobpath,pattern)
end
- for path,name in filtered(instance.files[blobpath],pattern) do
+ for path,name in filtered(files[blobpath],pattern) do
if type(path)=="string" then
checked=checked+1
if handle(blobtype,blobpath,path,name) then
@@ -23406,10 +23893,6 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
end
end
end
-local obsolete=resolvers.obsolete or {}
-resolvers.obsolete=obsolete
-resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile
-resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles
function resolvers.knownvariables(pattern)
if instance then
local environment=instance.environment
@@ -23443,7 +23926,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 4854, stripped down to: 2889
+-- original size: 5088, stripped down to: 3144
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -23452,6 +23935,7 @@ if not modules then modules={} end modules ['data-pre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local insert,remove=table.insert,table.remove
local resolvers=resolvers
local prefixes=resolvers.prefixes
local cleanpath=resolvers.cleanpath
@@ -23529,8 +24013,9 @@ prefixes.kpse=prefixes.locate
prefixes.full=prefixes.locate
prefixes.file=prefixes.filename
prefixes.path=prefixes.pathname
+local inputstack={}
+local stackpath=resolvers.stackpath
local function toppath()
- local inputstack=resolvers.inputstack
if not inputstack then
return "."
end
@@ -23542,15 +24027,23 @@ local function toppath()
end
end
local function jobpath()
- local path=resolvers.stackpath()
+ local path=stackpath()
if not path or path=="" then
return "."
else
return path
end
end
+local function pushinputname(name)
+ insert(inputstack,name)
+end
+local function popinputname(name)
+ return remove(inputstack)
+end
resolvers.toppath=toppath
resolvers.jobpath=jobpath
+resolvers.pushinputname=pushinputname
+resolvers.popinputname=popinputname
prefixes.toppath=function(str) return cleanpath(joinpath(toppath(),str)) end
prefixes.jobpath=function(str) return cleanpath(joinpath(jobpath(),str)) end
resolvers.setdynamic("toppath")
@@ -23593,7 +24086,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-out"] = package.loaded["data-out"] or true
--- original size: 530, stripped down to: 470
+-- original size: 551, stripped down to: 470
if not modules then modules={} end modules ['data-out']={
version=1.001,
@@ -23616,7 +24109,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-fil"] = package.loaded["data-fil"] or true
--- original size: 3863, stripped down to: 3170
+-- original size: 4365, stripped down to: 3588
if not modules then modules={} end modules ['data-fil']={
version=1.001,
@@ -23625,39 +24118,46 @@ if not modules then modules={} end modules ['data-fil']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local ioopen=io.open
+local isdir=lfs.isdir
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_files=logs.reporter("resolvers","files")
local resolvers=resolvers
local resolveprefix=resolvers.resolve
-local finders,openers,loaders,savers=resolvers.finders,resolvers.openers,resolvers.loaders,resolvers.savers
-local locators,hashers,generators,concatinators=resolvers.locators,resolvers.hashers,resolvers.generators,resolvers.concatinators
+local findfile=resolvers.findfile
+local scanfiles=resolvers.scanfiles
+local registerfilehash=resolvers.registerfilehash
+local appendhash=resolvers.appendhash
+local loadcachecontent=caches.loadcontent
local checkgarbage=utilities.garbagecollector and utilities.garbagecollector.check
-function locators.file(specification)
+function resolvers.locators.file(specification)
local filename=specification.filename
local realname=resolveprefix(filename)
- if realname and realname~='' and lfs.isdir(realname) then
+ if realname and realname~='' and isdir(realname) then
if trace_locating then
report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',filename,true)
+ appendhash('file',filename,true)
elseif trace_locating then
report_files("file locator %a not found",filename)
end
end
-function hashers.file(specification)
+function resolvers.hashers.file(specification)
local pathname=specification.filename
- local content=caches.loadcontent(pathname,'files')
- resolvers.registerfilehash(pathname,content,content==nil)
+ local content=loadcachecontent(pathname,'files')
+ registerfilehash(pathname,content,content==nil)
end
-function generators.file(specification)
+function resolvers.generators.file(specification)
local pathname=specification.filename
- local content=resolvers.scanfiles(pathname,false,true)
- resolvers.registerfilehash(pathname,content,true)
+ local content=scanfiles(pathname,false,true)
+ registerfilehash(pathname,content,true)
end
-concatinators.file=file.join
+resolvers.concatinators.file=file.join
+local finders=resolvers.finders
+local notfound=finders.notfound
function finders.file(specification,filetype)
local filename=specification.filename
- local foundname=resolvers.findfile(filename,filetype)
+ local foundname=findfile(filename,filetype)
if foundname and foundname~="" then
if trace_locating then
report_files("file finder: %a found",filename)
@@ -23667,37 +24167,55 @@ function finders.file(specification,filetype)
if trace_locating then
report_files("file finder: %a not found",filename)
end
- return finders.notfound()
+ return notfound()
end
end
-function openers.helpers.textopener(tag,filename,f)
+local openers=resolvers.openers
+local notfound=openers.notfound
+local overloaded=false
+local function textopener(tag,filename,f)
return {
- reader=function() return f:read () end,
- close=function() logs.show_close(filename) return f:close() end,
+ reader=function() return f:read () end,
+ close=function() return f:close() end,
}
end
+function openers.helpers.textopener(...)
+ return textopener(...)
+end
+function openers.helpers.settextopener(opener)
+ if overloaded then
+ report_files("file opener: %s overloaded","already")
+ else
+ if trace_locating then
+ report_files("file opener: %s overloaded","once")
+ end
+ overloaded=true
+ textopener=opener
+ end
+end
function openers.file(specification,filetype)
local filename=specification.filename
if filename and filename~="" then
- local f=io.open(filename,"r")
+ local f=ioopen(filename,"r")
if f then
if trace_locating then
report_files("file opener: %a opened",filename)
end
- return openers.helpers.textopener("file",filename,f)
+ return textopener("file",filename,f)
end
end
if trace_locating then
report_files("file opener: %a not found",filename)
end
- return openers.notfound()
+ return notfound()
end
+local loaders=resolvers.loaders
+local notfound=loaders.notfound
function loaders.file(specification,filetype)
local filename=specification.filename
if filename and filename~="" then
- local f=io.open(filename,"rb")
+ local f=ioopen(filename,"rb")
if f then
- logs.show_load(filename)
if trace_locating then
report_files("file loader: %a loaded",filename)
end
@@ -23714,7 +24232,7 @@ function loaders.file(specification,filetype)
if trace_locating then
report_files("file loader: %a not found",filename)
end
- return loaders.notfound()
+ return notfound()
end
@@ -23724,7 +24242,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-con"] = package.loaded["data-con"] or true
--- original size: 5029, stripped down to: 3432
+-- original size: 5388, stripped down to: 3685
if not modules then modules={} end modules ['data-con']={
version=1.100,
@@ -23733,6 +24251,7 @@ if not modules then modules={} end modules ['data-con']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local setmetatable=setmetatable
local format,lower,gsub=string.format,string.lower,string.gsub
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local trace_containers=false trackers.register("resolvers.containers",function(v) trace_containers=v end)
@@ -23740,16 +24259,21 @@ local trace_storage=false trackers.register("resolvers.storage",function(v) tra
containers=containers or {}
local containers=containers
containers.usecache=true
+local getwritablepath=caches.getwritablepath
+local getreadablepaths=caches.getreadablepaths
+local cacheiswritable=caches.is_writable
+local loaddatafromcache=caches.loaddata
+local savedataincache=caches.savedata
local report_containers=logs.reporter("resolvers","containers")
local allocated={}
local mt={
__index=function(t,k)
if k=="writable" then
- local writable=caches.getwritablepath(t.category,t.subcategory) or { "." }
+ local writable=getwritablepath(t.category,t.subcategory) or { "." }
t.writable=writable
return writable
elseif k=="readables" then
- local readables=caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ local readables=getreadablepaths(t.category,t.subcategory) or { "." }
t.readables=readables
return readables
end
@@ -23780,7 +24304,7 @@ function containers.define(category,subcategory,version,enabled)
end
end
function containers.is_usable(container,name)
- return container.enabled and caches and caches.is_writable(container.writable,name)
+ return container.enabled and caches and cacheiswritable(container.writable,name)
end
function containers.is_valid(container,name)
if name and name~="" then
@@ -23794,7 +24318,7 @@ function containers.read(container,name)
local storage=container.storage
local stored=storage[name]
if not stored and container.enabled and caches and containers.usecache then
- stored=caches.loaddata(container.readables,name,container.writable)
+ stored=loaddatafromcache(container.readables,name,container.writable)
if stored and stored.cache_version==container.version then
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","load",container.subcategory,name)
@@ -23810,17 +24334,20 @@ function containers.read(container,name)
end
return stored
end
-function containers.write(container,name,data)
+function containers.write(container,name,data,fast)
if data then
data.cache_version=container.version
if container.enabled and caches then
- local unique,shared=data.unique,data.shared
- data.unique,data.shared=nil,nil
- caches.savedata(container.writable,name,data)
+ local unique=data.unique
+ local shared=data.shared
+ data.unique=nil
+ data.shared=nil
+ savedataincache(container.writable,name,data,fast)
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","save",container.subcategory,name)
end
- data.unique,data.shared=unique,shared
+ data.unique=unique
+ data.shared=shared
end
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","store",container.subcategory,name)
@@ -23843,7 +24370,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-use"] = package.loaded["data-use"] or true
--- original size: 4434, stripped down to: 3180
+-- original size: 5790, stripped down to: 2910
if not modules then modules={} end modules ['data-use']={
version=1.001,
@@ -23852,40 +24379,11 @@ if not modules then modules={} end modules ['data-use']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local format,lower,gsub,find=string.format,string.lower,string.gsub,string.find
+local format=string.format
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_mounts=logs.reporter("resolvers","mounts")
local resolvers=resolvers
-resolvers.automounted=resolvers.automounted or {}
-function resolvers.automount(usecache)
- local mountpaths=resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
- if (not mountpaths or #mountpaths==0) and usecache then
- mountpaths=caches.getreadablepaths("mount")
- end
- if mountpaths and #mountpaths>0 then
- resolvers.starttiming()
- for k=1,#mountpaths do
- local root=mountpaths[k]
- local f=io.open(root.."/url.tmi")
- if f then
- for line in f:lines() do
- if line then
- if find(line,"^[%%#%-]") then
- elseif find(line,"^zip://") then
- if trace_locating then
- report_mounts("mounting %a",line)
- end
- table.insert(resolvers.automounted,line)
- resolvers.usezipfile(line)
- end
- end
- end
- f:close()
- end
- end
- resolvers.stoptiming()
- end
-end
+local findfile=resolvers.findfile
statistics.register("used config file",function() return caches.configfiles() end)
statistics.register("used cache path",function() return caches.usedpaths() end)
function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner)
@@ -23895,9 +24393,11 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner)
local luvdata={
enginebanner=enginebanner,
formatbanner=formatbanner,
- sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"),
+ sourcehash=md5.hex(io.loaddata(findfile(sourcefile)) or "unknown"),
sourcefile=sourcefile,
luaversion=LUAVERSION,
+ formatid=LUATEXFORMATID,
+ functionality=LUATEXFUNCTIONALITY,
}
io.savedata(luvname,table.serialize(luvdata,true))
lua.registerfinalizer(function()
@@ -23917,7 +24417,7 @@ function statistics.checkfmtstatus(texname)
if lfs.isfile(luvname) then
local luv=dofile(luvname)
if luv and luv.sourcefile then
- local sourcehash=md5.hex(io.loaddata(resolvers.findfile(luv.sourcefile)) or "unknown")
+ local sourcehash=md5.hex(io.loaddata(findfile(luv.sourcefile)) or "unknown")
local luvbanner=luv.enginebanner or "?"
if luvbanner~=enginebanner then
return format("engine mismatch (luv: %s <> bin: %s)",luvbanner,enginebanner)
@@ -23927,8 +24427,19 @@ function statistics.checkfmtstatus(texname)
return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash)
end
local luvluaversion=luv.luaversion or 0
- if luvluaversion~=LUAVERSION then
- return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION)
+ local engluaversion=LUAVERSION or 0
+ if luvluaversion~=engluaversion then
+ return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,engluaversion)
+ end
+ local luvfunctionality=luv.functionality or 0
+ local engfunctionality=status.development_id or 0
+ if luvfunctionality~=engfunctionality then
+ return format("functionality mismatch (luv: %s <> bin: %s)",luvfunctionality,engfunctionality)
+ end
+ local luvformatid=luv.formatid or 0
+ local engformatid=status.format_id or 0
+ if luvformatid~=engformatid then
+ return format("formatid mismatch (luv: %s <> bin: %s)",luvformatid,engformatid)
end
else
return "invalid status file"
@@ -23947,7 +24458,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 10263, stripped down to: 7556
+-- original size: 10725, stripped down to: 7949
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -23960,6 +24471,14 @@ local format,find,match=string.format,string.find,string.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_zip=logs.reporter("resolvers","zip")
local resolvers=resolvers
+local findfile=resolvers.findfile
+local registerfile=resolvers.registerfile
+local splitmethod=resolvers.splitmethod
+local prependhash=resolvers.prependhash
+local starttiming=resolvers.starttiming
+local extendtexmf=resolvers.extendtexmfvariable
+local stoptiming=resolvers.stoptiming
+local urlquery=url.query
zip=zip or {}
local zip=zip
local archives=zip.archives or {}
@@ -23974,8 +24493,9 @@ if zipfiles then
closezip=zipfiles.close
validfile=zipfiles.found
wholefile=zipfiles.unzip
+ local listzip=zipfiles.list
traversezip=function(zfile)
- return ipairs(zipfiles.list(zfile))
+ return ipairs(listzip(zfile))
end
local streams=utilities.streams
local openstream=streams.open
@@ -24032,28 +24552,30 @@ local function validzip(str)
return str
end
end
-function zip.openarchive(name)
+local function openarchive(name)
if not name or name=="" then
return nil
else
local arch=archives[name]
if not arch then
- local full=resolvers.findfile(name) or ""
+ local full=findfile(name) or ""
arch=full~="" and openzip(full) or false
archives[name]=arch
end
return arch
end
end
-function zip.closearchive(name)
+local function closearchive(name)
if not name or (name=="" and archives[name]) then
closezip(archives[name])
archives[name]=nil
end
end
+zip.openarchive=openarchive
+zip.closearchive=closearchive
function resolvers.locators.zip(specification)
local archive=specification.filename
- local zipfile=archive and archive~="" and zip.openarchive(archive)
+ local zipfile=archive and archive~="" and openarchive(archive)
if trace_locating then
if zipfile then
report_zip("locator: archive %a found",archive)
@@ -24062,13 +24584,6 @@ function resolvers.locators.zip(specification)
end
end
end
-function resolvers.hashers.zip(specification)
- local archive=specification.filename
- if trace_locating then
- report_zip("loading file %a",archive)
- end
- resolvers.usezipfile(specification.original)
-end
function resolvers.concatinators.zip(zipfile,path,name)
if not path or path=="" then
return format('%s?name=%s',zipfile,name)
@@ -24076,14 +24591,16 @@ function resolvers.concatinators.zip(zipfile,path,name)
return format('%s?name=%s/%s',zipfile,path,name)
end
end
-function resolvers.finders.zip(specification)
+local finders=resolvers.finders
+local notfound=finders.notfound
+function finders.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("finder: archive %a found",archive)
@@ -24104,16 +24621,19 @@ function resolvers.finders.zip(specification)
if trace_locating then
report_zip("finder: %a not found",original)
end
- return resolvers.finders.notfound()
+ return notfound()
end
-function resolvers.openers.zip(specification)
+local openers=resolvers.openers
+local notfound=openers.notfound
+local textopener=openers.helpers.textopener
+function openers.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("opener; archive %a opened",archive)
@@ -24123,7 +24643,7 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: file %a found",queryname)
end
- return resolvers.openers.helpers.textopener('zip',original,handle)
+ return textopener('zip',original,handle)
elseif trace_locating then
report_zip("opener: file %a not found",queryname)
end
@@ -24135,23 +24655,24 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: %a not found",original)
end
- return resolvers.openers.notfound()
+ return notfound()
end
-function resolvers.loaders.zip(specification)
+local loaders=resolvers.loaders
+local notfound=loaders.notfound
+function loaders.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("loader: archive %a opened",archive)
end
local data=wholefile(zfile,queryname)
if data then
- logs.show_load(original)
if trace_locating then
report_zip("loader; file %a loaded",original)
end
@@ -24167,47 +24688,24 @@ function resolvers.loaders.zip(specification)
if trace_locating then
report_zip("loader: %a not found",original)
end
- return resolvers.openers.notfound()
-end
-function resolvers.usezipfile(archive)
- local specification=resolvers.splitmethod(archive)
- local archive=specification.filename
- if archive and not registeredfiles[archive] then
- local z=zip.openarchive(archive)
- if z then
- local tree=url.query(specification.query).tree or ""
- if trace_locating then
- report_zip("registering: archive %a",archive)
- end
- resolvers.starttiming()
- resolvers.prependhash('zip',archive)
- resolvers.extendtexmfvariable(archive)
- registeredfiles[archive]=z
- resolvers.registerfilehash(archive,resolvers.registerzipfile(z,tree))
- resolvers.stoptiming()
- elseif trace_locating then
- report_zip("registering: unknown archive %a",archive)
- end
- elseif trace_locating then
- report_zip("registering: archive %a not found",archive)
- end
+ return notfound()
end
-function resolvers.registerzipfile(z,tree)
+local function registerzipfile(z,tree)
local names={}
local files={}
local remap={}
local n=0
local filter=tree=="" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
- local register=resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
+ starttiming()
for i in traversezip(z) do
local filename=i.filename
local path,name=match(filename,filter)
if not path then
n=n+1
- register(names,filename,"")
+ registerfile(names,filename,"")
local usedname=lower(filename)
files[usedname]=""
if usedname~=filename then
@@ -24224,12 +24722,43 @@ function resolvers.registerzipfile(z,tree)
else
end
end
+ stoptiming()
report_zip("registering: %s files registered",n)
return {
files=files,
remap=remap,
}
end
+local function usezipfile(archive)
+ local specification=splitmethod(archive)
+ local archive=specification.filename
+ if archive and not registeredfiles[archive] then
+ local z=openarchive(archive)
+ if z then
+ local tree=urlquery(specification.query).tree or ""
+ if trace_locating then
+ report_zip("registering: archive %a",archive)
+ end
+ prependhash('zip',archive)
+ extendtexmf(archive)
+ registeredfiles[archive]=z
+ registerfilehash(archive,registerzipfile(z,tree))
+ elseif trace_locating then
+ report_zip("registering: unknown archive %a",archive)
+ end
+ elseif trace_locating then
+ report_zip("registering: archive %a not found",archive)
+ end
+end
+resolvers.usezipfile=usezipfile
+resolvers.registerzipfile=registerzipfile
+function resolvers.hashers.zip(specification)
+ local archive=specification.filename
+ if trace_locating then
+ report_zip("loading file %a",archive)
+ end
+ usezipfile(specification.original)
+end
end -- of closure
@@ -24238,7 +24767,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tre"] = package.loaded["data-tre"] or true
--- original size: 8478, stripped down to: 5223
+-- original size: 10802, stripped down to: 6619
if not modules then modules={} end modules ['data-tre']={
version=1.001,
@@ -24247,180 +24776,255 @@ if not modules then modules={} end modules ['data-tre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local type=type
local find,gsub,lower=string.find,string.gsub,string.lower
-local basename,dirname,joinname=file.basename,file.dirname,file .join
+local basename,dirname,joinname=file.basename,file.dirname,file.join
local globdir,isdir,isfile=dir.glob,lfs.isdir,lfs.isfile
local P,lpegmatch=lpeg.P,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_trees=logs.reporter("resolvers","trees")
local resolvers=resolvers
-local resolveprefix=resolvers.resolve
-local notfound=resolvers.finders.notfound
-local lookup=resolvers.get_from_content
-local collectors={}
-local found={}
-function resolvers.finders.tree(specification)
- local spec=specification.filename
- local okay=found[spec]
- if okay==nil then
- if spec~="" then
- local path=dirname(spec)
- local name=basename(spec)
- if path=="" then
- path="."
- end
- local names=collectors[path]
- if not names then
- local pattern=find(path,"/%*+$") and path or (path.."/*")
- names=globdir(pattern)
- collectors[path]=names
- end
- local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
- for i=1,#names do
- local fullname=names[i]
- if find(fullname,pattern) then
- found[spec]=fullname
- return fullname
- end
- end
- local pattern=lower(pattern)
- for i=1,#names do
- local fullname=lower(names[i])
- if find(fullname,pattern) then
- if isfile(fullname) then
+local finders=resolvers.finders
+local openers=resolvers.openers
+local loaders=resolvers.loaders
+local locators=resolvers.locators
+local hashers=resolvers.hashers
+local generators=resolvers.generators
+do
+ local collectors={}
+ local found={}
+ local notfound=finders.notfound
+ function finders.tree(specification)
+ local spec=specification.filename
+ local okay=found[spec]
+ if okay==nil then
+ if spec~="" then
+ local path=dirname(spec)
+ local name=basename(spec)
+ if path=="" then
+ path="."
+ end
+ local names=collectors[path]
+ if not names then
+ local pattern=find(path,"/%*+$") and path or (path.."/*")
+ names=globdir(pattern)
+ collectors[path]=names
+ end
+ local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
+ for i=1,#names do
+ local fullname=names[i]
+ if find(fullname,pattern) then
found[spec]=fullname
return fullname
- else
- break
+ end
+ end
+ local pattern=lower(pattern)
+ for i=1,#names do
+ local fullname=lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec]=fullname
+ return fullname
+ else
+ break
+ end
end
end
end
+ okay=notfound()
+ found[spec]=okay
end
- okay=notfound()
- found[spec]=okay
+ return okay
end
- return okay
end
-function resolvers.locators.tree(specification)
- local name=specification.filename
- local realname=resolveprefix(name)
- if realname and realname~='' and isdir(realname) then
- if trace_locating then
- report_trees("locator %a found",realname)
+do
+ local resolveprefix=resolvers.resolve
+ local appendhash=resolvers.appendhash
+ local function dolocate(specification)
+ local name=specification.filename
+ local realname=resolveprefix(name)
+ if realname and realname~='' and isdir(realname) then
+ if trace_locating then
+ report_trees("locator %a found",realname)
+ end
+ appendhash('tree',name,false)
+ elseif trace_locating then
+ report_trees("locator %a not found",name)
end
- resolvers.appendhash('tree',name,false)
- elseif trace_locating then
- report_trees("locator %a not found",name)
end
+ locators.tree=dolocate
+ locators.dirlist=dolocate
+ locators.dirfile=dolocate
end
-function resolvers.hashers.tree(specification)
- local name=specification.filename
- if trace_locating then
- report_trees("analyzing %a",name)
- end
- resolvers.methodhandler("hashers",name)
- resolvers.generators.file(specification)
-end
-local collectors={}
-local splitter=lpeg.splitat("/**/")
-local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
-table.setmetatableindex(collectors,function(t,k)
- local rootname=lpegmatch(stripper,k)
- local dataname=joinname(rootname,"dirlist")
- local content=caches.loadcontent(dataname,"files",dataname)
- if not content then
- content=resolvers.scanfiles(rootname,nil,nil,false,true)
- caches.savecontent(dataname,"files",content,dataname)
- end
- t[k]=content
- return content
-end)
-local function checked(root,p,n)
- if p then
- if type(p)=="table" then
- for i=1,#p do
- local fullname=joinname(root,p[i],n)
+do
+ local filegenerator=generators.file
+ generators.dirlist=filegenerator
+ generators.dirfile=filegenerator
+end
+do
+ local filegenerator=generators.file
+ local methodhandler=resolvers.methodhandler
+ local function dohash(specification)
+ local name=specification.filename
+ if trace_locating then
+ report_trees("analyzing %a",name)
+ end
+ methodhandler("hashers",name)
+ filegenerator(specification)
+ end
+ hashers.tree=dohash
+ hashers.dirlist=dohash
+ hashers.dirfile=dohash
+end
+local resolve do
+ local collectors={}
+ local splitter=lpeg.splitat("/**/")
+ local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
+ local loadcontent=caches.loadcontent
+ local savecontent=caches.savecontent
+ local notfound=finders.notfound
+ local scanfiles=resolvers.scanfiles
+ local lookup=resolvers.get_from_content
+ table.setmetatableindex(collectors,function(t,k)
+ local rootname=lpegmatch(stripper,k)
+ local dataname=joinname(rootname,"dirlist")
+ local content=loadcontent(dataname,"files",dataname)
+ if not content then
+ content=scanfiles(rootname,nil,nil,false,true)
+ savecontent(dataname,"files",content,dataname)
+ end
+ t[k]=content
+ return content
+ end)
+ local function checked(root,p,n)
+ if p then
+ if type(p)=="table" then
+ for i=1,#p do
+ local fullname=joinname(root,p[i],n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ else
+ local fullname=joinname(root,p,n)
if isfile(fullname) then
return fullname
end
end
- else
- local fullname=joinname(root,p,n)
- if isfile(fullname) then
- return fullname
- end
end
+ return notfound()
end
- return notfound()
-end
-local function resolve(specification)
- local filename=specification.filename
- if filename~="" then
- local root,rest=lpegmatch(splitter,filename)
- if root and rest then
- local path,name=dirname(rest),basename(rest)
- if name~=rest then
- local content=collectors[root]
- local p,n=lookup(content,name)
- if not p then
- return notfound()
- end
- local pattern=".*/"..path.."$"
- local istable=type(p)=="table"
- if istable then
- for i=1,#p do
- local pi=p[i]
- if pi==path or find(pi,pattern) then
- local fullname=joinname(root,pi,n)
- if isfile(fullname) then
- return fullname
+ resolve=function(specification)
+ local filename=specification.filename
+ if filename~="" then
+ local root,rest=lpegmatch(splitter,filename)
+ if root and rest then
+ local path,name=dirname(rest),basename(rest)
+ if name~=rest then
+ local content=collectors[root]
+ local p,n=lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern=".*/"..path.."$"
+ local istable=type(p)=="table"
+ if istable then
+ for i=1,#p do
+ local pi=p[i]
+ if pi==path or find(pi,pattern) then
+ local fullname=joinname(root,pi,n)
+ if isfile(fullname) then
+ return fullname
+ end
end
end
+ elseif p==path or find(p,pattern) then
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
end
- elseif p==path or find(p,pattern) then
- local fullname=joinname(root,p,n)
- if isfile(fullname) then
- return fullname
+ local queries=specification.queries
+ if queries and queries.option=="fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
end
end
- local queries=specification.queries
- if queries and queries.option=="fileonly" then
- return checked(root,p,n)
- else
- return notfound()
- end
+ end
+ local path=dirname(filename)
+ local name=basename(filename)
+ local root=lpegmatch(stripper,path)
+ local content=collectors[path]
+ local p,n=lookup(content,name)
+ if p then
+ return checked(root,p,n)
end
end
- local path,name=dirname(filename),basename(filename)
- local root=lpegmatch(stripper,path)
- local content=collectors[path]
- local p,n=lookup(content,name)
- if p then
- return checked(root,p,n)
+ return notfound()
+ end
+ finders.dirlist=resolve
+ function finders.dirfile(specification)
+ local queries=specification.queries
+ if queries then
+ queries.option="fileonly"
+ else
+ specification.queries={ option="fileonly" }
end
+ return resolve(specification)
end
- return notfound()
end
-resolvers.finders .dirlist=resolve
-resolvers.locators .dirlist=resolvers.locators .tree
-resolvers.hashers .dirlist=resolvers.hashers .tree
-resolvers.generators.dirlist=resolvers.generators.file
-resolvers.openers .dirlist=resolvers.openers .file
-resolvers.loaders .dirlist=resolvers.loaders .file
-function resolvers.finders.dirfile(specification)
- local queries=specification.queries
- if queries then
- queries.option="fileonly"
- else
- specification.queries={ option="fileonly" }
+do
+ local fileopener=openers.file
+ local fileloader=loaders.file
+ openers.dirlist=fileopener
+ loaders.dirlist=fileloader
+ openers.dirfile=fileopener
+ loaders.dirfile=fileloader
+end
+do
+ local hashfile="dirhash.lua"
+ local kind="HASH256"
+ local version=1.0
+ local loadtable=table.load
+ local savetable=table.save
+ local loaddata=io.loaddata
+ function resolvers.dirstatus(patterns)
+ local t=type(patterns)
+ if t=="string" then
+ patterns={ patterns }
+ elseif t~="table" then
+ return false
+ end
+ local status=loadtable(hashfile)
+ if not status or status.version~=version or status.kind~=kind then
+ status={
+ version=1.0,
+ kind=kind,
+ hashes={},
+ }
+ end
+ local hashes=status.hashes
+ local changed={}
+ local action=sha2[kind]
+ local update={}
+ for i=1,#patterns do
+ local pattern=patterns[i]
+ local files=globdir(pattern)
+ for i=1,#files do
+ local name=files[i]
+ local hash=action(loaddata(name))
+ if hashes[name]~=hash then
+ changed[#changed+1]=name
+ end
+ update[name]=hash
+ end
+ end
+ status.hashes=update
+ savetable(hashfile,status)
+ return #changed>0 and changed or false
end
- return resolve(specification)
end
-resolvers.locators .dirfile=resolvers.locators .dirlist
-resolvers.hashers .dirfile=resolvers.hashers .dirlist
-resolvers.generators.dirfile=resolvers.generators.dirlist
-resolvers.openers .dirfile=resolvers.openers .dirlist
-resolvers.loaders .dirfile=resolvers.loaders .dirlist
end -- of closure
@@ -24429,7 +25033,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-sch"] = package.loaded["data-sch"] or true
--- original size: 6753, stripped down to: 5268
+-- original size: 6945, stripped down to: 5408
if not modules then modules={} end modules ['data-sch']={
version=1.001,
@@ -24439,8 +25043,11 @@ if not modules then modules={} end modules ['data-sch']={
license="see context related readme files"
}
local load,tonumber=load,tonumber
-local gsub,concat,format=string.gsub,table.concat,string.format
+local gsub,format=string.gsub,string.format
+local sortedhash,concat=table.sortedhash,table.concat
local finders,openers,loaders=resolvers.finders,resolvers.openers,resolvers.loaders
+local addsuffix,suffix,splitbase=file.addsuffix,file.suffix,file.splitbase
+local md5hex=md5.hex
local trace_schemes=false trackers.register("resolvers.schemes",function(v) trace_schemes=v end)
local report_schemes=logs.reporter("resolvers","schemes")
local http=require("socket.http")
@@ -24457,7 +25064,7 @@ function cleaners.none(specification)
return specification.original
end
function cleaners.strip(specification)
- local path,name=file.splitbase(specification.original)
+ local path,name=splitbase(specification.original)
if path=="" then
return (gsub(name,"[^%a%d%.]+","-"))
else
@@ -24465,7 +25072,7 @@ function cleaners.strip(specification)
end
end
function cleaners.md5(specification)
- return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
+ return addsuffix(md5hex(specification.original),suffix(specification.path))
end
local cleaner=cleaners.strip
directives.register("schemes.cleanmethod",function(v) cleaner=cleaners[v] or cleaners.strip end)
@@ -24485,7 +25092,7 @@ local runner=sandbox.registerrunner {
name="curl resolver",
method="execute",
program="curl",
- template="--silent --insecure --create-dirs --output %cachename% %original%",
+ template='--silent --insecure --create-dirs --output "%cachename%" "%original%"',
checkers={
cachename="cache",
original="url",
@@ -24556,10 +25163,10 @@ end
schemes.install=install
local function http_handler(specification,cachename)
local tempname=cachename..".tmp"
- local f=io.open(tempname,"wb")
+ local handle=io.open(tempname,"wb")
local status,message=http.request {
url=specification.original,
- sink=ltn12.sink.file(f)
+ sink=ltn12.sink.file(handle)
}
if not status then
os.remove(tempname)
@@ -24574,13 +25181,13 @@ install('https')
install('ftp')
statistics.register("scheme handling time",function()
local l,r,nl,nr={},{},0,0
- for k,v in table.sortedhash(loaded) do
+ for k,v in sortedhash(loaded) do
if v>0 then
nl=nl+1
l[nl]=k..":"..v
end
end
- for k,v in table.sortedhash(reused) do
+ for k,v in sortedhash(reused) do
if v>0 then
nr=nr+1
r[nr]=k..":"..v
@@ -24588,10 +25195,10 @@ statistics.register("scheme handling time",function()
end
local n=nl+nr
if n>0 then
- l=nl>0 and concat(l) or "none"
- r=nr>0 and concat(r) or "none"
+ if nl==0 then l={ "none" } end
+ if nr==0 then r={ "none" } end
return format("%s seconds, %s processed, threshold %s seconds, loaded: %s, reused: %s",
- statistics.elapsedtime(schemes),n,threshold,l,r)
+ statistics.elapsedtime(schemes),n,threshold,concat(l," "),concat(l," "))
else
return nil
end
@@ -24624,7 +25231,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lua"] = package.loaded["data-lua"] or true
--- original size: 4207, stripped down to: 3041
+-- original size: 4227, stripped down to: 3049
if not modules then modules={} end modules ['data-lua']={
version=1.001,
@@ -24634,8 +25241,7 @@ if not modules then modules={} end modules ['data-lua']={
license="see context related readme files"
}
local package,lpeg=package,lpeg
-local gsub=string.gsub
-local concat=table.concat
+local loadfile=loadfile
local addsuffix=file.addsuffix
local P,S,Cs,lpegmatch=lpeg.P,lpeg.S,lpeg.Cs,lpeg.match
local luasuffixes={ 'tex','lua' }
@@ -24646,6 +25252,8 @@ local helpers=package.helpers or {}
local methods=helpers.methods or {}
local resolvers=resolvers
local resolveprefix=resolvers.resolve
+local expandedpaths=resolvers.expandedpathlistfromvariable
+local findfile=resolvers.findfile
helpers.report=logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries",function(v) helpers.trace=v end)
trackers.register("resolvers.locating",function(v) helpers.trace=v end)
@@ -24674,7 +25282,7 @@ local function getluaformatpaths()
if not luaformatpaths then
luaformatpaths={}
for i=1,#luaformats do
- registerpath("lua format","lua",luaformatpaths,resolvers.expandedpathlistfromvariable(luaformats[i]))
+ registerpath("lua format","lua",luaformatpaths,expandedpaths(luaformats[i]))
end
end
return luaformatpaths
@@ -24683,7 +25291,7 @@ local function getlibformatpaths()
if not libformatpaths then
libformatpaths={}
for i=1,#libformats do
- registerpath("lib format","lib",libformatpaths,resolvers.expandedpathlistfromvariable(libformats[i]))
+ registerpath("lib format","lib",libformatpaths,expandedpaths(libformats[i]))
end
end
return libformatpaths
@@ -24693,7 +25301,7 @@ local function loadedbyformat(name,rawname,suffixes,islib,what)
local report=helpers.report
for i=1,#suffixes do
local format=suffixes[i]
- local resolved=resolvers.findfile(name,format) or ""
+ local resolved=findfile(name,format) or ""
if trace then
report("%s format, identifying %a using format %a",what,name,format)
end
@@ -24731,7 +25339,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-aux"] = package.loaded["data-aux"] or true
--- original size: 2452, stripped down to: 1877
+-- original size: 2610, stripped down to: 2019
if not modules then modules={} end modules ['data-aux']={
version=1.001,
@@ -24742,24 +25350,28 @@ if not modules then modules={} end modules ['data-aux']={
}
local find=string.find
local type,next=type,next
+local addsuffix,removesuffix=file.addsuffix,file.removesuffix
+local loaddata,savedata=io.loaddata,io.savedata
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local resolvers=resolvers
+local cleanpath=resolvers.cleanpath
+local findfiles=resolvers.findfiles
local report_scripts=logs.reporter("resolvers","scripts")
function resolvers.updatescript(oldname,newname)
local scriptpath="context/lua"
- newname=file.addsuffix(newname,"lua")
- local oldscript=resolvers.cleanpath(oldname)
+ local oldscript=cleanpath(oldname)
+ local newname=addsuffix(newname,"lua")
+ local newscripts=findfiles(newname) or {}
if trace_locating then
report_scripts("to be replaced old script %a",oldscript)
end
- local newscripts=resolvers.findfiles(newname) or {}
if #newscripts==0 then
if trace_locating then
report_scripts("unable to locate new script")
end
else
for i=1,#newscripts do
- local newscript=resolvers.cleanpath(newscripts[i])
+ local newscript=cleanpath(newscripts[i])
if trace_locating then
report_scripts("checking new script %a",newscript)
end
@@ -24771,17 +25383,17 @@ function resolvers.updatescript(oldname,newname)
if trace_locating then
report_scripts("new script should come from %a",scriptpath)
end
- elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
+ elseif not (find(oldscript,removesuffix(newname).."$") or find(oldscript,newname.."$")) then
if trace_locating then
report_scripts("invalid new script name")
end
else
- local newdata=io.loaddata(newscript)
+ local newdata=loaddata(newscript)
if newdata then
if trace_locating then
report_scripts("old script content replaced by new content: %s",oldscript)
end
- io.savedata(oldscript,newdata)
+ savedata(oldscript,newdata)
break
elseif trace_locating then
report_scripts("unable to load new script")
@@ -24854,7 +25466,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lst"] = package.loaded["data-lst"] or true
--- original size: 1823, stripped down to: 1542
+-- original size: 2038, stripped down to: 1696
if not modules then modules={} end modules ['data-lst']={
version=1.001,
@@ -24864,15 +25476,22 @@ if not modules then modules={} end modules ['data-lst']={
license="see context related readme files"
}
local type=type
-local concat,sortedhash=table.concat,table.sortedhash
+local sortedhash=table.sortedhash
+local isdir=lfs.isdir
local resolvers=resolvers
local listers=resolvers.listers or {}
resolvers.listers=listers
local resolveprefix=resolvers.resolve
+local configurationfiles=resolvers.configurationfiles
+local expandedpathfromlist=resolvers.expandedpathfromlist
+local splitpath=resolvers.splitpath
+local knownvariables=resolvers.knownvariables
local report_lists=logs.reporter("resolvers","lists")
local report_resolved=logs.reporter("system","resolved")
local function tabstr(str)
- if type(str)=='table' then
+ if not str then
+ return "unset"
+ elseif type(str)=='table' then
return concat(str," | ")
else
return str
@@ -24882,22 +25501,22 @@ function listers.variables(pattern)
local result=resolvers.knownvariables(pattern)
for key,value in sortedhash(result) do
report_lists(key)
- report_lists(" env: %s",tabstr(value.environment or "unset"))
- report_lists(" var: %s",tabstr(value.variable or "unset"))
- report_lists(" exp: %s",tabstr(value.expansion or "unset"))
- report_lists(" res: %s",tabstr(value.resolved or "unset"))
+ report_lists(" env: %s",tabstr(value.environment))
+ report_lists(" var: %s",tabstr(value.variable))
+ report_lists(" exp: %s",tabstr(value.expansion))
+ report_lists(" res: %s",tabstr(value.resolved))
end
end
function listers.configurations()
- local configurations=resolvers.configurationfiles()
+ local configurations=configurationfiles()
for i=1,#configurations do
report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
- local list=resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
+ local list=expandedpathfromlist(splitpath(resolvers.luacnfspec))
for i=1,#list do
local li=resolveprefix(list[i])
- if lfs.isdir(li) then
+ if isdir(li) then
report_resolved("path - %s",li)
else
report_resolved("path + %s",li)
@@ -24910,318 +25529,147 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-package.loaded["util-lib"] = package.loaded["util-lib"] or true
+package.loaded["libs-ini"] = package.loaded["libs-ini"] or true
--- original size: 16094, stripped down to: 8443
+-- original size: 5822, stripped down to: 3629
-if not modules then modules={} end modules ['util-lib']={
+if not modules then modules={} end modules ['libs-ini']={
version=1.001,
comment="companion to luat-lib.mkiv",
author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files",
+ license="see context related readme files"
}
+local type,unpack=type,unpack
local type=type
-local next=next
-local pcall=pcall
-local gsub=string.gsub
-local find=string.find
-local sort=table.sort
-local pathpart=file.pathpart
local nameonly=file.nameonly
local joinfile=file.join
-local removesuffix=file.removesuffix
local addsuffix=file.addsuffix
-local findfile=resolvers.findfile
-local findfiles=resolvers.findfiles
-local expandpaths=resolvers.expandedpathlistfromvariable
local qualifiedpath=file.is_qualified_path
local isfile=lfs.isfile
-local done=false
-local function locate(required,version,trace,report,action)
- if type(required)~="string" then
- report("provide a proper library name")
- return
- end
- if trace then
- report("requiring library %a with version %a",required,version or "any")
- end
- local found_library=nil
- local required_full=gsub(required,"%.","/")
- local required_path=pathpart(required_full)
- local required_base=nameonly(required_full)
- if qualifiedpath(required) then
- if isfile(addsuffix(required,os.libsuffix)) then
- if trace then
- report("qualified name %a found",required)
+local findfile=resolvers.findfile
+local expandpaths=resolvers.expandedpathlistfromvariable
+local report=logs.reporter("resolvers","libraries")
+local trace=false
+trackers.register("resolvers.lib",function(v) trace=v end)
+local function findlib(required)
+ local suffix=os.libsuffix or "so"
+ if not qualifiedpath(required) then
+ local list=directives.value("system.librarynames" )
+ local only=nameonly(required)
+ if type(list)=="table" then
+ list=list[only]
+ if type(list)~="table" then
+ list={ only }
end
- found_library=required
else
- if trace then
- report("qualified name %a not found",required)
- end
+ list={ only }
end
- else
- local required_name=required_base.."."..os.libsuffix
- local version=type(version)=="string" and version~="" and version or false
- local engine="luatex"
- if trace and not done then
- local list=expandpaths("lib")
- for i=1,#list do
- report("tds path %i: %s",i,list[i])
- end
- end
- local function found(locate,asked_library,how,...)
- if trace then
- report("checking %s: %a",how,asked_library)
- end
- return locate(asked_library,...)
+ if trace then
+ report("using lookup list for library %a: % | t",only,list)
end
- local function check(locate,...)
- local found=nil
- if version then
- local asked_library=joinfile(required_path,version,required_name)
- if trace then
- report("checking %s: %a","with version",asked_library)
- end
- found=locate(asked_library,...)
+ for i=1,#list do
+ local name=list[i]
+ local found=findfile(name,"lib")
+ if not found then
+ found=findfile(addsuffix(name,suffix),"lib")
end
- if not found or found=="" then
- local asked_library=joinfile(required_path,required_name)
+ if found then
if trace then
- report("checking %s: %a","with version",asked_library)
+ report("library %a resolved via %a path to %a",name,"tds lib",found)
end
- found=locate(asked_library,...)
- end
- return found and found~="" and found or false
- end
- local function attempt(checkpattern)
- if trace then
- report("checking tds lib paths strictly")
- end
- local found=findfile and check(findfile,"lib")
- if found and (not checkpattern or find(found,checkpattern)) then
return found
end
- if trace then
- report("checking tds lib paths with wildcard")
- end
- local asked_library=joinfile(required_path,".*",required_name)
- if trace then
- report("checking %s: %a","latest version",asked_library)
- end
- local list=findfiles(asked_library,"lib",true)
- if list and #list>0 then
- sort(list)
- local found=list[#list]
- if found and (not checkpattern or find(found,checkpattern)) then
- return found
- end
- end
- if trace then
- report("checking lib paths")
- end
- package.extralibpath(environment.ownpath)
- local paths=package.libpaths()
- local pattern="/[^/]+%."..os.libsuffix.."$"
- for i=1,#paths do
- required_path=gsub(paths[i],pattern,"")
- local found=check(lfs.isfound)
- if type(found)=="string" and (not checkpattern or find(found,checkpattern)) then
- return found
- end
- end
- return false
end
- if engine then
- if trace then
- report("attemp 1, engine %a",engine)
- end
- found_library=attempt("/"..engine.."/")
- if not found_library then
- if trace then
- report("attemp 2, no engine",asked_library)
+ if expandpaths then
+ local list=expandpaths("PATH")
+ local base=addsuffix(only,suffix)
+ for i=1,#list do
+ local full=joinfile(list[i],base)
+ local found=isfile(full) and full
+ if found then
+ if trace then
+ report("library %a resolved via %a path to %a",name,"system",found)
+ end
+ return found
end
- found_library=attempt()
end
- else
- found_library=attempt()
end
- end
- if not found_library then
+ elseif isfile(addsuffix(required,suffix)) then
if trace then
- report("not found: %a",required)
+ report("library with qualified name %a %sfound",required,"")
end
- library=false
+ return required
else
if trace then
- report("found: %a",found_library)
- end
- local result,message=action(found_library,required_base)
- if result then
- library=result
- else
- library=false
- report("load error: message %a, library %a",tostring(message or "unknown"),found_library or "no library")
+ report("library with qualified name %a %sfound",required,"not ")
end
end
- if trace then
- if not library then
- report("unknown library: %a",required)
- else
- report("stored library: %a",required)
- end
- end
- return library or nil
+ return false
end
-do
- local report_swiglib=logs.reporter("swiglib")
- local trace_swiglib=false
- local savedrequire=require
- local loadedlibs={}
- local loadlib=package.loadlib
- local pushdir=dir.push
- local popdir=dir.pop
- trackers.register("resolvers.swiglib",function(v) trace_swiglib=v end)
- function requireswiglib(required,version)
- local library=loadedlibs[library]
- if library==nil then
- local trace_swiglib=trace_swiglib or package.helpers.trace
- library=locate(required,version,trace_swiglib,report_swiglib,function(name,base)
- pushdir(pathpart(name))
- local opener="luaopen_"..base
- if trace_swiglib then
- report_swiglib("opening: %a with %a",name,opener)
- end
- local library,message=loadlib(name,opener)
- local libtype=type(library)
- if libtype=="function" then
- library=library()
+local foundlibraries=table.setmetatableindex(function(t,k)
+ local v=findlib(k)
+ t[k]=v
+ return v
+end)
+function resolvers.findlib(required)
+ return foundlibraries[required]
+end
+local libraries={}
+resolvers.libraries=libraries
+local report=logs.reporter("optional")
+if optional then optional.loaded={} end
+function libraries.validoptional(name)
+ local thelib=optional and optional[name]
+ if not thelib then
+ elseif thelib.initialize then
+ return thelib
+ else
+ report("invalid optional library %a",libname)
+ end
+end
+function libraries.optionalloaded(name,libnames)
+ local thelib=optional and optional[name]
+ if not thelib then
+ report("no optional %a library found",name)
+ else
+ local thelib_initialize=thelib.initialize
+ if not thelib_initialize then
+ report("invalid optional library %a",name)
+ else
+ if type(libnames)=="string" then
+ libnames={ libnames }
+ end
+ if type(libnames)=="table" then
+ for i=1,#libnames do
+ local libname=libnames[i]
+ local filename=foundlibraries[libname]
+ if filename then
+ libnames[i]=filename
+ else
+ report("unable to locate library %a",libname)
+ return
+ end
+ end
+ local initialized=thelib_initialize(unpack(libnames))
+ if initialized then
+ report("using library '% + t'",libnames)
else
- report_swiglib("load error: %a returns %a, message %a, library %a",opener,libtype,(string.gsub(message or "no message","[%s]+$","")),found_library or "no library")
- library=false
+ report("unable to initialize library '% + t'",libnames)
end
- popdir()
- return library
- end)
- loadedlibs[required]=library or false
- end
- return library
- end
- function require(name,version)
- if find(name,"^swiglib%.") then
- return requireswiglib(name,version)
- else
- return savedrequire(name)
- end
- end
- local swiglibs={}
- local initializer="core"
- function swiglib(name,version)
- local library=swiglibs[name]
- if not library then
- statistics.starttiming(swiglibs)
- if trace_swiglib then
- report_swiglib("loading %a",name)
- end
- if not find(name,"%."..initializer.."$") then
- fullname="swiglib."..name.."."..initializer
- else
- fullname="swiglib."..name
+ return initialized
end
- library=requireswiglib(fullname,version)
- swiglibs[name]=library
- statistics.stoptiming(swiglibs)
end
- return library
end
- statistics.register("used swiglibs",function()
- if next(swiglibs) then
- return string.format("%s, initial load time %s seconds",table.concat(table.sortedkeys(swiglibs)," "),statistics.elapsedtime(swiglibs))
- end
- end)
end
if FFISUPPORTED and ffi and ffi.load then
- local report_ffilib=logs.reporter("ffilib")
- local trace_ffilib=false
- local savedffiload=ffi.load
- trackers.register("resolvers.ffilib",function(v) trace_ffilib=v end)
- local loaded={}
- local function locateindeed(name)
- name=removesuffix(name)
- local l=loaded[name]
- if l==nil then
- local state,library=pcall(savedffiload,name)
- if type(library)=="userdata" then
- l=library
- elseif type(state)=="userdata" then
- l=state
- else
- l=false
- end
- loaded[name]=l
- elseif trace_ffilib then
- report_ffilib("reusing already loaded %a",name)
- end
- return l
- end
- local function getlist(required)
- local list=directives.value("system.librarynames" )
- if type(list)=="table" then
- list=list[required]
- if type(list)=="table" then
- if trace then
- report("using lookup list for library %a: % | t",required,list)
- end
- return list
- end
- end
- return { required }
- end
- function ffilib(name,version)
- name=removesuffix(name)
- local l=loaded[name]
- if l~=nil then
- if trace_ffilib then
- report_ffilib("reusing already loaded %a",name)
- end
- return l
- end
- local list=getlist(name)
- if version=="system" then
- for i=1,#list do
- local library=locateindeed(list[i])
- if type(library)=="userdata" then
- return library
- end
- end
- else
- for i=1,#list do
- local library=locate(list[i],version,trace_ffilib,report_ffilib,locateindeed)
- if type(library)=="userdata" then
- return library
- end
- end
- end
- end
+ local ffiload=ffi.load
function ffi.load(name)
- local list=getlist(name)
- for i=1,#list do
- local library=ffilib(list[i])
- if type(library)=="userdata" then
- return library
- end
- end
- if trace_ffilib then
- report_ffilib("trying to load %a using normal loader",name)
- end
- for i=1,#list do
- local state,library=pcall(savedffiload,list[i])
- if type(library)=="userdata" then
- return library
- elseif type(state)=="userdata" then
- return library
- end
+ local full=name and foundlibraries[name]
+ if full then
+ return ffiload(full)
+ else
+ return ffiload(name)
end
end
end
@@ -25336,7 +25784,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 9637, stripped down to: 7253
+-- original size: 13964, stripped down to: 10026
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -25350,16 +25798,14 @@ local concat=table.concat
local quoted=string.quoted
local luasuffixes=utilities.lua.suffixes
local report_format=logs.reporter("resolvers","formats")
-local function primaryflags()
- local arguments=environment.arguments
+local function primaryflags(arguments)
local flags={}
if arguments.silent then
flags[#flags+1]="--interaction=batchmode"
end
return concat(flags," ")
end
-local function secondaryflags()
- local arguments=environment.arguments
+local function secondaryflags(arguments)
local trackers=arguments.trackers
local directives=arguments.directives
local flags={}
@@ -25381,6 +25827,9 @@ local function secondaryflags()
if arguments.ansi then
flags[#flags+1]="--c:ansi"
end
+ if arguments.ansilog then
+ flags[#flags+1]="--c:ansilog"
+ end
if arguments.strip then
flags[#flags+1]="--c:strip"
end
@@ -25391,12 +25840,13 @@ local function secondaryflags()
end
local template=[[--ini %primaryflags% --lua=%luafile% %texfile% %secondaryflags% %dump% %redirect%]]
local checkers={
- primaryflags="string",
- secondaryflags="string",
+ primaryflags="verbose",
+ secondaryflags="verbose",
luafile="readable",
texfile="readable",
redirect="string",
dump="string",
+ binarypath="string",
}
local runners={
luatex=sandbox.registerrunner {
@@ -25421,46 +25871,88 @@ local runners={
reporter=report_format,
},
}
-function environment.make_format(name,arguments)
+local function validbinarypath()
+ if not environment.arguments.nobinarypath then
+ local path=environment.ownpath or file.dirname(environment.ownname)
+ if path and path~="" then
+ path=dir.expandname(path)
+ if path~="" and lfs.isdir(path) then
+ return path
+ end
+ end
+ end
+end
+function environment.make_format(formatname)
+ local arguments=environment.arguments
local engine=environment.ownmain or "luatex"
- local silent=environment.arguments.silent
- local errors=environment.arguments.errors
- local olddir=dir.current()
- local path=caches.getwritablepath("formats",engine) or ""
- if path~="" then
- lfs.chdir(path)
- end
- report_format("using format path %a",dir.current())
- local texsourcename=file.addsuffix(name,"mkiv")
- local fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ local silent=arguments.silent
+ local errors=arguments.errors
+ local texsourcename=""
+ local texsourcepath=""
+ local fulltexsourcename=""
+ if engine=="luametatex" then
+ texsourcename=file.addsuffix(formatname,"mkxl")
+ fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ end
+ if fulltexsourcename=="" then
+ texsourcename=file.addsuffix(formatname,"mkiv")
+ fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ end
if fulltexsourcename=="" then
- texsourcename=file.addsuffix(name,"tex")
+ texsourcename=file.addsuffix(formatname,"tex")
fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
end
if fulltexsourcename=="" then
- report_format("no tex source file with name %a (mkiv or tex)",name)
- lfs.chdir(olddir)
+ report_format("no tex source file with name %a (mkiv or tex)",formatname)
return
- else
- report_format("using tex source file %a",fulltexsourcename)
end
- local texsourcepath=dir.expandname(file.dirname(fulltexsourcename))
- local specificationname=file.replacesuffix(fulltexsourcename,"lus")
- local fullspecificationname=resolvers.findfile(specificationname,"tex") or ""
- if fullspecificationname=="" then
- specificationname=file.join(texsourcepath,"context.lus")
- fullspecificationname=resolvers.findfile(specificationname,"tex") or ""
+ report_format("using tex source file %a",fulltexsourcename)
+ fulltexsourcename=dir.expandname(fulltexsourcename)
+ texsourcepath=file.dirname(fulltexsourcename)
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
end
+ local specificationname="context.lus"
+ local specificationpath=""
+ local fullspecificationname=resolvers.findfile(specificationname) or ""
if fullspecificationname=="" then
- report_format("unknown stub specification %a",specificationname)
- lfs.chdir(olddir)
+ report_format("unable to locate specification file %a",specificationname)
+ return
+ end
+ report_format("using specification file %a",fullspecificationname)
+ fullspecificationname=dir.expandname(fullspecificationname)
+ specificationpath=file.dirname(fullspecificationname)
+ if texsourcepath~=specificationpath then
+ report_format("tex source file and specification file are on different paths")
+ return
+ end
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
+ end
+ if not lfs.isfile(fullspecificationname) then
+ report_format("no accessible specification file with name %a",fulltexsourcename)
+ return
+ end
+ report_format("using tex source path %a",texsourcepath)
+ local validformatpath=caches.getwritablepath("formats",engine) or ""
+ local startupdir=dir.current()
+ if validformatpath=="" then
+ report_format("invalid format path, insufficient write access")
+ return
+ end
+ local binarypath=validbinarypath()
+ report_format("changing to format path %a",validformatpath)
+ lfs.chdir(validformatpath)
+ if dir.current()~=validformatpath then
+ report_format("unable to change to format path %a",validformatpath)
return
end
- local specificationpath=file.dirname(fullspecificationname)
local usedluastub=nil
local usedlualibs=dofile(fullspecificationname)
if type(usedlualibs)=="string" then
- usedluastub=file.join(file.dirname(fullspecificationname),usedlualibs)
+ usedluastub=file.join(specificationpath,usedlualibs)
elseif type(usedlualibs)=="table" then
report_format("using stub specification %a",fullspecificationname)
local texbasename=file.basename(name)
@@ -25477,48 +25969,57 @@ function environment.make_format(name,arguments)
end
else
report_format("invalid stub specification %a",fullspecificationname)
- lfs.chdir(olddir)
+ lfs.chdir(startupdir)
return
end
+ local runner=runners[engine]
+ if not runner then
+ report_format("the format %a cannot be generated, no runner available for engine %a",name,engine)
+ lfs.chdir(startupdir)
+ return
+ end
+ local primaryflags=primaryflags(arguments)
+ local secondaryflags=secondaryflags(arguments)
local specification={
- primaryflags=primaryflags(),
- secondaryflags=secondaryflags(),
+ binarypath=binarypath,
+ primaryflags=primaryflags,
+ secondaryflags=secondaryflags,
luafile=quoted(usedluastub),
texfile=quoted(fulltexsourcename),
dump=os.platform=="unix" and "\\\\dump" or "\\dump",
}
- local runner=runners[engine]
- if not runner then
- report_format("format %a cannot be generated, no runner available for engine %a",name,engine)
- elseif silent then
- statistics.starttiming()
+ if silent then
specification.redirect="> temp.log"
- local result=runner(specification)
- local runtime=statistics.stoptiming()
- if result~=0 then
- print(format("%s silent make > fatal error when making format %q",engine,name))
- else
- print(format("%s silent make > format %q made in %.3f seconds",engine,name,runtime))
- end
+ end
+ statistics.starttiming()
+ local result=runner(specification)
+ local runtime=statistics.stoptiming()
+ if silent then
os.remove("temp.log")
- else
- runner(specification)
end
- local pattern=file.removesuffix(file.basename(usedluastub)).."-*.mem"
- local mp=dir.glob(pattern)
- if mp then
- for i=1,#mp do
- local name=mp[i]
- report_format("removing related mplib format %a",file.basename(name))
- os.remove(name)
+ report_format()
+ if binarypath and binarypath~="" then
+ report_format("binary path : %s",binarypath or "?")
end
- end
- lfs.chdir(olddir)
+ report_format("format path : %s",validformatpath)
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",usedluastub)
+ if primaryflags~="" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags~="" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("context file : %s",fulltexsourcename)
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result==0 and "okay" or "error")
+ report_format()
+ lfs.chdir(startupdir)
end
-local template=[[%flags% --fmt=%fmtfile% --lua=%luafile% %texfile% %more%]]
+local template=[[%primaryflags% --fmt=%fmtfile% --lua=%luafile% %texfile% %secondaryflags%]]
local checkers={
- flags="string",
- more="string",
+ primaryflags="verbose",
+ secondaryflags="verbose",
fmtfile="readable",
luafile="readable",
texfile="readable",
@@ -25531,6 +26032,13 @@ local runners={
checkers=checkers,
reporter=report_format,
},
+ luametatex=sandbox.registerrunner {
+ name="run luametatex format",
+ program="luametatex",
+ template=template,
+ checkers=checkers,
+ reporter=report_format,
+ },
luajittex=sandbox.registerrunner {
name="run luajittex format",
program="luajittex",
@@ -25539,51 +26047,78 @@ local runners={
reporter=report_format,
},
}
-function environment.run_format(name,data,more)
- if name and name~="" then
- local engine=environment.ownmain or "luatex"
- local barename=file.removesuffix(name)
- local fmtname=caches.getfirstreadablefile(file.addsuffix(barename,"fmt"),"formats",engine)
- if fmtname=="" then
- fmtname=resolvers.findfile(file.addsuffix(barename,"fmt")) or ""
- end
- fmtname=resolvers.cleanpath(fmtname)
- if fmtname=="" then
- report_format("no format with name %a",name)
- else
- local barename=file.removesuffix(name)
- local luaname=file.addsuffix(barename,"luc")
- if not lfs.isfile(luaname) then
- luaname=file.addsuffix(barename,"lua")
- end
- if not lfs.isfile(luaname) then
- report_format("using format name %a",fmtname)
- report_format("no luc/lua file with name %a",barename)
- else
- local runner=runners[engine]
- if not runner then
- report_format("format %a cannot be run, no runner available for engine %a",name,engine)
- else
- runner {
- flags=primaryflags(),
- fmtfile=quoted(barename),
- luafile=quoted(luaname),
- texfile=quoted(data),
- more=more,
- }
- end
- end
- end
+function environment.run_format(formatname,scriptname,filename,primaryflags,secondaryflags,verbose)
+ local engine=environment.ownmain or "luatex"
+ if not formatname or formatname=="" then
+ report_format("missing format name")
+ return
+ end
+ if not scriptname or scriptname=="" then
+ report_format("missing script name")
+ return
+ end
+ if not lfs.isfile(formatname) or not lfs.isfile(scriptname) then
+ formatname,scriptname=resolvers.locateformat(formatname)
end
+ if not formatname or formatname=="" then
+ report_format("invalid format name")
+ return
+ end
+ if not scriptname or scriptname=="" then
+ report_format("invalid script name")
+ return
+ end
+ local runner=runners[engine]
+ if not runner then
+ report_format("format %a cannot be run, no runner available for engine %a",file.nameonly(name),engine)
+ return
+ end
+ if not filename then
+ filename ""
+ end
+ local binarypath=validbinarypath()
+ local specification={
+ binarypath=binarypath,
+ primaryflags=primaryflags or "",
+ secondaryflags=secondaryflags or "",
+ fmtfile=quoted(formatname),
+ luafile=quoted(scriptname),
+ texfile=filename~="" and quoted(filename) or "",
+ }
+ statistics.starttiming()
+ local result=runner(specification)
+ local runtime=statistics.stoptiming()
+ if verbose then
+ report_format()
+ if binarypath and binarypath~="" then
+ report_format("binary path : %s",binarypath)
+ end
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",scriptname)
+ report_format("tex format file : %s",formatname)
+ if filename~="" then
+ report_format("tex input file : %s",filename)
+ end
+ if primaryflags~="" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags~="" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result==0 and "okay" or "error")
+ report_format()
+ end
+ return result
end
end -- of closure
--- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
+-- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua libs-ini.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 1019480
--- stripped bytes : 403728
+-- original bytes : 1038245
+-- stripped bytes : 409841
-- end library merge
@@ -25697,7 +26232,7 @@ local ownlibs = { -- order can be made better
'data-tmf.lua',
'data-lst.lua',
- 'util-lib.lua', -- swiglib
+ 'libs-ini.lua',
'luat-sta.lua',
'luat-fmt.lua',
@@ -25846,7 +26381,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
- <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -25865,6 +26400,7 @@ local helpinfo = [[
<flag name="stubpath" value="binpath"><short>paths where stubs wil be written</short></flag>
<flag name="windows"><short>create windows (mswin) stubs</short></flag>
<flag name="unix"><short>create unix (linux) stubs</short></flag>
+ <flag name="addbinarypath"><short>prepend the (found) binarypath to runners</short></flag>
</subcategory>
<subcategory>
<flag name="verbose"><short>give a bit more info</short></flag>
@@ -26086,8 +26622,7 @@ end
report()
io.flush()
end
- -- no os.exec because otherwise we get the wrong return value
- local code = os.execute(command) -- maybe spawn
+ local code = os.execute(command)
if code == 0 then
return true
else
@@ -26130,7 +26665,7 @@ function runners.execute_program(fullname)
report()
report()
io.flush()
- local code = os.exec(command) -- (fullname,unpack(after)) does not work / maybe spawn
+ local code = os.execute(command)
return code == 0
end
end
@@ -26517,16 +27052,22 @@ function runners.associate(filename)
end
function runners.evaluate(code,filename) -- for Luigi
+ local environment = table.setmetatableindex(_G)
if code == "loop" then
while true do
- io.write("> ")
+ io.write("lua > ")
local code = io.read()
- if code ~= "" then
+ if code == "quit" or code == "exit" then
+ break
+ elseif code ~= "" then
local temp = string.match(code,"^= (.*)$")
if temp then
- code = "print("..temp..")"
+ code = "inspect("..temp..")"
+ end
+ local compiled, message = load(code,"console","t",environment)
+ if type(compiled) ~= "function" then
+ compiled = load("inspect("..code..")","console","t",environment)
end
- local compiled, message = loadstring(code)
if type(compiled) ~= "function" then
io.write("! " .. (message or code).."\n")
else
@@ -26539,7 +27080,10 @@ function runners.evaluate(code,filename) -- for Luigi
code = filename
end
if code ~= "" then
- local compiled, message = loadstring(code)
+ local compiled, message = load(code,"console","t",environment)
+ if type(compiled) ~= "function" then
+ compiled = load("inspect("..code..")","console","t",environment)
+ end
if type(compiled) ~= "function" then
io.write("invalid lua code: " .. (message or code))
return
@@ -26716,17 +27260,17 @@ do
end
-if e_argument("ansi") then
+-- if e_argument("ansi") or e_argument("ansilog") then
- logs.setformatters("ansi")
+-- logs.setformatters(e_argument("ansi") and "ansi" or "ansilog")
- local script = e_argument("script") or e_argument("scripts")
+-- -- local script = e_argument("script") or e_argument("scripts")
+-- --
+-- -- if type(script) == "string" then
+-- -- logs.writer("]0;"..script.."") -- for Alan to test
+-- -- end
- if type(script) == "string" then
- logs.writer("]0;"..script.."") -- for Alan to test
- end
-
-end
+-- end
if e_argument("script") or e_argument("scripts") then
@@ -26975,11 +27519,11 @@ elseif e_argument("format-path") then
resolvers.load()
report(caches.getwritablepath("format"))
-elseif e_argument("pattern") then
-
- -- luatools
-
- runners.execute_ctx_script("mtx-base","--pattern='" .. e_argument("pattern") .. "'",filename)
+-- elseif e_argument("pattern") then
+--
+-- -- luatools
+--
+-- runners.execute_ctx_script("mtx-base","--pattern='" .. e_argument("pattern") .. "'",filename)
elseif e_argument("generate") then
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-context.lua b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-context.lua
index afb6565ebf5..3db7d14fd0f 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-context.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-context.lua
@@ -1,4 +1,4 @@
return {
- ["constants"]={ "zerocount", "minusone", "minustwo", "plusone", "plustwo", "plusthree", "plusfour", "plusfive", "plussix", "plusseven", "pluseight", "plusnine", "plusten", "plussixteen", "plusfifty", "plushundred", "plusonehundred", "plustwohundred", "plusfivehundred", "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", "maxcardminusone", "zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxcount", "maxdimen", "scaledpoint", "thousandpoint", "points", "halfpoint", "zeroskip", "zeromuskip", "onemuskip", "pluscxxvii", "pluscxxviii", "pluscclv", "pluscclvi", "normalpagebox", "directionlefttoright", "directionrighttoleft", "endoflinetoken", "outputnewlinechar", "emptytoks", "empty", "undefined", "voidbox", "emptybox", "emptyvbox", "emptyhbox", "bigskipamount", "medskipamount", "smallskipamount", "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", "texenginefunctionality", "luatexengine", "pdftexengine", "xetexengine", "unknownengine", "contextformat", "contextversion", "contextkind", "contextlmtxmode", "contextmark", "mksuffix", "activecatcode", "bgroup", "egroup", "endline", "conditionaltrue", "conditionalfalse", "attributeunsetvalue", "uprotationangle", "rightrotationangle", "downrotationangle", "leftrotationangle", "inicatcodes", "ctxcatcodes", "texcatcodes", "notcatcodes", "txtcatcodes", "vrbcatcodes", "prtcatcodes", "nilcatcodes", "luacatcodes", "tpacatcodes", "tpbcatcodes", "xmlcatcodes", "ctdcatcodes", "escapecatcode", "begingroupcatcode", "endgroupcatcode", "mathshiftcatcode", "alignmentcatcode", "endoflinecatcode", "parametercatcode", "superscriptcatcode", "subscriptcatcode", "ignorecatcode", "spacecatcode", "lettercatcode", "othercatcode", "activecatcode", "commentcatcode", "invalidcatcode", "tabasciicode", "newlineasciicode", "formfeedasciicode", "endoflineasciicode", "endoffileasciicode", "spaceasciicode", "hashasciicode", "dollarasciicode", "commentasciicode", "ampersandasciicode", "colonasciicode", "backslashasciicode", "circumflexasciicode", "underscoreasciicode", "leftbraceasciicode", "barasciicode", "rightbraceasciicode", "tildeasciicode", "delasciicode", "leftparentasciicode", "rightparentasciicode", "lessthanasciicode", "morethanasciicode", "doublecommentsignal", "atsignasciicode", "exclamationmarkasciicode", "questionmarkasciicode", "doublequoteasciicode", "singlequoteasciicode", "forwardslashasciicode", "primeasciicode", "hyphenasciicode", "activemathcharcode", "activetabtoken", "activeformfeedtoken", "activeendoflinetoken", "batchmodecode", "nonstopmodecode", "scrollmodecode", "errorstopmodecode", "bottomlevelgroupcode", "simplegroupcode", "hboxgroupcode", "adjustedhboxgroupcode", "vboxgroupcode", "vtopgroupcode", "aligngroupcode", "noaligngroupcode", "outputgroupcode", "mathgroupcode", "discretionarygroupcode", "insertgroupcode", "vcentergroupcode", "mathchoicegroupcode", "semisimplegroupcode", "mathshiftgroupcode", "mathleftgroupcode", "vadjustgroupcode", "charnodecode", "hlistnodecode", "vlistnodecode", "rulenodecode", "insertnodecode", "marknodecode", "adjustnodecode", "ligaturenodecode", "discretionarynodecode", "whatsitnodecode", "mathnodecode", "gluenodecode", "kernnodecode", "penaltynodecode", "unsetnodecode", "mathsnodecode", "charifcode", "catifcode", "numifcode", "dimifcode", "oddifcode", "vmodeifcode", "hmodeifcode", "mmodeifcode", "innerifcode", "voidifcode", "hboxifcode", "vboxifcode", "xifcode", "eofifcode", "trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode", "fontslantperpoint", "fontinterwordspace", "fontinterwordstretch", "fontinterwordshrink", "fontexheight", "fontemwidth", "fontextraspace", "slantperpoint", "mathexheight", "mathemwidth", "interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace", "mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight", "muquad", "startmode", "stopmode", "startnotmode", "stopnotmode", "startmodeset", "stopmodeset", "doifmode", "doifelsemode", "doifmodeelse", "doifnotmode", "startmodeset", "stopmodeset", "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", "doifallmodes", "doifelseallmodes", "doifallmodeselse", "doifnotallmodes", "startenvironment", "stopenvironment", "environment", "startcomponent", "stopcomponent", "component", "startproduct", "stopproduct", "product", "startproject", "stopproject", "project", "starttext", "stoptext", "startnotext", "stopnotext", "startdocument", "stopdocument", "documentvariable", "unexpandeddocumentvariable", "setupdocument", "presetdocument", "doifelsedocumentvariable", "doifdocumentvariableelse", "doifdocumentvariable", "doifnotdocumentvariable", "startmodule", "stopmodule", "usemodule", "usetexmodule", "useluamodule", "setupmodule", "currentmoduleparameter", "moduleparameter", "everystarttext", "everystoptext", "startTEXpage", "stopTEXpage", "enablemode", "disablemode", "preventmode", "definemode", "globalenablemode", "globaldisablemode", "globalpreventmode", "pushmode", "popmode", "typescriptone", "typescripttwo", "typescriptthree", "mathsizesuffix", "mathordcode", "mathopcode", "mathbincode", "mathrelcode", "mathopencode", "mathclosecode", "mathpunctcode", "mathalphacode", "mathinnercode", "mathnothingcode", "mathlimopcode", "mathnolopcode", "mathboxcode", "mathchoicecode", "mathaccentcode", "mathradicalcode", "constantnumber", "constantnumberargument", "constantdimen", "constantdimenargument", "constantemptyargument", "continueifinputfile", "luastringsep", "!!bs", "!!es", "lefttorightmark", "righttoleftmark", "lrm", "rlm", "bidilre", "bidirle", "bidipop", "bidilro", "bidirlo", "breakablethinspace", "nobreakspace", "nonbreakablespace", "narrownobreakspace", "zerowidthnobreakspace", "ideographicspace", "ideographichalffillspace", "twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace", "figurespace", "punctuationspace", "hairspace", "enquad", "emquad", "zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj", "optionalspace", "asciispacechar", "softhyphen", "Ux", "eUx", "Umathaccents", "parfillleftskip", "parfillrightskip" },
- ["helpers"]={ "startsetups", "stopsetups", "startxmlsetups", "stopxmlsetups", "startluasetups", "stopluasetups", "starttexsetups", "stoptexsetups", "startrawsetups", "stoprawsetups", "startlocalsetups", "stoplocalsetups", "starttexdefinition", "stoptexdefinition", "starttexcode", "stoptexcode", "startcontextcode", "stopcontextcode", "startcontextdefinitioncode", "stopcontextdefinitioncode", "texdefinition", "doifelsesetups", "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", "fastsetup", "copysetups", "resetsetups", "doifelsecommandhandler", "doifcommandhandlerelse", "doifnotcommandhandler", "doifcommandhandler", "newmode", "setmode", "resetmode", "newsystemmode", "setsystemmode", "resetsystemmode", "pushsystemmode", "popsystemmode", "globalsetmode", "globalresetmode", "globalsetsystemmode", "globalresetsystemmode", "booleanmodevalue", "newcount", "newdimen", "newskip", "newmuskip", "newbox", "newtoks", "newread", "newwrite", "newmarks", "newinsert", "newattribute", "newif", "newlanguage", "newfamily", "newfam", "newhelp", "then", "begcsname", "autorule", "strippedcsname", "checkedstrippedcsname", "firstargumentfalse", "firstargumenttrue", "secondargumentfalse", "secondargumenttrue", "thirdargumentfalse", "thirdargumenttrue", "fourthargumentfalse", "fourthargumenttrue", "fifthargumentfalse", "fifthargumenttrue", "sixthargumentfalse", "sixthargumenttrue", "seventhargumentfalse", "seventhargumenttrue", "vkern", "hkern", "doglobal", "dodoglobal", "redoglobal", "resetglobal", "donothing", "dontcomplain", "forgetall", "donetrue", "donefalse", "foundtrue", "foundfalse", "inlineordisplaymath", "indisplaymath", "forcedisplaymath", "startforceddisplaymath", "stopforceddisplaymath", "startpickupmath", "stoppickupmath", "reqno", "mathortext", "htdp", "unvoidbox", "hfilll", "vfilll", "mathbox", "mathlimop", "mathnolop", "mathnothing", "mathalpha", "currentcatcodetable", "defaultcatcodetable", "catcodetablename", "newcatcodetable", "startcatcodetable", "stopcatcodetable", "startextendcatcodetable", "stopextendcatcodetable", "pushcatcodetable", "popcatcodetable", "restorecatcodes", "setcatcodetable", "letcatcodecommand", "defcatcodecommand", "uedcatcodecommand", "hglue", "vglue", "hfillneg", "vfillneg", "hfilllneg", "vfilllneg", "ruledhss", "ruledhfil", "ruledhfill", "ruledhfilll", "ruledhfilneg", "ruledhfillneg", "normalhfillneg", "normalhfilllneg", "ruledvss", "ruledvfil", "ruledvfill", "ruledvfilll", "ruledvfilneg", "ruledvfillneg", "normalvfillneg", "normalvfilllneg", "ruledhbox", "ruledvbox", "ruledvtop", "ruledvcenter", "ruledmbox", "ruledhpack", "ruledvpack", "ruledtpack", "ruledhskip", "ruledvskip", "ruledkern", "ruledmskip", "ruledmkern", "ruledhglue", "ruledvglue", "normalhglue", "normalvglue", "ruledpenalty", "filledhboxb", "filledhboxr", "filledhboxg", "filledhboxc", "filledhboxm", "filledhboxy", "filledhboxk", "scratchcounter", "globalscratchcounter", "privatescratchcounter", "scratchdimen", "globalscratchdimen", "privatescratchdimen", "scratchskip", "globalscratchskip", "privatescratchskip", "scratchmuskip", "globalscratchmuskip", "privatescratchmuskip", "scratchtoks", "globalscratchtoks", "privatescratchtoks", "scratchbox", "globalscratchbox", "privatescratchbox", "globalscratchcounterone", "globalscratchcountertwo", "globalscratchcounterthree", "groupedcommand", "groupedcommandcs", "triggergroupedcommand", "triggergroupedcommandcs", "simplegroupedcommand", "pickupgroupedcommand", "normalbaselineskip", "normallineskip", "normallineskiplimit", "availablehsize", "localhsize", "setlocalhsize", "distributedhsize", "hsizefraction", "next", "nexttoken", "nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs", "flushnextbox", "boxisempty", "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", "scratchdistance", "scratchhsize", "scratchvsize", "scratchxoffset", "scratchyoffset", "scratchhoffset", "scratchvoffset", "scratchxposition", "scratchyposition", "scratchtopoffset", "scratchbottomoffset", "scratchleftoffset", "scratchrightoffset", "scratchcounterone", "scratchcountertwo", "scratchcounterthree", "scratchcounterfour", "scratchcounterfive", "scratchcountersix", "scratchdimenone", "scratchdimentwo", "scratchdimenthree", "scratchdimenfour", "scratchdimenfive", "scratchdimensix", "scratchskipone", "scratchskiptwo", "scratchskipthree", "scratchskipfour", "scratchskipfive", "scratchskipsix", "scratchmuskipone", "scratchmuskiptwo", "scratchmuskipthree", "scratchmuskipfour", "scratchmuskipfive", "scratchmuskipsix", "scratchtoksone", "scratchtokstwo", "scratchtoksthree", "scratchtoksfour", "scratchtoksfive", "scratchtokssix", "scratchboxone", "scratchboxtwo", "scratchboxthree", "scratchboxfour", "scratchboxfive", "scratchboxsix", "scratchnx", "scratchny", "scratchmx", "scratchmy", "scratchunicode", "scratchmin", "scratchmax", "scratchleftskip", "scratchrightskip", "scratchtopskip", "scratchbottomskip", "doif", "doifnot", "doifelse", "firstinset", "doifinset", "doifnotinset", "doifelseinset", "doifinsetelse", "doifelsenextchar", "doifnextcharelse", "doifelsenextoptional", "doifnextoptionalelse", "doifelsenextoptionalcs", "doifnextoptionalcselse", "doifelsefastoptionalcheck", "doiffastoptionalcheckelse", "doifelsefastoptionalcheckcs", "doiffastoptionalcheckcselse", "doifelsenextbgroup", "doifnextbgroupelse", "doifelsenextbgroupcs", "doifnextbgroupcselse", "doifelsenextparenthesis", "doifnextparenthesiselse", "doifelseundefined", "doifundefinedelse", "doifelsedefined", "doifdefinedelse", "doifundefined", "doifdefined", "doifelsevalue", "doifvalue", "doifnotvalue", "doifnothing", "doifsomething", "doifelsenothing", "doifnothingelse", "doifelsesomething", "doifsomethingelse", "doifvaluenothing", "doifvaluesomething", "doifelsevaluenothing", "doifvaluenothingelse", "doifelsedimension", "doifdimensionelse", "doifelsenumber", "doifnumberelse", "doifnumber", "doifnotnumber", "doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon", "doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse", "doifelseassignment", "doifassignmentelse", "docheckassignment", "doifelseassignmentcs", "doifassignmentelsecs", "doiftext", "doifelsetext", "doiftextelse", "doifnottext", "tracingall", "tracingnone", "loggingall", "removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to", "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", "emspace", "charspace", "nbsp", "crlf", "obeyspaces", "obeylines", "obeyedspace", "obeyedline", "obeyedtab", "obeyedpage", "normalspace", "executeifdefined", "singleexpandafter", "doubleexpandafter", "tripleexpandafter", "dontleavehmode", "removelastspace", "removeunwantedspaces", "keepunwantedspaces", "removepunctuation", "ignoreparskip", "forcestrutdepth", "onlynonbreakablespace", "wait", "writestatus", "define", "defineexpandable", "redefine", "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", "measured", "installcorenamespace", "getvalue", "getuvalue", "setvalue", "setevalue", "setgvalue", "setxvalue", "letvalue", "letgvalue", "resetvalue", "undefinevalue", "ignorevalue", "setuvalue", "setuevalue", "setugvalue", "setuxvalue", "globallet", "glet", "udef", "ugdef", "uedef", "uxdef", "checked", "unique", "getparameters", "geteparameters", "getgparameters", "getxparameters", "forgetparameters", "copyparameters", "getdummyparameters", "dummyparameter", "directdummyparameter", "setdummyparameter", "letdummyparameter", "setexpandeddummyparameter", "usedummystyleandcolor", "usedummystyleparameter", "usedummycolorparameter", "processcommalist", "processcommacommand", "quitcommalist", "quitprevcommalist", "processaction", "processallactions", "processfirstactioninset", "processallactionsinset", "unexpanded", "expanded", "startexpanded", "stopexpanded", "protected", "protect", "unprotect", "firstofoneargument", "firstoftwoarguments", "secondoftwoarguments", "firstofthreearguments", "secondofthreearguments", "thirdofthreearguments", "firstoffourarguments", "secondoffourarguments", "thirdoffourarguments", "fourthoffourarguments", "firstoffivearguments", "secondoffivearguments", "thirdoffivearguments", "fourthoffivearguments", "fifthoffivearguments", "firstofsixarguments", "secondofsixarguments", "thirdofsixarguments", "fourthofsixarguments", "fifthofsixarguments", "sixthofsixarguments", "firstofoneunexpanded", "firstoftwounexpanded", "secondoftwounexpanded", "firstofthreeunexpanded", "secondofthreeunexpanded", "thirdofthreeunexpanded", "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "fastloopindex", "fastloopfinal", "dowith", "newconstant", "setnewconstant", "setconstant", "setconstantvalue", "newconditional", "settrue", "setfalse", "settruevalue", "setfalsevalue", "newmacro", "setnewmacro", "newfraction", "newsignal", "dosingleempty", "dodoubleempty", "dotripleempty", "doquadrupleempty", "doquintupleempty", "dosixtupleempty", "doseventupleempty", "dosingleargument", "dodoubleargument", "dotripleargument", "doquadrupleargument", "doquintupleargument", "dosixtupleargument", "doseventupleargument", "dosinglegroupempty", "dodoublegroupempty", "dotriplegroupempty", "doquadruplegroupempty", "doquintuplegroupempty", "permitspacesbetweengroups", "dontpermitspacesbetweengroups", "nopdfcompression", "maximumpdfcompression", "normalpdfcompression", "onlypdfobjectcompression", "nopdfobjectcompression", "modulonumber", "dividenumber", "getfirstcharacter", "doifelsefirstchar", "doiffirstcharelse", "startnointerference", "stopnointerference", "twodigits", "threedigits", "leftorright", "offinterlineskip", "oninterlineskip", "nointerlineskip", "strut", "halfstrut", "quarterstrut", "depthstrut", "halflinestrut", "noheightstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "strutgap", "begstrut", "endstrut", "lineheight", "leftboundary", "rightboundary", "signalcharacter", "ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing", "ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing", "opordspacing", "opopspacing", "opbinspacing", "oprelspacing", "opopenspacing", "opclosespacing", "oppunctspacing", "opinnerspacing", "binordspacing", "binopspacing", "binbinspacing", "binrelspacing", "binopenspacing", "binclosespacing", "binpunctspacing", "bininnerspacing", "relordspacing", "relopspacing", "relbinspacing", "relrelspacing", "relopenspacing", "relclosespacing", "relpunctspacing", "relinnerspacing", "openordspacing", "openopspacing", "openbinspacing", "openrelspacing", "openopenspacing", "openclosespacing", "openpunctspacing", "openinnerspacing", "closeordspacing", "closeopspacing", "closebinspacing", "closerelspacing", "closeopenspacing", "closeclosespacing", "closepunctspacing", "closeinnerspacing", "punctordspacing", "punctopspacing", "punctbinspacing", "punctrelspacing", "punctopenspacing", "punctclosespacing", "punctpunctspacing", "punctinnerspacing", "innerordspacing", "inneropspacing", "innerbinspacing", "innerrelspacing", "inneropenspacing", "innerclosespacing", "innerpunctspacing", "innerinnerspacing", "normalreqno", "startimath", "stopimath", "normalstartimath", "normalstopimath", "startdmath", "stopdmath", "normalstartdmath", "normalstopdmath", "normalsuperscript", "normalsubscript", "normalnosuperscript", "normalnosubscript", "superscript", "subscript", "nosuperscript", "nosubscript", "uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette", "mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox", "mathtext", "setmathsmalltextbox", "setmathtextbox", "pushmathstyle", "popmathstyle", "triggerdisplaystyle", "triggertextstyle", "triggerscriptstyle", "triggerscriptscriptstyle", "triggeruncrampedstyle", "triggercrampedstyle", "triggersmallstyle", "triggeruncrampedsmallstyle", "triggercrampedsmallstyle", "triggerbigstyle", "triggeruncrampedbigstyle", "triggercrampedbigstyle", "luaexpr", "expelsedoif", "expdoif", "expdoifnot", "expdoifelsecommon", "expdoifcommonelse", "expdoifelseinset", "expdoifinsetelse", "ctxdirectlua", "ctxlatelua", "ctxsprint", "ctxwrite", "ctxcommand", "ctxdirectcommand", "ctxlatecommand", "ctxreport", "ctxlua", "luacode", "lateluacode", "directluacode", "registerctxluafile", "ctxloadluafile", "luaversion", "luamajorversion", "luaminorversion", "ctxluacode", "luaconditional", "luaexpanded", "startluaparameterset", "stopluaparameterset", "luaparameterset", "definenamedlua", "obeylualines", "obeyluatokens", "startluacode", "stopluacode", "startlua", "stoplua", "startctxfunction", "stopctxfunction", "ctxfunction", "startctxfunctiondefinition", "stopctxfunctiondefinition", "installctxfunction", "installprotectedctxfunction", "installprotectedctxscanner", "installctxscanner", "resetctxscanner", "cldprocessfile", "cldloadfile", "cldloadviafile", "cldcontext", "cldcommand", "carryoverpar", "lastlinewidth", "assumelongusagecs", "Umathbotaccent", "righttolefthbox", "lefttorighthbox", "righttoleftvbox", "lefttorightvbox", "righttoleftvtop", "lefttorightvtop", "rtlhbox", "ltrhbox", "rtlvbox", "ltrvbox", "rtlvtop", "ltrvtop", "autodirhbox", "autodirvbox", "autodirvtop", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "lefttoright", "righttoleft", "checkedlefttoright", "checkedrighttoleft", "synchronizelayoutdirection", "synchronizedisplaydirection", "synchronizeinlinedirection", "dirlre", "dirrle", "dirlro", "dirrlo", "lesshyphens", "morehyphens", "nohyphens", "dohyphens", "Ucheckedstartdisplaymath", "Ucheckedstopdisplaymath", "break", "nobreak", "allowbreak", "goodbreak", "nospace", "nospacing", "dospacing", "naturalhbox", "naturalvbox", "naturalvtop", "naturalhpack", "naturalvpack", "naturaltpack", "reversehbox", "reversevbox", "reversevtop", "reversehpack", "reversevpack", "reversetpack", "frule", "compoundhyphenpenalty", "start", "stop" },
+ ["constants"]={ "zerocount", "minusone", "minustwo", "plusone", "plustwo", "plusthree", "plusfour", "plusfive", "plussix", "plusseven", "pluseight", "plusnine", "plusten", "plussixteen", "plusfifty", "plushundred", "plusonehundred", "plustwohundred", "plusfivehundred", "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", "maxcardminusone", "zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxcount", "maxdimen", "scaledpoint", "thousandpoint", "points", "halfpoint", "zeroskip", "zeromuskip", "onemuskip", "pluscxxvii", "pluscxxviii", "pluscclv", "pluscclvi", "normalpagebox", "directionlefttoright", "directionrighttoleft", "endoflinetoken", "outputnewlinechar", "emptytoks", "empty", "undefined", "voidbox", "emptybox", "emptyvbox", "emptyhbox", "bigskipamount", "medskipamount", "smallskipamount", "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", "texenginefunctionality", "luatexengine", "pdftexengine", "xetexengine", "unknownengine", "contextformat", "contextversion", "contextkind", "contextlmtxmode", "contextmark", "mksuffix", "activecatcode", "bgroup", "egroup", "endline", "conditionaltrue", "conditionalfalse", "attributeunsetvalue", "uprotationangle", "rightrotationangle", "downrotationangle", "leftrotationangle", "inicatcodes", "ctxcatcodes", "texcatcodes", "notcatcodes", "txtcatcodes", "vrbcatcodes", "prtcatcodes", "nilcatcodes", "luacatcodes", "tpacatcodes", "tpbcatcodes", "xmlcatcodes", "ctdcatcodes", "escapecatcode", "begingroupcatcode", "endgroupcatcode", "mathshiftcatcode", "alignmentcatcode", "endoflinecatcode", "parametercatcode", "superscriptcatcode", "subscriptcatcode", "ignorecatcode", "spacecatcode", "lettercatcode", "othercatcode", "activecatcode", "commentcatcode", "invalidcatcode", "tabasciicode", "newlineasciicode", "formfeedasciicode", "endoflineasciicode", "endoffileasciicode", "spaceasciicode", "hashasciicode", "dollarasciicode", "commentasciicode", "ampersandasciicode", "colonasciicode", "backslashasciicode", "circumflexasciicode", "underscoreasciicode", "leftbraceasciicode", "barasciicode", "rightbraceasciicode", "tildeasciicode", "delasciicode", "leftparentasciicode", "rightparentasciicode", "lessthanasciicode", "morethanasciicode", "doublecommentsignal", "atsignasciicode", "exclamationmarkasciicode", "questionmarkasciicode", "doublequoteasciicode", "singlequoteasciicode", "forwardslashasciicode", "primeasciicode", "hyphenasciicode", "activemathcharcode", "activetabtoken", "activeformfeedtoken", "activeendoflinetoken", "batchmodecode", "nonstopmodecode", "scrollmodecode", "errorstopmodecode", "bottomlevelgroupcode", "simplegroupcode", "hboxgroupcode", "adjustedhboxgroupcode", "vboxgroupcode", "vtopgroupcode", "aligngroupcode", "noaligngroupcode", "outputgroupcode", "mathgroupcode", "discretionarygroupcode", "insertgroupcode", "vcentergroupcode", "mathchoicegroupcode", "semisimplegroupcode", "mathshiftgroupcode", "mathleftgroupcode", "vadjustgroupcode", "charnodecode", "hlistnodecode", "vlistnodecode", "rulenodecode", "insertnodecode", "marknodecode", "adjustnodecode", "ligaturenodecode", "discretionarynodecode", "whatsitnodecode", "mathnodecode", "gluenodecode", "kernnodecode", "penaltynodecode", "unsetnodecode", "mathsnodecode", "charifcode", "catifcode", "numifcode", "dimifcode", "oddifcode", "vmodeifcode", "hmodeifcode", "mmodeifcode", "innerifcode", "voidifcode", "hboxifcode", "vboxifcode", "xifcode", "eofifcode", "trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode", "fontslantperpoint", "fontinterwordspace", "fontinterwordstretch", "fontinterwordshrink", "fontexheight", "fontemwidth", "fontextraspace", "slantperpoint", "mathexheight", "mathemwidth", "interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace", "mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight", "muquad", "startmode", "stopmode", "startnotmode", "stopnotmode", "startmodeset", "stopmodeset", "doifmode", "doifelsemode", "doifmodeelse", "doifnotmode", "startmodeset", "stopmodeset", "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", "doifallmodes", "doifelseallmodes", "doifallmodeselse", "doifnotallmodes", "startenvironment", "stopenvironment", "environment", "startcomponent", "stopcomponent", "component", "startproduct", "stopproduct", "product", "startproject", "stopproject", "project", "starttext", "stoptext", "startnotext", "stopnotext", "startdocument", "stopdocument", "documentvariable", "unexpandeddocumentvariable", "setupdocument", "presetdocument", "doifelsedocumentvariable", "doifdocumentvariableelse", "doifdocumentvariable", "doifnotdocumentvariable", "startmodule", "stopmodule", "usemodule", "usetexmodule", "useluamodule", "setupmodule", "currentmoduleparameter", "moduleparameter", "everystarttext", "everystoptext", "startTEXpage", "stopTEXpage", "enablemode", "disablemode", "preventmode", "definemode", "globalenablemode", "globaldisablemode", "globalpreventmode", "pushmode", "popmode", "typescriptone", "typescripttwo", "typescriptthree", "mathsizesuffix", "mathordcode", "mathopcode", "mathbincode", "mathrelcode", "mathopencode", "mathclosecode", "mathpunctcode", "mathalphacode", "mathinnercode", "mathnothingcode", "mathlimopcode", "mathnolopcode", "mathboxcode", "mathchoicecode", "mathaccentcode", "mathradicalcode", "constantnumber", "constantnumberargument", "constantdimen", "constantdimenargument", "constantemptyargument", "continueifinputfile", "luastringsep", "!!bs", "!!es", "lefttorightmark", "righttoleftmark", "lrm", "rlm", "bidilre", "bidirle", "bidipop", "bidilro", "bidirlo", "breakablethinspace", "nobreakspace", "nonbreakablespace", "narrownobreakspace", "zerowidthnobreakspace", "ideographicspace", "ideographichalffillspace", "twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace", "figurespace", "punctuationspace", "hairspace", "enquad", "emquad", "zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj", "optionalspace", "asciispacechar", "softhyphen", "Ux", "eUx", "Umathaccents", "parfillleftskip", "parfillrightskip", "startlmtxmode", "stoplmtxmode", "startmkivmode", "stopmkivmode", "wildcardsymbol" },
+ ["helpers"]={ "startsetups", "stopsetups", "startxmlsetups", "stopxmlsetups", "startluasetups", "stopluasetups", "starttexsetups", "stoptexsetups", "startrawsetups", "stoprawsetups", "startlocalsetups", "stoplocalsetups", "starttexdefinition", "stoptexdefinition", "starttexcode", "stoptexcode", "startcontextcode", "stopcontextcode", "startcontextdefinitioncode", "stopcontextdefinitioncode", "texdefinition", "doifelsesetups", "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", "fastsetup", "copysetups", "resetsetups", "doifelsecommandhandler", "doifcommandhandlerelse", "doifnotcommandhandler", "doifcommandhandler", "newmode", "setmode", "resetmode", "newsystemmode", "setsystemmode", "resetsystemmode", "pushsystemmode", "popsystemmode", "globalsetmode", "globalresetmode", "globalsetsystemmode", "globalresetsystemmode", "booleanmodevalue", "newcount", "newdimen", "newskip", "newmuskip", "newbox", "newtoks", "newread", "newwrite", "newmarks", "newinsert", "newattribute", "newif", "newlanguage", "newfamily", "newfam", "newhelp", "then", "begcsname", "autorule", "strippedcsname", "checkedstrippedcsname", "firstargumentfalse", "firstargumenttrue", "secondargumentfalse", "secondargumenttrue", "thirdargumentfalse", "thirdargumenttrue", "fourthargumentfalse", "fourthargumenttrue", "fifthargumentfalse", "fifthargumenttrue", "sixthargumentfalse", "sixthargumenttrue", "seventhargumentfalse", "seventhargumenttrue", "vkern", "hkern", "doglobal", "dodoglobal", "redoglobal", "resetglobal", "donothing", "dontcomplain", "forgetall", "donetrue", "donefalse", "foundtrue", "foundfalse", "inlineordisplaymath", "indisplaymath", "forcedisplaymath", "startforceddisplaymath", "stopforceddisplaymath", "startpickupmath", "stoppickupmath", "reqno", "mathortext", "htdp", "unvoidbox", "hfilll", "vfilll", "mathbox", "mathlimop", "mathnolop", "mathnothing", "mathalpha", "currentcatcodetable", "defaultcatcodetable", "catcodetablename", "newcatcodetable", "startcatcodetable", "stopcatcodetable", "startextendcatcodetable", "stopextendcatcodetable", "pushcatcodetable", "popcatcodetable", "restorecatcodes", "setcatcodetable", "letcatcodecommand", "defcatcodecommand", "uedcatcodecommand", "hglue", "vglue", "hfillneg", "vfillneg", "hfilllneg", "vfilllneg", "ruledhss", "ruledhfil", "ruledhfill", "ruledhfilll", "ruledhfilneg", "ruledhfillneg", "normalhfillneg", "normalhfilllneg", "ruledvss", "ruledvfil", "ruledvfill", "ruledvfilll", "ruledvfilneg", "ruledvfillneg", "normalvfillneg", "normalvfilllneg", "ruledhbox", "ruledvbox", "ruledvtop", "ruledvcenter", "ruledmbox", "ruledhpack", "ruledvpack", "ruledtpack", "ruledhskip", "ruledvskip", "ruledkern", "ruledmskip", "ruledmkern", "ruledhglue", "ruledvglue", "normalhglue", "normalvglue", "ruledpenalty", "filledhboxb", "filledhboxr", "filledhboxg", "filledhboxc", "filledhboxm", "filledhboxy", "filledhboxk", "scratchcounter", "globalscratchcounter", "privatescratchcounter", "scratchdimen", "globalscratchdimen", "privatescratchdimen", "scratchskip", "globalscratchskip", "privatescratchskip", "scratchmuskip", "globalscratchmuskip", "privatescratchmuskip", "scratchtoks", "globalscratchtoks", "privatescratchtoks", "scratchbox", "globalscratchbox", "privatescratchbox", "globalscratchcounterone", "globalscratchcountertwo", "globalscratchcounterthree", "groupedcommand", "groupedcommandcs", "triggergroupedcommand", "triggergroupedcommandcs", "simplegroupedcommand", "pickupgroupedcommand", "normalbaselineskip", "normallineskip", "normallineskiplimit", "availablehsize", "localhsize", "setlocalhsize", "distributedhsize", "hsizefraction", "next", "nexttoken", "nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs", "flushnextbox", "boxisempty", "givenwidth", "givenheight", "givendepth", "scangivendimensions", "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", "scratchdistance", "scratchtotal", "scratchhsize", "scratchvsize", "scratchxoffset", "scratchyoffset", "scratchhoffset", "scratchvoffset", "scratchxposition", "scratchyposition", "scratchtopoffset", "scratchbottomoffset", "scratchleftoffset", "scratchrightoffset", "scratchcounterone", "scratchcountertwo", "scratchcounterthree", "scratchcounterfour", "scratchcounterfive", "scratchcountersix", "scratchdimenone", "scratchdimentwo", "scratchdimenthree", "scratchdimenfour", "scratchdimenfive", "scratchdimensix", "scratchskipone", "scratchskiptwo", "scratchskipthree", "scratchskipfour", "scratchskipfive", "scratchskipsix", "scratchmuskipone", "scratchmuskiptwo", "scratchmuskipthree", "scratchmuskipfour", "scratchmuskipfive", "scratchmuskipsix", "scratchtoksone", "scratchtokstwo", "scratchtoksthree", "scratchtoksfour", "scratchtoksfive", "scratchtokssix", "scratchboxone", "scratchboxtwo", "scratchboxthree", "scratchboxfour", "scratchboxfive", "scratchboxsix", "scratchnx", "scratchny", "scratchmx", "scratchmy", "scratchunicode", "scratchmin", "scratchmax", "scratchleftskip", "scratchrightskip", "scratchtopskip", "scratchbottomskip", "doif", "doifnot", "doifelse", "firstinset", "doifinset", "doifnotinset", "doifelseinset", "doifinsetelse", "doifelsenextchar", "doifnextcharelse", "doifelsenextcharcs", "doifnextcharcselse", "doifelsenextoptional", "doifnextoptionalelse", "doifelsenextoptionalcs", "doifnextoptionalcselse", "doifelsefastoptionalcheck", "doiffastoptionalcheckelse", "doifelsefastoptionalcheckcs", "doiffastoptionalcheckcselse", "doifelsenextbgroup", "doifnextbgroupelse", "doifelsenextbgroupcs", "doifnextbgroupcselse", "doifelsenextparenthesis", "doifnextparenthesiselse", "doifelseundefined", "doifundefinedelse", "doifelsedefined", "doifdefinedelse", "doifundefined", "doifdefined", "doifelsevalue", "doifvalue", "doifnotvalue", "doifnothing", "doifsomething", "doifelsenothing", "doifnothingelse", "doifelsesomething", "doifsomethingelse", "doifvaluenothing", "doifvaluesomething", "doifelsevaluenothing", "doifvaluenothingelse", "doifelsedimension", "doifdimensionelse", "doifelsenumber", "doifnumberelse", "doifnumber", "doifnotnumber", "doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon", "doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse", "doifelseassignment", "doifassignmentelse", "docheckassignment", "doifelseassignmentcs", "doifassignmentelsecs", "validassignment", "novalidassignment", "doiftext", "doifelsetext", "doiftextelse", "doifnottext", "quitcondition", "truecondition", "falsecondition", "tracingall", "tracingnone", "loggingall", "removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to", "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", "emspace", "charspace", "nbsp", "crlf", "obeyspaces", "obeylines", "obeyedspace", "obeyedline", "obeyedtab", "obeyedpage", "normalspace", "executeifdefined", "singleexpandafter", "doubleexpandafter", "tripleexpandafter", "dontleavehmode", "removelastspace", "removeunwantedspaces", "keepunwantedspaces", "removepunctuation", "ignoreparskip", "forcestrutdepth", "onlynonbreakablespace", "wait", "writestatus", "define", "defineexpandable", "redefine", "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", "measured", "directmeasure", "setquantity", "setequantity", "setgquantity", "setxquantity", "definequantity", "freezequantity", "quantity", "quantitied", "directquantity", "installcorenamespace", "getvalue", "getuvalue", "setvalue", "setevalue", "setgvalue", "setxvalue", "letvalue", "letgvalue", "resetvalue", "undefinevalue", "ignorevalue", "setuvalue", "setuevalue", "setugvalue", "setuxvalue", "globallet", "glet", "udef", "ugdef", "uedef", "uxdef", "checked", "unique", "getparameters", "geteparameters", "getgparameters", "getxparameters", "forgetparameters", "copyparameters", "getdummyparameters", "dummyparameter", "directdummyparameter", "setdummyparameter", "letdummyparameter", "setexpandeddummyparameter", "usedummystyleandcolor", "usedummystyleparameter", "usedummycolorparameter", "processcommalist", "processcommacommand", "quitcommalist", "quitprevcommalist", "processaction", "processallactions", "processfirstactioninset", "processallactionsinset", "unexpanded", "expanded", "startexpanded", "stopexpanded", "protected", "protect", "unprotect", "firstofoneargument", "firstoftwoarguments", "secondoftwoarguments", "firstofthreearguments", "secondofthreearguments", "thirdofthreearguments", "firstoffourarguments", "secondoffourarguments", "thirdoffourarguments", "fourthoffourarguments", "firstoffivearguments", "secondoffivearguments", "thirdoffivearguments", "fourthoffivearguments", "fifthoffivearguments", "firstofsixarguments", "secondofsixarguments", "thirdofsixarguments", "fourthofsixarguments", "fifthofsixarguments", "sixthofsixarguments", "firstofoneunexpanded", "firstoftwounexpanded", "secondoftwounexpanded", "firstofthreeunexpanded", "secondofthreeunexpanded", "thirdofthreeunexpanded", "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "fastloopindex", "fastloopfinal", "dowith", "newconstant", "setnewconstant", "setconstant", "setconstantvalue", "newconditional", "settrue", "setfalse", "settruevalue", "setfalsevalue", "newmacro", "setnewmacro", "newfraction", "newsignal", "dosingleempty", "dodoubleempty", "dotripleempty", "doquadrupleempty", "doquintupleempty", "dosixtupleempty", "doseventupleempty", "dosingleargument", "dodoubleargument", "dotripleargument", "doquadrupleargument", "doquintupleargument", "dosixtupleargument", "doseventupleargument", "dosinglegroupempty", "dodoublegroupempty", "dotriplegroupempty", "doquadruplegroupempty", "doquintuplegroupempty", "permitspacesbetweengroups", "dontpermitspacesbetweengroups", "nopdfcompression", "maximumpdfcompression", "normalpdfcompression", "onlypdfobjectcompression", "nopdfobjectcompression", "modulonumber", "dividenumber", "getfirstcharacter", "doifelsefirstchar", "doiffirstcharelse", "startnointerference", "stopnointerference", "twodigits", "threedigits", "leftorright", "offinterlineskip", "oninterlineskip", "nointerlineskip", "strut", "halfstrut", "quarterstrut", "depthstrut", "halflinestrut", "noheightstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "strutgap", "begstrut", "endstrut", "lineheight", "leftboundary", "rightboundary", "signalcharacter", "shiftbox", "vpackbox", "hpackbox", "vpackedbox", "hpackedbox", "ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing", "ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing", "opordspacing", "opopspacing", "opbinspacing", "oprelspacing", "opopenspacing", "opclosespacing", "oppunctspacing", "opinnerspacing", "binordspacing", "binopspacing", "binbinspacing", "binrelspacing", "binopenspacing", "binclosespacing", "binpunctspacing", "bininnerspacing", "relordspacing", "relopspacing", "relbinspacing", "relrelspacing", "relopenspacing", "relclosespacing", "relpunctspacing", "relinnerspacing", "openordspacing", "openopspacing", "openbinspacing", "openrelspacing", "openopenspacing", "openclosespacing", "openpunctspacing", "openinnerspacing", "closeordspacing", "closeopspacing", "closebinspacing", "closerelspacing", "closeopenspacing", "closeclosespacing", "closepunctspacing", "closeinnerspacing", "punctordspacing", "punctopspacing", "punctbinspacing", "punctrelspacing", "punctopenspacing", "punctclosespacing", "punctpunctspacing", "punctinnerspacing", "innerordspacing", "inneropspacing", "innerbinspacing", "innerrelspacing", "inneropenspacing", "innerclosespacing", "innerpunctspacing", "innerinnerspacing", "normalreqno", "startimath", "stopimath", "normalstartimath", "normalstopimath", "startdmath", "stopdmath", "normalstartdmath", "normalstopdmath", "normalsuperscript", "normalsubscript", "normalnosuperscript", "normalnosubscript", "superscript", "subscript", "nosuperscript", "nosubscript", "uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette", "mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox", "mathtext", "setmathsmalltextbox", "setmathtextbox", "pushmathstyle", "popmathstyle", "triggerdisplaystyle", "triggertextstyle", "triggerscriptstyle", "triggerscriptscriptstyle", "triggeruncrampedstyle", "triggercrampedstyle", "triggersmallstyle", "triggeruncrampedsmallstyle", "triggercrampedsmallstyle", "triggerbigstyle", "triggeruncrampedbigstyle", "triggercrampedbigstyle", "luaexpr", "expelsedoif", "expdoif", "expdoifnot", "expdoifelsecommon", "expdoifcommonelse", "expdoifelseinset", "expdoifinsetelse", "ctxdirectlua", "ctxlatelua", "ctxsprint", "ctxwrite", "ctxcommand", "ctxdirectcommand", "ctxlatecommand", "ctxreport", "ctxlua", "luacode", "lateluacode", "directluacode", "registerctxluafile", "ctxloadluafile", "luaversion", "luamajorversion", "luaminorversion", "ctxluacode", "luaconditional", "luaexpanded", "startluaparameterset", "stopluaparameterset", "luaparameterset", "definenamedlua", "obeylualines", "obeyluatokens", "startluacode", "stopluacode", "startlua", "stoplua", "startctxfunction", "stopctxfunction", "ctxfunction", "startctxfunctiondefinition", "stopctxfunctiondefinition", "installctxfunction", "installprotectedctxfunction", "installprotectedctxscanner", "installctxscanner", "resetctxscanner", "cldprocessfile", "cldloadfile", "cldloadviafile", "cldcontext", "cldcommand", "carryoverpar", "lastlinewidth", "assumelongusagecs", "Umathbotaccent", "righttolefthbox", "lefttorighthbox", "righttoleftvbox", "lefttorightvbox", "righttoleftvtop", "lefttorightvtop", "rtlhbox", "ltrhbox", "rtlvbox", "ltrvbox", "rtlvtop", "ltrvtop", "autodirhbox", "autodirvbox", "autodirvtop", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "lefttoright", "righttoleft", "checkedlefttoright", "checkedrighttoleft", "synchronizelayoutdirection", "synchronizedisplaydirection", "synchronizeinlinedirection", "dirlre", "dirrle", "dirlro", "dirrlo", "lesshyphens", "morehyphens", "nohyphens", "dohyphens", "Ucheckedstartdisplaymath", "Ucheckedstopdisplaymath", "break", "nobreak", "allowbreak", "goodbreak", "nospace", "nospacing", "dospacing", "naturalhbox", "naturalvbox", "naturalvtop", "naturalhpack", "naturalvpack", "naturaltpack", "reversehbox", "reversevbox", "reversevtop", "reversehpack", "reversevpack", "reversetpack", "frule", "compoundhyphenpenalty", "start", "stop", "unsupportedcs" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua
index 6547cad51d0..5cbf4dce3f8 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua
@@ -1,11 +1,11 @@
return {
- ["common"]={ "AEacute", "AEligature", "AEmacron", "AMSTEX", "Aacute", "Abreve", "Abreveacute", "Abrevedotbelow", "Abrevegrave", "Abrevehook", "Abrevetilde", "Acaron", "Acircumflex", "Acircumflexacute", "Acircumflexdotbelow", "Acircumflexgrave", "Acircumflexhook", "Acircumflextilde", "Adiaeresis", "Adiaeresismacron", "Adotaccent", "Adotaccentmacron", "Adotbelow", "Adoublegrave", "AfterPar", "Agrave", "Ahook", "Ainvertedbreve", "Alpha", "Alphabeticnumerals", "AmSTeX", "Amacron", "And", "Angstrom", "Aogonek", "Aring", "Aringacute", "Arrowvert", "Astroke", "Atilde", "BeforePar", "Beta", "Bhook", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "Box", "Bumpeq", "CONTEXT", "Cacute", "Cap", "Caps", "Ccaron", "Ccedilla", "Ccircumflex", "Cdotaccent", "Character", "Characters", "Chi", "Chook", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "Cstroke", "Cup", "DZcaronligature", "DZligature", "Dafrican", "Dcaron", "Ddownarrow", "Delta", "Dhook", "Doteq", "Downarrow", "Dstroke", "Dzcaronligature", "Dzligature", "ETEX", "Eacute", "Ebreve", "Ecaron", "Ecedilla", "Ecircumflex", "Ecircumflexacute", "Ecircumflexdotbelow", "Ecircumflexgrave", "Ecircumflexhook", "Ecircumflextilde", "Ediaeresis", "Edotaccent", "Edotbelow", "Edoublegrave", "Egrave", "Ehook", "Einvertedbreve", "Emacron", "Eogonek", "Epsilon", "Eta", "Eth", "Etilde", "Eulerconst", "EveryLine", "EveryPar", "Fhook", "Finv", "Gacute", "Game", "Gamma", "Gbreve", "Gcaron", "Gcircumflex", "Gcommaaccent", "Gdotaccent", "GetPar", "Ghook", "GotoPar", "Greeknumerals", "Gstroke", "Hat", "Hcaron", "Hcircumflex", "Hstroke", "IJligature", "INRSTEX", "Iacute", "Ibreve", "Icaron", "Icircumflex", "Idiaeresis", "Idotaccent", "Idotbelow", "Idoublegrave", "Igrave", "Ihook", "Iinvertedbreve", "Im", "Imacron", "Iogonek", "Iota", "Istroke", "Itilde", "Jcircumflex", "Join", "Kappa", "Kcaron", "Kcommaaccent", "Khook", "LAMSTEX", "LATEX", "LJligature", "LUAJITTEX", "LUATEX", "LaTeX", "Lacute", "LamSTeX", "Lambda", "Lbar", "Lcaron", "Lcommaaccent", "Ldotmiddle", "Ldsh", "Leftarrow", "Leftrightarrow", "Ljligature", "Lleftarrow", "Longleftarrow", "Longleftrightarrow", "Longmapsfrom", "Longmapsto", "Longrightarrow", "Lsh", "Lstroke", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTH", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "Mapsfrom", "Mapsto", "MetaFont", "MetaFun", "MetaPost", "Mu", "NJligature", "Nacute", "Ncaron", "Ncommaaccent", "Nearrow", "Neng", "Ngrave", "Njligature", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Ntilde", "Nu", "Numbers", "Nwarrow", "OEligature", "Oacute", "Obreve", "Ocaron", "Ocircumflex", "Ocircumflexacute", "Ocircumflexdotbelow", "Ocircumflexgrave", "Ocircumflexhook", "Ocircumflextilde", "Odiaeresis", "Odiaeresismacron", "Odotaccent", "Odotaccentmacron", "Odotbelow", "Odoublegrave", "Ograve", "Ohook", "Ohorn", "Ohornacute", "Ohorndotbelow", "Ohorngrave", "Ohornhook", "Ohorntilde", "Ohungarumlaut", "Oinvertedbreve", "Omacron", "Omega", "Omicron", "Oogonek", "Oogonekmacron", "Ostroke", "Ostrokeacute", "Otilde", "Otildemacron", "P", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "Phi", "Phook", "Pi", "PiCTeX", "Plankconst", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PropertyLine", "Psi", "PtToCm", "Racute", "Rcaron", "Rcommaaccent", "Rdoublegrave", "Rdsh", "Re", "ReadFile", "Relbar", "Rho", "Rightarrow", "Rinvertedbreve", "Romannumerals", "Rrightarrow", "Rsh", "S", "Sacute", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Scaron", "Scedilla", "Schwa", "Scircumflex", "Scommaaccent", "Searrow", "Sigma", "Smallcapped", "Subset", "Supset", "Swarrow", "TABLE", "TEX", "TaBlE", "Tau", "Tcaron", "Tcedilla", "Tcommaaccent", "TeX", "TheNormalizedFontSize", "Theta", "Thook", "Thorn", "TransparencyHack", "Tstroke", "Uacute", "Ubreve", "Ucaron", "Ucircumflex", "Udiaeresis", "Udiaeresisacute", "Udiaeresiscaron", "Udiaeresisgrave", "Udiaeresismacron", "Udotbelow", "Udoublegrave", "Ugrave", "Uhook", "Uhorn", "Uhornacute", "Uhorndotbelow", "Uhorngrave", "Uhornhook", "Uhorntilde", "Uhungarumlaut", "Uinvertedbreve", "Umacron", "Uogonek", "Uparrow", "Updownarrow", "Upsilon", "Uring", "Utilde", "Uuparrow", "VDash", "Vdash", "VerboseNumber", "Vert", "Vvdash", "WEEKDAY", "WORD", "WORDS", "Wcircumflex", "WidthSpanningText", "Word", "Words", "XETEX", "XeTeX", "Xi", "Yacute", "Ycircumflex", "Ydiaeresis", "Ydotbelow", "Ygrave", "Yhook", "Ymacron", "Ytilde", "Zacute", "Zcaron", "Zdotaccent", "Zeta", "Zhook", "Zstroke", "aacute", "abbreviation", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "about", "abreve", "abreveacute", "abrevedotbelow", "abrevegrave", "abrevehook", "abrevetilde", "acaron", "acircumflex", "acircumflexacute", "acircumflexdotbelow", "acircumflexgrave", "acircumflexhook", "acircumflextilde", "activatespacehandler", "actuarial", "acute", "acwopencirclearrow", "adaptcollector", "adaptfontfeature", "adaptlayout", "adaptpapersize", "addfeature", "addfontpath", "addtoJSpreamble", "addtocommalist", "addvalue", "adiaeresis", "adiaeresismacron", "adotaccent", "adotaccentmacron", "adotbelow", "adoublegrave", "aeacute", "aeligature", "aemacron", "afghanicurrency", "aftersplitstring", "aftertestandsplitstring", "agrave", "ahook", "ainvertedbreve", "aleph", "alignbottom", "aligned", "alignedbox", "alignedline", "alignhere", "alignmentcharacter", "allinputpaths", "alpha", "alphabeticnumerals", "alwayscitation", "alwayscite", "amacron", "amalg", "ampersand", "anchor", "angle", "aogonek", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "approx", "approxEq", "approxeq", "approxnEq", "arabicakbar", "arabicalayhe", "arabicallah", "arabicallallahou", "arabicasterisk", "arabicbasmalah", "arabiccomma", "arabiccuberoot", "arabicdateseparator", "arabicdecimals", "arabicdisputedendofayah", "arabicendofayah", "arabicexnumerals", "arabicfootnotemarker", "arabicfourthroot", "arabichighain", "arabichighalayheassallam", "arabichigheqala", "arabichighesala", "arabichighfootnotemarker", "arabichighjeem", "arabichighlamalef", "arabichighmadda", "arabichighmeemlong", "arabichighmeemshort", "arabichighnisf", "arabichighnoon", "arabichighnoonkasra", "arabichighqaf", "arabichighqif", "arabichighradiallahouanhu", "arabichighrahmatullahalayhe", "arabichighrubc", "arabichighsad", "arabichighsajda", "arabichighsakta", "arabichighsallallahou", "arabichighseen", "arabichighsmallsafha", "arabichightah", "arabichightakhallus", "arabichighthalatha", "arabichighwaqf", "arabichighyeh", "arabichighzain", "arabicjallajalalouhou", "arabiclettermark", "arabiclowmeemlong", "arabiclownoonkasra", "arabiclowseen", "arabicmisra", "arabicmuhammad", "arabicnumber", "arabicnumberabove", "arabicnumerals", "arabicparenleft", "arabicparenright", "arabicpercent", "arabicperiod", "arabicpermille", "arabicpertenthousand", "arabicpoeticverse", "arabicqala", "arabicquestion", "arabicrasoul", "arabicray", "arabicrialsign", "arabicsafha", "arabicsajdah", "arabicsalla", "arabicsamvat", "arabicsanah", "arabicsemicolon", "arabicshighthreedots", "arabicslcm", "arabicstartofrubc", "arabictripledot", "arabicvowelwaw", "arabicvowelyeh", "arabicwasallam", "arg", "aring", "aringacute", "arrowvert", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "ast", "astype", "asymp", "at", "atilde", "atleftmargin", "atpage", "atrightmargin", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "autointegral", "automathematics", "autopagestaterealpage", "autopagestaterealpageorder", "autosetups", "availablehsize", "averagecharwidth", "backepsilon", "background", "backgroundimage", "backgroundimagefill", "backgroundline", "backprime", "backsim", "backslash", "bar", "barleftarrow", "barleftarrowrightarrowbar", "barovernorthwestarrow", "barwedge", "basegrid", "baselinebottom", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbordermatrix", "bbox", "because", "beforesplitstring", "beforetestandsplitstring", "beta", "beth", "between", "bhook", "big", "bigbodyfont", "bigcap", "bigcirc", "bigcircle", "bigcup", "bigdiamond", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigodot", "bigoplus", "bigotimes", "bigr", "bigskip", "bigsqcap", "bigsqcup", "bigsquare", "bigstar", "bigtimes", "bigtriangledown", "bigtriangleup", "bigudot", "biguplus", "bigvee", "bigwedge", "binom", "bitmapimage", "blacklozenge", "blackrule", "blackrules", "blacksquare", "blacktriangle", "blacktriangledown", "blacktriangleleft", "blacktriangleright", "blank", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "blocksynctexfile", "blockuservariable", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "bookmark", "booleanmodevalue", "bordermatrix", "bot", "bottombox", "bottomleftbox", "bottomrightbox", "bowtie", "boxcursor", "boxdot", "boxmarker", "boxminus", "boxofsize", "boxplus", "boxreference", "boxtimes", "bpos", "breakablethinspace", "breakhere", "breve", "bstroke", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhiddencitation", "btxhybridcite", "btxlabellanguage", "btxlabeltext", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "buildmathaccent", "buildtextaccent", "buildtextbottomcomma", "buildtextbottomdot", "buildtextcedilla", "buildtextgrave", "buildtextmacron", "buildtextognek", "bullet", "button", "cacute", "calligraphic", "camel", "cap", "carriagereturn", "catcodetablename", "cbox", "ccaron", "ccedilla", "ccircumflex", "ccurl", "cdot", "cdotaccent", "cdotp", "cdots", "centeraligned", "centerbox", "centerdot", "centeredbox", "centeredlastline", "centerednextbox", "centerline", "cfrac", "chapter", "character", "characters", "chardescription", "charwidthlanguage", "check", "checkcharacteralign", "checkedblank", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checkmark", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chi", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "chook", "circ", "circeq", "circlearrowleft", "circlearrowright", "circledR", "circledS", "circledast", "circledcirc", "circleddash", "circledequals", "circleonrightarrow", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "clippedoverlayimage", "clonefield", "clubsuit", "collect", "collectedtext", "collectexpanded", "colon", "coloncolonequals", "colonequals", "color", "colorbar", "colorcomponents", "colored", "coloronly", "colorvalue", "column", "columnbreak", "columnsetspanwidth", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparecolorgroup", "comparedimension", "comparedimensioneps", "comparepalet", "complement", "completebtxrendering", "completecontent", "completeindex", "completelist", "completelistofabbreviations", "completelistofchemicals", "completelistoffigures", "completelistofgraphics", "completelistofintermezzi", "completelistoflogos", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completelistoftables", "completepagenumber", "completeregister", "complexes", "complexorsimple", "complexorsimpleempty", "component", "composedcollector", "composedlayer", "compresult", "cong", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertnumber", "convertvalue", "convertvboxtohbox", "coprod", "copyboxfromcache", "copybtxlabeltext", "copyfield", "copyheadtext", "copylabeltext", "copymathlabeltext", "copyoperatortext", "copypages", "copyparameters", "copyposition", "copyprefixtext", "copyright", "copysetups", "copysuffixtext", "copytaglabeltext", "copyunittext", "correctwhitespace", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "cstroke", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "cup", "curlyeqprec", "curlyeqsucc", "curlyvee", "curlywedge", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentdate", "currentenvironment", "currentfeaturetest", "currentheadnumber", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "curvearrowleft", "curvearrowright", "cwopencirclearrow", "cyrillicA", "cyrillicAE", "cyrillicAbreve", "cyrillicAdiaeresis", "cyrillicB", "cyrillicBIGYUS", "cyrillicBIGYUSiotified", "cyrillicC", "cyrillicCH", "cyrillicCHEDC", "cyrillicCHEDCabkhasian", "cyrillicCHEabkhasian", "cyrillicCHEdiaeresis", "cyrillicCHEkhakassian", "cyrillicCHEvertstroke", "cyrillicD", "cyrillicDASIAPNEUMATA", "cyrillicDJE", "cyrillicDZE", "cyrillicDZEabkhasian", "cyrillicDZHE", "cyrillicE", "cyrillicELtail", "cyrillicEMtail", "cyrillicENDC", "cyrillicENGHE", "cyrillicENhook", "cyrillicENtail", "cyrillicEREV", "cyrillicERY", "cyrillicERtick", "cyrillicEbreve", "cyrillicEdiaeresis", "cyrillicEgrave", "cyrillicEiotified", "cyrillicF", "cyrillicFITA", "cyrillicG", "cyrillicGHEmidhook", "cyrillicGHEstroke", "cyrillicGHEupturn", "cyrillicGJE", "cyrillicH", "cyrillicHA", "cyrillicHADC", "cyrillicHRDSN", "cyrillicI", "cyrillicIE", "cyrillicII", "cyrillicISHRT", "cyrillicISHRTtail", "cyrillicIZHITSA", "cyrillicIZHITSAdoublegrave", "cyrillicIdiaeresis", "cyrillicIgrave", "cyrillicImacron", "cyrillicJE", "cyrillicK", "cyrillicKADC", "cyrillicKAbashkir", "cyrillicKAhook", "cyrillicKAstroke", "cyrillicKAvertstroke", "cyrillicKJE", "cyrillicKOPPA", "cyrillicKSI", "cyrillicL", "cyrillicLITTLEYUS", "cyrillicLITTLEYUSiotified", "cyrillicLJE", "cyrillicM", "cyrillicN", "cyrillicNJE", "cyrillicO", "cyrillicOMEGA", "cyrillicOMEGAround", "cyrillicOMEGAtitlo", "cyrillicOT", "cyrillicObarred", "cyrillicObarreddiaeresis", "cyrillicOdiaeresis", "cyrillicP", "cyrillicPALATALIZATION", "cyrillicPALOCHKA", "cyrillicPEmidhook", "cyrillicPSI", "cyrillicPSILIPNEUMATA", "cyrillicR", "cyrillicS", "cyrillicSCHWA", "cyrillicSCHWAdiaeresis", "cyrillicSDSC", "cyrillicSEMISOFT", "cyrillicSFTSN", "cyrillicSH", "cyrillicSHCH", "cyrillicSHHA", "cyrillicT", "cyrillicTEDC", "cyrillicTETSE", "cyrillicTITLO", "cyrillicTSHE", "cyrillicU", "cyrillicUK", "cyrillicUSHRT", "cyrillicUdiaeresis", "cyrillicUdoubleacute", "cyrillicUmacron", "cyrillicV", "cyrillicYA", "cyrillicYAT", "cyrillicYERUdiaeresis", "cyrillicYI", "cyrillicYO", "cyrillicYU", "cyrillicYstr", "cyrillicYstrstroke", "cyrillicZ", "cyrillicZDSC", "cyrillicZEdiaeresis", "cyrillicZH", "cyrillicZHEbreve", "cyrillicZHEdescender", "cyrillicZHEdiaeresis", "cyrillica", "cyrillicabreve", "cyrillicadiaeresis", "cyrillicae", "cyrillicb", "cyrillicbigyus", "cyrillicbigyusiotified", "cyrillicc", "cyrillicch", "cyrilliccheabkhasian", "cyrillicchedc", "cyrillicchedcabkhasian", "cyrillicchediaeresis", "cyrillicchekhakassian", "cyrillicchevertstroke", "cyrillicd", "cyrillicdje", "cyrillicdze", "cyrillicdzeabkhasian", "cyrillicdzhe", "cyrillice", "cyrillicebreve", "cyrillicediaeresis", "cyrillicegrave", "cyrilliceiotified", "cyrilliceltail", "cyrillicemtail", "cyrillicendc", "cyrillicenghe", "cyrillicenhook", "cyrillicentail", "cyrillicerev", "cyrillicertick", "cyrillicery", "cyrillicf", "cyrillicfita", "cyrillicg", "cyrillicghemidhook", "cyrillicghestroke", "cyrillicgheupturn", "cyrillicgje", "cyrillich", "cyrillicha", "cyrillichadc", "cyrillichrdsn", "cyrillici", "cyrillicidiaeresis", "cyrillicie", "cyrillicigrave", "cyrillicii", "cyrillicimacron", "cyrillicishrt", "cyrillicishrttail", "cyrillicizhitsa", "cyrillicizhitsadoublegrave", "cyrillicje", "cyrillick", "cyrillickabashkir", "cyrillickadc", "cyrillickahook", "cyrillickastroke", "cyrillickavertstroke", "cyrillickje", "cyrillickoppa", "cyrillicksi", "cyrillicl", "cyrilliclittleyus", "cyrilliclittleyusiotified", "cyrilliclje", "cyrillicm", "cyrillicn", "cyrillicnje", "cyrillico", "cyrillicobarred", "cyrillicobarreddiaeresis", "cyrillicodiaeresis", "cyrillicomega", "cyrillicomegaround", "cyrillicomegatitlo", "cyrillicot", "cyrillicp", "cyrillicpemidhook", "cyrillicpsi", "cyrillicr", "cyrillics", "cyrillicschwa", "cyrillicschwadiaeresis", "cyrillicsdsc", "cyrillicsemisoft", "cyrillicsftsn", "cyrillicsh", "cyrillicshch", "cyrillicshha", "cyrillict", "cyrillictedc", "cyrillictetse", "cyrillictshe", "cyrillicu", "cyrillicudiaeresis", "cyrillicudoubleacute", "cyrillicuk", "cyrillicumacron", "cyrillicushrt", "cyrillicv", "cyrillicya", "cyrillicyat", "cyrillicyerudiaeresis", "cyrillicyi", "cyrillicyo", "cyrillicystr", "cyrillicystrstroke", "cyrillicyu", "cyrillicz", "cyrilliczdsc", "cyrilliczediaeresis", "cyrilliczh", "cyrilliczhebreve", "cyrilliczhedescender", "cyrilliczhediaeresis", "d", "dag", "dagger", "daleth", "dasharrow", "dashedleftarrow", "dashedrightarrow", "dashv", "datasetvariable", "date", "dayoftheweek", "dayspermonth", "dbinom", "dcaron", "dcurl", "ddag", "ddagger", "dddot", "ddot", "ddots", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "define", "defineMPinstance", "defineTABLEsetup", "defineaccent", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "defineblock", "definebodyfont", "definebodyfontenvironment", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebuffer", "definebutton", "definecapitals", "definecharacter", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolor", "definecolorgroup", "definecolumnbreak", "definecolumnset", "definecolumnsetarea", "definecolumnsetspan", "definecombination", "definecombinedlist", "definecommand", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversion", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedeq", "definedescription", "definedfont", "defineeffect", "defineenumeration", "defineexpandable", "defineexternalfigure", "definefacingfloat", "definefallbackfamily", "definefield", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefieldstack", "definefiguresymbol", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefloat", "definefont", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "definefontstyle", "definefontsynonym", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframed", "defineframedcontent", "defineframedtable", "defineframedtext", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "definehbox", "definehead", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinteractionmenu", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabel", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelist", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemakeup", "definemarginblock", "definemargindata", "definemarker", "definemarking", "definemathaccent", "definemathalignment", "definemathcases", "definemathcommand", "definemathdouble", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathover", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunder", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "defineoverlay", "definepage", "definepagebreak", "definepagechecker", "definepagecolumns", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "definepalet", "definepapersize", "defineparagraph", "defineparagraphs", "defineparallel", "defineparbuilder", "defineperiodkerning", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "defineprofile", "defineprogram", "definepushbutton", "definepushsymbol", "definereference", "definereferenceformat", "defineregister", "definerenderingwindow", "defineresetset", "defineruby", "definescale", "definescript", "definesection", "definesectionblock", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definesorting", "definespotcolor", "definestartstop", "definestyle", "definestyleinstance", "definesubfield", "definesubformula", "definesymbol", "definesynonym", "definesynonyms", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabletemplate", "definetabulate", "definetabulation", "definetext", "definetextbackground", "definetextflow", "definetokenlist", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "definetyping", "defineunit", "defineuserdata", "defineuserdataalternative", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "delimited", "delimitedtext", "delta", "depthofstring", "depthonlybox", "depthspanningtext", "depthstrut", "determineheadnumber", "determinelistcharacteristics", "determinenoflines", "determineregistercharacteristics", "devanagarinumerals", "dfrac", "dhook", "diameter", "diamond", "diamondsuit", "differentialD", "differentiald", "digamma", "digits", "dimensiontocount", "directboxfromcache", "directcolor", "directcolored", "directconvertedcounter", "directcopyboxfromcache", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "div", "dividedsize", "divideontimes", "divides", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dofastloopcs", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifassignmentelsecs", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdocumentvariable", "doifdocumentvariableelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseassignmentcs", "doifelseblack", "doifelsebox", "doifelseboxincache", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedocumentvariable", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontfeature", "doifelsefontpresent", "doifelsefontsynonym", "doifelseframed", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarkedpage", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpage", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetopofpage", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontfeatureelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotdocumentvariable", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftopofpageelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifunknownfontfeature", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dot", "doteq", "doteqdot", "dotfskip", "dotlessI", "dotlessJ", "dotlessi", "dotlessj", "dotlessjstroke", "dotminus", "dotoks", "dotplus", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "dots", "dottedcircle", "dottedrightarrow", "doublebar", "doublebond", "doublebrace", "doublebracket", "doublecap", "doublecup", "doubleparent", "doubleprime", "doubleverticalbar", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "downarrow", "downdasharrow", "downdownarrows", "downharpoonleft", "downharpoonright", "downuparrows", "downwhitearrow", "downzigzagarrow", "dpofstring", "dstroke", "dtail", "dummydigit", "dummyparameter", "dzcaronligature", "dzligature", "eTeX", "eacute", "ebreve", "ecaron", "ecedilla", "ecircumflex", "ecircumflexacute", "ecircumflexdotbelow", "ecircumflexgrave", "ecircumflexhook", "ecircumflextilde", "edefconvertedargument", "ediaeresis", "edotaccent", "edotbelow", "edoublegrave", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "egrave", "ehook", "einvertedbreve", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "ell", "em", "emacron", "emdash", "emphasisboldface", "emphasistypeface", "emptylines", "emptyset", "emquad", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "endash", "endnote", "enquad", "enskip", "enspace", "env", "environment", "envvar", "eogonek", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "epsilon", "eq", "eqcirc", "eqeq", "eqeqeq", "eqgtr", "eqless", "eqsim", "eqslantgtr", "eqslantless", "equaldigits", "equalscolon", "equiv", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "eta", "eth", "ethiopic", "etilde", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "exclamdown", "executeifdefined", "exists", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandeddoif", "expandeddoifelse", "expandeddoifnot", "expandfontsynonym", "expdoif", "expdoifcommonelse", "expdoifelse", "expdoifelsecommon", "expdoifelseinset", "expdoifinsetelse", "expdoifnot", "exponentiale", "externalfigure", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "fallingdotseq", "fastdecrement", "fastincrement", "fastlocalframed", "fastloopfinal", "fastloopindex", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "ffiligature", "ffligature", "fflligature", "fhook", "field", "fieldbody", "fieldstack", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figurespace", "figuresymbol", "figurewidth", "filename", "filigature", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "fillinline", "fillinrules", "fillintext", "fillupto", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstinlist", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfield", "fitfieldframed", "fittopbaselinegrid", "fiveeighths", "fivesixths", "fixedspace", "fixedspaces", "flag", "flat", "flligature", "floatuserdataparameter", "flushbox", "flushboxregister", "flushcollector", "flushedrightlastline", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnote", "footnotetext", "forall", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "forgetparskip", "forgetragged", "formula", "formulanumber", "foundbox", "fourfifths", "fourperemspace", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "framed", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "from", "fromlinenote", "frown", "frozenhbox", "frule", "gacute", "gamma", "gbreve", "gcaron", "gcircumflex", "gcommaaccent", "gdefconvertedargument", "gdefconvertedcommand", "gdotaccent", "ge", "geq", "geqq", "geqslant", "getMPdrawing", "getMPlayer", "getboxfromcache", "getboxllx", "getboxlly", "getbuffer", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getinlineuserdata", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmarking", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "gets", "getsubstring", "gettokenlist", "gettwopassdata", "gettwopassdatalist", "getuserdata", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "gg", "ggg", "gggtr", "gimel", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gnapprox", "gneqq", "gnsim", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "godown", "goto", "gotobox", "gotopage", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grave", "graycolor", "grayvalue", "greedysplitstring", "greekAlpha", "greekAlphadasia", "greekAlphadasiaperispomeni", "greekAlphadasiatonos", "greekAlphadasiavaria", "greekAlphaiotasub", "greekAlphaiotasubdasia", "greekAlphaiotasubdasiaperispomeni", "greekAlphaiotasubdasiatonos", "greekAlphaiotasubdasiavaria", "greekAlphaiotasubpsili", "greekAlphaiotasubpsiliperispomeni", "greekAlphaiotasubpsilitonos", "greekAlphaiotasubpsilivaria", "greekAlphamacron", "greekAlphapsili", "greekAlphapsiliperispomeni", "greekAlphapsilitonos", "greekAlphapsilivaria", "greekAlphatonos", "greekAlphavaria", "greekAlphavrachy", "greekBeta", "greekChi", "greekCoronis", "greekDelta", "greekEpsilon", "greekEpsilondasia", "greekEpsilondasiatonos", "greekEpsilondasiavaria", "greekEpsilonpsili", "greekEpsilonpsilitonos", "greekEpsilonpsilivaria", "greekEpsilontonos", "greekEpsilonvaria", "greekEta", "greekEtadasia", "greekEtadasiaperispomeni", "greekEtadasiatonos", "greekEtadasiavaria", "greekEtaiotasub", "greekEtaiotasubdasia", "greekEtaiotasubdasiaperispomeni", "greekEtaiotasubdasiatonos", "greekEtaiotasubdasiavaria", "greekEtaiotasubpsili", "greekEtaiotasubpsiliperispomeni", "greekEtaiotasubpsilitonos", "greekEtaiotasubpsilivaria", "greekEtapsili", "greekEtapsiliperispomeni", "greekEtapsilitonos", "greekEtapsilivaria", "greekEtatonos", "greekEtavaria", "greekGamma", "greekIota", "greekIotadasia", "greekIotadasiaperispomeni", "greekIotadasiatonos", "greekIotadasiavaria", "greekIotadialytika", "greekIotamacron", "greekIotapsili", "greekIotapsiliperispomeni", "greekIotapsilitonos", "greekIotapsilivaria", "greekIotatonos", "greekIotavaria", "greekIotavrachy", "greekKappa", "greekLambda", "greekMu", "greekNu", "greekOmega", "greekOmegadasia", "greekOmegadasiaperispomeni", "greekOmegadasiatonos", "greekOmegadasiavaria", "greekOmegaiotasub", "greekOmegaiotasubdasia", "greekOmegaiotasubdasiaperispomeni", "greekOmegaiotasubdasiatonos", "greekOmegaiotasubdasiavaria", "greekOmegaiotasubpsili", "greekOmegaiotasubpsiliperispomeni", "greekOmegaiotasubpsilitonos", "greekOmegaiotasubpsilivaria", "greekOmegapsili", "greekOmegapsiliperispomeni", "greekOmegapsilitonos", "greekOmegapsilivaria", "greekOmegatonos", "greekOmegavaria", "greekOmicron", "greekOmicrondasia", "greekOmicrondasiatonos", "greekOmicrondasiavaria", "greekOmicronpsili", "greekOmicronpsilitonos", "greekOmicronpsilivaria", "greekOmicrontonos", "greekOmicronvaria", "greekPhi", "greekPi", "greekPsi", "greekRho", "greekRhodasia", "greekSigma", "greekSigmalunate", "greekTau", "greekTheta", "greekUpsilon", "greekUpsilondasia", "greekUpsilondasiaperispomeni", "greekUpsilondasiatonos", "greekUpsilondasiavaria", "greekUpsilondialytika", "greekUpsilonmacron", "greekUpsilontonos", "greekUpsilonvaria", "greekUpsilonvrachy", "greekXi", "greekZeta", "greekalpha", "greekalphadasia", "greekalphadasiaperispomeni", "greekalphadasiatonos", "greekalphadasiavaria", "greekalphaiotasub", "greekalphaiotasubdasia", "greekalphaiotasubdasiaperispomeni", "greekalphaiotasubdasiatonos", "greekalphaiotasubdasiavaria", "greekalphaiotasubperispomeni", "greekalphaiotasubpsili", "greekalphaiotasubpsiliperispomeni", "greekalphaiotasubpsilitonos", "greekalphaiotasubpsilivaria", "greekalphaiotasubtonos", "greekalphaiotasubvaria", "greekalphamacron", "greekalphaoxia", "greekalphaperispomeni", "greekalphapsili", "greekalphapsiliperispomeni", "greekalphapsilitonos", "greekalphapsilivaria", "greekalphatonos", "greekalphavaria", "greekalphavrachy", "greekbeta", "greekbetaalt", "greekchi", "greekdasia", "greekdasiaperispomeni", "greekdasiatonos", "greekdasiavaria", "greekdelta", "greekdialytikaperispomeni", "greekdialytikatonos", "greekdialytikavaria", "greekdigamma", "greekepsilon", "greekepsilonalt", "greekepsilondasia", "greekepsilondasiatonos", "greekepsilondasiavaria", "greekepsilonoxia", "greekepsilonpsili", "greekepsilonpsilitonos", "greekepsilonpsilivaria", "greekepsilontonos", "greekepsilonvaria", "greeketa", "greeketadasia", "greeketadasiaperispomeni", "greeketadasiatonos", "greeketadasiavaria", "greeketaiotasub", "greeketaiotasubdasia", "greeketaiotasubdasiaperispomeni", "greeketaiotasubdasiatonos", "greeketaiotasubdasiavaria", "greeketaiotasubperispomeni", "greeketaiotasubpsili", "greeketaiotasubpsiliperispomeni", "greeketaiotasubpsilitonos", "greeketaiotasubpsilivaria", "greeketaiotasubtonos", "greeketaiotasubvaria", "greeketaoxia", "greeketaperispomeni", "greeketapsili", "greeketapsiliperispomeni", "greeketapsilitonos", "greeketapsilivaria", "greeketatonos", "greeketavaria", "greekfinalsigma", "greekgamma", "greekiota", "greekiotadasia", "greekiotadasiaperispomeni", "greekiotadasiatonos", "greekiotadasiavaria", "greekiotadialytika", "greekiotadialytikaperispomeni", "greekiotadialytikatonos", "greekiotadialytikavaria", "greekiotamacron", "greekiotaoxia", "greekiotaperispomeni", "greekiotapsili", "greekiotapsiliperispomeni", "greekiotapsilitonos", "greekiotapsilivaria", "greekiotatonos", "greekiotavaria", "greekiotavrachy", "greekkappa", "greekkoppa", "greeklambda", "greekmu", "greeknu", "greeknumerals", "greeknumkoppa", "greekomega", "greekomegadasia", "greekomegadasiaperispomeni", "greekomegadasiatonos", "greekomegadasiavaria", "greekomegaiotasub", "greekomegaiotasubdasia", "greekomegaiotasubdasiaperispomeni", "greekomegaiotasubdasiatonos", "greekomegaiotasubdasiavaria", "greekomegaiotasubperispomeni", "greekomegaiotasubpsili", "greekomegaiotasubpsiliperispomeni", "greekomegaiotasubpsilitonos", "greekomegaiotasubpsilivaria", "greekomegaiotasubtonos", "greekomegaiotasubvaria", "greekomegaoxia", "greekomegaperispomeni", "greekomegapsili", "greekomegapsiliperispomeni", "greekomegapsilitonos", "greekomegapsilivaria", "greekomegatonos", "greekomegavaria", "greekomicron", "greekomicrondasia", "greekomicrondasiatonos", "greekomicrondasiavaria", "greekomicronoxia", "greekomicronpsili", "greekomicronpsilitonos", "greekomicronpsilivaria", "greekomicrontonos", "greekomicronvaria", "greekoxia", "greekperispomeni", "greekphi", "greekphialt", "greekpi", "greekpialt", "greekprosgegrammeni", "greekpsi", "greekpsili", "greekpsiliperispomeni", "greekpsilitonos", "greekpsilivaria", "greekrho", "greekrhoalt", "greekrhodasia", "greekrhopsili", "greeksampi", "greeksigma", "greeksigmalunate", "greekstigma", "greektau", "greektheta", "greekthetaalt", "greektonos", "greekupsilon", "greekupsilondasia", "greekupsilondasiaperispomeni", "greekupsilondasiatonos", "greekupsilondasiavaria", "greekupsilondiaeresis", "greekupsilondialytikaperispomeni", "greekupsilondialytikatonos", "greekupsilondialytikavaria", "greekupsilonmacron", "greekupsilonoxia", "greekupsilonperispomeni", "greekupsilonpsili", "greekupsilonpsiliperispomeni", "greekupsilonpsilitonos", "greekupsilonpsilivaria", "greekupsilontonos", "greekupsilonvaria", "greekupsilonvrachy", "greekvaria", "greekxi", "greekzeta", "grid", "groupedcommand", "gsetboxllx", "gsetboxlly", "gstroke", "gt", "gtrapprox", "gtrdot", "gtreqless", "gtreqqless", "gtrless", "gtrsim", "guilsingleleft", "guilsingleright", "gujaratinumerals", "gurmurkhinumerals", "hairline", "hairspace", "halflinestrut", "halfstrut", "halfwaybox", "handletokens", "handwritten", "hangul", "hanzi", "hash", "hat", "hbar", "hboxofvbox", "hboxreference", "hcaron", "hcircumflex", "hdofstring", "headhbox", "headlanguage", "headnumber", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtext", "headtextcontent", "headtextdistance", "headtexts", "headtextwidth", "headvbox", "headwidth", "heartsuit", "hebrewAlef", "hebrewAyin", "hebrewBet", "hebrewDalet", "hebrewGimel", "hebrewHe", "hebrewHet", "hebrewKaf", "hebrewKaffinal", "hebrewLamed", "hebrewMem", "hebrewMemfinal", "hebrewNun", "hebrewNunfinal", "hebrewPe", "hebrewPefinal", "hebrewQof", "hebrewResh", "hebrewSamekh", "hebrewShin", "hebrewTav", "hebrewTet", "hebrewTsadi", "hebrewTsadifinal", "hebrewVav", "hebrewYod", "hebrewZayin", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "hideblocks", "high", "highlight", "highordinalstr", "hilo", "himilo", "hl", "hookleftarrow", "hookrightarrow", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hslash", "hsmash", "hsmashbox", "hsmashed", "hspace", "hstroke", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "iacute", "ibox", "ibreve", "icaron", "icircumflex", "ideographichalffillspace", "ideographicspace", "idiaeresis", "idotaccent", "idotbelow", "idoublegrave", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignoretagsinexport", "ignorevalue", "igrave", "ihook", "iiiint", "iiiintop", "iiint", "iiintop", "iint", "iintop", "iinvertedbreve", "ijligature", "imacron", "imaginaryi", "imaginaryj", "imath", "immediatesavetwopassdata", "impliedby", "implies", "imply", "in", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "index", "infofont", "infofontbold", "inframed", "infty", "infull", "inheritparameter", "inhibitblank", "ininner", "ininneredge", "ininnermargin", "initializeboxstack", "inleft", "inleftedge", "inleftmargin", "inline", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlineprettyprintbuffer", "inlinerange", "inmargin", "inmframed", "innerflushshapebox", "inother", "inouter", "inouteredge", "inoutermargin", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "inright", "inrightedge", "inrightmargin", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installglobalmacrostack", "installlanguage", "installleftframerenderer", "installmacrostack", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "int", "intclockwise", "integerrounding", "integers", "interactionbar", "interactionbuttons", "interactionmenu", "intercal", "intertext", "intop", "invisibletimes", "invokepageheandler", "iogonek", "iota", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "italicface", "item", "items", "itemtag", "itilde", "jcaron", "jcircumflex", "jmath", "jobfilename", "jobfilesuffix", "kap", "kappa", "kcaron", "kcommaaccent", "keepblocks", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "khook", "kkra", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "lVert", "labellanguage", "labeltext", "labeltexts", "lacute", "lambda", "lambdabar", "land", "langle", "language", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "latin", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbar", "lbox", "lbrace", "lbracket", "lcaron", "lceil", "lcommaaccent", "lcurl", "ldotmiddle", "ldotp", "ldots", "le", "leadsto", "left", "leftaligned", "leftarrow", "leftarrowtail", "leftarrowtriangle", "leftbottombox", "leftbox", "leftdasharrow", "leftguillemot", "leftharpoondown", "leftharpoonup", "lefthbox", "leftheadtext", "leftlabeltext", "leftleftarrows", "leftline", "leftmathlabeltext", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftrightarrow", "leftrightarrows", "leftrightarrowtriangle", "leftrightharpoons", "leftrightsquigarrow", "leftskipadaption", "leftsquigarrow", "leftsubguillemot", "leftthreetimes", "lefttopbox", "lefttoright", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "leftwavearrow", "leftwhitearrow", "leq", "leqq", "leqslant", "lessapprox", "lessdot", "lesseqgtr", "lesseqqgtr", "lessgtr", "lesssim", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterleftbracket", "letterleftparenthesis", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "letterrightbracket", "letterrightparenthesis", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lfloor", "lgroup", "lhbox", "lhooknwarrow", "lhooksearrow", "limitatefirstline", "limitatelines", "limitatetext", "line", "linebox", "linefeed", "linenote", "linespanningtext", "linethickness", "linterval", "listcitation", "listcite", "listlength", "listnamespaces", "ljligature", "ll", "llangle", "llap", "llbracket", "llcorner", "lll", "llless", "lmoustache", "lnapprox", "lneq", "lneqq", "lnot", "lnsim", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "logo", "lohi", "lointerval", "lomihi", "longleftarrow", "longleftrightarrow", "longmapsfrom", "longmapsto", "longrightarrow", "longrightsquigarrow", "looparrowleft", "looparrowright", "lor", "low", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lozenge", "lparent", "lrcorner", "lrointerval", "lrtbbox", "lstroke", "lt", "ltimes", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luaexpr", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "lvert", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "mainlanguage", "makecharacteractive", "makerawcommalist", "makestrutofbox", "maltese", "mapfontsize", "mapsdown", "mapsfrom", "mapsto", "mapsup", "margindata", "margintext", "markcontent", "markedpages", "marking", "markinjector", "markpage", "mat", "math", "mathampersand", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathdefault", "mathdollar", "mathdouble", "mathematics", "mathfraktur", "mathfunction", "mathhash", "mathhyphen", "mathit", "mathitalic", "mathlabellanguage", "mathlabeltext", "mathlabeltexts", "mathop", "mathover", "mathpercent", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathunder", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "maxaligned", "mbox", "mcframed", "measure", "measured", "measuredangle", "measuredeq", "medskip", "medspace", "menubutton", "mequal", "message", "metaTeX", "mfence", "mframed", "mfunction", "mfunctionlabeltext", "mhbox", "mho", "mhookleftarrow", "mhookrightarrow", "mid", "midaligned", "middle", "middlealigned", "middlebox", "midhbox", "midsubsentence", "minimalhbox", "minus", "minuscolon", "mirror", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "models", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "month", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "mu", "multimap", "nHdownarrow", "nHuparrow", "nLeftarrow", "nLeftrightarrow", "nRightarrow", "nVDash", "nVdash", "nVleftarrow", "nVleftrightarrow", "nVrightarrow", "nabla", "nacute", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "napostrophe", "napprox", "napproxEq", "narrownobreakspace", "nasymp", "natural", "naturalhbox", "naturalhpack", "naturalnumbers", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "ncaron", "ncommaaccent", "ncong", "ncurl", "ndivides", "ne", "nearrow", "neg", "negatecolorbox", "negated", "negativesign", "negemspace", "negenspace", "negthinspace", "neng", "neq", "nequiv", "neswarrow", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nexists", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "ngeq", "ngrave", "ngtr", "ngtrless", "ngtrsim", "ni", "nihongo", "nin", "njligature", "nleftarrow", "nleftrightarrow", "nleq", "nless", "nlessgtr", "nlesssim", "nmid", "nni", "nobar", "nobreakspace", "nocap", "nocharacteralign", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noheaderandfooterlines", "noheightstrut", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalitalicface", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normalslantedface", "normaltypeface", "nospace", "not", "note", "notesymbol", "notin", "notopandbottomlines", "notragged", "nowns", "nparallel", "nprec", "npreccurlyeq", "nrightarrow", "nsim", "nsimeq", "nsqsubseteq", "nsqsupseteq", "nsubset", "nsubseteq", "nsucc", "nsucccurlyeq", "nsupset", "nsupseteq", "ntilde", "ntimes", "ntriangleleft", "ntrianglelefteq", "ntriangleright", "ntrianglerighteq", "nu", "numberofpoints", "numbers", "nvDash", "nvdash", "nvleftarrow", "nvleftrightarrow", "nvrightarrow", "nwarrow", "nwsearrow", "oacute", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "obreve", "ocaron", "ocircumflex", "ocircumflexacute", "ocircumflexdotbelow", "ocircumflexgrave", "ocircumflexhook", "ocircumflextilde", "odiaeresis", "odiaeresismacron", "odot", "odotaccent", "odotaccentmacron", "odotbelow", "odoublegrave", "oeligature", "offset", "offsetbox", "ograve", "ohm", "ohook", "ohorn", "ohornacute", "ohorndotbelow", "ohorngrave", "ohornhook", "ohorntilde", "ohungarumlaut", "oiiint", "oiint", "oint", "ointclockwise", "ointctrclockwise", "oinvertedbreve", "omacron", "omega", "omicron", "ominus", "onedigitrounding", "oneeighth", "onefifth", "onehalf", "onequarter", "onesixth", "onesuperior", "onethird", "oogonek", "oogonekmacron", "operatorlanguage", "operatortext", "oplus", "ordfeminine", "ordinaldaynumber", "ordinalstr", "ordmasculine", "ornamenttext", "oslash", "ostroke", "ostrokeacute", "otilde", "otildemacron", "otimes", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbarunderbar", "overbrace", "overbraceunderbrace", "overbracket", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlayimage", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overloaderror", "overparent", "overparentunderparent", "overrightarrow", "overset", "overstrike", "overstrikes", "owns", "page", "pagearea", "pagebreak", "pagefigure", "pageinjection", "pagenumber", "pagereference", "pagestaterealpage", "pagestaterealpageorder", "paletsize", "paragraphmark", "parallel", "part", "partial", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "periodcentered", "periods", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "perp", "persiandecimals", "persiandecimalseparator", "persiannumerals", "persianthousandsseparator", "perthousand", "phantom", "phantombox", "phi", "phook", "pi", "pickupgroupedcommand", "pitchfork", "placeattachments", "placebookmarks", "placebtxrendering", "placechemical", "placecitation", "placecombinedlist", "placecomments", "placecontent", "placecurrentformulanumber", "placedbox", "placefigure", "placefloat", "placefloatwithsetups", "placefootnotes", "placeformula", "placeframed", "placegraphic", "placeheadnumber", "placeheadtext", "placehelp", "placeindex", "placeinitial", "placeintermezzo", "placelayer", "placelayeredtext", "placelegend", "placelist", "placelistofabbreviations", "placelistofchemicals", "placelistoffigures", "placelistofgraphics", "placelistofintermezzi", "placelistoflogos", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelistoftables", "placelocalfootnotes", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placeongrid", "placeontopofeachother", "placepagenumber", "placepairedbox", "placeparallel", "placerawlist", "placeregister", "placerenderingwindow", "placesidebyside", "placesubformula", "placetable", "pm", "popattribute", "popmacro", "popmode", "popsystemmode", "position", "positionoverlay", "positionregionoverlay", "positivesign", "postponenotes", "prec", "precapprox", "preccurlyeq", "preceq", "preceqq", "precnapprox", "precneq", "precneqq", "precnsim", "precsim", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prefixlanguage", "prefixtext", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "prerollblank", "presetbtxlabeltext", "presetdocument", "presetfieldsymbols", "presetheadtext", "presetlabeltext", "presetmathlabeltext", "presetoperatortext", "presetprefixtext", "presetsuffixtext", "presettaglabeltext", "presetunittext", "pretocommalist", "prettyprintbuffer", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "prime", "primes", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processblocks", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "prod", "product", "profiledbox", "profilegivenbox", "program", "project", "propto", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "psi", "punctuationspace", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "putboxincache", "putnextboxincache", "qquad", "quad", "quadrupleprime", "quads", "quarterstrut", "questiondown", "questionedeq", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "quotation", "quote", "quotedbl", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "quotesingle", "quotesinglebase", "rVert", "racute", "raggedbottom", "raggedcenter", "raggedleft", "raggedright", "raggedwidecenter", "raisebox", "randomizetext", "randomnumber", "rangle", "rationals", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "rbrace", "rbracket", "rcaron", "rceil", "rcommaaccent", "rdoublegrave", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "reals", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "reference", "referenceprefix", "referring", "registerattachment", "registerctxluafile", "registered", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "relbar", "remainingcharacters", "remark", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetboxesincache", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmarking", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetperiodkerning", "resetprofile", "resetrecurselevel", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettokenlist", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "restriction", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "reverseddoubleprime", "reversedprime", "reversedtripleprime", "revivefeature", "rfence", "rfloor", "rgroup", "rhbox", "rho", "rhooknearrow", "rhookswarrow", "right", "rightaligned", "rightangle", "rightarrow", "rightarrowbar", "rightarrowtail", "rightarrowtriangle", "rightbottombox", "rightbox", "rightdasharrow", "rightguillemot", "rightharpoondown", "rightharpoonup", "righthbox", "rightheadtext", "rightlabeltext", "rightleftarrows", "rightleftharpoons", "rightline", "rightmathlabeltext", "rightorleftpageaction", "rightpageorder", "rightrightarrows", "rightskipadaption", "rightsquigarrow", "rightsubguillemot", "rightthreearrows", "rightthreetimes", "righttoleft", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rightwavearrow", "rightwhitearrow", "ring", "rinterval", "rinvertedbreve", "risingdotseq", "rlap", "rlointerval", "rmoustache", "rneq", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rointerval", "rollbutton", "roman", "romanC", "romanD", "romanI", "romanII", "romanIII", "romanIV", "romanIX", "romanL", "romanM", "romanV", "romanVI", "romanVII", "romanVIII", "romanX", "romanXI", "romanXII", "romanc", "romand", "romani", "romanii", "romaniii", "romaniv", "romanix", "romanl", "romanm", "romannumerals", "romanv", "romanvi", "romanvii", "romanviii", "romanx", "romanxi", "romanxii", "rootradical", "rotate", "rparent", "rrangle", "rrbracket", "rrointerval", "rtimes", "rtop", "ruby", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "rvert", "sacute", "safechar", "samplefile", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "scale", "scaron", "scedilla", "schwa", "schwahook", "scircumflex", "scommaaccent", "screen", "searrow", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "section", "sectionmark", "seeindex", "select", "selectblocks", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setautopagestaterealpageno", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharacteraligndetail", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setfirstpasscharacteralign", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setglobalscript", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelement", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setlocalscript", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setminus", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setperiodkerning", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsecondpasscharacteralign", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settextcontent", "settightobject", "settightreferencedobject", "settightstrut", "settightunreferencedobject", "settokenlist", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupalign", "setupalternativestyles", "setuparranging", "setupattachment", "setupattachments", "setupbackend", "setupbackground", "setupbackgrounds", "setupbar", "setupbars", "setupblackrules", "setupblank", "setupbleeding", "setupblock", "setupbodyfont", "setupbookmark", "setupbottom", "setupbottomtexts", "setupbtx", "setupbtxdataset", "setupbtxlabeltext", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbuffer", "setupbutton", "setupcapitals", "setupcaption", "setupcaptions", "setupcharacteralign", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupclipping", "setupcollector", "setupcolor", "setupcolors", "setupcolumns", "setupcolumnset", "setupcolumnsetarea", "setupcolumnsetareatext", "setupcolumnsetlines", "setupcolumnsetspan", "setupcolumnsetstart", "setupcolumnspan", "setupcombination", "setupcombinedlist", "setupcomment", "setupcontent", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenumerations", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfacingfloat", "setupfield", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfields", "setupfieldtotalframed", "setupfiller", "setupfillinlines", "setupfillinrules", "setupfirstline", "setupfittingpage", "setupfloat", "setupfloatframed", "setupfloats", "setupfloatsplitting", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupfooter", "setupfootertexts", "setupforms", "setupformula", "setupformulae", "setupformulaframed", "setupframed", "setupframedcontent", "setupframedtable", "setupframedtablecolumn", "setupframedtablerow", "setupframedtext", "setupframedtexts", "setupglobalreferenceprefix", "setuphead", "setupheadalternative", "setupheader", "setupheadertexts", "setupheadnumber", "setupheads", "setupheadtext", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setuphyphenmark", "setupindentedtext", "setupindenting", "setupindex", "setupinitial", "setupinsertion", "setupinteraction", "setupinteractionbar", "setupinteractionmenu", "setupinteractionscreen", "setupinterlinespace", "setupitaliccorrection", "setupitemgroup", "setupitemizations", "setupitemize", "setupitems", "setuplabel", "setuplabeltext", "setuplanguage", "setuplayer", "setuplayeredtext", "setuplayout", "setuplayouttext", "setuplegend", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinenumbering", "setuplines", "setuplinetable", "setuplinewidth", "setuplist", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmakeup", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmarginrules", "setupmarking", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathfractions", "setupmathframed", "setupmathlabeltext", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnarrower", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoperatortext", "setupoppositeplacing", "setupoutputroutine", "setuppagechecker", "setuppagecolumns", "setuppagecomment", "setuppageinjection", "setuppageinjectionalternative", "setuppagenumber", "setuppagenumbering", "setuppageshift", "setuppagestate", "setuppagetransitions", "setuppairedbox", "setuppalet", "setuppaper", "setuppapersize", "setupparagraph", "setupparagraphintro", "setupparagraphnumbering", "setupparagraphs", "setupparallel", "setupperiodkerning", "setupperiods", "setupplacement", "setuppositionbar", "setuppositioning", "setupprefixtext", "setupprocessor", "setupprofile", "setupprograms", "setupquotation", "setupquote", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupreferencing", "setupregister", "setupregisters", "setuprenderingwindow", "setuprotate", "setupruby", "setups", "setupscale", "setupscript", "setupscripts", "setupsectionblock", "setupselector", "setupshift", "setupsidebar", "setupsorting", "setupspacing", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setupsubformulas", "setupsubpagenumber", "setupsuffixtext", "setupsymbolset", "setupsynctex", "setupsynonyms", "setuptables", "setuptabulate", "setuptabulation", "setuptagging", "setuptaglabeltext", "setuptext", "setuptextbackground", "setuptextflow", "setuptextrules", "setuptexttexts", "setupthinrules", "setuptolerance", "setuptooltip", "setuptop", "setuptoptexts", "setuptype", "setuptyping", "setupunit", "setupunittext", "setupurl", "setupuserdata", "setupuserdataalternative", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwhitespace", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "seveneighths", "sfrac", "shapedhbox", "sharp", "shiftbox", "shiftdown", "shiftup", "showallmakeup", "showattributes", "showbodyfont", "showbodyfontenvironment", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolor", "showcolorbar", "showcolorcomponents", "showcolorgroup", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontexpansion", "showfontitalics", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showframe", "showglyphdata", "showglyphs", "showgrid", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayout", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmakeup", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showpalet", "showparentchain", "showprint", "showsetups", "showsetupsdefinition", "showstruts", "showsymbolset", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "sigma", "signalrightpage", "sim", "simeq", "simplealignedbox", "simplealignedboxplus", "simplealignedspreadbox", "simplegroupedcommand", "simplereversealignedbox", "simplereversealignedboxplus", "singalcharacteralign", "singlebond", "singleverticalbar", "sixperemspace", "sixthofsixarguments", "slanted", "slantedbold", "slantedface", "slash", "slicepages", "slong", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "smile", "snaptogrid", "softhyphen", "solidus", "someheadnumber", "somekindoftab", "someline", "somelocalfloat", "somenamedheadnumber", "someplace", "somewhere", "space", "spaceddigits", "spaceddigitsmethod", "spaceddigitsseparator", "spaceddigitssymbol", "spadesuit", "spanishNumerals", "spanishnumerals", "speech", "sphericalangle", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitatperiod", "splitdfrac", "splitfilename", "splitfloat", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqcap", "sqcup", "sqrt", "sqsubset", "sqsubseteq", "sqsubsetneq", "sqsupset", "sqsupseteq", "sqsupsetneq", "square", "squaredots", "ssharp", "stackrel", "star", "stareq", "startJScode", "startJSpreamble", "startLUA", "startMP", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startPARSEDXML", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEX", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startXML", "startalign", "startalignment", "startallmodes", "startappendices", "startarrangedpages", "startaside", "startattachment", "startbackground", "startbackmatter", "startbar", "startbbordermatrix", "startbitmapimage", "startblockquote", "startbodymatter", "startbordermatrix", "startboxedcolumns", "startbtxlabeltext", "startbtxrenderingdefinitions", "startbuffer", "startcases", "startcatcodetable", "startcenteraligned", "startchapter", "startcharacteralign", "startcheckedfences", "startchemical", "startchemicaltext", "startcollect", "startcollecting", "startcolor", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnset", "startcolumnsetspan", "startcolumnspan", "startcombination", "startcomment", "startcomponent", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdelimited", "startdelimitedtext", "startdisplaymath", "startdmath", "startdocument", "starteffect", "startelement", "startembeddedxtable", "startendnote", "startendofline", "startenvironment", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfacingfloat", "startfact", "startfigure", "startfiguretext", "startfittingpage", "startfixed", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startfootnote", "startformula", "startformulas", "startframed", "startframedcell", "startframedcontent", "startframedrow", "startframedtable", "startframedtext", "startfrontmatter", "startgoto", "startgraphictext", "startgridsnapping", "starthanging", "starthbox", "starthboxestohbox", "starthboxregister", "starthead", "startheadtext", "starthelptext", "starthiding", "starthighlight", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinteraction", "startinteractionmenu", "startinterface", "startintermezzotext", "startintertext", "startitem", "startitemgroup", "startitemgroupcolumns", "startitemize", "startknockout", "startlabeltext", "startlanguage", "startlayout", "startleftaligned", "startlegend", "startline", "startlinealignment", "startlinecorrection", "startlinefiller", "startlinenote", "startlinenumbering", "startlines", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginblock", "startmarginrule", "startmarkedcontent", "startmarkpages", "startmathalignment", "startmathcases", "startmathlabeltext", "startmathmatrix", "startmathmode", "startmathstyle", "startmatrices", "startmatrix", "startmaxaligned", "startmdformula", "startmidaligned", "startmiddlealigned", "startmiddlemakeup", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startoperatortext", "startopposite", "startoutputstream", "startoverlay", "startoverprint", "startpacked", "startpagecolumns", "startpagecomment", "startpagefigure", "startpagelayout", "startpagemakeup", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpart", "startpath", "startplacechemical", "startplacefigure", "startplacefloat", "startplaceformula", "startplacegraphic", "startplaceintermezzo", "startplacelegend", "startplacepairedbox", "startplacetable", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startpostponingnotes", "startprefixtext", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startproduct", "startproject", "startprotect", "startprotectedcolors", "startpublication", "startpunctuation", "startquotation", "startquote", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startrightaligned", "startruby", "startscript", "startsdformula", "startsection", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsetups", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startsplitformula", "startsplittext", "startspread", "startstandardmakeup", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubject", "startsubjectlevel", "startsubsection", "startsubsentence", "startsubstack", "startsubsubject", "startsubsubsection", "startsubsubsubject", "startsubsubsubsection", "startsubsubsubsubject", "startsubsubsubsubsection", "startsubsubsubsubsubject", "startsuffixtext", "startsymbolset", "starttable", "starttablehead", "starttables", "starttabletail", "starttabletext", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttaglabeltext", "starttexcode", "starttexdefinition", "starttext", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextmakeup", "starttextrule", "starttitle", "starttokenlist", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "starttyping", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunittext", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startuserdata", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxcolumn", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "stligature", "stopJScode", "stopJSpreamble", "stopLUA", "stopMP", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopPARSEDXML", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEX", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopXML", "stopalign", "stopalignment", "stopallmodes", "stopappendices", "stoparrangedpages", "stopaside", "stopattachment", "stopbackground", "stopbackmatter", "stopbar", "stopbbordermatrix", "stopbitmapimage", "stopblockquote", "stopbodymatter", "stopbordermatrix", "stopboxedcolumns", "stopbtxlabeltext", "stopbtxrenderingdefinitions", "stopbuffer", "stopcases", "stopcatcodetable", "stopcenteraligned", "stopchapter", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopchemicaltext", "stopcollect", "stopcollecting", "stopcolor", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnset", "stopcolumnsetspan", "stopcolumnspan", "stopcombination", "stopcomment", "stopcomponent", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdelimited", "stopdelimitedtext", "stopdisplaymath", "stopdmath", "stopdocument", "stopeffect", "stopelement", "stopembeddedxtable", "stopendnote", "stopendofline", "stopenvironment", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfacingfloat", "stopfact", "stopfigure", "stopfiguretext", "stopfittingpage", "stopfixed", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopfootnote", "stopformula", "stopformulas", "stopframed", "stopframedcell", "stopframedcontent", "stopframedrow", "stopframedtable", "stopframedtext", "stopfrontmatter", "stopgoto", "stopgraphictext", "stopgridsnapping", "stophanging", "stophbox", "stophboxestohbox", "stophboxregister", "stophead", "stopheadtext", "stophelptext", "stophiding", "stophighlight", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinteraction", "stopinteractionmenu", "stopinterface", "stopintermezzotext", "stopintertext", "stopitem", "stopitemgroup", "stopitemgroupcolumns", "stopitemize", "stopknockout", "stoplabeltext", "stoplanguage", "stoplayout", "stopleftaligned", "stoplegend", "stopline", "stoplinealignment", "stoplinecorrection", "stoplinefiller", "stoplinenote", "stoplinenumbering", "stoplines", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginblock", "stopmarginrule", "stopmarkedcontent", "stopmarkpages", "stopmathalignment", "stopmathcases", "stopmathlabeltext", "stopmathmatrix", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmatrix", "stopmaxaligned", "stopmdformula", "stopmidaligned", "stopmiddlealigned", "stopmiddlemakeup", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopoperatortext", "stopopposite", "stopoutputstream", "stopoverlay", "stopoverprint", "stoppacked", "stoppagecolumns", "stoppagecomment", "stoppagefigure", "stoppagelayout", "stoppagemakeup", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppart", "stoppath", "stopplacechemical", "stopplacefigure", "stopplacefloat", "stopplaceformula", "stopplacegraphic", "stopplaceintermezzo", "stopplacelegend", "stopplacepairedbox", "stopplacetable", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stoppostponingnotes", "stopprefixtext", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopproduct", "stopproject", "stopprotect", "stopprotectedcolors", "stoppublication", "stoppunctuation", "stopquotation", "stopquote", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopregister", "stopreusableMPgraphic", "stoprightaligned", "stopruby", "stopscript", "stopsdformula", "stopsection", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsetups", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopsplitformula", "stopsplittext", "stopspread", "stopstandardmakeup", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubject", "stopsubjectlevel", "stopsubsection", "stopsubsentence", "stopsubstack", "stopsubsubject", "stopsubsubsection", "stopsubsubsubject", "stopsubsubsubsection", "stopsubsubsubsubject", "stopsubsubsubsubsection", "stopsubsubsubsubsubject", "stopsuffixtext", "stopsymbolset", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabletext", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptaglabeltext", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextmakeup", "stoptextrule", "stoptitle", "stoptokenlist", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stoptyping", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunittext", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopuserdata", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxcolumn", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stretched", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutgap", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subject", "subpagenumber", "subsection", "subsentence", "subset", "subseteq", "subseteqq", "subsetneq", "subsetneqq", "substituteincommalist", "subsubject", "subsubsection", "subsubsubject", "subsubsubsection", "subsubsubsubject", "subsubsubsubsection", "subsubsubsubsubject", "subtractfeature", "succ", "succapprox", "succcurlyeq", "succeq", "succeqq", "succnapprox", "succneq", "succneqq", "succnsim", "succsim", "suffixlanguage", "suffixtext", "sum", "supset", "supseteq", "supseteqq", "supsetneq", "supsetneqq", "surd", "surdradical", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "swarrow", "switchstyleonly", "switchtobodyfont", "switchtocolor", "switchtointerlinespace", "symbol", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "synctexblockfilename", "synctexresetfilename", "synctexsetfilename", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "taglabellanguage", "taglabeltext", "tau", "tbinom", "tbox", "tcaron", "tcedilla", "tcommaaccent", "tcurl", "tequal", "test", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textAngstrom", "textacute", "textampersand", "textasciicircum", "textasciitilde", "textat", "textbackslash", "textbar", "textbottomcomma", "textbottomdot", "textbraceleft", "textbraceright", "textbreve", "textbrokenbar", "textbullet", "textcaron", "textcedilla", "textcelsius", "textcent", "textcircledP", "textcircumflex", "textcitation", "textcite", "textcomma", "textcontrolspace", "textcurrency", "textdag", "textddag", "textdegree", "textdiaeresis", "textdiv", "textdollar", "textdong", "textdotaccent", "textellipsis", "texteuro", "textflowcollector", "textfraction", "textgrave", "texthash", "texthorizontalbar", "texthungarumlaut", "texthyphen", "textkelvin", "textlognot", "textmacron", "textmath", "textmho", "textminus", "textmu", "textmultiply", "textnumero", "textogonek", "textohm", "textormathchar", "textormathchars", "textounce", "textpercent", "textperiod", "textplus", "textpm", "textreference", "textring", "textrule", "textslash", "textsterling", "texttilde", "textunderscore", "textvisiblespace", "textyen", "thai", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "therefore", "theremainingcharacters", "theta", "thickspace", "thinrule", "thinrules", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thook", "thookleftarrow", "thookrightarrow", "thorn", "threedigitrounding", "threeeighths", "threefifths", "threeperemspace", "threequarter", "threesuperior", "tibetannumerals", "tightlayer", "tilde", "times", "tinyfont", "title", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "to", "tochar", "tolinenote", "tooltip", "top", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "trademark", "translate", "transparencycomponents", "transparent", "trel", "triangle", "triangledown", "triangleleft", "triangleq", "triangleright", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "tripleprime", "tripleverticalbar", "truefilename", "truefontname", "tstroke", "ttraggedright", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "turnediota", "twodigitrounding", "twofifths", "twoheaddownarrow", "twoheadleftarrow", "twoheadrightarrow", "twoheadrightarrowtail", "twoheaduparrow", "twosuperior", "twothirds", "tx", "txx", "typ", "type", "typebuffer", "typedefinedbuffer", "typeface", "typefile", "typeinlinebuffer", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uacute", "ubreve", "ucaron", "ucircumflex", "uconvertnumber", "udiaeresis", "udiaeresisacute", "udiaeresiscaron", "udiaeresisgrave", "udiaeresismacron", "udotbelow", "udots", "udoublegrave", "uedcatcodecommand", "ugrave", "uhook", "uhorn", "uhornacute", "uhorndotbelow", "uhorngrave", "uhornhook", "uhorntilde", "uhungarumlaut", "uinvertedbreve", "ulcorner", "umacron", "undefinevalue", "undepthed", "underbar", "underbars", "underbrace", "underbracket", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underparent", "underrandom", "underrandoms", "underrightarrow", "underset", "understrike", "understrikes", "undoassign", "unexpandeddocumentvariable", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unit", "unitlanguage", "unitshigh", "unitslow", "unittext", "unknown", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uogonek", "upand", "uparrow", "updasharrow", "updownarrow", "updownarrowbar", "updownarrows", "upharpoonleft", "upharpoonright", "uplus", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "upsilon", "upuparrows", "upwhitearrow", "urcorner", "uring", "url", "useJSscripts", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useURL", "usealignparameter", "useblankparameter", "useblocks", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecitation", "usecolors", "usecomponent", "usedirectory", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternaldocument", "useexternalfigure", "useexternalrendering", "useexternalsoundtrack", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "usemodule", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usesymbols", "usetexmodule", "usetypescript", "usetypescriptfile", "useurl", "usezipfile", "utfchar", "utflower", "utfupper", "utilde", "utilityregisterlength", "vDash", "varTheta", "varepsilon", "varkappa", "varnothing", "varphi", "varpi", "varrho", "varsigma", "vartheta", "vboxreference", "vdash", "vdots", "vec", "vee", "veebar", "veeeq", "verbatim", "verbatimstring", "verbosenumber", "version", "vert", "verticalgrowingbar", "verticalpositionbar", "veryraggedcenter", "veryraggedleft", "veryraggedright", "vglue", "viewerlayer", "vl", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wcircumflex", "wdofstring", "wedge", "wedgeeq", "weekday", "whitearrowupfrombar", "widehat", "widetilde", "widthofstring", "widthspanningtext", "withoutpt", "word", "wordright", "words", "wordtonumber", "wp", "wr", "writebetweenlist", "writedatatolist", "writestatus", "writetolist", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xi", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifatt", "xmldoifelse", "xmldoifelseatt", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotatt", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineprettyprint", "xmlinlineprettyprinttext", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmllastpar", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpar", "xmlparam", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprettyprinttext", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetatt", "xmlsetattribute", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetpar", "xmlsetparam", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "yacute", "ycircumflex", "ydiaeresis", "ydotbelow", "yen", "ygrave", "yhook", "ymacron", "ytilde", "zacute", "zcaron", "zdotaccent", "zerowidthnobreakspace", "zerowidthspace", "zeta", "zhook", "zstroke", "zwj", "zwnj" },
- ["cs"]={ "Cisla", "Kap", "MESIC", "Rimskecislice", "SLOVA", "SLOVO", "Slova", "Slovo", "VSEDNIDEN", "Znak", "Znaky", "aktualnicislonadpisu", "aktualnidatum", "barevnalista", "barva", "cernalinka", "cernelinky", "cisla", "cislonadpisu", "cislorovnice", "cislostrany", "datum", "definuj", "definujakcent", "definujbarvu", "definujblok", "definujbloksekce", "definujbuffer", "definujfont", "definujformatodkazu", "definujhbox", "definujinterakcnimenu", "definujkombinovanyseznam", "definujkonverzi", "definujnadpis", "definujobrazeksymbol", "definujodkaz", "definujodstavce", "definujopis", "definujoramovani", "definujoramovanytext", "definujpaletu", "definujplvouciobjekt", "definujpodpole", "definujpole", "definujpopis", "definujpopisek", "definujprekryv", "definujprikaz", "definujprofil", "definujprogram", "definujprostredizakladnihofontu", "definujrejstrik", "definujsablonutabulky", "definujsekci", "definujseznam", "definujskupinubarev", "definujstartstop", "definujstyl", "definujstylfontu", "definujsymbol", "definujsynonumumfontu", "definujsynonyma", "definujtabelaci", "definujtext", "definujtrideni", "definujupravu", "definujvelikostpapiru", "definujvycet", "definujzakladnifont", "definujzasobnikpoli", "definujznaceni", "definujznak", "delkaseznamu", "externiobraz", "hlavnijazyk", "hodnotabarvy", "instalacejazyka", "interakcnilista", "interakcnitlacitka", "interaktivnimenu", "jazyk", "jdidolu", "jdina", "jdinabox", "jdinastranu", "klonujpole", "komponenta", "konvertujcislo", "kopirujpole", "korekcebilehomista", "matematika", "meritko", "mesic", "mezera", "mrizka", "nastavbarvu", "nastavbarvy", "nastavbilamista", "nastavblok", "nastavbloksekce", "nastavbuffer", "nastavcernelinky", "nastavcislonadpisu", "nastavcislostrany", "nastavcislovaniodstavcu", "nastavcislovaniradku", "nastavcislovanistran", "nastavcitaci", "nastavdeleniplvoucichobjektu", "nastavdelitko", "nastavdolnitexty", "nastavhorejsek", "nastavhornitexty", "nastavinterakci", "nastavinterakcnilistu", "nastavinterakcnimenu", "nastavinterakcniobrazovku", "nastavjazyk", "nastavkapitalky", "nastavkombinovanyseznam", "nastavkomentar", "nastavkomentarstrany", "nastavmarginalnilinky", "nastavmeziradkovoumezeru", "nastavnadpis", "nastavnadpisy", "nastavodkazovani", "nastavodsazovani", "nastavodstavce", "nastavopis", "nastavoramovanetexty", "nastavoramovani", "nastavorez", "nastavotoceni", "nastavpaletu", "nastavplvouciobjekt", "nastavplvouciobjekty", "nastavpodcislostrany", "nastavpole", "nastavpolozky", "nastavpopisek", "nastavpopisky", "nastavpozadi", "nastavprechodstrany", "nastavpreskok", "nastavprogramy", "nastavradkovani", "nastavradky", "nastavrejstrik", "nastavrovnice", "nastavsadusymbolu", "nastavseznam", "nastavsirkucary", "nastavsloupce", "nastavspodek", "nastavsynonyma", "nastavtabelaci", "nastavtabulky", "nastavtenkelinky", "nastavtext", "nastavtextovelinky", "nastavtexttexty", "nastavtextyupati", "nastavtextyzahlavi", "nastavtoleranci", "nastavtrideni", "nastavtype", "nastavumisteniprotejsku", "nastavumistovani", "nastavupati", "nastavupravu", "nastavurl", "nastavusporadani", "nastavvelikostpapiru", "nastavvsechnapole", "nastavvycty", "nastavvyplnovelinky", "nastavvyplnoveradky", "nastavvzhled", "nastavzahlavi", "nastavzakladnifont", "nastavzarovnani", "nastavznaceni", "nastavzuzeni", "nastrane", "nejakyradek", "nekde", "neznamo", "nivy", "nizky", "nokap", "obrazovka", "odkaz", "odkaznastranu", "odkaznatext", "odkazujici", "opis", "opissoubor", "oramovani", "oref", "orez", "otocit", "oznaceni", "pis", "plnezneni", "pole", "polozka", "polozky", "porovnejpaletu", "porovnejskupinubarev", "pozadi", "pozice", "poznamka", "pref", "prelozit", "prepninazakladnifont", "preskoc", "prizpusobivepole", "prizpusobvzhled", "produkt", "projekt", "prostredi", "resetznaceni", "rimskecislice", "rozdelplvouciobjekt", "roztazene", "schovejbloky", "sedabarva", "sloupec", "slovovpravo", "stanovcharakteristickuseznamu", "stanovcislonadpisu", "startbarva", "startinteraktivnimenu", "startjazyk", "startjdina", "startkomponenta", "startmarginalnilinka", "startnadpis", "startoramovani", "startpolozka", "startpozadi", "startprodukt", "startprojekt", "startprostredi", "startpublikace", "startradek", "starttextovalinka", "startumistirovnici", "startzarovnanonastred", "startzarovnanovlevo", "startzarovnanovpravo", "startzhustene", "stopbarva", "stopinteraktivnimenu", "stopjazyk", "stopjdina", "stopkomponenta", "stopmarginalnilinka", "stopnadpis", "stoporamovani", "stoppolozka", "stoppozadi", "stopprodukt", "stopprojekt", "stopprostredi", "stoppublikace", "stopradek", "stoptextovalinka", "stopumistirovnici", "stopzarovnanonastred", "stopzarovnanovlevo", "stopzarovnanovpravo", "stopzhustene", "strana", "tecky", "tenkalinka", "tenkelinky", "textovalinka", "tlacitko", "tlacitkomenu", "tloustkacary", "tref", "tvrdamezera", "tvrdemezery", "ukazbarvu", "ukazmrizku", "ukaznastaveni", "ukazpaletu", "ukazpodpery", "ukazpostredizakladnihofontu", "ukazramecek", "ukazsadusymbolu", "ukazskupinubarev", "ukazupravu", "ukazvytisk", "ukazvzhled", "ukazzakladnifont", "umistikombinovanyseznam", "umistilokalnipoznamkypodcarou", "umistinadsebe", "umistinamrizku", "umistipodrovnici", "umistipoznamkypodcarou", "umistirejstrik", "umistirovnici", "umistiseznam", "umistivedlesebe", "umistizalozky", "urcicharakteristikurejstriku", "uzijJSscripts", "uzijURL", "uzijadresar", "uzijbloky", "uzijexternidokument", "uzijexterniobraz", "uzijexternizvuk", "uzijmodul", "uzijsymbol", "uzijurl", "verze", "vlasovalinka", "vradku", "vsedniden", "vyberbloky", "vyplnenytext", "vyplnovelinky", "vyplnovyradek", "vysoky", "zachovejbloky", "zadnamezera", "zadnehorniadolniradky", "zadnezahlaviaupati", "zalozka", "zapisdoseznamu", "zapismeziseznam", "zaramovani", "zarovnanonastred", "zarovnanovlevo", "zarovnanovpravo", "zasobnikpoli", "ziskejbuffer", "ziskejznaceni", "znaceni", "znak", "znaky", "zpracujbloky", "zrcadlit", "zref" },
- ["de"]={ "Buchstabe", "Buchstaben", "Kap", "MONAT", "Roemischezahlen", "WOCHENTAG", "WOERTER", "WORT", "Woerter", "Wort", "Ziffern", "amgitterausrichten", "aufseite", "ausfuelltext", "ausschnitt", "bearbeitebloecke", "behaltebloecke", "bei", "bemerkung", "benutzeverzeichnis", "beschriftung", "bestimmekopfnummer", "bestimmelistencharakeristika", "bestimmeregistercharakteristika", "bildschirm", "blanko", "buchstabe", "buchstaben", "datum", "defineschriftsynonym", "definiereabbsymbol", "definiereabsaetze", "definiereabschnitt", "definiereabschnittsblock", "definiereakzent", "definierebefehl", "definierebeschreibung", "definierebeschriftung", "definiereblock", "definierefarbe", "definierefarbengruppe", "definierefeld", "definierefeldstapel", "definierefliesstext", "definierefliesstextumgebung", "definieregleitobjekt", "definierehbox", "definiereinteraktionsmenue", "definierekonversion", "definierelabel", "definiereliste", "definieren", "definierenummerierung", "definiereoverlay", "definierepalette", "definierepapierformat", "definiereprofil", "definiereprogramme", "definierepuffer", "definierereferenz", "definierereferenzformat", "definiereregister", "definiereschrift", "definiereschriftstil", "definieresortieren", "definierestartstop", "definierestil", "definieresubfeld", "definieresymbol", "definieresynonyme", "definieretabellenvorlage", "definieretabulator", "definieretext", "definieretippen", "definiereueberschrift", "definiereumbruch", "definiereumrahmt", "definiereumrahmtertext", "definierezeichen", "definierezusammengestellteliste", "drehen", "duennelinie", "duennerumriss", "einezeile", "externeabbildung", "farbbalken", "farbe", "farbewert", "feld", "feldstapel", "festesspatium", "format", "formelnummer", "gefuelltesrechteck", "gefuelltezeile", "gestreckt", "gitter", "graufarbe", "haarlinie", "hauptsprache", "heutigesdatum", "heutigeskopfnummer", "hintergrund", "hoch", "holebeschriftung", "holepuffer", "imumriss", "installieresprache", "interaktionsbalken", "interaktionsknopfe", "interaktionsmenue", "inzeile", "irgendwo", "keinekopfundfusszeilen", "keinspatium", "keinzeilenobenundunten", "klonierefeld", "knopf", "komponente", "konvertierezahl", "kopfnummer", "kopierefeld", "korrigierezwischenraum", "liniendicke", "linksbuendig", "listenlaenge", "mathematik", "menueknopf", "monat", "nachunten", "nokap", "notiz", "passelayoutan", "passendfeld", "platzierebookmarks", "platziereformel", "platzierefussnoten", "platziereliste", "platzierelokalefussnoten", "platzierenebeneinander", "platziereregister", "platziereuntereinander", "platziereunterformel", "platzierezusammengestellteliste", "pos", "posten", "produkt", "programm", "projekt", "punkt", "rechteck", "rechtecke", "rechtsbuendig", "referenz", "referieren", "roemischezahlen", "ruecksetztenbeschriftung", "schreibezurliste", "schreibezwischenliste", "seite", "seitenreferenz", "seitenummer", "settext", "spalte", "spatium", "spiegeln", "sprache", "startfarbe", "starthintergrund", "startinteraktionsmenue", "startkleinerdurchschuss", "startkomponente", "startkopf", "startlinksbuendig", "startmarginallinie", "startplatziereformel", "startpos", "startprodukt", "startprojekt", "startpublikation", "startrechtsbuendig", "startsprache", "starttextlinie", "startumgebung", "startumrahmt", "startzeile", "startzentriert", "startzu", "stelleabsaetzeein", "stelleabsatznummerierungein", "stelleabschnittsblockein", "stelleanordnenein", "stelleaufzaehlungenein", "stelleausrichtungein", "stelleausschnittein", "stellebeschreibungein", "stellebeschriftungein", "stellebilderunterschriftein", "stellebildunterschriftein", "stellebindestrichein", "stelleblankoein", "stelleblockein", "stelledrehenein", "stelleduennerumrissein", "stelleeinziehenein", "stelleengerein", "stellefarbeein", "stellefarbenein", "stellefeldein", "stellefelderin", "stellefliesstextein", "stelleformelnein", "stellefusszeileein", "stellefusszeilentextein", "stellegefuelltesrechteckein", "stellegefuelltezeileein", "stellegegenueberplatzierenein", "stellegleitobjekteein", "stellegleitobjektein", "stellehintergruendeein", "stellehintergrundein", "stelleinteraktionein", "stelleinteraktionsbalkenein", "stelleinteraktionsbildschirmein", "stelleinteraktionsmenueein", "stellekommentarein", "stellekopfzahlein", "stellekopfzeileein", "stellekopfzeilentextein", "stellelayoutein", "stellelinienbreiteein", "stellelisteein", "stellemarginallinieein", "stellenobenein", "stellepaletteein", "stellepapierformatein", "stelleplatziegeteiltegleitobjekt", "stellepositionierenein", "stellepostenein", "stelleprogrammein", "stellepufferein", "stellerechteckein", "stellereferenzierenein", "stelleregisterein", "stelleseitenkommentarein", "stelleseitennummerein", "stelleseitennummeriernungein", "stelleseitenuebergangein", "stellesortierenein", "stellespaltenein", "stellespatiumein", "stellespracheein", "stellesymbolsetein", "stellesynonymein", "stelletabellenein", "stelletabulatorein", "stelletextein", "stelletextobenein", "stelletexttexteein", "stelletextumrissein", "stelletextuntenein", "stelletipein", "stelletippenein", "stelletoleranzein", "stelleueberschriftein", "stelleueberschriftenein", "stelleumbruchein", "stelleumrahmtein", "stelleumrahmtetexteein", "stelleuntenein", "stelleunterseitennummerein", "stelleurlein", "stelleversalienein", "stellezeilenabstandein", "stellezeilenein", "stellezeilennumerierungein", "stellezitierenein", "stellezusammengestelltelisteein", "stellezwischenraumein", "stopfarbe", "stophintergrund", "stopinteraktionsmenue", "stopkleinerdurchschuss", "stopkomponente", "stopkopf", "stoplinksbuendig", "stopmarginallinie", "stopplatziereformel", "stoppos", "stopprodukt", "stopprojekt", "stoppublikation", "stoprechtsbuendig", "stopsprache", "stoptextlinie", "stopumgebung", "stopumrahmt", "stopzeile", "stopzentriert", "stopzu", "teilegleitobjekt", "textlinie", "textreferenz", "tief", "tiho", "tip", "tippedatei", "tippen", "tippepuffer", "ueber", "uebersetzten", "umgebung", "umrahmt", "unbekant", "verbergebloecke", "vergleichefarbengruppe", "vergleichepalette", "verwendeJSscript", "verwendeURL", "verwendebloecke", "verwendeexteresdokument", "verwendeexterneabbildung", "verwendeexternestonstueck", "verwendemodul", "verwendesymbole", "verwendeurl", "volleswort", "von", "waehlebloeckeaus", "wechselezumfliesstext", "wochentag", "wortrechts", "zeigedruck", "zeigeeinstellungen", "zeigefarbe", "zeigefarbengruppe", "zeigefliesstext", "zeigefliesstextumgebung", "zeigegitter", "zeigelayout", "zeigepalette", "zeigerahmen", "zeigestruts", "zeigeumbruch", "zentriert", "ziffern", "zu", "zurbox", "zurseite" },
+ ["common"]={ "AEacute", "AEligature", "AEmacron", "AMSTEX", "Aacute", "Abreve", "Abreveacute", "Abrevedotbelow", "Abrevegrave", "Abrevehook", "Abrevetilde", "Acaron", "Acircumflex", "Acircumflexacute", "Acircumflexdotbelow", "Acircumflexgrave", "Acircumflexhook", "Acircumflextilde", "Adiaeresis", "Adiaeresismacron", "Adotaccent", "Adotaccentmacron", "Adotbelow", "Adoublegrave", "AfterPar", "Agrave", "Ahook", "Ainvertedbreve", "Alpha", "Alphabeticnumerals", "AmSTeX", "Amacron", "And", "Angstrom", "Aogonek", "Aring", "Aringacute", "Arrowvert", "Astroke", "Atilde", "BeforePar", "Beta", "Bhook", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "Box", "Bumpeq", "CONTEXT", "Cacute", "Cap", "Caps", "Ccaron", "Ccedilla", "Ccircumflex", "Cdotaccent", "Character", "Characters", "Chi", "Chook", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "Cstroke", "Cup", "DZcaronligature", "DZligature", "Dafrican", "Dcaron", "Ddownarrow", "Delta", "Dhook", "Doteq", "Downarrow", "Dstroke", "Dzcaronligature", "Dzligature", "ETEX", "Eacute", "Ebreve", "Ecaron", "Ecedilla", "Ecircumflex", "Ecircumflexacute", "Ecircumflexdotbelow", "Ecircumflexgrave", "Ecircumflexhook", "Ecircumflextilde", "Ediaeresis", "Edotaccent", "Edotbelow", "Edoublegrave", "Egrave", "Ehook", "Einvertedbreve", "Emacron", "Eogonek", "Epsilon", "Eta", "Eth", "Etilde", "Eulerconst", "EveryLine", "EveryPar", "Fhook", "Finv", "Gacute", "Game", "Gamma", "Gbreve", "Gcaron", "Gcircumflex", "Gcommaaccent", "Gdotaccent", "GetPar", "Ghook", "GotoPar", "Greeknumerals", "Gstroke", "Hat", "Hcaron", "Hcircumflex", "Hstroke", "IJligature", "INRSTEX", "Iacute", "Ibreve", "Icaron", "Icircumflex", "Idiaeresis", "Idotaccent", "Idotbelow", "Idoublegrave", "Igrave", "Ihook", "Iinvertedbreve", "Im", "Imacron", "Iogonek", "Iota", "Istroke", "Itilde", "Jcircumflex", "Join", "Kappa", "Kcaron", "Kcommaaccent", "Khook", "LAMSTEX", "LATEX", "LJligature", "LUAJITTEX", "LUAMETATEX", "LUATEX", "LaTeX", "Lacute", "LamSTeX", "Lambda", "Lbar", "Lcaron", "Lcommaaccent", "Ldotmiddle", "Ldsh", "Leftarrow", "Leftrightarrow", "Ljligature", "Lleftarrow", "Longleftarrow", "Longleftrightarrow", "Longmapsfrom", "Longmapsto", "Longrightarrow", "Lsh", "Lstroke", "Lua", "LuaMetaTeX", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTH", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "Mapsfrom", "Mapsto", "MetaFont", "MetaFun", "MetaPost", "Mu", "NJligature", "Nacute", "Ncaron", "Ncommaaccent", "Nearrow", "Neng", "Ngrave", "Njligature", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Ntilde", "Nu", "Numbers", "Nwarrow", "OEligature", "Oacute", "Obreve", "Ocaron", "Ocircumflex", "Ocircumflexacute", "Ocircumflexdotbelow", "Ocircumflexgrave", "Ocircumflexhook", "Ocircumflextilde", "Odiaeresis", "Odiaeresismacron", "Odotaccent", "Odotaccentmacron", "Odotbelow", "Odoublegrave", "Ograve", "Ohook", "Ohorn", "Ohornacute", "Ohorndotbelow", "Ohorngrave", "Ohornhook", "Ohorntilde", "Ohungarumlaut", "Oinvertedbreve", "Omacron", "Omega", "Omicron", "Oogonek", "Oogonekmacron", "Ostroke", "Ostrokeacute", "Otilde", "Otildemacron", "P", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "Phi", "Phook", "Pi", "PiCTeX", "Plankconst", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PropertyLine", "Psi", "PtToCm", "Racute", "Rcaron", "Rcommaaccent", "Rdoublegrave", "Rdsh", "Re", "ReadFile", "Relbar", "Rho", "Rightarrow", "Rinvertedbreve", "Romannumerals", "Rrightarrow", "Rsh", "S", "Sacute", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Scaron", "Scedilla", "Schwa", "Scircumflex", "Scommaaccent", "Searrow", "Sigma", "Smallcapped", "Subset", "Supset", "Swarrow", "TABLE", "TEX", "TaBlE", "Tau", "Tcaron", "Tcedilla", "Tcommaaccent", "TeX", "TheNormalizedFontSize", "Theta", "Thook", "Thorn", "TransparencyHack", "Tstroke", "Uacute", "Ubreve", "Ucaron", "Ucircumflex", "Udiaeresis", "Udiaeresisacute", "Udiaeresiscaron", "Udiaeresisgrave", "Udiaeresismacron", "Udotbelow", "Udoublegrave", "Ugrave", "Uhook", "Uhorn", "Uhornacute", "Uhorndotbelow", "Uhorngrave", "Uhornhook", "Uhorntilde", "Uhungarumlaut", "Uinvertedbreve", "Umacron", "Uogonek", "Uparrow", "Updownarrow", "Upsilon", "Uring", "Utilde", "Uuparrow", "VDash", "Vdash", "VerboseNumber", "Vert", "Vvdash", "WEEKDAY", "WORD", "WORDS", "Wcircumflex", "WidthSpanningText", "Word", "Words", "XETEX", "XeTeX", "Xi", "Yacute", "Ycircumflex", "Ydiaeresis", "Ydotbelow", "Ygrave", "Yhook", "Ymacron", "Ytilde", "Zacute", "Zcaron", "Zdotaccent", "Zeta", "Zhook", "Zstroke", "aacute", "abbreviation", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "about", "abreve", "abreveacute", "abrevedotbelow", "abrevegrave", "abrevehook", "abrevetilde", "acaron", "acircumflex", "acircumflexacute", "acircumflexdotbelow", "acircumflexgrave", "acircumflexhook", "acircumflextilde", "activatespacehandler", "actualday", "actualmonth", "actualyear", "actuarial", "acute", "acwopencirclearrow", "adaptcollector", "adaptfontfeature", "adaptlayout", "adaptpapersize", "addfeature", "addfontpath", "addtoJSpreamble", "addtocommalist", "addvalue", "adiaeresis", "adiaeresismacron", "adotaccent", "adotaccentmacron", "adotbelow", "adoublegrave", "aeacute", "aeligature", "aemacron", "afghanicurrency", "aftersplitstring", "aftertestandsplitstring", "agrave", "ahook", "ainvertedbreve", "aleph", "alignbottom", "aligned", "alignedbox", "alignedline", "alignhere", "alignmentcharacter", "allinputpaths", "alpha", "alphabeticnumerals", "alwayscitation", "alwayscite", "amacron", "amalg", "ampersand", "anchor", "angle", "aogonek", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "approx", "approxEq", "approxeq", "approxnEq", "arabicakbar", "arabicalayhe", "arabicallah", "arabicallallahou", "arabicasterisk", "arabicbasmalah", "arabiccomma", "arabiccuberoot", "arabicdateseparator", "arabicdecimals", "arabicdisputedendofayah", "arabicendofayah", "arabicexnumerals", "arabicfootnotemarker", "arabicfourthroot", "arabichighain", "arabichighalayheassallam", "arabichigheqala", "arabichighesala", "arabichighfootnotemarker", "arabichighjeem", "arabichighlamalef", "arabichighmadda", "arabichighmeemlong", "arabichighmeemshort", "arabichighnisf", "arabichighnoon", "arabichighnoonkasra", "arabichighqaf", "arabichighqif", "arabichighradiallahouanhu", "arabichighrahmatullahalayhe", "arabichighrubc", "arabichighsad", "arabichighsajda", "arabichighsakta", "arabichighsallallahou", "arabichighseen", "arabichighsmallsafha", "arabichightah", "arabichightakhallus", "arabichighthalatha", "arabichighwaqf", "arabichighyeh", "arabichighzain", "arabicjallajalalouhou", "arabiclettermark", "arabiclowmeemlong", "arabiclownoonkasra", "arabiclowseen", "arabicmisra", "arabicmuhammad", "arabicnumber", "arabicnumberabove", "arabicnumerals", "arabicparenleft", "arabicparenright", "arabicpercent", "arabicperiod", "arabicpermille", "arabicpertenthousand", "arabicpoeticverse", "arabicqala", "arabicquestion", "arabicrasoul", "arabicray", "arabicrialsign", "arabicsafha", "arabicsajdah", "arabicsalla", "arabicsamvat", "arabicsanah", "arabicsemicolon", "arabicshighthreedots", "arabicslcm", "arabicstartofrubc", "arabictripledot", "arabicvowelwaw", "arabicvowelyeh", "arabicwasallam", "arg", "aring", "aringacute", "arrowvert", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "ast", "astype", "asymp", "at", "atilde", "atleftmargin", "atpage", "atrightmargin", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "autointegral", "automathematics", "autopagestaterealpage", "autopagestaterealpageorder", "autosetups", "availablehsize", "averagecharwidth", "backepsilon", "background", "backgroundimage", "backgroundimagefill", "backgroundline", "backprime", "backsim", "backslash", "bar", "barleftarrow", "barleftarrowrightarrowbar", "barovernorthwestarrow", "barwedge", "basegrid", "baselinebottom", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbordermatrix", "bbox", "because", "beforesplitstring", "beforetestandsplitstring", "beta", "beth", "between", "bhook", "big", "bigbodyfont", "bigcap", "bigcirc", "bigcircle", "bigcup", "bigdiamond", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigodot", "bigoplus", "bigotimes", "bigr", "bigskip", "bigsqcap", "bigsqcup", "bigsquare", "bigstar", "bigtimes", "bigtriangledown", "bigtriangleup", "bigudot", "biguplus", "bigvee", "bigwedge", "binom", "bitmapimage", "blacklozenge", "blackrule", "blackrules", "blacksquare", "blacktriangle", "blacktriangledown", "blacktriangleleft", "blacktriangleright", "blank", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "blocksynctexfile", "blockuservariable", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "bookmark", "booleanmodevalue", "bordermatrix", "bot", "bottombox", "bottomleftbox", "bottomrightbox", "bowtie", "boxcursor", "boxdot", "boxmarker", "boxminus", "boxofsize", "boxplus", "boxreference", "boxtimes", "bpos", "breakablethinspace", "breakhere", "breve", "bstroke", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhiddencitation", "btxhybridcite", "btxlabellanguage", "btxlabeltext", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "buildmathaccent", "buildtextaccent", "buildtextbottomcomma", "buildtextbottomdot", "buildtextcedilla", "buildtextgrave", "buildtextmacron", "buildtextognek", "bullet", "button", "cacute", "calligraphic", "camel", "cap", "capital", "carriagereturn", "catcodetablename", "cbox", "ccaron", "ccedilla", "ccircumflex", "ccurl", "cdot", "cdotaccent", "cdotp", "cdots", "centeraligned", "centerbox", "centerdot", "centeredbox", "centeredlastline", "centerednextbox", "centerline", "cfrac", "chapter", "character", "characters", "chardescription", "charwidthlanguage", "check", "checkcharacteralign", "checkedblank", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checkmark", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chi", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "chook", "circ", "circeq", "circlearrowleft", "circlearrowright", "circledR", "circledS", "circledast", "circledcirc", "circleddash", "circledequals", "circleonrightarrow", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "clippedoverlayimage", "clonefield", "clubsuit", "collect", "collectedtext", "collectexpanded", "colon", "coloncolonequals", "colonequals", "color", "colorbar", "colorcomponents", "colored", "coloronly", "colorvalue", "column", "columnbreak", "columnsetspanwidth", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparecolorgroup", "comparedimension", "comparedimensioneps", "comparepalet", "complement", "completebtxrendering", "completecontent", "completeindex", "completelist", "completelistofabbreviations", "completelistofchemicals", "completelistoffigures", "completelistofgraphics", "completelistofintermezzi", "completelistoflogos", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completelistoftables", "completepagenumber", "completeregister", "complexes", "complexorsimple", "complexorsimpleempty", "component", "composedcollector", "composedlayer", "compresult", "cong", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertnumber", "convertvalue", "convertvboxtohbox", "coprod", "copyboxfromcache", "copybtxlabeltext", "copyfield", "copyheadtext", "copylabeltext", "copymathlabeltext", "copyoperatortext", "copypages", "copyparameters", "copyposition", "copyprefixtext", "copyright", "copysetups", "copysuffixtext", "copytaglabeltext", "copyunittext", "correctwhitespace", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "crlf", "crlfplaceholder", "cstroke", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "cup", "curlyeqprec", "curlyeqsucc", "curlyvee", "curlywedge", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentdate", "currentenvironment", "currentfeaturetest", "currentheadnumber", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "curvearrowleft", "curvearrowright", "cwopencirclearrow", "cyrillicA", "cyrillicAE", "cyrillicAbreve", "cyrillicAdiaeresis", "cyrillicB", "cyrillicBIGYUS", "cyrillicBIGYUSiotified", "cyrillicC", "cyrillicCH", "cyrillicCHEDC", "cyrillicCHEDCabkhasian", "cyrillicCHEabkhasian", "cyrillicCHEdiaeresis", "cyrillicCHEkhakassian", "cyrillicCHEvertstroke", "cyrillicD", "cyrillicDASIAPNEUMATA", "cyrillicDJE", "cyrillicDZE", "cyrillicDZEabkhasian", "cyrillicDZHE", "cyrillicE", "cyrillicELtail", "cyrillicEMtail", "cyrillicENDC", "cyrillicENGHE", "cyrillicENhook", "cyrillicENtail", "cyrillicEREV", "cyrillicERY", "cyrillicERtick", "cyrillicEbreve", "cyrillicEdiaeresis", "cyrillicEgrave", "cyrillicEiotified", "cyrillicF", "cyrillicFITA", "cyrillicG", "cyrillicGHEmidhook", "cyrillicGHEstroke", "cyrillicGHEupturn", "cyrillicGJE", "cyrillicH", "cyrillicHA", "cyrillicHADC", "cyrillicHRDSN", "cyrillicI", "cyrillicIE", "cyrillicII", "cyrillicISHRT", "cyrillicISHRTtail", "cyrillicIZHITSA", "cyrillicIZHITSAdoublegrave", "cyrillicIdiaeresis", "cyrillicIgrave", "cyrillicImacron", "cyrillicJE", "cyrillicK", "cyrillicKADC", "cyrillicKAbashkir", "cyrillicKAhook", "cyrillicKAstroke", "cyrillicKAvertstroke", "cyrillicKJE", "cyrillicKOPPA", "cyrillicKSI", "cyrillicL", "cyrillicLITTLEYUS", "cyrillicLITTLEYUSiotified", "cyrillicLJE", "cyrillicM", "cyrillicN", "cyrillicNJE", "cyrillicO", "cyrillicOMEGA", "cyrillicOMEGAround", "cyrillicOMEGAtitlo", "cyrillicOT", "cyrillicObarred", "cyrillicObarreddiaeresis", "cyrillicOdiaeresis", "cyrillicP", "cyrillicPALATALIZATION", "cyrillicPALOCHKA", "cyrillicPEmidhook", "cyrillicPSI", "cyrillicPSILIPNEUMATA", "cyrillicR", "cyrillicS", "cyrillicSCHWA", "cyrillicSCHWAdiaeresis", "cyrillicSDSC", "cyrillicSEMISOFT", "cyrillicSFTSN", "cyrillicSH", "cyrillicSHCH", "cyrillicSHHA", "cyrillicT", "cyrillicTEDC", "cyrillicTETSE", "cyrillicTITLO", "cyrillicTSHE", "cyrillicU", "cyrillicUK", "cyrillicUSHRT", "cyrillicUdiaeresis", "cyrillicUdoubleacute", "cyrillicUmacron", "cyrillicV", "cyrillicYA", "cyrillicYAT", "cyrillicYERUdiaeresis", "cyrillicYI", "cyrillicYO", "cyrillicYU", "cyrillicYstr", "cyrillicYstrstroke", "cyrillicZ", "cyrillicZDSC", "cyrillicZEdiaeresis", "cyrillicZH", "cyrillicZHEbreve", "cyrillicZHEdescender", "cyrillicZHEdiaeresis", "cyrillica", "cyrillicabreve", "cyrillicadiaeresis", "cyrillicae", "cyrillicb", "cyrillicbigyus", "cyrillicbigyusiotified", "cyrillicc", "cyrillicch", "cyrilliccheabkhasian", "cyrillicchedc", "cyrillicchedcabkhasian", "cyrillicchediaeresis", "cyrillicchekhakassian", "cyrillicchevertstroke", "cyrillicd", "cyrillicdje", "cyrillicdze", "cyrillicdzeabkhasian", "cyrillicdzhe", "cyrillice", "cyrillicebreve", "cyrillicediaeresis", "cyrillicegrave", "cyrilliceiotified", "cyrilliceltail", "cyrillicemtail", "cyrillicendc", "cyrillicenghe", "cyrillicenhook", "cyrillicentail", "cyrillicerev", "cyrillicertick", "cyrillicery", "cyrillicf", "cyrillicfita", "cyrillicg", "cyrillicghemidhook", "cyrillicghestroke", "cyrillicgheupturn", "cyrillicgje", "cyrillich", "cyrillicha", "cyrillichadc", "cyrillichrdsn", "cyrillici", "cyrillicidiaeresis", "cyrillicie", "cyrillicigrave", "cyrillicii", "cyrillicimacron", "cyrillicishrt", "cyrillicishrttail", "cyrillicizhitsa", "cyrillicizhitsadoublegrave", "cyrillicje", "cyrillick", "cyrillickabashkir", "cyrillickadc", "cyrillickahook", "cyrillickastroke", "cyrillickavertstroke", "cyrillickje", "cyrillickoppa", "cyrillicksi", "cyrillicl", "cyrilliclittleyus", "cyrilliclittleyusiotified", "cyrilliclje", "cyrillicm", "cyrillicn", "cyrillicnje", "cyrillico", "cyrillicobarred", "cyrillicobarreddiaeresis", "cyrillicodiaeresis", "cyrillicomega", "cyrillicomegaround", "cyrillicomegatitlo", "cyrillicot", "cyrillicp", "cyrillicpemidhook", "cyrillicpsi", "cyrillicr", "cyrillics", "cyrillicschwa", "cyrillicschwadiaeresis", "cyrillicsdsc", "cyrillicsemisoft", "cyrillicsftsn", "cyrillicsh", "cyrillicshch", "cyrillicshha", "cyrillict", "cyrillictedc", "cyrillictetse", "cyrillictshe", "cyrillicu", "cyrillicudiaeresis", "cyrillicudoubleacute", "cyrillicuk", "cyrillicumacron", "cyrillicushrt", "cyrillicv", "cyrillicya", "cyrillicyat", "cyrillicyerudiaeresis", "cyrillicyi", "cyrillicyo", "cyrillicystr", "cyrillicystrstroke", "cyrillicyu", "cyrillicz", "cyrilliczdsc", "cyrilliczediaeresis", "cyrilliczh", "cyrilliczhebreve", "cyrilliczhedescender", "cyrilliczhediaeresis", "d", "dag", "dagger", "daleth", "dasharrow", "dashedleftarrow", "dashedrightarrow", "dashv", "datasetvariable", "date", "dayoftheweek", "dayspermonth", "dbinom", "dcaron", "dcurl", "ddag", "ddagger", "dddot", "ddot", "ddots", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "define", "defineMPinstance", "defineTABLEsetup", "defineaccent", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "defineblock", "definebodyfont", "definebodyfontenvironment", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebuffer", "definebutton", "definecapitals", "definecharacter", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolor", "definecolorgroup", "definecolumnbreak", "definecolumnset", "definecolumnsetarea", "definecolumnsetspan", "definecombination", "definecombinedlist", "definecommand", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversion", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedeq", "definedescription", "definedfont", "defineeffect", "defineenumeration", "defineexpandable", "defineexternalfigure", "definefacingfloat", "definefallbackfamily", "definefield", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefieldstack", "definefiguresymbol", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefloat", "definefont", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "definefontstyle", "definefontsynonym", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframed", "defineframedcontent", "defineframedtable", "defineframedtext", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "definehbox", "definehead", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinteractionmenu", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabel", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelist", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemakeup", "definemarginblock", "definemargindata", "definemarker", "definemarking", "definemathaccent", "definemathalignment", "definemathcases", "definemathcommand", "definemathdouble", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathover", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunder", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "defineoverlay", "definepage", "definepagebreak", "definepagechecker", "definepagecolumns", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "definepalet", "definepapersize", "defineparagraph", "defineparagraphs", "defineparallel", "defineparbuilder", "defineperiodkerning", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "defineprofile", "defineprogram", "definepushbutton", "definepushsymbol", "definereference", "definereferenceformat", "defineregister", "definerenderingwindow", "defineresetset", "defineruby", "definescale", "definescript", "definesection", "definesectionblock", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definesorting", "definespotcolor", "definestartstop", "definestyle", "definestyleinstance", "definesubfield", "definesubformula", "definesymbol", "definesynonym", "definesynonyms", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabletemplate", "definetabulate", "definetabulation", "definetext", "definetextbackground", "definetextflow", "definetextnote", "definetokenlist", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "definetyping", "defineunit", "defineuserdata", "defineuserdataalternative", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "delimited", "delimitedtext", "delta", "depthofstring", "depthonlybox", "depthspanningtext", "depthstrut", "determineheadnumber", "determinelistcharacteristics", "determinenoflines", "determineregistercharacteristics", "devanagarinumerals", "dfrac", "dhook", "diameter", "diamond", "diamondsuit", "differentialD", "differentiald", "digamma", "digits", "dimensiontocount", "directboxfromcache", "directcolor", "directcolored", "directconvertedcounter", "directcopyboxfromcache", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "div", "dividedsize", "divideontimes", "divides", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dofastloopcs", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifassignmentelsecs", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdocumentvariable", "doifdocumentvariableelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseassignmentcs", "doifelseblack", "doifelsebox", "doifelseboxincache", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedocumentvariable", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontfeature", "doifelsefontpresent", "doifelsefontsynonym", "doifelseframed", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarkedpage", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpage", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetopofpage", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontfeatureelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotdocumentvariable", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftopofpageelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifunknownfontfeature", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dot", "doteq", "doteqdot", "dotfskip", "dotlessI", "dotlessJ", "dotlessi", "dotlessj", "dotlessjstroke", "dotminus", "dotoks", "dotplus", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "dots", "dottedcircle", "dottedrightarrow", "doublebar", "doublebond", "doublebrace", "doublebracket", "doublecap", "doublecup", "doubleparent", "doubleprime", "doubleverticalbar", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "downarrow", "downdasharrow", "downdownarrows", "downharpoonleft", "downharpoonright", "downuparrows", "downwhitearrow", "downzigzagarrow", "dpofstring", "dstroke", "dtail", "dummydigit", "dummyparameter", "dzcaronligature", "dzligature", "eTeX", "eacute", "ebreve", "ecaron", "ecedilla", "ecircumflex", "ecircumflexacute", "ecircumflexdotbelow", "ecircumflexgrave", "ecircumflexhook", "ecircumflextilde", "edefconvertedargument", "ediaeresis", "edotaccent", "edotbelow", "edoublegrave", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "egrave", "ehook", "einvertedbreve", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "ell", "em", "emacron", "emdash", "emphasisboldface", "emphasistypeface", "emptylines", "emptyset", "emquad", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "endash", "endnote", "enquad", "enskip", "enspace", "env", "environment", "envvar", "eogonek", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "epsilon", "eq", "eqcirc", "eqeq", "eqeqeq", "eqgtr", "eqless", "eqsim", "eqslantgtr", "eqslantless", "equaldigits", "equalscolon", "equiv", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "eta", "eth", "ethiopic", "etilde", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "exclamdown", "executeifdefined", "exists", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandeddoif", "expandeddoifelse", "expandeddoifnot", "expandfontsynonym", "expdoif", "expdoifcommonelse", "expdoifelse", "expdoifelsecommon", "expdoifelseinset", "expdoifinsetelse", "expdoifnot", "exponentiale", "externalfigure", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "fallingdotseq", "fastdecrement", "fastincrement", "fastlocalframed", "fastloopfinal", "fastloopindex", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "ffiligature", "ffligature", "fflligature", "fhook", "field", "fieldbody", "fieldstack", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figurespace", "figuresymbol", "figurewidth", "filename", "filigature", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "fillinline", "fillinrules", "fillintext", "fillupto", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstinlist", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfield", "fitfieldframed", "fittopbaselinegrid", "fiveeighths", "fivesixths", "fixedspace", "fixedspaces", "flag", "flat", "flligature", "floatuserdataparameter", "flushbox", "flushboxregister", "flushcollector", "flushedrightlastline", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnote", "footnotetext", "forall", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "forgetparskip", "forgetragged", "formula", "formulanumber", "foundbox", "fourfifths", "fourperemspace", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "framed", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "from", "fromlinenote", "frown", "frozenhbox", "frule", "gacute", "gamma", "gbreve", "gcaron", "gcircumflex", "gcommaaccent", "gdefconvertedargument", "gdefconvertedcommand", "gdotaccent", "ge", "geq", "geqq", "geqslant", "getMPdrawing", "getMPlayer", "getboxfromcache", "getboxllx", "getboxlly", "getbuffer", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getinlineuserdata", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmarking", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "gets", "getsubstring", "gettokenlist", "gettwopassdata", "gettwopassdatalist", "getuserdata", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "gg", "ggg", "gggtr", "gimel", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gnapprox", "gneqq", "gnsim", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "godown", "goto", "gotobox", "gotopage", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grave", "graycolor", "grayvalue", "greedysplitstring", "greekAlpha", "greekAlphadasia", "greekAlphadasiaperispomeni", "greekAlphadasiatonos", "greekAlphadasiavaria", "greekAlphaiotasub", "greekAlphaiotasubdasia", "greekAlphaiotasubdasiaperispomeni", "greekAlphaiotasubdasiatonos", "greekAlphaiotasubdasiavaria", "greekAlphaiotasubpsili", "greekAlphaiotasubpsiliperispomeni", "greekAlphaiotasubpsilitonos", "greekAlphaiotasubpsilivaria", "greekAlphamacron", "greekAlphapsili", "greekAlphapsiliperispomeni", "greekAlphapsilitonos", "greekAlphapsilivaria", "greekAlphatonos", "greekAlphavaria", "greekAlphavrachy", "greekBeta", "greekChi", "greekCoronis", "greekDelta", "greekEpsilon", "greekEpsilondasia", "greekEpsilondasiatonos", "greekEpsilondasiavaria", "greekEpsilonpsili", "greekEpsilonpsilitonos", "greekEpsilonpsilivaria", "greekEpsilontonos", "greekEpsilonvaria", "greekEta", "greekEtadasia", "greekEtadasiaperispomeni", "greekEtadasiatonos", "greekEtadasiavaria", "greekEtaiotasub", "greekEtaiotasubdasia", "greekEtaiotasubdasiaperispomeni", "greekEtaiotasubdasiatonos", "greekEtaiotasubdasiavaria", "greekEtaiotasubpsili", "greekEtaiotasubpsiliperispomeni", "greekEtaiotasubpsilitonos", "greekEtaiotasubpsilivaria", "greekEtapsili", "greekEtapsiliperispomeni", "greekEtapsilitonos", "greekEtapsilivaria", "greekEtatonos", "greekEtavaria", "greekGamma", "greekIota", "greekIotadasia", "greekIotadasiaperispomeni", "greekIotadasiatonos", "greekIotadasiavaria", "greekIotadialytika", "greekIotamacron", "greekIotapsili", "greekIotapsiliperispomeni", "greekIotapsilitonos", "greekIotapsilivaria", "greekIotatonos", "greekIotavaria", "greekIotavrachy", "greekKappa", "greekLambda", "greekMu", "greekNu", "greekOmega", "greekOmegadasia", "greekOmegadasiaperispomeni", "greekOmegadasiatonos", "greekOmegadasiavaria", "greekOmegaiotasub", "greekOmegaiotasubdasia", "greekOmegaiotasubdasiaperispomeni", "greekOmegaiotasubdasiatonos", "greekOmegaiotasubdasiavaria", "greekOmegaiotasubpsili", "greekOmegaiotasubpsiliperispomeni", "greekOmegaiotasubpsilitonos", "greekOmegaiotasubpsilivaria", "greekOmegapsili", "greekOmegapsiliperispomeni", "greekOmegapsilitonos", "greekOmegapsilivaria", "greekOmegatonos", "greekOmegavaria", "greekOmicron", "greekOmicrondasia", "greekOmicrondasiatonos", "greekOmicrondasiavaria", "greekOmicronpsili", "greekOmicronpsilitonos", "greekOmicronpsilivaria", "greekOmicrontonos", "greekOmicronvaria", "greekPhi", "greekPi", "greekPsi", "greekRho", "greekRhodasia", "greekSigma", "greekSigmalunate", "greekTau", "greekTheta", "greekUpsilon", "greekUpsilondasia", "greekUpsilondasiaperispomeni", "greekUpsilondasiatonos", "greekUpsilondasiavaria", "greekUpsilondialytika", "greekUpsilonmacron", "greekUpsilontonos", "greekUpsilonvaria", "greekUpsilonvrachy", "greekXi", "greekZeta", "greekalpha", "greekalphadasia", "greekalphadasiaperispomeni", "greekalphadasiatonos", "greekalphadasiavaria", "greekalphaiotasub", "greekalphaiotasubdasia", "greekalphaiotasubdasiaperispomeni", "greekalphaiotasubdasiatonos", "greekalphaiotasubdasiavaria", "greekalphaiotasubperispomeni", "greekalphaiotasubpsili", "greekalphaiotasubpsiliperispomeni", "greekalphaiotasubpsilitonos", "greekalphaiotasubpsilivaria", "greekalphaiotasubtonos", "greekalphaiotasubvaria", "greekalphamacron", "greekalphaoxia", "greekalphaperispomeni", "greekalphapsili", "greekalphapsiliperispomeni", "greekalphapsilitonos", "greekalphapsilivaria", "greekalphatonos", "greekalphavaria", "greekalphavrachy", "greekbeta", "greekbetaalt", "greekchi", "greekdasia", "greekdasiaperispomeni", "greekdasiatonos", "greekdasiavaria", "greekdelta", "greekdialytikaperispomeni", "greekdialytikatonos", "greekdialytikavaria", "greekdigamma", "greekepsilon", "greekepsilonalt", "greekepsilondasia", "greekepsilondasiatonos", "greekepsilondasiavaria", "greekepsilonoxia", "greekepsilonpsili", "greekepsilonpsilitonos", "greekepsilonpsilivaria", "greekepsilontonos", "greekepsilonvaria", "greeketa", "greeketadasia", "greeketadasiaperispomeni", "greeketadasiatonos", "greeketadasiavaria", "greeketaiotasub", "greeketaiotasubdasia", "greeketaiotasubdasiaperispomeni", "greeketaiotasubdasiatonos", "greeketaiotasubdasiavaria", "greeketaiotasubperispomeni", "greeketaiotasubpsili", "greeketaiotasubpsiliperispomeni", "greeketaiotasubpsilitonos", "greeketaiotasubpsilivaria", "greeketaiotasubtonos", "greeketaiotasubvaria", "greeketaoxia", "greeketaperispomeni", "greeketapsili", "greeketapsiliperispomeni", "greeketapsilitonos", "greeketapsilivaria", "greeketatonos", "greeketavaria", "greekfinalsigma", "greekgamma", "greekiota", "greekiotadasia", "greekiotadasiaperispomeni", "greekiotadasiatonos", "greekiotadasiavaria", "greekiotadialytika", "greekiotadialytikaperispomeni", "greekiotadialytikatonos", "greekiotadialytikavaria", "greekiotamacron", "greekiotaoxia", "greekiotaperispomeni", "greekiotapsili", "greekiotapsiliperispomeni", "greekiotapsilitonos", "greekiotapsilivaria", "greekiotatonos", "greekiotavaria", "greekiotavrachy", "greekkappa", "greekkoppa", "greeklambda", "greekmu", "greeknu", "greeknumerals", "greeknumkoppa", "greekomega", "greekomegadasia", "greekomegadasiaperispomeni", "greekomegadasiatonos", "greekomegadasiavaria", "greekomegaiotasub", "greekomegaiotasubdasia", "greekomegaiotasubdasiaperispomeni", "greekomegaiotasubdasiatonos", "greekomegaiotasubdasiavaria", "greekomegaiotasubperispomeni", "greekomegaiotasubpsili", "greekomegaiotasubpsiliperispomeni", "greekomegaiotasubpsilitonos", "greekomegaiotasubpsilivaria", "greekomegaiotasubtonos", "greekomegaiotasubvaria", "greekomegaoxia", "greekomegaperispomeni", "greekomegapsili", "greekomegapsiliperispomeni", "greekomegapsilitonos", "greekomegapsilivaria", "greekomegatonos", "greekomegavaria", "greekomicron", "greekomicrondasia", "greekomicrondasiatonos", "greekomicrondasiavaria", "greekomicronoxia", "greekomicronpsili", "greekomicronpsilitonos", "greekomicronpsilivaria", "greekomicrontonos", "greekomicronvaria", "greekoxia", "greekperispomeni", "greekphi", "greekphialt", "greekpi", "greekpialt", "greekprosgegrammeni", "greekpsi", "greekpsili", "greekpsiliperispomeni", "greekpsilitonos", "greekpsilivaria", "greekrho", "greekrhoalt", "greekrhodasia", "greekrhopsili", "greeksampi", "greeksigma", "greeksigmalunate", "greekstigma", "greektau", "greektheta", "greekthetaalt", "greektonos", "greekupsilon", "greekupsilondasia", "greekupsilondasiaperispomeni", "greekupsilondasiatonos", "greekupsilondasiavaria", "greekupsilondiaeresis", "greekupsilondialytikaperispomeni", "greekupsilondialytikatonos", "greekupsilondialytikavaria", "greekupsilonmacron", "greekupsilonoxia", "greekupsilonperispomeni", "greekupsilonpsili", "greekupsilonpsiliperispomeni", "greekupsilonpsilitonos", "greekupsilonpsilivaria", "greekupsilontonos", "greekupsilonvaria", "greekupsilonvrachy", "greekvaria", "greekxi", "greekzeta", "grid", "groupedcommand", "gsetboxllx", "gsetboxlly", "gstroke", "gt", "gtrapprox", "gtrdot", "gtreqless", "gtreqqless", "gtrless", "gtrsim", "guilsingleleft", "guilsingleright", "gujaratinumerals", "gurmurkhinumerals", "hairline", "hairspace", "halflinestrut", "halfstrut", "halfwaybox", "handletokens", "handwritten", "hangul", "hanzi", "hash", "hat", "hbar", "hboxofvbox", "hboxreference", "hcaron", "hcircumflex", "hdofstring", "headhbox", "headlanguage", "headnumber", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtext", "headtextcontent", "headtextdistance", "headtexts", "headtextwidth", "headvbox", "headwidth", "heartsuit", "hebrewAlef", "hebrewAyin", "hebrewBet", "hebrewDalet", "hebrewGimel", "hebrewHe", "hebrewHet", "hebrewKaf", "hebrewKaffinal", "hebrewLamed", "hebrewMem", "hebrewMemfinal", "hebrewNun", "hebrewNunfinal", "hebrewPe", "hebrewPefinal", "hebrewQof", "hebrewResh", "hebrewSamekh", "hebrewShin", "hebrewTav", "hebrewTet", "hebrewTsadi", "hebrewTsadifinal", "hebrewVav", "hebrewYod", "hebrewZayin", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "hideblocks", "high", "highlight", "highordinalstr", "hilo", "himilo", "hl", "hookleftarrow", "hookrightarrow", "horizontalgrowingbar", "horizontalpositionbar", "hpackbox", "hpackedbox", "hphantom", "hpos", "hsizefraction", "hslash", "hsmash", "hsmashbox", "hsmashed", "hspace", "hstroke", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "iacute", "ibox", "ibreve", "icaron", "icircumflex", "ideographichalffillspace", "ideographicspace", "idiaeresis", "idotaccent", "idotbelow", "idoublegrave", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignoretagsinexport", "ignorevalue", "igrave", "ihook", "iiiint", "iiiintop", "iiint", "iiintop", "iint", "iintop", "iinvertedbreve", "ijligature", "imacron", "imaginaryi", "imaginaryj", "imath", "immediatesavetwopassdata", "impliedby", "implies", "imply", "in", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "index", "infofont", "infofontbold", "inframed", "infty", "infull", "inheritparameter", "inhibitblank", "ininner", "ininneredge", "ininnermargin", "initializeboxstack", "inleft", "inleftedge", "inleftmargin", "inline", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlineprettyprintbuffer", "inlinerange", "inmargin", "inmframed", "innerflushshapebox", "inother", "inouter", "inouteredge", "inoutermargin", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "inright", "inrightedge", "inrightmargin", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installglobalmacrostack", "installlanguage", "installleftframerenderer", "installmacrostack", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "int", "intclockwise", "integerrounding", "integers", "interactionbar", "interactionbuttons", "interactionmenu", "intercal", "intertext", "intop", "invisibletimes", "invokepageheandler", "iogonek", "iota", "italic", "italicbold", "italiccorrection", "italicface", "item", "items", "itemtag", "itilde", "jcaron", "jcircumflex", "jmath", "jobfilename", "jobfilesuffix", "kap", "kappa", "kcaron", "kcommaaccent", "keepblocks", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "khook", "kkra", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "lVert", "labellanguage", "labeltext", "labeltexts", "lacute", "lambda", "lambdabar", "land", "langle", "language", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "latin", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbar", "lbox", "lbrace", "lbracket", "lcaron", "lceil", "lcommaaccent", "lcurl", "ldotmiddle", "ldotp", "ldots", "le", "leadsto", "left", "leftaligned", "leftarrow", "leftarrowtail", "leftarrowtriangle", "leftbottombox", "leftbox", "leftdasharrow", "leftguillemot", "leftharpoondown", "leftharpoonup", "lefthbox", "leftheadtext", "leftlabeltext", "leftleftarrows", "leftline", "leftmathlabeltext", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftrightarrow", "leftrightarrows", "leftrightarrowtriangle", "leftrightharpoons", "leftrightsquigarrow", "leftskipadaption", "leftsquigarrow", "leftsubguillemot", "leftthreetimes", "lefttopbox", "lefttoright", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "leftwavearrow", "leftwhitearrow", "leq", "leqq", "leqslant", "lessapprox", "lessdot", "lesseqgtr", "lesseqqgtr", "lessgtr", "lesssim", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterleftbracket", "letterleftparenthesis", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "letterrightbracket", "letterrightparenthesis", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lfloor", "lgroup", "lhbox", "lhooknwarrow", "lhooksearrow", "limitatefirstline", "limitatelines", "limitatetext", "line", "linebox", "linefeed", "linenote", "linespanningtext", "linethickness", "linterval", "listcitation", "listcite", "listlength", "listnamespaces", "ljligature", "ll", "llangle", "llap", "llbracket", "llcorner", "lll", "llless", "lmoustache", "lnapprox", "lneq", "lneqq", "lnot", "lnsim", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "logo", "lohi", "lointerval", "lomihi", "longleftarrow", "longleftrightarrow", "longmapsfrom", "longmapsto", "longrightarrow", "longrightsquigarrow", "looparrowleft", "looparrowright", "lor", "low", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lozenge", "lparent", "lrcorner", "lrointerval", "lrtbbox", "lstroke", "lt", "ltimes", "ltop", "ltrhbox", "ltrvbox", "ltrvtop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luaexpr", "luafunction", "luajitTeX", "luamajorversion", "luametaTeX", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "lvert", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "mainlanguage", "makecharacteractive", "makerawcommalist", "makestrutofbox", "maltese", "mapfontsize", "mapsdown", "mapsfrom", "mapsto", "mapsup", "margindata", "margintext", "markcontent", "markedpages", "marking", "markinjector", "markpage", "mat", "math", "mathampersand", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathdefault", "mathdollar", "mathdouble", "mathematics", "mathfraktur", "mathfunction", "mathhash", "mathhyphen", "mathit", "mathitalic", "mathlabellanguage", "mathlabeltext", "mathlabeltexts", "mathop", "mathover", "mathpercent", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathunder", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "maxaligned", "mbox", "mcframed", "measure", "measured", "measuredangle", "measuredeq", "medskip", "medspace", "menubutton", "mequal", "message", "mfence", "mframed", "mfunction", "mfunctionlabeltext", "mhbox", "mho", "mhookleftarrow", "mhookrightarrow", "mid", "midaligned", "middle", "middlealigned", "middlebox", "midhbox", "midsubsentence", "minimalhbox", "minus", "minuscolon", "mirror", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "models", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "month", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "mu", "multimap", "nHdownarrow", "nHuparrow", "nLeftarrow", "nLeftrightarrow", "nRightarrow", "nVDash", "nVdash", "nVleftarrow", "nVleftrightarrow", "nVrightarrow", "nabla", "nacute", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "napostrophe", "napprox", "napproxEq", "narrownobreakspace", "nasymp", "natural", "naturalhbox", "naturalhpack", "naturalnumbers", "naturaltpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "ncaron", "ncommaaccent", "ncong", "ncurl", "ndivides", "ne", "nearrow", "neg", "negatecolorbox", "negated", "negativesign", "negemspace", "negenspace", "negthinspace", "neng", "neq", "nequiv", "neswarrow", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nexists", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "ngeq", "ngrave", "ngtr", "ngtrless", "ngtrsim", "ni", "nihongo", "nin", "njligature", "nleftarrow", "nleftrightarrow", "nleq", "nless", "nlessgtr", "nlesssim", "nmid", "nni", "nobar", "nobreakspace", "nocap", "nocharacteralign", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noheaderandfooterlines", "noheightstrut", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalitalicface", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normalslantedface", "normaltypeface", "nospace", "not", "note", "notesymbol", "notin", "notopandbottomlines", "notragged", "nowns", "nparallel", "nprec", "npreccurlyeq", "nrightarrow", "nsim", "nsimeq", "nsqsubseteq", "nsqsupseteq", "nsubset", "nsubseteq", "nsucc", "nsucccurlyeq", "nsupset", "nsupseteq", "ntilde", "ntimes", "ntriangleleft", "ntrianglelefteq", "ntriangleright", "ntrianglerighteq", "nu", "numberofpoints", "numbers", "nvDash", "nvdash", "nvleftarrow", "nvleftrightarrow", "nvrightarrow", "nwarrow", "nwsearrow", "oacute", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "obreve", "ocaron", "ocircumflex", "ocircumflexacute", "ocircumflexdotbelow", "ocircumflexgrave", "ocircumflexhook", "ocircumflextilde", "odiaeresis", "odiaeresismacron", "odot", "odotaccent", "odotaccentmacron", "odotbelow", "odoublegrave", "oeligature", "offset", "offsetbox", "ograve", "ohm", "ohook", "ohorn", "ohornacute", "ohorndotbelow", "ohorngrave", "ohornhook", "ohorntilde", "ohungarumlaut", "oiiint", "oiint", "oint", "ointclockwise", "ointctrclockwise", "oinvertedbreve", "omacron", "omega", "omicron", "ominus", "onedigitrounding", "oneeighth", "onefifth", "onehalf", "onequarter", "onesixth", "onesuperior", "onethird", "oogonek", "oogonekmacron", "operatorlanguage", "operatortext", "oplus", "ordfeminine", "ordinaldaynumber", "ordinalstr", "ordmasculine", "ornamenttext", "oslash", "ostroke", "ostrokeacute", "otilde", "otildemacron", "otimes", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbarunderbar", "overbrace", "overbraceunderbrace", "overbracket", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlayimage", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overloaderror", "overparent", "overparentunderparent", "overrightarrow", "overset", "overstrike", "overstrikes", "owns", "page", "pagearea", "pagebreak", "pagefigure", "pageinjection", "pagenumber", "pagereference", "pagestaterealpage", "pagestaterealpageorder", "paletsize", "paragraphmark", "parallel", "part", "partial", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "periodcentered", "periods", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "perp", "persiandecimals", "persiandecimalseparator", "persiannumerals", "persianthousandsseparator", "perthousand", "phantom", "phantombox", "phi", "phook", "pi", "pickupgroupedcommand", "pitchfork", "placeattachments", "placebookmarks", "placebtxrendering", "placechemical", "placecitation", "placecombinedlist", "placecomments", "placecontent", "placecurrentformulanumber", "placedbox", "placefigure", "placefloat", "placefloatwithsetups", "placefootnotes", "placeformula", "placeframed", "placegraphic", "placeheadnumber", "placeheadtext", "placehelp", "placeindex", "placeinitial", "placeintermezzo", "placelayer", "placelayeredtext", "placelegend", "placelist", "placelistofabbreviations", "placelistofchemicals", "placelistoffigures", "placelistofgraphics", "placelistofintermezzi", "placelistoflogos", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelistoftables", "placelocalfootnotes", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placeongrid", "placeontopofeachother", "placepagenumber", "placepairedbox", "placeparallel", "placerawheaddata", "placerawheadnumber", "placerawheadtext", "placerawlist", "placeregister", "placerenderingwindow", "placesidebyside", "placesubformula", "placetable", "pm", "popattribute", "popmacro", "popmode", "popsystemmode", "position", "positionoverlay", "positionregionoverlay", "positivesign", "postponenotes", "prec", "precapprox", "preccurlyeq", "preceq", "preceqq", "precnapprox", "precneq", "precneqq", "precnsim", "precsim", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prefixlanguage", "prefixtext", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "prerollblank", "presetbtxlabeltext", "presetdocument", "presetfieldsymbols", "presetheadtext", "presetlabeltext", "presetmathlabeltext", "presetoperatortext", "presetprefixtext", "presetsuffixtext", "presettaglabeltext", "presetunittext", "pretocommalist", "prettyprintbuffer", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "prime", "primes", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processblocks", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "prod", "product", "profiledbox", "profilegivenbox", "program", "project", "propto", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "psi", "punctuationspace", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "putboxincache", "putnextboxincache", "qquad", "quad", "quadrupleprime", "quads", "quarterstrut", "questiondown", "questionedeq", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "quotation", "quote", "quotedbl", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "quotesingle", "quotesinglebase", "rVert", "racute", "raggedbottom", "raggedcenter", "raggedleft", "raggedright", "raggedwidecenter", "raisebox", "randomizetext", "randomnumber", "rangle", "rationals", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "rbrace", "rbracket", "rcaron", "rceil", "rcommaaccent", "rdoublegrave", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "reals", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "reference", "referenceprefix", "referring", "registerattachment", "registerctxluafile", "registered", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "relbar", "remainingcharacters", "remark", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "repeathead", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetboxesincache", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmarking", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetperiodkerning", "resetprofile", "resetrecurselevel", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettokenlist", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "restriction", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "reverseddoubleprime", "reversedprime", "reversedtripleprime", "reversehbox", "reversehpack", "reversetpack", "reversevbox", "reversevpack", "reversevtop", "revivefeature", "rfence", "rfloor", "rgroup", "rhbox", "rho", "rhooknearrow", "rhookswarrow", "right", "rightaligned", "rightangle", "rightarrow", "rightarrowbar", "rightarrowtail", "rightarrowtriangle", "rightbottombox", "rightbox", "rightdasharrow", "rightguillemot", "rightharpoondown", "rightharpoonup", "righthbox", "rightheadtext", "rightlabeltext", "rightleftarrows", "rightleftharpoons", "rightline", "rightmathlabeltext", "rightorleftpageaction", "rightpageorder", "rightrightarrows", "rightskipadaption", "rightsquigarrow", "rightsubguillemot", "rightthreearrows", "rightthreetimes", "righttoleft", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rightwavearrow", "rightwhitearrow", "ring", "rinterval", "rinvertedbreve", "risingdotseq", "rlap", "rlointerval", "rmoustache", "rneq", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rointerval", "rollbutton", "roman", "romanC", "romanD", "romanI", "romanII", "romanIII", "romanIV", "romanIX", "romanL", "romanM", "romanV", "romanVI", "romanVII", "romanVIII", "romanX", "romanXI", "romanXII", "romanc", "romand", "romani", "romanii", "romaniii", "romaniv", "romanix", "romanl", "romanm", "romannumerals", "romanv", "romanvi", "romanvii", "romanviii", "romanx", "romanxi", "romanxii", "rootradical", "rotate", "rparent", "rrangle", "rrbracket", "rrointerval", "rtimes", "rtlhbox", "rtlvbox", "rtlvtop", "rtop", "ruby", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "rvert", "sacute", "safechar", "samplefile", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "scale", "scaron", "scedilla", "schwa", "schwahook", "scircumflex", "scommaaccent", "screen", "searrow", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "section", "sectionmark", "seeindex", "select", "selectblocks", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setautopagestaterealpageno", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharacteraligndetail", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setfirstpasscharacteralign", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setglobalscript", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelement", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setlocalscript", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setminus", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setperiodkerning", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsecondpasscharacteralign", "setsectionblock", "setsimplecolumnshsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settestcrlf", "settextcontent", "settightobject", "settightreferencedobject", "settightstrut", "settightunreferencedobject", "settokenlist", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupalign", "setupalternativestyles", "setuparranging", "setupattachment", "setupattachments", "setupbackend", "setupbackground", "setupbackgrounds", "setupbar", "setupbars", "setupblackrules", "setupblank", "setupbleeding", "setupblock", "setupbodyfont", "setupbookmark", "setupbottom", "setupbottomtexts", "setupbtx", "setupbtxdataset", "setupbtxlabeltext", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbuffer", "setupbutton", "setupcapitals", "setupcaption", "setupcaptions", "setupcharacteralign", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupclipping", "setupcollector", "setupcolor", "setupcolors", "setupcolumns", "setupcolumnset", "setupcolumnsetarea", "setupcolumnsetareatext", "setupcolumnsetlines", "setupcolumnsetspan", "setupcolumnsetstart", "setupcombination", "setupcombinedlist", "setupcomment", "setupcontent", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenumerations", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfacingfloat", "setupfield", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfields", "setupfieldtotalframed", "setupfiller", "setupfillinlines", "setupfillinrules", "setupfirstline", "setupfittingpage", "setupfloat", "setupfloatframed", "setupfloats", "setupfloatsplitting", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupfooter", "setupfootertexts", "setupfootnotes", "setupforms", "setupformula", "setupformulae", "setupformulaframed", "setupframed", "setupframedcontent", "setupframedtable", "setupframedtablecolumn", "setupframedtablerow", "setupframedtext", "setupframedtexts", "setupglobalreferenceprefix", "setuphead", "setupheadalternative", "setupheader", "setupheadertexts", "setupheadnumber", "setupheads", "setupheadtext", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setuphyphenmark", "setupindentedtext", "setupindenting", "setupindex", "setupinitial", "setupinsertion", "setupinteraction", "setupinteractionbar", "setupinteractionmenu", "setupinteractionscreen", "setupinterlinespace", "setupitaliccorrection", "setupitemgroup", "setupitemizations", "setupitemize", "setupitems", "setuplabel", "setuplabeltext", "setuplanguage", "setuplayer", "setuplayeredtext", "setuplayout", "setuplayouttext", "setuplegend", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinenumbering", "setuplines", "setuplinetable", "setuplinewidth", "setuplist", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmakeup", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmarginrules", "setupmarking", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathfractions", "setupmathframed", "setupmathlabeltext", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnarrower", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoperatortext", "setupoppositeplacing", "setupoutputroutine", "setuppagechecker", "setuppagecolumns", "setuppagecomment", "setuppageinjection", "setuppageinjectionalternative", "setuppagenumber", "setuppagenumbering", "setuppageshift", "setuppagestate", "setuppagetransitions", "setuppairedbox", "setuppalet", "setuppaper", "setuppapersize", "setupparagraph", "setupparagraphintro", "setupparagraphnumbering", "setupparagraphs", "setupparallel", "setupperiodkerning", "setupperiods", "setupplacement", "setuppositionbar", "setuppositioning", "setupprefixtext", "setupprocessor", "setupprofile", "setupprograms", "setupquotation", "setupquote", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupreferencing", "setupregister", "setupregisters", "setuprenderingwindow", "setuprotate", "setupruby", "setups", "setupscale", "setupscript", "setupscripts", "setupsectionblock", "setupselector", "setupshift", "setupsidebar", "setupsorting", "setupspacing", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setupsubformulas", "setupsubpagenumber", "setupsuffixtext", "setupsymbols", "setupsymbolset", "setupsynctex", "setupsynonyms", "setuptables", "setuptabulate", "setuptabulation", "setuptagging", "setuptaglabeltext", "setuptext", "setuptextbackground", "setuptextflow", "setuptextnote", "setuptextrules", "setuptexttexts", "setupthinrules", "setuptolerance", "setuptooltip", "setuptop", "setuptoptexts", "setuptype", "setuptyping", "setupunit", "setupunittext", "setupurl", "setupuserdata", "setupuserdataalternative", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwhitespace", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "seveneighths", "sfrac", "shapedhbox", "sharp", "shiftbox", "shiftdown", "shiftup", "showallmakeup", "showattributes", "showbodyfont", "showbodyfontenvironment", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolor", "showcolorbar", "showcolorcomponents", "showcolorgroup", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontexpansion", "showfontitalics", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showframe", "showglyphdata", "showglyphs", "showgrid", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayout", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmakeup", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showpalet", "showparentchain", "showprint", "showsetups", "showsetupsdefinition", "showstruts", "showsymbolset", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "sigma", "signalrightpage", "sim", "simeq", "simplealignedbox", "simplealignedboxplus", "simplealignedspreadbox", "simplegroupedcommand", "simplereversealignedbox", "simplereversealignedboxplus", "singalcharacteralign", "singlebond", "singleverticalbar", "sixperemspace", "sixthofsixarguments", "slanted", "slantedbold", "slantedface", "slash", "slicepages", "slong", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smallcaps", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "smile", "snaptogrid", "softhyphen", "solidus", "someheadnumber", "somekindoftab", "someline", "somelocalfloat", "somenamedheadnumber", "someplace", "somewhere", "space", "spaceddigits", "spaceddigitsmethod", "spaceddigitsseparator", "spaceddigitssymbol", "spadesuit", "spanishNumerals", "spanishnumerals", "speech", "sphericalangle", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitatperiod", "splitdfrac", "splitfilename", "splitfloat", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqcap", "sqcup", "sqrt", "sqsubset", "sqsubseteq", "sqsubsetneq", "sqsupset", "sqsupseteq", "sqsupsetneq", "square", "squaredots", "ssharp", "stackrel", "stackscripts", "star", "stareq", "startJScode", "startJSpreamble", "startLUA", "startMP", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startPARSEDXML", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEX", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startXML", "startalign", "startalignment", "startallmodes", "startappendices", "startarrangedpages", "startaside", "startattachment", "startbackground", "startbackmatter", "startbar", "startbbordermatrix", "startbitmapimage", "startblockquote", "startbodymatter", "startbordermatrix", "startboxedcolumns", "startbtxlabeltext", "startbtxrenderingdefinitions", "startbuffer", "startcases", "startcatcodetable", "startcenteraligned", "startchapter", "startcharacteralign", "startcheckedfences", "startchemical", "startchemicaltext", "startcollect", "startcollecting", "startcolor", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnset", "startcolumnsetspan", "startcombination", "startcomment", "startcomponent", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdelimited", "startdelimitedtext", "startdisplaymath", "startdmath", "startdocument", "starteffect", "startelement", "startembeddedxtable", "startendnote", "startendofline", "startenvironment", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfacingfloat", "startfact", "startfigure", "startfiguretext", "startfittingpage", "startfixed", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startfootnote", "startformula", "startformulas", "startframed", "startframedcell", "startframedcontent", "startframedrow", "startframedtable", "startframedtext", "startfrontmatter", "startgoto", "startgraphictext", "startgridsnapping", "starthanging", "starthbox", "starthboxestohbox", "starthboxregister", "starthead", "startheadtext", "starthelptext", "starthiding", "starthighlight", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinteraction", "startinteractionmenu", "startinterface", "startintermezzotext", "startintertext", "startitem", "startitemgroup", "startitemgroupcolumns", "startitemize", "startknockout", "startlabeltext", "startlanguage", "startlayout", "startleftaligned", "startlegend", "startline", "startlinealignment", "startlinecorrection", "startlinefiller", "startlinenote", "startlinenumbering", "startlines", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginblock", "startmarginrule", "startmarkedcontent", "startmarkpages", "startmathalignment", "startmathcases", "startmathlabeltext", "startmathmatrix", "startmathmode", "startmathstyle", "startmatrices", "startmatrix", "startmaxaligned", "startmdformula", "startmidaligned", "startmiddlealigned", "startmiddlemakeup", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startoperatortext", "startopposite", "startoutputstream", "startoverlay", "startoverprint", "startpacked", "startpagecolumns", "startpagecomment", "startpagefigure", "startpagelayout", "startpagemakeup", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpart", "startpath", "startplacechemical", "startplacefigure", "startplacefloat", "startplaceformula", "startplacegraphic", "startplaceintermezzo", "startplacelegend", "startplacepairedbox", "startplacetable", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startpostponingnotes", "startprefixtext", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startproduct", "startproject", "startprotect", "startprotectedcolors", "startpublication", "startpunctuation", "startquotation", "startquote", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startrightaligned", "startruby", "startscript", "startsdformula", "startsection", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsetups", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startsplitformula", "startsplittext", "startspread", "startstandardmakeup", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubject", "startsubjectlevel", "startsubsection", "startsubsentence", "startsubstack", "startsubsubject", "startsubsubsection", "startsubsubsubject", "startsubsubsubsection", "startsubsubsubsubject", "startsubsubsubsubsection", "startsubsubsubsubsubject", "startsuffixtext", "startsymbolset", "starttable", "starttablehead", "starttables", "starttabletail", "starttabletext", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttaglabeltext", "starttexcode", "starttexdefinition", "starttext", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextmakeup", "starttextrule", "starttitle", "starttokenlist", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "starttyping", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunittext", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startuserdata", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxcolumn", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "stligature", "stopJScode", "stopJSpreamble", "stopLUA", "stopMP", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopPARSEDXML", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEX", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopXML", "stopalign", "stopalignment", "stopallmodes", "stopappendices", "stoparrangedpages", "stopaside", "stopattachment", "stopbackground", "stopbackmatter", "stopbar", "stopbbordermatrix", "stopbitmapimage", "stopblockquote", "stopbodymatter", "stopbordermatrix", "stopboxedcolumns", "stopbtxlabeltext", "stopbtxrenderingdefinitions", "stopbuffer", "stopcases", "stopcatcodetable", "stopcenteraligned", "stopchapter", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopchemicaltext", "stopcollect", "stopcollecting", "stopcolor", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnset", "stopcolumnsetspan", "stopcombination", "stopcomment", "stopcomponent", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdelimited", "stopdelimitedtext", "stopdisplaymath", "stopdmath", "stopdocument", "stopeffect", "stopelement", "stopembeddedxtable", "stopendnote", "stopendofline", "stopenvironment", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfacingfloat", "stopfact", "stopfigure", "stopfiguretext", "stopfittingpage", "stopfixed", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopfootnote", "stopformula", "stopformulas", "stopframed", "stopframedcell", "stopframedcontent", "stopframedrow", "stopframedtable", "stopframedtext", "stopfrontmatter", "stopgoto", "stopgraphictext", "stopgridsnapping", "stophanging", "stophbox", "stophboxestohbox", "stophboxregister", "stophead", "stopheadtext", "stophelptext", "stophiding", "stophighlight", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinteraction", "stopinteractionmenu", "stopinterface", "stopintermezzotext", "stopintertext", "stopitem", "stopitemgroup", "stopitemgroupcolumns", "stopitemize", "stopknockout", "stoplabeltext", "stoplanguage", "stoplayout", "stopleftaligned", "stoplegend", "stopline", "stoplinealignment", "stoplinecorrection", "stoplinefiller", "stoplinenote", "stoplinenumbering", "stoplines", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginblock", "stopmarginrule", "stopmarkedcontent", "stopmarkpages", "stopmathalignment", "stopmathcases", "stopmathlabeltext", "stopmathmatrix", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmatrix", "stopmaxaligned", "stopmdformula", "stopmidaligned", "stopmiddlealigned", "stopmiddlemakeup", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopoperatortext", "stopopposite", "stopoutputstream", "stopoverlay", "stopoverprint", "stoppacked", "stoppagecolumns", "stoppagecomment", "stoppagefigure", "stoppagelayout", "stoppagemakeup", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppart", "stoppath", "stopplacechemical", "stopplacefigure", "stopplacefloat", "stopplaceformula", "stopplacegraphic", "stopplaceintermezzo", "stopplacelegend", "stopplacepairedbox", "stopplacetable", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stoppostponingnotes", "stopprefixtext", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopproduct", "stopproject", "stopprotect", "stopprotectedcolors", "stoppublication", "stoppunctuation", "stopquotation", "stopquote", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopreusableMPgraphic", "stoprightaligned", "stopruby", "stopscript", "stopsdformula", "stopsection", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsetups", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopsplitformula", "stopsplittext", "stopspread", "stopstandardmakeup", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstrut", "stopstyle", "stopsubformulas", "stopsubject", "stopsubjectlevel", "stopsubsection", "stopsubsentence", "stopsubstack", "stopsubsubject", "stopsubsubsection", "stopsubsubsubject", "stopsubsubsubsection", "stopsubsubsubsubject", "stopsubsubsubsubsection", "stopsubsubsubsubsubject", "stopsuffixtext", "stopsymbolset", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabletext", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptaglabeltext", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextmakeup", "stoptextrule", "stoptitle", "stoptokenlist", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stoptyping", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunittext", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopuserdata", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxcolumn", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stretched", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutgap", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subject", "subpagenumber", "subsection", "subsentence", "subset", "subseteq", "subseteqq", "subsetneq", "subsetneqq", "substituteincommalist", "subsubject", "subsubsection", "subsubsubject", "subsubsubsection", "subsubsubsubject", "subsubsubsubsection", "subsubsubsubsubject", "subtractfeature", "succ", "succapprox", "succcurlyeq", "succeq", "succeqq", "succnapprox", "succneq", "succneqq", "succnsim", "succsim", "suffixlanguage", "suffixtext", "sum", "supset", "supseteq", "supseteqq", "supsetneq", "supsetneqq", "surd", "surdradical", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "swarrow", "switchstyleonly", "switchtobodyfont", "switchtocolor", "switchtointerlinespace", "symbol", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "synctexblockfilename", "synctexresetfilename", "synctexsetfilename", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "taglabellanguage", "taglabeltext", "tau", "tbinom", "tbox", "tcaron", "tcedilla", "tcommaaccent", "tcurl", "tequal", "test", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textAngstrom", "textacute", "textampersand", "textasciicircum", "textasciitilde", "textat", "textbackslash", "textbar", "textbottomcomma", "textbottomdot", "textbraceleft", "textbraceright", "textbreve", "textbrokenbar", "textbullet", "textcaron", "textcedilla", "textcelsius", "textcent", "textcircledP", "textcircumflex", "textcitation", "textcite", "textcomma", "textcontrolspace", "textcurrency", "textdag", "textddag", "textdegree", "textdiaeresis", "textdiv", "textdollar", "textdong", "textdotaccent", "textellipsis", "texteuro", "textflowcollector", "textfraction", "textgrave", "texthash", "texthorizontalbar", "texthungarumlaut", "texthyphen", "textkelvin", "textlognot", "textmacron", "textmath", "textmho", "textminus", "textmu", "textmultiply", "textnumero", "textogonek", "textohm", "textormathchar", "textormathchars", "textounce", "textpercent", "textperiod", "textplus", "textpm", "textreference", "textring", "textrule", "textslash", "textsterling", "texttilde", "textunderscore", "textvisiblespace", "textyen", "thai", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "therefore", "theremainingcharacters", "theta", "thickspace", "thinrule", "thinrules", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thook", "thookleftarrow", "thookrightarrow", "thorn", "threedigitrounding", "threeeighths", "threefifths", "threeperemspace", "threequarter", "threesuperior", "tibetannumerals", "tightlayer", "tilde", "times", "tinyfont", "title", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "to", "tochar", "tolinenote", "tooltip", "top", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "trademark", "translate", "transparencycomponents", "transparent", "trel", "triangle", "triangledown", "triangleleft", "triangleq", "triangleright", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "tripleprime", "tripleverticalbar", "truefilename", "truefontname", "tstroke", "ttraggedright", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "turnediota", "twodigitrounding", "twofifths", "twoheaddownarrow", "twoheadleftarrow", "twoheadrightarrow", "twoheadrightarrowtail", "twoheaduparrow", "twosuperior", "twothirds", "tx", "txx", "typ", "type", "typebuffer", "typedefinedbuffer", "typeface", "typefile", "typeinlinebuffer", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uacute", "ubreve", "ucaron", "ucircumflex", "uconvertnumber", "udiaeresis", "udiaeresisacute", "udiaeresiscaron", "udiaeresisgrave", "udiaeresismacron", "udotbelow", "udots", "udoublegrave", "uedcatcodecommand", "ugrave", "uhook", "uhorn", "uhornacute", "uhorndotbelow", "uhorngrave", "uhornhook", "uhorntilde", "uhungarumlaut", "uinvertedbreve", "ulcorner", "umacron", "undefinevalue", "undepthed", "underbar", "underbars", "underbrace", "underbracket", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underparent", "underrandom", "underrandoms", "underrightarrow", "underset", "understrike", "understrikes", "undoassign", "unexpandeddocumentvariable", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unit", "unitlanguage", "unitshigh", "unitslow", "unittext", "unknown", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "unstackscripts", "untexargument", "untexcommand", "uogonek", "upand", "uparrow", "updasharrow", "updownarrow", "updownarrowbar", "updownarrows", "upharpoonleft", "upharpoonright", "uplus", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "upsilon", "upuparrows", "upwhitearrow", "urcorner", "uring", "url", "useJSscripts", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useURL", "usealignparameter", "useblankparameter", "useblocks", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecitation", "usecolors", "usecomponent", "usedirectory", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternaldocument", "useexternalfigure", "useexternalrendering", "useexternalsoundtrack", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "usemodule", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usesymbols", "usetexmodule", "usetypescript", "usetypescriptfile", "useurl", "usezipfile", "utfchar", "utflower", "utfupper", "utilde", "utilityregisterlength", "vDash", "varTheta", "varepsilon", "varkappa", "varnothing", "varphi", "varpi", "varrho", "varsigma", "vartheta", "vboxreference", "vdash", "vdots", "vec", "vee", "veebar", "veeeq", "verbatim", "verbatimstring", "verbosenumber", "version", "vert", "verticalgrowingbar", "verticalpositionbar", "veryraggedcenter", "veryraggedleft", "veryraggedright", "vglue", "viewerlayer", "vl", "vpackbox", "vpackedbox", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wcircumflex", "wdofstring", "wedge", "wedgeeq", "weekday", "whitearrowupfrombar", "widehat", "widetilde", "widthofstring", "widthspanningtext", "withoutpt", "word", "wordright", "words", "wordtonumber", "wp", "wr", "writebetweenlist", "writedatatolist", "writestatus", "writetolist", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xi", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifatt", "xmldoifelse", "xmldoifelseatt", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotatt", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineprettyprint", "xmlinlineprettyprinttext", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmllastpar", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpar", "xmlparam", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprettyprinttext", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetatt", "xmlsetattribute", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetpar", "xmlsetparam", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "yacute", "ycircumflex", "ydiaeresis", "ydotbelow", "yen", "ygrave", "yhook", "ymacron", "ytilde", "zacute", "zcaron", "zdotaccent", "zeronumberconversion", "zerowidthnobreakspace", "zerowidthspace", "zeta", "zhook", "zstroke", "zwj", "zwnj" },
+ ["cs"]={ "Cisla", "Kap", "MESIC", "Rimskecislice", "SLOVA", "SLOVO", "Slova", "Slovo", "VSEDNIDEN", "Znak", "Znaky", "aktualnicislonadpisu", "aktualnidatum", "barevnalista", "barva", "cernalinka", "cernelinky", "cisla", "cislonadpisu", "cislorovnice", "cislostrany", "datum", "definuj", "definujakcent", "definujbarvu", "definujblok", "definujbloksekce", "definujbuffer", "definujfont", "definujformatodkazu", "definujhbox", "definujinterakcnimenu", "definujkombinovanyseznam", "definujkonverzi", "definujnadpis", "definujobrazeksymbol", "definujodkaz", "definujodstavce", "definujopis", "definujoramovani", "definujoramovanytext", "definujpaletu", "definujplvouciobjekt", "definujpodpole", "definujpole", "definujpopis", "definujpopisek", "definujprekryv", "definujprikaz", "definujprofil", "definujprogram", "definujprostredizakladnihofontu", "definujrejstrik", "definujsablonutabulky", "definujsekci", "definujseznam", "definujskupinubarev", "definujstartstop", "definujstyl", "definujstylfontu", "definujsymbol", "definujsynonumumfontu", "definujsynonyma", "definujtabelaci", "definujtext", "definujtrideni", "definujupravu", "definujvelikostpapiru", "definujvycet", "definujzakladnifont", "definujzasobnikpoli", "definujznaceni", "definujznak", "delkaseznamu", "externiobraz", "hlavnijazyk", "hodnotabarvy", "instalacejazyka", "interakcnilista", "interakcnitlacitka", "interaktivnimenu", "jazyk", "jdidolu", "jdina", "jdinabox", "jdinastranu", "klonujpole", "komponenta", "konvertujcislo", "kopirujpole", "korekcebilehomista", "matematika", "meritko", "mesic", "mezera", "mrizka", "nastavbarvu", "nastavbarvy", "nastavbilamista", "nastavblok", "nastavbloksekce", "nastavbuffer", "nastavcernelinky", "nastavcislonadpisu", "nastavcislostrany", "nastavcislovaniodstavcu", "nastavcislovaniradku", "nastavcislovanistran", "nastavcitaci", "nastavdeleniplvoucichobjektu", "nastavdelitko", "nastavdolnitexty", "nastavhorejsek", "nastavhornitexty", "nastavinterakci", "nastavinterakcnilistu", "nastavinterakcnimenu", "nastavinterakcniobrazovku", "nastavjazyk", "nastavkapitalky", "nastavkombinovanyseznam", "nastavkomentar", "nastavkomentarstrany", "nastavmarginalnilinky", "nastavmeziradkovoumezeru", "nastavnadpis", "nastavnadpisy", "nastavodkazovani", "nastavodsazovani", "nastavodstavce", "nastavopis", "nastavoramovanetexty", "nastavoramovani", "nastavorez", "nastavotoceni", "nastavpaletu", "nastavplvouciobjekt", "nastavplvouciobjekty", "nastavpodcislostrany", "nastavpole", "nastavpolozky", "nastavpopisek", "nastavpopisky", "nastavpozadi", "nastavpoznamkypodcarou", "nastavprechodstrany", "nastavpreskok", "nastavprogramy", "nastavradkovani", "nastavradky", "nastavrejstrik", "nastavrovnice", "nastavsadusymbolu", "nastavseznam", "nastavsirkucary", "nastavsloupce", "nastavspodek", "nastavsynonyma", "nastavtabelaci", "nastavtabulky", "nastavtenkelinky", "nastavtext", "nastavtextovelinky", "nastavtexttexty", "nastavtextyupati", "nastavtextyzahlavi", "nastavtoleranci", "nastavtrideni", "nastavtype", "nastavumisteniprotejsku", "nastavumistovani", "nastavupati", "nastavupravu", "nastavurl", "nastavusporadani", "nastavvelikostpapiru", "nastavvsechnapole", "nastavvycty", "nastavvyplnovelinky", "nastavvyplnoveradky", "nastavvzhled", "nastavzahlavi", "nastavzakladnifont", "nastavzarovnani", "nastavznaceni", "nastavzuzeni", "nastrane", "nejakyradek", "nekde", "neznamo", "nivy", "nizky", "nokap", "obrazovka", "odkaz", "odkaznastranu", "odkaznatext", "odkazujici", "opis", "opissoubor", "oramovani", "oref", "orez", "otocit", "oznaceni", "pis", "plnezneni", "pole", "polozka", "polozky", "porovnejpaletu", "porovnejskupinubarev", "pozadi", "pozice", "poznamka", "pref", "prelozit", "prepninazakladnifont", "preskoc", "prizpusobivepole", "prizpusobvzhled", "produkt", "projekt", "prostredi", "resetznaceni", "rimskecislice", "rozdelplvouciobjekt", "roztazene", "schovejbloky", "sedabarva", "sloupec", "slovovpravo", "stanovcharakteristickuseznamu", "stanovcislonadpisu", "startbarva", "startinteraktivnimenu", "startjazyk", "startjdina", "startkomponenta", "startmarginalnilinka", "startnadpis", "startoramovani", "startpolozka", "startpozadi", "startprodukt", "startprojekt", "startprostredi", "startpublikace", "startradek", "starttextovalinka", "startumistirovnici", "startzarovnanonastred", "startzarovnanovlevo", "startzarovnanovpravo", "startzhustene", "stopbarva", "stopinteraktivnimenu", "stopjazyk", "stopjdina", "stopkomponenta", "stopmarginalnilinka", "stopnadpis", "stoporamovani", "stoppolozka", "stoppozadi", "stopprodukt", "stopprojekt", "stopprostredi", "stoppublikace", "stopradek", "stoptextovalinka", "stopumistirovnici", "stopzarovnanonastred", "stopzarovnanovlevo", "stopzarovnanovpravo", "stopzhustene", "strana", "tecky", "tenkalinka", "tenkelinky", "textovalinka", "tlacitko", "tlacitkomenu", "tloustkacary", "tref", "tvrdamezera", "tvrdemezery", "ukazbarvu", "ukazmrizku", "ukaznastaveni", "ukazpaletu", "ukazpodpery", "ukazpostredizakladnihofontu", "ukazramecek", "ukazsadusymbolu", "ukazskupinubarev", "ukazupravu", "ukazvytisk", "ukazvzhled", "ukazzakladnifont", "umistikombinovanyseznam", "umistilokalnipoznamkypodcarou", "umistinadsebe", "umistinamrizku", "umistipodrovnici", "umistipoznamkypodcarou", "umistirejstrik", "umistirovnici", "umistiseznam", "umistivedlesebe", "umistizalozky", "urcicharakteristikurejstriku", "uzijJSscripts", "uzijURL", "uzijadresar", "uzijbloky", "uzijexternidokument", "uzijexterniobraz", "uzijexternizvuk", "uzijmodul", "uzijsymbol", "uzijurl", "verze", "vlasovalinka", "vradku", "vsedniden", "vyberbloky", "vyplnenytext", "vyplnovelinky", "vyplnovyradek", "vysoky", "zachovejbloky", "zadnamezera", "zadnehorniadolniradky", "zadnezahlaviaupati", "zalozka", "zapisdoseznamu", "zapismeziseznam", "zaramovani", "zarovnanonastred", "zarovnanovlevo", "zarovnanovpravo", "zasobnikpoli", "ziskejbuffer", "ziskejznaceni", "znaceni", "znak", "znaky", "zpracujbloky", "zrcadlit", "zref" },
+ ["de"]={ "Buchstabe", "Buchstaben", "Kap", "MONAT", "Roemischezahlen", "WOCHENTAG", "WOERTER", "WORT", "Woerter", "Wort", "Ziffern", "amgitterausrichten", "aufseite", "ausfuelltext", "ausschnitt", "bearbeitebloecke", "behaltebloecke", "bei", "bemerkung", "benutzeverzeichnis", "beschriftung", "bestimmekopfnummer", "bestimmelistencharakeristika", "bestimmeregistercharakteristika", "bildschirm", "blanko", "buchstabe", "buchstaben", "datum", "defineschriftsynonym", "definiereabbsymbol", "definiereabsaetze", "definiereabschnitt", "definiereabschnittsblock", "definiereakzent", "definierebefehl", "definierebeschreibung", "definierebeschriftung", "definiereblock", "definierefarbe", "definierefarbengruppe", "definierefeld", "definierefeldstapel", "definierefliesstext", "definierefliesstextumgebung", "definieregleitobjekt", "definierehbox", "definiereinteraktionsmenue", "definierekonversion", "definierelabel", "definiereliste", "definieren", "definierenummerierung", "definiereoverlay", "definierepalette", "definierepapierformat", "definiereprofil", "definiereprogramme", "definierepuffer", "definierereferenz", "definierereferenzformat", "definiereregister", "definiereschrift", "definiereschriftstil", "definieresortieren", "definierestartstop", "definierestil", "definieresubfeld", "definieresymbol", "definieresynonyme", "definieretabellenvorlage", "definieretabulator", "definieretext", "definieretippen", "definiereueberschrift", "definiereumbruch", "definiereumrahmt", "definiereumrahmtertext", "definierezeichen", "definierezusammengestellteliste", "drehen", "duennelinie", "duennerumriss", "einezeile", "externeabbildung", "farbbalken", "farbe", "farbewert", "feld", "feldstapel", "festesspatium", "format", "formelnummer", "gefuelltesrechteck", "gefuelltezeile", "gestreckt", "gitter", "graufarbe", "haarlinie", "hauptsprache", "heutigesdatum", "heutigeskopfnummer", "hintergrund", "hoch", "holebeschriftung", "holepuffer", "imumriss", "installieresprache", "interaktionsbalken", "interaktionsknopfe", "interaktionsmenue", "inzeile", "irgendwo", "keinekopfundfusszeilen", "keinspatium", "keinzeilenobenundunten", "klonierefeld", "knopf", "komponente", "konvertierezahl", "kopfnummer", "kopierefeld", "korrigierezwischenraum", "liniendicke", "linksbuendig", "listenlaenge", "mathematik", "menueknopf", "monat", "nachunten", "nokap", "notiz", "passelayoutan", "passendfeld", "platzierebookmarks", "platziereformel", "platzierefussnoten", "platziereliste", "platzierelokalefussnoten", "platzierenebeneinander", "platziereregister", "platziereuntereinander", "platziereunterformel", "platzierezusammengestellteliste", "pos", "posten", "produkt", "programm", "projekt", "punkt", "rechteck", "rechtecke", "rechtsbuendig", "referenz", "referieren", "roemischezahlen", "ruecksetztenbeschriftung", "schreibezurliste", "schreibezwischenliste", "seite", "seitenreferenz", "seitenummer", "settext", "spalte", "spatium", "spiegeln", "sprache", "startfarbe", "starthintergrund", "startinteraktionsmenue", "startkleinerdurchschuss", "startkomponente", "startkopf", "startlinksbuendig", "startmarginallinie", "startplatziereformel", "startpos", "startprodukt", "startprojekt", "startpublikation", "startrechtsbuendig", "startsprache", "starttextlinie", "startumgebung", "startumrahmt", "startzeile", "startzentriert", "startzu", "stelleabsaetzeein", "stelleabsatznummerierungein", "stelleabschnittsblockein", "stelleanordnenein", "stelleaufzaehlungenein", "stelleausrichtungein", "stelleausschnittein", "stellebeschreibungein", "stellebeschriftungein", "stellebilderunterschriftein", "stellebildunterschriftein", "stellebindestrichein", "stelleblankoein", "stelleblockein", "stelledrehenein", "stelleduennerumrissein", "stelleeinziehenein", "stelleengerein", "stellefarbeein", "stellefarbenein", "stellefeldein", "stellefelderin", "stellefliesstextein", "stelleformelnein", "stellefussnotenein", "stellefusszeileein", "stellefusszeilentextein", "stellegefuelltesrechteckein", "stellegefuelltezeileein", "stellegegenueberplatzierenein", "stellegleitobjekteein", "stellegleitobjektein", "stellehintergruendeein", "stellehintergrundein", "stelleinteraktionein", "stelleinteraktionsbalkenein", "stelleinteraktionsbildschirmein", "stelleinteraktionsmenueein", "stellekommentarein", "stellekopfzahlein", "stellekopfzeileein", "stellekopfzeilentextein", "stellelayoutein", "stellelinienbreiteein", "stellelisteein", "stellemarginallinieein", "stellenobenein", "stellepaletteein", "stellepapierformatein", "stelleplatziegeteiltegleitobjekt", "stellepositionierenein", "stellepostenein", "stelleprogrammein", "stellepufferein", "stellerechteckein", "stellereferenzierenein", "stelleregisterein", "stelleseitenkommentarein", "stelleseitennummerein", "stelleseitennummeriernungein", "stelleseitenuebergangein", "stellesortierenein", "stellespaltenein", "stellespatiumein", "stellespracheein", "stellesymbolsetein", "stellesynonymein", "stelletabellenein", "stelletabulatorein", "stelletextein", "stelletextobenein", "stelletexttexteein", "stelletextumrissein", "stelletextuntenein", "stelletipein", "stelletippenein", "stelletoleranzein", "stelleueberschriftein", "stelleueberschriftenein", "stelleumbruchein", "stelleumrahmtein", "stelleumrahmtetexteein", "stelleuntenein", "stelleunterseitennummerein", "stelleurlein", "stelleversalienein", "stellezeilenabstandein", "stellezeilenein", "stellezeilennumerierungein", "stellezitierenein", "stellezusammengestelltelisteein", "stellezwischenraumein", "stopfarbe", "stophintergrund", "stopinteraktionsmenue", "stopkleinerdurchschuss", "stopkomponente", "stopkopf", "stoplinksbuendig", "stopmarginallinie", "stopplatziereformel", "stoppos", "stopprodukt", "stopprojekt", "stoppublikation", "stoprechtsbuendig", "stopsprache", "stoptextlinie", "stopumgebung", "stopumrahmt", "stopzeile", "stopzentriert", "stopzu", "teilegleitobjekt", "textlinie", "textreferenz", "tief", "tiho", "tip", "tippedatei", "tippen", "tippepuffer", "ueber", "uebersetzten", "umgebung", "umrahmt", "unbekant", "verbergebloecke", "vergleichefarbengruppe", "vergleichepalette", "verwendeJSscript", "verwendeURL", "verwendebloecke", "verwendeexteresdokument", "verwendeexterneabbildung", "verwendeexternestonstueck", "verwendemodul", "verwendesymbole", "verwendeurl", "volleswort", "von", "waehlebloeckeaus", "wechselezumfliesstext", "wochentag", "wortrechts", "zeigedruck", "zeigeeinstellungen", "zeigefarbe", "zeigefarbengruppe", "zeigefliesstext", "zeigefliesstextumgebung", "zeigegitter", "zeigelayout", "zeigepalette", "zeigerahmen", "zeigestruts", "zeigeumbruch", "zentriert", "ziffern", "zu", "zurbox", "zurseite" },
["en"]={},
- ["fr"]={ "Caractere", "Caracteres", "Chiffresromains", "JOURSEMAINE", "MOIS", "MOT", "MOTS", "Mot", "Mots", "Numeros", "a", "adaptedisposition", "ajustechamp", "alaligne", "alapage", "aligneadroite", "aligneagauche", "aligneaumilieu", "arriereplan", "baha", "barrecouleur", "barreinteraction", "bas", "bouton", "boutonmenu", "boutonsinteraction", "cacheblocs", "caractere", "caracteres", "champ", "changepolicecorps", "chiffresromains", "clonechamp", "colonne", "commentaire", "comparegroupecouleur", "comparepalette", "completenumeropage", "completeregistre", "composant", "concernant", "convertitnumero", "copitchamp", "corrigeespaceblanc", "couleur", "couleurgrise", "dactylographier", "dans", "datecourante", "de", "definicaractere", "definit", "definitaccent", "definitbloc", "definitblocsection", "definitbuffer", "definitcalque", "definitchamp", "definitcommande", "definitconversion", "definitcouleur", "definitdactylo", "definitdemarrestoppe", "definitdescription", "definitdisposition", "definitenumeration", "definitenvironnementpolicecorps", "definitetiquette", "definitflottant", "definitformatreference", "definitgroupecouleur", "definithbox", "definitjeucolonne", "definitliste", "definitlisteimbriquee", "definitmakeup", "definitmarquage", "definitmenuinteraction", "definitpalette", "definitparagraphes", "definitpilechamp", "definitpolice", "definitpolicecorps", "definitprofil", "definitprogramme", "definitreference", "definitregistre", "definitrevetement", "definitsautdecolonne", "definitsautdepage", "definitsection", "definitsouschamp", "definitstyle", "definitstylepolice", "definitsymbole", "definitsymbolefigure", "definitsynonymepolice", "definitsynonymes", "definittabulation", "definittaillepapier", "definittete", "definittexte", "definittrametableau", "definittri", "definittype", "definitvide", "demarreJScode", "demarreJSpreamble", "demarreLUA", "demarreMP", "demarreMPclip", "demarreMPcode", "demarreMPdefinitions", "demarreMPdrawing", "demarreMPenvironment", "demarreMPextensions", "demarreMPinclusions", "demarreMPinitializations", "demarreMPpage", "demarreMPpositiongraphic", "demarreMPpositionmethod", "demarreMPrun", "demarrePARSEDXML", "demarreTABLE", "demarreTABLEbody", "demarreTABLEfoot", "demarreTABLEhead", "demarreTABLEnext", "demarreTC", "demarreTD", "demarreTDs", "demarreTEX", "demarreTEXpage", "demarreTH", "demarreTN", "demarreTR", "demarreTRs", "demarreTX", "demarreTY", "demarreXML", "demarrealign", "demarrealigneadroite", "demarrealigneagauche", "demarrealigneaumilieu", "demarrealignment", "demarreallmodes", "demarreappendices", "demarrearrangedpages", "demarrearriereplan", "demarreaside", "demarreattachment", "demarrebackmatter", "demarrebar", "demarrebbordermatrix", "demarrebitmapimage", "demarreblockquote", "demarrebodymatter", "demarrebordermatrix", "demarreboxedcolumns", "demarrebtxlabeltext", "demarrebtxrenderingdefinitions", "demarrebuffer", "demarrecases", "demarrecatcodetable", "demarrecenteraligned", "demarrechapter", "demarrecharacteralign", "demarrecheckedfences", "demarrechemical", "demarrechemicaltext", "demarreciter", "demarrecollect", "demarrecollecting", "demarrecolorintent", "demarrecoloronly", "demarrecolorset", "demarrecolumns", "demarrecolumnset", "demarrecolumnsetspan", "demarrecolumnspan", "demarrecombination", "demarrecomment", "demarrecomposant", "demarrecontextcode", "demarrecontextdefinitioncode", "demarrecouleur", "demarrectxfunction", "demarrectxfunctiondefinition", "demarrecurrentcolor", "demarrecurrentlistentrywrapper", "demarredelimited", "demarredelimitedtext", "demarredisplaymath", "demarredmath", "demarredocument", "demarreeffect", "demarreelement", "demarreembeddedxtable", "demarreendnote", "demarreendofline", "demarreenvironement", "demarreexceptions", "demarreexpanded", "demarreexpandedcollect", "demarreextendedcatcodetable", "demarreexternalfigurecollection", "demarrefacingfloat", "demarrefact", "demarrefigure", "demarrefiguretext", "demarrefittingpage", "demarrefixed", "demarrefloatcombination", "demarrefont", "demarrefontclass", "demarrefontsolution", "demarrefootnote", "demarreformula", "demarreformulas", "demarreframed", "demarreframedcell", "demarreframedcontent", "demarreframedrow", "demarreframedtable", "demarreframedtext", "demarrefrontmatter", "demarregraphictext", "demarregridsnapping", "demarregroupe", "demarrehanging", "demarrehbox", "demarrehboxestohbox", "demarrehboxregister", "demarreheadtext", "demarrehelptext", "demarrehiding", "demarrehighlight", "demarrehyphenation", "demarreimath", "demarreindentation", "demarreindentedtext", "demarreinteraction", "demarreinterface", "demarreintermezzotext", "demarreintertext", "demarreitemgroup", "demarreitemgroupcolumns", "demarreitemize", "demarreknockout", "demarrelabeltext", "demarrelangue", "demarrelayout", "demarrelegend", "demarreligne", "demarreligneregleetexte", "demarrelinealignment", "demarrelinecorrection", "demarrelinefiller", "demarrelinenumbering", "demarrelines", "demarrelinetable", "demarrelinetablebody", "demarrelinetablecell", "demarrelinetablehead", "demarrelocalfootnotes", "demarrelocalheadsetup", "demarrelocallinecorrection", "demarrelocalnotes", "demarrelocalsetups", "demarrelua", "demarreluacode", "demarreluaparameterset", "demarreluasetups", "demarremakeup", "demarremargereglee", "demarremarginblock", "demarremarkedcontent", "demarremarkpages", "demarremathalignment", "demarremathcases", "demarremathlabeltext", "demarremathmatrix", "demarremathmode", "demarremathstyle", "demarrematrices", "demarrematrix", "demarremaxaligned", "demarremdformula", "demarremenuinteraction", "demarremiddlealigned", "demarremiddlemakeup", "demarremixedcolumns", "demarremode", "demarremodeset", "demarremodule", "demarremoduletestsection", "demarrempformula", "demarrenamedsection", "demarrenamedsubformulas", "demarrenarrow", "demarrenarrower", "demarrenegative", "demarrenicelyfilledbox", "demarrenointerference", "demarrenotallmodes", "demarrenotext", "demarrenotmode", "demarreoperatortext", "demarreopposite", "demarreoutputstream", "demarreoverlay", "demarreoverprint", "demarrepagecolumns", "demarrepagecomment", "demarrepagefigure", "demarrepagelayout", "demarrepagemakeup", "demarrepar", "demarreparagraph", "demarreparagraphs", "demarreparagraphscell", "demarreparbuilder", "demarrepart", "demarrepath", "demarreplacechemical", "demarreplacefigure", "demarreplaceflottant", "demarreplaceformule", "demarreplacegraphic", "demarreplaceintermezzo", "demarreplacelegend", "demarreplacepairedbox", "demarreplacetable", "demarrepositioning", "demarrepositionoverlay", "demarrepositive", "demarrepostponing", "demarrepostponingnotes", "demarreprefixtext", "demarreprocessassignmentcommand", "demarreprocessassignmentlist", "demarreprocesscommacommand", "demarreprocesscommalist", "demarreproduit", "demarreprojet", "demarreprotect", "demarreprotectedcolors", "demarrepublication", "demarrepunctuation", "demarrequotation", "demarrequote", "demarrerandomized", "demarrerandomseed", "demarrerawsetups", "demarrereadingfile", "demarrereferenceprefix", "demarreregime", "demarrereusableMPgraphic", "demarreruby", "demarrescript", "demarresdformula", "demarresection", "demarresectionblock", "demarresectionblockenvironment", "demarresectionlevel", "demarresetups", "demarreshapebox", "demarreshift", "demarresidebar", "demarresimplecolumns", "demarrespecialitem", "demarrespeech", "demarrespformula", "demarresplitformula", "demarresplittext", "demarrespread", "demarrestandardmakeup", "demarrestaticMPfigure", "demarrestaticMPgraphic", "demarrestrictinspectnextcharacter", "demarrestrut", "demarrestyle", "demarresubformulas", "demarresubject", "demarresubjectlevel", "demarresubsection", "demarresubsentence", "demarresubstack", "demarresubsubject", "demarresubsubsection", "demarresubsubsubject", "demarresubsubsubsection", "demarresubsubsubsubject", "demarresubsubsubsubsection", "demarresubsubsubsubsubject", "demarresuffixtext", "demarresymbolset", "demarretable", "demarretablehead", "demarretables", "demarretabletail", "demarretabletext", "demarretabulate", "demarretabulatehead", "demarretabulatetail", "demarretagged", "demarretaglabeltext", "demarretete", "demarretexcode", "demarretexdefinition", "demarretext", "demarretextbackground", "demarretextbackgroundmanual", "demarretextcolor", "demarretextcolorintent", "demarretextflow", "demarretextmakeup", "demarretitle", "demarretokenlist", "demarretokens", "demarretransparent", "demarretypescript", "demarretypescriptcollection", "demarretyping", "demarreuniqueMPgraphic", "demarreuniqueMPpagegraphic", "demarreunittext", "demarreunpacked", "demarreusableMPgraphic", "demarreuseMPgraphic", "demarreusemathstyleparameter", "demarreuserdata", "demarreusingbtxspecification", "demarreva", "demarrevbox", "demarrevboxregister", "demarrevboxtohbox", "demarrevboxtohboxseparator", "demarreviewerlayer", "demarrevtop", "demarrevtopregister", "demarrexcell", "demarrexcellgroup", "demarrexcolumn", "demarrexgroup", "demarrexmldisplayverbatim", "demarrexmlinlineverbatim", "demarrexmlraw", "demarrexmlsetups", "demarrexrow", "demarrexrowgroup", "demarrextable", "demarrextablebody", "demarrextablefoot", "demarrextablehead", "demarrextablenext", "determinecaracteristiqueliste", "determinecaracteristiquesregistre", "determinenumerotete", "echelle", "ecran", "ecritdansliste", "ecritentreliste", "element", "elements", "environement", "espace", "espacefixe", "espacesfixes", "etire", "faitreference", "fichierdactylo", "figureexterne", "gardeblocs", "grille", "haut", "inconnu", "installelangue", "joursemaine", "langue", "langueprincipale", "largeurligne", "ligneh", "lignenoire", "ligneregleetexte", "lignesnoires", "llongueurliste", "marquage", "marquepage", "mathematique", "menuinteraction", "mois", "montrecadre", "montrecouleur", "montredisposition", "montreedition", "montreenvironnementpolicecorps", "montregrille", "montregroupecouleur", "montrejeusymboles", "montremakeup", "montrepalette", "montrepolicecorps", "montrereglages", "montrestruts", "motdroit", "numeroformule", "numeropage", "numeros", "numerotete", "numerotetecourant", "obtientmarquage", "oriente", "periodes", "pilechamp", "placecoteacote", "placeflottant", "placeformule", "placelesunsaudessusdesautres", "placeliste", "placelisteinmbriquee", "placemarquespages", "placenotespdp", "placenotespdplocales", "placenumeropage", "placenumerotete", "placeregistre", "placesousformule", "placesurgrille", "placetextetete", "prendbuffer", "produit", "programme", "projet", "qqpart", "razmarquage", "referencepage", "referencetexte", "reflete", "reglealignement", "reglearrangement", "reglearriereplan", "reglearriereplans", "reglebarreinteraction", "reglebloc", "regleblocsection", "reglebuffer", "reglecapitales", "reglechamp", "reglechamps", "regleclipping", "reglecolonnes", "reglecommentaire", "reglecommentairepage", "reglecompoetroite", "reglecomposeenalinea", "reglecouleur", "reglecouleurs", "regledactylo", "regledemarrestoppe", "regledisposition", "regleecraninteraction", "regleelements", "regleencadre", "regleentete", "regleenumerations", "regleepaisseurligne", "regleespaceblanc", "regleespacement", "regleespacementinterligne", "regleflottant", "regleflottants", "regleformulaires", "regleformules", "reglegroupeselements", "regleinf", "regleinteraction", "regleintitule", "regleintitules", "reglejeucolonne", "reglejeusymboles", "reglelangue", "reglelignes", "reglelignesnoires", "reglelignesreglestexte", "regleliste", "reglelisteimbriquee", "reglemakeup", "reglemargereglee", "reglemarquage", "reglemarquagehyphenation", "reglemenuinteraction", "reglenumeropage", "reglenumerotationligne", "reglenumerotationpage", "reglenumerotationparagraphe", "reglenumerotete", "regleoriente", "reglepalette", "reglepapier", "regleparagraphes", "reglepdp", "regleplacementopposition", "reglepolicecorps", "reglepositionnement", "regleprogrammes", "reglereferencage", "regleregistre", "regleremplitligne", "regleremplitlignesreglees", "regleseparationflottant", "reglesousnumeropage", "reglesup", "reglesynonymes", "regletableaux", "regletabulation", "regletaillepapier", "regletete", "regletetes", "regletexte", "regletextesentete", "regletextesinf", "regletextespdp", "regletextessup", "regletextestexte", "regletolerance", "regletraitsfins", "regletransitionspage", "regletri", "regletype", "regleurl", "remplitligne", "remplitlignesreglees", "remplittexte", "sansespace", "sanslignesenteteetpdp", "sanslignessupetinf", "selectionneblocs", "separeflottant", "settext", "sousnumeropage", "stoppeJScode", "stoppeJSpreamble", "stoppeLUA", "stoppeMP", "stoppeMPclip", "stoppeMPcode", "stoppeMPdefinitions", "stoppeMPdrawing", "stoppeMPenvironment", "stoppeMPextensions", "stoppeMPinclusions", "stoppeMPinitializations", "stoppeMPpage", "stoppeMPpositiongraphic", "stoppeMPpositionmethod", "stoppeMPrun", "stoppePARSEDXML", "stoppeTABLE", "stoppeTABLEbody", "stoppeTABLEfoot", "stoppeTABLEhead", "stoppeTABLEnext", "stoppeTC", "stoppeTD", "stoppeTDs", "stoppeTEX", "stoppeTEXpage", "stoppeTH", "stoppeTN", "stoppeTR", "stoppeTRs", "stoppeTX", "stoppeTY", "stoppeXML", "stoppealign", "stoppealigneadroite", "stoppealigneagauche", "stoppealigneaumilieu", "stoppealignment", "stoppeallmodes", "stoppeappendices", "stoppearrangedpages", "stoppearriereplan", "stoppeaside", "stoppeattachment", "stoppebackmatter", "stoppebar", "stoppebbordermatrix", "stoppebitmapimage", "stoppeblockquote", "stoppebodymatter", "stoppebordermatrix", "stoppeboxedcolumns", "stoppebtxlabeltext", "stoppebtxrenderingdefinitions", "stoppebuffer", "stoppecases", "stoppecatcodetable", "stoppecenteraligned", "stoppechapter", "stoppecharacteralign", "stoppecheckedfences", "stoppechemical", "stoppechemicaltext", "stoppecollect", "stoppecollecting", "stoppecolorintent", "stoppecoloronly", "stoppecolorset", "stoppecolumns", "stoppecolumnset", "stoppecolumnsetspan", "stoppecolumnspan", "stoppecombination", "stoppecomment", "stoppecomposant", "stoppecontextcode", "stoppecontextdefinitioncode", "stoppecouleur", "stoppectxfunction", "stoppectxfunctiondefinition", "stoppecurrentcolor", "stoppecurrentlistentrywrapper", "stoppedelimited", "stoppedelimitedtext", "stoppedisplaymath", "stoppedmath", "stoppedocument", "stoppeeffect", "stoppeelement", "stoppeembeddedxtable", "stoppeendnote", "stoppeendofline", "stoppeenvironement", "stoppeexceptions", "stoppeexpanded", "stoppeexpandedcollect", "stoppeextendedcatcodetable", "stoppeexternalfigurecollection", "stoppefacingfloat", "stoppefact", "stoppefigure", "stoppefiguretext", "stoppefittingpage", "stoppefixed", "stoppefloatcombination", "stoppefont", "stoppefontclass", "stoppefontsolution", "stoppefootnote", "stoppeformula", "stoppeformulas", "stoppeframed", "stoppeframedcell", "stoppeframedcontent", "stoppeframedrow", "stoppeframedtable", "stoppeframedtext", "stoppefrontmatter", "stoppegraphictext", "stoppegridsnapping", "stoppegroupe", "stoppehanging", "stoppehbox", "stoppehboxestohbox", "stoppehboxregister", "stoppeheadtext", "stoppehelptext", "stoppehiding", "stoppehighlight", "stoppehyphenation", "stoppeimath", "stoppeindentation", "stoppeindentedtext", "stoppeinteraction", "stoppeinterface", "stoppeintermezzotext", "stoppeintertext", "stoppeitemgroup", "stoppeitemgroupcolumns", "stoppeitemize", "stoppeknockout", "stoppelabeltext", "stoppelangue", "stoppelayout", "stoppelegend", "stoppeligne", "stoppeligneregleetexte", "stoppelinealignment", "stoppelinecorrection", "stoppelinefiller", "stoppelinenumbering", "stoppelines", "stoppelinetable", "stoppelinetablebody", "stoppelinetablecell", "stoppelinetablehead", "stoppelocalfootnotes", "stoppelocalheadsetup", "stoppelocallinecorrection", "stoppelocalnotes", "stoppelocalsetups", "stoppelua", "stoppeluacode", "stoppeluaparameterset", "stoppeluasetups", "stoppemakeup", "stoppemargereglee", "stoppemarginblock", "stoppemarkedcontent", "stoppemarkpages", "stoppemathalignment", "stoppemathcases", "stoppemathlabeltext", "stoppemathmatrix", "stoppemathmode", "stoppemathstyle", "stoppematrices", "stoppematrix", "stoppemaxaligned", "stoppemdformula", "stoppemenuinteraction", "stoppemiddlealigned", "stoppemiddlemakeup", "stoppemixedcolumns", "stoppemode", "stoppemodeset", "stoppemodule", "stoppemoduletestsection", "stoppempformula", "stoppenamedsection", "stoppenamedsubformulas", "stoppenarrow", "stoppenarrower", "stoppenegative", "stoppenicelyfilledbox", "stoppenointerference", "stoppenotallmodes", "stoppenotext", "stoppenotmode", "stoppeoperatortext", "stoppeopposite", "stoppeoutputstream", "stoppeoverlay", "stoppeoverprint", "stoppepagecolumns", "stoppepagecomment", "stoppepagefigure", "stoppepagelayout", "stoppepagemakeup", "stoppepar", "stoppeparagraph", "stoppeparagraphs", "stoppeparagraphscell", "stoppeparbuilder", "stoppepart", "stoppepath", "stoppeplacechemical", "stoppeplacefigure", "stoppeplaceflottant", "stoppeplaceformule", "stoppeplacegraphic", "stoppeplaceintermezzo", "stoppeplacelegend", "stoppeplacepairedbox", "stoppeplacetable", "stoppepositioning", "stoppepositionoverlay", "stoppepositive", "stoppepostponing", "stoppepostponingnotes", "stoppeprefixtext", "stoppeprocessassignmentcommand", "stoppeprocessassignmentlist", "stoppeprocesscommacommand", "stoppeprocesscommalist", "stoppeproduit", "stoppeprojet", "stoppeprotect", "stoppeprotectedcolors", "stoppepublication", "stoppepunctuation", "stoppequotation", "stoppequote", "stopperandomized", "stopperandomseed", "stopperawsetups", "stoppereadingfile", "stoppereferenceprefix", "stopperegime", "stoppereusableMPgraphic", "stopperuby", "stoppescript", "stoppesdformula", "stoppesection", "stoppesectionblock", "stoppesectionblockenvironment", "stoppesectionlevel", "stoppesetups", "stoppeshapebox", "stoppeshift", "stoppesidebar", "stoppesimplecolumns", "stoppespecialitem", "stoppespeech", "stoppespformula", "stoppesplitformula", "stoppesplittext", "stoppespread", "stoppestandardmakeup", "stoppestaticMPfigure", "stoppestaticMPgraphic", "stoppestrictinspectnextcharacter", "stoppestrut", "stoppestyle", "stoppesubformulas", "stoppesubject", "stoppesubjectlevel", "stoppesubsection", "stoppesubsentence", "stoppesubstack", "stoppesubsubject", "stoppesubsubsection", "stoppesubsubsubject", "stoppesubsubsubsection", "stoppesubsubsubsubject", "stoppesubsubsubsubsection", "stoppesubsubsubsubsubject", "stoppesuffixtext", "stoppesymbolset", "stoppetable", "stoppetablehead", "stoppetables", "stoppetabletail", "stoppetabletext", "stoppetabulate", "stoppetabulatehead", "stoppetabulatetail", "stoppetagged", "stoppetaglabeltext", "stoppetete", "stoppetexcode", "stoppetexdefinition", "stoppetext", "stoppetextbackground", "stoppetextbackgroundmanual", "stoppetextcolor", "stoppetextcolorintent", "stoppetextflow", "stoppetextmakeup", "stoppetitle", "stoppetokenlist", "stoppetokens", "stoppetransparent", "stoppetypescript", "stoppetypescriptcollection", "stoppetyping", "stoppeuniqueMPgraphic", "stoppeuniqueMPpagegraphic", "stoppeunittext", "stoppeunpacked", "stoppeusableMPgraphic", "stoppeuseMPgraphic", "stoppeusemathstyleparameter", "stoppeuserdata", "stoppeusingbtxspecification", "stoppeva", "stoppevbox", "stoppevboxregister", "stoppevboxtohbox", "stoppevboxtohboxseparator", "stoppeviewerlayer", "stoppevtop", "stoppevtopregister", "stoppexcell", "stoppexcellgroup", "stoppexcolumn", "stoppexgroup", "stoppexmldisplayverbatim", "stoppexmlinlineverbatim", "stoppexmlraw", "stoppexmlsetups", "stoppexrow", "stoppexrowgroup", "stoppextable", "stoppextablebody", "stoppextablefoot", "stoppextablehead", "stoppextablenext", "symbole", "tapebuffer", "textenotepdp", "traduire", "traiteblocs", "traitfin", "traitsfins", "uneligne", "utiliseJSscripts", "utiliseURL", "utiliseblocs", "utilisechemin", "utilisedocumentexterne", "utilisefigureexterne", "utilisemodule", "utilisepsiteaudioexterne", "utilisesymboles", "utiliseurl", "va", "vaalaboite", "vaalapage", "vaenbas", "valeurcouleur", "vide" },
- ["it"]={ "GIORNOSETTIMANA", "Lettera", "Lettere", "MESE", "Numeri", "Numeriromani", "PAROLA", "PAROLE", "Parola", "Parole", "adattacampo", "adattalayout", "al", "allineacentro", "allineadestra", "allineasinistra", "ambiente", "ap", "apagina", "barracolori", "barrainterazione", "cambiaafontdeltesto", "campi", "capello", "chim", "circondato", "clonacampo", "colonna", "colore", "coloregrigio", "commento", "componenet", "confrontagruppocolori", "confrontatavolozza", "convertinumero", "copiacampo", "correggispaziobianco", "da", "daqualcheparte", "data", "datadioggi", "definisci", "definisciaccento", "definisciambientefontdeltesto", "definisciblocco", "definiscibloccosezione", "definiscibuffer", "definiscicampo", "definiscicapoversi", "definiscicarattere", "definiscicolore", "definiscicomando", "definisciconversione", "definiscidescrizione", "definiscidimensionicarta", "definiscielenco", "definiscielencocombinato", "definiscienumerazione", "definiscietichetta", "definiscifigurasimbolo", "definiscifont", "definiscifontdeltesto", "definisciformatoriferimento", "definiscigruppocolonne", "definiscigruppocolori", "definiscihbox", "definisciincorniciato", "definisciiniziatermina", "definiscilayout", "definiscimakeup", "definiscimarcatura", "definiscimenuinterazione", "definiscimodellotabella", "definiscioggettomobile", "definisciordinamento", "definisciprofilo", "definisciprogramma", "definisciregistro", "definisciriferimento", "definiscisezione", "definiscisimbolo", "definiscisinonimi", "definiscisinonimofont", "definiscisottocampo", "definiscisovrapposizione", "definiscistackcampi", "definiscistile", "definiscistilefont", "definiscitabulato", "definiscitavolozza", "definiscitesta", "definiscitesto", "definiscitestoincorniciato", "definiscitype", "definiscityping", "determinacaratteristicheregistro", "determinacarattersticheelenco", "determinanumerotesta", "elaborablocchi", "elementi", "elemento", "figuraesterna", "giornosettimana", "griglia", "ignoto", "impostaallineamento", "impostaampiezzariga", "impostabarrainterazione", "impostablocco", "impostabloccosezione", "impostabuffer", "impostacampi", "impostacampo", "impostacapoversi", "impostacaption", "impostacaptions", "impostacima", "impostaclippling", "impostacolonne", "impostacolore", "impostacolori", "impostacommento", "impostacommentopagina", "impostadimensionicarta", "impostaelementi", "impostaelencazioni", "impostaelenco", "impostaelencocombinato", "impostaenumerazioni", "impostafondo", "impostafontdeltesto", "impostaforms", "impostaformule", "impostagruppocolonne", "impostaincorniciato", "impostainiziatermina", "impostainstestazione", "impostainterazione", "impostainterlinea", "impostalayout", "impostalineemargine", "impostalineenere", "impostalineeriempimento", "impostalineesottili", "impostalineetesto", "impostalingua", "impostamaiuscole", "impostamakeup", "impostamarcatura", "impostamenuinterazione", "impostamenzione", "impostanumerazionecapoversi", "impostanumerazionepagina", "impostanumerazionerighe", "impostanumeropagina", "impostanumerosottopagina", "impostanumerotesta", "impostaoggettimobili", "impostaoggettomobile", "impostaordinamento", "impostaparranging", "impostapdp", "impostapiustretto", "impostaposizionamento", "impostaposizionamentoopposti", "impostaprogrammi", "impostaregistro", "impostarientro", "impostariferimento", "impostarighe", "impostarigheriempimento", "impostarigovuoto", "impostarotazione", "impostaschermointerazione", "impostasegnosillabazione", "impostasetsimboli", "impostasfondi", "impostasfondo", "impostasinonimi", "impostaspaziatura", "impostaspaziobianco", "impostaspezzamentooggettomobile", "impostatabelle", "impostatabulato", "impostatavolozza", "impostatesta", "impostateste", "impostatesticima", "impostatestifondo", "impostatestiincorniciati", "impostatestiintestazioni", "impostatestipdp", "impostatesto", "impostatestotesti", "impostatolleranza", "impostatransizionepagina", "impostatype", "impostatyping", "impostaurl", "incorniciato", "iniziaJScode", "iniziaJSpreamble", "iniziaLUA", "iniziaMP", "iniziaMPclip", "iniziaMPcode", "iniziaMPdefinitions", "iniziaMPdrawing", "iniziaMPenvironment", "iniziaMPextensions", "iniziaMPinclusions", "iniziaMPinitializations", "iniziaMPpage", "iniziaMPpositiongraphic", "iniziaMPpositionmethod", "iniziaMPrun", "iniziaPARSEDXML", "iniziaTABLE", "iniziaTABLEbody", "iniziaTABLEfoot", "iniziaTABLEhead", "iniziaTABLEnext", "iniziaTC", "iniziaTD", "iniziaTDs", "iniziaTEX", "iniziaTEXpage", "iniziaTH", "iniziaTN", "iniziaTR", "iniziaTRs", "iniziaTX", "iniziaTY", "iniziaXML", "iniziaalign", "iniziaalignment", "iniziaallineacentro", "iniziaallineadestra", "iniziaallineasinistra", "iniziaallmodes", "iniziaambiente", "iniziaappendices", "iniziaarrangedpages", "iniziaaside", "iniziaattachment", "iniziabackmatter", "iniziabar", "iniziabbordermatrix", "iniziabitmapimage", "iniziablockquote", "iniziabodymatter", "iniziabordermatrix", "iniziaboxedcolumns", "iniziabtxlabeltext", "iniziabtxrenderingdefinitions", "iniziabuffer", "iniziacases", "iniziacatcodetable", "iniziacenteraligned", "iniziachapter", "iniziacharacteralign", "iniziacheckedfences", "iniziachemical", "iniziachemicaltext", "iniziacollect", "iniziacollecting", "iniziacolore", "iniziacolorintent", "iniziacoloronly", "iniziacolorset", "iniziacolumns", "iniziacolumnset", "iniziacolumnsetspan", "iniziacolumnspan", "iniziacombination", "iniziacomment", "iniziacomponenet", "iniziacontextcode", "iniziacontextdefinitioncode", "iniziactxfunction", "iniziactxfunctiondefinition", "iniziacurrentcolor", "iniziacurrentlistentrywrapper", "iniziadelimited", "iniziadelimitedtext", "iniziadisplaymath", "iniziadmath", "iniziadocument", "iniziaeffect", "iniziaelement", "iniziaelemento", "iniziaembeddedxtable", "iniziaendnote", "iniziaendofline", "iniziaexceptions", "iniziaexpanded", "iniziaexpandedcollect", "iniziaextendedcatcodetable", "iniziaexternalfigurecollection", "iniziafacingfloat", "iniziafact", "iniziafigure", "iniziafiguretext", "iniziafittingpage", "iniziafixed", "iniziafloatcombination", "iniziafont", "iniziafontclass", "iniziafontsolution", "iniziafootnote", "iniziaformula", "iniziaformulas", "iniziaframedcell", "iniziaframedcontent", "iniziaframedrow", "iniziaframedtable", "iniziaframedtext", "iniziafrontmatter", "iniziagraphictext", "iniziagridsnapping", "iniziahanging", "iniziahbox", "iniziahboxestohbox", "iniziahboxregister", "iniziaheadtext", "iniziahelptext", "iniziahiding", "iniziahighlight", "iniziahyphenation", "iniziaimath", "iniziaimpaccato", "iniziaincorniciato", "iniziaindentation", "iniziaindentedtext", "iniziainteraction", "iniziainterface", "iniziaintermezzotext", "iniziaintertext", "iniziaitemgroup", "iniziaitemgroupcolumns", "iniziaitemize", "iniziaknockout", "inizialabeltext", "inizialayout", "inizialegend", "inizialinealignment", "inizialineamargine", "inizialineatesto", "inizialinecorrection", "inizialinefiller", "inizialinenumbering", "inizialines", "inizialinetable", "inizialinetablebody", "inizialinetablecell", "inizialinetablehead", "inizialingua", "inizialocalfootnotes", "inizialocalheadsetup", "inizialocallinecorrection", "inizialocalnotes", "inizialocalsetups", "inizialua", "inizialuacode", "inizialuaparameterset", "inizialuasetups", "iniziamakeup", "iniziamarginblock", "iniziamarkedcontent", "iniziamarkpages", "iniziamathalignment", "iniziamathcases", "iniziamathlabeltext", "iniziamathmatrix", "iniziamathmode", "iniziamathstyle", "iniziamatrices", "iniziamatrix", "iniziamaxaligned", "iniziamdformula", "iniziamenuinterattivo", "iniziamettiformula", "iniziamiddlealigned", "iniziamiddlemakeup", "iniziamixedcolumns", "iniziamode", "iniziamodeset", "iniziamodule", "iniziamoduletestsection", "iniziampformula", "inizianamedsection", "inizianamedsubformulas", "inizianarrow", "inizianarrower", "inizianegative", "inizianicelyfilledbox", "inizianointerference", "inizianotallmodes", "inizianotext", "inizianotmode", "iniziaoperatortext", "iniziaopposite", "iniziaoutputstream", "iniziaoverlay", "iniziaoverprint", "iniziapagecolumns", "iniziapagecomment", "iniziapagefigure", "iniziapagelayout", "iniziapagemakeup", "iniziapar", "iniziaparagraph", "iniziaparagraphs", "iniziaparagraphscell", "iniziaparbuilder", "iniziapart", "iniziapath", "iniziaplacechemical", "iniziaplacefigure", "iniziaplacefloat", "iniziaplacegraphic", "iniziaplaceintermezzo", "iniziaplacelegend", "iniziaplacepairedbox", "iniziaplacetable", "iniziapositioning", "iniziapositionoverlay", "iniziapositive", "iniziapostponing", "iniziapostponingnotes", "iniziaprefixtext", "iniziaprocessassignmentcommand", "iniziaprocessassignmentlist", "iniziaprocesscommacommand", "iniziaprocesscommalist", "iniziaprodotto", "iniziaprogetto", "iniziaprotect", "iniziaprotectedcolors", "iniziapubblicazione", "iniziapunctuation", "iniziaquotation", "iniziaquote", "iniziarandomized", "iniziarandomseed", "iniziarawsetups", "iniziareadingfile", "iniziareferenceprefix", "iniziaregime", "iniziareusableMPgraphic", "iniziariga", "iniziaruby", "iniziascript", "iniziasdformula", "iniziasection", "iniziasectionblock", "iniziasectionblockenvironment", "iniziasectionlevel", "iniziasetups", "iniziasfondo", "iniziashapebox", "iniziashift", "iniziasidebar", "iniziasimplecolumns", "iniziaspecialitem", "iniziaspeech", "iniziaspformula", "iniziasplitformula", "iniziasplittext", "iniziaspread", "iniziastandardmakeup", "iniziastaticMPfigure", "iniziastaticMPgraphic", "iniziastrictinspectnextcharacter", "iniziastrut", "iniziastyle", "iniziasubformulas", "iniziasubject", "iniziasubjectlevel", "iniziasubsection", "iniziasubsentence", "iniziasubstack", "iniziasubsubject", "iniziasubsubsection", "iniziasubsubsubject", "iniziasubsubsubsection", "iniziasubsubsubsubject", "iniziasubsubsubsubsection", "iniziasubsubsubsubsubject", "iniziasuffixtext", "iniziasymbolset", "iniziatable", "iniziatablehead", "iniziatables", "iniziatabletail", "iniziatabletext", "iniziatabulate", "iniziatabulatehead", "iniziatabulatetail", "iniziatagged", "iniziataglabeltext", "iniziatesta", "iniziatexcode", "iniziatexdefinition", "iniziatext", "iniziatextbackground", "iniziatextbackgroundmanual", "iniziatextcolor", "iniziatextcolorintent", "iniziatextflow", "iniziatextmakeup", "iniziatitle", "iniziatokenlist", "iniziatokens", "iniziatransparent", "iniziatypescript", "iniziatypescriptcollection", "iniziatyping", "iniziauniqueMPgraphic", "iniziauniqueMPpagegraphic", "iniziaunittext", "iniziaunpacked", "iniziausableMPgraphic", "iniziauseMPgraphic", "iniziausemathstyleparameter", "iniziauserdata", "iniziausingbtxspecification", "iniziavaia", "iniziavbox", "iniziavboxregister", "iniziavboxtohbox", "iniziavboxtohboxseparator", "iniziaviewerlayer", "iniziavtop", "iniziavtopregister", "iniziaxcell", "iniziaxcellgroup", "iniziaxcolumn", "iniziaxgroup", "iniziaxmldisplayverbatim", "iniziaxmlinlineverbatim", "iniziaxmlraw", "iniziaxmlsetups", "iniziaxrow", "iniziaxrowgroup", "iniziaxtable", "iniziaxtablebody", "iniziaxtablefoot", "iniziaxtablehead", "iniziaxtablenext", "inriga", "installalingua", "intorno", "lettera", "lettere", "lineanera", "lineasottile", "lineatesto", "lineenere", "lineeriempimento", "lineesottili", "lingua", "linguaprincipale", "lunghezzaelenco", "marcatura", "matematica", "menuinterattivo", "mese", "mettielenco", "mettielencocombinato", "mettifiancoafianco", "mettiformula", "mettiingriglia", "mettinotepdp", "mettinotepdplocali", "mettinumeropagina", "mettiregistro", "mettisegnalibro", "mettisottoformula", "mettiunosullaltro", "mostraambientefontdeltesto", "mostracolore", "mostracornice", "mostrafontdeltesto", "mostragriglia", "mostragruppocolori", "mostraimpostazioni", "mostralyout", "mostramakeup", "mostrasetsimboli", "mostrastampa", "mostrastruts", "mostratavolozza", "nascondiblocchi", "nientelineecimafondo", "nientelineintestazionepdp", "nientespazio", "nota", "numeri", "numeriromani", "numeroformula", "numeropagina", "numeropaginacompleto", "numerotesta", "numerotestacorrente", "pagina", "paroladestra", "ped", "pedap", "perlungo", "posizionanumerotesta", "posizionatestotesta", "posizione", "prendibuffer", "prendimarcatura", "prodotto", "progetto", "programma", "pulsante", "pulsantemenu", "pulsantinterazione", "punti", "qualcheriga", "reimpostamarcatura", "rif", "riferimento", "riferimentopagina", "riferimentotesto", "riflessione", "rigariempimento", "rigovuoto", "ruota", "scala", "schermo", "scrividentroelenco", "scriviinelenco", "segnalibro", "selezionablocchi", "settext", "sfondo", "simbolo", "spazifissi", "spazio", "spaziofisso", "spessoreriga", "spezzaoggettomobile", "stackcampi", "stirato", "terminaJScode", "terminaJSpreamble", "terminaLUA", "terminaMP", "terminaMPclip", "terminaMPcode", "terminaMPdefinitions", "terminaMPdrawing", "terminaMPenvironment", "terminaMPextensions", "terminaMPinclusions", "terminaMPinitializations", "terminaMPpage", "terminaMPpositiongraphic", "terminaMPpositionmethod", "terminaMPrun", "terminaPARSEDXML", "terminaTABLE", "terminaTABLEbody", "terminaTABLEfoot", "terminaTABLEhead", "terminaTABLEnext", "terminaTC", "terminaTD", "terminaTDs", "terminaTEX", "terminaTEXpage", "terminaTH", "terminaTN", "terminaTR", "terminaTRs", "terminaTX", "terminaTY", "terminaXML", "terminaalign", "terminaalignment", "terminaallineacentro", "terminaallineadestra", "terminaallineasinistra", "terminaallmodes", "terminaambiente", "terminaappendices", "terminaarrangedpages", "terminaaside", "terminaattachment", "terminabackmatter", "terminabar", "terminabbordermatrix", "terminabitmapimage", "terminablockquote", "terminabodymatter", "terminabordermatrix", "terminaboxedcolumns", "terminabtxlabeltext", "terminabtxrenderingdefinitions", "terminabuffer", "terminacases", "terminacatcodetable", "terminacenteraligned", "terminachapter", "terminacharacteralign", "terminacheckedfences", "terminachemical", "terminachemicaltext", "terminacollect", "terminacollecting", "terminacolore", "terminacolorintent", "terminacoloronly", "terminacolorset", "terminacolumns", "terminacolumnset", "terminacolumnsetspan", "terminacolumnspan", "terminacombination", "terminacomment", "terminacomponenet", "terminacontextcode", "terminacontextdefinitioncode", "terminactxfunction", "terminactxfunctiondefinition", "terminacurrentcolor", "terminacurrentlistentrywrapper", "terminadelimited", "terminadelimitedtext", "terminadisplaymath", "terminadmath", "terminadocument", "terminaeffect", "terminaelement", "terminaelemento", "terminaembeddedxtable", "terminaendnote", "terminaendofline", "terminaexceptions", "terminaexpanded", "terminaexpandedcollect", "terminaextendedcatcodetable", "terminaexternalfigurecollection", "terminafacingfloat", "terminafact", "terminafigure", "terminafiguretext", "terminafittingpage", "terminafixed", "terminafloatcombination", "terminafont", "terminafontclass", "terminafontsolution", "terminafootnote", "terminaformula", "terminaformulas", "terminaframedcell", "terminaframedcontent", "terminaframedrow", "terminaframedtable", "terminaframedtext", "terminafrontmatter", "terminagraphictext", "terminagridsnapping", "terminahanging", "terminahbox", "terminahboxestohbox", "terminahboxregister", "terminaheadtext", "terminahelptext", "terminahiding", "terminahighlight", "terminahyphenation", "terminaimath", "terminaimpaccato", "terminaincorniciato", "terminaindentation", "terminaindentedtext", "terminainteraction", "terminainterface", "terminaintermezzotext", "terminaintertext", "terminaitemgroup", "terminaitemgroupcolumns", "terminaitemize", "terminaknockout", "terminalabeltext", "terminalayout", "terminalegend", "terminalinealignment", "terminalineamargine", "terminalineatesto", "terminalinecorrection", "terminalinefiller", "terminalinenumbering", "terminalines", "terminalinetable", "terminalinetablebody", "terminalinetablecell", "terminalinetablehead", "terminalingua", "terminalocalfootnotes", "terminalocalheadsetup", "terminalocallinecorrection", "terminalocalnotes", "terminalocalsetups", "terminalua", "terminaluacode", "terminaluaparameterset", "terminaluasetups", "terminamakeup", "terminamarginblock", "terminamarkedcontent", "terminamarkpages", "terminamathalignment", "terminamathcases", "terminamathlabeltext", "terminamathmatrix", "terminamathmode", "terminamathstyle", "terminamatrices", "terminamatrix", "terminamaxaligned", "terminamdformula", "terminamenuinterattivo", "terminamettiformula", "terminamiddlealigned", "terminamiddlemakeup", "terminamixedcolumns", "terminamode", "terminamodeset", "terminamodule", "terminamoduletestsection", "terminampformula", "terminanamedsection", "terminanamedsubformulas", "terminanarrow", "terminanarrower", "terminanegative", "terminanicelyfilledbox", "terminanointerference", "terminanotallmodes", "terminanotext", "terminanotmode", "terminaoperatortext", "terminaopposite", "terminaoutputstream", "terminaoverlay", "terminaoverprint", "terminapagecolumns", "terminapagecomment", "terminapagefigure", "terminapagelayout", "terminapagemakeup", "terminapar", "terminaparagraph", "terminaparagraphs", "terminaparagraphscell", "terminaparbuilder", "terminapart", "terminapath", "terminaplacechemical", "terminaplacefigure", "terminaplacefloat", "terminaplacegraphic", "terminaplaceintermezzo", "terminaplacelegend", "terminaplacepairedbox", "terminaplacetable", "terminapositioning", "terminapositionoverlay", "terminapositive", "terminapostponing", "terminapostponingnotes", "terminaprefixtext", "terminaprocessassignmentcommand", "terminaprocessassignmentlist", "terminaprocesscommacommand", "terminaprocesscommalist", "terminaprodotto", "terminaprogetto", "terminaprotect", "terminaprotectedcolors", "terminapubblicazione", "terminapunctuation", "terminaquotation", "terminaquote", "terminarandomized", "terminarandomseed", "terminarawsetups", "terminareadingfile", "terminareferenceprefix", "terminaregime", "terminareusableMPgraphic", "terminariga", "terminaruby", "terminascript", "terminasdformula", "terminasection", "terminasectionblock", "terminasectionblockenvironment", "terminasectionlevel", "terminasetups", "terminasfondo", "terminashapebox", "terminashift", "terminasidebar", "terminasimplecolumns", "terminaspecialitem", "terminaspeech", "terminaspformula", "terminasplitformula", "terminasplittext", "terminaspread", "terminastandardmakeup", "terminastaticMPfigure", "terminastaticMPgraphic", "terminastrictinspectnextcharacter", "terminastrut", "terminastyle", "terminasubformulas", "terminasubject", "terminasubjectlevel", "terminasubsection", "terminasubsentence", "terminasubstack", "terminasubsubject", "terminasubsubsection", "terminasubsubsubject", "terminasubsubsubsection", "terminasubsubsubsubject", "terminasubsubsubsubsection", "terminasubsubsubsubsubject", "terminasuffixtext", "terminasymbolset", "terminatable", "terminatablehead", "terminatables", "terminatabletail", "terminatabletext", "terminatabulate", "terminatabulatehead", "terminatabulatetail", "terminatagged", "terminataglabeltext", "terminatesta", "terminatexcode", "terminatexdefinition", "terminatext", "terminatextbackground", "terminatextbackgroundmanual", "terminatextcolor", "terminatextcolorintent", "terminatextflow", "terminatextmakeup", "terminatitle", "terminatokenlist", "terminatokens", "terminatransparent", "terminatypescript", "terminatypescriptcollection", "terminatyping", "terminauniqueMPgraphic", "terminauniqueMPpagegraphic", "terminaunittext", "terminaunpacked", "terminausableMPgraphic", "terminauseMPgraphic", "terminausemathstyleparameter", "terminauserdata", "terminausingbtxspecification", "terminavaia", "terminavbox", "terminavboxregister", "terminavboxtohbox", "terminavboxtohboxseparator", "terminaviewerlayer", "terminavtop", "terminavtopregister", "terminaxcell", "terminaxcellgroup", "terminaxcolumn", "terminaxgroup", "terminaxmldisplayverbatim", "terminaxmlinlineverbatim", "terminaxmlraw", "terminaxmlsetups", "terminaxrow", "terminaxrowgroup", "terminaxtable", "terminaxtablebody", "terminaxtablefoot", "terminaxtablehead", "terminaxtablenext", "testonotapdp", "testoriempimento", "tieniblocchi", "traduci", "usaJSscripts", "usaURL", "usablocco", "usacartella", "usacolonnasonoraesterna", "usadocumentoesterno", "usafiguraesterna", "usamodulo", "usasimboli", "usaurl", "vaia", "vaiabox", "vaiapagina", "vaigiu", "valorecolore", "versione" },
- ["nl"]={ "Cijfers", "Kap", "Letter", "Letters", "MAAND", "Romeins", "WEEKDAG", "WOORD", "WOORDEN", "Woord", "Woorden", "achtergrond", "bepaalkopnummer", "bepaallijstkenmerken", "bepaalregisterkenmerken", "bewaarbuffer", "blanko", "blokje", "blokjes", "cijfers", "converteernummer", "copieerveld", "corrigeerwitruimte", "datum", "definieer", "definieeraccent", "definieeralineas", "definieerblok", "definieerbuffer", "definieercombinatie", "definieercommando", "definieerconversie", "definieerfiguursymbool", "definieerfont", "definieerfontstijl", "definieerfontsynoniem", "definieerhbox", "definieeringesprongentext", "definieerinteractiemenu", "definieeritemgroep", "definieerkadertekst", "definieerkarakter", "definieerkleur", "definieerkleurgroep", "definieerkolomgroep", "definieerkolomovergang", "definieerkop", "definieerkorps", "definieerkorpsomgeving", "definieerlayer", "definieerlayout", "definieerletter", "definieerlijst", "definieermarkering", "definieeromlijnd", "definieeropmaak", "definieeroverlay", "definieerpaginaovergang", "definieerpalet", "definieerpapierformaat", "definieerplaats", "definieerplaatsblok", "definieerprofiel", "definieerprogramma", "definieerreferentie", "definieerreferentieformaat", "definieerregister", "definieersamengesteldelijst", "definieersectie", "definieersectieblok", "definieersorteren", "definieerstartstop", "definieersubveld", "definieersymbool", "definieersynoniemen", "definieertabelvorm", "definieertabulatie", "definieertekst", "definieertekstachtergrond", "definieertype", "definieertypen", "definieerveld", "definieerveldstapel", "definieerwiskundeuitlijnen", "doordefinieren", "doorlabelen", "doornummeren", "dunnelijn", "dunnelijnen", "eenregel", "ergens", "externfiguur", "formulenummer", "gebruikJSscripts", "gebruikURL", "gebruikblokken", "gebruikexterndocument", "gebruikexternfiguur", "gebruikexterngeluidsfragment", "gebruikmodule", "gebruikpad", "gebruiksymbolen", "gebruiktypescript", "gebruiktypescriptfile", "gebruikurl", "geenbovenenonderregels", "geenhoofdenvoetregels", "geenspatie", "grijskleur", "haalbuffer", "haalmarkering", "haarlijn", "handhaafblokken", "hoofdtaal", "hoog", "huidigedatum", "huidigekopnummer", "inlijnd", "inregel", "installeertaal", "interactiebalk", "interactiebuttons", "interactiemenu", "invullijnen", "invulregel", "invultekst", "kleur", "kleurenbalk", "kleurwaarde", "kloonveld", "kolom", "kopnummer", "laag", "laho", "legeregels", "letter", "letters", "lijndikte", "lijstlengte", "maand", "markeer", "naar", "naarbox", "naarpagina", "nokap", "noot", "omgeving", "omlaag", "omlijnd", "onbekend", "onderdeel", "op", "oppagina", "pagina", "paginanummer", "paginareferentie", "paslayoutaan", "passendveld", "plaatsbookmarks", "plaatsformule", "plaatskopnummer", "plaatskoptekst", "plaatslijst", "plaatslijstmetsynoniemen", "plaatslokalevoetnoten", "plaatsnaastelkaar", "plaatsonderelkaar", "plaatsopgrid", "plaatspaginanummer", "plaatsplaatsblok", "plaatsregister", "plaatsruwelijst", "plaatssamengesteldelijst", "plaatssubformule", "plaatsvoetnoten", "positioneer", "produkt", "programma", "projekt", "punten", "refereer", "referentie", "regellinks", "regelmidden", "regelrechts", "resetmarkering", "romeins", "rooster", "roteer", "schaal", "scherm", "schrijfnaarlijst", "schrijftussenlijst", "selecteerblokken", "som", "spatie", "spiegel", "splitsplaatsblok", "startachtergrond", "startinteractiemenu", "startkantlijn", "startkleur", "startkop", "startlokalevoetnoten", "startmargeblok", "startnaar", "startomgeving", "startomlijnd", "startonderdeel", "startopelkaar", "startplaatsformule", "startplaatsplaatsblok", "startprodukt", "startprojekt", "startpublicatie", "startregel", "startregelcorrectie", "startregellinks", "startregelmidden", "startregelrechts", "startsom", "starttaal", "starttekstachtergrond", "starttekstlijn", "startuitlijnen", "stelachtergrondenin", "stelachtergrondin", "stelalineasin", "stelarrangerenin", "stelblankoin", "stelblokin", "stelblokjesin", "stelblokkopjein", "stelblokkopjesin", "stelbovenin", "stelboventekstenin", "stelbufferin", "stelciterenin", "stelclipin", "stelcommentaarin", "steldoordefinierenin", "steldoornummerenin", "steldunnelijnenin", "stelformulein", "stelformulesin", "stelformulierenin", "stelhoofdin", "stelhoofdtekstenin", "stelingesprongentextin", "stelinmargein", "stelinspringenin", "stelinteractiebalkin", "stelinteractiein", "stelinteractiemenuin", "stelinteractieschermin", "stelinterliniein", "stelinvullijnenin", "stelinvulregelsin", "stelitemgroepin", "stelitemsin", "stelkadertekstenin", "stelkadertekstin", "stelkantlijnin", "stelkapitalenin", "stelkleurenin", "stelkleurin", "stelkolomgroepin", "stelkolomgroepregelsin", "stelkolomgroepstartin", "stelkolommenin", "stelkopin", "stelkopnummerin", "stelkoppeltekenin", "stelkoppenin", "stelkorpsin", "stellayoutin", "stellijndiktein", "stellijstin", "stelmargeblokkenin", "stelmarkeringin", "stelnaastplaatsenin", "stelomlijndin", "stelonderin", "stelondertekstenin", "stelopmaakin", "stelopsommingenin", "stelpaginacommentaarin", "stelpaginanummerin", "stelpaginanummeringin", "stelpaginaovergangenin", "stelpaletin", "stelpapierformaatin", "stelpapierin", "stelparagraafnummerenin", "stelplaatsblokin", "stelplaatsblokkenin", "stelplaatsbloksplitsenin", "stelplaatsin", "stelpositionerenin", "stelprogrammasin", "stelrefererenin", "stelregelnummerenin", "stelregelsin", "stelregisterin", "stelroterenin", "stelsamengesteldelijstin", "stelsectieblokin", "stelsmallerin", "stelsorterenin", "stelspatieringin", "stelstartstopin", "stelsubpaginanummerin", "stelsymboolsetin", "stelsynoniemenin", "steltaalin", "steltabellenin", "steltabulatiein", "steltekstachtergrondin", "steltekstin", "steltekstinhoudin", "steltekstlijnenin", "stelteksttekstenin", "steltolerantiein", "steltypein", "steltypenin", "steluitlijnenin", "stelurlin", "stelveldenin", "stelveldin", "stelvoetin", "stelvoettekstenin", "stelwiskundeuitlijnenin", "stelwitruimtein", "stopachtergrond", "stopinteractiemenu", "stopkantlijn", "stopkleur", "stopkop", "stoplokalevoetnoten", "stopmargeblok", "stopnaar", "stopomgeving", "stopomlijnd", "stoponderdeel", "stopopelkaar", "stopplaatsformule", "stopplaatsplaatsblok", "stopprodukt", "stopprojekt", "stoppublicatie", "stopregel", "stopregelcorrectie", "stopregellinks", "stopregelmidden", "stopregelrechts", "stopsom", "stoptaal", "stoptekstachtergrond", "stoptekstlijn", "stopuitlijnen", "subpaginanummer", "switchnaarkorps", "symbool", "taal", "tekstlijn", "tekstreferentie", "testkolom", "testpagina", "toelichting", "toongrid", "tooninstellingen", "toonkader", "toonkleur", "toonkleurgroep", "toonkorps", "toonkorpsomgeving", "toonlayout", "toonopmaak", "toonpalet", "toonprint", "toonstruts", "toonsymboolset", "uit", "uitgerekt", "vastespatie", "vastespaties", "veld", "veldstapel", "verbergblokken", "vergelijkkleurgroep", "vergelijkpalet", "versie", "vertaal", "verwerkblokken", "voetnoottekst", "volledigepaginanummer", "volledigregister", "voluit", "weekdag", "wiskunde", "woordrechts" },
- ["pe"]={ "آیتم", "آیتمها", "آینه", "از", "استÙاده‌بلوکها", "استÙاده‌دستخط‌تایپ", "استÙاده‌شکل‌خارجی", "استÙاده‌قطعه‌موزیک‌خارجی", "استÙاده‌مدول", "استÙاده‌مسیر", "استÙاده‌نمادها", "استÙاده‌نوشتارخارجی", "استÙاده‌پرونده‌دستخط‌تایپ", "اعدادلاتین", "اÙزودن", "انتخاب‌بلوکها", "بارگذاری‌آرایش", "بارگذاری‌آیتمها", "بارگذاری‌ارجاع", "بارگذاری‌اندازه‌برگ", "بارگذاری‌باریکتر", "بارگذاری‌باÙر", "بارگذاری‌بالا", "بارگذاری‌بردباری", "بارگذاری‌برنامه‌ها", "بارگذاری‌برگ", "بارگذاری‌بلوک", "بارگذاری‌بلوک‌بخش", "بارگذاری‌تایپ", "بارگذاری‌تایپ‌کردن", "بارگذاری‌ترتیب", "بارگذاری‌تنظیم", "بارگذاری‌تنظیم‌ریاضی", "بارگذاری‌ته‌برگ", "بارگذاری‌تورÙتگی", "بارگذاری‌توضیح", "بارگذاری‌توضیح‌صÙحه", "بارگذاری‌ثبت", "بارگذاری‌جانشانی", "بارگذاری‌جدولها", "بارگذاری‌جدول‌بندی", "بارگذاری‌خالی", "بارگذاری‌خطها", "بارگذاری‌خطهای‌حاشیه", "بارگذاری‌خطهای‌سیاه", "بارگذاری‌خطهای‌متن", "بارگذاری‌خطهای‌مجموعه‌ستون", "بارگذاری‌خطها‌ی‌نازک", "بارگذاری‌درج‌درخطها", "بارگذاری‌درج‌مخالÙ", "بارگذاری‌دوران", "بارگذاری‌رنگ", "بارگذاری‌رنگها", "بارگذاری‌زبان", "بارگذاری‌ستونها", "بارگذاری‌سر", "بارگذاری‌سربرگ", "بارگذاری‌سرها", "بارگذاری‌شرح", "بارگذاری‌شرحها", "بارگذاری‌شروع‌مجموعه‌ستون", "بارگذاری‌شروع‌پایان", "بارگذاری‌شماره‌زیرصÙحه", "بارگذاری‌شماره‌سر", "بارگذاری‌شماره‌صÙحه", "بارگذاری‌شماره‌گذاریها", "بارگذاری‌شماره‌گذاری‌صÙحه", "بارگذاری‌شماره‌گذاری‌پاراگراÙ", "بارگذاری‌شماره‌‌گذاری‌خط", "بارگذاری‌شناور", "بارگذاری‌شناورها", "بارگذاری‌شکاÙتن‌شناورها", "بارگذاری‌طرح", "بارگذاری‌طرح‌بندی", "بارگذاری‌عرض‌خط", "بارگذاری‌Ùاصله‌بین‌خط", "بارگذاری‌Ùرمولها", "بارگذاری‌Ùضای‌سÙید", "بارگذاری‌Ùضا‌گذاری", "بارگذاری‌قالبی", "بارگذاری‌قلم‌متن", "بارگذاری‌لوح", "بارگذاری‌لیست", "بارگذاری‌لیست‌ترکیبی", "بارگذاری‌مترادÙها", "بارگذاری‌متن", "بارگذاری‌متنهای‌بالا", "بارگذاری‌متن‌سربرگ", "بارگذاری‌متن‌قالبی", "بارگذاری‌متن‌متنها", "بارگذاری‌متن‌پانوشت", "بارگذاری‌متن‌پایین", "بارگذاری‌مجموعه‌ستون", "بارگذاری‌مجموعه‌نماد", "بارگذاری‌منوی‌پانل", "بارگذاری‌مکان‌گذاری", "بارگذاری‌میدان", "بارگذاری‌میدانها", "بارگذاری‌میله‌پانل", "بارگذاری‌نشانه‌شکستن", "بارگذاری‌نشانه‌گذاری", "بارگذاری‌نقل", "بارگذاری‌پاراگراÙها", "بارگذاری‌پانل", "بارگذاری‌پایین", "بارگذاری‌پرده‌پانل", "بارگذاری‌پرکردن‌خطها", "بارگذاری‌پس‌زمینه", "بارگذاری‌پس‌زمینه‌ها", "بارگذاری‌چیدن", "بارگذاری‌گذارصÙحه", "بارگذاری‌گروههای‌آیتم", "بارگذاری‌گروه‌آیتم", "بازنشانی‌نشانه‌گذاری", "بدون‌خط‌بالاوپایین", "بدون‌خط‌سروته‌برگ", "بدون‌Ùضا", "برنامه", "بروبه", "بروبه‌جعبه", "بروبه‌صÙحه", "بروپایین", "بلند", "بلوکهای‌پردازش", "بلوکها‌پنهان", "بنویس‌بین‌لیست", "بنویس‌در‌لیست", "تاریخ", "تاریخ‌جاری", "تایپ", "تایپ‌باÙر", "تایپ‌پرونده", "ترجمه", "تعریÙ", "تعریÙ‌آرایش", "تعریÙ‌الگوی‌جدول", "تعریÙ‌اندازه‌برگ", "تعریÙ‌باÙر", "تعریÙ‌بخش", "تعریÙ‌برنامه", "تعریÙ‌برچسب", "تعریÙ‌بلوک", "تعریÙ‌بلوک‌بخش", "تعریÙ‌تایپ", "تعریÙ‌تایپ‌کردن", "تعریÙ‌تبدیل", "تعریÙ‌ترتیب", "تعریÙ‌ترکیب", "تعریÙ‌تنظیم‌ریاضی", "تعریÙ‌توده‌میدان", "تعریÙ‌ثبت", "تعریÙ‌جانشانی", "تعریÙ‌جدول‌بندی", "تعریÙ‌جعبه‌‌اÙÙ‚ÛŒ", "تعریÙ‌حرÙ", "تعریÙ‌رنگ", "تعریÙ‌زیرمیدان", "تعریÙ‌سبک", "تعریÙ‌سبک‌قلم", "تعریÙ‌سر", "تعریÙ‌شرح", "تعریÙ‌شروع‌پایان", "تعریÙ‌شماره‌بندی", "تعریÙ‌شمایل‌مرجع", "تعریÙ‌شناور", "تعریÙ‌شکستن‌ستون", "تعریÙ‌شکست‌صÙحه", "تعریÙ‌طرح‌بندی", "تعریÙ‌Ùرمان", "تعریÙ‌قالبی", "تعریÙ‌قلم", "تعریÙ‌قلم‌متن", "تعریÙ‌لایه", "تعریÙ‌لهجه", "تعریÙ‌لوح", "تعریÙ‌لیست", "تعریÙ‌لیست‌ترکیبی", "تعریÙ‌مترادÙها", "تعریÙ‌مترادÙ‌قلم", "تعریÙ‌متن", "تعریÙ‌متن‌قالبی", "تعریÙ‌مجموعه‌ستون", "تعریÙ‌محیط‌قلم‌بدنه", "تعریÙ‌مرجع", "تعریÙ‌منوی‌پانل", "تعریÙ‌میدان", "تعریÙ‌نشانه‌گذاری", "تعریÙ‌نماد", "تعریÙ‌نمادشکل", "تعریÙ‌پاراگراÙها", "تعریÙ‌پروÙایل", "تعریÙ‌پوشش", "تعریÙ‌گروه‌آیتم", "تعریÙ‌گروه‌رنگ", "تعیین‌شماره‌سر", "تعیین‌محتوای‌متن", "تعیین‌مشخصات‌ثبت", "تعیین‌مشخصات‌لیست", "تغییربه‌قلم‌بدنه", "تنظیم‌راست", "تنظیم‌طرح‌بندی", "تنظیم‌وسط", "توجه", "توری", "تولید", "تک", "ثبت‌کامل", "حرÙ", "حرÙها", "Ø­Ùظ‌بلوکها", "خالی", "خطهای‌سیاه", "خطهای‌نازک", "خطها‌خالی", "خط‌سیاه", "خط‌متن", "خط‌مو", "خط‌نازک", "خ‌ا", "خ‌ع", "در", "درج‌ثبت", "درج‌درخط", "درج‌درخطها", "درج‌درمتن", "درج‌در‌بالای‌یکدیگر", "درج‌در‌توری", "درج‌زیرÙرمول", "درج‌شماره‌سر", "درج‌شماره‌صÙحه", "درج‌شناور", "درج‌Ùرمول", "درج‌لیست", "درج‌لیست‌خام", "درج‌لیست‌مختلط", "درج‌متن‌سر", "درج‌پانوشتها", "درج‌پانوشتهای‌موضعی", "درج‌چوب‌خط", "درج‌کنار‌به‌کنار", "درخط", "درصÙحه", "درقالبی", "درمورد", "درون", "درپر", "دریاÙت‌باÙر", "دریاÙت‌نشانه", "دوران", "دکمه", "دکمه‌منو", "دکمه‌پانل", "رج", "رنگ", "رنگ‌خاکستری", "روزهÙته", "ریاضی", "زبان", "زبان‌اصلی", "ستون", "ستون‌امتحان", "سرپوش‌کوچک‌نه", "شروعJScode", "شروعJSpreamble", "شروعLUA", "شروعMP", "شروعMPclip", "شروعMPcode", "شروعMPdefinitions", "شروعMPdrawing", "شروعMPenvironment", "شروعMPextensions", "شروعMPinclusions", "شروعMPinitializations", "شروعMPpage", "شروعMPpositiongraphic", "شروعMPpositionmethod", "شروعMPrun", "شروعPARSEDXML", "شروعTABLE", "شروعTABLEbody", "شروعTABLEfoot", "شروعTABLEhead", "شروعTABLEnext", "شروعTC", "شروعTD", "شروعTDs", "شروعTEX", "شروعTEXpage", "شروعTH", "شروعTN", "شروعTR", "شروعTRs", "شروعTX", "شروعTY", "شروعXML", "شروعalign", "شروعalignment", "شروعallmodes", "شروعappendices", "شروعarrangedpages", "شروعaside", "شروعattachment", "شروعbackmatter", "شروعbar", "شروعbbordermatrix", "شروعbitmapimage", "شروعblockquote", "شروعbodymatter", "شروعbordermatrix", "شروعboxedcolumns", "شروعbtxlabeltext", "شروعbtxrenderingdefinitions", "شروعbuffer", "شروعcases", "شروعcatcodetable", "شروعcenteraligned", "شروعchapter", "شروعcharacteralign", "شروعcheckedfences", "شروعchemical", "شروعchemicaltext", "شروعcollect", "شروعcollecting", "شروعcolorintent", "شروعcoloronly", "شروعcolorset", "شروعcolumns", "شروعcolumnset", "شروعcolumnsetspan", "شروعcolumnspan", "شروعcombination", "شروعcomment", "شروعcontextcode", "شروعcontextdefinitioncode", "شروعctxfunction", "شروعctxfunctiondefinition", "شروعcurrentcolor", "شروعcurrentlistentrywrapper", "شروعdelimited", "شروعdelimitedtext", "شروعdisplaymath", "شروعdmath", "شروعdocument", "شروعeffect", "شروعelement", "شروعembeddedxtable", "شروعendnote", "شروعendofline", "شروعexceptions", "شروعexpanded", "شروعexpandedcollect", "شروعextendedcatcodetable", "شروعexternalfigurecollection", "شروعfacingfloat", "شروعfact", "شروعfigure", "شروعfiguretext", "شروعfittingpage", "شروعfixed", "شروعfloatcombination", "شروعfont", "شروعfontclass", "شروعfontsolution", "شروعfootnote", "شروعformula", "شروعformulas", "شروعframedcell", "شروعframedcontent", "شروعframedrow", "شروعframedtable", "شروعframedtext", "شروعfrontmatter", "شروعgraphictext", "شروعgridsnapping", "شروعhanging", "شروعhbox", "شروعhboxestohbox", "شروعhboxregister", "شروعheadtext", "شروعhelptext", "شروعhiding", "شروعhighlight", "شروعhyphenation", "شروعimath", "شروعindentation", "شروعindentedtext", "شروعinteraction", "شروعinterface", "شروعintermezzotext", "شروعintertext", "شروعitemgroup", "شروعitemgroupcolumns", "شروعitemize", "شروعknockout", "شروعlabeltext", "شروعlayout", "شروعlegend", "شروعlinealignment", "شروعlinecorrection", "شروعlinefiller", "شروعlinenumbering", "شروعlines", "شروعlinetable", "شروعlinetablebody", "شروعlinetablecell", "شروعlinetablehead", "شروعlocalfootnotes", "شروعlocalheadsetup", "شروعlocallinecorrection", "شروعlocalnotes", "شروعlocalsetups", "شروعlua", "شروعluacode", "شروعluaparameterset", "شروعluasetups", "شروعmakeup", "شروعmarginblock", "شروعmarkedcontent", "شروعmarkpages", "شروعmathalignment", "شروعmathcases", "شروعmathlabeltext", "شروعmathmatrix", "شروعmathmode", "شروعmathstyle", "شروعmatrices", "شروعmatrix", "شروعmaxaligned", "شروعmdformula", "شروعmiddlealigned", "شروعmiddlemakeup", "شروعmixedcolumns", "شروعmode", "شروعmodeset", "شروعmodule", "شروعmoduletestsection", "شروعmpformula", "شروعnamedsection", "شروعnamedsubformulas", "شروعnarrow", "شروعnarrower", "شروعnegative", "شروعnicelyfilledbox", "شروعnointerference", "شروعnotallmodes", "شروعnotext", "شروعnotmode", "شروعoperatortext", "شروعopposite", "شروعoutputstream", "شروعoverlay", "شروعoverprint", "شروعpagecolumns", "شروعpagecomment", "شروعpagefigure", "شروعpagelayout", "شروعpagemakeup", "شروعpar", "شروعparagraph", "شروعparagraphs", "شروعparagraphscell", "شروعparbuilder", "شروعpart", "شروعpath", "شروعplacechemical", "شروعplacefigure", "شروعplacegraphic", "شروعplaceintermezzo", "شروعplacelegend", "شروعplacepairedbox", "شروعplacetable", "شروعpositioning", "شروعpositionoverlay", "شروعpositive", "شروعpostponing", "شروعpostponingnotes", "شروعprefixtext", "شروعprocessassignmentcommand", "شروعprocessassignmentlist", "شروعprocesscommacommand", "شروعprocesscommalist", "شروعprotect", "شروعprotectedcolors", "شروعpunctuation", "شروعquotation", "شروعquote", "شروعrandomized", "شروعrandomseed", "شروعrawsetups", "شروعreadingfile", "شروعreferenceprefix", "شروعregime", "شروعreusableMPgraphic", "شروعruby", "شروعscript", "شروعsdformula", "شروعsection", "شروعsectionblock", "شروعsectionblockenvironment", "شروعsectionlevel", "شروعsetups", "شروعshapebox", "شروعshift", "شروعsidebar", "شروعsimplecolumns", "شروعspecialitem", "شروعspeech", "شروعspformula", "شروعsplitformula", "شروعsplittext", "شروعspread", "شروعstandardmakeup", "شروعstaticMPfigure", "شروعstaticMPgraphic", "شروعstrictinspectnextcharacter", "شروعstrut", "شروعstyle", "شروعsubformulas", "شروعsubject", "شروعsubjectlevel", "شروعsubsection", "شروعsubsentence", "شروعsubstack", "شروعsubsubject", "شروعsubsubsection", "شروعsubsubsubject", "شروعsubsubsubsection", "شروعsubsubsubsubject", "شروعsubsubsubsubsection", "شروعsubsubsubsubsubject", "شروعsuffixtext", "شروعsymbolset", "شروعtable", "شروعtablehead", "شروعtables", "شروعtabletail", "شروعtabletext", "شروعtabulate", "شروعtabulatehead", "شروعtabulatetail", "شروعtagged", "شروعtaglabeltext", "شروعtexcode", "شروعtexdefinition", "شروعtext", "شروعtextbackground", "شروعtextbackgroundmanual", "شروعtextcolor", "شروعtextcolorintent", "شروعtextflow", "شروعtextmakeup", "شروعtitle", "شروعtokenlist", "شروعtokens", "شروعtransparent", "شروعtypescript", "شروعtypescriptcollection", "شروعtyping", "شروعuniqueMPgraphic", "شروعuniqueMPpagegraphic", "شروعunittext", "شروعunpacked", "شروعusableMPgraphic", "شروعuseMPgraphic", "شروعusemathstyleparameter", "شروعuserdata", "شروعusingbtxspecification", "شروعvbox", "شروعvboxregister", "شروعvboxtohbox", "شروعvboxtohboxseparator", "شروعviewerlayer", "شروعvtop", "شروعvtopregister", "شروعxcell", "شروعxcellgroup", "شروعxcolumn", "شروعxgroup", "شروعxmldisplayverbatim", "شروعxmlinlineverbatim", "شروعxmlraw", "شروعxmlsetups", "شروعxrow", "شروعxrowgroup", "شروعxtable", "شروعxtablebody", "شروعxtablefoot", "شروعxtablehead", "شروعxtablenext", "شروعآیتم", "شروعبروبه", "شروعتنظیم‌راست", "شروعتنظیم‌وسط", "شروعتولید", "شروعخط‌حاشیه", "شروعخط‌متن", "شروعدرج‌شناور", "شروعدرج‌Ùرمول", "شروعرنگ", "شروعزبان", "شروعسر", "شروعÙشرده", "شروعقالبی", "شروعمحیط", "شروعمنوی‌پانل", "شروعمولÙÙ‡", "شروعنشر", "شروعپروژه", "شروعپس‌زمینه", "شروعچپ‌چین", "شروع‌خط", "شماره‌زیرصÙحه", "شماره‌سر", "شماره‌سرجاری", "شماره‌صÙحه", "شماره‌صÙحه‌کامل", "شماره‌Ùرمول", "شماره‌مبدل", "شماره‌ها", "شکاÙتن‌شناور", "شکل‌خارجی", "صÙحه", "صÙحه‌تست", "طول‌لیست", "عرض‌خط", "Ùضا", "Ùضاهای‌ثابت", "Ùضای‌ثابت", "Ùضای‌سÙیدصحیح", "قالبی", "لوح‌مقایسه", "ماه", "متن‌پانوشت", "محیط", "مراجعه", "مرجع", "مرجع‌صÙحه", "مرجع‌متن", "مقایسه‌گروه‌رنگ", "مقداررنگ", "مقیاس", "منوی‌پانل", "مولÙÙ‡", "مکان", "میدان", "میدان‌شبیه‌سازی", "میدان‌پشته", "میدان‌کپی", "میله‌رنگ", "میله‌پانل", "ناشناس", "نسخه", "نشانه‌گذاری", "نصب‌زبان", "نقطه‌ها", "نماد", "نمایش‌آرایش", "نمایش‌بارگذاریها", "نمایش‌بستها", "نمایش‌توری", "نمایش‌رنگ", "نمایش‌طرح‌بندی", "نمایش‌قالب", "نمایش‌قلم‌بدنه", "نمایش‌لوح", "نمایش‌مجموعه‌علامت", "نمایش‌محیط‌قلم‌بدنه", "نمایش‌چاپ", "نمایش‌گروه‌رنگ", "پابا", "پایانJScode", "پایانJSpreamble", "پایانLUA", "پایانMP", "پایانMPclip", "پایانMPcode", "پایانMPdefinitions", "پایانMPdrawing", "پایانMPenvironment", "پایانMPextensions", "پایانMPinclusions", "پایانMPinitializations", "پایانMPpage", "پایانMPpositiongraphic", "پایانMPpositionmethod", "پایانMPrun", "پایانPARSEDXML", "پایانTABLE", "پایانTABLEbody", "پایانTABLEfoot", "پایانTABLEhead", "پایانTABLEnext", "پایانTC", "پایانTD", "پایانTDs", "پایانTEX", "پایانTEXpage", "پایانTH", "پایانTN", "پایانTR", "پایانTRs", "پایانTX", "پایانTY", "پایانXML", "پایانalign", "پایانalignment", "پایانallmodes", "پایانappendices", "پایانarrangedpages", "پایانaside", "پایانattachment", "پایانbackmatter", "پایانbar", "پایانbbordermatrix", "پایانbitmapimage", "پایانblockquote", "پایانbodymatter", "پایانbordermatrix", "پایانboxedcolumns", "پایانbtxlabeltext", "پایانbtxrenderingdefinitions", "پایانbuffer", "پایانcases", "پایانcatcodetable", "پایانcenteraligned", "پایانchapter", "پایانcharacteralign", "پایانcheckedfences", "پایانchemical", "پایانchemicaltext", "پایانcollect", "پایانcollecting", "پایانcolorintent", "پایانcoloronly", "پایانcolorset", "پایانcolumns", "پایانcolumnset", "پایانcolumnsetspan", "پایانcolumnspan", "پایانcombination", "پایانcomment", "پایانcontextcode", "پایانcontextdefinitioncode", "پایانctxfunction", "پایانctxfunctiondefinition", "پایانcurrentcolor", "پایانcurrentlistentrywrapper", "پایانdelimited", "پایانdelimitedtext", "پایانdisplaymath", "پایانdmath", "پایانdocument", "پایانeffect", "پایانelement", "پایانembeddedxtable", "پایانendnote", "پایانendofline", "پایانexceptions", "پایانexpanded", "پایانexpandedcollect", "پایانextendedcatcodetable", "پایانexternalfigurecollection", "پایانfacingfloat", "پایانfact", "پایانfigure", "پایانfiguretext", "پایانfittingpage", "پایانfixed", "پایانfloatcombination", "پایانfont", "پایانfontclass", "پایانfontsolution", "پایانfootnote", "پایانformula", "پایانformulas", "پایانframedcell", "پایانframedcontent", "پایانframedrow", "پایانframedtable", "پایانframedtext", "پایانfrontmatter", "پایانgraphictext", "پایانgridsnapping", "پایانhanging", "پایانhbox", "پایانhboxestohbox", "پایانhboxregister", "پایانheadtext", "پایانhelptext", "پایانhiding", "پایانhighlight", "پایانhyphenation", "پایانimath", "پایانindentation", "پایانindentedtext", "پایانinteraction", "پایانinterface", "پایانintermezzotext", "پایانintertext", "پایانitemgroup", "پایانitemgroupcolumns", "پایانitemize", "پایانknockout", "پایانlabeltext", "پایانlayout", "پایانlegend", "پایانlinealignment", "پایانlinecorrection", "پایانlinefiller", "پایانlinenumbering", "پایانlines", "پایانlinetable", "پایانlinetablebody", "پایانlinetablecell", "پایانlinetablehead", "پایانlocalfootnotes", "پایانlocalheadsetup", "پایانlocallinecorrection", "پایانlocalnotes", "پایانlocalsetups", "پایانlua", "پایانluacode", "پایانluaparameterset", "پایانluasetups", "پایانmakeup", "پایانmarginblock", "پایانmarkedcontent", "پایانmarkpages", "پایانmathalignment", "پایانmathcases", "پایانmathlabeltext", "پایانmathmatrix", "پایانmathmode", "پایانmathstyle", "پایانmatrices", "پایانmatrix", "پایانmaxaligned", "پایانmdformula", "پایانmiddlealigned", "پایانmiddlemakeup", "پایانmixedcolumns", "پایانmode", "پایانmodeset", "پایانmodule", "پایانmoduletestsection", "پایانmpformula", "پایانnamedsection", "پایانnamedsubformulas", "پایانnarrow", "پایانnarrower", "پایانnegative", "پایانnicelyfilledbox", "پایانnointerference", "پایانnotallmodes", "پایانnotext", "پایانnotmode", "پایانoperatortext", "پایانopposite", "پایانoutputstream", "پایانoverlay", "پایانoverprint", "پایانpagecolumns", "پایانpagecomment", "پایانpagefigure", "پایانpagelayout", "پایانpagemakeup", "پایانpar", "پایانparagraph", "پایانparagraphs", "پایانparagraphscell", "پایانparbuilder", "پایانpart", "پایانpath", "پایانplacechemical", "پایانplacefigure", "پایانplacegraphic", "پایانplaceintermezzo", "پایانplacelegend", "پایانplacepairedbox", "پایانplacetable", "پایانpositioning", "پایانpositionoverlay", "پایانpositive", "پایانpostponing", "پایانpostponingnotes", "پایانprefixtext", "پایانprocessassignmentcommand", "پایانprocessassignmentlist", "پایانprocesscommacommand", "پایانprocesscommalist", "پایانprotect", "پایانprotectedcolors", "پایانpunctuation", "پایانquotation", "پایانquote", "پایانrandomized", "پایانrandomseed", "پایانrawsetups", "پایانreadingfile", "پایانreferenceprefix", "پایانregime", "پایانreusableMPgraphic", "پایانruby", "پایانscript", "پایانsdformula", "پایانsection", "پایانsectionblock", "پایانsectionblockenvironment", "پایانsectionlevel", "پایانsetups", "پایانshapebox", "پایانshift", "پایانsidebar", "پایانsimplecolumns", "پایانspecialitem", "پایانspeech", "پایانspformula", "پایانsplitformula", "پایانsplittext", "پایانspread", "پایانstandardmakeup", "پایانstaticMPfigure", "پایانstaticMPgraphic", "پایانstrictinspectnextcharacter", "پایانstrut", "پایانstyle", "پایانsubformulas", "پایانsubject", "پایانsubjectlevel", "پایانsubsection", "پایانsubsentence", "پایانsubstack", "پایانsubsubject", "پایانsubsubsection", "پایانsubsubsubject", "پایانsubsubsubsection", "پایانsubsubsubsubject", "پایانsubsubsubsubsection", "پایانsubsubsubsubsubject", "پایانsuffixtext", "پایانsymbolset", "پایانtable", "پایانtablehead", "پایانtables", "پایانtabletail", "پایانtabletext", "پایانtabulate", "پایانtabulatehead", "پایانtabulatetail", "پایانtagged", "پایانtaglabeltext", "پایانtexcode", "پایانtexdefinition", "پایانtext", "پایانtextbackground", "پایانtextbackgroundmanual", "پایانtextcolor", "پایانtextcolorintent", "پایانtextflow", "پایانtextmakeup", "پایانtitle", "پایانtokenlist", "پایانtokens", "پایانtransparent", "پایانtypescript", "پایانtypescriptcollection", "پایانtyping", "پایانuniqueMPgraphic", "پایانuniqueMPpagegraphic", "پایانunittext", "پایانunpacked", "پایانusableMPgraphic", "پایانuseMPgraphic", "پایانusemathstyleparameter", "پایانuserdata", "پایانusingbtxspecification", "پایانvbox", "پایانvboxregister", "پایانvboxtohbox", "پایانvboxtohboxseparator", "پایانviewerlayer", "پایانvtop", "پایانvtopregister", "پایانxcell", "پایانxcellgroup", "پایانxcolumn", "پایانxgroup", "پایانxmldisplayverbatim", "پایانxmlinlineverbatim", "پایانxmlraw", "پایانxmlsetups", "پایانxrow", "پایانxrowgroup", "پایانxtable", "پایانxtablebody", "پایانxtablefoot", "پایانxtablehead", "پایانxtablenext", "پایانآیتم", "پایانبروبه", "پایانتنظیم‌راست", "پایانتنظیم‌وسط", "پایانتولید", "پایانخط‌حاشیه", "پایانخط‌متن", "پایاندرج‌شناور", "پایاندرج‌Ùرمول", "پایانرنگ", "پایانزبان", "پایانسر", "پایانÙشرده", "پایانقالبی", "پایانمحیط", "پایانمنوی‌پانل", "پایانمولÙÙ‡", "پایاننشر", "پایانپروژه", "پایانپس‌زمینه", "پایانچپ‌چین", "پایان‌خط", "پایین", "پرده", "پروژه", "پرکردن‌میدان", "پس‌زمینه", "چوبخط", "چپ‌چین", "کشیده", "کلمه‌راست", "گیره", "یادداشت", "یک‌جا", "یک‌خط" },
- ["ro"]={ "CUVANT", "CUVINTE", "Cuvant", "Cuvinte", "Kap", "LUNA", "Litera", "Litere", "Numere", "Numereromane", "ZIDINSAPTAMANA", "adapteazaaspect", "adubuffer", "adumarcaje", "afiseazaaspect", "afiseazaculoare", "afiseazafonttext", "afiseazagrid", "afiseazagrupculoare", "afiseazamakeup", "afiseazamediufonttext", "afiseazapaleta", "afiseazarama", "afiseazasetari", "afiseazasetsimboluri", "afiseazastruts", "afiseazatiparire", "aliniatcentru", "aliniatdreapta", "aliniatstanga", "ascundeblocuri", "baraculoare", "barainteractiune", "blanc", "butoaneinteractiune", "buton", "butonmeniu", "camp", "cloneazacamp", "coloana", "comparagrupculoare", "comparapaleta", "completeazanumarpagina", "componenta", "convertestenumar", "copiazacamp", "corecteazaspatiualb", "culoare", "culoaregri", "cuvantdreapta", "data", "datacurenta", "defineste", "definesteaccent", "definesteantet", "definestebloc", "definesteblocsectiune", "definestebuffer", "definestecamp", "definestecaracter", "definestecomanda", "definesteconversie", "definesteculoare", "definestedescriere", "definestedimensiunehartie", "definesteenumerare", "definesteeticheta", "definestefloat", "definestefont", "definestefonttext", "definesteformatreferinte", "definestegrupculori", "definestehbox", "definesteinconjurare", "definestelista", "definestelistacombinata", "definestemakeup", "definestemarcaje", "definestemediulfonttext", "definestemeniuinteractiune", "definesteoverlay", "definestepaleta", "definesteparagraf", "definesteprofil", "definesteprogram", "definestereferinte", "definesteregistru", "definestesablontabel", "definestesectiune", "definestesimbol", "definestesimbolfigura", "definestesinonim", "definestesinonimfont", "definestesortare", "definestestartstop", "definestestil", "definestestilfont", "definestestivacampuri", "definestesubcamp", "definestetabulatori", "definestetext", "definestetexteinconjurate", "definestetextinconjurat", "definestetyping", "despre", "determinacaracteristicilelistei", "determinacaracteristiciregistru", "determinanumartitlu", "din", "dute", "dutebox", "dutepagina", "ecran", "element", "faraliniiantetsisubsol", "faraliniisussijos", "faraspatiu", "figuraexterna", "firdepar", "folosesteURL", "folosestebloc", "folosestedirector", "folosestedocumentextern", "folosestefiguraexterna", "folosestemodul", "folosestemuzicaexterna", "folosestescriptJS", "folosestesimboluri", "folosesteurl", "fundal", "grosimelinie", "impartefloat", "inalt", "injos", "inlinie", "instalarelimba", "intins", "jos", "jossus", "la", "lapagina", "limba", "limbaprincipala", "linieneagra", "liniesubtire", "linieumplere", "liniinegre", "liniisubtiri", "litera", "litere", "luna", "lungimelista", "marcaje", "matematica", "mediu", "meniuinteractiune", "necunoscut", "nokap", "nota", "numarformula", "numarpagina", "numartitlu", "numartitlucurent", "numere", "numereromane", "olinie", "pagina", "pastreazablocuri", "pelung", "plaseazapegrid", "plaseazasemnecarte", "potrivestecamp", "pozitie", "proceseazabloc", "produs", "proiect", "puncte", "punedeasuprafiecareia", "punefatainfata", "puneformula", "punelista", "punelistacombinata", "punenotesubsol", "punenotesubsollocale", "punenumarpagina", "puneregistru", "punesubformula", "referinta", "referintapagina", "referintatext", "reflexie", "remarca", "reseteazamarcaje", "riglatext", "rigleumplere", "roteste", "scala", "scriebuffer", "scrieinlista", "scrieintreliste", "selecteazablocuri", "semncarte", "setareitemization", "setarelimba", "setarepozitie", "seteazaaliniat", "seteazaalinierea", "seteazaantet", "seteazaaranjareapag", "seteazaaspect", "seteazabarainteractiune", "seteazablanc", "seteazabloc", "seteazablocsectiune", "seteazabuffer", "seteazacamp", "seteazacampuri", "seteazaclipping", "seteazacoloane", "seteazacomentariu", "seteazacomentariupagina", "seteazaculoare", "seteazaculori", "seteazadimensiunihartie", "seteazaecraninteractiune", "seteazaelemente", "seteazaenumerare", "seteazafloat", "seteazafloats", "seteazafonttext", "seteazaformulare", "seteazaformule", "seteazafundal", "seteazafundaluri", "seteazagrosimelinie", "seteazaimpartireafloat", "seteazainconjurat", "seteazaingust", "seteazainteractiunea", "seteazajos", "seteazalegenda", "seteazalegendele", "seteazaliniesilabe", "seteazaliniesubtire", "seteazalinii", "seteazaliniimargine", "seteazaliniinegre", "seteazaliniiumplere", "seteazalista", "seteazalistacombinata", "seteazamajuscule", "seteazamakeup", "seteazamarcaje", "seteazameniuinteractiune", "seteazaminicitat", "seteazanumarpagina", "seteazanumarsubpagina", "seteazanumartitlu", "seteazanumerotarelinii", "seteazanumerotarepagina", "seteazanumerotareparagrafe", "seteazapaleta", "seteazaparagrafe", "seteazaplasareaopozita", "seteazaprograme", "seteazareferinte", "seteazaregistru", "seteazarigletext", "seteazarigleumplere", "seteazarotare", "seteazasimbol", "seteazasinonime", "seteazasortare", "seteazaspatiu", "seteazaspatiualb", "seteazaspatiuinterliniar", "seteazasubsol", "seteazasus", "seteazatabele", "seteazatabulatori", "seteazatext", "seteazatexteantet", "seteazatextejos", "seteazatextesubsol", "seteazatextesus", "seteazatextetext", "seteazatitlu", "seteazatitluri", "seteazatoleranta", "seteazatranzitiepagina", "seteazatype", "seteazatyping", "seteazaurl", "simbol", "spatiifixate", "spatiu", "spatiufixat", "startaliniatcentru", "startaliniatdreapta", "startaliniatstanga", "startcomponenta", "startculoare", "startdute", "startfundal", "startimpachetat", "startlimba", "startlinie", "startliniemargine", "startmediu", "startmeniuinteractiune", "startprodus", "startproiect", "startpublicatie", "startpuneformula", "startriglatext", "starttitlu", "stivacampuri", "stopaliniatcentru", "stopaliniatdreapta", "stopaliniatstanga", "stopcomponenta", "stopculoare", "stopdute", "stopfundal", "stopimpachetat", "stoplimba", "stoplinie", "stopliniemargine", "stopmediu", "stopmeniuinteractiune", "stopprodus", "stopproiect", "stoppublicatie", "stoppuneformula", "stopriglatext", "stoptitlu", "textumplere", "traduce", "trecilafonttext", "undeva", "valoareculoare", "versiune", "zidinsaptamana" },
+ ["fr"]={ "Caractere", "Caracteres", "Chiffresromains", "JOURSEMAINE", "MOIS", "MOT", "MOTS", "Mot", "Mots", "Numeros", "a", "adaptedisposition", "ajustechamp", "alaligne", "alapage", "aligneadroite", "aligneagauche", "aligneaumilieu", "arriereplan", "baha", "barrecouleur", "barreinteraction", "bas", "bouton", "boutonmenu", "boutonsinteraction", "cacheblocs", "caractere", "caracteres", "champ", "changepolicecorps", "chiffresromains", "clonechamp", "colonne", "commentaire", "comparegroupecouleur", "comparepalette", "completenumeropage", "completeregistre", "composant", "concernant", "convertitnumero", "copitchamp", "corrigeespaceblanc", "couleur", "couleurgrise", "dactylographier", "dans", "datecourante", "de", "definicaractere", "definit", "definitaccent", "definitbloc", "definitblocsection", "definitbuffer", "definitcalque", "definitchamp", "definitcommande", "definitconversion", "definitcouleur", "definitdactylo", "definitdemarrestoppe", "definitdescription", "definitdisposition", "definitenumeration", "definitenvironnementpolicecorps", "definitetiquette", "definitflottant", "definitformatreference", "definitgroupecouleur", "definithbox", "definitjeucolonne", "definitliste", "definitlisteimbriquee", "definitmakeup", "definitmarquage", "definitmenuinteraction", "definitpalette", "definitparagraphes", "definitpilechamp", "definitpolice", "definitpolicecorps", "definitprofil", "definitprogramme", "definitreference", "definitregistre", "definitrevetement", "definitsautdecolonne", "definitsautdepage", "definitsection", "definitsouschamp", "definitstyle", "definitstylepolice", "definitsymbole", "definitsymbolefigure", "definitsynonymepolice", "definitsynonymes", "definittabulation", "definittaillepapier", "definittete", "definittexte", "definittrametableau", "definittri", "definittype", "definitvide", "demarreJScode", "demarreJSpreamble", "demarreLUA", "demarreMP", "demarreMPclip", "demarreMPcode", "demarreMPdefinitions", "demarreMPdrawing", "demarreMPenvironment", "demarreMPextensions", "demarreMPinclusions", "demarreMPinitializations", "demarreMPpage", "demarreMPpositiongraphic", "demarreMPpositionmethod", "demarreMPrun", "demarrePARSEDXML", "demarreTABLE", "demarreTABLEbody", "demarreTABLEfoot", "demarreTABLEhead", "demarreTABLEnext", "demarreTC", "demarreTD", "demarreTDs", "demarreTEX", "demarreTEXpage", "demarreTH", "demarreTN", "demarreTR", "demarreTRs", "demarreTX", "demarreTY", "demarreXML", "demarrealign", "demarrealigneadroite", "demarrealigneagauche", "demarrealigneaumilieu", "demarrealignment", "demarreallmodes", "demarreappendices", "demarrearrangedpages", "demarrearriereplan", "demarreaside", "demarreattachment", "demarrebackmatter", "demarrebar", "demarrebbordermatrix", "demarrebitmapimage", "demarreblockquote", "demarrebodymatter", "demarrebordermatrix", "demarreboxedcolumns", "demarrebtxlabeltext", "demarrebtxrenderingdefinitions", "demarrebuffer", "demarrecases", "demarrecatcodetable", "demarrecenteraligned", "demarrechapter", "demarrecharacteralign", "demarrecheckedfences", "demarrechemical", "demarrechemicaltext", "demarreciter", "demarrecollect", "demarrecollecting", "demarrecolorintent", "demarrecoloronly", "demarrecolorset", "demarrecolumns", "demarrecolumnset", "demarrecolumnsetspan", "demarrecombination", "demarrecomment", "demarrecomposant", "demarrecontextcode", "demarrecontextdefinitioncode", "demarrecouleur", "demarrectxfunction", "demarrectxfunctiondefinition", "demarrecurrentcolor", "demarrecurrentlistentrywrapper", "demarredelimited", "demarredelimitedtext", "demarredisplaymath", "demarredmath", "demarredocument", "demarreeffect", "demarreelement", "demarreembeddedxtable", "demarreendnote", "demarreendofline", "demarreenvironement", "demarreexceptions", "demarreexpanded", "demarreexpandedcollect", "demarreextendedcatcodetable", "demarreexternalfigurecollection", "demarrefacingfloat", "demarrefact", "demarrefigure", "demarrefiguretext", "demarrefittingpage", "demarrefixed", "demarrefloatcombination", "demarrefont", "demarrefontclass", "demarrefontsolution", "demarrefootnote", "demarreformula", "demarreformulas", "demarreframed", "demarreframedcell", "demarreframedcontent", "demarreframedrow", "demarreframedtable", "demarreframedtext", "demarrefrontmatter", "demarregraphictext", "demarregridsnapping", "demarregroupe", "demarrehanging", "demarrehbox", "demarrehboxestohbox", "demarrehboxregister", "demarreheadtext", "demarrehelptext", "demarrehiding", "demarrehighlight", "demarrehyphenation", "demarreimath", "demarreindentation", "demarreindentedtext", "demarreinteraction", "demarreinterface", "demarreintermezzotext", "demarreintertext", "demarreitemgroup", "demarreitemgroupcolumns", "demarreitemize", "demarreknockout", "demarrelabeltext", "demarrelangue", "demarrelayout", "demarrelegend", "demarreligne", "demarreligneregleetexte", "demarrelinealignment", "demarrelinecorrection", "demarrelinefiller", "demarrelinenumbering", "demarrelines", "demarrelinetable", "demarrelinetablebody", "demarrelinetablecell", "demarrelinetablehead", "demarrelocalfootnotes", "demarrelocalheadsetup", "demarrelocallinecorrection", "demarrelocalnotes", "demarrelocalsetups", "demarrelua", "demarreluacode", "demarreluaparameterset", "demarreluasetups", "demarremakeup", "demarremargereglee", "demarremarginblock", "demarremarkedcontent", "demarremarkpages", "demarremathalignment", "demarremathcases", "demarremathlabeltext", "demarremathmatrix", "demarremathmode", "demarremathstyle", "demarrematrices", "demarrematrix", "demarremaxaligned", "demarremdformula", "demarremenuinteraction", "demarremiddlealigned", "demarremiddlemakeup", "demarremixedcolumns", "demarremode", "demarremodeset", "demarremodule", "demarremoduletestsection", "demarrempformula", "demarrenamedsection", "demarrenamedsubformulas", "demarrenarrow", "demarrenarrower", "demarrenegative", "demarrenicelyfilledbox", "demarrenointerference", "demarrenotallmodes", "demarrenotext", "demarrenotmode", "demarreoperatortext", "demarreopposite", "demarreoutputstream", "demarreoverlay", "demarreoverprint", "demarrepagecolumns", "demarrepagecomment", "demarrepagefigure", "demarrepagelayout", "demarrepagemakeup", "demarrepar", "demarreparagraph", "demarreparagraphs", "demarreparagraphscell", "demarreparbuilder", "demarrepart", "demarrepath", "demarreplacechemical", "demarreplacefigure", "demarreplaceflottant", "demarreplaceformule", "demarreplacegraphic", "demarreplaceintermezzo", "demarreplacelegend", "demarreplacepairedbox", "demarreplacetable", "demarrepositioning", "demarrepositionoverlay", "demarrepositive", "demarrepostponing", "demarrepostponingnotes", "demarreprefixtext", "demarreprocessassignmentcommand", "demarreprocessassignmentlist", "demarreprocesscommacommand", "demarreprocesscommalist", "demarreproduit", "demarreprojet", "demarreprotect", "demarreprotectedcolors", "demarrepublication", "demarrepunctuation", "demarrequotation", "demarrequote", "demarrerandomized", "demarrerandomseed", "demarrerawsetups", "demarrereadingfile", "demarrereferenceprefix", "demarreregime", "demarrereusableMPgraphic", "demarreruby", "demarrescript", "demarresdformula", "demarresection", "demarresectionblock", "demarresectionblockenvironment", "demarresectionlevel", "demarresetups", "demarreshapebox", "demarreshift", "demarresidebar", "demarresimplecolumns", "demarrespecialitem", "demarrespeech", "demarrespformula", "demarresplitformula", "demarresplittext", "demarrespread", "demarrestandardmakeup", "demarrestaticMPfigure", "demarrestaticMPgraphic", "demarrestrictinspectnextcharacter", "demarrestrut", "demarrestyle", "demarresubformulas", "demarresubject", "demarresubjectlevel", "demarresubsection", "demarresubsentence", "demarresubstack", "demarresubsubject", "demarresubsubsection", "demarresubsubsubject", "demarresubsubsubsection", "demarresubsubsubsubject", "demarresubsubsubsubsection", "demarresubsubsubsubsubject", "demarresuffixtext", "demarresymbolset", "demarretable", "demarretablehead", "demarretables", "demarretabletail", "demarretabletext", "demarretabulate", "demarretabulatehead", "demarretabulatetail", "demarretagged", "demarretaglabeltext", "demarretete", "demarretexcode", "demarretexdefinition", "demarretext", "demarretextbackground", "demarretextbackgroundmanual", "demarretextcolor", "demarretextcolorintent", "demarretextflow", "demarretextmakeup", "demarretitle", "demarretokenlist", "demarretokens", "demarretransparent", "demarretypescript", "demarretypescriptcollection", "demarretyping", "demarreuniqueMPgraphic", "demarreuniqueMPpagegraphic", "demarreunittext", "demarreunpacked", "demarreusableMPgraphic", "demarreuseMPgraphic", "demarreusemathstyleparameter", "demarreuserdata", "demarreusingbtxspecification", "demarreva", "demarrevbox", "demarrevboxregister", "demarrevboxtohbox", "demarrevboxtohboxseparator", "demarreviewerlayer", "demarrevtop", "demarrevtopregister", "demarrexcell", "demarrexcellgroup", "demarrexcolumn", "demarrexgroup", "demarrexmldisplayverbatim", "demarrexmlinlineverbatim", "demarrexmlraw", "demarrexmlsetups", "demarrexrow", "demarrexrowgroup", "demarrextable", "demarrextablebody", "demarrextablefoot", "demarrextablehead", "demarrextablenext", "determinecaracteristiqueliste", "determinecaracteristiquesregistre", "determinenumerotete", "echelle", "ecran", "ecritdansliste", "ecritentreliste", "element", "elements", "environement", "espace", "espacefixe", "espacesfixes", "etire", "faitreference", "fichierdactylo", "figureexterne", "gardeblocs", "grille", "haut", "inconnu", "installelangue", "joursemaine", "langue", "langueprincipale", "largeurligne", "ligneh", "lignenoire", "ligneregleetexte", "lignesnoires", "llongueurliste", "marquage", "marquepage", "mathematique", "menuinteraction", "mois", "montrecadre", "montrecouleur", "montredisposition", "montreedition", "montreenvironnementpolicecorps", "montregrille", "montregroupecouleur", "montrejeusymboles", "montremakeup", "montrepalette", "montrepolicecorps", "montrereglages", "montrestruts", "motdroit", "numeroformule", "numeropage", "numeros", "numerotete", "numerotetecourant", "obtientmarquage", "oriente", "periodes", "pilechamp", "placecoteacote", "placeflottant", "placeformule", "placelesunsaudessusdesautres", "placeliste", "placelisteinmbriquee", "placemarquespages", "placenotespdp", "placenotespdplocales", "placenumeropage", "placenumerotete", "placeregistre", "placesousformule", "placesurgrille", "placetextetete", "prendbuffer", "produit", "programme", "projet", "qqpart", "razmarquage", "referencepage", "referencetexte", "reflete", "reglealignement", "reglearrangement", "reglearriereplan", "reglearriereplans", "reglebarreinteraction", "reglebloc", "regleblocsection", "reglebuffer", "reglecapitales", "reglechamp", "reglechamps", "regleclipping", "reglecolonnes", "reglecommentaire", "reglecommentairepage", "reglecompoetroite", "reglecomposeenalinea", "reglecouleur", "reglecouleurs", "regledactylo", "regledemarrestoppe", "regledisposition", "regleecraninteraction", "regleelements", "regleencadre", "regleentete", "regleenumerations", "regleepaisseurligne", "regleespaceblanc", "regleespacement", "regleespacementinterligne", "regleflottant", "regleflottants", "regleformulaires", "regleformules", "reglegroupeselements", "regleinf", "regleinteraction", "regleintitule", "regleintitules", "reglejeucolonne", "reglejeusymboles", "reglelangue", "reglelignes", "reglelignesnoires", "reglelignesreglestexte", "regleliste", "reglelisteimbriquee", "reglemakeup", "reglemargereglee", "reglemarquage", "reglemarquagehyphenation", "reglemenuinteraction", "reglenotepdp", "reglenumeropage", "reglenumerotationligne", "reglenumerotationpage", "reglenumerotationparagraphe", "reglenumerotete", "regleoriente", "reglepalette", "reglepapier", "regleparagraphes", "reglepdp", "regleplacementopposition", "reglepolicecorps", "reglepositionnement", "regleprogrammes", "reglereferencage", "regleregistre", "regleremplitligne", "regleremplitlignesreglees", "regleseparationflottant", "reglesousnumeropage", "reglesup", "reglesynonymes", "regletableaux", "regletabulation", "regletaillepapier", "regletete", "regletetes", "regletexte", "regletextesentete", "regletextesinf", "regletextespdp", "regletextessup", "regletextestexte", "regletolerance", "regletraitsfins", "regletransitionspage", "regletri", "regletype", "regleurl", "remplitligne", "remplitlignesreglees", "remplittexte", "sansespace", "sanslignesenteteetpdp", "sanslignessupetinf", "selectionneblocs", "separeflottant", "settext", "sousnumeropage", "stoppeJScode", "stoppeJSpreamble", "stoppeLUA", "stoppeMP", "stoppeMPclip", "stoppeMPcode", "stoppeMPdefinitions", "stoppeMPdrawing", "stoppeMPenvironment", "stoppeMPextensions", "stoppeMPinclusions", "stoppeMPinitializations", "stoppeMPpage", "stoppeMPpositiongraphic", "stoppeMPpositionmethod", "stoppeMPrun", "stoppePARSEDXML", "stoppeTABLE", "stoppeTABLEbody", "stoppeTABLEfoot", "stoppeTABLEhead", "stoppeTABLEnext", "stoppeTC", "stoppeTD", "stoppeTDs", "stoppeTEX", "stoppeTEXpage", "stoppeTH", "stoppeTN", "stoppeTR", "stoppeTRs", "stoppeTX", "stoppeTY", "stoppeXML", "stoppealign", "stoppealigneadroite", "stoppealigneagauche", "stoppealigneaumilieu", "stoppealignment", "stoppeallmodes", "stoppeappendices", "stoppearrangedpages", "stoppearriereplan", "stoppeaside", "stoppeattachment", "stoppebackmatter", "stoppebar", "stoppebbordermatrix", "stoppebitmapimage", "stoppeblockquote", "stoppebodymatter", "stoppebordermatrix", "stoppeboxedcolumns", "stoppebtxlabeltext", "stoppebtxrenderingdefinitions", "stoppebuffer", "stoppecases", "stoppecatcodetable", "stoppecenteraligned", "stoppechapter", "stoppecharacteralign", "stoppecheckedfences", "stoppechemical", "stoppechemicaltext", "stoppecollect", "stoppecollecting", "stoppecolorintent", "stoppecoloronly", "stoppecolorset", "stoppecolumns", "stoppecolumnset", "stoppecolumnsetspan", "stoppecombination", "stoppecomment", "stoppecomposant", "stoppecontextcode", "stoppecontextdefinitioncode", "stoppecouleur", "stoppectxfunction", "stoppectxfunctiondefinition", "stoppecurrentcolor", "stoppecurrentlistentrywrapper", "stoppedelimited", "stoppedelimitedtext", "stoppedisplaymath", "stoppedmath", "stoppedocument", "stoppeeffect", "stoppeelement", "stoppeembeddedxtable", "stoppeendnote", "stoppeendofline", "stoppeenvironement", "stoppeexceptions", "stoppeexpanded", "stoppeexpandedcollect", "stoppeextendedcatcodetable", "stoppeexternalfigurecollection", "stoppefacingfloat", "stoppefact", "stoppefigure", "stoppefiguretext", "stoppefittingpage", "stoppefixed", "stoppefloatcombination", "stoppefont", "stoppefontclass", "stoppefontsolution", "stoppefootnote", "stoppeformula", "stoppeformulas", "stoppeframed", "stoppeframedcell", "stoppeframedcontent", "stoppeframedrow", "stoppeframedtable", "stoppeframedtext", "stoppefrontmatter", "stoppegraphictext", "stoppegridsnapping", "stoppegroupe", "stoppehanging", "stoppehbox", "stoppehboxestohbox", "stoppehboxregister", "stoppeheadtext", "stoppehelptext", "stoppehiding", "stoppehighlight", "stoppehyphenation", "stoppeimath", "stoppeindentation", "stoppeindentedtext", "stoppeinteraction", "stoppeinterface", "stoppeintermezzotext", "stoppeintertext", "stoppeitemgroup", "stoppeitemgroupcolumns", "stoppeitemize", "stoppeknockout", "stoppelabeltext", "stoppelangue", "stoppelayout", "stoppelegend", "stoppeligne", "stoppeligneregleetexte", "stoppelinealignment", "stoppelinecorrection", "stoppelinefiller", "stoppelinenumbering", "stoppelines", "stoppelinetable", "stoppelinetablebody", "stoppelinetablecell", "stoppelinetablehead", "stoppelocalfootnotes", "stoppelocalheadsetup", "stoppelocallinecorrection", "stoppelocalnotes", "stoppelocalsetups", "stoppelua", "stoppeluacode", "stoppeluaparameterset", "stoppeluasetups", "stoppemakeup", "stoppemargereglee", "stoppemarginblock", "stoppemarkedcontent", "stoppemarkpages", "stoppemathalignment", "stoppemathcases", "stoppemathlabeltext", "stoppemathmatrix", "stoppemathmode", "stoppemathstyle", "stoppematrices", "stoppematrix", "stoppemaxaligned", "stoppemdformula", "stoppemenuinteraction", "stoppemiddlealigned", "stoppemiddlemakeup", "stoppemixedcolumns", "stoppemode", "stoppemodeset", "stoppemodule", "stoppemoduletestsection", "stoppempformula", "stoppenamedsection", "stoppenamedsubformulas", "stoppenarrow", "stoppenarrower", "stoppenegative", "stoppenicelyfilledbox", "stoppenointerference", "stoppenotallmodes", "stoppenotext", "stoppenotmode", "stoppeoperatortext", "stoppeopposite", "stoppeoutputstream", "stoppeoverlay", "stoppeoverprint", "stoppepagecolumns", "stoppepagecomment", "stoppepagefigure", "stoppepagelayout", "stoppepagemakeup", "stoppepar", "stoppeparagraph", "stoppeparagraphs", "stoppeparagraphscell", "stoppeparbuilder", "stoppepart", "stoppepath", "stoppeplacechemical", "stoppeplacefigure", "stoppeplaceflottant", "stoppeplaceformule", "stoppeplacegraphic", "stoppeplaceintermezzo", "stoppeplacelegend", "stoppeplacepairedbox", "stoppeplacetable", "stoppepositioning", "stoppepositionoverlay", "stoppepositive", "stoppepostponing", "stoppepostponingnotes", "stoppeprefixtext", "stoppeprocessassignmentcommand", "stoppeprocessassignmentlist", "stoppeprocesscommacommand", "stoppeprocesscommalist", "stoppeproduit", "stoppeprojet", "stoppeprotect", "stoppeprotectedcolors", "stoppepublication", "stoppepunctuation", "stoppequotation", "stoppequote", "stopperandomized", "stopperandomseed", "stopperawsetups", "stoppereadingfile", "stoppereferenceprefix", "stopperegime", "stoppereusableMPgraphic", "stopperuby", "stoppescript", "stoppesdformula", "stoppesection", "stoppesectionblock", "stoppesectionblockenvironment", "stoppesectionlevel", "stoppesetups", "stoppeshapebox", "stoppeshift", "stoppesidebar", "stoppesimplecolumns", "stoppespecialitem", "stoppespeech", "stoppespformula", "stoppesplitformula", "stoppesplittext", "stoppespread", "stoppestandardmakeup", "stoppestaticMPfigure", "stoppestaticMPgraphic", "stoppestrictinspectnextcharacter", "stoppestrut", "stoppestyle", "stoppesubformulas", "stoppesubject", "stoppesubjectlevel", "stoppesubsection", "stoppesubsentence", "stoppesubstack", "stoppesubsubject", "stoppesubsubsection", "stoppesubsubsubject", "stoppesubsubsubsection", "stoppesubsubsubsubject", "stoppesubsubsubsubsection", "stoppesubsubsubsubsubject", "stoppesuffixtext", "stoppesymbolset", "stoppetable", "stoppetablehead", "stoppetables", "stoppetabletail", "stoppetabletext", "stoppetabulate", "stoppetabulatehead", "stoppetabulatetail", "stoppetagged", "stoppetaglabeltext", "stoppetete", "stoppetexcode", "stoppetexdefinition", "stoppetext", "stoppetextbackground", "stoppetextbackgroundmanual", "stoppetextcolor", "stoppetextcolorintent", "stoppetextflow", "stoppetextmakeup", "stoppetitle", "stoppetokenlist", "stoppetokens", "stoppetransparent", "stoppetypescript", "stoppetypescriptcollection", "stoppetyping", "stoppeuniqueMPgraphic", "stoppeuniqueMPpagegraphic", "stoppeunittext", "stoppeunpacked", "stoppeusableMPgraphic", "stoppeuseMPgraphic", "stoppeusemathstyleparameter", "stoppeuserdata", "stoppeusingbtxspecification", "stoppeva", "stoppevbox", "stoppevboxregister", "stoppevboxtohbox", "stoppevboxtohboxseparator", "stoppeviewerlayer", "stoppevtop", "stoppevtopregister", "stoppexcell", "stoppexcellgroup", "stoppexcolumn", "stoppexgroup", "stoppexmldisplayverbatim", "stoppexmlinlineverbatim", "stoppexmlraw", "stoppexmlsetups", "stoppexrow", "stoppexrowgroup", "stoppextable", "stoppextablebody", "stoppextablefoot", "stoppextablehead", "stoppextablenext", "symbole", "tapebuffer", "textenotepdp", "traduire", "traiteblocs", "traitfin", "traitsfins", "uneligne", "utiliseJSscripts", "utiliseURL", "utiliseblocs", "utilisechemin", "utilisedocumentexterne", "utilisefigureexterne", "utilisemodule", "utilisepsiteaudioexterne", "utilisesymboles", "utiliseurl", "va", "vaalaboite", "vaalapage", "vaenbas", "valeurcouleur", "vide" },
+ ["it"]={ "GIORNOSETTIMANA", "Lettera", "Lettere", "MESE", "Numeri", "Numeriromani", "PAROLA", "PAROLE", "Parola", "Parole", "adattacampo", "adattalayout", "al", "allineacentro", "allineadestra", "allineasinistra", "ambiente", "ap", "apagina", "barracolori", "barrainterazione", "cambiaafontdeltesto", "campi", "capello", "chim", "circondato", "clonacampo", "colonna", "colore", "coloregrigio", "commento", "componenet", "confrontagruppocolori", "confrontatavolozza", "convertinumero", "copiacampo", "correggispaziobianco", "da", "daqualcheparte", "data", "datadioggi", "definisci", "definisciaccento", "definisciambientefontdeltesto", "definisciblocco", "definiscibloccosezione", "definiscibuffer", "definiscicampo", "definiscicapoversi", "definiscicarattere", "definiscicolore", "definiscicomando", "definisciconversione", "definiscidescrizione", "definiscidimensionicarta", "definiscielenco", "definiscielencocombinato", "definiscienumerazione", "definiscietichetta", "definiscifigurasimbolo", "definiscifont", "definiscifontdeltesto", "definisciformatoriferimento", "definiscigruppocolonne", "definiscigruppocolori", "definiscihbox", "definisciincorniciato", "definisciiniziatermina", "definiscilayout", "definiscimakeup", "definiscimarcatura", "definiscimenuinterazione", "definiscimodellotabella", "definiscioggettomobile", "definisciordinamento", "definisciprofilo", "definisciprogramma", "definisciregistro", "definisciriferimento", "definiscisezione", "definiscisimbolo", "definiscisinonimi", "definiscisinonimofont", "definiscisottocampo", "definiscisovrapposizione", "definiscistackcampi", "definiscistile", "definiscistilefont", "definiscitabulato", "definiscitavolozza", "definiscitesta", "definiscitesto", "definiscitestoincorniciato", "definiscitype", "definiscityping", "determinacaratteristicheregistro", "determinacarattersticheelenco", "determinanumerotesta", "elaborablocchi", "elementi", "elemento", "figuraesterna", "giornosettimana", "griglia", "ignoto", "impostaallineamento", "impostaampiezzariga", "impostabarrainterazione", "impostablocco", "impostabloccosezione", "impostabuffer", "impostacampi", "impostacampo", "impostacapoversi", "impostacaption", "impostacaptions", "impostacima", "impostaclippling", "impostacolonne", "impostacolore", "impostacolori", "impostacommento", "impostacommentopagina", "impostadimensionicarta", "impostaelementi", "impostaelencazioni", "impostaelenco", "impostaelencocombinato", "impostaenumerazioni", "impostafondo", "impostafontdeltesto", "impostaforms", "impostaformule", "impostagruppocolonne", "impostaincorniciato", "impostainiziatermina", "impostainstestazione", "impostainterazione", "impostainterlinea", "impostalayout", "impostalineemargine", "impostalineenere", "impostalineeriempimento", "impostalineesottili", "impostalineetesto", "impostalingua", "impostamaiuscole", "impostamakeup", "impostamarcatura", "impostamenuinterazione", "impostamenzione", "impostanotepdp", "impostanumerazionecapoversi", "impostanumerazionepagina", "impostanumerazionerighe", "impostanumeropagina", "impostanumerosottopagina", "impostanumerotesta", "impostaoggettimobili", "impostaoggettomobile", "impostaordinamento", "impostaparranging", "impostapdp", "impostapiustretto", "impostaposizionamento", "impostaposizionamentoopposti", "impostaprogrammi", "impostaregistro", "impostarientro", "impostariferimento", "impostarighe", "impostarigheriempimento", "impostarigovuoto", "impostarotazione", "impostaschermointerazione", "impostasegnosillabazione", "impostasetsimboli", "impostasfondi", "impostasfondo", "impostasinonimi", "impostaspaziatura", "impostaspaziobianco", "impostaspezzamentooggettomobile", "impostatabelle", "impostatabulato", "impostatavolozza", "impostatesta", "impostateste", "impostatesticima", "impostatestifondo", "impostatestiincorniciati", "impostatestiintestazioni", "impostatestipdp", "impostatesto", "impostatestotesti", "impostatolleranza", "impostatransizionepagina", "impostatype", "impostatyping", "impostaurl", "incorniciato", "iniziaJScode", "iniziaJSpreamble", "iniziaLUA", "iniziaMP", "iniziaMPclip", "iniziaMPcode", "iniziaMPdefinitions", "iniziaMPdrawing", "iniziaMPenvironment", "iniziaMPextensions", "iniziaMPinclusions", "iniziaMPinitializations", "iniziaMPpage", "iniziaMPpositiongraphic", "iniziaMPpositionmethod", "iniziaMPrun", "iniziaPARSEDXML", "iniziaTABLE", "iniziaTABLEbody", "iniziaTABLEfoot", "iniziaTABLEhead", "iniziaTABLEnext", "iniziaTC", "iniziaTD", "iniziaTDs", "iniziaTEX", "iniziaTEXpage", "iniziaTH", "iniziaTN", "iniziaTR", "iniziaTRs", "iniziaTX", "iniziaTY", "iniziaXML", "iniziaalign", "iniziaalignment", "iniziaallineacentro", "iniziaallineadestra", "iniziaallineasinistra", "iniziaallmodes", "iniziaambiente", "iniziaappendices", "iniziaarrangedpages", "iniziaaside", "iniziaattachment", "iniziabackmatter", "iniziabar", "iniziabbordermatrix", "iniziabitmapimage", "iniziablockquote", "iniziabodymatter", "iniziabordermatrix", "iniziaboxedcolumns", "iniziabtxlabeltext", "iniziabtxrenderingdefinitions", "iniziabuffer", "iniziacases", "iniziacatcodetable", "iniziacenteraligned", "iniziachapter", "iniziacharacteralign", "iniziacheckedfences", "iniziachemical", "iniziachemicaltext", "iniziacollect", "iniziacollecting", "iniziacolore", "iniziacolorintent", "iniziacoloronly", "iniziacolorset", "iniziacolumns", "iniziacolumnset", "iniziacolumnsetspan", "iniziacombination", "iniziacomment", "iniziacomponenet", "iniziacontextcode", "iniziacontextdefinitioncode", "iniziactxfunction", "iniziactxfunctiondefinition", "iniziacurrentcolor", "iniziacurrentlistentrywrapper", "iniziadelimited", "iniziadelimitedtext", "iniziadisplaymath", "iniziadmath", "iniziadocument", "iniziaeffect", "iniziaelement", "iniziaelemento", "iniziaembeddedxtable", "iniziaendnote", "iniziaendofline", "iniziaexceptions", "iniziaexpanded", "iniziaexpandedcollect", "iniziaextendedcatcodetable", "iniziaexternalfigurecollection", "iniziafacingfloat", "iniziafact", "iniziafigure", "iniziafiguretext", "iniziafittingpage", "iniziafixed", "iniziafloatcombination", "iniziafont", "iniziafontclass", "iniziafontsolution", "iniziafootnote", "iniziaformula", "iniziaformulas", "iniziaframedcell", "iniziaframedcontent", "iniziaframedrow", "iniziaframedtable", "iniziaframedtext", "iniziafrontmatter", "iniziagraphictext", "iniziagridsnapping", "iniziahanging", "iniziahbox", "iniziahboxestohbox", "iniziahboxregister", "iniziaheadtext", "iniziahelptext", "iniziahiding", "iniziahighlight", "iniziahyphenation", "iniziaimath", "iniziaimpaccato", "iniziaincorniciato", "iniziaindentation", "iniziaindentedtext", "iniziainteraction", "iniziainterface", "iniziaintermezzotext", "iniziaintertext", "iniziaitemgroup", "iniziaitemgroupcolumns", "iniziaitemize", "iniziaknockout", "inizialabeltext", "inizialayout", "inizialegend", "inizialinealignment", "inizialineamargine", "inizialineatesto", "inizialinecorrection", "inizialinefiller", "inizialinenumbering", "inizialines", "inizialinetable", "inizialinetablebody", "inizialinetablecell", "inizialinetablehead", "inizialingua", "inizialocalfootnotes", "inizialocalheadsetup", "inizialocallinecorrection", "inizialocalnotes", "inizialocalsetups", "inizialua", "inizialuacode", "inizialuaparameterset", "inizialuasetups", "iniziamakeup", "iniziamarginblock", "iniziamarkedcontent", "iniziamarkpages", "iniziamathalignment", "iniziamathcases", "iniziamathlabeltext", "iniziamathmatrix", "iniziamathmode", "iniziamathstyle", "iniziamatrices", "iniziamatrix", "iniziamaxaligned", "iniziamdformula", "iniziamenuinterattivo", "iniziamettiformula", "iniziamiddlealigned", "iniziamiddlemakeup", "iniziamixedcolumns", "iniziamode", "iniziamodeset", "iniziamodule", "iniziamoduletestsection", "iniziampformula", "inizianamedsection", "inizianamedsubformulas", "inizianarrow", "inizianarrower", "inizianegative", "inizianicelyfilledbox", "inizianointerference", "inizianotallmodes", "inizianotext", "inizianotmode", "iniziaoperatortext", "iniziaopposite", "iniziaoutputstream", "iniziaoverlay", "iniziaoverprint", "iniziapagecolumns", "iniziapagecomment", "iniziapagefigure", "iniziapagelayout", "iniziapagemakeup", "iniziapar", "iniziaparagraph", "iniziaparagraphs", "iniziaparagraphscell", "iniziaparbuilder", "iniziapart", "iniziapath", "iniziaplacechemical", "iniziaplacefigure", "iniziaplacefloat", "iniziaplacegraphic", "iniziaplaceintermezzo", "iniziaplacelegend", "iniziaplacepairedbox", "iniziaplacetable", "iniziapositioning", "iniziapositionoverlay", "iniziapositive", "iniziapostponing", "iniziapostponingnotes", "iniziaprefixtext", "iniziaprocessassignmentcommand", "iniziaprocessassignmentlist", "iniziaprocesscommacommand", "iniziaprocesscommalist", "iniziaprodotto", "iniziaprogetto", "iniziaprotect", "iniziaprotectedcolors", "iniziapubblicazione", "iniziapunctuation", "iniziaquotation", "iniziaquote", "iniziarandomized", "iniziarandomseed", "iniziarawsetups", "iniziareadingfile", "iniziareferenceprefix", "iniziaregime", "iniziareusableMPgraphic", "iniziariga", "iniziaruby", "iniziascript", "iniziasdformula", "iniziasection", "iniziasectionblock", "iniziasectionblockenvironment", "iniziasectionlevel", "iniziasetups", "iniziasfondo", "iniziashapebox", "iniziashift", "iniziasidebar", "iniziasimplecolumns", "iniziaspecialitem", "iniziaspeech", "iniziaspformula", "iniziasplitformula", "iniziasplittext", "iniziaspread", "iniziastandardmakeup", "iniziastaticMPfigure", "iniziastaticMPgraphic", "iniziastrictinspectnextcharacter", "iniziastrut", "iniziastyle", "iniziasubformulas", "iniziasubject", "iniziasubjectlevel", "iniziasubsection", "iniziasubsentence", "iniziasubstack", "iniziasubsubject", "iniziasubsubsection", "iniziasubsubsubject", "iniziasubsubsubsection", "iniziasubsubsubsubject", "iniziasubsubsubsubsection", "iniziasubsubsubsubsubject", "iniziasuffixtext", "iniziasymbolset", "iniziatable", "iniziatablehead", "iniziatables", "iniziatabletail", "iniziatabletext", "iniziatabulate", "iniziatabulatehead", "iniziatabulatetail", "iniziatagged", "iniziataglabeltext", "iniziatesta", "iniziatexcode", "iniziatexdefinition", "iniziatext", "iniziatextbackground", "iniziatextbackgroundmanual", "iniziatextcolor", "iniziatextcolorintent", "iniziatextflow", "iniziatextmakeup", "iniziatitle", "iniziatokenlist", "iniziatokens", "iniziatransparent", "iniziatypescript", "iniziatypescriptcollection", "iniziatyping", "iniziauniqueMPgraphic", "iniziauniqueMPpagegraphic", "iniziaunittext", "iniziaunpacked", "iniziausableMPgraphic", "iniziauseMPgraphic", "iniziausemathstyleparameter", "iniziauserdata", "iniziausingbtxspecification", "iniziavaia", "iniziavbox", "iniziavboxregister", "iniziavboxtohbox", "iniziavboxtohboxseparator", "iniziaviewerlayer", "iniziavtop", "iniziavtopregister", "iniziaxcell", "iniziaxcellgroup", "iniziaxcolumn", "iniziaxgroup", "iniziaxmldisplayverbatim", "iniziaxmlinlineverbatim", "iniziaxmlraw", "iniziaxmlsetups", "iniziaxrow", "iniziaxrowgroup", "iniziaxtable", "iniziaxtablebody", "iniziaxtablefoot", "iniziaxtablehead", "iniziaxtablenext", "inriga", "installalingua", "intorno", "lettera", "lettere", "lineanera", "lineasottile", "lineatesto", "lineenere", "lineeriempimento", "lineesottili", "lingua", "linguaprincipale", "lunghezzaelenco", "marcatura", "matematica", "menuinterattivo", "mese", "mettielenco", "mettielencocombinato", "mettifiancoafianco", "mettiformula", "mettiingriglia", "mettinotepdp", "mettinotepdplocali", "mettinumeropagina", "mettiregistro", "mettisegnalibro", "mettisottoformula", "mettiunosullaltro", "mostraambientefontdeltesto", "mostracolore", "mostracornice", "mostrafontdeltesto", "mostragriglia", "mostragruppocolori", "mostraimpostazioni", "mostralyout", "mostramakeup", "mostrasetsimboli", "mostrastampa", "mostrastruts", "mostratavolozza", "nascondiblocchi", "nientelineecimafondo", "nientelineintestazionepdp", "nientespazio", "nota", "numeri", "numeriromani", "numeroformula", "numeropagina", "numeropaginacompleto", "numerotesta", "numerotestacorrente", "pagina", "paroladestra", "ped", "pedap", "perlungo", "posizionanumerotesta", "posizionatestotesta", "posizione", "prendibuffer", "prendimarcatura", "prodotto", "progetto", "programma", "pulsante", "pulsantemenu", "pulsantinterazione", "punti", "qualcheriga", "reimpostamarcatura", "rif", "riferimento", "riferimentopagina", "riferimentotesto", "riflessione", "rigariempimento", "rigovuoto", "ruota", "scala", "schermo", "scrividentroelenco", "scriviinelenco", "segnalibro", "selezionablocchi", "settext", "sfondo", "simbolo", "spazifissi", "spazio", "spaziofisso", "spessoreriga", "spezzaoggettomobile", "stackcampi", "stirato", "terminaJScode", "terminaJSpreamble", "terminaLUA", "terminaMP", "terminaMPclip", "terminaMPcode", "terminaMPdefinitions", "terminaMPdrawing", "terminaMPenvironment", "terminaMPextensions", "terminaMPinclusions", "terminaMPinitializations", "terminaMPpage", "terminaMPpositiongraphic", "terminaMPpositionmethod", "terminaMPrun", "terminaPARSEDXML", "terminaTABLE", "terminaTABLEbody", "terminaTABLEfoot", "terminaTABLEhead", "terminaTABLEnext", "terminaTC", "terminaTD", "terminaTDs", "terminaTEX", "terminaTEXpage", "terminaTH", "terminaTN", "terminaTR", "terminaTRs", "terminaTX", "terminaTY", "terminaXML", "terminaalign", "terminaalignment", "terminaallineacentro", "terminaallineadestra", "terminaallineasinistra", "terminaallmodes", "terminaambiente", "terminaappendices", "terminaarrangedpages", "terminaaside", "terminaattachment", "terminabackmatter", "terminabar", "terminabbordermatrix", "terminabitmapimage", "terminablockquote", "terminabodymatter", "terminabordermatrix", "terminaboxedcolumns", "terminabtxlabeltext", "terminabtxrenderingdefinitions", "terminabuffer", "terminacases", "terminacatcodetable", "terminacenteraligned", "terminachapter", "terminacharacteralign", "terminacheckedfences", "terminachemical", "terminachemicaltext", "terminacollect", "terminacollecting", "terminacolore", "terminacolorintent", "terminacoloronly", "terminacolorset", "terminacolumns", "terminacolumnset", "terminacolumnsetspan", "terminacombination", "terminacomment", "terminacomponenet", "terminacontextcode", "terminacontextdefinitioncode", "terminactxfunction", "terminactxfunctiondefinition", "terminacurrentcolor", "terminacurrentlistentrywrapper", "terminadelimited", "terminadelimitedtext", "terminadisplaymath", "terminadmath", "terminadocument", "terminaeffect", "terminaelement", "terminaelemento", "terminaembeddedxtable", "terminaendnote", "terminaendofline", "terminaexceptions", "terminaexpanded", "terminaexpandedcollect", "terminaextendedcatcodetable", "terminaexternalfigurecollection", "terminafacingfloat", "terminafact", "terminafigure", "terminafiguretext", "terminafittingpage", "terminafixed", "terminafloatcombination", "terminafont", "terminafontclass", "terminafontsolution", "terminafootnote", "terminaformula", "terminaformulas", "terminaframedcell", "terminaframedcontent", "terminaframedrow", "terminaframedtable", "terminaframedtext", "terminafrontmatter", "terminagraphictext", "terminagridsnapping", "terminahanging", "terminahbox", "terminahboxestohbox", "terminahboxregister", "terminaheadtext", "terminahelptext", "terminahiding", "terminahighlight", "terminahyphenation", "terminaimath", "terminaimpaccato", "terminaincorniciato", "terminaindentation", "terminaindentedtext", "terminainteraction", "terminainterface", "terminaintermezzotext", "terminaintertext", "terminaitemgroup", "terminaitemgroupcolumns", "terminaitemize", "terminaknockout", "terminalabeltext", "terminalayout", "terminalegend", "terminalinealignment", "terminalineamargine", "terminalineatesto", "terminalinecorrection", "terminalinefiller", "terminalinenumbering", "terminalines", "terminalinetable", "terminalinetablebody", "terminalinetablecell", "terminalinetablehead", "terminalingua", "terminalocalfootnotes", "terminalocalheadsetup", "terminalocallinecorrection", "terminalocalnotes", "terminalocalsetups", "terminalua", "terminaluacode", "terminaluaparameterset", "terminaluasetups", "terminamakeup", "terminamarginblock", "terminamarkedcontent", "terminamarkpages", "terminamathalignment", "terminamathcases", "terminamathlabeltext", "terminamathmatrix", "terminamathmode", "terminamathstyle", "terminamatrices", "terminamatrix", "terminamaxaligned", "terminamdformula", "terminamenuinterattivo", "terminamettiformula", "terminamiddlealigned", "terminamiddlemakeup", "terminamixedcolumns", "terminamode", "terminamodeset", "terminamodule", "terminamoduletestsection", "terminampformula", "terminanamedsection", "terminanamedsubformulas", "terminanarrow", "terminanarrower", "terminanegative", "terminanicelyfilledbox", "terminanointerference", "terminanotallmodes", "terminanotext", "terminanotmode", "terminaoperatortext", "terminaopposite", "terminaoutputstream", "terminaoverlay", "terminaoverprint", "terminapagecolumns", "terminapagecomment", "terminapagefigure", "terminapagelayout", "terminapagemakeup", "terminapar", "terminaparagraph", "terminaparagraphs", "terminaparagraphscell", "terminaparbuilder", "terminapart", "terminapath", "terminaplacechemical", "terminaplacefigure", "terminaplacefloat", "terminaplacegraphic", "terminaplaceintermezzo", "terminaplacelegend", "terminaplacepairedbox", "terminaplacetable", "terminapositioning", "terminapositionoverlay", "terminapositive", "terminapostponing", "terminapostponingnotes", "terminaprefixtext", "terminaprocessassignmentcommand", "terminaprocessassignmentlist", "terminaprocesscommacommand", "terminaprocesscommalist", "terminaprodotto", "terminaprogetto", "terminaprotect", "terminaprotectedcolors", "terminapubblicazione", "terminapunctuation", "terminaquotation", "terminaquote", "terminarandomized", "terminarandomseed", "terminarawsetups", "terminareadingfile", "terminareferenceprefix", "terminaregime", "terminareusableMPgraphic", "terminariga", "terminaruby", "terminascript", "terminasdformula", "terminasection", "terminasectionblock", "terminasectionblockenvironment", "terminasectionlevel", "terminasetups", "terminasfondo", "terminashapebox", "terminashift", "terminasidebar", "terminasimplecolumns", "terminaspecialitem", "terminaspeech", "terminaspformula", "terminasplitformula", "terminasplittext", "terminaspread", "terminastandardmakeup", "terminastaticMPfigure", "terminastaticMPgraphic", "terminastrictinspectnextcharacter", "terminastrut", "terminastyle", "terminasubformulas", "terminasubject", "terminasubjectlevel", "terminasubsection", "terminasubsentence", "terminasubstack", "terminasubsubject", "terminasubsubsection", "terminasubsubsubject", "terminasubsubsubsection", "terminasubsubsubsubject", "terminasubsubsubsubsection", "terminasubsubsubsubsubject", "terminasuffixtext", "terminasymbolset", "terminatable", "terminatablehead", "terminatables", "terminatabletail", "terminatabletext", "terminatabulate", "terminatabulatehead", "terminatabulatetail", "terminatagged", "terminataglabeltext", "terminatesta", "terminatexcode", "terminatexdefinition", "terminatext", "terminatextbackground", "terminatextbackgroundmanual", "terminatextcolor", "terminatextcolorintent", "terminatextflow", "terminatextmakeup", "terminatitle", "terminatokenlist", "terminatokens", "terminatransparent", "terminatypescript", "terminatypescriptcollection", "terminatyping", "terminauniqueMPgraphic", "terminauniqueMPpagegraphic", "terminaunittext", "terminaunpacked", "terminausableMPgraphic", "terminauseMPgraphic", "terminausemathstyleparameter", "terminauserdata", "terminausingbtxspecification", "terminavaia", "terminavbox", "terminavboxregister", "terminavboxtohbox", "terminavboxtohboxseparator", "terminaviewerlayer", "terminavtop", "terminavtopregister", "terminaxcell", "terminaxcellgroup", "terminaxcolumn", "terminaxgroup", "terminaxmldisplayverbatim", "terminaxmlinlineverbatim", "terminaxmlraw", "terminaxmlsetups", "terminaxrow", "terminaxrowgroup", "terminaxtable", "terminaxtablebody", "terminaxtablefoot", "terminaxtablehead", "terminaxtablenext", "testonotapdp", "testoriempimento", "tieniblocchi", "traduci", "usaJSscripts", "usaURL", "usablocco", "usacartella", "usacolonnasonoraesterna", "usadocumentoesterno", "usafiguraesterna", "usamodulo", "usasimboli", "usaurl", "vaia", "vaiabox", "vaiapagina", "vaigiu", "valorecolore", "versione" },
+ ["nl"]={ "Cijfers", "Kap", "Letter", "Letters", "MAAND", "Romeins", "WEEKDAG", "WOORD", "WOORDEN", "Woord", "Woorden", "achtergrond", "bepaalkopnummer", "bepaallijstkenmerken", "bepaalregisterkenmerken", "bewaarbuffer", "blanko", "blokje", "blokjes", "cijfers", "converteernummer", "copieerveld", "corrigeerwitruimte", "datum", "definieer", "definieeraccent", "definieeralineas", "definieerblok", "definieerbuffer", "definieercombinatie", "definieercommando", "definieerconversie", "definieerfiguursymbool", "definieerfont", "definieerfontstijl", "definieerfontsynoniem", "definieerhbox", "definieeringesprongentext", "definieerinteractiemenu", "definieeritemgroep", "definieerkadertekst", "definieerkarakter", "definieerkleur", "definieerkleurgroep", "definieerkolomgroep", "definieerkolomovergang", "definieerkop", "definieerkorps", "definieerkorpsomgeving", "definieerlayer", "definieerlayout", "definieerletter", "definieerlijst", "definieermarkering", "definieeromlijnd", "definieeropmaak", "definieeroverlay", "definieerpaginaovergang", "definieerpalet", "definieerpapierformaat", "definieerplaats", "definieerplaatsblok", "definieerprofiel", "definieerprogramma", "definieerreferentie", "definieerreferentieformaat", "definieerregister", "definieersamengesteldelijst", "definieersectie", "definieersectieblok", "definieersorteren", "definieerstartstop", "definieersubveld", "definieersymbool", "definieersynoniemen", "definieertabelvorm", "definieertabulatie", "definieertekst", "definieertekstachtergrond", "definieertype", "definieertypen", "definieerveld", "definieerveldstapel", "definieerwiskundeuitlijnen", "doordefinieren", "doorlabelen", "doornummeren", "dunnelijn", "dunnelijnen", "eenregel", "ergens", "externfiguur", "formulenummer", "gebruikJSscripts", "gebruikURL", "gebruikblokken", "gebruikexterndocument", "gebruikexternfiguur", "gebruikexterngeluidsfragment", "gebruikmodule", "gebruikpad", "gebruiksymbolen", "gebruiktypescript", "gebruiktypescriptfile", "gebruikurl", "geenbovenenonderregels", "geenhoofdenvoetregels", "geenspatie", "grijskleur", "haalbuffer", "haalmarkering", "haarlijn", "handhaafblokken", "hoofdtaal", "hoog", "huidigedatum", "huidigekopnummer", "inlijnd", "inregel", "installeertaal", "interactiebalk", "interactiebuttons", "interactiemenu", "invullijnen", "invulregel", "invultekst", "kleur", "kleurenbalk", "kleurwaarde", "kloonveld", "kolom", "kopnummer", "laag", "laho", "legeregels", "letter", "letters", "lijndikte", "lijstlengte", "maand", "markeer", "naar", "naarbox", "naarpagina", "nokap", "noot", "omgeving", "omlaag", "omlijnd", "onbekend", "onderdeel", "op", "oppagina", "pagina", "paginanummer", "paginareferentie", "paslayoutaan", "passendveld", "plaatsbookmarks", "plaatsformule", "plaatskopnummer", "plaatskoptekst", "plaatslijst", "plaatslijstmetsynoniemen", "plaatslokalevoetnoten", "plaatsnaastelkaar", "plaatsonderelkaar", "plaatsopgrid", "plaatspaginanummer", "plaatsplaatsblok", "plaatsregister", "plaatsruwelijst", "plaatssamengesteldelijst", "plaatssubformule", "plaatsvoetnoten", "positioneer", "produkt", "programma", "projekt", "punten", "refereer", "referentie", "regellinks", "regelmidden", "regelrechts", "resetmarkering", "romeins", "rooster", "roteer", "schaal", "scherm", "schrijfnaarlijst", "schrijftussenlijst", "selecteerblokken", "som", "spatie", "spiegel", "splitsplaatsblok", "startachtergrond", "startinteractiemenu", "startkantlijn", "startkleur", "startkop", "startlokalevoetnoten", "startmargeblok", "startnaar", "startomgeving", "startomlijnd", "startonderdeel", "startopelkaar", "startplaatsformule", "startplaatsplaatsblok", "startprodukt", "startprojekt", "startpublicatie", "startregel", "startregelcorrectie", "startregellinks", "startregelmidden", "startregelrechts", "startsom", "starttaal", "starttekstachtergrond", "starttekstlijn", "startuitlijnen", "stelachtergrondenin", "stelachtergrondin", "stelalineasin", "stelarrangerenin", "stelblankoin", "stelblokin", "stelblokjesin", "stelblokkopjein", "stelblokkopjesin", "stelbovenin", "stelboventekstenin", "stelbufferin", "stelciterenin", "stelclipin", "stelcommentaarin", "steldoordefinierenin", "steldoornummerenin", "steldunnelijnenin", "stelformulein", "stelformulesin", "stelformulierenin", "stelhoofdin", "stelhoofdtekstenin", "stelingesprongentextin", "stelinmargein", "stelinspringenin", "stelinteractiebalkin", "stelinteractiein", "stelinteractiemenuin", "stelinteractieschermin", "stelinterliniein", "stelinvullijnenin", "stelinvulregelsin", "stelitemgroepin", "stelitemsin", "stelkadertekstenin", "stelkadertekstin", "stelkantlijnin", "stelkapitalenin", "stelkleurenin", "stelkleurin", "stelkolomgroepin", "stelkolomgroepregelsin", "stelkolomgroepstartin", "stelkolommenin", "stelkopin", "stelkopnummerin", "stelkoppeltekenin", "stelkoppenin", "stelkorpsin", "stellayoutin", "stellijndiktein", "stellijstin", "stelmargeblokkenin", "stelmarkeringin", "stelnaastplaatsenin", "stelomlijndin", "stelonderin", "stelondertekstenin", "stelopmaakin", "stelopsommingenin", "stelpaginacommentaarin", "stelpaginanummerin", "stelpaginanummeringin", "stelpaginaovergangenin", "stelpaletin", "stelpapierformaatin", "stelpapierin", "stelparagraafnummerenin", "stelplaatsblokin", "stelplaatsblokkenin", "stelplaatsbloksplitsenin", "stelplaatsin", "stelpositionerenin", "stelprogrammasin", "stelrefererenin", "stelregelnummerenin", "stelregelsin", "stelregisterin", "stelroterenin", "stelsamengesteldelijstin", "stelsectieblokin", "stelsmallerin", "stelsorterenin", "stelspatieringin", "stelstartstopin", "stelsubpaginanummerin", "stelsymboolsetin", "stelsynoniemenin", "steltaalin", "steltabellenin", "steltabulatiein", "steltekstachtergrondin", "steltekstin", "steltekstinhoudin", "steltekstlijnenin", "stelteksttekstenin", "steltolerantiein", "steltypein", "steltypenin", "steluitlijnenin", "stelurlin", "stelveldenin", "stelveldin", "stelvoetin", "stelvoetnotenin", "stelvoettekstenin", "stelwiskundeuitlijnenin", "stelwitruimtein", "stopachtergrond", "stopinteractiemenu", "stopkantlijn", "stopkleur", "stopkop", "stoplokalevoetnoten", "stopmargeblok", "stopnaar", "stopomgeving", "stopomlijnd", "stoponderdeel", "stopopelkaar", "stopplaatsformule", "stopplaatsplaatsblok", "stopprodukt", "stopprojekt", "stoppublicatie", "stopregel", "stopregelcorrectie", "stopregellinks", "stopregelmidden", "stopregelrechts", "stopsom", "stoptaal", "stoptekstachtergrond", "stoptekstlijn", "stopuitlijnen", "subpaginanummer", "switchnaarkorps", "symbool", "taal", "tekstlijn", "tekstreferentie", "testkolom", "testpagina", "toelichting", "toongrid", "tooninstellingen", "toonkader", "toonkleur", "toonkleurgroep", "toonkorps", "toonkorpsomgeving", "toonlayout", "toonopmaak", "toonpalet", "toonprint", "toonstruts", "toonsymboolset", "uit", "uitgerekt", "vastespatie", "vastespaties", "veld", "veldstapel", "verbergblokken", "vergelijkkleurgroep", "vergelijkpalet", "versie", "vertaal", "verwerkblokken", "voetnoottekst", "volledigepaginanummer", "volledigregister", "voluit", "weekdag", "wiskunde", "woordrechts" },
+ ["pe"]={ "آیتم", "آیتمها", "آینه", "از", "استÙاده‌بلوکها", "استÙاده‌دستخط‌تایپ", "استÙاده‌شکل‌خارجی", "استÙاده‌قطعه‌موزیک‌خارجی", "استÙاده‌مدول", "استÙاده‌مسیر", "استÙاده‌نمادها", "استÙاده‌نوشتارخارجی", "استÙاده‌پرونده‌دستخط‌تایپ", "اعدادلاتین", "اÙزودن", "انتخاب‌بلوکها", "بارگذاری‌آرایش", "بارگذاری‌آیتمها", "بارگذاری‌ارجاع", "بارگذاری‌اندازه‌برگ", "بارگذاری‌باریکتر", "بارگذاری‌باÙر", "بارگذاری‌بالا", "بارگذاری‌بردباری", "بارگذاری‌برنامه‌ها", "بارگذاری‌برگ", "بارگذاری‌بلوک", "بارگذاری‌بلوک‌بخش", "بارگذاری‌تایپ", "بارگذاری‌تایپ‌کردن", "بارگذاری‌ترتیب", "بارگذاری‌تنظیم", "بارگذاری‌تنظیم‌ریاضی", "بارگذاری‌ته‌برگ", "بارگذاری‌تورÙتگی", "بارگذاری‌توضیح", "بارگذاری‌توضیح‌صÙحه", "بارگذاری‌ثبت", "بارگذاری‌جانشانی", "بارگذاری‌جدولها", "بارگذاری‌جدول‌بندی", "بارگذاری‌خالی", "بارگذاری‌خطها", "بارگذاری‌خطهای‌حاشیه", "بارگذاری‌خطهای‌سیاه", "بارگذاری‌خطهای‌متن", "بارگذاری‌خطهای‌مجموعه‌ستون", "بارگذاری‌خطها‌ی‌نازک", "بارگذاری‌درج‌درخطها", "بارگذاری‌درج‌مخالÙ", "بارگذاری‌دوران", "بارگذاری‌رنگ", "بارگذاری‌رنگها", "بارگذاری‌زبان", "بارگذاری‌ستونها", "بارگذاری‌سر", "بارگذاری‌سربرگ", "بارگذاری‌سرها", "بارگذاری‌شرح", "بارگذاری‌شرحها", "بارگذاری‌شروع‌مجموعه‌ستون", "بارگذاری‌شروع‌پایان", "بارگذاری‌شماره‌زیرصÙحه", "بارگذاری‌شماره‌سر", "بارگذاری‌شماره‌صÙحه", "بارگذاری‌شماره‌گذاریها", "بارگذاری‌شماره‌گذاری‌صÙحه", "بارگذاری‌شماره‌گذاری‌پاراگراÙ", "بارگذاری‌شماره‌‌گذاری‌خط", "بارگذاری‌شناور", "بارگذاری‌شناورها", "بارگذاری‌شکاÙتن‌شناورها", "بارگذاری‌طرح", "بارگذاری‌طرح‌بندی", "بارگذاری‌عرض‌خط", "بارگذاری‌Ùاصله‌بین‌خط", "بارگذاری‌Ùرمولها", "بارگذاری‌Ùضای‌سÙید", "بارگذاری‌Ùضا‌گذاری", "بارگذاری‌قالبی", "بارگذاری‌قلم‌متن", "بارگذاری‌لوح", "بارگذاری‌لیست", "بارگذاری‌لیست‌ترکیبی", "بارگذاری‌مترادÙها", "بارگذاری‌متن", "بارگذاری‌متنهای‌بالا", "بارگذاری‌متن‌سربرگ", "بارگذاری‌متن‌قالبی", "بارگذاری‌متن‌متنها", "بارگذاری‌متن‌پانوشت", "بارگذاری‌متن‌پایین", "بارگذاری‌مجموعه‌ستون", "بارگذاری‌مجموعه‌نماد", "بارگذاری‌منوی‌پانل", "بارگذاری‌مکان‌گذاری", "بارگذاری‌میدان", "بارگذاری‌میدانها", "بارگذاری‌میله‌پانل", "بارگذاری‌نشانه‌شکستن", "بارگذاری‌نشانه‌گذاری", "بارگذاری‌نقل", "بارگذاری‌پاراگراÙها", "بارگذاری‌پانل", "بارگذاری‌پانوشتها", "بارگذاری‌پایین", "بارگذاری‌پرده‌پانل", "بارگذاری‌پرکردن‌خطها", "بارگذاری‌پس‌زمینه", "بارگذاری‌پس‌زمینه‌ها", "بارگذاری‌چیدن", "بارگذاری‌گذارصÙحه", "بارگذاری‌گروههای‌آیتم", "بارگذاری‌گروه‌آیتم", "بازنشانی‌نشانه‌گذاری", "بدون‌خط‌بالاوپایین", "بدون‌خط‌سروته‌برگ", "بدون‌Ùضا", "برنامه", "بروبه", "بروبه‌جعبه", "بروبه‌صÙحه", "بروپایین", "بلند", "بلوکهای‌پردازش", "بلوکها‌پنهان", "بنویس‌بین‌لیست", "بنویس‌در‌لیست", "تاریخ", "تاریخ‌جاری", "تایپ", "تایپ‌باÙر", "تایپ‌پرونده", "ترجمه", "تعریÙ", "تعریÙ‌آرایش", "تعریÙ‌الگوی‌جدول", "تعریÙ‌اندازه‌برگ", "تعریÙ‌باÙر", "تعریÙ‌بخش", "تعریÙ‌برنامه", "تعریÙ‌برچسب", "تعریÙ‌بلوک", "تعریÙ‌بلوک‌بخش", "تعریÙ‌تایپ", "تعریÙ‌تایپ‌کردن", "تعریÙ‌تبدیل", "تعریÙ‌ترتیب", "تعریÙ‌ترکیب", "تعریÙ‌تنظیم‌ریاضی", "تعریÙ‌توده‌میدان", "تعریÙ‌ثبت", "تعریÙ‌جانشانی", "تعریÙ‌جدول‌بندی", "تعریÙ‌جعبه‌‌اÙÙ‚ÛŒ", "تعریÙ‌حرÙ", "تعریÙ‌رنگ", "تعریÙ‌زیرمیدان", "تعریÙ‌سبک", "تعریÙ‌سبک‌قلم", "تعریÙ‌سر", "تعریÙ‌شرح", "تعریÙ‌شروع‌پایان", "تعریÙ‌شماره‌بندی", "تعریÙ‌شمایل‌مرجع", "تعریÙ‌شناور", "تعریÙ‌شکستن‌ستون", "تعریÙ‌شکست‌صÙحه", "تعریÙ‌طرح‌بندی", "تعریÙ‌Ùرمان", "تعریÙ‌قالبی", "تعریÙ‌قلم", "تعریÙ‌قلم‌متن", "تعریÙ‌لایه", "تعریÙ‌لهجه", "تعریÙ‌لوح", "تعریÙ‌لیست", "تعریÙ‌لیست‌ترکیبی", "تعریÙ‌مترادÙها", "تعریÙ‌مترادÙ‌قلم", "تعریÙ‌متن", "تعریÙ‌متن‌قالبی", "تعریÙ‌مجموعه‌ستون", "تعریÙ‌محیط‌قلم‌بدنه", "تعریÙ‌مرجع", "تعریÙ‌منوی‌پانل", "تعریÙ‌میدان", "تعریÙ‌نشانه‌گذاری", "تعریÙ‌نماد", "تعریÙ‌نمادشکل", "تعریÙ‌پاراگراÙها", "تعریÙ‌پروÙایل", "تعریÙ‌پوشش", "تعریÙ‌گروه‌آیتم", "تعریÙ‌گروه‌رنگ", "تعیین‌شماره‌سر", "تعیین‌محتوای‌متن", "تعیین‌مشخصات‌ثبت", "تعیین‌مشخصات‌لیست", "تغییربه‌قلم‌بدنه", "تنظیم‌راست", "تنظیم‌طرح‌بندی", "تنظیم‌وسط", "توجه", "توری", "تولید", "تک", "ثبت‌کامل", "حرÙ", "حرÙها", "Ø­Ùظ‌بلوکها", "خالی", "خطهای‌سیاه", "خطهای‌نازک", "خطها‌خالی", "خط‌سیاه", "خط‌متن", "خط‌مو", "خط‌نازک", "خ‌ا", "خ‌ع", "در", "درج‌ثبت", "درج‌درخط", "درج‌درخطها", "درج‌درمتن", "درج‌در‌بالای‌یکدیگر", "درج‌در‌توری", "درج‌زیرÙرمول", "درج‌شماره‌سر", "درج‌شماره‌صÙحه", "درج‌شناور", "درج‌Ùرمول", "درج‌لیست", "درج‌لیست‌خام", "درج‌لیست‌مختلط", "درج‌متن‌سر", "درج‌پانوشتها", "درج‌پانوشتهای‌موضعی", "درج‌چوب‌خط", "درج‌کنار‌به‌کنار", "درخط", "درصÙحه", "درقالبی", "درمورد", "درون", "درپر", "دریاÙت‌باÙر", "دریاÙت‌نشانه", "دوران", "دکمه", "دکمه‌منو", "دکمه‌پانل", "رج", "رنگ", "رنگ‌خاکستری", "روزهÙته", "ریاضی", "زبان", "زبان‌اصلی", "ستون", "ستون‌امتحان", "سرپوش‌کوچک‌نه", "شروعJScode", "شروعJSpreamble", "شروعLUA", "شروعMP", "شروعMPclip", "شروعMPcode", "شروعMPdefinitions", "شروعMPdrawing", "شروعMPenvironment", "شروعMPextensions", "شروعMPinclusions", "شروعMPinitializations", "شروعMPpage", "شروعMPpositiongraphic", "شروعMPpositionmethod", "شروعMPrun", "شروعPARSEDXML", "شروعTABLE", "شروعTABLEbody", "شروعTABLEfoot", "شروعTABLEhead", "شروعTABLEnext", "شروعTC", "شروعTD", "شروعTDs", "شروعTEX", "شروعTEXpage", "شروعTH", "شروعTN", "شروعTR", "شروعTRs", "شروعTX", "شروعTY", "شروعXML", "شروعalign", "شروعalignment", "شروعallmodes", "شروعappendices", "شروعarrangedpages", "شروعaside", "شروعattachment", "شروعbackmatter", "شروعbar", "شروعbbordermatrix", "شروعbitmapimage", "شروعblockquote", "شروعbodymatter", "شروعbordermatrix", "شروعboxedcolumns", "شروعbtxlabeltext", "شروعbtxrenderingdefinitions", "شروعbuffer", "شروعcases", "شروعcatcodetable", "شروعcenteraligned", "شروعchapter", "شروعcharacteralign", "شروعcheckedfences", "شروعchemical", "شروعchemicaltext", "شروعcollect", "شروعcollecting", "شروعcolorintent", "شروعcoloronly", "شروعcolorset", "شروعcolumns", "شروعcolumnset", "شروعcolumnsetspan", "شروعcombination", "شروعcomment", "شروعcontextcode", "شروعcontextdefinitioncode", "شروعctxfunction", "شروعctxfunctiondefinition", "شروعcurrentcolor", "شروعcurrentlistentrywrapper", "شروعdelimited", "شروعdelimitedtext", "شروعdisplaymath", "شروعdmath", "شروعdocument", "شروعeffect", "شروعelement", "شروعembeddedxtable", "شروعendnote", "شروعendofline", "شروعexceptions", "شروعexpanded", "شروعexpandedcollect", "شروعextendedcatcodetable", "شروعexternalfigurecollection", "شروعfacingfloat", "شروعfact", "شروعfigure", "شروعfiguretext", "شروعfittingpage", "شروعfixed", "شروعfloatcombination", "شروعfont", "شروعfontclass", "شروعfontsolution", "شروعfootnote", "شروعformula", "شروعformulas", "شروعframedcell", "شروعframedcontent", "شروعframedrow", "شروعframedtable", "شروعframedtext", "شروعfrontmatter", "شروعgraphictext", "شروعgridsnapping", "شروعhanging", "شروعhbox", "شروعhboxestohbox", "شروعhboxregister", "شروعheadtext", "شروعhelptext", "شروعhiding", "شروعhighlight", "شروعhyphenation", "شروعimath", "شروعindentation", "شروعindentedtext", "شروعinteraction", "شروعinterface", "شروعintermezzotext", "شروعintertext", "شروعitemgroup", "شروعitemgroupcolumns", "شروعitemize", "شروعknockout", "شروعlabeltext", "شروعlayout", "شروعlegend", "شروعlinealignment", "شروعlinecorrection", "شروعlinefiller", "شروعlinenumbering", "شروعlines", "شروعlinetable", "شروعlinetablebody", "شروعlinetablecell", "شروعlinetablehead", "شروعlocalfootnotes", "شروعlocalheadsetup", "شروعlocallinecorrection", "شروعlocalnotes", "شروعlocalsetups", "شروعlua", "شروعluacode", "شروعluaparameterset", "شروعluasetups", "شروعmakeup", "شروعmarginblock", "شروعmarkedcontent", "شروعmarkpages", "شروعmathalignment", "شروعmathcases", "شروعmathlabeltext", "شروعmathmatrix", "شروعmathmode", "شروعmathstyle", "شروعmatrices", "شروعmatrix", "شروعmaxaligned", "شروعmdformula", "شروعmiddlealigned", "شروعmiddlemakeup", "شروعmixedcolumns", "شروعmode", "شروعmodeset", "شروعmodule", "شروعmoduletestsection", "شروعmpformula", "شروعnamedsection", "شروعnamedsubformulas", "شروعnarrow", "شروعnarrower", "شروعnegative", "شروعnicelyfilledbox", "شروعnointerference", "شروعnotallmodes", "شروعnotext", "شروعnotmode", "شروعoperatortext", "شروعopposite", "شروعoutputstream", "شروعoverlay", "شروعoverprint", "شروعpagecolumns", "شروعpagecomment", "شروعpagefigure", "شروعpagelayout", "شروعpagemakeup", "شروعpar", "شروعparagraph", "شروعparagraphs", "شروعparagraphscell", "شروعparbuilder", "شروعpart", "شروعpath", "شروعplacechemical", "شروعplacefigure", "شروعplacegraphic", "شروعplaceintermezzo", "شروعplacelegend", "شروعplacepairedbox", "شروعplacetable", "شروعpositioning", "شروعpositionoverlay", "شروعpositive", "شروعpostponing", "شروعpostponingnotes", "شروعprefixtext", "شروعprocessassignmentcommand", "شروعprocessassignmentlist", "شروعprocesscommacommand", "شروعprocesscommalist", "شروعprotect", "شروعprotectedcolors", "شروعpunctuation", "شروعquotation", "شروعquote", "شروعrandomized", "شروعrandomseed", "شروعrawsetups", "شروعreadingfile", "شروعreferenceprefix", "شروعregime", "شروعreusableMPgraphic", "شروعruby", "شروعscript", "شروعsdformula", "شروعsection", "شروعsectionblock", "شروعsectionblockenvironment", "شروعsectionlevel", "شروعsetups", "شروعshapebox", "شروعshift", "شروعsidebar", "شروعsimplecolumns", "شروعspecialitem", "شروعspeech", "شروعspformula", "شروعsplitformula", "شروعsplittext", "شروعspread", "شروعstandardmakeup", "شروعstaticMPfigure", "شروعstaticMPgraphic", "شروعstrictinspectnextcharacter", "شروعstrut", "شروعstyle", "شروعsubformulas", "شروعsubject", "شروعsubjectlevel", "شروعsubsection", "شروعsubsentence", "شروعsubstack", "شروعsubsubject", "شروعsubsubsection", "شروعsubsubsubject", "شروعsubsubsubsection", "شروعsubsubsubsubject", "شروعsubsubsubsubsection", "شروعsubsubsubsubsubject", "شروعsuffixtext", "شروعsymbolset", "شروعtable", "شروعtablehead", "شروعtables", "شروعtabletail", "شروعtabletext", "شروعtabulate", "شروعtabulatehead", "شروعtabulatetail", "شروعtagged", "شروعtaglabeltext", "شروعtexcode", "شروعtexdefinition", "شروعtext", "شروعtextbackground", "شروعtextbackgroundmanual", "شروعtextcolor", "شروعtextcolorintent", "شروعtextflow", "شروعtextmakeup", "شروعtitle", "شروعtokenlist", "شروعtokens", "شروعtransparent", "شروعtypescript", "شروعtypescriptcollection", "شروعtyping", "شروعuniqueMPgraphic", "شروعuniqueMPpagegraphic", "شروعunittext", "شروعunpacked", "شروعusableMPgraphic", "شروعuseMPgraphic", "شروعusemathstyleparameter", "شروعuserdata", "شروعusingbtxspecification", "شروعvbox", "شروعvboxregister", "شروعvboxtohbox", "شروعvboxtohboxseparator", "شروعviewerlayer", "شروعvtop", "شروعvtopregister", "شروعxcell", "شروعxcellgroup", "شروعxcolumn", "شروعxgroup", "شروعxmldisplayverbatim", "شروعxmlinlineverbatim", "شروعxmlraw", "شروعxmlsetups", "شروعxrow", "شروعxrowgroup", "شروعxtable", "شروعxtablebody", "شروعxtablefoot", "شروعxtablehead", "شروعxtablenext", "شروعآیتم", "شروعبروبه", "شروعتنظیم‌راست", "شروعتنظیم‌وسط", "شروعتولید", "شروعخط‌حاشیه", "شروعخط‌متن", "شروعدرج‌شناور", "شروعدرج‌Ùرمول", "شروعرنگ", "شروعزبان", "شروعسر", "شروعÙشرده", "شروعقالبی", "شروعمحیط", "شروعمنوی‌پانل", "شروعمولÙÙ‡", "شروعنشر", "شروعپروژه", "شروعپس‌زمینه", "شروعچپ‌چین", "شروع‌خط", "شماره‌زیرصÙحه", "شماره‌سر", "شماره‌سرجاری", "شماره‌صÙحه", "شماره‌صÙحه‌کامل", "شماره‌Ùرمول", "شماره‌مبدل", "شماره‌ها", "شکاÙتن‌شناور", "شکل‌خارجی", "صÙحه", "صÙحه‌تست", "طول‌لیست", "عرض‌خط", "Ùضا", "Ùضاهای‌ثابت", "Ùضای‌ثابت", "Ùضای‌سÙیدصحیح", "قالبی", "لوح‌مقایسه", "ماه", "متن‌پانوشت", "محیط", "مراجعه", "مرجع", "مرجع‌صÙحه", "مرجع‌متن", "مقایسه‌گروه‌رنگ", "مقداررنگ", "مقیاس", "منوی‌پانل", "مولÙÙ‡", "مکان", "میدان", "میدان‌شبیه‌سازی", "میدان‌پشته", "میدان‌کپی", "میله‌رنگ", "میله‌پانل", "ناشناس", "نسخه", "نشانه‌گذاری", "نصب‌زبان", "نقطه‌ها", "نماد", "نمایش‌آرایش", "نمایش‌بارگذاریها", "نمایش‌بستها", "نمایش‌توری", "نمایش‌رنگ", "نمایش‌طرح‌بندی", "نمایش‌قالب", "نمایش‌قلم‌بدنه", "نمایش‌لوح", "نمایش‌مجموعه‌علامت", "نمایش‌محیط‌قلم‌بدنه", "نمایش‌چاپ", "نمایش‌گروه‌رنگ", "پابا", "پایانJScode", "پایانJSpreamble", "پایانLUA", "پایانMP", "پایانMPclip", "پایانMPcode", "پایانMPdefinitions", "پایانMPdrawing", "پایانMPenvironment", "پایانMPextensions", "پایانMPinclusions", "پایانMPinitializations", "پایانMPpage", "پایانMPpositiongraphic", "پایانMPpositionmethod", "پایانMPrun", "پایانPARSEDXML", "پایانTABLE", "پایانTABLEbody", "پایانTABLEfoot", "پایانTABLEhead", "پایانTABLEnext", "پایانTC", "پایانTD", "پایانTDs", "پایانTEX", "پایانTEXpage", "پایانTH", "پایانTN", "پایانTR", "پایانTRs", "پایانTX", "پایانTY", "پایانXML", "پایانalign", "پایانalignment", "پایانallmodes", "پایانappendices", "پایانarrangedpages", "پایانaside", "پایانattachment", "پایانbackmatter", "پایانbar", "پایانbbordermatrix", "پایانbitmapimage", "پایانblockquote", "پایانbodymatter", "پایانbordermatrix", "پایانboxedcolumns", "پایانbtxlabeltext", "پایانbtxrenderingdefinitions", "پایانbuffer", "پایانcases", "پایانcatcodetable", "پایانcenteraligned", "پایانchapter", "پایانcharacteralign", "پایانcheckedfences", "پایانchemical", "پایانchemicaltext", "پایانcollect", "پایانcollecting", "پایانcolorintent", "پایانcoloronly", "پایانcolorset", "پایانcolumns", "پایانcolumnset", "پایانcolumnsetspan", "پایانcombination", "پایانcomment", "پایانcontextcode", "پایانcontextdefinitioncode", "پایانctxfunction", "پایانctxfunctiondefinition", "پایانcurrentcolor", "پایانcurrentlistentrywrapper", "پایانdelimited", "پایانdelimitedtext", "پایانdisplaymath", "پایانdmath", "پایانdocument", "پایانeffect", "پایانelement", "پایانembeddedxtable", "پایانendnote", "پایانendofline", "پایانexceptions", "پایانexpanded", "پایانexpandedcollect", "پایانextendedcatcodetable", "پایانexternalfigurecollection", "پایانfacingfloat", "پایانfact", "پایانfigure", "پایانfiguretext", "پایانfittingpage", "پایانfixed", "پایانfloatcombination", "پایانfont", "پایانfontclass", "پایانfontsolution", "پایانfootnote", "پایانformula", "پایانformulas", "پایانframedcell", "پایانframedcontent", "پایانframedrow", "پایانframedtable", "پایانframedtext", "پایانfrontmatter", "پایانgraphictext", "پایانgridsnapping", "پایانhanging", "پایانhbox", "پایانhboxestohbox", "پایانhboxregister", "پایانheadtext", "پایانhelptext", "پایانhiding", "پایانhighlight", "پایانhyphenation", "پایانimath", "پایانindentation", "پایانindentedtext", "پایانinteraction", "پایانinterface", "پایانintermezzotext", "پایانintertext", "پایانitemgroup", "پایانitemgroupcolumns", "پایانitemize", "پایانknockout", "پایانlabeltext", "پایانlayout", "پایانlegend", "پایانlinealignment", "پایانlinecorrection", "پایانlinefiller", "پایانlinenumbering", "پایانlines", "پایانlinetable", "پایانlinetablebody", "پایانlinetablecell", "پایانlinetablehead", "پایانlocalfootnotes", "پایانlocalheadsetup", "پایانlocallinecorrection", "پایانlocalnotes", "پایانlocalsetups", "پایانlua", "پایانluacode", "پایانluaparameterset", "پایانluasetups", "پایانmakeup", "پایانmarginblock", "پایانmarkedcontent", "پایانmarkpages", "پایانmathalignment", "پایانmathcases", "پایانmathlabeltext", "پایانmathmatrix", "پایانmathmode", "پایانmathstyle", "پایانmatrices", "پایانmatrix", "پایانmaxaligned", "پایانmdformula", "پایانmiddlealigned", "پایانmiddlemakeup", "پایانmixedcolumns", "پایانmode", "پایانmodeset", "پایانmodule", "پایانmoduletestsection", "پایانmpformula", "پایانnamedsection", "پایانnamedsubformulas", "پایانnarrow", "پایانnarrower", "پایانnegative", "پایانnicelyfilledbox", "پایانnointerference", "پایانnotallmodes", "پایانnotext", "پایانnotmode", "پایانoperatortext", "پایانopposite", "پایانoutputstream", "پایانoverlay", "پایانoverprint", "پایانpagecolumns", "پایانpagecomment", "پایانpagefigure", "پایانpagelayout", "پایانpagemakeup", "پایانpar", "پایانparagraph", "پایانparagraphs", "پایانparagraphscell", "پایانparbuilder", "پایانpart", "پایانpath", "پایانplacechemical", "پایانplacefigure", "پایانplacegraphic", "پایانplaceintermezzo", "پایانplacelegend", "پایانplacepairedbox", "پایانplacetable", "پایانpositioning", "پایانpositionoverlay", "پایانpositive", "پایانpostponing", "پایانpostponingnotes", "پایانprefixtext", "پایانprocessassignmentcommand", "پایانprocessassignmentlist", "پایانprocesscommacommand", "پایانprocesscommalist", "پایانprotect", "پایانprotectedcolors", "پایانpunctuation", "پایانquotation", "پایانquote", "پایانrandomized", "پایانrandomseed", "پایانrawsetups", "پایانreadingfile", "پایانreferenceprefix", "پایانregime", "پایانreusableMPgraphic", "پایانruby", "پایانscript", "پایانsdformula", "پایانsection", "پایانsectionblock", "پایانsectionblockenvironment", "پایانsectionlevel", "پایانsetups", "پایانshapebox", "پایانshift", "پایانsidebar", "پایانsimplecolumns", "پایانspecialitem", "پایانspeech", "پایانspformula", "پایانsplitformula", "پایانsplittext", "پایانspread", "پایانstandardmakeup", "پایانstaticMPfigure", "پایانstaticMPgraphic", "پایانstrictinspectnextcharacter", "پایانstrut", "پایانstyle", "پایانsubformulas", "پایانsubject", "پایانsubjectlevel", "پایانsubsection", "پایانsubsentence", "پایانsubstack", "پایانsubsubject", "پایانsubsubsection", "پایانsubsubsubject", "پایانsubsubsubsection", "پایانsubsubsubsubject", "پایانsubsubsubsubsection", "پایانsubsubsubsubsubject", "پایانsuffixtext", "پایانsymbolset", "پایانtable", "پایانtablehead", "پایانtables", "پایانtabletail", "پایانtabletext", "پایانtabulate", "پایانtabulatehead", "پایانtabulatetail", "پایانtagged", "پایانtaglabeltext", "پایانtexcode", "پایانtexdefinition", "پایانtext", "پایانtextbackground", "پایانtextbackgroundmanual", "پایانtextcolor", "پایانtextcolorintent", "پایانtextflow", "پایانtextmakeup", "پایانtitle", "پایانtokenlist", "پایانtokens", "پایانtransparent", "پایانtypescript", "پایانtypescriptcollection", "پایانtyping", "پایانuniqueMPgraphic", "پایانuniqueMPpagegraphic", "پایانunittext", "پایانunpacked", "پایانusableMPgraphic", "پایانuseMPgraphic", "پایانusemathstyleparameter", "پایانuserdata", "پایانusingbtxspecification", "پایانvbox", "پایانvboxregister", "پایانvboxtohbox", "پایانvboxtohboxseparator", "پایانviewerlayer", "پایانvtop", "پایانvtopregister", "پایانxcell", "پایانxcellgroup", "پایانxcolumn", "پایانxgroup", "پایانxmldisplayverbatim", "پایانxmlinlineverbatim", "پایانxmlraw", "پایانxmlsetups", "پایانxrow", "پایانxrowgroup", "پایانxtable", "پایانxtablebody", "پایانxtablefoot", "پایانxtablehead", "پایانxtablenext", "پایانآیتم", "پایانبروبه", "پایانتنظیم‌راست", "پایانتنظیم‌وسط", "پایانتولید", "پایانخط‌حاشیه", "پایانخط‌متن", "پایاندرج‌شناور", "پایاندرج‌Ùرمول", "پایانرنگ", "پایانزبان", "پایانسر", "پایانÙشرده", "پایانقالبی", "پایانمحیط", "پایانمنوی‌پانل", "پایانمولÙÙ‡", "پایاننشر", "پایانپروژه", "پایانپس‌زمینه", "پایانچپ‌چین", "پایان‌خط", "پایین", "پرده", "پروژه", "پرکردن‌میدان", "پس‌زمینه", "چوبخط", "چپ‌چین", "کشیده", "کلمه‌راست", "گیره", "یادداشت", "یک‌جا", "یک‌خط" },
+ ["ro"]={ "CUVANT", "CUVINTE", "Cuvant", "Cuvinte", "Kap", "LUNA", "Litera", "Litere", "Numere", "Numereromane", "ZIDINSAPTAMANA", "adapteazaaspect", "adubuffer", "adumarcaje", "afiseazaaspect", "afiseazaculoare", "afiseazafonttext", "afiseazagrid", "afiseazagrupculoare", "afiseazamakeup", "afiseazamediufonttext", "afiseazapaleta", "afiseazarama", "afiseazasetari", "afiseazasetsimboluri", "afiseazastruts", "afiseazatiparire", "aliniatcentru", "aliniatdreapta", "aliniatstanga", "ascundeblocuri", "baraculoare", "barainteractiune", "blanc", "butoaneinteractiune", "buton", "butonmeniu", "camp", "cloneazacamp", "coloana", "comparagrupculoare", "comparapaleta", "completeazanumarpagina", "componenta", "convertestenumar", "copiazacamp", "corecteazaspatiualb", "culoare", "culoaregri", "cuvantdreapta", "data", "datacurenta", "defineste", "definesteaccent", "definesteantet", "definestebloc", "definesteblocsectiune", "definestebuffer", "definestecamp", "definestecaracter", "definestecomanda", "definesteconversie", "definesteculoare", "definestedescriere", "definestedimensiunehartie", "definesteenumerare", "definesteeticheta", "definestefloat", "definestefont", "definestefonttext", "definesteformatreferinte", "definestegrupculori", "definestehbox", "definesteinconjurare", "definestelista", "definestelistacombinata", "definestemakeup", "definestemarcaje", "definestemediulfonttext", "definestemeniuinteractiune", "definesteoverlay", "definestepaleta", "definesteparagraf", "definesteprofil", "definesteprogram", "definestereferinte", "definesteregistru", "definestesablontabel", "definestesectiune", "definestesimbol", "definestesimbolfigura", "definestesinonim", "definestesinonimfont", "definestesortare", "definestestartstop", "definestestil", "definestestilfont", "definestestivacampuri", "definestesubcamp", "definestetabulatori", "definestetext", "definestetexteinconjurate", "definestetextinconjurat", "definestetyping", "despre", "determinacaracteristicilelistei", "determinacaracteristiciregistru", "determinanumartitlu", "din", "dute", "dutebox", "dutepagina", "ecran", "element", "faraliniiantetsisubsol", "faraliniisussijos", "faraspatiu", "figuraexterna", "firdepar", "folosesteURL", "folosestebloc", "folosestedirector", "folosestedocumentextern", "folosestefiguraexterna", "folosestemodul", "folosestemuzicaexterna", "folosestescriptJS", "folosestesimboluri", "folosesteurl", "fundal", "grosimelinie", "impartefloat", "inalt", "injos", "inlinie", "instalarelimba", "intins", "jos", "jossus", "la", "lapagina", "limba", "limbaprincipala", "linieneagra", "liniesubtire", "linieumplere", "liniinegre", "liniisubtiri", "litera", "litere", "luna", "lungimelista", "marcaje", "matematica", "mediu", "meniuinteractiune", "necunoscut", "nokap", "nota", "numarformula", "numarpagina", "numartitlu", "numartitlucurent", "numere", "numereromane", "olinie", "pagina", "pastreazablocuri", "pelung", "plaseazapegrid", "plaseazasemnecarte", "potrivestecamp", "pozitie", "proceseazabloc", "produs", "proiect", "puncte", "punedeasuprafiecareia", "punefatainfata", "puneformula", "punelista", "punelistacombinata", "punenotesubsol", "punenotesubsollocale", "punenumarpagina", "puneregistru", "punesubformula", "referinta", "referintapagina", "referintatext", "reflexie", "remarca", "reseteazamarcaje", "riglatext", "rigleumplere", "roteste", "scala", "scriebuffer", "scrieinlista", "scrieintreliste", "selecteazablocuri", "semncarte", "setareitemization", "setarelimba", "setarepozitie", "seteazaaliniat", "seteazaalinierea", "seteazaantet", "seteazaaranjareapag", "seteazaaspect", "seteazabarainteractiune", "seteazablanc", "seteazabloc", "seteazablocsectiune", "seteazabuffer", "seteazacamp", "seteazacampuri", "seteazaclipping", "seteazacoloane", "seteazacomentariu", "seteazacomentariupagina", "seteazaculoare", "seteazaculori", "seteazadimensiunihartie", "seteazaecraninteractiune", "seteazaelemente", "seteazaenumerare", "seteazafloat", "seteazafloats", "seteazafonttext", "seteazaformulare", "seteazaformule", "seteazafundal", "seteazafundaluri", "seteazagrosimelinie", "seteazaimpartireafloat", "seteazainconjurat", "seteazaingust", "seteazainteractiunea", "seteazajos", "seteazalegenda", "seteazalegendele", "seteazaliniesilabe", "seteazaliniesubtire", "seteazalinii", "seteazaliniimargine", "seteazaliniinegre", "seteazaliniiumplere", "seteazalista", "seteazalistacombinata", "seteazamajuscule", "seteazamakeup", "seteazamarcaje", "seteazameniuinteractiune", "seteazaminicitat", "seteazanotasubsol", "seteazanumarpagina", "seteazanumarsubpagina", "seteazanumartitlu", "seteazanumerotarelinii", "seteazanumerotarepagina", "seteazanumerotareparagrafe", "seteazapaleta", "seteazaparagrafe", "seteazaplasareaopozita", "seteazaprograme", "seteazareferinte", "seteazaregistru", "seteazarigletext", "seteazarigleumplere", "seteazarotare", "seteazasimbol", "seteazasinonime", "seteazasortare", "seteazaspatiu", "seteazaspatiualb", "seteazaspatiuinterliniar", "seteazasubsol", "seteazasus", "seteazatabele", "seteazatabulatori", "seteazatext", "seteazatexteantet", "seteazatextejos", "seteazatextesubsol", "seteazatextesus", "seteazatextetext", "seteazatitlu", "seteazatitluri", "seteazatoleranta", "seteazatranzitiepagina", "seteazatype", "seteazatyping", "seteazaurl", "simbol", "spatiifixate", "spatiu", "spatiufixat", "startaliniatcentru", "startaliniatdreapta", "startaliniatstanga", "startcomponenta", "startculoare", "startdute", "startfundal", "startimpachetat", "startlimba", "startlinie", "startliniemargine", "startmediu", "startmeniuinteractiune", "startprodus", "startproiect", "startpublicatie", "startpuneformula", "startriglatext", "starttitlu", "stivacampuri", "stopaliniatcentru", "stopaliniatdreapta", "stopaliniatstanga", "stopcomponenta", "stopculoare", "stopdute", "stopfundal", "stopimpachetat", "stoplimba", "stoplinie", "stopliniemargine", "stopmediu", "stopmeniuinteractiune", "stopprodus", "stopproiect", "stoppublicatie", "stoppuneformula", "stopriglatext", "stoptitlu", "textumplere", "traduce", "trecilafonttext", "undeva", "valoareculoare", "versiune", "zidinsaptamana" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metafun.lua b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metafun.lua
index 4d18d308143..c2d4440f18e 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metafun.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metafun.lua
@@ -1,4 +1,4 @@
return {
- ["commands"]={ "loadfile", "loadimage", "loadmodule", "dispose", "nothing", "transparency", "tolist", "topath", "tocycle", "sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian", "tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos", "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", "tanh", "zmod", "paired", "tripled", "unitcircle", "fulldiamond", "unitdiamond", "fullsquare", "unittriangle", "fulltriangle", "llcircle", "lrcircle", "urcircle", "ulcircle", "tcircle", "bcircle", "lcircle", "rcircle", "lltriangle", "lrtriangle", "urtriangle", "ultriangle", "uptriangle", "downtriangle", "lefttriangle", "righttriangle", "triangle", "smoothed", "cornered", "superellipsed", "randomized", "randomizedcontrols", "squeezed", "enlonged", "shortened", "punked", "curved", "unspiked", "simplified", "blownup", "stretched", "enlarged", "leftenlarged", "topenlarged", "rightenlarged", "bottomenlarged", "crossed", "laddered", "randomshifted", "interpolated", "perpendicular", "paralleled", "cutends", "peepholed", "llenlarged", "lrenlarged", "urenlarged", "ulenlarged", "llmoved", "lrmoved", "urmoved", "ulmoved", "rightarrow", "leftarrow", "centerarrow", "drawdoublearrows", "boundingbox", "innerboundingbox", "outerboundingbox", "pushboundingbox", "popboundingbox", "boundingradius", "boundingcircle", "boundingpoint", "crossingunder", "insideof", "outsideof", "bottomboundary", "leftboundary", "topboundary", "rightboundary", "xsized", "ysized", "xysized", "sized", "xyscaled", "intersection_point", "intersection_found", "penpoint", "bbwidth", "bbheight", "withshade", "withcircularshade", "withlinearshade", "defineshade", "shaded", "shadedinto", "withshadecolors", "withshadedomain", "withshademethod", "withshadefactor", "withshadevector", "withshadecenter", "withshadedirection", "withshaderadius", "withshadetransform", "withshadestep", "withshadefraction", "withshadeorigin", "shownshadevector", "shownshadeorigin", "cmyk", "spotcolor", "multitonecolor", "namedcolor", "drawfill", "undrawfill", "inverted", "uncolored", "softened", "grayed", "greyed", "onlayer", "along", "graphictext", "loadfigure", "externalfigure", "figure", "register", "outlinetext", "filloutlinetext", "drawoutlinetext", "outlinetexttopath", "checkedbounds", "checkbounds", "strut", "rule", "withmask", "bitmapimage", "colordecimals", "ddecimal", "dddecimal", "ddddecimal", "colordecimalslist", "textext", "thetextext", "rawtextext", "textextoffset", "texbox", "thetexbox", "rawtexbox", "istextext", "notcached", "verbatim", "thelabel", "label", "autoalign", "transparent", "withtransparency", "property", "properties", "withproperties", "asgroup", "infont", "space", "crlf", "dquote", "percent", "SPACE", "CRLF", "DQUOTE", "PERCENT", "grayscale", "greyscale", "withgray", "withgrey", "colorpart", "colorlike", "readfile", "clearxy", "unitvector", "center", "epsed", "anchored", "originpath", "infinite", "break", "xstretched", "ystretched", "snapped", "pathconnectors", "function", "constructedfunction", "constructedpath", "constructedpairs", "straightfunction", "straightpath", "straightpairs", "curvedfunction", "curvedpath", "curvedpairs", "evenly", "oddly", "condition", "pushcurrentpicture", "popcurrentpicture", "arrowpath", "resetarrows", "tensecircle", "roundedsquare", "colortype", "whitecolor", "blackcolor", "basiccolors", "complementary", "complemented", "resolvedcolor", "normalfill", "normaldraw", "visualizepaths", "detailpaths", "naturalizepaths", "drawboundary", "drawwholepath", "drawpathonly", "visualizeddraw", "visualizedfill", "detaileddraw", "draworigin", "drawboundingbox", "drawpath", "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", "drawpointlabels", "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions", "undashed", "pencilled", "decorated", "redecorated", "undecorated", "passvariable", "passarrayvariable", "tostring", "topair", "format", "formatted", "quotation", "quote", "startpassingvariable", "stoppassingvariable", "eofill", "eoclip", "nofill", "fillup", "eofillup", "area", "addbackground", "shadedup", "shadeddown", "shadedleft", "shadedright", "sortlist", "copylist", "shapedlist", "listtocurves", "listtolines", "listsize", "listlast", "uniquelist", "circularpath", "squarepath", "linearpath", "theoffset", "texmode", "systemmode", "texvar", "texstr", "isarray", "prefix", "dimension", "getmacro", "getdimen", "getcount", "gettoks", "setmacro", "setdimen", "setcount", "settoks", "positionpath", "positioncurve", "positionxy", "positionpxy", "positionwhd", "positionpage", "positionregion", "positionbox", "positionanchor", "positioninregion", "positionatanchor", "wdpart", "htpart", "dppart", "texvar", "texstr", "inpath", "pointof", "leftof", "rightof", "newhash", "disposehash", "inhash", "tohash", "isarray", "prefix", "isobject", "comment", "report", "lua", "mp", "MP", "luacall", "mirrored", "mirroredabout" },
- ["internals"]={ "nocolormodel", "greycolormodel", "graycolormodel", "rgbcolormodel", "cmykcolormodel", "shadefactor", "textextoffset", "textextanchor", "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent", "softlighttransparent", "hardlighttransparent", "colordodgetransparent", "colorburntransparent", "darkentransparent", "lightentransparent", "differencetransparent", "exclusiontransparent", "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent", "ahvariant", "ahdimple", "ahfactor", "ahscale", "metapostversion", "maxdimensions", "drawoptionsfactor", "dq", "sq", "crossingscale", "crossingoption" },
+ ["commands"]={ "loadfile", "loadimage", "loadmodule", "dispose", "nothing", "transparency", "tolist", "topath", "tocycle", "sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian", "tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos", "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", "tanh", "zmod", "paired", "tripled", "unitcircle", "fulldiamond", "unitdiamond", "fullsquare", "unittriangle", "fulltriangle", "llcircle", "lrcircle", "urcircle", "ulcircle", "tcircle", "bcircle", "lcircle", "rcircle", "lltriangle", "lrtriangle", "urtriangle", "ultriangle", "uptriangle", "downtriangle", "lefttriangle", "righttriangle", "triangle", "smoothed", "cornered", "superellipsed", "randomized", "randomizedcontrols", "squeezed", "enlonged", "shortened", "punked", "curved", "unspiked", "simplified", "blownup", "stretched", "enlarged", "leftenlarged", "topenlarged", "rightenlarged", "bottomenlarged", "crossed", "laddered", "randomshifted", "interpolated", "perpendicular", "paralleled", "cutends", "peepholed", "llenlarged", "lrenlarged", "urenlarged", "ulenlarged", "llmoved", "lrmoved", "urmoved", "ulmoved", "rightarrow", "leftarrow", "centerarrow", "drawdoublearrows", "boundingbox", "innerboundingbox", "outerboundingbox", "pushboundingbox", "popboundingbox", "boundingradius", "boundingcircle", "boundingpoint", "crossingunder", "insideof", "outsideof", "bottomboundary", "leftboundary", "topboundary", "rightboundary", "xsized", "ysized", "xysized", "sized", "xyscaled", "intersection_point", "intersection_found", "penpoint", "bbwidth", "bbheight", "withshade", "withcircularshade", "withlinearshade", "defineshade", "shaded", "shadedinto", "withshadecolors", "withshadedomain", "withshademethod", "withshadefactor", "withshadevector", "withshadecenter", "withshadedirection", "withshaderadius", "withshadetransform", "withshadestep", "withshadefraction", "withshadeorigin", "shownshadevector", "shownshadeorigin", "cmyk", "spotcolor", "multitonecolor", "namedcolor", "drawfill", "undrawfill", "inverted", "uncolored", "softened", "grayed", "greyed", "onlayer", "along", "graphictext", "loadfigure", "externalfigure", "figure", "register", "outlinetext", "filloutlinetext", "drawoutlinetext", "outlinetexttopath", "checkedbounds", "checkbounds", "strut", "rule", "withmask", "bitmapimage", "colordecimals", "ddecimal", "dddecimal", "ddddecimal", "colordecimalslist", "textext", "thetextext", "rawtextext", "textextoffset", "texbox", "thetexbox", "rawtexbox", "istextext", "notcached", "keepcached", "verbatim", "thelabel", "label", "autoalign", "transparent", "withtransparency", "property", "properties", "withproperties", "asgroup", "infont", "space", "crlf", "dquote", "percent", "SPACE", "CRLF", "DQUOTE", "PERCENT", "grayscale", "greyscale", "withgray", "withgrey", "colorpart", "colorlike", "readfile", "clearxy", "unitvector", "center", "epsed", "anchored", "originpath", "infinite", "break", "xstretched", "ystretched", "snapped", "pathconnectors", "function", "constructedfunction", "constructedpath", "constructedpairs", "straightfunction", "straightpath", "straightpairs", "curvedfunction", "curvedpath", "curvedpairs", "evenly", "oddly", "condition", "pushcurrentpicture", "popcurrentpicture", "arrowpath", "resetarrows", "tensecircle", "roundedsquare", "colortype", "whitecolor", "blackcolor", "basiccolors", "complementary", "complemented", "resolvedcolor", "normalfill", "normaldraw", "visualizepaths", "detailpaths", "naturalizepaths", "drawboundary", "drawwholepath", "drawpathonly", "visualizeddraw", "visualizedfill", "detaileddraw", "draworigin", "drawboundingbox", "drawpath", "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", "drawpointlabels", "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions", "undashed", "pencilled", "decorated", "redecorated", "undecorated", "passvariable", "passarrayvariable", "tostring", "topair", "format", "formatted", "quotation", "quote", "startpassingvariable", "stoppassingvariable", "eofill", "eoclip", "nofill", "dofill", "fillup", "eofillup", "nodraw", "dodraw", "area", "addbackground", "shadedup", "shadeddown", "shadedleft", "shadedright", "sortlist", "copylist", "shapedlist", "listtocurves", "listtolines", "listsize", "listlast", "uniquelist", "circularpath", "squarepath", "linearpath", "theoffset", "texmode", "systemmode", "texvar", "texstr", "isarray", "prefix", "dimension", "getmacro", "getdimen", "getcount", "gettoks", "setmacro", "setdimen", "setcount", "settoks", "positionpath", "positioncurve", "positionxy", "positionpxy", "positionwhd", "positionpage", "positionregion", "positionbox", "positionanchor", "positioninregion", "positionatanchor", "wdpart", "htpart", "dppart", "texvar", "texstr", "inpath", "pointof", "leftof", "rightof", "utflen", "utfsub", "newhash", "disposehash", "inhash", "tohash", "isarray", "prefix", "isobject", "comment", "report", "lua", "mp", "MP", "luacall", "mirrored", "mirroredabout", "scriptindex" },
+ ["internals"]={ "nocolormodel", "greycolormodel", "graycolormodel", "rgbcolormodel", "cmykcolormodel", "shadefactor", "textextoffset", "textextanchor", "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent", "softlighttransparent", "hardlighttransparent", "colordodgetransparent", "colorburntransparent", "darkentransparent", "lightentransparent", "differencetransparent", "exclusiontransparent", "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent", "ahvariant", "ahdimple", "ahfactor", "ahscale", "metapostversion", "maxdimensions", "drawoptionsfactor", "dq", "sq", "crossingscale", "crossingoption", "contextlmtxmode", "getparameters", "presetparameters", "hasparameter", "hasoption", "getparameter", "getparameterdefault", "getparametercount", "getmaxparametercount", "getparameterpath", "getparameterpen", "getparametertext", "applyparameters", "pushparameters", "popparameters", "definecolor" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metapost.lua b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metapost.lua
index 8d1b88052ca..9304b2dd201 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metapost.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-metapost.lua
@@ -1,9 +1,9 @@
return {
- ["commands"]={ "upto", "downto", "beginfig", "endfig", "beginglyph", "endglyph", "rotatedaround", "reflectedabout", "arrowhead", "currentpen", "currentpicture", "cuttings", "defaultfont", "extra_beginfig", "extra_endfig", "down", "evenly", "fullcircle", "halfcircle", "identity", "in", "left", "pensquare", "penrazor", "penspec", "origin", "quartercircle", "right", "unitsquare", "up", "withdots", "abs", "bbox", "ceiling", "center", "cutafter", "cutbefore", "dir", "directionpoint", "div", "dotprod", "intersectionpoint", "inverse", "mod", "round", "unitvector", "whatever", "cutdraw", "draw", "drawarrow", "drawdblarrow", "fill", "filldraw", "drawdot", "loggingall", "interact", "tracingall", "tracingnone", "pickup", "undraw", "unfill", "unfilldraw", "buildcycle", "dashpattern", "decr", "dotlabel", "dotlabels", "drawoptions", "incr", "label", "labels", "max", "min", "thelabel", "z", "beginchar", "blacker", "capsule_end", "change_width", "define_blacker_pixels", "define_corrected_pixels", "define_good_x_pixels", "define_good_y_pixels", "define_horizontal_corrected_pixels", "define_pixels", "define_whole_blacker_pixels", "define_whole_pixels", "define_whole_vertical_blacker_pixels", "define_whole_vertical_pixels", "endchar", "extra_beginchar", "extra_endchar", "extra_setup", "font_coding_scheme", "clearxy", "clearit", "clearpen", "shipit", "font_extra_space", "exitunless", "relax", "hide", "gobble", "gobbled", "stop", "blankpicture", "counterclockwise", "tensepath", "takepower", "direction", "softjoin", "makelabel", "rotatedabout", "flex", "superellipse", "image", "nullpen", "savepen", "clearpen", "penpos", "penlabels", "range", "thru", "z", "laboff", "bye", "red", "green", "blue", "cyan", "magenta", "yellow", "black", "white", "background", "mm", "pt", "dd", "bp", "cm", "pc", "cc", "in", "triplet", "quadruplet" },
+ ["commands"]={ "upto", "downto", "beginfig", "endfig", "beginglyph", "endglyph", "rotatedaround", "reflectedabout", "arrowhead", "currentpen", "currentpicture", "cuttings", "defaultfont", "extra_beginfig", "extra_endfig", "down", "evenly", "fullcircle", "halfcircle", "identity", "in", "left", "pensquare", "penrazor", "penspec", "origin", "quartercircle", "right", "unitsquare", "up", "withdots", "abs", "bbox", "ceiling", "center", "cutafter", "cutbefore", "dir", "directionpoint", "div", "dotprod", "intersectionpoint", "inverse", "mod", "round", "unitvector", "whatever", "cutdraw", "draw", "drawarrow", "drawdblarrow", "fill", "filldraw", "drawdot", "loggingall", "interact", "tracingall", "tracingnone", "pickup", "undraw", "unfill", "unfilldraw", "buildcycle", "dashpattern", "decr", "dotlabel", "dotlabels", "drawoptions", "incr", "label", "labels", "max", "min", "thelabel", "z", "beginchar", "blacker", "capsule_end", "change_width", "define_blacker_pixels", "define_corrected_pixels", "define_good_x_pixels", "define_good_y_pixels", "define_horizontal_corrected_pixels", "define_pixels", "define_whole_blacker_pixels", "define_whole_pixels", "define_whole_vertical_blacker_pixels", "define_whole_vertical_pixels", "endchar", "extra_beginchar", "extra_endchar", "extra_setup", "font_coding_scheme", "clearxy", "clearit", "clearpen", "shipit", "font_extra_space", "exitunless", "relax", "hide", "gobble", "gobbled", "stop", "blankpicture", "counterclockwise", "tensepath", "takepower", "direction", "softjoin", "makelabel", "rotatedabout", "flex", "superellipse", "image", "nullpen", "savepen", "clearpen", "penpos", "penlabels", "range", "thru", "z", "laboff", "bye", "red", "green", "blue", "cyan", "magenta", "yellow", "black", "white", "background", "mm", "pt", "dd", "bp", "cm", "pc", "cc", "in", "triplet", "quadruplet", "totransform", "bymatrix" },
["disabled"]={ "verbatimtex", "troffmode" },
["internals"]={ "mitered", "rounded", "beveled", "butt", "squared", "eps", "epsilon", "infinity", "bboxmargin", "ahlength", "ahangle", "labeloffset", "dotlabeldiam", "defaultpen", "defaultscale", "join_radius", "charscale", "ditto", "EOF", "pen_lft", "pen_rt", "pen_top", "pen_bot" },
["metafont"]={ "autorounding", "beginchar", "blacker", "boundarychar", "capsule_def", "capsule_end", "change_width", "chardp", "chardx", "chardy", "charexists", "charext", "charht", "charic", "charlist", "charwd", "cull", "cullit", "currenttransform", "currentwindow", "define_blacker_pixels", "define_corrected_pixels", "define_good_x_pixels", "define_good_y_pixels", "define_horizontal_corrected_pixels", "define_pixels", "define_whole_blacker_pixels", "define_whole_pixels", "define_whole_vertical_blacker_pixels", "define_whole_vertical_pixels", "designsize", "display", "displaying", "endchar", "extensible", "extra_beginchar", "extra_endchar", "extra_setup", "fillin", "font_coding_scheme", "font_extra_space", "font_identifier", "font_normal_shrink", "font_normal_space", "font_normal_stretch", "font_quad", "font_size", "font_slant", "font_x_height", "fontdimen", "fontmaking", "gfcorners", "granularity", "grayfont", "headerbyte", "hppp", "hround", "imagerules", "italcorr", "kern", "labelfont", "ligtable", "lowres_fix", "makebox", "makegrid", "maketicks", "mode_def", "mode_setup", "nodisplays", "notransforms", "numspecial", "o_correction", "openit", "openwindow", "pixels_per_inch", "proofing", "proofoffset", "proofrule", "proofrulethickness", "rulepen", "screenchars", "screenrule", "screenstrokes", "screen_cols", "screen_rows", "showit", "slantfont", "smode", "smoothing", "titlefont", "totalweight", "tracingedges", "tracingpens", "turningcheck", "unitpixel", "vppp", "vround", "xoffset", "yoffset" },
- ["primitives"]={ "charcode", "day", "linecap", "linejoin", "miterlimit", "month", "pausing", "prologues", "showstopping", "time", "tracingcapsules", "tracingchoices", "mpprocset", "tracingcommands", "tracingequations", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingrestores", "tracingspecs", "tracingstats", "tracingtitles", "truecorners", "warningcheck", "year", "false", "nullpicture", "pencircle", "penspec", "true", "and", "angle", "arclength", "arctime", "ASCII", "boolean", "bot", "char", "color", "cosd", "cycle", "decimal", "directiontime", "floor", "fontsize", "hex", "infont", "intersectiontimes", "known", "length", "llcorner", "lrcorner", "makepath", "makepen", "mexp", "mlog", "normaldeviate", "not", "numeric", "oct", "odd", "or", "path", "pair", "pen", "penoffset", "picture", "point", "postcontrol", "precontrol", "reverse", "rotated", "scaled", "shifted", "sind", "slanted", "sqrt", "str", "string", "subpath", "substring", "transform", "transformed", "ulcorner", "uniformdeviate", "unknown", "urcorner", "xpart", "xscaled", "xxpart", "xypart", "ypart", "yscaled", "yxpart", "yypart", "zscaled", "addto", "clip", "input", "interim", "let", "newinternal", "save", "setbounds", "shipout", "show", "showdependencies", "showtoken", "showvariable", "special", "begingroup", "endgroup", "of", "curl", "tension", "and", "controls", "interpath", "on", "off", "def", "vardef", "enddef", "expr", "suffix", "text", "primary", "secondary", "tertiary", "primarydef", "secondarydef", "tertiarydef", "randomseed", "also", "contour", "doublepath", "withcolor", "withcmykcolor", "withpen", "dashed", "envelope", "if", "else", "elseif", "fi", "for", "endfor", "forever", "exitif", "within", "forsuffixes", "step", "until", "charlist", "extensible", "fontdimen", "headerbyte", "kern", "ligtable", "boundarychar", "chardp", "charext", "charht", "charic", "charwd", "designsize", "fontmaking", "charexists", "cullit", "currenttransform", "gfcorners", "grayfont", "hround", "imagerules", "lowres_fix", "nodisplays", "notransforms", "openit", "displaying", "currentwindow", "screen_rows", "screen_cols", "pixels_per_inch", "cull", "display", "openwindow", "numspecial", "totalweight", "autorounding", "fillin", "proofing", "tracingpens", "xoffset", "chardx", "granularity", "smoothing", "turningcheck", "yoffset", "chardy", "hppp", "tracingedges", "vppp", "extra_beginfig", "extra_endfig", "mpxbreak", "endinput", "message", "delimiters", "turningnumber", "errmessage", "readstring", "scantokens", "end", "outer", "inner", "write", "to", "readfrom", "withprescript", "withpostscript", "top", "bot", "lft", "rt", "ulft", "urt", "llft", "lrt", "redpart", "greenpart", "bluepart", "cyanpart", "magentapart", "yellowpart", "blackpart", "prescriptpart", "postscriptpart", "rgbcolor", "cmykcolor", "colormodel", "graypart", "greypart", "greycolor", "graycolor", "dashpart", "penpart", "stroked", "filled", "textual", "clipped", "bounded", "pathpart", "expandafter", "minute", "hour", "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline", "fontpart", "fontsize", "glyph", "restoreclipcolor", "troffmode", "runscript", "maketext" },
+ ["primitives"]={ "charcode", "day", "linecap", "linejoin", "miterlimit", "month", "pausing", "prologues", "showstopping", "time", "tracingcapsules", "tracingchoices", "mpprocset", "tracingcommands", "tracingequations", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingrestores", "tracingspecs", "tracingstats", "tracingtitles", "truecorners", "warningcheck", "year", "false", "nullpicture", "pencircle", "penspec", "true", "and", "angle", "arclength", "arctime", "ASCII", "boolean", "bot", "char", "color", "cosd", "cycle", "decimal", "directiontime", "floor", "fontsize", "hex", "infont", "intersectiontimes", "known", "void", "length", "llcorner", "lrcorner", "makepath", "makepen", "mexp", "mlog", "normaldeviate", "not", "numeric", "oct", "odd", "or", "path", "pair", "pen", "penoffset", "picture", "point", "postcontrol", "precontrol", "reverse", "rotated", "scaled", "shifted", "sind", "slanted", "sqrt", "str", "string", "subpath", "substring", "transform", "transformed", "ulcorner", "uniformdeviate", "unknown", "urcorner", "xpart", "xscaled", "xxpart", "xypart", "ypart", "yscaled", "yxpart", "yypart", "zscaled", "addto", "clip", "input", "interim", "let", "newinternal", "save", "setbounds", "setgroup", "shipout", "show", "showdependencies", "showtoken", "showvariable", "special", "begingroup", "endgroup", "of", "curl", "tension", "and", "controls", "interpath", "on", "off", "def", "vardef", "enddef", "expr", "suffix", "text", "primary", "secondary", "tertiary", "primarydef", "secondarydef", "tertiarydef", "randomseed", "also", "contour", "doublepath", "withcolor", "withcmykcolor", "withpen", "dashed", "envelope", "if", "else", "elseif", "fi", "for", "endfor", "forever", "exitif", "within", "forsuffixes", "step", "until", "charlist", "extensible", "fontdimen", "headerbyte", "kern", "ligtable", "boundarychar", "chardp", "charext", "charht", "charic", "charwd", "designsize", "fontmaking", "charexists", "cullit", "currenttransform", "gfcorners", "grayfont", "hround", "imagerules", "lowres_fix", "nodisplays", "notransforms", "openit", "displaying", "currentwindow", "screen_rows", "screen_cols", "pixels_per_inch", "cull", "display", "openwindow", "numspecial", "totalweight", "autorounding", "fillin", "proofing", "tracingpens", "xoffset", "chardx", "granularity", "smoothing", "turningcheck", "yoffset", "chardy", "hppp", "tracingedges", "vppp", "extra_beginfig", "extra_endfig", "mpxbreak", "endinput", "message", "delimiters", "turningnumber", "errmessage", "scantokens", "end", "outer", "inner", "write", "to", "readfrom", "closefrom", "withprescript", "withpostscript", "top", "bot", "lft", "rt", "ulft", "urt", "llft", "lrt", "redpart", "greenpart", "bluepart", "cyanpart", "magentapart", "yellowpart", "blackpart", "prescriptpart", "postscriptpart", "rgbcolor", "cmykcolor", "colormodel", "graypart", "greypart", "greycolor", "graycolor", "dashpart", "penpart", "stroked", "filled", "textual", "clipped", "bounded", "pathpart", "expandafter", "minute", "hour", "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline", "fontpart", "fontsize", "glyph", "restoreclipcolor", "troffmode", "runscript", "maketext", "numbersystem" },
["shortcuts"]={ "..", "...", "--", "---", "&", "\\" },
["tex"]={ "btex", "etex", "verbatimtex" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-tex.lua b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-tex.lua
index 473c64499c8..f7551d2886b 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-tex.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/data/scite-context-data-tex.lua
@@ -1,9 +1,9 @@
return {
["aleph"]={ "Alephminorversion", "Alephrevision", "Alephversion" },
- ["etex"]={ "botmarks", "clubpenalties", "currentgrouplevel", "currentgrouptype", "currentifbranch", "currentiflevel", "currentiftype", "detokenize", "dimexpr", "displaywidowpenalties", "eTeXVersion", "eTeXminorversion", "eTeXrevision", "eTeXversion", "everyeof", "firstmarks", "fontchardp", "fontcharht", "fontcharic", "fontcharwd", "glueexpr", "glueshrink", "glueshrinkorder", "gluestretch", "gluestretchorder", "gluetomu", "ifcsname", "ifdefined", "iffontchar", "interactionmode", "interlinepenalties", "lastlinefit", "lastnodetype", "marks", "muexpr", "mutoglue", "numexpr", "pagediscards", "parshapedimen", "parshapeindent", "parshapelength", "predisplaydirection", "protected", "readline", "savinghyphcodes", "savingvdiscards", "scantokens", "showgroups", "showifs", "showtokens", "splitbotmarks", "splitdiscards", "splitfirstmarks", "topmarks", "tracingassigns", "tracinggroups", "tracingifs", "tracingnesting", "tracingscantokens", "unexpanded", "unless", "widowpenalties" },
- ["luatex"]={ "Uchar", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Uhextensible", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathcharclass", "Umathchardef", "Umathcharfam", "Umathcharnum", "Umathcharnumdef", "Umathcharslot", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathnolimitsubfactor", "Umathnolimitsupfactor", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathskewedfractionhgap", "Umathskewedfractionvgap", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Unosubscript", "Unosuperscript", "Uoverdelimiter", "Uradical", "Uroot", "Uskewed", "Uskewedwithdelims", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "Uvextensible", "adjustspacing", "alignmark", "aligntab", "attribute", "attributedef", "automaticdiscretionary", "automatichyphenmode", "automatichyphenpenalty", "begincsname", "bodydir", "bodydirection", "boxdir", "boxdirection", "breakafterdirmode", "catcodetable", "clearmarks", "compoundhyphenmode", "copyfont", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "csstring", "draftmode", "dviextension", "dvifeedback", "dvivariable", "efcode", "endlocalcontrol", "etoksapp", "etokspre", "exceptionpenalty", "expanded", "expandglyphsinfont", "explicitdiscretionary", "explicithyphenpenalty", "fixupboxesmode", "fontid", "formatname", "gleaders", "gtoksapp", "gtokspre", "hjcode", "hyphenationbounds", "hyphenationmin", "hyphenpenaltymode", "ifabsdim", "ifabsnum", "ifcondition", "ifincsname", "ifprimitive", "ignoreligaturesinfont", "immediateassigned", "immediateassignment", "initcatcodetable", "insertht", "lastnamedcs", "lastsavedboxresourceindex", "lastsavedimageresourceindex", "lastsavedimageresourcepages", "lastxpos", "lastypos", "latelua", "lateluafunction", "leftghost", "leftmarginkern", "letcharcode", "letterspacefont", "linedir", "linedirection", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "lpcode", "luabytecode", "luabytecodecall", "luacopyinputnodes", "luadef", "luaescapestring", "luafunction", "luafunctioncall", "luatexbanner", "luatexrevision", "luatexversion", "mathdelimitersmode", "mathdir", "mathdirection", "mathdisplayskipmode", "matheqnogapstep", "mathflattenmode", "mathitalicsmode", "mathnolimitsmode", "mathoption", "mathpenaltiesmode", "mathrulesfam", "mathrulesmode", "mathrulethicknessmode", "mathscriptboxmode", "mathscriptcharmode", "mathscriptsmode", "mathstyle", "mathsurroundmode", "mathsurroundskip", "nohrule", "nokerns", "noligs", "normaldeviate", "nospaces", "novrule", "outputbox", "outputmode", "pagebottomoffset", "pagedir", "pagedirection", "pageheight", "pageleftoffset", "pagerightoffset", "pagetopoffset", "pagewidth", "pardir", "pardirection", "pdfextension", "pdffeedback", "pdfvariable", "postexhyphenchar", "posthyphenchar", "prebinoppenalty", "predisplaygapfactor", "preexhyphenchar", "prehyphenchar", "prerelpenalty", "primitive", "protrudechars", "pxdimen", "quitvmode", "randomseed", "rightghost", "rightmarginkern", "rpcode", "saveboxresource", "savecatcodetable", "saveimageresource", "savepos", "scantextokens", "setfontid", "setrandomseed", "shapemode", "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", "suppressmathparerror", "suppressoutererror", "suppressprimitiveerror", "synctex", "tagcode", "textdir", "textdirection", "toksapp", "tokspre", "tracingfonts", "uniformdeviate", "useboxresource", "useimageresource", "xtoksapp", "xtokspre" },
+ ["etex"]={ "botmarks", "clubpenalties", "currentgrouplevel", "currentgrouptype", "currentifbranch", "currentiflevel", "currentiftype", "detokenize", "dimexpr", "displaywidowpenalties", "everyeof", "firstmarks", "fontchardp", "fontcharht", "fontcharic", "fontcharwd", "glueexpr", "glueshrink", "glueshrinkorder", "gluestretch", "gluestretchorder", "gluetomu", "ifcsname", "ifdefined", "iffontchar", "interactionmode", "interlinepenalties", "lastlinefit", "lastnodetype", "marks", "muexpr", "mutoglue", "numexpr", "pagediscards", "parshapedimen", "parshapeindent", "parshapelength", "predisplaydirection", "protected", "readline", "savinghyphcodes", "savingvdiscards", "scantokens", "showgroups", "showifs", "showtokens", "splitbotmarks", "splitdiscards", "splitfirstmarks", "topmarks", "tracingassigns", "tracinggroups", "tracingifs", "tracingnesting", "tracingscantokens", "unexpanded", "unless", "widowpenalties" },
+ ["luatex"]={ "Uchar", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Uhextensible", "Uleft", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathcharclass", "Umathchardef", "Umathcharfam", "Umathcharnum", "Umathcharnumdef", "Umathcharslot", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathnolimitsubfactor", "Umathnolimitsupfactor", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathskewedfractionhgap", "Umathskewedfractionvgap", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Umiddle", "Unosubscript", "Unosuperscript", "Uoverdelimiter", "Uradical", "Uright", "Uroot", "Uskewed", "Uskewedwithdelims", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "Uvextensible", "adjustspacing", "adjustspacingshrink", "adjustspacingstep", "adjustspacingstretch", "aftergrouped", "alignmark", "aligntab", "attribute", "attributedef", "automaticdiscretionary", "automatichyphenmode", "automatichyphenpenalty", "begincsname", "beginlocalcontrol", "boundary", "boxattr", "boxdirection", "boxorientation", "boxtotal", "boxxmove", "boxxoffset", "boxymove", "boxyoffset", "breakafterdirmode", "catcodetable", "clearmarks", "compoundhyphenmode", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "csstring", "efcode", "endlocalcontrol", "etoksapp", "etokspre", "exceptionpenalty", "expanded", "explicitdiscretionary", "explicithyphenpenalty", "firstvalidlanguage", "fixupboxesmode", "fontid", "formatname", "frozen", "futureexpand", "futureexpandis", "futureexpandisap", "gleaders", "glet", "glyphdatafield", "gtoksapp", "gtokspre", "hjcode", "hpack", "hyphenationbounds", "hyphenationmin", "hyphenpenaltymode", "ifabsdim", "ifabsnum", "ifchkdim", "ifchknum", "ifcmpdim", "ifcmpnum", "ifcondition", "ifcstok", "ifdimval", "iffrozen", "ifincsname", "ifnumval", "ifprotected", "iftok", "ifusercmd", "ignorepars", "immediateassigned", "immediateassignment", "initcatcodetable", "insertht", "internalcodesmode", "lastnamedcs", "lastnodesubtype", "leftghost", "leftmarginkern", "letcharcode", "letfrozen", "letprotected", "linedirection", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "lpcode", "luabytecode", "luabytecodecall", "luacopyinputnodes", "luadef", "luaescapestring", "luafunction", "luafunctioncall", "luatexbanner", "luatexrevision", "luatexversion", "mathdelimitersmode", "mathdirection", "mathdisplayskipmode", "matheqnogapstep", "mathflattenmode", "mathitalicsmode", "mathnolimitsmode", "matholdmode", "mathpenaltiesmode", "mathrulesfam", "mathrulesmode", "mathrulethicknessmode", "mathscriptboxmode", "mathscriptcharmode", "mathscriptsmode", "mathstyle", "mathsurroundmode", "mathsurroundskip", "noboundary", "nohrule", "nokerns", "noligs", "nospaces", "novrule", "outputbox", "pardirection", "postexhyphenchar", "posthyphenchar", "prebinoppenalty", "predisplaygapfactor", "preexhyphenchar", "prehyphenchar", "prerelpenalty", "protrudechars", "protrusionboundary", "pxdimen", "quitvmode", "rightghost", "rightmarginkern", "rpcode", "savecatcodetable", "scantextokens", "setfontid", "shapemode", "textdirection", "toksapp", "tokspre", "tpack", "tracingfonts", "unletfrozen", "unletprotected", "vpack", "wordboundary", "xtoksapp", "xtokspre" },
["omega"]={ "Omegaminorversion", "Omegarevision", "Omegaversion" },
["pdftex"]={ "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", "pdfadjustspacing", "pdfannot", "pdfcatalog", "pdfcolorstack", "pdfcolorstackinit", "pdfcompresslevel", "pdfcopyfont", "pdfcreationdate", "pdfdecimaldigits", "pdfdest", "pdfdestmargin", "pdfdraftmode", "pdfeachlinedepth", "pdfeachlineheight", "pdfendlink", "pdfendthread", "pdffirstlineheight", "pdffontattr", "pdffontexpand", "pdffontname", "pdffontobjnum", "pdffontsize", "pdfgamma", "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", "pdfignoreddimen", "pdfignoreunknownimages", "pdfimageaddfilename", "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", "pdfinclusionerrorlevel", "pdfinfo", "pdfinfoomitdate", "pdfinsertht", "pdflastannot", "pdflastlinedepth", "pdflastlink", "pdflastobj", "pdflastxform", "pdflastximage", "pdflastximagepages", "pdflastxpos", "pdflastypos", "pdflinkmargin", "pdfliteral", "pdfmajorversion", "pdfmapfile", "pdfmapline", "pdfminorversion", "pdfnames", "pdfnoligatures", "pdfnormaldeviate", "pdfobj", "pdfobjcompresslevel", "pdfomitcharset", "pdfomitcidset", "pdfoutline", "pdfoutput", "pdfpageattr", "pdfpagebox", "pdfpageheight", "pdfpageref", "pdfpageresources", "pdfpagesattr", "pdfpagewidth", "pdfpkfixeddpi", "pdfpkmode", "pdfpkresolution", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", "pdfrandomseed", "pdfrecompress", "pdfrefobj", "pdfrefxform", "pdfrefximage", "pdfreplacefont", "pdfrestore", "pdfretval", "pdfsave", "pdfsavepos", "pdfsetmatrix", "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", "pdfsuppressoptionalinfo", "pdfsuppressptexinfo", "pdftexbanner", "pdftexrevision", "pdftexversion", "pdfthread", "pdfthreadmargin", "pdftracingfonts", "pdftrailer", "pdftrailerid", "pdfuniformdeviate", "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", "pdfxformmargin", "pdfxformname", "pdfxformresources", "pdfximage" },
- ["tex"]={ " ", "-", "/", "Uleft", "Umiddle", "Uright", "above", "abovedisplayshortskip", "abovedisplayskip", "abovewithdelims", "accent", "adjdemerits", "advance", "afterassignment", "aftergroup", "atop", "atopwithdelims", "badness", "baselineskip", "batchmode", "begingroup", "belowdisplayshortskip", "belowdisplayskip", "binoppenalty", "botmark", "boundary", "box", "boxmaxdepth", "brokenpenalty", "catcode", "char", "chardef", "cleaders", "closein", "closeout", "clubpenalty", "copy", "count", "countdef", "cr", "crcr", "csname", "day", "deadcycles", "def", "defaulthyphenchar", "defaultskewchar", "delcode", "delimiter", "delimiterfactor", "delimitershortfall", "dimen", "dimendef", "directlua", "discretionary", "displayindent", "displaylimits", "displaystyle", "displaywidowpenalty", "displaywidth", "divide", "doublehyphendemerits", "dp", "dump", "edef", "else", "emergencystretch", "end", "endcsname", "endgroup", "endinput", "endlinechar", "eqno", "errhelp", "errmessage", "errorcontextlines", "errorstopmode", "escapechar", "everycr", "everydisplay", "everyhbox", "everyjob", "everymath", "everypar", "everyvbox", "exhyphenchar", "exhyphenpenalty", "expandafter", "fam", "fi", "finalhyphendemerits", "firstmark", "firstvalidlanguage", "floatingpenalty", "font", "fontdimen", "fontname", "futurelet", "gdef", "glet", "global", "globaldefs", "halign", "hangafter", "hangindent", "hbadness", "hbox", "hfil", "hfill", "hfilneg", "hfuzz", "hoffset", "holdinginserts", "hpack", "hrule", "hsize", "hskip", "hss", "ht", "hyphenation", "hyphenchar", "hyphenpenalty", "if", "ifcase", "ifcat", "ifdim", "ifeof", "iffalse", "ifhbox", "ifhmode", "ifinner", "ifmmode", "ifnum", "ifodd", "iftrue", "ifvbox", "ifvmode", "ifvoid", "ifx", "ignorespaces", "immediate", "indent", "input", "inputlineno", "insert", "insertpenalties", "interlinepenalty", "jobname", "kern", "language", "lastbox", "lastkern", "lastpenalty", "lastskip", "lccode", "leaders", "left", "lefthyphenmin", "leftskip", "leqno", "let", "limits", "linepenalty", "lineskip", "lineskiplimit", "long", "looseness", "lower", "lowercase", "mag", "mark", "mathaccent", "mathbin", "mathchar", "mathchardef", "mathchoice", "mathclose", "mathcode", "mathinner", "mathop", "mathopen", "mathord", "mathpunct", "mathrel", "mathsurround", "maxdeadcycles", "maxdepth", "meaning", "medmuskip", "message", "middle", "mkern", "month", "moveleft", "moveright", "mskip", "multiply", "muskip", "muskipdef", "newlinechar", "noalign", "noboundary", "noexpand", "noindent", "nolimits", "nonscript", "nonstopmode", "nulldelimiterspace", "nullfont", "number", "omit", "openin", "openout", "or", "outer", "output", "outputpenalty", "over", "overfullrule", "overline", "overwithdelims", "pagedepth", "pagefilllstretch", "pagefillstretch", "pagefilstretch", "pagegoal", "pageshrink", "pagestretch", "pagetotal", "par", "parfillskip", "parindent", "parshape", "parskip", "patterns", "pausing", "penalty", "postdisplaypenalty", "predisplaypenalty", "predisplaysize", "pretolerance", "prevdepth", "prevgraf", "protrusionboundary", "radical", "raise", "read", "relax", "relpenalty", "right", "righthyphenmin", "rightskip", "romannumeral", "scriptfont", "scriptscriptfont", "scriptscriptstyle", "scriptspace", "scriptstyle", "scrollmode", "setbox", "setlanguage", "sfcode", "shipout", "show", "showbox", "showboxbreadth", "showboxdepth", "showlists", "showthe", "skewchar", "skip", "skipdef", "spacefactor", "spaceskip", "span", "special", "splitbotmark", "splitfirstmark", "splitmaxdepth", "splittopskip", "string", "tabskip", "textfont", "textstyle", "the", "thickmuskip", "thinmuskip", "time", "toks", "toksdef", "tolerance", "topmark", "topskip", "tpack", "tracingcommands", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingpages", "tracingparagraphs", "tracingrestores", "tracingstats", "uccode", "uchyph", "underline", "unhbox", "unhcopy", "unkern", "unpenalty", "unskip", "unvbox", "unvcopy", "uppercase", "vadjust", "valign", "vbadness", "vbox", "vcenter", "vfil", "vfill", "vfilneg", "vfuzz", "voffset", "vpack", "vrule", "vsize", "vskip", "vsplit", "vss", "vtop", "wd", "widowpenalty", "wordboundary", "write", "xdef", "xleaders", "xspaceskip", "year" },
+ ["tex"]={ " ", "-", "/", "above", "abovedisplayshortskip", "abovedisplayskip", "abovewithdelims", "accent", "adjdemerits", "advance", "afterassignment", "aftergroup", "atop", "atopwithdelims", "badness", "baselineskip", "batchmode", "begingroup", "belowdisplayshortskip", "belowdisplayskip", "binoppenalty", "botmark", "box", "boxmaxdepth", "brokenpenalty", "catcode", "char", "chardef", "cleaders", "closein", "clubpenalty", "copy", "count", "countdef", "cr", "crcr", "csname", "day", "deadcycles", "def", "defaulthyphenchar", "defaultskewchar", "delcode", "delimiter", "delimiterfactor", "delimitershortfall", "dimen", "dimendef", "directlua", "discretionary", "displayindent", "displaylimits", "displaystyle", "displaywidowpenalty", "displaywidth", "divide", "doublehyphendemerits", "dp", "dump", "edef", "else", "emergencystretch", "end", "endcsname", "endgroup", "endinput", "endlinechar", "eqno", "errhelp", "errmessage", "errorcontextlines", "errorstopmode", "escapechar", "everycr", "everydisplay", "everyhbox", "everyjob", "everymath", "everypar", "everytab", "everyvbox", "exhyphenchar", "exhyphenpenalty", "expandafter", "fam", "fi", "finalhyphendemerits", "firstmark", "floatingpenalty", "font", "fontdimen", "fontname", "futurelet", "gdef", "global", "globaldefs", "halign", "hangafter", "hangindent", "hbadness", "hbox", "hfil", "hfill", "hfilneg", "hfuzz", "hoffset", "holdinginserts", "hrule", "hsize", "hskip", "hss", "ht", "hyphenation", "hyphenchar", "hyphenpenalty", "if", "ifcase", "ifcat", "ifdim", "ifeof", "iffalse", "ifhbox", "ifhmode", "ifinner", "ifmmode", "ifnum", "ifodd", "iftrue", "ifvbox", "ifvmode", "ifvoid", "ifx", "ignorespaces", "indent", "input", "inputlineno", "insert", "insertpenalties", "interlinepenalty", "jobname", "kern", "language", "lastbox", "lastkern", "lastpenalty", "lastskip", "lccode", "leaders", "left", "lefthyphenmin", "leftskip", "leqno", "let", "limits", "linepenalty", "lineskip", "lineskiplimit", "long", "looseness", "lower", "lowercase", "mag", "mark", "mathaccent", "mathbin", "mathchar", "mathchardef", "mathchoice", "mathclose", "mathcode", "mathinner", "mathop", "mathopen", "mathord", "mathpunct", "mathrel", "mathsurround", "maxdeadcycles", "maxdepth", "meaning", "medmuskip", "message", "middle", "mkern", "month", "moveleft", "moveright", "mskip", "multiply", "muskip", "muskipdef", "newlinechar", "noalign", "noexpand", "noindent", "nolimits", "nonscript", "nonstopmode", "nulldelimiterspace", "nullfont", "number", "omit", "openin", "or", "ordlimits", "orelse", "outer", "output", "outputpenalty", "over", "overfullrule", "overline", "overwithdelims", "pagedepth", "pagefilllstretch", "pagefillstretch", "pagefilstretch", "pagegoal", "pageshrink", "pagestretch", "pagetotal", "par", "parfillskip", "parindent", "parshape", "parskip", "patterns", "pausing", "penalty", "postdisplaypenalty", "predisplaypenalty", "predisplaysize", "pretolerance", "prevdepth", "prevgraf", "radical", "raise", "read", "relax", "relpenalty", "right", "righthyphenmin", "rightskip", "romannumeral", "scriptfont", "scriptscriptfont", "scriptscriptstyle", "scriptspace", "scriptstyle", "scrollmode", "setbox", "setlanguage", "sfcode", "shipout", "show", "showbox", "showboxbreadth", "showboxdepth", "showlists", "shownodedetails", "showthe", "skewchar", "skip", "skipdef", "spacefactor", "spaceskip", "span", "splitbotmark", "splitfirstmark", "splitmaxdepth", "splittopskip", "string", "tabskip", "textfont", "textstyle", "the", "thickmuskip", "thinmuskip", "time", "toks", "toksdef", "tolerance", "topmark", "topskip", "tracingcommands", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingpages", "tracingparagraphs", "tracingrestores", "tracingstats", "uccode", "uchyph", "underline", "unhbox", "unhcopy", "unkern", "unpenalty", "unskip", "unvbox", "unvcopy", "uppercase", "vadjust", "valign", "vbadness", "vbox", "vcenter", "vfil", "vfill", "vfilneg", "vfuzz", "voffset", "vrule", "vsize", "vskip", "vsplit", "vss", "vtop", "wd", "widowpenalty", "xdef", "xleaders", "xspaceskip", "year" },
["xetex"]={ "XeTeXversion" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-cpp.lua b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-cpp.lua
index d9079855fa7..a50cdaa1756 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-cpp.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-cpp.lua
@@ -28,6 +28,7 @@ local keywords = { -- copied from cpp.lua
"restrict",
-- hm
"_Bool", "_Complex", "_Pragma", "_Imaginary",
+ "boolean",
-- c++.
"catch", "class", "const_cast", "delete", "dynamic_cast", "explicit",
"export", "friend", "mutable", "namespace", "new", "operator", "private",
@@ -46,6 +47,11 @@ local macros = { -- copied from cpp.lua
"include", "line", "pragma", "undef", "using", "warning"
}
+local luatexs = {
+ "word", "halfword", "quarterword", "scaledwhd", "scaled", "pointer", "glueratio", "strnumber",
+ "dumpstream", "memoryword",
+}
+
local space = patterns.space -- S(" \n\r\t\f\v")
local any = patterns.any
local restofline = patterns.restofline
@@ -90,10 +96,12 @@ local operator = token("special", S("+-*/%^!=<>;:{}[]().&|?~"))
local p_keywords = exact_match(keywords)
local p_datatypes = exact_match(datatypes)
local p_macros = exact_match(macros)
+local p_luatexs = exact_match(luatexs)
local keyword = token("keyword", p_keywords)
local datatype = token("keyword", p_datatypes)
local identifier = token("default", validword)
+local luatex = token("command", p_luatexs)
local macro = token("data", #P("#") * startofline * P("#") * S("\t ")^0 * p_macros)
@@ -101,6 +109,7 @@ cpplexer._rules = {
{ "whitespace", spacing },
{ "keyword", keyword },
{ "type", datatype },
+ { "luatex", luatex },
{ "identifier", identifier },
{ "string", shortstring },
{ "longcomment", longcomment },
@@ -121,6 +130,7 @@ if web then
{ "whitespace", spacing },
{ "keyword", keyword },
{ "type", datatype },
+ { "luatex", luatex },
{ "identifier", identifier },
{ "string", shortstring },
{ "longcomment", longcomment },
@@ -140,6 +150,7 @@ else
{ "whitespace", spacing },
{ "keyword", keyword },
{ "type", datatype },
+ { "luatex", luatex },
{ "identifier", identifier },
{ "string", shortstring },
{ "longcomment", longcomment },
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-json.lua b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-json.lua
index 20a2d1d1220..ca7add07d87 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-json.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-json.lua
@@ -36,9 +36,10 @@ local spaces = space^1
local operator = S(':,{}[]')
local fence = openarray + closearray + openhash + closehash
-local escape_un = P("\\u") / "0x" * S("09","AF","af")
-local escape_bs = P([[\]]) * P(1)
-local content = (escape_un + escape_bs + (1-double))^0
+local escape_un = P("\\u") * S("09","AF","af")
+local escape_bs = P("\\") * P(1)
+----- content = (escape_un + escape_bs + (1-double))^0
+local content = (escape_bs + (1-double))^0
local reserved = P("true")
+ P("false")
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-lua.lua b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-lua.lua
index ba14f5206c0..0e54d56ba23 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-lua.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-lua.lua
@@ -56,7 +56,9 @@ local constants = {
"__le", "__lt", "__metatable", "__mode", "__mul", "__newindex",
"__pow", "__sub", "__tostring", "__unm", "__len",
"__pairs", "__ipairs",
+ "__close",
"NaN",
+ "<const>", "<toclose>",
}
-- local tokenmappings = { }
@@ -66,9 +68,11 @@ local constants = {
-- for i=1,#constants do tokenmappings[constants[i]] = "constant" }
local internals = { -- __
- "add", "call", "concat", "div", "eq", "gc", "index",
+ "add", "call", "concat", "div", "idiv", "eq", "gc", "index",
"le", "lt", "metatable", "mode", "mul", "newindex",
"pow", "sub", "tostring", "unm", "len",
+ "pairs", "ipairs",
+ "close",
}
local depricated = {
@@ -80,8 +84,8 @@ local depricated = {
local csnames = { -- todo: option
"commands",
"context",
--- "ctxcmd",
--- "ctx",
+ -- "ctxcmd",
+ -- "ctx",
"metafun",
"metapost",
}
@@ -224,10 +228,12 @@ local csname = token("user", p_csnames + p_ctnames)
+ ( token("special", S(".:")) * optionalspace * token("user", validword) )^1
)^-1
+-- we could also check S(".:") * p_keyword etc, could be faster
+
local identifier = token("default", validword)
* ( optionalspace * token("special", S(".:")) * optionalspace * (
token("warning", p_keywords) +
- token("data", p_internals) +
+ token("data", p_internals) + -- needs checking
token("default", validword )
) )^0
@@ -375,12 +381,14 @@ lualexer._rules_cld = {
{ "keyword", keyword },
{ "function", builtin },
{ "csname", csname },
+ { "goto", gotokeyword },
{ "constant", constant },
{ "identifier", identifier },
{ "string", string },
{ "longcomment", longcomment },
{ "shortcomment", shortcomment }, -- should not be used inline so best signal it as comment (otherwise complex state till end of inline)
{ "number", number },
+ { "label", gotolabel },
{ "operator", operator },
{ "rest", rest },
}
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-mps.lua b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-mps.lua
index 4bbfae03cff..356bf1f6b45 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-mps.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-mps.lua
@@ -86,6 +86,7 @@ local rest = token("default", any)
local comment = token("comment", P("%") * (1-S("\n\r"))^0)
local internal = token("reserved", exact_match(mergedshortcuts,false))
local shortcut = token("data", exact_match(mergedinternals))
+
local helper = token("command", exact_match(metafuncommands))
local plain = token("plain", exact_match(metapostcommands))
local quoted = token("quote", dquote)
@@ -128,9 +129,12 @@ lexer.embed_lexer(metafunlexer, cldlexer, startluacode, stopluacode)
local luacall = token("embedded",P("lua") * ( P(".") * R("az","AZ","__")^1 )^1)
+local keyword = token("default", (R("AZ","az","__")^1) * # P(space^0 * P("=")))
+
metafunlexer._rules = {
{ "whitespace", spacing },
{ "comment", comment },
+ { "keyword", keyword }, -- experiment, maybe to simple
{ "internal", internal },
{ "shortcut", shortcut },
{ "luacall", luacall },
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-sas.lua b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-sas.lua
new file mode 100644
index 00000000000..e3656991137
--- /dev/null
+++ b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-sas.lua
@@ -0,0 +1,102 @@
+local info = {
+ version = 1.001,
+ comment = "scintilla lpeg lexer for sas",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+-- todo: make this ok for the sas syntax as now it's sql
+
+local P, R, S = lpeg.P, lpeg.R, lpeg.S
+
+local lexer = require("scite-context-lexer")
+local context = lexer.context
+local patterns = context.patterns
+
+local token = lexer.token
+local exact_match = lexer.exact_match
+
+local saslexer = lexer.new("sas","scite-context-lexer-sAs")
+local whitespace = saslexer.whitespace
+
+local keywords_standard = {
+ "anova" , "data", "run", "proc",
+}
+
+local keywords_dialects = {
+ "class" , "do", "end" , "int" , "for" , "model" , "rannor" , "to" , "output"
+}
+
+local space = patterns.space -- S(" \n\r\t\f\v")
+local any = patterns.any
+local restofline = patterns.restofline
+local startofline = patterns.startofline
+
+local squote = P("'")
+local dquote = P('"')
+local bquote = P('`')
+local escaped = P("\\") * P(1)
+
+local begincomment = P("/*")
+local endcomment = P("*/")
+
+local decimal = patterns.decimal
+local float = patterns.float
+local integer = P("-")^-1 * decimal
+
+local spacing = token(whitespace, space^1)
+local rest = token("default", any)
+
+local shortcomment = token("comment", (P("#") + P("--")) * restofline^0)
+local longcomment = token("comment", begincomment * (1-endcomment)^0 * endcomment^-1)
+
+local identifier = token("default",lexer.helpers.utfidentifier)
+
+local shortstring = token("quote", dquote) -- can be shared
+ * token("string", (escaped + (1-dquote))^0)
+ * token("quote", dquote)
+ + token("quote", squote)
+ * token("string", (escaped + (1-squote))^0)
+ * token("quote", squote)
+ + token("quote", bquote)
+ * token("string", (escaped + (1-bquote))^0)
+ * token("quote", bquote)
+
+local p_keywords_s = exact_match(keywords_standard,nil,true)
+local p_keywords_d = exact_match(keywords_dialects,nil,true)
+local keyword_s = token("keyword", p_keywords_s)
+local keyword_d = token("command", p_keywords_d)
+
+local number = token("number", float + integer)
+local operator = token("special", S("+-*/%^!=<>;:{}[]().&|?~"))
+
+saslexer._tokenstyles = context.styleset
+
+saslexer._foldpattern = P("/*") + P("*/") + S("{}") -- separate entry else interference
+
+saslexer._foldsymbols = {
+ _patterns = {
+ "/%*",
+ "%*/",
+ },
+ ["comment"] = {
+ ["/*"] = 1,
+ ["*/"] = -1,
+ }
+}
+
+saslexer._rules = {
+ { "whitespace", spacing },
+ { "keyword-s", keyword_s },
+ { "keyword-d", keyword_d },
+ { "identifier", identifier },
+ { "string", shortstring },
+ { "longcomment", longcomment },
+ { "shortcomment", shortcomment },
+ { "number", number },
+ { "operator", operator },
+ { "rest", rest },
+}
+
+return saslexer
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-web-snippets.lua b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-web-snippets.lua
index 3cef717393e..5121030cc69 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-web-snippets.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer-web-snippets.lua
@@ -75,7 +75,7 @@ local t_reference = token("label",p_reference) * token("function",(1-p_endofweb)
-- @'char' (ascii code)
-local p_character = p_beginofweb * S("'")
+local p_character = p_beginofweb * squote
local t_character = token("label",p_character) * token("reserved",(1-squote)^1) * token("label",squote)
-- @l nonascii
@@ -129,5 +129,4 @@ websnippets.pattern = P (
+ t_escape
)
-
return websnippets
diff --git a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer.lua b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer.lua
index 234b03c0598..8451abc85cb 100644
--- a/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer.lua
+++ b/Master/texmf-dist/context/data/scite/context/lexers/scite-context-lexer.lua
@@ -2240,6 +2240,10 @@ do
local utf8three = R("\224\239") * utf8next * utf8next
local utf8four = R("\240\244") * utf8next * utf8next * utf8next
+ local utfidentifier = utf8two + utf8three + utf8four
+ helpers.utfidentifier = (R("AZ","az","__") + utfidentifier)
+ * (R("AZ","az","__","09") + utfidentifier)^0
+
helpers.utfcharpattern = P(1) * utf8next^0 -- unchecked but fast
helpers.utfbytepattern = utf8one / byte
+ utf8two / function(s) local c1, c2 = byte(s,1,2) return c1 * 64 + c2 - 12416 end
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context-data-context.properties b/Master/texmf-dist/context/data/scite/context/scite-context-data-context.properties
index c70aadab25b..6891c94000c 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context-data-context.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context-data-context.properties
@@ -72,7 +72,8 @@ fourperemspace fiveperemspace sixperemspace figurespace punctuationspace \
hairspace enquad emquad zerowidthspace zerowidthnonjoiner \
zerowidthjoiner zwnj zwj optionalspace asciispacechar \
softhyphen Ux eUx Umathaccents parfillleftskip \
-parfillrightskip
+parfillrightskip startlmtxmode stoplmtxmode startmkivmode stopmkivmode \
+wildcardsymbol
keywordclass.context.helpers=\
startsetups stopsetups startxmlsetups stopxmlsetups \
@@ -119,8 +120,9 @@ globalscratchcounterthree groupedcommand groupedcommandcs triggergroupedcommand
simplegroupedcommand pickupgroupedcommand normalbaselineskip normallineskip normallineskiplimit \
availablehsize localhsize setlocalhsize distributedhsize hsizefraction \
next nexttoken nextbox dowithnextbox dowithnextboxcs \
-dowithnextboxcontent dowithnextboxcontentcs flushnextbox boxisempty scratchwidth \
-scratchheight scratchdepth scratchoffset scratchdistance scratchhsize \
+dowithnextboxcontent dowithnextboxcontentcs flushnextbox boxisempty givenwidth \
+givenheight givendepth scangivendimensions scratchwidth scratchheight \
+scratchdepth scratchoffset scratchdistance scratchtotal scratchhsize \
scratchvsize scratchxoffset scratchyoffset scratchhoffset scratchvoffset \
scratchxposition scratchyposition scratchtopoffset scratchbottomoffset scratchleftoffset \
scratchrightoffset scratchcounterone scratchcountertwo scratchcounterthree scratchcounterfour \
@@ -134,108 +136,113 @@ scratchboxfive scratchboxsix scratchnx scratchny scratchmx \
scratchmy scratchunicode scratchmin scratchmax scratchleftskip \
scratchrightskip scratchtopskip scratchbottomskip doif doifnot \
doifelse firstinset doifinset doifnotinset doifelseinset \
-doifinsetelse doifelsenextchar doifnextcharelse doifelsenextoptional doifnextoptionalelse \
-doifelsenextoptionalcs doifnextoptionalcselse doifelsefastoptionalcheck doiffastoptionalcheckelse doifelsefastoptionalcheckcs \
-doiffastoptionalcheckcselse doifelsenextbgroup doifnextbgroupelse doifelsenextbgroupcs doifnextbgroupcselse \
-doifelsenextparenthesis doifnextparenthesiselse doifelseundefined doifundefinedelse doifelsedefined \
-doifdefinedelse doifundefined doifdefined doifelsevalue doifvalue \
-doifnotvalue doifnothing doifsomething doifelsenothing doifnothingelse \
-doifelsesomething doifsomethingelse doifvaluenothing doifvaluesomething doifelsevaluenothing \
-doifvaluenothingelse doifelsedimension doifdimensionelse doifelsenumber doifnumberelse \
-doifnumber doifnotnumber doifelsecommon doifcommonelse doifcommon \
-doifnotcommon doifinstring doifnotinstring doifelseinstring doifinstringelse \
-doifelseassignment doifassignmentelse docheckassignment doifelseassignmentcs doifassignmentelsecs \
-doiftext doifelsetext doiftextelse doifnottext tracingall \
-tracingnone loggingall removetoks appendtoks prependtoks \
-appendtotoks prependtotoks to endgraf endpar \
-everyendpar reseteverypar finishpar empty null \
-space quad enspace emspace charspace \
-nbsp crlf obeyspaces obeylines obeyedspace \
-obeyedline obeyedtab obeyedpage normalspace executeifdefined \
-singleexpandafter doubleexpandafter tripleexpandafter dontleavehmode removelastspace \
-removeunwantedspaces keepunwantedspaces removepunctuation ignoreparskip forcestrutdepth \
-onlynonbreakablespace wait writestatus define defineexpandable \
-redefine setmeasure setemeasure setgmeasure setxmeasure \
-definemeasure freezemeasure measure measured installcorenamespace \
-getvalue getuvalue setvalue setevalue setgvalue \
-setxvalue letvalue letgvalue resetvalue undefinevalue \
-ignorevalue setuvalue setuevalue setugvalue setuxvalue \
-globallet glet udef ugdef uedef \
-uxdef checked unique getparameters geteparameters \
-getgparameters getxparameters forgetparameters copyparameters getdummyparameters \
-dummyparameter directdummyparameter setdummyparameter letdummyparameter setexpandeddummyparameter \
-usedummystyleandcolor usedummystyleparameter usedummycolorparameter processcommalist processcommacommand \
-quitcommalist quitprevcommalist processaction processallactions processfirstactioninset \
-processallactionsinset unexpanded expanded startexpanded stopexpanded \
-protected protect unprotect firstofoneargument firstoftwoarguments \
-secondoftwoarguments firstofthreearguments secondofthreearguments thirdofthreearguments firstoffourarguments \
-secondoffourarguments thirdoffourarguments fourthoffourarguments firstoffivearguments secondoffivearguments \
-thirdoffivearguments fourthoffivearguments fifthoffivearguments firstofsixarguments secondofsixarguments \
-thirdofsixarguments fourthofsixarguments fifthofsixarguments sixthofsixarguments firstofoneunexpanded \
-firstoftwounexpanded secondoftwounexpanded firstofthreeunexpanded secondofthreeunexpanded thirdofthreeunexpanded \
-gobbleoneargument gobbletwoarguments gobblethreearguments gobblefourarguments gobblefivearguments \
-gobblesixarguments gobblesevenarguments gobbleeightarguments gobbleninearguments gobbletenarguments \
-gobbleoneoptional gobbletwooptionals gobblethreeoptionals gobblefouroptionals gobblefiveoptionals \
-dorecurse doloop exitloop dostepwiserecurse recurselevel \
-recursedepth dofastloopcs fastloopindex fastloopfinal dowith \
-newconstant setnewconstant setconstant setconstantvalue newconditional \
-settrue setfalse settruevalue setfalsevalue newmacro \
-setnewmacro newfraction newsignal dosingleempty dodoubleempty \
-dotripleempty doquadrupleempty doquintupleempty dosixtupleempty doseventupleempty \
-dosingleargument dodoubleargument dotripleargument doquadrupleargument doquintupleargument \
-dosixtupleargument doseventupleargument dosinglegroupempty dodoublegroupempty dotriplegroupempty \
-doquadruplegroupempty doquintuplegroupempty permitspacesbetweengroups dontpermitspacesbetweengroups nopdfcompression \
-maximumpdfcompression normalpdfcompression onlypdfobjectcompression nopdfobjectcompression modulonumber \
-dividenumber getfirstcharacter doifelsefirstchar doiffirstcharelse startnointerference \
-stopnointerference twodigits threedigits leftorright offinterlineskip \
-oninterlineskip nointerlineskip strut halfstrut quarterstrut \
-depthstrut halflinestrut noheightstrut setstrut strutbox \
-strutht strutdp strutwd struthtdp strutgap \
-begstrut endstrut lineheight leftboundary rightboundary \
-signalcharacter ordordspacing ordopspacing ordbinspacing ordrelspacing \
-ordopenspacing ordclosespacing ordpunctspacing ordinnerspacing opordspacing \
-opopspacing opbinspacing oprelspacing opopenspacing opclosespacing \
-oppunctspacing opinnerspacing binordspacing binopspacing binbinspacing \
-binrelspacing binopenspacing binclosespacing binpunctspacing bininnerspacing \
-relordspacing relopspacing relbinspacing relrelspacing relopenspacing \
-relclosespacing relpunctspacing relinnerspacing openordspacing openopspacing \
-openbinspacing openrelspacing openopenspacing openclosespacing openpunctspacing \
-openinnerspacing closeordspacing closeopspacing closebinspacing closerelspacing \
-closeopenspacing closeclosespacing closepunctspacing closeinnerspacing punctordspacing \
-punctopspacing punctbinspacing punctrelspacing punctopenspacing punctclosespacing \
-punctpunctspacing punctinnerspacing innerordspacing inneropspacing innerbinspacing \
-innerrelspacing inneropenspacing innerclosespacing innerpunctspacing innerinnerspacing \
-normalreqno startimath stopimath normalstartimath normalstopimath \
-startdmath stopdmath normalstartdmath normalstopdmath normalsuperscript \
-normalsubscript normalnosuperscript normalnosubscript superscript subscript \
-nosuperscript nosubscript uncramped cramped triggermathstyle \
-mathstylefont mathsmallstylefont mathstyleface mathsmallstyleface mathstylecommand \
-mathpalette mathstylehbox mathstylevbox mathstylevcenter mathstylevcenteredhbox \
-mathstylevcenteredvbox mathtext setmathsmalltextbox setmathtextbox pushmathstyle \
-popmathstyle triggerdisplaystyle triggertextstyle triggerscriptstyle triggerscriptscriptstyle \
-triggeruncrampedstyle triggercrampedstyle triggersmallstyle triggeruncrampedsmallstyle triggercrampedsmallstyle \
-triggerbigstyle triggeruncrampedbigstyle triggercrampedbigstyle luaexpr expelsedoif \
-expdoif expdoifnot expdoifelsecommon expdoifcommonelse expdoifelseinset \
-expdoifinsetelse ctxdirectlua ctxlatelua ctxsprint ctxwrite \
-ctxcommand ctxdirectcommand ctxlatecommand ctxreport ctxlua \
-luacode lateluacode directluacode registerctxluafile ctxloadluafile \
-luaversion luamajorversion luaminorversion ctxluacode luaconditional \
-luaexpanded startluaparameterset stopluaparameterset luaparameterset definenamedlua \
-obeylualines obeyluatokens startluacode stopluacode startlua \
-stoplua startctxfunction stopctxfunction ctxfunction startctxfunctiondefinition \
-stopctxfunctiondefinition installctxfunction installprotectedctxfunction installprotectedctxscanner installctxscanner \
-resetctxscanner cldprocessfile cldloadfile cldloadviafile cldcontext \
-cldcommand carryoverpar lastlinewidth assumelongusagecs Umathbotaccent \
-righttolefthbox lefttorighthbox righttoleftvbox lefttorightvbox righttoleftvtop \
-lefttorightvtop rtlhbox ltrhbox rtlvbox ltrvbox \
-rtlvtop ltrvtop autodirhbox autodirvbox autodirvtop \
-leftorrighthbox leftorrightvbox leftorrightvtop lefttoright righttoleft \
-checkedlefttoright checkedrighttoleft synchronizelayoutdirection synchronizedisplaydirection synchronizeinlinedirection \
-dirlre dirrle dirlro dirrlo lesshyphens \
-morehyphens nohyphens dohyphens Ucheckedstartdisplaymath Ucheckedstopdisplaymath \
-break nobreak allowbreak goodbreak nospace \
-nospacing dospacing naturalhbox naturalvbox naturalvtop \
-naturalhpack naturalvpack naturaltpack reversehbox reversevbox \
-reversevtop reversehpack reversevpack reversetpack frule \
-compoundhyphenpenalty start stop
+doifinsetelse doifelsenextchar doifnextcharelse doifelsenextcharcs doifnextcharcselse \
+doifelsenextoptional doifnextoptionalelse doifelsenextoptionalcs doifnextoptionalcselse doifelsefastoptionalcheck \
+doiffastoptionalcheckelse doifelsefastoptionalcheckcs doiffastoptionalcheckcselse doifelsenextbgroup doifnextbgroupelse \
+doifelsenextbgroupcs doifnextbgroupcselse doifelsenextparenthesis doifnextparenthesiselse doifelseundefined \
+doifundefinedelse doifelsedefined doifdefinedelse doifundefined doifdefined \
+doifelsevalue doifvalue doifnotvalue doifnothing doifsomething \
+doifelsenothing doifnothingelse doifelsesomething doifsomethingelse doifvaluenothing \
+doifvaluesomething doifelsevaluenothing doifvaluenothingelse doifelsedimension doifdimensionelse \
+doifelsenumber doifnumberelse doifnumber doifnotnumber doifelsecommon \
+doifcommonelse doifcommon doifnotcommon doifinstring doifnotinstring \
+doifelseinstring doifinstringelse doifelseassignment doifassignmentelse docheckassignment \
+doifelseassignmentcs doifassignmentelsecs validassignment novalidassignment doiftext \
+doifelsetext doiftextelse doifnottext quitcondition truecondition \
+falsecondition tracingall tracingnone loggingall removetoks \
+appendtoks prependtoks appendtotoks prependtotoks to \
+endgraf endpar everyendpar reseteverypar finishpar \
+empty null space quad enspace \
+emspace charspace nbsp crlf obeyspaces \
+obeylines obeyedspace obeyedline obeyedtab obeyedpage \
+normalspace executeifdefined singleexpandafter doubleexpandafter tripleexpandafter \
+dontleavehmode removelastspace removeunwantedspaces keepunwantedspaces removepunctuation \
+ignoreparskip forcestrutdepth onlynonbreakablespace wait writestatus \
+define defineexpandable redefine setmeasure setemeasure \
+setgmeasure setxmeasure definemeasure freezemeasure measure \
+measured directmeasure setquantity setequantity setgquantity \
+setxquantity definequantity freezequantity quantity quantitied \
+directquantity installcorenamespace getvalue getuvalue setvalue \
+setevalue setgvalue setxvalue letvalue letgvalue \
+resetvalue undefinevalue ignorevalue setuvalue setuevalue \
+setugvalue setuxvalue globallet glet udef \
+ugdef uedef uxdef checked unique \
+getparameters geteparameters getgparameters getxparameters forgetparameters \
+copyparameters getdummyparameters dummyparameter directdummyparameter setdummyparameter \
+letdummyparameter setexpandeddummyparameter usedummystyleandcolor usedummystyleparameter usedummycolorparameter \
+processcommalist processcommacommand quitcommalist quitprevcommalist processaction \
+processallactions processfirstactioninset processallactionsinset unexpanded expanded \
+startexpanded stopexpanded protected protect unprotect \
+firstofoneargument firstoftwoarguments secondoftwoarguments firstofthreearguments secondofthreearguments \
+thirdofthreearguments firstoffourarguments secondoffourarguments thirdoffourarguments fourthoffourarguments \
+firstoffivearguments secondoffivearguments thirdoffivearguments fourthoffivearguments fifthoffivearguments \
+firstofsixarguments secondofsixarguments thirdofsixarguments fourthofsixarguments fifthofsixarguments \
+sixthofsixarguments firstofoneunexpanded firstoftwounexpanded secondoftwounexpanded firstofthreeunexpanded \
+secondofthreeunexpanded thirdofthreeunexpanded gobbleoneargument gobbletwoarguments gobblethreearguments \
+gobblefourarguments gobblefivearguments gobblesixarguments gobblesevenarguments gobbleeightarguments \
+gobbleninearguments gobbletenarguments gobbleoneoptional gobbletwooptionals gobblethreeoptionals \
+gobblefouroptionals gobblefiveoptionals dorecurse doloop exitloop \
+dostepwiserecurse recurselevel recursedepth dofastloopcs fastloopindex \
+fastloopfinal dowith newconstant setnewconstant setconstant \
+setconstantvalue newconditional settrue setfalse settruevalue \
+setfalsevalue newmacro setnewmacro newfraction newsignal \
+dosingleempty dodoubleempty dotripleempty doquadrupleempty doquintupleempty \
+dosixtupleempty doseventupleempty dosingleargument dodoubleargument dotripleargument \
+doquadrupleargument doquintupleargument dosixtupleargument doseventupleargument dosinglegroupempty \
+dodoublegroupempty dotriplegroupempty doquadruplegroupempty doquintuplegroupempty permitspacesbetweengroups \
+dontpermitspacesbetweengroups nopdfcompression maximumpdfcompression normalpdfcompression onlypdfobjectcompression \
+nopdfobjectcompression modulonumber dividenumber getfirstcharacter doifelsefirstchar \
+doiffirstcharelse startnointerference stopnointerference twodigits threedigits \
+leftorright offinterlineskip oninterlineskip nointerlineskip strut \
+halfstrut quarterstrut depthstrut halflinestrut noheightstrut \
+setstrut strutbox strutht strutdp strutwd \
+struthtdp strutgap begstrut endstrut lineheight \
+leftboundary rightboundary signalcharacter shiftbox vpackbox \
+hpackbox vpackedbox hpackedbox ordordspacing ordopspacing \
+ordbinspacing ordrelspacing ordopenspacing ordclosespacing ordpunctspacing \
+ordinnerspacing opordspacing opopspacing opbinspacing oprelspacing \
+opopenspacing opclosespacing oppunctspacing opinnerspacing binordspacing \
+binopspacing binbinspacing binrelspacing binopenspacing binclosespacing \
+binpunctspacing bininnerspacing relordspacing relopspacing relbinspacing \
+relrelspacing relopenspacing relclosespacing relpunctspacing relinnerspacing \
+openordspacing openopspacing openbinspacing openrelspacing openopenspacing \
+openclosespacing openpunctspacing openinnerspacing closeordspacing closeopspacing \
+closebinspacing closerelspacing closeopenspacing closeclosespacing closepunctspacing \
+closeinnerspacing punctordspacing punctopspacing punctbinspacing punctrelspacing \
+punctopenspacing punctclosespacing punctpunctspacing punctinnerspacing innerordspacing \
+inneropspacing innerbinspacing innerrelspacing inneropenspacing innerclosespacing \
+innerpunctspacing innerinnerspacing normalreqno startimath stopimath \
+normalstartimath normalstopimath startdmath stopdmath normalstartdmath \
+normalstopdmath normalsuperscript normalsubscript normalnosuperscript normalnosubscript \
+superscript subscript nosuperscript nosubscript uncramped \
+cramped triggermathstyle mathstylefont mathsmallstylefont mathstyleface \
+mathsmallstyleface mathstylecommand mathpalette mathstylehbox mathstylevbox \
+mathstylevcenter mathstylevcenteredhbox mathstylevcenteredvbox mathtext setmathsmalltextbox \
+setmathtextbox pushmathstyle popmathstyle triggerdisplaystyle triggertextstyle \
+triggerscriptstyle triggerscriptscriptstyle triggeruncrampedstyle triggercrampedstyle triggersmallstyle \
+triggeruncrampedsmallstyle triggercrampedsmallstyle triggerbigstyle triggeruncrampedbigstyle triggercrampedbigstyle \
+luaexpr expelsedoif expdoif expdoifnot expdoifelsecommon \
+expdoifcommonelse expdoifelseinset expdoifinsetelse ctxdirectlua ctxlatelua \
+ctxsprint ctxwrite ctxcommand ctxdirectcommand ctxlatecommand \
+ctxreport ctxlua luacode lateluacode directluacode \
+registerctxluafile ctxloadluafile luaversion luamajorversion luaminorversion \
+ctxluacode luaconditional luaexpanded startluaparameterset stopluaparameterset \
+luaparameterset definenamedlua obeylualines obeyluatokens startluacode \
+stopluacode startlua stoplua startctxfunction stopctxfunction \
+ctxfunction startctxfunctiondefinition stopctxfunctiondefinition installctxfunction installprotectedctxfunction \
+installprotectedctxscanner installctxscanner resetctxscanner cldprocessfile cldloadfile \
+cldloadviafile cldcontext cldcommand carryoverpar lastlinewidth \
+assumelongusagecs Umathbotaccent righttolefthbox lefttorighthbox righttoleftvbox \
+lefttorightvbox righttoleftvtop lefttorightvtop rtlhbox ltrhbox \
+rtlvbox ltrvbox rtlvtop ltrvtop autodirhbox \
+autodirvbox autodirvtop leftorrighthbox leftorrightvbox leftorrightvtop \
+lefttoright righttoleft checkedlefttoright checkedrighttoleft synchronizelayoutdirection \
+synchronizedisplaydirection synchronizeinlinedirection dirlre dirrle dirlro \
+dirrlo lesshyphens morehyphens nohyphens dohyphens \
+Ucheckedstartdisplaymath Ucheckedstopdisplaymath break nobreak allowbreak \
+goodbreak nospace nospacing dospacing naturalhbox \
+naturalvbox naturalvtop naturalhpack naturalvpack naturaltpack \
+reversehbox reversevbox reversevtop reversehpack reversevpack \
+reversetpack frule compoundhyphenpenalty start stop \
+unsupportedcs
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context-data-interfaces.properties b/Master/texmf-dist/context/data/scite/context/scite-context-data-interfaces.properties
index 73480b18748..626ee931bd0 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context-data-interfaces.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context-data-interfaces.properties
@@ -30,64 +30,65 @@ Icircumflex Idiaeresis Idotaccent Idotbelow Idoublegrave \
Igrave Ihook Iinvertedbreve Im Imacron \
Iogonek Iota Istroke Itilde Jcircumflex \
Join Kappa Kcaron Kcommaaccent Khook \
-LAMSTEX LATEX LJligature LUAJITTEX LUATEX \
-LaTeX Lacute LamSTeX Lambda Lbar \
-Lcaron Lcommaaccent Ldotmiddle Ldsh Leftarrow \
-Leftrightarrow Ljligature Lleftarrow Longleftarrow Longleftrightarrow \
-Longmapsfrom Longmapsto Longrightarrow Lsh Lstroke \
-Lua LuaTeX LuajitTeX METAFONT METAFUN \
-METAPOST MKII MKIV MKIX MKVI \
-MKXI MONTH MONTHLONG MONTHSHORT MPII \
-MPIV MPVI MPanchor MPbetex MPc \
-MPcode MPcolor MPcoloronly MPcolumn MPd \
-MPdrawing MPfontsizehskip MPgetmultipars MPgetmultishape MPgetposboxes \
-MPh MPinclusions MPleftskip MPll MPlr \
-MPls MPmenubuttons MPn MPoptions MPoverlayanchor \
-MPp MPpage MPpardata MPplus MPpos \
-MPpositiongraphic MPposset MPr MPrawvar MPregion \
-MPrest MPrightskip MPrs MPstring MPtext \
-MPtransparency MPul MPur MPv MPvar \
-MPvariable MPvv MPw MPwhd MPx \
-MPxy MPxywhd MPy Mapsfrom Mapsto \
-MetaFont MetaFun MetaPost Mu NJligature \
-Nacute Ncaron Ncommaaccent Nearrow Neng \
-Ngrave Njligature NormalizeFontHeight NormalizeFontWidth NormalizeTextHeight \
-NormalizeTextWidth Ntilde Nu Numbers Nwarrow \
-OEligature Oacute Obreve Ocaron Ocircumflex \
-Ocircumflexacute Ocircumflexdotbelow Ocircumflexgrave Ocircumflexhook Ocircumflextilde \
-Odiaeresis Odiaeresismacron Odotaccent Odotaccentmacron Odotbelow \
-Odoublegrave Ograve Ohook Ohorn Ohornacute \
-Ohorndotbelow Ohorngrave Ohornhook Ohorntilde Ohungarumlaut \
-Oinvertedbreve Omacron Omega Omicron Oogonek \
-Oogonekmacron Ostroke Ostrokeacute Otilde Otildemacron \
-P PDFETEX PDFTEX PDFcolor PICTEX \
-PPCHTEX PPCHTeX PRAGMA Phi Phook \
-Pi PiCTeX Plankconst PointsToBigPoints PointsToReal \
-PointsToWholeBigPoints PropertyLine Psi PtToCm Racute \
-Rcaron Rcommaaccent Rdoublegrave Rdsh Re \
-ReadFile Relbar Rho Rightarrow Rinvertedbreve \
-Romannumerals Rrightarrow Rsh S Sacute \
-ScaledPointsToBigPoints ScaledPointsToWholeBigPoints Scaron Scedilla Schwa \
-Scircumflex Scommaaccent Searrow Sigma Smallcapped \
-Subset Supset Swarrow TABLE TEX \
-TaBlE Tau Tcaron Tcedilla Tcommaaccent \
-TeX TheNormalizedFontSize Theta Thook Thorn \
-TransparencyHack Tstroke Uacute Ubreve Ucaron \
-Ucircumflex Udiaeresis Udiaeresisacute Udiaeresiscaron Udiaeresisgrave \
-Udiaeresismacron Udotbelow Udoublegrave Ugrave Uhook \
-Uhorn Uhornacute Uhorndotbelow Uhorngrave Uhornhook \
-Uhorntilde Uhungarumlaut Uinvertedbreve Umacron Uogonek \
-Uparrow Updownarrow Upsilon Uring Utilde \
-Uuparrow VDash Vdash VerboseNumber Vert \
-Vvdash WEEKDAY WORD WORDS Wcircumflex \
-WidthSpanningText Word Words XETEX XeTeX \
-Xi Yacute Ycircumflex Ydiaeresis Ydotbelow \
-Ygrave Yhook Ymacron Ytilde Zacute \
-Zcaron Zdotaccent Zeta Zhook Zstroke \
-aacute abbreviation abjadnaivenumerals abjadnodotnumerals abjadnumerals \
-about abreve abreveacute abrevedotbelow abrevegrave \
-abrevehook abrevetilde acaron acircumflex acircumflexacute \
-acircumflexdotbelow acircumflexgrave acircumflexhook acircumflextilde activatespacehandler \
+LAMSTEX LATEX LJligature LUAJITTEX LUAMETATEX \
+LUATEX LaTeX Lacute LamSTeX Lambda \
+Lbar Lcaron Lcommaaccent Ldotmiddle Ldsh \
+Leftarrow Leftrightarrow Ljligature Lleftarrow Longleftarrow \
+Longleftrightarrow Longmapsfrom Longmapsto Longrightarrow Lsh \
+Lstroke Lua LuaMetaTeX LuaTeX LuajitTeX \
+METAFONT METAFUN METAPOST MKII MKIV \
+MKIX MKVI MKXI MONTH MONTHLONG \
+MONTHSHORT MPII MPIV MPVI MPanchor \
+MPbetex MPc MPcode MPcolor MPcoloronly \
+MPcolumn MPd MPdrawing MPfontsizehskip MPgetmultipars \
+MPgetmultishape MPgetposboxes MPh MPinclusions MPleftskip \
+MPll MPlr MPls MPmenubuttons MPn \
+MPoptions MPoverlayanchor MPp MPpage MPpardata \
+MPplus MPpos MPpositiongraphic MPposset MPr \
+MPrawvar MPregion MPrest MPrightskip MPrs \
+MPstring MPtext MPtransparency MPul MPur \
+MPv MPvar MPvariable MPvv MPw \
+MPwhd MPx MPxy MPxywhd MPy \
+Mapsfrom Mapsto MetaFont MetaFun MetaPost \
+Mu NJligature Nacute Ncaron Ncommaaccent \
+Nearrow Neng Ngrave Njligature NormalizeFontHeight \
+NormalizeFontWidth NormalizeTextHeight NormalizeTextWidth Ntilde Nu \
+Numbers Nwarrow OEligature Oacute Obreve \
+Ocaron Ocircumflex Ocircumflexacute Ocircumflexdotbelow Ocircumflexgrave \
+Ocircumflexhook Ocircumflextilde Odiaeresis Odiaeresismacron Odotaccent \
+Odotaccentmacron Odotbelow Odoublegrave Ograve Ohook \
+Ohorn Ohornacute Ohorndotbelow Ohorngrave Ohornhook \
+Ohorntilde Ohungarumlaut Oinvertedbreve Omacron Omega \
+Omicron Oogonek Oogonekmacron Ostroke Ostrokeacute \
+Otilde Otildemacron P PDFETEX PDFTEX \
+PDFcolor PICTEX PPCHTEX PPCHTeX PRAGMA \
+Phi Phook Pi PiCTeX Plankconst \
+PointsToBigPoints PointsToReal PointsToWholeBigPoints PropertyLine Psi \
+PtToCm Racute Rcaron Rcommaaccent Rdoublegrave \
+Rdsh Re ReadFile Relbar Rho \
+Rightarrow Rinvertedbreve Romannumerals Rrightarrow Rsh \
+S Sacute ScaledPointsToBigPoints ScaledPointsToWholeBigPoints Scaron \
+Scedilla Schwa Scircumflex Scommaaccent Searrow \
+Sigma Smallcapped Subset Supset Swarrow \
+TABLE TEX TaBlE Tau Tcaron \
+Tcedilla Tcommaaccent TeX TheNormalizedFontSize Theta \
+Thook Thorn TransparencyHack Tstroke Uacute \
+Ubreve Ucaron Ucircumflex Udiaeresis Udiaeresisacute \
+Udiaeresiscaron Udiaeresisgrave Udiaeresismacron Udotbelow Udoublegrave \
+Ugrave Uhook Uhorn Uhornacute Uhorndotbelow \
+Uhorngrave Uhornhook Uhorntilde Uhungarumlaut Uinvertedbreve \
+Umacron Uogonek Uparrow Updownarrow Upsilon \
+Uring Utilde Uuparrow VDash Vdash \
+VerboseNumber Vert Vvdash WEEKDAY WORD \
+WORDS Wcircumflex WidthSpanningText Word Words \
+XETEX XeTeX Xi Yacute Ycircumflex \
+Ydiaeresis Ydotbelow Ygrave Yhook Ymacron \
+Ytilde Zacute Zcaron Zdotaccent Zeta \
+Zhook Zstroke aacute abbreviation abjadnaivenumerals \
+abjadnodotnumerals abjadnumerals about abreve abreveacute \
+abrevedotbelow abrevegrave abrevehook abrevetilde acaron \
+acircumflex acircumflexacute acircumflexdotbelow acircumflexgrave acircumflexhook \
+acircumflextilde activatespacehandler actualday actualmonth actualyear \
actuarial acute acwopencirclearrow adaptcollector adaptfontfeature \
adaptlayout adaptpapersize addfeature addfontpath addtoJSpreamble \
addtocommalist addvalue adiaeresis adiaeresismacron adotaccent \
@@ -156,795 +157,800 @@ btxlabeltext btxlistcitation btxloadjournalist btxoneorrange btxremapauthor \
btxsavejournalist btxsetup btxsingularorplural btxsingularplural btxtextcitation \
buildmathaccent buildtextaccent buildtextbottomcomma buildtextbottomdot buildtextcedilla \
buildtextgrave buildtextmacron buildtextognek bullet button \
-cacute calligraphic camel cap carriagereturn \
-catcodetablename cbox ccaron ccedilla ccircumflex \
-ccurl cdot cdotaccent cdotp cdots \
-centeraligned centerbox centerdot centeredbox centeredlastline \
-centerednextbox centerline cfrac chapter character \
-characters chardescription charwidthlanguage check checkcharacteralign \
-checkedblank checkedchar checkedfiller checkedstrippedcsname checkinjector \
-checkmark checknextindentation checknextinjector checkpage checkparameters \
-checkpreviousinjector checksoundtrack checktwopassdata checkvariables chem \
-chemical chemicalbottext chemicalmidtext chemicalsymbol chemicaltext \
-chemicaltoptext chi chineseallnumerals chinesecapnumerals chinesenumerals \
-chook circ circeq circlearrowleft circlearrowright \
-circledR circledS circledast circledcirc circleddash \
-circledequals circleonrightarrow citation cite clap \
-classfont cldcommand cldcontext cldloadfile cldprocessfile \
-cleftarrow clip clippedoverlayimage clonefield clubsuit \
-collect collectedtext collectexpanded colon coloncolonequals \
-colonequals color colorbar colorcomponents colored \
-coloronly colorvalue column columnbreak columnsetspanwidth \
-combinepages commalistelement commalistsentence commalistsize comment \
-comparecolorgroup comparedimension comparedimensioneps comparepalet complement \
-completebtxrendering completecontent completeindex completelist completelistofabbreviations \
-completelistofchemicals completelistoffigures completelistofgraphics completelistofintermezzi completelistoflogos \
-completelistofpublications completelistofsorts completelistofsynonyms completelistoftables completepagenumber \
-completeregister complexes complexorsimple complexorsimpleempty component \
-composedcollector composedlayer compresult cong constantdimen \
-constantdimenargument constantemptyargument constantnumber constantnumberargument contentreference \
-continuednumber continueifinputfile convertargument convertcommand convertedcounter \
-converteddimen convertedsubcounter convertmonth convertnumber convertvalue \
-convertvboxtohbox coprod copyboxfromcache copybtxlabeltext copyfield \
-copyheadtext copylabeltext copymathlabeltext copyoperatortext copypages \
-copyparameters copyposition copyprefixtext copyright copysetups \
-copysuffixtext copytaglabeltext copyunittext correctwhitespace countersubs \
-counttoken counttokens cramped crampedclap crampedllap \
-crampedrlap crightarrow crightoverleftarrow cstroke ctop \
-ctxcommand ctxdirectcommand ctxdirectlua ctxfunction ctxlatecommand \
-ctxlatelua ctxloadluafile ctxlua ctxluabuffer ctxluacode \
-ctxreport ctxsprint cup curlyeqprec curlyeqsucc \
-curlyvee curlywedge currentassignmentlistkey currentassignmentlistvalue currentbtxuservariable \
-currentcommalistitem currentcomponent currentdate currentenvironment currentfeaturetest \
-currentheadnumber currentinterface currentlanguage currentlistentrydestinationattribute currentlistentrylimitedtext \
-currentlistentrynumber currentlistentrypagenumber currentlistentryreferenceattribute currentlistentrytitle currentlistentrytitlerendered \
-currentlistsymbol currentmainlanguage currentmessagetext currentmoduleparameter currentoutputstream \
-currentproduct currentproject currentregime currentregisterpageuserdata currentresponses \
-currenttime currentvalue currentxtablecolumn currentxtablerow curvearrowleft \
-curvearrowright cwopencirclearrow cyrillicA cyrillicAE cyrillicAbreve \
-cyrillicAdiaeresis cyrillicB cyrillicBIGYUS cyrillicBIGYUSiotified cyrillicC \
-cyrillicCH cyrillicCHEDC cyrillicCHEDCabkhasian cyrillicCHEabkhasian cyrillicCHEdiaeresis \
-cyrillicCHEkhakassian cyrillicCHEvertstroke cyrillicD cyrillicDASIAPNEUMATA cyrillicDJE \
-cyrillicDZE cyrillicDZEabkhasian cyrillicDZHE cyrillicE cyrillicELtail \
-cyrillicEMtail cyrillicENDC cyrillicENGHE cyrillicENhook cyrillicENtail \
-cyrillicEREV cyrillicERY cyrillicERtick cyrillicEbreve cyrillicEdiaeresis \
-cyrillicEgrave cyrillicEiotified cyrillicF cyrillicFITA cyrillicG \
-cyrillicGHEmidhook cyrillicGHEstroke cyrillicGHEupturn cyrillicGJE cyrillicH \
-cyrillicHA cyrillicHADC cyrillicHRDSN cyrillicI cyrillicIE \
-cyrillicII cyrillicISHRT cyrillicISHRTtail cyrillicIZHITSA cyrillicIZHITSAdoublegrave \
-cyrillicIdiaeresis cyrillicIgrave cyrillicImacron cyrillicJE cyrillicK \
-cyrillicKADC cyrillicKAbashkir cyrillicKAhook cyrillicKAstroke cyrillicKAvertstroke \
-cyrillicKJE cyrillicKOPPA cyrillicKSI cyrillicL cyrillicLITTLEYUS \
-cyrillicLITTLEYUSiotified cyrillicLJE cyrillicM cyrillicN cyrillicNJE \
-cyrillicO cyrillicOMEGA cyrillicOMEGAround cyrillicOMEGAtitlo cyrillicOT \
-cyrillicObarred cyrillicObarreddiaeresis cyrillicOdiaeresis cyrillicP cyrillicPALATALIZATION \
-cyrillicPALOCHKA cyrillicPEmidhook cyrillicPSI cyrillicPSILIPNEUMATA cyrillicR \
-cyrillicS cyrillicSCHWA cyrillicSCHWAdiaeresis cyrillicSDSC cyrillicSEMISOFT \
-cyrillicSFTSN cyrillicSH cyrillicSHCH cyrillicSHHA cyrillicT \
-cyrillicTEDC cyrillicTETSE cyrillicTITLO cyrillicTSHE cyrillicU \
-cyrillicUK cyrillicUSHRT cyrillicUdiaeresis cyrillicUdoubleacute cyrillicUmacron \
-cyrillicV cyrillicYA cyrillicYAT cyrillicYERUdiaeresis cyrillicYI \
-cyrillicYO cyrillicYU cyrillicYstr cyrillicYstrstroke cyrillicZ \
-cyrillicZDSC cyrillicZEdiaeresis cyrillicZH cyrillicZHEbreve cyrillicZHEdescender \
-cyrillicZHEdiaeresis cyrillica cyrillicabreve cyrillicadiaeresis cyrillicae \
-cyrillicb cyrillicbigyus cyrillicbigyusiotified cyrillicc cyrillicch \
-cyrilliccheabkhasian cyrillicchedc cyrillicchedcabkhasian cyrillicchediaeresis cyrillicchekhakassian \
-cyrillicchevertstroke cyrillicd cyrillicdje cyrillicdze cyrillicdzeabkhasian \
-cyrillicdzhe cyrillice cyrillicebreve cyrillicediaeresis cyrillicegrave \
-cyrilliceiotified cyrilliceltail cyrillicemtail cyrillicendc cyrillicenghe \
-cyrillicenhook cyrillicentail cyrillicerev cyrillicertick cyrillicery \
-cyrillicf cyrillicfita cyrillicg cyrillicghemidhook cyrillicghestroke \
-cyrillicgheupturn cyrillicgje cyrillich cyrillicha cyrillichadc \
-cyrillichrdsn cyrillici cyrillicidiaeresis cyrillicie cyrillicigrave \
-cyrillicii cyrillicimacron cyrillicishrt cyrillicishrttail cyrillicizhitsa \
-cyrillicizhitsadoublegrave cyrillicje cyrillick cyrillickabashkir cyrillickadc \
-cyrillickahook cyrillickastroke cyrillickavertstroke cyrillickje cyrillickoppa \
-cyrillicksi cyrillicl cyrilliclittleyus cyrilliclittleyusiotified cyrilliclje \
-cyrillicm cyrillicn cyrillicnje cyrillico cyrillicobarred \
-cyrillicobarreddiaeresis cyrillicodiaeresis cyrillicomega cyrillicomegaround cyrillicomegatitlo \
-cyrillicot cyrillicp cyrillicpemidhook cyrillicpsi cyrillicr \
-cyrillics cyrillicschwa cyrillicschwadiaeresis cyrillicsdsc cyrillicsemisoft \
-cyrillicsftsn cyrillicsh cyrillicshch cyrillicshha cyrillict \
-cyrillictedc cyrillictetse cyrillictshe cyrillicu cyrillicudiaeresis \
-cyrillicudoubleacute cyrillicuk cyrillicumacron cyrillicushrt cyrillicv \
-cyrillicya cyrillicyat cyrillicyerudiaeresis cyrillicyi cyrillicyo \
-cyrillicystr cyrillicystrstroke cyrillicyu cyrillicz cyrilliczdsc \
-cyrilliczediaeresis cyrilliczh cyrilliczhebreve cyrilliczhedescender cyrilliczhediaeresis \
-d dag dagger daleth dasharrow \
-dashedleftarrow dashedrightarrow dashv datasetvariable date \
-dayoftheweek dayspermonth dbinom dcaron dcurl \
-ddag ddagger dddot ddot ddots \
-decrement decrementcounter decrementedcounter decrementpagenumber decrementsubpagenumber \
-decrementvalue defaultinterface defaultobjectpage defaultobjectreference defcatcodecommand \
-defconvertedargument defconvertedcommand defconvertedvalue define defineMPinstance \
-defineTABLEsetup defineaccent defineactivecharacter definealternativestyle defineanchor \
-defineattachment defineattribute definebackground definebar defineblock \
-definebodyfont definebodyfontenvironment definebodyfontswitch definebreakpoint definebreakpoints \
-definebtx definebtxdataset definebtxregister definebtxrendering definebuffer \
-definebutton definecapitals definecharacter definecharacterkerning definecharacterspacing \
-definechemical definechemicals definechemicalsymbol definecollector definecolor \
-definecolorgroup definecolumnbreak definecolumnset definecolumnsetarea definecolumnsetspan \
-definecombination definecombinedlist definecommand definecomment definecomplexorsimple \
-definecomplexorsimpleempty defineconversion defineconversionset definecounter definedataset \
-definedelimitedtext definedeq definedescription definedfont defineeffect \
-defineenumeration defineexpandable defineexternalfigure definefacingfloat definefallbackfamily \
-definefield definefieldbody definefieldbodyset definefieldcategory definefieldstack \
-definefiguresymbol definefileconstant definefilefallback definefilesynonym definefiller \
-definefirstline definefittingpage definefloat definefont definefontalternative \
-definefontfallback definefontfamily definefontfamilypreset definefontfeature definefontfile \
-definefontsize definefontsolution definefontstyle definefontsynonym defineformula \
-defineformulaalternative defineformulaframed defineframed defineframedcontent defineframedtable \
-defineframedtext definefrozenfont defineglobalcolor definegraphictypesynonym definegridsnapping \
-definehbox definehead defineheadalternative definehelp definehigh \
-definehighlight definehspace definehypenationfeatures defineindentedtext defineindenting \
-defineinitial defineinsertion defineinteraction defineinteractionbar defineinteractionmenu \
-defineinterfaceconstant defineinterfaceelement defineinterfacevariable defineinterlinespace defineintermediatecolor \
-defineitemgroup defineitems definelabel definelabelclass definelayer \
-definelayerpreset definelayout definelinefiller definelinenote definelinenumbering \
-definelines definelist definelistalternative definelistextra definelow \
-definelowhigh definelowmidhigh definemakeup definemarginblock definemargindata \
-definemarker definemarking definemathaccent definemathalignment definemathcases \
-definemathcommand definemathdouble definemathdoubleextensible definemathematics definemathextensible \
-definemathfence definemathfraction definemathframed definemathmatrix definemathornament \
-definemathover definemathoverextensible definemathovertextextensible definemathradical definemathstackers \
-definemathstyle definemathtriplet definemathunder definemathunderextensible definemathundertextextensible \
-definemathunstacked definemeasure definemessageconstant definemixedcolumns definemode \
-definemultitonecolor definenamedcolor definenamespace definenarrower definenote \
-defineornament defineoutputroutine defineoutputroutinecommand defineoverlay definepage \
-definepagebreak definepagechecker definepagecolumns definepageinjection definepageinjectionalternative \
-definepageshift definepagestate definepairedbox definepalet definepapersize \
-defineparagraph defineparagraphs defineparallel defineparbuilder defineperiodkerning \
-defineplacement definepositioning defineprefixset defineprocesscolor defineprocessor \
-defineprofile defineprogram definepushbutton definepushsymbol definereference \
-definereferenceformat defineregister definerenderingwindow defineresetset defineruby \
-definescale definescript definesection definesectionblock definesectionlevels \
-defineselector defineseparatorset defineshift definesidebar definesort \
-definesorting definespotcolor definestartstop definestyle definestyleinstance \
-definesubfield definesubformula definesymbol definesynonym definesynonyms \
-definesystemattribute definesystemconstant definesystemvariable definetabletemplate definetabulate \
-definetabulation definetext definetextbackground definetextflow definetokenlist \
-definetooltip definetransparency definetwopasslist definetype definetypeface \
-definetypescriptprefix definetypescriptsynonym definetypesetting definetyping defineunit \
-defineuserdata defineuserdataalternative defineviewerlayer definevspace definevspacing \
-definevspacingamount definextable delimited delimitedtext delta \
-depthofstring depthonlybox depthspanningtext depthstrut determineheadnumber \
-determinelistcharacteristics determinenoflines determineregistercharacteristics devanagarinumerals dfrac \
-dhook diameter diamond diamondsuit differentialD \
-differentiald digamma digits dimensiontocount directboxfromcache \
-directcolor directcolored directconvertedcounter directcopyboxfromcache directdummyparameter \
-directgetboxllx directgetboxlly directhighlight directlocalframed directluacode \
-directselect directsetbar directsetup directsymbol directvspacing \
-dis disabledirectives disableexperiments disablemode disableoutputstream \
-disableparpositions disableregime disabletrackers displaymath displaymathematics \
-displaymessage distributedhsize div dividedsize divideontimes \
-divides doadaptleftskip doadaptrightskip doaddfeature doassign \
-doassignempty doboundtext docheckassignment docheckedpagestate docheckedpair \
-documentvariable dodoubleargument dodoubleargumentwithset dodoubleempty dodoubleemptywithset \
-dodoublegroupempty doeassign doexpandedrecurse dofastloopcs dogetattribute \
-dogetattributeid dogetcommacommandelement dogobbledoubleempty dogobblesingleempty doif \
-doifMPgraphicelse doifallcommon doifallcommonelse doifalldefinedelse doifallmodes \
-doifallmodeselse doifassignmentelse doifassignmentelsecs doifblackelse doifbothsides \
-doifbothsidesoverruled doifboxelse doifbufferelse doifcolor doifcolorelse \
-doifcommandhandler doifcommandhandlerelse doifcommon doifcommonelse doifcontent \
-doifconversiondefinedelse doifconversionnumberelse doifcounter doifcounterelse doifcurrentfonthasfeatureelse \
-doifdefined doifdefinedcounter doifdefinedcounterelse doifdefinedelse doifdimensionelse \
-doifdimenstringelse doifdocumentargument doifdocumentargumentelse doifdocumentfilename doifdocumentfilenameelse \
-doifdocumentvariable doifdocumentvariableelse doifdrawingblackelse doifelse doifelseMPgraphic \
-doifelseallcommon doifelsealldefined doifelseallmodes doifelseassignment doifelseassignmentcs \
-doifelseblack doifelsebox doifelseboxincache doifelsebuffer doifelsecolor \
-doifelsecommandhandler doifelsecommon doifelseconversiondefined doifelseconversionnumber doifelsecounter \
-doifelsecurrentfonthasfeature doifelsecurrentsortingused doifelsecurrentsynonymshown doifelsecurrentsynonymused doifelsedefined \
-doifelsedefinedcounter doifelsedimension doifelsedimenstring doifelsedocumentargument doifelsedocumentfilename \
-doifelsedocumentvariable doifelsedrawingblack doifelseempty doifelseemptyvalue doifelseemptyvariable \
-doifelseenv doifelsefastoptionalcheck doifelsefastoptionalcheckcs doifelsefieldbody doifelsefieldcategory \
-doifelsefigure doifelsefile doifelsefiledefined doifelsefileexists doifelsefirstchar \
-doifelseflagged doifelsefontchar doifelsefontfeature doifelsefontpresent doifelsefontsynonym \
-doifelseframed doifelsehasspace doifelsehelp doifelseincsname doifelseinelement \
-doifelseinputfile doifelseinsertion doifelseinset doifelseinstring doifelseinsymbolset \
-doifelseintoks doifelseintwopassdata doifelseitalic doifelselanguage doifelselayerdata \
-doifelselayoutdefined doifelselayoutsomeline doifelselayouttextline doifelseleapyear doifelselist \
-doifelselocation doifelselocfile doifelsemainfloatbody doifelsemarkedpage doifelsemarking \
-doifelsemeaning doifelsemessage doifelsemode doifelsenextbgroup doifelsenextbgroupcs \
-doifelsenextchar doifelsenextoptional doifelsenextoptionalcs doifelsenextparenthesis doifelsenonzeropositive \
-doifelsenoteonsamepage doifelsenothing doifelsenumber doifelseobjectfound doifelseobjectreferencefound \
-doifelseoddpage doifelseoddpagefloat doifelseoldercontext doifelseolderversion doifelseoverlapping \
-doifelseoverlay doifelseparallel doifelseparentfile doifelsepath doifelsepathexists \
-doifelsepatterns doifelseposition doifelsepositionaction doifelsepositiononpage doifelsepositionsonsamepage \
-doifelsepositionsonthispage doifelsepositionsused doifelsereferencefound doifelserightpage doifelserightpagefloat \
-doifelserighttoleftinbox doifelsesamelinereference doifelsesamestring doifelsesetups doifelsesomebackground \
-doifelsesomespace doifelsesomething doifelsesometoks doifelsestringinstring doifelsestructurelisthasnumber \
-doifelsestructurelisthaspage doifelsesymboldefined doifelsesymbolset doifelsetext doifelsetextflow \
-doifelsetextflowcollector doifelsetopofpage doifelsetypingfile doifelseundefined doifelseurldefined \
-doifelsevalue doifelsevaluenothing doifelsevariable doifempty doifemptyelse \
-doifemptytoks doifemptyvalue doifemptyvalueelse doifemptyvariable doifemptyvariableelse \
-doifenv doifenvelse doiffastoptionalcheckcselse doiffastoptionalcheckelse doiffieldbodyelse \
-doiffieldcategoryelse doiffigureelse doiffile doiffiledefinedelse doiffileelse \
-doiffileexistselse doiffirstcharelse doifflaggedelse doiffontcharelse doiffontfeatureelse \
-doiffontpresentelse doiffontsynonymelse doifhasspaceelse doifhelpelse doifincsnameelse \
-doifinelementelse doifinputfileelse doifinsertionelse doifinset doifinsetelse \
-doifinstring doifinstringelse doifinsymbolset doifinsymbolsetelse doifintokselse \
-doifintwopassdataelse doifitalicelse doiflanguageelse doiflayerdataelse doiflayoutdefinedelse \
-doiflayoutsomelineelse doiflayouttextlineelse doifleapyearelse doiflistelse doiflocationelse \
-doiflocfileelse doifmainfloatbodyelse doifmarkingelse doifmeaningelse doifmessageelse \
-doifmode doifmodeelse doifnextbgroupcselse doifnextbgroupelse doifnextcharelse \
-doifnextoptionalcselse doifnextoptionalelse doifnextparenthesiselse doifnonzeropositiveelse doifnot \
-doifnotallcommon doifnotallmodes doifnotcommandhandler doifnotcommon doifnotcounter \
-doifnotdocumentargument doifnotdocumentfilename doifnotdocumentvariable doifnotempty doifnotemptyvalue \
-doifnotemptyvariable doifnotenv doifnoteonsamepageelse doifnotescollected doifnotfile \
-doifnotflagged doifnothing doifnothingelse doifnotinset doifnotinsidesplitfloat \
-doifnotinstring doifnotmode doifnotnumber doifnotsamestring doifnotsetups \
-doifnotvalue doifnotvariable doifnumber doifnumberelse doifobjectfoundelse \
-doifobjectreferencefoundelse doifoddpageelse doifoddpagefloatelse doifoldercontextelse doifolderversionelse \
-doifoverlappingelse doifoverlayelse doifparallelelse doifparentfileelse doifpathelse \
-doifpathexistselse doifpatternselse doifposition doifpositionaction doifpositionactionelse \
-doifpositionelse doifpositiononpageelse doifpositionsonsamepageelse doifpositionsonthispageelse doifpositionsusedelse \
-doifreferencefoundelse doifrightpagefloatelse doifrighttoleftinboxelse doifsamelinereferenceelse doifsamestring \
-doifsamestringelse doifsetups doifsetupselse doifsomebackground doifsomebackgroundelse \
-doifsomespaceelse doifsomething doifsomethingelse doifsometoks doifsometokselse \
-doifstringinstringelse doifstructurelisthasnumberelse doifstructurelisthaspageelse doifsymboldefinedelse doifsymbolsetelse \
-doiftext doiftextelse doiftextflowcollectorelse doiftextflowelse doiftopofpageelse \
-doiftypingfileelse doifundefined doifundefinedcounter doifundefinedelse doifunknownfontfeature \
-doifurldefinedelse doifvalue doifvalueelse doifvaluenothing doifvaluenothingelse \
-doifvaluesomething doifvariable doifvariableelse doindentation dollar \
-doloop doloopoverlist donothing dontconvertfont dontleavehmode \
-dontpermitspacesbetweengroups dopositionaction doprocesslocalsetups doquadrupleargument doquadrupleempty \
-doquadruplegroupempty doquintupleargument doquintupleempty doquintuplegroupempty dorechecknextindentation \
-dorecurse dorepeatwithcommand doreplacefeature doresetandafffeature doresetattribute \
-dorotatebox dosetattribute dosetleftskipadaption dosetrightskipadaption dosetupcheckedinterlinespace \
-doseventupleargument doseventupleempty dosingleargument dosingleempty dosinglegroupempty \
-dosixtupleargument dosixtupleempty dostepwiserecurse dosubtractfeature dot \
-doteq doteqdot dotfskip dotlessI dotlessJ \
-dotlessi dotlessj dotlessjstroke dotminus dotoks \
-dotplus dotripleargument dotripleargumentwithset dotripleempty dotripleemptywithset \
-dotriplegroupempty dots dottedcircle dottedrightarrow doublebar \
-doublebond doublebrace doublebracket doublecap doublecup \
-doubleparent doubleprime doubleverticalbar dowith dowithnextbox \
-dowithnextboxcontent dowithnextboxcontentcs dowithnextboxcs dowithpargument dowithrange \
-dowithwargument downarrow downdasharrow downdownarrows downharpoonleft \
-downharpoonright downuparrows downwhitearrow downzigzagarrow dpofstring \
-dstroke dtail dummydigit dummyparameter dzcaronligature \
-dzligature eTeX eacute ebreve ecaron \
-ecedilla ecircumflex ecircumflexacute ecircumflexdotbelow ecircumflexgrave \
-ecircumflexhook ecircumflextilde edefconvertedargument ediaeresis edotaccent \
-edotbelow edoublegrave efcmaxheight efcmaxwidth efcminheight \
-efcminwidth efcparameter effect egrave ehook \
-einvertedbreve elapsedseconds elapsedtime eleftarrowfill eleftharpoondownfill \
-eleftharpoonupfill eleftrightarrowfill ell em emacron \
-emdash emphasisboldface emphasistypeface emptylines emptyset \
-emquad emspace enabledirectives enableexperiments enablemode \
-enableoutputstream enableparpositions enableregime enabletrackers endash \
-endnote enquad enskip enspace env \
-environment envvar eogonek eoverbarfill eoverbracefill \
-eoverbracketfill eoverparentfill epos epsilon eq \
-eqcirc eqeq eqeqeq eqgtr eqless \
-eqsim eqslantgtr eqslantless equaldigits equalscolon \
-equiv erightarrowfill erightharpoondownfill erightharpoonupfill eta \
-eth ethiopic etilde etwoheadrightarrowfill eunderbarfill \
-eunderbracefill eunderbracketfill eunderparentfill exclamdown executeifdefined \
-exists exitloop exitloopnow expandcheckedcsname expanded \
-expandeddoif expandeddoifelse expandeddoifnot expandfontsynonym expdoif \
-expdoifcommonelse expdoifelse expdoifelsecommon expdoifelseinset expdoifinsetelse \
-expdoifnot exponentiale externalfigure externalfigurecollectionmaxheight externalfigurecollectionmaxwidth \
-externalfigurecollectionminheight externalfigurecollectionminwidth externalfigurecollectionparameter fakebox fallingdotseq \
-fastdecrement fastincrement fastlocalframed fastloopfinal fastloopindex \
-fastscale fastsetup fastsetupwithargument fastsetupwithargumentswapped fastswitchtobodyfont \
-fastsxsy feature fence fenced fetchallmarkings \
-fetchallmarks fetchmark fetchmarking fetchonemark fetchonemarking \
-fetchruntinecommand fetchtwomarkings fetchtwomarks ffiligature ffligature \
-fflligature fhook field fieldbody fieldstack \
-fifthoffivearguments fifthofsixarguments figurefilename figurefilepath figurefiletype \
-figurefullname figureheight figurenaturalheight figurenaturalwidth figurespace \
-figuresymbol figurewidth filename filigature filledhboxb \
-filledhboxc filledhboxg filledhboxk filledhboxm filledhboxr \
-filledhboxy filler fillinline fillinrules fillintext \
-fillupto filterfromnext filterfromvalue filterpages filterreference \
-findtwopassdata finishregisterentry firstcharacter firstcounter firstcountervalue \
-firstinlist firstoffivearguments firstoffourarguments firstofoneargument firstofoneunexpanded \
-firstofsixarguments firstofthreearguments firstofthreeunexpanded firstoftwoarguments firstoftwounexpanded \
-firstrealpage firstrealpagenumber firstsubcountervalue firstsubpage firstsubpagenumber \
-firstuserpage firstuserpagenumber fitfield fitfieldframed fittopbaselinegrid \
-fiveeighths fivesixths fixedspace fixedspaces flag \
-flat flligature floatuserdataparameter flushbox flushboxregister \
-flushcollector flushedrightlastline flushlayer flushlocalfloats flushnextbox \
-flushnotes flushoutputstream flushshapebox flushtextflow flushtokens \
-flushtoks fontalternative fontbody fontchar fontcharbyindex \
-fontclass fontclassname fontface fontfeaturelist fontsize \
-fontstyle footnote footnotetext forall forcecharacterstripping \
-forcelocalfloats forgeteverypar forgetparameters forgetparskip forgetragged \
-formula formulanumber foundbox fourfifths fourperemspace \
-fourthoffivearguments fourthoffourarguments fourthofsixarguments frac framed \
-frameddimension framedparameter framedtext freezedimenmacro freezemeasure \
-frenchspacing from fromlinenote frown frozenhbox \
-frule gacute gamma gbreve gcaron \
-gcircumflex gcommaaccent gdefconvertedargument gdefconvertedcommand gdotaccent \
-ge geq geqq geqslant getMPdrawing \
-getMPlayer getboxfromcache getboxllx getboxlly getbuffer \
-getbufferdata getcommacommandsize getcommalistsize getdayoftheweek getdayspermonth \
-getdefinedbuffer getdocumentargument getdocumentargumentdefault getdocumentfilename getdummyparameters \
-getemptyparameters geteparameters getexpandedparameters getfiguredimensions getfirstcharacter \
-getfirsttwopassdata getfromcommacommand getfromcommalist getfromtwopassdata getglyphdirect \
-getglyphstyled getgparameters getinlineuserdata getlasttwopassdata getlocalfloat \
-getlocalfloats getmarking getmessage getnamedglyphdirect getnamedglyphstyled \
-getnamedtwopassdatalist getnaturaldimensions getnoflines getobject getobjectdimensions \
-getpaletsize getparameters getprivatechar getprivateslot getrandomcount \
-getrandomdimen getrandomfloat getrandomnumber getrandomseed getraweparameters \
-getrawgparameters getrawnoflines getrawparameters getrawxparameters getreference \
-getreferenceentry getroundednoflines gets getsubstring gettokenlist \
-gettwopassdata gettwopassdatalist getuserdata getuvalue getvalue \
-getvariable getvariabledefault getxparameters gg ggg \
-gggtr gimel globaldisablemode globalenablemode globalletempty \
-globalpopbox globalpopmacro globalpreventmode globalprocesscommalist globalpushbox \
-globalpushmacro globalswapcounts globalswapdimens globalswapmacros globalundefine \
-glyphfontfile gnapprox gneqq gnsim gobbledoubleempty \
-gobbleeightarguments gobblefivearguments gobblefiveoptionals gobblefourarguments gobblefouroptionals \
-gobbleninearguments gobbleoneargument gobbleoneoptional gobblesevenarguments gobblesingleempty \
-gobblesixarguments gobblespacetokens gobbletenarguments gobblethreearguments gobblethreeoptionals \
-gobbletwoarguments gobbletwooptionals gobbleuntil gobbleuntilrelax godown \
-goto gotobox gotopage grabbufferdata grabbufferdatadirect \
-grabuntil grave graycolor grayvalue greedysplitstring \
-greekAlpha greekAlphadasia greekAlphadasiaperispomeni greekAlphadasiatonos greekAlphadasiavaria \
-greekAlphaiotasub greekAlphaiotasubdasia greekAlphaiotasubdasiaperispomeni greekAlphaiotasubdasiatonos greekAlphaiotasubdasiavaria \
-greekAlphaiotasubpsili greekAlphaiotasubpsiliperispomeni greekAlphaiotasubpsilitonos greekAlphaiotasubpsilivaria greekAlphamacron \
-greekAlphapsili greekAlphapsiliperispomeni greekAlphapsilitonos greekAlphapsilivaria greekAlphatonos \
-greekAlphavaria greekAlphavrachy greekBeta greekChi greekCoronis \
-greekDelta greekEpsilon greekEpsilondasia greekEpsilondasiatonos greekEpsilondasiavaria \
-greekEpsilonpsili greekEpsilonpsilitonos greekEpsilonpsilivaria greekEpsilontonos greekEpsilonvaria \
-greekEta greekEtadasia greekEtadasiaperispomeni greekEtadasiatonos greekEtadasiavaria \
-greekEtaiotasub greekEtaiotasubdasia greekEtaiotasubdasiaperispomeni greekEtaiotasubdasiatonos greekEtaiotasubdasiavaria \
-greekEtaiotasubpsili greekEtaiotasubpsiliperispomeni greekEtaiotasubpsilitonos greekEtaiotasubpsilivaria greekEtapsili \
-greekEtapsiliperispomeni greekEtapsilitonos greekEtapsilivaria greekEtatonos greekEtavaria \
-greekGamma greekIota greekIotadasia greekIotadasiaperispomeni greekIotadasiatonos \
-greekIotadasiavaria greekIotadialytika greekIotamacron greekIotapsili greekIotapsiliperispomeni \
-greekIotapsilitonos greekIotapsilivaria greekIotatonos greekIotavaria greekIotavrachy \
-greekKappa greekLambda greekMu greekNu greekOmega \
-greekOmegadasia greekOmegadasiaperispomeni greekOmegadasiatonos greekOmegadasiavaria greekOmegaiotasub \
-greekOmegaiotasubdasia greekOmegaiotasubdasiaperispomeni greekOmegaiotasubdasiatonos greekOmegaiotasubdasiavaria greekOmegaiotasubpsili \
-greekOmegaiotasubpsiliperispomeni greekOmegaiotasubpsilitonos greekOmegaiotasubpsilivaria greekOmegapsili greekOmegapsiliperispomeni \
-greekOmegapsilitonos greekOmegapsilivaria greekOmegatonos greekOmegavaria greekOmicron \
-greekOmicrondasia greekOmicrondasiatonos greekOmicrondasiavaria greekOmicronpsili greekOmicronpsilitonos \
-greekOmicronpsilivaria greekOmicrontonos greekOmicronvaria greekPhi greekPi \
-greekPsi greekRho greekRhodasia greekSigma greekSigmalunate \
-greekTau greekTheta greekUpsilon greekUpsilondasia greekUpsilondasiaperispomeni \
-greekUpsilondasiatonos greekUpsilondasiavaria greekUpsilondialytika greekUpsilonmacron greekUpsilontonos \
-greekUpsilonvaria greekUpsilonvrachy greekXi greekZeta greekalpha \
-greekalphadasia greekalphadasiaperispomeni greekalphadasiatonos greekalphadasiavaria greekalphaiotasub \
-greekalphaiotasubdasia greekalphaiotasubdasiaperispomeni greekalphaiotasubdasiatonos greekalphaiotasubdasiavaria greekalphaiotasubperispomeni \
-greekalphaiotasubpsili greekalphaiotasubpsiliperispomeni greekalphaiotasubpsilitonos greekalphaiotasubpsilivaria greekalphaiotasubtonos \
-greekalphaiotasubvaria greekalphamacron greekalphaoxia greekalphaperispomeni greekalphapsili \
-greekalphapsiliperispomeni greekalphapsilitonos greekalphapsilivaria greekalphatonos greekalphavaria \
-greekalphavrachy greekbeta greekbetaalt greekchi greekdasia \
-greekdasiaperispomeni greekdasiatonos greekdasiavaria greekdelta greekdialytikaperispomeni \
-greekdialytikatonos greekdialytikavaria greekdigamma greekepsilon greekepsilonalt \
-greekepsilondasia greekepsilondasiatonos greekepsilondasiavaria greekepsilonoxia greekepsilonpsili \
-greekepsilonpsilitonos greekepsilonpsilivaria greekepsilontonos greekepsilonvaria greeketa \
-greeketadasia greeketadasiaperispomeni greeketadasiatonos greeketadasiavaria greeketaiotasub \
-greeketaiotasubdasia greeketaiotasubdasiaperispomeni greeketaiotasubdasiatonos greeketaiotasubdasiavaria greeketaiotasubperispomeni \
-greeketaiotasubpsili greeketaiotasubpsiliperispomeni greeketaiotasubpsilitonos greeketaiotasubpsilivaria greeketaiotasubtonos \
-greeketaiotasubvaria greeketaoxia greeketaperispomeni greeketapsili greeketapsiliperispomeni \
-greeketapsilitonos greeketapsilivaria greeketatonos greeketavaria greekfinalsigma \
-greekgamma greekiota greekiotadasia greekiotadasiaperispomeni greekiotadasiatonos \
-greekiotadasiavaria greekiotadialytika greekiotadialytikaperispomeni greekiotadialytikatonos greekiotadialytikavaria \
-greekiotamacron greekiotaoxia greekiotaperispomeni greekiotapsili greekiotapsiliperispomeni \
-greekiotapsilitonos greekiotapsilivaria greekiotatonos greekiotavaria greekiotavrachy \
-greekkappa greekkoppa greeklambda greekmu greeknu \
-greeknumerals greeknumkoppa greekomega greekomegadasia greekomegadasiaperispomeni \
-greekomegadasiatonos greekomegadasiavaria greekomegaiotasub greekomegaiotasubdasia greekomegaiotasubdasiaperispomeni \
-greekomegaiotasubdasiatonos greekomegaiotasubdasiavaria greekomegaiotasubperispomeni greekomegaiotasubpsili greekomegaiotasubpsiliperispomeni \
-greekomegaiotasubpsilitonos greekomegaiotasubpsilivaria greekomegaiotasubtonos greekomegaiotasubvaria greekomegaoxia \
-greekomegaperispomeni greekomegapsili greekomegapsiliperispomeni greekomegapsilitonos greekomegapsilivaria \
-greekomegatonos greekomegavaria greekomicron greekomicrondasia greekomicrondasiatonos \
-greekomicrondasiavaria greekomicronoxia greekomicronpsili greekomicronpsilitonos greekomicronpsilivaria \
-greekomicrontonos greekomicronvaria greekoxia greekperispomeni greekphi \
-greekphialt greekpi greekpialt greekprosgegrammeni greekpsi \
-greekpsili greekpsiliperispomeni greekpsilitonos greekpsilivaria greekrho \
-greekrhoalt greekrhodasia greekrhopsili greeksampi greeksigma \
-greeksigmalunate greekstigma greektau greektheta greekthetaalt \
-greektonos greekupsilon greekupsilondasia greekupsilondasiaperispomeni greekupsilondasiatonos \
-greekupsilondasiavaria greekupsilondiaeresis greekupsilondialytikaperispomeni greekupsilondialytikatonos greekupsilondialytikavaria \
-greekupsilonmacron greekupsilonoxia greekupsilonperispomeni greekupsilonpsili greekupsilonpsiliperispomeni \
-greekupsilonpsilitonos greekupsilonpsilivaria greekupsilontonos greekupsilonvaria greekupsilonvrachy \
-greekvaria greekxi greekzeta grid groupedcommand \
-gsetboxllx gsetboxlly gstroke gt gtrapprox \
-gtrdot gtreqless gtreqqless gtrless gtrsim \
-guilsingleleft guilsingleright gujaratinumerals gurmurkhinumerals hairline \
-hairspace halflinestrut halfstrut halfwaybox handletokens \
-handwritten hangul hanzi hash hat \
-hbar hboxofvbox hboxreference hcaron hcircumflex \
-hdofstring headhbox headlanguage headnumber headnumbercontent \
-headnumberdistance headnumberwidth headreferenceattributes headsetupspacing headtext \
-headtextcontent headtextdistance headtexts headtextwidth headvbox \
-headwidth heartsuit hebrewAlef hebrewAyin hebrewBet \
-hebrewDalet hebrewGimel hebrewHe hebrewHet hebrewKaf \
-hebrewKaffinal hebrewLamed hebrewMem hebrewMemfinal hebrewNun \
-hebrewNunfinal hebrewPe hebrewPefinal hebrewQof hebrewResh \
-hebrewSamekh hebrewShin hebrewTav hebrewTet hebrewTsadi \
-hebrewTsadifinal hebrewVav hebrewYod hebrewZayin heightanddepthofstring \
-heightofstring heightspanningtext helptext hglue hiddenbar \
-hiddencitation hiddencite hideblocks high highlight \
-highordinalstr hilo himilo hl hookleftarrow \
-hookrightarrow horizontalgrowingbar horizontalpositionbar hphantom hpos \
-hsizefraction hslash hsmash hsmashbox hsmashed \
-hspace hstroke htdpofstring htofstring hyphen \
-hyphenatedcoloredword hyphenatedfile hyphenatedfilename hyphenatedhbox hyphenatedpar \
-hyphenatedurl hyphenatedword iacute ibox ibreve \
-icaron icircumflex ideographichalffillspace ideographicspace idiaeresis \
-idotaccent idotbelow idoublegrave ifassignment iff \
-ifinobject ifinoutputstream ifparameters iftrialtypesetting ignoreimplicitspaces \
-ignoretagsinexport ignorevalue igrave ihook iiiint \
-iiiintop iiint iiintop iint iintop \
-iinvertedbreve ijligature imacron imaginaryi imaginaryj \
-imath immediatesavetwopassdata impliedby implies imply \
-in includemenu includeversioninfo increment incrementcounter \
-incrementedcounter incrementpagenumber incrementsubpagenumber incrementvalue indentation \
-index infofont infofontbold inframed infty \
-infull inheritparameter inhibitblank ininner ininneredge \
-ininnermargin initializeboxstack inleft inleftedge inleftmargin \
-inline inlinebuffer inlinedbox inlinemath inlinemathematics \
-inlinemessage inlineordisplaymath inlineprettyprintbuffer inlinerange inmargin \
-inmframed innerflushshapebox inother inouter inouteredge \
-inoutermargin input inputfilebarename inputfilename inputfilerealsuffix \
-inputfilesuffix inputgivenfile inright inrightedge inrightmargin \
-insertpages installactionhandler installactivecharacter installanddefineactivecharacter installattributestack \
-installautocommandhandler installautosetuphandler installbasicautosetuphandler installbasicparameterhandler installbottomframerenderer \
-installcommandhandler installcorenamespace installdefinehandler installdefinitionset installdefinitionsetmember \
-installdirectcommandhandler installdirectparameterhandler installdirectparametersethandler installdirectsetuphandler installdirectstyleandcolorhandler \
-installframedautocommandhandler installframedcommandhandler installglobalmacrostack installlanguage installleftframerenderer \
-installmacrostack installnamespace installoutputroutine installpagearrangement installparameterhandler \
-installparameterhashhandler installparametersethandler installparentinjector installrightframerenderer installrootparameterhandler \
-installsetuphandler installsetuponlycommandhandler installshipoutmethod installsimplecommandhandler installsimpleframedcommandhandler \
-installstyleandcolorhandler installswitchcommandhandler installswitchsetuphandler installtexdirective installtextracker \
-installtopframerenderer installunitsseparator installunitsspace installversioninfo int \
-intclockwise integerrounding integers interactionbar interactionbuttons \
-interactionmenu intercal intertext intop invisibletimes \
-invokepageheandler iogonek iota istltdir istrtdir \
-italic italicbold italiccorrection italicface item \
-items itemtag itilde jcaron jcircumflex \
-jmath jobfilename jobfilesuffix kap kappa \
-kcaron kcommaaccent keepblocks keeplinestogether keepunwantedspaces \
-kerncharacters khook kkra koreancirclenumerals koreannumerals \
-koreannumeralsc koreannumeralsp koreanparentnumerals lVert labellanguage \
-labeltext labeltexts lacute lambda lambdabar \
-land langle language languageCharacters languagecharacters \
-languagecharwidth lastcounter lastcountervalue lastdigit lastlinewidth \
-lastnaturalboxdp lastnaturalboxht lastnaturalboxwd lastpredefinedsymbol lastrealpage \
-lastrealpagenumber lastsubcountervalue lastsubpage lastsubpagenumber lasttwodigits \
-lastuserpage lastuserpagenumber lateluacode latin layeredtext \
-layerheight layerwidth lazysavetaggedtwopassdata lazysavetwopassdata lbar \
-lbox lbrace lbracket lcaron lceil \
-lcommaaccent lcurl ldotmiddle ldotp ldots \
-le leadsto left leftaligned leftarrow \
-leftarrowtail leftarrowtriangle leftbottombox leftbox leftdasharrow \
-leftguillemot leftharpoondown leftharpoonup lefthbox leftheadtext \
-leftlabeltext leftleftarrows leftline leftmathlabeltext leftorrighthbox \
-leftorrightvbox leftorrightvtop leftrightarrow leftrightarrows leftrightarrowtriangle \
-leftrightharpoons leftrightsquigarrow leftskipadaption leftsquigarrow leftsubguillemot \
-leftthreetimes lefttopbox lefttoright lefttorighthbox lefttorightvbox \
-lefttorightvtop leftwavearrow leftwhitearrow leq leqq \
-leqslant lessapprox lessdot lesseqgtr lesseqqgtr \
-lessgtr lesssim letbeundefined letcatcodecommand letcscsname \
-letcsnamecs letcsnamecsname letdummyparameter letempty letgvalue \
-letgvalueempty letgvalurelax letterampersand letterat letterbackslash \
-letterbar letterbgroup letterclosebrace lettercolon letterdollar \
-letterdoublequote letteregroup letterescape letterexclamationmark letterhash \
-letterhat letterleftbrace letterleftbracket letterleftparenthesis letterless \
-lettermore letteropenbrace letterpercent letterquestionmark letterrightbrace \
-letterrightbracket letterrightparenthesis lettersinglequote letterslash letterspacing \
-lettertilde letterunderscore letvalue letvalueempty letvaluerelax \
-lfence lfloor lgroup lhbox lhooknwarrow \
-lhooksearrow limitatefirstline limitatelines limitatetext line \
-linebox linefeed linenote linespanningtext linethickness \
-linterval listcitation listcite listlength listnamespaces \
-ljligature ll llangle llap llbracket \
-llcorner lll llless lmoustache lnapprox \
-lneq lneqq lnot lnsim loadanyfile \
-loadanyfileonce loadbtxdefinitionfile loadbtxreplacementfile loadcldfile loadcldfileonce \
-loadfontgoodies loadluafile loadluafileonce loadspellchecklist loadtexfile \
-loadtexfileonce loadtypescriptfile localframed localframedwithsettings localhsize \
-localpopbox localpopmacro localpushbox localpushmacro localundefine \
-locatedfilepath locatefilepath locfilename logo lohi \
-lointerval lomihi longleftarrow longleftrightarrow longmapsfrom \
-longmapsto longrightarrow longrightsquigarrow looparrowleft looparrowright \
-lor low lowerbox lowercased lowercasestring \
-lowerleftdoubleninequote lowerleftsingleninequote lowerrightdoubleninequote lowerrightsingleninequote lozenge \
-lparent lrcorner lrointerval lrtbbox lstroke \
-lt ltimes ltop luaTeX luacode \
-luaconditional luaenvironment luaexpanded luaexpr luafunction \
-luajitTeX luamajorversion luaminorversion luaparameterset luasetup \
-luaversion lvert m mLeftarrow mLeftrightarrow \
-mRightarrow mainlanguage makecharacteractive makerawcommalist makestrutofbox \
-maltese mapfontsize mapsdown mapsfrom mapsto \
-mapsup margindata margintext markcontent markedpages \
-marking markinjector markpage mat math \
-mathampersand mathbf mathbi mathblackboard mathbs \
-mathdefault mathdollar mathdouble mathematics mathfraktur \
-mathfunction mathhash mathhyphen mathit mathitalic \
-mathlabellanguage mathlabeltext mathlabeltexts mathop mathover \
-mathpercent mathrm mathscript mathsl mathss \
-mathtext mathtextbf mathtextbi mathtextbs mathtextit \
-mathtextsl mathtexttf mathtf mathtriplet mathtt \
-mathunder mathupright mathword mathwordbf mathwordbi \
-mathwordbs mathwordit mathwordsl mathwordtf maxaligned \
-mbox mcframed measure measured measuredangle \
-measuredeq medskip medspace menubutton mequal \
-message metaTeX mfence mframed mfunction \
-mfunctionlabeltext mhbox mho mhookleftarrow mhookrightarrow \
-mid midaligned middle middlealigned middlebox \
-midhbox midsubsentence minimalhbox minus minuscolon \
-mirror mixedcaps mkvibuffer mleftarrow mleftharpoondown \
-mleftharpoonup mleftrightarrow mleftrightharpoons mmapsto models \
-moduleparameter molecule mono monobold mononormal \
-month monthlong monthshort mp mprandomnumber \
-mrel mrightarrow mrightharpoondown mrightharpoonup mrightleftharpoons \
-mrightoverleftarrow mtext mtriplerel mtwoheadleftarrow mtwoheadrightarrow \
-mu multimap nHdownarrow nHuparrow nLeftarrow \
-nLeftrightarrow nRightarrow nVDash nVdash nVleftarrow \
-nVleftrightarrow nVrightarrow nabla nacute namedheadnumber \
-namedstructureheadlocation namedstructureuservariable namedstructurevariable namedtaggedlabeltexts napostrophe \
-napprox napproxEq narrownobreakspace nasymp natural \
-naturalhbox naturalhpack naturalnumbers naturalvbox naturalvcenter \
-naturalvpack naturalvtop naturalwd ncaron ncommaaccent \
-ncong ncurl ndivides ne nearrow \
-neg negatecolorbox negated negativesign negemspace \
-negenspace negthinspace neng neq nequiv \
-neswarrow newattribute newcatcodetable newcounter newevery \
-newfrenchspacing newmode newsignal newsystemmode nexists \
-nextbox nextboxdp nextboxht nextboxhtdp nextboxwd \
-nextcounter nextcountervalue nextdepth nextparagraphs nextrealpage \
-nextrealpagenumber nextsubcountervalue nextsubpage nextsubpagenumber nextuserpage \
-nextuserpagenumber ngeq ngrave ngtr ngtrless \
-ngtrsim ni nihongo nin njligature \
-nleftarrow nleftrightarrow nleq nless nlessgtr \
-nlesssim nmid nni nobar nobreakspace \
-nocap nocharacteralign nocitation nocite nodetostring \
-noffigurepages noflines noflocalfloats noheaderandfooterlines noheightstrut \
-noindentation noitem nonfrenchspacing nonmathematics normal \
-normalboldface normalframedwithsettings normalitalicface normalizebodyfontsize normalizedfontsize \
-normalizefontdepth normalizefontheight normalizefontline normalizefontwidth normalizetextdepth \
-normalizetextheight normalizetextline normalizetextwidth normalslantedface normaltypeface \
-nospace not note notesymbol notin \
-notopandbottomlines notragged nowns nparallel nprec \
-npreccurlyeq nrightarrow nsim nsimeq nsqsubseteq \
-nsqsupseteq nsubset nsubseteq nsucc nsucccurlyeq \
-nsupset nsupseteq ntilde ntimes ntriangleleft \
-ntrianglelefteq ntriangleright ntrianglerighteq nu numberofpoints \
-numbers nvDash nvdash nvleftarrow nvleftrightarrow \
-nvrightarrow nwarrow nwsearrow oacute obeydepth \
-objectdepth objectheight objectmargin objectwidth obox \
-obreve ocaron ocircumflex ocircumflexacute ocircumflexdotbelow \
-ocircumflexgrave ocircumflexhook ocircumflextilde odiaeresis odiaeresismacron \
-odot odotaccent odotaccentmacron odotbelow odoublegrave \
-oeligature offset offsetbox ograve ohm \
-ohook ohorn ohornacute ohorndotbelow ohorngrave \
-ohornhook ohorntilde ohungarumlaut oiiint oiint \
-oint ointclockwise ointctrclockwise oinvertedbreve omacron \
-omega omicron ominus onedigitrounding oneeighth \
-onefifth onehalf onequarter onesixth onesuperior \
-onethird oogonek oogonekmacron operatorlanguage operatortext \
-oplus ordfeminine ordinaldaynumber ordinalstr ordmasculine \
-ornamenttext oslash ostroke ostrokeacute otilde \
-otildemacron otimes outputfilename outputstreambox outputstreamcopy \
-outputstreamunvbox outputstreamunvcopy over overbar overbars \
-overbarunderbar overbrace overbraceunderbrace overbracket overbracketunderbracket \
-overlaybutton overlaycolor overlaydepth overlayfigure overlayheight \
-overlayimage overlaylinecolor overlaylinewidth overlayoffset overlayrollbutton \
-overlaywidth overleftarrow overloaderror overparent overparentunderparent \
-overrightarrow overset overstrike overstrikes owns \
-page pagearea pagebreak pagefigure pageinjection \
-pagenumber pagereference pagestaterealpage pagestaterealpageorder paletsize \
-paragraphmark parallel part partial pdfTeX \
-pdfactualtext pdfbackendactualtext pdfbackendcurrentresources pdfbackendsetcatalog pdfbackendsetcolorspace \
-pdfbackendsetextgstate pdfbackendsetinfo pdfbackendsetname pdfbackendsetpageattribute pdfbackendsetpageresource \
-pdfbackendsetpagesattribute pdfbackendsetpattern pdfbackendsetshade pdfcolor pdfeTeX \
-percent percentdimen periodcentered periods permitcaretescape \
-permitcircumflexescape permitspacesbetweengroups perp persiandecimals persiandecimalseparator \
-persiannumerals persianthousandsseparator perthousand phantom phantombox \
-phi phook pi pickupgroupedcommand pitchfork \
-placeattachments placebookmarks placebtxrendering placechemical placecitation \
-placecombinedlist placecomments placecontent placecurrentformulanumber placedbox \
-placefigure placefloat placefloatwithsetups placefootnotes placeformula \
-placeframed placegraphic placeheadnumber placeheadtext placehelp \
-placeindex placeinitial placeintermezzo placelayer placelayeredtext \
-placelegend placelist placelistofabbreviations placelistofchemicals placelistoffigures \
-placelistofgraphics placelistofintermezzi placelistoflogos placelistofpublications placelistofsorts \
-placelistofsynonyms placelistoftables placelocalfootnotes placelocalnotes placement \
-placenamedfloat placenamedformula placenotes placeongrid placeontopofeachother \
-placepagenumber placepairedbox placeparallel placerawlist placeregister \
-placerenderingwindow placesidebyside placesubformula placetable pm \
-popattribute popmacro popmode popsystemmode position \
-positionoverlay positionregionoverlay positivesign postponenotes prec \
-precapprox preccurlyeq preceq preceqq precnapprox \
-precneq precneqq precnsim precsim predefinedfont \
-predefinefont predefinesymbol prefixedpagenumber prefixlanguage prefixtext \
-prependetoks prependgvalue prependtocommalist prependtoks prependtoksonce \
-prependvalue prerollblank presetbtxlabeltext presetdocument presetfieldsymbols \
-presetheadtext presetlabeltext presetmathlabeltext presetoperatortext presetprefixtext \
-presetsuffixtext presettaglabeltext presetunittext pretocommalist prettyprintbuffer \
-prevcounter prevcountervalue preventmode prevrealpage prevrealpagenumber \
-prevsubcountervalue prevsubpage prevsubpagenumber prevuserpage prevuserpagenumber \
-prime primes procent processMPbuffer processMPfigurefile \
-processaction processallactionsinset processassignlist processassignmentcommand processassignmentlist \
-processbetween processblocks processbodyfontenvironmentlist processcolorcomponents processcommacommand \
-processcommalist processcommalistwithparameters processcontent processfile processfilemany \
-processfilenone processfileonce processfirstactioninset processisolatedchars processisolatedwords \
-processlinetablebuffer processlinetablefile processlist processmonth processranges \
-processseparatedlist processtexbuffer processtokens processuntil processxtablebuffer \
-processyear prod product profiledbox profilegivenbox \
-program project propto pseudoMixedCapped pseudoSmallCapped \
-pseudoSmallcapped pseudosmallcapped psi punctuationspace purenumber \
-pushattribute pushbutton pushmacro pushmode pushoutputstream \
-pushsystemmode putboxincache putnextboxincache qquad quad \
-quadrupleprime quads quarterstrut questiondown questionedeq \
-quitcommalist quitprevcommalist quittypescriptscanning quotation quote \
-quotedbl quotedblbase quotedblleft quotedblright quoteleft \
-quoteright quotesingle quotesinglebase rVert racute \
-raggedbottom raggedcenter raggedleft raggedright raggedwidecenter \
-raisebox randomizetext randomnumber rangle rationals \
-rawcounter rawcountervalue rawdate rawdoifelseinset rawdoifinset \
-rawdoifinsetelse rawgetparameters rawprocessaction rawprocesscommacommand rawprocesscommalist \
-rawstructurelistuservariable rawsubcountervalue rbox rbrace rbracket \
-rcaron rceil rcommaaccent rdoublegrave readfile \
-readfixfile readjobfile readlocfile readsetfile readsysfile \
-readtexfile readxmlfile realSmallCapped realSmallcapped realpagenumber \
-reals realsmallcapped recursedepth recurselevel recursestring \
-redoconvertfont ref reference referenceprefix referring \
-registerattachment registerctxluafile registered registerexternalfigure registerfontclass \
-registerhyphenationexception registerhyphenationpattern registermenubuttons registersort registersynonym \
-registerunit regular relatemarking relateparameterhandlers relaxvalueifundefined \
-relbar remainingcharacters remark removebottomthings removedepth \
-removefromcommalist removelastskip removelastspace removemarkedcontent removepunctuation \
-removesubstring removetoks removeunwantedspaces replacefeature replaceincommalist \
-replaceword rescan rescanwithsetup resetMPdrawing resetMPenvironment \
-resetMPinstance resetallattributes resetandaddfeature resetbar resetboxesincache \
-resetbreakpoints resetbuffer resetcharacteralign resetcharacterkerning resetcharacterspacing \
-resetcharacterstripping resetcollector resetcounter resetdigitsmanipulation resetdirection \
-resetfeature resetflag resetfontcolorsheme resetfontfallback resetfontsolution \
-resethyphenationfeatures resetinjector resetinteractionmenu resetitaliccorrection resetlayer \
-resetlocalfloats resetmarker resetmarking resetmode resetpagenumber \
-resetparallel resetpath resetpenalties resetperiodkerning resetprofile \
-resetrecurselevel resetreference resetreplacement resetscript resetsetups \
-resetshownsynonyms resetsubpagenumber resetsymbolset resetsystemmode resettimer \
-resettokenlist resettrackers resettrialtypesetting resetusedsortings resetusedsynonyms \
-resetuserpagenumber resetvalue resetvisualizers reshapebox resolvedglyphdirect \
-resolvedglyphstyled restartcounter restorebox restorecatcodes restorecounter \
-restorecurrentattributes restoreendofline restoreglobalbodyfont restriction reusableMPgraphic \
-reuseMPgraphic reuserandomseed reverseddoubleprime reversedprime reversedtripleprime \
-revivefeature rfence rfloor rgroup rhbox \
-rho rhooknearrow rhookswarrow right rightaligned \
-rightangle rightarrow rightarrowbar rightarrowtail rightarrowtriangle \
-rightbottombox rightbox rightdasharrow rightguillemot rightharpoondown \
-rightharpoonup righthbox rightheadtext rightlabeltext rightleftarrows \
-rightleftharpoons rightline rightmathlabeltext rightorleftpageaction rightpageorder \
-rightrightarrows rightskipadaption rightsquigarrow rightsubguillemot rightthreearrows \
-rightthreetimes righttoleft righttolefthbox righttoleftvbox righttoleftvtop \
-righttopbox rightwavearrow rightwhitearrow ring rinterval \
-rinvertedbreve risingdotseq rlap rlointerval rmoustache \
-rneq robustaddtocommalist robustdoifelseinset robustdoifinsetelse robustpretocommalist \
-rointerval rollbutton roman romanC romanD \
-romanI romanII romanIII romanIV romanIX \
-romanL romanM romanV romanVI romanVII \
-romanVIII romanX romanXI romanXII romanc \
-romand romani romanii romaniii romaniv \
-romanix romanl romanm romannumerals romanv \
-romanvi romanvii romanviii romanx romanxi \
-romanxii rootradical rotate rparent rrangle \
-rrbracket rrointerval rtimes rtop ruby \
-ruledhbox ruledhpack ruledmbox ruledtopv ruledtpack \
-ruledvbox ruledvpack ruledvtop runMPbuffer runninghbox \
-rvert sacute safechar samplefile sans \
-sansbold sansnormal sansserif savebox savebtxdataset \
-savebuffer savecounter savecurrentattributes savenormalmeaning savetaggedtwopassdata \
-savetwopassdata sbox scale scaron scedilla \
-schwa schwahook scircumflex scommaaccent screen \
-searrow secondoffivearguments secondoffourarguments secondofsixarguments secondofthreearguments \
-secondofthreeunexpanded secondoftwoarguments secondoftwounexpanded section sectionmark \
-seeindex select selectblocks serializecommalist serializedcommalist \
-serif serifbold serifnormal setJSpreamble setMPlayer \
-setMPpositiongraphic setMPpositiongraphicrange setMPtext setMPvariable setMPvariables \
-setautopagestaterealpageno setbar setbigbodyfont setboxllx setboxlly \
-setbreakpoints setcapstrut setcatcodetable setcharacteralign setcharacteraligndetail \
-setcharactercasing setcharactercleaning setcharacterkerning setcharacterspacing setcharacterstripping \
-setcharstrut setcollector setcolormodell setcounter setcounterown \
-setcurrentfontclass setdataset setdefaultpenalties setdigitsmanipulation setdirection \
-setdocumentargument setdocumentargumentdefault setdocumentfilename setdummyparameter setelementexporttag \
-setemeasure setevalue setevariable setevariables setfirstline \
-setfirstpasscharacteralign setflag setfont setfontcolorsheme setfontfeature \
-setfontsolution setfontstrut setglobalscript setgmeasure setgvalue \
-setgvariable setgvariables sethboxregister sethyphenatedurlafter sethyphenatedurlbefore \
-sethyphenatedurlnormal sethyphenationfeatures setinitial setinjector setinteraction \
-setinterfacecommand setinterfaceconstant setinterfaceelement setinterfacemessage setinterfacevariable \
-setinternalrendering setitaliccorrection setlayer setlayerframed setlayertext \
-setlinefiller setlocalhsize setlocalscript setmainbodyfont setmainparbuilder \
-setmarker setmarking setmathstyle setmeasure setmessagetext \
-setminus setmode setnostrut setnote setnotetext \
-setobject setoldstyle setpagereference setpagestate setpagestaterealpageno \
-setpenalties setpercentdimen setperiodkerning setposition setpositionbox \
-setpositiondata setpositiondataplus setpositiononly setpositionplus setpositionstrut \
-setprofile setrandomseed setreference setreferencedobject setregisterentry \
-setreplacement setrigidcolumnbalance setrigidcolumnhsize setscript setsecondpasscharacteralign \
-setsectionblock setsimplecolumnhsize setsmallbodyfont setsmallcaps setstackbox \
-setstructurepageregister setstrut setsuperiors setsystemmode settabular \
-settaggedmetadata settextcontent settightobject settightreferencedobject settightstrut \
-settightunreferencedobject settokenlist settrialtypesetting setuevalue setugvalue \
-setunreferencedobject setup setupMPgraphics setupMPinstance setupMPpage \
-setupMPvariables setupTABLE setupTEXpage setupalign setupalternativestyles \
-setuparranging setupattachment setupattachments setupbackend setupbackground \
-setupbackgrounds setupbar setupbars setupblackrules setupblank \
-setupbleeding setupblock setupbodyfont setupbookmark setupbottom \
-setupbottomtexts setupbtx setupbtxdataset setupbtxlabeltext setupbtxlist \
-setupbtxregister setupbtxrendering setupbuffer setupbutton setupcapitals \
-setupcaption setupcaptions setupcharacteralign setupcharacterkerning setupcharacterspacing \
-setupchemical setupchemicalframed setupclipping setupcollector setupcolor \
-setupcolors setupcolumns setupcolumnset setupcolumnsetarea setupcolumnsetareatext \
-setupcolumnsetlines setupcolumnsetspan setupcolumnsetstart setupcolumnspan setupcombination \
-setupcombinedlist setupcomment setupcontent setupcounter setupdataset \
-setupdelimitedtext setupdescription setupdirections setupdocument setupeffect \
-setupenumeration setupenumerations setupenv setupexport setupexternalfigure \
-setupexternalsoundtracks setupfacingfloat setupfield setupfieldbody setupfieldcategory \
-setupfieldcontentframed setupfieldlabelframed setupfields setupfieldtotalframed setupfiller \
-setupfillinlines setupfillinrules setupfirstline setupfittingpage setupfloat \
-setupfloatframed setupfloats setupfloatsplitting setupfontexpansion setupfontprotrusion \
-setupfonts setupfontsolution setupfooter setupfootertexts setupforms \
-setupformula setupformulae setupformulaframed setupframed setupframedcontent \
-setupframedtable setupframedtablecolumn setupframedtablerow setupframedtext setupframedtexts \
-setupglobalreferenceprefix setuphead setupheadalternative setupheader setupheadertexts \
-setupheadnumber setupheads setupheadtext setuphelp setuphigh \
-setuphighlight setuphyphenation setuphyphenmark setupindentedtext setupindenting \
-setupindex setupinitial setupinsertion setupinteraction setupinteractionbar \
-setupinteractionmenu setupinteractionscreen setupinterlinespace setupitaliccorrection setupitemgroup \
-setupitemizations setupitemize setupitems setuplabel setuplabeltext \
-setuplanguage setuplayer setuplayeredtext setuplayout setuplayouttext \
-setuplegend setuplinefiller setuplinefillers setuplinenote setuplinenumbering \
-setuplines setuplinetable setuplinewidth setuplist setuplistalternative \
-setuplistextra setuplocalfloats setuplocalinterlinespace setuplow setuplowhigh \
-setuplowmidhigh setupmakeup setupmarginblock setupmargindata setupmarginframed \
-setupmarginrule setupmarginrules setupmarking setupmathalignment setupmathcases \
-setupmathematics setupmathfence setupmathfraction setupmathfractions setupmathframed \
-setupmathlabeltext setupmathmatrix setupmathornament setupmathradical setupmathstackers \
-setupmathstyle setupmixedcolumns setupmodule setupnarrower setupnotation \
-setupnotations setupnote setupnotes setupoffset setupoffsetbox \
-setupoperatortext setupoppositeplacing setupoutputroutine setuppagechecker setuppagecolumns \
-setuppagecomment setuppageinjection setuppageinjectionalternative setuppagenumber setuppagenumbering \
-setuppageshift setuppagestate setuppagetransitions setuppairedbox setuppalet \
-setuppaper setuppapersize setupparagraph setupparagraphintro setupparagraphnumbering \
-setupparagraphs setupparallel setupperiodkerning setupperiods setupplacement \
-setuppositionbar setuppositioning setupprefixtext setupprocessor setupprofile \
-setupprograms setupquotation setupquote setuprealpagenumber setupreferenceformat \
-setupreferenceprefix setupreferencestructureprefix setupreferencing setupregister setupregisters \
-setuprenderingwindow setuprotate setupruby setups setupscale \
-setupscript setupscripts setupsectionblock setupselector setupshift \
-setupsidebar setupsorting setupspacing setupspellchecking setupstartstop \
-setupstretched setupstruts setupstyle setupsubformula setupsubformulas \
-setupsubpagenumber setupsuffixtext setupsymbolset setupsynctex setupsynonyms \
-setuptables setuptabulate setuptabulation setuptagging setuptaglabeltext \
-setuptext setuptextbackground setuptextflow setuptextrules setuptexttexts \
-setupthinrules setuptolerance setuptooltip setuptop setuptoptexts \
-setuptype setuptyping setupunit setupunittext setupurl \
-setupuserdata setupuserdataalternative setupuserpagenumber setupversion setupviewerlayer \
-setupvspacing setupwhitespace setupwithargument setupwithargumentswapped setupxml \
-setupxtable setuvalue setuxvalue setvalue setvariable \
-setvariables setvboxregister setvisualizerfont setvtopregister setwidthof \
-setxmeasure setxvalue setxvariable setxvariables seveneighths \
-sfrac shapedhbox sharp shiftbox shiftdown \
-shiftup showallmakeup showattributes showbodyfont showbodyfontenvironment \
-showboxes showbtxdatasetauthors showbtxdatasetcompleteness showbtxdatasetfields showbtxfields \
-showbtxhashedauthors showbtxtables showchardata showcharratio showcolor \
-showcolorbar showcolorcomponents showcolorgroup showcolorset showcolorstruts \
-showcounter showdirectives showdirsinmargin showedebuginfo showexperiments \
-showfont showfontdata showfontexpansion showfontitalics showfontkerns \
-showfontparameters showfontstrip showfontstyle showframe showglyphdata \
-showglyphs showgrid showgridsnapping showhelp showhyphenationtrace \
-showhyphens showinjector showjustification showkerning showlayout \
-showlayoutcomponents showligature showligatures showlogcategories showmakeup \
-showmargins showmessage showminimalbaseline shownextbox showotfcomposition \
-showpalet showparentchain showprint showsetups showsetupsdefinition \
-showstruts showsymbolset showtimer showtokens showtrackers \
-showvalue showvariable showwarning sigma signalrightpage \
-sim simeq simplealignedbox simplealignedboxplus simplealignedspreadbox \
-simplegroupedcommand simplereversealignedbox simplereversealignedboxplus singalcharacteralign singlebond \
-singleverticalbar sixperemspace sixthofsixarguments slanted slantedbold \
-slantedface slash slicepages slong slovenianNumerals \
-sloveniannumerals small smallbodyfont smallbold smallbolditalic \
-smallboldslanted smallcappedcharacters smallcappedromannumerals smaller smallitalicbold \
+cacute calligraphic camel cap capital \
+carriagereturn catcodetablename cbox ccaron ccedilla \
+ccircumflex ccurl cdot cdotaccent cdotp \
+cdots centeraligned centerbox centerdot centeredbox \
+centeredlastline centerednextbox centerline cfrac chapter \
+character characters chardescription charwidthlanguage check \
+checkcharacteralign checkedblank checkedchar checkedfiller checkedstrippedcsname \
+checkinjector checkmark checknextindentation checknextinjector checkpage \
+checkparameters checkpreviousinjector checksoundtrack checktwopassdata checkvariables \
+chem chemical chemicalbottext chemicalmidtext chemicalsymbol \
+chemicaltext chemicaltoptext chi chineseallnumerals chinesecapnumerals \
+chinesenumerals chook circ circeq circlearrowleft \
+circlearrowright circledR circledS circledast circledcirc \
+circleddash circledequals circleonrightarrow citation cite \
+clap classfont cldcommand cldcontext cldloadfile \
+cldprocessfile cleftarrow clip clippedoverlayimage clonefield \
+clubsuit collect collectedtext collectexpanded colon \
+coloncolonequals colonequals color colorbar colorcomponents \
+colored coloronly colorvalue column columnbreak \
+columnsetspanwidth combinepages commalistelement commalistsentence commalistsize \
+comment comparecolorgroup comparedimension comparedimensioneps comparepalet \
+complement completebtxrendering completecontent completeindex completelist \
+completelistofabbreviations completelistofchemicals completelistoffigures completelistofgraphics completelistofintermezzi \
+completelistoflogos completelistofpublications completelistofsorts completelistofsynonyms completelistoftables \
+completepagenumber completeregister complexes complexorsimple complexorsimpleempty \
+component composedcollector composedlayer compresult cong \
+constantdimen constantdimenargument constantemptyargument constantnumber constantnumberargument \
+contentreference continuednumber continueifinputfile convertargument convertcommand \
+convertedcounter converteddimen convertedsubcounter convertmonth convertnumber \
+convertvalue convertvboxtohbox coprod copyboxfromcache copybtxlabeltext \
+copyfield copyheadtext copylabeltext copymathlabeltext copyoperatortext \
+copypages copyparameters copyposition copyprefixtext copyright \
+copysetups copysuffixtext copytaglabeltext copyunittext correctwhitespace \
+countersubs counttoken counttokens cramped crampedclap \
+crampedllap crampedrlap crightarrow crightoverleftarrow crlf \
+crlfplaceholder cstroke ctop ctxcommand ctxdirectcommand \
+ctxdirectlua ctxfunction ctxlatecommand ctxlatelua ctxloadluafile \
+ctxlua ctxluabuffer ctxluacode ctxreport ctxsprint \
+cup curlyeqprec curlyeqsucc curlyvee curlywedge \
+currentassignmentlistkey currentassignmentlistvalue currentbtxuservariable currentcommalistitem currentcomponent \
+currentdate currentenvironment currentfeaturetest currentheadnumber currentinterface \
+currentlanguage currentlistentrydestinationattribute currentlistentrylimitedtext currentlistentrynumber currentlistentrypagenumber \
+currentlistentryreferenceattribute currentlistentrytitle currentlistentrytitlerendered currentlistsymbol currentmainlanguage \
+currentmessagetext currentmoduleparameter currentoutputstream currentproduct currentproject \
+currentregime currentregisterpageuserdata currentresponses currenttime currentvalue \
+currentxtablecolumn currentxtablerow curvearrowleft curvearrowright cwopencirclearrow \
+cyrillicA cyrillicAE cyrillicAbreve cyrillicAdiaeresis cyrillicB \
+cyrillicBIGYUS cyrillicBIGYUSiotified cyrillicC cyrillicCH cyrillicCHEDC \
+cyrillicCHEDCabkhasian cyrillicCHEabkhasian cyrillicCHEdiaeresis cyrillicCHEkhakassian cyrillicCHEvertstroke \
+cyrillicD cyrillicDASIAPNEUMATA cyrillicDJE cyrillicDZE cyrillicDZEabkhasian \
+cyrillicDZHE cyrillicE cyrillicELtail cyrillicEMtail cyrillicENDC \
+cyrillicENGHE cyrillicENhook cyrillicENtail cyrillicEREV cyrillicERY \
+cyrillicERtick cyrillicEbreve cyrillicEdiaeresis cyrillicEgrave cyrillicEiotified \
+cyrillicF cyrillicFITA cyrillicG cyrillicGHEmidhook cyrillicGHEstroke \
+cyrillicGHEupturn cyrillicGJE cyrillicH cyrillicHA cyrillicHADC \
+cyrillicHRDSN cyrillicI cyrillicIE cyrillicII cyrillicISHRT \
+cyrillicISHRTtail cyrillicIZHITSA cyrillicIZHITSAdoublegrave cyrillicIdiaeresis cyrillicIgrave \
+cyrillicImacron cyrillicJE cyrillicK cyrillicKADC cyrillicKAbashkir \
+cyrillicKAhook cyrillicKAstroke cyrillicKAvertstroke cyrillicKJE cyrillicKOPPA \
+cyrillicKSI cyrillicL cyrillicLITTLEYUS cyrillicLITTLEYUSiotified cyrillicLJE \
+cyrillicM cyrillicN cyrillicNJE cyrillicO cyrillicOMEGA \
+cyrillicOMEGAround cyrillicOMEGAtitlo cyrillicOT cyrillicObarred cyrillicObarreddiaeresis \
+cyrillicOdiaeresis cyrillicP cyrillicPALATALIZATION cyrillicPALOCHKA cyrillicPEmidhook \
+cyrillicPSI cyrillicPSILIPNEUMATA cyrillicR cyrillicS cyrillicSCHWA \
+cyrillicSCHWAdiaeresis cyrillicSDSC cyrillicSEMISOFT cyrillicSFTSN cyrillicSH \
+cyrillicSHCH cyrillicSHHA cyrillicT cyrillicTEDC cyrillicTETSE \
+cyrillicTITLO cyrillicTSHE cyrillicU cyrillicUK cyrillicUSHRT \
+cyrillicUdiaeresis cyrillicUdoubleacute cyrillicUmacron cyrillicV cyrillicYA \
+cyrillicYAT cyrillicYERUdiaeresis cyrillicYI cyrillicYO cyrillicYU \
+cyrillicYstr cyrillicYstrstroke cyrillicZ cyrillicZDSC cyrillicZEdiaeresis \
+cyrillicZH cyrillicZHEbreve cyrillicZHEdescender cyrillicZHEdiaeresis cyrillica \
+cyrillicabreve cyrillicadiaeresis cyrillicae cyrillicb cyrillicbigyus \
+cyrillicbigyusiotified cyrillicc cyrillicch cyrilliccheabkhasian cyrillicchedc \
+cyrillicchedcabkhasian cyrillicchediaeresis cyrillicchekhakassian cyrillicchevertstroke cyrillicd \
+cyrillicdje cyrillicdze cyrillicdzeabkhasian cyrillicdzhe cyrillice \
+cyrillicebreve cyrillicediaeresis cyrillicegrave cyrilliceiotified cyrilliceltail \
+cyrillicemtail cyrillicendc cyrillicenghe cyrillicenhook cyrillicentail \
+cyrillicerev cyrillicertick cyrillicery cyrillicf cyrillicfita \
+cyrillicg cyrillicghemidhook cyrillicghestroke cyrillicgheupturn cyrillicgje \
+cyrillich cyrillicha cyrillichadc cyrillichrdsn cyrillici \
+cyrillicidiaeresis cyrillicie cyrillicigrave cyrillicii cyrillicimacron \
+cyrillicishrt cyrillicishrttail cyrillicizhitsa cyrillicizhitsadoublegrave cyrillicje \
+cyrillick cyrillickabashkir cyrillickadc cyrillickahook cyrillickastroke \
+cyrillickavertstroke cyrillickje cyrillickoppa cyrillicksi cyrillicl \
+cyrilliclittleyus cyrilliclittleyusiotified cyrilliclje cyrillicm cyrillicn \
+cyrillicnje cyrillico cyrillicobarred cyrillicobarreddiaeresis cyrillicodiaeresis \
+cyrillicomega cyrillicomegaround cyrillicomegatitlo cyrillicot cyrillicp \
+cyrillicpemidhook cyrillicpsi cyrillicr cyrillics cyrillicschwa \
+cyrillicschwadiaeresis cyrillicsdsc cyrillicsemisoft cyrillicsftsn cyrillicsh \
+cyrillicshch cyrillicshha cyrillict cyrillictedc cyrillictetse \
+cyrillictshe cyrillicu cyrillicudiaeresis cyrillicudoubleacute cyrillicuk \
+cyrillicumacron cyrillicushrt cyrillicv cyrillicya cyrillicyat \
+cyrillicyerudiaeresis cyrillicyi cyrillicyo cyrillicystr cyrillicystrstroke \
+cyrillicyu cyrillicz cyrilliczdsc cyrilliczediaeresis cyrilliczh \
+cyrilliczhebreve cyrilliczhedescender cyrilliczhediaeresis d dag \
+dagger daleth dasharrow dashedleftarrow dashedrightarrow \
+dashv datasetvariable date dayoftheweek dayspermonth \
+dbinom dcaron dcurl ddag ddagger \
+dddot ddot ddots decrement decrementcounter \
+decrementedcounter decrementpagenumber decrementsubpagenumber decrementvalue defaultinterface \
+defaultobjectpage defaultobjectreference defcatcodecommand defconvertedargument defconvertedcommand \
+defconvertedvalue define defineMPinstance defineTABLEsetup defineaccent \
+defineactivecharacter definealternativestyle defineanchor defineattachment defineattribute \
+definebackground definebar defineblock definebodyfont definebodyfontenvironment \
+definebodyfontswitch definebreakpoint definebreakpoints definebtx definebtxdataset \
+definebtxregister definebtxrendering definebuffer definebutton definecapitals \
+definecharacter definecharacterkerning definecharacterspacing definechemical definechemicals \
+definechemicalsymbol definecollector definecolor definecolorgroup definecolumnbreak \
+definecolumnset definecolumnsetarea definecolumnsetspan definecombination definecombinedlist \
+definecommand definecomment definecomplexorsimple definecomplexorsimpleempty defineconversion \
+defineconversionset definecounter definedataset definedelimitedtext definedeq \
+definedescription definedfont defineeffect defineenumeration defineexpandable \
+defineexternalfigure definefacingfloat definefallbackfamily definefield definefieldbody \
+definefieldbodyset definefieldcategory definefieldstack definefiguresymbol definefileconstant \
+definefilefallback definefilesynonym definefiller definefirstline definefittingpage \
+definefloat definefont definefontalternative definefontfallback definefontfamily \
+definefontfamilypreset definefontfeature definefontfile definefontsize definefontsolution \
+definefontstyle definefontsynonym defineformula defineformulaalternative defineformulaframed \
+defineframed defineframedcontent defineframedtable defineframedtext definefrozenfont \
+defineglobalcolor definegraphictypesynonym definegridsnapping definehbox definehead \
+defineheadalternative definehelp definehigh definehighlight definehspace \
+definehypenationfeatures defineindentedtext defineindenting defineinitial defineinsertion \
+defineinteraction defineinteractionbar defineinteractionmenu defineinterfaceconstant defineinterfaceelement \
+defineinterfacevariable defineinterlinespace defineintermediatecolor defineitemgroup defineitems \
+definelabel definelabelclass definelayer definelayerpreset definelayout \
+definelinefiller definelinenote definelinenumbering definelines definelist \
+definelistalternative definelistextra definelow definelowhigh definelowmidhigh \
+definemakeup definemarginblock definemargindata definemarker definemarking \
+definemathaccent definemathalignment definemathcases definemathcommand definemathdouble \
+definemathdoubleextensible definemathematics definemathextensible definemathfence definemathfraction \
+definemathframed definemathmatrix definemathornament definemathover definemathoverextensible \
+definemathovertextextensible definemathradical definemathstackers definemathstyle definemathtriplet \
+definemathunder definemathunderextensible definemathundertextextensible definemathunstacked definemeasure \
+definemessageconstant definemixedcolumns definemode definemultitonecolor definenamedcolor \
+definenamespace definenarrower definenote defineornament defineoutputroutine \
+defineoutputroutinecommand defineoverlay definepage definepagebreak definepagechecker \
+definepagecolumns definepageinjection definepageinjectionalternative definepageshift definepagestate \
+definepairedbox definepalet definepapersize defineparagraph defineparagraphs \
+defineparallel defineparbuilder defineperiodkerning defineplacement definepositioning \
+defineprefixset defineprocesscolor defineprocessor defineprofile defineprogram \
+definepushbutton definepushsymbol definereference definereferenceformat defineregister \
+definerenderingwindow defineresetset defineruby definescale definescript \
+definesection definesectionblock definesectionlevels defineselector defineseparatorset \
+defineshift definesidebar definesort definesorting definespotcolor \
+definestartstop definestyle definestyleinstance definesubfield definesubformula \
+definesymbol definesynonym definesynonyms definesystemattribute definesystemconstant \
+definesystemvariable definetabletemplate definetabulate definetabulation definetext \
+definetextbackground definetextflow definetextnote definetokenlist definetooltip \
+definetransparency definetwopasslist definetype definetypeface definetypescriptprefix \
+definetypescriptsynonym definetypesetting definetyping defineunit defineuserdata \
+defineuserdataalternative defineviewerlayer definevspace definevspacing definevspacingamount \
+definextable delimited delimitedtext delta depthofstring \
+depthonlybox depthspanningtext depthstrut determineheadnumber determinelistcharacteristics \
+determinenoflines determineregistercharacteristics devanagarinumerals dfrac dhook \
+diameter diamond diamondsuit differentialD differentiald \
+digamma digits dimensiontocount directboxfromcache directcolor \
+directcolored directconvertedcounter directcopyboxfromcache directdummyparameter directgetboxllx \
+directgetboxlly directhighlight directlocalframed directluacode directselect \
+directsetbar directsetup directsymbol directvspacing dis \
+disabledirectives disableexperiments disablemode disableoutputstream disableparpositions \
+disableregime disabletrackers displaymath displaymathematics displaymessage \
+distributedhsize div dividedsize divideontimes divides \
+doadaptleftskip doadaptrightskip doaddfeature doassign doassignempty \
+doboundtext docheckassignment docheckedpagestate docheckedpair documentvariable \
+dodoubleargument dodoubleargumentwithset dodoubleempty dodoubleemptywithset dodoublegroupempty \
+doeassign doexpandedrecurse dofastloopcs dogetattribute dogetattributeid \
+dogetcommacommandelement dogobbledoubleempty dogobblesingleempty doif doifMPgraphicelse \
+doifallcommon doifallcommonelse doifalldefinedelse doifallmodes doifallmodeselse \
+doifassignmentelse doifassignmentelsecs doifblackelse doifbothsides doifbothsidesoverruled \
+doifboxelse doifbufferelse doifcolor doifcolorelse doifcommandhandler \
+doifcommandhandlerelse doifcommon doifcommonelse doifcontent doifconversiondefinedelse \
+doifconversionnumberelse doifcounter doifcounterelse doifcurrentfonthasfeatureelse doifdefined \
+doifdefinedcounter doifdefinedcounterelse doifdefinedelse doifdimensionelse doifdimenstringelse \
+doifdocumentargument doifdocumentargumentelse doifdocumentfilename doifdocumentfilenameelse doifdocumentvariable \
+doifdocumentvariableelse doifdrawingblackelse doifelse doifelseMPgraphic doifelseallcommon \
+doifelsealldefined doifelseallmodes doifelseassignment doifelseassignmentcs doifelseblack \
+doifelsebox doifelseboxincache doifelsebuffer doifelsecolor doifelsecommandhandler \
+doifelsecommon doifelseconversiondefined doifelseconversionnumber doifelsecounter doifelsecurrentfonthasfeature \
+doifelsecurrentsortingused doifelsecurrentsynonymshown doifelsecurrentsynonymused doifelsedefined doifelsedefinedcounter \
+doifelsedimension doifelsedimenstring doifelsedocumentargument doifelsedocumentfilename doifelsedocumentvariable \
+doifelsedrawingblack doifelseempty doifelseemptyvalue doifelseemptyvariable doifelseenv \
+doifelsefastoptionalcheck doifelsefastoptionalcheckcs doifelsefieldbody doifelsefieldcategory doifelsefigure \
+doifelsefile doifelsefiledefined doifelsefileexists doifelsefirstchar doifelseflagged \
+doifelsefontchar doifelsefontfeature doifelsefontpresent doifelsefontsynonym doifelseframed \
+doifelsehasspace doifelsehelp doifelseincsname doifelseinelement doifelseinputfile \
+doifelseinsertion doifelseinset doifelseinstring doifelseinsymbolset doifelseintoks \
+doifelseintwopassdata doifelseitalic doifelselanguage doifelselayerdata doifelselayoutdefined \
+doifelselayoutsomeline doifelselayouttextline doifelseleapyear doifelselist doifelselocation \
+doifelselocfile doifelsemainfloatbody doifelsemarkedpage doifelsemarking doifelsemeaning \
+doifelsemessage doifelsemode doifelsenextbgroup doifelsenextbgroupcs doifelsenextchar \
+doifelsenextoptional doifelsenextoptionalcs doifelsenextparenthesis doifelsenonzeropositive doifelsenoteonsamepage \
+doifelsenothing doifelsenumber doifelseobjectfound doifelseobjectreferencefound doifelseoddpage \
+doifelseoddpagefloat doifelseoldercontext doifelseolderversion doifelseoverlapping doifelseoverlay \
+doifelseparallel doifelseparentfile doifelsepath doifelsepathexists doifelsepatterns \
+doifelseposition doifelsepositionaction doifelsepositiononpage doifelsepositionsonsamepage doifelsepositionsonthispage \
+doifelsepositionsused doifelsereferencefound doifelserightpage doifelserightpagefloat doifelserighttoleftinbox \
+doifelsesamelinereference doifelsesamestring doifelsesetups doifelsesomebackground doifelsesomespace \
+doifelsesomething doifelsesometoks doifelsestringinstring doifelsestructurelisthasnumber doifelsestructurelisthaspage \
+doifelsesymboldefined doifelsesymbolset doifelsetext doifelsetextflow doifelsetextflowcollector \
+doifelsetopofpage doifelsetypingfile doifelseundefined doifelseurldefined doifelsevalue \
+doifelsevaluenothing doifelsevariable doifempty doifemptyelse doifemptytoks \
+doifemptyvalue doifemptyvalueelse doifemptyvariable doifemptyvariableelse doifenv \
+doifenvelse doiffastoptionalcheckcselse doiffastoptionalcheckelse doiffieldbodyelse doiffieldcategoryelse \
+doiffigureelse doiffile doiffiledefinedelse doiffileelse doiffileexistselse \
+doiffirstcharelse doifflaggedelse doiffontcharelse doiffontfeatureelse doiffontpresentelse \
+doiffontsynonymelse doifhasspaceelse doifhelpelse doifincsnameelse doifinelementelse \
+doifinputfileelse doifinsertionelse doifinset doifinsetelse doifinstring \
+doifinstringelse doifinsymbolset doifinsymbolsetelse doifintokselse doifintwopassdataelse \
+doifitalicelse doiflanguageelse doiflayerdataelse doiflayoutdefinedelse doiflayoutsomelineelse \
+doiflayouttextlineelse doifleapyearelse doiflistelse doiflocationelse doiflocfileelse \
+doifmainfloatbodyelse doifmarkingelse doifmeaningelse doifmessageelse doifmode \
+doifmodeelse doifnextbgroupcselse doifnextbgroupelse doifnextcharelse doifnextoptionalcselse \
+doifnextoptionalelse doifnextparenthesiselse doifnonzeropositiveelse doifnot doifnotallcommon \
+doifnotallmodes doifnotcommandhandler doifnotcommon doifnotcounter doifnotdocumentargument \
+doifnotdocumentfilename doifnotdocumentvariable doifnotempty doifnotemptyvalue doifnotemptyvariable \
+doifnotenv doifnoteonsamepageelse doifnotescollected doifnotfile doifnotflagged \
+doifnothing doifnothingelse doifnotinset doifnotinsidesplitfloat doifnotinstring \
+doifnotmode doifnotnumber doifnotsamestring doifnotsetups doifnotvalue \
+doifnotvariable doifnumber doifnumberelse doifobjectfoundelse doifobjectreferencefoundelse \
+doifoddpageelse doifoddpagefloatelse doifoldercontextelse doifolderversionelse doifoverlappingelse \
+doifoverlayelse doifparallelelse doifparentfileelse doifpathelse doifpathexistselse \
+doifpatternselse doifposition doifpositionaction doifpositionactionelse doifpositionelse \
+doifpositiononpageelse doifpositionsonsamepageelse doifpositionsonthispageelse doifpositionsusedelse doifreferencefoundelse \
+doifrightpagefloatelse doifrighttoleftinboxelse doifsamelinereferenceelse doifsamestring doifsamestringelse \
+doifsetups doifsetupselse doifsomebackground doifsomebackgroundelse doifsomespaceelse \
+doifsomething doifsomethingelse doifsometoks doifsometokselse doifstringinstringelse \
+doifstructurelisthasnumberelse doifstructurelisthaspageelse doifsymboldefinedelse doifsymbolsetelse doiftext \
+doiftextelse doiftextflowcollectorelse doiftextflowelse doiftopofpageelse doiftypingfileelse \
+doifundefined doifundefinedcounter doifundefinedelse doifunknownfontfeature doifurldefinedelse \
+doifvalue doifvalueelse doifvaluenothing doifvaluenothingelse doifvaluesomething \
+doifvariable doifvariableelse doindentation dollar doloop \
+doloopoverlist donothing dontconvertfont dontleavehmode dontpermitspacesbetweengroups \
+dopositionaction doprocesslocalsetups doquadrupleargument doquadrupleempty doquadruplegroupempty \
+doquintupleargument doquintupleempty doquintuplegroupempty dorechecknextindentation dorecurse \
+dorepeatwithcommand doreplacefeature doresetandafffeature doresetattribute dorotatebox \
+dosetattribute dosetleftskipadaption dosetrightskipadaption dosetupcheckedinterlinespace doseventupleargument \
+doseventupleempty dosingleargument dosingleempty dosinglegroupempty dosixtupleargument \
+dosixtupleempty dostepwiserecurse dosubtractfeature dot doteq \
+doteqdot dotfskip dotlessI dotlessJ dotlessi \
+dotlessj dotlessjstroke dotminus dotoks dotplus \
+dotripleargument dotripleargumentwithset dotripleempty dotripleemptywithset dotriplegroupempty \
+dots dottedcircle dottedrightarrow doublebar doublebond \
+doublebrace doublebracket doublecap doublecup doubleparent \
+doubleprime doubleverticalbar dowith dowithnextbox dowithnextboxcontent \
+dowithnextboxcontentcs dowithnextboxcs dowithpargument dowithrange dowithwargument \
+downarrow downdasharrow downdownarrows downharpoonleft downharpoonright \
+downuparrows downwhitearrow downzigzagarrow dpofstring dstroke \
+dtail dummydigit dummyparameter dzcaronligature dzligature \
+eTeX eacute ebreve ecaron ecedilla \
+ecircumflex ecircumflexacute ecircumflexdotbelow ecircumflexgrave ecircumflexhook \
+ecircumflextilde edefconvertedargument ediaeresis edotaccent edotbelow \
+edoublegrave efcmaxheight efcmaxwidth efcminheight efcminwidth \
+efcparameter effect egrave ehook einvertedbreve \
+elapsedseconds elapsedtime eleftarrowfill eleftharpoondownfill eleftharpoonupfill \
+eleftrightarrowfill ell em emacron emdash \
+emphasisboldface emphasistypeface emptylines emptyset emquad \
+emspace enabledirectives enableexperiments enablemode enableoutputstream \
+enableparpositions enableregime enabletrackers endash endnote \
+enquad enskip enspace env environment \
+envvar eogonek eoverbarfill eoverbracefill eoverbracketfill \
+eoverparentfill epos epsilon eq eqcirc \
+eqeq eqeqeq eqgtr eqless eqsim \
+eqslantgtr eqslantless equaldigits equalscolon equiv \
+erightarrowfill erightharpoondownfill erightharpoonupfill eta eth \
+ethiopic etilde etwoheadrightarrowfill eunderbarfill eunderbracefill \
+eunderbracketfill eunderparentfill exclamdown executeifdefined exists \
+exitloop exitloopnow expandcheckedcsname expanded expandeddoif \
+expandeddoifelse expandeddoifnot expandfontsynonym expdoif expdoifcommonelse \
+expdoifelse expdoifelsecommon expdoifelseinset expdoifinsetelse expdoifnot \
+exponentiale externalfigure externalfigurecollectionmaxheight externalfigurecollectionmaxwidth externalfigurecollectionminheight \
+externalfigurecollectionminwidth externalfigurecollectionparameter fakebox fallingdotseq fastdecrement \
+fastincrement fastlocalframed fastloopfinal fastloopindex fastscale \
+fastsetup fastsetupwithargument fastsetupwithargumentswapped fastswitchtobodyfont fastsxsy \
+feature fence fenced fetchallmarkings fetchallmarks \
+fetchmark fetchmarking fetchonemark fetchonemarking fetchruntinecommand \
+fetchtwomarkings fetchtwomarks ffiligature ffligature fflligature \
+fhook field fieldbody fieldstack fifthoffivearguments \
+fifthofsixarguments figurefilename figurefilepath figurefiletype figurefullname \
+figureheight figurenaturalheight figurenaturalwidth figurespace figuresymbol \
+figurewidth filename filigature filledhboxb filledhboxc \
+filledhboxg filledhboxk filledhboxm filledhboxr filledhboxy \
+filler fillinline fillinrules fillintext fillupto \
+filterfromnext filterfromvalue filterpages filterreference findtwopassdata \
+finishregisterentry firstcharacter firstcounter firstcountervalue firstinlist \
+firstoffivearguments firstoffourarguments firstofoneargument firstofoneunexpanded firstofsixarguments \
+firstofthreearguments firstofthreeunexpanded firstoftwoarguments firstoftwounexpanded firstrealpage \
+firstrealpagenumber firstsubcountervalue firstsubpage firstsubpagenumber firstuserpage \
+firstuserpagenumber fitfield fitfieldframed fittopbaselinegrid fiveeighths \
+fivesixths fixedspace fixedspaces flag flat \
+flligature floatuserdataparameter flushbox flushboxregister flushcollector \
+flushedrightlastline flushlayer flushlocalfloats flushnextbox flushnotes \
+flushoutputstream flushshapebox flushtextflow flushtokens flushtoks \
+fontalternative fontbody fontchar fontcharbyindex fontclass \
+fontclassname fontface fontfeaturelist fontsize fontstyle \
+footnote footnotetext forall forcecharacterstripping forcelocalfloats \
+forgeteverypar forgetparameters forgetparskip forgetragged formula \
+formulanumber foundbox fourfifths fourperemspace fourthoffivearguments \
+fourthoffourarguments fourthofsixarguments frac framed frameddimension \
+framedparameter framedtext freezedimenmacro freezemeasure frenchspacing \
+from fromlinenote frown frozenhbox frule \
+gacute gamma gbreve gcaron gcircumflex \
+gcommaaccent gdefconvertedargument gdefconvertedcommand gdotaccent ge \
+geq geqq geqslant getMPdrawing getMPlayer \
+getboxfromcache getboxllx getboxlly getbuffer getbufferdata \
+getcommacommandsize getcommalistsize getdayoftheweek getdayspermonth getdefinedbuffer \
+getdocumentargument getdocumentargumentdefault getdocumentfilename getdummyparameters getemptyparameters \
+geteparameters getexpandedparameters getfiguredimensions getfirstcharacter getfirsttwopassdata \
+getfromcommacommand getfromcommalist getfromtwopassdata getglyphdirect getglyphstyled \
+getgparameters getinlineuserdata getlasttwopassdata getlocalfloat getlocalfloats \
+getmarking getmessage getnamedglyphdirect getnamedglyphstyled getnamedtwopassdatalist \
+getnaturaldimensions getnoflines getobject getobjectdimensions getpaletsize \
+getparameters getprivatechar getprivateslot getrandomcount getrandomdimen \
+getrandomfloat getrandomnumber getrandomseed getraweparameters getrawgparameters \
+getrawnoflines getrawparameters getrawxparameters getreference getreferenceentry \
+getroundednoflines gets getsubstring gettokenlist gettwopassdata \
+gettwopassdatalist getuserdata getuvalue getvalue getvariable \
+getvariabledefault getxparameters gg ggg gggtr \
+gimel globaldisablemode globalenablemode globalletempty globalpopbox \
+globalpopmacro globalpreventmode globalprocesscommalist globalpushbox globalpushmacro \
+globalswapcounts globalswapdimens globalswapmacros globalundefine glyphfontfile \
+gnapprox gneqq gnsim gobbledoubleempty gobbleeightarguments \
+gobblefivearguments gobblefiveoptionals gobblefourarguments gobblefouroptionals gobbleninearguments \
+gobbleoneargument gobbleoneoptional gobblesevenarguments gobblesingleempty gobblesixarguments \
+gobblespacetokens gobbletenarguments gobblethreearguments gobblethreeoptionals gobbletwoarguments \
+gobbletwooptionals gobbleuntil gobbleuntilrelax godown goto \
+gotobox gotopage grabbufferdata grabbufferdatadirect grabuntil \
+grave graycolor grayvalue greedysplitstring greekAlpha \
+greekAlphadasia greekAlphadasiaperispomeni greekAlphadasiatonos greekAlphadasiavaria greekAlphaiotasub \
+greekAlphaiotasubdasia greekAlphaiotasubdasiaperispomeni greekAlphaiotasubdasiatonos greekAlphaiotasubdasiavaria greekAlphaiotasubpsili \
+greekAlphaiotasubpsiliperispomeni greekAlphaiotasubpsilitonos greekAlphaiotasubpsilivaria greekAlphamacron greekAlphapsili \
+greekAlphapsiliperispomeni greekAlphapsilitonos greekAlphapsilivaria greekAlphatonos greekAlphavaria \
+greekAlphavrachy greekBeta greekChi greekCoronis greekDelta \
+greekEpsilon greekEpsilondasia greekEpsilondasiatonos greekEpsilondasiavaria greekEpsilonpsili \
+greekEpsilonpsilitonos greekEpsilonpsilivaria greekEpsilontonos greekEpsilonvaria greekEta \
+greekEtadasia greekEtadasiaperispomeni greekEtadasiatonos greekEtadasiavaria greekEtaiotasub \
+greekEtaiotasubdasia greekEtaiotasubdasiaperispomeni greekEtaiotasubdasiatonos greekEtaiotasubdasiavaria greekEtaiotasubpsili \
+greekEtaiotasubpsiliperispomeni greekEtaiotasubpsilitonos greekEtaiotasubpsilivaria greekEtapsili greekEtapsiliperispomeni \
+greekEtapsilitonos greekEtapsilivaria greekEtatonos greekEtavaria greekGamma \
+greekIota greekIotadasia greekIotadasiaperispomeni greekIotadasiatonos greekIotadasiavaria \
+greekIotadialytika greekIotamacron greekIotapsili greekIotapsiliperispomeni greekIotapsilitonos \
+greekIotapsilivaria greekIotatonos greekIotavaria greekIotavrachy greekKappa \
+greekLambda greekMu greekNu greekOmega greekOmegadasia \
+greekOmegadasiaperispomeni greekOmegadasiatonos greekOmegadasiavaria greekOmegaiotasub greekOmegaiotasubdasia \
+greekOmegaiotasubdasiaperispomeni greekOmegaiotasubdasiatonos greekOmegaiotasubdasiavaria greekOmegaiotasubpsili greekOmegaiotasubpsiliperispomeni \
+greekOmegaiotasubpsilitonos greekOmegaiotasubpsilivaria greekOmegapsili greekOmegapsiliperispomeni greekOmegapsilitonos \
+greekOmegapsilivaria greekOmegatonos greekOmegavaria greekOmicron greekOmicrondasia \
+greekOmicrondasiatonos greekOmicrondasiavaria greekOmicronpsili greekOmicronpsilitonos greekOmicronpsilivaria \
+greekOmicrontonos greekOmicronvaria greekPhi greekPi greekPsi \
+greekRho greekRhodasia greekSigma greekSigmalunate greekTau \
+greekTheta greekUpsilon greekUpsilondasia greekUpsilondasiaperispomeni greekUpsilondasiatonos \
+greekUpsilondasiavaria greekUpsilondialytika greekUpsilonmacron greekUpsilontonos greekUpsilonvaria \
+greekUpsilonvrachy greekXi greekZeta greekalpha greekalphadasia \
+greekalphadasiaperispomeni greekalphadasiatonos greekalphadasiavaria greekalphaiotasub greekalphaiotasubdasia \
+greekalphaiotasubdasiaperispomeni greekalphaiotasubdasiatonos greekalphaiotasubdasiavaria greekalphaiotasubperispomeni greekalphaiotasubpsili \
+greekalphaiotasubpsiliperispomeni greekalphaiotasubpsilitonos greekalphaiotasubpsilivaria greekalphaiotasubtonos greekalphaiotasubvaria \
+greekalphamacron greekalphaoxia greekalphaperispomeni greekalphapsili greekalphapsiliperispomeni \
+greekalphapsilitonos greekalphapsilivaria greekalphatonos greekalphavaria greekalphavrachy \
+greekbeta greekbetaalt greekchi greekdasia greekdasiaperispomeni \
+greekdasiatonos greekdasiavaria greekdelta greekdialytikaperispomeni greekdialytikatonos \
+greekdialytikavaria greekdigamma greekepsilon greekepsilonalt greekepsilondasia \
+greekepsilondasiatonos greekepsilondasiavaria greekepsilonoxia greekepsilonpsili greekepsilonpsilitonos \
+greekepsilonpsilivaria greekepsilontonos greekepsilonvaria greeketa greeketadasia \
+greeketadasiaperispomeni greeketadasiatonos greeketadasiavaria greeketaiotasub greeketaiotasubdasia \
+greeketaiotasubdasiaperispomeni greeketaiotasubdasiatonos greeketaiotasubdasiavaria greeketaiotasubperispomeni greeketaiotasubpsili \
+greeketaiotasubpsiliperispomeni greeketaiotasubpsilitonos greeketaiotasubpsilivaria greeketaiotasubtonos greeketaiotasubvaria \
+greeketaoxia greeketaperispomeni greeketapsili greeketapsiliperispomeni greeketapsilitonos \
+greeketapsilivaria greeketatonos greeketavaria greekfinalsigma greekgamma \
+greekiota greekiotadasia greekiotadasiaperispomeni greekiotadasiatonos greekiotadasiavaria \
+greekiotadialytika greekiotadialytikaperispomeni greekiotadialytikatonos greekiotadialytikavaria greekiotamacron \
+greekiotaoxia greekiotaperispomeni greekiotapsili greekiotapsiliperispomeni greekiotapsilitonos \
+greekiotapsilivaria greekiotatonos greekiotavaria greekiotavrachy greekkappa \
+greekkoppa greeklambda greekmu greeknu greeknumerals \
+greeknumkoppa greekomega greekomegadasia greekomegadasiaperispomeni greekomegadasiatonos \
+greekomegadasiavaria greekomegaiotasub greekomegaiotasubdasia greekomegaiotasubdasiaperispomeni greekomegaiotasubdasiatonos \
+greekomegaiotasubdasiavaria greekomegaiotasubperispomeni greekomegaiotasubpsili greekomegaiotasubpsiliperispomeni greekomegaiotasubpsilitonos \
+greekomegaiotasubpsilivaria greekomegaiotasubtonos greekomegaiotasubvaria greekomegaoxia greekomegaperispomeni \
+greekomegapsili greekomegapsiliperispomeni greekomegapsilitonos greekomegapsilivaria greekomegatonos \
+greekomegavaria greekomicron greekomicrondasia greekomicrondasiatonos greekomicrondasiavaria \
+greekomicronoxia greekomicronpsili greekomicronpsilitonos greekomicronpsilivaria greekomicrontonos \
+greekomicronvaria greekoxia greekperispomeni greekphi greekphialt \
+greekpi greekpialt greekprosgegrammeni greekpsi greekpsili \
+greekpsiliperispomeni greekpsilitonos greekpsilivaria greekrho greekrhoalt \
+greekrhodasia greekrhopsili greeksampi greeksigma greeksigmalunate \
+greekstigma greektau greektheta greekthetaalt greektonos \
+greekupsilon greekupsilondasia greekupsilondasiaperispomeni greekupsilondasiatonos greekupsilondasiavaria \
+greekupsilondiaeresis greekupsilondialytikaperispomeni greekupsilondialytikatonos greekupsilondialytikavaria greekupsilonmacron \
+greekupsilonoxia greekupsilonperispomeni greekupsilonpsili greekupsilonpsiliperispomeni greekupsilonpsilitonos \
+greekupsilonpsilivaria greekupsilontonos greekupsilonvaria greekupsilonvrachy greekvaria \
+greekxi greekzeta grid groupedcommand gsetboxllx \
+gsetboxlly gstroke gt gtrapprox gtrdot \
+gtreqless gtreqqless gtrless gtrsim guilsingleleft \
+guilsingleright gujaratinumerals gurmurkhinumerals hairline hairspace \
+halflinestrut halfstrut halfwaybox handletokens handwritten \
+hangul hanzi hash hat hbar \
+hboxofvbox hboxreference hcaron hcircumflex hdofstring \
+headhbox headlanguage headnumber headnumbercontent headnumberdistance \
+headnumberwidth headreferenceattributes headsetupspacing headtext headtextcontent \
+headtextdistance headtexts headtextwidth headvbox headwidth \
+heartsuit hebrewAlef hebrewAyin hebrewBet hebrewDalet \
+hebrewGimel hebrewHe hebrewHet hebrewKaf hebrewKaffinal \
+hebrewLamed hebrewMem hebrewMemfinal hebrewNun hebrewNunfinal \
+hebrewPe hebrewPefinal hebrewQof hebrewResh hebrewSamekh \
+hebrewShin hebrewTav hebrewTet hebrewTsadi hebrewTsadifinal \
+hebrewVav hebrewYod hebrewZayin heightanddepthofstring heightofstring \
+heightspanningtext helptext hglue hiddenbar hiddencitation \
+hiddencite hideblocks high highlight highordinalstr \
+hilo himilo hl hookleftarrow hookrightarrow \
+horizontalgrowingbar horizontalpositionbar hpackbox hpackedbox hphantom \
+hpos hsizefraction hslash hsmash hsmashbox \
+hsmashed hspace hstroke htdpofstring htofstring \
+hyphen hyphenatedcoloredword hyphenatedfile hyphenatedfilename hyphenatedhbox \
+hyphenatedpar hyphenatedurl hyphenatedword iacute ibox \
+ibreve icaron icircumflex ideographichalffillspace ideographicspace \
+idiaeresis idotaccent idotbelow idoublegrave ifassignment \
+iff ifinobject ifinoutputstream ifparameters iftrialtypesetting \
+ignoreimplicitspaces ignoretagsinexport ignorevalue igrave ihook \
+iiiint iiiintop iiint iiintop iint \
+iintop iinvertedbreve ijligature imacron imaginaryi \
+imaginaryj imath immediatesavetwopassdata impliedby implies \
+imply in includemenu includeversioninfo increment \
+incrementcounter incrementedcounter incrementpagenumber incrementsubpagenumber incrementvalue \
+indentation index infofont infofontbold inframed \
+infty infull inheritparameter inhibitblank ininner \
+ininneredge ininnermargin initializeboxstack inleft inleftedge \
+inleftmargin inline inlinebuffer inlinedbox inlinemath \
+inlinemathematics inlinemessage inlineordisplaymath inlineprettyprintbuffer inlinerange \
+inmargin inmframed innerflushshapebox inother inouter \
+inouteredge inoutermargin input inputfilebarename inputfilename \
+inputfilerealsuffix inputfilesuffix inputgivenfile inright inrightedge \
+inrightmargin insertpages installactionhandler installactivecharacter installanddefineactivecharacter \
+installattributestack installautocommandhandler installautosetuphandler installbasicautosetuphandler installbasicparameterhandler \
+installbottomframerenderer installcommandhandler installcorenamespace installdefinehandler installdefinitionset \
+installdefinitionsetmember installdirectcommandhandler installdirectparameterhandler installdirectparametersethandler installdirectsetuphandler \
+installdirectstyleandcolorhandler installframedautocommandhandler installframedcommandhandler installglobalmacrostack installlanguage \
+installleftframerenderer installmacrostack installnamespace installoutputroutine installpagearrangement \
+installparameterhandler installparameterhashhandler installparametersethandler installparentinjector installrightframerenderer \
+installrootparameterhandler installsetuphandler installsetuponlycommandhandler installshipoutmethod installsimplecommandhandler \
+installsimpleframedcommandhandler installstyleandcolorhandler installswitchcommandhandler installswitchsetuphandler installtexdirective \
+installtextracker installtopframerenderer installunitsseparator installunitsspace installversioninfo \
+int intclockwise integerrounding integers interactionbar \
+interactionbuttons interactionmenu intercal intertext intop \
+invisibletimes invokepageheandler iogonek iota italic \
+italicbold italiccorrection italicface item items \
+itemtag itilde jcaron jcircumflex jmath \
+jobfilename jobfilesuffix kap kappa kcaron \
+kcommaaccent keepblocks keeplinestogether keepunwantedspaces kerncharacters \
+khook kkra koreancirclenumerals koreannumerals koreannumeralsc \
+koreannumeralsp koreanparentnumerals lVert labellanguage labeltext \
+labeltexts lacute lambda lambdabar land \
+langle language languageCharacters languagecharacters languagecharwidth \
+lastcounter lastcountervalue lastdigit lastlinewidth lastnaturalboxdp \
+lastnaturalboxht lastnaturalboxwd lastpredefinedsymbol lastrealpage lastrealpagenumber \
+lastsubcountervalue lastsubpage lastsubpagenumber lasttwodigits lastuserpage \
+lastuserpagenumber lateluacode latin layeredtext layerheight \
+layerwidth lazysavetaggedtwopassdata lazysavetwopassdata lbar lbox \
+lbrace lbracket lcaron lceil lcommaaccent \
+lcurl ldotmiddle ldotp ldots le \
+leadsto left leftaligned leftarrow leftarrowtail \
+leftarrowtriangle leftbottombox leftbox leftdasharrow leftguillemot \
+leftharpoondown leftharpoonup lefthbox leftheadtext leftlabeltext \
+leftleftarrows leftline leftmathlabeltext leftorrighthbox leftorrightvbox \
+leftorrightvtop leftrightarrow leftrightarrows leftrightarrowtriangle leftrightharpoons \
+leftrightsquigarrow leftskipadaption leftsquigarrow leftsubguillemot leftthreetimes \
+lefttopbox lefttoright lefttorighthbox lefttorightvbox lefttorightvtop \
+leftwavearrow leftwhitearrow leq leqq leqslant \
+lessapprox lessdot lesseqgtr lesseqqgtr lessgtr \
+lesssim letbeundefined letcatcodecommand letcscsname letcsnamecs \
+letcsnamecsname letdummyparameter letempty letgvalue letgvalueempty \
+letgvalurelax letterampersand letterat letterbackslash letterbar \
+letterbgroup letterclosebrace lettercolon letterdollar letterdoublequote \
+letteregroup letterescape letterexclamationmark letterhash letterhat \
+letterleftbrace letterleftbracket letterleftparenthesis letterless lettermore \
+letteropenbrace letterpercent letterquestionmark letterrightbrace letterrightbracket \
+letterrightparenthesis lettersinglequote letterslash letterspacing lettertilde \
+letterunderscore letvalue letvalueempty letvaluerelax lfence \
+lfloor lgroup lhbox lhooknwarrow lhooksearrow \
+limitatefirstline limitatelines limitatetext line linebox \
+linefeed linenote linespanningtext linethickness linterval \
+listcitation listcite listlength listnamespaces ljligature \
+ll llangle llap llbracket llcorner \
+lll llless lmoustache lnapprox lneq \
+lneqq lnot lnsim loadanyfile loadanyfileonce \
+loadbtxdefinitionfile loadbtxreplacementfile loadcldfile loadcldfileonce loadfontgoodies \
+loadluafile loadluafileonce loadspellchecklist loadtexfile loadtexfileonce \
+loadtypescriptfile localframed localframedwithsettings localhsize localpopbox \
+localpopmacro localpushbox localpushmacro localundefine locatedfilepath \
+locatefilepath locfilename logo lohi lointerval \
+lomihi longleftarrow longleftrightarrow longmapsfrom longmapsto \
+longrightarrow longrightsquigarrow looparrowleft looparrowright lor \
+low lowerbox lowercased lowercasestring lowerleftdoubleninequote \
+lowerleftsingleninequote lowerrightdoubleninequote lowerrightsingleninequote lozenge lparent \
+lrcorner lrointerval lrtbbox lstroke lt \
+ltimes ltop ltrhbox ltrvbox ltrvtop \
+luaTeX luacode luaconditional luaenvironment luaexpanded \
+luaexpr luafunction luajitTeX luamajorversion luametaTeX \
+luaminorversion luaparameterset luasetup luaversion lvert \
+m mLeftarrow mLeftrightarrow mRightarrow mainlanguage \
+makecharacteractive makerawcommalist makestrutofbox maltese mapfontsize \
+mapsdown mapsfrom mapsto mapsup margindata \
+margintext markcontent markedpages marking markinjector \
+markpage mat math mathampersand mathbf \
+mathbi mathblackboard mathbs mathdefault mathdollar \
+mathdouble mathematics mathfraktur mathfunction mathhash \
+mathhyphen mathit mathitalic mathlabellanguage mathlabeltext \
+mathlabeltexts mathop mathover mathpercent mathrm \
+mathscript mathsl mathss mathtext mathtextbf \
+mathtextbi mathtextbs mathtextit mathtextsl mathtexttf \
+mathtf mathtriplet mathtt mathunder mathupright \
+mathword mathwordbf mathwordbi mathwordbs mathwordit \
+mathwordsl mathwordtf maxaligned mbox mcframed \
+measure measured measuredangle measuredeq medskip \
+medspace menubutton mequal message mfence \
+mframed mfunction mfunctionlabeltext mhbox mho \
+mhookleftarrow mhookrightarrow mid midaligned middle \
+middlealigned middlebox midhbox midsubsentence minimalhbox \
+minus minuscolon mirror mixedcaps mkvibuffer \
+mleftarrow mleftharpoondown mleftharpoonup mleftrightarrow mleftrightharpoons \
+mmapsto models moduleparameter molecule mono \
+monobold mononormal month monthlong monthshort \
+mp mprandomnumber mrel mrightarrow mrightharpoondown \
+mrightharpoonup mrightleftharpoons mrightoverleftarrow mtext mtriplerel \
+mtwoheadleftarrow mtwoheadrightarrow mu multimap nHdownarrow \
+nHuparrow nLeftarrow nLeftrightarrow nRightarrow nVDash \
+nVdash nVleftarrow nVleftrightarrow nVrightarrow nabla \
+nacute namedheadnumber namedstructureheadlocation namedstructureuservariable namedstructurevariable \
+namedtaggedlabeltexts napostrophe napprox napproxEq narrownobreakspace \
+nasymp natural naturalhbox naturalhpack naturalnumbers \
+naturaltpack naturalvbox naturalvcenter naturalvpack naturalvtop \
+naturalwd ncaron ncommaaccent ncong ncurl \
+ndivides ne nearrow neg negatecolorbox \
+negated negativesign negemspace negenspace negthinspace \
+neng neq nequiv neswarrow newattribute \
+newcatcodetable newcounter newevery newfrenchspacing newmode \
+newsignal newsystemmode nexists nextbox nextboxdp \
+nextboxht nextboxhtdp nextboxwd nextcounter nextcountervalue \
+nextdepth nextparagraphs nextrealpage nextrealpagenumber nextsubcountervalue \
+nextsubpage nextsubpagenumber nextuserpage nextuserpagenumber ngeq \
+ngrave ngtr ngtrless ngtrsim ni \
+nihongo nin njligature nleftarrow nleftrightarrow \
+nleq nless nlessgtr nlesssim nmid \
+nni nobar nobreakspace nocap nocharacteralign \
+nocitation nocite nodetostring noffigurepages noflines \
+noflocalfloats noheaderandfooterlines noheightstrut noindentation noitem \
+nonfrenchspacing nonmathematics normal normalboldface normalframedwithsettings \
+normalitalicface normalizebodyfontsize normalizedfontsize normalizefontdepth normalizefontheight \
+normalizefontline normalizefontwidth normalizetextdepth normalizetextheight normalizetextline \
+normalizetextwidth normalslantedface normaltypeface nospace not \
+note notesymbol notin notopandbottomlines notragged \
+nowns nparallel nprec npreccurlyeq nrightarrow \
+nsim nsimeq nsqsubseteq nsqsupseteq nsubset \
+nsubseteq nsucc nsucccurlyeq nsupset nsupseteq \
+ntilde ntimes ntriangleleft ntrianglelefteq ntriangleright \
+ntrianglerighteq nu numberofpoints numbers nvDash \
+nvdash nvleftarrow nvleftrightarrow nvrightarrow nwarrow \
+nwsearrow oacute obeydepth objectdepth objectheight \
+objectmargin objectwidth obox obreve ocaron \
+ocircumflex ocircumflexacute ocircumflexdotbelow ocircumflexgrave ocircumflexhook \
+ocircumflextilde odiaeresis odiaeresismacron odot odotaccent \
+odotaccentmacron odotbelow odoublegrave oeligature offset \
+offsetbox ograve ohm ohook ohorn \
+ohornacute ohorndotbelow ohorngrave ohornhook ohorntilde \
+ohungarumlaut oiiint oiint oint ointclockwise \
+ointctrclockwise oinvertedbreve omacron omega omicron \
+ominus onedigitrounding oneeighth onefifth onehalf \
+onequarter onesixth onesuperior onethird oogonek \
+oogonekmacron operatorlanguage operatortext oplus ordfeminine \
+ordinaldaynumber ordinalstr ordmasculine ornamenttext oslash \
+ostroke ostrokeacute otilde otildemacron otimes \
+outputfilename outputstreambox outputstreamcopy outputstreamunvbox outputstreamunvcopy \
+over overbar overbars overbarunderbar overbrace \
+overbraceunderbrace overbracket overbracketunderbracket overlaybutton overlaycolor \
+overlaydepth overlayfigure overlayheight overlayimage overlaylinecolor \
+overlaylinewidth overlayoffset overlayrollbutton overlaywidth overleftarrow \
+overloaderror overparent overparentunderparent overrightarrow overset \
+overstrike overstrikes owns page pagearea \
+pagebreak pagefigure pageinjection pagenumber pagereference \
+pagestaterealpage pagestaterealpageorder paletsize paragraphmark parallel \
+part partial pdfTeX pdfactualtext pdfbackendactualtext \
+pdfbackendcurrentresources pdfbackendsetcatalog pdfbackendsetcolorspace pdfbackendsetextgstate pdfbackendsetinfo \
+pdfbackendsetname pdfbackendsetpageattribute pdfbackendsetpageresource pdfbackendsetpagesattribute pdfbackendsetpattern \
+pdfbackendsetshade pdfcolor pdfeTeX percent percentdimen \
+periodcentered periods permitcaretescape permitcircumflexescape permitspacesbetweengroups \
+perp persiandecimals persiandecimalseparator persiannumerals persianthousandsseparator \
+perthousand phantom phantombox phi phook \
+pi pickupgroupedcommand pitchfork placeattachments placebookmarks \
+placebtxrendering placechemical placecitation placecombinedlist placecomments \
+placecontent placecurrentformulanumber placedbox placefigure placefloat \
+placefloatwithsetups placefootnotes placeformula placeframed placegraphic \
+placeheadnumber placeheadtext placehelp placeindex placeinitial \
+placeintermezzo placelayer placelayeredtext placelegend placelist \
+placelistofabbreviations placelistofchemicals placelistoffigures placelistofgraphics placelistofintermezzi \
+placelistoflogos placelistofpublications placelistofsorts placelistofsynonyms placelistoftables \
+placelocalfootnotes placelocalnotes placement placenamedfloat placenamedformula \
+placenotes placeongrid placeontopofeachother placepagenumber placepairedbox \
+placeparallel placerawheaddata placerawheadnumber placerawheadtext placerawlist \
+placeregister placerenderingwindow placesidebyside placesubformula placetable \
+pm popattribute popmacro popmode popsystemmode \
+position positionoverlay positionregionoverlay positivesign postponenotes \
+prec precapprox preccurlyeq preceq preceqq \
+precnapprox precneq precneqq precnsim precsim \
+predefinedfont predefinefont predefinesymbol prefixedpagenumber prefixlanguage \
+prefixtext prependetoks prependgvalue prependtocommalist prependtoks \
+prependtoksonce prependvalue prerollblank presetbtxlabeltext presetdocument \
+presetfieldsymbols presetheadtext presetlabeltext presetmathlabeltext presetoperatortext \
+presetprefixtext presetsuffixtext presettaglabeltext presetunittext pretocommalist \
+prettyprintbuffer prevcounter prevcountervalue preventmode prevrealpage \
+prevrealpagenumber prevsubcountervalue prevsubpage prevsubpagenumber prevuserpage \
+prevuserpagenumber prime primes procent processMPbuffer \
+processMPfigurefile processaction processallactionsinset processassignlist processassignmentcommand \
+processassignmentlist processbetween processblocks processbodyfontenvironmentlist processcolorcomponents \
+processcommacommand processcommalist processcommalistwithparameters processcontent processfile \
+processfilemany processfilenone processfileonce processfirstactioninset processisolatedchars \
+processisolatedwords processlinetablebuffer processlinetablefile processlist processmonth \
+processranges processseparatedlist processtexbuffer processtokens processuntil \
+processxtablebuffer processyear prod product profiledbox \
+profilegivenbox program project propto pseudoMixedCapped \
+pseudoSmallCapped pseudoSmallcapped pseudosmallcapped psi punctuationspace \
+purenumber pushattribute pushbutton pushmacro pushmode \
+pushoutputstream pushsystemmode putboxincache putnextboxincache qquad \
+quad quadrupleprime quads quarterstrut questiondown \
+questionedeq quitcommalist quitprevcommalist quittypescriptscanning quotation \
+quote quotedbl quotedblbase quotedblleft quotedblright \
+quoteleft quoteright quotesingle quotesinglebase rVert \
+racute raggedbottom raggedcenter raggedleft raggedright \
+raggedwidecenter raisebox randomizetext randomnumber rangle \
+rationals rawcounter rawcountervalue rawdate rawdoifelseinset \
+rawdoifinset rawdoifinsetelse rawgetparameters rawprocessaction rawprocesscommacommand \
+rawprocesscommalist rawstructurelistuservariable rawsubcountervalue rbox rbrace \
+rbracket rcaron rceil rcommaaccent rdoublegrave \
+readfile readfixfile readjobfile readlocfile readsetfile \
+readsysfile readtexfile readxmlfile realSmallCapped realSmallcapped \
+realpagenumber reals realsmallcapped recursedepth recurselevel \
+recursestring redoconvertfont ref reference referenceprefix \
+referring registerattachment registerctxluafile registered registerexternalfigure \
+registerfontclass registerhyphenationexception registerhyphenationpattern registermenubuttons registersort \
+registersynonym registerunit regular relatemarking relateparameterhandlers \
+relaxvalueifundefined relbar remainingcharacters remark removebottomthings \
+removedepth removefromcommalist removelastskip removelastspace removemarkedcontent \
+removepunctuation removesubstring removetoks removeunwantedspaces repeathead \
+replacefeature replaceincommalist replaceword rescan rescanwithsetup \
+resetMPdrawing resetMPenvironment resetMPinstance resetallattributes resetandaddfeature \
+resetbar resetboxesincache resetbreakpoints resetbuffer resetcharacteralign \
+resetcharacterkerning resetcharacterspacing resetcharacterstripping resetcollector resetcounter \
+resetdigitsmanipulation resetdirection resetfeature resetflag resetfontcolorsheme \
+resetfontfallback resetfontsolution resethyphenationfeatures resetinjector resetinteractionmenu \
+resetitaliccorrection resetlayer resetlocalfloats resetmarker resetmarking \
+resetmode resetpagenumber resetparallel resetpath resetpenalties \
+resetperiodkerning resetprofile resetrecurselevel resetreference resetreplacement \
+resetscript resetsetups resetshownsynonyms resetsubpagenumber resetsymbolset \
+resetsystemmode resettimer resettokenlist resettrackers resettrialtypesetting \
+resetusedsortings resetusedsynonyms resetuserpagenumber resetvalue resetvisualizers \
+reshapebox resolvedglyphdirect resolvedglyphstyled restartcounter restorebox \
+restorecatcodes restorecounter restorecurrentattributes restoreendofline restoreglobalbodyfont \
+restriction reusableMPgraphic reuseMPgraphic reuserandomseed reverseddoubleprime \
+reversedprime reversedtripleprime reversehbox reversehpack reversetpack \
+reversevbox reversevpack reversevtop revivefeature rfence \
+rfloor rgroup rhbox rho rhooknearrow \
+rhookswarrow right rightaligned rightangle rightarrow \
+rightarrowbar rightarrowtail rightarrowtriangle rightbottombox rightbox \
+rightdasharrow rightguillemot rightharpoondown rightharpoonup righthbox \
+rightheadtext rightlabeltext rightleftarrows rightleftharpoons rightline \
+rightmathlabeltext rightorleftpageaction rightpageorder rightrightarrows rightskipadaption \
+rightsquigarrow rightsubguillemot rightthreearrows rightthreetimes righttoleft \
+righttolefthbox righttoleftvbox righttoleftvtop righttopbox rightwavearrow \
+rightwhitearrow ring rinterval rinvertedbreve risingdotseq \
+rlap rlointerval rmoustache rneq robustaddtocommalist \
+robustdoifelseinset robustdoifinsetelse robustpretocommalist rointerval rollbutton \
+roman romanC romanD romanI romanII \
+romanIII romanIV romanIX romanL romanM \
+romanV romanVI romanVII romanVIII romanX \
+romanXI romanXII romanc romand romani \
+romanii romaniii romaniv romanix romanl \
+romanm romannumerals romanv romanvi romanvii \
+romanviii romanx romanxi romanxii rootradical \
+rotate rparent rrangle rrbracket rrointerval \
+rtimes rtlhbox rtlvbox rtlvtop rtop \
+ruby ruledhbox ruledhpack ruledmbox ruledtopv \
+ruledtpack ruledvbox ruledvpack ruledvtop runMPbuffer \
+runninghbox rvert sacute safechar samplefile \
+sans sansbold sansnormal sansserif savebox \
+savebtxdataset savebuffer savecounter savecurrentattributes savenormalmeaning \
+savetaggedtwopassdata savetwopassdata sbox scale scaron \
+scedilla schwa schwahook scircumflex scommaaccent \
+screen searrow secondoffivearguments secondoffourarguments secondofsixarguments \
+secondofthreearguments secondofthreeunexpanded secondoftwoarguments secondoftwounexpanded section \
+sectionmark seeindex select selectblocks serializecommalist \
+serializedcommalist serif serifbold serifnormal setJSpreamble \
+setMPlayer setMPpositiongraphic setMPpositiongraphicrange setMPtext setMPvariable \
+setMPvariables setautopagestaterealpageno setbar setbigbodyfont setboxllx \
+setboxlly setbreakpoints setcapstrut setcatcodetable setcharacteralign \
+setcharacteraligndetail setcharactercasing setcharactercleaning setcharacterkerning setcharacterspacing \
+setcharacterstripping setcharstrut setcollector setcolormodell setcounter \
+setcounterown setcurrentfontclass setdataset setdefaultpenalties setdigitsmanipulation \
+setdirection setdocumentargument setdocumentargumentdefault setdocumentfilename setdummyparameter \
+setelementexporttag setemeasure setevalue setevariable setevariables \
+setfirstline setfirstpasscharacteralign setflag setfont setfontcolorsheme \
+setfontfeature setfontsolution setfontstrut setglobalscript setgmeasure \
+setgvalue setgvariable setgvariables sethboxregister sethyphenatedurlafter \
+sethyphenatedurlbefore sethyphenatedurlnormal sethyphenationfeatures setinitial setinjector \
+setinteraction setinterfacecommand setinterfaceconstant setinterfaceelement setinterfacemessage \
+setinterfacevariable setinternalrendering setitaliccorrection setlayer setlayerframed \
+setlayertext setlinefiller setlocalhsize setlocalscript setmainbodyfont \
+setmainparbuilder setmarker setmarking setmathstyle setmeasure \
+setmessagetext setminus setmode setnostrut setnote \
+setnotetext setobject setoldstyle setpagereference setpagestate \
+setpagestaterealpageno setpenalties setpercentdimen setperiodkerning setposition \
+setpositionbox setpositiondata setpositiondataplus setpositiononly setpositionplus \
+setpositionstrut setprofile setrandomseed setreference setreferencedobject \
+setregisterentry setreplacement setrigidcolumnbalance setrigidcolumnhsize setscript \
+setsecondpasscharacteralign setsectionblock setsimplecolumnshsize setsmallbodyfont setsmallcaps \
+setstackbox setstructurepageregister setstrut setsuperiors setsystemmode \
+settabular settaggedmetadata settestcrlf settextcontent settightobject \
+settightreferencedobject settightstrut settightunreferencedobject settokenlist settrialtypesetting \
+setuevalue setugvalue setunreferencedobject setup setupMPgraphics \
+setupMPinstance setupMPpage setupMPvariables setupTABLE setupTEXpage \
+setupalign setupalternativestyles setuparranging setupattachment setupattachments \
+setupbackend setupbackground setupbackgrounds setupbar setupbars \
+setupblackrules setupblank setupbleeding setupblock setupbodyfont \
+setupbookmark setupbottom setupbottomtexts setupbtx setupbtxdataset \
+setupbtxlabeltext setupbtxlist setupbtxregister setupbtxrendering setupbuffer \
+setupbutton setupcapitals setupcaption setupcaptions setupcharacteralign \
+setupcharacterkerning setupcharacterspacing setupchemical setupchemicalframed setupclipping \
+setupcollector setupcolor setupcolors setupcolumns setupcolumnset \
+setupcolumnsetarea setupcolumnsetareatext setupcolumnsetlines setupcolumnsetspan setupcolumnsetstart \
+setupcombination setupcombinedlist setupcomment setupcontent setupcounter \
+setupdataset setupdelimitedtext setupdescription setupdirections setupdocument \
+setupeffect setupenumeration setupenumerations setupenv setupexport \
+setupexternalfigure setupexternalsoundtracks setupfacingfloat setupfield setupfieldbody \
+setupfieldcategory setupfieldcontentframed setupfieldlabelframed setupfields setupfieldtotalframed \
+setupfiller setupfillinlines setupfillinrules setupfirstline setupfittingpage \
+setupfloat setupfloatframed setupfloats setupfloatsplitting setupfontexpansion \
+setupfontprotrusion setupfonts setupfontsolution setupfooter setupfootertexts \
+setupfootnotes setupforms setupformula setupformulae setupformulaframed \
+setupframed setupframedcontent setupframedtable setupframedtablecolumn setupframedtablerow \
+setupframedtext setupframedtexts setupglobalreferenceprefix setuphead setupheadalternative \
+setupheader setupheadertexts setupheadnumber setupheads setupheadtext \
+setuphelp setuphigh setuphighlight setuphyphenation setuphyphenmark \
+setupindentedtext setupindenting setupindex setupinitial setupinsertion \
+setupinteraction setupinteractionbar setupinteractionmenu setupinteractionscreen setupinterlinespace \
+setupitaliccorrection setupitemgroup setupitemizations setupitemize setupitems \
+setuplabel setuplabeltext setuplanguage setuplayer setuplayeredtext \
+setuplayout setuplayouttext setuplegend setuplinefiller setuplinefillers \
+setuplinenote setuplinenumbering setuplines setuplinetable setuplinewidth \
+setuplist setuplistalternative setuplistextra setuplocalfloats setuplocalinterlinespace \
+setuplow setuplowhigh setuplowmidhigh setupmakeup setupmarginblock \
+setupmargindata setupmarginframed setupmarginrule setupmarginrules setupmarking \
+setupmathalignment setupmathcases setupmathematics setupmathfence setupmathfraction \
+setupmathfractions setupmathframed setupmathlabeltext setupmathmatrix setupmathornament \
+setupmathradical setupmathstackers setupmathstyle setupmixedcolumns setupmodule \
+setupnarrower setupnotation setupnotations setupnote setupnotes \
+setupoffset setupoffsetbox setupoperatortext setupoppositeplacing setupoutputroutine \
+setuppagechecker setuppagecolumns setuppagecomment setuppageinjection setuppageinjectionalternative \
+setuppagenumber setuppagenumbering setuppageshift setuppagestate setuppagetransitions \
+setuppairedbox setuppalet setuppaper setuppapersize setupparagraph \
+setupparagraphintro setupparagraphnumbering setupparagraphs setupparallel setupperiodkerning \
+setupperiods setupplacement setuppositionbar setuppositioning setupprefixtext \
+setupprocessor setupprofile setupprograms setupquotation setupquote \
+setuprealpagenumber setupreferenceformat setupreferenceprefix setupreferencestructureprefix setupreferencing \
+setupregister setupregisters setuprenderingwindow setuprotate setupruby \
+setups setupscale setupscript setupscripts setupsectionblock \
+setupselector setupshift setupsidebar setupsorting setupspacing \
+setupspellchecking setupstartstop setupstretched setupstruts setupstyle \
+setupsubformula setupsubformulas setupsubpagenumber setupsuffixtext setupsymbols \
+setupsymbolset setupsynctex setupsynonyms setuptables setuptabulate \
+setuptabulation setuptagging setuptaglabeltext setuptext setuptextbackground \
+setuptextflow setuptextnote setuptextrules setuptexttexts setupthinrules \
+setuptolerance setuptooltip setuptop setuptoptexts setuptype \
+setuptyping setupunit setupunittext setupurl setupuserdata \
+setupuserdataalternative setupuserpagenumber setupversion setupviewerlayer setupvspacing \
+setupwhitespace setupwithargument setupwithargumentswapped setupxml setupxtable \
+setuvalue setuxvalue setvalue setvariable setvariables \
+setvboxregister setvisualizerfont setvtopregister setwidthof setxmeasure \
+setxvalue setxvariable setxvariables seveneighths sfrac \
+shapedhbox sharp shiftbox shiftdown shiftup \
+showallmakeup showattributes showbodyfont showbodyfontenvironment showboxes \
+showbtxdatasetauthors showbtxdatasetcompleteness showbtxdatasetfields showbtxfields showbtxhashedauthors \
+showbtxtables showchardata showcharratio showcolor showcolorbar \
+showcolorcomponents showcolorgroup showcolorset showcolorstruts showcounter \
+showdirectives showdirsinmargin showedebuginfo showexperiments showfont \
+showfontdata showfontexpansion showfontitalics showfontkerns showfontparameters \
+showfontstrip showfontstyle showframe showglyphdata showglyphs \
+showgrid showgridsnapping showhelp showhyphenationtrace showhyphens \
+showinjector showjustification showkerning showlayout showlayoutcomponents \
+showligature showligatures showlogcategories showmakeup showmargins \
+showmessage showminimalbaseline shownextbox showotfcomposition showpalet \
+showparentchain showprint showsetups showsetupsdefinition showstruts \
+showsymbolset showtimer showtokens showtrackers showvalue \
+showvariable showwarning sigma signalrightpage sim \
+simeq simplealignedbox simplealignedboxplus simplealignedspreadbox simplegroupedcommand \
+simplereversealignedbox simplereversealignedboxplus singalcharacteralign singlebond singleverticalbar \
+sixperemspace sixthofsixarguments slanted slantedbold slantedface \
+slash slicepages slong slovenianNumerals sloveniannumerals \
+small smallbodyfont smallbold smallbolditalic smallboldslanted \
+smallcappedcharacters smallcappedromannumerals smallcaps smaller smallitalicbold \
smallnormal smallskip smallslanted smallslantedbold smalltype \
smash smashbox smashboxed smashedhbox smashedvbox \
smile snaptogrid softhyphen solidus someheadnumber \
@@ -957,22 +963,22 @@ splitoffbase splitofffull splitoffkind splitoffname splitoffpath \
splitoffroot splitofftokens splitofftype splitstring spreadhbox \
sqcap sqcup sqrt sqsubset sqsubseteq \
sqsubsetneq sqsupset sqsupseteq sqsupsetneq square \
-squaredots ssharp stackrel star stareq \
-startJScode startJSpreamble startLUA startMP startMPclip \
-startMPcode startMPdefinitions startMPdrawing startMPenvironment startMPextensions \
-startMPinclusions startMPinitializations startMPpage startMPpositiongraphic startMPpositionmethod \
-startMPrun startPARSEDXML startTABLE startTABLEbody startTABLEfoot \
-startTABLEhead startTABLEnext startTC startTD startTDs \
-startTEX startTEXpage startTH startTN startTR \
-startTRs startTX startTY startXML startalign \
-startalignment startallmodes startappendices startarrangedpages startaside \
-startattachment startbackground startbackmatter startbar startbbordermatrix \
-startbitmapimage startblockquote startbodymatter startbordermatrix startboxedcolumns \
-startbtxlabeltext startbtxrenderingdefinitions startbuffer startcases startcatcodetable \
-startcenteraligned startchapter startcharacteralign startcheckedfences startchemical \
-startchemicaltext startcollect startcollecting startcolor startcolorintent \
-startcoloronly startcolorset startcolumns startcolumnset startcolumnsetspan \
-startcolumnspan startcombination startcomment startcomponent startcontextcode \
+squaredots ssharp stackrel stackscripts star \
+stareq startJScode startJSpreamble startLUA startMP \
+startMPclip startMPcode startMPdefinitions startMPdrawing startMPenvironment \
+startMPextensions startMPinclusions startMPinitializations startMPpage startMPpositiongraphic \
+startMPpositionmethod startMPrun startPARSEDXML startTABLE startTABLEbody \
+startTABLEfoot startTABLEhead startTABLEnext startTC startTD \
+startTDs startTEX startTEXpage startTH startTN \
+startTR startTRs startTX startTY startXML \
+startalign startalignment startallmodes startappendices startarrangedpages \
+startaside startattachment startbackground startbackmatter startbar \
+startbbordermatrix startbitmapimage startblockquote startbodymatter startbordermatrix \
+startboxedcolumns startbtxlabeltext startbtxrenderingdefinitions startbuffer startcases \
+startcatcodetable startcenteraligned startchapter startcharacteralign startcheckedfences \
+startchemical startchemicaltext startcollect startcollecting startcolor \
+startcolorintent startcoloronly startcolorset startcolumns startcolumnset \
+startcolumnsetspan startcombination startcomment startcomponent startcontextcode \
startcontextdefinitioncode startctxfunction startctxfunctiondefinition startcurrentcolor startcurrentlistentrywrapper \
startdelimited startdelimitedtext startdisplaymath startdmath startdocument \
starteffect startelement startembeddedxtable startendnote startendofline \
@@ -1042,156 +1048,156 @@ stopblockquote stopbodymatter stopbordermatrix stopboxedcolumns stopbtxlabeltext
stopbtxrenderingdefinitions stopbuffer stopcases stopcatcodetable stopcenteraligned \
stopchapter stopcharacteralign stopcheckedfences stopchemical stopchemicaltext \
stopcollect stopcollecting stopcolor stopcolorintent stopcoloronly \
-stopcolorset stopcolumns stopcolumnset stopcolumnsetspan stopcolumnspan \
-stopcombination stopcomment stopcomponent stopcontextcode stopcontextdefinitioncode \
-stopctxfunction stopctxfunctiondefinition stopcurrentcolor stopcurrentlistentrywrapper stopdelimited \
-stopdelimitedtext stopdisplaymath stopdmath stopdocument stopeffect \
-stopelement stopembeddedxtable stopendnote stopendofline stopenvironment \
-stopexceptions stopexpanded stopexpandedcollect stopextendedcatcodetable stopexternalfigurecollection \
-stopfacingfloat stopfact stopfigure stopfiguretext stopfittingpage \
-stopfixed stopfloatcombination stopfont stopfontclass stopfontsolution \
-stopfootnote stopformula stopformulas stopframed stopframedcell \
-stopframedcontent stopframedrow stopframedtable stopframedtext stopfrontmatter \
-stopgoto stopgraphictext stopgridsnapping stophanging stophbox \
-stophboxestohbox stophboxregister stophead stopheadtext stophelptext \
-stophiding stophighlight stophyphenation stopimath stopindentation \
-stopindentedtext stopinteraction stopinteractionmenu stopinterface stopintermezzotext \
-stopintertext stopitem stopitemgroup stopitemgroupcolumns stopitemize \
-stopknockout stoplabeltext stoplanguage stoplayout stopleftaligned \
-stoplegend stopline stoplinealignment stoplinecorrection stoplinefiller \
-stoplinenote stoplinenumbering stoplines stoplinetable stoplinetablebody \
-stoplinetablecell stoplinetablehead stoplocalfootnotes stoplocalheadsetup stoplocallinecorrection \
-stoplocalnotes stoplocalsetups stoplua stopluacode stopluaparameterset \
-stopluasetups stopmakeup stopmarginblock stopmarginrule stopmarkedcontent \
-stopmarkpages stopmathalignment stopmathcases stopmathlabeltext stopmathmatrix \
-stopmathmode stopmathstyle stopmatrices stopmatrix stopmaxaligned \
-stopmdformula stopmidaligned stopmiddlealigned stopmiddlemakeup stopmixedcolumns \
-stopmode stopmodeset stopmodule stopmoduletestsection stopmpformula \
-stopnamedsection stopnamedsubformulas stopnarrow stopnarrower stopnegative \
-stopnicelyfilledbox stopnointerference stopnotallmodes stopnotext stopnotmode \
-stopoperatortext stopopposite stopoutputstream stopoverlay stopoverprint \
-stoppacked stoppagecolumns stoppagecomment stoppagefigure stoppagelayout \
-stoppagemakeup stoppar stopparagraph stopparagraphs stopparagraphscell \
-stopparbuilder stoppart stoppath stopplacechemical stopplacefigure \
-stopplacefloat stopplaceformula stopplacegraphic stopplaceintermezzo stopplacelegend \
-stopplacepairedbox stopplacetable stoppositioning stoppositionoverlay stoppositive \
-stoppostponing stoppostponingnotes stopprefixtext stopprocessassignmentcommand stopprocessassignmentlist \
-stopprocesscommacommand stopprocesscommalist stopproduct stopproject stopprotect \
-stopprotectedcolors stoppublication stoppunctuation stopquotation stopquote \
-stoprandomized stoprandomseed stoprawsetups stopreadingfile stopreferenceprefix \
-stopregime stopregister stopreusableMPgraphic stoprightaligned stopruby \
-stopscript stopsdformula stopsection stopsectionblock stopsectionblockenvironment \
-stopsectionlevel stopsetups stopshapebox stopshift stopsidebar \
-stopsimplecolumns stopspecialitem stopspeech stopspformula stopsplitformula \
-stopsplittext stopspread stopstandardmakeup stopstaticMPfigure stopstaticMPgraphic \
-stopstrictinspectnextcharacter stopstructurepageregister stopstrut stopstyle stopsubformulas \
-stopsubject stopsubjectlevel stopsubsection stopsubsentence stopsubstack \
-stopsubsubject stopsubsubsection stopsubsubsubject stopsubsubsubsection stopsubsubsubsubject \
-stopsubsubsubsubsection stopsubsubsubsubsubject stopsuffixtext stopsymbolset stoptable \
-stoptablehead stoptables stoptabletail stoptabletext stoptabulate \
-stoptabulatehead stoptabulatetail stoptagged stoptaglabeltext stoptexcode \
-stoptexdefinition stoptext stoptextbackground stoptextbackgroundmanual stoptextcolor \
-stoptextcolorintent stoptextflow stoptextmakeup stoptextrule stoptitle \
-stoptokenlist stoptokens stoptransparent stoptypescript stoptypescriptcollection \
-stoptyping stopuniqueMPgraphic stopuniqueMPpagegraphic stopunittext stopunpacked \
-stopusableMPgraphic stopuseMPgraphic stopusemathstyleparameter stopuserdata stopusingbtxspecification \
-stopvbox stopvboxregister stopvboxtohbox stopvboxtohboxseparator stopviewerlayer \
-stopvtop stopvtopregister stopxcell stopxcellgroup stopxcolumn \
-stopxgroup stopxmldisplayverbatim stopxmlinlineverbatim stopxmlraw stopxmlsetups \
-stopxrow stopxrowgroup stopxtable stopxtablebody stopxtablefoot \
-stopxtablehead stopxtablenext stretched strictdoifelsenextoptional strictdoifnextoptionalelse \
-stripcharacter strippedcsname stripspaces structurelistuservariable structurenumber \
-structuretitle structureuservariable structurevariable strut strutdp \
-strutgap strutht struthtdp struttedbox strutwd \
-style styleinstance subject subpagenumber subsection \
-subsentence subset subseteq subseteqq subsetneq \
-subsetneqq substituteincommalist subsubject subsubsection subsubsubject \
-subsubsubsection subsubsubsubject subsubsubsubsection subsubsubsubsubject subtractfeature \
-succ succapprox succcurlyeq succeq succeqq \
-succnapprox succneq succneqq succnsim succsim \
-suffixlanguage suffixtext sum supset supseteq \
-supseteqq supsetneq supsetneqq surd surdradical \
-swapcounts swapdimens swapface swapmacros swaptypeface \
-swarrow switchstyleonly switchtobodyfont switchtocolor switchtointerlinespace \
-symbol symbolreference synchronizeblank synchronizeindenting synchronizemarking \
-synchronizeoutputstreams synchronizestrut synchronizewhitespace synctexblockfilename synctexresetfilename \
-synctexsetfilename systemlog systemlogfirst systemloglast systemsetups \
-tLeftarrow tLeftrightarrow tRightarrow tabulateautoline tabulateautorule \
-tabulateline tabulaterule taggedctxcommand taggedlabeltexts taglabellanguage \
-taglabeltext tau tbinom tbox tcaron \
-tcedilla tcommaaccent tcurl tequal test \
-testandsplitstring testcolumn testfeature testfeatureonce testpage \
-testpageonly testpagesync testtokens tex texdefinition \
-texsetup textAngstrom textacute textampersand textasciicircum \
-textasciitilde textat textbackslash textbar textbottomcomma \
-textbottomdot textbraceleft textbraceright textbreve textbrokenbar \
-textbullet textcaron textcedilla textcelsius textcent \
-textcircledP textcircumflex textcitation textcite textcomma \
-textcontrolspace textcurrency textdag textddag textdegree \
-textdiaeresis textdiv textdollar textdong textdotaccent \
-textellipsis texteuro textflowcollector textfraction textgrave \
-texthash texthorizontalbar texthungarumlaut texthyphen textkelvin \
-textlognot textmacron textmath textmho textminus \
-textmu textmultiply textnumero textogonek textohm \
-textormathchar textormathchars textounce textpercent textperiod \
-textplus textpm textreference textring textrule \
-textslash textsterling texttilde textunderscore textvisiblespace \
-textyen thai thainumerals thefirstcharacter thenormalizedbodyfontsize \
-therefore theremainingcharacters theta thickspace thinrule \
-thinrules thinspace thirdoffivearguments thirdoffourarguments thirdofsixarguments \
-thirdofthreearguments thirdofthreeunexpanded thook thookleftarrow thookrightarrow \
-thorn threedigitrounding threeeighths threefifths threeperemspace \
-threequarter threesuperior tibetannumerals tightlayer tilde \
-times tinyfont title tlap tleftarrow \
-tleftharpoondown tleftharpoonup tleftrightarrow tleftrightharpoons tmapsto \
-to tochar tolinenote tooltip top \
-topbox topleftbox toplinebox toprightbox topskippedbox \
-tracecatcodetables tracedfontname traceoutputroutines tracepositions trademark \
-translate transparencycomponents transparent trel triangle \
-triangledown triangleleft triangleq triangleright trightarrow \
-trightharpoondown trightharpoonup trightleftharpoons trightoverleftarrow triplebond \
-tripleprime tripleverticalbar truefilename truefontname tstroke \
-ttraggedright ttriplerel ttwoheadleftarrow ttwoheadrightarrow turnediota \
-twodigitrounding twofifths twoheaddownarrow twoheadleftarrow twoheadrightarrow \
-twoheadrightarrowtail twoheaduparrow twosuperior twothirds tx \
-txx typ type typebuffer typedefinedbuffer \
-typeface typefile typeinlinebuffer typescriptone typescriptprefix \
-typescriptthree typescripttwo typesetbuffer typesetfile uacute \
-ubreve ucaron ucircumflex uconvertnumber udiaeresis \
-udiaeresisacute udiaeresiscaron udiaeresisgrave udiaeresismacron udotbelow \
-udots udoublegrave uedcatcodecommand ugrave uhook \
-uhorn uhornacute uhorndotbelow uhorngrave uhornhook \
-uhorntilde uhungarumlaut uinvertedbreve ulcorner umacron \
-undefinevalue undepthed underbar underbars underbrace \
-underbracket underdash underdashes underdot underdots \
-underleftarrow underparent underrandom underrandoms underrightarrow \
-underset understrike understrikes undoassign unexpandeddocumentvariable \
-unframed unhhbox unihex uniqueMPgraphic uniqueMPpagegraphic \
-unit unitlanguage unitshigh unitslow unittext \
-unknown unprotected unregisterhyphenationpattern unspaceafter unspaceargument \
-unspaced unspacestring untexargument untexcommand uogonek \
-upand uparrow updasharrow updownarrow updownarrowbar \
-updownarrows upharpoonleft upharpoonright uplus uppercased \
-uppercasestring upperleftdoubleninequote upperleftdoublesixquote upperleftsingleninequote upperleftsinglesixquote \
-upperrightdoubleninequote upperrightdoublesixquote upperrightsingleninequote upperrightsinglesixquote upsilon \
-upuparrows upwhitearrow urcorner uring url \
-useJSscripts useMPenvironmentbuffer useMPgraphic useMPlibrary useMPrun \
-useMPvariables useURL usealignparameter useblankparameter useblocks \
-usebodyfont usebodyfontparameter usebtxdataset usebtxdefinitions usecitation \
-usecolors usecomponent usedirectory usedummycolorparameter usedummystyleandcolor \
-usedummystyleparameter useenvironment useexternaldocument useexternalfigure useexternalrendering \
-useexternalsoundtrack usefigurebase usefile usegridparameter useindentingparameter \
-useindentnextparameter useinterlinespaceparameter uselanguageparameter useluamodule usemathstyleparameter \
-usemodule useproduct useprofileparameter useproject usereferenceparameter \
-userpagenumber usesetupsparameter usestaticMPfigure usesubpath usesymbols \
-usetexmodule usetypescript usetypescriptfile useurl usezipfile \
-utfchar utflower utfupper utilde utilityregisterlength \
-vDash varTheta varepsilon varkappa varnothing \
-varphi varpi varrho varsigma vartheta \
-vboxreference vdash vdots vec vee \
-veebar veeeq verbatim verbatimstring verbosenumber \
-version vert verticalgrowingbar verticalpositionbar veryraggedcenter \
-veryraggedleft veryraggedright vglue viewerlayer vl \
+stopcolorset stopcolumns stopcolumnset stopcolumnsetspan stopcombination \
+stopcomment stopcomponent stopcontextcode stopcontextdefinitioncode stopctxfunction \
+stopctxfunctiondefinition stopcurrentcolor stopcurrentlistentrywrapper stopdelimited stopdelimitedtext \
+stopdisplaymath stopdmath stopdocument stopeffect stopelement \
+stopembeddedxtable stopendnote stopendofline stopenvironment stopexceptions \
+stopexpanded stopexpandedcollect stopextendedcatcodetable stopexternalfigurecollection stopfacingfloat \
+stopfact stopfigure stopfiguretext stopfittingpage stopfixed \
+stopfloatcombination stopfont stopfontclass stopfontsolution stopfootnote \
+stopformula stopformulas stopframed stopframedcell stopframedcontent \
+stopframedrow stopframedtable stopframedtext stopfrontmatter stopgoto \
+stopgraphictext stopgridsnapping stophanging stophbox stophboxestohbox \
+stophboxregister stophead stopheadtext stophelptext stophiding \
+stophighlight stophyphenation stopimath stopindentation stopindentedtext \
+stopinteraction stopinteractionmenu stopinterface stopintermezzotext stopintertext \
+stopitem stopitemgroup stopitemgroupcolumns stopitemize stopknockout \
+stoplabeltext stoplanguage stoplayout stopleftaligned stoplegend \
+stopline stoplinealignment stoplinecorrection stoplinefiller stoplinenote \
+stoplinenumbering stoplines stoplinetable stoplinetablebody stoplinetablecell \
+stoplinetablehead stoplocalfootnotes stoplocalheadsetup stoplocallinecorrection stoplocalnotes \
+stoplocalsetups stoplua stopluacode stopluaparameterset stopluasetups \
+stopmakeup stopmarginblock stopmarginrule stopmarkedcontent stopmarkpages \
+stopmathalignment stopmathcases stopmathlabeltext stopmathmatrix stopmathmode \
+stopmathstyle stopmatrices stopmatrix stopmaxaligned stopmdformula \
+stopmidaligned stopmiddlealigned stopmiddlemakeup stopmixedcolumns stopmode \
+stopmodeset stopmodule stopmoduletestsection stopmpformula stopnamedsection \
+stopnamedsubformulas stopnarrow stopnarrower stopnegative stopnicelyfilledbox \
+stopnointerference stopnotallmodes stopnotext stopnotmode stopoperatortext \
+stopopposite stopoutputstream stopoverlay stopoverprint stoppacked \
+stoppagecolumns stoppagecomment stoppagefigure stoppagelayout stoppagemakeup \
+stoppar stopparagraph stopparagraphs stopparagraphscell stopparbuilder \
+stoppart stoppath stopplacechemical stopplacefigure stopplacefloat \
+stopplaceformula stopplacegraphic stopplaceintermezzo stopplacelegend stopplacepairedbox \
+stopplacetable stoppositioning stoppositionoverlay stoppositive stoppostponing \
+stoppostponingnotes stopprefixtext stopprocessassignmentcommand stopprocessassignmentlist stopprocesscommacommand \
+stopprocesscommalist stopproduct stopproject stopprotect stopprotectedcolors \
+stoppublication stoppunctuation stopquotation stopquote stoprandomized \
+stoprandomseed stoprawsetups stopreadingfile stopreferenceprefix stopregime \
+stopreusableMPgraphic stoprightaligned stopruby stopscript stopsdformula \
+stopsection stopsectionblock stopsectionblockenvironment stopsectionlevel stopsetups \
+stopshapebox stopshift stopsidebar stopsimplecolumns stopspecialitem \
+stopspeech stopspformula stopsplitformula stopsplittext stopspread \
+stopstandardmakeup stopstaticMPfigure stopstaticMPgraphic stopstrictinspectnextcharacter stopstrut \
+stopstyle stopsubformulas stopsubject stopsubjectlevel stopsubsection \
+stopsubsentence stopsubstack stopsubsubject stopsubsubsection stopsubsubsubject \
+stopsubsubsubsection stopsubsubsubsubject stopsubsubsubsubsection stopsubsubsubsubsubject stopsuffixtext \
+stopsymbolset stoptable stoptablehead stoptables stoptabletail \
+stoptabletext stoptabulate stoptabulatehead stoptabulatetail stoptagged \
+stoptaglabeltext stoptexcode stoptexdefinition stoptext stoptextbackground \
+stoptextbackgroundmanual stoptextcolor stoptextcolorintent stoptextflow stoptextmakeup \
+stoptextrule stoptitle stoptokenlist stoptokens stoptransparent \
+stoptypescript stoptypescriptcollection stoptyping stopuniqueMPgraphic stopuniqueMPpagegraphic \
+stopunittext stopunpacked stopusableMPgraphic stopuseMPgraphic stopusemathstyleparameter \
+stopuserdata stopusingbtxspecification stopvbox stopvboxregister stopvboxtohbox \
+stopvboxtohboxseparator stopviewerlayer stopvtop stopvtopregister stopxcell \
+stopxcellgroup stopxcolumn stopxgroup stopxmldisplayverbatim stopxmlinlineverbatim \
+stopxmlraw stopxmlsetups stopxrow stopxrowgroup stopxtable \
+stopxtablebody stopxtablefoot stopxtablehead stopxtablenext stretched \
+strictdoifelsenextoptional strictdoifnextoptionalelse stripcharacter strippedcsname stripspaces \
+structurelistuservariable structurenumber structuretitle structureuservariable structurevariable \
+strut strutdp strutgap strutht struthtdp \
+struttedbox strutwd style styleinstance subject \
+subpagenumber subsection subsentence subset subseteq \
+subseteqq subsetneq subsetneqq substituteincommalist subsubject \
+subsubsection subsubsubject subsubsubsection subsubsubsubject subsubsubsubsection \
+subsubsubsubsubject subtractfeature succ succapprox succcurlyeq \
+succeq succeqq succnapprox succneq succneqq \
+succnsim succsim suffixlanguage suffixtext sum \
+supset supseteq supseteqq supsetneq supsetneqq \
+surd surdradical swapcounts swapdimens swapface \
+swapmacros swaptypeface swarrow switchstyleonly switchtobodyfont \
+switchtocolor switchtointerlinespace symbol symbolreference synchronizeblank \
+synchronizeindenting synchronizemarking synchronizeoutputstreams synchronizestrut synchronizewhitespace \
+synctexblockfilename synctexresetfilename synctexsetfilename systemlog systemlogfirst \
+systemloglast systemsetups tLeftarrow tLeftrightarrow tRightarrow \
+tabulateautoline tabulateautorule tabulateline tabulaterule taggedctxcommand \
+taggedlabeltexts taglabellanguage taglabeltext tau tbinom \
+tbox tcaron tcedilla tcommaaccent tcurl \
+tequal test testandsplitstring testcolumn testfeature \
+testfeatureonce testpage testpageonly testpagesync testtokens \
+tex texdefinition texsetup textAngstrom textacute \
+textampersand textasciicircum textasciitilde textat textbackslash \
+textbar textbottomcomma textbottomdot textbraceleft textbraceright \
+textbreve textbrokenbar textbullet textcaron textcedilla \
+textcelsius textcent textcircledP textcircumflex textcitation \
+textcite textcomma textcontrolspace textcurrency textdag \
+textddag textdegree textdiaeresis textdiv textdollar \
+textdong textdotaccent textellipsis texteuro textflowcollector \
+textfraction textgrave texthash texthorizontalbar texthungarumlaut \
+texthyphen textkelvin textlognot textmacron textmath \
+textmho textminus textmu textmultiply textnumero \
+textogonek textohm textormathchar textormathchars textounce \
+textpercent textperiod textplus textpm textreference \
+textring textrule textslash textsterling texttilde \
+textunderscore textvisiblespace textyen thai thainumerals \
+thefirstcharacter thenormalizedbodyfontsize therefore theremainingcharacters theta \
+thickspace thinrule thinrules thinspace thirdoffivearguments \
+thirdoffourarguments thirdofsixarguments thirdofthreearguments thirdofthreeunexpanded thook \
+thookleftarrow thookrightarrow thorn threedigitrounding threeeighths \
+threefifths threeperemspace threequarter threesuperior tibetannumerals \
+tightlayer tilde times tinyfont title \
+tlap tleftarrow tleftharpoondown tleftharpoonup tleftrightarrow \
+tleftrightharpoons tmapsto to tochar tolinenote \
+tooltip top topbox topleftbox toplinebox \
+toprightbox topskippedbox tracecatcodetables tracedfontname traceoutputroutines \
+tracepositions trademark translate transparencycomponents transparent \
+trel triangle triangledown triangleleft triangleq \
+triangleright trightarrow trightharpoondown trightharpoonup trightleftharpoons \
+trightoverleftarrow triplebond tripleprime tripleverticalbar truefilename \
+truefontname tstroke ttraggedright ttriplerel ttwoheadleftarrow \
+ttwoheadrightarrow turnediota twodigitrounding twofifths twoheaddownarrow \
+twoheadleftarrow twoheadrightarrow twoheadrightarrowtail twoheaduparrow twosuperior \
+twothirds tx txx typ type \
+typebuffer typedefinedbuffer typeface typefile typeinlinebuffer \
+typescriptone typescriptprefix typescriptthree typescripttwo typesetbuffer \
+typesetfile uacute ubreve ucaron ucircumflex \
+uconvertnumber udiaeresis udiaeresisacute udiaeresiscaron udiaeresisgrave \
+udiaeresismacron udotbelow udots udoublegrave uedcatcodecommand \
+ugrave uhook uhorn uhornacute uhorndotbelow \
+uhorngrave uhornhook uhorntilde uhungarumlaut uinvertedbreve \
+ulcorner umacron undefinevalue undepthed underbar \
+underbars underbrace underbracket underdash underdashes \
+underdot underdots underleftarrow underparent underrandom \
+underrandoms underrightarrow underset understrike understrikes \
+undoassign unexpandeddocumentvariable unframed unhhbox unihex \
+uniqueMPgraphic uniqueMPpagegraphic unit unitlanguage unitshigh \
+unitslow unittext unknown unprotected unregisterhyphenationpattern \
+unspaceafter unspaceargument unspaced unspacestring unstackscripts \
+untexargument untexcommand uogonek upand uparrow \
+updasharrow updownarrow updownarrowbar updownarrows upharpoonleft \
+upharpoonright uplus uppercased uppercasestring upperleftdoubleninequote \
+upperleftdoublesixquote upperleftsingleninequote upperleftsinglesixquote upperrightdoubleninequote upperrightdoublesixquote \
+upperrightsingleninequote upperrightsinglesixquote upsilon upuparrows upwhitearrow \
+urcorner uring url useJSscripts useMPenvironmentbuffer \
+useMPgraphic useMPlibrary useMPrun useMPvariables useURL \
+usealignparameter useblankparameter useblocks usebodyfont usebodyfontparameter \
+usebtxdataset usebtxdefinitions usecitation usecolors usecomponent \
+usedirectory usedummycolorparameter usedummystyleandcolor usedummystyleparameter useenvironment \
+useexternaldocument useexternalfigure useexternalrendering useexternalsoundtrack usefigurebase \
+usefile usegridparameter useindentingparameter useindentnextparameter useinterlinespaceparameter \
+uselanguageparameter useluamodule usemathstyleparameter usemodule useproduct \
+useprofileparameter useproject usereferenceparameter userpagenumber usesetupsparameter \
+usestaticMPfigure usesubpath usesymbols usetexmodule usetypescript \
+usetypescriptfile useurl usezipfile utfchar utflower \
+utfupper utilde utilityregisterlength vDash varTheta \
+varepsilon varkappa varnothing varphi varpi \
+varrho varsigma vartheta vboxreference vdash \
+vdots vec vee veebar veeeq \
+verbatim verbatimstring verbosenumber version vert \
+verticalgrowingbar verticalpositionbar veryraggedcenter veryraggedleft veryraggedright \
+vglue viewerlayer vl vpackbox vpackedbox \
vphantom vpos vsmash vsmashbox vsmashed \
vspace vspacing wcircumflex wdofstring wedge \
wedgeeq weekday whitearrowupfrombar widehat widetilde \
@@ -1230,8 +1236,8 @@ xrightleftharpoons xrightoverleftarrow xsplitstring xtriplerel xtwoheadleftarrow
xtwoheadrightarrow xxfrac xypos yacute ycircumflex \
ydiaeresis ydotbelow yen ygrave yhook \
ymacron ytilde zacute zcaron zdotaccent \
-zerowidthnobreakspace zerowidthspace zeta zhook zstroke \
-zwj zwnj
+zeronumberconversion zerowidthnobreakspace zerowidthspace zeta zhook \
+zstroke zwj zwnj
keywordclass.context.cs=\
Cisla Kap MESIC Rimskecislice \
@@ -1263,48 +1269,48 @@ nastavmeziradkovoumezeru nastavnadpis nastavnadpisy nastavodkazovani nastavodsaz
nastavodstavce nastavopis nastavoramovanetexty nastavoramovani nastavorez \
nastavotoceni nastavpaletu nastavplvouciobjekt nastavplvouciobjekty nastavpodcislostrany \
nastavpole nastavpolozky nastavpopisek nastavpopisky nastavpozadi \
-nastavprechodstrany nastavpreskok nastavprogramy nastavradkovani nastavradky \
-nastavrejstrik nastavrovnice nastavsadusymbolu nastavseznam nastavsirkucary \
-nastavsloupce nastavspodek nastavsynonyma nastavtabelaci nastavtabulky \
-nastavtenkelinky nastavtext nastavtextovelinky nastavtexttexty nastavtextyupati \
-nastavtextyzahlavi nastavtoleranci nastavtrideni nastavtype nastavumisteniprotejsku \
-nastavumistovani nastavupati nastavupravu nastavurl nastavusporadani \
-nastavvelikostpapiru nastavvsechnapole nastavvycty nastavvyplnovelinky nastavvyplnoveradky \
-nastavvzhled nastavzahlavi nastavzakladnifont nastavzarovnani nastavznaceni \
-nastavzuzeni nastrane nejakyradek nekde neznamo \
-nivy nizky nokap obrazovka odkaz \
-odkaznastranu odkaznatext odkazujici opis opissoubor \
-oramovani oref orez otocit oznaceni \
-pis plnezneni pole polozka polozky \
-porovnejpaletu porovnejskupinubarev pozadi pozice poznamka \
-pref prelozit prepninazakladnifont preskoc prizpusobivepole \
-prizpusobvzhled produkt projekt prostredi resetznaceni \
-rimskecislice rozdelplvouciobjekt roztazene schovejbloky sedabarva \
-sloupec slovovpravo stanovcharakteristickuseznamu stanovcislonadpisu startbarva \
-startinteraktivnimenu startjazyk startjdina startkomponenta startmarginalnilinka \
-startnadpis startoramovani startpolozka startpozadi startprodukt \
-startprojekt startprostredi startpublikace startradek starttextovalinka \
-startumistirovnici startzarovnanonastred startzarovnanovlevo startzarovnanovpravo startzhustene \
-stopbarva stopinteraktivnimenu stopjazyk stopjdina stopkomponenta \
-stopmarginalnilinka stopnadpis stoporamovani stoppolozka stoppozadi \
-stopprodukt stopprojekt stopprostredi stoppublikace stopradek \
-stoptextovalinka stopumistirovnici stopzarovnanonastred stopzarovnanovlevo stopzarovnanovpravo \
-stopzhustene strana tecky tenkalinka tenkelinky \
-textovalinka tlacitko tlacitkomenu tloustkacary tref \
-tvrdamezera tvrdemezery ukazbarvu ukazmrizku ukaznastaveni \
-ukazpaletu ukazpodpery ukazpostredizakladnihofontu ukazramecek ukazsadusymbolu \
-ukazskupinubarev ukazupravu ukazvytisk ukazvzhled ukazzakladnifont \
-umistikombinovanyseznam umistilokalnipoznamkypodcarou umistinadsebe umistinamrizku umistipodrovnici \
-umistipoznamkypodcarou umistirejstrik umistirovnici umistiseznam umistivedlesebe \
-umistizalozky urcicharakteristikurejstriku uzijJSscripts uzijURL uzijadresar \
-uzijbloky uzijexternidokument uzijexterniobraz uzijexternizvuk uzijmodul \
-uzijsymbol uzijurl verze vlasovalinka vradku \
-vsedniden vyberbloky vyplnenytext vyplnovelinky vyplnovyradek \
-vysoky zachovejbloky zadnamezera zadnehorniadolniradky zadnezahlaviaupati \
-zalozka zapisdoseznamu zapismeziseznam zaramovani zarovnanonastred \
-zarovnanovlevo zarovnanovpravo zasobnikpoli ziskejbuffer ziskejznaceni \
-znaceni znak znaky zpracujbloky zrcadlit \
-zref
+nastavpoznamkypodcarou nastavprechodstrany nastavpreskok nastavprogramy nastavradkovani \
+nastavradky nastavrejstrik nastavrovnice nastavsadusymbolu nastavseznam \
+nastavsirkucary nastavsloupce nastavspodek nastavsynonyma nastavtabelaci \
+nastavtabulky nastavtenkelinky nastavtext nastavtextovelinky nastavtexttexty \
+nastavtextyupati nastavtextyzahlavi nastavtoleranci nastavtrideni nastavtype \
+nastavumisteniprotejsku nastavumistovani nastavupati nastavupravu nastavurl \
+nastavusporadani nastavvelikostpapiru nastavvsechnapole nastavvycty nastavvyplnovelinky \
+nastavvyplnoveradky nastavvzhled nastavzahlavi nastavzakladnifont nastavzarovnani \
+nastavznaceni nastavzuzeni nastrane nejakyradek nekde \
+neznamo nivy nizky nokap obrazovka \
+odkaz odkaznastranu odkaznatext odkazujici opis \
+opissoubor oramovani oref orez otocit \
+oznaceni pis plnezneni pole polozka \
+polozky porovnejpaletu porovnejskupinubarev pozadi pozice \
+poznamka pref prelozit prepninazakladnifont preskoc \
+prizpusobivepole prizpusobvzhled produkt projekt prostredi \
+resetznaceni rimskecislice rozdelplvouciobjekt roztazene schovejbloky \
+sedabarva sloupec slovovpravo stanovcharakteristickuseznamu stanovcislonadpisu \
+startbarva startinteraktivnimenu startjazyk startjdina startkomponenta \
+startmarginalnilinka startnadpis startoramovani startpolozka startpozadi \
+startprodukt startprojekt startprostredi startpublikace startradek \
+starttextovalinka startumistirovnici startzarovnanonastred startzarovnanovlevo startzarovnanovpravo \
+startzhustene stopbarva stopinteraktivnimenu stopjazyk stopjdina \
+stopkomponenta stopmarginalnilinka stopnadpis stoporamovani stoppolozka \
+stoppozadi stopprodukt stopprojekt stopprostredi stoppublikace \
+stopradek stoptextovalinka stopumistirovnici stopzarovnanonastred stopzarovnanovlevo \
+stopzarovnanovpravo stopzhustene strana tecky tenkalinka \
+tenkelinky textovalinka tlacitko tlacitkomenu tloustkacary \
+tref tvrdamezera tvrdemezery ukazbarvu ukazmrizku \
+ukaznastaveni ukazpaletu ukazpodpery ukazpostredizakladnihofontu ukazramecek \
+ukazsadusymbolu ukazskupinubarev ukazupravu ukazvytisk ukazvzhled \
+ukazzakladnifont umistikombinovanyseznam umistilokalnipoznamkypodcarou umistinadsebe umistinamrizku \
+umistipodrovnici umistipoznamkypodcarou umistirejstrik umistirovnici umistiseznam \
+umistivedlesebe umistizalozky urcicharakteristikurejstriku uzijJSscripts uzijURL \
+uzijadresar uzijbloky uzijexternidokument uzijexterniobraz uzijexternizvuk \
+uzijmodul uzijsymbol uzijurl verze vlasovalinka \
+vradku vsedniden vyberbloky vyplnenytext vyplnovelinky \
+vyplnovyradek vysoky zachovejbloky zadnamezera zadnehorniadolniradky \
+zadnezahlaviaupati zalozka zapisdoseznamu zapismeziseznam zaramovani \
+zarovnanonastred zarovnanovlevo zarovnanovpravo zasobnikpoli ziskejbuffer \
+ziskejznaceni znaceni znak znaky zpracujbloky \
+zrcadlit zref
keywordclass.context.de=\
Buchstabe Buchstaben Kap MONAT \
@@ -1349,34 +1355,35 @@ stelleabsatznummerierungein stelleabschnittsblockein stelleanordnenein stelleauf
stelleausschnittein stellebeschreibungein stellebeschriftungein stellebilderunterschriftein stellebildunterschriftein \
stellebindestrichein stelleblankoein stelleblockein stelledrehenein stelleduennerumrissein \
stelleeinziehenein stelleengerein stellefarbeein stellefarbenein stellefeldein \
-stellefelderin stellefliesstextein stelleformelnein stellefusszeileein stellefusszeilentextein \
-stellegefuelltesrechteckein stellegefuelltezeileein stellegegenueberplatzierenein stellegleitobjekteein stellegleitobjektein \
-stellehintergruendeein stellehintergrundein stelleinteraktionein stelleinteraktionsbalkenein stelleinteraktionsbildschirmein \
-stelleinteraktionsmenueein stellekommentarein stellekopfzahlein stellekopfzeileein stellekopfzeilentextein \
-stellelayoutein stellelinienbreiteein stellelisteein stellemarginallinieein stellenobenein \
-stellepaletteein stellepapierformatein stelleplatziegeteiltegleitobjekt stellepositionierenein stellepostenein \
-stelleprogrammein stellepufferein stellerechteckein stellereferenzierenein stelleregisterein \
-stelleseitenkommentarein stelleseitennummerein stelleseitennummeriernungein stelleseitenuebergangein stellesortierenein \
-stellespaltenein stellespatiumein stellespracheein stellesymbolsetein stellesynonymein \
-stelletabellenein stelletabulatorein stelletextein stelletextobenein stelletexttexteein \
-stelletextumrissein stelletextuntenein stelletipein stelletippenein stelletoleranzein \
-stelleueberschriftein stelleueberschriftenein stelleumbruchein stelleumrahmtein stelleumrahmtetexteein \
-stelleuntenein stelleunterseitennummerein stelleurlein stelleversalienein stellezeilenabstandein \
-stellezeilenein stellezeilennumerierungein stellezitierenein stellezusammengestelltelisteein stellezwischenraumein \
-stopfarbe stophintergrund stopinteraktionsmenue stopkleinerdurchschuss stopkomponente \
-stopkopf stoplinksbuendig stopmarginallinie stopplatziereformel stoppos \
-stopprodukt stopprojekt stoppublikation stoprechtsbuendig stopsprache \
-stoptextlinie stopumgebung stopumrahmt stopzeile stopzentriert \
-stopzu teilegleitobjekt textlinie textreferenz tief \
-tiho tip tippedatei tippen tippepuffer \
-ueber uebersetzten umgebung umrahmt unbekant \
-verbergebloecke vergleichefarbengruppe vergleichepalette verwendeJSscript verwendeURL \
-verwendebloecke verwendeexteresdokument verwendeexterneabbildung verwendeexternestonstueck verwendemodul \
-verwendesymbole verwendeurl volleswort von waehlebloeckeaus \
-wechselezumfliesstext wochentag wortrechts zeigedruck zeigeeinstellungen \
-zeigefarbe zeigefarbengruppe zeigefliesstext zeigefliesstextumgebung zeigegitter \
-zeigelayout zeigepalette zeigerahmen zeigestruts zeigeumbruch \
-zentriert ziffern zu zurbox zurseite
+stellefelderin stellefliesstextein stelleformelnein stellefussnotenein stellefusszeileein \
+stellefusszeilentextein stellegefuelltesrechteckein stellegefuelltezeileein stellegegenueberplatzierenein stellegleitobjekteein \
+stellegleitobjektein stellehintergruendeein stellehintergrundein stelleinteraktionein stelleinteraktionsbalkenein \
+stelleinteraktionsbildschirmein stelleinteraktionsmenueein stellekommentarein stellekopfzahlein stellekopfzeileein \
+stellekopfzeilentextein stellelayoutein stellelinienbreiteein stellelisteein stellemarginallinieein \
+stellenobenein stellepaletteein stellepapierformatein stelleplatziegeteiltegleitobjekt stellepositionierenein \
+stellepostenein stelleprogrammein stellepufferein stellerechteckein stellereferenzierenein \
+stelleregisterein stelleseitenkommentarein stelleseitennummerein stelleseitennummeriernungein stelleseitenuebergangein \
+stellesortierenein stellespaltenein stellespatiumein stellespracheein stellesymbolsetein \
+stellesynonymein stelletabellenein stelletabulatorein stelletextein stelletextobenein \
+stelletexttexteein stelletextumrissein stelletextuntenein stelletipein stelletippenein \
+stelletoleranzein stelleueberschriftein stelleueberschriftenein stelleumbruchein stelleumrahmtein \
+stelleumrahmtetexteein stelleuntenein stelleunterseitennummerein stelleurlein stelleversalienein \
+stellezeilenabstandein stellezeilenein stellezeilennumerierungein stellezitierenein stellezusammengestelltelisteein \
+stellezwischenraumein stopfarbe stophintergrund stopinteraktionsmenue stopkleinerdurchschuss \
+stopkomponente stopkopf stoplinksbuendig stopmarginallinie stopplatziereformel \
+stoppos stopprodukt stopprojekt stoppublikation stoprechtsbuendig \
+stopsprache stoptextlinie stopumgebung stopumrahmt stopzeile \
+stopzentriert stopzu teilegleitobjekt textlinie textreferenz \
+tief tiho tip tippedatei tippen \
+tippepuffer ueber uebersetzten umgebung umrahmt \
+unbekant verbergebloecke vergleichefarbengruppe vergleichepalette verwendeJSscript \
+verwendeURL verwendebloecke verwendeexteresdokument verwendeexterneabbildung verwendeexternestonstueck \
+verwendemodul verwendesymbole verwendeurl volleswort von \
+waehlebloeckeaus wechselezumfliesstext wochentag wortrechts zeigedruck \
+zeigeeinstellungen zeigefarbe zeigefarbengruppe zeigefliesstext zeigefliesstextumgebung \
+zeigegitter zeigelayout zeigepalette zeigerahmen zeigestruts \
+zeigeumbruch zentriert ziffern zu zurbox \
+zurseite
keywordclass.context.en=\
@@ -1418,89 +1425,89 @@ demarrebtxlabeltext demarrebtxrenderingdefinitions demarrebuffer demarrecases de
demarrecenteraligned demarrechapter demarrecharacteralign demarrecheckedfences demarrechemical \
demarrechemicaltext demarreciter demarrecollect demarrecollecting demarrecolorintent \
demarrecoloronly demarrecolorset demarrecolumns demarrecolumnset demarrecolumnsetspan \
-demarrecolumnspan demarrecombination demarrecomment demarrecomposant demarrecontextcode \
-demarrecontextdefinitioncode demarrecouleur demarrectxfunction demarrectxfunctiondefinition demarrecurrentcolor \
-demarrecurrentlistentrywrapper demarredelimited demarredelimitedtext demarredisplaymath demarredmath \
-demarredocument demarreeffect demarreelement demarreembeddedxtable demarreendnote \
-demarreendofline demarreenvironement demarreexceptions demarreexpanded demarreexpandedcollect \
-demarreextendedcatcodetable demarreexternalfigurecollection demarrefacingfloat demarrefact demarrefigure \
-demarrefiguretext demarrefittingpage demarrefixed demarrefloatcombination demarrefont \
-demarrefontclass demarrefontsolution demarrefootnote demarreformula demarreformulas \
-demarreframed demarreframedcell demarreframedcontent demarreframedrow demarreframedtable \
-demarreframedtext demarrefrontmatter demarregraphictext demarregridsnapping demarregroupe \
-demarrehanging demarrehbox demarrehboxestohbox demarrehboxregister demarreheadtext \
-demarrehelptext demarrehiding demarrehighlight demarrehyphenation demarreimath \
-demarreindentation demarreindentedtext demarreinteraction demarreinterface demarreintermezzotext \
-demarreintertext demarreitemgroup demarreitemgroupcolumns demarreitemize demarreknockout \
-demarrelabeltext demarrelangue demarrelayout demarrelegend demarreligne \
-demarreligneregleetexte demarrelinealignment demarrelinecorrection demarrelinefiller demarrelinenumbering \
-demarrelines demarrelinetable demarrelinetablebody demarrelinetablecell demarrelinetablehead \
-demarrelocalfootnotes demarrelocalheadsetup demarrelocallinecorrection demarrelocalnotes demarrelocalsetups \
-demarrelua demarreluacode demarreluaparameterset demarreluasetups demarremakeup \
-demarremargereglee demarremarginblock demarremarkedcontent demarremarkpages demarremathalignment \
-demarremathcases demarremathlabeltext demarremathmatrix demarremathmode demarremathstyle \
-demarrematrices demarrematrix demarremaxaligned demarremdformula demarremenuinteraction \
-demarremiddlealigned demarremiddlemakeup demarremixedcolumns demarremode demarremodeset \
-demarremodule demarremoduletestsection demarrempformula demarrenamedsection demarrenamedsubformulas \
-demarrenarrow demarrenarrower demarrenegative demarrenicelyfilledbox demarrenointerference \
-demarrenotallmodes demarrenotext demarrenotmode demarreoperatortext demarreopposite \
-demarreoutputstream demarreoverlay demarreoverprint demarrepagecolumns demarrepagecomment \
-demarrepagefigure demarrepagelayout demarrepagemakeup demarrepar demarreparagraph \
-demarreparagraphs demarreparagraphscell demarreparbuilder demarrepart demarrepath \
-demarreplacechemical demarreplacefigure demarreplaceflottant demarreplaceformule demarreplacegraphic \
-demarreplaceintermezzo demarreplacelegend demarreplacepairedbox demarreplacetable demarrepositioning \
-demarrepositionoverlay demarrepositive demarrepostponing demarrepostponingnotes demarreprefixtext \
-demarreprocessassignmentcommand demarreprocessassignmentlist demarreprocesscommacommand demarreprocesscommalist demarreproduit \
-demarreprojet demarreprotect demarreprotectedcolors demarrepublication demarrepunctuation \
-demarrequotation demarrequote demarrerandomized demarrerandomseed demarrerawsetups \
-demarrereadingfile demarrereferenceprefix demarreregime demarrereusableMPgraphic demarreruby \
-demarrescript demarresdformula demarresection demarresectionblock demarresectionblockenvironment \
-demarresectionlevel demarresetups demarreshapebox demarreshift demarresidebar \
-demarresimplecolumns demarrespecialitem demarrespeech demarrespformula demarresplitformula \
-demarresplittext demarrespread demarrestandardmakeup demarrestaticMPfigure demarrestaticMPgraphic \
-demarrestrictinspectnextcharacter demarrestrut demarrestyle demarresubformulas demarresubject \
-demarresubjectlevel demarresubsection demarresubsentence demarresubstack demarresubsubject \
-demarresubsubsection demarresubsubsubject demarresubsubsubsection demarresubsubsubsubject demarresubsubsubsubsection \
-demarresubsubsubsubsubject demarresuffixtext demarresymbolset demarretable demarretablehead \
-demarretables demarretabletail demarretabletext demarretabulate demarretabulatehead \
-demarretabulatetail demarretagged demarretaglabeltext demarretete demarretexcode \
-demarretexdefinition demarretext demarretextbackground demarretextbackgroundmanual demarretextcolor \
-demarretextcolorintent demarretextflow demarretextmakeup demarretitle demarretokenlist \
-demarretokens demarretransparent demarretypescript demarretypescriptcollection demarretyping \
-demarreuniqueMPgraphic demarreuniqueMPpagegraphic demarreunittext demarreunpacked demarreusableMPgraphic \
-demarreuseMPgraphic demarreusemathstyleparameter demarreuserdata demarreusingbtxspecification demarreva \
-demarrevbox demarrevboxregister demarrevboxtohbox demarrevboxtohboxseparator demarreviewerlayer \
-demarrevtop demarrevtopregister demarrexcell demarrexcellgroup demarrexcolumn \
-demarrexgroup demarrexmldisplayverbatim demarrexmlinlineverbatim demarrexmlraw demarrexmlsetups \
-demarrexrow demarrexrowgroup demarrextable demarrextablebody demarrextablefoot \
-demarrextablehead demarrextablenext determinecaracteristiqueliste determinecaracteristiquesregistre determinenumerotete \
-echelle ecran ecritdansliste ecritentreliste element \
-elements environement espace espacefixe espacesfixes \
-etire faitreference fichierdactylo figureexterne gardeblocs \
-grille haut inconnu installelangue joursemaine \
-langue langueprincipale largeurligne ligneh lignenoire \
-ligneregleetexte lignesnoires llongueurliste marquage marquepage \
-mathematique menuinteraction mois montrecadre montrecouleur \
-montredisposition montreedition montreenvironnementpolicecorps montregrille montregroupecouleur \
-montrejeusymboles montremakeup montrepalette montrepolicecorps montrereglages \
-montrestruts motdroit numeroformule numeropage numeros \
-numerotete numerotetecourant obtientmarquage oriente periodes \
-pilechamp placecoteacote placeflottant placeformule placelesunsaudessusdesautres \
-placeliste placelisteinmbriquee placemarquespages placenotespdp placenotespdplocales \
-placenumeropage placenumerotete placeregistre placesousformule placesurgrille \
-placetextetete prendbuffer produit programme projet \
-qqpart razmarquage referencepage referencetexte reflete \
-reglealignement reglearrangement reglearriereplan reglearriereplans reglebarreinteraction \
-reglebloc regleblocsection reglebuffer reglecapitales reglechamp \
-reglechamps regleclipping reglecolonnes reglecommentaire reglecommentairepage \
-reglecompoetroite reglecomposeenalinea reglecouleur reglecouleurs regledactylo \
-regledemarrestoppe regledisposition regleecraninteraction regleelements regleencadre \
-regleentete regleenumerations regleepaisseurligne regleespaceblanc regleespacement \
-regleespacementinterligne regleflottant regleflottants regleformulaires regleformules \
-reglegroupeselements regleinf regleinteraction regleintitule regleintitules \
-reglejeucolonne reglejeusymboles reglelangue reglelignes reglelignesnoires \
-reglelignesreglestexte regleliste reglelisteimbriquee reglemakeup reglemargereglee \
-reglemarquage reglemarquagehyphenation reglemenuinteraction reglenumeropage reglenumerotationligne \
+demarrecombination demarrecomment demarrecomposant demarrecontextcode demarrecontextdefinitioncode \
+demarrecouleur demarrectxfunction demarrectxfunctiondefinition demarrecurrentcolor demarrecurrentlistentrywrapper \
+demarredelimited demarredelimitedtext demarredisplaymath demarredmath demarredocument \
+demarreeffect demarreelement demarreembeddedxtable demarreendnote demarreendofline \
+demarreenvironement demarreexceptions demarreexpanded demarreexpandedcollect demarreextendedcatcodetable \
+demarreexternalfigurecollection demarrefacingfloat demarrefact demarrefigure demarrefiguretext \
+demarrefittingpage demarrefixed demarrefloatcombination demarrefont demarrefontclass \
+demarrefontsolution demarrefootnote demarreformula demarreformulas demarreframed \
+demarreframedcell demarreframedcontent demarreframedrow demarreframedtable demarreframedtext \
+demarrefrontmatter demarregraphictext demarregridsnapping demarregroupe demarrehanging \
+demarrehbox demarrehboxestohbox demarrehboxregister demarreheadtext demarrehelptext \
+demarrehiding demarrehighlight demarrehyphenation demarreimath demarreindentation \
+demarreindentedtext demarreinteraction demarreinterface demarreintermezzotext demarreintertext \
+demarreitemgroup demarreitemgroupcolumns demarreitemize demarreknockout demarrelabeltext \
+demarrelangue demarrelayout demarrelegend demarreligne demarreligneregleetexte \
+demarrelinealignment demarrelinecorrection demarrelinefiller demarrelinenumbering demarrelines \
+demarrelinetable demarrelinetablebody demarrelinetablecell demarrelinetablehead demarrelocalfootnotes \
+demarrelocalheadsetup demarrelocallinecorrection demarrelocalnotes demarrelocalsetups demarrelua \
+demarreluacode demarreluaparameterset demarreluasetups demarremakeup demarremargereglee \
+demarremarginblock demarremarkedcontent demarremarkpages demarremathalignment demarremathcases \
+demarremathlabeltext demarremathmatrix demarremathmode demarremathstyle demarrematrices \
+demarrematrix demarremaxaligned demarremdformula demarremenuinteraction demarremiddlealigned \
+demarremiddlemakeup demarremixedcolumns demarremode demarremodeset demarremodule \
+demarremoduletestsection demarrempformula demarrenamedsection demarrenamedsubformulas demarrenarrow \
+demarrenarrower demarrenegative demarrenicelyfilledbox demarrenointerference demarrenotallmodes \
+demarrenotext demarrenotmode demarreoperatortext demarreopposite demarreoutputstream \
+demarreoverlay demarreoverprint demarrepagecolumns demarrepagecomment demarrepagefigure \
+demarrepagelayout demarrepagemakeup demarrepar demarreparagraph demarreparagraphs \
+demarreparagraphscell demarreparbuilder demarrepart demarrepath demarreplacechemical \
+demarreplacefigure demarreplaceflottant demarreplaceformule demarreplacegraphic demarreplaceintermezzo \
+demarreplacelegend demarreplacepairedbox demarreplacetable demarrepositioning demarrepositionoverlay \
+demarrepositive demarrepostponing demarrepostponingnotes demarreprefixtext demarreprocessassignmentcommand \
+demarreprocessassignmentlist demarreprocesscommacommand demarreprocesscommalist demarreproduit demarreprojet \
+demarreprotect demarreprotectedcolors demarrepublication demarrepunctuation demarrequotation \
+demarrequote demarrerandomized demarrerandomseed demarrerawsetups demarrereadingfile \
+demarrereferenceprefix demarreregime demarrereusableMPgraphic demarreruby demarrescript \
+demarresdformula demarresection demarresectionblock demarresectionblockenvironment demarresectionlevel \
+demarresetups demarreshapebox demarreshift demarresidebar demarresimplecolumns \
+demarrespecialitem demarrespeech demarrespformula demarresplitformula demarresplittext \
+demarrespread demarrestandardmakeup demarrestaticMPfigure demarrestaticMPgraphic demarrestrictinspectnextcharacter \
+demarrestrut demarrestyle demarresubformulas demarresubject demarresubjectlevel \
+demarresubsection demarresubsentence demarresubstack demarresubsubject demarresubsubsection \
+demarresubsubsubject demarresubsubsubsection demarresubsubsubsubject demarresubsubsubsubsection demarresubsubsubsubsubject \
+demarresuffixtext demarresymbolset demarretable demarretablehead demarretables \
+demarretabletail demarretabletext demarretabulate demarretabulatehead demarretabulatetail \
+demarretagged demarretaglabeltext demarretete demarretexcode demarretexdefinition \
+demarretext demarretextbackground demarretextbackgroundmanual demarretextcolor demarretextcolorintent \
+demarretextflow demarretextmakeup demarretitle demarretokenlist demarretokens \
+demarretransparent demarretypescript demarretypescriptcollection demarretyping demarreuniqueMPgraphic \
+demarreuniqueMPpagegraphic demarreunittext demarreunpacked demarreusableMPgraphic demarreuseMPgraphic \
+demarreusemathstyleparameter demarreuserdata demarreusingbtxspecification demarreva demarrevbox \
+demarrevboxregister demarrevboxtohbox demarrevboxtohboxseparator demarreviewerlayer demarrevtop \
+demarrevtopregister demarrexcell demarrexcellgroup demarrexcolumn demarrexgroup \
+demarrexmldisplayverbatim demarrexmlinlineverbatim demarrexmlraw demarrexmlsetups demarrexrow \
+demarrexrowgroup demarrextable demarrextablebody demarrextablefoot demarrextablehead \
+demarrextablenext determinecaracteristiqueliste determinecaracteristiquesregistre determinenumerotete echelle \
+ecran ecritdansliste ecritentreliste element elements \
+environement espace espacefixe espacesfixes etire \
+faitreference fichierdactylo figureexterne gardeblocs grille \
+haut inconnu installelangue joursemaine langue \
+langueprincipale largeurligne ligneh lignenoire ligneregleetexte \
+lignesnoires llongueurliste marquage marquepage mathematique \
+menuinteraction mois montrecadre montrecouleur montredisposition \
+montreedition montreenvironnementpolicecorps montregrille montregroupecouleur montrejeusymboles \
+montremakeup montrepalette montrepolicecorps montrereglages montrestruts \
+motdroit numeroformule numeropage numeros numerotete \
+numerotetecourant obtientmarquage oriente periodes pilechamp \
+placecoteacote placeflottant placeformule placelesunsaudessusdesautres placeliste \
+placelisteinmbriquee placemarquespages placenotespdp placenotespdplocales placenumeropage \
+placenumerotete placeregistre placesousformule placesurgrille placetextetete \
+prendbuffer produit programme projet qqpart \
+razmarquage referencepage referencetexte reflete reglealignement \
+reglearrangement reglearriereplan reglearriereplans reglebarreinteraction reglebloc \
+regleblocsection reglebuffer reglecapitales reglechamp reglechamps \
+regleclipping reglecolonnes reglecommentaire reglecommentairepage reglecompoetroite \
+reglecomposeenalinea reglecouleur reglecouleurs regledactylo regledemarrestoppe \
+regledisposition regleecraninteraction regleelements regleencadre regleentete \
+regleenumerations regleepaisseurligne regleespaceblanc regleespacement regleespacementinterligne \
+regleflottant regleflottants regleformulaires regleformules reglegroupeselements \
+regleinf regleinteraction regleintitule regleintitules reglejeucolonne \
+reglejeusymboles reglelangue reglelignes reglelignesnoires reglelignesreglestexte \
+regleliste reglelisteimbriquee reglemakeup reglemargereglee reglemarquage \
+reglemarquagehyphenation reglemenuinteraction reglenotepdp reglenumeropage reglenumerotationligne \
reglenumerotationpage reglenumerotationparagraphe reglenumerotete regleoriente reglepalette \
reglepapier regleparagraphes reglepdp regleplacementopposition reglepolicecorps \
reglepositionnement regleprogrammes reglereferencage regleregistre regleremplitligne \
@@ -1524,67 +1531,67 @@ stoppebitmapimage stoppeblockquote stoppebodymatter stoppebordermatrix stoppebox
stoppebtxlabeltext stoppebtxrenderingdefinitions stoppebuffer stoppecases stoppecatcodetable \
stoppecenteraligned stoppechapter stoppecharacteralign stoppecheckedfences stoppechemical \
stoppechemicaltext stoppecollect stoppecollecting stoppecolorintent stoppecoloronly \
-stoppecolorset stoppecolumns stoppecolumnset stoppecolumnsetspan stoppecolumnspan \
-stoppecombination stoppecomment stoppecomposant stoppecontextcode stoppecontextdefinitioncode \
-stoppecouleur stoppectxfunction stoppectxfunctiondefinition stoppecurrentcolor stoppecurrentlistentrywrapper \
-stoppedelimited stoppedelimitedtext stoppedisplaymath stoppedmath stoppedocument \
-stoppeeffect stoppeelement stoppeembeddedxtable stoppeendnote stoppeendofline \
-stoppeenvironement stoppeexceptions stoppeexpanded stoppeexpandedcollect stoppeextendedcatcodetable \
-stoppeexternalfigurecollection stoppefacingfloat stoppefact stoppefigure stoppefiguretext \
-stoppefittingpage stoppefixed stoppefloatcombination stoppefont stoppefontclass \
-stoppefontsolution stoppefootnote stoppeformula stoppeformulas stoppeframed \
-stoppeframedcell stoppeframedcontent stoppeframedrow stoppeframedtable stoppeframedtext \
-stoppefrontmatter stoppegraphictext stoppegridsnapping stoppegroupe stoppehanging \
-stoppehbox stoppehboxestohbox stoppehboxregister stoppeheadtext stoppehelptext \
-stoppehiding stoppehighlight stoppehyphenation stoppeimath stoppeindentation \
-stoppeindentedtext stoppeinteraction stoppeinterface stoppeintermezzotext stoppeintertext \
-stoppeitemgroup stoppeitemgroupcolumns stoppeitemize stoppeknockout stoppelabeltext \
-stoppelangue stoppelayout stoppelegend stoppeligne stoppeligneregleetexte \
-stoppelinealignment stoppelinecorrection stoppelinefiller stoppelinenumbering stoppelines \
-stoppelinetable stoppelinetablebody stoppelinetablecell stoppelinetablehead stoppelocalfootnotes \
-stoppelocalheadsetup stoppelocallinecorrection stoppelocalnotes stoppelocalsetups stoppelua \
-stoppeluacode stoppeluaparameterset stoppeluasetups stoppemakeup stoppemargereglee \
-stoppemarginblock stoppemarkedcontent stoppemarkpages stoppemathalignment stoppemathcases \
-stoppemathlabeltext stoppemathmatrix stoppemathmode stoppemathstyle stoppematrices \
-stoppematrix stoppemaxaligned stoppemdformula stoppemenuinteraction stoppemiddlealigned \
-stoppemiddlemakeup stoppemixedcolumns stoppemode stoppemodeset stoppemodule \
-stoppemoduletestsection stoppempformula stoppenamedsection stoppenamedsubformulas stoppenarrow \
-stoppenarrower stoppenegative stoppenicelyfilledbox stoppenointerference stoppenotallmodes \
-stoppenotext stoppenotmode stoppeoperatortext stoppeopposite stoppeoutputstream \
-stoppeoverlay stoppeoverprint stoppepagecolumns stoppepagecomment stoppepagefigure \
-stoppepagelayout stoppepagemakeup stoppepar stoppeparagraph stoppeparagraphs \
-stoppeparagraphscell stoppeparbuilder stoppepart stoppepath stoppeplacechemical \
-stoppeplacefigure stoppeplaceflottant stoppeplaceformule stoppeplacegraphic stoppeplaceintermezzo \
-stoppeplacelegend stoppeplacepairedbox stoppeplacetable stoppepositioning stoppepositionoverlay \
-stoppepositive stoppepostponing stoppepostponingnotes stoppeprefixtext stoppeprocessassignmentcommand \
-stoppeprocessassignmentlist stoppeprocesscommacommand stoppeprocesscommalist stoppeproduit stoppeprojet \
-stoppeprotect stoppeprotectedcolors stoppepublication stoppepunctuation stoppequotation \
-stoppequote stopperandomized stopperandomseed stopperawsetups stoppereadingfile \
-stoppereferenceprefix stopperegime stoppereusableMPgraphic stopperuby stoppescript \
-stoppesdformula stoppesection stoppesectionblock stoppesectionblockenvironment stoppesectionlevel \
-stoppesetups stoppeshapebox stoppeshift stoppesidebar stoppesimplecolumns \
-stoppespecialitem stoppespeech stoppespformula stoppesplitformula stoppesplittext \
-stoppespread stoppestandardmakeup stoppestaticMPfigure stoppestaticMPgraphic stoppestrictinspectnextcharacter \
-stoppestrut stoppestyle stoppesubformulas stoppesubject stoppesubjectlevel \
-stoppesubsection stoppesubsentence stoppesubstack stoppesubsubject stoppesubsubsection \
-stoppesubsubsubject stoppesubsubsubsection stoppesubsubsubsubject stoppesubsubsubsubsection stoppesubsubsubsubsubject \
-stoppesuffixtext stoppesymbolset stoppetable stoppetablehead stoppetables \
-stoppetabletail stoppetabletext stoppetabulate stoppetabulatehead stoppetabulatetail \
-stoppetagged stoppetaglabeltext stoppetete stoppetexcode stoppetexdefinition \
-stoppetext stoppetextbackground stoppetextbackgroundmanual stoppetextcolor stoppetextcolorintent \
-stoppetextflow stoppetextmakeup stoppetitle stoppetokenlist stoppetokens \
-stoppetransparent stoppetypescript stoppetypescriptcollection stoppetyping stoppeuniqueMPgraphic \
-stoppeuniqueMPpagegraphic stoppeunittext stoppeunpacked stoppeusableMPgraphic stoppeuseMPgraphic \
-stoppeusemathstyleparameter stoppeuserdata stoppeusingbtxspecification stoppeva stoppevbox \
-stoppevboxregister stoppevboxtohbox stoppevboxtohboxseparator stoppeviewerlayer stoppevtop \
-stoppevtopregister stoppexcell stoppexcellgroup stoppexcolumn stoppexgroup \
-stoppexmldisplayverbatim stoppexmlinlineverbatim stoppexmlraw stoppexmlsetups stoppexrow \
-stoppexrowgroup stoppextable stoppextablebody stoppextablefoot stoppextablehead \
-stoppextablenext symbole tapebuffer textenotepdp traduire \
-traiteblocs traitfin traitsfins uneligne utiliseJSscripts \
-utiliseURL utiliseblocs utilisechemin utilisedocumentexterne utilisefigureexterne \
-utilisemodule utilisepsiteaudioexterne utilisesymboles utiliseurl va \
-vaalaboite vaalapage vaenbas valeurcouleur vide
+stoppecolorset stoppecolumns stoppecolumnset stoppecolumnsetspan stoppecombination \
+stoppecomment stoppecomposant stoppecontextcode stoppecontextdefinitioncode stoppecouleur \
+stoppectxfunction stoppectxfunctiondefinition stoppecurrentcolor stoppecurrentlistentrywrapper stoppedelimited \
+stoppedelimitedtext stoppedisplaymath stoppedmath stoppedocument stoppeeffect \
+stoppeelement stoppeembeddedxtable stoppeendnote stoppeendofline stoppeenvironement \
+stoppeexceptions stoppeexpanded stoppeexpandedcollect stoppeextendedcatcodetable stoppeexternalfigurecollection \
+stoppefacingfloat stoppefact stoppefigure stoppefiguretext stoppefittingpage \
+stoppefixed stoppefloatcombination stoppefont stoppefontclass stoppefontsolution \
+stoppefootnote stoppeformula stoppeformulas stoppeframed stoppeframedcell \
+stoppeframedcontent stoppeframedrow stoppeframedtable stoppeframedtext stoppefrontmatter \
+stoppegraphictext stoppegridsnapping stoppegroupe stoppehanging stoppehbox \
+stoppehboxestohbox stoppehboxregister stoppeheadtext stoppehelptext stoppehiding \
+stoppehighlight stoppehyphenation stoppeimath stoppeindentation stoppeindentedtext \
+stoppeinteraction stoppeinterface stoppeintermezzotext stoppeintertext stoppeitemgroup \
+stoppeitemgroupcolumns stoppeitemize stoppeknockout stoppelabeltext stoppelangue \
+stoppelayout stoppelegend stoppeligne stoppeligneregleetexte stoppelinealignment \
+stoppelinecorrection stoppelinefiller stoppelinenumbering stoppelines stoppelinetable \
+stoppelinetablebody stoppelinetablecell stoppelinetablehead stoppelocalfootnotes stoppelocalheadsetup \
+stoppelocallinecorrection stoppelocalnotes stoppelocalsetups stoppelua stoppeluacode \
+stoppeluaparameterset stoppeluasetups stoppemakeup stoppemargereglee stoppemarginblock \
+stoppemarkedcontent stoppemarkpages stoppemathalignment stoppemathcases stoppemathlabeltext \
+stoppemathmatrix stoppemathmode stoppemathstyle stoppematrices stoppematrix \
+stoppemaxaligned stoppemdformula stoppemenuinteraction stoppemiddlealigned stoppemiddlemakeup \
+stoppemixedcolumns stoppemode stoppemodeset stoppemodule stoppemoduletestsection \
+stoppempformula stoppenamedsection stoppenamedsubformulas stoppenarrow stoppenarrower \
+stoppenegative stoppenicelyfilledbox stoppenointerference stoppenotallmodes stoppenotext \
+stoppenotmode stoppeoperatortext stoppeopposite stoppeoutputstream stoppeoverlay \
+stoppeoverprint stoppepagecolumns stoppepagecomment stoppepagefigure stoppepagelayout \
+stoppepagemakeup stoppepar stoppeparagraph stoppeparagraphs stoppeparagraphscell \
+stoppeparbuilder stoppepart stoppepath stoppeplacechemical stoppeplacefigure \
+stoppeplaceflottant stoppeplaceformule stoppeplacegraphic stoppeplaceintermezzo stoppeplacelegend \
+stoppeplacepairedbox stoppeplacetable stoppepositioning stoppepositionoverlay stoppepositive \
+stoppepostponing stoppepostponingnotes stoppeprefixtext stoppeprocessassignmentcommand stoppeprocessassignmentlist \
+stoppeprocesscommacommand stoppeprocesscommalist stoppeproduit stoppeprojet stoppeprotect \
+stoppeprotectedcolors stoppepublication stoppepunctuation stoppequotation stoppequote \
+stopperandomized stopperandomseed stopperawsetups stoppereadingfile stoppereferenceprefix \
+stopperegime stoppereusableMPgraphic stopperuby stoppescript stoppesdformula \
+stoppesection stoppesectionblock stoppesectionblockenvironment stoppesectionlevel stoppesetups \
+stoppeshapebox stoppeshift stoppesidebar stoppesimplecolumns stoppespecialitem \
+stoppespeech stoppespformula stoppesplitformula stoppesplittext stoppespread \
+stoppestandardmakeup stoppestaticMPfigure stoppestaticMPgraphic stoppestrictinspectnextcharacter stoppestrut \
+stoppestyle stoppesubformulas stoppesubject stoppesubjectlevel stoppesubsection \
+stoppesubsentence stoppesubstack stoppesubsubject stoppesubsubsection stoppesubsubsubject \
+stoppesubsubsubsection stoppesubsubsubsubject stoppesubsubsubsubsection stoppesubsubsubsubsubject stoppesuffixtext \
+stoppesymbolset stoppetable stoppetablehead stoppetables stoppetabletail \
+stoppetabletext stoppetabulate stoppetabulatehead stoppetabulatetail stoppetagged \
+stoppetaglabeltext stoppetete stoppetexcode stoppetexdefinition stoppetext \
+stoppetextbackground stoppetextbackgroundmanual stoppetextcolor stoppetextcolorintent stoppetextflow \
+stoppetextmakeup stoppetitle stoppetokenlist stoppetokens stoppetransparent \
+stoppetypescript stoppetypescriptcollection stoppetyping stoppeuniqueMPgraphic stoppeuniqueMPpagegraphic \
+stoppeunittext stoppeunpacked stoppeusableMPgraphic stoppeuseMPgraphic stoppeusemathstyleparameter \
+stoppeuserdata stoppeusingbtxspecification stoppeva stoppevbox stoppevboxregister \
+stoppevboxtohbox stoppevboxtohboxseparator stoppeviewerlayer stoppevtop stoppevtopregister \
+stoppexcell stoppexcellgroup stoppexcolumn stoppexgroup stoppexmldisplayverbatim \
+stoppexmlinlineverbatim stoppexmlraw stoppexmlsetups stoppexrow stoppexrowgroup \
+stoppextable stoppextablebody stoppextablefoot stoppextablehead stoppextablenext \
+symbole tapebuffer textenotepdp traduire traiteblocs \
+traitfin traitsfins uneligne utiliseJSscripts utiliseURL \
+utiliseblocs utilisechemin utilisedocumentexterne utilisefigureexterne utilisemodule \
+utilisepsiteaudioexterne utilisesymboles utiliseurl va vaalaboite \
+vaalapage vaenbas valeurcouleur vide
keywordclass.context.it=\
GIORNOSETTIMANA Lettera Lettere MESE \
@@ -1617,31 +1624,31 @@ impostafondo impostafontdeltesto impostaforms impostaformule impostagruppocolonn
impostaincorniciato impostainiziatermina impostainstestazione impostainterazione impostainterlinea \
impostalayout impostalineemargine impostalineenere impostalineeriempimento impostalineesottili \
impostalineetesto impostalingua impostamaiuscole impostamakeup impostamarcatura \
-impostamenuinterazione impostamenzione impostanumerazionecapoversi impostanumerazionepagina impostanumerazionerighe \
-impostanumeropagina impostanumerosottopagina impostanumerotesta impostaoggettimobili impostaoggettomobile \
-impostaordinamento impostaparranging impostapdp impostapiustretto impostaposizionamento \
-impostaposizionamentoopposti impostaprogrammi impostaregistro impostarientro impostariferimento \
-impostarighe impostarigheriempimento impostarigovuoto impostarotazione impostaschermointerazione \
-impostasegnosillabazione impostasetsimboli impostasfondi impostasfondo impostasinonimi \
-impostaspaziatura impostaspaziobianco impostaspezzamentooggettomobile impostatabelle impostatabulato \
-impostatavolozza impostatesta impostateste impostatesticima impostatestifondo \
-impostatestiincorniciati impostatestiintestazioni impostatestipdp impostatesto impostatestotesti \
-impostatolleranza impostatransizionepagina impostatype impostatyping impostaurl \
-incorniciato iniziaJScode iniziaJSpreamble iniziaLUA iniziaMP \
-iniziaMPclip iniziaMPcode iniziaMPdefinitions iniziaMPdrawing iniziaMPenvironment \
-iniziaMPextensions iniziaMPinclusions iniziaMPinitializations iniziaMPpage iniziaMPpositiongraphic \
-iniziaMPpositionmethod iniziaMPrun iniziaPARSEDXML iniziaTABLE iniziaTABLEbody \
-iniziaTABLEfoot iniziaTABLEhead iniziaTABLEnext iniziaTC iniziaTD \
-iniziaTDs iniziaTEX iniziaTEXpage iniziaTH iniziaTN \
-iniziaTR iniziaTRs iniziaTX iniziaTY iniziaXML \
-iniziaalign iniziaalignment iniziaallineacentro iniziaallineadestra iniziaallineasinistra \
-iniziaallmodes iniziaambiente iniziaappendices iniziaarrangedpages iniziaaside \
-iniziaattachment iniziabackmatter iniziabar iniziabbordermatrix iniziabitmapimage \
-iniziablockquote iniziabodymatter iniziabordermatrix iniziaboxedcolumns iniziabtxlabeltext \
-iniziabtxrenderingdefinitions iniziabuffer iniziacases iniziacatcodetable iniziacenteraligned \
-iniziachapter iniziacharacteralign iniziacheckedfences iniziachemical iniziachemicaltext \
-iniziacollect iniziacollecting iniziacolore iniziacolorintent iniziacoloronly \
-iniziacolorset iniziacolumns iniziacolumnset iniziacolumnsetspan iniziacolumnspan \
+impostamenuinterazione impostamenzione impostanotepdp impostanumerazionecapoversi impostanumerazionepagina \
+impostanumerazionerighe impostanumeropagina impostanumerosottopagina impostanumerotesta impostaoggettimobili \
+impostaoggettomobile impostaordinamento impostaparranging impostapdp impostapiustretto \
+impostaposizionamento impostaposizionamentoopposti impostaprogrammi impostaregistro impostarientro \
+impostariferimento impostarighe impostarigheriempimento impostarigovuoto impostarotazione \
+impostaschermointerazione impostasegnosillabazione impostasetsimboli impostasfondi impostasfondo \
+impostasinonimi impostaspaziatura impostaspaziobianco impostaspezzamentooggettomobile impostatabelle \
+impostatabulato impostatavolozza impostatesta impostateste impostatesticima \
+impostatestifondo impostatestiincorniciati impostatestiintestazioni impostatestipdp impostatesto \
+impostatestotesti impostatolleranza impostatransizionepagina impostatype impostatyping \
+impostaurl incorniciato iniziaJScode iniziaJSpreamble iniziaLUA \
+iniziaMP iniziaMPclip iniziaMPcode iniziaMPdefinitions iniziaMPdrawing \
+iniziaMPenvironment iniziaMPextensions iniziaMPinclusions iniziaMPinitializations iniziaMPpage \
+iniziaMPpositiongraphic iniziaMPpositionmethod iniziaMPrun iniziaPARSEDXML iniziaTABLE \
+iniziaTABLEbody iniziaTABLEfoot iniziaTABLEhead iniziaTABLEnext iniziaTC \
+iniziaTD iniziaTDs iniziaTEX iniziaTEXpage iniziaTH \
+iniziaTN iniziaTR iniziaTRs iniziaTX iniziaTY \
+iniziaXML iniziaalign iniziaalignment iniziaallineacentro iniziaallineadestra \
+iniziaallineasinistra iniziaallmodes iniziaambiente iniziaappendices iniziaarrangedpages \
+iniziaaside iniziaattachment iniziabackmatter iniziabar iniziabbordermatrix \
+iniziabitmapimage iniziablockquote iniziabodymatter iniziabordermatrix iniziaboxedcolumns \
+iniziabtxlabeltext iniziabtxrenderingdefinitions iniziabuffer iniziacases iniziacatcodetable \
+iniziacenteraligned iniziachapter iniziacharacteralign iniziacheckedfences iniziachemical \
+iniziachemicaltext iniziacollect iniziacollecting iniziacolore iniziacolorintent \
+iniziacoloronly iniziacolorset iniziacolumns iniziacolumnset iniziacolumnsetspan \
iniziacombination iniziacomment iniziacomponenet iniziacontextcode iniziacontextdefinitioncode \
iniziactxfunction iniziactxfunctiondefinition iniziacurrentcolor iniziacurrentlistentrywrapper iniziadelimited \
iniziadelimitedtext iniziadisplaymath iniziadmath iniziadocument iniziaeffect \
@@ -1731,66 +1738,66 @@ terminabordermatrix terminaboxedcolumns terminabtxlabeltext terminabtxrenderingd
terminacases terminacatcodetable terminacenteraligned terminachapter terminacharacteralign \
terminacheckedfences terminachemical terminachemicaltext terminacollect terminacollecting \
terminacolore terminacolorintent terminacoloronly terminacolorset terminacolumns \
-terminacolumnset terminacolumnsetspan terminacolumnspan terminacombination terminacomment \
-terminacomponenet terminacontextcode terminacontextdefinitioncode terminactxfunction terminactxfunctiondefinition \
-terminacurrentcolor terminacurrentlistentrywrapper terminadelimited terminadelimitedtext terminadisplaymath \
-terminadmath terminadocument terminaeffect terminaelement terminaelemento \
-terminaembeddedxtable terminaendnote terminaendofline terminaexceptions terminaexpanded \
-terminaexpandedcollect terminaextendedcatcodetable terminaexternalfigurecollection terminafacingfloat terminafact \
-terminafigure terminafiguretext terminafittingpage terminafixed terminafloatcombination \
-terminafont terminafontclass terminafontsolution terminafootnote terminaformula \
-terminaformulas terminaframedcell terminaframedcontent terminaframedrow terminaframedtable \
-terminaframedtext terminafrontmatter terminagraphictext terminagridsnapping terminahanging \
-terminahbox terminahboxestohbox terminahboxregister terminaheadtext terminahelptext \
-terminahiding terminahighlight terminahyphenation terminaimath terminaimpaccato \
-terminaincorniciato terminaindentation terminaindentedtext terminainteraction terminainterface \
-terminaintermezzotext terminaintertext terminaitemgroup terminaitemgroupcolumns terminaitemize \
-terminaknockout terminalabeltext terminalayout terminalegend terminalinealignment \
-terminalineamargine terminalineatesto terminalinecorrection terminalinefiller terminalinenumbering \
-terminalines terminalinetable terminalinetablebody terminalinetablecell terminalinetablehead \
-terminalingua terminalocalfootnotes terminalocalheadsetup terminalocallinecorrection terminalocalnotes \
-terminalocalsetups terminalua terminaluacode terminaluaparameterset terminaluasetups \
-terminamakeup terminamarginblock terminamarkedcontent terminamarkpages terminamathalignment \
-terminamathcases terminamathlabeltext terminamathmatrix terminamathmode terminamathstyle \
-terminamatrices terminamatrix terminamaxaligned terminamdformula terminamenuinterattivo \
-terminamettiformula terminamiddlealigned terminamiddlemakeup terminamixedcolumns terminamode \
-terminamodeset terminamodule terminamoduletestsection terminampformula terminanamedsection \
-terminanamedsubformulas terminanarrow terminanarrower terminanegative terminanicelyfilledbox \
-terminanointerference terminanotallmodes terminanotext terminanotmode terminaoperatortext \
-terminaopposite terminaoutputstream terminaoverlay terminaoverprint terminapagecolumns \
-terminapagecomment terminapagefigure terminapagelayout terminapagemakeup terminapar \
-terminaparagraph terminaparagraphs terminaparagraphscell terminaparbuilder terminapart \
-terminapath terminaplacechemical terminaplacefigure terminaplacefloat terminaplacegraphic \
-terminaplaceintermezzo terminaplacelegend terminaplacepairedbox terminaplacetable terminapositioning \
-terminapositionoverlay terminapositive terminapostponing terminapostponingnotes terminaprefixtext \
-terminaprocessassignmentcommand terminaprocessassignmentlist terminaprocesscommacommand terminaprocesscommalist terminaprodotto \
-terminaprogetto terminaprotect terminaprotectedcolors terminapubblicazione terminapunctuation \
-terminaquotation terminaquote terminarandomized terminarandomseed terminarawsetups \
-terminareadingfile terminareferenceprefix terminaregime terminareusableMPgraphic terminariga \
-terminaruby terminascript terminasdformula terminasection terminasectionblock \
-terminasectionblockenvironment terminasectionlevel terminasetups terminasfondo terminashapebox \
-terminashift terminasidebar terminasimplecolumns terminaspecialitem terminaspeech \
-terminaspformula terminasplitformula terminasplittext terminaspread terminastandardmakeup \
-terminastaticMPfigure terminastaticMPgraphic terminastrictinspectnextcharacter terminastrut terminastyle \
-terminasubformulas terminasubject terminasubjectlevel terminasubsection terminasubsentence \
-terminasubstack terminasubsubject terminasubsubsection terminasubsubsubject terminasubsubsubsection \
-terminasubsubsubsubject terminasubsubsubsubsection terminasubsubsubsubsubject terminasuffixtext terminasymbolset \
-terminatable terminatablehead terminatables terminatabletail terminatabletext \
-terminatabulate terminatabulatehead terminatabulatetail terminatagged terminataglabeltext \
-terminatesta terminatexcode terminatexdefinition terminatext terminatextbackground \
-terminatextbackgroundmanual terminatextcolor terminatextcolorintent terminatextflow terminatextmakeup \
-terminatitle terminatokenlist terminatokens terminatransparent terminatypescript \
-terminatypescriptcollection terminatyping terminauniqueMPgraphic terminauniqueMPpagegraphic terminaunittext \
-terminaunpacked terminausableMPgraphic terminauseMPgraphic terminausemathstyleparameter terminauserdata \
-terminausingbtxspecification terminavaia terminavbox terminavboxregister terminavboxtohbox \
-terminavboxtohboxseparator terminaviewerlayer terminavtop terminavtopregister terminaxcell \
-terminaxcellgroup terminaxcolumn terminaxgroup terminaxmldisplayverbatim terminaxmlinlineverbatim \
-terminaxmlraw terminaxmlsetups terminaxrow terminaxrowgroup terminaxtable \
-terminaxtablebody terminaxtablefoot terminaxtablehead terminaxtablenext testonotapdp \
-testoriempimento tieniblocchi traduci usaJSscripts usaURL \
-usablocco usacartella usacolonnasonoraesterna usadocumentoesterno usafiguraesterna \
-usamodulo usasimboli usaurl vaia vaiabox \
-vaiapagina vaigiu valorecolore versione
+terminacolumnset terminacolumnsetspan terminacombination terminacomment terminacomponenet \
+terminacontextcode terminacontextdefinitioncode terminactxfunction terminactxfunctiondefinition terminacurrentcolor \
+terminacurrentlistentrywrapper terminadelimited terminadelimitedtext terminadisplaymath terminadmath \
+terminadocument terminaeffect terminaelement terminaelemento terminaembeddedxtable \
+terminaendnote terminaendofline terminaexceptions terminaexpanded terminaexpandedcollect \
+terminaextendedcatcodetable terminaexternalfigurecollection terminafacingfloat terminafact terminafigure \
+terminafiguretext terminafittingpage terminafixed terminafloatcombination terminafont \
+terminafontclass terminafontsolution terminafootnote terminaformula terminaformulas \
+terminaframedcell terminaframedcontent terminaframedrow terminaframedtable terminaframedtext \
+terminafrontmatter terminagraphictext terminagridsnapping terminahanging terminahbox \
+terminahboxestohbox terminahboxregister terminaheadtext terminahelptext terminahiding \
+terminahighlight terminahyphenation terminaimath terminaimpaccato terminaincorniciato \
+terminaindentation terminaindentedtext terminainteraction terminainterface terminaintermezzotext \
+terminaintertext terminaitemgroup terminaitemgroupcolumns terminaitemize terminaknockout \
+terminalabeltext terminalayout terminalegend terminalinealignment terminalineamargine \
+terminalineatesto terminalinecorrection terminalinefiller terminalinenumbering terminalines \
+terminalinetable terminalinetablebody terminalinetablecell terminalinetablehead terminalingua \
+terminalocalfootnotes terminalocalheadsetup terminalocallinecorrection terminalocalnotes terminalocalsetups \
+terminalua terminaluacode terminaluaparameterset terminaluasetups terminamakeup \
+terminamarginblock terminamarkedcontent terminamarkpages terminamathalignment terminamathcases \
+terminamathlabeltext terminamathmatrix terminamathmode terminamathstyle terminamatrices \
+terminamatrix terminamaxaligned terminamdformula terminamenuinterattivo terminamettiformula \
+terminamiddlealigned terminamiddlemakeup terminamixedcolumns terminamode terminamodeset \
+terminamodule terminamoduletestsection terminampformula terminanamedsection terminanamedsubformulas \
+terminanarrow terminanarrower terminanegative terminanicelyfilledbox terminanointerference \
+terminanotallmodes terminanotext terminanotmode terminaoperatortext terminaopposite \
+terminaoutputstream terminaoverlay terminaoverprint terminapagecolumns terminapagecomment \
+terminapagefigure terminapagelayout terminapagemakeup terminapar terminaparagraph \
+terminaparagraphs terminaparagraphscell terminaparbuilder terminapart terminapath \
+terminaplacechemical terminaplacefigure terminaplacefloat terminaplacegraphic terminaplaceintermezzo \
+terminaplacelegend terminaplacepairedbox terminaplacetable terminapositioning terminapositionoverlay \
+terminapositive terminapostponing terminapostponingnotes terminaprefixtext terminaprocessassignmentcommand \
+terminaprocessassignmentlist terminaprocesscommacommand terminaprocesscommalist terminaprodotto terminaprogetto \
+terminaprotect terminaprotectedcolors terminapubblicazione terminapunctuation terminaquotation \
+terminaquote terminarandomized terminarandomseed terminarawsetups terminareadingfile \
+terminareferenceprefix terminaregime terminareusableMPgraphic terminariga terminaruby \
+terminascript terminasdformula terminasection terminasectionblock terminasectionblockenvironment \
+terminasectionlevel terminasetups terminasfondo terminashapebox terminashift \
+terminasidebar terminasimplecolumns terminaspecialitem terminaspeech terminaspformula \
+terminasplitformula terminasplittext terminaspread terminastandardmakeup terminastaticMPfigure \
+terminastaticMPgraphic terminastrictinspectnextcharacter terminastrut terminastyle terminasubformulas \
+terminasubject terminasubjectlevel terminasubsection terminasubsentence terminasubstack \
+terminasubsubject terminasubsubsection terminasubsubsubject terminasubsubsubsection terminasubsubsubsubject \
+terminasubsubsubsubsection terminasubsubsubsubsubject terminasuffixtext terminasymbolset terminatable \
+terminatablehead terminatables terminatabletail terminatabletext terminatabulate \
+terminatabulatehead terminatabulatetail terminatagged terminataglabeltext terminatesta \
+terminatexcode terminatexdefinition terminatext terminatextbackground terminatextbackgroundmanual \
+terminatextcolor terminatextcolorintent terminatextflow terminatextmakeup terminatitle \
+terminatokenlist terminatokens terminatransparent terminatypescript terminatypescriptcollection \
+terminatyping terminauniqueMPgraphic terminauniqueMPpagegraphic terminaunittext terminaunpacked \
+terminausableMPgraphic terminauseMPgraphic terminausemathstyleparameter terminauserdata terminausingbtxspecification \
+terminavaia terminavbox terminavboxregister terminavboxtohbox terminavboxtohboxseparator \
+terminaviewerlayer terminavtop terminavtopregister terminaxcell terminaxcellgroup \
+terminaxcolumn terminaxgroup terminaxmldisplayverbatim terminaxmlinlineverbatim terminaxmlraw \
+terminaxmlsetups terminaxrow terminaxrowgroup terminaxtable terminaxtablebody \
+terminaxtablefoot terminaxtablehead terminaxtablenext testonotapdp testoriempimento \
+tieniblocchi traduci usaJSscripts usaURL usablocco \
+usacartella usacolonnasonoraesterna usadocumentoesterno usafiguraesterna usamodulo \
+usasimboli usaurl vaia vaiabox vaiapagina \
+vaigiu valorecolore versione
keywordclass.context.nl=\
Cijfers Kap Letter Letters \
@@ -1859,21 +1866,21 @@ stelspatieringin stelstartstopin stelsubpaginanummerin stelsymboolsetin stelsyno
steltaalin steltabellenin steltabulatiein steltekstachtergrondin steltekstin \
steltekstinhoudin steltekstlijnenin stelteksttekstenin steltolerantiein steltypein \
steltypenin steluitlijnenin stelurlin stelveldenin stelveldin \
-stelvoetin stelvoettekstenin stelwiskundeuitlijnenin stelwitruimtein stopachtergrond \
-stopinteractiemenu stopkantlijn stopkleur stopkop stoplokalevoetnoten \
-stopmargeblok stopnaar stopomgeving stopomlijnd stoponderdeel \
-stopopelkaar stopplaatsformule stopplaatsplaatsblok stopprodukt stopprojekt \
-stoppublicatie stopregel stopregelcorrectie stopregellinks stopregelmidden \
-stopregelrechts stopsom stoptaal stoptekstachtergrond stoptekstlijn \
-stopuitlijnen subpaginanummer switchnaarkorps symbool taal \
-tekstlijn tekstreferentie testkolom testpagina toelichting \
-toongrid tooninstellingen toonkader toonkleur toonkleurgroep \
-toonkorps toonkorpsomgeving toonlayout toonopmaak toonpalet \
-toonprint toonstruts toonsymboolset uit uitgerekt \
-vastespatie vastespaties veld veldstapel verbergblokken \
-vergelijkkleurgroep vergelijkpalet versie vertaal verwerkblokken \
-voetnoottekst volledigepaginanummer volledigregister voluit weekdag \
-wiskunde woordrechts
+stelvoetin stelvoetnotenin stelvoettekstenin stelwiskundeuitlijnenin stelwitruimtein \
+stopachtergrond stopinteractiemenu stopkantlijn stopkleur stopkop \
+stoplokalevoetnoten stopmargeblok stopnaar stopomgeving stopomlijnd \
+stoponderdeel stopopelkaar stopplaatsformule stopplaatsplaatsblok stopprodukt \
+stopprojekt stoppublicatie stopregel stopregelcorrectie stopregellinks \
+stopregelmidden stopregelrechts stopsom stoptaal stoptekstachtergrond \
+stoptekstlijn stopuitlijnen subpaginanummer switchnaarkorps symbool \
+taal tekstlijn tekstreferentie testkolom testpagina \
+toelichting toongrid tooninstellingen toonkader toonkleur \
+toonkleurgroep toonkorps toonkorpsomgeving toonlayout toonopmaak \
+toonpalet toonprint toonstruts toonsymboolset uit \
+uitgerekt vastespatie vastespaties veld veldstapel \
+verbergblokken vergelijkkleurgroep vergelijkpalet versie vertaal \
+verwerkblokken voetnoottekst volledigepaginanummer volledigregister voluit \
+weekdag wiskunde woordrechts
keywordclass.context.pe=\
آیتم آیتمها آینه از \
@@ -1897,52 +1904,52 @@ keywordclass.context.pe=\
بارگذاری‌متن‌متنها بارگذاری‌متن‌پانوشت بارگذاری‌متن‌پایین بارگذاری‌مجموعه‌ستون بارگذاری‌مجموعه‌نماد \
بارگذاری‌منوی‌پانل بارگذاری‌مکان‌گذاری بارگذاری‌میدان بارگذاری‌میدانها بارگذاری‌میله‌پانل \
بارگذاری‌نشانه‌شکستن بارگذاری‌نشانه‌گذاری بارگذاری‌نقل بارگذاری‌پاراگراÙها بارگذاری‌پانل \
-بارگذاری‌پایین بارگذاری‌پرده‌پانل بارگذاری‌پرکردن‌خطها بارگذاری‌پس‌زمینه بارگذاری‌پس‌زمینه‌ها \
-بارگذاری‌چیدن بارگذاری‌گذارصÙحه بارگذاری‌گروههای‌آیتم بارگذاری‌گروه‌آیتم بازنشانی‌نشانه‌گذاری \
-بدون‌خط‌بالاوپایین بدون‌خط‌سروته‌برگ بدون‌Ùضا برنامه بروبه \
-بروبه‌جعبه بروبه‌صÙحه بروپایین بلند بلوکهای‌پردازش \
-بلوکها‌پنهان بنویس‌بین‌لیست بنویس‌در‌لیست تاریخ تاریخ‌جاری \
-تایپ تایپ‌باÙر تایپ‌پرونده ترجمه تعری٠\
-تعریÙ‌آرایش تعریÙ‌الگوی‌جدول تعریÙ‌اندازه‌برگ تعریÙ‌باÙر تعریÙ‌بخش \
-تعریÙ‌برنامه تعریÙ‌برچسب تعریÙ‌بلوک تعریÙ‌بلوک‌بخش تعریÙ‌تایپ \
-تعریÙ‌تایپ‌کردن تعریÙ‌تبدیل تعریÙ‌ترتیب تعریÙ‌ترکیب تعریÙ‌تنظیم‌ریاضی \
-تعریÙ‌توده‌میدان تعریÙ‌ثبت تعریÙ‌جانشانی تعریÙ‌جدول‌بندی تعریÙ‌جعبه‌‌اÙÙ‚ÛŒ \
-تعریÙ‌حر٠تعریÙ‌رنگ تعریÙ‌زیرمیدان تعریÙ‌سبک تعریÙ‌سبک‌قلم \
-تعریÙ‌سر تعریÙ‌شرح تعریÙ‌شروع‌پایان تعریÙ‌شماره‌بندی تعریÙ‌شمایل‌مرجع \
-تعریÙ‌شناور تعریÙ‌شکستن‌ستون تعریÙ‌شکست‌صÙحه تعریÙ‌طرح‌بندی تعریÙ‌Ùرمان \
-تعریÙ‌قالبی تعریÙ‌قلم تعریÙ‌قلم‌متن تعریÙ‌لایه تعریÙ‌لهجه \
-تعریÙ‌لوح تعریÙ‌لیست تعریÙ‌لیست‌ترکیبی تعریÙ‌مترادÙها تعریÙ‌مترادÙ‌قلم \
-تعریÙ‌متن تعریÙ‌متن‌قالبی تعریÙ‌مجموعه‌ستون تعریÙ‌محیط‌قلم‌بدنه تعریÙ‌مرجع \
-تعریÙ‌منوی‌پانل تعریÙ‌میدان تعریÙ‌نشانه‌گذاری تعریÙ‌نماد تعریÙ‌نمادشکل \
-تعریÙ‌پاراگراÙها تعریÙ‌پروÙایل تعریÙ‌پوشش تعریÙ‌گروه‌آیتم تعریÙ‌گروه‌رنگ \
-تعیین‌شماره‌سر تعیین‌محتوای‌متن تعیین‌مشخصات‌ثبت تعیین‌مشخصات‌لیست تغییربه‌قلم‌بدنه \
-تنظیم‌راست تنظیم‌طرح‌بندی تنظیم‌وسط توجه توری \
-تولید تک ثبت‌کامل حر٠حرÙها \
-Ø­Ùظ‌بلوکها خالی خطهای‌سیاه خطهای‌نازک خطها‌خالی \
-خط‌سیاه خط‌متن خط‌مو خط‌نازک خ‌ا \
-خ‌ع در درج‌ثبت درج‌درخط درج‌درخطها \
-درج‌درمتن درج‌در‌بالای‌یکدیگر درج‌در‌توری درج‌زیرÙرمول درج‌شماره‌سر \
-درج‌شماره‌صÙحه درج‌شناور درج‌Ùرمول درج‌لیست درج‌لیست‌خام \
-درج‌لیست‌مختلط درج‌متن‌سر درج‌پانوشتها درج‌پانوشتهای‌موضعی درج‌چوب‌خط \
-درج‌کنار‌به‌کنار درخط درصÙحه درقالبی درمورد \
-درون درپر دریاÙت‌باÙر دریاÙت‌نشانه دوران \
-دکمه دکمه‌منو دکمه‌پانل رج رنگ \
-رنگ‌خاکستری روزهÙته ریاضی زبان زبان‌اصلی \
-ستون ستون‌امتحان سرپوش‌کوچک‌نه شروعJScode شروعJSpreamble \
-شروعLUA شروعMP شروعMPclip شروعMPcode شروعMPdefinitions \
-شروعMPdrawing شروعMPenvironment شروعMPextensions شروعMPinclusions شروعMPinitializations \
-شروعMPpage شروعMPpositiongraphic شروعMPpositionmethod شروعMPrun شروعPARSEDXML \
-شروعTABLE شروعTABLEbody شروعTABLEfoot شروعTABLEhead شروعTABLEnext \
-شروعTC شروعTD شروعTDs شروعTEX شروعTEXpage \
-شروعTH شروعTN شروعTR شروعTRs شروعTX \
-شروعTY شروعXML شروعalign شروعalignment شروعallmodes \
-شروعappendices شروعarrangedpages شروعaside شروعattachment شروعbackmatter \
-شروعbar شروعbbordermatrix شروعbitmapimage شروعblockquote شروعbodymatter \
-شروعbordermatrix شروعboxedcolumns شروعbtxlabeltext شروعbtxrenderingdefinitions شروعbuffer \
-شروعcases شروعcatcodetable شروعcenteraligned شروعchapter شروعcharacteralign \
-شروعcheckedfences شروعchemical شروعchemicaltext شروعcollect شروعcollecting \
-شروعcolorintent شروعcoloronly شروعcolorset شروعcolumns شروعcolumnset \
-شروعcolumnsetspan شروعcolumnspan شروعcombination شروعcomment شروعcontextcode \
+بارگذاری‌پانوشتها بارگذاری‌پایین بارگذاری‌پرده‌پانل بارگذاری‌پرکردن‌خطها بارگذاری‌پس‌زمینه \
+بارگذاری‌پس‌زمینه‌ها بارگذاری‌چیدن بارگذاری‌گذارصÙحه بارگذاری‌گروههای‌آیتم بارگذاری‌گروه‌آیتم \
+بازنشانی‌نشانه‌گذاری بدون‌خط‌بالاوپایین بدون‌خط‌سروته‌برگ بدون‌Ùضا برنامه \
+بروبه بروبه‌جعبه بروبه‌صÙحه بروپایین بلند \
+بلوکهای‌پردازش بلوکها‌پنهان بنویس‌بین‌لیست بنویس‌در‌لیست تاریخ \
+تاریخ‌جاری تایپ تایپ‌باÙر تایپ‌پرونده ترجمه \
+تعری٠تعریÙ‌آرایش تعریÙ‌الگوی‌جدول تعریÙ‌اندازه‌برگ تعریÙ‌باÙر \
+تعریÙ‌بخش تعریÙ‌برنامه تعریÙ‌برچسب تعریÙ‌بلوک تعریÙ‌بلوک‌بخش \
+تعریÙ‌تایپ تعریÙ‌تایپ‌کردن تعریÙ‌تبدیل تعریÙ‌ترتیب تعریÙ‌ترکیب \
+تعریÙ‌تنظیم‌ریاضی تعریÙ‌توده‌میدان تعریÙ‌ثبت تعریÙ‌جانشانی تعریÙ‌جدول‌بندی \
+تعریÙ‌جعبه‌‌اÙÙ‚ÛŒ تعریÙ‌حر٠تعریÙ‌رنگ تعریÙ‌زیرمیدان تعریÙ‌سبک \
+تعریÙ‌سبک‌قلم تعریÙ‌سر تعریÙ‌شرح تعریÙ‌شروع‌پایان تعریÙ‌شماره‌بندی \
+تعریÙ‌شمایل‌مرجع تعریÙ‌شناور تعریÙ‌شکستن‌ستون تعریÙ‌شکست‌صÙحه تعریÙ‌طرح‌بندی \
+تعریÙ‌Ùرمان تعریÙ‌قالبی تعریÙ‌قلم تعریÙ‌قلم‌متن تعریÙ‌لایه \
+تعریÙ‌لهجه تعریÙ‌لوح تعریÙ‌لیست تعریÙ‌لیست‌ترکیبی تعریÙ‌مترادÙها \
+تعریÙ‌مترادÙ‌قلم تعریÙ‌متن تعریÙ‌متن‌قالبی تعریÙ‌مجموعه‌ستون تعریÙ‌محیط‌قلم‌بدنه \
+تعریÙ‌مرجع تعریÙ‌منوی‌پانل تعریÙ‌میدان تعریÙ‌نشانه‌گذاری تعریÙ‌نماد \
+تعریÙ‌نمادشکل تعریÙ‌پاراگراÙها تعریÙ‌پروÙایل تعریÙ‌پوشش تعریÙ‌گروه‌آیتم \
+تعریÙ‌گروه‌رنگ تعیین‌شماره‌سر تعیین‌محتوای‌متن تعیین‌مشخصات‌ثبت تعیین‌مشخصات‌لیست \
+تغییربه‌قلم‌بدنه تنظیم‌راست تنظیم‌طرح‌بندی تنظیم‌وسط توجه \
+توری تولید تک ثبت‌کامل حر٠\
+حرÙها Ø­Ùظ‌بلوکها خالی خطهای‌سیاه خطهای‌نازک \
+خطها‌خالی خط‌سیاه خط‌متن خط‌مو خط‌نازک \
+خ‌ا خ‌ع در درج‌ثبت درج‌درخط \
+درج‌درخطها درج‌درمتن درج‌در‌بالای‌یکدیگر درج‌در‌توری درج‌زیرÙرمول \
+درج‌شماره‌سر درج‌شماره‌صÙحه درج‌شناور درج‌Ùرمول درج‌لیست \
+درج‌لیست‌خام درج‌لیست‌مختلط درج‌متن‌سر درج‌پانوشتها درج‌پانوشتهای‌موضعی \
+درج‌چوب‌خط درج‌کنار‌به‌کنار درخط درصÙحه درقالبی \
+درمورد درون درپر دریاÙت‌باÙر دریاÙت‌نشانه \
+دوران دکمه دکمه‌منو دکمه‌پانل رج \
+رنگ رنگ‌خاکستری روزهÙته ریاضی زبان \
+زبان‌اصلی ستون ستون‌امتحان سرپوش‌کوچک‌نه شروعJScode \
+شروعJSpreamble شروعLUA شروعMP شروعMPclip شروعMPcode \
+شروعMPdefinitions شروعMPdrawing شروعMPenvironment شروعMPextensions شروعMPinclusions \
+شروعMPinitializations شروعMPpage شروعMPpositiongraphic شروعMPpositionmethod شروعMPrun \
+شروعPARSEDXML شروعTABLE شروعTABLEbody شروعTABLEfoot شروعTABLEhead \
+شروعTABLEnext شروعTC شروعTD شروعTDs شروعTEX \
+شروعTEXpage شروعTH شروعTN شروعTR شروعTRs \
+شروعTX شروعTY شروعXML شروعalign شروعalignment \
+شروعallmodes شروعappendices شروعarrangedpages شروعaside شروعattachment \
+شروعbackmatter شروعbar شروعbbordermatrix شروعbitmapimage شروعblockquote \
+شروعbodymatter شروعbordermatrix شروعboxedcolumns شروعbtxlabeltext شروعbtxrenderingdefinitions \
+شروعbuffer شروعcases شروعcatcodetable شروعcenteraligned شروعchapter \
+شروعcharacteralign شروعcheckedfences شروعchemical شروعchemicaltext شروعcollect \
+شروعcollecting شروعcolorintent شروعcoloronly شروعcolorset شروعcolumns \
+شروعcolumnset شروعcolumnsetspan شروعcombination شروعcomment شروعcontextcode \
شروعcontextdefinitioncode شروعctxfunction شروعctxfunctiondefinition شروعcurrentcolor شروعcurrentlistentrywrapper \
شروعdelimited شروعdelimitedtext شروعdisplaymath شروعdmath شروعdocument \
شروعeffect شروعelement شروعembeddedxtable شروعendnote شروعendofline \
@@ -2024,65 +2031,65 @@ keywordclass.context.pe=\
پایانcatcodetable پایانcenteraligned پایانchapter پایانcharacteralign پایانcheckedfences \
پایانchemical پایانchemicaltext پایانcollect پایانcollecting پایانcolorintent \
پایانcoloronly پایانcolorset پایانcolumns پایانcolumnset پایانcolumnsetspan \
-پایانcolumnspan پایانcombination پایانcomment پایانcontextcode پایانcontextdefinitioncode \
-پایانctxfunction پایانctxfunctiondefinition پایانcurrentcolor پایانcurrentlistentrywrapper پایانdelimited \
-پایانdelimitedtext پایانdisplaymath پایانdmath پایانdocument پایانeffect \
-پایانelement پایانembeddedxtable پایانendnote پایانendofline پایانexceptions \
-پایانexpanded پایانexpandedcollect پایانextendedcatcodetable پایانexternalfigurecollection پایانfacingfloat \
-پایانfact پایانfigure پایانfiguretext پایانfittingpage پایانfixed \
-پایانfloatcombination پایانfont پایانfontclass پایانfontsolution پایانfootnote \
-پایانformula پایانformulas پایانframedcell پایانframedcontent پایانframedrow \
-پایانframedtable پایانframedtext پایانfrontmatter پایانgraphictext پایانgridsnapping \
-پایانhanging پایانhbox پایانhboxestohbox پایانhboxregister پایانheadtext \
-پایانhelptext پایانhiding پایانhighlight پایانhyphenation پایانimath \
-پایانindentation پایانindentedtext پایانinteraction پایانinterface پایانintermezzotext \
-پایانintertext پایانitemgroup پایانitemgroupcolumns پایانitemize پایانknockout \
-پایانlabeltext پایانlayout پایانlegend پایانlinealignment پایانlinecorrection \
-پایانlinefiller پایانlinenumbering پایانlines پایانlinetable پایانlinetablebody \
-پایانlinetablecell پایانlinetablehead پایانlocalfootnotes پایانlocalheadsetup پایانlocallinecorrection \
-پایانlocalnotes پایانlocalsetups پایانlua پایانluacode پایانluaparameterset \
-پایانluasetups پایانmakeup پایانmarginblock پایانmarkedcontent پایانmarkpages \
-پایانmathalignment پایانmathcases پایانmathlabeltext پایانmathmatrix پایانmathmode \
-پایانmathstyle پایانmatrices پایانmatrix پایانmaxaligned پایانmdformula \
-پایانmiddlealigned پایانmiddlemakeup پایانmixedcolumns پایانmode پایانmodeset \
-پایانmodule پایانmoduletestsection پایانmpformula پایانnamedsection پایانnamedsubformulas \
-پایانnarrow پایانnarrower پایانnegative پایانnicelyfilledbox پایانnointerference \
-پایانnotallmodes پایانnotext پایانnotmode پایانoperatortext پایانopposite \
-پایانoutputstream پایانoverlay پایانoverprint پایانpagecolumns پایانpagecomment \
-پایانpagefigure پایانpagelayout پایانpagemakeup پایانpar پایانparagraph \
-پایانparagraphs پایانparagraphscell پایانparbuilder پایانpart پایانpath \
-پایانplacechemical پایانplacefigure پایانplacegraphic پایانplaceintermezzo پایانplacelegend \
-پایانplacepairedbox پایانplacetable پایانpositioning پایانpositionoverlay پایانpositive \
-پایانpostponing پایانpostponingnotes پایانprefixtext پایانprocessassignmentcommand پایانprocessassignmentlist \
-پایانprocesscommacommand پایانprocesscommalist پایانprotect پایانprotectedcolors پایانpunctuation \
-پایانquotation پایانquote پایانrandomized پایانrandomseed پایانrawsetups \
-پایانreadingfile پایانreferenceprefix پایانregime پایانreusableMPgraphic پایانruby \
-پایانscript پایانsdformula پایانsection پایانsectionblock پایانsectionblockenvironment \
-پایانsectionlevel پایانsetups پایانshapebox پایانshift پایانsidebar \
-پایانsimplecolumns پایانspecialitem پایانspeech پایانspformula پایانsplitformula \
-پایانsplittext پایانspread پایانstandardmakeup پایانstaticMPfigure پایانstaticMPgraphic \
-پایانstrictinspectnextcharacter پایانstrut پایانstyle پایانsubformulas پایانsubject \
-پایانsubjectlevel پایانsubsection پایانsubsentence پایانsubstack پایانsubsubject \
-پایانsubsubsection پایانsubsubsubject پایانsubsubsubsection پایانsubsubsubsubject پایانsubsubsubsubsection \
-پایانsubsubsubsubsubject پایانsuffixtext پایانsymbolset پایانtable پایانtablehead \
-پایانtables پایانtabletail پایانtabletext پایانtabulate پایانtabulatehead \
-پایانtabulatetail پایانtagged پایانtaglabeltext پایانtexcode پایانtexdefinition \
-پایانtext پایانtextbackground پایانtextbackgroundmanual پایانtextcolor پایانtextcolorintent \
-پایانtextflow پایانtextmakeup پایانtitle پایانtokenlist پایانtokens \
-پایانtransparent پایانtypescript پایانtypescriptcollection پایانtyping پایانuniqueMPgraphic \
-پایانuniqueMPpagegraphic پایانunittext پایانunpacked پایانusableMPgraphic پایانuseMPgraphic \
-پایانusemathstyleparameter پایانuserdata پایانusingbtxspecification پایانvbox پایانvboxregister \
-پایانvboxtohbox پایانvboxtohboxseparator پایانviewerlayer پایانvtop پایانvtopregister \
-پایانxcell پایانxcellgroup پایانxcolumn پایانxgroup پایانxmldisplayverbatim \
-پایانxmlinlineverbatim پایانxmlraw پایانxmlsetups پایانxrow پایانxrowgroup \
-پایانxtable پایانxtablebody پایانxtablefoot پایانxtablehead پایانxtablenext \
-پایانآیتم پایانبروبه پایانتنظیم‌راست پایانتنظیم‌وسط پایانتولید \
-پایانخط‌حاشیه پایانخط‌متن پایاندرج‌شناور پایاندرج‌Ùرمول پایانرنگ \
-پایانزبان پایانسر پایانÙشرده پایانقالبی پایانمحیط \
-پایانمنوی‌پانل پایانمولÙÙ‡ پایاننشر پایانپروژه پایانپس‌زمینه \
-پایانچپ‌چین پایان‌خط پایین پرده پروژه \
-پرکردن‌میدان پس‌زمینه چوبخط چپ‌چین کشیده \
-کلمه‌راست گیره یادداشت یک‌جا یک‌خط
+پایانcombination پایانcomment پایانcontextcode پایانcontextdefinitioncode پایانctxfunction \
+پایانctxfunctiondefinition پایانcurrentcolor پایانcurrentlistentrywrapper پایانdelimited پایانdelimitedtext \
+پایانdisplaymath پایانdmath پایانdocument پایانeffect پایانelement \
+پایانembeddedxtable پایانendnote پایانendofline پایانexceptions پایانexpanded \
+پایانexpandedcollect پایانextendedcatcodetable پایانexternalfigurecollection پایانfacingfloat پایانfact \
+پایانfigure پایانfiguretext پایانfittingpage پایانfixed پایانfloatcombination \
+پایانfont پایانfontclass پایانfontsolution پایانfootnote پایانformula \
+پایانformulas پایانframedcell پایانframedcontent پایانframedrow پایانframedtable \
+پایانframedtext پایانfrontmatter پایانgraphictext پایانgridsnapping پایانhanging \
+پایانhbox پایانhboxestohbox پایانhboxregister پایانheadtext پایانhelptext \
+پایانhiding پایانhighlight پایانhyphenation پایانimath پایانindentation \
+پایانindentedtext پایانinteraction پایانinterface پایانintermezzotext پایانintertext \
+پایانitemgroup پایانitemgroupcolumns پایانitemize پایانknockout پایانlabeltext \
+پایانlayout پایانlegend پایانlinealignment پایانlinecorrection پایانlinefiller \
+پایانlinenumbering پایانlines پایانlinetable پایانlinetablebody پایانlinetablecell \
+پایانlinetablehead پایانlocalfootnotes پایانlocalheadsetup پایانlocallinecorrection پایانlocalnotes \
+پایانlocalsetups پایانlua پایانluacode پایانluaparameterset پایانluasetups \
+پایانmakeup پایانmarginblock پایانmarkedcontent پایانmarkpages پایانmathalignment \
+پایانmathcases پایانmathlabeltext پایانmathmatrix پایانmathmode پایانmathstyle \
+پایانmatrices پایانmatrix پایانmaxaligned پایانmdformula پایانmiddlealigned \
+پایانmiddlemakeup پایانmixedcolumns پایانmode پایانmodeset پایانmodule \
+پایانmoduletestsection پایانmpformula پایانnamedsection پایانnamedsubformulas پایانnarrow \
+پایانnarrower پایانnegative پایانnicelyfilledbox پایانnointerference پایانnotallmodes \
+پایانnotext پایانnotmode پایانoperatortext پایانopposite پایانoutputstream \
+پایانoverlay پایانoverprint پایانpagecolumns پایانpagecomment پایانpagefigure \
+پایانpagelayout پایانpagemakeup پایانpar پایانparagraph پایانparagraphs \
+پایانparagraphscell پایانparbuilder پایانpart پایانpath پایانplacechemical \
+پایانplacefigure پایانplacegraphic پایانplaceintermezzo پایانplacelegend پایانplacepairedbox \
+پایانplacetable پایانpositioning پایانpositionoverlay پایانpositive پایانpostponing \
+پایانpostponingnotes پایانprefixtext پایانprocessassignmentcommand پایانprocessassignmentlist پایانprocesscommacommand \
+پایانprocesscommalist پایانprotect پایانprotectedcolors پایانpunctuation پایانquotation \
+پایانquote پایانrandomized پایانrandomseed پایانrawsetups پایانreadingfile \
+پایانreferenceprefix پایانregime پایانreusableMPgraphic پایانruby پایانscript \
+پایانsdformula پایانsection پایانsectionblock پایانsectionblockenvironment پایانsectionlevel \
+پایانsetups پایانshapebox پایانshift پایانsidebar پایانsimplecolumns \
+پایانspecialitem پایانspeech پایانspformula پایانsplitformula پایانsplittext \
+پایانspread پایانstandardmakeup پایانstaticMPfigure پایانstaticMPgraphic پایانstrictinspectnextcharacter \
+پایانstrut پایانstyle پایانsubformulas پایانsubject پایانsubjectlevel \
+پایانsubsection پایانsubsentence پایانsubstack پایانsubsubject پایانsubsubsection \
+پایانsubsubsubject پایانsubsubsubsection پایانsubsubsubsubject پایانsubsubsubsubsection پایانsubsubsubsubsubject \
+پایانsuffixtext پایانsymbolset پایانtable پایانtablehead پایانtables \
+پایانtabletail پایانtabletext پایانtabulate پایانtabulatehead پایانtabulatetail \
+پایانtagged پایانtaglabeltext پایانtexcode پایانtexdefinition پایانtext \
+پایانtextbackground پایانtextbackgroundmanual پایانtextcolor پایانtextcolorintent پایانtextflow \
+پایانtextmakeup پایانtitle پایانtokenlist پایانtokens پایانtransparent \
+پایانtypescript پایانtypescriptcollection پایانtyping پایانuniqueMPgraphic پایانuniqueMPpagegraphic \
+پایانunittext پایانunpacked پایانusableMPgraphic پایانuseMPgraphic پایانusemathstyleparameter \
+پایانuserdata پایانusingbtxspecification پایانvbox پایانvboxregister پایانvboxtohbox \
+پایانvboxtohboxseparator پایانviewerlayer پایانvtop پایانvtopregister پایانxcell \
+پایانxcellgroup پایانxcolumn پایانxgroup پایانxmldisplayverbatim پایانxmlinlineverbatim \
+پایانxmlraw پایانxmlsetups پایانxrow پایانxrowgroup پایانxtable \
+پایانxtablebody پایانxtablefoot پایانxtablehead پایانxtablenext پایانآیتم \
+پایانبروبه پایانتنظیم‌راست پایانتنظیم‌وسط پایانتولید پایانخط‌حاشیه \
+پایانخط‌متن پایاندرج‌شناور پایاندرج‌Ùرمول پایانرنگ پایانزبان \
+پایانسر پایانÙشرده پایانقالبی پایانمحیط پایانمنوی‌پانل \
+پایانمولÙÙ‡ پایاننشر پایانپروژه پایانپس‌زمینه پایانچپ‌چین \
+پایان‌خط پایین پرده پروژه پرکردن‌میدان \
+پس‌زمینه چوبخط چپ‌چین کشیده کلمه‌راست \
+گیره یادداشت یک‌جا یک‌خط
keywordclass.context.ro=\
CUVANT CUVINTE Cuvant Cuvinte \
@@ -2136,22 +2143,22 @@ seteazagrosimelinie seteazaimpartireafloat seteazainconjurat seteazaingust setea
seteazajos seteazalegenda seteazalegendele seteazaliniesilabe seteazaliniesubtire \
seteazalinii seteazaliniimargine seteazaliniinegre seteazaliniiumplere seteazalista \
seteazalistacombinata seteazamajuscule seteazamakeup seteazamarcaje seteazameniuinteractiune \
-seteazaminicitat seteazanumarpagina seteazanumarsubpagina seteazanumartitlu seteazanumerotarelinii \
-seteazanumerotarepagina seteazanumerotareparagrafe seteazapaleta seteazaparagrafe seteazaplasareaopozita \
-seteazaprograme seteazareferinte seteazaregistru seteazarigletext seteazarigleumplere \
-seteazarotare seteazasimbol seteazasinonime seteazasortare seteazaspatiu \
-seteazaspatiualb seteazaspatiuinterliniar seteazasubsol seteazasus seteazatabele \
-seteazatabulatori seteazatext seteazatexteantet seteazatextejos seteazatextesubsol \
-seteazatextesus seteazatextetext seteazatitlu seteazatitluri seteazatoleranta \
-seteazatranzitiepagina seteazatype seteazatyping seteazaurl simbol \
-spatiifixate spatiu spatiufixat startaliniatcentru startaliniatdreapta \
-startaliniatstanga startcomponenta startculoare startdute startfundal \
-startimpachetat startlimba startlinie startliniemargine startmediu \
-startmeniuinteractiune startprodus startproiect startpublicatie startpuneformula \
-startriglatext starttitlu stivacampuri stopaliniatcentru stopaliniatdreapta \
-stopaliniatstanga stopcomponenta stopculoare stopdute stopfundal \
-stopimpachetat stoplimba stoplinie stopliniemargine stopmediu \
-stopmeniuinteractiune stopprodus stopproiect stoppublicatie stoppuneformula \
-stopriglatext stoptitlu textumplere traduce trecilafonttext \
-undeva valoareculoare versiune zidinsaptamana
+seteazaminicitat seteazanotasubsol seteazanumarpagina seteazanumarsubpagina seteazanumartitlu \
+seteazanumerotarelinii seteazanumerotarepagina seteazanumerotareparagrafe seteazapaleta seteazaparagrafe \
+seteazaplasareaopozita seteazaprograme seteazareferinte seteazaregistru seteazarigletext \
+seteazarigleumplere seteazarotare seteazasimbol seteazasinonime seteazasortare \
+seteazaspatiu seteazaspatiualb seteazaspatiuinterliniar seteazasubsol seteazasus \
+seteazatabele seteazatabulatori seteazatext seteazatexteantet seteazatextejos \
+seteazatextesubsol seteazatextesus seteazatextetext seteazatitlu seteazatitluri \
+seteazatoleranta seteazatranzitiepagina seteazatype seteazatyping seteazaurl \
+simbol spatiifixate spatiu spatiufixat startaliniatcentru \
+startaliniatdreapta startaliniatstanga startcomponenta startculoare startdute \
+startfundal startimpachetat startlimba startlinie startliniemargine \
+startmediu startmeniuinteractiune startprodus startproiect startpublicatie \
+startpuneformula startriglatext starttitlu stivacampuri stopaliniatcentru \
+stopaliniatdreapta stopaliniatstanga stopcomponenta stopculoare stopdute \
+stopfundal stopimpachetat stoplimba stoplinie stopliniemargine \
+stopmediu stopmeniuinteractiune stopprodus stopproiect stoppublicatie \
+stoppuneformula stopriglatext stoptitlu textumplere traduce \
+trecilafonttext undeva valoareculoare versiune zidinsaptamana
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context-data-metafun.properties b/Master/texmf-dist/context/data/scite/context/scite-context-data-metafun.properties
index 8830da05c08..87647eb4c78 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context-data-metafun.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context-data-metafun.properties
@@ -36,43 +36,44 @@ drawoutlinetext outlinetexttopath checkedbounds checkbounds strut \
rule withmask bitmapimage colordecimals ddecimal \
dddecimal ddddecimal colordecimalslist textext thetextext \
rawtextext textextoffset texbox thetexbox rawtexbox \
-istextext notcached verbatim thelabel label \
-autoalign transparent withtransparency property properties \
-withproperties asgroup infont space crlf \
-dquote percent SPACE CRLF DQUOTE \
-PERCENT grayscale greyscale withgray withgrey \
-colorpart colorlike readfile clearxy unitvector \
-center epsed anchored originpath infinite \
-break xstretched ystretched snapped pathconnectors \
-function constructedfunction constructedpath constructedpairs straightfunction \
-straightpath straightpairs curvedfunction curvedpath curvedpairs \
-evenly oddly condition pushcurrentpicture popcurrentpicture \
-arrowpath resetarrows tensecircle roundedsquare colortype \
-whitecolor blackcolor basiccolors complementary complemented \
-resolvedcolor normalfill normaldraw visualizepaths detailpaths \
-naturalizepaths drawboundary drawwholepath drawpathonly visualizeddraw \
-visualizedfill detaileddraw draworigin drawboundingbox drawpath \
-drawpoint drawpoints drawcontrolpoints drawcontrollines drawpointlabels \
-drawlineoptions drawpointoptions drawcontroloptions drawlabeloptions draworiginoptions \
-drawboundoptions drawpathoptions resetdrawoptions undashed pencilled \
-decorated redecorated undecorated passvariable passarrayvariable \
-tostring topair format formatted quotation \
-quote startpassingvariable stoppassingvariable eofill eoclip \
-nofill fillup eofillup area addbackground \
-shadedup shadeddown shadedleft shadedright sortlist \
-copylist shapedlist listtocurves listtolines listsize \
-listlast uniquelist circularpath squarepath linearpath \
-theoffset texmode systemmode texvar texstr \
-isarray prefix dimension getmacro getdimen \
-getcount gettoks setmacro setdimen setcount \
-settoks positionpath positioncurve positionxy positionpxy \
-positionwhd positionpage positionregion positionbox positionanchor \
-positioninregion positionatanchor wdpart htpart dppart \
-texvar texstr inpath pointof leftof \
-rightof newhash disposehash inhash tohash \
-isarray prefix isobject comment report \
-lua mp MP luacall mirrored \
-mirroredabout
+istextext notcached keepcached verbatim thelabel \
+label autoalign transparent withtransparency property \
+properties withproperties asgroup infont space \
+crlf dquote percent SPACE CRLF \
+DQUOTE PERCENT grayscale greyscale withgray \
+withgrey colorpart colorlike readfile clearxy \
+unitvector center epsed anchored originpath \
+infinite break xstretched ystretched snapped \
+pathconnectors function constructedfunction constructedpath constructedpairs \
+straightfunction straightpath straightpairs curvedfunction curvedpath \
+curvedpairs evenly oddly condition pushcurrentpicture \
+popcurrentpicture arrowpath resetarrows tensecircle roundedsquare \
+colortype whitecolor blackcolor basiccolors complementary \
+complemented resolvedcolor normalfill normaldraw visualizepaths \
+detailpaths naturalizepaths drawboundary drawwholepath drawpathonly \
+visualizeddraw visualizedfill detaileddraw draworigin drawboundingbox \
+drawpath drawpoint drawpoints drawcontrolpoints drawcontrollines \
+drawpointlabels drawlineoptions drawpointoptions drawcontroloptions drawlabeloptions \
+draworiginoptions drawboundoptions drawpathoptions resetdrawoptions undashed \
+pencilled decorated redecorated undecorated passvariable \
+passarrayvariable tostring topair format formatted \
+quotation quote startpassingvariable stoppassingvariable eofill \
+eoclip nofill dofill fillup eofillup \
+nodraw dodraw area addbackground shadedup \
+shadeddown shadedleft shadedright sortlist copylist \
+shapedlist listtocurves listtolines listsize listlast \
+uniquelist circularpath squarepath linearpath theoffset \
+texmode systemmode texvar texstr isarray \
+prefix dimension getmacro getdimen getcount \
+gettoks setmacro setdimen setcount settoks \
+positionpath positioncurve positionxy positionpxy positionwhd \
+positionpage positionregion positionbox positionanchor positioninregion \
+positionatanchor wdpart htpart dppart texvar \
+texstr inpath pointof leftof rightof \
+utflen utfsub newhash disposehash inhash \
+tohash isarray prefix isobject comment \
+report lua mp MP luacall \
+mirrored mirroredabout scriptindex
keywordclass.metafun.internals=\
nocolormodel greycolormodel graycolormodel rgbcolormodel \
@@ -82,5 +83,8 @@ colordodgetransparent colorburntransparent darkentransparent lightentransparent
exclusiontransparent huetransparent saturationtransparent colortransparent luminositytransparent \
ahvariant ahdimple ahfactor ahscale metapostversion \
maxdimensions drawoptionsfactor dq sq crossingscale \
-crossingoption
+crossingoption contextlmtxmode getparameters presetparameters hasparameter \
+hasoption getparameter getparameterdefault getparametercount getmaxparametercount \
+getparameterpath getparameterpen getparametertext applyparameters pushparameters \
+popparameters definecolor
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context-data-metapost.properties b/Master/texmf-dist/context/data/scite/context/scite-context-data-metapost.properties
index 3a197144b3f..19bd711b0bd 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context-data-metapost.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context-data-metapost.properties
@@ -28,7 +28,7 @@ laboff bye red green blue \
cyan magenta yellow black white \
background mm pt dd bp \
cm pc cc in triplet \
-quadruplet
+quadruplet totransform bymatrix
keywordclass.metapost.disabled=\
verbatimtex troffmode
@@ -73,50 +73,51 @@ penspec true and angle arclength \
arctime ASCII boolean bot char \
color cosd cycle decimal directiontime \
floor fontsize hex infont intersectiontimes \
-known length llcorner lrcorner makepath \
-makepen mexp mlog normaldeviate not \
-numeric oct odd or path \
-pair pen penoffset picture point \
-postcontrol precontrol reverse rotated scaled \
-shifted sind slanted sqrt str \
-string subpath substring transform transformed \
-ulcorner uniformdeviate unknown urcorner xpart \
-xscaled xxpart xypart ypart yscaled \
-yxpart yypart zscaled addto clip \
-input interim let newinternal save \
-setbounds shipout show showdependencies showtoken \
-showvariable special begingroup endgroup of \
-curl tension and controls interpath \
-on off def vardef enddef \
-expr suffix text primary secondary \
-tertiary primarydef secondarydef tertiarydef randomseed \
-also contour doublepath withcolor withcmykcolor \
-withpen dashed envelope if else \
-elseif fi for endfor forever \
-exitif within forsuffixes step until \
-charlist extensible fontdimen headerbyte kern \
-ligtable boundarychar chardp charext charht \
-charic charwd designsize fontmaking charexists \
-cullit currenttransform gfcorners grayfont hround \
-imagerules lowres_fix nodisplays notransforms openit \
-displaying currentwindow screen_rows screen_cols pixels_per_inch \
-cull display openwindow numspecial totalweight \
-autorounding fillin proofing tracingpens xoffset \
-chardx granularity smoothing turningcheck yoffset \
-chardy hppp tracingedges vppp extra_beginfig \
-extra_endfig mpxbreak endinput message delimiters \
-turningnumber errmessage readstring scantokens end \
-outer inner write to readfrom \
-withprescript withpostscript top bot lft \
-rt ulft urt llft lrt \
-redpart greenpart bluepart cyanpart magentapart \
-yellowpart blackpart prescriptpart postscriptpart rgbcolor \
-cmykcolor colormodel graypart greypart greycolor \
-graycolor dashpart penpart stroked filled \
-textual clipped bounded pathpart expandafter \
-minute hour outputformat outputtemplate filenametemplate \
-fontmapfile fontmapline fontpart fontsize glyph \
-restoreclipcolor troffmode runscript maketext
+known void length llcorner lrcorner \
+makepath makepen mexp mlog normaldeviate \
+not numeric oct odd or \
+path pair pen penoffset picture \
+point postcontrol precontrol reverse rotated \
+scaled shifted sind slanted sqrt \
+str string subpath substring transform \
+transformed ulcorner uniformdeviate unknown urcorner \
+xpart xscaled xxpart xypart ypart \
+yscaled yxpart yypart zscaled addto \
+clip input interim let newinternal \
+save setbounds setgroup shipout show \
+showdependencies showtoken showvariable special begingroup \
+endgroup of curl tension and \
+controls interpath on off def \
+vardef enddef expr suffix text \
+primary secondary tertiary primarydef secondarydef \
+tertiarydef randomseed also contour doublepath \
+withcolor withcmykcolor withpen dashed envelope \
+if else elseif fi for \
+endfor forever exitif within forsuffixes \
+step until charlist extensible fontdimen \
+headerbyte kern ligtable boundarychar chardp \
+charext charht charic charwd designsize \
+fontmaking charexists cullit currenttransform gfcorners \
+grayfont hround imagerules lowres_fix nodisplays \
+notransforms openit displaying currentwindow screen_rows \
+screen_cols pixels_per_inch cull display openwindow \
+numspecial totalweight autorounding fillin proofing \
+tracingpens xoffset chardx granularity smoothing \
+turningcheck yoffset chardy hppp tracingedges \
+vppp extra_beginfig extra_endfig mpxbreak endinput \
+message delimiters turningnumber errmessage scantokens \
+end outer inner write to \
+readfrom closefrom withprescript withpostscript top \
+bot lft rt ulft urt \
+llft lrt redpart greenpart bluepart \
+cyanpart magentapart yellowpart blackpart prescriptpart \
+postscriptpart rgbcolor cmykcolor colormodel graypart \
+greypart greycolor graycolor dashpart penpart \
+stroked filled textual clipped bounded \
+pathpart expandafter minute hour outputformat \
+outputtemplate filenametemplate fontmapfile fontmapline fontpart \
+fontsize glyph restoreclipcolor troffmode runscript \
+maketext numbersystem
keywordclass.metapost.shortcuts=\
.. ... -- --- \
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context-data-tex.properties b/Master/texmf-dist/context/data/scite/context/scite-context-data-tex.properties
index b980decbde9..f7e55372322 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context-data-tex.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context-data-tex.properties
@@ -4,82 +4,80 @@ Alephminorversion Alephrevision Alephversion
keywordclass.tex.etex=\
botmarks clubpenalties currentgrouplevel currentgrouptype \
currentifbranch currentiflevel currentiftype detokenize dimexpr \
-displaywidowpenalties eTeXVersion eTeXminorversion eTeXrevision eTeXversion \
-everyeof firstmarks fontchardp fontcharht fontcharic \
-fontcharwd glueexpr glueshrink glueshrinkorder gluestretch \
-gluestretchorder gluetomu ifcsname ifdefined iffontchar \
-interactionmode interlinepenalties lastlinefit lastnodetype marks \
-muexpr mutoglue numexpr pagediscards parshapedimen \
-parshapeindent parshapelength predisplaydirection protected readline \
-savinghyphcodes savingvdiscards scantokens showgroups showifs \
-showtokens splitbotmarks splitdiscards splitfirstmarks topmarks \
-tracingassigns tracinggroups tracingifs tracingnesting tracingscantokens \
-unexpanded unless widowpenalties
+displaywidowpenalties everyeof firstmarks fontchardp fontcharht \
+fontcharic fontcharwd glueexpr glueshrink glueshrinkorder \
+gluestretch gluestretchorder gluetomu ifcsname ifdefined \
+iffontchar interactionmode interlinepenalties lastlinefit lastnodetype \
+marks muexpr mutoglue numexpr pagediscards \
+parshapedimen parshapeindent parshapelength predisplaydirection protected \
+readline savinghyphcodes savingvdiscards scantokens showgroups \
+showifs showtokens splitbotmarks splitdiscards splitfirstmarks \
+topmarks tracingassigns tracinggroups tracingifs tracingnesting \
+tracingscantokens unexpanded unless widowpenalties
keywordclass.tex.luatex=\
Uchar Udelcode Udelcodenum Udelimiter \
-Udelimiterover Udelimiterunder Uhextensible Umathaccent Umathaxis \
-Umathbinbinspacing Umathbinclosespacing Umathbininnerspacing Umathbinopenspacing Umathbinopspacing \
-Umathbinordspacing Umathbinpunctspacing Umathbinrelspacing Umathchar Umathcharclass \
-Umathchardef Umathcharfam Umathcharnum Umathcharnumdef Umathcharslot \
-Umathclosebinspacing Umathcloseclosespacing Umathcloseinnerspacing Umathcloseopenspacing Umathcloseopspacing \
-Umathcloseordspacing Umathclosepunctspacing Umathcloserelspacing Umathcode Umathcodenum \
-Umathconnectoroverlapmin Umathfractiondelsize Umathfractiondenomdown Umathfractiondenomvgap Umathfractionnumup \
-Umathfractionnumvgap Umathfractionrule Umathinnerbinspacing Umathinnerclosespacing Umathinnerinnerspacing \
-Umathinneropenspacing Umathinneropspacing Umathinnerordspacing Umathinnerpunctspacing Umathinnerrelspacing \
-Umathlimitabovebgap Umathlimitabovekern Umathlimitabovevgap Umathlimitbelowbgap Umathlimitbelowkern \
-Umathlimitbelowvgap Umathnolimitsubfactor Umathnolimitsupfactor Umathopbinspacing Umathopclosespacing \
-Umathopenbinspacing Umathopenclosespacing Umathopeninnerspacing Umathopenopenspacing Umathopenopspacing \
-Umathopenordspacing Umathopenpunctspacing Umathopenrelspacing Umathoperatorsize Umathopinnerspacing \
-Umathopopenspacing Umathopopspacing Umathopordspacing Umathoppunctspacing Umathoprelspacing \
-Umathordbinspacing Umathordclosespacing Umathordinnerspacing Umathordopenspacing Umathordopspacing \
-Umathordordspacing Umathordpunctspacing Umathordrelspacing Umathoverbarkern Umathoverbarrule \
-Umathoverbarvgap Umathoverdelimiterbgap Umathoverdelimitervgap Umathpunctbinspacing Umathpunctclosespacing \
-Umathpunctinnerspacing Umathpunctopenspacing Umathpunctopspacing Umathpunctordspacing Umathpunctpunctspacing \
-Umathpunctrelspacing Umathquad Umathradicaldegreeafter Umathradicaldegreebefore Umathradicaldegreeraise \
-Umathradicalkern Umathradicalrule Umathradicalvgap Umathrelbinspacing Umathrelclosespacing \
-Umathrelinnerspacing Umathrelopenspacing Umathrelopspacing Umathrelordspacing Umathrelpunctspacing \
-Umathrelrelspacing Umathskewedfractionhgap Umathskewedfractionvgap Umathspaceafterscript Umathstackdenomdown \
-Umathstacknumup Umathstackvgap Umathsubshiftdown Umathsubshiftdrop Umathsubsupshiftdown \
-Umathsubsupvgap Umathsubtopmax Umathsupbottommin Umathsupshiftdrop Umathsupshiftup \
-Umathsupsubbottommax Umathunderbarkern Umathunderbarrule Umathunderbarvgap Umathunderdelimiterbgap \
-Umathunderdelimitervgap Unosubscript Unosuperscript Uoverdelimiter Uradical \
-Uroot Uskewed Uskewedwithdelims Ustack Ustartdisplaymath \
-Ustartmath Ustopdisplaymath Ustopmath Usubscript Usuperscript \
-Uunderdelimiter Uvextensible adjustspacing alignmark aligntab \
-attribute attributedef automaticdiscretionary automatichyphenmode automatichyphenpenalty \
-begincsname bodydir bodydirection boxdir boxdirection \
-breakafterdirmode catcodetable clearmarks compoundhyphenmode copyfont \
-crampeddisplaystyle crampedscriptscriptstyle crampedscriptstyle crampedtextstyle csstring \
-draftmode dviextension dvifeedback dvivariable efcode \
-endlocalcontrol etoksapp etokspre exceptionpenalty expanded \
-expandglyphsinfont explicitdiscretionary explicithyphenpenalty fixupboxesmode fontid \
-formatname gleaders gtoksapp gtokspre hjcode \
+Udelimiterover Udelimiterunder Uhextensible Uleft Umathaccent \
+Umathaxis Umathbinbinspacing Umathbinclosespacing Umathbininnerspacing Umathbinopenspacing \
+Umathbinopspacing Umathbinordspacing Umathbinpunctspacing Umathbinrelspacing Umathchar \
+Umathcharclass Umathchardef Umathcharfam Umathcharnum Umathcharnumdef \
+Umathcharslot Umathclosebinspacing Umathcloseclosespacing Umathcloseinnerspacing Umathcloseopenspacing \
+Umathcloseopspacing Umathcloseordspacing Umathclosepunctspacing Umathcloserelspacing Umathcode \
+Umathcodenum Umathconnectoroverlapmin Umathfractiondelsize Umathfractiondenomdown Umathfractiondenomvgap \
+Umathfractionnumup Umathfractionnumvgap Umathfractionrule Umathinnerbinspacing Umathinnerclosespacing \
+Umathinnerinnerspacing Umathinneropenspacing Umathinneropspacing Umathinnerordspacing Umathinnerpunctspacing \
+Umathinnerrelspacing Umathlimitabovebgap Umathlimitabovekern Umathlimitabovevgap Umathlimitbelowbgap \
+Umathlimitbelowkern Umathlimitbelowvgap Umathnolimitsubfactor Umathnolimitsupfactor Umathopbinspacing \
+Umathopclosespacing Umathopenbinspacing Umathopenclosespacing Umathopeninnerspacing Umathopenopenspacing \
+Umathopenopspacing Umathopenordspacing Umathopenpunctspacing Umathopenrelspacing Umathoperatorsize \
+Umathopinnerspacing Umathopopenspacing Umathopopspacing Umathopordspacing Umathoppunctspacing \
+Umathoprelspacing Umathordbinspacing Umathordclosespacing Umathordinnerspacing Umathordopenspacing \
+Umathordopspacing Umathordordspacing Umathordpunctspacing Umathordrelspacing Umathoverbarkern \
+Umathoverbarrule Umathoverbarvgap Umathoverdelimiterbgap Umathoverdelimitervgap Umathpunctbinspacing \
+Umathpunctclosespacing Umathpunctinnerspacing Umathpunctopenspacing Umathpunctopspacing Umathpunctordspacing \
+Umathpunctpunctspacing Umathpunctrelspacing Umathquad Umathradicaldegreeafter Umathradicaldegreebefore \
+Umathradicaldegreeraise Umathradicalkern Umathradicalrule Umathradicalvgap Umathrelbinspacing \
+Umathrelclosespacing Umathrelinnerspacing Umathrelopenspacing Umathrelopspacing Umathrelordspacing \
+Umathrelpunctspacing Umathrelrelspacing Umathskewedfractionhgap Umathskewedfractionvgap Umathspaceafterscript \
+Umathstackdenomdown Umathstacknumup Umathstackvgap Umathsubshiftdown Umathsubshiftdrop \
+Umathsubsupshiftdown Umathsubsupvgap Umathsubtopmax Umathsupbottommin Umathsupshiftdrop \
+Umathsupshiftup Umathsupsubbottommax Umathunderbarkern Umathunderbarrule Umathunderbarvgap \
+Umathunderdelimiterbgap Umathunderdelimitervgap Umiddle Unosubscript Unosuperscript \
+Uoverdelimiter Uradical Uright Uroot Uskewed \
+Uskewedwithdelims Ustack Ustartdisplaymath Ustartmath Ustopdisplaymath \
+Ustopmath Usubscript Usuperscript Uunderdelimiter Uvextensible \
+adjustspacing adjustspacingshrink adjustspacingstep adjustspacingstretch aftergrouped \
+alignmark aligntab attribute attributedef automaticdiscretionary \
+automatichyphenmode automatichyphenpenalty begincsname beginlocalcontrol boundary \
+boxattr boxdirection boxorientation boxtotal boxxmove \
+boxxoffset boxymove boxyoffset breakafterdirmode catcodetable \
+clearmarks compoundhyphenmode crampeddisplaystyle crampedscriptscriptstyle crampedscriptstyle \
+crampedtextstyle csstring efcode endlocalcontrol etoksapp \
+etokspre exceptionpenalty expanded explicitdiscretionary explicithyphenpenalty \
+firstvalidlanguage fixupboxesmode fontid formatname frozen \
+futureexpand futureexpandis futureexpandisap gleaders glet \
+glyphdatafield gtoksapp gtokspre hjcode hpack \
hyphenationbounds hyphenationmin hyphenpenaltymode ifabsdim ifabsnum \
-ifcondition ifincsname ifprimitive ignoreligaturesinfont immediateassigned \
-immediateassignment initcatcodetable insertht lastnamedcs lastsavedboxresourceindex \
-lastsavedimageresourceindex lastsavedimageresourcepages lastxpos lastypos latelua \
-lateluafunction leftghost leftmarginkern letcharcode letterspacefont \
-linedir linedirection localbrokenpenalty localinterlinepenalty localleftbox \
+ifchkdim ifchknum ifcmpdim ifcmpnum ifcondition \
+ifcstok ifdimval iffrozen ifincsname ifnumval \
+ifprotected iftok ifusercmd ignorepars immediateassigned \
+immediateassignment initcatcodetable insertht internalcodesmode lastnamedcs \
+lastnodesubtype leftghost leftmarginkern letcharcode letfrozen \
+letprotected linedirection localbrokenpenalty localinterlinepenalty localleftbox \
localrightbox lpcode luabytecode luabytecodecall luacopyinputnodes \
luadef luaescapestring luafunction luafunctioncall luatexbanner \
-luatexrevision luatexversion mathdelimitersmode mathdir mathdirection \
-mathdisplayskipmode matheqnogapstep mathflattenmode mathitalicsmode mathnolimitsmode \
-mathoption mathpenaltiesmode mathrulesfam mathrulesmode mathrulethicknessmode \
-mathscriptboxmode mathscriptcharmode mathscriptsmode mathstyle mathsurroundmode \
-mathsurroundskip nohrule nokerns noligs normaldeviate \
-nospaces novrule outputbox outputmode pagebottomoffset \
-pagedir pagedirection pageheight pageleftoffset pagerightoffset \
-pagetopoffset pagewidth pardir pardirection pdfextension \
-pdffeedback pdfvariable postexhyphenchar posthyphenchar prebinoppenalty \
-predisplaygapfactor preexhyphenchar prehyphenchar prerelpenalty primitive \
-protrudechars pxdimen quitvmode randomseed rightghost \
-rightmarginkern rpcode saveboxresource savecatcodetable saveimageresource \
-savepos scantextokens setfontid setrandomseed shapemode \
-suppressfontnotfounderror suppressifcsnameerror suppresslongerror suppressmathparerror suppressoutererror \
-suppressprimitiveerror synctex tagcode textdir textdirection \
-toksapp tokspre tracingfonts uniformdeviate useboxresource \
-useimageresource xtoksapp xtokspre
+luatexrevision luatexversion mathdelimitersmode mathdirection mathdisplayskipmode \
+matheqnogapstep mathflattenmode mathitalicsmode mathnolimitsmode matholdmode \
+mathpenaltiesmode mathrulesfam mathrulesmode mathrulethicknessmode mathscriptboxmode \
+mathscriptcharmode mathscriptsmode mathstyle mathsurroundmode mathsurroundskip \
+noboundary nohrule nokerns noligs nospaces \
+novrule outputbox pardirection postexhyphenchar posthyphenchar \
+prebinoppenalty predisplaygapfactor preexhyphenchar prehyphenchar prerelpenalty \
+protrudechars protrusionboundary pxdimen quitvmode rightghost \
+rightmarginkern rpcode savecatcodetable scantextokens setfontid \
+shapemode textdirection toksapp tokspre tpack \
+tracingfonts unletfrozen unletprotected vpack wordboundary \
+xtoksapp xtokspre
keywordclass.tex.omega=\
Omegaminorversion Omegarevision Omegaversion
@@ -110,14 +108,13 @@ pdfuniqueresname pdfvorigin pdfxform pdfxformattr pdfxformmargin \
pdfxformname pdfxformresources pdfximage
keywordclass.tex.tex=\
- - / Uleft \
-Umiddle Uright above abovedisplayshortskip abovedisplayskip \
-abovewithdelims accent adjdemerits advance afterassignment \
-aftergroup atop atopwithdelims badness baselineskip \
-batchmode begingroup belowdisplayshortskip belowdisplayskip binoppenalty \
-botmark boundary box boxmaxdepth brokenpenalty \
-catcode char chardef cleaders closein \
-closeout clubpenalty copy count countdef \
+ - / above \
+abovedisplayshortskip abovedisplayskip abovewithdelims accent adjdemerits \
+advance afterassignment aftergroup atop atopwithdelims \
+badness baselineskip batchmode begingroup belowdisplayshortskip \
+belowdisplayskip binoppenalty botmark box boxmaxdepth \
+brokenpenalty catcode char chardef cleaders \
+closein clubpenalty copy count countdef \
cr crcr csname day deadcycles \
def defaulthyphenchar defaultskewchar delcode delimiter \
delimiterfactor delimitershortfall dimen dimendef directlua \
@@ -127,57 +124,56 @@ edef else emergencystretch end endcsname \
endgroup endinput endlinechar eqno errhelp \
errmessage errorcontextlines errorstopmode escapechar everycr \
everydisplay everyhbox everyjob everymath everypar \
-everyvbox exhyphenchar exhyphenpenalty expandafter fam \
-fi finalhyphendemerits firstmark firstvalidlanguage floatingpenalty \
+everytab everyvbox exhyphenchar exhyphenpenalty expandafter \
+fam fi finalhyphendemerits firstmark floatingpenalty \
font fontdimen fontname futurelet gdef \
-glet global globaldefs halign hangafter \
-hangindent hbadness hbox hfil hfill \
-hfilneg hfuzz hoffset holdinginserts hpack \
-hrule hsize hskip hss ht \
-hyphenation hyphenchar hyphenpenalty if ifcase \
-ifcat ifdim ifeof iffalse ifhbox \
-ifhmode ifinner ifmmode ifnum ifodd \
-iftrue ifvbox ifvmode ifvoid ifx \
-ignorespaces immediate indent input inputlineno \
-insert insertpenalties interlinepenalty jobname kern \
-language lastbox lastkern lastpenalty lastskip \
-lccode leaders left lefthyphenmin leftskip \
-leqno let limits linepenalty lineskip \
-lineskiplimit long looseness lower lowercase \
-mag mark mathaccent mathbin mathchar \
-mathchardef mathchoice mathclose mathcode mathinner \
-mathop mathopen mathord mathpunct mathrel \
-mathsurround maxdeadcycles maxdepth meaning medmuskip \
-message middle mkern month moveleft \
-moveright mskip multiply muskip muskipdef \
-newlinechar noalign noboundary noexpand noindent \
-nolimits nonscript nonstopmode nulldelimiterspace nullfont \
-number omit openin openout or \
-outer output outputpenalty over overfullrule \
-overline overwithdelims pagedepth pagefilllstretch pagefillstretch \
-pagefilstretch pagegoal pageshrink pagestretch pagetotal \
-par parfillskip parindent parshape parskip \
-patterns pausing penalty postdisplaypenalty predisplaypenalty \
-predisplaysize pretolerance prevdepth prevgraf protrusionboundary \
-radical raise read relax relpenalty \
-right righthyphenmin rightskip romannumeral scriptfont \
-scriptscriptfont scriptscriptstyle scriptspace scriptstyle scrollmode \
-setbox setlanguage sfcode shipout show \
-showbox showboxbreadth showboxdepth showlists showthe \
-skewchar skip skipdef spacefactor spaceskip \
-span special splitbotmark splitfirstmark splitmaxdepth \
-splittopskip string tabskip textfont textstyle \
-the thickmuskip thinmuskip time toks \
-toksdef tolerance topmark topskip tpack \
+global globaldefs halign hangafter hangindent \
+hbadness hbox hfil hfill hfilneg \
+hfuzz hoffset holdinginserts hrule hsize \
+hskip hss ht hyphenation hyphenchar \
+hyphenpenalty if ifcase ifcat ifdim \
+ifeof iffalse ifhbox ifhmode ifinner \
+ifmmode ifnum ifodd iftrue ifvbox \
+ifvmode ifvoid ifx ignorespaces indent \
+input inputlineno insert insertpenalties interlinepenalty \
+jobname kern language lastbox lastkern \
+lastpenalty lastskip lccode leaders left \
+lefthyphenmin leftskip leqno let limits \
+linepenalty lineskip lineskiplimit long looseness \
+lower lowercase mag mark mathaccent \
+mathbin mathchar mathchardef mathchoice mathclose \
+mathcode mathinner mathop mathopen mathord \
+mathpunct mathrel mathsurround maxdeadcycles maxdepth \
+meaning medmuskip message middle mkern \
+month moveleft moveright mskip multiply \
+muskip muskipdef newlinechar noalign noexpand \
+noindent nolimits nonscript nonstopmode nulldelimiterspace \
+nullfont number omit openin or \
+ordlimits orelse outer output outputpenalty \
+over overfullrule overline overwithdelims pagedepth \
+pagefilllstretch pagefillstretch pagefilstretch pagegoal pageshrink \
+pagestretch pagetotal par parfillskip parindent \
+parshape parskip patterns pausing penalty \
+postdisplaypenalty predisplaypenalty predisplaysize pretolerance prevdepth \
+prevgraf radical raise read relax \
+relpenalty right righthyphenmin rightskip romannumeral \
+scriptfont scriptscriptfont scriptscriptstyle scriptspace scriptstyle \
+scrollmode setbox setlanguage sfcode shipout \
+show showbox showboxbreadth showboxdepth showlists \
+shownodedetails showthe skewchar skip skipdef \
+spacefactor spaceskip span splitbotmark splitfirstmark \
+splitmaxdepth splittopskip string tabskip textfont \
+textstyle the thickmuskip thinmuskip time \
+toks toksdef tolerance topmark topskip \
tracingcommands tracinglostchars tracingmacros tracingonline tracingoutput \
tracingpages tracingparagraphs tracingrestores tracingstats uccode \
uchyph underline unhbox unhcopy unkern \
unpenalty unskip unvbox unvcopy uppercase \
vadjust valign vbadness vbox vcenter \
vfil vfill vfilneg vfuzz voffset \
-vpack vrule vsize vskip vsplit \
-vss vtop wd widowpenalty wordboundary \
-write xdef xleaders xspaceskip year
+vrule vsize vskip vsplit vss \
+vtop wd widowpenalty xdef xleaders \
+xspaceskip year
keywordclass.tex.xetex=\
XeTeXversion
diff --git a/Master/texmf-dist/context/data/scite/context/scite-context.properties b/Master/texmf-dist/context/data/scite/context/scite-context.properties
index f3555c1fb24..c50300128d9 100644
--- a/Master/texmf-dist/context/data/scite/context/scite-context.properties
+++ b/Master/texmf-dist/context/data/scite/context/scite-context.properties
@@ -64,7 +64,7 @@ open.dialog.in.file.directory=1
file.patterns.tex=
file.patterns.latex=
-file.patterns.context=*.tex;*.mkii;*.mkiv;*.mkvi;*.mkix;*.mkxi;
+file.patterns.context=*.tex;*.mkii;*.mkiv;*.mkvi;*.mkix;*.mkxi;*.mkxl;*.mklx;
open.suffix.$(file.patterns.context)=.tex
@@ -94,7 +94,7 @@ filter.example=eXaMpLe|$(file.patterns.example)|
# Lua : patterns
-file.patterns.lua=*.lua;*.luc;*.cld;*.tuc;*.luj;*.lum;*.tma;*.lfg;*.luv;*.lui
+file.patterns.lua=*.lua;*.luc;*.cld;*.tuc;*.luj;*.lum;*.tma;*.lfg;*.luv;*.lui;*.lmt
open.suffix.$(file.patterns.lua)=.lua
filter.lua=Lua MkIV|$(file.patterns.lua)|
#~ lexer.$(file.patterns.lua)=lua
@@ -553,11 +553,13 @@ if PLAT_WIN
clear.before.execute=1
wrap.output=0
-if PLAT_WIN
- eol.mode=CRLF
+#if PLAT_WIN
+# eol.mode=CRLF
+eol.mode=auto
ensure.final.line.end=1
-ensure.consistent.line.ends=1
+#~ $(file.patterns.context).ensure.consistent.line.ends=1
+#~ $(file.patterns.metafun).ensure.consistent.line.ends=1
# Editor: file type
@@ -596,7 +598,7 @@ style.errorlist.16=fore:$(colors.red)
# Metapost: patterns
-file.patterns.metafun=*.mp;*.mpx;*.mpy;*.mpii;*.mpiv
+file.patterns.metafun=*.mp;*.mpx;*.mpy;*.mpii;*.mpiv;*.mpxl
filter.metafun=MetaFun|$(file.patterns.metafun)|
#~ lexer.$(file.patterns.metafun)=metapost
diff --git a/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-context.lua b/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-context.lua
index afb6565ebf5..3db7d14fd0f 100644
--- a/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-context.lua
+++ b/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-context.lua
@@ -1,4 +1,4 @@
return {
- ["constants"]={ "zerocount", "minusone", "minustwo", "plusone", "plustwo", "plusthree", "plusfour", "plusfive", "plussix", "plusseven", "pluseight", "plusnine", "plusten", "plussixteen", "plusfifty", "plushundred", "plusonehundred", "plustwohundred", "plusfivehundred", "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", "maxcardminusone", "zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxcount", "maxdimen", "scaledpoint", "thousandpoint", "points", "halfpoint", "zeroskip", "zeromuskip", "onemuskip", "pluscxxvii", "pluscxxviii", "pluscclv", "pluscclvi", "normalpagebox", "directionlefttoright", "directionrighttoleft", "endoflinetoken", "outputnewlinechar", "emptytoks", "empty", "undefined", "voidbox", "emptybox", "emptyvbox", "emptyhbox", "bigskipamount", "medskipamount", "smallskipamount", "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", "texenginefunctionality", "luatexengine", "pdftexengine", "xetexengine", "unknownengine", "contextformat", "contextversion", "contextkind", "contextlmtxmode", "contextmark", "mksuffix", "activecatcode", "bgroup", "egroup", "endline", "conditionaltrue", "conditionalfalse", "attributeunsetvalue", "uprotationangle", "rightrotationangle", "downrotationangle", "leftrotationangle", "inicatcodes", "ctxcatcodes", "texcatcodes", "notcatcodes", "txtcatcodes", "vrbcatcodes", "prtcatcodes", "nilcatcodes", "luacatcodes", "tpacatcodes", "tpbcatcodes", "xmlcatcodes", "ctdcatcodes", "escapecatcode", "begingroupcatcode", "endgroupcatcode", "mathshiftcatcode", "alignmentcatcode", "endoflinecatcode", "parametercatcode", "superscriptcatcode", "subscriptcatcode", "ignorecatcode", "spacecatcode", "lettercatcode", "othercatcode", "activecatcode", "commentcatcode", "invalidcatcode", "tabasciicode", "newlineasciicode", "formfeedasciicode", "endoflineasciicode", "endoffileasciicode", "spaceasciicode", "hashasciicode", "dollarasciicode", "commentasciicode", "ampersandasciicode", "colonasciicode", "backslashasciicode", "circumflexasciicode", "underscoreasciicode", "leftbraceasciicode", "barasciicode", "rightbraceasciicode", "tildeasciicode", "delasciicode", "leftparentasciicode", "rightparentasciicode", "lessthanasciicode", "morethanasciicode", "doublecommentsignal", "atsignasciicode", "exclamationmarkasciicode", "questionmarkasciicode", "doublequoteasciicode", "singlequoteasciicode", "forwardslashasciicode", "primeasciicode", "hyphenasciicode", "activemathcharcode", "activetabtoken", "activeformfeedtoken", "activeendoflinetoken", "batchmodecode", "nonstopmodecode", "scrollmodecode", "errorstopmodecode", "bottomlevelgroupcode", "simplegroupcode", "hboxgroupcode", "adjustedhboxgroupcode", "vboxgroupcode", "vtopgroupcode", "aligngroupcode", "noaligngroupcode", "outputgroupcode", "mathgroupcode", "discretionarygroupcode", "insertgroupcode", "vcentergroupcode", "mathchoicegroupcode", "semisimplegroupcode", "mathshiftgroupcode", "mathleftgroupcode", "vadjustgroupcode", "charnodecode", "hlistnodecode", "vlistnodecode", "rulenodecode", "insertnodecode", "marknodecode", "adjustnodecode", "ligaturenodecode", "discretionarynodecode", "whatsitnodecode", "mathnodecode", "gluenodecode", "kernnodecode", "penaltynodecode", "unsetnodecode", "mathsnodecode", "charifcode", "catifcode", "numifcode", "dimifcode", "oddifcode", "vmodeifcode", "hmodeifcode", "mmodeifcode", "innerifcode", "voidifcode", "hboxifcode", "vboxifcode", "xifcode", "eofifcode", "trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode", "fontslantperpoint", "fontinterwordspace", "fontinterwordstretch", "fontinterwordshrink", "fontexheight", "fontemwidth", "fontextraspace", "slantperpoint", "mathexheight", "mathemwidth", "interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace", "mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight", "muquad", "startmode", "stopmode", "startnotmode", "stopnotmode", "startmodeset", "stopmodeset", "doifmode", "doifelsemode", "doifmodeelse", "doifnotmode", "startmodeset", "stopmodeset", "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", "doifallmodes", "doifelseallmodes", "doifallmodeselse", "doifnotallmodes", "startenvironment", "stopenvironment", "environment", "startcomponent", "stopcomponent", "component", "startproduct", "stopproduct", "product", "startproject", "stopproject", "project", "starttext", "stoptext", "startnotext", "stopnotext", "startdocument", "stopdocument", "documentvariable", "unexpandeddocumentvariable", "setupdocument", "presetdocument", "doifelsedocumentvariable", "doifdocumentvariableelse", "doifdocumentvariable", "doifnotdocumentvariable", "startmodule", "stopmodule", "usemodule", "usetexmodule", "useluamodule", "setupmodule", "currentmoduleparameter", "moduleparameter", "everystarttext", "everystoptext", "startTEXpage", "stopTEXpage", "enablemode", "disablemode", "preventmode", "definemode", "globalenablemode", "globaldisablemode", "globalpreventmode", "pushmode", "popmode", "typescriptone", "typescripttwo", "typescriptthree", "mathsizesuffix", "mathordcode", "mathopcode", "mathbincode", "mathrelcode", "mathopencode", "mathclosecode", "mathpunctcode", "mathalphacode", "mathinnercode", "mathnothingcode", "mathlimopcode", "mathnolopcode", "mathboxcode", "mathchoicecode", "mathaccentcode", "mathradicalcode", "constantnumber", "constantnumberargument", "constantdimen", "constantdimenargument", "constantemptyargument", "continueifinputfile", "luastringsep", "!!bs", "!!es", "lefttorightmark", "righttoleftmark", "lrm", "rlm", "bidilre", "bidirle", "bidipop", "bidilro", "bidirlo", "breakablethinspace", "nobreakspace", "nonbreakablespace", "narrownobreakspace", "zerowidthnobreakspace", "ideographicspace", "ideographichalffillspace", "twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace", "figurespace", "punctuationspace", "hairspace", "enquad", "emquad", "zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj", "optionalspace", "asciispacechar", "softhyphen", "Ux", "eUx", "Umathaccents", "parfillleftskip", "parfillrightskip" },
- ["helpers"]={ "startsetups", "stopsetups", "startxmlsetups", "stopxmlsetups", "startluasetups", "stopluasetups", "starttexsetups", "stoptexsetups", "startrawsetups", "stoprawsetups", "startlocalsetups", "stoplocalsetups", "starttexdefinition", "stoptexdefinition", "starttexcode", "stoptexcode", "startcontextcode", "stopcontextcode", "startcontextdefinitioncode", "stopcontextdefinitioncode", "texdefinition", "doifelsesetups", "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", "fastsetup", "copysetups", "resetsetups", "doifelsecommandhandler", "doifcommandhandlerelse", "doifnotcommandhandler", "doifcommandhandler", "newmode", "setmode", "resetmode", "newsystemmode", "setsystemmode", "resetsystemmode", "pushsystemmode", "popsystemmode", "globalsetmode", "globalresetmode", "globalsetsystemmode", "globalresetsystemmode", "booleanmodevalue", "newcount", "newdimen", "newskip", "newmuskip", "newbox", "newtoks", "newread", "newwrite", "newmarks", "newinsert", "newattribute", "newif", "newlanguage", "newfamily", "newfam", "newhelp", "then", "begcsname", "autorule", "strippedcsname", "checkedstrippedcsname", "firstargumentfalse", "firstargumenttrue", "secondargumentfalse", "secondargumenttrue", "thirdargumentfalse", "thirdargumenttrue", "fourthargumentfalse", "fourthargumenttrue", "fifthargumentfalse", "fifthargumenttrue", "sixthargumentfalse", "sixthargumenttrue", "seventhargumentfalse", "seventhargumenttrue", "vkern", "hkern", "doglobal", "dodoglobal", "redoglobal", "resetglobal", "donothing", "dontcomplain", "forgetall", "donetrue", "donefalse", "foundtrue", "foundfalse", "inlineordisplaymath", "indisplaymath", "forcedisplaymath", "startforceddisplaymath", "stopforceddisplaymath", "startpickupmath", "stoppickupmath", "reqno", "mathortext", "htdp", "unvoidbox", "hfilll", "vfilll", "mathbox", "mathlimop", "mathnolop", "mathnothing", "mathalpha", "currentcatcodetable", "defaultcatcodetable", "catcodetablename", "newcatcodetable", "startcatcodetable", "stopcatcodetable", "startextendcatcodetable", "stopextendcatcodetable", "pushcatcodetable", "popcatcodetable", "restorecatcodes", "setcatcodetable", "letcatcodecommand", "defcatcodecommand", "uedcatcodecommand", "hglue", "vglue", "hfillneg", "vfillneg", "hfilllneg", "vfilllneg", "ruledhss", "ruledhfil", "ruledhfill", "ruledhfilll", "ruledhfilneg", "ruledhfillneg", "normalhfillneg", "normalhfilllneg", "ruledvss", "ruledvfil", "ruledvfill", "ruledvfilll", "ruledvfilneg", "ruledvfillneg", "normalvfillneg", "normalvfilllneg", "ruledhbox", "ruledvbox", "ruledvtop", "ruledvcenter", "ruledmbox", "ruledhpack", "ruledvpack", "ruledtpack", "ruledhskip", "ruledvskip", "ruledkern", "ruledmskip", "ruledmkern", "ruledhglue", "ruledvglue", "normalhglue", "normalvglue", "ruledpenalty", "filledhboxb", "filledhboxr", "filledhboxg", "filledhboxc", "filledhboxm", "filledhboxy", "filledhboxk", "scratchcounter", "globalscratchcounter", "privatescratchcounter", "scratchdimen", "globalscratchdimen", "privatescratchdimen", "scratchskip", "globalscratchskip", "privatescratchskip", "scratchmuskip", "globalscratchmuskip", "privatescratchmuskip", "scratchtoks", "globalscratchtoks", "privatescratchtoks", "scratchbox", "globalscratchbox", "privatescratchbox", "globalscratchcounterone", "globalscratchcountertwo", "globalscratchcounterthree", "groupedcommand", "groupedcommandcs", "triggergroupedcommand", "triggergroupedcommandcs", "simplegroupedcommand", "pickupgroupedcommand", "normalbaselineskip", "normallineskip", "normallineskiplimit", "availablehsize", "localhsize", "setlocalhsize", "distributedhsize", "hsizefraction", "next", "nexttoken", "nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs", "flushnextbox", "boxisempty", "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", "scratchdistance", "scratchhsize", "scratchvsize", "scratchxoffset", "scratchyoffset", "scratchhoffset", "scratchvoffset", "scratchxposition", "scratchyposition", "scratchtopoffset", "scratchbottomoffset", "scratchleftoffset", "scratchrightoffset", "scratchcounterone", "scratchcountertwo", "scratchcounterthree", "scratchcounterfour", "scratchcounterfive", "scratchcountersix", "scratchdimenone", "scratchdimentwo", "scratchdimenthree", "scratchdimenfour", "scratchdimenfive", "scratchdimensix", "scratchskipone", "scratchskiptwo", "scratchskipthree", "scratchskipfour", "scratchskipfive", "scratchskipsix", "scratchmuskipone", "scratchmuskiptwo", "scratchmuskipthree", "scratchmuskipfour", "scratchmuskipfive", "scratchmuskipsix", "scratchtoksone", "scratchtokstwo", "scratchtoksthree", "scratchtoksfour", "scratchtoksfive", "scratchtokssix", "scratchboxone", "scratchboxtwo", "scratchboxthree", "scratchboxfour", "scratchboxfive", "scratchboxsix", "scratchnx", "scratchny", "scratchmx", "scratchmy", "scratchunicode", "scratchmin", "scratchmax", "scratchleftskip", "scratchrightskip", "scratchtopskip", "scratchbottomskip", "doif", "doifnot", "doifelse", "firstinset", "doifinset", "doifnotinset", "doifelseinset", "doifinsetelse", "doifelsenextchar", "doifnextcharelse", "doifelsenextoptional", "doifnextoptionalelse", "doifelsenextoptionalcs", "doifnextoptionalcselse", "doifelsefastoptionalcheck", "doiffastoptionalcheckelse", "doifelsefastoptionalcheckcs", "doiffastoptionalcheckcselse", "doifelsenextbgroup", "doifnextbgroupelse", "doifelsenextbgroupcs", "doifnextbgroupcselse", "doifelsenextparenthesis", "doifnextparenthesiselse", "doifelseundefined", "doifundefinedelse", "doifelsedefined", "doifdefinedelse", "doifundefined", "doifdefined", "doifelsevalue", "doifvalue", "doifnotvalue", "doifnothing", "doifsomething", "doifelsenothing", "doifnothingelse", "doifelsesomething", "doifsomethingelse", "doifvaluenothing", "doifvaluesomething", "doifelsevaluenothing", "doifvaluenothingelse", "doifelsedimension", "doifdimensionelse", "doifelsenumber", "doifnumberelse", "doifnumber", "doifnotnumber", "doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon", "doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse", "doifelseassignment", "doifassignmentelse", "docheckassignment", "doifelseassignmentcs", "doifassignmentelsecs", "doiftext", "doifelsetext", "doiftextelse", "doifnottext", "tracingall", "tracingnone", "loggingall", "removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to", "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", "emspace", "charspace", "nbsp", "crlf", "obeyspaces", "obeylines", "obeyedspace", "obeyedline", "obeyedtab", "obeyedpage", "normalspace", "executeifdefined", "singleexpandafter", "doubleexpandafter", "tripleexpandafter", "dontleavehmode", "removelastspace", "removeunwantedspaces", "keepunwantedspaces", "removepunctuation", "ignoreparskip", "forcestrutdepth", "onlynonbreakablespace", "wait", "writestatus", "define", "defineexpandable", "redefine", "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", "measured", "installcorenamespace", "getvalue", "getuvalue", "setvalue", "setevalue", "setgvalue", "setxvalue", "letvalue", "letgvalue", "resetvalue", "undefinevalue", "ignorevalue", "setuvalue", "setuevalue", "setugvalue", "setuxvalue", "globallet", "glet", "udef", "ugdef", "uedef", "uxdef", "checked", "unique", "getparameters", "geteparameters", "getgparameters", "getxparameters", "forgetparameters", "copyparameters", "getdummyparameters", "dummyparameter", "directdummyparameter", "setdummyparameter", "letdummyparameter", "setexpandeddummyparameter", "usedummystyleandcolor", "usedummystyleparameter", "usedummycolorparameter", "processcommalist", "processcommacommand", "quitcommalist", "quitprevcommalist", "processaction", "processallactions", "processfirstactioninset", "processallactionsinset", "unexpanded", "expanded", "startexpanded", "stopexpanded", "protected", "protect", "unprotect", "firstofoneargument", "firstoftwoarguments", "secondoftwoarguments", "firstofthreearguments", "secondofthreearguments", "thirdofthreearguments", "firstoffourarguments", "secondoffourarguments", "thirdoffourarguments", "fourthoffourarguments", "firstoffivearguments", "secondoffivearguments", "thirdoffivearguments", "fourthoffivearguments", "fifthoffivearguments", "firstofsixarguments", "secondofsixarguments", "thirdofsixarguments", "fourthofsixarguments", "fifthofsixarguments", "sixthofsixarguments", "firstofoneunexpanded", "firstoftwounexpanded", "secondoftwounexpanded", "firstofthreeunexpanded", "secondofthreeunexpanded", "thirdofthreeunexpanded", "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "fastloopindex", "fastloopfinal", "dowith", "newconstant", "setnewconstant", "setconstant", "setconstantvalue", "newconditional", "settrue", "setfalse", "settruevalue", "setfalsevalue", "newmacro", "setnewmacro", "newfraction", "newsignal", "dosingleempty", "dodoubleempty", "dotripleempty", "doquadrupleempty", "doquintupleempty", "dosixtupleempty", "doseventupleempty", "dosingleargument", "dodoubleargument", "dotripleargument", "doquadrupleargument", "doquintupleargument", "dosixtupleargument", "doseventupleargument", "dosinglegroupempty", "dodoublegroupempty", "dotriplegroupempty", "doquadruplegroupempty", "doquintuplegroupempty", "permitspacesbetweengroups", "dontpermitspacesbetweengroups", "nopdfcompression", "maximumpdfcompression", "normalpdfcompression", "onlypdfobjectcompression", "nopdfobjectcompression", "modulonumber", "dividenumber", "getfirstcharacter", "doifelsefirstchar", "doiffirstcharelse", "startnointerference", "stopnointerference", "twodigits", "threedigits", "leftorright", "offinterlineskip", "oninterlineskip", "nointerlineskip", "strut", "halfstrut", "quarterstrut", "depthstrut", "halflinestrut", "noheightstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "strutgap", "begstrut", "endstrut", "lineheight", "leftboundary", "rightboundary", "signalcharacter", "ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing", "ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing", "opordspacing", "opopspacing", "opbinspacing", "oprelspacing", "opopenspacing", "opclosespacing", "oppunctspacing", "opinnerspacing", "binordspacing", "binopspacing", "binbinspacing", "binrelspacing", "binopenspacing", "binclosespacing", "binpunctspacing", "bininnerspacing", "relordspacing", "relopspacing", "relbinspacing", "relrelspacing", "relopenspacing", "relclosespacing", "relpunctspacing", "relinnerspacing", "openordspacing", "openopspacing", "openbinspacing", "openrelspacing", "openopenspacing", "openclosespacing", "openpunctspacing", "openinnerspacing", "closeordspacing", "closeopspacing", "closebinspacing", "closerelspacing", "closeopenspacing", "closeclosespacing", "closepunctspacing", "closeinnerspacing", "punctordspacing", "punctopspacing", "punctbinspacing", "punctrelspacing", "punctopenspacing", "punctclosespacing", "punctpunctspacing", "punctinnerspacing", "innerordspacing", "inneropspacing", "innerbinspacing", "innerrelspacing", "inneropenspacing", "innerclosespacing", "innerpunctspacing", "innerinnerspacing", "normalreqno", "startimath", "stopimath", "normalstartimath", "normalstopimath", "startdmath", "stopdmath", "normalstartdmath", "normalstopdmath", "normalsuperscript", "normalsubscript", "normalnosuperscript", "normalnosubscript", "superscript", "subscript", "nosuperscript", "nosubscript", "uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette", "mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox", "mathtext", "setmathsmalltextbox", "setmathtextbox", "pushmathstyle", "popmathstyle", "triggerdisplaystyle", "triggertextstyle", "triggerscriptstyle", "triggerscriptscriptstyle", "triggeruncrampedstyle", "triggercrampedstyle", "triggersmallstyle", "triggeruncrampedsmallstyle", "triggercrampedsmallstyle", "triggerbigstyle", "triggeruncrampedbigstyle", "triggercrampedbigstyle", "luaexpr", "expelsedoif", "expdoif", "expdoifnot", "expdoifelsecommon", "expdoifcommonelse", "expdoifelseinset", "expdoifinsetelse", "ctxdirectlua", "ctxlatelua", "ctxsprint", "ctxwrite", "ctxcommand", "ctxdirectcommand", "ctxlatecommand", "ctxreport", "ctxlua", "luacode", "lateluacode", "directluacode", "registerctxluafile", "ctxloadluafile", "luaversion", "luamajorversion", "luaminorversion", "ctxluacode", "luaconditional", "luaexpanded", "startluaparameterset", "stopluaparameterset", "luaparameterset", "definenamedlua", "obeylualines", "obeyluatokens", "startluacode", "stopluacode", "startlua", "stoplua", "startctxfunction", "stopctxfunction", "ctxfunction", "startctxfunctiondefinition", "stopctxfunctiondefinition", "installctxfunction", "installprotectedctxfunction", "installprotectedctxscanner", "installctxscanner", "resetctxscanner", "cldprocessfile", "cldloadfile", "cldloadviafile", "cldcontext", "cldcommand", "carryoverpar", "lastlinewidth", "assumelongusagecs", "Umathbotaccent", "righttolefthbox", "lefttorighthbox", "righttoleftvbox", "lefttorightvbox", "righttoleftvtop", "lefttorightvtop", "rtlhbox", "ltrhbox", "rtlvbox", "ltrvbox", "rtlvtop", "ltrvtop", "autodirhbox", "autodirvbox", "autodirvtop", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "lefttoright", "righttoleft", "checkedlefttoright", "checkedrighttoleft", "synchronizelayoutdirection", "synchronizedisplaydirection", "synchronizeinlinedirection", "dirlre", "dirrle", "dirlro", "dirrlo", "lesshyphens", "morehyphens", "nohyphens", "dohyphens", "Ucheckedstartdisplaymath", "Ucheckedstopdisplaymath", "break", "nobreak", "allowbreak", "goodbreak", "nospace", "nospacing", "dospacing", "naturalhbox", "naturalvbox", "naturalvtop", "naturalhpack", "naturalvpack", "naturaltpack", "reversehbox", "reversevbox", "reversevtop", "reversehpack", "reversevpack", "reversetpack", "frule", "compoundhyphenpenalty", "start", "stop" },
+ ["constants"]={ "zerocount", "minusone", "minustwo", "plusone", "plustwo", "plusthree", "plusfour", "plusfive", "plussix", "plusseven", "pluseight", "plusnine", "plusten", "plussixteen", "plusfifty", "plushundred", "plusonehundred", "plustwohundred", "plusfivehundred", "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", "maxcardminusone", "zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxcount", "maxdimen", "scaledpoint", "thousandpoint", "points", "halfpoint", "zeroskip", "zeromuskip", "onemuskip", "pluscxxvii", "pluscxxviii", "pluscclv", "pluscclvi", "normalpagebox", "directionlefttoright", "directionrighttoleft", "endoflinetoken", "outputnewlinechar", "emptytoks", "empty", "undefined", "voidbox", "emptybox", "emptyvbox", "emptyhbox", "bigskipamount", "medskipamount", "smallskipamount", "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", "texenginefunctionality", "luatexengine", "pdftexengine", "xetexengine", "unknownengine", "contextformat", "contextversion", "contextkind", "contextlmtxmode", "contextmark", "mksuffix", "activecatcode", "bgroup", "egroup", "endline", "conditionaltrue", "conditionalfalse", "attributeunsetvalue", "uprotationangle", "rightrotationangle", "downrotationangle", "leftrotationangle", "inicatcodes", "ctxcatcodes", "texcatcodes", "notcatcodes", "txtcatcodes", "vrbcatcodes", "prtcatcodes", "nilcatcodes", "luacatcodes", "tpacatcodes", "tpbcatcodes", "xmlcatcodes", "ctdcatcodes", "escapecatcode", "begingroupcatcode", "endgroupcatcode", "mathshiftcatcode", "alignmentcatcode", "endoflinecatcode", "parametercatcode", "superscriptcatcode", "subscriptcatcode", "ignorecatcode", "spacecatcode", "lettercatcode", "othercatcode", "activecatcode", "commentcatcode", "invalidcatcode", "tabasciicode", "newlineasciicode", "formfeedasciicode", "endoflineasciicode", "endoffileasciicode", "spaceasciicode", "hashasciicode", "dollarasciicode", "commentasciicode", "ampersandasciicode", "colonasciicode", "backslashasciicode", "circumflexasciicode", "underscoreasciicode", "leftbraceasciicode", "barasciicode", "rightbraceasciicode", "tildeasciicode", "delasciicode", "leftparentasciicode", "rightparentasciicode", "lessthanasciicode", "morethanasciicode", "doublecommentsignal", "atsignasciicode", "exclamationmarkasciicode", "questionmarkasciicode", "doublequoteasciicode", "singlequoteasciicode", "forwardslashasciicode", "primeasciicode", "hyphenasciicode", "activemathcharcode", "activetabtoken", "activeformfeedtoken", "activeendoflinetoken", "batchmodecode", "nonstopmodecode", "scrollmodecode", "errorstopmodecode", "bottomlevelgroupcode", "simplegroupcode", "hboxgroupcode", "adjustedhboxgroupcode", "vboxgroupcode", "vtopgroupcode", "aligngroupcode", "noaligngroupcode", "outputgroupcode", "mathgroupcode", "discretionarygroupcode", "insertgroupcode", "vcentergroupcode", "mathchoicegroupcode", "semisimplegroupcode", "mathshiftgroupcode", "mathleftgroupcode", "vadjustgroupcode", "charnodecode", "hlistnodecode", "vlistnodecode", "rulenodecode", "insertnodecode", "marknodecode", "adjustnodecode", "ligaturenodecode", "discretionarynodecode", "whatsitnodecode", "mathnodecode", "gluenodecode", "kernnodecode", "penaltynodecode", "unsetnodecode", "mathsnodecode", "charifcode", "catifcode", "numifcode", "dimifcode", "oddifcode", "vmodeifcode", "hmodeifcode", "mmodeifcode", "innerifcode", "voidifcode", "hboxifcode", "vboxifcode", "xifcode", "eofifcode", "trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode", "fontslantperpoint", "fontinterwordspace", "fontinterwordstretch", "fontinterwordshrink", "fontexheight", "fontemwidth", "fontextraspace", "slantperpoint", "mathexheight", "mathemwidth", "interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace", "mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight", "muquad", "startmode", "stopmode", "startnotmode", "stopnotmode", "startmodeset", "stopmodeset", "doifmode", "doifelsemode", "doifmodeelse", "doifnotmode", "startmodeset", "stopmodeset", "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", "doifallmodes", "doifelseallmodes", "doifallmodeselse", "doifnotallmodes", "startenvironment", "stopenvironment", "environment", "startcomponent", "stopcomponent", "component", "startproduct", "stopproduct", "product", "startproject", "stopproject", "project", "starttext", "stoptext", "startnotext", "stopnotext", "startdocument", "stopdocument", "documentvariable", "unexpandeddocumentvariable", "setupdocument", "presetdocument", "doifelsedocumentvariable", "doifdocumentvariableelse", "doifdocumentvariable", "doifnotdocumentvariable", "startmodule", "stopmodule", "usemodule", "usetexmodule", "useluamodule", "setupmodule", "currentmoduleparameter", "moduleparameter", "everystarttext", "everystoptext", "startTEXpage", "stopTEXpage", "enablemode", "disablemode", "preventmode", "definemode", "globalenablemode", "globaldisablemode", "globalpreventmode", "pushmode", "popmode", "typescriptone", "typescripttwo", "typescriptthree", "mathsizesuffix", "mathordcode", "mathopcode", "mathbincode", "mathrelcode", "mathopencode", "mathclosecode", "mathpunctcode", "mathalphacode", "mathinnercode", "mathnothingcode", "mathlimopcode", "mathnolopcode", "mathboxcode", "mathchoicecode", "mathaccentcode", "mathradicalcode", "constantnumber", "constantnumberargument", "constantdimen", "constantdimenargument", "constantemptyargument", "continueifinputfile", "luastringsep", "!!bs", "!!es", "lefttorightmark", "righttoleftmark", "lrm", "rlm", "bidilre", "bidirle", "bidipop", "bidilro", "bidirlo", "breakablethinspace", "nobreakspace", "nonbreakablespace", "narrownobreakspace", "zerowidthnobreakspace", "ideographicspace", "ideographichalffillspace", "twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace", "figurespace", "punctuationspace", "hairspace", "enquad", "emquad", "zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj", "optionalspace", "asciispacechar", "softhyphen", "Ux", "eUx", "Umathaccents", "parfillleftskip", "parfillrightskip", "startlmtxmode", "stoplmtxmode", "startmkivmode", "stopmkivmode", "wildcardsymbol" },
+ ["helpers"]={ "startsetups", "stopsetups", "startxmlsetups", "stopxmlsetups", "startluasetups", "stopluasetups", "starttexsetups", "stoptexsetups", "startrawsetups", "stoprawsetups", "startlocalsetups", "stoplocalsetups", "starttexdefinition", "stoptexdefinition", "starttexcode", "stoptexcode", "startcontextcode", "stopcontextcode", "startcontextdefinitioncode", "stopcontextdefinitioncode", "texdefinition", "doifelsesetups", "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", "fastsetup", "copysetups", "resetsetups", "doifelsecommandhandler", "doifcommandhandlerelse", "doifnotcommandhandler", "doifcommandhandler", "newmode", "setmode", "resetmode", "newsystemmode", "setsystemmode", "resetsystemmode", "pushsystemmode", "popsystemmode", "globalsetmode", "globalresetmode", "globalsetsystemmode", "globalresetsystemmode", "booleanmodevalue", "newcount", "newdimen", "newskip", "newmuskip", "newbox", "newtoks", "newread", "newwrite", "newmarks", "newinsert", "newattribute", "newif", "newlanguage", "newfamily", "newfam", "newhelp", "then", "begcsname", "autorule", "strippedcsname", "checkedstrippedcsname", "firstargumentfalse", "firstargumenttrue", "secondargumentfalse", "secondargumenttrue", "thirdargumentfalse", "thirdargumenttrue", "fourthargumentfalse", "fourthargumenttrue", "fifthargumentfalse", "fifthargumenttrue", "sixthargumentfalse", "sixthargumenttrue", "seventhargumentfalse", "seventhargumenttrue", "vkern", "hkern", "doglobal", "dodoglobal", "redoglobal", "resetglobal", "donothing", "dontcomplain", "forgetall", "donetrue", "donefalse", "foundtrue", "foundfalse", "inlineordisplaymath", "indisplaymath", "forcedisplaymath", "startforceddisplaymath", "stopforceddisplaymath", "startpickupmath", "stoppickupmath", "reqno", "mathortext", "htdp", "unvoidbox", "hfilll", "vfilll", "mathbox", "mathlimop", "mathnolop", "mathnothing", "mathalpha", "currentcatcodetable", "defaultcatcodetable", "catcodetablename", "newcatcodetable", "startcatcodetable", "stopcatcodetable", "startextendcatcodetable", "stopextendcatcodetable", "pushcatcodetable", "popcatcodetable", "restorecatcodes", "setcatcodetable", "letcatcodecommand", "defcatcodecommand", "uedcatcodecommand", "hglue", "vglue", "hfillneg", "vfillneg", "hfilllneg", "vfilllneg", "ruledhss", "ruledhfil", "ruledhfill", "ruledhfilll", "ruledhfilneg", "ruledhfillneg", "normalhfillneg", "normalhfilllneg", "ruledvss", "ruledvfil", "ruledvfill", "ruledvfilll", "ruledvfilneg", "ruledvfillneg", "normalvfillneg", "normalvfilllneg", "ruledhbox", "ruledvbox", "ruledvtop", "ruledvcenter", "ruledmbox", "ruledhpack", "ruledvpack", "ruledtpack", "ruledhskip", "ruledvskip", "ruledkern", "ruledmskip", "ruledmkern", "ruledhglue", "ruledvglue", "normalhglue", "normalvglue", "ruledpenalty", "filledhboxb", "filledhboxr", "filledhboxg", "filledhboxc", "filledhboxm", "filledhboxy", "filledhboxk", "scratchcounter", "globalscratchcounter", "privatescratchcounter", "scratchdimen", "globalscratchdimen", "privatescratchdimen", "scratchskip", "globalscratchskip", "privatescratchskip", "scratchmuskip", "globalscratchmuskip", "privatescratchmuskip", "scratchtoks", "globalscratchtoks", "privatescratchtoks", "scratchbox", "globalscratchbox", "privatescratchbox", "globalscratchcounterone", "globalscratchcountertwo", "globalscratchcounterthree", "groupedcommand", "groupedcommandcs", "triggergroupedcommand", "triggergroupedcommandcs", "simplegroupedcommand", "pickupgroupedcommand", "normalbaselineskip", "normallineskip", "normallineskiplimit", "availablehsize", "localhsize", "setlocalhsize", "distributedhsize", "hsizefraction", "next", "nexttoken", "nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs", "flushnextbox", "boxisempty", "givenwidth", "givenheight", "givendepth", "scangivendimensions", "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", "scratchdistance", "scratchtotal", "scratchhsize", "scratchvsize", "scratchxoffset", "scratchyoffset", "scratchhoffset", "scratchvoffset", "scratchxposition", "scratchyposition", "scratchtopoffset", "scratchbottomoffset", "scratchleftoffset", "scratchrightoffset", "scratchcounterone", "scratchcountertwo", "scratchcounterthree", "scratchcounterfour", "scratchcounterfive", "scratchcountersix", "scratchdimenone", "scratchdimentwo", "scratchdimenthree", "scratchdimenfour", "scratchdimenfive", "scratchdimensix", "scratchskipone", "scratchskiptwo", "scratchskipthree", "scratchskipfour", "scratchskipfive", "scratchskipsix", "scratchmuskipone", "scratchmuskiptwo", "scratchmuskipthree", "scratchmuskipfour", "scratchmuskipfive", "scratchmuskipsix", "scratchtoksone", "scratchtokstwo", "scratchtoksthree", "scratchtoksfour", "scratchtoksfive", "scratchtokssix", "scratchboxone", "scratchboxtwo", "scratchboxthree", "scratchboxfour", "scratchboxfive", "scratchboxsix", "scratchnx", "scratchny", "scratchmx", "scratchmy", "scratchunicode", "scratchmin", "scratchmax", "scratchleftskip", "scratchrightskip", "scratchtopskip", "scratchbottomskip", "doif", "doifnot", "doifelse", "firstinset", "doifinset", "doifnotinset", "doifelseinset", "doifinsetelse", "doifelsenextchar", "doifnextcharelse", "doifelsenextcharcs", "doifnextcharcselse", "doifelsenextoptional", "doifnextoptionalelse", "doifelsenextoptionalcs", "doifnextoptionalcselse", "doifelsefastoptionalcheck", "doiffastoptionalcheckelse", "doifelsefastoptionalcheckcs", "doiffastoptionalcheckcselse", "doifelsenextbgroup", "doifnextbgroupelse", "doifelsenextbgroupcs", "doifnextbgroupcselse", "doifelsenextparenthesis", "doifnextparenthesiselse", "doifelseundefined", "doifundefinedelse", "doifelsedefined", "doifdefinedelse", "doifundefined", "doifdefined", "doifelsevalue", "doifvalue", "doifnotvalue", "doifnothing", "doifsomething", "doifelsenothing", "doifnothingelse", "doifelsesomething", "doifsomethingelse", "doifvaluenothing", "doifvaluesomething", "doifelsevaluenothing", "doifvaluenothingelse", "doifelsedimension", "doifdimensionelse", "doifelsenumber", "doifnumberelse", "doifnumber", "doifnotnumber", "doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon", "doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse", "doifelseassignment", "doifassignmentelse", "docheckassignment", "doifelseassignmentcs", "doifassignmentelsecs", "validassignment", "novalidassignment", "doiftext", "doifelsetext", "doiftextelse", "doifnottext", "quitcondition", "truecondition", "falsecondition", "tracingall", "tracingnone", "loggingall", "removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to", "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", "emspace", "charspace", "nbsp", "crlf", "obeyspaces", "obeylines", "obeyedspace", "obeyedline", "obeyedtab", "obeyedpage", "normalspace", "executeifdefined", "singleexpandafter", "doubleexpandafter", "tripleexpandafter", "dontleavehmode", "removelastspace", "removeunwantedspaces", "keepunwantedspaces", "removepunctuation", "ignoreparskip", "forcestrutdepth", "onlynonbreakablespace", "wait", "writestatus", "define", "defineexpandable", "redefine", "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", "measured", "directmeasure", "setquantity", "setequantity", "setgquantity", "setxquantity", "definequantity", "freezequantity", "quantity", "quantitied", "directquantity", "installcorenamespace", "getvalue", "getuvalue", "setvalue", "setevalue", "setgvalue", "setxvalue", "letvalue", "letgvalue", "resetvalue", "undefinevalue", "ignorevalue", "setuvalue", "setuevalue", "setugvalue", "setuxvalue", "globallet", "glet", "udef", "ugdef", "uedef", "uxdef", "checked", "unique", "getparameters", "geteparameters", "getgparameters", "getxparameters", "forgetparameters", "copyparameters", "getdummyparameters", "dummyparameter", "directdummyparameter", "setdummyparameter", "letdummyparameter", "setexpandeddummyparameter", "usedummystyleandcolor", "usedummystyleparameter", "usedummycolorparameter", "processcommalist", "processcommacommand", "quitcommalist", "quitprevcommalist", "processaction", "processallactions", "processfirstactioninset", "processallactionsinset", "unexpanded", "expanded", "startexpanded", "stopexpanded", "protected", "protect", "unprotect", "firstofoneargument", "firstoftwoarguments", "secondoftwoarguments", "firstofthreearguments", "secondofthreearguments", "thirdofthreearguments", "firstoffourarguments", "secondoffourarguments", "thirdoffourarguments", "fourthoffourarguments", "firstoffivearguments", "secondoffivearguments", "thirdoffivearguments", "fourthoffivearguments", "fifthoffivearguments", "firstofsixarguments", "secondofsixarguments", "thirdofsixarguments", "fourthofsixarguments", "fifthofsixarguments", "sixthofsixarguments", "firstofoneunexpanded", "firstoftwounexpanded", "secondoftwounexpanded", "firstofthreeunexpanded", "secondofthreeunexpanded", "thirdofthreeunexpanded", "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "fastloopindex", "fastloopfinal", "dowith", "newconstant", "setnewconstant", "setconstant", "setconstantvalue", "newconditional", "settrue", "setfalse", "settruevalue", "setfalsevalue", "newmacro", "setnewmacro", "newfraction", "newsignal", "dosingleempty", "dodoubleempty", "dotripleempty", "doquadrupleempty", "doquintupleempty", "dosixtupleempty", "doseventupleempty", "dosingleargument", "dodoubleargument", "dotripleargument", "doquadrupleargument", "doquintupleargument", "dosixtupleargument", "doseventupleargument", "dosinglegroupempty", "dodoublegroupempty", "dotriplegroupempty", "doquadruplegroupempty", "doquintuplegroupempty", "permitspacesbetweengroups", "dontpermitspacesbetweengroups", "nopdfcompression", "maximumpdfcompression", "normalpdfcompression", "onlypdfobjectcompression", "nopdfobjectcompression", "modulonumber", "dividenumber", "getfirstcharacter", "doifelsefirstchar", "doiffirstcharelse", "startnointerference", "stopnointerference", "twodigits", "threedigits", "leftorright", "offinterlineskip", "oninterlineskip", "nointerlineskip", "strut", "halfstrut", "quarterstrut", "depthstrut", "halflinestrut", "noheightstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "strutgap", "begstrut", "endstrut", "lineheight", "leftboundary", "rightboundary", "signalcharacter", "shiftbox", "vpackbox", "hpackbox", "vpackedbox", "hpackedbox", "ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing", "ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing", "opordspacing", "opopspacing", "opbinspacing", "oprelspacing", "opopenspacing", "opclosespacing", "oppunctspacing", "opinnerspacing", "binordspacing", "binopspacing", "binbinspacing", "binrelspacing", "binopenspacing", "binclosespacing", "binpunctspacing", "bininnerspacing", "relordspacing", "relopspacing", "relbinspacing", "relrelspacing", "relopenspacing", "relclosespacing", "relpunctspacing", "relinnerspacing", "openordspacing", "openopspacing", "openbinspacing", "openrelspacing", "openopenspacing", "openclosespacing", "openpunctspacing", "openinnerspacing", "closeordspacing", "closeopspacing", "closebinspacing", "closerelspacing", "closeopenspacing", "closeclosespacing", "closepunctspacing", "closeinnerspacing", "punctordspacing", "punctopspacing", "punctbinspacing", "punctrelspacing", "punctopenspacing", "punctclosespacing", "punctpunctspacing", "punctinnerspacing", "innerordspacing", "inneropspacing", "innerbinspacing", "innerrelspacing", "inneropenspacing", "innerclosespacing", "innerpunctspacing", "innerinnerspacing", "normalreqno", "startimath", "stopimath", "normalstartimath", "normalstopimath", "startdmath", "stopdmath", "normalstartdmath", "normalstopdmath", "normalsuperscript", "normalsubscript", "normalnosuperscript", "normalnosubscript", "superscript", "subscript", "nosuperscript", "nosubscript", "uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette", "mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox", "mathtext", "setmathsmalltextbox", "setmathtextbox", "pushmathstyle", "popmathstyle", "triggerdisplaystyle", "triggertextstyle", "triggerscriptstyle", "triggerscriptscriptstyle", "triggeruncrampedstyle", "triggercrampedstyle", "triggersmallstyle", "triggeruncrampedsmallstyle", "triggercrampedsmallstyle", "triggerbigstyle", "triggeruncrampedbigstyle", "triggercrampedbigstyle", "luaexpr", "expelsedoif", "expdoif", "expdoifnot", "expdoifelsecommon", "expdoifcommonelse", "expdoifelseinset", "expdoifinsetelse", "ctxdirectlua", "ctxlatelua", "ctxsprint", "ctxwrite", "ctxcommand", "ctxdirectcommand", "ctxlatecommand", "ctxreport", "ctxlua", "luacode", "lateluacode", "directluacode", "registerctxluafile", "ctxloadluafile", "luaversion", "luamajorversion", "luaminorversion", "ctxluacode", "luaconditional", "luaexpanded", "startluaparameterset", "stopluaparameterset", "luaparameterset", "definenamedlua", "obeylualines", "obeyluatokens", "startluacode", "stopluacode", "startlua", "stoplua", "startctxfunction", "stopctxfunction", "ctxfunction", "startctxfunctiondefinition", "stopctxfunctiondefinition", "installctxfunction", "installprotectedctxfunction", "installprotectedctxscanner", "installctxscanner", "resetctxscanner", "cldprocessfile", "cldloadfile", "cldloadviafile", "cldcontext", "cldcommand", "carryoverpar", "lastlinewidth", "assumelongusagecs", "Umathbotaccent", "righttolefthbox", "lefttorighthbox", "righttoleftvbox", "lefttorightvbox", "righttoleftvtop", "lefttorightvtop", "rtlhbox", "ltrhbox", "rtlvbox", "ltrvbox", "rtlvtop", "ltrvtop", "autodirhbox", "autodirvbox", "autodirvtop", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "lefttoright", "righttoleft", "checkedlefttoright", "checkedrighttoleft", "synchronizelayoutdirection", "synchronizedisplaydirection", "synchronizeinlinedirection", "dirlre", "dirrle", "dirlro", "dirrlo", "lesshyphens", "morehyphens", "nohyphens", "dohyphens", "Ucheckedstartdisplaymath", "Ucheckedstopdisplaymath", "break", "nobreak", "allowbreak", "goodbreak", "nospace", "nospacing", "dospacing", "naturalhbox", "naturalvbox", "naturalvtop", "naturalhpack", "naturalvpack", "naturaltpack", "reversehbox", "reversevbox", "reversevtop", "reversehpack", "reversevpack", "reversetpack", "frule", "compoundhyphenpenalty", "start", "stop", "unsupportedcs" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-interfaces.lua b/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-interfaces.lua
index 6547cad51d0..5cbf4dce3f8 100644
--- a/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-interfaces.lua
+++ b/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-interfaces.lua
@@ -1,11 +1,11 @@
return {
- ["common"]={ "AEacute", "AEligature", "AEmacron", "AMSTEX", "Aacute", "Abreve", "Abreveacute", "Abrevedotbelow", "Abrevegrave", "Abrevehook", "Abrevetilde", "Acaron", "Acircumflex", "Acircumflexacute", "Acircumflexdotbelow", "Acircumflexgrave", "Acircumflexhook", "Acircumflextilde", "Adiaeresis", "Adiaeresismacron", "Adotaccent", "Adotaccentmacron", "Adotbelow", "Adoublegrave", "AfterPar", "Agrave", "Ahook", "Ainvertedbreve", "Alpha", "Alphabeticnumerals", "AmSTeX", "Amacron", "And", "Angstrom", "Aogonek", "Aring", "Aringacute", "Arrowvert", "Astroke", "Atilde", "BeforePar", "Beta", "Bhook", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "Box", "Bumpeq", "CONTEXT", "Cacute", "Cap", "Caps", "Ccaron", "Ccedilla", "Ccircumflex", "Cdotaccent", "Character", "Characters", "Chi", "Chook", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "Cstroke", "Cup", "DZcaronligature", "DZligature", "Dafrican", "Dcaron", "Ddownarrow", "Delta", "Dhook", "Doteq", "Downarrow", "Dstroke", "Dzcaronligature", "Dzligature", "ETEX", "Eacute", "Ebreve", "Ecaron", "Ecedilla", "Ecircumflex", "Ecircumflexacute", "Ecircumflexdotbelow", "Ecircumflexgrave", "Ecircumflexhook", "Ecircumflextilde", "Ediaeresis", "Edotaccent", "Edotbelow", "Edoublegrave", "Egrave", "Ehook", "Einvertedbreve", "Emacron", "Eogonek", "Epsilon", "Eta", "Eth", "Etilde", "Eulerconst", "EveryLine", "EveryPar", "Fhook", "Finv", "Gacute", "Game", "Gamma", "Gbreve", "Gcaron", "Gcircumflex", "Gcommaaccent", "Gdotaccent", "GetPar", "Ghook", "GotoPar", "Greeknumerals", "Gstroke", "Hat", "Hcaron", "Hcircumflex", "Hstroke", "IJligature", "INRSTEX", "Iacute", "Ibreve", "Icaron", "Icircumflex", "Idiaeresis", "Idotaccent", "Idotbelow", "Idoublegrave", "Igrave", "Ihook", "Iinvertedbreve", "Im", "Imacron", "Iogonek", "Iota", "Istroke", "Itilde", "Jcircumflex", "Join", "Kappa", "Kcaron", "Kcommaaccent", "Khook", "LAMSTEX", "LATEX", "LJligature", "LUAJITTEX", "LUATEX", "LaTeX", "Lacute", "LamSTeX", "Lambda", "Lbar", "Lcaron", "Lcommaaccent", "Ldotmiddle", "Ldsh", "Leftarrow", "Leftrightarrow", "Ljligature", "Lleftarrow", "Longleftarrow", "Longleftrightarrow", "Longmapsfrom", "Longmapsto", "Longrightarrow", "Lsh", "Lstroke", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTH", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "Mapsfrom", "Mapsto", "MetaFont", "MetaFun", "MetaPost", "Mu", "NJligature", "Nacute", "Ncaron", "Ncommaaccent", "Nearrow", "Neng", "Ngrave", "Njligature", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Ntilde", "Nu", "Numbers", "Nwarrow", "OEligature", "Oacute", "Obreve", "Ocaron", "Ocircumflex", "Ocircumflexacute", "Ocircumflexdotbelow", "Ocircumflexgrave", "Ocircumflexhook", "Ocircumflextilde", "Odiaeresis", "Odiaeresismacron", "Odotaccent", "Odotaccentmacron", "Odotbelow", "Odoublegrave", "Ograve", "Ohook", "Ohorn", "Ohornacute", "Ohorndotbelow", "Ohorngrave", "Ohornhook", "Ohorntilde", "Ohungarumlaut", "Oinvertedbreve", "Omacron", "Omega", "Omicron", "Oogonek", "Oogonekmacron", "Ostroke", "Ostrokeacute", "Otilde", "Otildemacron", "P", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "Phi", "Phook", "Pi", "PiCTeX", "Plankconst", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PropertyLine", "Psi", "PtToCm", "Racute", "Rcaron", "Rcommaaccent", "Rdoublegrave", "Rdsh", "Re", "ReadFile", "Relbar", "Rho", "Rightarrow", "Rinvertedbreve", "Romannumerals", "Rrightarrow", "Rsh", "S", "Sacute", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Scaron", "Scedilla", "Schwa", "Scircumflex", "Scommaaccent", "Searrow", "Sigma", "Smallcapped", "Subset", "Supset", "Swarrow", "TABLE", "TEX", "TaBlE", "Tau", "Tcaron", "Tcedilla", "Tcommaaccent", "TeX", "TheNormalizedFontSize", "Theta", "Thook", "Thorn", "TransparencyHack", "Tstroke", "Uacute", "Ubreve", "Ucaron", "Ucircumflex", "Udiaeresis", "Udiaeresisacute", "Udiaeresiscaron", "Udiaeresisgrave", "Udiaeresismacron", "Udotbelow", "Udoublegrave", "Ugrave", "Uhook", "Uhorn", "Uhornacute", "Uhorndotbelow", "Uhorngrave", "Uhornhook", "Uhorntilde", "Uhungarumlaut", "Uinvertedbreve", "Umacron", "Uogonek", "Uparrow", "Updownarrow", "Upsilon", "Uring", "Utilde", "Uuparrow", "VDash", "Vdash", "VerboseNumber", "Vert", "Vvdash", "WEEKDAY", "WORD", "WORDS", "Wcircumflex", "WidthSpanningText", "Word", "Words", "XETEX", "XeTeX", "Xi", "Yacute", "Ycircumflex", "Ydiaeresis", "Ydotbelow", "Ygrave", "Yhook", "Ymacron", "Ytilde", "Zacute", "Zcaron", "Zdotaccent", "Zeta", "Zhook", "Zstroke", "aacute", "abbreviation", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "about", "abreve", "abreveacute", "abrevedotbelow", "abrevegrave", "abrevehook", "abrevetilde", "acaron", "acircumflex", "acircumflexacute", "acircumflexdotbelow", "acircumflexgrave", "acircumflexhook", "acircumflextilde", "activatespacehandler", "actuarial", "acute", "acwopencirclearrow", "adaptcollector", "adaptfontfeature", "adaptlayout", "adaptpapersize", "addfeature", "addfontpath", "addtoJSpreamble", "addtocommalist", "addvalue", "adiaeresis", "adiaeresismacron", "adotaccent", "adotaccentmacron", "adotbelow", "adoublegrave", "aeacute", "aeligature", "aemacron", "afghanicurrency", "aftersplitstring", "aftertestandsplitstring", "agrave", "ahook", "ainvertedbreve", "aleph", "alignbottom", "aligned", "alignedbox", "alignedline", "alignhere", "alignmentcharacter", "allinputpaths", "alpha", "alphabeticnumerals", "alwayscitation", "alwayscite", "amacron", "amalg", "ampersand", "anchor", "angle", "aogonek", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "approx", "approxEq", "approxeq", "approxnEq", "arabicakbar", "arabicalayhe", "arabicallah", "arabicallallahou", "arabicasterisk", "arabicbasmalah", "arabiccomma", "arabiccuberoot", "arabicdateseparator", "arabicdecimals", "arabicdisputedendofayah", "arabicendofayah", "arabicexnumerals", "arabicfootnotemarker", "arabicfourthroot", "arabichighain", "arabichighalayheassallam", "arabichigheqala", "arabichighesala", "arabichighfootnotemarker", "arabichighjeem", "arabichighlamalef", "arabichighmadda", "arabichighmeemlong", "arabichighmeemshort", "arabichighnisf", "arabichighnoon", "arabichighnoonkasra", "arabichighqaf", "arabichighqif", "arabichighradiallahouanhu", "arabichighrahmatullahalayhe", "arabichighrubc", "arabichighsad", "arabichighsajda", "arabichighsakta", "arabichighsallallahou", "arabichighseen", "arabichighsmallsafha", "arabichightah", "arabichightakhallus", "arabichighthalatha", "arabichighwaqf", "arabichighyeh", "arabichighzain", "arabicjallajalalouhou", "arabiclettermark", "arabiclowmeemlong", "arabiclownoonkasra", "arabiclowseen", "arabicmisra", "arabicmuhammad", "arabicnumber", "arabicnumberabove", "arabicnumerals", "arabicparenleft", "arabicparenright", "arabicpercent", "arabicperiod", "arabicpermille", "arabicpertenthousand", "arabicpoeticverse", "arabicqala", "arabicquestion", "arabicrasoul", "arabicray", "arabicrialsign", "arabicsafha", "arabicsajdah", "arabicsalla", "arabicsamvat", "arabicsanah", "arabicsemicolon", "arabicshighthreedots", "arabicslcm", "arabicstartofrubc", "arabictripledot", "arabicvowelwaw", "arabicvowelyeh", "arabicwasallam", "arg", "aring", "aringacute", "arrowvert", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "ast", "astype", "asymp", "at", "atilde", "atleftmargin", "atpage", "atrightmargin", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "autointegral", "automathematics", "autopagestaterealpage", "autopagestaterealpageorder", "autosetups", "availablehsize", "averagecharwidth", "backepsilon", "background", "backgroundimage", "backgroundimagefill", "backgroundline", "backprime", "backsim", "backslash", "bar", "barleftarrow", "barleftarrowrightarrowbar", "barovernorthwestarrow", "barwedge", "basegrid", "baselinebottom", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbordermatrix", "bbox", "because", "beforesplitstring", "beforetestandsplitstring", "beta", "beth", "between", "bhook", "big", "bigbodyfont", "bigcap", "bigcirc", "bigcircle", "bigcup", "bigdiamond", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigodot", "bigoplus", "bigotimes", "bigr", "bigskip", "bigsqcap", "bigsqcup", "bigsquare", "bigstar", "bigtimes", "bigtriangledown", "bigtriangleup", "bigudot", "biguplus", "bigvee", "bigwedge", "binom", "bitmapimage", "blacklozenge", "blackrule", "blackrules", "blacksquare", "blacktriangle", "blacktriangledown", "blacktriangleleft", "blacktriangleright", "blank", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "blocksynctexfile", "blockuservariable", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "bookmark", "booleanmodevalue", "bordermatrix", "bot", "bottombox", "bottomleftbox", "bottomrightbox", "bowtie", "boxcursor", "boxdot", "boxmarker", "boxminus", "boxofsize", "boxplus", "boxreference", "boxtimes", "bpos", "breakablethinspace", "breakhere", "breve", "bstroke", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhiddencitation", "btxhybridcite", "btxlabellanguage", "btxlabeltext", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "buildmathaccent", "buildtextaccent", "buildtextbottomcomma", "buildtextbottomdot", "buildtextcedilla", "buildtextgrave", "buildtextmacron", "buildtextognek", "bullet", "button", "cacute", "calligraphic", "camel", "cap", "carriagereturn", "catcodetablename", "cbox", "ccaron", "ccedilla", "ccircumflex", "ccurl", "cdot", "cdotaccent", "cdotp", "cdots", "centeraligned", "centerbox", "centerdot", "centeredbox", "centeredlastline", "centerednextbox", "centerline", "cfrac", "chapter", "character", "characters", "chardescription", "charwidthlanguage", "check", "checkcharacteralign", "checkedblank", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checkmark", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chi", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "chook", "circ", "circeq", "circlearrowleft", "circlearrowright", "circledR", "circledS", "circledast", "circledcirc", "circleddash", "circledequals", "circleonrightarrow", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "clippedoverlayimage", "clonefield", "clubsuit", "collect", "collectedtext", "collectexpanded", "colon", "coloncolonequals", "colonequals", "color", "colorbar", "colorcomponents", "colored", "coloronly", "colorvalue", "column", "columnbreak", "columnsetspanwidth", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparecolorgroup", "comparedimension", "comparedimensioneps", "comparepalet", "complement", "completebtxrendering", "completecontent", "completeindex", "completelist", "completelistofabbreviations", "completelistofchemicals", "completelistoffigures", "completelistofgraphics", "completelistofintermezzi", "completelistoflogos", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completelistoftables", "completepagenumber", "completeregister", "complexes", "complexorsimple", "complexorsimpleempty", "component", "composedcollector", "composedlayer", "compresult", "cong", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertnumber", "convertvalue", "convertvboxtohbox", "coprod", "copyboxfromcache", "copybtxlabeltext", "copyfield", "copyheadtext", "copylabeltext", "copymathlabeltext", "copyoperatortext", "copypages", "copyparameters", "copyposition", "copyprefixtext", "copyright", "copysetups", "copysuffixtext", "copytaglabeltext", "copyunittext", "correctwhitespace", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "cstroke", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "cup", "curlyeqprec", "curlyeqsucc", "curlyvee", "curlywedge", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentdate", "currentenvironment", "currentfeaturetest", "currentheadnumber", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "curvearrowleft", "curvearrowright", "cwopencirclearrow", "cyrillicA", "cyrillicAE", "cyrillicAbreve", "cyrillicAdiaeresis", "cyrillicB", "cyrillicBIGYUS", "cyrillicBIGYUSiotified", "cyrillicC", "cyrillicCH", "cyrillicCHEDC", "cyrillicCHEDCabkhasian", "cyrillicCHEabkhasian", "cyrillicCHEdiaeresis", "cyrillicCHEkhakassian", "cyrillicCHEvertstroke", "cyrillicD", "cyrillicDASIAPNEUMATA", "cyrillicDJE", "cyrillicDZE", "cyrillicDZEabkhasian", "cyrillicDZHE", "cyrillicE", "cyrillicELtail", "cyrillicEMtail", "cyrillicENDC", "cyrillicENGHE", "cyrillicENhook", "cyrillicENtail", "cyrillicEREV", "cyrillicERY", "cyrillicERtick", "cyrillicEbreve", "cyrillicEdiaeresis", "cyrillicEgrave", "cyrillicEiotified", "cyrillicF", "cyrillicFITA", "cyrillicG", "cyrillicGHEmidhook", "cyrillicGHEstroke", "cyrillicGHEupturn", "cyrillicGJE", "cyrillicH", "cyrillicHA", "cyrillicHADC", "cyrillicHRDSN", "cyrillicI", "cyrillicIE", "cyrillicII", "cyrillicISHRT", "cyrillicISHRTtail", "cyrillicIZHITSA", "cyrillicIZHITSAdoublegrave", "cyrillicIdiaeresis", "cyrillicIgrave", "cyrillicImacron", "cyrillicJE", "cyrillicK", "cyrillicKADC", "cyrillicKAbashkir", "cyrillicKAhook", "cyrillicKAstroke", "cyrillicKAvertstroke", "cyrillicKJE", "cyrillicKOPPA", "cyrillicKSI", "cyrillicL", "cyrillicLITTLEYUS", "cyrillicLITTLEYUSiotified", "cyrillicLJE", "cyrillicM", "cyrillicN", "cyrillicNJE", "cyrillicO", "cyrillicOMEGA", "cyrillicOMEGAround", "cyrillicOMEGAtitlo", "cyrillicOT", "cyrillicObarred", "cyrillicObarreddiaeresis", "cyrillicOdiaeresis", "cyrillicP", "cyrillicPALATALIZATION", "cyrillicPALOCHKA", "cyrillicPEmidhook", "cyrillicPSI", "cyrillicPSILIPNEUMATA", "cyrillicR", "cyrillicS", "cyrillicSCHWA", "cyrillicSCHWAdiaeresis", "cyrillicSDSC", "cyrillicSEMISOFT", "cyrillicSFTSN", "cyrillicSH", "cyrillicSHCH", "cyrillicSHHA", "cyrillicT", "cyrillicTEDC", "cyrillicTETSE", "cyrillicTITLO", "cyrillicTSHE", "cyrillicU", "cyrillicUK", "cyrillicUSHRT", "cyrillicUdiaeresis", "cyrillicUdoubleacute", "cyrillicUmacron", "cyrillicV", "cyrillicYA", "cyrillicYAT", "cyrillicYERUdiaeresis", "cyrillicYI", "cyrillicYO", "cyrillicYU", "cyrillicYstr", "cyrillicYstrstroke", "cyrillicZ", "cyrillicZDSC", "cyrillicZEdiaeresis", "cyrillicZH", "cyrillicZHEbreve", "cyrillicZHEdescender", "cyrillicZHEdiaeresis", "cyrillica", "cyrillicabreve", "cyrillicadiaeresis", "cyrillicae", "cyrillicb", "cyrillicbigyus", "cyrillicbigyusiotified", "cyrillicc", "cyrillicch", "cyrilliccheabkhasian", "cyrillicchedc", "cyrillicchedcabkhasian", "cyrillicchediaeresis", "cyrillicchekhakassian", "cyrillicchevertstroke", "cyrillicd", "cyrillicdje", "cyrillicdze", "cyrillicdzeabkhasian", "cyrillicdzhe", "cyrillice", "cyrillicebreve", "cyrillicediaeresis", "cyrillicegrave", "cyrilliceiotified", "cyrilliceltail", "cyrillicemtail", "cyrillicendc", "cyrillicenghe", "cyrillicenhook", "cyrillicentail", "cyrillicerev", "cyrillicertick", "cyrillicery", "cyrillicf", "cyrillicfita", "cyrillicg", "cyrillicghemidhook", "cyrillicghestroke", "cyrillicgheupturn", "cyrillicgje", "cyrillich", "cyrillicha", "cyrillichadc", "cyrillichrdsn", "cyrillici", "cyrillicidiaeresis", "cyrillicie", "cyrillicigrave", "cyrillicii", "cyrillicimacron", "cyrillicishrt", "cyrillicishrttail", "cyrillicizhitsa", "cyrillicizhitsadoublegrave", "cyrillicje", "cyrillick", "cyrillickabashkir", "cyrillickadc", "cyrillickahook", "cyrillickastroke", "cyrillickavertstroke", "cyrillickje", "cyrillickoppa", "cyrillicksi", "cyrillicl", "cyrilliclittleyus", "cyrilliclittleyusiotified", "cyrilliclje", "cyrillicm", "cyrillicn", "cyrillicnje", "cyrillico", "cyrillicobarred", "cyrillicobarreddiaeresis", "cyrillicodiaeresis", "cyrillicomega", "cyrillicomegaround", "cyrillicomegatitlo", "cyrillicot", "cyrillicp", "cyrillicpemidhook", "cyrillicpsi", "cyrillicr", "cyrillics", "cyrillicschwa", "cyrillicschwadiaeresis", "cyrillicsdsc", "cyrillicsemisoft", "cyrillicsftsn", "cyrillicsh", "cyrillicshch", "cyrillicshha", "cyrillict", "cyrillictedc", "cyrillictetse", "cyrillictshe", "cyrillicu", "cyrillicudiaeresis", "cyrillicudoubleacute", "cyrillicuk", "cyrillicumacron", "cyrillicushrt", "cyrillicv", "cyrillicya", "cyrillicyat", "cyrillicyerudiaeresis", "cyrillicyi", "cyrillicyo", "cyrillicystr", "cyrillicystrstroke", "cyrillicyu", "cyrillicz", "cyrilliczdsc", "cyrilliczediaeresis", "cyrilliczh", "cyrilliczhebreve", "cyrilliczhedescender", "cyrilliczhediaeresis", "d", "dag", "dagger", "daleth", "dasharrow", "dashedleftarrow", "dashedrightarrow", "dashv", "datasetvariable", "date", "dayoftheweek", "dayspermonth", "dbinom", "dcaron", "dcurl", "ddag", "ddagger", "dddot", "ddot", "ddots", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "define", "defineMPinstance", "defineTABLEsetup", "defineaccent", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "defineblock", "definebodyfont", "definebodyfontenvironment", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebuffer", "definebutton", "definecapitals", "definecharacter", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolor", "definecolorgroup", "definecolumnbreak", "definecolumnset", "definecolumnsetarea", "definecolumnsetspan", "definecombination", "definecombinedlist", "definecommand", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversion", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedeq", "definedescription", "definedfont", "defineeffect", "defineenumeration", "defineexpandable", "defineexternalfigure", "definefacingfloat", "definefallbackfamily", "definefield", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefieldstack", "definefiguresymbol", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefloat", "definefont", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "definefontstyle", "definefontsynonym", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframed", "defineframedcontent", "defineframedtable", "defineframedtext", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "definehbox", "definehead", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinteractionmenu", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabel", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelist", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemakeup", "definemarginblock", "definemargindata", "definemarker", "definemarking", "definemathaccent", "definemathalignment", "definemathcases", "definemathcommand", "definemathdouble", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathover", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunder", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "defineoverlay", "definepage", "definepagebreak", "definepagechecker", "definepagecolumns", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "definepalet", "definepapersize", "defineparagraph", "defineparagraphs", "defineparallel", "defineparbuilder", "defineperiodkerning", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "defineprofile", "defineprogram", "definepushbutton", "definepushsymbol", "definereference", "definereferenceformat", "defineregister", "definerenderingwindow", "defineresetset", "defineruby", "definescale", "definescript", "definesection", "definesectionblock", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definesorting", "definespotcolor", "definestartstop", "definestyle", "definestyleinstance", "definesubfield", "definesubformula", "definesymbol", "definesynonym", "definesynonyms", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabletemplate", "definetabulate", "definetabulation", "definetext", "definetextbackground", "definetextflow", "definetokenlist", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "definetyping", "defineunit", "defineuserdata", "defineuserdataalternative", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "delimited", "delimitedtext", "delta", "depthofstring", "depthonlybox", "depthspanningtext", "depthstrut", "determineheadnumber", "determinelistcharacteristics", "determinenoflines", "determineregistercharacteristics", "devanagarinumerals", "dfrac", "dhook", "diameter", "diamond", "diamondsuit", "differentialD", "differentiald", "digamma", "digits", "dimensiontocount", "directboxfromcache", "directcolor", "directcolored", "directconvertedcounter", "directcopyboxfromcache", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "div", "dividedsize", "divideontimes", "divides", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dofastloopcs", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifassignmentelsecs", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdocumentvariable", "doifdocumentvariableelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseassignmentcs", "doifelseblack", "doifelsebox", "doifelseboxincache", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedocumentvariable", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontfeature", "doifelsefontpresent", "doifelsefontsynonym", "doifelseframed", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarkedpage", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpage", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetopofpage", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontfeatureelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotdocumentvariable", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftopofpageelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifunknownfontfeature", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dot", "doteq", "doteqdot", "dotfskip", "dotlessI", "dotlessJ", "dotlessi", "dotlessj", "dotlessjstroke", "dotminus", "dotoks", "dotplus", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "dots", "dottedcircle", "dottedrightarrow", "doublebar", "doublebond", "doublebrace", "doublebracket", "doublecap", "doublecup", "doubleparent", "doubleprime", "doubleverticalbar", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "downarrow", "downdasharrow", "downdownarrows", "downharpoonleft", "downharpoonright", "downuparrows", "downwhitearrow", "downzigzagarrow", "dpofstring", "dstroke", "dtail", "dummydigit", "dummyparameter", "dzcaronligature", "dzligature", "eTeX", "eacute", "ebreve", "ecaron", "ecedilla", "ecircumflex", "ecircumflexacute", "ecircumflexdotbelow", "ecircumflexgrave", "ecircumflexhook", "ecircumflextilde", "edefconvertedargument", "ediaeresis", "edotaccent", "edotbelow", "edoublegrave", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "egrave", "ehook", "einvertedbreve", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "ell", "em", "emacron", "emdash", "emphasisboldface", "emphasistypeface", "emptylines", "emptyset", "emquad", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "endash", "endnote", "enquad", "enskip", "enspace", "env", "environment", "envvar", "eogonek", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "epsilon", "eq", "eqcirc", "eqeq", "eqeqeq", "eqgtr", "eqless", "eqsim", "eqslantgtr", "eqslantless", "equaldigits", "equalscolon", "equiv", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "eta", "eth", "ethiopic", "etilde", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "exclamdown", "executeifdefined", "exists", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandeddoif", "expandeddoifelse", "expandeddoifnot", "expandfontsynonym", "expdoif", "expdoifcommonelse", "expdoifelse", "expdoifelsecommon", "expdoifelseinset", "expdoifinsetelse", "expdoifnot", "exponentiale", "externalfigure", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "fallingdotseq", "fastdecrement", "fastincrement", "fastlocalframed", "fastloopfinal", "fastloopindex", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "ffiligature", "ffligature", "fflligature", "fhook", "field", "fieldbody", "fieldstack", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figurespace", "figuresymbol", "figurewidth", "filename", "filigature", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "fillinline", "fillinrules", "fillintext", "fillupto", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstinlist", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfield", "fitfieldframed", "fittopbaselinegrid", "fiveeighths", "fivesixths", "fixedspace", "fixedspaces", "flag", "flat", "flligature", "floatuserdataparameter", "flushbox", "flushboxregister", "flushcollector", "flushedrightlastline", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnote", "footnotetext", "forall", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "forgetparskip", "forgetragged", "formula", "formulanumber", "foundbox", "fourfifths", "fourperemspace", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "framed", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "from", "fromlinenote", "frown", "frozenhbox", "frule", "gacute", "gamma", "gbreve", "gcaron", "gcircumflex", "gcommaaccent", "gdefconvertedargument", "gdefconvertedcommand", "gdotaccent", "ge", "geq", "geqq", "geqslant", "getMPdrawing", "getMPlayer", "getboxfromcache", "getboxllx", "getboxlly", "getbuffer", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getinlineuserdata", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmarking", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "gets", "getsubstring", "gettokenlist", "gettwopassdata", "gettwopassdatalist", "getuserdata", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "gg", "ggg", "gggtr", "gimel", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gnapprox", "gneqq", "gnsim", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "godown", "goto", "gotobox", "gotopage", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grave", "graycolor", "grayvalue", "greedysplitstring", "greekAlpha", "greekAlphadasia", "greekAlphadasiaperispomeni", "greekAlphadasiatonos", "greekAlphadasiavaria", "greekAlphaiotasub", "greekAlphaiotasubdasia", "greekAlphaiotasubdasiaperispomeni", "greekAlphaiotasubdasiatonos", "greekAlphaiotasubdasiavaria", "greekAlphaiotasubpsili", "greekAlphaiotasubpsiliperispomeni", "greekAlphaiotasubpsilitonos", "greekAlphaiotasubpsilivaria", "greekAlphamacron", "greekAlphapsili", "greekAlphapsiliperispomeni", "greekAlphapsilitonos", "greekAlphapsilivaria", "greekAlphatonos", "greekAlphavaria", "greekAlphavrachy", "greekBeta", "greekChi", "greekCoronis", "greekDelta", "greekEpsilon", "greekEpsilondasia", "greekEpsilondasiatonos", "greekEpsilondasiavaria", "greekEpsilonpsili", "greekEpsilonpsilitonos", "greekEpsilonpsilivaria", "greekEpsilontonos", "greekEpsilonvaria", "greekEta", "greekEtadasia", "greekEtadasiaperispomeni", "greekEtadasiatonos", "greekEtadasiavaria", "greekEtaiotasub", "greekEtaiotasubdasia", "greekEtaiotasubdasiaperispomeni", "greekEtaiotasubdasiatonos", "greekEtaiotasubdasiavaria", "greekEtaiotasubpsili", "greekEtaiotasubpsiliperispomeni", "greekEtaiotasubpsilitonos", "greekEtaiotasubpsilivaria", "greekEtapsili", "greekEtapsiliperispomeni", "greekEtapsilitonos", "greekEtapsilivaria", "greekEtatonos", "greekEtavaria", "greekGamma", "greekIota", "greekIotadasia", "greekIotadasiaperispomeni", "greekIotadasiatonos", "greekIotadasiavaria", "greekIotadialytika", "greekIotamacron", "greekIotapsili", "greekIotapsiliperispomeni", "greekIotapsilitonos", "greekIotapsilivaria", "greekIotatonos", "greekIotavaria", "greekIotavrachy", "greekKappa", "greekLambda", "greekMu", "greekNu", "greekOmega", "greekOmegadasia", "greekOmegadasiaperispomeni", "greekOmegadasiatonos", "greekOmegadasiavaria", "greekOmegaiotasub", "greekOmegaiotasubdasia", "greekOmegaiotasubdasiaperispomeni", "greekOmegaiotasubdasiatonos", "greekOmegaiotasubdasiavaria", "greekOmegaiotasubpsili", "greekOmegaiotasubpsiliperispomeni", "greekOmegaiotasubpsilitonos", "greekOmegaiotasubpsilivaria", "greekOmegapsili", "greekOmegapsiliperispomeni", "greekOmegapsilitonos", "greekOmegapsilivaria", "greekOmegatonos", "greekOmegavaria", "greekOmicron", "greekOmicrondasia", "greekOmicrondasiatonos", "greekOmicrondasiavaria", "greekOmicronpsili", "greekOmicronpsilitonos", "greekOmicronpsilivaria", "greekOmicrontonos", "greekOmicronvaria", "greekPhi", "greekPi", "greekPsi", "greekRho", "greekRhodasia", "greekSigma", "greekSigmalunate", "greekTau", "greekTheta", "greekUpsilon", "greekUpsilondasia", "greekUpsilondasiaperispomeni", "greekUpsilondasiatonos", "greekUpsilondasiavaria", "greekUpsilondialytika", "greekUpsilonmacron", "greekUpsilontonos", "greekUpsilonvaria", "greekUpsilonvrachy", "greekXi", "greekZeta", "greekalpha", "greekalphadasia", "greekalphadasiaperispomeni", "greekalphadasiatonos", "greekalphadasiavaria", "greekalphaiotasub", "greekalphaiotasubdasia", "greekalphaiotasubdasiaperispomeni", "greekalphaiotasubdasiatonos", "greekalphaiotasubdasiavaria", "greekalphaiotasubperispomeni", "greekalphaiotasubpsili", "greekalphaiotasubpsiliperispomeni", "greekalphaiotasubpsilitonos", "greekalphaiotasubpsilivaria", "greekalphaiotasubtonos", "greekalphaiotasubvaria", "greekalphamacron", "greekalphaoxia", "greekalphaperispomeni", "greekalphapsili", "greekalphapsiliperispomeni", "greekalphapsilitonos", "greekalphapsilivaria", "greekalphatonos", "greekalphavaria", "greekalphavrachy", "greekbeta", "greekbetaalt", "greekchi", "greekdasia", "greekdasiaperispomeni", "greekdasiatonos", "greekdasiavaria", "greekdelta", "greekdialytikaperispomeni", "greekdialytikatonos", "greekdialytikavaria", "greekdigamma", "greekepsilon", "greekepsilonalt", "greekepsilondasia", "greekepsilondasiatonos", "greekepsilondasiavaria", "greekepsilonoxia", "greekepsilonpsili", "greekepsilonpsilitonos", "greekepsilonpsilivaria", "greekepsilontonos", "greekepsilonvaria", "greeketa", "greeketadasia", "greeketadasiaperispomeni", "greeketadasiatonos", "greeketadasiavaria", "greeketaiotasub", "greeketaiotasubdasia", "greeketaiotasubdasiaperispomeni", "greeketaiotasubdasiatonos", "greeketaiotasubdasiavaria", "greeketaiotasubperispomeni", "greeketaiotasubpsili", "greeketaiotasubpsiliperispomeni", "greeketaiotasubpsilitonos", "greeketaiotasubpsilivaria", "greeketaiotasubtonos", "greeketaiotasubvaria", "greeketaoxia", "greeketaperispomeni", "greeketapsili", "greeketapsiliperispomeni", "greeketapsilitonos", "greeketapsilivaria", "greeketatonos", "greeketavaria", "greekfinalsigma", "greekgamma", "greekiota", "greekiotadasia", "greekiotadasiaperispomeni", "greekiotadasiatonos", "greekiotadasiavaria", "greekiotadialytika", "greekiotadialytikaperispomeni", "greekiotadialytikatonos", "greekiotadialytikavaria", "greekiotamacron", "greekiotaoxia", "greekiotaperispomeni", "greekiotapsili", "greekiotapsiliperispomeni", "greekiotapsilitonos", "greekiotapsilivaria", "greekiotatonos", "greekiotavaria", "greekiotavrachy", "greekkappa", "greekkoppa", "greeklambda", "greekmu", "greeknu", "greeknumerals", "greeknumkoppa", "greekomega", "greekomegadasia", "greekomegadasiaperispomeni", "greekomegadasiatonos", "greekomegadasiavaria", "greekomegaiotasub", "greekomegaiotasubdasia", "greekomegaiotasubdasiaperispomeni", "greekomegaiotasubdasiatonos", "greekomegaiotasubdasiavaria", "greekomegaiotasubperispomeni", "greekomegaiotasubpsili", "greekomegaiotasubpsiliperispomeni", "greekomegaiotasubpsilitonos", "greekomegaiotasubpsilivaria", "greekomegaiotasubtonos", "greekomegaiotasubvaria", "greekomegaoxia", "greekomegaperispomeni", "greekomegapsili", "greekomegapsiliperispomeni", "greekomegapsilitonos", "greekomegapsilivaria", "greekomegatonos", "greekomegavaria", "greekomicron", "greekomicrondasia", "greekomicrondasiatonos", "greekomicrondasiavaria", "greekomicronoxia", "greekomicronpsili", "greekomicronpsilitonos", "greekomicronpsilivaria", "greekomicrontonos", "greekomicronvaria", "greekoxia", "greekperispomeni", "greekphi", "greekphialt", "greekpi", "greekpialt", "greekprosgegrammeni", "greekpsi", "greekpsili", "greekpsiliperispomeni", "greekpsilitonos", "greekpsilivaria", "greekrho", "greekrhoalt", "greekrhodasia", "greekrhopsili", "greeksampi", "greeksigma", "greeksigmalunate", "greekstigma", "greektau", "greektheta", "greekthetaalt", "greektonos", "greekupsilon", "greekupsilondasia", "greekupsilondasiaperispomeni", "greekupsilondasiatonos", "greekupsilondasiavaria", "greekupsilondiaeresis", "greekupsilondialytikaperispomeni", "greekupsilondialytikatonos", "greekupsilondialytikavaria", "greekupsilonmacron", "greekupsilonoxia", "greekupsilonperispomeni", "greekupsilonpsili", "greekupsilonpsiliperispomeni", "greekupsilonpsilitonos", "greekupsilonpsilivaria", "greekupsilontonos", "greekupsilonvaria", "greekupsilonvrachy", "greekvaria", "greekxi", "greekzeta", "grid", "groupedcommand", "gsetboxllx", "gsetboxlly", "gstroke", "gt", "gtrapprox", "gtrdot", "gtreqless", "gtreqqless", "gtrless", "gtrsim", "guilsingleleft", "guilsingleright", "gujaratinumerals", "gurmurkhinumerals", "hairline", "hairspace", "halflinestrut", "halfstrut", "halfwaybox", "handletokens", "handwritten", "hangul", "hanzi", "hash", "hat", "hbar", "hboxofvbox", "hboxreference", "hcaron", "hcircumflex", "hdofstring", "headhbox", "headlanguage", "headnumber", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtext", "headtextcontent", "headtextdistance", "headtexts", "headtextwidth", "headvbox", "headwidth", "heartsuit", "hebrewAlef", "hebrewAyin", "hebrewBet", "hebrewDalet", "hebrewGimel", "hebrewHe", "hebrewHet", "hebrewKaf", "hebrewKaffinal", "hebrewLamed", "hebrewMem", "hebrewMemfinal", "hebrewNun", "hebrewNunfinal", "hebrewPe", "hebrewPefinal", "hebrewQof", "hebrewResh", "hebrewSamekh", "hebrewShin", "hebrewTav", "hebrewTet", "hebrewTsadi", "hebrewTsadifinal", "hebrewVav", "hebrewYod", "hebrewZayin", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "hideblocks", "high", "highlight", "highordinalstr", "hilo", "himilo", "hl", "hookleftarrow", "hookrightarrow", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hslash", "hsmash", "hsmashbox", "hsmashed", "hspace", "hstroke", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "iacute", "ibox", "ibreve", "icaron", "icircumflex", "ideographichalffillspace", "ideographicspace", "idiaeresis", "idotaccent", "idotbelow", "idoublegrave", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignoretagsinexport", "ignorevalue", "igrave", "ihook", "iiiint", "iiiintop", "iiint", "iiintop", "iint", "iintop", "iinvertedbreve", "ijligature", "imacron", "imaginaryi", "imaginaryj", "imath", "immediatesavetwopassdata", "impliedby", "implies", "imply", "in", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "index", "infofont", "infofontbold", "inframed", "infty", "infull", "inheritparameter", "inhibitblank", "ininner", "ininneredge", "ininnermargin", "initializeboxstack", "inleft", "inleftedge", "inleftmargin", "inline", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlineprettyprintbuffer", "inlinerange", "inmargin", "inmframed", "innerflushshapebox", "inother", "inouter", "inouteredge", "inoutermargin", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "inright", "inrightedge", "inrightmargin", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installglobalmacrostack", "installlanguage", "installleftframerenderer", "installmacrostack", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "int", "intclockwise", "integerrounding", "integers", "interactionbar", "interactionbuttons", "interactionmenu", "intercal", "intertext", "intop", "invisibletimes", "invokepageheandler", "iogonek", "iota", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "italicface", "item", "items", "itemtag", "itilde", "jcaron", "jcircumflex", "jmath", "jobfilename", "jobfilesuffix", "kap", "kappa", "kcaron", "kcommaaccent", "keepblocks", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "khook", "kkra", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "lVert", "labellanguage", "labeltext", "labeltexts", "lacute", "lambda", "lambdabar", "land", "langle", "language", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "latin", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbar", "lbox", "lbrace", "lbracket", "lcaron", "lceil", "lcommaaccent", "lcurl", "ldotmiddle", "ldotp", "ldots", "le", "leadsto", "left", "leftaligned", "leftarrow", "leftarrowtail", "leftarrowtriangle", "leftbottombox", "leftbox", "leftdasharrow", "leftguillemot", "leftharpoondown", "leftharpoonup", "lefthbox", "leftheadtext", "leftlabeltext", "leftleftarrows", "leftline", "leftmathlabeltext", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftrightarrow", "leftrightarrows", "leftrightarrowtriangle", "leftrightharpoons", "leftrightsquigarrow", "leftskipadaption", "leftsquigarrow", "leftsubguillemot", "leftthreetimes", "lefttopbox", "lefttoright", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "leftwavearrow", "leftwhitearrow", "leq", "leqq", "leqslant", "lessapprox", "lessdot", "lesseqgtr", "lesseqqgtr", "lessgtr", "lesssim", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterleftbracket", "letterleftparenthesis", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "letterrightbracket", "letterrightparenthesis", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lfloor", "lgroup", "lhbox", "lhooknwarrow", "lhooksearrow", "limitatefirstline", "limitatelines", "limitatetext", "line", "linebox", "linefeed", "linenote", "linespanningtext", "linethickness", "linterval", "listcitation", "listcite", "listlength", "listnamespaces", "ljligature", "ll", "llangle", "llap", "llbracket", "llcorner", "lll", "llless", "lmoustache", "lnapprox", "lneq", "lneqq", "lnot", "lnsim", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "logo", "lohi", "lointerval", "lomihi", "longleftarrow", "longleftrightarrow", "longmapsfrom", "longmapsto", "longrightarrow", "longrightsquigarrow", "looparrowleft", "looparrowright", "lor", "low", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lozenge", "lparent", "lrcorner", "lrointerval", "lrtbbox", "lstroke", "lt", "ltimes", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luaexpr", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "lvert", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "mainlanguage", "makecharacteractive", "makerawcommalist", "makestrutofbox", "maltese", "mapfontsize", "mapsdown", "mapsfrom", "mapsto", "mapsup", "margindata", "margintext", "markcontent", "markedpages", "marking", "markinjector", "markpage", "mat", "math", "mathampersand", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathdefault", "mathdollar", "mathdouble", "mathematics", "mathfraktur", "mathfunction", "mathhash", "mathhyphen", "mathit", "mathitalic", "mathlabellanguage", "mathlabeltext", "mathlabeltexts", "mathop", "mathover", "mathpercent", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathunder", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "maxaligned", "mbox", "mcframed", "measure", "measured", "measuredangle", "measuredeq", "medskip", "medspace", "menubutton", "mequal", "message", "metaTeX", "mfence", "mframed", "mfunction", "mfunctionlabeltext", "mhbox", "mho", "mhookleftarrow", "mhookrightarrow", "mid", "midaligned", "middle", "middlealigned", "middlebox", "midhbox", "midsubsentence", "minimalhbox", "minus", "minuscolon", "mirror", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "models", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "month", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "mu", "multimap", "nHdownarrow", "nHuparrow", "nLeftarrow", "nLeftrightarrow", "nRightarrow", "nVDash", "nVdash", "nVleftarrow", "nVleftrightarrow", "nVrightarrow", "nabla", "nacute", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "napostrophe", "napprox", "napproxEq", "narrownobreakspace", "nasymp", "natural", "naturalhbox", "naturalhpack", "naturalnumbers", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "ncaron", "ncommaaccent", "ncong", "ncurl", "ndivides", "ne", "nearrow", "neg", "negatecolorbox", "negated", "negativesign", "negemspace", "negenspace", "negthinspace", "neng", "neq", "nequiv", "neswarrow", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nexists", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "ngeq", "ngrave", "ngtr", "ngtrless", "ngtrsim", "ni", "nihongo", "nin", "njligature", "nleftarrow", "nleftrightarrow", "nleq", "nless", "nlessgtr", "nlesssim", "nmid", "nni", "nobar", "nobreakspace", "nocap", "nocharacteralign", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noheaderandfooterlines", "noheightstrut", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalitalicface", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normalslantedface", "normaltypeface", "nospace", "not", "note", "notesymbol", "notin", "notopandbottomlines", "notragged", "nowns", "nparallel", "nprec", "npreccurlyeq", "nrightarrow", "nsim", "nsimeq", "nsqsubseteq", "nsqsupseteq", "nsubset", "nsubseteq", "nsucc", "nsucccurlyeq", "nsupset", "nsupseteq", "ntilde", "ntimes", "ntriangleleft", "ntrianglelefteq", "ntriangleright", "ntrianglerighteq", "nu", "numberofpoints", "numbers", "nvDash", "nvdash", "nvleftarrow", "nvleftrightarrow", "nvrightarrow", "nwarrow", "nwsearrow", "oacute", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "obreve", "ocaron", "ocircumflex", "ocircumflexacute", "ocircumflexdotbelow", "ocircumflexgrave", "ocircumflexhook", "ocircumflextilde", "odiaeresis", "odiaeresismacron", "odot", "odotaccent", "odotaccentmacron", "odotbelow", "odoublegrave", "oeligature", "offset", "offsetbox", "ograve", "ohm", "ohook", "ohorn", "ohornacute", "ohorndotbelow", "ohorngrave", "ohornhook", "ohorntilde", "ohungarumlaut", "oiiint", "oiint", "oint", "ointclockwise", "ointctrclockwise", "oinvertedbreve", "omacron", "omega", "omicron", "ominus", "onedigitrounding", "oneeighth", "onefifth", "onehalf", "onequarter", "onesixth", "onesuperior", "onethird", "oogonek", "oogonekmacron", "operatorlanguage", "operatortext", "oplus", "ordfeminine", "ordinaldaynumber", "ordinalstr", "ordmasculine", "ornamenttext", "oslash", "ostroke", "ostrokeacute", "otilde", "otildemacron", "otimes", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbarunderbar", "overbrace", "overbraceunderbrace", "overbracket", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlayimage", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overloaderror", "overparent", "overparentunderparent", "overrightarrow", "overset", "overstrike", "overstrikes", "owns", "page", "pagearea", "pagebreak", "pagefigure", "pageinjection", "pagenumber", "pagereference", "pagestaterealpage", "pagestaterealpageorder", "paletsize", "paragraphmark", "parallel", "part", "partial", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "periodcentered", "periods", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "perp", "persiandecimals", "persiandecimalseparator", "persiannumerals", "persianthousandsseparator", "perthousand", "phantom", "phantombox", "phi", "phook", "pi", "pickupgroupedcommand", "pitchfork", "placeattachments", "placebookmarks", "placebtxrendering", "placechemical", "placecitation", "placecombinedlist", "placecomments", "placecontent", "placecurrentformulanumber", "placedbox", "placefigure", "placefloat", "placefloatwithsetups", "placefootnotes", "placeformula", "placeframed", "placegraphic", "placeheadnumber", "placeheadtext", "placehelp", "placeindex", "placeinitial", "placeintermezzo", "placelayer", "placelayeredtext", "placelegend", "placelist", "placelistofabbreviations", "placelistofchemicals", "placelistoffigures", "placelistofgraphics", "placelistofintermezzi", "placelistoflogos", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelistoftables", "placelocalfootnotes", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placeongrid", "placeontopofeachother", "placepagenumber", "placepairedbox", "placeparallel", "placerawlist", "placeregister", "placerenderingwindow", "placesidebyside", "placesubformula", "placetable", "pm", "popattribute", "popmacro", "popmode", "popsystemmode", "position", "positionoverlay", "positionregionoverlay", "positivesign", "postponenotes", "prec", "precapprox", "preccurlyeq", "preceq", "preceqq", "precnapprox", "precneq", "precneqq", "precnsim", "precsim", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prefixlanguage", "prefixtext", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "prerollblank", "presetbtxlabeltext", "presetdocument", "presetfieldsymbols", "presetheadtext", "presetlabeltext", "presetmathlabeltext", "presetoperatortext", "presetprefixtext", "presetsuffixtext", "presettaglabeltext", "presetunittext", "pretocommalist", "prettyprintbuffer", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "prime", "primes", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processblocks", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "prod", "product", "profiledbox", "profilegivenbox", "program", "project", "propto", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "psi", "punctuationspace", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "putboxincache", "putnextboxincache", "qquad", "quad", "quadrupleprime", "quads", "quarterstrut", "questiondown", "questionedeq", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "quotation", "quote", "quotedbl", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "quotesingle", "quotesinglebase", "rVert", "racute", "raggedbottom", "raggedcenter", "raggedleft", "raggedright", "raggedwidecenter", "raisebox", "randomizetext", "randomnumber", "rangle", "rationals", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "rbrace", "rbracket", "rcaron", "rceil", "rcommaaccent", "rdoublegrave", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "reals", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "reference", "referenceprefix", "referring", "registerattachment", "registerctxluafile", "registered", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "relbar", "remainingcharacters", "remark", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetboxesincache", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmarking", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetperiodkerning", "resetprofile", "resetrecurselevel", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettokenlist", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "restriction", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "reverseddoubleprime", "reversedprime", "reversedtripleprime", "revivefeature", "rfence", "rfloor", "rgroup", "rhbox", "rho", "rhooknearrow", "rhookswarrow", "right", "rightaligned", "rightangle", "rightarrow", "rightarrowbar", "rightarrowtail", "rightarrowtriangle", "rightbottombox", "rightbox", "rightdasharrow", "rightguillemot", "rightharpoondown", "rightharpoonup", "righthbox", "rightheadtext", "rightlabeltext", "rightleftarrows", "rightleftharpoons", "rightline", "rightmathlabeltext", "rightorleftpageaction", "rightpageorder", "rightrightarrows", "rightskipadaption", "rightsquigarrow", "rightsubguillemot", "rightthreearrows", "rightthreetimes", "righttoleft", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rightwavearrow", "rightwhitearrow", "ring", "rinterval", "rinvertedbreve", "risingdotseq", "rlap", "rlointerval", "rmoustache", "rneq", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rointerval", "rollbutton", "roman", "romanC", "romanD", "romanI", "romanII", "romanIII", "romanIV", "romanIX", "romanL", "romanM", "romanV", "romanVI", "romanVII", "romanVIII", "romanX", "romanXI", "romanXII", "romanc", "romand", "romani", "romanii", "romaniii", "romaniv", "romanix", "romanl", "romanm", "romannumerals", "romanv", "romanvi", "romanvii", "romanviii", "romanx", "romanxi", "romanxii", "rootradical", "rotate", "rparent", "rrangle", "rrbracket", "rrointerval", "rtimes", "rtop", "ruby", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "rvert", "sacute", "safechar", "samplefile", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "scale", "scaron", "scedilla", "schwa", "schwahook", "scircumflex", "scommaaccent", "screen", "searrow", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "section", "sectionmark", "seeindex", "select", "selectblocks", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setautopagestaterealpageno", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharacteraligndetail", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setfirstpasscharacteralign", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setglobalscript", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelement", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setlocalscript", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setminus", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setperiodkerning", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsecondpasscharacteralign", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settextcontent", "settightobject", "settightreferencedobject", "settightstrut", "settightunreferencedobject", "settokenlist", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupalign", "setupalternativestyles", "setuparranging", "setupattachment", "setupattachments", "setupbackend", "setupbackground", "setupbackgrounds", "setupbar", "setupbars", "setupblackrules", "setupblank", "setupbleeding", "setupblock", "setupbodyfont", "setupbookmark", "setupbottom", "setupbottomtexts", "setupbtx", "setupbtxdataset", "setupbtxlabeltext", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbuffer", "setupbutton", "setupcapitals", "setupcaption", "setupcaptions", "setupcharacteralign", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupclipping", "setupcollector", "setupcolor", "setupcolors", "setupcolumns", "setupcolumnset", "setupcolumnsetarea", "setupcolumnsetareatext", "setupcolumnsetlines", "setupcolumnsetspan", "setupcolumnsetstart", "setupcolumnspan", "setupcombination", "setupcombinedlist", "setupcomment", "setupcontent", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenumerations", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfacingfloat", "setupfield", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfields", "setupfieldtotalframed", "setupfiller", "setupfillinlines", "setupfillinrules", "setupfirstline", "setupfittingpage", "setupfloat", "setupfloatframed", "setupfloats", "setupfloatsplitting", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupfooter", "setupfootertexts", "setupforms", "setupformula", "setupformulae", "setupformulaframed", "setupframed", "setupframedcontent", "setupframedtable", "setupframedtablecolumn", "setupframedtablerow", "setupframedtext", "setupframedtexts", "setupglobalreferenceprefix", "setuphead", "setupheadalternative", "setupheader", "setupheadertexts", "setupheadnumber", "setupheads", "setupheadtext", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setuphyphenmark", "setupindentedtext", "setupindenting", "setupindex", "setupinitial", "setupinsertion", "setupinteraction", "setupinteractionbar", "setupinteractionmenu", "setupinteractionscreen", "setupinterlinespace", "setupitaliccorrection", "setupitemgroup", "setupitemizations", "setupitemize", "setupitems", "setuplabel", "setuplabeltext", "setuplanguage", "setuplayer", "setuplayeredtext", "setuplayout", "setuplayouttext", "setuplegend", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinenumbering", "setuplines", "setuplinetable", "setuplinewidth", "setuplist", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmakeup", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmarginrules", "setupmarking", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathfractions", "setupmathframed", "setupmathlabeltext", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnarrower", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoperatortext", "setupoppositeplacing", "setupoutputroutine", "setuppagechecker", "setuppagecolumns", "setuppagecomment", "setuppageinjection", "setuppageinjectionalternative", "setuppagenumber", "setuppagenumbering", "setuppageshift", "setuppagestate", "setuppagetransitions", "setuppairedbox", "setuppalet", "setuppaper", "setuppapersize", "setupparagraph", "setupparagraphintro", "setupparagraphnumbering", "setupparagraphs", "setupparallel", "setupperiodkerning", "setupperiods", "setupplacement", "setuppositionbar", "setuppositioning", "setupprefixtext", "setupprocessor", "setupprofile", "setupprograms", "setupquotation", "setupquote", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupreferencing", "setupregister", "setupregisters", "setuprenderingwindow", "setuprotate", "setupruby", "setups", "setupscale", "setupscript", "setupscripts", "setupsectionblock", "setupselector", "setupshift", "setupsidebar", "setupsorting", "setupspacing", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setupsubformulas", "setupsubpagenumber", "setupsuffixtext", "setupsymbolset", "setupsynctex", "setupsynonyms", "setuptables", "setuptabulate", "setuptabulation", "setuptagging", "setuptaglabeltext", "setuptext", "setuptextbackground", "setuptextflow", "setuptextrules", "setuptexttexts", "setupthinrules", "setuptolerance", "setuptooltip", "setuptop", "setuptoptexts", "setuptype", "setuptyping", "setupunit", "setupunittext", "setupurl", "setupuserdata", "setupuserdataalternative", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwhitespace", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "seveneighths", "sfrac", "shapedhbox", "sharp", "shiftbox", "shiftdown", "shiftup", "showallmakeup", "showattributes", "showbodyfont", "showbodyfontenvironment", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolor", "showcolorbar", "showcolorcomponents", "showcolorgroup", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontexpansion", "showfontitalics", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showframe", "showglyphdata", "showglyphs", "showgrid", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayout", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmakeup", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showpalet", "showparentchain", "showprint", "showsetups", "showsetupsdefinition", "showstruts", "showsymbolset", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "sigma", "signalrightpage", "sim", "simeq", "simplealignedbox", "simplealignedboxplus", "simplealignedspreadbox", "simplegroupedcommand", "simplereversealignedbox", "simplereversealignedboxplus", "singalcharacteralign", "singlebond", "singleverticalbar", "sixperemspace", "sixthofsixarguments", "slanted", "slantedbold", "slantedface", "slash", "slicepages", "slong", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "smile", "snaptogrid", "softhyphen", "solidus", "someheadnumber", "somekindoftab", "someline", "somelocalfloat", "somenamedheadnumber", "someplace", "somewhere", "space", "spaceddigits", "spaceddigitsmethod", "spaceddigitsseparator", "spaceddigitssymbol", "spadesuit", "spanishNumerals", "spanishnumerals", "speech", "sphericalangle", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitatperiod", "splitdfrac", "splitfilename", "splitfloat", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqcap", "sqcup", "sqrt", "sqsubset", "sqsubseteq", "sqsubsetneq", "sqsupset", "sqsupseteq", "sqsupsetneq", "square", "squaredots", "ssharp", "stackrel", "star", "stareq", "startJScode", "startJSpreamble", "startLUA", "startMP", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startPARSEDXML", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEX", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startXML", "startalign", "startalignment", "startallmodes", "startappendices", "startarrangedpages", "startaside", "startattachment", "startbackground", "startbackmatter", "startbar", "startbbordermatrix", "startbitmapimage", "startblockquote", "startbodymatter", "startbordermatrix", "startboxedcolumns", "startbtxlabeltext", "startbtxrenderingdefinitions", "startbuffer", "startcases", "startcatcodetable", "startcenteraligned", "startchapter", "startcharacteralign", "startcheckedfences", "startchemical", "startchemicaltext", "startcollect", "startcollecting", "startcolor", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnset", "startcolumnsetspan", "startcolumnspan", "startcombination", "startcomment", "startcomponent", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdelimited", "startdelimitedtext", "startdisplaymath", "startdmath", "startdocument", "starteffect", "startelement", "startembeddedxtable", "startendnote", "startendofline", "startenvironment", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfacingfloat", "startfact", "startfigure", "startfiguretext", "startfittingpage", "startfixed", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startfootnote", "startformula", "startformulas", "startframed", "startframedcell", "startframedcontent", "startframedrow", "startframedtable", "startframedtext", "startfrontmatter", "startgoto", "startgraphictext", "startgridsnapping", "starthanging", "starthbox", "starthboxestohbox", "starthboxregister", "starthead", "startheadtext", "starthelptext", "starthiding", "starthighlight", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinteraction", "startinteractionmenu", "startinterface", "startintermezzotext", "startintertext", "startitem", "startitemgroup", "startitemgroupcolumns", "startitemize", "startknockout", "startlabeltext", "startlanguage", "startlayout", "startleftaligned", "startlegend", "startline", "startlinealignment", "startlinecorrection", "startlinefiller", "startlinenote", "startlinenumbering", "startlines", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginblock", "startmarginrule", "startmarkedcontent", "startmarkpages", "startmathalignment", "startmathcases", "startmathlabeltext", "startmathmatrix", "startmathmode", "startmathstyle", "startmatrices", "startmatrix", "startmaxaligned", "startmdformula", "startmidaligned", "startmiddlealigned", "startmiddlemakeup", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startoperatortext", "startopposite", "startoutputstream", "startoverlay", "startoverprint", "startpacked", "startpagecolumns", "startpagecomment", "startpagefigure", "startpagelayout", "startpagemakeup", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpart", "startpath", "startplacechemical", "startplacefigure", "startplacefloat", "startplaceformula", "startplacegraphic", "startplaceintermezzo", "startplacelegend", "startplacepairedbox", "startplacetable", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startpostponingnotes", "startprefixtext", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startproduct", "startproject", "startprotect", "startprotectedcolors", "startpublication", "startpunctuation", "startquotation", "startquote", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startrightaligned", "startruby", "startscript", "startsdformula", "startsection", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsetups", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startsplitformula", "startsplittext", "startspread", "startstandardmakeup", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubject", "startsubjectlevel", "startsubsection", "startsubsentence", "startsubstack", "startsubsubject", "startsubsubsection", "startsubsubsubject", "startsubsubsubsection", "startsubsubsubsubject", "startsubsubsubsubsection", "startsubsubsubsubsubject", "startsuffixtext", "startsymbolset", "starttable", "starttablehead", "starttables", "starttabletail", "starttabletext", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttaglabeltext", "starttexcode", "starttexdefinition", "starttext", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextmakeup", "starttextrule", "starttitle", "starttokenlist", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "starttyping", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunittext", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startuserdata", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxcolumn", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "stligature", "stopJScode", "stopJSpreamble", "stopLUA", "stopMP", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopPARSEDXML", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEX", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopXML", "stopalign", "stopalignment", "stopallmodes", "stopappendices", "stoparrangedpages", "stopaside", "stopattachment", "stopbackground", "stopbackmatter", "stopbar", "stopbbordermatrix", "stopbitmapimage", "stopblockquote", "stopbodymatter", "stopbordermatrix", "stopboxedcolumns", "stopbtxlabeltext", "stopbtxrenderingdefinitions", "stopbuffer", "stopcases", "stopcatcodetable", "stopcenteraligned", "stopchapter", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopchemicaltext", "stopcollect", "stopcollecting", "stopcolor", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnset", "stopcolumnsetspan", "stopcolumnspan", "stopcombination", "stopcomment", "stopcomponent", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdelimited", "stopdelimitedtext", "stopdisplaymath", "stopdmath", "stopdocument", "stopeffect", "stopelement", "stopembeddedxtable", "stopendnote", "stopendofline", "stopenvironment", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfacingfloat", "stopfact", "stopfigure", "stopfiguretext", "stopfittingpage", "stopfixed", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopfootnote", "stopformula", "stopformulas", "stopframed", "stopframedcell", "stopframedcontent", "stopframedrow", "stopframedtable", "stopframedtext", "stopfrontmatter", "stopgoto", "stopgraphictext", "stopgridsnapping", "stophanging", "stophbox", "stophboxestohbox", "stophboxregister", "stophead", "stopheadtext", "stophelptext", "stophiding", "stophighlight", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinteraction", "stopinteractionmenu", "stopinterface", "stopintermezzotext", "stopintertext", "stopitem", "stopitemgroup", "stopitemgroupcolumns", "stopitemize", "stopknockout", "stoplabeltext", "stoplanguage", "stoplayout", "stopleftaligned", "stoplegend", "stopline", "stoplinealignment", "stoplinecorrection", "stoplinefiller", "stoplinenote", "stoplinenumbering", "stoplines", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginblock", "stopmarginrule", "stopmarkedcontent", "stopmarkpages", "stopmathalignment", "stopmathcases", "stopmathlabeltext", "stopmathmatrix", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmatrix", "stopmaxaligned", "stopmdformula", "stopmidaligned", "stopmiddlealigned", "stopmiddlemakeup", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopoperatortext", "stopopposite", "stopoutputstream", "stopoverlay", "stopoverprint", "stoppacked", "stoppagecolumns", "stoppagecomment", "stoppagefigure", "stoppagelayout", "stoppagemakeup", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppart", "stoppath", "stopplacechemical", "stopplacefigure", "stopplacefloat", "stopplaceformula", "stopplacegraphic", "stopplaceintermezzo", "stopplacelegend", "stopplacepairedbox", "stopplacetable", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stoppostponingnotes", "stopprefixtext", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopproduct", "stopproject", "stopprotect", "stopprotectedcolors", "stoppublication", "stoppunctuation", "stopquotation", "stopquote", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopregister", "stopreusableMPgraphic", "stoprightaligned", "stopruby", "stopscript", "stopsdformula", "stopsection", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsetups", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopsplitformula", "stopsplittext", "stopspread", "stopstandardmakeup", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubject", "stopsubjectlevel", "stopsubsection", "stopsubsentence", "stopsubstack", "stopsubsubject", "stopsubsubsection", "stopsubsubsubject", "stopsubsubsubsection", "stopsubsubsubsubject", "stopsubsubsubsubsection", "stopsubsubsubsubsubject", "stopsuffixtext", "stopsymbolset", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabletext", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptaglabeltext", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextmakeup", "stoptextrule", "stoptitle", "stoptokenlist", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stoptyping", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunittext", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopuserdata", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxcolumn", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stretched", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutgap", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subject", "subpagenumber", "subsection", "subsentence", "subset", "subseteq", "subseteqq", "subsetneq", "subsetneqq", "substituteincommalist", "subsubject", "subsubsection", "subsubsubject", "subsubsubsection", "subsubsubsubject", "subsubsubsubsection", "subsubsubsubsubject", "subtractfeature", "succ", "succapprox", "succcurlyeq", "succeq", "succeqq", "succnapprox", "succneq", "succneqq", "succnsim", "succsim", "suffixlanguage", "suffixtext", "sum", "supset", "supseteq", "supseteqq", "supsetneq", "supsetneqq", "surd", "surdradical", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "swarrow", "switchstyleonly", "switchtobodyfont", "switchtocolor", "switchtointerlinespace", "symbol", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "synctexblockfilename", "synctexresetfilename", "synctexsetfilename", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "taglabellanguage", "taglabeltext", "tau", "tbinom", "tbox", "tcaron", "tcedilla", "tcommaaccent", "tcurl", "tequal", "test", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textAngstrom", "textacute", "textampersand", "textasciicircum", "textasciitilde", "textat", "textbackslash", "textbar", "textbottomcomma", "textbottomdot", "textbraceleft", "textbraceright", "textbreve", "textbrokenbar", "textbullet", "textcaron", "textcedilla", "textcelsius", "textcent", "textcircledP", "textcircumflex", "textcitation", "textcite", "textcomma", "textcontrolspace", "textcurrency", "textdag", "textddag", "textdegree", "textdiaeresis", "textdiv", "textdollar", "textdong", "textdotaccent", "textellipsis", "texteuro", "textflowcollector", "textfraction", "textgrave", "texthash", "texthorizontalbar", "texthungarumlaut", "texthyphen", "textkelvin", "textlognot", "textmacron", "textmath", "textmho", "textminus", "textmu", "textmultiply", "textnumero", "textogonek", "textohm", "textormathchar", "textormathchars", "textounce", "textpercent", "textperiod", "textplus", "textpm", "textreference", "textring", "textrule", "textslash", "textsterling", "texttilde", "textunderscore", "textvisiblespace", "textyen", "thai", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "therefore", "theremainingcharacters", "theta", "thickspace", "thinrule", "thinrules", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thook", "thookleftarrow", "thookrightarrow", "thorn", "threedigitrounding", "threeeighths", "threefifths", "threeperemspace", "threequarter", "threesuperior", "tibetannumerals", "tightlayer", "tilde", "times", "tinyfont", "title", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "to", "tochar", "tolinenote", "tooltip", "top", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "trademark", "translate", "transparencycomponents", "transparent", "trel", "triangle", "triangledown", "triangleleft", "triangleq", "triangleright", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "tripleprime", "tripleverticalbar", "truefilename", "truefontname", "tstroke", "ttraggedright", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "turnediota", "twodigitrounding", "twofifths", "twoheaddownarrow", "twoheadleftarrow", "twoheadrightarrow", "twoheadrightarrowtail", "twoheaduparrow", "twosuperior", "twothirds", "tx", "txx", "typ", "type", "typebuffer", "typedefinedbuffer", "typeface", "typefile", "typeinlinebuffer", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uacute", "ubreve", "ucaron", "ucircumflex", "uconvertnumber", "udiaeresis", "udiaeresisacute", "udiaeresiscaron", "udiaeresisgrave", "udiaeresismacron", "udotbelow", "udots", "udoublegrave", "uedcatcodecommand", "ugrave", "uhook", "uhorn", "uhornacute", "uhorndotbelow", "uhorngrave", "uhornhook", "uhorntilde", "uhungarumlaut", "uinvertedbreve", "ulcorner", "umacron", "undefinevalue", "undepthed", "underbar", "underbars", "underbrace", "underbracket", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underparent", "underrandom", "underrandoms", "underrightarrow", "underset", "understrike", "understrikes", "undoassign", "unexpandeddocumentvariable", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unit", "unitlanguage", "unitshigh", "unitslow", "unittext", "unknown", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uogonek", "upand", "uparrow", "updasharrow", "updownarrow", "updownarrowbar", "updownarrows", "upharpoonleft", "upharpoonright", "uplus", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "upsilon", "upuparrows", "upwhitearrow", "urcorner", "uring", "url", "useJSscripts", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useURL", "usealignparameter", "useblankparameter", "useblocks", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecitation", "usecolors", "usecomponent", "usedirectory", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternaldocument", "useexternalfigure", "useexternalrendering", "useexternalsoundtrack", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "usemodule", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usesymbols", "usetexmodule", "usetypescript", "usetypescriptfile", "useurl", "usezipfile", "utfchar", "utflower", "utfupper", "utilde", "utilityregisterlength", "vDash", "varTheta", "varepsilon", "varkappa", "varnothing", "varphi", "varpi", "varrho", "varsigma", "vartheta", "vboxreference", "vdash", "vdots", "vec", "vee", "veebar", "veeeq", "verbatim", "verbatimstring", "verbosenumber", "version", "vert", "verticalgrowingbar", "verticalpositionbar", "veryraggedcenter", "veryraggedleft", "veryraggedright", "vglue", "viewerlayer", "vl", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wcircumflex", "wdofstring", "wedge", "wedgeeq", "weekday", "whitearrowupfrombar", "widehat", "widetilde", "widthofstring", "widthspanningtext", "withoutpt", "word", "wordright", "words", "wordtonumber", "wp", "wr", "writebetweenlist", "writedatatolist", "writestatus", "writetolist", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xi", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifatt", "xmldoifelse", "xmldoifelseatt", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotatt", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineprettyprint", "xmlinlineprettyprinttext", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmllastpar", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpar", "xmlparam", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprettyprinttext", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetatt", "xmlsetattribute", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetpar", "xmlsetparam", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "yacute", "ycircumflex", "ydiaeresis", "ydotbelow", "yen", "ygrave", "yhook", "ymacron", "ytilde", "zacute", "zcaron", "zdotaccent", "zerowidthnobreakspace", "zerowidthspace", "zeta", "zhook", "zstroke", "zwj", "zwnj" },
- ["cs"]={ "Cisla", "Kap", "MESIC", "Rimskecislice", "SLOVA", "SLOVO", "Slova", "Slovo", "VSEDNIDEN", "Znak", "Znaky", "aktualnicislonadpisu", "aktualnidatum", "barevnalista", "barva", "cernalinka", "cernelinky", "cisla", "cislonadpisu", "cislorovnice", "cislostrany", "datum", "definuj", "definujakcent", "definujbarvu", "definujblok", "definujbloksekce", "definujbuffer", "definujfont", "definujformatodkazu", "definujhbox", "definujinterakcnimenu", "definujkombinovanyseznam", "definujkonverzi", "definujnadpis", "definujobrazeksymbol", "definujodkaz", "definujodstavce", "definujopis", "definujoramovani", "definujoramovanytext", "definujpaletu", "definujplvouciobjekt", "definujpodpole", "definujpole", "definujpopis", "definujpopisek", "definujprekryv", "definujprikaz", "definujprofil", "definujprogram", "definujprostredizakladnihofontu", "definujrejstrik", "definujsablonutabulky", "definujsekci", "definujseznam", "definujskupinubarev", "definujstartstop", "definujstyl", "definujstylfontu", "definujsymbol", "definujsynonumumfontu", "definujsynonyma", "definujtabelaci", "definujtext", "definujtrideni", "definujupravu", "definujvelikostpapiru", "definujvycet", "definujzakladnifont", "definujzasobnikpoli", "definujznaceni", "definujznak", "delkaseznamu", "externiobraz", "hlavnijazyk", "hodnotabarvy", "instalacejazyka", "interakcnilista", "interakcnitlacitka", "interaktivnimenu", "jazyk", "jdidolu", "jdina", "jdinabox", "jdinastranu", "klonujpole", "komponenta", "konvertujcislo", "kopirujpole", "korekcebilehomista", "matematika", "meritko", "mesic", "mezera", "mrizka", "nastavbarvu", "nastavbarvy", "nastavbilamista", "nastavblok", "nastavbloksekce", "nastavbuffer", "nastavcernelinky", "nastavcislonadpisu", "nastavcislostrany", "nastavcislovaniodstavcu", "nastavcislovaniradku", "nastavcislovanistran", "nastavcitaci", "nastavdeleniplvoucichobjektu", "nastavdelitko", "nastavdolnitexty", "nastavhorejsek", "nastavhornitexty", "nastavinterakci", "nastavinterakcnilistu", "nastavinterakcnimenu", "nastavinterakcniobrazovku", "nastavjazyk", "nastavkapitalky", "nastavkombinovanyseznam", "nastavkomentar", "nastavkomentarstrany", "nastavmarginalnilinky", "nastavmeziradkovoumezeru", "nastavnadpis", "nastavnadpisy", "nastavodkazovani", "nastavodsazovani", "nastavodstavce", "nastavopis", "nastavoramovanetexty", "nastavoramovani", "nastavorez", "nastavotoceni", "nastavpaletu", "nastavplvouciobjekt", "nastavplvouciobjekty", "nastavpodcislostrany", "nastavpole", "nastavpolozky", "nastavpopisek", "nastavpopisky", "nastavpozadi", "nastavprechodstrany", "nastavpreskok", "nastavprogramy", "nastavradkovani", "nastavradky", "nastavrejstrik", "nastavrovnice", "nastavsadusymbolu", "nastavseznam", "nastavsirkucary", "nastavsloupce", "nastavspodek", "nastavsynonyma", "nastavtabelaci", "nastavtabulky", "nastavtenkelinky", "nastavtext", "nastavtextovelinky", "nastavtexttexty", "nastavtextyupati", "nastavtextyzahlavi", "nastavtoleranci", "nastavtrideni", "nastavtype", "nastavumisteniprotejsku", "nastavumistovani", "nastavupati", "nastavupravu", "nastavurl", "nastavusporadani", "nastavvelikostpapiru", "nastavvsechnapole", "nastavvycty", "nastavvyplnovelinky", "nastavvyplnoveradky", "nastavvzhled", "nastavzahlavi", "nastavzakladnifont", "nastavzarovnani", "nastavznaceni", "nastavzuzeni", "nastrane", "nejakyradek", "nekde", "neznamo", "nivy", "nizky", "nokap", "obrazovka", "odkaz", "odkaznastranu", "odkaznatext", "odkazujici", "opis", "opissoubor", "oramovani", "oref", "orez", "otocit", "oznaceni", "pis", "plnezneni", "pole", "polozka", "polozky", "porovnejpaletu", "porovnejskupinubarev", "pozadi", "pozice", "poznamka", "pref", "prelozit", "prepninazakladnifont", "preskoc", "prizpusobivepole", "prizpusobvzhled", "produkt", "projekt", "prostredi", "resetznaceni", "rimskecislice", "rozdelplvouciobjekt", "roztazene", "schovejbloky", "sedabarva", "sloupec", "slovovpravo", "stanovcharakteristickuseznamu", "stanovcislonadpisu", "startbarva", "startinteraktivnimenu", "startjazyk", "startjdina", "startkomponenta", "startmarginalnilinka", "startnadpis", "startoramovani", "startpolozka", "startpozadi", "startprodukt", "startprojekt", "startprostredi", "startpublikace", "startradek", "starttextovalinka", "startumistirovnici", "startzarovnanonastred", "startzarovnanovlevo", "startzarovnanovpravo", "startzhustene", "stopbarva", "stopinteraktivnimenu", "stopjazyk", "stopjdina", "stopkomponenta", "stopmarginalnilinka", "stopnadpis", "stoporamovani", "stoppolozka", "stoppozadi", "stopprodukt", "stopprojekt", "stopprostredi", "stoppublikace", "stopradek", "stoptextovalinka", "stopumistirovnici", "stopzarovnanonastred", "stopzarovnanovlevo", "stopzarovnanovpravo", "stopzhustene", "strana", "tecky", "tenkalinka", "tenkelinky", "textovalinka", "tlacitko", "tlacitkomenu", "tloustkacary", "tref", "tvrdamezera", "tvrdemezery", "ukazbarvu", "ukazmrizku", "ukaznastaveni", "ukazpaletu", "ukazpodpery", "ukazpostredizakladnihofontu", "ukazramecek", "ukazsadusymbolu", "ukazskupinubarev", "ukazupravu", "ukazvytisk", "ukazvzhled", "ukazzakladnifont", "umistikombinovanyseznam", "umistilokalnipoznamkypodcarou", "umistinadsebe", "umistinamrizku", "umistipodrovnici", "umistipoznamkypodcarou", "umistirejstrik", "umistirovnici", "umistiseznam", "umistivedlesebe", "umistizalozky", "urcicharakteristikurejstriku", "uzijJSscripts", "uzijURL", "uzijadresar", "uzijbloky", "uzijexternidokument", "uzijexterniobraz", "uzijexternizvuk", "uzijmodul", "uzijsymbol", "uzijurl", "verze", "vlasovalinka", "vradku", "vsedniden", "vyberbloky", "vyplnenytext", "vyplnovelinky", "vyplnovyradek", "vysoky", "zachovejbloky", "zadnamezera", "zadnehorniadolniradky", "zadnezahlaviaupati", "zalozka", "zapisdoseznamu", "zapismeziseznam", "zaramovani", "zarovnanonastred", "zarovnanovlevo", "zarovnanovpravo", "zasobnikpoli", "ziskejbuffer", "ziskejznaceni", "znaceni", "znak", "znaky", "zpracujbloky", "zrcadlit", "zref" },
- ["de"]={ "Buchstabe", "Buchstaben", "Kap", "MONAT", "Roemischezahlen", "WOCHENTAG", "WOERTER", "WORT", "Woerter", "Wort", "Ziffern", "amgitterausrichten", "aufseite", "ausfuelltext", "ausschnitt", "bearbeitebloecke", "behaltebloecke", "bei", "bemerkung", "benutzeverzeichnis", "beschriftung", "bestimmekopfnummer", "bestimmelistencharakeristika", "bestimmeregistercharakteristika", "bildschirm", "blanko", "buchstabe", "buchstaben", "datum", "defineschriftsynonym", "definiereabbsymbol", "definiereabsaetze", "definiereabschnitt", "definiereabschnittsblock", "definiereakzent", "definierebefehl", "definierebeschreibung", "definierebeschriftung", "definiereblock", "definierefarbe", "definierefarbengruppe", "definierefeld", "definierefeldstapel", "definierefliesstext", "definierefliesstextumgebung", "definieregleitobjekt", "definierehbox", "definiereinteraktionsmenue", "definierekonversion", "definierelabel", "definiereliste", "definieren", "definierenummerierung", "definiereoverlay", "definierepalette", "definierepapierformat", "definiereprofil", "definiereprogramme", "definierepuffer", "definierereferenz", "definierereferenzformat", "definiereregister", "definiereschrift", "definiereschriftstil", "definieresortieren", "definierestartstop", "definierestil", "definieresubfeld", "definieresymbol", "definieresynonyme", "definieretabellenvorlage", "definieretabulator", "definieretext", "definieretippen", "definiereueberschrift", "definiereumbruch", "definiereumrahmt", "definiereumrahmtertext", "definierezeichen", "definierezusammengestellteliste", "drehen", "duennelinie", "duennerumriss", "einezeile", "externeabbildung", "farbbalken", "farbe", "farbewert", "feld", "feldstapel", "festesspatium", "format", "formelnummer", "gefuelltesrechteck", "gefuelltezeile", "gestreckt", "gitter", "graufarbe", "haarlinie", "hauptsprache", "heutigesdatum", "heutigeskopfnummer", "hintergrund", "hoch", "holebeschriftung", "holepuffer", "imumriss", "installieresprache", "interaktionsbalken", "interaktionsknopfe", "interaktionsmenue", "inzeile", "irgendwo", "keinekopfundfusszeilen", "keinspatium", "keinzeilenobenundunten", "klonierefeld", "knopf", "komponente", "konvertierezahl", "kopfnummer", "kopierefeld", "korrigierezwischenraum", "liniendicke", "linksbuendig", "listenlaenge", "mathematik", "menueknopf", "monat", "nachunten", "nokap", "notiz", "passelayoutan", "passendfeld", "platzierebookmarks", "platziereformel", "platzierefussnoten", "platziereliste", "platzierelokalefussnoten", "platzierenebeneinander", "platziereregister", "platziereuntereinander", "platziereunterformel", "platzierezusammengestellteliste", "pos", "posten", "produkt", "programm", "projekt", "punkt", "rechteck", "rechtecke", "rechtsbuendig", "referenz", "referieren", "roemischezahlen", "ruecksetztenbeschriftung", "schreibezurliste", "schreibezwischenliste", "seite", "seitenreferenz", "seitenummer", "settext", "spalte", "spatium", "spiegeln", "sprache", "startfarbe", "starthintergrund", "startinteraktionsmenue", "startkleinerdurchschuss", "startkomponente", "startkopf", "startlinksbuendig", "startmarginallinie", "startplatziereformel", "startpos", "startprodukt", "startprojekt", "startpublikation", "startrechtsbuendig", "startsprache", "starttextlinie", "startumgebung", "startumrahmt", "startzeile", "startzentriert", "startzu", "stelleabsaetzeein", "stelleabsatznummerierungein", "stelleabschnittsblockein", "stelleanordnenein", "stelleaufzaehlungenein", "stelleausrichtungein", "stelleausschnittein", "stellebeschreibungein", "stellebeschriftungein", "stellebilderunterschriftein", "stellebildunterschriftein", "stellebindestrichein", "stelleblankoein", "stelleblockein", "stelledrehenein", "stelleduennerumrissein", "stelleeinziehenein", "stelleengerein", "stellefarbeein", "stellefarbenein", "stellefeldein", "stellefelderin", "stellefliesstextein", "stelleformelnein", "stellefusszeileein", "stellefusszeilentextein", "stellegefuelltesrechteckein", "stellegefuelltezeileein", "stellegegenueberplatzierenein", "stellegleitobjekteein", "stellegleitobjektein", "stellehintergruendeein", "stellehintergrundein", "stelleinteraktionein", "stelleinteraktionsbalkenein", "stelleinteraktionsbildschirmein", "stelleinteraktionsmenueein", "stellekommentarein", "stellekopfzahlein", "stellekopfzeileein", "stellekopfzeilentextein", "stellelayoutein", "stellelinienbreiteein", "stellelisteein", "stellemarginallinieein", "stellenobenein", "stellepaletteein", "stellepapierformatein", "stelleplatziegeteiltegleitobjekt", "stellepositionierenein", "stellepostenein", "stelleprogrammein", "stellepufferein", "stellerechteckein", "stellereferenzierenein", "stelleregisterein", "stelleseitenkommentarein", "stelleseitennummerein", "stelleseitennummeriernungein", "stelleseitenuebergangein", "stellesortierenein", "stellespaltenein", "stellespatiumein", "stellespracheein", "stellesymbolsetein", "stellesynonymein", "stelletabellenein", "stelletabulatorein", "stelletextein", "stelletextobenein", "stelletexttexteein", "stelletextumrissein", "stelletextuntenein", "stelletipein", "stelletippenein", "stelletoleranzein", "stelleueberschriftein", "stelleueberschriftenein", "stelleumbruchein", "stelleumrahmtein", "stelleumrahmtetexteein", "stelleuntenein", "stelleunterseitennummerein", "stelleurlein", "stelleversalienein", "stellezeilenabstandein", "stellezeilenein", "stellezeilennumerierungein", "stellezitierenein", "stellezusammengestelltelisteein", "stellezwischenraumein", "stopfarbe", "stophintergrund", "stopinteraktionsmenue", "stopkleinerdurchschuss", "stopkomponente", "stopkopf", "stoplinksbuendig", "stopmarginallinie", "stopplatziereformel", "stoppos", "stopprodukt", "stopprojekt", "stoppublikation", "stoprechtsbuendig", "stopsprache", "stoptextlinie", "stopumgebung", "stopumrahmt", "stopzeile", "stopzentriert", "stopzu", "teilegleitobjekt", "textlinie", "textreferenz", "tief", "tiho", "tip", "tippedatei", "tippen", "tippepuffer", "ueber", "uebersetzten", "umgebung", "umrahmt", "unbekant", "verbergebloecke", "vergleichefarbengruppe", "vergleichepalette", "verwendeJSscript", "verwendeURL", "verwendebloecke", "verwendeexteresdokument", "verwendeexterneabbildung", "verwendeexternestonstueck", "verwendemodul", "verwendesymbole", "verwendeurl", "volleswort", "von", "waehlebloeckeaus", "wechselezumfliesstext", "wochentag", "wortrechts", "zeigedruck", "zeigeeinstellungen", "zeigefarbe", "zeigefarbengruppe", "zeigefliesstext", "zeigefliesstextumgebung", "zeigegitter", "zeigelayout", "zeigepalette", "zeigerahmen", "zeigestruts", "zeigeumbruch", "zentriert", "ziffern", "zu", "zurbox", "zurseite" },
+ ["common"]={ "AEacute", "AEligature", "AEmacron", "AMSTEX", "Aacute", "Abreve", "Abreveacute", "Abrevedotbelow", "Abrevegrave", "Abrevehook", "Abrevetilde", "Acaron", "Acircumflex", "Acircumflexacute", "Acircumflexdotbelow", "Acircumflexgrave", "Acircumflexhook", "Acircumflextilde", "Adiaeresis", "Adiaeresismacron", "Adotaccent", "Adotaccentmacron", "Adotbelow", "Adoublegrave", "AfterPar", "Agrave", "Ahook", "Ainvertedbreve", "Alpha", "Alphabeticnumerals", "AmSTeX", "Amacron", "And", "Angstrom", "Aogonek", "Aring", "Aringacute", "Arrowvert", "Astroke", "Atilde", "BeforePar", "Beta", "Bhook", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "Box", "Bumpeq", "CONTEXT", "Cacute", "Cap", "Caps", "Ccaron", "Ccedilla", "Ccircumflex", "Cdotaccent", "Character", "Characters", "Chi", "Chook", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "Cstroke", "Cup", "DZcaronligature", "DZligature", "Dafrican", "Dcaron", "Ddownarrow", "Delta", "Dhook", "Doteq", "Downarrow", "Dstroke", "Dzcaronligature", "Dzligature", "ETEX", "Eacute", "Ebreve", "Ecaron", "Ecedilla", "Ecircumflex", "Ecircumflexacute", "Ecircumflexdotbelow", "Ecircumflexgrave", "Ecircumflexhook", "Ecircumflextilde", "Ediaeresis", "Edotaccent", "Edotbelow", "Edoublegrave", "Egrave", "Ehook", "Einvertedbreve", "Emacron", "Eogonek", "Epsilon", "Eta", "Eth", "Etilde", "Eulerconst", "EveryLine", "EveryPar", "Fhook", "Finv", "Gacute", "Game", "Gamma", "Gbreve", "Gcaron", "Gcircumflex", "Gcommaaccent", "Gdotaccent", "GetPar", "Ghook", "GotoPar", "Greeknumerals", "Gstroke", "Hat", "Hcaron", "Hcircumflex", "Hstroke", "IJligature", "INRSTEX", "Iacute", "Ibreve", "Icaron", "Icircumflex", "Idiaeresis", "Idotaccent", "Idotbelow", "Idoublegrave", "Igrave", "Ihook", "Iinvertedbreve", "Im", "Imacron", "Iogonek", "Iota", "Istroke", "Itilde", "Jcircumflex", "Join", "Kappa", "Kcaron", "Kcommaaccent", "Khook", "LAMSTEX", "LATEX", "LJligature", "LUAJITTEX", "LUAMETATEX", "LUATEX", "LaTeX", "Lacute", "LamSTeX", "Lambda", "Lbar", "Lcaron", "Lcommaaccent", "Ldotmiddle", "Ldsh", "Leftarrow", "Leftrightarrow", "Ljligature", "Lleftarrow", "Longleftarrow", "Longleftrightarrow", "Longmapsfrom", "Longmapsto", "Longrightarrow", "Lsh", "Lstroke", "Lua", "LuaMetaTeX", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTH", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "Mapsfrom", "Mapsto", "MetaFont", "MetaFun", "MetaPost", "Mu", "NJligature", "Nacute", "Ncaron", "Ncommaaccent", "Nearrow", "Neng", "Ngrave", "Njligature", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Ntilde", "Nu", "Numbers", "Nwarrow", "OEligature", "Oacute", "Obreve", "Ocaron", "Ocircumflex", "Ocircumflexacute", "Ocircumflexdotbelow", "Ocircumflexgrave", "Ocircumflexhook", "Ocircumflextilde", "Odiaeresis", "Odiaeresismacron", "Odotaccent", "Odotaccentmacron", "Odotbelow", "Odoublegrave", "Ograve", "Ohook", "Ohorn", "Ohornacute", "Ohorndotbelow", "Ohorngrave", "Ohornhook", "Ohorntilde", "Ohungarumlaut", "Oinvertedbreve", "Omacron", "Omega", "Omicron", "Oogonek", "Oogonekmacron", "Ostroke", "Ostrokeacute", "Otilde", "Otildemacron", "P", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "Phi", "Phook", "Pi", "PiCTeX", "Plankconst", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PropertyLine", "Psi", "PtToCm", "Racute", "Rcaron", "Rcommaaccent", "Rdoublegrave", "Rdsh", "Re", "ReadFile", "Relbar", "Rho", "Rightarrow", "Rinvertedbreve", "Romannumerals", "Rrightarrow", "Rsh", "S", "Sacute", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Scaron", "Scedilla", "Schwa", "Scircumflex", "Scommaaccent", "Searrow", "Sigma", "Smallcapped", "Subset", "Supset", "Swarrow", "TABLE", "TEX", "TaBlE", "Tau", "Tcaron", "Tcedilla", "Tcommaaccent", "TeX", "TheNormalizedFontSize", "Theta", "Thook", "Thorn", "TransparencyHack", "Tstroke", "Uacute", "Ubreve", "Ucaron", "Ucircumflex", "Udiaeresis", "Udiaeresisacute", "Udiaeresiscaron", "Udiaeresisgrave", "Udiaeresismacron", "Udotbelow", "Udoublegrave", "Ugrave", "Uhook", "Uhorn", "Uhornacute", "Uhorndotbelow", "Uhorngrave", "Uhornhook", "Uhorntilde", "Uhungarumlaut", "Uinvertedbreve", "Umacron", "Uogonek", "Uparrow", "Updownarrow", "Upsilon", "Uring", "Utilde", "Uuparrow", "VDash", "Vdash", "VerboseNumber", "Vert", "Vvdash", "WEEKDAY", "WORD", "WORDS", "Wcircumflex", "WidthSpanningText", "Word", "Words", "XETEX", "XeTeX", "Xi", "Yacute", "Ycircumflex", "Ydiaeresis", "Ydotbelow", "Ygrave", "Yhook", "Ymacron", "Ytilde", "Zacute", "Zcaron", "Zdotaccent", "Zeta", "Zhook", "Zstroke", "aacute", "abbreviation", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "about", "abreve", "abreveacute", "abrevedotbelow", "abrevegrave", "abrevehook", "abrevetilde", "acaron", "acircumflex", "acircumflexacute", "acircumflexdotbelow", "acircumflexgrave", "acircumflexhook", "acircumflextilde", "activatespacehandler", "actualday", "actualmonth", "actualyear", "actuarial", "acute", "acwopencirclearrow", "adaptcollector", "adaptfontfeature", "adaptlayout", "adaptpapersize", "addfeature", "addfontpath", "addtoJSpreamble", "addtocommalist", "addvalue", "adiaeresis", "adiaeresismacron", "adotaccent", "adotaccentmacron", "adotbelow", "adoublegrave", "aeacute", "aeligature", "aemacron", "afghanicurrency", "aftersplitstring", "aftertestandsplitstring", "agrave", "ahook", "ainvertedbreve", "aleph", "alignbottom", "aligned", "alignedbox", "alignedline", "alignhere", "alignmentcharacter", "allinputpaths", "alpha", "alphabeticnumerals", "alwayscitation", "alwayscite", "amacron", "amalg", "ampersand", "anchor", "angle", "aogonek", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "approx", "approxEq", "approxeq", "approxnEq", "arabicakbar", "arabicalayhe", "arabicallah", "arabicallallahou", "arabicasterisk", "arabicbasmalah", "arabiccomma", "arabiccuberoot", "arabicdateseparator", "arabicdecimals", "arabicdisputedendofayah", "arabicendofayah", "arabicexnumerals", "arabicfootnotemarker", "arabicfourthroot", "arabichighain", "arabichighalayheassallam", "arabichigheqala", "arabichighesala", "arabichighfootnotemarker", "arabichighjeem", "arabichighlamalef", "arabichighmadda", "arabichighmeemlong", "arabichighmeemshort", "arabichighnisf", "arabichighnoon", "arabichighnoonkasra", "arabichighqaf", "arabichighqif", "arabichighradiallahouanhu", "arabichighrahmatullahalayhe", "arabichighrubc", "arabichighsad", "arabichighsajda", "arabichighsakta", "arabichighsallallahou", "arabichighseen", "arabichighsmallsafha", "arabichightah", "arabichightakhallus", "arabichighthalatha", "arabichighwaqf", "arabichighyeh", "arabichighzain", "arabicjallajalalouhou", "arabiclettermark", "arabiclowmeemlong", "arabiclownoonkasra", "arabiclowseen", "arabicmisra", "arabicmuhammad", "arabicnumber", "arabicnumberabove", "arabicnumerals", "arabicparenleft", "arabicparenright", "arabicpercent", "arabicperiod", "arabicpermille", "arabicpertenthousand", "arabicpoeticverse", "arabicqala", "arabicquestion", "arabicrasoul", "arabicray", "arabicrialsign", "arabicsafha", "arabicsajdah", "arabicsalla", "arabicsamvat", "arabicsanah", "arabicsemicolon", "arabicshighthreedots", "arabicslcm", "arabicstartofrubc", "arabictripledot", "arabicvowelwaw", "arabicvowelyeh", "arabicwasallam", "arg", "aring", "aringacute", "arrowvert", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "ast", "astype", "asymp", "at", "atilde", "atleftmargin", "atpage", "atrightmargin", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "autointegral", "automathematics", "autopagestaterealpage", "autopagestaterealpageorder", "autosetups", "availablehsize", "averagecharwidth", "backepsilon", "background", "backgroundimage", "backgroundimagefill", "backgroundline", "backprime", "backsim", "backslash", "bar", "barleftarrow", "barleftarrowrightarrowbar", "barovernorthwestarrow", "barwedge", "basegrid", "baselinebottom", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbordermatrix", "bbox", "because", "beforesplitstring", "beforetestandsplitstring", "beta", "beth", "between", "bhook", "big", "bigbodyfont", "bigcap", "bigcirc", "bigcircle", "bigcup", "bigdiamond", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigodot", "bigoplus", "bigotimes", "bigr", "bigskip", "bigsqcap", "bigsqcup", "bigsquare", "bigstar", "bigtimes", "bigtriangledown", "bigtriangleup", "bigudot", "biguplus", "bigvee", "bigwedge", "binom", "bitmapimage", "blacklozenge", "blackrule", "blackrules", "blacksquare", "blacktriangle", "blacktriangledown", "blacktriangleleft", "blacktriangleright", "blank", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "blocksynctexfile", "blockuservariable", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "bookmark", "booleanmodevalue", "bordermatrix", "bot", "bottombox", "bottomleftbox", "bottomrightbox", "bowtie", "boxcursor", "boxdot", "boxmarker", "boxminus", "boxofsize", "boxplus", "boxreference", "boxtimes", "bpos", "breakablethinspace", "breakhere", "breve", "bstroke", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhiddencitation", "btxhybridcite", "btxlabellanguage", "btxlabeltext", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "buildmathaccent", "buildtextaccent", "buildtextbottomcomma", "buildtextbottomdot", "buildtextcedilla", "buildtextgrave", "buildtextmacron", "buildtextognek", "bullet", "button", "cacute", "calligraphic", "camel", "cap", "capital", "carriagereturn", "catcodetablename", "cbox", "ccaron", "ccedilla", "ccircumflex", "ccurl", "cdot", "cdotaccent", "cdotp", "cdots", "centeraligned", "centerbox", "centerdot", "centeredbox", "centeredlastline", "centerednextbox", "centerline", "cfrac", "chapter", "character", "characters", "chardescription", "charwidthlanguage", "check", "checkcharacteralign", "checkedblank", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checkmark", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chi", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "chook", "circ", "circeq", "circlearrowleft", "circlearrowright", "circledR", "circledS", "circledast", "circledcirc", "circleddash", "circledequals", "circleonrightarrow", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "clippedoverlayimage", "clonefield", "clubsuit", "collect", "collectedtext", "collectexpanded", "colon", "coloncolonequals", "colonequals", "color", "colorbar", "colorcomponents", "colored", "coloronly", "colorvalue", "column", "columnbreak", "columnsetspanwidth", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparecolorgroup", "comparedimension", "comparedimensioneps", "comparepalet", "complement", "completebtxrendering", "completecontent", "completeindex", "completelist", "completelistofabbreviations", "completelistofchemicals", "completelistoffigures", "completelistofgraphics", "completelistofintermezzi", "completelistoflogos", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completelistoftables", "completepagenumber", "completeregister", "complexes", "complexorsimple", "complexorsimpleempty", "component", "composedcollector", "composedlayer", "compresult", "cong", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertnumber", "convertvalue", "convertvboxtohbox", "coprod", "copyboxfromcache", "copybtxlabeltext", "copyfield", "copyheadtext", "copylabeltext", "copymathlabeltext", "copyoperatortext", "copypages", "copyparameters", "copyposition", "copyprefixtext", "copyright", "copysetups", "copysuffixtext", "copytaglabeltext", "copyunittext", "correctwhitespace", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "crlf", "crlfplaceholder", "cstroke", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "cup", "curlyeqprec", "curlyeqsucc", "curlyvee", "curlywedge", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentdate", "currentenvironment", "currentfeaturetest", "currentheadnumber", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "curvearrowleft", "curvearrowright", "cwopencirclearrow", "cyrillicA", "cyrillicAE", "cyrillicAbreve", "cyrillicAdiaeresis", "cyrillicB", "cyrillicBIGYUS", "cyrillicBIGYUSiotified", "cyrillicC", "cyrillicCH", "cyrillicCHEDC", "cyrillicCHEDCabkhasian", "cyrillicCHEabkhasian", "cyrillicCHEdiaeresis", "cyrillicCHEkhakassian", "cyrillicCHEvertstroke", "cyrillicD", "cyrillicDASIAPNEUMATA", "cyrillicDJE", "cyrillicDZE", "cyrillicDZEabkhasian", "cyrillicDZHE", "cyrillicE", "cyrillicELtail", "cyrillicEMtail", "cyrillicENDC", "cyrillicENGHE", "cyrillicENhook", "cyrillicENtail", "cyrillicEREV", "cyrillicERY", "cyrillicERtick", "cyrillicEbreve", "cyrillicEdiaeresis", "cyrillicEgrave", "cyrillicEiotified", "cyrillicF", "cyrillicFITA", "cyrillicG", "cyrillicGHEmidhook", "cyrillicGHEstroke", "cyrillicGHEupturn", "cyrillicGJE", "cyrillicH", "cyrillicHA", "cyrillicHADC", "cyrillicHRDSN", "cyrillicI", "cyrillicIE", "cyrillicII", "cyrillicISHRT", "cyrillicISHRTtail", "cyrillicIZHITSA", "cyrillicIZHITSAdoublegrave", "cyrillicIdiaeresis", "cyrillicIgrave", "cyrillicImacron", "cyrillicJE", "cyrillicK", "cyrillicKADC", "cyrillicKAbashkir", "cyrillicKAhook", "cyrillicKAstroke", "cyrillicKAvertstroke", "cyrillicKJE", "cyrillicKOPPA", "cyrillicKSI", "cyrillicL", "cyrillicLITTLEYUS", "cyrillicLITTLEYUSiotified", "cyrillicLJE", "cyrillicM", "cyrillicN", "cyrillicNJE", "cyrillicO", "cyrillicOMEGA", "cyrillicOMEGAround", "cyrillicOMEGAtitlo", "cyrillicOT", "cyrillicObarred", "cyrillicObarreddiaeresis", "cyrillicOdiaeresis", "cyrillicP", "cyrillicPALATALIZATION", "cyrillicPALOCHKA", "cyrillicPEmidhook", "cyrillicPSI", "cyrillicPSILIPNEUMATA", "cyrillicR", "cyrillicS", "cyrillicSCHWA", "cyrillicSCHWAdiaeresis", "cyrillicSDSC", "cyrillicSEMISOFT", "cyrillicSFTSN", "cyrillicSH", "cyrillicSHCH", "cyrillicSHHA", "cyrillicT", "cyrillicTEDC", "cyrillicTETSE", "cyrillicTITLO", "cyrillicTSHE", "cyrillicU", "cyrillicUK", "cyrillicUSHRT", "cyrillicUdiaeresis", "cyrillicUdoubleacute", "cyrillicUmacron", "cyrillicV", "cyrillicYA", "cyrillicYAT", "cyrillicYERUdiaeresis", "cyrillicYI", "cyrillicYO", "cyrillicYU", "cyrillicYstr", "cyrillicYstrstroke", "cyrillicZ", "cyrillicZDSC", "cyrillicZEdiaeresis", "cyrillicZH", "cyrillicZHEbreve", "cyrillicZHEdescender", "cyrillicZHEdiaeresis", "cyrillica", "cyrillicabreve", "cyrillicadiaeresis", "cyrillicae", "cyrillicb", "cyrillicbigyus", "cyrillicbigyusiotified", "cyrillicc", "cyrillicch", "cyrilliccheabkhasian", "cyrillicchedc", "cyrillicchedcabkhasian", "cyrillicchediaeresis", "cyrillicchekhakassian", "cyrillicchevertstroke", "cyrillicd", "cyrillicdje", "cyrillicdze", "cyrillicdzeabkhasian", "cyrillicdzhe", "cyrillice", "cyrillicebreve", "cyrillicediaeresis", "cyrillicegrave", "cyrilliceiotified", "cyrilliceltail", "cyrillicemtail", "cyrillicendc", "cyrillicenghe", "cyrillicenhook", "cyrillicentail", "cyrillicerev", "cyrillicertick", "cyrillicery", "cyrillicf", "cyrillicfita", "cyrillicg", "cyrillicghemidhook", "cyrillicghestroke", "cyrillicgheupturn", "cyrillicgje", "cyrillich", "cyrillicha", "cyrillichadc", "cyrillichrdsn", "cyrillici", "cyrillicidiaeresis", "cyrillicie", "cyrillicigrave", "cyrillicii", "cyrillicimacron", "cyrillicishrt", "cyrillicishrttail", "cyrillicizhitsa", "cyrillicizhitsadoublegrave", "cyrillicje", "cyrillick", "cyrillickabashkir", "cyrillickadc", "cyrillickahook", "cyrillickastroke", "cyrillickavertstroke", "cyrillickje", "cyrillickoppa", "cyrillicksi", "cyrillicl", "cyrilliclittleyus", "cyrilliclittleyusiotified", "cyrilliclje", "cyrillicm", "cyrillicn", "cyrillicnje", "cyrillico", "cyrillicobarred", "cyrillicobarreddiaeresis", "cyrillicodiaeresis", "cyrillicomega", "cyrillicomegaround", "cyrillicomegatitlo", "cyrillicot", "cyrillicp", "cyrillicpemidhook", "cyrillicpsi", "cyrillicr", "cyrillics", "cyrillicschwa", "cyrillicschwadiaeresis", "cyrillicsdsc", "cyrillicsemisoft", "cyrillicsftsn", "cyrillicsh", "cyrillicshch", "cyrillicshha", "cyrillict", "cyrillictedc", "cyrillictetse", "cyrillictshe", "cyrillicu", "cyrillicudiaeresis", "cyrillicudoubleacute", "cyrillicuk", "cyrillicumacron", "cyrillicushrt", "cyrillicv", "cyrillicya", "cyrillicyat", "cyrillicyerudiaeresis", "cyrillicyi", "cyrillicyo", "cyrillicystr", "cyrillicystrstroke", "cyrillicyu", "cyrillicz", "cyrilliczdsc", "cyrilliczediaeresis", "cyrilliczh", "cyrilliczhebreve", "cyrilliczhedescender", "cyrilliczhediaeresis", "d", "dag", "dagger", "daleth", "dasharrow", "dashedleftarrow", "dashedrightarrow", "dashv", "datasetvariable", "date", "dayoftheweek", "dayspermonth", "dbinom", "dcaron", "dcurl", "ddag", "ddagger", "dddot", "ddot", "ddots", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "define", "defineMPinstance", "defineTABLEsetup", "defineaccent", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "defineblock", "definebodyfont", "definebodyfontenvironment", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebuffer", "definebutton", "definecapitals", "definecharacter", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolor", "definecolorgroup", "definecolumnbreak", "definecolumnset", "definecolumnsetarea", "definecolumnsetspan", "definecombination", "definecombinedlist", "definecommand", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversion", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedeq", "definedescription", "definedfont", "defineeffect", "defineenumeration", "defineexpandable", "defineexternalfigure", "definefacingfloat", "definefallbackfamily", "definefield", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefieldstack", "definefiguresymbol", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefloat", "definefont", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "definefontstyle", "definefontsynonym", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframed", "defineframedcontent", "defineframedtable", "defineframedtext", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "definehbox", "definehead", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinteractionmenu", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabel", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelist", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemakeup", "definemarginblock", "definemargindata", "definemarker", "definemarking", "definemathaccent", "definemathalignment", "definemathcases", "definemathcommand", "definemathdouble", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathover", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunder", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "defineoverlay", "definepage", "definepagebreak", "definepagechecker", "definepagecolumns", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "definepalet", "definepapersize", "defineparagraph", "defineparagraphs", "defineparallel", "defineparbuilder", "defineperiodkerning", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "defineprofile", "defineprogram", "definepushbutton", "definepushsymbol", "definereference", "definereferenceformat", "defineregister", "definerenderingwindow", "defineresetset", "defineruby", "definescale", "definescript", "definesection", "definesectionblock", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definesorting", "definespotcolor", "definestartstop", "definestyle", "definestyleinstance", "definesubfield", "definesubformula", "definesymbol", "definesynonym", "definesynonyms", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabletemplate", "definetabulate", "definetabulation", "definetext", "definetextbackground", "definetextflow", "definetextnote", "definetokenlist", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "definetyping", "defineunit", "defineuserdata", "defineuserdataalternative", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "delimited", "delimitedtext", "delta", "depthofstring", "depthonlybox", "depthspanningtext", "depthstrut", "determineheadnumber", "determinelistcharacteristics", "determinenoflines", "determineregistercharacteristics", "devanagarinumerals", "dfrac", "dhook", "diameter", "diamond", "diamondsuit", "differentialD", "differentiald", "digamma", "digits", "dimensiontocount", "directboxfromcache", "directcolor", "directcolored", "directconvertedcounter", "directcopyboxfromcache", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "div", "dividedsize", "divideontimes", "divides", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dofastloopcs", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifassignmentelsecs", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdocumentvariable", "doifdocumentvariableelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseassignmentcs", "doifelseblack", "doifelsebox", "doifelseboxincache", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedocumentvariable", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontfeature", "doifelsefontpresent", "doifelsefontsynonym", "doifelseframed", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarkedpage", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpage", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetopofpage", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontfeatureelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotdocumentvariable", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftopofpageelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifunknownfontfeature", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dot", "doteq", "doteqdot", "dotfskip", "dotlessI", "dotlessJ", "dotlessi", "dotlessj", "dotlessjstroke", "dotminus", "dotoks", "dotplus", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "dots", "dottedcircle", "dottedrightarrow", "doublebar", "doublebond", "doublebrace", "doublebracket", "doublecap", "doublecup", "doubleparent", "doubleprime", "doubleverticalbar", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "downarrow", "downdasharrow", "downdownarrows", "downharpoonleft", "downharpoonright", "downuparrows", "downwhitearrow", "downzigzagarrow", "dpofstring", "dstroke", "dtail", "dummydigit", "dummyparameter", "dzcaronligature", "dzligature", "eTeX", "eacute", "ebreve", "ecaron", "ecedilla", "ecircumflex", "ecircumflexacute", "ecircumflexdotbelow", "ecircumflexgrave", "ecircumflexhook", "ecircumflextilde", "edefconvertedargument", "ediaeresis", "edotaccent", "edotbelow", "edoublegrave", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "egrave", "ehook", "einvertedbreve", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "ell", "em", "emacron", "emdash", "emphasisboldface", "emphasistypeface", "emptylines", "emptyset", "emquad", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "endash", "endnote", "enquad", "enskip", "enspace", "env", "environment", "envvar", "eogonek", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "epsilon", "eq", "eqcirc", "eqeq", "eqeqeq", "eqgtr", "eqless", "eqsim", "eqslantgtr", "eqslantless", "equaldigits", "equalscolon", "equiv", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "eta", "eth", "ethiopic", "etilde", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "exclamdown", "executeifdefined", "exists", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandeddoif", "expandeddoifelse", "expandeddoifnot", "expandfontsynonym", "expdoif", "expdoifcommonelse", "expdoifelse", "expdoifelsecommon", "expdoifelseinset", "expdoifinsetelse", "expdoifnot", "exponentiale", "externalfigure", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "fallingdotseq", "fastdecrement", "fastincrement", "fastlocalframed", "fastloopfinal", "fastloopindex", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "ffiligature", "ffligature", "fflligature", "fhook", "field", "fieldbody", "fieldstack", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figurespace", "figuresymbol", "figurewidth", "filename", "filigature", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "fillinline", "fillinrules", "fillintext", "fillupto", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstinlist", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfield", "fitfieldframed", "fittopbaselinegrid", "fiveeighths", "fivesixths", "fixedspace", "fixedspaces", "flag", "flat", "flligature", "floatuserdataparameter", "flushbox", "flushboxregister", "flushcollector", "flushedrightlastline", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnote", "footnotetext", "forall", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "forgetparskip", "forgetragged", "formula", "formulanumber", "foundbox", "fourfifths", "fourperemspace", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "framed", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "from", "fromlinenote", "frown", "frozenhbox", "frule", "gacute", "gamma", "gbreve", "gcaron", "gcircumflex", "gcommaaccent", "gdefconvertedargument", "gdefconvertedcommand", "gdotaccent", "ge", "geq", "geqq", "geqslant", "getMPdrawing", "getMPlayer", "getboxfromcache", "getboxllx", "getboxlly", "getbuffer", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getinlineuserdata", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmarking", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "gets", "getsubstring", "gettokenlist", "gettwopassdata", "gettwopassdatalist", "getuserdata", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "gg", "ggg", "gggtr", "gimel", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gnapprox", "gneqq", "gnsim", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "godown", "goto", "gotobox", "gotopage", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grave", "graycolor", "grayvalue", "greedysplitstring", "greekAlpha", "greekAlphadasia", "greekAlphadasiaperispomeni", "greekAlphadasiatonos", "greekAlphadasiavaria", "greekAlphaiotasub", "greekAlphaiotasubdasia", "greekAlphaiotasubdasiaperispomeni", "greekAlphaiotasubdasiatonos", "greekAlphaiotasubdasiavaria", "greekAlphaiotasubpsili", "greekAlphaiotasubpsiliperispomeni", "greekAlphaiotasubpsilitonos", "greekAlphaiotasubpsilivaria", "greekAlphamacron", "greekAlphapsili", "greekAlphapsiliperispomeni", "greekAlphapsilitonos", "greekAlphapsilivaria", "greekAlphatonos", "greekAlphavaria", "greekAlphavrachy", "greekBeta", "greekChi", "greekCoronis", "greekDelta", "greekEpsilon", "greekEpsilondasia", "greekEpsilondasiatonos", "greekEpsilondasiavaria", "greekEpsilonpsili", "greekEpsilonpsilitonos", "greekEpsilonpsilivaria", "greekEpsilontonos", "greekEpsilonvaria", "greekEta", "greekEtadasia", "greekEtadasiaperispomeni", "greekEtadasiatonos", "greekEtadasiavaria", "greekEtaiotasub", "greekEtaiotasubdasia", "greekEtaiotasubdasiaperispomeni", "greekEtaiotasubdasiatonos", "greekEtaiotasubdasiavaria", "greekEtaiotasubpsili", "greekEtaiotasubpsiliperispomeni", "greekEtaiotasubpsilitonos", "greekEtaiotasubpsilivaria", "greekEtapsili", "greekEtapsiliperispomeni", "greekEtapsilitonos", "greekEtapsilivaria", "greekEtatonos", "greekEtavaria", "greekGamma", "greekIota", "greekIotadasia", "greekIotadasiaperispomeni", "greekIotadasiatonos", "greekIotadasiavaria", "greekIotadialytika", "greekIotamacron", "greekIotapsili", "greekIotapsiliperispomeni", "greekIotapsilitonos", "greekIotapsilivaria", "greekIotatonos", "greekIotavaria", "greekIotavrachy", "greekKappa", "greekLambda", "greekMu", "greekNu", "greekOmega", "greekOmegadasia", "greekOmegadasiaperispomeni", "greekOmegadasiatonos", "greekOmegadasiavaria", "greekOmegaiotasub", "greekOmegaiotasubdasia", "greekOmegaiotasubdasiaperispomeni", "greekOmegaiotasubdasiatonos", "greekOmegaiotasubdasiavaria", "greekOmegaiotasubpsili", "greekOmegaiotasubpsiliperispomeni", "greekOmegaiotasubpsilitonos", "greekOmegaiotasubpsilivaria", "greekOmegapsili", "greekOmegapsiliperispomeni", "greekOmegapsilitonos", "greekOmegapsilivaria", "greekOmegatonos", "greekOmegavaria", "greekOmicron", "greekOmicrondasia", "greekOmicrondasiatonos", "greekOmicrondasiavaria", "greekOmicronpsili", "greekOmicronpsilitonos", "greekOmicronpsilivaria", "greekOmicrontonos", "greekOmicronvaria", "greekPhi", "greekPi", "greekPsi", "greekRho", "greekRhodasia", "greekSigma", "greekSigmalunate", "greekTau", "greekTheta", "greekUpsilon", "greekUpsilondasia", "greekUpsilondasiaperispomeni", "greekUpsilondasiatonos", "greekUpsilondasiavaria", "greekUpsilondialytika", "greekUpsilonmacron", "greekUpsilontonos", "greekUpsilonvaria", "greekUpsilonvrachy", "greekXi", "greekZeta", "greekalpha", "greekalphadasia", "greekalphadasiaperispomeni", "greekalphadasiatonos", "greekalphadasiavaria", "greekalphaiotasub", "greekalphaiotasubdasia", "greekalphaiotasubdasiaperispomeni", "greekalphaiotasubdasiatonos", "greekalphaiotasubdasiavaria", "greekalphaiotasubperispomeni", "greekalphaiotasubpsili", "greekalphaiotasubpsiliperispomeni", "greekalphaiotasubpsilitonos", "greekalphaiotasubpsilivaria", "greekalphaiotasubtonos", "greekalphaiotasubvaria", "greekalphamacron", "greekalphaoxia", "greekalphaperispomeni", "greekalphapsili", "greekalphapsiliperispomeni", "greekalphapsilitonos", "greekalphapsilivaria", "greekalphatonos", "greekalphavaria", "greekalphavrachy", "greekbeta", "greekbetaalt", "greekchi", "greekdasia", "greekdasiaperispomeni", "greekdasiatonos", "greekdasiavaria", "greekdelta", "greekdialytikaperispomeni", "greekdialytikatonos", "greekdialytikavaria", "greekdigamma", "greekepsilon", "greekepsilonalt", "greekepsilondasia", "greekepsilondasiatonos", "greekepsilondasiavaria", "greekepsilonoxia", "greekepsilonpsili", "greekepsilonpsilitonos", "greekepsilonpsilivaria", "greekepsilontonos", "greekepsilonvaria", "greeketa", "greeketadasia", "greeketadasiaperispomeni", "greeketadasiatonos", "greeketadasiavaria", "greeketaiotasub", "greeketaiotasubdasia", "greeketaiotasubdasiaperispomeni", "greeketaiotasubdasiatonos", "greeketaiotasubdasiavaria", "greeketaiotasubperispomeni", "greeketaiotasubpsili", "greeketaiotasubpsiliperispomeni", "greeketaiotasubpsilitonos", "greeketaiotasubpsilivaria", "greeketaiotasubtonos", "greeketaiotasubvaria", "greeketaoxia", "greeketaperispomeni", "greeketapsili", "greeketapsiliperispomeni", "greeketapsilitonos", "greeketapsilivaria", "greeketatonos", "greeketavaria", "greekfinalsigma", "greekgamma", "greekiota", "greekiotadasia", "greekiotadasiaperispomeni", "greekiotadasiatonos", "greekiotadasiavaria", "greekiotadialytika", "greekiotadialytikaperispomeni", "greekiotadialytikatonos", "greekiotadialytikavaria", "greekiotamacron", "greekiotaoxia", "greekiotaperispomeni", "greekiotapsili", "greekiotapsiliperispomeni", "greekiotapsilitonos", "greekiotapsilivaria", "greekiotatonos", "greekiotavaria", "greekiotavrachy", "greekkappa", "greekkoppa", "greeklambda", "greekmu", "greeknu", "greeknumerals", "greeknumkoppa", "greekomega", "greekomegadasia", "greekomegadasiaperispomeni", "greekomegadasiatonos", "greekomegadasiavaria", "greekomegaiotasub", "greekomegaiotasubdasia", "greekomegaiotasubdasiaperispomeni", "greekomegaiotasubdasiatonos", "greekomegaiotasubdasiavaria", "greekomegaiotasubperispomeni", "greekomegaiotasubpsili", "greekomegaiotasubpsiliperispomeni", "greekomegaiotasubpsilitonos", "greekomegaiotasubpsilivaria", "greekomegaiotasubtonos", "greekomegaiotasubvaria", "greekomegaoxia", "greekomegaperispomeni", "greekomegapsili", "greekomegapsiliperispomeni", "greekomegapsilitonos", "greekomegapsilivaria", "greekomegatonos", "greekomegavaria", "greekomicron", "greekomicrondasia", "greekomicrondasiatonos", "greekomicrondasiavaria", "greekomicronoxia", "greekomicronpsili", "greekomicronpsilitonos", "greekomicronpsilivaria", "greekomicrontonos", "greekomicronvaria", "greekoxia", "greekperispomeni", "greekphi", "greekphialt", "greekpi", "greekpialt", "greekprosgegrammeni", "greekpsi", "greekpsili", "greekpsiliperispomeni", "greekpsilitonos", "greekpsilivaria", "greekrho", "greekrhoalt", "greekrhodasia", "greekrhopsili", "greeksampi", "greeksigma", "greeksigmalunate", "greekstigma", "greektau", "greektheta", "greekthetaalt", "greektonos", "greekupsilon", "greekupsilondasia", "greekupsilondasiaperispomeni", "greekupsilondasiatonos", "greekupsilondasiavaria", "greekupsilondiaeresis", "greekupsilondialytikaperispomeni", "greekupsilondialytikatonos", "greekupsilondialytikavaria", "greekupsilonmacron", "greekupsilonoxia", "greekupsilonperispomeni", "greekupsilonpsili", "greekupsilonpsiliperispomeni", "greekupsilonpsilitonos", "greekupsilonpsilivaria", "greekupsilontonos", "greekupsilonvaria", "greekupsilonvrachy", "greekvaria", "greekxi", "greekzeta", "grid", "groupedcommand", "gsetboxllx", "gsetboxlly", "gstroke", "gt", "gtrapprox", "gtrdot", "gtreqless", "gtreqqless", "gtrless", "gtrsim", "guilsingleleft", "guilsingleright", "gujaratinumerals", "gurmurkhinumerals", "hairline", "hairspace", "halflinestrut", "halfstrut", "halfwaybox", "handletokens", "handwritten", "hangul", "hanzi", "hash", "hat", "hbar", "hboxofvbox", "hboxreference", "hcaron", "hcircumflex", "hdofstring", "headhbox", "headlanguage", "headnumber", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtext", "headtextcontent", "headtextdistance", "headtexts", "headtextwidth", "headvbox", "headwidth", "heartsuit", "hebrewAlef", "hebrewAyin", "hebrewBet", "hebrewDalet", "hebrewGimel", "hebrewHe", "hebrewHet", "hebrewKaf", "hebrewKaffinal", "hebrewLamed", "hebrewMem", "hebrewMemfinal", "hebrewNun", "hebrewNunfinal", "hebrewPe", "hebrewPefinal", "hebrewQof", "hebrewResh", "hebrewSamekh", "hebrewShin", "hebrewTav", "hebrewTet", "hebrewTsadi", "hebrewTsadifinal", "hebrewVav", "hebrewYod", "hebrewZayin", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "hideblocks", "high", "highlight", "highordinalstr", "hilo", "himilo", "hl", "hookleftarrow", "hookrightarrow", "horizontalgrowingbar", "horizontalpositionbar", "hpackbox", "hpackedbox", "hphantom", "hpos", "hsizefraction", "hslash", "hsmash", "hsmashbox", "hsmashed", "hspace", "hstroke", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "iacute", "ibox", "ibreve", "icaron", "icircumflex", "ideographichalffillspace", "ideographicspace", "idiaeresis", "idotaccent", "idotbelow", "idoublegrave", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignoretagsinexport", "ignorevalue", "igrave", "ihook", "iiiint", "iiiintop", "iiint", "iiintop", "iint", "iintop", "iinvertedbreve", "ijligature", "imacron", "imaginaryi", "imaginaryj", "imath", "immediatesavetwopassdata", "impliedby", "implies", "imply", "in", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "index", "infofont", "infofontbold", "inframed", "infty", "infull", "inheritparameter", "inhibitblank", "ininner", "ininneredge", "ininnermargin", "initializeboxstack", "inleft", "inleftedge", "inleftmargin", "inline", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlineprettyprintbuffer", "inlinerange", "inmargin", "inmframed", "innerflushshapebox", "inother", "inouter", "inouteredge", "inoutermargin", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "inright", "inrightedge", "inrightmargin", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installglobalmacrostack", "installlanguage", "installleftframerenderer", "installmacrostack", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "int", "intclockwise", "integerrounding", "integers", "interactionbar", "interactionbuttons", "interactionmenu", "intercal", "intertext", "intop", "invisibletimes", "invokepageheandler", "iogonek", "iota", "italic", "italicbold", "italiccorrection", "italicface", "item", "items", "itemtag", "itilde", "jcaron", "jcircumflex", "jmath", "jobfilename", "jobfilesuffix", "kap", "kappa", "kcaron", "kcommaaccent", "keepblocks", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "khook", "kkra", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "lVert", "labellanguage", "labeltext", "labeltexts", "lacute", "lambda", "lambdabar", "land", "langle", "language", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "latin", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbar", "lbox", "lbrace", "lbracket", "lcaron", "lceil", "lcommaaccent", "lcurl", "ldotmiddle", "ldotp", "ldots", "le", "leadsto", "left", "leftaligned", "leftarrow", "leftarrowtail", "leftarrowtriangle", "leftbottombox", "leftbox", "leftdasharrow", "leftguillemot", "leftharpoondown", "leftharpoonup", "lefthbox", "leftheadtext", "leftlabeltext", "leftleftarrows", "leftline", "leftmathlabeltext", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftrightarrow", "leftrightarrows", "leftrightarrowtriangle", "leftrightharpoons", "leftrightsquigarrow", "leftskipadaption", "leftsquigarrow", "leftsubguillemot", "leftthreetimes", "lefttopbox", "lefttoright", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "leftwavearrow", "leftwhitearrow", "leq", "leqq", "leqslant", "lessapprox", "lessdot", "lesseqgtr", "lesseqqgtr", "lessgtr", "lesssim", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterleftbracket", "letterleftparenthesis", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "letterrightbracket", "letterrightparenthesis", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lfloor", "lgroup", "lhbox", "lhooknwarrow", "lhooksearrow", "limitatefirstline", "limitatelines", "limitatetext", "line", "linebox", "linefeed", "linenote", "linespanningtext", "linethickness", "linterval", "listcitation", "listcite", "listlength", "listnamespaces", "ljligature", "ll", "llangle", "llap", "llbracket", "llcorner", "lll", "llless", "lmoustache", "lnapprox", "lneq", "lneqq", "lnot", "lnsim", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "logo", "lohi", "lointerval", "lomihi", "longleftarrow", "longleftrightarrow", "longmapsfrom", "longmapsto", "longrightarrow", "longrightsquigarrow", "looparrowleft", "looparrowright", "lor", "low", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lozenge", "lparent", "lrcorner", "lrointerval", "lrtbbox", "lstroke", "lt", "ltimes", "ltop", "ltrhbox", "ltrvbox", "ltrvtop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luaexpr", "luafunction", "luajitTeX", "luamajorversion", "luametaTeX", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "lvert", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "mainlanguage", "makecharacteractive", "makerawcommalist", "makestrutofbox", "maltese", "mapfontsize", "mapsdown", "mapsfrom", "mapsto", "mapsup", "margindata", "margintext", "markcontent", "markedpages", "marking", "markinjector", "markpage", "mat", "math", "mathampersand", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathdefault", "mathdollar", "mathdouble", "mathematics", "mathfraktur", "mathfunction", "mathhash", "mathhyphen", "mathit", "mathitalic", "mathlabellanguage", "mathlabeltext", "mathlabeltexts", "mathop", "mathover", "mathpercent", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathunder", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "maxaligned", "mbox", "mcframed", "measure", "measured", "measuredangle", "measuredeq", "medskip", "medspace", "menubutton", "mequal", "message", "mfence", "mframed", "mfunction", "mfunctionlabeltext", "mhbox", "mho", "mhookleftarrow", "mhookrightarrow", "mid", "midaligned", "middle", "middlealigned", "middlebox", "midhbox", "midsubsentence", "minimalhbox", "minus", "minuscolon", "mirror", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "models", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "month", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "mu", "multimap", "nHdownarrow", "nHuparrow", "nLeftarrow", "nLeftrightarrow", "nRightarrow", "nVDash", "nVdash", "nVleftarrow", "nVleftrightarrow", "nVrightarrow", "nabla", "nacute", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "napostrophe", "napprox", "napproxEq", "narrownobreakspace", "nasymp", "natural", "naturalhbox", "naturalhpack", "naturalnumbers", "naturaltpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "ncaron", "ncommaaccent", "ncong", "ncurl", "ndivides", "ne", "nearrow", "neg", "negatecolorbox", "negated", "negativesign", "negemspace", "negenspace", "negthinspace", "neng", "neq", "nequiv", "neswarrow", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nexists", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "ngeq", "ngrave", "ngtr", "ngtrless", "ngtrsim", "ni", "nihongo", "nin", "njligature", "nleftarrow", "nleftrightarrow", "nleq", "nless", "nlessgtr", "nlesssim", "nmid", "nni", "nobar", "nobreakspace", "nocap", "nocharacteralign", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noheaderandfooterlines", "noheightstrut", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalitalicface", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normalslantedface", "normaltypeface", "nospace", "not", "note", "notesymbol", "notin", "notopandbottomlines", "notragged", "nowns", "nparallel", "nprec", "npreccurlyeq", "nrightarrow", "nsim", "nsimeq", "nsqsubseteq", "nsqsupseteq", "nsubset", "nsubseteq", "nsucc", "nsucccurlyeq", "nsupset", "nsupseteq", "ntilde", "ntimes", "ntriangleleft", "ntrianglelefteq", "ntriangleright", "ntrianglerighteq", "nu", "numberofpoints", "numbers", "nvDash", "nvdash", "nvleftarrow", "nvleftrightarrow", "nvrightarrow", "nwarrow", "nwsearrow", "oacute", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "obreve", "ocaron", "ocircumflex", "ocircumflexacute", "ocircumflexdotbelow", "ocircumflexgrave", "ocircumflexhook", "ocircumflextilde", "odiaeresis", "odiaeresismacron", "odot", "odotaccent", "odotaccentmacron", "odotbelow", "odoublegrave", "oeligature", "offset", "offsetbox", "ograve", "ohm", "ohook", "ohorn", "ohornacute", "ohorndotbelow", "ohorngrave", "ohornhook", "ohorntilde", "ohungarumlaut", "oiiint", "oiint", "oint", "ointclockwise", "ointctrclockwise", "oinvertedbreve", "omacron", "omega", "omicron", "ominus", "onedigitrounding", "oneeighth", "onefifth", "onehalf", "onequarter", "onesixth", "onesuperior", "onethird", "oogonek", "oogonekmacron", "operatorlanguage", "operatortext", "oplus", "ordfeminine", "ordinaldaynumber", "ordinalstr", "ordmasculine", "ornamenttext", "oslash", "ostroke", "ostrokeacute", "otilde", "otildemacron", "otimes", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbarunderbar", "overbrace", "overbraceunderbrace", "overbracket", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlayimage", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overloaderror", "overparent", "overparentunderparent", "overrightarrow", "overset", "overstrike", "overstrikes", "owns", "page", "pagearea", "pagebreak", "pagefigure", "pageinjection", "pagenumber", "pagereference", "pagestaterealpage", "pagestaterealpageorder", "paletsize", "paragraphmark", "parallel", "part", "partial", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "periodcentered", "periods", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "perp", "persiandecimals", "persiandecimalseparator", "persiannumerals", "persianthousandsseparator", "perthousand", "phantom", "phantombox", "phi", "phook", "pi", "pickupgroupedcommand", "pitchfork", "placeattachments", "placebookmarks", "placebtxrendering", "placechemical", "placecitation", "placecombinedlist", "placecomments", "placecontent", "placecurrentformulanumber", "placedbox", "placefigure", "placefloat", "placefloatwithsetups", "placefootnotes", "placeformula", "placeframed", "placegraphic", "placeheadnumber", "placeheadtext", "placehelp", "placeindex", "placeinitial", "placeintermezzo", "placelayer", "placelayeredtext", "placelegend", "placelist", "placelistofabbreviations", "placelistofchemicals", "placelistoffigures", "placelistofgraphics", "placelistofintermezzi", "placelistoflogos", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelistoftables", "placelocalfootnotes", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placeongrid", "placeontopofeachother", "placepagenumber", "placepairedbox", "placeparallel", "placerawheaddata", "placerawheadnumber", "placerawheadtext", "placerawlist", "placeregister", "placerenderingwindow", "placesidebyside", "placesubformula", "placetable", "pm", "popattribute", "popmacro", "popmode", "popsystemmode", "position", "positionoverlay", "positionregionoverlay", "positivesign", "postponenotes", "prec", "precapprox", "preccurlyeq", "preceq", "preceqq", "precnapprox", "precneq", "precneqq", "precnsim", "precsim", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prefixlanguage", "prefixtext", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "prerollblank", "presetbtxlabeltext", "presetdocument", "presetfieldsymbols", "presetheadtext", "presetlabeltext", "presetmathlabeltext", "presetoperatortext", "presetprefixtext", "presetsuffixtext", "presettaglabeltext", "presetunittext", "pretocommalist", "prettyprintbuffer", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "prime", "primes", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processblocks", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "prod", "product", "profiledbox", "profilegivenbox", "program", "project", "propto", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "psi", "punctuationspace", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "putboxincache", "putnextboxincache", "qquad", "quad", "quadrupleprime", "quads", "quarterstrut", "questiondown", "questionedeq", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "quotation", "quote", "quotedbl", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "quotesingle", "quotesinglebase", "rVert", "racute", "raggedbottom", "raggedcenter", "raggedleft", "raggedright", "raggedwidecenter", "raisebox", "randomizetext", "randomnumber", "rangle", "rationals", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "rbrace", "rbracket", "rcaron", "rceil", "rcommaaccent", "rdoublegrave", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "reals", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "reference", "referenceprefix", "referring", "registerattachment", "registerctxluafile", "registered", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "relbar", "remainingcharacters", "remark", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "repeathead", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetboxesincache", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmarking", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetperiodkerning", "resetprofile", "resetrecurselevel", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettokenlist", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "restriction", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "reverseddoubleprime", "reversedprime", "reversedtripleprime", "reversehbox", "reversehpack", "reversetpack", "reversevbox", "reversevpack", "reversevtop", "revivefeature", "rfence", "rfloor", "rgroup", "rhbox", "rho", "rhooknearrow", "rhookswarrow", "right", "rightaligned", "rightangle", "rightarrow", "rightarrowbar", "rightarrowtail", "rightarrowtriangle", "rightbottombox", "rightbox", "rightdasharrow", "rightguillemot", "rightharpoondown", "rightharpoonup", "righthbox", "rightheadtext", "rightlabeltext", "rightleftarrows", "rightleftharpoons", "rightline", "rightmathlabeltext", "rightorleftpageaction", "rightpageorder", "rightrightarrows", "rightskipadaption", "rightsquigarrow", "rightsubguillemot", "rightthreearrows", "rightthreetimes", "righttoleft", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rightwavearrow", "rightwhitearrow", "ring", "rinterval", "rinvertedbreve", "risingdotseq", "rlap", "rlointerval", "rmoustache", "rneq", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rointerval", "rollbutton", "roman", "romanC", "romanD", "romanI", "romanII", "romanIII", "romanIV", "romanIX", "romanL", "romanM", "romanV", "romanVI", "romanVII", "romanVIII", "romanX", "romanXI", "romanXII", "romanc", "romand", "romani", "romanii", "romaniii", "romaniv", "romanix", "romanl", "romanm", "romannumerals", "romanv", "romanvi", "romanvii", "romanviii", "romanx", "romanxi", "romanxii", "rootradical", "rotate", "rparent", "rrangle", "rrbracket", "rrointerval", "rtimes", "rtlhbox", "rtlvbox", "rtlvtop", "rtop", "ruby", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "rvert", "sacute", "safechar", "samplefile", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "scale", "scaron", "scedilla", "schwa", "schwahook", "scircumflex", "scommaaccent", "screen", "searrow", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "section", "sectionmark", "seeindex", "select", "selectblocks", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setautopagestaterealpageno", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharacteraligndetail", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setfirstpasscharacteralign", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setglobalscript", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelement", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setlocalscript", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setminus", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setperiodkerning", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsecondpasscharacteralign", "setsectionblock", "setsimplecolumnshsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settestcrlf", "settextcontent", "settightobject", "settightreferencedobject", "settightstrut", "settightunreferencedobject", "settokenlist", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupalign", "setupalternativestyles", "setuparranging", "setupattachment", "setupattachments", "setupbackend", "setupbackground", "setupbackgrounds", "setupbar", "setupbars", "setupblackrules", "setupblank", "setupbleeding", "setupblock", "setupbodyfont", "setupbookmark", "setupbottom", "setupbottomtexts", "setupbtx", "setupbtxdataset", "setupbtxlabeltext", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbuffer", "setupbutton", "setupcapitals", "setupcaption", "setupcaptions", "setupcharacteralign", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupclipping", "setupcollector", "setupcolor", "setupcolors", "setupcolumns", "setupcolumnset", "setupcolumnsetarea", "setupcolumnsetareatext", "setupcolumnsetlines", "setupcolumnsetspan", "setupcolumnsetstart", "setupcombination", "setupcombinedlist", "setupcomment", "setupcontent", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenumerations", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfacingfloat", "setupfield", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfields", "setupfieldtotalframed", "setupfiller", "setupfillinlines", "setupfillinrules", "setupfirstline", "setupfittingpage", "setupfloat", "setupfloatframed", "setupfloats", "setupfloatsplitting", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupfooter", "setupfootertexts", "setupfootnotes", "setupforms", "setupformula", "setupformulae", "setupformulaframed", "setupframed", "setupframedcontent", "setupframedtable", "setupframedtablecolumn", "setupframedtablerow", "setupframedtext", "setupframedtexts", "setupglobalreferenceprefix", "setuphead", "setupheadalternative", "setupheader", "setupheadertexts", "setupheadnumber", "setupheads", "setupheadtext", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setuphyphenmark", "setupindentedtext", "setupindenting", "setupindex", "setupinitial", "setupinsertion", "setupinteraction", "setupinteractionbar", "setupinteractionmenu", "setupinteractionscreen", "setupinterlinespace", "setupitaliccorrection", "setupitemgroup", "setupitemizations", "setupitemize", "setupitems", "setuplabel", "setuplabeltext", "setuplanguage", "setuplayer", "setuplayeredtext", "setuplayout", "setuplayouttext", "setuplegend", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinenumbering", "setuplines", "setuplinetable", "setuplinewidth", "setuplist", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmakeup", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmarginrules", "setupmarking", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathfractions", "setupmathframed", "setupmathlabeltext", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnarrower", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoperatortext", "setupoppositeplacing", "setupoutputroutine", "setuppagechecker", "setuppagecolumns", "setuppagecomment", "setuppageinjection", "setuppageinjectionalternative", "setuppagenumber", "setuppagenumbering", "setuppageshift", "setuppagestate", "setuppagetransitions", "setuppairedbox", "setuppalet", "setuppaper", "setuppapersize", "setupparagraph", "setupparagraphintro", "setupparagraphnumbering", "setupparagraphs", "setupparallel", "setupperiodkerning", "setupperiods", "setupplacement", "setuppositionbar", "setuppositioning", "setupprefixtext", "setupprocessor", "setupprofile", "setupprograms", "setupquotation", "setupquote", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupreferencing", "setupregister", "setupregisters", "setuprenderingwindow", "setuprotate", "setupruby", "setups", "setupscale", "setupscript", "setupscripts", "setupsectionblock", "setupselector", "setupshift", "setupsidebar", "setupsorting", "setupspacing", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setupsubformulas", "setupsubpagenumber", "setupsuffixtext", "setupsymbols", "setupsymbolset", "setupsynctex", "setupsynonyms", "setuptables", "setuptabulate", "setuptabulation", "setuptagging", "setuptaglabeltext", "setuptext", "setuptextbackground", "setuptextflow", "setuptextnote", "setuptextrules", "setuptexttexts", "setupthinrules", "setuptolerance", "setuptooltip", "setuptop", "setuptoptexts", "setuptype", "setuptyping", "setupunit", "setupunittext", "setupurl", "setupuserdata", "setupuserdataalternative", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwhitespace", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "seveneighths", "sfrac", "shapedhbox", "sharp", "shiftbox", "shiftdown", "shiftup", "showallmakeup", "showattributes", "showbodyfont", "showbodyfontenvironment", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolor", "showcolorbar", "showcolorcomponents", "showcolorgroup", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontexpansion", "showfontitalics", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showframe", "showglyphdata", "showglyphs", "showgrid", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayout", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmakeup", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showpalet", "showparentchain", "showprint", "showsetups", "showsetupsdefinition", "showstruts", "showsymbolset", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "sigma", "signalrightpage", "sim", "simeq", "simplealignedbox", "simplealignedboxplus", "simplealignedspreadbox", "simplegroupedcommand", "simplereversealignedbox", "simplereversealignedboxplus", "singalcharacteralign", "singlebond", "singleverticalbar", "sixperemspace", "sixthofsixarguments", "slanted", "slantedbold", "slantedface", "slash", "slicepages", "slong", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smallcaps", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "smile", "snaptogrid", "softhyphen", "solidus", "someheadnumber", "somekindoftab", "someline", "somelocalfloat", "somenamedheadnumber", "someplace", "somewhere", "space", "spaceddigits", "spaceddigitsmethod", "spaceddigitsseparator", "spaceddigitssymbol", "spadesuit", "spanishNumerals", "spanishnumerals", "speech", "sphericalangle", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitatperiod", "splitdfrac", "splitfilename", "splitfloat", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqcap", "sqcup", "sqrt", "sqsubset", "sqsubseteq", "sqsubsetneq", "sqsupset", "sqsupseteq", "sqsupsetneq", "square", "squaredots", "ssharp", "stackrel", "stackscripts", "star", "stareq", "startJScode", "startJSpreamble", "startLUA", "startMP", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startPARSEDXML", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEX", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startXML", "startalign", "startalignment", "startallmodes", "startappendices", "startarrangedpages", "startaside", "startattachment", "startbackground", "startbackmatter", "startbar", "startbbordermatrix", "startbitmapimage", "startblockquote", "startbodymatter", "startbordermatrix", "startboxedcolumns", "startbtxlabeltext", "startbtxrenderingdefinitions", "startbuffer", "startcases", "startcatcodetable", "startcenteraligned", "startchapter", "startcharacteralign", "startcheckedfences", "startchemical", "startchemicaltext", "startcollect", "startcollecting", "startcolor", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnset", "startcolumnsetspan", "startcombination", "startcomment", "startcomponent", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdelimited", "startdelimitedtext", "startdisplaymath", "startdmath", "startdocument", "starteffect", "startelement", "startembeddedxtable", "startendnote", "startendofline", "startenvironment", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfacingfloat", "startfact", "startfigure", "startfiguretext", "startfittingpage", "startfixed", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startfootnote", "startformula", "startformulas", "startframed", "startframedcell", "startframedcontent", "startframedrow", "startframedtable", "startframedtext", "startfrontmatter", "startgoto", "startgraphictext", "startgridsnapping", "starthanging", "starthbox", "starthboxestohbox", "starthboxregister", "starthead", "startheadtext", "starthelptext", "starthiding", "starthighlight", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinteraction", "startinteractionmenu", "startinterface", "startintermezzotext", "startintertext", "startitem", "startitemgroup", "startitemgroupcolumns", "startitemize", "startknockout", "startlabeltext", "startlanguage", "startlayout", "startleftaligned", "startlegend", "startline", "startlinealignment", "startlinecorrection", "startlinefiller", "startlinenote", "startlinenumbering", "startlines", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginblock", "startmarginrule", "startmarkedcontent", "startmarkpages", "startmathalignment", "startmathcases", "startmathlabeltext", "startmathmatrix", "startmathmode", "startmathstyle", "startmatrices", "startmatrix", "startmaxaligned", "startmdformula", "startmidaligned", "startmiddlealigned", "startmiddlemakeup", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startoperatortext", "startopposite", "startoutputstream", "startoverlay", "startoverprint", "startpacked", "startpagecolumns", "startpagecomment", "startpagefigure", "startpagelayout", "startpagemakeup", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpart", "startpath", "startplacechemical", "startplacefigure", "startplacefloat", "startplaceformula", "startplacegraphic", "startplaceintermezzo", "startplacelegend", "startplacepairedbox", "startplacetable", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startpostponingnotes", "startprefixtext", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startproduct", "startproject", "startprotect", "startprotectedcolors", "startpublication", "startpunctuation", "startquotation", "startquote", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startrightaligned", "startruby", "startscript", "startsdformula", "startsection", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsetups", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startsplitformula", "startsplittext", "startspread", "startstandardmakeup", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubject", "startsubjectlevel", "startsubsection", "startsubsentence", "startsubstack", "startsubsubject", "startsubsubsection", "startsubsubsubject", "startsubsubsubsection", "startsubsubsubsubject", "startsubsubsubsubsection", "startsubsubsubsubsubject", "startsuffixtext", "startsymbolset", "starttable", "starttablehead", "starttables", "starttabletail", "starttabletext", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttaglabeltext", "starttexcode", "starttexdefinition", "starttext", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextmakeup", "starttextrule", "starttitle", "starttokenlist", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "starttyping", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunittext", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startuserdata", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxcolumn", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "stligature", "stopJScode", "stopJSpreamble", "stopLUA", "stopMP", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopPARSEDXML", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEX", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopXML", "stopalign", "stopalignment", "stopallmodes", "stopappendices", "stoparrangedpages", "stopaside", "stopattachment", "stopbackground", "stopbackmatter", "stopbar", "stopbbordermatrix", "stopbitmapimage", "stopblockquote", "stopbodymatter", "stopbordermatrix", "stopboxedcolumns", "stopbtxlabeltext", "stopbtxrenderingdefinitions", "stopbuffer", "stopcases", "stopcatcodetable", "stopcenteraligned", "stopchapter", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopchemicaltext", "stopcollect", "stopcollecting", "stopcolor", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnset", "stopcolumnsetspan", "stopcombination", "stopcomment", "stopcomponent", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdelimited", "stopdelimitedtext", "stopdisplaymath", "stopdmath", "stopdocument", "stopeffect", "stopelement", "stopembeddedxtable", "stopendnote", "stopendofline", "stopenvironment", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfacingfloat", "stopfact", "stopfigure", "stopfiguretext", "stopfittingpage", "stopfixed", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopfootnote", "stopformula", "stopformulas", "stopframed", "stopframedcell", "stopframedcontent", "stopframedrow", "stopframedtable", "stopframedtext", "stopfrontmatter", "stopgoto", "stopgraphictext", "stopgridsnapping", "stophanging", "stophbox", "stophboxestohbox", "stophboxregister", "stophead", "stopheadtext", "stophelptext", "stophiding", "stophighlight", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinteraction", "stopinteractionmenu", "stopinterface", "stopintermezzotext", "stopintertext", "stopitem", "stopitemgroup", "stopitemgroupcolumns", "stopitemize", "stopknockout", "stoplabeltext", "stoplanguage", "stoplayout", "stopleftaligned", "stoplegend", "stopline", "stoplinealignment", "stoplinecorrection", "stoplinefiller", "stoplinenote", "stoplinenumbering", "stoplines", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginblock", "stopmarginrule", "stopmarkedcontent", "stopmarkpages", "stopmathalignment", "stopmathcases", "stopmathlabeltext", "stopmathmatrix", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmatrix", "stopmaxaligned", "stopmdformula", "stopmidaligned", "stopmiddlealigned", "stopmiddlemakeup", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopoperatortext", "stopopposite", "stopoutputstream", "stopoverlay", "stopoverprint", "stoppacked", "stoppagecolumns", "stoppagecomment", "stoppagefigure", "stoppagelayout", "stoppagemakeup", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppart", "stoppath", "stopplacechemical", "stopplacefigure", "stopplacefloat", "stopplaceformula", "stopplacegraphic", "stopplaceintermezzo", "stopplacelegend", "stopplacepairedbox", "stopplacetable", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stoppostponingnotes", "stopprefixtext", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopproduct", "stopproject", "stopprotect", "stopprotectedcolors", "stoppublication", "stoppunctuation", "stopquotation", "stopquote", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopreusableMPgraphic", "stoprightaligned", "stopruby", "stopscript", "stopsdformula", "stopsection", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsetups", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopsplitformula", "stopsplittext", "stopspread", "stopstandardmakeup", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstrut", "stopstyle", "stopsubformulas", "stopsubject", "stopsubjectlevel", "stopsubsection", "stopsubsentence", "stopsubstack", "stopsubsubject", "stopsubsubsection", "stopsubsubsubject", "stopsubsubsubsection", "stopsubsubsubsubject", "stopsubsubsubsubsection", "stopsubsubsubsubsubject", "stopsuffixtext", "stopsymbolset", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabletext", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptaglabeltext", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextmakeup", "stoptextrule", "stoptitle", "stoptokenlist", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stoptyping", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunittext", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopuserdata", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxcolumn", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stretched", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutgap", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subject", "subpagenumber", "subsection", "subsentence", "subset", "subseteq", "subseteqq", "subsetneq", "subsetneqq", "substituteincommalist", "subsubject", "subsubsection", "subsubsubject", "subsubsubsection", "subsubsubsubject", "subsubsubsubsection", "subsubsubsubsubject", "subtractfeature", "succ", "succapprox", "succcurlyeq", "succeq", "succeqq", "succnapprox", "succneq", "succneqq", "succnsim", "succsim", "suffixlanguage", "suffixtext", "sum", "supset", "supseteq", "supseteqq", "supsetneq", "supsetneqq", "surd", "surdradical", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "swarrow", "switchstyleonly", "switchtobodyfont", "switchtocolor", "switchtointerlinespace", "symbol", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "synctexblockfilename", "synctexresetfilename", "synctexsetfilename", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "taglabellanguage", "taglabeltext", "tau", "tbinom", "tbox", "tcaron", "tcedilla", "tcommaaccent", "tcurl", "tequal", "test", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textAngstrom", "textacute", "textampersand", "textasciicircum", "textasciitilde", "textat", "textbackslash", "textbar", "textbottomcomma", "textbottomdot", "textbraceleft", "textbraceright", "textbreve", "textbrokenbar", "textbullet", "textcaron", "textcedilla", "textcelsius", "textcent", "textcircledP", "textcircumflex", "textcitation", "textcite", "textcomma", "textcontrolspace", "textcurrency", "textdag", "textddag", "textdegree", "textdiaeresis", "textdiv", "textdollar", "textdong", "textdotaccent", "textellipsis", "texteuro", "textflowcollector", "textfraction", "textgrave", "texthash", "texthorizontalbar", "texthungarumlaut", "texthyphen", "textkelvin", "textlognot", "textmacron", "textmath", "textmho", "textminus", "textmu", "textmultiply", "textnumero", "textogonek", "textohm", "textormathchar", "textormathchars", "textounce", "textpercent", "textperiod", "textplus", "textpm", "textreference", "textring", "textrule", "textslash", "textsterling", "texttilde", "textunderscore", "textvisiblespace", "textyen", "thai", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "therefore", "theremainingcharacters", "theta", "thickspace", "thinrule", "thinrules", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thook", "thookleftarrow", "thookrightarrow", "thorn", "threedigitrounding", "threeeighths", "threefifths", "threeperemspace", "threequarter", "threesuperior", "tibetannumerals", "tightlayer", "tilde", "times", "tinyfont", "title", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "to", "tochar", "tolinenote", "tooltip", "top", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "trademark", "translate", "transparencycomponents", "transparent", "trel", "triangle", "triangledown", "triangleleft", "triangleq", "triangleright", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "tripleprime", "tripleverticalbar", "truefilename", "truefontname", "tstroke", "ttraggedright", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "turnediota", "twodigitrounding", "twofifths", "twoheaddownarrow", "twoheadleftarrow", "twoheadrightarrow", "twoheadrightarrowtail", "twoheaduparrow", "twosuperior", "twothirds", "tx", "txx", "typ", "type", "typebuffer", "typedefinedbuffer", "typeface", "typefile", "typeinlinebuffer", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uacute", "ubreve", "ucaron", "ucircumflex", "uconvertnumber", "udiaeresis", "udiaeresisacute", "udiaeresiscaron", "udiaeresisgrave", "udiaeresismacron", "udotbelow", "udots", "udoublegrave", "uedcatcodecommand", "ugrave", "uhook", "uhorn", "uhornacute", "uhorndotbelow", "uhorngrave", "uhornhook", "uhorntilde", "uhungarumlaut", "uinvertedbreve", "ulcorner", "umacron", "undefinevalue", "undepthed", "underbar", "underbars", "underbrace", "underbracket", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underparent", "underrandom", "underrandoms", "underrightarrow", "underset", "understrike", "understrikes", "undoassign", "unexpandeddocumentvariable", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unit", "unitlanguage", "unitshigh", "unitslow", "unittext", "unknown", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "unstackscripts", "untexargument", "untexcommand", "uogonek", "upand", "uparrow", "updasharrow", "updownarrow", "updownarrowbar", "updownarrows", "upharpoonleft", "upharpoonright", "uplus", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "upsilon", "upuparrows", "upwhitearrow", "urcorner", "uring", "url", "useJSscripts", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useURL", "usealignparameter", "useblankparameter", "useblocks", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecitation", "usecolors", "usecomponent", "usedirectory", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternaldocument", "useexternalfigure", "useexternalrendering", "useexternalsoundtrack", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "usemodule", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usesymbols", "usetexmodule", "usetypescript", "usetypescriptfile", "useurl", "usezipfile", "utfchar", "utflower", "utfupper", "utilde", "utilityregisterlength", "vDash", "varTheta", "varepsilon", "varkappa", "varnothing", "varphi", "varpi", "varrho", "varsigma", "vartheta", "vboxreference", "vdash", "vdots", "vec", "vee", "veebar", "veeeq", "verbatim", "verbatimstring", "verbosenumber", "version", "vert", "verticalgrowingbar", "verticalpositionbar", "veryraggedcenter", "veryraggedleft", "veryraggedright", "vglue", "viewerlayer", "vl", "vpackbox", "vpackedbox", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wcircumflex", "wdofstring", "wedge", "wedgeeq", "weekday", "whitearrowupfrombar", "widehat", "widetilde", "widthofstring", "widthspanningtext", "withoutpt", "word", "wordright", "words", "wordtonumber", "wp", "wr", "writebetweenlist", "writedatatolist", "writestatus", "writetolist", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xi", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifatt", "xmldoifelse", "xmldoifelseatt", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotatt", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineprettyprint", "xmlinlineprettyprinttext", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmllastpar", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpar", "xmlparam", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprettyprinttext", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetatt", "xmlsetattribute", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetpar", "xmlsetparam", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "yacute", "ycircumflex", "ydiaeresis", "ydotbelow", "yen", "ygrave", "yhook", "ymacron", "ytilde", "zacute", "zcaron", "zdotaccent", "zeronumberconversion", "zerowidthnobreakspace", "zerowidthspace", "zeta", "zhook", "zstroke", "zwj", "zwnj" },
+ ["cs"]={ "Cisla", "Kap", "MESIC", "Rimskecislice", "SLOVA", "SLOVO", "Slova", "Slovo", "VSEDNIDEN", "Znak", "Znaky", "aktualnicislonadpisu", "aktualnidatum", "barevnalista", "barva", "cernalinka", "cernelinky", "cisla", "cislonadpisu", "cislorovnice", "cislostrany", "datum", "definuj", "definujakcent", "definujbarvu", "definujblok", "definujbloksekce", "definujbuffer", "definujfont", "definujformatodkazu", "definujhbox", "definujinterakcnimenu", "definujkombinovanyseznam", "definujkonverzi", "definujnadpis", "definujobrazeksymbol", "definujodkaz", "definujodstavce", "definujopis", "definujoramovani", "definujoramovanytext", "definujpaletu", "definujplvouciobjekt", "definujpodpole", "definujpole", "definujpopis", "definujpopisek", "definujprekryv", "definujprikaz", "definujprofil", "definujprogram", "definujprostredizakladnihofontu", "definujrejstrik", "definujsablonutabulky", "definujsekci", "definujseznam", "definujskupinubarev", "definujstartstop", "definujstyl", "definujstylfontu", "definujsymbol", "definujsynonumumfontu", "definujsynonyma", "definujtabelaci", "definujtext", "definujtrideni", "definujupravu", "definujvelikostpapiru", "definujvycet", "definujzakladnifont", "definujzasobnikpoli", "definujznaceni", "definujznak", "delkaseznamu", "externiobraz", "hlavnijazyk", "hodnotabarvy", "instalacejazyka", "interakcnilista", "interakcnitlacitka", "interaktivnimenu", "jazyk", "jdidolu", "jdina", "jdinabox", "jdinastranu", "klonujpole", "komponenta", "konvertujcislo", "kopirujpole", "korekcebilehomista", "matematika", "meritko", "mesic", "mezera", "mrizka", "nastavbarvu", "nastavbarvy", "nastavbilamista", "nastavblok", "nastavbloksekce", "nastavbuffer", "nastavcernelinky", "nastavcislonadpisu", "nastavcislostrany", "nastavcislovaniodstavcu", "nastavcislovaniradku", "nastavcislovanistran", "nastavcitaci", "nastavdeleniplvoucichobjektu", "nastavdelitko", "nastavdolnitexty", "nastavhorejsek", "nastavhornitexty", "nastavinterakci", "nastavinterakcnilistu", "nastavinterakcnimenu", "nastavinterakcniobrazovku", "nastavjazyk", "nastavkapitalky", "nastavkombinovanyseznam", "nastavkomentar", "nastavkomentarstrany", "nastavmarginalnilinky", "nastavmeziradkovoumezeru", "nastavnadpis", "nastavnadpisy", "nastavodkazovani", "nastavodsazovani", "nastavodstavce", "nastavopis", "nastavoramovanetexty", "nastavoramovani", "nastavorez", "nastavotoceni", "nastavpaletu", "nastavplvouciobjekt", "nastavplvouciobjekty", "nastavpodcislostrany", "nastavpole", "nastavpolozky", "nastavpopisek", "nastavpopisky", "nastavpozadi", "nastavpoznamkypodcarou", "nastavprechodstrany", "nastavpreskok", "nastavprogramy", "nastavradkovani", "nastavradky", "nastavrejstrik", "nastavrovnice", "nastavsadusymbolu", "nastavseznam", "nastavsirkucary", "nastavsloupce", "nastavspodek", "nastavsynonyma", "nastavtabelaci", "nastavtabulky", "nastavtenkelinky", "nastavtext", "nastavtextovelinky", "nastavtexttexty", "nastavtextyupati", "nastavtextyzahlavi", "nastavtoleranci", "nastavtrideni", "nastavtype", "nastavumisteniprotejsku", "nastavumistovani", "nastavupati", "nastavupravu", "nastavurl", "nastavusporadani", "nastavvelikostpapiru", "nastavvsechnapole", "nastavvycty", "nastavvyplnovelinky", "nastavvyplnoveradky", "nastavvzhled", "nastavzahlavi", "nastavzakladnifont", "nastavzarovnani", "nastavznaceni", "nastavzuzeni", "nastrane", "nejakyradek", "nekde", "neznamo", "nivy", "nizky", "nokap", "obrazovka", "odkaz", "odkaznastranu", "odkaznatext", "odkazujici", "opis", "opissoubor", "oramovani", "oref", "orez", "otocit", "oznaceni", "pis", "plnezneni", "pole", "polozka", "polozky", "porovnejpaletu", "porovnejskupinubarev", "pozadi", "pozice", "poznamka", "pref", "prelozit", "prepninazakladnifont", "preskoc", "prizpusobivepole", "prizpusobvzhled", "produkt", "projekt", "prostredi", "resetznaceni", "rimskecislice", "rozdelplvouciobjekt", "roztazene", "schovejbloky", "sedabarva", "sloupec", "slovovpravo", "stanovcharakteristickuseznamu", "stanovcislonadpisu", "startbarva", "startinteraktivnimenu", "startjazyk", "startjdina", "startkomponenta", "startmarginalnilinka", "startnadpis", "startoramovani", "startpolozka", "startpozadi", "startprodukt", "startprojekt", "startprostredi", "startpublikace", "startradek", "starttextovalinka", "startumistirovnici", "startzarovnanonastred", "startzarovnanovlevo", "startzarovnanovpravo", "startzhustene", "stopbarva", "stopinteraktivnimenu", "stopjazyk", "stopjdina", "stopkomponenta", "stopmarginalnilinka", "stopnadpis", "stoporamovani", "stoppolozka", "stoppozadi", "stopprodukt", "stopprojekt", "stopprostredi", "stoppublikace", "stopradek", "stoptextovalinka", "stopumistirovnici", "stopzarovnanonastred", "stopzarovnanovlevo", "stopzarovnanovpravo", "stopzhustene", "strana", "tecky", "tenkalinka", "tenkelinky", "textovalinka", "tlacitko", "tlacitkomenu", "tloustkacary", "tref", "tvrdamezera", "tvrdemezery", "ukazbarvu", "ukazmrizku", "ukaznastaveni", "ukazpaletu", "ukazpodpery", "ukazpostredizakladnihofontu", "ukazramecek", "ukazsadusymbolu", "ukazskupinubarev", "ukazupravu", "ukazvytisk", "ukazvzhled", "ukazzakladnifont", "umistikombinovanyseznam", "umistilokalnipoznamkypodcarou", "umistinadsebe", "umistinamrizku", "umistipodrovnici", "umistipoznamkypodcarou", "umistirejstrik", "umistirovnici", "umistiseznam", "umistivedlesebe", "umistizalozky", "urcicharakteristikurejstriku", "uzijJSscripts", "uzijURL", "uzijadresar", "uzijbloky", "uzijexternidokument", "uzijexterniobraz", "uzijexternizvuk", "uzijmodul", "uzijsymbol", "uzijurl", "verze", "vlasovalinka", "vradku", "vsedniden", "vyberbloky", "vyplnenytext", "vyplnovelinky", "vyplnovyradek", "vysoky", "zachovejbloky", "zadnamezera", "zadnehorniadolniradky", "zadnezahlaviaupati", "zalozka", "zapisdoseznamu", "zapismeziseznam", "zaramovani", "zarovnanonastred", "zarovnanovlevo", "zarovnanovpravo", "zasobnikpoli", "ziskejbuffer", "ziskejznaceni", "znaceni", "znak", "znaky", "zpracujbloky", "zrcadlit", "zref" },
+ ["de"]={ "Buchstabe", "Buchstaben", "Kap", "MONAT", "Roemischezahlen", "WOCHENTAG", "WOERTER", "WORT", "Woerter", "Wort", "Ziffern", "amgitterausrichten", "aufseite", "ausfuelltext", "ausschnitt", "bearbeitebloecke", "behaltebloecke", "bei", "bemerkung", "benutzeverzeichnis", "beschriftung", "bestimmekopfnummer", "bestimmelistencharakeristika", "bestimmeregistercharakteristika", "bildschirm", "blanko", "buchstabe", "buchstaben", "datum", "defineschriftsynonym", "definiereabbsymbol", "definiereabsaetze", "definiereabschnitt", "definiereabschnittsblock", "definiereakzent", "definierebefehl", "definierebeschreibung", "definierebeschriftung", "definiereblock", "definierefarbe", "definierefarbengruppe", "definierefeld", "definierefeldstapel", "definierefliesstext", "definierefliesstextumgebung", "definieregleitobjekt", "definierehbox", "definiereinteraktionsmenue", "definierekonversion", "definierelabel", "definiereliste", "definieren", "definierenummerierung", "definiereoverlay", "definierepalette", "definierepapierformat", "definiereprofil", "definiereprogramme", "definierepuffer", "definierereferenz", "definierereferenzformat", "definiereregister", "definiereschrift", "definiereschriftstil", "definieresortieren", "definierestartstop", "definierestil", "definieresubfeld", "definieresymbol", "definieresynonyme", "definieretabellenvorlage", "definieretabulator", "definieretext", "definieretippen", "definiereueberschrift", "definiereumbruch", "definiereumrahmt", "definiereumrahmtertext", "definierezeichen", "definierezusammengestellteliste", "drehen", "duennelinie", "duennerumriss", "einezeile", "externeabbildung", "farbbalken", "farbe", "farbewert", "feld", "feldstapel", "festesspatium", "format", "formelnummer", "gefuelltesrechteck", "gefuelltezeile", "gestreckt", "gitter", "graufarbe", "haarlinie", "hauptsprache", "heutigesdatum", "heutigeskopfnummer", "hintergrund", "hoch", "holebeschriftung", "holepuffer", "imumriss", "installieresprache", "interaktionsbalken", "interaktionsknopfe", "interaktionsmenue", "inzeile", "irgendwo", "keinekopfundfusszeilen", "keinspatium", "keinzeilenobenundunten", "klonierefeld", "knopf", "komponente", "konvertierezahl", "kopfnummer", "kopierefeld", "korrigierezwischenraum", "liniendicke", "linksbuendig", "listenlaenge", "mathematik", "menueknopf", "monat", "nachunten", "nokap", "notiz", "passelayoutan", "passendfeld", "platzierebookmarks", "platziereformel", "platzierefussnoten", "platziereliste", "platzierelokalefussnoten", "platzierenebeneinander", "platziereregister", "platziereuntereinander", "platziereunterformel", "platzierezusammengestellteliste", "pos", "posten", "produkt", "programm", "projekt", "punkt", "rechteck", "rechtecke", "rechtsbuendig", "referenz", "referieren", "roemischezahlen", "ruecksetztenbeschriftung", "schreibezurliste", "schreibezwischenliste", "seite", "seitenreferenz", "seitenummer", "settext", "spalte", "spatium", "spiegeln", "sprache", "startfarbe", "starthintergrund", "startinteraktionsmenue", "startkleinerdurchschuss", "startkomponente", "startkopf", "startlinksbuendig", "startmarginallinie", "startplatziereformel", "startpos", "startprodukt", "startprojekt", "startpublikation", "startrechtsbuendig", "startsprache", "starttextlinie", "startumgebung", "startumrahmt", "startzeile", "startzentriert", "startzu", "stelleabsaetzeein", "stelleabsatznummerierungein", "stelleabschnittsblockein", "stelleanordnenein", "stelleaufzaehlungenein", "stelleausrichtungein", "stelleausschnittein", "stellebeschreibungein", "stellebeschriftungein", "stellebilderunterschriftein", "stellebildunterschriftein", "stellebindestrichein", "stelleblankoein", "stelleblockein", "stelledrehenein", "stelleduennerumrissein", "stelleeinziehenein", "stelleengerein", "stellefarbeein", "stellefarbenein", "stellefeldein", "stellefelderin", "stellefliesstextein", "stelleformelnein", "stellefussnotenein", "stellefusszeileein", "stellefusszeilentextein", "stellegefuelltesrechteckein", "stellegefuelltezeileein", "stellegegenueberplatzierenein", "stellegleitobjekteein", "stellegleitobjektein", "stellehintergruendeein", "stellehintergrundein", "stelleinteraktionein", "stelleinteraktionsbalkenein", "stelleinteraktionsbildschirmein", "stelleinteraktionsmenueein", "stellekommentarein", "stellekopfzahlein", "stellekopfzeileein", "stellekopfzeilentextein", "stellelayoutein", "stellelinienbreiteein", "stellelisteein", "stellemarginallinieein", "stellenobenein", "stellepaletteein", "stellepapierformatein", "stelleplatziegeteiltegleitobjekt", "stellepositionierenein", "stellepostenein", "stelleprogrammein", "stellepufferein", "stellerechteckein", "stellereferenzierenein", "stelleregisterein", "stelleseitenkommentarein", "stelleseitennummerein", "stelleseitennummeriernungein", "stelleseitenuebergangein", "stellesortierenein", "stellespaltenein", "stellespatiumein", "stellespracheein", "stellesymbolsetein", "stellesynonymein", "stelletabellenein", "stelletabulatorein", "stelletextein", "stelletextobenein", "stelletexttexteein", "stelletextumrissein", "stelletextuntenein", "stelletipein", "stelletippenein", "stelletoleranzein", "stelleueberschriftein", "stelleueberschriftenein", "stelleumbruchein", "stelleumrahmtein", "stelleumrahmtetexteein", "stelleuntenein", "stelleunterseitennummerein", "stelleurlein", "stelleversalienein", "stellezeilenabstandein", "stellezeilenein", "stellezeilennumerierungein", "stellezitierenein", "stellezusammengestelltelisteein", "stellezwischenraumein", "stopfarbe", "stophintergrund", "stopinteraktionsmenue", "stopkleinerdurchschuss", "stopkomponente", "stopkopf", "stoplinksbuendig", "stopmarginallinie", "stopplatziereformel", "stoppos", "stopprodukt", "stopprojekt", "stoppublikation", "stoprechtsbuendig", "stopsprache", "stoptextlinie", "stopumgebung", "stopumrahmt", "stopzeile", "stopzentriert", "stopzu", "teilegleitobjekt", "textlinie", "textreferenz", "tief", "tiho", "tip", "tippedatei", "tippen", "tippepuffer", "ueber", "uebersetzten", "umgebung", "umrahmt", "unbekant", "verbergebloecke", "vergleichefarbengruppe", "vergleichepalette", "verwendeJSscript", "verwendeURL", "verwendebloecke", "verwendeexteresdokument", "verwendeexterneabbildung", "verwendeexternestonstueck", "verwendemodul", "verwendesymbole", "verwendeurl", "volleswort", "von", "waehlebloeckeaus", "wechselezumfliesstext", "wochentag", "wortrechts", "zeigedruck", "zeigeeinstellungen", "zeigefarbe", "zeigefarbengruppe", "zeigefliesstext", "zeigefliesstextumgebung", "zeigegitter", "zeigelayout", "zeigepalette", "zeigerahmen", "zeigestruts", "zeigeumbruch", "zentriert", "ziffern", "zu", "zurbox", "zurseite" },
["en"]={},
- ["fr"]={ "Caractere", "Caracteres", "Chiffresromains", "JOURSEMAINE", "MOIS", "MOT", "MOTS", "Mot", "Mots", "Numeros", "a", "adaptedisposition", "ajustechamp", "alaligne", "alapage", "aligneadroite", "aligneagauche", "aligneaumilieu", "arriereplan", "baha", "barrecouleur", "barreinteraction", "bas", "bouton", "boutonmenu", "boutonsinteraction", "cacheblocs", "caractere", "caracteres", "champ", "changepolicecorps", "chiffresromains", "clonechamp", "colonne", "commentaire", "comparegroupecouleur", "comparepalette", "completenumeropage", "completeregistre", "composant", "concernant", "convertitnumero", "copitchamp", "corrigeespaceblanc", "couleur", "couleurgrise", "dactylographier", "dans", "datecourante", "de", "definicaractere", "definit", "definitaccent", "definitbloc", "definitblocsection", "definitbuffer", "definitcalque", "definitchamp", "definitcommande", "definitconversion", "definitcouleur", "definitdactylo", "definitdemarrestoppe", "definitdescription", "definitdisposition", "definitenumeration", "definitenvironnementpolicecorps", "definitetiquette", "definitflottant", "definitformatreference", "definitgroupecouleur", "definithbox", "definitjeucolonne", "definitliste", "definitlisteimbriquee", "definitmakeup", "definitmarquage", "definitmenuinteraction", "definitpalette", "definitparagraphes", "definitpilechamp", "definitpolice", "definitpolicecorps", "definitprofil", "definitprogramme", "definitreference", "definitregistre", "definitrevetement", "definitsautdecolonne", "definitsautdepage", "definitsection", "definitsouschamp", "definitstyle", "definitstylepolice", "definitsymbole", "definitsymbolefigure", "definitsynonymepolice", "definitsynonymes", "definittabulation", "definittaillepapier", "definittete", "definittexte", "definittrametableau", "definittri", "definittype", "definitvide", "demarreJScode", "demarreJSpreamble", "demarreLUA", "demarreMP", "demarreMPclip", "demarreMPcode", "demarreMPdefinitions", "demarreMPdrawing", "demarreMPenvironment", "demarreMPextensions", "demarreMPinclusions", "demarreMPinitializations", "demarreMPpage", "demarreMPpositiongraphic", "demarreMPpositionmethod", "demarreMPrun", "demarrePARSEDXML", "demarreTABLE", "demarreTABLEbody", "demarreTABLEfoot", "demarreTABLEhead", "demarreTABLEnext", "demarreTC", "demarreTD", "demarreTDs", "demarreTEX", "demarreTEXpage", "demarreTH", "demarreTN", "demarreTR", "demarreTRs", "demarreTX", "demarreTY", "demarreXML", "demarrealign", "demarrealigneadroite", "demarrealigneagauche", "demarrealigneaumilieu", "demarrealignment", "demarreallmodes", "demarreappendices", "demarrearrangedpages", "demarrearriereplan", "demarreaside", "demarreattachment", "demarrebackmatter", "demarrebar", "demarrebbordermatrix", "demarrebitmapimage", "demarreblockquote", "demarrebodymatter", "demarrebordermatrix", "demarreboxedcolumns", "demarrebtxlabeltext", "demarrebtxrenderingdefinitions", "demarrebuffer", "demarrecases", "demarrecatcodetable", "demarrecenteraligned", "demarrechapter", "demarrecharacteralign", "demarrecheckedfences", "demarrechemical", "demarrechemicaltext", "demarreciter", "demarrecollect", "demarrecollecting", "demarrecolorintent", "demarrecoloronly", "demarrecolorset", "demarrecolumns", "demarrecolumnset", "demarrecolumnsetspan", "demarrecolumnspan", "demarrecombination", "demarrecomment", "demarrecomposant", "demarrecontextcode", "demarrecontextdefinitioncode", "demarrecouleur", "demarrectxfunction", "demarrectxfunctiondefinition", "demarrecurrentcolor", "demarrecurrentlistentrywrapper", "demarredelimited", "demarredelimitedtext", "demarredisplaymath", "demarredmath", "demarredocument", "demarreeffect", "demarreelement", "demarreembeddedxtable", "demarreendnote", "demarreendofline", "demarreenvironement", "demarreexceptions", "demarreexpanded", "demarreexpandedcollect", "demarreextendedcatcodetable", "demarreexternalfigurecollection", "demarrefacingfloat", "demarrefact", "demarrefigure", "demarrefiguretext", "demarrefittingpage", "demarrefixed", "demarrefloatcombination", "demarrefont", "demarrefontclass", "demarrefontsolution", "demarrefootnote", "demarreformula", "demarreformulas", "demarreframed", "demarreframedcell", "demarreframedcontent", "demarreframedrow", "demarreframedtable", "demarreframedtext", "demarrefrontmatter", "demarregraphictext", "demarregridsnapping", "demarregroupe", "demarrehanging", "demarrehbox", "demarrehboxestohbox", "demarrehboxregister", "demarreheadtext", "demarrehelptext", "demarrehiding", "demarrehighlight", "demarrehyphenation", "demarreimath", "demarreindentation", "demarreindentedtext", "demarreinteraction", "demarreinterface", "demarreintermezzotext", "demarreintertext", "demarreitemgroup", "demarreitemgroupcolumns", "demarreitemize", "demarreknockout", "demarrelabeltext", "demarrelangue", "demarrelayout", "demarrelegend", "demarreligne", "demarreligneregleetexte", "demarrelinealignment", "demarrelinecorrection", "demarrelinefiller", "demarrelinenumbering", "demarrelines", "demarrelinetable", "demarrelinetablebody", "demarrelinetablecell", "demarrelinetablehead", "demarrelocalfootnotes", "demarrelocalheadsetup", "demarrelocallinecorrection", "demarrelocalnotes", "demarrelocalsetups", "demarrelua", "demarreluacode", "demarreluaparameterset", "demarreluasetups", "demarremakeup", "demarremargereglee", "demarremarginblock", "demarremarkedcontent", "demarremarkpages", "demarremathalignment", "demarremathcases", "demarremathlabeltext", "demarremathmatrix", "demarremathmode", "demarremathstyle", "demarrematrices", "demarrematrix", "demarremaxaligned", "demarremdformula", "demarremenuinteraction", "demarremiddlealigned", "demarremiddlemakeup", "demarremixedcolumns", "demarremode", "demarremodeset", "demarremodule", "demarremoduletestsection", "demarrempformula", "demarrenamedsection", "demarrenamedsubformulas", "demarrenarrow", "demarrenarrower", "demarrenegative", "demarrenicelyfilledbox", "demarrenointerference", "demarrenotallmodes", "demarrenotext", "demarrenotmode", "demarreoperatortext", "demarreopposite", "demarreoutputstream", "demarreoverlay", "demarreoverprint", "demarrepagecolumns", "demarrepagecomment", "demarrepagefigure", "demarrepagelayout", "demarrepagemakeup", "demarrepar", "demarreparagraph", "demarreparagraphs", "demarreparagraphscell", "demarreparbuilder", "demarrepart", "demarrepath", "demarreplacechemical", "demarreplacefigure", "demarreplaceflottant", "demarreplaceformule", "demarreplacegraphic", "demarreplaceintermezzo", "demarreplacelegend", "demarreplacepairedbox", "demarreplacetable", "demarrepositioning", "demarrepositionoverlay", "demarrepositive", "demarrepostponing", "demarrepostponingnotes", "demarreprefixtext", "demarreprocessassignmentcommand", "demarreprocessassignmentlist", "demarreprocesscommacommand", "demarreprocesscommalist", "demarreproduit", "demarreprojet", "demarreprotect", "demarreprotectedcolors", "demarrepublication", "demarrepunctuation", "demarrequotation", "demarrequote", "demarrerandomized", "demarrerandomseed", "demarrerawsetups", "demarrereadingfile", "demarrereferenceprefix", "demarreregime", "demarrereusableMPgraphic", "demarreruby", "demarrescript", "demarresdformula", "demarresection", "demarresectionblock", "demarresectionblockenvironment", "demarresectionlevel", "demarresetups", "demarreshapebox", "demarreshift", "demarresidebar", "demarresimplecolumns", "demarrespecialitem", "demarrespeech", "demarrespformula", "demarresplitformula", "demarresplittext", "demarrespread", "demarrestandardmakeup", "demarrestaticMPfigure", "demarrestaticMPgraphic", "demarrestrictinspectnextcharacter", "demarrestrut", "demarrestyle", "demarresubformulas", "demarresubject", "demarresubjectlevel", "demarresubsection", "demarresubsentence", "demarresubstack", "demarresubsubject", "demarresubsubsection", "demarresubsubsubject", "demarresubsubsubsection", "demarresubsubsubsubject", "demarresubsubsubsubsection", "demarresubsubsubsubsubject", "demarresuffixtext", "demarresymbolset", "demarretable", "demarretablehead", "demarretables", "demarretabletail", "demarretabletext", "demarretabulate", "demarretabulatehead", "demarretabulatetail", "demarretagged", "demarretaglabeltext", "demarretete", "demarretexcode", "demarretexdefinition", "demarretext", "demarretextbackground", "demarretextbackgroundmanual", "demarretextcolor", "demarretextcolorintent", "demarretextflow", "demarretextmakeup", "demarretitle", "demarretokenlist", "demarretokens", "demarretransparent", "demarretypescript", "demarretypescriptcollection", "demarretyping", "demarreuniqueMPgraphic", "demarreuniqueMPpagegraphic", "demarreunittext", "demarreunpacked", "demarreusableMPgraphic", "demarreuseMPgraphic", "demarreusemathstyleparameter", "demarreuserdata", "demarreusingbtxspecification", "demarreva", "demarrevbox", "demarrevboxregister", "demarrevboxtohbox", "demarrevboxtohboxseparator", "demarreviewerlayer", "demarrevtop", "demarrevtopregister", "demarrexcell", "demarrexcellgroup", "demarrexcolumn", "demarrexgroup", "demarrexmldisplayverbatim", "demarrexmlinlineverbatim", "demarrexmlraw", "demarrexmlsetups", "demarrexrow", "demarrexrowgroup", "demarrextable", "demarrextablebody", "demarrextablefoot", "demarrextablehead", "demarrextablenext", "determinecaracteristiqueliste", "determinecaracteristiquesregistre", "determinenumerotete", "echelle", "ecran", "ecritdansliste", "ecritentreliste", "element", "elements", "environement", "espace", "espacefixe", "espacesfixes", "etire", "faitreference", "fichierdactylo", "figureexterne", "gardeblocs", "grille", "haut", "inconnu", "installelangue", "joursemaine", "langue", "langueprincipale", "largeurligne", "ligneh", "lignenoire", "ligneregleetexte", "lignesnoires", "llongueurliste", "marquage", "marquepage", "mathematique", "menuinteraction", "mois", "montrecadre", "montrecouleur", "montredisposition", "montreedition", "montreenvironnementpolicecorps", "montregrille", "montregroupecouleur", "montrejeusymboles", "montremakeup", "montrepalette", "montrepolicecorps", "montrereglages", "montrestruts", "motdroit", "numeroformule", "numeropage", "numeros", "numerotete", "numerotetecourant", "obtientmarquage", "oriente", "periodes", "pilechamp", "placecoteacote", "placeflottant", "placeformule", "placelesunsaudessusdesautres", "placeliste", "placelisteinmbriquee", "placemarquespages", "placenotespdp", "placenotespdplocales", "placenumeropage", "placenumerotete", "placeregistre", "placesousformule", "placesurgrille", "placetextetete", "prendbuffer", "produit", "programme", "projet", "qqpart", "razmarquage", "referencepage", "referencetexte", "reflete", "reglealignement", "reglearrangement", "reglearriereplan", "reglearriereplans", "reglebarreinteraction", "reglebloc", "regleblocsection", "reglebuffer", "reglecapitales", "reglechamp", "reglechamps", "regleclipping", "reglecolonnes", "reglecommentaire", "reglecommentairepage", "reglecompoetroite", "reglecomposeenalinea", "reglecouleur", "reglecouleurs", "regledactylo", "regledemarrestoppe", "regledisposition", "regleecraninteraction", "regleelements", "regleencadre", "regleentete", "regleenumerations", "regleepaisseurligne", "regleespaceblanc", "regleespacement", "regleespacementinterligne", "regleflottant", "regleflottants", "regleformulaires", "regleformules", "reglegroupeselements", "regleinf", "regleinteraction", "regleintitule", "regleintitules", "reglejeucolonne", "reglejeusymboles", "reglelangue", "reglelignes", "reglelignesnoires", "reglelignesreglestexte", "regleliste", "reglelisteimbriquee", "reglemakeup", "reglemargereglee", "reglemarquage", "reglemarquagehyphenation", "reglemenuinteraction", "reglenumeropage", "reglenumerotationligne", "reglenumerotationpage", "reglenumerotationparagraphe", "reglenumerotete", "regleoriente", "reglepalette", "reglepapier", "regleparagraphes", "reglepdp", "regleplacementopposition", "reglepolicecorps", "reglepositionnement", "regleprogrammes", "reglereferencage", "regleregistre", "regleremplitligne", "regleremplitlignesreglees", "regleseparationflottant", "reglesousnumeropage", "reglesup", "reglesynonymes", "regletableaux", "regletabulation", "regletaillepapier", "regletete", "regletetes", "regletexte", "regletextesentete", "regletextesinf", "regletextespdp", "regletextessup", "regletextestexte", "regletolerance", "regletraitsfins", "regletransitionspage", "regletri", "regletype", "regleurl", "remplitligne", "remplitlignesreglees", "remplittexte", "sansespace", "sanslignesenteteetpdp", "sanslignessupetinf", "selectionneblocs", "separeflottant", "settext", "sousnumeropage", "stoppeJScode", "stoppeJSpreamble", "stoppeLUA", "stoppeMP", "stoppeMPclip", "stoppeMPcode", "stoppeMPdefinitions", "stoppeMPdrawing", "stoppeMPenvironment", "stoppeMPextensions", "stoppeMPinclusions", "stoppeMPinitializations", "stoppeMPpage", "stoppeMPpositiongraphic", "stoppeMPpositionmethod", "stoppeMPrun", "stoppePARSEDXML", "stoppeTABLE", "stoppeTABLEbody", "stoppeTABLEfoot", "stoppeTABLEhead", "stoppeTABLEnext", "stoppeTC", "stoppeTD", "stoppeTDs", "stoppeTEX", "stoppeTEXpage", "stoppeTH", "stoppeTN", "stoppeTR", "stoppeTRs", "stoppeTX", "stoppeTY", "stoppeXML", "stoppealign", "stoppealigneadroite", "stoppealigneagauche", "stoppealigneaumilieu", "stoppealignment", "stoppeallmodes", "stoppeappendices", "stoppearrangedpages", "stoppearriereplan", "stoppeaside", "stoppeattachment", "stoppebackmatter", "stoppebar", "stoppebbordermatrix", "stoppebitmapimage", "stoppeblockquote", "stoppebodymatter", "stoppebordermatrix", "stoppeboxedcolumns", "stoppebtxlabeltext", "stoppebtxrenderingdefinitions", "stoppebuffer", "stoppecases", "stoppecatcodetable", "stoppecenteraligned", "stoppechapter", "stoppecharacteralign", "stoppecheckedfences", "stoppechemical", "stoppechemicaltext", "stoppecollect", "stoppecollecting", "stoppecolorintent", "stoppecoloronly", "stoppecolorset", "stoppecolumns", "stoppecolumnset", "stoppecolumnsetspan", "stoppecolumnspan", "stoppecombination", "stoppecomment", "stoppecomposant", "stoppecontextcode", "stoppecontextdefinitioncode", "stoppecouleur", "stoppectxfunction", "stoppectxfunctiondefinition", "stoppecurrentcolor", "stoppecurrentlistentrywrapper", "stoppedelimited", "stoppedelimitedtext", "stoppedisplaymath", "stoppedmath", "stoppedocument", "stoppeeffect", "stoppeelement", "stoppeembeddedxtable", "stoppeendnote", "stoppeendofline", "stoppeenvironement", "stoppeexceptions", "stoppeexpanded", "stoppeexpandedcollect", "stoppeextendedcatcodetable", "stoppeexternalfigurecollection", "stoppefacingfloat", "stoppefact", "stoppefigure", "stoppefiguretext", "stoppefittingpage", "stoppefixed", "stoppefloatcombination", "stoppefont", "stoppefontclass", "stoppefontsolution", "stoppefootnote", "stoppeformula", "stoppeformulas", "stoppeframed", "stoppeframedcell", "stoppeframedcontent", "stoppeframedrow", "stoppeframedtable", "stoppeframedtext", "stoppefrontmatter", "stoppegraphictext", "stoppegridsnapping", "stoppegroupe", "stoppehanging", "stoppehbox", "stoppehboxestohbox", "stoppehboxregister", "stoppeheadtext", "stoppehelptext", "stoppehiding", "stoppehighlight", "stoppehyphenation", "stoppeimath", "stoppeindentation", "stoppeindentedtext", "stoppeinteraction", "stoppeinterface", "stoppeintermezzotext", "stoppeintertext", "stoppeitemgroup", "stoppeitemgroupcolumns", "stoppeitemize", "stoppeknockout", "stoppelabeltext", "stoppelangue", "stoppelayout", "stoppelegend", "stoppeligne", "stoppeligneregleetexte", "stoppelinealignment", "stoppelinecorrection", "stoppelinefiller", "stoppelinenumbering", "stoppelines", "stoppelinetable", "stoppelinetablebody", "stoppelinetablecell", "stoppelinetablehead", "stoppelocalfootnotes", "stoppelocalheadsetup", "stoppelocallinecorrection", "stoppelocalnotes", "stoppelocalsetups", "stoppelua", "stoppeluacode", "stoppeluaparameterset", "stoppeluasetups", "stoppemakeup", "stoppemargereglee", "stoppemarginblock", "stoppemarkedcontent", "stoppemarkpages", "stoppemathalignment", "stoppemathcases", "stoppemathlabeltext", "stoppemathmatrix", "stoppemathmode", "stoppemathstyle", "stoppematrices", "stoppematrix", "stoppemaxaligned", "stoppemdformula", "stoppemenuinteraction", "stoppemiddlealigned", "stoppemiddlemakeup", "stoppemixedcolumns", "stoppemode", "stoppemodeset", "stoppemodule", "stoppemoduletestsection", "stoppempformula", "stoppenamedsection", "stoppenamedsubformulas", "stoppenarrow", "stoppenarrower", "stoppenegative", "stoppenicelyfilledbox", "stoppenointerference", "stoppenotallmodes", "stoppenotext", "stoppenotmode", "stoppeoperatortext", "stoppeopposite", "stoppeoutputstream", "stoppeoverlay", "stoppeoverprint", "stoppepagecolumns", "stoppepagecomment", "stoppepagefigure", "stoppepagelayout", "stoppepagemakeup", "stoppepar", "stoppeparagraph", "stoppeparagraphs", "stoppeparagraphscell", "stoppeparbuilder", "stoppepart", "stoppepath", "stoppeplacechemical", "stoppeplacefigure", "stoppeplaceflottant", "stoppeplaceformule", "stoppeplacegraphic", "stoppeplaceintermezzo", "stoppeplacelegend", "stoppeplacepairedbox", "stoppeplacetable", "stoppepositioning", "stoppepositionoverlay", "stoppepositive", "stoppepostponing", "stoppepostponingnotes", "stoppeprefixtext", "stoppeprocessassignmentcommand", "stoppeprocessassignmentlist", "stoppeprocesscommacommand", "stoppeprocesscommalist", "stoppeproduit", "stoppeprojet", "stoppeprotect", "stoppeprotectedcolors", "stoppepublication", "stoppepunctuation", "stoppequotation", "stoppequote", "stopperandomized", "stopperandomseed", "stopperawsetups", "stoppereadingfile", "stoppereferenceprefix", "stopperegime", "stoppereusableMPgraphic", "stopperuby", "stoppescript", "stoppesdformula", "stoppesection", "stoppesectionblock", "stoppesectionblockenvironment", "stoppesectionlevel", "stoppesetups", "stoppeshapebox", "stoppeshift", "stoppesidebar", "stoppesimplecolumns", "stoppespecialitem", "stoppespeech", "stoppespformula", "stoppesplitformula", "stoppesplittext", "stoppespread", "stoppestandardmakeup", "stoppestaticMPfigure", "stoppestaticMPgraphic", "stoppestrictinspectnextcharacter", "stoppestrut", "stoppestyle", "stoppesubformulas", "stoppesubject", "stoppesubjectlevel", "stoppesubsection", "stoppesubsentence", "stoppesubstack", "stoppesubsubject", "stoppesubsubsection", "stoppesubsubsubject", "stoppesubsubsubsection", "stoppesubsubsubsubject", "stoppesubsubsubsubsection", "stoppesubsubsubsubsubject", "stoppesuffixtext", "stoppesymbolset", "stoppetable", "stoppetablehead", "stoppetables", "stoppetabletail", "stoppetabletext", "stoppetabulate", "stoppetabulatehead", "stoppetabulatetail", "stoppetagged", "stoppetaglabeltext", "stoppetete", "stoppetexcode", "stoppetexdefinition", "stoppetext", "stoppetextbackground", "stoppetextbackgroundmanual", "stoppetextcolor", "stoppetextcolorintent", "stoppetextflow", "stoppetextmakeup", "stoppetitle", "stoppetokenlist", "stoppetokens", "stoppetransparent", "stoppetypescript", "stoppetypescriptcollection", "stoppetyping", "stoppeuniqueMPgraphic", "stoppeuniqueMPpagegraphic", "stoppeunittext", "stoppeunpacked", "stoppeusableMPgraphic", "stoppeuseMPgraphic", "stoppeusemathstyleparameter", "stoppeuserdata", "stoppeusingbtxspecification", "stoppeva", "stoppevbox", "stoppevboxregister", "stoppevboxtohbox", "stoppevboxtohboxseparator", "stoppeviewerlayer", "stoppevtop", "stoppevtopregister", "stoppexcell", "stoppexcellgroup", "stoppexcolumn", "stoppexgroup", "stoppexmldisplayverbatim", "stoppexmlinlineverbatim", "stoppexmlraw", "stoppexmlsetups", "stoppexrow", "stoppexrowgroup", "stoppextable", "stoppextablebody", "stoppextablefoot", "stoppextablehead", "stoppextablenext", "symbole", "tapebuffer", "textenotepdp", "traduire", "traiteblocs", "traitfin", "traitsfins", "uneligne", "utiliseJSscripts", "utiliseURL", "utiliseblocs", "utilisechemin", "utilisedocumentexterne", "utilisefigureexterne", "utilisemodule", "utilisepsiteaudioexterne", "utilisesymboles", "utiliseurl", "va", "vaalaboite", "vaalapage", "vaenbas", "valeurcouleur", "vide" },
- ["it"]={ "GIORNOSETTIMANA", "Lettera", "Lettere", "MESE", "Numeri", "Numeriromani", "PAROLA", "PAROLE", "Parola", "Parole", "adattacampo", "adattalayout", "al", "allineacentro", "allineadestra", "allineasinistra", "ambiente", "ap", "apagina", "barracolori", "barrainterazione", "cambiaafontdeltesto", "campi", "capello", "chim", "circondato", "clonacampo", "colonna", "colore", "coloregrigio", "commento", "componenet", "confrontagruppocolori", "confrontatavolozza", "convertinumero", "copiacampo", "correggispaziobianco", "da", "daqualcheparte", "data", "datadioggi", "definisci", "definisciaccento", "definisciambientefontdeltesto", "definisciblocco", "definiscibloccosezione", "definiscibuffer", "definiscicampo", "definiscicapoversi", "definiscicarattere", "definiscicolore", "definiscicomando", "definisciconversione", "definiscidescrizione", "definiscidimensionicarta", "definiscielenco", "definiscielencocombinato", "definiscienumerazione", "definiscietichetta", "definiscifigurasimbolo", "definiscifont", "definiscifontdeltesto", "definisciformatoriferimento", "definiscigruppocolonne", "definiscigruppocolori", "definiscihbox", "definisciincorniciato", "definisciiniziatermina", "definiscilayout", "definiscimakeup", "definiscimarcatura", "definiscimenuinterazione", "definiscimodellotabella", "definiscioggettomobile", "definisciordinamento", "definisciprofilo", "definisciprogramma", "definisciregistro", "definisciriferimento", "definiscisezione", "definiscisimbolo", "definiscisinonimi", "definiscisinonimofont", "definiscisottocampo", "definiscisovrapposizione", "definiscistackcampi", "definiscistile", "definiscistilefont", "definiscitabulato", "definiscitavolozza", "definiscitesta", "definiscitesto", "definiscitestoincorniciato", "definiscitype", "definiscityping", "determinacaratteristicheregistro", "determinacarattersticheelenco", "determinanumerotesta", "elaborablocchi", "elementi", "elemento", "figuraesterna", "giornosettimana", "griglia", "ignoto", "impostaallineamento", "impostaampiezzariga", "impostabarrainterazione", "impostablocco", "impostabloccosezione", "impostabuffer", "impostacampi", "impostacampo", "impostacapoversi", "impostacaption", "impostacaptions", "impostacima", "impostaclippling", "impostacolonne", "impostacolore", "impostacolori", "impostacommento", "impostacommentopagina", "impostadimensionicarta", "impostaelementi", "impostaelencazioni", "impostaelenco", "impostaelencocombinato", "impostaenumerazioni", "impostafondo", "impostafontdeltesto", "impostaforms", "impostaformule", "impostagruppocolonne", "impostaincorniciato", "impostainiziatermina", "impostainstestazione", "impostainterazione", "impostainterlinea", "impostalayout", "impostalineemargine", "impostalineenere", "impostalineeriempimento", "impostalineesottili", "impostalineetesto", "impostalingua", "impostamaiuscole", "impostamakeup", "impostamarcatura", "impostamenuinterazione", "impostamenzione", "impostanumerazionecapoversi", "impostanumerazionepagina", "impostanumerazionerighe", "impostanumeropagina", "impostanumerosottopagina", "impostanumerotesta", "impostaoggettimobili", "impostaoggettomobile", "impostaordinamento", "impostaparranging", "impostapdp", "impostapiustretto", "impostaposizionamento", "impostaposizionamentoopposti", "impostaprogrammi", "impostaregistro", "impostarientro", "impostariferimento", "impostarighe", "impostarigheriempimento", "impostarigovuoto", "impostarotazione", "impostaschermointerazione", "impostasegnosillabazione", "impostasetsimboli", "impostasfondi", "impostasfondo", "impostasinonimi", "impostaspaziatura", "impostaspaziobianco", "impostaspezzamentooggettomobile", "impostatabelle", "impostatabulato", "impostatavolozza", "impostatesta", "impostateste", "impostatesticima", "impostatestifondo", "impostatestiincorniciati", "impostatestiintestazioni", "impostatestipdp", "impostatesto", "impostatestotesti", "impostatolleranza", "impostatransizionepagina", "impostatype", "impostatyping", "impostaurl", "incorniciato", "iniziaJScode", "iniziaJSpreamble", "iniziaLUA", "iniziaMP", "iniziaMPclip", "iniziaMPcode", "iniziaMPdefinitions", "iniziaMPdrawing", "iniziaMPenvironment", "iniziaMPextensions", "iniziaMPinclusions", "iniziaMPinitializations", "iniziaMPpage", "iniziaMPpositiongraphic", "iniziaMPpositionmethod", "iniziaMPrun", "iniziaPARSEDXML", "iniziaTABLE", "iniziaTABLEbody", "iniziaTABLEfoot", "iniziaTABLEhead", "iniziaTABLEnext", "iniziaTC", "iniziaTD", "iniziaTDs", "iniziaTEX", "iniziaTEXpage", "iniziaTH", "iniziaTN", "iniziaTR", "iniziaTRs", "iniziaTX", "iniziaTY", "iniziaXML", "iniziaalign", "iniziaalignment", "iniziaallineacentro", "iniziaallineadestra", "iniziaallineasinistra", "iniziaallmodes", "iniziaambiente", "iniziaappendices", "iniziaarrangedpages", "iniziaaside", "iniziaattachment", "iniziabackmatter", "iniziabar", "iniziabbordermatrix", "iniziabitmapimage", "iniziablockquote", "iniziabodymatter", "iniziabordermatrix", "iniziaboxedcolumns", "iniziabtxlabeltext", "iniziabtxrenderingdefinitions", "iniziabuffer", "iniziacases", "iniziacatcodetable", "iniziacenteraligned", "iniziachapter", "iniziacharacteralign", "iniziacheckedfences", "iniziachemical", "iniziachemicaltext", "iniziacollect", "iniziacollecting", "iniziacolore", "iniziacolorintent", "iniziacoloronly", "iniziacolorset", "iniziacolumns", "iniziacolumnset", "iniziacolumnsetspan", "iniziacolumnspan", "iniziacombination", "iniziacomment", "iniziacomponenet", "iniziacontextcode", "iniziacontextdefinitioncode", "iniziactxfunction", "iniziactxfunctiondefinition", "iniziacurrentcolor", "iniziacurrentlistentrywrapper", "iniziadelimited", "iniziadelimitedtext", "iniziadisplaymath", "iniziadmath", "iniziadocument", "iniziaeffect", "iniziaelement", "iniziaelemento", "iniziaembeddedxtable", "iniziaendnote", "iniziaendofline", "iniziaexceptions", "iniziaexpanded", "iniziaexpandedcollect", "iniziaextendedcatcodetable", "iniziaexternalfigurecollection", "iniziafacingfloat", "iniziafact", "iniziafigure", "iniziafiguretext", "iniziafittingpage", "iniziafixed", "iniziafloatcombination", "iniziafont", "iniziafontclass", "iniziafontsolution", "iniziafootnote", "iniziaformula", "iniziaformulas", "iniziaframedcell", "iniziaframedcontent", "iniziaframedrow", "iniziaframedtable", "iniziaframedtext", "iniziafrontmatter", "iniziagraphictext", "iniziagridsnapping", "iniziahanging", "iniziahbox", "iniziahboxestohbox", "iniziahboxregister", "iniziaheadtext", "iniziahelptext", "iniziahiding", "iniziahighlight", "iniziahyphenation", "iniziaimath", "iniziaimpaccato", "iniziaincorniciato", "iniziaindentation", "iniziaindentedtext", "iniziainteraction", "iniziainterface", "iniziaintermezzotext", "iniziaintertext", "iniziaitemgroup", "iniziaitemgroupcolumns", "iniziaitemize", "iniziaknockout", "inizialabeltext", "inizialayout", "inizialegend", "inizialinealignment", "inizialineamargine", "inizialineatesto", "inizialinecorrection", "inizialinefiller", "inizialinenumbering", "inizialines", "inizialinetable", "inizialinetablebody", "inizialinetablecell", "inizialinetablehead", "inizialingua", "inizialocalfootnotes", "inizialocalheadsetup", "inizialocallinecorrection", "inizialocalnotes", "inizialocalsetups", "inizialua", "inizialuacode", "inizialuaparameterset", "inizialuasetups", "iniziamakeup", "iniziamarginblock", "iniziamarkedcontent", "iniziamarkpages", "iniziamathalignment", "iniziamathcases", "iniziamathlabeltext", "iniziamathmatrix", "iniziamathmode", "iniziamathstyle", "iniziamatrices", "iniziamatrix", "iniziamaxaligned", "iniziamdformula", "iniziamenuinterattivo", "iniziamettiformula", "iniziamiddlealigned", "iniziamiddlemakeup", "iniziamixedcolumns", "iniziamode", "iniziamodeset", "iniziamodule", "iniziamoduletestsection", "iniziampformula", "inizianamedsection", "inizianamedsubformulas", "inizianarrow", "inizianarrower", "inizianegative", "inizianicelyfilledbox", "inizianointerference", "inizianotallmodes", "inizianotext", "inizianotmode", "iniziaoperatortext", "iniziaopposite", "iniziaoutputstream", "iniziaoverlay", "iniziaoverprint", "iniziapagecolumns", "iniziapagecomment", "iniziapagefigure", "iniziapagelayout", "iniziapagemakeup", "iniziapar", "iniziaparagraph", "iniziaparagraphs", "iniziaparagraphscell", "iniziaparbuilder", "iniziapart", "iniziapath", "iniziaplacechemical", "iniziaplacefigure", "iniziaplacefloat", "iniziaplacegraphic", "iniziaplaceintermezzo", "iniziaplacelegend", "iniziaplacepairedbox", "iniziaplacetable", "iniziapositioning", "iniziapositionoverlay", "iniziapositive", "iniziapostponing", "iniziapostponingnotes", "iniziaprefixtext", "iniziaprocessassignmentcommand", "iniziaprocessassignmentlist", "iniziaprocesscommacommand", "iniziaprocesscommalist", "iniziaprodotto", "iniziaprogetto", "iniziaprotect", "iniziaprotectedcolors", "iniziapubblicazione", "iniziapunctuation", "iniziaquotation", "iniziaquote", "iniziarandomized", "iniziarandomseed", "iniziarawsetups", "iniziareadingfile", "iniziareferenceprefix", "iniziaregime", "iniziareusableMPgraphic", "iniziariga", "iniziaruby", "iniziascript", "iniziasdformula", "iniziasection", "iniziasectionblock", "iniziasectionblockenvironment", "iniziasectionlevel", "iniziasetups", "iniziasfondo", "iniziashapebox", "iniziashift", "iniziasidebar", "iniziasimplecolumns", "iniziaspecialitem", "iniziaspeech", "iniziaspformula", "iniziasplitformula", "iniziasplittext", "iniziaspread", "iniziastandardmakeup", "iniziastaticMPfigure", "iniziastaticMPgraphic", "iniziastrictinspectnextcharacter", "iniziastrut", "iniziastyle", "iniziasubformulas", "iniziasubject", "iniziasubjectlevel", "iniziasubsection", "iniziasubsentence", "iniziasubstack", "iniziasubsubject", "iniziasubsubsection", "iniziasubsubsubject", "iniziasubsubsubsection", "iniziasubsubsubsubject", "iniziasubsubsubsubsection", "iniziasubsubsubsubsubject", "iniziasuffixtext", "iniziasymbolset", "iniziatable", "iniziatablehead", "iniziatables", "iniziatabletail", "iniziatabletext", "iniziatabulate", "iniziatabulatehead", "iniziatabulatetail", "iniziatagged", "iniziataglabeltext", "iniziatesta", "iniziatexcode", "iniziatexdefinition", "iniziatext", "iniziatextbackground", "iniziatextbackgroundmanual", "iniziatextcolor", "iniziatextcolorintent", "iniziatextflow", "iniziatextmakeup", "iniziatitle", "iniziatokenlist", "iniziatokens", "iniziatransparent", "iniziatypescript", "iniziatypescriptcollection", "iniziatyping", "iniziauniqueMPgraphic", "iniziauniqueMPpagegraphic", "iniziaunittext", "iniziaunpacked", "iniziausableMPgraphic", "iniziauseMPgraphic", "iniziausemathstyleparameter", "iniziauserdata", "iniziausingbtxspecification", "iniziavaia", "iniziavbox", "iniziavboxregister", "iniziavboxtohbox", "iniziavboxtohboxseparator", "iniziaviewerlayer", "iniziavtop", "iniziavtopregister", "iniziaxcell", "iniziaxcellgroup", "iniziaxcolumn", "iniziaxgroup", "iniziaxmldisplayverbatim", "iniziaxmlinlineverbatim", "iniziaxmlraw", "iniziaxmlsetups", "iniziaxrow", "iniziaxrowgroup", "iniziaxtable", "iniziaxtablebody", "iniziaxtablefoot", "iniziaxtablehead", "iniziaxtablenext", "inriga", "installalingua", "intorno", "lettera", "lettere", "lineanera", "lineasottile", "lineatesto", "lineenere", "lineeriempimento", "lineesottili", "lingua", "linguaprincipale", "lunghezzaelenco", "marcatura", "matematica", "menuinterattivo", "mese", "mettielenco", "mettielencocombinato", "mettifiancoafianco", "mettiformula", "mettiingriglia", "mettinotepdp", "mettinotepdplocali", "mettinumeropagina", "mettiregistro", "mettisegnalibro", "mettisottoformula", "mettiunosullaltro", "mostraambientefontdeltesto", "mostracolore", "mostracornice", "mostrafontdeltesto", "mostragriglia", "mostragruppocolori", "mostraimpostazioni", "mostralyout", "mostramakeup", "mostrasetsimboli", "mostrastampa", "mostrastruts", "mostratavolozza", "nascondiblocchi", "nientelineecimafondo", "nientelineintestazionepdp", "nientespazio", "nota", "numeri", "numeriromani", "numeroformula", "numeropagina", "numeropaginacompleto", "numerotesta", "numerotestacorrente", "pagina", "paroladestra", "ped", "pedap", "perlungo", "posizionanumerotesta", "posizionatestotesta", "posizione", "prendibuffer", "prendimarcatura", "prodotto", "progetto", "programma", "pulsante", "pulsantemenu", "pulsantinterazione", "punti", "qualcheriga", "reimpostamarcatura", "rif", "riferimento", "riferimentopagina", "riferimentotesto", "riflessione", "rigariempimento", "rigovuoto", "ruota", "scala", "schermo", "scrividentroelenco", "scriviinelenco", "segnalibro", "selezionablocchi", "settext", "sfondo", "simbolo", "spazifissi", "spazio", "spaziofisso", "spessoreriga", "spezzaoggettomobile", "stackcampi", "stirato", "terminaJScode", "terminaJSpreamble", "terminaLUA", "terminaMP", "terminaMPclip", "terminaMPcode", "terminaMPdefinitions", "terminaMPdrawing", "terminaMPenvironment", "terminaMPextensions", "terminaMPinclusions", "terminaMPinitializations", "terminaMPpage", "terminaMPpositiongraphic", "terminaMPpositionmethod", "terminaMPrun", "terminaPARSEDXML", "terminaTABLE", "terminaTABLEbody", "terminaTABLEfoot", "terminaTABLEhead", "terminaTABLEnext", "terminaTC", "terminaTD", "terminaTDs", "terminaTEX", "terminaTEXpage", "terminaTH", "terminaTN", "terminaTR", "terminaTRs", "terminaTX", "terminaTY", "terminaXML", "terminaalign", "terminaalignment", "terminaallineacentro", "terminaallineadestra", "terminaallineasinistra", "terminaallmodes", "terminaambiente", "terminaappendices", "terminaarrangedpages", "terminaaside", "terminaattachment", "terminabackmatter", "terminabar", "terminabbordermatrix", "terminabitmapimage", "terminablockquote", "terminabodymatter", "terminabordermatrix", "terminaboxedcolumns", "terminabtxlabeltext", "terminabtxrenderingdefinitions", "terminabuffer", "terminacases", "terminacatcodetable", "terminacenteraligned", "terminachapter", "terminacharacteralign", "terminacheckedfences", "terminachemical", "terminachemicaltext", "terminacollect", "terminacollecting", "terminacolore", "terminacolorintent", "terminacoloronly", "terminacolorset", "terminacolumns", "terminacolumnset", "terminacolumnsetspan", "terminacolumnspan", "terminacombination", "terminacomment", "terminacomponenet", "terminacontextcode", "terminacontextdefinitioncode", "terminactxfunction", "terminactxfunctiondefinition", "terminacurrentcolor", "terminacurrentlistentrywrapper", "terminadelimited", "terminadelimitedtext", "terminadisplaymath", "terminadmath", "terminadocument", "terminaeffect", "terminaelement", "terminaelemento", "terminaembeddedxtable", "terminaendnote", "terminaendofline", "terminaexceptions", "terminaexpanded", "terminaexpandedcollect", "terminaextendedcatcodetable", "terminaexternalfigurecollection", "terminafacingfloat", "terminafact", "terminafigure", "terminafiguretext", "terminafittingpage", "terminafixed", "terminafloatcombination", "terminafont", "terminafontclass", "terminafontsolution", "terminafootnote", "terminaformula", "terminaformulas", "terminaframedcell", "terminaframedcontent", "terminaframedrow", "terminaframedtable", "terminaframedtext", "terminafrontmatter", "terminagraphictext", "terminagridsnapping", "terminahanging", "terminahbox", "terminahboxestohbox", "terminahboxregister", "terminaheadtext", "terminahelptext", "terminahiding", "terminahighlight", "terminahyphenation", "terminaimath", "terminaimpaccato", "terminaincorniciato", "terminaindentation", "terminaindentedtext", "terminainteraction", "terminainterface", "terminaintermezzotext", "terminaintertext", "terminaitemgroup", "terminaitemgroupcolumns", "terminaitemize", "terminaknockout", "terminalabeltext", "terminalayout", "terminalegend", "terminalinealignment", "terminalineamargine", "terminalineatesto", "terminalinecorrection", "terminalinefiller", "terminalinenumbering", "terminalines", "terminalinetable", "terminalinetablebody", "terminalinetablecell", "terminalinetablehead", "terminalingua", "terminalocalfootnotes", "terminalocalheadsetup", "terminalocallinecorrection", "terminalocalnotes", "terminalocalsetups", "terminalua", "terminaluacode", "terminaluaparameterset", "terminaluasetups", "terminamakeup", "terminamarginblock", "terminamarkedcontent", "terminamarkpages", "terminamathalignment", "terminamathcases", "terminamathlabeltext", "terminamathmatrix", "terminamathmode", "terminamathstyle", "terminamatrices", "terminamatrix", "terminamaxaligned", "terminamdformula", "terminamenuinterattivo", "terminamettiformula", "terminamiddlealigned", "terminamiddlemakeup", "terminamixedcolumns", "terminamode", "terminamodeset", "terminamodule", "terminamoduletestsection", "terminampformula", "terminanamedsection", "terminanamedsubformulas", "terminanarrow", "terminanarrower", "terminanegative", "terminanicelyfilledbox", "terminanointerference", "terminanotallmodes", "terminanotext", "terminanotmode", "terminaoperatortext", "terminaopposite", "terminaoutputstream", "terminaoverlay", "terminaoverprint", "terminapagecolumns", "terminapagecomment", "terminapagefigure", "terminapagelayout", "terminapagemakeup", "terminapar", "terminaparagraph", "terminaparagraphs", "terminaparagraphscell", "terminaparbuilder", "terminapart", "terminapath", "terminaplacechemical", "terminaplacefigure", "terminaplacefloat", "terminaplacegraphic", "terminaplaceintermezzo", "terminaplacelegend", "terminaplacepairedbox", "terminaplacetable", "terminapositioning", "terminapositionoverlay", "terminapositive", "terminapostponing", "terminapostponingnotes", "terminaprefixtext", "terminaprocessassignmentcommand", "terminaprocessassignmentlist", "terminaprocesscommacommand", "terminaprocesscommalist", "terminaprodotto", "terminaprogetto", "terminaprotect", "terminaprotectedcolors", "terminapubblicazione", "terminapunctuation", "terminaquotation", "terminaquote", "terminarandomized", "terminarandomseed", "terminarawsetups", "terminareadingfile", "terminareferenceprefix", "terminaregime", "terminareusableMPgraphic", "terminariga", "terminaruby", "terminascript", "terminasdformula", "terminasection", "terminasectionblock", "terminasectionblockenvironment", "terminasectionlevel", "terminasetups", "terminasfondo", "terminashapebox", "terminashift", "terminasidebar", "terminasimplecolumns", "terminaspecialitem", "terminaspeech", "terminaspformula", "terminasplitformula", "terminasplittext", "terminaspread", "terminastandardmakeup", "terminastaticMPfigure", "terminastaticMPgraphic", "terminastrictinspectnextcharacter", "terminastrut", "terminastyle", "terminasubformulas", "terminasubject", "terminasubjectlevel", "terminasubsection", "terminasubsentence", "terminasubstack", "terminasubsubject", "terminasubsubsection", "terminasubsubsubject", "terminasubsubsubsection", "terminasubsubsubsubject", "terminasubsubsubsubsection", "terminasubsubsubsubsubject", "terminasuffixtext", "terminasymbolset", "terminatable", "terminatablehead", "terminatables", "terminatabletail", "terminatabletext", "terminatabulate", "terminatabulatehead", "terminatabulatetail", "terminatagged", "terminataglabeltext", "terminatesta", "terminatexcode", "terminatexdefinition", "terminatext", "terminatextbackground", "terminatextbackgroundmanual", "terminatextcolor", "terminatextcolorintent", "terminatextflow", "terminatextmakeup", "terminatitle", "terminatokenlist", "terminatokens", "terminatransparent", "terminatypescript", "terminatypescriptcollection", "terminatyping", "terminauniqueMPgraphic", "terminauniqueMPpagegraphic", "terminaunittext", "terminaunpacked", "terminausableMPgraphic", "terminauseMPgraphic", "terminausemathstyleparameter", "terminauserdata", "terminausingbtxspecification", "terminavaia", "terminavbox", "terminavboxregister", "terminavboxtohbox", "terminavboxtohboxseparator", "terminaviewerlayer", "terminavtop", "terminavtopregister", "terminaxcell", "terminaxcellgroup", "terminaxcolumn", "terminaxgroup", "terminaxmldisplayverbatim", "terminaxmlinlineverbatim", "terminaxmlraw", "terminaxmlsetups", "terminaxrow", "terminaxrowgroup", "terminaxtable", "terminaxtablebody", "terminaxtablefoot", "terminaxtablehead", "terminaxtablenext", "testonotapdp", "testoriempimento", "tieniblocchi", "traduci", "usaJSscripts", "usaURL", "usablocco", "usacartella", "usacolonnasonoraesterna", "usadocumentoesterno", "usafiguraesterna", "usamodulo", "usasimboli", "usaurl", "vaia", "vaiabox", "vaiapagina", "vaigiu", "valorecolore", "versione" },
- ["nl"]={ "Cijfers", "Kap", "Letter", "Letters", "MAAND", "Romeins", "WEEKDAG", "WOORD", "WOORDEN", "Woord", "Woorden", "achtergrond", "bepaalkopnummer", "bepaallijstkenmerken", "bepaalregisterkenmerken", "bewaarbuffer", "blanko", "blokje", "blokjes", "cijfers", "converteernummer", "copieerveld", "corrigeerwitruimte", "datum", "definieer", "definieeraccent", "definieeralineas", "definieerblok", "definieerbuffer", "definieercombinatie", "definieercommando", "definieerconversie", "definieerfiguursymbool", "definieerfont", "definieerfontstijl", "definieerfontsynoniem", "definieerhbox", "definieeringesprongentext", "definieerinteractiemenu", "definieeritemgroep", "definieerkadertekst", "definieerkarakter", "definieerkleur", "definieerkleurgroep", "definieerkolomgroep", "definieerkolomovergang", "definieerkop", "definieerkorps", "definieerkorpsomgeving", "definieerlayer", "definieerlayout", "definieerletter", "definieerlijst", "definieermarkering", "definieeromlijnd", "definieeropmaak", "definieeroverlay", "definieerpaginaovergang", "definieerpalet", "definieerpapierformaat", "definieerplaats", "definieerplaatsblok", "definieerprofiel", "definieerprogramma", "definieerreferentie", "definieerreferentieformaat", "definieerregister", "definieersamengesteldelijst", "definieersectie", "definieersectieblok", "definieersorteren", "definieerstartstop", "definieersubveld", "definieersymbool", "definieersynoniemen", "definieertabelvorm", "definieertabulatie", "definieertekst", "definieertekstachtergrond", "definieertype", "definieertypen", "definieerveld", "definieerveldstapel", "definieerwiskundeuitlijnen", "doordefinieren", "doorlabelen", "doornummeren", "dunnelijn", "dunnelijnen", "eenregel", "ergens", "externfiguur", "formulenummer", "gebruikJSscripts", "gebruikURL", "gebruikblokken", "gebruikexterndocument", "gebruikexternfiguur", "gebruikexterngeluidsfragment", "gebruikmodule", "gebruikpad", "gebruiksymbolen", "gebruiktypescript", "gebruiktypescriptfile", "gebruikurl", "geenbovenenonderregels", "geenhoofdenvoetregels", "geenspatie", "grijskleur", "haalbuffer", "haalmarkering", "haarlijn", "handhaafblokken", "hoofdtaal", "hoog", "huidigedatum", "huidigekopnummer", "inlijnd", "inregel", "installeertaal", "interactiebalk", "interactiebuttons", "interactiemenu", "invullijnen", "invulregel", "invultekst", "kleur", "kleurenbalk", "kleurwaarde", "kloonveld", "kolom", "kopnummer", "laag", "laho", "legeregels", "letter", "letters", "lijndikte", "lijstlengte", "maand", "markeer", "naar", "naarbox", "naarpagina", "nokap", "noot", "omgeving", "omlaag", "omlijnd", "onbekend", "onderdeel", "op", "oppagina", "pagina", "paginanummer", "paginareferentie", "paslayoutaan", "passendveld", "plaatsbookmarks", "plaatsformule", "plaatskopnummer", "plaatskoptekst", "plaatslijst", "plaatslijstmetsynoniemen", "plaatslokalevoetnoten", "plaatsnaastelkaar", "plaatsonderelkaar", "plaatsopgrid", "plaatspaginanummer", "plaatsplaatsblok", "plaatsregister", "plaatsruwelijst", "plaatssamengesteldelijst", "plaatssubformule", "plaatsvoetnoten", "positioneer", "produkt", "programma", "projekt", "punten", "refereer", "referentie", "regellinks", "regelmidden", "regelrechts", "resetmarkering", "romeins", "rooster", "roteer", "schaal", "scherm", "schrijfnaarlijst", "schrijftussenlijst", "selecteerblokken", "som", "spatie", "spiegel", "splitsplaatsblok", "startachtergrond", "startinteractiemenu", "startkantlijn", "startkleur", "startkop", "startlokalevoetnoten", "startmargeblok", "startnaar", "startomgeving", "startomlijnd", "startonderdeel", "startopelkaar", "startplaatsformule", "startplaatsplaatsblok", "startprodukt", "startprojekt", "startpublicatie", "startregel", "startregelcorrectie", "startregellinks", "startregelmidden", "startregelrechts", "startsom", "starttaal", "starttekstachtergrond", "starttekstlijn", "startuitlijnen", "stelachtergrondenin", "stelachtergrondin", "stelalineasin", "stelarrangerenin", "stelblankoin", "stelblokin", "stelblokjesin", "stelblokkopjein", "stelblokkopjesin", "stelbovenin", "stelboventekstenin", "stelbufferin", "stelciterenin", "stelclipin", "stelcommentaarin", "steldoordefinierenin", "steldoornummerenin", "steldunnelijnenin", "stelformulein", "stelformulesin", "stelformulierenin", "stelhoofdin", "stelhoofdtekstenin", "stelingesprongentextin", "stelinmargein", "stelinspringenin", "stelinteractiebalkin", "stelinteractiein", "stelinteractiemenuin", "stelinteractieschermin", "stelinterliniein", "stelinvullijnenin", "stelinvulregelsin", "stelitemgroepin", "stelitemsin", "stelkadertekstenin", "stelkadertekstin", "stelkantlijnin", "stelkapitalenin", "stelkleurenin", "stelkleurin", "stelkolomgroepin", "stelkolomgroepregelsin", "stelkolomgroepstartin", "stelkolommenin", "stelkopin", "stelkopnummerin", "stelkoppeltekenin", "stelkoppenin", "stelkorpsin", "stellayoutin", "stellijndiktein", "stellijstin", "stelmargeblokkenin", "stelmarkeringin", "stelnaastplaatsenin", "stelomlijndin", "stelonderin", "stelondertekstenin", "stelopmaakin", "stelopsommingenin", "stelpaginacommentaarin", "stelpaginanummerin", "stelpaginanummeringin", "stelpaginaovergangenin", "stelpaletin", "stelpapierformaatin", "stelpapierin", "stelparagraafnummerenin", "stelplaatsblokin", "stelplaatsblokkenin", "stelplaatsbloksplitsenin", "stelplaatsin", "stelpositionerenin", "stelprogrammasin", "stelrefererenin", "stelregelnummerenin", "stelregelsin", "stelregisterin", "stelroterenin", "stelsamengesteldelijstin", "stelsectieblokin", "stelsmallerin", "stelsorterenin", "stelspatieringin", "stelstartstopin", "stelsubpaginanummerin", "stelsymboolsetin", "stelsynoniemenin", "steltaalin", "steltabellenin", "steltabulatiein", "steltekstachtergrondin", "steltekstin", "steltekstinhoudin", "steltekstlijnenin", "stelteksttekstenin", "steltolerantiein", "steltypein", "steltypenin", "steluitlijnenin", "stelurlin", "stelveldenin", "stelveldin", "stelvoetin", "stelvoettekstenin", "stelwiskundeuitlijnenin", "stelwitruimtein", "stopachtergrond", "stopinteractiemenu", "stopkantlijn", "stopkleur", "stopkop", "stoplokalevoetnoten", "stopmargeblok", "stopnaar", "stopomgeving", "stopomlijnd", "stoponderdeel", "stopopelkaar", "stopplaatsformule", "stopplaatsplaatsblok", "stopprodukt", "stopprojekt", "stoppublicatie", "stopregel", "stopregelcorrectie", "stopregellinks", "stopregelmidden", "stopregelrechts", "stopsom", "stoptaal", "stoptekstachtergrond", "stoptekstlijn", "stopuitlijnen", "subpaginanummer", "switchnaarkorps", "symbool", "taal", "tekstlijn", "tekstreferentie", "testkolom", "testpagina", "toelichting", "toongrid", "tooninstellingen", "toonkader", "toonkleur", "toonkleurgroep", "toonkorps", "toonkorpsomgeving", "toonlayout", "toonopmaak", "toonpalet", "toonprint", "toonstruts", "toonsymboolset", "uit", "uitgerekt", "vastespatie", "vastespaties", "veld", "veldstapel", "verbergblokken", "vergelijkkleurgroep", "vergelijkpalet", "versie", "vertaal", "verwerkblokken", "voetnoottekst", "volledigepaginanummer", "volledigregister", "voluit", "weekdag", "wiskunde", "woordrechts" },
- ["pe"]={ "آیتم", "آیتمها", "آینه", "از", "استÙاده‌بلوکها", "استÙاده‌دستخط‌تایپ", "استÙاده‌شکل‌خارجی", "استÙاده‌قطعه‌موزیک‌خارجی", "استÙاده‌مدول", "استÙاده‌مسیر", "استÙاده‌نمادها", "استÙاده‌نوشتارخارجی", "استÙاده‌پرونده‌دستخط‌تایپ", "اعدادلاتین", "اÙزودن", "انتخاب‌بلوکها", "بارگذاری‌آرایش", "بارگذاری‌آیتمها", "بارگذاری‌ارجاع", "بارگذاری‌اندازه‌برگ", "بارگذاری‌باریکتر", "بارگذاری‌باÙر", "بارگذاری‌بالا", "بارگذاری‌بردباری", "بارگذاری‌برنامه‌ها", "بارگذاری‌برگ", "بارگذاری‌بلوک", "بارگذاری‌بلوک‌بخش", "بارگذاری‌تایپ", "بارگذاری‌تایپ‌کردن", "بارگذاری‌ترتیب", "بارگذاری‌تنظیم", "بارگذاری‌تنظیم‌ریاضی", "بارگذاری‌ته‌برگ", "بارگذاری‌تورÙتگی", "بارگذاری‌توضیح", "بارگذاری‌توضیح‌صÙحه", "بارگذاری‌ثبت", "بارگذاری‌جانشانی", "بارگذاری‌جدولها", "بارگذاری‌جدول‌بندی", "بارگذاری‌خالی", "بارگذاری‌خطها", "بارگذاری‌خطهای‌حاشیه", "بارگذاری‌خطهای‌سیاه", "بارگذاری‌خطهای‌متن", "بارگذاری‌خطهای‌مجموعه‌ستون", "بارگذاری‌خطها‌ی‌نازک", "بارگذاری‌درج‌درخطها", "بارگذاری‌درج‌مخالÙ", "بارگذاری‌دوران", "بارگذاری‌رنگ", "بارگذاری‌رنگها", "بارگذاری‌زبان", "بارگذاری‌ستونها", "بارگذاری‌سر", "بارگذاری‌سربرگ", "بارگذاری‌سرها", "بارگذاری‌شرح", "بارگذاری‌شرحها", "بارگذاری‌شروع‌مجموعه‌ستون", "بارگذاری‌شروع‌پایان", "بارگذاری‌شماره‌زیرصÙحه", "بارگذاری‌شماره‌سر", "بارگذاری‌شماره‌صÙحه", "بارگذاری‌شماره‌گذاریها", "بارگذاری‌شماره‌گذاری‌صÙحه", "بارگذاری‌شماره‌گذاری‌پاراگراÙ", "بارگذاری‌شماره‌‌گذاری‌خط", "بارگذاری‌شناور", "بارگذاری‌شناورها", "بارگذاری‌شکاÙتن‌شناورها", "بارگذاری‌طرح", "بارگذاری‌طرح‌بندی", "بارگذاری‌عرض‌خط", "بارگذاری‌Ùاصله‌بین‌خط", "بارگذاری‌Ùرمولها", "بارگذاری‌Ùضای‌سÙید", "بارگذاری‌Ùضا‌گذاری", "بارگذاری‌قالبی", "بارگذاری‌قلم‌متن", "بارگذاری‌لوح", "بارگذاری‌لیست", "بارگذاری‌لیست‌ترکیبی", "بارگذاری‌مترادÙها", "بارگذاری‌متن", "بارگذاری‌متنهای‌بالا", "بارگذاری‌متن‌سربرگ", "بارگذاری‌متن‌قالبی", "بارگذاری‌متن‌متنها", "بارگذاری‌متن‌پانوشت", "بارگذاری‌متن‌پایین", "بارگذاری‌مجموعه‌ستون", "بارگذاری‌مجموعه‌نماد", "بارگذاری‌منوی‌پانل", "بارگذاری‌مکان‌گذاری", "بارگذاری‌میدان", "بارگذاری‌میدانها", "بارگذاری‌میله‌پانل", "بارگذاری‌نشانه‌شکستن", "بارگذاری‌نشانه‌گذاری", "بارگذاری‌نقل", "بارگذاری‌پاراگراÙها", "بارگذاری‌پانل", "بارگذاری‌پایین", "بارگذاری‌پرده‌پانل", "بارگذاری‌پرکردن‌خطها", "بارگذاری‌پس‌زمینه", "بارگذاری‌پس‌زمینه‌ها", "بارگذاری‌چیدن", "بارگذاری‌گذارصÙحه", "بارگذاری‌گروههای‌آیتم", "بارگذاری‌گروه‌آیتم", "بازنشانی‌نشانه‌گذاری", "بدون‌خط‌بالاوپایین", "بدون‌خط‌سروته‌برگ", "بدون‌Ùضا", "برنامه", "بروبه", "بروبه‌جعبه", "بروبه‌صÙحه", "بروپایین", "بلند", "بلوکهای‌پردازش", "بلوکها‌پنهان", "بنویس‌بین‌لیست", "بنویس‌در‌لیست", "تاریخ", "تاریخ‌جاری", "تایپ", "تایپ‌باÙر", "تایپ‌پرونده", "ترجمه", "تعریÙ", "تعریÙ‌آرایش", "تعریÙ‌الگوی‌جدول", "تعریÙ‌اندازه‌برگ", "تعریÙ‌باÙر", "تعریÙ‌بخش", "تعریÙ‌برنامه", "تعریÙ‌برچسب", "تعریÙ‌بلوک", "تعریÙ‌بلوک‌بخش", "تعریÙ‌تایپ", "تعریÙ‌تایپ‌کردن", "تعریÙ‌تبدیل", "تعریÙ‌ترتیب", "تعریÙ‌ترکیب", "تعریÙ‌تنظیم‌ریاضی", "تعریÙ‌توده‌میدان", "تعریÙ‌ثبت", "تعریÙ‌جانشانی", "تعریÙ‌جدول‌بندی", "تعریÙ‌جعبه‌‌اÙÙ‚ÛŒ", "تعریÙ‌حرÙ", "تعریÙ‌رنگ", "تعریÙ‌زیرمیدان", "تعریÙ‌سبک", "تعریÙ‌سبک‌قلم", "تعریÙ‌سر", "تعریÙ‌شرح", "تعریÙ‌شروع‌پایان", "تعریÙ‌شماره‌بندی", "تعریÙ‌شمایل‌مرجع", "تعریÙ‌شناور", "تعریÙ‌شکستن‌ستون", "تعریÙ‌شکست‌صÙحه", "تعریÙ‌طرح‌بندی", "تعریÙ‌Ùرمان", "تعریÙ‌قالبی", "تعریÙ‌قلم", "تعریÙ‌قلم‌متن", "تعریÙ‌لایه", "تعریÙ‌لهجه", "تعریÙ‌لوح", "تعریÙ‌لیست", "تعریÙ‌لیست‌ترکیبی", "تعریÙ‌مترادÙها", "تعریÙ‌مترادÙ‌قلم", "تعریÙ‌متن", "تعریÙ‌متن‌قالبی", "تعریÙ‌مجموعه‌ستون", "تعریÙ‌محیط‌قلم‌بدنه", "تعریÙ‌مرجع", "تعریÙ‌منوی‌پانل", "تعریÙ‌میدان", "تعریÙ‌نشانه‌گذاری", "تعریÙ‌نماد", "تعریÙ‌نمادشکل", "تعریÙ‌پاراگراÙها", "تعریÙ‌پروÙایل", "تعریÙ‌پوشش", "تعریÙ‌گروه‌آیتم", "تعریÙ‌گروه‌رنگ", "تعیین‌شماره‌سر", "تعیین‌محتوای‌متن", "تعیین‌مشخصات‌ثبت", "تعیین‌مشخصات‌لیست", "تغییربه‌قلم‌بدنه", "تنظیم‌راست", "تنظیم‌طرح‌بندی", "تنظیم‌وسط", "توجه", "توری", "تولید", "تک", "ثبت‌کامل", "حرÙ", "حرÙها", "Ø­Ùظ‌بلوکها", "خالی", "خطهای‌سیاه", "خطهای‌نازک", "خطها‌خالی", "خط‌سیاه", "خط‌متن", "خط‌مو", "خط‌نازک", "خ‌ا", "خ‌ع", "در", "درج‌ثبت", "درج‌درخط", "درج‌درخطها", "درج‌درمتن", "درج‌در‌بالای‌یکدیگر", "درج‌در‌توری", "درج‌زیرÙرمول", "درج‌شماره‌سر", "درج‌شماره‌صÙحه", "درج‌شناور", "درج‌Ùرمول", "درج‌لیست", "درج‌لیست‌خام", "درج‌لیست‌مختلط", "درج‌متن‌سر", "درج‌پانوشتها", "درج‌پانوشتهای‌موضعی", "درج‌چوب‌خط", "درج‌کنار‌به‌کنار", "درخط", "درصÙحه", "درقالبی", "درمورد", "درون", "درپر", "دریاÙت‌باÙر", "دریاÙت‌نشانه", "دوران", "دکمه", "دکمه‌منو", "دکمه‌پانل", "رج", "رنگ", "رنگ‌خاکستری", "روزهÙته", "ریاضی", "زبان", "زبان‌اصلی", "ستون", "ستون‌امتحان", "سرپوش‌کوچک‌نه", "شروعJScode", "شروعJSpreamble", "شروعLUA", "شروعMP", "شروعMPclip", "شروعMPcode", "شروعMPdefinitions", "شروعMPdrawing", "شروعMPenvironment", "شروعMPextensions", "شروعMPinclusions", "شروعMPinitializations", "شروعMPpage", "شروعMPpositiongraphic", "شروعMPpositionmethod", "شروعMPrun", "شروعPARSEDXML", "شروعTABLE", "شروعTABLEbody", "شروعTABLEfoot", "شروعTABLEhead", "شروعTABLEnext", "شروعTC", "شروعTD", "شروعTDs", "شروعTEX", "شروعTEXpage", "شروعTH", "شروعTN", "شروعTR", "شروعTRs", "شروعTX", "شروعTY", "شروعXML", "شروعalign", "شروعalignment", "شروعallmodes", "شروعappendices", "شروعarrangedpages", "شروعaside", "شروعattachment", "شروعbackmatter", "شروعbar", "شروعbbordermatrix", "شروعbitmapimage", "شروعblockquote", "شروعbodymatter", "شروعbordermatrix", "شروعboxedcolumns", "شروعbtxlabeltext", "شروعbtxrenderingdefinitions", "شروعbuffer", "شروعcases", "شروعcatcodetable", "شروعcenteraligned", "شروعchapter", "شروعcharacteralign", "شروعcheckedfences", "شروعchemical", "شروعchemicaltext", "شروعcollect", "شروعcollecting", "شروعcolorintent", "شروعcoloronly", "شروعcolorset", "شروعcolumns", "شروعcolumnset", "شروعcolumnsetspan", "شروعcolumnspan", "شروعcombination", "شروعcomment", "شروعcontextcode", "شروعcontextdefinitioncode", "شروعctxfunction", "شروعctxfunctiondefinition", "شروعcurrentcolor", "شروعcurrentlistentrywrapper", "شروعdelimited", "شروعdelimitedtext", "شروعdisplaymath", "شروعdmath", "شروعdocument", "شروعeffect", "شروعelement", "شروعembeddedxtable", "شروعendnote", "شروعendofline", "شروعexceptions", "شروعexpanded", "شروعexpandedcollect", "شروعextendedcatcodetable", "شروعexternalfigurecollection", "شروعfacingfloat", "شروعfact", "شروعfigure", "شروعfiguretext", "شروعfittingpage", "شروعfixed", "شروعfloatcombination", "شروعfont", "شروعfontclass", "شروعfontsolution", "شروعfootnote", "شروعformula", "شروعformulas", "شروعframedcell", "شروعframedcontent", "شروعframedrow", "شروعframedtable", "شروعframedtext", "شروعfrontmatter", "شروعgraphictext", "شروعgridsnapping", "شروعhanging", "شروعhbox", "شروعhboxestohbox", "شروعhboxregister", "شروعheadtext", "شروعhelptext", "شروعhiding", "شروعhighlight", "شروعhyphenation", "شروعimath", "شروعindentation", "شروعindentedtext", "شروعinteraction", "شروعinterface", "شروعintermezzotext", "شروعintertext", "شروعitemgroup", "شروعitemgroupcolumns", "شروعitemize", "شروعknockout", "شروعlabeltext", "شروعlayout", "شروعlegend", "شروعlinealignment", "شروعlinecorrection", "شروعlinefiller", "شروعlinenumbering", "شروعlines", "شروعlinetable", "شروعlinetablebody", "شروعlinetablecell", "شروعlinetablehead", "شروعlocalfootnotes", "شروعlocalheadsetup", "شروعlocallinecorrection", "شروعlocalnotes", "شروعlocalsetups", "شروعlua", "شروعluacode", "شروعluaparameterset", "شروعluasetups", "شروعmakeup", "شروعmarginblock", "شروعmarkedcontent", "شروعmarkpages", "شروعmathalignment", "شروعmathcases", "شروعmathlabeltext", "شروعmathmatrix", "شروعmathmode", "شروعmathstyle", "شروعmatrices", "شروعmatrix", "شروعmaxaligned", "شروعmdformula", "شروعmiddlealigned", "شروعmiddlemakeup", "شروعmixedcolumns", "شروعmode", "شروعmodeset", "شروعmodule", "شروعmoduletestsection", "شروعmpformula", "شروعnamedsection", "شروعnamedsubformulas", "شروعnarrow", "شروعnarrower", "شروعnegative", "شروعnicelyfilledbox", "شروعnointerference", "شروعnotallmodes", "شروعnotext", "شروعnotmode", "شروعoperatortext", "شروعopposite", "شروعoutputstream", "شروعoverlay", "شروعoverprint", "شروعpagecolumns", "شروعpagecomment", "شروعpagefigure", "شروعpagelayout", "شروعpagemakeup", "شروعpar", "شروعparagraph", "شروعparagraphs", "شروعparagraphscell", "شروعparbuilder", "شروعpart", "شروعpath", "شروعplacechemical", "شروعplacefigure", "شروعplacegraphic", "شروعplaceintermezzo", "شروعplacelegend", "شروعplacepairedbox", "شروعplacetable", "شروعpositioning", "شروعpositionoverlay", "شروعpositive", "شروعpostponing", "شروعpostponingnotes", "شروعprefixtext", "شروعprocessassignmentcommand", "شروعprocessassignmentlist", "شروعprocesscommacommand", "شروعprocesscommalist", "شروعprotect", "شروعprotectedcolors", "شروعpunctuation", "شروعquotation", "شروعquote", "شروعrandomized", "شروعrandomseed", "شروعrawsetups", "شروعreadingfile", "شروعreferenceprefix", "شروعregime", "شروعreusableMPgraphic", "شروعruby", "شروعscript", "شروعsdformula", "شروعsection", "شروعsectionblock", "شروعsectionblockenvironment", "شروعsectionlevel", "شروعsetups", "شروعshapebox", "شروعshift", "شروعsidebar", "شروعsimplecolumns", "شروعspecialitem", "شروعspeech", "شروعspformula", "شروعsplitformula", "شروعsplittext", "شروعspread", "شروعstandardmakeup", "شروعstaticMPfigure", "شروعstaticMPgraphic", "شروعstrictinspectnextcharacter", "شروعstrut", "شروعstyle", "شروعsubformulas", "شروعsubject", "شروعsubjectlevel", "شروعsubsection", "شروعsubsentence", "شروعsubstack", "شروعsubsubject", "شروعsubsubsection", "شروعsubsubsubject", "شروعsubsubsubsection", "شروعsubsubsubsubject", "شروعsubsubsubsubsection", "شروعsubsubsubsubsubject", "شروعsuffixtext", "شروعsymbolset", "شروعtable", "شروعtablehead", "شروعtables", "شروعtabletail", "شروعtabletext", "شروعtabulate", "شروعtabulatehead", "شروعtabulatetail", "شروعtagged", "شروعtaglabeltext", "شروعtexcode", "شروعtexdefinition", "شروعtext", "شروعtextbackground", "شروعtextbackgroundmanual", "شروعtextcolor", "شروعtextcolorintent", "شروعtextflow", "شروعtextmakeup", "شروعtitle", "شروعtokenlist", "شروعtokens", "شروعtransparent", "شروعtypescript", "شروعtypescriptcollection", "شروعtyping", "شروعuniqueMPgraphic", "شروعuniqueMPpagegraphic", "شروعunittext", "شروعunpacked", "شروعusableMPgraphic", "شروعuseMPgraphic", "شروعusemathstyleparameter", "شروعuserdata", "شروعusingbtxspecification", "شروعvbox", "شروعvboxregister", "شروعvboxtohbox", "شروعvboxtohboxseparator", "شروعviewerlayer", "شروعvtop", "شروعvtopregister", "شروعxcell", "شروعxcellgroup", "شروعxcolumn", "شروعxgroup", "شروعxmldisplayverbatim", "شروعxmlinlineverbatim", "شروعxmlraw", "شروعxmlsetups", "شروعxrow", "شروعxrowgroup", "شروعxtable", "شروعxtablebody", "شروعxtablefoot", "شروعxtablehead", "شروعxtablenext", "شروعآیتم", "شروعبروبه", "شروعتنظیم‌راست", "شروعتنظیم‌وسط", "شروعتولید", "شروعخط‌حاشیه", "شروعخط‌متن", "شروعدرج‌شناور", "شروعدرج‌Ùرمول", "شروعرنگ", "شروعزبان", "شروعسر", "شروعÙشرده", "شروعقالبی", "شروعمحیط", "شروعمنوی‌پانل", "شروعمولÙÙ‡", "شروعنشر", "شروعپروژه", "شروعپس‌زمینه", "شروعچپ‌چین", "شروع‌خط", "شماره‌زیرصÙحه", "شماره‌سر", "شماره‌سرجاری", "شماره‌صÙحه", "شماره‌صÙحه‌کامل", "شماره‌Ùرمول", "شماره‌مبدل", "شماره‌ها", "شکاÙتن‌شناور", "شکل‌خارجی", "صÙحه", "صÙحه‌تست", "طول‌لیست", "عرض‌خط", "Ùضا", "Ùضاهای‌ثابت", "Ùضای‌ثابت", "Ùضای‌سÙیدصحیح", "قالبی", "لوح‌مقایسه", "ماه", "متن‌پانوشت", "محیط", "مراجعه", "مرجع", "مرجع‌صÙحه", "مرجع‌متن", "مقایسه‌گروه‌رنگ", "مقداررنگ", "مقیاس", "منوی‌پانل", "مولÙÙ‡", "مکان", "میدان", "میدان‌شبیه‌سازی", "میدان‌پشته", "میدان‌کپی", "میله‌رنگ", "میله‌پانل", "ناشناس", "نسخه", "نشانه‌گذاری", "نصب‌زبان", "نقطه‌ها", "نماد", "نمایش‌آرایش", "نمایش‌بارگذاریها", "نمایش‌بستها", "نمایش‌توری", "نمایش‌رنگ", "نمایش‌طرح‌بندی", "نمایش‌قالب", "نمایش‌قلم‌بدنه", "نمایش‌لوح", "نمایش‌مجموعه‌علامت", "نمایش‌محیط‌قلم‌بدنه", "نمایش‌چاپ", "نمایش‌گروه‌رنگ", "پابا", "پایانJScode", "پایانJSpreamble", "پایانLUA", "پایانMP", "پایانMPclip", "پایانMPcode", "پایانMPdefinitions", "پایانMPdrawing", "پایانMPenvironment", "پایانMPextensions", "پایانMPinclusions", "پایانMPinitializations", "پایانMPpage", "پایانMPpositiongraphic", "پایانMPpositionmethod", "پایانMPrun", "پایانPARSEDXML", "پایانTABLE", "پایانTABLEbody", "پایانTABLEfoot", "پایانTABLEhead", "پایانTABLEnext", "پایانTC", "پایانTD", "پایانTDs", "پایانTEX", "پایانTEXpage", "پایانTH", "پایانTN", "پایانTR", "پایانTRs", "پایانTX", "پایانTY", "پایانXML", "پایانalign", "پایانalignment", "پایانallmodes", "پایانappendices", "پایانarrangedpages", "پایانaside", "پایانattachment", "پایانbackmatter", "پایانbar", "پایانbbordermatrix", "پایانbitmapimage", "پایانblockquote", "پایانbodymatter", "پایانbordermatrix", "پایانboxedcolumns", "پایانbtxlabeltext", "پایانbtxrenderingdefinitions", "پایانbuffer", "پایانcases", "پایانcatcodetable", "پایانcenteraligned", "پایانchapter", "پایانcharacteralign", "پایانcheckedfences", "پایانchemical", "پایانchemicaltext", "پایانcollect", "پایانcollecting", "پایانcolorintent", "پایانcoloronly", "پایانcolorset", "پایانcolumns", "پایانcolumnset", "پایانcolumnsetspan", "پایانcolumnspan", "پایانcombination", "پایانcomment", "پایانcontextcode", "پایانcontextdefinitioncode", "پایانctxfunction", "پایانctxfunctiondefinition", "پایانcurrentcolor", "پایانcurrentlistentrywrapper", "پایانdelimited", "پایانdelimitedtext", "پایانdisplaymath", "پایانdmath", "پایانdocument", "پایانeffect", "پایانelement", "پایانembeddedxtable", "پایانendnote", "پایانendofline", "پایانexceptions", "پایانexpanded", "پایانexpandedcollect", "پایانextendedcatcodetable", "پایانexternalfigurecollection", "پایانfacingfloat", "پایانfact", "پایانfigure", "پایانfiguretext", "پایانfittingpage", "پایانfixed", "پایانfloatcombination", "پایانfont", "پایانfontclass", "پایانfontsolution", "پایانfootnote", "پایانformula", "پایانformulas", "پایانframedcell", "پایانframedcontent", "پایانframedrow", "پایانframedtable", "پایانframedtext", "پایانfrontmatter", "پایانgraphictext", "پایانgridsnapping", "پایانhanging", "پایانhbox", "پایانhboxestohbox", "پایانhboxregister", "پایانheadtext", "پایانhelptext", "پایانhiding", "پایانhighlight", "پایانhyphenation", "پایانimath", "پایانindentation", "پایانindentedtext", "پایانinteraction", "پایانinterface", "پایانintermezzotext", "پایانintertext", "پایانitemgroup", "پایانitemgroupcolumns", "پایانitemize", "پایانknockout", "پایانlabeltext", "پایانlayout", "پایانlegend", "پایانlinealignment", "پایانlinecorrection", "پایانlinefiller", "پایانlinenumbering", "پایانlines", "پایانlinetable", "پایانlinetablebody", "پایانlinetablecell", "پایانlinetablehead", "پایانlocalfootnotes", "پایانlocalheadsetup", "پایانlocallinecorrection", "پایانlocalnotes", "پایانlocalsetups", "پایانlua", "پایانluacode", "پایانluaparameterset", "پایانluasetups", "پایانmakeup", "پایانmarginblock", "پایانmarkedcontent", "پایانmarkpages", "پایانmathalignment", "پایانmathcases", "پایانmathlabeltext", "پایانmathmatrix", "پایانmathmode", "پایانmathstyle", "پایانmatrices", "پایانmatrix", "پایانmaxaligned", "پایانmdformula", "پایانmiddlealigned", "پایانmiddlemakeup", "پایانmixedcolumns", "پایانmode", "پایانmodeset", "پایانmodule", "پایانmoduletestsection", "پایانmpformula", "پایانnamedsection", "پایانnamedsubformulas", "پایانnarrow", "پایانnarrower", "پایانnegative", "پایانnicelyfilledbox", "پایانnointerference", "پایانnotallmodes", "پایانnotext", "پایانnotmode", "پایانoperatortext", "پایانopposite", "پایانoutputstream", "پایانoverlay", "پایانoverprint", "پایانpagecolumns", "پایانpagecomment", "پایانpagefigure", "پایانpagelayout", "پایانpagemakeup", "پایانpar", "پایانparagraph", "پایانparagraphs", "پایانparagraphscell", "پایانparbuilder", "پایانpart", "پایانpath", "پایانplacechemical", "پایانplacefigure", "پایانplacegraphic", "پایانplaceintermezzo", "پایانplacelegend", "پایانplacepairedbox", "پایانplacetable", "پایانpositioning", "پایانpositionoverlay", "پایانpositive", "پایانpostponing", "پایانpostponingnotes", "پایانprefixtext", "پایانprocessassignmentcommand", "پایانprocessassignmentlist", "پایانprocesscommacommand", "پایانprocesscommalist", "پایانprotect", "پایانprotectedcolors", "پایانpunctuation", "پایانquotation", "پایانquote", "پایانrandomized", "پایانrandomseed", "پایانrawsetups", "پایانreadingfile", "پایانreferenceprefix", "پایانregime", "پایانreusableMPgraphic", "پایانruby", "پایانscript", "پایانsdformula", "پایانsection", "پایانsectionblock", "پایانsectionblockenvironment", "پایانsectionlevel", "پایانsetups", "پایانshapebox", "پایانshift", "پایانsidebar", "پایانsimplecolumns", "پایانspecialitem", "پایانspeech", "پایانspformula", "پایانsplitformula", "پایانsplittext", "پایانspread", "پایانstandardmakeup", "پایانstaticMPfigure", "پایانstaticMPgraphic", "پایانstrictinspectnextcharacter", "پایانstrut", "پایانstyle", "پایانsubformulas", "پایانsubject", "پایانsubjectlevel", "پایانsubsection", "پایانsubsentence", "پایانsubstack", "پایانsubsubject", "پایانsubsubsection", "پایانsubsubsubject", "پایانsubsubsubsection", "پایانsubsubsubsubject", "پایانsubsubsubsubsection", "پایانsubsubsubsubsubject", "پایانsuffixtext", "پایانsymbolset", "پایانtable", "پایانtablehead", "پایانtables", "پایانtabletail", "پایانtabletext", "پایانtabulate", "پایانtabulatehead", "پایانtabulatetail", "پایانtagged", "پایانtaglabeltext", "پایانtexcode", "پایانtexdefinition", "پایانtext", "پایانtextbackground", "پایانtextbackgroundmanual", "پایانtextcolor", "پایانtextcolorintent", "پایانtextflow", "پایانtextmakeup", "پایانtitle", "پایانtokenlist", "پایانtokens", "پایانtransparent", "پایانtypescript", "پایانtypescriptcollection", "پایانtyping", "پایانuniqueMPgraphic", "پایانuniqueMPpagegraphic", "پایانunittext", "پایانunpacked", "پایانusableMPgraphic", "پایانuseMPgraphic", "پایانusemathstyleparameter", "پایانuserdata", "پایانusingbtxspecification", "پایانvbox", "پایانvboxregister", "پایانvboxtohbox", "پایانvboxtohboxseparator", "پایانviewerlayer", "پایانvtop", "پایانvtopregister", "پایانxcell", "پایانxcellgroup", "پایانxcolumn", "پایانxgroup", "پایانxmldisplayverbatim", "پایانxmlinlineverbatim", "پایانxmlraw", "پایانxmlsetups", "پایانxrow", "پایانxrowgroup", "پایانxtable", "پایانxtablebody", "پایانxtablefoot", "پایانxtablehead", "پایانxtablenext", "پایانآیتم", "پایانبروبه", "پایانتنظیم‌راست", "پایانتنظیم‌وسط", "پایانتولید", "پایانخط‌حاشیه", "پایانخط‌متن", "پایاندرج‌شناور", "پایاندرج‌Ùرمول", "پایانرنگ", "پایانزبان", "پایانسر", "پایانÙشرده", "پایانقالبی", "پایانمحیط", "پایانمنوی‌پانل", "پایانمولÙÙ‡", "پایاننشر", "پایانپروژه", "پایانپس‌زمینه", "پایانچپ‌چین", "پایان‌خط", "پایین", "پرده", "پروژه", "پرکردن‌میدان", "پس‌زمینه", "چوبخط", "چپ‌چین", "کشیده", "کلمه‌راست", "گیره", "یادداشت", "یک‌جا", "یک‌خط" },
- ["ro"]={ "CUVANT", "CUVINTE", "Cuvant", "Cuvinte", "Kap", "LUNA", "Litera", "Litere", "Numere", "Numereromane", "ZIDINSAPTAMANA", "adapteazaaspect", "adubuffer", "adumarcaje", "afiseazaaspect", "afiseazaculoare", "afiseazafonttext", "afiseazagrid", "afiseazagrupculoare", "afiseazamakeup", "afiseazamediufonttext", "afiseazapaleta", "afiseazarama", "afiseazasetari", "afiseazasetsimboluri", "afiseazastruts", "afiseazatiparire", "aliniatcentru", "aliniatdreapta", "aliniatstanga", "ascundeblocuri", "baraculoare", "barainteractiune", "blanc", "butoaneinteractiune", "buton", "butonmeniu", "camp", "cloneazacamp", "coloana", "comparagrupculoare", "comparapaleta", "completeazanumarpagina", "componenta", "convertestenumar", "copiazacamp", "corecteazaspatiualb", "culoare", "culoaregri", "cuvantdreapta", "data", "datacurenta", "defineste", "definesteaccent", "definesteantet", "definestebloc", "definesteblocsectiune", "definestebuffer", "definestecamp", "definestecaracter", "definestecomanda", "definesteconversie", "definesteculoare", "definestedescriere", "definestedimensiunehartie", "definesteenumerare", "definesteeticheta", "definestefloat", "definestefont", "definestefonttext", "definesteformatreferinte", "definestegrupculori", "definestehbox", "definesteinconjurare", "definestelista", "definestelistacombinata", "definestemakeup", "definestemarcaje", "definestemediulfonttext", "definestemeniuinteractiune", "definesteoverlay", "definestepaleta", "definesteparagraf", "definesteprofil", "definesteprogram", "definestereferinte", "definesteregistru", "definestesablontabel", "definestesectiune", "definestesimbol", "definestesimbolfigura", "definestesinonim", "definestesinonimfont", "definestesortare", "definestestartstop", "definestestil", "definestestilfont", "definestestivacampuri", "definestesubcamp", "definestetabulatori", "definestetext", "definestetexteinconjurate", "definestetextinconjurat", "definestetyping", "despre", "determinacaracteristicilelistei", "determinacaracteristiciregistru", "determinanumartitlu", "din", "dute", "dutebox", "dutepagina", "ecran", "element", "faraliniiantetsisubsol", "faraliniisussijos", "faraspatiu", "figuraexterna", "firdepar", "folosesteURL", "folosestebloc", "folosestedirector", "folosestedocumentextern", "folosestefiguraexterna", "folosestemodul", "folosestemuzicaexterna", "folosestescriptJS", "folosestesimboluri", "folosesteurl", "fundal", "grosimelinie", "impartefloat", "inalt", "injos", "inlinie", "instalarelimba", "intins", "jos", "jossus", "la", "lapagina", "limba", "limbaprincipala", "linieneagra", "liniesubtire", "linieumplere", "liniinegre", "liniisubtiri", "litera", "litere", "luna", "lungimelista", "marcaje", "matematica", "mediu", "meniuinteractiune", "necunoscut", "nokap", "nota", "numarformula", "numarpagina", "numartitlu", "numartitlucurent", "numere", "numereromane", "olinie", "pagina", "pastreazablocuri", "pelung", "plaseazapegrid", "plaseazasemnecarte", "potrivestecamp", "pozitie", "proceseazabloc", "produs", "proiect", "puncte", "punedeasuprafiecareia", "punefatainfata", "puneformula", "punelista", "punelistacombinata", "punenotesubsol", "punenotesubsollocale", "punenumarpagina", "puneregistru", "punesubformula", "referinta", "referintapagina", "referintatext", "reflexie", "remarca", "reseteazamarcaje", "riglatext", "rigleumplere", "roteste", "scala", "scriebuffer", "scrieinlista", "scrieintreliste", "selecteazablocuri", "semncarte", "setareitemization", "setarelimba", "setarepozitie", "seteazaaliniat", "seteazaalinierea", "seteazaantet", "seteazaaranjareapag", "seteazaaspect", "seteazabarainteractiune", "seteazablanc", "seteazabloc", "seteazablocsectiune", "seteazabuffer", "seteazacamp", "seteazacampuri", "seteazaclipping", "seteazacoloane", "seteazacomentariu", "seteazacomentariupagina", "seteazaculoare", "seteazaculori", "seteazadimensiunihartie", "seteazaecraninteractiune", "seteazaelemente", "seteazaenumerare", "seteazafloat", "seteazafloats", "seteazafonttext", "seteazaformulare", "seteazaformule", "seteazafundal", "seteazafundaluri", "seteazagrosimelinie", "seteazaimpartireafloat", "seteazainconjurat", "seteazaingust", "seteazainteractiunea", "seteazajos", "seteazalegenda", "seteazalegendele", "seteazaliniesilabe", "seteazaliniesubtire", "seteazalinii", "seteazaliniimargine", "seteazaliniinegre", "seteazaliniiumplere", "seteazalista", "seteazalistacombinata", "seteazamajuscule", "seteazamakeup", "seteazamarcaje", "seteazameniuinteractiune", "seteazaminicitat", "seteazanumarpagina", "seteazanumarsubpagina", "seteazanumartitlu", "seteazanumerotarelinii", "seteazanumerotarepagina", "seteazanumerotareparagrafe", "seteazapaleta", "seteazaparagrafe", "seteazaplasareaopozita", "seteazaprograme", "seteazareferinte", "seteazaregistru", "seteazarigletext", "seteazarigleumplere", "seteazarotare", "seteazasimbol", "seteazasinonime", "seteazasortare", "seteazaspatiu", "seteazaspatiualb", "seteazaspatiuinterliniar", "seteazasubsol", "seteazasus", "seteazatabele", "seteazatabulatori", "seteazatext", "seteazatexteantet", "seteazatextejos", "seteazatextesubsol", "seteazatextesus", "seteazatextetext", "seteazatitlu", "seteazatitluri", "seteazatoleranta", "seteazatranzitiepagina", "seteazatype", "seteazatyping", "seteazaurl", "simbol", "spatiifixate", "spatiu", "spatiufixat", "startaliniatcentru", "startaliniatdreapta", "startaliniatstanga", "startcomponenta", "startculoare", "startdute", "startfundal", "startimpachetat", "startlimba", "startlinie", "startliniemargine", "startmediu", "startmeniuinteractiune", "startprodus", "startproiect", "startpublicatie", "startpuneformula", "startriglatext", "starttitlu", "stivacampuri", "stopaliniatcentru", "stopaliniatdreapta", "stopaliniatstanga", "stopcomponenta", "stopculoare", "stopdute", "stopfundal", "stopimpachetat", "stoplimba", "stoplinie", "stopliniemargine", "stopmediu", "stopmeniuinteractiune", "stopprodus", "stopproiect", "stoppublicatie", "stoppuneformula", "stopriglatext", "stoptitlu", "textumplere", "traduce", "trecilafonttext", "undeva", "valoareculoare", "versiune", "zidinsaptamana" },
+ ["fr"]={ "Caractere", "Caracteres", "Chiffresromains", "JOURSEMAINE", "MOIS", "MOT", "MOTS", "Mot", "Mots", "Numeros", "a", "adaptedisposition", "ajustechamp", "alaligne", "alapage", "aligneadroite", "aligneagauche", "aligneaumilieu", "arriereplan", "baha", "barrecouleur", "barreinteraction", "bas", "bouton", "boutonmenu", "boutonsinteraction", "cacheblocs", "caractere", "caracteres", "champ", "changepolicecorps", "chiffresromains", "clonechamp", "colonne", "commentaire", "comparegroupecouleur", "comparepalette", "completenumeropage", "completeregistre", "composant", "concernant", "convertitnumero", "copitchamp", "corrigeespaceblanc", "couleur", "couleurgrise", "dactylographier", "dans", "datecourante", "de", "definicaractere", "definit", "definitaccent", "definitbloc", "definitblocsection", "definitbuffer", "definitcalque", "definitchamp", "definitcommande", "definitconversion", "definitcouleur", "definitdactylo", "definitdemarrestoppe", "definitdescription", "definitdisposition", "definitenumeration", "definitenvironnementpolicecorps", "definitetiquette", "definitflottant", "definitformatreference", "definitgroupecouleur", "definithbox", "definitjeucolonne", "definitliste", "definitlisteimbriquee", "definitmakeup", "definitmarquage", "definitmenuinteraction", "definitpalette", "definitparagraphes", "definitpilechamp", "definitpolice", "definitpolicecorps", "definitprofil", "definitprogramme", "definitreference", "definitregistre", "definitrevetement", "definitsautdecolonne", "definitsautdepage", "definitsection", "definitsouschamp", "definitstyle", "definitstylepolice", "definitsymbole", "definitsymbolefigure", "definitsynonymepolice", "definitsynonymes", "definittabulation", "definittaillepapier", "definittete", "definittexte", "definittrametableau", "definittri", "definittype", "definitvide", "demarreJScode", "demarreJSpreamble", "demarreLUA", "demarreMP", "demarreMPclip", "demarreMPcode", "demarreMPdefinitions", "demarreMPdrawing", "demarreMPenvironment", "demarreMPextensions", "demarreMPinclusions", "demarreMPinitializations", "demarreMPpage", "demarreMPpositiongraphic", "demarreMPpositionmethod", "demarreMPrun", "demarrePARSEDXML", "demarreTABLE", "demarreTABLEbody", "demarreTABLEfoot", "demarreTABLEhead", "demarreTABLEnext", "demarreTC", "demarreTD", "demarreTDs", "demarreTEX", "demarreTEXpage", "demarreTH", "demarreTN", "demarreTR", "demarreTRs", "demarreTX", "demarreTY", "demarreXML", "demarrealign", "demarrealigneadroite", "demarrealigneagauche", "demarrealigneaumilieu", "demarrealignment", "demarreallmodes", "demarreappendices", "demarrearrangedpages", "demarrearriereplan", "demarreaside", "demarreattachment", "demarrebackmatter", "demarrebar", "demarrebbordermatrix", "demarrebitmapimage", "demarreblockquote", "demarrebodymatter", "demarrebordermatrix", "demarreboxedcolumns", "demarrebtxlabeltext", "demarrebtxrenderingdefinitions", "demarrebuffer", "demarrecases", "demarrecatcodetable", "demarrecenteraligned", "demarrechapter", "demarrecharacteralign", "demarrecheckedfences", "demarrechemical", "demarrechemicaltext", "demarreciter", "demarrecollect", "demarrecollecting", "demarrecolorintent", "demarrecoloronly", "demarrecolorset", "demarrecolumns", "demarrecolumnset", "demarrecolumnsetspan", "demarrecombination", "demarrecomment", "demarrecomposant", "demarrecontextcode", "demarrecontextdefinitioncode", "demarrecouleur", "demarrectxfunction", "demarrectxfunctiondefinition", "demarrecurrentcolor", "demarrecurrentlistentrywrapper", "demarredelimited", "demarredelimitedtext", "demarredisplaymath", "demarredmath", "demarredocument", "demarreeffect", "demarreelement", "demarreembeddedxtable", "demarreendnote", "demarreendofline", "demarreenvironement", "demarreexceptions", "demarreexpanded", "demarreexpandedcollect", "demarreextendedcatcodetable", "demarreexternalfigurecollection", "demarrefacingfloat", "demarrefact", "demarrefigure", "demarrefiguretext", "demarrefittingpage", "demarrefixed", "demarrefloatcombination", "demarrefont", "demarrefontclass", "demarrefontsolution", "demarrefootnote", "demarreformula", "demarreformulas", "demarreframed", "demarreframedcell", "demarreframedcontent", "demarreframedrow", "demarreframedtable", "demarreframedtext", "demarrefrontmatter", "demarregraphictext", "demarregridsnapping", "demarregroupe", "demarrehanging", "demarrehbox", "demarrehboxestohbox", "demarrehboxregister", "demarreheadtext", "demarrehelptext", "demarrehiding", "demarrehighlight", "demarrehyphenation", "demarreimath", "demarreindentation", "demarreindentedtext", "demarreinteraction", "demarreinterface", "demarreintermezzotext", "demarreintertext", "demarreitemgroup", "demarreitemgroupcolumns", "demarreitemize", "demarreknockout", "demarrelabeltext", "demarrelangue", "demarrelayout", "demarrelegend", "demarreligne", "demarreligneregleetexte", "demarrelinealignment", "demarrelinecorrection", "demarrelinefiller", "demarrelinenumbering", "demarrelines", "demarrelinetable", "demarrelinetablebody", "demarrelinetablecell", "demarrelinetablehead", "demarrelocalfootnotes", "demarrelocalheadsetup", "demarrelocallinecorrection", "demarrelocalnotes", "demarrelocalsetups", "demarrelua", "demarreluacode", "demarreluaparameterset", "demarreluasetups", "demarremakeup", "demarremargereglee", "demarremarginblock", "demarremarkedcontent", "demarremarkpages", "demarremathalignment", "demarremathcases", "demarremathlabeltext", "demarremathmatrix", "demarremathmode", "demarremathstyle", "demarrematrices", "demarrematrix", "demarremaxaligned", "demarremdformula", "demarremenuinteraction", "demarremiddlealigned", "demarremiddlemakeup", "demarremixedcolumns", "demarremode", "demarremodeset", "demarremodule", "demarremoduletestsection", "demarrempformula", "demarrenamedsection", "demarrenamedsubformulas", "demarrenarrow", "demarrenarrower", "demarrenegative", "demarrenicelyfilledbox", "demarrenointerference", "demarrenotallmodes", "demarrenotext", "demarrenotmode", "demarreoperatortext", "demarreopposite", "demarreoutputstream", "demarreoverlay", "demarreoverprint", "demarrepagecolumns", "demarrepagecomment", "demarrepagefigure", "demarrepagelayout", "demarrepagemakeup", "demarrepar", "demarreparagraph", "demarreparagraphs", "demarreparagraphscell", "demarreparbuilder", "demarrepart", "demarrepath", "demarreplacechemical", "demarreplacefigure", "demarreplaceflottant", "demarreplaceformule", "demarreplacegraphic", "demarreplaceintermezzo", "demarreplacelegend", "demarreplacepairedbox", "demarreplacetable", "demarrepositioning", "demarrepositionoverlay", "demarrepositive", "demarrepostponing", "demarrepostponingnotes", "demarreprefixtext", "demarreprocessassignmentcommand", "demarreprocessassignmentlist", "demarreprocesscommacommand", "demarreprocesscommalist", "demarreproduit", "demarreprojet", "demarreprotect", "demarreprotectedcolors", "demarrepublication", "demarrepunctuation", "demarrequotation", "demarrequote", "demarrerandomized", "demarrerandomseed", "demarrerawsetups", "demarrereadingfile", "demarrereferenceprefix", "demarreregime", "demarrereusableMPgraphic", "demarreruby", "demarrescript", "demarresdformula", "demarresection", "demarresectionblock", "demarresectionblockenvironment", "demarresectionlevel", "demarresetups", "demarreshapebox", "demarreshift", "demarresidebar", "demarresimplecolumns", "demarrespecialitem", "demarrespeech", "demarrespformula", "demarresplitformula", "demarresplittext", "demarrespread", "demarrestandardmakeup", "demarrestaticMPfigure", "demarrestaticMPgraphic", "demarrestrictinspectnextcharacter", "demarrestrut", "demarrestyle", "demarresubformulas", "demarresubject", "demarresubjectlevel", "demarresubsection", "demarresubsentence", "demarresubstack", "demarresubsubject", "demarresubsubsection", "demarresubsubsubject", "demarresubsubsubsection", "demarresubsubsubsubject", "demarresubsubsubsubsection", "demarresubsubsubsubsubject", "demarresuffixtext", "demarresymbolset", "demarretable", "demarretablehead", "demarretables", "demarretabletail", "demarretabletext", "demarretabulate", "demarretabulatehead", "demarretabulatetail", "demarretagged", "demarretaglabeltext", "demarretete", "demarretexcode", "demarretexdefinition", "demarretext", "demarretextbackground", "demarretextbackgroundmanual", "demarretextcolor", "demarretextcolorintent", "demarretextflow", "demarretextmakeup", "demarretitle", "demarretokenlist", "demarretokens", "demarretransparent", "demarretypescript", "demarretypescriptcollection", "demarretyping", "demarreuniqueMPgraphic", "demarreuniqueMPpagegraphic", "demarreunittext", "demarreunpacked", "demarreusableMPgraphic", "demarreuseMPgraphic", "demarreusemathstyleparameter", "demarreuserdata", "demarreusingbtxspecification", "demarreva", "demarrevbox", "demarrevboxregister", "demarrevboxtohbox", "demarrevboxtohboxseparator", "demarreviewerlayer", "demarrevtop", "demarrevtopregister", "demarrexcell", "demarrexcellgroup", "demarrexcolumn", "demarrexgroup", "demarrexmldisplayverbatim", "demarrexmlinlineverbatim", "demarrexmlraw", "demarrexmlsetups", "demarrexrow", "demarrexrowgroup", "demarrextable", "demarrextablebody", "demarrextablefoot", "demarrextablehead", "demarrextablenext", "determinecaracteristiqueliste", "determinecaracteristiquesregistre", "determinenumerotete", "echelle", "ecran", "ecritdansliste", "ecritentreliste", "element", "elements", "environement", "espace", "espacefixe", "espacesfixes", "etire", "faitreference", "fichierdactylo", "figureexterne", "gardeblocs", "grille", "haut", "inconnu", "installelangue", "joursemaine", "langue", "langueprincipale", "largeurligne", "ligneh", "lignenoire", "ligneregleetexte", "lignesnoires", "llongueurliste", "marquage", "marquepage", "mathematique", "menuinteraction", "mois", "montrecadre", "montrecouleur", "montredisposition", "montreedition", "montreenvironnementpolicecorps", "montregrille", "montregroupecouleur", "montrejeusymboles", "montremakeup", "montrepalette", "montrepolicecorps", "montrereglages", "montrestruts", "motdroit", "numeroformule", "numeropage", "numeros", "numerotete", "numerotetecourant", "obtientmarquage", "oriente", "periodes", "pilechamp", "placecoteacote", "placeflottant", "placeformule", "placelesunsaudessusdesautres", "placeliste", "placelisteinmbriquee", "placemarquespages", "placenotespdp", "placenotespdplocales", "placenumeropage", "placenumerotete", "placeregistre", "placesousformule", "placesurgrille", "placetextetete", "prendbuffer", "produit", "programme", "projet", "qqpart", "razmarquage", "referencepage", "referencetexte", "reflete", "reglealignement", "reglearrangement", "reglearriereplan", "reglearriereplans", "reglebarreinteraction", "reglebloc", "regleblocsection", "reglebuffer", "reglecapitales", "reglechamp", "reglechamps", "regleclipping", "reglecolonnes", "reglecommentaire", "reglecommentairepage", "reglecompoetroite", "reglecomposeenalinea", "reglecouleur", "reglecouleurs", "regledactylo", "regledemarrestoppe", "regledisposition", "regleecraninteraction", "regleelements", "regleencadre", "regleentete", "regleenumerations", "regleepaisseurligne", "regleespaceblanc", "regleespacement", "regleespacementinterligne", "regleflottant", "regleflottants", "regleformulaires", "regleformules", "reglegroupeselements", "regleinf", "regleinteraction", "regleintitule", "regleintitules", "reglejeucolonne", "reglejeusymboles", "reglelangue", "reglelignes", "reglelignesnoires", "reglelignesreglestexte", "regleliste", "reglelisteimbriquee", "reglemakeup", "reglemargereglee", "reglemarquage", "reglemarquagehyphenation", "reglemenuinteraction", "reglenotepdp", "reglenumeropage", "reglenumerotationligne", "reglenumerotationpage", "reglenumerotationparagraphe", "reglenumerotete", "regleoriente", "reglepalette", "reglepapier", "regleparagraphes", "reglepdp", "regleplacementopposition", "reglepolicecorps", "reglepositionnement", "regleprogrammes", "reglereferencage", "regleregistre", "regleremplitligne", "regleremplitlignesreglees", "regleseparationflottant", "reglesousnumeropage", "reglesup", "reglesynonymes", "regletableaux", "regletabulation", "regletaillepapier", "regletete", "regletetes", "regletexte", "regletextesentete", "regletextesinf", "regletextespdp", "regletextessup", "regletextestexte", "regletolerance", "regletraitsfins", "regletransitionspage", "regletri", "regletype", "regleurl", "remplitligne", "remplitlignesreglees", "remplittexte", "sansespace", "sanslignesenteteetpdp", "sanslignessupetinf", "selectionneblocs", "separeflottant", "settext", "sousnumeropage", "stoppeJScode", "stoppeJSpreamble", "stoppeLUA", "stoppeMP", "stoppeMPclip", "stoppeMPcode", "stoppeMPdefinitions", "stoppeMPdrawing", "stoppeMPenvironment", "stoppeMPextensions", "stoppeMPinclusions", "stoppeMPinitializations", "stoppeMPpage", "stoppeMPpositiongraphic", "stoppeMPpositionmethod", "stoppeMPrun", "stoppePARSEDXML", "stoppeTABLE", "stoppeTABLEbody", "stoppeTABLEfoot", "stoppeTABLEhead", "stoppeTABLEnext", "stoppeTC", "stoppeTD", "stoppeTDs", "stoppeTEX", "stoppeTEXpage", "stoppeTH", "stoppeTN", "stoppeTR", "stoppeTRs", "stoppeTX", "stoppeTY", "stoppeXML", "stoppealign", "stoppealigneadroite", "stoppealigneagauche", "stoppealigneaumilieu", "stoppealignment", "stoppeallmodes", "stoppeappendices", "stoppearrangedpages", "stoppearriereplan", "stoppeaside", "stoppeattachment", "stoppebackmatter", "stoppebar", "stoppebbordermatrix", "stoppebitmapimage", "stoppeblockquote", "stoppebodymatter", "stoppebordermatrix", "stoppeboxedcolumns", "stoppebtxlabeltext", "stoppebtxrenderingdefinitions", "stoppebuffer", "stoppecases", "stoppecatcodetable", "stoppecenteraligned", "stoppechapter", "stoppecharacteralign", "stoppecheckedfences", "stoppechemical", "stoppechemicaltext", "stoppecollect", "stoppecollecting", "stoppecolorintent", "stoppecoloronly", "stoppecolorset", "stoppecolumns", "stoppecolumnset", "stoppecolumnsetspan", "stoppecombination", "stoppecomment", "stoppecomposant", "stoppecontextcode", "stoppecontextdefinitioncode", "stoppecouleur", "stoppectxfunction", "stoppectxfunctiondefinition", "stoppecurrentcolor", "stoppecurrentlistentrywrapper", "stoppedelimited", "stoppedelimitedtext", "stoppedisplaymath", "stoppedmath", "stoppedocument", "stoppeeffect", "stoppeelement", "stoppeembeddedxtable", "stoppeendnote", "stoppeendofline", "stoppeenvironement", "stoppeexceptions", "stoppeexpanded", "stoppeexpandedcollect", "stoppeextendedcatcodetable", "stoppeexternalfigurecollection", "stoppefacingfloat", "stoppefact", "stoppefigure", "stoppefiguretext", "stoppefittingpage", "stoppefixed", "stoppefloatcombination", "stoppefont", "stoppefontclass", "stoppefontsolution", "stoppefootnote", "stoppeformula", "stoppeformulas", "stoppeframed", "stoppeframedcell", "stoppeframedcontent", "stoppeframedrow", "stoppeframedtable", "stoppeframedtext", "stoppefrontmatter", "stoppegraphictext", "stoppegridsnapping", "stoppegroupe", "stoppehanging", "stoppehbox", "stoppehboxestohbox", "stoppehboxregister", "stoppeheadtext", "stoppehelptext", "stoppehiding", "stoppehighlight", "stoppehyphenation", "stoppeimath", "stoppeindentation", "stoppeindentedtext", "stoppeinteraction", "stoppeinterface", "stoppeintermezzotext", "stoppeintertext", "stoppeitemgroup", "stoppeitemgroupcolumns", "stoppeitemize", "stoppeknockout", "stoppelabeltext", "stoppelangue", "stoppelayout", "stoppelegend", "stoppeligne", "stoppeligneregleetexte", "stoppelinealignment", "stoppelinecorrection", "stoppelinefiller", "stoppelinenumbering", "stoppelines", "stoppelinetable", "stoppelinetablebody", "stoppelinetablecell", "stoppelinetablehead", "stoppelocalfootnotes", "stoppelocalheadsetup", "stoppelocallinecorrection", "stoppelocalnotes", "stoppelocalsetups", "stoppelua", "stoppeluacode", "stoppeluaparameterset", "stoppeluasetups", "stoppemakeup", "stoppemargereglee", "stoppemarginblock", "stoppemarkedcontent", "stoppemarkpages", "stoppemathalignment", "stoppemathcases", "stoppemathlabeltext", "stoppemathmatrix", "stoppemathmode", "stoppemathstyle", "stoppematrices", "stoppematrix", "stoppemaxaligned", "stoppemdformula", "stoppemenuinteraction", "stoppemiddlealigned", "stoppemiddlemakeup", "stoppemixedcolumns", "stoppemode", "stoppemodeset", "stoppemodule", "stoppemoduletestsection", "stoppempformula", "stoppenamedsection", "stoppenamedsubformulas", "stoppenarrow", "stoppenarrower", "stoppenegative", "stoppenicelyfilledbox", "stoppenointerference", "stoppenotallmodes", "stoppenotext", "stoppenotmode", "stoppeoperatortext", "stoppeopposite", "stoppeoutputstream", "stoppeoverlay", "stoppeoverprint", "stoppepagecolumns", "stoppepagecomment", "stoppepagefigure", "stoppepagelayout", "stoppepagemakeup", "stoppepar", "stoppeparagraph", "stoppeparagraphs", "stoppeparagraphscell", "stoppeparbuilder", "stoppepart", "stoppepath", "stoppeplacechemical", "stoppeplacefigure", "stoppeplaceflottant", "stoppeplaceformule", "stoppeplacegraphic", "stoppeplaceintermezzo", "stoppeplacelegend", "stoppeplacepairedbox", "stoppeplacetable", "stoppepositioning", "stoppepositionoverlay", "stoppepositive", "stoppepostponing", "stoppepostponingnotes", "stoppeprefixtext", "stoppeprocessassignmentcommand", "stoppeprocessassignmentlist", "stoppeprocesscommacommand", "stoppeprocesscommalist", "stoppeproduit", "stoppeprojet", "stoppeprotect", "stoppeprotectedcolors", "stoppepublication", "stoppepunctuation", "stoppequotation", "stoppequote", "stopperandomized", "stopperandomseed", "stopperawsetups", "stoppereadingfile", "stoppereferenceprefix", "stopperegime", "stoppereusableMPgraphic", "stopperuby", "stoppescript", "stoppesdformula", "stoppesection", "stoppesectionblock", "stoppesectionblockenvironment", "stoppesectionlevel", "stoppesetups", "stoppeshapebox", "stoppeshift", "stoppesidebar", "stoppesimplecolumns", "stoppespecialitem", "stoppespeech", "stoppespformula", "stoppesplitformula", "stoppesplittext", "stoppespread", "stoppestandardmakeup", "stoppestaticMPfigure", "stoppestaticMPgraphic", "stoppestrictinspectnextcharacter", "stoppestrut", "stoppestyle", "stoppesubformulas", "stoppesubject", "stoppesubjectlevel", "stoppesubsection", "stoppesubsentence", "stoppesubstack", "stoppesubsubject", "stoppesubsubsection", "stoppesubsubsubject", "stoppesubsubsubsection", "stoppesubsubsubsubject", "stoppesubsubsubsubsection", "stoppesubsubsubsubsubject", "stoppesuffixtext", "stoppesymbolset", "stoppetable", "stoppetablehead", "stoppetables", "stoppetabletail", "stoppetabletext", "stoppetabulate", "stoppetabulatehead", "stoppetabulatetail", "stoppetagged", "stoppetaglabeltext", "stoppetete", "stoppetexcode", "stoppetexdefinition", "stoppetext", "stoppetextbackground", "stoppetextbackgroundmanual", "stoppetextcolor", "stoppetextcolorintent", "stoppetextflow", "stoppetextmakeup", "stoppetitle", "stoppetokenlist", "stoppetokens", "stoppetransparent", "stoppetypescript", "stoppetypescriptcollection", "stoppetyping", "stoppeuniqueMPgraphic", "stoppeuniqueMPpagegraphic", "stoppeunittext", "stoppeunpacked", "stoppeusableMPgraphic", "stoppeuseMPgraphic", "stoppeusemathstyleparameter", "stoppeuserdata", "stoppeusingbtxspecification", "stoppeva", "stoppevbox", "stoppevboxregister", "stoppevboxtohbox", "stoppevboxtohboxseparator", "stoppeviewerlayer", "stoppevtop", "stoppevtopregister", "stoppexcell", "stoppexcellgroup", "stoppexcolumn", "stoppexgroup", "stoppexmldisplayverbatim", "stoppexmlinlineverbatim", "stoppexmlraw", "stoppexmlsetups", "stoppexrow", "stoppexrowgroup", "stoppextable", "stoppextablebody", "stoppextablefoot", "stoppextablehead", "stoppextablenext", "symbole", "tapebuffer", "textenotepdp", "traduire", "traiteblocs", "traitfin", "traitsfins", "uneligne", "utiliseJSscripts", "utiliseURL", "utiliseblocs", "utilisechemin", "utilisedocumentexterne", "utilisefigureexterne", "utilisemodule", "utilisepsiteaudioexterne", "utilisesymboles", "utiliseurl", "va", "vaalaboite", "vaalapage", "vaenbas", "valeurcouleur", "vide" },
+ ["it"]={ "GIORNOSETTIMANA", "Lettera", "Lettere", "MESE", "Numeri", "Numeriromani", "PAROLA", "PAROLE", "Parola", "Parole", "adattacampo", "adattalayout", "al", "allineacentro", "allineadestra", "allineasinistra", "ambiente", "ap", "apagina", "barracolori", "barrainterazione", "cambiaafontdeltesto", "campi", "capello", "chim", "circondato", "clonacampo", "colonna", "colore", "coloregrigio", "commento", "componenet", "confrontagruppocolori", "confrontatavolozza", "convertinumero", "copiacampo", "correggispaziobianco", "da", "daqualcheparte", "data", "datadioggi", "definisci", "definisciaccento", "definisciambientefontdeltesto", "definisciblocco", "definiscibloccosezione", "definiscibuffer", "definiscicampo", "definiscicapoversi", "definiscicarattere", "definiscicolore", "definiscicomando", "definisciconversione", "definiscidescrizione", "definiscidimensionicarta", "definiscielenco", "definiscielencocombinato", "definiscienumerazione", "definiscietichetta", "definiscifigurasimbolo", "definiscifont", "definiscifontdeltesto", "definisciformatoriferimento", "definiscigruppocolonne", "definiscigruppocolori", "definiscihbox", "definisciincorniciato", "definisciiniziatermina", "definiscilayout", "definiscimakeup", "definiscimarcatura", "definiscimenuinterazione", "definiscimodellotabella", "definiscioggettomobile", "definisciordinamento", "definisciprofilo", "definisciprogramma", "definisciregistro", "definisciriferimento", "definiscisezione", "definiscisimbolo", "definiscisinonimi", "definiscisinonimofont", "definiscisottocampo", "definiscisovrapposizione", "definiscistackcampi", "definiscistile", "definiscistilefont", "definiscitabulato", "definiscitavolozza", "definiscitesta", "definiscitesto", "definiscitestoincorniciato", "definiscitype", "definiscityping", "determinacaratteristicheregistro", "determinacarattersticheelenco", "determinanumerotesta", "elaborablocchi", "elementi", "elemento", "figuraesterna", "giornosettimana", "griglia", "ignoto", "impostaallineamento", "impostaampiezzariga", "impostabarrainterazione", "impostablocco", "impostabloccosezione", "impostabuffer", "impostacampi", "impostacampo", "impostacapoversi", "impostacaption", "impostacaptions", "impostacima", "impostaclippling", "impostacolonne", "impostacolore", "impostacolori", "impostacommento", "impostacommentopagina", "impostadimensionicarta", "impostaelementi", "impostaelencazioni", "impostaelenco", "impostaelencocombinato", "impostaenumerazioni", "impostafondo", "impostafontdeltesto", "impostaforms", "impostaformule", "impostagruppocolonne", "impostaincorniciato", "impostainiziatermina", "impostainstestazione", "impostainterazione", "impostainterlinea", "impostalayout", "impostalineemargine", "impostalineenere", "impostalineeriempimento", "impostalineesottili", "impostalineetesto", "impostalingua", "impostamaiuscole", "impostamakeup", "impostamarcatura", "impostamenuinterazione", "impostamenzione", "impostanotepdp", "impostanumerazionecapoversi", "impostanumerazionepagina", "impostanumerazionerighe", "impostanumeropagina", "impostanumerosottopagina", "impostanumerotesta", "impostaoggettimobili", "impostaoggettomobile", "impostaordinamento", "impostaparranging", "impostapdp", "impostapiustretto", "impostaposizionamento", "impostaposizionamentoopposti", "impostaprogrammi", "impostaregistro", "impostarientro", "impostariferimento", "impostarighe", "impostarigheriempimento", "impostarigovuoto", "impostarotazione", "impostaschermointerazione", "impostasegnosillabazione", "impostasetsimboli", "impostasfondi", "impostasfondo", "impostasinonimi", "impostaspaziatura", "impostaspaziobianco", "impostaspezzamentooggettomobile", "impostatabelle", "impostatabulato", "impostatavolozza", "impostatesta", "impostateste", "impostatesticima", "impostatestifondo", "impostatestiincorniciati", "impostatestiintestazioni", "impostatestipdp", "impostatesto", "impostatestotesti", "impostatolleranza", "impostatransizionepagina", "impostatype", "impostatyping", "impostaurl", "incorniciato", "iniziaJScode", "iniziaJSpreamble", "iniziaLUA", "iniziaMP", "iniziaMPclip", "iniziaMPcode", "iniziaMPdefinitions", "iniziaMPdrawing", "iniziaMPenvironment", "iniziaMPextensions", "iniziaMPinclusions", "iniziaMPinitializations", "iniziaMPpage", "iniziaMPpositiongraphic", "iniziaMPpositionmethod", "iniziaMPrun", "iniziaPARSEDXML", "iniziaTABLE", "iniziaTABLEbody", "iniziaTABLEfoot", "iniziaTABLEhead", "iniziaTABLEnext", "iniziaTC", "iniziaTD", "iniziaTDs", "iniziaTEX", "iniziaTEXpage", "iniziaTH", "iniziaTN", "iniziaTR", "iniziaTRs", "iniziaTX", "iniziaTY", "iniziaXML", "iniziaalign", "iniziaalignment", "iniziaallineacentro", "iniziaallineadestra", "iniziaallineasinistra", "iniziaallmodes", "iniziaambiente", "iniziaappendices", "iniziaarrangedpages", "iniziaaside", "iniziaattachment", "iniziabackmatter", "iniziabar", "iniziabbordermatrix", "iniziabitmapimage", "iniziablockquote", "iniziabodymatter", "iniziabordermatrix", "iniziaboxedcolumns", "iniziabtxlabeltext", "iniziabtxrenderingdefinitions", "iniziabuffer", "iniziacases", "iniziacatcodetable", "iniziacenteraligned", "iniziachapter", "iniziacharacteralign", "iniziacheckedfences", "iniziachemical", "iniziachemicaltext", "iniziacollect", "iniziacollecting", "iniziacolore", "iniziacolorintent", "iniziacoloronly", "iniziacolorset", "iniziacolumns", "iniziacolumnset", "iniziacolumnsetspan", "iniziacombination", "iniziacomment", "iniziacomponenet", "iniziacontextcode", "iniziacontextdefinitioncode", "iniziactxfunction", "iniziactxfunctiondefinition", "iniziacurrentcolor", "iniziacurrentlistentrywrapper", "iniziadelimited", "iniziadelimitedtext", "iniziadisplaymath", "iniziadmath", "iniziadocument", "iniziaeffect", "iniziaelement", "iniziaelemento", "iniziaembeddedxtable", "iniziaendnote", "iniziaendofline", "iniziaexceptions", "iniziaexpanded", "iniziaexpandedcollect", "iniziaextendedcatcodetable", "iniziaexternalfigurecollection", "iniziafacingfloat", "iniziafact", "iniziafigure", "iniziafiguretext", "iniziafittingpage", "iniziafixed", "iniziafloatcombination", "iniziafont", "iniziafontclass", "iniziafontsolution", "iniziafootnote", "iniziaformula", "iniziaformulas", "iniziaframedcell", "iniziaframedcontent", "iniziaframedrow", "iniziaframedtable", "iniziaframedtext", "iniziafrontmatter", "iniziagraphictext", "iniziagridsnapping", "iniziahanging", "iniziahbox", "iniziahboxestohbox", "iniziahboxregister", "iniziaheadtext", "iniziahelptext", "iniziahiding", "iniziahighlight", "iniziahyphenation", "iniziaimath", "iniziaimpaccato", "iniziaincorniciato", "iniziaindentation", "iniziaindentedtext", "iniziainteraction", "iniziainterface", "iniziaintermezzotext", "iniziaintertext", "iniziaitemgroup", "iniziaitemgroupcolumns", "iniziaitemize", "iniziaknockout", "inizialabeltext", "inizialayout", "inizialegend", "inizialinealignment", "inizialineamargine", "inizialineatesto", "inizialinecorrection", "inizialinefiller", "inizialinenumbering", "inizialines", "inizialinetable", "inizialinetablebody", "inizialinetablecell", "inizialinetablehead", "inizialingua", "inizialocalfootnotes", "inizialocalheadsetup", "inizialocallinecorrection", "inizialocalnotes", "inizialocalsetups", "inizialua", "inizialuacode", "inizialuaparameterset", "inizialuasetups", "iniziamakeup", "iniziamarginblock", "iniziamarkedcontent", "iniziamarkpages", "iniziamathalignment", "iniziamathcases", "iniziamathlabeltext", "iniziamathmatrix", "iniziamathmode", "iniziamathstyle", "iniziamatrices", "iniziamatrix", "iniziamaxaligned", "iniziamdformula", "iniziamenuinterattivo", "iniziamettiformula", "iniziamiddlealigned", "iniziamiddlemakeup", "iniziamixedcolumns", "iniziamode", "iniziamodeset", "iniziamodule", "iniziamoduletestsection", "iniziampformula", "inizianamedsection", "inizianamedsubformulas", "inizianarrow", "inizianarrower", "inizianegative", "inizianicelyfilledbox", "inizianointerference", "inizianotallmodes", "inizianotext", "inizianotmode", "iniziaoperatortext", "iniziaopposite", "iniziaoutputstream", "iniziaoverlay", "iniziaoverprint", "iniziapagecolumns", "iniziapagecomment", "iniziapagefigure", "iniziapagelayout", "iniziapagemakeup", "iniziapar", "iniziaparagraph", "iniziaparagraphs", "iniziaparagraphscell", "iniziaparbuilder", "iniziapart", "iniziapath", "iniziaplacechemical", "iniziaplacefigure", "iniziaplacefloat", "iniziaplacegraphic", "iniziaplaceintermezzo", "iniziaplacelegend", "iniziaplacepairedbox", "iniziaplacetable", "iniziapositioning", "iniziapositionoverlay", "iniziapositive", "iniziapostponing", "iniziapostponingnotes", "iniziaprefixtext", "iniziaprocessassignmentcommand", "iniziaprocessassignmentlist", "iniziaprocesscommacommand", "iniziaprocesscommalist", "iniziaprodotto", "iniziaprogetto", "iniziaprotect", "iniziaprotectedcolors", "iniziapubblicazione", "iniziapunctuation", "iniziaquotation", "iniziaquote", "iniziarandomized", "iniziarandomseed", "iniziarawsetups", "iniziareadingfile", "iniziareferenceprefix", "iniziaregime", "iniziareusableMPgraphic", "iniziariga", "iniziaruby", "iniziascript", "iniziasdformula", "iniziasection", "iniziasectionblock", "iniziasectionblockenvironment", "iniziasectionlevel", "iniziasetups", "iniziasfondo", "iniziashapebox", "iniziashift", "iniziasidebar", "iniziasimplecolumns", "iniziaspecialitem", "iniziaspeech", "iniziaspformula", "iniziasplitformula", "iniziasplittext", "iniziaspread", "iniziastandardmakeup", "iniziastaticMPfigure", "iniziastaticMPgraphic", "iniziastrictinspectnextcharacter", "iniziastrut", "iniziastyle", "iniziasubformulas", "iniziasubject", "iniziasubjectlevel", "iniziasubsection", "iniziasubsentence", "iniziasubstack", "iniziasubsubject", "iniziasubsubsection", "iniziasubsubsubject", "iniziasubsubsubsection", "iniziasubsubsubsubject", "iniziasubsubsubsubsection", "iniziasubsubsubsubsubject", "iniziasuffixtext", "iniziasymbolset", "iniziatable", "iniziatablehead", "iniziatables", "iniziatabletail", "iniziatabletext", "iniziatabulate", "iniziatabulatehead", "iniziatabulatetail", "iniziatagged", "iniziataglabeltext", "iniziatesta", "iniziatexcode", "iniziatexdefinition", "iniziatext", "iniziatextbackground", "iniziatextbackgroundmanual", "iniziatextcolor", "iniziatextcolorintent", "iniziatextflow", "iniziatextmakeup", "iniziatitle", "iniziatokenlist", "iniziatokens", "iniziatransparent", "iniziatypescript", "iniziatypescriptcollection", "iniziatyping", "iniziauniqueMPgraphic", "iniziauniqueMPpagegraphic", "iniziaunittext", "iniziaunpacked", "iniziausableMPgraphic", "iniziauseMPgraphic", "iniziausemathstyleparameter", "iniziauserdata", "iniziausingbtxspecification", "iniziavaia", "iniziavbox", "iniziavboxregister", "iniziavboxtohbox", "iniziavboxtohboxseparator", "iniziaviewerlayer", "iniziavtop", "iniziavtopregister", "iniziaxcell", "iniziaxcellgroup", "iniziaxcolumn", "iniziaxgroup", "iniziaxmldisplayverbatim", "iniziaxmlinlineverbatim", "iniziaxmlraw", "iniziaxmlsetups", "iniziaxrow", "iniziaxrowgroup", "iniziaxtable", "iniziaxtablebody", "iniziaxtablefoot", "iniziaxtablehead", "iniziaxtablenext", "inriga", "installalingua", "intorno", "lettera", "lettere", "lineanera", "lineasottile", "lineatesto", "lineenere", "lineeriempimento", "lineesottili", "lingua", "linguaprincipale", "lunghezzaelenco", "marcatura", "matematica", "menuinterattivo", "mese", "mettielenco", "mettielencocombinato", "mettifiancoafianco", "mettiformula", "mettiingriglia", "mettinotepdp", "mettinotepdplocali", "mettinumeropagina", "mettiregistro", "mettisegnalibro", "mettisottoformula", "mettiunosullaltro", "mostraambientefontdeltesto", "mostracolore", "mostracornice", "mostrafontdeltesto", "mostragriglia", "mostragruppocolori", "mostraimpostazioni", "mostralyout", "mostramakeup", "mostrasetsimboli", "mostrastampa", "mostrastruts", "mostratavolozza", "nascondiblocchi", "nientelineecimafondo", "nientelineintestazionepdp", "nientespazio", "nota", "numeri", "numeriromani", "numeroformula", "numeropagina", "numeropaginacompleto", "numerotesta", "numerotestacorrente", "pagina", "paroladestra", "ped", "pedap", "perlungo", "posizionanumerotesta", "posizionatestotesta", "posizione", "prendibuffer", "prendimarcatura", "prodotto", "progetto", "programma", "pulsante", "pulsantemenu", "pulsantinterazione", "punti", "qualcheriga", "reimpostamarcatura", "rif", "riferimento", "riferimentopagina", "riferimentotesto", "riflessione", "rigariempimento", "rigovuoto", "ruota", "scala", "schermo", "scrividentroelenco", "scriviinelenco", "segnalibro", "selezionablocchi", "settext", "sfondo", "simbolo", "spazifissi", "spazio", "spaziofisso", "spessoreriga", "spezzaoggettomobile", "stackcampi", "stirato", "terminaJScode", "terminaJSpreamble", "terminaLUA", "terminaMP", "terminaMPclip", "terminaMPcode", "terminaMPdefinitions", "terminaMPdrawing", "terminaMPenvironment", "terminaMPextensions", "terminaMPinclusions", "terminaMPinitializations", "terminaMPpage", "terminaMPpositiongraphic", "terminaMPpositionmethod", "terminaMPrun", "terminaPARSEDXML", "terminaTABLE", "terminaTABLEbody", "terminaTABLEfoot", "terminaTABLEhead", "terminaTABLEnext", "terminaTC", "terminaTD", "terminaTDs", "terminaTEX", "terminaTEXpage", "terminaTH", "terminaTN", "terminaTR", "terminaTRs", "terminaTX", "terminaTY", "terminaXML", "terminaalign", "terminaalignment", "terminaallineacentro", "terminaallineadestra", "terminaallineasinistra", "terminaallmodes", "terminaambiente", "terminaappendices", "terminaarrangedpages", "terminaaside", "terminaattachment", "terminabackmatter", "terminabar", "terminabbordermatrix", "terminabitmapimage", "terminablockquote", "terminabodymatter", "terminabordermatrix", "terminaboxedcolumns", "terminabtxlabeltext", "terminabtxrenderingdefinitions", "terminabuffer", "terminacases", "terminacatcodetable", "terminacenteraligned", "terminachapter", "terminacharacteralign", "terminacheckedfences", "terminachemical", "terminachemicaltext", "terminacollect", "terminacollecting", "terminacolore", "terminacolorintent", "terminacoloronly", "terminacolorset", "terminacolumns", "terminacolumnset", "terminacolumnsetspan", "terminacombination", "terminacomment", "terminacomponenet", "terminacontextcode", "terminacontextdefinitioncode", "terminactxfunction", "terminactxfunctiondefinition", "terminacurrentcolor", "terminacurrentlistentrywrapper", "terminadelimited", "terminadelimitedtext", "terminadisplaymath", "terminadmath", "terminadocument", "terminaeffect", "terminaelement", "terminaelemento", "terminaembeddedxtable", "terminaendnote", "terminaendofline", "terminaexceptions", "terminaexpanded", "terminaexpandedcollect", "terminaextendedcatcodetable", "terminaexternalfigurecollection", "terminafacingfloat", "terminafact", "terminafigure", "terminafiguretext", "terminafittingpage", "terminafixed", "terminafloatcombination", "terminafont", "terminafontclass", "terminafontsolution", "terminafootnote", "terminaformula", "terminaformulas", "terminaframedcell", "terminaframedcontent", "terminaframedrow", "terminaframedtable", "terminaframedtext", "terminafrontmatter", "terminagraphictext", "terminagridsnapping", "terminahanging", "terminahbox", "terminahboxestohbox", "terminahboxregister", "terminaheadtext", "terminahelptext", "terminahiding", "terminahighlight", "terminahyphenation", "terminaimath", "terminaimpaccato", "terminaincorniciato", "terminaindentation", "terminaindentedtext", "terminainteraction", "terminainterface", "terminaintermezzotext", "terminaintertext", "terminaitemgroup", "terminaitemgroupcolumns", "terminaitemize", "terminaknockout", "terminalabeltext", "terminalayout", "terminalegend", "terminalinealignment", "terminalineamargine", "terminalineatesto", "terminalinecorrection", "terminalinefiller", "terminalinenumbering", "terminalines", "terminalinetable", "terminalinetablebody", "terminalinetablecell", "terminalinetablehead", "terminalingua", "terminalocalfootnotes", "terminalocalheadsetup", "terminalocallinecorrection", "terminalocalnotes", "terminalocalsetups", "terminalua", "terminaluacode", "terminaluaparameterset", "terminaluasetups", "terminamakeup", "terminamarginblock", "terminamarkedcontent", "terminamarkpages", "terminamathalignment", "terminamathcases", "terminamathlabeltext", "terminamathmatrix", "terminamathmode", "terminamathstyle", "terminamatrices", "terminamatrix", "terminamaxaligned", "terminamdformula", "terminamenuinterattivo", "terminamettiformula", "terminamiddlealigned", "terminamiddlemakeup", "terminamixedcolumns", "terminamode", "terminamodeset", "terminamodule", "terminamoduletestsection", "terminampformula", "terminanamedsection", "terminanamedsubformulas", "terminanarrow", "terminanarrower", "terminanegative", "terminanicelyfilledbox", "terminanointerference", "terminanotallmodes", "terminanotext", "terminanotmode", "terminaoperatortext", "terminaopposite", "terminaoutputstream", "terminaoverlay", "terminaoverprint", "terminapagecolumns", "terminapagecomment", "terminapagefigure", "terminapagelayout", "terminapagemakeup", "terminapar", "terminaparagraph", "terminaparagraphs", "terminaparagraphscell", "terminaparbuilder", "terminapart", "terminapath", "terminaplacechemical", "terminaplacefigure", "terminaplacefloat", "terminaplacegraphic", "terminaplaceintermezzo", "terminaplacelegend", "terminaplacepairedbox", "terminaplacetable", "terminapositioning", "terminapositionoverlay", "terminapositive", "terminapostponing", "terminapostponingnotes", "terminaprefixtext", "terminaprocessassignmentcommand", "terminaprocessassignmentlist", "terminaprocesscommacommand", "terminaprocesscommalist", "terminaprodotto", "terminaprogetto", "terminaprotect", "terminaprotectedcolors", "terminapubblicazione", "terminapunctuation", "terminaquotation", "terminaquote", "terminarandomized", "terminarandomseed", "terminarawsetups", "terminareadingfile", "terminareferenceprefix", "terminaregime", "terminareusableMPgraphic", "terminariga", "terminaruby", "terminascript", "terminasdformula", "terminasection", "terminasectionblock", "terminasectionblockenvironment", "terminasectionlevel", "terminasetups", "terminasfondo", "terminashapebox", "terminashift", "terminasidebar", "terminasimplecolumns", "terminaspecialitem", "terminaspeech", "terminaspformula", "terminasplitformula", "terminasplittext", "terminaspread", "terminastandardmakeup", "terminastaticMPfigure", "terminastaticMPgraphic", "terminastrictinspectnextcharacter", "terminastrut", "terminastyle", "terminasubformulas", "terminasubject", "terminasubjectlevel", "terminasubsection", "terminasubsentence", "terminasubstack", "terminasubsubject", "terminasubsubsection", "terminasubsubsubject", "terminasubsubsubsection", "terminasubsubsubsubject", "terminasubsubsubsubsection", "terminasubsubsubsubsubject", "terminasuffixtext", "terminasymbolset", "terminatable", "terminatablehead", "terminatables", "terminatabletail", "terminatabletext", "terminatabulate", "terminatabulatehead", "terminatabulatetail", "terminatagged", "terminataglabeltext", "terminatesta", "terminatexcode", "terminatexdefinition", "terminatext", "terminatextbackground", "terminatextbackgroundmanual", "terminatextcolor", "terminatextcolorintent", "terminatextflow", "terminatextmakeup", "terminatitle", "terminatokenlist", "terminatokens", "terminatransparent", "terminatypescript", "terminatypescriptcollection", "terminatyping", "terminauniqueMPgraphic", "terminauniqueMPpagegraphic", "terminaunittext", "terminaunpacked", "terminausableMPgraphic", "terminauseMPgraphic", "terminausemathstyleparameter", "terminauserdata", "terminausingbtxspecification", "terminavaia", "terminavbox", "terminavboxregister", "terminavboxtohbox", "terminavboxtohboxseparator", "terminaviewerlayer", "terminavtop", "terminavtopregister", "terminaxcell", "terminaxcellgroup", "terminaxcolumn", "terminaxgroup", "terminaxmldisplayverbatim", "terminaxmlinlineverbatim", "terminaxmlraw", "terminaxmlsetups", "terminaxrow", "terminaxrowgroup", "terminaxtable", "terminaxtablebody", "terminaxtablefoot", "terminaxtablehead", "terminaxtablenext", "testonotapdp", "testoriempimento", "tieniblocchi", "traduci", "usaJSscripts", "usaURL", "usablocco", "usacartella", "usacolonnasonoraesterna", "usadocumentoesterno", "usafiguraesterna", "usamodulo", "usasimboli", "usaurl", "vaia", "vaiabox", "vaiapagina", "vaigiu", "valorecolore", "versione" },
+ ["nl"]={ "Cijfers", "Kap", "Letter", "Letters", "MAAND", "Romeins", "WEEKDAG", "WOORD", "WOORDEN", "Woord", "Woorden", "achtergrond", "bepaalkopnummer", "bepaallijstkenmerken", "bepaalregisterkenmerken", "bewaarbuffer", "blanko", "blokje", "blokjes", "cijfers", "converteernummer", "copieerveld", "corrigeerwitruimte", "datum", "definieer", "definieeraccent", "definieeralineas", "definieerblok", "definieerbuffer", "definieercombinatie", "definieercommando", "definieerconversie", "definieerfiguursymbool", "definieerfont", "definieerfontstijl", "definieerfontsynoniem", "definieerhbox", "definieeringesprongentext", "definieerinteractiemenu", "definieeritemgroep", "definieerkadertekst", "definieerkarakter", "definieerkleur", "definieerkleurgroep", "definieerkolomgroep", "definieerkolomovergang", "definieerkop", "definieerkorps", "definieerkorpsomgeving", "definieerlayer", "definieerlayout", "definieerletter", "definieerlijst", "definieermarkering", "definieeromlijnd", "definieeropmaak", "definieeroverlay", "definieerpaginaovergang", "definieerpalet", "definieerpapierformaat", "definieerplaats", "definieerplaatsblok", "definieerprofiel", "definieerprogramma", "definieerreferentie", "definieerreferentieformaat", "definieerregister", "definieersamengesteldelijst", "definieersectie", "definieersectieblok", "definieersorteren", "definieerstartstop", "definieersubveld", "definieersymbool", "definieersynoniemen", "definieertabelvorm", "definieertabulatie", "definieertekst", "definieertekstachtergrond", "definieertype", "definieertypen", "definieerveld", "definieerveldstapel", "definieerwiskundeuitlijnen", "doordefinieren", "doorlabelen", "doornummeren", "dunnelijn", "dunnelijnen", "eenregel", "ergens", "externfiguur", "formulenummer", "gebruikJSscripts", "gebruikURL", "gebruikblokken", "gebruikexterndocument", "gebruikexternfiguur", "gebruikexterngeluidsfragment", "gebruikmodule", "gebruikpad", "gebruiksymbolen", "gebruiktypescript", "gebruiktypescriptfile", "gebruikurl", "geenbovenenonderregels", "geenhoofdenvoetregels", "geenspatie", "grijskleur", "haalbuffer", "haalmarkering", "haarlijn", "handhaafblokken", "hoofdtaal", "hoog", "huidigedatum", "huidigekopnummer", "inlijnd", "inregel", "installeertaal", "interactiebalk", "interactiebuttons", "interactiemenu", "invullijnen", "invulregel", "invultekst", "kleur", "kleurenbalk", "kleurwaarde", "kloonveld", "kolom", "kopnummer", "laag", "laho", "legeregels", "letter", "letters", "lijndikte", "lijstlengte", "maand", "markeer", "naar", "naarbox", "naarpagina", "nokap", "noot", "omgeving", "omlaag", "omlijnd", "onbekend", "onderdeel", "op", "oppagina", "pagina", "paginanummer", "paginareferentie", "paslayoutaan", "passendveld", "plaatsbookmarks", "plaatsformule", "plaatskopnummer", "plaatskoptekst", "plaatslijst", "plaatslijstmetsynoniemen", "plaatslokalevoetnoten", "plaatsnaastelkaar", "plaatsonderelkaar", "plaatsopgrid", "plaatspaginanummer", "plaatsplaatsblok", "plaatsregister", "plaatsruwelijst", "plaatssamengesteldelijst", "plaatssubformule", "plaatsvoetnoten", "positioneer", "produkt", "programma", "projekt", "punten", "refereer", "referentie", "regellinks", "regelmidden", "regelrechts", "resetmarkering", "romeins", "rooster", "roteer", "schaal", "scherm", "schrijfnaarlijst", "schrijftussenlijst", "selecteerblokken", "som", "spatie", "spiegel", "splitsplaatsblok", "startachtergrond", "startinteractiemenu", "startkantlijn", "startkleur", "startkop", "startlokalevoetnoten", "startmargeblok", "startnaar", "startomgeving", "startomlijnd", "startonderdeel", "startopelkaar", "startplaatsformule", "startplaatsplaatsblok", "startprodukt", "startprojekt", "startpublicatie", "startregel", "startregelcorrectie", "startregellinks", "startregelmidden", "startregelrechts", "startsom", "starttaal", "starttekstachtergrond", "starttekstlijn", "startuitlijnen", "stelachtergrondenin", "stelachtergrondin", "stelalineasin", "stelarrangerenin", "stelblankoin", "stelblokin", "stelblokjesin", "stelblokkopjein", "stelblokkopjesin", "stelbovenin", "stelboventekstenin", "stelbufferin", "stelciterenin", "stelclipin", "stelcommentaarin", "steldoordefinierenin", "steldoornummerenin", "steldunnelijnenin", "stelformulein", "stelformulesin", "stelformulierenin", "stelhoofdin", "stelhoofdtekstenin", "stelingesprongentextin", "stelinmargein", "stelinspringenin", "stelinteractiebalkin", "stelinteractiein", "stelinteractiemenuin", "stelinteractieschermin", "stelinterliniein", "stelinvullijnenin", "stelinvulregelsin", "stelitemgroepin", "stelitemsin", "stelkadertekstenin", "stelkadertekstin", "stelkantlijnin", "stelkapitalenin", "stelkleurenin", "stelkleurin", "stelkolomgroepin", "stelkolomgroepregelsin", "stelkolomgroepstartin", "stelkolommenin", "stelkopin", "stelkopnummerin", "stelkoppeltekenin", "stelkoppenin", "stelkorpsin", "stellayoutin", "stellijndiktein", "stellijstin", "stelmargeblokkenin", "stelmarkeringin", "stelnaastplaatsenin", "stelomlijndin", "stelonderin", "stelondertekstenin", "stelopmaakin", "stelopsommingenin", "stelpaginacommentaarin", "stelpaginanummerin", "stelpaginanummeringin", "stelpaginaovergangenin", "stelpaletin", "stelpapierformaatin", "stelpapierin", "stelparagraafnummerenin", "stelplaatsblokin", "stelplaatsblokkenin", "stelplaatsbloksplitsenin", "stelplaatsin", "stelpositionerenin", "stelprogrammasin", "stelrefererenin", "stelregelnummerenin", "stelregelsin", "stelregisterin", "stelroterenin", "stelsamengesteldelijstin", "stelsectieblokin", "stelsmallerin", "stelsorterenin", "stelspatieringin", "stelstartstopin", "stelsubpaginanummerin", "stelsymboolsetin", "stelsynoniemenin", "steltaalin", "steltabellenin", "steltabulatiein", "steltekstachtergrondin", "steltekstin", "steltekstinhoudin", "steltekstlijnenin", "stelteksttekstenin", "steltolerantiein", "steltypein", "steltypenin", "steluitlijnenin", "stelurlin", "stelveldenin", "stelveldin", "stelvoetin", "stelvoetnotenin", "stelvoettekstenin", "stelwiskundeuitlijnenin", "stelwitruimtein", "stopachtergrond", "stopinteractiemenu", "stopkantlijn", "stopkleur", "stopkop", "stoplokalevoetnoten", "stopmargeblok", "stopnaar", "stopomgeving", "stopomlijnd", "stoponderdeel", "stopopelkaar", "stopplaatsformule", "stopplaatsplaatsblok", "stopprodukt", "stopprojekt", "stoppublicatie", "stopregel", "stopregelcorrectie", "stopregellinks", "stopregelmidden", "stopregelrechts", "stopsom", "stoptaal", "stoptekstachtergrond", "stoptekstlijn", "stopuitlijnen", "subpaginanummer", "switchnaarkorps", "symbool", "taal", "tekstlijn", "tekstreferentie", "testkolom", "testpagina", "toelichting", "toongrid", "tooninstellingen", "toonkader", "toonkleur", "toonkleurgroep", "toonkorps", "toonkorpsomgeving", "toonlayout", "toonopmaak", "toonpalet", "toonprint", "toonstruts", "toonsymboolset", "uit", "uitgerekt", "vastespatie", "vastespaties", "veld", "veldstapel", "verbergblokken", "vergelijkkleurgroep", "vergelijkpalet", "versie", "vertaal", "verwerkblokken", "voetnoottekst", "volledigepaginanummer", "volledigregister", "voluit", "weekdag", "wiskunde", "woordrechts" },
+ ["pe"]={ "آیتم", "آیتمها", "آینه", "از", "استÙاده‌بلوکها", "استÙاده‌دستخط‌تایپ", "استÙاده‌شکل‌خارجی", "استÙاده‌قطعه‌موزیک‌خارجی", "استÙاده‌مدول", "استÙاده‌مسیر", "استÙاده‌نمادها", "استÙاده‌نوشتارخارجی", "استÙاده‌پرونده‌دستخط‌تایپ", "اعدادلاتین", "اÙزودن", "انتخاب‌بلوکها", "بارگذاری‌آرایش", "بارگذاری‌آیتمها", "بارگذاری‌ارجاع", "بارگذاری‌اندازه‌برگ", "بارگذاری‌باریکتر", "بارگذاری‌باÙر", "بارگذاری‌بالا", "بارگذاری‌بردباری", "بارگذاری‌برنامه‌ها", "بارگذاری‌برگ", "بارگذاری‌بلوک", "بارگذاری‌بلوک‌بخش", "بارگذاری‌تایپ", "بارگذاری‌تایپ‌کردن", "بارگذاری‌ترتیب", "بارگذاری‌تنظیم", "بارگذاری‌تنظیم‌ریاضی", "بارگذاری‌ته‌برگ", "بارگذاری‌تورÙتگی", "بارگذاری‌توضیح", "بارگذاری‌توضیح‌صÙحه", "بارگذاری‌ثبت", "بارگذاری‌جانشانی", "بارگذاری‌جدولها", "بارگذاری‌جدول‌بندی", "بارگذاری‌خالی", "بارگذاری‌خطها", "بارگذاری‌خطهای‌حاشیه", "بارگذاری‌خطهای‌سیاه", "بارگذاری‌خطهای‌متن", "بارگذاری‌خطهای‌مجموعه‌ستون", "بارگذاری‌خطها‌ی‌نازک", "بارگذاری‌درج‌درخطها", "بارگذاری‌درج‌مخالÙ", "بارگذاری‌دوران", "بارگذاری‌رنگ", "بارگذاری‌رنگها", "بارگذاری‌زبان", "بارگذاری‌ستونها", "بارگذاری‌سر", "بارگذاری‌سربرگ", "بارگذاری‌سرها", "بارگذاری‌شرح", "بارگذاری‌شرحها", "بارگذاری‌شروع‌مجموعه‌ستون", "بارگذاری‌شروع‌پایان", "بارگذاری‌شماره‌زیرصÙحه", "بارگذاری‌شماره‌سر", "بارگذاری‌شماره‌صÙحه", "بارگذاری‌شماره‌گذاریها", "بارگذاری‌شماره‌گذاری‌صÙحه", "بارگذاری‌شماره‌گذاری‌پاراگراÙ", "بارگذاری‌شماره‌‌گذاری‌خط", "بارگذاری‌شناور", "بارگذاری‌شناورها", "بارگذاری‌شکاÙتن‌شناورها", "بارگذاری‌طرح", "بارگذاری‌طرح‌بندی", "بارگذاری‌عرض‌خط", "بارگذاری‌Ùاصله‌بین‌خط", "بارگذاری‌Ùرمولها", "بارگذاری‌Ùضای‌سÙید", "بارگذاری‌Ùضا‌گذاری", "بارگذاری‌قالبی", "بارگذاری‌قلم‌متن", "بارگذاری‌لوح", "بارگذاری‌لیست", "بارگذاری‌لیست‌ترکیبی", "بارگذاری‌مترادÙها", "بارگذاری‌متن", "بارگذاری‌متنهای‌بالا", "بارگذاری‌متن‌سربرگ", "بارگذاری‌متن‌قالبی", "بارگذاری‌متن‌متنها", "بارگذاری‌متن‌پانوشت", "بارگذاری‌متن‌پایین", "بارگذاری‌مجموعه‌ستون", "بارگذاری‌مجموعه‌نماد", "بارگذاری‌منوی‌پانل", "بارگذاری‌مکان‌گذاری", "بارگذاری‌میدان", "بارگذاری‌میدانها", "بارگذاری‌میله‌پانل", "بارگذاری‌نشانه‌شکستن", "بارگذاری‌نشانه‌گذاری", "بارگذاری‌نقل", "بارگذاری‌پاراگراÙها", "بارگذاری‌پانل", "بارگذاری‌پانوشتها", "بارگذاری‌پایین", "بارگذاری‌پرده‌پانل", "بارگذاری‌پرکردن‌خطها", "بارگذاری‌پس‌زمینه", "بارگذاری‌پس‌زمینه‌ها", "بارگذاری‌چیدن", "بارگذاری‌گذارصÙحه", "بارگذاری‌گروههای‌آیتم", "بارگذاری‌گروه‌آیتم", "بازنشانی‌نشانه‌گذاری", "بدون‌خط‌بالاوپایین", "بدون‌خط‌سروته‌برگ", "بدون‌Ùضا", "برنامه", "بروبه", "بروبه‌جعبه", "بروبه‌صÙحه", "بروپایین", "بلند", "بلوکهای‌پردازش", "بلوکها‌پنهان", "بنویس‌بین‌لیست", "بنویس‌در‌لیست", "تاریخ", "تاریخ‌جاری", "تایپ", "تایپ‌باÙر", "تایپ‌پرونده", "ترجمه", "تعریÙ", "تعریÙ‌آرایش", "تعریÙ‌الگوی‌جدول", "تعریÙ‌اندازه‌برگ", "تعریÙ‌باÙر", "تعریÙ‌بخش", "تعریÙ‌برنامه", "تعریÙ‌برچسب", "تعریÙ‌بلوک", "تعریÙ‌بلوک‌بخش", "تعریÙ‌تایپ", "تعریÙ‌تایپ‌کردن", "تعریÙ‌تبدیل", "تعریÙ‌ترتیب", "تعریÙ‌ترکیب", "تعریÙ‌تنظیم‌ریاضی", "تعریÙ‌توده‌میدان", "تعریÙ‌ثبت", "تعریÙ‌جانشانی", "تعریÙ‌جدول‌بندی", "تعریÙ‌جعبه‌‌اÙÙ‚ÛŒ", "تعریÙ‌حرÙ", "تعریÙ‌رنگ", "تعریÙ‌زیرمیدان", "تعریÙ‌سبک", "تعریÙ‌سبک‌قلم", "تعریÙ‌سر", "تعریÙ‌شرح", "تعریÙ‌شروع‌پایان", "تعریÙ‌شماره‌بندی", "تعریÙ‌شمایل‌مرجع", "تعریÙ‌شناور", "تعریÙ‌شکستن‌ستون", "تعریÙ‌شکست‌صÙحه", "تعریÙ‌طرح‌بندی", "تعریÙ‌Ùرمان", "تعریÙ‌قالبی", "تعریÙ‌قلم", "تعریÙ‌قلم‌متن", "تعریÙ‌لایه", "تعریÙ‌لهجه", "تعریÙ‌لوح", "تعریÙ‌لیست", "تعریÙ‌لیست‌ترکیبی", "تعریÙ‌مترادÙها", "تعریÙ‌مترادÙ‌قلم", "تعریÙ‌متن", "تعریÙ‌متن‌قالبی", "تعریÙ‌مجموعه‌ستون", "تعریÙ‌محیط‌قلم‌بدنه", "تعریÙ‌مرجع", "تعریÙ‌منوی‌پانل", "تعریÙ‌میدان", "تعریÙ‌نشانه‌گذاری", "تعریÙ‌نماد", "تعریÙ‌نمادشکل", "تعریÙ‌پاراگراÙها", "تعریÙ‌پروÙایل", "تعریÙ‌پوشش", "تعریÙ‌گروه‌آیتم", "تعریÙ‌گروه‌رنگ", "تعیین‌شماره‌سر", "تعیین‌محتوای‌متن", "تعیین‌مشخصات‌ثبت", "تعیین‌مشخصات‌لیست", "تغییربه‌قلم‌بدنه", "تنظیم‌راست", "تنظیم‌طرح‌بندی", "تنظیم‌وسط", "توجه", "توری", "تولید", "تک", "ثبت‌کامل", "حرÙ", "حرÙها", "Ø­Ùظ‌بلوکها", "خالی", "خطهای‌سیاه", "خطهای‌نازک", "خطها‌خالی", "خط‌سیاه", "خط‌متن", "خط‌مو", "خط‌نازک", "خ‌ا", "خ‌ع", "در", "درج‌ثبت", "درج‌درخط", "درج‌درخطها", "درج‌درمتن", "درج‌در‌بالای‌یکدیگر", "درج‌در‌توری", "درج‌زیرÙرمول", "درج‌شماره‌سر", "درج‌شماره‌صÙحه", "درج‌شناور", "درج‌Ùرمول", "درج‌لیست", "درج‌لیست‌خام", "درج‌لیست‌مختلط", "درج‌متن‌سر", "درج‌پانوشتها", "درج‌پانوشتهای‌موضعی", "درج‌چوب‌خط", "درج‌کنار‌به‌کنار", "درخط", "درصÙحه", "درقالبی", "درمورد", "درون", "درپر", "دریاÙت‌باÙر", "دریاÙت‌نشانه", "دوران", "دکمه", "دکمه‌منو", "دکمه‌پانل", "رج", "رنگ", "رنگ‌خاکستری", "روزهÙته", "ریاضی", "زبان", "زبان‌اصلی", "ستون", "ستون‌امتحان", "سرپوش‌کوچک‌نه", "شروعJScode", "شروعJSpreamble", "شروعLUA", "شروعMP", "شروعMPclip", "شروعMPcode", "شروعMPdefinitions", "شروعMPdrawing", "شروعMPenvironment", "شروعMPextensions", "شروعMPinclusions", "شروعMPinitializations", "شروعMPpage", "شروعMPpositiongraphic", "شروعMPpositionmethod", "شروعMPrun", "شروعPARSEDXML", "شروعTABLE", "شروعTABLEbody", "شروعTABLEfoot", "شروعTABLEhead", "شروعTABLEnext", "شروعTC", "شروعTD", "شروعTDs", "شروعTEX", "شروعTEXpage", "شروعTH", "شروعTN", "شروعTR", "شروعTRs", "شروعTX", "شروعTY", "شروعXML", "شروعalign", "شروعalignment", "شروعallmodes", "شروعappendices", "شروعarrangedpages", "شروعaside", "شروعattachment", "شروعbackmatter", "شروعbar", "شروعbbordermatrix", "شروعbitmapimage", "شروعblockquote", "شروعbodymatter", "شروعbordermatrix", "شروعboxedcolumns", "شروعbtxlabeltext", "شروعbtxrenderingdefinitions", "شروعbuffer", "شروعcases", "شروعcatcodetable", "شروعcenteraligned", "شروعchapter", "شروعcharacteralign", "شروعcheckedfences", "شروعchemical", "شروعchemicaltext", "شروعcollect", "شروعcollecting", "شروعcolorintent", "شروعcoloronly", "شروعcolorset", "شروعcolumns", "شروعcolumnset", "شروعcolumnsetspan", "شروعcombination", "شروعcomment", "شروعcontextcode", "شروعcontextdefinitioncode", "شروعctxfunction", "شروعctxfunctiondefinition", "شروعcurrentcolor", "شروعcurrentlistentrywrapper", "شروعdelimited", "شروعdelimitedtext", "شروعdisplaymath", "شروعdmath", "شروعdocument", "شروعeffect", "شروعelement", "شروعembeddedxtable", "شروعendnote", "شروعendofline", "شروعexceptions", "شروعexpanded", "شروعexpandedcollect", "شروعextendedcatcodetable", "شروعexternalfigurecollection", "شروعfacingfloat", "شروعfact", "شروعfigure", "شروعfiguretext", "شروعfittingpage", "شروعfixed", "شروعfloatcombination", "شروعfont", "شروعfontclass", "شروعfontsolution", "شروعfootnote", "شروعformula", "شروعformulas", "شروعframedcell", "شروعframedcontent", "شروعframedrow", "شروعframedtable", "شروعframedtext", "شروعfrontmatter", "شروعgraphictext", "شروعgridsnapping", "شروعhanging", "شروعhbox", "شروعhboxestohbox", "شروعhboxregister", "شروعheadtext", "شروعhelptext", "شروعhiding", "شروعhighlight", "شروعhyphenation", "شروعimath", "شروعindentation", "شروعindentedtext", "شروعinteraction", "شروعinterface", "شروعintermezzotext", "شروعintertext", "شروعitemgroup", "شروعitemgroupcolumns", "شروعitemize", "شروعknockout", "شروعlabeltext", "شروعlayout", "شروعlegend", "شروعlinealignment", "شروعlinecorrection", "شروعlinefiller", "شروعlinenumbering", "شروعlines", "شروعlinetable", "شروعlinetablebody", "شروعlinetablecell", "شروعlinetablehead", "شروعlocalfootnotes", "شروعlocalheadsetup", "شروعlocallinecorrection", "شروعlocalnotes", "شروعlocalsetups", "شروعlua", "شروعluacode", "شروعluaparameterset", "شروعluasetups", "شروعmakeup", "شروعmarginblock", "شروعmarkedcontent", "شروعmarkpages", "شروعmathalignment", "شروعmathcases", "شروعmathlabeltext", "شروعmathmatrix", "شروعmathmode", "شروعmathstyle", "شروعmatrices", "شروعmatrix", "شروعmaxaligned", "شروعmdformula", "شروعmiddlealigned", "شروعmiddlemakeup", "شروعmixedcolumns", "شروعmode", "شروعmodeset", "شروعmodule", "شروعmoduletestsection", "شروعmpformula", "شروعnamedsection", "شروعnamedsubformulas", "شروعnarrow", "شروعnarrower", "شروعnegative", "شروعnicelyfilledbox", "شروعnointerference", "شروعnotallmodes", "شروعnotext", "شروعnotmode", "شروعoperatortext", "شروعopposite", "شروعoutputstream", "شروعoverlay", "شروعoverprint", "شروعpagecolumns", "شروعpagecomment", "شروعpagefigure", "شروعpagelayout", "شروعpagemakeup", "شروعpar", "شروعparagraph", "شروعparagraphs", "شروعparagraphscell", "شروعparbuilder", "شروعpart", "شروعpath", "شروعplacechemical", "شروعplacefigure", "شروعplacegraphic", "شروعplaceintermezzo", "شروعplacelegend", "شروعplacepairedbox", "شروعplacetable", "شروعpositioning", "شروعpositionoverlay", "شروعpositive", "شروعpostponing", "شروعpostponingnotes", "شروعprefixtext", "شروعprocessassignmentcommand", "شروعprocessassignmentlist", "شروعprocesscommacommand", "شروعprocesscommalist", "شروعprotect", "شروعprotectedcolors", "شروعpunctuation", "شروعquotation", "شروعquote", "شروعrandomized", "شروعrandomseed", "شروعrawsetups", "شروعreadingfile", "شروعreferenceprefix", "شروعregime", "شروعreusableMPgraphic", "شروعruby", "شروعscript", "شروعsdformula", "شروعsection", "شروعsectionblock", "شروعsectionblockenvironment", "شروعsectionlevel", "شروعsetups", "شروعshapebox", "شروعshift", "شروعsidebar", "شروعsimplecolumns", "شروعspecialitem", "شروعspeech", "شروعspformula", "شروعsplitformula", "شروعsplittext", "شروعspread", "شروعstandardmakeup", "شروعstaticMPfigure", "شروعstaticMPgraphic", "شروعstrictinspectnextcharacter", "شروعstrut", "شروعstyle", "شروعsubformulas", "شروعsubject", "شروعsubjectlevel", "شروعsubsection", "شروعsubsentence", "شروعsubstack", "شروعsubsubject", "شروعsubsubsection", "شروعsubsubsubject", "شروعsubsubsubsection", "شروعsubsubsubsubject", "شروعsubsubsubsubsection", "شروعsubsubsubsubsubject", "شروعsuffixtext", "شروعsymbolset", "شروعtable", "شروعtablehead", "شروعtables", "شروعtabletail", "شروعtabletext", "شروعtabulate", "شروعtabulatehead", "شروعtabulatetail", "شروعtagged", "شروعtaglabeltext", "شروعtexcode", "شروعtexdefinition", "شروعtext", "شروعtextbackground", "شروعtextbackgroundmanual", "شروعtextcolor", "شروعtextcolorintent", "شروعtextflow", "شروعtextmakeup", "شروعtitle", "شروعtokenlist", "شروعtokens", "شروعtransparent", "شروعtypescript", "شروعtypescriptcollection", "شروعtyping", "شروعuniqueMPgraphic", "شروعuniqueMPpagegraphic", "شروعunittext", "شروعunpacked", "شروعusableMPgraphic", "شروعuseMPgraphic", "شروعusemathstyleparameter", "شروعuserdata", "شروعusingbtxspecification", "شروعvbox", "شروعvboxregister", "شروعvboxtohbox", "شروعvboxtohboxseparator", "شروعviewerlayer", "شروعvtop", "شروعvtopregister", "شروعxcell", "شروعxcellgroup", "شروعxcolumn", "شروعxgroup", "شروعxmldisplayverbatim", "شروعxmlinlineverbatim", "شروعxmlraw", "شروعxmlsetups", "شروعxrow", "شروعxrowgroup", "شروعxtable", "شروعxtablebody", "شروعxtablefoot", "شروعxtablehead", "شروعxtablenext", "شروعآیتم", "شروعبروبه", "شروعتنظیم‌راست", "شروعتنظیم‌وسط", "شروعتولید", "شروعخط‌حاشیه", "شروعخط‌متن", "شروعدرج‌شناور", "شروعدرج‌Ùرمول", "شروعرنگ", "شروعزبان", "شروعسر", "شروعÙشرده", "شروعقالبی", "شروعمحیط", "شروعمنوی‌پانل", "شروعمولÙÙ‡", "شروعنشر", "شروعپروژه", "شروعپس‌زمینه", "شروعچپ‌چین", "شروع‌خط", "شماره‌زیرصÙحه", "شماره‌سر", "شماره‌سرجاری", "شماره‌صÙحه", "شماره‌صÙحه‌کامل", "شماره‌Ùرمول", "شماره‌مبدل", "شماره‌ها", "شکاÙتن‌شناور", "شکل‌خارجی", "صÙحه", "صÙحه‌تست", "طول‌لیست", "عرض‌خط", "Ùضا", "Ùضاهای‌ثابت", "Ùضای‌ثابت", "Ùضای‌سÙیدصحیح", "قالبی", "لوح‌مقایسه", "ماه", "متن‌پانوشت", "محیط", "مراجعه", "مرجع", "مرجع‌صÙحه", "مرجع‌متن", "مقایسه‌گروه‌رنگ", "مقداررنگ", "مقیاس", "منوی‌پانل", "مولÙÙ‡", "مکان", "میدان", "میدان‌شبیه‌سازی", "میدان‌پشته", "میدان‌کپی", "میله‌رنگ", "میله‌پانل", "ناشناس", "نسخه", "نشانه‌گذاری", "نصب‌زبان", "نقطه‌ها", "نماد", "نمایش‌آرایش", "نمایش‌بارگذاریها", "نمایش‌بستها", "نمایش‌توری", "نمایش‌رنگ", "نمایش‌طرح‌بندی", "نمایش‌قالب", "نمایش‌قلم‌بدنه", "نمایش‌لوح", "نمایش‌مجموعه‌علامت", "نمایش‌محیط‌قلم‌بدنه", "نمایش‌چاپ", "نمایش‌گروه‌رنگ", "پابا", "پایانJScode", "پایانJSpreamble", "پایانLUA", "پایانMP", "پایانMPclip", "پایانMPcode", "پایانMPdefinitions", "پایانMPdrawing", "پایانMPenvironment", "پایانMPextensions", "پایانMPinclusions", "پایانMPinitializations", "پایانMPpage", "پایانMPpositiongraphic", "پایانMPpositionmethod", "پایانMPrun", "پایانPARSEDXML", "پایانTABLE", "پایانTABLEbody", "پایانTABLEfoot", "پایانTABLEhead", "پایانTABLEnext", "پایانTC", "پایانTD", "پایانTDs", "پایانTEX", "پایانTEXpage", "پایانTH", "پایانTN", "پایانTR", "پایانTRs", "پایانTX", "پایانTY", "پایانXML", "پایانalign", "پایانalignment", "پایانallmodes", "پایانappendices", "پایانarrangedpages", "پایانaside", "پایانattachment", "پایانbackmatter", "پایانbar", "پایانbbordermatrix", "پایانbitmapimage", "پایانblockquote", "پایانbodymatter", "پایانbordermatrix", "پایانboxedcolumns", "پایانbtxlabeltext", "پایانbtxrenderingdefinitions", "پایانbuffer", "پایانcases", "پایانcatcodetable", "پایانcenteraligned", "پایانchapter", "پایانcharacteralign", "پایانcheckedfences", "پایانchemical", "پایانchemicaltext", "پایانcollect", "پایانcollecting", "پایانcolorintent", "پایانcoloronly", "پایانcolorset", "پایانcolumns", "پایانcolumnset", "پایانcolumnsetspan", "پایانcombination", "پایانcomment", "پایانcontextcode", "پایانcontextdefinitioncode", "پایانctxfunction", "پایانctxfunctiondefinition", "پایانcurrentcolor", "پایانcurrentlistentrywrapper", "پایانdelimited", "پایانdelimitedtext", "پایانdisplaymath", "پایانdmath", "پایانdocument", "پایانeffect", "پایانelement", "پایانembeddedxtable", "پایانendnote", "پایانendofline", "پایانexceptions", "پایانexpanded", "پایانexpandedcollect", "پایانextendedcatcodetable", "پایانexternalfigurecollection", "پایانfacingfloat", "پایانfact", "پایانfigure", "پایانfiguretext", "پایانfittingpage", "پایانfixed", "پایانfloatcombination", "پایانfont", "پایانfontclass", "پایانfontsolution", "پایانfootnote", "پایانformula", "پایانformulas", "پایانframedcell", "پایانframedcontent", "پایانframedrow", "پایانframedtable", "پایانframedtext", "پایانfrontmatter", "پایانgraphictext", "پایانgridsnapping", "پایانhanging", "پایانhbox", "پایانhboxestohbox", "پایانhboxregister", "پایانheadtext", "پایانhelptext", "پایانhiding", "پایانhighlight", "پایانhyphenation", "پایانimath", "پایانindentation", "پایانindentedtext", "پایانinteraction", "پایانinterface", "پایانintermezzotext", "پایانintertext", "پایانitemgroup", "پایانitemgroupcolumns", "پایانitemize", "پایانknockout", "پایانlabeltext", "پایانlayout", "پایانlegend", "پایانlinealignment", "پایانlinecorrection", "پایانlinefiller", "پایانlinenumbering", "پایانlines", "پایانlinetable", "پایانlinetablebody", "پایانlinetablecell", "پایانlinetablehead", "پایانlocalfootnotes", "پایانlocalheadsetup", "پایانlocallinecorrection", "پایانlocalnotes", "پایانlocalsetups", "پایانlua", "پایانluacode", "پایانluaparameterset", "پایانluasetups", "پایانmakeup", "پایانmarginblock", "پایانmarkedcontent", "پایانmarkpages", "پایانmathalignment", "پایانmathcases", "پایانmathlabeltext", "پایانmathmatrix", "پایانmathmode", "پایانmathstyle", "پایانmatrices", "پایانmatrix", "پایانmaxaligned", "پایانmdformula", "پایانmiddlealigned", "پایانmiddlemakeup", "پایانmixedcolumns", "پایانmode", "پایانmodeset", "پایانmodule", "پایانmoduletestsection", "پایانmpformula", "پایانnamedsection", "پایانnamedsubformulas", "پایانnarrow", "پایانnarrower", "پایانnegative", "پایانnicelyfilledbox", "پایانnointerference", "پایانnotallmodes", "پایانnotext", "پایانnotmode", "پایانoperatortext", "پایانopposite", "پایانoutputstream", "پایانoverlay", "پایانoverprint", "پایانpagecolumns", "پایانpagecomment", "پایانpagefigure", "پایانpagelayout", "پایانpagemakeup", "پایانpar", "پایانparagraph", "پایانparagraphs", "پایانparagraphscell", "پایانparbuilder", "پایانpart", "پایانpath", "پایانplacechemical", "پایانplacefigure", "پایانplacegraphic", "پایانplaceintermezzo", "پایانplacelegend", "پایانplacepairedbox", "پایانplacetable", "پایانpositioning", "پایانpositionoverlay", "پایانpositive", "پایانpostponing", "پایانpostponingnotes", "پایانprefixtext", "پایانprocessassignmentcommand", "پایانprocessassignmentlist", "پایانprocesscommacommand", "پایانprocesscommalist", "پایانprotect", "پایانprotectedcolors", "پایانpunctuation", "پایانquotation", "پایانquote", "پایانrandomized", "پایانrandomseed", "پایانrawsetups", "پایانreadingfile", "پایانreferenceprefix", "پایانregime", "پایانreusableMPgraphic", "پایانruby", "پایانscript", "پایانsdformula", "پایانsection", "پایانsectionblock", "پایانsectionblockenvironment", "پایانsectionlevel", "پایانsetups", "پایانshapebox", "پایانshift", "پایانsidebar", "پایانsimplecolumns", "پایانspecialitem", "پایانspeech", "پایانspformula", "پایانsplitformula", "پایانsplittext", "پایانspread", "پایانstandardmakeup", "پایانstaticMPfigure", "پایانstaticMPgraphic", "پایانstrictinspectnextcharacter", "پایانstrut", "پایانstyle", "پایانsubformulas", "پایانsubject", "پایانsubjectlevel", "پایانsubsection", "پایانsubsentence", "پایانsubstack", "پایانsubsubject", "پایانsubsubsection", "پایانsubsubsubject", "پایانsubsubsubsection", "پایانsubsubsubsubject", "پایانsubsubsubsubsection", "پایانsubsubsubsubsubject", "پایانsuffixtext", "پایانsymbolset", "پایانtable", "پایانtablehead", "پایانtables", "پایانtabletail", "پایانtabletext", "پایانtabulate", "پایانtabulatehead", "پایانtabulatetail", "پایانtagged", "پایانtaglabeltext", "پایانtexcode", "پایانtexdefinition", "پایانtext", "پایانtextbackground", "پایانtextbackgroundmanual", "پایانtextcolor", "پایانtextcolorintent", "پایانtextflow", "پایانtextmakeup", "پایانtitle", "پایانtokenlist", "پایانtokens", "پایانtransparent", "پایانtypescript", "پایانtypescriptcollection", "پایانtyping", "پایانuniqueMPgraphic", "پایانuniqueMPpagegraphic", "پایانunittext", "پایانunpacked", "پایانusableMPgraphic", "پایانuseMPgraphic", "پایانusemathstyleparameter", "پایانuserdata", "پایانusingbtxspecification", "پایانvbox", "پایانvboxregister", "پایانvboxtohbox", "پایانvboxtohboxseparator", "پایانviewerlayer", "پایانvtop", "پایانvtopregister", "پایانxcell", "پایانxcellgroup", "پایانxcolumn", "پایانxgroup", "پایانxmldisplayverbatim", "پایانxmlinlineverbatim", "پایانxmlraw", "پایانxmlsetups", "پایانxrow", "پایانxrowgroup", "پایانxtable", "پایانxtablebody", "پایانxtablefoot", "پایانxtablehead", "پایانxtablenext", "پایانآیتم", "پایانبروبه", "پایانتنظیم‌راست", "پایانتنظیم‌وسط", "پایانتولید", "پایانخط‌حاشیه", "پایانخط‌متن", "پایاندرج‌شناور", "پایاندرج‌Ùرمول", "پایانرنگ", "پایانزبان", "پایانسر", "پایانÙشرده", "پایانقالبی", "پایانمحیط", "پایانمنوی‌پانل", "پایانمولÙÙ‡", "پایاننشر", "پایانپروژه", "پایانپس‌زمینه", "پایانچپ‌چین", "پایان‌خط", "پایین", "پرده", "پروژه", "پرکردن‌میدان", "پس‌زمینه", "چوبخط", "چپ‌چین", "کشیده", "کلمه‌راست", "گیره", "یادداشت", "یک‌جا", "یک‌خط" },
+ ["ro"]={ "CUVANT", "CUVINTE", "Cuvant", "Cuvinte", "Kap", "LUNA", "Litera", "Litere", "Numere", "Numereromane", "ZIDINSAPTAMANA", "adapteazaaspect", "adubuffer", "adumarcaje", "afiseazaaspect", "afiseazaculoare", "afiseazafonttext", "afiseazagrid", "afiseazagrupculoare", "afiseazamakeup", "afiseazamediufonttext", "afiseazapaleta", "afiseazarama", "afiseazasetari", "afiseazasetsimboluri", "afiseazastruts", "afiseazatiparire", "aliniatcentru", "aliniatdreapta", "aliniatstanga", "ascundeblocuri", "baraculoare", "barainteractiune", "blanc", "butoaneinteractiune", "buton", "butonmeniu", "camp", "cloneazacamp", "coloana", "comparagrupculoare", "comparapaleta", "completeazanumarpagina", "componenta", "convertestenumar", "copiazacamp", "corecteazaspatiualb", "culoare", "culoaregri", "cuvantdreapta", "data", "datacurenta", "defineste", "definesteaccent", "definesteantet", "definestebloc", "definesteblocsectiune", "definestebuffer", "definestecamp", "definestecaracter", "definestecomanda", "definesteconversie", "definesteculoare", "definestedescriere", "definestedimensiunehartie", "definesteenumerare", "definesteeticheta", "definestefloat", "definestefont", "definestefonttext", "definesteformatreferinte", "definestegrupculori", "definestehbox", "definesteinconjurare", "definestelista", "definestelistacombinata", "definestemakeup", "definestemarcaje", "definestemediulfonttext", "definestemeniuinteractiune", "definesteoverlay", "definestepaleta", "definesteparagraf", "definesteprofil", "definesteprogram", "definestereferinte", "definesteregistru", "definestesablontabel", "definestesectiune", "definestesimbol", "definestesimbolfigura", "definestesinonim", "definestesinonimfont", "definestesortare", "definestestartstop", "definestestil", "definestestilfont", "definestestivacampuri", "definestesubcamp", "definestetabulatori", "definestetext", "definestetexteinconjurate", "definestetextinconjurat", "definestetyping", "despre", "determinacaracteristicilelistei", "determinacaracteristiciregistru", "determinanumartitlu", "din", "dute", "dutebox", "dutepagina", "ecran", "element", "faraliniiantetsisubsol", "faraliniisussijos", "faraspatiu", "figuraexterna", "firdepar", "folosesteURL", "folosestebloc", "folosestedirector", "folosestedocumentextern", "folosestefiguraexterna", "folosestemodul", "folosestemuzicaexterna", "folosestescriptJS", "folosestesimboluri", "folosesteurl", "fundal", "grosimelinie", "impartefloat", "inalt", "injos", "inlinie", "instalarelimba", "intins", "jos", "jossus", "la", "lapagina", "limba", "limbaprincipala", "linieneagra", "liniesubtire", "linieumplere", "liniinegre", "liniisubtiri", "litera", "litere", "luna", "lungimelista", "marcaje", "matematica", "mediu", "meniuinteractiune", "necunoscut", "nokap", "nota", "numarformula", "numarpagina", "numartitlu", "numartitlucurent", "numere", "numereromane", "olinie", "pagina", "pastreazablocuri", "pelung", "plaseazapegrid", "plaseazasemnecarte", "potrivestecamp", "pozitie", "proceseazabloc", "produs", "proiect", "puncte", "punedeasuprafiecareia", "punefatainfata", "puneformula", "punelista", "punelistacombinata", "punenotesubsol", "punenotesubsollocale", "punenumarpagina", "puneregistru", "punesubformula", "referinta", "referintapagina", "referintatext", "reflexie", "remarca", "reseteazamarcaje", "riglatext", "rigleumplere", "roteste", "scala", "scriebuffer", "scrieinlista", "scrieintreliste", "selecteazablocuri", "semncarte", "setareitemization", "setarelimba", "setarepozitie", "seteazaaliniat", "seteazaalinierea", "seteazaantet", "seteazaaranjareapag", "seteazaaspect", "seteazabarainteractiune", "seteazablanc", "seteazabloc", "seteazablocsectiune", "seteazabuffer", "seteazacamp", "seteazacampuri", "seteazaclipping", "seteazacoloane", "seteazacomentariu", "seteazacomentariupagina", "seteazaculoare", "seteazaculori", "seteazadimensiunihartie", "seteazaecraninteractiune", "seteazaelemente", "seteazaenumerare", "seteazafloat", "seteazafloats", "seteazafonttext", "seteazaformulare", "seteazaformule", "seteazafundal", "seteazafundaluri", "seteazagrosimelinie", "seteazaimpartireafloat", "seteazainconjurat", "seteazaingust", "seteazainteractiunea", "seteazajos", "seteazalegenda", "seteazalegendele", "seteazaliniesilabe", "seteazaliniesubtire", "seteazalinii", "seteazaliniimargine", "seteazaliniinegre", "seteazaliniiumplere", "seteazalista", "seteazalistacombinata", "seteazamajuscule", "seteazamakeup", "seteazamarcaje", "seteazameniuinteractiune", "seteazaminicitat", "seteazanotasubsol", "seteazanumarpagina", "seteazanumarsubpagina", "seteazanumartitlu", "seteazanumerotarelinii", "seteazanumerotarepagina", "seteazanumerotareparagrafe", "seteazapaleta", "seteazaparagrafe", "seteazaplasareaopozita", "seteazaprograme", "seteazareferinte", "seteazaregistru", "seteazarigletext", "seteazarigleumplere", "seteazarotare", "seteazasimbol", "seteazasinonime", "seteazasortare", "seteazaspatiu", "seteazaspatiualb", "seteazaspatiuinterliniar", "seteazasubsol", "seteazasus", "seteazatabele", "seteazatabulatori", "seteazatext", "seteazatexteantet", "seteazatextejos", "seteazatextesubsol", "seteazatextesus", "seteazatextetext", "seteazatitlu", "seteazatitluri", "seteazatoleranta", "seteazatranzitiepagina", "seteazatype", "seteazatyping", "seteazaurl", "simbol", "spatiifixate", "spatiu", "spatiufixat", "startaliniatcentru", "startaliniatdreapta", "startaliniatstanga", "startcomponenta", "startculoare", "startdute", "startfundal", "startimpachetat", "startlimba", "startlinie", "startliniemargine", "startmediu", "startmeniuinteractiune", "startprodus", "startproiect", "startpublicatie", "startpuneformula", "startriglatext", "starttitlu", "stivacampuri", "stopaliniatcentru", "stopaliniatdreapta", "stopaliniatstanga", "stopcomponenta", "stopculoare", "stopdute", "stopfundal", "stopimpachetat", "stoplimba", "stoplinie", "stopliniemargine", "stopmediu", "stopmeniuinteractiune", "stopprodus", "stopproiect", "stoppublicatie", "stoppuneformula", "stopriglatext", "stoptitlu", "textumplere", "traduce", "trecilafonttext", "undeva", "valoareculoare", "versiune", "zidinsaptamana" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-metafun.lua b/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-metafun.lua
index 4d18d308143..c2d4440f18e 100644
--- a/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-metafun.lua
+++ b/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-metafun.lua
@@ -1,4 +1,4 @@
return {
- ["commands"]={ "loadfile", "loadimage", "loadmodule", "dispose", "nothing", "transparency", "tolist", "topath", "tocycle", "sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian", "tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos", "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", "tanh", "zmod", "paired", "tripled", "unitcircle", "fulldiamond", "unitdiamond", "fullsquare", "unittriangle", "fulltriangle", "llcircle", "lrcircle", "urcircle", "ulcircle", "tcircle", "bcircle", "lcircle", "rcircle", "lltriangle", "lrtriangle", "urtriangle", "ultriangle", "uptriangle", "downtriangle", "lefttriangle", "righttriangle", "triangle", "smoothed", "cornered", "superellipsed", "randomized", "randomizedcontrols", "squeezed", "enlonged", "shortened", "punked", "curved", "unspiked", "simplified", "blownup", "stretched", "enlarged", "leftenlarged", "topenlarged", "rightenlarged", "bottomenlarged", "crossed", "laddered", "randomshifted", "interpolated", "perpendicular", "paralleled", "cutends", "peepholed", "llenlarged", "lrenlarged", "urenlarged", "ulenlarged", "llmoved", "lrmoved", "urmoved", "ulmoved", "rightarrow", "leftarrow", "centerarrow", "drawdoublearrows", "boundingbox", "innerboundingbox", "outerboundingbox", "pushboundingbox", "popboundingbox", "boundingradius", "boundingcircle", "boundingpoint", "crossingunder", "insideof", "outsideof", "bottomboundary", "leftboundary", "topboundary", "rightboundary", "xsized", "ysized", "xysized", "sized", "xyscaled", "intersection_point", "intersection_found", "penpoint", "bbwidth", "bbheight", "withshade", "withcircularshade", "withlinearshade", "defineshade", "shaded", "shadedinto", "withshadecolors", "withshadedomain", "withshademethod", "withshadefactor", "withshadevector", "withshadecenter", "withshadedirection", "withshaderadius", "withshadetransform", "withshadestep", "withshadefraction", "withshadeorigin", "shownshadevector", "shownshadeorigin", "cmyk", "spotcolor", "multitonecolor", "namedcolor", "drawfill", "undrawfill", "inverted", "uncolored", "softened", "grayed", "greyed", "onlayer", "along", "graphictext", "loadfigure", "externalfigure", "figure", "register", "outlinetext", "filloutlinetext", "drawoutlinetext", "outlinetexttopath", "checkedbounds", "checkbounds", "strut", "rule", "withmask", "bitmapimage", "colordecimals", "ddecimal", "dddecimal", "ddddecimal", "colordecimalslist", "textext", "thetextext", "rawtextext", "textextoffset", "texbox", "thetexbox", "rawtexbox", "istextext", "notcached", "verbatim", "thelabel", "label", "autoalign", "transparent", "withtransparency", "property", "properties", "withproperties", "asgroup", "infont", "space", "crlf", "dquote", "percent", "SPACE", "CRLF", "DQUOTE", "PERCENT", "grayscale", "greyscale", "withgray", "withgrey", "colorpart", "colorlike", "readfile", "clearxy", "unitvector", "center", "epsed", "anchored", "originpath", "infinite", "break", "xstretched", "ystretched", "snapped", "pathconnectors", "function", "constructedfunction", "constructedpath", "constructedpairs", "straightfunction", "straightpath", "straightpairs", "curvedfunction", "curvedpath", "curvedpairs", "evenly", "oddly", "condition", "pushcurrentpicture", "popcurrentpicture", "arrowpath", "resetarrows", "tensecircle", "roundedsquare", "colortype", "whitecolor", "blackcolor", "basiccolors", "complementary", "complemented", "resolvedcolor", "normalfill", "normaldraw", "visualizepaths", "detailpaths", "naturalizepaths", "drawboundary", "drawwholepath", "drawpathonly", "visualizeddraw", "visualizedfill", "detaileddraw", "draworigin", "drawboundingbox", "drawpath", "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", "drawpointlabels", "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions", "undashed", "pencilled", "decorated", "redecorated", "undecorated", "passvariable", "passarrayvariable", "tostring", "topair", "format", "formatted", "quotation", "quote", "startpassingvariable", "stoppassingvariable", "eofill", "eoclip", "nofill", "fillup", "eofillup", "area", "addbackground", "shadedup", "shadeddown", "shadedleft", "shadedright", "sortlist", "copylist", "shapedlist", "listtocurves", "listtolines", "listsize", "listlast", "uniquelist", "circularpath", "squarepath", "linearpath", "theoffset", "texmode", "systemmode", "texvar", "texstr", "isarray", "prefix", "dimension", "getmacro", "getdimen", "getcount", "gettoks", "setmacro", "setdimen", "setcount", "settoks", "positionpath", "positioncurve", "positionxy", "positionpxy", "positionwhd", "positionpage", "positionregion", "positionbox", "positionanchor", "positioninregion", "positionatanchor", "wdpart", "htpart", "dppart", "texvar", "texstr", "inpath", "pointof", "leftof", "rightof", "newhash", "disposehash", "inhash", "tohash", "isarray", "prefix", "isobject", "comment", "report", "lua", "mp", "MP", "luacall", "mirrored", "mirroredabout" },
- ["internals"]={ "nocolormodel", "greycolormodel", "graycolormodel", "rgbcolormodel", "cmykcolormodel", "shadefactor", "textextoffset", "textextanchor", "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent", "softlighttransparent", "hardlighttransparent", "colordodgetransparent", "colorburntransparent", "darkentransparent", "lightentransparent", "differencetransparent", "exclusiontransparent", "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent", "ahvariant", "ahdimple", "ahfactor", "ahscale", "metapostversion", "maxdimensions", "drawoptionsfactor", "dq", "sq", "crossingscale", "crossingoption" },
+ ["commands"]={ "loadfile", "loadimage", "loadmodule", "dispose", "nothing", "transparency", "tolist", "topath", "tocycle", "sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian", "tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos", "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", "tanh", "zmod", "paired", "tripled", "unitcircle", "fulldiamond", "unitdiamond", "fullsquare", "unittriangle", "fulltriangle", "llcircle", "lrcircle", "urcircle", "ulcircle", "tcircle", "bcircle", "lcircle", "rcircle", "lltriangle", "lrtriangle", "urtriangle", "ultriangle", "uptriangle", "downtriangle", "lefttriangle", "righttriangle", "triangle", "smoothed", "cornered", "superellipsed", "randomized", "randomizedcontrols", "squeezed", "enlonged", "shortened", "punked", "curved", "unspiked", "simplified", "blownup", "stretched", "enlarged", "leftenlarged", "topenlarged", "rightenlarged", "bottomenlarged", "crossed", "laddered", "randomshifted", "interpolated", "perpendicular", "paralleled", "cutends", "peepholed", "llenlarged", "lrenlarged", "urenlarged", "ulenlarged", "llmoved", "lrmoved", "urmoved", "ulmoved", "rightarrow", "leftarrow", "centerarrow", "drawdoublearrows", "boundingbox", "innerboundingbox", "outerboundingbox", "pushboundingbox", "popboundingbox", "boundingradius", "boundingcircle", "boundingpoint", "crossingunder", "insideof", "outsideof", "bottomboundary", "leftboundary", "topboundary", "rightboundary", "xsized", "ysized", "xysized", "sized", "xyscaled", "intersection_point", "intersection_found", "penpoint", "bbwidth", "bbheight", "withshade", "withcircularshade", "withlinearshade", "defineshade", "shaded", "shadedinto", "withshadecolors", "withshadedomain", "withshademethod", "withshadefactor", "withshadevector", "withshadecenter", "withshadedirection", "withshaderadius", "withshadetransform", "withshadestep", "withshadefraction", "withshadeorigin", "shownshadevector", "shownshadeorigin", "cmyk", "spotcolor", "multitonecolor", "namedcolor", "drawfill", "undrawfill", "inverted", "uncolored", "softened", "grayed", "greyed", "onlayer", "along", "graphictext", "loadfigure", "externalfigure", "figure", "register", "outlinetext", "filloutlinetext", "drawoutlinetext", "outlinetexttopath", "checkedbounds", "checkbounds", "strut", "rule", "withmask", "bitmapimage", "colordecimals", "ddecimal", "dddecimal", "ddddecimal", "colordecimalslist", "textext", "thetextext", "rawtextext", "textextoffset", "texbox", "thetexbox", "rawtexbox", "istextext", "notcached", "keepcached", "verbatim", "thelabel", "label", "autoalign", "transparent", "withtransparency", "property", "properties", "withproperties", "asgroup", "infont", "space", "crlf", "dquote", "percent", "SPACE", "CRLF", "DQUOTE", "PERCENT", "grayscale", "greyscale", "withgray", "withgrey", "colorpart", "colorlike", "readfile", "clearxy", "unitvector", "center", "epsed", "anchored", "originpath", "infinite", "break", "xstretched", "ystretched", "snapped", "pathconnectors", "function", "constructedfunction", "constructedpath", "constructedpairs", "straightfunction", "straightpath", "straightpairs", "curvedfunction", "curvedpath", "curvedpairs", "evenly", "oddly", "condition", "pushcurrentpicture", "popcurrentpicture", "arrowpath", "resetarrows", "tensecircle", "roundedsquare", "colortype", "whitecolor", "blackcolor", "basiccolors", "complementary", "complemented", "resolvedcolor", "normalfill", "normaldraw", "visualizepaths", "detailpaths", "naturalizepaths", "drawboundary", "drawwholepath", "drawpathonly", "visualizeddraw", "visualizedfill", "detaileddraw", "draworigin", "drawboundingbox", "drawpath", "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", "drawpointlabels", "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions", "undashed", "pencilled", "decorated", "redecorated", "undecorated", "passvariable", "passarrayvariable", "tostring", "topair", "format", "formatted", "quotation", "quote", "startpassingvariable", "stoppassingvariable", "eofill", "eoclip", "nofill", "dofill", "fillup", "eofillup", "nodraw", "dodraw", "area", "addbackground", "shadedup", "shadeddown", "shadedleft", "shadedright", "sortlist", "copylist", "shapedlist", "listtocurves", "listtolines", "listsize", "listlast", "uniquelist", "circularpath", "squarepath", "linearpath", "theoffset", "texmode", "systemmode", "texvar", "texstr", "isarray", "prefix", "dimension", "getmacro", "getdimen", "getcount", "gettoks", "setmacro", "setdimen", "setcount", "settoks", "positionpath", "positioncurve", "positionxy", "positionpxy", "positionwhd", "positionpage", "positionregion", "positionbox", "positionanchor", "positioninregion", "positionatanchor", "wdpart", "htpart", "dppart", "texvar", "texstr", "inpath", "pointof", "leftof", "rightof", "utflen", "utfsub", "newhash", "disposehash", "inhash", "tohash", "isarray", "prefix", "isobject", "comment", "report", "lua", "mp", "MP", "luacall", "mirrored", "mirroredabout", "scriptindex" },
+ ["internals"]={ "nocolormodel", "greycolormodel", "graycolormodel", "rgbcolormodel", "cmykcolormodel", "shadefactor", "textextoffset", "textextanchor", "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent", "softlighttransparent", "hardlighttransparent", "colordodgetransparent", "colorburntransparent", "darkentransparent", "lightentransparent", "differencetransparent", "exclusiontransparent", "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent", "ahvariant", "ahdimple", "ahfactor", "ahscale", "metapostversion", "maxdimensions", "drawoptionsfactor", "dq", "sq", "crossingscale", "crossingoption", "contextlmtxmode", "getparameters", "presetparameters", "hasparameter", "hasoption", "getparameter", "getparameterdefault", "getparametercount", "getmaxparametercount", "getparameterpath", "getparameterpen", "getparametertext", "applyparameters", "pushparameters", "popparameters", "definecolor" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-metapost.lua b/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-metapost.lua
index 8d1b88052ca..9304b2dd201 100644
--- a/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-metapost.lua
+++ b/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-metapost.lua
@@ -1,9 +1,9 @@
return {
- ["commands"]={ "upto", "downto", "beginfig", "endfig", "beginglyph", "endglyph", "rotatedaround", "reflectedabout", "arrowhead", "currentpen", "currentpicture", "cuttings", "defaultfont", "extra_beginfig", "extra_endfig", "down", "evenly", "fullcircle", "halfcircle", "identity", "in", "left", "pensquare", "penrazor", "penspec", "origin", "quartercircle", "right", "unitsquare", "up", "withdots", "abs", "bbox", "ceiling", "center", "cutafter", "cutbefore", "dir", "directionpoint", "div", "dotprod", "intersectionpoint", "inverse", "mod", "round", "unitvector", "whatever", "cutdraw", "draw", "drawarrow", "drawdblarrow", "fill", "filldraw", "drawdot", "loggingall", "interact", "tracingall", "tracingnone", "pickup", "undraw", "unfill", "unfilldraw", "buildcycle", "dashpattern", "decr", "dotlabel", "dotlabels", "drawoptions", "incr", "label", "labels", "max", "min", "thelabel", "z", "beginchar", "blacker", "capsule_end", "change_width", "define_blacker_pixels", "define_corrected_pixels", "define_good_x_pixels", "define_good_y_pixels", "define_horizontal_corrected_pixels", "define_pixels", "define_whole_blacker_pixels", "define_whole_pixels", "define_whole_vertical_blacker_pixels", "define_whole_vertical_pixels", "endchar", "extra_beginchar", "extra_endchar", "extra_setup", "font_coding_scheme", "clearxy", "clearit", "clearpen", "shipit", "font_extra_space", "exitunless", "relax", "hide", "gobble", "gobbled", "stop", "blankpicture", "counterclockwise", "tensepath", "takepower", "direction", "softjoin", "makelabel", "rotatedabout", "flex", "superellipse", "image", "nullpen", "savepen", "clearpen", "penpos", "penlabels", "range", "thru", "z", "laboff", "bye", "red", "green", "blue", "cyan", "magenta", "yellow", "black", "white", "background", "mm", "pt", "dd", "bp", "cm", "pc", "cc", "in", "triplet", "quadruplet" },
+ ["commands"]={ "upto", "downto", "beginfig", "endfig", "beginglyph", "endglyph", "rotatedaround", "reflectedabout", "arrowhead", "currentpen", "currentpicture", "cuttings", "defaultfont", "extra_beginfig", "extra_endfig", "down", "evenly", "fullcircle", "halfcircle", "identity", "in", "left", "pensquare", "penrazor", "penspec", "origin", "quartercircle", "right", "unitsquare", "up", "withdots", "abs", "bbox", "ceiling", "center", "cutafter", "cutbefore", "dir", "directionpoint", "div", "dotprod", "intersectionpoint", "inverse", "mod", "round", "unitvector", "whatever", "cutdraw", "draw", "drawarrow", "drawdblarrow", "fill", "filldraw", "drawdot", "loggingall", "interact", "tracingall", "tracingnone", "pickup", "undraw", "unfill", "unfilldraw", "buildcycle", "dashpattern", "decr", "dotlabel", "dotlabels", "drawoptions", "incr", "label", "labels", "max", "min", "thelabel", "z", "beginchar", "blacker", "capsule_end", "change_width", "define_blacker_pixels", "define_corrected_pixels", "define_good_x_pixels", "define_good_y_pixels", "define_horizontal_corrected_pixels", "define_pixels", "define_whole_blacker_pixels", "define_whole_pixels", "define_whole_vertical_blacker_pixels", "define_whole_vertical_pixels", "endchar", "extra_beginchar", "extra_endchar", "extra_setup", "font_coding_scheme", "clearxy", "clearit", "clearpen", "shipit", "font_extra_space", "exitunless", "relax", "hide", "gobble", "gobbled", "stop", "blankpicture", "counterclockwise", "tensepath", "takepower", "direction", "softjoin", "makelabel", "rotatedabout", "flex", "superellipse", "image", "nullpen", "savepen", "clearpen", "penpos", "penlabels", "range", "thru", "z", "laboff", "bye", "red", "green", "blue", "cyan", "magenta", "yellow", "black", "white", "background", "mm", "pt", "dd", "bp", "cm", "pc", "cc", "in", "triplet", "quadruplet", "totransform", "bymatrix" },
["disabled"]={ "verbatimtex", "troffmode" },
["internals"]={ "mitered", "rounded", "beveled", "butt", "squared", "eps", "epsilon", "infinity", "bboxmargin", "ahlength", "ahangle", "labeloffset", "dotlabeldiam", "defaultpen", "defaultscale", "join_radius", "charscale", "ditto", "EOF", "pen_lft", "pen_rt", "pen_top", "pen_bot" },
["metafont"]={ "autorounding", "beginchar", "blacker", "boundarychar", "capsule_def", "capsule_end", "change_width", "chardp", "chardx", "chardy", "charexists", "charext", "charht", "charic", "charlist", "charwd", "cull", "cullit", "currenttransform", "currentwindow", "define_blacker_pixels", "define_corrected_pixels", "define_good_x_pixels", "define_good_y_pixels", "define_horizontal_corrected_pixels", "define_pixels", "define_whole_blacker_pixels", "define_whole_pixels", "define_whole_vertical_blacker_pixels", "define_whole_vertical_pixels", "designsize", "display", "displaying", "endchar", "extensible", "extra_beginchar", "extra_endchar", "extra_setup", "fillin", "font_coding_scheme", "font_extra_space", "font_identifier", "font_normal_shrink", "font_normal_space", "font_normal_stretch", "font_quad", "font_size", "font_slant", "font_x_height", "fontdimen", "fontmaking", "gfcorners", "granularity", "grayfont", "headerbyte", "hppp", "hround", "imagerules", "italcorr", "kern", "labelfont", "ligtable", "lowres_fix", "makebox", "makegrid", "maketicks", "mode_def", "mode_setup", "nodisplays", "notransforms", "numspecial", "o_correction", "openit", "openwindow", "pixels_per_inch", "proofing", "proofoffset", "proofrule", "proofrulethickness", "rulepen", "screenchars", "screenrule", "screenstrokes", "screen_cols", "screen_rows", "showit", "slantfont", "smode", "smoothing", "titlefont", "totalweight", "tracingedges", "tracingpens", "turningcheck", "unitpixel", "vppp", "vround", "xoffset", "yoffset" },
- ["primitives"]={ "charcode", "day", "linecap", "linejoin", "miterlimit", "month", "pausing", "prologues", "showstopping", "time", "tracingcapsules", "tracingchoices", "mpprocset", "tracingcommands", "tracingequations", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingrestores", "tracingspecs", "tracingstats", "tracingtitles", "truecorners", "warningcheck", "year", "false", "nullpicture", "pencircle", "penspec", "true", "and", "angle", "arclength", "arctime", "ASCII", "boolean", "bot", "char", "color", "cosd", "cycle", "decimal", "directiontime", "floor", "fontsize", "hex", "infont", "intersectiontimes", "known", "length", "llcorner", "lrcorner", "makepath", "makepen", "mexp", "mlog", "normaldeviate", "not", "numeric", "oct", "odd", "or", "path", "pair", "pen", "penoffset", "picture", "point", "postcontrol", "precontrol", "reverse", "rotated", "scaled", "shifted", "sind", "slanted", "sqrt", "str", "string", "subpath", "substring", "transform", "transformed", "ulcorner", "uniformdeviate", "unknown", "urcorner", "xpart", "xscaled", "xxpart", "xypart", "ypart", "yscaled", "yxpart", "yypart", "zscaled", "addto", "clip", "input", "interim", "let", "newinternal", "save", "setbounds", "shipout", "show", "showdependencies", "showtoken", "showvariable", "special", "begingroup", "endgroup", "of", "curl", "tension", "and", "controls", "interpath", "on", "off", "def", "vardef", "enddef", "expr", "suffix", "text", "primary", "secondary", "tertiary", "primarydef", "secondarydef", "tertiarydef", "randomseed", "also", "contour", "doublepath", "withcolor", "withcmykcolor", "withpen", "dashed", "envelope", "if", "else", "elseif", "fi", "for", "endfor", "forever", "exitif", "within", "forsuffixes", "step", "until", "charlist", "extensible", "fontdimen", "headerbyte", "kern", "ligtable", "boundarychar", "chardp", "charext", "charht", "charic", "charwd", "designsize", "fontmaking", "charexists", "cullit", "currenttransform", "gfcorners", "grayfont", "hround", "imagerules", "lowres_fix", "nodisplays", "notransforms", "openit", "displaying", "currentwindow", "screen_rows", "screen_cols", "pixels_per_inch", "cull", "display", "openwindow", "numspecial", "totalweight", "autorounding", "fillin", "proofing", "tracingpens", "xoffset", "chardx", "granularity", "smoothing", "turningcheck", "yoffset", "chardy", "hppp", "tracingedges", "vppp", "extra_beginfig", "extra_endfig", "mpxbreak", "endinput", "message", "delimiters", "turningnumber", "errmessage", "readstring", "scantokens", "end", "outer", "inner", "write", "to", "readfrom", "withprescript", "withpostscript", "top", "bot", "lft", "rt", "ulft", "urt", "llft", "lrt", "redpart", "greenpart", "bluepart", "cyanpart", "magentapart", "yellowpart", "blackpart", "prescriptpart", "postscriptpart", "rgbcolor", "cmykcolor", "colormodel", "graypart", "greypart", "greycolor", "graycolor", "dashpart", "penpart", "stroked", "filled", "textual", "clipped", "bounded", "pathpart", "expandafter", "minute", "hour", "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline", "fontpart", "fontsize", "glyph", "restoreclipcolor", "troffmode", "runscript", "maketext" },
+ ["primitives"]={ "charcode", "day", "linecap", "linejoin", "miterlimit", "month", "pausing", "prologues", "showstopping", "time", "tracingcapsules", "tracingchoices", "mpprocset", "tracingcommands", "tracingequations", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingrestores", "tracingspecs", "tracingstats", "tracingtitles", "truecorners", "warningcheck", "year", "false", "nullpicture", "pencircle", "penspec", "true", "and", "angle", "arclength", "arctime", "ASCII", "boolean", "bot", "char", "color", "cosd", "cycle", "decimal", "directiontime", "floor", "fontsize", "hex", "infont", "intersectiontimes", "known", "void", "length", "llcorner", "lrcorner", "makepath", "makepen", "mexp", "mlog", "normaldeviate", "not", "numeric", "oct", "odd", "or", "path", "pair", "pen", "penoffset", "picture", "point", "postcontrol", "precontrol", "reverse", "rotated", "scaled", "shifted", "sind", "slanted", "sqrt", "str", "string", "subpath", "substring", "transform", "transformed", "ulcorner", "uniformdeviate", "unknown", "urcorner", "xpart", "xscaled", "xxpart", "xypart", "ypart", "yscaled", "yxpart", "yypart", "zscaled", "addto", "clip", "input", "interim", "let", "newinternal", "save", "setbounds", "setgroup", "shipout", "show", "showdependencies", "showtoken", "showvariable", "special", "begingroup", "endgroup", "of", "curl", "tension", "and", "controls", "interpath", "on", "off", "def", "vardef", "enddef", "expr", "suffix", "text", "primary", "secondary", "tertiary", "primarydef", "secondarydef", "tertiarydef", "randomseed", "also", "contour", "doublepath", "withcolor", "withcmykcolor", "withpen", "dashed", "envelope", "if", "else", "elseif", "fi", "for", "endfor", "forever", "exitif", "within", "forsuffixes", "step", "until", "charlist", "extensible", "fontdimen", "headerbyte", "kern", "ligtable", "boundarychar", "chardp", "charext", "charht", "charic", "charwd", "designsize", "fontmaking", "charexists", "cullit", "currenttransform", "gfcorners", "grayfont", "hround", "imagerules", "lowres_fix", "nodisplays", "notransforms", "openit", "displaying", "currentwindow", "screen_rows", "screen_cols", "pixels_per_inch", "cull", "display", "openwindow", "numspecial", "totalweight", "autorounding", "fillin", "proofing", "tracingpens", "xoffset", "chardx", "granularity", "smoothing", "turningcheck", "yoffset", "chardy", "hppp", "tracingedges", "vppp", "extra_beginfig", "extra_endfig", "mpxbreak", "endinput", "message", "delimiters", "turningnumber", "errmessage", "scantokens", "end", "outer", "inner", "write", "to", "readfrom", "closefrom", "withprescript", "withpostscript", "top", "bot", "lft", "rt", "ulft", "urt", "llft", "lrt", "redpart", "greenpart", "bluepart", "cyanpart", "magentapart", "yellowpart", "blackpart", "prescriptpart", "postscriptpart", "rgbcolor", "cmykcolor", "colormodel", "graypart", "greypart", "greycolor", "graycolor", "dashpart", "penpart", "stroked", "filled", "textual", "clipped", "bounded", "pathpart", "expandafter", "minute", "hour", "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline", "fontpart", "fontsize", "glyph", "restoreclipcolor", "troffmode", "runscript", "maketext", "numbersystem" },
["shortcuts"]={ "..", "...", "--", "---", "&", "\\" },
["tex"]={ "btex", "etex", "verbatimtex" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-tex.lua b/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-tex.lua
index 473c64499c8..f7551d2886b 100644
--- a/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-tex.lua
+++ b/Master/texmf-dist/context/data/textadept/context/data/scite-context-data-tex.lua
@@ -1,9 +1,9 @@
return {
["aleph"]={ "Alephminorversion", "Alephrevision", "Alephversion" },
- ["etex"]={ "botmarks", "clubpenalties", "currentgrouplevel", "currentgrouptype", "currentifbranch", "currentiflevel", "currentiftype", "detokenize", "dimexpr", "displaywidowpenalties", "eTeXVersion", "eTeXminorversion", "eTeXrevision", "eTeXversion", "everyeof", "firstmarks", "fontchardp", "fontcharht", "fontcharic", "fontcharwd", "glueexpr", "glueshrink", "glueshrinkorder", "gluestretch", "gluestretchorder", "gluetomu", "ifcsname", "ifdefined", "iffontchar", "interactionmode", "interlinepenalties", "lastlinefit", "lastnodetype", "marks", "muexpr", "mutoglue", "numexpr", "pagediscards", "parshapedimen", "parshapeindent", "parshapelength", "predisplaydirection", "protected", "readline", "savinghyphcodes", "savingvdiscards", "scantokens", "showgroups", "showifs", "showtokens", "splitbotmarks", "splitdiscards", "splitfirstmarks", "topmarks", "tracingassigns", "tracinggroups", "tracingifs", "tracingnesting", "tracingscantokens", "unexpanded", "unless", "widowpenalties" },
- ["luatex"]={ "Uchar", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Uhextensible", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathcharclass", "Umathchardef", "Umathcharfam", "Umathcharnum", "Umathcharnumdef", "Umathcharslot", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathnolimitsubfactor", "Umathnolimitsupfactor", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathskewedfractionhgap", "Umathskewedfractionvgap", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Unosubscript", "Unosuperscript", "Uoverdelimiter", "Uradical", "Uroot", "Uskewed", "Uskewedwithdelims", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "Uvextensible", "adjustspacing", "alignmark", "aligntab", "attribute", "attributedef", "automaticdiscretionary", "automatichyphenmode", "automatichyphenpenalty", "begincsname", "bodydir", "bodydirection", "boxdir", "boxdirection", "breakafterdirmode", "catcodetable", "clearmarks", "compoundhyphenmode", "copyfont", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "csstring", "draftmode", "dviextension", "dvifeedback", "dvivariable", "efcode", "endlocalcontrol", "etoksapp", "etokspre", "exceptionpenalty", "expanded", "expandglyphsinfont", "explicitdiscretionary", "explicithyphenpenalty", "fixupboxesmode", "fontid", "formatname", "gleaders", "gtoksapp", "gtokspre", "hjcode", "hyphenationbounds", "hyphenationmin", "hyphenpenaltymode", "ifabsdim", "ifabsnum", "ifcondition", "ifincsname", "ifprimitive", "ignoreligaturesinfont", "immediateassigned", "immediateassignment", "initcatcodetable", "insertht", "lastnamedcs", "lastsavedboxresourceindex", "lastsavedimageresourceindex", "lastsavedimageresourcepages", "lastxpos", "lastypos", "latelua", "lateluafunction", "leftghost", "leftmarginkern", "letcharcode", "letterspacefont", "linedir", "linedirection", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "lpcode", "luabytecode", "luabytecodecall", "luacopyinputnodes", "luadef", "luaescapestring", "luafunction", "luafunctioncall", "luatexbanner", "luatexrevision", "luatexversion", "mathdelimitersmode", "mathdir", "mathdirection", "mathdisplayskipmode", "matheqnogapstep", "mathflattenmode", "mathitalicsmode", "mathnolimitsmode", "mathoption", "mathpenaltiesmode", "mathrulesfam", "mathrulesmode", "mathrulethicknessmode", "mathscriptboxmode", "mathscriptcharmode", "mathscriptsmode", "mathstyle", "mathsurroundmode", "mathsurroundskip", "nohrule", "nokerns", "noligs", "normaldeviate", "nospaces", "novrule", "outputbox", "outputmode", "pagebottomoffset", "pagedir", "pagedirection", "pageheight", "pageleftoffset", "pagerightoffset", "pagetopoffset", "pagewidth", "pardir", "pardirection", "pdfextension", "pdffeedback", "pdfvariable", "postexhyphenchar", "posthyphenchar", "prebinoppenalty", "predisplaygapfactor", "preexhyphenchar", "prehyphenchar", "prerelpenalty", "primitive", "protrudechars", "pxdimen", "quitvmode", "randomseed", "rightghost", "rightmarginkern", "rpcode", "saveboxresource", "savecatcodetable", "saveimageresource", "savepos", "scantextokens", "setfontid", "setrandomseed", "shapemode", "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", "suppressmathparerror", "suppressoutererror", "suppressprimitiveerror", "synctex", "tagcode", "textdir", "textdirection", "toksapp", "tokspre", "tracingfonts", "uniformdeviate", "useboxresource", "useimageresource", "xtoksapp", "xtokspre" },
+ ["etex"]={ "botmarks", "clubpenalties", "currentgrouplevel", "currentgrouptype", "currentifbranch", "currentiflevel", "currentiftype", "detokenize", "dimexpr", "displaywidowpenalties", "everyeof", "firstmarks", "fontchardp", "fontcharht", "fontcharic", "fontcharwd", "glueexpr", "glueshrink", "glueshrinkorder", "gluestretch", "gluestretchorder", "gluetomu", "ifcsname", "ifdefined", "iffontchar", "interactionmode", "interlinepenalties", "lastlinefit", "lastnodetype", "marks", "muexpr", "mutoglue", "numexpr", "pagediscards", "parshapedimen", "parshapeindent", "parshapelength", "predisplaydirection", "protected", "readline", "savinghyphcodes", "savingvdiscards", "scantokens", "showgroups", "showifs", "showtokens", "splitbotmarks", "splitdiscards", "splitfirstmarks", "topmarks", "tracingassigns", "tracinggroups", "tracingifs", "tracingnesting", "tracingscantokens", "unexpanded", "unless", "widowpenalties" },
+ ["luatex"]={ "Uchar", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Uhextensible", "Uleft", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathcharclass", "Umathchardef", "Umathcharfam", "Umathcharnum", "Umathcharnumdef", "Umathcharslot", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathnolimitsubfactor", "Umathnolimitsupfactor", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathskewedfractionhgap", "Umathskewedfractionvgap", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Umiddle", "Unosubscript", "Unosuperscript", "Uoverdelimiter", "Uradical", "Uright", "Uroot", "Uskewed", "Uskewedwithdelims", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "Uvextensible", "adjustspacing", "adjustspacingshrink", "adjustspacingstep", "adjustspacingstretch", "aftergrouped", "alignmark", "aligntab", "attribute", "attributedef", "automaticdiscretionary", "automatichyphenmode", "automatichyphenpenalty", "begincsname", "beginlocalcontrol", "boundary", "boxattr", "boxdirection", "boxorientation", "boxtotal", "boxxmove", "boxxoffset", "boxymove", "boxyoffset", "breakafterdirmode", "catcodetable", "clearmarks", "compoundhyphenmode", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "csstring", "efcode", "endlocalcontrol", "etoksapp", "etokspre", "exceptionpenalty", "expanded", "explicitdiscretionary", "explicithyphenpenalty", "firstvalidlanguage", "fixupboxesmode", "fontid", "formatname", "frozen", "futureexpand", "futureexpandis", "futureexpandisap", "gleaders", "glet", "glyphdatafield", "gtoksapp", "gtokspre", "hjcode", "hpack", "hyphenationbounds", "hyphenationmin", "hyphenpenaltymode", "ifabsdim", "ifabsnum", "ifchkdim", "ifchknum", "ifcmpdim", "ifcmpnum", "ifcondition", "ifcstok", "ifdimval", "iffrozen", "ifincsname", "ifnumval", "ifprotected", "iftok", "ifusercmd", "ignorepars", "immediateassigned", "immediateassignment", "initcatcodetable", "insertht", "internalcodesmode", "lastnamedcs", "lastnodesubtype", "leftghost", "leftmarginkern", "letcharcode", "letfrozen", "letprotected", "linedirection", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "lpcode", "luabytecode", "luabytecodecall", "luacopyinputnodes", "luadef", "luaescapestring", "luafunction", "luafunctioncall", "luatexbanner", "luatexrevision", "luatexversion", "mathdelimitersmode", "mathdirection", "mathdisplayskipmode", "matheqnogapstep", "mathflattenmode", "mathitalicsmode", "mathnolimitsmode", "matholdmode", "mathpenaltiesmode", "mathrulesfam", "mathrulesmode", "mathrulethicknessmode", "mathscriptboxmode", "mathscriptcharmode", "mathscriptsmode", "mathstyle", "mathsurroundmode", "mathsurroundskip", "noboundary", "nohrule", "nokerns", "noligs", "nospaces", "novrule", "outputbox", "pardirection", "postexhyphenchar", "posthyphenchar", "prebinoppenalty", "predisplaygapfactor", "preexhyphenchar", "prehyphenchar", "prerelpenalty", "protrudechars", "protrusionboundary", "pxdimen", "quitvmode", "rightghost", "rightmarginkern", "rpcode", "savecatcodetable", "scantextokens", "setfontid", "shapemode", "textdirection", "toksapp", "tokspre", "tpack", "tracingfonts", "unletfrozen", "unletprotected", "vpack", "wordboundary", "xtoksapp", "xtokspre" },
["omega"]={ "Omegaminorversion", "Omegarevision", "Omegaversion" },
["pdftex"]={ "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", "pdfadjustspacing", "pdfannot", "pdfcatalog", "pdfcolorstack", "pdfcolorstackinit", "pdfcompresslevel", "pdfcopyfont", "pdfcreationdate", "pdfdecimaldigits", "pdfdest", "pdfdestmargin", "pdfdraftmode", "pdfeachlinedepth", "pdfeachlineheight", "pdfendlink", "pdfendthread", "pdffirstlineheight", "pdffontattr", "pdffontexpand", "pdffontname", "pdffontobjnum", "pdffontsize", "pdfgamma", "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", "pdfignoreddimen", "pdfignoreunknownimages", "pdfimageaddfilename", "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", "pdfinclusionerrorlevel", "pdfinfo", "pdfinfoomitdate", "pdfinsertht", "pdflastannot", "pdflastlinedepth", "pdflastlink", "pdflastobj", "pdflastxform", "pdflastximage", "pdflastximagepages", "pdflastxpos", "pdflastypos", "pdflinkmargin", "pdfliteral", "pdfmajorversion", "pdfmapfile", "pdfmapline", "pdfminorversion", "pdfnames", "pdfnoligatures", "pdfnormaldeviate", "pdfobj", "pdfobjcompresslevel", "pdfomitcharset", "pdfomitcidset", "pdfoutline", "pdfoutput", "pdfpageattr", "pdfpagebox", "pdfpageheight", "pdfpageref", "pdfpageresources", "pdfpagesattr", "pdfpagewidth", "pdfpkfixeddpi", "pdfpkmode", "pdfpkresolution", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", "pdfrandomseed", "pdfrecompress", "pdfrefobj", "pdfrefxform", "pdfrefximage", "pdfreplacefont", "pdfrestore", "pdfretval", "pdfsave", "pdfsavepos", "pdfsetmatrix", "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", "pdfsuppressoptionalinfo", "pdfsuppressptexinfo", "pdftexbanner", "pdftexrevision", "pdftexversion", "pdfthread", "pdfthreadmargin", "pdftracingfonts", "pdftrailer", "pdftrailerid", "pdfuniformdeviate", "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", "pdfxformmargin", "pdfxformname", "pdfxformresources", "pdfximage" },
- ["tex"]={ " ", "-", "/", "Uleft", "Umiddle", "Uright", "above", "abovedisplayshortskip", "abovedisplayskip", "abovewithdelims", "accent", "adjdemerits", "advance", "afterassignment", "aftergroup", "atop", "atopwithdelims", "badness", "baselineskip", "batchmode", "begingroup", "belowdisplayshortskip", "belowdisplayskip", "binoppenalty", "botmark", "boundary", "box", "boxmaxdepth", "brokenpenalty", "catcode", "char", "chardef", "cleaders", "closein", "closeout", "clubpenalty", "copy", "count", "countdef", "cr", "crcr", "csname", "day", "deadcycles", "def", "defaulthyphenchar", "defaultskewchar", "delcode", "delimiter", "delimiterfactor", "delimitershortfall", "dimen", "dimendef", "directlua", "discretionary", "displayindent", "displaylimits", "displaystyle", "displaywidowpenalty", "displaywidth", "divide", "doublehyphendemerits", "dp", "dump", "edef", "else", "emergencystretch", "end", "endcsname", "endgroup", "endinput", "endlinechar", "eqno", "errhelp", "errmessage", "errorcontextlines", "errorstopmode", "escapechar", "everycr", "everydisplay", "everyhbox", "everyjob", "everymath", "everypar", "everyvbox", "exhyphenchar", "exhyphenpenalty", "expandafter", "fam", "fi", "finalhyphendemerits", "firstmark", "firstvalidlanguage", "floatingpenalty", "font", "fontdimen", "fontname", "futurelet", "gdef", "glet", "global", "globaldefs", "halign", "hangafter", "hangindent", "hbadness", "hbox", "hfil", "hfill", "hfilneg", "hfuzz", "hoffset", "holdinginserts", "hpack", "hrule", "hsize", "hskip", "hss", "ht", "hyphenation", "hyphenchar", "hyphenpenalty", "if", "ifcase", "ifcat", "ifdim", "ifeof", "iffalse", "ifhbox", "ifhmode", "ifinner", "ifmmode", "ifnum", "ifodd", "iftrue", "ifvbox", "ifvmode", "ifvoid", "ifx", "ignorespaces", "immediate", "indent", "input", "inputlineno", "insert", "insertpenalties", "interlinepenalty", "jobname", "kern", "language", "lastbox", "lastkern", "lastpenalty", "lastskip", "lccode", "leaders", "left", "lefthyphenmin", "leftskip", "leqno", "let", "limits", "linepenalty", "lineskip", "lineskiplimit", "long", "looseness", "lower", "lowercase", "mag", "mark", "mathaccent", "mathbin", "mathchar", "mathchardef", "mathchoice", "mathclose", "mathcode", "mathinner", "mathop", "mathopen", "mathord", "mathpunct", "mathrel", "mathsurround", "maxdeadcycles", "maxdepth", "meaning", "medmuskip", "message", "middle", "mkern", "month", "moveleft", "moveright", "mskip", "multiply", "muskip", "muskipdef", "newlinechar", "noalign", "noboundary", "noexpand", "noindent", "nolimits", "nonscript", "nonstopmode", "nulldelimiterspace", "nullfont", "number", "omit", "openin", "openout", "or", "outer", "output", "outputpenalty", "over", "overfullrule", "overline", "overwithdelims", "pagedepth", "pagefilllstretch", "pagefillstretch", "pagefilstretch", "pagegoal", "pageshrink", "pagestretch", "pagetotal", "par", "parfillskip", "parindent", "parshape", "parskip", "patterns", "pausing", "penalty", "postdisplaypenalty", "predisplaypenalty", "predisplaysize", "pretolerance", "prevdepth", "prevgraf", "protrusionboundary", "radical", "raise", "read", "relax", "relpenalty", "right", "righthyphenmin", "rightskip", "romannumeral", "scriptfont", "scriptscriptfont", "scriptscriptstyle", "scriptspace", "scriptstyle", "scrollmode", "setbox", "setlanguage", "sfcode", "shipout", "show", "showbox", "showboxbreadth", "showboxdepth", "showlists", "showthe", "skewchar", "skip", "skipdef", "spacefactor", "spaceskip", "span", "special", "splitbotmark", "splitfirstmark", "splitmaxdepth", "splittopskip", "string", "tabskip", "textfont", "textstyle", "the", "thickmuskip", "thinmuskip", "time", "toks", "toksdef", "tolerance", "topmark", "topskip", "tpack", "tracingcommands", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingpages", "tracingparagraphs", "tracingrestores", "tracingstats", "uccode", "uchyph", "underline", "unhbox", "unhcopy", "unkern", "unpenalty", "unskip", "unvbox", "unvcopy", "uppercase", "vadjust", "valign", "vbadness", "vbox", "vcenter", "vfil", "vfill", "vfilneg", "vfuzz", "voffset", "vpack", "vrule", "vsize", "vskip", "vsplit", "vss", "vtop", "wd", "widowpenalty", "wordboundary", "write", "xdef", "xleaders", "xspaceskip", "year" },
+ ["tex"]={ " ", "-", "/", "above", "abovedisplayshortskip", "abovedisplayskip", "abovewithdelims", "accent", "adjdemerits", "advance", "afterassignment", "aftergroup", "atop", "atopwithdelims", "badness", "baselineskip", "batchmode", "begingroup", "belowdisplayshortskip", "belowdisplayskip", "binoppenalty", "botmark", "box", "boxmaxdepth", "brokenpenalty", "catcode", "char", "chardef", "cleaders", "closein", "clubpenalty", "copy", "count", "countdef", "cr", "crcr", "csname", "day", "deadcycles", "def", "defaulthyphenchar", "defaultskewchar", "delcode", "delimiter", "delimiterfactor", "delimitershortfall", "dimen", "dimendef", "directlua", "discretionary", "displayindent", "displaylimits", "displaystyle", "displaywidowpenalty", "displaywidth", "divide", "doublehyphendemerits", "dp", "dump", "edef", "else", "emergencystretch", "end", "endcsname", "endgroup", "endinput", "endlinechar", "eqno", "errhelp", "errmessage", "errorcontextlines", "errorstopmode", "escapechar", "everycr", "everydisplay", "everyhbox", "everyjob", "everymath", "everypar", "everytab", "everyvbox", "exhyphenchar", "exhyphenpenalty", "expandafter", "fam", "fi", "finalhyphendemerits", "firstmark", "floatingpenalty", "font", "fontdimen", "fontname", "futurelet", "gdef", "global", "globaldefs", "halign", "hangafter", "hangindent", "hbadness", "hbox", "hfil", "hfill", "hfilneg", "hfuzz", "hoffset", "holdinginserts", "hrule", "hsize", "hskip", "hss", "ht", "hyphenation", "hyphenchar", "hyphenpenalty", "if", "ifcase", "ifcat", "ifdim", "ifeof", "iffalse", "ifhbox", "ifhmode", "ifinner", "ifmmode", "ifnum", "ifodd", "iftrue", "ifvbox", "ifvmode", "ifvoid", "ifx", "ignorespaces", "indent", "input", "inputlineno", "insert", "insertpenalties", "interlinepenalty", "jobname", "kern", "language", "lastbox", "lastkern", "lastpenalty", "lastskip", "lccode", "leaders", "left", "lefthyphenmin", "leftskip", "leqno", "let", "limits", "linepenalty", "lineskip", "lineskiplimit", "long", "looseness", "lower", "lowercase", "mag", "mark", "mathaccent", "mathbin", "mathchar", "mathchardef", "mathchoice", "mathclose", "mathcode", "mathinner", "mathop", "mathopen", "mathord", "mathpunct", "mathrel", "mathsurround", "maxdeadcycles", "maxdepth", "meaning", "medmuskip", "message", "middle", "mkern", "month", "moveleft", "moveright", "mskip", "multiply", "muskip", "muskipdef", "newlinechar", "noalign", "noexpand", "noindent", "nolimits", "nonscript", "nonstopmode", "nulldelimiterspace", "nullfont", "number", "omit", "openin", "or", "ordlimits", "orelse", "outer", "output", "outputpenalty", "over", "overfullrule", "overline", "overwithdelims", "pagedepth", "pagefilllstretch", "pagefillstretch", "pagefilstretch", "pagegoal", "pageshrink", "pagestretch", "pagetotal", "par", "parfillskip", "parindent", "parshape", "parskip", "patterns", "pausing", "penalty", "postdisplaypenalty", "predisplaypenalty", "predisplaysize", "pretolerance", "prevdepth", "prevgraf", "radical", "raise", "read", "relax", "relpenalty", "right", "righthyphenmin", "rightskip", "romannumeral", "scriptfont", "scriptscriptfont", "scriptscriptstyle", "scriptspace", "scriptstyle", "scrollmode", "setbox", "setlanguage", "sfcode", "shipout", "show", "showbox", "showboxbreadth", "showboxdepth", "showlists", "shownodedetails", "showthe", "skewchar", "skip", "skipdef", "spacefactor", "spaceskip", "span", "splitbotmark", "splitfirstmark", "splitmaxdepth", "splittopskip", "string", "tabskip", "textfont", "textstyle", "the", "thickmuskip", "thinmuskip", "time", "toks", "toksdef", "tolerance", "topmark", "topskip", "tracingcommands", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingpages", "tracingparagraphs", "tracingrestores", "tracingstats", "uccode", "uchyph", "underline", "unhbox", "unhcopy", "unkern", "unpenalty", "unskip", "unvbox", "unvcopy", "uppercase", "vadjust", "valign", "vbadness", "vbox", "vcenter", "vfil", "vfill", "vfilneg", "vfuzz", "voffset", "vrule", "vsize", "vskip", "vsplit", "vss", "vtop", "wd", "widowpenalty", "xdef", "xleaders", "xspaceskip", "year" },
["xetex"]={ "XeTeXversion" },
} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/textadept/context/lexers/lexer.lua b/Master/texmf-dist/context/data/textadept/context/lexers/lexer.lua
index 234b03c0598..8451abc85cb 100644
--- a/Master/texmf-dist/context/data/textadept/context/lexers/lexer.lua
+++ b/Master/texmf-dist/context/data/textadept/context/lexers/lexer.lua
@@ -2240,6 +2240,10 @@ do
local utf8three = R("\224\239") * utf8next * utf8next
local utf8four = R("\240\244") * utf8next * utf8next * utf8next
+ local utfidentifier = utf8two + utf8three + utf8four
+ helpers.utfidentifier = (R("AZ","az","__") + utfidentifier)
+ * (R("AZ","az","__","09") + utfidentifier)^0
+
helpers.utfcharpattern = P(1) * utf8next^0 -- unchecked but fast
helpers.utfbytepattern = utf8one / byte
+ utf8two / function(s) local c1, c2 = byte(s,1,2) return c1 * 64 + c2 - 12416 end
diff --git a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-cpp.lua b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-cpp.lua
index d9079855fa7..a50cdaa1756 100644
--- a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-cpp.lua
+++ b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-cpp.lua
@@ -28,6 +28,7 @@ local keywords = { -- copied from cpp.lua
"restrict",
-- hm
"_Bool", "_Complex", "_Pragma", "_Imaginary",
+ "boolean",
-- c++.
"catch", "class", "const_cast", "delete", "dynamic_cast", "explicit",
"export", "friend", "mutable", "namespace", "new", "operator", "private",
@@ -46,6 +47,11 @@ local macros = { -- copied from cpp.lua
"include", "line", "pragma", "undef", "using", "warning"
}
+local luatexs = {
+ "word", "halfword", "quarterword", "scaledwhd", "scaled", "pointer", "glueratio", "strnumber",
+ "dumpstream", "memoryword",
+}
+
local space = patterns.space -- S(" \n\r\t\f\v")
local any = patterns.any
local restofline = patterns.restofline
@@ -90,10 +96,12 @@ local operator = token("special", S("+-*/%^!=<>;:{}[]().&|?~"))
local p_keywords = exact_match(keywords)
local p_datatypes = exact_match(datatypes)
local p_macros = exact_match(macros)
+local p_luatexs = exact_match(luatexs)
local keyword = token("keyword", p_keywords)
local datatype = token("keyword", p_datatypes)
local identifier = token("default", validword)
+local luatex = token("command", p_luatexs)
local macro = token("data", #P("#") * startofline * P("#") * S("\t ")^0 * p_macros)
@@ -101,6 +109,7 @@ cpplexer._rules = {
{ "whitespace", spacing },
{ "keyword", keyword },
{ "type", datatype },
+ { "luatex", luatex },
{ "identifier", identifier },
{ "string", shortstring },
{ "longcomment", longcomment },
@@ -121,6 +130,7 @@ if web then
{ "whitespace", spacing },
{ "keyword", keyword },
{ "type", datatype },
+ { "luatex", luatex },
{ "identifier", identifier },
{ "string", shortstring },
{ "longcomment", longcomment },
@@ -140,6 +150,7 @@ else
{ "whitespace", spacing },
{ "keyword", keyword },
{ "type", datatype },
+ { "luatex", luatex },
{ "identifier", identifier },
{ "string", shortstring },
{ "longcomment", longcomment },
diff --git a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-json.lua b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-json.lua
index 20a2d1d1220..ca7add07d87 100644
--- a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-json.lua
+++ b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-json.lua
@@ -36,9 +36,10 @@ local spaces = space^1
local operator = S(':,{}[]')
local fence = openarray + closearray + openhash + closehash
-local escape_un = P("\\u") / "0x" * S("09","AF","af")
-local escape_bs = P([[\]]) * P(1)
-local content = (escape_un + escape_bs + (1-double))^0
+local escape_un = P("\\u") * S("09","AF","af")
+local escape_bs = P("\\") * P(1)
+----- content = (escape_un + escape_bs + (1-double))^0
+local content = (escape_bs + (1-double))^0
local reserved = P("true")
+ P("false")
diff --git a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-lua.lua b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-lua.lua
index ba14f5206c0..0e54d56ba23 100644
--- a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-lua.lua
+++ b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-lua.lua
@@ -56,7 +56,9 @@ local constants = {
"__le", "__lt", "__metatable", "__mode", "__mul", "__newindex",
"__pow", "__sub", "__tostring", "__unm", "__len",
"__pairs", "__ipairs",
+ "__close",
"NaN",
+ "<const>", "<toclose>",
}
-- local tokenmappings = { }
@@ -66,9 +68,11 @@ local constants = {
-- for i=1,#constants do tokenmappings[constants[i]] = "constant" }
local internals = { -- __
- "add", "call", "concat", "div", "eq", "gc", "index",
+ "add", "call", "concat", "div", "idiv", "eq", "gc", "index",
"le", "lt", "metatable", "mode", "mul", "newindex",
"pow", "sub", "tostring", "unm", "len",
+ "pairs", "ipairs",
+ "close",
}
local depricated = {
@@ -80,8 +84,8 @@ local depricated = {
local csnames = { -- todo: option
"commands",
"context",
--- "ctxcmd",
--- "ctx",
+ -- "ctxcmd",
+ -- "ctx",
"metafun",
"metapost",
}
@@ -224,10 +228,12 @@ local csname = token("user", p_csnames + p_ctnames)
+ ( token("special", S(".:")) * optionalspace * token("user", validword) )^1
)^-1
+-- we could also check S(".:") * p_keyword etc, could be faster
+
local identifier = token("default", validword)
* ( optionalspace * token("special", S(".:")) * optionalspace * (
token("warning", p_keywords) +
- token("data", p_internals) +
+ token("data", p_internals) + -- needs checking
token("default", validword )
) )^0
@@ -375,12 +381,14 @@ lualexer._rules_cld = {
{ "keyword", keyword },
{ "function", builtin },
{ "csname", csname },
+ { "goto", gotokeyword },
{ "constant", constant },
{ "identifier", identifier },
{ "string", string },
{ "longcomment", longcomment },
{ "shortcomment", shortcomment }, -- should not be used inline so best signal it as comment (otherwise complex state till end of inline)
{ "number", number },
+ { "label", gotolabel },
{ "operator", operator },
{ "rest", rest },
}
diff --git a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-mps.lua b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-mps.lua
index 4bbfae03cff..356bf1f6b45 100644
--- a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-mps.lua
+++ b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-mps.lua
@@ -86,6 +86,7 @@ local rest = token("default", any)
local comment = token("comment", P("%") * (1-S("\n\r"))^0)
local internal = token("reserved", exact_match(mergedshortcuts,false))
local shortcut = token("data", exact_match(mergedinternals))
+
local helper = token("command", exact_match(metafuncommands))
local plain = token("plain", exact_match(metapostcommands))
local quoted = token("quote", dquote)
@@ -128,9 +129,12 @@ lexer.embed_lexer(metafunlexer, cldlexer, startluacode, stopluacode)
local luacall = token("embedded",P("lua") * ( P(".") * R("az","AZ","__")^1 )^1)
+local keyword = token("default", (R("AZ","az","__")^1) * # P(space^0 * P("=")))
+
metafunlexer._rules = {
{ "whitespace", spacing },
{ "comment", comment },
+ { "keyword", keyword }, -- experiment, maybe to simple
{ "internal", internal },
{ "shortcut", shortcut },
{ "luacall", luacall },
diff --git a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-sas.lua b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-sas.lua
new file mode 100644
index 00000000000..e3656991137
--- /dev/null
+++ b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-sas.lua
@@ -0,0 +1,102 @@
+local info = {
+ version = 1.001,
+ comment = "scintilla lpeg lexer for sas",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+-- todo: make this ok for the sas syntax as now it's sql
+
+local P, R, S = lpeg.P, lpeg.R, lpeg.S
+
+local lexer = require("scite-context-lexer")
+local context = lexer.context
+local patterns = context.patterns
+
+local token = lexer.token
+local exact_match = lexer.exact_match
+
+local saslexer = lexer.new("sas","scite-context-lexer-sAs")
+local whitespace = saslexer.whitespace
+
+local keywords_standard = {
+ "anova" , "data", "run", "proc",
+}
+
+local keywords_dialects = {
+ "class" , "do", "end" , "int" , "for" , "model" , "rannor" , "to" , "output"
+}
+
+local space = patterns.space -- S(" \n\r\t\f\v")
+local any = patterns.any
+local restofline = patterns.restofline
+local startofline = patterns.startofline
+
+local squote = P("'")
+local dquote = P('"')
+local bquote = P('`')
+local escaped = P("\\") * P(1)
+
+local begincomment = P("/*")
+local endcomment = P("*/")
+
+local decimal = patterns.decimal
+local float = patterns.float
+local integer = P("-")^-1 * decimal
+
+local spacing = token(whitespace, space^1)
+local rest = token("default", any)
+
+local shortcomment = token("comment", (P("#") + P("--")) * restofline^0)
+local longcomment = token("comment", begincomment * (1-endcomment)^0 * endcomment^-1)
+
+local identifier = token("default",lexer.helpers.utfidentifier)
+
+local shortstring = token("quote", dquote) -- can be shared
+ * token("string", (escaped + (1-dquote))^0)
+ * token("quote", dquote)
+ + token("quote", squote)
+ * token("string", (escaped + (1-squote))^0)
+ * token("quote", squote)
+ + token("quote", bquote)
+ * token("string", (escaped + (1-bquote))^0)
+ * token("quote", bquote)
+
+local p_keywords_s = exact_match(keywords_standard,nil,true)
+local p_keywords_d = exact_match(keywords_dialects,nil,true)
+local keyword_s = token("keyword", p_keywords_s)
+local keyword_d = token("command", p_keywords_d)
+
+local number = token("number", float + integer)
+local operator = token("special", S("+-*/%^!=<>;:{}[]().&|?~"))
+
+saslexer._tokenstyles = context.styleset
+
+saslexer._foldpattern = P("/*") + P("*/") + S("{}") -- separate entry else interference
+
+saslexer._foldsymbols = {
+ _patterns = {
+ "/%*",
+ "%*/",
+ },
+ ["comment"] = {
+ ["/*"] = 1,
+ ["*/"] = -1,
+ }
+}
+
+saslexer._rules = {
+ { "whitespace", spacing },
+ { "keyword-s", keyword_s },
+ { "keyword-d", keyword_d },
+ { "identifier", identifier },
+ { "string", shortstring },
+ { "longcomment", longcomment },
+ { "shortcomment", shortcomment },
+ { "number", number },
+ { "operator", operator },
+ { "rest", rest },
+}
+
+return saslexer
diff --git a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-web-snippets.lua b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-web-snippets.lua
index 3cef717393e..5121030cc69 100644
--- a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-web-snippets.lua
+++ b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer-web-snippets.lua
@@ -75,7 +75,7 @@ local t_reference = token("label",p_reference) * token("function",(1-p_endofweb)
-- @'char' (ascii code)
-local p_character = p_beginofweb * S("'")
+local p_character = p_beginofweb * squote
local t_character = token("label",p_character) * token("reserved",(1-squote)^1) * token("label",squote)
-- @l nonascii
@@ -129,5 +129,4 @@ websnippets.pattern = P (
+ t_escape
)
-
return websnippets
diff --git a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer.lua b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer.lua
index 234b03c0598..8451abc85cb 100644
--- a/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer.lua
+++ b/Master/texmf-dist/context/data/textadept/context/lexers/scite-context-lexer.lua
@@ -2240,6 +2240,10 @@ do
local utf8three = R("\224\239") * utf8next * utf8next
local utf8four = R("\240\244") * utf8next * utf8next * utf8next
+ local utfidentifier = utf8two + utf8three + utf8four
+ helpers.utfidentifier = (R("AZ","az","__") + utfidentifier)
+ * (R("AZ","az","__","09") + utfidentifier)^0
+
helpers.utfcharpattern = P(1) * utf8next^0 -- unchecked but fast
helpers.utfbytepattern = utf8one / byte
+ utf8two / function(s) local c1, c2 = byte(s,1,2) return c1 * 64 + c2 - 12416 end
diff --git a/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-files.lua b/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-files.lua
index 28cc794cb37..ef016372e0f 100644
--- a/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-files.lua
+++ b/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-files.lua
@@ -71,41 +71,41 @@ do
newmenu.file = {
- title = '_File',
+ title = "_File",
- { '_New', buffer.new },
- { '_Open', io.open_file },
- { 'Open _Recent', io.open_recent_file },
- { 'Re_load', io.reload_file },
- { '_Save', io.save_file },
- { 'Save _As', io.save_file_as },
- { 'Save All', io.save_all_files },
+ { "_New", buffer.new },
+ { "_Open", io.open_file },
+ { "Open _Recent", io.open_recent_file },
+ { "Re_load", io.reload_file },
+ { "_Save", io.save_file },
+ { "Save _As", io.save_file_as },
+ { "Save All", io.save_all_files },
SEPARATOR,
- { '_Close', io.close_buffer },
- { 'Close All', io.close_all_buffers },
+ { "_Close", io.close_buffer },
+ { "Close All", io.close_all_buffers },
-- SEPARATOR,
- -- { 'Loa_d Session', textadept.session.load },
- -- { 'Sav_e Session', textadept.session.save },
+ -- { "Loa_d Session", textadept.session.load },
+ -- { "Sav_e Session", textadept.session.save },
SEPARATOR,
- { _L['_Quit'], quit },
+ { _L["_Quit"], quit },
}
-- maybe just the same keys on all ... or duplicate on osx
- newkeys[OSX and 'mn' or 'cn'] = buffer.new
- newkeys[OSX and 'mo' or 'co'] = io.open_file
- newkeys[OSX and 'cmo' or 'cao'] = io.open_recent_file
- newkeys[OSX and 'ms' or 'cs'] = io.save_file
- newkeys[OSX and 'mS' or 'cS'] = io.save_file_as
- newkeys[OSX and 'mw' or 'cw'] = io.close_buffer
- newkeys[OSX and 'mW' or 'cW'] = io.close_all_buffers
+ newkeys[OSX and "mn" or "cn"] = buffer.new
+ newkeys[OSX and "mo" or "co"] = io.open_file
+ newkeys[OSX and "cmo" or "cao"] = io.open_recent_file
+ newkeys[OSX and "ms" or "cs"] = io.save_file
+ newkeys[OSX and "mS" or "cS"] = io.save_file_as
+ newkeys[OSX and "mw" or "cw"] = io.close_buffer
+ newkeys[OSX and "mW" or "cW"] = io.close_all_buffers
end
@@ -117,80 +117,82 @@ do
newmenu.edit = {
- title = '_Edit',
+ title = "_Edit",
SEPARATOR,
- { '_Undo', buffer.undo },
- { '_Redo', buffer.redo },
+ { "_Undo", buffer.undo },
+ { "_Redo", buffer.redo },
SEPARATOR,
- { 'Cu_t', buffer.cut },
- { '_Copy', buffer.copy },
- { '_Paste', buffer.paste },
- { '_Delete', buffer.clear },
- { 'Select _All', buffer.select_all },
+ { "Cu_t", buffer.cut },
+ { "_Copy", buffer.copy },
+ { "_Paste", buffer.paste },
+ { "_Delete", buffer.clear },
+ { "Select _All", buffer.select_all },
SEPARATOR,
- { 'Duplicate _Line', buffer.line_duplicate },
+ { "Duplicate _Line", buffer.line_duplicate },
SEPARATOR,
- { 'Toggle _Block Comment', textadept.editing.block_comment },
- { '_Upper Case Selection', buffer.upper_case },
- { '_Lower Case Selection', buffer.lower_case },
+ { "Toggle _Block Comment", runner.blockcomment },
+ { "_Upper Case Selection", buffer.upper_case },
+ { "_Lower Case Selection", buffer.lower_case },
}
- newkeys[OSX and 'mz' or 'cz'] = buffer.undo
- newkeys[OSX and 'my' or 'cy'] = buffer.redo
- newkeys[OSX and 'mx' or 'cx'] = buffer.cut
- newkeys[OSX and 'mc' or 'cc'] = buffer.copy
- newkeys[OSX and 'mv' or 'cv'] = buffer.paste
- newkeys[OSX and 'ma' or 'ca'] = buffer.select_all
+ newkeys[OSX and "mz" or "cz"] = buffer.undo
+ newkeys[OSX and "my" or "cy"] = buffer.redo
+ newkeys[OSX and "mx" or "cx"] = buffer.cut
+ newkeys[OSX and "mc" or "cc"] = buffer.copy
+ newkeys[OSX and "mv" or "cv"] = buffer.paste
+ newkeys[OSX and "ma" or "ca"] = buffer.select_all
- newkeys[OSX and 'mD' or 'cD'] = textadept.editing.select_word
- newkeys[OSX and 'mN' or 'cN'] = textadept.editing.select_line
- newkeys[OSX and 'mP' or 'cP'] = textadept.editing.select_paragraph
+ newkeys[OSX and "mD" or "cD"] = textadept.editing.select_word
+ newkeys[OSX and "mN" or "cN"] = textadept.editing.select_line
+ newkeys[OSX and "mP" or "cP"] = textadept.editing.select_paragraph
- newkeys['del'] = buffer.clear
- newkeys['cy'] = buffer.redo
+ newkeys["del"] = buffer.clear
+ newkeys["cy"] = buffer.redo
- newkeys[OSX and 'md' or 'cd'] = buffer.line_duplicate
- newkeys[OSX and 'cu' or 'cau'] = buffer.upper_case
- newkeys[OSX and 'cU' or 'caU'] = buffer.lower_case
+ newkeys[OSX and "md" or "cd"] = buffer.line_duplicate
+ newkeys[OSX and "cu" or "cau"] = buffer.upper_case
+ newkeys[OSX and "cU" or "caU"] = buffer.lower_case
- newkeys[OSX and 'mq' or 'cq'] = textadept.editing.block_comment
+ newkeys[OSX and "mq" or "cq"] = runner.blockcomment
+
+ newkeys[OSX and "ml" or "cl"] = buffer.line_delete
-- Do I ever use these?
- -- newkeys['cf'] = buffer.char_right
- -- newkeys['cF'] = buffer.char_right_extend
- -- newkeys['cmf'] = buffer.word_right
- -- newkeys['cmF'] = buffer.word_right_extend
- -- newkeys['cb'] = buffer.char_left
- -- newkeys['cB'] = buffer.char_left_extend
- -- newkeys['cmb'] = buffer.word_left
- -- newkeys['cmB'] = buffer.word_left_extend
- -- newkeys['cn'] = buffer.line_down
- -- newkeys['cN'] = buffer.line_down_extend
- -- newkeys['cp'] = buffer.line_up
- -- newkeys['cP'] = buffer.line_up_extend
- -- newkeys['ca'] = buffer.vc_home
- -- newkeys['cA'] = buffer.vc_home_extend
- -- newkeys['ce'] = buffer.line_end
- -- newkeys['cE'] = buffer.line_end_extend
- -- newkeys['aright'] = buffer.word_right
- -- newkeys['aleft'] = buffer.word_left
- -- newkeys['cdv'] = buffer.clear
- -- newkeys['ck'] = function() buffer:line_end_extend() buffer:cut() end
- -- newkeys['cl'] = buffer.vertical_centre_caret
+ -- newkeys["cf"] = buffer.char_right
+ -- newkeys["cF"] = buffer.char_right_extend
+ -- newkeys["cmf"] = buffer.word_right
+ -- newkeys["cmF"] = buffer.word_right_extend
+ -- newkeys["cb"] = buffer.char_left
+ -- newkeys["cB"] = buffer.char_left_extend
+ -- newkeys["cmb"] = buffer.word_left
+ -- newkeys["cmB"] = buffer.word_left_extend
+ -- newkeys["cn"] = buffer.line_down
+ -- newkeys["cN"] = buffer.line_down_extend
+ -- newkeys["cp"] = buffer.line_up
+ -- newkeys["cP"] = buffer.line_up_extend
+ -- newkeys["ca"] = buffer.vc_home
+ -- newkeys["cA"] = buffer.vc_home_extend
+ -- newkeys["ce"] = buffer.line_end
+ -- newkeys["cE"] = buffer.line_end_extend
+ -- newkeys["aright"] = buffer.word_right
+ -- newkeys["aleft"] = buffer.word_left
+ -- newkeys["cdv"] = buffer.clear
+ -- newkeys["ck"] = function() buffer:line_end_extend() buffer:cut() end
+ -- newkeys["cl"] = buffer.vertical_centre_caret
newkeys.fn = OSX and function() return true end or nil
- newkeys[OSX and 'c@' or 'c '] = complete_symbol
+ newkeys[OSX and "c@" or "c "] = complete_symbol
end
@@ -216,47 +218,47 @@ do
newmenu.search = {
- title = '_Search',
+ title = "_Search",
SEPARATOR,
- { '_Find', find_in_file },
- { 'Find _Next', ui.find.find_next },
- { 'Find _Previous', ui.find.find_prev },
- { '_Replace', ui.find.replace },
- { 'Replace _All', ui.find.replace_all },
- { 'Find _Incremental', ui.find.find_incremental },
+ { "_Find", find_in_file },
+ { "Find _Next", ui.find.find_next },
+ { "Find _Previous", ui.find.find_prev },
+ { "_Replace", ui.find.replace },
+ { "Replace _All", ui.find.replace_all },
+ { "Find _Incremental", ui.find.find_incremental },
SEPARATOR,
- { 'Find in Fi_les', find_in_files },
- { 'Goto Nex_t File Found', find_next_in_files },
- { 'Goto Previou_s File Found', find_previous_in_files },
+ { "Find in Fi_les", find_in_files },
+ { "Goto Nex_t File Found", find_next_in_files },
+ { "Goto Previou_s File Found", find_previous_in_files },
SEPARATOR,
- { '_Jump to', textadept.editing.goto_line }
+ { "_Jump to", textadept.editing.goto_line }
}
-- The few times I use osx I want the same keys ... better explicitly handle
-- "not GUI" but I have to test the curses version first anyway.
- newkeys[OSX and 'mf' or 'cf'] = find_in_file
- newkeys[OSX and 'mg' or 'cg'] = ui.find.find_next
- newkeys[OSX and 'mG' or 'cG'] = ui.find.find_prev
- newkeys[OSX and 'mg' or 'cg'] = textadept.editing.goto_line
+ newkeys[OSX and "mf" or "cf"] = find_in_file
+ newkeys[OSX and "mg" or "cg"] = ui.find.find_next
+ newkeys[OSX and "mG" or "cG"] = ui.find.find_prev
+ newkeys[OSX and "mg" or "cg"] = textadept.editing.goto_line
- newkeys['f3'] = not OSX and ui.find.find_next or nil
- newkeys['sf3'] = not OSX and ui.find.find_prev or nil
+ newkeys["f3"] = not OSX and ui.find.find_next or nil
+ newkeys["sf3"] = not OSX and ui.find.find_prev or nil
- newkeys[OSX and 'cr' or 'car'] = ui.find.replace
- newkeys[OSX and 'cR' or 'caR'] = ui.find.replace_all
- newkeys[OSX and 'cmf' or 'caf'] = ui.find.find_incremental
+ newkeys[OSX and "cr" or "car"] = ui.find.replace
+ newkeys[OSX and "cR" or "caR"] = ui.find.replace_all
+ newkeys[OSX and "cmf" or "caf"] = ui.find.find_incremental
- newkeys[OSX and 'mF' or 'cF'] = find_in_files
- newkeys[OSX and 'cmg' or 'cag'] = find_next_in_files
- newkeys[OSX and 'cmG' or 'caG'] = find_previous_in_files
+ newkeys[OSX and "mF" or "cF"] = find_in_files
+ newkeys[OSX and "cmg" or "cag"] = find_next_in_files
+ newkeys[OSX and "cmG" or "caG"] = find_previous_in_files
end
@@ -265,7 +267,7 @@ do
io.quick_open_max = 5000
local function isdir(path)
- return path and path ~= "" and lfs.attributes(path,'mode') == 'directory'
+ return path and path ~= "" and lfs.attributes(path,"mode") == "directory"
end
local function resolveroot(path)
@@ -327,52 +329,62 @@ do
newmenu.tools = {
- title = '_Tools',
+ title = "_Tools",
SEPARATOR,
- { 'Check Source', runner.check },
- { 'Process Source', runner.process },
- { 'Preview Result', runner.preview },
- { 'Show Log File', runner.install("logfile") },
- { 'Quit', runner.quit },
+ { "Check Source", runner.check },
+ { "Process Source", runner.process },
+ { "Preview Result", runner.preview },
+ { "Show Log File", runner.install("logfile") },
+ { "Quit", runner.quit },
SEPARATOR,
- { 'Open Current Directory', opencurrentdirectory },
- { 'Open User Directory', openuserdirectory },
- { 'Open Base Directory', openbasedirectory },
+ { "Open Current Directory", opencurrentdirectory },
+ { "Open User Directory", openuserdirectory },
+ { "Open Base Directory", openbasedirectory },
SEPARATOR,
- { 'Purge Files', runner.install("purge") },
- { 'Clear Cache', runner.install("clear") },
- { 'Generate File Database', runner.install("generate") },
- { 'Generate Font Database', runner.install("fonts") },
+ { "Purge Files", runner.install("purge") },
+ { "Clear Cache", runner.install("clear") },
+ { "Generate File Database", runner.install("generate") },
+ { "Generate Font Database", runner.install("fonts") },
SEPARATOR,
- { 'Typeset Listing', runner.install("listing") },
- { 'Process and Arrange', runner.install("arrange") },
+ { "Typeset Listing", runner.install("listing") },
+ { "Process and Arrange", runner.install("arrange") },
SEPARATOR,
- { 'Start Document Service', startservice },
- { 'Goto Document Service', showcommand },
+ { "Start Document Service", startservice },
+ { "Goto Document Service", showcommand },
SEPARATOR,
- { 'Show Unicodes', runner.install("unicodes") },
+ { "Show Unicodes", runner.unicodes },
- }
+ -- We need this bogus entry because otherwise we get a message due to macros.lua. I
+ -- might need to come up with some proper placeholder. Well, let's for now just
+ -- live with the crash.
+
+ -- SEPARATOR,
+ --
+ -- { "Select Co_mmand", textadept.editing.goto_line },
+
+}
- -- newkeys[OSX and 'mc' or 'cc'] = runner.check
- newkeys[OSX and 'mr' or 'cr'] = runner.process
- newkeys[OSX and 'mp' or 'cp'] = runner.preview
- -- newkeys[OSX and 'mx' or 'cx'] = runner.quit -- makes no sense
+ -- newkeys[OSX and "mc" or "cc"] = runner.check
+ newkeys[OSX and "mr" or "cr"] = runner.process
+ newkeys[OSX and "mp" or "cp"] = runner.preview
+ -- newkeys[OSX and "mx" or "cx"] = runner.quit -- makes no sense
- newkeys['f7'] = runner.process
- newkeys['f12'] = runner.process
+ newkeys["f7"] = runner.process
+ newkeys["f12"] = runner.process
+
+ newkeys["f2"] = runner.unicodes
end
@@ -408,19 +420,19 @@ do
end
function set_endoding_utf8()
- set_encoding('UTF-8')
+ set_encoding("UTF-8")
end
function set_encoding_ascii()
- set_encoding('ASCII')
+ set_encoding("ASCII")
end
function set_endoding_utf16le()
- set_encoding('UTF-16LE')
+ set_encoding("UTF-16LE")
end
function set_endoding_utf16Be()
- set_encoding('UTF-16BE')
+ set_encoding("UTF-16BE")
end
function goto_prev_buffer()
@@ -433,50 +445,50 @@ do
newmenu.buffer = {
- title = '_Buffer',
+ title = "_Buffer",
SEPARATOR,
- { '_Previous Buffer', goto_prev_buffer },
- { '_Next Buffer', goto_next_buffer },
- { '_Switch to Buffer', ui.switch_buffer },
+ { "_Previous Buffer", goto_prev_buffer },
+ { "_Next Buffer", goto_next_buffer },
+ { "_Switch to Buffer", ui.switch_buffer },
SEPARATOR,
- { '_Toggle Use Tabs', use_tabs },
+ { "_Toggle Use Tabs", use_tabs },
{
- title = 'EOL Mode',
+ title = "EOL Mode",
- { '_CRLF', set_eol_mode_crlf },
- { '_LF', set_eol_mode_lf },
+ { "_CRLF", set_eol_mode_crlf },
+ { "_LF", set_eol_mode_lf },
},
{
- title = 'Encoding',
+ title = "Encoding",
- { '_ASCII', set_encoding_ascii },
- { '_UTF-8', set_encoding_utf8 },
- { 'UTF-16-_BE', set_encoding_utf16le },
- { 'UTF-16-_LE', set_encoding_utf16be },
+ { "_ASCII", set_encoding_ascii },
+ { "_UTF-8", set_encoding_utf8 },
+ { "UTF-16-_BE", set_encoding_utf16le },
+ { "UTF-16-_LE", set_encoding_utf16be },
},
SEPARATOR,
- { 'Toggle View _EOL', show_eol },
- { 'Toggle _Wrap Mode', wrap_mode },
- { 'Toggle View _Spacing', show_whitespace },
+ { "Toggle View _EOL", show_eol },
+ { "Toggle _Wrap Mode", wrap_mode },
+ { "Toggle View _Spacing", show_whitespace },
SEPARATOR,
- { 'Select _Lexer', textadept.file_types.select_lexer },
- { 'Refresh _Syntax Highlighting', update_lexing }
+ { "Select _Lexer", textadept.file_types.select_lexer },
+ { "Refresh _Syntax Highlighting", update_lexing }
}
- newkeys['f5'] = update_lexing
+ newkeys["f5"] = update_lexing
- newkeys[OSX and 'mp' or 'cs\t'] = goto_prev_buffer
- newkeys[OSX and 'mn' or 'c\t'] = goto_next_buffer
- newkeys[OSX and 'mb' or 'cb'] = ui.switch_buffer
+ newkeys[OSX and "mp" or "cs\t"] = goto_prev_buffer
+ newkeys[OSX and "mn" or "c\t"] = goto_next_buffer
+ newkeys[OSX and "mb" or "cb"] = ui.switch_buffer
end
@@ -502,34 +514,34 @@ do
newmenu.view = {
- title = '_View',
+ title = "_View",
SEPARATOR,
- { 'Toggle Current _Fold' , toggle_current_fold },
+ { "Toggle Current _Fold" , toggle_current_fold },
SEPARATOR,
- { 'Toggle Show In_dent Guides', toggle_show_guides },
- { 'Toggle _Virtual Space', toggle_virtual_space },
+ { "Toggle Show In_dent Guides", toggle_show_guides },
+ { "Toggle _Virtual Space", toggle_virtual_space },
SEPARATOR,
- { 'Zoom _In', buffer.zoom_in },
- { 'Zoom _Out', buffer.zoom_out },
- { '_Reset Zoom', reset_zoom },
+ { "Zoom _In", buffer.zoom_in },
+ { "Zoom _Out", buffer.zoom_out },
+ { "_Reset Zoom", reset_zoom },
}
- newkeys[OSX and 'm=' or 'c='] = buffer.zoom_in
- newkeys[OSX and 'm-' or 'c-'] = buffer.zoom_out
- newkeys[OSX and 'm0' or 'c0'] = reset_zoom
+ newkeys[OSX and "m=" or "c="] = buffer.zoom_in
+ newkeys[OSX and "m-" or "c-"] = buffer.zoom_out
+ newkeys[OSX and "m0" or "c0"] = reset_zoom
end
do
- -- It's a pitt y that we can't have a proper monospaced font here so we try to make the best of it:
+ -- It"s a pitt y that we can"t have a proper monospaced font here so we try to make the best of it:
local template = "\n\trelease info: %s\t\n\n\tcopyright: %s\t\n\n\tvariant: ConTeXt related editing\t\n\n\tadapted by: Hans Hagen\t"
@@ -541,27 +553,54 @@ do
end
local function open_url(url) -- adapted from non public open_page
- local cmd = (WIN32 and 'start ""') or (OSX and 'open') or 'xdg-open'
- spawn(format('%s "%s"', cmd, url))
+ local cmd = (WIN32 and 'start ""') or (OSX and "open") or "xdg-open"
+ os.spawn(format('%s "%s"', cmd, url))
end
newmenu.help = {
- title = '_Help',
+ title = "_Help",
SEPARATOR,
- { 'ConTeXt garden wiki', function() open_url("http://www.contextgarden.net") end },
+ { "ConTeXt garden wiki", function() open_url("http://www.contextgarden.net") end },
-- SEPARATOR,
- { '_About', show_about }
+ { "_About", show_about }
}
end
+do
+
+ -- from shift F11 and startup script
+
+ table.insert(textadept.menu.context_menu, SEPARATOR)
+
+ table.insert(textadept.menu.context_menu, { "wrap", runner.wrap })
+ table.insert(textadept.menu.context_menu, { "unwrap", runner.unwrap })
+ table.insert(textadept.menu.context_menu, { "sort", runner.sort })
+ -- table.insert(textadept.menu.context_menu, { "document", function() end })
+ -- table.insert(textadept.menu.context_menu, { "quote", function() end })
+ -- table.insert(textadept.menu.context_menu, { "compound", function() end })
+ -- table.insert(textadept.menu.context_menu, { "add", function() end })
+ -- table.insert(textadept.menu.context_menu, { "bidi", function() end })
+ -- table.insert(textadept.menu.context_menu, { "strip", function() end })
+
+
+ -- cM wrap
+ -- cR reset spelling
+ -- cI insert template
+ -- cE show log
+ -- c+ toggle strip
+
+ newkeys[OSX and "mm" or "cm"] = runner.wrap
+
+end
+
do
local function replace(oldmenu,newmenu)
@@ -575,13 +614,13 @@ do
end
end
- replace(textadept.menu.menubar [_L['_File']], newmenu.file)
- replace(textadept.menu.menubar [_L['_Edit']], newmenu.edit)
- replace(textadept.menu.menubar [_L['_Search']], newmenu.search)
- replace(textadept.menu.menubar [_L['_Tools']], newmenu.tools)
- replace(textadept.menu.menubar [_L['_Buffer']], newmenu.buffer)
- replace(textadept.menu.menubar [_L['_View']], newmenu.view)
- replace(textadept.menu.menubar [_L['_Help']], newmenu.help)
+ replace(textadept.menu.menubar [_L["_File"]], newmenu.file)
+ replace(textadept.menu.menubar [_L["_Edit"]], newmenu.edit)
+ replace(textadept.menu.menubar [_L["_Search"]], newmenu.search)
+ replace(textadept.menu.menubar [_L["_Tools"]], newmenu.tools)
+ replace(textadept.menu.menubar [_L["_Buffer"]], newmenu.buffer)
+ replace(textadept.menu.menubar [_L["_View"]], newmenu.view)
+ replace(textadept.menu.menubar [_L["_Help"]], newmenu.help)
local char = string.char
@@ -635,6 +674,19 @@ do
keys[k] = v
end
+ -- add helper to textadept-context-runner.lua instead
+
+ events.connect(events.INITIALIZED, function()
+ for i=1,#_BUFFERS do
+ local buffer = _BUFFERS[i]
+ if buffer._type == OUTPUT_BUFFER then
+ view:goto_buffer(i)
+ io.close_buffer()
+ return
+ end
+ end
+ end)
+
end
-- We have a different way to set up files and runners. Less distributed and morein the way we
diff --git a/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-runner.lua b/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-runner.lua
index d78a4f94988..1181b13a37d 100644
--- a/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-runner.lua
+++ b/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-runner.lua
@@ -28,7 +28,9 @@ local info = {
-- Somehow the process hangs when I refresh the pdf viewer, this doesn't happen in scite so
-- the underlying code is for the moment less reliant.
-local match, gsub, find, format = string.match, string.gsub, string.find, string.format
+local match, gsub, find, format, gmatch, rep = string.match, string.gsub, string.find, string.format, string.gmatch, string.rep
+local char, lower, upper, sub = string.char, string.lower, string.upper, string.sub
+local concat, sort = table.concat, table.sort
local assert, type = assert, type
local original = textadept.run
@@ -82,10 +84,17 @@ local function print_output(str)
print_buffer:append_text(str)
print_buffer:goto_pos(buffer.length)
print_buffer:set_save_point()
- --
return true -- quits
end
+local function trace_output(str)
+ xbuffer = buffer
+ print_output(str)
+ if xbuffer then
+ view:goto_buffer(xbuffer)
+ end
+end
+
local function clear_output()
xbuffer = buffer
local print_buffer = find_buffer(OUTPUT_BUFFER)
@@ -99,8 +108,16 @@ local function is_output(buffer)
end
-- Instead of events we will have out own interceptors so that we don't have
--- interference. The main problem is that we don't hav emuch control over the
--- order. If we have much actions I can always come up with something.
+-- interference. The main problem is that we don't have much control over the
+-- order. If we have much actions I can always come up with something.
+
+-- The textadept console seems a bit slower than the one in scite (which does some
+-- output pane parsing so it could be even faster). Maybe it relates to the way
+-- the program is run. Scite provides some more control over this. It might have
+-- to do with the way tex pipes to the console, because from a simple lua run it's
+-- quite fast. Maybe calling cmd is not optimal. Anyhow, it means that for now I
+-- should not use textadept when running performance test that need to compare with
+-- the past.
local function process(buffer,filename,action)
if not filename then
@@ -153,21 +170,21 @@ local function process(buffer,filename,action)
local function emit_output(output)
print_output(output) -- events.emit(RUNNER_EVENT,...)
-- afaik there is no way to check if we're waiting for input (no input callback)
- if quitter then
- local quit, message = quitter(interceptor)
- if quit then
- if message then
- print_output(format("\n\n> quit: %s\n",message))
- end
- runner.quit()
- end
- end
+ if quitter then
+ local quit, message = quitter(interceptor)
+ if quit then
+ if message then
+ print_output(format("\n\n> quit: %s\n",message))
+ end
+ runner.quit()
+ end
+ end
end
local function exit_output(status)
print_output(format("\n\n> exit: %s, press esc to return to source\n",status)) -- events.emit(RUNNER_EVENT,...)
end
print_output(format("> command: %s\n",command)) -- events.emit(RUNNER_EVENT,...)
- currentprocess = assert(spawn(command, pathpart, emit_output, emit_output, exit_output))
+ currentprocess = assert(os.spawn(command, pathpart, emit_output, emit_output, exit_output))
end
function runner.install(name)
@@ -223,6 +240,208 @@ local function double_click()
end
end
+--
+
+local l2 = char(0xC0)
+local l3 = char(0xE0)
+local l4 = char(0xF0)
+
+local function utflen(str)
+ local n = 0
+ local l = 0
+ for s in gmatch(str,".") do
+ if l > 0 then
+ l = l - 1
+ else
+ n = n + 1
+ if s >= l4 then
+ l = 3
+ elseif s >= l3 then
+ l = 2
+ elseif s >= l2 then
+ l = 1
+ end
+ end
+ end
+ return n
+end
+
+local function prepare()
+ local startposition = buffer.selection_start
+ local endposition = buffer.selection_end
+
+ if startposition == endposition then return end
+
+ buffer.current_pos = startposition
+ buffer:home()
+
+ buffer.current_pos = endposition
+ buffer:line_end_extend()
+
+ local firstposition = buffer.selection_start
+ local lastposition = buffer.selection_end
+
+ local firstline = buffer:line_from_position(startposition)
+ local lastline = buffer:line_from_position(endposition)
+
+ local startcolumn = startposition - firstposition
+ local endcolumn = lastposition - endposition + 1
+ local selection = buffer:get_sel_text()
+
+ -- trace_output(firstposition .. " " .. startposition .. "\n")
+ -- trace_output(endposition .. " " .. lastposition .. "\n")
+
+ return startposition, endposition, firstposition, lastposition, startcolumn, endcolumn, firstline, lastline, selection
+end
+
+local function replace(startposition,lastposition,replacement)
+ if type(replacement) == "table" then
+ replacement = concat(replacement,"\n")
+ end
+ -- trace_output(replacement .. "\n")
+
+ buffer.current_pos = startposition
+
+ buffer:begin_undo_action()
+ buffer:set_target_range(startposition,lastposition)
+ buffer:replace_target(replacement)
+ buffer:end_undo_action()
+
+ buffer.selection_start = startposition
+ buffer.selection_end = startposition
+end
+
+-- This is old code, from my early lua days, so not that nice and optimal, but
+-- no one sees it and performance is irrelevant here.
+
+local magicstring = rep("<ctx-crlf/>", 2)
+
+function runner.wrap()
+
+ local startposition, endposition, firstposition, lastposition, startcolumn, endcolumn, firstline, lastline, selection = prepare()
+
+ if not startposition then
+ return
+ end
+
+ local wraplength = buffer.wrap_length
+ local length = tonumber(wraplength) or 80
+ local replacement = { }
+ local templine = ""
+ local tempsize = 0
+ local indentation = rep(' ',startcolumn)
+
+ selection = gsub(selection,"[\n\r][\n\r]","\n")
+ selection = gsub(selection,"\n\n+"," " .. magicstring .. " ")
+ selection = gsub(selection,"^%s",'')
+
+ for snippet in gmatch(selection,"%S+") do
+ if snippet == magicstring then
+ replacement[#replacement+1] = templine
+ replacement[#replacement+1] = ""
+ templine = ""
+ tempsize = 0
+ else
+ local snipsize = utflen(snippet)
+ if tempsize + snipsize > length then
+ replacement[#replacement+1] = templine
+ templine = indentation .. snippet
+ tempsize = startcolumn + snipsize
+ elseif tempsize == 0 then
+ templine = indentation .. snippet
+ tempsize = tempsize + startcolumn + snipsize
+ else
+ templine = templine .. " " .. snippet
+ tempsize = tempsize + 1 + snipsize
+ end
+ end
+ end
+
+ replacement[#replacement+1] = templine
+ replacement[1] = gsub(replacement[1],"^%s+","")
+
+ if endcolumn == 0 then
+ replacement[#replacement+1] = ""
+ end
+
+ replace(startposition,lastposition,replacement)
+
+end
+
+local magicstring = rep("<multiplelines/>", 2)
+
+function runner.unwrap()
+
+ local startposition, endposition, firstposition, lastposition, startcolumn, endcolumn, selection, firstline, lastline = prepare()
+
+ if not startposition then
+ return
+ end
+
+ startposition = firstposition
+ endposition = lastposition
+
+ local selection = gsub(selection,"[\n\r][\n\r]+", " " .. magicstring .. " ")
+ local replacement = { }
+
+ for snippet in gmatch(selection,"%S+") do
+ replacement[#replacement+1] = snippet == magicstring and "" or snippet
+ end
+
+ if endcolumn == 0 then
+ replacement[#replacement+1] = ""
+ end
+
+ replace(startposition,lastposition,replacement)
+
+end
+
+-- This is real old crappy code which doesn't really pass my current qa standards but
+-- it does the job so ... (hashing the blobs would work ok).
+
+local function grab(str,delimiter)
+ local list = { }
+ for snippet in gmatch(str,delimiter) do
+ list[#list+1] = snippet
+ end
+ return list
+end
+
+local function alphacmp_yes(a,b)
+ return lower(gsub(sub(a,i),"0"," ")) < lower(gsub(sub(b,i),"0"," "))
+end
+
+local function alphacmp_nop(a,b)
+ return lower(a) < lower(b)
+end
+
+local function alphasort(list,i)
+ sort(list,i and i > 0 and alphacmp_yes or alphacmp_nop)
+end
+
+function runner.sort()
+
+ local startposition, endposition, firstposition, lastposition, startcolumn, endcolumn, firstline, lastline, selection = prepare()
+
+ if not startposition then
+ return
+ end
+
+ startposition = firstposition
+ endposition = lastposition
+
+ local list = grab(selection,"[^\n\r]+")
+
+ alphasort(list,startcolumn)
+
+ if endcolumn == 0 then
+ list[#list+1] = ""
+ end
+
+ replace(startposition,lastposition,list)
+
+end
+
-- Tricky: we can't reset an event (because we need to know the function which is
-- local. So, a first solution injected a false into the table which will trigger
-- a break and then I found out that returning true has the same effect. Then I
@@ -235,6 +454,609 @@ events.connect(events.CHAR_ADDED, char_added, 1)
events.connect(events.KEYPRESS, key_press, 1)
events.connect(events.DOUBLE_CLICK, double_click, 1)
+-- We need to get rid of the crash due to macros.lua event crash in
+--
+-- -- textadept.menu.menubar[_L['_Tools']][_L['Select Co_mmand']][2],
+
+-- for i=1,#_VIEWS do
+-- if _VIEWS[i].buffer._type == "[Message Buffer]" then
+-- ui.goto_view(_VIEWS[i])
+-- buffer.current_pos = buffer.current_pos
+-- io.close_buffer()
+-- break
+-- end
+-- end
+-- for i = 1, #_BUFFERS do
+-- if _BUFFERS[i]._type == "[Message Buffer]" then
+-- view:goto_buffer(_BUFFERS[i])
+-- buffer.current_pos = buffer.current_pos
+-- io.close_buffer()
+-- break
+-- end
+-- end
+
+-- I don't want the indentation. I also want an extra space which in turn means
+-- a more extensive test. I also don't care about a suffix. Adapted a bit to
+-- match the code above.
+
+function runner.blockcomment()
+ local buffer = buffer
+ local comment = textadept.editing.comment_string[buffer:get_lexer(true)]
+
+ if not comment or comment == "" then
+ return
+ end
+
+ local prefix = comment:match('^([^|]+)|?([^|]*)$')
+ local usedprefix = prefix
+
+ if not prefix then
+ return
+ end
+
+ if not find(prefix,"%s$") then
+ usedprefix = prefix .. " "
+ end
+
+ local n_prefix = #prefix
+ local n_usedprefix = #usedprefix
+
+ local startposition = buffer.selection_start
+ local endposition = buffer.selection_end
+ local firstline = buffer:line_from_position(startposition)
+ local lastline = buffer:line_from_position(endposition)
+
+ if firstline ~= lastline and endposition == buffer:position_from_line(lastline) then
+ lastline = lastline - 1
+ end
+
+ startposition = buffer.line_end_position[startposition] - startposition
+ endposition = buffer.length - endposition
+
+ buffer:begin_undo_action()
+
+ for line=firstline,lastline do
+ local p = buffer:position_from_line(line)
+ if buffer:text_range(p, p + n_usedprefix) == usedprefix then
+ buffer:delete_range(p, n_usedprefix)
+ elseif buffer:text_range(p, p + n_prefix) == prefix then
+ buffer:delete_range(p, n_prefix)
+ else
+ buffer:insert_text(p, usedprefix)
+ end
+ end
+
+ buffer:end_undo_action()
+
+ startposition = buffer.line_end_position[firstline] - startposition
+ endposition = buffer.length - endposition
+
+ -- whatever ...
+
+ local start_pos = buffer:position_from_line(firstline)
+
+ if start_pos > startposition then
+ startposition = start_pos
+ end
+ if start_pos > endposition then
+ endposition = start_pos
+ end
+
+ if firstline ~= lastline then
+ buffer:set_sel(startposition, endposition)
+ else
+ buffer:goto_pos(endposition)
+ end
+end
+
+-- This only works partially as for some reason scite shows proper math symbols while
+-- here we don't see them. I need to look into that.
+
+local textlists = { -- taken from sort-lan.lua
+ en = {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
+ "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
+ "u", "v", "w", "x", "y", "z",
+
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
+ "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
+ "U", "V", "W", "X", "Y", "Z",
+ },
+ nl = {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
+ "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
+ "u", "v", "w", "x", "y", "z",
+
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
+ "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
+ "U", "V", "W", "X", "Y", "Z",
+ },
+ fr = {
+ "a", "æ", "b", "c", "ç", "d", "e", "è", "é", "ê",
+ "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
+ "p", "q", "r", "s", "t", "u", "v", "w", "x", "y",
+ "z",
+
+ "A", "Æ", "B", "C", "Ç", "D", "E", "È", "É", "Ê",
+ "F", "G", "H", "I", "J", "K", "L", "M", "N", "O",
+ "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y",
+ "Z",
+
+ },
+ de = {
+ "a", "ä", "b", "c", "d", "e", "f", "g", "h", "i",
+ "j", "k", "l", "m", "n", "o", "ö", "p", "q", "r",
+ "s", "ß", "t", "u", "ü", "v", "w", "x", "y", "z",
+
+ "A", "Ä", "B", "C", "D", "E", "F", "G", "H", "I",
+ "J", "K", "L", "M", "N", "O", "Ö", "P", "Q", "R",
+ "S", "SS", "T", "U", "Ü", "V", "W", "X", "Y", "Z",
+ },
+ fi = { -- finish
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
+ "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
+ "u", "v", "w", "x", "y", "z", "å", "ä", "ö",
+
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
+ "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
+ "U", "V", "W", "X", "Y", "Z", "Å", "Ä", "Ö",
+ },
+ sl = { -- slovenian
+ "a", "b", "c", "Ä", "ć", "d", "Ä‘", "e", "f", "g", "h", "i",
+ "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "Å¡", "t",
+ "u", "v", "w", "x", "y", "z", "ž",
+
+ "A", "B", "C", "ÄŒ", "Ć", "D", "Ä", "E", "F", "G", "H", "I",
+ "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "Å ", "T",
+ "U", "V", "W", "X", "Y", "Z", "Ž",
+ },
+ ru = { -- rusian
+ "а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и",
+ "Ñ–", "й", "к", "л", "м", "н", "о", "п", "Ñ€", "Ñ",
+ "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы",
+ "ÑŒ", "Ñ£", "Ñ", "ÑŽ", "Ñ", "ѳ", "ѵ",
+
+ "Ð", "Б", "Ð’", "Г", "Д", "Е", "Ð", "Ж", "З", "И",
+ "І", "Й", "К", "Л", "Ðœ", "Ð", "О", "П", "Р", "С",
+ "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы",
+ "Ь", "Ѣ", "Э", "Ю", "Я", "Ѳ", "Ѵ",
+ },
+ uk = { -- ukraninuan
+ "а", "б", "в", "г", "ґ", "д", "е", "є", "ж", "з", "и", "і",
+ "Ñ—", "й", "к", "л", "м", "н", "о", "п", "Ñ€", "Ñ", "Ñ‚", "у",
+ "Ñ„", "Ñ…", "ц", "ч", "ш", "щ", "ÑŒ", "ÑŽ", "Ñ",
+
+ "Ð", "Б", "Ð’", "Г", "Ò", "Д", "Е", "Є", "Ж", "З", "И", "І",
+ "Ї", "Й", "К", "Л", "Ðœ", "Ð", "О", "П", "Р", "С", "Т", "У",
+ "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ь", "Ю", "Я",
+ },
+ be = { -- belarusia
+ "а", "б", "в", "г", "д", "е", "ё", "ж", "з", "і",
+ "й", "к", "л", "м", "н", "о", "п", "Ñ€", "Ñ", "Ñ‚",
+ "у", "Ñž", "Ñ„", "Ñ…", "ц", "ч", "ш", "Ñ‹", "ÑŒ", "Ñ",
+ "ÑŽ", "Ñ",
+
+ "Ð", "Б", "Ð’", "Г", "Д", "Е", "Ð", "Ж", "З", "І",
+ "Й", "К", "Л", "Ðœ", "Ð", "О", "П", "Р", "С", "Т",
+ "У", "Ў", "Ф", "Х", "Ц", "Ч", "Ш", "Ы", "Ь", "Э",
+ "Ю", "Я",
+ },
+ bg = { -- bulgarian
+ "а", "б", "в", "г", "д", "е", "ж", "з","и", "й",
+ "к", "a", "л", "a", "м", "н", "о", "п", "Ñ€", "Ñ",
+ "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ь",
+ "ÑŽ", "Ñ",
+
+ "Ð", "Б", "Ð’", "Г", "Д", "Е", "Ж", "З","И", "Й",
+ "К", "A", "Л", "A", "Ðœ", "Ð", "О", "П", "Р", "С",
+ "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ь",
+ "Ю", "Я",
+ },
+ pl = { -- polish
+ "a", "ą", "b", "c", "ć", "d", "e", "ę", "f", "g",
+ "h", "i", "j", "k", "l", "Å‚", "m", "n", "Å„", "o",
+ "ó", "p", "q", "r", "s", "ś", "t", "u", "v", "w",
+ "x", "y", "z", "ź", "ż",
+
+ "A", "Ą", "B", "C", "Ć", "D", "E", "Ę", "F", "G",
+ "H", "I", "J", "K", "L", "Å", "M", "N", "Ń", "O",
+ "Ó", "P", "Q", "R", "S", "Ś", "T", "U", "V", "W",
+ "X", "Y", "Z", "Ź", "Ż",
+ },
+ cz = { -- czech
+ "a", "á", "b", "c", "Ä", "d", "Ä", "e", "é", "Ä›",
+ "f", "g", "h", "i", "í", "j", "k", "l", "m",
+ "n", "ň", "o", "ó", "p", "q", "r", "ř", "s", "š",
+ "t", "ť", "u", "ú", "ů", "v", "w", "x", "y", "ý",
+ "z", "ž",
+
+ "A", "Ã", "B", "C", "ÄŒ", "D", "ÄŽ", "E", "É", "Äš",
+ "F", "G", "H", "I", "Ã", "J", "K", "L", "M",
+ "N", "Ň", "O", "Ó", "P", "Q", "R", "Ř", "S", "Š",
+ "T", "Ť", "U", "Ú", "Å®", "V", "W", "X", "Y", "Ã",
+ "Z", "Ž",
+ },
+ sk = { -- slovak
+ "a", "á", "ä", "b", "c", "Ä", "d", "Ä",
+ "e", "é", "f", "g", "h", ch, "i", "í", "j", "k",
+ "l", "ĺ", "ľ", "m", "n", "ň", "o", "ó", "ô", "p",
+ "q", "r", "ŕ", "s", "š", "t", "ť", "u", "ú", "v",
+ "w", "x", "y", "ý", "z", "ž",
+
+ "A", "Ã", "Ä", "B", "C", "ÄŒ", "D", "ÄŽ",
+ "E", "É", "F", "G", "H", "I", "Ã", "J", "K",
+ "L", "Ĺ", "Ľ", "M", "N", "Ň", "O", "Ó", "Ô", "P",
+ "Q", "R", "Ŕ", "S", "Š", "T", "Ť", "U", "Ú", "V",
+ "W", "X", "Y", "Ã", "Z", "Ž",
+ },
+ hr = { -- croatian
+ "a", "b", "c", "Ä", "ć", "d", "Ä‘", "e", "f",
+ "g", "h", "i", "j", "k", "l", "m", "n",
+ "o", "p", "r", "s", "š", "t", "u", "v", "z", "ž",
+
+ "A", "B", "C", "ÄŒ", "Ć", "D", "Ä", "E", "F",
+ "G", "H", "I", "J", "K", "L", "M", "N",
+ "O", "P", "R", "S", "Š", "T", "U", "V", "Z", "Ž",
+ },
+ sr = { -- serbian
+ "а", "б", "в", "г", "д", "ђ", "е", "ж", "з", "и",
+ "ј", "к", "л", "љ", "м", "н", "њ", "о", "п", "р",
+ "Ñ", "Ñ‚", "Ñ›", "у", "Ñ„", "Ñ…", "ц", "ч", "ÑŸ", "ш",
+
+ "Ð", "Б", "Ð’", "Г", "Д", "Ђ", "Е", "Ж", "З", "И",
+ "Ј", "К", "Л", "Љ", "Ðœ", "Ð", "Њ", "О", "П", "Р",
+ "С", "Т", "Ћ", "У", "Ф", "Ð¥", "Ц", "Ч", "Ð", "Ш",
+ },
+ no = { -- norwegian
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
+ "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
+ "u", "v", "w", "x", "y", "z", "æ", "ø", "å",
+
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
+ "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
+ "U", "V", "W", "X", "Y", "Z", "Æ", "Ø", "Å",
+ },
+ da = { --danish
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
+ "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
+ "u", "v", "w", "x", "y", "z", "æ", "ø", "å",
+
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
+ "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
+ "U", "V", "W", "X", "Y", "Z", "Æ", "Ø", "Å",
+ },
+ sv = { -- swedish
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
+ "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
+ "u", "v", "w", "x", "y", "z", "å", "ä", "ö",
+
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
+ "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
+ "U", "V", "W", "X", "Y", "Z", "Å", "Ä", "Ö",
+ },
+ is = { -- islandic
+ "a", "á", "b", "d", "ð", "e", "é", "f", "g", "h",
+ "i", "í", "j", "k", "l", "m", "n", "o", "ó", "p",
+ "r", "s", "t", "u", "ú", "v", "x", "y", "ý", "þ",
+ "æ", "ö",
+
+ "A", "Ã", "B", "D", "Ã", "E", "É", "F", "G", "H",
+ "I", "Ã", "J", "K", "L", "M", "N", "O", "Ó", "P",
+ "R", "S", "T", "U", "Ú", "V", "X", "Y", "Ã", "Þ",
+ "Æ", "Ö",
+ },
+ -- gr = { -- greek
+ -- "α", "ά", "á½°", "ᾶ", "á¾³", "á¼€", "á¼", "ἄ", "ἂ", "ἆ",
+ -- "á¼", "á¼…", "ἃ", "ἇ", "á¾", "á¾´", "á¾²", "á¾·", "ᾄ", "ᾂ",
+ -- "ᾅ", "ᾃ", "ᾆ", "ᾇ", "β", "γ", "δ", "ε", "έ", "ὲ",
+ -- "á¼", "á¼”", "á¼’", "ἑ", "ἕ", "ἓ", "ζ", "η", "η", "ή",
+ -- "á½´", "ῆ", "ῃ", "á¼ ", "ἤ", "á¼¢", "ἦ", "á¾", "ἡ", "á¼¥",
+ -- "ἣ", "ἧ", "ᾑ", "ῄ", "ῂ", "ῇ", "ᾔ", "ᾒ", "ᾕ", "ᾓ",
+ -- "ᾖ", "ᾗ", "θ", "ι", "ί", "ὶ", "ῖ", "ἰ", "ἴ", "ἲ",
+ -- "ἶ", "á¼±", "á¼µ", "á¼³", "á¼·", "ÏŠ", "Î", "á¿’", "á¿—", "κ",
+ -- "λ", "μ", "ν", "ξ", "ο", "ό", "ὸ", "ὀ", "ὄ", "ὂ",
+ -- "á½", "á½…", "ὃ", "Ï€", "Ï", "ῤ", "á¿¥", "σ", "Ï‚", "Ï„",
+ -- "Ï…", "Ï", "ὺ", "ῦ", "á½", "á½”", "á½’", "á½–", "ὑ", "ὕ",
+ -- "ὓ", "ὗ", "ϋ", "ΰ", "ῢ", "ῧ", "φ", "χ", "ψ", "ω",
+ -- "ώ", "ὼ", "ῶ", "ῳ", "ὠ", "ὤ", "ὢ", "ὦ", "ᾠ", "ὡ",
+ -- "ὥ", "ὣ", "ὧ", "ᾡ", "ῴ", "ῲ", "ῷ", "ᾤ", "ᾢ", "ᾥ",
+ -- "ᾣ", "ᾦ", "ᾧ",
+ --
+ -- "Α", "Ά", "Ὰ", "Α͂", "Ἀ", "Ἁ", "Ἄ", "Ἂ", "Ἆ",
+ -- "Ἁ", "á¼", "Ἃ", "á¼",
+ -- "Β", "Γ", "Δ", "Ε", "Έ", "Ὲ",
+ -- "Ἐ", "Ἔ", "Ἒ", "á¼™", "á¼", "á¼›", "Ζ", "Η", "Η", "Ή",
+ -- "Ὴ", "Η͂", "Ἠ", "Ἤ", "Ἢ", "Ἦ", "Ἡ", "Ἥ",
+ -- "Ἣ", "Ἧ",
+ -- "Θ", "Ι", "Ί", "Ὶ", "Ι͂", "Ἰ", "Ἴ", "Ἲ",
+ -- "á¼¾", "á¼¹", "á¼½", "á¼»", "Ἷ", "Ϊ", "ΪÌ", "Ϊ̀", "Ϊ͂", "Κ",
+ -- "Λ", "Îœ", "Î", "Ξ", "Ο", "ÎŒ", "Ὸ", "Ὀ", "Ὄ", "Ὂ",
+ -- "Ὁ", "á½", "Ὃ", "Π", "Ρ", "Ρ̓", "Ῥ", "Σ", "Σ", "Τ",
+ -- "Î¥", "ÎŽ", "Ὺ", "Υ͂", "Υ̓", "Υ̓Ì", "Υ̓̀", "Υ̓͂", "á½™", "á½",
+ -- "á½›", "Ὗ", "Ϋ", "ΫÌ", "Ϋ̀", "Ϋ͂", "Φ", "Χ", "Ψ", "Ω",
+ -- "Î", "Ὼ", "Ω͂", "Ὠ", "Ὤ", "Ὢ", "á½®", "Ὡ",
+ -- "Ὥ", "Ὣ", "Ὧ",
+ -- },
+ gr = { -- greek
+ "α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ",
+ "λ", "μ", "ν", "ξ", "ο", "Ï€", "Ï", "Ï‚", "Ï„", "Ï…",
+ "φ", "χ", "ψ", "ω",
+
+ "Α", "Β", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ",
+ "Λ", "Îœ", "Î", "Ξ", "Ο", "Π", "Ρ", "Σ", "Τ", "Î¥",
+ "Χ", "Ψ", "Ω",
+ },
+ la = { -- latin
+ "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", "ȳ", "y̆", "z", "æ",
+
+ "A", "Ä€", "Ä‚", "B", "C", "D", "E", "Ä’", "Ä”", "F",
+ "G", "H", "I", "Ī", "Ĭ", "J", "K", "L", "M", "N",
+ "O", "Ō", "Ŏ", "P", "Q", "R", "S", "T", "U", "Ū",
+ "Ŭ", "V", "W", "X", "Y", "Ȳ", "Y̆", "Z", "Æ",
+ },
+ it = { -- italian
+ "a", "á", "b", "c", "d", "e", "é", "è", "f", "g",
+ "h", "i", "í", "ì", "j", "k", "l", "m", "n", "o",
+ "ó", "ò", "p", "q", "r", "s", "t", "u", "ú", "ù",
+ "v", "w", "x", "y", "z",
+
+ "A", "Ã", "B", "C", "D", "E", "É", "È", "F", "G",
+ "H", "I", "Ã", "ÃŒ", "J", "K", "L", "M", "N", "O",
+ "Ó", "Ò", "P", "Q", "R", "S", "T", "U", "Ú", "Ù",
+ "V", "W", "X", "Y", "Z",
+ },
+ ro = { -- romanian
+ "a", "ă", "â", "b", "c", "d", "e", "f", "g", "h",
+ "i", "î", "j", "k", "l", "m", "n", "o", "p", "q",
+ "r", "s", "È™", "t", "È›", "u", "v", "w", "x", "y",
+ "z",
+
+ "A", "Ă", "Â", "B", "C", "D", "E", "F", "G", "H",
+ "I", "ÃŽ", "J", "K", "L", "M", "N", "O", "P", "Q",
+ "R", "S", "Ș", "T", "Ț", "U", "V", "W", "X", "Y",
+ "Z",
+ },
+ es = { -- spanish
+ "a", "á", "b", "c", "d", "e", "é", "f", "g", "h",
+ "i", "í", "j", "k", "l", "m", "n", "ñ", "o", "ó",
+ "p", "q", "r", "s", "t", "u", "ú", "ü", "v", "w",
+ "x", "y", "z",
+
+ "A", "Ã", "B", "C", "D", "E", "É", "F", "G", "H",
+ "I", "Ã", "J", "K", "L", "M", "N", "Ñ", "O", "Ó",
+ "P", "Q", "R", "S", "T", "U", "Ú", "Ü", "V", "W",
+ "X", "Y", "Z",
+ },
+ pt = { -- portuguese
+ "a", "á", "â", "ã", "à", "b", "c", "ç", "d", "e",
+ "é", "ê", "f", "g", "h", "i", "í", "j", "k", "l",
+ "m", "n", "o", "ó", "ô", "õ", "p", "q", "r", "s",
+ "t", "u", "ú", "ü", "v", "w", "x", "y", "z",
+
+ "A", "Ã", "Â", "Ã", "À", "B", "C", "Ç", "D", "E",
+ "É", "Ê", "F", "G", "H", "I", "Ã", "J", "K", "L",
+ "M", "N", "O", "Ó", "Ô", "Õ", "P", "Q", "R", "S",
+ "T", "U", "Ú", "Ü", "V", "W", "X", "Y", "Z",
+ },
+ lt = { -- lithuanian
+ "a", "Ä…", "b", "c", "ch", "Ä", "d", "e", "Ä™", "Ä—",
+ "f", "g", "h", "i", "į", "y", "j", "k", "l", "m",
+ "n", "o", "p", "r", "s", "š", "t", "u", "ų", "ū",
+ "v", "z", "ž",
+
+ "A", "Ą", "B", "C", "CH", "Č", "D", "E", "Ę", "Ė",
+ "F", "G", "H", "I", "Ä®", "Y", "J", "K", "L", "M",
+ "N", "O", "P", "R", "S", "Š", "T", "U", "Ų", "Ū",
+ "V", "Z", "Ž",
+ },
+ lv = { -- latvian
+ "a", "Ä", "b", "c", "Ä", "d", "e", "Ä“", "f", "g",
+ "ģ", "h", "i", "ī", "j", "k", "ķ", "l", "ļ", "m",
+ "n", "ņ", "o", "Å", "p", "r", "Å—", "s", "Å¡", "t",
+ "u", "ū", "v", "z", "ž",
+
+ "A", "Ā", "B", "C", "Č", "D", "E", "Ē", "F", "G",
+ "Ģ", "H", "I", "Ī", "J", "K", "Ķ", "L", "Ļ", "M",
+ "N", "Ņ", "O", "Ō", "P", "R", "Ŗ", "S", "Š", "T",
+ "U", "Ū", "V", "Z", "Ž",
+ },
+ hu = { -- hungarian
+ "a", "á", "b", "c", "d", "e", "é",
+ "f", "g", "h", "i", "í", "j", "k", "l",
+ "m", "n", "o", "ó", "ö", "ő", "p", "q", "r",
+ "s", "t", "u", "ú", "ü", "ű", "v", "w",
+ "x", "y", "z",
+
+ "A", "Ã", "B", "C", "D", "E", "É",
+ "F", "G", "H", "I", "Ã", "J", "K", "L",
+ "M", "N", "O", "Ó", "Ö", "Å", "P", "Q", "R",
+ "S", "T", "U", "Ú", "Ü", "Ű", "V", "W",
+ "X", "Y", "Z",
+ },
+ et = { -- estonian
+ "a", "b", "d", "e", "f", "g", "h", "i", "j", "k",
+ "l", "m", "n", "o", "p", "r", "s", "š", "z", "ž",
+ "t", "u", "v", "w", "õ", "ä", "ö", "ü", "x", "y",
+
+ "A", "B", "D", "E", "F", "G", "H", "I", "J", "K",
+ "L", "M", "N", "O", "P", "R", "S", "Š", "Z", "Ž",
+ "T", "U", "V", "W", "Õ", "Ä", "Ö", "Ü", "X", "Y",
+ },
+ -- jp = { -- japanese
+ -- "ã‚", "ã„", "ã†", "ãˆ", "ãŠ", "ã‹", "ã", "ã", "ã‘", "ã“",
+ -- "ã•", "ã—", "ã™", "ã›", "ã", "ãŸ", "ã¡", "ã¤", "ã¦", "ã¨",
+ -- "ãª", "ã«", "ã¬", "ã­", "ã®", "ã¯", "ã²", "ãµ", "ã¸", "ã»",
+ -- "ã¾", "ã¿", "ã‚€", "ã‚", "ã‚‚", "ã‚„", "ゆ", "よ",
+ -- "ら", "ã‚Š", "ã‚‹", "ã‚Œ", "ã‚", "ã‚", "ã‚", "ã‚‘", "ã‚’", "ã‚“",
+ -- },
+}
+
+local textselector = { }
+for k, v in next, textlists do
+ textselector[#textselector+1] = k
+end
+sort(textselector)
+
+local mathsets = {
+ { "tf", {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
+ }, },
+ { "bf", {
+ "ð›", "ðœ", "ð", "ðž", "ðŸ", "ð ", "ð¡", "ð¢", "ð£", "ð¤", "ð¥", "ð¦", "ð§", "ð¨", "ð©", "ðª", "ð«", "ð¬", "ð­", "ð®", "ð¯", "ð°", "ð±", "ð²", "ð³",
+ "ð€", "ð", "ð‚", "ðƒ", "ð„", "ð…", "ð†", "ð‡", "ðˆ", "ð‰", "ðŠ", "ð‹", "ðŒ", "ð", "ðŽ", "ð", "ð", "ð‘", "ð’", "ð“", "ð”", "ð•", "ð–", "ð—", "ð˜", "ð™", "ðš",
+ "ðŸŽ", "ðŸ", "ðŸ", "ðŸ‘", "ðŸ’", "ðŸ“", "ðŸ”", "ðŸ•", "ðŸ–", "ðŸ—"
+ }, },
+ { "it", {
+ "ð‘Ž", "ð‘", "ð‘", "ð‘‘", "ð‘’", "ð‘“", "ð‘”", "â„Ž", "ð‘–", "ð‘—", "ð‘˜", "ð‘™", "ð‘š", "ð‘›", "ð‘œ", "ð‘", "ð‘ž", "ð‘Ÿ", "ð‘ ", "ð‘¡", "ð‘¢", "ð‘£", "ð‘¤", "ð‘¥", "ð‘¦", "ð‘§",
+ "ð´", "ðµ", "ð¶", "ð·", "ð¸", "ð¹", "ðº", "ð»", "ð¼", "ð½", "ð¾", "ð¿", "ð‘€", "ð‘", "ð‘‚", "ð‘ƒ", "ð‘„", "ð‘…", "ð‘†", "ð‘‡", "ð‘ˆ", "ð‘‰", "ð‘Š", "ð‘‹", "ð‘Œ", "ð‘",
+ }, },
+ { "bi", {
+ "ð’‚", "ð’ƒ", "ð’„", "ð’…", "ð’†", "ð’‡", "ð’ˆ", "ð’‰", "ð’Š", "ð’‹", "ð’Œ", "ð’", "ð’Ž", "ð’", "ð’", "ð’‘", "ð’’", "ð’“", "ð’”", "ð’•", "ð’–", "ð’—", "ð’˜", "ð’™", "ð’š", "ð’›",
+ "ð‘¨", "ð‘©", "ð‘ª", "ð‘«", "ð‘¬", "ð‘­", "ð‘®", "ð‘¯", "ð‘°", "ð‘±", "ð‘²", "ð‘³", "ð‘´", "ð‘µ", "ð‘¶", "ð‘·", "ð‘¸", "ð‘¹", "ð‘º", "ð‘»", "ð‘¼", "ð‘½", "ð‘¾", "ð‘¿", "ð’€", "ð’",
+ }, },
+ { "sc", {
+ "ð’µ", "ð’¶", "ð’·", "ð’¸", "ð’¹", "ℯ", "ð’»", "â„Š", "ð’½", "ð’¾", "ð’¿", "ð“€", "ð“", "ð“‚", "ð“ƒ", "â„´", "ð“…", "ð“†", "ð“‡", "ð“ˆ", "ð“‰", "ð“Š", "ð“‹", "ð“Œ", "ð“", "ð“Ž", "ð“",
+ "ð’œ", "ℬ", "ð’ž", "ð’Ÿ", "â„°", "ℱ", "ð’¢", "â„‹", "â„", "ð’¥", "ð’¦", "â„’", "ℳ", "ð’©", "ð’ª", "ð’«", "ð’¬", "â„›", "ð’®", "ð’¯", "ð’°", "ð’±", "ð’²", "ð’³", "ð’´",
+ }, },
+ { "sc bf", {
+ "ð“ª", "ð“«", "ð“¬", "ð“­", "ð“®", "ð“¯", "ð“°", "ð“±", "ð“²", "ð“³", "ð“´", "ð“µ", "ð“¶", "ð“·", "ð“¸", "ð“¹", "ð“º", "ð“»", "ð“¼", "ð“½", "ð“¾", "ð“¿", "ð”€", "ð”", "ð”‚", "ð”ƒ",
+ "ð“", "ð“‘", "ð“’", "ð““", "ð“”", "ð“•", "ð“–", "ð“—", "ð“˜", "ð“™", "ð“š", "ð“›", "ð“œ", "ð“", "ð“ž", "ð“Ÿ", "ð“ ", "ð“¡", "ð“¢", "ð“£", "ð“¤", "ð“¥", "ð“¦", "ð“§", "ð“¨", "ð“©",
+ }, },
+ { "fr", {
+ "ð”ž", "ð”Ÿ", "ð” ", "ð”¡", "ð”¢", "ð”£", "ð”¤", "ð”¥", "ð”¦", "ð”§", "ð”¨", "ð”©", "ð”ª", "ð”«", "ð”¬", "ð”­", "ð”®", "ð”¯", "ð”°", "ð”±", "ð”²", "ð”³", "ð”´", "ð”µ", "ð”¶", "ð”·",
+ "ð”„", "ð”…", "â„­", "ð”‡", "ð”ˆ", "ð”‰", "ð”Š", "â„Œ", "â„‘", "ð”", "ð”Ž", "ð”", "ð”", "ð”‘", "ð”’", "ð”“", "ð””", "â„œ", "ð”–", "ð”—", "ð”˜", "ð”™", "ð”š", "ð”›", "ð”œ", "ℨ",
+ }, },
+ { "ds", {
+ "ð•“", "ð•”", "ð••", "ð•–", "ð•—", "ð•˜", "ð•™", "ð•š", "ð•›", "ð•œ", "ð•", "ð•ž", "ð•Ÿ", "ð• ", "ð•¡", "ð•¢", "ð•£", "ð•¤", "ð•¥", "ð•¦", "ð•§", "ð•¨", "ð•©", "ð•ª", "ð•«",
+ "ð”¸", "ð”¹", "â„‚", "ð”»", "ð”¼", "ð”½", "ð”¾", "â„", "ð•€", "ð•", "ð•‚", "ð•ƒ", "ð•„", "â„•", "ð•†", "â„™", "â„š", "â„", "ð•Š", "ð•‹", "ð•Œ", "ð•", "ð•Ž", "ð•", "ð•", "ℤ", "ð•’",
+ "ðŸ˜", "ðŸ™", "ðŸš", "ðŸ›", "ðŸœ", "ðŸ", "ðŸž", "ðŸŸ", "ðŸ ", "ðŸ¡"
+ }, },
+ { "fr bf", {
+ "ð•¬", "ð•­", "ð•®", "ð•¯", "ð•°", "ð•±", "ð•²", "ð•³", "ð•´", "ð•µ", "ð•¶", "ð•·", "ð•¸", "ð•¹", "ð•º", "ð•»", "ð•¼", "ð•½", "ð•¾", "ð•¿", "ð–€", "ð–", "ð–‚", "ð–ƒ",
+ "ð–„", "ð–…", "ð–†", "ð–‡", "ð–ˆ", "ð–‰", "ð–Š", "ð–‹", "ð–Œ", "ð–", "ð–Ž", "ð–", "ð–", "ð–‘", "ð–’", "ð–“", "ð–”", "ð–•", "ð––", "ð–—", "ð–˜", "ð–™", "ð–š", "ð–›", "ð–œ", "ð–", "ð–ž", "ð–Ÿ"
+ }, },
+ { "ss tf", {
+ "ð–º", "ð–»", "ð–¼", "ð–½", "ð–¾", "ð–¿", "ð—€", "ð—", "ð—‚", "ð—ƒ", "ð—„", "ð—…", "ð—†", "ð—‡", "ð—ˆ", "ð—‰", "ð—Š", "ð—‹", "ð—Œ", "ð—", "ð—Ž", "ð—", "ð—", "ð—‘", "ð—’", "ð—“",
+ "ð– ", "ð–¡", "ð–¢", "ð–£", "ð–¤", "ð–¥", "ð–¦", "ð–§", "ð–¨", "ð–©", "ð–ª", "ð–«", "ð–¬", "ð–­", "ð–®", "ð–¯", "ð–°", "ð–±", "ð–²", "ð–³", "ð–´", "ð–µ", "ð–¶", "ð–·", "ð–¸", "ð–¹",
+ "ðŸ¢", "ðŸ£", "ðŸ¤", "ðŸ¥", "ðŸ¦", "ðŸ§", "ðŸ¨", "ðŸ©", "ðŸª", "ðŸ«"
+ }, },
+ { "ss bf", {
+ "ð—®", "ð—¯", "ð—°", "ð—±", "ð—²", "ð—³", "ð—´", "ð—µ", "ð—¶", "ð—·", "ð—¸", "ð—¹", "ð—º", "ð—»", "ð—¼", "ð—½", "ð—¾", "ð—¿", "ð˜€", "ð˜", "ð˜‚", "ð˜ƒ", "ð˜„", "ð˜…", "ð˜†", "ð˜‡",
+ "ð—”", "ð—•", "ð—–", "ð——", "ð—˜", "ð—™", "ð—š", "ð—›", "ð—œ", "ð—", "ð—ž", "ð—Ÿ", "ð— ", "ð—¡", "ð—¢", "ð—£", "ð—¤", "ð—¥", "ð—¦", "ð—§", "ð—¨", "ð—©", "ð—ª", "ð—«", "ð—¬", "ð—­",
+ "ðŸ¬", "ðŸ­", "ðŸ®", "ðŸ¯", "ðŸ°", "ðŸ±", "ðŸ²", "ðŸ³", "ðŸ´", "ðŸµ",
+ }, },
+ { "ss it", {
+ "ð˜¢", "ð˜£", "ð˜¤", "ð˜¥", "ð˜¦", "ð˜§", "ð˜¨", "ð˜©", "ð˜ª", "ð˜«", "ð˜¬", "ð˜­", "ð˜®", "ð˜¯", "ð˜°", "ð˜±", "ð˜²", "ð˜³", "ð˜´", "ð˜µ", "ð˜¶", "ð˜·", "ð˜¸", "ð˜¹", "ð˜º", "ð˜»",
+ "ð˜ˆ", "ð˜‰", "ð˜Š", "ð˜‹", "ð˜Œ", "ð˜", "ð˜Ž", "ð˜", "ð˜", "ð˜‘", "ð˜’", "ð˜“", "ð˜”", "ð˜•", "ð˜–", "ð˜—", "ð˜˜", "ð˜™", "ð˜š", "ð˜›", "ð˜œ", "ð˜", "ð˜ž", "ð˜Ÿ", "ð˜ ", "ð˜¡",
+ }, },
+ { "ss bi", {
+ "ð™–", "ð™—", "ð™˜", "ð™™", "ð™š", "ð™›", "ð™œ", "ð™", "ð™ž", "ð™Ÿ", "ð™ ", "ð™¡", "ð™¢", "ð™£", "ð™¤", "ð™¥", "ð™¦", "ð™§", "ð™¨", "ð™©", "ð™ª", "ð™«", "ð™¬", "ð™­", "ð™®", "ð™¯",
+ "ð˜¼", "ð˜½", "ð˜¾", "ð˜¿", "ð™€", "ð™", "ð™‚", "ð™ƒ", "ð™„", "ð™…", "ð™†", "ð™‡", "ð™ˆ", "ð™‰", "ð™Š", "ð™‹", "ð™Œ", "ð™", "ð™Ž", "ð™", "ð™", "ð™‘", "ð™’", "ð™“", "ð™”", "ð™•",
+ }, },
+ { "tt", {
+ "ðšŠ", "ðš‹", "ðšŒ", "ðš", "ðšŽ", "ðš", "ðš", "ðš‘", "ðš’", "ðš“", "ðš”", "ðš•", "ðš–", "ðš—", "ðš˜", "ðš™", "ðšš", "ðš›", "ðšœ", "ðš", "ðšž", "ðšŸ", "ðš ", "ðš¡", "ðš¢", "ðš£",
+ "ð™°", "ð™±", "ð™²", "ð™³", "ð™´", "ð™µ", "ð™¶", "ð™·", "ð™¸", "ð™¹", "ð™º", "ð™»", "ð™¼", "ð™½", "ð™¾", "ð™¿", "ðš€", "ðš", "ðš‚", "ðšƒ", "ðš„", "ðš…", "ðš†", "ðš‡", "ðšˆ", "ðš‰",
+ "ðŸ¶", "ðŸ·", "ðŸ¸", "ðŸ¹", "ðŸº", "ðŸ»", "ðŸ¼", "ðŸ½", "ðŸ¾", "ðŸ¿"
+ }, },
+ { "gr tf", {
+ "α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "Ï€", "Ï", "Ï‚", "σ", "Ï„", "Ï…", "φ", "χ", "ψ", "ω",
+ "Α", "Î’", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Îœ", "Î", "Ξ", "Ο", "Π", "Ρ", "΢", "Σ", "Τ", "Î¥", "Φ", "Χ", "Ψ", "Ω",
+ }, },
+ { "gr bf", {
+ "ð›‚", "ð›ƒ", "ð›„", "ð›…", "ð›†", "ð›‡", "ð›ˆ", "ð›‰", "ð›Š", "ð›‹", "ð›Œ", "ð›", "ð›Ž", "ð›", "ð›", "ð›‘", "ð›’", "ð›“", "ð›”", "ð›•", "ð›–", "ð›—", "ð›˜", "ð›™", "ð›š",
+ "ðš¨", "ðš©", "ðšª", "ðš«", "ðš¬", "ðš­", "ðš®", "ðš¯", "ðš°", "ðš±", "ðš²", "ðš³", "ðš´", "ðšµ", "ðš¶", "ðš·", "ðš¸", "ðš¹", "ðšº", "ðš»", "ðš¼", "ðš½", "ðš¾", "ðš¿", "ð›€",
+ }, },
+ { "gr it", {
+ "ð›¼", "ð›½", "ð›¾", "ð›¿", "ðœ€", "ðœ", "ðœ‚", "ðœƒ", "ðœ„", "ðœ…", "ðœ†", "ðœ‡", "ðœˆ", "ðœ‰", "ðœŠ", "ðœ‹", "ðœŒ", "ðœ", "ðœŽ", "ðœ", "ðœ", "ðœ‘", "ðœ’", "ðœ“", "ðœ”",
+ "ð›¢", "ð›£", "ð›¤", "ð›¥", "ð›¦", "ð›§", "ð›¨", "ð›©", "ð›ª", "ð›«", "ð›¬", "ð›­", "ð›®", "ð›¯", "ð›°", "ð›±", "ð›²", "ð›³", "ð›´", "ð›µ", "ð›¶", "ð›·", "ð›¸", "ð›¹", "ð›º",
+ }, },
+ { "gr bi", {
+ "ðœ¶", "ðœ·", "ðœ¸", "ðœ¹", "ðœº", "ðœ»", "ðœ¼", "ðœ½", "ðœ¾", "ðœ¿", "ð€", "ð", "ð‚", "ðƒ", "ð„", "ð…", "ð†", "ð‡", "ðˆ", "ð‰", "ðŠ", "ð‹", "ðŒ", "ð", "ðŽ",
+ "ðœœ", "ðœ", "ðœž", "ðœŸ", "ðœ ", "ðœ¡", "ðœ¢", "ðœ£", "ðœ¤", "ðœ¥", "ðœ¦", "ðœ§", "ðœ¨", "ðœ©", "ðœª", "ðœ«", "ðœ¬", "ðœ­", "ðœ®", "ðœ¯", "ðœ°", "ðœ±", "ðœ²", "ðœ³", "ðœ´",
+ }, },
+ { "gr ss bf", {
+ "ð°", "ð±", "ð²", "ð³", "ð´", "ðµ", "ð¶", "ð·", "ð¸", "ð¹", "ðº", "ð»", "ð¼", "ð½", "ð¾", "ð¿", "ðž€", "ðž", "ðž‚", "ðžƒ", "ðž„", "ðž…", "ðž†", "ðž‡", "ðžˆ",
+ "ð–", "ð—", "ð˜", "ð™", "ðš", "ð›", "ðœ", "ð", "ðž", "ðŸ", "ð ", "ð¡", "ð¢", "ð£", "ð¤", "ð¥", "ð¦", "ð§", "ð¨", "ð©", "ðª", "ð«", "ð¬", "ð­", "ð®",
+ }, },
+ { "gr ss bi", {
+ "ðžª", "ðž«", "ðž¬", "ðž­", "ðž®", "ðž¯", "ðž°", "ðž±", "ðž²", "ðž³", "ðž´", "ðžµ", "ðž¶", "ðž·", "ðž¸", "ðž¹", "ðžº", "ðž»", "ðž¼", "ðž½", "ðž¾", "ðž¿", "ðŸ€", "ðŸ", "ðŸ‚",
+ "ðž", "ðž‘", "ðž’", "ðž“", "ðž”", "ðž•", "ðž–", "ðž—", "ðž˜", "ðž™", "ðžš", "ðž›", "ðžœ", "ðž", "ðžž", "ðžŸ", "ðž ", "ðž¡", "ðž¢", "ðž£", "ðž¤", "ðž¥", "ðž¦", "ðž§", "ðž¨",
+ }, },
+ { "op", {
+ }, },
+ { "sy a", {
+ }, },
+ { "sy b", {
+ }, },
+ { "sy c", {
+ }, },
+}
+
+local mathlists = { }
+local mathselector = { }
+
+for i=1,#mathsets do
+ local mathset = mathsets[i]
+ mathselector[#mathselector+1] = mathset[1]
+ mathlists[mathset[1]] = mathset[2]
+end
+
+local enabled = 0
+local usedlists = {
+ { name = "text", current = "en", lists = textlists, selector = textselector },
+ { name = "math", current = "tf", lists = mathlists, selector = mathselector },
+}
+
+-- I haven't found out yet how to create a strip as in scite.
+
+-- local function make_strip()
+-- local used = usedlists[enabled]
+-- local lists = used.lists
+-- local alphabet = lists[used.current]
+-- local selector = "(hide)(" .. concat(used.selector,")(") .. ")"
+-- local alphabet = "(" .. used.current .. ":)(" .. concat(alphabet,")(") .. ")"
+-- -- scite.StripShow(selector .. "\n" .. alphabet)
+-- end
+--
+-- local function hide_strip()
+-- -- scite.StripShow("")
+-- end
+--
+-- local function process_strip(control)
+-- -- local value = scite.StripValue(control)
+-- -- if value == "hide" then
+-- -- hide_strip()
+-- -- return
+-- -- elseif find(value,".+:") then
+-- -- return
+-- -- end
+-- -- local used = usedlists[enabled]
+-- -- if used.lists[value] then
+-- -- used.current = value
+-- -- make_strip()
+-- -- else
+-- -- editor:insert(editor.CurrentPos,value)
+-- -- end
+-- end
+--
+-- local function ignore_strip()
+-- end
+
+function runner.unicodes(name)
+-- enabled = enabled + 1
+-- if usedlists[enabled] then
+-- make_strip()
+-- else
+-- enabled = 0
+-- hide_strip()
+-- end
+end
+
return runner
-- The ui.print function is a bit heavy as each flush will parse the whole list of buffers.
diff --git a/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-settings.lua b/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-settings.lua
index 4a5be38da6d..6a9f49d51cd 100644
--- a/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-settings.lua
+++ b/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-settings.lua
@@ -61,6 +61,7 @@ if context then
buffer.tab_indents = true
buffer.back_space_un_indents = true
buffer.indentation_guides = not CURSES and buffer.IV_LOOKBOTH or buffer.IV_NONE
+ buffer.wrap_length = 80
buffer.sel_eol_filled = true
-- buffer.sel_alpha =
diff --git a/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-types.lua b/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-types.lua
index 552aa4e5f2c..97fb2e17c1c 100644
--- a/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-types.lua
+++ b/Master/texmf-dist/context/data/textadept/context/modules/textadept-context-types.lua
@@ -21,7 +21,7 @@ local quitter = function(output)
end
local listing = {
- command = [[mtxrun --autogenerate --script context --extra=listing --scite --compact "%basename%"]], -- --autopdf
+ command = [[mtxrun --autogenerate --script context --autopdf --extra=listing --scite --compact "%basename%"]],
quitter = quitter,
}
@@ -30,14 +30,16 @@ install {
suffixes = {
"tex",
"mkii",
- "mkiv", "mkvi", "mkix", "mkxi"
+ "mkiv", "mkvi", "mkix", "mkxi",
+ "mkic", "mkci",
+
},
check = {
command = [[mtxrun --autogenerate --script check "%basename%"]],
quitter = quitter,
},
process = {
- command = [[mtxrun --autogenerate --script context "%basename%"]], -- --autopdf,
+ command = [[mtxrun --autogenerate --script context --autopdf "%basename%"]],
quitter = quitter,
},
listing = listing,
@@ -67,7 +69,7 @@ install {
},
check = [[tidy -quiet -utf8 -xml -errors "%basename%"]],
process = {
- command = [[mtxrun --autogenerate --script context "%basename%"]], -- --autopdf]],
+ command = [[mtxrun --autogenerate --script context --autopdf "%basename%"]], -- --autopdf]],
quitter = quitter,
},
listing = listing,
diff --git a/Master/texmf-dist/context/data/textadept/context/textadept-context.cmd b/Master/texmf-dist/context/data/textadept/context/textadept-context.cmd
index 716b4896c14..633020a888a 100644
--- a/Master/texmf-dist/context/data/textadept/context/textadept-context.cmd
+++ b/Master/texmf-dist/context/data/textadept/context/textadept-context.cmd
@@ -1,2 +1,56 @@
+@echo off
+
+rem This script starts textadept in an adapted mode, stripped from all the stuff we don't need,
+rem geared at the file formats that context deals with. The reason for this is that first of
+rem all we come from scite, but also because the average user doesn't need that much and can
+rem get confused by all kind of options that are irrelevant for editing text files.
+
+rem This startup script assumes that the files can be found relative to this script. It's kind
+rem of tricky because textadept, while being quite configurable, is not really made for such a
+rem real bare startup situation but after some trial and error, so far it works out ok. There
+rem are still some issues due to assumptions in the original code. In the meantime processing
+rem a file from within the editing sessions works ok which is a huge improvement over earlier
+rem versions of textadept (it was actually a show stopper) so now textadept can be used as a
+rem drop in for scite. We're getting there!
+
+rem Although I like the idea of textadept, it is no longer a simple Lua binding to scintilla
+rem and the claim that it is small is no longer true. The number of Lua lines doesn't really
+rem say much if there are many third party dll dependencies (at least I see many files in the
+rem zip and most of them probably relate to parts of the graphical interface and therefore most
+rem is probably not used at all. The more dependencies there are, the less interesting it is to
+rem officially support it as one of the reference editors for context, given that tex and friends
+rem aim at long term stability. It's huge and unless I'm mistaken there is no minimal lightweight
+rem variant for building a stripped down variant (in editing with mono spaced fonts we don't need
+rem all that stuff). A small static stripped binary would be really nice to have (and I'd
+rem probably default to using textadept then). I might at some point decide to strip more and just
+rem provide what we only need (which is less than is there now). We'll see how it evolves.
+
+rem In the meantime support for scintillua has been dropped which makes scite vulnerable as there
+rem is no default scite (yet) with lpeg built in. Anyway, it means that we will not provide an
+rem installer for scite or textadept which does the reference highlighting we've been using for
+rem decades. It is up to the user: use lightweight scite or a more dependent but also more
+rem configurable texadept. It would be really nice to have multiple options for editing (read: if
+rem scite would have scintillua on board.) The same is true for notepad++. Each of them has its
+rem advantage (and each is used by context users).
+
+rem Unless the textadept api changes fundamentally (as happened a couple of times before) this
+rem should work:
+
start textadept -u %~dp0 %*
+rem I still need to port some of the extra functionality that we have in scite to textadept, which
+rem will happen in due time. We use our own lexers because they are more efficient and have some
+rem extra options (they were also much faster at that time and could handle very large files; they
+rem also build on already existing code in context verbatim mode). By the way, editing char-def.lua
+rem in textadept is actually now faster than in scite (using the same lpeg lexers), which is nice.
+rem There is no language strip functionality yet as there is no strip (bottom area) as in scite.
+
+rem The macros.lua file has some hard coded assumptions wrt menu items and the event crashes with a
+rem error message that we can't get rid of. I need to figure out a way to close that buffer but
+rem somehow the first buffer is closed anyway which is kind of weird. One way out is to just
+rem comment:
+rem
+rem -- textadept.menu.menubar[_L['_Tools']][_L['Select Co_mmand']][2],
+rem
+rem Maybe I should just copy all the files and remove code we don't need but ... let's delay that
+rem as it might get fixed. I'm in no hurry. \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/keybindings/context.json b/Master/texmf-dist/context/data/vscode/extensions/context/keybindings/context.json
new file mode 100644
index 00000000000..80bbc099b4b
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/keybindings/context.json
@@ -0,0 +1,20 @@
+[
+ {
+ "args" : "process tex file",
+ "command" : "workbench.action.tasks.runTask",
+ "key" : "ctrl-F12",
+ "when" : "editorTextFocus && editorLangId == context.tex"
+ },
+ {
+ "args" : "check tex file",
+ "command" : "workbench.action.tasks.runTask",
+ "key" : "F12",
+ "when" : "editorTextFocus && editorLangId == context.tex"
+ },
+ {
+ "args" : "process lua file",
+ "command" : "workbench.action.tasks.runTask",
+ "key" : "ctrl-F12",
+ "when" : "editorTextFocus && editorLangId == context.cld"
+ }
+] \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/package.json b/Master/texmf-dist/context/data/vscode/extensions/context/package.json
new file mode 100644
index 00000000000..73558aefa05
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/package.json
@@ -0,0 +1,170 @@
+{
+ "categories" : [ "Lexers", "Syntaxes" ],
+ "contributes" : {
+ "grammars" : [
+ {
+ "language" : "context.tex",
+ "path" : "./syntaxes/context-syntax-tex.json",
+ "scopeName" : "source.context.tex"
+ },
+ {
+ "language" : "context.mps",
+ "path" : "./syntaxes/context-syntax-mps.json",
+ "scopeName" : "source.context.mps"
+ },
+ {
+ "language" : "context.lua",
+ "path" : "./syntaxes/context-syntax-lua.json",
+ "scopeName" : "source.context.lua"
+ },
+ {
+ "language" : "context.cld",
+ "path" : "./syntaxes/context-syntax-cld.json",
+ "scopeName" : "source.context.cld"
+ },
+ {
+ "language" : "context.xml",
+ "path" : "./syntaxes/context-syntax-xml.json",
+ "scopeName" : "source.context.xml"
+ },
+ {
+ "language" : "context.bibtex",
+ "path" : "./syntaxes/context-syntax-bibtex.json",
+ "scopeName" : "source.context.bibtex"
+ },
+ {
+ "language" : "context.sql",
+ "path" : "./syntaxes/context-syntax-sql.json",
+ "scopeName" : "source.context.sql"
+ },
+ {
+ "language" : "context.bnf",
+ "path" : "./syntaxes/context-syntax-bnf.json",
+ "scopeName" : "source.context.bnf"
+ },
+ {
+ "language" : "context.cpp",
+ "path" : "./syntaxes/context-syntax-cpp.json",
+ "scopeName" : "source.context.cpp"
+ },
+ {
+ "language" : "context.pdf",
+ "path" : "./syntaxes/context-syntax-pdf.json",
+ "scopeName" : "source.context.pdf"
+ },
+ {
+ "language" : "context.json",
+ "path" : "./syntaxes/context-syntax-json.json",
+ "scopeName" : "source.context.json"
+ }
+ ],
+ "keybindings" : [
+ {
+ "args" : "process tex file",
+ "command" : "workbench.action.tasks.runTask",
+ "key" : "ctrl-F12",
+ "when" : "editorTextFocus && editorLangId == context.tex"
+ },
+ {
+ "args" : "check tex file",
+ "command" : "workbench.action.tasks.runTask",
+ "key" : "F12",
+ "when" : "editorTextFocus && editorLangId == context.tex"
+ },
+ {
+ "args" : "process lua file",
+ "command" : "workbench.action.tasks.runTask",
+ "key" : "ctrl-F12",
+ "when" : "editorTextFocus && editorLangId == context.cld"
+ }
+ ],
+ "languages" : [
+ {
+ "aliases" : [ "ConTeXt TEX" ],
+ "configuration" : "./settings/context-settings-tex.json",
+ "extensions" : [ ".mkil", ".mkiv", ".mkix", ".mklx", ".mkvi", ".mkxi", ".mkxl", ".tex" ],
+ "id" : "context.tex"
+ },
+ {
+ "aliases" : [ "ConTeXt MetaFun" ],
+ "configuration" : "./settings/context-settings-mps.json",
+ "extensions" : [ ".mp", ".mpii", ".mpiv", ".mpxl" ],
+ "id" : "context.mps"
+ },
+ {
+ "aliases" : [ "ConTeXt Lua" ],
+ "configuration" : "./settings/context-settings-lua.json",
+ "id" : "context.lua"
+ },
+ {
+ "aliases" : [ "ConTeXt CLD" ],
+ "configuration" : "./settings/context-settings-cld.json",
+ "extensions" : [ ".cld", ".lfg", ".lua", ".luc", ".lui", ".luj", ".lum", ".luv", ".tma", ".tuc" ],
+ "id" : "context.cld"
+ },
+ {
+ "aliases" : [ "ConTeXt XML" ],
+ "configuration" : "./settings/context-settings-xml.json",
+ "extensions" : [ ".ctx", ".dtd", ".exa", ".export", ".fo", ".htm", ".html", ".lmx", ".rlb", ".rlg", ".rlv", ".rng", ".svg", ".xfdf", ".xhtml", ".xml", ".xsd", ".xsl", ".xslt", ".xul" ],
+ "id" : "context.xml"
+ },
+ {
+ "aliases" : [ "ConTeXt bibTeX" ],
+ "configuration" : "./settings/context-settings-bibtex.json",
+ "extensions" : [ ".bib", ".btx" ],
+ "id" : "context.bibtex"
+ },
+ {
+ "aliases" : [ "ConTeXt SQL" ],
+ "configuration" : "./settings/context-settings-sql.json",
+ "extensions" : [ ".sql" ],
+ "id" : "context.sql"
+ },
+ {
+ "aliases" : [ "ConTeXt BNF" ],
+ "configuration" : "./settings/context-settings-bnf.json",
+ "extensions" : [ ".bnf" ],
+ "id" : "context.bnf"
+ },
+ {
+ "aliases" : [ "ConTeXt C" ],
+ "configuration" : "./settings/context-settings-cpp.json",
+ "extensions" : [ ".c", ".cpp", ".h", ".hpp" ],
+ "id" : "context.cpp"
+ },
+ {
+ "aliases" : [ "ConTeXt PDF" ],
+ "configuration" : "./settings/context-settings-pdf.json",
+ "extensions" : [ ".pdf" ],
+ "id" : "context.pdf"
+ },
+ {
+ "aliases" : [ "ConTeXt JSON" ],
+ "configuration" : "./settings/context-settings-json.json",
+ "extensions" : [ ".json" ],
+ "id" : "context.json"
+ }
+ ],
+ "tasks" : [
+ {
+ "label" : "ConTeXt Tasks",
+ "path" : "./tasks/context.json"
+ }
+ ],
+ "themes" : [
+ {
+ "label" : "ConTeXt",
+ "path" : "./themes/context.json",
+ "uiTheme" : "vs"
+ }
+ ]
+ },
+ "description" : "ConTeXt Syntax Highlighting",
+ "displayName" : "ConTeXt",
+ "engines" : {
+ "vscode" : "*"
+ },
+ "name" : "context",
+ "publisher" : "ConTeXt Development Team",
+ "version" : "1.0.0"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/package.nls.json b/Master/texmf-dist/context/data/vscode/extensions/context/package.nls.json
new file mode 100644
index 00000000000..40e00f759e9
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/package.nls.json
@@ -0,0 +1,4 @@
+{
+ "description" : "Provides syntax highlighting and bracket matching in ConTeXt files.",
+ "displayName" : "ConTeXt"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-bibtex.json b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-bibtex.json
new file mode 100644
index 00000000000..e1927f36b5a
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-bibtex.json
@@ -0,0 +1,14 @@
+{
+ "autoClosingPairs" : [
+ [ "{", "}" ]
+ ],
+ "brackets" : [
+ [ "{", "}" ]
+ ],
+ "comments" : {
+ "lineComment" : "%"
+ },
+ "surroundingPairs" : [
+ [ "{", "}" ]
+ ]
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-bnf.json b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-bnf.json
new file mode 100644
index 00000000000..353182133fa
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-bnf.json
@@ -0,0 +1,11 @@
+{
+ "autoClosingPairs" : [
+ [ "<", ">" ]
+ ],
+ "brackets" : [
+ [ "<", ">" ]
+ ],,
+ "surroundingPairs" : [
+ [ "<", ">" ]
+ ]
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-cld.json b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-cld.json
new file mode 100644
index 00000000000..1f10daa1899
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-cld.json
@@ -0,0 +1,21 @@
+{
+ "autoClosingPairs" : [
+ [ "(", ")" ],
+ [ "{", "}" ],
+ [ "[", "]" ]
+ ],
+ "brackets" : [
+ [ "(", ")" ],
+ [ "{", "}" ],
+ [ "[", "]" ]
+ ],
+ "comments" : {
+ "blockComment" : [ "--[[", "]]" ],
+ "lineComment" : "--"
+ },
+ "surroundingPairs" : [
+ [ "(", ")" ],
+ [ "{", "}" ],
+ [ "[", "]" ]
+ ]
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-cpp.json b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-cpp.json
new file mode 100644
index 00000000000..89af81ea5e5
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-cpp.json
@@ -0,0 +1,17 @@
+{
+ "autoClosingPairs" : [
+ [ "{", "}" ],
+ [ "[", "]" ],
+ [ "(", ")" ]
+ ],
+ "brackets" : [
+ [ "{", "}" ],
+ [ "[", "]" ],
+ [ "(", ")" ]
+ ],,
+ "surroundingPairs" : [
+ [ "{", "}" ],
+ [ "[", "]" ],
+ [ "(", ")" ]
+ ]
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-json.json b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-json.json
new file mode 100644
index 00000000000..73f189132c1
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-json.json
@@ -0,0 +1,14 @@
+{
+ "autoClosingPairs" : [
+ [ "{", "}" ],
+ [ "[", "]" ]
+ ],
+ "brackets" : [
+ [ "{", "}" ],
+ [ "[", "]" ]
+ ],,
+ "surroundingPairs" : [
+ [ "{", "}" ],
+ [ "[", "]" ]
+ ]
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-lua.json b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-lua.json
new file mode 100644
index 00000000000..1f10daa1899
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-lua.json
@@ -0,0 +1,21 @@
+{
+ "autoClosingPairs" : [
+ [ "(", ")" ],
+ [ "{", "}" ],
+ [ "[", "]" ]
+ ],
+ "brackets" : [
+ [ "(", ")" ],
+ [ "{", "}" ],
+ [ "[", "]" ]
+ ],
+ "comments" : {
+ "blockComment" : [ "--[[", "]]" ],
+ "lineComment" : "--"
+ },
+ "surroundingPairs" : [
+ [ "(", ")" ],
+ [ "{", "}" ],
+ [ "[", "]" ]
+ ]
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-mps.json b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-mps.json
new file mode 100644
index 00000000000..693fb54b906
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-mps.json
@@ -0,0 +1,20 @@
+{
+ "autoClosingPairs" : [
+ [ "{", "}" ],
+ [ "[", "]" ],
+ [ "(", ")" ]
+ ],
+ "brackets" : [
+ [ "{", "}" ],
+ [ "[", "]" ],
+ [ "(", ")" ]
+ ],
+ "comments" : {
+ "lineComment" : "%"
+ },
+ "surroundingPairs" : [
+ [ "{", "}" ],
+ [ "[", "]" ],
+ [ "(", ")" ]
+ ]
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-pdf.json b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-pdf.json
new file mode 100644
index 00000000000..05aea0976f8
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-pdf.json
@@ -0,0 +1,17 @@
+{
+ "autoClosingPairs" : [
+ [ "<", ">" ],
+ [ "[", "]" ],
+ [ "(", ")" ]
+ ],
+ "brackets" : [
+ [ "<", ">" ],
+ [ "[", "]" ],
+ [ "(", ")" ]
+ ],,
+ "surroundingPairs" : [
+ [ "<", ">" ],
+ [ "[", "]" ],
+ [ "(", ")" ]
+ ]
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-sql.json b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-sql.json
new file mode 100644
index 00000000000..7a73a41bfdf
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-sql.json
@@ -0,0 +1,2 @@
+{
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-tex.json b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-tex.json
new file mode 100644
index 00000000000..693fb54b906
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-tex.json
@@ -0,0 +1,20 @@
+{
+ "autoClosingPairs" : [
+ [ "{", "}" ],
+ [ "[", "]" ],
+ [ "(", ")" ]
+ ],
+ "brackets" : [
+ [ "{", "}" ],
+ [ "[", "]" ],
+ [ "(", ")" ]
+ ],
+ "comments" : {
+ "lineComment" : "%"
+ },
+ "surroundingPairs" : [
+ [ "{", "}" ],
+ [ "[", "]" ],
+ [ "(", ")" ]
+ ]
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-xml.json b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-xml.json
new file mode 100644
index 00000000000..565dda56780
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/settings/context-settings-xml.json
@@ -0,0 +1,5 @@
+{
+ "comments" : {
+ "blockComment" : [ "<!--", "-->" ]
+ }
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-bibtex.json b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-bibtex.json
new file mode 100644
index 00000000000..e670d9a9772
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-bibtex.json
@@ -0,0 +1,267 @@
+{
+ "name" : "context.bibtex",
+ "patterns" : [
+ {
+ "include" : "#forget"
+ },
+ {
+ "include" : "#comment"
+ },
+ {
+ "include" : "#shortcut"
+ },
+ {
+ "include" : "#definition"
+ }
+ ],
+ "repository" : {
+ "comment" : {
+ "begin" : "\u005Cs*(@(?:comment|Comment|COMMENT))\u005Cs*\u005Cs*({)\u005Cs*",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.keyword.comment.name.bibtex"
+ },
+ "2" : {
+ "name" : "context.grouping.comment.open.bibtex"
+ }
+ },
+ "end" : "\u005Cs*(})\u005Cs*",
+ "endCaptures" : {
+ "1" : {
+ "name" : "context.grouping.comment.close.bibtex"
+ }
+ },
+ "name" : "context.comment.comment.comment.content.bibtex"
+ },
+ "concatinator" : {
+ "match" : "\u005Cs*(#)\u005Cs*",
+ "name" : "context.operator.definition.concatinator.bibtex"
+ },
+ "definition" : {
+ "begin" : "\u005Cs*([a-zA-Z0-9\u005C_@:\u005C-]+)\u005Cs*\u005Cs*({)\u005Cs*\u005Cs*([a-zA-Z0-9\u005C_@:\u005C-]+)\u005Cs*\u005Cs*(,)\u005Cs*",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.keyword.definition.category.bibtex"
+ },
+ "2" : {
+ "name" : "context.grouping.definition.open.bibtex"
+ },
+ "3" : {
+ "name" : "context.operator.definition.label.separator.bibtex"
+ }
+ },
+ "end" : "\u005Cs*(})\u005Cs*",
+ "endCaptures" : {
+ "1" : {
+ "name" : "context.grouping.definition.close.bibtex"
+ }
+ },
+ "name" : "context.warning.definition.error.bibtex",
+ "patterns" : [
+ {
+ "include" : "#string_double"
+ },
+ {
+ "include" : "#string_single"
+ },
+ {
+ "include" : "#string_grouped"
+ },
+ {
+ "include" : "#string_value"
+ },
+ {
+ "include" : "#string_concat"
+ },
+ {
+ "include" : "#separator"
+ }
+ ]
+ },
+ "forget" : {
+ "match" : "%.*$\u005Cn?",
+ "name" : "context.comment.comment.comment.inline.bibtex"
+ },
+ "separator" : {
+ "match" : "\u005Cs*(,)\u005Cs*",
+ "name" : "context.operator.definition.separator.bibtex"
+ },
+ "shortcut" : {
+ "begin" : "\u005Cs*(@(?:string|String|STRING))\u005Cs*\u005Cs*({)\u005Cs*",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.keyword.shortcut.name.bibtex"
+ },
+ "2" : {
+ "name" : "context.grouping.shortcut.open.bibtex"
+ }
+ },
+ "end" : "\u005Cs*(})\u005Cs*",
+ "endCaptures" : {
+ "1" : {
+ "name" : "context.grouping.shortcut.close.bibtex"
+ }
+ },
+ "name" : "context.warning.shortcut.error.bibtex",
+ "patterns" : [
+ {
+ "include" : "#string_double"
+ },
+ {
+ "include" : "#string_single"
+ },
+ {
+ "include" : "#string_grouped"
+ },
+ {
+ "include" : "#string_value"
+ },
+ {
+ "include" : "#string_concat"
+ }
+ ]
+ },
+ "string_concat" : {
+ "patterns" : [
+ {
+ "captures" : {
+ "1" : {
+ "name" : "context.operator.concat.doublequoted.concatinator.bibtex"
+ },
+ "2" : {
+ "name" : "context.special.concat.doublequoted.open.bibtex"
+ },
+ "3" : {
+ "name" : "context.text.concat.doublequoted.text.bibtex"
+ },
+ "4" : {
+ "name" : "context.special.concat.doublequoted.close.bibtex"
+ }
+ },
+ "match" : "\u005Cs*(#)\u005Cs*\u005Cs*(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)\u005Cs*"
+ },
+ {
+ "captures" : {
+ "1" : {
+ "name" : "context.operator.concat.singlequoted.concatinator.bibtex"
+ },
+ "2" : {
+ "name" : "context.special.concat.singlequoted.open.bibtex"
+ },
+ "3" : {
+ "name" : "context.text.concat.singlequoted.text.bibtex"
+ },
+ "4" : {
+ "name" : "context.special.concat.singlequoted.close.bibtex"
+ }
+ },
+ "match" : "\u005Cs*(#)\u005Cs*\u005Cs*(')((?:\u005C\u005C'|[^'])*)(')\u005Cs*"
+ },
+ {
+ "captures" : {
+ "1" : {
+ "name" : "context.operator.concat.grouped.concatinator.bibtex"
+ },
+ "2" : {
+ "name" : "context.operator.concat.grouped.open.bibtex"
+ },
+ "3" : {
+ "name" : "context.text.concat.grouped.text.bibtex"
+ },
+ "4" : {
+ "name" : "context.operator.concat.grouped.close.bibtex"
+ }
+ },
+ "match" : "\u005Cs*(#)\u005Cs*\u005Cs*({)((?:\u005C\u005C{|\u005C\u005C}|[^\u005C{\u005C}])*)(})\u005Cs*"
+ },
+ {
+ "captured" : {
+ "1" : {
+ "name" : "context.operator.concat.value.concatinator.bibtex"
+ },
+ "2" : {
+ "name" : "context.text.concat.value.text.bibtex"
+ }
+ },
+ "match" : "\u005Cs*(#)\u005Cs*\u005Cs*([a-zA-Z0-9\u005C_@:\u005C-]+)\u005Cs*"
+ }
+ ]
+ },
+ "string_double" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.command.doublequoted.key.bibtex"
+ },
+ "2" : {
+ "name" : "context.operator.doublequoted.equal.bibtex"
+ },
+ "3" : {
+ "name" : "context.special.doublequoted.open.bibtex"
+ },
+ "4" : {
+ "name" : "context.text.doublequoted.text.bibtex"
+ },
+ "5" : {
+ "name" : "context.special.doublequoted.close.bibtex"
+ }
+ },
+ "match" : "\u005Cs*([a-zA-Z0-9\u005C_@:\u005C-]+)\u005Cs*\u005Cs*(=)\u005Cs*\u005Cs*(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)\u005Cs*"
+ },
+ "string_grouped" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.command.grouped.key.bibtex"
+ },
+ "2" : {
+ "name" : "context.operator.grouped.equal.bibtex"
+ },
+ "3" : {
+ "name" : "context.operator.grouped.open.bibtex"
+ },
+ "4" : {
+ "name" : "context.text.grouped.text.bibtex"
+ },
+ "5" : {
+ "name" : "context.operator.grouped.close.bibtex"
+ }
+ },
+ "match" : "\u005Cs*([a-zA-Z0-9\u005C_@:\u005C-]+)\u005Cs*\u005Cs*(=)\u005Cs*\u005Cs*({)((?:\u005C\u005C{|\u005C\u005C}|[^\u005C{\u005C}])*)(})\u005Cs*"
+ },
+ "string_single" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.command.singlequoted.key.bibtex"
+ },
+ "2" : {
+ "name" : "context.operator.singlequoted.equal.bibtex"
+ },
+ "3" : {
+ "name" : "context.special.singlequoted.open.bibtex"
+ },
+ "4" : {
+ "name" : "context.text.singlequoted.text.bibtex"
+ },
+ "5" : {
+ "name" : "context.special.singlequoted.close.bibtex"
+ }
+ },
+ "match" : "\u005Cs*([a-zA-Z0-9\u005C_@:\u005C-]+)\u005Cs*\u005Cs*(=)\u005Cs*\u005Cs*(')((?:\u005C\u005C'|[^'])*)(')\u005Cs*"
+ },
+ "string_value" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.command.value.key.bibtex"
+ },
+ "2" : {
+ "name" : "context.operator.value.equal.bibtex"
+ },
+ "3" : {
+ "name" : "context.text.value.text.bibtex"
+ }
+ },
+ "match" : "\u005Cs*([a-zA-Z0-9\u005C_@:\u005C-]+)\u005Cs*\u005Cs*(=)\u005Cs*\u005Cs*([a-zA-Z0-9\u005C_@:\u005C-]+)\u005Cs*"
+ }
+ },
+ "scopeName" : "source.context.bibtex",
+ "version" : "1.0.0"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-bnf.json b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-bnf.json
new file mode 100644
index 00000000000..d5251624c82
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-bnf.json
@@ -0,0 +1,74 @@
+{
+ "name" : "context.bnf",
+ "patterns" : [
+ {
+ "include" : "#term"
+ },
+ {
+ "include" : "#text_single"
+ },
+ {
+ "include" : "#text_reverse"
+ },
+ {
+ "include" : "#becomes"
+ },
+ {
+ "include" : "#extra"
+ }
+ ],
+ "repository" : {
+ "becomes" : {
+ "match" : "::=",
+ "name" : "context.operator.symbol.becomes.bnf"
+ },
+ "extra" : {
+ "match" : "|",
+ "name" : "context.extra.symbol.extra.bnf"
+ },
+ "term" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.command.term.open.bnf"
+ },
+ "2" : {
+ "name" : "context.text.term.text.bnf"
+ },
+ "3" : {
+ "name" : "context.command.term.close.bnf"
+ }
+ },
+ "match" : "(<)(([a-zA-Z][a-zA-Z0-9\u005C-]*))(>)"
+ },
+ "text_double" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.special.doublequoted.open.bnf"
+ },
+ "2" : {
+ "name" : "context.text.doublequoted.text.bnf"
+ },
+ "3" : {
+ "name" : "context.special.doublequoted.close.bnf"
+ }
+ },
+ "match" : "(\u0022)([a-zA-Z0-9]|\u005C~|}|\u005C||{|`|_|\u005C^|\u005C]|\u005C\u005C|\u005C[|@|\u005C?|>|=|<|;|:|/|\u005C.|\u005C-|\u005C-|,|\u005C+|\u005C*|\u005C)|\u005C(|\u005C&|\u005C%|\u005C$|#|\u005C!| )(\u0022)"
+ },
+ "text_single" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.special.singlequoted.open.bnf"
+ },
+ "2" : {
+ "name" : "context.text.singlequoted.text.bnf"
+ },
+ "3" : {
+ "name" : "context.special.singlequoted.close.bnf"
+ }
+ },
+ "match" : "(')([a-zA-Z0-9]|\u005C~|}|\u005C||{|`|_|\u005C^|\u005C]|\u005C\u005C|\u005C[|@|\u005C?|>|=|<|;|:|/|\u005C.|\u005C-|\u005C-|,|\u005C+|\u005C*|\u005C)|\u005C(|\u005C&|\u005C%|\u005C$|#|\u005C!| )(')"
+ }
+ },
+ "scopeName" : "source.context.bnf",
+ "version" : "1.0.0"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-cld.json b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-cld.json
new file mode 100644
index 00000000000..84bd41236b7
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-cld.json
@@ -0,0 +1,209 @@
+{
+ "name" : "context.cld",
+ "patterns" : [
+ {
+ "include" : "#texstring"
+ },
+ {
+ "include" : "#texcommand"
+ },
+ {
+ "include" : "#keyword"
+ },
+ {
+ "include" : "#buildin"
+ },
+ {
+ "include" : "#constant"
+ },
+ {
+ "include" : "#csname"
+ },
+ {
+ "include" : "#goto"
+ },
+ {
+ "include" : "#number_hex"
+ },
+ {
+ "include" : "#number"
+ },
+ {
+ "include" : "#identifier_keyword"
+ },
+ {
+ "include" : "#identifier_valid"
+ },
+ {
+ "include" : "#longcomment"
+ },
+ {
+ "include" : "#string_long"
+ },
+ {
+ "include" : "#string_double"
+ },
+ {
+ "include" : "#string_single"
+ },
+ {
+ "include" : "#shortcomment"
+ },
+ {
+ "include" : "#label"
+ },
+ {
+ "include" : "#operator"
+ }
+ ],
+ "repository" : {
+ "builtin" : {
+ "match" : "(xpcall|utf8|unpack|type|tostring|tonumber|table|string|setmetatable|select|require|rawset|rawget|rawequal|print|pcall|pairs|package|os|next|module|math|lpeg|loadfile|load|ipairs|io|getmetatable|file|error|dofile|debug|coroutine|collectgarbage|bit32|assert)(?=[^a-zA-Z])",
+ "name" : "context.plain.reserved.builtin.lua"
+ },
+ "constant" : {
+ "match" : "(__unm|__tostring|__sub|__pow|__pairs|__newindex|__mul|__mode|__metatable|__lt|__len|__le|__ipairs|__index|__idiv|__gc|__eq|__div|__concat|__close|__call|__add|_VERSION|_M|_G|_ENV|\u005C.\u005C.\u005C.|NaN|<toclose>|<const>)(?=[^a-zA-Z])",
+ "name" : "context.data.reserved.constants.lua"
+ },
+ "csname" : {
+ "begin" : "(metapost|metafun|ctx[A-Za-z_]*|context|commands)(?=[^a-zA-Z])",
+ "end" : "(?!(\u005Cs*[\u005C.\u005C:]*\u005Cs*[_\u005Cw][_\u005Cw0-9]*))",
+ "name" : "context.user.csname.lua",
+ "patterns" : [
+ {
+ "match" : "[\u005C.\u005C:]",
+ "name" : "context.operator.csname.qualifier.lua"
+ }
+ ]
+ },
+ "goto" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.keyword.goto.keyword.lua"
+ },
+ "2" : {
+ "name" : "context.grouping.goto.target.lua"
+ }
+ },
+ "match" : "(goto)\u005Cs*([_\u005Cw][_\u005Cw0-9]*)"
+ },
+ "identifier_keyword" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.operator.identifier.keyword.lua"
+ },
+ "2" : {
+ "name" : "context.warning.identifier.keyword.lua"
+ }
+ },
+ "match" : "\u005Cs*([\u005C.\u005C:])\u005Cs*(while|until|true|then|return|repeat|or|not|nil|local|in|if|function|for|false|end|elseif|else|do|break|and)(?=[^a-zA-Z])"
+ },
+ "identifier_valid" : {
+ "match" : "[_\u005Cw][_\u005Cw0-9]*",
+ "name" : "context.default.identifier.valid.lua"
+ },
+ "keyword" : {
+ "match" : "(while|until|true|then|return|repeat|or|not|nil|local|in|if|function|for|false|end|elseif|else|do|break|and)(?=[^a-zA-Z])",
+ "name" : "context.keyword.reserved.keyword.lua"
+ },
+ "label" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.keyword.label.open.lua"
+ },
+ "2" : {
+ "name" : "context.grouping.label.target.lua"
+ },
+ "3" : {
+ "name" : "context.keyword.label.close.lua"
+ }
+ },
+ "match" : "(::)([_\u005Cw][_\u005Cw0-9]*)(::)"
+ },
+ "longcomment" : {
+ "begin" : "--\u005C[\u005C[",
+ "end" : "\u005C]\u005C]",
+ "name" : "context.comment.comment.long.lua"
+ },
+ "number" : {
+ "match" : "[\u005C-]?[0-9]+(\u005C.[0-9]+)?([eEpP]\u005C-?[0-9]+)?",
+ "name" : "context.number.decnumber.lua"
+ },
+ "number_hex" : {
+ "match" : "[\u005C-]?0[xX][A-Fa-f0-9]+(\u005C.[A-Fa-f0-9]+)?([eEpP]\u005C-?[A-Fa-f0-9]+)?",
+ "name" : "context.number.hexnumber.lua"
+ },
+ "operator" : {
+ "match" : "\u005C~|}|\u005C||{|\u005C^|\u005C]|\u005C[|>|=|<|;|:|/|\u005C.|\u005C-|,|\u005C+|\u005C*|\u005C)|\u005C(|\u005C'|\u005C%|#",
+ "name" : "context.special.operator.lua"
+ },
+ "shortcomment" : {
+ "match" : "--.*$\u005Cn?",
+ "name" : "context.comment.comment.short.lua"
+ },
+ "string_double" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.special.doublequoted.open.lua"
+ },
+ "2" : {
+ "name" : "context.string.doublequoted.text.lua"
+ },
+ "3" : {
+ "name" : "context.special.doublequoted.close.lua"
+ }
+ },
+ "match" : "(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)"
+ },
+ "string_long" : {
+ "begin" : "\u005C[(=*)\u005C[",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.special.string.long.open.lua"
+ }
+ },
+ "end" : "\u005C](\u005C2)\u005C]",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.special.string.long.close.lua"
+ }
+ },
+ "name" : "context.string.long.text.lua"
+ },
+ "string_single" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.special.singlequoted.open.lua"
+ },
+ "2" : {
+ "name" : "context.string.singlequoted.text.lua"
+ },
+ "3" : {
+ "name" : "context.special.singlequoted.close.lua"
+ }
+ },
+ "match" : "(')((?:\u005C\u005C'|[^'])*)(')"
+ },
+ "texcommand" : {
+ "match" : "\u005C\u005C[A-Za-z-ÿ@\u005C!\u005C?_]*",
+ "name" : "context.warning.texcommand.lua"
+ },
+ "texstring" : {
+ "begin" : "\u005C\u005C!!bs",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.special.texstring.open.lua"
+ }
+ },
+ "end" : "\u005C\u005C!!es",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.special.texstring.close.lua"
+ }
+ },
+ "name" : "context.string.texstring.text.lua"
+ }
+ },
+ "scopeName" : "source.context.cld",
+ "version" : "1.0.0"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-cpp.json b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-cpp.json
new file mode 100644
index 00000000000..b0c715972f6
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-cpp.json
@@ -0,0 +1,143 @@
+{
+ "name" : "context.cpp",
+ "patterns" : [
+ {
+ "include" : "#keyword"
+ },
+ {
+ "include" : "#datatype"
+ },
+ {
+ "include" : "#luatex"
+ },
+ {
+ "include" : "#identifier"
+ },
+ {
+ "include" : "#macro"
+ },
+ {
+ "include" : "#string_double"
+ },
+ {
+ "include" : "#string_single"
+ },
+ {
+ "include" : "#texcomment"
+ },
+ {
+ "include" : "#longcomment"
+ },
+ {
+ "include" : "#shortcomment"
+ },
+ {
+ "include" : "#hexnumber"
+ },
+ {
+ "include" : "#decnumber"
+ },
+ {
+ "include" : "#operator"
+ }
+ ],
+ "repository" : {
+ "datatype" : {
+ "match" : "\u005Cb(void|unsigned|union|struct|signed|short|long|int|float|enum|double|char|bool)\u005Cb",
+ "name" : "context.keyword.datatype.c"
+ },
+ "decnumber" : {
+ "match" : "[\u005C-]?[0-9]+(\u005C.[0-9]+)?([eEpP]\u005C-?[0-9]+)?",
+ "name" : "context.number.dec.c"
+ },
+ "hexnumber" : {
+ "match" : "[\u005C-]?0[xX][A-Fa-f0-9]+(\u005C.[A-Fa-f0-9]+)?([eEpP]\u005C-?[A-Fa-f0-9]+)?",
+ "name" : "context.number.hex.c"
+ },
+ "identifier" : {
+ "match" : "[A-Za-z_][A-Za-z_0-9]*",
+ "name" : "context.default.identifier.c"
+ },
+ "keyword" : {
+ "match" : "\u005Cb(while|volatile|virtual|using|typename|typeid|typedef|try|true|throw|this|template|switch|static_cast|static_assert|static|slots|sizeof|signals|return|restrict|reinterpret_cast|register|public|protected|private|operator|new|namespace|mutable|inline|if|goto|friend|for|false|extern|export|explicit|else|dynamic_cast|do|delete|default|continue|const_cast|const|class|catch|case|break|auto|asm|_Pragma|_Imaginary|_Complex|_Bool)\u005Cb",
+ "name" : "context.keyword.c.c"
+ },
+ "longcomment" : {
+ "begin" : "/\u005C*",
+ "end" : "\u005C*/",
+ "name" : "context.comment.long.c"
+ },
+ "luatex" : {
+ "match" : "\u005Cb(word|scaled|quarterword|pointer|halfword|glueratio)\u005Cb",
+ "name" : "context.command.luatex.c"
+ },
+ "macro" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.data.macro.tag.c"
+ },
+ "2" : {
+ "name" : "context.data.macro.name.c"
+ }
+ },
+ "match" : "\u005Cs*(#)\u005Cs*\u005Cb(warning|using|undef|pragma|line|include|import|ifndef|ifdef|if|error|endif|else|elif|define)\u005Cb"
+ },
+ "operator" : {
+ "match" : "\u005C~|}|\u005C||{|\u005C^|\u005C]|\u005C[|\u005C?|>|=|<|;|:|/|\u005C.|\u005C-|\u005C+|\u005C*|\u005C)|\u005C(|\u005C&|\u005C%|\u005C!",
+ "name" : "context.operator.any.c"
+ },
+ "shortcomment" : {
+ "match" : "//.*$\u005Cn?",
+ "name" : "context.comment.short.c"
+ },
+ "string_double" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.special.doublequoted.open.c"
+ },
+ "2" : {
+ "name" : "context.string.doublequoted.text.c"
+ },
+ "3" : {
+ "name" : "context.special.doublequoted.close.c"
+ }
+ },
+ "match" : "(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)"
+ },
+ "string_single" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.special.singlequoted.open.c"
+ },
+ "2" : {
+ "name" : "context.string.singlequoted.text.c"
+ },
+ "3" : {
+ "name" : "context.special.singlequoted.close.c"
+ }
+ },
+ "match" : "(')((?:\u005C\u005C'|[^'])*)(')"
+ },
+ "texcomment" : {
+ "begin" : "/\u005C*tex",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.comment.tex.open.c"
+ }
+ },
+ "end" : "\u005C*/",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.comment.tex.close.c"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "source.context.tex"
+ }
+ ]
+ }
+ },
+ "scopeName" : "source.context.cpp",
+ "version" : "1.0.0"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-json.json b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-json.json
new file mode 100644
index 00000000000..9af4e89e798
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-json.json
@@ -0,0 +1,278 @@
+{
+ "name" : "context.json",
+ "patterns" : [
+ {
+ "include" : "#content"
+ }
+ ],
+ "repository" : {
+ "array" : {
+ "begin" : "\u005C[",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.grouping.array.open.json"
+ }
+ },
+ "end" : "\u005C]",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.grouping.array.close.json"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "#content"
+ }
+ ]
+ },
+ "content" : {
+ "patterns" : [
+ {
+ "include" : "#string"
+ },
+ {
+ "include" : "#hexnumber"
+ },
+ {
+ "include" : "#decnumber"
+ },
+ {
+ "include" : "#reserved"
+ },
+ {
+ "include" : "#hash"
+ },
+ {
+ "include" : "#array"
+ },
+ {
+ "include" : "#separator"
+ }
+ ]
+ },
+ "decnumber" : {
+ "match" : "\u005Cs*([\u005C-]?[0-9]+(\u005C.[0-9]+)?([eEpP]\u005C-?[0-9]+)?)",
+ "name" : "context.number.dec.json"
+ },
+ "hash" : {
+ "begin" : "\u005C{",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.grouping.hash.open.json"
+ }
+ },
+ "end" : "\u005C}",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.grouping.hash.close.json"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "#kv_content"
+ }
+ ]
+ },
+ "hexnumber" : {
+ "match" : "\u005Cs*([\u005C-]?0[xX][A-Fa-f0-9]+(\u005C.[A-Fa-f0-9]+)?([eEpP]\u005C-?[A-Fa-f0-9]+)?)",
+ "name" : "context.number.hex.json"
+ },
+ "kv_array" : {
+ "begin" : "(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)\u005Cs*(\u005C:)\u005Cs*(\u005C[)",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.quote.array.key.open.json"
+ },
+ "2" : {
+ "name" : "context.text.array.key.text.json"
+ },
+ "3" : {
+ "name" : "context.quote.array.key.close.json"
+ },
+ "4" : {
+ "name" : "context.operator.array.becomes.json"
+ },
+ "5" : {
+ "name" : "context.grouping.array.value.open.json"
+ }
+ },
+ "end" : "\u005C]",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.grouping.array.value.close.json"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "#content"
+ }
+ ]
+ },
+ "kv_content" : {
+ "patterns" : [
+ {
+ "include" : "#kv_string"
+ },
+ {
+ "include" : "#kv_hexnumber"
+ },
+ {
+ "include" : "#kv_decnumber"
+ },
+ {
+ "include" : "#kv_reserved"
+ },
+ {
+ "include" : "#kv_hash"
+ },
+ {
+ "include" : "#kv_array"
+ },
+ {
+ "include" : "#separator"
+ }
+ ]
+ },
+ "kv_decnumber" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.quote.dec.key.open.json"
+ },
+ "2" : {
+ "name" : "context.text.dec.key.text.json"
+ },
+ "3" : {
+ "name" : "context.quote.dec.key.close.json"
+ },
+ "4" : {
+ "name" : "context.operator.dec.becomes.json"
+ },
+ "5" : {
+ "name" : "context.number.dec.value.json"
+ }
+ },
+ "match" : "(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)\u005Cs*(\u005C:)\u005Cs*([\u005C-]?[0-9]+(\u005C.[0-9]+)?([eEpP]\u005C-?[0-9]+)?)"
+ },
+ "kv_hash" : {
+ "begin" : "(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)\u005Cs*(\u005C:)\u005Cs*(\u005C{)",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.quote.hash.key.open.json"
+ },
+ "2" : {
+ "name" : "context.text.hash.key.text.json"
+ },
+ "3" : {
+ "name" : "context.quote.hash.key.close.json"
+ },
+ "4" : {
+ "name" : "context.operator.hash.becomes.json"
+ },
+ "5" : {
+ "name" : "context.grouping.hash.value.open.json"
+ }
+ },
+ "end" : "\u005C}",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.grouping.hash.value.close.json"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "#kv_content"
+ }
+ ]
+ },
+ "kv_hexnumber" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.quote.hex.key.open.json"
+ },
+ "2" : {
+ "name" : "context.text.hex.key.text.json"
+ },
+ "3" : {
+ "name" : "context.quote.hex.key.close.json"
+ },
+ "4" : {
+ "name" : "context.operator.hex.becomes.json"
+ },
+ "5" : {
+ "name" : "context.number.hex.value.json"
+ }
+ },
+ "match" : "(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)\u005Cs*(\u005C:)\u005Cs*([\u005C-]?0[xX][A-Fa-f0-9]+(\u005C.[A-Fa-f0-9]+)?([eEpP]\u005C-?[A-Fa-f0-9]+)?)"
+ },
+ "kv_reserved" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.quote.reserved.key.open.json"
+ },
+ "2" : {
+ "name" : "context.text.reserved.key.text.json"
+ },
+ "3" : {
+ "name" : "context.quote.reserved.key.close.json"
+ },
+ "4" : {
+ "name" : "context.operator.reserved.becomes.json"
+ },
+ "5" : {
+ "name" : "context.primitive.reserved.value.json"
+ }
+ },
+ "match" : "(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)\u005Cs*(\u005C:)\u005Cs*(true|null|false)"
+ },
+ "kv_string" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.quote.string.key.open.json"
+ },
+ "2" : {
+ "name" : "context.text.string.key.text.json"
+ },
+ "3" : {
+ "name" : "context.quote.string.key.close.json"
+ },
+ "4" : {
+ "name" : "context.operator.string.becomes.json"
+ },
+ "5" : {
+ "name" : "context.quote.string.value.open.json"
+ },
+ "6" : {
+ "name" : "context.string.string.value.text.json"
+ },
+ "7" : {
+ "name" : "context.quote.string.value.close.json"
+ }
+ },
+ "match" : "(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)\u005Cs*(\u005C:)\u005Cs*(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)"
+ },
+ "reserved" : {
+ "match" : "\u005Cs*(true|null|false)",
+ "name" : "context.primitive.reserved.json"
+ },
+ "separator" : {
+ "match" : "\u005Cs*(\u005C,)",
+ "name" : "context.operator.separator.json"
+ },
+ "string" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.quote.string.open.json"
+ },
+ "2" : {
+ "name" : "context.string.string.text.json"
+ },
+ "3" : {
+ "name" : "context.quote.string.close.json"
+ }
+ },
+ "match" : "\u005Cs*(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)"
+ }
+ },
+ "scopeName" : "source.context.json",
+ "version" : "1.0.0"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-lua.json b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-lua.json
new file mode 100644
index 00000000000..9cd7a681d51
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-lua.json
@@ -0,0 +1,184 @@
+{
+ "name" : "context.lua",
+ "patterns" : [
+ {
+ "include" : "#keyword"
+ },
+ {
+ "include" : "#buildin"
+ },
+ {
+ "include" : "#constant"
+ },
+ {
+ "include" : "#csname"
+ },
+ {
+ "include" : "#goto"
+ },
+ {
+ "include" : "#number_hex"
+ },
+ {
+ "include" : "#number"
+ },
+ {
+ "include" : "#identifier_keyword"
+ },
+ {
+ "include" : "#identifier_valid"
+ },
+ {
+ "include" : "#longcomment"
+ },
+ {
+ "include" : "#string_long"
+ },
+ {
+ "include" : "#string_double"
+ },
+ {
+ "include" : "#string_single"
+ },
+ {
+ "include" : "#shortcomment"
+ },
+ {
+ "include" : "#label"
+ },
+ {
+ "include" : "#operator"
+ }
+ ],
+ "repository" : {
+ "builtin" : {
+ "match" : "(xpcall|utf8|unpack|type|tostring|tonumber|table|string|setmetatable|select|require|rawset|rawget|rawequal|print|pcall|pairs|package|os|next|module|math|lpeg|loadfile|load|ipairs|io|getmetatable|file|error|dofile|debug|coroutine|collectgarbage|bit32|assert)(?=[^a-zA-Z])",
+ "name" : "context.plain.reserved.builtin.lua"
+ },
+ "constant" : {
+ "match" : "(__unm|__tostring|__sub|__pow|__pairs|__newindex|__mul|__mode|__metatable|__lt|__len|__le|__ipairs|__index|__idiv|__gc|__eq|__div|__concat|__close|__call|__add|_VERSION|_M|_G|_ENV|\u005C.\u005C.\u005C.|NaN|<toclose>|<const>)(?=[^a-zA-Z])",
+ "name" : "context.data.reserved.constants.lua"
+ },
+ "csname" : {
+ "begin" : "(metapost|metafun|ctx[A-Za-z_]*|context|commands)(?=[^a-zA-Z])",
+ "end" : "(?!(\u005Cs*[\u005C.\u005C:]*\u005Cs*[_\u005Cw][_\u005Cw0-9]*))",
+ "name" : "context.user.csname.lua",
+ "patterns" : [
+ {
+ "match" : "[\u005C.\u005C:]",
+ "name" : "context.operator.csname.qualifier.lua"
+ }
+ ]
+ },
+ "goto" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.keyword.goto.keyword.lua"
+ },
+ "2" : {
+ "name" : "context.grouping.goto.target.lua"
+ }
+ },
+ "match" : "(goto)\u005Cs*([_\u005Cw][_\u005Cw0-9]*)"
+ },
+ "identifier_keyword" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.operator.identifier.keyword.lua"
+ },
+ "2" : {
+ "name" : "context.warning.identifier.keyword.lua"
+ }
+ },
+ "match" : "\u005Cs*([\u005C.\u005C:])\u005Cs*(while|until|true|then|return|repeat|or|not|nil|local|in|if|function|for|false|end|elseif|else|do|break|and)(?=[^a-zA-Z])"
+ },
+ "identifier_valid" : {
+ "match" : "[_\u005Cw][_\u005Cw0-9]*",
+ "name" : "context.default.identifier.valid.lua"
+ },
+ "keyword" : {
+ "match" : "(while|until|true|then|return|repeat|or|not|nil|local|in|if|function|for|false|end|elseif|else|do|break|and)(?=[^a-zA-Z])",
+ "name" : "context.keyword.reserved.keyword.lua"
+ },
+ "label" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.keyword.label.open.lua"
+ },
+ "2" : {
+ "name" : "context.grouping.label.target.lua"
+ },
+ "3" : {
+ "name" : "context.keyword.label.close.lua"
+ }
+ },
+ "match" : "(::)([_\u005Cw][_\u005Cw0-9]*)(::)"
+ },
+ "longcomment" : {
+ "begin" : "--\u005C[\u005C[",
+ "end" : "\u005C]\u005C]",
+ "name" : "context.comment.comment.long.lua"
+ },
+ "number" : {
+ "match" : "[\u005C-]?[0-9]+(\u005C.[0-9]+)?([eEpP]\u005C-?[0-9]+)?",
+ "name" : "context.number.decnumber.lua"
+ },
+ "number_hex" : {
+ "match" : "[\u005C-]?0[xX][A-Fa-f0-9]+(\u005C.[A-Fa-f0-9]+)?([eEpP]\u005C-?[A-Fa-f0-9]+)?",
+ "name" : "context.number.hexnumber.lua"
+ },
+ "operator" : {
+ "match" : "\u005C~|}|\u005C||{|\u005C^|\u005C]|\u005C[|>|=|<|;|:|/|\u005C.|\u005C-|,|\u005C+|\u005C*|\u005C)|\u005C(|\u005C'|\u005C%|#",
+ "name" : "context.special.operator.lua"
+ },
+ "shortcomment" : {
+ "match" : "--.*$\u005Cn?",
+ "name" : "context.comment.comment.short.lua"
+ },
+ "string_double" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.special.doublequoted.open.lua"
+ },
+ "2" : {
+ "name" : "context.string.doublequoted.text.lua"
+ },
+ "3" : {
+ "name" : "context.special.doublequoted.close.lua"
+ }
+ },
+ "match" : "(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)"
+ },
+ "string_long" : {
+ "begin" : "\u005C[(=*)\u005C[",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.special.string.long.open.lua"
+ }
+ },
+ "end" : "\u005C](\u005C2)\u005C]",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.special.string.long.close.lua"
+ }
+ },
+ "name" : "context.string.long.text.lua"
+ },
+ "string_single" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.special.singlequoted.open.lua"
+ },
+ "2" : {
+ "name" : "context.string.singlequoted.text.lua"
+ },
+ "3" : {
+ "name" : "context.special.singlequoted.close.lua"
+ }
+ },
+ "match" : "(')((?:\u005C\u005C'|[^'])*)(')"
+ }
+ },
+ "scopeName" : "source.context.lua",
+ "version" : "1.0.0"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-mps.json b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-mps.json
new file mode 100644
index 00000000000..1581881ebef
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-mps.json
@@ -0,0 +1,179 @@
+{
+ "name" : "context.mps",
+ "patterns" : [
+ {
+ "include" : "#comment"
+ },
+ {
+ "include" : "#internal"
+ },
+ {
+ "include" : "#shortcut"
+ },
+ {
+ "include" : "#luacall_suffixed"
+ },
+ {
+ "include" : "#luacall"
+ },
+ {
+ "include" : "#helper"
+ },
+ {
+ "include" : "#plain"
+ },
+ {
+ "include" : "#primitive"
+ },
+ {
+ "include" : "#texstuff"
+ },
+ {
+ "include" : "#suffix"
+ },
+ {
+ "include" : "#identifier"
+ },
+ {
+ "include" : "#number"
+ },
+ {
+ "include" : "#quoted"
+ },
+ {
+ "include" : "#special"
+ },
+ {
+ "include" : "#texlike"
+ },
+ {
+ "include" : "#extra"
+ }
+ ],
+ "repository" : {
+ "comment" : {
+ "match" : "%.*$\u005Cn?",
+ "name" : "context.comment.comment.mps"
+ },
+ "extra" : {
+ "match" : "\u005C~|\u005C||`|_|\u005C^|\u005C\u005C|/|\u005C-|\u005C+\u005C-\u005C+|\u005C+\u005C+|\u005C+|\u005C*|\u005C'|\u005C&|\u005C%",
+ "name" : "context.extra"
+ },
+ "helper" : {
+ "match" : "(zmod|ystretched|ysized|xysized|xyscaled|xstretched|xsized|withtransparency|withshadevector|withshadetransform|withshadestep|withshaderadius|withshadeorigin|withshademethod|withshadefraction|withshadefactor|withshadedomain|withshadedirection|withshadecolors|withshadecenter|withshade|withproperties|withmask|withlinearshade|withgrey|withgray|withcircularshade|whitecolor|wdpart|visualizepaths|visualizedfill|visualizeddraw|verbatim|utfsub|utflen|urtriangle|urmoved|urenlarged|urcircle|uptriangle|unspiked|unitvector|unittriangle|unitdiamond|unitcircle|uniquelist|undrawfill|undecorated|undashed|uncolored|ultriangle|ulmoved|ulenlarged|ulcircle|tripled|triangle|transparent|transparency|tostring|topenlarged|topboundary|topath|topair|tolist|tohash|tocycle|thetextext|thetexbox|theoffset|thelabel|texvar|texvar|textextoffset|textext|texstr|texstr|texmode|texbox|tensecircle|tcircle|tanh|tand|tan|systemmode|superellipsed|strut|stretched|straightpath|straightpairs|straightfunction|stoppassingvariable|startpassingvariable|squeezed|squarepath|sqr|spotcolor|space|sortlist|softened|snapped|smoothed|sized|sinh|sin|simplified|shownshadevector|shownshadeorigin|shortened|shapedlist|shadedup|shadedright|shadedleft|shadedinto|shadeddown|shaded|settoks|setmacro|setdimen|setcount|scriptindex|rule|roundedsquare|righttriangle|rightof|rightenlarged|rightboundary|rightarrow|resolvedcolor|resetdrawoptions|resetarrows|report|register|redecorated|readfile|rcircle|rawtextext|rawtexbox|randomshifted|randomizedcontrols|randomized|radian|quote|quotation|pushcurrentpicture|pushboundingbox|punked|property|properties|prefix|prefix|pow|positionxy|positionwhd|positionregion|positionpxy|positionpath|positionpage|positioninregion|positioncurve|positionbox|positionatanchor|positionanchor|popcurrentpicture|popboundingbox|pointof|pi|perpendicular|percent|penpoint|pencilled|peepholed|pathconnectors|passvariable|passarrayvariable|paralleled|paired|outsideof|outlinetexttopath|outlinetext|outerboundingbox|originpath|onlayer|oddly|nothing|notcached|normalfill|normaldraw|nofill|nodraw|newhash|naturalizepaths|namedcolor|multitonecolor|mp|mirroredabout|mirrored|luacall|lua|lrtriangle|lrmoved|lrenlarged|lrcircle|log|loadmodule|loadimage|loadfile|loadfigure|ln|lltriangle|llmoved|llenlarged|llcircle|listtolines|listtocurves|listsize|listlast|linearpath|lefttriangle|leftof|leftenlarged|leftboundary|leftarrow|lcircle|laddered|label|keepcached|istextext|isobject|isarray|isarray|invtan|invsin|inverted|invcos|inv|intersection_point|intersection_found|interpolated|insideof|inpath|innerboundingbox|inhash|infont|infinite|htpart|greyscale|greyed|grayscale|grayed|graphictext|gettoks|getmacro|getdimen|getcount|function|fulltriangle|fullsquare|fulldiamond|formatted|format|fillup|filloutlinetext|figure|externalfigure|exp|evenly|epsed|eofillup|eofill|eoclip|enlonged|enlarged|drawwholepath|drawpoints|drawpointoptions|drawpointlabels|drawpoint|drawpathoptions|drawpathonly|drawpath|drawoutlinetext|draworiginoptions|draworigin|drawlineoptions|drawlabeloptions|drawfill|drawdoublearrows|drawcontrolpoints|drawcontroloptions|drawcontrollines|drawboundoptions|drawboundingbox|drawboundary|dquote|dppart|downtriangle|dofill|dodraw|disposehash|dispose|dimension|detailpaths|detaileddraw|defineshade|decorated|ddecimal|dddecimal|ddddecimal|cutends|curvedpath|curvedpairs|curvedfunction|curved|crossingunder|crossed|crlf|cotd|cot|cosh|cos|cornered|copylist|constructedpath|constructedpairs|constructedfunction|condition|complemented|complementary|comment|colortype|colorpart|colorlike|colordecimalslist|colordecimals|cmyk|clearxy|circularpath|checkedbounds|checkbounds|centerarrow|center|break|boundingradius|boundingpoint|boundingcircle|boundingbox|bottomenlarged|bottomboundary|blownup|blackcolor|bitmapimage|bcircle|bbwidth|bbheight|basiccolors|autoalign|atan|asinh|asin|asgroup|arrowpath|area|anchored|along|addbackground|acosh|acos|SPACE|PERCENT|MP|DQUOTE|CRLF)(?=[^a-zA-Z\u005C_@!?-ÿ])",
+ "name" : "context.command.metafun.helper.mps"
+ },
+ "identifier" : {
+ "match" : "[a-zA-Z\u005C_@!?-ÿ]+",
+ "name" : "context.default.identifier.mps"
+ },
+ "internal" : {
+ "match" : "\u005C\u005C|\u005C.\u005C.\u005C.|\u005C.\u005C.|\u005C-\u005C-\u005C-|\u005C-\u005C-|\u005C&",
+ "name" : "context.reserved.internal.mps"
+ },
+ "luacall" : {
+ "begin" : "(lua)\u005Cs*(\u005C()\u005Cs*(\u0022)",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.embedded.lua.command.mps"
+ },
+ "2" : {
+ "name" : "context.special.lua.open.mps"
+ },
+ "3" : {
+ "name" : "context.special.lua.text.open.mps"
+ }
+ },
+ "end" : "(\u0022)\u005Cs*(\u005C))",
+ "endCaptures" : {
+ "1" : {
+ "name" : "context.special.lua.text.close.mps"
+ },
+ "2" : {
+ "name" : "context.special.lua.close.mps"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "source.context.cld"
+ }
+ ]
+ },
+ "luacall_suffixed" : {
+ "begin" : "(lua)",
+ "end" : "(?!(\u005Cs*[\u005C.]\u005Cs*[a-zA-Z\u005C_@!?-ÿ]+))",
+ "name" : "context.embedded.luacall.mps",
+ "patterns" : [
+ {
+ "match" : "[\u005C.]",
+ "name" : "context.default.luacall.qualifier.mps"
+ }
+ ]
+ },
+ "number" : {
+ "match" : "[\u005C-]?[0-9]+(\u005C.[0-9]+)?([eE]\u005C-?[0-9]+)?",
+ "name" : "context.number.number.mps"
+ },
+ "plain" : {
+ "match" : "(z|z|yellow|withdots|white|whatever|upto|up|unitvector|unitsquare|unfilldraw|unfill|undraw|triplet|tracingnone|tracingall|totransform|thru|thelabel|tensepath|takepower|superellipse|stop|softjoin|shipit|savepen|round|rotatedaround|rotatedabout|right|relax|reflectedabout|red|range|quartercircle|quadruplet|pt|pickup|pensquare|penspec|penrazor|penpos|penlabels|pc|origin|nullpen|mod|mm|min|max|makelabel|magenta|loggingall|left|laboff|labels|label|inverse|intersectionpoint|interact|incr|in|in|image|identity|hide|halfcircle|green|gobbled|gobble|fullcircle|font_extra_space|font_coding_scheme|flex|filldraw|fill|extra_setup|extra_endfig|extra_endchar|extra_beginfig|extra_beginchar|exitunless|evenly|endglyph|endfig|endchar|drawoptions|drawdot|drawdblarrow|drawarrow|draw|downto|down|dotprod|dotlabels|dotlabel|div|directionpoint|direction|dir|define_whole_vertical_pixels|define_whole_vertical_blacker_pixels|define_whole_pixels|define_whole_blacker_pixels|define_pixels|define_horizontal_corrected_pixels|define_good_y_pixels|define_good_x_pixels|define_corrected_pixels|define_blacker_pixels|defaultfont|decr|dd|dashpattern|cyan|cuttings|cutdraw|cutbefore|cutafter|currentpicture|currentpen|counterclockwise|cm|clearxy|clearpen|clearpen|clearit|change_width|center|ceiling|cc|capsule_end|bymatrix|bye|buildcycle|bp|blue|blankpicture|blacker|black|beginglyph|beginfig|beginchar|bbox|background|arrowhead|abs)(?=[^a-zA-Z\u005C_@!?-ÿ])",
+ "name" : "context.plain.plain.mps"
+ },
+ "primitive" : {
+ "match" : "(zscaled|yypart|yxpart|yscaled|ypart|yoffset|yellowpart|year|xypart|xxpart|xscaled|xpart|xoffset|write|withprescript|withpostscript|withpen|within|withcolor|withcmykcolor|warningcheck|vppp|void|vardef|urt|urcorner|until|unknown|uniformdeviate|ulft|ulcorner|turningnumber|turningcheck|truecorners|true|troffmode|transformed|transform|tracingtitles|tracingstats|tracingspecs|tracingrestores|tracingpens|tracingoutput|tracingonline|tracingmacros|tracinglostchars|tracingequations|tracingedges|tracingcommands|tracingchoices|tracingcapsules|totalweight|top|to|time|textual|text|tertiarydef|tertiary|tension|suffix|substring|subpath|stroked|string|str|step|sqrt|special|smoothing|slanted|sind|showvariable|showtoken|showstopping|showdependencies|show|shipout|shifted|setgroup|setbounds|secondarydef|secondary|screen_rows|screen_cols|scantokens|scaled|save|runscript|rt|rotated|rgbcolor|reverse|restoreclipcolor|redpart|readfrom|randomseed|proofing|prologues|primarydef|primary|prescriptpart|precontrol|postscriptpart|postcontrol|point|pixels_per_inch|picture|penspec|penpart|penoffset|pencircle|pen|pausing|pathpart|path|pair|outputtemplate|outputformat|outer|or|openwindow|openit|on|off|of|odd|oct|numspecial|numeric|numbersystem|nullpicture|notransforms|not|normaldeviate|nodisplays|newinternal|mpxbreak|mpprocset|month|mlog|miterlimit|minute|mexp|message|maketext|makepen|makepath|magentapart|lrt|lrcorner|lowres_fix|llft|llcorner|linejoin|linecap|ligtable|lft|let|length|known|kern|intersectiontimes|interpath|interim|input|inner|infont|imagerules|if|hround|hppp|hour|hex|headerbyte|greypart|greycolor|greenpart|graypart|grayfont|graycolor|granularity|glyph|gfcorners|forsuffixes|forever|for|fontsize|fontsize|fontpart|fontmapline|fontmapfile|fontmaking|fontdimen|floor|fillin|filled|filenametemplate|fi|false|extra_endfig|extra_beginfig|extensible|expr|expandafter|exitif|errmessage|envelope|endinput|endgroup|endfor|enddef|end|elseif|else|doublepath|displaying|display|directiontime|designsize|delimiters|def|decimal|day|dashpart|dashed|cycle|cyanpart|currentwindow|currenttransform|curl|cullit|cull|cosd|controls|contour|colormodel|color|cmykcolor|closefrom|clipped|clip|charwd|charlist|charic|charht|charext|charexists|chardy|chardx|chardp|charcode|char|bounded|boundarychar|bot|bot|boolean|bluepart|blackpart|begingroup|autorounding|arctime|arclength|angle|and|and|also|addto|ASCII)(?=[^a-zA-Z\u005C_@!?-ÿ])",
+ "name" : "context.primitive.primitive.mps"
+ },
+ "quoted" : {
+ "begin" : "\u0022",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.special.string.open.mps"
+ }
+ },
+ "end" : "\u0022",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.special.string.close.mps"
+ }
+ },
+ "name" : "context.string.string.text.mps"
+ },
+ "shortcut" : {
+ "match" : "(textextoffset|textextanchor|squared|sq|softlighttransparent|shadefactor|screentransparent|saturationtransparent|rounded|rgbcolormodel|pushparameters|presetparameters|popparameters|pen_top|pen_rt|pen_lft|pen_bot|overlaytransparent|normaltransparent|nocolormodel|multiplytransparent|mitered|metapostversion|maxdimensions|luminositytransparent|lightentransparent|labeloffset|join_radius|infinity|huetransparent|hasparameter|hasoption|hardlighttransparent|greycolormodel|graycolormodel|getparametertext|getparameters|getparameterpen|getparameterpath|getparameterdefault|getparametercount|getparameter|getmaxparametercount|exclusiontransparent|epsilon|eps|drawoptionsfactor|dq|dotlabeldiam|ditto|differencetransparent|definecolor|defaultscale|defaultpen|darkentransparent|crossingscale|crossingoption|contextlmtxmode|colortransparent|colordodgetransparent|colorburntransparent|cmykcolormodel|charscale|butt|beveled|bboxmargin|applyparameters|ahvariant|ahscale|ahlength|ahfactor|ahdimple|ahangle|EOF)(?=[^a-zA-Z\u005C_@!?-ÿ])",
+ "name" : "context.data.shortcut.mps"
+ },
+ "special" : {
+ "match" : "}|{|\u005C]|\u005C[|@#|>|=|<|:|\u005C)|\u005C(|#@|#|\u005C\u0022",
+ "name" : "context.special.special.mps"
+ },
+ "suffix" : {
+ "match" : "@#|#@|#",
+ "name" : "context.number.suffix.mps"
+ },
+ "texlike" : {
+ "match" : "\u005C[a-zA-Z\u005C_@!?-ÿ]+",
+ "name" : "context.warning.unexpected.tex.mps"
+ },
+ "texstuff" : {
+ "begin" : "((?:b|verbatim)tex)\u005Cs+",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.primitive.tex.open.mps"
+ }
+ },
+ "end" : "\u005Cs+(etex)",
+ "endCaptures" : {
+ "1" : {
+ "name" : "context.primitive.tex.close.mps"
+ }
+ },
+ "name" : "context.string.tex.mps",
+ "patterns" : [
+ {
+ "include" : "source.context.tex"
+ }
+ ]
+ }
+ },
+ "scopeName" : "source.context.mps",
+ "version" : "1.0.0"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-pdf.json b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-pdf.json
new file mode 100644
index 00000000000..a591905e036
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-pdf.json
@@ -0,0 +1,271 @@
+{
+ "name" : "context.pdf",
+ "patterns" : [
+ {
+ "include" : "#object"
+ },
+ {
+ "include" : "#comment"
+ },
+ {
+ "include" : "#trailer"
+ },
+ {
+ "include" : "#dictionary"
+ },
+ {
+ "include" : "#startxref"
+ },
+ {
+ "include" : "#xref"
+ }
+ ],
+ "repository" : {
+ "array" : {
+ "begin" : "(\u005C[)",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.grouping.array.open.pdf"
+ }
+ },
+ "end" : "(\u005C])",
+ "endCaptures" : {
+ "1" : {
+ "name" : "context.grouping.array.close.pdf"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "#content"
+ }
+ ]
+ },
+ "comment" : {
+ "match" : "%.*$\u005Cn?",
+ "name" : "context.comment.comment.pdf"
+ },
+ "content" : {
+ "patterns" : [
+ {
+ "include" : "#dictionary"
+ },
+ {
+ "include" : "#stream"
+ },
+ {
+ "include" : "#array"
+ },
+ {
+ "match" : "(/[^\u005Cs<>/\u005C[\u005C]\u005C(\u005C)]+)",
+ "name" : "context.constant.object.content.name.pdf"
+ },
+ {
+ "captures" : {
+ "1" : {
+ "name" : "context.warning.content.reference.1.pdf"
+ },
+ "2" : {
+ "name" : "context.warning.content.reference.2.pdf"
+ },
+ "3" : {
+ "name" : "context.command.content.reference.3.pdf"
+ }
+ },
+ "match" : "([0-9]+)\u005Cs*([0-9]+)\u005Cs*(R)"
+ },
+ {
+ "match" : "([\u005C-]?[0-9]*[\u005C.]?[0-9]+)",
+ "name" : "context.number.content.real.pdf"
+ },
+ {
+ "match" : "([\u005C-]?[0-9]+)",
+ "name" : "context.number.content.integer.pdf"
+ },
+ {
+ "captures" : {
+ "1" : {
+ "name" : "context.quote.content.string.open.pdf"
+ },
+ "2" : {
+ "name" : "context.string.content.string.text.pdf"
+ },
+ "3" : {
+ "name" : "context.quote.content.string.close.pdf"
+ }
+ },
+ "match" : "(\u005C()((?:\u005C\u005C[\u005C(\u005C)]|[^\u005C(\u005C)])*)(\u005C))"
+ },
+ {
+ "match" : "(true|null|false)",
+ "name" : "context.number.content.reserved.pdf"
+ },
+ {
+ "captures" : {
+ "1" : {
+ "name" : "context.quote.content.unicode.open.pdf"
+ },
+ "2" : {
+ "name" : "context.plain.content.unicode.bomb.pdf"
+ },
+ "3" : {
+ "name" : "context.string.content.unicode.text.pdf"
+ },
+ "4" : {
+ "name" : "context.quote.content.unicode.close.pdf"
+ }
+ },
+ "match" : "(<)(feff)([^>]*)(>)"
+ },
+ {
+ "captures" : {
+ "1" : {
+ "name" : "context.quote.content.whatsit.open.pdf"
+ },
+ "2" : {
+ "name" : "context.string.content.whatsit.text.pdf"
+ },
+ "3" : {
+ "name" : "context.quote.content.whatsit.close.pdf"
+ }
+ },
+ "match" : "(<)([^>]*)(>)"
+ }
+ ]
+ },
+ "dictionary" : {
+ "begin" : "(<<)",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.grouping.dictionary.open.pdf"
+ }
+ },
+ "end" : "(>>)",
+ "endCaptures" : {
+ "1" : {
+ "name" : "context.grouping.dictionary.close.pdf"
+ }
+ },
+ "patterns" : [
+ {
+ "begin" : "(/[^\u005Cs<>/\u005C[\u005C]\u005C(\u005C)]+)\u005Cs*",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.command.dictionary.name.pdf"
+ }
+ },
+ "end" : "(?=[>])",
+ "patterns" : [
+ {
+ "include" : "#content"
+ }
+ ]
+ }
+ ]
+ },
+ "object" : {
+ "begin" : "([0-9]+)\u005Cs*([0-9]+)\u005Cs*(obj)",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.warning.object.1.pdf"
+ },
+ "2" : {
+ "name" : "context.warning.object.2.pdf"
+ },
+ "3" : {
+ "name" : "context.keyword.object.open.pdf"
+ }
+ },
+ "end" : "(endobj)",
+ "endCaptures" : {
+ "1" : {
+ "name" : "context.keyword.object.close.pdf"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "#content"
+ }
+ ]
+ },
+ "startxref" : {
+ "begin" : "startxref\u005Cs*",
+ "captures" : {
+ "0" : {
+ "name" : "context.keyword.startxref.1.pdf"
+ }
+ },
+ "end" : "(?=[^0-9])",
+ "patterns" : [
+ {
+ "begin" : "([0-9]+)\u005Cs*",
+ "captures" : {
+ "1" : {
+ "name" : "context.number.startxref.2.pdf"
+ }
+ },
+ "end" : "(?=.)"
+ }
+ ]
+ },
+ "stream" : {
+ "begin" : "^stream$",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.keyword.stream.open.pdf"
+ }
+ },
+ "end" : "^endstream$",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.keyword.stream.close.pdf"
+ }
+ }
+ },
+ "trailer" : {
+ "match" : "trailer",
+ "name" : "context.keyword.trailer.pdf"
+ },
+ "xref" : {
+ "begin" : "xref\u005Cs*",
+ "captures" : {
+ "0" : {
+ "name" : "context.keyword.xref.1.pdf"
+ }
+ },
+ "end" : "(?=[^0-9])",
+ "patterns" : [
+ {
+ "begin" : "([0-9]+)\u005Cs*([0-9]+)\u005Cs*",
+ "captures" : {
+ "1" : {
+ "name" : "context.number.xref.2.pdf"
+ },
+ "2" : {
+ "name" : "context.number.xref.3.pdf"
+ }
+ },
+ "end" : "(?=[^0-9])",
+ "patterns" : [
+ {
+ "begin" : "([0-9]+)\u005Cs*([0-9]+)\u005Cs*([fn])\u005Cs*",
+ "captures" : {
+ "1" : {
+ "name" : "context.number.xref.4.pdf"
+ },
+ "2" : {
+ "name" : "context.number.xref.5.pdf"
+ },
+ "3" : {
+ "name" : "context.keyword.xref.6.pdf"
+ }
+ },
+ "end" : "(?=.)"
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "scopeName" : "source.context.pdf",
+ "version" : "1.0.0"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-sql.json b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-sql.json
new file mode 100644
index 00000000000..60ff5e34286
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-sql.json
@@ -0,0 +1,120 @@
+{
+ "name" : "context.sql",
+ "patterns" : [
+ {
+ "include" : "#keyword_standard"
+ },
+ {
+ "include" : "#keyword_dialect"
+ },
+ {
+ "include" : "#identifier"
+ },
+ {
+ "include" : "#string_double"
+ },
+ {
+ "include" : "#string_single"
+ },
+ {
+ "include" : "#string_reverse"
+ },
+ {
+ "include" : "#comment_long"
+ },
+ {
+ "include" : "#comment_short"
+ },
+ {
+ "include" : "#number"
+ },
+ {
+ "include" : "#operator"
+ }
+ ],
+ "repository" : {
+ "comment_long" : {
+ "begin" : "/\u005C*",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.command.comment.open.sql"
+ }
+ },
+ "end" : "\u005C*/",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.command.comment.close.sql"
+ }
+ },
+ "name" : "context.comment.comment.text.sql"
+ },
+ "comment_short" : {
+ "match" : "%.*$\u005Cn?",
+ "name" : "context.comment.comment.comment.sql"
+ },
+ "identifier" : {
+ "match" : "[a-zA-Z\u005C_][a-zA-Z0-9\u005C_]*",
+ "name" : "context.text.identifier.sql"
+ },
+ "keyword_dialect" : {
+ "match" : "(zerofill|year_month|xor|x509|writetext|width_bucket|waitfor|volatile|verbose|variables|variable|varcharacter|varchar2|varbinary|var_samp|var_pop|validator|validate|valid|vacuum|utc_timestamp|utc_time|utc_date|user_defined_type_schema|user_defined_type_name|user_defined_type_code|user_defined_type_catalog|use|updatetext|unsigned|unnamed|unlock|unlisten|unencrypted|uncommitted|unbounded|uid|uescape|type|tsequal|trusted|truncate|trigger_schema|trigger_name|trigger_catalog|transforms|transform|transactions_rolled_back|transactions_committed|transaction_active|tran|top_level_count|top|toast|tinytext|tinyint|tinyblob|ties|than|textsize|text|terminated|terminate|template|temp|tablespace|tables|table_name|sysid|sysdate|synonym|superuser|successful|sublist|subclass_origin|style|structure|string|strict|straight_join|storage|stdout|stdin|stddev_samp|stddev_pop|status|statistics|statement|starting|stable|ssl|sqrt|sqlca|sql_warnings|sql_small_result|sql_select_limit|sql_low_priority_updates|sql_log_update|sql_log_off|sql_calc_found_rows|sql_big_tables|sql_big_selects|sql_big_result|specific_name|spatial|source|soname|simple|shutdown|show|share|setuser|setof|server_name|serializable|sequence|separator|self|security|second_microsecond|scope_schema|scope_name|scope_catalog|schemas|schema_name|scale|save|rule|rownum|rowid|rowguidcol|rowcount|row_number|row_count|routine_schema|routine_name|routine_catalog|rlike|returned_sqlstate|returned_octet_length|returned_length|returned_cardinality|restore|restart|resource|reset|require|replication|replace|repeatable|rename|reload|reindex|regr_syy|regr_sxy|regr_sxx|regr_slope|regr_r2|regr_intercept|regr_count|regr_avgy|regr_avgx|regexp|reconfigure|recheck|readtext|raw|rank|raiserror|raid0|quote|purge|processlist|process|procedural|proc|print|prepared|preorder|prefix|preceding|power|postfix|pli|plan|placing|percentile_disc|percentile_cont|percent_rank|percent|pctfree|password|pascal|parameters|parameter_specific_schema|parameter_specific_name|parameter_specific_catalog|parameter_ordinal_position|parameter_name|parameter_mode|pack_keys|owner|overriding|overlay|outfile|others|ordering|options|optionally|optimize|operator|operation|openxml|openrowset|openquery|opendatasource|online|oids|offsets|offset|offline|off|octets|number|nulls|nullable|nowait|notnull|notify|nothing|nosuperuser|normalized|normalize|nonclustered|nologin|noinherit|nocreateuser|nocreaterole|nocreatedb|nocompress|nocheck|noaudit|no_write_to_binlog|nesting|name|myisam|mumps|move|more|monthname|modify|mode|mod|mlslabel|minvalue|minute_second|minute_microsecond|minus|min_rows|middleint|message_text|message_octet_length|message_length|mediumtext|mediumint|mediumblob|maxvalue|maxextents|max_rows|matched|m|low_priority|longtext|longblob|long|logs|login|lock|location|load|ln|listen|lines|lineno|limit|less|length|least|last_insert_id|lancompiler|kill|keys|key_type|key_member|k|isnull|isam|invoker|intersection|int8|int4|int3|int2|int1|instead|instantiable|instance|insert_id|initialize|initial|inherits|inherit|infix|infile|index|increment|including|include|implicit|implementation|immutable|ilike|ignore|identitycol|identity_insert|identified|hour_second|hour_minute|hour_microsecond|hosts|host|holdlock|high_priority|hierarchy|heap|header|greatest|grants|granted|generated|g|fusion|fulltext|freeze|freetexttable|freetext|forward|fortran|force|following|flush|floor|float8|float4|final|fillfactor|file|fields|explain|exp|existing|exclusive|excluding|exclude|every|escaped|errlvl|enum|end-exec|encrypted|encoding|enclosed|enable|dynamic_function_code|dynamic_function|dump|dummy|dual|div|distributed|distinctrow|dispatch|disk|disable|dictionary|destructor|destroy|derived|deny|dense_rank|delimiters|delimiter|delayed|delay_key_write|degree|definer|defined|defaults|dbcc|dayofyear|dayofweek|dayofmonth|day_second|day_minute|day_microsecond|day_hour|datetime_interval_precision|datetime_interval_code|datetime|databases|database|cursor_name|cume_dist|csv|createuser|createrole|createdb|covar_samp|covar_pop|corr|copy|conversion|containstable|constraint_schema|constraint_name|constraint_catalog|connection_name|condition_number|compute|compress|completion|committed|comment|command_function_code|command_function|columns|column_name|collect|collation_schema|collation_name|collation_catalog|cobol|clustered|cluster|class_origin|class|checksum|checkpoint|checked|characters|characteristics|character_set_schema|character_set_name|character_set_catalog|change|chain|ceiling|ceil|catalog_name|cardinality|cache|c|bulk|browse|break|bool|bitvar|bernoulli|backward|backup|avg_row_length|auto_increment|audit|attributes|attribute|assignment|analyze|analyse|always|also|alias|aggregate|admin|ada|access|abs|abort|a|ZEROFILL|YEAR_MONTH|XOR|X509|WRITETEXT|WIDTH_BUCKET|WAITFOR|VOLATILE|VERBOSE|VARIABLES|VARIABLE|VARCHARACTER|VARCHAR2|VARBINARY|VAR_SAMP|VAR_POP|VALIDATOR|VALIDATE|VALID|VACUUM|UTC_TIMESTAMP|UTC_TIME|UTC_DATE|USER_DEFINED_TYPE_SCHEMA|USER_DEFINED_TYPE_NAME|USER_DEFINED_TYPE_CODE|USER_DEFINED_TYPE_CATALOG|USE|UPDATETEXT|UNSIGNED|UNNAMED|UNLOCK|UNLISTEN|UNENCRYPTED|UNCOMMITTED|UNBOUNDED|UID|UESCAPE|TYPE|TSEQUAL|TRUSTED|TRUNCATE|TRIGGER_SCHEMA|TRIGGER_NAME|TRIGGER_CATALOG|TRANSFORMS|TRANSFORM|TRANSACTIONS_ROLLED_BACK|TRANSACTIONS_COMMITTED|TRANSACTION_ACTIVE|TRAN|TOP_LEVEL_COUNT|TOP|TOAST|TINYTEXT|TINYINT|TINYBLOB|TIES|THAN|TEXTSIZE|TEXT|TERMINATED|TERMINATE|TEMPLATE|TEMP|TABLESPACE|TABLES|TABLE_NAME|SYSID|SYSDATE|SYNONYM|SUPERUSER|SUCCESSFUL|SUBLIST|SUBCLASS_ORIGIN|STYLE|STRUCTURE|STRING|STRICT|STRAIGHT_JOIN|STORAGE|STDOUT|STDIN|STDDEV_SAMP|STDDEV_POP|STATUS|STATISTICS|STATEMENT|STARTING|STABLE|SSL|SQRT|SQLCA|SQL_WARNINGS|SQL_SMALL_RESULT|SQL_SELECT_LIMIT|SQL_LOW_PRIORITY_UPDATES|SQL_LOG_UPDATE|SQL_LOG_OFF|SQL_CALC_FOUND_ROWS|SQL_BIG_TABLES|SQL_BIG_SELECTS|SQL_BIG_RESULT|SPECIFIC_NAME|SPATIAL|SOURCE|SONAME|SIMPLE|SHUTDOWN|SHOW|SHARE|SETUSER|SETOF|SERVER_NAME|SERIALIZABLE|SEQUENCE|SEPARATOR|SELF|SECURITY|SECOND_MICROSECOND|SCOPE_SCHEMA|SCOPE_NAME|SCOPE_CATALOG|SCHEMAS|SCHEMA_NAME|SCALE|SAVE|RULE|ROWNUM|ROWID|ROWGUIDCOL|ROWCOUNT|ROW_NUMBER|ROW_COUNT|ROUTINE_SCHEMA|ROUTINE_NAME|ROUTINE_CATALOG|RLIKE|RETURNED_SQLSTATE|RETURNED_OCTET_LENGTH|RETURNED_LENGTH|RETURNED_CARDINALITY|RESTORE|RESTART|RESOURCE|RESET|REQUIRE|REPLICATION|REPLACE|REPEATABLE|RENAME|RELOAD|REINDEX|REGR_SYY|REGR_SXY|REGR_SXX|REGR_SLOPE|REGR_R2|REGR_INTERCEPT|REGR_COUNT|REGR_AVGY|REGR_AVGX|REGEXP|RECONFIGURE|RECHECK|READTEXT|RAW|RANK|RAISERROR|RAID0|QUOTE|PURGE|PROCESSLIST|PROCESS|PROCEDURAL|PROC|PRINT|PREPARED|PREORDER|PREFIX|PRECEDING|POWER|POSTFIX|PLI|PLAN|PLACING|PERCENTILE_DISC|PERCENTILE_CONT|PERCENT_RANK|PERCENT|PCTFREE|PASSWORD|PASCAL|PARAMETERS|PARAMETER_SPECIFIC_SCHEMA|PARAMETER_SPECIFIC_NAME|PARAMETER_SPECIFIC_CATALOG|PARAMETER_ORDINAL_POSITION|PARAMETER_NAME|PARAMETER_MODE|PACK_KEYS|OWNER|OVERRIDING|OVERLAY|OUTFILE|OTHERS|ORDERING|OPTIONS|OPTIONALLY|OPTIMIZE|OPERATOR|OPERATION|OPENXML|OPENROWSET|OPENQUERY|OPENDATASOURCE|ONLINE|OIDS|OFFSETS|OFFSET|OFFLINE|OFF|OCTETS|NUMBER|NULLS|NULLABLE|NOWAIT|NOTNULL|NOTIFY|NOTHING|NOSUPERUSER|NORMALIZED|NORMALIZE|NONCLUSTERED|NOLOGIN|NOINHERIT|NOCREATEUSER|NOCREATEROLE|NOCREATEDB|NOCOMPRESS|NOCHECK|NOAUDIT|NO_WRITE_TO_BINLOG|NESTING|NAME|MYISAM|MUMPS|MOVE|MORE|MONTHNAME|MODIFY|MODE|MOD|MLSLABEL|MINVALUE|MINUTE_SECOND|MINUTE_MICROSECOND|MINUS|MIN_ROWS|MIDDLEINT|MESSAGE_TEXT|MESSAGE_OCTET_LENGTH|MESSAGE_LENGTH|MEDIUMTEXT|MEDIUMINT|MEDIUMBLOB|MAXVALUE|MAXEXTENTS|MAX_ROWS|MATCHED|M|LOW_PRIORITY|LONGTEXT|LONGBLOB|LONG|LOGS|LOGIN|LOCK|LOCATION|LOAD|LN|LISTEN|LINES|LINENO|LIMIT|LESS|LENGTH|LEAST|LAST_INSERT_ID|LANCOMPILER|KILL|KEYS|KEY_TYPE|KEY_MEMBER|K|ISNULL|ISAM|INVOKER|INTERSECTION|INT8|INT4|INT3|INT2|INT1|INSTEAD|INSTANTIABLE|INSTANCE|INSERT_ID|INITIALIZE|INITIAL|INHERITS|INHERIT|INFIX|INFILE|INDEX|INCREMENT|INCLUDING|INCLUDE|IMPLICIT|IMPLEMENTATION|IMMUTABLE|ILIKE|IGNORE|IDENTITYCOL|IDENTITY_INSERT|IDENTIFIED|HOUR_SECOND|HOUR_MINUTE|HOUR_MICROSECOND|HOSTS|HOST|HOLDLOCK|HIGH_PRIORITY|HIERARCHY|HEAP|HEADER|GREATEST|GRANTS|GRANTED|GENERATED|G|FUSION|FULLTEXT|FREEZE|FREETEXTTABLE|FREETEXT|FORWARD|FORTRAN|FORCE|FOLLOWING|FLUSH|FLOOR|FLOAT8|FLOAT4|FINAL|FILLFACTOR|FILE|FIELDS|EXPLAIN|EXP|EXISTING|EXCLUSIVE|EXCLUDING|EXCLUDE|EVERY|ESCAPED|ERRLVL|ENUM|END-EXEC|ENCRYPTED|ENCODING|ENCLOSED|ENABLE|DYNAMIC_FUNCTION_CODE|DYNAMIC_FUNCTION|DUMP|DUMMY|DUAL|DIV|DISTRIBUTED|DISTINCTROW|DISPATCH|DISK|DISABLE|DICTIONARY|DESTRUCTOR|DESTROY|DERIVED|DENY|DENSE_RANK|DELIMITERS|DELIMITER|DELAYED|DELAY_KEY_WRITE|DEGREE|DEFINER|DEFINED|DEFAULTS|DBCC|DAYOFYEAR|DAYOFWEEK|DAYOFMONTH|DAY_SECOND|DAY_MINUTE|DAY_MICROSECOND|DAY_HOUR|DATETIME_INTERVAL_PRECISION|DATETIME_INTERVAL_CODE|DATETIME|DATABASES|DATABASE|CURSOR_NAME|CUME_DIST|CSV|CREATEUSER|CREATEROLE|CREATEDB|COVAR_SAMP|COVAR_POP|CORR|COPY|CONVERSION|CONTAINSTABLE|CONSTRAINT_SCHEMA|CONSTRAINT_NAME|CONSTRAINT_CATALOG|CONNECTION_NAME|CONDITION_NUMBER|COMPUTE|COMPRESS|COMPLETION|COMMITTED|COMMENT|COMMAND_FUNCTION_CODE|COMMAND_FUNCTION|COLUMNS|COLUMN_NAME|COLLECT|COLLATION_SCHEMA|COLLATION_NAME|COLLATION_CATALOG|COBOL|CLUSTERED|CLUSTER|CLASS_ORIGIN|CLASS|CHECKSUM|CHECKPOINT|CHECKED|CHARACTERS|CHARACTERISTICS|CHARACTER_SET_SCHEMA|CHARACTER_SET_NAME|CHARACTER_SET_CATALOG|CHANGE|CHAIN|CEILING|CEIL|CATALOG_NAME|CARDINALITY|CACHE|C|BULK|BROWSE|BREAK|BOOL|BITVAR|BERNOULLI|BACKWARD|BACKUP|AVG_ROW_LENGTH|AUTO_INCREMENT|AUDIT|ATTRIBUTES|ATTRIBUTE|ASSIGNMENT|ANALYZE|ANALYSE|ALWAYS|ALSO|ALIAS|AGGREGATE|ADMIN|ADA|ACCESS|ABS|ABORT|A)(?=[^a-zA-Z])",
+ "name" : "context.keyword.reserved.dialect.sql"
+ },
+ "keyword_standard" : {
+ "match" : "(zone|year|write|work|without|within|with|window|while|where|whenever|when|view|varying|varchar|values|value|using|user|usage|upper|update|until|unnest|unknown|unique|union|undo|under|true|trim|trigger|treat|translation|translate|transaction|trailing|to|timezone_minute|timezone_hour|timestamp|time|then|temporary|tablesample|table|system_user|system|symmetric|sum|substring|submultiset|static|state|start|sqlwarning|sqlstate|sqlexception|sqlerror|sqlcode|sql|specifictype|specific|space|some|smallint|size|similar|signal|sets|set|session_user|session|sensitive|select|section|second|search|scroll|scope|schema|savepoint|rows|row|routine|rollup|rollback|role|right|revoke|returns|return|result|restrict|resignal|repeat|release|relative|referencing|references|ref|recursive|real|reads|read|range|public|procedure|privileges|prior|primary|preserve|prepare|precision|position|path|partition|partial|parameter|pad|overlaps|over|output|outer|out|ordinality|order|or|option|open|only|on|old|of|octet_length|object|numeric|nullif|null|not|none|no|next|new|nclob|nchar|natural|national|names|multiset|month|module|modifies|minute|min|method|merge|member|max|match|map|lower|loop|locator|localtimestamp|localtime|local|like|level|left|leave|leading|lateral|last|large|language|key|join|iterate|isolation|is|into|interval|intersect|integer|int|insert|insensitive|input|inout|inner|initially|indicator|in|immediate|if|identity|hour|hold|having|handler|grouping|group|grant|goto|go|global|get|general|function|full|from|free|found|foreign|for|float|first|filter|fetch|false|extract|external|exit|exists|execute|exec|exception|except|escape|equals|end|elseif|else|element|each|dynamic|drop|double|domain|do|distinct|disconnect|diagnostics|deterministic|descriptor|describe|desc|deref|depth|delete|deferred|deferrable|default|declare|decimal|dec|deallocate|day|date|data|cycle|cursor|current_user|current_transform_group_for_type|current_timestamp|current_time|current_role|current_path|current_default_transform_group|current_date|current|cube|cross|create|count|corresponding|convert|continue|contains|constructor|constraints|constraint|connection|connect|condition|commit|column|collation|collate|coalesce|close|clob|check|character_length|character|char_length|char|catalog|cast|case|cascaded|cascade|called|call|by|breadth|both|boolean|blob|bit_length|bit|binary|bigint|between|begin|before|avg|authorization|atomic|at|asymmetric|assertion|asensitive|asc|as|array|are|any|and|alter|allocate|all|after|add|action|absolute|ZONE|YEAR|WRITE|WORK|WITHOUT|WITHIN|WITH|WINDOW|WHILE|WHERE|WHENEVER|WHEN|VIEW|VARYING|VARCHAR|VALUES|VALUE|USING|USER|USAGE|UPPER|UPDATE|UNTIL|UNNEST|UNKNOWN|UNIQUE|UNION|UNDO|UNDER|TRUE|TRIM|TRIGGER|TREAT|TRANSLATION|TRANSLATE|TRANSACTION|TRAILING|TO|TIMEZONE_MINUTE|TIMEZONE_HOUR|TIMESTAMP|TIME|THEN|TEMPORARY|TABLESAMPLE|TABLE|SYSTEM_USER|SYSTEM|SYMMETRIC|SUM|SUBSTRING|SUBMULTISET|STATIC|STATE|START|SQLWARNING|SQLSTATE|SQLEXCEPTION|SQLERROR|SQLCODE|SQL|SPECIFICTYPE|SPECIFIC|SPACE|SOME|SMALLINT|SIZE|SIMILAR|SIGNAL|SETS|SET|SESSION_USER|SESSION|SENSITIVE|SELECT|SECTION|SECOND|SEARCH|SCROLL|SCOPE|SCHEMA|SAVEPOINT|ROWS|ROW|ROUTINE|ROLLUP|ROLLBACK|ROLE|RIGHT|REVOKE|RETURNS|RETURN|RESULT|RESTRICT|RESIGNAL|REPEAT|RELEASE|RELATIVE|REFERENCING|REFERENCES|REF|RECURSIVE|REAL|READS|READ|RANGE|PUBLIC|PROCEDURE|PRIVILEGES|PRIOR|PRIMARY|PRESERVE|PREPARE|PRECISION|POSITION|PATH|PARTITION|PARTIAL|PARAMETER|PAD|OVERLAPS|OVER|OUTPUT|OUTER|OUT|ORDINALITY|ORDER|OR|OPTION|OPEN|ONLY|ON|OLD|OF|OCTET_LENGTH|OBJECT|NUMERIC|NULLIF|NULL|NOT|NONE|NO|NEXT|NEW|NCLOB|NCHAR|NATURAL|NATIONAL|NAMES|MULTISET|MONTH|MODULE|MODIFIES|MINUTE|MIN|METHOD|MERGE|MEMBER|MAX|MATCH|MAP|LOWER|LOOP|LOCATOR|LOCALTIMESTAMP|LOCALTIME|LOCAL|LIKE|LEVEL|LEFT|LEAVE|LEADING|LATERAL|LAST|LARGE|LANGUAGE|KEY|JOIN|ITERATE|ISOLATION|IS|INTO|INTERVAL|INTERSECT|INTEGER|INT|INSERT|INSENSITIVE|INPUT|INOUT|INNER|INITIALLY|INDICATOR|IN|IMMEDIATE|IF|IDENTITY|HOUR|HOLD|HAVING|HANDLER|GROUPING|GROUP|GRANT|GOTO|GO|GLOBAL|GET|GENERAL|FUNCTION|FULL|FROM|FREE|FOUND|FOREIGN|FOR|FLOAT|FIRST|FILTER|FETCH|FALSE|EXTRACT|EXTERNAL|EXIT|EXISTS|EXECUTE|EXEC|EXCEPTION|EXCEPT|ESCAPE|EQUALS|END|ELSEIF|ELSE|ELEMENT|EACH|DYNAMIC|DROP|DOUBLE|DOMAIN|DO|DISTINCT|DISCONNECT|DIAGNOSTICS|DETERMINISTIC|DESCRIPTOR|DESCRIBE|DESC|DEREF|DEPTH|DELETE|DEFERRED|DEFERRABLE|DEFAULT|DECLARE|DECIMAL|DEC|DEALLOCATE|DAY|DATE|DATA|CYCLE|CURSOR|CURRENT_USER|CURRENT_TRANSFORM_GROUP_FOR_TYPE|CURRENT_TIMESTAMP|CURRENT_TIME|CURRENT_ROLE|CURRENT_PATH|CURRENT_DEFAULT_TRANSFORM_GROUP|CURRENT_DATE|CURRENT|CUBE|CROSS|CREATE|COUNT|CORRESPONDING|CONVERT|CONTINUE|CONTAINS|CONSTRUCTOR|CONSTRAINTS|CONSTRAINT|CONNECTION|CONNECT|CONDITION|COMMIT|COLUMN|COLLATION|COLLATE|COALESCE|CLOSE|CLOB|CHECK|CHARACTER_LENGTH|CHARACTER|CHAR_LENGTH|CHAR|CATALOG|CAST|CASE|CASCADED|CASCADE|CALLED|CALL|BY|BREADTH|BOTH|BOOLEAN|BLOB|BIT_LENGTH|BIT|BINARY|BIGINT|BETWEEN|BEGIN|BEFORE|AVG|AUTHORIZATION|ATOMIC|AT|ASYMMETRIC|ASSERTION|ASENSITIVE|ASC|AS|ARRAY|ARE|ANY|AND|ALTER|ALLOCATE|ALL|AFTER|ADD|ACTION|ABSOLUTE)(?=[^a-zA-Z])",
+ "name" : "context.keyword.reserved.standard.sql"
+ },
+ "number" : {
+ "match" : "[\u005C-]?[0-9]+(\u005C.[0-9]+)?([eEpP]\u005C-?[0-9]+)?",
+ "name" : "context.number.number.sql"
+ },
+ "operator" : {
+ "match" : "\u005C~|}|\u005C||{|\u005C^|\u005C]|\u005C[|\u005C?|>|=|<|;|:|/|\u005C.|\u005C-|\u005C+|\u005C*|\u005C)|\u005C(|\u005C&|\u005C%|\u005C!",
+ "name" : "context.special.operator.sql"
+ },
+ "string_double" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.special.doublequoted.open.sql"
+ },
+ "2" : {
+ "name" : "context.text.doublequoted.text.sql"
+ },
+ "3" : {
+ "name" : "context.special.doublequoted.close.sql"
+ }
+ },
+ "match" : "(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)"
+ },
+ "string_reverse" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.special.reversequoted.open.sql"
+ },
+ "2" : {
+ "name" : "context.text.reversequoted.text.sql"
+ },
+ "3" : {
+ "name" : "context.special.reversequoted.close.sql"
+ }
+ },
+ "match" : "(`)((?:\u005C\u005C`|[^`])*)(`)"
+ },
+ "string_single" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.special.singlequoted.open.sql"
+ },
+ "2" : {
+ "name" : "context.text.singlequoted.text.sql"
+ },
+ "3" : {
+ "name" : "context.special.singlequoted.close.sql"
+ }
+ },
+ "match" : "(')((?:\u005C\u005C'|[^'])*)(')"
+ }
+ },
+ "scopeName" : "source.context.sql",
+ "version" : "1.0.0"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-tex.json b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-tex.json
new file mode 100644
index 00000000000..480d3af444c
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-tex.json
@@ -0,0 +1,240 @@
+{
+ "name" : "context.tex",
+ "patterns" : [
+ {
+ "include" : "#comment"
+ },
+ {
+ "include" : "#constant"
+ },
+ {
+ "include" : "#lua_environment"
+ },
+ {
+ "include" : "#lua_command"
+ },
+ {
+ "include" : "#metafun_environment_o"
+ },
+ {
+ "include" : "#metafun_environment_a"
+ },
+ {
+ "include" : "#metafun_command"
+ },
+ {
+ "include" : "#subsystem_prefix"
+ },
+ {
+ "include" : "#subsystem_suffix"
+ },
+ {
+ "include" : "#ifprimitive"
+ },
+ {
+ "include" : "#helper"
+ },
+ {
+ "include" : "#command"
+ },
+ {
+ "include" : "#primitive"
+ },
+ {
+ "include" : "#reserved"
+ },
+ {
+ "include" : "#csname"
+ },
+ {
+ "include" : "#escaped"
+ },
+ {
+ "include" : "#grouping"
+ },
+ {
+ "include" : "#special"
+ },
+ {
+ "include" : "#extra"
+ }
+ ],
+ "repository" : {
+ "command" : {
+ "match" : "\u005C\u005C(zwnj|zwj|zstroke|zhook|zeta|zerowidthspace|zerowidthnobreakspace|zeronumberconversion|zdotaccent|zcaron|zacute|ytilde|ymacron|yhook|ygrave|yen|ydotbelow|ydiaeresis|ycircumflex|yacute|xypos|xxfrac|xtwoheadrightarrow|xtwoheadleftarrow|xtriplerel|xsplitstring|xrightoverleftarrow|xrightleftharpoons|xrightharpoonup|xrightharpoondown|xrightarrow|xrel|xmlverbatim|xmlvalue|xmltofile|xmltobufferverbose|xmltobuffer|xmltext|xmltexentity|xmltag|xmlstrippednolines|xmlstripped|xmlstripnolines|xmlstrip|xmlsnippet|xmlshow|xmlsetup|xmlsetsetup|xmlsetparam|xmlsetpar|xmlsetinjectors|xmlsetfunction|xmlsetentity|xmlsetattribute|xmlsetatt|xmlsave|xmlresetsetups|xmlresetinjectors|xmlresetdocumentsetups|xmlremovesetup|xmlremovedocumentsetup|xmlremapnamespace|xmlremapname|xmlregisterns|xmlregisteredsetups|xmlregistereddocumentsetups|xmlrefatt|xmlraw|xmlpure|xmlprocessfile|xmlprocessdata|xmlprocessbuffer|xmlprettyprinttext|xmlprettyprint|xmlprependsetup|xmlprependdocumentsetup|xmlposition|xmlpos|xmlpath|xmlparam|xmlpar|xmlnonspace|xmlnamespace|xmlname|xmlmapvalue|xmlmain|xmlloadonly|xmlloadfile|xmlloaddirectives|xmlloaddata|xmlloadbuffer|xmllastpar|xmllastmatch|xmllastatt|xmllast|xmlinstalldirective|xmlinlineverbatim|xmlinlineprettyprinttext|xmlinlineprettyprint|xmlinjector|xmlinfo|xmlinclusions|xmlinclusion|xmlinclude|xmlflushtext|xmlflushspacewise|xmlflushpure|xmlflushlinewise|xmlflushdocumentsetups|xmlflushcontext|xmlflush|xmlfirst|xmlfilter|xmlelement|xmldoiftext|xmldoifselfempty|xmldoifnottext|xmldoifnotselfempty|xmldoifnotatt|xmldoifnot|xmldoifelsevalue|xmldoifelsetext|xmldoifelseselfempty|xmldoifelseempty|xmldoifelseatt|xmldoifelse|xmldoifatt|xmldoif|xmldisplayverbatim|xmldirectivesbefore|xmldirectivesafter|xmldirectives|xmldefaulttotext|xmlcount|xmlcontext|xmlconcatrange|xmlconcat|xmlcommand|xmlchecknamespace|xmlchainattdef|xmlchainatt|xmlbeforesetup|xmlbeforedocumentsetup|xmlbadinclusions|xmlattributedef|xmlattribute|xmlattdef|xmlatt|xmlapplyselectors|xmlappendsetup|xmlappenddocumentsetup|xmlall|xmlaftersetup|xmlafterdocumentsetup|xmladdindex|xmapsto|xleftrightharpoons|xleftrightarrow|xleftharpoonup|xleftharpoondown|xleftarrow|xi|xhookrightarrow|xhookleftarrow|xfrac|xequal|xdefconvertedargument|xRightarrow|xLeftrightarrow|xLeftarrow|writetolist|writestatus|writedatatolist|writebetweenlist|wr|wp|wordtonumber|words|wordright|word|withoutpt|widthspanningtext|widthofstring|widetilde|widehat|whitearrowupfrombar|weekday|wedgeeq|wedge|wdofstring|wcircumflex|vspacing|vspace|vsmashed|vsmashbox|vsmash|vpos|vphantom|vpackedbox|vpackbox|vl|viewerlayer|vglue|veryraggedright|veryraggedleft|veryraggedcenter|verticalpositionbar|verticalgrowingbar|vert|version|verbosenumber|verbatimstring|verbatim|veeeq|veebar|vee|vec|vdots|vdash|vboxreference|vartheta|varsigma|varrho|varpi|varphi|varnothing|varkappa|varepsilon|varTheta|vDash|utilityregisterlength|utilde|utfupper|utflower|utfchar|usezipfile|useurl|usetypescriptfile|usetypescript|usetexmodule|usesymbols|usesubpath|usestaticMPfigure|usesetupsparameter|userpagenumber|usereferenceparameter|useproject|useprofileparameter|useproduct|usemodule|usemathstyleparameter|useluamodule|uselanguageparameter|useinterlinespaceparameter|useindentnextparameter|useindentingparameter|usegridparameter|usefile|usefigurebase|useexternalsoundtrack|useexternalrendering|useexternalfigure|useexternaldocument|useenvironment|usedummystyleparameter|usedummystyleandcolor|usedummycolorparameter|usedirectory|usecomponent|usecolors|usecitation|usebtxdefinitions|usebtxdataset|usebodyfontparameter|usebodyfont|useblocks|useblankparameter|usealignparameter|useURL|useMPvariables|useMPrun|useMPlibrary|useMPgraphic|useMPenvironmentbuffer|useJSscripts|url|uring|urcorner|upwhitearrow|upuparrows|upsilon|upperrightsinglesixquote|upperrightsingleninequote|upperrightdoublesixquote|upperrightdoubleninequote|upperleftsinglesixquote|upperleftsingleninequote|upperleftdoublesixquote|upperleftdoubleninequote|uppercasestring|uppercased|uplus|upharpoonright|upharpoonleft|updownarrows|updownarrowbar|updownarrow|updasharrow|uparrow|upand|uogonek|untexcommand|untexargument|unstackscripts|unspacestring|unspaced|unspaceargument|unspaceafter|unregisterhyphenationpattern|unprotected|unknown|unittext|unitslow|unitshigh|unitlanguage|unit|uniqueMPpagegraphic|uniqueMPgraphic|unihex|unhhbox|unframed|unexpandeddocumentvariable|undoassign|understrikes|understrike|underset|underrightarrow|underrandoms|underrandom|underparent|underleftarrow|underdots|underdot|underdashes|underdash|underbracket|underbrace|underbars|underbar|undepthed|undefinevalue|umacron|ulcorner|uinvertedbreve|uhungarumlaut|uhorntilde|uhornhook|uhorngrave|uhorndotbelow|uhornacute|uhorn|uhook|ugrave|uedcatcodecommand|udoublegrave|udots|udotbelow|udiaeresismacron|udiaeresisgrave|udiaeresiscaron|udiaeresisacute|udiaeresis|uconvertnumber|ucircumflex|ucaron|ubreve|uacute|typesetfile|typesetbuffer|typescripttwo|typescriptthree|typescriptprefix|typescriptone|typeinlinebuffer|typefile|typeface|typedefinedbuffer|typebuffer|type|typ|txx|tx|twothirds|twosuperior|twoheaduparrow|twoheadrightarrowtail|twoheadrightarrow|twoheadleftarrow|twoheaddownarrow|twofifths|twodigitrounding|turnediota|ttwoheadrightarrow|ttwoheadleftarrow|ttriplerel|ttraggedright|tstroke|truefontname|truefilename|tripleverticalbar|tripleprime|triplebond|trightoverleftarrow|trightleftharpoons|trightharpoonup|trightharpoondown|trightarrow|triangleright|triangleq|triangleleft|triangledown|triangle|trel|transparent|transparencycomponents|translate|trademark|tracepositions|traceoutputroutines|tracedfontname|tracecatcodetables|topskippedbox|toprightbox|toplinebox|topleftbox|topbox|top|tooltip|tolinenote|tochar|to|tmapsto|tleftrightharpoons|tleftrightarrow|tleftharpoonup|tleftharpoondown|tleftarrow|tlap|title|tinyfont|times|tilde|tightlayer|tibetannumerals|threesuperior|threequarter|threeperemspace|threefifths|threeeighths|threedigitrounding|thorn|thookrightarrow|thookleftarrow|thook|thirdofthreeunexpanded|thirdofthreearguments|thirdofsixarguments|thirdoffourarguments|thirdoffivearguments|thinspace|thinrules|thinrule|thickspace|theta|theremainingcharacters|therefore|thenormalizedbodyfontsize|thefirstcharacter|thainumerals|thai|textyen|textvisiblespace|textunderscore|texttilde|textsterling|textslash|textrule|textring|textreference|textpm|textplus|textperiod|textpercent|textounce|textormathchars|textormathchar|textohm|textogonek|textnumero|textmultiply|textmu|textminus|textmho|textmath|textmacron|textlognot|textkelvin|texthyphen|texthungarumlaut|texthorizontalbar|texthash|textgrave|textfraction|textflowcollector|texteuro|textellipsis|textdotaccent|textdong|textdollar|textdiv|textdiaeresis|textdegree|textddag|textdag|textcurrency|textcontrolspace|textcomma|textcite|textcitation|textcircumflex|textcircledP|textcent|textcelsius|textcedilla|textcaron|textbullet|textbrokenbar|textbreve|textbraceright|textbraceleft|textbottomdot|textbottomcomma|textbar|textbackslash|textat|textasciitilde|textasciicircum|textampersand|textacute|textAngstrom|texsetup|texdefinition|tex|testtokens|testpagesync|testpageonly|testpage|testfeatureonce|testfeature|testcolumn|testandsplitstring|test|tequal|tcurl|tcommaaccent|tcedilla|tcaron|tbox|tbinom|tau|taglabeltext|taglabellanguage|taggedlabeltexts|taggedctxcommand|tabulaterule|tabulateline|tabulateautorule|tabulateautoline|tRightarrow|tLeftrightarrow|tLeftarrow|systemsetups|systemloglast|systemlogfirst|systemlog|synctexsetfilename|synctexresetfilename|synctexblockfilename|synchronizewhitespace|synchronizestrut|synchronizeoutputstreams|synchronizemarking|synchronizeindenting|synchronizeblank|symbolreference|symbol|switchtointerlinespace|switchtocolor|switchtobodyfont|switchstyleonly|swarrow|swaptypeface|swapmacros|swapface|swapdimens|swapcounts|surdradical|surd|supsetneqq|supsetneq|supseteqq|supseteq|supset|sum|suffixtext|suffixlanguage|succsim|succnsim|succneqq|succneq|succnapprox|succeqq|succeq|succcurlyeq|succapprox|succ|subtractfeature|subsubsubsubsubject|subsubsubsubsection|subsubsubsubject|subsubsubsection|subsubsubject|subsubsection|subsubject|substituteincommalist|subsetneqq|subsetneq|subseteqq|subseteq|subset|subsentence|subsection|subpagenumber|subject|styleinstance|style|strutwd|struttedbox|struthtdp|strutht|strutgap|strutdp|strut|structurevariable|structureuservariable|structuretitle|structurenumber|structurelistuservariable|stripspaces|strippedcsname|stripcharacter|strictdoifnextoptionalelse|strictdoifelsenextoptional|stretched|stopxtablenext|stopxtablehead|stopxtablefoot|stopxtablebody|stopxtable|stopxrowgroup|stopxrow|stopxmlsetups|stopxmlraw|stopxmlinlineverbatim|stopxmldisplayverbatim|stopxgroup|stopxcolumn|stopxcellgroup|stopxcell|stopvtopregister|stopvtop|stopviewerlayer|stopvboxtohboxseparator|stopvboxtohbox|stopvboxregister|stopvbox|stopusingbtxspecification|stopuserdata|stopusemathstyleparameter|stopuseMPgraphic|stopusableMPgraphic|stopunpacked|stopunittext|stopuniqueMPpagegraphic|stopuniqueMPgraphic|stoptyping|stoptypescriptcollection|stoptypescript|stoptransparent|stoptokens|stoptokenlist|stoptitle|stoptextrule|stoptextmakeup|stoptextflow|stoptextcolorintent|stoptextcolor|stoptextbackgroundmanual|stoptextbackground|stoptext|stoptexdefinition|stoptexcode|stoptaglabeltext|stoptagged|stoptabulatetail|stoptabulatehead|stoptabulate|stoptabletext|stoptabletail|stoptables|stoptablehead|stoptable|stopsymbolset|stopsuffixtext|stopsubsubsubsubsubject|stopsubsubsubsubsection|stopsubsubsubsubject|stopsubsubsubsection|stopsubsubsubject|stopsubsubsection|stopsubsubject|stopsubstack|stopsubsentence|stopsubsection|stopsubjectlevel|stopsubject|stopsubformulas|stopstyle|stopstrut|stopstrictinspectnextcharacter|stopstaticMPgraphic|stopstaticMPfigure|stopstandardmakeup|stopspread|stopsplittext|stopsplitformula|stopspformula|stopspeech|stopspecialitem|stopsimplecolumns|stopsidebar|stopshift|stopshapebox|stopsetups|stopsectionlevel|stopsectionblockenvironment|stopsectionblock|stopsection|stopsdformula|stopscript|stopruby|stoprightaligned|stopreusableMPgraphic|stopregime|stopreferenceprefix|stopreadingfile|stoprawsetups|stoprandomseed|stoprandomized|stopquote|stopquotation|stoppunctuation|stoppublication|stopprotectedcolors|stopprotect|stopproject|stopproduct|stopprocesscommalist|stopprocesscommacommand|stopprocessassignmentlist|stopprocessassignmentcommand|stopprefixtext|stoppostponingnotes|stoppostponing|stoppositive|stoppositionoverlay|stoppositioning|stopplacetable|stopplacepairedbox|stopplacelegend|stopplaceintermezzo|stopplacegraphic|stopplaceformula|stopplacefloat|stopplacefigure|stopplacechemical|stoppath|stoppart|stopparbuilder|stopparagraphscell|stopparagraphs|stopparagraph|stoppar|stoppagemakeup|stoppagelayout|stoppagefigure|stoppagecomment|stoppagecolumns|stoppacked|stopoverprint|stopoverlay|stopoutputstream|stopopposite|stopoperatortext|stopnotmode|stopnotext|stopnotallmodes|stopnointerference|stopnicelyfilledbox|stopnegative|stopnarrower|stopnarrow|stopnamedsubformulas|stopnamedsection|stopmpformula|stopmoduletestsection|stopmodule|stopmodeset|stopmode|stopmixedcolumns|stopmiddlemakeup|stopmiddlealigned|stopmidaligned|stopmdformula|stopmaxaligned|stopmatrix|stopmatrices|stopmathstyle|stopmathmode|stopmathmatrix|stopmathlabeltext|stopmathcases|stopmathalignment|stopmarkpages|stopmarkedcontent|stopmarginrule|stopmarginblock|stopmakeup|stopluasetups|stopluaparameterset|stopluacode|stoplua|stoplocalsetups|stoplocalnotes|stoplocallinecorrection|stoplocalheadsetup|stoplocalfootnotes|stoplinetablehead|stoplinetablecell|stoplinetablebody|stoplinetable|stoplines|stoplinenumbering|stoplinenote|stoplinefiller|stoplinecorrection|stoplinealignment|stopline|stoplegend|stopleftaligned|stoplayout|stoplanguage|stoplabeltext|stopknockout|stopitemize|stopitemgroupcolumns|stopitemgroup|stopitem|stopintertext|stopintermezzotext|stopinterface|stopinteractionmenu|stopinteraction|stopindentedtext|stopindentation|stopimath|stophyphenation|stophighlight|stophiding|stophelptext|stopheadtext|stophead|stophboxregister|stophboxestohbox|stophbox|stophanging|stopgridsnapping|stopgraphictext|stopgoto|stopfrontmatter|stopframedtext|stopframedtable|stopframedrow|stopframedcontent|stopframedcell|stopframed|stopformulas|stopformula|stopfootnote|stopfontsolution|stopfontclass|stopfont|stopfloatcombination|stopfixed|stopfittingpage|stopfiguretext|stopfigure|stopfact|stopfacingfloat|stopexternalfigurecollection|stopextendedcatcodetable|stopexpandedcollect|stopexpanded|stopexceptions|stopenvironment|stopendofline|stopendnote|stopembeddedxtable|stopelement|stopeffect|stopdocument|stopdmath|stopdisplaymath|stopdelimitedtext|stopdelimited|stopcurrentlistentrywrapper|stopcurrentcolor|stopctxfunctiondefinition|stopctxfunction|stopcontextdefinitioncode|stopcontextcode|stopcomponent|stopcomment|stopcombination|stopcolumnsetspan|stopcolumnset|stopcolumns|stopcolorset|stopcoloronly|stopcolorintent|stopcolor|stopcollecting|stopcollect|stopchemicaltext|stopchemical|stopcheckedfences|stopcharacteralign|stopchapter|stopcenteraligned|stopcatcodetable|stopcases|stopbuffer|stopbtxrenderingdefinitions|stopbtxlabeltext|stopboxedcolumns|stopbordermatrix|stopbodymatter|stopblockquote|stopbitmapimage|stopbbordermatrix|stopbar|stopbackmatter|stopbackground|stopattachment|stopaside|stoparrangedpages|stopappendices|stopallmodes|stopalignment|stopalign|stopXML|stopTY|stopTX|stopTRs|stopTR|stopTN|stopTH|stopTEXpage|stopTEX|stopTDs|stopTD|stopTC|stopTABLEnext|stopTABLEhead|stopTABLEfoot|stopTABLEbody|stopTABLE|stopPARSEDXML|stopMPrun|stopMPpositionmethod|stopMPpositiongraphic|stopMPpage|stopMPinitializations|stopMPinclusions|stopMPextensions|stopMPenvironment|stopMPdrawing|stopMPdefinitions|stopMPcode|stopMPclip|stopMP|stopLUA|stopJSpreamble|stopJScode|stligature|startxtablenext|startxtablehead|startxtablefoot|startxtablebody|startxtable|startxrowgroup|startxrow|startxmlsetups|startxmlraw|startxmlinlineverbatim|startxmldisplayverbatim|startxgroup|startxcolumn|startxcellgroup|startxcell|startvtopregister|startvtop|startviewerlayer|startvboxtohboxseparator|startvboxtohbox|startvboxregister|startvbox|startusingbtxspecification|startuserdata|startusemathstyleparameter|startuseMPgraphic|startusableMPgraphic|startunpacked|startunittext|startuniqueMPpagegraphic|startuniqueMPgraphic|starttyping|starttypescriptcollection|starttypescript|starttransparent|starttokens|starttokenlist|starttitle|starttextrule|starttextmakeup|starttextflow|starttextcolorintent|starttextcolor|starttextbackgroundmanual|starttextbackground|starttext|starttexdefinition|starttexcode|starttaglabeltext|starttagged|starttabulatetail|starttabulatehead|starttabulate|starttabletext|starttabletail|starttables|starttablehead|starttable|startsymbolset|startsuffixtext|startsubsubsubsubsubject|startsubsubsubsubsection|startsubsubsubsubject|startsubsubsubsection|startsubsubsubject|startsubsubsection|startsubsubject|startsubstack|startsubsentence|startsubsection|startsubjectlevel|startsubject|startsubformulas|startstyle|startstrut|startstructurepageregister|startstrictinspectnextcharacter|startstaticMPgraphic|startstaticMPfigure|startstandardmakeup|startspread|startsplittext|startsplitformula|startspformula|startspeech|startspecialitem|startsimplecolumns|startsidebar|startshift|startshapebox|startsetups|startsectionlevel|startsectionblockenvironment|startsectionblock|startsection|startsdformula|startscript|startruby|startrightaligned|startreusableMPgraphic|startregister|startregime|startreferenceprefix|startreadingfile|startrawsetups|startrandomseed|startrandomized|startquote|startquotation|startpunctuation|startpublication|startprotectedcolors|startprotect|startproject|startproduct|startprocesscommalist|startprocesscommacommand|startprocessassignmentlist|startprocessassignmentcommand|startprefixtext|startpostponingnotes|startpostponing|startpositive|startpositionoverlay|startpositioning|startplacetable|startplacepairedbox|startplacelegend|startplaceintermezzo|startplacegraphic|startplaceformula|startplacefloat|startplacefigure|startplacechemical|startpath|startpart|startparbuilder|startparagraphscell|startparagraphs|startparagraph|startpar|startpagemakeup|startpagelayout|startpagefigure|startpagecomment|startpagecolumns|startpacked|startoverprint|startoverlay|startoutputstream|startopposite|startoperatortext|startnotmode|startnotext|startnotallmodes|startnointerference|startnicelyfilledbox|startnegative|startnarrower|startnarrow|startnamedsubformulas|startnamedsection|startmpformula|startmoduletestsection|startmodule|startmodeset|startmode|startmixedcolumns|startmiddlemakeup|startmiddlealigned|startmidaligned|startmdformula|startmaxaligned|startmatrix|startmatrices|startmathstyle|startmathmode|startmathmatrix|startmathlabeltext|startmathcases|startmathalignment|startmarkpages|startmarkedcontent|startmarginrule|startmarginblock|startmakeup|startluasetups|startluaparameterset|startluacode|startlua|startlocalsetups|startlocalnotes|startlocallinecorrection|startlocalheadsetup|startlocalfootnotes|startlinetablehead|startlinetablecell|startlinetablebody|startlinetable|startlines|startlinenumbering|startlinenote|startlinefiller|startlinecorrection|startlinealignment|startline|startlegend|startleftaligned|startlayout|startlanguage|startlabeltext|startknockout|startitemize|startitemgroupcolumns|startitemgroup|startitem|startintertext|startintermezzotext|startinterface|startinteractionmenu|startinteraction|startindentedtext|startindentation|startimath|starthyphenation|starthighlight|starthiding|starthelptext|startheadtext|starthead|starthboxregister|starthboxestohbox|starthbox|starthanging|startgridsnapping|startgraphictext|startgoto|startfrontmatter|startframedtext|startframedtable|startframedrow|startframedcontent|startframedcell|startframed|startformulas|startformula|startfootnote|startfontsolution|startfontclass|startfont|startfloatcombination|startfixed|startfittingpage|startfiguretext|startfigure|startfact|startfacingfloat|startexternalfigurecollection|startextendedcatcodetable|startexpandedcollect|startexpanded|startexceptions|startenvironment|startendofline|startendnote|startembeddedxtable|startelement|starteffect|startdocument|startdmath|startdisplaymath|startdelimitedtext|startdelimited|startcurrentlistentrywrapper|startcurrentcolor|startctxfunctiondefinition|startctxfunction|startcontextdefinitioncode|startcontextcode|startcomponent|startcomment|startcombination|startcolumnsetspan|startcolumnset|startcolumns|startcolorset|startcoloronly|startcolorintent|startcolor|startcollecting|startcollect|startchemicaltext|startchemical|startcheckedfences|startcharacteralign|startchapter|startcenteraligned|startcatcodetable|startcases|startbuffer|startbtxrenderingdefinitions|startbtxlabeltext|startboxedcolumns|startbordermatrix|startbodymatter|startblockquote|startbitmapimage|startbbordermatrix|startbar|startbackmatter|startbackground|startattachment|startaside|startarrangedpages|startappendices|startallmodes|startalignment|startalign|startXML|startTY|startTX|startTRs|startTR|startTN|startTH|startTEXpage|startTEX|startTDs|startTD|startTC|startTABLEnext|startTABLEhead|startTABLEfoot|startTABLEbody|startTABLE|startPARSEDXML|startMPrun|startMPpositionmethod|startMPpositiongraphic|startMPpage|startMPinitializations|startMPinclusions|startMPextensions|startMPenvironment|startMPdrawing|startMPdefinitions|startMPcode|startMPclip|startMP|startLUA|startJSpreamble|startJScode|stareq|star|stackscripts|stackrel|ssharp|squaredots|square|sqsupsetneq|sqsupseteq|sqsupset|sqsubsetneq|sqsubseteq|sqsubset|sqrt|sqcup|sqcap|spreadhbox|splitstring|splitofftype|splitofftokens|splitoffroot|splitoffpath|splitoffname|splitoffkind|splitofffull|splitoffbase|splitfrac|splitfloat|splitfilename|splitdfrac|splitatperiod|splitatcomma|splitatcolons|splitatcolon|splitatasterisk|sphericalangle|speech|spanishnumerals|spanishNumerals|spadesuit|spaceddigitssymbol|spaceddigitsseparator|spaceddigitsmethod|spaceddigits|space|somewhere|someplace|somenamedheadnumber|somelocalfloat|someline|somekindoftab|someheadnumber|solidus|softhyphen|snaptogrid|smile|smashedvbox|smashedhbox|smashboxed|smashbox|smash|smalltype|smallslantedbold|smallslanted|smallskip|smallnormal|smallitalicbold|smaller|smallcaps|smallcappedromannumerals|smallcappedcharacters|smallboldslanted|smallbolditalic|smallbold|smallbodyfont|small|sloveniannumerals|slovenianNumerals|slong|slicepages|slash|slantedface|slantedbold|slanted|sixthofsixarguments|sixperemspace|singleverticalbar|singlebond|singalcharacteralign|simplereversealignedboxplus|simplereversealignedbox|simplegroupedcommand|simplealignedspreadbox|simplealignedboxplus|simplealignedbox|simeq|sim|signalrightpage|sigma|showwarning|showvariable|showvalue|showtrackers|showtokens|showtimer|showsymbolset|showstruts|showsetupsdefinition|showsetups|showprint|showparentchain|showpalet|showotfcomposition|shownextbox|showminimalbaseline|showmessage|showmargins|showmakeup|showlogcategories|showligatures|showligature|showlayoutcomponents|showlayout|showkerning|showjustification|showinjector|showhyphens|showhyphenationtrace|showhelp|showgridsnapping|showgrid|showglyphs|showglyphdata|showframe|showfontstyle|showfontstrip|showfontparameters|showfontkerns|showfontitalics|showfontexpansion|showfontdata|showfont|showexperiments|showedebuginfo|showdirsinmargin|showdirectives|showcounter|showcolorstruts|showcolorset|showcolorgroup|showcolorcomponents|showcolorbar|showcolor|showcharratio|showchardata|showbtxtables|showbtxhashedauthors|showbtxfields|showbtxdatasetfields|showbtxdatasetcompleteness|showbtxdatasetauthors|showboxes|showbodyfontenvironment|showbodyfont|showattributes|showallmakeup|shiftup|shiftdown|shiftbox|sharp|shapedhbox|sfrac|seveneighths|setxvariables|setxvariable|setxvalue|setxmeasure|setwidthof|setvtopregister|setvisualizerfont|setvboxregister|setvariables|setvariable|setvalue|setuxvalue|setuvalue|setupxtable|setupxml|setupwithargumentswapped|setupwithargument|setupwhitespace|setupvspacing|setupviewerlayer|setupversion|setupuserpagenumber|setupuserdataalternative|setupuserdata|setupurl|setupunittext|setupunit|setuptyping|setuptype|setuptoptexts|setuptop|setuptooltip|setuptolerance|setupthinrules|setuptexttexts|setuptextrules|setuptextnote|setuptextflow|setuptextbackground|setuptext|setuptaglabeltext|setuptagging|setuptabulation|setuptabulate|setuptables|setupsynonyms|setupsynctex|setupsymbolset|setupsymbols|setupsuffixtext|setupsubpagenumber|setupsubformulas|setupsubformula|setupstyle|setupstruts|setupstretched|setupstartstop|setupspellchecking|setupspacing|setupsorting|setupsidebar|setupshift|setupselector|setupsectionblock|setupscripts|setupscript|setupscale|setups|setupruby|setuprotate|setuprenderingwindow|setupregisters|setupregister|setupreferencing|setupreferencestructureprefix|setupreferenceprefix|setupreferenceformat|setuprealpagenumber|setupquote|setupquotation|setupprograms|setupprofile|setupprocessor|setupprefixtext|setuppositioning|setuppositionbar|setupplacement|setupperiods|setupperiodkerning|setupparallel|setupparagraphs|setupparagraphnumbering|setupparagraphintro|setupparagraph|setuppapersize|setuppaper|setuppalet|setuppairedbox|setuppagetransitions|setuppagestate|setuppageshift|setuppagenumbering|setuppagenumber|setuppageinjectionalternative|setuppageinjection|setuppagecomment|setuppagecolumns|setuppagechecker|setupoutputroutine|setupoppositeplacing|setupoperatortext|setupoffsetbox|setupoffset|setupnotes|setupnote|setupnotations|setupnotation|setupnarrower|setupmodule|setupmixedcolumns|setupmathstyle|setupmathstackers|setupmathradical|setupmathornament|setupmathmatrix|setupmathlabeltext|setupmathframed|setupmathfractions|setupmathfraction|setupmathfence|setupmathematics|setupmathcases|setupmathalignment|setupmarking|setupmarginrules|setupmarginrule|setupmarginframed|setupmargindata|setupmarginblock|setupmakeup|setuplowmidhigh|setuplowhigh|setuplow|setuplocalinterlinespace|setuplocalfloats|setuplistextra|setuplistalternative|setuplist|setuplinewidth|setuplinetable|setuplines|setuplinenumbering|setuplinenote|setuplinefillers|setuplinefiller|setuplegend|setuplayouttext|setuplayout|setuplayeredtext|setuplayer|setuplanguage|setuplabeltext|setuplabel|setupitems|setupitemize|setupitemizations|setupitemgroup|setupitaliccorrection|setupinterlinespace|setupinteractionscreen|setupinteractionmenu|setupinteractionbar|setupinteraction|setupinsertion|setupinitial|setupindex|setupindenting|setupindentedtext|setuphyphenmark|setuphyphenation|setuphighlight|setuphigh|setuphelp|setupheadtext|setupheads|setupheadnumber|setupheadertexts|setupheader|setupheadalternative|setuphead|setupglobalreferenceprefix|setupframedtexts|setupframedtext|setupframedtablerow|setupframedtablecolumn|setupframedtable|setupframedcontent|setupframed|setupformulaframed|setupformulae|setupformula|setupforms|setupfootnotes|setupfootertexts|setupfooter|setupfontsolution|setupfonts|setupfontprotrusion|setupfontexpansion|setupfloatsplitting|setupfloats|setupfloatframed|setupfloat|setupfittingpage|setupfirstline|setupfillinrules|setupfillinlines|setupfiller|setupfieldtotalframed|setupfields|setupfieldlabelframed|setupfieldcontentframed|setupfieldcategory|setupfieldbody|setupfield|setupfacingfloat|setupexternalsoundtracks|setupexternalfigure|setupexport|setupenv|setupenumerations|setupenumeration|setupeffect|setupdocument|setupdirections|setupdescription|setupdelimitedtext|setupdataset|setupcounter|setupcontent|setupcomment|setupcombinedlist|setupcombination|setupcolumnsetstart|setupcolumnsetspan|setupcolumnsetlines|setupcolumnsetareatext|setupcolumnsetarea|setupcolumnset|setupcolumns|setupcolors|setupcolor|setupcollector|setupclipping|setupchemicalframed|setupchemical|setupcharacterspacing|setupcharacterkerning|setupcharacteralign|setupcaptions|setupcaption|setupcapitals|setupbutton|setupbuffer|setupbtxrendering|setupbtxregister|setupbtxlist|setupbtxlabeltext|setupbtxdataset|setupbtx|setupbottomtexts|setupbottom|setupbookmark|setupbodyfont|setupblock|setupbleeding|setupblank|setupblackrules|setupbars|setupbar|setupbackgrounds|setupbackground|setupbackend|setupattachments|setupattachment|setuparranging|setupalternativestyles|setupalign|setupTEXpage|setupTABLE|setupMPvariables|setupMPpage|setupMPinstance|setupMPgraphics|setup|setunreferencedobject|setugvalue|setuevalue|settrialtypesetting|settokenlist|settightunreferencedobject|settightstrut|settightreferencedobject|settightobject|settextcontent|settestcrlf|settaggedmetadata|settabular|setsystemmode|setsuperiors|setstrut|setstructurepageregister|setstackbox|setsmallcaps|setsmallbodyfont|setsimplecolumnshsize|setsectionblock|setsecondpasscharacteralign|setscript|setrigidcolumnhsize|setrigidcolumnbalance|setreplacement|setregisterentry|setreferencedobject|setreference|setrandomseed|setprofile|setpositionstrut|setpositionplus|setpositiononly|setpositiondataplus|setpositiondata|setpositionbox|setposition|setperiodkerning|setpercentdimen|setpenalties|setpagestaterealpageno|setpagestate|setpagereference|setoldstyle|setobject|setnotetext|setnote|setnostrut|setmode|setminus|setmessagetext|setmeasure|setmathstyle|setmarking|setmarker|setmainparbuilder|setmainbodyfont|setlocalscript|setlocalhsize|setlinefiller|setlayertext|setlayerframed|setlayer|setitaliccorrection|setinternalrendering|setinterfacevariable|setinterfacemessage|setinterfaceelement|setinterfaceconstant|setinterfacecommand|setinteraction|setinjector|setinitial|sethyphenationfeatures|sethyphenatedurlnormal|sethyphenatedurlbefore|sethyphenatedurlafter|sethboxregister|setgvariables|setgvariable|setgvalue|setgmeasure|setglobalscript|setfontstrut|setfontsolution|setfontfeature|setfontcolorsheme|setfont|setflag|setfirstpasscharacteralign|setfirstline|setevariables|setevariable|setevalue|setemeasure|setelementexporttag|setdummyparameter|setdocumentfilename|setdocumentargumentdefault|setdocumentargument|setdirection|setdigitsmanipulation|setdefaultpenalties|setdataset|setcurrentfontclass|setcounterown|setcounter|setcolormodell|setcollector|setcharstrut|setcharacterstripping|setcharacterspacing|setcharacterkerning|setcharactercleaning|setcharactercasing|setcharacteraligndetail|setcharacteralign|setcatcodetable|setcapstrut|setbreakpoints|setboxlly|setboxllx|setbigbodyfont|setbar|setautopagestaterealpageno|setMPvariables|setMPvariable|setMPtext|setMPpositiongraphicrange|setMPpositiongraphic|setMPlayer|setJSpreamble|serifnormal|serifbold|serif|serializedcommalist|serializecommalist|selectblocks|select|seeindex|sectionmark|section|secondoftwounexpanded|secondoftwoarguments|secondofthreeunexpanded|secondofthreearguments|secondofsixarguments|secondoffourarguments|secondoffivearguments|searrow|screen|scommaaccent|scircumflex|schwahook|schwa|scedilla|scaron|scale|sbox|savetwopassdata|savetaggedtwopassdata|savenormalmeaning|savecurrentattributes|savecounter|savebuffer|savebtxdataset|savebox|sansserif|sansnormal|sansbold|sans|samplefile|safechar|sacute|rvert|runninghbox|runMPbuffer|ruledvtop|ruledvpack|ruledvbox|ruledtpack|ruledtopv|ruledmbox|ruledhpack|ruledhbox|ruby|rtop|rtlvtop|rtlvbox|rtlhbox|rtimes|rrointerval|rrbracket|rrangle|rparent|rotate|rootradical|romanxii|romanxi|romanx|romanviii|romanvii|romanvi|romanv|romannumerals|romanm|romanl|romanix|romaniv|romaniii|romanii|romani|romand|romanc|romanXII|romanXI|romanX|romanVIII|romanVII|romanVI|romanV|romanM|romanL|romanIX|romanIV|romanIII|romanII|romanI|romanD|romanC|roman|rollbutton|rointerval|robustpretocommalist|robustdoifinsetelse|robustdoifelseinset|robustaddtocommalist|rneq|rmoustache|rlointerval|rlap|risingdotseq|rinvertedbreve|rinterval|ring|rightwhitearrow|rightwavearrow|righttopbox|righttoleftvtop|righttoleftvbox|righttolefthbox|righttoleft|rightthreetimes|rightthreearrows|rightsubguillemot|rightsquigarrow|rightskipadaption|rightrightarrows|rightpageorder|rightorleftpageaction|rightmathlabeltext|rightline|rightleftharpoons|rightleftarrows|rightlabeltext|rightheadtext|righthbox|rightharpoonup|rightharpoondown|rightguillemot|rightdasharrow|rightbox|rightbottombox|rightarrowtriangle|rightarrowtail|rightarrowbar|rightarrow|rightangle|rightaligned|right|rhookswarrow|rhooknearrow|rho|rhbox|rgroup|rfloor|rfence|revivefeature|reversevtop|reversevpack|reversevbox|reversetpack|reversehpack|reversehbox|reversedtripleprime|reversedprime|reverseddoubleprime|reuserandomseed|reuseMPgraphic|reusableMPgraphic|restriction|restoreglobalbodyfont|restoreendofline|restorecurrentattributes|restorecounter|restorecatcodes|restorebox|restartcounter|resolvedglyphstyled|resolvedglyphdirect|reshapebox|resetvisualizers|resetvalue|resetuserpagenumber|resetusedsynonyms|resetusedsortings|resettrialtypesetting|resettrackers|resettokenlist|resettimer|resetsystemmode|resetsymbolset|resetsubpagenumber|resetshownsynonyms|resetsetups|resetscript|resetreplacement|resetreference|resetrecurselevel|resetprofile|resetperiodkerning|resetpenalties|resetpath|resetparallel|resetpagenumber|resetmode|resetmarking|resetmarker|resetlocalfloats|resetlayer|resetitaliccorrection|resetinteractionmenu|resetinjector|resethyphenationfeatures|resetfontsolution|resetfontfallback|resetfontcolorsheme|resetflag|resetfeature|resetdirection|resetdigitsmanipulation|resetcounter|resetcollector|resetcharacterstripping|resetcharacterspacing|resetcharacterkerning|resetcharacteralign|resetbuffer|resetbreakpoints|resetboxesincache|resetbar|resetandaddfeature|resetallattributes|resetMPinstance|resetMPenvironment|resetMPdrawing|rescanwithsetup|rescan|replaceword|replaceincommalist|replacefeature|repeathead|removeunwantedspaces|removetoks|removesubstring|removepunctuation|removemarkedcontent|removelastspace|removelastskip|removefromcommalist|removedepth|removebottomthings|remark|remainingcharacters|relbar|relaxvalueifundefined|relateparameterhandlers|relatemarking|regular|registerunit|registersynonym|registersort|registermenubuttons|registerhyphenationpattern|registerhyphenationexception|registerfontclass|registerexternalfigure|registered|registerctxluafile|registerattachment|referring|referenceprefix|reference|ref|redoconvertfont|recursestring|recurselevel|recursedepth|realsmallcapped|reals|realpagenumber|realSmallcapped|realSmallCapped|readxmlfile|readtexfile|readsysfile|readsetfile|readlocfile|readjobfile|readfixfile|readfile|rdoublegrave|rcommaaccent|rceil|rcaron|rbracket|rbrace|rbox|rawsubcountervalue|rawstructurelistuservariable|rawprocesscommalist|rawprocesscommacommand|rawprocessaction|rawgetparameters|rawdoifinsetelse|rawdoifinset|rawdoifelseinset|rawdate|rawcountervalue|rawcounter|rationals|rangle|randomnumber|randomizetext|raisebox|raggedwidecenter|raggedright|raggedleft|raggedcenter|raggedbottom|racute|rVert|quotesinglebase|quotesingle|quoteright|quoteleft|quotedblright|quotedblleft|quotedblbase|quotedbl|quote|quotation|quittypescriptscanning|quitprevcommalist|quitcommalist|questionedeq|questiondown|quarterstrut|quads|quadrupleprime|quad|qquad|putnextboxincache|putboxincache|pushsystemmode|pushoutputstream|pushmode|pushmacro|pushbutton|pushattribute|purenumber|punctuationspace|psi|pseudosmallcapped|pseudoSmallcapped|pseudoSmallCapped|pseudoMixedCapped|propto|project|program|profilegivenbox|profiledbox|product|prod|processyear|processxtablebuffer|processuntil|processtokens|processtexbuffer|processseparatedlist|processranges|processmonth|processlist|processlinetablefile|processlinetablebuffer|processisolatedwords|processisolatedchars|processfirstactioninset|processfileonce|processfilenone|processfilemany|processfile|processcontent|processcommalistwithparameters|processcommalist|processcommacommand|processcolorcomponents|processbodyfontenvironmentlist|processblocks|processbetween|processassignmentlist|processassignmentcommand|processassignlist|processallactionsinset|processaction|processMPfigurefile|processMPbuffer|procent|primes|prime|prevuserpagenumber|prevuserpage|prevsubpagenumber|prevsubpage|prevsubcountervalue|prevrealpagenumber|prevrealpage|preventmode|prevcountervalue|prevcounter|prettyprintbuffer|pretocommalist|presetunittext|presettaglabeltext|presetsuffixtext|presetprefixtext|presetoperatortext|presetmathlabeltext|presetlabeltext|presetheadtext|presetfieldsymbols|presetdocument|presetbtxlabeltext|prerollblank|prependvalue|prependtoksonce|prependtoks|prependtocommalist|prependgvalue|prependetoks|prefixtext|prefixlanguage|prefixedpagenumber|predefinesymbol|predefinefont|predefinedfont|precsim|precnsim|precneqq|precneq|precnapprox|preceqq|preceq|preccurlyeq|precapprox|prec|postponenotes|positivesign|positionregionoverlay|positionoverlay|position|popsystemmode|popmode|popmacro|popattribute|pm|placetable|placesubformula|placesidebyside|placerenderingwindow|placeregister|placerawlist|placerawheadtext|placerawheadnumber|placerawheaddata|placeparallel|placepairedbox|placepagenumber|placeontopofeachother|placeongrid|placenotes|placenamedformula|placenamedfloat|placement|placelocalnotes|placelocalfootnotes|placelistoftables|placelistofsynonyms|placelistofsorts|placelistofpublications|placelistoflogos|placelistofintermezzi|placelistofgraphics|placelistoffigures|placelistofchemicals|placelistofabbreviations|placelist|placelegend|placelayeredtext|placelayer|placeintermezzo|placeinitial|placeindex|placehelp|placeheadtext|placeheadnumber|placegraphic|placeframed|placeformula|placefootnotes|placefloatwithsetups|placefloat|placefigure|placedbox|placecurrentformulanumber|placecontent|placecomments|placecombinedlist|placecitation|placechemical|placebtxrendering|placebookmarks|placeattachments|pitchfork|pickupgroupedcommand|pi|phook|phi|phantombox|phantom|perthousand|persianthousandsseparator|persiannumerals|persiandecimalseparator|persiandecimals|perp|permitspacesbetweengroups|permitcircumflexescape|permitcaretescape|periods|periodcentered|percentdimen|percent|pdfeTeX|pdfcolor|pdfbackendsetshade|pdfbackendsetpattern|pdfbackendsetpagesattribute|pdfbackendsetpageresource|pdfbackendsetpageattribute|pdfbackendsetname|pdfbackendsetinfo|pdfbackendsetextgstate|pdfbackendsetcolorspace|pdfbackendsetcatalog|pdfbackendcurrentresources|pdfbackendactualtext|pdfactualtext|pdfTeX|partial|part|parallel|paragraphmark|paletsize|pagestaterealpageorder|pagestaterealpage|pagereference|pagenumber|pageinjection|pagefigure|pagebreak|pagearea|page|owns|overstrikes|overstrike|overset|overrightarrow|overparentunderparent|overparent|overloaderror|overleftarrow|overlaywidth|overlayrollbutton|overlayoffset|overlaylinewidth|overlaylinecolor|overlayimage|overlayheight|overlayfigure|overlaydepth|overlaycolor|overlaybutton|overbracketunderbracket|overbracket|overbraceunderbrace|overbrace|overbarunderbar|overbars|overbar|over|outputstreamunvcopy|outputstreamunvbox|outputstreamcopy|outputstreambox|outputfilename|otimes|otildemacron|otilde|ostrokeacute|ostroke|oslash|ornamenttext|ordmasculine|ordinalstr|ordinaldaynumber|ordfeminine|oplus|operatortext|operatorlanguage|oogonekmacron|oogonek|onethird|onesuperior|onesixth|onequarter|onehalf|onefifth|oneeighth|onedigitrounding|ominus|omicron|omega|omacron|oinvertedbreve|ointctrclockwise|ointclockwise|oint|oiint|oiiint|ohungarumlaut|ohorntilde|ohornhook|ohorngrave|ohorndotbelow|ohornacute|ohorn|ohook|ohm|ograve|offsetbox|offset|oeligature|odoublegrave|odotbelow|odotaccentmacron|odotaccent|odot|odiaeresismacron|odiaeresis|ocircumflextilde|ocircumflexhook|ocircumflexgrave|ocircumflexdotbelow|ocircumflexacute|ocircumflex|ocaron|obreve|obox|objectwidth|objectmargin|objectheight|objectdepth|obeydepth|oacute|nwsearrow|nwarrow|nvrightarrow|nvleftrightarrow|nvleftarrow|nvdash|nvDash|numbers|numberofpoints|nu|ntrianglerighteq|ntriangleright|ntrianglelefteq|ntriangleleft|ntimes|ntilde|nsupseteq|nsupset|nsucccurlyeq|nsucc|nsubseteq|nsubset|nsqsupseteq|nsqsubseteq|nsimeq|nsim|nrightarrow|npreccurlyeq|nprec|nparallel|nowns|notragged|notopandbottomlines|notin|notesymbol|note|not|nospace|normaltypeface|normalslantedface|normalizetextwidth|normalizetextline|normalizetextheight|normalizetextdepth|normalizefontwidth|normalizefontline|normalizefontheight|normalizefontdepth|normalizedfontsize|normalizebodyfontsize|normalitalicface|normalframedwithsettings|normalboldface|normal|nonmathematics|nonfrenchspacing|noitem|noindentation|noheightstrut|noheaderandfooterlines|noflocalfloats|noflines|noffigurepages|nodetostring|nocite|nocitation|nocharacteralign|nocap|nobreakspace|nobar|nni|nmid|nlesssim|nlessgtr|nless|nleq|nleftrightarrow|nleftarrow|njligature|nin|nihongo|ni|ngtrsim|ngtrless|ngtr|ngrave|ngeq|nextuserpagenumber|nextuserpage|nextsubpagenumber|nextsubpage|nextsubcountervalue|nextrealpagenumber|nextrealpage|nextparagraphs|nextdepth|nextcountervalue|nextcounter|nextboxwd|nextboxhtdp|nextboxht|nextboxdp|nextbox|nexists|newsystemmode|newsignal|newmode|newfrenchspacing|newevery|newcounter|newcatcodetable|newattribute|neswarrow|nequiv|neq|neng|negthinspace|negenspace|negemspace|negativesign|negated|negatecolorbox|neg|nearrow|ne|ndivides|ncurl|ncong|ncommaaccent|ncaron|naturalwd|naturalvtop|naturalvpack|naturalvcenter|naturalvbox|naturaltpack|naturalnumbers|naturalhpack|naturalhbox|natural|nasymp|narrownobreakspace|napproxEq|napprox|napostrophe|namedtaggedlabeltexts|namedstructurevariable|namedstructureuservariable|namedstructureheadlocation|namedheadnumber|nacute|nabla|nVrightarrow|nVleftrightarrow|nVleftarrow|nVdash|nVDash|nRightarrow|nLeftrightarrow|nLeftarrow|nHuparrow|nHdownarrow|multimap|mu|mtwoheadrightarrow|mtwoheadleftarrow|mtriplerel|mtext|mrightoverleftarrow|mrightleftharpoons|mrightharpoonup|mrightharpoondown|mrightarrow|mrel|mprandomnumber|mp|monthshort|monthlong|month|mononormal|monobold|mono|molecule|moduleparameter|models|mmapsto|mleftrightharpoons|mleftrightarrow|mleftharpoonup|mleftharpoondown|mleftarrow|mkvibuffer|mixedcaps|mirror|minuscolon|minus|minimalhbox|midsubsentence|midhbox|middlebox|middlealigned|middle|midaligned|mid|mhookrightarrow|mhookleftarrow|mho|mhbox|mfunctionlabeltext|mfunction|mframed|mfence|message|mequal|menubutton|medspace|medskip|measuredeq|measuredangle|measured|measure|mcframed|mbox|maxaligned|mathwordtf|mathwordsl|mathwordit|mathwordbs|mathwordbi|mathwordbf|mathword|mathupright|mathunder|mathtt|mathtriplet|mathtf|mathtexttf|mathtextsl|mathtextit|mathtextbs|mathtextbi|mathtextbf|mathtext|mathss|mathsl|mathscript|mathrm|mathpercent|mathover|mathop|mathlabeltexts|mathlabeltext|mathlabellanguage|mathitalic|mathit|mathhyphen|mathhash|mathfunction|mathfraktur|mathematics|mathdouble|mathdollar|mathdefault|mathbs|mathblackboard|mathbi|mathbf|mathampersand|math|mat|markpage|markinjector|marking|markedpages|markcontent|margintext|margindata|mapsup|mapsto|mapsfrom|mapsdown|mapfontsize|maltese|makestrutofbox|makerawcommalist|makecharacteractive|mainlanguage|mRightarrow|mLeftrightarrow|mLeftarrow|m|lvert|luaversion|luasetup|luaparameterset|luaminorversion|luametaTeX|luamajorversion|luajitTeX|luafunction|luaexpr|luaexpanded|luaenvironment|luaconditional|luacode|luaTeX|ltrvtop|ltrvbox|ltrhbox|ltop|ltimes|lt|lstroke|lrtbbox|lrointerval|lrcorner|lparent|lozenge|lowerrightsingleninequote|lowerrightdoubleninequote|lowerleftsingleninequote|lowerleftdoubleninequote|lowercasestring|lowercased|lowerbox|low|lor|looparrowright|looparrowleft|longrightsquigarrow|longrightarrow|longmapsto|longmapsfrom|longleftrightarrow|longleftarrow|lomihi|lointerval|lohi|logo|locfilename|locatefilepath|locatedfilepath|localundefine|localpushmacro|localpushbox|localpopmacro|localpopbox|localhsize|localframedwithsettings|localframed|loadtypescriptfile|loadtexfileonce|loadtexfile|loadspellchecklist|loadluafileonce|loadluafile|loadfontgoodies|loadcldfileonce|loadcldfile|loadbtxreplacementfile|loadbtxdefinitionfile|loadanyfileonce|loadanyfile|lnsim|lnot|lneqq|lneq|lnapprox|lmoustache|llless|lll|llcorner|llbracket|llap|llangle|ll|ljligature|listnamespaces|listlength|listcite|listcitation|linterval|linethickness|linespanningtext|linenote|linefeed|linebox|line|limitatetext|limitatelines|limitatefirstline|lhooksearrow|lhooknwarrow|lhbox|lgroup|lfloor|lfence|letvaluerelax|letvalueempty|letvalue|letterunderscore|lettertilde|letterspacing|letterslash|lettersinglequote|letterrightparenthesis|letterrightbracket|letterrightbrace|letterquestionmark|letterpercent|letteropenbrace|lettermore|letterless|letterleftparenthesis|letterleftbracket|letterleftbrace|letterhat|letterhash|letterexclamationmark|letterescape|letteregroup|letterdoublequote|letterdollar|lettercolon|letterclosebrace|letterbgroup|letterbar|letterbackslash|letterat|letterampersand|letgvalurelax|letgvalueempty|letgvalue|letempty|letdummyparameter|letcsnamecsname|letcsnamecs|letcscsname|letcatcodecommand|letbeundefined|lesssim|lessgtr|lesseqqgtr|lesseqgtr|lessdot|lessapprox|leqslant|leqq|leq|leftwhitearrow|leftwavearrow|lefttorightvtop|lefttorightvbox|lefttorighthbox|lefttoright|lefttopbox|leftthreetimes|leftsubguillemot|leftsquigarrow|leftskipadaption|leftrightsquigarrow|leftrightharpoons|leftrightarrowtriangle|leftrightarrows|leftrightarrow|leftorrightvtop|leftorrightvbox|leftorrighthbox|leftmathlabeltext|leftline|leftleftarrows|leftlabeltext|leftheadtext|lefthbox|leftharpoonup|leftharpoondown|leftguillemot|leftdasharrow|leftbox|leftbottombox|leftarrowtriangle|leftarrowtail|leftarrow|leftaligned|left|leadsto|le|ldots|ldotp|ldotmiddle|lcurl|lcommaaccent|lceil|lcaron|lbracket|lbrace|lbox|lbar|lazysavetwopassdata|lazysavetaggedtwopassdata|layerwidth|layerheight|layeredtext|latin|lateluacode|lastuserpagenumber|lastuserpage|lasttwodigits|lastsubpagenumber|lastsubpage|lastsubcountervalue|lastrealpagenumber|lastrealpage|lastpredefinedsymbol|lastnaturalboxwd|lastnaturalboxht|lastnaturalboxdp|lastlinewidth|lastdigit|lastcountervalue|lastcounter|languagecharwidth|languagecharacters|languageCharacters|language|langle|land|lambdabar|lambda|lacute|labeltexts|labeltext|labellanguage|lVert|koreanparentnumerals|koreannumeralsp|koreannumeralsc|koreannumerals|koreancirclenumerals|kkra|khook|kerncharacters|keepunwantedspaces|keeplinestogether|keepblocks|kcommaaccent|kcaron|kappa|kap|jobfilesuffix|jobfilename|jmath|jcircumflex|jcaron|itilde|itemtag|items|item|italicface|italiccorrection|italicbold|italic|iota|iogonek|invokepageheandler|invisibletimes|intop|intertext|intercal|interactionmenu|interactionbuttons|interactionbar|integers|integerrounding|intclockwise|int|installversioninfo|installunitsspace|installunitsseparator|installtopframerenderer|installtextracker|installtexdirective|installswitchsetuphandler|installswitchcommandhandler|installstyleandcolorhandler|installsimpleframedcommandhandler|installsimplecommandhandler|installshipoutmethod|installsetuponlycommandhandler|installsetuphandler|installrootparameterhandler|installrightframerenderer|installparentinjector|installparametersethandler|installparameterhashhandler|installparameterhandler|installpagearrangement|installoutputroutine|installnamespace|installmacrostack|installleftframerenderer|installlanguage|installglobalmacrostack|installframedcommandhandler|installframedautocommandhandler|installdirectstyleandcolorhandler|installdirectsetuphandler|installdirectparametersethandler|installdirectparameterhandler|installdirectcommandhandler|installdefinitionsetmember|installdefinitionset|installdefinehandler|installcorenamespace|installcommandhandler|installbottomframerenderer|installbasicparameterhandler|installbasicautosetuphandler|installautosetuphandler|installautocommandhandler|installattributestack|installanddefineactivecharacter|installactivecharacter|installactionhandler|insertpages|inrightmargin|inrightedge|inright|inputgivenfile|inputfilesuffix|inputfilerealsuffix|inputfilename|inputfilebarename|input|inoutermargin|inouteredge|inouter|inother|innerflushshapebox|inmframed|inmargin|inlinerange|inlineprettyprintbuffer|inlineordisplaymath|inlinemessage|inlinemathematics|inlinemath|inlinedbox|inlinebuffer|inline|inleftmargin|inleftedge|inleft|initializeboxstack|ininnermargin|ininneredge|ininner|inhibitblank|inheritparameter|infull|infty|inframed|infofontbold|infofont|index|indentation|incrementvalue|incrementsubpagenumber|incrementpagenumber|incrementedcounter|incrementcounter|increment|includeversioninfo|includemenu|in|imply|implies|impliedby|immediatesavetwopassdata|imath|imaginaryj|imaginaryi|imacron|ijligature|iinvertedbreve|iintop|iint|iiintop|iiint|iiiintop|iiiint|ihook|igrave|ignorevalue|ignoretagsinexport|ignoreimplicitspaces|iftrialtypesetting|ifparameters|ifinoutputstream|ifinobject|iff|ifassignment|idoublegrave|idotbelow|idotaccent|idiaeresis|ideographicspace|ideographichalffillspace|icircumflex|icaron|ibreve|ibox|iacute|hyphenatedword|hyphenatedurl|hyphenatedpar|hyphenatedhbox|hyphenatedfilename|hyphenatedfile|hyphenatedcoloredword|hyphen|htofstring|htdpofstring|hstroke|hspace|hsmashed|hsmashbox|hsmash|hslash|hsizefraction|hpos|hphantom|hpackedbox|hpackbox|horizontalpositionbar|horizontalgrowingbar|hookrightarrow|hookleftarrow|hl|himilo|hilo|highordinalstr|highlight|high|hideblocks|hiddencite|hiddencitation|hiddenbar|hglue|helptext|heightspanningtext|heightofstring|heightanddepthofstring|hebrewZayin|hebrewYod|hebrewVav|hebrewTsadifinal|hebrewTsadi|hebrewTet|hebrewTav|hebrewShin|hebrewSamekh|hebrewResh|hebrewQof|hebrewPefinal|hebrewPe|hebrewNunfinal|hebrewNun|hebrewMemfinal|hebrewMem|hebrewLamed|hebrewKaffinal|hebrewKaf|hebrewHet|hebrewHe|hebrewGimel|hebrewDalet|hebrewBet|hebrewAyin|hebrewAlef|heartsuit|headwidth|headvbox|headtextwidth|headtexts|headtextdistance|headtextcontent|headtext|headsetupspacing|headreferenceattributes|headnumberwidth|headnumberdistance|headnumbercontent|headnumber|headlanguage|headhbox|hdofstring|hcircumflex|hcaron|hboxreference|hboxofvbox|hbar|hat|hash|hanzi|hangul|handwritten|handletokens|halfwaybox|halfstrut|halflinestrut|hairspace|hairline|gurmurkhinumerals|gujaratinumerals|guilsingleright|guilsingleleft|gtrsim|gtrless|gtreqqless|gtreqless|gtrdot|gtrapprox|gt|gstroke|gsetboxlly|gsetboxllx|groupedcommand|grid|greekzeta|greekxi|greekvaria|greekupsilonvrachy|greekupsilonvaria|greekupsilontonos|greekupsilonpsilivaria|greekupsilonpsilitonos|greekupsilonpsiliperispomeni|greekupsilonpsili|greekupsilonperispomeni|greekupsilonoxia|greekupsilonmacron|greekupsilondialytikavaria|greekupsilondialytikatonos|greekupsilondialytikaperispomeni|greekupsilondiaeresis|greekupsilondasiavaria|greekupsilondasiatonos|greekupsilondasiaperispomeni|greekupsilondasia|greekupsilon|greektonos|greekthetaalt|greektheta|greektau|greekstigma|greeksigmalunate|greeksigma|greeksampi|greekrhopsili|greekrhodasia|greekrhoalt|greekrho|greekpsilivaria|greekpsilitonos|greekpsiliperispomeni|greekpsili|greekpsi|greekprosgegrammeni|greekpialt|greekpi|greekphialt|greekphi|greekperispomeni|greekoxia|greekomicronvaria|greekomicrontonos|greekomicronpsilivaria|greekomicronpsilitonos|greekomicronpsili|greekomicronoxia|greekomicrondasiavaria|greekomicrondasiatonos|greekomicrondasia|greekomicron|greekomegavaria|greekomegatonos|greekomegapsilivaria|greekomegapsilitonos|greekomegapsiliperispomeni|greekomegapsili|greekomegaperispomeni|greekomegaoxia|greekomegaiotasubvaria|greekomegaiotasubtonos|greekomegaiotasubpsilivaria|greekomegaiotasubpsilitonos|greekomegaiotasubpsiliperispomeni|greekomegaiotasubpsili|greekomegaiotasubperispomeni|greekomegaiotasubdasiavaria|greekomegaiotasubdasiatonos|greekomegaiotasubdasiaperispomeni|greekomegaiotasubdasia|greekomegaiotasub|greekomegadasiavaria|greekomegadasiatonos|greekomegadasiaperispomeni|greekomegadasia|greekomega|greeknumkoppa|greeknumerals|greeknu|greekmu|greeklambda|greekkoppa|greekkappa|greekiotavrachy|greekiotavaria|greekiotatonos|greekiotapsilivaria|greekiotapsilitonos|greekiotapsiliperispomeni|greekiotapsili|greekiotaperispomeni|greekiotaoxia|greekiotamacron|greekiotadialytikavaria|greekiotadialytikatonos|greekiotadialytikaperispomeni|greekiotadialytika|greekiotadasiavaria|greekiotadasiatonos|greekiotadasiaperispomeni|greekiotadasia|greekiota|greekgamma|greekfinalsigma|greeketavaria|greeketatonos|greeketapsilivaria|greeketapsilitonos|greeketapsiliperispomeni|greeketapsili|greeketaperispomeni|greeketaoxia|greeketaiotasubvaria|greeketaiotasubtonos|greeketaiotasubpsilivaria|greeketaiotasubpsilitonos|greeketaiotasubpsiliperispomeni|greeketaiotasubpsili|greeketaiotasubperispomeni|greeketaiotasubdasiavaria|greeketaiotasubdasiatonos|greeketaiotasubdasiaperispomeni|greeketaiotasubdasia|greeketaiotasub|greeketadasiavaria|greeketadasiatonos|greeketadasiaperispomeni|greeketadasia|greeketa|greekepsilonvaria|greekepsilontonos|greekepsilonpsilivaria|greekepsilonpsilitonos|greekepsilonpsili|greekepsilonoxia|greekepsilondasiavaria|greekepsilondasiatonos|greekepsilondasia|greekepsilonalt|greekepsilon|greekdigamma|greekdialytikavaria|greekdialytikatonos|greekdialytikaperispomeni|greekdelta|greekdasiavaria|greekdasiatonos|greekdasiaperispomeni|greekdasia|greekchi|greekbetaalt|greekbeta|greekalphavrachy|greekalphavaria|greekalphatonos|greekalphapsilivaria|greekalphapsilitonos|greekalphapsiliperispomeni|greekalphapsili|greekalphaperispomeni|greekalphaoxia|greekalphamacron|greekalphaiotasubvaria|greekalphaiotasubtonos|greekalphaiotasubpsilivaria|greekalphaiotasubpsilitonos|greekalphaiotasubpsiliperispomeni|greekalphaiotasubpsili|greekalphaiotasubperispomeni|greekalphaiotasubdasiavaria|greekalphaiotasubdasiatonos|greekalphaiotasubdasiaperispomeni|greekalphaiotasubdasia|greekalphaiotasub|greekalphadasiavaria|greekalphadasiatonos|greekalphadasiaperispomeni|greekalphadasia|greekalpha|greekZeta|greekXi|greekUpsilonvrachy|greekUpsilonvaria|greekUpsilontonos|greekUpsilonmacron|greekUpsilondialytika|greekUpsilondasiavaria|greekUpsilondasiatonos|greekUpsilondasiaperispomeni|greekUpsilondasia|greekUpsilon|greekTheta|greekTau|greekSigmalunate|greekSigma|greekRhodasia|greekRho|greekPsi|greekPi|greekPhi|greekOmicronvaria|greekOmicrontonos|greekOmicronpsilivaria|greekOmicronpsilitonos|greekOmicronpsili|greekOmicrondasiavaria|greekOmicrondasiatonos|greekOmicrondasia|greekOmicron|greekOmegavaria|greekOmegatonos|greekOmegapsilivaria|greekOmegapsilitonos|greekOmegapsiliperispomeni|greekOmegapsili|greekOmegaiotasubpsilivaria|greekOmegaiotasubpsilitonos|greekOmegaiotasubpsiliperispomeni|greekOmegaiotasubpsili|greekOmegaiotasubdasiavaria|greekOmegaiotasubdasiatonos|greekOmegaiotasubdasiaperispomeni|greekOmegaiotasubdasia|greekOmegaiotasub|greekOmegadasiavaria|greekOmegadasiatonos|greekOmegadasiaperispomeni|greekOmegadasia|greekOmega|greekNu|greekMu|greekLambda|greekKappa|greekIotavrachy|greekIotavaria|greekIotatonos|greekIotapsilivaria|greekIotapsilitonos|greekIotapsiliperispomeni|greekIotapsili|greekIotamacron|greekIotadialytika|greekIotadasiavaria|greekIotadasiatonos|greekIotadasiaperispomeni|greekIotadasia|greekIota|greekGamma|greekEtavaria|greekEtatonos|greekEtapsilivaria|greekEtapsilitonos|greekEtapsiliperispomeni|greekEtapsili|greekEtaiotasubpsilivaria|greekEtaiotasubpsilitonos|greekEtaiotasubpsiliperispomeni|greekEtaiotasubpsili|greekEtaiotasubdasiavaria|greekEtaiotasubdasiatonos|greekEtaiotasubdasiaperispomeni|greekEtaiotasubdasia|greekEtaiotasub|greekEtadasiavaria|greekEtadasiatonos|greekEtadasiaperispomeni|greekEtadasia|greekEta|greekEpsilonvaria|greekEpsilontonos|greekEpsilonpsilivaria|greekEpsilonpsilitonos|greekEpsilonpsili|greekEpsilondasiavaria|greekEpsilondasiatonos|greekEpsilondasia|greekEpsilon|greekDelta|greekCoronis|greekChi|greekBeta|greekAlphavrachy|greekAlphavaria|greekAlphatonos|greekAlphapsilivaria|greekAlphapsilitonos|greekAlphapsiliperispomeni|greekAlphapsili|greekAlphamacron|greekAlphaiotasubpsilivaria|greekAlphaiotasubpsilitonos|greekAlphaiotasubpsiliperispomeni|greekAlphaiotasubpsili|greekAlphaiotasubdasiavaria|greekAlphaiotasubdasiatonos|greekAlphaiotasubdasiaperispomeni|greekAlphaiotasubdasia|greekAlphaiotasub|greekAlphadasiavaria|greekAlphadasiatonos|greekAlphadasiaperispomeni|greekAlphadasia|greekAlpha|greedysplitstring|grayvalue|graycolor|grave|grabuntil|grabbufferdatadirect|grabbufferdata|gotopage|gotobox|goto|godown|gobbleuntilrelax|gobbleuntil|gobbletwooptionals|gobbletwoarguments|gobblethreeoptionals|gobblethreearguments|gobbletenarguments|gobblespacetokens|gobblesixarguments|gobblesingleempty|gobblesevenarguments|gobbleoneoptional|gobbleoneargument|gobbleninearguments|gobblefouroptionals|gobblefourarguments|gobblefiveoptionals|gobblefivearguments|gobbleeightarguments|gobbledoubleempty|gnsim|gneqq|gnapprox|glyphfontfile|globalundefine|globalswapmacros|globalswapdimens|globalswapcounts|globalpushmacro|globalpushbox|globalprocesscommalist|globalpreventmode|globalpopmacro|globalpopbox|globalletempty|globalenablemode|globaldisablemode|gimel|gggtr|ggg|gg|getxparameters|getvariabledefault|getvariable|getvalue|getuvalue|getuserdata|gettwopassdatalist|gettwopassdata|gettokenlist|getsubstring|gets|getroundednoflines|getreferenceentry|getreference|getrawxparameters|getrawparameters|getrawnoflines|getrawgparameters|getraweparameters|getrandomseed|getrandomnumber|getrandomfloat|getrandomdimen|getrandomcount|getprivateslot|getprivatechar|getparameters|getpaletsize|getobjectdimensions|getobject|getnoflines|getnaturaldimensions|getnamedtwopassdatalist|getnamedglyphstyled|getnamedglyphdirect|getmessage|getmarking|getlocalfloats|getlocalfloat|getlasttwopassdata|getinlineuserdata|getgparameters|getglyphstyled|getglyphdirect|getfromtwopassdata|getfromcommalist|getfromcommacommand|getfirsttwopassdata|getfirstcharacter|getfiguredimensions|getexpandedparameters|geteparameters|getemptyparameters|getdummyparameters|getdocumentfilename|getdocumentargumentdefault|getdocumentargument|getdefinedbuffer|getdayspermonth|getdayoftheweek|getcommalistsize|getcommacommandsize|getbufferdata|getbuffer|getboxlly|getboxllx|getboxfromcache|getMPlayer|getMPdrawing|geqslant|geqq|geq|ge|gdotaccent|gdefconvertedcommand|gdefconvertedargument|gcommaaccent|gcircumflex|gcaron|gbreve|gamma|gacute|frule|frozenhbox|frown|fromlinenote|from|frenchspacing|freezemeasure|freezedimenmacro|framedtext|framedparameter|frameddimension|framed|frac|fourthofsixarguments|fourthoffourarguments|fourthoffivearguments|fourperemspace|fourfifths|foundbox|formulanumber|formula|forgetragged|forgetparskip|forgetparameters|forgeteverypar|forcelocalfloats|forcecharacterstripping|forall|footnotetext|footnote|fontstyle|fontsize|fontfeaturelist|fontface|fontclassname|fontclass|fontcharbyindex|fontchar|fontbody|fontalternative|flushtoks|flushtokens|flushtextflow|flushshapebox|flushoutputstream|flushnotes|flushnextbox|flushlocalfloats|flushlayer|flushedrightlastline|flushcollector|flushboxregister|flushbox|floatuserdataparameter|flligature|flat|flag|fixedspaces|fixedspace|fivesixths|fiveeighths|fittopbaselinegrid|fitfieldframed|fitfield|firstuserpagenumber|firstuserpage|firstsubpagenumber|firstsubpage|firstsubcountervalue|firstrealpagenumber|firstrealpage|firstoftwounexpanded|firstoftwoarguments|firstofthreeunexpanded|firstofthreearguments|firstofsixarguments|firstofoneunexpanded|firstofoneargument|firstoffourarguments|firstoffivearguments|firstinlist|firstcountervalue|firstcounter|firstcharacter|finishregisterentry|findtwopassdata|filterreference|filterpages|filterfromvalue|filterfromnext|fillupto|fillintext|fillinrules|fillinline|filler|filledhboxy|filledhboxr|filledhboxm|filledhboxk|filledhboxg|filledhboxc|filledhboxb|filigature|filename|figurewidth|figuresymbol|figurespace|figurenaturalwidth|figurenaturalheight|figureheight|figurefullname|figurefiletype|figurefilepath|figurefilename|fifthofsixarguments|fifthoffivearguments|fieldstack|fieldbody|field|fhook|fflligature|ffligature|ffiligature|fetchtwomarks|fetchtwomarkings|fetchruntinecommand|fetchonemarking|fetchonemark|fetchmarking|fetchmark|fetchallmarks|fetchallmarkings|fenced|fence|feature|fastsxsy|fastswitchtobodyfont|fastsetupwithargumentswapped|fastsetupwithargument|fastsetup|fastscale|fastloopindex|fastloopfinal|fastlocalframed|fastincrement|fastdecrement|fallingdotseq|fakebox|externalfigurecollectionparameter|externalfigurecollectionminwidth|externalfigurecollectionminheight|externalfigurecollectionmaxwidth|externalfigurecollectionmaxheight|externalfigure|exponentiale|expdoifnot|expdoifinsetelse|expdoifelseinset|expdoifelsecommon|expdoifelse|expdoifcommonelse|expdoif|expandfontsynonym|expandeddoifnot|expandeddoifelse|expandeddoif|expanded|expandcheckedcsname|exitloopnow|exitloop|exists|executeifdefined|exclamdown|eunderparentfill|eunderbracketfill|eunderbracefill|eunderbarfill|etwoheadrightarrowfill|etilde|ethiopic|eth|eta|erightharpoonupfill|erightharpoondownfill|erightarrowfill|equiv|equalscolon|equaldigits|eqslantless|eqslantgtr|eqsim|eqless|eqgtr|eqeqeq|eqeq|eqcirc|eq|epsilon|epos|eoverparentfill|eoverbracketfill|eoverbracefill|eoverbarfill|eogonek|envvar|environment|env|enspace|enskip|enquad|endnote|endash|enabletrackers|enableregime|enableparpositions|enableoutputstream|enablemode|enableexperiments|enabledirectives|emspace|emquad|emptyset|emptylines|emphasistypeface|emphasisboldface|emdash|emacron|em|ell|eleftrightarrowfill|eleftharpoonupfill|eleftharpoondownfill|eleftarrowfill|elapsedtime|elapsedseconds|einvertedbreve|ehook|egrave|effect|efcparameter|efcminwidth|efcminheight|efcmaxwidth|efcmaxheight|edoublegrave|edotbelow|edotaccent|ediaeresis|edefconvertedargument|ecircumflextilde|ecircumflexhook|ecircumflexgrave|ecircumflexdotbelow|ecircumflexacute|ecircumflex|ecedilla|ecaron|ebreve|eacute|eTeX|dzligature|dzcaronligature|dummyparameter|dummydigit|dtail|dstroke|dpofstring|downzigzagarrow|downwhitearrow|downuparrows|downharpoonright|downharpoonleft|downdownarrows|downdasharrow|downarrow|dowithwargument|dowithrange|dowithpargument|dowithnextboxcs|dowithnextboxcontentcs|dowithnextboxcontent|dowithnextbox|dowith|doubleverticalbar|doubleprime|doubleparent|doublecup|doublecap|doublebracket|doublebrace|doublebond|doublebar|dottedrightarrow|dottedcircle|dots|dotriplegroupempty|dotripleemptywithset|dotripleempty|dotripleargumentwithset|dotripleargument|dotplus|dotoks|dotminus|dotlessjstroke|dotlessj|dotlessi|dotlessJ|dotlessI|dotfskip|doteqdot|doteq|dot|dosubtractfeature|dostepwiserecurse|dosixtupleempty|dosixtupleargument|dosinglegroupempty|dosingleempty|dosingleargument|doseventupleempty|doseventupleargument|dosetupcheckedinterlinespace|dosetrightskipadaption|dosetleftskipadaption|dosetattribute|dorotatebox|doresetattribute|doresetandafffeature|doreplacefeature|dorepeatwithcommand|dorecurse|dorechecknextindentation|doquintuplegroupempty|doquintupleempty|doquintupleargument|doquadruplegroupempty|doquadrupleempty|doquadrupleargument|doprocesslocalsetups|dopositionaction|dontpermitspacesbetweengroups|dontleavehmode|dontconvertfont|donothing|doloopoverlist|doloop|dollar|doindentation|doifvariableelse|doifvariable|doifvaluesomething|doifvaluenothingelse|doifvaluenothing|doifvalueelse|doifvalue|doifurldefinedelse|doifunknownfontfeature|doifundefinedelse|doifundefinedcounter|doifundefined|doiftypingfileelse|doiftopofpageelse|doiftextflowelse|doiftextflowcollectorelse|doiftextelse|doiftext|doifsymbolsetelse|doifsymboldefinedelse|doifstructurelisthaspageelse|doifstructurelisthasnumberelse|doifstringinstringelse|doifsometokselse|doifsometoks|doifsomethingelse|doifsomething|doifsomespaceelse|doifsomebackgroundelse|doifsomebackground|doifsetupselse|doifsetups|doifsamestringelse|doifsamestring|doifsamelinereferenceelse|doifrighttoleftinboxelse|doifrightpagefloatelse|doifreferencefoundelse|doifpositionsusedelse|doifpositionsonthispageelse|doifpositionsonsamepageelse|doifpositiononpageelse|doifpositionelse|doifpositionactionelse|doifpositionaction|doifposition|doifpatternselse|doifpathexistselse|doifpathelse|doifparentfileelse|doifparallelelse|doifoverlayelse|doifoverlappingelse|doifolderversionelse|doifoldercontextelse|doifoddpagefloatelse|doifoddpageelse|doifobjectreferencefoundelse|doifobjectfoundelse|doifnumberelse|doifnumber|doifnotvariable|doifnotvalue|doifnotsetups|doifnotsamestring|doifnotnumber|doifnotmode|doifnotinstring|doifnotinsidesplitfloat|doifnotinset|doifnothingelse|doifnothing|doifnotflagged|doifnotfile|doifnotescollected|doifnoteonsamepageelse|doifnotenv|doifnotemptyvariable|doifnotemptyvalue|doifnotempty|doifnotdocumentvariable|doifnotdocumentfilename|doifnotdocumentargument|doifnotcounter|doifnotcommon|doifnotcommandhandler|doifnotallmodes|doifnotallcommon|doifnot|doifnonzeropositiveelse|doifnextparenthesiselse|doifnextoptionalelse|doifnextoptionalcselse|doifnextcharelse|doifnextbgroupelse|doifnextbgroupcselse|doifmodeelse|doifmode|doifmessageelse|doifmeaningelse|doifmarkingelse|doifmainfloatbodyelse|doiflocfileelse|doiflocationelse|doiflistelse|doifleapyearelse|doiflayouttextlineelse|doiflayoutsomelineelse|doiflayoutdefinedelse|doiflayerdataelse|doiflanguageelse|doifitalicelse|doifintwopassdataelse|doifintokselse|doifinsymbolsetelse|doifinsymbolset|doifinstringelse|doifinstring|doifinsetelse|doifinset|doifinsertionelse|doifinputfileelse|doifinelementelse|doifincsnameelse|doifhelpelse|doifhasspaceelse|doiffontsynonymelse|doiffontpresentelse|doiffontfeatureelse|doiffontcharelse|doifflaggedelse|doiffirstcharelse|doiffileexistselse|doiffileelse|doiffiledefinedelse|doiffile|doiffigureelse|doiffieldcategoryelse|doiffieldbodyelse|doiffastoptionalcheckelse|doiffastoptionalcheckcselse|doifenvelse|doifenv|doifemptyvariableelse|doifemptyvariable|doifemptyvalueelse|doifemptyvalue|doifemptytoks|doifemptyelse|doifempty|doifelsevariable|doifelsevaluenothing|doifelsevalue|doifelseurldefined|doifelseundefined|doifelsetypingfile|doifelsetopofpage|doifelsetextflowcollector|doifelsetextflow|doifelsetext|doifelsesymbolset|doifelsesymboldefined|doifelsestructurelisthaspage|doifelsestructurelisthasnumber|doifelsestringinstring|doifelsesometoks|doifelsesomething|doifelsesomespace|doifelsesomebackground|doifelsesetups|doifelsesamestring|doifelsesamelinereference|doifelserighttoleftinbox|doifelserightpagefloat|doifelserightpage|doifelsereferencefound|doifelsepositionsused|doifelsepositionsonthispage|doifelsepositionsonsamepage|doifelsepositiononpage|doifelsepositionaction|doifelseposition|doifelsepatterns|doifelsepathexists|doifelsepath|doifelseparentfile|doifelseparallel|doifelseoverlay|doifelseoverlapping|doifelseolderversion|doifelseoldercontext|doifelseoddpagefloat|doifelseoddpage|doifelseobjectreferencefound|doifelseobjectfound|doifelsenumber|doifelsenothing|doifelsenoteonsamepage|doifelsenonzeropositive|doifelsenextparenthesis|doifelsenextoptionalcs|doifelsenextoptional|doifelsenextchar|doifelsenextbgroupcs|doifelsenextbgroup|doifelsemode|doifelsemessage|doifelsemeaning|doifelsemarking|doifelsemarkedpage|doifelsemainfloatbody|doifelselocfile|doifelselocation|doifelselist|doifelseleapyear|doifelselayouttextline|doifelselayoutsomeline|doifelselayoutdefined|doifelselayerdata|doifelselanguage|doifelseitalic|doifelseintwopassdata|doifelseintoks|doifelseinsymbolset|doifelseinstring|doifelseinset|doifelseinsertion|doifelseinputfile|doifelseinelement|doifelseincsname|doifelsehelp|doifelsehasspace|doifelseframed|doifelsefontsynonym|doifelsefontpresent|doifelsefontfeature|doifelsefontchar|doifelseflagged|doifelsefirstchar|doifelsefileexists|doifelsefiledefined|doifelsefile|doifelsefigure|doifelsefieldcategory|doifelsefieldbody|doifelsefastoptionalcheckcs|doifelsefastoptionalcheck|doifelseenv|doifelseemptyvariable|doifelseemptyvalue|doifelseempty|doifelsedrawingblack|doifelsedocumentvariable|doifelsedocumentfilename|doifelsedocumentargument|doifelsedimenstring|doifelsedimension|doifelsedefinedcounter|doifelsedefined|doifelsecurrentsynonymused|doifelsecurrentsynonymshown|doifelsecurrentsortingused|doifelsecurrentfonthasfeature|doifelsecounter|doifelseconversionnumber|doifelseconversiondefined|doifelsecommon|doifelsecommandhandler|doifelsecolor|doifelsebuffer|doifelseboxincache|doifelsebox|doifelseblack|doifelseassignmentcs|doifelseassignment|doifelseallmodes|doifelsealldefined|doifelseallcommon|doifelseMPgraphic|doifelse|doifdrawingblackelse|doifdocumentvariableelse|doifdocumentvariable|doifdocumentfilenameelse|doifdocumentfilename|doifdocumentargumentelse|doifdocumentargument|doifdimenstringelse|doifdimensionelse|doifdefinedelse|doifdefinedcounterelse|doifdefinedcounter|doifdefined|doifcurrentfonthasfeatureelse|doifcounterelse|doifcounter|doifconversionnumberelse|doifconversiondefinedelse|doifcontent|doifcommonelse|doifcommon|doifcommandhandlerelse|doifcommandhandler|doifcolorelse|doifcolor|doifbufferelse|doifboxelse|doifbothsidesoverruled|doifbothsides|doifblackelse|doifassignmentelsecs|doifassignmentelse|doifallmodeselse|doifallmodes|doifalldefinedelse|doifallcommonelse|doifallcommon|doifMPgraphicelse|doif|dogobblesingleempty|dogobbledoubleempty|dogetcommacommandelement|dogetattributeid|dogetattribute|dofastloopcs|doexpandedrecurse|doeassign|dodoublegroupempty|dodoubleemptywithset|dodoubleempty|dodoubleargumentwithset|dodoubleargument|documentvariable|docheckedpair|docheckedpagestate|docheckassignment|doboundtext|doassignempty|doassign|doaddfeature|doadaptrightskip|doadaptleftskip|divides|divideontimes|dividedsize|div|distributedhsize|displaymessage|displaymathematics|displaymath|disabletrackers|disableregime|disableparpositions|disableoutputstream|disablemode|disableexperiments|disabledirectives|dis|directvspacing|directsymbol|directsetup|directsetbar|directselect|directluacode|directlocalframed|directhighlight|directgetboxlly|directgetboxllx|directdummyparameter|directcopyboxfromcache|directconvertedcounter|directcolored|directcolor|directboxfromcache|dimensiontocount|digits|digamma|differentiald|differentialD|diamondsuit|diamond|diameter|dhook|dfrac|devanagarinumerals|determineregistercharacteristics|determinenoflines|determinelistcharacteristics|determineheadnumber|depthstrut|depthspanningtext|depthonlybox|depthofstring|delta|delimitedtext|delimited|definextable|definevspacingamount|definevspacing|definevspace|defineviewerlayer|defineuserdataalternative|defineuserdata|defineunit|definetyping|definetypesetting|definetypescriptsynonym|definetypescriptprefix|definetypeface|definetype|definetwopasslist|definetransparency|definetooltip|definetokenlist|definetextnote|definetextflow|definetextbackground|definetext|definetabulation|definetabulate|definetabletemplate|definesystemvariable|definesystemconstant|definesystemattribute|definesynonyms|definesynonym|definesymbol|definesubformula|definesubfield|definestyleinstance|definestyle|definestartstop|definespotcolor|definesorting|definesort|definesidebar|defineshift|defineseparatorset|defineselector|definesectionlevels|definesectionblock|definesection|definescript|definescale|defineruby|defineresetset|definerenderingwindow|defineregister|definereferenceformat|definereference|definepushsymbol|definepushbutton|defineprogram|defineprofile|defineprocessor|defineprocesscolor|defineprefixset|definepositioning|defineplacement|defineperiodkerning|defineparbuilder|defineparallel|defineparagraphs|defineparagraph|definepapersize|definepalet|definepairedbox|definepagestate|definepageshift|definepageinjectionalternative|definepageinjection|definepagecolumns|definepagechecker|definepagebreak|definepage|defineoverlay|defineoutputroutinecommand|defineoutputroutine|defineornament|definenote|definenarrower|definenamespace|definenamedcolor|definemultitonecolor|definemode|definemixedcolumns|definemessageconstant|definemeasure|definemathunstacked|definemathundertextextensible|definemathunderextensible|definemathunder|definemathtriplet|definemathstyle|definemathstackers|definemathradical|definemathovertextextensible|definemathoverextensible|definemathover|definemathornament|definemathmatrix|definemathframed|definemathfraction|definemathfence|definemathextensible|definemathematics|definemathdoubleextensible|definemathdouble|definemathcommand|definemathcases|definemathalignment|definemathaccent|definemarking|definemarker|definemargindata|definemarginblock|definemakeup|definelowmidhigh|definelowhigh|definelow|definelistextra|definelistalternative|definelist|definelines|definelinenumbering|definelinenote|definelinefiller|definelayout|definelayerpreset|definelayer|definelabelclass|definelabel|defineitems|defineitemgroup|defineintermediatecolor|defineinterlinespace|defineinterfacevariable|defineinterfaceelement|defineinterfaceconstant|defineinteractionmenu|defineinteractionbar|defineinteraction|defineinsertion|defineinitial|defineindenting|defineindentedtext|definehypenationfeatures|definehspace|definehighlight|definehigh|definehelp|defineheadalternative|definehead|definehbox|definegridsnapping|definegraphictypesynonym|defineglobalcolor|definefrozenfont|defineframedtext|defineframedtable|defineframedcontent|defineframed|defineformulaframed|defineformulaalternative|defineformula|definefontsynonym|definefontstyle|definefontsolution|definefontsize|definefontfile|definefontfeature|definefontfamilypreset|definefontfamily|definefontfallback|definefontalternative|definefont|definefloat|definefittingpage|definefirstline|definefiller|definefilesynonym|definefilefallback|definefileconstant|definefiguresymbol|definefieldstack|definefieldcategory|definefieldbodyset|definefieldbody|definefield|definefallbackfamily|definefacingfloat|defineexternalfigure|defineexpandable|defineenumeration|defineeffect|definedfont|definedescription|definedeq|definedelimitedtext|definedataset|definecounter|defineconversionset|defineconversion|definecomplexorsimpleempty|definecomplexorsimple|definecomment|definecommand|definecombinedlist|definecombination|definecolumnsetspan|definecolumnsetarea|definecolumnset|definecolumnbreak|definecolorgroup|definecolor|definecollector|definechemicalsymbol|definechemicals|definechemical|definecharacterspacing|definecharacterkerning|definecharacter|definecapitals|definebutton|definebuffer|definebtxrendering|definebtxregister|definebtxdataset|definebtx|definebreakpoints|definebreakpoint|definebodyfontswitch|definebodyfontenvironment|definebodyfont|defineblock|definebar|definebackground|defineattribute|defineattachment|defineanchor|definealternativestyle|defineactivecharacter|defineaccent|defineTABLEsetup|defineMPinstance|define|defconvertedvalue|defconvertedcommand|defconvertedargument|defcatcodecommand|defaultobjectreference|defaultobjectpage|defaultinterface|decrementvalue|decrementsubpagenumber|decrementpagenumber|decrementedcounter|decrementcounter|decrement|ddots|ddot|dddot|ddagger|ddag|dcurl|dcaron|dbinom|dayspermonth|dayoftheweek|date|datasetvariable|dashv|dashedrightarrow|dashedleftarrow|dasharrow|daleth|dagger|dag|d|cyrilliczhediaeresis|cyrilliczhedescender|cyrilliczhebreve|cyrilliczh|cyrilliczediaeresis|cyrilliczdsc|cyrillicz|cyrillicyu|cyrillicystrstroke|cyrillicystr|cyrillicyo|cyrillicyi|cyrillicyerudiaeresis|cyrillicyat|cyrillicya|cyrillicv|cyrillicushrt|cyrillicumacron|cyrillicuk|cyrillicudoubleacute|cyrillicudiaeresis|cyrillicu|cyrillictshe|cyrillictetse|cyrillictedc|cyrillict|cyrillicshha|cyrillicshch|cyrillicsh|cyrillicsftsn|cyrillicsemisoft|cyrillicsdsc|cyrillicschwadiaeresis|cyrillicschwa|cyrillics|cyrillicr|cyrillicpsi|cyrillicpemidhook|cyrillicp|cyrillicot|cyrillicomegatitlo|cyrillicomegaround|cyrillicomega|cyrillicodiaeresis|cyrillicobarreddiaeresis|cyrillicobarred|cyrillico|cyrillicnje|cyrillicn|cyrillicm|cyrilliclje|cyrilliclittleyusiotified|cyrilliclittleyus|cyrillicl|cyrillicksi|cyrillickoppa|cyrillickje|cyrillickavertstroke|cyrillickastroke|cyrillickahook|cyrillickadc|cyrillickabashkir|cyrillick|cyrillicje|cyrillicizhitsadoublegrave|cyrillicizhitsa|cyrillicishrttail|cyrillicishrt|cyrillicimacron|cyrillicii|cyrillicigrave|cyrillicie|cyrillicidiaeresis|cyrillici|cyrillichrdsn|cyrillichadc|cyrillicha|cyrillich|cyrillicgje|cyrillicgheupturn|cyrillicghestroke|cyrillicghemidhook|cyrillicg|cyrillicfita|cyrillicf|cyrillicery|cyrillicertick|cyrillicerev|cyrillicentail|cyrillicenhook|cyrillicenghe|cyrillicendc|cyrillicemtail|cyrilliceltail|cyrilliceiotified|cyrillicegrave|cyrillicediaeresis|cyrillicebreve|cyrillice|cyrillicdzhe|cyrillicdzeabkhasian|cyrillicdze|cyrillicdje|cyrillicd|cyrillicchevertstroke|cyrillicchekhakassian|cyrillicchediaeresis|cyrillicchedcabkhasian|cyrillicchedc|cyrilliccheabkhasian|cyrillicch|cyrillicc|cyrillicbigyusiotified|cyrillicbigyus|cyrillicb|cyrillicae|cyrillicadiaeresis|cyrillicabreve|cyrillica|cyrillicZHEdiaeresis|cyrillicZHEdescender|cyrillicZHEbreve|cyrillicZH|cyrillicZEdiaeresis|cyrillicZDSC|cyrillicZ|cyrillicYstrstroke|cyrillicYstr|cyrillicYU|cyrillicYO|cyrillicYI|cyrillicYERUdiaeresis|cyrillicYAT|cyrillicYA|cyrillicV|cyrillicUmacron|cyrillicUdoubleacute|cyrillicUdiaeresis|cyrillicUSHRT|cyrillicUK|cyrillicU|cyrillicTSHE|cyrillicTITLO|cyrillicTETSE|cyrillicTEDC|cyrillicT|cyrillicSHHA|cyrillicSHCH|cyrillicSH|cyrillicSFTSN|cyrillicSEMISOFT|cyrillicSDSC|cyrillicSCHWAdiaeresis|cyrillicSCHWA|cyrillicS|cyrillicR|cyrillicPSILIPNEUMATA|cyrillicPSI|cyrillicPEmidhook|cyrillicPALOCHKA|cyrillicPALATALIZATION|cyrillicP|cyrillicOdiaeresis|cyrillicObarreddiaeresis|cyrillicObarred|cyrillicOT|cyrillicOMEGAtitlo|cyrillicOMEGAround|cyrillicOMEGA|cyrillicO|cyrillicNJE|cyrillicN|cyrillicM|cyrillicLJE|cyrillicLITTLEYUSiotified|cyrillicLITTLEYUS|cyrillicL|cyrillicKSI|cyrillicKOPPA|cyrillicKJE|cyrillicKAvertstroke|cyrillicKAstroke|cyrillicKAhook|cyrillicKAbashkir|cyrillicKADC|cyrillicK|cyrillicJE|cyrillicImacron|cyrillicIgrave|cyrillicIdiaeresis|cyrillicIZHITSAdoublegrave|cyrillicIZHITSA|cyrillicISHRTtail|cyrillicISHRT|cyrillicII|cyrillicIE|cyrillicI|cyrillicHRDSN|cyrillicHADC|cyrillicHA|cyrillicH|cyrillicGJE|cyrillicGHEupturn|cyrillicGHEstroke|cyrillicGHEmidhook|cyrillicG|cyrillicFITA|cyrillicF|cyrillicEiotified|cyrillicEgrave|cyrillicEdiaeresis|cyrillicEbreve|cyrillicERtick|cyrillicERY|cyrillicEREV|cyrillicENtail|cyrillicENhook|cyrillicENGHE|cyrillicENDC|cyrillicEMtail|cyrillicELtail|cyrillicE|cyrillicDZHE|cyrillicDZEabkhasian|cyrillicDZE|cyrillicDJE|cyrillicDASIAPNEUMATA|cyrillicD|cyrillicCHEvertstroke|cyrillicCHEkhakassian|cyrillicCHEdiaeresis|cyrillicCHEabkhasian|cyrillicCHEDCabkhasian|cyrillicCHEDC|cyrillicCH|cyrillicC|cyrillicBIGYUSiotified|cyrillicBIGYUS|cyrillicB|cyrillicAdiaeresis|cyrillicAbreve|cyrillicAE|cyrillicA|cwopencirclearrow|curvearrowright|curvearrowleft|currentxtablerow|currentxtablecolumn|currentvalue|currenttime|currentresponses|currentregisterpageuserdata|currentregime|currentproject|currentproduct|currentoutputstream|currentmoduleparameter|currentmessagetext|currentmainlanguage|currentlistsymbol|currentlistentrytitlerendered|currentlistentrytitle|currentlistentryreferenceattribute|currentlistentrypagenumber|currentlistentrynumber|currentlistentrylimitedtext|currentlistentrydestinationattribute|currentlanguage|currentinterface|currentheadnumber|currentfeaturetest|currentenvironment|currentdate|currentcomponent|currentcommalistitem|currentbtxuservariable|currentassignmentlistvalue|currentassignmentlistkey|curlywedge|curlyvee|curlyeqsucc|curlyeqprec|cup|ctxsprint|ctxreport|ctxluacode|ctxluabuffer|ctxlua|ctxloadluafile|ctxlatelua|ctxlatecommand|ctxfunction|ctxdirectlua|ctxdirectcommand|ctxcommand|ctop|cstroke|crlfplaceholder|crlf|crightoverleftarrow|crightarrow|crampedrlap|crampedllap|crampedclap|cramped|counttokens|counttoken|countersubs|correctwhitespace|copyunittext|copytaglabeltext|copysuffixtext|copysetups|copyright|copyprefixtext|copyposition|copyparameters|copypages|copyoperatortext|copymathlabeltext|copylabeltext|copyheadtext|copyfield|copybtxlabeltext|copyboxfromcache|coprod|convertvboxtohbox|convertvalue|convertnumber|convertmonth|convertedsubcounter|converteddimen|convertedcounter|convertcommand|convertargument|continueifinputfile|continuednumber|contentreference|constantnumberargument|constantnumber|constantemptyargument|constantdimenargument|constantdimen|cong|compresult|composedlayer|composedcollector|component|complexorsimpleempty|complexorsimple|complexes|completeregister|completepagenumber|completelistoftables|completelistofsynonyms|completelistofsorts|completelistofpublications|completelistoflogos|completelistofintermezzi|completelistofgraphics|completelistoffigures|completelistofchemicals|completelistofabbreviations|completelist|completeindex|completecontent|completebtxrendering|complement|comparepalet|comparedimensioneps|comparedimension|comparecolorgroup|comment|commalistsize|commalistsentence|commalistelement|combinepages|columnsetspanwidth|columnbreak|column|colorvalue|coloronly|colored|colorcomponents|colorbar|color|colonequals|coloncolonequals|colon|collectexpanded|collectedtext|collect|clubsuit|clonefield|clippedoverlayimage|clip|cleftarrow|cldprocessfile|cldloadfile|cldcontext|cldcommand|classfont|clap|cite|citation|circleonrightarrow|circledequals|circleddash|circledcirc|circledast|circledS|circledR|circlearrowright|circlearrowleft|circeq|circ|chook|chinesenumerals|chinesecapnumerals|chineseallnumerals|chi|chemicaltoptext|chemicaltext|chemicalsymbol|chemicalmidtext|chemicalbottext|chemical|chem|checkvariables|checktwopassdata|checksoundtrack|checkpreviousinjector|checkparameters|checkpage|checknextinjector|checknextindentation|checkmark|checkinjector|checkedstrippedcsname|checkedfiller|checkedchar|checkedblank|checkcharacteralign|check|charwidthlanguage|chardescription|characters|character|chapter|cfrac|centerline|centerednextbox|centeredlastline|centeredbox|centerdot|centerbox|centeraligned|cdots|cdotp|cdotaccent|cdot|ccurl|ccircumflex|ccedilla|ccaron|cbox|catcodetablename|carriagereturn|capital|cap|camel|calligraphic|cacute|button|bullet|buildtextognek|buildtextmacron|buildtextgrave|buildtextcedilla|buildtextbottomdot|buildtextbottomcomma|buildtextaccent|buildmathaccent|btxtextcitation|btxsingularplural|btxsingularorplural|btxsetup|btxsavejournalist|btxremapauthor|btxoneorrange|btxloadjournalist|btxlistcitation|btxlabeltext|btxlabellanguage|btxhybridcite|btxhiddencitation|btxfoundtype|btxfoundname|btxflushsuffix|btxflushauthornormalshort|btxflushauthornormal|btxflushauthorname|btxflushauthorinvertedshort|btxflushauthorinverted|btxflushauthor|btxflush|btxfirstofrange|btxfieldtype|btxfieldname|btxfield|btxexpandedjournal|btxdoifuservariableelse|btxdoifsameaspreviouselse|btxdoifsameaspreviouscheckedelse|btxdoifnot|btxdoifelseuservariable|btxdoifelsesameaspreviouschecked|btxdoifelsesameasprevious|btxdoifelsecombiinlist|btxdoifelse|btxdoifcombiinlistelse|btxdoif|btxdirect|btxdetail|btxauthorfield|btxalwayscitation|btxaddjournal|btxabbreviatedjournal|bstroke|breve|breakhere|breakablethinspace|bpos|boxtimes|boxreference|boxplus|boxofsize|boxminus|boxmarker|boxdot|boxcursor|bowtie|bottomrightbox|bottomleftbox|bottombox|bot|bordermatrix|booleanmodevalue|bookmark|boldslanted|bolditalic|boldface|bold|bodyfontsize|bodyfontenvironmentlist|blockuservariable|blocksynctexfile|blockquote|blockligatures|bleedwidth|bleedheight|bleed|blap|blank|blacktriangleright|blacktriangleleft|blacktriangledown|blacktriangle|blacksquare|blackrules|blackrule|blacklozenge|bitmapimage|binom|bigwedge|bigvee|biguplus|bigudot|bigtriangleup|bigtriangledown|bigtimes|bigstar|bigsquare|bigsqcup|bigsqcap|bigskip|bigr|bigotimes|bigoplus|bigodot|bigm|bigl|biggr|biggm|biggl|bigger|bigg|bigdiamond|bigcup|bigcircle|bigcirc|bigcap|bigbodyfont|big|bhook|between|beth|beta|beforetestandsplitstring|beforesplitstring|because|bbox|bbordermatrix|baselinerightbox|baselinemiddlebox|baselineleftbox|baselinebottom|basegrid|barwedge|barovernorthwestarrow|barleftarrowrightarrowbar|barleftarrow|bar|backslash|backsim|backprime|backgroundline|backgroundimagefill|backgroundimage|background|backepsilon|averagecharwidth|availablehsize|autosetups|autopagestaterealpageorder|autopagestaterealpage|automathematics|autointegral|autoinsertnextspace|autodirvtop|autodirvbox|autodirhbox|autocap|attachment|atrightmargin|atpage|atleftmargin|atilde|at|asymp|astype|ast|assumelongusagecs|assignwidth|assignvalue|assigntranslation|assignifempty|assigndimension|assigndimen|assignalfadimension|aside|asciistr|arrowvert|aringacute|aring|arg|arabicwasallam|arabicvowelyeh|arabicvowelwaw|arabictripledot|arabicstartofrubc|arabicslcm|arabicshighthreedots|arabicsemicolon|arabicsanah|arabicsamvat|arabicsalla|arabicsajdah|arabicsafha|arabicrialsign|arabicray|arabicrasoul|arabicquestion|arabicqala|arabicpoeticverse|arabicpertenthousand|arabicpermille|arabicperiod|arabicpercent|arabicparenright|arabicparenleft|arabicnumerals|arabicnumberabove|arabicnumber|arabicmuhammad|arabicmisra|arabiclowseen|arabiclownoonkasra|arabiclowmeemlong|arabiclettermark|arabicjallajalalouhou|arabichighzain|arabichighyeh|arabichighwaqf|arabichighthalatha|arabichightakhallus|arabichightah|arabichighsmallsafha|arabichighseen|arabichighsallallahou|arabichighsakta|arabichighsajda|arabichighsad|arabichighrubc|arabichighrahmatullahalayhe|arabichighradiallahouanhu|arabichighqif|arabichighqaf|arabichighnoonkasra|arabichighnoon|arabichighnisf|arabichighmeemshort|arabichighmeemlong|arabichighmadda|arabichighlamalef|arabichighjeem|arabichighfootnotemarker|arabichighesala|arabichigheqala|arabichighalayheassallam|arabichighain|arabicfourthroot|arabicfootnotemarker|arabicexnumerals|arabicendofayah|arabicdisputedendofayah|arabicdecimals|arabicdateseparator|arabiccuberoot|arabiccomma|arabicbasmalah|arabicasterisk|arabicallallahou|arabicallah|arabicalayhe|arabicakbar|approxnEq|approxeq|approxEq|approx|applytowords|applytosplitstringwordspaced|applytosplitstringword|applytosplitstringlinespaced|applytosplitstringline|applytosplitstringcharspaced|applytosplitstringchar|applytofirstcharacter|applytocharacters|applyprocessor|applyalternativestyle|apply|appendvalue|appendtoksonce|appendtoks|appendtocommalist|appendgvalue|appendetoks|aogonek|angle|anchor|ampersand|amalg|amacron|alwayscite|alwayscitation|alphabeticnumerals|alpha|allinputpaths|alignmentcharacter|alignhere|alignedline|alignedbox|aligned|alignbottom|aleph|ainvertedbreve|ahook|agrave|aftertestandsplitstring|aftersplitstring|afghanicurrency|aemacron|aeligature|aeacute|adoublegrave|adotbelow|adotaccentmacron|adotaccent|adiaeresismacron|adiaeresis|addvalue|addtocommalist|addtoJSpreamble|addfontpath|addfeature|adaptpapersize|adaptlayout|adaptfontfeature|adaptcollector|acwopencirclearrow|acute|actuarial|actualyear|actualmonth|actualday|activatespacehandler|acircumflextilde|acircumflexhook|acircumflexgrave|acircumflexdotbelow|acircumflexacute|acircumflex|acaron|abrevetilde|abrevehook|abrevegrave|abrevedotbelow|abreveacute|abreve|about|abjadnumerals|abjadnodotnumerals|abjadnaivenumerals|abbreviation|aacute|Zstroke|Zhook|Zeta|Zdotaccent|Zcaron|Zacute|Ytilde|Ymacron|Yhook|Ygrave|Ydotbelow|Ydiaeresis|Ycircumflex|Yacute|Xi|XeTeX|XETEX|Words|Word|WidthSpanningText|Wcircumflex|WORDS|WORD|WEEKDAY|Vvdash|Vert|VerboseNumber|Vdash|VDash|Uuparrow|Utilde|Uring|Upsilon|Updownarrow|Uparrow|Uogonek|Umacron|Uinvertedbreve|Uhungarumlaut|Uhorntilde|Uhornhook|Uhorngrave|Uhorndotbelow|Uhornacute|Uhorn|Uhook|Ugrave|Udoublegrave|Udotbelow|Udiaeresismacron|Udiaeresisgrave|Udiaeresiscaron|Udiaeresisacute|Udiaeresis|Ucircumflex|Ucaron|Ubreve|Uacute|Tstroke|TransparencyHack|Thorn|Thook|Theta|TheNormalizedFontSize|TeX|Tcommaaccent|Tcedilla|Tcaron|Tau|TaBlE|TEX|TABLE|Swarrow|Supset|Subset|Smallcapped|Sigma|Searrow|Scommaaccent|Scircumflex|Schwa|Scedilla|Scaron|ScaledPointsToWholeBigPoints|ScaledPointsToBigPoints|Sacute|S|Rsh|Rrightarrow|Romannumerals|Rinvertedbreve|Rightarrow|Rho|Relbar|ReadFile|Re|Rdsh|Rdoublegrave|Rcommaaccent|Rcaron|Racute|PtToCm|Psi|PropertyLine|PointsToWholeBigPoints|PointsToReal|PointsToBigPoints|Plankconst|PiCTeX|Pi|Phook|Phi|PRAGMA|PPCHTeX|PPCHTEX|PICTEX|PDFcolor|PDFTEX|PDFETEX|P|Otildemacron|Otilde|Ostrokeacute|Ostroke|Oogonekmacron|Oogonek|Omicron|Omega|Omacron|Oinvertedbreve|Ohungarumlaut|Ohorntilde|Ohornhook|Ohorngrave|Ohorndotbelow|Ohornacute|Ohorn|Ohook|Ograve|Odoublegrave|Odotbelow|Odotaccentmacron|Odotaccent|Odiaeresismacron|Odiaeresis|Ocircumflextilde|Ocircumflexhook|Ocircumflexgrave|Ocircumflexdotbelow|Ocircumflexacute|Ocircumflex|Ocaron|Obreve|Oacute|OEligature|Nwarrow|Numbers|Nu|Ntilde|NormalizeTextWidth|NormalizeTextHeight|NormalizeFontWidth|NormalizeFontHeight|Njligature|Ngrave|Neng|Nearrow|Ncommaaccent|Ncaron|Nacute|NJligature|Mu|MetaPost|MetaFun|MetaFont|Mapsto|Mapsfrom|MPy|MPxywhd|MPxy|MPx|MPwhd|MPw|MPvv|MPvariable|MPvar|MPv|MPur|MPul|MPtransparency|MPtext|MPstring|MPrs|MPrightskip|MPrest|MPregion|MPrawvar|MPr|MPposset|MPpositiongraphic|MPpos|MPplus|MPpardata|MPpage|MPp|MPoverlayanchor|MPoptions|MPn|MPmenubuttons|MPls|MPlr|MPll|MPleftskip|MPinclusions|MPh|MPgetposboxes|MPgetmultishape|MPgetmultipars|MPfontsizehskip|MPdrawing|MPd|MPcolumn|MPcoloronly|MPcolor|MPcode|MPc|MPbetex|MPanchor|MPVI|MPIV|MPII|MONTHSHORT|MONTHLONG|MONTH|MKXI|MKVI|MKIX|MKIV|MKII|METAPOST|METAFUN|METAFONT|LuajitTeX|LuaTeX|LuaMetaTeX|Lua|Lstroke|Lsh|Longrightarrow|Longmapsto|Longmapsfrom|Longleftrightarrow|Longleftarrow|Lleftarrow|Ljligature|Leftrightarrow|Leftarrow|Ldsh|Ldotmiddle|Lcommaaccent|Lcaron|Lbar|Lambda|LamSTeX|Lacute|LaTeX|LUATEX|LUAMETATEX|LUAJITTEX|LJligature|LATEX|LAMSTEX|Khook|Kcommaaccent|Kcaron|Kappa|Join|Jcircumflex|Itilde|Istroke|Iota|Iogonek|Imacron|Im|Iinvertedbreve|Ihook|Igrave|Idoublegrave|Idotbelow|Idotaccent|Idiaeresis|Icircumflex|Icaron|Ibreve|Iacute|INRSTEX|IJligature|Hstroke|Hcircumflex|Hcaron|Hat|Gstroke|Greeknumerals|GotoPar|Ghook|GetPar|Gdotaccent|Gcommaaccent|Gcircumflex|Gcaron|Gbreve|Gamma|Game|Gacute|Finv|Fhook|EveryPar|EveryLine|Eulerconst|Etilde|Eth|Eta|Epsilon|Eogonek|Emacron|Einvertedbreve|Ehook|Egrave|Edoublegrave|Edotbelow|Edotaccent|Ediaeresis|Ecircumflextilde|Ecircumflexhook|Ecircumflexgrave|Ecircumflexdotbelow|Ecircumflexacute|Ecircumflex|Ecedilla|Ecaron|Ebreve|Eacute|ETEX|Dzligature|Dzcaronligature|Dstroke|Downarrow|Doteq|Dhook|Delta|Ddownarrow|Dcaron|Dafrican|DZligature|DZcaronligature|Cup|Cstroke|ConvertToConstant|ConvertConstantAfter|Context|ConTeXt|Chook|Chi|Characters|Character|Cdotaccent|Ccircumflex|Ccedilla|Ccaron|Caps|Cap|Cacute|CONTEXT|Bumpeq|Box|Bigr|Bigm|Bigl|Biggr|Biggm|Biggl|Bigg|Big|Bhook|Beta|BeforePar|Atilde|Astroke|Arrowvert|Aringacute|Aring|Aogonek|Angstrom|And|Amacron|AmSTeX|Alphabeticnumerals|Alpha|Ainvertedbreve|Ahook|Agrave|AfterPar|Adoublegrave|Adotbelow|Adotaccentmacron|Adotaccent|Adiaeresismacron|Adiaeresis|Acircumflextilde|Acircumflexhook|Acircumflexgrave|Acircumflexdotbelow|Acircumflexacute|Acircumflex|Acaron|Abrevetilde|Abrevehook|Abrevegrave|Abrevedotbelow|Abreveacute|Abreve|Aacute|AMSTEX|AEmacron|AEligature|AEacute)(?=[^a-zA-Z])",
+ "name" : "context.command.commands.context.tex"
+ },
+ "comment" : {
+ "name" : "context.comment.comment.tex"
+ },
+ "constant" : {
+ "match" : "\u005C\u005C(zwnj|zwj|zerowidthspace|zerowidthnonjoiner|zerowidthnobreakspace|zerowidthjoiner|zeroskip|zeropoint|zeromuskip|zerocount|xmlcatcodes|xifcode|xetexengine|wildcardsymbol|whatsitnodecode|vtopgroupcode|vrbcatcodes|voidifcode|voidbox|vmodeifcode|vlistnodecode|vcentergroupcode|vboxifcode|vboxgroupcode|vadjustgroupcode|usetexmodule|usemodule|useluamodule|uprotationangle|unsetnodecode|unknownengine|unexpandeddocumentvariable|underscoreasciicode|undefined|typescripttwo|typescriptthree|typescriptone|txtcatcodes|twoperemspace|trueifcode|tpbcatcodes|tpacatcodes|tildeasciicode|threeperemspace|thousandpoint|texengineversion|texenginename|texenginefunctionality|texengine|texcatcodes|tabasciicode|superscriptcatcode|subscriptcatcode|stoptext|stopproject|stopproduct|stopnotmode|stopnotext|stopnotallmodes|stopmodule|stopmodeset|stopmodeset|stopmode|stopmkivmode|stoplmtxmode|stopenvironment|stopdocument|stopcomponent|stopallmodes|stopTEXpage|starttext|startproject|startproduct|startnotmode|startnotext|startnotallmodes|startmodule|startmodeset|startmodeset|startmode|startmkivmode|startlmtxmode|startenvironment|startdocument|startcomponent|startallmodes|startTEXpage|spacecatcode|spaceasciicode|softhyphen|smallskipamount|slantperpoint|sixperemspace|singlequoteasciicode|simplegroupcode|setupmodule|setupdocument|semisimplegroupcode|scrollmodecode|scaledpoint|rulenodecode|rlm|righttoleftmark|rightrotationangle|rightparentasciicode|rightbraceasciicode|questionmarkasciicode|pushmode|punctuationspace|prtcatcodes|project|product|primeasciicode|preventmode|presetdocument|popmode|points|plustwohundred|plustwo|plustwentythousand|plusthree|plusthousand|plustenthousand|plusten|plussixteen|plussix|plusseven|plusonehundred|plusone|plusnine|plushundred|plusfour|plusfivehundred|plusfive|plusfifty|pluseight|pluscxxviii|pluscxxvii|pluscclvi|pluscclv|penaltynodecode|pdftexengine|parfillrightskip|parfillleftskip|parametercatcode|outputnewlinechar|outputgroupcode|othercatcode|optionalspace|onepoint|onemuskip|onebasepoint|oddifcode|numifcode|notcatcodes|normalpagebox|nonstopmodecode|nonbreakablespace|nobreakspace|noaligngroupcode|nilcatcodes|newlineasciicode|narrownobreakspace|muquad|morethanasciicode|moduleparameter|mmodeifcode|mksuffix|minustwo|minusone|medskipamount|medcard|maxdimen|maxcount|maxcardminusone|maxcard|mathsupnormal|mathsupdisplay|mathsupcramped|mathsubnormal|mathsubcombined|mathsnodecode|mathsizesuffix|mathshiftgroupcode|mathshiftcatcode|mathrelcode|mathradicalcode|mathpunctcode|mathordcode|mathopencode|mathopcode|mathnothingcode|mathnolopcode|mathnodecode|mathlimopcode|mathleftgroupcode|mathinnercode|mathgroupcode|mathexheight|mathemwidth|mathclosecode|mathchoicegroupcode|mathchoicecode|mathboxcode|mathbincode|mathaxisheight|mathalphacode|mathaccentcode|marknodecode|luatexengine|luastringsep|luacatcodes|lrm|ligaturenodecode|lettercatcode|lessthanasciicode|lefttorightmark|leftrotationangle|leftparentasciicode|leftbraceasciicode|kernnodecode|invalidcatcode|interwordstretch|interwordspace|interwordshrink|insertnodecode|insertgroupcode|innerifcode|inicatcodes|ignorecatcode|ideographicspace|ideographichalffillspace|hyphenasciicode|hmodeifcode|hlistnodecode|hboxifcode|hboxgroupcode|hashasciicode|halfpoint|halfapoint|hairspace|gluenodecode|globalpreventmode|globalenablemode|globaldisablemode|fourperemspace|forwardslashasciicode|formfeedasciicode|fontslantperpoint|fontinterwordstretch|fontinterwordspace|fontinterwordshrink|fontextraspace|fontexheight|fontemwidth|fontcharifcode|fmtversion|fmtname|fiveperemspace|figurespace|falseifcode|extraspace|exheight|exclamationmarkasciicode|everystoptext|everystarttext|escapecatcode|errorstopmodecode|eofifcode|environment|enquad|endoflinetoken|endoflinecatcode|endoflineasciicode|endoffileasciicode|endline|endgroupcatcode|enablemode|emwidth|emquad|emptyvbox|emptytoks|emptyhbox|emptybox|empty|egroup|eUx|downrotationangle|doublequoteasciicode|doublecommentsignal|dollarasciicode|doifnotmode|doifnotdocumentvariable|doifnotallmodes|doifmodeelse|doifmode|doifelsemode|doifelsedocumentvariable|doifelseallmodes|doifdocumentvariableelse|doifdocumentvariable|doifallmodeselse|doifallmodes|documentvariable|discretionarynodecode|discretionarygroupcode|disablemode|directionrighttoleft|directionlefttoright|dimifcode|delasciicode|definemode|definedifcode|currentmoduleparameter|ctxcatcodes|ctdcatcodes|csnameifcode|continueifinputfile|contextversion|contextmark|contextlmtxmode|contextkind|contextformat|constantnumberargument|constantnumber|constantemptyargument|constantdimenargument|constantdimen|conditionaltrue|conditionalfalse|component|commentcatcode|commentasciicode|colonasciicode|circumflexasciicode|charnodecode|charifcode|catifcode|caseifcode|breakablethinspace|bottomlevelgroupcode|bigskipamount|bidirlo|bidirle|bidipop|bidilro|bidilre|bgroup|begingroupcatcode|batchmodecode|barasciicode|backslashasciicode|attributeunsetvalue|atsignasciicode|asciispacechar|ampersandasciicode|alignmentcatcode|aligngroupcode|adjustnodecode|adjustedhboxgroupcode|activetabtoken|activemathcharcode|activeformfeedtoken|activeendoflinetoken|activecatcode|activecatcode|Ux|Umathaccents|!!es|!!bs)(?=[^a-zA-Z])",
+ "name" : "context.constant.commands.constant.tex"
+ },
+ "csname" : {
+ "match" : "\u005C\u005C[a-zA-Z\u005C_@!?-ÿ]+",
+ "name" : "context.user.commands.user.tex"
+ },
+ "escaped" : {
+ "match" : "\u005C\u005C.",
+ "name" : "context.command.commands.escaped.tex"
+ },
+ "extra" : {
+ "match" : "\u005C~|\u005C||`|_|\u005C^|\u005C\u005C|/|\u005C-|\u005C+|\u005C'|\u005C&|\u005C%",
+ "name" : "context.extra.symbols.extras.tex"
+ },
+ "grouping" : {
+ "match" : "}|{|\u005C$",
+ "name" : "context.grouping.symbols.groups.tex"
+ },
+ "helper" : {
+ "match" : "\u005C\u005C(xmlsetup|writestatus|wait|vpackedbox|vpackbox|vkern|vglue|vfillneg|vfilllneg|vfilll|validassignment|uxdef|usedummystyleparameter|usedummystyleandcolor|usedummycolorparameter|unvoidbox|unsupportedcs|unprotect|unique|unexpanded|undefinevalue|uncramped|ugdef|uedef|uedcatcodecommand|udef|twodigits|truecondition|tripleexpandafter|triggeruncrampedstyle|triggeruncrampedsmallstyle|triggeruncrampedbigstyle|triggertextstyle|triggersmallstyle|triggerscriptstyle|triggerscriptscriptstyle|triggermathstyle|triggergroupedcommandcs|triggergroupedcommand|triggerdisplaystyle|triggercrampedstyle|triggercrampedsmallstyle|triggercrampedbigstyle|triggerbigstyle|tracingnone|tracingall|to|threedigits|thirdofthreeunexpanded|thirdofthreearguments|thirdofsixarguments|thirdoffourarguments|thirdoffivearguments|thirdargumenttrue|thirdargumentfalse|then|texsetup|texdefinition|synchronizelayoutdirection|synchronizeinlinedirection|synchronizedisplaydirection|superscript|subscript|strutwd|struthtdp|strutht|strutgap|strutdp|strutbox|strut|strippedcsname|stopxmlsetups|stoptexsetups|stoptexdefinition|stoptexcode|stopsetups|stoprawsetups|stoppickupmath|stopnointerference|stopluasetups|stopluaparameterset|stopluacode|stoplua|stoplocalsetups|stopimath|stopforceddisplaymath|stopextendcatcodetable|stopexpanded|stopdmath|stopctxfunctiondefinition|stopctxfunction|stopcontextdefinitioncode|stopcontextcode|stopcatcodetable|stop|startxmlsetups|starttexsetups|starttexdefinition|starttexcode|startsetups|startrawsetups|startpickupmath|startnointerference|startluasetups|startluaparameterset|startluacode|startlua|startlocalsetups|startimath|startforceddisplaymath|startextendcatcodetable|startexpanded|startdmath|startctxfunctiondefinition|startctxfunction|startcontextdefinitioncode|startcontextcode|startcatcodetable|start|space|sixthofsixarguments|sixthargumenttrue|sixthargumentfalse|singleexpandafter|simplegroupedcommand|signalcharacter|shiftbox|seventhargumenttrue|seventhargumentfalse|setxvalue|setxquantity|setxmeasure|setvalue|setuxvalue|setuvalue|setups|setup|setugvalue|setuevalue|settruevalue|settrue|setsystemmode|setstrut|setquantity|setnewmacro|setnewconstant|setmode|setmeasure|setmathtextbox|setmathsmalltextbox|setlocalhsize|setgvalue|setgquantity|setgmeasure|setfalsevalue|setfalse|setexpandeddummyparameter|setevalue|setequantity|setemeasure|setdummyparameter|setconstantvalue|setconstant|setcatcodetable|secondoftwounexpanded|secondoftwoarguments|secondofthreeunexpanded|secondofthreearguments|secondofsixarguments|secondoffourarguments|secondoffivearguments|secondargumenttrue|secondargumentfalse|scratchyposition|scratchyoffset|scratchxposition|scratchxoffset|scratchwidth|scratchvsize|scratchvoffset|scratchunicode|scratchtotal|scratchtopskip|scratchtopoffset|scratchtokstwo|scratchtoksthree|scratchtokssix|scratchtoksone|scratchtoksfour|scratchtoksfive|scratchtoks|scratchskiptwo|scratchskipthree|scratchskipsix|scratchskipone|scratchskipfour|scratchskipfive|scratchskip|scratchrightskip|scratchrightoffset|scratchoffset|scratchny|scratchnx|scratchmy|scratchmx|scratchmuskiptwo|scratchmuskipthree|scratchmuskipsix|scratchmuskipone|scratchmuskipfour|scratchmuskipfive|scratchmuskip|scratchmin|scratchmax|scratchleftskip|scratchleftoffset|scratchhsize|scratchhoffset|scratchheight|scratchdistance|scratchdimentwo|scratchdimenthree|scratchdimensix|scratchdimenone|scratchdimenfour|scratchdimenfive|scratchdimen|scratchdepth|scratchcountertwo|scratchcounterthree|scratchcountersix|scratchcounterone|scratchcounterfour|scratchcounterfive|scratchcounter|scratchboxtwo|scratchboxthree|scratchboxsix|scratchboxone|scratchboxfour|scratchboxfive|scratchbox|scratchbottomskip|scratchbottomoffset|scangivendimensions|ruledvtop|ruledvss|ruledvskip|ruledvpack|ruledvglue|ruledvfilneg|ruledvfillneg|ruledvfilll|ruledvfill|ruledvfil|ruledvcenter|ruledvbox|ruledtpack|ruledpenalty|ruledmskip|ruledmkern|ruledmbox|ruledkern|ruledhss|ruledhskip|ruledhpack|ruledhglue|ruledhfilneg|ruledhfillneg|ruledhfilll|ruledhfill|ruledhfil|ruledhbox|rtlvtop|rtlvbox|rtlhbox|righttoleftvtop|righttoleftvbox|righttolefthbox|righttoleft|rightboundary|reversevtop|reversevpack|reversevbox|reversetpack|reversehpack|reversehbox|restorecatcodes|resetvalue|resetsystemmode|resetsetups|resetmode|resetglobal|reseteverypar|resetctxscanner|reqno|removeunwantedspaces|removetoks|removepunctuation|removelastspace|relrelspacing|relpunctspacing|relordspacing|relopspacing|relopenspacing|relinnerspacing|relclosespacing|relbinspacing|registerctxluafile|redoglobal|redefine|recurselevel|recursedepth|quitprevcommalist|quitcondition|quitcommalist|quarterstrut|quantity|quantitied|quad|pushsystemmode|pushmathstyle|pushcatcodetable|punctrelspacing|punctpunctspacing|punctordspacing|punctopspacing|punctopenspacing|punctinnerspacing|punctclosespacing|punctbinspacing|protected|protect|processfirstactioninset|processcommalist|processcommacommand|processallactionsinset|processallactions|processaction|privatescratchtoks|privatescratchskip|privatescratchmuskip|privatescratchdimen|privatescratchcounter|privatescratchbox|prependtotoks|prependtoks|popsystemmode|popmathstyle|popcatcodetable|pickupgroupedcommand|permitspacesbetweengroups|ordrelspacing|ordpunctspacing|ordordspacing|ordopspacing|ordopenspacing|ordinnerspacing|ordclosespacing|ordbinspacing|oprelspacing|oppunctspacing|opordspacing|opopspacing|opopenspacing|opinnerspacing|openrelspacing|openpunctspacing|openordspacing|openopspacing|openopenspacing|openinnerspacing|openclosespacing|openbinspacing|opclosespacing|opbinspacing|onlypdfobjectcompression|onlynonbreakablespace|oninterlineskip|offinterlineskip|obeyspaces|obeyluatokens|obeylualines|obeylines|obeyedtab|obeyedspace|obeyedpage|obeyedline|null|novalidassignment|nosuperscript|nosubscript|nospacing|nospace|normalvglue|normalvfillneg|normalvfilllneg|normalsuperscript|normalsubscript|normalstopimath|normalstopdmath|normalstartimath|normalstartdmath|normalspace|normalreqno|normalpdfcompression|normalnosuperscript|normalnosubscript|normallineskiplimit|normallineskip|normalhglue|normalhfillneg|normalhfilllneg|normalbaselineskip|nopdfobjectcompression|nopdfcompression|nointerlineskip|nohyphens|noheightstrut|nobreak|nexttoken|nextbox|next|newwrite|newtoks|newsystemmode|newskip|newsignal|newread|newmuskip|newmode|newmarks|newmacro|newlanguage|newinsert|newif|newhelp|newfraction|newfamily|newfam|newdimen|newcount|newconstant|newconditional|newcatcodetable|newbox|newattribute|nbsp|naturalvtop|naturalvpack|naturalvbox|naturaltpack|naturalhpack|naturalhbox|morehyphens|modulonumber|measured|measure|maximumpdfcompression|mathtext|mathstylevcenteredvbox|mathstylevcenteredhbox|mathstylevcenter|mathstylevbox|mathstylehbox|mathstylefont|mathstyleface|mathstylecommand|mathsmallstylefont|mathsmallstyleface|mathpalette|mathortext|mathnothing|mathnolop|mathlimop|mathbox|mathalpha|luaversion|luasetup|luaparameterset|luaminorversion|luamajorversion|luaexpr|luaexpanded|luaconditional|luacode|ltrvtop|ltrvbox|ltrhbox|loggingall|localhsize|lineheight|letvalue|letgvalue|letdummyparameter|letcatcodecommand|lesshyphens|lefttorightvtop|lefttorightvbox|lefttorighthbox|lefttoright|leftorrightvtop|leftorrightvbox|leftorrighthbox|leftorright|leftboundary|lateluacode|lastlinewidth|keepunwantedspaces|installprotectedctxscanner|installprotectedctxfunction|installctxscanner|installctxfunction|installcorenamespace|innerrelspacing|innerpunctspacing|innerordspacing|inneropspacing|inneropenspacing|innerinnerspacing|innerclosespacing|innerbinspacing|inlineordisplaymath|indisplaymath|ignorevalue|ignoreparskip|htdp|hsizefraction|hpackedbox|hpackbox|hkern|hglue|hfillneg|hfilllneg|hfilll|halfstrut|halflinestrut|groupedcommandcs|groupedcommand|goodbreak|gobbletwooptionals|gobbletwoarguments|gobblethreeoptionals|gobblethreearguments|gobbletenarguments|gobblesixarguments|gobblesevenarguments|gobbleoneoptional|gobbleoneargument|gobbleninearguments|gobblefouroptionals|gobblefourarguments|gobblefiveoptionals|gobblefivearguments|gobbleeightarguments|globalsetsystemmode|globalsetmode|globalscratchtoks|globalscratchskip|globalscratchmuskip|globalscratchdimen|globalscratchcountertwo|globalscratchcounterthree|globalscratchcounterone|globalscratchcounter|globalscratchbox|globalresetsystemmode|globalresetmode|globallet|glet|givenwidth|givenheight|givendepth|getxparameters|getvalue|getuvalue|getparameters|getgparameters|getfirstcharacter|geteparameters|getdummyparameters|frule|freezequantity|freezemeasure|fourthofsixarguments|fourthoffourarguments|fourthoffivearguments|fourthargumenttrue|fourthargumentfalse|foundtrue|foundfalse|forgetparameters|forgetall|forcestrutdepth|forcedisplaymath|flushnextbox|firstoftwounexpanded|firstoftwoarguments|firstofthreeunexpanded|firstofthreearguments|firstofsixarguments|firstofoneunexpanded|firstofoneargument|firstoffourarguments|firstoffivearguments|firstinset|firstargumenttrue|firstargumentfalse|finishpar|filledhboxy|filledhboxr|filledhboxm|filledhboxk|filledhboxg|filledhboxc|filledhboxb|fifthofsixarguments|fifthoffivearguments|fifthargumenttrue|fifthargumentfalse|fastsetup|fastloopindex|fastloopfinal|falsecondition|expelsedoif|expdoifnot|expdoifinsetelse|expdoifelseinset|expdoifelsecommon|expdoifcommonelse|expdoif|expanded|exitloop|executeifdefined|everyendpar|enspace|endstrut|endpar|endgraf|emspace|empty|dummyparameter|dowithnextboxcs|dowithnextboxcontentcs|dowithnextboxcontent|dowithnextbox|dowith|doubleexpandafter|dotriplegroupempty|dotripleempty|dotripleargument|dostepwiserecurse|dospacing|dosixtupleempty|dosixtupleargument|dosinglegroupempty|dosingleempty|dosingleargument|doseventupleempty|doseventupleargument|dorecurse|doquintuplegroupempty|doquintupleempty|doquintupleargument|doquadruplegroupempty|doquadrupleempty|doquadrupleargument|dontpermitspacesbetweengroups|dontleavehmode|dontcomplain|donothing|donetrue|donefalse|doloop|doifvaluesomething|doifvaluenothingelse|doifvaluenothing|doifvalue|doifundefinedelse|doifundefined|doiftextelse|doiftext|doifsomethingelse|doifsomething|doifsetupselse|doifsetups|doifnumberelse|doifnumber|doifnotvalue|doifnottext|doifnotsetups|doifnotnumber|doifnotinstring|doifnotinset|doifnothingelse|doifnothing|doifnotcommon|doifnotcommandhandler|doifnot|doifnextparenthesiselse|doifnextoptionalelse|doifnextoptionalcselse|doifnextcharelse|doifnextcharcselse|doifnextbgroupelse|doifnextbgroupcselse|doifinstringelse|doifinstring|doifinsetelse|doifinset|doiffirstcharelse|doiffastoptionalcheckelse|doiffastoptionalcheckcselse|doifelsevaluenothing|doifelsevalue|doifelseundefined|doifelsetext|doifelsesomething|doifelsesetups|doifelsenumber|doifelsenothing|doifelsenextparenthesis|doifelsenextoptionalcs|doifelsenextoptional|doifelsenextcharcs|doifelsenextchar|doifelsenextbgroupcs|doifelsenextbgroup|doifelseinstring|doifelseinset|doifelsefirstchar|doifelsefastoptionalcheckcs|doifelsefastoptionalcheck|doifelsedimension|doifelsedefined|doifelsecommon|doifelsecommandhandler|doifelseassignmentcs|doifelseassignment|doifelse|doifdimensionelse|doifdefinedelse|doifdefined|doifcommonelse|doifcommon|doifcommandhandlerelse|doifcommandhandler|doifassignmentelsecs|doifassignmentelse|doif|dohyphens|doglobal|dofastloopcs|dodoublegroupempty|dodoubleempty|dodoubleargument|dodoglobal|docheckassignment|dividenumber|distributedhsize|dirrlo|dirrle|dirlro|dirlre|directsetup|directquantity|directmeasure|directluacode|directdummyparameter|depthstrut|definequantity|definenamedlua|definemeasure|defineexpandable|define|defcatcodecommand|defaultcatcodetable|currentcatcodetable|ctxwrite|ctxsprint|ctxreport|ctxluacode|ctxlua|ctxloadluafile|ctxlatelua|ctxlatecommand|ctxfunction|ctxdirectlua|ctxdirectcommand|ctxcommand|crlf|cramped|copysetups|copyparameters|compoundhyphenpenalty|closerelspacing|closepunctspacing|closeordspacing|closeopspacing|closeopenspacing|closeinnerspacing|closeclosespacing|closebinspacing|cldprocessfile|cldloadviafile|cldloadfile|cldcontext|cldcommand|checkedstrippedcsname|checkedrighttoleft|checkedlefttoright|checked|charspace|catcodetablename|carryoverpar|break|boxisempty|booleanmodevalue|binrelspacing|binpunctspacing|binordspacing|binopspacing|binopenspacing|bininnerspacing|binclosespacing|binbinspacing|begstrut|begcsname|availablehsize|autorule|autodirvtop|autodirvbox|autodirhbox|assumelongusagecs|appendtotoks|appendtoks|allowbreak|Umathbotaccent|Ucheckedstopdisplaymath|Ucheckedstartdisplaymath)(?=[^a-zA-Z])",
+ "name" : "context.plain.commands.plain.tex"
+ },
+ "ifprimitive" : {
+ "match" : "\u005C\u005Cif[a-zA-Z\u005C_@!?-ÿ]*",
+ "name" : "context.primitive.commands.if.tex"
+ },
+ "lua_command" : {
+ "begin" : "(\u005C\u005Cstart(?:luathread|luascript|luaexpr|latelua|directlua|ctxlua|ctxlatelua|ctxlatecommand|ctxfunction|ctxcommand|cldcontext|cldcommand))",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.embedded.lua.command.open.tex"
+ },
+ "2" : {
+ "name" : "context.grouping.lua.command.open.tex"
+ }
+ },
+ "end" : "(\u005C\u005Cstop(?:luathread|luascript|luaexpr|latelua|directlua|ctxlua|ctxlatelua|ctxlatecommand|ctxfunction|ctxcommand|cldcontext|cldcommand))",
+ "endCaptures" : {
+ "1" : {
+ "name" : "context.grouping.lua.command.close.tex"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "source.context.cld"
+ }
+ ]
+ },
+ "lua_environment" : {
+ "begin" : "(\u005C\u005Cstart(?:luasetups|luaparameterset|luacode|ctxfunctiondefinition|ctxfunction))",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.embedded.lua.environment.open.tex"
+ }
+ },
+ "end" : "(\u005C\u005Cstop(?:luasetups|luaparameterset|luacode|ctxfunctiondefinition|ctxfunction))",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.embedded.lua.environment.close.tex"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "source.context.cld"
+ }
+ ]
+ },
+ "metafun_command" : {
+ "match" : "\u005C\u005C(useMPgraphic|usableMPgraphic|uniqueMPpagegraphic|uniqueMPgraphic|reuseMPgraphic|reusableMPgraphic|MPpositiongraphic)(?=[^a-zA-Z])",
+ "name" : "context.embedded.metafun.command.tex"
+ },
+ "metafun_environment_a" : {
+ "begin" : "(\u005C\u005Cstart(?:useMPgraphic|reuseMPgraphic|MPinitializations|MPinclusions|MPgraphic|MPextensions|MPdefinitions|MPcode|MPcalculation))\u005Cs*(?:(\u005C{)([^\u005C}]*)(\u005C}))?\u005Cs*(?:(\u005C{)([^\u005C}]*)(\u005C}))?",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.embedded.metafun.environment.start.a.tex"
+ },
+ "2" : {
+ "name" : "context.embedded.metafun.environment.open.a.1.tex"
+ },
+ "3" : {
+ "name" : "context.warning.metafun.environment.content.a.1.tex"
+ },
+ "4" : {
+ "name" : "context.embedded.metafun.environment.close.a.1.tex"
+ },
+ "5" : {
+ "name" : "context.embedded.metafun.environment.open.a.2.tex"
+ },
+ "6" : {
+ "name" : "context.warning.metafun.environment.content.a.2.tex"
+ },
+ "7" : {
+ "name" : "context.embedded.metafun.environment.close.a.2.tex"
+ }
+ },
+ "end" : "(\u005C\u005Cstop(?:useMPgraphic|reuseMPgraphic|MPinitializations|MPinclusions|MPgraphic|MPextensions|MPdefinitions|MPcode|MPcalculation))",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.embedded.metafun.environment.stop.a.tex"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "source.context.mps"
+ }
+ ]
+ },
+ "metafun_environment_o" : {
+ "begin" : "(\u005C\u005CstartMPpage)\u005Cs*(?:(\u005C[)([^\u005C]]*)(\u005C]))?\u005Cs*(?:(\u005C[)([^\u005C]]*)(\u005C]))?",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.embedded.metafun.environment.start.o.tex"
+ },
+ "2" : {
+ "name" : "context.embedded.metafun.environment.open.o.1.tex"
+ },
+ "3" : {
+ "name" : "context.warning.metafun.environment.content.o.1.tex"
+ },
+ "4" : {
+ "name" : "context.embedded.metafun.environment.close.o.1.tex"
+ },
+ "5" : {
+ "name" : "context.embedded.metafun.environment.open.o.2.tex"
+ },
+ "6" : {
+ "name" : "context.warning.metafun.environment.content.o.2.tex"
+ },
+ "7" : {
+ "name" : "context.embedded.metafun.environment.close.o.2.tex"
+ }
+ },
+ "end" : "(\u005C\u005CstopMPpage)",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.embedded.metafun.environment.stop.o.tex"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "source.context.mps"
+ }
+ ]
+ },
+ "primitive" : {
+ "match" : "\u005C\u005C(year|xtokspre|xtoksapp|xspaceskip|xleaders|xdef|wordboundary|widowpenalty|widowpenalties|wd|vtop|vss|vsplit|vskip|vsize|vrule|vpack|voffset|vfuzz|vfilneg|vfill|vfil|vcenter|vbox|vbadness|valign|vadjust|uppercase|unvcopy|unvbox|unskip|unpenalty|unletprotected|unletfrozen|unless|unkern|unhcopy|unhbox|underline|uchyph|uccode|tracingstats|tracingscantokens|tracingrestores|tracingparagraphs|tracingpages|tracingoutput|tracingonline|tracingnesting|tracingmacros|tracinglostchars|tracingifs|tracinggroups|tracingfonts|tracingcommands|tracingassigns|tpack|topskip|topmarks|topmark|tolerance|tokspre|toksdef|toksapp|toks|time|thinmuskip|thickmuskip|the|textstyle|textfont|textdirection|tabskip|string|splittopskip|splitmaxdepth|splitfirstmarks|splitfirstmark|splitdiscards|splitbotmarks|splitbotmark|span|spaceskip|spacefactor|skipdef|skip|skewchar|showtokens|showthe|shownodedetails|showlists|showifs|showgroups|showboxdepth|showboxbreadth|showbox|show|shipout|shapemode|sfcode|setlanguage|setfontid|setbox|scrollmode|scriptstyle|scriptspace|scriptscriptstyle|scriptscriptfont|scriptfont|scantokens|scantextokens|savingvdiscards|savinghyphcodes|savecatcodetable|rpcode|romannumeral|rightskip|rightmarginkern|righthyphenmin|rightghost|right|relpenalty|relax|readline|read|raise|radical|quitvmode|pxdimen|protrusionboundary|protrudechars|prevgraf|prevdepth|pretolerance|prerelpenalty|prehyphenchar|preexhyphenchar|predisplaysize|predisplaypenalty|predisplaygapfactor|predisplaydirection|prebinoppenalty|posthyphenchar|postexhyphenchar|postdisplaypenalty|penalty|pdfximage|pdfxformresources|pdfxformname|pdfxformmargin|pdfxformattr|pdfxform|pdfvorigin|pdfuniqueresname|pdfuniformdeviate|pdftrailerid|pdftrailer|pdftracingfonts|pdfthreadmargin|pdfthread|pdftexversion|pdftexrevision|pdftexbanner|pdfsuppressptexinfo|pdfsuppressoptionalinfo|pdfstartthread|pdfstartlink|pdfsetrandomseed|pdfsetmatrix|pdfsavepos|pdfsave|pdfretval|pdfrestore|pdfreplacefont|pdfrefximage|pdfrefxform|pdfrefobj|pdfrecompress|pdfrandomseed|pdfpxdimen|pdfprotrudechars|pdfprimitive|pdfpkresolution|pdfpkmode|pdfpkfixeddpi|pdfpagewidth|pdfpagesattr|pdfpageresources|pdfpageref|pdfpageheight|pdfpagebox|pdfpageattr|pdfoutput|pdfoutline|pdfomitcidset|pdfomitcharset|pdfobjcompresslevel|pdfobj|pdfnormaldeviate|pdfnoligatures|pdfnames|pdfminorversion|pdfmapline|pdfmapfile|pdfmajorversion|pdfliteral|pdflinkmargin|pdflastypos|pdflastxpos|pdflastximagepages|pdflastximage|pdflastxform|pdflastobj|pdflastlink|pdflastlinedepth|pdflastannot|pdfinsertht|pdfinfoomitdate|pdfinfo|pdfinclusionerrorlevel|pdfinclusioncopyfonts|pdfincludechars|pdfimageresolution|pdfimagehicolor|pdfimagegamma|pdfimageapplygamma|pdfimageaddfilename|pdfignoreunknownimages|pdfignoreddimen|pdfhorigin|pdfglyphtounicode|pdfgentounicode|pdfgamma|pdffontsize|pdffontobjnum|pdffontname|pdffontexpand|pdffontattr|pdffirstlineheight|pdfendthread|pdfendlink|pdfeachlineheight|pdfeachlinedepth|pdfdraftmode|pdfdestmargin|pdfdest|pdfdecimaldigits|pdfcreationdate|pdfcopyfont|pdfcompresslevel|pdfcolorstackinit|pdfcolorstack|pdfcatalog|pdfannot|pdfadjustspacing|pausing|patterns|parskip|parshapelength|parshapeindent|parshapedimen|parshape|parindent|parfillskip|pardirection|par|pagetotal|pagestretch|pageshrink|pagegoal|pagefilstretch|pagefillstretch|pagefilllstretch|pagediscards|pagedepth|overwithdelims|overline|overfullrule|over|outputpenalty|outputbox|output|outer|orelse|ordlimits|or|openin|omit|numexpr|number|nullfont|nulldelimiterspace|novrule|nospaces|normalyear|normalxtokspre|normalxtoksapp|normalxspaceskip|normalxleaders|normalxdef|normalwordboundary|normalwidowpenalty|normalwidowpenalties|normalwd|normalvtop|normalvss|normalvsplit|normalvskip|normalvsize|normalvrule|normalvpack|normalvoffset|normalvfuzz|normalvfilneg|normalvfill|normalvfil|normalvcenter|normalvbox|normalvbadness|normalvalign|normalvadjust|normaluppercase|normalunvcopy|normalunvbox|normalunskip|normalunpenalty|normalunletprotected|normalunletfrozen|normalunless|normalunkern|normalunhcopy|normalunhbox|normalunexpanded|normalunderline|normaluchyph|normaluccode|normaltracingstats|normaltracingscantokens|normaltracingrestores|normaltracingparagraphs|normaltracingpages|normaltracingoutput|normaltracingonline|normaltracingnesting|normaltracingmacros|normaltracinglostchars|normaltracingifs|normaltracinggroups|normaltracingfonts|normaltracingcommands|normaltracingassigns|normaltpack|normaltopskip|normaltopmarks|normaltopmark|normaltolerance|normaltokspre|normaltoksdef|normaltoksapp|normaltoks|normaltime|normalthinmuskip|normalthickmuskip|normalthe|normaltextstyle|normaltextfont|normaltextdirection|normaltabskip|normalstring|normalsplittopskip|normalsplitmaxdepth|normalsplitfirstmarks|normalsplitfirstmark|normalsplitdiscards|normalsplitbotmarks|normalsplitbotmark|normalspan|normalspaceskip|normalspacefactor|normalskipdef|normalskip|normalskewchar|normalshowtokens|normalshowthe|normalshownodedetails|normalshowlists|normalshowifs|normalshowgroups|normalshowboxdepth|normalshowboxbreadth|normalshowbox|normalshow|normalshipout|normalshapemode|normalsfcode|normalsetlanguage|normalsetfontid|normalsetbox|normalscrollmode|normalscriptstyle|normalscriptspace|normalscriptscriptstyle|normalscriptscriptfont|normalscriptfont|normalscantokens|normalscantextokens|normalsavingvdiscards|normalsavinghyphcodes|normalsavecatcodetable|normalrpcode|normalromannumeral|normalrightskip|normalrightmarginkern|normalrighthyphenmin|normalrightghost|normalright|normalrelpenalty|normalrelax|normalreadline|normalread|normalraise|normalradical|normalquitvmode|normalpxdimen|normalprotrusionboundary|normalprotrudechars|normalprotected|normalprevgraf|normalprevdepth|normalpretolerance|normalprerelpenalty|normalprehyphenchar|normalpreexhyphenchar|normalpredisplaysize|normalpredisplaypenalty|normalpredisplaygapfactor|normalpredisplaydirection|normalprebinoppenalty|normalposthyphenchar|normalpostexhyphenchar|normalpostdisplaypenalty|normalpenalty|normalpdfximage|normalpdfxformresources|normalpdfxformname|normalpdfxformmargin|normalpdfxformattr|normalpdfxform|normalpdfvorigin|normalpdfuniqueresname|normalpdfuniformdeviate|normalpdftrailerid|normalpdftrailer|normalpdftracingfonts|normalpdfthreadmargin|normalpdfthread|normalpdftexversion|normalpdftexrevision|normalpdftexbanner|normalpdfsuppressptexinfo|normalpdfsuppressoptionalinfo|normalpdfstartthread|normalpdfstartlink|normalpdfsetrandomseed|normalpdfsetmatrix|normalpdfsavepos|normalpdfsave|normalpdfretval|normalpdfrestore|normalpdfreplacefont|normalpdfrefximage|normalpdfrefxform|normalpdfrefobj|normalpdfrecompress|normalpdfrandomseed|normalpdfpxdimen|normalpdfprotrudechars|normalpdfprimitive|normalpdfpkresolution|normalpdfpkmode|normalpdfpkfixeddpi|normalpdfpagewidth|normalpdfpagesattr|normalpdfpageresources|normalpdfpageref|normalpdfpageheight|normalpdfpagebox|normalpdfpageattr|normalpdfoutput|normalpdfoutline|normalpdfomitcidset|normalpdfomitcharset|normalpdfobjcompresslevel|normalpdfobj|normalpdfnormaldeviate|normalpdfnoligatures|normalpdfnames|normalpdfminorversion|normalpdfmapline|normalpdfmapfile|normalpdfmajorversion|normalpdfliteral|normalpdflinkmargin|normalpdflastypos|normalpdflastxpos|normalpdflastximagepages|normalpdflastximage|normalpdflastxform|normalpdflastobj|normalpdflastlink|normalpdflastlinedepth|normalpdflastannot|normalpdfinsertht|normalpdfinfoomitdate|normalpdfinfo|normalpdfinclusionerrorlevel|normalpdfinclusioncopyfonts|normalpdfincludechars|normalpdfimageresolution|normalpdfimagehicolor|normalpdfimagegamma|normalpdfimageapplygamma|normalpdfimageaddfilename|normalpdfignoreunknownimages|normalpdfignoreddimen|normalpdfhorigin|normalpdfglyphtounicode|normalpdfgentounicode|normalpdfgamma|normalpdffontsize|normalpdffontobjnum|normalpdffontname|normalpdffontexpand|normalpdffontattr|normalpdffirstlineheight|normalpdfendthread|normalpdfendlink|normalpdfeachlineheight|normalpdfeachlinedepth|normalpdfdraftmode|normalpdfdestmargin|normalpdfdest|normalpdfdecimaldigits|normalpdfcreationdate|normalpdfcopyfont|normalpdfcompresslevel|normalpdfcolorstackinit|normalpdfcolorstack|normalpdfcatalog|normalpdfannot|normalpdfadjustspacing|normalpausing|normalpatterns|normalparskip|normalparshapelength|normalparshapeindent|normalparshapedimen|normalparshape|normalparindent|normalparfillskip|normalpardirection|normalpar|normalpagetotal|normalpagestretch|normalpageshrink|normalpagegoal|normalpagefilstretch|normalpagefillstretch|normalpagefilllstretch|normalpagediscards|normalpagedepth|normaloverwithdelims|normaloverline|normaloverfullrule|normalover|normaloutputpenalty|normaloutputbox|normaloutput|normalouter|normalorelse|normalordlimits|normalor|normalopenin|normalomit|normalnumexpr|normalnumber|normalnullfont|normalnulldelimiterspace|normalnovrule|normalnospaces|normalnonstopmode|normalnonscript|normalnolimits|normalnoligs|normalnokerns|normalnoindent|normalnohrule|normalnoexpand|normalnoboundary|normalnoalign|normalnewlinechar|normalmutoglue|normalmuskipdef|normalmuskip|normalmultiply|normalmuexpr|normalmskip|normalmoveright|normalmoveleft|normalmonth|normalmkern|normalmiddle|normalmessage|normalmedmuskip|normalmeaning|normalmaxdepth|normalmaxdeadcycles|normalmathsurroundskip|normalmathsurroundmode|normalmathsurround|normalmathstyle|normalmathscriptsmode|normalmathscriptcharmode|normalmathscriptboxmode|normalmathrulethicknessmode|normalmathrulesmode|normalmathrulesfam|normalmathrel|normalmathpunct|normalmathpenaltiesmode|normalmathord|normalmathopen|normalmathop|normalmatholdmode|normalmathnolimitsmode|normalmathitalicsmode|normalmathinner|normalmathflattenmode|normalmatheqnogapstep|normalmathdisplayskipmode|normalmathdirection|normalmathdelimitersmode|normalmathcode|normalmathclose|normalmathchoice|normalmathchardef|normalmathchar|normalmathbin|normalmathaccent|normalmarks|normalmark|normalmag|normalluatexversion|normalluatexrevision|normalluatexbanner|normalluafunctioncall|normalluafunction|normalluaescapestring|normalluadef|normalluacopyinputnodes|normalluabytecodecall|normalluabytecode|normallpcode|normallowercase|normallower|normallooseness|normallong|normallocalrightbox|normallocalleftbox|normallocalinterlinepenalty|normallocalbrokenpenalty|normallinepenalty|normallinedirection|normallimits|normalletprotected|normalletfrozen|normalletcharcode|normallet|normalleqno|normalleftskip|normalleftmarginkern|normallefthyphenmin|normalleftghost|normalleft|normalleaders|normallccode|normallastskip|normallastpenalty|normallastnodetype|normallastnodesubtype|normallastnamedcs|normallastlinefit|normallastkern|normallastbox|normallanguage|normalkern|normaljobname|normalinternalcodesmode|normalinterlinepenalty|normalinterlinepenalties|normalinteractionmode|normalinsertpenalties|normalinsertht|normalinsert|normalinputlineno|normalinput|normalinitcatcodetable|normalindent|normalimmediateassignment|normalimmediateassigned|normalignorespaces|normalignorepars|normalifx|normalifvoid|normalifvmode|normalifvbox|normalifusercmd|normaliftrue|normaliftok|normalifprotected|normalifpdfprimitive|normalifpdfabsnum|normalifpdfabsdim|normalifodd|normalifnumval|normalifnum|normalifmmode|normalifinner|normalifincsname|normalifhmode|normalifhbox|normaliffrozen|normaliffontchar|normaliffalse|normalifeof|normalifdimval|normalifdim|normalifdefined|normalifcstok|normalifcsname|normalifcondition|normalifcmpnum|normalifcmpdim|normalifchknum|normalifchkdim|normalifcat|normalifcase|normalifabsnum|normalifabsdim|normalif|normalhyphenpenaltymode|normalhyphenpenalty|normalhyphenchar|normalhyphenationmin|normalhyphenationbounds|normalhyphenation|normalht|normalhss|normalhskip|normalhsize|normalhrule|normalhpack|normalholdinginserts|normalhoffset|normalhjcode|normalhfuzz|normalhfilneg|normalhfill|normalhfil|normalhbox|normalhbadness|normalhangindent|normalhangafter|normalhalign|normalgtokspre|normalgtoksapp|normalglyphdatafield|normalgluetomu|normalgluestretchorder|normalgluestretch|normalglueshrinkorder|normalglueshrink|normalglueexpr|normalglobaldefs|normalglobal|normalglet|normalgleaders|normalgdef|normalfuturelet|normalfutureexpandisap|normalfutureexpandis|normalfutureexpand|normalfrozen|normalformatname|normalfontname|normalfontid|normalfontdimen|normalfontcharwd|normalfontcharic|normalfontcharht|normalfontchardp|normalfont|normalfloatingpenalty|normalfixupboxesmode|normalfirstvalidlanguage|normalfirstmarks|normalfirstmark|normalfinalhyphendemerits|normalfi|normalfam|normalexplicithyphenpenalty|normalexplicitdiscretionary|normalexpanded|normalexpandafter|normalexhyphenpenalty|normalexhyphenchar|normalexceptionpenalty|normaleveryvbox|normaleverytab|normaleverypar|normaleverymath|normaleveryjob|normaleveryhbox|normaleveryeof|normaleverydisplay|normaleverycr|normaletokspre|normaletoksapp|normalescapechar|normalerrorstopmode|normalerrorcontextlines|normalerrmessage|normalerrhelp|normaleqno|normalendlocalcontrol|normalendlinechar|normalendinput|normalendgroup|normalendcsname|normalend|normalemergencystretch|normalelse|normalefcode|normaledef|normaldump|normaldp|normaldoublehyphendemerits|normaldivide|normaldisplaywidth|normaldisplaywidowpenalty|normaldisplaywidowpenalties|normaldisplaystyle|normaldisplaylimits|normaldisplayindent|normaldiscretionary|normaldirectlua|normaldimexpr|normaldimendef|normaldimen|normaldetokenize|normaldelimitershortfall|normaldelimiterfactor|normaldelimiter|normaldelcode|normaldefaultskewchar|normaldefaulthyphenchar|normaldef|normaldeadcycles|normalday|normalcurrentiftype|normalcurrentiflevel|normalcurrentifbranch|normalcurrentgrouptype|normalcurrentgrouplevel|normalcsstring|normalcsname|normalcrcr|normalcrampedtextstyle|normalcrampedscriptstyle|normalcrampedscriptscriptstyle|normalcrampeddisplaystyle|normalcr|normalcountdef|normalcount|normalcopy|normalcompoundhyphenmode|normalclubpenalty|normalclubpenalties|normalclosein|normalclearmarks|normalcleaders|normalchardef|normalchar|normalcatcodetable|normalcatcode|normalbrokenpenalty|normalbreakafterdirmode|normalboxyoffset|normalboxymove|normalboxxoffset|normalboxxmove|normalboxtotal|normalboxorientation|normalboxmaxdepth|normalboxdirection|normalboxattr|normalbox|normalboundary|normalbotmarks|normalbotmark|normalbinoppenalty|normalbelowdisplayskip|normalbelowdisplayshortskip|normalbeginlocalcontrol|normalbegingroup|normalbegincsname|normalbatchmode|normalbadness|normalautomatichyphenpenalty|normalautomatichyphenmode|normalautomaticdiscretionary|normalattributedef|normalattribute|normalatopwithdelims|normalatop|normalaligntab|normalalignmark|normalaftergrouped|normalaftergroup|normalafterassignment|normaladvance|normaladjustspacingstretch|normaladjustspacingstep|normaladjustspacingshrink|normaladjustspacing|normaladjdemerits|normalaccent|normalabovewithdelims|normalabovedisplayskip|normalabovedisplayshortskip|normalabove|normalXeTeXversion|normalUvextensible|normalUunderdelimiter|normalUsuperscript|normalUsubscript|normalUstopmath|normalUstopdisplaymath|normalUstartmath|normalUstartdisplaymath|normalUstack|normalUskewedwithdelims|normalUskewed|normalUroot|normalUright|normalUradical|normalUoverdelimiter|normalUnosuperscript|normalUnosubscript|normalUmiddle|normalUmathunderdelimitervgap|normalUmathunderdelimiterbgap|normalUmathunderbarvgap|normalUmathunderbarrule|normalUmathunderbarkern|normalUmathsupsubbottommax|normalUmathsupshiftup|normalUmathsupshiftdrop|normalUmathsupbottommin|normalUmathsubtopmax|normalUmathsubsupvgap|normalUmathsubsupshiftdown|normalUmathsubshiftdrop|normalUmathsubshiftdown|normalUmathstackvgap|normalUmathstacknumup|normalUmathstackdenomdown|normalUmathspaceafterscript|normalUmathskewedfractionvgap|normalUmathskewedfractionhgap|normalUmathrelrelspacing|normalUmathrelpunctspacing|normalUmathrelordspacing|normalUmathrelopspacing|normalUmathrelopenspacing|normalUmathrelinnerspacing|normalUmathrelclosespacing|normalUmathrelbinspacing|normalUmathradicalvgap|normalUmathradicalrule|normalUmathradicalkern|normalUmathradicaldegreeraise|normalUmathradicaldegreebefore|normalUmathradicaldegreeafter|normalUmathquad|normalUmathpunctrelspacing|normalUmathpunctpunctspacing|normalUmathpunctordspacing|normalUmathpunctopspacing|normalUmathpunctopenspacing|normalUmathpunctinnerspacing|normalUmathpunctclosespacing|normalUmathpunctbinspacing|normalUmathoverdelimitervgap|normalUmathoverdelimiterbgap|normalUmathoverbarvgap|normalUmathoverbarrule|normalUmathoverbarkern|normalUmathordrelspacing|normalUmathordpunctspacing|normalUmathordordspacing|normalUmathordopspacing|normalUmathordopenspacing|normalUmathordinnerspacing|normalUmathordclosespacing|normalUmathordbinspacing|normalUmathoprelspacing|normalUmathoppunctspacing|normalUmathopordspacing|normalUmathopopspacing|normalUmathopopenspacing|normalUmathopinnerspacing|normalUmathoperatorsize|normalUmathopenrelspacing|normalUmathopenpunctspacing|normalUmathopenordspacing|normalUmathopenopspacing|normalUmathopenopenspacing|normalUmathopeninnerspacing|normalUmathopenclosespacing|normalUmathopenbinspacing|normalUmathopclosespacing|normalUmathopbinspacing|normalUmathnolimitsupfactor|normalUmathnolimitsubfactor|normalUmathlimitbelowvgap|normalUmathlimitbelowkern|normalUmathlimitbelowbgap|normalUmathlimitabovevgap|normalUmathlimitabovekern|normalUmathlimitabovebgap|normalUmathinnerrelspacing|normalUmathinnerpunctspacing|normalUmathinnerordspacing|normalUmathinneropspacing|normalUmathinneropenspacing|normalUmathinnerinnerspacing|normalUmathinnerclosespacing|normalUmathinnerbinspacing|normalUmathfractionrule|normalUmathfractionnumvgap|normalUmathfractionnumup|normalUmathfractiondenomvgap|normalUmathfractiondenomdown|normalUmathfractiondelsize|normalUmathconnectoroverlapmin|normalUmathcodenum|normalUmathcode|normalUmathcloserelspacing|normalUmathclosepunctspacing|normalUmathcloseordspacing|normalUmathcloseopspacing|normalUmathcloseopenspacing|normalUmathcloseinnerspacing|normalUmathcloseclosespacing|normalUmathclosebinspacing|normalUmathcharslot|normalUmathcharnumdef|normalUmathcharnum|normalUmathcharfam|normalUmathchardef|normalUmathcharclass|normalUmathchar|normalUmathbinrelspacing|normalUmathbinpunctspacing|normalUmathbinordspacing|normalUmathbinopspacing|normalUmathbinopenspacing|normalUmathbininnerspacing|normalUmathbinclosespacing|normalUmathbinbinspacing|normalUmathaxis|normalUmathaccent|normalUleft|normalUhextensible|normalUdelimiterunder|normalUdelimiterover|normalUdelimiter|normalUdelcodenum|normalUdelcode|normalUchar|normalOmegaversion|normalOmegarevision|normalOmegaminorversion|normalAlephversion|normalAlephrevision|normalAlephminorversion|normal |nonstopmode|nonscript|nolimits|noligs|nokerns|noindent|nohrule|noexpand|noboundary|noalign|newlinechar|mutoglue|muskipdef|muskip|multiply|muexpr|mskip|moveright|moveleft|month|mkern|middle|message|medmuskip|meaning|maxdepth|maxdeadcycles|mathsurroundskip|mathsurroundmode|mathsurround|mathstyle|mathscriptsmode|mathscriptcharmode|mathscriptboxmode|mathrulethicknessmode|mathrulesmode|mathrulesfam|mathrel|mathpunct|mathpenaltiesmode|mathord|mathopen|mathop|matholdmode|mathnolimitsmode|mathitalicsmode|mathinner|mathflattenmode|matheqnogapstep|mathdisplayskipmode|mathdirection|mathdelimitersmode|mathcode|mathclose|mathchoice|mathchardef|mathchar|mathbin|mathaccent|marks|mark|mag|luatexversion|luatexrevision|luatexbanner|luafunctioncall|luafunction|luaescapestring|luadef|luacopyinputnodes|luabytecodecall|luabytecode|lpcode|lowercase|lower|looseness|long|localrightbox|localleftbox|localinterlinepenalty|localbrokenpenalty|lineskiplimit|lineskip|linepenalty|linedirection|limits|letprotected|letfrozen|letcharcode|let|leqno|leftskip|leftmarginkern|lefthyphenmin|leftghost|left|leaders|lccode|lastskip|lastpenalty|lastnodetype|lastnodesubtype|lastnamedcs|lastlinefit|lastkern|lastbox|language|kern|jobname|internalcodesmode|interlinepenalty|interlinepenalties|interactionmode|insertpenalties|insertht|insert|inputlineno|input|initcatcodetable|indent|immediateassignment|immediateassigned|ignorespaces|ignorepars|ifx|ifvoid|ifvmode|ifvbox|ifusercmd|iftrue|iftok|ifprotected|ifpdfprimitive|ifpdfabsnum|ifpdfabsdim|ifodd|ifnumval|ifnum|ifmmode|ifinner|ifincsname|ifhmode|ifhbox|iffrozen|iffontchar|iffalse|ifeof|ifdimval|ifdim|ifdefined|ifcstok|ifcsname|ifcondition|ifcmpnum|ifcmpdim|ifchknum|ifchkdim|ifcat|ifcase|ifabsnum|ifabsdim|if|hyphenpenaltymode|hyphenpenalty|hyphenchar|hyphenationmin|hyphenationbounds|hyphenation|ht|hss|hskip|hsize|hrule|hpack|holdinginserts|hoffset|hjcode|hfuzz|hfilneg|hfill|hfil|hbox|hbadness|hangindent|hangafter|halign|gtokspre|gtoksapp|glyphdatafield|gluetomu|gluestretchorder|gluestretch|glueshrinkorder|glueshrink|glueexpr|globaldefs|global|gleaders|gdef|futurelet|futureexpandisap|futureexpandis|futureexpand|frozen|formatname|fontname|fontid|fontdimen|fontcharwd|fontcharic|fontcharht|fontchardp|font|floatingpenalty|fixupboxesmode|firstvalidlanguage|firstmarks|firstmark|finalhyphendemerits|fi|fam|explicithyphenpenalty|explicitdiscretionary|expandafter|exhyphenpenalty|exhyphenchar|exceptionpenalty|everyvbox|everytab|everypar|everymath|everyjob|everyhbox|everyeof|everydisplay|everycr|etokspre|etoksapp|escapechar|errorstopmode|errorcontextlines|errmessage|errhelp|eqno|endlocalcontrol|endlinechar|endinput|endgroup|endcsname|end|emergencystretch|else|efcode|edef|dump|dp|doublehyphendemerits|divide|displaywidth|displaywidowpenalty|displaywidowpenalties|displaystyle|displaylimits|displayindent|discretionary|directlua|dimexpr|dimendef|dimen|detokenize|delimitershortfall|delimiterfactor|delimiter|delcode|defaultskewchar|defaulthyphenchar|def|deadcycles|day|currentiftype|currentiflevel|currentifbranch|currentgrouptype|currentgrouplevel|csstring|csname|crcr|crampedtextstyle|crampedscriptstyle|crampedscriptscriptstyle|crampeddisplaystyle|cr|countdef|count|copy|compoundhyphenmode|clubpenalty|clubpenalties|closein|clearmarks|cleaders|chardef|char|catcodetable|catcode|brokenpenalty|breakafterdirmode|boxyoffset|boxymove|boxxoffset|boxxmove|boxtotal|boxorientation|boxmaxdepth|boxdirection|boxattr|box|boundary|botmarks|botmark|binoppenalty|belowdisplayskip|belowdisplayshortskip|beginlocalcontrol|begingroup|begincsname|batchmode|baselineskip|badness|automatichyphenpenalty|automatichyphenmode|automaticdiscretionary|attributedef|attribute|atopwithdelims|atop|aligntab|alignmark|aftergrouped|aftergroup|afterassignment|advance|adjustspacingstretch|adjustspacingstep|adjustspacingshrink|adjustspacing|adjdemerits|accent|abovewithdelims|abovedisplayskip|abovedisplayshortskip|above|XeTeXversion|Uvextensible|Uunderdelimiter|Usuperscript|Usubscript|Ustopmath|Ustopdisplaymath|Ustartmath|Ustartdisplaymath|Ustack|Uskewedwithdelims|Uskewed|Uroot|Uright|Uradical|Uoverdelimiter|Unosuperscript|Unosubscript|Umiddle|Umathunderdelimitervgap|Umathunderdelimiterbgap|Umathunderbarvgap|Umathunderbarrule|Umathunderbarkern|Umathsupsubbottommax|Umathsupshiftup|Umathsupshiftdrop|Umathsupbottommin|Umathsubtopmax|Umathsubsupvgap|Umathsubsupshiftdown|Umathsubshiftdrop|Umathsubshiftdown|Umathstackvgap|Umathstacknumup|Umathstackdenomdown|Umathspaceafterscript|Umathskewedfractionvgap|Umathskewedfractionhgap|Umathrelrelspacing|Umathrelpunctspacing|Umathrelordspacing|Umathrelopspacing|Umathrelopenspacing|Umathrelinnerspacing|Umathrelclosespacing|Umathrelbinspacing|Umathradicalvgap|Umathradicalrule|Umathradicalkern|Umathradicaldegreeraise|Umathradicaldegreebefore|Umathradicaldegreeafter|Umathquad|Umathpunctrelspacing|Umathpunctpunctspacing|Umathpunctordspacing|Umathpunctopspacing|Umathpunctopenspacing|Umathpunctinnerspacing|Umathpunctclosespacing|Umathpunctbinspacing|Umathoverdelimitervgap|Umathoverdelimiterbgap|Umathoverbarvgap|Umathoverbarrule|Umathoverbarkern|Umathordrelspacing|Umathordpunctspacing|Umathordordspacing|Umathordopspacing|Umathordopenspacing|Umathordinnerspacing|Umathordclosespacing|Umathordbinspacing|Umathoprelspacing|Umathoppunctspacing|Umathopordspacing|Umathopopspacing|Umathopopenspacing|Umathopinnerspacing|Umathoperatorsize|Umathopenrelspacing|Umathopenpunctspacing|Umathopenordspacing|Umathopenopspacing|Umathopenopenspacing|Umathopeninnerspacing|Umathopenclosespacing|Umathopenbinspacing|Umathopclosespacing|Umathopbinspacing|Umathnolimitsupfactor|Umathnolimitsubfactor|Umathlimitbelowvgap|Umathlimitbelowkern|Umathlimitbelowbgap|Umathlimitabovevgap|Umathlimitabovekern|Umathlimitabovebgap|Umathinnerrelspacing|Umathinnerpunctspacing|Umathinnerordspacing|Umathinneropspacing|Umathinneropenspacing|Umathinnerinnerspacing|Umathinnerclosespacing|Umathinnerbinspacing|Umathfractionrule|Umathfractionnumvgap|Umathfractionnumup|Umathfractiondenomvgap|Umathfractiondenomdown|Umathfractiondelsize|Umathconnectoroverlapmin|Umathcodenum|Umathcode|Umathcloserelspacing|Umathclosepunctspacing|Umathcloseordspacing|Umathcloseopspacing|Umathcloseopenspacing|Umathcloseinnerspacing|Umathcloseclosespacing|Umathclosebinspacing|Umathcharslot|Umathcharnumdef|Umathcharnum|Umathcharfam|Umathchardef|Umathcharclass|Umathchar|Umathbinrelspacing|Umathbinpunctspacing|Umathbinordspacing|Umathbinopspacing|Umathbinopenspacing|Umathbininnerspacing|Umathbinclosespacing|Umathbinbinspacing|Umathaxis|Umathaccent|Uleft|Uhextensible|Udelimiterunder|Udelimiterover|Udelimiter|Udelcodenum|Udelcode|Uchar|Omegaversion|Omegarevision|Omegaminorversion|Alephversion|Alephrevision|Alephminorversion| )(?=[^a-zA-Z])",
+ "name" : "context.primitive.commands.primitive.tex"
+ },
+ "reserved" : {
+ "match" : "\u005C\u005C(\u005C?\u005C?|[a-z]\u005C!)[a-zA-Z\u005C_@!?-ÿ]+",
+ "name" : "context.reserved.commands.reserved.tex"
+ },
+ "special" : {
+ "match" : "\u005C]|\u005C[|>|=|<|\u005C)|\u005C(|#|\u005C\u0022",
+ "name" : "context.special.symbols.special.tex"
+ },
+ "subsystem_prefix" : {
+ "match" : "\u005C\u005C(btx|xml)[a-z]+",
+ "name" : "context.embedded.subsystem.prefix.tex"
+ },
+ "subsystem_suffix" : {
+ "match" : "\u005C\u005C[a-z]+(btx|xml)[a-z]*",
+ "name" : "context.embedded.subsystem.suffix.tex"
+ }
+ },
+ "scopeName" : "source.context.tex",
+ "version" : "1.0.0"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-xml.json b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-xml.json
new file mode 100644
index 00000000000..945647169e6
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/syntaxes/context-syntax-xml.json
@@ -0,0 +1,222 @@
+{
+ "name" : "context.xml",
+ "patterns" : [
+ {
+ "include" : "#comment"
+ },
+ {
+ "include" : "#cdata"
+ },
+ {
+ "include" : "#instruction_xml"
+ },
+ {
+ "include" : "#instruction_lua"
+ },
+ {
+ "include" : "#instruction"
+ },
+ {
+ "include" : "#close"
+ },
+ {
+ "include" : "#open"
+ },
+ {
+ "include" : "#element_error"
+ },
+ {
+ "include" : "#entity"
+ }
+ ],
+ "repository" : {
+ "attribute_double" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.plain.attribute.double.namespace.xml"
+ },
+ "2" : {
+ "name" : "context.constant.attribute.double.name.xml"
+ },
+ "3" : {
+ "name" : "context.special.attribute.double.open.xml"
+ },
+ "4" : {
+ "name" : "context.string.attribute.double.text.xml"
+ },
+ "5" : {
+ "name" : "context.special.attribute.double.close.xml"
+ }
+ },
+ "match" : "((?:[-\u005Cw.]+:)?)([-\u005Cw.:]+)\u005Cs*=\u005Cs*(\u0022)((?:\u005C\u005C\u0022|[^\u0022])*)(\u0022)"
+ },
+ "attribute_single" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.plain.attribute.single.namespace.xml"
+ },
+ "2" : {
+ "name" : "context.constant.attribute.single.name.xml"
+ },
+ "3" : {
+ "name" : "context.special.attribute.single.open.xml"
+ },
+ "4" : {
+ "name" : "context.string.attribute.single.text.xml"
+ },
+ "5" : {
+ "name" : "context.special.attribute.single.close.xml"
+ }
+ },
+ "match" : "((?:[-\u005Cw.]+:)?)([-\u005Cw.:]+)\u005Cs*=\u005Cs*(')((?:\u005C\u005C'|[^'])*)(')"
+ },
+ "attributes" : {
+ "patterns" : [
+ {
+ "include" : "#attribute_double"
+ },
+ {
+ "include" : "#attribute_single"
+ }
+ ]
+ },
+ "cdata" : {
+ "begin" : "<!\u005C[CDATA\u005C[",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.command.cdata.open.xml"
+ }
+ },
+ "end" : "]]>",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.command.cdata.close.xml"
+ }
+ },
+ "name" : "context.default.cdata.text.xml"
+ },
+ "close" : {
+ "captures" : {
+ "1" : {
+ "name" : "context.keyword.close.open.xml"
+ },
+ "2" : {
+ "name" : "context.plain.close.namespace.xml"
+ },
+ "3" : {
+ "name" : "context.keyword.close.name.xml"
+ },
+ "4" : {
+ "name" : "context.keyword.close.close.xml"
+ }
+ },
+ "match" : "(</)((?:[-\u005Cw.]+:)?)([-\u005Cw.:]+)\u005Cs*(>)"
+ },
+ "comment" : {
+ "begin" : "<!--",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.command.comment.open.xml"
+ }
+ },
+ "end" : "-->",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.command.comment.close.xml"
+ }
+ },
+ "name" : "context.comment.comment.text.xml"
+ },
+ "element_error" : {
+ "match" : "<?:([^>]*)>",
+ "name" : "context.error.error.xml"
+ },
+ "entity" : {
+ "match" : "&.*?;",
+ "name" : "context.constant.entity.xml"
+ },
+ "instruction" : {
+ "begin" : "<\u005C?[-\u005Cw.:]+",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.command.instruction.open.xml"
+ }
+ },
+ "end" : "\u005C?>",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.command.instruction.close.xml"
+ }
+ },
+ "name" : "context.default.instruction.text.xml"
+ },
+ "instruction_lua" : {
+ "begin" : "<\u005C?lua",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.command.instruction.lua.open.xml"
+ }
+ },
+ "end" : "\u005C?>",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.command.instruction.lua.close.xml"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "source.context.cld"
+ }
+ ]
+ },
+ "instruction_xml" : {
+ "begin" : "<\u005C?xml",
+ "beginCaptures" : {
+ "0" : {
+ "name" : "context.command.instruction.xml.open.xml"
+ }
+ },
+ "end" : "\u005C?>",
+ "endCaptures" : {
+ "0" : {
+ "name" : "context.command.instruction.xml.close.xml"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "#attributes"
+ }
+ ]
+ },
+ "open" : {
+ "begin" : "(<)((?:[-\u005Cw.]+:)?)([-\u005Cw.:]+)",
+ "beginCaptures" : {
+ "1" : {
+ "name" : "context.keyword.open.open.xml"
+ },
+ "2" : {
+ "name" : "context.plain.open.namespace.xml"
+ },
+ "3" : {
+ "name" : "context.keyword.open.name.xml"
+ }
+ },
+ "end" : "(/?)(>)",
+ "endCaptures" : {
+ "1" : {
+ "name" : "context.keyword.open.empty.xml"
+ },
+ "2" : {
+ "name" : "context.keyword.open.close.xml"
+ }
+ },
+ "patterns" : [
+ {
+ "include" : "#attributes"
+ }
+ ]
+ }
+ },
+ "scopeName" : "source.context.xml",
+ "version" : "1.0.0"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/tasks/context.json b/Master/texmf-dist/context/data/vscode/extensions/context/tasks/context.json
new file mode 100644
index 00000000000..13f75c18839
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/tasks/context.json
@@ -0,0 +1,73 @@
+{
+ "name" : "context",
+ "tasks" : [
+ {
+ "command" : "context --autogenerate --autopdf ${file}",
+ "group" : "build",
+ "label" : "process tex file",
+ "presentation" : {
+ "clear" : true,
+ "echo" : true,
+ "focus" : false,
+ "panel" : "shared",
+ "reveal" : "always",
+ "showReuseMessage" : false
+ },
+ "type" : "shell",
+ "windows" : {
+ "command" : "chcp 65001 ; context.exe --autogenerate --autopdf ${file}"
+ }
+ },
+ {
+ "command" : "mtxrun --autogenerate --script check ${file}",
+ "group" : "build",
+ "label" : "check tex file",
+ "presentation" : {
+ "clear" : true,
+ "echo" : true,
+ "focus" : false,
+ "panel" : "shared",
+ "reveal" : "always",
+ "showReuseMessage" : false
+ },
+ "type" : "shell",
+ "windows" : {
+ "command" : "chcp 65001 ; mtxrun.exe --autogenerate --script check ${file}"
+ }
+ },
+ {
+ "command" : "mtxrun --script fonts --reload --force",
+ "group" : "build",
+ "label" : "identify fonts",
+ "presentation" : {
+ "clear" : true,
+ "echo" : true,
+ "focus" : false,
+ "panel" : "shared",
+ "reveal" : "always",
+ "showReuseMessage" : false
+ },
+ "type" : "shell",
+ "windows" : {
+ "command" : "chcp 65001 ; mtxrun.exe --script fonts --reload --force"
+ }
+ },
+ {
+ "command" : "mtxrun --script ${file}",
+ "group" : "build",
+ "label" : "process lua file",
+ "presentation" : {
+ "clear" : true,
+ "echo" : true,
+ "focus" : false,
+ "panel" : "shared",
+ "reveal" : "always",
+ "showReuseMessage" : false
+ },
+ "type" : "shell",
+ "windows" : {
+ "command" : "chcp 65001 ; mtxrun.exe --script ${file}"
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/themes/context.json b/Master/texmf-dist/context/data/vscode/extensions/context/themes/context.json
new file mode 100644
index 00000000000..3bdd52fe6bc
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/themes/context.json
@@ -0,0 +1,356 @@
+{
+ "$schema" : "vscode://schemas/color-theme",
+ "colors" : {
+ "activityBar.background" : "#000000",
+ "editor.background" : "#CFCFCF",
+ "editor.foreground" : "#000000",
+ "editor.lineHighlightBackground" : "#CFCFCF",
+ "editorBracketMatch.background" : "#CFCFCF",
+ "editorBracketMatch.border" : "#B07F00",
+ "editorIndentGuide.background" : "#CFCFCF",
+ "editorLineNumber.foreground" : "#000000",
+ "focusBorder" : "#000000",
+ "notification.background" : "#000000",
+ "sideBar.background" : "#A7A7A7",
+ "sideBar.border" : "#FFFFFF",
+ "sideBar.foreground" : "#000000",
+ "sideBarSectionHeader.background" : "#A7A7A7",
+ "sideBarSectionHeader.foreground" : "#000000",
+ "sideBarTitle.foreground" : "#000000",
+ "statusBar.background" : "#A7A7A7",
+ "statusBar.border" : "#FFFFFF",
+ "statusBar.debuggingBackground" : "#A7A7A7",
+ "statusBar.debuggingForeground" : "#000000",
+ "statusBar.foreground" : "#000000",
+ "statusBar.noFolderBackground" : "#A7A7A7",
+ "statusBar.noFolderForeground" : "#000000"
+ },
+ "name" : "context",
+ "tokenColors" : [
+ {
+ "scope" : "context.whitespace",
+ },
+ {
+ "scope" : "context.default",
+ "settings" : {
+ "foreground" : "#000000"
+ }
+ },
+ {
+ "scope" : "context.number",
+ "settings" : {
+ "foreground" : "#007F7F"
+ }
+ },
+ {
+ "scope" : "context.comment",
+ "settings" : {
+ "foreground" : "#7F7F00"
+ }
+ },
+ {
+ "scope" : "context.keyword",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#00007F"
+ }
+ },
+ {
+ "scope" : "context.string",
+ "settings" : {
+ "foreground" : "#7F007F"
+ }
+ },
+ {
+ "scope" : "context.error",
+ "settings" : {
+ "foreground" : "#7F0000"
+ }
+ },
+ {
+ "scope" : "context.label",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#7F0000"
+ }
+ },
+ {
+ "scope" : "context.nothing",
+ },
+ {
+ "scope" : "context.class",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#000000"
+ }
+ },
+ {
+ "scope" : "context.function",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#000000"
+ }
+ },
+ {
+ "scope" : "context.constant",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#007F7F"
+ }
+ },
+ {
+ "scope" : "context.operator",
+ "settings" : {
+ "foreground" : "#00007F"
+ }
+ },
+ {
+ "scope" : "context.regex",
+ "settings" : {
+ "foreground" : "#7F007F"
+ }
+ },
+ {
+ "scope" : "context.preprocessor",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#7F7F00"
+ }
+ },
+ {
+ "scope" : "context.tag",
+ "settings" : {
+ "foreground" : "#007F7F"
+ }
+ },
+ {
+ "scope" : "context.type",
+ "settings" : {
+ "foreground" : "#00007F"
+ }
+ },
+ {
+ "scope" : "context.variable",
+ "settings" : {
+ "foreground" : "#000000"
+ }
+ },
+ {
+ "scope" : "context.identifier",
+ },
+ {
+ "scope" : "context.linenumber",
+ "settings" : {
+ "background" : "#A7A7A7"
+ }
+ },
+ {
+ "scope" : "context.bracelight",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#B07F00"
+ }
+ },
+ {
+ "scope" : "context.bracebad",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#B07F00"
+ }
+ },
+ {
+ "scope" : "context.controlchar",
+ },
+ {
+ "scope" : "context.indentguide",
+ "settings" : {
+ "foreground" : "#A7A7A7"
+ }
+ },
+ {
+ "scope" : "context.calltip",
+ "settings" : {
+ "foreground" : "#FFFFFF"
+ }
+ },
+ {
+ "scope" : "context.invisible",
+ "settings" : {
+ "background" : "#B07F00"
+ }
+ },
+ {
+ "scope" : "context.quote",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#00007F"
+ }
+ },
+ {
+ "scope" : "context.special",
+ "settings" : {
+ "foreground" : "#00007F"
+ }
+ },
+ {
+ "scope" : "context.extra",
+ "settings" : {
+ "foreground" : "#7F7F00"
+ }
+ },
+ {
+ "scope" : "context.embedded",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#000000"
+ }
+ },
+ {
+ "scope" : "context.char",
+ "settings" : {
+ "foreground" : "#7F007F"
+ }
+ },
+ {
+ "scope" : "context.reserved",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#7F007F"
+ }
+ },
+ {
+ "scope" : "context.definition",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#000000"
+ }
+ },
+ {
+ "scope" : "context.okay",
+ "settings" : {
+ "foreground" : "#4F4F4F"
+ }
+ },
+ {
+ "scope" : "context.warning",
+ "settings" : {
+ "foreground" : "#B07F00"
+ }
+ },
+ {
+ "scope" : "context.standout",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#B07F00"
+ }
+ },
+ {
+ "scope" : "context.command",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#007F00"
+ }
+ },
+ {
+ "scope" : "context.internal",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#B07F00"
+ }
+ },
+ {
+ "scope" : "context.preamble",
+ "settings" : {
+ "foreground" : "#7F7F00"
+ }
+ },
+ {
+ "scope" : "context.grouping",
+ "settings" : {
+ "foreground" : "#7F0000"
+ }
+ },
+ {
+ "scope" : "context.primitive",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#00007F"
+ }
+ },
+ {
+ "scope" : "context.plain",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#4F4F4F"
+ }
+ },
+ {
+ "scope" : "context.user",
+ "settings" : {
+ "foreground" : "#007F00"
+ }
+ },
+ {
+ "scope" : "context.data",
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#007F7F"
+ }
+ },
+ {
+ "scope" : "context.text",
+ "settings" : {
+ "foreground" : "#000000"
+ }
+ },
+ {
+ "scope" : [ "emphasis" ],
+ "settings" : {
+ "fontStyle" : "italic"
+ }
+ },
+ {
+ "scope" : [ "strong" ],
+ "settings" : {
+ "fontStyle" : "bold"
+ }
+ },
+ {
+ "scope" : [ "comment" ],
+ "settings" : {
+ "foreground" : "#000000"
+ }
+ },
+ {
+ "scope" : [ "string" ],
+ "settings" : {
+ "foreground" : "#7F007F"
+ }
+ },
+ {
+ "scope" : [ "constant.numeric", "constant.language.null", "variable.language.this", "support.type.primitive", "support.function", "support.variable.dom", "support.variable.property", "support.variable.property", "meta.property-name", "meta.property-value", "support.constant.handlebars" ],
+ "settings" : {
+ "foreground" : "#007F7F"
+ }
+ },
+ {
+ "scope" : [ "keyword", "storage.modifier", "storage.type", "variable.parameter" ],
+ "settings" : {
+ "fontStyle" : "bold",
+ "foreground" : "#00007F"
+ }
+ },
+ {
+ "scope" : [ "entity.name.type", "entity.other.inherited-class", "meta.function-call", "entity.other.attribute-name", "entity.name.function.shell" ],
+ "settings" : {
+ "foreground" : "#000000"
+ }
+ },
+ {
+ "scope" : [ "entity.name.tag" ],
+ "settings" : {
+ "foreground" : "#000000"
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/vscode/extensions/context/vscode-context.readme b/Master/texmf-dist/context/data/vscode/extensions/context/vscode-context.readme
new file mode 100644
index 00000000000..dd7d37c8756
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/extensions/context/vscode-context.readme
@@ -0,0 +1,5 @@
+These files are generated. You can use these extensions with for instance:
+
+ code.exe --extensions-dir <someplace>/tex/texmf-context/context/data/vscode/extensions --install-extension context
+
+There are examples of scripts and keybindings too.
diff --git a/Master/texmf-dist/context/data/vscode/settings.json b/Master/texmf-dist/context/data/vscode/settings.json
new file mode 100644
index 00000000000..f2c9ddf3251
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/settings.json
@@ -0,0 +1,45 @@
+{
+ "window.zoomLevel": 2,
+ "editor.renderWhitespace": "all",
+ "telemetry.enableCrashReporter": false,
+ "telemetry.enableTelemetry": false,
+ "editor.fontFamily": "Dejavu Sans Mono, Consolas, 'Courier New', monospace",
+ "window.autoDetectHighContrast": false,
+ "zenMode.hideLineNumbers": false,
+ "zenMode.centerLayout": false,
+ "zenMode.fullScreen": false,
+ "zenMode.hideTabs": false,
+ "workbench.editor.showIcons": false,
+ "workbench.settings.enableNaturalLanguageSearch": false,
+ "window.enableMenuBarMnemonics": false,
+ "search.location": "panel",
+ "breadcrumbs.enabled": false,
+ "workbench.activityBar.visible": false,
+ "editor.minimap.enabled": false,
+ "workbench.iconTheme": null,
+ "extensions.ignoreRecommendations": true,
+ "editor.renderControlCharacters": true,
+ "terminal.integrated.scrollback": 5000,
+ "workbench.colorTheme": "ConTeXt",
+ // "[context.pdf]": { "files.encoding": "cp1252"},
+ "terminal.integrated.fontSize": 10,
+ "terminal.integrated.rendererType": "dom",
+ "workbench.colorCustomizations": {
+ "terminal.ansiBlack": "#000000",
+ "terminal.ansiWhite": "#FFFFFF",
+ "terminal.ansiRed": "#7F0000",
+ "terminal.ansiGreen": "#007F00",
+ "terminal.ansiBlue": "#00007F",
+ "terminal.ansiMagenta": "#7F007F",
+ "terminal.ansiCyan": "#007F7F",
+ "terminal.ansiYellow": "#7F7F00",
+ "terminal.ansiBrightBlack": "#000000",
+ "terminal.ansiBrightWhite": "#FFFFFF",
+ "terminal.ansiBrightRed": "#7F0000",
+ "terminal.ansiBrightGreen": "#007F00",
+ "terminal.ansiBrightBlue": "#00007F",
+ "terminal.ansiBrightMagenta": "#7F007F",
+ "terminal.ansiBrightCyan": "#007F7F",
+ "terminal.ansiBrightYellow": "#7F7F00",
+ }
+}
diff --git a/Master/texmf-dist/context/data/vscode/vscode-context.cmd b/Master/texmf-dist/context/data/vscode/vscode-context.cmd
new file mode 100644
index 00000000000..c6e1a89ce73
--- /dev/null
+++ b/Master/texmf-dist/context/data/vscode/vscode-context.cmd
@@ -0,0 +1,7 @@
+@echo off
+
+rem chcp 65001
+
+rem I need to figure out how to detach the instance
+
+start "vs code context" code --ignore-gpu-blacklist --reuse-window --extensions-dir %~dp0\extensions --install-extension context %* 2>&1 nul
diff --git a/Master/texmf-dist/doc/context/documents/general/leaflets/leaflet-context.pdf b/Master/texmf-dist/doc/context/documents/general/leaflets/leaflet-context.pdf
new file mode 100644
index 00000000000..1f7afe97fe8
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/leaflets/leaflet-context.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/leaflets/leaflet-luametatex.pdf b/Master/texmf-dist/doc/context/documents/general/leaflets/leaflet-luametatex.pdf
new file mode 100644
index 00000000000..551b9ba8eb0
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/leaflets/leaflet-luametatex.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/leaflets/leaflet-mixing.pdf b/Master/texmf-dist/doc/context/documents/general/leaflets/leaflet-mixing.pdf
new file mode 100644
index 00000000000..a023f9e881e
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/leaflets/leaflet-mixing.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/magazines/mag-1104-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/magazines/mag-1104-mkiv.pdf
new file mode 100644
index 00000000000..523ba75b225
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/magazines/mag-1104-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/bidi.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/bidi.pdf
index feec5913e0f..8485f05c7c3 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/bidi.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/bidi.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/ecmascript-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/ecmascript-mkiv.pdf
new file mode 100644
index 00000000000..308dfda7858
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/ecmascript-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/evenmore.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/evenmore.pdf
new file mode 100644
index 00000000000..5c40721927c
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/evenmore.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/followingup.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/followingup.pdf
new file mode 100644
index 00000000000..4c2f2729167
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/followingup.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/fonts/fonts-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/fonts-mkiv.pdf
index d388df3e9ef..d388df3e9ef 100644
--- a/Master/texmf-dist/doc/context/documents/general/fonts/fonts-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/fonts-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/libraries-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/libraries-mkiv.pdf
index f5a1e27f18c..aa18726e338 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/libraries-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/libraries-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-boxes.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-boxes.pdf
new file mode 100644
index 00000000000..305e6bebab0
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-boxes.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-conditionals.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-conditionals.pdf
new file mode 100644
index 00000000000..5e3d82ceef7
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-conditionals.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-expansion.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-expansion.pdf
new file mode 100644
index 00000000000..8628f48962a
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-expansion.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-registers.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-registers.pdf
new file mode 100644
index 00000000000..d00daa0cc43
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-registers.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/luametafun.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/luametafun.pdf
new file mode 100644
index 00000000000..fa15b985d87
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/luametafun.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/luametatex.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/luametatex.pdf
new file mode 100644
index 00000000000..95e7786feb3
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/luametatex.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/luatex.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/luatex.pdf
index 5c9a8f3b176..553b1613dfc 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/luatex.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/luatex.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/musings.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/musings.pdf
index 9d83dd55541..26b421a03e7 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/musings.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/musings.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/sql-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/sql-mkiv.pdf
index 09e63bcc8ed..57f6a9dc06f 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/sql-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/sql-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/svg-lmtx.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/svg-lmtx.pdf
new file mode 100644
index 00000000000..0f08cae516d
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/svg-lmtx.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/workflows-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/workflows-mkiv.pdf
index 1d34669e2be..b63ecd05460 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/workflows-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/workflows-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/xml-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/xml-mkiv.pdf
index 6508f2eccbe..bd538c2153a 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/xml-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/xml-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-cs.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-cs.pdf
index 3d1e4f5de67..7c2f664f6ba 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-cs.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-cs.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-de.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-de.pdf
index df9f4f12252..09a121ef8a1 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-de.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-de.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-en.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-en.pdf
index c4450ad71c7..a877fa0eafc 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-en.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-en.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-fr.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-fr.pdf
index 6b5603f4fc5..c5dfbf669cf 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-fr.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-fr.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-it.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-it.pdf
index 86359572b55..dcafda14a27 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-it.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-it.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-cs.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-cs.pdf
index 3883ae49e46..8e2ac2e8415 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-cs.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-cs.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-de.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-de.pdf
index 58e98cfe203..f37ea8a163e 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-de.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-de.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-en.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-en.pdf
index 5fee547d283..780de383410 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-en.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-en.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-fr.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-fr.pdf
index 1b8d7be739a..2cb28142152 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-fr.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-fr.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-it.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-it.pdf
index 5714fef3171..75f5974833b 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-it.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-it.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-nl.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-nl.pdf
index 4d776ed86d6..039c02bd357 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-nl.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-nl.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-ro.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-ro.pdf
index f387f4c06b1..4f49185b54f 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-ro.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-ro.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-nl.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-nl.pdf
index d2567668843..e103267502f 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-nl.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-nl.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-ro.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-ro.pdf
index 5d0e026e676..36f50680a19 100644
--- a/Master/texmf-dist/doc/context/documents/general/qrcs/setup-ro.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-ro.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/bachotex/2017/bachotex-2017-emoji-demo.pdf b/Master/texmf-dist/doc/context/presentations/bachotex/2017/bachotex-2017-emoji-demo.pdf
index cce61e1b3cd..0e06de65834 100644
--- a/Master/texmf-dist/doc/context/presentations/bachotex/2017/bachotex-2017-emoji-demo.pdf
+++ b/Master/texmf-dist/doc/context/presentations/bachotex/2017/bachotex-2017-emoji-demo.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/bachotex/2017/bachotex-2017-emoji.pdf b/Master/texmf-dist/doc/context/presentations/bachotex/2017/bachotex-2017-emoji.pdf
index d7e01f59c5a..5ee1d20c5ba 100644
--- a/Master/texmf-dist/doc/context/presentations/bachotex/2017/bachotex-2017-emoji.pdf
+++ b/Master/texmf-dist/doc/context/presentations/bachotex/2017/bachotex-2017-emoji.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/bachotex/2019/bachotex-2019-followingup.pdf b/Master/texmf-dist/doc/context/presentations/bachotex/2019/bachotex-2019-followingup.pdf
new file mode 100644
index 00000000000..17fdcab9379
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/bachotex/2019/bachotex-2019-followingup.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/bachotex/2019/bachotex-2019-followingup.tex b/Master/texmf-dist/doc/context/presentations/bachotex/2019/bachotex-2019-followingup.tex
new file mode 100644
index 00000000000..b7c116ab3fd
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/bachotex/2019/bachotex-2019-followingup.tex
@@ -0,0 +1,302 @@
+% language=uk
+
+\usemodule[abbreviations-smallcaps]
+\usemodule[present-luatex]
+
+\logo [LUAMETATEX] {LuaMeta\TeX}
+
+\setupbodyfont[12pt]
+
+\setupalign[verytolerant]
+
+\setupdocument
+ [title={The follow up},
+ subtitle={\LUAMETATEX},
+ location={Bacho\TeX\ May 2019},
+ author={Hans & Alan},
+ mp:title={\LUAMETATEX}]
+
+\startdocument
+
+\page \setupdocument[mp:subtitle={From lead to gold}]
+
+\startitemize
+ \startitem
+ This talk is {\bf not} about how we can use \LUATEX\ to control domotica
+ applications. We already discussed that.
+ \stopitem
+ \startitem
+ This talk is {\bf not} about how we can use \CONTEXT\ in advanced
+ rendering, for instance as part of web|-|based workflows. That's old
+ news.
+ \stopitem
+ \startitem
+ This talk is {\bf not} about how much fun it would be to have a
+ \MICROSOFT\ HoloLens and see what \CONTEXT\ and \LUATEX\ could do with
+ it. We just can't afford it.
+ \stopitem
+ \startitem
+ This talk is {\bf not} about more complexity, but it is about keeping
+ things simple. It's about turning a burden into a pleasure.
+ \stopitem
+ \startitem
+ To quote the Riverside \footnote {A Polish progrock band I recently saw
+ live in the Netherlands. A band related to Lunatic Soul.} frontman: I
+ hope you all leave here a bit younger than you felt when you came here.
+ This talk is about turning lead into gold.
+ \stopitem
+\stopitemize
+
+\page \setupdocument[mp:subtitle={Where do we stand}]
+
+\startitemize
+ \startitem
+ We have the weight and experience of about 40 years of \TEX\ and its
+ usage on our shoulders.
+ \stopitem
+ \startitem
+ Good old \TEX\ got extended: \ETEX, \OMEGA\ (\ALEPH), \PDFTEX, \XETEX,
+ [e][u][p]\TEX\ and \LUATEX\ (& \LUAJITTEX) showed up.
+ \stopitem
+ \startitem
+ The \DVI\ output got complemented by \PDF.
+ \stopitem
+ \startitem
+ Bitmap fonts were replaced by \TYPEONE\ that itself got replaced by the
+ container formats \OPENTYPE\ and \TRUETYPE. Variable fonts were
+ introduced.
+ \stopitem
+ \startitem
+ Math got upgraded to \OPENTYPE\ math, thanks to \MICROSOFT.
+ \stopitem
+ \startitem
+ \UNICODE\ got accepted and \UTF\ is nowadays the preferred input
+ encoding.
+ \stopitem
+ \startitem
+ The community supported the development of many fonts that found their
+ place in distributions.
+ \stopitem
+ \startitem
+ Alongside plain \TEX\ the macro packages \LATEX\ and \CONTEXT\ both
+ evolved into large collections of resources.
+ \stopitem
+\stopitemize
+
+\page \setupdocument[mp:subtitle={Are we good?}]
+
+\startitemize
+ \startitem
+ There is no doubt that \TEX\ is a success. We can find nice examples but
+ also some horrible looking documents.
+ \stopitem
+ \startitem
+ A large distribution is no guarantee for quality and continuous success,
+ nor is the number of incidental (forced) users.
+ \stopitem
+ \startitem
+ A \CONTEXT\ user doesn't need that much: just the \LUATEX\ binary will
+ do, plus a bunch of \MKIV\ macros, completed by a reasonable set of
+ fonts.
+ \stopitem
+ \startitem
+ Currently all that is embedded in a large ecosystem, although we always
+ use only a small, reasonable subset.
+ \stopitem
+ \startitem
+ Getting the whole machinery up and running from scratch (source code) is
+ not trivial.
+ \stopitem
+ \startitem
+ The source code base is rather large and compilation is complex: it builds on
+ decades of being nice for all platforms and fulfilling all demands.
+ \stopitem
+ \startitem
+ What we consider gold could also be seen as lead in disguise. Some
+ alchemy might be needed to go back to where we came from.
+ \stopitem
+\stopitemize
+
+\page \setupdocument[mp:subtitle={The Status Quo}]
+
+\startitemize
+ \startitem
+ At some point you need to stabilize and for \LUATEX, version 1.10 is that
+ moment.
+ \stopitem
+ \startitem
+ But some ideas and experiments have been delayed because the engine was
+ already in use, also outside of \CONTEXT.
+ \stopitem
+ \startitem
+ Compatibility is a {\bf big} issue in the \TEX\ community (which is good)
+ so we're in a sort of a deadlock (which is bad).
+ \stopitem
+ \startitem
+ And we wanted to take a next step in \CONTEXT\ development. It's not
+ strictly necessary to make drastic changes, but we need to adapt.
+ \stopitem
+ \startitem
+ The question is how we can guarantee users a long|-|term stability of
+ the both macro package as well as the engine it runs on.
+ \stopitem
+\stopitemize
+
+\page \setupdocument[mp:subtitle={What Is Needed}]
+
+\startitemize
+ \startitem
+ For \CONTEXT\ we want just one binary. We don't really need \LUAJITTEX\
+ for \LUAJIT\ is not following \LUA\ anyway.
+ \stopitem
+ \startitem
+ We don't want (for windows) a special stub binary. After all we already
+ have the \type {context} job manager and \type {mtxrun} script manager.
+ All platforms should be treated alike.
+ \stopitem
+ \startitem
+ Performance should be stable and not influenced by code added to the
+ binary. In fact, performance should constantly improve!
+ \stopitem
+ \startitem
+ The engine should not depend on libraries that are floating, get updated
+ frequently, and can come from places out of our control (versions).
+ \stopitem
+ \startitem
+ The memory footprint should be acceptable for running in containers (or
+ small virtual machines). Energy consumption matters too.
+ \stopitem
+ \startitem
+ The binary should be kept small because it also serves as the \LUA\
+ interpreter.
+ \stopitem
+\stopitemize
+
+\page \setupdocument[mp:subtitle={How It Went}]
+
+\startitemize
+ \startitem
+ Around the \CONTEXT\ meeting I took \LUATEX\ 1.09.0 experimental as
+ starting point and began stripping.
+ \stopitem
+ \startitem
+ Before that, I already had written some test code to see what could be
+ replaced.
+ \stopitem
+ \startitem
+ Stepwise redundant components were removed. This took time because each
+ (small) step was tested on real documents, the test suite, etc.
+ \stopitem
+ \blank[2*big]
+ \startitem
+ \unknown\ maybe some examples & \type {/install-lmtx/*} \unknown
+ \stopitem
+ \blank[2*big]
+ \startitem
+ I played with some ideas that were put on hold, some were accepted and
+ some were rejected and more and more got in the mood.
+ \stopitem
+ \startitem
+ Also \LUAJIT\ was dropped, but its removal was compensated by large
+ performance boosts in other areas.
+ \stopitem
+ \startitem
+ The build was simplified (it took some time to find what was irrelevant)
+ and compilation now is about half a minute, or less!
+ \stopitem
+\stopitemize
+
+% we found out the hard way in the past (generalizing, other use, backfire)
+
+\page \setupdocument[mp:subtitle={Where are we}]
+
+\startitemize
+ \startitem
+ We have an experimental new installer for \CONTEXT\ \LMTX\ (the new
+ name). It uses \HTTP: and just the engine for fetching data. Updating
+ goes fast.
+ \stopitem
+ \startitem
+ The \LMTX\ distribution is \MKIV\ only and much smaller than the full
+ installation.
+ \stopitem
+ \startitem
+ Eventually (soon) the source code of the used engine will be in the
+ distribution so that we have a self contained package. Users on
+ new or unique systems can compile.
+ \stopitem
+ \startitem
+ The development of the engine is under control of the \CONTEXT\
+ developers: that way there is no danger that things break. We like to
+ have a playground.
+ \stopitem
+ \startitem
+ Extensions can make it into \LUATEX\ once found useful and stable as
+ long as they don't break \LUATEX\ upward compatibility (unlikely on the
+ short term).
+ \stopitem
+\stopitemize
+
+\page \setupdocument[mp:subtitle={Some highlights}]
+
+\startitemize
+ \startitem
+ There is no backend code. We generate the \PDF\ output in \LUA\ (this was
+ already the case for much of it.)
+ \stopitem
+ \startitem
+ There is no bitmap image inclusion code present. All is done in \LUA.
+ \stopitem
+ \startitem
+ There is no font loading code present. This already happened mostly in
+ \LUA\ anyway.
+ \stopitem
+ \startitem
+ Some libraries have been removed and some have been simplified. A few
+ experimental helper libraries were added (like math). The dependencies
+ are minimal.
+ \stopitem
+ \startitem
+ The code is undergoing some restructuring but it might take some years
+ before I've reached the (informal) goals.
+ \stopitem
+ \startitem
+ Alan and I are exploring new possibilities that this setup gives
+ (especially in combining \TEX, \METAPOST\ and \LUA. Stay tuned.
+ \stopitem
+\stopitemize
+
+\page \setupdocument[mp:subtitle={The agenda}]
+
+\startitemize
+ \startitem
+ As of April 1, 2019, users can test the experimental distribution. A few
+ were already in the loop.
+ \stopitem
+ \startitem
+ It looks like there are no big issues, and speed gains can be impressive.
+ \stopitem
+ \startitem
+ As a consequence we can start dropping in replacement code in regular \MKIV\
+ some day soon too.
+ \stopitem
+ \startitem
+ Around the next \CONTEXT\ meeting the source code will become part of the
+ regular distribution (given that I'm satisfied with it).
+ \stopitem
+ \startitem
+ Before that we hope to have the compile farm up and running for \LUAMETATEX.
+ \stopitem
+ \startitem
+ From that moment on, the \CONTEXT\ users will have a self contained, archival,
+ independent, lean and mean installation available, which will become the
+ default.
+ \stopitem
+ \startitem
+ Because \LUAMETATEX\ is a subset of \LUATEX, there are no plans right now
+ for supporting plain \TEX. We'll see. (I might come up with generic
+ backend code some day.)
+ \stopitem
+\stopitemize
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-css-selectors.pdf b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-css-selectors.pdf
new file mode 100644
index 00000000000..d4575f0e7d1
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-css-selectors.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-css-selectors.tex b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-css-selectors.tex
new file mode 100644
index 00000000000..845206655cf
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-css-selectors.tex
@@ -0,0 +1,238 @@
+\usemodule[present-lines]
+
+\definecolor[maincolor][b=.4]
+
+\setuppapersize[A4][A4]
+
+\startdocument[title=CSS selectors,subtitle={\CONTEXT\ 2017 Maibach}]
+
+\startbuffer[selector-001]
+<?xml version="1.0" ?>
+
+<a>
+ <b class="one">b.one</b>
+ <b class="two">b.two</b>
+ <b class="one two">b.one.two</b>
+ <b class="three">b.three</b>
+ <b id="first">b#first</b>
+ <c>c</c>
+ <d>d e</d>
+ <e>d e</e>
+ <e>d e e</e>
+ <d>d f</d>
+ <f foo="bar">@foo = bar</f>
+ <f bar="foo">@bar = foo</f>
+ <f bar="foo1">@bar = foo1</f>
+ <f bar="foo2">@bar = foo2</f>
+ <f bar="foo3">@bar = foo3</f>
+ <f bar="foo+4">@bar = foo+4</f>
+ <g>g</g>
+ <g><gg><d>g gg d</d></gg></g>
+ <g><gg><f>g gg f</f></gg></g>
+ <g><gg><f class="one">g gg f.one</f></gg></g>
+ <g>g</g>
+ <g><gg><f class="two">g gg f.two</f></gg></g>
+ <g><gg><f class="three">g gg f.three</f></gg></g>
+ <g><f class="one">g f.one</f></g>
+ <g><f class="three">g f.three</f></g>
+ <h whatever="four five six">@whatever = four five six</h>
+</a>
+\stopbuffer
+
+\startbuffer[selector-002]
+<?xml version="1.0" ?>
+
+<document>
+ <title class="one" >title 1</title>
+ <title class="two" >title 2</title>
+ <title class="one" >title 3</title>
+ <title class="three">title 4</title>
+</document>
+\stopbuffer
+
+\startbuffer[selector-003]
+<?xml version="1.0" ?>
+
+<document>
+ <title class="one">title 1</title>
+ <subtitle class="sub">title 1.1</subtitle>
+ <title class="two">title 2</title>
+ <subtitle class="sub">title 2.1</subtitle>
+ <title class="one">title 3</title>
+ <subtitle class="sub">title 3.1</subtitle>
+ <title class="two">title 4</title>
+ <subtitle class="sub">title 4.1</subtitle>
+</document>
+\stopbuffer
+
+\xmlloadbuffer{selector-001}{selector-001}
+\xmlloadbuffer{selector-002}{selector-002}
+\xmlloadbuffer{selector-003}{selector-003}
+
+\startxmlsetups xml:selector:demo
+ \ignorespaces\xmlverbatim{#1}\par
+\stopxmlsetups
+
+\unexpanded\def\showCSSdemo#1#2%
+ {\blank
+ \textrule{\tttf#2}
+ \startlines
+ \dontcomplain
+ \tttf \obeyspaces
+ \xmlcommand{#1}{#2}{xml:selector:demo}
+ \stoplines
+ \blank}
+
+\startchapter[title=Needed or not?]
+
+\startitemize
+\startitem
+ used in \HTML\ styling
+\stopitem
+\startitem
+ a bit different from the path based method
+\stopitem
+\startitem
+ shortcuts for filtering by attribute
+\stopitem
+\startitem
+ class filtering is special because it checks for list
+\stopitem
+\startitem
+ one can select more at the same time
+\stopitem
+\startitem
+ performance is okay compared to path lookup
+\stopitem
+\startitem
+ selectors go between curly braces:
+ \starttyping
+ \xmlall {#1} {{foo bar .whatever, bar foo .whatever}}
+ \stoptyping
+\stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Supported methods]
+
+The following methods are supported:
+
+\starttabulate[|T||]
+\NC \type {element} \NC all tags element \NC \NR
+\NC \type {element-1 > element-2} \NC all tags element-2 with parent tag element-1 \NC \NR
+\NC \type {element-1 + element-2} \NC all tags element-2 preceded by tag element-1 \NC \NR
+\NC \type {element-1 ~ element-2} \NC all tags element-2 preceded by tag element-1 \NC \NR
+\NC \type {element-1 element-2} \NC all tags element-2 inside tag element-1 \NC \NR
+\NC \type {[attribute]} \NC has attribute \NC \NR
+\NC \type {[attribute=value]} \NC attribute equals value\NC \NR
+\NC \type {[attribute~=value]} \NC attribute contains value (space is separator) \NC \NR
+\NC \type {[attribute^="value"]} \NC attribute starts with value \NC \NR
+\NC \type {[attribute$="value"]} \NC attribute ends with value \NC \NR
+\NC \type {[attribute*="value"]} \NC attribute contains value \NC \NR
+\NC \type {.class} \NC has class \NC \NR
+\NC \expanded{\type {\letterhash id}} \NC has id \NC \NR
+\NC \type {:nth-child(n)} \NC the child at index n \NC \NR
+\NC \type {:nth-last-child(n)} \NC the child at index n from the end \NC \NR
+\NC \type {:first-child} \NC the first child \NC \NR
+\NC \type {:last-child} \NC the last child \NC \NR
+\NC \type {:nth-of-type(n)} \NC the match at index n \NC \NR
+\NC \type {:nth-last-of-type(n)} \NC the match at index n from the end \NC \NR
+\NC \type {:first-of-type} \NC the first match \NC \NR
+\NC \type {:last-of-type} \NC the last match \NC \NR
+\NC \type {:only-of-type} \NC the only match or nothing \NC \NR
+\NC \type {:only-child} \NC the only child or nothing \NC \NR
+\NC \type {:empty} \NC only when empty \NC \NR
+\NC \type {:root} \NC the whole tree \NC \NR
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=Filtering classes]
+
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{.one}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{.one, .two}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{.one, .two, \letterhash first}} \page
+
+\stopchapter
+
+\startchapter[title=Filtering attributes]
+
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{[foo], [bar=foo]}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{[bar\lettertilde=foo]}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{[bar\letterhat="foo"]}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{[whatever\lettertilde="five"]}} \page
+
+\stopchapter
+
+\startchapter[title=Combining methods]
+
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{g f .one, g f .three}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{g > f .one, g > f .three}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{d + e}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{d ~ e}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{d ~ e, g f .one, g f .three}} \page
+
+\stopchapter
+
+% \startchapter[title=Negation]
+
+% \typebuffer[selector-001] \showCSSdemo{selector-001}{{:not([whatever\lettertilde="five"])}} \page
+% \typebuffer[selector-001] \showCSSdemo{selector-001}{{:not(d)}} \page
+
+\stopchapter
+
+\startchapter[title=Child selectors]
+
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{a:nth-child(3)}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{a:nth-last-child(3)}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{g:nth-of-type(3)}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{g:nth-last-of-type(3)}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{a:first-child}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{a:last-child}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{e:first-of-type}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{gg d:only-of-type}} \page
+
+\stopchapter
+
+\startchapter[title=Simple formulas]
+
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{a:nth-child(even)}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{a:nth-child(odd)}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{a:nth-child(3n+1)}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{a:nth-child(2n+3)}} \page
+
+\stopchapter
+
+\startchapter[title=Special cases]
+
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{g:empty}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{g:root}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{*}} \page
+
+\stopchapter
+
+\startchapter[title=Combinations]
+
+\typebuffer[selector-001] \showCSSdemo{selector-001}{{g gg f .one}} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{g/gg/f[@class='one']} \page
+\typebuffer[selector-001] \showCSSdemo{selector-001}{g/{gg f .one}} \page
+
+\stopchapter
+
+\startchapter[title=Comparison (1)]
+
+\typebuffer[selector-002] \showCSSdemo{selector-002}{{document title .one, document title .three}} \page
+\typebuffer[selector-002] \showCSSdemo{selector-002}{/document/title[(@class='one') or (@class='three')]} \page
+
+\stopchapter
+
+\startchapter[title=Comparison (2)]
+
+\typebuffer[selector-003] \showCSSdemo{selector-003}{{document title .one + subtitle, document title .two + subtitle}}
+
+{\em A combined filter triggers a sorting pass!}
+
+\stopchapter
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-chaintest.pdf b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-chaintest.pdf
new file mode 100644
index 00000000000..1da70b355cd
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-chaintest.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-chaintest.tex b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-chaintest.tex
new file mode 100644
index 00000000000..58d1040f2a7
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-chaintest.tex
@@ -0,0 +1,49 @@
+\setupbodyfont[dejavu]
+
+\startluacode
+ fonts.handlers.otf.addfeature {
+ name = "chaintest",
+ type = "chainposition",
+ lookups = {
+ {
+ type = "pair",
+ data = {
+ A = { B = { { -30, 0, -50, 0 } } },
+ B = { C = { { -30, 0, -50, 0 } } },
+ },
+ },
+ {
+ type = "pair",
+ data = {
+ D = { E = { { -30, 0, -50, 0 } } },
+ },
+ },
+ },
+ data = {
+ rules = {
+ {
+ current = { { "A"}, { "B"}, { "C" }, { "D" }, { "E" }, { "F" } },
+ lookups = { false, false, false, 2 },
+ },
+ {
+ current = { { "A" }, { "B" }, { "C" } },
+ lookups = { 1, 1 },
+ },
+ },
+ }
+ }
+\stopluacode
+
+\starttext
+
+\definecolor[tgray][s=.5,t=.5,a=1] \showfontkerns \showglyphs
+
+\definefontfeature[chaintest] [mode=node,chaintest=yes]
+
+\definedfont[file:dejavu-serif.ttf*chaintest @ 48pt]
+
+\startTEXpage[offset=10pt,foregroundcolor=tgray]
+ ABCDEF
+\stopTEXpage
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-kerntest.pdf b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-kerntest.pdf
new file mode 100644
index 00000000000..5a8d0d38d49
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-kerntest.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-kerntest.tex b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-kerntest.tex
new file mode 100644
index 00000000000..795af8b5fb0
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-kerntest.tex
@@ -0,0 +1,25 @@
+\setupbodyfont[dejavu]
+
+\startluacode
+ fonts.handlers.otf.addfeature {
+ name = "kerntest",
+ type = "kern",
+ data = {
+ A = { B = -500 },
+ }
+ }
+\stopluacode
+
+\starttext
+
+\definecolor[tgray][s=.5,t=.5,a=1] \showfontkerns \showglyphs
+
+\definefontfeature[kerntest] [mode=node,kerntest=yes]
+
+\definedfont[file:dejavu-serif.ttf*kerntest @ 48pt]
+
+\startTEXpage[offset=10pt,foregroundcolor=tgray]
+ ABCDEF
+\stopTEXpage
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-pairtest.pdf b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-pairtest.pdf
new file mode 100644
index 00000000000..ba959e4f7a3
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-pairtest.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-pairtest.tex b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-pairtest.tex
new file mode 100644
index 00000000000..e84851e7d29
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-pairtest.tex
@@ -0,0 +1,26 @@
+\setupbodyfont[dejavu]
+
+\startluacode
+ fonts.handlers.otf.addfeature {
+ name = "pairtest",
+ type = "pair",
+ data = {
+ A = { B = { { -30, 50, -50, 0 } } },
+ B = { C = { { -30, 0, -50, 0 } } },
+ }
+ }
+\stopluacode
+
+\starttext
+
+\definecolor[tgray][s=.5,t=.5,a=1] \showfontkerns \showglyphs
+
+\definefontfeature[pairtest] [mode=node,pairtest=yes]
+
+\definedfont[file:dejavu-serif.ttf*pairtest @ 48pt]
+
+\startTEXpage[offset=10pt,foregroundcolor=tgray]
+ ABCDEF
+\stopTEXpage
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-singletest.pdf b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-singletest.pdf
new file mode 100644
index 00000000000..624ee547f66
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-singletest.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-singletest.tex b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-singletest.tex
new file mode 100644
index 00000000000..fb0326fa3ff
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-singletest.tex
@@ -0,0 +1,25 @@
+\setupbodyfont[dejavu]
+
+\startluacode
+ fonts.handlers.otf.addfeature {
+ name = "singletest",
+ type = "single",
+ data = {
+ B = { -30, 0, -50, 0 },
+ }
+ }
+\stopluacode
+
+\starttext
+
+\definecolor[tgray][s=.5,t=.5,a=1] \showfontkerns \showglyphs
+
+\definefontfeature[singletest] [mode=node,singletest=yes]
+
+\definedfont[file:dejavu-serif.ttf*singletest @ 48pt]
+
+\startTEXpage[offset=10pt,foregroundcolor=tgray]
+ ABCDEF
+\stopTEXpage
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-spacetest.pdf b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-spacetest.pdf
new file mode 100644
index 00000000000..9a2c7b012f5
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-spacetest.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-spacetest.tex b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-spacetest.tex
new file mode 100644
index 00000000000..48ad4e32f8c
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-spacetest.tex
@@ -0,0 +1,43 @@
+\setupbodyfont[dejavu]
+
+\startluacode
+
+ -- we could populate this one mostly automatic if needed
+ -- but also expect a font to have such kerns
+
+ local kern = -50
+ local pair = { [32] = kern }
+
+ fonts.handlers.otf.addfeature {
+ name = "kern", -- spacekerns assume kern (for now)
+ type = "kern",
+ data = {
+ D = pair,
+ E = pair,
+ F = pair,
+ [32] = {
+ D = kern,
+ E = kern,
+ F = kern,
+ },
+ }
+ }
+
+\stopluacode
+
+\starttext
+
+\enabledirectives[fonts.injections.useitalics] % use italic kerns for tracing
+
+\definecolor[tgray][s=.5,t=.5,a=1] \showfontkerns \showfontitalics \showglyphs
+
+\definefontfeature[kern] [mode=node,kern=yes,spacekerns=yes]
+
+\definedfont[file:dejavu-serif.ttf*kern @ 48pt]
+\definedfont[file:dejavu-serif.ttf*default @ 48pt]
+
+\startTEXpage[offset=10pt,foregroundcolor=tgray]
+ A B C D E F G H
+\stopTEXpage
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-substitutiontest.pdf b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-substitutiontest.pdf
new file mode 100644
index 00000000000..b95e531ecc4
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-substitutiontest.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-substitutiontest.tex b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-substitutiontest.tex
new file mode 100644
index 00000000000..9e2657a6ec1
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features-substitutiontest.tex
@@ -0,0 +1,141 @@
+\startluacode
+ fonts.handlers.otf.addfeature {
+ name = "singlesubstitution",
+ type = "substitution",
+ data = {
+ a = "X",
+ b = "P",
+ }
+ }
+\stopluacode
+
+\startluacode
+ fonts.handlers.otf.addfeature {
+ name = "alternatesubstitution",
+ type = "alternate",
+ data = {
+ a = { "X", "Y" },
+ b = { "P", "Q" },
+ }
+ }
+\stopluacode
+
+\startluacode
+ fonts.handlers.otf.addfeature {
+ name = "multiplesubstitution",
+ type = "multiple",
+ data = {
+ a = { "X", "Y" },
+ b = { "P", "Q" },
+ }
+ }
+\stopluacode
+
+\startluacode
+ fonts.handlers.otf.addfeature {
+ name = "ligaturesubstitution",
+ type = "ligature",
+ data = {
+ ['1'] = { "a", "b" },
+ ['2'] = { "d", "a" },
+ }
+ }
+\stopluacode
+
+\startluacode
+ fonts.handlers.otf.addfeature {
+ name = "chainsubstitution-1",
+ type = "chainsubstitution",
+ -- flags = { false, false, false, false },
+ lookups = {
+ {
+ type = "substitution",
+ data = {
+ ["b"] = "B",
+ ["c"] = "C",
+ },
+ },
+ },
+ -- steps = {
+ -- {
+ -- rules = {
+ -- {
+ -- before = { { "a" } },
+ -- current = { { "b", "c" } },
+ -- lookups = { 1 },
+ -- },
+ -- },
+ -- },
+ -- },
+ data = {
+ rules = {
+ {
+ before = { { "a" } },
+ current = { { "b", "c" } },
+ lookups = { 1 },
+ },
+ },
+ },
+ }
+\stopluacode
+
+\startluacode
+ fonts.handlers.otf.addfeature {
+ name = "chainsubstitution-2",
+ type = "chainsubstitution",
+ prepend = 1,
+ lookups = {
+ {
+ type = "multiple",
+ data = {
+ ["f"] = { "f", 0x200C },
+ },
+ },
+ {
+ type = "substitution",
+ data = {
+ ["a"] = "1",
+ ["b"] = "2",
+ ["c"] = "3",
+ },
+ },
+ },
+ data = {
+ rules = {
+ {
+ current = { { "f" }, { "f" } },
+ lookups = { 1 },
+ },
+ {
+ current = { { "a" }, { "b" }, { "c" } },
+ lookups = { 2, false, 2 },
+ },
+ },
+ }
+ }
+\stopluacode
+
+\definefontfeature[singlesubstitution] [singlesubstitution=yes]
+\definefontfeature[alternatesubstitution][alternatesubstitution=2]
+\definefontfeature[multiplesubstitution] [multiplesubstitution=yes]
+\definefontfeature[ligaturesubstitution] [ligaturesubstitution=yes]
+\definefontfeature[chainsubstitution-1] [chainsubstitution-1=yes]
+\definefontfeature[chainsubstitution-2] [chainsubstitution-2=yes]
+
+\setupbodyfont[dejavu]
+
+\starttext
+
+\definedfont[Serif*default] \showfontkerns \showfontitalics \showglyphs
+
+\startTEXpage
+ abracadabra\par
+ {\addff {singlesubstitution}abracadabra\par}
+ {\addff{alternatesubstitution}abracadabra\par}
+ {\addff {multiplesubstitution}abracadabra\par}
+ {\addff {ligaturesubstitution}abracadabra\par}
+ {\addff {chainsubstitution-1}abracadabra\par}
+ {\addff {chainsubstitution-2}effe abcdef !f\par}
+\stopTEXpage
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features.pdf b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features.pdf
new file mode 100644
index 00000000000..e70afbed7d3
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features.tex b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features.tex
new file mode 100644
index 00000000000..772de4ff6e3
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-features.tex
@@ -0,0 +1,153 @@
+\usemodule[present-lines]
+
+\definecolor[maincolor][r=.4,g=.4]
+
+\startdocument[title=Font features,subtitle={\CONTEXT\ 2017 Maibach}]
+
+\startchapter[title=What are they]
+
+\startitemize
+ \startitem
+ built in substitution that is often optional like ligatures but for some
+ languages mandate
+ \stopitem
+ \startitem
+ built in positioning that is assumed to be applied like kerning, mark
+ anchoring cursive
+ \stopitem
+ \startitem
+ external properties like coloring, spacing, fallback combinations
+ \stopitem
+ \startitem
+ engine related tricks like expansion and protrusion
+ \stopitem
+ \startitem
+ tracing options
+ \stopitem
+ \startitem
+ whatever you like \unknown\ so let me know
+ \stopitem
+ \blank[2*big]
+ \startitem
+ so in \CONTEXT\ we have font features (driven by font) and pseudo
+ features (driven by additional needs)
+ \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Substitution]
+
+\startitemize
+ \startitem
+ single: replace one by another
+ \stopitem
+ \startitem
+ alternate: replace one by one of a set
+ \stopitem
+ \startitem
+ multiple: replace one by multiple others
+ \stopitem
+ \startitem
+ ligature: replace multiple by one shape
+ \stopitem
+ \blank[2*big]
+ \startitem
+ contextual lookups and replacements with look back and look ahead
+ \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Positioning]
+
+\startitemize
+ \startitem
+ single: repositioning a glyph (with optional marks), this includes
+ traditional kerning
+ \stopitem
+ \startitem
+ pairwise: repositioning two adjacent glyphs (with optional marks)
+ \stopitem
+ \startitem
+ anchoring: often used for marks to base glyphs, ligatures and other marks
+ \stopitem
+ \startitem
+ attachment: often used for cursive scripts, pasting glyphs in a word together
+ \stopitem
+ \blank[2*big]
+ \startitem
+ contextual lookups and positioning with look back and look ahead
+ \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Related]
+
+\startitemize
+ \startitem
+ analyze: needed for dealing with features that need information about
+ initial, medial, final and isolated properties
+ \stopitem
+ \startitem
+ reordering: needed for script like devanagari
+ \stopitem
+ \startitem
+ spacing: deals with for positioning glyphs and spaces
+ \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Pitfalls]
+
+\startitemize
+ \startitem
+ solutions for similar tasks can be quite different which makes tracing
+ or checking sometimes hard (many ways to make ligatures)
+ \stopitem
+ \startitem
+ order matters and demands careful font design but it is hard to predict
+ all cases
+ \stopitem
+ \startitem
+ a sloppy font design can result in a performance hit or huge fonts
+ \stopitem
+ \startitem
+ features can be bugged and fonts vendors seldom have an update policy
+ \stopitem
+ \startitem
+ shapers can differ due to assumptions, heuristics, interpreting
+ specifications, bugs, \unknown
+ \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Examples]
+ \startitem
+ all kind of substitutions: \type {2017-features-substitutiontest.tex}
+ \stopitem
+ \startitem
+ simple inter character kerns: \type {2017-features-kerntest.tex}
+ \stopitem
+ \startitem
+ single character positioning: \type {2017-features-singletest.tex}
+ \stopitem
+ \startitem
+ pairwise character positioning: \type {2017-features-pairtest.tex}
+ \stopitem
+ \startitem
+ contextual positioning: \type {2017-features-contexttest.tex}
+ \stopitem
+ \startitem
+ kerning with space (glue): \type {2017-features-spacetest.tex}
+ \stopitem
+\startitemize
+
+\stopitemize
+
+\stopchapter
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-performance.pdf b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-performance.pdf
new file mode 100644
index 00000000000..9656e2f0ef8
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-performance.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-performance.tex b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-performance.tex
new file mode 100644
index 00000000000..458a051a553
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-performance.tex
@@ -0,0 +1,65 @@
+\usemodule[present-lines]
+
+\definecolor[maincolor][g=.4,b=.4]
+
+\startdocument[title=Performance,subtitle={\CONTEXT\ 2017 Maibach}]
+
+\startchapter[title=Why bother]
+
+\startitemize
+ \startitem because we don't want to waste time waiting \stopitem
+ \startitem because I get tired of ignorance related complaints \stopitem
+ \startitem because it (sometimes) can be a nice puzzle to improve performance \stopitem
+ \startitem because it occasionally reviewing makes code better \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Possible bottlenecks]
+
+\startitemize
+ \startitem starting up \stopitem
+ \startitem loading fonts \stopitem
+ \startitem processing features \stopitem
+ \startitem applying trickery \stopitem
+ \startitem enabling tracing \stopitem
+ \blank[2*big]
+ \startitem fonts \stopitem
+ \startitem \LUA \stopitem
+ \startitem images \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Measurements]
+
+\startitemize
+ \startitem how long does a run take \stopitem
+ \startitem how does the number of pages matter \stopitem
+ \startitem how many runs are needed \stopitem
+ \blank[2*big]
+ \startitem start-up time \stopitem
+ \startitem processing pages \stopitem
+ \startitem finishing the document \stopitem
+ \startitem the console used \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Examples]
+
+\startitemize
+\startitem
+ see \goto{onandon-performance.pdf}[file(onandon-performance.pdf)] for timings
+\stopitem
+\startitem
+ you can try \type {--timing} to see where \LUA\ spends it time
+\stopitem
+\startitem
+ analyzing with \type {--profile} can give some indication (but is slow)
+\stopitem
+\stopitemize
+
+\stopchapter
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-synctex.pdf b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-synctex.pdf
new file mode 100644
index 00000000000..d5b39f095b8
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-synctex.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-synctex.tex b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-synctex.tex
new file mode 100644
index 00000000000..0ca6dfd0ea9
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-synctex.tex
@@ -0,0 +1,102 @@
+% \setupsynctex
+% [state=start]
+
+% \enabletrackers
+% [system.synctex.visualize]
+
+\usemodule[present-lines]
+
+\definecolor[maincolor][r=.6]
+
+\startdocument[title=\SYNCTEX,subtitle={\CONTEXT\ 2017 Maibach}]
+
+\startchapter[title=What is \SYNCTEX]
+
+\startitemize
+ \startitem it is a mechanism for going back from viewer to editor \stopitem
+ \startitem it uses an extra (zipped) output file \stopitem
+ \startitem it adds an overhead of 5 to 15 percent runtime \stopitem
+ \startitem it is designed with a specific macro package in mind \stopitem
+ \startitem the rather generic approach works okay for simple document layouts \stopitem
+ \startitem but it often fails for projects that use multiple files\stopitem
+ \startitem and that moves information around like \XML\ encoded files \stopitem
+\stopitemize
+
+\startchapter[title=Disclaimer]
+
+\startitemize
+ \startitem till recently it was supported in \CONTEXT\ as-it-was \stopitem
+ \startitem there were no compliants, so it must have worked ok for most users \stopitem
+ \startitem we never used it ourselves because of mentioned reasons \stopitem
+ \startitem we only wanted to support it when it works ok in projects \stopitem
+ \startitem (think of thousands of \XML\ with deeply nested inclusions in one document) \stopitem
+ \startitem but what we support now is purely based on personal experiences \stopitem
+ \startitem we don't use it ourselves so feedback is welcome \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=What we do]
+
+\startitemize
+ \startitem the normal \SYNCTEX\ mechanism is disabled \stopitem
+ \startitem when told so, \CONTEXT\ will kick in its own code \stopitem
+ \startitem this is done by using \LUA\ code to set the right information \stopitem
+ \startitem only source files that make sense are dealt with \stopitem
+ \startitem this protects the styles from unwanted changes \stopitem
+ \startitem within reasonable bounds \XML\ is supported \stopitem
+ \startitem this also includes nested documents \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=How it works]
+
+\startitemize
+ \startitem we only mark text and don't bother about the rest \stopitem
+ \startitem we collapse information about whole stretches \stopitem
+ \startitem the extra file is therefore not that large \stopitem
+ \startitem so we can do without compression \stopitem
+ \startitem some care is needed to avoid interference with the editors parser \stopitem
+ \startitem (read: we need to get rid of the rather complex and heuristics) \stopitem
+ \startitem (read: it would be nice to have a simple robust parser option) \stopitem
+ \startitem there are flaws but I will look into them when motivated \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=What the user gets]
+
+\startitemize
+ \startitem a way to turn it on:
+ \starttyping
+ \setupsynctex[state=start]
+ \stoptyping
+ \stopitem
+ \startitem control over methods:
+ \starttyping
+ \setupsynctex[method=max]
+ \stoptyping
+ \stopitem
+ \startitem visual tracing:
+ \starttyping
+ \enabletrackers[system.synctex.visualize]
+ \stoptyping
+ \stopitem
+ \startitem some low level commands:
+ \starttyping
+ \synctexblockfilename{filename}
+ \synctexsetfilename {filename}
+ \synctexresetfilename
+ \synctexpause
+ \synctexresume
+ \stoptyping
+ \stopitem
+\stopitemize
+
+% \enabletrackers[system.synctex.xml]
+% \enabledirectives[system.synctex.details]
+
+\stopchapter
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-tables.pdf b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-tables.pdf
new file mode 100644
index 00000000000..299c21f3938
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-tables.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-tables.tex b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-tables.tex
new file mode 100644
index 00000000000..6f28226688b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2017/context-2017-tables.tex
@@ -0,0 +1,175 @@
+\usemodule[present-lines]
+
+\definecolor[maincolor][r=.4,b=.4]
+
+\startdocument[title=Tables,subtitle={\CONTEXT\ 2017 Maibach}]
+
+\startchapter[title=Variants]
+
+\startitemize
+ \startitem
+ Good old \TABLE, a wrapper about \TEX's alignment.
+ \stopitem
+ \startitem
+ Running text, break across pages tabulates.
+ \stopitem
+ \startitem
+ Tables that behave like \HTML\ tables therefore called
+ natural tables.
+ \stopitem
+ \startitem
+ A variant on this that is more easy to extend, tagged
+ extreme tables.
+ \stopitem
+ \startitem
+ A low profile linetable mechanism that can span pages
+ and breaks well.
+ \stopitem
+ \startitem
+ A way to make huge tables without overflowing \TEX\ too
+ soon.
+ \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=\TABLE]
+
+\startitemize
+ \startitem
+ Based on the \TABLE\ macro package.
+ \stopitem
+ \startitem
+ Detailed control over spacing.
+ \stopitem
+ \startitem
+ Somewhat inconsistent spacing out of the box.
+ \stopitem
+ \startitem
+ Extended with extra features.
+ \stopitem
+ \startitem
+ Mostly rewritten but within the original concept.
+ \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Tabulate]
+
+\startitemize
+ \startitem
+ Mostly meant for tables that are part of the text flow.
+ \stopitem
+ \startitem
+ Breaks paragraphs across pages.
+ \stopitem
+ \startitem
+ Sort of compatible in control with \TABLE.
+ \stopitem
+ \startitem
+ The system that I used most often.
+ \stopitem
+ \startitem
+ It uses multiple passes if needed.
+ \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Natural tables]
+
+\startitemize
+ \startitem
+ Modelled after \HTML\ tables.
+ \stopitem
+ \startitem
+ Often used in \XML\ workflows, possibly as cals tables.
+ \stopitem
+ \startitem
+ To some extend automatic spans horizontally and vertically.
+ \stopitem
+ \startitem
+ There are a couple of (undocumented and obscure) flags that can control
+ behaviour.
+ \stopitem
+ \startitem
+ They can break cross pages if needed.
+ \stopitem
+ \startitem
+ Tables, rows and cells have framed like properties.
+ \stopitem
+ \startitem
+ Not the fastest mechanism as it used several passes (for which it
+ stores all cells).
+ \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Extreme tables]
+
+\startitemize
+ \startitem
+ Again modelled after \HTML\ tables.
+ \stopitem
+ \startitem
+ A few less options but also some more than natural tables.
+ \stopitem
+ \startitem
+ Most work is delegated to \LUA.
+ \stopitem
+ \startitem
+ Uses buffers and therefore nesting is (as with natural tables)
+ possible but with care.
+ \stopitem
+\stopitemize
+
+\stopchapter
+
+\startchapter[title=Line tables]
+
+\startitemize
+ \startitem
+ Written for and used in a project long ago.
+ \stopitem
+ \startitem
+ Meant for huge tables that span multiple pages horizontally
+ and vertically.
+ \stopitem
+ \startitem
+ It only can have simple colored backgrounds.
+ \stopitem
+ \startitem
+ Hardly used.
+ \stopitem
+ \startitem
+ I need to redo (or check) the implementation some day.
+ \stopitem
+\stopitemize
+
+\startchapter[title=Frame tables]
+
+\startitemize
+ \startitem
+ Written for and used for Thomas who needs real huge tables
+ generated from \XML.
+ \stopitem
+ \startitem
+ It's a single pass mechanism.
+ \stopitem
+ \startitem
+ Each cell is a framed.
+ \stopitem
+ \startitem
+ Dimensions need to be adapted when you want predictable output.
+ \stopitem
+ \startitem
+ I might extend it but within reasonable bounds.
+ \stopitem
+\stopitemize
+
+\stopchapter
+
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2019/context-2019-lmtx.pdf b/Master/texmf-dist/doc/context/presentations/context/2019/context-2019-lmtx.pdf
new file mode 100644
index 00000000000..7cf25734729
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2019/context-2019-lmtx.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2019/context-2019-lmtx.tex b/Master/texmf-dist/doc/context/presentations/context/2019/context-2019-lmtx.tex
new file mode 100644
index 00000000000..62dd915adac
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2019/context-2019-lmtx.tex
@@ -0,0 +1,201 @@
+% macros=mkvi
+
+\usemodule[abbreviations-smallcaps]
+\usemodule[present-luatex]
+
+\logo [LUAMETATEX] {LuaMeta\TeX}
+
+\setupbodyfont[12pt]
+
+\setupalign[verytolerant]
+
+\setupdocument
+ [title={Lean and mean},
+ subtitle={\LUAMETATEX},
+ location={\ConTeXt\ meeting, September 2019},
+ author={Hans & Alan},
+ mp:title={\LUAMETATEX}]
+
+\startdocument
+
+\setupitemize[headintext]
+\setupitemize[headstyle=bold]
+
+\page \setupdocument[mp:subtitle={How it became}]
+
+\startitemize
+ \starthead {interferences:}
+ \CONTEXT, plain \TEX\ and \LATEX\ all have different demands (we want to
+ experiment and move on and users pick up fast)
+ \stophead
+ \starthead {complexity:}
+ the source tree is way too complex as is the build (we only need \LUATEX)
+ \stophead
+ \starthead {distributions:}
+ no one can guarantee stability for \CONTEXT\ (being a minor player but
+ often a bit ahead)
+ \stophead
+ \starthead {annoyances:}
+ experimental codes leads to usage outside \CONTEXT\ and that triggers
+ complaints
+ \stophead
+ \starthead {motivation:}
+ running into folks who love to stress \quotation {huge bugs} and
+ \quotation {much instability} wastes energy
+ \stophead
+ \starthead {arguments:}
+ I got tired of \quotation {you need to support this because \unknown}
+ blabla
+ \stophead
+ \starthead {nagging:}
+ like \quotation {the manual \unknown} is becoming too tiresome, so best
+ keep experiments within the \CONTEXT\ bubble
+ \stophead
+\stopitemize
+
+\page \setupdocument[mp:subtitle={What it is}]
+
+\startitemize
+ \starthead {simplification:}
+ we don't need all what is currently in the \LUATEX\ engine as we don't
+ use it
+ \stophead
+ \starthead {source:}
+ there is much less of it and we can get rid of \WEB\ artifacts
+ \stophead
+ \starthead {compilation:}
+ there was much more going on than was needed and only a few knew those
+ details
+ \stophead
+ \starthead {consistency:}
+ to guarantee consistency with \CONTEXT\ the source code will be part of
+ the source distribution (once I'm satisfied)
+ \stophead
+ \starthead {marketing:}
+ this way the relation with \CONTEXT\ and its user base is more clear
+ \stophead
+ \starthead {playground:}
+ we can move forward and experiment without the danger of running into
+ problems with non \CONTEXT\ users: \quotation {use it at your own risk}
+ \stophead
+ \starthead {possibilities:}
+ playing a bit more with the bits and pieces that are reponsible for most
+ (interfering) issues, like the the (asynchronous) page builder
+ \stophead
+\stopitemize
+
+\page \setupdocument[mp:subtitle={Implications}]
+
+\startitemize
+ \starthead {binary:}
+ there is only one relatively small binary needed (that does all things
+ needed)
+ \stophead
+ \starthead {code base:}
+ there comes an extra source tree, but it's small (compresses to around 2
+ MB)
+ \stophead
+ \starthead {user control:}
+ if needed users can compile the program so we're self contained
+ \stophead
+ \starthead {future safe:}
+ we can move forward and improve
+ \stophead
+ \starthead {modern:}
+ a code base with the latest \LUATEX, \MPLIB\ and \LUA
+ \stopitem
+ \starthead {side effect:}
+ we drop \LUAJIT\ as it doesn't keep up (and benefits are too small)
+ \stophead
+ \starthead {design:}
+ we have a better separation between the Knuthian front- and output format
+ driven backend
+ \stophead
+ \starthead {independent:}
+ there is no dependency on external libraries, we keep all we need in the
+ code base (we only use a few small third party libraries)
+ \stophead
+\stopitemize
+
+\page \setupdocument[mp:subtitle={A few notes}]
+
+\startitemize
+ \starthead {hobyism}
+ we don't need to carry the burden of everything (unless paid for it's
+ only fun and users that drives development)
+ \stophead
+ \starthead {convenience:}
+ the faster compilation makes reworking and experimenting reasonable
+ \stophead
+ \starthead {stepwise:}
+ I take my time an do string stepswise because things should not break
+ without fast recovery
+ \stophead
+ \starthead {feelgood:}
+ this all fits well into the good old \TEX\ extension model
+ \stophead
+ \starthead {eventually:}
+ when proven useful we can always push code upstream into \LUATEX
+ \stophead
+\stopitemize
+
+\page \setupdocument[mp:subtitle={Bits and pieces}]
+
+\startitemize
+ \starthead {original:}
+ the starting point is \LUATEX, original \WEB\ code, already \CWEB\ code
+ \stophead
+ \starthead {stability:}
+ after a initial stage \LUATEX\ was stepwise extended till version one
+ a few years ago
+ \stophead
+ \starthead {frozen:}
+ there were only a few changes after that but no real conceptual ones
+ \stophead
+ \starthead {engine:}
+ what is now called \LUAMETATEX\ is a reworked code base
+ \stophead
+ \starthead {graphics:}
+ also \MPLIB\ has been reworked a bit and some extensions were added
+ \stophead
+ \starthead {libraries:}
+ there are a few extra (small) helper libs, but all in the source tree
+ \stophead
+ \starthead {pplib:}
+ we already use the next version of pplib
+ \stophead
+ \starthead {pruning:}
+ and best of all, quite some not used code could go
+ \stophead
+\stopitemize
+
+\page \setupdocument[mp:subtitle={Some details}]
+
+\startitemize
+ \starthead {source tree:}
+ the code base has been regrouped, globals became more local (work in
+ progress), header files were added
+ \stophead
+ \starthead {source files:}
+ there is hardly any font related code, languages were kept, and the
+ backend code is dropped: show files
+ \stophead
+ \starthead {libraries:}
+ a few libs were added and dropped: show some
+ \stophead
+ \starthead {cmake:}
+ compilation is different: work in progress
+ \stophead
+ \starthead {mkxl:}
+ there are new files in \CONTEXT: \type {driv}, \type {lpdf}, \type {.mkxl}
+ and expect more
+ \stophead
+ \starthead {binary:}
+ there is only one stub for all
+ \stophead
+\stopitemize
+
+{\infofont during presentation: show the source tree as well as the binary directory}
+
+\stopdocument
+
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man b/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man
index 374ffcc8066..b024daf6686 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man
@@ -1,6 +1,6 @@
-.TH "ctxtools" "1" "01-01-2019" "version 1.3.5" "CtxTools"
+.TH "ctxtools" "1" "01-01-2020" "version 1.3.5" "CtxTools"
.SH NAME
-.B ctxtools
+ ctxtools - CtxTools
.SH SYNOPSIS
.B ctxtools [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man b/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man
index 033d5a1ab96..9166bf1146c 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man
@@ -1,6 +1,6 @@
-.TH "imgtopdf" "1" "01-01-2019" "version 1.1.2" "ImgToPdf"
+.TH "imgtopdf" "1" "01-01-2020" "version 1.1.2" "ImgToPdf"
.SH NAME
-.B imgtopdf
+ imgtopdf - ImgToPdf
.SH SYNOPSIS
.B imgtopdf [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/pdftools.man b/Master/texmf-dist/doc/context/scripts/mkii/pdftools.man
index 910bce66008..2258f7fd6f9 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/pdftools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/pdftools.man
@@ -1,6 +1,6 @@
-.TH "pdftools" "1" "01-01-2019" "version 1.2.1" "PDFTools"
+.TH "pdftools" "1" "01-01-2020" "version 1.2.1" "PDFTools"
.SH NAME
-.B pdftools
+ pdftools - PDFTools
.SH SYNOPSIS
.B pdftools [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man b/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man
index 607fa11123a..2439d48a5b8 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man
@@ -1,6 +1,6 @@
-.TH "pstopdf" "1" "01-01-2019" "version 2.0.1" "PStoPDF"
+.TH "pstopdf" "1" "01-01-2020" "version 2.0.1" "PStoPDF"
.SH NAME
-.B pstopdf
+ pstopdf - PStoPDF
.SH SYNOPSIS
.B pstopdf [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man b/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man
index d2a128b4126..4c5a5c172a6 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man
@@ -1,6 +1,6 @@
-.TH "rlxtools" "1" "01-01-2019" "version 1.0.1" "RlxTools"
+.TH "rlxtools" "1" "01-01-2020" "version 1.0.1" "RlxTools"
.SH NAME
-.B rlxtools
+ rlxtools - RlxTools
.SH SYNOPSIS
.B rlxtools [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texexec.man b/Master/texmf-dist/doc/context/scripts/mkii/texexec.man
index d6b057b6592..e783e8d6e47 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/texexec.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/texexec.man
@@ -1,6 +1,6 @@
-.TH "texexec" "1" "01-01-2019" "version 6.2.1" "TeXExec"
+.TH "texexec" "1" "01-01-2020" "version 6.2.1" "TeXExec"
.SH NAME
-.B texexec
+ texexec - TeXExec
.SH SYNOPSIS
.B texexec [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html
index e7656a15984..fc3dbb68530 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html
+++ b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html
@@ -40,7 +40,7 @@
<tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr>
<tr><th/><td/><td/></tr>
<tr><th>--script</th><td></td><td>run an mtx script (lua prefered method) (--noquotes), no script gives list</td></tr>
- <tr><th>--evaluate</th><td></td><td>run code passed on the commandline (between quotes)</td></tr>
+ <tr><th>--evaluate</th><td></td><td>run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)</td></tr>
<tr><th>--execute</th><td></td><td>run a script or program (texmfstart method) (--noquotes)</td></tr>
<tr><th>--resolve</th><td></td><td>resolve prefixed arguments</td></tr>
<tr><th>--ctxlua</th><td></td><td>run internally (using preloaded libs)</td></tr>
@@ -57,6 +57,7 @@
<tr><th>--stubpath</th><td>binpath</td><td>paths where stubs wil be written</td></tr>
<tr><th>--windows</th><td></td><td>create windows (mswin) stubs</td></tr>
<tr><th>--unix</th><td></td><td>create unix (linux) stubs</td></tr>
+ <tr><th>--addbinarypath</th><td></td><td>prepend the (found) binarypath to runners</td></tr>
<tr><th/><td/><td/></tr>
<tr><th>--verbose</th><td></td><td>give a bit more info</td></tr>
<tr><th>--trackers</th><td>list</td><td>enable given trackers</td></tr>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man
index 70dd035c440..8118c9c7f7d 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man
@@ -1,6 +1,6 @@
-.TH "mtxrun" "1" "01-01-2019" "version 1.33" "ConTeXt TDS Runner Tool"
+.TH "mtxrun" "1" "01-01-2020" "version 1.33" "ConTeXt TDS Runner Tool"
.SH NAME
-.B mtxrun
+ mtxrun - ConTeXt TDS Runner Tool
.SH SYNOPSIS
.B mtxrun [
.I OPTIONS ...
@@ -15,7 +15,7 @@
run an mtx script (lua prefered method) (--noquotes), no script gives list
.TP
.B --evaluate
-run code passed on the commandline (between quotes)
+run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)
.TP
.B --execute
run a script or program (texmfstart method) (--noquotes)
@@ -59,6 +59,9 @@ create windows (mswin) stubs
.B --unix
create unix (linux) stubs
.TP
+.B --addbinarypath
+prepend the (found) binarypath to runners
+.TP
.B --verbose
give a bit more info
.TP
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml
index 8f501ff6611..5e5958e16fd 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml
@@ -8,7 +8,7 @@
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
- <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -27,6 +27,7 @@
<flag name="stubpath" value="binpath"><short>paths where stubs wil be written</short></flag>
<flag name="windows"><short>create windows (mswin) stubs</short></flag>
<flag name="unix"><short>create unix (linux) stubs</short></flag>
+ <flag name="addbinarypath"><short>prepend the (found) binarypath to runners</short></flag>
</subcategory>
<subcategory>
<flag name="verbose"><short>give a bit more info</short></flag>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/textools.man b/Master/texmf-dist/doc/context/scripts/mkii/textools.man
index 8fad158af70..4d5df1fa93c 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/textools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/textools.man
@@ -1,6 +1,6 @@
-.TH "textools" "1" "01-01-2019" "version 1.3.1" "TeXTools"
+.TH "textools" "1" "01-01-2020" "version 1.3.1" "TeXTools"
.SH NAME
-.B textools
+ textools - TeXTools
.SH SYNOPSIS
.B textools [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texutil.man b/Master/texmf-dist/doc/context/scripts/mkii/texutil.man
index cad1b72e830..d30913ad51c 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/texutil.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/texutil.man
@@ -1,6 +1,6 @@
-.TH "texutil" "1" "01-01-2019" "version 9.1.0" "TeXUtil"
+.TH "texutil" "1" "01-01-2020" "version 9.1.0" "TeXUtil"
.SH NAME
-.B texutil
+ texutil - TeXUtil
.SH SYNOPSIS
.B texutil [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/tmftools.man b/Master/texmf-dist/doc/context/scripts/mkii/tmftools.man
index 465579dedeb..731d6ed34ef 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/tmftools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/tmftools.man
@@ -1,6 +1,6 @@
-.TH "tmftools" "1" "01-01-2019" "version 1.1.0" "TMFTools"
+.TH "tmftools" "1" "01-01-2020" "version 1.1.0" "TMFTools"
.SH NAME
-.B tmftools
+ tmftools - TMFTools
.SH SYNOPSIS
.B tmftools [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/xmltools.man b/Master/texmf-dist/doc/context/scripts/mkii/xmltools.man
index d3ed28a7a26..efea6a69bb8 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/xmltools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/xmltools.man
@@ -1,6 +1,6 @@
-.TH "xmltools" "1" "01-01-2019" "version 1.2.2" "XMLTools"
+.TH "xmltools" "1" "01-01-2020" "version 1.2.2" "XMLTools"
.SH NAME
-.B xmltools
+ xmltools - XMLTools
.SH SYNOPSIS
.B xmltools [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/context.html b/Master/texmf-dist/doc/context/scripts/mkiv/context.html
index 2c64bf8df2a..3262b91d1aa 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/context.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/context.html
@@ -14,7 +14,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
- <title>ConTeXt Process Management 1.02</title>
+ <title>ConTeXt Process Management 1.03</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style type="text/css">
body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } .invisible { visibility: hidden; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; }
@@ -24,7 +24,7 @@
</head>
<body>
<div id="top"> <div id="top-one">
- <div id="top-two">ConTeXt Process Management 1.02 </div>
+ <div id="top-two">ConTeXt Process Management 1.03 </div>
</div>
</div>
<div id="bottom"> <div id="bottom-one">
@@ -62,7 +62,8 @@
<tr><th>--directives</th><td>list</td><td>set directive variables (show list with --showdirectives)</td></tr>
<tr><th>--silent</th><td>list</td><td>disable logcatgories (show list with --showlogcategories)</td></tr>
<tr><th>--strip</th><td></td><td>strip Lua code (only meant for production where no errors are expected)</td></tr>
- <tr><th>--errors</th><td>list</td><td>show errors at the end of a run, quit when in list (also when ----silent)</td></tr>
+ <tr><th>--errors</th><td>list</td><td>show errors at the end of a run, quit when in list (also when --silent)</td></tr>
+ <tr><th>--htmlerrorpage</th><td></td><td>generate html error page instead (optional: =scite)</td></tr>
<tr><th>--noconsole</th><td></td><td>disable logging to the console (logfile only)</td></tr>
<tr><th>--purgeresult</th><td></td><td>purge result file before run</td></tr>
<tr><th/><td/><td/></tr>
@@ -83,8 +84,10 @@
<tr><th/><td/><td/></tr>
<tr><th>--batchmode</th><td></td><td>run without stopping and do not show messages on the console</td></tr>
<tr><th>--nonstopmode</th><td></td><td>run without stopping</td></tr>
+ <tr><th/><td/><td/></tr>
<tr><th>--nosynctex</th><td></td><td>never initializes synctex (for production runs)</td></tr>
<tr><th>--synctex</th><td></td><td>run with synctex enabled (better use \setupsynctex[state=start]</td></tr>
+ <tr><th/><td/><td/></tr>
<tr><th>--nodates</th><td></td><td>omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM")</td></tr>
<tr><th>--nocompression</th><td></td><td>forcefully turns off compression in the backend</td></tr>
<tr><th>--trailerid</th><td></td><td>alternative trailer id (or constant one)</td></tr>
@@ -99,7 +102,6 @@
<tr><th/><td/><td/></tr>
<tr><th>--touch</th><td></td><td>update context version number (also provide --expert, optionally provide --basepath)</td></tr>
<tr><th>--nostatistics</th><td></td><td>omit runtime statistics at the end of the run</td></tr>
- <tr><th>--update</th><td></td><td>update context from website (not to be confused with contextgarden)</td></tr>
<tr><th>--profile</th><td></td><td>profile job (use: mtxrun --script profile --analyze)</td></tr>
<tr><th>--timing</th><td></td><td>generate timing and statistics overview</td></tr>
<tr><th>--keeptuc</th><td></td><td>keep previous tuc files (jobname-tuc-[run].tmp)</td></tr>
@@ -117,6 +119,8 @@
<tr><th>--pipe</th><td></td><td>do not check for file and enter scroll mode (--dummyfile=whatever.tmp)</td></tr>
<tr><th/><td/><td/></tr>
<tr><th>--sandbox</th><td></td><td>process file in a limited environment</td></tr>
+ <tr><th/><td/><td/></tr>
+ <tr><th>--addbinarypath</th><td></td><td>prepend the (found) binarypath to runners</td></tr>
</table>
<br/>
</div>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/context.man b/Master/texmf-dist/doc/context/scripts/mkiv/context.man
index eed6a572396..9b23bd88b6d 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/context.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/context.man
@@ -1,6 +1,6 @@
-.TH "mtx-context" "1" "01-01-2019" "version 1.01" "ConTeXt Process Management"
+.TH "mtx-context" "1" "01-01-2020" "version 1.03" "ConTeXt Process Management"
.SH NAME
-.B mtx-context
+ mtx-context - ConTeXt Process Management
.SH SYNOPSIS
.B mtxrun --script context [
.I OPTIONS ...
@@ -69,7 +69,10 @@ disable logcatgories (show list with --showlogcategories)
strip Lua code (only meant for production where no errors are expected)
.TP
.B --errors=list
-show errors at the end of a run, quit when in list (also when ----silent)
+show errors at the end of a run, quit when in list (also when --silent)
+.TP
+.B --htmlerrorpage
+generate html error page instead (optional: =scite)
.TP
.B --noconsole
disable logging to the console (logfile only)
@@ -153,9 +156,6 @@ update context version number (also provide --expert, optionally provide --basep
.B --nostatistics
omit runtime statistics at the end of the run
.TP
-.B --update
-update context from website (not to be confused with contextgarden)
-.TP
.B --profile
profile job (use: mtxrun --script profile --analyze)
.TP
@@ -192,6 +192,9 @@ do not check for file and enter scroll mode (--dummyfile=whatever.tmp)
.TP
.B --sandbox
process file in a limited environment
+.TP
+.B --addbinarypath
+prepend the (found) binarypath to runners
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/context.xml b/Master/texmf-dist/doc/context/scripts/mkiv/context.xml
index 8c21eaa8c5c..0c7038d2680 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/context.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/context.xml
@@ -4,7 +4,7 @@
<metadata>
<entry name="name">mtx-context</entry>
<entry name="detail">ConTeXt Process Management</entry>
- <entry name="version">1.01</entry>
+ <entry name="version">1.03</entry>
<entry name="comment">external helpinfo file</entry>
</metadata>
<flags>
@@ -74,7 +74,10 @@
<short>strip Lua code (only meant for production where no errors are expected)</short>
</flag>
<flag name="errors" value="list">
- <short>show errors at the end of a run, quit when in list (also when <ref name="--silent"/>)</short>
+ <short>show errors at the end of a run, quit when in list (also when <ref name="silent"/>)</short>
+ </flag>
+ <flag name="htmlerrorpage">
+ <short>generate html error page instead (optional: =scite)</short>
</flag>
<flag name="noconsole">
<short>disable logging to the console (logfile only)</short>
@@ -131,12 +134,16 @@
<flag name="nonstopmode">
<short>run without stopping</short>
</flag>
+ </subcategory>
+ <subcategory>
<flag name="nosynctex">
<short>never initializes synctex (for production runs)</short>
</flag>
<flag name="synctex">
<short>run with synctex enabled (better use \setupsynctex[state=start]</short>
</flag>
+ </subcategory>
+ <subcategory>
<flag name="nodates">
<short>omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM")</short>
</flag>
@@ -146,7 +153,7 @@
<flag name="trailerid">
<short>alternative trailer id (or constant one)</short>
</flag>
- </subcategory>
+ </subcategory>
<subcategory>
<flag name="generate">
<short>generate file database etc. (as luatools does)</short>
@@ -172,12 +179,12 @@
<flag name="touch">
<short>update context version number (also provide <ref name="expert"/>, optionally provide <ref name="basepath"/>)</short>
</flag>
- <flag name="nostatistics">
+ <flag name="nostatistics">
<short>omit runtime statistics at the end of the run</short>
</flag>
- <flag name="update">
+ <!-- flag name="update">
<short>update context from website (not to be confused with contextgarden)</short>
- </flag>
+ </flag -->
<flag name="profile">
<short>profile job (use: mtxrun <ref name="script"/> profile <ref name="analyze"/>)</short>
</flag>
@@ -225,6 +232,11 @@
<short>process file in a limited environment</short>
</flag>
</subcategory>
+ <subcategory>
+ <flag name="addbinarypath">
+ <short>prepend the (found) binarypath to runners</short>
+ </flag>
+ </subcategory>
</category>
</flags>
</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/luatools.man b/Master/texmf-dist/doc/context/scripts/mkiv/luatools.man
index 6750af5374a..0d0392f396e 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/luatools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/luatools.man
@@ -1,6 +1,6 @@
-.TH "luatools" "1" "01-01-2019" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
+.TH "luatools" "1" "01-01-2020" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
.SH NAME
-.B luatools
+ luatools - ConTeXt TDS Management Tool (aka luatools)
.SH SYNOPSIS
.B luatools [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man
index 68b94478ddf..5ac999c664b 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man
@@ -1,6 +1,6 @@
-.TH "mtx-babel" "1" "01-01-2019" "version 1.20" "Babel Input To UTF Conversion"
+.TH "mtx-babel" "1" "01-01-2020" "version 1.20" "Babel Input To UTF Conversion"
.SH NAME
-.B mtx-babel
+ mtx-babel - Babel Input To UTF Conversion
.SH SYNOPSIS
.B mtxrun --script babel [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man
index 757537b1d5e..76f60696f48 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man
@@ -1,6 +1,6 @@
-.TH "mtx-base" "1" "01-01-2019" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
+.TH "mtx-base" "1" "01-01-2020" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
.SH NAME
-.B mtx-base
+ mtx-base - ConTeXt TDS Management Tool (aka luatools)
.SH SYNOPSIS
.B mtxrun --script base [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.man
index a2ddce859c8..60bfd7e1d40 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.man
@@ -1,6 +1,6 @@
-.TH "mtx-bibtex" "1" "01-01-2019" "version 1.00" "bibtex helpers"
+.TH "mtx-bibtex" "1" "01-01-2020" "version 1.00" "bibtex helpers"
.SH NAME
-.B mtx-bibtex
+ mtx-bibtex - bibtex helpers
.SH SYNOPSIS
.B mtxrun --script bibtex [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.html
index 475095eb4d8..264c03485e8 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.html
@@ -39,7 +39,7 @@
<table>
<tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr>
<tr><th/><td/><td/></tr>
- <tr><th>--purge</th><td></td><td>remove not used files</td></tr>
+ <tr><th>--make</th><td></td><td>generate databases and formats</td></tr>
<tr><th>--erase</th><td></td><td>completely remove cache</td></tr>
<tr><th>--list</th><td></td><td>show cache</td></tr>
<tr><th/><td/><td/></tr>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man
index e659dd3b873..e266d8da205 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man
@@ -1,6 +1,6 @@
-.TH "mtx-cache" "1" "01-01-2019" "version 0.10" "ConTeXt & MetaTeX Cache Management"
+.TH "mtx-cache" "1" "01-01-2020" "version 1.01" "ConTeXt & MetaTeX Cache Management"
.SH NAME
-.B mtx-cache
+ mtx-cache - ConTeXt & MetaTeX Cache Management
.SH SYNOPSIS
.B mtxrun --script cache [
.I OPTIONS ...
@@ -11,8 +11,8 @@
.B ConTeXt & MetaTeX Cache Management
.SH OPTIONS
.TP
-.B --purge
-remove not used files
+.B --make
+generate databases and formats
.TP
.B --erase
completely remove cache
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.xml
index 4bd3acc3d73..35225724bed 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.xml
@@ -3,12 +3,12 @@
<metadata>
<entry name="name">mtx-cache</entry>
<entry name="detail">ConTeXt &amp; MetaTeX Cache Management</entry>
- <entry name="version">0.10</entry>
+ <entry name="version">1.01</entry>
</metadata>
<flags>
<category name="basic">
<subcategory>
- <flag name="purge"><short>remove not used files</short></flag>
+ <flag name="make"><short>generate databases and formats</short></flag>
<flag name="erase"><short>completely remove cache</short></flag>
<flag name="list"><short>show cache</short></flag>
</subcategory>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man
index dd6c3c6cab7..ad52b5b8909 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man
@@ -1,6 +1,6 @@
-.TH "mtx-chars" "1" "01-01-2019" "version 0.10" "MkII Character Table Generators"
+.TH "mtx-chars" "1" "01-01-2020" "version 0.10" "MkII Character Table Generators"
.SH NAME
-.B mtx-chars
+ mtx-chars - MkII Character Table Generators
.SH SYNOPSIS
.B mtxrun --script chars [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man
index 6331a2e5361..0525aeb69e8 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man
@@ -1,6 +1,6 @@
-.TH "mtx-check" "1" "01-01-2019" "version 0.10" "Basic ConTeXt Syntax Checking"
+.TH "mtx-check" "1" "01-01-2020" "version 0.10" "Basic ConTeXt Syntax Checking"
.SH NAME
-.B mtx-check
+ mtx-check - Basic ConTeXt Syntax Checking
.SH SYNOPSIS
.B mtxrun --script check [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man
index 4ef9fab0b42..883d6957310 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man
@@ -1,6 +1,6 @@
-.TH "mtx-colors" "1" "01-01-2019" "version 0.10" "ConTeXt Color Management"
+.TH "mtx-colors" "1" "01-01-2020" "version 0.10" "ConTeXt Color Management"
.SH NAME
-.B mtx-colors
+ mtx-colors - ConTeXt Color Management
.SH SYNOPSIS
.B mtxrun --script colors [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html
index 2c64bf8df2a..3262b91d1aa 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html
@@ -14,7 +14,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
- <title>ConTeXt Process Management 1.02</title>
+ <title>ConTeXt Process Management 1.03</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style type="text/css">
body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } .invisible { visibility: hidden; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; }
@@ -24,7 +24,7 @@
</head>
<body>
<div id="top"> <div id="top-one">
- <div id="top-two">ConTeXt Process Management 1.02 </div>
+ <div id="top-two">ConTeXt Process Management 1.03 </div>
</div>
</div>
<div id="bottom"> <div id="bottom-one">
@@ -62,7 +62,8 @@
<tr><th>--directives</th><td>list</td><td>set directive variables (show list with --showdirectives)</td></tr>
<tr><th>--silent</th><td>list</td><td>disable logcatgories (show list with --showlogcategories)</td></tr>
<tr><th>--strip</th><td></td><td>strip Lua code (only meant for production where no errors are expected)</td></tr>
- <tr><th>--errors</th><td>list</td><td>show errors at the end of a run, quit when in list (also when ----silent)</td></tr>
+ <tr><th>--errors</th><td>list</td><td>show errors at the end of a run, quit when in list (also when --silent)</td></tr>
+ <tr><th>--htmlerrorpage</th><td></td><td>generate html error page instead (optional: =scite)</td></tr>
<tr><th>--noconsole</th><td></td><td>disable logging to the console (logfile only)</td></tr>
<tr><th>--purgeresult</th><td></td><td>purge result file before run</td></tr>
<tr><th/><td/><td/></tr>
@@ -83,8 +84,10 @@
<tr><th/><td/><td/></tr>
<tr><th>--batchmode</th><td></td><td>run without stopping and do not show messages on the console</td></tr>
<tr><th>--nonstopmode</th><td></td><td>run without stopping</td></tr>
+ <tr><th/><td/><td/></tr>
<tr><th>--nosynctex</th><td></td><td>never initializes synctex (for production runs)</td></tr>
<tr><th>--synctex</th><td></td><td>run with synctex enabled (better use \setupsynctex[state=start]</td></tr>
+ <tr><th/><td/><td/></tr>
<tr><th>--nodates</th><td></td><td>omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM")</td></tr>
<tr><th>--nocompression</th><td></td><td>forcefully turns off compression in the backend</td></tr>
<tr><th>--trailerid</th><td></td><td>alternative trailer id (or constant one)</td></tr>
@@ -99,7 +102,6 @@
<tr><th/><td/><td/></tr>
<tr><th>--touch</th><td></td><td>update context version number (also provide --expert, optionally provide --basepath)</td></tr>
<tr><th>--nostatistics</th><td></td><td>omit runtime statistics at the end of the run</td></tr>
- <tr><th>--update</th><td></td><td>update context from website (not to be confused with contextgarden)</td></tr>
<tr><th>--profile</th><td></td><td>profile job (use: mtxrun --script profile --analyze)</td></tr>
<tr><th>--timing</th><td></td><td>generate timing and statistics overview</td></tr>
<tr><th>--keeptuc</th><td></td><td>keep previous tuc files (jobname-tuc-[run].tmp)</td></tr>
@@ -117,6 +119,8 @@
<tr><th>--pipe</th><td></td><td>do not check for file and enter scroll mode (--dummyfile=whatever.tmp)</td></tr>
<tr><th/><td/><td/></tr>
<tr><th>--sandbox</th><td></td><td>process file in a limited environment</td></tr>
+ <tr><th/><td/><td/></tr>
+ <tr><th>--addbinarypath</th><td></td><td>prepend the (found) binarypath to runners</td></tr>
</table>
<br/>
</div>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man
index eed6a572396..9b23bd88b6d 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man
@@ -1,6 +1,6 @@
-.TH "mtx-context" "1" "01-01-2019" "version 1.01" "ConTeXt Process Management"
+.TH "mtx-context" "1" "01-01-2020" "version 1.03" "ConTeXt Process Management"
.SH NAME
-.B mtx-context
+ mtx-context - ConTeXt Process Management
.SH SYNOPSIS
.B mtxrun --script context [
.I OPTIONS ...
@@ -69,7 +69,10 @@ disable logcatgories (show list with --showlogcategories)
strip Lua code (only meant for production where no errors are expected)
.TP
.B --errors=list
-show errors at the end of a run, quit when in list (also when ----silent)
+show errors at the end of a run, quit when in list (also when --silent)
+.TP
+.B --htmlerrorpage
+generate html error page instead (optional: =scite)
.TP
.B --noconsole
disable logging to the console (logfile only)
@@ -153,9 +156,6 @@ update context version number (also provide --expert, optionally provide --basep
.B --nostatistics
omit runtime statistics at the end of the run
.TP
-.B --update
-update context from website (not to be confused with contextgarden)
-.TP
.B --profile
profile job (use: mtxrun --script profile --analyze)
.TP
@@ -192,6 +192,9 @@ do not check for file and enter scroll mode (--dummyfile=whatever.tmp)
.TP
.B --sandbox
process file in a limited environment
+.TP
+.B --addbinarypath
+prepend the (found) binarypath to runners
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml
index 8c21eaa8c5c..0c7038d2680 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml
@@ -4,7 +4,7 @@
<metadata>
<entry name="name">mtx-context</entry>
<entry name="detail">ConTeXt Process Management</entry>
- <entry name="version">1.01</entry>
+ <entry name="version">1.03</entry>
<entry name="comment">external helpinfo file</entry>
</metadata>
<flags>
@@ -74,7 +74,10 @@
<short>strip Lua code (only meant for production where no errors are expected)</short>
</flag>
<flag name="errors" value="list">
- <short>show errors at the end of a run, quit when in list (also when <ref name="--silent"/>)</short>
+ <short>show errors at the end of a run, quit when in list (also when <ref name="silent"/>)</short>
+ </flag>
+ <flag name="htmlerrorpage">
+ <short>generate html error page instead (optional: =scite)</short>
</flag>
<flag name="noconsole">
<short>disable logging to the console (logfile only)</short>
@@ -131,12 +134,16 @@
<flag name="nonstopmode">
<short>run without stopping</short>
</flag>
+ </subcategory>
+ <subcategory>
<flag name="nosynctex">
<short>never initializes synctex (for production runs)</short>
</flag>
<flag name="synctex">
<short>run with synctex enabled (better use \setupsynctex[state=start]</short>
</flag>
+ </subcategory>
+ <subcategory>
<flag name="nodates">
<short>omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM")</short>
</flag>
@@ -146,7 +153,7 @@
<flag name="trailerid">
<short>alternative trailer id (or constant one)</short>
</flag>
- </subcategory>
+ </subcategory>
<subcategory>
<flag name="generate">
<short>generate file database etc. (as luatools does)</short>
@@ -172,12 +179,12 @@
<flag name="touch">
<short>update context version number (also provide <ref name="expert"/>, optionally provide <ref name="basepath"/>)</short>
</flag>
- <flag name="nostatistics">
+ <flag name="nostatistics">
<short>omit runtime statistics at the end of the run</short>
</flag>
- <flag name="update">
+ <!-- flag name="update">
<short>update context from website (not to be confused with contextgarden)</short>
- </flag>
+ </flag -->
<flag name="profile">
<short>profile job (use: mtxrun <ref name="script"/> profile <ref name="analyze"/>)</short>
</flag>
@@ -225,6 +232,11 @@
<short>process file in a limited environment</short>
</flag>
</subcategory>
+ <subcategory>
+ <flag name="addbinarypath">
+ <short>prepend the (found) binarypath to runners</short>
+ </flag>
+ </subcategory>
</category>
</flags>
</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-dvi.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-dvi.man
index e16f2d5b6e7..fe42cb23bd3 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-dvi.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-dvi.man
@@ -1,6 +1,6 @@
-.TH "mtx-dvi" "1" "01-01-2019" "version 0.01" "ConTeXt DVI Helpers"
+.TH "mtx-dvi" "1" "01-01-2020" "version 0.01" "ConTeXt DVI Helpers"
.SH NAME
-.B mtx-dvi
+ mtx-dvi - ConTeXt DVI Helpers
.SH SYNOPSIS
.B mtxrun --script dvi [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man
index ffd6d78ed4c..0c0e26b4987 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man
@@ -1,6 +1,6 @@
-.TH "mtx-epub" "1" "01-01-2019" "version 1.10" "ConTeXt EPUB Helpers"
+.TH "mtx-epub" "1" "01-01-2020" "version 1.10" "ConTeXt EPUB Helpers"
.SH NAME
-.B mtx-epub
+ mtx-epub - ConTeXt EPUB Helpers
.SH SYNOPSIS
.B mtxrun --script epub [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-evohome.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-evohome.man
index 61355fec1cd..90de5613cdd 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-evohome.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-evohome.man
@@ -1,6 +1,6 @@
-.TH "mtx-evohome" "1" "01-01-2019" "version 1.00" "Evohome Fetcher"
+.TH "mtx-evohome" "1" "01-01-2020" "version 1.00" "Evohome Fetcher"
.SH NAME
-.B mtx-evohome
+ mtx-evohome - Evohome Fetcher
.SH SYNOPSIS
.B mtxrun --script evohome [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man
index 65f21761d4e..6bff46e0d77 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man
@@ -1,6 +1,6 @@
-.TH "mtx-fcd" "1" "01-01-2019" "version 1.00" "Fast Directory Change"
+.TH "mtx-fcd" "1" "01-01-2020" "version 1.00" "Fast Directory Change"
.SH NAME
-.B mtx-fcd
+ mtx-fcd - Fast Directory Change
.SH SYNOPSIS
.B mtxrun --script fcd [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man
index 26acb7e411e..b58582f043f 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man
@@ -1,6 +1,6 @@
-.TH "mtx-flac" "1" "01-01-2019" "version 0.10" "ConTeXt Flac Helpers"
+.TH "mtx-flac" "1" "01-01-2020" "version 0.10" "ConTeXt Flac Helpers"
.SH NAME
-.B mtx-flac
+ mtx-flac - ConTeXt Flac Helpers
.SH SYNOPSIS
.B mtxrun --script flac [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man
index a65915e72ed..b137418b909 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man
@@ -1,6 +1,6 @@
-.TH "mtx-fonts" "1" "01-01-2019" "version 1.00" "ConTeXt Font Database Management"
+.TH "mtx-fonts" "1" "01-01-2020" "version 1.00" "ConTeXt Font Database Management"
.SH NAME
-.B mtx-fonts
+ mtx-fonts - ConTeXt Font Database Management
.SH SYNOPSIS
.B mtxrun --script fonts [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man
index cd7d527357e..4c9aa39e532 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man
@@ -1,6 +1,6 @@
-.TH "mtx-grep" "1" "01-01-2019" "version 0.10" "Simple Grepper"
+.TH "mtx-grep" "1" "01-01-2020" "version 0.10" "Simple Grepper"
.SH NAME
-.B mtx-grep
+ mtx-grep - Simple Grepper
.SH SYNOPSIS
.B mtxrun --script grep [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man
index 026a5f67b70..d3531d45674 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man
@@ -1,6 +1,6 @@
-.TH "mtx-interface" "1" "01-01-2019" "version 0.13" "ConTeXt Interface Related Goodies"
+.TH "mtx-interface" "1" "01-01-2020" "version 0.13" "ConTeXt Interface Related Goodies"
.SH NAME
-.B mtx-interface
+ mtx-interface - ConTeXt Interface Related Goodies
.SH SYNOPSIS
.B mtxrun --script interface [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man
index 11586b727c2..5b110d06cc5 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man
@@ -1,6 +1,6 @@
-.TH "mtx-metapost" "1" "01-01-2019" "version 0.10" "MetaPost to PDF processor"
+.TH "mtx-metapost" "1" "01-01-2020" "version 0.10" "MetaPost to PDF processor"
.SH NAME
-.B mtx-metapost
+ mtx-metapost - MetaPost to PDF processor
.SH SYNOPSIS
.B mtxrun --script metapost [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.html
index 279b728b094..76e4b388794 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.html
@@ -39,8 +39,8 @@
<table>
<tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr>
<tr><th/><td/><td/></tr>
- <tr><th>--convert</th><td></td><td>convert source files (tex, mkii, mkiv, mp) to 'ted' files</td></tr>
- <tr><th>--process</th><td></td><td>process source files (tex, mkii, mkiv, mp) to 'pdf' files</td></tr>
+ <tr><th>--convert</th><td></td><td>convert source files (tex, mkii, mkiv, mp, etc.) to 'ted' files</td></tr>
+ <tr><th>--process</th><td></td><td>process source files (tex, mkii, mkiv, mp, etc.) to 'pdf' files</td></tr>
<tr><th>--prep</th><td></td><td>use original name with suffix 'prep' appended</td></tr>
<tr><th>--direct</th><td></td><td>use old method instead of extra</td></tr>
</table>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man
index 56172bd0d20..5eaff034ebf 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man
@@ -1,6 +1,6 @@
-.TH "mtx-modules" "1" "01-01-2019" "version 1.00" "ConTeXt Module Documentation Generators"
+.TH "mtx-modules" "1" "01-01-2020" "version 1.00" "ConTeXt Module Documentation Generators"
.SH NAME
-.B mtx-modules
+ mtx-modules - ConTeXt Module Documentation Generators
.SH SYNOPSIS
.B mtxrun --script modules [
.I OPTIONS ...
@@ -12,10 +12,10 @@
.SH OPTIONS
.TP
.B --convert
-convert source files (tex, mkii, mkiv, mp) to 'ted' files
+convert source files (tex, mkii, mkiv, mp, etc.) to 'ted' files
.TP
.B --process
-process source files (tex, mkii, mkiv, mp) to 'pdf' files
+process source files (tex, mkii, mkiv, mp, etc.) to 'pdf' files
.TP
.B --prep
use original name with suffix 'prep' appended
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.xml
index 4016c815898..46e405aeb7a 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.xml
@@ -8,8 +8,8 @@
<flags>
<category name="basic">
<subcategory>
- <flag name="convert"><short>convert source files (tex, mkii, mkiv, mp) to 'ted' files</short></flag>
- <flag name="process"><short>process source files (tex, mkii, mkiv, mp) to 'pdf' files</short></flag>
+ <flag name="convert"><short>convert source files (tex, mkii, mkiv, mp, etc.) to 'ted' files</short></flag>
+ <flag name="process"><short>process source files (tex, mkii, mkiv, mp, etc.) to 'pdf' files</short></flag>
<flag name="prep"><short>use original name with suffix 'prep' appended</short></flag>
<flag name="direct"><short>use old method instead of extra</short></flag>
</subcategory>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man
index d0bbd639828..02671fa9563 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man
@@ -1,6 +1,6 @@
-.TH "mtx-package" "1" "01-01-2019" "version 0.10" "Distribution Related Goodies"
+.TH "mtx-package" "1" "01-01-2020" "version 0.10" "Distribution Related Goodies"
.SH NAME
-.B mtx-package
+ mtx-package - Distribution Related Goodies
.SH SYNOPSIS
.B mtxrun --script package [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.html
new file mode 100644
index 00000000000..7d5da995dc9
--- /dev/null
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.html
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<!-- compare with lmx framework variant -->
+
+<!--
+ filename : context-base.xml
+ comment : companion to mtx-server-ctx-startup.tex
+ author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+ copyright: PRAGMA ADE / ConTeXt Development Team
+ license : see context related readme files
+-->
+
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <head>
+ <title>ConTeXt Pattern File Management 0.20</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <style type="text/css">
+ body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } .invisible { visibility: hidden; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; }
+ </style>
+ <style type="text/css">
+ </style>
+ </head>
+ <body>
+ <div id="top"> <div id="top-one">
+ <div id="top-two">ConTeXt Pattern File Management 0.20 </div>
+ </div>
+ </div>
+ <div id="bottom"> <div id="bottom-one">
+ <div id="bottom-two">wiki: http://contextgarden.net | mail: ntg-context@ntg.nl | website: http://www.pragma-ade.nl</div>
+ </div>
+ </div>
+ <div id="left"></div>
+ <div id="right"></div>
+ <div id="main">
+ <div id='main-settings'>
+ <h1>Command line options</h1>
+<table>
+ <tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr>
+ <tr><th/><td/><td/></tr>
+ <tr><th>--convert</th><td></td><td>generate context language files (mnemonic driven, if not given then all)</td></tr>
+ <tr><th>--check</th><td></td><td>check pattern file (or those used by context when no file given)</td></tr>
+ <tr><th>--path</th><td></td><td>source path where hyph-foo.tex files are stored</td></tr>
+ <tr><th>--destination</th><td></td><td>destination path</td></tr>
+ <tr><th>--specification</th><td></td><td>additional patterns: e.g.: =cy,hyph-cy,welsh</td></tr>
+ <tr><th>--compress</th><td></td><td>compress data</td></tr>
+ <tr><th>--words</th><td></td><td>update words in given file</td></tr>
+ <tr><th>--hyphenate</th><td></td><td>show hypephenated words</td></tr>
+ </table>
+<br/>
+<h1>Examples</h1>
+<tt>mtxrun --script pattern --check hyph-*.tex</tt>
+<br/><tt>mtxrun --script pattern --check --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns</tt>
+<br/><tt>mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/tex --destination=e:/tmp/patterns</tt>
+<br/><tt>mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/txt --destination=e:/tmp/patterns</tt>
+<br/><tt>mtxrun --script pattern --hyphenate --language=nl --left=3 nogalwiedes inderdaad</tt>
+<br/><br/> </div>
+ </div>
+ </body>
+</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man
new file mode 100644
index 00000000000..320a89e2250
--- /dev/null
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man
@@ -0,0 +1,48 @@
+.TH "mtx-patterns" "1" "01-01-2020" "version 0.20" "ConTeXt Pattern File Management"
+.SH NAME
+ mtx-patterns - ConTeXt Pattern File Management
+.SH SYNOPSIS
+.B mtxrun --script patterns [
+.I OPTIONS ...
+.B ] [
+.I FILENAMES
+.B ]
+.SH DESCRIPTION
+.B ConTeXt Pattern File Management
+.SH OPTIONS
+.TP
+.B --convert
+generate context language files (mnemonic driven, if not given then all)
+.TP
+.B --check
+check pattern file (or those used by context when no file given)
+.TP
+.B --path
+source path where hyph-foo.tex files are stored
+.TP
+.B --destination
+destination path
+.TP
+.B --specification
+additional patterns: e.g.: =cy,hyph-cy,welsh
+.TP
+.B --compress
+compress data
+.TP
+.B --words
+update words in given file
+.TP
+.B --hyphenate
+show hypephenated words
+.SH AUTHOR
+More information about ConTeXt and the tools that come with it can be found at:
+
+
+.B "maillist:"
+ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
+
+.B "webpage:"
+http://www.pragma-ade.nl / http://tex.aanhet.net
+
+.B "wiki:"
+http://contextgarden.net
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.xml
new file mode 100644
index 00000000000..86f3aa48011
--- /dev/null
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<application>
+ <metadata>
+ <entry name="name">mtx-patterns</entry>
+ <entry name="detail">ConTeXt Pattern File Management</entry>
+ <entry name="version">0.20</entry>
+ </metadata>
+ <flags>
+ <category name="basic">
+ <subcategory>
+ <flag name="convert"><short>generate context language files (mnemonic driven, if not given then all)</short></flag>
+ <flag name="check"><short>check pattern file (or those used by context when no file given)</short></flag>
+ <flag name="path"><short>source path where hyph-foo.tex files are stored</short></flag>
+ <flag name="destination"><short>destination path</short></flag>
+ <flag name="specification"><short>additional patterns: e.g.: =cy,hyph-cy,welsh</short></flag>
+ <flag name="compress"><short>compress data</short></flag>
+ <flag name="words"><short>update words in given file</short></flag>
+ <flag name="hyphenate"><short>show hypephenated words</short></flag>
+ </subcategory>
+ </category>
+ </flags>
+ <examples>
+ <category>
+ <title>Examples</title>
+ <subcategory>
+ <example><command>mtxrun --script pattern --check hyph-*.tex</command></example>
+ <example><command>mtxrun --script pattern --check --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns</command></example>
+ <example><command>mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/tex --destination=e:/tmp/patterns</command></example>
+ <example><command>mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/txt --destination=e:/tmp/patterns</command></example>
+ <example><command>mtxrun --script pattern --hyphenate --language=nl --left=3 nogalwiedes inderdaad</command></example>
+ </subcategory>
+ </category>
+ </examples>
+</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man
index 8595fcbafcd..df5501b9534 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man
@@ -1,6 +1,6 @@
-.TH "mtx-pdf" "1" "01-01-2019" "version 0.10" "ConTeXt PDF Helpers"
+.TH "mtx-pdf" "1" "01-01-2020" "version 0.10" "ConTeXt PDF Helpers"
.SH NAME
-.B mtx-pdf
+ mtx-pdf - ConTeXt PDF Helpers
.SH SYNOPSIS
.B mtxrun --script pdf [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man
index a242a4a24b2..431db53a107 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man
@@ -1,6 +1,6 @@
-.TH "mtx-plain" "1" "01-01-2019" "version 1.00" "Plain TeX Runner"
+.TH "mtx-plain" "1" "01-01-2020" "version 1.00" "Plain TeX Runner"
.SH NAME
-.B mtx-plain
+ mtx-plain - Plain TeX Runner
.SH SYNOPSIS
.B mtxrun --script plain [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man
index 1e38a3b5a25..f520a9e139a 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man
@@ -1,6 +1,6 @@
-.TH "mtx-profile" "1" "01-01-2019" "version 1.00" "ConTeXt MkIV LuaTeX Profiler"
+.TH "mtx-profile" "1" "01-01-2020" "version 1.00" "ConTeXt MkIV LuaTeX Profiler"
.SH NAME
-.B mtx-profile
+ mtx-profile - ConTeXt MkIV LuaTeX Profiler
.SH SYNOPSIS
.B mtxrun --script profile [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man
index 49a139cb4d0..60b87707303 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man
@@ -1,6 +1,6 @@
-.TH "mtx-rsync" "1" "01-01-2019" "version 0.10" "Rsync Helpers"
+.TH "mtx-rsync" "1" "01-01-2020" "version 0.10" "Rsync Helpers"
.SH NAME
-.B mtx-rsync
+ mtx-rsync - Rsync Helpers
.SH SYNOPSIS
.B mtxrun --script rsync [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.html
index 497098f9ee3..957d7595e3f 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.html
@@ -41,7 +41,7 @@
<tr><th/><td/><td/></tr>
<tr><th>--words</th><td></td><td>convert spell-*.txt into spell-*.lua</td></tr>
<tr><th>--tree</th><td></td><td>converts a tree into an html tree (--source --target --numbers)</td></tr>
- <tr><th>--file</th><td></td><td>converts a file into an html tree (--source --target --numbers --lexer)</td></tr>
+ <tr><th>--file</th><td></td><td>converts a file into an html file (--source --target --numbers --lexer)</td></tr>
</table>
<br/>
</div>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man
index a37d38fde14..2e83387f9df 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man
@@ -1,6 +1,6 @@
-.TH "mtx-scite" "1" "01-01-2019" "version 1.00" "Scite Helper Script"
+.TH "mtx-scite" "1" "01-01-2020" "version 1.00" "Scite Helper Script"
.SH NAME
-.B mtx-scite
+ mtx-scite - Scite Helper Script
.SH SYNOPSIS
.B mtxrun --script scite [
.I OPTIONS ...
@@ -18,7 +18,7 @@ convert spell-*.txt into spell-*.lua
converts a tree into an html tree (--source --target --numbers)
.TP
.B --file
-converts a file into an html tree (--source --target --numbers --lexer)
+converts a file into an html file (--source --target --numbers --lexer)
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.xml
index 65ad8736a57..f49aa8116dc 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.xml
@@ -10,7 +10,7 @@
<subcategory>
<flag name="words"><short>convert spell-*.txt into spell-*.lua</short></flag>
<flag name="tree"><short>converts a tree into an html tree (--source --target --numbers)</short></flag>
- <flag name="file"><short>converts a file into an html tree (--source --target --numbers --lexer)</short></flag>
+ <flag name="file"><short>converts a file into an html file (--source --target --numbers --lexer)</short></flag>
</subcategory>
</category>
</flags>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man
index da0c4c05dd0..ee565d4164e 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man
@@ -1,6 +1,6 @@
-.TH "mtx-server" "1" "01-01-2019" "version 0.10" "Simple Webserver For Helpers"
+.TH "mtx-server" "1" "01-01-2020" "version 0.10" "Simple Webserver For Helpers"
.SH NAME
-.B mtx-server
+ mtx-server - Simple Webserver For Helpers
.SH SYNOPSIS
.B mtxrun --script server [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man
index 016aa1f7d7a..67e84a4d7ba 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man
@@ -1,6 +1,6 @@
-.TH "mtx-texworks" "1" "01-01-2019" "version 1.00" "TeXworks Startup Script"
+.TH "mtx-texworks" "1" "01-01-2020" "version 1.00" "TeXworks Startup Script"
.SH NAME
-.B mtx-texworks
+ mtx-texworks - TeXworks Startup Script
.SH SYNOPSIS
.B mtxrun --script texworks [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man
index 479506c7012..582898c1ac0 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man
@@ -1,6 +1,6 @@
-.TH "mtx-timing" "1" "01-01-2019" "version 0.10" "ConTeXt Timing Tools"
+.TH "mtx-timing" "1" "01-01-2020" "version 0.10" "ConTeXt Timing Tools"
.SH NAME
-.B mtx-timing
+ mtx-timing - ConTeXt Timing Tools
.SH SYNOPSIS
.B mtxrun --script timing [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man
index 1cee94d9d62..6626110b711 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man
@@ -1,6 +1,6 @@
-.TH "mtx-tools" "1" "01-01-2019" "version 1.01" "Some File Related Goodies"
+.TH "mtx-tools" "1" "01-01-2020" "version 1.01" "Some File Related Goodies"
.SH NAME
-.B mtx-tools
+ mtx-tools - Some File Related Goodies
.SH SYNOPSIS
.B mtxrun --script tools [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unicode.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unicode.man
index e82ee65ee45..072ff371fa5 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unicode.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unicode.man
@@ -1,6 +1,6 @@
-.TH "mtx-unicode" "1" "01-01-2019" "version 1.02" "Checker for char-dat.lua"
+.TH "mtx-unicode" "1" "01-01-2020" "version 1.02" "Checker for char-dat.lua"
.SH NAME
-.B mtx-unicode
+ mtx-unicode - Checker for char-dat.lua
.SH SYNOPSIS
.B mtxrun --script unicode [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.html
index 655c1be8db4..60172eaa8c1 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.html
@@ -40,8 +40,7 @@
<tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr>
<tr><th/><td/><td/></tr>
<tr><th>--list</th><td></td><td>list files in archive</td></tr>
- <tr><th>--junk</th><td></td><td>flatten unzipped directory structure</td></tr>
- <tr><th>--extract</th><td></td><td>extract files</td></tr>
+ <tr><th>--extract</th><td></td><td>extract files [--silent --steps]</td></tr>
</table>
<br/>
</div>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man
index f0243c38cff..d67698c599c 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man
@@ -1,6 +1,6 @@
-.TH "mtx-unzip" "1" "01-01-2019" "version 0.10" "Simple Unzipper"
+.TH "mtx-unzip" "1" "01-01-2020" "version 0.10" "Simple Unzipper"
.SH NAME
-.B mtx-unzip
+ mtx-unzip - Simple Unzipper
.SH SYNOPSIS
.B mtxrun --script unzip [
.I OPTIONS ...
@@ -14,11 +14,8 @@
.B --list
list files in archive
.TP
-.B --junk
-flatten unzipped directory structure
-.TP
.B --extract
-extract files
+extract files [--silent --steps]
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.xml
index 9f56ca076d1..0346957f645 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.xml
@@ -9,8 +9,7 @@
<category name="basic">
<subcategory>
<flag name="list"><short>list files in archive</short></flag>
- <flag name="junk"><short>flatten unzipped directory structure</short></flag>
- <flag name="extract"><short>extract files</short></flag>
+ <flag name="extract"><short>extract files [--silent --steps]</short></flag>
</subcategory>
</category>
</flags>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man
index 4ec518b0dac..35500fb6daa 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man
@@ -1,6 +1,6 @@
-.TH "mtx-update" "1" "01-01-2019" "version 1.03" "ConTeXt Minimals Updater"
+.TH "mtx-update" "1" "01-01-2020" "version 1.03" "ConTeXt Minimals Updater"
.SH NAME
-.B mtx-update
+ mtx-update - ConTeXt Minimals Updater
.SH SYNOPSIS
.B mtxrun --script update [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.html
new file mode 100644
index 00000000000..32a6d5e74c5
--- /dev/null
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.html
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<!-- compare with lmx framework variant -->
+
+<!--
+ filename : context-base.xml
+ comment : companion to mtx-server-ctx-startup.tex
+ author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+ copyright: PRAGMA ADE / ConTeXt Development Team
+ license : see context related readme files
+-->
+
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <head>
+ <title>vscode extension generator</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <style type="text/css">
+ body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } .invisible { visibility: hidden; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; }
+ </style>
+ <style type="text/css">
+ </style>
+ </head>
+ <body>
+ <div id="top"> <div id="top-one">
+ <div id="top-two">vscode extension generator </div>
+ </div>
+ </div>
+ <div id="bottom"> <div id="bottom-one">
+ <div id="bottom-two">wiki: http://contextgarden.net | mail: ntg-context@ntg.nl | website: http://www.pragma-ade.nl</div>
+ </div>
+ </div>
+ <div id="left"></div>
+ <div id="right"></div>
+ <div id="main">
+ <div id='main-settings'>
+ <h1>Command line options</h1>
+<table>
+ <tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr>
+ <tr><th/><td/><td/></tr>
+ <tr><th>--generate</th><td></td><td>generate extension in sync with current version</td></tr>
+ <tr><th>--start</th><td></td><td>start vscode with extension context</td></tr>
+ </table>
+<br/>
+<h1>Example</h1>
+<tt>mtxrun --script vscode --generate e:/vscode/extensions</tt>
+<br/><tt>mtxrun --script vscode --generate</tt>
+<br/><tt>mtxrun --script vscode --start</tt>
+<br/><br/> </div>
+ </div>
+ </body>
+</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.man
new file mode 100644
index 00000000000..f1c886fa0f4
--- /dev/null
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.man
@@ -0,0 +1,30 @@
+.TH "mtx-vscode" "1" "01-01-2020" "version 1.00" "vscode extension generator"
+.SH NAME
+ mtx-vscode - vscode extension generator
+.SH SYNOPSIS
+.B mtxrun --script vscode [
+.I OPTIONS ...
+.B ] [
+.I FILENAMES
+.B ]
+.SH DESCRIPTION
+.B vscode extension generator
+.SH OPTIONS
+.TP
+.B --generate
+generate extension in sync with current version
+.TP
+.B --start
+start vscode with extension context
+.SH AUTHOR
+More information about ConTeXt and the tools that come with it can be found at:
+
+
+.B "maillist:"
+ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
+
+.B "webpage:"
+http://www.pragma-ade.nl / http://tex.aanhet.net
+
+.B "wiki:"
+http://contextgarden.net
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.xml
new file mode 100644
index 00000000000..c4cf3167e4f
--- /dev/null
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<application>
+ <metadata>
+ <entry name="name">mtx-vscode</entry>
+ <entry name="detail">vscode extension generator</entry>
+ <entry name="version">1.00</entry>
+ </metadata>
+ <flags>
+ <category name="basic">
+ <subcategory>
+ <flag name="generate"><short>generate extension in sync with current version</short></flag>
+ <flag name="start"><short>start vscode with extension context</short></flag>
+ </subcategory>
+ </category>
+ </flags>
+ <examples>
+ <category>
+ <title>Example</title>
+ <subcategory>
+ <example><command>mtxrun --script vscode --generate e:/vscode/extensions</command></example>
+ <example><command>mtxrun --script vscode --generate</command></example>
+ <example><command>mtxrun --script vscode --start</command></example>
+ </subcategory>
+ </category>
+ </examples>
+</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man
index 8cc32f4a552..185dc64bc71 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man
@@ -1,6 +1,6 @@
-.TH "mtx-watch" "1" "01-01-2019" "version 1.00" "ConTeXt Request Watchdog"
+.TH "mtx-watch" "1" "01-01-2020" "version 1.00" "ConTeXt Request Watchdog"
.SH NAME
-.B mtx-watch
+ mtx-watch - ConTeXt Request Watchdog
.SH SYNOPSIS
.B mtxrun --script watch [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man
index fa650a0b6a0..6d4e8b1df82 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man
@@ -1,6 +1,6 @@
-.TH "mtx-youless" "1" "01-01-2019" "version 1.100" "youless Fetcher"
+.TH "mtx-youless" "1" "01-01-2020" "version 1.100" "youless Fetcher"
.SH NAME
-.B mtx-youless
+ mtx-youless - youless Fetcher
.SH SYNOPSIS
.B mtxrun --script youless [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.html
index f0eef2ae7a6..7ee29b2d192 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.html
@@ -40,7 +40,7 @@
<tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr>
<tr><th/><td/><td/></tr>
<tr><th>--script</th><td></td><td>run an mtx script (lua prefered method) (--noquotes), no script gives list</td></tr>
- <tr><th>--evaluate</th><td></td><td>run code passed on the commandline (between quotes)</td></tr>
+ <tr><th>--evaluate</th><td></td><td>run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)</td></tr>
<tr><th>--execute</th><td></td><td>run a script or program (texmfstart method) (--noquotes)</td></tr>
<tr><th>--resolve</th><td></td><td>resolve prefixed arguments</td></tr>
<tr><th>--ctxlua</th><td></td><td>run internally (using preloaded libs)</td></tr>
@@ -57,6 +57,7 @@
<tr><th>--stubpath</th><td>binpath</td><td>paths where stubs wil be written</td></tr>
<tr><th>--windows</th><td></td><td>create windows (mswin) stubs</td></tr>
<tr><th>--unix</th><td></td><td>create unix (linux) stubs</td></tr>
+ <tr><th>--addbinarypath</th><td></td><td>prepend the (found) binarypath to runners</td></tr>
<tr><th/><td/><td/></tr>
<tr><th>--verbose</th><td></td><td>give a bit more info</td></tr>
<tr><th>--trackers</th><td>list</td><td>enable given trackers</td></tr>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man
index 70dd035c440..8118c9c7f7d 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man
@@ -1,6 +1,6 @@
-.TH "mtxrun" "1" "01-01-2019" "version 1.33" "ConTeXt TDS Runner Tool"
+.TH "mtxrun" "1" "01-01-2020" "version 1.33" "ConTeXt TDS Runner Tool"
.SH NAME
-.B mtxrun
+ mtxrun - ConTeXt TDS Runner Tool
.SH SYNOPSIS
.B mtxrun [
.I OPTIONS ...
@@ -15,7 +15,7 @@
run an mtx script (lua prefered method) (--noquotes), no script gives list
.TP
.B --evaluate
-run code passed on the commandline (between quotes)
+run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)
.TP
.B --execute
run a script or program (texmfstart method) (--noquotes)
@@ -59,6 +59,9 @@ create windows (mswin) stubs
.B --unix
create unix (linux) stubs
.TP
+.B --addbinarypath
+prepend the (found) binarypath to runners
+.TP
.B --verbose
give a bit more info
.TP
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.xml
index 5e2c81c9faf..e9ea5a10f65 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.xml
@@ -9,7 +9,7 @@
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
- <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -28,6 +28,7 @@
<flag name="stubpath" value="binpath"><short>paths where stubs wil be written</short></flag>
<flag name="windows"><short>create windows (mswin) stubs</short></flag>
<flag name="unix"><short>create unix (linux) stubs</short></flag>
+ <flag name="addbinarypath"><short>prepend the (found) binarypath to runners</short></flag>
</subcategory>
<subcategory>
<flag name="verbose"><short>give a bit more info</short></flag>
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/manuals-explaining-contents.tex b/Master/texmf-dist/doc/context/sources/general/fonts/manuals-explaining-contents.tex
deleted file mode 100644
index 3e1fadabc13..00000000000
--- a/Master/texmf-dist/doc/context/sources/general/fonts/manuals-explaining-contents.tex
+++ /dev/null
@@ -1,11 +0,0 @@
-% language=uk
-
-\startcomponent manuals-explaining-contents
-
- \starttitle[title=Contents][color=darkgray]
-
- \placelist[chapter][criterium=text]
-
- \stoptitle
-
-\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/manuals-explaining-cover.tex b/Master/texmf-dist/doc/context/sources/general/fonts/manuals-explaining-cover.tex
deleted file mode 100644
index 8b4f3e891ba..00000000000
--- a/Master/texmf-dist/doc/context/sources/general/fonts/manuals-explaining-cover.tex
+++ /dev/null
@@ -1,199 +0,0 @@
-% language=uk
-
-% Please try to be original and don't just copy this cover page as I don't want
-% confusion and be associated with (or responsibility for the look of) similar
-% looking documents.
-
-\startenvironment manuals-explaining-cover
-
-\startsetups document:abstract
- \framed [
- foregroundstyle=bold,
- foregroundcolor=white,
- width=7.5cm,
- align={normal,tolerant},
- frame=off,
- strut=no,
- ] {
- \getbuffer[abstract]
- }
-\stopsetups
-
-\startMPinclusions
-
- def DrawCoverPage (expr what) =
-
- numeric variant ; variant := 1 ;
-
- StartCover ;
-
- save width, height, size, anchor, offset, colors ;
-
- numeric width, height, size ; pair anchor, offset ; string colors[] ;
-
- colors[1] := "\documentvariable{cover:color:1}" ;
- colors[2] := "\documentvariable{cover:color:2}" ;
- colors[3] := "\documentvariable{cover:color:3}" ;
- colors[4] := "\documentvariable{cover:color:4}" ;
- colors[5] := "\documentvariable{cover:color:5}" ;
-
- fill CoverPage enlarged PaperBleed withcolor colors[5] ;
-
- fill Spine bottomenlarged -.5PaperHeight withcolor colors[3] ;
- fill Spine topenlarged -.5PaperHeight withcolor colors[2] ;
-
- width := FrontPageWidth ;
- height := FrontPageHeight ;
- size := 4 * width / 3 ;
- offset := (-1cm,1cm) ;
- anchor := .5[lrcorner CoverPage,urcorner CoverPage] ;
-
- fill anchored.llft(lltriangle scaled size, urcorner FrontPage) withcolor colors[1] ;
- fill anchored.urt (urtriangle scaled size, llcorner FrontPage) withcolor colors[2] ;
- fill anchored.lrt (lrtriangle scaled size, ulcorner FrontPage) withcolor colors[3] ;
- fill anchored.ulft(ultriangle scaled size, lrcorner FrontPage) withcolor colors[4] ;
-
- fill anchored.lrt (lrtriangle scaled size, ulcorner BackPage) withcolor colors[1] ;
- fill anchored.llft(lltriangle scaled size, urcorner BackPage) withcolor colors[3] ;
- fill anchored.ulft(ultriangle scaled size, lrcorner BackPage) withcolor colors[2] ;
- fill anchored.urt (urtriangle scaled size, llcorner BackPage) withcolor colors[4] ;
-
- draw thetextext.llft(
- textext("\bf \documentvariable{title}\hskip-.1em")
- rotated 45 ysized .350height,
- anchor shifted (6*offset+offset)
- ) withcolor white ;
- draw thetextext.llft(
- textext("\bf \documentvariable{subtitle}")
- rotated 45 ysized .275height,
- anchor shifted (5*offset+offset)
- ) withcolor white ;
- draw thetextext.llft(
- textext("\bf \documentvariable{author}")
- rotated 45 ysized .200height,
- anchor shifted (2*offset+offset)
- ) withcolor white ;
- draw thetextext.llft(
- textext("\bf \documentvariable{affiliation}")
- rotated 45 ysized .200height,
- anchor shifted (1*offset+offset)
- ) withcolor white ;
-
- % for the moment
-
- if (what = "back") or (what = "cover") :
-
- draw
- thetextext.top(
- textext("\bf \documentvariable{comment}")
- xsized 4cm,
- lrcorner Page shifted (-3cm,1cm)
- ) withcolor white ;
-
- fi ;
-
- % till here
-
- width := BackPageWidth ;
-
- if (what = "back") or (what = "cover") :
-
- draw thetextext(
- textext("\bf\setups[document:abstract]")
- xsized .65width rotated 45,
- center BackPage
- ) withcolor white ;
-
- fi ;
-
- if what = "cover" :
-
- draw thetextext.bot(
- textext("\bf \documentvariable{title}\hskip-.1em")
- rotated 90 xsized .8SpineWidth,
- .5[ulcorner Spine,urcorner Spine] shifted (0,-1cm)
- ) withcolor white ;
-
- draw thetextext.top(
- textext("\bf \documentvariable{author}")
- rotated 90 xsized .8SpineWidth,
- .5[llcorner Spine,lrcorner Spine] shifted (0,1cm)
- ) withcolor white ;
-
- fi ;
-
- StopCover ;
-
- if what = "front" :
- clip currentpicture to FrontPage ;
- elseif what = "back" :
- clip currentpicture to BackPage ;
- else :
- drawboundary CoverPage ;
- fi ;
-
- enddef ;
-
-\stopMPinclusions
-
-\startsetups document:start
-
- % \startcovermatter[front]
-
- \setupbackgrounds[page][background=]
-
- \doifmodeelse {simple} {
-
- \startMPpage
- DrawCoverPage("front") ;
- \stopMPpage
-
- } {
-
- \startMPpage
- DrawCoverPage("cover") ;
- \stopMPpage
-
- }
-
- \page[dummy]
-
- \setupbackgrounds[page][background=page]
-
- \resetuserpagenumber
-
- % \stopcovermatter
-
-\stopsetups
-
-\startsetups document:stop
-
- \doifmodeelse {simple} {
-
- % \startcovermatter[back]
-
- \page
-
- \setuppagenumbering[page=]
-
- \setupbackgrounds[page][background=]
-
- \page[empty,left]
-
- \setupmakeup[doublesided=no,page=no]
-
- \startMPpage
- DrawCoverPage("back") ;
- \stopMPpage
-
- % \stopcovermatter
-
- } {
-
- % not needed as it's part of the cover page
-
- }
-
-\stopsetups
-
-\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/manuals-explaining-environment.tex b/Master/texmf-dist/doc/context/sources/general/fonts/manuals-explaining-environment.tex
deleted file mode 100644
index f896c219bbe..00000000000
--- a/Master/texmf-dist/doc/context/sources/general/fonts/manuals-explaining-environment.tex
+++ /dev/null
@@ -1,325 +0,0 @@
-\startenvironment manuals-explaining-environment
-
-\usemodule[abr-01]
-\usemodule[visual]
-\usemodule[simulate]
-\usemodule[chart]
-\usemodule[nodechart]
-
-% done
-
-\dontcomplain
-
-\definepapersize
- [book]
- [width=18cm,
- height=24cm]
-
-\setuppapersize
- [book]
-
-\startmode[oversized]
-
- \setuppapersize
- [book]
- [oversized]
-
- \setuplayout
- [marking=on]
-
-\stopmode
-
-\setuplayout
- [location=middle,
- topspace=1.5cm,
- bottomspace=2cm,
- backspace=2cm,
- cutspace=2cm,
- header=0cm,
- footer=0cm,
- margindistance=.25cm,
- margin=1.25cm,
- width=middle,
- height=middle]
-
-\setuplayout
- [style=\ss]
-
-\usetypescript
- [dejavu-condensed]
-
-\setupbodyfont
- [ipaex,9pt]
-
-\setupbodyfont
- [dejavu,9pt]
-
-\definetyping
- [narrowtyping]
- [typing]
- [bodyfont=dejavu-condensed]
-
-% This is way too ugly for a manual:
-%
-% \setuptyping
-% [indentnext=no]
-%
-% \setupindenting
-% [medium,yes]
-
-\setupwhitespace
- [big]
-
-\defineoverlay
- [page]
- [\useMPgraphic{page}]
-
-\setupbackgrounds
- [page]
- [background=page]
-
-\setuphead
- [chapter,section,subsection]
- [color=\namedstructureuservariable{chapter}{color}]
-
-\setuphead
- [chapter]
- [style=\bfc]
-
-\setuphead
- [section]
- [style=\bfb]
-
-\setuphead
- [subsection]
- [style=\bf,
- before=\blank,
- after=\blank]
-
-\startsetups document:chapter:inside
- \definecolor[maincolor][1.0(\namedheadparameter{chapter}{color})] % this expands the color
- \definecolor[halfcolor][0.5(maincolor,white)]
-\stopsetups
-
-\setuphead
- [chapter]
- [insidesection=\directsetup{document:chapter:inside}]
-
-\setuppagenumbering
- [alternative=doublesided,
- location=]
-
-\setuplist
- [aligntitle=yes]
-
-\setuplist
- [chapter]
- [pagenumber=no,
- style=bold,
- before={\blank\startcolor[\structurelistuservariable{color}]},
- after={\placelist[section]\stopcolor}]
-
-\setuplist
- [chapter,section]
- [width=3em]
-
-\startuseMPgraphic{page}
-
- StartPage ;
-
- linecap := butt ;
-
- if OnRightPage :
-
- path p ; p := (
- urcorner Page shifted (-2cm,0) --
- urcorner Page --
- urcorner Page shifted (0,-2cm) -- cycle
- ) shifted (-2.5mm,-2.5mm) ;
-
- else :
-
- path p ; p := (
- ulcorner Page shifted (2cm,0) --
- ulcorner Page --
- ulcorner Page shifted (0,-2cm) -- cycle
- ) shifted (2.5mm,-2.5mm) ;
-
- fi ;
-
- fill p
- withpen pencircle scaled 1mm
- withcolor "maincolor" ;
-
- draw thetextext("\bf\userpagenumber",
- if OnRightPage : urcorner p shifted (-5mm,-5mm) else : ulcorner p shifted (5mm,-5mm) fi)
- withcolor white ;
-
- if OnRightPage :
-
- path p ; p := (
- lrcorner Page shifted (-5cm,0) --
- lrcorner Page
- ) shifted (-5mm,10mm)
-
- else :
-
- path p ; p := (
- llcorner Page shifted (5cm,0) --
- llcorner Page
- ) shifted (5mm,10mm) ;
-
- fi ;
-
- draw p
- withpen pencircle scaled 1mm
- withcolor "maincolor" ;
-
- draw if OnRightPage :
- thetextext.lft("\bf\getspecificstructuretitle{chapter}",lrcorner Page shifted (-5mm,5mm))
- else :
- thetextext.rt ("\bf\getspecificstructuretitle{chapter}",llcorner Page shifted ( 5mm,5mm))
- fi withcolor "\namedstructureuservariable{chapter}{color}" ;
-
- StopPage ;
-\stopuseMPgraphic
-
-\definecolor[orange] [r=1,g=.6,b=.1]
-
-\definecolor[middlegray] [s=.75]
-\definecolor[darkgray] [s=.25]
-\definecolor[darkred] [r=.5]
-\definecolor[darkgreen] [g=.5]
-\definecolor[darkblue] [b=.5]
-
-\definecolor[darkyellow] [.5(red,green)]
-\definecolor[darkmagenta][.5(red,blue)]
-\definecolor[darkcyan] [.5(green,blue)]
-
-\definecolor[darkorange] [.5(orange)]
-
-\definecolor[maincolor] [darkgray]
-
-\definecolor [mix-1] [r=1,g=.75,b=.25] \definecolor [darkmix-1][.5(mix-1)]
-\definecolor [mix-2] [r=1,g=.25,b=.75] \definecolor [darkmix-2][.5(mix-2)]
-\definecolor [mix-3] [r=.75,g=1,b=.25] \definecolor [darkmix-3][.5(mix-3)]
-\definecolor [mix-4] [r=.75,g=.25,b=1] \definecolor [darkmix-4][.5(mix-4)]
-\definecolor [mix-5] [r=.25,g=1,b=.75] \definecolor [darkmix-5][.5(mix-5)]
-\definecolor [mix-6] [r=.25,g=.75,b=1] \definecolor [darkmix-6][.5(mix-6)]
-
-% \blackrule[height=1cm,width=10cm,color=mix-1] \blackrule[height=1cm,width=10cm,color=darkmix-1]
-% \blackrule[height=1cm,width=10cm,color=mix-2] \blackrule[height=1cm,width=10cm,color=darkmix-2]
-% \blackrule[height=1cm,width=10cm,color=mix-3] \blackrule[height=1cm,width=10cm,color=darkmix-3]
-% \blackrule[height=1cm,width=10cm,color=mix-4] \blackrule[height=1cm,width=10cm,color=darkmix-4]
-% \blackrule[height=1cm,width=10cm,color=mix-5] \blackrule[height=1cm,width=10cm,color=darkmix-5]
-% \blackrule[height=1cm,width=10cm,color=mix-6] \blackrule[height=1cm,width=10cm,color=darkmix-6]
-
-% modules
-
-\setupsorting
- [logo]
- [style=]
-
-\setupFLOWchart
- [width=6em,
- height=3em,
- offset=-2em, % maybe default : todo: hoffset and voffset
- dx=2em,
- dy=2em]
-
-\setupFLOWlines
- [color=maincolor]
-
-\setupFLOWshapes
- [rulecolor=maincolor]
-
-% tables
-
-\setuptabulate
- [rulethickness=.5mm,
- rulecolor=maincolor]
-
-% special commands
-
-\startuniqueMPgraphic{reference}{color}
- fill
- .5[llcorner OverlayBox,ulcorner OverlayBox] --
- .5[ulcorner OverlayBox,urcorner OverlayBox] --
- .5[urcorner OverlayBox,lrcorner OverlayBox] --
- .5[lrcorner OverlayBox,llcorner OverlayBox] -- cycle
- withcolor \MPvar{color} ;
-\stopuniqueMPgraphic
-
-\startuniqueMPgraphic{reference}{color}
- path p ; p := OverlayBox enlarged -1mm ;
- filldraw
- ulcorner p --
- urcorner p --
- lrcorner p --
- .5[lrcorner p,llcorner p] shifted (0,-1ExHeight) --
- llcorner p -- cycle
- withpen pencircle scaled 1mm
- withcolor \MPvar{color} ;
- setbounds currentpicture to OverlayBox enlarged 1ExHeight ;
-\stopuniqueMPgraphic
-
-\defineoverlay
- [reference]
- [\uniqueMPgraphic{reference}{color=maincolor,}]
-
-\definecolor
- [maincolor]
- [red]
-
-\definemargindata
- [appendixdata]
- %[inner]
- [outer]
- [stack=yes]
-
-\definemarginframed
- [appendixdata]
- [width=3.5em,
- height=\lineheight, % we know what goes in there
- align=middle,
- offset=overlay,
- foregroundcolor=white,
- background=reference]
-
-% todo:
-%
-% \appendixdata[reference=bla]{}
-%
-% whole data
-
-% interaction
-
-\setupinteraction
- [state=start,
- click=no,
- color=,
- contrastcolor=,
- style=]
-
-% whatever
-
-\definestartstop
- [notabene]
- [before=\blank,
- after=\blank,
- style=\em]
-
-\setuphyphenation
- [method=default]
-
-
-\startbuffer[underconstruction]
-\startnotabene
- This document is still under construction. The functionality discussed here
- will stay and more might show up. Of course there are errors, and they're all
- mine. The text is not checked for spelling errors. Feel free to let me know
- what should get added.
-\stopnotabene
-\stopbuffer
-
-\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-common.tex b/Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-common.tex
new file mode 100644
index 00000000000..52cc317978e
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-common.tex
@@ -0,0 +1,80 @@
+\startenvironment leaflet-common
+
+%D Please don't abuse this style for your own purpose as the look and feel
+%D is reserved for our own purpose. Be creative instead.
+
+\usemodule
+ [abbreviations-logos]
+
+\setupbodyfont
+ [plex,12pt]
+
+\setuplayout
+ [page]
+
+\setupalign
+ [verytolerant,stretch]
+
+\startluacode
+ function document.graphic()
+ local min, max, random, round = math.min, math.max, math.random, math.round
+
+ local width = 210
+ local height = 297
+ local r, g, b = 3, 3, 3
+
+ local bitmap = graphics.bitmaps.new(width,height,"rgb",1)
+ local data = bitmap.data
+
+ local graphic = tonumber(documentdata.variable("graphic"))
+
+ if graphic == 1 then
+ r, g, b = 4, 3, 2
+ elseif graphic == 2 then
+ r, g, b = 2, 3, 4
+ end
+
+ for i=1,height do
+ local d = data[i]
+ for j=1,width do
+ local c = random(128,255)
+ -- d[j] = { 0, 0, c }
+ d[j] = { c//r, c//g, c//b }
+ end
+ end
+
+ graphics.bitmaps.tocontext(bitmap,"210bp","297bp")
+ end
+\stopluacode
+
+\definelayer
+ [page]
+ [width=\paperwidth,
+ height=\paperheight]
+
+\setupcolors
+ [textcolor=white]
+
+\setupbackgrounds
+ [page]
+ [background=page]
+
+\setupmakeup
+ [page]
+ [style=\bf,
+ top=,
+ bottom=]
+
+\startsetups document:start
+
+ \setlayerframed
+ [page]
+ [offset=overlay]
+ {\scale
+ [width=\textwidth,
+ height=\textheight]
+ {\ctxlua{document.graphic()}}}
+
+\stopsetups
+
+\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-context.tex b/Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-context.tex
new file mode 100644
index 00000000000..7bab43b12a6
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-context.tex
@@ -0,0 +1,129 @@
+\environment leaflet-common
+
+\startdocument[graphic=1]
+
+\startbuffer[1]
+ There are several ways to deploy \CONTEXT. Most common is to let it render a
+ document, in which case you install it on a system and use an editor to input
+ your document and from a console or by clicking some key trigger a run. The
+ input can be structured using \TEX\ macros but it can also be \XML, or some
+ other format that gets converted to \CONTEXT\ commands before processing.
+\stopbuffer
+
+\startbuffer[2]
+ Instead you can also use \CONTEXT\ as a more hidden application, for instance
+ in a web service or rendering component in a larger application. In that case
+ the end user is not really aware that \TEX\ is being used.
+\stopbuffer
+
+\startbuffer[3]
+ No matter how you use \CONTEXT, you need to install it first. You can for
+ instance use \TEX live or another distribution to pick up \CONTEXT, but you
+ can also install it using the archive (snapshot), in which case you also need
+ to pick up the engine (for instance \LUATEX) and a basic set of fonts. In
+ order to make installation easy we provide a so called standalone
+ distribution that has all you need.
+\stopbuffer
+
+\startbuffer[4]
+
+ The standalone \CONTEXT\ distribution has the following characteristics:
+
+ \startitemize
+ \startitem
+ The installation is self contained. Apart from resources like fonts,
+ the \TEX\ macros, \LUA\ code and \METAPOST\ helpers are provided in
+ one package.
+ \stopitem
+ \startitem
+ There is only one binary involved: \LUAMETATEX. The source code of
+ this program is integral part of the \CONTEXT\ distribution (per end
+ 2019). A user should be able to compile the program if needed. There
+ is no dependency on additional libraries other than those that make
+ up the operating system.
+ \stopitem
+ \startitem
+ The core system is able to typeset documents in an efficient way. The
+ memory footprint is decent and performance acceptable, also on on low
+ power devices and virtual machines. We try not to provide bloatware.
+ \stopitem
+ \startitem
+ The official user interface is stable and the implementation of core
+ components will not change fundamentally. When something can be
+ improved it will be. One can use a snapshot for long term stability.
+ \stopitem
+ \startitem
+ Support is provided by means of a mailing list, a wiki,
+ documentation, meetings, etc. If needed you can consult (or hire)
+ support. There are enough experienced users out there to get you
+ going.
+ \stopitem
+ \stopitemize
+\stopbuffer
+
+\startbuffer[5]
+ The first version of \CONTEXT, now tagged \MKII, has been around since 1995
+ and (still) runs on top of \PDFTEX. The development of its successor \MKIV\
+ started in 2005 as part of the \LUATEX\ development and still carries on. The
+ most recent incarnation is \LMTX, which is \MKIV\ but tuned for \LUAMETATEX,
+ the lean and mean successor of \LUATEX.
+\stopbuffer
+
+% we could use a collector
+
+\startpagemakeup
+ \offinterlineskip
+ \vskip24pt
+ \hbox to \hsize \bgroup
+ \hss
+ \startframed[align=normal,width=.7\textwidth,frame=off]
+ \getbuffer[1]
+ \stopframed
+ \hskip1cm
+ \egroup
+ \vfill
+ \hbox to \hsize \bgroup
+ \hskip1cm
+ \startframed[align=normal,width=.7\textwidth,frame=off]
+ \getbuffer[2]
+ \stopframed
+ \egroup
+ \vfill
+ \hbox to \hsize \bgroup
+ \hss
+ \startframed[align=normal,width=.7\textwidth,frame=off]
+ \getbuffer[3]
+ \stopframed
+ \hskip1cm
+ \egroup
+ \vfill
+ \hbox to \hsize \bgroup
+ \hss
+ \setupitemize[after=]
+ \startframed[align=normal,width=\dimexpr\textwidth-2cm\relax,frame=off]
+ \getbuffer[4]
+ \stopframed
+ \hskip1cm
+ \egroup
+ \vfill
+ \hbox to \hsize \bgroup
+ \hss
+ \startframed[align=normal,width=.7\textwidth,frame=off]
+ \getbuffer[5]
+ \stopframed
+ \hskip1cm
+ \egroup
+ \vfill
+ \vfill
+ \vfill
+ \hbox to \hsize \bgroup
+ \hskip1cm
+ \startframed[align=normal,width=.7\textwidth,frame=off]
+ \bfd \CONTEXT\ \LMTX \enspace \emdash \enspace factsheet
+ \stopframed
+ \hss
+ \egroup
+ \vskip12pt
+\stoppagemakeup
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-luametatex.tex b/Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-luametatex.tex
new file mode 100644
index 00000000000..6532a8f9f32
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-luametatex.tex
@@ -0,0 +1,106 @@
+\environment leaflet-common
+
+\startdocument[graphic=2]
+
+\startbuffer[1]
+ The \LUAMETATEX\ engine is a follow up on \LUATEX. It integrates the \TEX\
+ text rendering engine, the \METAPOST\ graphic engine and the \LUA\ script
+ interpreter. The development is part of the \CONTEXT\ macro package
+ development. This macro package tightly integrates the three subsystems. The
+ \LUAMETATEX\ code is part of the \CONTEXT\ distribution.
+\stopbuffer
+
+\startbuffer[2]
+ The \LUAMETATEX\ engine is lean and mean. There is for instance no backend
+ code present. In \CONTEXT\ this is handled in \LUA. Graphic inclusion is also
+ delegated to \LUA. The \TEX\ frontend is a slightly extended version of the
+ \LUATEX\ one. System depedencies are minimized. Where possible we stay close
+ to the original \TEX\ concept because that is a well documented reference.
+ The binary can also be used as stand alone \LUA\ engine.
+\stopbuffer
+
+\startbuffer[3]
+ The \METAPOST\ library also has access to \LUA, which means that the language
+ can be enhanced and functionality added on demand. There are several graphic
+ libraries provided in \CONTEXT. This graphical language is efficient in
+ runtime and graphical output. In combination with \LUA\ we have a high
+ performance graphical subsystem that can handle a huge amount of data.
+ Additional text (like labels) is typeset at high quality.
+\stopbuffer
+
+\startbuffer[4]
+ The \LUA\ code that comes with \CONTEXT\ contains a lot of helper code which
+ means that one can set up selfcontained workflows without many extra
+ dependencies. Documents can be encoded in \TEX, \LUA, \XML\ or whatever
+ suits. There is support for databases too.
+\stopbuffer
+
+\startbuffer[5]
+ The \CONTEXT\ code base evolved over time. The basic functionality is quite stable.
+ The move from \MKII\ to \MKIV\ to \LMTX\ has been gradual. The efficiency in terms
+ of code and performance has been improved stepwise. Development continues and beta
+ releases occur on a regular basis. The \CONTEXT\ user community is quite willing
+ to experiment with betas that can be installed alongside stable snapshots.
+
+ \blank
+
+ The installation is relatively small (fonts make up much of it) and updating is
+ easy. We operate in the \TEX\ Directory Structure, which is a proven concept.
+\stopbuffer
+
+\startpagemakeup
+ \offinterlineskip
+ \vskip24pt
+ \hbox to \hsize \bgroup
+ \hss
+ \startframed[align=normal,width=.7\textwidth,frame=off]
+ \getbuffer[1]
+ \stopframed
+ \hskip1cm
+ \egroup
+ \vfill
+ \hbox to \hsize \bgroup
+ \hskip1cm
+ \startframed[align=normal,width=.7\textwidth,frame=off]
+ \getbuffer[2]
+ \stopframed
+ \egroup
+ \vfill
+ \hbox to \hsize \bgroup
+ \hss
+ \startframed[align=normal,width=.7\textwidth,frame=off]
+ \getbuffer[3]
+ \stopframed
+ \hskip1cm
+ \egroup
+ \vfill
+ \hbox to \hsize \bgroup
+ \hss
+ \setupitemize[after=]
+ \startframed[align=normal,width=\dimexpr\textwidth-2cm\relax,frame=off]
+ \getbuffer[4]
+ \stopframed
+ \hskip1cm
+ \egroup
+ \vfill
+ \hbox to \hsize \bgroup
+ \hss
+ \startframed[align=normal,width=.7\textwidth,frame=off]
+ \getbuffer[5]
+ \stopframed
+ \hskip1cm
+ \egroup
+ \vfill
+ \vfill
+ \vfill
+ \hbox to \hsize \bgroup
+ \hskip1cm
+ \startframed[align=normal,width=.7\textwidth,frame=off]
+ \bfd \LUAMETATEX \enspace \emdash \enspace factsheet
+ \stopframed
+ \hss
+ \egroup
+ \vskip12pt
+\stoppagemakeup
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-mixing.tex b/Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-mixing.tex
new file mode 100644
index 00000000000..9f14525b380
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/leaflets/leaflet-mixing.tex
@@ -0,0 +1,450 @@
+%D Please don't abuse this style for your own purpose as the look and feel
+%D is reserved for our own purpose. Be creative instead.
+
+\setupbodyfont
+ [plex,7pt]
+
+\setuppapersize
+ [A3,landscape]
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ header=0pt,
+ footer=0pt,
+ backspace=5mm,
+ topspace=5mm]
+
+\definelayer
+ [page]
+ [width=\textwidth,
+ height=\textheight]
+
+\setupbackgrounds
+ [page]
+ [background=color,
+ backgroundcolor=middlegray]
+
+\setuptyping
+ [before=,after=]
+
+\usemodule
+ [abbreviations-logos]
+
+\startbuffer[style]
+ \setupbodyfont
+ [plex]
+ \setuplayout
+ [width=middle,
+ height=middle,
+ margin=1cm]
+ \setupcolors
+ [textcolor=white]
+ \usemodule
+ [abbreviations-logos]
+ \setupwhitespace
+ [big]
+ \setuphead
+ [chapter]
+ [style=\bfc]
+\stopbuffer
+
+\startbuffer[intro]
+
+ \starttitle[title={Using \CONTEXT}]
+
+ The \CONTEXT\ macro package is more than just a \TEX\ processor,
+ various input is possible, some we show here. An example of a
+ method not shown here is fetching data from a database. The
+ various input methods can be combined, so depending on what you
+ need you can mix \TEX\ (for typesetting text), \METAPOST\ (for
+ producing graphics) or \LUA\ (as language for manipulating
+ data.
+
+ All these methods are quite efficient and always have access to
+ the full power of the typesetting engine.
+
+ When you use \CONTEXT\ with \LUAMETATEX, you get a reasonable
+ small self contained component that can be used in workflows
+ that need quality rendering. The ecosystem is rather future
+ proof too.
+
+ The \CONTEXT\ macro package has been around for decades and
+ evolved from \MKII, to \MKIV\ and now \LMTX. The development
+ team has always been involved in the development of engines
+ like \PDFTEX, \LUATEX\ and \LUAMETATEX. There is an active
+ mailing list and there are \CONTEXT\ meetings.
+
+ \stoptitle
+
+\stopbuffer
+
+\startbuffer[tex]
+\starttext
+
+ \starttitle[title={Some \TEX}]
+
+ Just an example.
+
+ \starttabulate[|c|c|]
+ \NC first 1 \NC last 1 \NC \NR
+ \NC first 2 \NC last 2 \NC \NR
+ \stoptabulate
+
+ \stoptitle
+
+\stoptext
+\stopbuffer
+
+\startbuffer[xml]
+\startbuffer[demo]
+<?xml version="1.0"?>
+<document>
+ <title>Some XML</title>
+ <p>Just an example.</p>
+ <table>
+ <r> <c>first 1</c> <c>last 1</c> </r>
+ <r> <c>first 2</c> <c>last 2</c> </r>
+ </table>
+</document>
+\stopbuffer
+
+\startxmlsetups xml:basics
+ \xmlsetsetup{#1}{title|p|table}{xml:*}
+\stopxmlsetups
+\startxmlsetups xml:title
+ \title{\xmltext{#1}{.}}
+\stopxmlsetups
+\startxmlsetups xml:p
+ \xmlflush{#1}\par
+\stopxmlsetups
+\startxmlsetups xml:table
+ \starttabulate[|c|c|]
+ \xmlfilter{#1}{/r/command(xml:r)}
+ \stoptabulate
+\stopxmlsetups
+\startxmlsetups xml:r
+ \NC \xmlfilter{#1}{/c/command(xml:c)} \NR
+\stopxmlsetups
+\startxmlsetups xml:c
+ \xmlflush{#1} \NC
+\stopxmlsetups
+
+\xmlregistersetup{xml:basics}
+
+\starttext
+ \xmlprocessbuffer{demo}{demo}{}
+\stoptext
+\stopbuffer
+
+\startbuffer[lua]
+\startluacode
+ local tmp = {
+ { a = "first 1", b = "last 1" },
+ { b = "last 2", a = "first 2" },
+ }
+
+ -- local tmp = table.load("somefile.lua")
+
+ context.starttext()
+
+ context.starttitle { title = "Some Lua" }
+
+ context("Just an example.") context.par()
+
+ context.starttabulate { "|c|c|" }
+ for i=1,#tmp do
+ local t = tmp[i]
+ context.NC()
+ context(t.a) context.NC()
+ context(t.b) context.NC()
+ context.NR()
+ end
+ context.stoptabulate()
+
+ context.stoptitle()
+
+ context.stoptext()
+\stopluacode
+\stopbuffer
+
+\startbuffer[mp]
+\startMPpage
+ draw textext("\bf Some \MetaPost")
+ xsized 4cm
+ rotated(45)
+ withcolor "white" ;
+
+ draw textext("\bs\strut in \ConTeXt")
+ xsized 5cm
+ shifted (0,-40mm)
+ withcolor "white" ;
+
+ draw fullcircle
+ scaled 6cm
+ dashed evenly
+ withcolor "gray" ;
+\stopMPpage
+\stopbuffer
+
+\startbuffer[csv]
+\startluacode
+ local tmp = [[
+ first,second
+ first 1,last 1
+ first 2,last 2
+ ]]
+
+ -- local tmp = io.loaddata("somefile.csv")
+
+ local mycsvsplitter = utilities.parsers.rfc4180splitter()
+ local list, names = mycsvsplitter(tmp,true)
+
+ context.starttext()
+
+ context.starttitle { title = "Some CSV" }
+
+ context("Just an example.") context.par()
+
+ context.starttabulate { "|c|c|" }
+ for i=1,#list do
+ local l = list[i]
+ context.NC()
+ context(l[1]) context.NC()
+ context(l[2]) context.NC()
+ context.NR()
+ end
+ context.stoptabulate()
+
+ context.stoptitle()
+
+ context.stoptext()
+\stopluacode
+\stopbuffer
+
+\startbuffer[json]
+\startluacode
+ require("util-jsn")
+
+ -- local str = io.loaddata("somefile.json")
+
+ local str = [[ {
+ "title": "Some JSON",
+ "text" : "Just an example.",
+ "data" : [
+ { "a" : "first 1", "b" : "last 1" },
+ { "b" : "last 2", "a" : "first 2" }
+ ]
+ } ]]
+
+ local tmp = utilities.json.tolua(str)
+
+ context.starttext()
+
+ context.starttitle { title = tmp.title }
+
+ context(tmp.text) context.par()
+
+ context.starttabulate { "|c|c|" }
+ for i=1,#tmp.data do
+ local d = tmp.data[i]
+ context.NC()
+ context(d.a) context.NC()
+ context(d.b) context.NC()
+ context.NR()
+ end
+ context.stoptabulate()
+
+ context.stoptitle()
+
+ context.stoptext()
+\stopluacode
+\stopbuffer
+
+\startbuffer[mkxi]
+% normally there is already a file:
+
+\startbuffer[demo]
+\starttext
+ \starttitle[title={Some template}]
+
+ Just an example. \blank
+
+ \startlinecorrection
+ \bTABLE
+ <?lua for i=1,20 do ?>
+ \bTR
+ <?lua for j=1,5 do ?>
+ \bTD
+ cell (<?lua inject(i) ?>,<?lua inject(j) ?>)
+ is <?lua inject(variables.text or "unset") ?>
+ \eTD
+ <?lua end ?>
+ \eTR
+ <?lua end ?>
+ \eTABLE
+ \stoplinecorrection
+
+ \stoptitle
+\stoptext
+
+\stopbuffer
+
+\savebuffer[file=demo.mkxi,prefix=no,list=demo]
+
+% the action:
+
+\startluacode
+ document.variables.text = "set"
+\stopluacode
+
+\input{demo.mkxi}
+\stopbuffer
+
+\definemeasure[blobwidth] [\textwidth/4-3mm]
+\definemeasure[blobscale] [\textwidth/4-3mm-4mm]
+\definemeasure[blobheight][\textheight/2-2mm]
+
+\startbuffer[everything]
+
+\setlayerframed
+ [page]
+ [preset=lefttop]
+ [align=normal,
+ offset=2mm,
+ strut=no,
+ frame=off,
+ height=\measure{blobheight},
+ width=\measure{blobwidth},
+ background=color,
+ backgroundcolor=darkgray,
+ foregroundcolor=white]
+ {\doifelsemode{verbose}{\typebuffer[intro]}{\typesetbuffer[style,intro][frame=on,width=\measure{blobscale}]}}
+
+\setlayerframed
+ [page]
+ [preset=lefttop,
+ hoffset=4mm,
+ x=\measure{blobwidth}]
+ [align=normal,
+ offset=2mm,
+ strut=no,
+ frame=off,
+ height=\measure{blobheight},
+ width=\measure{blobwidth},
+ background=color,
+ backgroundcolor=darkred,
+ foregroundcolor=white]
+ {\doifelsemode{verbose}{\typebuffer[tex]}{\typesetbuffer[style,tex][frame=on,width=\measure{blobscale}]}}
+
+\setlayerframed
+ [page]
+ [preset=righttop,
+ hoffset=4mm,
+ x=\measure{blobwidth}]
+ [align=normal,
+ offset=2mm,
+ strut=no,
+ frame=off,
+ height=\measure{blobheight},
+ width=\measure{blobwidth},
+ background=color,
+ backgroundcolor=darkblue,
+ foregroundcolor=white]
+ {\doifelsemode{verbose}{\typebuffer[xml]}{\typesetbuffer[style,xml][frame=on,width=\measure{blobscale}]}}
+
+\setlayerframed
+ [page]
+ [preset=righttop]
+ [align=normal,
+ offset=2mm,
+ strut=no,
+ frame=off,
+ height=\measure{blobheight},
+ width=\measure{blobwidth},
+ background=color,
+ backgroundcolor=darkgreen,
+ foregroundcolor=white]
+ {\doifelsemode{verbose}{\typebuffer[lua]}{\typesetbuffer[style,lua][frame=on,width=\measure{blobscale}]}}
+
+\setlayerframed
+ [page]
+ [preset=lefttop,
+ voffset=4mm,
+ y=\measure{blobheight}]
+ [align=normal,
+ offset=2mm,
+ strut=no,
+ frame=off,
+ height=\measure{blobheight},
+ width=\measure{blobwidth},
+ background=color,
+ backgroundcolor=darkcyan,
+ foregroundcolor=white]
+ {\doifelsemode{verbose}{\typebuffer[mp]}{\typesetbuffer[style,mp][frame=on,width=\measure{blobscale}]}}
+
+\setlayerframed
+ [page]
+ [preset=lefttop,
+ hoffset=4mm,
+ x=\measure{blobwidth},
+ voffset=4mm,
+ y=\measure{blobheight}]
+ [align=normal,
+ offset=2mm,
+ strut=no,
+ frame=off,
+ height=\measure{blobheight},
+ width=\measure{blobwidth},
+ background=color,
+ backgroundcolor=darkmagenta,
+ foregroundcolor=white]
+ {\doifelsemode{verbose}{\typebuffer[csv]}{\typesetbuffer[style,csv][frame=on,width=\measure{blobscale}]}}
+
+\setlayerframed
+ [page]
+ [preset=righttop,
+ hoffset=4mm,
+ x=\measure{blobwidth},
+ voffset=4mm,
+ y=\measure{blobheight}]
+ [align=normal,
+ offset=2mm,
+ strut=no,
+ frame=off,
+ height=\measure{blobheight},
+ width=\measure{blobwidth},
+ background=color,
+ backgroundcolor=darkyellow,
+ foregroundcolor=white]
+ {\doifelsemode{verbose}{\typebuffer[json]}{\typesetbuffer[style,json][frame=on,width=\measure{blobscale}]}}
+
+\setlayerframed
+ [page]
+ [preset=righttop,
+ voffset=4mm,
+ y=\measure{blobheight}]
+ [align=normal,
+ offset=2mm,
+ strut=no,
+ frame=off,
+ height=\measure{blobheight},
+ width=\measure{blobwidth},
+ background=color,
+ backgroundcolor=darkorange,
+ foregroundcolor=white]
+ {\doifelsemode{verbose}{\typebuffer[mkxi]}{\typesetbuffer[style,mkxi][frame=on,width=\measure{blobscale}]}}
+
+\startstandardmakeup
+ \tightlayer[page]
+\stopstandardmakeup
+
+\stopbuffer
+
+\starttext
+
+{\enablemode[verbose] \getbuffer[everything]}
+ \getbuffer[everything]
+
+\stoptext
+
diff --git a/Master/texmf-dist/doc/context/sources/general/magazines/mag-1104-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/magazines/mag-1104-mkiv.tex
new file mode 100644
index 00000000000..ef46b6fe113
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/magazines/mag-1104-mkiv.tex
@@ -0,0 +1,813 @@
+% author : Hans Hagen
+% copyright : PRAGMA ADE & ConTeXt Development Team
+% license : Creative Commons Attribution ShareAlike 4.0 International
+% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
+% origin : the ConTeXt distribution
+%
+% comment : Because this manual is distributed with TeX distributions it comes with a rather
+% liberal license. We try to adapt these documents to upgrades in the (sub)systems
+% that they describe. Using parts of the content otherwise can therefore conflict
+% with existing functionality and we cannot be held responsible for that. Many of
+% the manuals contain characteristic graphics and personal notes or examples that
+% make no sense when used out-of-context.
+
+\usemodule[magazine-basic,abr-02]
+
+\usemodule[scite]
+
+\startbuffer[abstract]
+ As part of the \CONTEXT\ \LMTX\ project, we experiment with new ways to
+ interface subsystems and \METAPOST\ makes a good candidate. Here I wrap up some
+ experiments. It's not a manual or a recipe, just food for thought. All you see
+ here might change and|/|or evolve.
+\stopbuffer
+
+\setuplayout
+ [backspace=20mm,
+ topspace=10mm]
+
+\startdocument
+ [title={New interfacing in \METAFUN, a preview},
+ author={Hans Hagen & Alan Braslau},
+ %affiliation=PRAGMA ADE,
+ date=July 2019,
+ number=1104 LMTX]
+
+As we move to \CONTEXT\ \LMTX, some decisions need to be made. For instance, how
+shall we introduce new functionality while not affecting the \MKIV\ code base too
+much with engine related tests, messy and performance sapping. Of course we
+remain downward compatible but the \LUAMETATEX\ engine sometimes permits multiple
+solutions. As this is something new, for a while we can use experimental features
+that may change or later disappear depending on experience. It is not a big deal
+to adapt to these new possibilites and users shouldn't notice, unless of course
+they currently employ (yet undocumented) low|-|level features. Part of the
+solution is to have separate files for \MKIV\ and \LMTX, although that will
+mostly concern low level support modules; even then differences will be subtle
+and should not affect users. I must admit that some of those changes are mostly
+aesthetic and often don't improve performance, although better performance
+sometimes may be the case, in particular concerning \quote {extreme} usage.
+
+But, that said, there are areas where \LMTX\ will offer entirely new
+functionality. One of the areas where we are making interesting developments is
+in \METAFUN, which means \METAPOST. Now, it is not to be said that some of the
+core functionality needed for this will migrate from \LUAMETATEX\ (used by \LMTX)
+to \LUATEX\ (used by \MKIV). But, because (due to external pressure), the later
+engine is now considered stable and its functionality frozen, it is not likely to
+be quickly backported or at least only will happen when this has been throughly
+tested in \CONTEXT|/|\LMTX.
+
+Over the years there have been (small) improvements in the interface but while
+Alan Braslau and I experiment with new graphic abilities, we also are coming up
+with (graphic) interfaces that suit \CONTEXT\ much better. Below, I will show
+some examples. \footnote {These optional argument handlers themselves are
+\emphasize {not} part of \METAPOST\ but implemented in \CONTEXT\ using some
+experimental parsing related extensions to a version of \MPLIB\ used in
+\LUAMETATEX.}
+
+\startbuffer
+\startMPcode{doublefun}
+ draw lmt_grid [
+ nx = 20, ny = 10,
+ dx = 5, dy = 2,
+ tx = 10, ty = 10,
+ ] ysized 5cm withpen pencircle scaled 1mm withcolor "red" ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+What we see here is an key|/|value driven interface that has been one of the
+unique core properties of \CONTEXT\ since it was created. \footnote {Note the use
+of the color string \type {"red"} rather then the \METAPOST\ color variable \type
+{red := (1,0,0)}. This is a small detail but here imports the color definition
+from \CONTEXT, which might be a bit special.} Of course parameters can be
+optional as demonstrated in:
+
+\startbuffer
+\startMPcode{doublefun}
+ draw lmt_grid [
+ nx = 10, ny = 10,
+ dx = 1, dy = 1
+ ] ysized 3cm
+ withpen pencircle scaled 1mm
+ withcolor "darkblue" ;
+
+ draw lmt_grid [
+ nx = 10, ny = 10
+ ] ysized 3cm shifted (4cm,0)
+ withpen pencircle scaled .3mm
+ withcolor "darkgreen" ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+This syntax means that we can also use the already used interface documentation
+system.
+
+We can actually go quite far in what we provide. It's not so much that these
+things were not possible before, but the more concise user interface is something
+new indeed. Let's start with drawing some simple axis:
+
+\startbuffer
+\startMPcode{doublefun}
+ draw lmt_axis [
+ nx = 20, ny = 10,
+ dx = 5, dy = 2,
+ ] ysized 4cm
+ withpen pencircle scaled 1mm
+ withcolor "darkcyan" ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+This \quote {article} is not meant as tutorial but more as a teaser about what is
+possible and hopefully it triggers users in coming up with useful demands. As the
+previous axis example is not that interesting we move on to a more complex one:
+
+\startbuffer
+\startMPcode{doublefun}
+ draw lmt_axis [
+ sx = 5mm, sy = 5mm,
+ nx = 20, ny = 10,
+ dx = 5, dy = 2,
+ tx = 10, ty = 10,
+ ] withpen pencircle scaled 1mm withcolor "darkblue" ;
+
+ draw lmt_connected (
+ for i = 1 step 2 until 20 :
+ -- (i, 1 randomized 8) * 5mm
+ endfor
+ )
+ withpen pencircle scaled 2mm withcolor "darkyellow" ;
+
+ draw lmt_connected (
+ for i = 1 step 2 until 20 :
+ lmt_connection (i, 1 randomized 8) * 5mm
+ endfor
+ )
+ withpen pencircle scaled 2mm withcolor "darkgreen" ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+These examples are made as part of exploring how to best interface with
+\METAPOST, to be used by the upcoming luagraph module, a flexible and high
+performance set of macros aimed at drawing graphs and to visualize data. On the
+one hand, we want to free the user from dealing with details such as scales to
+get the graphics right, but on the other hand it should be possible to
+fine|-|tune when needed.
+
+Again we draw an axis. Using strings as color names, mentioned in the footnote
+earlier, is not new, but already present for a while. It will use the colors
+defined at the \TEX\ end and is more convenient and natural than using the older
+\type {\MPcolor}. The \type {lmt_connected} macro is sort of a gimmick: if you
+look closely you will see that it has to start with a point (coordinate) but that
+one is discarded silently. Again this is something we need to deal with.
+
+% This is obscure, and silly. I'm sure that we can do better. Sure, but so is the
+% HIDE related alternative trrickery. We probably need something getparameterpath.
+
+The next variant uses a list of samples. Watch the use of braces, this is
+something normally not part of \METAPOST\ syntax, and it signals a \LUA|-|like
+list. This is a choice of interfacing. There are subtle and somewhat complicated
+aspects involved here as \METAPOST\ parsing involves primaries, secondaries,
+tertiaries and expressions, symbols, strings, tags and other specialities.
+
+% Why does samples = {} require a second pair of brackets? Wouldn't a
+% comma-separated list be enough in Lua? Because it's \METAPOST\ which has its own
+% ideas about where expressions start and end.
+
+\startbuffer
+\startMPcode{doublefun}
+ draw lmt_axis [
+ sx = 5mm, sy = 5mm,
+ nx = 20, ny = 10,
+ dx = 5, dy = 2,
+ tx = 5, ty = 2,
+ startx = 1, starty = 0,
+
+ connect = true,
+ samples = {
+ {
+ 4, 2, 4, 9, 3, 0, 8, 9, 10, 1,
+ 5, 3, 0, 8, 5, 6, 10, 2, 3, 5
+ }
+ },
+ axiscolor = "darkgreen",
+ textcolor = "darkred",
+ samplecolors = {
+ "darkblue"
+ },
+ ] withpen pencircle scaled 1mm ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+We can have multiple sample lists. But of course dealing with that is really up
+to the underlying code, which itself is not that much related to \METAPOST\ but
+has been delegated to \LUA.
+
+\startbuffer
+\definecolor[tdarkred] [r=.6,a=1,t=.5]
+\definecolor[tdarkgreen][g=.6,a=1,t=.5]
+\definecolor[tdarkblue] [b=.6,a=1,t=.5]
+
+\startMPcode{doublefun}
+ save u ; let u = uniformdeviate ;
+ draw lmt_axis [
+ sx = 5mm, sy = 5mm,
+ nx = 20, ny = 10,
+ dx = 5, dy = 2,
+ tx = 10, ty = 2,
+ samples = {
+ {
+ u10, u10, u10, u10, u10,
+ u10, u10, u10, u10, u10,
+ u10, u10, u10, u10, u10,
+ u10, u10, u10, u10, u10
+ },
+ {
+ u10, u10, u10, u10, u10,
+ u10, u10, u10, u10, u10,
+ u10, u10, u10, u10, u10,
+ u10, u10, u10, u10, u10
+ },
+ {
+ u10, u10, u10, u10, u10,
+ u10, u10, u10, u10, u10,
+ u10, u10, u10, u10, u10,
+ u10, u10, u10, u10, u10
+ }
+ },
+ startx = 1,
+ starty = 0,
+ connect = true,
+ axiscolor = "darkgray",
+ textcolor = "darkyellow",
+ samplecolors = {
+ "tdarkred",
+ "tdarkgreen",
+ "tdarkblue"
+ },
+ ] withpen pencircle scaled 1mm ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+Yet another interesting variant might be this:
+
+\startbuffer
+\startluacode
+ documentdata["lmx-sample-1"] = {
+ {
+ 4, 2, 4, 9, 3, 0, 8, 9, 10, 1,
+ 5, 3, 0, 8, 5, 6, 10, 2, 3, 5
+ }
+ }
+\stopluacode
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+\startbuffer
+\startMPcode{doublefun}
+ draw lmt_axis [
+ sx = 5mm, sy = 5mm,
+ nx = 20, ny = 10,
+ dx = 5, dy = 2,
+ tx = 5, ty = 2,
+ startx = 1, starty = 0,
+
+ samples = "lmx-sample-1",
+ axiscolor = "darkgreen",
+ textcolor = "darkred",
+ samplecolors = { "darkblue" },
+ ] withpen pencircle scaled 1mm ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+% OOPS, doesn't work!
+
+Adding more tricks is not that complex, take, for example:
+
+\startbuffer
+\startMPcode{doublefun}
+draw lmt_axis [
+ sx = 5mm, sy = 5mm,
+ nx = 20, ny = 10,
+ dx = 5, dy = 2,
+ tx = 10, ty = 10,
+
+ list = {
+ [
+ connect = true,
+ color = "darkred",
+ close = true,
+ points = { (1, 1), (15, 8), (2, 10) },
+ texts = { "segment 1", "segment 2", "segment 3" }
+ ],
+ [
+ connect = true,
+ color = "darkgreen",
+ points = { (2, 2), (4, 1), (10, 3), (16, 8), (19, 2) },
+ labels = { "a", "b", "c", "d", "e" }
+ ],
+ [
+ connect = true,
+ color = "darkblue",
+ close = true,
+ points = { (5, 3), (8, 8), (16, 1) },
+ labels = { "1", "2", "3" }
+ ]
+ },
+
+] withpen pencircle scaled 1mm ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+yielding
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+but this is experimentation, work in progress, not to be taken as settled.
+
+\blank
+
+A variant on this one is the following:
+
+\startbuffer
+\startMPcode{doublefun}
+draw lmt_function [
+
+ xmin = 0, xmax = 10, xstep = .05,
+ ymin = -2, ymax = 2,
+
+ xticks = "bottom", xsmall = 80, xlarge = 20,
+ yticks = "left", ysmall = 40, ylarge = 4,
+
+ code = "1.5 * math.cosd(240 * math.sqrt(x))",
+
+ xlabels = "yes",
+ ylabels = "yes",
+
+ ycaption = "\strut\tfd \rotate[rotation=90]{vertical}",
+ xcaption = "\strut\tfd horizontal",
+
+ pointsymbol = "dot", pointsize = 4, pointcolor = "orange",
+
+ sx = 2mm, sy = 4mm, linewidth = .025mm, offset = .1mm,
+]
+ xsized 8cm
+;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+A valid question is if this should be combined with the previous but having
+distinctive variants is less likely to complicate the settings, as these can
+depend on the application:
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+A more complex usage (still under exploration) is demonstrated next:
+
+\startbuffer
+\definecolor[MyColorR][r=.5,t=.5,a=1]
+\definecolor[MyColorG][g=.5,t=.5,a=1]
+\definecolor[MyColorB][b=.5,t=.5,a=1]
+\definecolor[MyColorY][r=.5,g=.5,t=.5,a=1]
+
+\startMPcode{doublefun}
+draw lmt_function [
+ sx = 1mm, sy = 4mm, linewidth = .025mm, offset = .1mm,
+
+ xmin = 0, xmax = 20, xstep = .1,
+ ymin = -2, ymax = 2,
+
+ xticks = "bottom", xsmall = 80, xlarge = 20, xlabels = "nolimits",
+ yticks = "left", ysmall = 40, ylarge = 4, ylabels = "yes",
+
+ code = "1.5 * math.sind (50 * x - 150)",
+
+ frame = "sticks", % "ticks"
+
+ functions = {
+ [
+ xmin = 1.0,
+ xmax = 7.0,
+ close = true,
+ fillcolor = "MyColorR"
+ ],
+ [
+ xmin = 7.0,
+ xmax = 12.0,
+ close = true,
+ fillcolor = "MyColorG"
+ ],
+ [
+ xmin = 12.0,
+ xmax = 19.0,
+ close = true,
+ fillcolor = "MyColorB"
+ ],
+ [
+ drawcolor = "darkyellow",
+ drawsize = 2,
+ ],
+ [
+ xmin = 4,
+ xmax = 17,
+ xstep = .25,
+ drawcolor = "darkmagenta",
+ shape = "steps",
+ code = "0.5 * math.random(-2,2)",
+ ],
+ [
+ xmin = 5.0,
+ xmax = 15.0,
+ close = true,
+ fillcolor = "MyColorY"
+ code = "1.75 * math.cosd (50 * x - 150)",
+ ]
+ },
+ ycaption = "\rotate[rotation=90]{\tfd\strut a mix of drawings}",
+ xcaption = "\framed[foregroundstyle=\tfd]{a mixture of $\sin(x), \cos(x), \sqrt{x}$ etc.}",
+]
+ xsized 8cm
+;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Of course calling the same command multiple times with different code snippets
+will also work.
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+The previous examples used new code but how about improving existing features?
+Let's look at outlines.
+
+\startbuffer
+\startMPcode{doublefun}
+ save h ; h = 12mm ;
+
+ draw lmt_outline [
+ text = "hello"
+ kind = "draw",
+ drawcolor = "darkblue",
+ ] ysized h ;
+
+ draw lmt_outline [
+ text = "hello",
+ kind = "fill",
+ fillcolor = "darkred",
+ ] ysized h shifted (3.75h,0) ;
+
+ draw lmt_outline [
+ test = "hello",
+ kind = "both",
+ fillcolor = "darkred",
+ ] ysized h shifted (7.5h,0mm) ;
+
+ draw lmt_outline [
+ text = "hello",
+ kind = "both",
+ fillcolor = "darkred",
+ drawcolor = "darkblue",
+ rulethickness = 1/5,
+ ] ysized h shifted (0,-1.25h) ;
+
+ draw lmt_outline [
+ text = "hello",
+ kind = "reverse",
+ fillcolor = "darkred",
+ drawcolor = "darkblue",
+ rulethickness = 1/2,
+ ] ysized h shifted (3.75h,-1.25h) ;
+
+ draw lmt_outline [
+ text = "hello",
+ kind = "fillup",
+ fillcolor = "darkgreen",
+ rulethickness = 0,
+ ] ysized h shifted (7.5h,-1.25h) ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+This interface is much nicer than the one where each variant (the parameter \type
+{kind} above) had its own macro due to the need to group properties of the
+outline and fill. Let's show some more:
+
+\startbuffer
+\startMPcode{doublefun}
+ draw lmt_outline [
+ text = "\obeydiscretionaries\samplefile{tufte}",
+ align = "normal",
+ kind = "draw",
+ drawcolor = "darkblue",
+ ] xsized TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+\startbuffer
+\startMPcode{doublefun}
+ draw lmt_outline [
+ text = "\obeydiscretionaries\samplefile{ward}",
+ align = "normal,tolerant",
+ width = 10cm,
+ kind = "draw",
+ drawcolor = "darkblue",
+ ] xsized TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+\startbuffer
+\startMPcode{doublefun}
+ draw lmt_outline [
+ text = "\obeydiscretionaries\samplefile{sapolsky}",
+ align = "normal,tolerant",
+ style = "bold",
+ width = 10cm,
+ kind = "draw",
+ rulethickness = 1/5,
+ drawcolor = "darkred",
+ ] xsized TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+Another \METAFUN\ text related mechanism deals with following a specific path.
+That interface has evolved over time, also due to more advanced possibilities in
+\MKIV. But, it's again time for a upgrade, for example:
+
+\startbuffer
+\startMPcode{doublefun}
+ draw lmt_followtext [
+ text = "How well does it work {\bf 1}! ",
+ path = (fullcircle scaled 4cm),
+ trace = true,
+ spread = true,
+ ] ysized 5cm ;
+
+ draw lmt_followtext [
+ text = "How well does it work {\bf 2}! ",
+ path = fullcircle scaled 4cm,
+ trace = true,
+ spread = false,
+ reverse = true,
+ ] ysized 5cm shifted (0,-6cm) ;
+
+ draw lmt_followtext [
+ text = "How well does it work {\bf 3}! ",
+ trace = true,
+ autoscaleup = "yes"
+ ] ysized 5cm shifted (6cm,0) ;
+
+ draw lmt_followtext [
+ text = "How well does it work {\bf 4}! ",
+ path = fullcircle scaled 2cm,
+ trace = true,
+ autoscaleup = "max"
+ ] ysized 5cm shifted (6cm,-6cm) ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+Although \METAPOST\ can draw arrows a bit more code is involved than one would
+have expected. As a consequence, influencing the way an arrowhead is drawn as
+currently using variables is somewhat cumbersome. Here is an alternative:
+
+\startbuffer
+\startMPcode{doublefun}
+ draw lmt_arrow [
+ path = fullcircle
+ scaled 3cm
+ shifted (0,0cm),
+ ] withcolor "darkred" ;
+
+ draw lmt_arrow [
+ location = "both"
+ path = fullcircle
+ scaled 3cm
+ rotated 90
+ shifted (0,-3.5cm),
+ ] withcolor "darkgreen" ;
+
+ draw lmt_arrow [
+ kind = "draw",
+ location = "middle",
+ alternative = "curved",
+ path = fullcircle
+ scaled 3cm
+ shifted (3.5cm,0cm),
+ ] withcolor "darkblue" ;
+
+ for i = 0 step 5 until 100 :
+ draw lmt_arrow [
+ alternative = "dimpled",
+ location = "percentage",
+ percentage = i,
+ dimple = (1/5 + i/200),
+ headonly = (i = 0),
+ path = fullcircle
+ scaled 3cm
+ shifted (3.5cm,-3.5cm),
+ ] withcolor "darkyellow" ;
+ endfor ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+These new interfaces for outlines, following text and arrows certainly will make
+it in some form to be permanent \METAFUN\ extensions. Some will also be used in
+macros at the \TEX\ end, for instance, when you load the dummy library:
+
+\startbuffer
+\useMPlibrary[dum]
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+You can do this:
+
+\startbuffer
+\startcombination
+ {\externalfigure[crap-001]} {one}
+ {\externalfigure[crap-004][alternative=triangle]} {two}
+\stopcombination
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+and get:
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+This placeholder now also can be accessed directly:
+
+\startbuffer
+\useMPmacro
+ [minifun]
+ [placeholder]
+ [width=10cm,
+ height=3cm,
+ reduction=.2,
+ alternative=triangle,
+ color=orange]
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+The \type {\useMPmacro} is an entirely new interface to \METAFUN\ code. Although
+it is still experimental, we show an example. Of course, as needed, you can throw
+in some \LUA\ magic.
+
+\startbuffer
+\startMPcalculation
+ presetparameters "demo" [
+ n = 5,
+ s = 1cm,
+ ] ;
+
+ def lmt_demo = applyparameters "demo" "lmt_do_demo" enddef ;
+
+ vardef lmt_do_demo =
+ for i=1 upto getparameter "demo" "n" :
+ draw fullcircle scaled (i*getparameter "demo" "s");
+ endfor ;
+ enddef ;
+\stopMPcalculation
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The calculation wrapper makes this code be processed immediately, which is needed
+because we don't use a module.
+
+\getbuffer
+
+A the \TEX\ end we do this:
+
+\startbuffer
+\defineMPparameterset[demo][n=integer,s=dimension]
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\getbuffer
+
+We can now let the macro do its work:
+
+\startbuffer
+\startcombination[nx=4,location=middle]
+ {\useMPmacro[demo][n=8,s=2mm]} {Demo 1}
+ {\useMPmacro[demo][n=4,s=4mm]} {Demo 2}
+ {\useMPmacro[demo][n=4,s=5\exheight]} {Demo 3}
+ {\useMPmacro[demo]} {Demo 4}
+\stopcombination
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+You can also set the parameters separately. There is one catch: there is no
+grouping so in this case you need to reset the parameters afterwards.
+
+\starttyping
+\presetMPparameters[demo][n=8] \useMPmacro[demo]\blank
+\presetMPparameters[demo][n=4] \useMPmacro[demo]\blank
+\resetMPparameters [demo] \useMPmacro[demo]\blank
+\stoptyping
+
+These examples demonstrate that we can make \METAPOST\ a bit friendlier for users
+who are not that fluent with the language. It remains to be seen to what extent
+additional modules will be written, but the possibilities are there.
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-contents.tex
new file mode 100644
index 00000000000..21c318dff37
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-contents.tex
@@ -0,0 +1,9 @@
+% language=us
+
+\startcomponent bidi-contents
+
+ \starttitle[title=Table of contents]
+ \placelist[chapter]
+ \stoptitle
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-fonts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-fonts.tex
new file mode 100644
index 00000000000..bfedd8f4745
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-fonts.tex
@@ -0,0 +1,99 @@
+% language=us
+
+\startcomponent bidi-fonts
+
+\environment bidi-style
+
+\startchapter[title={Setting up fonts}]
+
+So let's see how Arabic and Hebrew come out:
+
+\startbuffer
+The sentence \quotation {I have no clue what this means.} is translated (by
+Google Translate) into \quotation {\ar \righttoleft ليس لدي أي Ùكرة عما يعنيه هذا.}
+which is then translated back to \quotation {I have no idea what this means.} so
+maybe arabic has no clue what a clue is. The suggested Arabic pronunciation is
+\quotation {lays laday 'ayu fikrat eamaa yaenih hadha}. Hebrew also likes ideas
+more: \quotation {\he \righttoleft ×ין לי מושג מה ×–×” ×ומר}.
+\stopbuffer
+
+\typebuffer
+
+\getbuffer
+
+According to Idris Hamid the Arabic should actually be this: \quotation {\ar
+لَيْسَ لَدَيَّ أَيّ٠ÙÙكْرَة٠عَمَّا يَعْنÙيه٠هٰذَا} and the transliteration \quotation {Laysa
+ladayya ayyu fikratin Ê¿ammÄ yaÊ¿nihi hÄdhÄ}.
+
+The \CONTEXT\ (or any \TEX) ecosystem deals with languages and fonts. Languages
+(that relate to scripts) have specific characteristics, like running from right
+to left, and fonts provide a repertoire of glyphs and features. There is no real
+(standard) relationship between these. In for instance browsers, there are
+automatic fallback systems for missing characters in a font: another font is
+taken. These fallbacks are often not easy to tweak.
+
+In this document we use Dejavu and although that font has Arabic shapes in its
+monospace variant, the serifs come without them (at least when I write this
+down). Before we actually define the bodyfont we hook in some fallbacks. The
+typescript for Dejavu has lines like this:
+
+\starttyping
+\definefontsynonym
+ [SerifBoldItalic]
+ [name:dejavuserifbolditalic]
+ [features=default,
+ fallbacks=SerifBoldItalic]
+\stoptyping
+
+This permits us to do this:
+
+\typebuffer[preamble-fonts]
+
+In addition we set up the languages:
+
+\typebuffer[preamble-languages]
+
+The following example demonstrates what the effects of these commands are:
+
+\startbuffer
+{لَيْسَ لَدَيَّ أَيّ٠ÙÙكْرَة٠عَمَّا يَعْنÙيه٠هٰذَا.}
+{×ין לי מושג מה ×–×” ×ומר.}
+{\righttoleft لَيْسَ لَدَيَّ أَيّ٠ÙÙكْرَة٠عَمَّا يَعْنÙيه٠هٰذَا.}
+{\righttoleft ×ין לי מושג מה ×–×” ×ומר.}
+{\ar \righttoleft لَيْسَ لَدَيَّ أَيّ٠ÙÙكْرَة٠عَمَّا يَعْنÙيه٠هٰذَا.}
+{\he \righttoleft ×ין לי מושג מה ×–×” ×ומר.}
+{\ar لَيْسَ لَدَيَّ أَيّ٠ÙÙكْرَة٠عَمَّا يَعْنÙيه٠هٰذَا.}
+{\he ×ין לי מושג מה ×–×” ×ומר.}
+\stopbuffer
+
+\typebuffer
+
+\startlines
+\getbuffer
+\stoplines
+
+In principle you can also rely on automatic direction changes, for instance
+by using the following command:
+
+\starttyping
+\setupdirections
+ [bidi=global,
+ method=three]
+\stoptyping
+
+But that doesn't do a font switch for you, nor does it do any of the other
+language related settings. It really helps if you properly tag your
+document content, as in:
+
+\starttyping
+{\ar لَيْسَ لَدَيَّ أَيّ٠ÙÙكْرَة٠عَمَّا يَعْنÙيه٠هٰذَا.}
+{\he ×ין לי מושג מה ×–×” ×ומר.}
+\stoptyping
+
+One reason to set the \type {font} parameter for a language is that it will
+activate the right features in a font. Instead of falling back on some default,
+we can be very specific in what we want to enable.
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-introduction.tex
new file mode 100644
index 00000000000..5ea0f98798a
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-introduction.tex
@@ -0,0 +1,53 @@
+% language=us
+
+\startcomponent bidi-introduction
+
+\environment bidi-style
+
+\startchapter[title=Introduction]
+
+With \CONTEXT\ you can typeset in two directions: from left to right and from
+right to left. In fact you can also combine these two directions, like this:
+
+\startbuffer
+There are many {\righttoleft \maincolor \it scripts in use} and some run into the
+other direction. However, there is {\righttoleft \maincolor \it no fixed relation
+{\lefttoright \black \it between the} direction of the script} and cars being
+driven left or right of the road.
+\stopbuffer
+
+\typebuffer
+
+\getbuffer
+
+Even someone not familiar with right to left typesetting can see what happens
+here, or not? In fact Luigi Scarso pointed out that the \type {fixed} reversed
+into {\righttoleft \type {fixed}} but not in the example where {\bf fixed}
+becomes {\righttoleft \bf fixed}. This signals an important property of the way
+the text gets processed: you input something, at some points font features get
+applied (like ligatures) and in the end the resulting glyph stream is reversed.
+By that time the combination of {\bf f}+{\bf i} has become {\bf fi}! So, be
+prepared for surprises.
+
+This manual is written by a left to right user so don't expect a manual on
+semitic typesetting. Also don't expect a (yet) complete manual. I'll add whatever
+comes to mind. This is not a manual about Hebrew or Arabic, if only because I
+can't read any of those scripts (languages). I leave that to others to cover.
+
+This is work in progress and might always be! So expect errors and typos. As with
+anything related to typesetting the truth about how it should be done and what
+looks best is not absolute. So, the most we can offer is flexibility and the way
+\CONTEXT\ is setup permits that.
+
+Of course this is not possible without input. When we moved to \CONTEXT\ \LMTX,
+the bidi thread was picked up by Mohammad Hossein Bateni, Idris Samawi Hamid,
+Wolfgang Schuster and myself. So, expect more!
+
+\startlines
+Hans Hagen
+Hasselt, NL
+\stoplines
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-lua.tex b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-lua.tex
new file mode 100644
index 00000000000..beb93b6049a
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-lua.tex
@@ -0,0 +1,38 @@
+% language=us
+
+\startcomponent bidi-lua
+
+\environment bidi-style
+
+\startchapter[title={The \LUA\ interface}]
+
+We assume that you run \CONTEXT\ \MKIV\ in combination with \LUATEX. Direction
+support in this engine has been improved over time. Originally the \OMEGA\
+(\ALEPH) direction model was used but in the meantime it has been stripped to the
+basics, and what used to be so called whatsits (extension nodes) are now first
+class nodes. Of the many directions only four are kept in \LUATEX\ and they are
+indicated by three letters:
+
+\starttabulate[|l|l|l|]
+\NC 0 \NC \type {TLT} \NC left to right \NC \NR
+\NC 1 \NC \type {TRT} \NC right to left \NC \NR
+\NC 2 \NC \type {LTL} \NC not used in context (obsolete) \NC \NR
+\NC 3 \NC \type {RTT} \NC not used in context (obsolete) \NC \NR
+\stoptabulate
+
+In \LUAMETATEX, and therefore \CONTEXT\ \LMTX\ we only have the first two.
+Therefore in \LMTX\ you normally don't have to worry about checking for them at
+the \LUA\ end because they are irrelevant for calculations (the vertical ones
+swapped the horizontal and vertical progression). Also, when really needed, we
+use the \type {direction} keys with numerical indicators, so zero for \type {l2r}
+and one for \type {r2l}. These values are used for local par nodes as well as
+direction nodes. In addition a direction node has a subtype:
+
+\starttabulate[|l|l|l|]
+\NC 0 \NC \type {normal} \NC comparable to \type {+} \NC \NR
+\NC 1 \NC \type {cancel} \NC comparable to \type {-} \NC \NR
+\stoptabulate
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-mixed.tex b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-mixed.tex
new file mode 100644
index 00000000000..851d6d8b4ef
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-mixed.tex
@@ -0,0 +1,178 @@
+% language=us
+
+\startcomponent bidi-mixed
+
+\environment bidi-style
+
+\startchapter[title=A mixed layout]
+
+The typesetting engine normally works from left to right and top to bottom. Going
+from right to left actually involved two decisions:
+
+\startitemize[packed]
+\startitem the direction of the display elements, the paragraphs \stopitem
+\startitem the direction of the inline text, the lines \stopitem
+\stopitemize
+
+The first one is kept track of in a state variable. Every paragraph starts with
+a node that carries, among other information, that state. This node is added
+automatically and does not interfere with the typesetting. The inline direction
+is more intrusive as it is marked by nodes that indicate the beginning and end
+of a reversed strip. This mechanism is rather reliable and normally works out
+well. Take this:
+
+\startbuffer
+left {\righttoleft right} left
+left{ \righttoleft right} left
+left {\righttoleft right }left
+left{ \righttoleft right }left
+\stopbuffer
+
+\typebuffer
+
+You can see that we need to be careful with spaces as they can end up inside or
+outside a substream and by swapping next to each other:
+
+\startlines
+\getbuffer
+\stoplines
+
+We can wrap the lines in boxes as in:
+
+\startbuffer
+\hbox{left\space{\bf\righttoleft right}\space left}
+\hbox{left{\bf\space \righttoleft right}\space left}
+\hbox{left\space{\bf\righttoleft right\space}left}
+\hbox{left{\bf\space\righttoleft right\space}left}
+\stopbuffer
+
+\typebuffer
+
+\definecolor[ShineThrough][s=0,a=1,t=.2]
+
+When visualize the spaces we get this:
+
+\startlines\ShineThrough
+\showmakeup[space,hbox]\getbuffer
+\stoplines
+
+The space of a normal and bold font in the same family normally is the same but
+let's mix with a larger size:
+
+\startbuffer
+\hbox{left {\bfa\righttoleft right} left}
+\hbox{left{\bfa\space \righttoleft right} left}
+\hbox{left {\bfa\righttoleft right }left}
+\hbox{left{\bfa\space\righttoleft right }left}
+\stopbuffer
+
+\typebuffer
+
+Now we get the following. As you can see, it really matters where we put the
+braces.
+
+\startlines
+\ShineThrough\showmakeup[space,hbox]\getbuffer
+\stoplines
+
+Once you are accustomed to tagging and \TEX\ you will probably not fall into
+these traps. In \in {figure} [fig:spaces] we show a large version.
+
+\startplacefigure[location=top,title={Watch your spaces!},reference=fig:spaces]
+ \scale
+ [width=\hsize]
+ {\vbox{\ShineThrough\showmakeup[space,hbox]\getbuffer}}
+\stopplacefigure
+
+The \type {\righttoleft} command actually has two meanings. This can best be seen
+from an example.
+
+\startbuffer
+\righttoleft \bf How will this come out?
+\stopbuffer
+
+\typebuffer
+
+\start \getbuffer \par \stop
+
+\startbuffer
+And \righttoleft \bf how will this come out?
+\stopbuffer
+
+\typebuffer
+
+\start \getbuffer \par \stop
+
+When we start a paragraph (or in \TEX\ speak: when we are still in vertical mode)
+the paragraph direction as well as the inline direction is set. Otherwise only
+the inline direction is set. There are low level \TEX\ commands (primitives) to
+set the direction but you can best {\em not} use these because we need to do a
+bit more than that.
+
+There are quite some low level commands related to changing directions. Some deal
+with the layout, some with boxes. We might provide more in the future.
+
+\starttabulate[|l|p|]
+\FL
+\NC \type {\lefttoright} \NC l2r dir node or paragraph property \NC \NR
+\NC \type {\righttoleft} \NC r2l dir node or paragraph property \NC \NR
+\NC \type {\checkedlefttoright} \NC l2r dir node or paragraph property (unless already set) \NC \NR
+\NC \type {\checkedrighttoleft} \NC r2l dir node or paragraph property (unless already set) \NC \NR
+\ML
+\NC \type {\synchronizeinlinedirection} \NC pickup a (possibly) reset state \NC \NR
+\NC \type {\synchronizelayoutdirection} \NC pickup a (possibly) reset state \NC \NR
+\NC \type {\synchronizedisplaydirection} \NC pickup a (possibly) reset state \NC \NR
+\ML
+\NC \type {\righttolefthbox} \NC r2l \type {\hbox} \NC \NR
+\NC \type {\lefttorighthbox} \NC l2r \type {\hbox} \NC \NR
+\NC \type {\righttoleftvbox} \NC r2l \type {\vbox} \NC \NR
+\NC \type {\lefttorightvbox} \NC l2r \type {\vbox} \NC \NR
+\NC \type {\righttoleftvtop} \NC r2l \type {\vtop} \NC \NR
+\NC \type {\lefttorightvtop} \NC l2r \type {\vtop} \NC \NR
+\ML
+\NC \type {\leftorrighthbox} \NC l2r or r2l \type {\hbox} \NC \NR
+\NC \type {\leftorrightvbox} \NC l2r or r2l \type {\vbox} \NC \NR
+\NC \type {\leftorrightvtop} \NC l2r or r2l \type {\vtop} \NC \NR
+\ML
+\NC \type {\autodirhbox} \NC l2r or r2l \type {\hbox} (a bit more clever) \NC \NR
+\NC \type {\autodirvbox} \NC l2r or r2l \type {\vbox} (a bit more clever) \NC \NR
+\NC \type {\autodirvtop} \NC l2r or r2l \type {\vtop} (a bit more clever) \NC \NR
+\ML
+\NC \type {\bidilre} \NC character \type {U+202A}, enforce l2r state \NC \NR
+\NC \type {\bidirle} \NC character \type {U+202B}, enforce r2l state \NC \NR
+\NC \type {\bidipop} \NC character \type {U+202C}, return to last state \NC \NR
+\NC \type {\bidilro} \NC character \type {U+202D}, override l2r state \NC \NR
+\NC \type {\bidirlo} \NC character \type {U+202E}, override r2l state \NC \NR
+\NC \type {\lefttorightmark} \type {\lrm} \NC character \type {U+200E}, l2r indicator \NC \NR
+\NC \type {\righttoleftmark} \type {\rlm} \NC character \type {U+200F}, r2l indicator \NC \NR
+\ML
+\NC \type {\dirlre} \NC switch to l2r mode using \type {\bidilre} or \lefttoright \NC \NR
+\NC \type {\dirrle} \NC switch to r2l mode using \type {\bidirle} or \righttoleft \NC \NR
+\NC \type {\dirlro} \NC enforce l2r mode using \type {\bidilro} or \lefttoright \NC \NR
+\NC \type {\dirrlo} \NC enforce r2l mode using \type {\bidirlo} or \righttoleft \NC \NR
+\ML
+\NC \type {\naturalhbox} \NC a normal l2r \type {hbox} \NC \NR
+\NC \type {\naturalvbox} \NC a normal l2r \type {vbox} \NC \NR
+\NC \type {\naturalvtop} \NC a normal l2r \type {vtop} \NC \NR
+\NC \type {\naturalhpack} \NC a normal l2r \type {hpack} \NC \NR
+\NC \type {\naturalvpack} \NC a normal l2r \type {vpack} \NC \NR
+\LL
+\stoptabulate
+
+When we talk about layout, we mean the overall layout, concerning the document as
+a whole. We can have a dominantly l2r, dominantly r2l or mixed setup. In a next
+chapter we will give more details on the dominant setup. Here we stick to
+mentioning that the document flow direction is set with
+
+\starttyping
+\setupalign[r2l] % or r2l
+\stoptyping
+
+When a command to setup an environment has a \type {align} parameter, the same
+keywords can be uses as part of the specification. \footnote {We haven't tested
+all situations and possible interferences. Just report anomalies to the mailing
+list.}
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-numbering.tex b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-numbering.tex
new file mode 100644
index 00000000000..c328d6a1a65
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-numbering.tex
@@ -0,0 +1,19 @@
+% language=us
+
+\startcomponent bidi-numbering
+
+\environment bidi-style
+
+\startchapter[title={Numbering and positioning}]
+
+todo: columns (direction key), numbers (conversionsets), margins (begin/end), etc
+
+% \defineconversionset [\s!default] [] [numbers]
+% \defineconversionset [\v!number] [] [numbers]
+% \defineconversionset [\v!pagenumber] [] [numbers]
+% \defineconversionset [\v!appendix:\s!default] [Romannumerals,Characters] [numbers]
+% \defineconversionset [\v!formula] [numbers,characters] % no \v! ?
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-style.tex
new file mode 100644
index 00000000000..1ce4e3b799c
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-style.tex
@@ -0,0 +1,123 @@
+\startenvironment bidi-style
+
+\usemodule[abr-04]
+
+\dontcomplain
+
+\startbuffer[preamble-fonts]
+\definefontfallback
+ [Serif] [scheherazaderegular*arabic]
+ [arabic] [force=yes,rscale=1.5]
+\definefontfallback
+ [SerifBold] [scheherazadebold*arabic]
+ [arabic] [force=yes,rscale=1.5]
+\definefontfallback
+ [SerifItalic] [scheherazaderegular*arabic]
+ [arabic] [force=yes,rscale=1.5]
+\definefontfallback
+ [SerifBoldItalic] [scheherazadebold*arabic]
+ [arabic] [force=yes,rscale=1.5]
+
+\definefontfallback
+ [Serif] [sileot*hebrew]
+ [hebrew] [force=yes]
+\definefontfallback
+ [SerifBold] [sileot*hebrew]
+ [hebrew] [force=yes]
+\definefontfallback
+ [SerifItalic] [sileot*hebrew]
+ [hebrew] [force=yes]
+\definefontfallback
+ [SerifBoldItalic] [sileot*hebrew]
+ [hebrew] [force=yes]
+
+\definefontfallback
+ [Mono] [almfixed*none]
+ [arabic] [force=yes]
+
+\definefontfallback
+ [Mono] [sileot*none]
+ [hebrew] [force=yes,factor=1] % factor forces a monospace
+
+\setupbodyfont
+ [dejavu,10pt]
+\stopbuffer
+
+\startbuffer[preamble-languages]
+\setuplanguage[ar][font=arabic,bidi=right]
+\setuplanguage[he][font=hebrew,bidi=right]
+\stopbuffer
+
+\getbuffer[preamble-fonts]
+\getbuffer[preamble-languages]
+
+\setuplayout
+ [backspace=15mm,
+ topspace=15mm,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+% \setuptyping
+% [color=middleblue]
+%
+% \setuptype
+% [color=middleblue]
+
+\usemodule[scite]
+
+\setuptyping
+ [option=TEX]
+
+\setuptype
+ [option=TEX]
+
+\definecolor
+ [maincolor]
+ [middleblue]
+
+\setupwhitespace
+ [big]
+
+\setuphead
+ [color=darkyellow]
+
+\setuphead
+ [chapter]
+ [style=\bfc]
+
+\setuphead
+ [section]
+ [style=\bfb]
+
+\setuphead
+ [subsection]
+ [style=\bfa]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\startluacode
+ local report = logs.reporter("directions","check")
+ local line = 0
+ function nodes.tracers.checkdirections(head)
+ line = line + 1
+ report("line: %i",line)
+ for n in nodes.traverse_id(nodes.nodecodes.dir,head) do
+ report(" %s (%i,%i)",n.dir,n.subtype,n.direction)
+ end
+ return head, false
+ end
+
+ nodes.tasks.appendaction("contributers","after","nodes.tracers.checkdirections")
+ nodes.tasks.disableaction("contributers","nodes.tracers.checkdirections")
+\stopluacode
+
+\installtextracker
+ {directions.check}
+ {\ctxlua{nodes.tasks.enableaction("contributers","nodes.tracers.checkdirections")}}
+ {\ctxlua{nodes.tasks.disableaction("contributers","nodes.tracers.checkdirections")}}
+
+% \enabletrackers[directions.check]
+% \disabletrackers[directions.check]
+
+\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-titlepage.tex
new file mode 100644
index 00000000000..a80851aea89
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-titlepage.tex
@@ -0,0 +1,33 @@
+\startcomponent bidi-titlepage
+
+\environment bidi-style
+
+\startMPpage
+
+ picture p, q, r, s ;
+
+ p := textext("l2r") xsized .9PaperWidth ;
+ q := textext("r2l") xsized .9PaperWidth ;
+ r := textext("a few tips") xsized .9PaperWidth ;
+ s := textext("\bf\ss hans\quad\space\quad hagen") xsized .5bbheight(p);
+
+ p := p shifted - llcorner p ;
+ q := q shifted - llcorner q ;
+ r := r shifted - llcorner r ;
+ s := s shifted - llcorner s ;
+
+ fill Page withcolor "darkyellow" ;
+
+ p := p shifted (.05PaperWidth,ypart .5[ulcorner Page, urcorner Page]-1.1bbheight(p)) ;
+ q := q shifted (.05PaperWidth,ypart .5[ulcorner Page, urcorner Page]-1.1bbheight(p)-1.15bbheight(q)) ;
+ r := r shifted (.05PaperWidth,ypart .5[llcorner Page, lrcorner Page]+0.3bbheight(r)) ;
+ s := s shifted (.66PaperWidth,ypart .5[llcorner Page, lrcorner Page]+1.5bbheight(s)) ;
+
+ draw p withcolor "lightgray" ;
+ draw q withcolor "lightgray" ;
+ draw r withcolor "middleblue" ;
+ draw s withcolor "lightgray" ;
+
+\stopMPpage
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-vertical.tex b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-vertical.tex
new file mode 100644
index 00000000000..824d7a033f8
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-vertical.tex
@@ -0,0 +1,18 @@
+% language=us
+
+\startcomponent bidi-vertical
+
+\environment bidi-style
+
+\startchapter[title={Going vertical}]
+
+Normally the term bidi is reserved for horizontal direction swapping but there is
+no reason to limit our view to that. So, here I will spend some words on how we
+can deal with vertical directions.
+
+{\em I will move some (not yet public) explanation from elsewhere to here in due
+time.}
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi.tex b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi.tex
index abd3f64fa3f..c6fedacdfa4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi.tex
@@ -1,505 +1,28 @@
-% language=uk
+% Because we cross a threshold in the amount of content the sources
+% have been split into components. This is typical a manual that
+% grows. Feel free to send suggestions and improvements.
-% \showglyphs
+\environment bidi-style
-\usemodule[abr-04]
+\startdocument
-\dontcomplain
+ \component bidi-titlepage
-\startbuffer[preamble-fonts]
-\definefontfallback
- [Serif] [scheherazaderegular*arabic]
- [arabic] [force=yes,rscale=1.5]
-\definefontfallback
- [SerifBold] [scheherazadebold*arabic]
- [arabic] [force=yes,rscale=1.5]
-\definefontfallback
- [SerifItalic] [scheherazaderegular*arabic]
- [arabic] [force=yes,rscale=1.5]
-\definefontfallback
- [SerifBoldItalic] [scheherazadebold*arabic]
- [arabic] [force=yes,rscale=1.5]
+ \startfrontmatter
+ \component bidi-contents
+ \component bidi-introduction
+ \stopfrontmatter
-\definefontfallback
- [Serif] [sileot*hebrew]
- [hebrew] [force=yes]
-\definefontfallback
- [SerifBold] [sileot*hebrew]
- [hebrew] [force=yes]
-\definefontfallback
- [SerifItalic] [sileot*hebrew]
- [hebrew] [force=yes]
-\definefontfallback
- [SerifBoldItalic] [sileot*hebrew]
- [hebrew] [force=yes]
+ \startbodymatter
+ \component bidi-fonts
+ \component bidi-mixed
+ \component bidi-numbering
-\definefontfallback
- [Mono] [almfixed*none]
- [arabic] [force=yes]
+ % work in progress / dev:
+ \component bidi-tables
-\definefontfallback
- [Mono] [sileot*none]
- [hebrew] [force=yes,factor=1] % factor forces a monospace
+ \component bidi-lua
+ \component bidi-vertical
+ \stopbodymatter
-\setupbodyfont
- [dejavu,10pt]
-\stopbuffer
-
-\startbuffer[preamble-languages]
-\setuplanguage[ar][font=arabic,bidi=right]
-\setuplanguage[he][font=hebrew,bidi=right]
-\stopbuffer
-
-\getbuffer[preamble-fonts]
-\getbuffer[preamble-languages]
-
-\setuplayout
- [backspace=15mm,
- topspace=15mm,
- footer=0pt,
- width=middle,
- height=middle]
-
-\setuptyping
- [color=middleblue]
-
-\setuptype
- [color=middleblue]
-
-\definecolor
- [maincolor]
- [middleblue]
-
-\setupwhitespace
- [big]
-
-\setuphead
- [color=darkyellow]
-
-\setuphead
- [chapter]
- [style=\bfc]
-
-\setuphead
- [section]
- [style=\bfb]
-
-\setuphead
- [subsection]
- [style=\bfa]
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\startluacode
- local report = logs.reporter("directions","check")
- local line = 0
- function nodes.tracers.checkdirections(head)
- line = line + 1
- report("line: %i",line)
- for n in nodes.traverse_id(nodes.nodecodes.dir,head) do
- report(" %s (%i,%i)",n.dir,n.subtype,n.direction)
- end
- return head, false
- end
-
- nodes.tasks.appendaction("contributers","after","nodes.tracers.checkdirections")
- nodes.tasks.disableaction("contributers","nodes.tracers.checkdirections")
-\stopluacode
-
-\installtextracker
- {directions.check}
- {\ctxlua{nodes.tasks.enableaction("contributers","nodes.tracers.checkdirections")}}
- {\ctxlua{nodes.tasks.disableaction("contributers","nodes.tracers.checkdirections")}}
-
-% \enabletrackers[directions.check]
-% \disabletrackers[directions.check]
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\starttext
-
-\startMPpage
-
- picture p, q, r, s ;
-
- p := textext("l2r") xsized .9PaperWidth ;
- q := textext("r2l") xsized .9PaperWidth ;
- r := textext("a few tips") xsized .9PaperWidth ;
- s := textext("\bf\ss hans\quad\space\quad hagen") xsized .5bbheight(p);
-
- p := p shifted - llcorner p ;
- q := q shifted - llcorner q ;
- r := r shifted - llcorner r ;
- s := s shifted - llcorner s ;
-
- fill Page withcolor "darkyellow" ;
-
- p := p shifted (.05PaperWidth,ypart .5[ulcorner Page, urcorner Page]-1.1bbheight(p)) ;
- q := q shifted (.05PaperWidth,ypart .5[ulcorner Page, urcorner Page]-1.1bbheight(p)-1.15bbheight(q)) ;
- r := r shifted (.05PaperWidth,ypart .5[llcorner Page, lrcorner Page]+0.3bbheight(r)) ;
- s := s shifted (.66PaperWidth,ypart .5[llcorner Page, lrcorner Page]+1.5bbheight(s)) ;
-
- draw p withcolor "lightgray" ;
- draw q withcolor "lightgray" ;
- draw r withcolor "middleblue" ;
- draw s withcolor "lightgray" ;
-
-\stopMPpage
-
-\startchapter[title=Introduction]
-
-With \CONTEXT\ you can typeset in two directions: from left to right and from
-right to left. In fact you can also combine these two directions, like this:
-
-\startbuffer
-There are many {\righttoleft \maincolor \it scripts in use} and some run into the
-other direction. However, there is {\righttoleft \maincolor \it no fixed relation
-{\lefttoright \black \it between the} direction of the script} and cars being
-driven left or right of the road.
-\stopbuffer
-
-\typebuffer
-
-\getbuffer
-
-Even someone not familiar with right to left typesetting can see what happens
-here, or not? In fact Luigi Scarso pointed out that the \type {fixed} reversed
-into {\righttoleft \type {fixed}} but not in the example where {\bf fixed}
-becomes {\righttoleft \bf fixed}. This signals an important property of the way
-the text gets processed: you input something, at some points font features get
-applied (like ligatures) and in the end the resulting glyph stream is reversed.
-By that time the combination of {\bf f}+{\bf i} has become {\bf fi}! So, be
-prepared for surprises.
-
-This manual is written by a left to right user so don't expect a manual on
-semitic typesetting. Also don't expect a (yet) complete manual. I'll add whatever
-comes to mind. This is not a manual about Hebrew or Arabic, if only because I
-can't read any of those scripts (languages). I leave that to others to cover.
-
-{\em This is work in progress! So expect errors and typos.}
-
-\startlines
-Hans Hagen
-Hasselt, NL
-\stoplines
-
-\stopchapter
-
-\startchapter[title={Setting up fonts}]
-
-So let's see how Arabic and Hebrew come out:
-
-\startbuffer
-The sentence \quotation {I have no clue what this means.} is translated (by
-Google Translate) into \quotation {\ar \righttoleft ليس لدي أي Ùكرة عما يعنيه هذا.}
-which is then translated back to \quotation {I have no idea what this means.} so
-maybe arabic has no clue what a clue is. The suggested Arabic pronunciation is
-\quotation {lays laday 'ayu fikrat eamaa yaenih hadha}. Hebrew also likes ideas
-more: \quotation {\he \righttoleft ×ין לי מושג מה ×–×” ×ומר}.
-\stopbuffer
-
-\typebuffer
-
-\getbuffer
-
-According to Idris Hamid the Arabic should actually be this: \quotation {\ar
-لَيْسَ لَدَيَّ أَيّ٠ÙÙكْرَة٠عَمَّا يَعْنÙيه٠هٰذَا} and the transliteration \quotation {Laysa
-ladayya ayyu fikratin Ê¿ammÄ yaÊ¿nihi hÄdhÄ}.
-
-The \CONTEXT\ (or any \TEX) ecosystem deals with languages and fonts. Languages
-(that relate to scripts) have specific characteristics, like running from right
-to left, and fonts provide a repertoire of glyphs and features. There is no real
-(standard) relationship between these. In for instance browsers, there are
-automatic fallback systems for missing characters in a font: another font is
-taken. These fallbacks are often not easy to tweak.
-
-In this document we use Dejavu and although that font has Arabic shapes in its
-monospace variant, the serifs come without them (at least when I write this
-down). Before we actually define the bodyfont we hook in some fallbacks. The
-typescript for Dejavu has lines like this:
-
-\starttyping
-\definefontsynonym
- [SerifBoldItalic]
- [name:dejavuserifbolditalic]
- [features=default,
- fallbacks=SerifBoldItalic]
-\stoptyping
-
-This permits us to do this:
-
-\typebuffer[preamble-fonts]
-
-In addition we set up the languages:
-
-\typebuffer[preamble-languages]
-
-The following example demonstrates what the effects of these commands are:
-
-\startbuffer
-{لَيْسَ لَدَيَّ أَيّ٠ÙÙكْرَة٠عَمَّا يَعْنÙيه٠هٰذَا.}
-{×ין לי מושג מה ×–×” ×ומר.}
-{\righttoleft لَيْسَ لَدَيَّ أَيّ٠ÙÙكْرَة٠عَمَّا يَعْنÙيه٠هٰذَا.}
-{\righttoleft ×ין לי מושג מה ×–×” ×ומר.}
-{\ar \righttoleft لَيْسَ لَدَيَّ أَيّ٠ÙÙكْرَة٠عَمَّا يَعْنÙيه٠هٰذَا.}
-{\he \righttoleft ×ין לי מושג מה ×–×” ×ומר.}
-{\ar لَيْسَ لَدَيَّ أَيّ٠ÙÙكْرَة٠عَمَّا يَعْنÙيه٠هٰذَا.}
-{\he ×ין לי מושג מה ×–×” ×ומר.}
-\stopbuffer
-
-\typebuffer
-
-\startlines
-\getbuffer
-\stoplines
-
-In principle you can also rely on automatic direction changes, for instance
-by using the following command:
-
-\starttyping
-\setupdirections
- [bidi=global,
- method=three]
-\stoptyping
-
-But that doesn't do a font switch for you, nor does it do any of the other
-language related settings. It really helps if you properly tag your
-document content, as in:
-
-\starttyping
-{\ar لَيْسَ لَدَيَّ أَيّ٠ÙÙكْرَة٠عَمَّا يَعْنÙيه٠هٰذَا.}
-{\he ×ין לי מושג מה ×–×” ×ומר.}
-\stoptyping
-
-One reason to set the \type {font} parameter for a language is that it will
-activate the right features in a font. Instead of falling back on some default,
-we can be very specific in what we want to enable.
-
-\stopchapter
-
-\startchapter[title=A mixed layout]
-
-The typesetting engine normally works from left to right and top to bottom. Going
-from right to left actually involved two decisions:
-
-\startitemize[packed]
-\startitem the direction of the display elements, the paragraphs \stopitem
-\startitem the direction of the inline text, the lines \stopitem
-\stopitemize
-
-The first one is kept track of in a state variable. Every paragraph starts with
-a node that carries, among other information, that state. This node is added
-automatically and does not interfere with the typesetting. The inline direction
-is more intrusive as it is marked by nodes that indicate the beginning and end
-of a reversed strip. This mechanism is rather reliable and normally works out
-well. Take this:
-
-\startbuffer
-left {\righttoleft right} left
-left{ \righttoleft right} left
-left {\righttoleft right }left
-left{ \righttoleft right }left
-\stopbuffer
-
-\typebuffer
-
-You can see that we need to be careful with spaces as they can end up inside or
-outside a substream and by swapping next to each other:
-
-\startlines
-\getbuffer
-\stoplines
-
-We can wrap the lines in boxes as in:
-
-\startbuffer
-\hbox{left\space{\bf\righttoleft right}\space left}
-\hbox{left{\bf\space \righttoleft right}\space left}
-\hbox{left\space{\bf\righttoleft right\space}left}
-\hbox{left{\bf\space\righttoleft right\space}left}
-\stopbuffer
-
-\typebuffer
-
-\definecolor[ShineThrough][s=0,a=1,t=.2]
-
-When visualize the spaces we get this:
-
-\startlines\ShineThrough
-\showmakeup[space,hbox]\getbuffer
-\stoplines
-
-The space of a normal and bold font in the same family normally is the same but
-let's mix with a larger size:
-
-\startbuffer
-\hbox{left {\bfa\righttoleft right} left}
-\hbox{left{\bfa\space \righttoleft right} left}
-\hbox{left {\bfa\righttoleft right }left}
-\hbox{left{\bfa\space\righttoleft right }left}
-\stopbuffer
-
-\typebuffer
-
-Now we get the following. As you can see, it really matters where we put the
-braces.
-
-\startlines
-\ShineThrough\showmakeup[space,hbox]\getbuffer
-\stoplines
-
-Once you are accustomed to tagging and \TEX\ you will probably not fall into
-these traps. In \in {figure} [fig:spaces] we show a large version.
-
-\startplacefigure[location=top,title={Watch your spaces!},reference=fig:spaces]
- \scale
- [width=\hsize]
- {\vbox{\ShineThrough\showmakeup[space,hbox]\getbuffer}}
-\stopplacefigure
-
-
-The \type {\righttoleft} command actually has two meanings. This can best be seen
-from an example.
-
-\startbuffer
-\righttoleft \bf How will this come out?
-\stopbuffer
-
-\typebuffer
-
-\start \getbuffer \par \stop
-
-\startbuffer
-And \righttoleft \bf how will this come out?
-\stopbuffer
-
-\typebuffer
-
-\start \getbuffer \par \stop
-
-When we start a paragraph (or in \TEX\ speak: when we are still in vertical mode)
-the paragraph direction as well as the inline direction is set. Otherwise only
-the inline direction is set. There are low level \TEX\ commands (primitives) to
-set the direction but you can best {\em not} use these because we need to do a
-bit more than that.
-
-There are quite some low level commands related to changing directions. Some deal
-with the layout, some with boxes. We might provide more in the future.
-
-\starttabulate[|l|p|]
-\FL
-\NC \type {\lefttoright} \NC l2r dir node or paragraph property \NC \NR
-\NC \type {\righttoleft} \NC r2l dir node or paragraph property \NC \NR
-\NC \type {\checkedlefttoright} \NC l2r dir node or paragraph property (unless already set) \NC \NR
-\NC \type {\checkedrighttoleft} \NC r2l dir node or paragraph property (unless already set) \NC \NR
-\ML
-\NC \type {\synchronizeinlinedirection} \NC pickup a (possibly) reset state \NC \NR
-\NC \type {\synchronizelayoutdirection} \NC pickup a (possibly) reset state \NC \NR
-\NC \type {\synchronizedisplaydirection} \NC pickup a (possibly) reset state \NC \NR
-\ML
-\NC \type {\righttolefthbox} \NC r2l \type {\hbox} \NC \NR
-\NC \type {\lefttorighthbox} \NC l2r \type {\hbox} \NC \NR
-\NC \type {\righttoleftvbox} \NC r2l \type {\vbox} \NC \NR
-\NC \type {\lefttorightvbox} \NC l2r \type {\vbox} \NC \NR
-\NC \type {\righttoleftvtop} \NC r2l \type {\vtop} \NC \NR
-\NC \type {\lefttorightvtop} \NC l2r \type {\vtop} \NC \NR
-\ML
-\NC \type {\leftorrighthbox} \NC l2r or r2l \type {\hbox} \NC \NR
-\NC \type {\leftorrightvbox} \NC l2r or r2l \type {\vbox} \NC \NR
-\NC \type {\leftorrightvtop} \NC l2r or r2l \type {\vtop} \NC \NR
-\ML
-\NC \type {\autodirhbox} \NC l2r or r2l \type {\hbox} (a bit more clever) \NC \NR
-\NC \type {\autodirvbox} \NC l2r or r2l \type {\vbox} (a bit more clever) \NC \NR
-\NC \type {\autodirvtop} \NC l2r or r2l \type {\vtop} (a bit more clever) \NC \NR
-\ML
-\NC \type {\bidilre} \NC character \type {U+202A}, enforce l2r state \NC \NR
-\NC \type {\bidirle} \NC character \type {U+202B}, enforce r2l state \NC \NR
-\NC \type {\bidipop} \NC character \type {U+202C}, return to last state \NC \NR
-\NC \type {\bidilro} \NC character \type {U+202D}, override l2r state \NC \NR
-\NC \type {\bidirlo} \NC character \type {U+202E}, override r2l state \NC \NR
-\NC \type {\lefttorightmark} \type {\lrm} \NC character \type {U+200E}, l2r indicator \NC \NR
-\NC \type {\righttoleftmark} \type {\rlm} \NC character \type {U+200F}, r2l indicator \NC \NR
-\ML
-\NC \type {\dirlre} \NC switch to l2r mode using \type {\bidilre} or \lefttoright \NC \NR
-\NC \type {\dirrle} \NC switch to r2l mode using \type {\bidirle} or \righttoleft \NC \NR
-\NC \type {\dirlro} \NC enforce l2r mode using \type {\bidilro} or \lefttoright \NC \NR
-\NC \type {\dirrlo} \NC enforce r2l mode using \type {\bidirlo} or \righttoleft \NC \NR
-\ML
-\NC \type {\naturalhbox} \NC a normal l2r \type {hbox} \NC \NR
-\NC \type {\naturalvbox} \NC a normal l2r \type {vbox} \NC \NR
-\NC \type {\naturalvtop} \NC a normal l2r \type {vtop} \NC \NR
-\NC \type {\naturalhpack} \NC a normal l2r \type {hpack} \NC \NR
-\NC \type {\naturalvpack} \NC a normal l2r \type {vpack} \NC \NR
-\LL
-\stoptabulate
-
-When we talk about layout, we mean the overall layout, concerning the document as
-a whole. We can have a dominantly l2r, dominantly r2l or mixed setup. In a next
-chapter we will give more details on the dominant setup. Here we stick to
-mentioning that the document flow direction is set with
-
-\starttyping
-\setupalign[r2l] % or r2l
-\stoptyping
-
-When a command to setup an environment has a \type {align} parameter, the same
-keywords can be uses as part of the specification. \footnote {We haven't tested
-all situations and possible interferences. Just report anomalies to the mailing
-list.}
-
-\stopchapter
-
-\startchapter[title={Numbering and positioning}]
-
-todo: columns (direction key), numbers (conversionsets), margins (begin/end), etc
-
-\stopchapter
-
-\startchapter[title={The \LUA\ interface}]
-
-We assume that you run \CONTEXT\ \MKIV\ in combination with \LUATEX. Direction
-support in this engine has been improved over time. Originally the \OMEGA\
-(\ALEPH) direction model was used but in the meantime it has been stripped to the
-basics, and what used to be so called whatsits (extension nodes) are now first
-class nodes. In the \LUA\ interface we still support the:
-
-\startitemize[packed]
-\startitem
- \type {TLT} and \type {TRT} keywords for local par nodes
-\stopitem
-\startitem
- \type {+TLT}, \type {-TLT}, \type {+TRT} and \type {-TRT} keywords for
- direction nodes
-\stopitem
-\stopitemize
-
-However, because we use dedicated nodes, and because nodes actually store numbers
-and not strings we also expose the numeric model:
-
-\starttabulate[|l|l|l|]
-\NC 0 \NC \type {TLT} \NC left to right \NC \NR
-\NC 1 \NC \type {TRT} \NC right to left \NC \NR
-\NC 2 \NC \type {LTL} \NC not used in context \NC \NR
-\NC 3 \NC \type {RTT} \NC not used in context \NC \NR
-\stoptabulate
-
-These values are used for local par nodes as well as direction nodes. In addition
-a direction node has a subtype:
-
-\starttabulate[|l|l|l|]
-\NC 0 \NC \type {normal} \NC comparable to \type {+} \NC \NR
-\NC 1 \NC \type {cancel} \NC comparable to \type {-} \NC \NR
-\stoptabulate
-
-The \type {dir} field uses the strings, the \type {direction} field the number
-(both of course share the same internal node variable).
-
-\stopchapter
-
-\stoptext
-
-% \defineconversionset [\s!default] [] [numbers]
-% \defineconversionset [\v!number] [] [numbers]
-% \defineconversionset [\v!pagenumber] [] [numbers]
-% \defineconversionset [\v!appendix:\s!default] [Romannumerals,Characters] [numbers]
-% \defineconversionset [\v!formula] [numbers,characters] % no \v! ?
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-basics.tex b/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-basics.tex
index 4d7822bd0a1..3832501c5d2 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-basics.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-basics.tex
@@ -874,9 +874,8 @@ will keep their color.
This is what we get in \MKIV: \start \inlinebuffer \stop
-When we use fonts switches we don't expect the content of the
-box to change. So, in the following the \quote {default} texts will
-{\em not} become bold.
+When we use fonts switches we don't expect the content of the box to change. So,
+in the following the \quote {default} texts will {\em not} become bold.
\startbuffer
\setbox0\hbox{default {\sl slanted \bi bold italic} default}
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-contents.tex
new file mode 100644
index 00000000000..d20b45eee6c
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-contents.tex
@@ -0,0 +1,11 @@
+\startcomponent evenmore-contents
+
+\environment evenmore-style
+
+\starttitle[title={Table of contents}]
+
+ \placelist[chapter]
+
+\stoptitle
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-expansion.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-expansion.tex
new file mode 100644
index 00000000000..6c67f07d634
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-expansion.tex
@@ -0,0 +1,148 @@
+% language=us
+
+\environment evenmore-style
+
+\startcomponent evenmore-expansion
+
+\startchapter[title=Expansion]
+
+Character expansion was introduced in \PDFTEX\ a couple of decades ago. It is a
+mechanism that scales glyphs horizontally in order to reduce excessive whitespace
+that is needed to properly justify a paragraph. I must admit that I never use it
+myself but there are users who do. Although this mechanism evolved a bit, and in
+\LUATEX\ is implemented a bit different, the basics remained the same. If you
+have no clue what this is about, you can just quite reading here.
+
+A font can be set up to expand characters by a certain amount: they can shrink or
+stretch. This is driven by three parameters: \type {step}, \type {stretch} and
+\type {shrink}. The values are in thousands because \TEX\ has no float quantity.
+Originally these values were percentages of the width of a glyph, later they
+became related to the em width but in \LUATEX\ we went back to the former
+definition.
+
+In \CONTEXT\ \MKIV\ we have an interface that works as follows:
+
+\startbuffer
+\startluacode
+ local classes = fonts.expansions.classes
+
+ classes.qualitya = {
+ vector = "default",
+ factor = 1,
+ stretch = 4,
+ shrink = 2,
+ step = .5,
+ }
+
+ classes.qualityb = {
+ vector = "default",
+ factor = 1,
+ stretch = 8,
+ shrink = 4,
+ step = .5,
+ }
+
+\stopluacode
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+The default vector looks like this:
+
+\starttyping[option=LUA]
+vectors['default'] = {
+ [0x0041] = 0.5, -- A
+ [0x0042] = 0.7, -- B
+ -- and some more
+}
+\stoptyping
+
+The values that we pass to the engine are stretch 40, shrink 20, and step 5 for
+\type {qualitya} and stretch 80, shrink 40, and step 5 for \type {qualityb}, so
+we multiply by 10. In the engine the step is limited to 100, the stretch to 1000
+and the shrink to 500. But these extremes produce quite bad results.
+
+The expansion class is set with the \type {expansion} feature, as in:
+
+\startbuffer
+\definefontfeature [basea] [default] [expansion=qualitya]
+\definefontfeature [baseb] [default] [expansion=qualityb]
+
+\definefont [FontA] [Serif*basea]
+\definefont [FontB] [Serif*baseb]
+
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+\startbuffer[sample]
+ \setupalign[verytolerant,stretch,hz] % hz triggers expansion
+ \dorecurse {30} {%
+ {\FontB \darkred test me #1,} \FontA \dorecurse{#1}{test ##1, }%
+ }\par
+\stopbuffer
+
+In \in {figure} [hz:1] we see this in action, using the following code:
+
+\typebuffer[sample][option=TEX]
+
+\startplacefigure[reference=hz:1]
+ \getbuffer[sample]
+\stopplacefigure
+
+There is one drawback with this method, although so far I never heard a user
+complain, which can be an indication of how this mechanism is used: you cannot
+mix fonts with different step, stretch and|/|or shrink. As we just did this in
+the example, this statement is not really true in \LUAMETATEX: there we only need
+to keep the step the same. This is compatible in the sense that otherwise we
+would quit the run, so at least we carry on: the smallest stretch and shrink is
+taken. But, we do issue a warning (once) because there can be side effects! This
+is not that pretty a solution anyway because it depends on what font is used
+first.
+
+It is for this reason that we have another option: in \CONTEXT\ \LMTX\ you can
+define a specific expansion:
+
+\startbuffer
+\defineexpansion
+ [myexpansion]
+ [step=1, % default
+ stretch=50,
+ shrink=20]
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+There is no need to have a different step than~1. In \PDFTEX\ instances are
+created per step used, but in \LUATEX\ this is more fluid. There is no gain in
+using different steps. We just keep it for compatibility reasons. This specific
+expansion is enables with:
+
+\starttyping[option=TEX]
+\setexpansion[myexpansion]
+\stoptyping
+
+and the result is shown in \in {figure} [hz:2]. This time the set expansion wins
+over the one set in the font. All fonts that have the expansion feature set are
+treated the same. By using this method you can locally have different values.
+
+\startplacefigure[reference=hz:2]
+ \setexpansion[myexpansion]
+ \getbuffer[sample]
+\stopplacefigure
+
+Deep down we use some new primitives:
+
+\starttyping[option=TEX]
+\adjustspacingstep
+\adjustspacingstretch
+\adjustspacingshrink
+\stoptyping
+
+The step is limited to 100 (10\percent) and the stretch and shrink to 500
+(50\percent) and the stretch to 1000 (100\percent) but these extremes are only
+useful for examples.
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-fonts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-fonts.tex
new file mode 100644
index 00000000000..fea3f7ac5ac
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-fonts.tex
@@ -0,0 +1,732 @@
+% language=us
+
+\environment evenmore-style
+
+\disabledirectives[fonts.svg.cached]
+
+% \usemodule[scite]
+% \usemodule[article-basic]
+% \usemodule[abbreviations-logos]
+
+\startcomponent evenmore-fonts
+
+\startchapter[title=Modern Type 3 fonts]
+
+Support for \TYPETHREE\ fonts has been on my agenda for a couple of years now.
+Here I will take a look at them from the perspective of \LUAMETATEX. \footnote
+{This chapter appeared in \TUGBOAT\ 40:3. Thanks to Karl Berry for corrections.}
+The reason is that they might be useful for embedding (for instance) runtime
+graphics (such as symbols) in an efficient way. In \TEX\ systems \TYPETHREE\
+fonts are normally used for bitmap fonts, the \PK\ output that comes via
+\METAFONT. Where for instance \TYPEONE\ fonts are defined using a set of font
+specific rendering operators, a \TYPETHREE\ font can contain arbitrary code, in
+\PDF\ files these are \PDF\ (graphic and text) operators.
+
+A program like \LUATEX\ supports embedding of several font formats natively. A
+quick summary of relevant formats is the following: \footnote {Technically one
+can embed anything in the \PDF\ file.}
+
+\startitemize[headintext][headstyle=bold]
+\starthead {\TYPEONE:}
+ these are outline fonts using \type {cff} descriptions, a compact format for
+ storing outlines. Normally up to 256 characters are accessible but a font can
+ have many more (as Latin Modern and \TEX\ Gyre demonstrate).
+\stophead
+\starthead {\OPENTYPE:}
+ these also use the \type {cff} format. As with \TYPEONE\ the outlines are
+ mostly cubic Bezier curves. Because there is no bounding box data stored in
+ the format the engine has to pseudo|-|render the glyphs to get that
+ information. When embedding a subset the backend code has to flatten the
+ subroutine calls, which is another reason the \type {cff} blob has to be
+ disassembled.
+\stophead
+\starthead {\TRUETYPE:}
+ these use the \type {ttf} format which uses quadratic B|-|splines. The font
+ can have a separate kerning table and stores information about the bounding
+ box (which is then used by \TEX\ to get the right heights and depths of
+ glyphs). Of course those details never make it into the \PDF\ file as such.
+\stophead
+\starthead {\TYPETHREE:}
+ as mentioned this format is (traditionally) used to store bitmap fonts but as
+ we will see it can do more. It is actually the easiest format to deal with.
+\stophead
+\stopitemize
+
+In \LUATEX\ any font can be a \quotation {wide} font, therefore in \CONTEXT\ a
+\TYPEONE\ font is not treated differently than an \OPENTYPE\ font. The \LUATEX\
+backend can even disguise a \TYPEONE\ font as an \OPENTYPE\ font. In the end, as
+not that much information ends up in the \PDF\ file, the differences are not that
+large for the first three types. The content of a \TYPETHREE\ font is less
+predictable but even then it can have for instance a \type {ToUnicode} vector so
+it has no real disadvantages in, say, accessibility. In \CONTEXT\ \LMTX, which
+uses \LUAMETATEX\ without any backend, all is dealt with in \LUA: loading,
+tweaking, applying and embedding.
+
+The difference between \OPENTYPE\ and \TRUETYPE\ is mostly in the kind of curves
+and specific data tables. Both formats are nowadays covered by the \OPENTYPE\
+specification. If you Google for the difference between these formats you can
+easily end up with rather bad (or even nonsense) descriptions. The best
+references are \typ {https://en.wikipedia.org/wiki/Bézier_curve} and the
+ever|-|improving \typ {https://docs.microsoft.com/en-us/typography} website.
+
+Support for so|-|called variable fonts is mostly demanding of the front|-|end
+because in the backend it is just an instance of an \OPENTYPE\ or \TRUETYPE\ font
+being embedded. In this case the instance is generated by the \CONTEXT\ font
+machinery which interprets the \type {cff} and \type {ttf} binary formats in
+doing~so. This feature is not widely used but has been present from the moment
+these fonts showed up.
+
+\TYPETHREE\ fonts don't have a particularly good reputation, which is mainly due
+to the fact that viewers pay less attention in displaying them, at least that was
+the case in the past. If they describe outlines, then all is okay, apart from the
+fact that there is no anti|-|aliasing or hinting but on modern computers that is
+hardly an issue. For bitmaps the quality depends on the resolution and
+traditionally \TEX\ bitmap fonts are generated for a specific device, but if you
+use a decent resolution (say 1200 dpi) then all should be okay. The main drawback
+is that viewers will render such a font and cache the (then available) bitmap
+which in some cases can have a speed penalty.
+
+Using \TYPETHREE\ fonts in a \PDF\ backend is not something new. Already in the
+\PDFTEX\ era we were playing with so|-|called \PDF\ glyph containers. In practice
+that worked okay but not so much for \METAPOST\ output from \METAFONT\ fonts. As
+a side note: it might actually work better now that in \METAFUN\ we have some
+extensions for rendering the kind of paths used in fonts. But glyph containers
+were dropped long ago already and \TYPETHREE\ was limited to traditional \TEX\
+bitmap inclusion. However, in \LUAMETATEX\ it is easier to mess around with fonts
+because we no longer need to worry about side effects of patching font related
+inclusion (embedding) for other macro packages. All is now under \LUA\ control:
+there is no backend included and therefore no awareness of something built|-|in
+as \TYPETHREE.
+
+So, as a prelude to the 2019 \CONTEXT\ meeting, I picked up this thread and
+turned some earlier experiments into production code. Originally I meant to
+provide support for \METAPOST\ graphics but that is still locked in experiments.
+I do have an idea for its interface, now that we have more control over user
+interfaces in \METAFUN.
+
+In addition to \quote {just graphics} there is another candidate for \TYPETHREE\
+fonts \emdash\ extensions to \OPENTYPE\ fonts:
+
+\startitemize[packed,n]
+\startitem Color fonts where stacked glyphs are used (a nice method). \stopitem
+\startitem Fonts where \SVG\ images are used. \stopitem
+\startitem Fonts that come with bitmap representations in \PNG\ format. \stopitem
+\stopitemize
+
+It will be no surprise that we're talking of emoji fonts here although the second
+category is now also used for regular text fonts. When these fonts showed up
+support for them was not that hard to implement and (as often) we could make
+\TEX\ be among the first to support them in print (often such fonts are meant for
+the web).
+
+For category one, the stacked shapes, the approach was to define a virtual font
+where glyphs are flushed while backtracking over the width in order to get the
+overlay. Of course color directives have to be injected too. The whole lot is
+wrapped in a container that tells a \PDF\ handler what character actually is
+represented. Due to the way virtual fonts work, every reference to a character
+results in the same sequence of glyph references, (negative) kern operations and
+color directives plus the wrapper in the page stream. This is not really an issue
+for emoji because these are seldom used and even then in small quantities. But it
+can explode a \PDF\ page stream for a color text font. All happens at runtime and
+because we use virtual fonts, the commands are assembled beforehand for each
+glyph.
+
+For the second category, \SVG\ images, we used a different approach. Each symbol
+was converted to \PDF\ using Inkscape and cached for later use. Instead of
+injecting a glyph reference, a reference to a so|-|called \type {XForm} is
+injected, again with a wrapper to indicate what character we deal with. Here the
+overhead is not that large but still present as we need the so|-|called \quote
+{actual text} wrapper.
+
+The third category is done in a similar way but this time we use GraphicsMagick
+to convert the images beforehand. The drawbacks are the same.
+
+In \CONTEXT\ \LMTX\ a different approach is followed. The \PDF\ stream that
+stacks the glyphs of category one makes a perfect stream for a \TYPETHREE\
+character. Apart from some juggling to relate a \TYPETHREE\ font to an \OPENTYPE\
+font, the page stream just contains references to glyphs (with the proper related
+\UNICODE\ slot). The overhead is minimal.
+
+For the second category \CONTEXT\ \LMTX\ uses its built|-|in \SVG\ converter. The
+\XML\ code of the shape is converted to (surprise): \METAPOST. We could go
+directly to \PDF\ but the \METAPOST\ route is cheap and we can then get support
+for color spaces, transformations, efficient paths and high quality all for free.
+It also opens up the possibility for future manipulations. The \TYPETHREE\ font
+eventually has a sequence of drawing operations, mixed with transformations and
+color switches, but only once. Most of the embedded code is shared with the other
+categories (a plug|-|in model is used).
+
+The third category follows a similar route but this time we use the built|-|in
+\PNG\ inclusion code. Just like the other categories, the page stream only
+contains references to glyphs.
+
+It was interesting to find that most of the time related to the inclusion went
+into figuring out why viewers don't like these fonts. For instance, in Acrobat
+there needs to be a glyph at index zero and all viewers seem to be able to handle
+at most 255 additional characters in a font. But once that, and a few more
+tricks, had become clear, it worked out quite well. It also helps to set the font
+bounding box to all zero values so that no rendering optimizations kick in. Also,
+some dimensions can are best used consistently. With \SVG\ there were some issues
+with reference points and bounding boxes but these could be dealt with. A later
+implementation followed a slightly different route anyway.
+
+The implementation is reasonably efficient because most work is delayed till a
+glyph (shape) is actually injected (and most shapes in these fonts aren't used at
+all). The viewers that I have installed, Acrobat Reader, Acrobat X, and the
+mupdf|-|based Sumatra\PDF\ viewer can all handle the current implementation.
+
+An example of a category one font is \MICROSOFT's \type {seguiemj}. I have no
+clue about the result in the future because some of these emoji fonts change
+every now and then, depending also on social developments. This is a category one
+font which not only has emoji symbols but also normal glyphs:
+
+\startbuffer[1a]
+\definefontfeature[colored][default][colr=yes]
+\definefont[TestA][file:seguiemj.ttf*colored]
+\definesymbol[bug1][\getglyphdirect{file:seguiemj.ttf*colored} {\char"1F41C}]
+\definesymbol[bug2][\getglyphdirect{file:seguiemj.ttf*colored} {\char"1F41B}]
+\stopbuffer
+
+\typebuffer[1a][option=TEX] \getbuffer[1a]
+
+The example below demonstrates this by showing the graphic glyph surrounded by
+the \type {x} from the emoji font, and from a regular text font.
+
+\startbuffer[1b]
+{\TestA x\char"1F41C x\char"1F41B x}%
+\quad
+{x\symbol[bug1]x\symbol[bug2]x}%
+\quad
+{\showglyphs x\symbol[bug1]x\symbol[bug2]x}%
+\stopbuffer
+
+\typebuffer[1b][option=TEX]
+
+\startlinecorrection
+\scale[width=\textwidth]{\getbuffer[1b]}
+\stoplinecorrection
+
+In this mix we don't use a \TYPETHREE\ font for the characters that don't need
+stacked (colorful) glyphs, which is more efficient. So the \type {x} characters
+are references to a regular (embedded) \OPENTYPE\ font.
+
+The next example comes from a manual and demonstrates that we can (still)
+manipulate colors as we wish.
+
+\startbuffer[1c]
+\definecolor[emoji-red] [r=.4]
+\definecolor[emoji-blue] [b=.4]
+\definecolor[emoji-green] [g=.4]
+\definecolor[emoji-yellow][r=.4,g=.5]
+\definecolor[emoji-gray] [s=1,t=.5,a=1]
+
+\definefontcolorpalette
+ [emoji-red]
+ [emoji-red,emoji-gray]
+
+\definefontcolorpalette
+ [emoji-green]
+ [emoji-green,emoji-gray]
+
+\definefontcolorpalette
+ [emoji-blue]
+ [emoji-blue,emoji-gray]
+
+\definefontcolorpalette
+ [emoji-yellow]
+ [emoji-yellow,emoji-gray]
+
+\definefontfeature[seguiemj-r][default][ccmp=yes,dist=yes,colr=emoji-red]
+\definefontfeature[seguiemj-g][default][ccmp=yes,dist=yes,colr=emoji-green]
+\definefontfeature[seguiemj-b][default][ccmp=yes,dist=yes,colr=emoji-blue]
+\definefontfeature[seguiemj-y][default][ccmp=yes,dist=yes,colr=emoji-yellow]
+
+\definefont[MyColoredEmojiR][seguiemj*seguiemj-r]
+\definefont[MyColoredEmojiG][seguiemj*seguiemj-g]
+\definefont[MyColoredEmojiB][seguiemj*seguiemj-b]
+\definefont[MyColoredEmojiY][seguiemj*seguiemj-y]
+\stopbuffer
+
+\typebuffer[1c][option=TEX] \getbuffer[1c]
+
+\startbuffer[1d]
+\MyColoredEmojiR\resolvedemoji{man}\resolvedemoji{woman}%
+\MyColoredEmojiG\resolvedemoji{man}\resolvedemoji{woman}%
+\MyColoredEmojiB\resolvedemoji{man}\resolvedemoji{woman}%
+\MyColoredEmojiY\resolvedemoji{man}\resolvedemoji{woman}%
+\stopbuffer
+
+\startlinecorrection
+ \scale[width=\textwidth]{\getbuffer[1d]}
+\stoplinecorrection
+
+Let's look in more detail at the woman emoji. On the left we see the default
+colors, and on the right we see our own:
+
+\definefontfeature[seguiemj][default][ccmp=yes,dist=yes,colr=yes]
+\definefont[MyColoredEmojiD][seguiemj*seguiemj]
+
+\startlinecorrection
+\scale[height=2cm]
+ {\MyColoredEmojiD\resolvedemoji{woman}%
+ \MyColoredEmojiR\resolvedemoji{woman}}
+\stoplinecorrection
+
+The multi|-|color variant in \CONTEXT\ \MKIV\ ends up as follows in the page
+stream:
+
+\starttyping
+/Span << /ActualText <feffD83DDC69> >> BDC
+q
+0.000 g
+BT
+/F8 11.955168 Tf
+1 0 0 1 0 2.51596 Tm [<045B>]TJ
+0.557 0.337 0.180 rg
+1 0 0 1 0 2.51596 Tm [<045C>]TJ
+1.000 0.784 0.239 rg
+1 0 0 1 0 2.51596 Tm [<045D>]TJ
+0.000 g
+1 0 0 1 0 2.51596 Tm [<045E>]TJ
+0.969 0.537 0.290 rg
+1 0 0 1 0 2.51596 Tm [<045F>]TJ
+0.941 0.227 0.090 rg
+1 0 0 1 0 2.51596 Tm [<0460>]TJ
+ET
+Q
+EMC
+\stoptyping
+
+and the reddish one becomes:
+
+\starttyping[option=PDF]
+/Span << /ActualText <feffD83DDC69> >> BDC
+q
+0.400 0 0 rg 0.400 0 0 RG
+BT
+/F8 11.955168 Tf
+1 0 0 1 0 2.51596 Tm [<045B>]TJ
+1 g 1 G /Tr1 gs
+1 0 0 1 0 2.51596 Tm [<045C>1373<045D>1373<045E>1373<045F>1373<0460>]TJ
+ET
+Q
+EMC
+\stoptyping
+
+Each time this shape is typeset these sequences are injected. In \CONTEXT\ \LMTX\
+we get this in the page stream:
+
+\starttyping[option=PDF]
+BT
+/F2 11.955168 Tf
+1 0 0 1 0 2.515956 Tm [<C8>] TJ
+ET
+\stoptyping
+
+This time the composed shape ends up in the \TYPETHREE\ character procedure. In
+the colorful case (reformatted because it actually is a one|-|liner):
+
+\starttyping[option=PDF]
+2812 0 d0
+0.000 g BT /V8 1 Tf [<045B>] TJ ET
+0.557 0.337 0.180 rg BT /V8 1 Tf [<045C>] TJ ET
+1.000 0.784 0.239 rg BT /V8 1 Tf [<045D>] TJ ET
+0.000 g BT /V8 1 Tf [<045E>] TJ ET
+0.969 0.537 0.290 rg BT /V8 1 Tf [<045F>] TJ ET
+0.941 0.227 0.090 rg BT /V8 1 Tf [<0460>] TJ ET
+\stoptyping
+
+and in the reddish case (where we have a gray transparent color):
+
+\starttyping[option=PDF]
+2812 0 d0
+0.400 0 0 rg 0.400 0 0 RG
+BT /V8 1 Tf [<045B>] TJ ET
+1 g 1 G /Tr1 gs
+BT /V8 1 Tf [<045C>] TJ ET
+BT /V8 1 Tf [<045D>] TJ ET
+BT /V8 1 Tf [<045E>] TJ ET
+BT /V8 1 Tf [<045F>] TJ ET
+BT /V8 1 Tf [<0460>] TJ ET
+\stoptyping
+
+but this time we only get these verbose compositions once in the \PDF\ file. We
+could optimize the last variant by a sequence of indices and negative kerns but
+it hardly pays off. There is no need for \type {ActualText} here because we have
+an entry in the \type {ToUnicode} vector:
+
+\starttyping[option=PDF]
+<C8> <D83DDC69>
+\stoptyping
+
+To be clear, the \type {/V8} is a sort of local reference to a font which can
+have an \type {/F8} counterpart elsewhere. These \TYPETHREE\ fonts have their own
+resource references and I found it more clear to use a different prefix in that
+case. If we only use a few characters of this kind, of course the overhead of
+extra fonts has a penalty but as soon we refer to more characters we gain a lot.
+
+When we have \SVG\ fonts, the gain is a bit less. The \PDF\ resulting from the
+\METAPOST\ run can of course be large but they are included only once. In \MKIV\
+these would be (shared) so|-|called \type {XForm}s. In the page stream we then
+see a simple reference to such an \type {XForm} but again wrapped into an \type
+{ActualText}. In \LMTX\ we get just a reference to a \TYPETHREE\ character plus
+of course an extra font.
+
+The \typ {emojionecolor-svginot} font is somewhat problematic (although maybe in
+the meantime it has become obsolete). As usual with new functionality,
+specifications are not always available or complete (especially when they are
+application specs turned into standards). This is also true with for instance
+\SVG\ fonts. The current documentation on the \MICROSOFT\ website is reasonable
+and explains how to deal with the viewport but when I first implemented support
+for \SVG\ it was more trial and error. The original implementation in \CONTEXT\
+used Inkscape to generate \PDF\ files with a tight bounding box and mix that with
+information from the font (in \MKIV\ and the generic loader we still use this
+method). This results in a reasonable placement for emoji (that often sit on top
+of the baseline) but not for characters. More accurate treatment, using the
+origin and bounding box, fail for graphics with bad viewports and strange
+transform attributes. Now one can of course argue that I read the specs wrong,
+but inconsistencies are hard to deal with. Even worse is that successive versions
+of a font can demand different hacks. (I would not be surprised if some programs
+have built|-|in heuristics for some fonts that apply fixes.) Here is an example:
+
+\starttyping
+<svg transform="translate(0 -1788) scale(2.048)" viewBox="0 0 64 64" ...>
+ <path d="... all within the viewBox ..." ... />
+</svg>
+\stoptyping
+
+It is no problem to scale up the image to normal dimensions, often 1000, or 2048
+but I've also seen 512. The 2.048 suggests a 2048 unit approach, as does the 1788
+shift. Now, we could scale up all dimensions by 1000/64 and then multiply by
+2.048 and eventually shift over 1788, but why not scale the 1788 by 2.048 or
+scale 64 by 2.048? Even if we can read the standard to suit this specification
+it's just a bit too messy for my taste. In fact I tried all reasonable
+combinations and didn't (yet) get the right result. In that case it's easier to
+just discard the font. If a user complains that it (kind of) worked in the past,
+a counter|-|argument can be that other (more recent) fonts don't work otherwise.
+In the end we ended up with an option: when the \type {svg} feature value is
+\type {fixdepth} the vertical position will be fixed.
+
+\startbuffer[2a]
+\definefontfeature[whatever][default][color=yes,svg=fixdepth]
+\definefont[TestB][file:emojionecolor-svginot.ttf*whatever]
+\stopbuffer
+
+\typebuffer[2a][option=TEX] \getbuffer[2a]
+
+\startbuffer[2b]
+x{\TestB \char"1F41C \char"1F41B}x
+\stopbuffer
+
+\startlinecorrection
+ \scale[height=1cm]{\getbuffer[2b]}
+\stoplinecorrection
+
+The newer \type {emojionecolor} font doesn't need this because it has a \type
+{viewBox} of \type {0 54.4 64 64} which fixes the baseline.
+
+\startbuffer[2c]
+\definefontfeature[whatever][default][color=yes,svg=yes]
+\definefont[TestB][file:emojionecolor.otf*whatever]
+\stopbuffer
+
+\typebuffer[2c][option=TEX] \getbuffer[2c]
+
+\startlinecorrection
+ \scale[height=1cm]{\getbuffer[2b]}
+\stoplinecorrection
+
+Another example of a pitfall is running into category one glyphs made from
+several pieces that all have the same color. If that color is black, one starts
+to wonder what is wrong. In the end the \CONTEXT\ code was doing the right thing
+after all, and I would not be surprised if that glyph gets colors in an update of
+the font. For that reason it makes no sense to include them as examples here.
+After all, we can hardly complain about free fonts (and I'm also guilty of
+imposing bugs on users). By the way, for the font referred to here (\type
+{twemojimozilla}), another pitfall was that all shapes in my copy had a zero
+bounding box which means that although a width is specified, rendering in
+documents can give weird side effects. This can be corrected by the \type
+{dimensions} feature that forces the ascender and descender values to be used.
+
+\startbuffer[3a]
+\definefontfeature[colored:x][default][colr=yes]
+\definefontfeature[colored:y][default][colr=yes,dimensions={1,max,max}]
+\definefont[TestC][file:twemojimozilla.ttf*colored:x]
+\definefont[TestD][file:twemojimozilla.ttf*colored:y]
+\stopbuffer
+
+\typebuffer[3a][option=TEX] \getbuffer[3a]
+
+\startbuffer[3b]
+{\TestC\char 128028}\quad{\showglyphs\TestC\char 128028}\quad
+{\TestD\char 128028}\quad{\showglyphs\TestD\char 128028}
+\stopbuffer
+
+\startlinecorrection
+ \scale[height=2cm]{\getbuffer[3b]}
+\stoplinecorrection
+
+An example of a \PNG|-|enhanced font is the \type {applecoloremoji} font. The
+bitmaps are relatively large for the quality they provide and some look like
+scans.
+
+\startbuffer[4a]
+\definefontfeature[sbix][default][sbix=yes]
+\definefont[TestE][file:applecoloremoji.ttc*sbix at 10bp]
+\stopbuffer
+
+\typebuffer[4a][option=TEX] \getbuffer[4a]
+
+\startbuffer[4b]
+\red \TestE \char 35 \char 9203 \char 9202
+\stopbuffer
+
+\startlinecorrection
+ \scale[height=1cm]{\getbuffer[4b]}
+\stoplinecorrection
+
+As mentioned above, there are fonts that color characters other than emoji. We
+give two examples (sometimes fonts are mentioned on the \CONTEXT\ mailing list).
+
+\startbuffer[5a]
+\definefontfeature
+ [whatever]
+ [default,color:svg]
+ [script=latn,
+ language=dflt]
+
+\definefont[TestF][file:Abelone-FREE.otf*whatever @ 13bp]
+\definefont[TestG][file:Gilbert-ColorBoldPreview5*whatever @ 13bp]
+\definefont[TestH][file:ColorTube-Regular*whatever @ 13bp]
+\stopbuffer
+
+\typebuffer[5a][option=TEX] \getbuffer[5a]
+
+Of course one can wonder about the readability of these fonts and unless one used
+random colors (which bloats the file immensely) it might become boring, but
+typically such fonts are only meant for special purposes.
+
+\startbuffer[5b]
+ {\TestF\setupinterlinespace[0.7]\input zapf \par}
+\stopbuffer
+
+\startbuffer[5c]
+ {\TestG\setupinterlinespace \input zapf \par}
+\stopbuffer
+
+\startbuffer[5d]
+ {\TestH\setupinterlinespace[0.7]\input zapf \par}
+\stopbuffer
+
+\start \setupalign[tolerant] \getbuffer[5b] \stop
+
+The previous font is the largest and as a consequence also puts some strain on
+the viewer, especially when zooming in. But, because viewers cache \TYPETHREE\
+shapes it's a one|-|time penalty.
+
+\start \setupalign[tolerant] \getbuffer[5c] \stop
+
+This font is rather lightweight. Contrary to what one might expect, there is no
+transparency used (but of course we do support that when needed).
+
+\start \setupalign[tolerant] \getbuffer[5d] \stop
+
+This third example is again rather lightweight. Such fonts normally have a rather
+limited repertoire although there are some accented characters included. But they
+are not really meant for novels anyway. If you look closely you will also notice
+that some characters are missing and kerning is suboptimal.
+
+I considered testing some more fonts but when trying to download some interesting
+looking ones I got a popup asking me for my email address in order to subscribe
+me to something: a definite no|-|go.
+
+%\section{\SVG\ to MetaPost}
+
+I already mentioned that we have a built|-|in converter that goes from \SVG\ to
+\METAPOST. Although this article deals with fonts, the following code
+demonstrates that we can also access such graphics in \METAFUN\ itself. The nice
+thing is that because we get pictures, they can be manipulated.
+
+\startbuffer
+\startMPcode{doublefun}
+ picture p ; p := lmt_svg [ filename = "mozilla-svg-001.svg" ] ;
+ numeric w ; w := bbwidth(p) ;
+ draw p ;
+ draw p xscaled -1 shifted (2.5*w,0);
+ draw p rotatedaround(center p,45) shifted (3.0*w,0) ;
+ draw image (
+ for i within p : if filled i :
+ draw pathpart i withcolor green ;
+ fi endfor ;
+ ) shifted (4.5*w,0);
+ draw image (
+ for i within p : if filled i :
+ fill pathpart i withcolor red withtransparency (1,.25) ;
+ fi endfor ;
+ ) shifted (6*w,0);
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+This graphic is a copy from a glyph from an emoji font, so we have plenty of such
+images to play with. The above manipulations result in:
+
+\startlinecorrection
+ \getbuffer
+\stoplinecorrection
+
+Now that we're working with \METAPOST\ we may as well see if we can also load a
+specific glyph, and indeed this is possible.
+
+\startbuffer[1]
+\startMPcode{doublefun}
+ picture lb, rb ;
+ lb := lmt_svg [ fontname = "Gilbert-ColorBoldPreview5", unicode = 123 ] ;
+ rb := lmt_svg [ fontname = "Gilbert-ColorBoldPreview5", unicode = 125 ] ;
+ numeric dx ; dx := 1.25 * bbwidth(lb) ;
+ draw lb ;
+ draw rb shifted (dx,0) ;
+ pickup pencircle scaled 2mm ;
+ for i within lb :
+ draw lmt_arrow [
+ path = pathpart i,
+ pen = "auto",
+ alternative = "curved",
+ penscale = 8
+ ]
+ shifted (3dx,0)
+ withcolor "darkblue"
+ withtransparency (1,.5)
+ ;
+ endfor ;
+ for i within rb :
+ draw lmt_arrow [
+ path = pathpart i,
+ pen = "auto",
+ alternative = "curved",
+ penscale = 8
+ ]
+ shifted (4dx,0)
+ withcolor "darkred"
+ withtransparency (1,.5)
+ ;
+ endfor ;
+\stopMPcode
+\stopbuffer
+
+% Ok, I should make a macro ...
+
+\startbuffer[2]
+\startMPcode{doublefun}
+ picture lb, rb ;
+ lb := lmt_svg [ fontname = "Gilbert-ColorBoldPreview5", unicode = 42 ] ;
+ rb := lmt_svg [ fontname = "Gilbert-ColorBoldPreview5", unicode = 64 ] ;
+ numeric dx ; dx := 1.25 * bbwidth(lb) ;
+ draw lb ;
+ draw rb shifted (dx,0) ;
+ pickup pencircle scaled 2mm ;
+ for i within lb :
+ draw lmt_arrow [
+ path = pathpart i,
+ pen = "auto",
+ alternative = "curved",
+ penscale = 6
+ ]
+ shifted (3.5dx,0)
+ withcolor "darkgreen"
+ withtransparency (1,.5)
+ ;
+ endfor ;
+ for i within rb :
+ draw lmt_arrow [
+ path = pathpart i,
+ pen = "auto",
+ alternative = "curved",
+ penscale = 6
+ ]
+ shifted (4.5dx,0)
+ withcolor "darkyellow"
+ withtransparency (1,.5)
+ ;
+ endfor ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[1][option=TEX]
+
+Here we first load two character shapes from a font. The \UNICODE\ slots (which
+here are the same as the \ASCII\ slots) might look familiar: they indicate the
+curly brace characters. We get two pictures and use the \type {within} loop to
+run over the paths within these shapes. Each shape is made from three curves. As
+a bonus a few more characters are shown.
+
+\startlinecorrection
+ \dontleavehmode
+ \scale[height=3cm]{\getbuffer[1]}%
+ \quad\quad\quad\quad
+ \scale[height=3cm]{\getbuffer[2]}
+\stoplinecorrection
+
+It is not hard to imagine that a collection of such graphics could be made into a
+font (at runtime). One only needs to find the motivation. Of course one can
+always use a font editor (or Inkscape) and tweak there, which probably makes more
+sense, but sometimes a bit of \METAPOST\ hackery is a nice distraction. Editing
+the \SVG\ code directly is not that much fun. The overall structure often doesn't
+look that bad (apart from often rather redundant grouping):
+
+\starttyping[option=XML]
+<svg xmlns="http://www.w3.org/2000/svg">
+ <path fill="#d87512" d="..."/>
+ <g fill="#bc600d">
+ <path d="..."/>
+ </g>
+ <g fill="#d87512">
+ <path d="..."/>
+ <path d="..."/>
+ </g>
+ <g fill="#bc600d">
+ <path d="..."/>
+ </g>
+ ...
+</svg>
+\stoptyping
+
+In addition to \type {path}s there can be \type {line}, \type {circle} and
+similar elements but often fonts just use the \type {path} element. This element
+has a \type {d} attribute that holds a sequence of one character commands that
+each can be followed by numbers. Here are the start characters of four such
+attributes:
+
+\starttyping
+M11.585 43.742s.387 1.248.104 3.05c0 0 2.045-.466 1.898-2.27 ...
+M53.33 39.37c0-4.484-35.622-4.484-35.622 0 0 10.16.05 ...
+M42.645 56.04c1.688 2.02 9.275.043 10.504-2.28 5.01-9.482-.006 ...
+M54.2 41.496s-.336 4.246-4.657 9.573c0 0 4.38-1.7 5.808-4.3 ...
+\stoptyping
+
+Indeed, numbers can be pasted together, also with the operators, which doesn't
+help with seeing at a glance what happens. Probably the best reference can be
+found at \typ {https://developer.mozilla.org/en-US/docs/Web/SVG} where it is
+explained that a path can have move, line, curve, arc and other operators, as
+well use absolute and relative coordinates. How that works is for another
+article.
+
+How would the \TEX\ world look like today if Don Knuth had made \METAFONT\
+support colors? Of course one can argue that it is a bitmap font generator, but
+in our case using high resolution bitmaps might even work out better. In the
+example above the first text fragment uses a font that is very inefficient: it
+overlays many circles in different colors with slight displacements. Here a
+bitmap font would not only give similar effects but probably also be more
+efficient in terms of storage as well as rendering. The \METAPOST\ successor does
+support color and with \MPLIB\ in \LUATEX\ we can keep up quite well \unknown\ as
+hopefully has been demonstrated here.
+
+
+% It's no fun messing with these things that survive only for short time before
+% being replaced by the next hyped fashion. Typical work than one needs to be paid
+% for but never is.
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-introduction.tex
new file mode 100644
index 00000000000..d5bfbdad760
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-introduction.tex
@@ -0,0 +1,38 @@
+% language=us
+
+\startcomponent evenmore-introduction
+
+\environment evenmore-style
+
+\startchapter[title={Introduction}]
+
+After five collections of \quote {articles} about the development of \LUATEX,
+\CONTEXT\ \MKIV, \LUAMETATEX\ and \CONTEXT\ \LMTX, there is even more to tell so
+here is number six. Wrapping up not only serves to inform the users but for me it is
+also a way to get things right: if you cannot write it down it's no good. It forces
+me to (re)consider interfaces and also test new code but of course it comes with
+no guarantees.
+
+When writing this introduction I just finished the first chapter, about some new
+font stuff, as follow up on the (again) nice \CONTEXT\ meeting in 2019. It's
+always inspiring to meet and talk with my \TEX\ friends and see what they're
+doing. It keeps me going.
+
+Some chapters end up in user group journals first so they will be added once they
+have been published and are available. The advantage is that these are then
+copy|-|edited. Many texts, also in previous development updates, got better
+because Karl Berry checked them thoroughly for TUGboat, for which I'm grateful.
+
+Hopefully, this document serves a purpose.
+
+\blank[2*big]
+
+\startlines
+Hans Hagen
+PRAGMA ADE, Hasselt NL
+Started in October 2019
+\stoplines
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-libraries.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-libraries.tex
new file mode 100644
index 00000000000..5cca165bb35
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-libraries.tex
@@ -0,0 +1,188 @@
+% language=us
+
+\startcomponent evenmore-libraries
+
+\environment evenmore-style
+
+\startchapter[title={Libraries}]
+
+\startsection[title={Introduction}]
+
+The \LUAMETATEX\ binary comes with a couple of libraries built in. These normally
+provide enough functionality to get a \TEX\ job done. But take the case where
+need to manipulate (or convert) an image before we can include it? It would be
+nice if \CONTEXT\ does that for you so having some features in the binary that
+handle it make sense. However, given that such a conversion only happens once it
+makes more sense to just call an external program and let that deal with it. It
+is for that reason that the \CONTEXT\ code base has hardly any library related
+code: most of what one wants to do can be done by calling a program. Some callers
+are built in, others can be dealt with using the Adityas filter module. The most
+significant runtime exception is probably accessing \SQL\ databases where it
+might be more efficient to use a library call instead of calling a client. And
+even then the main reason for that interface being present is the simple fact
+that I (ab)use the engine to serve requests that need some kind of database
+access. Another example of where we need some external program is in generating
+barcodes. Here one can argue that it does make sense to do that runtime, for
+instance because they change or because one doesn't like to have dozens of cached
+barcode images on disk.
+
+In this chapter I will explain how we deal with libraries in \LUAMETATEX. Because
+libraries create a dependency an approach is chosen that tries to avoid bloating
+the source tree with additional header and source files. This is made easy by the
+fact that we don't need full blown interfaces to libraries where all methods are
+exposed. We know what we need and most of these tasks somehow relate to
+typesetting which is a limited application with known demands in terms of input,
+output and performance. We don't need to serve every possible scenario.
+
+\stopsection
+
+\startsection[title={Using \LUA\ libraries}]
+
+One approach is to use a \LUA\ library that sits between the embedded \LUA\ instance
+and the external library. Say that one does this:
+
+\starttyping
+local mylib = require("mylib")
+\stoptyping
+
+This can locate and load the file \type {mylib.lua} which implements a bunch of
+(\LUA) functions. But, it can also load a library, for instance \type
+{mylib.dll}, a binary that provides functions that themselves can call external
+ones. Often such a library is also responsible for some resource management which
+is then done via userdata objects. Such a connector library on the one hand
+refers to \LUA\ library methods (like \type {const char * str = lua_tostring (L,
+1);} for fetching a \LUA\ string variable from the argument list) and on the
+other hand to those in the external library (like passing that string \type {str}
+to a function and passing the result back to \LUA\ with \type {lua_pushstring (L,
+result);}). If we would follow that approach in \LUAMETATEX\ it means that in
+addition to the main binary (on \MSWINDOWS\ that is \type {luametatex.exe}) there
+is also an extra intermediate binary (on \MSWINDOWS\ that is \type {mylib.dll})
+plus the external library (on \MSWINDOWS\ that could be \type {foolib.dll}) which
+itself can depend on other libraries.
+
+In this approach we need to compile the extra intermediate libraries alongside
+the main \LUAMETATEX\ binary. Quite likely we then need access to the header
+files of the external libraries too. We might even decide to put the dependencies
+in our source tree. But, this is not what we like to do: it adds extra work, we
+need to keep an eye on updates and operating specific patches, we complicate the
+compilation, etc. This all contradicts the fact that we want \LUAMETATEX\ to be
+simple. There is no need to complicate the setup just because a very few users
+want to use some library. Add to this the fact that quite likely we need to
+provide a version of \LUAMETATEX\ that exposes its \LUA\ related symbols which
+makes for a larger binary. So, this approach is not really an option because
+at the same time we like to keep the binary (and memory footprint) as small
+as possible (think of running in a container or on a low energy device).
+
+\stopsection
+
+\startsection[title=A variant]
+
+There are a few issues when you use \LUA\ libraries from elsewhere. First of all,
+you need to get hold of one that matches the version of \LUA\ that you use. There
+are not that many and some only can be set up as part of a larger framework.
+Also, you can find plenty of modules that seem not to be maintained (or maybe
+they are just very stable and I'm wrong here). Also, not all platforms are
+supported equally well. Then there is the question to what extend libraries are
+to stay. What is considered to be the standard today might not be tomorrow. Even
+in the rather stable \TEX\ ecosystem we see them come and go. These are all
+reasons to avoid hard coded dependencies. Ideally we like users to be able to
+compile \LUAMETATEX\ in the future without too must hassle.
+
+A couple of years after we started the \LUATEX\ project, a solution for using
+libraries was implemented, called \SWIGLIB, because it uses the swig
+infrastructure. It was an attempt to come up with a more or less standard
+approach, a rather one|-|to|-|one mapping so that basically any library could be
+interfaced. But, probably because no one really needs libraries, it never catched
+on. In \MKIV\ we still support loading libraries made that way but in \LMTX\ that
+code has been removed.
+
+As a side note: the code that deals with this in \MKIV\ also deals with version
+specific loading. When we were playing with for instance \MYSQL\ libs we found
+out that it made sense to be able to support different \API s, but in the end,
+given the rare usage of libraries, that made no sense either. Therefore in \LMTX\
+locating libraries has version support removes and as a consequence is much
+simpler (code|-|wise).
+
+\stopsection
+
+\startsection[title=Foreign function interfaces]
+
+Then there is a \FFI\ interface, first introduced in \LUAJITTEX\ as it is part of
+\LUAJIT, and later a similar library was built|-|in \LUATEX. But \LUAJIT\ doesn't
+conceptually follow \LUA\ upgrades and its future is unsure so in \LUAMETATEX\
+there is no \JIT\ variant (the \JIT\ part was never used anyway as it only slowed
+down a run; we just used the \FFI\ part plus the fact that the restricted virtual
+machine performs better). The \FFI\ library used in \LUATEX\ also comes from
+elsewhere and it doesn't seem to be maintained any longer, so that code is to be
+kept working in the perspective of \LUATEX. Both technologies hook into the
+processor architecture and are somewhat complex so when their maintenance becomes
+unsure we have to reconsider using them. Not all hardware platforms are supported
+\footnote {As I write this only Intel works while ARM doesn't and only on
+\MSWINDOWS, \LINUX\ and \OSX\ I can compile without alignment warnings} and the
+functionality can differ in details per platform. To some extend we can keep
+using \FFI\ in \LUATEX\ because Luigi takes care of it, but who knows when it
+becomes too problematic. Does it make sense to adopt a library that needs tweaks
+depending on architectures? For now we're good for \LUATEX, so for a while we're
+also okay (in \MKIV).
+
+The nice thing about \FFI\ is that one can define the interface at runtime. Of
+course this interface has to fit the current version of the library \API, but
+that is doable. It is up to a user of a library to determine where it comes from.
+It can be put in the \TEX\ tree but also being taken from wherever the operating
+system put it in the path. Of course that can then be a bit of an issue when
+there are different versions because programs can ship their own variants, but
+when you use a library you probably are aware of that and know what you're doing.
+A drawback of \FFI\ is that it opens up the whole machinery pretty low level,
+which can be considered a risk. Some can consider that to be a security threat.
+It for these reasons that \LUAMETATEX\ doesn't provide the \FFI\ feature; users
+who depend on it can of course use \MKIV\ with \LUATEX.
+
+\stopsection
+
+\startsection[title=So how to proceed?]
+
+When a library and its \LUA\ interface are kept external the main binary has to
+be compiled in a way that permits loading libraries (read: symbols need to be
+known). When we use \FFI\ that is not needed. And when a library is internal we
+have the disadvantage that we mentioned at the start of this chapter.
+
+So, how do we combine the advantages of \FFI\ (runtime binding), external
+libraries (no need to have all that code in the code base) and internal libraries
+(no loading issues)? At some point it stroke me that we actually can do that with
+not that much effort. The solution was probably subconsciously implanted by
+noticing the fact that the \LUAMETATEX\ machinery uses function pointers in some
+places and the fact that when a \LUA\ library is loaded by \LUA\ itself, a
+specific initialization function is called to initialize it: by combining these
+concepts we can delay the binding till when a library is needed.
+
+In \LUAMETATEX\ we can therefore have some optional libraries that offer a
+minimal interface because after all we can do a lot at the \LUA\ end. Optional
+libraries register themselves in the global \type {optional} table. We're talking
+of a couple of hundred lines of \CCODE\ for a simple binding. The functions in an
+optional library table can be used (accessed) without loading the library and
+then just do nothing useful. So, before using them you need to load the third
+party library but we can safely assume that the \LUA\ wrapper code calls an
+initializer when it needs some feature. That initializer, which by the way is
+located at the \LUA\ end, loads the external library, and when that is successful
+the needed helpers are bound by resolving function pointers. There is no
+dependency when nothing is used: the main binary stays lean and mean because the
+binding normally only adds a few \KB. Users can compile without dependencies and
+when used performance is quite okay (no \FFI\ overhead).
+
+The \LUAMETATEX\ distribution only ships a few such bindings but these can serve
+as example. What is shipped has a proper \LUA\ companion file and these are then
+the standard one used in the \CONTEXT\ distribution. Think of \MYSQL\ and
+\SQLITE\ (for databases), \ZINT\ (for barcodes), simple \CURL\ (for fetching
+stuff), \GHOSTSCRIPT\ and \GRAPHICSMAGICK\ (for some conversions) bindings . When
+compiled into \LUAMETATEX\ these will add some interfacing code to the main
+binary but that gets compensated by the removal of the \FFI\ library. The \LUA\
+interfaces provide just enough to get us going. At some point we can consider
+providing libraries as optional part of an installation because we can generate
+them using the buildbot infrastructure managed by Mojca, but the core
+distribution (source code) is kept clean.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-normalization.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-normalization.tex
new file mode 100644
index 00000000000..36d4390aaff
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-normalization.tex
@@ -0,0 +1,239 @@
+% language=us
+
+% \enabletrackers[nodes.directions]
+
+\environment evenmore-style
+
+\startcomponent evenmore-normalization
+
+\startchapter[title=Normalization]
+
+What I describe here was long due. I delayed it because when enabled it had best
+also be used and I need to (check and) adapt some code to it in order to profit
+from it. So, if used at all, it will take some time to have an effect on the
+\CONTEXT\ code base. But first some background information.
+
+When \TEX\ builds a paragraph it splits the current text stream (that makes up
+the paragraph) into lines where each line becomes an horizontal box. In \LUATEX,
+this process is split into distinctive steps, contrary to regular \TEX\ where the
+splitting is combined with hyphenation, ligature construction and font kerning.
+But what all engines have in common is that after the decision is made about what
+a line is, the result gets packages into the horizontal box.
+
+The decision making is influenced by quite some factors, like:
+
+\startitemize[packed]
+\startitem
+ The indentation of the first line, driven by the presence of a box of
+ with a certain width and no height and depth (its always there, also when
+ the indentation is zero).
+\stopitem
+\startitem
+ Hanging indentation, which can happen at each corner of the paragraph, or
+ alternatively a specific parshape.
+\stopitem
+\startitem
+ Left and|/|or right margins, aka left skip and right skip. A right skip is
+ always present, even when zero.
+\stopitem
+\startitem
+ The way the last line gets aligns, aka parfill skip.
+\stopitem
+\startitem
+ Directional changes that need to be carries over to the next line.
+\stopitem
+\startitem
+ Optional protrusion of characters to the left of right of the line, something
+ that is sensitive for directional changes.
+\stopitem
+\startitem
+ Expansion of characters in order to get better inter|-|word spacing and|/|or
+ to prevent lines being too bad. There can be stretch as well as shrink but
+ on a per line basis. Inter|-|character kerns can also get that treatment.
+\stopitem
+\startitem
+ The penalties associated to hyphenation: the pre|-|last line, the last two
+ lines, a list of penalties (\ETEX), specific penalties bound to hyphenation
+ pints (\LUATEX).
+\stopitem
+\startitem
+ The wish to have more or less lines than optimal, aka looseness. I have to
+ admit that I never use that feature.
+\stopitem
+\stopitemize
+
+In traditional \TEX\ it doesn't really matter how the resulting boxes look like,
+as long as the following steps can handle them, and those steps don't look into
+those boxes. In fact, unless you unpack a box, only the backend deals with the
+content. But in \LUATEX\ we have callbacks that hook into several stages and {\em
+can} look into the constructed boxes. In \LUATEX\ these boxes also have embedded
+directional information (needed by the backend) and (although that is seldom
+used) left or right boxed material, a features inherited from \ALEPH|/|\OMEGA.
+And when messing around with the content of boxes one has to know what can be
+seen there. In principle the code can be reorganized a it but adding additional
+functionality is not that trivial because we want to stay close to the original
+implementation, even if it has been messed up a bit by successive additions.
+Eventually I might give it a try to integrate all these features a bit better,
+but on the other hand: it works.
+
+\starttexdefinition Sample #1#2
+ \startluacode
+ document.normalizestate = nodes.getnormalizeline()
+ nodes.setnormalizeline(#1)
+ \stopluacode
+ \startsubsubject[title={normalization #1, #2}]
+ \typebuffer[#2]
+ \startlinecorrection
+ \forgetall
+ \start
+ \setupalign[verytolerant,stretch]
+ \showmakeup[line,hbox,vbox,glue]
+ \vbox{\getbuffer[#2]\samplefile{sapolsky}}
+ \stop
+ \par
+ \stoplinecorrection
+ \stopsubject
+ \startluacode
+ nodes.setnormalizeline(document.normalizestate)
+ \stopluacode
+\stoptexdefinition
+
+\startbuffer[sample-1]
+ \parindent = 20pt
+ \leftskip = 40pt
+ \rightskip = 50pt
+ \hangindent = 0pt
+ \hangafter = 0
+\stopbuffer
+
+\startbuffer[sample-2]
+ \parindent = 0pt
+ \leftskip = 0pt
+ \rightskip = 0pt
+ \hangindent =-20pt
+ \hangafter = -3
+\stopbuffer
+
+\startbuffer[sample-3]
+ \parindent = 0pt
+ \leftskip = 0pt
+ \rightskip = 0pt
+ \hangindent = 20pt
+ \hangafter = 3
+\stopbuffer
+
+\startbuffer[sample-4]
+ \parindent = 0pt
+ \leftskip = 10pt
+ \rightskip = 30pt
+ \hangindent = 20pt
+ \hangafter = 3
+\stopbuffer
+
+In the next examples we show how the result of typesetting a paragraph looks
+like. We use the Sapolsky quote from the distribution. The cyan glue nodes are
+the left and right skip nodes, and the gray one at the end of the last line
+represents the parfill skip. The magenta ones at the edge are baseline skips. An
+indentation is shown in gray too. As experiment we have four normalization levels
+but in the end only the highest level makes sense, simply because normalization
+makes no sense unless one consistently normalizes all. We just keep the
+granularity because it makes it possible to explain what gets done.
+
+\texdefinition{Sample}{0}{sample-1}
+\texdefinition{Sample}{0}{sample-2}
+\texdefinition{Sample}{0}{sample-3}
+\texdefinition{Sample}{0}{sample-4}
+
+You might have noticed that the right skip is always there but the left skip is
+absent when it is zero. As said, as long as the result is okay, it does not
+really matter. But \unknown\ in \LUATEX\ (and therefore \CONTEXT) it can have
+consequences because there we can kick in a callback that does something with
+lines. Such a callback often has to deal with these specific glues and them being
+optional makes for more testing. The more predictable the order is, the better.
+Although we can easily normalize lines (in a callback) to always have a left skip
+too it is also an option in the engine.
+
+\texdefinition{Sample}{1}{sample-1}
+\texdefinition{Sample}{1}{sample-2}
+\texdefinition{Sample}{1}{sample-3}
+\texdefinition{Sample}{1}{sample-4}
+
+In the previous examples there are always left skips as well as right skips. It
+makes no sense to have an option to omit both zero left and right skips, because
+that again is unpredictable. But we can go further.
+
+\texdefinition{Sample}{2}{sample-1}
+\texdefinition{Sample}{2}{sample-2}
+\texdefinition{Sample}{2}{sample-3}
+\texdefinition{Sample}{2}{sample-4}
+
+In these examples the indentation has been turned into a glue as well (actually
+it is more a kern but using a glue makes more sense). The hanging indentation
+however is not seen here: it is not represented by glue but instead sort of
+hidden in the width of the box and a shift of its content.
+
+\texdefinition{Sample}{3}{sample-1}
+\texdefinition{Sample}{3}{sample-2}
+\texdefinition{Sample}{3}{sample-3}
+\texdefinition{Sample}{3}{sample-4}
+
+In the previous examples the hanging indentation is turned into left and right
+hang skips. These cannot be set at the \TEX\ end, but are injected when we
+instruct the normalizer to do so.
+
+\texdefinition{Sample}{4}{sample-1}
+\texdefinition{Sample}{4}{sample-2}
+\texdefinition{Sample}{4}{sample-3}
+\texdefinition{Sample}{4}{sample-4}
+
+The previous examples differ from the previous set in that they push these hang
+related glue nodes before the left and after the right skip. As I couldn't make
+up my mind yet, I let \LUAMETATEX\ just provide both variants.
+
+The option to keep hang related information explicitly in the line has some
+consequences. First of all, we now have glue and not some shift|/|width
+combination. Second, we have introduced an incompatibility: the lines now always
+have the proper width. You might have noticed that but we can show it more
+explicitly. We use two parameter sets
+
+\startbuffer[sample-5]
+ \hangindent = 20pt
+ \hangafter = 0
+\stopbuffer
+
+\startbuffer[sample-6]
+ \hangindent =-20pt
+ \hangafter = 0
+\stopbuffer
+
+\Sample{0}{sample-5}
+\Sample{4}{sample-5}
+
+\Sample{0}{sample-6}
+\Sample{4}{sample-6}
+
+A not yet mention part of the normalization is that, because they are no longer
+of relevance, the special local par nodes have been removed. The one that starts
+a paragraph is turned into a normal directional node if needed, so that we get
+properly balanced pairs of directional nodes. It must been said that the code
+that does all this is a bit of a mess. We want to stay close to the original
+code, but we also need to deal with all these extensions, like directions,
+protrusion, extra boxes, etc.
+
+Not shown here is that there is a fifth mode of operation. When we enable that
+level an overfull box will get a correction skip so that the right skip etc are
+properly aligned. How useful this is: we'll see.
+
+Now, when I decide to keep this feature, which can be set at the \LUA\ end to do
+the previously mentioned tasks, depending on a feature level ranging from zero to
+four, I also need to check the impact on existing \CONTEXT\ code, which
+(currently) is complicated by the fact that most is shared between \MKIV\ and
+\LMTX, and only \LUAMETATEX\ has this normalization feature. I will probably
+enable it for a while locally in order to see if there are side effects. Then,
+when the code base gets adapted, we have to assume that normalization happens, so
+there is no way back.
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-pi.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-pi.tex
new file mode 100644
index 00000000000..197e8682699
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-pi.tex
@@ -0,0 +1,134 @@
+% language=us
+
+\environment evenmore-style
+
+% This appeared in TB 126, thanks to Karl Berry for fixing the English.
+
+\startcomponent evenmore-pi
+
+\startchapter[title=\TEX\ and Pi]
+
+This is a short status report \footnote {This chapter appeared in \TUGBOAT\ 40:3.
+Thanks to Karl Berry for corrections.} on Pi, not the famous version number of
+\TEX\ (among other things), but the small machine, meant for education but
+nowadays also used for Internet Of Things projects, process control and toy
+projects. While the majority of \TEX\ installations run on an Intel processor,
+the Raspberry Pi has an \ARM\ central processing unit. In fact, its main chip has
+the same foundation as those found in settop boxes all around the world. It's
+made for entertainment, not for number crunching.
+
+At the \CONTEXT\ meetings, it has become tradition to play with electronic
+gadgets. Every year we are curious what Harald K\"onig might bring this time. The
+last couple of meetings we also had talks about using \TEX\ and \METAPOST\ for
+designing (home|-|scale, automated) railroad systems, using \LUATEX\ for running
+domotica applications, using \METAPOST\ for rendering high quality graphics from
+data from appliances, presenting \TEX\ at computer and electronics bootcamps, and
+more. This year Frans Goddijn also brought back memories of low speed modem
+sounds, from the early days of \TEX\ support. It is these things that make the
+meetings fun.
+
+This year the meeting was in Belgium, close to the border of the Netherlands, and
+on the way there Mojca Miklavec traveled via my home, where the contextgarden
+compile farm runs on a server with plenty of cores, lots of memory and big disks.
+But the farm also has an old Mac connected as well as a tiny underpowered
+Raspberry Pi 2 for \ARM\ binaries that we had to fix: the small micro \SSD\ card
+in it had finally given up. This is no surprise if you realize that it does a
+daily compilation of the whole \TEX\ Live setup and also compiles \LUATEX,
+\LUAMETATEX\ and pplib when changes occur. Replacing the card worked out but
+nevertheless we decided to take the small machine with us to the meeting. We also
+took an external (2.5 inch) \SSD\ box with us. The idea was to order a Raspberry
+Pi~4 on location, the much praised successor of the older models, the one with
+4~\GB\ of memory, real \USB~3 ports and proper Ethernet.
+
+At the meeting Harald showed us that he had version~1, 3 and~4 machines with him
+because he was looking into an energy control setup based on Zigbee devices. So
+we had the full range of Pi's there to play with.
+
+This is a long introduction but the message is that we are dealing with a small
+but popular device with up to now four generations, using an architecture
+supported in \TEX\ distributions. So how does that relate to \CONTEXT ? One of
+the reasons for \LUAMETATEX\ going lean and mean is that computers are no longer
+getting much faster and \quote {multiple small} energy|-|wise has more appeal
+than \quote {one large}. So then the question is: how can we make \TEX\ run fast
+on small instead of gambling on big becoming even bigger (which does not seem to
+be happening anyway).
+
+At the meeting Harald gave a talk \quotation {Which Raspberry Pi is the best for
+\CONTEXT ?} and I will use his data to give an overview: see Table~\ref{rpispec}.
+
+\starttabulate[||c|c|c|c|]
+\BC model \BC 1 \BC 2 \BC 3 \BC 4 \NC \NR
+\BC chipset \NC BCM2835 \NC BCM2835 \NC BCM2835 \NC BCM2835 \NC \NR
+\BC CPU core \NC v6l rev 7 \NC v7l rev 5 \NC v7l rev 4 \NC v7l rev 3 \NC \NR
+\BC cores \NC 1 \NC 4 \NC 4 \NC 4 \NC \NR
+\BC free mem \NC 443080 \NC 948308 \NC 948304 \NC 3999784 \NC \NR
+\BC idlemips \NC 997.08 \NC 38.40 \NC 38.40 \NC 108.00 \NC \NR
+\BC bogomips \NC 997.08 \NC 57.60 \NC 76.80 \NC 270.00 \NC \NR
+\BC read SD \NC 23.0 MB/s \NC 23.2 MB/s \NC 23.2 MB/s \NC 45.1 MB/s \NC \NR
+\BC read USB \NC \NC 30.0 MB/s \NC 30.0 MB/s \NC 320.0 MB/s \NC \NR
+\stoptabulate
+
+After some discussion at the presentation we decided to discard the (absurd)
+bogomips value for the tiny Pi~1 computing board and not take the values for the
+others too seriously. But it will be clear that, especially when we consider the
+external drive that things have improved. The table doesn't mention Ethernet
+speed but because the~4 now has real support for it (instead of sharing the \USB\
+bus) we get close to 1~\GB/s there.
+
+The real performance test is of course processing a \TEX\ document and what
+better to test than the \TEX\ book. The processing time in seconds, after initial
+caching of files and fonts is:
+
+\starttabulate[||c|c|c|c|]
+\BC model \BC 1 \BC 2 \BC 3 \BC 4 \NC \NR
+\BC \TEX book \NC 13.649 \NC 7.023 \NC 4.553 \NC 1.694 \NC \NR
+\BC {\tt context --make} \NC \NC 19.949 \NC 11.796 \NC 6.034 \NC \NR
+\BC {\tt context --make} TL \NC 89.454 \NC 46.578 \NC 29.256 \NC 14.146 \NC \NR
+\stoptabulate
+
+The test of making the \CONTEXT\ format using \LUATEX\ gives an indication of how
+well the \IO\ performs: it loads the file database, some 460 \LUA\ modules and
+355 \TEX\ source files. On my laptop with Intel i7-3840QM with 16GB memory and
+decent \SSD\ it takes 3.5 seconds (and 1 second less for \LUAMETATEX\ because
+there we don't compress the format file). Somehow a regular \TEXLIVE\
+installation performs much worse than the one from the contextgarden.
+
+We didn't test real \CONTEXT\ documents at the meeting but when I came home the
+Pi~4 was bound again to the compile farm. Harald and Mojca had prepared the
+machine to boot from the internal micro \SSD\ and use the external disk for the
+rest. So, when we could compile \LUAMETATEX\ again, I made an \ARM\ installer for
+\LMTX, and after that could not resist doing a simple test. First of course came
+generating the format. It took 6.3 seconds to make one, which is a bit more than
+Harald measured. I see a hiccup at the end so I guess that it has to do with the
+(external) disk or maybe there is some throttling going on because the machine
+sits on top of a (warm) server.
+
+More interesting was testing a real document: the upcoming \LUAMETATEX\ manual.
+It has 226 pages, uses 21 font files, processes 225 \METAPOST\ graphics, and in
+order to get it \LUAMETATEX\ does more than 50\% of the work in \LUA, including
+all font and backend|-|related operations. On my laptop it needs 9.5~seconds and
+on the Pi~4 it uses 33~seconds. Of course, if I take a more modern machine than
+this 8|-|year|-|old workhorse, I probably need half the time, but still the
+performance of the Raspberry Pi~4 is quite impressive. It uses hardly any energy
+and can probably compete rather well with a virtual machine on a heavily loaded
+machine. It means that when we ever have to upgrade the server, I can consider
+replacement by an Ethernet switch, with power over Ethernet, connected to a bunch
+of small Raspberries, also because normally one would connect to some shared
+storage medium.
+
+Because I was curious how the dedicated small Fitlet that I use for controlling
+my lights and heating performs I also processed the manual there. After making
+the format, which takes 6~seconds, processing the manual took a little less than
+30~seconds. In that respect it performs the same as a Raspberry Pi~4. But, inside
+that small (way more expensive) computer is an dual core AMD A10 Micro-6700T APU
+(with AMD Radeon R6 Graphics), running a recent 64|-|bit Ubuntu. It does some
+2400 bogomips (compare that to the values of the Pi). I was a bit surprised that
+it didn't outperform the Raspberry because the (fast \SSD) disk is connected to
+the main board and it has more memory and horsepower. It might be that in the end
+an \ARM\ processor is simply better suited for the kind of byte juggling that
+\TEX\ does, where special \CPU\ features and multiple cores don't contribute
+much. It definitely demonstrates that we cannot neglect this platform.
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-style.tex
new file mode 100644
index 00000000000..07168e57c6a
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-style.tex
@@ -0,0 +1,67 @@
+% \enablelmtx
+% \nopdfcompression
+
+\startenvironment evenmore-style
+
+\usemodule[abbreviations-smallcaps]
+\usemodule[scite]
+
+\logo [LUAMETATEX] {LuaMeta\TeXsuffix}
+
+\setupbodyfont[plex,10pt] % not that ok for titling
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ header=0pt,
+ footer=1cm,
+ footerdistance=5mm,
+ backspace=2cm,
+ cutspace=15mm,
+ topspace=2cm,
+ bottomspace=1cm,
+ style=bold,
+ color=maincolor]
+
+\setuppagenumbering
+ [alternative=doublesided]
+
+\setupwhitespace
+ [big]
+
+\setupfootertexts
+ [][{\getmarking[chapter]\quad\pagenumber}]
+ [{\pagenumber\quad\getmarking[chapter]}][]
+
+\definecolor
+ [maincolor]
+ [darkgray]
+
+\setuphead
+ [chapter]
+ [style=\bfc,
+ color=maincolor]
+
+\setuphead
+ [section]
+ [style=\bfa,
+ color=maincolor]
+
+\setuphead
+ [subsection]
+ [style=\bf,
+ color=maincolor]
+
+\setupalign
+ [tolerant,stretch]
+
+\setuptyping
+ [color=maincolor]
+
+\setuptype
+ [color=maincolor]
+
+\setupitemize
+ [color=maincolor]
+
+\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-threesix.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-threesix.tex
new file mode 100644
index 00000000000..d75f9b68396
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-threesix.tex
@@ -0,0 +1,739 @@
+% language=us
+
+\environment evenmore-style
+
+\useMPlibrary[threesix]
+
+\startcomponent evenmore-threesix
+
+\startchapter[title={ThreeSix, Don Knuths first colorfont?}]
+
+In the process of reaching completion and perfection Don Knuth occasionally posts
+links to upcoming parts of the TAOCP series on his web pages. Now, I admit that
+much is way beyond me but I do understand (and like) the graphics and I know that
+Don uses \METAPOST. The next example code is just a proof of concept but might
+eventually become a decent module (with helpers) for making (runtime) fonts.
+After all, we need to adapt to current developments and \TEX ies always are
+willing to adapt and experiment. This chapter was written at the same time as
+the previous one on \TYPETHREE\ fonts so you might want to read that first.
+
+The font explored here is \type {FONT36}, used in \quotation {A potpourri of
+puzzles} and flagged as \quotation {a special font designed for dissection
+puzzles} (in fascicle 9b for Volume 4). Playing with and visualizing for me often
+works better than formulas, which then distracts me from the original purpose,
+but let's have a closer look anyway.
+
+\startlinecorrection
+ \scale[width=\textwidth]{\DEKFontA 1234567890} \vskip1ex
+ \scale[width=\textwidth]{\DEKFontA ABC{\red DE}FGHIJ{\red K}LM} \vskip1ex
+ \scale[width=\textwidth]{\DEKFontA NOPQRSTUVWXYZ}
+\stoplinecorrection
+
+The font has a fixed maximum height of 8~quantities. There is no depth in the
+characters. Some characters are wider. In this example we use a tight bounding
+box. In \CONTEXT\ speak this font is just a regular font but with a special
+feature enabled.
+
+\starttyping
+\definefontfeature
+ [fontthreesix]
+ [default]
+ [metapost=fontthreesix]
+
+\definefont[DEKFontA][Serif*fontthreesix]
+\stoptyping
+
+After this the \type {\DEKFontA} command will set this font as current font. The
+definition mentions \type {Serif} as font name. In \CONTEXT\ this name will
+resolve in the currently defined Serif, so when your document uses Latin Modern
+that will be the one. The \type {fontthreesix} will make this instance use that
+feature set, and the feature definition has the defaults as parent (so we get
+kerning, ligatures, etc.) but as extra feature also \type {metapost}. This means
+that the new glyphs that are about to be defined will actually be injected in the
+\type {Serif}! We will replace characters in that instance. So, the following:
+
+\startbuffer[taocp]
+This font is used in \quotation {The Art Of Computer Programming} by
+Don Knuth, not in volume~1, 2 or~3, but in number~4!
+\stopbuffer
+
+\typebuffer[taocp]
+
+comes out as:
+
+\startnarrower
+\DEKFontA \getbuffer[taocp]
+\stopnarrower
+
+But that doesn't look too good, so we will tweak the font a bit:
+
+\starttyping
+\definefontfeature
+ [fontthreesix-color]
+ [default]
+ [metapost={category=fontthreesix,spread=.1}]
+
+\definefont[DEKFontD][Serif*fontthreesix]
+\stoptyping
+
+The \type {spread} (multiplied by the font unit, which is 12 basepoints here)
+will add a bit more spacing around the blob:
+
+\startnarrower
+\DEKFontD \getbuffer[taocp]
+\stopnarrower
+
+Now, keep in mind that we're talking of a real font here. You can cut and paste
+these characters. It's just the default uppercase Latin alphabet plus digits.
+
+Before we go and look at some of the code needed to render this, a few more
+examples will be given.
+
+\startlinecorrection
+ \scale[width=\textwidth]{\DEKFontB 1234567890} \vskip4pt
+ \scale[width=\textwidth]{\DEKFontB ABCDEFGHIJKLM} \vskip4pt
+ \scale[width=\textwidth]{\DEKFontB NOPQRSTUVWXYZ}
+\stoplinecorrection
+
+In the above example we not only use color, but also a different shape and random
+colors (that is: random per \TEX\ job). The feature definition for this is:
+
+\starttyping
+\definefontfeature
+ [fontthreesix-color]
+ [default]
+ [metapost={%
+ category=fontthreesix,shape=diamond,%
+ color=random,pen=fancy,spread=.1%
+ }]
+\stoptyping
+
+Possible shapes are \type {circle}, \type {diamond} and \type {square} and
+instead of a random color one can give a known color name. Using transparency
+makes no sense in this font.
+
+A nice usage for this font are initials: % 4 for lm
+
+\startbuffer
+\setupinitial[font=Serif*fontthreesix-initial sa 5]
+{\DEKFontB \placeinitial \input zapf\par}
+\stopbuffer
+
+\typebuffer
+
+The initial feature is defined as:
+
+\starttyping
+\definefontfeature
+ [fontthreesix-initial]
+ [metapost={category=fontthreesix,color=random,shape=circle}]
+\stoptyping
+
+We use this in quoting Hermann Zapf, one that for sure is very applicable in
+a case like this:
+
+\startnarrower
+\getbuffer
+\stopnarrower
+
+Some combinations of sub|-|features are shown in \in {figure} [threesix:dek]. We
+blow up the diamond with fancy pen example in \in {figure} [threesix:tex]. Alas,
+the \TEX\ logo doesn't look that good in such a font. Using it for acronyms is
+not a good idea anyway, but maybe you can figure out \in {figure}
+[threesix:taocp].
+
+% todo penx peny penr
+
+\definefontfeature
+ [fontthreesix-circle]
+ [metapost={category=fontthreesix,shape=circle,color=random}]
+\definefontfeature
+ [fontthreesix-square]
+ [metapost={category=fontthreesix,shape=square,color=random}]
+\definefontfeature
+ [fontthreesix-diamond]
+ [metapost={category=fontthreesix,shape=diamond,color=random}]
+\definefontfeature
+ [fontthreesix-circle-pen]
+ [metapost={category=fontthreesix,shape=circle,color=random,pen=fancy}]
+\definefontfeature
+ [fontthreesix-square-pen]
+ [metapost={category=fontthreesix,shape=square,color=random,pen=fancy}]
+\definefontfeature
+ [fontthreesix-diamond-pen]
+ [metapost={category=fontthreesix,shape=diamond,color=random,pen=fancy}]
+\definefontfeature
+ [fontthreesix-circle-random]
+ [metapost={category=fontthreesix,random=yes,shape=circle,color=random}]
+\definefontfeature
+ [fontthreesix-square-random]
+ [metapost={category=fontthreesix,random=yes,shape=square,color=random}]
+\definefontfeature
+ [fontthreesix-diamond-random]
+ [metapost={category=fontthreesix,random=yes,shape=diamond,color=random}]
+
+\definefontfeature
+ [fontthreesix-circle-random-spread]
+ [metapost={category=fontthreesix,random=yes,shape=circle,color=random,spread=.1}]
+
+\startplacefigure[reference=threesix:dek]
+ \startcombination[3*3]
+ {\scale[width=.3\textwidth]{\definedfont [Serif*fontthreesix-circle]D\kern1pt E\kern 1ptK}} {\type{shape=circle}}
+ {\scale[width=.3\textwidth]{\definedfont [Serif*fontthreesix-square]D\kern1pt E\kern 1ptK}} {\type{shape=square}}
+ {\scale[width=.3\textwidth]{\definedfont [Serif*fontthreesix-diamond]D\kern1pt E\kern 1ptK}} {\type{shape=diamond}}
+ {\scale[width=.3\textwidth]{\definedfont [Serif*fontthreesix-circle-pen]D\kern1pt E\kern 1ptK}} {\type{shape=circle,pen=fancy}}
+ {\scale[width=.3\textwidth]{\definedfont [Serif*fontthreesix-square-pen]D\kern1pt E\kern 1ptK}} {\type{shape=square,pen=fancy}}
+ {\scale[width=.3\textwidth]{\definedfont [Serif*fontthreesix-diamond-pen]D\kern1pt E\kern 1ptK}} {\type{shape=diamond,pen=fancy}}
+ {\scale[width=.3\textwidth]{\definedfont [Serif*fontthreesix-circle-random]D\kern1pt E\kern 1ptK}} {\type{shape=circle,random=yes}}
+ {\scale[width=.3\textwidth]{\definedfont [Serif*fontthreesix-square-random]D\kern1pt E\kern 1ptK}} {\type{shape=square,random=yes}}
+ {\scale[width=.3\textwidth]{\definedfont[Serif*fontthreesix-diamond-random]D\kern1pt E\kern 1ptK}} {\type{shape=diamond,random=yes}}
+ \stopcombination
+\stopplacefigure
+
+\startplacefigure[reference=threesix:tex]
+\scale[width=\textwidth]{\definedfont[Serif*fontthreesix-diamond-pen]T\lower.5ex\hbox spread .1em{\hss E\hss}X}
+\stopplacefigure
+
+\startplacefigure[reference=threesix:taocp]
+\scale[width=\textwidth]{\definedfont[Serif*fontthreesix-circle-random-spread]TAOCP}
+\stopplacefigure
+
+You can quit reading now or expose yourself to how this is coded. We use a
+combination of \LUA\ and \METAPOST, but different solutions are possible. The
+shapes are entered (or course) with zeros and ones.
+
+\starttyping
+\startluacode
+local font36 = {
+ ["0"] = "00111100 01111110 11000011 11000011 11000011 ...",
+ ["1"] = "00011100 11111100 11101100 00001100 00001100 ...",
+ .....
+ ["D"] = "11111100 11100010 01100011 01100011 01100011 ...",
+ ["E"] = "1111111 1110001 0110101 0111100 0110100 0110001 ...",
+ .....
+ ["K"] = "11101110 11100100 01101000 01110000 01111000 ...",
+ .....
+}
+\stopluacode
+\stoptyping
+
+We also use \LUA\ to register this font. The actual code looks slightly different
+because it uses some helpers from the \CONTEXT\ \LUA\ libraries. We remap the
+bits pattern onto \METAPOST\ macro calls.
+
+\starttyping
+\startluacode
+local replace = {
+ ["0"] = "N;",
+ ["1"] = "Y;",
+ [" "] = "L;",
+}
+
+function MP.registerthreesix(name)
+ fonts.dropins.registerglyphs {
+ name = name,
+ units = 12,
+ usecolor = true,
+ }
+ for u, v in table.sortedhash(font36) do
+ local ny = 8
+ local nx = (#v - ny + 1) // ny
+ local height = ny * 1.1 - 0.1
+ local width = nx * 1.1 - 0.1
+ local code = string.gsub(v,".",replace)
+ fonts.dropins.registerglyph {
+ category = name,
+ unicode = utf.byte(u),
+ width = width,
+ height = height,
+ code = string.format("ThreeSix(%s);",code),
+ }
+ end
+end
+
+MP.registerthreesix("fontthreesix")
+\stopluacode
+\stoptyping
+
+So, after this the font \type {fontthreesix} is known to the system but we still
+need to provide \METAPOST\ code to generate it. The glyphs themselves are now
+just sequences of \type {N}, \type {Y} and \type {L} with some wrapper code
+around it. The definitions are put in the \type {MP} namespace simply because a
+first version initialized in \METAPOST, and there could create variants, but in
+the end I settled on the parameter interface at the \TEX\ end.
+
+The next definition looks a bit complex but normally such a macro is
+stepwise constructed. Notice how we can query the sub features. In order to make
+that possible the regular \METAFUN\ parameter handling code is used. We just push
+the sub|-|features into to \type {mpsfont} namespace.
+
+\starttyping
+\startMPcalculation{simplefun}
+
+def InitializeThreeSix =
+ save Y, N, L, S ; save dx, dy, nx, ny ; save currentpen ;
+ save shape, fillcolor, mypen, random, spread, hoffset ;
+ string shape, fillcolor, mypen ; boolean random ;
+ pen currentpen ;
+ dx := 11/10 ;
+ dy := - 11/10 ;
+ nx := - dx ;
+ ny := 0 ;
+ shape := getparameterdefault "mpsfont" "shape" "circle" ;
+ random := hasoption "mpsfont" "random" "true" ;
+ fillcolor := getparameterdefault "mpsfont" "color" "" ;
+ mypen := getparameterdefault "mpsfont" "pen" "" ;
+ spread := getparameterdefault "mpsfont" "spread" 0 ;
+ hoffset := 12 * spread / 2 ;
+ currentpen := pencircle
+ if mypen = "fancy" :
+ xscaled 1/20 yscaled 2/20 rotated 45
+ else :
+ scaled 1/20
+ fi ;
+ if shape == "square" :
+ def S =
+ unitsquare if random : randomized 1/10 fi
+ shifted (nx,ny)
+ enddef ;
+ elseif shape = "diamond" :
+ def S =
+ unitdiamond if random : randomized 1/10 fi
+ shifted (nx,ny)
+ enddef ;
+ else :
+ def S =
+ unitcircle if random : randomizedcontrols 1/20 fi
+ shifted (nx,ny)
+ enddef ;
+ fi ;
+ def N =
+ nx := nx + dx ;
+ draw S ;
+ enddef ;
+ if fillcolor = "random" :
+ def Y =
+ nx := nx + dx ;
+ fillup S withcolor white randomized (2/3,2/3,2/3) ;
+ enddef ;
+ elseif fillcolor = "" :
+ def Y =
+ nx := nx + dx ;
+ fillup S ;
+ enddef ;
+ else :
+ def Y =
+ nx := nx + dx ;
+ fillup S withcolor fillcolor ;
+ enddef ;
+ fi ;
+ def L =
+ nx := - dx ;
+ ny := ny + dy ;
+ enddef ;
+enddef ;
+
+vardef ThreeSix (text code) =
+ InitializeThreeSix ; % todo: once per instance run
+ draw image (code) shifted (hoffset,-ny) ;
+enddef ;
+
+\stopMPcalculation
+\stoptyping
+
+This code is not that efficient in the sense that there's quite some
+\METAPOST|-|\LUA|-|\METAPOST\ traffic going on, for instance each parameter check
+involves this, but in practice performance is quite okay, certainly for such a
+small font. There will be an initializer option some day soon. The \type
+{simplefun} is a reference to an \MPLIB\ instance that does load \METAFUN\ but
+only the modules that make no sense for this kind of usage. It also enforces
+double mode. The calculations wrapper just executes the code and does not place
+some (otherwise empty) graphic.
+
+% After playing with the font I see the beauty of the descriptions in the
+% pre|-|fascicle 9b but I still feel pretty stupid. Lucky for me there are
+% exercises like 999, tagged as \quote {for dummies}, so I'm not alone.
+
+Those who have seen (and|/|or read) \quotation {Concrete Mathematics} will have
+noticed the use of inline images, like dice. Dice are also used in \quotation
+{pre-fascicle 5a} (I need a few more lives to grasp that, so I stick to the
+images for now!). So, to compensate the somewhat complex code above, I will show
+how to accomplish that. This time we do all in \METAPOST:
+
+\startMPcalculation{simplefun}
+
+def DiceFrame =
+ pickup pencircle scaled 1/2 ;
+ draw unitsquare scaled 8 ;
+ pickup pencircle scaled 3/2 ;
+enddef ;
+
+vardef DiceOne =
+ DiceFrame ;
+ draw (4,4) ;
+enddef ;
+vardef DiceTwoA =
+ DiceFrame ;
+ draw (2,6) ; draw (6,2) ;
+enddef ;
+vardef DiceTwoB =
+ DiceFrame ;
+ draw (6,6) ; draw (2,2) ;
+enddef ;
+vardef DiceTwo =
+ if hasoption "mpsfont" "option" "reverse" :
+ DiceTwoB
+ else :
+ DiceTwoA
+ fi ;
+enddef ;
+vardef DiceThreeA =
+ DiceFrame ;
+ draw (2,6) ; draw (4,4) ; draw (6,2) ;
+enddef ;
+vardef DiceThreeB =
+ DiceFrame ;
+ draw (6,6) ; draw (4,4) ; draw (2,2) ;
+enddef ;
+vardef DiceThree =
+ if hasoption "mpsfont" "option" "reverse" :
+ DiceThreeB
+ else :
+ DiceThreeA
+ fi ;
+enddef ;
+vardef DiceFour =
+ DiceFrame ;
+ draw (2,6) ; draw (6,6) ; draw (2,2) ; draw (6,2) ;
+enddef ;
+vardef DiceFive =
+ DiceFrame ;
+ draw (2,6) ; draw (6,6) ; draw (4,4) ; draw (2,2) ; draw (6,2) ;
+enddef ;
+vardef DiceSix =
+ DiceFrame ;
+ draw (2,6) ; draw (6,6) ; draw (2,4) ; draw (6,4) ; draw (2,2) ; draw (6,2) ;
+enddef ;
+
+vardef DiceBad =
+ pickup pencircle scaled 1/2 ;
+ draw unitsquare scaled 8 ;
+ draw (1,7) -- (7,1) ; draw (1,1) -- (7,7) ;
+enddef ;
+
+lmt_registerglyphs [
+ name = "dice",
+ units = 12,
+ width = 8,
+ height = 8,
+ depth = 0,
+ usecolor = true,
+] ;
+
+lmt_registerglyph [ category = "dice", unicode = "0x2680", code = "DiceOne;" ] ;
+lmt_registerglyph [ category = "dice", unicode = "0x2681", code = "DiceTwo;" ] ;
+lmt_registerglyph [ category = "dice", unicode = "0x2682", code = "DiceThree;" ] ;
+lmt_registerglyph [ category = "dice", unicode = "0x2683", code = "DiceFour;" ] ;
+lmt_registerglyph [ category = "dice", unicode = "0x2684", code = "DiceFive;" ] ;
+lmt_registerglyph [ category = "dice", unicode = "0x2685", code = "DiceSix;" ] ;
+
+lmt_registerglyph [ category = "dice", private = "invaliddice", code = "DiceBad;" ] ;
+
+\stopMPcalculation
+
+This is not that hard to follow. We define some shapes first. These could have
+been assigned to the \type {code} parameter directly but this is nicer. Next we
+register the font itself and after that we set glyphs. We also set the official
+\UNICODE\ slots. So, copying a dice can either result in a digit or in a
+\UNICODE\ slot for a dice. In the example below we switch to a color which
+demonstrates that our dice can be colored at the \TEX\ end. It's either that or
+coloring at the \METAPOST\ end as both demand a different kind of \TYPETHREE\
+embedding trickery.
+
+We actually predefine three features. The digits one will map regular digit in
+the input to dice. We accomplish that via a font feature:
+
+\startbuffer
+\startluacode
+fonts.handlers.otf.addfeature("dice:digits", {
+ type = "substitution",
+ order = { "dice:digits" },
+ nocheck = true,
+ data = {
+ [0x30] = "invaliddice",
+ [0x31] = 0x2680,
+ [0x32] = 0x2681,
+ [0x33] = 0x2682,
+ [0x34] = 0x2683,
+ [0x35] = 0x2684,
+ [0x36] = 0x2685,
+ [0x37] = "invaliddice",
+ [0x38] = "invaliddice",
+ [0x39] = "invaliddice",
+ },
+} )
+\stopluacode
+\stopbuffer
+
+\typebuffer \getbuffer
+
+This kind of trickery is part of the font machinery used in \CONTEXT\ and permits
+runtime adaption of fonts, so we just use the same mechanism. The \type {nocheck}
+is needed to avoid this feature not kicking in due to lack of (at the time of
+checking) yet undefined dice.
+
+\startbuffer
+\definefontfeature
+ [dice:normal]
+ [default]
+ [metapost={category=dice}]
+\definefontfeature
+ [dice:reverse]
+ [default]
+ [metapost={category=dice,option=reverse}]
+\definefontfeature
+ [dice:digits]
+ [dice:digits=yes]
+
+\definefont[DiceN] [Serif*dice:normal]
+\definefont[DiceD] [Serif*dice:normal,dice:digits]
+\definefont[DiceR] [Serif*dice:reverse,dice:digits]
+
+{\DiceD Does 1 it 4 work? And {\darkgreen 3} too?} {\DiceR And how about
+{\darkred 3} then? But 8 should sort of fail!}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+The six digits and \UNICODE\ characters come out the same:
+
+\startbuffer
+\red \DiceD \dostepwiserecurse {`1} {`6}{1}{\char#1\quad}%
+\blue \DiceN \dostepwiserecurse{"2680}{"2685}{1}{\char#1\quad}%
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection
+ \scale[width=\textwidth]{\getbuffer\unskip}
+\stoplinecorrection
+
+It is tempting to implement for instance~7 as two dice (a one to multi mapping in
+\OPENTYPE\ speak) but then one has to decide what combination is taken. One can
+also implement ligatures so that for instance 12 results in two six dice. But I
+think that's over the top and only showing \TEX\ muscles. It is anyway not that
+hard to do as we have an interface for that already.
+
+So why not do the dominos as well? Because there are so many dominos we predefine
+the shapes and then register the lot in a loop. We have horizontal and vertical
+variants. Being lazy I just made two helpers while one could have done but with
+some rotation and shifting of the horizontal one. The loop could be a macro but
+we don't save much code that way.
+
+\startbuffer
+\startMPcalculation{simplefun}
+
+picture Dominos[] ;
+
+Dominos[0] := image() ;
+Dominos[1] := image(draw(4,4);) ;
+Dominos[2] := image(draw(2,6);draw(6,2););
+Dominos[3] := image(draw(2,6);draw(4,4);draw(6,2););
+Dominos[4] := image(draw(2,6);draw(6,6);draw(2,2);draw(6,2););
+Dominos[5] := image(draw(2,6);draw(6,6);draw(4,4);draw(2,2);draw(6,2););
+Dominos[6] := image(draw(2,6);draw(4,6);draw(6,6);draw(2,2);draw(4,2);draw(6,2););
+
+lmt_registerglyphs [
+ name = "dominos",
+ units = 12,
+ width = 16,
+ height = 8,
+ depth = 0,
+ usecolor = true,
+] ;
+
+def DrawDominoH(expr a, b) =
+ draw image (
+ pickup pencircle scaled 1/2 ;
+ if (getparameterdefault "mpsfont" "color" "") = "black" :
+ fillup unitsquare xyscaled (16,8) ;
+ draw (8,.5) -- (8,7.5) withcolor white ;
+ pickup pencircle scaled 3/2 ;
+ draw Dominos[a]
+ withpen currentpen
+ withcolor white ;
+ draw Dominos[b] shifted (8,0)
+ withpen currentpen
+ withcolor white ;
+ else :
+ draw unitsquare xyscaled (16,8) ;
+ draw (8,0) -- (8,8) ;
+ pickup pencircle scaled 3/2 ;
+ draw Dominos[a]
+ withpen currentpen ;
+ draw Dominos[b] shifted (8,0)
+ withpen currentpen ;
+ fi ;
+ ) ;
+enddef ;
+
+def DrawDominoV(expr a, b) = % is H rotated and shifted
+ draw image (
+ pickup pencircle scaled 1/2 ;
+ if (getparameterdefault "mpsfont" "color" "") = "black" :
+ fillup unitsquare xyscaled (8,16) ;
+ draw (.5,8) -- (7.5,8) withcolor white ;
+ pickup pencircle scaled 3/2 ;
+ draw Dominos[a] rotatedaround(center Dominos[a],90)
+ withpen currentpen
+ withcolor white ;
+ draw Dominos[b] rotatedaround(center Dominos[b],90) shifted (0,8)
+ withpen currentpen
+ withcolor white ;
+ else :
+ draw unitsquare xyscaled (8,16) ;
+ draw (0,8) -- (8,8) ;
+ pickup pencircle scaled 3/2 ;
+ draw Dominos[a] rotatedaround(center Dominos[a],90)
+ withpen currentpen ;
+ draw Dominos[b] rotatedaround(center Dominos[b],90) shifted (0,8)
+ withpen currentpen ;
+ fi ;
+ ) ;
+enddef ;
+
+begingroup
+ save unicode ; numeric unicode ; unicode := 127025 ; % 1F031
+
+ for i=0 upto 6 :
+ for j=0 upto 6 :
+ lmt_registerglyph [
+ category = "dominos",
+ unicode = unicode,
+ code = "DrawDominoH(" & decimal i & "," & decimal j & ");",
+ width = 16,
+ height = 8,
+ ] ;
+ unicode := unicode + 1 ;
+ endfor ;
+ endfor ;
+
+ save unicode ; numeric unicode ; unicode := 127075 ;
+
+ for i=0 upto 6 :
+ for j=0 upto 6 :
+ lmt_registerglyph [
+ category = "dominos",
+ unicode = unicode,
+ code = "DrawDominoV(" & decimal i & "," & decimal j & ");",
+ width = 8,
+ height = 16,
+ ] ;
+ unicode := unicode + 1 ;
+ endfor ;
+ endfor ;
+endgroup ;
+
+\stopMPcalculation
+\stopbuffer
+
+\typebuffer \getbuffer
+
+Again we predefine a couple of features:
+
+\startbuffer
+\definefontfeature
+ [dominos:white]
+ [default]
+ [metapost={category=dominos}]
+
+\definefontfeature
+ [dominos:black]
+ [default]
+ [metapost={category=dominos,color=black}]
+
+\definefontfeature
+ [dominos:digits]
+ [dominos:digits=yes]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+This last feature is yet to be defined. We could deal with the invalid dominos
+with some substitution trickery but let's keep it simple.
+
+\startbuffer
+\startluacode
+local ligatures = { }
+local unicode = 127025
+
+for i=0x30,0x36 do
+ for j=0x30,0x36 do
+ ligatures[unicode] = { i, j }
+ unicode = unicode + 1 ;
+ end
+end
+
+fonts.handlers.otf.addfeature("dominos:digits", {
+ type = "ligature",
+ order = { "dominos:digits" },
+ nocheck = true,
+ data = ligatures,
+} )
+\stopluacode
+\stopbuffer
+
+\typebuffer \getbuffer
+
+That leaves showing an example. We define a few fonts and again we just extend
+the Serif:
+
+\startbuffer
+\definefont[DominoW][Serif*dominos:white]
+\definefont[DominoB][Serif*dominos:black]
+\definefont[DominoD][Serif*dominos:white,dominos:digits]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+The example is:
+
+\startbuffer
+\DominoW
+ \char"1F043\quad 🀱\quad
+ \char"1F052\quad 🀲\quad
+ \char"1F038\quad 🀳\quad
+ \darkgreen\char"1F049\quad \char"1F07B\quad
+\DominoB
+ \char"1F087\quad
+ \char"1F088\quad
+ \char"1F089\quad
+\DominoD
+ \darkred 12\quad56\quad64
+\stopbuffer
+
+\typebuffer
+
+Watch the ligatures in action:
+
+\startlinecorrection
+ \scale[width=\textwidth]{\getbuffer\unskip}
+\stoplinecorrection
+
+To what extent the usage of symbols like dice and dominos as characters in the
+mentioned book are responsible for them being in \UNICODE, I don't know. Now with
+all these emoji showing up one can wonder about graphics in such a standard
+anyway. But for sure, even after more than three decades, Don still makes nice
+fonts.
+
+A treasure of tiny graphics can be found in \quotation {pre-fascicle 5c} and many
+are in color! In fact, it has dominos too. It must have been a lot of fun writing
+this! I'm thinking of turning the pentominoes into a font where a \type {GPOS}
+feature can deal with the inter|-|pentomino kerning (which mighty work out okay
+for example~36. The windmill dominos also make a nice example for a font where
+ligatures will boil down to the base form and the (one or more) blades are laid
+over. It's definitely an inspiring read.
+
+\stopchapter
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-titlepage.tex
new file mode 100644
index 00000000000..57418800c4a
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-titlepage.tex
@@ -0,0 +1,45 @@
+\startcomponent evenmore-titlepage
+
+\environment evenmore-style
+
+% \usetypescriptfile[latinmodern]
+% \usetypescript[mono][latin-modern]
+% \definefont[MyFontA][LMTypewriter-Dark*none]
+% \definefont[MyFontB][LMTypewriterVarWd-Regular*default]
+
+\definefont[MyFontA][MonoBold*none]
+\definefont[MyFontB][Serif*default]
+
+\startMPpage[pagestate=stop]
+
+StartPage ;
+
+ fill Page withcolor .1 ;
+
+ numeric d ; d := PaperWidth/4 ;
+
+ numeric w ; w := d ;
+ numeric h ; h := 2d ;
+
+ draw textext.rt ("\MyFontA E") xsized d shifted (0w,PaperHeight- 36mm) withcolor "darkred" ;
+ draw textext.rt ("\MyFontA V") xsized d shifted (1w,PaperHeight- 36mm) withcolor "darkgreen" ;
+ draw textext.rt ("\MyFontA E") xsized d shifted (2w,PaperHeight- 36mm) withcolor "darkblue" ;
+ draw textext.rt ("\MyFontA N") xsized d shifted (3w,PaperHeight- 36mm) withcolor "darkorange" ;
+ draw textext.rt ("\MyFontA M") xsized d shifted (0w,PaperHeight-104mm) withcolor "darkcyan" ;
+ draw textext.rt ("\MyFontA O") xsized d shifted (1w,PaperHeight-104mm) withcolor "darkmagenta" ;
+ draw textext.rt ("\MyFontA R") xsized d shifted (2w,PaperHeight-104mm) withcolor "darkyellow" ;
+ draw textext.rt ("\MyFontA E") xsized d shifted (3w,PaperHeight-104mm) withcolor "darkgray" ;
+
+% draw textext.lft ("\MyFontB\setstrut\strut fun with") ysized 30mm shifted lrcorner Page shifted (-1cm,8cm) withcolor "white" ;
+% draw textext.lft ("\MyFontB\setstrut\strut luametatex") ysized 30mm shifted lrcorner Page shifted (-1cm,5cm) withcolor "white" ;
+% draw textext.lft ("\MyFontB\setstrut\strut and context") ysized 30mm shifted lrcorner Page shifted (-1cm,2cm) withcolor "white" ;
+
+ draw textext.lft ("\MyFontB\setstrut\strut fun with") ysized 27mm shifted lrcorner Page shifted (-10mm,70mm) withcolor "white" ;
+ draw textext.lft ("\MyFontB\setstrut\strut luametatex") ysized 27mm shifted lrcorner Page shifted (-10mm,45mm) withcolor "white" ;
+ draw textext.lft ("\MyFontB\setstrut\strut and context") ysized 27mm shifted lrcorner Page shifted (-10mm,20mm) withcolor "white" ;
+
+StopPage ;
+
+\stopMPpage
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-whattex.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-whattex.tex
new file mode 100644
index 00000000000..10d3e49f2f7
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-whattex.tex
@@ -0,0 +1,155 @@
+% language=us
+
+\startcomponent evenmore-whattex
+
+\environment evenmore-style
+
+\startchapter[title={Is \LUAMETATEX\ still \TEX ?}]
+
+\startsection[title={Introduction}]
+
+Is \LUAMETATEX\ really a \TEX\ (compatible) engine? The answer to that depends on
+how you define \TEX. If you think of the program with the same name, the answer
+is definitely \quotation {no}, simply because a program that is not exactly
+behaving like \quotation {\TEX\ The Program} cannot be called \TEX. This is why
+derived programs have \type {tex} in their name but also some addition that
+indicates that it isn't the original: \type {e}, \type {pdf}, \type {lua}. Don't
+confuse that with macro package names that have \type {tex} in their name. If you
+find such binaries that they are likely some stub to an engine (binary) that
+preloads a format file (a memory dump) with the same name.
+
+When you mean \quotation {\TEX\ The Macro Language} the answer is a bit more
+nuanced especially when the results are pretty close to identical. In the next
+sections I will discuss this in more detail from the perspective of how \CONTEXT\
+evolved and what engines it has used.
+
+\stopsection
+
+\startsection[title={Multiple engines}]
+
+When we started with \CONTEXT\ there was not that much choice in engines.
+Basically one just used original \TEX, but although we used the version that came
+with the book, pretty soon we switched to em\TEX, a version that gave more
+memory; later a real huge version showed up. The fonts used were bitmaps and the
+viewer was a \DVI\ bitmap viewer. However, when our new printer could not be set
+up properly we decided to move on to \POSTSCRIPT\ fonts. That also meant using a
+different backend driver (\DVIPSONE). And then of course we also started using a
+previewer that could handle outline fonts. Once you start along that route
+graphics come into play, color shows up and hyperlinks become an option. A couple
+of years later the \PDF\ document rendering format was introduced. This paragraph
+already mentions a lot of different programs and adaptations, but we're still
+talking good old \TEX\ here and \CONTEXT\ was set up in such a way that it
+adapted itself to whatever ecosystem made sense. When looking at \TEX\ one has to
+consider the front as well as the backend, and both have related primitives and
+features. Extensions to the frontend have been driven by the demands of macro
+packages (beyond the original ideas) and those of the backend relate to what the
+evolving rendering demands impose.
+
+A couple of decades ago the \ETEX\ project started. It's objective was to extend
+stable \TEX\ with a couple of more primitives and features: it is a superset and
+therefore still \TEX, but as it really is an extension the name was extended too
+(with the bit unusual character $\varepsilon$). At that point the main reason for
+\CONTEXT\ was convenience because the new features were already kind of present
+in the code base (think of emulated behavior). Again the macro package adapted
+itself at runtime.
+
+Then \PDFTEX\ came around which had some impact. It introduced the concept of a
+built|-|in backend that avoided additional programs. The \ETEX\ extensions were
+merged into this program so that basically meant that it replaced its
+predecessors. For a user \PDFTEX\ was just \TEX. For some reason the narrative
+became that \CONTEXT\ depended on \PDFTEX, probably because it was always quick
+in using its features, a side effect of being close to the development.
+
+The \CONTEXT\ package was an early adopter of \METAPOST\ and that graphic
+subsystem, although still external, was integrated in such a way that users could
+think of it being embedded. This was made possible by the fact that right from
+the start \CONTEXT\ came with an infrastructure that handled processing including
+subruns as needed for \METAPOST. This is why, years later, adding a \METAPOST\
+library to \LUATEX\ was a logical step. As \CONTEXT\ came with a lot of scripts
+(for all kind of tasks related to typesetting and managing a \TEX\ ecosystem)
+adding a scripting language (like \LUA) was not that strange either.
+
+In parallel to \PDFTEX\ the experimental \OMEGA\ program was on its way and
+although at some point a stable \ALEPH\ variant was there, it never was robust
+enough for production. Its main contribution (that survived) was the introduction
+if directional typesetting. There were \CONTEXT\ users using it but for very
+specific applications. It's also why the bidirectional model of \OMEGA\ inspired
+\LUATEX\ more than the simpler model that \ETEX\ used.
+
+\stopsection
+
+\startsection[title={The merge}]
+
+We now move forward to \LUATEX\ and more precisely \LUAMETATEX\ because that is
+for \CONTEXT\ the engine of choice now. To what extend is it \TEX\ or not? The
+naive answer is \quotation {no} because some primitives are not present and|/|or
+are implemented using \LUA. However, these primitives fall into categories. Some
+relate to the backend and in \LUAMETATEX\ the backend is not built|-|in and as a
+consequence a macro package has to provide the primitives as part of its
+implementation of a backend. This is no big deal because the backend related
+primitives in \TEX\ The Program are actually examples of extensions and
+implemented as such. Handling them happens in kind of isolated code. Take \type
+{\special}: it is basically a no|-|op when the \DVI\ driver doesn't interpret
+what is passed to the \DVI\ file. \footnote {\CONTEXT\ \MKII\ has a bunch of
+backend drivers, \TEX\ code, that targets specific postprocessors and they hook
+into primitives like \type {\special} or the additional \type {\pdf...} ones in
+\PDFTEX.} \footnote {We need to keep in mind that by the time \PDFTEX\ and later
+\LUATEX\ were developed memory constraints were lifted so these engines didn't
+have to work around the limitations that for instance \ETEX\ and \OMEGA\ had to
+cope with.}
+
+A more drastic change is the lack of font loaders and that no fonts can be stored
+in the format. Again this relates to the simple fact that todays fonts are more
+demanding so we need to extend the machinery and as we do that via \LUA\
+extensions we can as well do all that way. Less drastic, but it could have side
+effects, is that the machinery has to be able to deal with \OPENTYPE\ math. And
+of course all is \UNICODE\ aware so additional primitives cope with that. But in
+principle the old stuff should still work. Hyphenation is also expanded: patterns
+are loaded runtime and the hyphenation, ligature building and kerning stages are
+split, which actually it a good thing.
+
+The \LUAMETATEX\ code base is a follow up on \LUATEX, that combines good old
+\TEX\ (but adapted with respect to fonts, languages and math as mentioned), parts
+of \ETEX\ (so it provides more primitives), bits of \PDFTEX\ (like protrusion and
+expansion, although adapted), and rudiments of \OMEGA\ (\ALEPH). And of course
+there's a lot of new stuff too, primitives as well as ways to plug in \LUA\ code
+plus some helpers at the \LUA\ end.
+
+As an example of progression, by now the \ETEX\ extensions that we kept are
+integrated more naturally in existing subsystems. A nice detail is that there are
+no longer any version numbers that relate to \ETEX; for a while they were kept
+but suddenly I realized that it makes no sense to waste (four) command codes on
+something that is of not much use: there has never been a real \ETEX\ follow up
+after its stable release so testing for a version makes no sense. No backend
+means no \PDFTEX\ version info too and \OMEGA\ version numbers serve no purpose
+either. If a macro package needs to know what functionality is there, testing for
+the \LUATEX\ version number, revision and maybe functionality level makes enough
+sense. By the way, one reason for a clean up related to \ETEX\ was that where
+\ETEX\ uses change files to replace or extend good old \TEX\ code, \LUATEX\ has
+one integrated code base.
+
+\stopsection
+
+\startsection[title={The verdict}]
+
+So in the end the answer is that \LUAMETATEX\ is mostly \TEX\ but that due to
+developments like for instance \UNICODE, \OPENTYPE\ fonts and math, as well as
+the wish to use images, color, runtime graphics, directionality, features beyond
+what the engine has built, etc.\ in the end it hopefully meets the demands to
+today. In its core the same code is still there although extensions and hooks got
+mixed in more naturally. When in documents (or talks) I speak of \TEX\ I
+basically refer to a concept (materialized in the set of core primitives and
+related functionality) but once extensions come into play I try to talk of
+\LUATEX\ or \LUAMETATEX. This happens kind of automatic because I know what got
+added but I can imagine that users who entered the game later don't always see
+what was added (and when).
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
+
+% Written on the day I heard Neal Peart had passed away so mixed with watching
+% Rush dvd's which made me realize that times flies. They day before I was at a
+% Jan Akkerman show ... timeless quality too.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore.tex
new file mode 100644
index 00000000000..293753a797c
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore.tex
@@ -0,0 +1,25 @@
+\environment evenmore-style
+
+\dontcomplain
+
+\startdocument
+
+ \component evenmore-titlepage
+
+ \startfrontmatter
+ \component evenmore-contents
+ \stopfrontmatter
+
+ \startbodymatter
+ \component evenmore-introduction
+ \component evenmore-pi
+ \component evenmore-fonts
+ \component evenmore-threesix
+ \component evenmore-normalization
+ \component evenmore-expansion
+ \component evenmore-macros
+ \component evenmore-libraries
+ \component evenmore-whattex
+ \stopbodymatter
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/mozilla-svg-001.svg b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/mozilla-svg-001.svg
new file mode 100644
index 00000000000..5e46d846759
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/mozilla-svg-001.svg
@@ -0,0 +1,72 @@
+<svg xmlns="http://www.w3.org/2000/svg">
+ <path fill="#d87512" d="M17.786 44.63c-.606.115-1.23.173-1.854.173-2.444 0-4.644-.864-6.04-2.375-.855-.92-1.394-2.147-1.517-3.47-.126-1.243.067-2.638.58-4.163.325-1.016.83-2.01 1.365-3.064.216-.426.437-.858.65-1.302.702-1.454 1.504-3.164 2.11-5.05.715-2.188.943-4.287.682-6.23-.267-2.102-.994-3.972-1.74-5.685a2.992 2.992 0 0 0-4.15-1.446c-.71.375-1.23 1-1.467 1.77a2.983 2.983 0 0 0 .218 2.292c.632 1.19 1.314 2.596 1.592 3.977.238 1.137.18 2.41-.184 3.897-.37 1.538-.976 3.143-1.522 4.518-.16.406-.33.816-.507 1.234-.507 1.215-1.032 2.47-1.364 3.838-.55 2.14-.666 4.152-.348 5.97.36 2.163 1.41 4.14 2.955 5.567 2.027 1.88 4.808 2.914 7.826 2.914 1.14 0 2.274-.146 3.375-.437l-.66-2.923"/>
+ <g fill="#bc600d">
+ <path d="M11.585 43.742s.387 1.248.104 3.05c0 0 2.045-.466 1.898-2.27 0 0-.815-.29-2-.78M9.19 41.484S8.98 42.94 7.93 44.43c0 0 2.103.42 2.774-1.265 0 0-.696-.66-1.515-1.68M8.398 37.21s-.926 1.432-3.23 2.322c0 0 1.514 2.303 3.53.904 0 0-.237-1.388-.3-3.226M12.964 15.833s-1.685.798-3.783 3.45c0 0 2.1 1.55 4.663 2.228 0 0 .285-3.093-.88-5.677M13.5 23.873s-2.988.544-5.57 2.794c0 0 1.615 1.708 3.583 2.62 0 0 1.678-3.39 1.987-5.414M10.32 31.73s-1.483 0-4.483.812c0 0-.01 2.873 2.94 2.823 0 0 .747-1.75 1.544-3.635"/>
+ </g>
+ <g fill="#d87512">
+ <path d="M53.33 39.37c0-4.484-35.622-4.484-35.622 0 0 10.16.05 10.25 17.81 10.25 17.762 0 17.812-.09 17.812-10.25"/>
+ <path d="M42.645 56.04c1.688 2.02 9.275.043 10.504-2.28 5.01-9.482-.006-13.58-.006-13.58l-10.5 1.313s-2.154 11.977 0 14.547"/>
+ </g>
+ <g fill="#bc600d">
+ <path d="M54.2 41.496s-.336 4.246-4.657 9.573c0 0 4.38-1.7 5.808-4.3 0 0 .448-3.02-1.15-5.274M55.08 48.69s-1.065 1.88-3.563 3.872c0 0 1.78-.03 2.576-.785 0 0 .77-1.41.987-3.086"/>
+ </g>
+ <path fill="#f29a2e" d="M35.484 60.38c1.87 2.23 8.547 2.09 10.574 0 2.904-2.995 2.78-16.656 2.904-23.314l-12.418-1.053s-3.444 21.52-1.06 24.367"/>
+ <g fill="#bc600d">
+ <path d="M48.21 53.53s-3.578-3.443-8.738-.013c0 0 5.754 2.455 7.365 5.672 0 0 1.126-2.245 1.373-5.66M48.775 46.06s-3.852-3.09-7.938 1.43c0 0 4.452-.47 7.632 3.635 0 0 .493-3.05.305-5.065"/>
+ </g>
+ <g fill="#3e4347">
+ <path d="M43.847 61.57l-.397-2.765 1.344 2.445zM40.41 61.996l.502-3.294.498 3.294zM36.713 61.3l1.317-2.26-.372 2.59z"/>
+ </g>
+ <path fill="#d87512" d="M28.388 56.04c-1.688 2.02-9.277.043-10.504-2.28-5.01-9.482.004-13.58.004-13.58l10.5 1.313s2.154 11.977 0 14.547"/>
+ <g fill="#bc600d">
+ <path d="M16.833 41.496s.336 4.246 4.657 9.573c0 0-4.38-1.7-5.807-4.3 0 0-.448-3.02 1.15-5.274M15.957 48.69s1.066 1.88 3.563 3.872c0 0-1.782-.03-2.576-.785 0 0-.772-1.41-.987-3.086"/>
+ </g>
+ <path fill="#f29a2e" d="M35.548 60.38c-1.87 2.23-8.548 2.09-10.575 0-2.904-2.995-2.78-16.656-2.904-23.314l12.417-1.053s3.446 21.52 1.06 24.367"/>
+ <g fill="#bc600d">
+ <path d="M22.822 53.53s3.58-3.443 8.74-.013c0 0-5.754 2.455-7.367 5.672 0 0-1.125-2.245-1.373-5.66M22.255 46.06s3.852-3.09 7.94 1.43c0 0-4.453-.47-7.633 3.635 0 0-.493-3.05-.307-5.065"/>
+ </g>
+ <g fill="#3e4347">
+ <path d="M26.24 61.25l1.345-2.445-.395 2.765zM29.62 61.996l.5-3.294.5 3.294zM33.375 61.63L33 59.04l1.32 2.26zM35.516 60.46c-.395-2.48-.482-4.96-.5-7.438.015-2.48.104-4.96.5-7.44.396 2.48.485 4.96.5 7.44-.018 2.48-.106 4.96-.5 7.438"/>
+ </g>
+ <path fill="#f29a2e" d="M27.777 6.994c0 3.82-2.727 6.987-6.086 6.915C11.83 13.7 15.893 2 15.893 2c3.36 0 11.885 1.176 11.885 4.994"/>
+ <path fill="#af5a31" d="M24.05 7.752c0 2.037-1.454 3.727-3.248 3.688-5.26-.11-3.093-6.353-3.093-6.353 1.792 0 6.34.628 6.34 2.665"/>
+ <path fill="#f29a2e" d="M43.26 6.994c0 3.82 2.726 6.987 6.086 6.915 9.86-.21 5.8-11.91 5.8-11.91C51.782 2 43.26 3.176 43.26 6.994"/>
+ <path fill="#af5a31" d="M46.983 7.752c0 2.037 1.455 3.727 3.247 3.688 5.26-.11 3.094-6.353 3.094-6.353-1.794 0-6.34.628-6.34 2.665"/>
+ <path fill="#f29a2e" d="M55.806 33.378c0 7.155-9.517 8.13-20.288 8.13-10.776 0-20.29-.975-20.29-8.13 0-29.96 11.596-29.14 20.29-29.14 8.69 0 20.288-.82 20.288 29.14"/>
+ <g fill="#3e4347">
+ <path d="M35.54 7.59c3.24 0 6.15 1.084 8.156 2.81-.77-2.945-4.135-5.16-8.173-5.16-4.06 0-7.442 2.238-8.186 5.204 2.01-1.753 4.938-2.855 8.204-2.855"/>
+ <path d="M35.535 11.193c2.217 0 4.21.744 5.584 1.925-.528-2.02-2.835-3.534-5.6-3.534-2.78 0-5.095 1.533-5.605 3.564 1.376-1.198 3.383-1.955 5.62-1.955"/>
+ </g>
+ <path fill="#ffe8bb" d="M29.553 43.727l-18.408-7.01 4.24-9.06s2.704 3.85 13.29 6.82l.878 9.243"/>
+ <path fill="#3e4347" d="M29.37 39.77c-7.462-1.27-16.325-6.673-16.48-6.75l.992-2.168c.184.092 8.806 5.342 15.853 6.544l-.366 2.374"/>
+ <path fill="#ffe8bb" d="M41.48 43.727l18.406-7.01-4.24-9.06s-2.704 3.85-13.29 6.82l-.876 9.243"/>
+ <path fill="#3e4347" d="M41.663 39.77c7.46-1.27 16.325-6.673 16.48-6.75l-.993-2.168c-.184.092-8.808 5.342-15.852 6.544l.365 2.374"/>
+ <g fill="#ffe8bb">
+ <path d="M43.524 45.57C38.752 42.023 41.4 33.86 41.4 33.86c-5.657 5.906-12.662 8.74-12.662 8.74 1.608 5.446 5.77 6.412 5.77 6.412-.34-1.835.663-3.302.663-3.302 1.68 2.22 5.03 2.986 5.03 2.986-1.287-1.508-.948-3.835-.948-3.835 2.326.875 4.27.71 4.27.71"/>
+ <path d="M42.29 42.97c-2.634 2.247-10.917 2.247-13.553 0-2.856-2.435-2.495-7.144.1-9.884 2.397-2.527 10.958-2.527 13.355 0 2.595 2.74 2.956 7.45.098 9.883"/>
+ </g>
+ <g fill="#3e4347">
+ <path d="M36.18 40.48a.69.69 0 0 1-.644-.477c-.227-.67-.77-3.293-.71-5.498.01-.398.325-.71.7-.698.38.01.674.343.663.74-.057 2.01.46 4.466.633 4.974.127.375-.06.786-.414.92a.607.607 0 0 1-.23.04"/>
+ <path d="M30.504 43.25c.21-.202.394-.408.582-.61.188-.204.378-.405.57-.604.385-.396.782-.78 1.2-1.145a14.125 14.125 0 0 1 2.745-1.9c.504-.263 1.032-.49 1.59-.654s1.153-.273 1.772-.253c.31.01.623.055.928.146.307.088.602.23.86.416.263.19.485.422.652.684.17.257.287.54.35.83a4.247 4.247 0 0 0-.677-.448 2.567 2.567 0 0 0-.68-.237c-.447-.088-.887-.04-1.33.06-.89.216-1.786.65-2.69 1.114-.905.466-1.818.983-2.776 1.466-.48.24-.97.473-1.48.682-.256.103-.517.202-.783.285-.27.078-.546.155-.833.167"/>
+ </g>
+ <path fill="#f15a61" d="M41.34 31.743c-1.17-.528-4.757-.57-5.83-.57-1.07 0-4.66.042-5.83.57-.832.376-.187 1.31 2.027 2.116 1.397.506 2.733.666 3.803.666 1.07 0 2.405-.16 3.805-.667 2.213-.808 2.856-1.74 2.025-2.117"/>
+ <g fill="#3e4347">
+ <path d="M29.917 23.48l1.61 5.292L26.954 26z"/>
+ <path d="M22.645 31.828c-.522 0-.932-.056-1.17-.098-2.986-.52-4.632-1.996-6.09-4.067l.185-2.472c1.52 1.446 3.953 3.76 6.28 4.167 1.156.2 2.853-.016 4.15-1.234 1.537-1.44 2.263-4.05 2.1-7.547l1.635.132c.2 4.312-.116 7.244-2.212 9.212-1.692 1.59-3.613 1.908-4.878 1.908M41.12 23.48l-1.613 5.292L44.08 26z"/>
+ <path d="M48.39 31.828c.52 0 .93-.056 1.167-.098 2.99-.52 4.637-1.996 6.09-4.067l-.182-2.472c-1.52 1.446-3.955 3.76-6.28 4.167-1.156.2-2.855-.016-4.154-1.234-1.532-1.44-2.258-4.05-2.095-7.547l-1.636.132c-.202 4.312.114 7.244 2.213 9.212 1.69 1.59 3.61 1.908 4.877 1.908"/>
+ </g>
+ <path fill="#ffe8bb" d="M30.25 22.09c-.852 5.282-3.728 5.87-6.696 5.577-2.986-.294-5.396-2.667-5.396-6.743 0-4.28 0-4.28 6.647-5.752 6.728-1.49 6 3.437 5.445 6.918"/>
+ <path fill="#3e4347" d="M29.16 22.547c-.244 2.534-2.61 4.357-5.287 4.072-2.674-.286-4.645-2.57-4.402-5.102s.28-2.75 5.108-2.237c4.83.514 4.824.737 4.582 3.267"/>
+ <path fill="#fff" d="M27.59 21.884c-.16 1.688-1.74 2.903-3.522 2.714-1.785-.19-3.096-1.712-2.936-3.4.163-1.69.186-1.835 3.406-1.493 3.22.344 3.215.49 3.053 2.18"/>
+ <g fill="#3e4347">
+ <ellipse cx="25.5" cy="21.08" rx="1.45" ry="1.647"/>
+ <path d="M31.27 17.896c.42 0 .807-.284.936-.728.16-.546-.133-1.122-.65-1.29l-5.98-1.924c-.516-.166-1.065.14-1.225.685-.155.543.136 1.12.652 1.287l5.98 1.924a.95.95 0 0 0 .288.046"/>
+ </g>
+ <path fill="#ffe8bb" d="M40.78 22.09c.855 5.282 3.73 5.87 6.7 5.577 2.984-.294 5.395-2.667 5.395-6.743 0-4.28-.002-4.28-6.646-5.752-6.73-1.49-6.01 3.437-5.45 6.918"/>
+ <path fill="#3e4347" d="M41.873 22.547c.243 2.534 2.61 4.357 5.287 4.072 2.674-.286 4.646-2.57 4.402-5.102-.242-2.533-.28-2.75-5.107-2.237-4.83.514-4.824.737-4.582 3.267"/>
+ <path fill="#fff" d="M43.44 21.884c.16 1.688 1.737 2.903 3.522 2.714 1.783-.19 3.098-1.712 2.936-3.4-.16-1.69-.188-1.835-3.404-1.493-3.22.344-3.217.49-3.054 2.18"/>
+ <g fill="#3e4347">
+ <ellipse cx="47.722" cy="20.932" rx="1.45" ry="1.647"/>
+ <path d="M39.76 17.896a.982.982 0 0 1-.935-.728c-.16-.546.132-1.122.65-1.29l5.98-1.924c.517-.166 1.063.14 1.224.685.155.543-.136 1.12-.653 1.287l-5.98 1.924a.96.96 0 0 1-.287.046"/>
+ </g>
+</svg>
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-bitmaps.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-bitmaps.tex
new file mode 100644
index 00000000000..cf74c0cade9
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-bitmaps.tex
@@ -0,0 +1,189 @@
+% language=us
+
+\startcomponent followingup-bitmaps
+
+\environment followingup-style
+
+\startchapter[title={Bitmap images}]
+
+\startsection[title={Introduction}]
+
+In \TEX\ image inclusion is traditionally handled by specials. Think of a signal
+added someplace in the page stream that says:
+
+\starttyping
+\special{image: foo.png 2000 3000}
+\stoptyping
+
+Here the number for instance indicate a scale factor to be divided by 1000.
+Because \TEX\ has no floating point numbers, normally one uses an integer and the
+magic multiplier 1000 representing 1.000. Such a special is called a \quote
+{whatsit} and is one reason why \TEX\ is so flexible and adaptive.
+
+In \PDFTEX\ instead of a \type {\special} the command \type {\pdfximage} and its
+companions are used. In \LUATEX\ this concept has been generalized to \type
+{\useimageresource} which internally is not a so called whatsit (an extension
+node) but a special kind of rule. This makes for nicer code as now we don't need
+to check if a certain whatsit node is actually one with dimensions, while rules
+already are part of calculating box dimensions, so no extra overhead in checking
+for whatsits is added. In retrospect this was one of the more interesting
+conceptual changes in \LUATEX.
+
+In \LUAMETATEX\ we don't have such primitives but we do have these special rule
+nodes; we're talking of subtypes and the frontend doesn't look at those details.
+Depending on what the backend needs one can easily define a scanner that
+implements a primitive. We already did that in \CONTEXT. More important is that
+inclusion is not handled by the engine simply because there is no backend. This
+means that we need to do it ourselves. There are two steps involved in this that
+we will discuss below.
+
+\stopsection
+
+\startsection[title={Identifying}]
+
+There is only a handful of image formats that makes sense in a typesetting
+workflow. Because \PDF\ inclusion is supported (but not discussed here) one can
+actually take any format as long as it converts to \PDF, and tools like graphic
+magic do a decent job on that. \footnote {Although one really need to check a
+converted image. When we moved to pplib, I found out that lots of converted
+images in a project had invalid \PDF\ objects, but apart from a warning nothing
+bad resulted from this because those objects were not used.} The main bitmap
+formats that we care about are \JPEG, \JPEG2000, and \PNG. We could deal with
+\JBIG\ files but I never encountered them so let's forget about them for now.
+
+One of the problems with a built|-|in analyzer (and embedder) is that it can
+crash or just abort the engine. The main reason is that when the used libraries
+run into some issue, the engine is not always able to recover from it: a
+converter just aborts which then cleans up (potentially messed up) memory. In
+\LUATEX\ we also abort, simply because we have no clue to what extend further on
+the libraries are still working as expected. We play safe. For the average user
+this is quite ok as it signals that an image has to be fixed.
+
+In a workflow that runs unattended on a server and where users push images to a
+resource tree, there is a good change that a \TEX\ job fails because of some
+problem with images. A crash is not really an option then. This is one reason why
+converting bitmaps to \PDF\ makes much sense. Another reason is that some color
+profiling might be involved. Runtime manipulations make no sense, unless there is
+only one typesetting run.
+
+Because in \LMTX\ we do the analyzing ourselves \footnote {Actually, in \MKIV\
+this was also possible but not widely advertised, but we now exclusively keep
+this for \LMTX.} we can recover much easier. The main reason is of course that
+because we use \LUA, memory management and garbage collection happens pretty well
+controlled. And crashing \LUA\ code can easily be intercepted by a \type {pcall}.
+
+Most (extensible) file formats are based on tables that gets accessed from an
+index of names and offsets into the file. This means that filtering for instance
+metadata like dimensions and resolutions is no big deal (we always did that). I
+can extend analyzing when needed without a substantial change in the engine that
+can affect other macro packages. And \LUA\ is fast enough (and often faster) for
+such tasks.
+
+\stopsection
+
+\startsection[title={Embeding}]
+
+Once identified the frontend can use that information for scaling and (if needed)
+reuse of the same image. Embedding of the image resource happens when a page is
+shipped out. For \JPEG\ images this is actually quite simple: we only need to
+create a dictionary with the right information and push the bitmap itself into
+the associated stream.
+
+For \PNG\ images it's a bit different. Unfortunately \PDF\ only supports certain
+formats, for instance masks are separated and transparency needs to be resolved.
+This means that there are two routes: either pass the bitmap blob to the stream,
+or convert it to a suitable format supported by \PDF. In \LUATEX\ that is
+normally done by the backend code, which uses a library for this. It is a typical
+example of a dependency of something much larger than actually needed. In
+\LUATEX\ the original poppler library used for filtering objects from a \PDF\
+file as well as the \PNG\ library also have tons of code on board that relates to
+manipulating (writing) data. But we don't need those features. As a side note:
+this is something rather general. You decide to use a small library for a simple
+task only to find out after a decade that it has grown a lot offering features
+and having extra dependencies that you really don't want. Even worse: you end up
+with constant updates due to fixed security (read: bug) fixes.
+
+Passing the \PNG\ blob unchanged in itself to the \PDF\ file is trivial, but
+massaging it into an acceptable form when it doesn't suit the \PDF\ specification
+takes a bit more code. In fact, \PDF\ does not really support \PNG\ as format,
+but it supports \PNG\ compression (aka filters).
+
+Trying to support more complex \PNG\ files is a nice way to test if you can
+transform a public specification into a program as for instance happens with
+\PDF, \OPENTYPE, and font embedding in \CONTEXT. So this again was a nice
+exercise in coding. After a while I was able to process the \PNG\ test suite
+using \LUA. Optimizing the code came with understanding the specification.
+However, for large images, especially interlaced ones, runtime was definitely not
+to be ignored. It all depended on the tasks at hand:
+
+\startitemize
+
+\startitem
+ A \PNG\ blob is compressed with \ZIP\ compression, so first it needs to be
+ decompressed. This takes a bit of time (and in the process we found out that
+ the \type {zlib} library used in \LUATEX\ had a bug that surfaced when a
+ mostly zero byte image was uncompressed and we can then hit a filled up
+ buffer condition.
+\stopitem
+
+\startitem
+ The resulting uncompressed stream is itself compressed with a so called
+ filter. Each row starts with a filter byte that indicates how to convert
+ bytes into other bytes. The most commonly used methods are deltas with
+ preceding pixels and/or pixels on a previous row. When done the filter bytes
+ can go away.
+\stopitem
+
+\startitem
+ Sometimes an image uses 1, 2 or 4 bits per pixel, in which case the rows
+ needs to be expanded. This can involve a multiplication factor per pixel (it
+ can also be an index in a palette).
+\stopitem
+
+\startitem
+ An image can be interlaced which means that there are seven parts of the
+ image that stepwise build up the whole. In professional workflows with high
+ res images interlacing makes no sense as transfer over the internet is not an
+ issue and the overhead due to reassembling the image and the potentially
+ larger file size (due to independent compression of the seven parts) are not
+ what we want either.
+\stopitem
+
+\startitem
+ There can be an image mask that needs to be separated from the main blob. A
+ single byte gray scale image then has two bytes per pixel, and a double byte
+ pixel has four bytes of information. An \RGB\ image has three bytes per pixel
+ plus an alpha byte, and in the case of double byte pixels we get eight bytes
+ per pixel.
+\stopitem
+
+\startitem
+ Finally the resulting blob has to be compressed again. The current amount of
+ time involved in that suggests that there is room for improvement.
+\stopitem
+
+\stopitemize
+
+The process is controlled by number of rows and columns, the number of bytes per
+pixel (one or two) and the color space which effectively means one or three
+bytes. These numbers get fed into the filter, deinterlacer, expander and|/|or
+mask separator. In order to speed up the embedding these basic operations can be
+assisted by a helpers written in \CCODE. Because \LUA\ is quite good with
+strings, we pass strings and get back strings. So, most of the logic stays at the
+\LUA\ end.
+
+\stopsection
+
+\startsection[title=Conclusion]
+
+Going for a library|-|less solution for bitmap inclusion is quite doable and in
+most cases as efficient. Because we have a pure \LUA\ implementation for testing
+and an optimized variant for production, we can experiment as we like. A positive
+side effect is that we can more robustly intercept bad images and inject a
+placeholder instead.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-cleanup.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-cleanup.tex
new file mode 100644
index 00000000000..7dcb3b3b1fa
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-cleanup.tex
@@ -0,0 +1,332 @@
+% language=us
+
+% Youtube: TheLucs play with Jacob Collier // Don't stop til you get enough
+
+\startcomponent followingup-cleanup
+
+\environment followingup-style
+
+\logo [ALGOL] {Algol}
+\logo [FORTRAN] {FORTRAN}
+\logo [SPSS] {SPSS}
+\logo [DEC] {DEC}
+\logo [VAX] {VAX}
+\logo [AMIGA] {Amiga}
+
+\startchapter[title={Cleanup}]
+
+\startsection[title={Introduction}]
+
+Original \TEX\ is a literate program, which means that code and documentation are
+mixed. This mix, called a \WEB, is split into a source file and a \TEX\ file and
+both parts are processed independently into a program (binary) and a typeset
+document. The evolution of \TEX\ went through stages but in the end a \PASCAL\
+\WEB\ file was the result. This fact has lead to the more or less standard \WEBC\
+compilation infrastructure which is the basis for \TEXLIVE.
+
+% My programming experience started with programming a micro processor kit (using
+% an 1802 processor), but at the university I went from \ALGOL\ to \PASCAL\ (okay,
+% I also remember lots of \SPSS\ kind|-|of|-|\FORTRAN\ programming. The \PASCAL\
+% was the one provided on \DEC\ and \VAX\ machines and it was a bit beyond standard
+% \PASCAL. Later I did quite some programming in \MODULA 2 in (for a while an
+% \AMIGA) but mostly on personal computers. The reason that I mention this it that
+% it still determines the way I look at programs. For instance that code goes
+% through a couple if stepwise improvements (and that it can always be done
+% better). That you need to keep an eye on memory consumption (can be a nice
+% challenge). That a properly formatted source code is important (at least for me).
+%
+% When into \PASCAL, I ran into the \TEX\ series and as it looked familiar it ended
+% up on my bookshelf. However, I could not really get an idea what it was about,
+% simply because I had no access to the \TEX\ program. But the magic stayed with
+% me. The fact that \LUA\ resembles \PASCAL, made it a good candidate for extending
+% \TEX\ (there were other reasons as well). When decades later, after using \TEX\
+% in practice, I ended up looking at the source, it was the \LUATEX\ source.
+
+So, \TEX\ is a woven program and this is also true for the starting point of
+\LUATEX: \PDFTEX. But, because we wanted to open up the internals, and because
+\LUA\ is written in \CCODE, already in an early stage Taco decided to start from
+the \CCODE\ translated from \PASCAL. A permanent conversion was achieved using
+additional scripts and the original documentation stayed in the source. The one
+large file was split into more logical smaller parts and combined with snippets
+from \ALEPH .
+
+After we released version 1.0 I went through the documentation parts of the code
+and normalized that a bit. The at that moment still sort of simple \WEB\ files
+became regular \CCODE\ files, and the idea was (and is) that at some point it
+should be possible to process the documentation (using \CONTEXT).
+
+Over time the \CCODE\ code evolved and functions ended up in places that at that
+made most sense at that moment. After the previously described stripping process,
+I decided to go through the files and see if a bit of reshuffling made sense,
+mostly because that would make documenting easier. (I'm not literate enough to
+turn it into a proper literate program.) It was also a good moment to get rid of
+unused code (not that much) and unused macros (some more than expected). It also
+made sense to change a few names (for instance to avoid potential future clashes
+with \type {lua_} core functions). However, all this takes quite some careful
+checking and compilation runs, so I expect that after this first cleanup, for
+quite some time stepwise improvements can happen (especially in adding comments).
+\footnote {This is and will be an ongoing effort. It probably doesn't show, but
+getting the code base in the state it is in now, took quite some time. It
+probably won't take away complaints and nagging but I've decided no longer to pay
+attention to those on the sideline.} \footnote {In the end not much \PDFTEX\ and
+\ALEPH\ code is present in \LUAMETATEX , but these were useful intermediate
+steps. No matter how lean \LUAMETATEX\ becomes, I have a weak spot for \PDFTEX\
+as it always served us well and without it \TEX\ would be less present today.}
+
+One of the things that I keep in mind when doing this, is that we use \LUA. This
+component compiles on most relevant platforms and as such we can assume that
+\LUAMETATEX\ also should (and can be) made a bit less dependent on old mechanisms
+that are used in stock \LUATEX. For instance, we don't come from \PASCAL\ any
+longer but there are traces of that transition still present. We also don't use
+specific operating system features, and those that we use are also used in \LUA.
+And, as we try to share code we can also delegate some (more) to \LUA. For
+instance file related code is not dependent on other components in the \TEX\
+infrastructure, but maybe at some point the runtime loadable \KPSE\ library can
+kick in. So, basically the idea is to sort of go bare bone first and later see
+how with the help of \LUA\ we can get bring some back. For the record: this is
+not needed for \CONTEXT\ as it already has this interface to \TDS. \footnote
+{This has been removed from my agenda.}
+
+\stopsection
+
+\startsection[title={Motivation}]
+
+The \LUATEX\ project started as an experiment of adding \LUA\ to \PDFTEX, which
+was done by Hartmut and in order to avoid confusion we named it \LUATEX. When we
+figured out that there this had possibilities we decided to go further and Taco
+took the challenge to rework the code base. Part of that work was sponsored by
+Idris' Oriental \TEX\ project. I have fond memory of the intensive and rapid
+development cycles: online discussions, binaries going my directions,
+experimental \CONTEXT\ code going the other way. When we had reached a sort of
+stable state but at some point, read: usage in \CONTEXT\ had become crucial, a
+steady further development started, where Taco redid \METAPOST\ into \MPLIB,
+funded by user groups. At some point Luigi took over from Taco the task of
+integration of components (also into \TEX Live), introduced \LUAJIT\ into the
+binary, conducted the (again partially funded) swiglib project, followed by
+support for \FFI. A while later I myself started messing around in the code base
+directly and continued extending the engine and \LUA\ interfaces.
+
+I could work on this because I have quite some freedom at the place where I work.
+We use (part of) \CONTEXT\ for some projects and especially in dealing with \XML\
+we could benefit from \LUATEX. It must be said that (long running) projects like
+these never pay off (on the contrary, they cost a lot in terms of money and
+energy) so it's quite safe to conclude that \LUATEX\ development is to a large
+extend a (many man years) work of love for the subject. I guess that no sane
+company will do (permit) such a thing. It is also for that reason that I keep
+spending time on it, and as a simplification of the code base was always one of
+my dreams, this is what I spend my time on now. After all, \LUATEX\ is just
+juggling bytes and as it is written in \CCODE, and has no graphical user
+interface or complex dependencies, it should be possible to have a relative
+simple setup in terms of code files and compilation. Of course this is also made
+possible by the fact that I can use \LUA. It's also why I decided to
+\quotation {Just do it}, and then \quotation {Let's see where I end up}. No
+matter how it turns out, it makes a good vehicle for further development and
+years of fun.
+
+\stopsection
+
+\startsection[title={Files}]
+
+After a decade of adding and moving around code it's about time to reorganize the
+code a bit, but we do so without deviating too much from the original setup. For
+instance we started out with a small number of \LUA\ interface macros and these
+were collected in a few files, and defined in one \type {h} file, but it made
+sense to have header files alongside the libraries that implement helpers. This
+is a rather tedious job but with music videos or video casts on a second screen
+it is bearable.
+
+When I reached a state where we only needed the \LUATEX\ files plus the minimal
+set of libraries I tried to get rid of directories in the source tree that were
+placeholders, but with \type {automake} files, like those for \PDFTEX\ and
+\XETEX. After a couple of attempts I gave up on that because the build setup is
+rather hard coded for checking them. Also, there were some (puzzling)
+dependencies in the configuring on \OMEGA\ files as well as some \DVI\ related
+tools. So, that bit is for later to sort out. \footnote {Of course later the
+decision was made to forget about using \type {autotools} and go for an as simple
+as possible \type {cmake} solution.}
+
+\stopsection
+
+\startsection[title={Command line arguments}]
+
+As we need to set up a backend and deal with font loading in \LUA, we can as well
+delegate some of the command line handling to \LUA\ as well. Therefore, only the
+a limited set of options is dealt with: those that determine the startup and \LUA\
+behavior. In principle we can even get rid of all and always use a startup script
+but for now it makes sense to not deviate too much from a regular \TEX\ run.
+
+At the time of this writing some code is still in place that is a candidate for
+removal. For instance, using the \type {&} to define a format file has long be
+replaced by \type {--fmt}. There are sentimental reasons for keeping it but at
+the same time we need to realize that shells use these special characters too. A
+for me unknown (or forgotten) feature of prefixing a jobname with a \type {*}
+will be removed as it makes no sense. There is some \MSWINDOWS\ specific last
+resort code that probably will go too, unless I can figure out why it is needed
+in the first place. \footnote {Intercepting these symbols has been dropped in
+favor of the command line flags.}
+
+Now left with a very simple set of command line options it also makes sense to
+use a simple option analyzer, so that was a next step as it rid us of a
+dependency and produces less code.
+
+So, the option parser has now been replaced by a simple variant that is more in
+tune with what will happen when you deal with options in \LUA: no magic. One
+problem is that \TEX's first input file is moved from the command line to the
+input buffer and a an interactive session is emulated. As mentioned before, there
+is some extra \type {&}, \type {*} and \type {\\} parsing involved. One can
+wonder if this still makes sense in a situation where one has to specify a format
+and \LUA\ file (using \type {--fmt} and \type {--ini}) so that might as well be
+redone a bit some day. \footnote {In the end only these explicit command line
+options were supported.}
+
+\stopsection
+
+\startsection[title={Platforms}]
+
+When going through the code I noticed conditional sections for long obsolete
+platforms: \type {amiga}, \type {dos} and \type {djgpp}, \type {os/2}, \type
+{aix}, \type {solaris}, etc. Also, with 64 bit becoming the standard, it makes
+sense to assume that users will use a modern 64 platform (intel or arm combined
+with \MSWINDOWS\ or some popular \UNIX\ variant). We don't need large and complex
+code management for obscure platforms and architectures simply because we want to
+proof that \LUAMETATEX\ runs everywhere. With respect to \MSWINDOWS\ we use a
+cross compiler (\type {mingw}) as reference but native compilation should be no
+big deal eventually. We can cross that bridge when we have a simplified
+compilation set up. Right now it doesn't make sense to waste time on a native
+\MICROSOFT\ compilation as it would also pollute the code with conditional
+sections. We'll see what happens when I'm bored. \footnote {In the meantime no
+effort is made to let the source compile otherwise than with the cross compiler.
+Best is to keep the code as clean as possible with respect to conditional code
+sections. So don't bother me with patches.}
+
+\stopsection
+
+\startsection[title={Stubs}]
+
+A \CONTEXT\ run is managed by \MTXRUN\ in combination with a specific script
+
+\starttyping
+mtxrun --script context
+\stoptyping
+
+On windows, we use a stub because using a \type {cmd} file create an indirectness
+that is not seen as executable and therefore in other command files needs to
+be called in a special way to guarantee continuation. So, there we have a small
+binary:
+
+\starttyping
+mtxrun.exe ...
+\stoptyping
+
+that will call:
+
+\starttyping
+luatex --luaonly mtxrun.lua ...
+\stoptyping
+
+And when the stub has a different name than \type {mtxrun}, say:
+
+\starttyping
+context.exe ...
+\stoptyping
+
+it effectively becomes:
+
+\starttyping
+luatex --luaonly mtxrun.lua --script context ...
+\stoptyping
+
+Because the stripped down version assumes some kind of initializations anyway a
+small extension made it possible to use \LUAMETATEX\ as stub too. So, when we
+rename \type {luametatex.exe} to \type {mtxrun.exe} (on \UNIX\ we don't use a
+suffix) it will start up as \LUA\ interpreter when it finds a script with the
+name \type {mtxrun.lua} in the same path. When we rename it to \type
+{context.exe} it will search for \type {context.lua} and all that that script has
+to do is this:
+
+\starttyping
+arg[0] = "mtxrun"
+
+table.insert(arg,1,"mtx-context")
+table.insert(arg,1,"--script")
+
+dofile(os.selfpath .. "/" .. "mtxrun.lua")
+\stoptyping
+
+So, it basically becomes a call to \type {mtxrun}, but we stay in \LUAMETATEX.
+Because we want an isolated run this will launch \LUAMETATEX\ again with the
+right command line arguments. This sounds inefficient but because we have a small
+binary this is no real issue, and as that run is isolated, it cannot influence
+the caller. The overhead is really small: on my somewhat older laptop it's .2
+seconds, but we had that management overhead already for decades, so no one
+bothers about it. On all platforms using symbolic links works ok too.
+
+\stopsection
+
+\startsection[title={Global variables}]
+
+There are quite a bit global variables and function in the code base, but in the
+process of opening up I got rid of some. The cleanup turned some more into
+locals which saved executable bytes (keep in mind that we also use the engine as
+\LUA\ interpreter so, the smaller, the more friendly). \footnote {Later the
+global variables were collected in so called \CCODE\ structs.} This is work
+in progress.
+
+\stopsection
+
+\startsection[title={Memory usage}]
+
+By going over all the code a couple of times, I was able to decrease the amount
+of used memory a bit as well as avoid some memory allocations. This has no
+consequences for performance but is nicer when multiple runs at the same time
+(e.g.\ on virtual machines) have to compete for resources. \footnote {I will
+probably have to spend some more time on this in order to reach a state that I'm
+satisfied with.}
+
+\stopsection
+
+\startsection[title={\METAPOST}]
+
+The current code base doesn't have that many files. We can imagine that, when
+\LUA\ can be compiled on a platform, that compiling \LUAMETATEX\ is also no that
+complicated. However, the rather complex build infrastructure demonstrates the
+opposite. One of the complications is that \MPLIB\ is codes in \CWEB\ and that
+needs some juggling to get \CCODE. The process has quite some dependencies. There
+are some upstream patches needed, but for now occasionally checking with the
+upstream sources used for compiling \MPLIB\ in \LUATEX\ works okay. \footnote
+{Later I decided to cleanup the \MPLIB\ code: unused font related code was
+removed, the \POSTSCRIPT\ backend was untangled, the translation from \CWEB\ to
+\CCODE\ got done by a \LUA\ script, aspects like error reporting and \IO\ were
+redone, and in the end some new extensions were added. Some of that might trickle
+back to th original, as long as it doesn't harm compatibility; after all
+\METAPOST\ (the program) is standardized and considered functionally stable.}
+
+As \LUAMETATEX\ is also used for experiments we use a copy of the \LUA\ library
+interface. That way we don't interfere with the stable \LUATEX\ situation. When
+we play with extensions, we can always decide to backport them, once they are
+found useful and in good working order. But, as that interface was just \CCODE\
+this was trivial.
+
+\stopsection
+
+\startsection[title={Files}]
+
+In a relative late stage I decided to cleanup some of the filename handling.
+First I got rid of the \type {area}, \type {name} and \type {ext} decomposition
+and optional recomposition. In the original engine that goes through the string
+pool and although there is some recovery in the end, with many files and fonts
+being used, the pool can get exhausted. For instance when you have hundreds of
+thousands of \typ {\font \foo = bar} kind of definitions, each definition wipes
+out the previous entry in the hash, but its font name is kept in the string pool.
+I got rid of that side effect by reusing strings but in the end decided to avoid
+the pool altogether. It was then a small step to also do that for other
+filenames. In the process I also decided that it made no sense to keep the code
+around that reads a filename from the console: we now just quit. Restarting the
+program with a proper filename is no big deal today. I might do some more cleanup
+there. In the end we can best use a callback for handling input from the console.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-compilation.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-compilation.tex
new file mode 100644
index 00000000000..a0e67d4bed9
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-compilation.tex
@@ -0,0 +1,84 @@
+% language=us
+
+\startcomponent followingup-compilation
+
+\environment followingup-style
+
+\startchapter[title={Compilation}]
+
+Compiling \LUATEX\ is possible because after all it's what I do on my machine.
+The \LUATEX\ source tree is part of a larger infrastructure: \TEX Live. Managing
+that one is work for specialists and the current build system is the work of
+experts over a quite long period of time. When you only compile \LUATEX\ it goes
+unnoticed that there are many dependencies, some of which are actually unrelated
+to \LUATEX\ itself but are a side effect of the complexity of the build
+structure.
+
+When going from \LUATEX\ to \LUAMETATEX\ many dependencies were removed and I
+eventually ended up with a simpler setup. The source tree went down to less than
+30 MB and zipped to around 4 MB. That makes it possible to consider adding the
+code to the regular \CONTEXT\ distribution.
+
+One reason for doing that is that one keeps the current version of the engine
+packaged with the current version of \CONTEXT. But a more important one is that
+it fulfils a demand. Some time ago we were asked by some teachers participating
+in a (basically free) math method for technical education what guarantees there
+are that the tools used are available forever. Now, even with \LUAMETATEX\ one
+has to set up a compiler but it is much easier than installing the whole \TEX
+Live infrastructure for that. A third reason is that it gives me a comfortable
+feeling that I myself can compile it anywhere as can \CONTEXT\ users who want to
+do that.
+
+The source tree traditionally has libs in a separate directory (lua, luajit, zlib
+and zziplib). However, it is more practical to have them alongside our normal
+source. These are relative small collections of files that never change so there
+is no reason not to do it. \footnote {If I ever decide to add more libraries,
+only the minimal interfaces needed will be provided, but at this moment there are
+no such plans.}
+
+Another assumption we're going to make is that we use 64 bit binaries. There is
+no need to support obsolete platforms either. As a start we make sure it compiles
+on the platforms used by \CONTEXT\ users. Basically we make a kind of utility.
+For now I can compile the \WINDOWS\ 32 bit binaries that my colleague needs in
+half a minute anyway, but in the long run we will settle for 64 bits.
+
+I spent about a week figuring out why the compilation is so complex (by
+selectively removing components). At some point compilation on \OSX\ stopped
+working. When the minimum was reached I decided to abandon the automake tool
+chain and see if \type {cmake} could be used (after all, Mojca challenged that).
+In retrospect I should have done that sooner because in a day I could get all
+relevant platforms working. Flattening the source tree was a next step and so
+there is no way back now. What baffled me (and Alan, who at some point joined in
+testing \OSX) is the speed of compilation. My pretty old laptop needed about half
+a minute to get the job done and even on a raspberry pi with only a flash card
+just a few minutes were needed. At that point, as we could remove more make
+related files, the compressed 11 MB archive (\type {tar.xz}) shrunk to just over
+2~MB. Interesting is that compiling \MPLIB\ takes most time, and when one compiles
+in parallel (on more cores) that one finishes last.
+
+For the record: I do all this on a laptop running \MSWINDOWS\ 10 using the Linux
+subsystem. When that came around, Luigi made me a working setup for cross
+compilation but in the meantime with GCC 8.2 all works out of the box. I edit the
+files at the \MSWINDOWS\ end (using \SCITE), compile at the \LINUX\ end, and test
+everything on \MSWINDOWS. It is a pretty convenient setup.
+
+When compilation got faster it became also more convenient to do some more code
+reshuffling. This time I decided to pack the global variables into structures,
+more or less organized the way the header files were organized. It gives a bit
+more verbosity but also has the side effects that (at least in principle) the
+\CPU\ cache can perform better because neighboring variables are often cached as
+part of the deal. Now it might be imagination, but in the process I did notice
+that mid March processing the manual went down to below 11.7 seconds while before
+it stayed around 12.1 seconds. Of course this is not that relevant currently, but
+I might make a difference on less capable processors (as in a low power setup).
+It anyway didn't hurt.
+
+In the meantime some of the constants used in the program got prefixes or
+suffixes to make them more unique and for instance the use of \type {normal} as
+equivalent for zero was made a bit more distinctive as we now have more subtypes.
+That is: all the subtypes were collected in enumerations instead of \CCODE\
+defines. Back to the basics.
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-contents.tex
new file mode 100644
index 00000000000..3fbfc701a5b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-contents.tex
@@ -0,0 +1,11 @@
+\startcomponent followingup-contents
+
+\environment followingup-style
+
+\starttitle[title={Table of contents}]
+
+ \placelist[chapter]
+
+\stoptitle
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-directions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-directions.tex
new file mode 100644
index 00000000000..244baff90de
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-directions.tex
@@ -0,0 +1,778 @@
+% language=us
+
+\startcomponent followingup-directions
+
+\environment followingup-style
+
+\startchapter[title={Directions}]
+
+\startsection[title={Introduction}]
+
+In \LUATEX\ the directional model taken from \OMEGA\ has been upgraded a bit. For
+instance in addition to the \type {\*dir} commands we have \type {\*direction}
+commands that take a number instead of a keyword. This is a bit more efficient and
+consistent as using these keywords was kind of un|-|\TEX. Internally direction
+related nodes (text directions) are not whatsits but first class nodes. We also
+use a subtype that indicates the push or pop state.
+
+The \LUATEX\ directional model provides four directions which is a subset of the
+many that \OMEGA\ provided, indicated by three letters, like \type {TRT} and
+\type {LTT}. In the beginning we had them all fixed\footnote {This was doen by
+Hartmut by rigorously checking all possible combinations} and thereby implemented
+but being in doubt about their usefulness we dropped most of them, just four were
+kept. However, in practice only right|-|to|-|left makes sense. Going from top to
+bottom in Japanese or Mongolian can also involve glyph rotation, which actually
+is not implemented in the engine at all. Spacing and inter|-|character breaks
+have to be implemented and in the end one has to combine the results into a
+page body. So, in practice you end up with juggling node list and macro magic in
+the page builder. The \type {LTL} (number~2) and \type {RTT} (number~3)
+directions are not used for serious work. Therefore, in \LUAMETATEX\ the model
+has been adapted. In the end, it was not entirely clear anyway what the three
+letters were indicating in each direction property (page, body, par, text, math)
+as most had no real meaning.
+
+As a side note: if you leave the (not really working well) vertical directions
+out of the picture, directional typesetting is not that hard to deal with and has
+hardly any consequences for the code. This is because horizontal dimensions are
+not affected by direction, only the final ship out is: when a run (wrapped in an
+hbox) goes the other way, the backend effectively has to skip the width and then
+with each component goes back. Not much more is involved. This means that a
+bidirectional engine is rather simple. The complications are more in the way a
+macro package deals with it, in relation to the input as well as the layout. The
+backend has to do the real work. \footnote {Of course when one hooks in \LUA\
+code taking care of direction can be needed!}
+
+\stopsection
+
+\startsection[title=Two directions]
+
+We now have only two directions left: the default left|-|to|-|right (l2r) and
+right|-|to|-|left (r2l). They work the same as before and in the backend we can
+get rid of the fuzzy parallel and rotation (which actually was just stacking
+nodes) heuristics.
+
+Reducing the lot to two directions simplifies some code in the engine. This is
+because when calculating dimensions a change in horizontal direction doesn't
+influence the width, height and depth in an orthogonal way. Because there are no
+longer top|-|down items we don't need to swap the height and or depth with the
+width. This also means that we don't need to keep much track of direction
+changes. Technically an hpack doesn't need to know its own direction and we can
+set it to any value afterwards if we want because the calculation are not
+influenced by it; so that also simplified matters.
+
+The \type {\bodydir} and \type {\pagedir} already didn't make much sense, and in
+\CONTEXT\ we actually intercepted them, so now they are removed. The body
+direction is always left|-|to|-|right and the page direction was only consulted
+in the backend code which we no longer have. Another side effect of going with
+only two directions is that rules no longer need to carry the direction property:
+there is no flipping of width with height and depth needed.
+
+\stopsection
+
+\startsection[title=Four orientations]
+
+Instead of the top|-|bottom variants we now have four orientations plus a bunch
+of anchoring options. Of course one could use the backend save, restore and
+matrix whatsits but a natural feature makes more sense. Let's start with what
+happens normally:
+
+\startbuffer[1]
+This is a \LUAMETATEX\ goodie.
+\stopbuffer
+
+\startbuffer[2]
+\hbox orientation 2{This is a \LUAMETATEX\ goodie.}
+\stopbuffer
+
+\startbuffer[3]
+This is a \hbox orientation 2{\LUAMETATEX} goodie.
+\stopbuffer
+
+\startbuffer[4]
+\hbox orientation 2{This is a \hbox orientation 002{\LUAMETATEX} goodie.}
+\stopbuffer
+
+\blank{\showstruts\strut}\quad\ruledhbox{\inlinebuffer[1]}\quad{\showstruts\strut}\blank
+
+This line has height and depth. We can rotate this sentence by 180 degrees around
+the baseline in which case the depth and height are flipped.
+
+\blank{\showstruts\strut}\quad\ruledhbox{\inlinebuffer[2]}\quad{\showstruts\strut}\blank
+
+or we flip part:
+
+\blank{\showstruts\strut}\quad\ruledhbox{\inlinebuffer[3]}\quad{\showstruts\strut}\blank
+
+or flip nested:
+
+\blank{\showstruts\strut}\quad\ruledhbox{\inlinebuffer[4]}\quad{\showstruts\strut}\blank
+
+but we're talking boxes, so the above examples are defined as:
+
+\typebuffer[1,2,3,4]
+
+The \type {orientation} keyword does the magic here. There are four such
+orientations with zero being the default. We saw that two rotates over 180
+degrees, so one and three are left for up and down.
+
+\startbuffer[5]
+\hbox orientation 0 {\TEX} and
+\hbox orientation 1 {\TEX} and
+\hbox orientation 2 {\TEX} and
+\hbox orientation 3 {\TEX}
+\stopbuffer
+
+\blank{\showstruts\strut}\quad\ruledhbox{\inlinebuffer[5]}\quad{\showstruts\strut}\blank
+
+This is codes as:
+
+\typebuffer[5]
+
+The landscape and seascape variants both sit on top of the baseline while the
+flipped variant has its depth swapped with the height. Although this would be
+enough a bit more control is possible. The number is actually a three byte hex
+number:
+
+\starttyping
+0x<X><Y><O>
+\stoptyping
+
+or in \TEX\ syntax
+
+\starttyping
+"<X><Y><O>
+\stoptyping
+
+We saw that the last byte regulates the orientation. The first and second one
+deal with anchoring horizontally and vertically. The vertical options of the
+horizontal variants anchor on the baseline, lower corner, upper corner or center.
+
+\startbuffer[6]
+\hbox orientation "002 {\TEX} and
+\hbox orientation "012 {\TEX} and
+\hbox orientation "022 {\TEX} and
+\hbox orientation "032 {\TEX}
+\stopbuffer
+
+\typebuffer[6]
+
+\blank{\showstruts\strut}\quad\ruledhbox{\inlinebuffer[6]}\quad{\showstruts\strut}\blank
+
+\startbuffer[7]
+\hbox orientation "002 {\TEX} and
+\hbox orientation "102 {\TEX} and
+\hbox orientation "202 {\TEX} and
+\hbox orientation "302 {\TEX} and
+\hbox orientation "402 {\TEX}
+\stopbuffer
+
+The horizontal options of the horizontal variants anchor in the center, left, right,
+halfway left and halfway right.
+
+\typebuffer[7]
+
+\blank{\showstruts\strut}\quad\ruledhbox{\inlinebuffer[7]}\quad{\showstruts\strut}\blank
+
+All combinations will be shown on the next pages, so we suffice with telling that
+for the vertical variants we can vertically anchor on the baseline, top, bottom
+or center, while horizontally we center, hang left or right, halfway left or
+right, and in addition align on the (rotated) baseline left or right.
+
+The orientation has consequences for the dimensions so they are dealt with in the
+expected way in constructing lines, paragraphs and pages, but the anchoring is
+virtual. As a bonus, we have two extra variants for orientation zero: on top of
+baseline or below, with dimensions taken into account.
+
+\startbuffer[8]
+\hbox orientation "000 {\TEX} and
+\hbox orientation "004 {\TEX} and
+\hbox orientation "005 {\TEX}
+\stopbuffer
+
+\typebuffer[8]
+
+\blank{\showstruts\strut}\quad\ruledhbox{\inlinebuffer[8]}\quad{\showstruts\strut}\blank
+
+\definecolor[brcolorh][r=1,t=.5,a=1]
+\definecolor[brcolord][b=1,t=.5,a=1]
+\definecolor[brcolorm][g=1,t=.5,a=1]
+
+\starttexdefinition ShowAnchor
+ \blackrule[width=2pt,height=1pt,depth=1pt,color=darkgray]
+\stoptexdefinition
+
+\starttexdefinition DemoRule#1#2#3
+ \ShowAnchor
+ \ruledhbox {
+ \hbox orientation "#1#2#3 {
+ \blackrule[height=6mm,depth=0mm,width=8mm,color=brcolorh]\kern-8mm\relax
+ \blackrule[height=0mm,depth=3mm,width=8mm,color=brcolord]\kern-8mm\relax
+ \blackrule[height=2mm,depth=-1mm,width=8mm,color=brcolorm]
+ }
+ }
+ \ShowAnchor
+\stoptexdefinition
+
+\starttexdefinition DemoText#1#2#3
+ \ShowAnchor
+ \ruledhbox{\hbox orientation "#1#2#3 {\red\TEX}}
+ \ShowAnchor
+\stoptexdefinition
+
+\starttexdefinition DemoSet #1#2
+ \startcombination[nx=4,ny=7,width=10cm]
+ {#200#1}{\ttxx 0x00#1} {#201#1}{\ttxx 0x01#1} {#202#1}{\ttxx 0x02#1} {#203#1}{\ttxx 0x03#1}
+ {#210#1}{\ttxx 0x10#1} {#211#1}{\ttxx 0x11#1} {#212#1}{\ttxx 0x12#1} {#213#1}{\ttxx 0x13#1}
+ {#220#1}{\ttxx 0x20#1} {#221#1}{\ttxx 0x21#1} {#222#1}{\ttxx 0x22#1} {#223#1}{\ttxx 0x23#1}
+ {#230#1}{\ttxx 0x30#1} {#231#1}{\ttxx 0x31#1} {#232#1}{\ttxx 0x32#1} {#233#1}{\ttxx 0x33#1}
+ {#240#1}{\ttxx 0x40#1} {#241#1}{\ttxx 0x41#1} {#242#1}{\ttxx 0x42#1} {#243#1}{\ttxx 0x43#1}
+ {#250#1}{\ttxx 0x50#1} {#251#1}{\ttxx 0x51#1} {#252#1}{\ttxx 0x52#1} {#253#1}{\ttxx 0x53#1}
+ {#260#1}{\ttxx 0x60#1} {#261#1}{\ttxx 0x61#1} {#262#1}{\ttxx 0x62#1} {#263#1}{\ttxx 0x63#1}
+ \stopcombination
+\stoptexdefinition
+
+\startplacefigure[title={orientation 0}]\scale[width=\textwidth]{\framed[offset=1cm]{\DemoSet0\DemoRule}}\stopplacefigure
+\startplacefigure[title={orientation 1}]\scale[width=\textwidth]{\framed[offset=1cm]{\DemoSet1\DemoRule}}\stopplacefigure
+\startplacefigure[title={orientation 2}]\scale[width=\textwidth]{\framed[offset=1cm]{\DemoSet2\DemoRule}}\stopplacefigure
+\startplacefigure[title={orientation 3}]\scale[width=\textwidth]{\framed[offset=1cm]{\DemoSet3\DemoRule}}\stopplacefigure
+
+\startplacefigure[title={orientation 0}]\scale[width=\textwidth]{\framed[offset=1cm]{\DemoSet0\DemoText}}\stopplacefigure
+\startplacefigure[title={orientation 1}]\scale[width=\textwidth]{\framed[offset=1cm]{\DemoSet1\DemoText}}\stopplacefigure
+\startplacefigure[title={orientation 2}]\scale[width=\textwidth]{\framed[offset=1cm]{\DemoSet2\DemoText}}\stopplacefigure
+\startplacefigure[title={orientation 3}]\scale[width=\textwidth]{\framed[offset=1cm]{\DemoSet3\DemoText}}\stopplacefigure
+
+% \page
+
+The anchoring can look somewhat confusing but you need to keep in mind that it is
+normally only used in very controlled circumstances and not in running text.
+Wrapped in macros users don't see the details. We're talking boxes here, so or
+instance:
+
+\startbuffer
+test\quad
+\hbox orientation 3 \bgroup
+ \strut test\hbox orientation "002 \bgroup\strut test\egroup test%
+\egroup \quad
+\hbox orientation 3 \bgroup
+ \strut test\hbox orientation "002 \bgroup\strut test\egroup test%
+\egroup \quad
+\hbox orientation 3 \bgroup
+ \strut test\hbox orientation "012 \bgroup\strut test\egroup test%
+\egroup \quad
+\hbox orientation 3 \bgroup
+ \strut test\hbox orientation "022 \bgroup\strut test\egroup test%
+\egroup \quad
+\hbox orientation 3 \bgroup
+ \strut test\hbox orientation "032 \bgroup\strut test\egroup test%
+\egroup \quad
+\hbox orientation 3 \bgroup
+ \strut test\hbox orientation "042 \bgroup\strut test\egroup test%
+\egroup
+\quad test
+\stopbuffer
+
+\typebuffer
+
+gives:
+
+\startlinecorrection[blank]
+\ruledhbox\bgroup \showcolorstruts \showboxes \inlinebuffer \egroup
+\stoplinecorrection
+
+\stopsection
+
+\startsection[title={Right|-|to|-|left typesetting}]
+
+Another aspect to keep in mind when we transform is the already mentioned
+right|-|to|-|left direction. We show some examples where we do things like this:
+
+\starttyping
+\hbox{\hbox
+ orientation #1
+ {\strut abcd}}
+\hbox{\hbox
+ orientation #1
+ to 15mm
+ {\strut abcd}}
+\hbox{\hbox
+ orientation #1
+ direction 1
+ {\righttoleft\strut abcd}}
+\hbox{\hbox
+ orientation #1
+ direction 1
+ to 15mm {\righttoleft\strut abcd}}
+\stoptyping
+
+\starttexdefinition TestH #1
+ \dontcomplain
+ \setbox\scratchbox\hbox{abcd}%
+ x\ruledhbox{\hbox orientation #1 to \wd\scratchbox {\strut abcd}}x\quad
+ x\ruledhbox{\hbox orientation #1 to 15mm {\strut abcd}}x\quad
+ x\ruledhbox{\hbox orientation #1 direction 1 to \wd\scratchbox {\righttoleft\strut abcd}}x\quad
+ x\ruledhbox{\hbox orientation #1 direction 1 to 15mm {\righttoleft\strut abcd}}x%
+\stoptexdefinition
+
+\starttexdefinition TestV #1
+ \dontcomplain
+ \setbox\scratchbox\hbox{abcd}%
+ x\ruledvbox{\vbox orientation #1 {\hsize \wd\scratchbox\strut abcd}}x\quad
+ x\ruledvbox{\vbox orientation #1 {\hsize 15mm\strut abcd}}x\quad
+ x\ruledvbox{\vbox orientation #1 {\righttoleft\hsize \wd\scratchbox\strut abcd}}x\quad
+ x\ruledvbox{\vbox orientation #1 {\righttoleft\hsize 15mm\strut abcd}}x%
+\stoptexdefinition
+
+\startplacefigure[title={Horizontal boxes.}]
+ \startcombination[nx=2,ny=2]
+ {\TestH 0} {orientation 0}
+ {\TestH 2} {orientation 2}
+ {\TestH 1} {orientation 1}
+ {\TestH 3} {orientation 3}
+ \stopcombination
+\stopplacefigure
+
+\startplacefigure[title={Vertical boxes.}]
+ \startcombination[nx=2,ny=2]
+ {\TestV 0} {orientation 0}
+ {\TestV 2} {orientation 2}
+ {\TestV 1} {orientation 1}
+ {\TestV 3} {orientation 3}
+ \stopcombination
+\stopplacefigure
+
+\stopsection
+
+\startsection[title={Vertical typesetting}]
+
+I'm no expert on vertical typesetting and have no application for it either. But
+from what I've seen vertically positioned glyphs are normally used in rather
+straightforward situations. Here I will just give some examples of how
+transformations can be used to achieve certain effects. It is no big deal to make
+macros or use \LUA\ to apply magic to node lists but it is beyond this description
+to discuss that.
+
+Before we fine tune this example we have to discuss another feature. When a \typ
+{orientation} keyword is given optionally \type {xoffset} and \type {yoffset} can
+be specified. These offsets are {\em not} taken into account when calculating
+dimensions. This is different from the offsets (at the \LUA\ end) used in glyphs
+because there the vertical offset is taken into account. Here are some examples
+of offsets in packaged lists:
+
+\startbuffer
+\hbox
+ {test 1}
+\hbox
+ orientation 0
+ yoffset 15pt
+ xoffset 150pt
+ {test}
+\vbox
+ orientation 0
+ {\hbox{test}}
+\vbox
+ orientation 0
+ yoffset -5pt
+ xoffset 130pt
+ {\hbox{test}}
+\vbox
+ orientation 0
+ yoffset 2pt
+ {\hbox{test}}
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection[blank]
+ \start \showboxes \bfd \getbuffer \stop
+\stoplinecorrection
+
+In order to demonstrate some hacking, we first define a font that supports
+chinese glyphs:
+
+\startbuffer
+\definefont[NotoCJK][NotoSansCJKtc-Regular*default @ 24pt]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+We put some text in a horizontal box; it doesn't show up in verbatim but you
+get the idea nevertheless:
+
+\startbuffer
+\hbox{\NotoCJK 通用规范汉字表}
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection[blank]
+ \start \showboxes \getbuffer \stop
+\stoplinecorrection
+
+Let's now rotate this line of text:
+
+\startbuffer[1]
+\hbox orientation 1 {\NotoCJK 通用规范汉字表}
+\stopbuffer
+
+\typebuffer[1]
+
+The result is shown in a while. Because we also need to rotate the glyphs we
+deconstruct the box.
+
+\startbuffer[2]
+\hbox orientation 1 \bgroup \NotoCJK %
+ \vbox {\hbox {通}}%
+ \vbox {\hbox {用}}%
+ \vbox {\hbox {规}}%
+ \vbox {\hbox {test}}%
+ \vbox {\hbox {范}}%
+ \vbox {\hbox {汉}}%
+ \vbox {\hbox {å­—}}%
+ \vbox {\hbox {表}}%
+\egroup
+\stopbuffer
+
+\typebuffer[2]
+
+Next we rotate the glyphs.
+
+\startbuffer[3]
+\hbox orientation 1 \bgroup \NotoCJK %
+ \vbox orientation 3 {\hbox {通}}%
+ \vbox orientation 3 {\hbox {用}}%
+ \vbox orientation 3 {\hbox {规}}%
+ \vbox orientation 0 {\hbox {test}}%
+ \vbox orientation 3 {\hbox {范}}%
+ \vbox orientation 3 {\hbox {汉}}%
+ \vbox orientation 3 {\hbox {å­—}}%
+ \vbox orientation 3 {\hbox {表}}%
+\egroup
+\stopbuffer
+
+\typebuffer[3]
+
+This still looks bad so we kick in some offsets and glue:
+
+\startbuffer[4]
+\dontleavehmode\hbox orientation 1 \bgroup \NotoCJK
+ \vbox
+ orientation 0 yoffset -.1ex
+ {\hbox orientation 3 {通}}\hskip.2ex
+ \vbox
+ orientation 0 yoffset -.1ex
+ {\hbox orientation 3 {用}}\hskip.2ex
+ \vbox
+ orientation 0 yoffset -.1ex
+ {\hbox orientation 3 {规}}\hskip.6ex
+ \vbox
+ {\hbox {test}}\hskip.2ex
+ \vbox
+ orientation 0 yoffset -.1ex
+ {\hbox orientation 3 {范}}\hskip.2ex
+ \vbox
+ orientation 0 yoffset -.1ex
+ {\hbox orientation 3 {汉}}\hskip.2ex
+ \vbox
+ orientation 0 yoffset -.1ex
+ {\hbox orientation 3 {å­—}}\hskip.2ex
+ \vbox
+ orientation 0 yoffset -.1ex
+ {\hbox orientation 3 {表}}\hskip.2ex
+\egroup
+\stopbuffer
+
+\typebuffer[4]
+
+Now we're ready to compare the results
+
+\startlinecorrection[blank]
+ \startcombination[9*1]
+ {\showboxes \getbuffer[1]} {1}
+ {\showboxes \getbuffer[2]} {2}
+ {\showboxes \getbuffer[3]} {3}
+ {\showboxes \getbuffer[4]} {4}
+ {\quad}{}
+ {\getbuffer[1]} {1}
+ {\getbuffer[2]} {2}
+ {\getbuffer[3]} {3}
+ {\getbuffer[4]} {4}
+ \stopcombination
+\stoplinecorrection
+
+This could of course also be done with traditional kerns, raising and|/|or
+lowering and messing around with dimensions. It's just that when manipulating
+such rather complex constructs a little help (and efficiency) makes a difference,
+also at the \LUA\ end. Of course one can argue the result but all is
+programmable in the end.
+
+\stopsection
+
+\startsection[title={Considerations}]
+
+Just in case you wonder if using these offsets is better than using normal kerning
+and shifting, in practice offsets are not more efficient. Let's compare the
+alternatives. We go from most to least efficient.
+
+\starttyping
+\setbox\scratchbox\hpack{}
+\boxxoffset\scratchbox\scratchdimen
+\boxyoffset\scratchbox\scratchdimen
+\stoptyping
+
+This sets the offsets and by setting them we also trigger the transform. Scanning
+is fast and so is setting them. One million times expanding this takes (as
+reference) 0.73 seconds on my current machine.
+
+\starttyping
+\setbox\scratchbox\hpack
+ orientation \zerocount
+ xoffset \scratchdimen
+ yoffset \scratchdimen
+ {}
+\stoptyping
+
+This takes a bit more time, 1.11 seconds, because the keywords have to be scanned
+which happens on a token by token base.
+
+\starttyping
+\setbox\scratchbox\hpack{}
+\scratchheight\ht\scratchbox
+\scratchdepth\dp\scratchbox
+\setbox\scratchbox\hpack
+ {\kern\scratchdimen
+ \raise\scratchdimen\box\scratchbox
+ \kern\scratchdimen}
+\ht\scratchbox\scratchheight
+\dp\scratchbox\scratchdepth
+\stoptyping
+
+Now we're up to 1.69 seconds for the million expansions. Not only do we have some
+parsing going on, but we also have assignments and extra packing, which means
+calculations taking place.
+
+\starttyping
+\setbox\scratchbox\hpack{}
+\scratchwidth\wd\scratchbox
+\scratchheight\ht\scratchbox
+\scratchdepth\dp\scratchbox
+\setbox\scratchbox\hpack
+ {\kern\scratchdimen
+ \raise\scratchdimen\box\scratchbox}
+\wd\scratchbox\scratchwidth
+\ht\scratchbox\scratchheight
+\dp\scratchbox\scratchdepth
+\stoptyping
+
+This variant is about as fast, as I measured 1.72 seconds. So, compared to the
+0.73 seconds for the first variant, is this better? Does it help when we look at
+our existing macros and adapt them?
+
+Normally we don't have an empty box and normally we use \type {\hbox} because we
+want the content to be processed. And a million times building a list and
+processing content (which means runs over the list) will make the differences
+in timing become noise. Add to that garbage collection (in \LUA) and memory
+management (in \TEX) and it even becomes unpredictable. Seeing differences of
+a factor two in such timings is no exception.
+
+Another aspect is the parsing. When these commands are wrapped in macros we're
+talking expanding tokens which is pretty fast. When it comes from the input file
+a conversion to tokens has to happen too. And we will never see millions of such
+sequences in a source file.
+
+The backend also plays a role. Handling a kern or shift is more efficient than
+analyzing transforms (and offsets) especially in a \LUA\ variant. But on the
+other hand, we don't have an extra wrapping in a box so that actually saves work.
+
+So, before a \CONTEXT\ user thinks \quotation {Let's update macros and change
+policy.}, just consider staying with proven good old \TEX\ approaches. These
+features are mostly meant for efficient low level manipulations as discussed in
+relation to for instance handling scripts. In the rather large \CONTEXT\ code
+base there are really only a few places where it will make code look nicer, but
+there I don't expect an impact on performance.
+
+\stopsection
+
+\startsection[title={Integration}]
+
+How these mechanisms are used depends on ones needs and the macro package used.
+It makes no sense to cook up generic solutions because integration in a macro
+package is too different. But anyhow we'll give an example of some (definitely
+non optimized) \LUA\ magic.
+
+\startbuffer
+\startluacode
+local glyph_id = node.id("glyph")
+local fontdata = fonts.hashes.identifiers -- assumes generic font loader
+
+local function is_vertical(c)
+ -- more ranges matter but this will do here
+ return c >= 0x04E00 and c <= 0x09FFF
+end
+
+function document.go_vertical(boxnumber)
+ local box = tex.getbox(boxnumber)
+ local n = box.list
+ while n do
+ if n.id == glyph_id and is_vertical(n.char) then
+ local o = .2 * fontdata[n.font].parameters.xheight
+ local prev, next = n.prev, n.next
+ n.next, n.prev = nil, nil
+ local l = nodes.new("hlist")
+ l.list = n
+ local w, h, d = n.width, n.height, n.depth
+ if prev then
+ prev.next, l.prev = l, prev
+ else
+ box.list = l
+ end
+ if next then
+ l.next, next.prev = next, l
+ end
+ l.width, l.height, l.depth = h + d + o, w, 0
+ l.orientation = 0x003
+ l.xoffset, l.yoffset = o/2, -o/2
+ l.hoffset, l.doffset = h, d - o
+ n = next
+ else
+ n = n.next
+ end
+ end
+end
+\stopluacode
+\stopbuffer
+
+\typebuffer \getbuffer
+
+We will use some other magic that we won't discuss here which relates to handling
+scripts. For Hangul one needs to inject breakpoints and if needed also glue
+between characters. The script environment does this. We also need to bump the
+interline spacing. First we define a regular text helper and an auxiliary box.
+
+\startbuffer[1]
+\unexpanded\def\stripe#1%
+ {\hbox orientation 0 yoffset .2\exheight{\strut #1}}
+
+\newbox\MyVerticalBox
+\stopbuffer
+
+\typebuffer[1]
+
+Next we fill that box with some mix of text (I have no clue what, as I just
+copied it from some web page).
+
+\startbuffer[2a]
+\setbox\MyVerticalBox\hbox \bgroup
+ \NotoCJK
+ \startscript[hangul]%
+ \dorecurse{20}{通用规范汉字表 \stripe{test #1} }%
+ \unskip % remove last space
+ \stopscript
+\egroup
+\stopbuffer
+
+\typebuffer[2a]
+
+We then apply the \LUA\ magic to the result:
+
+\startbuffer[3a]
+\ctxlua{document.go_vertical(\number\MyVerticalBox)}
+\stopbuffer
+
+\typebuffer[3a]
+
+and finally assemble the result:
+
+\startbuffer[4a]
+\ruledvbox orientation 1 to \textwidth \bgroup
+ \setupinterlinespace[40pt]
+ \hsize .95\textheight
+ \unhbox\MyVerticalBox
+ \vfill
+\egroup
+\stopbuffer
+
+\typebuffer[4a]
+
+The result is shown in \in {figure} [fig:verticalmagic-1]. Of course this
+approach is not that user friendly but it just serves as example. In \CONTEXT\ we
+can follow a different route. First we define a new font feature. It is probably
+clear that we need some code elsewhere that does something useful with this
+information, but I will nos show this as it is rather \CONTEXT\ dependent.
+
+\startbuffer[2b]
+\definefontfeature
+ [vertical]
+ [vertical={%
+ orientation=3,%
+ down=.1,%
+ right=.1,%
+ ranges={%
+ cjkcompatibility,%
+ cjkcompatibilityforms,%
+ cjkcompatibilityideographs,%
+ cjkcompatibilityideographssupplement,%
+ cjkradicalssupplement,%
+ % cjkstrokes,%
+ cjksymbolsandpunctuation,%
+ cjkunifiedideographs,%
+ cjkunifiedideographsextensiona,%
+ cjkunifiedideographsextensionb,%
+ cjkunifiedideographsextensionc,%
+ cjkunifiedideographsextensiond,%
+ cjkunifiedideographsextensione,%
+ cjkunifiedideographsextensionf,%
+ }%
+ }]
+\stopbuffer
+
+\typebuffer[2b]
+
+We apply this feature to a font:
+
+\startbuffer[3b]
+\definefont
+ [NotoCJKvertical]
+ [NotoSansCJKtc-Regular*default,vertical @ 24pt]
+\stopbuffer
+
+\typebuffer[3b]
+
+\startbuffer[4b]
+\setbox\MyVerticalBox\hbox\bgroup
+ \NotoCJKvertical
+ \startscript[hangul]%
+ \dorecurse{20}{通用规范汉字表 \stripe{test #1} }%
+ \unskip
+ \stopscript
+\egroup
+\stopbuffer
+
+\typebuffer[4b]
+
+\startbuffer[5b]
+\ruledvbox orientation 1 to \textwidth \bgroup
+ \setupinterlinespace[40pt]
+ \hsize .95\textheight
+ \unhbox\MyVerticalBox
+ \vfill
+\egroup
+\stopbuffer
+
+\typebuffer[5b]
+
+The result is shown in \in {figure} [fig:verticalmagic-2]. Again this approach is
+not that user friendly but it already is a bit easier.
+
+\startplacefigure[reference=fig:verticalmagic-1,title={Some vertical magic using manipulations.}]
+ \getbuffer[1,2a,3a,4a]
+\stopplacefigure
+
+\startplacefigure[reference=fig:verticalmagic-2,title={Some vertical magic using fonts.}]
+ \getbuffer[1,2b,3b,4b,5b]
+\stopplacefigure
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-evolution.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-evolution.tex
new file mode 100644
index 00000000000..730f4cc1b84
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-evolution.tex
@@ -0,0 +1,373 @@
+% language=us
+
+\startcomponent followingup-evolution
+
+\environment followingup-style
+
+% Yes, music is still evolving in qualitive ways ...
+%
+% Home Is - Jacob Collier with VOCES8
+%
+% and as long as there's interesting new music to run into I keep
+% doing thse kind of things.
+
+\startchapter[title={Evolution}]
+
+\startsection[title={Introduction}]
+
+The original idea behind \TEX\ is that of a relatively small kernel with (either
+or not system dependent) extensions. One such extension is the \DVI\ backend, and
+later \PDFTEX\ added a \PDF\ backend. Other extensions are \quote {writing to
+files} and \quote {writing to the output medium} using so called specials. This
+extension mechanism permits \TEX\ to support, for instance, color and image
+inclusion.
+
+The \LUATEX\ project started from \PDFTEX, including its extensions like font
+expansion, and combined that with (bi|)|directional typesetting from the, at that
+moment, stable \OMEGA\ variant \ALEPH. During the more than a decade development
+we integrated expansion in a more efficient way and limited directions to the
+four that made sense. The assumption that \UNICODE\ has the future lead to \UTF8
+being used all over the place.
+
+The \LUATEX\ variant opens up the internals using the \LUA\ extension language.
+The idea was (and still is) that instead if adding more and more hard coded
+solutions, one can use \LUA\ to do it on demand. So, for instance \OPENTYPE\
+fonts are supported by providing a font file reader but the implementation of
+features is up to \LUA. From \PDFTEX\ the graphic inclusions were inherited but
+an image and \PDF\ reading library provided a few more possibilities, for
+instance for querying properties. An important integral part of \LUATEX\ is the
+\METAPOST\ library, but apart from that one, the amount of libraries is kept at a
+minimum. That way we're free of dependencies and compilation hassles.
+
+With version 1.0 the functionality became official and with version 1.1 the
+functionality became more of less frozen. The main reason for this is that
+further extensions would violate the principle of using \LUA\ instead of hard
+coding solutions. Another reason is that at some point you have to provide a
+stable machinery for macro packages so that backward as well as forward
+compatibility over a longer period is possible. Also, because one can use \TEX\
+in (unattended) workflows sudden changes become undesirable.
+
+\stopsection
+
+\startsection[title={What next?}]
+
+Does it stop here? We have reached a reasonable stable state with \CONTEXT\
+\MKIV\ and can basically do what we want to do. However, during the more than a
+decade development of this \MKII\ follow up, the idea surfaced that we can go
+more minimal in the engine. Basically we can go back to where \TEX\ started: a
+core plus extension mechanism. What does that mean? First of all, there is the
+very efficient frontend: scanning macros, expanding them and constructing node
+lists, all within a powerful grouping mechanism. There is no reason to reconsider
+that. The core of the interface is also well documented, for instance in the
+\TEX\ book. We added some primitives to \LUATEX, but most of them are of no real
+importance to users; they make more sense to macro package writers.
+
+Original \TEX\ has a \DVI\ backend which is a simple representation of a page:
+characters and rules positioned on some grid. A separate program has to convert
+that into something for a printer. There is a basic extension mechanism that
+permits injection of so called specials that get passed to the external program
+so that for instance an image can be included. Given that \LUATEX\ is mostly used
+to generate \PDF, using so called wide fonts in a \UNICODE\ universe, a \DVI\
+backend is not that useful. In fact, one can then better use the faster \PDFTEX\
+program or just \ETEX\ or \TEX: use the best tool available for the job.
+
+The backend however can be left out and can be implemented in \LUA\ instead. In
+fact, most of the backend related code in \CONTEXT\ doesn't really use the
+\LUATEX\ backend features at all. The backend is only used to convert the page
+stream to a \PDF\ content stream, include images, include fonts and manage low
+level objects. Everything specific to \PDF\ is already done in \LUA. Of course
+this has a performance penalty but given the overhead already present in
+\CONTEXT\ it is bearable.
+
+Alongside the frontend the \METAPOST\ library plays an important role in
+\CONTEXT: integration between \TEX, \METAPOST\ and \LUA\ is pretty tight and a
+unique property of \CONTEXT. But, for instance the font reader library is no
+longer used. Also the interfacing to the \TEX\ Directory Structure was done in
+\LUA, originally for performance reasons as it reduced startup time by more that
+a second. For some of the frontend code (like hyphenation and par building) we
+can kick in \LUA\ variants too but there is not much to gain there. (I know that
+some users use them with success.)
+
+So, traditional \TEX\ can be summarized as:
+
+\starttyping
+tex core + dvi backend + tex extensions
+\stoptyping
+
+where the extension interface provide a few goodies. If we would have to summarize
+\LUATEX\ we could say:
+
+\starttyping
+tex core + dvi & pdf backend + tex extensions + lua callbacks
+\stoptyping
+
+The core interprets the input and does the typesetting. In order to be able to
+typeset \TEX\ only needs the dimensions of characters and information about
+spacing (which in principle are sort of independent) in math mode a few more
+properties are needed, like snippets that make large symbols. In text mode
+ligature and kerning information can be used too. However, in \LUATEX, where
+normally \OPENTYPE\ fonts are used, that information is provided from \LUA. This
+means that one can also think of:
+
+\starttyping
+tex core + basic font data + tex extensions + lua callbacks
+\stoptyping
+
+Compared to regular \TEX\ this is not that different, and it's what \CONTEXT\ can
+do with. So, it will be no surprise that when I wondered what \LUATEX\ 2.0 could
+be that a more minimalistic approach was considered: back to the basics.
+
+\stopsection
+
+\startsection[title={Roadmap}]
+
+Before I continue it is good to mention the following. One of the burdens that
+\CONTEXT\ users (and developers) carry is that the outside world likes putting
+labels on \CONTEXT, like \quotation {A macro package depending on \PDFTEX} in a
+time that we supported \DVI\ at the same level using a more of less generic
+driver model. The same is true for \MKIV, e.g.\ \quotation {\CONTEXT\ uses a lot
+of \LUA\ and moves away from \TEX} while in fact we provide a hybrid tool: you
+can use \TEX\ input (which most users do) but also \LUA\ (which can be handy) or
+\XML\ (which some publishers demand and definitely seems to be used by some
+\CONTEXT\ power users). A special one is \quotation {\CONTEXT\ is kind of plain
+\TEX, so you have to program all yourself.} Reality is that \CONTEXT\ is an
+integrated system, where \TEX\ and \METAPOST\ work together to provide a lot of
+integrated functionality. Because of \LUATEX\ development and the relation
+between an updated engine and the beta version of \CONTEXT, the impression can be
+that we have an unstable system. This strategy of parallel adaptation is the only
+way to really test of things work as expected. Because we have a rather fast
+update cycle normally users don't suffer that much from it.
+
+The core of whatever we follow up with is and remains \TEX, just because I like
+it. So, when I talk about a small core, I actually still talk about \TEX. The
+main reason is that it's way easier (and readable) to code some solutions in this
+hybrid fashion. A pure \LUA\ solution is no fun, maybe even a pain, and I have no
+use for it, but a pure \TEX\ solution can be cumbersome too. And \TEX\ input is
+just very convenient and for that one needs a \TEX\ interpreter. I would already
+have dropped out when \TEX\ was not part of the game: an intriguing, puzzling and
+powerful toy. And \METAPOST\ and \LUA\ add even more fun. So, I settle for a mix
+between three interesting languages. And, because I seldom run into professional
+demand for \LUATEX\ related support (or high end, high performance rendering),
+the fun factor has always been the driving force.
+
+All that said, for practical reasons, when we explore a follow up in the
+perspective of \CONTEXT, we will use the working title \LUAMETATEX\ instead.
+\LUAMETATEX\ has the current \LUATEX\ frontend, some \LUA\ libraries, but no
+backend. Gone are the font reader, image inclusion, \DVI\ and \PDF\ backend
+(including font inclusion) and the interface to the \TDS. Can that work? As
+mentioned, the font reader was already not used in \CONTEXT\ for quite a while. An
+alternative page stream builder was also in good working condition in \CONTEXT\
+when \LUATEX\ 1.08 was released and around \LUATEX\ 1.09 image inclusion was
+replaced (\PDF\ inclusion was already accompanied for a while by a \LUA\
+variant). Currently (fall 2018) \CONTEXT\ is able to completely construct the
+\PDF\ file which also meant font inclusion. However, it didn't make much sense to
+release that code yet because after all, there was minimal gain when using it
+with a full blown \LUATEX. Also, switching to this variant involved some runtime
+adaption of code which might confuse users. But above all, it needed more
+testing, and releasing something before an upcoming \TEX Live code freeze is a
+bad idea.
+
+During \LUATEX\ development a few times we got suggestions for additional
+features but merely looking at them already made clear that what works for
+someone in a particular case, can introduce side effects that make (for instance)
+\CONTEXT\ fail. And, how many folks keep \CONTEXT\ in mind? So, when \LUATEX\
+goes into maintenance mode, specific distributions could accept patches outside
+our control, which has the danger that a binary (suggesting to be \LUATEX)
+doesn't work with \CONTEXT. Of course we cannot change something ourselves either
+without looking around. And I'm not even bringing possible negative side effects
+on performance into the discussion here.
+
+When developing \LUATEX\ some ideas were dropped or delayed and these can now be
+explored without the danger of messing up the stable version. It has always been
+relatively easy to adapt \CONTEXT\ to changes so an (at least for now)
+experimental follow up can be dealt with too, but this time the concept of \quote
+{experimental} is really bound to \CONTEXT. When something is found useful (or
+can be improved) it can always (after testing it for a while) be fed back into
+\LUATEX, as long as it doesn't break something. I'll decide on that later.
+
+In the documentation of \TEX, when discussing the extension mechanism, Donald
+Knuth says:
+
+\startquotation
+The goal of a \TEX\ extender should be to minimize alterations to the standard
+parts of the program, and to avoid them completely if possible. He or she should
+also be quite sure that there's no easy way to accomplish the desired goals with
+the standard features that \TEX\ already has. \quotation {Think thrice before
+extending}, because that may save a lot of work, and it will also keep
+incompatible extensions of \TEX\ from proliferating.
+\stopquotation
+
+With the in the next chapters discussed reduction of backend and some frontend
+code, combined with hooks that can trigger callbacks, we try to come close to
+this objective. Now, the last sentence of this quote relates to stability and
+this is also a reason why we enter this new thread: the smaller the core is, the
+less subjected we are to change. Think of this: I haven't used \CONTEXT\ \MKII\
+in over a decade. A \PDFTEX\ format still gets generated but I have no clue if
+the engine has been changed in ways that make some code behave differently (it
+could also be the ecosystem related to that engine), but I assume it's still
+behaving the same. The same has to become true for stock \LUATEX\ and \MKIV\ and
+for \CONTEXT\ it can even become more true with \LUAMETATEX. We'll see.
+
+\stopsection
+
+\startsection[title={Experiments}]
+
+This (still sort of) prototype of what \LUAMETATEX\ could be boils down to a much
+smaller binary, and not that much more \LUA\ code on top of what we already have.
+There are no longer dependencies on third party code, apart from \LUA\ (\type
+{pplib} is tuned for \LUATEX\ and permanent part of the code base). Performance
+wise the backend of the experimental version makes a run upto 5\% slower than
+when using a native backend (on processing the \LUATEX\ manual) but history has
+learned that we can gain some of that back in due time. Performance also depends
+a bit on the properties of the document. Interesting is that better control over
+the output showed that \PDF\ output of the mentioned manual was a bit smaller
+(but that might change). \footnote {In the meantime the experimental version can
+process the \LUATEX\ manual 5\endash10\% faster and the result is still smaller.}
+
+The experiments actually started already years ago with no longer using the font
+loader. It sort of went this way:
+
+\startitemize
+\startitem
+ Stepwise \CONTEXT\ functionality started using a combination of \TEX\ and
+ \LUA\ code and we got an idea of what was needed. The most demanding part
+ was support for fonts.
+\stopitem
+\startitem
+ Font handling was done in \LUA\ because it's flexible which is what \TEX ies
+ are accustomed to. The \OPENTYPE\ and \PDF\ standards would not be called
+ standards if some implementation was impossible and so far we're ok. (Some
+ more script support will be provided in future versions.)
+\stopitem
+\startitem
+ We stopped using the fontforge font loader but use one written in \LUA\
+ instead. One reason for this was that when variable fonts showed up we wanted
+ to support it in \CONTEXT\ right from the start (not that there has been much
+ demand). The same is true for fonts using color (like emoji). Also, fighting
+ the built|-|in \FONTFORGE\ heuristics was hard.
+\stopitem
+\startitem
+ The (large and dependent on \CPLUSPLUS) poppler library used for \PDF\
+ embedding has been replaced by a small lightweight library in pure \CCODE.
+ This was triggered at a chat during a bacho\TEX\ meeting.
+\stopitem
+\startitem
+ The hard coded \PDF\ inclusion can be swapped with a \LUA\ based one so that
+ we can for instance filter the page stream. We already had a hybrid solution
+ in \CONTEXT\ anyway for other reasons (merging annotations, layers,
+ bookmarks, etc.).
+\stopitem
+\startitem
+ The page stream constructor got a (shipout and xforms) by a \LUA\ variant,
+ but I decided not to make that an independent option in stock \LUATEX\ with
+ \CONTEXT\ \MKIV, although for a while I had the option \type {--lmtx} for
+ activating that experimental code.
+\stopitem
+\startitem
+ Then of course bitmap image inclusion had to be done by \LUA\ code, in order
+ to see if we can get rid of another external dependency as some of these
+ libraries get frequent updates while in practice we only use a very small
+ subset of functionality. Indeed this was possible. \footnote {I have a pure
+ \LUA\ parser for \PDF\ too, so at some point that might get included in the
+ \CONTEXT\ code base.}
+\stopitem
+\startitem
+ With some effort (deciphering specs and such) the font inclusion could also
+ be done by a \LUA. This was made possible by the fact that we already had
+ support for variable fonts. More tricks are possible and will be explored.
+\stopitem
+\startitem
+ Finally the \PDF\ file construction and \PDF\ object management had to be
+ implemented. This was actually the easiest part.
+\stopitem
+\stopitemize
+
+Performance wise the \LUA\ font loader is faster than the built in one. The same
+is true for \PDF\ inclusion but in practice that is unnoticeable. Bitmap
+inclusion is currently slower for interlaced images (seldom used in print) and
+just as efficient for other types. The page stream constructor is definitely
+slower but this is compensated by the faster font inclusion and \PDF\ file
+construction. Of course it all depends on the kind of content, but these are the
+observation as of fall 2018. Anyway, they were enough reason to continue this
+experiment.
+
+One thing to keep in mind is that the smaller the binary and the less code paths
+we have, the better future performance might be. Computers are not becoming much
+faster for single thread processes like \TEX, so the less we jump around code
+space (memory) the better it probably is for \CPU\ caching (as caches are not
+growing much either).
+
+\stopsection
+
+\startsection[title={Conclusion}]
+
+Normally when writing this kind of code I make sure that I can enable such new
+mechanisms on top of others but at some point one has to decide how to really
+integrate them. For instance, we can do font inclusion independent of \PDF\
+generation or page stream construction independent of \PDF\ generation and|/|or
+font inclusion but in the end that doesn't make sense and makes the code base a
+bit of a mess. So, this is how it will go.
+
+Stock \LUATEX\ with \MKIV\ will use the normal backend but probably there might
+be an option to overload the built|-|in image inclusion so that one can avoid the
+abortion of a run in case of problematic images. Complete \PDF\ file
+construction, which then also includes page stream construction, font embedding
+and object management might be available as option for \MKIV\ with \LUATEX\ 1.10
+(for a while) but will be default when using \LUAMETATEX. When we move on \LMTX\
+support might evolve in more sophisticated trickery. \footnote {A few months
+later I decided that this made no sense, and that it was cleaner to just leave
+that approach for \LMTX\ only. So, now both engines use different code
+exclusively.}
+
+Once tested a bit in real documents experimental code will end up in the
+distribution. That code can then be turned into production code (read: cleaned up
+and reshuffled a bit). We can streamline the engine code base: strip the
+components that are not needed any more, remove some obsolete features, optimize
+the code, strip some functions from \LUA\ libraries, rename some helpers, and
+finally add some documentation. There are some plans to extend \METAPOST\ so also
+things can get added. Concerning the \LUA\ interface it means that \type
+{slunicode} is removed, the embedded socket related \LUA\ code goes external (but
+the library stays), the font loader gets removed, the \type {img} library goes
+away, no longer \PNG\ libraries are embedded, synctex is stripped out (but the
+fields in nodes stay or get extended). \footnote {Much later I also decided to
+remove the zip file reader library.} The resulting binary will be much smaller
+and the code base more independent and smaller too. In the process \LUAJIT\
+support might be dropped as well, simply because it no longer is in sync with
+stock \LUA, but that also depends on how complex long term maintenance becomes.
+\footnote {As we will see in following chapters, indeed support for \LUAJIT\ has
+been dropped while \LUA\ got upgraded to 5.4.}
+
+Because such a stripped down binary is no longer what got presented as \LUATEX\
+version~1, it will basically become \LUATEX\ version 2, but then we have the
+problem that its binary name clashes with the original. This is why it will be
+run as \typ {luametatex}. For \CONTEXT\ it's not that relevant as it will run on
+both \LUATEX\ 1.10 and its lean and mean successor. I might also provide a plain
+\TEX\ (read: generic) version but that is to be decided because it probably
+doesn't make much sense to spend time on it. As usual we will test this within
+the \CONTEXT\ beta program. The good thing is that it doesn't interact with
+\LUATEX, so that other macro packages are not affected. Another side effect can
+be that we uncover issues with \LUATEX\ 1.10 and that we can experiment with some
+improvements that we feed back into the parent.
+
+At the \CONTEXT\ end of this there are some plans to extend the export, maybe
+improve already present \PDF\ tagging (if found useful), add some more input
+(xml) manipulations, and maybe extend (virtual) font handling a bit, now that we
+no longer are bound to the currently used packet model. Contrary to what one
+might expect this is not really dependent on the engine.
+
+How do we proceed? As with the transition from \MKII\ to \MKIV, it will all
+happen stepwise. This means that for a while the code base will be a bit hybrid
+but at some point it might be partially split to make things cleaner, not that I
+expect many fundamental differences (certainly not in the front|-|end). This
+dualistic approach means more work but also makes that we keep a working
+\CONTEXT. We also need to keep an eye on for instance generic commands as used in
+tikz: we can't drop them so we emulate them (so far with success). As the time of
+this writing, begin November 2018, the \CONTEXT\ test suite can be processed in
+\LMTX\ mode without problems so I'm confident that it will work out ok. The next
+chapter describes the results of how we did the above in more detail.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-feedback.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-feedback.tex
new file mode 100644
index 00000000000..d77ef302c9b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-feedback.tex
@@ -0,0 +1,306 @@
+% language=us
+
+\startcomponent followingup-feedback
+
+\environment followingup-style
+
+\logo [AMD] {AMD}
+\logo [INTEL] {Intel}
+
+\startchapter[title={Feedback}]
+
+\startsection[title={Introduction}]
+
+As \LUATEX\ 1.10 is basically frozen in terms of functionality not much can or
+will be added. But it made sense to some of the (small) improvements that were
+made in \LUAMETATEX\ got feedback to \LUATEX\ (or will be at some point). Because
+we are also experimenting, there can be a delay. \footnote {Later chapters
+mention a few more possible extensions.}
+
+Of course the question is \quotation {Should we feedback (retrofit) at all?}. I'm
+still not sure about it. There should be a good reason to do it because it can
+harm stability of the original. At some point \CONTEXT\ can default to the follow
+up in which case testing the original becomes more difficult for specific
+features. I never ran into (useful) demands for extensions so retrofit can have a
+low priority.
+
+Another factor is that when distributions start adding stuff to stock \LUATEX\ on
+top of what is our default (after all isn't that what happens with open source
+projects), it makes not much sense to look back and retrofit new functionality,
+because there is not much change that we will use such a variant ourselves and we
+could introduce errors in the process. Providing bloatware is not our objective.
+
+Related to this is the question if we should always go into \LMTX\ mode and I'm
+no longer sure if we shouldn't do that. We can use plain \TEX\ with the regular
+\LUATEX\ backend and just forget about some generic framework. The danger of it
+backfiring is just too large. It is a waste of time and will keep us back.
+
+One reason for a dual mode is that it made possible some timings in order to
+determine bottlenecks. I did some rough tests and that is enough to get the
+picture. Take this document:
+
+\starttyping
+\starttext
+ \dorecurse
+ {1000}
+ {\samplefile{sapolsky} {\bf\samplefile{sapolsky}}\par}
+\stoptext
+\stoptyping
+
+Using regular \LUATEX\ this takes on an \INTEL\ i7-3840 mobile processor about
+9.3 seconds while \LUAMETATEX\ needs 11.2 seconds, so we loose time. This is
+because we have only text so the native backend wins on piping out the page
+stream. On my domotica fitlet with an low power \AMD\ A10 processor running
+\LINUX\ the runtime goes from 25.4 seconds to 27.8 seconds, so again a slow down.
+
+But this is not a typical document! Add a bit more spice and the numbers reverse.
+For processing the \LUATEX\ manual stock \LUATEX\ takes 12.6 seconds on the
+\INTEL\ and \LUAMETATEX\ needs 12.4 seconds. On the \AMD\ runtime goes from 35.1
+seconds down to 32.8 seconds. So here we win some.
+
+These are rough timings and a few weeks later we go these timings on the \INTEL:
+\footnote {On the more modern gaming laptop of a nephew we measured half these
+numbers.}
+
+\starttabulate[|l|c|c|c|]
+\BC engine \BC backend \BC runtime \BC \LUAJIT\ vm \BC \NR
+\HL
+\NC \LUATEX\ 1.10 \NC normal \NC 12.4 \NC 9.9 \NC \NR
+\NC \LUATEX\ 1.10 \NC lmtx \NC 12.7 \NC 9.8 \NC \NR
+\NC \LUAMETATEX\ 2.00 \NC lmtx \NC 12.2 \NC 9.3 \NC \NR
+\stoptabulate
+
+Because we have more \LUA\ code active, we pay a price with \LMTX\ but not on
+\LUAMETATEX\ (as of now, later we will see a performance bump). The gain when
+using the \LUAJIT\ virtual machine is more noticeable. And, there is probably
+some more to gain. In case you wonder why this matters: think of the low power
+\AMD\ processor. When we have to replace computers we can consider using low
+power ones, with weaker processors, less memory, and less cache. For the record:
+I use cross compiled \MINGW\ binaries on windows (they are quite a bit faster
+than native windows binaries). And the binaries are less than 3MB (small files
+and less resources are nice when running on remote file systems).
+
+This all indicates that we have no real reason to stick to a mixed approach: if we
+want we can just switch to always \LMTX\ and never look back.
+
+\stopsection
+
+\startsection[title={Expressions}]
+
+When writing an article that involved using a \type {\numexpr} it struck me that
+we should have a proper integer division. Just compare these:
+
+\startbuffer[1]
+\the\numexpr 13/2\relax
+\stopbuffer
+
+\startbuffer[2]
+\scratchcounter13 \divide\scratchcounter 2 \the\scratchcounter
+\stopbuffer
+
+\typebuffer[1]
+
+and
+
+\typebuffer[2]
+
+This gives {\bf \inlinebuffer[1]} and {\bf \inlinebuffer[2]}. We now also have:
+
+\startbuffer[3]
+\the\numexpr 13:2\relax
+\stopbuffer
+
+\typebuffer[3]
+
+which gives {\bf \inlinebuffer[3]}. I considered using a double slash (as in
+\LUA) but using a colon is easier. Of course those who make that an active
+character are probably toast. This is an easy patch but it's hard to predict
+possible side effects outside \CONTEXT.
+
+\stopsection
+
+\startsection[title={Looking ahead}]
+
+Sometimes you want to look ahead and act upon the presence of a specific
+character. Implementing that in pure \TEX\ primitives is no big deal, but
+especially when you want to ignore leading spaces it leads to rather verbose code
+when tracing is enabled. Out of curiosity I played with a primitive that can help
+us out. Although there is also a performance gain, in practice one will not
+notice that unless such a feature is used millions of times, but in that case the
+gain is noise compared to the rest of the run.
+
+\startbuffer
+\def\foo{\futureexpand/\fooyes\foonop}
+\def\fooyes/#1/#2{[#1:#2]}
+\def\foonop #1{(#1)}
+
+\foo/yes/{one}\quad
+\foo {two}
+\stopbuffer
+
+\typebuffer
+
+We either expand \type {\fooyes} or \type {\foonop}, depending on the presence
+of a \type {/} after \type {\foo}. So, the result is:
+
+{\tttf\getbuffer}
+
+The next examples demonstrates two variants. The second one doesn't inject spaces
+back into the stream.
+
+\startbuffer
+\def\f<{\futureexpand/\y\n}
+\def\y/#1/{#1}
+\def\n {}
+
+(\f</yes/>)\quad
+(\f< >)
+\stopbuffer
+
+\typebuffer
+
+Watch the space in the \type {\n} case.
+
+{\tttf\getbuffer}
+
+\startbuffer
+\def\f<{\futureexpandis/\y\n}
+\def\y/#1/{#1}
+\def\n {}
+
+(\f</yes/>)\quad
+(\f< >)
+\stopbuffer
+
+\typebuffer
+
+This time the space is not injected (\type{is} is short for ignore spaces).
+
+{\tttf\getbuffer}
+
+I will probably use this one in \CONTEXT, but as said, not for performance
+reasons but because it reduces code and therefore tracing. \footnote {In the
+\CONTEXT\ code base there are several places where less code takes precedence
+over efficiency. But in all cases extensive tests were done to see if it made a
+dent in practical performance.}
+
+\stopsection
+
+\startsection[title={Checking numbers an dimensions}]
+
+The \CONTEXT\ user interface often uses parameters that take keywords as well as
+a number or dimension. In practice it has never been an issue to check for that but
+there are a few cases where we'd like to be a bit more flexible.
+
+\startbuffer
+\doifelsenumber{123999999999999999}YN
+\doifelsenumber {123}YN
+\doifelsenumber {A}YN
+\doifelsenumber {\char123}YN
+\doifelsenumber {\toks123}YN
+\doifelsenumber{123\scratchcounter}YN
+
+\doifelsedimension{123999999999999999pt}YN
+\doifelsedimension {123pt}YN
+\doifelsedimension {A}YN
+\doifelsedimension {\char123}YN
+\doifelsedimension {\toks123}YN
+\doifelsedimension {123\scratchdimen}YN
+\stopbuffer
+
+\typebuffer
+
+This typesets:
+
+\startpacked
+\getbuffer
+\stoppacked
+
+especially the \type {123\scratch...} checking is tricky. For that reason we now
+have two new built|-|in checkers. Again, performance is not one of the arguments,
+because these checks are not much faster than what we have already, they are just
+a bit more robust for weird cases. A possible use of the primitives is:
+
+\starttyping
+\ifdimen123\or
+ yes
+\else % or \or
+ no
+\fi
+\stoptyping
+
+and:
+
+\starttyping
+\ifnumber123\or
+ yes
+\else % or \or
+ no
+\fi
+\stoptyping
+
+When a valid number or dimension is gobbled, the value pushed in the branches
+is~1, and when an error is encountered the value~2 is pushed. Deep down we have
+just an \type {\ifcase} and by not using the value zero we nicely skip the
+invalid code. It might look a bit weird but we need a sentinel for the number
+(and the \type {\or} serves as such, without introducing strange new constructs.
+We'll see if we keep it (as testing must prove its usefulness).
+
+\stopsection
+
+\stopsection
+
+\startsection[title={Comparing tokens}]
+
+The following code compares (for instance) two strings:
+
+\starttyping
+\def\thisorthat#1#2%
+ {\edef\one{#1}
+ \edef\two{#2}
+ \ifx\one\two
+ this%
+ \else
+ that%
+ \fi}
+
+\thisorthat{foo}{bar}
+\stoptyping
+
+but this looks a bit cleaner (in a trace):
+
+\starttyping
+\def\thisorthat#1#2%
+ {\iftok{#1}{#2}%
+ this%
+ \else
+ that%
+ \fi}
+
+\thisorthat{foo}{bar}
+\stoptyping
+
+It's not that much faster (unless one uses it a real lot) as similar things have
+to happen to get the test to work. But the nice things of this checker is that it
+works with token registers and macros too. But in order use it in relevant places
+in \CONTEXT\ I would have to adapt quite some code. This could actually be a
+reason for a \MKIV\ freeze and \LMTX\ code base (as with \MKII). The question is:
+does it pay off?
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
+
+% \newbox\mybox \setbox\mybox\ruledhbox{\blackrule[width=3cm,height=1cm]}
+
+% \dontleavehmode\copy\mybox\quad \ruledhbox{\copy\mybox} \blank[3*line]
+% \boxxmove\mybox 10pt
+% \dontleavehmode\copy\mybox\quad \ruledhbox{\copy\mybox} \blank[3*line]
+% \wd\mybox\dimexpr\wd\mybox+10pt\relax
+% \dontleavehmode\copy\mybox\quad \ruledhbox{\copy\mybox} \blank[3*line]
+% \boxymove\mybox 10pt
+% \dontleavehmode\copy\mybox\quad \ruledhbox{\copy\mybox} \blank[3*line]
+% \ht\mybox\dimexpr\ht\mybox+10pt\relax
+% \dontleavehmode\copy\mybox\quad \ruledhbox{\copy\mybox} \blank[3*line]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-introduction.tex
new file mode 100644
index 00000000000..c4a5920bdf4
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-introduction.tex
@@ -0,0 +1,104 @@
+% language=us
+
+\startcomponent followingup-introduction
+
+\environment followingup-style
+
+\startchapter[title={Introduction}]
+
+This document, the fifth in a series, describes the follow up project on
+\CONTEXT\ \MKIV\ & \LUATEX\ which carries the working title \CONTEXT\ \LMTX. This
+four letter acronym represents \LUA, \METAPOST\ and \TEX, and if you want you can
+see the last character representing \XML, as that has been an integral part of
+\CONTEXT\ for a long time. But the \quote {x} can also be found in \quote
+{experimental}, \quote {extreme}, \quote {experience} and \quote {extravagant},
+so take your choice.
+
+Of course \CONTEXT\ is and will be a typesetting system using the \TEX\ language
+and typesetting core, but a rather substantial amount of the functionality is a
+hybrid of \TEX\ macros and \LUA\ code. The built|-|in graphic support is driven
+by \METAPOST, but there we also use \LUA\ as an extension language. The \LUA\
+machinery is used for alternative input and handling data too. The same is true
+for \XML, \SQL, \CSV, \JSON, etc.
+
+The output from \CONTEXT\ is normally \PDF\ and \MKIV\ doesn't even enable \DVI\
+output. Mid 2018 I started experimenting with a backend that no longer used the
+one provided by the engine. After all, we only used page stream building, font
+embedding and bitmap inclusion and all other features were always done in \LUA.
+The experiments also concerned a \METAPOST\ and \LUA\ backend. Those familiar
+with \CONTEXT\ know that there is already an export feature which till now runs
+in parallel with the \CONTEXT\ \PDF\ backend (it started as a kind of joke but in
+the end was seen as relevant and kept and maybe so some point I will rewrite that
+code).
+
+The idea behind \CONTEXT\ \LMTX\ is that we will use a minimalist engine. Being
+minimalist also means that probably only \CONTEXT\ will use it and therefore no
+other package will be affected by further experiments, although at some point a
+sort of general low level layer might be provided. The frontend is mostly the
+same as \LUATEX\ 1.1 but the backend and related code is gone and|/|or different.
+Libraries have (and are) being cleaned up and reorganized too. At least for a
+while, \CONTEXT\ will work on \LUATEX\ 1.1 (stable) as well as its (experimental)
+follow up, where the follow up will evolve over a few years and be tested in the
+usual \CONTEXT\ (garden) beta setting. The next chapters will explain this in
+more detail.
+
+Just to be clear I repeat: \LUATEX\ 1.1 will be supported by \CONTEXT\ and
+maintained as usual, including binaries generated on the \CONTEXT\ garden. We've
+invested many years in it and it serves its purpose well, but our experiments
+will happen in its follow up, so that it doesn't affect stable workflows. Of
+course there have been (and probably are) bugs in \LUATEX\ but the engine could
+be used pretty well right from the start with \CONTEXT. The same will be true for
+the follow up.
+
+One of the ideas of the follow up is to provide a combination of a stable engine
+independent of libraries with a relative simple compilation setup and a macro
+package that has proven to exploit a mix of \TEX, \METAPOST\ and \LUA. As a side
+effect I can explore some postponed ideas. Of course there can be valid reasons
+to move to the successor sooner. In that case we might create a stable snapshot
+of \MKIV\ as was done with \MKII. As to be expected in \CONTEXT, the user
+interfaces won't change nor will the functionality, but there will be two code
+paths, one for \MKIV\ and one for \LMTX. There will also be new functionality in
+\CONTEXT\ that is only available in \LMTX. So, eventually we expect all users to
+migrate.
+
+In the beginning of december 2018 most of the work was done and users involved in
+development could start testing. By the end of the year a reasonable stable state
+was reached. In 2019 the code base was further overhauled and libraries got
+upgraded. The code base became smaller and compilation easier, smoother and much
+faster. Eventually the source code (now some 11MB uncompressed and 3MB
+compressed) will be part of the \CONTEXT\ distribution, so that we have a
+complete package (also in the archival sense).
+
+The next chapters discuss the process and choices that were made. The chapters
+were written in order so later chapters can amend earlier ones. Consider it a
+history, and one cannot cheat by patching history. In some cases footnotes were
+added to earlier chapters when writing later ones. It's not a manual! Reported
+typos (for sure there are many) will be fixed but changes in later versions of
+the follow discussed here will not end up in this document.
+
+This document is dedicated to Wolfgang Schuster, who has been instrumental in the
+transition from \MKII\ to \MKIV, and often baffles me with his knowledge of the
+(even obscure bits) of the \CONTEXT\ internals. Without him checking the code
+base, fundamental changes like those that are and might get introduced in this
+follow up are impossible.
+
+I want to thank Alan Braslau who accompanies me on this journey and patiently
+compiles the lot for some platforms. He, Thomas Schmitz and Aditya Mahajan are
+examples of power users who also are early adopters of something new like this
+and are willing to take the risks. And of course there is Mojca Miklavec without
+whose enthusiasm and optimism developments like this would never take place. In
+the meantime Luigi Scarso made sure that the (frozen) \LUATEX\ code base served
+existing users. It is hard to tell how users experience the transition: there are
+no that many issues reported which can be a good or bad sign. We will see.
+
+\blank[2*big]
+
+\startlines
+Hans Hagen
+PRAGMA ADE, Hasselt NL
+August 2018\enspace\endash\enspace May 2019
+\stoplines
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-logging.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-logging.tex
new file mode 100644
index 00000000000..e82df3c04ef
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-logging.tex
@@ -0,0 +1,58 @@
+% language=us
+
+\startcomponent followingup-logging
+
+\environment followingup-style
+
+\startchapter[title={Logging}]
+
+\startsection[title={Introduction}]
+
+In \CONTEXT\ we have quite some logging enabled by default and even more when
+you enable trackers. Most logging is done with \LUA, which is quite efficient.
+Information from the \TEX\ machinery follows a different path and one reason
+for that is that it often happens on a character (or small strings) basis.
+
+The runtime of a job is, in spite of what one may expect, also dependent on the
+speed of the console: what fonts are used (there can be font features being
+applied), is the output buffered, and with what delays, how large is the history,
+etc. When more complex fonts arrived I found out that on \OSX\ generating a
+format was impacted by seconds. When on \MSWINDOWS\ the normal console was used
+its character|-|by|-|character flushing made it sluggish, and on \LINUX\ it
+depended on the font, kind of console, delays, etc. Lucky me, the \SCITE\ editors
+log pane beats them all. \footnote {I use the \LINUX\ subsystem on \MSWINDOWS\
+for cross compiling \LUATEX, and with the advent of that subsystem the regular
+console was also rewritten so most of the delays are gone now.}
+
+At the \TEX\ end a few decades of coding has made the system also complex.
+\footnote {Interfaces like that are only partly defined by \TEX\ and left to the
+implementation.} Each string goes through a mechanism that checks with line
+ending to apply and where to cut off lines exceeding a preset maximum length,
+where \LUATEX\ also needs to take \UTF\ into account. Some characters can
+(optionally) be escaped with \type {^^} and occasionally the line length gets
+reset by explicit newline commands.
+
+In \CONTEXT\ already for a long time we always used an (at least) 10K line length
+and disabled output escaping. We have consoles that can handle long lines and
+live in an \UTF\ world so escaping makes no sense. And, when \OPENTYPE\ features
+get applied random line breaks can interfere badly. Just in case one wonders what
+happens with so called \type{null} characters: as all goes through \CCODE\
+anyway, such a character just terminates a string. Therefore the line length
+limitations have been removed and the line|-|ending substitution be optimized. In
+principle this gives simpler codes and less overhead.
+
+The log is not always compatible with \LUATEX. For instance we output more details
+about node lists. This is natural because we have more subtypes and these can
+provide additional information (clues) when debugging \TEX\ code.
+
+In \LUATEX\ the error handling is already such that some can be delegated to
+\LUA, and later I will look into more isolation. But, error handling is quite
+interwoven in the code and I don't want to mess up the original concept too much.
+\footnote {Indeed the error handling was redone in such a way that we now have an
+even better isolation.}
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-lua.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-lua.tex
new file mode 100644
index 00000000000..f0f3350a3e0
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-lua.tex
@@ -0,0 +1,151 @@
+% language=us
+
+\startcomponent followingup-lua
+
+\environment followingup-style
+
+\startchapter[title={\LUA}]
+
+\startsection[title={Move to 5.4}]
+
+Another experiment concerned testing \LUA\ 5.4 which looks like a minor update in
+terms of new functionality but has some consequences. By now the old module model
+is even more deprecated and compatibility mode no longer makes much sense. As a
+consequence we now need to adapt the way libraries are loaded (and we use global
+ones) and a few other low level calls had to be adapted. This is no real issue
+and once that was done, I found out that the bit32 module was even more obsolete
+so I decided to get rid of it. We already have a bit32 replacement in \CONTEXT\
+so I had to enable that. As \CONTEXT\ doesn't need compatibility mode it was no
+problem to drop that too.
+
+The biggest changes in 5.4 are under the hood: some optimized byte code and a new
+generational garbage collector. I did a few runs and a 12.4 seconds run on the
+manual now dropped to around 12.1 and given that we spend (probably) more than
+half the time in \LUA\ that means some 5\% gain in performance. This is still
+more than the 9.6 seconds that \LUAJIT\ needs but it looks like every \LUA\
+release gains a bit and I'm pretty sure that there is more to gain. \footnote {In
+the meantime there are experiments in 5.4 with \type {<const>} directives which
+might have advantages.}
+
+An interesting experiment was to disable the automatic string to number
+conversion when a number is expected but a string is needed. So far I only had to
+adapt two lines of code in the in the meantime considerable amount of \LUA\ code
+that comes with \CONTEXT.
+
+\stopsection
+
+\startsection[title={No more \LUAJIT}]
+
+One thing I had to consider was the future of \LUAJIT. This project is sort of
+stalled and will not follow \LUA\ development. Now, to some extend we can deal
+with this but with the faster \LUA\ 5.4 around the corner, the limitations of
+\LUAJIT\ with respect to loading large tables, as well as the fact that we need a
+patched hash function to get an advantage over regular \LUA\ anyway, it makes
+sense to drop it in \LUAMETATEX. After discussing this with Alan, who crunched
+numbers in order to make impressive graphics with \METAPOST, we came to the
+conclusion that we should not overestimate the benefits. There is still a gain
+but removing the need to support both could also makes it possible to improve
+existing code (although one should not expect too much from that; it's more a
+matter of convenience for me). Also, for as long as have \LUAJITTEX\ that is
+still an option when one has to squeeze out every second.
+
+A valid question is if ditching \LUAJIT\ will harm users. The answer to this
+depends on the kind of documents that you process. Given decent programming, you
+can gain quite a bit of runtime, but on the average the difference is not that
+large. There is for instance always the overhead of callbacks and crossing the so
+called \CCODE\ boundary that has an impact.
+
+\stopsection
+
+\startsection[title={Performance}]
+
+At the time of writing this Thomas Schmitz was wondering if there was a
+significant difference in runtime between the table mechanisms and especially
+natural tables and extreme tables. Some test demonstrated that extreme tables
+were best for his case. That case concerned generating about 400 pages of tables
+from \XML\ files, including some juggling of data in \LUA. The bottleneck in that
+document can be roughly simulated with the following test. We assume one pass
+over the table but in practice there are upto four, but only the last one has
+frames. So, the test concerns 80.000 (400 pages with 40 rows of 5 columns) calls
+to \type {\framed}.
+
+% 400 pages : 5 cells * 40 rows = 80000 framed
+
+\starttyping
+1 \hpack{\framed {oeps}}
+2 \hpack{\framed[frame=off] {oeps}}
+3 \setupframed[frame=off] \hpack{\framed {oeps}}
+4 \hpack{\framed[frame=on] {oeps}}
+5 \setupframed[frame=on] \hpack{\framed {oeps}}
+6 \hpack{\framed[frame=closed]{oeps}}
+7 \setupframed[frame=closed] \hpack{\framed {oeps}}
+\stoptyping
+
+\starttabulate[|c|c|c|c|]
+\HL
+\BC sample \BC luatex & mkiv \BC luajittex & mkiv \BC luametatex & lmtx \BC \NR
+\HL
+\NC 1 \NC 17.3 \NC 16.8 \NC 13.5 \NC \NR
+\NC 2 \NC 17.8 \NC 17.2 \NC 14.0 \NC \NR
+\NC 3 \NC 17.3 \NC 16.8 \NC 13.3 \NC \NR
+\NC 4 \NC 17.9 \NC 17.4 \NC 13.7 \NC \NR
+\NC 5 \NC 17.4 \NC 17.1 \NC 13.3 \NC \NR
+\NC 6 \NC 17.4 \NC 16.8 \NC 12.9 \NC \NR
+\NC 7 \NC 16.4 \NC 16.0 \NC 12.6 \NC \NR
+\HL
+\stoptabulate
+
+Even if we add the usual .1 second interval around these values it will be clear
+that we gain enough not to worry about the loss of \LUAJIT, also because the gain
+is not in the \LUA\ part only. A nice consequence of this is that when we replace
+the \CPU's in a server with low power ones that perform 25\% less, we can
+compensate that by using \LMTX. \footnote {There's still room for improvement,
+because mid July 2019 we're at 12.9, 13.2, 12.9, 13.5, 13.0, 12.5 and 12.2
+seconds or less. But don't expect too many miracles.}
+
+When wrapping this up, the \LUATEX\ manual processed with \LMTX\ took slightly
+less than 11.9 seconds, compared to a normal run of 12.6 seconds, so we're
+gaining some there too. And just after I wrote this we went down to 11.7 seconds
+by (as experiment) changing the \LUA\ virtual machine dispatcher, so there is
+still some to gain. In the energy saving fitlet with small amd processor
+processing the manual with stock \LUATEX\ takes about 37 seconds, but 33.5 with
+\LMTX\ so here also we're not off worse.
+
+\stopsection
+
+\startsection[title={Modules}]
+
+Right from the start \LUATEX\ had some extra libraries linked in: \type {md5}
+(for hashing), \type {lfs} (for accessing file properties), \type {slunicode}
+(for basic \UTF\ handling), \type {gzip} and \type {zlib} (for zipping files and
+streams), \type {zip} (for accessing zip files) and \type {socket} (for
+communicating other than with files).
+
+In \LUAMETATEX\ the not so useful \type {slunicode} library was removed pretty
+early but the others stayed around. The more backend specific \type {img} and
+\type {pdf} libraries went away too, as did the (already not used) \type
+{fontloader} library. The \type {kpse} library is also gone, as we do those
+things in \LUA. The \type {epdf} library was kept. A couple of libraries were
+added, like \type {sha2}, \type {basexx}, and \type {flate}, plus a few handy
+helper libraries that are still experimental and therefore not mentioned here.
+
+The \type {flate} library is also an experiment but will replace the \type {gzip}
+and \type {zlib} libraries. Currently these use \type {libz} but \type
+{libdeflate} will be the low level replacement once it support streams and is
+already used for \type {flate}. The \type {md5} library has been redone using
+utility code \type {pplib}, as \type {sha2} does. The type {basexx} library also
+falls back on utility code form \type {pplib} (that code is actually
+independent).
+
+The \type {lfs} code has been replaced by a variant that omits features not
+common to the platforms and with a iterator that permits much faster directory
+scans and has a few more helpers. It is not compatible but we kept the name
+because of legacy usage. I might strip the socket code to what is actually used,
+but on the other hand: don't touch what works well. The original code doesn't
+change that much anyway.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-mp.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-mp.tex
new file mode 100644
index 00000000000..22e8e8356dc
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-mp.tex
@@ -0,0 +1,166 @@
+% language=us
+
+\registerctxluafile{mlib-scn}{}
+
+\startcomponent followingup-mp
+
+\environment followingup-style
+
+\startchapter[title={\METAPOST}]
+
+\startsection[title={Introduction}]
+
+Relatively late in the followup I started wondering about what to do with \MPLIB.
+Alan Braslau is working on the \type {luapost} module and we discuss handy
+extensions written in \LUA\ and \METAPOST\ code but who knows what more is
+needed. Some ideas were put on delay but it looked like a good moment to pick up
+on them. One problem is that when we play with the \MPLIB\ code itself in
+\LUAMETATEX, the question is how to keep in sync with the official library. In
+this chapter I'll discuss both: keeping up with the official code, and keeping
+ahead with ideas.
+
+\stopsection
+
+\startsection[title={The code base}]
+
+The \MPLIB\ code is written in \CWEB\ and lives in files with the suffix \type
+{w}. These files need to be converted to \type {c} and \type {h} files, something
+that is done with the \type {ctangle} program. To avoid that dependency I just
+took the \CCODE\ files from \LUATEX, but I had to apply a few patches (to get rid
+of dependencies). Now, it is a fact that \METAPOST\ doesn't really develop fast and
+in principle a diff could identify the changes easily. So, why shouldn't I also
+start experimenting with \MPLIB\ itself in the follow up? It's easy to merge
+future changes (in both directions).
+
+The first thing I wrote was a \type {w-to-c} script. This was not that hard given
+that I already had written lexers. After a first prototype worked out well, I
+redid the code a bit (so that in the future I can also implement support for
+change files for instance). A complication was that I found out that the regular
+\CWEB\ converter messes around a bit with the code. So, I had to write another
+script to mimmick that to the level that I could compare the results. For
+example, spaces are removed before and after operators and all leading space gets
+removed too. When I got the same output I could get rid of that code and output
+what I want. For instance I'd like to keep the spacing the same because compilers
+can warn about some issues, like missing \type {;} and misleading indentation in
+simple \type {if} and \type {while} constructs where braces are omitted.
+\footnote {This is no problem in for instance \PASCAL\ where we always have a
+\type {begin} and \type {end}.} One can argue that this is not important, but if
+not, then why enable warnings at all. I had to fix half a dozen places in the
+\type {w} file to make the compiler happy, so the price was small.
+
+Once I had a more or less instantaneous conversion \footnote {Conversion of the
+\type {w} files involved took just over half a second at that time, currently it
+takes just over a quarter of a second, on a relatively old machine that is.} I
+got the same feeling as with the rest of the code: experimenting became
+convenient due to the fast edit|-|compile cycle. So, with al this covered I could
+do what I always had wanted to do: remove traces of the backends (including the
+full \POSTSCRIPT\ one), because they are actually to be plug|-|ins, and also get
+rid of internal font handling, which is bound to \TYPEONE\ (rendering) and small
+size \TFM\ (generating). With respect to that export: I wonder if anyone used
+that these days because even the Gust font project always had their own tool
+chain alongside \METAPOST. I could also void the hacks needed to trick the
+library in not being dependent of \type {png.h} and \type {zlib.h} headers, for
+which I had to use dummies. \footnote {The converter can load a file with patches
+to be applied but by now there are no patches.}
+
+It took a few days scripting the converter (most time went into getting identical
+output in order to check the converter which was later dropped), a few days
+stripping unused code, another day cleaning up the remaining code and then I
+could start playing with some new extensions. The binary has shrunk with 200KB
+and the whole \LUAMETATEX\ code base in compressed \type {tar.xz} format is now
+below 1.8MB while before it was above 2MB. Not that it matters much, but it was
+an nice side effect. \footnote {Size matters as we want to code to end up in the
+\CONTEXT\ distribution. It might grow a bit as side effect of adding some more
+features to \MPLIB.}
+
+What new extensions would show up was still open. Because Alan and I play with
+scanners it made sense to look into that. Error handling and logging has also
+been on my radar for a while. In the process some more code might be dropped, but
+actually the current version is still useable as library for a stand alone
+program, given that one reconstructs the \POSTSCRIPT\ driver from the dropped
+code (not that much work). Some configuration options are missing then but that
+could be provided as extensions (after all we can have change files.) On the
+other hand, wrapping code in \CONTEXT, like:
+
+\starttyping
+\starttext
+\startMPpage
+ ........
+\stopMPpage
+\startMPpage
+ ........
+\stopMPpage
+\stoptext
+\stoptyping
+
+will give a \PDF\ file that can be converted to all kinds of formats, and the
+advantage is that one has full font support. There is already a script in the
+distribution that does this anyway.
+
+\stopsection
+
+\startsection[title={Communication}]
+
+The first experiment concerns a change in the interfacing between the \METAPOST\
+and \LUA\ end. In the original library all file \IO\ is handled by the library
+itself. The filenames can be resolved via a callback. Once an instance is
+initialized, snippets of code are passed to the instance via the \type {execute}
+call. Log, terminal and error information is collected and returned as part of
+the return value (a table). This means that reporting back to the user has a
+delay: it can be shown {\em after} all code in the buffer has been processed. The
+code given as argument to \type {execute} is passed to the engine as (fake)
+terminal input, which nicely fits in the concept of interactive input, which
+already is part of the \METAPOST\ concept.
+
+In our follow up variant all file \IO\ goes via \LUA. This means that we have a
+bit more control over matters. In \CONTEXT\ we now can use the usual file
+handling code. One defines an \type {open_file} callback that returns a table
+with possible methods \type {close}, \type {reader} and \type {writer}, as in
+similar \LUATEX\ callbacks. A special file, with the name \type {terminal} is
+used for terminal communication. Now, when the \type {execute} command is
+handled, the string that gets passed ends up in the terminal, so the file handler
+has to deal with it: the string gets written to the handle, and the handle has to
+return it as lines on request. In \CONTEXT\ we directly feed the to be executed
+code into the terminal cache.
+
+It's all experimental and subject to changes but as we keep \CONTEXT\ \LMTX\ and
+\LUAMETATEX\ in sync, this is no problem. Users will not use these low level
+interfaces directly. It might take a few years to settle on this.
+
+The reports that come from the \METAPOST\ engine are now passed on to the \type
+{run_logger} callback. That one gets a target and a string passed. Where the
+original library can output stuff twice, once for the log and once for the
+console, in the new situation it gets output once, with the target being
+terminal, log file or both. The nice thing about this callback is that there is no
+delay: the messages come as the code is processed.
+
+We combine this logging with the new \type {halt_on_error} flag, which makes the
+engine abort after one error. This mechanism will be improved as we go. The
+interaction option \type {silent} hides some of the less useful messages.
+
+The overall efficiency of the library doesn't suffer from these changes, and in
+some cases it can perform even better. Anyhow, the user experience is much better
+with synchronous reports.
+
+Although not strictly related to \IO, we already has extended the library with
+the option to support \UTF-8, which is handy for special symbols, as for instance
+used in the \type {luapost} library.
+
+\stopsection
+
+\startsection[title={Scanning}]
+
+Another extension is more fundamental in the sense that it can affect the way
+users see \METAFUN: extending the user interface. It is again an example of why
+is having an independent code base has benefits: we can do such experiments for a
+long time, before we decide that (and how) it can end up in the parent (of course
+the same is true for the mentioned \IO\ features). I will not discuss these
+features here. For now it is enough to know that it gets applied in \CONTEXT\ and
+will provide a convenient additional interface. Once it is stable I'll wrap it up
+in writing.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-performance.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-performance.tex
new file mode 100644
index 00000000000..40eb1971d9c
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-performance.tex
@@ -0,0 +1,107 @@
+% language=us
+
+\startcomponent followingup-performance
+
+\environment followingup-style
+
+\startchapter[title={Performance}]
+
+\startsection[title={Introduction}]
+
+Those who've read the other documents describing the development of \LUATEX, know
+that performance is always on my radar. A decent performance is a must for a
+useable workflow, especially because typesetting is a multi|-|pass process.
+\footnote {I'm often baffled by reports of (non|-|\CONTEXT) \LUATEX\ users about
+the performance of \LUATEX. It seems easier to blame an engine than ones own
+macros or setup and most of those tests make no sense anyway. Believe it or not,
+but if performance of \CONTEXT\ \MKIV\ was much worse than \MKII\ (using \PDFTEX\
+or \XETEX) it would have backfired and the project would never have taken of.
+Just think of this: would Hans really use \LUATEX\ and continue with development
+if it were that slow?} One page reference changing from two digits to three
+digits can influence whatever follows and we're not only talking of a different
+page break, even a change in line breaks can have consequences. The core engine
+cannot be made much faster. When the (single core) run has the whole cpu
+available not much can be gained. But multiple processes are run at the same
+time, the cache has to be shared and misses can become an issue. So, efficiency
+of code is still important. Occasionally a (tiny) improvement can be made, but
+only the accumulation of such improvements can make a dent. The feeling is that
+over time \LUATEX\ has not become slower but we keep an eye on possible other
+improvements. The memory footprint is also something to keep an eye on. \footnote
+{Of course this is all becoming less relevant now that having e.g. a browser open
+in the background will set you back with a constant 5\endash10\% cpu load and
+slowly accumulating gigabyte memory usage. That actually was something I had to
+keep in mind when running \LUAMETATEX\ benchmarks.}
+
+The more we delegate to \LUA, the less we can benefit from for instance \CPU\
+improvements: in that case the \LUA\ virtual machine is the bottleneck. And there
+is not much we can do about that. This also means that when we delegate more to
+\LUA\ we sacrifice performance. Sometimes things can be done more efficient in
+\LUA, but those are often tasks that are not performed frequently. That said, I'm
+convinced most of the \CONTEXT\ code is quite efficient and not much can be
+gained.
+
+The biggest change in \LUAMETATEX\ is the backend. We gain some efficiency in
+terms of speed, performance and output in some cases, while in other cases we
+loose a bit. On the average the small performance hit is bearable. Because
+\CONTEXT\ users don't complain about performance I think that I have some slack
+here.
+
+\stopsection
+
+\startsection[title={An example}]
+
+There are a few places where \LUATEX\ looks ahead to check something and goes back
+when the condition is not met. Take these:
+
+\starttyping
+\hbox {...}
+\hbox to 10cm {...}
+\hrule width 10cm height 10cm \relax
+\dimen0 =10cm
+\dimen0 10cm
+\mydimen 10cm
+\toks0 {...}
+\toks0 \toks2
+\stoptyping
+
+Spaces and sometimes \type {\relax} after the trigger (\type {\hbox}, \type
+{\dimen}, etc.) are skipped and in some case there can be an optional \type {=}
+sign. So, there are quite some cases where there is first a check for an optional
+equal which itself can be preceded by optional spaces. When there is no equal
+sign the last seen token is pushed back into the scanned which effectively means
+that a temporary token is allocated, and a one token list is pushed on the input
+stack. Then scanning goes on. The same can happen with the open brace in case of
+a token list assignment: it gets pushed back and the content scanned checks it
+again. In the case of keywords something similar takes place, because here
+\LUATEX\ checks explicitly for e.g.\ type {width}, and when it is not found again
+it pushes back consumed tokens and checks for the \type {width}. In the case of
+the specifiers of the box we don't need to check at all when we have an opening
+brace. In the follow up, when the \type {orientation} keyword was added, and the
+\type {dir} and \type {bdir} were replaced by \type {direction} a little bit more
+was optimized.
+
+In \LUATEX\ this code comes from \PDFTEX\ which takes if from \TEX, but in both
+cases some code side effects occur from the transition from \PASCAL\ to \CCODE.
+But, in \LUATEX\ we stick to the \CCODE, so we can try to get rid of these
+artifacts. During the last years, especially when additional keywords were
+introduces (for instance for attributes) already some optimization took place. In
+the follow up again some optimizations were applied, for instance quite often we
+can combine the check for an equal sign with skipping the spaces.
+
+The gain is not spectacular but as all small bits add up eventually it is
+measurable in a complex run. What definitely is true, is that we avoid some
+memory access which in turn might pay back when multiple runs happen in parallel.
+
+Of course one can argue that such optimizations are to be avoided but as long as
+they don't obscure the code, it's okay. After all, just as one optimizes for
+instance a compression algorithm or search routine, there is no reason not to
+mildly optimize some of the critical code in \LUATEX. And in \CONTEXT\ we have
+plenty of opportunities to check if that works out well. At some point some might
+be retrofit into \LUATEX\ 1.2 (or later). \footnote {But it makes less sense now
+that there are variants popping up that might depend on the stable base.}
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-rejected.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-rejected.tex
new file mode 100644
index 00000000000..f357c0ae536
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-rejected.tex
@@ -0,0 +1,83 @@
+% language=us
+
+\startcomponent followingup-rejected
+
+\environment followingup-style
+
+\startchapter[title={Rejected}]
+
+\startsection[title={Introduction}]
+
+During the development of \LUATEX\ some extensions were considered but rejected
+after some experiments. I already forgot about some that were tried the last
+decade. I will not discuss what has been added already to \LUATEX.
+
+\stopsection
+
+\startsection[title={Conditionals}]
+
+The \LUATEX\ manual describes a few conditional primitives that were added. One
+thing I played with was a native definer, think of \type {\idef} but in the end
+rejected it, because in practice it was seldom needed. Another useful one would
+be \type {\ifnothing} but the current implementation of \type {\ifx} is already
+pretty efficient so there is nothing to gain here. Another rejected one is \type
+{\ifxcase} which takes a token and compares that with a sequence, like
+
+\starttyping
+\ifxcase\foo\alpha
+\or\beta
+\or\gamma
+\else
+\fi
+\stoptyping
+
+As this was never available, in \CONTEXT\ already different strategies were
+followed so I could only find a few places where this could make code more
+readable. But who knows, I might change my mind when I split the code base and can
+adapt code accordingly although it doesn't make much sense for the more high
+level modules because it would only affect a few lines and maintaining duplicate
+files is no fun. \footnote {But playing with extensions that make for better code
+{\em is} fun.}
+
+\stopsection
+
+\startsection[title={Dimensions}]
+
+A primitive that returns the height plus depth would make sense (\type {hd}) but
+one can easily define one and the gain can be neglected. So, for now this has
+been rejected. Also, one can use the token scanners to implement that kind of
+primitives but of course that then does have a penalty in terms of performance.
+\footnote {Okay, in the end I decided to just add a primitive for this, but only
+as part of a larger set of box related primitives.}
+
+\stopsection
+
+\startsection[title={The something}]
+
+I played a bit with intercepting \type {\the} so that we could define commands
+that also respond to this expander. It didn't work out well because full
+expansion happens, even with protected macros:
+
+\starttyping
+\protected\def\foo{...] \the\foo
+\stoptyping
+
+We just have to accept this and it's no big deal.
+
+\stopsection
+
+\startsection[title={Primitives}]
+
+Occasionally I'm wondering if we should have a way to flag primitives and macros
+as being frozen but in the end it might not pay off. At some point I decided that
+at least the \type {\primitive} and \type {\ifprimitive} could go away as they
+are not really working as expected. It's better to have nothing than something
+bad. Also, we can easily clone the whole set of primitives in a new namespace
+with \LUA\ if we want. \footnote {But \unknown\ in the end we got something else
+back.}
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-retrospect.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-retrospect.tex
new file mode 100644
index 00000000000..b99185b77e1
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-retrospect.tex
@@ -0,0 +1,188 @@
+% language=us
+
+\startcomponent followingup-retrospect
+
+\environment followingup-style
+
+\startchapter[title={Retrospect}]
+
+% \startsection[title={Introduction}]
+% \stopsection
+
+At some point in a new development, and \LUAMETATEX\ feels like that, there comes
+a moment when you need to make a decision. In this case the question is if we
+need to make hybrid \MKIV\ and \LMTX\ files or do the same as with the transition
+from \MKII\ to \MKIV: use two variants. For \TEX\ files a conditional section has
+only overhead in the format generation as skipped code doesn't end up in the
+format. With conditional \LUA\ code it's different: the ignored section is still
+present in byte code. But even for \TEX\ code a conditional section is not
+entirely invisible: encountered control sequences are still creating (bogus) hash
+entries. So the question is: do we go lean and mean and do we omit historic
+non|-|\LMTX\ code?
+
+A comparison with the transition from \MKII\ is actually relevant. For instance
+right from the start \CONTEXT\ had an abstract backend layer, and support for
+engines and output formats was loaded on demand. There was never any specific
+code in the core. With \MKIV\ we changed the model but there is still some
+abstraction.
+
+In \MKII\ we also had to deal with encodings and that has consequences for
+font handling, language support and input encodings. In \MKIV\ all that changed:
+internal all is \UTF, as is normally the input (but we can still use encodings),
+and fonts are always mapped to \UNICODE.
+
+Anyhow, much that made sense for \MKII\ was no longer relevant for \MKIV: code
+could be dropped. But some mechanisms were reimplemented using \LUA: code was
+added. The user interface stayed the same but in \MKIV\ uses a conceptually
+different approach deep down. Therefore the code base was split in \MKII\ and
+\MKIV\ files but this transition was made stepwise.
+
+So should the same happen with \LMTX ? There is not that much that needs to be
+added to \MKIV\ in terms of functionality. In the end, for the \TEX\ code the
+differences are not that substantial, so there we can consider loading different
+files. The files involved are rather stable so there is not much danger of
+functionality between \MKIV\ and \LMTX\ getting out of sync. The same is true for
+the \LUA\ files, although synchronization is probably more an issue there.
+
+Another option is to always assume that \LUAMETATEX\ is used. For testing regular
+\LUATEX\ (patches) we can just use a 2019 stable \CONTEXT. But in order for users
+to benefit from developments we then expect them all to move on to \LMTX. Using a
+frozen 2019 version with upcoming \LUATEX\ is no big deal as we've done the same
+with \MKII\ and that worked out okay.
+
+When we started with \CONTEXT\ development in the previous century we were doing
+pretty weird things. I remember getting comments that what we did made no sense
+because it was not what \TEX\ was meant for and some even suggested that it
+disrupted the picture. Highly structured input, a clear separation (and
+abstraction) of front and backend, inheritance and user defined styling,
+integrated support for \XML, embedded \METAPOST, advanced interactive documents,
+handling of fonts en encodings, the list is long. Occasionally some of the things
+that came with \CONTEXT\ were ridiculed, like the fact that a script was used to
+manage the (multiple) run(s), but in the end, look at how many script are around
+now. Some even wondered why we used \TEX\ at all because \TEX\ was meant for
+typesetting math. And who needs \XML\ let alone \MATHML ? Or interactive \PDF\
+features? Much in \CONTEXT\ and its management got smoother over time and the
+\LUAMETATEX\ engine fits nicely into this evolution. It's hard to keep the
+cutting edge but at least we have the instruments.
+
+During \BACHOTEX\ 2019 (end of April, beginning of May) this project was
+presented the first time outside the \CONTEXT\ community. During that meeting
+Mojca Miklavec, one of the driving forces behind \CONTEXT, upgraded the compile
+farm that already was used to compile (intermediate versions of) \LUATEX\ and
+\TEXLIVE\ to also compile \type {pplib} (handy for development) and \LUAMETATEX.
+This permits us to fine|-|tune the \type {cmake} setup which is still work in
+progress. And, also further improvements take place in the code base itself.
+
+One of the properties of open source is that one can build upon an existing code
+base, so when at \BACHOTEX\ Arthur announced that he was going to make a merge of
+\XETEX\ (which he maintains) and \LUATEX\ no one was surprised. But it could be a
+strong argument for a rather strict code freeze: spin|-|offs need stability. I've
+been told that there are now several projects where more libraries (like
+Harfbuzz) get integrated. Those cases don't influence the parent but here
+stability of the original also is expected, unless of course additional features
+go in these engines, which itself creates instability, but that's another matter.
+One could actually argue that the arrival of variants defeats the argument that
+stability is important: if a macro package uses new features, it needs to adapt,
+and naturally (temporary) issues might show up. Such are the dynamics of todays
+software development. History in general shows that not that much is persistent
+(or even accumulative) and programs are probably the least, so maybe the whole
+stability aspect has lost its relevance. \footnote {In a similar way as that the
+argument \quotation {Publishers want this or that, so we as \TEX\ community need
+to provide it.} is no longer that relevant because publishing is now more a
+business model than vocation.} Of course \LUAMETATEX\ is also a follow up, but
+one of the ideas behind it was that I could use it as platform for (independent)
+experiments that could result in code being put into \LUATEX. Also, the changes
+have a limited impact: only \CONTEXT\ will be affected. \footnote {So maybe, in
+the end, stability boils down to \quotation {The engine behaves the same and the
+\CONTEXT\ that comes with it exploits its features as good as possible}.}
+
+It is not feasible to make \CONTEXT\ work with all kind of engines that in
+practice are not used by its users. For instance, after \XETEX\ showed up it went
+through several iterations or font rendering, so we never really spent time on
+the low level features that it provided (there was no demand anyway). One cannot
+simply claim that one method is better than another that replaces it and expect
+constant adaptation (probably for the sake of a few potential users). There
+simply is no \quote {best} engine and no \quote {perfect} solution. Another
+aspect is that when we would adapt \CONTEXT\ to \LUATEX\ variants the
+dependencies on specific functionality that itself depends on the outside world
+is kind of unavoidable. Especially languages and fonts are fluid and for the
+average user there is not that much difference in that department. Should we
+really complicate matters for a few (potential) users? In \CONTEXT\ support like
+that is added on demand, driven by specific needs of users who use \TEX\ for a
+reason and are willing to test.
+
+There's enough huge and complex software around that demonstrates what happens
+when programs are extended, keep growing, their code base becoming more complex.
+Such a process doesn't really fit in my ideas about for \TEX. We positioned 1.10
+as long term stable, with the option to add a few handy things in the long run.
+For sure there are niches to fill and it is a fact that the \TEX\ community can
+deal with variants of engines: just look at the different \CJK\ engines around,
+with prefixes like \type {p}, \type {up}, \type {ep}, etc. But the question is,
+where does that put further \LUATEX\ development? And, more important, what
+consequences does it have for the \CONTEXT\ code base?
+
+The reason I mention this is that I had in mind to eventually backport features
+that work out well in \LUAMETATEX. I also mentioned that in order to support
+stock \LUATEX\ it made no sense to split the \CONTEXT\ code base. After all, a
+few conditional sections could deal with the difference between \LUATEX\ and
+\LUAMETATEX: some differences could be temporary anyway. But, given recent
+developments it actually made sense to split the code base: why spent time on
+backporting when the engine user base is spread over different spinoffs. I can
+better just assume \CONTEXT\ to exclusively use \LUAMETATEX\ and that other macro
+packages use (one or more) \LUATEX\ variants. I can then keep the generic code up
+to date and maybe occasionally add some proven stable features. It is also no big
+deal to keep the minimum subset needed for (plain) font handling compatible,
+assuming \LUATEX\ compatibility, as in the end that engine is the benchmark,
+especially when I strip it a bit from features not needed outside \CONTEXT.
+
+Thoughts like this show how fragile plans and predictions are: within a year one
+has to adapt ideas and assumptions. But it also proves that \LUAMETATEX\ was a
+good choice for \CONTEXT, especially because it is bound to \CONTEXT\
+development, which keep the users independent and isolated from developments that
+don't mind that much the (side) effects on \CONTEXT.
+
+% \footnote {I mentioned stability a few times, but this aspect is somewhat vague:
+% often I see complaints about \LUATEX, or comparisons with other engines, that
+% have nothing to do with the engine per se, but more with misunderstanding and|/|
+% assumptions, strange usage, maybe or even likely bad user code, comparing apples
+% and pears, etc. The term \type {bug} is very popular and often a preferred
+% qualifications, and it sounds even more impressive when it's qualified as a bug
+% one. I guess that a more tight coupling between specific engines and macro
+% packages at least that aspect becomes cleaner.}
+
+Around the \CONTEXT\ meeting (or maybe a bit later) we hope to have the new
+installation infrastructure stable too (currently it is also experimental). By
+that time it will also be clear how we will proceed with the \LMTX\ project. In
+the meantime I have decided so put \LUAMETATEX\ specific files alongside the
+\MKIV\ files, simply because I always need to be able run stock \LUATEX. In order
+to show the close relationship these files are flagged as \MKXL, so we bump from
+\quote {Mark Four} to \quote {Mark Fourty}. The suffixes \type {mkiv}, \type
+{mkvi} and \type {mpiv} get company from \type {mkxl}, \type {mklx} and \type
+{mpxl}. Depending on backporting features, files can come and go. I'm not yet
+sure about the \LUA\ files but the \type {lmt} suffix is already reserved for
+future use. \footnote {This is because \LUA\ 5.4 introduces some new syntax
+elements and where we can get away with the difference between 5.2 (\LUAJITTEX)
+and 5.3 (\LUATEX) such a syntax change is more drastic.} All this is also driven
+by (user) demand.
+
+Consider this (and these thoughts) a snapshot. There will be the usual reports on
+experiments and developments. And in due time there will also be a manual for
+\LUAMETATEX. \footnote {In fact it already lives on my machine but I'm not in
+ready yet for the usual complaints about manuals, so I'm not in that much of a
+hurry.} And yes, at some point I have to make up my mind with respect to
+backporting features that have proven to be useful.
+
+% \footnote {Actually, it seems to come with the Internet: folks wining on whatever
+% platform about lack of documentation (most of the \CONTEXT\ distribution actually
+% is documentation and quite some articles are, have been, and will be written) or
+% possible bug (always huge, even if no bug at all) without exposing much actual
+% research or knowledge about these matters. Write, post and shout before thinking
+% it through, increase the number hits on your profile. It's for sure a way to make
+% something end up at the bottom of my to do list, if at all. A valid response
+% could be: whatever did you contribute to the community that I myself (or
+% \CONTEXT\ users) can benefit from. Quite likely: nothing (or little)! It looks
+% like even the normally friendly \TEX\ community sometimes gets infected by this.}
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-stripping.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-stripping.tex
new file mode 100644
index 00000000000..69af6376c4e
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-stripping.tex
@@ -0,0 +1,369 @@
+% language=us
+
+% 2,777,600 / 11,561,471 cont-en.fmt
+
+% Hooverphonic - Live at the Ancienne Belgique (Geike Arnaert)
+
+\startcomponent followingup-stripping
+
+\environment followingup-style
+
+\startchapter[title={Stripping}]
+
+\startsection[title={Introduction}]
+
+Normally I need a couple of iterations to reach the implementation that I like
+(an average of three rewrites is rather normal). So, I sat down and started
+stripping the engine and did so a few times in order to get an idea of how to
+proceed. One drawback of going public too soon (and we ran into that with
+\LUATEX) is that as soon as there are more users, one gets stuck into the
+situation that a different approach is not really possible. This is why from now
+on experimental is really experimental, even if that means: it works ok in
+\CONTEXT\ (even for production) but we can change interfaces be better, e.g.\
+more consistent (although we're also stuck with existing \TEX\ terminology).
+Anyway, let's proceed.
+
+\stopsection
+
+\startsection[title={The binary}]
+
+In 2014 the \LUATEX\ binary was some 10.9 MB large. The version 1.09 binary of
+October 2018 was about 6.8MB, and the reduction was due to removing the bitmap
+generation from \MPLIB\ as well as replacing poppler by pplib. As an exercise I
+decided to see how easy it was to make a small version suitable for \CONTEXT\
+\LMTX, and as expected the binary shrunk to below 3MB (plus a \LUA\ and \KPSE\
+dll). This is a reasonable size given what is still present.
+
+There is hardly any file related code left because in practice the backend used
+the most different file types. That also meant that we could remove \KPSE\
+related code and keep all that in the library part. In principle one can load
+that library and hook it into the few callbacks that relate to loading files.
+Once we're stable I'll probably write some code for that. \footnote {In the
+meantime I think it makes not much sense to do that.} Launching the binary with a
+startup script can deal with all matters needed, because the command line
+arguments are available.
+
+We could actually go even smaller by removing the built|-|in \TFM\ and \VF\
+readers. For instance it made not much sense to read and store information that
+is never used anyway, like virtual font data: as long as the backend has access
+to what it needs it's fine. By removing unused code and stripping no longer used
+fields in the internal font tables (which is also good for memory consumption),
+and cleaning up a bit here and there the experimental binary ended up at a bit
+above 2.5MB (plus a \LUA\ dll). \footnote {Mid January we were just below 2.7 MB
+with a static, all inclusive, binary. In March the static ended up at 2.9 MB on
+\MSWINDOWS\ and 2.6 MB in \UNIX.}
+
+\stopsection
+
+\startsection[title={Functionality}]
+
+There is no real reason to change much in the functionality of the frontend but
+as we have no backend now, some primitives are gone. These have to be implemented
+as part of creating a backend.
+
+\starttyping
+\dviextension \dvivariable \dvifeedback
+\pdfextension \pdfvariable \pdffeedback
+\stoptyping
+
+The already obsolete related dimensions are also removed:
+
+\starttyping
+\pageleftoffset \pagerightoffset
+\pagetopoffset \pagebottomoffset
+\stoptyping
+
+And we no longer need the page dimensions because they are just registers that
+are normally used in the backend. So, we got rid of:
+
+\starttyping
+\pageheight
+\pagewidth
+\stoptyping
+
+Some font related inheritances from \PDFTEX\ have also been dropped:
+
+\starttyping
+\letterspacefont
+\copyfont
+\expandglyphsinfont
+\ignoreligaturesinfont
+\tagcode
+\stoptyping
+
+Internally all backend whatsits are gone, but generic \type {literal}, \type
+{save}, \type {restore} and \type {setmatrix} nodes can still be created. Under
+consideration is to let them be so called user nodes but for testing it made
+sense to keep them around for a while. \footnote {Don't take this as a reference:
+later we will see that more was changed.}
+
+The resource relates primitives are backend dependent so the primitives have been
+removed. As with other backend related primitives, their arguments depend on the
+implementation. So, no more:
+
+\starttyping
+\saveboxresource
+\useboxresource
+\lastsavedboxresourceindex
+\stoptyping
+
+and:
+
+\starttyping
+\saveimageresource
+\useimageresource
+\lastsavedimageresourceindex
+\lastsavedimageresourcepages
+\stoptyping
+
+Of course the rule nodes subtypes are still there, so the typesetting machinery
+will handle them fine. It is no big deal to define a pseudo|-|primitive that
+provides the functionality at the \TEX\ level.
+
+The position related primitives are also backend dependent so again they were
+removed. \footnote {There was some sentimental element in this. Long ago, even
+before \PDFTEX\ showed up, \CONTEXT\ already had a positional mechanism. It
+worked by using specials in combination with a program that calculated the
+positions from the \DVI\ file. At some point that functionality was integrated
+into \PDFTEX. For me it always was a nice example of demonstrating that
+complaints like \quotation {\TEX\ is limited because we don't know the position
+of an element in the text.} make no sense: \TEX\ can do more than one thinks,
+given that one thinks the right way.}
+
+\starttyping
+\savepos
+\lastxpos
+\lastypos
+\stoptyping
+
+We could have kept \type {\savepos} but better is to be consistent. We no longer
+need these:
+
+\starttyping
+\outputmode
+\draftmode
+\synctex
+\stoptyping
+
+These could go because we no longer have a backend and if one needs it it's easy
+to define a meaningful variable and listen to that.
+
+The \type {\shipout} primitive does no ship out but just flushes the content of
+the box, if that hasn't happened already.
+
+Because we have \LUA\ on board, and because we can now use the token scanners to
+implement features, we no longer need the hard coded randomizer extensions. In
+fact, also the \METAPOST\ should now use the \LUA\ randomizer, so that we are
+consistent. Anyway, removed are:
+
+\starttyping
+\randomseed
+\setrandomseed
+\normaldeviate
+\uniformdeviate
+\stoptyping
+
+plus the helpers in the \type {tex} library.
+
+\stopsection
+
+\startsection[title={Fonts}]
+
+Fonts are sort of special. We need the data at the \LUA\ end in order to process
+\OPENTYPE\ fonts and the backend code needs the virtual commands. The par builder
+also needs to access font properties, as does the math renderer, but here is no
+real reason to carry virtual font information around (which involves packing and
+unpacking virtual packets). So, in the end it made much sense to also delegate
+the \TFM\ and \VF\ loading to \LUA\ as well. And, as a consequence dumping and
+undumping font information could go away too, which is okay, as we didn't preload
+fonts in \CONTEXT\ anyway. The saving in binary bytes is not impressive but
+keeping unused code around neither. In principle we can get rid of the internal
+representation if we fetch relevant data from the \LUA\ tables but that might be
+unwise from the perspective of performance. By removing the no longer needed
+fields the memory footprint became somewhat smaller and font loading (passing
+from \LUA\ to \TEX) more efficient.
+
+\stopsection
+
+\startsection[title={File IO}]
+
+What came next? A program like \LUATEX\ interacts with its environment and one of
+the nice things about \TEX\ is that it has a standard ecosystem, organized as the
+\quotation {\TEX\ Directory Structure}. There is library that interfaces with
+this structure: \KPSE, but in \CONTEXT\ \MKIV\ we implement its functionality in
+\LUA. The primary reason for this was performance. When we started with \LUATEX\
+the startup on my machine (\MSWINDOWS) and a few servers (\LINUX) of a \TEX\
+engine took seconds and most fo that was due to loading the rather large file
+databases, because a \TEX\ Live installation was a gigabyte adventure. With the
+\LUA\ variant I could bring that down to milliseconds, because I could pre|-|hash
+the database and limit it to files relevant for \CONTEXT\ (still a lot, as fonts
+made up most). Nowadays we have \SSD\ disks and plenty of memory for caching, so
+these things are less urgent, but on network shares it still matters.
+
+So, as we don't use \KPSE, we can remove that library. By doing that we simplify
+compilation a lot as then all dependencies are in the engine's source tree, and
+we're no longer dependent on updates. One can argue that we then sacrifice too
+much, but already for a decade we don't use it and the \LUA\ variant does the job
+well within the \TDS\ ecosystem. Also, in our by now stripped down engine, there
+is not that much lookup going on anyway: we're already in \LUA\ when we do fonts.
+But on the other hand, some generic usage could benefit from the library to be
+present, so we face a choice. The choice is made even more difficult by the fact
+that we can remove all kind of tweaks once we delegate for instance control over
+command execution to \LUA\ completely. But, we might provide \KPSE\ as loadable
+\LUA\ module so that when needed one can use a stub to start the program with a
+\LUA\ script that as first action loads this library that then can take care of
+further file management. As command line arguments are available in \LUA, one can
+also implement the relevant extra switches (and even more if needed).
+
+Now, the interesting thing is that because we have a \LUA\ interface to \KPSE\ we
+can actually drop some hard coded solutions. This means that we can have a binary
+without \KPSE, in which case one has to cook up callbacks that do what this
+library does. But in a version with \KPSE\ embedded one also has to define some
+file related callbacks although they can be rather simple. By keeping a handful
+of file related callbacks the code base could be simplified a lot. In the process
+the recorder option went away (not that we ever used it). It is relatively easy
+to support this in the \quote {find} related callbacks and one has to deal with
+other files (like images and fonts) also, so keeping this feature was a cheat
+anyway.
+
+At this point it is important to notice that while we're dropping some command
+line options, they can still be passed and intercepted at the \LUA\ end. So,
+providing compatible (or alternative solution) is no big deal. For instance,
+execution of (shell) programs is a \LUA\ activity and can be managed from there.
+
+\stopsection
+
+\startsection[title={Callbacks}]
+
+Callbacks can be organized in groups. First there are those related to
+\IO. We only have to deal with a few types: all kind of \TEX\ files (data
+files), format files and \LUA\ modules (but these to are on the list of
+potentially dropped files as this can be programmed in \LUA).
+
+\starttyping
+find_write_file
+find_data_file open_data_file read_data_file
+find_format_file find_lua_file find_clua_file
+\stoptyping
+
+The callbacks related to errors stay: \footnote {Some more error handling was
+added later, as was intercepting user input related to it.}
+
+\starttyping
+show_error_hook show_lua_error_hook,
+show_error_message show_warning_message
+\stoptyping
+
+% We kept the buffer handlers but dropped the output handler later anyway, so we
+% have left:
+%
+% \starttyping
+% process_input_buffer
+% \stoptyping
+
+The management hooks were kept (but the edit one might go): \footnote {And
+indeed, that one went away.}
+
+\starttyping
+process_jobname
+call_edit
+start_run stop_run wrapup_run
+pre_dump
+start_file stop_file
+\stoptyping
+
+Of course the typesetting callbacks remain too as they are the backbone of the
+opening up:
+
+\starttyping
+buildpage_filter hpack_filter vpack_filter
+hyphenate ligaturing kerning
+pre_output_filter contribute_filter build_page_insert
+pre_linebreak_filter linebreak_filter post_linebreak_filter
+insert_local_par append_to_vlist_filter new_graf
+hpack_quality vpack_quality
+mlist_to_hlist make_extensible
+\stoptyping
+
+Finally we mention one of the important callbacks:
+
+\starttyping
+define_font
+\stoptyping
+
+Without that one defined not much will happen with respect to typesetting. I
+could actually remove the \type {\font} primitive but that would be a bit weird
+as other font related commands stay. Also, it's one of the fundamental frontend
+primitives, so removal was never really considered.
+
+\stopsection
+
+\startsection[title={Bits and pieces}]
+
+In the process some helpers and status queries were removed. From the summary
+above you can deduce that this concerns images, backend, and file management.
+Also not used variables (some inherited from the past and predecessors) were
+removed. These and other changes are the reason why there is a separate manual
+for \LUAMETATEX. \footnote {Relatively late in the project I decided to be more
+selective in what got initialized in \LUA\ only mode.}
+
+One of my objectives was to see how lean and mean the code base could be. But
+even if we don't use that many files, the rather complex build system makes that
+we need to have (make and configure) files in the tree that are not really used
+but even then omitting them aborts a build. I played a bit with that but the
+problem is that it needs to be dealt with upstream in order to prevent repetitive
+work. So, this is something to sort out later. Eventually it would be nice to be
+able to compile with a minimal set of source files, also because other programs
+(all kind of \TEX\ variants) that are checked for but not compiled depend on
+libraries that we don't need (and therefore want) to have in the stripped down
+source tree. \footnote {In the end, the source tree was redesigned completely.}
+
+For now we also brought down the number of catcode tables (to 256) \footnote {As
+with math families, and if more tables are needed one should wonder about the
+\TEX\ code used.}, and the number of languages (to 8192) \footnote {This is
+already a lot and because languages are loaded run time, we can go much lower
+than this.} as that saves some initially allocated memory.
+
+\stopsection
+
+\startsection[title={What's next}]
+
+Basically the experiment ends here. A next step is to create a stable code base,
+make compilation easy and consider the way the code is packages. Then some
+cleanup can take place. Also, as it's a window to the outside world, \type {ffi}
+support will move to the code base and be integral to \LUAMETATEX. And of course
+the decision about \LUAJIT\ support has to be made some day soon. The same is
+true for \LUA\ 5.4: in \LUATEX\ for now we stick to 5.3 but experimenting with
+5.4 in \LUAMETATEX\ can't harm us. \footnote {The choice has been made:
+\LUAMETATEX\ will not have a \LUAJIT\ based companion.}
+
+To what extend the \CONTEXT\ code base will have a special files for \LMTX\ is
+yet to be decided, but we have some ideas about new features that might make that
+desirable from the perspective of maintenance. The main question is: do I want to
+have hybrid files or clean files for each variant (stock \MKIV\ and \LMTX).
+
+For the record: at the time of wrapping this up, processing the \LUATEX\ manual
+of 294 pages took 13.5 seconds using stock \LUATEX\ while using the stripped down
+binary, where \LUA\ takes over some tasks, took 13.9 seconds. \footnote {In the
+meantime we're down to around 11.6MB. These are all rough numbers and mostly
+indicate relative speeds at some point.} The \LUAJITTEX\ variant needed 10.9 and
+10.8 seconds. So, there is no real reason to not explore this route, although
+\unknown\ the \PDF\ file size shrinks from 1.48MB to 1.18MB (and optionally we
+can squeeze out more) but one can wonder if I didn't make big mistakes. It is
+good to realize that there is not much performance to gain in the engine simply
+because most code is already pretty well optimized. The same is true for the
+\CONTEXT\ code: there might be a few places where we can squeeze out a few
+milliseconds but probably it will go unnoticed.
+
+On the todo list went removal of \type {\primitive} which we never use (need) and
+the possible introduction of a way to protect primitives and macros against
+redefinition, but on the other hand, it might impact performance and be not worth
+the trouble. In the end it is a macro package issue anyway and we never really
+ran into users redefining primitives. \footnote {Indeed this primitive has been
+removed.}
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-stubs.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-stubs.tex
new file mode 100644
index 00000000000..69d02adc726
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-stubs.tex
@@ -0,0 +1,262 @@
+% language=us
+
+\startcomponent followingup-stubs
+
+\environment followingup-style
+
+\startchapter[title={Stubs}]
+
+\startsection[title={Bare bone}]
+
+The most barebone way to process a \CONTEXT\ file is something like:
+
+\starttyping
+luametatex
+ --fmt="<cache path to>/luametatex/cont-en"
+ --lua="<cache path to>/luametatex/cont-en.lui"
+ --jobname="article"
+ "cont-yes.mkiv"
+\stoptyping
+
+We pas extra options, like:
+
+\starttyping
+ --c:autopdf
+ --c:currentrun=1
+ --c:fulljobname="./article.tex"
+ --c:input="./article.tex"
+ --c:kindofrun=1
+ --c:maxnofruns=9
+ --c:texmfbinpath="c:/data/develop/tex-context/tex/texmf-win64/bin"
+\stoptyping
+
+but for what we are going to discuss here it doesn't really matter. The main point is
+that we use a \LUA\ startup file. That one has a minimal amount of code so that the
+format can be loaded as we like it. For instance we need to start up with initial
+memory settings.
+
+The file \type {cont-yes} sets up the way processing content happens. This can be the
+\type {jobname} file but also something different. It is enough to know that this
+startup is quite controlled.
+
+I will explore a different approach to format loading but for now this is how it
+goes. After al, we need to be compatible with \LUATEX\ and normal \MKIV\ runs, at
+least for now.
+
+\stopsection
+
+\startsection[title={Management (some history)}]
+
+In \CONTEXT\ we always had a script: \type {texexec}, originally a \MODULA2
+program, later a \PERL\ script, then a \RUBY\ script but now we have \type
+{mtxrun}, a \LUA\ script. All take care of making sure that the file is
+processed enough times to get the cross references, tables of contents, indexes,
+multi|-|pass data stable. It also makes it possible to avoid using these special
+binaries (or links) that trick the engine into thinking it is bound to a format:
+we never had \type {pdfcontext} or \type {luacontext}, just one \type {context}.
+Actually, because we have multiple user interfaces, we would have needed many
+stubs instead. Getting this approach accepted was not easy but in the meantime
+I've seen management scripts for other packages being mentioned occasionally.
+
+The same is true for scripts: for a long time \CONTEXT\ came with quite some
+scripts but when an average \TEX\ distribution started growing, including many
+other scripts, we abandoned this approach and stuck to one management script that
+also launched auxiliary scripts. That way we could be sure that there were no
+clashes in names. If you look at a full \TEX\ installation you see many stubs to
+scripts and more keep coming. How that can work out well without unexpected side
+effects (name clashes) is not entirely clear to me, as a modern computer can have
+large bin paths. Just imagine that all large programs (or ecosystems) would
+introduce hundreds of new \quote {binaries}.
+
+Anyway, in the end a \CONTEXT\ installation using \MKIV\ only needs \type {mtxrun}
+and as bonus \type {context}. The above call is triggered by:
+
+\starttyping
+mtxrun --autogenerate --script context --autopdf article.tex
+\stoptyping
+
+from the editor. Here we create formats when none is found, and start or activate
+the \PDF\ viewer afterwards, so more minimal is:
+
+\starttyping
+mtxrun --script context article.tex
+\stoptyping
+
+Normally there is also a \type {context} stub so this also works:
+
+\starttyping
+context article.tex
+\stoptyping
+
+\stopsection
+
+\startsection[title={The launch process (more history)}]
+
+In \MKII, when we use \PDFTEX, the actual launch of these script is somewhat
+complex and a bit different per platform. But, on all platforms \KPSE\ does the
+lookup of the script. Already long ago I found out that this startup overhead
+could amount to seconds on a complete \TEX Live installation (imagine running
+over a network) which is why eventually we came up with the minimals. The reason
+is that the file databases have to be loaded: first for looking up, then for the
+stub that also needs that information and finally by the actual program. There
+were no \SSD's then.
+
+The first hurdle we took was to combine the lookup and the runner. Of course this
+is sort of out of our control because an installer can decide to still use a
+lookup approach but at least on \MSWINDOWS\ this was achieved quite easy. Sort
+of:
+
+\starttyping
+texexex -> [lookup] -->
+ texexec.pl -> [lookup] ->
+ pdftex + formats ->
+ [lookup] -> processing
+\stoptyping
+
+The first lookup can be avoided by some fast relative lookup, but for more
+complex management the second one is always there. Over time this mechanism
+became more sophisticated, for instance we use caching, could work over sockets
+using a \KPSE\ server, etc.
+
+When \LUATEX\ came around, it was already decided early that it also would serve
+as script engine for the \CONTEXT\ runner, this time \type {mtxrun}. The way this
+works differs per platform. On \WINDOWS\ there is a small binary, say \type
+{runner.exe}. It gets two copies: \type {mtxrun.exe} and \type {context.exe}. If
+you find more copies on your system, something might be wrong with your
+installation.
+
+\starttyping
+mtxrun.exe -> loads mtxrun.lua in same path
+context.exe -> idem but runs with --script=context
+\stoptyping
+
+The \type {mtxrun.lua} script will load its file database which is very efficient
+and fast. It will then load the given script and execute it. In the case of \type
+{context.exe} the \type {mtx-context.lua} script is loaded, which lives in the
+normal place in the \TEX\ tree (alongside other scripts).
+
+So, a minimal amount of programs and scripts is then:
+
+\starttyping
+texmf-win64/bin/luatex.exe
+texmf-win64/bin/mtxrun.exe
+texmf-win64/bin/mtxrun.lua
+texmf-win64/bin/context.exe
+\stoptyping
+
+with (we also need to font manager):
+
+\starttyping
+texmf-context/scripts/context/lua/mtx-context.lua
+texmf-context/scripts/context/lua/mtx-fonts.lua
+\stoptyping
+
+But \unknown\ there is a catch here: \LUATEX\ has to be started in script mode in
+order to process \type {mtxrun}. So, in fact we see this in distributions.
+
+\starttyping
+texmf-win64/bin/luatex.exe
+texmf-win64/bin/texlua.exe
+texmf-win64/bin/mtxrun.exe
+texmf-win64/bin/mtxrun.lua
+texmf-win64/bin/context.exe
+\stoptyping
+
+The \type {texlua} program is just a copy of \type {luatex} that by its name
+knows that is is supposed to run scripts and not process \TEX\ files. The setup
+can be different using dynamic libraries (more files but a shared engine part)
+but the principles are the same. Nowadays the stub doesn't need the \type
+{texlua.exe} binary any more, so this is the real setup:
+
+\starttyping
+texmf-win64/bin/luatex.exe large program
+texmf-win64/bin/mtxrun.exe small program
+texmf-win64/bin/mtxrun.lua large lua file
+texmf-win64/bin/context.exe small program
+\stoptyping
+
+Just for the record: we cannot really use batch files here because we need to
+know the original command, and when run from a script that is normally not known.
+It works to some extend but for instance when started indirectly from an editor
+it can fail, depending on how that editor is calling programs. Therefore the stub
+is the most robust method.
+
+On a \UNIX\ system the situation differs:
+
+\starttyping
+texmf-linux-64/bin/luatex large program
+texmf-linux-64/bin/texlua symlink to luatex
+texmf-linux-64/bin/mtxrun large lua file
+texmf-linux-64/bin/context shell script that starts mtxrun
+\stoptyping
+
+Here \type {mtxrun.lua} is renamed to \type {mtxrun} with a shebang line that
+triggers loading by \type {texlua} which is a symlink to \type {luatex} because
+shebang lines don't support the \type {--texlua} argument. As on windows, this
+is not really pretty.
+
+\stopsection
+
+\startsection[title={The \LMTX\ way (the present)}]
+
+Now when we move to \LMTX\ we need to make sure that the method that we choose is
+acceptable for distributions but also nicely consistent over platforms. We only
+have one binary \type {luametatex} with all messy logic removed and no second
+face like \type {metaluatex}. When it is copied to another instance (or linked)
+it will load the script with its own name when it finds one. So on \WINDOWS\ we
+now have:
+
+\starttyping
+texmf-win64/bin/luametatex.exe medium program
+texmf-win64/bin/mtxrun.exe copy (or link) of luametatex
+texmf-win64/bin/mtxrun.lua large lua file
+texmf-win64/bin/context.exe copy (or link) of luametatex
+texmf-win64/bin/context.lua small lua file
+\stoptyping
+
+and in \UNIX:
+
+\starttyping
+texmf-linux-64/bin/luametatex mediumprogram
+texmf-linux-64/bin/mtxrun copy (or link) of luametatex
+texmf-linux-64/bin/mtxrun.lua large lua file
+texmf-linux-64/bin/context copy (or link) of luametatex
+texmf-linux-64/bin/context.lua small lua file
+\stoptyping
+
+So, \type {luametatex[.exe]}, \type {mtxrun[.exe]} and \type {context[.exe]} are
+all the same. On both platforms there is \type {mtxrun.lua} (with suffix) and on
+both we also use the same runner approach. The \type {context.lua} script is
+really small and just sets the script command line argument before loading \type
+{mtxrun.lua} from the same path. In the case of copied binaries: keep in mind
+that the three copies together are not (much) larger than the \type {luatex} and
+\type {texlua} pair (especially when you take additional libraries into account).
+
+The disadvantage of using copies is that one can forget to copy with an update,
+but the fact that one can use them might be easier for installers. It's up to
+those who create the installers.
+
+One complication is that the \type {mtxrun.lua} script has to deal with the old
+and the new setup. But, when we release we will assume that one used either
+\LUATEX\ or \LUAMETATEX, not some mix. As \type {mtxrun} and \type {context} know
+what got it started they will then trigger the right engine, unless one passes
+\typ {--engine=luatex}. In that case the \LUAMETATEX\ launcher will trigger a
+\LUATEX\ run. But a mixed installation is unlikely to happen.
+
+\stopsection
+
+\startsection[title={Why not \unknown}]
+
+Technically we could use one call for both the runner and \TEX\ processor but
+when multiple runs are needed this would demand an internal engine reset as well
+as macro package reset while keeping some (multi|-|pass) data around. A way
+in|-|between could be to spawn the next run. In the end the gain would be minimal
+(we have now .2 seconds overhead per total run, which can trigger multiple
+passes, due to the management script, to basically we can neglect it. (Triggering
+the viewer takes more time.)
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-style.tex
new file mode 100644
index 00000000000..68b52043c25
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-style.tex
@@ -0,0 +1,66 @@
+% \enablelmtx
+% \nopdfcompression
+
+\startenvironment followingup-style
+
+\usemodule[abbreviations-smallcaps]
+
+\logo [LUAMETATEX] {LuaMeta\TeXsuffix}
+
+\setupbodyfont[plex] % not that ok for titling
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ header=0pt,
+ footer=1cm,
+ footerdistance=5mm,
+ backspace=2cm,
+ cutspace=15mm,
+ topspace=2cm,
+ bottomspace=1cm,
+ style=bold,
+ color=maincolor]
+
+\setuppagenumbering
+ [alternative=doublesided]
+
+\setupwhitespace
+ [big]
+
+\setupfootertexts
+ [][{\getmarking[chapter]\quad\pagenumber}]
+ [{\pagenumber\quad\getmarking[chapter]}][]
+
+\definecolor
+ [maincolor]
+ [darkblue]
+
+\setuphead
+ [chapter]
+ [style=\bfc,
+ color=maincolor]
+
+\setuphead
+ [section]
+ [style=\bfa,
+ color=maincolor]
+
+\setuphead
+ [subsection]
+ [style=\bf,
+ color=maincolor]
+
+\setupalign
+ [tolerant,stretch]
+
+\setuptyping
+ [color=maincolor]
+
+\setuptype
+ [color=maincolor]
+
+\setupitemize
+ [color=maincolor]
+
+\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-tex.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-tex.tex
new file mode 100644
index 00000000000..5524baf5358
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-tex.tex
@@ -0,0 +1,125 @@
+% language=us
+
+\startcomponent followingup-tex
+
+\environment followingup-style
+
+\startchapter[title={\TEX}]
+
+\startsection[title={Prefixes}]
+
+The fact that we merged \ETEX, a bit of \PDFTEX\ and some of \ALEPH\ into
+\LUATEX, already makes it a non|-|standard \TEX\ engine. In \LUAMETATEX\ we go a
+bit further. Completely outsourcing the backend has the side effect that some
+(extension related) primitives have to be implemented explicitly. The fact that
+\LUA\ is integrated has consequences for, for instance, initialization.
+Defaulting to \UTF-8 input makes it different too. And delegating many font
+matters to \LUA\ also doesn't make it behave like good old \TEX.
+
+Here I discuss another difference. One can argue that this definitely makes it
+less \TEX, but in practice this is not that problematic. We're talking prefixes
+here. Traditional \TEX\ has only prefixes:
+
+\startitemize[n]
+\startitem
+ \type {\global}: when used, it will make the next definition a global one.
+ The \type {\globaldefs} parameter can be used to force global or local
+ definitions.
+\stopitem
+\startitem
+ \type {\long}: when applied, this will make a macro bark on a \type {\par}
+ (or its equivalent) when grabbing an argument. In \LUATEX\ this check can be
+ disabled. \footnote {In a similar fashion barking about a \type {\par} in
+ math mode can be disabled. Such warnings made much sense when a \TEX\ run
+ took much time and was triggered and traced on relative slow output devices.}
+\stopitem
+\startitem
+ \type {\outer}: when applied the macro can only be used at the outer level.
+\stopitem
+\stopitemize
+
+Multiple prefixes can be given and their effects accumulate. The \ETEX\ extension
+adds another one:
+
+\startitemize[continue]
+\startitem
+ \type {\protected}: this will make a macro unexpandable inside an \type
+ {\edef}, an \type {\xdef} or token list serialization.
+\stopitem
+\stopitemize
+
+In \CONTEXT\ we never use(d) \type {\outer} and I can't even think of a useful
+application in a large macro package. in \MKII\ most interface macros are defined
+as \type {\long}, and because in \MKIV\ we block the complaints, we don't need
+this prefix either. On the other hand, many macros are defined \type
+{\protected}. \footnote {Or in \CONTEXT\ speak, they are defined as \typ
+{\unexpanded}, because we already had \typ {\protected} as well as \typ
+{\unexpanded} before these were introduces as primitives.}
+
+When you look at the implementation, \type {\long} and \type {\outer} are
+properties of the so called command code: we have normal, long, outer and long
+outer macros, and each has a unique command code. For some reason \type
+{\protected} is not implemented with command codes, which would have doubled the
+number to eight, but as special token injected in front of the macro preamble.
+Using a command code would have made more sense as there is no real speed penalty
+in that, while the special token indicating is a macro (body) is protected now
+has to be intercepted in some cases.
+
+Anyhow, already for a while I wondered if I should drop \type {\long} and \type
+{\outer} (making them no|-|ops). I also had on my agenda to promote \type
+{\protected} to a normal command code. And, already for a long time I wanted to
+play with a new prefix: \footnote {This is a typical example of a feature that I
+like playing with, before deciding if it will stay (as such).}
+
+\startitemize[continue]
+\startitem
+ \type {\frozen}: this will protect a macro (for now only a macro) against
+ redefinition, which provides a bit of protection for a user.
+\stopitem
+\stopitemize
+
+Promoting \type {\protected} brings the set of call commands from four to eight,
+and a \type {\frozen} property would bump it to sixteen. This is still okay, but
+in some places it would involve mode testing. However, dropping \type {\long} and
+\type {\outer} would not only keep the set small (just four) but also rid it of
+some tests. There is no performance penalty either (even a bit of gain in case of
+many protected macros as we no longer need to skip the special signal token) and
+it even saves some memory (but not that much).
+
+As a bonus there are a few more conditionals: \type {\ifprotected}, \type
+{\iffrozen}, and, very experimental, \type {\ifusercmd}, which can be used to
+check if something is user defined (often not a primitive). These probably only
+make sense for diagnostic purposes.
+
+In the end, the implementation was not that hard. In the process I also removed
+the \type {\suppress...} parameters so \type {\par} no longer plays havoc. If this
+new prefix \type {\frozen} stays of will affect more definitions, we'll see.
+
+\stopsection
+
+\startsection[title={Conditionals}]
+
+Another domain where there have been some extensions is conditions. In a previous
+chapter I mentioned \type {\iftok} already. As this is not a manual I will not go
+into details about other new conditionals. For instance we have a few that can be
+used to check for valid dimensions and numbers. This can lead to a bit cleaner
+code, although for instance in \CONTEXT\ we always used support macros for this.
+We seldom needed more than we had but when interfacing with \METAPOST\ it helps a
+little.
+
+Another, maybe interesting one is \type {\ifcondition} which when \TEX\ is in
+jump over branches mode is seen as a valid \type {\if<cmd>} token but when it
+comes to expansion the following macro determines a true or false state. A second
+nice experiment is \type {\orelse} which is to be followed by a valid \type
+{\if<cmd>} token and makes for less nesting which sometimes looks nicer and also
+has some advantages.
+
+I might wrap up these and other extensions in articles once they are considered
+stable and useful. But first I'll test them in real situation, which in practice
+means that \CONTEXT\ users will test them, probably without noticing.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-titlepage.tex
new file mode 100644
index 00000000000..0f46ee9ca27
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-titlepage.tex
@@ -0,0 +1,58 @@
+\startcomponent followingup-titlepage
+
+\environment followingup-style
+
+\startluacode
+ function document.graphic()
+ local min, max, random, round = math.min, math.max, math.random, math.round
+
+ local width = 210
+ local height = 297
+
+ local bitmap = graphics.bitmaps.new(width,height,"rgb",1)
+ local data = bitmap.data
+
+ for i=1,height do
+ local d = data[i]
+ for j=1,width do
+ -- d[j] = { 0, 0, random(100,200) }
+ d[j] = { 0, 0, random(128,255) }
+ end
+ end
+
+ graphics.bitmaps.tocontext(bitmap,"210bp","297bp")
+ end
+\stopluacode
+
+\startuseMPgraphic{graphic}
+ StartPage ;
+ % fill Page
+ % withcolor "maincolor" ;
+ draw textext.urt("\bf \WORD{following up}")
+ rotated 90
+ ysized (PaperHeight-10mm)
+ shifted lrcorner Page
+ shifted (-10mm,5mm)
+ withcolor "middlegray" ;
+ draw textext.lft("\bf\strut\ConTeXt")
+ ysized 4.5cm
+ shifted lrcorner Page
+ shifted (-50mm,70mm)
+ withcolor "white" ;
+ draw textext.lft("\bf\strut lm\kern-.1ex tx")
+ ysized 4cm
+ shifted lrcorner Page
+ shifted (-50mm,37.5mm)
+ withcolor "white" ;
+ StopPage ;
+\stopuseMPgraphic
+
+\startpagemakeup[pagestate=stop] % doubledided=no
+ \startoverlay
+ % {luametatex} % for searching
+ {\scale[width=\paperwidth]{\ctxlua{document.graphic()}}}
+ {\useMPgraphic{graphic}}
+ \stopoverlay
+\stoppagemakeup
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-whatsits.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-whatsits.tex
new file mode 100644
index 00000000000..64c8175734b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-whatsits.tex
@@ -0,0 +1,78 @@
+% language=us
+
+\startcomponent followingup-whatsits
+
+\environment followingup-style
+
+\startchapter[title={Whatsits}]
+
+% \startsection[title={...}]
+
+Whatsits provide the natural extension mechanism for \TEX. In \PDFTEX\ there are
+plenty such whatsits, for instance for \PDF\ annotations. In \LUATEX\ this
+mechanism was reorganized so that the code was better isolated. In the first
+versions of \LUAMETATEX\ only a handful was left. Stepwise some were removed and
+in the end we could stick to only one general whatsit because one can implement
+the few needed to be compatible with \TEX.
+
+We started out with this set of whatsits:
+
+\starttabulate[|B|p|]
+\NC open \NC open a file for writing (delayed) \NC \NR
+\NC write \NC write to an open file (or terminal otherwise) \NC \NR
+\NC close \NC close an opened file \NC \NR
+\NC special \NC write some literal \PDF\ code to the output file \NC \NR
+\NC user \NC store and retrieve data in a node \NC \NR
+\NC latelua \NC execute code delayed (in the backend) \NC \NR
+\NC literal \NC write some literal \PDF\ code to the output file, controlled by a mode \NC \NR
+\NC save \NC push the transformation state \NC \NR
+\NC restore \NC pop the transformation state \NC \NR
+\NC matrix \NC apply a transformation (\type {rx sx sy ry}) \NC \NR
+\NC savepos \NC register a position to be queried afterwards (\type {x y}) \NC \NR
+\stoptabulate
+
+The \type {\openout}, \type {\write} and \type {\closeout} primitives relate to
+the first three but they can be prefixed with \type {\immediate} in which case
+they don't end up as whatsits but are applied directly. The \type {special} is
+actually meant for \DVI\ while the \type {\(pdf)literal} is for \PDF\ output. The
+first four are available in regular \TEX.
+
+The last four are dealt with exclusively in the backend and by removing the
+backend they basically became no|-|ops. I kept them for a while but in the end
+decided to kick them out. Instead a generic whatsit was introduced that could be
+used as signal with the same function. That simple whatsit only has a subtype
+(and of course optionally attributes). And, as \CONTEXT\ has its own backend, we
+can intercept them as we like. The saving in code is not spectacular but keeping
+it around (basically doing nothing) neither. The impact on \CONTEXT\ was not that
+large because for instance saving positions is done differently and
+transformations are encapsulated in a few helpers that could easily be adapted.
+
+From there it was a small step to also remove the literal whatsit, so then we had
+five whatsits left, plus the generic one. I then entered sentimental mode: should
+we keep the first four or not. Of course we want to be \TEX\ compatible but we
+can remove the code and provide a compatible replacement using macros and our own
+simple whatsit nodes. That keeps all the housekeeping at the \LUA\ end,
+simplifies the \CCODE, and we're still \TEX.
+
+Of course, once we remove these and only have the delayed \LUA\ whatsit and user
+whatsits left, we can as well replace these too. In \LUATEX\ user nodes are
+actually not dealt with in the backend. One can create them at the \LUA\ end and
+query them in callbacks. The \TEX\ machinery just ignores them, like any whatsit.
+In retrospect they could have been first class nodes, but making them whatsits
+was wise because that way they can be ignored consistently when needed.
+
+So, in the end all we need is a simple whatsit. As I removed the subtypes
+stepwise there was an intermediate mix of code to recognize simple whatsits from
+core whatsits but that distinction went away. Doing this kind of refactoring is
+best done stepwise because that way I can compile some large documents and see if
+things break. As a consequence again some code could be simplified as we
+basically no longer have extensions. Of course at the \CONTEXT\ end the removed
+primitives had to be added but that didn't take much effort. The binary shrunk
+some 30K but (a small amount of) \LUA\ code was added to provide a compatible
+functionality (not that we use it).
+
+% \stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup.tex
new file mode 100644
index 00000000000..a9aaaf71c55
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup.tex
@@ -0,0 +1,34 @@
+\environment followingup-style
+
+\dontcomplain
+
+\startdocument
+
+ \component followingup-titlepage
+
+ \startfrontmatter
+ \component followingup-contents
+ \stopfrontmatter
+
+ \startbodymatter
+ \component followingup-introduction
+ \component followingup-evolution
+ \component followingup-stripping
+ \component followingup-bitmaps
+ \component followingup-logging
+ \component followingup-directions
+ \component followingup-performance
+ \component followingup-cleanup
+ \component followingup-rejected
+ \component followingup-whatsits
+ \component followingup-feedback
+ \component followingup-lua
+ \component followingup-compilation
+ \component followingup-stubs
+ \component followingup-mp
+ \component followingup-tex
+ \component followingup-retrospect
+ \stopbodymatter
+
+\stopdocument
+
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-appendix.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-appendix.tex
index 2eab26a9371..2eab26a9371 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-appendix.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-appendix.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-demo-rule.lua b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-demo-rule.lua
index 667d1e43c90..667d1e43c90 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-demo-rule.lua
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-demo-rule.lua
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-environment.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-environment.tex
index c884d97e5d3..c884d97e5d3 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-environment.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-environment.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-extensions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-extensions.tex
index afe6fd82386..afe6fd82386 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-extensions.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-extensions.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-features.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-features.tex
index bf9f39385df..bf9f39385df 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-features.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-features.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-formats.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-formats.tex
index 9ad6bc9bda0..9ad6bc9bda0 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-formats.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-formats.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-hooks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-hooks.tex
index 7ee5dc198b8..7ee5dc198b8 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-hooks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-hooks.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-introduction.tex
index 0ca91ee9fee..0ca91ee9fee 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-introduction.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-lookups.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-lookups.tex
index e9448b88456..e9448b88456 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-lookups.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-lookups.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-math.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-math.tex
index 76620493755..76620493755 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-math.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-math.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-methods.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-methods.tex
index eac86d69487..eac86d69487 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-methods.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-methods.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-mkiv.tex
index fa53492f084..fa53492f084 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-mkiv.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-modes.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-modes.tex
index 95cb957328f..95cb957328f 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-modes.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-modes.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-scripts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-scripts.tex
index aed4f0a5c9d..aed4f0a5c9d 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-scripts.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-scripts.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-tricks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-tricks.tex
index 65b210e2c48..65b210e2c48 100644
--- a/Master/texmf-dist/doc/context/sources/general/fonts/fonts/fonts-tricks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-tricks.tex
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/libraries/ecmascript-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/libraries/ecmascript-mkiv.tex
new file mode 100644
index 00000000000..70350142c03
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/libraries/ecmascript-mkiv.tex
@@ -0,0 +1,420 @@
+% language=us
+
+% author : Hans Hagen
+% copyright : PRAGMA ADE & ConTeXt Development Team
+% license : Creative Commons Attribution ShareAlike 4.0 International
+% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
+% origin : the ConTeXt distribution
+%
+% comment : Because this manual is distributed with TeX distributions it comes with a rather
+% liberal license. We try to adapt these documents to upgrades in the (sub)systems
+% that they describe. Using parts of the content otherwise can therefore conflict
+% with existing functionality and we cannot be held responsible for that. Many of
+% the manuals contain characteristic graphics and personal notes or examples that
+% make no sense when used out-of-context.
+%
+% comment : Some chapters might have been published in TugBoat, the NTG Maps, the ConTeXt
+% Group journal or otherwise. Thanks to the editors for corrections. Also thanks
+% to users for testing, feedback and corrections.
+
+% for now:
+
+\usemodule[article-basic]
+\usemodule[abbreviations-smallcaps]
+\usemodule[scite]
+\usemodule[ecmascript]
+
+\definecolor
+ [maincolor]
+ [r=.4]
+
+\definecolor
+ [extracolor]
+ [g=.4]
+
+\setupbodyfont
+ [11pt]
+
+\setuptype
+ [color=maincolor]
+
+% \setuptyping
+% [color=maincolor]
+
+\definefontsynonym
+ [TitlePageMono]
+ [file:lmmonoproplt10-bold*default]
+
+\setuphead
+ [color=maincolor]
+
+\usesymbols
+ [cc]
+
+\setupinteraction
+ [hidden]
+
+\loadfontgoodies[lm]
+
+\startdocument
+ [metadata:author=Hans Hagen,
+ metadata:title=ecmascript in context lmtx,
+ author=Hans Hagen,
+ affiliation=PRAGMA ADE,
+ location=Hasselt NL,
+ title=\ECNASCRIPT\ in \CONTEXT\ \LMTX,
+ support=www.contextgarden.net,
+ website=www.pragma-ade.nl]
+
+\starttext
+
+\startMPpage
+ StartPage;
+
+ fill Page withcolor "darkgreen";
+
+ draw textext.lrt("\tttf ECMA")
+ xsized .75PaperWidth
+ shifted ulcorner (Page enlarged -15mm )
+ withcolor "white" ;
+
+ draw textext.llft("\tttf SCRIPT")
+ xsized .50PaperWidth
+ shifted urcorner (Page enlarged -15mm topenlarged -70mm)
+ withcolor "white" ;
+
+ draw textext.llft("\tttf in context lmtx")
+ xsized .50PaperWidth
+ shifted urcorner (Page enlarged -15mm topenlarged -110mm)
+ withcolor "white" ;
+
+ draw textext.llft("\tttf using the optional mujs library")
+ xsized .50PaperWidth
+ shifted lrcorner (Page enlarged -15mm bottomenlarged -10mm)
+ withcolor "white" ;
+
+ StopPage;
+\stopMPpage
+
+\dontcomplain
+
+% \startsubject[title=Contents]
+%
+% \placelist[section][alternative=a]
+%
+% \stopsubject
+
+\startsection[title=Introduction]
+
+When you use \CONTEXT\ there is no way around noticing that the \LUA\ scripting
+language is an important component. When we progressed from \LUATEX\ to
+\LUAMETATEX\ did didn't change. I like that language a lot! Among the reasons are
+that it reminds me of \PASCAL, that it's clean, fast and well maintained. There
+is no huge infrastructure involved, nor lots of libraries and therefore
+dependencies.
+
+So why bother about another scripting language? One can argue that because of the
+World Wide Web one should use \JAVASCRIPT\ instead. It might make sense from a
+commercial point of view, or for some promotional reason. But that all makes
+little sense in the perspective of \CONTEXT. But, when I was playing with
+optional libraries in \LUAMETATEX,
+
+On and off I wonder if I should spend some time on adding \LUA\ annotation
+support to the open source mupdf viewer. After all, it has some basic
+\JAVASCRIPT\ support (but currently not enough, for instance it lacks control
+over widgets and layers and such.) However, then I noticed that the related
+\JAVASCRIPT\ code was actually an independent library and looking at the header
+files it looked quite a bit like the \LUA\ interface. So, just for the fun of it I
+gave it a try, and when doing so, I realized that having support for \JAVASCRIPT,
+or actually \ECMASCRIPT, because that is what it is, could make users who are
+afraid of \LUA\ willing to play with simple scripting in \CONTEXT. Of course,
+after a while they will figure out that \LUA\ is the real deal.
+
+Therefore, instead of sticking to an experiment, I decided to make support for
+the \type {mujs} library an option. After all, every now and they we need
+something new to play with. But be warned: it's an optional thing. The
+interpreter is not embedded in the binary and is loaded on demand (when present).
+In spite of that performance is quite okay.
+
+\stopsection
+
+\startsection[title=A few examples]
+
+Because the provided interface is pretty limited, a few simple examples will do.
+There are plenty of tutorials on the Internet. The main thing to keep in mind is
+that an \ECMASCRIPT\ interpreter is normally pretty limited when it comes to
+communicating with its environment. For instance, the main application provides
+way to print something (to a console) or read from files. So, commands that
+relate to this are specific for \LUAMETATEX. Before anything can be done you need
+to load the (\type {mujs}) library, which is done with:
+
+\starttyping
+\usemodule[ecmascript]
+\stoptyping
+
+You can write a message to the log (or an output pane or console) with the \type
+{console} function, one that normally is present in a \JAVASCRIPT\ (\ECMASCRIPT)
+environment:
+
+\starttyping
+\ecmacode {console("Example Three!")}
+\stoptyping
+
+Printing something to the \TEX\ engine is done with this command:
+
+\startbuffer
+\ecmacode {texprint("Just a {\\bf short} sentence.")}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+This produces:
+
+\getbuffer
+
+and is comparable with the \type {tex.print} (which prints lines) function at the
+\LUA\ end. This means that there is also \type {texsprint} (which accumulates
+parts into lines). In practice one will probably always use that one.
+
+When there are two arguments, the first argument has to be a number and sets the
+so called catcode table to be used.
+
+\startbuffer
+\ecmacode {texprint(catcodes.vrb,"Just a {\\bf short} sentence.")}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+This results in a verbatim print: {\tttf \inlinebuffer} The backslash is just that,
+a backslash and not a trigger for a \TEX\ command.
+
+You can do pretty much everything with these print commands. Take for instance the
+following example:
+
+\startbuffer
+\startecmacode
+ console("We're doing some MetaPost!");
+ texsprint(
+ "\\startMPcode "
+ + 'fill fullsquare xyscaled (6cm,1cm) withcolor "darkred";'
+ + 'fill fullsquare xyscaled (4cm,1cm) withcolor "darkgreen";'
+ + 'fill fullsquare xyscaled (2cm,1cm) withcolor "darkblue";'
+ + "\\stopMPcode "
+ );
+\stopecmacode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+This produces:
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+in \LUA\ we can do this:
+
+\startbuffer
+\startluacode
+ context.startMPcode()
+ context('fill fullsquare xyscaled (6cm,1cm) withcolor "middlecyan";')
+ context('fill fullsquare xyscaled (4cm,1cm) withcolor "middlemagenta";')
+ context('fill fullsquare xyscaled (2cm,1cm) withcolor "middleyellow";')
+ context.stopMPcode()
+\stopluacode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The result is the same but the code to produce it looks more like \CONTEXT, if
+only because way more built in features are provided. It makes no sense to do
+the same with another scripting language.
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+As mentioned, reading from files is to be provided by the main program and indeed
+we do have some basic interface. Actually we delegate all to the \LUA\ end by
+using a callback mechanism but users won't see these details. It suffices to know
+that file lookups are done the same way as in the main program because we use the
+same resolvers. One can (in the spirit of \ECMASCRIPT) open a file by creating a
+new file object. After that one can read from the file and, when done, close it.
+
+\startbuffer
+\startecmacode
+ var f = File("ecmascript-mkiv.tex","r");
+ var l = f.read("*a");
+ f.close();
+ texprint(
+ "This file has "
+ + l.length // or: l.length.toString()
+ + " bytes!"
+ )
+\stopecmacode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Which reports that: \quotation {\inlinebuffer} The arguments to the \type {read}
+method are the same as in \LUA, so for instance \type {*a} reads the whole file,
+\type {*l} a single line, and a number will read that many bytes. There is
+currently no support for writing as I see no need for it (yet).
+
+You can load an external file too.
+
+\startluacode
+io.savedata("ecmascript-demo-001.js",[[
+function filesize(name) {
+ var f = File(name,"r");
+ if (f != undefined) {
+ var l = f.read("*a");
+ f.close();
+ return l.length;
+ } else {
+ return 0;
+ }
+}
+]])
+\stopluacode
+
+\startbuffer
+\ecmafile{ecmascript-demo-001.js}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+This file defines a function:
+
+\typefile{ecmascript-demo-001.js}
+
+We use this as follows:
+
+\startbuffer
+\startecmacode
+ texsprint(
+ "This file has "
+ + filesize("ecmascript-mkiv.tex")
+ + " bytes!"
+ )
+\stopecmacode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The result is the same as before: \quotation {\inlinebuffer} but by using a
+predefined function we save ourselves some typing. Actually, a more efficient
+variant is this:
+
+\starttyping
+function filesize(name) {
+ var f = File(name,"r");
+ if (f != undefined) {
+ var l = f.seek("end");
+ f.close();
+ return l;
+ } else {
+ return 0;
+ }
+}
+\stoptyping
+
+As with the \type {read} method, the \type {seek} method behaves the same as
+its \LUA\ counterpart, which is a good reason to have a look at the \LUA\
+manual.
+
+If you want you want also access the \ECMASCRIPT\ interpreter from the \LUA\ end,
+not that it makes much sense, but maybe you have a lot of complex code that you
+don't want to rewrite. Here is an example:
+
+\startbuffer
+\startluacode
+ optional.loaded.mujs.execute [[
+ var MyMax = 10; // an example of persistence
+ ]]
+
+ optional.loaded.mujs.execute [[
+ texsprint("\\startpacked");
+ for (var i = 1; i <= MyMax; i++) {
+ texprint(
+ "Here is some rather dumb math test: "
+ + Math.sqrt(i/MyMax)
+ + "!\\par"
+ );
+ }
+ texsprint("\\stoppacked");
+ ]]
+\stopluacode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+This assumes that you have loaded the module \type {ecmascript} which does the
+necessary preparations. Watch the different ways to add comment and also watch
+how we need to escape the \CONTEXT\ commands. Of course the syntax of both
+languages is different too.
+
+\getbuffer
+
+For now there is not much more to tell. I might add a few features (and more
+examples). And the low level optional interface is not yet declared stable but as
+we wrap it in higher level commands no one will notice changes at that end.
+
+\stopsection
+
+\startsection[title=Extensions]
+
+To summarize, for printing to \TEX\ we have:
+
+\starttyping
+texsprint([catcodetableid,]string|number)
+\stoptyping
+
+and
+
+\starttyping
+texprint(catcodetableid,]string|number)
+\stoptyping
+
+and for printing to the console:
+
+\starttyping
+console(string|number)
+\stoptyping
+
+A file is opened with:
+
+\starttyping
+var f = File.new(filename[,mode])
+\stoptyping
+
+and the returned file object has the methods:
+
+\starttyping
+var str = f:read([string|number])
+var pos = f:seek(whence[,offset])
+\stoptyping
+
+There is a predefined table \type {catcodes} with sybolic entries
+for:
+
+\starttabulate
+\NC \type {tex} \NC regular \TEX\ catcode regime \NC \NR
+\NC \type {ctx} \NC standard \CONTEXT\ catcode regime \NC \NR
+\NC \type {vrb} \NC verbatim catcode regime \NC \NR
+\NC \type {prt} \NC protected \CONTEXT\ catcode regime \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title=Colofon]
+
+\starttabulate[|B|p|]
+\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR
+\NC version \NC \currentdate \NC \NR
+\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR
+\stoptabulate
+
+\stopsection
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/libraries/libraries-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/libraries/libraries-mkiv.tex
index 67ca7596618..f1801efc0a0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/libraries/libraries-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/libraries/libraries-mkiv.tex
@@ -61,7 +61,7 @@
support=www.contextgarden.net,
website=www.pragma-ade.nl]
-\startluasetups[swiglib]
+\startluasetups[libraries]
context.nohyphens()
for i=1,640 do
context.definedfont { string.formatters["TitlePageMono at %p"](65536*(10+math.random(5))) }
@@ -76,7 +76,7 @@ StartPage ;
fill Page enlarged 1cm withcolor \MPcolor{extracolor} ;
- draw textext("\framed[loffset=2pt,roffset=2pt,frame=off,width=\paperwidth,align={normal,paragraph,verytolerant,stretch}]{\luasetup{swiglib}}")
+ draw textext("\framed[loffset=2pt,roffset=2pt,frame=off,width=\paperwidth,align={normal,paragraph,verytolerant,stretch}]{\luasetup{libraries}}")
xysized (PaperWidth,PaperHeight)
shifted center Page
withcolor .8white ;
@@ -107,6 +107,39 @@ StopPage ;
\startsection[title=Introduction]
+Since we started developing \LUATEX\ several methods have been explored with
+regards to external libraries. Now, before we go into details, it must be said
+that in practice this feature is hardly needed. If someone really needs it, it is
+likely to be in a setting where one can also write some library interface and
+compile \LUATEX\ to suit it. So, what we're talking of here is probably not of
+interest for all of you.
+
+In the perspective of \CONTEXT\ a dependency on a library is not what we have in
+mind when we advocate long term usage (and stability) of a workflow. If you see
+\TEX\ as an independent component but still depend on its use of libraries you
+might consider having a backup plan in case a library is no longer maintained, of
+when it gets replaced by another favourite, as happens. There are several ways to
+use a library, and we mention a few here.
+
+The first one is to use \LUA\ {\em wrapper} libraries that interface to some {\em
+specific} library. This is what you do when you use \LUA\ as stand alone program.
+In that case you depend on someone cooking up an efficient and reliable
+interface. Then you depend on the author or others to provide the binaries. If
+there is only one target platform you can wonder if you like that additional
+dependency. Another aspect to keep in mind is that such a wrapper library has to
+match both the used library and the version of \LUA\ that you use. When we use
+this method in \LUATEX, one also has also to make sure that the \LUATEX\ binary
+is compiled in a way that permits loading (this has to do with exposing symbols
+that need a runtime binding).
+
+Because this didn't work out well in practice, already before version 1.0 showed
+up we explored a flexible way to create libraries suited for \LUATEX. This
+project was tagged \quotation {\SWIGLIB}. An infrastructure was created and a
+couple of example library interfaces were provided. However, in practice this
+never catched on and we don't expect distributions to provide libraries in
+addition to the main \LUATEX\ binary, but the framework is there for those who
+want to play with it.
+
Not long after we released \LUATEX\ 1.0, we started experimenting a bit more with
so called foreign function interface: \FFI. Originally that interface to external
libraries was only available in \LUAJITTEX, but a good and compatible alternative
@@ -115,39 +148,43 @@ to know how it works, as long as it works. It means that in addition to \SWIGLIB
we have a method that doesn't demand compilation as it uses normal (public)
libraries.
-Of course one needs to make sure that the right version of a library is used.
-And, as there is the danger of the \API\ having been changed in an incompatible
-way one can wonder if such a dependency is really what one wants. On the other
-hand one can expect \CONTEXT\ to keep up.
-
-Do you really need libraries? For instance does it really make sense to use curl,
-ghostscript or graphicmagic libraries while the command line version is
-(normally) just as efficient and avoids a dependency. This is even more true if
-you realizes that for instance a fetch or conversion only needs to happen once
-per run or in fact only when there is some change in the resource.
-
-On the other hand, when accessing databases one can avoid the often slower
-command line calls and save the hassle of intermediate files. Here efficiency
-wins. Also, when \CONTEXT\ is used in a high performance database backend
-application a distribution and the used libraries are not updated on a daily
-basis.
+A last alternative we mention is to just add the libraries to the \LUATEX\
+engine. In fact, this happens: the \METAPOST\ binary has been provided this way
+for quite a while now. In \LUAMETATEX\ for instance some more math related
+libraries were added, simply because the overhead is not that large and because
+it is a way to extend \METAPOST\ beyond what it provided out of the box.
+
+Before we proceed, ask yourself this questions: \quotation {Do I really need more
+libraries?} For instance does it really make sense to use \CURL, \GHOSTSCRIPT\ or
+\GRAPHICSMAGICK\ libraries while the command line version is (normally) just as
+efficient and avoids a dependency. This is even more true if you realizes that
+for instance a fetch or conversion only needs to happen once per run or in fact
+only when there is some change in the resource. On the other hand, when accessing
+databases one can avoid the often slower command line calls and save the hassle
+of intermediate files. Here efficiency wins. Also, when \CONTEXT\ is used in a
+high performance database backend application a distribution and the used
+libraries are not updated on a daily basis. Anyway, if the answer to the
+question, and it can depend on what variant of \CONTEXT\ you use: \MKIV\ or
+\LMTX, is \quotation {Yes!} then read on.
\stopsection
-\startsection[title=Supported]
+\startsection[title=Usage in \MKIV]
-Apart from some experiments we currently can use \FFI\ interfaced libraries in:
+Although there are (still) some examples of \SWIGLIB\ in \MKIV\ we now assume
+that the \FFI\ interface is used. Apart from some experiments we currently can
+use \FFI\ interfaced libraries in:
\starttabulate[|l|l|l|l|l|]
\FL
-\BC module \BC library \BC windows \BC unix \NC \NR
+\BC module \BC library \BC windows \BC unix \NC \NR
\ML
-\NC util-crl \NC curl \NC libcurl \NC libcurl \NC \NR % todo: client and ffi
-\NC util-sql-imp-ffi \NC mysql \NC libmysql \NC libmysqlclient \NC \NR
-\NC util-sql-imp-sqlite \NC sqlite \NC sqlite3 \NC sqlite3 \NC \NR
-%NC font-phb-imp-library \NC harfbuzz \NC libharfbuzz \NC libharfbuzz \NC \NR % for testing uniscribe (idris fonts)
-%NC \NC ghostscript \NC \NC \NC \NR % only a few experiments
-%NC \NC graphicmagick \NC \NC \NC \NR % only a few experiments
+\NC util-crl \NC curl \NC libcurl \NC libcurl \NC \NR % todo: client and ffi
+\NC util-sql-imp-ffi \NC mysql \NC libmysql \NC libmysqlclient \NC \NR
+\NC util-sql-imp-sqlite \NC sqlite \NC sqlite3 \NC sqlite3 \NC \NR
+%NC font-phb-imp-library \NC harfbuzz \NC libharfbuzz \NC libharfbuzz \NC \NR % old, for testing uniscribe (idris fonts)
+%NC \NC ghostscript \NC \NC \NC \NR % only a few experiments
+%NC \NC graphicsmagick \NC \NC \NC \NR % only a few experiments
\LL
\stoptabulate
@@ -161,7 +198,7 @@ different versions. You can try to play safe and put libraries in the \TEX\ tree
instance on my system they are in:
\starttyping
-c:/data/tex-context/tex/texmf-win64/bin/lib/luatex/lua/whatever/libwhatever.dll
+c:/data/tex-context/tex/texmf-win64/bin/lib/luatex/foo/libfoo.dll
\stoptyping
You can trace where libraries are looked for with:
@@ -179,9 +216,60 @@ trackers.enable("resolvers.ffilib")
The library is first located on one of the valid \TDS\ paths (these are sort of
standardized in \TEX\ distributions) and then using the normal \FFI\ loader.
-As this is all still experimental in \LUATEX\ there is not much more to say about
-it now. Of course this kind of specialized support to a large degree depends on
-the need to use it.
+\stopsection
+
+\startsection[title=Usage in \LMTX]
+
+In \CONTEXT\ \LMTX\ we only have so called \quote {optional} libraries. Actually
+they are just simple interfaces that register themselves in the \type {optional}
+namespace and that can load the real library at runtime. The approach is rather
+lightweight in the sense that compilation of the \LUAMETATEX\ binary doesn't
+depend on additional resources (there is no need to have the libraries on the
+system or their source code to be present) and that at runtime there is no need
+to have the libraries present. This sounds similar to delayed loading of \LUA\
+wrapper libraries but the difference is that there is no potential \LUA\ version
+clash and we also still have one single (relatively small) binary.
+
+This approach works ok because in practice only very few users need a library and
+when they do they have to compile the interface anyway. And, as they compile,
+they can as well add a few lines that are needed to integrate their library to
+the optional mechanism. If you depend on such extensions, you quite certainly
+know what you're doing and need to maintain a code base very careful.
+
+There are some optional libraries present, like:
+
+\starttabulate[|l|l|l|l|l|]
+\FL
+\BC module \BC library \BC windows \BC unix \NC \NR
+\ML
+\NC libs-imp-curl \NC curl \NC libcurl \NC libcurl \NC \NR
+\NC libs-imp-mysql \NC mysql \NC libmysql \NC libmysqlclient \NC \NR
+\NC libs-imp-sqlite \NC sqlite \NC sqlite3 \NC sqlite3 \NC \NR
+%NC libs-imp-postgress \NC libpg \NC libpg \NC libpg \NC \NR % untested
+\NC libs-imp-zint \NC libzint \NC libzint \NC libzint \NC \NR
+\NC libs-imp-mujs \NC libmujs \NC libmujs \NC libmujs \NC \NR
+\NC libs-imp-ghostscript \NC ghostscript \NC gswin64 \NC libgs \NC \NR
+\NC libs-imp-graphicsmagick \NC graphicsmagick \NC several \NC unknown \NC \NR
+%NC font-phb-imp-internal \NC hb \NC libharfbuzz \NC libharfbuzz \NC \NR % maybe, for idris, testing uniscribe
+\LL
+\stoptabulate
+
+It is still to be decided how these will be used. An example of a library that
+can be used out of the box is \ZINT\ for using barcodes: see \type {m-zint.mkxl}
+for an example of its usage. The \SQL\ libraries have their own manuals and have
+been around for a while. They have a common encapsulating infrastructure written
+in \LUA.
+
+It is best to keep libraries in a place where you can keep an eye on them being
+updated, like
+
+\starttyping
+c:/data/tex-context/tex/texmf-win64/bin/lib/luametatex/foo/libfoo.dll
+\stoptyping
+
+You could of course use the ones provided by the system or maybe use symbolic
+links so that you still keep en eye on changes. The \CONTEXT\ distribution might
+at some point provide the libraries that we support.
\stopsection
@@ -191,7 +279,7 @@ the need to use it.
\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR
\NC version \NC \currentdate \NC \NR
\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR
-\NC comment \NC many thanks to Luigi Scarso for taking care of ffi support in the engines \NC \NR
+\NC comment \NC many thanks to Luigi Scarso for taking care of \FFI\ support in the engines \NC \NR
\stoptabulate
\stopsection
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-boxes.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-boxes.tex
new file mode 100644
index 00000000000..986d07b1b61
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-boxes.tex
@@ -0,0 +1,698 @@
+% language=us
+
+% \hfil \hss
+% spread
+
+\environment lowlevel-style
+
+\startdocument
+ [title=boxes,
+ color=middlered]
+
+\startsection[title=Preamble]
+
+\startsubsection[title=Introduction]
+
+An average \CONTEXT\ user will not use the low level box primitives but a basic
+understanding of how \TEX\ works doesn't hurt. In fact, occasionally using a box
+command might bring a solution not easily achieved otherwise, simply because a
+more high level interface can also be in the way.
+
+The best reference is of course The \TeX book so if you're really interested in
+the details you should get a copy of that book. Below I will not go into details
+about all kind of glues, kerns and penalties, just boxes it is.
+
+This explanation will be extended when I feel the need (or users have questions
+that can be answered here).
+
+\stopsubsection
+
+\startsubsection[title=Boxes]
+
+This paragraph of text is made from lines that contain words that themselves
+contain symbolic representations of characters. Each line is wrapped in a so
+called horizontal box and eventually those lines themselves get wrapped in what
+we call a vertical box.
+
+\startbuffer
+\vbox \bgroup
+ \hsize 5cm
+ \raggedright
+ This is a rather narrow paragraph blown up a bit. Here we use a flush left,
+ aka ragged right, approach.
+\egroup
+\stopbuffer
+
+When we expose some details of a paragraph it looks like this:
+
+\startlinecorrection
+\startcombination[2*1]
+ {\scale[width=8cm]{\showmakeup[boxes]\getbuffer}} {}
+ {\scale[width=8cm]{\showmakeup\getbuffer}} {}
+\stopcombination
+\stoplinecorrection
+
+The left only shows the boxes, the variant at the right shows (font) kerns and
+glue too. Because we flush left, there is rather strong right skip glue at the
+right boundary of the box. If font kerns show up depends on the font, not all
+fonts have them (or have only a few). The glyphs themselves are also kind of
+boxed, as their dimensions determine the area that they occupy:
+
+\startlinecorrection
+ \scale[width=\textwidth]{\showglyphs\hbox{This is a rather ...}}
+\stoplinecorrection
+
+But, internally they are not really boxed, as they already are a single quantity.
+The same is true for rules: they are just blobs with dimensions. A box on the
+other hand wraps a linked list of so called nodes: glyphs, kerns, glue,
+penalties, rules, boxes, etc. It is a container with properties like width,
+height, depth and shift.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\TEX\ primitives}]
+
+The box model is reflected in \TEX's user interface but not by that many
+commands, most noticeably \type {\hbox}, \type {\vbox} and \type {\vtop}. Here is
+an example of the first one:
+
+\starttyping[option=TEX]
+\hbox width 10cm{text}
+\hbox width 10cm height 1cm depth 5mm{text}
+text \raise5mm\hbox{text} text
+\stoptyping
+
+The \type {\raise} and \type {\lower} commands behave the same but in opposite
+directions. One could as well have been defined in terms of the other.
+
+\startbuffer
+text \raise 5mm \hbox to 2cm {text}
+text \lower -5mm \hbox to 2cm {text}
+text \raise -5mm \hbox to 2cm {text}
+text \lower 5mm \hbox to 2cm {text}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+{\dontcomplain\showboxes\getbuffer}
+\stoplinecorrection
+
+A box can be moved to the left or right but, believe it or not, in \CONTEXT\ we
+never use that feature, probably because the consequences for the width are such
+that we can as well use kerns. Here are some examples:
+
+\startbuffer
+text \vbox{\moveleft 5mm \hbox {left}}text !
+text \vbox{\moveright 5mm \hbox{right}}text !
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+{\dontcomplain\getbuffer}
+\stoplinecorrection
+
+\startbuffer
+text \vbox{\moveleft 25mm \hbox {left}}text !
+text \vbox{\moveright 25mm \hbox{right}}text !
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+{\dontcomplain\getbuffer}
+\stoplinecorrection
+
+Code like this will produce a complaint about an underfull box but we can easily
+get around that:
+
+\startbuffer
+text \raise 5mm \hbox to 2cm {\hss text}
+text \lower -5mm \hbox to 2cm {text\hss}
+text \raise -5mm \hbox to 2cm {\hss text}
+text \lower 5mm \hbox to 2cm {text\hss}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The \type {\hss} primitive injects a glue that when needed will fill up the
+available space. So, here we force the text to the right or left.
+
+\startlinecorrection
+{\dontcomplain\showboxes\getbuffer}
+\stoplinecorrection
+
+We have three kind of boxes: \type {\hbox}, \type {\vbox} and \type {\vtop}:
+
+\startbuffer
+\hbox{\strut height and depth\strut}
+\vbox{\hsize 4cm \strut height and depth\par and width\strut}
+\vtop{\hsize 4cm \strut height and depth\par and width\strut}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+A \type {\vbox} aligns at the bottom and a \type {\vtop} at the top. I have added
+some so called struts to enforce a consistent height and depth. A strut is an
+invisible quantity (consider it a black box) that enforces consistent line
+dimensions: height and depth.
+
+
+\startlinecorrection
+{\dontcomplain\hbox{\showstruts\showboxes\getbuffer}}
+\stoplinecorrection
+
+You can store a box in a register but you need to be careful not to use a
+predefined one. If you need a lot of boxes you can reserve some for your own:
+
+\starttyping
+\newbox\MySpecialBox
+\stoptyping
+
+but normally you can do with one of the scratch registers, like 0, 2, 4, 6 or 8,
+for local boxes, and 1, 3, 5, 7 and 9 for global ones. Registers are used like:
+
+\starttyping
+ \setbox0\hbox{here}
+\global\setbox1\hbox{there}
+\stoptyping
+
+In \CONTEXT\ you can also use
+
+\starttyping
+\setbox\scratchbox \hbox{here}
+\setbox\scratchboxone\hbox{here}
+\setbox\scratchboxtwo\hbox{here}
+\stoptyping
+
+and some more. In fact, there are quite some predefined scratch registers (boxes,
+dimensions, counters, etc). Feel free to investigate further.
+
+When a box is stored, you can consult its dimensions with \type {\wd}, \type
+{\ht} and \type {\dp}. You can of course store them for later use.
+
+\starttyping
+\scratchwidth \wd\scratchbox
+\scratchheight\ht\scratchbox
+\scratchdepth \dp\scratchbox
+\scratchtotal \dimexpr\ht\scratchbox+\dp\scratchbox\relax
+\scratchtotal \htdp\scratchbox
+\stoptyping
+
+The last line is \CONTEXT\ specific. You can also set the dimensions
+
+\starttyping
+\wd\scratchbox 10cm
+\ht\scratchbox 10mm
+\dp\scratchbox 5mm
+\stoptyping
+
+So you can cheat! A box is placed with \type {\copy}, which keeps the original
+intact or \type {\box} which just inserts the box and then wipes the register. In
+practice you seldom need a copy, which is more expensive in runtime anyway. Here
+we use copy because it serves the examples.
+
+\starttyping
+\copy\scratchbox
+\box \scratchbox
+\stoptyping
+
+\stopsection
+
+\startsection[title={\ETEX\ primitives}]
+
+The \ETEX\ extensions don't add something relevant for boxes, apart from that you
+can use the expressions mechanism to mess around with their dimensions. There is
+a mechanism for typesetting r2l within a paragraph but that has limited
+capabilities and doesn't change much as it's mostly a way to trick the backend
+into outputting a stretch of text in the other direction. This feature is not
+available in \LUATEX\ because it has an alternative direction mechanism.
+
+\stopsection
+
+\startsection[title={\LUATEX\ primitives}]
+
+The concept of boxes is the same in \LUATEX\ as in its predecessors but there are
+some aspects to keep in mind. When a box is typeset this happens in \LUATEX:
+
+\startitemize[n]
+ \startitem
+ A list of nodes is constructed. In \LUATEX\ this is a double linked
+ list (so that it can easily be manipulated in \LUA) but \TEX\ itself
+ only uses the forward links.
+ \stopitem
+ \startitem
+ That list is hyphenated, that is: so called discretionary nodes are
+ injected. This depends on the language properties of the glyph
+ (character) nodes.
+ \stopitem
+ \startitem
+ Then ligatures are constructed, if the font has such combinations. When
+ this built|-|in mechanism is used, in \CONTEXT\ we speak of base mode.
+ \stopitem
+ \startitem
+ After that inter|-|character kerns are applied, if the font provides
+ them. Again this is a base mode action.
+ \stopitem
+ \startitem
+ Finally the box gets packaged:
+ \startitemize
+ \startitem
+ In the case of a horizontal box, the list is packaged in a
+ hlist node, basically one liner, and its dimensions are calculated
+ and set.
+ \stopitem
+ \startitem
+ In the case of a vertical box, the paragraph is broken into one
+ or more lines, without hyphenation, with optimal hyphenation or
+ in the worst case with so called emergency stretch applied, and
+ the result becomes a vlist node with its dimensions set.
+ \stopitem
+ \stopitemize
+ \stopitem
+\stopitemize
+
+In traditional \TEX\ the first four steps are interwoven but in \LUATEX\ we need
+them split because the step~5 can be overloaded by a callback. In that case steps
+3 and 4 (and maybe 2) are probably also overloaded, especially when you bring
+handling of fonts under \LUA\ control.
+
+New in \LUATEX\ are three packers: \type {\hpack}, \type {\vpack} and \type
+{\tpack}, which are companions to \type {\hbox}, \type {\vbox} and \type {\vtop}
+but without the callbacks applied. Using them is a bit tricky as you never know
+if a callback should be applied, which, because users can often add their own
+\LUA\ code, is not something predictable.
+
+Another box related extension is direction. There are four possible directions
+but because in \LUAMETATEX\ there are only two. Because this model has been upgraded,
+it will be discusses in the next section. A \CONTEXT\ user is supposed to use the
+official \CONTEXT\ interfaces in order to be downward compatible.
+
+\stopsection
+
+\startsection[title={\LUAMETATEX\ primitives}]
+
+There are two possible directions: left to right (the default) and right to left
+for Hebrew and Arabic. Here is an example that shows how it'd done with low level
+directives:
+
+\startbuffer
+\hbox direction 0 {from left to right}
+\hbox direction 1 {from right to left}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+A low level direction switch is done with:
+
+\startbuffer
+\hbox direction 0
+ {from left to right \textdirection 1 from right to left}
+\hbox direction 1
+ {from right to left \textdirection 1 from left to right}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+but actually this is kind of {\em not done} in \CONTEXT, because there you are
+supposed to use the proper direction switches:
+
+\startbuffer
+\naturalhbox {from left to right}
+\reversehbox {from right to left}
+\naturalhbox {from left to right \righttoleft from right to left}
+\reversehbox {from right to left \lefttoright from left to right}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+Often more is needed to properly support right to left typesetting so using the
+\CONTEXT\ commands is more robust.
+
+In \LUAMETATEX\ the box model has been extended a bit, this as a consequence of
+dropping the vertical directional typesetting, which never worked well. In
+previous sections we discussed the properties width, height and depth and the
+shift resulting from a \type {\raise}, \type {\lower}, \type {\moveleft} and
+\type {\moveright}. Actually, the shift is also used in for instance positioning
+math elements.
+
+The way shifting influences dimensions can be somewhat puzzling. Internally, when
+\TEX\ packages content in a box there are two cases:
+
+\startitemize
+ \startitem
+ When a horizontal box is made, and \typ {height - shift} is larger than the
+ maximum height so far, that delta is taken. When \typ {depth + shift} is
+ larger than the current depth, then that depth is adapted. So, a shift up
+ influences the height and a shift down influences the depth.
+ \stopitem
+ \startitem
+ In the case of vertical packaging, when \typ {width + shift} is larger
+ than the maximum box (line) width so far, that maximum gets bumped. So, a
+ shift to the right can contribute, but a shift to the left cannot result
+ in a negative width. This is also why vertical typesetting, where height
+ and depth are swapped with width, goes wrong: we somehow need to map two
+ properties onto one and conceptually \TEX\ is really set up for
+ horizontal typesetting. (And it's why I decided to just remove it from the
+ engine.)
+ \stopitem
+\stopitemize
+
+This is one of these cases where \TEX\ behaves as expected but it also means that
+there is some limitation to what can be manipulated. Setting the shift using one
+of the four commands has a direct consequence when a box gets packaged which
+happens immediately because the box is an argument to the foursome.
+
+There is in traditional \TEX, probably for good reason, no way to set the shift
+of a box, if only because the effect would normally be none. But in \LUATEX\ we
+can cheat, and therefore, for educational purposed \CONTEXT\ has implements
+some cheats.
+
+We use this sample box:
+
+\startbuffer[demo]
+\setbox\scratchbox\hbox\bgroup
+ \middlegray\vrule width 20mm depth -.5mm height 10mm
+ \hskip-20mm
+ \darkgray \vrule width 20mm height -.5mm depth 5mm
+\egroup
+\stopbuffer
+
+\typebuffer[demo][option=TEX]
+
+When we mess with the shift using the \CONTEXT\ \type {\shiftbox} helper, we see
+no immediate effect. We only get the shift applied when we use another helper,
+\type {\hpackbox}.
+
+\startbuffer
+\hbox\bgroup
+ \showstruts \strut
+ \quad \copy\scratchbox
+ \quad \shiftbox\scratchbox -20mm \copy\scratchbox
+ \quad \hpackbox\scratchbox \box \scratchbox
+ \quad \strut
+\egroup
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer[demo]\getbuffer
+\stoplinecorrection
+
+When instead we use \type {\vpackbox} we get a different result. This time we
+move left.
+
+\startbuffer
+\hbox\bgroup
+ \showstruts \strut
+ \quad \copy\scratchbox
+ \quad \shiftbox\scratchbox -10mm \copy\scratchbox
+ \quad \vpackbox\scratchbox \copy\scratchbox
+ \quad \strut
+\egroup
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer[demo]\getbuffer
+\stoplinecorrection
+
+The shift is set via \LUA\ and the repackaging is also done in \LUA, using the
+low level \type {hpack} and \type {vpack} helpers and these just happen to look
+at the shift when doing their job. At the \TEX\ end this never happens.
+
+This long exploration of shifting serves a purpose: it demonstrates that there is
+not that much direct control over boxes apart from their three dimensions.
+However this was never a real problem as one can just wrap a box in another one
+and use kerns to move the embedded box around. But nevertheless I decided to see
+if the engine can be a bit more helpful, if only because all that extra wrapping
+gives some overhead and complications when we want to manipulate boxes. And of
+course it is also a nice playground.
+
+We start with changing the direction. Changing this property doesn't require
+repackaging because directions are not really dealt with in the frontend. When
+a box is converted to (for instance \PDF) the reversion happens.
+
+\startbuffer
+\setbox\scratchbox\hbox{whatever}
+\the\boxdirection\scratchbox: \copy\scratchbox \crlf
+\boxdirection\scratchbox 1
+\the\boxdirection\scratchbox: \copy\scratchbox
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+Another property that can be queried and set is an attribute. In order to get
+a private attribute we define one.
+
+\startbuffer
+\newattribute\MyAt
+\setbox\scratchbox\hbox attr \MyAt 123 {whatever}
+[\the\boxattr\scratchbox\MyAt]
+\boxattr\scratchbox\MyAt 456
+[\the\boxattr\scratchbox\MyAt]
+[\ifnum\boxattr\scratchbox\MyAt>400 okay\fi]
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+The sum of the height and depth is available too. Because for practical reasons
+setting that property is also needed then, the choice was made to distribute the
+value equally over height and depth.
+
+\startbuffer
+\setbox\scratchbox\hbox {height and depth}
+[\the\ht\scratchbox]
+[\the\dp\scratchbox]
+[\the\boxtotal\scratchbox]
+\boxtotal\scratchbox=20pt
+[\the\ht\scratchbox]
+[\the\dp\scratchbox]
+[\the\boxtotal\scratchbox]
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+We've now arrived to a set of properties that relate to each other. They are
+a bit complex and given the number of possibilities one might need to revert
+to some trial and error: orientations and offsets. As with the dimensions,
+directions and attributes, they are passed as box specification. We start
+with the orientation.
+
+\startbuffer
+\hbox \bgroup \showboxes
+ \hbox orientation 0 {right}
+ \quad \hbox orientation 1 {up}
+ \quad \hbox orientation 2 {left}
+ \quad \hbox orientation 3 {down}
+\egroup
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+When the orientation is set, you can also set an offset. Where shifting around a box
+can have consequences for the dimensions, an offset is virtual. It gets effective
+in the backend, when the contents is converted to some output format.
+
+\startbuffer
+\hbox \bgroup \showboxes
+ \hbox orientation 0 yoffset 10pt {right}
+ \quad \hbox orientation 1 xoffset 10pt {up}
+ \quad \hbox orientation 2 yoffset -10pt {left}
+ \quad \hbox orientation 3 xoffset -10pt {down}
+\egroup
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+The reason that offsets are related to orientation is that we need to know in
+what direction the offsets have to be applied and this binding forces the user to
+think about it. You can also set the offsets using commands.
+
+\startbuffer
+\setbox\scratchbox\hbox{whatever}%
+1 \copy\scratchbox
+2 \boxorientation\scratchbox 2 \copy\scratchbox
+3 \boxxoffset \scratchbox -15pt \copy\scratchbox
+4 \boxyoffset \scratchbox -15pt \copy\scratchbox
+5
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\ruledhbox{\getbuffer}
+\stoplinecorrection
+
+\startbuffer
+\setbox\scratchboxone\hbox{whatever}%
+\setbox\scratchboxtwo\hbox{whatever}%
+1 \boxxoffset \scratchboxone -15pt \copy\scratchboxone
+2 \boxyoffset \scratchboxone -15pt \copy\scratchboxone
+3 \boxxoffset \scratchboxone -15pt \copy\scratchboxone
+4 \boxyoffset \scratchboxone -15pt \copy\scratchboxone
+5 \boxxmove \scratchboxtwo -15pt \copy\scratchboxtwo
+6 \boxymove \scratchboxtwo -15pt \copy\scratchboxtwo
+7 \boxxmove \scratchboxtwo -15pt \copy\scratchboxtwo
+8 \boxymove \scratchboxtwo -15pt \copy\scratchboxtwo
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\ruledhbox{\getbuffer}
+\stoplinecorrection
+
+The move commands are provides as convenience and contrary to the offsets they do
+adapt the dimensions. Internally, with the box, we register the orientation and
+the offsets and when you apply these commands multiple times the current values
+get overwritten. But \unknown\ because an orientation can be more complex you
+might not get the effects you expect when the options we discuss next are used.
+The reason is that we store the original dimensions too and these come into play
+when these other options are used: anchoring. So, normally you will apply an
+orientation and offsets once only.
+
+% the next bit is derived from the followingup document
+
+The orientation specifier is actually a three byte number that best can be seen
+hexadecimal (although we stay within the decimal domain). There are three
+components: x|-|anchoring, y|-|anchoring and orientation:
+
+\starttyping
+0x<X><Y><O>
+\stoptyping
+
+or in \TEX\ speak:
+
+\starttyping
+"<X><Y><O>
+\stoptyping
+
+The landscape and seascape variants both sit on top of the baseline while the
+flipped variant has its depth swapped with the height. Although this would be
+enough a bit more control is possible.
+
+The vertical options of the horizontal variants anchor on the baseline, lower
+corner, upper corner or center.
+
+\startbuffer
+\ruledhbox orientation "002 {\TEX} and
+\ruledhbox orientation "012 {\TEX} and
+\ruledhbox orientation "022 {\TEX} and
+\ruledhbox orientation "032 {\TEX}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\ruledhbox{\getbuffer}
+\stoplinecorrection
+
+The horizontal options of the horizontal variants anchor in the center, left,
+right, halfway left and halfway right.
+
+\startbuffer
+\ruledhbox orientation "002 {\TEX} and
+\ruledhbox orientation "102 {\TEX} and
+\ruledhbox orientation "202 {\TEX} and
+\ruledhbox orientation "302 {\TEX} and
+\ruledhbox orientation "402 {\TEX}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\ruledhbox{\getbuffer}
+\stoplinecorrection
+
+The orientation has consequences for the dimensions so they are dealt with in the
+expected way in constructing lines, paragraphs and pages, but the anchoring is
+virtual, like the offsets. There are two extra variants for orientation zero: on
+top of baseline or below, with dimensions taken into account.
+
+\startbuffer
+\ruledhbox orientation "000 {\TEX} and
+\ruledhbox orientation "004 {\TEX} and
+\ruledhbox orientation "005 {\TEX}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\ruledhbox{\getbuffer}
+\stoplinecorrection
+
+The anchoring can look somewhat confusing but you need to keep in mind that it is
+normally only used in very controlled circumstances and not in running text.
+Wrapped in macros users don't see the details. We're talking boxes here, so for
+instance:
+
+\startbuffer
+test\quad
+\hbox orientation 3 \bgroup
+ \strut test\hbox orientation "002 \bgroup\strut test\egroup test%
+\egroup \quad
+\hbox orientation 3 \bgroup
+ \strut test\hbox orientation "002 \bgroup\strut test\egroup test%
+\egroup \quad
+\hbox orientation 3 \bgroup
+ \strut test\hbox orientation "012 \bgroup\strut test\egroup test%
+\egroup \quad
+\hbox orientation 3 \bgroup
+ \strut test\hbox orientation "022 \bgroup\strut test\egroup test%
+\egroup \quad
+\hbox orientation 3 \bgroup
+ \strut test\hbox orientation "032 \bgroup\strut test\egroup test%
+\egroup \quad
+\hbox orientation 3 \bgroup
+ \strut test\hbox orientation "042 \bgroup\strut test\egroup test%
+\egroup
+\quad test
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\ruledhbox{\getbuffer}
+\stoplinecorrection
+
+\stopsection
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-conditionals.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-conditionals.tex
new file mode 100644
index 00000000000..ea3c9e1a244
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-conditionals.tex
@@ -0,0 +1,1409 @@
+% language=us
+
+\environment lowlevel-style
+
+\startdocument
+ [title=conditionals,
+ color=middleblue]
+
+\startsection[title=Preamble]
+
+\startsubsection[title=Introduction]
+
+You seldom need the low level conditionals because there are quite some so called
+support macros available in \CONTEXT . For instance, when you want to compare two
+values (or more accurate: sequences of tokens), you can do this:
+
+\starttyping[option=TEX]
+\doifelse {foo} {bar} {
+ the same
+} {
+ different
+}
+\stoptyping
+
+But if you look in the \CONTEXT\ code, you will see that often we use primitives
+that start with \type {\if} in low level macros. There are good reasons for this.
+First of all, it looks familiar when you also code in other languages. Another
+reason is performance but that is only true in cases where the snippet of code is
+expanded very often, because \TEX\ is already pretty fast. Using low level \TEX\
+can also be more verbose, which is not always nice in a document source. But, the
+most important reason (for me) is the layout of the code. I often let the look
+and feel of code determine the kind of coding. This also relates to the syntax
+highlighting that I am using, which is consistent for \TEX, \METAPOST, \LUA,
+etc.\ and evolved over decades. If code looks bad, it probably is bad. Of course
+this doesn't mean all my code looks good; you're warned. In general we can say
+that I often use \type {\if...} when coding core macros, and \type {\doifelse...}
+macros in (document) styles and modules.
+
+In the sections below I will discuss the low level conditions in \TEX. For the
+often more convenient \CONTEXT\ wrappers you can consult the source of the system
+and support modules, the wiki and|/|or manuals.
+
+Some of the primitives shown here are only available in \LUATEX, and some only in
+\LUAMETATEX . We could do without them for decades but they were added to these
+engines because of convenience and, more important, because then made for nicer
+code. Of course there's also the fun aspect. This manual is not an invitation to
+use these very low level primitives in your document source. The ones that
+probably make most sense are \type {\ifnum}, \type {\ifdim} and \type {\ifcase}.
+The others are often wrapped into support macros that are more convenient.
+
+In due time I might add more examples and explanations. Also, maybe some more
+tests will show up as part of the \LUAMETATEX\ project.
+
+\stopsubsection
+
+\startsubsection[title={Number and dimensions}]
+
+Numbers and dimensions are basic data types in \TEX. When you enter one, a number
+is just that but a dimension gets a unit. Compare:
+
+\starttyping[option=TEX]
+1234
+1234pt
+\stoptyping
+
+If you also use \METAPOST, you need to be aware of the fact that in that language
+there are not really dimensions. The \type {post} part of the name implies that
+eventually a number becomes a \POSTSCRIPT\ unit which represents a base point (\type
+{bp}) in \TEX. When in \METAPOST\ you entry \type {1234pt} you actually multiply
+\type {1234} by the variable \type {pt}. In \TEX\ on the other hand, a unit like
+\type {pt} is one of the keywords that gets parsed. Internally dimensions are
+also numbers and the unit (keyword) tells the scanner what multiplier to use.
+When that multiplier is one, we're talking of scaled points, with the unit \type
+{sp}.
+
+\startbuffer
+\the\dimexpr 12.34pt \relax
+\the\dimexpr 12.34sp \relax
+\the\dimexpr 12.99sp \relax
+\the\dimexpr 1234sp \relax
+\the\numexpr 1234 \relax
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlines \getbuffer \stoplines
+
+When we serialize a dimension it always shows the dimension in points, unless we
+serialize it as number.
+
+\startbuffer
+\scratchdimen1234sp
+\number\scratchdimen
+\the\scratchdimen
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlines \getbuffer \stoplines
+
+When a number is scanned, the first thing that is taken care of is the sign. In many
+cases, when \TEX\ scans for something specific it will ignore spaces. It will
+happily accept multiple signs:
+
+\startbuffer
+\number +123
+\number +++123
+\number + + + 123
+\number +-+-+123
+\number --123
+\number ---123
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlines \getbuffer \stoplines
+
+Watch how the negation accumulates. The scanner can handle decimal, hexadecimal
+and octal numbers:
+
+\startbuffer
+\number -123
+\number -"123
+\number -'123
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlines \getbuffer \stoplines
+
+A dimension is scanned like a number but this time the scanner checks for upto
+three parts: an either or not signed number, a period and a fraction. Here no
+number means zero, so the next is valid:
+
+\startbuffer
+\the\dimexpr . pt \relax
+\the\dimexpr 1. pt \relax
+\the\dimexpr .1pt \relax
+\the\dimexpr 1.1pt \relax
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlines \getbuffer \stoplines
+
+Again we can use hexadecimal and octal numbers but when these are entered, there
+can be no fractional part.
+
+\startbuffer
+\the\dimexpr 16 pt \relax
+\the\dimexpr "10 pt \relax
+\the\dimexpr '20 pt \relax
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlines \getbuffer \stoplines
+
+The reason for discussing numbers and dimensions here is that there are cases where
+when \TEX\ expects a number it will also accept a dimension. It is good to know that
+for instance a macro defined with \type {\chardef} or \type {\mathchardef} also is
+treated as a number. Even normal characters can be numbers, when prefixed by a \type
+{`} (backtick).
+
+The maximum number in \TEX\ is 2147483647 so we can do this:
+
+\starttyping[option=TEX]
+\scratchcounter2147483647
+\stoptyping
+
+but not this
+
+\starttyping[option=TEX]
+\scratchcounter2147483648
+\stoptyping
+
+as it will trigger an error. A dimension can be positive and negative so there we
+can do at most:
+
+\starttyping[option=TEX]
+\scratchdimen 1073741823sp
+\stoptyping
+
+\startbuffer
+\scratchdimen1073741823sp
+\number\scratchdimen
+\the\scratchdimen
+\scratchdimen16383.99998pt
+\number\scratchdimen
+\the\scratchdimen
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlines
+\getbuffer
+\stoplines
+
+We can also do this:
+
+\startbuffer
+\scratchdimen16383.99999pt
+\number\scratchdimen
+\the\scratchdimen
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlines
+\getbuffer
+\stoplines
+
+but the next one will fail:
+
+\starttyping[option=TEX]
+\scratchdimen16383.9999999pt
+\stoptyping
+
+Just keep in mind that \TEX\ scans both parts as number so the error comes from
+checking if those numbers combine well.
+
+\startbuffer
+\ifdim 16383.99999 pt = 16383.99998 pt the same \else different \fi
+\ifdim 16383.999979 pt = 16383.999980 pt the same \else different \fi
+\ifdim 16383.999987 pt = 16383.999991 pt the same \else different \fi
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Watch the difference in dividing, the \type {/} rounds, while the \type {:}
+truncates.
+
+\startlines
+\getbuffer
+\stoplines
+
+You need to be aware of border cases, although in practice they never really
+are a problem:
+
+\startbuffer
+\ifdim \dimexpr16383.99997 pt/2\relax = \dimexpr 16383.99998 pt/2\relax
+ the same \else different
+\fi
+\ifdim \dimexpr16383.99997 pt:2\relax = \dimexpr 16383.99998 pt:2\relax
+ the same \else different
+\fi
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlines
+\getbuffer
+\stoplines
+
+\startbuffer
+\ifdim \dimexpr1.99997 pt/2\relax = \dimexpr 1.99998 pt/2\relax
+ the same \else different
+\fi
+\ifdim \dimexpr1.99997 pt:2\relax = \dimexpr 1.99998 pt:2\relax
+ the same \else different
+\fi
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlines
+\getbuffer
+\stoplines
+
+\startbuffer
+\ifdim \dimexpr1.999999 pt/2\relax = \dimexpr 1.9999995 pt/2\relax
+ the same \else different
+\fi
+\ifdim \dimexpr1.999999 pt:2\relax = \dimexpr 1.9999995 pt:2\relax
+ the same \else different
+\fi
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlines
+\getbuffer
+\stoplines
+
+This last case demonstrates that at some point the digits get dropped (still
+assuming that the fraction is within the maximum permitted) so these numbers then
+are the same. Anyway, this is not different in other programming languages and
+just something you need to be aware of.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\TEX\ primitives}]
+
+\startsubsection[title={\tex{if}}]
+
+I seldom use this one. Internally \TEX\ stores (and thinks) in terms of tokens.
+If you see for instance \type {\def} or \type {\dimen} or \type {\hbox} these all
+become tokens. But characters like \type {A} or {@} also become tokens. In this
+test primitive all non|-|characters are considered to be the same. In the next
+examples this is demonstrated.
+
+\startbuffer
+[\if AB yes\else nop\fi]
+[\if AA yes\else nop\fi]
+[\if CDyes\else nop\fi]
+[\if CCyes\else nop\fi]
+[\if\dimen\font yes\else nop\fi]
+[\if\dimen\font yes\else nop\fi]
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Watch how spaces after the two characters are kept: \inlinebuffer . This primitive looks
+at the next two tokens but when doing so it expands. Just look at the following:
+
+\startbuffer
+\def\AA{AA}%
+\def\AB{AB}%
+[\if\AA yes\else nop\fi]
+[\if\AB yes\else nop\fi]
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+We get: \inlinebuffer .
+
+% protected macros
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifcat}}]
+
+In \TEX\ characters (in the input) get interpreted according to their so called
+catcodes. The most common are letters (alphabetic) and and other (symbols) but
+for instance the backslash has the property that it starts a command, the dollar
+signs trigger math mode, while the curly braced deal with grouping. If for
+instance either or not the ampersand is special (for instance as column separator
+in tables) depends on the macro package.
+
+\startbuffer
+[\ifcat AB yes\else nop\fi]
+[\ifcat AA yes\else nop\fi]
+[\ifcat CDyes\else nop\fi]
+[\ifcat CCyes\else nop\fi]
+[\ifcat C1yes\else nop\fi]
+[\ifcat\dimen\font yes\else nop\fi]
+[\ifcat\dimen\font yes\else nop\fi]
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+This time we also compare a letter with a number: \inlinebuffer . In that case
+the category codes differ (letter vs other) but in this test comparing the
+letters result in a match. This is a test that is used only once in \CONTEXT\ and
+even that occasion is dubious and will go away.
+
+You can use \type {\noexpand} to prevent expansion:
+
+\startbuffer
+\def\A{A}%
+\let\B B%
+\def\C{D}%
+\let\D D%
+[\ifcat\noexpand\A Ayes\else nop\fi]
+[\ifcat\noexpand\B Byes\else nop\fi]
+[\ifcat\noexpand\C Cyes\else nop\fi]
+[\ifcat\noexpand\C Dyes\else nop\fi]
+[\ifcat\noexpand\D Dyes\else nop\fi]
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+We get: \inlinebuffer, so who still thinks that \TEX\ is easy to understand for a
+novice user?
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifnum}}]
+
+This condition compares its argument with another one, separated by an \type {<},
+\type {=} or \type {>} character.
+
+\starttyping[option=TEX]
+\ifnum\scratchcounter<0
+ less than
+\else\ifnum\scratchcounter>0
+ more than
+\else
+ equal to
+\fi zero
+\stoptyping
+
+This is one of these situations where a dimension can be used instead. In that
+case the dimension is in scaled points.
+
+\starttyping[option=TEX]
+\ifnum\scratchdimen<0
+ less than
+\else\ifnum\scratchdimen>0
+ more than
+\else
+ equal to
+\fi zero
+\stoptyping
+
+Of course this equal treatment of a dimension and number is only true when the
+dimension is a register or box property.
+
+\stopsubsection
+
+\startsection[title={\tex{ifdim}}]
+
+This condition compares one dimension with another one, separated by an \type {<},
+\type {=} or \type {>} sign.
+
+\starttyping[option=TEX]
+\ifdim\scratchdimen<0pt
+ less than
+\else\ifdim\scratchdimen>0pt
+ more than
+\else
+ equal to
+\fi zero
+\stoptyping
+
+While when comparing numbers a dimension is a valid quantity but here you cannot
+mix them: something with a unit is expected.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifodd}}]
+
+This one can come in handy, although in \CONTEXT\ it is only used in checking for
+an odd of even page number.
+
+\startbuffer
+\scratchdimen 3sp
+\scratchcounter4
+
+\ifodd\scratchdimen very \else not so \fi odd
+\ifodd\scratchcounter very \else not so \fi odd
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+As with the previously discussed \type {\ifnum} you can use a dimension variable
+too, which is then interpreted as representing scaled points. Here we get:
+
+\startlines
+\getbuffer
+\stoplines
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifvmode}}]
+
+This is a rather trivial check. It takes no arguments and just is true when we're
+in vertical mode. Here is an example:
+
+\startbuffer
+\hbox{\ifvmode\else\par\fi\ifvmode v\else h\fi mode}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+We're always in horizontal mode and issuing a \type {\par} inside a horizontal
+box doesn't change that, so we get: \ruledhbox{\inlinebuffer}.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifhmode}}]
+
+As with \type {\ifvmode} this one has no argument and just tells if we're in
+vertical mode.
+
+\startbuffer
+\vbox {
+ \noindent \ifhmode h\else v\fi mode
+ \par
+ \ifhmode h\else \noindent v\fi mode
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+You can use it for instance to trigger injection of code, or prevent that some
+content (or command) is done more than once:
+
+\startlinecorrection
+\ruledhbox{\inlinebuffer}
+\stoplinecorrection
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifmmode}}]
+
+Math is something very \TEX\ so naturally you can check if you're in math mode.
+here is an example of using this test:
+
+\starttyping[option=TEX]
+\def\enforcemath#1{\ifmmode#1\else$ #1 $\fi}
+\stoptyping
+
+Of course in reality macros that do such things are more advanced than this one.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifinner}}]
+
+\startbuffer
+\def\ShowMode
+ {\ifhmode \ifinner inner \fi hmode
+ \else\ifvmode \ifinner inner \fi vmode
+ \else\ifmmode \ifinner inner \fi mmode
+ \else \ifinner inner \fi unset
+ \fi\fi\fi}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+\startbuffer
+\ShowMode \ShowMode
+
+\vbox{\ShowMode}
+
+\hbox{\ShowMode}
+
+$\ShowMode$
+
+$$\ShowMode$$
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The first line has two tests, where the first one changes the mode to horizontal
+simply because a text has been typeset. Watch how display math is not inner.
+
+\startpacked
+\startlines
+\getbuffer
+\stoplines
+\stoppacked
+
+By the way, moving the \type {\ifinner} test outside the branches (to the top of
+the macro) won't work because once the word \type {inner} is typeset we're no
+longer in vertical mode, if we were at all.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifvoid}}]
+
+A box is one of the basic concepts in \TEX. In order to understand this primitive
+we present four cases:
+
+\startbuffer
+\setbox0\hbox{} \ifvoid0 void \else content \fi
+\setbox0\hbox{123} \ifvoid0 void \else content \fi
+\setbox0\hbox{} \box0 \ifvoid0 void \else content \fi
+\setbox0\hbox to 10pt{} \ifvoid0 void \else content \fi
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+In the first case, we have a box which is empty but it's not void. It helps to
+know that internally an hbox is actually an object with a pointer to a linked
+list of nodes. So, the first two can be seen as:
+
+\starttyping
+hlist -> [nothing]
+hlist -> 1 -> 2 -> 3 -> [nothing]
+\stoptyping
+
+but in any case there is a hlist. The third case puts something in a hlist but
+then flushes it. Now we have not even the hlist any more; the box register has
+become void. The last case is a variant on the first. It is an empty box with a
+given width. The outcome of the four lines (with a box flushed in between) is:
+
+\startlines
+\getbuffer
+\stoplines
+
+So, when you want to test if a box is really empty, you need to test also its
+dimensions, which can be up to three tests, depending on your needs.
+
+\startbuffer
+\setbox0\emptybox \ifvoid0 void\else content\fi
+\setbox0\emptybox \wd0=10pt \ifvoid0 void\else content\fi
+\setbox0\hbox to 10pt {} \ifvoid0 void\else content\fi
+\setbox0\hbox {} \wd0=10pt \ifvoid0 void\else content\fi
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Setting a dimension of a void voix (empty) box doesn't make it less void:
+
+\startlines
+\getbuffer
+\stoplines
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifhbox}}]
+
+This test takes a box number and gives true when it is an hbox.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifvbox}}]
+
+This test takes a box number and gives true when it is an vbox. Both a \type
+{\vbox} and \type {\vtop} are vboxes, the difference is in the height and depth
+and the baseline. In a \type {\vbox} the last line determines the baseline
+
+\startlinecorrection
+\ruledvbox{vbox or vtop\par vtop or vbox}
+\stoplinecorrection
+
+And in a \type {\vtop} the first line takes control:
+
+\startlinecorrection
+\ruledvtop{vbox or vtop\par vtop or vbox}
+\stoplinecorrection
+
+but, once wrapped, both internally are just vlists.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifx}}]
+
+This test is actually used a lot in \CONTEXT: it compares two token(list)s:
+
+\startbuffer
+ \ifx a b Y\else N\fi
+ \ifx ab Y\else N\fi
+\def\A {a}\def\B{b}\ifx \A\B Y\else N\fi
+\def\A{aa}\def\B{a}\ifx \A\B Y\else N\fi
+\def\A {a}\def\B{a}\ifx \A\B Y\else N\fi
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Here the result is: \quotation{\inlinebuffer}. It does not expand the content, if
+you want that you need to use an \type {\edef} to create two (temporary) macros
+that get compared, like in:
+
+\starttyping[option=TEX]
+\edef\TempA{...}\edef\TempB{...}\ifx\TempA\TempB ...\else ...\fi
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifeof}}]
+
+This test checks if a the pointer in a given input channel has reached its end.
+It is also true when the file is not present. The argument is a number which
+relates to the \type {\openin} primitive that is used to open files for reading.
+
+\stopsubsection
+
+\startsubsection[title={\tex{iftrue}}]
+
+It does what it says: always true.
+
+\stopsubsection
+
+\startsubsection[title={\tex{iffalse}}]
+
+It does what it says: always false.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifcase}}]
+
+The general layout of an \type {\ifcase} tests is as follows:
+
+\starttyping[option=TEX]
+\ifcase<number>
+ when zero
+\or
+ when one
+\or
+ when two
+\or
+ ...
+\else
+ when something else
+\fi
+\stoptyping
+
+As in other places a number is a sequence of signs followed by one of more digits
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\ETEX\ primitives}]
+
+\startsubsection[title={\tex{ifdefined}}]
+
+This primitive was introduced for checking the existence of a macro (or primitive)
+and with good reason. Say that you want to know if \type {\MyMacro} is defined? One
+way to do that is:
+
+\startbuffer
+\ifx\MyMacro\undefined
+ {\bf undefined indeed}
+\fi
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+This results in: \inlinebuffer , but is this macro really undefined? When \TEX\
+scans your source and sees a the escape character (the forward slash) it will
+grab the next characters and construct a control sequence from it. Then it finds
+out that there is nothing with that name and it will create a hash entry for a
+macro with that name but with no meaning. Because \type {\undefined} is also not
+defined, these two macros have the same meaning and therefore the \type {\ifx} is
+true. Imagine that you do this many times, with different macro names, then your
+hash can fill up. Also, when a user defined \type {\undefined} you're suddenly
+get a different outcome.
+
+In order to catch the last problem there is the option to test directly:
+
+\startbuffer
+\ifdefined\MyOtherMacro \else
+ {\bf also undefined}
+\fi
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+This (or course) results in: \inlinebuffer, but the macro is still sort of
+defined (with no meaning). The next section shows how to get around this.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifcsname}}]
+
+A macro is often defined using a ready made name, as in:
+
+\starttyping[option=TEX]
+\def\OhYes{yes}
+\stoptyping
+
+The name is made from characters with catcode letter which means that you cannot
+use for instance digits or underscores unless you also give these characters that
+catcode, which is not that handy in a document. You can however use \type
+{\csname} to define a control sequence with any character in the name, like:
+
+\starttyping[option=TEX]
+\expandafter\def\csname Oh Yes : 1\endcsname{yes}
+\stoptyping
+
+Later on you can get this one with \type {\csname}:
+
+\starttyping[option=TEX]
+\csname Oh Yes : 1\endcsname
+\stoptyping
+
+However, if you say:
+
+\starttyping[option=TEX]
+\csname Oh Yes : 2\endcsname
+\stoptyping
+
+you won't get some result, nor a message about an undefined control sequence, but
+the name triggers a define anyway, this time not with no meaning (undefined) but
+as equivalent to \type {\relax}, which is why
+
+\starttyping[option=TEX]
+\expandafter\ifx\csname Oh Yes : 2\endcsname\relax
+ {\bf relaxed indeed}
+\fi
+\stoptyping
+
+is the way to test its existence. As with the test in the previous section,
+this can deplete the hash when you do lots of such tests. The way out of this
+is:
+
+\starttyping[option=TEX]
+\ifcsname Oh Yes : 2\endcsname \else
+ {\bf unknown indeed}
+\fi
+\stoptyping
+
+This time there is no hash entry created and therefore there is not even an
+undefined control sequence.
+
+In \LUATEX\ there is an option to return false in case of a messy expansion
+during this test, and in \LUAMETATEX\ that is default. This means that tests can
+be made quite robust as it is pretty safe to assume that names that make sense
+are constructed from regular characters and not boxes, font switches, etc.
+
+\stopsubsection
+
+\startsubsection[title={\tex{iffontchar}}]
+
+This test was also part of the \ETEX\ extensions and it can be used to see if
+a font has a character.
+
+\startbuffer
+\iffontchar\font`A
+ {\em This font has an A!}
+\fi
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+And, as expected, the outcome is: \quotation {\inlinebuffer}. The test takes two
+arguments, the first being a font identifier and the second a character number,
+so the next checks are all valid:
+
+\starttyping[option=TEX]
+\iffontchar\font `A yes\else nop\fi\par
+\iffontchar\nullfont `A yes\else nop\fi\par
+\iffontchar\textfont0`A yes\else nop\fi\par
+\stoptyping
+
+In the perspective of \LUAMETATEX\ I considered also supporting \type {\fontid}
+but it got a bit messy due to the fact that this primitive expands in a different
+way so this extension was rejected.
+
+\stopsubsection
+
+\startsubsection[title={\tex{unless}}]
+
+You can negate the results of a test by using the \type {\unless} prefix, so for
+instance you can replace:
+
+\starttyping[option=TEX]
+\ifdim\scratchdimen=10pt
+ \dosomething
+\else\ifdim\scratchdimen<10pt
+ \dosomething
+\fi\fi
+\stoptyping
+
+by:
+
+\starttyping[option=TEX]
+\unless\ifdim\scratchdimen>10pt
+ \dosomething
+\fi
+\stoptyping
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\LUATEX\ primitives}]
+
+\startsubsection[title={\tex{ifincsname}}]
+
+As it had no real practical usage uit might get dropped in \LUAMETATEX, so it
+will not be discussed here.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifprimitive}}]
+
+As it had no real practical usage due to limitations, this one is not available
+in \LUAMETATEX\ so it will not be discussed here.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifabsnum}}]
+
+This test is inherited from \PDFTEX\ and behaves like \type {\ifnum} but first
+turns a negative number into a positive one.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifabsdim}}]
+
+This test is inherited from \PDFTEX\ and behaves like \type {\ifdim} but first
+turns a negative dimension into a positive one.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifcondition}}]
+
+This is not really a test but in order to unstand that you need to know how
+\TEX\ internally deals with tests.
+
+\starttyping[option=TEX]
+\ifdimen\scratchdimen>10pt
+ \ifdim\scratchdimen<20pt
+ result a
+ \else
+ result b
+ \fi
+\else
+ result c
+\fi
+\stoptyping
+
+When we end up in the branch of \quotation {result a} we need to skip two \type
+{\else} branches after we're done. The \type {\if..} commands increment a level
+while the \type {\fi} decrements a level. The \type {\else} needs to be skipped
+here. In other cases the true branch needs to be skipped till we end up a the
+right \type {\else}. When doing this skipping, \TEX\ is not interested in what it
+encounters beyond these tokens and this skipping (therefore) goes real fast but
+it does see nested conditions and doesn't interpret grouping related tokens.
+
+A side effect of this is that the next is not working as expected:
+
+\starttyping[option=TEX]
+\def\ifmorethan{\ifdim\scratchdimen>}
+\def\iflessthan{\ifdim\scratchdimen<}
+
+\ifmorethan10pt
+ \iflessthan20pt
+ result a
+ \else
+ result b
+ \fi
+\else
+ result c
+\fi
+\stoptyping
+
+The \type{\iflessthan} macro is not seen as an \type {\if...} so the nesting gets
+messed up. The solution is to fool the scanner in thinking that it is. Say we have:
+
+\startbuffer
+\scratchdimen=25pt
+
+\def\ifmorethan{\ifdim\scratchdimen>}
+\def\iflessthan{\ifdim\scratchdimen<}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+and:
+
+\startbuffer
+\ifcondition\ifmorethan10pt
+ \ifcondition\iflessthan20pt
+ result a
+ \else
+ result b
+ \fi
+\else
+ result c
+\fi
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+When we expand this snippet we get: \quotation {\inlinebuffer} and no error
+concerning a failure in locating the right \type {\fi's}. So, when scanning the
+\type {\ifcondition} is seen as a valid \type {\if...} but when the condition is
+really expanded it gets ignored and the \type {\ifmorethan} has better come up
+with a match or not.
+
+In this perspective it is also worth mentioning that nesting problems can be
+avoided this way:
+
+\starttyping[option=TEX]
+\def\WhenTrue {something \iftrue ...}
+\def\WhenFalse{something \iffalse ...}
+
+\ifnum\scratchcounter>123
+ \let\next\WhenTrue
+\else
+ \let\next\WhenFalse
+\fi
+\next
+\stoptyping
+
+This trick is mentioned in The \TeX book and can also be found in the plain \TEX\
+format. A variant is this:
+
+\starttyping[option=TEX]
+\ifnum\scratchcounter>123
+ \expandafter\WhenTrue
+\else
+ \expandafter\WhenFalse
+\fi
+\stoptyping
+
+but using \type {\expandafter} can be quite intimidating especially when there
+are multiple in a row. It can also be confusing. Take this: an \type
+{\ifcondition} expects the code that follows to produce a test. So:
+
+\starttyping[option=TEX]
+\def\ifwhatever#1%
+ {\ifdim#1>10pt
+ \expandafter\iftrue
+ \else
+ \expandafter\iffalse
+ \fi}
+
+\ifcondition\ifwhatever{10pt}
+ result a
+\else
+ result b
+\fi
+\stoptyping
+
+This will not work! The reason is in the already mentioned fact that when we end
+up in the greater than \type {10pt} case, the scanner will happily push the \type
+{\iftrue} after the \type {\fi}, which is okay, but when skipping over the \type
+{\else} it sees a nested condition without matching \type {\fi}, which makes ity
+fail. I will spare you a solution with lots of nasty tricks, so here is the clean
+solution using \type {\ifcondition}:
+
+\starttyping[option=TEX]
+\def\truecondition {\iftrue}
+\def\falsecondition{\iffalse}
+
+\def\ifwhatever#1%
+ {\ifdim#1>10pt
+ \expandafter\truecondition
+ \else
+ \expandafter\falsecondition
+ \fi}
+
+\ifcondition\ifwhatever{10pt}
+ result a
+\else
+ result b
+\fi
+\stoptyping
+
+It will be no surprise that the two macros at the top are predefined in \CONTEXT.
+It might be more of a surprise that at the time of this writing the usage in
+\CONTEXT\ of this \type {\ifcondition} primitive is rather minimal. But that
+might change.
+
+As a further teaser I'll show another simple one,
+
+\startbuffer
+\def\HowOdd#1{\unless\ifnum\numexpr ((#1):2)*2\relax=\numexpr#1\relax}
+
+\ifcondition\HowOdd{1}very \else not so \fi odd
+\ifcondition\HowOdd{2}very \else not so \fi odd
+\ifcondition\HowOdd{3}very \else not so \fi odd
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+This renders:
+
+\startlines
+\getbuffer
+\stoplines
+
+The code demonstrates several tricks. First of all we use \type {\numexpr} which
+permits more complex arguments, like:
+
+\starttyping[option=TEX]
+\ifcondition\HowOdd{4+1}very \else not so \fi odd
+\ifcondition\HowOdd{2\scratchcounter+9}very \else not so \fi odd
+\stoptyping
+
+Another trick is that we use an integer division (the \type {:}) which is an
+operator supported by \LUAMETATEX .
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\LUAMETATEX\ primitives}]
+
+\startsubsection[title={\tex{ifcmpnum}}]
+
+This one is part of s set of three tests that all are a variant of a \type
+{\ifcase} test. A simple example of the first test is this:
+
+\starttyping[option=TEX]
+\ifcmpnum 123 345 less \or equal \else more \fi
+\stoptyping
+
+The test scans for two numbers, which of course can be registers or expressions,
+and sets the case value to 0, 1 or 2, which means that you then use the normal
+\type {\or} and \type {\else} primitives for follow up on the test.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifchknum}}]
+
+This test scans a number and when it's okay sets the case value to 1, and otherwise
+to 2. So you can do the next:
+
+\starttyping[option=TEX]
+\ifchknum 123\or good \else bad \fi
+\ifchknum bad\or good \else bad \fi
+\stoptyping
+
+An error message is suppressed and the first \type {\or} can be seen as a sort of
+recovery token, although in fact we just use the fast scanner mode that comes
+with the \type {\ifcase}: because the result is 1 or 2, we never see invalid
+tokens.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifnumval}}]
+
+A sort of combination of the previous two is \type {\ifnumval} which checks a
+number but also if it's less, equal or more than zero:
+
+\starttyping[option=TEX]
+\ifnumval 123\or less \or equal \or more \else error \fi
+\ifnumval bad\or less \or equal \or more \else error \fi
+\stoptyping
+
+You can decide to ignore the bad number or do something that makes more sense.
+Often the to be checked value will be the content of a macro or an argument like
+\type {#1}.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifcmpdim}}]
+
+This test is like \type {\ifcmpnum} but for dimensions.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifchkdim}}]
+
+This test is like \type {\ifchknum} but for dimensions.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifdimval}}]
+
+This test is like \type {\ifnumval} but for dimensions.
+
+\stopsubsection
+
+\startsubsection[title={\tex{iftok}}]
+
+Although this test is still experimental it can be used. What happens is that
+two to be compared \quote {things} get scanned for. For each we first gobble
+spaces and \type {\relax} tokens. Then we can have several cases:
+
+\startitemize[n,packed]
+ \startitem
+ When we see a left brace, a list of tokens is scanned upto the
+ matching right brace.
+ \stopitem
+ \startitem
+ When a reference to a token register is seen, that register is taken as
+ value.
+ \stopitem
+ \startitem
+ When a reference to an internal token register is seen, that register is
+ taken as value.
+ \stopitem
+ \startitem
+ When a macro is seen, its definition becomes the to be compared value.
+ \stopitem
+ \startitem
+ When a number is seen, the value of the corresponding register is taken
+ \stopitem
+\stopitemize
+
+An example of the first case is:
+
+\starttyping[option=TEX]
+\iftok {abc} {def}%
+ ...
+\else
+ ...
+\fi
+\stoptyping
+
+The second case goes like this:
+
+\starttyping[option=TEX]
+\iftok\scratchtoksone\scratchtokstwo
+ ...
+\else
+ ...
+\fi
+\stoptyping
+
+Case one and four mixed:
+
+\starttyping[option=TEX]
+\iftok{123}\TempX
+ ...
+\else
+ ...
+\fi
+\stoptyping
+
+The last case is more a catch: it will issue an error when no number is given.
+Eventually that might become a bit more clever (depending on our needs.)
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifcstok}}]
+
+There is a subtle difference between this one and \type {iftok}: spaces
+and \type {\relax} tokens are skipped but nothing gets expanded. So, when
+we arrive at the to be compared \quote {things} we look at what is there,
+as|-|is.
+
+\stopsubsection
+
+\startsubsection[title={\tex{iffrozen}}]
+
+{\em This is an experimental test.} Commands can be defined with the \type
+{\frozen} prefix and this test can be used to check if that has been the case.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifprotected}}]
+
+Commands can be defined with the \type {\protected} prefix (or in \CONTEXT, for
+historic reasons, with \type {\unexpanded}) and this test can be used to check if
+that has been the case.
+
+\stopsubsection
+
+\startsubsection[title={\tex{ifusercmd}}]
+
+{\em This is an experimental test.} It can be used to see if the command is
+defined at the user level or is a build in one. This one might evolve.
+
+\stopsubsection
+
+\startsubsection[title={\tex{orelse}}]
+
+This it not really a test primitive but it does act that way. Say that we have this:
+
+\starttyping[option=TEX]
+\ifdim\scratchdimen>10pt
+ case 1
+\else\ifdim\scratchdimen<20pt
+ case 2
+\else\ifcount\scratchcounter>10
+ case 3
+\else\ifcount\scratchcounter<20
+ case 4
+\fi\fi\fi\fi
+\stoptyping
+
+A bit nicer looks this:
+
+\starttyping[option=TEX]
+\ifdim\scratchdimen>10pt
+ case 1
+\orelse\ifdim\scratchdimen<20pt
+ case 2
+\orelse\ifcount\scratchcounter>10
+ case 3
+\orelse\ifcount\scratchcounter<20
+ case 4
+\fi
+\stoptyping
+
+We stay at the same level and the only test that cannot be used this way is \type
+{\ifcondition} but that is no real problem. Sometimes a more flat test tree had
+advantages but if you think that it gives better performance then you will be
+disappointed. The fact that we stay at the same level is compensated by a bit
+more parsing, so unless you have millions such cases (or expansions) it might
+make a bit of a difference. As mentioned, I'm a bit sensitive for how code looks so
+that was the main motivation for introducing it.
+
+A rather neat trick is the definition of \type {\quitcondition}:
+
+\starttyping[option=TEX]
+\def\quitcondition{\orelse\iffalse}
+\stoptyping
+
+This permits:
+
+\starttyping[option=TEX]
+\ifdim\scratchdimen>10pt
+ case 1a
+ \quitcondition
+ case 4b
+\fi
+\stoptyping
+
+where, of course, the quitting normally is the result of some intermediate extra
+test. But let me play safe here: beware of side effects.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={For the brave}]
+
+\startsubsection[title={Full expansion}]
+
+If you don't understand the following code, don't worry. There is seldom much
+reason to go this complex but obscure \TEX\ code attracts some users so \unknown
+
+When you have a macro that has for instance assignments, and when you expand that
+macro inside an \type {\edef}, these assignments are not actually expanded but
+tokenized. In \LUATEX\ there is a way to immediately apply these assignments and
+that feature can be used to write a fully expandable user test. For instance:
+
+\startbuffer
+\def\truecondition {\iftrue}
+\def\falsecondition{\iffalse}
+
+\def\fontwithidhaschar#1#2%
+ {\immediateassignment\scratchcounter\numexpr\fontid\font\relax
+ \immediateassignment\setfontid\numexpr#1\relax
+ \iffontchar\font\numexpr#2\relax
+ \immediateassignment\setfontid\scratchcounter
+ \expandafter\truecondition
+ \else
+ \expandafter\falsecondition
+ \fi}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+The \type {\iffontchar} test doesn't handle numeric font id, simply because
+at the time it was added to \ETEX, there was no access to these id's. Now we
+can do:
+
+\startbuffer
+\edef\foo{\fontwithidhaschar{1} {75}yes\else nop\fi} \meaning\foo
+\edef\foo{\fontwithidhaschar{1}{999}yes\else nop\fi} \meaning\foo
+
+[\ifcondition\fontwithidhaschar{1} {75}yes\else nop\fi]
+[\ifcondition\fontwithidhaschar{1}{999}yes\else nop\fi]
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+These result in:
+
+\startlines
+\getbuffer
+\stoplines
+
+If you remove the \type {\immediateassignment} in the definition above then the
+typeset results are still the same but the meanings of \type {\foo} look
+different: they contain the assignments and the test for the character is
+actually done when constructing the content of the \type {\edef}, but for the
+current font. So, basically that test is now useless.
+
+\stopsubsection
+
+\startsubsection[title={User defined if's}]
+
+There is a \type {\newif} macro that defines three other macros:
+
+\starttyping[option=TEX]
+\newif\ifOnMyOwnTerms
+\stoptyping
+
+After this, not only \type {\ifOnMyOwnTerms} is defined, but also:
+
+\starttyping[option=TEX]
+\OnMyOwnTermstrue
+\OnMyOwnTermsfalse
+\stoptyping
+
+These two actually are macros that redefine \type {\ifOnMyOwnTerms} to be either
+equivalent to \type {\iftrue} and \type {\iffalse}. The (often derived from plain
+\TEX) definition of \type {\newif} is a bit if a challenge as it has to deal with
+removing the \type {if} in order to create the two extra macros and also make
+sure that it doesn't get mixed up in a catcode jungle.
+
+In \CONTEXT\ we have a variant:
+
+\starttyping[option=TEX]
+\newconditional\MyConditional
+\stoptyping
+
+that can be used with:
+
+\starttyping[option=TEX]
+\settrue\MyConditional
+\setfalse\MyConditional
+\stoptyping
+
+and tested like:
+
+\starttyping[option=TEX]
+\ifconditional\MyConditional
+ ...
+\else
+ ...
+\fi
+\stoptyping
+
+This one is cheaper on the hash and doesn't need the two extra macros per test.
+The price is the use of \type {\ifconditional}, which is {\em not} to confused
+with \type {\ifcondition} (it has bitten me already a few times).
+
+\stopsubsection
+
+\stopsection
+
+\startsubject[title=Colofon]
+
+\starttabulate
+\NC Author \NC Hans Hagen \NC \NR
+\NC \CONTEXT \NC \contextversion \NC \NR
+\NC \LUAMETATEX \NC \texengineversion \NC \NR
+\NC Support \NC www.pragma-ade.com \NC \NR
+\NC \NC contextgarden.net \NC \NR
+\stoptabulate
+
+\stopsubject
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-expansion.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-expansion.tex
new file mode 100644
index 00000000000..1e2e00a35ad
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-expansion.tex
@@ -0,0 +1,442 @@
+% language=us
+
+\environment lowlevel-style
+
+\startdocument
+ [title=expansion,
+ color=middleyellow]
+
+\startsection[title=Preamble]
+
+% \startsubsection[title=Introduction]
+% \stopsubsection
+
+This short manual demonstrates a couple of properties of the macro language. It
+is not the in|-|depth philosophical expose about macro languages, tokens,
+expansion and such that some \TEX ies like. I prefer to stick to the practical
+aspects.
+
+\stopsection
+
+\startsection[title={\TEX\ primitives}]
+
+The \TEX\ language provides quite some commands and those built in are called
+primitives. User defined commands are called macros. A macro is a shortcut to a
+list of primitives or macro calls. All can be mixed with characters that are to
+be typeset somehow.
+
+\starttyping[option=TEX]
+\def\MyMacro{b}
+
+a\MyMacro c
+\stoptyping
+
+When \TEX\ reads this input the \type {a} gets turned into a glyph node with a
+reference to the current font set and the character \type {a}. Then the parser
+sees a macro call, and it will enter another input level where it expands this
+macro. In this case it sees just an \type {b} and it will give this the same
+treatment as the \type {a}. The macro ends, the input level decrements and the
+\type {c} gets its treatment.
+
+A macro can contain references to macros so in practice the input can go several
+levels down.
+
+\starttyping[option=TEX]
+\def\MyMacroA{ and }
+\def\MyMacroB{1\MyMacroA 2}
+
+a\MyMacroA b
+\stoptyping
+
+When \type {\MyMacroB} is defined, its body gets three so called tokens: the
+character token \type {a} with property \quote {other}, a token that is a
+reference to the macro \type {\MyMacroB}, and a character token \type {2}, also
+with property \quote {other} The meaning of \type {\MyMacroA} became five tokens:
+a reference to a space token, then three character tokens with property \quote
+{letter}, and finally again a space token.
+
+\starttyping[option=TEX]
+\def \MyMacroA{ and }
+\edef\MyMacroB{1\MyMacroA 2}
+
+a\MyMacroA b
+\stoptyping
+
+In the previous example an \type {\edef} is used, where the \type {e} indicates
+expansion. This time the meaning gets expanded. So we get effectively the same
+as
+
+\starttyping[option=TEX]
+\def\MyMacroB{1 and 2}
+\stoptyping
+
+Characters are easy: they just expand, but not all primitives expand to their
+meaning or effect.
+
+\startbuffer
+\def\MyMacroA{\scratchcounter = 1 }
+\def\MyMacroB{\advance\scratchcounter by 1}
+\def\MyMacroC{\the\scratchcounter}
+
+\MyMacroA a
+\MyMacroB b
+\MyMacroB c
+\MyMacroB d
+\MyMacroC
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\scratchcounter0 \getbuffer
+
+\startlines \tt
+\meaning\MyMacroA
+\meaning\MyMacroB
+\meaning\MyMacroC
+\stoplines
+
+Let's assume that \type {\scratchcounter} is zero to start with and use \type
+{\edef's}:
+
+\startbuffer
+\edef\MyMacroA{\scratchcounter = 1 }
+\edef\MyMacroB{\advance\scratchcounter by 1}
+\edef\MyMacroC{\the\scratchcounter}
+
+\MyMacroA a
+\MyMacroB b
+\MyMacroB c
+\MyMacroB d
+\MyMacroC
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\scratchcounter0 \getbuffer
+
+\startlines \tt
+\meaning\MyMacroA
+\meaning\MyMacroB
+\meaning\MyMacroC
+\stoplines
+
+So, this time the third macro has basically its meaning frozen, but we can
+prevent this by applying a \type {\noexpand} when we do this:
+
+\startbuffer
+\edef\MyMacroA{\scratchcounter = 1 }
+\edef\MyMacroB{\advance\scratchcounter by 1}
+\edef\MyMacroC{\noexpand\the\scratchcounter}
+
+\MyMacroA a
+\MyMacroB b
+\MyMacroB c
+\MyMacroB d
+\MyMacroC
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\scratchcounter0 \getbuffer
+
+\startlines \tt
+\meaning\MyMacroA
+\meaning\MyMacroB
+\meaning\MyMacroC
+\stoplines
+
+Of course this is a rather useless example but it serves its purpose: you'd better
+be aware what gets expanded immediately in an \type {\edef}. In most cases you
+only need to worry about \type {\the} and embedded macros (and then of course
+their meanings).
+
+\def\MyShow{\quotation {\strut \inlinebuffer \expandafter \typ \expandafter
+{\the\scratchtoks}\strut}}
+
+You can also store tokens in a so called token register. Here we use a predefined
+scratch register:
+
+\startbuffer
+\def\MyMacroA{ and }
+\def\MyMacroB{1\MyMacroA 2}
+\scratchtoks {\MyMacroA}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The content of \type {\scratchtoks} is: \MyShow, so no expansion has happened
+here.
+
+\startbuffer
+\def\MyMacroA{ and }
+\def\MyMacroB{1\MyMacroA 2}
+\scratchtoks \expandafter {\MyMacroA}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Now the content of \type {\scratchtoks} is: \MyShow, so this time expansion has
+happened.
+
+\startbuffer
+\def\MyMacroA{ and }
+\def\MyMacroB{1\MyMacroA 2}
+\scratchtoks \expandafter {\MyMacroB}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Indeed the macro gets expanded but only one level: \MyShow. Compare this with:
+
+\startbuffer
+\def\MyMacroA{ and }
+\edef\MyMacroB{1\MyMacroA 2}
+\scratchtoks \expandafter {\MyMacroB}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The trick is to expand in two steps: \MyShow. Later we will see that other
+engines provide some more expansion tricks. The only way to get a grip on
+expansion is to just play with it.
+
+The \type {\expandafter} primitive expands the token (which can be a macro) after
+the next next one and injects its meaning into the stream. So:
+
+\starttyping[option=TEX]
+\expandafter \MyMacroA \MyMacroB
+\stoptyping
+
+works okay. In a normal document you will never need this kind of hackery: it
+only happens in a bit more complex macros. Here is an example:
+
+\startbuffer[a]
+\scratchcounter 1
+\bgroup
+\advance\scratchcounter 1
+\egroup
+\the\scratchcounter
+\stopbuffer
+
+\typebuffer[a][option=TEX]
+
+\startbuffer[b]
+\scratchcounter 1
+\bgroup
+\advance\scratchcounter 1
+\expandafter
+\egroup
+\the\scratchcounter
+\stopbuffer
+
+\typebuffer[b][option=TEX]
+
+The first one gives \inlinebuffer[a], while the second gives \inlinebuffer[b].
+
+% \let
+% \futurelet
+% \afterassignment
+% \aftergroup
+
+\stopsection
+
+\startsection[title={\ETEX\ primitives}]
+
+In this engine a couple of extensions were added and later on \PDFTEX\ added some
+more. We only discuss a few that relate to expansion. There is however a pitfall
+here. Before \ETEX\ showed up, \CONTEXT\ already had a few mechanism that also
+related to expansion and it used some names for macros that clash with those in
+\ETEX. This is why we will use the \type {\normal} prefix here to indicate the
+primitive.
+
+\startbuffer
+\def\MyMacroA{a}
+\def\MyMacroB{b}
+\normalprotected\def\MyMacroC{c}
+\edef\MyMacroABC{\MyMacroA\MyMacroB\MyMacroC}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+These macros have the following meanings:
+
+\startlines \tt
+\meaning\MyMacroA
+\meaning\MyMacroB
+\meaning\MyMacroC
+\meaning\MyMacroABC
+\stoplines
+
+In \CONTEXT\ you will use the \type {\unexpanded} prefix instead because that one
+did something similar in older versions of \CONTEXT. As we were early adopters of
+\ETEX, this later became a synonym to the \ETEX\ primitive.
+
+\startbuffer
+\def\MyMacroA{a}
+\def\MyMacroB{b}
+\normalprotected\def\MyMacroC{c}
+\normalexpanded{\scratchtoks{\MyMacroA\MyMacroB\MyMacroC}}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+Here the wrapper around the token register assignment will expand the three
+macros, unless they are protected, so its content becomes \MyShow. This saves
+either a lot of more complex \type {\expandafter} usage or using an intermediate
+\type {\edef}. In \CONTEXT\ the \type {\expanded} macro does something simpler
+but it doesn't expand the first token as it is meant as a wrapper around a command,
+like:
+
+\starttyping[option=TEX]
+\expanded{\chapter{....}} % a ConTeXt command
+\stoptyping
+
+where we do want to expand the title but not the \type {\chapter} command, not
+that this would happen actually because \type {\chapter} is a protected command.
+
+The counterpart of \type {\normalexpanded} is \type {\normalunexpanded}, as in:
+
+\startbuffer
+\def\MyMacroA{a}
+\def\MyMacroB{b}
+\normalprotected\def\MyMacroC{c}
+\normalexpanded {\scratchtoks
+ {\MyMacroA\normalunexpanded {\MyMacroB}\MyMacroC}}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+The register now holds \MyShow: three tokens, one character token and two
+macro references.
+
+Tokens can represent characters, primitives, macros or be special entities like
+starting math mode, beginning a group, assigning a dimension to a register, etc.
+Although you can never really get back to the original input, you can come pretty
+close, with:
+
+\startbuffer
+\normaldetokenize{this can $ be anything \bgroup}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+This (when typeset monospaced) is: {\tt \inlinebuffer}. The detokenizer is like
+\type {\string} applied to each token in its argument. Compare this:
+
+\startbuffer
+\normalexpanded {
+ \normaldetokenize{10pt}
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+We get four tokens: {\tt\inlinebuffer}.
+
+\startbuffer
+\normalexpanded {
+ \string 1\string 0\string p\string t
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+So that was the same operation: {\tt\inlinebuffer}, but in both cases there is a
+subtle thing going on: characters have a catcode which distinguishes them. The
+parser needs to know what makes up a command name and normally that's only
+letters. The next snippet shows these catcodes:
+
+\startbuffer
+\normalexpanded {
+ \noexpand\the\catcode`\string 1 \noexpand\enspace
+ \noexpand\the\catcode`\string 0 \noexpand\enspace
+ \noexpand\the\catcode`\string p \noexpand\enspace
+ \noexpand\the\catcode`\string t \noexpand
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The result is \quotation {\tt\inlinebuffer}: two characters are marked as \quote
+{letter} and two fall in the \quote {other} category.
+
+\stopsection
+
+\startsection[title={\LUATEX\ primitives}]
+
+This engine adds a little in the expansion arena. First of all it offers a way to
+extend token lists registers
+
+\startbuffer
+\def\MyMacroA{a}
+\def\MyMacroB{b}
+\normalprotected\def\MyMacroC{b}
+\scratchtoks{\MyMacroA\MyMacroB}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+The result is: \MyShow.
+
+\startbuffer
+\toksapp\scratchtoks{\MyMacroA\MyMacroB}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+We're now at: \MyShow.
+
+\startbuffer
+\etoksapp\scratchtoks{\MyMacroA\space\MyMacroB\space\MyMacroC}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+The register has this content: \MyShow, so the additional context got expanded in
+the process, except of course the protected macro \type {\MyMacroC}.
+
+There is a bunch of these combiners: \type {\toksapp} and \type {\tokspre} for
+local appending and prepending, with global companions: \type {\gtoksapp} and
+\type {\gtokspre}, as well as expanding variant: \type {\etoksapp}, \type
+{\etokspre}, \type {\xtoksapp} and \type {\xtokspre}.
+
+There are not beforehand more efficient that using intermediate expanded macros
+or token lists, simply because in the process \TEX\ has to create tokens lists
+too, but sometimes they're just more convenient to use.
+
+A second extension is \type {\immediateassignment} which instead in tokenizing
+the assignment directive applies it right now.
+
+\startbuffer
+\edef\MyMacroA
+ {\scratchcounter 123
+ \noexpand\the\scratchcounter}
+
+\edef\MyMacroB
+ {\immediateassignment\scratchcounter 123
+ \noexpand\the\scratchcounter}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\getbuffer
+
+These two macros now have the meaning:
+
+\startlines \tt
+\meaning\MyMacroA
+\meaning\MyMacroB
+\stoplines
+
+\stopsection
+
+\startsection[title={\LUAMETATEX\ primitives}]
+
+{\em todo}
+
+% \aftergroups
+
+\stopsection
+
+\stopdocument
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-registers.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-registers.tex
new file mode 100644
index 00000000000..8ccb0cd3ab6
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-registers.tex
@@ -0,0 +1,251 @@
+% language=us
+
+\environment lowlevel-style
+
+\startdocument
+ [title=registers,
+ color=darkmagenta]
+
+\startsection[title=Preamble]
+
+Registers are sets of variables that are accessed by index and a such resemble
+registers in a processing unit. You can store a quantity in a register, retrieve
+it, and also manipulate it.
+
+There is hardly any need to use them in \CONTEXT\ so we keep it simple.
+
+\stopsection
+
+\startsection[title={\TEX\ primitives}]
+
+There are several categories:
+
+\startitemize
+\startitem
+ Integers (int): in order to be portable (at the time it surfaced) there are only
+ integers and no floats. The only place where \TEX\ uses floats internally is
+ when glue gets effective which happens in the backend.
+\stopitem
+\startitem
+ Dimensions (dimen): internally these are just integers but when they are entered they
+ are sliced into two parts so that we have a fractional part. The internal
+ representation is called a scaled point.
+\stopitem
+\startitem
+ Glue (skip): these are dimensions with a few additional properties: stretch and
+ shrink. Being a compound entity they are stored differently and thereby a bit
+ less efficient than numbers and dimensions.
+\stopitem
+\startitem
+ Math glue (muskip): this is the same as glue but with a unit that adapts to
+ the current math style properties. It's best to think about them as being
+ relative measures.
+\stopitem
+\startitem
+ Token lists (toks): these contain a list of tokens coming from the input
+ or coming from a place where they already have been converted.
+\stopitem
+\stopitemize
+
+The original \TEX\ engine had 256 entries per set. The first ten of each set are
+normally reserved for scratch purposes: the even ones for local use, and the odd
+ones for global usage. On top of that macro packages can reserve some for its own
+use. It was quite easy to reach the maximum but there were tricks around that.
+This limitation is no longer present in the variants in use today.
+
+Let's set a few dimension registers:
+
+\startbuffer[1]
+\dimen 0 = 10 pt
+\dimen2=10pt
+\dimen4 10pt
+\scratchdimen 10pt
+\stopbuffer
+
+\typebuffer[1][option=TEX]
+
+We can serialize them with:
+
+\startbuffer[2]
+\the \dimen0
+\number \dimen2
+\meaning\dimen4
+\meaning\scratchdimen
+\stopbuffer
+
+\typebuffer[2][option=TEX]
+
+The results of these operations are:
+
+\startlines\tt
+\getbuffer[1,2]
+\stoplines
+
+The last two is not really useful but it is what you see when tracing options are
+set. Here \type {\scratchdimen} is a shortcut for a register. This is {\em not} a
+macro but a defined register. The low level \type {\dimendef} is used for this
+but in a macro package you should not use that one but the higher level \type
+{\newdimen} macro that uses it.
+
+\startbuffer[1]
+\newdimen\MyDimenA
+\def \MyDimenB{\dimen999}
+\dimendef\MyDimenC998
+\stopbuffer
+
+\typebuffer[1][option=TEX]
+
+\startbuffer[2]
+\meaning\MyDimenA
+\meaning\MyDimenB
+\meaning\MyDimenC
+\stopbuffer
+
+\typebuffer[2][option=TEX]
+
+Watch the difference:
+
+\startlines\tt
+\getbuffer[1,2]
+\stoplines
+
+The first definition uses a yet free register so you won't get a clash. The
+second one is just a shortcut using a macro and the third one too but again
+direct shortcut. Try to imagine how the second line gets interpreted:
+
+\starttyping[option=TEX]
+\MyDimenA10pt \MyDimenA10.5pt
+\MyDimenB10pt \MyDimenB10.5pt
+\MyDimenC10pt \MyDimenC10.5pt
+\stoptyping
+
+Also try to imagine what messing around with \type {\MyDimenC} will do when we
+also have defined a few hundred extra dimensions with \type {\newdimen}.
+
+In the case of dimensions the \type {\number} primitive will make the register
+serialize as scaled points without unit \type {sp}.
+
+Next we see some of the other registers being assigned:
+
+\starttyping[option=TEX]
+\count 0 = 100
+\skip 0 = 10pt plus 3pt minus 2pt
+\skip 0 = 10pt plus 1fill
+\muskip 0 = 10mu plus 3mu minus 2mu
+\muskip 0 = 10mu minus 1 fil
+\toks 0 = {hundred}
+\stoptyping
+
+When a number is expected, you can use for instance this:
+
+\starttyping[option=TEX]
+\scratchcounter\scratchcounterone
+\stoptyping
+
+Here we use a few predefined scratch registers. You can also do this:
+
+\starttyping[option=TEX]
+\scratchcounter\numexpr\scratchcounterone+\scratchcountertwo\relax
+\stoptyping
+
+There are some quantities that also qualify as number:
+
+\starttyping[option=TEX]
+\chardef\MyChar=123 % refers to character 123 (if present)
+\scratchcounter\MyChar
+\stoptyping
+
+In the past using \type {\chardef} was a way to get around the limited number of
+registers, but it still had (in traditional \TEX) a limitation: you could not go
+beyond 255. The \type {\mathchardef} could fo higher as it also encodes a family
+number and class. This limitation has been lifted in \LUATEX.
+
+A character itself can also be interpreted as number, in which case it has to be
+prefixed with a reverse quote: \type {`}, so:
+
+\startbuffer
+\scratchcounter\numexpr`0+5\relax
+\char\scratchcounter
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+produces \quotation {\inlinebuffer} because the \type {`0} expands into the
+(\ASCII\ and \UTF8) slot {\tt \number`0} which represents the character zero. In
+this case the next makes more sense:
+
+\starttyping[option=TEX]
+\char\numexpr`0+5\relax
+\stoptyping
+
+If you want to know more about all these quantities, \quotation {\TEX\ By Topic}
+provides a good summary of what \TEX\ has to offer, and there is no need to repeat
+it here.
+
+\stopsection
+
+\startsection[title={\ETEX\ primitives}]
+
+Apart from the ability to use expressions, the contribution to registers that
+\ETEX\ brought was that suddenly we could use upto 65K of them, which is more
+than enough. The extra registers were not as efficient as the first 256 because
+they were stored in the hash table, but that was not really a problem. In \OMEGA\
+and later \LUATEX\ regular arrays were used, at the cost of more memory which in
+the meantime has become cheap. As \CONTEXT\ moved to \ETEX\ rather early its
+users never had to worry about it.
+
+\stopsection
+
+\startsection[title={\LUATEX\ primitives}]
+
+The \LUATEX\ engine introduced attributes. These are numeric properties that are
+bound to the nodes that are the result of typesetting operations. They are
+basically like integer registers but when set their values get bound and when
+unset they are kind of invisible.
+
+\startitemize
+\startitem
+ Attribute (attribute): a numeric property that when set becomes part of the
+ current attribute list that gets assigned to nodes.
+\stopitem
+\stopitemize
+
+Attributes can be used to communicate properties to \LUA\ callbacks. There are
+several functions available for setting them and querying them.
+
+\starttyping[option=TEX]
+\attribute999 = 123
+\stoptyping
+
+Using attributes this way is dangerous (of course I can only speak for \CONTEXT)
+because an attribute value might trigger some action in a callback that gives
+unwanted side effects. For convenience \CONTEXT\ provides:
+
+\startbuffer
+\newattribute\MyAttribute
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+Which currently defines \type {\MyAttribute} as {\tt \meaning\MyAttribute} and is
+meant to be used as: \footnote {The low level \type {\attributedef} command is
+rather useless in the perspective of \CONTEXT.}
+
+\starttyping[option=TEX]
+\attribute\MyAttribute = 123
+\stoptyping
+
+Just be aware that defining attributes can have an impact on performance. As you
+cannot access them at the \TEX\ end you seldom need them. If you do you can
+better use the proper more high level definers (not discussed here).
+
+\stopsection
+
+\startsection[title={\LUAMETATEX\ primitives}]
+
+{\em todo}
+
+\stopsection
+
+\stopdocument
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-style.tex
new file mode 100644
index 00000000000..ddd9df747ba
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-style.tex
@@ -0,0 +1,104 @@
+% language=us
+
+% I started this series in June 2019 and I bet that it will never be complete or
+% extensive enough. But I'll do my best to make it as useful as possible ConTeXt
+% users out there who like to know about such details. Feel free to ask for more
+% explanations.
+
+\startenvironment lowlevel-style
+
+\usemodule[abbreviations-logos]
+\usemodule[scite]
+
+\setvariables
+ [document]
+ [title=No Title,
+ author=No Author,
+ color=NoColor]
+
+\setupbodyfont
+ [dejavu,11pt]
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ backspace=2cm,
+ topspace=15mm]
+
+\setupwhitespace
+ [big]
+
+\setuphead
+ [chapter]
+ [style=\bfc,
+ color=darkgray]
+
+\setuphead
+ [section]
+ [style=\bfb,
+ %page=right,
+ color=darkgray]
+
+\setuphead
+ [subsection]
+ [style=\bfa,
+ color=darkgray]
+
+\setupfootertexts
+ [section] % [\documentvariable{title}]
+
+\setupfooter
+ [style=bold,
+ color=darkgray]
+
+\startuseMPgraphic{titlepage}
+ fill Page
+ withcolor "\documentvariable{color}" ;
+
+ numeric d ; d := 2mm ;
+
+ picture p ; p := textext.llft("\tex{}")
+ xysized (.1PaperWidth-2d,.1PaperHeight-2d)
+ shifted (.1PaperWidth- d,.1PaperHeight -d)
+ ;
+
+ draw image (
+ for i = 0 step .1 PaperWidth until PaperWidth :
+ for j = 0 step .1 PaperHeight until PaperHeight :
+ draw p shifted (i,j) ;
+ endfor ;
+ endfor ;
+ ) withcolor .5resolvedcolor("middlegray") ;
+
+ draw textext.d("\strut low level")
+ xsized (.8PaperWidth)
+ shifted center topboundary Page
+ shifted -(0,.2PaperHeight)
+ withcolor "white" ;
+ draw textext.d("\strut \TeX")
+ xsized (.4PaperWidth)
+ shifted center topboundary Page
+ shifted -(0,.4PaperHeight)
+ withcolor "white" ;
+ draw textext.d("\strut\documentvariable{title}")
+ ysized 3cm
+ shifted center bottomboundary Page
+ shifted (0,.1PaperHeight)
+ withcolor "white" ;
+\stopuseMPgraphic
+
+\startsetups document:start
+
+ \startMPpage
+ \includeMPgraphic{titlepage} ;
+ \stopMPpage
+
+ \page
+
+ \startsubject[title=Contents]
+ \placelist[section][criterium=previous]
+ \stopsubject
+
+\stopsetups
+
+\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-arrow.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-arrow.tex
new file mode 100644
index 00000000000..72c9528e8b3
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-arrow.tex
@@ -0,0 +1,166 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-arrow
+
+\startchapter[title={Arrow}]
+
+Arrows are somewhat complicated because they follow the path, are constructed
+using a pen, have a fill and draw, and need to scale. One problem is that the
+size depends on the pen but the pen normally is only known afterwards.
+
+\startbuffer[1a]
+\startMPcode
+draw lmt_arrow [
+ path = (fullcircle scaled 3cm),
+]
+ withpen pencircle scaled 2mm
+ withcolor "darkred" ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[1b]
+\startMPcode
+draw lmt_arrow [
+ path = (fullcircle scaled 3cm),
+ length = 8,
+]
+ withpen pencircle scaled 2mm
+ withcolor "darkgreen" ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[1c]
+\startMPcode
+draw lmt_arrow [
+ path = (fullcircle scaled 3cm rotated 45),
+ pen = (pencircle xscaled 2mm yscaled 1mm rotated 45),
+]
+ withpen pencircle xscaled 2mm yscaled 1mm rotated 45
+ withcolor "darkblue" ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[1d]
+\startMPcode
+pickup pencircle xscaled 2mm yscaled 1mm rotated 45 ;
+draw lmt_arrow [
+ path = (fullcircle scaled 3cm rotated 45),
+ pen = "auto",
+]
+ withcolor "darkyellow" ;
+\stopMPcode
+\stopbuffer
+
+To some extent \METAFUN\ can help you with this issue. In \in {figure} [arrows:1]
+we see some variants. The definitions are given below:
+
+\typebuffer[1a][option=TEX]
+\typebuffer[1b][option=TEX]
+\typebuffer[1c][option=TEX]
+\typebuffer[1d][option=TEX]
+
+\startplacefigure[reference=arrows:1]
+ \startcombination[4*1]
+ {\getbuffer[1a]} {default}
+ {\getbuffer[1b]} {length}
+ {\getbuffer[1c]} {pen}
+ {\getbuffer[1d]} {auto}
+ \stopcombination
+\stopplacefigure
+
+There are some options that influence the shape of the arrowhead and its
+location on the path. You can for instance ask for two arrowheads:
+
+\startbuffer[3]
+\startMPcode
+ pickup pencircle scaled 1mm ;
+ draw lmt_arrow [
+ pen = "auto",
+ location = "both"
+ path = fullcircle scaled 3cm rotated 90,
+ ] withcolor "darkgreen" ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[3][option=TEX]
+
+\startlinecorrection
+\getbuffer[3]
+\stoplinecorrection
+
+The shape can also be influenced although often this is not that visible:
+
+\startbuffer[4]
+\startMPcode
+ pickup pencircle scaled 1mm ;
+ draw lmt_arrow [
+ kind = "draw",
+ pen = "auto",
+ penscale = 4,
+ location = "middle",
+ alternative = "curved",
+ path = fullcircle scaled 3cm,
+ ] withcolor "darkblue" ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[4][option=TEX]
+
+\startlinecorrection
+\getbuffer[4]
+\stoplinecorrection
+
+The location can also be given as percentage, as this example demonstrates. Watch
+how we draw only arrow heads:
+
+\startbuffer[5]
+\startMPcode
+ pickup pencircle scaled 1mm ;
+ for i = 0 step 5 until 100 :
+ draw lmt_arrow [
+ alternative = "dimpled",
+ pen = "auto",
+ location = "percentage",
+ percentage = i,
+ dimple = (1/5 + i/200),
+ headonly = (i = 0),
+ path = fullcircle scaled 3cm,
+ ] withcolor "darkyellow" ;
+ endfor ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[5][option=TEX]
+
+\startlinecorrection
+\getbuffer[5]
+\stoplinecorrection
+
+The supported parameters are:
+
+\starttabulate[|T|T|T|p|]
+\FL
+\BC name \BC type \BC default \BC comment \NC \NR
+\ML
+\NC path \NC path \NC \NC \NC \NR
+\NC pen \NC path \NC \NC \NC \NR
+\NC \NC string \NC auto \NC \NC \NR
+\NC kind \NC string \NC fill \NC \type {fill} or \type {draw} \NC \NR
+\NC dimple \NC numeric \NC 1/5 \NC \NC \NR
+\NC scale \NC numeric \NC 3/4 \NC \NC \NR
+\NC penscale \NC numeric \NC 3 \NC \NC \NR
+\NC length \NC numeric \NC 4 \NC \NC \NR
+\NC angle \NC numeric \NC 45 \NC \NC \NR
+\NC location \NC string \NC end \NC \type {end}, \type {middle} or \type {both} \NC \NR % middle both
+\NC alternative \NC string \NC normal \NC \type {normal}, \type {dimpled} or \type {curved} \NC \NR
+\NC percentage \NC numeric \NC 50 \NC \NC \NR
+\NC headonly \NC boolean \NC false \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-axis.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-axis.tex
new file mode 100644
index 00000000000..f9483039ca7
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-axis.tex
@@ -0,0 +1,83 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-axis
+
+\startchapter[title={Axis}]
+
+The axis macro is the result of one of the first experiments with the key|/|value
+interface in \METAFUN. Let's show a lot in one example:
+
+\startbuffer[1]
+\startMPcode
+ draw lmt_axis [
+ sx = 5mm, sy = 5mm,
+ nx = 20, ny = 10,
+ dx = 5, dy = 2,
+ tx = 10, ty = 10,
+
+ list = {
+ [
+ connect = true,
+ color = "darkred",
+ close = true,
+ points = { (1, 1), (15, 8), (2, 10) },
+ texts = { "segment 1", "segment 2", "segment 3" }
+ ],
+ [
+ connect = true,
+ color = "darkgreen",
+ points = { (2, 2), (4, 1), (10, 3), (16, 8), (19, 2) },
+ labels = { "a", "b", "c", "d", "e" }
+ ],
+ [
+ connect = true,
+ color = "darkblue",
+ close = true,
+ points = { (5, 3), (8, 8), (16, 1) },
+ labels = { "1", "2", "3" }
+ ]
+ },
+
+ ] withpen pencircle scaled 1mm ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[1][option=TEX]
+
+\startplacefigure[reference=axis:1]
+ \getbuffer[1]
+\stopplacefigure
+
+This macro will probably be extended at some point.
+
+\starttabulate[|T|T|T|p|]
+\FL
+\BC name \BC type \BC default \BC comment \NC \NR
+\ML
+\NC nx \NC numeric \NC 1 \NC \NC \NR
+\NC dx \NC numeric \NC 1 \NC \NC \NR
+\NC tx \NC numeric \NC 0 \NC \NC \NR
+\NC sx \NC numeric \NC 1 \NC \NC \NR
+\NC startx \NC numeric \NC 0 \NC \NC \NR
+\NC ny \NC numeric \NC 1 \NC \NC \NR
+\NC dy \NC numeric \NC 1 \NC \NC \NR
+\NC ty \NC numeric \NC 0 \NC \NC \NR
+\NC sy \NC numeric \NC 1 \NC \NC \NR
+\NC starty \NC numeric \NC 0 \NC \NC \NR
+\ML \NC \NC \NR
+\NC samples \NC list \NC \NC \NC \NR
+\NC list \NC list \NC \NC \NC \NR
+\NC connect \NC boolean \NC false \NC \NC \NR
+\NC list \NC list \NC \NC \NC \NR
+\NC close \NC boolean \NC false \NC \NC \NR
+\NC samplecolors \NC list \NC \NC \NC \NR
+\NC axiscolor \NC string \NC \NC \NC \NR
+\NC textcolor \NC string \NC \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-chart.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-chart.tex
new file mode 100644
index 00000000000..1bd89d3505f
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-chart.tex
@@ -0,0 +1,441 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-chart
+
+\startchapter[title={Chart}]
+
+This is another example implementation but it might be handy for simple cases of
+presenting results. Of course one can debate the usefulness of certain ways of
+presenting but here we avoid that discussion. Let's start with a simple pie
+chart (\in {figure} [chart:1]).
+
+\startbuffer[1]
+\startMPcode
+ draw lmt_chart_circle [
+ samples = { { 1, 4, 3, 2, 5, 7, 6 } },
+ percentage = true,
+ trace = true,
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[1][option=TEX]
+
+\startplacefigure[reference=chart:1]
+ \getbuffer[1]
+\stopplacefigure
+
+As with all these \LMTX\ extensions, you're invited to play with the parameters.
+in \in {figure} [chart:2] we see a variant that adds labels as well as one that
+has a legend.
+
+\startbuffer[2a]
+\startMPcode
+draw lmt_chart_circle [
+ height = 4cm,
+ samples = { { 1, 4, 3, 2, 5, 7, 6 } },
+ percentage = true,
+ trace = true,
+ labelcolor = "white",
+ labelformat = "@0.1f",
+ labelstyle = "ttxx"
+] ;
+\stopMPcode
+\stopbuffer
+
+The styling of labels and legends can be influenced independently.
+
+\typebuffer[2a][option=TEX]
+
+\startbuffer[2b]
+\startMPcode
+draw lmt_chart_circle [
+ height = 4cm,
+ samples = { { 1, 4, 3, 2, 5, 7, 6 } },
+ percentage = false,
+ trace = true,
+ linewidth = .125mm,
+ originsize = 0,
+ labeloffset = 3cm,
+ labelstyle = "bfxx",
+ legendstyle = "tfxx",
+ legend = {
+ "first", "second", "third", "fourth",
+ "fifth", "sixths", "sevenths"
+ }
+] ;
+
+\stopMPcode
+\stopbuffer
+
+\typebuffer[2b][option=TEX]
+
+\startplacefigure[reference=chart:2]
+ \startcombination
+ {\getbuffer[2a]} {}
+ {\getbuffer[2b]} {}
+ \stopcombination
+\stopplacefigure
+
+A second way of rendering are histograms, and the interface is mostly the same.
+In \in {figure} [chart:3] we see two variants
+
+\startbuffer[3a]
+\startMPcode
+ draw lmt_chart_histogram [
+ samples = { { 1, 4, 3, 2, 5, 7, 6 } },
+ percentage = true,
+ cumulative = true,
+ trace = true,
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[3b]
+\startMPcode
+ draw lmt_chart_histogram [
+ samples = {
+ { 1, 4, 3, 2, 5, 7, 6 },
+ { 1, 2, 3, 4, 5, 6, 7 }
+ },
+ background = "lightgray",
+ trace = true,
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[3a][option=TEX]
+
+and one with two datasets:
+
+\typebuffer[3b][option=TEX]
+
+\startplacefigure[reference=chart:3]
+ \startcombination
+ {\getbuffer[3a]} {}
+ {\getbuffer[3b]} {}
+ \stopcombination
+\stopplacefigure
+
+\startbuffer[4]
+\startMPpage[offset=5mm]
+ draw lmt_chart_histogram [
+ samples = {
+ { 1, 4, 3, 2, 5, 7, 6 },
+ { 1, 2, 3, 4, 5, 6, 7 }
+ },
+ percentage = true,
+ cumulative = true,
+ showlabels = false,
+ backgroundcolor = "lightgray",
+ ] ;
+\stopMPpage
+\stopbuffer
+
+A cumulative variant is shown in \in {figure} [chart:4] where we also add a
+background (color).
+
+\typebuffer[4][option=TEX]
+
+\startplacefigure[reference=chart:4]
+ \getbuffer[4]
+\stopplacefigure
+
+A different way of using colors is shown in \in {figure} [chart:5] where each
+sample gets its own (same) color.
+
+\startbuffer[5]
+\startMPcode
+ draw lmt_chart_histogram [
+ samples = {
+ { 1, 4, 3, 2, 5, 7, 6 },
+ { 1, 2, 3, 4, 5, 6, 7 }
+ },
+ percentage = true,
+ cumulative = true,
+ showlabels = false,
+ background = "lightgray",
+ colormode = "local",
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[5][option=TEX]
+
+\startplacefigure[reference=chart:5]
+ \getbuffer[5]
+\stopplacefigure
+
+As with pie charts you can add labels and a legend:
+
+\startbuffer[6a]
+\startMPcode
+ draw lmt_chart_histogram [
+ height = 6cm,
+ samples = { { 1, 4, 3, 2, 5, 7, 6 } },
+ percentage = true,
+ cumulative = true,
+ trace = true,
+ labelstyle = "ttxx",
+ labelanchor = "top",
+ labelcolor = "white",
+ backgroundcolor = "middlegray",
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[6a][option=TEX]
+
+The previous and next examples are shown in \in {figure} [chart:6]. The height
+specified here concerns the graphic and excludes the labels,
+
+\startbuffer[6b]
+\startMPcode
+ draw lmt_chart_histogram [
+ height = 6cm,
+ width = 10mm,
+ samples = { { 1, 4, 3, 2, 5, 7, 6 } },
+ trace = true,
+ maximum = 7.5,
+ linewidth = 1mm,
+ originsize = 0,
+ labelanchor = "bot",
+ labelcolor = "black"
+ labelstyle = "bfxx"
+ legendstyle = "tfxx",
+ labelstrut = "yes",
+ legend = {
+ "first", "second", "third", "fourth",
+ "fifth", "sixths", "sevenths"
+ }
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[6b][option=TEX]
+
+\startplacefigure[reference=chart:6]
+ \startcombination
+ {\getbuffer[6a]} {}
+ {\getbuffer[6b]} {}
+ \stopcombination
+\stopplacefigure
+
+The third category concerns bar charts that run horizontal. Again we see similar
+options driving the rendering (\in {figure} [chart:7]).
+
+\startbuffer[7a]
+\startMPcode
+ draw lmt_chart_bar [
+ samples = { { 1, 4, 3, 2, 5, 7, 6 } },
+ percentage = true,
+ cumulative = true,
+ trace = true,
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[7a][option=TEX]
+
+\startbuffer[7b]
+\startMPcode
+ draw lmt_chart_bar [
+ samples = { { 1, 4, 3, 2, 5, 7, 6 } },
+ percentage = true,
+ cumulative = true,
+ showlabels = false,
+ backgroundcolor = "lightgray",
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[7b][option=TEX]
+
+Determining the offset of labels is manual work:
+
+\startbuffer[7c]
+\startMPcode
+draw lmt_chart_bar [
+ width = 4cm,
+ height = 5mm,
+ samples = { { 1, 4, 3, 2, 5, 7, 6 } },
+ percentage = true,
+ cumulative = true,
+ trace = true,
+ labelcolor = "white",
+ labelstyle = "ttxx",
+ labelanchor = "rt",
+ labeloffset = .25EmWidth,
+ backgroundcolor = "middlegray",
+] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[7c][option=TEX]
+
+\startplacefigure[reference=chart:7]
+ \startcombination[3*1]
+ {\getbuffer[7a]} {}
+ {\getbuffer[7b]} {}
+ {\getbuffer[7c]} {}
+ \stopcombination
+\stopplacefigure
+
+Here is one with a legend (rendered in \in {figure} [chart:8]):
+
+\startbuffer[8]
+\startMPcode
+draw lmt_chart_bar [
+ width = 8cm,
+ height = 10mm,
+ samples = { { 1, 4, 3, 2, 5, 7, 6 } },
+ trace = true,
+ maximum = 7.5,
+ linewidth = 1mm,
+ originsize = 0,
+ labelanchor = "lft",
+ labelcolor = "black"
+ labelstyle = "bfxx"
+ legendstyle = "tfxx",
+ labelstrut = "yes",
+ legend = {
+ "first", "second", "third", "fourth",
+ "fifth", "sixths", "sevenths"
+ }
+] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[8][option=TEX]
+
+\startplacefigure[reference=chart:8]
+ \getbuffer[8]
+\stopplacefigure
+
+You can have labels per dataset as well as draw multiple datasets in
+one image, see \in {figure} [chart:9]:
+
+\startbuffer[9]
+\startMPcode
+ draw lmt_chart_bar [
+ samples = {
+ { 1, 4, 3, 2, 5, 7, 6 },
+ { 3, 2, 5, 7, 5, 6, 1 }
+ },
+ labels = {
+ { "a1", "b1", "c1", "d1", "e1", "f1", "g1" },
+ { "a2", "b2", "c2", "d2", "e2", "f2", "g2" }
+ },
+ labeloffset = -EmWidth,
+ labelanchor = "center",
+ labelstyle = "ttxx",
+ trace = true,
+ center = true,
+ ] ;
+
+ draw lmt_chart_bar [
+ samples = {
+ { 1, 4, 3, 2, 5, 7, 6 }
+ },
+ labels = {
+ { "a", "b", "c", "d", "e", "f", "g" }
+ },
+ labeloffset = -EmWidth,
+ labelanchor = "center",
+ trace = true,
+ center = true,
+ ] shifted (10cm,0) ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[9][option=TEX]
+
+\startplacefigure[reference=chart:9]
+ \getbuffer[9]
+\stopplacefigure
+
+\starttabulate[|T|T|T|p|]
+\FL
+\BC name \BC type \BC default \BC comment \NC \NR
+\ML
+\NC originsize \NC numeric \NC 1mm \NC \NC \NR
+\NC trace \NC boolean \NC false \NC \NC \NR
+\NC showlabels \NC boolean \NC true \NC \NC \NR
+\NC center \NC boolean \NC false \NC \NC \NR
+\ML
+\NC samples \NC list \NC \NC \NC \NR
+\NC
+\NC cumulative \NC boolean \NC false \NC \NC \NR
+\NC percentage \NC boolean \NC false \NC \NC \NR
+\NC maximum \NC numeric \NC 0 \NC \NC \NR
+\NC distance \NC numeric \NC 1mm \NC \NC \NR
+\ML
+\NC labels \NC list \NC \NC \NC \NR
+\NC labelstyle \NC string \NC \NC \NC \NR
+\NC labelformat \NC string \NC \NC \NC \NR
+\NC labelstrut \NC string \NC auto \NC \NC \NR
+\NC labelanchor \NC string \NC \NC \NC \NR
+\NC labeloffset \NC numeric \NC 0 \NC \NC \NR
+\NC labelfraction \NC numeric \NC 0.8 \NC \NC \NR
+\NC labelcolor \NC string \NC \NC \NC \NR
+\ML
+\NC backgroundcolor \NC string \NC \NC \NC \NR
+\NC drawcolor \NC string \NC white \NC \NC \NR
+\NC fillcolors \NC list \NC \NC primary (dark) colors \NC \NR
+\NC colormode \NC string \NC global \NC \NC or \type {local} \NC \NR
+\ML
+\NC linewidth \NC numeric \NC .25mm \NC \NC \NR
+\ML
+\NC legendcolor \NC string \NC \NC \NC \NR
+\NC legendstyle \NC string \NC \NC \NC \NR
+\NC legend \NC list \NC \NC \NC \NR
+\LL
+\stoptabulate
+
+Pie charts have:
+
+\starttabulate[|T|T|]
+\FL
+\BC name \BC default \NC \NR
+\ML
+\NC height \NC 5cm \NC \NR
+\NC width \NC 5mm \NC \NR
+\NC labelanchor \NC \NC \NR
+\NC labeloffset \NC 0 \NC \NR
+\NC labelstrut \NC no \NC \NR
+\LL
+\stoptabulate
+
+Histograms come with:
+
+\starttabulate[|T|T|]
+\FL
+\BC name \BC default \NC \NR
+\ML
+\NC height \NC 5cm \NC \NR
+\NC width \NC 5mm \NC \NR
+\NC labelanchor \NC bot \NC \NR
+\NC labeloffset \NC 1mm \NC \NR
+\NC labelstrut \NC auto \NC \NR
+\LL
+\stoptabulate
+
+Bar charts use:
+
+\starttabulate[|T|T|]
+\FL
+\BC name \BC default \NC \NR
+\ML
+\NC height \NC 5cm \NC \NR
+\NC width \NC 5mm \NC \NR
+\NC labelanchor \NC lft \NC \NR
+\NC labeloffset \NC 1mm \NC \NR
+\NC labelstrut \NC no \NC \NR
+\LL
+\stoptabulate
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-contents.tex
new file mode 100644
index 00000000000..73800ba8bb4
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-contents.tex
@@ -0,0 +1,11 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-contents
+
+\starttitle[title={Contents}]
+ \placelist[chapter]
+\stoptitle
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-contour.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-contour.tex
new file mode 100644
index 00000000000..11eca8b7adc
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-contour.tex
@@ -0,0 +1,771 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-contour
+
+\startchapter[title={Contour}]
+
+This feature started out as experiment triggered by a request on the mailing
+list. In the end it was a nice exploration of what is possible with a bit of
+\LUA. In a sense it is more subsystem than a simple \METAPOST\ macro because
+quite some \LUA\ code is involved and more might be used in the future. It's part
+of the fun.
+
+A contour is a line through equivalent values $z$ that result from applying a
+function to two variables $x$ and $y$. There is quite a bit of analysis needed
+to get these lines. In \METAFUN\ we currently support three methods for generating
+a colorful background and three for putting lines on top:
+
+One solution is to use the the isolines and isobands methods are described on the
+marching squares page of wikipedia:
+
+\starttyping
+https://en.wikipedia.org/wiki/Marching_squares
+\stoptyping
+
+This method is relative efficient as we don't do much optimization, simply
+because it takes time and the gain is not that much relevant. Because we support
+filling of multiple curves in one go, we get efficient paths anyway without side
+effects that normally can occur from many small paths alongside. In these days of
+multi megabyte movies and sound clips a request of making a \PDF\ file small is kind
+of strange anyway. In practice the penalty is not that large.
+
+As background we can use a bitmap. This method is also quite efficient because we
+use indexed colors which results in a very good compression. We use a simple
+mapping on a range of values.
+
+A third method is derived from the one that is distributed as \CCODE\ source
+file at:
+
+\starttyping
+https://physiology.arizona.edu/people/secomb/contours
+https://github.com/secomb/GreensV4
+\stoptyping
+
+We can create a background image, which uses a sequence of closed curves
+\footnote {I have to figure out how to improve it a bit so that multiple path
+don't get connected.}. It can also provide two variants of lines around the
+contours (we tag them shape and shade). It's all a matter of taste. In the
+meantime I managed to optimize the code a bit and I suppose that when I buy a new
+computer (the code was developed on an 8 year old machine) performance is
+probably acceptable.
+
+In order of useability you can think of isoband (band) with isolines (cell),
+bitmap (bitmap) with isolines (cell) and finally shapes (shape) with edges
+(edge). But let's start with a couple of examples.
+
+\startbuffer[1]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = 0, xmax = 4*pi, xstep = .05,
+ ymin = -6, ymax = 6, ystep = .05,
+
+ levels = 7,
+ height = 5cm,
+ preamble = "local sin, cos = math.sin, math.cos",
+ function = "cos(x) + sin(y)",
+ background = "bitmap",
+ foreground = "edge",
+ linewidth = 1/2,
+ cache = true,
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\startplacefigure[reference=contour:1]
+ \getbuffer[1]
+\stopplacefigure
+
+\typebuffer[1][option=TEX]
+
+In \in {figure} [contour:1] we see the result. There is a in this case black and
+white image generated and on top of that we see lines. The step determines the
+resolution of the image. In practice using a bitmap is quite okay and also rather
+efficient: we use an indexed colorspace and, as already was mentioned, because
+the number of colors is limited such an image compresses well. A different
+rendering is seen in \in {figure} [contour:2] where we use the shape method for
+the background. That method creates outlines but is much slower, and when you use
+a high resolution (small step) it can take quite a while to identify the shapes.
+This is why we set the cache flag.
+
+\startbuffer[2]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = 0, xmax = 4*pi, xstep = .10,
+ ymin = -6, ymax = 6, ystep = .10,
+
+ levels = 7,
+ preamble = "local sin, cos = math.sin, math.cos",
+ function = "cos(x) - sin(y)",
+ background = "shape",
+ foreground = "shape",
+ linewidth = 1/2,
+ cache = true,
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[2][option=TEX]
+
+\startplacefigure[reference=contour:2]
+ \getbuffer[2]
+\stopplacefigure
+
+We mentioned colorspace but haven't seen any color yet, so let's set some in \in
+{figure} [contour:3]. Two variants are shown: a background \type {shape} with
+foreground \type {shape} and a background \type {bitmap} with a foreground \type
+{edge}. The bitmap renders quite fast, definitely when we compare with the shape,
+while the quality is as good at this size.
+
+\startbuffer[3a]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = -10, xmax = 10, xstep = .1,
+ ymin = -10, ymax = 10, ystep = .1,
+
+ levels = 10,
+ height = 7cm,
+ color = "shade({1/2,1/2,0},{0,0,1/2})",
+ function = "x^2 + y^2",
+ background = "shape",
+ foreground = "shape",
+ linewidth = 1/2,
+ cache = true,
+ ] xsized .45TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[3b]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = -10, xmax = 10, xstep = .1,
+ ymin = -10, ymax = 10, ystep = .1,
+
+ levels = 10,
+ height = 7cm,
+ color = "shade({1/2,0,0},{0,0,1/2})",
+ function = "x^2 + y^2",
+ background = "bitmap",
+ foreground = "edge",
+ linewidth = 1/2,
+ cache = true,
+ ] xsized .45TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[3a][option=TEX]
+
+\startplacefigure[reference=contour:3]
+ \startcombination
+ {\getbuffer[3a]} {\bf shape}
+ {\getbuffer[3b]} {\bf bitmap}
+ \stopcombination
+\stopplacefigure
+
+We use the \type {doublefun} instance because we need to be sure that we don't
+run into issues with scaled numbers, the default model in \METAPOST. The
+function that gets passed is {\em not} using \METAPOST\ but \LUA, so basically
+you can do very complex things. Here we directly pass code, but you can for
+instance also do this:
+
+\starttyping[option=TEX]
+\startluacode
+ function document.MyContourA(x,y)
+ return x^2 + y^2
+ end
+\stopluacode
+\stoptyping
+
+and then \type {function = "document.MyContourA(x,y)"}. As long as the function
+returns a valid number we're okay. When you pass code directly you can use the
+\type {preamble} key to set local shortcuts. In the previous examples we took
+\type {sin} and \type {cos} from the math library but you can also roll out your
+own functions and|/|or use the more elaborate \type {xmath} library. The color
+parameter is also a function, one that returns one or three arguments. In the
+next example we use \type {lin} to calculate a fraction of the current level and
+total number of levels.
+
+\startbuffer[4a]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = -3, xmax = 3, xstep = .01,
+ ymin = -1, ymax = 1, ystep = .01,
+
+ levels = 10,
+ default = .5,
+ height = 5cm,
+ function = "x^2 + y^2 + x + y/2",
+ color = "lin(l), 0, 1/2",
+ background = "bitmap"
+ foreground = "none",
+ cache = true,
+ ] xsized TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[4a][option=TEX]
+
+\startplacefigure[reference=contour:4a]
+ \getbuffer[4a]
+\stopplacefigure
+
+Instead of a bitmap we can use an isoband, which boils down to a set of tiny
+shapes that make up a bigger one. This is shown in \in {figure} [contour:4b].
+
+\startbuffer[4b]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = -3, xmax = 3, xstep = .01,
+ ymin = -1, ymax = 1, ystep = .01,
+
+ levels = 10,
+ default = .5,
+ height = 5cm,
+ function = "x^2 + y^2 + x + y/2",
+ color = "lin(l), 1/2, 0",
+ background = "band",
+ foreground = "none",
+ cache = true,
+ ] xsized TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[4b][option=TEX]
+
+\startplacefigure[reference=contour:4b]
+ \getbuffer[4b]
+\stopplacefigure
+
+You can draw several functions and see where they overlap:
+
+\startbuffer[5]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = -pi, xmax = 4*pi, xstep = .1,
+ ymin = -3, ymax = 3, ystep = .1,
+
+ range = { -.1, .1 },
+ preamble = "local sin, cos = math.sin, math.cos",
+ functions = {
+ "sin(x) + sin(y)", "sin(x) + cos(y)",
+ "cos(x) + sin(y)", "cos(x) + cos(y)"
+ },
+ background = "bitmap",
+ linecolor = "black",
+ linewidth = 1/10,
+ color = "shade({1,1,0},{0,0,1})"
+ cache = true,
+ ] xsized TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[5][option=TEX]
+
+\startplacefigure[reference=contour:5]
+ \getbuffer[5]
+\stopplacefigure
+
+The range determines the $z$ value(s) that we take into account. You can also
+pass a list of colors to be used. In \in {figure} [contour:6] this is
+demonstrated. There we also show a variant foreground \type {cell}, which uses a
+bit different method for calculating the edges. \footnote {This a bit of a
+playground: more variants might show up in due time.}
+
+\startbuffer[6]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = -2*pi, xmax = 2*pi, xstep = .01,
+ ymin = -3, ymax = 3, ystep = .01,
+
+ range = { -.1, .1 },
+ preamble = "local sin, cos = math.sin, math.cos",
+ functions = { "sin(x) + sin(y)", "sin(x) + cos(y)" },
+ background = "bitmap",
+ foreground = "cell",
+ linecolor = "white",
+ linewidth = 1/10,
+ colors = { (1/2,1/2,1/2), red, green, blue }
+ level = 3,
+ linewidth = 6,
+ cache = true,
+ ] xsized TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[6][option=TEX]
+
+Here the number of levels depends on the number of functions as each can overlap
+with another; for instance the outcome of two functions can overlap or not which
+means 3 cases, and with a value not being seen that gives 4 different cases.
+
+\startplacefigure[reference=contour:6]
+ \getbuffer[6]
+\stopplacefigure
+
+\startbuffer[7]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = -2*pi, xmax = 2*pi, xstep = .01,
+ ymin = -3, ymax = 3, ystep = .01,
+
+ range = { -.1, .1 },
+ preamble = "local sin, cos = math.sin, math.cos",
+ functions = {
+ "sin(x) + sin(y)",
+ "sin(x) + cos(y)",
+ "cos(x) + sin(y)",
+ "cos(x) + cos(y)"
+ },
+ background = "bitmap",
+ foreground = "none",
+ level = 3,
+ color = "shade({2/3,0,0},{2/3,1,2/3})"
+ cache = true,
+ ] xsized TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[7][option=TEX]
+
+Of course one can wonder how useful showing many functions but it can give nice
+pictures, as shown in \in {figure} [contour:7].
+
+\startplacefigure[reference=contour:7]
+ \getbuffer[7]
+\stopplacefigure
+
+\startbuffer[8]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = -2*pi, xmax = 2*pi, xstep = .01,
+ ymin = -3, ymax = 3, ystep = .01,
+
+ range = { -.3, .3 },
+ preamble = "local sin, cos = math.sin, math.cos",
+ functions = {
+ "sin(x) + sin(y)",
+ "sin(x) + cos(y)",
+ "cos(x) + sin(y)",
+ "cos(x) + cos(y)"
+ },
+ background = "bitmap",
+ foreground = "none",
+ level = 3,
+ color = "shade({1,0,0},{0,1,0})"
+ cache = true,
+ ] xsized TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[8][option=TEX]
+
+We can enlargen the window, which is demonstrated in \in {figure} [contour:8]. I
+suppose that such images only make sense in educational settings.
+
+\startplacefigure[reference=contour:8]
+ \getbuffer[8]
+\stopplacefigure
+
+% \startbuffer[9a]
+% \startMPcode{doublefun}
+% draw lmt_contour [
+% xmin = -10, xmax = 10, xstep = 1,
+% ymin = -10, ymax = 10, ystep = 1,
+% function = "math.random(1,3)", levels = 3,
+% linecolor = "white", linewidth = 1/10,
+% width = .3TextWidth, legend = "none",
+% color = "shade({1/2,1/2,0},{0,0,1})"
+%
+% background = "bitmap", foreground = "edge",
+% ] ;
+% \stopMPcode
+% \stopbuffer
+%
+% \typebuffer[9a][option=TEX]
+%
+% \startbuffer[9b]
+% \startMPcode{doublefun}
+% draw lmt_contour [
+% xmin = -10, xmax = 10, xstep = 1,
+% ymin = -10, ymax = 10, ystep = 1,
+% function = "math.random(1,3)", levels = 3,
+% linecolor = "white", linewidth = 1/10,
+% width = .3TextWidth, legend = "none",
+% color = "shade({1/2,1/2,0},{0,0,1/2})"
+%
+% background = "bitmap", foreground = "cell",
+% ] ;
+% \stopMPcode
+% \stopbuffer
+%
+% \startbuffer[9c]
+% \startMPcode{doublefun}
+% draw lmt_contour [
+% xmin = -10, xmax = 10, xstep = 1,
+% ymin = -10, ymax = 10, ystep = 1,
+% function = "math.random(1,3)", levels = 3,
+% linecolor = "white", linewidth = 1/10,
+% width = .3TextWidth, legend = "none",
+% color = "shade({1/2,1/2,0},{0,0,1})"
+%
+% background = "bitmap", foreground = "none",
+% ] ;
+% \stopMPcode
+% \stopbuffer
+%
+% \startbuffer[9d]
+% \startMPcode{doublefun}
+% draw lmt_contour [
+% xmin = -10, xmax = 10, xstep = 1,
+% ymin = -10, ymax = 10, ystep = 1,
+% function = "math.random(1,3)", levels = 3,
+% linecolor = "white", linewidth = 1/10,
+% width = .3TextWidth, legend = "none",
+% color = "shade({1/2,1/2,0},{0,0,1})"
+%
+% background = "shape", foreground = "shape",
+% ] ;
+% \stopMPcode
+% \stopbuffer
+%
+% \startbuffer[9e]
+% \startMPcode{doublefun}
+% draw lmt_contour [
+% xmin = -10, xmax = 10, xstep = 1,
+% ymin = -10, ymax = 10, ystep = 1,
+% function = "math.random(1,3)", levels = 3,
+% linecolor = "white", linewidth = 1/10,
+% width = .3TextWidth, legend = "none",
+% color = "shade({1/2,1/2,0},{0,0,1})"
+%
+% background = "shape", foreground = "edge",
+% ] ;
+% \stopMPcode
+% \stopbuffer
+%
+% \startbuffer[9f]
+% \startMPcode{doublefun}
+% draw lmt_contour [
+% xmin = -10, xmax = 10, xstep = 1,
+% ymin = -10, ymax = 10, ystep = 1,
+% function = "math.random(1,3)", levels = 3,
+% linecolor = "white", linewidth = 1/10,
+% width = .3TextWidth, legend = "none",
+% color = "shade({1/2,1/2,0},{0,0,1})"
+%
+% background = "shape", foreground = "none",
+% ] ;
+% \stopMPcode
+% \stopbuffer
+%
+% \startbuffer[9g]
+% \startMPcode{doublefun}
+% draw lmt_contour [
+% xmin = -10, xmax = 10, xstep = 1,
+% ymin = -10, ymax = 10, ystep = 1,
+% function = "math.random(1,3)", levels = 3,
+% linecolor = "white", linewidth = 1/10,
+% width = .3TextWidth, legend = "none",
+% color = "shade({1/2,1/2,0},{0,0,1})"
+%
+% background = "band", foreground = "edge",
+% ] ;
+% \stopMPcode
+% \stopbuffer
+%
+% \startbuffer[9h]
+% \startMPcode{doublefun}
+% draw lmt_contour [
+% xmin = -10, xmax = 10, xstep = 1,
+% ymin = -10, ymax = 10, ystep = 1,
+% function = "math.random(1,3)", levels = 3,
+% linecolor = "white", linewidth = 1/10,
+% width = .3TextWidth, legend = "none",
+% color = "shade({1/2,1/2,0},{0,0,1})"
+%
+% background = "band", foreground = "cell",
+% ] ;
+% \stopMPcode
+% \stopbuffer
+%
+% \startbuffer[9i]
+% \startMPcode{doublefun}
+% draw lmt_contour [
+% xmin = -10, xmax = 10, xstep = 1,
+% ymin = -10, ymax = 10, ystep = 1,
+% function = "math.random(1,3)", levels = 3,
+% linecolor = "white", linewidth = 1/10,
+% width = .3TextWidth, legend = "none",
+% color = "shade({1/2,1/2,0},{0,0,1})"
+%
+% background = "band", foreground = "none",
+% ] ;
+% \stopMPcode
+% \stopbuffer
+%
+% In \in {figure} [contour:9] we see that using the shape option doesn't work out
+% too well here, which again demonstrates that using the bitmap method is not that
+% bad. In that example we use random numbers, just to show the erratic behavior. In
+% \in {figure} [contour:10] a more sane image is used. The band and bitmap examples
+% are generated quite fast so no caching is used there. We only show one definition:
+%
+% \typebuffer[9i][option=TEX]
+%
+% \startplacefigure[reference=contour:9]
+% \startcombination[3*3]
+% {\pushrandomseed\setrandomseed{1}\getbuffer[9a]\poprandomseed} {\bf bitmap edge}
+% {\pushrandomseed\setrandomseed{1}\getbuffer[9b]\poprandomseed} {\bf bitmap cell}
+% {\pushrandomseed\setrandomseed{1}\getbuffer[9c]\poprandomseed} {\bf bitmap none}
+% {\pushrandomseed\setrandomseed{1}\getbuffer[9d]\poprandomseed} {\bf shape shape}
+% {\pushrandomseed\setrandomseed{1}\getbuffer[9e]\poprandomseed} {\bf shape edge}
+% {\pushrandomseed\setrandomseed{1}\getbuffer[9f]\poprandomseed} {\bf shape none}
+% {\pushrandomseed\setrandomseed{1}\getbuffer[9g]\poprandomseed} {\bf band edge}
+% {\pushrandomseed\setrandomseed{1}\getbuffer[9h]\poprandomseed} {\bf band cell}
+% {\pushrandomseed\setrandomseed{1}\getbuffer[9i]\poprandomseed} {\bf band none}
+% \stopcombination
+% \stopplacefigure
+
+In \in {figure} [contour:10] we see different combinations of backgrounds (in color)
+and foregrounds (edges) in action.
+
+\startbuffer[10a]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = 0, xmax = 4*pi, xstep = 0,
+ ymin = -6, ymax = 6, ystep = 0,
+
+ levels = 5, legend = false, linewidth = 1/2,
+
+ preamble = "local sin, cos = math.sin, math.cos",
+ function = "cos(x) - sin(y)",
+ color = "shade({1/2,0,0},{0,0,1/2})",
+
+ background = "bitmap", foreground = "edge",
+ ] xsized .3TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[10b]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = 0, xmax = 4*pi, xstep = 0,
+ ymin = -6, ymax = 6, ystep = 0,
+
+ levels = 5, legend = false, linewidth = 1/2,
+
+ preamble = "local sin, cos = math.sin, math.cos",
+ function = "cos(x) - sin(y)",
+ color = "shade({1/2,0,0},{0,0,1/2})",
+
+ background = "bitmap", foreground = "cell",
+ ] xsized .3TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[10c]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = 0, xmax = 4*pi, xstep = 0,
+ ymin = -6, ymax = 6, ystep = 0,
+
+ levels = 5, legend = false, linewidth = 1/2,
+
+ preamble = "local sin, cos = math.sin, math.cos",
+ function = "cos(x) - sin(y)",
+ color = "shade({1/2,0,0},{0,0,1/2})",
+
+ background = "bitmap", foreground = "none",
+ ] xsized .3TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[10d]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = 0, xmax = 4*pi, xstep = 0,
+ ymin = -6, ymax = 6, ystep = 0,
+
+ levels = 5, legend = false, linewidth = 1/2,
+
+ preamble = "local sin, cos = math.sin, math.cos",
+ function = "cos(x) - sin(y)",
+ color = "shade({1/2,0,0},{0,0,1/2})",
+
+ background = "shape", foreground = "shape", cache = true,
+ ] xsized .3TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[10e]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = 0, xmax = 4*pi, xstep = 0,
+ ymin = -6, ymax = 6, ystep = 0,
+
+ levels = 5, legend = false, linewidth = 1/2,
+
+ preamble = "local sin, cos = math.sin, math.cos",
+ function = "cos(x) - sin(y)",
+ color = "shade({1/2,0,0},{0,0,1/2})",
+
+ background = "shape", foreground = "edge", cache = true,
+ ] xsized .3TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[10f]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = 0, xmax = 4*pi, xstep = 0,
+ ymin = -6, ymax = 6, ystep = 0,
+
+ levels = 5, legend = false, linewidth = 1/2,
+
+ preamble = "local sin, cos = math.sin, math.cos",
+ function = "cos(x) - sin(y)",
+ color = "shade({1/2,0,0},{0,0,1/2})",
+
+ background = "shape", foreground = "none", cache = true,
+ ] xsized .3TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[10g]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = 0, xmax = 4*pi, xstep = 0,
+ ymin = -6, ymax = 6, ystep = 0,
+
+ levels = 5, legend = false, linewidth = 1/2,
+
+ preamble = "local sin, cos = math.sin, math.cos",
+ function = "cos(x) - sin(y)",
+ color = "shade({1/2,0,0},{0,0,1/2})",
+
+ background = "band", foreground = "edge",
+ ] xsized .3TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[10h]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = 0, xmax = 4*pi, xstep = 0,
+ ymin = -6, ymax = 6, ystep = 0,
+
+ levels = 5, legend = false, linewidth = 1/2,
+
+ preamble = "local sin, cos = math.sin, math.cos",
+ function = "cos(x) - sin(y)",
+ color = "shade({1/2,0,0},{0,0,1/2})",
+
+ background = "band", foreground = "cell",
+ ] xsized .3TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[10i]
+\startMPcode{doublefun}
+ draw lmt_contour [
+ xmin = 0, xmax = 4*pi, xstep = 0,
+ ymin = -6, ymax = 6, ystep = 0,
+
+ levels = 5, legend = false, linewidth = 1/2,
+
+ preamble = "local sin, cos = math.sin, math.cos",
+ function = "cos(x) - sin(y)",
+ color = "shade({1/2,0,0},{0,0,1/2})",
+
+ background = "band", foreground = "none",
+ ] xsized .3TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[10b][option=TEX]
+
+% \page
+
+There are quite some settings. Some deal with the background, some with the
+foreground and quite some deal with the legend.
+
+\starttabulate[|T|T|T|p|]
+\FL
+\BC name \BC type \BC default \BC comment \NC \NR
+\ML
+\NC xmin \NC numeric \NC 0 \NC needs to be set \NC \NR
+\NC xmax \NC numeric \NC 0 \NC needs to be set \NC \NR
+\NC ymin \NC numeric \NC 0 \NC needs to be set \NC \NR
+\NC ymax \NC numeric \NC 0 \NC needs to be set \NC \NR
+\NC xstep \NC numeric \NC 0 \NC auto 1/200 when zero \NC \NR
+\NC ystep \NC numeric \NC 0 \NC auto 1/200 when zero \NC \NR
+\NC checkresult \NC boolean \NC false \NC checks for overflow and NaN \NC \NR
+\NC defaultnan \NC numeric \NC 0 \NC the value to be used when NaN \NC \NR
+\NC defaultinf \NC numeric \NC 0 \NC the value to be used when overflow \NC \NR
+\ML
+\NC levels \NC numeric \NC 10 \NC number of different levels to show \NC \NR
+\NC level \NC numeric \NC \NC only show this level (foreground) \NC \NR
+\ML
+\NC preamble \NC string \NC \NC shortcuts \NC \NR
+\NC function \NC string \NC x + y \NC the result z value \NC \NR
+\NC functions \NC list \NC \NC multiple functions (overlapping levels) \NC \NR
+\NC color \NC string \NC lin(l) \NC the result color value for level l (1 or 3 values) \NC \NR
+\NC colors \NC numeric \NC \NC used when set \NC \NR
+\ML
+\NC background \NC string \NC bitmap \NC band, bitmap, shape \NC \NR
+\NC foreground \NC string \NC auto \NC cell, edge, shape auto \NC \NR
+\ML
+\NC linewidth \NC numeric \NC .25 \NC \NC \NR
+%NC backgroundcolor \NC string \NC black \NC \NC \NR
+\NC linecolor \NC string \NC gray \NC \NC \NR
+\ML
+\NC width \NC numeric \NC 0 \NC automatic when zero \NC \NR
+\NC height \NC numeric \NC 0 \NC automatic when zero \NC \NR
+\ML
+\NC trace \NC boolean \NC false \NC \NC \NR
+\ML
+\NC legend \NC string \NC all \NC x y z function range all \NC \NR
+\NC legendheight \NC numeric \NC LineHeight \NC \NC \NR
+\NC legendwidth \NC numeric \NC LineHeight \NC \NC \NR
+\NC legendgap \NC numeric \NC 0 \NC \NC \NR
+\NC legenddistance \NC numeric \NC EmWidth \NC \NC \NR
+\NC textdistance \NC numeric \NC 2EmWidth/3 \NC \NC \NR
+\NC functiondistance \NC numeric \NC ExHeight \NC \NC \NR
+\NC functionstyle \NC string \NC \NC \CONTEXT\ style name \NC \NR
+\NC xformat \NC string \NC @0.2N \NC number format template \NC \NR
+\NC yformat \NC string \NC @0.2N \NC number format template \NC \NR
+\NC zformat \NC string \NC @0.2N \NC number format template \NC \NR
+\NC xstyle \NC string \NC \NC \CONTEXT\ style name \NC \NR
+\NC ystyle \NC string \NC \NC \CONTEXT\ style name \NC \NR
+\NC zstyle \NC string \NC \NC \CONTEXT\ style name \NC \NR
+\ML
+\NC axisdistance \NC numeric \NC ExHeight \NC \NC \NR
+\NC axislinewidth \NC numeric \NC .25 \NC \NC \NR
+\NC axisoffset \NC numeric \NC ExHeight/4 \NC \NC \NR
+\NC axiscolor \NC string \NC black \NC \NC \NR
+\NC ticklength \NC numeric \NC ExHeight \NC \NC \NR
+\ML
+\NC xtick \NC numeric \NC 5 \NC \NC \NR
+\NC ytick \NC numeric \NC 5 \NC \NC \NR
+\NC xlabel \NC numeric \NC 5 \NC \NC \NR
+\NC ylabel \NC numeric \NC 5 \NC \NC \NR
+\LL
+\stoptabulate
+
+\startplacefigure[reference=contour:10]
+ \startcombination[3*3]
+ {\getbuffer[10a]} {\bf bitmap edge}
+ {\getbuffer[10b]} {\bf bitmap cell}
+ {\getbuffer[10c]} {\bf bitmap none}
+ {\getbuffer[10d]} {\bf shape shape}
+ {\getbuffer[10e]} {\bf shape edge}
+ {\getbuffer[10f]} {\bf shape none}
+ {\getbuffer[10g]} {\bf band edge}
+ {\getbuffer[10h]} {\bf band cell}
+ {\getbuffer[10i]} {\bf band none}
+ \stopcombination
+\stopplacefigure
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-followtext.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-followtext.tex
new file mode 100644
index 00000000000..0791315656a
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-followtext.tex
@@ -0,0 +1,124 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-followtext
+
+\startchapter[title={Followtext}]
+
+Typesetting text along a path started as a demo if communication between \TEX\ and
+\METAPOST\ in the early days of \METAFUN. In the meantime the implementation has
+been modernized a few times and the current implementation feels okay, especially
+now that we have a better user interface. Here is an example:
+
+\startbuffer[1a]
+\startMPcode{doublefun}
+ draw lmt_followtext [
+ text = "How well does it work {\bf 1}! ",
+ path = fullcircle scaled 4cm,
+ trace = true,
+ spread = true,
+ ] ysized 5cm ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[1a][option=TEX]
+
+Here is the same example but with the text in the reverse order. The results of both examples
+are shown in \in {figure} [followtext:1].
+
+\startbuffer[1b]
+\startMPcode{doublefun}
+ draw lmt_followtext [
+ text = "How well does it work {\bf 2}! ",
+ path = fullcircle scaled 4cm,
+ trace = true,
+ spread = false,
+ reverse = true,
+ ] ysized 5cm ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[1b][option=TEX]
+
+\startplacefigure[reference=followtext:1]
+ \startcombination[2*2]
+ {\getbuffer[1a]} {}
+ {\getbuffer[1b]} {}
+ \stopcombination
+\stopplacefigure
+
+There are not that many options. One is \type {autoscale} which makes the shape
+and text match. \in {Figure} [followtext:2] shows what happens.
+
+\startbuffer[2a]
+\startMPcode{doublefun}
+ draw lmt_followtext [
+ text = "How well does it work {\bf 3}! ",
+ trace = true,
+ autoscaleup = "yes"
+ ] ysized 5cm ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[2a][option=TEX]
+
+\startbuffer[2b]
+\startMPcode{doublefun}
+ draw lmt_followtext [
+ text = "How well does it work {\bf 4}! ",
+ path = fullcircle scaled 2cm,
+ trace = true,
+ autoscaleup = "max"
+ ] ysized 5cm ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[2b][option=TEX]
+
+\startplacefigure[reference=followtext:2]
+ \startcombination[2*2]
+ {\getbuffer[2a]} {}
+ {\getbuffer[2b]} {}
+ \stopcombination
+\stopplacefigure
+
+You can use quite strange paths, like the one show in \in {figure}
+[followtext:3]. Watch the parenthesis around the path. this is really needed in
+order for the scanner to pick up the path (otherwise it sees a pair).
+
+\startbuffer[3]
+\startMPcode{doublefun}
+ draw lmt_followtext [
+ text = "\samplefile {zapf}",
+ path = ((3,0) .. (1,0) .. (5,0) .. (2,0) .. (4,0) .. (3,0)),
+ autoscaleup = "max"
+ ] xsized TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[3][option=TEX]
+
+\startplacefigure[reference=followtext:3]
+ \getbuffer[3]
+\stopplacefigure
+
+The small set of options is:
+
+\starttabulate[|T|T|T|p|]
+\FL
+\BC name \BC type \BC default \BC comment \NC \NR
+\ML
+\NC text \NC string \NC \NC \NC \NR
+\NC spread \NC string \NC true \NC \NC \NR
+\NC trace \NC numeric \NC false \NC \NC \NR
+\NC reverse \NC numeric \NC false \NC \NC \NR
+\NC autoscaleup \NC numeric \NC no \NC \NC \NR
+\NC autoscaledown \NC string \NC no \NC \NC \NR
+\NC path \NC string \NC (fullcircle) \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-fonts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-fonts.tex
new file mode 100644
index 00000000000..27ea2fd0014
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-fonts.tex
@@ -0,0 +1,328 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-fonts
+
+\startchapter[title={Fonts}]
+
+Fonts are interesting phenomena but can also be quite hairy. Shapes can be
+missing or not to your liking. There can be bugs too. Control over fonts has
+always been on the agenda of \TEX\ macro packages, and \CONTEXT\ provides a lot
+of control, especially in \MKIV. In \LMTX\ we add some more to that: we bring
+back \METAFONT's but now in the \METAPOST\ way. A simple example shows how this
+is (maybe I should say: will be) done.
+
+We define three simple shapes and do that (for now) in the \type {simplefun}
+instance because that's what is used when generating the glyphs.
+
+\startbuffer
+\startMPcalculation{simplefun}
+ vardef TestGlyphLB =
+ image (
+ fill (unitsquare xscaled 10 yscaled 16 shifted (0,-3))
+ withcolor "darkred" withtransparency (1,.5)
+ ;
+ )
+ enddef ;
+
+ vardef TestGlyphRB =
+ image (
+ fill (unitcircle xscaled 15 yscaled 12 shifted (0,-2))
+ withcolor "darkblue" withtransparency (1,.5)
+ ;
+ )
+ enddef ;
+
+ vardef TestGlyphFS =
+ image (
+ fill (unittriangle xscaled 15 yscaled 12 shifted (0,-2))
+ withcolor "darkgreen" withtransparency (1,.5)
+ ;
+ )
+ enddef ;
+\stopMPcalculation
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+This is not that spectacular, not is the following:
+
+\startbuffer
+\startMPcalculation{simplefun}
+ lmt_registerglyphs [
+ name = "test",
+ units = 10, % 1000
+ ] ;
+
+ lmt_registerglyph [
+ category = "test",
+ unicode = 123,
+ code = "draw TestGlyphLB ;",
+ width = 10, % 1000
+ height = 13, % 1300
+ depth = 3 % 300
+ ] ;
+
+ lmt_registerglyph [
+ category = "test",
+ unicode = 125,
+ code = "draw TestGlyphRB ;",
+ width = 15,
+ height = 10,
+ depth = 2
+ ] ;
+
+ lmt_registerglyph [
+ category = "test",
+ unicode = "/",
+ code = "draw TestGlyphFS ;",
+ width = 15,
+ height = 10,
+ depth = 2
+ ] ;
+
+\stopMPcalculation
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+We now define a font. We always use a font as starting point which has the
+advantage that we always get something reasonable when we test. Of course you can
+use this \type {mps} font feature with other fonts too.
+
+\startbuffer
+\definefontfeature[metapost][metapost=test] % or: mps={category=test}
+
+\definefont[MyFontA][Serif*metapost @ 10bp]
+\definefont[MyFontB][Serif*metapost @ 12bp]
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+These fonts can now be used:
+
+\startbuffer
+\MyFontA \dorecurse{20}{\{ /#1/ \} }\par
+\MyFontB \dorecurse{20}{\{ /#1/ \} }\par
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+We get some useless text but it demonstrates the idea:
+
+{\getbuffer}
+
+If you know a bit more about \CONTEXT\ you could think: so what, wasn't this
+already possible? Sure, there are various ways to achieve similar effects, but
+the method described here has a few advantages: it's relatively easy and we're
+talking about real fonts here. This means that using the shapes for characters is
+pretty efficient.
+
+A more realistic example is given next. It is a subset of what is available in
+the \CONTEXT\ core.
+
+\startbuffer
+\startMPcalculation{simplefun}
+
+ pen SymbolPen ; SymbolPen := pencircle scaled 1/4 ;
+
+ vardef SymbolBullet =
+ fill unitcircle scaled 3 shifted (1.5,1.5) withpen SymbolPen
+ enddef ;
+ vardef SymbolSquare =
+ draw unitsquare scaled (3-1/16) shifted (1.5,1.5) withpen SymbolPen
+ enddef ;
+ vardef SymbolBlackDiamond =
+ fillup unitdiamond scaled (3-1/16) shifted (1.5,1.5) withpen SymbolPen
+ enddef ;
+ vardef SymbolNotDef =
+ draw center unitcircle
+ scaled 3
+ shifted (1.5,1.5)
+ withpen SymbolPen scaled 4
+ enddef ;
+
+ lmt_registerglyphs [
+ name = "symbols",
+ units = 10,
+ usecolor = true,
+ width = 6,
+ height = 6,
+ depth = 0,
+ code = "SymbolNotDef ;",
+ ] ;
+
+ lmt_registerglyph [ category = "symbols", unicode = "0x2022",
+ code = "SymbolBullet ;"
+ ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x25A1",
+ code = "SymbolSquare ;"
+ ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x25C6",
+ code = "SymbolBlackDiamond ;"
+ ] ;
+\stopMPcalculation
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+We could use these symbols in for instance itemize symbols. You might notice the
+potential difference in bullets:
+
+\startbuffer
+\definefontfeature[metapost][metapost=symbols]
+
+\definefont[MyFont] [Serif*metapost sa 1]
+
+\startitemize[packed]
+ \startitem {\MyFont • □ ◆}\quad Regular rendering. \stopitem
+ \startitem {\MyFont\red • □ ◆}\quad Rendering with color. \stopitem
+ \startitem {\MyFont\blue\showglyphs • □ ◆}\quad Idem but with boundingboxes shown. \stopitem
+\stopitemize
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+When blown up, these symbols look as follows:
+
+\startlinecorrection
+\scale[width=\textwidth]{%
+ {\MyFont •□◆}%
+ {\MyFont\red •□◆}%
+ {\MyFont\blue\showglyphs •□◆}%
+}
+\stoplinecorrection
+
+You can use these tricks with basically any font, so also with math fonts.
+However, at least for now, you need to define these before the font gets loaded.
+
+\startbuffer
+\startMPcalculation{simplefun}
+
+ pen KindergartenPen ; KindergartenPen := pencircle scaled 1 ;
+
+ % 10 x 10 grid
+
+ vardef KindergartenEqual =
+ draw image
+ (
+ draw (2,6) -- (9,5) ;
+ draw (2,4) -- (8,3) ;
+ )
+ shifted (0,-2)
+ withpen KindergartenPen
+ withcolor "KindergartenEqual"
+ enddef ;
+ vardef KindergartenPlus =
+ draw image
+ (
+ draw (1,4) -- (9,5) ;
+ draw (4,1) -- (5,8) ;
+ )
+ shifted (0,-2)
+ withpen KindergartenPen
+ withcolor "KindergartenPlus"
+ enddef ;
+ vardef KindergartenMinus =
+ draw image
+ (
+ draw (1,5) -- (9,4) ;
+ )
+ shifted (0,-2)
+ withpen KindergartenPen
+ withcolor "KindergartenMinus"
+ enddef ;
+ vardef KindergartenTimes =
+ draw image
+ (
+ draw (2,1) -- (9,8) ;
+ draw (8,1) -- (2,8) ;
+ )
+ shifted (0,-2)
+ withpen KindergartenPen
+ withcolor "KindergartenTimes"
+ enddef ;
+ vardef KindergartenDivided =
+ draw image
+ (
+ draw (2,1) -- (8,9) ;
+ )
+ shifted (0,-2)
+ withpen KindergartenPen
+ withcolor "KindergartenDivided"
+ enddef ;
+
+ lmt_registerglyphs [
+ name = "kindergarten",
+ units = 10,
+ % usecolor = true,
+ width = 10,
+ height = 8,
+ depth = 2,
+ ] ;
+
+ lmt_registerglyph [ category = "kindergarten", unicode = "0x003D",
+ code = "KindergartenEqual"
+ ] ;
+ lmt_registerglyph [ category = "kindergarten", unicode = "0x002B",
+ code = "KindergartenPlus"
+ ] ;
+ lmt_registerglyph [ category = "kindergarten", unicode = "0x2212",
+ code = "KindergartenMinus"
+ ] ;
+ lmt_registerglyph [ category = "kindergarten", unicode = "0x00D7",
+ code = "KindergartenTimes"
+ ] ;
+ lmt_registerglyph [ category = "kindergarten", unicode = "0x002F",
+ code = "KindergartenDivided"
+ ] ;
+
+\stopMPcalculation
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+We also define the colors. If we leave \type {usecolor} to true, the text colors
+will be taken.
+
+\startbuffer[definitions]
+\definecolor[KindergartenEqual] [darkgreen]
+\definecolor[KindergartenPlus] [darkred]
+\definecolor[KindergartenMinus] [darkred]
+\definecolor[KindergartenTimes] [darkblue]
+\definecolor[KindergartenDivided][darkblue]
+
+\definefontfeature[mathextra][metapost=kindergarten]
+\stopbuffer
+
+\typebuffer[definitions][option=TEX] \getbuffer[definitions]
+
+Here is an example:
+
+\starttyping
+\switchtobodyfont[cambria]
+
+$ y = 2 \times x + a - b / 3 $
+\stoptyping
+
+Scaled up:
+
+\startlinecorrection
+ \switchtobodyfont[cambria]
+ \scale[width=\textwidth]{$ y = 2 \times x + a - b / 3 $}
+\stoplinecorrection
+
+Of course this won't work out well (yet) with extensible yet, due to related
+definitions for which we don't have an interface yet. There is one thing that you
+need to keep in mind: the fonts are flushed when the document gets finalized so
+you have to make sure that colors are defined at the level that they are still
+valid at that time. So best put color definitions like the above in the document
+style.
+
+This is an experimental interface anyway so we don't explain the parameters yet
+as there might be more of them.
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-function.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-function.tex
new file mode 100644
index 00000000000..79fa97a21de
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-function.tex
@@ -0,0 +1,296 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-function
+
+\startchapter[title={Function}]
+
+It is tempting to make helpers that can do a lot. However, that also means that
+we need to explain a lot. Instead it makes more sense to have specific helpers
+and just make another one when needed. Rendering functions falls into this
+category. At some point users will come up with specific cases that other users
+can use. Therefore, the solution presented here is not the ultimate answer. We
+start with a simple example:
+
+\startbuffer[1]
+\startMPcode{doublefun}
+ draw lmt_function [
+ xmin = 0, xmax = 20, xstep = .1,
+ ymin = -2, ymax = 2,
+
+ sx = 1mm, xsmall = 80, xlarge = 20,
+ sy = 4mm, ysmall = 40, ylarge = 4,
+
+ linewidth = .025mm, offset = .1mm,
+
+ code = "1.5 * math.sind (50 * x - 150)",
+ ]
+ xsized 8cm
+ ;
+\stopMPcode
+\stopbuffer
+
+\startplacefigure
+ \getbuffer[1]
+\stopplacefigure
+
+This image is defined as follows:
+
+\typebuffer[1][option=TEX]
+
+\startbuffer[2]
+\startMPcode{doublefun}
+ draw lmt_function [
+ xmin = 0, xmax = 20, xstep = .1,
+ ymin = -2, ymax = 2,
+
+ sx = 1mm, xsmall = 80, xlarge = 20,
+ sy = 4mm, ysmall = 40, ylarge = 4,
+
+ linewidth = .025mm, offset = .1mm,
+
+ xticks = "bottom",
+ yticks = "left",
+ xlabels = "nolimits",
+ ylabels = "yes",
+ code = "1.5 * math.sind (50 * x - 150)",
+ % frame = "ticks",
+ frame = "sticks",
+ ycaption = "\strut \rotate[rotation=90]{something vertical, using $\sin{x}$}",
+ xcaption = "\strut something horizontal",
+ functions = {
+ [ xmin = 1.0, xmax = 7.0, close = true, fillcolor = "darkred" ],
+ [ xmin = 7.0, xmax = 12.0, close = true, fillcolor = "darkgreen" ],
+ [ xmin = 12.0, xmax = 19.0, close = true, fillcolor = "darkblue" ],
+ [
+ drawcolor = "darkyellow",
+ drawsize = 2
+ ]
+ }
+ ]
+ xsized TextWidth
+ ;
+\stopMPcode
+\stopbuffer
+
+We can draw multiple functions in one go. The next sample split the drawing over
+a few ranges and is defined as follows; in \in {figure} [function:2] we see the
+result.
+
+\typebuffer[2][option=TEX]
+
+
+\startplacefigure[reference=function:2]
+ \getbuffer[2]
+\stopplacefigure
+
+Instead of the same function, we can draw different ones and when we use transparency
+we get nice results too.
+
+\startbuffer[3]
+\definecolor[MyColorR][r=.5,t=.5,a=1]
+\definecolor[MyColorG][g=.5,t=.5,a=1]
+\definecolor[MyColorB][b=.5,t=.5,a=1]
+
+\startMPcode{doublefun}
+ draw lmt_function [
+ xmin = 0, xmax = 20, xstep = .1,
+ ymin = -1, ymax = 1,
+
+ sx = 1mm, xsmall = 80, xlarge = 20,
+ sy = 4mm, ysmall = 40, ylarge = 4,
+
+ linewidth = .025mm, offset = .1mm,
+
+ functions = {
+ [
+ code = "math.sind (50 * x - 150)",
+ close = true,
+ fillcolor = "MyColorR"
+ ],
+ [
+ code = "math.cosd (50 * x - 150)",
+ close = true,
+ fillcolor = "MyColorB"
+ ]
+ },
+ ]
+ xsized TextWidth
+ ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[3][option=TEX]
+
+\startplacefigure[reference=function:3]
+ \getbuffer[3]
+\stopplacefigure
+
+It is important to choose a good step. In \in {figure} [function:4] we show 4
+variants and it is clear that in this case using straight line segments is better
+(or at least more efficient with small steps).
+
+\startbuffer[4a]
+\startMPcode{doublefun}
+ draw lmt_function [
+ xmin = 0, xmax = 10, xstep = .1,
+ ymin = -1, ymax = 1,
+
+ sx = 1mm, sy = 4mm,
+
+ linewidth = .025mm, offset = .1mm,
+
+ code = "math.sind (50 * x^2 - 150)",
+ shape = "curve"
+ ]
+ xsized .45TextWidth
+ ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[4b]
+\startMPcode{doublefun}
+ draw lmt_function [
+ xmin = 0, xmax = 10, xstep = .01,
+ ymin = -1, ymax = 1,
+
+ sx = 1mm, sy = 4mm,
+
+ linewidth = .025mm, offset = .1mm,
+
+ code = "math.sind (50 * x^2 - 150)",
+ shape = "curve"
+ ]
+ xsized .45TextWidth
+ ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[4c]
+\startMPcode{doublefun}
+ draw lmt_function [
+ xmin = 0, xmax = 10, xstep = .1,
+ ymin = -1, ymax = 1,
+
+ sx = 1mm, sy = 4mm,
+
+ linewidth = .025mm, offset = .1mm,
+
+ code = "math.sind (50 * x^2 - 150)",
+ shape = "line"
+ ]
+ xsized .45TextWidth
+ ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[4d]
+\startMPcode{doublefun}
+ draw lmt_function [
+ xmin = 0, xmax = 10, xstep = .01,
+ ymin = -1, ymax = 1,
+
+ sx = 1mm, sy = 4mm,
+
+ linewidth = .025mm, offset = .1mm,
+
+ code = "math.sind (50 * x^2 - 150)",
+ shape = "line"
+ ]
+ xsized .45TextWidth
+ ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[4a][option=TEX]
+
+\startplacefigure[reference=function:4]
+ \startcombination[2*2]
+ {\getbuffer[4a]} {\type {xstep=.10} and \type {shape="curve"}}
+ {\getbuffer[4b]} {\type {xstep=.01} and \type {shape="curve"}}
+ {\getbuffer[4c]} {\type {xstep=.10} and \type {shape="line"}}
+ {\getbuffer[4d]} {\type {xstep=.01} and \type {shape="line"}}
+ \stopcombination
+\stopplacefigure
+
+You can manipulate the axis (a bit) by tweaking the first and last ticks. In the
+case of \in {figure} [function:5] we also put the shape on top of the axis.
+
+\startbuffer[5]
+\startMPcode{doublefun}
+ draw lmt_function [
+ xfirst = 9, xlast = 21, ylarge = 2, ysmall = 1/5,
+ yfirst = -1, ylast = 1, xlarge = 2, xsmall = 1/4,
+
+ xmin = 10, xmax = 20, xstep = .25,
+ ymin = -1, ymax = 1,
+
+ drawcolor = "darkmagenta",
+ shape = "steps",
+ code = "0.5 * math.random(-2,2)",
+ linewidth = .025mm,
+ offset = .1mm,
+ reverse = true,
+ ]
+ xsized TextWidth
+ ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[5][option=TEX]
+
+\startplacefigure[reference=function:5]
+ \getbuffer[5]
+\stopplacefigure
+
+The whole repertoire of parameters (in case of doubt just check the source code as this
+kind of code is not that hard to follow) is:
+
+\starttabulate[|T|T|T|p|]
+\FL
+\BC name \BC type \BC default \BC comment \NC \NR
+\ML
+\NC sx \NC numeric \NC 1mm \NC horizontal scale factor \NC \NR
+\NC sy \NC numeric \NC 1mm \NC vertical scale factor \NC \NR
+\NC offset \NC numeric \NC 0 \NC \NC \NR
+\NC xmin \NC numeric \NC 1 \NC \NC \NR
+\NC xmax \NC numeric \NC 1 \NC \NC \NR
+\NC xstep \NC numeric \NC 1 \NC \NC \NR
+\NC xsmall \NC numeric \NC \NC optional step of small ticks \NC \NR
+\NC xlarge \NC numeric \NC \NC optional step of large ticks \NC \NR
+\NC xlabels \NC string \NC no \NC \type {yes}, \type {no} or \type {nolimits} \NC \NR
+\NC xticks \NC string \NC bottom \NC possible locations are \type {top}, \type {middle} and \type {bottom} \NC \NR
+\NC xcaption \NC string \NC \NC \NC \NR
+\NC ymin \NC numeric \NC 1 \NC \NC \NR
+\NC ymax \NC numeric \NC 1 \NC \NC \NR
+\NC ystep \NC numeric \NC 1 \NC \NC \NR
+\NC ysmall \NC numeric \NC \NC optional step of small ticks \NC \NR
+\NC ylarge \NC numeric \NC \NC optional step of large ticks \NC \NR
+\NC xfirst \NC numeric \NC \NC left of \type {xmin} \NC \NR
+\NC xlast \NC numeric \NC \NC right of \type {xmax} \NC \NR
+\NC yfirst \NC numeric \NC \NC below \type {ymin} \NC \NR
+\NC ylast \NC numeric \NC \NC above \type {ymax} \NC \NR
+\NC ylabels \NC string \NC no \NC \type {yes}, \type {no} or \type {nolimits} \NC \NR
+\NC yticks \NC string \NC left \NC possible locations are \type {left}, \type {middle} and \type {right} \NC \NR
+\NC ycaption \NC string \NC \NC \NC \NR
+\NC code \NC string \NC \NC \NC \NR
+\NC close \NC boolean \NC false \NC \NC \NR
+\NC shape \NC string \NC curve \NC or \type {line} \NC \NR
+\NC fillcolor \NC string \NC \NC \NC \NR
+\NC drawsize \NC numeric \NC 1 \NC \NC \NR
+\NC drawcolor \NC string \NC \NC \NC \NR
+\NC frame \NC string \NC \NC options are \type {yes}, \type {ticks} and \type {sticks} \NC \NR
+\NC linewidth \NC numeric \NC .05mm \NC \NC \NR
+\NC pointsymbol \NC string \NC \NC like type {dots} \NC \NR
+\NC pointsize \NC numeric \NC 2 \NC \NC \NR
+\NC pointcolor \NC string \NC \NC \NC \NR
+\NC xarrow \NC string \NC \NC \NC \NR
+\NC yarrow \NC string \NC \NC \NC \NR
+\NC reverse \NC boolean \NC false \NC when \type {true} draw the function between axis and labels \NC \NR
+\LL
+\stoptabulate
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-grid.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-grid.tex
new file mode 100644
index 00000000000..719d8023d28
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-grid.tex
@@ -0,0 +1,11 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-grid
+
+\startchapter[title={Grid}]
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-groups.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-groups.tex
new file mode 100644
index 00000000000..b29ab3cbf47
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-groups.tex
@@ -0,0 +1,52 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-groups
+
+\startchapter[title={Groups}]
+
+This is just a quick example of an experimental features.
+
+\startbuffer
+\startMPcode
+ fill fullcircle scaled 2cm shifted ( 5mm,2cm) withcolor "darkblue" ;
+ fill fullcircle scaled 2cm shifted (15mm,2cm) withcolor "darkblue" ;
+
+ fill fullcircle scaled 2cm shifted ( 5mm,-2cm) withcolor "darkgreen" ;
+ fill fullcircle scaled 2cm shifted (15mm,-2cm) withcolor "darkgreen" ;
+
+ draw image (
+ fill fullcircle scaled 4cm withcolor "darkred" ;
+ fill fullcircle scaled 4cm shifted (2cm,0) withcolor "darkred" ;
+
+ setgroup currentpicture to boundingbox currentpicture
+ withtransparency (1,.5) ;
+ ) ;
+
+ draw image (
+ fill fullcircle scaled 3cm withcolor "darkyellow"
+ withtransparency (1,.5) ;
+ fill fullcircle scaled 3cm shifted (2cm,0) withcolor "darkyellow"
+ withtransparency (1,.5) ;
+ ) ;
+
+ addbackground withcolor "darkgray" ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+A group create an object that when transparency is applied is treated as
+a group.
+
+\startlinecorrection
+ \getbuffer
+\stoplinecorrection
+
+(Groups might become more powerful in the future, like reusable components but
+then some more juggling is needed.)
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-interface.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-interface.tex
new file mode 100644
index 00000000000..662ae61a88b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-interface.tex
@@ -0,0 +1,155 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-interface
+
+\startchapter[title={Interface}]
+
+Because graphic solutions are always kind of personal or domain driven it makes not
+much sense to cook up very generic solutions. If you have a project where \METAPOST\
+can be of help, it also makes sense to spend some time on implementing the basics that
+you need. In that case you can just copy and tweak what is there. The easiest way to
+do that is to make a test file and use:
+
+\starttyping[option=TEX]
+\startMPpage
+ % your code
+\stopMPpage
+\stoptyping
+
+Often you don't need to write macros, and standard drawing commands will do the
+job, but when you find yourself repeating code, a wapper might make sense. And
+this is why we have this key|/|value interface: it's easier to abstract your
+settings than to pass them as (expression or text) arguments to a macro,
+especially when there are many.
+
+You can find many examples of the key|/|value driven user interface in the source
+files and these are actually not that hard to understand when you know a bit of
+\METAPOST\ and the additional macros that come with \METAFUN. In case you wonder
+about overhead: the performance of this mechanism is pretty good.
+
+Although the parameter handler runs on top of the \LUA\ interface, you don't need
+to use \LUA\ unless you find that \METAPOST\ can't do the job. I won't give
+examples of coding because I think that the source of \METAFUN\ provides enough
+clues, especially the file \type {mp-lmtx.mpxl}. As the name suggests this is
+part of the \CONTEXT\ version \LMTX, which runs on top of \LUAMETATEX. I leave it
+open if I will backport this functionality to \LUATEX\ and therefore \MKIV.
+
+An excellent explanation of this interface can be found at:
+
+\starttyping
+https://adityam.github.io/context-blog/post/new-metafun-interface/
+\stoptyping
+
+So (at least for now) here I can stick to just mentioning the currently stable
+interface macros:
+
+\starttabulate[|T|l|pl|]
+\FL
+\NC presetparameters \NC \type {name [...]} \NC
+ Assign default values to a category of parameters. Sometimes it makes sense
+ not to set a default, because then you can check if a parameter has been set
+ at all.
+ \NC \NR
+\NC applyparameters \NC \type {name macro} \NC
+ This prepares the parameter handler for the given category and calls the
+ given macro when that is done.
+ \NC \NR
+\NC getparameters \NC \type {name [...]} \NC
+ The parameters given after the category name are set.
+ \NC \NR
+\ML
+\NC hasparameter \NC \type {names} \NC
+ Returns \type {true} when a parameter is set, and \type {false} otherwise.
+ \NC \NR
+\NC hasoption \NC \type {names options} \NC
+ Returns \type {true} when there is overlap in given options, and \type
+ {false} otherwise.
+ \NC \NR
+\ML
+\NC getparameter \NC \type {names} \NC
+ Resolves the parameter with the given name. because a parameter itself can
+ have a parameter list you can pass additional names to reach the final
+ destination.
+ \NC \NR
+\NC getparameterdefault \NC \type {names} \NC
+ Resolves the parameter with the given name. because a parameter itself can
+ have a parameter list you can pass additional names to reach the final
+ destination. The last value is used when no parameter is found.
+ \NC \NR
+\ML
+\NC getparametercount \NC \type {names} \NC
+ Returns the size if a list (array).
+ \NC \NR
+\NC getmaxparametercount \NC \type {names} \NC
+ Returns the size if a list (array) but descends into lists to find the largest size
+ of a sublist.
+ \NC \NR
+\ML
+\NC getparameterpath \NC \type {names string boolean} \NC
+ Returns the parameter as path. The optional string is one of \type {--},
+ \type {..} or \type {...} and the also optional boolean will force a closed
+ path.
+ \NC \NR
+\NC getparameterpen \NC \type {names} \NC
+ Returns the parameter as pen (path).
+ \NC \NR
+\NC getparametertext \NC \type {names boolean} \NC
+ Returns the parameter as string. The boolean can be used to force prepending
+ a so called \type {\strut}.
+ \NC \NR
+\ML
+\NC pushparameters \NC \type {category} \NC
+ Pushed the given (sub) category onto the stack so that we don't need to give
+ the category each time.
+ \NC \NR
+\NC popparameters \NC \NC
+ Pops the current (sub) category from the stack.
+ \NC \NR
+\LL
+\stoptabulate
+
+Most commands accept a list of strings separated by one or more spaces, The
+resolved will then stepwise descend into the parameter tree. This means that a
+parameter itself can refer to a list. When a value is an array and the last name
+is a number, the value at the given index will be returned.
+
+\starttyping
+"category" "name" ... "name"
+"category" "name" ... number
+\stoptyping
+
+The \type {category} is not used when we have pushed a (sub) category which can
+save you some typing and also is more efficient. Of course than can mean that you
+need to store values at a higher level when you need them at a deeper level.
+
+There are quite some extra helpers that relate to this mechanism, at the
+\METAPOST\ end as well as at the \LUA\ end. They aim for instance at efficiently
+dealing with paths and can be seen at work in the mentioned module.
+
+There is one thing you should notice. While \METAPOST\ has numeric, string,
+boolean and path variables that can be conveniently be passed to and from \LUA,
+communicating colors is a bit of a hassle. This is because \RGB\ and \CMYK\
+colors and gray scales use different types. For this reason it is strongly
+recommended to use strings that refer to predefined colors instead. This also
+enforces consistency with the \TEX\ end. As convenience you can define colors at
+the \METAFUN\ end.
+
+\startbuffer
+\startMPcode
+ definecolor [ name = "MyColor", r = .5, g = .25, b = .25 ]
+
+ fill fullsquare xyscaled (TextWidth,5mm) withcolor "MyColor" ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-introduction.tex
new file mode 100644
index 00000000000..6892b21ce84
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-introduction.tex
@@ -0,0 +1,88 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-introduction
+
+\startchapter[title={Introduction}]
+
+For quite a while, around since 1996, the integration of \METAPOST\ into
+\CONTEXT\ became sort of mature but, it took decades of stepwise refinement to
+reach the state that we're in now. In this manual I will discuss some of the
+features that became possible by combining \LUA\ and \METAPOST. We already had
+quite a bit of that for a decade but in 2018, when \LUAMETATEX\ showed up a next
+stage was started.
+
+Before we go into details it is good to summarize the steps that were involved in
+integrating \METAPOST\ and \TEX\ in \CONTEXT. It indicates a bit what we had and
+have to deal with which in turn lead to the interfaces we now have.
+
+Originally, \TEX\ had no graphic capabilities: it just needed to know dimensions
+of the graphics and pass some basic information about what to include to the
+\DVI\ post processor. So, a \METAPOST\ graphic was normally processed outside the
+current run, resulting in \POSTSCRIPT\ graphic, that then had to be included. In
+\PDFTEX\ there were some more built in options, and therefore the \METAPOST\ code
+could be processed runtime using some (generic) \TEX\ macros that I wrote.
+However, that engine still had to launch \METAPOST\ for each graphic, although we
+could accumulate them and do that between runs. Immediate processing means that
+we immediately know the dimensions, while a collective run is faster. In \LUATEX\
+this all changed to very fast runtime processing, made possible because the
+\METAPOST\ library is embedded in the engine, a decision that we made early in
+the project and never regret.
+
+With \PDFTEX\ the process was managed by the \type {texexec} \CONTEXT\ runner but
+with \LUATEX\ it stayed under the control of the current run. In the case of
+\PDFTEX\ the actual embedding was done by \TEX\ macros that interpreted the
+(relatively simple) \POSTSCRIPT\ code and turned it into \PDF\ literals. In
+\LUATEX\ that job was delegated to \LUA.
+
+When using \PDFTEX\ with independent \METAPOST\ runs support for special color
+spaces, transparency, embedded graphics, outline text, shading and more was
+implemented using specials and special colors where the color served as reference
+to some special extension. This works quite well. In \LUATEX\ the pre- and
+postscript features, which are properties of picture objects, are used.
+
+In all cases, some information about the current run, for instance layout related
+information, or color information, has to be passed to the rather isolated
+\METAPOST\ run. In the case if \LUATEX\ (and \MKIV) the advantage is that
+processing optional text happens in the same process so there we don't need to
+pass information about for instance the current font setup.
+
+In \LUATEX\ the \METAPOST\ library has a \type {runscript} feature, which will
+call \LUA\ with the given code. This permitted a better integration: we could now
+ask for specific information (to the \TEX\ end) instead of passing it from the
+\TEX\ end with each run. In \LUAMETATEX\ another feature was added: access to the
+scanners from the \LUA\ end. Although we could already fetch some variables when
+in \LUA\ this made it possible to extend the \METAPOST\ language in ways not
+possible before.
+
+Already for a while Alan Braslau and I were working on some new \METAFUN\ code
+that exploits all these new features. When the scanners came available I sat down
+and started working on new interfaces and in this manual I will discuss some of
+these. Some of them are illustrative, others are probably rather useful. The core
+of what we could call \LUAMETAFUN\ (or \METAFUN\ XL when we use the file
+extension as indicator) is a key|-|value interface as we have at the \TEX\ end.
+This interface relates to \CONTEXT\ \LMTX\ development and therefore related
+files have a different suffix: \type {mpxl}. However, keep in mind that some are
+just wrappers around regular \METAPOST\ code so you have the full power of
+traditional \METAPOST\ at hand.
+
+We can never satisfy all needs, so to some extent this manual also demonstrates
+how to roll out your own code, but for that you also need to peek into the
+\METAFUN\ source code too. It will take a while for this manual to complete. I
+also expect other users to come up with solutions, so maybe in the end we will
+have a collection of modules for specific tasks.
+
+\startlines
+Hans Hagen
+Hasselt NL
+August 2019 (and beyond)
+\stoplines
+
+\stopchapter
+
+\stopcomponent
+
+% I started writing this in 2019, a few days after seeing Wende live in Zeist (
+% (YT: WENDE - # MENS), one of the best shows of that year, a clear reminder of
+% timeless versatility.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-mesh-examples.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-mesh-examples.tex
new file mode 100644
index 00000000000..87f6d105fbe
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-mesh-examples.tex
@@ -0,0 +1,161 @@
+\startbuffer[1]
+\startuseMPgraphic{MyPath1}
+ fill OverlayBox withcolor "darkyellow" ;
+ save p ; path p[] ;
+ p1 := unitsquare xysized( OverlayWidth/4, OverlayHeight/4) ;
+ p2 := unitsquare xysized(2OverlayWidth/4,3OverlayHeight/5) shifted ( OverlayWidth/4,0) ;
+ p3 := unitsquare xysized( OverlayWidth/4, OverlayHeight ) shifted (3OverlayWidth/4,0) ;
+ fill p1 withcolor "darkred" ;
+ fill p2 withcolor "darkblue" ;
+ fill p3 withcolor "darkgreen" ;
+ draw lmt_mesh [ paths = { p1, p2, p3 } ] ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\stopbuffer
+
+\startbuffer[2]
+\startuseMPgraphic{MyPath2}
+ save q ; path q ; q := unitcircle xysized(OverlayWidth,OverlayHeight) ;
+ save p ; path p ; p := for i=1 upto length(q) :
+ (center q) -- (point (i-1) of q) -- (point i of q) -- (center q) --
+ endfor cycle ;
+ fill q withcolor "darkgray" ;
+ draw lmt_mesh [
+ trace = true,
+ paths = { p }
+ ] withcolor "darkred" ;
+
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\stopbuffer
+
+\startbuffer[3]
+\startuseMPgraphic{MyPath3}
+ save q ; path q ; q := unitcircle xysized(OverlayWidth,OverlayHeight) randomized 3mm ;
+ fill q withcolor "darkgray" ;
+ draw lmt_mesh [
+ trace = true,
+ paths = { meshed(q,OverlayBox,.05) }
+ ] withcolor "darkgreen" ;
+ % draw OverlayMesh(q,.025) withcolor "darkgreen" ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\stopbuffer
+
+\startbuffer[4]
+\startuseMPgraphic{MyPath4}
+ save q ; path q ; q := unitcircle xysized(OverlayWidth,OverlayHeight) randomized 3mm ;
+ fill q withcolor "darkgray" ;
+ draw lmt_mesh [
+ trace = true,
+ auto = true,
+ step = 0.0125,
+ paths = { q }
+ ] withcolor "darkyellow" ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\stopbuffer
+
+\startbuffer[5]
+\startuseMPgraphic{MyPath5}
+ save q ; path q ; q := unitdiamond xysized(OverlayWidth,OverlayHeight) randomized 2mm ;
+ q := q shifted - center q shifted center OverlayBox ;
+ fill q withcolor "darkgray" ;
+ draw lmt_mesh [
+ trace = true,
+ auto = true,
+ step = 0.0125,
+ paths = { q }
+ ] withcolor "darkmagenta" ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\stopbuffer
+
+\startbuffer[6]
+\startuseMPgraphic{MyPath6}
+ save p ; path p[] ;
+ p1 := p2 := fullcircle xysized(2OverlayWidth/5,2OverlayHeight/3) ;
+ p1 := p1 shifted - center p1 shifted center OverlayBox shifted (-1OverlayWidth/4,0) ;
+ p2 := p2 shifted - center p2 shifted center OverlayBox shifted ( 1OverlayWidth/4,0) ;
+ fill p1 withcolor "middlegray" ;
+ fill p2 withcolor "middlegray" ;
+ draw lmt_mesh [
+ trace = true,
+ auto = true,
+ step = 0.02,
+ paths = { p1, p2 }
+ ] withcolor "darkcyan" ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\stopbuffer
+
+\startbuffer[7]
+\startuseMPgraphic{MyPath7}
+ save p ; path p[] ;
+ p1 := p2 := fullcircle xysized(2OverlayWidth/5,2OverlayHeight/3) rotated 45 ;
+ p1 := p1 shifted - center p1 shifted center OverlayBox shifted (-1OverlayWidth/4,0) ;
+ p2 := p2 shifted - center p2 shifted center OverlayBox shifted ( 1OverlayWidth/4,0) ;
+ fill p1 withcolor "middlegray" ;
+ fill p2 withcolor "middlegray" ;
+ draw lmt_mesh [
+ trace = true,
+ auto = true,
+ step = 0.01,
+ box = OverlayBox enlarged -5mm,
+ paths = { p1, p2 }
+ ] withcolor "darkcyan" ;
+ draw OverlayBox enlarged -5mm withcolor "darkgray" ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\stopbuffer
+
+\continueifinputfile {luametafun-mesh-examples.tex}
+
+\setupbodyfont[dejavu]
+
+\setupinteraction
+ [state=start,
+ color=white,
+ contrastcolor=white]
+
+\starttext
+
+ \getbuffer[1,2,3,4,5,6,7]
+
+ \defineoverlay[MyPath1][\useMPgraphic{MyPath1}]
+ \defineoverlay[MyPath2][\useMPgraphic{MyPath2}]
+ \defineoverlay[MyPath3][\useMPgraphic{MyPath3}]
+ \defineoverlay[MyPath4][\useMPgraphic{MyPath4}]
+ \defineoverlay[MyPath5][\useMPgraphic{MyPath5}]
+ \defineoverlay[MyPath6][\useMPgraphic{MyPath6}]
+ \defineoverlay[MyPath7][\useMPgraphic{MyPath7}]
+
+ \startTEXpage
+ \button[height=3cm,width=4cm,background=MyPath1,frame=off]{Example 1}[realpage(2)]
+ \stopTEXpage
+
+ \startTEXpage
+ \button[height=3cm,width=4cm,background=MyPath2,frame=off]{Example 2}[realpage(3)]
+ \stopTEXpage
+
+ \startTEXpage
+ \button[height=3cm,width=4cm,background=MyPath3,frame=off]{Example 3}[realpage(4)]
+ \stopTEXpage
+
+ \startTEXpage
+ \button[height=3cm,width=4cm,background=MyPath4,frame=off]{Example 4}[realpage(5)]
+ \stopTEXpage
+
+ \startTEXpage
+ \button[height=3cm,width=4cm,background=MyPath5,frame=off]{Example 5}[realpage(6)]
+ \stopTEXpage
+
+ \startTEXpage
+ \button[height=3cm,width=4cm,background=MyPath6,frame=off]{Example 6}[realpage(7)]
+ \stopTEXpage
+
+ \startTEXpage
+ \button[height=3cm,width=4cm,background=MyPath7,frame=off]{Example 7}[realpage(1)]
+ \stopTEXpage
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-mesh.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-mesh.tex
new file mode 100644
index 00000000000..2fdb3125051
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-mesh.tex
@@ -0,0 +1,78 @@
+% language=us
+
+\environment luametafun-style
+\environment luametafun-mesh-examples
+
+\startcomponent luametafun-mesh
+
+\startchapter[title={Mesh}]
+
+This is more a gimmick than of real practical use. A mesh is a set of paths that
+gets transformed into hyperlinks. So, as a start you need to enable these:
+
+\starttyping[option=TEX]
+\setupinteraction
+ [state=start,
+ color=white,
+ contrastcolor=white]
+\stoptyping
+
+We just give a bunch of examples of meshes. A path is divided in smaller paths and
+each of them is part of the same hyperlink. An application is for instance clickable
+maps but (so far) only Acrobat supports such paths.
+
+\typebuffer[1][option=TEX]
+
+Such a definition is used as follows. First we define the mesh as overlay:
+
+\starttyping[option=TEX]
+\defineoverlay[MyPath1][\useMPgraphic{MyPath1}]
+\stoptyping
+
+Then, later on, this overlay can be used as background for a button. Here we just
+jump to another page. The rendering is shown in \in {figure} [mesh:1].
+
+\starttyping[option=TEX]
+\button
+ [height=3cm,
+ width=4cm,
+ background=MyPath1,
+ frame=off]
+ {Example 1}
+ [realpage(2)]
+\stoptyping
+
+\startplacefigure[reference=mesh:1]
+ \externalfigure[luametafun-mesh-examples][page=1,width=.45\textwidth]
+\stopplacefigure
+
+More interesting are non|-|rectangular shapes so we show a bunch of them. You can
+pass multiple paths, influence the accuracy by setting the number of steps and show
+the mesh with the tracing option.
+
+\typebuffer[2][option=TEX]
+\typebuffer[3][option=TEX]
+\typebuffer[4][option=TEX]
+\typebuffer[5][option=TEX]
+\typebuffer[6][option=TEX]
+\typebuffer[7][option=TEX]
+
+This is typical a feature that, if used at all, needs some experimenting but at
+least the traced images look interesting enough. The six examples are shown in
+\in {figure} [mesh:2].
+
+\startplacefigure[reference=mesh:2]
+ \startcombination[2*3]
+ {\externalfigure[luametafun-mesh-examples][page=2,width=.45\textwidth]} {\type {MyPath2}}
+ {\externalfigure[luametafun-mesh-examples][page=3,width=.45\textwidth]} {\type {MyPath3}}
+ {\externalfigure[luametafun-mesh-examples][page=4,width=.45\textwidth]} {\type {MyPath4}}
+ {\externalfigure[luametafun-mesh-examples][page=5,width=.45\textwidth]} {\type {MyPath5}}
+ {\externalfigure[luametafun-mesh-examples][page=6,width=.45\textwidth]} {\type {MyPath6}}
+ {\externalfigure[luametafun-mesh-examples][page=7,width=.45\textwidth]} {\type {MyPath7}}
+ \stopcombination
+\stopplacefigure
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-outline.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-outline.tex
new file mode 100644
index 00000000000..e2cdb422667
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-outline.tex
@@ -0,0 +1,188 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-outline
+
+\startchapter[title={Outline}]
+
+In a regular text you can have outline characters by setting a (pseudo) font
+feature but sometimes you want to play a bit more with this. In \METAFUN\ we
+always had that option. In \MKII\ we call \type {pstoedit} to turn text into
+outlines, in \MKIV\ we do that by manipulating the shapes directly. And, as with
+some other extensions, in \LMTX\ a new interface has been added, but the
+underlying code is the same as in \MKIV.
+
+\startbuffer[1a]
+\startMPcode{doublefun}
+ draw lmt_outline [
+ text = "hello"
+ kind = "draw",
+ drawcolor = "darkblue",
+ ] xsized .45TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[1b]
+\startMPcode{doublefun}
+ draw lmt_outline [
+ text = "hello",
+ kind = "both",
+ fillcolor = "middlegray",
+ drawcolor = "darkgreen",
+ rulethickness = 1/5,
+ ] xsized .45TextWidth ;
+\stopMPcode
+\stopbuffer
+
+In \in {figure} [outline:1] we see two examples:
+
+\typebuffer[1a][option=TEX]
+
+and
+
+\typebuffer[1b][option=TEX]
+
+\startplacefigure[reference=outline:1,title={Drawing and|/|or filling an outline.}]
+ \startcombination
+ {\getbuffer[1a]} {\type {kind=draw}}
+ {\getbuffer[1b]} {\type {kind=both}}
+ \stopcombination
+\stopplacefigure
+
+Normally the fill ends up below the draw but we can reverse the order, as in
+\in {figure} [outline:2], where we coded the leftmost example as:
+
+\startbuffer[2a]
+\startMPcode{doublefun}
+ draw lmt_outline [
+ text = "hello",
+ kind = "reverse",
+ fillcolor = "darkred",
+ drawcolor = "darkblue",
+ rulethickness = 1/2,
+ ] xsized .45TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[2b]
+\startMPcode{doublefun}
+ draw lmt_outline [
+ text = "hello",
+ kind = "both",
+ fillcolor = "darkred",
+ drawcolor = "darkblue",
+ rulethickness = 1/2,
+ ] xsized .45TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[2a][option=TEX]
+
+\startplacefigure[reference=outline:2,title={Reversing the order of drawing and filling.}]
+ \startcombination
+ {\getbuffer[2a]} {\type {kind=reverse}}
+ {\getbuffer[2b]} {\type {kind=both}}
+ \stopcombination
+\stopplacefigure
+
+It is possible to fill and draw in one operation, in which case the same color is
+used for both, see \in {figure} [outline:3] for an example fo this. This is a low
+level optimization where the shape is only output once.
+
+\startbuffer[3a]
+\startMPcode{doublefun}
+ draw lmt_outline [
+ text = "hello",
+ kind = "fillup",
+ fillcolor = "darkgreen",
+ rulethickness = 1/5,
+ ] xsized .45TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[3b]
+\startMPcode{doublefun}
+ draw lmt_outline [
+ text = "hello",
+ kind = "fill",
+ fillcolor = "darkgreen",
+ rulethickness = 1/5,
+ ] xsized .45TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startplacefigure[reference=outline:3,title={Combining a fill with a draw in the same color.}]
+ \startcombination
+ {\getbuffer[3a]} {\type {kind=fillup}}
+ {\getbuffer[3b]} {\type {kind=fill}}
+ \stopcombination
+\stopplacefigure
+
+
+This interface is much nicer than the one where each variant (the parameter \type
+{kind} above) had its own macro due to the need to group properties of the
+outline and fill. Let's show some more:
+
+\startbuffer[4]
+\startMPcode{doublefun}
+ draw lmt_outline [
+ text = "\obeydiscretionaries\samplefile{tufte}",
+ align = "normal",
+ kind = "draw",
+ drawcolor = "darkblue",
+ ] xsized TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[4][option=TEX]
+
+In this case we feed the text into the \type {\framed} macro so that we get a
+properly aligned paragraph of text, as demonstrated in \in {figure} [outline:4]
+\in {and} [outline:5]. If you want more trickery you can of course use any
+\CONTEXT\ command (including \type {\framed} with all kind of options) in the
+text.
+
+\startplacefigure[reference=outline:4,title={Outlining a paragraph of text.}]
+ \getbuffer[4]
+\stopplacefigure
+
+\startbuffer[5]
+\startMPcode{doublefun}
+ draw lmt_outline [
+ text = "\obeydiscretionaries\samplefile{ward}",
+ align = "normal,tolerant",
+ style = "bold",
+ width = 10cm,
+ kind = "draw",
+ drawcolor = "darkblue",
+ ] xsized TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[5][option=TEX]
+
+\startplacefigure[reference=outline:4,title={Outlining a paragraph of text with a specific width.}]
+ \getbuffer[5]
+\stopplacefigure
+
+We summarize the parameters:
+
+\starttabulate[|T|T|T|p|]
+\FL
+\BC name \BC type \BC default \BC comment \NC \NR
+\ML
+\NC text \NC string \NC \NC \NC \NR
+\NC kind \NC string \NC draw \NC One of \type {draw}, \type {fill}, \type {both}, \type {reverse} and \type {fillup}. \NC \NR
+\NC fillcolor \NC string \NC \NC \NC \NR
+\NC drawcolor \NC string \NC \NC \NC \NR
+\NC rulethickness \NC numeric \NC 1/10 \NC \NC \NR
+\NC align \NC string \NC \NC \NC \NR
+\NC style \NC string \NC \NC \NC \NR
+\NC width \NC numeric \NC \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-placeholder.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-placeholder.tex
new file mode 100644
index 00000000000..3627bbfd04f
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-placeholder.tex
@@ -0,0 +1,163 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-placeholder
+
+\startchapter[title={Placeholder}]
+
+Placeholders are an old \CONTEXT\ features and have been around since we started using
+\METAPOST. They are used as dummy figure, just in case one is not (yet) present. They
+are normally activated by loading a \METAFUN\ library:
+
+\starttyping[option=TEX]
+\useMPLibrary[dum]
+\stoptyping
+
+Just because it could be done conveniently, placeholders are now defined at the
+\METAPOST\ end instead of as useable \METAPOST\ graphic at the \TEX\ end. The
+variants and options are demonstrated using side floats.
+
+\startbuffer[1]
+\startMPcode
+ lmt_placeholder [
+ width = 4cm,
+ height = 3cm,
+ color = "red",
+ alternative = "circle".
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\startplacefigure[location=left]
+ \getbuffer[1]
+\stopplacefigure
+
+\typebuffer[1][option=TEX]
+
+In addition to the traditional random circle we now also provide rectangles
+and triangles. Maybe some day more variants will show up.
+
+\startbuffer[2]
+\startMPcode
+ lmt_placeholder [
+ width = 4cm,
+ height = 3cm,
+ color = "green",
+ alternative = "square".
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\startplacefigure[location=left]
+ \getbuffer[2]
+\stopplacefigure
+
+\typebuffer[2][option=TEX]
+
+Here we set the colors but in the image placeholder mechanism we cycle through
+colors automatically. Here we use primary, rather dark, colors.
+
+\startbuffer[3]
+\startMPcode
+ lmt_placeholder [
+ width = 4cm,
+ height = 3cm,
+ color = "blue",
+ alternative = "triangle".
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\startplacefigure[location=left]
+ \getbuffer[3]
+\stopplacefigure
+
+\typebuffer[3][option=TEX]
+
+\startbuffer[4a]
+\startMPcode
+ lmt_placeholder [
+ width = 4cm,
+ height = 3cm,
+ color = "yellow",
+ alternative = "circle".
+ reduction = 0,
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[4b]
+\startMPcode
+ lmt_placeholder [
+ width = 4cm,
+ height = 3cm,
+ color = "yellow",
+ alternative = "circle".
+ reduction = 0.25,
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[4c]
+\startMPcode
+ lmt_placeholder [
+ width = 4cm,
+ height = 3cm,
+ color = "yellow",
+ alternative = "circle".
+ reduction = 0.50,
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\startbuffer[4d]
+\startMPcode
+ lmt_placeholder [
+ width = 4cm,
+ height = 3cm,
+ color = "yellow",
+ alternative = "circle".
+ reduction = 0.75,
+ ] ;
+\stopMPcode
+\stopbuffer
+
+If you want less dark colors, the \type {reduction} parameter can be used to
+interpolate between the given color and white; its value is therefore a value
+between zero (default) and 1 (rather pointless as it produces white).
+
+\startplacefigure[location=left]
+ \startcombination[2*2]
+ {\getbuffer[4a]} {0}
+ {\getbuffer[4b]} {0.25}
+ {\getbuffer[4c]} {0.50}
+ {\getbuffer[4d]} {0.75}
+ \stopcombination
+\stopplacefigure
+
+We demonstrate this with four variants, all circles. Of course you can also use
+lighter colors, but this option was needed for the image placeholders anyway.
+
+\typebuffer[4b][option=TEX]
+
+\flushsidefloats
+
+There are only a few possible parameters. As you can see, proper dimensions need
+to be given because the defaults are pretty small.
+
+\starttabulate[|T|T|T|p|]
+\FL
+\BC name \BC type \BC default \BC comment \NC \NR
+\ML
+\NC color \NC string \NC red \NC \NC \NR
+\NC width \NC numeric \NC 1 \NC \NC \NR
+\NC height \NC numeric \NC 1 \NC \NC \NR
+\NC reduction \NC numeric \NC 0 \NC \NC \NR
+\NC alternative \NC string \NC circle \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-shade.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-shade.tex
new file mode 100644
index 00000000000..a139be95460
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-shade.tex
@@ -0,0 +1,230 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-shade
+
+\startchapter[title={Shade}]
+
+{\em This interface is still experimental!}
+
+Shading is complex. We go from one color to another on a continuum either linear
+or circular. We have to make sure that we cover the whole shape and that means
+that we have to guess a little, although one can influence this with parameters.
+It can involve a bit of trial and error, which is more complex that using a
+graphical user interface but this is the price we pay. It goes like this:
+
+\startbuffer[1]
+\startMPcode
+definecolor [ name = "MyColor3", r = 0.22, g = 0.44, b = 0.66 ] ;
+definecolor [ name = "MyColor4", r = 0.66, g = 0.44, b = 0.22 ] ;
+
+draw lmt_shade [
+ path = fullcircle scaled 4cm,
+ direction = "right",
+ domain = { 0, 2 },
+ colors = { "MyColor3", "MyColor4" },
+] ;
+
+draw lmt_shade [
+ path = fullcircle scaled 3cm,
+ direction = "left",
+ domain = { 0, 2 },
+ colors = { "MyColor3", "MyColor4" },
+] shifted (45mm,0) ;
+
+draw lmt_shade [
+ path = fullcircle scaled 5cm,
+ direction = "up",
+ domain = { 0, 2 },
+ colors = { "MyColor3", "MyColor4" },
+] shifted (95mm,0) ;
+
+draw lmt_shade [
+ path = fullcircle scaled 1cm,
+ direction = "down",
+ domain = { 0, 2 },
+ colors = { "MyColor3", "MyColor4" },
+] shifted (135mm,0) ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[1][option=TEX]
+
+Normally this is good enough as demonstrated in \in {figure} [shade:1] because
+we use shades as backgrounds. In the case of a circular shade we need to tweak
+the domain because guessing doesn't work well.
+
+\startplacefigure[reference=shade:1,title={Simple circular shades.}]
+ \getbuffer[1]
+\stopplacefigure
+
+\startbuffer[2]
+\startMPcode
+draw lmt_shade [
+ path = fullsquare scaled 4cm,
+ alternative = "linear",
+ direction = "right",
+ colors = { "MyColor3", "MyColor4" },
+] ;
+
+draw lmt_shade [
+ path = fullsquare scaled 3cm,
+ direction = "left",
+ alternative = "linear",
+ colors = { "MyColor3", "MyColor4" },
+] shifted (45mm,0) ;
+
+draw lmt_shade [
+ path = fullsquare scaled 5cm,
+ direction = "up",
+ alternative = "linear",
+ colors = { "MyColor3", "MyColor4" },
+] shifted (95mm,0) ;
+
+draw lmt_shade [
+ path = fullsquare scaled 1cm,
+ direction = "down",
+ alternative = "linear",
+ colors = { "MyColor3", "MyColor4" },
+] shifted (135mm,0) ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[2][option=TEX]
+
+\startplacefigure[reference=shade:2,title={Simple rectangular shades.}]
+ \getbuffer[2]
+\stopplacefigure
+
+The \type {direction} relates to the boundingbox. Instead of a keyword you can
+also give two values, indicating points on the boundingbox. Because a boundingbox
+has four points, the \type {up} direction is equivalent to \type {{0.5,2.5}}.
+
+The parameters \type {center}, \type {factor}, \type {vector} and \type {domain}
+are a bit confusing but at some point the way they were implemented made sense,
+so we keep them as they are. The center moves the center of the path that is used
+as anchor for one color proportionally to the bounding box: the given factor is
+multiplied by half the width and height.
+
+\startbuffer[3]
+\startMPcode
+draw lmt_shade [
+ path = fullcircle scaled 5cm,
+ domain = { .2, 1.6 },
+ center = { 1/10, 1/10 },
+ direction = "right",
+ colors = { "MyColor3", "MyColor4" },
+ trace = true,
+] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[3][option=TEX]
+
+\startplacefigure[reference=shade:3,title={Moving the centers.}]
+ \getbuffer[3]
+\stopplacefigure
+
+A vector takes the given points on the path as centers for the colors, see \in
+{figure} [shade:4].
+
+\startbuffer[4]
+\startMPcode
+draw lmt_shade [
+ path = fullcircle scaled 5cm,
+ domain = { .2, 1.6 },
+ vector = { 2, 4 },
+ direction = "right",
+ colors = { "MyColor3", "MyColor4" },
+ trace = true,
+] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[4][option=TEX]
+
+\startplacefigure[reference=shade:4,title={Using a vector (points).}]
+ \getbuffer[4]
+\stopplacefigure
+
+Messing with the radius in combination with the previously mentioned domain
+is really trial and error, as seen in \in {figure} [shade:5].
+
+\startbuffer[5]
+\startMPcode
+draw lmt_shade [
+ path = fullcircle scaled 5cm,
+ domain = { 0.5, 2.5 },
+ radius = { 2cm, 6cm },
+ direction = "right",
+ colors = { "MyColor3", "MyColor4" },
+ trace = true,
+] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[5][option=TEX]
+
+\startplacefigure[reference=shade:5,title={Tweaking the radius.}]
+ \getbuffer[5]
+\stopplacefigure
+
+But actually the radius used alone works quite well as shown in \in {figure}
+[shade:6].
+
+\startbuffer[6]
+\startMPcode
+draw lmt_shade [
+ path = fullcircle scaled 5cm,
+ colors = { "red", "green" },
+ trace = true,
+] ;
+
+draw lmt_shade [
+ path = fullcircle scaled 5cm,
+ colors = { "red", "green" },
+ radius = 2.5cm,
+ trace = true,
+] shifted (6cm,0) ;
+
+draw lmt_shade [
+ path = fullcircle scaled 5cm,
+ colors = { "red", "green" },
+ radius = 2.0cm,
+ trace = true,
+] shifted (12cm,0) ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[6][option=TEX]
+
+\startplacefigure[reference=shade:6,title={Just using the radius.}]
+ \getbuffer[6]
+\stopplacefigure
+
+\starttabulate[|T|T|T|p|]
+\FL
+\BC name \BC type \BC default \BC comment \NC \NR
+\ML
+\NC alternative \NC string \NC circular \NC or \type {linear} \NC \NR
+\NC path \NC path \NC \NC \NC \NR
+\NC trace \NC boolean \NC false \NC \NC \NR
+\NC domain \NC set of numerics \NC \NC \NC \NR
+\NC radius \NC numeric \NC \NC \NC \NR
+\NC \NC set of numerics \NC \NC \NC \NR
+\NC factor \NC numeric \NC \NC \NC \NR
+\NC origin \NC pair \NC \NC \NC \NR
+\NC \NC set of pairs \NC \NC \NC \NR
+\NC vector \NC set of numerics \NC \NC \NC \NR
+\NC colors \NC set of strings \NC \NC \NC \NR
+\NC center \NC numeric \NC \NC \NC \NR
+\NC \NC set of numerics \NC \NC \NC \NR
+\NC direction \NC string \NC \NC \type{up}, \type {down}, \type {left}, \type {right} \NC \NR
+\NC \NC set of numerics \NC \NC two points on the boundingbox \NC \NR
+\LL
+\stoptabulate
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-style.tex
new file mode 100644
index 00000000000..63eb7e3755e
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-style.tex
@@ -0,0 +1,64 @@
+\startenvironment luametafun-style
+
+\usemodule[abbreviations-smallcaps]
+
+\usemodule[scite]
+
+\setupbodyfont
+ [ibmplex,rm,10pt]
+
+\setupwhitespace
+ [big]
+
+\setuplayout
+ [topspace=10mm,
+ bottomspace=1cm,
+ backspace=2cm,
+ footerdistance=10mm,
+ footer=1cm,
+ % headerdistance=10mm,
+ % header=1cm,
+ topspace=20mm,
+ headerdistance=0mm,
+ header=0cm,
+ height=middle,
+ width=middle]
+
+\setupalign
+ [verytolerant]
+
+\setupheadertexts
+ []
+
+\setupfootertexts
+ [chapter][pagenumber]
+
+\setuphead
+ [chapter]
+ [color=darkgray,
+ style=\bfd]
+
+\setuphead
+ [section]
+ [color=darkgray,
+ style=\bfc]
+
+\setupfooter
+ [color=darkgray,
+ style=\bf]
+
+\setuplist
+ [chapter]
+ [before=,
+ after=]
+
+% sectionblocks keep things local and we need these colors very late,
+% when we flush fonts
+
+\definecolor[KindergartenEqual] [darkgreen]
+\definecolor[KindergartenPlus] [darkred]
+\definecolor[KindergartenMinus] [darkred]
+\definecolor[KindergartenTimes] [darkblue]
+\definecolor[KindergartenDivided][darkblue]
+
+\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-surface.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-surface.tex
new file mode 100644
index 00000000000..0014fa7251d
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-surface.tex
@@ -0,0 +1,96 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-surface
+
+\startchapter[title={Surface}]
+
+This is work in progress so only some examples are shown here. Yet to be decided
+is how we deal with axis and such.
+
+In \in {figure} [surface:1] we see an example of a plot with axis as well as
+lines drawn.
+
+\startbuffer[1]
+\startMPcode{doublefun}
+ draw lmt_surface [
+ preamble = "local sin, cos = math.sin, math.cos",
+ code = "sin(x*x) - cos(y*y)"
+ xmin = -3,
+ xmax = 3,
+ ymin = -3,
+ ymax = 3,
+ xvector = { -0.3, -0.3 },
+ height = 5cm,
+ axis = { 40mm, 40mm, 30mm },
+ clipaxis = true,
+ axiscolor = "gray",
+ ] xsized .8TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[1]
+
+\startplacefigure[reference=surface:1]
+ \getbuffer[1]
+\stopplacefigure
+
+In \in {figure} [surface:2] we don't draw the axis and lines. We also use a high
+resolution.
+
+\startbuffer[2]
+\startMPcode{doublefun}
+ draw lmt_surface [
+ preamble = "local sin, cos = math.sin, math.cos",
+ code = "sin(x*x) - cos(y*y)"
+ color = "f, f/2, 1-f"
+ color = "f, f, 0"
+ xstep = .02,
+ ystep = .02,
+ xvector = { -0.4, -0.4 },
+ height = 5cm,
+ lines = false,
+ ] xsized .8TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[2]
+
+\startplacefigure[reference=surface:2]
+ \getbuffer[2]
+\stopplacefigure
+
+The preliminary set of parameters is:
+
+\starttabulate[|T|T|T|p|]
+\FL
+\BC name \BC type \BC default \BC comment \NC \NR
+\ML
+\NC code \NC string \NC
+\NC color \NC string \NC \type {"f, 0, 0"} \NC \NC \NR
+\NC linecolor \NC numeric \NC \type {1} \NC gray scale \NC \NR
+\NC xmin \NC numeric \NC \type {-1} \NC \NC \NR
+\NC xmax \NC numeric \NC \type { 1} \NC \NC \NR
+\NC ymin \NC numeric \NC \type {-1} \NC \NC \NR
+\NC ymax \NC numeric \NC \type { 1} \NC \NC \NR
+\NC xstep \NC numeric \NC \type {.1} \NC \NC \NR
+\NC ystep \NC numeric \NC \type {.1} \NC \NC \NR
+\NC snap \NC numeric \NC \type {.01} \NC \NC \NR
+\NC xvector \NC list \NC \type {{ -0.7, -0.7 }} \NC \NC \NR
+\NC yvector \NC list \NC \type {{ 1, 0 }} \NC \NC \NR
+\NC zvector \NC list \NC \type {{ 0, 1 }} \NC \NC \NR
+\NC light \NC list \NC \type {{ 3, 3, 10 }} \NC \NC \NR
+\NC bright \NC numeric \NC \type {100} \NC \NC \NR
+\NC clip \NC boolean \NC \type {false} \NC \NC \NR
+\NC lines \NC boolean \NC \type {true} \NC \NC \NR
+\NC axis \NC list \NC \type {{ }} \NC \NC \NR
+\NC clipaxis \NC boolean \NC \type {false} \NC \NC \NR
+\NC axiscolor \NC string \NC \type {"gray"} \NC \NC \NR
+\NC axislinewidth \NC numeric \NC \type {1/2} \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-svg.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-svg.tex
new file mode 100644
index 00000000000..069abc6a68b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-svg.tex
@@ -0,0 +1,75 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-svg
+
+\startchapter[title={SVG}]
+
+There is not that much to tell about this command. It translates an \SVG\ image
+to \METAPOST\ operators. We took a few images from a mozilla emoji font:
+
+\startbuffer[2]
+\startMPcode
+ draw lmt_svg [
+ filename = "mozilla-svg-002.svg",
+ height = 2cm,
+ width = 8cm,
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[2][option=TEX]
+
+\startlinecorrection
+ \getbuffer[2]
+\stoplinecorrection
+
+Because we get pictures, you can mess around with them:
+
+\startbuffer[1]
+\startMPcode
+ picture p ; p := lmt_svg [ filename = "mozilla-svg-001.svg" ] ;
+ numeric w ; w := bbwidth(p) ;
+ draw p ;
+ draw p xscaled -1 shifted (2.5*w,0);
+ draw p rotatedaround(center p,45) shifted (3.0*w,0) ;
+ draw image (
+ for i within p : if filled i :
+ draw pathpart i withcolor green ;
+ fi endfor ;
+ ) shifted (4.5*w,0);
+ draw image (
+ for i within p : if filled i :
+ fill pathpart i withcolor red withtransparency (1,.25) ;
+ fi endfor ;
+ ) shifted (6*w,0);
+\stopMPcode
+\stopbuffer
+
+\typebuffer[1][option=TEX]
+
+\startlinecorrection
+ \getbuffer[1]
+\stoplinecorrection
+
+Of course. often you won't know in advance what is inside the image and how (well)
+it has been defined so the previous example is more about showing some \METAPOST\
+muscle.
+
+The supported parameters are:
+
+\starttabulate[|T|T|T|p|]
+\FL
+\BC name \BC type \BC default \BC comment \NC \NR
+\ML
+\NC filename \NC path \NC \NC \NC \NR
+\NC width \NC numeric \NC \NC \NC \NR
+\NC height \NC numeric \NC \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-text.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-text.tex
new file mode 100644
index 00000000000..4f08ee00f8c
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-text.tex
@@ -0,0 +1,137 @@
+% language=us
+
+\environment luametafun-style
+
+\startcomponent luametafun-text
+
+\startchapter[title={Text}]
+
+The \METAFUN\ \type {textext} command normally can do the job of typesetting a
+text snippet quite well.
+
+\startbuffer
+\startMPcode
+ fill fullcircle xyscaled (8cm,1cm) withcolor "darkred" ;
+ draw textext("\bf This is text A") withcolor "white" ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+We get:
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+You can use regular \CONTEXT\ commands, so this is valid:
+
+\startbuffer
+\startMPcode
+ fill fullcircle xyscaled (8cm,1cm) withcolor "darkred" ;
+ draw textext("\framed{\bf This is text A}") withcolor "white" ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Of course you can as well draw a frame in \METAPOST\ but the \type {\framed}
+command has more options, like alignments.
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+Here is a variant using the \METAFUN\ interface:
+
+\startbuffer
+\startMPcode
+ fill fullcircle xyscaled (8cm,1cm) withcolor "darkred" ;
+ draw lmt_text [
+ text = "This is text A",
+ color = "white",
+ style = "bold"
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The outcome is more or less the same:
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+Here is another example. The \type {format} option is actually why this command
+is provided.
+
+\startbuffer
+\startMPcode
+ fill fullcircle xyscaled (8cm,1cm) withcolor "darkred" ;
+ draw lmt_text [
+ text = decimal 123.45678,
+ color = "white",
+ style = "bold",
+ format = "@0.3F",
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+The following parameters can be set:
+
+\starttabulate[|T|T|T|p|]
+\FL
+\BC name \BC type \BC default \BC comment \NC \NR
+\ML
+\NC offset \NC numeric \NC 0 \NC \NC \NR
+\NC strut \NC string \NC auto \NC adapts the dimensions to the font (\type {yes} uses the the default strut) \NC \NR
+\NC style \NC string \NC \NC \NC \NR
+\NC color \NC string \NC \NC \NC \NR
+\NC text \NC string \NC \NC \NC \NR
+\NC anchor \NC string \NC \NC one of these \type {lft}, \type {urt} like anchors \NC \NR
+\NC format \NC string \NC \NC a format specifier using \type {@} instead of a percent sign \NC \NR
+\NC position \NC pair \NC origin \NC \NC \NR
+\NC trace \NC boolean \NC false \NC \NC \NR
+\LL
+\stoptabulate
+
+The next example demonstrates the positioning options:
+
+\startbuffer
+\startMPcode
+ fill fullcircle xyscaled (8cm,1cm) withcolor "darkblue" ;
+ fill fullcircle scaled .5mm withcolor "white" ;
+ draw lmt_text [
+ text = "left",
+ color = "white",
+ style = "bold",
+ anchor = "lft",
+ position = (-1mm,2mm),
+ ] ;
+ draw lmt_text [
+ text = "right",
+ color = "white",
+ style = "bold",
+ anchor = "rt",
+ offset = 3mm,
+ ] ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-titlepage.tex
new file mode 100644
index 00000000000..4450199e653
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-titlepage.tex
@@ -0,0 +1,41 @@
+
+\environment luametafun-style
+
+\startcomponent luametafun-titlepage
+
+\startMPpage
+
+ fill Page withcolor "darkblue" ;
+
+ path p ; p := (0,0) -- (0,4) -- (2,2) -- (4,4) -- (4,0) ;
+
+ p := p scaled 20; p := p shifted - center p ;
+
+ draw image (
+ for i=1 upto 1000 :
+ draw p shifted (center Page randomized urcorner Page) ;
+ endfor ;
+ ) withcolor "darkgreen" ;
+
+ setbounds currentpicture to Page ;
+
+ draw
+ % textext.ulft("\ss luametafun")
+ textext.ulft("\ss metafun xl")
+ xsized .55bbwidth(Page)
+ shifted lrcorner Page
+ shifted (-15mm,35mm)
+ withcolor "white"
+ ;
+
+ draw
+ textext.ulft("\ss Hans Hagen")
+ xsized .3bbwidth(Page)
+ shifted lrcorner Page
+ shifted (-15mm,15mm)
+ withcolor "white"
+ ;
+
+\stopMPpage
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun.tex
new file mode 100644
index 00000000000..2dd917cdfcf
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun.tex
@@ -0,0 +1,34 @@
+\setupfootertexts[{\tttf uncorrected draft}]
+
+\environment luametafun-style
+
+\startcomponent luametafun
+
+ \component luametafun-titlepage
+
+ \startfrontmatter
+ \component luametafun-contents
+ \component luametafun-introduction
+ \stopfrontmatter
+
+ \startbodymatter
+ \component luametafun-text
+ % \component luametafun-grid
+ \component luametafun-axis
+ \component luametafun-outline
+ \component luametafun-followtext
+ \component luametafun-placeholder
+ \component luametafun-arrow
+ \component luametafun-shade
+ \component luametafun-contour
+ \component luametafun-surface
+ \component luametafun-mesh
+ \component luametafun-function
+ \component luametafun-chart
+ \component luametafun-svg
+ \component luametafun-fonts
+ \component luametafun-groups
+ \component luametafun-interface
+ \stopbodymatter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/mozilla-svg-001.svg b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/mozilla-svg-001.svg
new file mode 100644
index 00000000000..5e46d846759
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/mozilla-svg-001.svg
@@ -0,0 +1,72 @@
+<svg xmlns="http://www.w3.org/2000/svg">
+ <path fill="#d87512" d="M17.786 44.63c-.606.115-1.23.173-1.854.173-2.444 0-4.644-.864-6.04-2.375-.855-.92-1.394-2.147-1.517-3.47-.126-1.243.067-2.638.58-4.163.325-1.016.83-2.01 1.365-3.064.216-.426.437-.858.65-1.302.702-1.454 1.504-3.164 2.11-5.05.715-2.188.943-4.287.682-6.23-.267-2.102-.994-3.972-1.74-5.685a2.992 2.992 0 0 0-4.15-1.446c-.71.375-1.23 1-1.467 1.77a2.983 2.983 0 0 0 .218 2.292c.632 1.19 1.314 2.596 1.592 3.977.238 1.137.18 2.41-.184 3.897-.37 1.538-.976 3.143-1.522 4.518-.16.406-.33.816-.507 1.234-.507 1.215-1.032 2.47-1.364 3.838-.55 2.14-.666 4.152-.348 5.97.36 2.163 1.41 4.14 2.955 5.567 2.027 1.88 4.808 2.914 7.826 2.914 1.14 0 2.274-.146 3.375-.437l-.66-2.923"/>
+ <g fill="#bc600d">
+ <path d="M11.585 43.742s.387 1.248.104 3.05c0 0 2.045-.466 1.898-2.27 0 0-.815-.29-2-.78M9.19 41.484S8.98 42.94 7.93 44.43c0 0 2.103.42 2.774-1.265 0 0-.696-.66-1.515-1.68M8.398 37.21s-.926 1.432-3.23 2.322c0 0 1.514 2.303 3.53.904 0 0-.237-1.388-.3-3.226M12.964 15.833s-1.685.798-3.783 3.45c0 0 2.1 1.55 4.663 2.228 0 0 .285-3.093-.88-5.677M13.5 23.873s-2.988.544-5.57 2.794c0 0 1.615 1.708 3.583 2.62 0 0 1.678-3.39 1.987-5.414M10.32 31.73s-1.483 0-4.483.812c0 0-.01 2.873 2.94 2.823 0 0 .747-1.75 1.544-3.635"/>
+ </g>
+ <g fill="#d87512">
+ <path d="M53.33 39.37c0-4.484-35.622-4.484-35.622 0 0 10.16.05 10.25 17.81 10.25 17.762 0 17.812-.09 17.812-10.25"/>
+ <path d="M42.645 56.04c1.688 2.02 9.275.043 10.504-2.28 5.01-9.482-.006-13.58-.006-13.58l-10.5 1.313s-2.154 11.977 0 14.547"/>
+ </g>
+ <g fill="#bc600d">
+ <path d="M54.2 41.496s-.336 4.246-4.657 9.573c0 0 4.38-1.7 5.808-4.3 0 0 .448-3.02-1.15-5.274M55.08 48.69s-1.065 1.88-3.563 3.872c0 0 1.78-.03 2.576-.785 0 0 .77-1.41.987-3.086"/>
+ </g>
+ <path fill="#f29a2e" d="M35.484 60.38c1.87 2.23 8.547 2.09 10.574 0 2.904-2.995 2.78-16.656 2.904-23.314l-12.418-1.053s-3.444 21.52-1.06 24.367"/>
+ <g fill="#bc600d">
+ <path d="M48.21 53.53s-3.578-3.443-8.738-.013c0 0 5.754 2.455 7.365 5.672 0 0 1.126-2.245 1.373-5.66M48.775 46.06s-3.852-3.09-7.938 1.43c0 0 4.452-.47 7.632 3.635 0 0 .493-3.05.305-5.065"/>
+ </g>
+ <g fill="#3e4347">
+ <path d="M43.847 61.57l-.397-2.765 1.344 2.445zM40.41 61.996l.502-3.294.498 3.294zM36.713 61.3l1.317-2.26-.372 2.59z"/>
+ </g>
+ <path fill="#d87512" d="M28.388 56.04c-1.688 2.02-9.277.043-10.504-2.28-5.01-9.482.004-13.58.004-13.58l10.5 1.313s2.154 11.977 0 14.547"/>
+ <g fill="#bc600d">
+ <path d="M16.833 41.496s.336 4.246 4.657 9.573c0 0-4.38-1.7-5.807-4.3 0 0-.448-3.02 1.15-5.274M15.957 48.69s1.066 1.88 3.563 3.872c0 0-1.782-.03-2.576-.785 0 0-.772-1.41-.987-3.086"/>
+ </g>
+ <path fill="#f29a2e" d="M35.548 60.38c-1.87 2.23-8.548 2.09-10.575 0-2.904-2.995-2.78-16.656-2.904-23.314l12.417-1.053s3.446 21.52 1.06 24.367"/>
+ <g fill="#bc600d">
+ <path d="M22.822 53.53s3.58-3.443 8.74-.013c0 0-5.754 2.455-7.367 5.672 0 0-1.125-2.245-1.373-5.66M22.255 46.06s3.852-3.09 7.94 1.43c0 0-4.453-.47-7.633 3.635 0 0-.493-3.05-.307-5.065"/>
+ </g>
+ <g fill="#3e4347">
+ <path d="M26.24 61.25l1.345-2.445-.395 2.765zM29.62 61.996l.5-3.294.5 3.294zM33.375 61.63L33 59.04l1.32 2.26zM35.516 60.46c-.395-2.48-.482-4.96-.5-7.438.015-2.48.104-4.96.5-7.44.396 2.48.485 4.96.5 7.44-.018 2.48-.106 4.96-.5 7.438"/>
+ </g>
+ <path fill="#f29a2e" d="M27.777 6.994c0 3.82-2.727 6.987-6.086 6.915C11.83 13.7 15.893 2 15.893 2c3.36 0 11.885 1.176 11.885 4.994"/>
+ <path fill="#af5a31" d="M24.05 7.752c0 2.037-1.454 3.727-3.248 3.688-5.26-.11-3.093-6.353-3.093-6.353 1.792 0 6.34.628 6.34 2.665"/>
+ <path fill="#f29a2e" d="M43.26 6.994c0 3.82 2.726 6.987 6.086 6.915 9.86-.21 5.8-11.91 5.8-11.91C51.782 2 43.26 3.176 43.26 6.994"/>
+ <path fill="#af5a31" d="M46.983 7.752c0 2.037 1.455 3.727 3.247 3.688 5.26-.11 3.094-6.353 3.094-6.353-1.794 0-6.34.628-6.34 2.665"/>
+ <path fill="#f29a2e" d="M55.806 33.378c0 7.155-9.517 8.13-20.288 8.13-10.776 0-20.29-.975-20.29-8.13 0-29.96 11.596-29.14 20.29-29.14 8.69 0 20.288-.82 20.288 29.14"/>
+ <g fill="#3e4347">
+ <path d="M35.54 7.59c3.24 0 6.15 1.084 8.156 2.81-.77-2.945-4.135-5.16-8.173-5.16-4.06 0-7.442 2.238-8.186 5.204 2.01-1.753 4.938-2.855 8.204-2.855"/>
+ <path d="M35.535 11.193c2.217 0 4.21.744 5.584 1.925-.528-2.02-2.835-3.534-5.6-3.534-2.78 0-5.095 1.533-5.605 3.564 1.376-1.198 3.383-1.955 5.62-1.955"/>
+ </g>
+ <path fill="#ffe8bb" d="M29.553 43.727l-18.408-7.01 4.24-9.06s2.704 3.85 13.29 6.82l.878 9.243"/>
+ <path fill="#3e4347" d="M29.37 39.77c-7.462-1.27-16.325-6.673-16.48-6.75l.992-2.168c.184.092 8.806 5.342 15.853 6.544l-.366 2.374"/>
+ <path fill="#ffe8bb" d="M41.48 43.727l18.406-7.01-4.24-9.06s-2.704 3.85-13.29 6.82l-.876 9.243"/>
+ <path fill="#3e4347" d="M41.663 39.77c7.46-1.27 16.325-6.673 16.48-6.75l-.993-2.168c-.184.092-8.808 5.342-15.852 6.544l.365 2.374"/>
+ <g fill="#ffe8bb">
+ <path d="M43.524 45.57C38.752 42.023 41.4 33.86 41.4 33.86c-5.657 5.906-12.662 8.74-12.662 8.74 1.608 5.446 5.77 6.412 5.77 6.412-.34-1.835.663-3.302.663-3.302 1.68 2.22 5.03 2.986 5.03 2.986-1.287-1.508-.948-3.835-.948-3.835 2.326.875 4.27.71 4.27.71"/>
+ <path d="M42.29 42.97c-2.634 2.247-10.917 2.247-13.553 0-2.856-2.435-2.495-7.144.1-9.884 2.397-2.527 10.958-2.527 13.355 0 2.595 2.74 2.956 7.45.098 9.883"/>
+ </g>
+ <g fill="#3e4347">
+ <path d="M36.18 40.48a.69.69 0 0 1-.644-.477c-.227-.67-.77-3.293-.71-5.498.01-.398.325-.71.7-.698.38.01.674.343.663.74-.057 2.01.46 4.466.633 4.974.127.375-.06.786-.414.92a.607.607 0 0 1-.23.04"/>
+ <path d="M30.504 43.25c.21-.202.394-.408.582-.61.188-.204.378-.405.57-.604.385-.396.782-.78 1.2-1.145a14.125 14.125 0 0 1 2.745-1.9c.504-.263 1.032-.49 1.59-.654s1.153-.273 1.772-.253c.31.01.623.055.928.146.307.088.602.23.86.416.263.19.485.422.652.684.17.257.287.54.35.83a4.247 4.247 0 0 0-.677-.448 2.567 2.567 0 0 0-.68-.237c-.447-.088-.887-.04-1.33.06-.89.216-1.786.65-2.69 1.114-.905.466-1.818.983-2.776 1.466-.48.24-.97.473-1.48.682-.256.103-.517.202-.783.285-.27.078-.546.155-.833.167"/>
+ </g>
+ <path fill="#f15a61" d="M41.34 31.743c-1.17-.528-4.757-.57-5.83-.57-1.07 0-4.66.042-5.83.57-.832.376-.187 1.31 2.027 2.116 1.397.506 2.733.666 3.803.666 1.07 0 2.405-.16 3.805-.667 2.213-.808 2.856-1.74 2.025-2.117"/>
+ <g fill="#3e4347">
+ <path d="M29.917 23.48l1.61 5.292L26.954 26z"/>
+ <path d="M22.645 31.828c-.522 0-.932-.056-1.17-.098-2.986-.52-4.632-1.996-6.09-4.067l.185-2.472c1.52 1.446 3.953 3.76 6.28 4.167 1.156.2 2.853-.016 4.15-1.234 1.537-1.44 2.263-4.05 2.1-7.547l1.635.132c.2 4.312-.116 7.244-2.212 9.212-1.692 1.59-3.613 1.908-4.878 1.908M41.12 23.48l-1.613 5.292L44.08 26z"/>
+ <path d="M48.39 31.828c.52 0 .93-.056 1.167-.098 2.99-.52 4.637-1.996 6.09-4.067l-.182-2.472c-1.52 1.446-3.955 3.76-6.28 4.167-1.156.2-2.855-.016-4.154-1.234-1.532-1.44-2.258-4.05-2.095-7.547l-1.636.132c-.202 4.312.114 7.244 2.213 9.212 1.69 1.59 3.61 1.908 4.877 1.908"/>
+ </g>
+ <path fill="#ffe8bb" d="M30.25 22.09c-.852 5.282-3.728 5.87-6.696 5.577-2.986-.294-5.396-2.667-5.396-6.743 0-4.28 0-4.28 6.647-5.752 6.728-1.49 6 3.437 5.445 6.918"/>
+ <path fill="#3e4347" d="M29.16 22.547c-.244 2.534-2.61 4.357-5.287 4.072-2.674-.286-4.645-2.57-4.402-5.102s.28-2.75 5.108-2.237c4.83.514 4.824.737 4.582 3.267"/>
+ <path fill="#fff" d="M27.59 21.884c-.16 1.688-1.74 2.903-3.522 2.714-1.785-.19-3.096-1.712-2.936-3.4.163-1.69.186-1.835 3.406-1.493 3.22.344 3.215.49 3.053 2.18"/>
+ <g fill="#3e4347">
+ <ellipse cx="25.5" cy="21.08" rx="1.45" ry="1.647"/>
+ <path d="M31.27 17.896c.42 0 .807-.284.936-.728.16-.546-.133-1.122-.65-1.29l-5.98-1.924c-.516-.166-1.065.14-1.225.685-.155.543.136 1.12.652 1.287l5.98 1.924a.95.95 0 0 0 .288.046"/>
+ </g>
+ <path fill="#ffe8bb" d="M40.78 22.09c.855 5.282 3.73 5.87 6.7 5.577 2.984-.294 5.395-2.667 5.395-6.743 0-4.28-.002-4.28-6.646-5.752-6.73-1.49-6.01 3.437-5.45 6.918"/>
+ <path fill="#3e4347" d="M41.873 22.547c.243 2.534 2.61 4.357 5.287 4.072 2.674-.286 4.646-2.57 4.402-5.102-.242-2.533-.28-2.75-5.107-2.237-4.83.514-4.824.737-4.582 3.267"/>
+ <path fill="#fff" d="M43.44 21.884c.16 1.688 1.737 2.903 3.522 2.714 1.783-.19 3.098-1.712 2.936-3.4-.16-1.69-.188-1.835-3.404-1.493-3.22.344-3.217.49-3.054 2.18"/>
+ <g fill="#3e4347">
+ <ellipse cx="47.722" cy="20.932" rx="1.45" ry="1.647"/>
+ <path d="M39.76 17.896a.982.982 0 0 1-.935-.728c-.16-.546.132-1.122.65-1.29l5.98-1.924c.517-.166 1.063.14 1.224.685.155.543-.136 1.12-.653 1.287l-5.98 1.924a.96.96 0 0 1-.287.046"/>
+ </g>
+</svg>
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/mozilla-svg-002.svg b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/mozilla-svg-002.svg
new file mode 100644
index 00000000000..6d3126133e1
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/mozilla-svg-002.svg
@@ -0,0 +1,11 @@
+<svg id="glyph651" xmlns="http://www.w3.org/2000/svg">
+ <g fill="#42cde2">
+ <path d="
+ M18.06 50.947
+ l-4.45 3.732.136-9.223
+ a.623.623 0 0 0-.146-.408
+ L11.63 42.7a.62.62 0 0 0-.873-.077
+ l-8.54 7.165
+ a.62.62 0 0 0-.076.874l1.93 2.3a.62.62 0 0 0 .875.074l3.948-3.313-.058 9.45c-.002.147.05.29.144.403l1.845 2.2a.62.62 0 0 0 .874.075l9.102-7.64a.62.62 0 0 0 .077-.874l-1.946-2.318a.623.623 0 0 0-.874-.075M36.03 33.53l-6.464 3.732 2.23-11.648a.812.812 0 0 0-.095-.548l-1.97-3.412a.8.8 0 0 0-1.09-.293l-12.41 7.166a.798.798 0 0 0-.292 1.09l1.928 3.34a.798.798 0 0 0 1.09.293l5.74-3.314-2.184 11.95a.794.794 0 0 0 .093.544l1.846 3.197a.797.797 0 0 0 1.09.29l13.234-7.637a.796.796 0 0 0 .292-1.09l-1.945-3.37a.8.8 0 0 0-1.09-.29M59.33 16.792l-7.794 2.837 4.686-12.316a.894.894 0 0 0 .003-.618l-1.497-4.114a.885.885 0 0 0-1.135-.53L38.63 7.5a.886.886 0 0 0-.53 1.136l1.466 4.03a.884.884 0 0 0 1.136.53l6.92-2.52-4.695 12.658a.888.888 0 0 0-.003.612l1.402 3.854a.888.888 0 0 0 1.137.53l15.953-5.806a.887.887 0 0 0 .53-1.137l-1.48-4.06a.887.887 0 0 0-1.136-.532"/>
+ </g>
+</svg>
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-callbacks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-callbacks.tex
new file mode 100644
index 00000000000..e3e2a91e19a
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-callbacks.tex
@@ -0,0 +1,822 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-callbacks
+
+\startchapter[reference=callbacks,title={\LUA\ callbacks}]
+
+\startsection[title={Registering callbacks}][library=callback]
+
+\topicindex{callbacks}
+
+\libindex{register}
+\libindex{list}
+\libindex{find}
+\libindex{known}
+
+This library has functions that register, find and list callbacks. Callbacks are
+\LUA\ functions that are called in well defined places. There are two kind of
+callbacks: those that mix with existing functionality, and those that (when
+enabled) replace functionality. In mosty cases the second category is expected to
+behave similar to the built in functionality because in a next step specific
+data is expected. For instance, you can replace the hyphenation routine. The
+function gets a list that can be hyphenated (or not). The final list should be
+valid and is (normally) used for constructing a paragraph. Another function can
+replace the ligature builder and|/|or kerner. Doing something else is possible
+but in the end might not give the user the expected outcome.
+
+The first thing you need to do is registering a callback:
+
+\startfunctioncall
+id = callback.register(<string> callback_name, <function> func)
+id = callback.register(<string> callback_name, nil)
+id = callback.register(<string> callback_name, false)
+\stopfunctioncall
+
+Here the \syntax {callback_name} is a predefined callback name, see below. The
+function returns the internal \type {id} of the callback or \type {nil}, if the
+callback could not be registered.
+
+\LUATEX\ internalizes the callback function in such a way that it does not matter
+if you redefine a function accidentally.
+
+Callback assignments are always global. You can use the special value \type {nil}
+instead of a function for clearing the callback.
+
+For some minor speed gain, you can assign the boolean \type {false} to the
+non|-|file related callbacks, doing so will prevent \LUATEX\ from executing
+whatever it would execute by default (when no callback function is registered at
+all). Be warned: this may cause all sorts of grief unless you know \notabene
+{exactly} what you are doing!
+
+\startfunctioncall
+<table> info =
+ callback.list()
+\stopfunctioncall
+
+The keys in the table are the known callback names, the value is a boolean where
+\type {true} means that the callback is currently set (active).
+
+\startfunctioncall
+<function> f = callback.find(callback_name)
+\stopfunctioncall
+
+If the callback is not set, \type {find} returns \type {nil}. The \type {known}
+function can be used to check if a callback is supported.
+
+\startfunctioncall
+if callback.known("foo") then ... end
+\stopfunctioncall
+
+\stopsection
+
+\startsection[title={File related callbacks}][library=callback]
+
+The behaviour documented in this subsection is considered stable in the sense that
+there will not be backward|-|incompatible changes any more.
+
+\subsection{\cbk {find_read_file}}
+
+Your callback function should have the following conventions:
+
+\startfunctioncall
+<string> actual_name =
+ function (<number> id_number, <string> asked_name)
+\stopfunctioncall
+
+Arguments:
+
+\startitemize
+
+\sym{id_number}
+
+This number is zero for the log or \prm {input} files. For \TEX's \prm {read}
+or \prm {write} the number is incremented by one, so \type {\read0} becomes~1.
+
+\sym{asked_name}
+
+This is the user|-|supplied filename, as found by \prm {input}, \prm {openin}
+or \prm {openout}.
+
+\stopitemize
+
+Return value:
+
+\startitemize
+
+\sym{actual_name}
+
+This is the filename used. For the very first file that is read in by \TEX, you
+have to make sure you return an \type {actual_name} that has an extension and
+that is suitable for use as \type {jobname}. If you don't, you will have to
+manually fix the name of the log file and output file after \LUATEX\ is finished,
+and an eventual format filename will become mangled. That is because these file
+names depend on the jobname.
+
+You have to return \type {nil} if the file cannot be found.
+
+\stopitemize
+
+\subsection{\cbk {find_data_file}}
+
+\topicindex{callbacks+data files}
+
+Your callback function should have the following conventions:
+
+\startfunctioncall
+<string> actual_name =
+ function (<string> asked_name)
+\stopfunctioncall
+
+Return \type {nil} if the file cannot be found.
+
+\subsection{\cbk {find_format_file}}
+
+\topicindex{callbacks+format file}
+
+Your callback function should have the following conventions:
+
+\startfunctioncall
+<string> actual_name =
+ function (<string> asked_name)
+\stopfunctioncall
+
+The \type {asked_name} is a format file for reading (the format file for writing
+is always opened in the current directory).
+
+\subsection{\cbk {open_read_file}}
+
+\topicindex{callbacks+opening files}
+
+Your callback function should have the following conventions:
+
+\startfunctioncall
+<table> env =
+ function (<string> file_name)
+\stopfunctioncall
+
+Argument:
+
+\startitemize
+
+\sym{file_name}
+
+The filename returned by a previous \cbk {find_read_file} or the return value of
+\type {kpse.find_file()} if there was no such callback defined.
+
+\stopitemize
+
+Return value:
+
+\startitemize
+
+\sym{env}
+
+This is a table containing at least one required and one optional callback
+function for this file. The required field is \type {reader} and the associated
+function will be called once for each new line to be read, the optional one is
+\type {close} that will be called once when \LUATEX\ is done with the file.
+
+\LUATEX\ never looks at the rest of the table, so you can use it to store your
+private per|-|file data. Both the callback functions will receive the table as
+their only argument.
+
+\stopitemize
+
+\subsubsection{\type {reader}}
+
+\topicindex{callbacks+reader}
+
+\LUATEX\ will run this function whenever it needs a new input line from the file.
+
+\startfunctioncall
+function(<table> env)
+ return <string> line
+end
+\stopfunctioncall
+
+Your function should return either a string or \type {nil}. The value \type {nil}
+signals that the end of file has occurred, and will make \TEX\ call the optional
+\type {close} function next.
+
+\subsubsection{\type {close}}
+
+\topicindex{callbacks+closing files}
+
+\LUATEX\ will run this optional function when it decides to close the file.
+
+\startfunctioncall
+function(<table> env)
+end
+\stopfunctioncall
+
+Your function should not return any value.
+
+\stopsection
+
+\startsection[title={Data processing callbacks}][library=callback]
+
+\subsection{\cbk {process_jobname}}
+
+\topicindex{callbacks+jobname}
+
+This callback allows you to change the jobname given by \prm {jobname} in \TEX\
+and \type {tex.jobname} in Lua. It does not affect the internal job name or the
+name of the output or log files.
+
+\startfunctioncall
+function(<string> jobname)
+ return <string> adjusted_jobname
+end
+\stopfunctioncall
+
+The only argument is the actual job name; you should not use \type {tex.jobname}
+inside this function or infinite recursion may occur. If you return \type {nil},
+\LUATEX\ will pretend your callback never happened. This callback does not
+replace any internal code.
+
+\stopsection
+
+\startsection[title={Node list processing callbacks}][library=callback]
+
+The description of nodes and node lists is in~\in{chapter}[nodes].
+
+\subsection{\cbk {contribute_filter}}
+
+\topicindex{callbacks+contributions}
+
+This callback is called when \LUATEX\ adds contents to list:
+
+\startfunctioncall
+function(<string> extrainfo)
+end
+\stopfunctioncall
+
+The string reports the group code. From this you can deduce from
+what list you can give a treat.
+
+\starttabulate[|l|p|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type{pre_box} \NC interline material is being added \NC \NR
+\NC \type{pre_adjust} \NC \prm {vadjust} material is being added \NC \NR
+\NC \type{box} \NC a typeset box is being added (always called) \NC \NR
+\NC \type{adjust} \NC \prm {vadjust} material is being added \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\cbk {buildpage_filter}}
+
+\topicindex{callbacks+building pages}
+
+This callback is called whenever \LUATEX\ is ready to move stuff to the main
+vertical list. You can use this callback to do specialized manipulation of the
+page building stage like imposition or column balancing.
+
+\startfunctioncall
+function(<string> extrainfo)
+end
+\stopfunctioncall
+
+The string \type {extrainfo} gives some additional information about what \TEX's
+state is with respect to the \quote {current page}. The possible values for the
+\cbk {buildpage_filter} callback are:
+
+\starttabulate[|l|p|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type{alignment} \NC a (partial) alignment is being added \NC \NR
+\NC \type{after_output} \NC an output routine has just finished \NC \NR
+\NC \type{new_graf} \NC the beginning of a new paragraph \NC \NR
+\NC \type{vmode_par} \NC \prm {par} was found in vertical mode \NC \NR
+\NC \type{hmode_par} \NC \prm {par} was found in horizontal mode \NC \NR
+\NC \type{insert} \NC an insert is added \NC \NR
+\NC \type{penalty} \NC a penalty (in vertical mode) \NC \NR
+\NC \type{before_display} \NC immediately before a display starts \NC \NR
+\NC \type{after_display} \NC a display is finished \NC \NR
+\NC \type{end} \NC \LUATEX\ is terminating (it's all over) \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\cbk {build_page_insert}}
+
+\topicindex{callbacks+inserts}
+
+This callback is called when the pagebuilder adds an insert. There is not much
+control over this mechanism but this callback permits some last minute
+manipulations of the spacing before an insert, something that might be handy when
+for instance multiple inserts (types) are appended in a row.
+
+\startfunctioncall
+function(<number> n, <number> i)
+ return <number> register
+end
+\stopfunctioncall
+
+with
+
+\starttabulate[|l|p|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type{n} \NC the insert class \NC \NR
+\NC \type{i} \NC the order of the insert \NC \NR
+\LL
+\stoptabulate
+
+The return value is a number indicating the skip register to use for the
+prepended spacing. This permits for instance a different top space (when \type
+{i} equals one) and intermediate space (when \type {i} is larger than one). Of
+course you can mess with the insert box but you need to make sure that \LUATEX\
+is happy afterwards.
+
+\subsection{\cbk {pre_linebreak_filter}}
+
+\topicindex{callbacks+linebreaks}
+
+This callback is called just before \LUATEX\ starts converting a list of nodes
+into a stack of \prm {hbox}es, after the addition of \prm {parfillskip}.
+
+\startfunctioncall
+function(<node> head, <string> groupcode)
+ return true | false | <node> newhead
+end
+\stopfunctioncall
+
+The string called \type {groupcode} identifies the nodelist's context within
+\TEX's processing. The range of possibilities is given in the table below, but
+not all of those can actually appear in \cbk {pre_linebreak_filter}, some are
+for the \cbk {hpack_filter} and \cbk {vpack_filter} callbacks that will be
+explained in the next two paragraphs.
+
+\starttabulate[|l|p|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type{<empty>} \NC main vertical list \NC \NR
+\NC \type{hbox} \NC \prm {hbox} in horizontal mode \NC \NR
+\NC \type{adjusted_hbox} \NC \prm {hbox} in vertical mode \NC \NR
+\NC \type{vbox} \NC \prm {vbox} \NC \NR
+\NC \type{vtop} \NC \prm {vtop} \NC \NR
+\NC \type{align} \NC \prm {halign} or \prm {valign} \NC \NR
+\NC \type{disc} \NC discretionaries \NC \NR
+\NC \type{insert} \NC packaging an insert \NC \NR
+\NC \type{vcenter} \NC \prm {vcenter} \NC \NR
+\NC \type{local_box} \NC \lpr {localleftbox} or \lpr {localrightbox} \NC \NR
+\NC \type{split_off} \NC top of a \prm {vsplit} \NC \NR
+\NC \type{split_keep} \NC remainder of a \prm {vsplit} \NC \NR
+\NC \type{align_set} \NC alignment cell \NC \NR
+\NC \type{fin_row} \NC alignment row \NC \NR
+\LL
+\stoptabulate
+
+As for all the callbacks that deal with nodes, the return value can be one of
+three things:
+
+\startitemize
+\startitem
+ boolean \type {true} signals successful processing
+\stopitem
+\startitem
+ \type {<node>} signals that the \quote {head} node should be replaced by the
+ returned node
+\stopitem
+\startitem
+ boolean \type {false} signals that the \quote {head} node list should be
+ ignored and flushed from memory
+\stopitem
+\stopitemize
+
+This callback does not replace any internal code.
+
+\subsection{\cbk {linebreak_filter}}
+
+\topicindex{callbacks+linebreaks}
+
+This callback replaces \LUATEX's line breaking algorithm.
+
+\startfunctioncall
+function(<node> head, <boolean> is_display)
+ return <node> newhead
+end
+\stopfunctioncall
+
+The returned node is the head of the list that will be added to the main vertical
+list, the boolean argument is true if this paragraph is interrupted by a
+following math display.
+
+If you return something that is not a \type {<node>}, \LUATEX\ will apply the
+internal linebreak algorithm on the list that starts at \type {<head>}.
+Otherwise, the \type {<node>} you return is supposed to be the head of a list of
+nodes that are all allowed in vertical mode, and at least one of those has to
+represent a hbox. Failure to do so will result in a fatal error.
+
+Setting this callback to \type {false} is possible, but dangerous, because it is
+possible you will end up in an unfixable \quote {deadcycles loop}.
+
+\subsection{\type {append_to_vlist_filter}}
+
+\topicindex{callbacks+contributions}
+
+This callback is called whenever \LUATEX\ adds a box to a vertical list:
+
+\startfunctioncall
+function(<node> box, <string> locationcode, <number prevdepth>,
+ <boolean> mirrored)
+ return list, prevdepth
+end
+\stopfunctioncall
+
+It is ok to return nothing in which case you also need to flush the box or deal
+with it yourself. The prevdepth is also optional. Locations are \type {box},
+\type {alignment}, \type {equation}, \type {equation_number} and \type
+{post_linebreak}.
+
+\subsection{\cbk {post_linebreak_filter}}
+
+\topicindex{callbacks+linebreaks}
+
+This callback is called just after \LUATEX\ has converted a list of nodes into a
+stack of \prm {hbox}es.
+
+\startfunctioncall
+function(<node> head, <string> groupcode)
+ return true | false | <node> newhead
+end
+\stopfunctioncall
+
+This callback does not replace any internal code.
+
+\subsection{\cbk {hpack_filter}}
+
+\topicindex{callbacks+packing}
+
+This callback is called when \TEX\ is ready to start boxing some horizontal mode
+material. Math items and line boxes are ignored at the moment.
+
+\startfunctioncall
+function(<node> head, <string> groupcode, <number> size,
+ <string> packtype [, <string> direction] [, <node> attributelist])
+ return true | false | <node> newhead
+end
+\stopfunctioncall
+
+The \type {packtype} is either \type {additional} or \type {exactly}. If \type
+{additional}, then the \type {size} is a \type {\hbox spread ...} argument. If
+\type {exactly}, then the \type {size} is a \type {\hbox to ...}. In both cases,
+the number is in scaled points.
+
+The \type {direction} is either one of the three-letter direction specifier
+strings, or \type {nil}.
+
+This callback does not replace any internal code.
+
+\subsection{\cbk {vpack_filter}}
+
+\topicindex{callbacks+packing}
+
+This callback is called when \TEX\ is ready to start boxing some vertical mode
+material. Math displays are ignored at the moment.
+
+This function is very similar to the \cbk {hpack_filter}. Besides the fact
+that it is called at different moments, there is an extra variable that matches
+\TEX's \prm {maxdepth} setting.
+
+\startfunctioncall
+function(<node> head, <string> groupcode, <number> size, <string> packtype,
+ <number> maxdepth [, <string> direction] [, <node> attributelist]))
+ return true | false | <node> newhead
+end
+\stopfunctioncall
+
+This callback does not replace any internal code.
+
+\subsection{\type {hpack_quality}}
+
+\topicindex{callbacks+packing}
+
+This callback can be used to intercept the overfull messages that can result from
+packing a horizontal list (as happens in the par builder). The function takes a
+few arguments:
+
+\startfunctioncall
+function(<string> incident, <number> detail, <node> head, <number> first,
+ <number> last)
+ return <node> whatever
+end
+\stopfunctioncall
+
+The incident is one of \type {overfull}, \type {underfull}, \type {loose} or
+\type {tight}. The detail is either the amount of overflow in case of \type
+{overfull}, or the badness otherwise. The head is the list that is constructed
+(when protrusion or expansion is enabled, this is an intermediate list).
+Optionally you can return a node, for instance an overfull rule indicator. That
+node will be appended to the list (just like \TEX's own rule would).
+
+\subsection{\type {vpack_quality}}
+
+\topicindex{callbacks+packing}
+
+This callback can be used to intercept the overfull messages that can result from
+packing a vertical list (as happens in the page builder). The function takes a
+few arguments:
+
+\startfunctioncall
+function(<string> incident, <number> detail, <node> head, <number> first,
+ <number> last)
+end
+\stopfunctioncall
+
+The incident is one of \type {overfull}, \type {underfull}, \type {loose} or
+\type {tight}. The detail is either the amount of overflow in case of \type
+{overfull}, or the badness otherwise. The head is the list that is constructed.
+
+\subsection{\cbk {process_rule}}
+
+\topicindex{callbacks+rules}
+
+This is an experimental callback. It can be used with rules of subtype~4
+(user). The callback gets three arguments: the node, the width and the
+height. The callback can use \type {pdf.print} to write code to the \PDF\
+file but beware of not messing up the final result. No checking is done.
+
+\subsection{\type {pre_output_filter}}
+
+\topicindex{callbacks+output}
+
+This callback is called when \TEX\ is ready to start boxing the box 255 for \prm
+{output}.
+
+\startfunctioncall
+function(<node> head, <string> groupcode, <number> size, <string> packtype,
+ <number> maxdepth [, <string> direction])
+ return true | false | <node> newhead
+end
+\stopfunctioncall
+
+This callback does not replace any internal code.
+
+\subsection{\cbk {hyphenate}}
+
+\topicindex{callbacks+hyphenation}
+
+\startfunctioncall
+function(<node> head, <node> tail)
+end
+\stopfunctioncall
+
+No return values. This callback has to insert discretionary nodes in the node
+list it receives.
+
+Setting this callback to \type {false} will prevent the internal discretionary
+insertion pass.
+
+\subsection{\cbk {ligaturing}}
+
+\topicindex{callbacks+ligature building}
+
+\startfunctioncall
+function(<node> head, <node> tail)
+end
+\stopfunctioncall
+
+No return values. This callback has to apply ligaturing to the node list it
+receives.
+
+You don't have to worry about return values because the \type {head} node that is
+passed on to the callback is guaranteed not to be a glyph_node (if need be, a
+temporary node will be prepended), and therefore it cannot be affected by the
+mutations that take place. After the callback, the internal value of the \quote
+{tail of the list} will be recalculated.
+
+The \type {next} of \type {head} is guaranteed to be non-nil.
+
+The \type {next} of \type {tail} is guaranteed to be nil, and therefore the
+second callback argument can often be ignored. It is provided for orthogonality,
+and because it can sometimes be handy when special processing has to take place.
+
+Setting this callback to \type {false} will prevent the internal ligature
+creation pass.
+
+You must not ruin the node list. For instance, the head normally is a local par node,
+and the tail a glue. Messing too much can push \LUATEX\ into panic mode.
+
+\subsection{\cbk {kerning}}
+
+\topicindex{callbacks+kerning}
+
+\startfunctioncall
+function(<node> head, <node> tail)
+end
+\stopfunctioncall
+
+No return values. This callback has to apply kerning between the nodes in the
+node list it receives. See \cbk {ligaturing} for calling conventions.
+
+Setting this callback to \type {false} will prevent the internal kern insertion
+pass.
+
+You must not ruin the node list. For instance, the head normally is a local par node,
+and the tail a glue. Messing too much can push \LUATEX\ into panic mode.
+
+\subsection{\type {insert_local_par}}
+
+Each paragraph starts with a local par node that keeps track of for instance
+the direction. You can hook a callback into the creator:
+
+\startfunctioncall
+function(<node> local_par, <string> location)
+end
+\stopfunctioncall
+
+There is no return value and you should make sure that the node stays valid
+as otherwise \TEX\ can get confused.
+
+\subsection{\cbk {mlist_to_hlist}}
+
+\topicindex{callbacks+math}
+
+This callback replaces \LUATEX's math list to node list conversion algorithm.
+
+\startfunctioncall
+function(<node> head, <string> display_type, <boolean> need_penalties)
+ return <node> newhead
+end
+\stopfunctioncall
+
+The returned node is the head of the list that will be added to the vertical or
+horizontal list, the string argument is either \quote {text} or \quote {display}
+depending on the current math mode, the boolean argument is \type {true} if
+penalties have to be inserted in this list, \type {false} otherwise.
+
+Setting this callback to \type {false} is bad, it will almost certainly result in
+an endless loop.
+
+\stopsection
+
+\startsection[title={Information reporting callbacks}][library=callback]
+
+\subsection{\cbk {pre_dump}}
+
+\topicindex{callbacks+dump}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This function is called just before dumping to a format file starts. It does not
+replace any code and there are neither arguments nor return values.
+
+\subsection{\cbk {start_run}}
+
+\topicindex{callbacks+job run}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This callback replaces the code that prints \LUATEX's banner. Note that for
+successful use, this callback has to be set in the \LUA\ initialization script,
+otherwise it will be seen only after the run has already started.
+
+\subsection{\cbk {stop_run}}
+
+\topicindex{callbacks+job run}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This callback replaces the code that prints \LUATEX's statistics and \quote
+{output written to} messages. The engine can still do housekeeping and therefore
+you should not rely on this hook for postprocessing the \PDF\ or log file.
+
+\subsection{\cbk {show_error_hook}}
+
+\topicindex{callbacks+errors}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This callback is run from inside the \TEX\ error function, and the idea is to
+allow you to do some extra reporting on top of what \TEX\ already does (none of
+the normal actions are removed). You may find some of the values in the \type
+{status} table useful. This callback does not replace any internal code.
+
+\subsection{\cbk {show_error_message}}
+
+\topicindex{callbacks+errors}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This callback replaces the code that prints the error message. The usual
+interaction after the message is not affected.
+
+\subsection{\cbk {show_lua_error_hook}}
+
+\topicindex{callbacks+errors}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This callback replaces the code that prints the extra \LUA\ error message.
+
+\subsection{\cbk {start_file}}
+
+\topicindex{callbacks+files}
+
+\startfunctioncall
+function(category,filename)
+end
+\stopfunctioncall
+
+This callback replaces the code that prints \LUATEX's when a file is opened like
+\type {(filename} for regular files. The category is a number:
+
+\starttabulate[|c|l|]
+\DB value \BC meaning \NC \NR
+\TB
+\NC 1 \NC a normal data file, like a \TEX\ source \NC \NR
+\NC 2 \NC a font map coupling font names to resources \NC \NR
+\NC 3 \NC an image file (\type {png}, \type {pdf}, etc) \NC \NR
+\NC 4 \NC an embedded font subset \NC \NR
+\NC 5 \NC a fully embedded font \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\cbk {stop_file}}
+
+\topicindex{callbacks+files}
+
+\startfunctioncall
+function(category)
+end
+\stopfunctioncall
+
+This callback replaces the code that prints \LUATEX's when a file is closed like
+the \type {)} for regular files.
+
+\subsection{\cbk {wrapup_run}}
+
+\topicindex{callbacks+wrapping up}
+
+This callback is called after the \PDF\ and log files are closed. Use it at your own
+risk.
+
+\stopsection
+
+\startsection[title={Font-related callbacks}][library=callback]
+
+\subsection{\cbk {define_font}}
+
+\topicindex{callbacks+fonts}
+
+\startfunctioncall
+function(<string> name, <number> size)
+ return <number> id
+end
+\stopfunctioncall
+
+The string \type {name} is the filename part of the font specification, as given
+by the user.
+
+The number \type {size} is a bit special:
+
+\startitemize[packed]
+\startitem
+ If it is positive, it specifies an \quote{at size} in scaled points.
+\stopitem
+\startitem
+ If it is negative, its absolute value represents a \quote {scaled} setting
+ relative to the design size of the font.
+\stopitem
+\stopitemize
+
+The font can be defined with \type {font.define} which returns a font identifier
+that can be returned in the callback. So, contrary to \LUATEX, in \LUAMETATEX\
+we only accept a number.
+
+The internal structure of the \type {font} table that is passed to \type
+{font.define} is explained in \in {chapter} [fonts]. That table is saved
+internally, so you can put extra fields in the table for your later \LUA\ code to
+use. In alternative, \type {retval} can be a previously defined fontid. This is
+useful if a previous definition can be reused instead of creating a whole new
+font structure.
+
+Setting this callback to \type {false} is pointless as it will prevent font
+loading completely but will nevertheless generate errors.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-contents.tex
new file mode 100644
index 00000000000..d55b7f15b15
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-contents.tex
@@ -0,0 +1,19 @@
+\environment luametatex-style
+
+\startcomponent luametatex-contents
+
+\starttitle[title=Contents]
+
+\start
+
+ \definecolor[maincolor][black]
+
+ \placelist
+ [chapter,section,subsection]
+ [criterium=text]
+
+\stop
+
+\stoptitle
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-differences.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-differences.tex
new file mode 100644
index 00000000000..4ec846b3817
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-differences.tex
@@ -0,0 +1,213 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-differences
+
+\startchapter[reference=differences,title={Differences with \LUATEX}]
+
+As \LUAMETATEX\ is a leaner and meaner \LUATEX, this chapter will discuss
+what is gone. We start with the primitives that were dropped.
+
+\starttabulate[|l|pl|]
+\NC fonts \NC \type {\letterspacefont}
+ \type {\copyfont}
+ \type {\expandglyphsinfont}
+ \type {\ignoreligaturesinfont}
+ \type {\tagcode}
+ \type {\leftghost}
+ \type {\rightghost}
+ \NC \NR
+\NC backend \NC \type {\dviextension}
+ \type {\dvivariable }
+ \type {\dvifeedback}
+ \type {\pdfextension}
+ \type {\pdfvariable }
+ \type {\pdffeedback}
+ \type {\dviextension}
+ \type {\draftmode}
+ \type {\outputmode}
+ \NC \NR
+\NC dimensions \NC \type {\pageleftoffset}
+ \type {\pagerightoffset}
+ \type {\pagetopoffset}
+ \type {\pagebottomoffset}
+ \type {\pageheight}
+ \type {\pagewidth}
+ \NC \NR
+\NC resources \NC \type {\saveboxresource}
+ \type {\useboxresource}
+ \type {\lastsavedboxresourceindex}
+ \type {\saveimageresource}
+ \type {\useimageresource}
+ \type {\lastsavedimageresourceindex}
+ \type {\lastsavedimageresourcepages}
+ \NC \NR
+\NC positioning \NC \type {\savepos}
+ \type {\lastxpos}
+ \type {\lastypos}
+ \NC \NR
+\NC directions \NC \type {\textdir}
+ \type {\linedir}
+ \type {\mathdir}
+ \type {\pardir}
+ \type {\pagedir}
+ \type {\bodydir}
+ \type {\pagedirection}
+ \type {\bodydirection}
+ \NC \NR
+\NC randomizer \NC \type {\randomseed}
+ \type {\setrandomseed}
+ \type {\normaldeviate}
+ \type {\uniformdeviate}
+ \NC \NR
+\NC utilities \NC \type {\synctex}
+ \NC \NR
+\NC extensions \NC \type {\latelua}
+ \type {\lateluafunction}
+ \type {\immediate}
+ \type {\openout}
+ \type {\write}
+ \type {\closeout}
+ \NC \NR
+\NC control \NC \type {\suppressfontnotfounderror}
+ \type {\suppresslongerror}
+ \type {\suppressprimitiveerror}
+ \type {\suppressmathparerror}
+ \type {\suppressifcsnameerror}
+ \type {\suppressoutererror}
+ \type {\mathoption}
+ \NC \NR
+\NC whatever \NC \type {\primitive}
+ \type {\ifprimitive}
+ \NC \NR
+\NC ignored \NC \type {\long}
+ \type {\outer}
+ \type {\mag}
+ \NC \NR
+\stoptabulate
+
+The resources and positioning primitives are actually useful but can be defined
+as macros that (via \LUA) inject nodes in the input that suit the macro package
+and backend. The three||letter direction primitives are gone and the numeric
+variants are now leading. There is no need for page and body related directions
+and they don't work well in \LUATEX\ anyway. We only have two directions left.
+
+The primitive related extensions were not that useful and reliable so they have
+been removed. There are some new variants that will be discussed later. The \type
+{\outer} and \type {\long} prefixes are gone as they don't make much sense
+nowadays and them becoming dummies opened the way to something new, again to be
+discussed elsewhere. I don't think that (\CONTEXT) users will notice it. The
+\type {\suppress..} features are now default.
+
+The \type {\shipout} primitive does no ship out but just erases the content of
+the box, if that hasn't happened already in another way.
+
+The extension primitives relate to the backend (when not immediate) and can be
+implemented as part of a backend design using generic whatsits. There is only one
+type of whatsit now. In fact we're now closer to original \TEX\ with respect to
+the extensions.
+
+The \type {img} library has been removed as it's rather bound to the backend. The
+\type {slunicode} library is also gone. There are some helpers in the string
+library that can be used instead and one can write additional \LUA\ code if
+needed. There is no longer a \type {pdf} backend library.
+
+In the \type {node}, \type {tex} and \type {status} library we no longer have
+helpers and variables that relate to the backend. The \LUAMETATEX\ engine is in
+principle \DVI\ and \PDF\ unaware. There are only generic whatsit nodes that can
+be used for some management related tasks. For instance you can use them to
+implement user nodes.
+
+The \KPSE\ library is no longer built|-|in. Because there is no backend, quite
+some file related callbacks could go away. The following file related callbacks
+remained (till now):
+
+\starttyping
+find_write_file find_data_file find_format_file
+open_data_file read_data_file
+\stoptyping
+
+Also callbacks related to errors stay:
+
+\starttyping
+show_error_hook show_lua_error_hook,
+show_error_message show_warning_message
+\stoptyping
+
+The (job) management hooks are kept:
+
+\starttyping
+process_jobname
+start_run stop_run wrapup_run
+pre_dump
+start_file stop_file
+\stoptyping
+
+Because we use a more generic whatsit model, there is a new callback:
+
+\starttyping
+show_whatsit
+\stoptyping
+
+Being the core of extensibility, the typesetting callbacks of course stayed. This
+is what we ended up with:
+
+% \ctxlua{inspect(table.sortedkeys(callbacks.list))}
+
+\starttyping
+find_log_file, find_data_file, find_format_file, open_data_file, read_data_file,
+process_jobname, start_run, stop_run, define_font, pre_output_filter,
+buildpage_filter, hpack_filter, vpack_filter, hyphenate, ligaturing, kerning,
+pre_linebreak_filter, linebreak_filter, post_linebreak_filter,
+append_to_vlist_filter, mlist_to_hlist, pre_dump, start_file, stop_file,
+handle_error_hook, show_error_hook, show_lua_error_hook, show_error_message,
+show_warning_message, hpack_quality, vpack_quality, insert_local_par,
+contribute_filter, build_page_insert, wrapup_run, new_graf, make_extensible,
+show_whatsit, terminal_input,
+\stoptyping
+
+As in \LUATEX\ font loading happens with the following callback. This time it
+really needs to be set because there is no built|-|in font loader.
+
+\starttyping
+define_font
+\stoptyping
+
+There are all kinds of subtle differences in the implementation, for instance we
+no longer intercept \type {*} and \type {&} as these were already replaced long
+ago in \TEX\ engines by command line options. Talking of options, only a few are
+left.
+
+We took our time for reaching a stable state in \LUATEX. Among the reasons is the
+fact that most was experimented with in \CONTEXT. It took many man|-|years to
+decide what to keep and how to do things. Of course there are places when things
+can be improved and it might happen in \LUAMETATEX. Contrary to what is sometimes
+suggested, the \LUATEX|-|\CONTEXT\ \MKIV\ combination (assuming matched versions)
+has been quite stable. It made no sense otherwise. Most \CONTEXT\ functionality
+didn't change much at the user level. Of course there have been issues, as is
+natural with everything new and beta, but we have a fast update cycle.
+
+The same is true for \LUAMETATEX\ and \CONTEXT\ \LMTX: it can be used for
+production as usual and in practice \CONTEXT\ users tend to use the beta
+releases, which proves this. Of course, if you use low level features that are
+experimental you're on your own. Also, as with \LUATEX\ it might take many years
+before a long term stable is defined. The good news is that, the source code
+being part of the \CONTEXT\ distribution, there is always a properly working,
+more or less long term stable, snapshot.
+
+The error reporting subsystem has been redone a little but is still fundamentally
+the same. We don't really assume interactive usage but if someone uses it, it
+might be noticed that it is not possible to backtrack or inject something. Of
+course it is no big deal to implement all that in \LUA\ if needed. It removes a
+system dependency and makes for a bit cleaner code.
+
+There are new primitives too as well as some extensions to existing primitive
+functionality. These are described in following chapters but there might be
+hidden treasures in the binary. If you locate them, don't automatically assume
+them to stay, some might be part of experiments!
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-enhancements.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-enhancements.tex
new file mode 100644
index 00000000000..d70b8f2c0b4
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-enhancements.tex
@@ -0,0 +1,1777 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-enhancements
+
+\startchapter[reference=enhancements,title={Basic \TEX\ enhancements}]
+
+\startsection[title={Introduction}]
+
+\startsubsection[title={Primitive behaviour}]
+
+From day one, \LUATEX\ has offered extra features compared to the superset of
+\PDFTEX, which includes \ETEX, and \ALEPH. This has not been limited to the
+possibility to execute \LUA\ code via \prm {directlua}, but \LUATEX\ also adds
+functionality via new \TEX|-|side primitives or extensions to existing ones. The
+same is true for \LUAMETATEX. Some primitives have \type {luatex} in their name
+and there will be no \type {luametatex} variants. This is because we consider
+\LUAMETATEX\ to be \LUATEX 2\high{+}.
+
+Contrary to the \LUATEX\ engine \LUAMETATEX\ enables all its primitives. You can
+clone (a selection of) primitives with a different prefix, like:
+
+\starttyping
+\directlua { tex.enableprimitives('normal',tex.extraprimitives()) }
+\stoptyping
+
+The \type {extraprimitives} function returns the whole list or a subset,
+specified by one or more keywords \type {core}, \type {tex}, \type {etex} or
+\type {luatex}. \footnote {At some point this function might be changed to return
+the whole list always}.
+
+But be aware that the curly braces may not have the proper \prm {catcode}
+assigned to them at this early time (giving a \quote {Missing number} error), so
+it may be needed to put these assignments before the above line:
+
+\starttyping
+\catcode `\{=1
+\catcode `\}=2
+\stoptyping
+
+More fine|-|grained primitives control is possible and you can look up the
+details in \in {section} [luaprimitives]. There are only three kinds of
+primitives: \type {tex}, \type {etex} and \type {luatex} but a future version
+might drop this and no longer make that distinction as it no longer serves
+a purpose.
+
+\stopsubsection
+
+\startsubsection[title={Experiments}]
+
+There are a few extensions to the engine regarding the macro machinery. Some are
+already well tested but others are (still) experimental. Although they are likely
+to stay, their exact behaviour might evolve. Because \LUAMETATEX\ is also used
+for experiments, this is not a problem. We can always decide to also add some of
+what is discussed here to \LUATEX, but it will happen with a delay.
+
+There are all kinds of small improvements that might find their way into stock
+\LUATEX: a few more helpers, some cleanup of code, etc. We'll see. In any case,
+if you play with these before they are declared stable, unexpected side effects
+are what you have to accept.
+
+\stopsubsection
+
+\startsubsection[title={Version information}]
+
+\startsubsubsection[title={\lpr {luatexbanner}, \lpr {luatexversion} and \lpr {luatexrevision}}]
+
+\topicindex{version}
+\topicindex{banner}
+
+There are three primitives to test the version of \LUATEX\ (and \LUAMETATEX):
+
+\unexpanded\def\VersionHack#1% otherwise different luatex and luajittex runs
+ {\ctxlua{%
+ local banner = "\luatexbanner"
+ local banner = string.match(banner,"(.+)\letterpercent(") or banner
+ context(string.gsub(banner ,"jit",""))%
+ }}
+
+\starttabulate[|l|l|pl|]
+\DB primitive \BC value
+ \BC explanation \NC \NR
+\TB
+\NC \lpr {luatexbanner} \NC \VersionHack{\luatexbanner}
+ \NC the banner reported on the command line \NC \NR
+\NC \lpr {luatexversion} \NC \the\luatexversion
+ \NC a combination of major and minor number \NC \NR
+\NC \lpr {luatexrevision} \NC \luatexrevision
+ \NC the revision number, the current value is \NC \NR
+\LL
+\stoptabulate
+
+A version is defined as follows:
+
+\startitemize
+\startitem
+ The major version is the integer result of \lpr {luatexversion} divided by
+ 100. The primitive is an \quote {internal variable}, so you may need to prefix
+ its use with \prm {the} depending on the context.
+\stopitem
+\startitem
+ The minor version is the two|-|digit result of \lpr {luatexversion} modulo 100.
+\stopitem
+\startitem
+ The revision is reported by \lpr {luatexrevision}. This primitive expands to
+ a positive integer.
+\stopitem
+\startitem
+ The full version number consists of the major version, minor version and
+ revision, separated by dots.
+\stopitem
+\stopitemize
+
+\stopsubsubsection
+
+The \LUAMETATEX\ version number starts at 2 in order to prevent a clash with
+\LUATEX, and the version commands are the same. This is a way to indicate that
+these projects are related.
+
+\startsubsubsection[title={\lpr {formatname}}]
+
+\topicindex{format}
+
+The \lpr {formatname} syntax is identical to \prm {jobname}. In \INITEX, the
+expansion is empty. Otherwise, the expansion is the value that \prm {jobname} had
+during the \INITEX\ run that dumped the currently loaded format. You can use this
+token list to provide your own version info.
+
+\stopsubsubsection
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\UNICODE\ text support}]
+
+\startsubsection[title={Extended ranges}]
+
+\topicindex{\UNICODE}
+
+Text input and output is now considered to be \UNICODE\ text, so input characters
+can use the full range of \UNICODE\ ($2^{20}+2^{16}-1 = \hbox{0x10FFFF}$). Later
+chapters will talk of characters and glyphs. Although these are not
+interchangeable, they are closely related. During typesetting, a character is
+always converted to a suitable graphic representation of that character in a
+specific font. However, while processing a list of to|-|be|-|typeset nodes, its
+contents may still be seen as a character. Inside the engine there is no clear
+separation between the two concepts. Because the subtype of a glyph node can be
+changed in \LUA\ it is up to the user. Subtypes larger than 255 indicate that
+font processing has happened.
+
+A few primitives are affected by this, all in a similar fashion: each of them has
+to accommodate for a larger range of acceptable numbers. For instance, \prm
+{char} now accepts values between~0 and $1{,}114{,}111$. This should not be a
+problem for well|-|behaved input files, but it could create incompatibilities for
+input that would have generated an error when processed by older \TEX|-|based
+engines. The affected commands with an altered initial (left of the equal sign)
+or secondary (right of the equal sign) value are: \prm {char}, \prm {lccode},
+\prm {uccode}, \lpr {hjcode}, \prm {catcode}, \prm {sfcode}, \lpr {efcode}, \lpr
+{lpcode}, \lpr {rpcode}, \prm {chardef}.
+
+As far as the core engine is concerned, all input and output to text files is
+\UTF-8 encoded. Input files can be pre|-|processed using the \type {reader}
+callback. This will be explained in \in {section} [iocallback]. Normalization of
+the \UNICODE\ input is on purpose not built|-|in and can be handled by a macro
+package during callback processing. We have made some practical choices and the
+user has to live with those.
+
+Output in byte|-|sized chunks can be achieved by using characters just outside of
+the valid \UNICODE\ range, starting at the value $1{,}114{,}112$ (0x110000). When
+the time comes to print a character $c>=1{,}114{,}112$, \LUATEX\ will actually
+print the single byte corresponding to $c$ minus 1{,}114{,}112.
+
+Contrary to other \TEX\ engines, the output to the terminal is as|-|is so there
+is no escaping with \type {^^}. We operate in a \UTF\ universe.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {Uchar}}]
+
+\topicindex{\UNICODE}
+
+The expandable command \lpr {Uchar} reads a number between~0 and $1{,}114{,}111$
+and expands to the associated \UNICODE\ character.
+
+\stopsubsection
+
+\startsubsection[title={Extended tables}]
+
+All traditional \TEX\ and \ETEX\ registers can be 16-bit numbers. The affected
+commands are:
+
+\startfourcolumns
+\startlines
+\prm {count}
+\prm {dimen}
+\prm {skip}
+\prm {muskip}
+\prm {marks}
+\prm {toks}
+\prm {countdef}
+\prm {dimendef}
+\prm {skipdef}
+\prm {muskipdef}
+\prm {toksdef}
+\prm {insert}
+\prm {box}
+\prm {unhbox}
+\prm {unvbox}
+\prm {copy}
+\prm {unhcopy}
+\prm {unvcopy}
+\prm {wd}
+\prm {ht}
+\prm {dp}
+\prm {setbox}
+\prm {vsplit}
+\stoplines
+\stopfourcolumns
+
+Fonts are loaded via \LUA\ and a minimal amount of information is kept at the
+\TEX\ end. Sharing resources is up to the loaders. The engine doesn't really care
+about what a character (or glyph) number represents (a \UNICODE\ or index) as it
+only is interested in dimensions.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Attributes}]
+
+\startsubsection[title={Nodes}]
+
+\topicindex {nodes}
+
+When \TEX\ reads input it will interpret the stream according to the properties
+of the characters. Some signal a macro name and trigger expansion, others open
+and close groups, trigger math mode, etc. What's left over becomes the typeset
+text. Internally we get a linked list of nodes. Characters become \nod {glyph}
+nodes that have for instance a \type {font} and \type {char} property and \typ
+{\kern 10pt} becomes a \nod {kern} node with a \type {width} property. Spaces are
+alien to \TEX\ as they are turned into \nod {glue} nodes. So, a simple paragraph
+is mostly a mix of sequences of \nod {glyph} nodes (words) and \nod {glue} nodes
+(spaces). A node can have a subtype so that it can be recognized as for instance
+a space related glue.
+
+The sequences of characters at some point are extended with \nod {disc} nodes
+that relate to hyphenation. After that font logic can be applied and we get a
+list where some characters can be replaced, for instance multiple characters can
+become one ligature, and font kerns can be injected. This is driven by the
+font properties.
+
+Boxes (like \prm {hbox} and \prm {vbox}) become \nod {hlist} or \nod {vlist}
+nodes with \type {width}, \type {height}, \type {depth} and \type {shift}
+properties and a pointer \type {list} to its actual content. Boxes can be
+constructed explicitly or can be the result of subprocesses. For instance, when
+lines are broken into paragraphs, the lines are a linked list of \nod {hlist}
+nodes, possibly with glue and penalties in between.
+
+Internally nodes have a number. This number is actually an index in the memory
+used to store nodes.
+
+So, to summarize: all that you enter as content eventually becomes a node, often
+as part of a (nested) list structure. They have a relative small memory footprint
+and carry only the minimal amount of information needed. In traditional \TEX\ a
+character node only held the font and slot number, in \LUATEX\ we also store some
+language related information, the expansion factor, etc. Now that we have access
+to these nodes from \LUA\ it makes sense to be able to carry more information
+with a node and this is where attributes kick in.
+
+\stopsubsection
+
+\startsubsection[title={Attribute registers}]
+
+\topicindex {attributes}
+
+Attributes are a completely new concept in \LUATEX. Syntactically, they behave a
+lot like counters: attributes obey \TEX's nesting stack and can be used after
+\prm {the} etc.\ just like the normal \prm {count} registers.
+
+\startsyntax
+\attribute <16-bit number> <optional equals> <32-bit number>!crlf
+\attributedef <csname> <optional equals> <16-bit number>
+\stopsyntax
+
+Conceptually, an attribute is either \quote {set} or \quote {unset}. Unset
+attributes have a special negative value to indicate that they are unset, that
+value is the lowest legal value: \type {-"7FFFFFFF} in hexadecimal, a.k.a.
+$-2147483647$ in decimal. It follows that the value \type {-"7FFFFFFF} cannot be
+used as a legal attribute value, but you {\it can\/} assign \type {-"7FFFFFFF} to
+\quote {unset} an attribute. All attributes start out in this \quote {unset}
+state in \INITEX.
+
+Attributes can be used as extra counter values, but their usefulness comes mostly
+from the fact that the numbers and values of all \quote {set} attributes are
+attached to all nodes created in their scope. These can then be queried from any
+\LUA\ code that deals with node processing. Further information about how to use
+attributes for node list processing from \LUA\ is given in~\in {chapter}[nodes].
+
+Attributes are stored in a sorted (sparse) linked list that are shared when
+possible. This permits efficient testing and updating. You can define many
+thousands of attributes but normally such a large number makes no sense and is
+also not that efficient because each node carries a (possibly shared) link to a
+list of currently set attributes. But they are a convenient extension and one of
+the first extensions we implemented in \LUATEX.
+
+In \LUAMETATEX\ we try to minimize the memory footprint and creation of these
+attribute lists more aggressive sharing them. This feature is still somewhat
+experimental.
+
+\stopsubsection
+
+\startsubsection[title={Box attributes}]
+
+\topicindex {attributes}
+\topicindex {boxes}
+
+Nodes typically receive the list of attributes that is in effect when they are
+created. This moment can be quite asynchronous. For example: in paragraph
+building, the individual line boxes are created after the \prm {par} command has
+been processed, so they will receive the list of attributes that is in effect
+then, not the attributes that were in effect in, say, the first or third line of
+the paragraph.
+
+Similar situations happen in \LUATEX\ regularly. A few of the more obvious
+problematic cases are dealt with: the attributes for nodes that are created
+during hyphenation, kerning and ligaturing borrow their attributes from their
+surrounding glyphs, and it is possible to influence box attributes directly.
+
+When you assemble a box in a register, the attributes of the nodes contained in
+the box are unchanged when such a box is placed, unboxed, or copied. In this
+respect attributes act the same as characters that have been converted to
+references to glyphs in fonts. For instance, when you use attributes to implement
+color support, each node carries information about its eventual color. In that
+case, unless you implement mechanisms that deal with it, applying a color to
+already boxed material will have no effect. Keep in mind that this
+incompatibility is mostly due to the fact that separate specials and literals are
+a more unnatural approach to colors than attributes.
+
+It is possible to fine-tune the list of attributes that are applied to a \type
+{hbox}, \type {vbox} or \type {vtop} by the use of the keyword \type {attr}. The
+\type {attr} keyword(s) should come before a \type {to} or \type {spread}, if
+that is also specified. An example is:
+
+\startbuffer[tex]
+\attribute997=123
+\attribute998=456
+\setbox0=\hbox {Hello}
+\setbox2=\hbox attr 999 = 789 attr 998 = -"7FFFFFFF{Hello}
+\stopbuffer
+
+\startbuffer[lua]
+ for b=0,2,2 do
+ for a=997, 999 do
+ tex.sprint("box ", b, " : attr ",a," : ",tostring(tex.box[b] [a]))
+ tex.sprint("\\quad\\quad")
+ tex.sprint("list ",b, " : attr ",a," : ",tostring(tex.box[b].list[a]))
+ tex.sprint("\\par")
+ end
+ end
+\stopbuffer
+
+\typebuffer[tex]
+
+Box 0 now has attributes 997 and 998 set while box 2 has attributes 997 and 999
+set while the nodes inside that box will all have attributes 997 and 998 set.
+Assigning the maximum negative value causes an attribute to be ignored.
+
+To give you an idea of what this means at the \LUA\ end, take the following
+code:
+
+\typebuffer[lua]
+
+Later we will see that you can access properties of a node. The boxes here are so
+called \nod {hlist} nodes that have a field \type {list} that points to the
+content. Because the attributes are a list themselves you can access them by
+indexing the node (here we do that with \type {[a]}). Running this snippet gives:
+
+\start
+ \getbuffer[tex]
+ \startpacked \tt
+ \ctxluabuffer[lua]
+ \stoppacked
+\stop
+
+Because some values are not set we need to apply the \type {tostring} function
+here so that we get the word \type {nil}.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\LUA\ related primitives}]
+
+\startsubsection[title={\prm {directlua}}]
+
+In order to merge \LUA\ code with \TEX\ input, a few new primitives are needed.
+The primitive \prm {directlua} is used to execute \LUA\ code immediately. The
+syntax is
+
+\startsyntax
+\directlua <general text>
+\stopsyntax
+
+The \syntax {<general text>} is expanded fully, and then fed into the \LUA\
+interpreter. After reading and expansion has been applied to the \syntax
+{<general text>}, the resulting token list is converted to a string as if it was
+displayed using \type {\the\toks}. On the \LUA\ side, each \prm {directlua} block
+is treated as a separate chunk. In such a chunk you can use the \type {local}
+directive to keep your variables from interfering with those used by the macro
+package.
+
+The conversion to and from a token list means that you normally can not use \LUA\
+line comments (starting with \type {--}) within the argument. As there typically
+will be only one \quote {line} the first line comment will run on until the end
+of the input. You will either need to use \TEX|-|style line comments (starting
+with \%), or change the \TEX\ category codes locally. Another possibility is to
+say:
+
+\starttyping
+\begingroup
+\endlinechar=10
+\directlua ...
+\endgroup
+\stoptyping
+
+Then \LUA\ line comments can be used, since \TEX\ does not replace line endings
+with spaces. Of course such an approach depends on the macro package that you
+use.
+
+The \prm {directlua} command is expandable. Since it passes \LUA\ code to the
+\LUA\ interpreter its expansion from the \TEX\ viewpoint is usually empty.
+However, there are some \LUA\ functions that produce material to be read by \TEX,
+the so called print functions. The most simple use of these is \type
+{tex.print(<string> s)}. The characters of the string \type {s} will be placed on
+the \TEX\ input buffer, that is, \quote {before \TEX's eyes} to be read by \TEX\
+immediately. For example:
+
+\startbuffer
+\count10=20
+a\directlua{tex.print(tex.count[10]+5)}b
+\stopbuffer
+
+\typebuffer
+
+expands to
+
+\getbuffer
+
+Here is another example:
+
+\startbuffer
+$\pi = \directlua{tex.print(math.pi)}$
+\stopbuffer
+
+\typebuffer
+
+will result in
+
+\getbuffer
+
+Note that the expansion of \prm {directlua} is a sequence of characters, not of
+tokens, contrary to all \TEX\ commands. So formally speaking its expansion is
+null, but it places material on a pseudo-file to be immediately read by \TEX, as
+\ETEX's \prm {scantokens}. For a description of print functions look at \in
+{section} [sec:luaprint].
+
+Because the \syntax {<general text>} is a chunk, the normal \LUA\ error handling
+is triggered if there is a problem in the included code. The \LUA\ error messages
+should be clear enough, but the contextual information is still pretty bad.
+Often, you will only see the line number of the right brace at the end of the
+code.
+
+While on the subject of errors: some of the things you can do inside \LUA\ code
+can break up \LUAMETATEX\ pretty bad. If you are not careful while working with
+the node list interface, you may even end up with assertion errors from within
+the \TEX\ portion of the executable.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {luaescapestring}}]
+
+\topicindex {escaping}
+
+This primitive converts a \TEX\ token sequence so that it can be safely used as
+the contents of a \LUA\ string: embedded backslashes, double and single quotes,
+and newlines and carriage returns are escaped. This is done by prepending an
+extra token consisting of a backslash with category code~12, and for the line
+endings, converting them to \type {n} and \type {r} respectively. The token
+sequence is fully expanded.
+
+\startsyntax
+\luaescapestring <general text>
+\stopsyntax
+
+Most often, this command is not actually the best way to deal with the
+differences between \TEX\ and \LUA. In very short bits of \LUA\ code it is often
+not needed, and for longer stretches of \LUA\ code it is easier to keep the code
+in a separate file and load it using \LUA's \type {dofile}:
+
+\starttyping
+\directlua { dofile("mysetups.lua") }
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\lpr {luafunction}, \lpr {luafunctioncall} and \lpr {luadef}}]
+
+The \prm {directlua} commands involves tokenization of its argument (after
+picking up an optional name or number specification). The tokenlist is then
+converted into a string and given to \LUA\ to turn into a function that is
+called. The overhead is rather small but when you have millions of calls it can
+have some impact. For this reason there is a variant call available: \lpr
+{luafunction}. This command is used as follows:
+
+\starttyping
+\directlua {
+ local t = lua.get_functions_table()
+ t[1] = function() tex.print("!") end
+ t[2] = function() tex.print("?") end
+}
+
+\luafunction1
+\luafunction2
+\stoptyping
+
+Of course the functions can also be defined in a separate file. There is no limit
+on the number of functions apart from normal \LUA\ limitations. Of course there
+is the limitation of no arguments but that would involve parsing and thereby give
+no gain. The function, when called in fact gets one argument, being the index, so
+in the following example the number \type {8} gets typeset.
+
+\starttyping
+\directlua {
+ local t = lua.get_functions_table()
+ t[8] = function(slot) tex.print(slot) end
+}
+\stoptyping
+
+The \lpr {luafunctioncall} primitive does the same but is unexpandable, for
+instance in an \prm {edef}. In addition \LUATEX\ provides a definer:
+
+\starttyping
+ \luadef\MyFunctionA 1
+ \global\luadef\MyFunctionB 2
+\protected\global\luadef\MyFunctionC 3
+\stoptyping
+
+You should really use these commands with care. Some references get stored in
+tokens and assume that the function is available when that token expands. On the
+other hand, as we have tested this functionality in relative complex situations
+normal usage should not give problems.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {luabytecode} and \lpr {luabytecodecall}}]
+
+Analogue to the function callers discussed in the previous section we have byte
+code callers. Again the call variant is unexpandable.
+
+\starttyping
+\directlua {
+ lua.bytecode[9998] = function(s)
+ tex.sprint(s*token.scan_int())
+ end
+ lua.bytecode[5555] = function(s)
+ tex.sprint(s*token.scan_dimen())
+ end
+}
+\stoptyping
+
+This works with:
+
+\starttyping
+\luabytecode 9998 5 \luabytecode 5555 5sp
+\luabytecodecall9998 5 \luabytecodecall5555 5sp
+\stoptyping
+
+The variable \type {s} in the code is the number of the byte code register that
+can be used for diagnostic purposes. The advantage of bytecode registers over
+function calls is that they are stored in the format (but without upvalues).
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Catcode tables}]
+
+\startsubsection[title={Catcodes}]
+
+\topicindex {catcodes}
+
+Catcode tables are a new feature that allows you to switch to a predefined
+catcode regime in a single statement. You can have lots of different tables, but
+if you need a dozen you might wonder what you're doing. This subsystem is
+backward compatible: if you never use the following commands, your document will
+not notice any difference in behaviour compared to traditional \TEX. The contents
+of each catcode table is independent from any other catcode table, and its
+contents is stored and retrieved from the format file.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {catcodetable}}]
+
+\startsyntax
+\catcodetable <15-bit number>
+\stopsyntax
+
+The primitive \lpr {catcodetable} switches to a different catcode table. Such a
+table has to be previously created using one of the two primitives below, or it
+has to be zero. Table zero is initialized by \INITEX.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {initcatcodetable}}]
+
+\startsyntax
+\initcatcodetable <15-bit number>
+\stopsyntax
+
+The primitive \lpr {initcatcodetable} creates a new table with catcodes
+identical to those defined by \INITEX. The new catcode table is allocated
+globally: it will not go away after the current group has ended. If the supplied
+number is identical to the currently active table, an error is raised. The
+initial values are:
+
+\starttabulate[|c|c|l|l|]
+\DB catcode \BC character \BC equivalent \BC category \NC \NR
+\TB
+\NC 0 \NC \tttf \letterbackslash \NC \NC \type {escape} \NC \NR
+\NC 5 \NC \tttf \letterhat\letterhat M \NC return \NC \type {car_ret} \NC \NR
+\NC 9 \NC \tttf \letterhat\letterhat @ \NC null \NC \type {ignore} \NC \NR
+\NC 10 \NC \tttf <space> \NC space \NC \type {spacer} \NC \NR
+\NC 11 \NC {\tttf a} \endash\ {\tttf z} \NC \NC \type {letter} \NC \NR
+\NC 11 \NC {\tttf A} \endash\ {\tttf Z} \NC \NC \type {letter} \NC \NR
+\NC 12 \NC everything else \NC \NC \type {other} \NC \NR
+\NC 14 \NC \tttf \letterpercent \NC \NC \type {comment} \NC \NR
+\NC 15 \NC \tttf \letterhat\letterhat ? \NC delete \NC \type {invalid_char} \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\lpr {savecatcodetable}}]
+
+\startsyntax
+\savecatcodetable <15-bit number>
+\stopsyntax
+
+\lpr {savecatcodetable} copies the current set of catcodes to a new table with
+the requested number. The definitions in this new table are all treated as if
+they were made in the outermost level.
+
+The new table is allocated globally: it will not go away after the current group
+has ended. If the supplied number is the currently active table, an error is
+raised.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Tokens, commands and strings}]
+
+\startsubsection[title={\lpr {scantextokens}}]
+
+\topicindex {tokens+scanning}
+
+The syntax of \lpr {scantextokens} is identical to \prm {scantokens}. This
+primitive is a slightly adapted version of \ETEX's \prm {scantokens}. The
+differences are:
+
+\startitemize
+\startitem
+ The last (and usually only) line does not have a \prm {endlinechar}
+ appended.
+\stopitem
+\startitem
+ \lpr {scantextokens} never raises an EOF error, and it does not execute
+ \prm {everyeof} tokens.
+\stopitem
+\startitem
+ There are no \quote {\unknown\ while end of file \unknown} error tests
+ executed. This allows the expansion to end on a different grouping level or
+ while a conditional is still incomplete.
+\stopitem
+\stopitemize
+
+\stopsubsection
+
+\startsubsection[title={\lpr {toksapp}, \lpr {tokspre}, \lpr {etoksapp}, \lpr {etokspre},
+\lpr {gtoksapp}, \lpr {gtokspre}, \lpr {xtoksapp}, \lpr {xtokspre}}]
+
+Instead of:
+
+\starttyping
+\toks0\expandafter{\the\toks0 foo}
+\stoptyping
+
+you can use:
+
+\starttyping
+\etoksapp0{foo}
+\stoptyping
+
+The \type {pre} variants prepend instead of append, and the \type {e} variants
+expand the passed general text. The \type {g} and \type {x} variants are global.
+
+\stopsubsection
+
+\startsubsection[title={\prm {csstring}, \lpr {begincsname} and \lpr {lastnamedcs}}]
+
+These are somewhat special. The \prm {csstring} primitive is like
+\prm {string} but it omits the leading escape character. This can be
+somewhat more efficient than stripping it afterwards.
+
+The \lpr {begincsname} primitive is like \prm {csname} but doesn't create
+a relaxed equivalent when there is no such name. It is equivalent to
+
+\starttyping
+\ifcsname foo\endcsname
+ \csname foo\endcsname
+\fi
+\stoptyping
+
+The advantage is that it saves a lookup (don't expect much speedup) but more
+important is that it avoids using the \prm {if} test. The \lpr {lastnamedcs}
+is one that should be used with care. The above example could be written as:
+
+\starttyping
+\ifcsname foo\endcsname
+ \lastnamedcs
+\fi
+\stoptyping
+
+This is slightly more efficient than constructing the string twice (deep down in
+\LUATEX\ this also involves some \UTF8 juggling), but probably more relevant is
+that it saves a few tokens and can make code a bit more readable.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {clearmarks}}]
+
+\topicindex {marks}
+
+This primitive complements the \ETEX\ mark primitives and clears a mark class
+completely, resetting all three connected mark texts to empty. It is an
+immediate command.
+
+\startsyntax
+\clearmarks <16-bit number>
+\stopsyntax
+
+\stopsubsection
+
+\startsubsection[title={\lpr {alignmark} and \lpr {aligntab}}]
+
+The primitive \lpr {alignmark} duplicates the functionality of \type {#} inside
+alignment preambles, while \lpr {aligntab} duplicates the functionality of \type
+{&}.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {letcharcode}}]
+
+This primitive can be used to assign a meaning to an active character, as in:
+
+\starttyping
+\def\foo{bar} \letcharcode123=\foo
+\stoptyping
+
+This can be a bit nicer than using the uppercase tricks (using the property of
+\prm {uppercase} that it treats active characters special).
+
+\stopsubsection
+
+\startsubsection[title={\lpr {glet}}]
+
+This primitive is similar to:
+
+\starttyping
+\protected\def\glet{\global\let}
+\stoptyping
+
+but faster (only measurable with millions of calls) and probably more convenient
+(after all we also have \type {\gdef}).
+
+\stopsubsection
+
+\startsubsection[title={\lpr {expanded}, \lpr {immediateassignment} and \lpr {immediateassigned}}]
+
+\topicindex {expansion}
+
+The \lpr {expanded} primitive takes a token list and expands its content which can
+come in handy: it avoids a tricky mix of \prm {expandafter} and \prm {noexpand}.
+You can compare it with what happens inside the body of an \prm {edef}. But this
+kind of expansion still doesn't expand some primitive operations.
+
+\startbuffer
+\newcount\NumberOfCalls
+
+\def\TestMe{\advance\NumberOfCalls1 }
+
+\edef\Tested{\TestMe foo:\the\NumberOfCalls}
+\edef\Tested{\TestMe foo:\the\NumberOfCalls}
+\edef\Tested{\TestMe foo:\the\NumberOfCalls}
+
+\meaning\Tested
+\stopbuffer
+
+\typebuffer
+
+The result is a macro that has the not expanded code in its body:
+
+\getbuffer
+
+Instead we can define \tex {TestMe} in a way that expands the assignment
+immediately. You need of course to be aware of preventing look ahead interference
+by using a space or \tex {relax} (often an expression works better as it doesn't
+leave an \tex {relax}).
+
+\startbuffer
+\def\TestMe{\immediateassignment\advance\NumberOfCalls1 }
+
+\edef\Tested{\TestMe foo:\the\NumberOfCalls}
+\edef\Tested{\TestMe foo:\the\NumberOfCalls}
+\edef\Tested{\TestMe foo:\the\NumberOfCalls}
+
+\meaning\Tested
+\stopbuffer
+
+\typebuffer
+
+This time the counter gets updates and we don't see interference in the
+resulting \tex {Tested} macro:
+
+\getbuffer
+
+Here is a somewhat silly example of expanded comparison:
+
+\startbuffer
+\def\expandeddoifelse#1#2#3#4%
+ {\immediateassignment\edef\tempa{#1}%
+ \immediateassignment\edef\tempb{#2}%
+ \ifx\tempa\tempb
+ \immediateassignment\def\next{#3}%
+ \else
+ \immediateassignment\def\next{#4}%
+ \fi
+ \next}
+
+\edef\Tested
+ {(\expandeddoifelse{abc}{def}{yes}{nop}/%
+ \expandeddoifelse{abc}{abc}{yes}{nop})}
+
+\meaning\Tested
+\stopbuffer
+
+\typebuffer
+
+It gives:
+
+\getbuffer
+
+A variant is:
+
+\starttyping
+\def\expandeddoifelse#1#2#3#4%
+ {\immediateassigned{
+ \edef\tempa{#1}%
+ \edef\tempb{#2}%
+ }%
+ \ifx\tempa\tempb
+ \immediateassignment\def\next{#3}%
+ \else
+ \immediateassignment\def\next{#4}%
+ \fi
+ \next}
+\stoptyping
+
+The possible error messages are the same as using assignments in preambles of
+alignments and after the \prm {accent} command. The supported assignments are the
+so called prefixed commands (except box assignments).
+
+\stopsubsection
+
+\startsubsection[title={\lpr {ignorepars}}]
+
+This primitive is like \prm {ignorespaces} but also skips paragraph ending
+commands (normally \prm {par} and empty lines).
+
+\stopsubsection
+
+\startsubsection[title={\lpr {futureexpand}, \lpr {futureexpandis}, \lpr {futureexpandisap}}]
+
+These commands are used as:
+
+\starttyping
+\futureexpand\sometoken\whenfound\whennotfound
+\stoptyping
+
+When there is no match and a space was gobbled a space will be put back. The
+\type {is} variant doesn't do that while the \type {isap} even skips \type
+{\pars}, These characters stand for \quote {ignorespaces} and \quote
+{ignorespacesandpars}.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {aftergrouped}}]
+
+There is a new experimental feature that can inject multiple tokens to after the group
+ends. An example demonstrate its use:
+
+\startbuffer
+{
+ \aftergroup A \aftergroup B \aftergroup C
+test 1 : }
+
+{
+ \aftergrouped{What comes next 1}
+ \aftergrouped{What comes next 2}
+ \aftergrouped{What comes next 3}
+test 2 : }
+
+
+{
+ \aftergroup A \aftergrouped{What comes next 1}
+ \aftergroup B \aftergrouped{What comes next 2}
+ \aftergroup C \aftergrouped{What comes next 3}
+test 3 : }
+
+{
+ \aftergrouped{What comes next 1} \aftergroup A
+ \aftergrouped{What comes next 2} \aftergroup B
+ \aftergrouped{What comes next 3} \aftergroup C
+test 4 : }
+\stopbuffer
+
+\typebuffer
+
+This gives:
+
+\startpacked\getbuffer\stoppacked
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title=Conditions]
+
+\startsubsection[title={\lpr{ifabsnum} and \lpr {ifabsdim}}]
+
+There are two tests that we took from \PDFTEX:
+
+\startbuffer
+\ifabsnum -10 = 10
+ the same number
+\fi
+\ifabsdim -10pt = 10pt
+ the same dimension
+\fi
+\stopbuffer
+
+\typebuffer
+
+This gives
+
+\blank {\tt \getbuffer} \blank
+
+\stopsubsection
+
+\startsubsection[title={\lpr{ifcmpnum}, \lpr {ifcmpdim}, \lpr {ifnumval}, \lpr
+{ifdimval}, \lpr {ifchknum} and \lpr {ifchkdim}}]
+
+\topicindex {conditions+numbers}
+\topicindex {conditions+dimensions}
+\topicindex {numbers}
+\topicindex {dimensions}
+
+New are the ones that compare two numbers or dimensions:
+
+\startbuffer
+\ifcmpnum 5 8 less \or equal \else more \fi
+\ifcmpnum 5 5 less \or equal \else more \fi
+\ifcmpnum 8 5 less \or equal \else more \fi
+\stopbuffer
+
+\typebuffer \blank {\tt \getbuffer} \blank
+
+and
+
+\startbuffer
+\ifcmpdim 5pt 8pt less \or equal \else more \fi
+\ifcmpdim 5pt 5pt less \or equal \else more \fi
+\ifcmpdim 8pt 5pt less \or equal \else more \fi
+\stopbuffer
+
+\typebuffer \blank {\tt \getbuffer} \blank
+
+There are also some number and dimension tests. All four expose the \type {\else}
+branch when there is an error, but two also report if the number is less, equal
+or more than zero.
+
+\startbuffer
+\ifnumval -123 \or < \or = \or > \or ! \else ? \fi
+\ifnumval 0 \or < \or = \or > \or ! \else ? \fi
+\ifnumval 123 \or < \or = \or > \or ! \else ? \fi
+\ifnumval abc \or < \or = \or > \or ! \else ? \fi
+
+\ifdimval -123pt \or < \or = \or > \or ! \else ? \fi
+\ifdimval 0pt \or < \or = \or > \or ! \else ? \fi
+\ifdimval 123pt \or < \or = \or > \or ! \else ? \fi
+\ifdimval abcpt \or < \or = \or > \or ! \else ? \fi
+\stopbuffer
+
+\typebuffer \blank {\tt \getbuffer} \blank
+
+\startbuffer
+\ifchknum -123 \or okay \else bad \fi
+\ifchknum 0 \or okay \else bad \fi
+\ifchknum 123 \or okay \else bad \fi
+\ifchknum abc \or okay \else bad \fi
+
+\ifchkdim -123pt \or okay \else bad \fi
+\ifchkdim 0pt \or okay \else bad \fi
+\ifchkdim 123pt \or okay \else bad \fi
+\ifchkdim abcpt \or okay \else bad \fi
+\stopbuffer
+
+\typebuffer \blank {\tt \getbuffer} \blank
+
+\stopsubsection
+
+\startsubsection[title={\lpr {iftok} and \lpr {ifcstok}}]
+
+\topicindex {conditions+tokens}
+\topicindex {tokens}
+
+Comparing tokens and macros can be done with \type {\ifx}. Two extra test are
+provided in \LUAMETATEX:
+
+\startbuffer
+\def\ABC{abc} \def\DEF{def} \def\PQR{abc} \newtoks\XYZ \XYZ {abc}
+
+\iftok{abc}{def}\relax (same) \else [different] \fi
+\iftok{abc}{abc}\relax [same] \else (different) \fi
+\iftok\XYZ {abc}\relax [same] \else (different) \fi
+
+\ifcstok\ABC \DEF\relax (same) \else [different] \fi
+\ifcstok\ABC \PQR\relax [same] \else (different) \fi
+\ifcstok{abc}\ABC\relax [same] \else (different) \fi
+\stopbuffer
+
+\typebuffer \startpacked[blank] {\tt\nospacing\getbuffer} \stoppacked
+
+You can check if a macro is is defined as protected with \type {\ifprotected}
+while frozen macros can be tested with \type {\iffrozen}. A provisional \type
+{\ifusercmd} tests will check if a command is defined at the user level (and this
+one might evolve).
+
+\stopsubsection
+
+\startsubsection[title={\lpr {ifcondition}}]
+
+\topicindex {conditions}
+
+This is a somewhat special one. When you write macros conditions need to be
+properly balanced in order to let \TEX's fast branch skipping work well. This new
+primitive is basically a no||op flagged as a condition so that the scanner can
+recognize it as an if|-|test. However, when a real test takes place the work is
+done by what follows, in the next example \tex {something}.
+
+\starttyping
+\unexpanded\def\something#1#2%
+ {\edef\tempa{#1}%
+ \edef\tempb{#2}
+ \ifx\tempa\tempb}
+
+\ifcondition\something{a}{b}%
+ \ifcondition\something{a}{a}%
+ true 1
+ \else
+ false 1
+ \fi
+\else
+ \ifcondition\something{a}{a}%
+ true 2
+ \else
+ false 2
+ \fi
+\fi
+\stoptyping
+
+If you are familiar with \METAPOST, this is a bit like \type {vardef} where the macro
+has a return value. Here the return value is a test.
+
+Experiments with something \type {\ifdef} actually worked ok but were rejected
+because in the end it gave no advantage so this generic one has to do. The \type
+{\ifcondition} test is basically is a no|-|op except when branches are skipped.
+However, when a test is expected, the scanner gobbles it and the next test result
+is used. Here is an other example:
+
+\startbuffer
+\def\mytest#1%
+ {\ifabsdim#1>0pt\else
+ \expandafter \unless
+ \fi
+ \iftrue}
+
+\ifcondition\mytest{10pt}\relax non-zero \else zero \fi
+\ifcondition\mytest {0pt}\relax non-zero \else zero \fi
+\stopbuffer
+
+\typebuffer \blank {\tt \getbuffer} \blank
+
+The last expansion in a macro like \type {\mytest} has to be a condition and here
+we use \type {\unless} to negate the result.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {orelse}}]
+
+Sometimes you have successive tests that, when laid out in the source lead to
+deep trees. The \type {\ifcase} test is an exception. Experiments with \type
+{\ifcasex} worked out fine but eventually were rejected because we have many
+tests so it would add a lot. As \LUAMETATEX\ permitted more experiments,
+eventually an alternative was cooked up, one that has some restrictions but is
+relative lightweight. It goes like this:
+
+\starttyping
+\ifnum\count0<10
+ less
+\orelse\ifnum\count0=10
+ equal
+\else
+ more
+\fi
+\stoptyping
+
+The \type {\orelse} has to be followed by one of the if test commands, except
+\type {\ifcondition}, and there can be an \type {\unless} in front of such a
+command. These restrictions make it possible to stay in the current condition
+(read: at the same level). If you need something more complex, using \type
+{\orelse} is probably unwise anyway. In case you wonder about performance, there
+is a little more checking needed when skipping branches but that can be
+neglected. There is some gain due to staying at the same level but that is only
+measurable when you runs tens of millions of complex tests and in that case it is
+very likely to drown in the real action. It's a convenience mechanism, in the
+sense that it can make your code look a bit easier to follow.
+
+There is a nice side effect of this mechanism. When you define:
+
+\starttyping
+\def\quitcondition{\orelse\iffalse}
+\stoptyping
+
+you can do this:
+
+\starttyping
+\ifnum\count0<10
+ less
+\orelse\ifnum\count0=10
+ equal
+ \quitcondition
+ indeed
+\else
+ more
+\fi
+\stoptyping
+
+Of course it is only useful at the right level, so you might end up with cases like
+
+\starttyping
+\ifnum\count0<10
+ less
+\orelse\ifnum\count0=10
+ equal
+ \ifnum\count2=30
+ \expandafter\quitcondition
+ \fi
+ indeed
+\else
+ more
+\fi
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\lpr {ifprotected}, \lpr {frozen}, \lpr {iffrozen} and \lpr {ifusercmd}}]
+
+These checkers deal with control sequences. You can check if a command is a
+protected one, that is, defined with the \type {\protected} prefix. A command is
+frozen when it has been defined with the \type {\frozen} prefix. Beware: only
+macros can be frozen. A user command is a command that is not part of the
+predefined set of commands. This is an experimental command.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Boxes, rules and leaders}]
+
+\startsubsection[title={\lpr {outputbox}}]
+
+\topicindex {output}
+
+This integer parameter allows you to alter the number of the box that will be
+used to store the page sent to the output routine. Its default value is 255, and
+the acceptable range is from 0 to 65535.
+
+\startsyntax
+\outputbox = 12345
+\stopsyntax
+
+\stopsubsection
+
+\startsubsection[title={\prm {vpack}, \prm {hpack} and \prm {tpack}}]
+
+These three primitives are like \prm {vbox}, \prm {hbox} and \prm {vtop}
+but don't apply the related callbacks.
+
+\stopsubsection
+
+\startsubsection[title={\prm {vsplit}}]
+
+\topicindex {splitting}
+
+The \prm {vsplit} primitive has to be followed by a specification of the required
+height. As alternative for the \type {to} keyword you can use \type {upto} to get
+a split of the given size but result has the natural dimensions then.
+
+\stopsubsection
+
+\startsubsection[title={Images and reused box objects},reference=sec:imagedandforms]
+
+In original \TEX\ image support is dealt with via specials. It's not a native
+feature of the engine. All that \TEX\ cares about is dimensions, so in practice
+that meant: using a box with known dimensions that wraps a special that instructs
+the backend to include an image. The wrapping is needed because a special itself
+is a whatsit and as such has no dimensions.
+
+In \PDFTEX\ a special whatsit for images was introduced and that one {\em has}
+dimensions. As a consequence, in several places where the engine deals with the
+dimensions of nodes, it now has to check the details of whatsits. By inheriting
+code from \PDFTEX, the \LUATEX\ engine also had that property. However, at some
+point this approach was abandoned and a more natural trick was used: images (and
+box resources) became a special kind of rules, and as rules already have
+dimensions, the code could be simplified.
+
+When direction nodes and localpar nodes also became first class nodes, whatsits
+again became just that: nodes representing whatever you want, but without
+dimensions, and therefore they could again be ignored when dimensions mattered.
+And, because images were disguised as rules, as mentioned, their dimensions
+automatically were taken into account. This seperation between front and backend
+cleaned up the code base already quite a bit.
+
+In \LUAMETATEX\ we still have the image specific subtypes for rules, but the
+engine never looks at subtypes of rules. That was up to the backend. This means
+that image support is not present in \LUAMETATEX. When an image specification was
+parsed the special properties, like the filename, or additional attributes, were
+stored in the backend and all that \LUATEX\ does is registering a reference to an
+image's specification in the rule node. But, having no backend means nothing is
+stored, which in turn would make the image inclusion primitives kind of weird.
+
+Therefore you need to realize that contrary to \LUATEX, {\em in \LUAMETATEX\
+support for images and box reuse is not built in}! However, we can assume that
+an implementation uses rules in a similar fashion as \LUATEX\ does. So, you can
+still consider images and box reuse to be core concepts. Here we just mention the
+primitives that \LUATEX\ provides. They are not available in the engine but can
+of course be implemented in \LUA.
+
+\starttabulate[|l|p|]
+\DB command \BC explanation \NC \NR
+\TB
+\NC \lpr {saveboxresource} \NC save the box as an object to be included later \NC \NR
+\NC \lpr {saveimageresource} \NC save the image as an object to be included later \NC \NR
+\NC \lpr {useboxresource} \NC include the saved box object here (by index) \NC \NR
+\NC \lpr {useimageresource} \NC include the saved image object here (by index) \NC \NR
+\NC \lpr {lastsavedboxresourceindex} \NC the index of the last saved box object \NC \NR
+\NC \lpr {lastsavedimageresourceindex} \NC the index of the last saved image object \NC \NR
+\NC \lpr {lastsavedimageresourcepages} \NC the number of pages in the last saved image object \NC \NR
+\LL
+\stoptabulate
+
+An implementation probably should accept the usual optional dimension parameters
+for \type {\use...resource} in the same format as for rules. With images, these
+dimensions are then used instead of the ones given to \lpr {useimageresource} but
+the original dimensions are not overwritten, so that a \lpr {useimageresource}
+without dimensions still provides the image with dimensions defined by \lpr
+{saveimageresource}. These optional parameters are not implemented for \lpr
+{saveboxresource}.
+
+\starttyping
+\useimageresource width 20mm height 10mm depth 5mm \lastsavedimageresourceindex
+\useboxresource width 20mm height 10mm depth 5mm \lastsavedboxresourceindex
+\stoptyping
+
+Examples or optional entries are \type {attr} and \type {resources} that accept a
+token list, and the \type {type} key. When set to non|-|zero the \type {/Type}
+entry is omitted. A value of 1 or 3 still writes a \type {/BBox}, while 2 or 3
+will write a \type {/Matrix}. But, as said: this is entirely up to the backend.
+Generic macro packages (like \type {tikz}) can use these assumed primitives so
+one can best provide them. It is probably, for historic reasons, the only more or
+less standardized image inclusion interface one can expect to work in all macro
+packages.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {hpack}, \lpr {vpack} and \lpr {tpack}}]
+
+These three primitives are the equivalents of \type {\hbox}, \type {\vbox} and
+\type {\vtop} but they don't trigger the packaging related callbacks. Of course
+one never know if content needs a treatment so using them should be done with
+care.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {nohrule} and \lpr {novrule}}]
+
+\topicindex {rules}
+
+Because introducing a new keyword can cause incompatibilities, two new primitives
+were introduced: \lpr {nohrule} and \lpr {novrule}. These can be used to
+reserve space. This is often more efficient than creating an empty box with fake
+dimensions.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {gleaders}},reference=sec:gleaders]
+
+\topicindex {leaders}
+
+This type of leaders is anchored to the origin of the box to be shipped out. So
+they are like normal \prm {leaders} in that they align nicely, except that the
+alignment is based on the {\it largest\/} enclosing box instead of the {\it
+smallest\/}. The \type {g} stresses this global nature.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Languages}]
+
+\startsubsection[title={\lpr {hyphenationmin}}]
+
+\topicindex {languages}
+\topicindex {hyphenation}
+
+This primitive can be used to set the minimal word length, so setting it to a value
+of~$5$ means that only words of 6 characters and more will be hyphenated, of course
+within the constraints of the \prm {lefthyphenmin} and \prm {righthyphenmin}
+values (as stored in the glyph node). This primitive accepts a number and stores
+the value with the language.
+
+\stopsubsection
+
+\startsubsection[title={\prm {boundary}, \prm {noboundary}, \prm {protrusionboundary} and \prm {wordboundary}}]
+
+The \prm {noboundary} command is used to inject a whatsit node but now injects a normal
+node with type \nod {boundary} and subtype~0. In addition you can say:
+
+\starttyping
+x\boundary 123\relax y
+\stoptyping
+
+This has the same effect but the subtype is now~1 and the value~123 is stored.
+The traditional ligature builder still sees this as a cancel boundary directive
+but at the \LUA\ end you can implement different behaviour. The added benefit of
+passing this value is a side effect of the generalization. The subtypes~2 and~3
+are used to control protrusion and word boundaries in hyphenation and have
+related primitives.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Control and debugging}]
+
+\startsubsection[title={Tracing}]
+
+\topicindex {tracing}
+
+If \prm {tracingonline} is larger than~2, the node list display will also print
+the node number of the nodes.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {lastnodetype}, \lpr {lastnodesubtype}, \lpr
+{currentiftype} and \lpr {internalcodesmode}.}]
+
+The \ETEX\ command \type {\lastnodetype} is limited to some nodes. When the
+parameter \type {\internalcodesmode} is set to a non|-|zero value the normal
+(internally used) numbers are reported. The same is true for \type
+{\currentiftype}, as we have more conditionals and also use a different order.
+The \type {\lastnodesubtype} is a bonus.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Files}]
+
+\startsubsection[title={File syntax}]
+
+\topicindex {files+names}
+
+\LUAMETATEX\ will accept a braced argument as a file name:
+
+\starttyping
+\input {plain}
+\openin 0 {plain}
+\stoptyping
+
+This allows for embedded spaces, without the need for double quotes. Macro
+expansion takes place inside the argument.
+
+The \lpr {tracingfonts} primitive that has been inherited from \PDFTEX\ has
+been adapted to support variants in reporting the font. The reason for this
+extension is that a csname not always makes sense. The zero case is the default.
+
+\starttabulate[|l|l|]
+\DB value \BC reported \NC \NR
+\TB
+\NC \type{0} \NC \type{\foo xyz} \NC \NR
+\NC \type{1} \NC \type{\foo (bar)} \NC \NR
+\NC \type{2} \NC \type{<bar> xyz} \NC \NR
+\NC \type{3} \NC \type{<bar @ ..pt> xyz} \NC \NR
+\NC \type{4} \NC \type{<id>} \NC \NR
+\NC \type{5} \NC \type{<id: bar>} \NC \NR
+\NC \type{6} \NC \type{<id: bar @ ..pt> xyz} \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={Writing to file}]
+
+\topicindex {files+writing}
+
+You can now open upto 127 files with \prm {openout}. When no file is open writes
+will go to the console and log. The \type {write} related primitives have to be
+implemented as part of a backend! As a consequence a system command is no longer
+possible but one can use \type {os.execute} to do the same.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Math}]
+
+\topicindex {math}
+
+We will cover math extensions in its own chapter because not only the font
+subsystem and spacing model have been enhanced (thereby introducing many new
+primitives) but also because some more control has been added to existing
+functionality. Much of this relates to the different approaches of traditional
+\TEX\ fonts and \OPENTYPE\ math.
+
+\stopsection
+
+\startsection[title={Fonts}]
+
+\topicindex {fonts}
+
+Like math, we will cover fonts extensions in its own chapter. Here we stick to
+mentioning that loading fonts is different in \LUAMETATEX. As in \LUATEX\ we have
+the extra primitives \type {\fontid} and \type {\setfontid}, \type {\noligs} and
+\type {\nokerns}, and \type {\nospaces}. The other new primitives in \LUATEX\
+have been dropped.
+
+\stopsection
+
+\startsection[title=Directions]
+
+\topicindex {\OMEGA}
+\topicindex {\ALEPH}
+\topicindex {directions}
+
+\startsubsection[title={Two directions}]
+
+The directional model in \LUAMETATEX\ is a simplified version the the model used
+in \LUATEX. In fact, not much is happening at all: we only register a change in
+direction.
+
+\stopsubsection
+
+\startsubsection[title={How it works}]
+
+The approach is that we try to make node lists balanced but also try to avoid
+some side effects. What happens is quite intuitive if we forget about spaces
+(turned into glue) but even there what happens makes sense if you look at it in
+detail. However that logic makes in|-|group switching kind of useless when no
+properly nested grouping is used: switching from right to left several times
+nested, results in spacing ending up after each other due to nested mirroring. Of
+course a sane macro package will manage this for the user but here we are
+discussing the low level injection of directional information.
+
+This is what happens:
+
+\starttyping
+\textdirection 1 nur {\textdirection 0 run \textdirection 1 NUR} nur
+\stoptyping
+
+This becomes stepwise:
+
+\startnarrower
+\starttyping
+injected: [push 1]nur {[push 0]run [push 1]NUR} nur
+balanced: [push 1]nur {[push 0]run [pop 0][push 1]NUR[pop 1]} nur[pop 0]
+result : run {RUNrun } run
+\stoptyping
+\stopnarrower
+
+And this:
+
+\starttyping
+\textdirection 1 nur {nur \textdirection 0 run \textdirection 1 NUR} nur
+\stoptyping
+
+becomes:
+
+\startnarrower
+\starttyping
+injected: [+TRT]nur {nur [+TLT]run [+TRT]NUR} nur
+balanced: [+TRT]nur {nur [+TLT]run [-TLT][+TRT]NUR[-TRT]} nur[-TRT]
+result : run {run RUNrun } run
+\stoptyping
+\stopnarrower
+
+Now, in the following examples watch where we put the braces:
+
+\startbuffer
+\textdirection 1 nur {{\textdirection 0 run} {\textdirection 1 NUR}} nur
+\stopbuffer
+
+\typebuffer
+
+This becomes:
+
+\startnarrower
+\getbuffer
+\stopnarrower
+
+Compare this to:
+
+\startbuffer
+\textdirection 1 nur {{\textdirection 0 run }{\textdirection 1 NUR}} nur
+\stopbuffer
+
+\typebuffer
+
+Which renders as:
+
+\startnarrower
+\getbuffer
+\stopnarrower
+
+So how do we deal with the next?
+
+\startbuffer
+\def\ltr{\textdirection 0\relax}
+\def\rtl{\textdirection 1\relax}
+
+run {\rtl nur {\ltr run \rtl NUR \ltr run \rtl NUR} nur}
+run {\ltr run {\rtl nur \ltr RUN \rtl nur \ltr RUN} run}
+\stopbuffer
+
+\typebuffer
+
+It gets typeset as:
+
+\startnarrower
+\startlines
+\getbuffer
+\stoplines
+\stopnarrower
+
+We could define the two helpers to look back, pick up a skip, remove it and
+inject it after the dir node. But that way we loose the subtype information that
+for some applications can be handy to be kept as|-|is. This is why we now have a
+variant of \lpr {textdirection} which injects the balanced node before the skip.
+Instead of the previous definition we can use:
+
+\startbuffer[def]
+\def\ltr{\linedirection 0\relax}
+\def\rtl{\linedirection 1\relax}
+\stopbuffer
+
+\typebuffer[def]
+
+and this time:
+
+\startbuffer[txt]
+run {\rtl nur {\ltr run \rtl NUR \ltr run \rtl NUR} nur}
+run {\ltr run {\rtl nur \ltr RUN \rtl nur \ltr RUN} run}
+\stopbuffer
+
+\typebuffer[txt]
+
+comes out as a properly spaced:
+
+\startnarrower
+\startlines
+\getbuffer[def,txt]
+\stoplines
+\stopnarrower
+
+Anything more complex that this, like combination of skips and penalties, or
+kerns, should be handled in the input or macro package because there is no way we
+can predict the expected behaviour. In fact, the \lpr {linedir} is just a
+convenience extra which could also have been implemented using node list parsing.
+
+\stopsubsection
+
+\startsubsection[title={Controlling glue with \lpr {breakafterdirmode}}]
+
+Glue after a dir node is ignored in the linebreak decision but you can bypass that
+by setting \lpr {breakafterdirmode} to~\type {1}. The following table shows the
+difference. Watch your spaces.
+
+\def\ShowSome#1{%
+ \BC \type{#1}
+ \NC \breakafterdirmode\zerocount\hsize\zeropoint#1
+ \NC
+ \NC \breakafterdirmode\plusone\hsize\zeropoint#1
+ \NC
+ \NC \NR
+}
+
+\starttabulate[|l|Tp(1pt)|w(5em)|Tp(1pt)|w(5em)|]
+ \DB
+ \BC \type{0}
+ \NC
+ \BC \type{1}
+ \NC
+ \NC \NR
+ \TB
+ \ShowSome{pre {\textdirection 0 xxx} post}
+ \ShowSome{pre {\textdirection 0 xxx }post}
+ \ShowSome{pre{ \textdirection 0 xxx} post}
+ \ShowSome{pre{ \textdirection 0 xxx }post}
+ \ShowSome{pre { \textdirection 0 xxx } post}
+ \ShowSome{pre {\textdirection 0\relax\space xxx} post}
+ \LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={Controling parshapes with \lpr {shapemode}}]
+
+Another adaptation to the \ALEPH\ directional model is control over shapes driven
+by \prm {hangindent} and \prm {parshape}. This is controlled by a new parameter
+\lpr {shapemode}:
+
+\starttabulate[|c|l|l|]
+\DB value \BC \prm {hangindent} \BC \prm {parshape} \NC \NR
+\TB
+\BC \type{0} \NC normal \NC normal \NC \NR
+\BC \type{1} \NC mirrored \NC normal \NC \NR
+\BC \type{2} \NC normal \NC mirrored \NC \NR
+\BC \type{3} \NC mirrored \NC mirrored \NC \NR
+\LL
+\stoptabulate
+
+The value is reset to zero (like \prm {hangindent} and \prm {parshape})
+after the paragraph is done with. You can use negative values to prevent
+this. In \in {figure} [fig:shapemode] a few examples are given.
+
+\startplacefigure[reference=fig:shapemode,title={The effect of \type {shapemode}.}]
+ \startcombination[2*3]
+ {\ruledvbox \bgroup \setuptolerance[verytolerant]
+ \hsize .45\textwidth \switchtobodyfont[6pt]
+ \pardirection 0 \textdirection 0
+ \hangindent 40pt \hangafter -3
+ \leftskip10pt \input tufte \par
+ \egroup} {TLT: hangindent}
+ {\ruledvbox \bgroup \setuptolerance[verytolerant]
+ \hsize .45\textwidth \switchtobodyfont[6pt]
+ \pardirection 0 \textdirection 0
+ \parshape 4 0pt .8\hsize 10pt .8\hsize 20pt .8\hsize 0pt \hsize
+ \input tufte \par
+ \egroup} {TLT: parshape}
+ {\ruledvbox \bgroup \setuptolerance[verytolerant]
+ \hsize .45\textwidth \switchtobodyfont[6pt]
+ \pardirection 1 \textdirection 1
+ \hangindent 40pt \hangafter -3
+ \leftskip10pt \input tufte \par
+ \egroup} {TRT: hangindent mode 0}
+ {\ruledvbox \bgroup \setuptolerance[verytolerant]
+ \hsize .45\textwidth \switchtobodyfont[6pt]
+ \pardirection 1 \textdirection 1
+ \parshape 4 0pt .8\hsize 10pt .8\hsize 20pt .8\hsize 0pt \hsize
+ \input tufte \par
+ \egroup} {TRT: parshape mode 0}
+ {\ruledvbox \bgroup \setuptolerance[verytolerant]
+ \hsize .45\textwidth \switchtobodyfont[6pt]
+ \shapemode=3
+ \pardirection 1 \textdirection 1
+ \hangindent 40pt \hangafter -3
+ \leftskip10pt \input tufte \par
+ \egroup} {TRT: hangindent mode 1 & 3}
+ {\ruledvbox \bgroup \setuptolerance[verytolerant]
+ \hsize .45\textwidth \switchtobodyfont[6pt]
+ \shapemode=3
+ \pardirection 1 \textdirection 1
+ \parshape 4 0pt .8\hsize 10pt .8\hsize 20pt .8\hsize 0pt \hsize
+ \input tufte \par
+ \egroup} {TRT: parshape mode 2 & 3}
+ \stopcombination
+\stopplacefigure
+
+We have \type {\pardirection}, \type {\textdirection}, \type {\mathdirection} and
+\type {\linedirection} that is like \type {\textdirection} but with some
+additional (inline) glue checking.
+
+\stopsubsection
+
+\startsubsection[title=Orientations]
+
+As mentioned, the difference with \LUATEX\ is that we only have numeric
+directions and that there are only two: left|-|to|-|right (\type {0}) and
+right|-|to|-|left (\type {1}). The direction of a box is set with \type
+{direction}.
+
+In addition to that boxes can now have an \type {orientation} keyword followed by
+optional \type {xoffset} and|/|or \type {yoffset} keywords. The offsets don't
+have consequences for the dimensions. The alternatives \type {xmove} and \type
+{ymove} on the contrary are reflected in the dimensions. Just play with them. The
+offsets and moves only are accepted when there is also an orientation, so no time
+is wasted on testing for these rarely used keywords. There are related primitives
+\type {\box...} that set these properties.
+
+As these are experimental it will not be explained here (yet). They are covered
+in the descriptions of the development of \LUAMETATEX: articles and|/|or
+documents in the \CONTEXT\ distribution. For now it is enough to know that the
+orientation can be up, down, left or right (rotated) and that it has some
+anchoring variants. Combined with the offsets this permits macro writers to
+provide solutions for top|-|down and bottom|-|up writing directions, something
+that is rather macro package specific and used for scripts that need
+manipulations anyway. The \quote {old} vertical directions were never okay and
+therefore not used.
+
+There are a couple of properties in boxes that you can set and query but that
+only really take effect when the backend supports them. When usage on \CONTEXT\
+shows that is't okay, they will become official, so we just mention them: \type
+{\boxdirection}, \type {\boxattr}, \type {\boxorientation}, \type {\boxxoffset},
+\type {\boxyoffset}, \type {\boxxmove}, \type {\boxymove} and \type {\boxtotal}.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title=Expressions]
+
+The \type {*expr} parsers now accept \type {:} as operator for integer division
+(the \type {/} operators does rounding. This can be used for division compatible
+with \type {\divide}. I'm still wondering if adding a couple of bit operators
+makes sense (for integers).
+
+\stopsection
+
+\startsection[title=Nodes]
+
+The \ETEX\ primitive \type {\lastnodetype} is not honest in reporting the
+internal numbers as it uses its own values. But you can set \type
+{\internalcodesmode} to a non|-|zero value to get the real id's instead. In
+addition there is \type {\lastnodesubtype}.
+
+Another last one is \type {\lastnamedcs} which holds the last match but this one
+should be used with care because one never knows if in the meantime something
+else \quote {last} has been seen.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-firstpage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-firstpage.tex
new file mode 100644
index 00000000000..83fb40df12b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-firstpage.tex
@@ -0,0 +1,36 @@
+\environment luametatex-style
+
+\startcomponent luametatex-firstpage
+
+\startstandardmakeup
+
+ \start
+ \raggedleft
+ \definedfont[Bold*default at 48pt]
+ \setupinterlinespace
+ \blue \documentvariable{manual} \endgraf Reference \endgraf Manual \endgraf
+ \stop
+
+ \vfill
+
+ \definedfont[Bold*default at 12pt]
+
+ \starttabulate[|l|l|]
+ \NC copyright \EQ Lua\TeX\ development team \NC \NR
+ \NC \EQ \CONTEXT\ development team \NC \NR
+ \NC more info \EQ www.luatex.org \NC \NR
+ \NC \EQ contextgarden.net \NC \NR
+ \NC version \EQ \currentdate \doifsomething{\documentvariable{snapshot}}{(snapshot \documentvariable{snapshot})} \NC \NR
+ \stoptabulate
+
+\stopstandardmakeup
+
+\setupbackgrounds
+ [leftpage]
+ [setups=pagenumber:left]
+
+\setupbackgrounds
+ [rightpage]
+ [setups=pagenumber:right]
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-fonts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-fonts.tex
new file mode 100644
index 00000000000..917ebfeb86f
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-fonts.tex
@@ -0,0 +1,597 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-fonts
+
+\startchapter[reference=fonts,title={Fonts}]
+
+\startsection[title={Introduction}]
+
+Only traditional font support is built in, anything more needs to be implemented
+in \LUA. This conforms to the \LUATEX\ philosophy. When you pass a font to the
+frontend only the dimensions matter, as these are used in typesetting, and
+optionally ligatures and kerns when you rely on the built|-|in font handler. For
+math some extra data is needed, like information about extensibles and next in
+size glyphs. You can of course put more information in your \LUA\ tables because
+when such a table is passed to \TEX\ only that what is needed is filtered from
+it.
+
+Because there is no built|-|in backend, virtual font information is not used. If
+you want to be compatible you'd better make sure that your tables are okay, and
+in that case you can best consult the \LUATEX\ manual. For instance, parameters
+like \type {extend} are backend related and the standard \LUATEX\ backend sets
+the standard here.
+
+\stopsection
+
+\startsection[title={Defining fonts}]
+
+All \TEX\ fonts are represented to \LUA\ code as tables, and internally as
+\CCODE\ structures. All keys in the table below are saved in the internal font
+structure if they are present in the table passed to \type {font.define}. When
+the callback is set, which is needed for \type {\font} to work, its function
+gets the name and size passed, and it has to return a valid font identifier (a
+positive number).
+
+For the engine to work well, the following information has to be present at
+the font level:
+
+\starttabulate[|l|l|pl|]
+\DB key \BC value type \BC description \NC \NR
+\TB
+\NC \type {name} \NC string \NC metric (file) name \NC \NR
+\NC \type {characters} \NC table \NC the defined glyphs of this font \NC \NR
+\NC \type {designsize} \NC number \NC expected size (default: 655360 == 10pt) \NC \NR
+\NC \type {fonts} \NC table \NC locally used fonts \NC \NR
+\NC \type {hyphenchar} \NC number \NC default: \TEX's \prm {hyphenchar} \NC \NR
+\NC \type {parameters} \NC hash \NC default: 7 parameters, all zero \NC \NR
+\NC \type {size} \NC number \NC the required scaling (by default the same as designsize) \NC \NR
+\NC \type {skewchar} \NC number \NC default: \TEX's \prm {skewchar} \NC \NR
+\NC \type {stretch} \NC number \NC the \quote {stretch} \NC \NR
+\NC \type {shrink} \NC number \NC the \quote {shrink} \NC \NR
+\NC \type {step} \NC number \NC the \quote {step} \NC \NR
+\NC \type {nomath} \NC boolean \NC this key allows a minor speedup for text fonts; if it
+ is present and true, then \LUATEX\ will not check the
+ character entries for math|-|specific keys \NC \NR
+\NC \type {oldmath} \NC boolean \NC this key flags a font as representing an old school \TEX\
+ math font and disables the \OPENTYPE\ code path \NC \NR
+\LL
+\stoptabulate
+
+The \type {parameters} is a hash with mixed key types. There are seven possible
+string keys, as well as a number of integer indices (these start from 8 up). The
+seven strings are actually used instead of the bottom seven indices, because that
+gives a nicer user interface.
+
+The names and their internal remapping are:
+
+\starttabulate[|l|c|]
+\DB name \BC remapping \NC \NR
+\TB
+\NC \type {slant} \NC 1 \NC \NR
+\NC \type {space} \NC 2 \NC \NR
+\NC \type {space_stretch} \NC 3 \NC \NR
+\NC \type {space_shrink} \NC 4 \NC \NR
+\NC \type {x_height} \NC 5 \NC \NR
+\NC \type {quad} \NC 6 \NC \NR
+\NC \type {extra_space} \NC 7 \NC \NR
+\LL
+\stoptabulate
+
+The \type {characters} table is a \LUA\ hash table where the keys are integers.
+When a character in the input is turned into a glyph node, it gets a character
+code that normally refers to an entry in that table. For proper paragraph
+building and math rendering the following fields can be present in an entry in
+the \type {characters} table. You can of course add all kind of extra fields. The
+engine only uses those that it needs for typesetting a paragraph or formula. The
+subtables that define ligatures and kerns are also hashes with integer keys, and
+these indices should point to entries in the main characters table.
+
+Providing ligatures and kerns this way permits \TEX\ to construct ligatures and
+add inter|-|character kerning. However, normally you will use an \OPENTYPE\ font
+in combination with \LUA\ code that does this. In \CONTEXT\ we have base mode
+that uses the engine, and node mode that uses \LUA. A monospaced font normally
+has no ligatures and kerns and is normally not processed at all.
+
+\starttabulate[|l|l|pl|]
+\DB key \BC type \BC description \NC\NR
+\TB
+\NC \type {width} \NC number \NC width in sp (default 0) \NC\NR
+\NC \type {height} \NC number \NC height in sp (default 0) \NC\NR
+\NC \type {depth} \NC number \NC depth in sp (default 0) \NC\NR
+\NC \type {italic} \NC number \NC italic correction in sp (default 0) \NC\NR
+\NC \type {top_accent} \NC number \NC top accent alignment place in sp (default zero) \NC\NR
+\NC \type {bot_accent} \NC number \NC bottom accent alignment place, in sp (default zero) \NC\NR
+\NC \type {left_protruding} \NC number \NC left protruding factor (\lpr {lpcode}) \NC\NR
+\NC \type {right_protruding} \NC number \NC right protruding factor (\lpr {rpcode}) \NC\NR
+\NC \type {expansion_factor} \NC number \NC expansion factor (\lpr {efcode}) \NC\NR
+\NC \type {next} \NC number \NC \quote {next larger} character index \NC\NR
+\NC \type {extensible} \NC table \NC constituent parts of an extensible recipe \NC\NR
+\NC \type {vert_variants} \NC table \NC constituent parts of a vertical variant set \NC \NR
+\NC \type {horiz_variants} \NC table \NC constituent parts of a horizontal variant set \NC \NR
+\NC \type {kerns} \NC table \NC kerning information \NC\NR
+\NC \type {ligatures} \NC table \NC ligaturing information \NC\NR
+\NC \type {mathkern} \NC table \NC math cut-in specifications \NC\NR
+\LL
+\stoptabulate
+
+For example, here is the character \quote {f} (decimal 102) in the font \type
+{cmr10 at 10pt}. The numbers that represent dimensions are in scaled points.
+
+\starttyping
+[102] = {
+ ["width"] = 200250,
+ ["height"] = 455111,
+ ["depth"] = 0,
+ ["italic"] = 50973,
+ ["kerns"] = {
+ [63] = 50973,
+ [93] = 50973,
+ [39] = 50973,
+ [33] = 50973,
+ [41] = 50973
+ },
+ ["ligatures"] = {
+ [102] = { ["char"] = 11, ["type"] = 0 },
+ [108] = { ["char"] = 13, ["type"] = 0 },
+ [105] = { ["char"] = 12, ["type"] = 0 }
+ }
+}
+\stoptyping
+
+
+Two very special string indexes can be used also: \type {left_boundary} is a
+virtual character whose ligatures and kerns are used to handle word boundary
+processing. \type {right_boundary} is similar but not actually used for anything
+(yet).
+
+The values of \type {top_accent}, \type {bot_accent} and \type {mathkern} are
+used only for math accent and superscript placement, see \at {page} [math] in
+this manual for details. The values of \type {left_protruding} and \type
+{right_protruding} are used only when \lpr {protrudechars} is non-zero. Whether
+or not \type {expansion_factor} is used depends on the font's global expansion
+settings, as well as on the value of \lpr {adjustspacing}.
+
+A math character can have a \type {next} field that points to a next larger
+shape. However, the presence of \type {extensible} will overrule \type {next}, if
+that is also present. The \type {extensible} field in turn can be overruled by
+\type {vert_variants}, the \OPENTYPE\ version. The \type {extensible} table is
+very simple:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC description \NC\NR
+\TB
+\NC \type{top} \NC number \NC top character index \NC\NR
+\NC \type{mid} \NC number \NC middle character index \NC\NR
+\NC \type{bot} \NC number \NC bottom character index \NC\NR
+\NC \type{rep} \NC number \NC repeatable character index \NC\NR
+\LL
+\stoptabulate
+
+The \type {horiz_variants} and \type {vert_variants} are arrays of components.
+Each of those components is itself a hash of up to five keys:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{glyph} \NC number \NC The character index. Note that this is an encoding number, not a name. \NC \NR
+\NC \type{extender} \NC number \NC One (1) if this part is repeatable, zero (0) otherwise. \NC \NR
+\NC \type{start} \NC number \NC The maximum overlap at the starting side (in scaled points). \NC \NR
+\NC \type{end} \NC number \NC The maximum overlap at the ending side (in scaled points). \NC \NR
+\NC \type{advance} \NC number \NC The total advance width of this item. It can be zero or missing,
+ then the natural size of the glyph for character \type {component}
+ is used. \NC \NR
+\LL
+\stoptabulate
+
+The \type {kerns} table is a hash indexed by character index (and \quote
+{character index} is defined as either a non|-|negative integer or the string
+value \type {right_boundary}), with the values of the kerning to be applied, in
+scaled points.
+
+The \type {ligatures} table is a hash indexed by character index (and \quote
+{character index} is defined as either a non|-|negative integer or the string
+value \type {right_boundary}), with the values being yet another small hash, with
+two fields:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC description \NC \NR
+\TB
+\NC \type{type} \NC number \NC the type of this ligature command, default 0 \NC \NR
+\NC \type{char} \NC number \NC the character index of the resultant ligature \NC \NR
+\LL
+\stoptabulate
+
+The \type {char} field in a ligature is required. The \type {type} field inside a
+ligature is the numerical or string value of one of the eight possible ligature
+types supported by \TEX. When \TEX\ inserts a new ligature, it puts the new glyph
+in the middle of the left and right glyphs. The original left and right glyphs
+can optionally be retained, and when at least one of them is kept, it is also
+possible to move the new \quote {insertion point} forward one or two places. The
+glyph that ends up to the right of the insertion point will become the next
+\quote {left}.
+
+\starttabulate[|l|c|l|l|]
+\DB textual (Knuth) \BC number \BC string \BC result \NC\NR
+\TB
+\NC \type{l + r =: n} \NC 0 \NC \type{=:} \NC \type{|n} \NC\NR
+\NC \type{l + r =:| n} \NC 1 \NC \type{=:|} \NC \type{|nr} \NC\NR
+\NC \type{l + r |=: n} \NC 2 \NC \type{|=:} \NC \type{|ln} \NC\NR
+\NC \type{l + r |=:| n} \NC 3 \NC \type{|=:|} \NC \type{|lnr} \NC\NR
+\NC \type{l + r =:|> n} \NC 5 \NC \type{=:|>} \NC \type{n|r} \NC\NR
+\NC \type{l + r |=:> n} \NC 6 \NC \type{|=:>} \NC \type{l|n} \NC\NR
+\NC \type{l + r |=:|> n} \NC 7 \NC \type{|=:|>} \NC \type{l|nr} \NC\NR
+\NC \type{l + r |=:|>> n} \NC 11 \NC \type{|=:|>>} \NC \type{ln|r} \NC\NR
+\LL
+\stoptabulate
+
+The default value is~0, and can be left out. That signifies a \quote {normal}
+ligature where the ligature replaces both original glyphs. In this table the~\type {|}
+indicates the final insertion point.
+
+\stopsection
+
+\startsection[reference=virtualfonts,title={Virtual fonts}]
+
+% \topicindex {fonts+virtual}
+
+Virtual fonts have been introduced to overcome limitations of good old \TEX. They
+were mostly used for providing a direct mapping from for instance accented
+characters onto a glyph. The backend was responsible for turning a reference to a
+character slot into a real glyph, possibly constructed from other glyphs. In our
+case there is no backend so there is also no need to pass this information
+through \TEX. But it can of course be part of the font information and because it is
+a kind of standard, we describe it here.
+
+A character is virtual when it has a \type {commands} array as part of the data.
+A virtual character can itself point to virtual characters but be careful with
+nesting as you can create loops and overflow the stack (which often indicates an
+error anyway).
+
+At the font level there can be a an (indexed) \type {fonts} table. The values are
+one- or two|-|key hashes themselves, each entry indicating one of the base fonts
+in a virtual font. In case your font is referring to itself in for instance a
+virtual font, you can use the \type {slot} command with a zero font reference,
+which indicates that the font itself is used. So, a table looks like this:
+
+\starttyping
+fonts = {
+ { name = "ptmr8a", size = 655360 },
+ { name = "psyr", size = 600000 },
+ { id = 38 }
+}
+\stoptyping
+
+The first referenced font (at index~1) in this virtual font is \type {ptrmr8a}
+loaded at 10pt, and the second is \type {psyr} loaded at a little over 9pt. The
+third one is a previously defined font that is known to \LUATEX\ as font id~38.
+The array index numbers are used by the character command definitions that are
+part of each character.
+
+The \type {commands} array is a hash where each item is another small array,
+with the first entry representing a command and the extra items being the
+parameters to that command. The allowed commands and their arguments are:
+
+\starttabulate[|l|l|l|p|]
+\DB command \BC arguments \BC type \BC description \NC \NR
+\TB
+\NC \type{font} \NC 1 \NC number \NC select a new font from the local \type {fonts} table \NC \NR
+\NC \type{char} \NC 1 \NC number \NC typeset this character number from the current font,
+ and move right by the character's width \NC \NR
+\NC \type{node} \NC 1 \NC node \NC output this node (list), and move right
+ by the width of this list\NC \NR
+\NC \type{slot} \NC 2 \NC 2 numbers \NC a shortcut for the combination of a font and char command\NC \NR
+\NC \type{push} \NC 0 \NC \NC save current position\NC \NR
+\NC \type{nop} \NC 0 \NC \NC do nothing \NC \NR
+\NC \type{pop} \NC 0 \NC \NC pop position \NC \NR
+\NC \type{rule} \NC 2 \NC 2 numbers \NC output a rule $ht*wd$, and move right. \NC \NR
+\NC \type{down} \NC 1 \NC number \NC move down on the page \NC \NR
+\NC \type{right} \NC 1 \NC number \NC move right on the page \NC \NR
+\NC \type{special} \NC 1 \NC string \NC output a \prm {special} command \NC \NR
+\NC \type{pdf} \NC 2 \NC 2 strings \NC output a \PDF\ literal, the first string is one of \type {origin},
+ \type {page}, \type {text}, \type {font}, \type {direct} or \type {raw}; if you
+ have one string only \type {origin} is assumed \NC \NR
+\NC \type{lua} \NC 1 \NC string,
+ function \NC execute a \LUA\ script when the glyph is embedded; in case of a
+ function it gets the font id and character code passed \NC \NR
+\NC \type{image} \NC 1 \NC image \NC output an image (the argument can be either an \type {<image>} variable or an \type {image_spec} table) \NC \NR
+\NC \type{comment} \NC any \NC any \NC the arguments of this command are ignored \NC \NR
+\LL
+\stoptabulate
+
+When a font id is set to~0 then it will be replaced by the currently assigned
+font id. This prevents the need for hackery with future id's.
+
+The \type {pdf} option also accepts a \type {mode} keyword in which case the
+third argument sets the mode. That option will change the mode in an efficient
+way (passing an empty string would result in an extra empty lines in the \PDF\
+file. This option only makes sense for virtual fonts. The \type {font} mode only
+makes sense in virtual fonts. Modes are somewhat fuzzy and partially inherited
+from \PDFTEX.
+
+\starttabulate[|l|p|]
+\DB mode \BC description \NC \NR
+\TB
+\NC \type {origin} \NC enter page mode and set the position \NC \NR
+\NC \type {page} \NC enter page mode \NC \NR
+\NC \type {text} \NC enter text mode \NC \NR
+\NC \type {font} \NC enter font mode (kind of text mode, only in virtual fonts) \NC \NR
+\NC \type {always} \NC finish the current string and force a transform if needed \NC \NR
+\NC \type {raw} \NC finish the current string \NC \NR
+\LL
+\stoptabulate
+
+You always need to check what \PDF\ code is generated because there can be all
+kind of interferences with optimization in the backend and fonts are complicated
+anyway. Here is a rather elaborate glyph commands example using such keys:
+
+\starttyping
+...
+commands = {
+ { "push" }, -- remember where we are
+ { "right", 5000 }, -- move right about 0.08pt
+ { "font", 3 }, -- select the fonts[3] entry
+ { "char", 97 }, -- place character 97 (ASCII 'a')
+ -- { "slot", 2, 97 }, -- an alternative for the previous two
+ { "pop" }, -- go all the way back
+ { "down", -200000 }, -- move upwards by about 3pt
+ { "special", "pdf: 1 0 0 rg" } -- switch to red color
+ -- { "pdf", "origin", "1 0 0 rg" } -- switch to red color (alternative)
+ { "rule", 500000, 20000 } -- draw a bar
+ { "special", "pdf: 0 g" } -- back to black
+ -- { "pdf", "origin", "0 g" } -- back to black (alternative)
+}
+...
+\stoptyping
+
+The default value for \type {font} is always~1 at the start of the
+\type {commands} array. Therefore, if the virtual font is essentially only a
+re|-|encoding, then you do usually not have created an explicit \quote {font}
+command in the array.
+
+Rules inside of \type {commands} arrays are built up using only two dimensions:
+they do not have depth. For correct vertical placement, an extra \type {down}
+command may be needed.
+
+Regardless of the amount of movement you create within the \type {commands}, the
+output pointer will always move by exactly the width that was given in the \type
+{width} key of the character hash. Any movements that take place inside the \type
+{commands} array are ignored on the upper level.
+
+The special can have a \type {pdf:}, \type {pdf:origin:}, \type {pdf:page:},
+\type {pdf:direct:} or \type {pdf:raw:} prefix. When you have to concatenate
+strings using the \type {pdf} command might be more efficient.
+
+The fields mentioned above can be found in external fonts. It is good to keep in
+mind that we can extend this model, given that the backend knows what to do with
+it.
+
+\stopsection
+
+\startsection[title={Additional \TEX\ commands}]
+
+\startsubsection[title={Font syntax}]
+
+\topicindex {fonts}
+
+\LUATEX\ will accept a braced argument as a font name:
+
+\starttyping
+\font\myfont = {cmr10}
+\stoptyping
+
+This allows for embedded spaces, without the need for double quotes. Macro
+expansion takes place inside the argument.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {fontid} and \lpr {setfontid}}]
+
+\startsyntax
+\fontid\font
+\stopsyntax
+
+This primitive expands into a number. It is not a register so there is no need to
+prefix with \prm {number} (and using \prm {the} gives an error). The currently
+used font id is \fontid\font. Here are some more:
+
+\starttabulate[|l|c|c|]
+\DB style \BC command \BC font id \NC \NR
+\TB
+\NC normal \NC \type {\tf} \NC \tf \fontid\font \NC \NR
+\NC bold \NC \type {\bf} \NC \bf \fontid\font \NC \NR
+\NC italic \NC \type {\it} \NC \it \fontid\font \NC \NR
+\NC bold italic \NC \type {\bi} \NC \bi \fontid\font \NC \NR
+\LL
+\stoptabulate
+
+These numbers depend on the macro package used because each one has its own way
+of dealing with fonts. They can also differ per run, as they can depend on the
+order of loading fonts. For instance, when in \CONTEXT\ virtual math \UNICODE\
+fonts are used, we can easily get over a hundred ids in use. Not all ids have to
+be bound to a real font, after all it's just a number.
+
+The primitive \lpr {setfontid} can be used to enable a font with the given id,
+which of course needs to be a valid one.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {noligs} and \lpr {nokerns}}]
+
+\topicindex {ligatures+suppress}
+\topicindex {kerns+suppress}
+
+These primitives prohibit ligature and kerning insertion at the time when the
+initial node list is built by \LUATEX's main control loop. You can enable these
+primitives when you want to do node list processing of \quote {characters}, where
+\TEX's normal processing would get in the way.
+
+\startsyntax
+\noligs <integer>!crlf
+\nokerns <integer>
+\stopsyntax
+
+These primitives can also be implemented by overloading the ligature building and
+kerning functions, i.e.\ by assigning dummy functions to their associated
+callbacks. Keep in mind that when you define a font (using \LUA) you can also
+omit the kern and ligature tables, which has the same effect as the above.
+
+\stopsubsection
+
+\startsubsection[title={\type{\nospaces}}]
+
+\topicindex {spaces+suppress}
+
+This new primitive can be used to overrule the usual \prm {spaceskip} related
+heuristics when a space character is seen in a text flow. The value~\type{1}
+triggers no injection while \type{2} results in injection of a zero skip. In \in
+{figure} [fig:nospaces] we see the results for four characters separated by a
+space.
+
+\startplacefigure[reference=fig:nospaces,title={The \lpr {nospaces} options.}]
+\startcombination[3*2]
+ {\ruledhbox to 5cm{\vtop{\hsize 10mm\nospaces=0\relax x x x x \par}\hss}} {\type {0 / hsize 10mm}}
+ {\ruledhbox to 5cm{\vtop{\hsize 10mm\nospaces=1\relax x x x x \par}\hss}} {\type {1 / hsize 10mm}}
+ {\ruledhbox to 5cm{\vtop{\hsize 10mm\nospaces=2\relax x x x x \par}\hss}} {\type {2 / hsize 10mm}}
+ {\ruledhbox to 5cm{\vtop{\hsize 1mm\nospaces=0\relax x x x x \par}\hss}} {\type {0 / hsize 1mm}}
+ {\ruledhbox to 5cm{\vtop{\hsize 1mm\nospaces=1\relax x x x x \par}\hss}} {\type {1 / hsize 1mm}}
+ {\ruledhbox to 5cm{\vtop{\hsize 1mm\nospaces=2\relax x x x x \par}\hss}} {\type {2 / hsize 1mm}}
+\stopcombination
+\stopplacefigure
+
+\stopsubsection
+
+\startsubsection[title={\type{\protrusionboundary}}]
+
+\topicindex {protrusion}
+\topicindex {boundaries}
+
+The protrusion detection mechanism is enhanced a bit to enable a bit more complex
+situations. When protrusion characters are identified some nodes are skipped:
+
+\startitemize[packed,columns,two]
+\startitem zero glue \stopitem
+\startitem penalties \stopitem
+\startitem empty discretionaries \stopitem
+\startitem normal zero kerns \stopitem
+\startitem rules with zero dimensions \stopitem
+\startitem math nodes with a surround of zero \stopitem
+\startitem dir nodes \stopitem
+\startitem empty horizontal lists \stopitem
+\startitem local par nodes \stopitem
+\startitem inserts, marks and adjusts \stopitem
+\startitem boundaries \stopitem
+\startitem whatsits \stopitem
+\stopitemize
+
+Because this can not be enough, you can also use a protrusion boundary node to
+make the next node being ignored. When the value is~1 or~3, the next node will be
+ignored in the test when locating a left boundary condition. When the value is~2
+or~3, the previous node will be ignored when locating a right boundary condition
+(the search goes from right to left). This permits protrusion combined with for
+instance content moved into the margin:
+
+\starttyping
+\protrusionboundary1\llap{!\quad}«Who needs protrusion?»
+\stoptyping
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={The \LUA\ font library}][library=font]
+
+\startsubsection[title={Introduction}]
+
+The \LUA\ font library is reduced to a few commands. Contrary to \LUATEX\ there
+is no loading of \TFM\ or \VF\ files. The explanation of the following commands
+is in the \LUATEX\ manual.
+
+\starttabulate[|l|pl|]
+\DB function \BC description \NC\NR
+\TB
+\NC \type {current} \NC returns the id of the currently active font \NC \NR
+\NC \type {max} \NC returns the last assigned font identifier \NC \NR
+\NC \type {setfont} \NC enables a font setfont (sets the current font id) \NC \NR
+\NC \type {addcharacters} \NC adds characters to a font \NC \NR
+\NC \type {define} \NC defined a font \NC \NR
+\NC \type {id} \NC returns the id that relates to a command name \NC \NR
+\LL
+\stoptabulate
+
+For practical reasons the management of font identifiers is still done by \TEX\
+but it can become an experiment to delegate that to \LUA\ as well.
+
+\stopsubsection
+
+\startsubsection[title={Defining a font with \type {define}, \type {addcharacters} and \type
+{setfont}}]
+
+\topicindex {fonts+define}
+\topicindex {fonts+extend}
+
+Normally you will use a callback to define a font but there's also a \LUA\
+function that does the job.
+
+\startfunctioncall
+id = font.define(<table> f)
+\stopfunctioncall
+
+Within reasonable bounds you can extend a font after it has been defined. Because
+some properties are best left unchanged this is limited to adding characters.
+
+\startfunctioncall
+font.addcharacters(<number n>, <table> f)
+\stopfunctioncall
+
+The table passed can have the fields \type {characters} which is a (sub)table
+like the one used in define, and for virtual fonts a \type {fonts} table can be
+added. The characters defined in the \type {characters} table are added (when not
+yet present) or replace an existing entry. Keep in mind that replacing can have
+side effects because a character already can have been used. Instead of posing
+restrictions we expect the user to be careful. The \type {setfont} helper is
+a more drastic replacer and only works when a font has not been used yet.
+
+\stopsubsection
+
+\startsubsection[title={Font ids: \type {id}, \type {max} and \type {current}}]
+
+\topicindex {fonts+id}
+\topicindex {fonts+current}
+
+\startfunctioncall
+<number> i = font.id(<string> csname)
+\stopfunctioncall
+
+This returns the font id associated with \type {csname}, or $-1$ if \type
+{csname} is not defined.
+
+\startfunctioncall
+<number> i = font.max()
+\stopfunctioncall
+
+This is the largest used index so far. The currently active font id can be
+queried or set with:
+
+\startfunctioncall
+<number> i = font.current()
+font.current(<number> i)
+\stopfunctioncall
+
+\stopsubsection
+
+% \startsubsection[title={Glyph data: \lpr {glyphdata}]
+%
+% This primitive can be used to set an additional glyph property. Of course it's very
+% macro package dependant what is done with that. Consider it an experiment (we had
+% some room left in the glyphs data structure). It's basically an single attribute.
+%
+% \stopsubsection
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-introduction.tex
new file mode 100644
index 00000000000..774f3d8d9a1
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-introduction.tex
@@ -0,0 +1,142 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-introduction
+
+\startchapter[title=Introduction]
+
+Around 2005 we started the \LUATEX\ projects and it took about a decade to reach
+a state where we could consider the experiments to have reached a stable state.
+Pretty soon \LUATEX\ could be used in production, even if some of the interfaces
+evolved, but \CONTEXT\ was kept in sync so that was not really a problem. In 2018
+the functionality was more or less frozen. Of course we might add some features
+in due time but nothing fundamental will change as we consider version 1.10 to be
+reasonable feature complete. Among the reasons is that this engine is now used
+outside \CONTEXT\ too which means that we cannot simply change much without
+affecting other macro packages.
+
+However, in reaching that state some decisions were delayed because they didn't
+go well with a current stable version. This is why at the 2018 \CONTEXT\ meeting
+those present agreed that we could move on with a follow up tagged \METATEX, a
+name we already had in mind for a while, but as \LUA\ is an important component,
+it got expanded to \LUAMETATEX. This follow up is a lightweight companion to
+\LUATEX\ that will be maintained alongside. More about the reasons for this
+follow up as well as the philosophy behind it can be found in the document(s)
+describing the development. During \LUATEX\ development I kept track of what
+happened in a series of documents, parts of which were published as articles in
+user group journals, but all are in the \CONTEXT\ distribution. I did the same
+with the development of \LUAMETATEX.
+
+The \LUAMETATEX\ engine is, as said, a lightweight version of \LUATEX, that for
+now targets \CONTEXT. We will use it for possibly drastic experiments but without
+affecting \LUATEX. As we can easily adapt \CONTEXT\ to support both, no other
+macro package will be harmed when (for instance) interfaces change as part of an
+experiment. Of course, when we consider something to be useful, it can be ported
+back to \LUATEX, but only when there are good reasons for doing so and when no
+compatibility issues are involved. When considering this follow up one
+consideration was that a lean and mean version with an extension mechanism is a
+bit closer to original \TEX. Of course, because we also have new primitives, this
+is not entirely true. The move to \LUA\ already meant that some aspects,
+especially system dependent ones, no longer made sense and therefore had
+consequences for the interface at the system level.
+
+This manual currently has quite a bit of overlap with the \LUATEX\ manual but
+some chapters are removed, others added and the rest has been (and will be
+further) adapted. It also discusses the (main) differences. Some of the new
+primitives or functions that show up in \LUAMETATEX\ might show up in \LUATEX\ at
+some point, others might not, so don't take this manual as reference for \LUATEX
+! For now it is an experimental engine in which we can change things at will but
+with \CONTEXT\ in tandem so that this macro package will keep working.
+
+For \CONTEXT\ users the \LUAMETATEX\ engine will become the default. The
+\CONTEXT\ variant for this engine is tagged \LMTX. The pair can be used in
+production, just as with \LUATEX\ and \MKIV. In fact, most users will probably
+not really notice the difference. In some cases there will be a drop in
+performance, due to more work being delegated to \LUA, but on the average
+performance will be better, also due to some changes below the hood of the
+engine.
+
+As this follow up is closely related to \CONTEXT\ development, and because we
+expect stock \LUATEX\ to be used outside the \CONTEXT\ proper, there will be no
+special mailing list nor coverage (or pollution) on the \LUATEX\ related mailing
+lists. We have the \CONTEXT\ mailing lists for that. In due time the source code
+will be part of the regular \CONTEXT\ distribution.
+
+% \testpage[8]
+
+This manual sometimes refers to \LUATEX, especially when we talk of features
+common to both engine, as well as to \LUAMETATEX, when it is more specific to the
+follow up. A substantial amount of time went into the transition and more will go
+in, so if you want to complain about \LUAMETATEX, don't bother me. Of course, if
+you really need professional support with these engines (or \TEX\ in general),
+you can always consider contacting the developers.
+
+% And yes, I'm really fed up with receiving mails or seeing comments where there's
+% this 'always need to be present' negative remark (nagging) about the program,
+% documentation, development, support, etc. present, probably to put the writer on
+% a higher stand, or maybe to compensate some other personal shortcoming ... who
+% knows. This 'i need to make my stupid point' behaviour seems to come with the
+% internet and it also seems to increase, but that doesn't mean that I want to deal
+% with those unpleasant people for the sake of the larger "tex good". Therefore, I'm
+% quite happy in the nearly always positive and motivating ConTeXt bubble. It's also
+% why I (start) avoid(ing) certain mailing lists and don't really follow forums.
+
+\blank[big]
+
+Hans Hagen
+
+\blank[2*big]
+
+\starttabulate[|||]
+\NC Version \EQ \currentdate \NC \NR
+\NC \LUAMETATEX \EQ \cldcontext{LUATEXENGINE} %
+ \cldcontext{LUATEXVERSION} / %
+ \cldcontext{LUATEXFUNCTIONALITY}
+ \NC \NR
+\NC \CONTEXT \EQ MkIV \contextversion \NC \NR
+\NC \LUATEX\ Team \EQ Hans Hagen, Hartmut Henkel, Taco Hoekwater, Luigi Scarso \NC \NR
+\stoptabulate
+
+\vfilll
+
+{\bf remark:} \LUAMETATEX\ development is mostly done by Hans Hagen and Alan
+Braslau, who love playing with the three languages involved. And as usual Mojca
+Miklavec make sure all compiles well on the buildbot infrastructure. Testing is
+done by \CONTEXT\ developers and users. Many thanks for their patience!
+
+{\bf remark:} When there are non|-|intrusive features that also make sense in
+\LUATEX, these will be applied in the experimental branch first, so that there is
+no interference with the stable release.
+
+{\bf remark:} Most \CONTEXT\ users seem always willing to keep up with the latest
+versions which means that \LMTX\ is tested well. We can therefore safely claim
+that end of 2019 the code has become quite stable. There are no complaints about
+performance (on my laptop this manual compiles at 22.5 pps with \LMTX\ versus
+20.7 pps for the \LUATEX\ manual with \MKIV). Probably no one notices it, but
+memory consumption stepwise got reduced too. And \unknown\ the binary is still
+below 3~MegaBytes on all platforms.
+
+\stopchapter
+
+\stopcomponent
+
+% I'm not that strict with incrementing numbers, but let's occasionally bump
+% the number. Once we're stable it might happen more systematically. For sure
+% I don't want to end up with these redicoulous 0.99999999 kind of numbers.
+%
+% We started with 2.00.0 and kept that number till November 2019, after Alan
+% Braslau and I did the initial beta release at April 1, 2019. After more than
+% a year working on the code base after the \CONTEXT\ 2019 meeting a state was
+% reached where nothing fundamental got added for a while. When \LUATEX\ needs
+% a patch, I check the \LUAMETATEX\ code base as the same patch might be needed
+% there. On the other hand, we don't need a strict compatibility, so some
+% patched in \LUATEX\ are not applied here.
+%
+% In November 2019 I started wondering if we should bump the number, just for
+% the sake of showing that there's still some progress. So I decided to bump to
+% 2.01.0 then. Just as a reminder for myself: it was the day when I watched
+% Jacob Collier perform Lua (feat. MARO) live on YouTube (of course that is not
+% about the language at all, but still a nice coincidence). Just for the fun of
+% it the number bumped a few more times, just to catch up, so end 2019 we're at
+% 2.03.5.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-languages.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-languages.tex
new file mode 100644
index 00000000000..b6607a9bb8c
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-languages.tex
@@ -0,0 +1,1095 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-languages
+
+\startchapter[reference=languages,title={Languages, characters, fonts and glyphs}]
+
+\startsection[title={Introduction}]
+
+\topicindex {languages}
+
+\LUATEX's internal handling of the characters and glyphs that eventually become
+typeset is quite different from the way \TEX82 handles those same objects. The
+easiest way to explain the difference is to focus on unrestricted horizontal mode
+(i.e.\ paragraphs) and hyphenation first. Later on, it will be easy to deal
+with the differences that occur in horizontal and math modes.
+
+In \TEX82, the characters you type are converted into \type {char} node records
+when they are encountered by the main control loop. \TEX\ attaches and processes
+the font information while creating those records, so that the resulting \quote
+{horizontal list} contains the final forms of ligatures and implicit kerning.
+This packaging is needed because we may want to get the effective width of for
+instance a horizontal box.
+
+When it becomes necessary to hyphenate words in a paragraph, \TEX\ converts (one
+word at time) the \type {char} node records into a string by replacing ligatures
+with their components and ignoring the kerning. Then it runs the hyphenation
+algorithm on this string, and converts the hyphenated result back into a \quote
+{horizontal list} that is consecutively spliced back into the paragraph stream.
+Keep in mind that the paragraph may contain unboxed horizontal material, which
+then already contains ligatures and kerns and the words therein are part of the
+hyphenation process.
+
+Those \type {char} node records are somewhat misnamed, as they are glyph
+positions in specific fonts, and therefore not really \quote {characters} in the
+linguistic sense. There is no language information inside the \type {char} node
+records at all. Instead, language information is passed along using \type
+{language whatsit} nodes inside the horizontal list.
+
+In \LUATEX, the situation is quite different. The characters you type are always
+converted into \nod {glyph} node records with a special subtype to identify them
+as being intended as linguistic characters. \LUATEX\ stores the needed language
+information in those records, but does not do any font|-|related processing at
+the time of node creation. It only stores the index of the current font and a
+reference to a character in that font.
+
+When it becomes necessary to typeset a paragraph, \LUATEX\ first inserts all
+hyphenation points right into the whole node list. Next, it processes all the
+font information in the whole list (creating ligatures and adjusting kerning),
+and finally it adjusts all the subtype identifiers so that the records are \quote
+{glyph nodes} from now on.
+
+\stopsection
+
+\startsection[title={Characters, glyphs and discretionaries},reference=charsandglyphs]
+
+\topicindex {characters}
+\topicindex {glyphs}
+\topicindex {hyphenation}
+
+\TEX82 (including \PDFTEX) differentiates between \type {char} nodes and \type
+{lig} nodes. The former are simple items that contained nothing but a \quote
+{character} and a \quote {font} field, and they lived in the same memory as
+tokens did. The latter also contained a list of components, and a subtype
+indicating whether this ligature was the result of a word boundary, and it was
+stored in the same place as other nodes like boxes and kerns and glues.
+
+In \LUATEX, these two types are merged into one, somewhat larger structure called
+a \nod {glyph} node. Besides having the old character, font, and component
+fields there are a few more, like \quote {attr} that we will see in \in {section}
+[glyphnodes], these nodes also contain a subtype, that codes four main types and
+two additional ghost types. For ligatures, multiple bits can be set at the same
+time (in case of a single|-|glyph word).
+
+\startitemize
+ \startitem
+ \type {character}, for characters to be hyphenated: the lowest bit
+ (bit 0) is set to 1.
+ \stopitem
+ \startitem
+ \nod {glyph}, for specific font glyphs: the lowest bit (bit 0) is
+ not set.
+ \stopitem
+ \startitem
+ \type {ligature}, for constructed ligatures bit 1 is set.
+ \stopitem
+\stopitemize
+
+The \nod {glyph} nodes also contain language data, split into four items that
+were current when the node was created: the \prm {setlanguage} (15~bits), \prm
+{lefthyphenmin} (8~bits), \prm {righthyphenmin} (8~bits), and \prm {uchyph}
+(1~bit).
+
+Incidentally, \LUATEX\ allows 16383 separate languages, and words can be 256
+characters long. The language is stored with each character. You can set
+\prm {firstvalidlanguage} to for instance~1 and make thereby language~0
+an ignored hyphenation language.
+
+The new primitive \lpr {hyphenationmin} can be used to signal the minimal length
+of a word. This value is stored with the (current) language.
+
+Because the \prm {uchyph} value is saved in the actual nodes, its handling is
+subtly different from \TEX82: changes to \prm {uchyph} become effective
+immediately, not at the end of the current partial paragraph.
+
+Typeset boxes now always have their language information embedded in the nodes
+themselves, so there is no longer a possible dependency on the surrounding
+language settings. In \TEX82, a mid|-|paragraph statement like \type {\unhbox0}
+would process the box using the current paragraph language unless there was a
+\prm {setlanguage} issued inside the box. In \LUATEX, all language variables
+are already frozen.
+
+In traditional \TEX\ the process of hyphenation is driven by \type {lccode}s. In
+\LUATEX\ we made this dependency less strong. There are several strategies
+possible. When you do nothing, the currently used \type {lccode}s are used, when
+loading patterns, setting exceptions or hyphenating a list.
+
+When you set \prm {savinghyphcodes} to a value greater than zero the current set
+of \type {lccode}s will be saved with the language. In that case changing a \type
+{lccode} afterwards has no effect. However, you can adapt the set with:
+
+\starttyping
+\hjcode`a=`a
+\stoptyping
+
+This change is global which makes sense if you keep in mind that the moment that
+hyphenation happens is (normally) when the paragraph or a horizontal box is
+constructed. When \prm {savinghyphcodes} was zero when the language got
+initialized you start out with nothing, otherwise you already have a set.
+
+When a \lpr {hjcode} is greater than 0 but less than 32 is indicates the
+to be used length. In the following example we map a character (\type {x}) onto
+another one in the patterns and tell the engine that \type {Å“} counts as two
+characters. Because traditionally zero itself is reserved for inhibiting
+hyphenation, a value of 32 counts as zero.
+
+Here are some examples (we assume that French patterns are used):
+
+\starttabulate[||||]
+\NC \NC \type{foobar} \NC \type{foo-bar} \NC \NR
+\NC \type{\hjcode`x=`o} \NC \type{fxxbar} \NC \type{fxx-bar} \NC \NR
+\NC \type{\lefthyphenmin3} \NC \type{Å“dipus} \NC \type{Å“di-pus} \NC \NR
+\NC \type{\lefthyphenmin4} \NC \type{Å“dipus} \NC \type{Å“dipus} \NC \NR
+\NC \type{\hjcode`Å“=2} \NC \type{Å“dipus} \NC \type{Å“di-pus} \NC \NR
+\NC \type{\hjcode`i=32 \hjcode`d=32} \NC \type{Å“dipus} \NC \type{Å“dipus} \NC \NR
+\NC
+\stoptabulate
+
+Carrying all this information with each glyph would give too much overhead and
+also make the process of setting up these codes more complex. A solution with
+\type {hjcode} sets was considered but rejected because in practice the current
+approach is sufficient and it would not be compatible anyway.
+
+Beware: the values are always saved in the format, independent of the setting
+of \prm {savinghyphcodes} at the moment the format is dumped.
+
+A boundary node normally would mark the end of a word which interferes with for
+instance discretionary injection. For this you can use the \prm {wordboundary}
+as a trigger. Here are a few examples of usage:
+
+\startbuffer
+ discrete---discrete
+\stopbuffer
+\typebuffer \startnarrower \dontcomplain \hsize 1pt \getbuffer \par \stopnarrower
+\startbuffer
+ discrete\discretionary{}{}{---}discrete
+\stopbuffer
+\typebuffer \startnarrower \dontcomplain \hsize 1pt \getbuffer \par \stopnarrower
+\startbuffer
+ discrete\wordboundary\discretionary{}{}{---}discrete
+\stopbuffer
+\typebuffer \startnarrower \dontcomplain \hsize 1pt \getbuffer \par \stopnarrower
+\startbuffer
+ discrete\wordboundary\discretionary{}{}{---}\wordboundary discrete
+\stopbuffer
+\typebuffer \startnarrower \dontcomplain \hsize 1pt \getbuffer \par \stopnarrower
+\startbuffer
+ discrete\wordboundary\discretionary{---}{}{}\wordboundary discrete
+\stopbuffer
+\typebuffer \startnarrower \dontcomplain \hsize 1pt \getbuffer \par \stopnarrower
+
+We only accept an explicit hyphen when there is a preceding glyph and we skip a
+sequence of explicit hyphens since that normally indicates a \type {--} or \type
+{---} ligature in which case we can in a worse case usage get bad node lists
+later on due to messed up ligature building as these dashes are ligatures in base
+fonts. This is a side effect of separating the hyphenation, ligaturing and
+kerning steps.
+
+The start and end of a sequence of characters is signalled by a \nod {glue}, \nod
+{penalty}, \nod {kern} or \nod {boundary} node. But by default also a \nod
+{hlist}, \nod {vlist}, \nod {rule}, \nod {dir}, \nod {whatsit}, \nod {ins}, and
+\nod {adjust} node indicate a start or end. You can omit the last set from the
+test by setting \lpr {hyphenationbounds} to a non|-|zero value:
+
+\starttabulate[|c|l|]
+\DB value \BC behaviour \NC \NR
+\TB
+\NC \type{0} \NC not strict \NC \NR
+\NC \type{1} \NC strict start \NC \NR
+\NC \type{2} \NC strict end \NC \NR
+\NC \type{3} \NC strict start and strict end \NC \NR
+\LL
+\stoptabulate
+
+The word start is determined as follows:
+
+\starttabulate[|l|l|]
+\DB node \BC behaviour \NC \NR
+\TB
+\BC boundary \NC yes when wordboundary \NC \NR
+\BC hlist \NC when hyphenationbounds 1 or 3 \NC \NR
+\BC vlist \NC when hyphenationbounds 1 or 3 \NC \NR
+\BC rule \NC when hyphenationbounds 1 or 3 \NC \NR
+\BC dir \NC when hyphenationbounds 1 or 3 \NC \NR
+\BC whatsit \NC when hyphenationbounds 1 or 3 \NC \NR
+\BC glue \NC yes \NC \NR
+\BC math \NC skipped \NC \NR
+\BC glyph \NC exhyphenchar (one only) : yes (so no -- ---) \NC \NR
+\BC otherwise \NC yes \NC \NR
+\LL
+\stoptabulate
+
+The word end is determined as follows:
+
+\starttabulate[|l|l|]
+\DB node \BC behaviour \NC \NR
+\TB
+\BC boundary \NC yes \NC \NR
+\BC glyph \NC yes when different language \NC \NR
+\BC glue \NC yes \NC \NR
+\BC penalty \NC yes \NC \NR
+\BC kern \NC yes when not italic (for some historic reason) \NC \NR
+\BC hlist \NC when hyphenationbounds 2 or 3 \NC \NR
+\BC vlist \NC when hyphenationbounds 2 or 3 \NC \NR
+\BC rule \NC when hyphenationbounds 2 or 3 \NC \NR
+\BC dir \NC when hyphenationbounds 2 or 3 \NC \NR
+\BC whatsit \NC when hyphenationbounds 2 or 3 \NC \NR
+\BC ins \NC when hyphenationbounds 2 or 3 \NC \NR
+\BC adjust \NC when hyphenationbounds 2 or 3 \NC \NR
+\LL
+\stoptabulate
+
+\in {Figures} [hb:1] upto \in [hb:5] show some examples. In all cases we set the
+min values to 1 and make sure that the words hyphenate at each character.
+
+\hyphenation{o-n-e t-w-o}
+
+\def\SomeTest#1#2%
+ {\lefthyphenmin \plusone
+ \righthyphenmin \plusone
+ \parindent \zeropoint
+ \everypar \emptytoks
+ \dontcomplain
+ \hbox to 2cm {%
+ \vtop {%
+ \hsize 1pt
+ \hyphenationbounds#1
+ #2
+ \par}}}
+
+\startplacefigure[reference=hb:1,title={\type{one}}]
+ \startcombination[4*1]
+ {\SomeTest{0}{one}} {\type{0}}
+ {\SomeTest{1}{one}} {\type{1}}
+ {\SomeTest{2}{one}} {\type{2}}
+ {\SomeTest{3}{one}} {\type{3}}
+ \stopcombination
+\stopplacefigure
+
+\startplacefigure[reference=hb:2,title={\type{one\null two}}]
+ \startcombination[4*1]
+ {\SomeTest{0}{one\null two}} {\type{0}}
+ {\SomeTest{1}{one\null two}} {\type{1}}
+ {\SomeTest{2}{one\null two}} {\type{2}}
+ {\SomeTest{3}{one\null two}} {\type{3}}
+ \stopcombination
+\stopplacefigure
+
+\startplacefigure[reference=hb:3,title={\type{\null one\null two}}]
+ \startcombination[4*1]
+ {\SomeTest{0}{\null one\null two}} {\type{0}}
+ {\SomeTest{1}{\null one\null two}} {\type{1}}
+ {\SomeTest{2}{\null one\null two}} {\type{2}}
+ {\SomeTest{3}{\null one\null two}} {\type{3}}
+ \stopcombination
+\stopplacefigure
+
+\startplacefigure[reference=hb:4,title={\type{one\null two\null}}]
+ \startcombination[4*1]
+ {\SomeTest{0}{one\null two\null}} {\type{0}}
+ {\SomeTest{1}{one\null two\null}} {\type{1}}
+ {\SomeTest{2}{one\null two\null}} {\type{2}}
+ {\SomeTest{3}{one\null two\null}} {\type{3}}
+ \stopcombination
+\stopplacefigure
+
+\startplacefigure[reference=hb:5,title={\type{\null one\null two\null}}]
+ \startcombination[4*1]
+ {\SomeTest{0}{\null one\null two\null}} {\type{0}}
+ {\SomeTest{1}{\null one\null two\null}} {\type{1}}
+ {\SomeTest{2}{\null one\null two\null}} {\type{2}}
+ {\SomeTest{3}{\null one\null two\null}} {\type{3}}
+ \stopcombination
+\stopplacefigure
+
+% (Future versions of \LUATEX\ might provide more granularity.)
+
+In traditional \TEX\ ligature building and hyphenation are interwoven with the
+line break mechanism. In \LUATEX\ these phases are isolated. As a consequence we
+deal differently with (a sequence of) explicit hyphens. We already have added
+some control over aspects of the hyphenation and yet another one concerns
+automatic hyphens (e.g.\ \type {-} characters in the input).
+
+When \lpr {automatichyphenmode} has a value of 0, a hyphen will be turned into
+an automatic discretionary. The snippets before and after it will not be
+hyphenated. A side effect is that a leading hyphen can lead to a split but one
+will seldom run into that situation. Setting a pre and post character makes this
+more prominent. A value of 1 will prevent this side effect and a value of 2 will
+not turn the hyphen into a discretionary. Experiments with other options, like
+permitting hyphenation of the words on both sides were discarded.
+
+\startbuffer[a]
+before-after \par
+before--after \par
+before---after \par
+\stopbuffer
+
+\startbuffer[b]
+-before \par
+after- \par
+--before \par
+after-- \par
+---before \par
+after--- \par
+\stopbuffer
+
+\startbuffer[c]
+before-after \par
+before--after \par
+before---after \par
+\stopbuffer
+
+\startbuffer[demo]
+\startcombination[nx=4,ny=3,location=top]
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\zerocount \hsize6em \getbuffer[a]}} {A~0~6em}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\zerocount \hsize2pt \getbuffer[a]}} {A~0~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\plusone \hsize2pt \getbuffer[a]}} {A~1~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\plustwo \hsize2pt \getbuffer[a]}} {A~2~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\zerocount \hsize6em \getbuffer[b]}} {B~0~6em}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\zerocount \hsize2pt \getbuffer[b]}} {B~0~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\plusone \hsize2pt \getbuffer[b]}} {B~1~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\plustwo \hsize2pt \getbuffer[b]}} {B~2~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\zerocount \hsize6em \getbuffer[c]}} {C~0~6em}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\zerocount \hsize2pt \getbuffer[c]}} {C~0~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\plusone \hsize2pt \getbuffer[c]}} {C~1~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\plustwo \hsize2pt \getbuffer[c]}} {C~2~2pt}
+\stopcombination
+\stopbuffer
+
+\startplacefigure[reference=automatichyphenmode:1,title={The automatic modes \type {0} (default), \type {1} and \type {2}, with a \prm {hsize}
+of 6em and 2pt (which triggers a linebreak).}]
+ \dontcomplain \tt \getbuffer[demo]
+\stopplacefigure
+
+\startplacefigure[reference=automatichyphenmode:2,title={The automatic modes \type {0} (default), \type {1} and \type {2}, with \lpr {preexhyphenchar} and \lpr {postexhyphenchar} set to characters \type {A} and \type {B}.}]
+ \postexhyphenchar`A\relax
+ \preexhyphenchar `B\relax
+ \dontcomplain \tt \getbuffer[demo]
+\stopplacefigure
+
+In \in {figure} [automatichyphenmode:1] \in {and} [automatichyphenmode:2] we show
+what happens with three samples:
+
+Input A: \typebuffer[a]
+Input B: \typebuffer[b]
+Input C: \typebuffer[c]
+
+As with primitive companions of other single character commands, the \prm {-}
+command has a more verbose primitive version in \lpr {explicitdiscretionary}
+and the normally intercepted in the hyphenator character \type {-} (or whatever
+is configured) is available as \lpr {automaticdiscretionary}.
+
+\stopsection
+
+\startsection[title={The main control loop}]
+
+\topicindex {main loop}
+\topicindex {hyphenation}
+
+In \LUATEX's main loop, almost all input characters that are to be typeset are
+converted into \nod {glyph} node records with subtype \quote {character}, but
+there are a few exceptions.
+
+\startitemize[n]
+
+\startitem
+ The \prm {accent} primitive creates nodes with subtype \quote {glyph}
+ instead of \quote {character}: one for the actual accent and one for the
+ accentee. The primary reason for this is that \prm {accent} in \TEX82 is
+ explicitly dependent on the current font encoding, so it would not make much
+ sense to attach a new meaning to the primitive's name, as that would
+ invalidate many old documents and macro packages. A secondary reason is that
+ in \TEX82, \prm {accent} prohibits hyphenation of the current word. Since
+ in \LUATEX\ hyphenation only takes place on \quote {character} nodes, it is
+ possible to achieve the same effect. Of course, modern \UNICODE\ aware macro
+ packages will not use the \prm {accent} primitive at all but try to map
+ directly on composed characters.
+
+ This change of meaning did happen with \prm {char}, that now generates
+ \quote {glyph} nodes with a character subtype. In traditional \TEX\ there was
+ a strong relationship between the 8|-|bit input encoding, hyphenation and
+ glyphs taken from a font. In \LUATEX\ we have \UTF\ input, and in most cases
+ this maps directly to a character in a font, apart from glyph replacement in
+ the font engine. If you want to access arbitrary glyphs in a font directly
+ you can always use \LUA\ to do so, because fonts are available as \LUA\
+ table.
+\stopitem
+
+\startitem
+ All the results of processing in math mode eventually become nodes with
+ \quote {glyph} subtypes. In fact, the result of processing math is just
+ a regular list of glyphs, kerns, glue, penalties, boxes etc.
+\stopitem
+
+\startitem
+ Automatic discretionaries are handled differently. \TEX82 inserts an empty
+ discretionary after sensing an input character that matches the \prm
+ {hyphenchar} in the current font. This test is wrong in our opinion: whether
+ or not hyphenation takes place should not depend on the current font, it is a
+ language property. \footnote {When \TEX\ showed up we didn't have \UNICODE\
+ yet and being limited to eight bits meant that one sometimes had to
+ compromise between supporting character input, glyph rendering, hyphenation.}
+
+ In \LUATEX, it works like this: if \LUATEX\ senses a string of input
+ characters that matches the value of the new integer parameter \prm
+ {exhyphenchar}, it will insert an explicit discretionary after that series of
+ nodes. Initially \TEX\ sets the \type {\exhyphenchar=`\-}. Incidentally, this
+ is a global parameter instead of a language-specific one because it may be
+ useful to change the value depending on the document structure instead of the
+ text language.
+
+ The insertion of discretionaries after a sequence of explicit hyphens happens
+ at the same time as the other hyphenation processing, {\it not\/} inside the
+ main control loop.
+
+ The only use \LUATEX\ has for \prm {hyphenchar} is at the check whether a
+ word should be considered for hyphenation at all. If the \prm {hyphenchar}
+ of the font attached to the first character node in a word is negative, then
+ hyphenation of that word is abandoned immediately. This behaviour is added
+ for backward compatibility only, and the use of \type {\hyphenchar=-1} as a
+ means of preventing hyphenation should not be used in new \LUATEX\ documents.
+\stopitem
+
+\startitem
+ The \prm {setlanguage} command no longer creates whatsits. The meaning of
+ \prm {setlanguage} is changed so that it is now an integer parameter like all
+ others. That integer parameter is used in \type {\glyph_node} creation to add
+ language information to the glyph nodes. In conjunction, the \prm {language}
+ primitive is extended so that it always also updates the value of \prm
+ {setlanguage}.
+\stopitem
+
+\startitem
+ The \prm {noboundary} command (that prohibits word boundary processing
+ where that would normally take place) now does create nodes. These nodes are
+ needed because the exact place of the \prm {noboundary} command in the
+ input stream has to be retained until after the ligature and font processing
+ stages.
+\stopitem
+
+\startitem
+ There is no longer a \type {main_loop} label in the code. Remember that
+ \TEX82 did quite a lot of processing while adding \type {char_nodes} to the
+ horizontal list? For speed reasons, it handled that processing code outside
+ of the \quote {main control} loop, and only the first character of any \quote
+ {word} was handled by that \quote {main control} loop. In \LUATEX, there is
+ no longer a need for that (all hard work is done later), and the (now very
+ small) bits of character|-|handling code have been moved back inline. When
+ \prm {tracingcommands} is on, this is visible because the full word is
+ reported, instead of just the initial character.
+\stopitem
+
+\stopitemize
+
+Because we tend to make hard coded behaviour configurable a few new primitives
+have been added:
+
+\starttyping
+\hyphenpenaltymode
+\automatichyphenpenalty
+\explicithyphenpenalty
+\stoptyping
+
+The first parameter has the following consequences for automatic discs (the ones
+resulting from an \prm {exhyphenchar}):
+
+\starttabulate[|c|l|l|]
+\DB mode \BC automatic disc \type {-} \BC explicit disc \prm{-} \NC \NR
+\TB
+\NC \type{0} \NC \prm {exhyphenpenalty} \NC \prm {exhyphenpenalty} \NC \NR
+\NC \type{1} \NC \prm {hyphenpenalty} \NC \prm {hyphenpenalty} \NC \NR
+\NC \type{2} \NC \prm {exhyphenpenalty} \NC \prm {hyphenpenalty} \NC \NR
+\NC \type{3} \NC \prm {hyphenpenalty} \NC \prm {exhyphenpenalty} \NC \NR
+\NC \type{4} \NC \lpr {automatichyphenpenalty} \NC \lpr {explicithyphenpenalty} \NC \NR
+\NC \type{5} \NC \prm {exhyphenpenalty} \NC \lpr {explicithyphenpenalty} \NC \NR
+\NC \type{6} \NC \prm {hyphenpenalty} \NC \lpr {explicithyphenpenalty} \NC \NR
+\NC \type{7} \NC \lpr {automatichyphenpenalty} \NC \prm {exhyphenpenalty} \NC \NR
+\NC \type{8} \NC \lpr {automatichyphenpenalty} \NC \prm {hyphenpenalty} \NC \NR
+\LL
+\stoptabulate
+
+other values do what we always did in \LUATEX: insert \prm {exhyphenpenalty}.
+
+\stopsection
+
+\startsection[title={Loading patterns and exceptions},reference=patternsexceptions]
+
+\topicindex {hyphenation}
+\topicindex {hyphenation+patterns}
+\topicindex {hyphenation+exceptions}
+\topicindex {patterns}
+\topicindex {exceptions}
+
+Although we keep the traditional approach towards hyphenation (which is still
+superior) the implementation of the hyphenation algorithm in \LUATEX\ is quite
+different from the one in \TEX82.
+
+After expansion, the argument for \prm {patterns} has to be proper \UTF8 with
+individual patterns separated by spaces, no \prm {char} or \prm {chardef}d
+commands are allowed. The current implementation is quite strict and will reject
+all non|-|\UNICODE\ characters. Likewise, the expanded argument for \prm
+{hyphenation} also has to be proper \UTF8, but here a bit of extra syntax is
+provided:
+
+\startitemize[n]
+\startitem
+ Three sets of arguments in curly braces (\type {{}{}{}}) indicate a desired
+ complex discretionary, with arguments as in \prm {discretionary}'s command in
+ normal document input.
+\stopitem
+\startitem
+ A \type {-} indicates a desired simple discretionary, cf.\ \type {\-} and
+ \type {\discretionary{-}{}{}} in normal document input.
+\stopitem
+\startitem
+ Internal command names are ignored. This rule is provided especially for \prm
+ {discretionary}, but it also helps to deal with \prm {relax} commands that
+ may sneak in.
+\stopitem
+\startitem
+ An \type {=} indicates a (non|-|discretionary) hyphen in the document input.
+\stopitem
+\stopitemize
+
+The expanded argument is first converted back to a space|-|separated string while
+dropping the internal command names. This string is then converted into a
+dictionary by a routine that creates key|-|value pairs by converting the other
+listed items. It is important to note that the keys in an exception dictionary
+can always be generated from the values. Here are a few examples:
+
+\starttabulate[|l|l|l|]
+\DB value \BC implied key (input) \BC effect \NC\NR
+\TB
+\NC \type {ta-ble} \NC table \NC \type {ta\-ble} ($=$ \type {ta\discretionary{-}{}{}ble}) \NC\NR
+\NC \type {ba{k-}{}{c}ken} \NC backen \NC \type {ba\discretionary{k-}{}{c}ken} \NC\NR
+\LL
+\stoptabulate
+
+The resultant patterns and exception dictionary will be stored under the language
+code that is the present value of \prm {language}.
+
+In the last line of the table, you see there is no \prm {discretionary} command
+in the value: the command is optional in the \TEX-based input syntax. The
+underlying reason for that is that it is conceivable that a whole dictionary of
+words is stored as a plain text file and loaded into \LUATEX\ using one of the
+functions in the \LUA\ \type {lang} library. This loading method is quite a bit
+faster than going through the \TEX\ language primitives, but some (most?) of that
+speed gain would be lost if it had to interpret command sequences while doing so.
+
+It is possible to specify extra hyphenation points in compound words by using
+\type {{-}{}{-}} for the explicit hyphen character (replace \type {-} by the
+actual explicit hyphen character if needed). For example, this matches the word
+\quote {multi|-|word|-|boundaries} and allows an extra break inbetween \quote
+{boun} and \quote {daries}:
+
+\starttyping
+\hyphenation{multi{-}{}{-}word{-}{}{-}boun-daries}
+\stoptyping
+
+The motivation behind the \ETEX\ extension \prm {savinghyphcodes} was that
+hyphenation heavily depended on font encodings. This is no longer true in
+\LUATEX, and the corresponding primitive is basically ignored. Because we now
+have \lpr {hjcode}, the case related codes can be used exclusively for \prm
+{uppercase} and \prm {lowercase}.
+
+The three curly brace pair pattern in an exception can be somewhat unexpected so
+we will try to explain it by example. The pattern \type {foo{}{}{x}bar} pattern
+creates a lookup \type {fooxbar} and the pattern \type {foo{}{}{}bar} creates
+\type {foobar}. Then, when a hit happens there is a replacement text (\type {x})
+or none. Because we introduced penalties in discretionary nodes, the exception
+syntax now also can take a penalty specification. The value between square brackets
+is a multiplier for \lpr {exceptionpenalty}. Here we have set it to 10000 so
+effectively we get 30000 in the example.
+
+\def\ShowSample#1#2%
+ {\startlinecorrection[blank]
+ \hyphenation{#1}%
+ \exceptionpenalty=10000
+ \bTABLE[foregroundstyle=type]
+ \bTR
+ \bTD[align=middle,nx=4] \type{#1} \eTD
+ \eTR
+ \bTR
+ \bTD[align=middle] \type{10em} \eTD
+ \bTD[align=middle] \type {3em} \eTD
+ \bTD[align=middle] \type {0em} \eTD
+ \bTD[align=middle] \type {6em} \eTD
+ \eTR
+ \bTR
+ \bTD[width=10em]\vtop{\hsize 10em 123 #2 123\par}\eTD
+ \bTD[width=10em]\vtop{\hsize 3em 123 #2 123\par}\eTD
+ \bTD[width=10em]\vtop{\hsize 0em 123 #2 123\par}\eTD
+ \bTD[width=10em]\vtop{\setupalign[verytolerant,stretch]\rmtf\hsize 6em 123 #2 #2 #2 #2 123\par}\eTD
+ \eTR
+ \eTABLE
+ \stoplinecorrection}
+
+\ShowSample{x{a-}{-b}{}x{a-}{-b}{}x{a-}{-b}{}x{a-}{-b}{}xx}{xxxxxx}
+\ShowSample{x{a-}{-b}{}x{a-}{-b}{}[3]x{a-}{-b}{}[1]x{a-}{-b}{}xx}{xxxxxx}
+
+\ShowSample{z{a-}{-b}{z}{a-}{-b}{z}{a-}{-b}{z}{a-}{-b}{z}z}{zzzzzz}
+\ShowSample{z{a-}{-b}{z}{a-}{-b}{z}[3]{a-}{-b}{z}[1]{a-}{-b}{z}z}{zzzzzz}
+
+\stopsection
+
+\startsection[title={Applying hyphenation}]
+
+\topicindex {hyphenation+how it works}
+\topicindex {hyphenation+discretionaries}
+\topicindex {discretionaries}
+
+The internal structures \LUATEX\ uses for the insertion of discretionaries in
+words is very different from the ones in \TEX82, and that means there are some
+noticeable differences in handling as well.
+
+First and foremost, there is no \quote {compressed trie} involved in hyphenation.
+The algorithm still reads pattern files generated by \PATGEN, but \LUATEX\ uses a
+finite state hash to match the patterns against the word to be hyphenated. This
+algorithm is based on the \quote {libhnj} library used by \OPENOFFICE, which in
+turn is inspired by \TEX.
+
+There are a few differences between \LUATEX\ and \TEX82 that are a direct result
+of the implementation:
+
+\startitemize
+\startitem
+ \LUATEX\ happily hyphenates the full \UNICODE\ character range.
+\stopitem
+\startitem
+ Pattern and exception dictionary size is limited by the available memory
+ only, all allocations are done dynamically. The trie|-|related settings in
+ \type {texmf.cnf} are ignored.
+\stopitem
+\startitem
+ Because there is no \quote {trie preparation} stage, language patterns never
+ become frozen. This means that the primitive \prm {patterns} (and its \LUA\
+ counterpart \type {lang.patterns}) can be used at any time, not only in
+ ini\TEX.
+\stopitem
+\startitem
+ Only the string representation of \prm {patterns} and \prm {hyphenation} is
+ stored in the format file. At format load time, they are simply
+ re|-|evaluated. It follows that there is no real reason to preload languages
+ in the format file. In fact, it is usually not a good idea to do so. It is
+ much smarter to load patterns no sooner than the first time they are actually
+ needed.
+\stopitem
+\startitem
+ \LUATEX\ uses the language-specific variables \lpr {prehyphenchar} and \lpr
+ {posthyphenchar} in the creation of implicit discretionaries, instead of
+ \TEX82's \prm {hyphenchar}, and the values of the language|-|specific
+ variables \lpr {preexhyphenchar} and \lpr {postexhyphenchar} for explicit
+ discretionaries (instead of \TEX82's empty discretionary).
+\stopitem
+\startitem
+ The value of the two counters related to hyphenation, \prm {hyphenpenalty}
+ and \prm {exhyphenpenalty}, are now stored in the discretionary nodes. This
+ permits a local overload for explicit \prm {discretionary} commands. The
+ value current when the hyphenation pass is applied is used. When no callbacks
+ are used this is compatible with traditional \TEX. When you apply the \LUA\
+ \type {lang.hyphenate} function the current values are used.
+\stopitem
+\startitem
+ The hyphenation exception dictionary is maintained as key|-|value hash, and
+ that is also dynamic, so the \type {hyph_size} setting is not used either.
+\stopitem
+\stopitemize
+
+Because we store penalties in the disc node the \prm {discretionary} command has
+been extended to accept an optional penalty specification, so you can do the
+following:
+
+\startbuffer
+\hsize1mm
+1:foo{\hyphenpenalty 10000\discretionary{}{}{}}bar\par
+2:foo\discretionary penalty 10000 {}{}{}bar\par
+3:foo\discretionary{}{}{}bar\par
+\stopbuffer
+
+\typebuffer
+
+This results in:
+
+\blank \start \getbuffer \stop \blank
+
+Inserted characters and ligatures inherit their attributes from the nearest glyph
+node item (usually the preceding one, but the following one for the items
+inserted at the left-hand side of a word).
+
+Word boundaries are no longer implied by font switches, but by language switches.
+One word can have two separate fonts and still be hyphenated correctly (but it
+can not have two different languages, the \prm {setlanguage} command forces a
+word boundary).
+
+All languages start out with \type {\prehyphenchar=`\-}, \type {\posthyphenchar=0},
+\type {\preexhyphenchar=0} and \type {\postexhyphenchar=0}. When you assign the
+values of one of these four parameters, you are actually changing the settings
+for the current \prm {language}, this behaviour is compatible with \prm {patterns}
+and \prm {hyphenation}.
+
+\LUATEX\ also hyphenates the first word in a paragraph. Words can be up to 256
+characters long (up from 64 in \TEX82). Longer words are ignored right now, but
+eventually either the limitation will be removed or perhaps it will become
+possible to silently ignore the excess characters (this is what happens in
+\TEX82, but there the behaviour cannot be controlled).
+
+If you are using the \LUA\ function \type {lang.hyphenate}, you should be aware
+that this function expects to receive a list of \quote {character} nodes. It will
+not operate properly in the presence of \quote {glyph}, \quote {ligature}, or
+\quote {ghost} nodes, nor does it know how to deal with kerning.
+
+\stopsection
+
+\startsection[title={Applying ligatures and kerning}]
+
+\topicindex {ligatures}
+\topicindex {kerning}
+
+After all possible hyphenation points have been inserted in the list, \LUATEX\
+will process the list to convert the \quote {character} nodes into \quote {glyph}
+and \quote {ligature} nodes. This is actually done in two stages: first all
+ligatures are processed, then all kerning information is applied to the result
+list. But those two stages are somewhat dependent on each other: If the used font
+makes it possible to do so, the ligaturing stage adds virtual \quote {character}
+nodes to the word boundaries in the list. While doing so, it removes and
+interprets \prm {noboundary} nodes. The kerning stage deletes those word
+boundary items after it is done with them, and it does the same for \quote
+{ghost} nodes. Finally, at the end of the kerning stage, all remaining \quote
+{character} nodes are converted to \quote {glyph} nodes.
+
+This separation is worth mentioning because, if you overrule from \LUA\ only one
+of the two callbacks related to font handling, then you have to make sure you
+perform the tasks normally done by \LUATEX\ itself in order to make sure that the
+other, non|-|overruled, routine continues to function properly.
+
+Although we could improve the situation the reality is that in modern \OPENTYPE\
+fonts ligatures can be constructed in many ways: by replacing a sequence of
+characters by one glyph, or by selectively replacing individual glyphs, or by
+kerning, or any combination of this. Add to that contextual analysis and it will
+be clear that we have to let \LUA\ do that job instead. The generic font handler
+that we provide (which is part of \CONTEXT) distinguishes between base mode
+(which essentially is what we describe here and which delegates the task to \TEX)
+and node mode (which deals with more complex fonts.
+
+Let's look at an example. Take the word \type {office}, hyphenated \type
+{of-fice}, using a \quote {normal} font with all the \type {f}-\type {f} and
+\type {f}-\type {i} type ligatures:
+
+\starttabulate[|l|l|]
+\NC initial \NC \type {{o}{f}{f}{i}{c}{e}} \NC\NR
+\NC after hyphenation \NC \type {{o}{f}{{-},{},{}}{f}{i}{c}{e}} \NC\NR
+\NC first ligature stage \NC \type {{o}{{f-},{f},{<ff>}}{i}{c}{e}} \NC\NR
+\NC final result \NC \type {{o}{{f-},{<fi>},{<ffi>}}{c}{e}} \NC\NR
+\stoptabulate
+
+That's bad enough, but let us assume that there is also a hyphenation point
+between the \type {f} and the \type {i}, to create \type {of-f-ice}. Then the
+final result should be:
+
+\starttyping
+{o}{{f-},
+ {{f-},
+ {i},
+ {<fi>}},
+ {{<ff>-},
+ {i},
+ {<ffi>}}}{c}{e}
+\stoptyping
+
+with discretionaries in the post-break text as well as in the replacement text of
+the top-level discretionary that resulted from the first hyphenation point.
+
+Here is that nested solution again, in a different representation:
+
+\testpage[4]
+
+\starttabulate[|l|c|c|c|c|c|c|]
+\DB \BC pre \BC \BC post \BC \BC replace \BC \NC \NR
+\TB
+\NC topdisc \NC \type {f-} \NC (1) \NC sub 1 \NC \NC sub 2 \NC \NC \NR
+\NC sub 1 \NC \type {f-} \NC (2) \NC \type {i} \NC (3) \NC \type {<fi>} \NC (4) \NC \NR
+\NC sub 2 \NC \type {<ff>-} \NC (5) \NC \type {i} \NC (6) \NC \type {<ffi>} \NC (7) \NC \NR
+\LL
+\stoptabulate
+
+When line breaking is choosing its breakpoints, the following fields will
+eventually be selected:
+
+\starttabulate[|l|c|c|]
+\NC \type {of-f-ice} \NC \type {f-} \NC (1) \NC \NR
+\NC \NC \type {f-} \NC (2) \NC \NR
+\NC \NC \type {i} \NC (3) \NC \NR
+\NC \type {of-fice} \NC \type {f-} \NC (1) \NC \NR
+\NC \NC \type {<fi>} \NC (4) \NC \NR
+\NC \type {off-ice} \NC \type {<ff>-} \NC (5) \NC \NR
+\NC \NC \type {i} \NC (6) \NC \NR
+\NC \type {office} \NC \type {<ffi>} \NC (7) \NC \NR
+\stoptabulate
+
+The current solution in \LUATEX\ is not able to handle nested discretionaries,
+but it is in fact smart enough to handle this fictional \type {of-f-ice} example.
+It does so by combining two sequential discretionary nodes as if they were a
+single object (where the second discretionary node is treated as an extension of
+the first node).
+
+One can observe that the \type {of-f-ice} and \type {off-ice} cases both end with
+the same actual post replacement list (\type {i}), and that this would be the
+case even if \type {i} was the first item of a potential following ligature like
+\type {ic}. This allows \LUATEX\ to do away with one of the fields, and thus make
+the whole stuff fit into just two discretionary nodes.
+
+The mapping of the seven list fields to the six fields in this discretionary node
+pair is as follows:
+
+\starttabulate[|l|c|c|]
+\DB field \BC description \NC \NC \NR
+\TB
+\NC \type {disc1.pre} \NC \type {f-} \NC (1) \NC \NR
+\NC \type {disc1.post} \NC \type {<fi>} \NC (4) \NC \NR
+\NC \type {disc1.replace} \NC \type {<ffi>} \NC (7) \NC \NR
+\NC \type {disc2.pre} \NC \type {f-} \NC (2) \NC \NR
+\NC \type {disc2.post} \NC \type {i} \NC (3,6) \NC \NR
+\NC \type {disc2.replace} \NC \type {<ff>-} \NC (5) \NC \NR
+\LL
+\stoptabulate
+
+What is actually generated after ligaturing has been applied is therefore:
+
+\starttyping
+{o}{{f-},
+ {<fi>},
+ {<ffi>}}
+ {{f-},
+ {i},
+ {<ff>-}}{c}{e}
+\stoptyping
+
+The two discretionaries have different subtypes from a discretionary appearing on
+its own: the first has subtype 4, and the second has subtype 5. The need for
+these special subtypes stems from the fact that not all of the fields appear in
+their \quote {normal} location. The second discretionary especially looks odd,
+with things like the \type {<ff>-} appearing in \type {disc2.replace}. The fact
+that some of the fields have different meanings (and different processing code
+internally) is what makes it necessary to have different subtypes: this enables
+\LUATEX\ to distinguish this sequence of two joined discretionary nodes from the
+case of two standalone discretionaries appearing in a row.
+
+Of course there is still that relationship with fonts: ligatures can be implemented by
+mapping a sequence of glyphs onto one glyph, but also by selective replacement and
+kerning. This means that the above examples are just representing the traditional
+approach.
+
+\stopsection
+
+\startsection[title={Breaking paragraphs into lines}]
+
+\topicindex {linebreaks}
+\topicindex {paragraphs}
+\topicindex {discretionaries}
+
+This code is almost unchanged, but because of the above|-|mentioned changes with
+respect to discretionaries and ligatures, line breaking will potentially be
+different from traditional \TEX. The actual line breaking code is still based on
+the \TEX82 algorithms, and there can be no discretionaries inside of
+discretionaries. But, as patterns evolve and font handling can influence
+discretionaries, you need to be aware of the fact that long term consistency is
+not an engine matter only.
+
+But that situation is now fairly common in \LUATEX, due to the changes to the
+ligaturing mechanism. And also, the \LUATEX\ discretionary nodes are implemented
+slightly different from the \TEX82 nodes: the \type {no_break} text is now
+embedded inside the disc node, where previously these nodes kept their place in
+the horizontal list. In traditional \TEX\ the discretionary node contains a
+counter indicating how many nodes to skip, but in \LUATEX\ we store the pre, post
+and replace text in the discretionary node.
+
+The combined effect of these two differences is that \LUATEX\ does not always use
+all of the potential breakpoints in a paragraph, especially when fonts with many
+ligatures are used. Of course kerning also complicates matters here.
+
+\stopsection
+
+\startsection[title={The \type {lang} library}][library=lang]
+
+\subsection {\type {new} and \type {id}}
+
+\topicindex {languages+library}
+
+\libindex {new}
+\libindex {id}
+
+This library provides the interface to \LUATEX's structure representing a
+language, and the associated functions.
+
+\startfunctioncall
+<language> l = lang.new()
+<language> l = lang.new(<number> id)
+\stopfunctioncall
+
+This function creates a new userdata object. An object of type \type {<language>}
+is the first argument to most of the other functions in the \type {lang} library.
+These functions can also be used as if they were object methods, using the colon
+syntax. Without an argument, the next available internal id number will be
+assigned to this object. With argument, an object will be created that links to
+the internal language with that id number.
+
+\startfunctioncall
+<number> n = lang.id(<language> l)
+\stopfunctioncall
+
+The number returned is the internal \prm {language} id number this object refers to.
+
+\subsection {\type {hyphenation}}
+
+\libindex {hyphenation}
+
+You can hyphenate a string directly with:
+
+\startfunctioncall
+<string> n = lang.hyphenation(<language> l)
+lang.hyphenation(<language> l, <string> n)
+\stopfunctioncall
+
+\subsection {\type {clear_hyphenation} and \type {clean}}
+
+\libindex {clear_hyphenation}
+\libindex {clean}
+
+This either returns the current hyphenation exceptions for this language, or adds
+new ones. The syntax of the string is explained in~\in {section}
+[patternsexceptions].
+
+\startfunctioncall
+lang.clear_hyphenation(<language> l)
+\stopfunctioncall
+
+This call clears the exception dictionary (string) for this language.
+
+\startfunctioncall
+<string> n = lang.clean(<language> l, <string> o)
+<string> n = lang.clean(<string> o)
+\stopfunctioncall
+
+This function creates a hyphenation key from the supplied hyphenation value. The
+syntax of the argument string is explained in \in {section} [patternsexceptions].
+This function is useful if you want to do something else based on the words in a
+dictionary file, like spell|-|checking.
+
+\subsection {\type {patterns} and \type {clear_patterns}}
+
+\libindex {patterns}
+\libindex {clear_patterns}
+
+\startfunctioncall
+<string> n = lang.patterns(<language> l)
+lang.patterns(<language> l, <string> n)
+\stopfunctioncall
+
+This adds additional patterns for this language object, or returns the current
+set. The syntax of this string is explained in \in {section}
+[patternsexceptions].
+
+\startfunctioncall
+lang.clear_patterns(<language> l)
+\stopfunctioncall
+
+This can be used to clear the pattern dictionary for a language.
+
+\subsection {\type {hyphenationmin}}
+
+\libindex {hyphenationmin}
+
+This function sets (or gets) the value of the \TEX\ parameter
+\type {\hyphenationmin}.
+
+\startfunctioncall
+n = lang.hyphenationmin(<language> l)
+lang.hyphenationmin(<language> l, <number> n)
+\stopfunctioncall
+
+\subsection {\type {[pre|post][ex|]hyphenchar}}
+
+\libindex {prehyphenchar}
+\libindex {posthyphenchar}
+\libindex {preexhyphenchar}
+\libindex {postexhyphenchar}
+
+\startfunctioncall
+<number> n = lang.prehyphenchar(<language> l)
+lang.prehyphenchar(<language> l, <number> n)
+
+<number> n = lang.posthyphenchar(<language> l)
+lang.posthyphenchar(<language> l, <number> n)
+\stopfunctioncall
+
+These two are used to get or set the \quote {pre|-|break} and \quote
+{post|-|break} hyphen characters for implicit hyphenation in this language. The
+intial values are decimal 45 (hyphen) and decimal~0 (indicating emptiness).
+
+\startfunctioncall
+<number> n = lang.preexhyphenchar(<language> l)
+lang.preexhyphenchar(<language> l, <number> n)
+
+<number> n = lang.postexhyphenchar(<language> l)
+lang.postexhyphenchar(<language> l, <number> n)
+\stopfunctioncall
+
+These gets or set the \quote {pre|-|break} and \quote {post|-|break} hyphen
+characters for explicit hyphenation in this language. Both are initially
+decimal~0 (indicating emptiness).
+
+\subsection {\type {hyphenate}}
+
+\libindex {hyphenate}
+
+The next call inserts hyphenation points (discretionary nodes) in a node list. If
+\type {tail} is given as argument, processing stops on that node. Currently,
+\type {success} is always true if \type {head} (and \type {tail}, if specified)
+are proper nodes, regardless of possible other errors.
+
+\startfunctioncall
+<boolean> success = lang.hyphenate(<node> head)
+<boolean> success = lang.hyphenate(<node> head, <node> tail)
+\stopfunctioncall
+
+Hyphenation works only on \quote {characters}, a special subtype of all the glyph
+nodes with the node subtype having the value \type {1}. Glyph modes with
+different subtypes are not processed. See \in {section} [charsandglyphs] for
+more details.
+
+\subsection {\type {[set|get]hjcode}}
+
+\libindex {sethjcode}
+\libindex {gethjcode}
+
+The following two commands can be used to set or query hj codes:
+
+\startfunctioncall
+lang.sethjcode(<language> l, <number> char, <number> usedchar)
+<number> usedchar = lang.gethjcode(<language> l, <number> char)
+\stopfunctioncall
+
+When you set a hjcode the current sets get initialized unless the set was already
+initialized due to \prm {savinghyphcodes} being larger than zero.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
+
+% \parindent0pt \hsize=1.1cm
+% 12-34-56 \par
+% 12-34-\hbox{56} \par
+% 12-34-\vrule width 1em height 1.5ex \par
+% 12-\hbox{34}-56 \par
+% 12-\vrule width 1em height 1.5ex-56 \par
+% \hjcode`\1=`\1 \hjcode`\2=`\2 \hjcode`\3=`\3 \hjcode`\4=`\4 \vskip.5cm
+% 12-34-56 \par
+% 12-34-\hbox{56} \par
+% 12-34-\vrule width 1em height 1.5ex \par
+% 12-\hbox{34}-56 \par
+% 12-\vrule width 1em height 1.5ex-56 \par
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-libraries.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-libraries.tex
new file mode 100644
index 00000000000..d8210ac48c7
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-libraries.tex
@@ -0,0 +1,573 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-libraries
+
+\startchapter[reference=libraries,title={Extra libraries}]
+
+\startsection[title=Introduction]
+
+The libraries can be grouped in categories like fonts, languages, \TEX,
+\METAPOST, \PDF, etc. There are however also some that are more general puspose
+and these are discussed here.
+
+\stopsection
+
+\startsection[title=File and string readers: \type {fio} and type {sio}]
+
+This library provides a set of functions for reading numbers from a file and
+in addition to the regular \type {io} library functions. The following
+work on normal \LUA\ file handles.
+
+\starttabulate[|Tw(12em)|T|T|]
+\DB name \BC arguments \BC results \NC \NR
+\TB
+\NC readcardinal1 \NC (f) \NC a 1 byte unsigned integer \NC \NR
+\NC readcardinal2 \NC (f) \NC a 2 byte unsigned integer \NC \NR
+\NC readcardinal3 \NC (f) \NC a 3 byte unsigned integer \NC \NR
+\NC readcardinal4 \NC (f) \NC a 4 byte unsigned integer \NC \NR
+\NC readcardinaltable \NC (f,n,b) \NC \type {n} cardinals of \type {b} bytes \NC \NR
+\NC readinteger1 \NC (f) \NC a 1 byte signed integer \NC \NR
+\NC readinteger2 \NC (f) \NC a 2 byte signed integer \NC \NR
+\NC readinteger3 \NC (f) \NC a 3 byte signed integer \NC \NR
+\NC readinteger4 \NC (f) \NC a 4 byte signed integer \NC \NR
+\NC readintegertable \NC (f,n,b) \NC \type {n} integers of \type {b} bytes \NC \NR
+\NC readfixed2 \NC (f) \NC a 2 byte float (used in font files) \NC \NR
+\NC readfixed4 \NC (f) \NC a 4 byte float (used in font files) \NC \NR
+\NC read2dot14 \NC (f) \NC a 2 byte float (used in font files) \NC \NR
+\NC setposition \NC (f,p) \NC goto position \type {p} \NC \NR
+\NC getposition \NC (f) \NC get the current position \NC \NR
+\NC skipposition \NC (f,n) \NC skip \type {n} positions \NC \NR
+\NC readbytes \NC (f,n) \NC \type {n} bytes \NC \NR
+\NC readbytetable \NC (f,n) \NC \type {n} bytes\NC \NR
+\LL
+\stoptabulate
+
+When relevant there are also variants that end with \type {le} that do it the
+little endian way.
+
+A similar set of function as in the \type {fio} library is available in the \type
+{sio} library: \libidx {sio} {readcardinal1}, \libidx {sio} {readcardinal2},
+\libidx {sio} {readcardinal3}, \libidx {sio} {readcardinal4}, \libidx {sio}
+{readcardinaltable}, \libidx {sio} {readinteger1}, \libidx {sio} {readinteger2},
+\libidx {sio} {readinteger3}, \libidx {sio} {readinteger4}, \libidx {sio}
+{readintegertable}, \libidx {sio} {readfixed2}, \libidx {sio} {readfixed4},
+\libidx {sio} {read2dot14}, \libidx {sio} {setposition}, \libidx {sio}
+{getposition}, \libidx {sio} {skipposition}, \libidx {sio} {readbytes} and
+\libidx {sio} {readbytetable}. Here the first argument is a string instead of a
+file handle.
+
+\stopsection
+
+\startsection[title=\type{md5}]
+
+\starttabulate[|Tw(12em)|T|T|]
+\DB name \BC arguments \BC results \NC \NR
+\TB
+\NC sum \NC \NC \NC \NR
+\NC hex \NC \NC \NC \NR
+\NC HEX \NC \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title=\type{sha2}]
+
+\starttabulate[|Tw(12em)|T|T|]
+\DB name \BC arguments \BC results \NC \NR
+\TB
+\NC digest256 \NC \NC \NC \NR
+\NC digest384 \NC \NC \NC \NR
+\NC digest512 \NC \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+% \startsection[title=\type{flate}]
+%
+% \starttabulate[|Tw(12em)|T|T|]
+% \DB name \BC arguments \BC results \NC \NR
+% \TB
+% \NC flate_compress \NC \NC \NC \NR
+% \NC flate_decompress \NC \NC \NC \NR
+% \NC zip_compress \NC \NC \NC \NR
+% \NC zip_decompress \NC \NC \NC \NR
+% \NC gz_compress \NC \NC \NC \NR
+% \NC gz_decompress \NC \NC \NC \NR
+% \NC update_adler32 \NC \NC \NC \NR
+% \NC update_crc32 \NC \NC \NC \NR
+% \LL
+% \stoptabulate
+%
+% \stopsection
+
+\startsection[title=\type{xzip}]
+
+\starttabulate[|Tw(12em)|T|T|]
+\DB name \BC arguments \BC results \NC \NR
+\TB
+\NC compress \NC \NC \NC \NR
+\NC decompress \NC \NC \NC \NR
+\NC adler32 \NC \NC \NC \NR
+\NC crc32 \NC \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title=\type{xmath}]
+
+This library just opens up standard \CCODE\ math library and the main reason for
+it being there is that it permits advanced graphics in \METAPOST\ (via the \LUA\
+interface). There are three constant values:
+
+\starttabulate[|Tw(12em)|T|T|]
+\DB name \BC arguments \BC results \NC \NR
+\TB
+\NC inf \NC \emdash \NC \cldcontext{xmath.inf} \NC \NR
+\NC nan \NC \emdash \NC \cldcontext{xmath.nan} \NC \NR
+\NC pi \NC \emdash \NC \cldcontext{xmath.pi} \NC \NR
+\LL
+\stoptabulate
+
+and a lot of functions:
+
+\starttabulate[|Tw(12em)|T|T|]
+\DB name \BC arguments \BC results \NC \NR
+\TB
+\NC acos \NC (a) \NC \NC \NR
+\NC acosh \NC (a) \NC \NC \NR
+\NC asin \NC (a) \NC \NC \NR
+\NC asinh \NC (a) \NC \NC \NR
+\NC atan \NC (a[,b]) \NC \NC \NR
+\NC atan2 \NC (a[,b]) \NC \NC \NR
+\NC atanh \NC (a) \NC \NC \NR
+\NC cbrt \NC (a) \NC \NC \NR
+\NC ceil \NC (a) \NC \NC \NR
+\NC copysign \NC (a,b) \NC \NC \NR
+\NC cos \NC (a) \NC \NC \NR
+\NC cosh \NC (a) \NC \NC \NR
+\NC deg \NC (a) \NC \NC \NR
+\NC erf \NC (a) \NC \NC \NR
+\NC erfc \NC (a) \NC \NC \NR
+\NC exp \NC (a) \NC \NC \NR
+\NC exp2 \NC (a) \NC \NC \NR
+\NC expm1 \NC (a) \NC \NC \NR
+\NC fabs \NC (a) \NC \NC \NR
+\NC fdim \NC (a,b) \NC \NC \NR
+\NC floor \NC (a) \NC \NC \NR
+\NC fma \NC (a,b,c) \NC \NC \NR
+\NC fmax \NC (...) \NC \NC \NR
+\NC fmin \NC (...) \NC \NC \NR
+\NC fmod \NC (a,b) \NC \NC \NR
+\NC frexp \NC (a,b) \NC \NC \NR
+\NC gamma \NC (a) \NC \NC \NR
+\NC hypot \NC (a,b) \NC \NC \NR
+\NC isfinite \NC (a) \NC \NC \NR
+\NC isinf \NC (a) \NC \NC \NR
+\NC isnan \NC (a) \NC \NC \NR
+\NC isnormal \NC (a) \NC \NC \NR
+\NC j0 \NC (a) \NC \NC \NR
+\NC j1 \NC (a) \NC \NC \NR
+\NC jn \NC (a,b) \NC \NC \NR
+\NC ldexp \NC (a,b) \NC \NC \NR
+\NC lgamma \NC (a) \NC \NC \NR
+\NC l0 \NC (a) \NC \NC \NR
+\NC l1 \NC (a) \NC \NC \NR
+\NC ln \NC (a,b) \NC \NC \NR
+\NC log \NC (a[,b]) \NC \NC \NR
+\NC log10 \NC (a) \NC \NC \NR
+\NC log1p \NC (a) \NC \NC \NR
+\NC log2 \NC (a) \NC \NC \NR
+\NC logb \NC (a) \NC \NC \NR
+\NC modf \NC (a,b) \NC \NC \NR
+\NC nearbyint \NC (a) \NC \NC \NR
+\NC nextafter \NC (a,b) \NC \NC \NR
+\NC pow \NC (a,b) \NC \NC \NR
+\NC rad \NC (a) \NC \NC \NR
+\NC remainder \NC (a,b) \NC \NC \NR
+\NC remquo \NC (a,b) \NC \NC \NR
+\NC round \NC (a) \NC \NC \NR
+\NC scalbn \NC (a,b) \NC \NC \NR
+\NC sin \NC (a) \NC \NC \NR
+\NC sinh \NC (a) \NC \NC \NR
+\NC sqrt \NC (a) \NC \NC \NR
+\NC tan \NC (a) \NC \NC \NR
+\NC tanh \NC (a) \NC \NC \NR
+\NC tgamma \NC (a) \NC \NC \NR
+\NC trunc \NC (a) \NC \NC \NR
+\NC y0 \NC (a) \NC \NC \NR
+\NC y1 \NC (a) \NC \NC \NR
+\NC yn \NC (a) \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title=\type{xcomplex}]
+
+\LUAMETATEX\ also provides a complex library \type {xcomplex}. The complex
+number is a userdatum:
+
+\starttabulate[|Tw(12em)|T|T|]
+\DB name \BC arguments \BC results \NC \NR
+\TB
+\NC new \NC (r,i) \NC a complex userdata type \NC \NR
+\NC tostring \NC (z) \NC a string representation \NC \NR
+\NC topair \NC (z) \NC two numbers \NC \NR
+\LL
+\stoptabulate
+
+There is a bunch of functions that take a complex number:
+
+\starttabulate[|Tw(12em)|T|T|]
+\DB name \BC arguments \BC results \NC \NR
+\TB
+\NC abs \NC (a) \NC \NC \NR
+\NC arg \NC (a) \NC \NC \NR
+\NC imag \NC (a) \NC \NC \NR
+\NC real \NC (a) \NC \NC \NR
+\NC onj \NC (a) \NC \NC \NR
+\NC proj \NC (a) \NC \NC \NR
+\NC exp" \NC (a) \NC \NC \NR
+\NC log \NC (a) \NC \NC \NR
+\NC sqrt \NC (a) \NC \NC \NR
+\NC pow \NC (a,b) \NC \NC \NR
+\NC sin \NC (a) \NC \NC \NR
+\NC cos \NC (a) \NC \NC \NR
+\NC tan \NC (a) \NC \NC \NR
+\NC asin \NC (a) \NC \NC \NR
+\NC acos \NC (a) \NC \NC \NR
+\NC atan \NC (a) \NC \NC \NR
+\NC sinh \NC (a) \NC \NC \NR
+\NC cosh \NC (a) \NC \NC \NR
+\NC tanh \NC (a) \NC \NC \NR
+\NC asinh \NC (a) \NC \NC \NR
+\NC acosh \NC (a) \NC \NC \NR
+\NC atanh \NC (a) \NC \NC \NR
+\LL
+\stoptabulate
+
+These are accompanied by \type {libcerf} functions:
+
+\starttabulate[|Tw(12em)|T|T|]
+\DB name \BC arguments \BC results \NC \NR
+\TB
+\NC erf \NC (a) \NC The complex error function erf(z) \NC \NR
+\NC erfc \NC (a) \NC The complex complementary error function erfc(z) = 1 - erf(z) \NC \NR
+\NC erfcx \NC (a) \NC The underflow-compensating function erfcx(z) = exp(z^2) erfc(z) \NC \NR
+\NC erfi \NC (a) \NC The imaginary error function erfi(z) = -i erf(iz) \NC \NR
+\NC dawson \NC (a) \NC Dawson's integral D(z) = sqrt(pi)/2 * exp(-z^2) * erfi(z) \NC \NR
+\NC voigt \NC (a,b,c) \NC The convolution of a Gaussian and a Lorentzian \NC \NR
+\NC voigt_hwhm \NC (a,b) \NC The half width at half maximum of the Voigt profile \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title=\type{lfs}]
+
+The original \type {lfs} module has been adapted a bit to our needs but for
+practical reasons we kept the namespace. This module will probably evolve a bit
+over time.
+
+\starttabulate[|Tw(12em)|T|Tp|]
+\DB name \BC arguments \BC results \NC \NR
+\TB
+\NC attributes \NC (name) \NC \NC \NR
+\NC chdir \NC (name) \NC \NC \NR
+\NC currentdir \NC () \NC \NC \NR
+\NC dir \NC (name) \NC \type {name}, \type {mode}, \type {size} and \type {mtime} \NC \NR
+\NC mkdir \NC (name) \NC \NC \NR
+\NC rmdir \NC (name) \NC \NC \NR
+\NC touch \NC (name) \NC \NC \NR
+\NC link \NC (name) \NC \NC \NR
+\NC symlinkattributes \NC (name) \NC \NC \NR
+\NC isdir \NC (name) \NC \NC \NR
+\NC isfile \NC (name) \NC \NC \NR
+\NC iswriteabledir \NC (name) \NC \NC \NR
+\NC iswriteablefile \NC (name) \NC \NC \NR
+\NC isreadabledir \NC (name) \NC \NC \NR
+\NC isreadablefile \NC (name) \NC \NC \NR
+\LL
+\stoptabulate
+
+The \type {dir} function is a traverser which in addition to the name returns
+some more properties. Keep in mind that the traverser loops over a directory and
+that it doesn't run well when used nested. This is a side effect of the operating
+system. It is also the reason why we return some properties because querying them
+via \type {attributes} would interfere badly.
+
+The following attributes are returned by \type {attributes}:
+
+\starttabulate[|Tw(12em)|T|]
+\DB name \BC value \NC \NR
+\TB
+\NC mode \NC \NC \NR
+\NC size \NC \NC \NR
+\NC modification \NC \NC \NR
+\NC access \NC \NC \NR
+\NC change \NC \NC \NR
+\NC permissions \NC \NC \NR
+\NC nlink \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title=\type{pngdecode}]
+
+This module is experimental and used in image inclusion. It is not some general
+purpose module and is supposed to be used in a very controlled way. The
+interfaces might evolve.
+
+\starttabulate[|Tw(12em)|T|T|]
+\DB name \BC arguments \BC results \NC \NR
+\TB
+\NC applyfilter \NC (str,nx,ny,slice) \NC string \NC \NR
+\NC splitmask \NC (str,nx,ny,bpp,bytes) \NC string \NC \NR
+\NC interlace \NC (str,nx,ny,slice,pass) \NC string \NC \NR
+\NC expand \NC (str,nx,ny,parts,xline,factor) \NC string \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title=\type{basexx}]
+
+Some more experimental helpers:
+
+\starttabulate[|Tw(12em)|T|T|]
+\DB name \BC arguments \BC results \NC \NR
+\TB
+\NC encode16 \NC (str[,newline]) \NC string \NC \NR
+\NC decode16 \NC (str) \NC string \NC \NR
+\NC encode64 \NC (str[,newline]) \NC string \NC \NR
+\NC decode64 \NC (str) \NC string \NC \NR
+\NC encode85 \NC (str[,newline]) \NC string \NC \NR
+\NC decode85 \NC (str) \NC string \NC \NR
+\NC encodeRL \NC (str) \NC string \NC \NR
+\NC decodeRL \NC (str) \NC string \NC \NR
+\NC encodeLZW \NC (str[,defaults]) \NC string \NC \NR
+\NC decodeLZW \NC (str[,defaults]) \NC string \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title={Multibyte \type {string} functions}]
+
+The \type {string} library has a few extra functions, for example \libidx
+{string} {explode}. This function takes upto two arguments: \type
+{string.explode(s[,m])} and returns an array containing the string argument \type
+{s} split into sub-strings based on the value of the string argument \type {m}.
+The second argument is a string that is either empty (this splits the string into
+characters), a single character (this splits on each occurrence of that
+character, possibly introducing empty strings), or a single character followed by
+the plus sign \type {+} (this special version does not create empty sub-strings).
+The default value for \type {m} is \quote {\type { +}} (multiple spaces). Note:
+\type {m} is not hidden by surrounding braces as it would be if this function was
+written in \TEX\ macros.
+
+The \type {string} library also has six extra iterators that return strings
+piecemeal: \libidx {string} {utfvalues}, \libidx {string} {utfcharacters},
+\libidx {string} {characters}, \libidx {string} {characterpairs}, \libidx
+{string} {bytes} and \libidx {string} {bytepairs}.
+
+\startitemize
+\startitem
+ \type {string.utfvalues(s)}: an integer value in the \UNICODE\ range
+\stopitem
+\startitem
+ \type {string.utfcharacters(s)}: a string with a single \UTF-8 token in it
+\stopitem
+\startitem
+ \type {string.cWharacters(s)}: a string containing one byte
+\stopitem
+\startitem
+ \type {string.characterpairs(s)}: two strings each containing one byte or an
+ empty second string if the string length was odd
+\stopitem
+\startitem
+ \type {string.bytes(s)}: a single byte value
+\stopitem
+\startitem
+ \type {string.bytepairs(s)}: two byte values or nil instead of a number as
+ its second return value if the string length was odd
+\stopitem
+\stopitemize
+
+The \type {string.characterpairs()} and \type {string.bytepairs()} iterators
+are useful especially in the conversion of \UTF16 encoded data into \UTF8.
+
+There is also a two|-|argument form of \type {string.dump()}. The second argument
+is a boolean which, if true, strips the symbols from the dumped data. This
+matches an extension made in \type {luajit}. This is typically a function that
+gets adapted as \LUA\ itself progresses.
+
+The \type {string} library functions \type {len}, \type {lower}, \type {sub}
+etc.\ are not \UNICODE|-|aware. For strings in the \UTF8 encoding, i.e., strings
+containing characters above code point 127, the corresponding functions from the
+\type {slnunicode} library can be used, e.g., \type {unicode.utf8.len}, \type
+{unicode.utf8.lower} etc.\ The exceptions are \type {unicode.utf8.find}, that
+always returns byte positions in a string, and \type {unicode.utf8.match} and
+\type {unicode.utf8.gmatch}. While the latter two functions in general {\it
+are} \UNICODE|-|aware, they fall|-|back to non|-|\UNICODE|-|aware behavior when
+using the empty capture \type {()} but other captures work as expected. For the
+interpretation of character classes in \type {unicode.utf8} functions refer to
+the library sources at \hyphenatedurl {http://luaforge.net/projects/sln}.
+
+Version 5.3 of \LUA\ provides some native \UTF8 support but we have added a few
+similar helpers too: \libidx {string} {utfvalue}, \libidx {string} {utfcharacter}
+and \libidx {string} {utflength}.
+
+\startitemize
+\startitem
+ \type {string.utfvalue(s)}: returns the codepoints of the characters in the
+ given string
+\stopitem
+\startitem
+ \type {string.utfcharacter(c,...)}: returns a string with the characters of
+ the given code points
+\stopitem
+\startitem
+ \type {string.utflength(s)}: returns the length of the given string
+\stopitem
+\stopitemize
+
+These three functions are relative fast and don't do much checking. They can be
+used as building blocks for other helpers.
+
+\stopsection
+
+\startsection[title={Extra \type {os} library functions}]
+
+The \type {os} library has a few extra functions and variables: \libidx {os}
+{selfdir}, \libidx {os} {selfarg}, \libidx {os} {setenv}, \libidx {os} {env}, \libidx {os}
+{gettimeofday}, \libidx {os} {type}, \libidx {os} {name} and \libidx {os}
+{uname}, that we will discuss here. There are also some time related helpers in
+the \type {lua} namespace.
+
+\startitemize
+
+% selfbin
+% selfpath
+% selfdir
+% selfbase
+% selfname
+% selfcore
+
+\startitem
+ \type {os.selfdir} is a variable that holds the directory path of the
+ actual executable. For example: \type {\directlua {tex.sprint(os.selfdir)}}.
+\stopitem
+
+\startitem
+ \type {os.selfarg} is a table with the command line arguments.
+\stopitem
+
+\startitem
+ \type {os.setenv(key,value)} sets a variable in the environment. Passing
+ \type {nil} instead of a value string will remove the variable.
+\stopitem
+
+\startitem
+ \type {os.env} is a hash table containing a dump of the variables and
+ values in the process environment at the start of the run. It is writeable,
+ but the actual environment is \notabene {not} updated automatically.
+\stopitem
+
+\startitem
+ \type {os.gettimeofday} returns the current \quote {\UNIX\ time}, but as a
+ float. Keep in mind that there might be platforms where this function is
+ available.
+\stopitem
+
+\startitem
+ \type {os.type} is a string that gives a global indication of the class of
+ operating system. The possible values are currently \type {windows}, \type
+ {unix}, and \type {msdos} (you are unlikely to find this value \quote {in the
+ wild}).
+\stopitem
+
+\startitem
+ \type {os.name} is a string that gives a more precise indication of the
+ operating system. These possible values are not yet fixed, and for \type
+ {os.type} values \type {windows} and \type {msdos}, the \type {os.name}
+ values are simply \type {windows} and \type {msdos}
+
+ The list for the type \type {unix} is more precise: \type {linux}, \type
+ {freebsd}, \type {kfreebsd}, \type {cygwin}, \type {openbsd}, \type
+ {solaris}, \type {sunos} (pre-solaris), \type {hpux}, \type {irix}, \type
+ {macosx}, \type {gnu} (hurd), \type {bsd} (unknown, but \BSD|-|like), \type
+ {sysv}, \type {generic} (unknown). But \unknown\ we only provide \LUAMETATEX\
+ binaries for the mainstream variants.
+
+ Officially we only support mainstream systems: \MSWINDOWS, \LINUX, \FREEBSD\
+ and \OSX. Of course one can build \LUAMETATEX\ for other systems, in which
+ case on has to check the above.
+\stopitem
+
+\startitem
+ \type {os.uname} returns a table with specific operating system
+ information acquired at runtime. The keys in the returned table are all
+ string values, and their names are: \type {sysname}, \type {machine}, \type
+ {release}, \type {version}, and \type {nodename}.
+\stopitem
+
+\stopitemize
+
+\stopsection
+
+\startsection[title={The \type {lua} library functions}]
+
+The \type {lua} library provide some general helpers.
+
+\startitemize
+
+\startitem
+ The \type {newtable} and \type {newindex} functions can be used to create
+ tables with space reserved beforehand for the given amount of entries.
+\stopitem
+
+\startitem
+ The \type {getstacktop} function returns a number that can be used for
+ diagnostic purposes.
+\stopitem
+
+\startitem
+ The functions \type {getruntime}, \type {getcurrenttime}, \type
+ {getpreciseticks} and \type {getpreciseseconds} return what their name
+ suggests.
+\stopitem
+
+\startitem
+ On \MSWINDOWS\ the \type {getcodepage} function returns two numbers, one
+ for the command handler and one for the graphical user interface.
+\stopitem
+
+\startitem
+ The name of the startup file is reported by \type {getstartupfile}.
+\stopitem
+
+\startitem
+ The \LUA\ version is reported by \type {getversion}.
+\stopitem
+
+\startitem
+ The \type {lua.openfile} function can be used instead of \type {io.open}. On
+ \MSWINDOWS\ it will convert the filename to a so called wide one which means
+ that filenames in \UTF8 encoding will work ok. On the other hand, names given
+ in the codepage won't.
+\stopitem
+
+\stopitemize
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-lua.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-lua.tex
new file mode 100644
index 00000000000..a126a95dcea
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-lua.tex
@@ -0,0 +1,224 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-lua
+
+\startchapter[reference=lua,title={Using \LUAMETATEX}]
+
+\startsection[title={Initialization},reference=init]
+
+\startsubsection[title={\LUAMETATEX\ as a \LUA\ interpreter}]
+
+\topicindex {initialization}
+\topicindex {\LUA+interpreter}
+
+Although \LUAMETATEX\ is primarily meant as a \TEX\ engine, it can also serve as
+a stand alone \LUA\ interpreter. There are two ways to make \LUAMETATEX\ behave
+like a standalone \LUA\ interpreter:
+
+\startitemize[packed]
+\startitem
+ if a \type {--luaonly} option is given on the commandline, or
+\stopitem
+\startitem
+ if the only non|-|option argument (file) on the commandline has the extension
+ \type {lua} or \type {luc}.
+\stopitem
+\stopitemize
+
+In this mode, it will set \LUA's \type {arg[0]} to the found script name, pushing
+preceding options in negative values and the rest of the command line in the
+positive values, just like the \LUA\ interpreter does.
+
+\LUAMETATEX\ will exit immediately after executing the specified \LUA\ script and is,
+in effect, a somewhat bulky stand alone \LUA\ interpreter with a bunch of extra
+preloaded libraries.
+
+When no argument is given, \LUAMETATEX\ will look for a \LUA\ file with the same
+name as the binary and run that one when present. This makes it possible to use
+the engine as a stub. For instance, in \CONTEXT\ a symlink from \type {mtxrun} to
+type {luametatex} will run the \type {mtxrun.lua} script when present in the same
+path as the binary itself
+
+\stopsubsection
+
+\startsubsection[title={Other commandline processing}]
+
+\topicindex {command line}
+
+When the \LUAMETATEX\ executable starts, it looks for the \type {--lua} command line
+option. If there is no \type {--lua} option, the command line is interpreted in a
+similar fashion as the other \TEX\ engines. All options are accepted but only some
+are understood by \LUAMETATEX\ itself:
+
+\starttabulate[|l|p|]
+\DB commandline argument \BC explanation \NC \NR
+\TB
+\NC \type{--credits} \NC display credits and exit \NC \NR
+\NC \type{--fmt=FORMAT} \NC load the format file \type {FORMAT} \NC\NR
+\NC \type{--help} \NC display help and exit \NC\NR
+\NC \type{--ini} \NC be \type {iniluatex}, for dumping formats \NC\NR
+\NC \type{--jobname=STRING} \NC set the job name to \type {STRING} \NC \NR
+\NC \type{--lua=FILE} \NC load and execute a \LUA\ initialization script \NC\NR
+\NC \type{--version} \NC display version and exit \NC \NR
+\LL
+\stoptabulate
+
+There are less options than with \LUATEX, because one has to deal with them in
+\LUA\ anyway. There are no options to enter a safer mode or control executing
+programs. This can easily be achieved with a startup \LUA\ script.
+
+The value to use for \prm {jobname} is decided as follows:
+
+\startitemize
+\startitem
+ If \type {--jobname} is given on the command line, its argument will be the
+ value for \prm {jobname}, without any changes. The argument will not be
+ used for actual input so it need not exist. The \type {--jobname} switch only
+ controls the \prm {jobname} setting.
+\stopitem
+\startitem
+ Otherwise, \prm {jobname} will be the name of the first file that is read
+ from the file system, with any path components and the last extension (the
+ part following the last \type {.}) stripped off.
+\stopitem
+\startitem
+ There is an exception to the previous point: if the command line goes into
+ interactive mode (by starting with a command) and there are no files input
+ via \prm {everyjob} either, then the \prm {jobname} is set to \type
+ {texput} as a last resort.
+\stopitem
+\stopitemize
+
+Next the initialization script is loaded and executed. From within the script,
+the entire command line is available in the \LUA\ table \type {arg}, beginning
+with \type {arg[0]}, containing the name of the executable. As consequence
+warnings about unrecognized options are suppressed.
+
+Command line processing happens very early on. So early, in fact, that none of
+\TEX's initializations have taken place yet. The \LUA\ libraries that don't deal
+with \TEX\ are initialized early.
+
+\LUAMETATEX\ allows some of the command line options to be overridden by reading
+values from the \type {texconfig} table at the end of script execution (see the
+description of the \type {texconfig} table later on in this document for more
+details on which ones exactly).
+
+So let's summarize this. The handling of when is called jobname is a bit complex.
+There can be explicit names set on the command line but when not set they can be
+taken from the \type {texconfig} table.
+
+\starttabulate[|l|T|T|T|]
+\NC startup filename \NC --lua \NC a \LUA\ file \NC \NC \NR
+\NC startup jobname \NC --jobname \NC a \TEX\ tex \NC texconfig.jobname \NC \NR
+\NC startup dumpname \NC --fmt \NC a format file \NC texconfig.formatname \NC \NR
+\stoptabulate
+
+These names are initialized according to \type {--luaonly} or the first filename
+seen in the list of options. Special treatment of \type {&} and \type {*} as well
+as interactive startup is gone.
+
+When we are in \TEX\ mode at some point the engine needs a filename, for instance
+for opening a log file. At that moment the set jobname becomes the internal one
+and when it has not been set which internalized to jobname but when not set
+becomes \type {texput}. When you see a \type {texput.log} file someplace on your
+system it normally indicates a bad run.
+
+When running on \MSWINDOWS\ the command line, filenames, environment variable
+access etc.\ internally uses the current code page but to the user is exposed as
+\UTF8. Normally users won't notice this.
+
+% fileio_state .jobname : a tex string (set when a (log) file is opened)
+% engine_state .startup_jobname : handles by option parser
+% environment_state.input_name : temporary interceptor
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\LUA\ behaviour}]
+
+\startsubsection[title={The \LUA\ version}]
+
+\topicindex {\LUA+libraries}
+\topicindex {\LUA+extensions}
+
+We currently use \LUA\ 5.4 and will follow developments of the language but
+normally with some delay. Therefore the user needs to keep an eye on (subtle)
+differences in successive versions of the language. Here is an example of one
+aspect.
+
+\LUA s \type {tostring} function (and \type {string.format}) may return values in
+scientific notation, thereby confusing the \TEX\ end of things when it is used as
+the right|-|hand side of an assignment to a \prm {dimen} or \prm {count}. The
+output of these serializers also depend on the \LUA\ version, so in \LUA\ 5.3 you
+can get different output than from 5.2. It is best not to depend the automatic
+cast from string to number and vise versa as this can change in future versions.
+
+\stopsubsection
+
+\startsubsection[title={Locales}]
+
+\index {locales}
+
+In stock \LUA, many things depend on the current locale. In \LUAMETATEX, we can't
+do that, because it makes documents unportable. While \LUAMETATEX\ is running if
+forces the following locale settings:
+
+\starttyping
+LC_CTYPE=C
+LC_COLLATE=C
+LC_NUMERIC=C
+\stoptyping
+
+There is no way to change that as it would interfere badly with the often
+language specific conversions needed at the \TEX\ end.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\LUA\ modules}]
+
+\topicindex {\LUA+libraries}
+\topicindex {\LUA+modules}
+
+Of course the regular \LUA\ modules are present. In addition we provide the \type
+{lpeg} library by Roberto Ierusalimschy, This library is not \UNICODE|-|aware,
+but interprets strings on a byte|-|per|-|byte basis. This mainly means that \type
+{lpeg.S} cannot be used with \UTF8 characters that need more than one byte, and
+thus \type {lpeg.S} will look for one of those two bytes when matching, not the
+combination of the two. The same is true for \type {lpeg.R}, although the latter
+will display an error message if used with multibyte characters. Therefore \type
+{lpeg.R('aä')} results in the message \type {bad argument #1 to 'R' (range must
+have two characters)}, since to \type {lpeg}, \type {ä} is two 'characters'
+(bytes), so \type {aä} totals three. In practice this is no real issue and with
+some care you can deal with \UNICODE\ just fine.
+
+There are some more libraries present. These are discussed on a later chapter.
+For instance we embed \type {luasocket} but contrary to \LUATEX\ don't embed the
+related \LUA\ code. An adapted version of \type {luafilesystem} is also included.
+There is a more extensive math library and there are libraries that deal with
+encryption and compression.
+
+\stopsection
+
+\startsection[title={Testing}]
+
+\topicindex {testing}
+
+For development reasons you can influence the used startup date and time. By
+setting the \type {start_time} variable in the \type {texconfig} table; as with
+other variables we use the internal name there. When Universal Time is needed,
+set the entry \type {use_utc_time} in the \type {texconfig} table.
+
+In \CONTEXT\ we provide the command line argument \type {--nodates} that does
+a bit more than disabling dates; it avoids time dependent information in the
+output file for instance.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-math.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-math.tex
new file mode 100644
index 00000000000..ce4fe154482
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-math.tex
@@ -0,0 +1,1587 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-math
+
+\startchapter[reference=math,title={Math}]
+
+\startsection[title={Traditional alongside \OPENTYPE}]
+
+\topicindex {math}
+
+At this point there is no difference between \LUAMETATEX\ and \LUATEX\ with
+respect to math. The handling of mathematics in \LUATEX\ differs quite a bit from
+how \TEX82 (and therefore \PDFTEX) handles math. First, \LUATEX\ adds primitives
+and extends some others so that \UNICODE\ input can be used easily. Second, all
+of \TEX82's internal special values (for example for operator spacing) have been
+made accessible and changeable via control sequences. Third, there are extensions
+that make it easier to use \OPENTYPE\ math fonts. And finally, there are some
+extensions that have been proposed or considered in the past that are now added
+to the engine.
+
+\stopsection
+
+\startsection[title={Unicode math characters}]
+
+\topicindex {math+\UNICODE}
+\topicindex {\UNICODE+math}
+
+Character handling is now extended up to the full \UNICODE\ range (the \type {\U}
+prefix), which is compatible with \XETEX.
+
+The math primitives from \TEX\ are kept as they are, except for the ones that
+convert from input to math commands: \type {mathcode}, and \type {delcode}. These
+two now allow for a 21-bit character argument on the left hand side of the equals
+sign.
+
+Some of the new \LUATEX\ primitives read more than one separate value. This is
+shown in the tables below by a plus sign.
+
+The input for such primitives would look like this:
+
+\starttyping
+\def\overbrace{\Umathaccent 0 1 "23DE }
+\stoptyping
+
+The altered \TEX82 primitives are:
+
+\starttabulate[|l|l|r|c|l|r|]
+\DB primitive \BC min \BC max \BC \kern 2em \BC min \BC max \NC \NR
+\TB
+\NC \prm {mathcode} \NC 0 \NC 10FFFF \NC = \NC 0 \NC 8000 \NC \NR
+\NC \prm {delcode} \NC 0 \NC 10FFFF \NC = \NC 0 \NC FFFFFF \NC \NR
+\LL
+\stoptabulate
+
+The unaltered ones are:
+
+\starttabulate[|l|l|r|]
+\DB primitive \BC min \BC max \NC \NR
+\TB
+\NC \prm {mathchardef} \NC 0 \NC 8000 \NC \NR
+\NC \prm {mathchar} \NC 0 \NC 7FFF \NC \NR
+\NC \prm {mathaccent} \NC 0 \NC 7FFF \NC \NR
+\NC \prm {delimiter} \NC 0 \NC 7FFFFFF \NC \NR
+\NC \prm {radical} \NC 0 \NC 7FFFFFF \NC \NR
+\LL
+\stoptabulate
+
+For practical reasons \prm {mathchardef} will silently accept values larger
+that \type {0x8000} and interpret it as \lpr {Umathcharnumdef}. This is needed
+to satisfy older macro packages.
+
+The following new primitives are compatible with \XETEX:
+
+% somewhat fuzzy:
+
+\starttabulate[|l|l|r|c|l|r|]
+\DB primitive \BC min \BC max \BC \kern 2em \BC min \BC max \NC \NR
+\TB
+\NC \lpr {Umathchardef} \NC 0+0+0 \NC 7+FF+10FFFF \NC \NC \NC \NC \NR
+\NC \lpr {Umathcharnumdef}\rlap{\high{5}} \NC -80000000 \NC 7FFFFFFF \NC \NC \NC \NC \NR
+\NC \lpr {Umathcode} \NC 0 \NC 10FFFF \NC = \NC 0+0+0 \NC 7+FF+10FFFF \NC \NR
+\NC \lpr {Udelcode} \NC 0 \NC 10FFFF \NC = \NC 0+0 \NC FF+10FFFF \NC \NR
+\NC \lpr {Umathchar} \NC 0+0+0 \NC 7+FF+10FFFF \NC \NC \NC \NC \NR
+\NC \lpr {Umathaccent} \NC 0+0+0 \NC 7+FF+10FFFF \NC \NC \NC \NC \NR
+\NC \lpr {Udelimiter} \NC 0+0+0 \NC 7+FF+10FFFF \NC \NC \NC \NC \NR
+\NC \lpr {Uradical} \NC 0+0 \NC FF+10FFFF \NC \NC \NC \NC \NR
+\NC \lpr {Umathcharnum} \NC -80000000 \NC 7FFFFFFF \NC \NC \NC \NC \NR
+\NC \lpr {Umathcodenum} \NC 0 \NC 10FFFF \NC = \NC -80000000 \NC 7FFFFFFF \NC \NR
+\NC \lpr {Udelcodenum} \NC 0 \NC 10FFFF \NC = \NC -80000000 \NC 7FFFFFFF \NC \NR
+\LL
+\stoptabulate
+
+Specifications typically look like:
+
+\starttyping
+\Umathchardef\xx="1"0"456
+\Umathcode 123="1"0"789
+\stoptyping
+
+The new primitives that deal with delimiter|-|style objects do not set up a
+\quote {large family}. Selecting a suitable size for display purposes is expected
+to be dealt with by the font via the \lpr {Umathoperatorsize} parameter.
+
+For some of these primitives, all information is packed into a single signed
+integer. For the first two (\lpr {Umathcharnum} and \lpr {Umathcodenum}), the
+lowest 21 bits are the character code, the 3 bits above that represent the math
+class, and the family data is kept in the topmost bits. This means that the values
+for math families 128--255 are actually negative. For \lpr {Udelcodenum} there
+is no math class. The math family information is stored in the bits directly on
+top of the character code. Using these three commands is not as natural as using
+the two- and three|-|value commands, so unless you know exactly what you are
+doing and absolutely require the speedup resulting from the faster input
+scanning, it is better to use the verbose commands instead.
+
+The \lpr {Umathaccent} command accepts optional keywords to control various
+details regarding math accents. See \in {section} [mathacc] below for details.
+
+There are more new primitives and all of these will be explained in following
+sections:
+
+\starttabulate[|l|l|]
+\DB primitive \BC value range (in hex) \NC \NR
+\TB
+\NC \lpr {Uroot} \NC 0 + 0--FF + 10FFFF \NC \NR
+\NC \lpr {Uoverdelimiter} \NC 0 + 0--FF + 10FFFF \NC \NR
+\NC \lpr {Uunderdelimiter} \NC 0 + 0--FF + 10FFFF \NC \NR
+\NC \lpr {Udelimiterover} \NC 0 + 0--FF + 10FFFF \NC \NR
+\NC \lpr {Udelimiterunder} \NC 0 + 0--FF + 10FFFF \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title={Math styles}]
+
+\subsection{\lpr {mathstyle}}
+
+\topicindex {math+styles}
+
+It is possible to discover the math style that will be used for a formula in an
+expandable fashion (while the math list is still being read). To make this
+possible, \LUATEX\ adds the new primitive: \lpr {mathstyle}. This is a \quote
+{convert command} like e.g. \prm {romannumeral}: its value can only be read,
+not set.
+
+The returned value is between 0 and 7 (in math mode), or $-1$ (all other modes).
+For easy testing, the eight math style commands have been altered so that they can
+be used as numeric values, so you can write code like this:
+
+\starttyping
+\ifnum\mathstyle=\textstyle
+ \message{normal text style}
+\else \ifnum\mathstyle=\crampedtextstyle
+ \message{cramped text style}
+\fi \fi
+\stoptyping
+
+Sometimes you won't get what you expect so a bit of explanation might help to
+understand what happens. When math is parsed and expanded it gets turned into a
+linked list. In a second pass the formula will be build. This has to do with the
+fact that in order to determine the automatically chosen sizes (in for instance
+fractions) following content can influence preceding sizes. A side effect of this
+is for instance that one cannot change the definition of a font family (and
+thereby reusing numbers) because the number that got used is stored and used in
+the second pass (so changing \type {\fam 12} mid|-|formula spoils over to
+preceding use of that family).
+
+The style switching primitives like \prm {textstyle} are turned into nodes so the
+styles set there are frozen. The \prm {mathchoice} primitive results in four
+lists being constructed of which one is used in the second pass. The fact that
+some automatic styles are not yet known also means that the \lpr {mathstyle}
+primitive expands to the current style which can of course be different from the
+one really used. It's a snapshot of the first pass state. As a consequence in the
+following example you get a style number (first pass) typeset that can actually
+differ from the used style (second pass). In the case of a math choice used
+ungrouped, the chosen style is used after the choice too, unless you group.
+
+\startbuffer[1]
+ [a:\mathstyle]\quad
+ \bgroup
+ \mathchoice
+ {\bf \scriptstyle (x:d :\mathstyle)}
+ {\bf \scriptscriptstyle (x:t :\mathstyle)}
+ {\bf \scriptscriptstyle (x:s :\mathstyle)}
+ {\bf \scriptscriptstyle (x:ss:\mathstyle)}
+ \egroup
+ \quad[b:\mathstyle]\quad
+ \mathchoice
+ {\bf \scriptstyle (y:d :\mathstyle)}
+ {\bf \scriptscriptstyle (y:t :\mathstyle)}
+ {\bf \scriptscriptstyle (y:s :\mathstyle)}
+ {\bf \scriptscriptstyle (y:ss:\mathstyle)}
+ \quad[c:\mathstyle]\quad
+ \bgroup
+ \mathchoice
+ {\bf \scriptstyle (z:d :\mathstyle)}
+ {\bf \scriptscriptstyle (z:t :\mathstyle)}
+ {\bf \scriptscriptstyle (z:s :\mathstyle)}
+ {\bf \scriptscriptstyle (z:ss:\mathstyle)}
+ \egroup
+ \quad[d:\mathstyle]
+\stopbuffer
+
+\startbuffer[2]
+ [a:\mathstyle]\quad
+ \begingroup
+ \mathchoice
+ {\bf \scriptstyle (x:d :\mathstyle)}
+ {\bf \scriptscriptstyle (x:t :\mathstyle)}
+ {\bf \scriptscriptstyle (x:s :\mathstyle)}
+ {\bf \scriptscriptstyle (x:ss:\mathstyle)}
+ \endgroup
+ \quad[b:\mathstyle]\quad
+ \mathchoice
+ {\bf \scriptstyle (y:d :\mathstyle)}
+ {\bf \scriptscriptstyle (y:t :\mathstyle)}
+ {\bf \scriptscriptstyle (y:s :\mathstyle)}
+ {\bf \scriptscriptstyle (y:ss:\mathstyle)}
+ \quad[c:\mathstyle]\quad
+ \begingroup
+ \mathchoice
+ {\bf \scriptstyle (z:d :\mathstyle)}
+ {\bf \scriptscriptstyle (z:t :\mathstyle)}
+ {\bf \scriptscriptstyle (z:s :\mathstyle)}
+ {\bf \scriptscriptstyle (z:ss:\mathstyle)}
+ \endgroup
+ \quad[d:\mathstyle]
+\stopbuffer
+
+\typebuffer[1]
+
+% \typebuffer[2]
+
+This gives:
+
+\blank $\displaystyle \getbuffer[1]$ \blank
+\blank $\textstyle \getbuffer[1]$ \blank
+
+Using \prm {begingroup} \unknown\ \prm {endgroup} instead gives:
+
+\blank $\displaystyle \getbuffer[2]$ \blank
+\blank $\textstyle \getbuffer[2]$ \blank
+
+This might look wrong but it's just a side effect of \lpr {mathstyle} expanding
+to the current (first pass) style and the number being injected in the list that
+gets converted in the second pass. It all makes sense and it illustrates the
+importance of grouping. In fact, the math choice style being effective afterwards
+has advantages. It would be hard to get it otherwise.
+
+\subsection{\lpr {Ustack}}
+
+\topicindex {math+stacks}
+
+There are a few math commands in \TEX\ where the style that will be used is not
+known straight from the start. These commands (\prm {over}, \prm {atop},
+\prm {overwithdelims}, \prm {atopwithdelims}) would therefore normally return
+wrong values for \lpr {mathstyle}. To fix this, \LUATEX\ introduces a special
+prefix command: \lpr {Ustack}:
+
+\starttyping
+$\Ustack {a \over b}$
+\stoptyping
+
+The \lpr {Ustack} command will scan the next brace and start a new math group
+with the correct (numerator) math style.
+
+\subsection{The new \type {\cramped...style} commands}
+
+\topicindex {math+styles}
+\topicindex {math+spacing}
+\topicindex {math+cramped}
+
+\LUATEX\ has four new primitives to set the cramped math styles directly:
+
+\starttyping
+\crampeddisplaystyle
+\crampedtextstyle
+\crampedscriptstyle
+\crampedscriptscriptstyle
+\stoptyping
+
+These additional commands are not all that valuable on their own, but they come
+in handy as arguments to the math parameter settings that will be added shortly.
+
+In Eijkhouts \quotation {\TEX\ by Topic} the rules for handling styles in scripts
+are described as follows:
+
+\startitemize
+\startitem
+ In any style superscripts and subscripts are taken from the next smaller style.
+ Exception: in display style they are in script style.
+\stopitem
+\startitem
+ Subscripts are always in the cramped variant of the style; superscripts are only
+ cramped if the original style was cramped.
+\stopitem
+\startitem
+ In an \type {..\over..} formula in any style the numerator and denominator are
+ taken from the next smaller style.
+\stopitem
+\startitem
+ The denominator is always in cramped style; the numerator is only in cramped
+ style if the original style was cramped.
+\stopitem
+\startitem
+ Formulas under a \type {\sqrt} or \prm {overline} are in cramped style.
+\stopitem
+\stopitemize
+
+In \LUATEX\ one can set the styles in more detail which means that you sometimes
+have to set both normal and cramped styles to get the effect you want. (Even) if
+we force styles in the script using \prm {scriptstyle} and \lpr
+{crampedscriptstyle} we get this:
+
+\startbuffer[demo]
+\starttabulate
+\DB style \BC example \NC \NR
+\TB
+\NC default \NC $b_{x=xx}^{x=xx}$ \NC \NR
+\NC script \NC $b_{\scriptstyle x=xx}^{\scriptstyle x=xx}$ \NC \NR
+\NC crampedscript \NC $b_{\crampedscriptstyle x=xx}^{\crampedscriptstyle x=xx}$ \NC \NR
+\LL
+\stoptabulate
+\stopbuffer
+
+\getbuffer[demo]
+
+Now we set the following parameters
+
+\startbuffer[setup]
+\Umathordrelspacing\scriptstyle=30mu
+\Umathordordspacing\scriptstyle=30mu
+\stopbuffer
+
+\typebuffer[setup]
+
+This gives a different result:
+
+\start\getbuffer[setup,demo]\stop
+
+But, as this is not what is expected (visually) we should say:
+
+\startbuffer[setup]
+\Umathordrelspacing\scriptstyle=30mu
+\Umathordordspacing\scriptstyle=30mu
+\Umathordrelspacing\crampedscriptstyle=30mu
+\Umathordordspacing\crampedscriptstyle=30mu
+\stopbuffer
+
+\typebuffer[setup]
+
+Now we get:
+
+\start\getbuffer[setup,demo]\stop
+
+\stopsection
+
+\startsection[title={Math parameter settings}]
+
+\subsection {Many new \lpr {Umath*} primitives}
+
+\topicindex {math+parameters}
+
+In \LUATEX, the font dimension parameters that \TEX\ used in math typesetting are
+now accessible via primitive commands. In fact, refactoring of the math engine
+has resulted in many more parameters than were not accessible before.
+
+\starttabulate
+\DB primitive name \BC description \NC \NR
+\TB
+\NC \lpr {Umathquad} \NC the width of 18 mu's \NC \NR
+\NC \lpr {Umathaxis} \NC height of the vertical center axis of
+ the math formula above the baseline \NC \NR
+\NC \lpr {Umathoperatorsize} \NC minimum size of large operators in display mode \NC \NR
+\NC \lpr {Umathoverbarkern} \NC vertical clearance above the rule \NC \NR
+\NC \lpr {Umathoverbarrule} \NC the width of the rule \NC \NR
+\NC \lpr {Umathoverbarvgap} \NC vertical clearance below the rule \NC \NR
+\NC \lpr {Umathunderbarkern} \NC vertical clearance below the rule \NC \NR
+\NC \lpr {Umathunderbarrule} \NC the width of the rule \NC \NR
+\NC \lpr {Umathunderbarvgap} \NC vertical clearance above the rule \NC \NR
+\NC \lpr {Umathradicalkern} \NC vertical clearance above the rule \NC \NR
+\NC \lpr {Umathradicalrule} \NC the width of the rule \NC \NR
+\NC \lpr {Umathradicalvgap} \NC vertical clearance below the rule \NC \NR
+\NC \lpr {Umathradicaldegreebefore}\NC the forward kern that takes place before placement of
+ the radical degree \NC \NR
+\NC \lpr {Umathradicaldegreeafter} \NC the backward kern that takes place after placement of
+ the radical degree \NC \NR
+\NC \lpr {Umathradicaldegreeraise} \NC this is the percentage of the total height and depth of
+ the radical sign that the degree is raised by; it is
+ expressed in \type {percents}, so 60\% is expressed as the
+ integer $60$ \NC \NR
+\NC \lpr {Umathstackvgap} \NC vertical clearance between the two
+ elements in a \prm {atop} stack \NC \NR
+\NC \lpr {Umathstacknumup} \NC numerator shift upward in \prm {atop} stack \NC \NR
+\NC \lpr {Umathstackdenomdown} \NC denominator shift downward in \prm {atop} stack \NC \NR
+\NC \lpr {Umathfractionrule} \NC the width of the rule in a \prm {over} \NC \NR
+\NC \lpr {Umathfractionnumvgap} \NC vertical clearance between the numerator and the rule \NC \NR
+\NC \lpr {Umathfractionnumup} \NC numerator shift upward in \prm {over} \NC \NR
+\NC \lpr {Umathfractiondenomvgap} \NC vertical clearance between the denominator and the rule \NC \NR
+\NC \lpr {Umathfractiondenomdown} \NC denominator shift downward in \prm {over} \NC \NR
+\NC \lpr {Umathfractiondelsize} \NC minimum delimiter size for \type {\...withdelims} \NC \NR
+\NC \lpr {Umathlimitabovevgap} \NC vertical clearance for limits above operators \NC \NR
+\NC \lpr {Umathlimitabovebgap} \NC vertical baseline clearance for limits above operators \NC \NR
+\NC \lpr {Umathlimitabovekern} \NC space reserved at the top of the limit \NC \NR
+\NC \lpr {Umathlimitbelowvgap} \NC vertical clearance for limits below operators \NC \NR
+\NC \lpr {Umathlimitbelowbgap} \NC vertical baseline clearance for limits below operators \NC \NR
+\NC \lpr {Umathlimitbelowkern} \NC space reserved at the bottom of the limit \NC \NR
+\NC \lpr {Umathoverdelimitervgap} \NC vertical clearance for limits above delimiters \NC \NR
+\NC \lpr {Umathoverdelimiterbgap} \NC vertical baseline clearance for limits above delimiters \NC \NR
+\NC \lpr {Umathunderdelimitervgap} \NC vertical clearance for limits below delimiters \NC \NR
+\NC \lpr {Umathunderdelimiterbgap} \NC vertical baseline clearance for limits below delimiters \NC \NR
+\NC \lpr {Umathsubshiftdrop} \NC subscript drop for boxes and subformulas \NC \NR
+\NC \lpr {Umathsubshiftdown} \NC subscript drop for characters \NC \NR
+\NC \lpr {Umathsupshiftdrop} \NC superscript drop (raise, actually) for boxes and subformulas \NC \NR
+\NC \lpr {Umathsupshiftup} \NC superscript raise for characters \NC \NR
+\NC \lpr {Umathsubsupshiftdown} \NC subscript drop in the presence of a superscript \NC \NR
+\NC \lpr {Umathsubtopmax} \NC the top of standalone subscripts cannot be higher than this
+ above the baseline \NC \NR
+\NC \lpr {Umathsupbottommin} \NC the bottom of standalone superscripts cannot be less than
+ this above the baseline \NC \NR
+\NC \lpr {Umathsupsubbottommax} \NC the bottom of the superscript of a combined super- and subscript
+ be at least as high as this above the baseline \NC \NR
+\NC \lpr {Umathsubsupvgap} \NC vertical clearance between super- and subscript \NC \NR
+\NC \lpr {Umathspaceafterscript} \NC additional space added after a super- or subscript \NC \NR
+\NC \lpr {Umathconnectoroverlapmin}\NC minimum overlap between parts in an extensible recipe \NC \NR
+\LL
+\stoptabulate
+
+Each of the parameters in this section can be set by a command like this:
+
+\starttyping
+\Umathquad\displaystyle=1em
+\stoptyping
+
+they obey grouping, and you can use \type {\the\Umathquad\displaystyle} if
+needed.
+
+\subsection{Font|-|based math parameters}
+
+\topicindex {math+parameters}
+
+While it is nice to have these math parameters available for tweaking, it would
+be tedious to have to set each of them by hand. For this reason, \LUATEX\
+initializes a bunch of these parameters whenever you assign a font identifier to
+a math family based on either the traditional math font dimensions in the font
+(for assignments to math family~2 and~3 using \TFM|-|based fonts like \type
+{cmsy} and \type {cmex}), or based on the named values in a potential \type
+{MathConstants} table when the font is loaded via Lua. If there is a \type
+{MathConstants} table, this takes precedence over font dimensions, and in that
+case no attention is paid to which family is being assigned to: the \type
+{MathConstants} tables in the last assigned family sets all parameters.
+
+In the table below, the one|-|letter style abbreviations and symbolic tfm font
+dimension names match those used in the \TeX book. Assignments to \prm
+{textfont} set the values for the cramped and uncramped display and text styles,
+\prm {scriptfont} sets the script styles, and \prm {scriptscriptfont} sets the
+scriptscript styles, so we have eight parameters for three font sizes. In the
+\TFM\ case, assignments only happen in family~2 and family~3 (and of course only
+for the parameters for which there are font dimensions).
+
+Besides the parameters below, \LUATEX\ also looks at the \quote {space} font
+dimension parameter. For math fonts, this should be set to zero.
+
+\def\MathLine#1#2#3#4#5%
+ {\TB
+ \NC \llap{\high{\tx #2\enspace}}\ttbf \string #1 \NC \tt #5 \NC \NR
+ \NC \tx #3 \NC \tt #4 \NC \NR}
+
+\starttabulate[|l|l|]
+\DB variable / style \BC tfm / opentype \NC \NR
+\MathLine{\Umathaxis} {} {} {AxisHeight} {axis_height}
+\MathLine{\Umathoperatorsize} {6} {D, D'} {DisplayOperatorMinHeight} {\emdash}
+\MathLine{\Umathfractiondelsize} {9} {D, D'} {FractionDelimiterDisplayStyleSize} {delim1}
+\MathLine{\Umathfractiondelsize} {9} {T, T', S, S', SS, SS'}{FractionDelimiterSize} {delim2}
+\MathLine{\Umathfractiondenomdown} {} {D, D'} {FractionDenominatorDisplayStyleShiftDown}{denom1}
+\MathLine{\Umathfractiondenomdown} {} {T, T', S, S', SS, SS'}{FractionDenominatorShiftDown} {denom2}
+\MathLine{\Umathfractiondenomvgap} {} {D, D'} {FractionDenominatorDisplayStyleGapMin} {3*default_rule_thickness}
+\MathLine{\Umathfractiondenomvgap} {} {T, T', S, S', SS, SS'}{FractionDenominatorGapMin} {default_rule_thickness}
+\MathLine{\Umathfractionnumup} {} {D, D'} {FractionNumeratorDisplayStyleShiftUp} {num1}
+\MathLine{\Umathfractionnumup} {} {T, T', S, S', SS, SS'}{FractionNumeratorShiftUp} {num2}
+\MathLine{\Umathfractionnumvgap} {} {D, D'} {FractionNumeratorDisplayStyleGapMin} {3*default_rule_thickness}
+\MathLine{\Umathfractionnumvgap} {} {T, T', S, S', SS, SS'}{FractionNumeratorGapMin} {default_rule_thickness}
+\MathLine{\Umathfractionrule} {} {} {FractionRuleThickness} {default_rule_thickness}
+\MathLine{\Umathskewedfractionhgap} {} {} {SkewedFractionHorizontalGap} {math_quad/2}
+\MathLine{\Umathskewedfractionvgap} {} {} {SkewedFractionVerticalGap} {math_x_height}
+\MathLine{\Umathlimitabovebgap} {} {} {UpperLimitBaselineRiseMin} {big_op_spacing3}
+\MathLine{\Umathlimitabovekern} {1} {} {0} {big_op_spacing5}
+\MathLine{\Umathlimitabovevgap} {} {} {UpperLimitGapMin} {big_op_spacing1}
+\MathLine{\Umathlimitbelowbgap} {} {} {LowerLimitBaselineDropMin} {big_op_spacing4}
+\MathLine{\Umathlimitbelowkern} {1} {} {0} {big_op_spacing5}
+\MathLine{\Umathlimitbelowvgap} {} {} {LowerLimitGapMin} {big_op_spacing2}
+\MathLine{\Umathoverdelimitervgap} {} {} {StretchStackGapBelowMin} {big_op_spacing1}
+\MathLine{\Umathoverdelimiterbgap} {} {} {StretchStackTopShiftUp} {big_op_spacing3}
+\MathLine{\Umathunderdelimitervgap} {} {} {StretchStackGapAboveMin} {big_op_spacing2}
+\MathLine{\Umathunderdelimiterbgap} {} {} {StretchStackBottomShiftDown} {big_op_spacing4}
+\MathLine{\Umathoverbarkern} {} {} {OverbarExtraAscender} {default_rule_thickness}
+\MathLine{\Umathoverbarrule} {} {} {OverbarRuleThickness} {default_rule_thickness}
+\MathLine{\Umathoverbarvgap} {} {} {OverbarVerticalGap} {3*default_rule_thickness}
+\MathLine{\Umathquad} {1} {} {<font_size(f)>} {math_quad}
+\MathLine{\Umathradicalkern} {} {} {RadicalExtraAscender} {default_rule_thickness}
+\MathLine{\Umathradicalrule} {2} {} {RadicalRuleThickness} {<not set>}
+\MathLine{\Umathradicalvgap} {3} {D, D'} {RadicalDisplayStyleVerticalGap} {default_rule_thickness+abs(math_x_height)/4}
+\MathLine{\Umathradicalvgap} {3} {T, T', S, S', SS, SS'}{RadicalVerticalGap} {default_rule_thickness+abs(default_rule_thickness)/4}
+\MathLine{\Umathradicaldegreebefore}{2} {} {RadicalKernBeforeDegree} {<not set>}
+\MathLine{\Umathradicaldegreeafter} {2} {} {RadicalKernAfterDegree} {<not set>}
+\MathLine{\Umathradicaldegreeraise} {2,7}{} {RadicalDegreeBottomRaisePercent} {<not set>}
+\MathLine{\Umathspaceafterscript} {4} {} {SpaceAfterScript} {script_space}
+\MathLine{\Umathstackdenomdown} {} {D, D'} {StackBottomDisplayStyleShiftDown} {denom1}
+\MathLine{\Umathstackdenomdown} {} {T, T', S, S', SS, SS'}{StackBottomShiftDown} {denom2}
+\MathLine{\Umathstacknumup} {} {D, D'} {StackTopDisplayStyleShiftUp} {num1}
+\MathLine{\Umathstacknumup} {} {T, T', S, S', SS, SS'}{StackTopShiftUp} {num3}
+\MathLine{\Umathstackvgap} {} {D, D'} {StackDisplayStyleGapMin} {7*default_rule_thickness}
+\MathLine{\Umathstackvgap} {} {T, T', S, S', SS, SS'}{StackGapMin} {3*default_rule_thickness}
+\MathLine{\Umathsubshiftdown} {} {} {SubscriptShiftDown} {sub1}
+\MathLine{\Umathsubshiftdrop} {} {} {SubscriptBaselineDropMin} {sub_drop}
+\MathLine{\Umathsubsupshiftdown} {8} {} {SubscriptShiftDownWithSuperscript} {\emdash}
+\MathLine{\Umathsubtopmax} {} {} {SubscriptTopMax} {abs(math_x_height*4)/5}
+\MathLine{\Umathsubsupvgap} {} {} {SubSuperscriptGapMin} {4*default_rule_thickness}
+\MathLine{\Umathsupbottommin} {} {} {SuperscriptBottomMin} {abs(math_x_height/4)}
+\MathLine{\Umathsupshiftdrop} {} {} {SuperscriptBaselineDropMax} {sup_drop}
+\MathLine{\Umathsupshiftup} {} {D} {SuperscriptShiftUp} {sup1}
+\MathLine{\Umathsupshiftup} {} {T, S, SS,} {SuperscriptShiftUp} {sup2}
+\MathLine{\Umathsupshiftup} {} {D', T', S', SS'} {SuperscriptShiftUpCramped} {sup3}
+\MathLine{\Umathsupsubbottommax} {} {} {SuperscriptBottomMaxWithSubscript} {abs(math_x_height*4)/5}
+\MathLine{\Umathunderbarkern} {} {} {UnderbarExtraDescender} {default_rule_thickness}
+\MathLine{\Umathunderbarrule} {} {} {UnderbarRuleThickness} {default_rule_thickness}
+\MathLine{\Umathunderbarvgap} {} {} {UnderbarVerticalGap} {3*default_rule_thickness}
+\MathLine{\Umathconnectoroverlapmin}{5} {} {MinConnectorOverlap} {0}
+\LL
+\stoptabulate
+
+Note 1: \OPENTYPE\ fonts set \lpr {Umathlimitabovekern} and \lpr
+{Umathlimitbelowkern} to zero and set \lpr {Umathquad} to the font size of the
+used font, because these are not supported in the \type {MATH} table,
+
+Note 2: Traditional \TFM\ fonts do not set \lpr {Umathradicalrule} because
+\TEX82\ uses the height of the radical instead. When this parameter is indeed not
+set when \LUATEX\ has to typeset a radical, a backward compatibility mode will
+kick in that assumes that an oldstyle \TEX\ font is used. Also, they do not set
+\lpr {Umathradicaldegreebefore}, \lpr {Umathradicaldegreeafter}, and \lpr
+{Umathradicaldegreeraise}. These are then automatically initialized to
+$5/18$quad, $-10/18$quad, and 60.
+
+Note 3: If \TFM\ fonts are used, then the \lpr {Umathradicalvgap} is not set
+until the first time \LUATEX\ has to typeset a formula because this needs
+parameters from both family~2 and family~3. This provides a partial backward
+compatibility with \TEX82, but that compatibility is only partial: once the \lpr
+{Umathradicalvgap} is set, it will not be recalculated any more.
+
+Note 4: When \TFM\ fonts are used a similar situation arises with respect to \lpr
+{Umathspaceafterscript}: it is not set until the first time \LUATEX\ has to
+typeset a formula. This provides some backward compatibility with \TEX82. But
+once the \lpr {Umathspaceafterscript} is set, \prm {scriptspace} will never be
+looked at again.
+
+Note 5: Traditional \TFM\ fonts set \lpr {Umathconnectoroverlapmin} to zero
+because \TEX82\ always stacks extensibles without any overlap.
+
+Note 6: The \lpr {Umathoperatorsize} is only used in \prm {displaystyle}, and is
+only set in \OPENTYPE\ fonts. In \TFM\ font mode, it is artificially set to one
+scaled point more than the initial attempt's size, so that always the \quote
+{first next} will be tried, just like in \TEX82.
+
+Note 7: The \lpr {Umathradicaldegreeraise} is a special case because it is the
+only parameter that is expressed in a percentage instead of a number of scaled
+points.
+
+Note 8: \type {SubscriptShiftDownWithSuperscript} does not actually exist in the
+\quote {standard} \OPENTYPE\ math font Cambria, but it is useful enough to be
+added.
+
+Note 9: \type {FractionDelimiterDisplayStyleSize} and \type
+{FractionDelimiterSize} do not actually exist in the \quote {standard} \OPENTYPE\
+math font Cambria, but were useful enough to be added.
+
+\stopsection
+
+\startsection[title={Math spacing}]
+
+\subsection{Setting inline surrounding space with \lpr {mathsurround[skip]}}
+
+\topicindex {math+spacing}
+
+Inline math is surrounded by (optional) \prm {mathsurround} spacing but that is a fixed
+dimension. There is now an additional parameter \lpr {mathsurroundskip}. When set to a
+non|-|zero value (or zero with some stretch or shrink) this parameter will replace
+\prm {mathsurround}. By using an additional parameter instead of changing the nature
+of \prm {mathsurround}, we can remain compatible. In the meantime a bit more
+control has been added via \lpr {mathsurroundmode}. This directive can take 6 values
+with zero being the default behaviour.
+
+\start
+
+\def\MathHack#1{\mathsurroundmode#1\relax\inlinebuffer}
+
+\def\OneLiner#1#2%
+ {\NC \type{#1}
+ \NC \dontleavehmode\inframed[align=normal,offset=0pt,frame=off]{\hsize 100pt x$\MathHack{#1}x$x}
+ \NC \dontleavehmode\inframed[align=normal,offset=0pt,frame=off]{\hsize 100pt x $\MathHack{#1}x$ x}
+ \NC #2
+ \NC \NR}
+
+\startbuffer
+\mathsurround 10pt
+\mathsurroundskip20pt
+\stopbuffer
+
+\typebuffer
+
+\starttabulate[|c|c|c|pl|]
+\DB mode \BC x\$x\$x \BC x \$x\$ x \BC effect \NC \NR
+\TB
+\OneLiner{0}{obey \prm {mathsurround} when \lpr {mathsurroundskip} is 0pt}
+\OneLiner{1}{only add skip to the left}
+\OneLiner{2}{only add skip to the right}
+\OneLiner{3}{add skip to the left and right}
+\OneLiner{4}{ignore the skip setting, obey \prm {mathsurround}}
+\OneLiner{5}{disable all spacing around math}
+\OneLiner{6}{only apply \lpr {mathsurroundskip} when also spacing}
+\OneLiner{7}{only apply \lpr {mathsurroundskip} when no spacing}
+\LL
+\stoptabulate
+
+\stop
+
+Method six omits the surround glue when there is (x)spacing glue present while
+method seven does the opposite, the glue is only applied when there is (x)space
+glue present too. Anything more fancy, like checking the begining or end of a
+paragraph (or edges of a box) would not be robust anyway. If you want that you
+can write a callback that runs over a list and analyzes a paragraph. Actually, in
+that case you could also inject glue (or set the properties of a math node)
+explicitly. So, these modes are in practice mostly useful for special purposes
+and experiments (they originate in a tracker item). Keep in mind that this glue
+is part of the math node and not always treated as normal glue: it travels with
+the begin and end math nodes. Also, method 6 and 7 will zero the skip related
+fields in a node when applicable in the first occasion that checks them
+(linebreaking or packaging).
+
+\subsection{Pairwise spacing and \lpr {Umath...spacing} commands}
+
+\topicindex {math+spacing}
+
+Besides the parameters mentioned in the previous sections, there are also 64 new
+primitives to control the math spacing table (as explained in Chapter~18 of the
+\TEX book). The primitive names are a simple matter of combining two math atom
+types, but for completeness' sake, here is the whole list:
+
+\starttwocolumns
+\startlines
+\lpr {Umathordordspacing}
+\lpr {Umathordopspacing}
+\lpr {Umathordbinspacing}
+\lpr {Umathordrelspacing}
+\lpr {Umathordopenspacing}
+\lpr {Umathordclosespacing}
+\lpr {Umathordpunctspacing}
+\lpr {Umathordinnerspacing}
+\lpr {Umathopordspacing}
+\lpr {Umathopopspacing}
+\lpr {Umathopbinspacing}
+\lpr {Umathoprelspacing}
+\lpr {Umathopopenspacing}
+\lpr {Umathopclosespacing}
+\lpr {Umathoppunctspacing}
+\lpr {Umathopinnerspacing}
+\lpr {Umathbinordspacing}
+\lpr {Umathbinopspacing}
+\lpr {Umathbinbinspacing}
+\lpr {Umathbinrelspacing}
+\lpr {Umathbinopenspacing}
+\lpr {Umathbinclosespacing}
+\lpr {Umathbinpunctspacing}
+\lpr {Umathbininnerspacing}
+\lpr {Umathrelordspacing}
+\lpr {Umathrelopspacing}
+\lpr {Umathrelbinspacing}
+\lpr {Umathrelrelspacing}
+\lpr {Umathrelopenspacing}
+\lpr {Umathrelclosespacing}
+\lpr {Umathrelpunctspacing}
+\lpr {Umathrelinnerspacing}
+\lpr {Umathopenordspacing}
+\lpr {Umathopenopspacing}
+\lpr {Umathopenbinspacing}
+\lpr {Umathopenrelspacing}
+\lpr {Umathopenopenspacing}
+\lpr {Umathopenclosespacing}
+\lpr {Umathopenpunctspacing}
+\lpr {Umathopeninnerspacing}
+\lpr {Umathcloseordspacing}
+\lpr {Umathcloseopspacing}
+\lpr {Umathclosebinspacing}
+\lpr {Umathcloserelspacing}
+\lpr {Umathcloseopenspacing}
+\lpr {Umathcloseclosespacing}
+\lpr {Umathclosepunctspacing}
+\lpr {Umathcloseinnerspacing}
+\lpr {Umathpunctordspacing}
+\lpr {Umathpunctopspacing}
+\lpr {Umathpunctbinspacing}
+\lpr {Umathpunctrelspacing}
+\lpr {Umathpunctopenspacing}
+\lpr {Umathpunctclosespacing}
+\lpr {Umathpunctpunctspacing}
+\lpr {Umathpunctinnerspacing}
+\lpr {Umathinnerordspacing}
+\lpr {Umathinneropspacing}
+\lpr {Umathinnerbinspacing}
+\lpr {Umathinnerrelspacing}
+\lpr {Umathinneropenspacing}
+\lpr {Umathinnerclosespacing}
+\lpr {Umathinnerpunctspacing}
+\lpr {Umathinnerinnerspacing}
+\stoplines
+\stoptwocolumns
+
+These parameters are of type \prm {muskip}, so setting a parameter can be done
+like this:
+
+\starttyping
+\Umathopordspacing\displaystyle=4mu plus 2mu
+\stoptyping
+
+They are all initialized by \type {initex} to the values mentioned in the table
+in Chapter~18 of the \TEX book.
+
+Note 1: for ease of use as well as for backward compatibility, \prm {thinmuskip},
+\prm {medmuskip} and \prm {thickmuskip} are treated specially. In their case a
+pointer to the corresponding internal parameter is saved, not the actual \prm
+{muskip} value. This means that any later changes to one of these three
+parameters will be taken into account.
+
+Note 2: Careful readers will realise that there are also primitives for the items
+marked \type {*} in the \TEX book. These will not actually be used as those
+combinations of atoms cannot actually happen, but it seemed better not to break
+orthogonality. They are initialized to zero.
+
+\subsection{Local settings}
+
+Math is processed in two passes. The first pass is needed to intercept for
+instance \type {\over}, one of the few \TEX\ commands that actually has a
+preceding argument. There are often lots of curly braces used in math and these
+can result in a nested run of the math sub engine. However, you need to be aware
+of the fact that some properties are kind of global to a formula and the last
+setting (for instance a family switch) wins. This also means that a change (or
+again, the last one) in math parameters affects the whole formula. In
+\LUAMETATEX\ we have changed this model a bit. One can argue that this introduces
+an incompatibility but it's hard to imagine a reason for setting the parameters
+at the end of a formula run and assume that they also influence what goes in
+front.
+
+\startbuffer
+$
+ x \Usubscript {-}
+ \frozen\Umathsubshiftdown\textstyle 0pt x \Usubscript {0}
+ {\frozen\Umathsubshiftdown\textstyle 5pt x \Usubscript {5}}
+ x \Usubscript {0}
+ {\frozen\Umathsubshiftdown\textstyle 15pt x \Usubscript {15}}
+ x \Usubscript {0}
+ {\frozen\Umathsubshiftdown\textstyle 20pt x \Usubscript {20}}
+ x \Usubscript {0}
+ \frozen\Umathsubshiftdown\textstyle 10pt x \Usubscript {10}
+ x \Usubscript {0}
+$
+\stopbuffer
+
+\typebuffer
+
+The \type {\frozen} prefix does the magic: it injects information in the
+math list about the set parameter.
+
+In \LUATEX\ 1.10 the last setting, the \type {10pt} drop wins, but in
+\LUAMETATEX\ you will see each local setting taking effect. The implementation
+uses a new node type, parameters nodes, so you you might encounter these in an
+unprocessed math list. The result looks as follows:
+
+\blank \getbuffer \blank
+
+
+
+\subsection{Skips around display math and \lpr {mathdisplayskipmode}}
+
+\topicindex {math+spacing}
+
+The injection of \prm {abovedisplayskip} and \prm {belowdisplayskip} is not
+symmetrical. An above one is always inserted, also when zero, but the below is
+only inserted when larger than zero. Especially the latter makes it sometimes hard
+to fully control spacing. Therefore \LUATEX\ comes with a new directive: \lpr
+{mathdisplayskipmode}. The following values apply:
+
+\starttabulate[|c|l|]
+\DB value \BC meaning \NC \NR
+\TB
+\NC 0 \NC normal \TEX\ behaviour \NC \NR
+\NC 1 \NC always (same as 0) \NC \NR
+\NC 2 \NC only when not zero \NC \NR
+\NC 3 \NC never, not even when not zero \NC \NR
+\LL
+\stoptabulate
+
+\subsection {Nolimit correction with \lpr {mathnolimitsmode}}
+
+\topicindex {math+limits}
+
+There are two extra math parameters \lpr {Umathnolimitsupfactor} and \lpr
+{Umathnolimitsubfactor} that were added to provide some control over how limits
+are spaced (for example the position of super and subscripts after integral
+operators). They relate to an extra parameter \lpr {mathnolimitsmode}. The half
+corrections are what happens when scripts are placed above and below. The
+problem with italic corrections is that officially that correction italic is used
+for above|/|below placement while advanced kerns are used for placement at the
+right end. The question is: how often is this implemented, and if so, do the
+kerns assume correction too. Anyway, with this parameter one can control it.
+
+\starttabulate[|l|ck1|ck1|ck1|ck1|ck1|ck1|]
+ \NC
+ \NC \mathnolimitsmode0 $\displaystyle\int\nolimits^0_1$
+ \NC \mathnolimitsmode1 $\displaystyle\int\nolimits^0_1$
+ \NC \mathnolimitsmode2 $\displaystyle\int\nolimits^0_1$
+ \NC \mathnolimitsmode3 $\displaystyle\int\nolimits^0_1$
+ \NC \mathnolimitsmode4 $\displaystyle\int\nolimits^0_1$
+ \NC \mathnolimitsmode8000 $\displaystyle\int\nolimits^0_1$
+ \NC \NR
+ \TB
+ \BC mode
+ \NC \tttf 0
+ \NC \tttf 1
+ \NC \tttf 2
+ \NC \tttf 3
+ \NC \tttf 4
+ \NC \tttf 8000
+ \NC \NR
+ \BC superscript
+ \NC 0
+ \NC font
+ \NC 0
+ \NC 0
+ \NC +ic/2
+ \NC 0
+ \NC \NR
+ \BC subscript
+ \NC -ic
+ \NC font
+ \NC 0
+ \NC -ic/2
+ \NC -ic/2
+ \NC 8000ic/1000
+ \NC \NR
+\stoptabulate
+
+When the mode is set to one, the math parameters are used. This way a macro
+package writer can decide what looks best. Given the current state of fonts in
+\CONTEXT\ we currently use mode 1 with factor 0 for the superscript and 750 for
+the subscripts. Positive values are used for both parameters but the subscript
+shifts to the left. A \lpr {mathnolimitsmode} larger that 15 is considered to
+be a factor for the subscript correction. This feature can be handy when
+experimenting.
+
+\subsection {Controlling math italic mess with \lpr {mathitalicsmode}}
+
+\topicindex {math+italics}
+
+The \lpr {mathitalicsmode} parameter can be set to~1 to force italic correction
+before noads that represent some more complex structure (read: everything
+that is not an ord, bin, rel, open, close, punct or inner). We show a Cambria
+example.
+
+\starttexdefinition Whatever #1
+ \NC \type{\mathitalicsmode = #1}
+ \NC \mathitalicsmode#1\ruledhbox{$\left|T^1\right|$}
+ \NC \mathitalicsmode#1\ruledhbox{$\left|T\right|$}
+ \NC \mathitalicsmode#1\ruledhbox{$T+1$}
+ \NC \mathitalicsmode#1\ruledhbox{$T{1\over2}$}
+ \NC \mathitalicsmode#1\ruledhbox{$T\sqrt{1}$}
+ \NC \NR
+\stoptexdefinition
+
+\start
+ \switchtobodyfont[cambria]
+ \starttabulate[|c|c|c|c|c|c|]
+ \Whatever{0}%
+ \Whatever{1}%
+ \stoptabulate
+\stop
+
+This kind of parameters relate to the fact that italic correction in \OPENTYPE\
+math is bound to fuzzy rules. So, control is the solution.
+
+\subsection {Influencing script kerning with \lpr {mathscriptboxmode}}
+
+\topicindex {math+kerning}
+\topicindex {math+scripts}
+
+If you want to typeset text in math macro packages often provide something \type
+{\text} which obeys the script sizes. As the definition can be anything there is
+a good chance that the kerning doesn't come out well when used in a script. Given
+that the first glyph ends up in a \prm {hbox} we have some control over this.
+And, as a bonus we also added control over the normal sublist kerning. The \lpr
+{mathscriptboxmode} parameter defaults to~1.
+
+\starttabulate[|c|l|]
+\DB value \BC meaning \NC \NR
+\TB
+\NC \type {0} \NC forget about kerning \NC \NR
+\NC \type {1} \NC kern math sub lists with a valid glyph \NC \NR
+\NC \type {2} \NC also kern math sub boxes that have a valid glyph \NC \NR
+\NC \type {2} \NC only kern math sub boxes with a boundary node present\NC \NR
+\LL
+\stoptabulate
+
+Here we show some examples. Of course this doesn't solve all our problems, if
+only because some fonts have characters with bounding boxes that compensate for
+italics, while other fonts can lack kerns.
+
+\startbuffer[1]
+ $T_{\tf fluff}$
+\stopbuffer
+
+\startbuffer[2]
+ $T_{\text{fluff}}$
+\stopbuffer
+
+\startbuffer[3]
+ $T_{\text{\boundary1 fluff}}$
+\stopbuffer
+
+\unexpanded\def\Show#1#2#3%
+ {\doifelsenothing{#3}
+ {\small\tx\typeinlinebuffer[#1]}
+ {\doifelse{#3}{-}
+ {\small\bf\tt mode #2}
+ {\switchtobodyfont[#3]\showfontkerns\showglyphs\mathscriptboxmode#2\relax\inlinebuffer[#1]}}}
+
+\starttabulate[|lBT|c|c|c|c|c|]
+ \NC \NC \Show{1}{0}{} \NC\Show{1}{1}{} \NC \Show{2}{1}{} \NC \Show{2}{2}{} \NC \Show{3}{3}{} \NC \NR
+ \NC \NC \Show{1}{0}{-} \NC\Show{1}{1}{-} \NC \Show{2}{1}{-} \NC \Show{2}{2}{-} \NC \Show{3}{3}{-} \NC \NR
+ \NC modern \NC \Show{1}{0}{modern} \NC\Show{1}{1}{modern} \NC \Show{2}{1}{modern} \NC \Show{2}{2}{modern} \NC \Show{3}{3}{modern} \NC \NR
+ \NC lucidaot \NC \Show{1}{0}{lucidaot} \NC\Show{1}{1}{lucidaot} \NC \Show{2}{1}{lucidaot} \NC \Show{2}{2}{lucidaot} \NC \Show{3}{3}{lucidaot} \NC \NR
+ \NC pagella \NC \Show{1}{0}{pagella} \NC\Show{1}{1}{pagella} \NC \Show{2}{1}{pagella} \NC \Show{2}{2}{pagella} \NC \Show{3}{3}{pagella} \NC \NR
+ \NC cambria \NC \Show{1}{0}{cambria} \NC\Show{1}{1}{cambria} \NC \Show{2}{1}{cambria} \NC \Show{2}{2}{cambria} \NC \Show{3}{3}{cambria} \NC \NR
+ \NC dejavu \NC \Show{1}{0}{dejavu} \NC\Show{1}{1}{dejavu} \NC \Show{2}{1}{dejavu} \NC \Show{2}{2}{dejavu} \NC \Show{3}{3}{dejavu} \NC \NR
+\stoptabulate
+
+Kerning between a character subscript is controlled by \lpr {mathscriptcharmode}
+which also defaults to~1.
+
+Here is another example. Internally we tag kerns as italic kerns or font kerns
+where font kerns result from the staircase kern tables. In 2018 fonts like Latin
+Modern and Pagella rely on cheats with the boundingbox, Cambria uses staircase
+kerns and Lucida a mixture. Depending on how fonts evolve we might add some more
+control over what one can turn on and off.
+
+\def\MathSample#1#2#3%
+ {\NC
+ #1 \NC
+ #2 \NC
+ \showglyphdata \switchtobodyfont[#2,17.3pt]$#3T_{f}$ \NC
+ \showglyphdata \switchtobodyfont[#2,17.3pt]$#3\gamma_{e}$ \NC
+ \showglyphdata \switchtobodyfont[#2,17.3pt]$#3\gamma_{ee}$ \NC
+ \showglyphdata \switchtobodyfont[#2,17.3pt]$#3T_{\tf fluff}$ \NC
+ \NR}
+
+\starttabulate[|Tl|Tl|l|l|l|l|]
+ \FL
+ \MathSample{normal}{modern} {\mr}
+ \MathSample{} {pagella} {\mr}
+ \MathSample{} {cambria} {\mr}
+ \MathSample{} {lucidaot}{\mr}
+ \ML
+ \MathSample{bold} {modern} {\mb}
+ \MathSample{} {pagella} {\mb}
+ \MathSample{} {cambria} {\mb}
+ \MathSample{} {lucidaot}{\mb}
+ \LL
+\stoptabulate
+
+\subsection{Forcing fixed scripts with \lpr {mathscriptsmode}}
+
+We have three parameters that are used for this fixed anchoring:
+
+\starttabulate[|c|l|]
+\DB parameter \BC register \NC \NR
+\NC $d$ \NC \lpr {Umathsubshiftdown} \NC \NR
+\NC $u$ \NC \lpr {Umathsupshiftup} \NC \NR
+\NC $s$ \NC \lpr {Umathsubsupshiftdown} \NC \NR
+\LL
+\stoptabulate
+
+When we set \lpr {mathscriptsmode} to a value other than zero these are used
+for calculating fixed positions. This is something that is needed for instance
+for chemistry. You can manipulate the mentioned variables to achieve different
+effects.
+
+\def\SampleMath#1%
+ {$\mathscriptsmode#1\mathupright CH_2 + CH^+_2 + CH^2_2$}
+
+\starttabulate[|c|c|c|p|]
+\DB mode \BC down \BC up \BC example \NC \NR
+\TB
+\NC 0 \NC dynamic \NC dynamic \NC \SampleMath{0} \NC \NR
+\NC 1 \NC $d$ \NC $u$ \NC \SampleMath{1} \NC \NR
+\NC 2 \NC $s$ \NC $u$ \NC \SampleMath{2} \NC \NR
+\NC 3 \NC $s$ \NC $u + s - d$ \NC \SampleMath{3} \NC \NR
+\NC 4 \NC $d + (s-d)/2$ \NC $u + (s-d)/2$ \NC \SampleMath{4} \NC \NR
+\NC 5 \NC $d$ \NC $u + s - d$ \NC \SampleMath{5} \NC \NR
+\LL
+\stoptabulate
+
+The value of this parameter obeys grouping but applies to the whole current
+formula.
+
+% if needed we can put the value in stylenodes but maybe more should go there
+
+\subsection{Penalties: \lpr {mathpenaltiesmode}}
+
+\topicindex {math+penalties}
+
+Only in inline math penalties will be added in a math list. You can force
+penalties (also in display math) by setting:
+
+\starttyping
+\mathpenaltiesmode = 1
+\stoptyping
+
+This primnitive is not really needed in \LUATEX\ because you can use the callback
+\cbk {mlist_to_hlist} to force penalties by just calling the regular routine
+with forced penalties. However, as part of opening up and control this primitive
+makes sense. As a bonus we also provide two extra penalties:
+
+\starttyping
+\prebinoppenalty = -100 % example value
+\prerelpenalty = 900 % example value
+\stoptyping
+
+They default to inifinite which signals that they don't need to be inserted. When
+set they are injected before a binop or rel noad. This is an experimental feature.
+
+\subsection{Equation spacing: \lpr {matheqnogapstep}}
+
+By default \TEX\ will add one quad between the equation and the number. This is
+hard coded. A new primitive can control this:
+
+\startsyntax
+\matheqnogapstep = 1000
+\stopsyntax
+
+Because a math quad from the math text font is used instead of a dimension, we
+use a step to control the size. A value of zero will suppress the gap. The step
+is divided by 1000 which is the usual way to mimmick floating point factors in
+\TEX.
+
+\stopsection
+
+\startsection[title={Math constructs}]
+
+\subsection {Unscaled fences and \lpr{mathdelimitersmode}}
+
+\topicindex {math+fences}
+
+The \lpr {mathdelimitersmode} primitive is experimental and deals with the
+following (potential) problems. Three bits can be set. The first bit prevents an
+unwanted shift when the fence symbol is not scaled (a cambria side effect). The
+second bit forces italic correction between a preceding character ordinal and the
+fenced subformula, while the third bit turns that subformula into an ordinary so
+that the same spacing applies as with unfenced variants. Here we show Cambria
+(with \lpr {mathitalicsmode} enabled).
+
+\starttexdefinition Whatever #1
+ \NC \type{\mathdelimitersmode = #1}
+ \NC \mathitalicsmode1\mathdelimitersmode#1\ruledhbox{\showglyphs\showfontkerns\showfontitalics$f(x)$}
+ \NC \mathitalicsmode1\mathdelimitersmode#1\ruledhbox{\showglyphs\showfontkerns\showfontitalics$f\left(x\right)$}
+ \NC \NR
+\stoptexdefinition
+
+\start
+ \switchtobodyfont[cambria]
+ \starttabulate[|l|l|l|]
+ \Whatever{0}\Whatever{1}\Whatever{2}\Whatever{3}%
+ \Whatever{4}\Whatever{5}\Whatever{6}\Whatever{7}%
+ \stoptabulate
+\stop
+
+So, when set to 7 fenced subformulas with unscaled delimiters come out the same
+as unfenced ones. This can be handy for cases where one is forced to use \prm
+{left} and \prm {right} always because of unpredictable content. As said, it's an
+experimental feature (which somehow fits in the exceptional way fences are dealt
+with in the engine). The full list of flags is given in the next table:
+
+\starttabulate[|c|l|]
+\DB value \BC meaning \NC \NR
+\TB
+\NC \type{"01} \NC don't apply the usual shift \NC \NR
+\NC \type{"02} \NC apply italic correction when possible \NC \NR
+\NC \type{"04} \NC force an ordinary subformula \NC \NR
+\NC \type{"08} \NC no shift when a base character \NC \NR
+\NC \type{"10} \NC only shift when an extensible \NC \NR
+\LL
+\stoptabulate
+
+The effect can depend on the font (and for Cambria one can use for instance \type {"16}).
+
+\subsection[mathacc]{Accent handling with \lpr {Umathaccent}}
+
+\topicindex {math+accents}
+
+\LUATEX\ supports both top accents and bottom accents in math mode, and math
+accents stretch automatically (if this is supported by the font the accent comes
+from, of course). Bottom and combined accents as well as fixed-width math accents
+are controlled by optional keywords following \lpr {Umathaccent}.
+
+The keyword \type {bottom} after \lpr {Umathaccent} signals that a bottom accent
+is needed, and the keyword \type {both} signals that both a top and a bottom
+accent are needed (in this case two accents need to be specified, of course).
+
+Then the set of three integers defining the accent is read. This set of integers
+can be prefixed by the \type {fixed} keyword to indicate that a non-stretching
+variant is requested (in case of both accents, this step is repeated).
+
+A simple example:
+
+\starttyping
+\Umathaccent both fixed 0 0 "20D7 fixed 0 0 "20D7 {example}
+\stoptyping
+
+If a math top accent has to be placed and the accentee is a character and has a
+non-zero \type {top_accent} value, then this value will be used to place the
+accent instead of the \prm {skewchar} kern used by \TEX82.
+
+The \type {top_accent} value represents a vertical line somewhere in the
+accentee. The accent will be shifted horizontally such that its own \type
+{top_accent} line coincides with the one from the accentee. If the \type
+{top_accent} value of the accent is zero, then half the width of the accent
+followed by its italic correction is used instead.
+
+The vertical placement of a top accent depends on the \type {x_height} of the
+font of the accentee (as explained in the \TEX book), but if a value turns out
+to be zero and the font had a \type {MathConstants} table, then \type
+{AccentBaseHeight} is used instead.
+
+The vertical placement of a bottom accent is straight below the accentee, no
+correction takes place.
+
+Possible locations are \type {top}, \type {bottom}, \type {both} and \type
+{center}. When no location is given \type {top} is assumed. An additional
+parameter \nod {fraction} can be specified followed by a number; a value of for
+instance 1200 means that the criterium is 1.2 times the width of the nucleus. The
+fraction only applies to the stepwise selected shapes and is mostly meant for the
+\type {overlay} location. It also works for the other locations but then it
+concerns the width.
+
+\subsection{Building radicals with \lpr {Uradical} and \lpr {Uroot}}
+
+\topicindex {math+radicals}
+
+The new primitive \lpr {Uroot} allows the construction of a radical noad
+including a degree field. Its syntax is an extension of \lpr {Uradical}:
+
+\starttyping
+\Uradical <fam integer> <char integer> <radicand>
+\Uroot <fam integer> <char integer> <degree> <radicand>
+\stoptyping
+
+The placement of the degree is controlled by the math parameters \lpr
+{Umathradicaldegreebefore}, \lpr {Umathradicaldegreeafter}, and \lpr
+{Umathradicaldegreeraise}. The degree will be typeset in \prm
+{scriptscriptstyle}.
+
+\subsection{Super- and subscripts}
+
+The character fields in a \LUA|-|loaded \OPENTYPE\ math font can have a \quote
+{mathkern} table. The format of this table is the same as the \quote {mathkern}
+table that is returned by the \type {fontloader} library, except that all height
+and kern values have to be specified in actual scaled points.
+
+When a super- or subscript has to be placed next to a math item, \LUATEX\ checks
+whether the super- or subscript and the nucleus are both simple character items.
+If they are, and if the fonts of both character items are \OPENTYPE\ fonts (as
+opposed to legacy \TEX\ fonts), then \LUATEX\ will use the \OPENTYPE\ math
+algorithm for deciding on the horizontal placement of the super- or subscript.
+
+This works as follows:
+
+\startitemize
+ \startitem
+ The vertical position of the script is calculated.
+ \stopitem
+ \startitem
+ The default horizontal position is flat next to the base character.
+ \stopitem
+ \startitem
+ For superscripts, the italic correction of the base character is added.
+ \stopitem
+ \startitem
+ For a superscript, two vertical values are calculated: the bottom of the
+ script (after shifting up), and the top of the base. For a subscript, the two
+ values are the top of the (shifted down) script, and the bottom of the base.
+ \stopitem
+ \startitem
+ For each of these two locations:
+ \startitemize
+ \startitem
+ find the math kern value at this height for the base (for a subscript
+ placement, this is the bottom_right corner, for a superscript
+ placement the top_right corner)
+ \stopitem
+ \startitem
+ find the math kern value at this height for the script (for a
+ subscript placement, this is the top_left corner, for a superscript
+ placement the bottom_left corner)
+ \stopitem
+ \startitem
+ add the found values together to get a preliminary result.
+ \stopitem
+ \stopitemize
+ \stopitem
+ \startitem
+ The horizontal kern to be applied is the smallest of the two results from
+ previous step.
+ \stopitem
+\stopitemize
+
+The math kern value at a specific height is the kern value that is specified by the
+next higher height and kern pair, or the highest one in the character (if there is no
+value high enough in the character), or simply zero (if the character has no math kern
+pairs at all).
+
+\subsection{Scripts on extensibles: \lpr {Uunderdelimiter}, \lpr {Uoverdelimiter},
+\lpr {Udelimiterover}, \lpr {Udelimiterunder} and \lpr {Uhextensible}}
+
+\topicindex {math+scripts}
+\topicindex {math+delimiters}
+\topicindex {math+extensibles}
+
+The primitives \lpr {Uunderdelimiter} and \lpr {Uoverdelimiter} allow the
+placement of a subscript or superscript on an automatically extensible item and
+\lpr {Udelimiterunder} and \lpr {Udelimiterover} allow the placement of an
+automatically extensible item as a subscript or superscript on a nucleus. The
+input:
+
+% these produce radical noads .. in fact the code base has the numbers wrong for
+% quite a while, so no one seems to use this
+
+\startbuffer
+$\Uoverdelimiter 0 "2194 {\hbox{\strut overdelimiter}}$
+$\Uunderdelimiter 0 "2194 {\hbox{\strut underdelimiter}}$
+$\Udelimiterover 0 "2194 {\hbox{\strut delimiterover}}$
+$\Udelimiterunder 0 "2194 {\hbox{\strut delimiterunder}}$
+\stopbuffer
+
+\typebuffer will render this:
+
+\blank \startnarrower \getbuffer \stopnarrower \blank
+
+The vertical placements are controlled by \lpr {Umathunderdelimiterbgap}, \lpr
+{Umathunderdelimitervgap}, \lpr {Umathoverdelimiterbgap}, and \lpr
+{Umathoverdelimitervgap} in a similar way as limit placements on large operators.
+The superscript in \lpr {Uoverdelimiter} is typeset in a suitable scripted style,
+the subscript in \lpr {Uunderdelimiter} is cramped as well.
+
+These primitives accepts an option \type {width} specification. When used the
+also optional keywords \type {left}, \type {middle} and \type {right} will
+determine what happens when a requested size can't be met (which can happen when
+we step to successive larger variants).
+
+An extra primitive \lpr {Uhextensible} is available that can be used like this:
+
+\startbuffer
+$\Uhextensible width 10cm 0 "2194$
+\stopbuffer
+
+\typebuffer This will render this:
+
+\blank \startnarrower \getbuffer \stopnarrower \blank
+
+Here you can also pass options, like:
+
+\startbuffer
+$\Uhextensible width 1pt middle 0 "2194$
+\stopbuffer
+
+\typebuffer This gives:
+
+\blank \startnarrower \getbuffer \stopnarrower \blank
+
+\LUATEX\ internally uses a structure that supports \OPENTYPE\ \quote
+{MathVariants} as well as \TFM\ \quote {extensible recipes}. In most cases where
+font metrics are involved we have a different code path for traditional fonts end
+\OPENTYPE\ fonts.
+
+\subsection{Fractions and the new \lpr {Uskewed} and \lpr {Uskewedwithdelims}}
+
+\topicindex {math+fractions}
+
+The \prm {abovewithdelims} command accepts a keyword \type {exact}. When issued
+the extra space relative to the rule thickness is not added. One can of course
+use the \type {\Umathfraction..gap} commands to influence the spacing. Also the
+rule is still positioned around the math axis.
+
+\starttyping
+$$ { {a} \abovewithdelims() exact 4pt {b} }$$
+\stoptyping
+
+The math parameter table contains some parameters that specify a horizontal and
+vertical gap for skewed fractions. Of course some guessing is needed in order to
+implement something that uses them. And so we now provide a primitive similar to the
+other fraction related ones but with a few options so that one can influence the
+rendering. Of course a user can also mess around a bit with the parameters
+\lpr {Umathskewedfractionhgap} and \lpr {Umathskewedfractionvgap}.
+
+The syntax used here is:
+
+\starttyping
+{ {1} \Uskewed / <options> {2} }
+{ {1} \Uskewedwithdelims / () <options> {2} }
+\stoptyping
+
+where the options can be \type {noaxis} and \type {exact}. By default we add half
+the axis to the shifts and by default we zero the width of the middle character.
+For Latin Modern the result looks as follows:
+
+\def\ShowA#1#2#3{$x + { {#1} \Uskewed / #3 {#2} } + x$}
+\def\ShowB#1#2#3{$x + { {#1} \Uskewedwithdelims / () #3 {#2} } + x$}
+
+\start
+ \switchtobodyfont[modern]
+ \starttabulate[||||||]
+ \NC \NC
+ \ShowA{a}{b}{} \NC
+ \ShowA{1}{2}{} \NC
+ \ShowB{a}{b}{} \NC
+ \ShowB{1}{2}{} \NC
+ \NR
+ \NC \type{exact} \NC
+ \ShowA{a}{b}{exact} \NC
+ \ShowA{1}{2}{exact} \NC
+ \ShowB{a}{b}{exact} \NC
+ \ShowB{1}{2}{exact} \NC
+ \NR
+ \NC \type{noaxis} \NC
+ \ShowA{a}{b}{noaxis} \NC
+ \ShowA{1}{2}{noaxis} \NC
+ \ShowB{a}{b}{noaxis} \NC
+ \ShowB{1}{2}{noaxis} \NC
+ \NR
+ \NC \type{exact noaxis} \NC
+ \ShowA{a}{b}{exact noaxis} \NC
+ \ShowA{1}{2}{exact noaxis} \NC
+ \ShowB{a}{b}{exact noaxis} \NC
+ \ShowB{1}{2}{exact noaxis} \NC
+ \NR
+ \stoptabulate
+\stop
+
+\subsection {Delimiters: \type{\Uleft}, \prm {Umiddle} and \prm {Uright}}
+
+\topicindex {math+delimiters}
+
+Normally you will force delimiters to certain sizes by putting an empty box or
+rule next to it. The resulting delimiter will either be a character from the
+stepwise size range or an extensible. The latter can be quite differently
+positioned than the characters as it depends on the fit as well as the fact if
+the used characters in the font have depth or height. Commands like (plain \TEX
+s) \type {\big} need use this feature. In \LUATEX\ we provide a bit more control
+by three variants that support optional parameters \type {height}, \type {depth}
+and \type {axis}. The following example uses this:
+
+\startbuffer
+\Uleft height 30pt depth 10pt \Udelimiter "0 "0 "000028
+\quad x\quad
+\Umiddle height 40pt depth 15pt \Udelimiter "0 "0 "002016
+\quad x\quad
+\Uright height 30pt depth 10pt \Udelimiter "0 "0 "000029
+\quad \quad \quad
+\Uleft height 30pt depth 10pt axis \Udelimiter "0 "0 "000028
+\quad x\quad
+\Umiddle height 40pt depth 15pt axis \Udelimiter "0 "0 "002016
+\quad x\quad
+\Uright height 30pt depth 10pt axis \Udelimiter "0 "0 "000029
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection
+\ruledhbox{\mathematics{\getbuffer}}
+\stoplinecorrection
+
+The keyword \type {exact} can be used as directive that the real dimensions
+should be applied when the criteria can't be met which can happen when we're
+still stepping through the successively larger variants. When no dimensions are
+given the \type {noaxis} command can be used to prevent shifting over the axis.
+
+You can influence the final class with the keyword \type {class} which will
+influence the spacing. The numbers are the same as for character classes.
+
+\subsection {Accents: \type{\mathlimitsmode}}
+
+\topicindex {math+accents}
+
+When you use \type {\limits} or \type {\nolimits} without scripts spacing might
+get messed up. This can be prevented by setting \type {\mathlimitsmode} to a
+non|-|zero value.
+
+\stopsection
+
+\startsection[title={Extracting values}]
+
+\subsection{Codes and using \lpr {Umathcode}, \lpr {Umathcharclass}, \lpr
+{Umathcharfam} and \lpr {Umathcharslot}}
+
+\topicindex {math+codes}
+
+You can extract the components of a math character. Say that we have defined:
+
+\starttyping
+\Umathcode 1 2 3 4
+\stoptyping
+
+then
+
+\starttyping
+[\Umathcharclass1] [\Umathcharfam1] [\Umathcharslot1]
+\stoptyping
+
+will return:
+
+\starttyping
+[2] [3] [4]
+\stoptyping
+
+These commands are provides as convenience. Before they come available you could
+do the following:
+
+\starttyping
+\def\Umathcharclass{\directlua{tex.print(tex.getmathcode(token.scan_int())[1])}}
+\def\Umathcharfam {\directlua{tex.print(tex.getmathcode(token.scan_int())[2])}}
+\def\Umathcharslot {\directlua{tex.print(tex.getmathcode(token.scan_int())[3])}}
+\stoptyping
+
+\subsection {Last lines and \lpr{predisplaygapfactor}}
+
+\topicindex {math+last line}
+
+There is a new primitive to control the overshoot in the calculation of the
+previous line in mid|-|paragraph display math. The default value is 2 times
+the em width of the current font:
+
+\starttyping
+\predisplaygapfactor=2000
+\stoptyping
+
+If you want to have the length of the last line independent of math i.e.\ you don't
+want to revert to a hack where you insert a fake display math formula in order to
+get the length of the last line, the following will often work too:
+
+\starttyping
+\def\lastlinelength{\dimexpr
+ \directlua {tex.sprint (
+ (nodes.dimensions(node.tail(tex.lists.page_head).list))
+ )}sp
+\relax}
+\stoptyping
+
+\stopsection
+
+\startsection[title={Math mode}]
+
+\subsection {Verbose versions of single|-|character math commands like \lpr {Usuperscript}
+and \lpr {Usubscript}}
+
+\topicindex {math+styles}
+
+\LUATEX\ defines six new primitives that have the same function as
+\type {^}, \type {_}, \type {$}, and \type {$$}:
+
+\starttabulate[|l|l|]
+\DB primitive \BC explanation \NC \NR
+\TB
+\NC \lpr {Usuperscript} \NC duplicates the functionality of \type {^} \NC \NR
+\NC \lpr {Usubscript} \NC duplicates the functionality of \type {_} \NC \NR
+\NC \lpr {Ustartmath} \NC duplicates the functionality of \type {$}, % $
+ when used in non-math mode. \NC \NR
+\NC \lpr {Ustopmath} \NC duplicates the functionality of \type {$}, % $
+ when used in inline math mode. \NC \NR
+\NC \lpr {Ustartdisplaymath} \NC duplicates the functionality of \type {$$}, % $$
+ when used in non-math mode. \NC \NR
+\NC \lpr {Ustopdisplaymath} \NC duplicates the functionality of \type {$$}, % $$
+ when used in display math mode. \NC \NR
+\LL
+\stoptabulate
+
+The \lpr {Ustopmath} and \lpr {Ustopdisplaymath} primitives check if the current
+math mode is the correct one (inline vs.\ displayed), but you can freely intermix
+the four mathon|/|mathoff commands with explicit dollar sign(s).
+
+\subsection{Script commands \lpr {Unosuperscript} and \lpr {Unosubscript}}
+
+\topicindex {math+styles}
+\topicindex {math+scripts}
+
+These two commands result in super- and subscripts but with the current style (at the
+time of rendering). So,
+
+\startbuffer[script]
+$
+ x\Usuperscript {1}\Usubscript {2} =
+ x\Unosuperscript{1}\Unosubscript{2} =
+ x\Usuperscript {1}\Unosubscript{2} =
+ x\Unosuperscript{1}\Usubscript {2}
+$
+\stopbuffer
+
+\typebuffer
+
+results in \inlinebuffer[script].
+
+\subsection{Allowed math commands in non|-|math modes}
+
+\topicindex {math+text}
+\topicindex {text+math}
+
+The commands \prm {mathchar}, and \lpr {Umathchar} and control sequences that are
+the result of \prm {mathchardef} or \lpr {Umathchardef} are also acceptable in
+the horizontal and vertical modes. In those cases, the \prm {textfont} from the
+requested math family is used.
+
+\stopsection
+
+\startsection[title={Goodies}]
+
+\subsection {Flattening: \lpr {mathflattenmode}}
+
+\topicindex {math+flattening}
+
+The \TEX\ math engine collapses \type {ord} noads without sub- and superscripts
+and a character as nucleus. and which has the side effect that in \OPENTYPE\ mode
+italic corrections are applied (given that they are enabled).
+
+\startbuffer[sample]
+\switchtobodyfont[modern]
+$V \mathbin{\mathbin{v}} V$\par
+$V \mathord{\mathord{v}} V$\par
+\stopbuffer
+
+\typebuffer[sample]
+
+This renders as:
+
+\blank \start \mathflattenmode\plusone \getbuffer[sample] \stop \blank
+
+When we set \lpr {mathflattenmode} to 31 we get:
+
+\blank \start \mathflattenmode\numexpr1+2+4+8+16\relax \getbuffer[sample] \stop \blank
+
+When you see no difference, then the font probably has the proper character
+dimensions and no italic correction is needed. For Latin Modern (at least till
+2018) there was a visual difference. In that respect this parameter is not always
+needed unless of course you want efficient math lists anyway.
+
+You can influence flattening by adding the appropriate number to the value of the
+mode parameter. The default value is~1.
+
+\starttabulate[|Tc|c|]
+\DB mode \BC class \NC \NR
+\TB
+\NC 1 \NC ord \NC \NR
+\NC 2 \NC bin \NC \NR
+\NC 4 \NC rel \NC \NR
+\NC 8 \NC punct \NC \NR
+\NC 16 \NC inner \NC \NR
+\LL
+\stoptabulate
+
+\subsection {Less Tracing}
+
+\topicindex {math+tracing}
+
+Because there are quite some math related parameters and values, it is possible
+to limit tracing. Only when \type {tracingassigns} and|/|or \type
+{tracingrestores} are set to~2 or more they will be traced.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-metapost.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-metapost.tex
new file mode 100644
index 00000000000..6cee0f4937f
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-metapost.tex
@@ -0,0 +1,453 @@
+% language=uk
+
+% lua.newtable
+
+\environment luametatex-style
+
+\startcomponent luametatex-metapost
+
+\startchapter[reference=metapost,title={The \METAPOST\ library \type {mplib}}]
+
+\startsection[title={Process management}][library=mplib]
+
+\topicindex {\METAPOST}
+\topicindex {\METAPOST+mplib}
+\topicindex {images+mplib}
+\topicindex {images+\METAPOST}
+
+\libindex{version}
+
+The \METAPOST\ library interface registers itself in the table \type {mplib}. It
+is based on \MPLIB\ version \ctxlua {context(mplib.version())}.
+
+\subsection{\type {new}}
+
+\libindex{new}
+
+To create a new \METAPOST\ instance, call
+
+\startfunctioncall
+<mpinstance> mp = mplib.new({...})
+\stopfunctioncall
+
+This creates the \type {mp} instance object. The argument hash can have a number
+of different fields, as follows:
+
+\starttabulate[|l|l|pl|pl|]
+\DB name \BC type \BC description \BC default \NC \NR
+\TB
+\NC \type{error_line} \NC number \NC error line width \NC 79 \NC \NR
+\NC \type{print_line} \NC number \NC line length in ps output \NC 100 \NC \NR
+\NC \type{random_seed} \NC number \NC the initial random seed \NC variable \NC \NR
+\NC \type{math_mode} \NC string \NC the number system to use:
+ \type {scaled},
+ \type {double} or
+ % \type {binary} or
+ \type {decimal} \NC \type {scaled} \NC \NR
+\NC \type{interaction} \NC string \NC the interaction mode:
+ \type {batch},
+ \type {nonstop},
+ \type {scroll} or
+ \type {errorstop} \NC \type {errorstop} \NC \NR
+\NC \type{job_name} \NC string \NC a compatibility value \NC \type {mpout} \NC \NR
+\NC \type{find_file} \NC function \NC a function to find files \NC only local files \NC \NR
+\NC \type{utf8} \NC boolean \NC permit characters in the
+ range 128 upto 255 to be
+ part of names \NC \type {false} \NC \NR
+\LL
+\stoptabulate
+
+The binary mode is no longer available in the \LUATEX\ version of \MPLIB. It
+offers no real advantage and brings a ton of extra libraries with platform
+specific properties that we can now avoid. We might introduce a high resolution
+scaled variant at some point but only when it pays of performance wise.
+
+The \type {find_file} function should be of this form:
+
+\starttyping
+<string> found = finder (<string> name, <string> mode, <string> type)
+\stoptyping
+
+with:
+
+\starttabulate[|l|p|]
+\DB name \BC the requested file \NC \NR
+\TB
+\NC \type{mode} \NC the file mode: \type {r} or \type {w} \NC \NR
+\NC \type{type} \NC the kind of file, one of: \type {mp}, \type {tfm}, \type {map},
+ \type {pfb}, \type {enc} \NC \NR
+\LL
+\stoptabulate
+
+Return either the full path name of the found file, or \type {nil} if the file
+cannot be found.
+
+Note that the new version of \MPLIB\ no longer uses binary mem files, so the way
+to preload a set of macros is simply to start off with an \type {input} command
+in the first \type {execute} call.
+
+When you are processing a snippet of text starting with \type {btex} or \type
+{verbatimtex} and ending with \type {etex}, the \METAPOST\ \type {texscriptmode}
+parameter controls how spaces and newlines get honoured. The default value is~1.
+Possible values are:
+
+\starttabulate[|l|p|]
+\DB name \BC meaning \NC \NR
+\TB
+\NC \type {0} \NC no newlines \NC \NR
+\NC \type {1} \NC newlines in \type {verbatimtex} \NC \NR
+\NC \type {2} \NC newlines in \type {verbatimtex} and \type {etex} \NC \NR
+\NC \type {3} \NC no leading and trailing strip in \type {verbatimtex} \NC \NR
+\NC \type {4} \NC no leading and trailing strip in \type {verbatimtex} and \type {btex} \NC \NR
+\LL
+\stoptabulate
+
+That way the \LUA\ handler (assigned to \type {make_text}) can do what it likes.
+An \type {etex} has to be followed by a space or \type {;} or be at the end of a
+line and preceded by a space or at the beginning of a line.
+
+\subsection{\type {statistics}}
+
+\libindex{statistics}
+
+You can request statistics with:
+
+\startfunctioncall
+<table> stats = mp:statistics()
+\stopfunctioncall
+
+This function returns the vital statistics for an \MPLIB\ instance. There are
+four fields, giving the maximum number of used items in each of four allocated
+object classes:
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{main_memory} \NC number \NC memory size \NC \NR
+\NC \type{hash_size} \NC number \NC hash size\NC \NR
+\NC \type{param_size} \NC number \NC simultaneous macro parameters\NC \NR
+\NC \type{max_in_open} \NC number \NC input file nesting levels\NC \NR
+\LL
+\stoptabulate
+
+Note that in the new version of \MPLIB, this is informational only. The objects
+are all allocated dynamically, so there is no chance of running out of space
+unless the available system memory is exhausted.
+
+\subsection{\type {execute}}
+
+\libindex{execute}
+
+You can ask the \METAPOST\ interpreter to run a chunk of code by calling
+
+\startfunctioncall
+<table> rettable = execute(mp,"metapost code")
+\stopfunctioncall
+
+for various bits of \METAPOST\ language input. Be sure to check the \type
+{rettable.status} (see below) because when a fatal \METAPOST\ error occurs the
+\MPLIB\ instance will become unusable thereafter.
+
+Generally speaking, it is best to keep your chunks small, but beware that all
+chunks have to obey proper syntax, like each of them is a small file. For
+instance, you cannot split a single statement over multiple chunks.
+
+In contrast with the normal stand alone \type {mpost} command, there is
+\notabene {no} implied \quote{input} at the start of the first chunk.
+
+\subsection{\type {finish}}
+
+\libindex{finish}
+
+\startfunctioncall
+<table> rettable = finish(mp)
+\stopfunctioncall
+
+If for some reason you want to stop using an \MPLIB\ instance while processing is
+not yet actually done, you can call \type {finish}. Eventually, used memory
+will be freed and open files will be closed by the \LUA\ garbage collector, but
+an explicit \type {finish} is the only way to capture the final part of the
+output streams.
+
+\stopsection
+
+\startsection[title={The end result}]
+
+\libindex {fields}
+
+The return value of \type {execute} and \type {finish} is a table with a
+few possible keys (only \type {status} is always guaranteed to be present).
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{log} \NC string \NC output to the \quote {log} stream \NC \NR
+\NC \type{term} \NC string \NC output to the \quote {term} stream \NC \NR
+\NC \type{error} \NC string \NC output to the \quote {error} stream
+ (only used for \quote {out of memory}) \NC \NR
+\NC \type{status} \NC number \NC the return value:
+ \type {0} = good,
+ \type {1} = warning,
+ \type {2} = errors,
+ \type {3} = fatal error \NC \NR
+\NC \type{fig} \NC table \NC an array of generated figures (if any) \NC \NR
+\LL
+\stoptabulate
+
+When \type {status} equals~3, you should stop using this \MPLIB\ instance
+immediately, it is no longer capable of processing input.
+
+If it is present, each of the entries in the \type {fig} array is a userdata
+representing a figure object, and each of those has a number of object methods
+you can call:
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{boundingbox} \NC function \NC returns the bounding box, as an array of 4
+ values \NC \NR
+\NC \type{postscript} \NC function \NC returns a string that is the ps output of the
+ \type {fig}. this function accepts two optional
+ integer arguments for specifying the values of
+ \type {prologues} (first argument) and \type
+ {procset} (second argument) \NC \NR
+\NC \type{svg} \NC function \NC returns a string that is the svg output of the
+ \type {fig}. This function accepts an optional
+ integer argument for specifying the value of
+ \type {prologues} \NC \NR
+\NC \type{objects} \NC function \NC returns the actual array of graphic objects in
+ this \type {fig} \NC \NR
+\NC \type{copy_objects} \NC function \NC returns a deep copy of the array of graphic
+ objects in this \type {fig} \NC \NR
+\NC \type{filename} \NC function \NC the filename this \type {fig}'s \POSTSCRIPT\
+ output would have written to in stand alone
+ mode \NC \NR
+\NC \type{width} \NC function \NC the \type {fontcharwd} value \NC \NR
+\NC \type{height} \NC function \NC the \type {fontcharht} value \NC \NR
+\NC \type{depth} \NC function \NC the \type {fontchardp} value \NC \NR
+\NC \type{italcorr} \NC function \NC the \type {fontcharit} value \NC \NR
+\NC \type{charcode} \NC function \NC the (rounded) \type {charcode} value \NC \NR
+\LL
+\stoptabulate
+
+Note: you can call \type {fig:objects()} only once for any one \type {fig}
+object!
+
+When the boundingbox represents a \quote {negated rectangle}, i.e.\ when the
+first set of coordinates is larger than the second set, the picture is empty.
+
+Graphical objects come in various types that each has a different list of
+accessible values. The types are: \type {fill}, \type {outline}, \type {text},
+\type {start_clip}, \type {stop_clip}, \type {start_bounds}, \type {stop_bounds},
+\type {special}.
+
+There is a helper function (\type {mplib.fields(obj)}) to get the list of
+accessible values for a particular object, but you can just as easily use the
+tables given below.
+
+All graphical objects have a field \type {type} that gives the object type as a
+string value; it is not explicit mentioned in the following tables. In the
+following, \type {number}s are \POSTSCRIPT\ points represented as a floating
+point number, unless stated otherwise. Field values that are of type \type
+{table} are explained in the next section.
+
+\subsection{fill}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{path} \NC table \NC the list of knots \NC \NR
+\NC \type{htap} \NC table \NC the list of knots for the reversed trajectory \NC \NR
+\NC \type{pen} \NC table \NC knots of the pen \NC \NR
+\NC \type{color} \NC table \NC the object's color \NC \NR
+\NC \type{linejoin} \NC number \NC line join style (bare number)\NC \NR
+\NC \type{miterlimit} \NC number \NC miterlimit\NC \NR
+\NC \type{prescript} \NC string \NC the prescript text \NC \NR
+\NC \type{postscript} \NC string \NC the postscript text \NC \NR
+\LL
+\stoptabulate
+
+The entries \type {htap} and \type {pen} are optional.
+
+\subsection{outline}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{path} \NC table \NC the list of knots \NC \NR
+\NC \type{pen} \NC table \NC knots of the pen \NC \NR
+\NC \type{color} \NC table \NC the object's color \NC \NR
+\NC \type{linejoin} \NC number \NC line join style (bare number) \NC \NR
+\NC \type{miterlimit} \NC number \NC miterlimit \NC \NR
+\NC \type{linecap} \NC number \NC line cap style (bare number) \NC \NR
+\NC \type{dash} \NC table \NC representation of a dash list \NC \NR
+\NC \type{prescript} \NC string \NC the prescript text \NC \NR
+\NC \type{postscript} \NC string \NC the postscript text \NC \NR
+\LL
+\stoptabulate
+
+The entry \type {dash} is optional.
+
+\subsection{text}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{text} \NC string \NC the text \NC \NR
+\NC \type{font} \NC string \NC font tfm name \NC \NR
+\NC \type{dsize} \NC number \NC font size \NC \NR
+\NC \type{color} \NC table \NC the object's color \NC \NR
+\NC \type{width} \NC number \NC \NC \NR
+\NC \type{height} \NC number \NC \NC \NR
+\NC \type{depth} \NC number \NC \NC \NR
+\NC \type{transform} \NC table \NC a text transformation \NC \NR
+\NC \type{prescript} \NC string \NC the prescript text \NC \NR
+\NC \type{postscript} \NC string \NC the postscript text \NC \NR
+\LL
+\stoptabulate
+
+\subsection{special}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{prescript} \NC string \NC special text \NC \NR
+\LL
+\stoptabulate
+
+\subsection{start_bounds, start_clip}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{path} \NC table \NC the list of knots \NC \NR
+\LL
+\stoptabulate
+
+\subsubsection{stop_bounds, stop_clip}
+
+Here are no fields available.
+
+\stopsection
+
+\startsection[title={Subsidiary table formats}]
+
+\subsection{Paths and pens}
+
+Paths and pens (that are really just a special type of paths as far as \MPLIB\ is
+concerned) are represented by an array where each entry is a table that
+represents a knot.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{left_type} \NC string \NC when present: endpoint, but usually absent \NC \NR
+\NC \type{right_type} \NC string \NC like \type {left_type} \NC \NR
+\NC \type{x_coord} \NC number \NC X coordinate of this knot \NC \NR
+\NC \type{y_coord} \NC number \NC Y coordinate of this knot \NC \NR
+\NC \type{left_x} \NC number \NC X coordinate of the precontrol point of this knot \NC \NR
+\NC \type{left_y} \NC number \NC Y coordinate of the precontrol point of this knot \NC \NR
+\NC \type{right_x} \NC number \NC X coordinate of the postcontrol point of this knot \NC \NR
+\NC \type{right_y} \NC number \NC Y coordinate of the postcontrol point of this knot \NC \NR
+\LL
+\stoptabulate
+
+There is one special case: pens that are (possibly transformed) ellipses have an
+extra key \type {type} with value \type {elliptical} besides the array part
+containing the knot list.
+
+\subsection{Colors}
+
+A color is an integer array with 0, 1, 3 or 4 values:
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{0} \NC marking only \NC no values \NC \NR
+\NC \type{1} \NC greyscale \NC one value in the range $(0,1)$, \quote {black} is $0$ \NC \NR
+\NC \type{3} \NC \RGB \NC three values in the range $(0,1)$, \quote {black} is $0,0,0$ \NC \NR
+\NC \type{4} \NC \CMYK \NC four values in the range $(0,1)$, \quote {black} is $0,0,0,1$ \NC \NR
+\LL
+\stoptabulate
+
+If the color model of the internal object was \type {uninitialized}, then it was
+initialized to the values representing \quote {black} in the colorspace \type
+{defaultcolormodel} that was in effect at the time of the \type {shipout}.
+
+\subsection{Transforms}
+
+Each transform is a six|-|item array.
+
+\starttabulate[|l|l|p|]
+\DB index \BC type \BC explanation \NC \NR
+\TB
+\NC \type{1} \NC number \NC represents x \NC \NR
+\NC \type{2} \NC number \NC represents y \NC \NR
+\NC \type{3} \NC number \NC represents xx \NC \NR
+\NC \type{4} \NC number \NC represents yx \NC \NR
+\NC \type{5} \NC number \NC represents xy \NC \NR
+\NC \type{6} \NC number \NC represents yy \NC \NR
+\LL
+\stoptabulate
+
+Note that the translation (index 1 and 2) comes first. This differs from the
+ordering in \POSTSCRIPT, where the translation comes last.
+
+\subsection{Dashes}
+
+Each \type {dash} is two-item hash, using the same model as \POSTSCRIPT\ for the
+representation of the dashlist. \type {dashes} is an array of \quote {on} and
+\quote {off}, values, and \type {offset} is the phase of the pattern.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{dashes} \NC hash \NC an array of on-off numbers \NC \NR
+\NC \type{offset} \NC number \NC the starting offset value \NC \NR
+\LL
+\stoptabulate
+
+\subsection{Pens and \type {pen_info}}
+
+\libindex{pen_info}
+
+There is helper function (\type {pen_info(obj)}) that returns a table containing
+a bunch of vital characteristics of the used pen (all values are floats):
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{width} \NC number \NC width of the pen \NC \NR
+\NC \type{sx} \NC number \NC $x$ scale \NC \NR
+\NC \type{rx} \NC number \NC $xy$ multiplier \NC \NR
+\NC \type{ry} \NC number \NC $yx$ multiplier \NC \NR
+\NC \type{sy} \NC number \NC $y$ scale \NC \NR
+\NC \type{tx} \NC number \NC $x$ offset \NC \NR
+\NC \type{ty} \NC number \NC $y$ offset \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title=Acessors]
+
+\subsection[title={Character size information}]
+
+\libindex{char_width}
+\libindex{char_height}
+\libindex{char_depth}
+
+These functions find the size of a glyph in a defined font. The \type {fontname}
+is the same name as the argument to \type {infont}; the \type {char} is a glyph
+id in the range 0 to 255; the returned \type {w} is in AFM units.
+
+
+\startfunctioncall
+<number> w = char_width(mp,<string> fontname, <number> char)
+<number> h = char_height(mp,<string> fontname, <number> char)
+<number> d = char_depth(mp,<string> fontname, <number> char)
+\stopfunctioncall
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-modifications.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-modifications.tex
new file mode 100644
index 00000000000..6448f2b01c1
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-modifications.tex
@@ -0,0 +1,440 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-modifications
+
+\startchapter[reference=modifications,title={The original engines}]
+
+\startsection[title=The merged engines]
+
+\startsubsection[title=The rationale]
+
+\topicindex {engines}
+\topicindex {history}
+
+The first version of \LUATEX, made by Hartmut after we discussed the possibility
+of an extension language, only had a few extra primitives and it was largely the
+same as \PDFTEX. It was presented to the public in 2005. As part of the Oriental
+\TEX\ project, Taco merged substantial parts of \ALEPH\ into the code and some
+more primitives were added. Then we started more fundamental experiments. After
+many years, when the engine had become more stable, the decision was made to
+clean up the rather hybrid nature of the program. This means that some primitives
+were promoted to core primitives, often with a different name, and that others
+were removed. This also made it possible to start cleaning up the code base. In
+\in {chapter} [enhancements] we discuss some new primitives, here we will cover
+most of the adapted ones.
+
+During more than a decade stepwise new functionality was added and after 10 years
+the more of less stable version 1.0 was presented. But we continued and after
+some 15 years the \LUAMETATEX\ follow up entered its first testing stage. But
+before details about the engine are discussed in successive chapters, we first
+summarize where we started from. Keep in mind that in \LUAMETATEX\ we have a bit
+less than in \LUATEX, so this section differs from the one in the \LUATEX\
+manual.
+
+Besides the expected changes caused by new functionality, there are a number of
+not|-|so|-|expected changes. These are sometimes a side|-|effect of a new
+(conflicting) feature, or, more often than not, a change necessary to clean up
+the internal interfaces. These will also be mentioned.
+
+\stopsubsection
+
+\startsubsection[title=Changes from \TEX\ 3.1415926]
+
+\topicindex {\TEX}
+
+Of course it all starts with traditional \TEX. Even if we started with \PDFTEX,
+most still comes from original Knuthian \TEX. But we divert a bit.
+
+\startitemize
+
+\startitem
+ The current code base is written in \CCODE, not \PASCAL. The original \CWEB\
+ documentation is kept when possible and not wrapped in tagged comments. As a
+ consequence instead of one large file plus change files, we now have multiple
+ files organized in categories like \type {tex}, \type {luaf}, \type
+ {languages}, \type {fonts}, \type {libraries}, etc. There are some artifacts
+ of the conversion to \CCODE, but these got (and get) removed stepwise. The
+ documentation, which actually comes from the mix of engines (via so called
+ change files), is kept as much as possible. Of course we want to stay as
+ close as possible to the original so that the documentation of the
+ fundamentals behind \TEX\ by Don Knuth still applies. However, because we use
+ \CCODE, some documentation is a bit off. Also, most global variables are now
+ collected in structures, but the original names were kept. There are lots of
+ so called macros too.
+\stopitem
+
+\startitem
+ See \in {chapter} [languages] for many small changes related to paragraph
+ building, language handling and hyphenation. The most important change is
+ that adding a brace group in the middle of a word (like in \type {of{}fice})
+ does not prevent ligature creation. Also, the hyphenation, ligature building
+ and kerning has been split so that we can hook in alternative or extra code
+ wherever we like. There are various options to control discretionary
+ injection and related penalties are now integrated in these nodes. Language
+ information is now bound to glyphs. The number of languages in \LUAMETATEX\
+ is smaller than in \LUATEX.
+\stopitem
+
+\startitem
+ There is no pool file, all strings are embedded during compilation. This also
+ removed some memory constraints. We kept token and node memory management
+ because it is convenient and efficient but parts were reimplemented in order
+ to remove some constraints. Token memory management is largely the same.
+\stopitem
+
+\startitem
+ The specifier \type {plus 1 fillll} does not generate an error. The extra
+ \quote {l} is simply typeset.
+\stopitem
+
+\startitem
+ The upper limit to \prm {endlinechar} and \prm {newlinechar} is 127.
+\stopitem
+
+\startitem
+ Because the backend is not built|-|in, the magnification (\prm {mag})
+ primitive is not doing nothing. A \type {shipout} just discards the content
+ of the given box. The write related primitives have to be implemented in the
+ used macro package using \LUA. None of the \PDFTEX\ derived primitives is
+ present.
+\stopitem
+
+\startitem
+ There is more control over some (formerly hard|-|coded) math properties. In fact,
+ there is a whole extra bit of math related code because we need to deal with
+ \OPENTYPE\ fonts.
+\stopitem
+
+\startitem
+ The \type {\outer} and \type {\long} prefixed are silently ignored. It is
+ permitted to use \type {\par} in math.
+\stopitem
+
+\startitem
+ Because there is no font loader, a \LUA\ variant is free to either support or
+ not the \OMEGA\ \type {ofm} file format. As there are hardly any such fonts
+ it probably makes no sense.
+\stopitem
+
+\startitem
+ The lack of a backend means that some primitives related to it are not
+ implemented. This is no big deal because it is possible to use the scanner
+ library to implement them as needed, which depends on the macro package and
+ backend.
+\stopitem
+
+\startitem
+ When detailed logging is enabled more detail is output with respect to what
+ nodes are involved. This is a side effect of the core nodes having more
+ detailed subtype information. The benefit of more detail wins from any wish
+ to be byte compatible in the logging. One can always write additional logging
+ in \LUA.
+\stopitem
+
+\stopitemize
+
+\stopsubsection
+
+\startsubsection[title=Changes from \ETEX\ 2.2]
+
+\topicindex {\ETEX}
+
+Being the de|-|facto standard extension of course we provide the \ETEX\
+features, but with a few small adaptations.
+
+\startitemize
+
+\startitem
+ The \ETEX\ functionality is always present and enabled so the prepended
+ asterisk or \type {-etex} switch for \INITEX\ is not needed.
+\stopitem
+
+\startitem
+ The \TEXXET\ extension is not present, so the primitives \type
+ {\TeXXeTstate}, \type {\beginR}, \type {\beginL}, \type {\endR} and \type
+ {\endL} are missing. Instead we used the \OMEGA|/|\ALEPH\ approach to
+ directionality as starting point, albeit it has been changed quite a bit,
+ so that we're probably not that far from \TEXXET.
+\stopitem
+
+\startitem
+ Some of the tracing information that is output by \ETEX's \prm
+ {tracingassigns} and \prm {tracingrestores} is not there. Also keep in mind
+ that tracing doesn't involve what \LUA\ does.
+\stopitem
+
+\startitem
+ Register management in \LUAMETATEX\ uses the \OMEGA|/|\ALEPH\ model, so the
+ maximum value is 65535 and the implementation uses a flat array instead of
+ the mixed flat & sparse model from \ETEX.
+\stopitem
+
+\startitem
+ Because we don't use change files on top of original \TEX, the integration of
+ \ETEX\ functionality is bit more natural, code wise.
+\stopitem
+
+\stopitemize
+
+\stopsubsection
+
+\startsubsection[title=Changes from \PDFTEX\ 1.40]
+
+\topicindex {\PDFTEX}
+
+Because we want to produce \PDF\ the most natural starting point was the popular
+\PDFTEX\ program. We inherit the stable features, dropped most of the
+experimental code and promoted some functionality to core \LUATEX\ functionality
+which in turn triggered renaming primitives. However, as the backend was dropped,
+not that much from \PDFTEX\ is present any more. Basically all we now inherit
+from \PDFTEX\ is expansion and protrusion but even that has been adapted. So
+don't expect \LUAMETATEX\ to be compatible.
+
+\startitemize
+
+\startitem
+ The experimental primitives \lpr {ifabsnum} and \lpr {ifabsdim} have been
+ promoted to core primitives.
+\stopitem
+
+\startitem
+ The primitives \lpr {ifincsname}, \lpr {expanded} and \lpr {quitvmode}
+ have become core primitives.
+\stopitem
+
+\startitem
+ As the hz (expansion) and protrusion mechanism are part of the core the
+ related primitives \lpr {lpcode}, \lpr {rpcode}, \lpr {efcode}, \lpr
+ {leftmarginkern}, \lpr {rightmarginkern} are promoted to core primitives. The
+ two commands \lpr {protrudechars} and \lpr {adjustspacing} control these
+ processes.
+\stopitem
+
+\startitem
+ In \LUAMETATEX\ three extra primitives can be used to overload the font
+ specific settings: \lpr {adjustspacingstep} (max: 100), \lpr
+ {adjustspacingstretch} (max: 1000) and \lpr {adjustspacingshrink} (max: 500).
+\stopitem
+
+\startitem
+ The hz optimization code has been partially redone so that we no longer need
+ to create extra font instances. The front- and backend have been decoupled
+ and the glyph and kern nodes carry the used values. In \LUATEX\ that made a
+ more efficient generation of \PDF\ code possible. It also resulted in much
+ cleaner code. The backend code is gone, but of course the information is
+ still carried around.
+\stopitem
+
+\startitem
+ When \lpr {adjustspacing} has value~2, hz optimization will be applied to
+ glyphs and kerns. When the value is~3, only glyphs will be treated. A value
+ smaller than~2 disables this feature. With value of~1, font expansion is
+ applied after \TEX's normal paragraph breaking routines have broken the
+ paragraph into lines. In this case, line breaks are identical to standard
+ \TEX\ behavior (as with \PDFTEX). But \unknown\ this is a left|-|over from
+ the early days of \PDFTEX\ when this feature was part of a research topic. At
+ some point level~1 might be dropped from \LUAMETATEX.
+\stopitem
+
+\startitem
+ When \lpr {protrudechars} has a value larger than zero characters at the edge
+ of a line can be made to hang out. A value of~2 will take the protrusion into
+ account when breaking a paragraph into lines. A value of~3 will try to deal
+ with right|-|to|-|left rendering; this is a still experimental feature.
+\stopitem
+
+\startitem
+ The pixel multiplier dimension \lpr {pxdimen} has be inherited as core
+ primitive.
+\stopitem
+
+\startitem
+ The primitive \lpr {tracingfonts} is now a core primitive but doesn't relate
+ to the backend.
+\stopitem
+
+\stopitemize
+
+\stopsubsection
+
+\startsubsection[title=Changes from \ALEPH\ RC4]
+
+\topicindex {\ALEPH}
+
+In \LUATEX\ we took the 32 bit aspects and much of the directional mechanisms and
+merged it into the \PDFTEX\ code base as starting point for further development.
+Then we simplified directionality, fixed it and opened it up. In \LUAMETATEX\ not
+that much of the later is left. We only have two horizontal directions. Instead
+of vertical directions we introduce an orientation model bound to boxes.
+
+The already reduced|-|to|-|four set of directions now only has two members:
+left|-|to|-|right and right|-|to|-|left. They don't do much as it is the backend
+that has to deal with them. When paragraphs are constructed a change in
+horizontal direction is irrelevant for calculating the dimensions. So, basically
+most that we do is registering state and passing that on till the backend can do
+something with it.
+
+Here is a summary of inherited functionality:
+
+\startitemize
+
+\startitem
+ The \type {^^} notation has been extended: after \type {^^^^} four
+ hexadecimal characters are expected and after \type {^^^^^^} six hexadecimal
+ characters have to be given. The original \TEX\ interpretation is still valid
+ for the \type {^^} case but the four and six variants do no backtracking,
+ i.e.\ when they are not followed by the right number of hexadecimal digits
+ they issue an error message. Because \type {^^^} is a normal \TEX\ case, we
+ don't support the odd number of \type {^^^^^} either.
+\stopitem
+
+\startitem
+ Glues {\it immediately after} direction change commands are not legal
+ breakpoints. There is a bit more sanity testing for the direction state.
+\stopitem
+
+\startitem
+ The placement of math formula numbers is direction aware and adapts
+ accordingly. Boxes carry directional information but rules don't.
+\stopitem
+
+\startitem
+ There are no direction related primitives for page and body directions. The
+ paragraph, text and math directions are specified using primitives that
+ take a number.
+\stopitem
+
+\stopitemize
+
+\stopsubsection
+
+\startsubsection[title=Changes from standard \WEBC]
+
+\topicindex {\WEBC}
+
+The \LUAMETATEX\ codebase is not dependent on the \WEBC\ framework. The
+interaction with the file system and \TDS\ is up to \LUA. There still might be
+traces but eventually the code base should be lean and mean. The \METAPOST\
+library is coded in \CWEB\ and in order to be independent from related tools,
+conversion to \CCODE\ is done with a \LUA\ script ran by, surprise, \LUAMETATEX.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title=Implementation notes]
+
+\startsubsection[title=Memory allocation]
+
+\topicindex {memory}
+
+The single internal memory heap that traditional \TEX\ used for tokens and nodes
+is split into two separate arrays. Each of these will grow dynamically when
+needed. Internally a token or node is an index into these arrays. This permits
+for an efficient implementation and is also responsible for the performance of
+the core. The original documentation in \TEX\ The Program mostly applies!
+
+\stopsubsection
+
+\startsubsection[title=Sparse arrays]
+
+The \prm {mathcode}, \prm {delcode}, \prm {catcode}, \prm {sfcode}, \prm {lccode}
+and \prm {uccode} (and the new \lpr {hjcode}) tables are now sparse arrays that
+are implemented in~\CCODE. They are no longer part of the \TEX\ \quote
+{equivalence table} and because each had 1.1 million entries with a few memory
+words each, this makes a major difference in memory usage. Performance is not
+really hurt by this.
+
+The \prm {catcode}, \prm {sfcode}, \prm {lccode}, \prm {uccode} and \lpr {hjcode}
+assignments don't show up when using the \ETEX\ tracing routines \prm
+{tracingassigns} and \prm {tracingrestores} but we don't see that as a real
+limitation. It also saves a lot of clutter.
+
+A side|-|effect of the current implementation is that \prm {global} is now more
+expensive in terms of processing than non|-|global assignments but not many users
+will notice that.
+
+The glyph ids within a font are also managed by means of a sparse array as glyph
+ids can go up to index $2^{21}-1$ but these are never accessed directly so again
+users will not notice this.
+
+\stopsubsection
+
+\startsubsection[title=Simple single|-|character csnames]
+
+\topicindex {csnames}
+
+Single|-|character commands are no longer treated specially in the internals,
+they are stored in the hash just like the multiletter csnames.
+
+The code that displays control sequences explicitly checks if the length is one
+when it has to decide whether or not to add a trailing space.
+
+Active characters are internally implemented as a special type of multi|-|letter
+control sequences that uses a prefix that is otherwise impossible to obtain.
+
+\stopsubsection
+
+\startsubsection[title=Binary file reading]
+
+\topicindex {files+binary}
+
+All of the internal code is changed in such a way that if one of the \type
+{read_xxx_file} callbacks is not set, then the file is read by a \CCODE\ function
+using basically the same convention as the callback: a single read into a buffer
+big enough to hold the entire file contents. While this uses more memory than the
+previous code (that mostly used \type {getc} calls), it can be quite a bit faster
+(depending on your \IO\ subsystem). So far we never had issues with this approach.
+
+\stopsubsection
+
+\startsubsection[title=Tabs and spaces]
+
+\topicindex {space}
+\topicindex {newline}
+
+We conform to the way other \TEX\ engines handle trailing tabs and spaces. For
+decades trailing tabs and spaces (before a newline) were removed from the input
+but this behaviour was changed in September 2017 to only handle spaces. We are
+aware that this can introduce compatibility issues in existing workflows but
+because we don't want too many differences with upstream \TEXLIVE\ we just follow
+up on that patch (which is a functional one and not really a fix). It is up to
+macro packages maintainers to deal with possible compatibility issues and in
+\LUAMETATEX\ they can do so via the callbacks that deal with reading from files.
+
+The previous behaviour was a known side effect and (as that kind of input
+normally comes from generated sources) it was normally dealt with by adding a
+comment token to the line in case the spaces and|/|or tabs were intentional and
+to be kept. We are aware of the fact that this contradicts some of our other
+choices but consistency with other engines. We still stick to our view that at
+the log level we can (and might be) more incompatible. We already expose some
+more details anyway.
+
+\stopsubsection
+
+\startsubsection[title=Logging]
+
+The information that goes into the log file can be different from \LUATEX, and
+might even differ a bit more in the future. The main reason is that inside the
+engine we have more granularity, which for instance means that we output subtype
+related information when nodes are printed. Of course we could have offered a
+compatibility mode but it serves no purpose. Over time there have been many
+subtle changes to control logs in the \TEX\ ecosystems so another one is
+bearable.
+
+In a similar fashion, there is a bit different behaviour when \TEX\ expects
+input, which in turn is a side effect of removing the interception of \type {*}
+and \type {&} which made for cleaner code (quite a bit had accumulated as side
+effect of continuous adaptations in the \TEX\ ecosystems). There was already code
+that was never executed, simply as side effect of the way \LUATEX\ initializes
+itself (one needs to enable classes of primitives for instance).
+
+\stopsubsection
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-nodes.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-nodes.tex
new file mode 100644
index 00000000000..16c6e1202ab
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-nodes.tex
@@ -0,0 +1,2527 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-nodes
+
+\startchapter[reference=nodes,title={Nodes}]
+
+\startsection[title={\LUA\ node representation}][library=node]
+
+\topicindex {nodes}
+
+\libindex {fields}
+\libindex {subtypes}
+\libindex {values}
+
+\TEX's nodes are represented in \LUA\ as userdata objects with a variable set of
+fields or by a numeric identifier when requested. When you print a node userdata
+object you will see these numbers. In the following syntax tables the type of
+such a userdata object is represented as \syntax {<node>}.
+
+\blank
+\dontleavehmode {\bf The return values of \type {node.types} are:} \showtypes
+\blank
+
+In \ETEX\ the \prm {lastnodetype} primitive has been introduced. With this
+primitive the valid range of numbers is still $[-1,15]$ and glyph nodes (formerly
+known as char nodes) have number~0. That way macro packages can use the same
+symbolic names as in traditional \ETEX. But you need to keep in mind that these
+\ETEX\ node numbers are different from the real internal ones. When you set \prm
+{internalcodesmode} to a non|-|zero value, the internal codes will be used in
+the \ETEX\ introspection commands \prm {lastnodetype} and \prm {currentiftype}.
+
+You can ask for a list of fields with \type {node.fields} and for valid subtypes
+with \type {node.subtypes}. The \type {node.values} function reports some used
+values. Valid arguments are \type {glue}, \type {style} and \type {math}. Keep in
+mind that the setters normally expect a number, but this helper gives you a list
+of what numbers matter. For practical reason the \type {pagestate} values are
+also reported with this helper, but they are backend specific.
+
+\def\ShowValues#1{
+ \blank
+ \dontleavehmode
+ {\bf The return values of \type {node.values("#1")} are:}
+ \showvalues{#1}
+ \blank
+}
+
+\ShowValues{glue} \ShowValues{style} \ShowValues{math} \ShowValues{pagestate}
+
+\stopsection
+
+\startsection[title={Main text nodes}]
+
+\topicindex {nodes+text}
+
+These are the nodes that comprise actual typesetting commands. A few fields are
+present in all nodes regardless of their type, these are:
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{next} \NC node \NC the next node in a list, or nil \NC \NR
+\NC \type{id} \NC number \NC the node's type (\type {id}) number \NC \NR
+\NC \type{subtype} \NC number \NC the node \type {subtype} identifier \NC \NR
+\LL
+\stoptabulate
+
+The \type {subtype} is sometimes just a dummy entry because not all nodes
+actually use the \type {subtype}, but this way you can be sure that all nodes
+accept it as a valid field name, and that is often handy in node list traversal.
+In the following tables \type {next} and \type {id} are not explicitly mentioned.
+
+Besides these three fields, almost all nodes also have an \type {attr} field, and
+there is a also a field called \type {prev}. That last field is always present,
+but only initialized on explicit request: when the function \type {node.slide}
+is called, it will set up the \type {prev} fields to be a backwards pointer in
+the argument node list. By now most of \TEX's node processing makes sure that the
+\type {prev} nodes are valid but there can be exceptions, especially when the
+internal magic uses a leading \nod {temp} nodes to temporarily store a state.
+
+The \LUAMETATEX\ engine provides a lot of freedom and it is up to the user to
+make sure that the node lists remain sane. There are some safeguards but there
+can be cases where the engine just quits out of frustration. And, of course you
+can make the engine crash.
+
+\startsubsection[title={\nod {hlist} and \nod {vlist} nodes}]
+
+\topicindex {nodes+lists}
+\topicindex {lists}
+
+These lists share fields and subtypes although some subtypes can only occur in
+horizontal lists while others are unique for vertical lists. The possible
+fields are \showfields {hlist}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{list} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC the width of the box \NC \NR
+\NC \type{height} \NC number \NC the height of the box \NC \NR
+\NC \type{depth} \NC number \NC the depth of the box \NC \NR
+\NC \type{direction} \NC number \NC the direction of this box, see~\in [dirnodes] \NC \NR
+\NC \type{shift} \NC number \NC a displacement perpendicular to the character
+ (hlist) or line (vlist) progression direction \NC \NR
+\NC \type{glue_order} \NC number \NC a number in the range $[0,4]$, indicating the
+ glue order \NC \NR
+\NC \type{glue_set} \NC number \NC the calculated glue ratio \NC \NR
+\NC \type{glue_sign} \NC number \NC 0 = \type {normal}, 1 = \type {stretching}, 2 =
+ \type {shrinking} \NC \NR
+\NC \type{list} \NC node \NC the first node of the body of this list \NC \NR
+\LL
+\stoptabulate
+
+The \type {orientation}, \type {woffset}, \type {hoffset}, \type {doffset},
+\type {xoffset} and \type {yoffset} fields are special. They can be used to make
+the backend rotate and shift boxes which can be handy in for instance vertical
+typesetting. Because they relate to (and depend on the) the backend they are not
+discussed here (yet).
+
+A warning: never assign a node list to the \type {list} field unless you are sure
+its internal link structure is correct, otherwise an error may result.
+
+Note: the field name \type {head} and \type {list} are both valid. Sometimes it
+makes more sense to refer to a list by \type {head}, sometimes \type {list} makes
+more sense.
+
+\stopsubsection
+
+\startsubsection[title={\nod {rule} nodes}]
+
+\topicindex {nodes+rules}
+\topicindex {rules}
+
+Contrary to traditional \TEX, \LUATEX\ has more \prm {rule} subtypes because we
+also use rules to store reuseable objects and images. User nodes are invisible
+and can be intercepted by a callback. The supported fields are \showfields {rule}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes {rule} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC the width of the rule where the special value
+ $-1073741824$ is used for \quote {running} glue dimensions \NC \NR
+\NC \type{height} \NC number \NC the height of the rule (can be negative) \NC \NR
+\NC \type{depth} \NC number \NC the depth of the rule (can be negative) \NC \NR
+\NC \type{left} \NC number \NC shift at the left end (also subtracted from width) \NC \NR
+\NC \type{right} \NC number \NC (subtracted from width) \NC \NR
+\NC \type{dir} \NC string \NC the direction of this rule, see~\in[dirnodes] \NC \NR
+\NC \type{index} \NC number \NC an optional index that can be referred to \NC \NR
+\NC \type{transform} \NC number \NC an private variable (also used to specify outline width) \NC \NR
+\LL
+\stoptabulate
+
+The \type {left} and type {right} keys are somewhat special (and experimental).
+When rules are auto adapting to the surrounding box width you can enforce a shift
+to the right by setting \type {left}. The value is also subtracted from the width
+which can be a value set by the engine itself and is not entirely under user
+control. The \type {right} is also subtracted from the width. It all happens in
+the backend so these are not affecting the calculations in the frontend (actually
+the auto settings also happen in the backend). For a vertical rule \type {left}
+affects the height and \type {right} affects the depth. There is no matching
+interface at the \TEX\ end (although we can have more keywords for rules it would
+complicate matters and introduce a speed penalty.) However, you can just
+construct a rule node with \LUA\ and write it to the \TEX\ input. The \type
+{outline} subtype is just a convenient variant and the \type {transform} field
+specifies the width of the outline.
+
+The \type {xoffset} and \type {yoffset} fields are special. They can be used to
+shift rules. Because they relate to (and depend on the) the backend they are not
+discussed here (yet).
+
+\stopsubsection
+
+\startsubsection[title={\nod {ins} nodes}]
+
+\topicindex {nodes+insertions}
+\topicindex {insertions}
+
+This node relates to the \prm {insert} primitive and support the fields: \showfields{ins}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC the insertion class \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{cost} \NC number \NC the penalty associated with this insert \NC \NR
+\NC \type{height} \NC number \NC height of the insert \NC \NR
+\NC \type{depth} \NC number \NC depth of the insert \NC \NR
+\NC \type{list} \NC node \NC the first node of the body of this insert \NC \NR
+\LL
+\stoptabulate
+
+There is a set of extra fields that concern the associated glue: \type {width},
+\type {stretch}, \type {stretch_order}, \type {shrink} and \type {shrink_order}.
+These are all numbers.
+
+A warning: never assign a node list to the \type {head} field unless you are sure
+its internal link structure is correct, otherwise an error may result. You can use
+\type {list} instead (often in functions you want to use local variable with similar
+names and both names are equally sensible).
+
+\stopsubsection
+
+\startsubsection[title={\nod {mark} nodes}]
+
+\topicindex {nodes+marks}
+\topicindex {marks}
+
+This one relates to the \prm {mark} primitive and only has a few fields:
+\showfields {mark}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC unused \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{class} \NC number \NC the mark class \NC \NR
+\NC \type{mark} \NC table \NC a table representing a token list \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\nod {adjust} nodes}]
+
+\topicindex {nodes+adjust}
+\topicindex {adjust}
+
+This node comes from \prm {vadjust} primitive and has fields: \showfields {adjust}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{adjust} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{list} \NC node \NC adjusted material \NC \NR
+\LL
+\stoptabulate
+
+A warning: never assign a node list to the \type {head} field unless you are sure
+its internal link structure is correct, otherwise an error may be the result.
+
+\stopsubsection
+
+\startsubsection[title={\nod {disc} nodes}]
+
+\topicindex {nodes+discretionaries}
+\topicindex {discretionaries}
+
+The \prm {discretionary} and \prm {-}, the \type {-} character but also the
+hyphenation mechanism produces these nodes. The available fields are: \showfields
+{disc}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{disc} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{pre} \NC node \NC pointer to the pre|-|break text \NC \NR
+\NC \type{post} \NC node \NC pointer to the post|-|break text \NC \NR
+\NC \type{replace} \NC node \NC pointer to the no|-|break text \NC \NR
+\NC \type{penalty} \NC number \NC the penalty associated with the break, normally
+ \prm {hyphenpenalty} or \prm {exhyphenpenalty} \NC \NR
+\LL
+\stoptabulate
+
+The subtype numbers~4 and~5 belong to the \quote {of-f-ice} explanation given
+elsewhere. These disc nodes are kind of special as at some point they also keep
+information about breakpoints and nested ligatures.
+
+The \type {pre}, \type {post} and \type {replace} fields at the \LUA\ end are in
+fact indirectly accessed and have a \type {prev} pointer that is not \type {nil}.
+This means that when you mess around with the head of these (three) lists, you
+also need to reassign them because that will restore the proper \type {prev}
+pointer, so:
+
+\starttyping
+pre = d.pre
+-- change the list starting with pre
+d.pre = pre
+\stoptyping
+
+Otherwise you can end up with an invalid internal perception of reality and
+\LUAMETATEX\ might even decide to crash on you. It also means that running forward
+over for instance \type {pre} is ok but backward you need to stop at \type {pre}.
+And you definitely must not mess with the node that \type {prev} points to, if
+only because it is not really a node but part of the disc data structure (so
+freeing it again might crash \LUAMETATEX).
+
+\stopsubsection
+
+\startsubsection[title={\nod {math} nodes}]
+
+\topicindex {nodes+math}
+\topicindex {math+nodes}
+
+Math nodes represent the boundaries of a math formula, normally wrapped into
+\type {$} signs. The following fields are available: \showfields {math}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{math} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{surround} \NC number \NC width of the \prm {mathsurround} kern \NC \NR
+\NC \type{width} \NC number \NC the horizontal or vertical displacement \NC \NR
+\NC \type{stretch} \NC number \NC extra (positive) displacement or stretch amount \NC \NR
+\NC \type{stretch_order} \NC number \NC factor applied to stretch amount \NC \NR
+\NC \type{shrink} \NC number \NC extra (negative) displacement or shrink amount\NC \NR
+\NC \type{shrink_order} \NC number \NC factor applied to shrink amount \NC \NR
+\LL
+\stoptabulate
+
+The glue fields only kick in when the \type {surround} fields is zero.
+
+\stopsubsection
+
+\startsubsection[title={\nod {glue} nodes}]
+
+\topicindex {nodes+glue}
+\topicindex {glue}
+
+Skips are about the only type of data objects in traditional \TEX\ that are not a
+simple value. They are inserted when \TEX\ sees a space in the text flow but also
+by \prm {hskip} and \prm {vskip}. The structure that represents the glue
+components of a skip internally is called a \nod {glue_spec}. In \LUAMETATEX\ we
+don't use the spec itself but just its values. A glue node has the fields:
+\showfields {glue}.
+
+\starttabulate[|l|l|pA{flushleft,tolerant}|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{glue} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{leader} \NC node \NC pointer to a box or rule for leaders \NC \NR
+\NC \type{width} \NC number \NC the horizontal or vertical displacement \NC \NR
+\NC \type{stretch} \NC number \NC extra (positive) displacement or stretch amount \NC \NR
+\NC \type{stretch_order} \NC number \NC factor applied to stretch amount \NC \NR
+\NC \type{shrink} \NC number \NC extra (negative) displacement or shrink amount\NC \NR
+\NC \type{shrink_order} \NC number \NC factor applied to shrink amount \NC \NR
+\LL
+\stoptabulate
+
+Note that we use the key \type {width} in both horizontal and vertical glue. This
+suits the \TEX\ internals well so we decided to stick to that naming.
+
+The effective width of some glue subtypes depends on the stretch or shrink needed
+to make the encapsulating box fit its dimensions. For instance, in a paragraph
+lines normally have glue representing spaces and these stretch or shrink to make
+the content fit in the available space. The \type {effective_glue} function that
+takes a glue node and a parent (hlist or vlist) returns the effective width of
+that glue item. When you pass \type {true} as third argument the value will be
+rounded.
+
+\stopsubsection
+
+\startsubsection[title={\nod {glue_spec} nodes}]
+
+\topicindex {nodes+glue}
+\topicindex {gluespec}
+
+Internally \LUAMETATEX\ (like its ancestors) also uses nodes to store data that
+is not seen in node lists. For instance the state of expression scanning (\type
+{\dimexpr} etc.) and conditionals (\type {\ifcase} etc.) is also kept in lists of
+nodes. A glue, which has five components, is stored in a node as well, so, where
+most registers store just a number, a skip register (of internal quantity) uses a
+pointer to a glue spec node. It has similar fields as glue nodes: \showfields
+{glue_spec}, which is not surprising because in the past (and other engines than
+\LUATEX) a glue node also has its values stored in a glue spec. This has some
+advantages because often the values are the same, so for instance spacing related
+skips were not resolved immediately but pointed to the current value of a space
+related internal register (like \type {\spaceskip}). But, in \LUATEX\ we do
+resolve these quantities immediately and we put the current values in the glue
+nodes.
+
+\starttabulate[|l|l|pA{flushleft,tolerant}|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{width} \NC number \NC the horizontal or vertical displacement \NC \NR
+\NC \type{stretch} \NC number \NC extra (positive) displacement or stretch amount \NC \NR
+\NC \type{stretch_order} \NC number \NC factor applied to stretch amount \NC \NR
+\NC \type{shrink} \NC number \NC extra (negative) displacement or shrink amount\NC \NR
+\NC \type{shrink_order} \NC number \NC factor applied to shrink amount \NC \NR
+\LL
+\stoptabulate
+
+You will only find these nodes in a few places, for instance when you query an
+internal quantity. In principle we could do without them as we have interfaces
+that use the five numbers instead. For compatibility reasons we keep glue spec
+nodes exposed but this might change in the future.
+
+\stopsubsection
+
+\startsubsection[title={\nod {kern} nodes}]
+
+\topicindex {nodes+kerns}
+\topicindex {kerns}
+
+The \prm {kern} command creates such nodes but for instance the font and math
+machinery can also add them. There are not that many fields: \showfields {kern}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{kern} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{kern} \NC number \NC fixed horizontal or vertical advance \NC \NR
+\NC \type{expansion_factor} \NC number \NC multiplier related to hz for font kerns \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\nod {penalty} nodes}]
+
+\topicindex {nodes+penalty}
+\topicindex {penalty}
+
+The \prm {penalty} command is one that generates these nodes. It is one of the
+type of nodes often found in vertical lists. It has the fields: \showfields
+{penalty}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{penalty} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{penalty} \NC number \NC the penalty value \NC \NR
+\LL
+\stoptabulate
+
+The subtypes are just informative and \TEX\ itself doesn't use them. When you
+run into an \type {linebreakpenalty} you need to keep in mind that it's a
+accumulation of \type {club}, \type{widow} and other relevant penalties.
+
+\stopsubsection
+
+\startsubsection[title={\nod {glyph} nodes},reference=glyphnodes]
+
+\topicindex {nodes+glyph}
+\topicindex {glyphs}
+
+These are probably the mostly used nodes and although you can push them in the
+current list with for instance \prm {char} \TEX\ will normally do it for you when
+it considers some input to be text. Glyph nodes are relatively large and have many
+fields: \showfields {glyph}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC bit field \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{char} \NC number \NC the character index in the font \NC \NR
+\NC \type{font} \NC number \NC the font identifier \NC \NR
+\NC \type{lang} \NC number \NC the language identifier \NC \NR
+\NC \type{left} \NC number \NC the frozen \type {\lefthyphenmnin} value \NC \NR
+\NC \type{right} \NC number \NC the frozen \type {\righthyphenmnin} value \NC \NR
+\NC \type{uchyph} \NC boolean \NC the frozen \prm {uchyph} value \NC \NR
+\NC \type{components} \NC node \NC pointer to ligature components \NC \NR
+\NC \type{xoffset} \NC number \NC a virtual displacement in horizontal direction \NC \NR
+\NC \type{yoffset} \NC number \NC a virtual displacement in vertical direction \NC \NR
+\NC \type{width} \NC number \NC the (original) width of the character \NC \NR
+\NC \type{height} \NC number \NC the (original) height of the character\NC \NR
+\NC \type{depth} \NC number \NC the (original) depth of the character\NC \NR
+\NC \type{expansion_factor} \NC number \NC the to be applied expansion_factor \NC \NR
+\NC \type{data} \NC number \NC a general purpose field for users (we had room for it) \NC \NR
+\LL
+\stoptabulate
+
+The \type {width}, \type {height} and \type {depth} values are read|-|only. The
+\type {expansion_factor} is assigned in the par builder and used in the backend.
+
+A warning: never assign a node list to the components field unless you are sure
+its internal link structure is correct, otherwise an error may be result. Valid
+bits for the \type {subtype} field are:
+
+\starttabulate[|c|l|]
+\DB bit \BC meaning \NC \NR
+\TB
+\NC 0 \NC character \NC \NR
+\NC 1 \NC ligature \NC \NR
+\NC 2 \NC ghost \NC \NR
+\NC 3 \NC left \NC \NR
+\NC 4 \NC right \NC \NR
+\LL
+\stoptabulate
+
+The \type {expansion_factor} has been introduced as part of the separation
+between front- and backend. It is the result of extensive experiments with a more
+efficient implementation of expansion. Early versions of \LUATEX\ already
+replaced multiple instances of fonts in the backend by scaling but contrary to
+\PDFTEX\ in \LUATEX\ we now also got rid of font copies in the frontend and
+replaced them by expansion factors that travel with glyph nodes. Apart from a
+cleaner approach this is also a step towards a better separation between front-
+and backend.
+
+The \type {is_char} function checks if a node is a glyph node with a subtype still
+less than 256. This function can be used to determine if applying font logic to a
+glyph node makes sense. The value \type {nil} gets returned when the node is not
+a glyph, a character number is returned if the node is still tagged as character
+and \type {false} gets returned otherwise. When nil is returned, the id is also
+returned. The \type {is_glyph} variant doesn't check for a subtype being less
+than 256, so it returns either the character value or nil plus the id. These
+helpers are not always faster than separate calls but they sometimes permit
+making more readable tests. The \type {uses_font} helpers takes a node
+and font id and returns true when a glyph or disc node references that font.
+
+\stopsubsection
+
+\startsubsection[title={\nod {boundary} nodes}]
+
+\topicindex {nodes+boundary}
+\topicindex {boundary}
+
+This node relates to the \prm {noboundary}, \prm {boundary}, \prm
+{protrusionboundary} and \prm {wordboundary} primitives. These are small
+nodes: \showfields {boundary} are the only fields.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{boundary} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{value} \NC number \NC values 0--255 are reserved \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\nod {local_par} nodes}]
+
+\topicindex {nodes+paragraphs}
+\topicindex {paragraphs}
+
+This node is inserted at the start of a paragraph. You should not mess
+too much with this one. Valid fields are: \showfields {local_par}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{pen_inter} \NC number \NC local interline penalty (from \lpr {localinterlinepenalty}) \NC \NR
+\NC \type{pen_broken} \NC number \NC local broken penalty (from \lpr {localbrokenpenalty}) \NC \NR
+\NC \type{dir} \NC string \NC the direction of this par. see~\in [dirnodes] \NC \NR
+\NC \type{box_left} \NC node \NC the \lpr {localleftbox} \NC \NR
+\NC \type{box_left_width} \NC number \NC width of the \lpr {localleftbox} \NC \NR
+\NC \type{box_right} \NC node \NC the \lpr {localrightbox} \NC \NR
+\NC \type{box_right_width} \NC number \NC width of the \lpr {localrightbox} \NC \NR
+\LL
+\stoptabulate
+
+A warning: never assign a node list to the \type {box_left} or \type {box_right}
+field unless you are sure its internal link structure is correct, otherwise an
+error may result.
+
+\stopsubsection
+
+\startsubsection[title={\nod {dir} nodes},reference=dirnodes]
+
+\topicindex {nodes+direction}
+\topicindex {directions}
+
+Direction nodes mark parts of the running text that need a change of direction
+and the \prm {textdir} command generates them. Again this is a small node, we
+just have \showfields {dir}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{dir} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{dir} \NC string \NC the direction (\type {0} = l2r, \type {1} = r2l) \NC \NR
+\NC \type{level} \NC number \NC nesting level of this direction \NC \NR
+\LL
+\stoptabulate
+
+There are only two directions: left|-|to|-|right (\type {0}) and
+right|-|to|-|left (\type {1}). This is different from \LUATEX\ that has four
+directions.
+
+\stopsubsection
+
+\startsubsection[title={\nod {marginkern} nodes}]
+
+\topicindex {nodes+paragraphs}
+\topicindex {paragraphs}
+\topicindex {protrusion}
+
+Margin kerns result from protrusion and have: \showfields {margin_kern}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{marginkern} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC the advance of the kern \NC \NR
+\NC \type{glyph} \NC node \NC the glyph to be used \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={Whatsits}]
+
+A whatsit node is a real simple one and it only has a subtype. It is even less
+than a user node (which it actually could be) and uses hardly any memory. What
+you do with it it entirely up to you: it's is real minimalistic. You can assign a
+subtype and it has attributes. It is all up to the user how they are handled.
+
+\stopsubsection
+
+\startsubsection[title={Math noads}]
+
+\topicindex {nodes+math}
+\topicindex {math+nodes}
+
+\startsubsubsection[title=The concept]
+
+These are the so||called \quote {noad}s and the nodes that are specifically
+associated with math processing. When you enter a formula, \TEX\ creates a node
+list with regular nodes and noads. Then it hands over the list the math
+processing engine. The result of that is a nodelist without noads. Most of the
+noads contain subnodes so that the list of possible fields is actually quite
+small. Math formulas are both a linked list and a tree. For instance in $e =
+mc^2$ there is a linked list \type {e = m c} but the \type {c} has a superscript
+branch that itself can be a list with branches.
+
+First, there are the objects (the \TEX book calls them \quote {atoms}) that are
+associated with the simple math objects: ord, op, bin, rel, open, close, punct,
+inner, over, under, vcenter. These all have the same fields, and they are combined
+into a single node type with separate subtypes for differentiation: \showfields
+{noad}.
+
+Many object fields in math mode are either simple characters in a specific family
+or math lists or node lists: \type {math_char}, \type {math_text_char}, {sub_box}
+and \type {sub_mlist} and \type {delim}. These are endpoints and therefore the
+\type {next} and \type {prev} fields of these these subnodes are unused.
+
+Some of the more elaborate noads have an option field. The values in this bitset
+are common:
+
+\starttabulate[|l|r|]
+\DB meaning \BC bits \NC \NR
+\TB
+\NC set \NC \type{0x08} \NC \NR
+\NC internal \NC \type{0x00} + \type{0x08} \NC \NR
+\NC internal \NC \type{0x01} + \type{0x08} \NC \NR
+\NC axis \NC \type{0x02} + \type{0x08} \NC \NR
+\NC no axis \NC \type{0x04} + \type{0x08} \NC \NR
+\NC exact \NC \type{0x10} + \type{0x08} \NC \NR
+\NC left \NC \type{0x11} + \type{0x08} \NC \NR
+\NC middle \NC \type{0x12} + \type{0x08} \NC \NR
+\NC right \NC \type{0x14} + \type{0x08} \NC \NR
+\NC no subscript \NC \type{0x21} + \type{0x08} \NC \NR
+\NC no superscript \NC \type{0x22} + \type{0x08} \NC \NR
+\NC no script \NC \type{0x23} + \type{0x08} \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsubsection
+
+\startsubsubsection[title={\nod {math_char} and \nod {math_text_char} subnodes}]
+
+These are the most common ones, as they represent characters, and they both have
+the same fields: \showfields {math_char}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{char} \NC number \NC the character index \NC \NR
+\NC \type{fam} \NC number \NC the family number \NC \NR
+\LL
+\stoptabulate
+
+The \nod {math_char} is the simplest subnode field, it contains the character and
+family for a single glyph object. The family eventually resolves on a reference
+to a font. The \nod {math_text_char} is a special case that you will not normally
+encounter, it arises temporarily during math list conversion (its sole function
+is to suppress a following italic correction).
+
+\stopsubsubsection
+
+\startsubsubsection[title={\nod {sub_box} and \nod {sub_mlist} subnodes}]
+
+These two subnode types are used for subsidiary list items. For \nod {sub_box},
+the \type {list} points to a \quote {normal} vbox or hbox. For \nod {sub_mlist},
+the \type {list} points to a math list that is yet to be converted. Their fields
+are: \showfields {sub_box}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{list} \NC node \NC list of nodes \NC \NR
+\LL
+\stoptabulate
+
+A warning: never assign a node list to the \type {list} field unless you are sure
+its internal link structure is correct, otherwise an error is triggered.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\nod {delim} subnodes}]
+
+There is a fifth subnode type that is used exclusively for delimiter fields. As
+before, the \type {next} and \type {prev} fields are unused, but we do have:
+\showfields {delim}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{small_char} \NC number \NC character index of base character \NC \NR
+\NC \type{small_fam} \NC number \NC family number of base character \NC \NR
+\NC \type{large_char} \NC number \NC character index of next larger character \NC \NR
+\NC \type{large_fam} \NC number \NC family number of next larger character \NC \NR
+\LL
+\stoptabulate
+
+The fields \type {large_char} and \type {large_fam} can be zero, in that case the
+font that is set for the \type {small_fam} is expected to provide the large
+version as an extension to the \type {small_char}.
+
+\stopsubsubsection
+
+\startsubsubsection[title={simple \nod {noad} nodes}]
+
+In these noads, the \type {nucleus}, \type {sub} and \type {sup} fields can
+branch of. Its fields are: \showfields {noad}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{noad} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{nucleus} \NC kernel node \NC base \NC \NR
+\NC \type{sub} \NC kernel node \NC subscript \NC \NR
+\NC \type{sup} \NC kernel node \NC superscript \NC \NR
+\NC \type{options} \NC number \NC bitset of rendering options \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsubsection
+
+\startsubsubsection[title={\nod {accent} nodes}]
+
+Accent nodes deal with stuff on top or below a math constructs. They support:
+\showfields {accent}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{accent} \NC \NR
+\NC \type{nucleus} \NC kernel node \NC base \NC \NR
+\NC \type{sub} \NC kernel node \NC subscript \NC \NR
+\NC \type{sup} \NC kernel node \NC superscript \NC \NR
+\NC \type{accent} \NC kernel node \NC top accent \NC \NR
+\NC \type{bot_accent} \NC kernel node \NC bottom accent \NC \NR
+\NC \type{fraction} \NC number \NC larger step criterium (divided by 1000) \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsubsection
+
+\startsubsubsection[title={\nod {style} nodes}]
+
+These nodes are signals to switch to another math style. They are quite simple:
+\showfields {style}. Currently the subtype is actually used to store the style
+but don't rely on that for the future. Fields are: \showfields {style}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{style} \NC string \NC contains the style \NC \NR
+\LL
+\stoptabulate
+
+Valid styles are: \showvalues{style}.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\nod {parameter} nodes}]
+
+These nodes are used to (locally) set math parameters: \showfields {parameter}.
+Fields are: \showfields {parameter}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{style} \NC string \NC contains the style \NC \NR
+\NC \type{name} \NC string \NC defines the parameter \NC \NR
+\NC \type{value} \NC number \NC holds the value, in case of a muglue multiple \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsubsection
+
+\startsubsubsection[title={\nod {choice} nodes}]
+
+Of its fields \showfields {choice} most are lists. Warning: never assign a node
+list unless you are sure its internal link structure is correct, otherwise an
+error can occur.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{display} \NC node \NC list of display size alternatives \NC \NR
+\NC \type{text} \NC node \NC list of text size alternatives \NC \NR
+\NC \type{script} \NC node \NC list of scriptsize alternatives \NC \NR
+\NC \type{scriptscript} \NC node \NC list of scriptscriptsize alternatives \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsubsection
+
+\startsubsubsection[title={\nod {radical} nodes}]
+
+Radical nodes are the most complex as they deal with scripts as well as
+constructed large symbols. Many fields: \showfields {radical}. Warning: never
+assign a node list to the \type {nucleus}, \type {sub}, \type {sup}, \type
+{left}, or \type {degree} field unless you are sure its internal link structure
+is correct, otherwise an error can be triggered.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{radical} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{nucleus} \NC kernel node \NC base \NC \NR
+\NC \type{sub} \NC kernel node \NC subscript \NC \NR
+\NC \type{sup} \NC kernel node \NC superscript \NC \NR
+\NC \type{left} \NC delimiter node \NC \NC \NR
+\NC \type{degree} \NC kernel node \NC only set by \lpr {Uroot} \NC \NR
+\NC \type{width} \NC number \NC required width \NC \NR
+\NC \type{options} \NC number \NC bitset of rendering options \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsubsection
+
+\startsubsubsection[title={\nod {fraction} nodes}]
+
+Fraction nodes are also used for delimited cases, hence the \type {left} and
+\type {right} fields among: \showfields {fraction}.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC (optional) width of the fraction \NC \NR
+\NC \type{num} \NC kernel node \NC numerator \NC \NR
+\NC \type{denom} \NC kernel node \NC denominator \NC \NR
+\NC \type{left} \NC delimiter node \NC left side symbol \NC \NR
+\NC \type{right} \NC delimiter node \NC right side symbol \NC \NR
+\NC \type{middle} \NC delimiter node \NC middle symbol \NC \NR
+\NC \type{options} \NC number \NC bitset of rendering options \NC \NR
+\LL
+\stoptabulate
+
+Warning: never assign a node list to the \type {num}, or \type {denom} field
+unless you are sure its internal link structure is correct, otherwise an error
+can result.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\nod {fence} nodes}]
+
+Fence nodes come in pairs but either one can be a dummy (this period driven empty
+fence). Fields are: \showfields {fence}. Some of these fields are used by the
+renderer and might get adapted in the process.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{fence} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{delim} \NC delimiter node \NC delimiter specification \NC \NR
+\NC \type{italic} \NC number \NC italic correction \NC \NR
+\NC \type{height} \NC number \NC required height \NC \NR
+\NC \type{depth} \NC number \NC required depth \NC \NR
+\NC \type{options} \NC number \NC bitset of rendering options \NC \NR
+\NC \type{class} \NC number \NC spacing related class \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsubsection
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={The \type {node} library}][library=node]
+
+\startsubsection[title={Introduction}]
+
+The \type {node} library provides methods that facilitate dealing with (lists of)
+nodes and their values. They allow you to create, alter, copy, delete, and insert
+node, the core objects within the typesetter. Nodes are represented in \LUA\ as
+userdata. The various parts within a node can be accessed using named fields.
+
+Each node has at least the three fields \type {next}, \type {id}, and \type
+{subtype}. The other available fields depend on the \type {id}.
+
+\startitemize[intro]
+
+\startitem
+ The \type {next} field returns the userdata object for the next node in a
+ linked list of nodes, or \type {nil}, if there is no next node.
+\stopitem
+
+\startitem
+ The \type {id} indicates \TEX's \quote{node type}. The field \type {id} has a
+ numeric value for efficiency reasons, but some of the library functions also
+ accept a string value instead of \type {id}.
+\stopitem
+
+\startitem
+ The \type {subtype} is another number. It often gives further information
+ about a node of a particular \type {id}.
+\stopitem
+
+\stopitemize
+
+% Support for \nod {unset} (alignment) nodes is partial: they can be queried and
+% modified from \LUA\ code, but not created.
+
+Nodes can be compared to each other, but: you are actually comparing indices into
+the node memory. This means that equality tests can only be trusted under very
+limited conditions. It will not work correctly in any situation where one of the
+two nodes has been freed and|/|or reallocated: in that case, there will be false
+positives. The general approach to a node related callback is as follows:
+
+\startitemize
+
+\startitem
+ Assume that the node list that you get is okay and properly double linked.
+ If for some reason the links are not right, you can apply \type {node.slide}
+ to the list.
+\stopitem
+
+\startitem
+ When you insert a node, make sure you use a previously removed one, a new one
+ or a copy. Don't simply inject the same node twice.
+\stopitem
+
+\startitem
+ When you remove a node, make sure that when this is permanent, you also free
+ the node or list. When you free a node its components are checked and when
+ they are nodes themselves they are also freed.
+\stopitem
+
+\startitem
+ Although you can fool the system, normally you will trigger an error when you
+ try to copy a nonexisting node, or free an already freed node. There is some
+ overhead involved in this checking but the current compromise is acceptable.
+\stopitem
+
+\startitem
+ When you're done, pass back (if needed) the result. It's your responsibility
+ to make sure that the list is properly linked (you can play safe and again
+ apply \type {node.slide}. In principle you can put nodes in a list that are
+ not acceptable in the following up actions. Some nodes get ignored, others
+ will trigger an error, and sometimes the engine will just crash.
+\stopitem
+
+\stopitemize
+
+So, from the above it will be clear then memory management of nodes has to be
+done explicitly by the user. Nodes are not \quote {seen} by the \LUA\ garbage
+collector, so you have to call the node freeing functions yourself when you are
+no longer in need of a node (list). Nodes form linked lists without reference
+counting, so you have to be careful that when control returns back to \LUATEX\
+itself, you have not deleted nodes that are still referenced from a \type {next}
+pointer elsewhere, and that you did not create nodes that are referenced more
+than once. Normally the setters and getters handle this for you.
+
+A good example are discretionary nodes that themselves have three sublists.
+Internally they use special pointers, but the user never sees them because when
+you query them or set fields, this property is hidden and taken care of. You just
+see a list. But, when you mess with these sub lists it is your responsibility
+that it only contains nodes that are permitted in a discretionary.
+
+There are statistics available with regards to the allocated node memory, which
+can be handy for tracing. Normally the amount of used nodes is not that large.
+Typesetting a page can involve thousands of them but most are freed when the page
+has been shipped out. Compared to other programs, node memory usage is not that
+excessive. So, if for some reason your application leaks nodes, if at the end of
+your run you lost as few hundred it's not a real problem. In fact, if you created
+boxes and made copies but not flushed them for good reason, your run will for
+sure end with used nodes and the statistics will mention that. The same is true
+for attributes and skips (glue spec nodes): keeping the current state involves
+using nodes.
+
+\stopsubsection
+
+\startsubsection[title={Housekeeping}]
+
+\startsubsubsection[title={\type {types}}]
+
+\libindex {types}
+
+This function returns an array that maps node id numbers to node type strings,
+providing an overview of the possible top|-|level \type {id} types.
+
+\startfunctioncall
+<table> t = node.types()
+\stopfunctioncall
+
+When we issue this command, we get a table. The currently visible types are
+\inlineluavalue { node.types() } where the numbers are the internal identifiers.
+Only those nodes are reported that make sense to users so there can be gaps in
+the range of numbers.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {id} and \type {type}}]
+
+\libindex{id}
+\libindex{type}
+
+This converts a single type name to its internal numeric representation.
+
+\startfunctioncall
+<number> id = node.id(<string> type)
+\stopfunctioncall
+
+The \type {node.id("glyph")} command returns the number \inlineluavalue { node.id
+("glyph") } and \type {node.id("hlist")} returns \inlineluavalue { node.id
+("hlist") } where the numbers don't relate to importance or some ordering; they
+just appear in the order that is handy for the engine. Commands like this are
+rather optimized so performance should be ok but you can of course always store
+the id in a \LUA\ number.
+
+The reverse operation is: \type {node.type} If the argument is a number, then the
+next function converts an internal numeric representation to an external string
+representation. Otherwise, it will return the string \type {node} if the object
+represents a node, and \type {nil} otherwise.
+
+\startfunctioncall
+<string> type = node.type(<any> n)
+\stopfunctioncall
+
+The \type {node.type(4)} command returns the string \inlineluavalue { node.type
+(4) } and \type {node.id(99)} returns \inlineluavalue { node.id (99) } because
+there is no node with that id.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {fields} and \type {has_field}}]
+
+\libindex {fields}
+\libindex {has_field}
+
+This function returns an indexed table with valid field names for a particular
+type of node.
+
+\startfunctioncall
+<table> t = node.fields(<number|string> id)
+\stopfunctioncall
+
+The function accepts a string or number, so \typ {node.fields ("glyph")} returns
+\inlineluavalue { node.fields ("glyph") } and \typ {node.fields (12)} gives
+\inlineluavalue { node.fields (12) }.
+
+The \type {has_field} function returns a boolean that is only true if \type {n}
+is actually a node, and it has the field.
+
+\startfunctioncall
+<boolean> t = node.has_field(<node> n, <string> field)
+\stopfunctioncall
+
+This function probably is not that useful but some nodes don't have a \type
+{subtype}, \type {attr} or \type {prev} field and this is a way to test for that.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {is_node}}]
+
+\topicindex {nodes+functions}
+
+\libindex {is_node}
+
+\startfunctioncall
+<boolean|integer> t = node.is_node(<any> item)
+\stopfunctioncall
+
+This function returns a number (the internal index of the node) if the argument
+is a userdata object of type \type {<node>} and false when no node is passed.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {new}}]
+
+\libindex{new}
+
+The \type {new} function creates a new node. All its fields are initialized to
+either zero or \type {nil} except for \type {id} and \type {subtype}. Instead of
+numbers you can also use strings (names). If you pass a second argument the
+subtype will be set too.
+
+\startfunctioncall
+<node> n = node.new(<number|string> id)
+<node> n = node.new(<number|string> id, <number|string> subtype)
+\stopfunctioncall
+
+As already has been mentioned, you are responsible for making sure that nodes
+created this way are used only once, and are freed when you don't pass them
+back somehow.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {free}, \type {flush_node} and \type {flush_list}}]
+
+\libindex{free}
+\libindex{flush_node}
+\libindex{flush_list}
+
+The next one frees node \type {n} from \TEX's memory. Be careful: no checks are
+done on whether this node is still pointed to from a register or some \type
+{next} field: it is up to you to make sure that the internal data structures
+remain correct. Fields that point to nodes or lists are flushed too. So, when
+you used their content for something else you need to set them to nil first.
+
+\startfunctioncall
+<node> next = node.free(<node> n)
+flush_node(<node> n)
+\stopfunctioncall
+
+The \type {free} function returns the next field of the freed node, while the
+\type {flush_node} alternative returns nothing.
+
+A list starting with node \type {n} can be flushed from \TEX's memory too. Be
+careful: no checks are done on whether any of these nodes is still pointed to
+from a register or some \type {next} field: it is up to you to make sure that the
+internal data structures remain correct.
+
+\startfunctioncall
+node.flush_list(<node> n)
+\stopfunctioncall
+
+When you free for instance a discretionary node, \type {flush_list} is applied to
+the \type {pre}, \type {post}, \type {replace} so you don't need to do that
+yourself. Assigning them \type {nil} won't free those lists!
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {copy} and \type {copy_list}}]
+
+\libindex{copy}
+\libindex{copy_list}
+
+This creates a deep copy of node \type {n}, including all nested lists as in the case
+of a hlist or vlist node. Only the \type {next} field is not copied.
+
+\startfunctioncall
+<node> m = node.copy(<node> n)
+\stopfunctioncall
+
+A deep copy of the node list that starts at \type {n} can be created too. If
+\type {m} is also given, the copy stops just before node \type {m}.
+
+\startfunctioncall
+<node> m = node.copy_list(<node> n)
+<node> m = node.copy_list(<node> n, <node> m)
+\stopfunctioncall
+
+Note that you cannot copy attribute lists this way. However, there is normally no
+need to copy attribute lists as when you do assignments to the \type {attr} field
+or make changes to specific attributes, the needed copying and freeing takes
+place automatically. When you change a value of an attribute {\em in} a list, it will
+affect all the nodes that share that list.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {write}}]
+
+\libindex {write}
+
+\startfunctioncall
+node.write(<node> n)
+\stopfunctioncall
+
+This function will append a node list to \TEX's \quote {current list}. The node
+list is not deep|-|copied! There is no error checking either! You might need to
+enforce horizontal mode in order for this to work as expected.
+
+\stopsubsubsection
+
+\stopsubsection
+
+\startsubsection[title={Manipulating lists}]
+
+\startsubsubsection[title={\type {slide}}]
+
+\libindex {slide}
+
+This helper makes sure that the node list is double linked and returns the found
+tail node.
+
+\startfunctioncall
+<node> tail = node.slide(<node> n)
+\stopfunctioncall
+
+After some callbacks automatic sliding takes place. This feature can be turned
+off with \type {node.fix_node_lists(false)} but you better make sure then that
+you don't mess up lists. In most cases \TEX\ itself only uses \type {next}
+pointers but your other callbacks might expect proper \type {prev} pointers too.
+Future versions of \LUATEX\ can add more checking but this will not influence
+usage.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {tail}}]
+
+\libindex {tail}
+
+\startfunctioncall
+<node> m = node.tail(<node> n)
+\stopfunctioncall
+
+Returns the last node of the node list that starts at \type {n}.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {length} and \type {count}}]
+
+\libindex {length}
+\libindex {count}
+
+\startfunctioncall
+<number> i = node.length(<node> n)
+<number> i = node.length(<node> n, <node> m)
+\stopfunctioncall
+
+Returns the number of nodes contained in the node list that starts at \type {n}.
+If \type {m} is also supplied it stops at \type {m} instead of at the end of the
+list. The node \type {m} is not counted.
+
+\startfunctioncall
+<number> i = node.count(<number> id, <node> n)
+<number> i = node.count(<number> id, <node> n, <node> m)
+\stopfunctioncall
+
+Returns the number of nodes contained in the node list that starts at \type {n}
+that have a matching \type {id} field. If \type {m} is also supplied, counting
+stops at \type {m} instead of at the end of the list. The node \type {m} is not
+counted. This function also accept string \type {id}'s.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {remove}}]
+
+\libindex {remove}
+
+\startfunctioncall
+<node> head, current, removed =
+ node.remove(<node> head, <node> current)
+<node> head, current =
+ node.remove(<node> head, <node> current, <boolean> true)
+\stopfunctioncall
+
+This function removes the node \type {current} from the list following \type
+{head}. It is your responsibility to make sure it is really part of that list.
+The return values are the new \type {head} and \type {current} nodes. The
+returned \type {current} is the node following the \type {current} in the calling
+argument, and is only passed back as a convenience (or \type {nil}, if there is
+no such node). The returned \type {head} is more important, because if the
+function is called with \type {current} equal to \type {head}, it will be
+changed. When the third argument is passed, the node is freed.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {insert_before}}]
+
+\libindex {insert_before}
+
+\startfunctioncall
+<node> head, new = node.insert_before(<node> head, <node> current, <node> new)
+\stopfunctioncall
+
+This function inserts the node \type {new} before \type {current} into the list
+following \type {head}. It is your responsibility to make sure that \type
+{current} is really part of that list. The return values are the (potentially
+mutated) \type {head} and the node \type {new}, set up to be part of the list
+(with correct \type {next} field). If \type {head} is initially \type {nil}, it
+will become \type {new}.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {insert_after}}]
+
+\libindex {insert_after}
+
+\startfunctioncall
+<node> head, new = node.insert_after(<node> head, <node> current, <node> new)
+\stopfunctioncall
+
+This function inserts the node \type {new} after \type {current} into the list
+following \type {head}. It is your responsibility to make sure that \type
+{current} is really part of that list. The return values are the \type {head} and
+the node \type {new}, set up to be part of the list (with correct \type {next}
+field). If \type {head} is initially \type {nil}, it will become \type {new}.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {last_node}}]
+
+\libindex {last_node}
+
+\startfunctioncall
+<node> n = node.last_node()
+\stopfunctioncall
+
+This function pops the last node from \TEX's \quote{current list}. It returns
+that node, or \type {nil} if the current list is empty.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {traverse}}]
+
+\libindex {traverse}
+
+\startfunctioncall
+<node> t, id, subtype = node.traverse(<node> n)
+\stopfunctioncall
+
+This is a \LUA\ iterator that loops over the node list that starts at \type {n}.
+Typically code looks like this:
+
+\starttyping
+for n in node.traverse(head) do
+ ...
+end
+\stoptyping
+
+is functionally equivalent to:
+
+\starttyping
+do
+ local n
+ local function f (head,var)
+ local t
+ if var == nil then
+ t = head
+ else
+ t = var.next
+ end
+ return t
+ end
+ while true do
+ n = f (head, n)
+ if n == nil then break end
+ ...
+ end
+end
+\stoptyping
+
+It should be clear from the definition of the function \type {f} that even though
+it is possible to add or remove nodes from the node list while traversing, you
+have to take great care to make sure all the \type {next} (and \type {prev})
+pointers remain valid.
+
+If the above is unclear to you, see the section \quote {For Statement} in the
+\LUA\ Reference Manual.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {traverse_id}}]
+
+\libindex {traverse_id}
+
+\startfunctioncall
+<node> t, subtype = node.traverse_id(<number> id, <node> n)
+\stopfunctioncall
+
+This is an iterator that loops over all the nodes in the list that starts at
+\type {n} that have a matching \type {id} field.
+
+See the previous section for details. The change is in the local function \type
+{f}, which now does an extra while loop checking against the upvalue \type {id}:
+
+\starttyping
+ local function f(head,var)
+ local t
+ if var == nil then
+ t = head
+ else
+ t = var.next
+ end
+ while not t.id == id do
+ t = t.next
+ end
+ return t
+ end
+\stoptyping
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {traverse_char} and \type {traverse_glyph}}]
+
+\libindex {traverse_char}
+\libindex {traverse_glyph}
+
+The \type{traverse_char} iterator loops over the \nod {glyph} nodes in a list.
+Only nodes with a subtype less than 256 are seen.
+
+\startfunctioncall
+<node> n, font, char = node.traverse_char(<node> n)
+\stopfunctioncall
+
+The \type{traverse_glyph} iterator loops over a list and returns the list and
+filters all glyphs:
+
+\startfunctioncall
+<node> n, font, char = node.traverse_glyph(<node> n)
+\stopfunctioncall
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {traverse_list}}]
+
+\libindex {traverse_list}
+
+This iterator loops over the \nod {hlist} and \nod {vlist} nodes in a list.
+
+\startfunctioncall
+<node> n, id, subtype, list = node.traverse_list(<node> n)
+\stopfunctioncall
+
+The four return values can save some time compared to fetching these fields but
+in practice you seldom need them all. So consider it a (side effect of
+experimental) convenience.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {find_node}}]
+
+\libindex {find_node}
+
+This helper returns the location of the first match at or after node \type {n}:
+
+\startfunctioncall
+<node> n = node.find_node(<node> n, <integer> subtype)
+<node> n, subtype = node.find_node(<node> n)
+\stopfunctioncall
+
+\stopsubsubsection
+
+
+\stopsubsection
+
+\startsubsection[title={Glue handling}][library=node]
+
+\startsubsubsection[title={\type {setglue}}]
+
+\libindex {setglue}
+
+You can set the properties of a glue in one go. If you pass no values, the glue
+will become a zero glue.
+
+\startfunctioncall
+node.setglue(<node> n)
+node.setglue(<node> n,width,stretch,shrink,stretch_order,shrink_order)
+\stopfunctioncall
+
+When you pass values, only arguments that are numbers are assigned so
+
+\starttyping
+node.setglue(n,655360,false,65536)
+\stoptyping
+
+will only adapt the width and shrink.
+
+When a list node is passed, you set the glue, order and sign instead.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {getglue}}]
+
+\libindex {getglue}
+
+The next call will return 5 values or nothing when no glue is passed.
+
+\startfunctioncall
+<integer> width, <integer> stretch, <integer> shrink, <integer> stretch_order,
+ <integer> shrink_order = node.getglue(<node> n)
+\stopfunctioncall
+
+When the second argument is false, only the width is returned (this is consistent
+with \type {tex.get}).
+
+When a list node is passed, you get back the glue that is set, the order of that
+glue and the sign.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {is_zero_glue}}]
+
+\libindex {is_zero_glue}
+
+This function returns \type {true} when the width, stretch and shrink properties
+are zero.
+
+\startfunctioncall
+<boolean> isglue = node.is_zero_glue(<node> n)
+\stopfunctioncall
+
+\stopsubsubsection
+
+\stopsubsection
+
+\startsubsection[title={Attribute handling}][library=node]
+
+\startsubsubsection[title={Attributes}]
+
+\topicindex {attributes}
+
+Assignments to attributes registers result in assigning lists with set attributes
+to nodes and the implementation is non|-|trivial because the value that is
+attached to a node is essentially a (sorted) sparse array of key|-|value pairs.
+It is generally easiest to deal with attribute lists and attributes by using the
+dedicated functions in the \type {node} library.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\nod {attribute_list} nodes}]
+
+\topicindex {nodes+attributes}
+
+An \type {attribute_list} item is used as a head pointer for a list of attribute
+items. It has only one user|-|visible field:
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{next} \NC node \NC pointer to the first attribute \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsubsection
+
+\startsubsubsection[title={\nod {attr} nodes}]
+
+A normal node's attribute field will point to an item of type \nod
+{attribute_list}, and the \type {next} field in that item will point to the first
+defined \quote {attribute} item, whose \type {next} will point to the second
+\quote {attribute} item, etc.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{next} \NC node \NC pointer to the next attribute \NC \NR
+\NC \type{number} \NC number \NC the attribute type id \NC \NR
+\NC \type{value} \NC number \NC the attribute value \NC \NR
+\LL
+\stoptabulate
+
+As mentioned it's better to use the official helpers rather than edit these
+fields directly. For instance the \type {prev} field is used for other purposes
+and there is no double linked list.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {current_attr}}]
+
+\libindex{current_attr}
+
+This returns the currently active list of attributes, if there is one.
+
+\startfunctioncall
+<node> m = node.current_attr()
+\stopfunctioncall
+
+The intended usage of \type {current_attr} is as follows:
+
+\starttyping
+local x1 = node.new("glyph")
+x1.attr = node.current_attr()
+local x2 = node.new("glyph")
+x2.attr = node.current_attr()
+\stoptyping
+
+or:
+
+\starttyping
+local x1 = node.new("glyph")
+local x2 = node.new("glyph")
+local ca = node.current_attr()
+x1.attr = ca
+x2.attr = ca
+\stoptyping
+
+The attribute lists are ref counted and the assignment takes care of incrementing
+the refcount. You cannot expect the value \type {ca} to be valid any more when
+you assign attributes (using \type {tex.setattribute}) or when control has been
+passed back to \TEX.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {has_attribute}}]
+
+\libindex {has_attribute}
+
+\startfunctioncall
+<number> v = node.has_attribute(<node> n, <number> id)
+<number> v = node.has_attribute(<node> n, <number> id, <number> val)
+\stopfunctioncall
+
+Tests if a node has the attribute with number \type {id} set. If \type {val} is
+also supplied, also tests if the value matches \type {val}. It returns the value,
+or, if no match is found, \type {nil}.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {get_attribute}}]
+
+\libindex {get_attribute}
+
+\startfunctioncall
+<number> v = node.get_attribute(<node> n, <number> id)
+\stopfunctioncall
+
+Tests if a node has an attribute with number \type {id} set. It returns the
+value, or, if no match is found, \type {nil}. If no \type {id} is given then the
+zero attributes is assumed.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {find_attribute}}]
+
+\libindex {find_attribute}
+
+\startfunctioncall
+<number> v, <node> n = node.find_attribute(<node> n, <number> id)
+\stopfunctioncall
+
+Finds the first node that has attribute with number \type {id} set. It returns
+the value and the node if there is a match and otherwise nothing.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {set_attribute}}]
+
+\libindex {set_attribute}
+
+\startfunctioncall
+node.set_attribute(<node> n, <number> id, <number> val)
+\stopfunctioncall
+
+Sets the attribute with number \type {id} to the value \type {val}. Duplicate
+assignments are ignored.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {unset_attribute}}]
+
+\libindex {unset_attribute}
+
+\startfunctioncall
+<number> v =
+ node.unset_attribute(<node> n, <number> id)
+<number> v =
+ node.unset_attribute(<node> n, <number> id, <number> val)
+\stopfunctioncall
+
+Unsets the attribute with number \type {id}. If \type {val} is also supplied, it
+will only perform this operation if the value matches \type {val}. Missing
+attributes or attribute|-|value pairs are ignored.
+
+If the attribute was actually deleted, returns its old value. Otherwise, returns
+\type {nil}.
+
+\stopsubsubsection
+
+\stopsubsection
+
+\startsubsection[title={Glyph handling}][library=node]
+
+\startsubsubsection[title={\type {first_glyph}}]
+
+\libindex {first_glyph}
+
+\startfunctioncall
+<node> n = node.first_glyph(<node> n)
+<node> n = node.first_glyph(<node> n, <node> m)
+\stopfunctioncall
+
+Returns the first node in the list starting at \type {n} that is a glyph node
+with a subtype indicating it is a glyph, or \type {nil}. If \type {m} is given,
+processing stops at (but including) that node, otherwise processing stops at the
+end of the list.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {is_char} and \type {is_glyph}}]
+
+\libindex {is_char}
+\libindex {is_glyph}
+
+The subtype of a glyph node signals if the glyph is already turned into a character reference
+or not.
+
+\startfunctioncall
+<boolean> b = node.is_char(<node> n)
+<boolean> b = node.is_glyph(<node> n)
+\stopfunctioncall
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {has_glyph}}]
+
+\libindex {has_glyph}
+
+This function returns the first glyph or disc node in the given list:
+
+\startfunctioncall
+<node> n = node.has_glyph(<node> n)
+\stopfunctioncall
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {ligaturing}}]
+
+\libindex {ligaturing}
+
+\startfunctioncall
+<node> h, <node> t, <boolean> success = node.ligaturing(<node> n)
+<node> h, <node> t, <boolean> success = node.ligaturing(<node> n, <node> m)
+\stopfunctioncall
+
+Apply \TEX-style ligaturing to the specified nodelist. The tail node \type {m} is
+optional. The two returned nodes \type {h} and \type {t} are the new head and
+tail (both \type {n} and \type {m} can change into a new ligature).
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {kerning}}]
+
+\libindex {kerning}
+
+\startfunctioncall
+<node> h, <node> t, <boolean> success = node.kerning(<node> n)
+<node> h, <node> t, <boolean> success = node.kerning(<node> n, <node> m)
+\stopfunctioncall
+
+Apply \TEX|-|style kerning to the specified node list. The tail node \type {m} is
+optional. The two returned nodes \type {h} and \type {t} are the head and tail
+(either one of these can be an inserted kern node, because special kernings with
+word boundaries are possible).
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {unprotect_glyph[s]}}]
+
+\libindex {unprotect_glyphs}
+\libindex {unprotect_glyph}
+
+\startfunctioncall
+node.unprotect_glyph(<node> n)
+node.unprotect_glyphs(<node> n,[<node> n])
+\stopfunctioncall
+
+Subtracts 256 from all glyph node subtypes. This and the next function are
+helpers to convert from \type {characters} to \type {glyphs} during node
+processing. The second argument is optional and indicates the end of a range.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {protect_glyph[s]}}]
+
+\libindex {protect_glyphs}
+\libindex {protect_glyph}
+
+\startfunctioncall
+node.protect_glyph(<node> n)
+node.protect_glyphs(<node> n,[<node> n])
+\stopfunctioncall
+
+Adds 256 to all glyph node subtypes in the node list starting at \type {n},
+except that if the value is 1, it adds only 255. The special handling of 1 means
+that \type {characters} will become \type {glyphs} after subtraction of 256. A
+single character can be marked by the singular call. The second argument is
+optional and indicates the end of a range.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {protrusion_skippable}}]
+
+\libindex {protrusion_skippable}
+
+\startfunctioncall
+<boolean> skippable = node.protrusion_skippable(<node> n)
+\stopfunctioncall
+
+Returns \type {true} if, for the purpose of line boundary discovery when
+character protrusion is active, this node can be skipped.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {check_discretionary}, \type {check_discretionaries}}]
+
+\libindex{check_discretionary}
+\libindex{check_discretionaries}
+
+When you fool around with disc nodes you need to be aware of the fact that they
+have a special internal data structure. As long as you reassign the fields when
+you have extended the lists it's ok because then the tail pointers get updated,
+but when you add to list without reassigning you might end up in trouble when
+the linebreak routine kicks in. You can call this function to check the list for
+issues with disc nodes.
+
+\startfunctioncall
+node.check_discretionary(<node> n)
+node.check_discretionaries(<node> head)
+\stopfunctioncall
+
+The plural variant runs over all disc nodes in a list, the singular variant
+checks one node only (it also checks if the node is a disc node).
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {flatten_discretionaries}}]
+
+\libindex {flatten_discretionaries}
+
+This function will remove the discretionaries in the list and inject the replace
+field when set.
+
+\startfunctioncall
+<node> head, count = node.flatten_discretionaries(<node> n)
+\stopfunctioncall
+
+\stopsubsubsection
+
+\stopsubsection
+
+\startsubsection[title={Packaging}][library=node]
+
+\startsubsubsection[title={\type {hpack}}]
+
+\libindex {hpack}
+
+This function creates a new hlist by packaging the list that begins at node \type
+{n} into a horizontal box. With only a single argument, this box is created using
+the natural width of its components. In the three argument form, \type {info}
+must be either \type {additional} or \type {exactly}, and \type {w} is the
+additional (\type {\hbox spread}) or exact (\type {\hbox to}) width to be used.
+The second return value is the badness of the generated box.
+
+\startfunctioncall
+<node> h, <number> b =
+ node.hpack(<node> n)
+<node> h, <number> b =
+ node.hpack(<node> n, <number> w, <string> info)
+<node> h, <number> b =
+ node.hpack(<node> n, <number> w, <string> info, <string> dir)
+\stopfunctioncall
+
+Caveat: there can be unexpected side|-|effects to this function, like updating
+some of the \prm {marks} and \type {\inserts}. Also note that the content of
+\type {h} is the original node list \type {n}: if you call \type {node.free(h)}
+you will also free the node list itself, unless you explicitly set the \type
+{list} field to \type {nil} beforehand. And in a similar way, calling \type
+{node.free(n)} will invalidate \type {h} as well!
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {vpack}}]
+
+\libindex {vpack}
+
+This function creates a new vlist by packaging the list that begins at node \type
+{n} into a vertical box. With only a single argument, this box is created using
+the natural height of its components. In the three argument form, \type {info}
+must be either \type {additional} or \type {exactly}, and \type {w} is the
+additional (\type {\vbox spread}) or exact (\type {\vbox to}) height to be used.
+
+\startfunctioncall
+<node> h, <number> b =
+ node.vpack(<node> n)
+<node> h, <number> b =
+ node.vpack(<node> n, <number> w, <string> info)
+<node> h, <number> b =
+ node.vpack(<node> n, <number> w, <string> info, <string> dir)
+\stopfunctioncall
+
+The second return value is the badness of the generated box. See the description
+of \type {hpack} for a few memory allocation caveats.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {prepend_prevdepth}}]
+
+\libindex {prepend_prevdepth}
+
+This function is somewhat special in the sense that it is an experimental helper
+that adds the interlinespace to a line keeping the baselineskip and lineskip into
+account.
+
+\startfunctioncall
+<node> n, <number> delta =
+ node.prepend_prevdepth(<node> n,<number> prevdepth)
+\stopfunctioncall
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {dimensions}, \type {rangedimensions}, \type {naturalwidth}}]
+
+\libindex{dimensions}
+\libindex{rangedimensions}
+
+\startfunctioncall
+<number> w, <number> h, <number> d =
+ node.dimensions(<node> n)
+<number> w, <number> h, <number> d =
+ node.dimensions(<node> n, <node> t)
+\stopfunctioncall
+
+This function calculates the natural in|-|line dimensions of the node list starting
+at node \type {n} and terminating just before node \type {t} (or the end of the
+list, if there is no second argument). The return values are scaled points. An
+alternative format that starts with glue parameters as the first three arguments
+is also possible:
+
+\startfunctioncall
+<number> w, <number> h, <number> d =
+ node.dimensions(<number> glue_set, <number> glue_sign, <number> glue_order,
+ <node> n)
+<number> w, <number> h, <number> d =
+ node.dimensions(<number> glue_set, <number> glue_sign, <number> glue_order,
+ <node> n, <node> t)
+\stopfunctioncall
+
+This calling method takes glue settings into account and is especially useful for
+finding the actual width of a sublist of nodes that are already boxed, for
+example in code like this, which prints the width of the space in between the
+\type {a} and \type {b} as it would be if \type {\box0} was used as-is:
+
+\starttyping
+\setbox0 = \hbox to 20pt {a b}
+
+\directlua{print (node.dimensions(
+ tex.box[0].glue_set,
+ tex.box[0].glue_sign,
+ tex.box[0].glue_order,
+ tex.box[0].head.next,
+ node.tail(tex.box[0].head)
+)) }
+\stoptyping
+
+You need to keep in mind that this is one of the few places in \TEX\ where floats
+are used, which means that you can get small differences in rounding when you
+compare the width reported by \type {hpack} with \type {dimensions}.
+
+The second alternative saves a few lookups and can be more convenient in some
+cases:
+
+\startfunctioncall
+<number> w, <number> h, <number> d =
+ node.rangedimensions(<node> parent, <node> first)
+<number> w, <number> h, <number> d =
+ node.rangedimensions(<node> parent, <node> first, <node> last)
+\stopfunctioncall
+
+A simple and somewhat more efficient variant is this:
+
+\startfunctioncall
+<number> w =
+ node.naturalwidth(<node> start, <node> stop)
+\stopfunctioncall
+
+\stopsubsubsection
+
+\stopsubsection
+
+\startsubsection[title={Math}][library=node]
+
+\startsubsubsection[title={\type {mlist_to_hlist}}]
+
+\libindex {mlist_to_hlist}
+
+\startfunctioncall
+<node> h =
+ node.mlist_to_hlist(<node> n, <string> display_type, <boolean> penalties)
+\stopfunctioncall
+
+This runs the internal mlist to hlist conversion, converting the math list in
+\type {n} into the horizontal list \type {h}. The interface is exactly the same
+as for the callback \cbk {mlist_to_hlist}.
+
+\stopsubsubsection
+
+\startsubsubsection[title={\type {end_of_math}}]
+
+\libindex {end_of_math}
+
+\startfunctioncall
+<node> t = node.end_of_math(<node> start)
+\stopfunctioncall
+
+Looks for and returns the next \type {math_node} following the \type {start}. If
+the given node is a math end node this helper returns that node, else it follows
+the list and returns the next math endnote. If no such node is found nil is
+returned.
+
+\stopsubsubsection
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Two access models}][library=node]
+
+\topicindex{nodes+direct}
+\topicindex{direct nodes}
+
+\libindex {todirect}
+\libindex {tonode}
+\libindex {tostring}
+
+Deep down in \TEX\ a node has a number which is a numeric entry in a memory
+table. In fact, this model, where \TEX\ manages memory is real fast and one of
+the reasons why plugging in callbacks that operate on nodes is quite fast too.
+Each node gets a number that is in fact an index in the memory table and that
+number often is reported when you print node related information. You go from
+userdata nodes and there numeric references and back with:
+
+\startfunctioncall
+<integer> d = node.todirect(<node> n))
+<node> n = node.tonode(<integer> d))
+\stopfunctioncall
+
+The userdata model is rather robust as it is a virtual interface with some
+additional checking while the more direct access which uses the node numbers
+directly. However, even with userdata you can get into troubles when you free
+nodes that are no longer allocated or mess up lists. if you apply \type
+{tostring} to a node you see its internal (direct) number and id.
+
+The first model provides key based access while the second always accesses fields
+via functions:
+
+\starttyping
+nodeobject.char
+getfield(nodenumber,"char")
+\stoptyping
+
+If you use the direct model, even if you know that you deal with numbers, you
+should not depend on that property but treat it as an abstraction just like
+traditional nodes. In fact, the fact that we use a simple basic datatype has the
+penalty that less checking can be done, but less checking is also the reason why
+it's somewhat faster. An important aspect is that one cannot mix both methods,
+but you can cast both models. So, multiplying a node number makes no sense.
+
+So our advice is: use the indexed (table) approach when possible and investigate
+the direct one when speed might be a real issue. For that reason \LUATEX\ also
+provide the \type {get*} and \type {set*} functions in the top level node
+namespace. There is a limited set of getters. When implementing this direct
+approach the regular index by key variant was also optimized, so direct access
+only makes sense when nodes are accessed millions of times (which happens in some
+font processing for instance).
+
+We're talking mostly of getters because setters are less important. Documents
+have not that many content related nodes and setting many thousands of properties
+is hardly a burden contrary to millions of consultations.
+
+Normally you will access nodes like this:
+
+\starttyping
+local next = current.next
+if next then
+ -- do something
+end
+\stoptyping
+
+Here \type {next} is not a real field, but a virtual one. Accessing it results in
+a metatable method being called. In practice it boils down to looking up the node
+type and based on the node type checking for the field name. In a worst case you
+have a node type that sits at the end of the lookup list and a field that is last
+in the lookup chain. However, in successive versions of \LUATEX\ these lookups
+have been optimized and the most frequently accessed nodes and fields have a
+higher priority.
+
+Because in practice the \type {next} accessor results in a function call, there
+is some overhead involved. The next code does the same and performs a tiny bit
+faster (but not that much because it is still a function call but one that knows
+what to look up).
+
+\starttyping
+local next = node.next(current)
+if next then
+ -- do something
+end
+\stoptyping
+
+In the direct namespace there are more helpers and most of them are accompanied
+by setters. The getters and setters are clever enough to see what node is meant.
+We don't deal with whatsit nodes: their fields are always accessed by name. It
+doesn't make sense to add getters for all fields, we just identifier the most
+likely candidates. In complex documents, many node and fields types never get
+seen, or seen only a few times, but for instance glyphs are candidates for such
+optimization. The \type {node.direct} interface has some more helpers. \footnote
+{We can define the helpers in the node namespace with \type {getfield} which is
+about as efficient, so at some point we might provide that as module.}
+
+The \type {setdisc} helper takes three (optional) arguments plus an optional
+fourth indicating the subtype. Its \type {getdisc} takes an optional boolean;
+when its value is \type {true} the tail nodes will also be returned. The \type
+{setfont} helper takes an optional second argument, it being the character. The
+directmode setter \type {setlink} takes a list of nodes and will link them,
+thereby ignoring \type {nil} entries. The first valid node is returned (beware:
+for good reason it assumes single nodes). For rarely used fields no helpers are
+provided and there are a few that probably are used seldom too but were added for
+consistency. You can of course always define additional accessors using \type
+{getfield} and \type {setfield} with little overhead. When the second argument of
+\type {setattributelist} is \type {true} the current attribute list is assumed.
+
+In \CONTEXT\ some of the not performance|-|critical userdata variants are
+emulated in \LUA\ and not in the engine, so we retain downward compatibility.
+
+\def\yes{$+$} \def\nop{$-$}
+
+\def\supported#1#2#3#4%
+ {\NC \type{#1}
+ \NC \ifx#2\yes\lix{node} {#1}\fi #2
+ \NC \ifx#3\yes\lix{node.direct}{#1}\fi #3 \NC
+ \NC #4 \NC
+ \NR}
+
+\starttabulate[|l|c|c|]
+\DB function \BC node \BC direct \NC emulated \NC \NR
+\TB
+\supported {check_discretionaries} \nop \yes \yes
+\supported {check_discretionary} \nop \yes \yes
+\supported {copy} \yes \yes \relax
+\supported {copy_list} \yes \yes \relax
+%supported {copy_only} \nop \yes \relax
+\supported {count} \nop \yes \yes
+\supported {current_attr} \yes \yes \relax
+\supported {dimensions} \nop \yes \yes
+\supported {effective_glue} \nop \yes \yes
+\supported {end_of_math} \nop \yes \yes
+\supported {find_attribute} \nop \yes \yes
+%supported {find_attribute_range} \nop \yes \relax
+%supported {find_node} \nop \yes \relax
+\supported {first_glyph} \nop \yes \yes
+\supported {flatten_discretionaries} \nop \yes \yes
+%supported {flush_components} \nop \yes \relax
+\supported {flush_list} \yes \yes \relax
+\supported {flush_node} \yes \yes \relax
+\supported {free} \yes \yes \relax
+\supported {get_attribute} \yes \yes \relax
+\supported {get_properties_table} \yes \yes \relax
+\supported {get_synctex_fields} \nop \yes \relax
+\supported {getattributelist} \nop \yes \relax
+\supported {getboth} \nop \yes \relax
+\supported {getbox} \nop \yes \relax
+\supported {getchar} \nop \yes \relax
+\supported {getcomponents} \nop \yes \relax
+\supported {getdata} \nop \yes \relax
+\supported {getdepth} \nop \yes \relax
+\supported {getdirection} \nop \yes \relax
+\supported {getdisc} \nop \yes \relax
+\supported {getexpansion} \nop \yes \relax
+\supported {getfam} \nop \yes \relax
+\supported {getfield} \yes \yes \relax
+\supported {getfont} \nop \yes \relax
+\supported {getglue} \nop \yes \yes
+%supported {getglyphdata} \nop \yes \relax % experiment
+\supported {getheight} \nop \yes \relax
+\supported {getid} \nop \yes \relax
+\supported {getkern} \nop \yes \relax
+\supported {getlang} \nop \yes \relax
+\supported {getleader} \nop \yes \relax
+\supported {getlist} \nop \yes \relax
+\supported {getnext} \nop \yes \relax
+\supported {getnormalizedline} \nop \yes \relax
+\supported {getnucleus} \nop \yes \relax
+\supported {getoffsets} \nop \yes \relax
+\supported {getorientation} \nop \yes \relax
+\supported {getpenalty} \nop \yes \relax
+\supported {getpost} \nop \yes \relax
+\supported {getpre} \nop \yes \relax
+\supported {getprev} \nop \yes \relax
+\supported {getproperty} \yes \yes \relax
+\supported {getreplace} \nop \yes \relax
+\supported {getshift} \nop \yes \relax
+\supported {getsub} \nop \yes \relax
+\supported {getsubtype} \nop \yes \relax
+\supported {getsup} \nop \yes \relax
+\supported {getwhd} \nop \yes \relax
+\supported {getwidth} \nop \yes \relax
+\supported {has_attribute} \yes \yes \relax
+\supported {has_dimensions} \nop \yes \relax
+\supported {has_field} \yes \yes \relax
+\supported {has_glyph} \nop \yes \yes
+\supported {hpack} \nop \yes \yes
+%supported {ignore_math_skip} \nop \yes \relax
+\supported {insert_after} \yes \yes \relax
+\supported {insert_before} \yes \yes \relax
+\supported {is_char} \nop \yes \relax
+\supported {is_direct} \nop \yes \relax
+\supported {is_glyph} \nop \yes \relax
+\supported {is_node} \yes \yes \relax
+\supported {is_valid} \nop \yes \relax
+\supported {is_zero_glue} \nop \yes \yes
+\supported {kerning} \nop \yes \yes
+\supported {last_node} \nop \yes \yes
+\supported {length} \nop \yes \yes
+\supported {ligaturing} \nop \yes \yes
+\supported {make_extensible} \nop \yes \yes
+\supported {mlist_to_hlist} \nop \yes \yes
+\supported {naturalwidth} \nop \yes \yes
+\supported {new} \yes \yes \relax
+\supported {prepend_prevdepth} \nop \yes \yes
+\supported {protect_glyphs} \nop \yes \yes
+\supported {protect_glyph} \nop \yes \yes
+\supported {protrusion_skippable} \nop \yes \yes
+\supported {rangedimensions} \nop \yes \yes
+\supported {remove} \yes \yes \relax
+\supported {set_attribute} \yes \yes \relax
+\supported {set_synctex_fields} \nop \yes \relax
+\supported {setattributelist} \nop \yes \relax
+\supported {setboth} \nop \yes \relax
+\supported {setbox} \nop \yes \relax
+\supported {setchar} \nop \yes \relax
+\supported {setcomponents} \nop \yes \relax
+\supported {setdata} \nop \yes \relax
+\supported {setdepth} \nop \yes \relax
+\supported {setdirection} \nop \yes \relax
+\supported {setdisc} \nop \yes \relax
+\supported {setexpansion} \nop \yes \relax
+\supported {setfam} \nop \yes \relax
+\supported {setfield} \yes \yes \relax
+\supported {setfont} \nop \yes \relax
+\supported {setglue} \yes \yes \relax
+%supported {setglyphdata} \nop \yes \relax % experiment
+\supported {setheight} \nop \yes \relax
+\supported {setkern} \nop \yes \relax
+\supported {setlang} \nop \yes \relax
+\supported {setleader} \nop \yes \relax
+\supported {setlink} \nop \yes \relax
+\supported {setlist} \nop \yes \relax
+\supported {setnext} \nop \yes \relax
+\supported {setnucleus} \nop \yes \relax
+\supported {setoffsets} \nop \yes \relax
+\supported {setorientation} \nop \yes \relax
+\supported {setpenalty} \nop \yes \relax
+\supported {setprev} \nop \yes \relax
+\supported {setproperty} \yes \yes \relax
+\supported {setshift} \nop \yes \relax
+\supported {setsplit} \nop \yes \relax
+\supported {setsub} \nop \yes \relax
+\supported {setsubtype} \nop \yes \relax
+\supported {setsup} \nop \yes \relax
+\supported {setwhd} \nop \yes \relax
+\supported {setwidth} \nop \yes \relax
+\supported {slide} \nop \yes \yes
+\supported {start_of_par} \nop \yes \relax
+\supported {subtype} \nop \nop \relax
+\supported {tail} \yes \yes \relax
+\supported {todirect} \nop \yes \relax
+\supported {tonode} \nop \yes \relax
+\supported {tostring} \yes \nop \relax
+\supported {traverse} \yes \yes \relax
+\supported {traverse_char} \yes \yes \relax
+\supported {traverse_glyph} \yes \yes \relax
+\supported {traverse_id} \yes \yes \relax
+\supported {traverse_list} \yes \yes \relax
+\supported {type} \yes \nop \relax
+\supported {unprotect_glyphs} \nop \yes \yes
+\supported {unprotect_glyph} \nop \yes \yes
+\supported {unset_attribute} \yes \yes \relax
+\supported {usedlist} \nop \yes \yes
+\supported {uses_font} \nop \yes \yes
+\supported {vpack} \nop \yes \yes
+\supported {write} \yes \yes \relax
+\LL
+\stoptabulate
+
+The \type {node.next} and \type {node.prev} functions will stay but for
+consistency there are variants called \type {getnext} and \type {getprev}. We had
+to use \type {get} because \type {node.id} and \type {node.subtype} are already
+taken for providing meta information about nodes. Note: The getters do only basic
+checking for valid keys. You should just stick to the keys mentioned in the
+sections that describe node properties.
+
+Some of the getters and setters handle multiple node types, given that the field
+is relevant. In that case, some field names are considered similar (like \type
+{kern} and \type {width}, or \type {data} and \type {value}. In retrospect we
+could have normalized field names better but we decided to stick to the original
+(internal) names as much as possible. After all, at the \LUA\ end one can easily
+create synonyms.
+
+Some nodes have indirect references. For instance a math character refers to a
+family instead of a font. In that case we provide a virtual font field as
+accessor. So, \type {getfont} and \type {.font} can be used on them. The same is
+true for the \type {width}, \type {height} and \type {depth} of glue nodes. These
+actually access the spec node properties, and here we can set as well as get the
+values.
+
+In some places \LUATEX\ can do a bit of extra checking for valid node lists and
+you can enable that with:
+
+\startfunctioncall
+node.fix_node_lists(<boolean> b)
+\stopfunctioncall
+
+You can set and query the \SYNCTEX\ fields, a file number aka tag and a line
+number, for a glue, kern, hlist, vlist, rule and math nodes as well as glyph
+nodes (although this last one is not used in native \SYNCTEX).
+
+\startfunctioncall
+node.set_synctex_fields(<integer> f, <integer> l)
+<integer> f, <integer> l =
+ node.get_synctex_fields(<node> n)
+\stopfunctioncall
+
+Of course you need to know what you're doing as no checking on sane values takes
+place. Also, the synctex interpreter used in editors is rather peculiar and has
+some assumptions (heuristics).
+
+\stopsection
+
+\startsection[title={Normalization}][library=node]
+
+As an experiment the lines resulting from paragraph construction can be normalized.
+There are several modes, that can be set and queried with:
+
+\startfunctioncall
+node.direct.setnormalize(<integer> n)
+<integer> n = node.direct.getnormalize()
+\stopfunctioncall
+
+The state of a line (a hlist) can be queried with:
+
+\startfunctioncall
+<integer> leftskip, <integer> rightskip,
+ <integer> lefthangskip, <integer> righthangskip,
+ <node> head, <node> tail,
+ <integer> parindent, <integer> parfillskip = node.direct.getnormalized()
+\stopfunctioncall
+
+The modes accumulate, so mode \type {4} includes \type {1} upto \type {3}:
+
+\starttabulate[|l|p|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type{1} \NC left and right skips and directions \NC \NR
+\NC \type{2} \NC indentation and parfill skip \NC \NR
+\NC \type{3} \NC hanging indentation and par shapes \NC \NR
+\NC \type{4} \NC idem but before left and right skips \NC \NR
+\NC \type{5} \NC inject compensation for overflow \NC \NR
+\LL
+\stoptabulate
+
+This is experimental code and might take a while to become frozen.
+
+\stopsection
+
+\startsection[title={Properties}][library=node]
+
+\topicindex {nodes+properties}
+\topicindex {properties}
+
+\libindex{flush_properties_table}
+\libindex{get_properties_table}
+\libindex{set_properties_mode}
+
+Attributes are a convenient way to relate extra information to a node. You can
+assign them at the \TEX\ end as well as at the \LUA\ end and and consult them at
+the \LUA\ end. One big advantage is that they obey grouping. They are linked
+lists and normally checking for them is pretty efficient, even if you use a lot
+of them. A macro package has to provide some way to manage these attributes at the
+\TEX\ end because otherwise clashes in their usage can occur.
+
+Each node also can have a properties table and you can assign values to this
+table using the \type {setproperty} function and get properties using the \type
+{getproperty} function. Managing properties is way more demanding than managing
+attributes.
+
+Take the following example:
+
+\starttyping
+\directlua {
+ local n = node.new("glyph")
+
+ node.setproperty(n,"foo")
+ print(node.getproperty(n))
+
+ node.setproperty(n,"bar")
+ print(node.getproperty(n))
+
+ node.free(n)
+}
+\stoptyping
+
+This will print \type {foo} and \type {bar} which in itself is not that useful
+when multiple mechanisms want to use this feature. A variant is:
+
+\starttyping
+\directlua {
+ local n = node.new("glyph")
+
+ node.setproperty(n,{ one = "foo", two = "bar" })
+ print(node.getproperty(n).one)
+ print(node.getproperty(n).two)
+
+ node.free(n)
+}
+\stoptyping
+
+This time we store two properties with the node. It really makes sense to have a
+table as property because that way we can store more. But in order for that to
+work well you need to do it this way:
+
+\starttyping
+\directlua {
+ local n = node.new("glyph")
+
+ local t = node.getproperty(n)
+
+ if not t then
+ t = { }
+ node.setproperty(n,t)
+ end
+ t.one = "foo"
+ t.two = "bar"
+
+ print(node.getproperty(n).one)
+ print(node.getproperty(n).two)
+
+ node.free(n)
+}
+\stoptyping
+
+Here our own properties will not overwrite other users properties unless of
+course they use the same keys. So, eventually you will end up with something:
+
+\starttyping
+\directlua {
+ local n = node.new("glyph")
+
+ local t = node.getproperty(n)
+
+ if not t then
+ t = { }
+ node.setproperty(n,t)
+ end
+ t.myself = { one = "foo", two = "bar" }
+
+ print(node.getproperty(n).myself.one)
+ print(node.getproperty(n).myself.two)
+
+ node.free(n)
+}
+\stoptyping
+
+This assumes that only you use \type {myself} as subtable. The possibilities are
+endless but care is needed. For instance, the generic font handler that ships
+with \CONTEXT\ uses the \type {injections} subtable and you should not mess with
+that one!
+
+There are a few helper functions that you normally should not touch as user: \typ
+{flush_properties_table} will wipe the table (normally a bad idea), \typ
+{get_properties_table} and will give the table that stores properties (using
+direct entries) and you can best not mess too much with that one either because
+\LUATEX\ itself will make sure that entries related to nodes will get wiped when
+nodes get freed, so that the \LUA\ garbage collector can do its job. In fact, the
+main reason why we have this mechanism is that it saves the user (or macro
+package) some work. One can easily write a property mechanism in \LUA\ where
+after a shipout properties gets cleaned up but it's not entirely trivial to make
+sure that with each freed node also its properties get freed, due to the fact
+that there can be nodes left over for a next page. And having a callback bound to
+the node deallocator would add way to much overhead.
+
+When we copy a node list that has a table as property, there are several
+possibilities: we do the same as a new node, we copy the entry to the table in
+properties (a reference), we do a deep copy of a table in the properties, we
+create a new table and give it the original one as a metatable. After some
+experiments (that also included timing) with these scenarios we decided that a
+deep copy made no sense, nor did nilling. In the end both the shallow copy and
+the metatable variant were both ok, although the second one is slower. The most
+important aspect to keep in mind is that references to other nodes in properties
+no longer can be valid for that copy. We could use two tables (one unique and one
+shared) or metatables but that only complicates matters.
+
+When defining a new node, we could already allocate a table but it is rather easy
+to do that at the lua end e.g.\ using a metatable \type {__index} method. That
+way it is under macro package control. When deleting a node, we could keep the
+slot (e.g. setting it to false) but it could make memory consumption raise
+unneeded when we have temporary large node lists and after that only small lists.
+Both are not done.
+
+So in the end this is what happens now: when a node is copied, and it has a table
+as property, the new node will share that table. If the second argument of \typ
+{set_properties_mode} is \type {true} then a metatable approach is chosen: the
+copy gets its own table with the original table as metatable. If you use the
+generic font loader the mode is enabled that way.
+
+A few more xperiments were done. For instance: copy attributes to the properties
+so that we have fast access at the \LUA\ end. In the end the overhead is not
+compensated by speed and convenience, in fact, attributes are not that slow when
+it comes to accessing them. So this was rejected.
+
+Another experiment concerned a bitset in the node but again the gain compared to
+attributes was neglectable and given the small amount of available bits it also
+demands a pretty strong agreement over what bit represents what, and this is
+unlikely to succeed in the \TEX\ community. It doesn't pay off.
+
+Just in case one wonders why properties make sense: it is not so much speed that
+we gain, but more convenience: storing all kinds of (temporary) data in attributes
+is no fun and this mechanism makes sure that properties are cleaned up when a
+node is freed. Also, the advantage of a more or less global properties table is
+that we stay at the \LUA\ end. An alternative is to store a reference in the node
+itself but that is complicated by the fact that the register has some limitations
+(no numeric keys) and we also don't want to mess with it too much.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-pdf.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-pdf.tex
new file mode 100644
index 00000000000..3e215005329
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-pdf.tex
@@ -0,0 +1,565 @@
+% language=uk
+
+% lua.newtable
+
+\environment luametatex-style
+
+\startcomponent luametatex-pdf
+
+\startchapter[reference=pdf,title={The \PDF\ related libraries}]
+
+\startsection[title={The \type {pdfe} library}][library=pdfe]
+
+\startsubsection[title={Introduction}]
+
+\topicindex{\PDF+objects}
+
+\topicindex{\PDF+analyze}
+\topicindex{\PDF+\type{pdfe}}
+
+The \type {pdfe} library replaces the \type {epdf} library and provides an
+interface to \PDF\ files. It uses the same code as is used for \PDF\ image
+inclusion. The \type {pplib} library by Paweł Jackowski replaces the \type
+{poppler} (derived from \type {xpdf}) library.
+
+A \PDF\ file is basically a tree of objects and one descends into the tree via
+dictionaries (key/value) and arrays (index/value). There are a few topmost
+dictionaries that start at root that are accessed more directly.
+
+Although everything in \PDF\ is basically an object we only wrap a few in so
+called userdata \LUA\ objects.
+
+\starttabulate[|l|l|]
+\DB type \BC mapping \NC \NR
+\TB
+\BC \PDF \BC \LUA \NC \NR
+\NC null \NC nil \NC \NR
+\NC boolean \NC boolean \NC \NR
+\NC integer \NC integer \NC \NR
+\NC float \NC number \NC \NR
+\NC name \NC string \NC \NR
+\NC string \NC string \NC \NR
+\NC array \NC array userdatum \NC \NR
+\NC dictionary \NC dictionary userdatum \NC \NR
+\NC stream \NC stream userdatum (with related dictionary) \NC \NR
+\NC reference \NC reference userdatum \NC \NR
+\LL
+\stoptabulate
+
+The regular getters return these \LUA\ data types but one can also get more
+detailed information.
+
+\stopsubsection
+
+\startsubsection[title={\type {open}, \type {openfile}, \type {new}, \type {getstatus}, \type {close}, \type {unencrypt}}]
+
+\libindex {open}
+\libindex {new}
+\libindex {new}
+\libindex {getstatus}
+\libindex {close}
+\libindex {unencrypt}
+
+A document is loaded from a file (by name or handle) or string:
+
+\starttyping
+<pdfe document> = pdfe.open(filename)
+<pdfe document> = pdfe.openfile(filehandle)
+<pdfe document> = pdfe.new(somestring,somelength)
+\stoptyping
+
+Such a document is closed with:
+
+\starttyping
+pdfe.close(<pdfe document>)
+\stoptyping
+
+You can check if a document opened well by:
+
+\starttyping
+pdfe.getstatus(<pdfe document>)
+\stoptyping
+
+The returned codes are:
+
+\starttabulate[|c|l|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type {-2} \NC the document failed to open \NC \NR
+\NC \type {-1} \NC the document is (still) protected \NC \NR
+\NC \type {0} \NC the document is not encrypted \NC \NR
+\NC \type {2} \NC the document has been unencrypted \NC \NR
+\LL
+\stoptabulate
+
+An encrypted document can be unencrypted by the next command where instead of
+either password you can give \type {nil}:
+
+\starttyping
+pdfe.unencrypt(<pdfe document>,userpassword,ownerpassword)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {getsize}, \type {getversion}, \type {getnofobjects}, \type {getnofpages}}]
+
+\libindex {getsize}
+\libindex {getversion}
+\libindex {getnofobjects}
+\libindex {getnofpages}
+
+A successfully opened document can provide some information:
+
+\starttyping
+bytes = getsize(<pdfe document>)
+major, minor = getversion(<pdfe document>)
+n = getnofobjects(<pdfe document>)
+n = getnofpages(<pdfe document>)
+bytes, waste = getnofpages(<pdfe document>)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {get[catalog|trailer|info]}}]
+
+\libindex {getcatalog}
+\libindex {gettrailer}
+\libindex {getinfo}
+
+For accessing the document structure you start with the so called catalog, a
+dictionary:
+
+\starttyping
+<pdfe dictionary> = pdfe.getcatalog(<pdfe document>)
+\stoptyping
+
+The other two root dictionaries are accessed with:
+
+\starttyping
+<pdfe dictionary> = pdfe.gettrailer(<pdfe document>)
+<pdfe dictionary> = pdfe.getinfo(<pdfe document>)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {getpage}, \type {getbox}}]
+
+\libindex {getpage}
+\libindex {getbox}
+
+A specific page can conveniently be reached with the next command, which
+returns a dictionary. The first argument is to be a page dictionary.
+
+\starttyping
+<pdfe dictionary> = pdfe.getpage(<pdfe document>,pagenumber)
+\stoptyping
+
+Another convenience command gives you the (bounding) box of a (normally page)
+which can be inherited from the document itself. An example of a valid box name
+is \type {MediaBox}.
+
+\starttyping
+pages = pdfe.getbox(<pdfe dictionary>,boxname)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {get[string|integer|number|boolean|name]}}]
+
+\libindex {getstring}
+\libindex {getinteger}
+\libindex {getnumber}
+\libindex {getboolean}
+\libindex {getname}
+
+Common values in dictionaries and arrays are strings, integers, floats, booleans
+and names (which are also strings) and these are also normal \LUA\ objects:
+
+\starttyping
+s = getstring (<pdfe array|dictionary>,index|key)
+i = getinteger(<pdfe array|dictionary>,index|key)
+n = getnumber (<pdfe array|dictionary>,index|key)
+b = getboolean(<pdfe array|dictionary>,index|key)
+n = getname (<pdfe array|dictionary>,index|key)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {get[from][dictionary|array|stream]}}]
+
+\libindex {getdictionary} \libindex {getfromdictionary}
+\libindex {getarray} \libindex {getfromarray}
+\libindex {getstream} \libindex {getfromstream}
+
+Normally you will use an index in an array and key in a dictionary but dictionaries
+also accept an index. The size of an array or dictionary is available with the
+usual \type {#} operator.
+
+\starttyping
+<pdfe dictionary> = getdictionary(<pdfe array|dictionary>,index|key)
+<pdfe array> = getarray (<pdfe array|dictionary>,index|key)
+<pdfe stream>,
+<pdfe dictionary> = getstream (<pdfe array|dictionary>,index|key)
+\stoptyping
+
+These commands return dictionaries, arrays and streams, which are dictionaries
+with a blob of data attached.
+
+Before we come to an alternative access mode, we mention that the objects provide
+access in a different way too, for instance this is valid:
+
+\starttyping
+print(pdfe.open("foo.pdf").Catalog.Type)
+\stoptyping
+
+At the topmost level there are \type {Catalog}, \type {Info}, \type {Trailer}
+and \type {Pages}, so this is also okay:
+
+\starttyping
+print(pdfe.open("foo.pdf").Pages[1])
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {[open|close|readfrom|whole|]stream}}]
+
+\libindex {openstream}
+\libindex {closestream}
+\libindex {readfromstream}
+\libindex {readfromwholestream}
+
+Streams are sort of special. When your index or key hits a stream you get back a
+stream object and dictionary object. The dictionary you can access in the usual
+way and for the stream there are the following methods:
+
+\starttyping
+okay = openstream(<pdfe stream>,[decode])
+ closestream(<pdfe stream>)
+str, n = readfromstream(<pdfe stream>)
+str, n = readwholestream(<pdfe stream>,[decode])
+\stoptyping
+
+You either read in chunks, or you ask for the whole. When reading in chunks, you
+need to open and close the stream yourself. The \type {n} value indicates the
+length read. The \type {decode} parameter controls if the stream data gets
+uncompressed.
+
+As with dictionaries, you can access fields in a stream dictionary in the usual
+\LUA\ way too. You get the content when you \quote {call} the stream. You can
+pass a boolean that indicates if the stream has to be decompressed.
+
+% pdfe.objectcodes = objectcodes
+% pdfe.stringcodes = stringcodes
+% pdfe.encryptioncodes = encryptioncodes
+
+\stopsubsection
+
+\startsubsection[title={\type {getfrom[dictionary|array]}}]
+
+\libindex {getfromdictionary}
+\libindex {getfromarray}
+
+In addition to the interface described before, there is also a bit lower level
+interface available.
+
+\starttyping
+key, type, value, detail = getfromdictionary(<pdfe dictionary>,index)
+type, value, detail = getfromarray(<pdfe array>,index)
+\stoptyping
+
+\starttabulate[|c|l|l|l|]
+\DB type \BC meaning \BC value \BC detail \NC \NR
+\NC \type {0} \NC none \NC nil \NC \NC \NR
+\NC \type {1} \NC null \NC nil \NC \NC \NR
+\NC \type {2} \NC boolean \NC boolean \NC \NC \NR
+\NC \type {3} \NC integer \NC integer \NC \NC \NR
+\NC \type {4} \NC number \NC float \NC \NC \NR
+\NC \type {5} \NC name \NC string \NC \NC \NR
+\NC \type {6} \NC string \NC string \NC hex \NC \NR
+\NC \type {7} \NC array \NC arrayobject \NC size \NC \NR
+\NC \type {8} \NC dictionary \NC dictionaryobject \NC size \NC \NR
+\NC \type {9} \NC stream \NC streamobject \NC dictionary size \NC \NR
+\NC \type {10} \NC reference \NC integer \NC \NC \NR
+\LL
+\stoptabulate
+
+A \type {hex} string is (in the \PDF\ file) surrounded by \type {<>} while plain
+strings are bounded by \type {<>}.
+
+\stopsubsection
+
+\startsubsection[title={\type {[dictionary|array]totable}}]
+
+\libindex {dictionarytotable}
+\libindex {arraytotable}
+
+All entries in a dictionary or table can be fetched with the following commands
+where the return values are a hashed or indexed table.
+
+\starttyping
+hash = dictionarytotable(<pdfe dictionary>)
+list = arraytotable(<pdfe array>)
+\stoptyping
+
+You can get a list of pages with:
+
+\starttyping
+{ { <pdfe dictionary>, size, objnum }, ... } = pagestotable(<pdfe document>)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {getfromreference}}]
+
+\libindex {getfromreference}
+
+Because you can have unresolved references, a reference object can be resolved
+with:
+
+\starttyping
+type, <pdfe dictionary|array|stream>, detail = getfromreference(<pdfe reference>)
+\stoptyping
+
+So, as second value you get back a new \type {pdfe} userdata object that you can
+query.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Memory streams}][library=pdfe]
+
+\topicindex{\PDF+memory streams}
+
+\libindex {new}
+
+The \type {pdfe.new} that takes three arguments:
+
+\starttabulate
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type {stream} \NC this is a (in low level \LUA\ speak) light userdata
+ object, i.e.\ a pointer to a sequence of bytes \NC \NR
+\NC \type {length} \NC this is the length of the stream in bytes (the stream can
+ have embedded zeros) \NC \NR
+\NC \type {name} \NC optional, this is a unique identifier that is used for
+ hashing the stream, so that multiple doesn't use more
+ memory \NC \NR
+\LL
+\stoptabulate
+
+The third argument is optional. When it is not given the function will return an
+\type {pdfe} document object as with a regular file, otherwise it will return a
+filename that can be used elsewhere (e.g.\ in the image library) to reference the
+stream as pseudo file.
+
+Instead of a light userdata stream (which is actually fragile but handy when you
+come from a library) you can also pass a \LUA\ string, in which case the given
+length is (at most) the string length.
+
+The function returns an \type {pdfe} object and a string. The string can be used in
+the \type {img} library instead of a filename. You need to prevent garbage
+collection of the object when you use it as image (for instance by storing it
+somewhere).
+
+Both the memory stream and it's use in the image library is experimental and can
+change. In case you wonder where this can be used: when you use the swiglib
+library for \type {graphicmagick}, it can return such a userdata object. This
+permits conversion in memory and passing the result directly to the backend. This
+might save some runtime in one|-|pass workflows. This feature is currently not
+meant for production and we might come up with a better implementation.
+
+\stopsection
+
+\startsection[title={The \type {pdfscanner} library}][library=pdfscanner]
+
+This library is not available in \LUAMETATEX.
+
+\stopsection
+
+% \startsection[title={The \type {pdfscanner} library}][library=pdfscanner]
+%
+% \topicindex{\PDF+scanner}
+%
+% \libindex {scan}
+%
+% The \type {pdfscanner} library allows interpretation of \PDF\ content streams and
+% \type {/ToUnicode} (cmap) streams. You can get those streams from the \type
+% {pdfe} library, as explained in an earlier section. There is only a single
+% top|-|level function in this library:
+%
+% \startfunctioncall
+% pdfscanner.scan (<pdfe stream>, <table> operatortable, <table> info)
+% pdfscanner.scan (<pdfe array>, <table> operatortable, <table> info)
+% pdfscanner.scan (<string>, <table> operatortable, <table> info)
+% \stopfunctioncall
+%
+% The first argument should be a \LUA\ string or a stream or array onject coming
+% from the \type {pdfe} library. The second argument, \type {operatortable}, should
+% be a \LUA\ table where the keys are \PDF\ operator name strings and the values
+% are \LUA\ functions (defined by you) that are used to process those operators.
+% The functions are called whenever the scanner finds one of these \PDF\ operators
+% in the content stream(s). The functions are called with two arguments: the \type
+% {scanner} object itself, and the \type {info} table that was passed are the third
+% argument to \type {pdfscanner.scan}.
+%
+% Internally, \type {pdfscanner.scan} loops over the \PDF\ operators in the
+% stream(s), collecting operands on an internal stack until it finds a \PDF\
+% operator. If that \PDF\ operator's name exists in \type {operatortable}, then the
+% associated function is executed. After the function has run (or when there is no
+% function to execute) the internal operand stack is cleared in preparation for the
+% next operator, and processing continues.
+%
+% The \type {scanner} argument to the processing functions is needed because it
+% offers various methods to get the actual operands from the internal operand
+% stack.
+%
+% A simple example of processing a \PDF's document stream could look like this:
+%
+% \starttyping
+% local operatortable = { }
+%
+% operatortable.Do = function(scanner,info)
+% local resources = info.resources
+% if resources then
+% local val = scanner:pop()
+% local name = val[2]
+% local xobject = resources.XObject
+% print(info.space .. "Uses XObject " .. name)
+% local resources = xobject.Resources
+% if resources then
+% local newinfo = {
+% space = info.space .. " ",
+% resources = resources,
+% }
+% pdfscanner.scan(entry, operatortable, newinfo)
+% end
+% end
+% end
+%
+% local function Analyze(filename)
+% local doc = pdfe.open(filename)
+% if doc then
+% local pages = doc.Pages
+% for i=1,#pages do
+% local page = pages[i]
+% local info = {
+% space = " " ,
+% resources = page.Resources,
+% }
+% print("Page " .. i)
+% -- pdfscanner.scan(page.Contents,operatortable,info)
+% pdfscanner.scan(page.Contents(),operatortable,info)
+% end
+% end
+% end
+%
+% Analyze("foo.pdf")
+% \stoptyping
+%
+% This example iterates over all the actual content in the \PDF, and prints out the
+% found \type {XObject} names. While the code demonstrates quite some of the \type
+% {pdfe} functions, let's focus on the type \type {pdfscanner} specific code
+% instead.
+%
+% From the bottom up, the following line runs the scanner with the \PDF\ page's
+% top|-|level content given in the first argument.
+%
+% The third argument, \type {info}, contains two entries: \type {space} is used to
+% indent the printed output, and \type {resources} is needed so that embedded \type
+% {XForms} can find their own content.
+%
+% The second argument, \type {operatortable} defines a processing function for a
+% single \PDF\ operator, \type {Do}.
+%
+% The function \type {Do} prints the name of the current \type {XObject}, and then
+% starts a new scanner for that object's content stream, under the condition that
+% the \type {XObject} is in fact a \type {/Form}. That nested scanner is called
+% with new \type {info} argument with an updated \type {space} value so that the
+% indentation of the output nicely nests, and with a new \type {resources} field
+% to help the next iteration down to properly process any other, embedded \type
+% {XObject}s.
+%
+% Of course, this is not a very useful example in practice, but for the purpose of
+% demonstrating \type {pdfscanner}, it is just long enough. It makes use of only
+% one \type {scanner} method: \type {scanner:pop()}. That function pops the top
+% operand of the internal stack, and returns a \LUA\ table where the object at index
+% one is a string representing the type of the operand, and object two is its
+% value.
+%
+% The list of possible operand types and associated \LUA\ value types is:
+%
+% \starttabulate[|l|l|]
+% \DB types \BC type \NC \NR
+% \TB
+% \NC \type{integer} \NC <number> \NC \NR
+% \NC \type{real} \NC <number> \NC \NR
+% \NC \type{boolean} \NC <boolean> \NC \NR
+% \NC \type{name} \NC <string> \NC \NR
+% \NC \type{operator} \NC <string> \NC \NR
+% \NC \type{string} \NC <string> \NC \NR
+% \NC \type{array} \NC <table> \NC \NR
+% \NC \type{dict} \NC <table> \NC \NR
+% \LL
+% \stoptabulate
+%
+% In case of \type {integer} or \type {real}, the value is always a \LUA\ (floating
+% point) number. In case of \type {name}, the leading slash is always stripped.
+%
+% In case of \type {string}, please bear in mind that \PDF\ actually supports
+% different types of strings (with different encodings) in different parts of the
+% \PDF\ document, so you may need to reencode some of the results; \type {pdfscanner}
+% always outputs the byte stream without reencoding anything. \type {pdfscanner}
+% does not differentiate between literal strings and hexadecimal strings (the
+% hexadecimal values are decoded), and it treats the stream data for inline images
+% as a string that is the single operand for \type {EI}.
+%
+% In case of \type {array}, the table content is a list of \type {pop} return
+% values and in case of \type {dict}, the table keys are \PDF\ name strings and the
+% values are \type {pop} return values.
+%
+% \libindex{pop}
+% \libindex{popnumber}
+% \libindex{popname}
+% \libindex{popstring}
+% \libindex{poparray}
+% \libindex{popdictionary}
+% \libindex{popboolean}
+% \libindex{done}
+%
+% There are a few more methods defined that you can ask \type {scanner}:
+%
+% \starttabulate[|l|p|]
+% \DB method \BC explanation \NC \NR
+% \TB
+% \NC \type{pop} \NC see above \NC \NR
+% \NC \type{popnumber} \NC return only the value of a \type {real} or \type {integer} \NC \NR
+% \NC \type{popname} \NC return only the value of a \type {name} \NC \NR
+% \NC \type{popstring} \NC return only the value of a \type {string} \NC \NR
+% \NC \type{poparray} \NC return only the value of a \type {array} \NC \NR
+% \NC \type{popdictionary} \NC return only the value of a \type {dict} \NC \NR
+% \NC \type{popboolean} \NC return only the value of a \type {boolean} \NC \NR
+% \NC \type{done} \NC abort further processing of this \type {scan()} call \NC \NR
+% \LL
+% \stoptabulate
+%
+% The \type {pop*} are convenience functions, and come in handy when you know the
+% type of the operands beforehand (which you usually do, in \PDF). For example, the
+% \type {Do} function could have used \type {local name = scanner:popname()}
+% instead, because the single operand to the \type {Do} operator is always a \PDF\
+% name object.
+%
+% The \type {done} function allows you to abort processing of a stream once you
+% have learned everything you want to learn. This comes in handy while parsing
+% \type {/ToUnicode}, because there usually is trailing garbage that you are not
+% interested in. Without \type {done}, processing only ends at the end of the
+% stream, possibly wasting \CPU\ cycles.
+%
+% {\em We keep the older names \type {popNumber}, \type {popName}, \type
+% {popString}, \type {popArray}, \type {popDict} and \type {popBool} around.}
+%
+% \stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-preamble.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-preamble.tex
new file mode 100644
index 00000000000..8f1400c9f9c
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-preamble.tex
@@ -0,0 +1,166 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-preamble
+
+\startchapter[reference=preamble,title={The internals}]
+
+\topicindex{nodes}
+\topicindex{boxes}
+\topicindex{\LUA}
+
+This is a reference manual, not a tutorial. This means that we discuss changes
+relative to traditional \TEX\ and also present new functionality. As a
+consequence we will refer to concepts that we assume to be known or that might be
+explained later. Because the \LUATEX\ and \LUAMETATEX\ engines open up \TEX\
+there's suddenly quite some more to explain, especially about the way a (to be)
+typeset stream moves through the machinery. However, discussing all that in
+detail makes not much sense, because deep knowledge is only relevant for those
+who write code not possible with regular \TEX\ and who are already familiar with
+these internals (or willing to spend time on figuring it out).
+
+So, the average user doesn't need to know much about what is in this manual. For
+instance fonts and languages are normally dealt with in the macro package that
+you use. Messing around with node lists is also often not really needed at the
+user level. If you do mess around, you'd better know what you're dealing with.
+Reading \quotation {The \TEX\ Book} by Donald Knuth is a good investment of time
+then also because it's good to know where it all started. A more summarizing
+overview is given by \quotation {\TEX\ by Topic} by Victor Eijkhout. You might
+want to peek in \quotation {The \ETEX\ manual} too.
+
+But \unknown\ if you're here because of \LUA, then all you need to know is that
+you can call it from within a run. If you want to learn the language, just read
+the well written \LUA\ book. The macro package that you use probably will provide
+a few wrapper mechanisms but the basic \lpr {directlua} command that does the job
+is:
+
+\starttyping
+\directlua{tex.print("Hi there")}
+\stoptyping
+
+You can put code between curly braces but if it's a lot you can also put it in a
+file and load that file with the usual \LUA\ commands. If you don't know what
+this means, you definitely need to have a look at the \LUA\ book first.
+
+If you still decide to read on, then it's good to know what nodes are, so we do a
+quick introduction here. If you input this text:
+
+\starttyping
+Hi There
+\stoptyping
+
+eventually we will get a linked lists of nodes, which in \ASCII\ art looks like:
+
+\starttyping
+H <=> i <=> [glue] <=> T <=> h <=> e <=> r <=> e
+\stoptyping
+
+When we have a paragraph, we actually get something:
+
+\starttyping
+[localpar] <=> H <=> i <=> [glue] <=> T <=> h <=> e <=> r <=> e <=> [glue]
+\stoptyping
+
+Each character becomes a so called glyph node, a record with properties like the
+current font, the character code and the current language. Spaces become glue
+nodes. There are many node types that we will discuss later. Each node points
+back to a previous node or next node, given that these exist. Sometimes
+multiple characters are represented by one glyphs, so one can also get:
+
+\starttyping
+[localpar] <=> H <=> i <=> [glue] <=> Th <=> e <=> r <=> e <=> [glue]
+\stoptyping
+
+And maybe some characters get positioned relative to each other, so we might
+see:
+
+\starttyping
+[localpar] <=> H <=> [kern] <=> i <=> [glue] <=> Th <=> e <=> r <=> e <=> [glue]
+\stoptyping
+
+It's also good to know beforehand that \TEX\ is basically centered around
+creating paragraphs and pages. The par builder takes a list and breaks it into
+lines. At some point horizontal blobs are wrapped into vertical ones. Lines are
+so called boxes and can be separated by glue, penalties and more. The page
+builder accumulates lines and when feasible triggers an output routine that will
+take the list so far. Constructing the actual page is not part of \TEX\ but done
+using primitives that permit manipulation of boxes. The result is handled back to
+\TEX\ and flushed to a (often \PDF) file.
+
+The \LUATEX\ engine provides hooks for \LUA\ code at nearly every reasonable
+point in the process: collecting content, hyphenating, applying font features,
+breaking into lines, etc. This means that you can overload \TEX's natural
+behaviour, which still is the benchmark. When we refer to \quote {callbacks} we
+means these hooks. The \TEX\ engine itself is pretty well optimized but when you
+kick in much \LUA\ code, you will notices that performance drops. Don't blame and
+bother the authors with performance issues. In \CONTEXT\ over 50\% of the time
+can be spent in \LUA, but so far we didn't get many complaints about efficiency.
+
+Where plain \TEX\ is basically a basic framework for writing a specific style,
+macro packages like \CONTEXT\ and \LATEX\ provide the user a whole lot of
+additional tools to make documents look good. They hide the dirty details of font
+management, language demands, turning structure into typeset results, wrapping
+pages, including images, and so on. You should be aware of the fact that when you
+hook in your own code to manipulate lists, this can interfere with the macro
+package that you use. Each successive step expects a certain result and if you
+mess around to much, the engine eventually might bark and quit. It can even
+crash, because testing everywhere for what users can do wrong is no real option.
+
+When you read about nodes in the following chapters it's good to keep in mind
+their commands that relate to then. Here are a few:
+
+\starttabulate[|l|l|p|]
+\DB command \BC node \BC explanation \NC \NR
+\TB
+\NC \prm {hbox} \NC \nod {hlist} \NC horizontal box \NC \NR
+\NC \prm {vbox} \NC \nod {vlist} \NC vertical box with the baseline at the bottom \NC \NR
+\NC \prm {vtop} \NC \nod {vlist} \NC vertical box with the baseline at the top \NC \NR
+\NC \prm {hskip} \NC \nod {glue} \NC horizontal skip with optional stretch and shrink \NC \NR
+\NC \prm {vskip} \NC \nod {glue} \NC vertical skip with optional stretch and shrink \NC \NR
+\NC \prm {kern} \NC \nod {kern} \NC horizontal or vertical fixed skip \NC \NR
+\NC \prm {discretionary} \NC \nod {disc} \NC hyphenation point (pre, post, replace) \NC \NR
+\NC \prm {char} \NC \nod {glyph} \NC a character \NC \NR
+\NC \prm {hrule} \NC \nod {rule} \NC a horizontal rule \NC \NR
+\NC \prm {vrule} \NC \nod {rule} \NC a vertical rule \NC \NR
+\NC \prm {textdirection} \NC \nod {dir} \NC a change in text direction \NC \NR
+\LL
+\stoptabulate
+
+Text (interspersed with macros) comes from an input medium. This can be a file,
+token list, macro body cq.\ arguments, \ some internal quantity (like a number),
+\LUA, etc. Macros get expanded. In the process \TEX\ can enter a group. Inside
+the group, changes to registers get saved on a stack, and restored after leaving
+the group. When conditionals are encountered, another kind of nesting happens,
+and again there is a stack involved. Tokens, expansion, stacks, input levels are
+all terms used in the next chapters. Don't worry, they loose their magic once you
+use \TEX\ a lot. You have access to most of the internals and when not, at least
+it is possible to query some state we're in or level we're at.
+
+When we talk about packing it can mean two things. When \TEX\ has consumed some
+tokens that represent text the next can happen. When the text is put into a so
+called \type {\hbox} it (normally) first gets hyphenated, next ligatures are
+build, and finally kerns are added. Each of that stages can be overloaded using
+\LUA\ code. When these three stages are finished, the dimension of the content is
+calculated and the box gets its width, height and depth. What happens with the
+box depends on what macros do with it.
+
+The other thing that can happen is that the text starts a new paragraph. In that
+case some (directional) information is put in front, indentation is prepended and
+some skip appended at the end. Again the three stages are applied but this time,
+afterwards, the long line is broken into lines and the result is either added to
+the content of a box or to the main vertical list (the running text so to say).
+This is called par building. At some point \TEX\ decides that enough is enough
+and it will trigger the page builder. So, building is another concept we will
+encounter. Another example of a builder is the one that turns an intermediate
+math list into something typeset.
+
+Wrapping something in a box is called packing. Adding something to a list is
+described in terms of contributing. The more complicated processes are wrapped
+into builders. For now this should be enough to enable you to understand the next
+chapters. The text is not as enlightening and entertaining as Don Knuths books,
+sorry.
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-primitives.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-primitives.tex
new file mode 100644
index 00000000000..9e26c6bc47f
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-primitives.tex
@@ -0,0 +1,395 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-primitives
+
+\startchapter[reference=primitives,title={Primitives aka commands}]
+
+\startsection[title=Introduction]
+
+The starting point of \LUATEX\ is \PDFTEX, which itself contains regular \TEX\
+and \ETEX. Because directional support was needed we also took some code from
+\ALEPH\ (\OMEGA). In a later stage the backend specific commands were isolated in
+its own namespace which resulted in a cleaner code base where the backend code no
+longer was interwoven with the normal frontend primitives. We also promoted some
+generic constructs (like box resources and directions) to core functionality.
+
+Some of the \PDFTEX\ support primitives have been around from the start but when
+\LUA\ integration became better and when a token scanner library was added, not
+all of those made sense as primitives. In previous chapters we already mentioned
+what is gone from the core. Deep down some more has changes but not all is
+reflected at the primitive level. Because there is still a considerable amount of
+new primitives, a summary is given below.
+
+\stopsection
+
+\startsection[title=Languages]
+
+\starttabulate[|||p|]
+\NC \type {automatichyphenmode} \NC integer \NC \NC \NR
+\NC \type {automatichyphenpenalty} \NC integer \NC \NC \NR
+\NC \type {hyphenpenaltymode} \NC integer \NC \NC \NR
+\NC \type {compoundhyphenmode} \NC integer \NC \NC \NR
+\NC \type {exceptionpenalty} \NC integer \NC \NC \NR
+\NC \type {explicithyphenpenalty} \NC integer \NC \NC \NR
+\NC \type {hyphenationbounds} \NC integer \NC \NC \NR
+\NC \type {hjcode} \NC charactercode \NC \NC \NR
+\NC \type {hyphenationmin} \NC charactercode \NC \NC \NR
+\NC \type {postexhyphenchar} \NC charactercode \NC \NC \NR
+\NC \type {posthyphenchar} \NC charactercode \NC \NC \NR
+\NC \type {preexhyphenchar} \NC charactercode \NC \NC \NR
+\NC \type {prehyphenchar} \NC charactercode \NC \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title=Fonts]
+
+\starttabulate[|||p|]
+\NC \type {tracingfonts} \NC integer \NC \NC \NR
+\NC \type {suppressfontnotfounderror} \NC integer \NC \NC \NR
+\NC \type {setfontid} \NC integer \NC \NC \NR
+\NC \type {fontid} \NC font \NC \NC \NR
+\NC \type {efcode} \NC font charactercode \NC \NC \NR
+\NC \type {lpcode} \NC font charactercode \NC \NC \NR
+\NC \type {rpcode} \NC font charactercode \NC \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title=Math]
+
+\starttabulate[|||p|]
+\NC \type {matholdmode} \NC integer \NC \NC \NR
+\NC \type {mathstyle} \NC integer \NC \NC \NR
+\NC \type {matheqnogapstep} \NC integer \NC \NC \NR
+\NC \type {Uskewed} \NC \NC \NC \NR
+\NC \type {Uskewedwithdelims} \NC \NC \NC \NR
+\NC \type {Ustartdisplaymath} \NC \NC \NC \NR
+\NC \type {Ustartmath} \NC \NC \NC \NR
+\NC \type {Ustopdisplaymath} \NC \NC \NC \NR
+\NC \type {Ustopmath} \NC \NC \NC \NR
+\NC \type {crampeddisplaystyle} \NC \NC \NC \NR
+\NC \type {crampedtextstyle} \NC \NC \NC \NR
+\NC \type {crampedscriptstyle} \NC \NC \NC \NR
+\NC \type {crampedscriptscriptstyle} \NC \NC \NC \NR
+\NC \type {Umathchardef} \NC \NC \NC \NR
+\NC \type {Umathcharnumdef} \NC \NC \NC \NR
+\NC \type {mathdisplayskipmode} \NC integer \NC \NC \NR
+\NC \type {mathscriptsmode} \NC integer \NC \NC \NR
+\NC \type {mathnolimitsmode} \NC integer \NC \NC \NR
+\NC \type {mathitalicsmode} \NC integer \NC \NC \NR
+\NC \type {mathrulesmode} \NC integer \NC \NC \NR
+\NC \type {mathrulesfam} \NC integer \NC \NC \NR
+\NC \type {mathdelimitersmode} \NC integer \NC \NC \NR
+\NC \type {mathflattenmode} \NC integer \NC \NC \NR
+\NC \type {mathpenaltiesmode} \NC integer \NC \NC \NR
+\NC \type {mathrulethicknessmode} \NC integer \NC \NC \NR
+\NC \type {mathscriptboxmode} \NC integer \NC \NC \NR
+\NC \type {mathscriptcharmode} \NC integer \NC \NC \NR
+\NC \type {mathsurroundmode} \NC integer \NC \NC \NR
+\NC \type {nokerns} \NC integer \NC \NC \NR
+\NC \type {noligs} \NC integer \NC \NC \NR
+\NC \type {prebinoppenalty} \NC integer \NC \NC \NR
+\NC \type {predisplaygapfactor} \NC integer \NC \NC \NR
+\NC \type {prerelpenalty} \NC integer \NC \NC \NR
+\NC \type {Usuperscript} \NC command \NC \NC \NR
+\NC \type {Usubscript} \NC command \NC \NC \NR
+\NC \type {Unosuperscript} \NC command \NC \NC \NR
+\NC \type {Unosubscript} \NC command \NC \NC \NR
+\NC \type {Umathcode} \NC \NC \NC \NR
+\NC \type {Umathcodenum} \NC \NC \NC \NR
+\NC \type {Udelcode} \NC \NC \NC \NR
+\NC \type {Udelcodenum} \NC \NC \NC \NR
+\NC \type {Umathaxis} \NC family dimension \NC \NC \NR
+\NC \type {Umathbinbinspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathbinclosespacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathbininnerspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathbinopenspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathbinopspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathbinordspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathbinpunctspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathbinrelspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathclosebinspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathcloseclosespacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathcloseinnerspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathcloseopenspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathcloseopspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathcloseordspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathclosepunctspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathcloserelspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathconnectoroverlapmin} \NC family dimension \NC \NC \NR
+\NC \type {Umathfractiondelsize} \NC family dimension \NC \NC \NR
+\NC \type {Umathfractiondenomdown} \NC family dimension \NC \NC \NR
+\NC \type {Umathfractiondenomvgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathfractionnumup} \NC family dimension \NC \NC \NR
+\NC \type {Umathfractionnumvgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathfractionrule} \NC family dimension \NC \NC \NR
+\NC \type {Umathinnerbinspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathinnerclosespacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathinnerinnerspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathinneropenspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathinneropspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathinnerordspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathinnerpunctspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathinnerrelspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathlimitabovebgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathlimitabovekern} \NC family dimension \NC \NC \NR
+\NC \type {Umathlimitabovevgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathlimitbelowbgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathlimitbelowkern} \NC family dimension \NC \NC \NR
+\NC \type {Umathlimitbelowvgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathnolimitsubfactor} \NC family dimension \NC \NC \NR
+\NC \type {Umathnolimitsupfactor} \NC family dimension \NC \NC \NR
+\NC \type {Umathopbinspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathopclosespacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathopenbinspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathopenclosespacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathopeninnerspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathopenopenspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathopenopspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathopenordspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathopenpunctspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathopenrelspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathoperatorsize} \NC family dimension \NC \NC \NR
+\NC \type {Umathopinnerspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathopopenspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathopopspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathopordspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathoppunctspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathoprelspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathordbinspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathordclosespacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathordinnerspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathordopenspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathordopspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathordordspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathordpunctspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathordrelspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathoverbarkern} \NC family dimension \NC \NC \NR
+\NC \type {Umathoverbarrule} \NC family dimension \NC \NC \NR
+\NC \type {Umathoverbarvgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathoverdelimiterbgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathoverdelimitervgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathpunctbinspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathpunctclosespacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathpunctinnerspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathpunctopenspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathpunctopspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathpunctordspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathpunctpunctspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathpunctrelspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathquad} \NC family dimension \NC \NC \NR
+\NC \type {Umathradicaldegreeafter} \NC family dimension \NC \NC \NR
+\NC \type {Umathradicaldegreebefore} \NC family dimension \NC \NC \NR
+\NC \type {Umathradicaldegreeraise} \NC family dimension \NC \NC \NR
+\NC \type {Umathradicalkern} \NC family dimension \NC \NC \NR
+\NC \type {Umathradicalrule} \NC family dimension \NC \NC \NR
+\NC \type {Umathradicalvgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathrelbinspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathrelclosespacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathrelinnerspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathrelopenspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathrelopspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathrelordspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathrelpunctspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathrelrelspacing} \NC family dimension \NC \NC \NR
+\NC \type {Umathskewedfractionhgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathskewedfractionvgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathspaceafterscript} \NC family dimension \NC \NC \NR
+\NC \type {Umathstackdenomdown} \NC family dimension \NC \NC \NR
+\NC \type {Umathstacknumup} \NC family dimension \NC \NC \NR
+\NC \type {Umathstackvgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathsubshiftdown} \NC family dimension \NC \NC \NR
+\NC \type {Umathsubshiftdrop} \NC family dimension \NC \NC \NR
+\NC \type {Umathsubsupshiftdown} \NC family dimension \NC \NC \NR
+\NC \type {Umathsubsupvgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathsubtopmax} \NC family dimension \NC \NC \NR
+\NC \type {Umathsupbottommin} \NC family dimension \NC \NC \NR
+\NC \type {Umathsupshiftdrop} \NC family dimension \NC \NC \NR
+\NC \type {Umathsupshiftup} \NC family dimension \NC \NC \NR
+\NC \type {Umathsupsubbottommax} \NC family dimension \NC \NC \NR
+\NC \type {Umathunderbarkern} \NC family dimension \NC \NC \NR
+\NC \type {Umathunderbarrule} \NC family dimension \NC \NC \NR
+\NC \type {Umathunderbarvgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathunderdelimiterbgap} \NC family dimension \NC \NC \NR
+\NC \type {Umathunderdelimitervgap} \NC family dimension \NC \NC \NR
+\NC \type {Udelimiter} \NC \NC \NC \NR
+\NC \type {Umathaccent} \NC \NC \NC \NR
+\NC \type {Umathchar} \NC \NC \NC \NR
+\NC \type {Umathcharnum} \NC \NC \NC \NR
+\NC \type {Ustack} \NC \NC \NC \NR
+\NC \type {Uradical} \NC \NC \NC \NR
+\NC \type {Uroot} \NC \NC \NC \NR
+\NC \type {Uunderdelimiter} \NC \NC \NC \NR
+\NC \type {Uoverdelimiter} \NC \NC \NC \NR
+\NC \type {Udelimiterunder} \NC \NC \NC \NR
+\NC \type {Udelimiterover} \NC \NC \NC \NR
+\NC \type {Uhextensible} \NC \NC \NC \NR
+\NC \type {Uchar} \NC \NC \NC \NR
+\NC \type {Umathcharclass} \NC \NC \NC \NR
+\NC \type {Umathcharfam} \NC \NC \NC \NR
+\NC \type {Umathcharslot} \NC \NC \NC \NR
+\NC \type {Uleft} \NC \NC \NC \NR
+\NC \type {Umiddle} \NC \NC \NC \NR
+\NC \type {Uright} \NC \NC \NC \NR
+\NC \type {Uvextensible} \NC \NC \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title=Boxes and directions]
+
+\starttabulate[|||p|]
+\NC \type {pardirection} \NC direction \NC \NC \NR
+\NC \type {textdirection} \NC direction \NC \NC \NR
+\NC \type {mathdirection} \NC direction \NC \NC \NR
+\NC \type {linedirection} \NC direction \NC \NC \NR
+\NC \type {breakafterdirmode} \NC integer \NC \NC \NR
+\NC \type {shapemode} \NC integer \NC \NC \NR
+\NC \type {fixupboxesmode} \NC integer \NC \NC \NR
+\NC \type {boxdirection} \NC box direction \NC \NC \NR
+\NC \type {boxorientation} \NC box orientation \NC rotation over 90, 180, 270 degrees \NC \NR
+\NC \type {boxxoffset} \NC box xoffset \NC leaves dimensions untounched \NC \NR
+\NC \type {boxyoffset} \NC box yoffset \NC leaves dimensions untounched \NC \NR
+\NC \type {boxxmove} \NC box xmove \NC offsets that reflect on dimensions \NC \NR
+\NC \type {boxymove} \NC box ymove \NC offsets that reflect on dimensions \NC \NR
+\NC \type {boxtotal} \NC box ht+dp \NC height plus depth (and when assigned halfs) \NC \NR
+\NC \type {boxattr} \NC box attr value \NC (sets) a specific attribute to a value \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title=Scanning]
+
+\starttabulate[|||p|]
+\NC \type {aftergrouped} \NC text \NC like aftergroup but for given list \NC \NR
+\NC \type {alignmark} \NC \NC equivalent to hash token \NC \NR
+\NC \type {aligntab} \NC \NC equivalent to tab token \NC \NR
+\NC \type {begincsname} \NC command \NC variant of \type {\csname} that ignores undefined commands \NC \NR
+\NC \type {catcodetable} \NC integer \NC switch to catcode table \NC \NR
+\NC \type {csstring} \NC command \NC the command without preceding escape character \NC \NR
+\NC \type {endlocalcontrol} \NC command \NC switches back to the main control loop \NC \NR
+\NC \type {etoksapp} \NC tokenregister text \NC append expanded text to given tokenregister \NC \NR
+\NC \type {etokspre} \NC tokenregister text \NC prepend expanded text to given tokenregister \NC \NR
+\NC \type {expanded} \NC text \NC expands the given text \NC \NR
+\NC \type {frozen} \NN prefix \NC \NC \NR
+\NC \type {futureexpand} \NN token command command \NC expands second ot third token depending on first match \NC \NR
+\NC \type {futureexpandis} \NN token command command \NC as \type {futureexpand} but also skips pars \NC \NR
+\NC \type {futureexpandisap} \NN token command command \NC same as idem but doesn't push back skipped spaces \NC \NR
+\NC \type {gtoksapp} \NC tokenregister text \NC globally append text to given tokenregister \NC \NR
+\NC \type {gtokspre} \NC tokenregister text \NC globally prepend text to given tokenregister \NC \NR
+\NC \type {ifabsdim} \NC dimension <=> dimension \NC test the absolute value of the given dimension \NC \NR
+\NC \type {ifabsnum} \NC integer <=> integer \NC test the absolute value of the given integer \NC \NR
+\NC \type {ifcondition} \NC command \NC assume the next token is a test (so skip as if) \NC \NR
+\NC \type {ifdimen} \NC possibly a dimension \NC acts like an \type {\ifcase} with 1 for valid and 2 for invalid \NC \NR
+\NC \type {ifincsname} \NC command \NC check if we're inside a csname expansion \NC \NR
+\NC \type {ifnumval} \NC \NC \NC \NR
+\NC \type {ifdimval} \NC \NC \NC \NR
+\NC \type {ifchknum} \NC \NC \NC \NR
+\NC \type {ifchkdim} \NC \NC \NC \NR
+\NC \type {ifcmpnum} \NC \NC \NC \NR
+\NC \type {ifcmpdim} \NC \NC \NC \NR
+\NC \type {ifusercmd} \NC command \NC \NC \NR
+\NC \type {ifprotected} \NC command \NC \NC \NR
+\NC \type {iffrozen} \NC command \NC \NC \NR
+\NC \type {iftok} \NC \NC \NC \NR
+\NC \type {ifcstok} \NC \NC \NC \NR
+\NC \type {internalcodesmode} \NC integer \NC \NC \NR
+%NC \type {ifprimitive} \NC command \NC check if the given command is a primitive \NC \NR
+\NC \type {immediateassigned} \NC command \NC (todo) expand the following assignment now\NC \NR
+\NC \type {immediateassignment} \NC command \NC (todo) expand the following assignment now\NC \NR
+\NC \type {initcatcodetable} \NC integer \NC initialize catcode table \NC \NR
+\NC \type {lastnamedcs} \NC command \NC last found command of \type {\ifcsname} construction \NC \NR
+\NC \type {nospaces} \NC integer \NC don't inject spaces \NC \NR
+%NC \type {primitive} \NC command \NC expands the next primitive equivalent \NC \NR
+\NC \type {orelse} \NC condition \NC \NC \NR
+\NC \type {pxdimen} \NC dimension \NC multiplier for the \type {px} unit \NC \NR
+\NC \type {savecatcodetable} \NC integer \NC save catcode table \NC \NR
+\NC \type {scantextokens} \NC text \NC \type {\scantokens} without file side effects \NC \NR
+\NC \type {suppressifcsnameerror} \NC integer \NC recover from issues in csname testing \NC \NR
+\NC \type {suppresslongerror} \NC integer \NC make \type {\long} a nop \NC \NR
+\NC \type {suppressmathparerror} \NC integer \NC accepts \type {\par} and empty lines in math \NC \NR
+\NC \type {suppressoutererror} \NC integer \NC make \type {\outer} a nop \NC \NR
+\NC \type {suppressprimitiveerror} \NC integer \NC don't report an invalid \type {\primitive} \NC \NR
+\NC \type {toksapp} \NC tokenregister text \NC append text to given tokenregister \NC \NR
+\NC \type {tokspre} \NC tokenregister text \NC prepend text to given tokenregister \NC \NR
+\NC \type {xtoksapp} \NC tokenregister text \NC globally append expanded text to given tokenregister \NC \NR
+\NC \type {xtokspre} \NC tokenregister text \NC globally prepend expanded text to given tokenregister \NC \NR
+% new (some end-of-the-year experiment)
+\NC \type {letfrozen} \NC macro \NC sets the frozen property of a macro \NC \NR
+\NC \type {letprotected} \NC macro \NC sets the protected property of a macro \NC \NR
+\NC \type {unletfrozen} \NC macro \NC unsets the frozen property of a macro \NC \NR
+\NC \type {unletprotected} \NC macro \NC unsets the protected property of a macro \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title=Typesetting]
+
+\starttabulate[|||p|]
+\NC \type {protrudechars} \NC integer \NC \NC \NR
+\NC \type {localbrokenpenalty} \NC integer \NC \NC \NR
+\NC \type {localinterlinepenalty} \NC integer \NC \NC \NR
+\NC \type {adjustspacing} \NC integer \NC \NC \NR
+\NC \type {boundary} \NC command \NC \NC \NR
+\NC \type {noboundary} \NC command \NC \NC \NR
+\NC \type {protrusionboundary} \NC command \NC \NC \NR
+\NC \type {wordboundary} \NC command \NC \NC \NR
+\NC \type {nohrule} \NC command \NC \NC \NR
+\NC \type {novrule} \NC command \NC \NC \NR
+\NC \type {insertht} \NC number \NC \NC \NR
+\NC \type {quitvmode} \NC command \NC \NC \NR
+\NC \type {leftmarginkern} \NC dimension \NC \NC \NR
+\NC \type {rightmarginkern} \NC dimension \NC \NC \NR
+\NC \type {localleftbox} \NC box \NC \NC \NR
+\NC \type {localrightbox} \NC box \NC \NC \NR
+\NC \type {gleaders} \NC command \NC \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title=\LUA]
+
+\starttabulate[|||p|]
+\NC \type {luacopyinputnodes} \NC integer \NC \NC \NR
+\NC \type {luadef} \NC \NC \NC \NR
+\NC \type {luabytecodecall} \NC \NC \NC \NR
+\NC \type {luafunctioncall} \NC \NC \NC \NR
+\NC \type {latelua} \NC \NC \NC \NR
+\NC \type {lateluafunction} \NC \NC \NC \NR
+\NC \type {luabytecode} \NC \NC \NC \NR
+\NC \type {luaescapestring} \NC \NC \NC \NR
+\NC \type {luafunction} \NC \NC \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title=Management]
+
+\starttabulate[|||p|]
+\NC \type {outputbox} \NC integer \NC \NC \NR
+\NC \type {clearmarks} \NC \NC \NC \NR
+\NC \type {attribute} \NC \NC \NC \NR
+\NC \type {glet} \NC \NC \NC \NR
+\NC \type {letcharcode} \NC \NC \NC \NR
+\NC \type {attributedef} \NC \NC \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title=Miscellaneous]
+
+\starttabulate[|||p|]
+\NC \type {luatexversion} \NC \NC \NC \NR
+\NC \type {formatname} \NC \NC \NC \NR
+\NC \type {luatexbanner} \NC \NC \NC \NR
+\NC \type {luatexrevision} \NC \NC \NC \NR
+\stoptabulate
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-registers.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-registers.tex
new file mode 100644
index 00000000000..f230a4500ca
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-registers.tex
@@ -0,0 +1,47 @@
+\environment luametatex-style
+
+\startcomponent luametatex-registers
+
+\startchapter[title=Topics]
+
+ \placeregister[topicindex]
+
+\stopchapter
+
+\startchapter[title=Primitives]
+
+ This register contains the primitives that are mentioned in the manual. There
+ are of course many more primitives. The \LUATEX\ primitives are typeset in
+ bold. The primitives from \PDFTEX\ are not supported that way but mentioned
+ anyway.
+
+ \placeregister[primitiveindex][indicator=no]
+
+\stopchapter
+
+\startchapter[title=Callbacks]
+
+ \placeregister[callbackindex]
+
+\stopchapter
+
+\startchapter[title=Nodes]
+
+ This register contains the nodes that are known to \LUATEX. The primary nodes
+ are in bold, whatsits that are determined by their subtype are normal. The
+ names prefixed by \type {pdf_} are backend specific.
+
+ \placeregister[nodeindex]
+
+\stopchapter
+
+\startchapter[title=Libraries]
+
+ This register contains the functions available in libraries. Not all functions
+ are documented, for instance because they can be experimental or obsolete.
+
+ \placeregister[libraryindex]
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-statistics.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-statistics.tex
new file mode 100644
index 00000000000..d779a0899a8
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-statistics.tex
@@ -0,0 +1,17 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-statistics
+
+\startchapter[title={Statistics}]
+
+ \topicindex{fonts+used}
+
+ The following fonts are used in this document:
+
+ \showfontusage
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-style.tex
new file mode 100644
index 00000000000..3f4b0ad2183
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-style.tex
@@ -0,0 +1,478 @@
+\startenvironment luametatex-style
+
+% \environment luatex-style
+
+% \logo[LUAMETATEX] {\Lua Meta\TeX}
+
+% todo: use \useMPlibrary[lua]
+
+\enabletrackers[fonts.usage]
+
+\usemodule[fonts-statistics]
+
+\setuplayout
+ [height=middle,
+ width=middle,
+ backspace=2cm,
+ topspace=10mm,
+ bottomspace=10mm,
+ header=10mm,
+ footer=10mm,
+ footerdistance=10mm,
+ headerdistance=10mm]
+
+\setuppagenumbering
+ [alternative=doublesided]
+
+\setuptolerance
+ [stretch,tolerant]
+
+\setuptype
+ [lines=hyphenated]
+
+\setuptyping
+ [lines=hyphenated]
+
+\setupitemize
+ [each]
+ [packed]
+
+\definesymbol[1][\Uchar"2023]
+\definesymbol[2][\endash]
+\definesymbol[3][\wait] % we want to catch it
+
+\setupitemize
+ [each]
+ [headcolor=maincolor,
+ symbolcolor=maincolor,
+ color=maincolor]
+
+\setupwhitespace
+ [medium]
+
+\setuptabulate
+ [blank={small,samepage},
+ margin=.25em,
+ headstyle=bold,
+ rulecolor=maincolor,
+ rulethickness=1pt,
+ foregroundcolor=white,
+ foregroundstyle=\ss\bfx\WORD,
+ backgroundcolor=maincolor]
+
+\setupcaptions
+ [headcolor=darkblue]
+
+\startluacode
+ local skipped = { 'id', 'subtype', 'next', 'prev' }
+
+ local function showlist(l,skipped)
+ if l then
+ l = table.tohash(l)
+ if skipped then
+ for i=1,#skipped do
+ l[skipped[i]] = nil
+ end
+ end
+ l = table.sortedkeys(l)
+ local n = #l
+ for i=1,n do
+ context("%s{\\tttf %s}", (i == 1 and "") or (i == n and " and ") or ", ", l[i])
+ end
+ end
+ end
+
+ function document.functions.showvalues(l)
+ if l then
+ local n = table.count(l)
+ local i = 0
+ for k, v in table.sortedhash(l) do
+ i = i + 1
+ context("%s{\\tttf %s} (%i)", (i == 1 and "") or (i == n and " and ") or ", ", v,k)
+ end
+ end
+ end
+
+ function document.functions.showfields(s)
+ local t = string.split(s,',')
+ showlist(node.fields(t[1],t[2]),skipped)
+ end
+
+ function document.functions.showid(s)
+ local t = string.split(s,',')
+ local i = t[1] and node.id(t[1])
+ local s = t[2] and node.subtype(t[2])
+ if s then
+ context('{\\tttf %s}, {\\tttf %s}',i,s)
+ else
+ context('{\\tttf %s}',i)
+ end
+ end
+
+ function document.functions.showsubtypes(s)
+ showlist(node.subtypes(s))
+ end
+
+\stopluacode
+
+\unexpanded\def\showfields #1{\ctxlua{document.functions.showfields("#1")}}
+\unexpanded\def\showid #1{\ctxlua{document.functions.showid("#1")}}
+\unexpanded\def\showsubtypes#1{\ctxlua{document.functions.showsubtypes("#1")}}
+\unexpanded\def\showvalues #1{\ctxlua{document.functions.showvalues(node.values("#1"))}}
+\unexpanded\def\showtypes {\ctxlua{document.functions.showvalues(node.types())}}
+
+
+\definecolor[blue] [b=.5]
+\definecolor[red] [r=.5]
+\definecolor[green] [g=.5]
+%definecolor[maincolor] [b=.5]
+%definecolor[keptcolor] [b=.5]
+%definecolor[othercolor][r=.5,g=.5]
+
+\definecolor[maincolor] [b=.5]
+\definecolor[keptcolor] [b=.5]
+\definecolor[othercolor][s=.5]
+
+\writestatus{luametatex manual}{}
+\writestatus{luametatex manual}{defining lucodaot} \usebodyfont [lucidaot]
+\writestatus{luametatex manual}{defining pagella} \usebodyfont [pagella]
+\writestatus{luametatex manual}{defining cambria} \usebodyfont [cambria]
+\writestatus{luametatex manual}{defining modern} \usebodyfont [modern]
+\writestatus{luametatex manual}{defining dejavu} \setupbodyfont[dejavu,10pt]
+\writestatus{luametatex manual}{}
+
+\setuphead [chapter] [align={flushleft,broad},style=\bfd]
+\setuphead [section] [align={flushleft,broad},style=\bfb]
+\setuphead [subsection] [align={flushleft,broad},style=\bfa]
+\setuphead [subsubsection][align={flushleft,broad},style=\bf]
+
+\setuphead [chapter] [color=maincolor]
+\setuphead [section] [color=maincolor]
+\setuphead [subsection] [color=maincolor]
+\setuphead [subsubsection][color=maincolor]
+
+\setupfloats
+ [ntop=4]
+
+\definehead
+ [remark]
+ [subsubsubject]
+
+\setupheadertexts
+ []
+
+% \setuplayout
+% [style=bold,
+% color=maincolor]
+
+\definemixedcolumns
+ [twocolumns]
+ [n=2,
+ balance=yes,
+ before=\blank,
+ after=\blank]
+
+\definemixedcolumns
+ [threecolumns]
+ [twocolumns]
+ [n=3]
+
+\definemixedcolumns
+ [fourcolumns]
+ [threecolumns]
+ [n=4]
+
+% if we do this we also need to do it in table cells
+%
+% \setuptyping
+% [color=maincolor]
+%
+% \setuptype
+% [color=maincolor]
+
+\definetyping
+ [functioncall]
+
+\startMPdefinitions
+
+ color luaplanetcolor ; luaplanetcolor := \MPcolor{maincolor} ;
+ color luaholecolor ; luaholecolor := white ;
+ numeric luaextraangle ; luaextraangle := 0 ;
+ numeric luaorbitfactor ; luaorbitfactor := .25 ;
+
+ vardef lualogo = image (
+
+ % Graphic design by A. Nakonechnyj. Copyright (c) 1998, All rights reserved.
+
+ save d, r, p ; numeric d, r, p ;
+
+ d := sqrt(2)/4 ; r := 1/4 ; p := r/8 ;
+
+ fill fullcircle scaled 1
+ withcolor luaplanetcolor ;
+ draw fullcircle rotated 40.5 scaled (1+r)
+ dashed evenly scaled p
+ withpen pencircle scaled (p/2)
+ withcolor (luaorbitfactor * luaholecolor) ;
+ fill fullcircle scaled r shifted (d+1/8,d+1/8)
+ rotated - luaextraangle
+ withcolor luaplanetcolor ;
+ fill fullcircle scaled r shifted (d-1/8,d-1/8)
+ withcolor luaholecolor ;
+ luaorbitfactor := .25 ;
+ ) enddef ;
+
+\stopMPdefinitions
+
+\startuseMPgraphic{luapage}
+ StartPage ;
+
+ fill Page withcolor \MPcolor{othercolor} ;
+
+ luaorbitfactor := 1 ;
+
+ picture p ; p := lualogo ysized (5*\measure{paperheight}/10) ;
+ draw p
+ shifted - center p
+ shifted (
+ \measure{spreadwidth} - .5*\measure{paperwidth} + \measure{spinewidth},
+ .375*\measure{paperheight}
+ )
+ ;
+
+ StopPage ;
+\stopuseMPgraphic
+
+% \starttexdefinition luaextraangle
+% % we can also just access the last page and so in mp directly
+% \ctxlua {
+% context(\lastpage == 0 and 0 or \realfolio*360/\lastpage)
+% }
+% \stoptexdefinition
+
+\startuseMPgraphic{luanumber}
+ % luaextraangle := \luaextraangle;
+ luaextraangle := if (LastPageNumber < 10) : 10 else : (RealPageNumber / LastPageNumber) * 360 fi;
+ luaorbitfactor := 0.25 ;
+ picture p ; p := lualogo ;
+ setbounds p to boundingbox fullcircle ;
+ draw p ysized 1cm ;
+\stopuseMPgraphic
+
+\definelayer
+ [page]
+ [width=\paperwidth,
+ height=\paperheight]
+
+\setupbackgrounds
+ [leftpage]
+ [background=page]
+
+\setupbackgrounds
+ [rightpage]
+ [background=page]
+
+\definemeasure[banneroffset][\bottomspace-\footerheight-\footerdistance+2cm]
+
+\startsetups pagenumber:right
+ \setlayerframed
+ [page]
+ [preset=rightbottom,x=1.0cm,y=\measure{banneroffset}]
+ [frame=off,height=1cm,offset=overlay]
+ {\strut\useMPgraphic{luanumber}}
+ \setlayerframed
+ [page]
+ [preset=rightbottom,x=2.5cm,y=\measure{banneroffset}]
+ [frame=off,height=1cm,width=1cm,offset=overlay,
+ foregroundstyle=bold,foregroundcolor=maincolor]
+ {\strut\pagenumber}
+ \setlayerframed
+ [page]
+ [preset=rightbottom,x=3.5cm,y=\measure{banneroffset}]
+ [frame=off,height=1cm,offset=overlay,
+ foregroundstyle=bold,foregroundcolor=maincolor]
+ {\strut\getmarking[chapter]}
+\stopsetups
+
+\startsetups pagenumber:left
+ \setlayerframed
+ [page]
+ [preset=leftbottom,x=3.5cm,y=\measure{banneroffset}]
+ [frame=off,height=1cm,offset=overlay,
+ foregroundstyle=bold,foregroundcolor=maincolor]
+ {\strut\getmarking[chapter]}
+ \setlayerframed
+ [page]
+ [preset=leftbottom,x=2.5cm,y=\measure{banneroffset}]
+ [frame=off,height=1cm,width=1cm,offset=overlay,
+ foregroundstyle=bold,foregroundcolor=maincolor]
+ {\strut\pagenumber}
+ \setlayerframed
+ [page]
+ [preset=leftbottom,x=1.0cm,y=\measure{banneroffset}]
+ [frame=off,height=1cm,offset=overlay]
+ {\strut\useMPgraphic{luanumber}}
+\stopsetups
+
+\unexpanded\def\nonterminal#1>{\mathematics{\langle\hbox{\rm #1}\rangle}}
+
+% taco's brainwave -) .. todo: create a typing variant so that we can avoid the !crlf
+
+\newcatcodetable\syntaxcodetable
+
+\unexpanded\def\makesyntaxcodetable
+ {\begingroup
+ \catcode`\<=13 \catcode`\|=12
+ \catcode`\!= 0 \catcode`\\=12
+ \savecatcodetable\syntaxcodetable
+ \endgroup}
+
+\makesyntaxcodetable
+
+\unexpanded\def\startsyntax {\begingroup\catcodetable\syntaxcodetable \dostartsyntax}
+\unexpanded\def\syntax {\begingroup\catcodetable\syntaxcodetable \dosyntax}
+ \let\stopsyntax \relax
+
+\unexpanded\def\syntaxenvbody#1%
+ {\par
+ \tt
+ \startnarrower
+ % \maincolor
+ #1
+ \stopnarrower
+ \par}
+
+\unexpanded\def\syntaxbody#1%
+ {\begingroup
+ % \maincolor
+ \tt #1%
+ \endgroup}
+
+\bgroup \catcodetable\syntaxcodetable
+
+!gdef!dostartsyntax#1\stopsyntax{!let<!nonterminal!syntaxenvbody{#1}!endgroup}
+!gdef!dosyntax #1{!let<!nonterminal!syntaxbody{#1}!endgroup}
+
+!egroup
+
+\definetyping
+ [texsyntax]
+% [color=maincolor]
+
+% end of wave
+
+\setupinteraction
+ [state=start,
+ focus=standard,
+ style=,
+ color=,
+ contrastcolor=]
+
+\placebookmarks
+ [chapter,section,subsection]
+
+\setuplist
+ [chapter,section,subsection,subsubsection]
+ [interaction=all,
+ width=4em]
+
+\setuplist
+ [chapter]
+ [style=bold,
+ before={\testpage[4]\blank},
+ color=keptcolor]
+
+\setuplist
+ [section]
+ [before={\testpage[3]}]
+
+\setuplist
+ [subsection,subsubsection]
+ [margin=4em,
+ width=5em]
+
+\definestartstop
+ [notabene]
+ [style=slanted]
+
+\definestartstop
+ [preamble]
+ [style=normal,
+ before=\blank,
+ after=\blank]
+
+% Hans doesn't like the bookmarks opening by default so we comment this:
+%
+% \setupinteractionscreen
+% [option=bookmark]
+
+\startbuffer[stylecalculations]
+
+ \normalexpanded{\definemeasure[spinewidth] [0pt]}
+ \normalexpanded{\definemeasure[paperwidth] [\the\paperwidth ]}
+ \normalexpanded{\definemeasure[paperheight][\the\paperheight]}
+ \normalexpanded{\definemeasure[spreadwidth][\measure{paperwidth}]}
+
+\stopbuffer
+
+\getbuffer[stylecalculations]
+
+\dontcomplain
+
+\usemodule[abbreviations-mixed]
+
+\defineregister[topicindex]
+\defineregister[primitiveindex]
+\defineregister[callbackindex]
+\defineregister[nodeindex]
+\defineregister[libraryindex]
+
+\unexpanded\def\lpr#1{\doifmode{*bodypart}{\primitiveindex[#1]{\bf\tex {#1}}}\tex {#1}}
+\unexpanded\def\prm#1{\doifmode{*bodypart}{\primitiveindex[#1]{\tex {#1}}}\tex {#1}}
+\unexpanded\def\orm#1{\doifmode{*bodypart}{\primitiveindex[#1]{\tex {#1}}}\tex {#1}}
+\unexpanded\def\cbk#1{\doifmode{*bodypart}{\callbackindex [#1]{\type {#1}}}\type{#1}}
+\unexpanded\def\nod#1{\doifmode{*bodypart}{\nodeindex [#1]{\bf\type{#1}}}\type{#1}}
+\unexpanded\def\whs#1{\doifmode{*bodypart}{\nodeindex [#1]{\type {#1}}}\type{#1}}
+\unexpanded\def\noa#1{\doifmode{*bodypart}{\nodeindex [#1]{\type {#1}}}\type{#1}}
+
+\hyphenation{sub-nodes}
+
+\def\currentlibraryindex{\namedstructureuservariable{section}{library}}
+
+\setupregister
+ [alternative=a,
+ balance=no]
+
+\setupregister
+ [libraryindex]
+ [indicator=no,before=]
+
+\setupregister
+ [libraryindex]
+ [1]
+ [textstyle=\ttbf]
+
+\setupregister
+ [libraryindex]
+ [2]
+ [textstyle=\tttf]
+
+\unexpanded\def\lib #1{\doifmode{*bodypart}{\expanded{\libraryindex{\currentlibraryindex+#1}}}\type{\currentlibraryindex.#1}}
+\unexpanded\def\libindex#1{\doifmode{*bodypart}{\expanded{\libraryindex{\currentlibraryindex+#1}}}}
+\unexpanded\def\libidx#1#2{\doifmode{*bodypart}{\expanded{\libraryindex{#1+#2}}\type{#1.#2}}}
+\unexpanded\def\lix #1#2{\doifmode{*bodypart}{\expanded{\libraryindex{#1+#2}}}}
+
+% \setstructurepageregister[][keys:1=,entries:1=]
+
+\unexpanded\def\inlineluavalue#1%
+ {{\maincolor \ctxlua {
+ local t = #1
+ if type(t) == "table" then
+ t = string.gsub(table.serialize(t,false),"="," = ")
+ else
+ t = tostring(t)
+ end
+ context.typ(t)
+ }}}
+
+\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-tex.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-tex.tex
new file mode 100644
index 00000000000..25f70dd2f3e
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-tex.tex
@@ -0,0 +1,2481 @@
+% language=uk
+
+\environment luametatex-style
+
+\startcomponent luametatex-tex
+
+\startchapter[reference=tex,title={The \TEX\ related libraries}]
+
+\startsection[title={The \type {lua} library}][library=lua]
+
+\startsubsection[title={Version information}]
+
+\topicindex{libraries+\type{lua}}
+\topicindex{version}
+\topicindex{startupfile}
+
+\libindex{version}
+\libindex{startupfile}
+
+This library contains two read|-|only items:
+
+\starttyping
+<string> v = lua.version
+<string> s = lua.startupfile
+\stoptyping
+
+This returns the \LUA\ version identifier string. The value is currently
+\directlua {tex.print(lua.version)}.
+
+\stopsubsection
+
+\startsubsection[title={Table allocators}]
+
+\topicindex{tables}
+
+\libindex{newtable}
+\libindex{newindex}
+
+Sometimes performance (and memory usage) can benefit a little from
+it preallocating a table with \type {newtable}:
+
+\starttyping
+<table> t = lua.newtable(100,5000)
+\stoptyping
+
+This preallocates 100 hash entries and 5000 index entries. The \type
+{newindex} function create an indexed table with preset values:
+
+\starttyping
+<table> t = lua.newindex(2500,true)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={Bytecode registers}]
+
+\topicindex{bytecodes}
+\topicindex{registers+bytecodes}
+
+\libindex{bytecode}
+\libindex{setbytecode}
+\libindex{getbytecode}
+
+\LUA\ registers can be used to store \LUA\ code chunks. The accepted values for
+assignments are functions and \type {nil}. Likewise, the retrieved value is
+either a function or \type {nil}.
+
+\starttyping
+lua.bytecode[<number> n] = <function> f
+lua.bytecode[<number> n]()
+\stoptyping
+
+The contents of the \type {lua.bytecode} array is stored inside the format file
+as actual \LUA\ bytecode, so it can also be used to preload \LUA\ code. The
+function must not contain any upvalues. The associated function calls are:
+
+\startfunctioncall
+<function> f = lua.getbytecode(<number> n)
+lua.setbytecode(<number> n, <function> f)
+\stopfunctioncall
+
+Note: Since a \LUA\ file loaded using \type {loadfile(filename)} is essentially
+an anonymous function, a complete file can be stored in a bytecode register like
+this:
+
+\startfunctioncall
+lua.bytecode[n] = loadfile(filename)
+\stopfunctioncall
+
+Now all definitions (functions, variables) contained in the file can be
+created by executing this bytecode register:
+
+\startfunctioncall
+lua.bytecode[n]()
+\stopfunctioncall
+
+Note that the path of the file is stored in the \LUA\ bytecode to be used in
+stack backtraces and therefore dumped into the format file if the above code is
+used in \INITEX. If it contains private information, i.e. the user name, this
+information is then contained in the format file as well. This should be kept in
+mind when preloading files into a bytecode register in \INITEX.
+
+\stopsubsection
+
+\startsubsection[title={Chunk name registers}]
+
+\libindex{name}
+\libindex{setluaname}
+\libindex{getluaname}
+
+There is an array of 65536 (0--65535) potential chunk names for use with the
+\prm {directlua} and \lpr {latelua} primitives.
+
+\startfunctioncall
+lua.name[<number> n] = <string> s
+<string> s = lua.name[<number> n]
+\stopfunctioncall
+
+If you want to unset a \LUA\ name, you can assign \type {nil} to it. The function
+accessors are:
+
+\startfunctioncall
+lua.setluaname(<string> s,<number> n])
+<string> s = lua.getluaname(<number> n)
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={Introspection}]
+
+\libindex{getstacktop}
+\libindex{getruntime}
+\libindex{getcurrenttime}
+\libindex{getpreciseticks}
+\libindex{getpreciseseconds}
+
+The \type {getstacktop} function return a number indicating how full the \LUA\
+stack is. This function only makes sense as breakpoint when checking some
+mechanism going haywire.
+
+There are four time related helpers. The \type {getruntime} function returns the
+time passed since startup. The \type {getcurrenttime} does what its name says.
+Just play with them to see how it pays off. The \type {getpreciseticks} returns a
+number that can be used later, after a similar call, to get a difference. The
+\type {getpreciseseconds} function gets such a tick (delta) as argument and
+returns the number of seconds. Ticks can differ per operating system, but one
+always creates a reference first and then deltas to this reference.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={The \type {status} library}][library=status]
+
+\topicindex{libraries+\type{status}}
+
+\libindex{list}
+\libindex{resetmessages}
+\libindex{setexitcode}
+
+This contains a number of run|-|time configuration items that you may find useful
+in message reporting, as well as an iterator function that gets all of the names
+and values as a table.
+
+\startfunctioncall
+<table> info = status.list()
+\stopfunctioncall
+
+The keys in the table are the known items, the value is the current value. Almost
+all of the values in \type {status} are fetched through a metatable at run|-|time
+whenever they are accessed, so you cannot use \type {pairs} on \type {status},
+but you {\it can\/} use \type {pairs} on \type {info}, of course. If you do not
+need the full list, you can also ask for a single item by using its name as an
+index into \type {status}. The current list is:
+
+\starttabulate[|l|p|]
+\DB key \BC explanation \NC \NR
+\TB
+\NC \type{banner} \NC terminal display banner \NC \NR
+\NC \type{best_page_break} \NC the current best break (a node) \NC \NR
+\NC \type{buf_size} \NC current allocated size of the line buffer \NC \NR
+\NC \type{callbacks} \NC total number of executed callbacks so far \NC \NR
+\NC \type{cs_count} \NC number of control sequences \NC \NR
+\NC \type{dest_names_size} \NC \PDF\ destination table size \NC \NR
+\NC \type{dvi_gone} \NC written \DVI\ bytes \NC \NR
+\NC \type{dvi_ptr} \NC not yet written \DVI\ bytes \NC \NR
+\NC \type{dyn_used} \NC token (multi|-|word) memory in use \NC \NR
+\NC \type{filename} \NC name of the current input file \NC \NR
+\NC \type{fix_mem_end} \NC maximum number of used tokens \NC \NR
+\NC \type{fix_mem_min} \NC minimum number of allocated words for tokens \NC \NR
+\NC \type{fix_mem_max} \NC maximum number of allocated words for tokens \NC \NR
+\NC \type{font_ptr} \NC number of active fonts \NC \NR
+\NC \type{hash_extra} \NC extra allowed hash \NC \NR
+\NC \type{hash_size} \NC size of hash \NC \NR
+\NC \type{indirect_callbacks} \NC number of those that were themselves a result of other callbacks (e.g. file readers) \NC \NR
+\NC \type{ini_version} \NC \type {true} if this is an \INITEX\ run \NC \NR
+\NC \type{init_pool_ptr} \NC \INITEX\ string pool index \NC \NR
+\NC \type{init_str_ptr} \NC number of \INITEX\ strings \NC \NR
+\NC \type{input_ptr} \NC the level of input we're at \NC \NR
+\NC \type{inputid} \NC numeric id of the current input \NC \NR
+\NC \type{largest_used_mark} \NC max referenced marks class \NC \NR
+\NC \type{lasterrorcontext} \NC last error context string (with newlines) \NC \NR
+\NC \type{lasterrorstring} \NC last \TEX\ error string \NC \NR
+\NC \type{lastluaerrorstring} \NC last \LUA\ error string \NC \NR
+\NC \type{lastwarningstring} \NC last warning tag, normally an indication of in what part\NC \NR
+\NC \type{lastwarningtag} \NC last warning string\NC \NR
+\NC \type{linenumber} \NC location in the current input file \NC \NR
+\NC \type{log_name} \NC name of the log file \NC \NR
+\NC \type{luabytecode_bytes} \NC number of bytes in \LUA\ bytecode registers \NC \NR
+\NC \type{luabytecodes} \NC number of active \LUA\ bytecode registers \NC \NR
+\NC \type{luastate_bytes} \NC number of bytes in use by \LUA\ interpreters \NC \NR
+\NC \type{luatex_engine} \NC the \LUATEX\ engine identifier \NC \NR
+\NC \type{luatex_hashchars} \NC length to which \LUA\ hashes strings ($2^n$) \NC \NR
+\NC \type{luatex_hashtype} \NC the hash method used (in \LUAJITTEX) \NC \NR
+\NC \type{luatex_version} \NC the \LUATEX\ version number \NC \NR
+\NC \type{luatex_revision} \NC the \LUATEX\ revision string \NC \NR
+\NC \type{max_buf_stack} \NC max used buffer position \NC \NR
+\NC \type{max_in_stack} \NC max used input stack entries \NC \NR
+\NC \type{max_nest_stack} \NC max used nesting stack entries \NC \NR
+\NC \type{max_param_stack} \NC max used parameter stack entries \NC \NR
+\NC \type{max_save_stack} \NC max used save stack entries \NC \NR
+\NC \type{max_strings} \NC maximum allowed strings \NC \NR
+\NC \type{nest_size} \NC nesting stack size \NC \NR
+\NC \type{node_mem_usage} \NC a string giving insight into currently used nodes \NC \NR
+\NC \type{obj_ptr} \NC max \PDF\ object pointer \NC \NR
+\NC \type{obj_tab_size} \NC \PDF\ object table size \NC \NR
+\NC \type{output_active} \NC \type {true} if the \prm {output} routine is active \NC \NR
+\NC \type{output_file_name} \NC name of the \PDF\ or \DVI\ file \NC \NR
+\NC \type{param_size} \NC parameter stack size \NC \NR
+\NC \type{pdf_dest_names_ptr} \NC max \PDF\ destination pointer \NC \NR
+\NC \type{pdf_gone} \NC written \PDF\ bytes \NC \NR
+\NC \type{pdf_mem_ptr} \NC max \PDF\ memory used \NC \NR
+\NC \type{pdf_mem_size} \NC \PDF\ memory size \NC \NR
+\NC \type{pdf_os_cntr} \NC max \PDF\ object stream pointer \NC \NR
+\NC \type{pdf_os_objidx} \NC \PDF\ object stream index \NC \NR
+\NC \type{pdf_ptr} \NC not yet written \PDF\ bytes \NC \NR
+\NC \type{pool_ptr} \NC string pool index \NC \NR
+\NC \type{pool_size} \NC current size allocated for string characters \NC \NR
+\NC \type{save_size} \NC save stack size \NC \NR
+\NC \type{shell_escape} \NC \type {0} means disabled, \type {1} means anything is permitted, and \type {2} is restricted \NC \NR
+\NC \type{safer_option} \NC \type {1} means safer is enforced \NC \NR
+\NC \type{kpse_used} \NC \type {1} means that kpse is used \NC \NR
+\NC \type{stack_size} \NC input stack size \NC \NR
+\NC \type{str_ptr} \NC number of strings \NC \NR
+\NC \type{total_pages} \NC number of written pages \NC \NR
+\NC \type{var_mem_max} \NC number of allocated words for nodes \NC \NR
+\NC \type{var_used} \NC variable (one|-|word) memory in use \NC \NR
+\NC \type{lc_collate} \NC the value of \type {LC_COLLATE} at startup time (becomes \type {C} at startup) \NC \NR
+\NC \type{lc_ctype} \NC the value of \type {LC_CTYPE} at startup time (becomes \type {C} at startup) \NC \NR
+%NC \type{lc_monetary} \NC the value of \type {LC_MONETARY} at startup time \NC \NR
+\NC \type{lc_numeric} \NC the value of \type {LC_NUMERIC} at startup time \NC \NR
+%NC \type{lc_time} \NC the value of \type {LC_TIME} at startup time (becomes \type {C} at startup) \NC \NR
+\LL
+\stoptabulate
+
+The error and warning messages can be wiped with the \type {resetmessages}
+function. A return value can be set with \type {setexitcode}.
+
+\stopsection
+
+\startsection[title={The \type {tex} library}][library=tex]
+
+\startsubsection[title={Introduction}]
+
+\topicindex{libraries+\type{tex}}
+
+The \type {tex} table contains a large list of virtual internal \TEX\
+parameters that are partially writable.
+
+The designation \quote {virtual} means that these items are not properly defined
+in \LUA, but are only front\-ends that are handled by a metatable that operates
+on the actual \TEX\ values. As a result, most of the \LUA\ table operators (like
+\type {pairs} and \type {#}) do not work on such items.
+
+At the moment, it is possible to access almost every parameter that you can use
+after \prm {the}, is a single token or is sort of special in \TEX. This excludes
+parameters that need extra arguments, like \type {\the\scriptfont}. The subset
+comprising simple integer and dimension registers are writable as well as
+readable (like \prm {tracingcommands} and \prm {parindent}).
+
+\stopsubsection
+
+\startsubsection[title={Internal parameter values, \type {set} and \type {get}}]
+
+\topicindex{parameters+internal}
+
+\libindex{set} \libindex{get}
+
+For all the parameters in this section, it is possible to access them directly
+using their names as index in the \type {tex} table, or by using one of the
+functions \type {tex.get} and \type {tex.set}.
+
+The exact parameters and return values differ depending on the actual parameter,
+and so does whether \type {tex.set} has any effect. For the parameters that {\em
+can} be set, it is possible to use \type {global} as the first argument to \type
+{tex.set}; this makes the assignment global instead of local.
+
+\startfunctioncall
+tex.set (["global",] <string> n, ...)
+... = tex.get (<string> n)
+\stopfunctioncall
+
+Glue is kind of special because there are five values involved. The return value
+is a \nod {glue_spec} node but when you pass \type {false} as last argument to
+\type {tex.get} you get the width of the glue and when you pass \type {true} you
+get all five values. Otherwise you get a node which is a copy of the internal
+value so you are responsible for its freeing at the \LUA\ end. When you set a
+glue quantity you can either pass a \nod {glue_spec} or upto five numbers. If
+you pass \type {true} to \type {get} you get 5 values returned for a glue and
+when you pass \type {false} you only get the width returned.
+
+\subsubsection{Integer parameters}
+
+The integer parameters accept and return \LUA\ numbers. These are read|-|write:
+
+\starttwocolumns
+\starttyping
+tex.adjdemerits
+tex.binoppenalty
+tex.brokenpenalty
+tex.catcodetable
+tex.clubpenalty
+tex.day
+tex.defaulthyphenchar
+tex.defaultskewchar
+tex.delimiterfactor
+tex.displaywidowpenalty
+tex.doublehyphendemerits
+tex.endlinechar
+tex.errorcontextlines
+tex.escapechar
+tex.exhyphenpenalty
+tex.fam
+tex.finalhyphendemerits
+tex.floatingpenalty
+tex.globaldefs
+tex.hangafter
+tex.hbadness
+tex.holdinginserts
+tex.hyphenpenalty
+tex.interlinepenalty
+tex.language
+tex.lastlinefit
+tex.lefthyphenmin
+tex.linepenalty
+tex.localbrokenpenalty
+tex.localinterlinepenalty
+tex.looseness
+tex.mag
+tex.maxdeadcycles
+tex.month
+tex.newlinechar
+tex.outputpenalty
+tex.pausing
+tex.postdisplaypenalty
+tex.predisplaydirection
+tex.predisplaypenalty
+tex.pretolerance
+tex.relpenalty
+tex.righthyphenmin
+tex.savinghyphcodes
+tex.savingvdiscards
+tex.showboxbreadth
+tex.showboxdepth
+tex.time
+tex.tolerance
+tex.tracingassigns
+tex.tracingcommands
+tex.tracinggroups
+tex.tracingifs
+tex.tracinglostchars
+tex.tracingmacros
+tex.tracingnesting
+tex.tracingonline
+tex.tracingoutput
+tex.tracingpages
+tex.tracingparagraphs
+tex.tracingrestores
+tex.tracingscantokens
+tex.tracingstats
+tex.uchyph
+tex.vbadness
+tex.widowpenalty
+tex.year
+\stoptyping
+\stoptwocolumns
+
+These are read|-|only:
+
+\startthreecolumns
+\starttyping
+tex.deadcycles
+tex.insertpenalties
+tex.parshape
+tex.prevgraf
+tex.spacefactor
+\stoptyping
+\stopthreecolumns
+
+\subsubsection{Dimension parameters}
+
+The dimension parameters accept \LUA\ numbers (signifying scaled points) or
+strings (with included dimension). The result is always a number in scaled
+points. These are read|-|write:
+
+\startthreecolumns
+\starttyping
+tex.boxmaxdepth
+tex.delimitershortfall
+tex.displayindent
+tex.displaywidth
+tex.emergencystretch
+tex.hangindent
+tex.hfuzz
+tex.hoffset
+tex.hsize
+tex.lineskiplimit
+tex.mathsurround
+tex.maxdepth
+tex.nulldelimiterspace
+tex.overfullrule
+tex.pagebottomoffset
+tex.pageheight
+tex.pageleftoffset
+tex.pagerightoffset
+tex.pagetopoffset
+tex.pagewidth
+tex.parindent
+tex.predisplaysize
+tex.scriptspace
+tex.splitmaxdepth
+tex.vfuzz
+tex.voffset
+tex.vsize
+tex.prevdepth
+tex.prevgraf
+tex.spacefactor
+\stoptyping
+\stopthreecolumns
+
+These are read|-|only:
+
+\startthreecolumns
+\starttyping
+tex.pagedepth
+tex.pagefilllstretch
+tex.pagefillstretch
+tex.pagefilstretch
+tex.pagegoal
+tex.pageshrink
+tex.pagestretch
+tex.pagetotal
+\stoptyping
+\stopthreecolumns
+
+Beware: as with all \LUA\ tables you can add values to them. So, the following is
+valid:
+
+\starttyping
+tex.foo = 123
+\stoptyping
+
+When you access a \TEX\ parameter a look up takes place. For read||only variables
+that means that you will get something back, but when you set them you create a
+new entry in the table thereby making the original invisible.
+
+There are a few special cases that we make an exception for: \type {prevdepth},
+\type {prevgraf} and \type {spacefactor}. These normally are accessed via the
+\type {tex.nest} table:
+
+\starttyping
+tex.nest[tex.nest.ptr].prevdepth = p
+tex.nest[tex.nest.ptr].spacefactor = s
+\stoptyping
+
+However, the following also works:
+
+\starttyping
+tex.prevdepth = p
+tex.spacefactor = s
+\stoptyping
+
+Keep in mind that when you mess with node lists directly at the \LUA\ end you
+might need to update the top of the nesting stack's \type {prevdepth} explicitly
+as there is no way \LUATEX\ can guess your intentions. By using the accessor in
+the \type {tex} tables, you get and set the values at the top of the nesting
+stack.
+
+\subsubsection{Direction parameters}
+
+The direction states can be queried and set with:
+
+\startthreecolumns
+\starttyping
+tex.gettextdir()
+tex.getlinedir()
+tex.getmathdir()
+tex.getpardir()
+tex.settextdir(<number>)
+tex.setlinedir(<number>)
+tex.setmathdir(<number>)
+tex.setpardir(<number>)
+\stoptyping
+\stopthreecolumns
+
+and also with:
+
+\startthreecolumns
+\starttyping
+tex.textdirection
+tex.linedirection
+tex.mathdirection
+tex.pardirection
+\stoptyping
+\stopthreecolumns
+
+
+\subsubsection{Glue parameters}
+
+The glue parameters accept and return a userdata object that represents a \nod {glue_spec} node.
+
+\startthreecolumns
+\starttyping
+tex.abovedisplayshortskip
+tex.abovedisplayskip
+tex.baselineskip
+tex.belowdisplayshortskip
+tex.belowdisplayskip
+tex.leftskip
+tex.lineskip
+tex.parfillskip
+tex.parskip
+tex.rightskip
+tex.spaceskip
+tex.splittopskip
+tex.tabskip
+tex.topskip
+tex.xspaceskip
+\stoptyping
+\stopthreecolumns
+
+\subsubsection{Muglue parameters}
+
+All muglue parameters are to be used read|-|only and return a \LUA\ string.
+
+\startthreecolumns
+\starttyping
+tex.medmuskip
+tex.thickmuskip
+tex.thinmuskip
+\stoptyping
+\stopthreecolumns
+
+\subsubsection{Tokenlist parameters}
+
+The tokenlist parameters accept and return \LUA\ strings. \LUA\ strings are
+converted to and from token lists using \prm {the} \prm {toks} style expansion:
+all category codes are either space (10) or other (12). It follows that assigning
+to some of these, like \quote {tex.output}, is actually useless, but it feels bad
+to make exceptions in view of a coming extension that will accept full|-|blown
+token strings.
+
+\startthreecolumns
+\starttyping
+tex.errhelp
+tex.everycr
+tex.everydisplay
+tex.everyeof
+tex.everyhbox
+tex.everyjob
+tex.everymath
+tex.everypar
+tex.everyvbox
+tex.output
+\stoptyping
+\stopthreecolumns
+
+\stopsubsection
+
+\startsubsection[title={Convert commands}]
+
+\topicindex{convert commands}
+
+All \quote {convert} commands are read|-|only and return a \LUA\ string. The
+supported commands at this moment are:
+
+\starttwocolumns
+\starttyping
+tex.formatname
+tex.jobname
+tex.luatexbanner
+tex.luatexrevision
+tex.fontname(number)
+tex.uniformdeviate(number)
+tex.number(number)
+tex.romannumeral(number)
+tex.fontidentifier(number)
+\stoptyping
+\stoptwocolumns
+
+If you are wondering why this list looks haphazard; these are all the cases of
+the \quote {convert} internal command that do not require an argument, as well as
+the ones that require only a simple numeric value. The special (\LUA|-|only) case
+of \type {tex.fontidentifier} returns the \type {csname} string that matches a
+font id number (if there is one).
+
+\stopsubsection
+
+\startsubsection[title={Last item commands}]
+
+\topicindex{last items}
+
+All \quote {last item} commands are read|-|only and return a number. The
+supported commands at this moment are:
+
+\startthreecolumns
+\starttyping
+tex.lastpenalty
+tex.lastkern
+tex.lastskip
+tex.lastnodetype
+tex.inputlineno
+tex.lastxpos
+tex.lastypos
+tex.randomseed
+tex.luatexversion
+tex.currentgrouplevel
+tex.currentgrouptype
+tex.currentiflevel
+tex.currentiftype
+tex.currentifbranch
+\stoptyping
+\stopthreecolumns
+
+\stopsubsection
+
+\startsubsection[title={Accessing registers: \type {set*}, \type {get*} and \type {is*}}]
+
+\topicindex{attributes}
+\topicindex{registers}
+
+\libindex{attribute} \libindex{setattribute} \libindex{getattribute} \libindex{isattribute}
+\libindex{count} \libindex{setcount} \libindex{getcount} \libindex{iscount}
+\libindex{dimen} \libindex{setdimen} \libindex{getdimen} \libindex{isdimen}
+\libindex{skip} \libindex{setskip} \libindex{getskip} \libindex{isskip}
+\libindex{muskip} \libindex{setmuskip} \libindex{getmuskip} \libindex{ismuskip}
+\libindex{glue} \libindex{setglue} \libindex{getglue} \libindex{isglue}
+\libindex{muglue} \libindex{setmuglue} \libindex{getmuglue} \libindex{ismuglue}
+\libindex{toks} \libindex{settoks} \libindex{gettoks} \libindex{istoks}
+\libindex{box} \libindex{setbox} \libindex{getbox} \libindex{isbox}
+
+\libindex{scantoks}
+
+\TEX's attributes (\lpr {attribute}), counters (\prm {count}), dimensions (\prm
+{dimen}), skips (\prm {skip}, \prm {muskip}) and token (\prm {toks}) registers
+can be accessed and written to using two times five virtual sub|-|tables of the
+\type {tex} table:
+
+\startthreecolumns
+\starttyping
+tex.attribute
+tex.count
+tex.dimen
+tex.skip
+tex.glue
+tex.muskip
+tex.muglue
+tex.toks
+\stoptyping
+\stopthreecolumns
+
+It is possible to use the names of relevant \lpr {attributedef}, \prm {countdef},
+\prm {dimendef}, \prm {skipdef}, or \prm {toksdef} control sequences as indices
+to these tables:
+
+\starttyping
+tex.count.scratchcounter = 0
+enormous = tex.dimen['maxdimen']
+\stoptyping
+
+In this case, \LUATEX\ looks up the value for you on the fly. You have to use a
+valid \prm {countdef} (or \lpr {attributedef}, or \prm {dimendef}, or \prm
+{skipdef}, or \prm {toksdef}), anything else will generate an error (the intent
+is to eventually also allow \type {<chardef tokens>} and even macros that expand
+into a number).
+
+\startitemize
+
+ \startitem
+ The count registers accept and return \LUA\ numbers.
+ \stopitem
+
+ \startitem
+ The dimension registers accept \LUA\ numbers (in scaled points) or
+ strings (with an included absolute dimension; \type {em} and \type {ex}
+ and \type {px} are forbidden). The result is always a number in scaled
+ points.
+ \stopitem
+
+ \startitem
+ The token registers accept and return \LUA\ strings. \LUA\ strings are
+ converted to and from token lists using \prm {the} \prm {toks} style
+ expansion: all category codes are either space (10) or other (12).
+ \stopitem
+
+ \startitem
+ The skip registers accept and return \nod {glue_spec} userdata node
+ objects (see the description of the node interface elsewhere in this
+ manual).
+ \stopitem
+
+ \startitem
+ The glue registers are just skip registers but instead of userdata
+ are verbose.
+ \stopitem
+
+ \startitem
+ Like the counts, the attribute registers accept and return \LUA\ numbers.
+ \stopitem
+
+\stopitemize
+
+As an alternative to array addressing, there are also accessor functions defined
+for all cases, for example, here is the set of possibilities for \prm {skip}
+registers:
+
+\startfunctioncall
+tex.setskip (["global",] <number> n, <node> s)
+tex.setskip (["global",] <string> s, <node> s)
+<node> s = tex.getskip (<number> n)
+<node> s = tex.getskip (<string> s)
+\stopfunctioncall
+
+We have similar setters for \type {count}, \type {dimen}, \type {muskip}, and
+\type {toks}. Counters and dimen are represented by numbers, skips and muskips by
+nodes, and toks by strings.
+
+Again the glue variants are not using the \nod {glue-spec} userdata nodes. The
+\type {setglue} function accepts upto 5 arguments: width, stretch, shrink,
+stretch order and shrink order and the \type {getglue} function reports them,
+unless the second argument is \type {false} in which care only the width is
+returned.
+
+Here is an example usign a threesome:
+
+\startfunctioncall
+local d = tex.getdimen("foo")
+if tex.isdimen("bar") then
+ tex.setdimen("bar",d)
+end
+\stopfunctioncall
+
+There are six extra skip (glue) related helpers:
+
+\startfunctioncall
+tex.setglue (["global"], <number> n,
+ width, stretch, shrink, stretch_order, shrink_order)
+tex.setglue (["global"], <string> s,
+ width, stretch, shrink, stretch_order, shrink_order)
+width, stretch, shrink, stretch_order, shrink_order =
+ tex.getglue (<number> n)
+width, stretch, shrink, stretch_order, shrink_order =
+ tex.getglue (<string> s)
+\stopfunctioncall
+
+The other two are \type {tex.setmuglue} and \type {tex.getmuglue}.
+
+There are such helpers for \type {dimen}, \type {count}, \type {skip}, \type
+{muskip}, \type {box} and \type {attribute} registers but the glue ones
+are special because they have to deal with more properties.
+
+As with the general \type {get} and \type {set} function discussed before, for
+the skip registers \type {getskip} returns a node and \type {getglue} returns
+numbers, while \type {setskip} accepts a node and \type {setglue} expects upto 5
+numbers. Again, when you pass \type {false} as second argument to \type {getglue}
+you only get the width returned. The same is true for the \type {mu} variants
+\type {getmuskip}, \type {setmuskip}, \type {getmuskip} and\type {setmuskip}.
+
+For tokens registers we have an alternative where a catcode table is specified:
+
+\startfunctioncall
+tex.scantoks(0,3,"$e=mc^2$")
+tex.scantoks("global",0,3,"$\int\limits^1_2$")
+\stopfunctioncall
+
+In the function-based interface, it is possible to define values globally by
+using the string \type {global} as the first function argument.
+
+\stopsubsection
+
+\startsubsection[title={Character code registers: \type {[get|set]*code[s]}}]
+
+\topicindex{characters+codes}
+
+\libindex{lccode} \libindex{setlccode} \libindex{getlccode}
+\libindex{uccode} \libindex{setuccode} \libindex{getuccode}
+\libindex{sfcode} \libindex{setsfcode} \libindex{getsfcode}
+\libindex{catcode} \libindex{setcatcode} \libindex{getcatcode}
+\libindex{mathcode} \libindex{setmathcode} \libindex{getmathcode}
+\libindex{delcode} \libindex{setdelcode} \libindex{getdelcode}
+
+\libindex{setdelcodes} \libindex{getdelcodes}
+\libindex{setmathcodes} \libindex{getmathcodes}
+
+\TEX's character code tables (\prm {lccode}, \prm {uccode}, \prm {sfcode}, \prm
+{catcode}, \prm {mathcode}, \prm {delcode}) can be accessed and written to using
+six virtual subtables of the \type {tex} table
+
+\startthreecolumns
+\starttyping
+tex.lccode
+tex.uccode
+tex.sfcode
+tex.catcode
+tex.mathcode
+tex.delcode
+\stoptyping
+\stopthreecolumns
+
+The function call interfaces are roughly as above, but there are a few twists.
+\type {sfcode}s are the simple ones:
+
+\startfunctioncall
+tex.setsfcode (["global",] <number> n, <number> s)
+<number> s = tex.getsfcode (<number> n)
+\stopfunctioncall
+
+The function call interface for \type {lccode} and \type {uccode} additionally
+allows you to set the associated sibling at the same time:
+
+\startfunctioncall
+tex.setlccode (["global"], <number> n, <number> lc)
+tex.setlccode (["global"], <number> n, <number> lc, <number> uc)
+<number> lc = tex.getlccode (<number> n)
+tex.setuccode (["global"], <number> n, <number> uc)
+tex.setuccode (["global"], <number> n, <number> uc, <number> lc)
+<number> uc = tex.getuccode (<number> n)
+\stopfunctioncall
+
+The function call interface for \type {catcode} also allows you to specify a
+category table to use on assignment or on query (default in both cases is the
+current one):
+
+\startfunctioncall
+tex.setcatcode (["global"], <number> n, <number> c)
+tex.setcatcode (["global"], <number> cattable, <number> n, <number> c)
+<number> lc = tex.getcatcode (<number> n)
+<number> lc = tex.getcatcode (<number> cattable, <number> n)
+\stopfunctioncall
+
+The interfaces for \type {delcode} and \type {mathcode} use small array tables to
+set and retrieve values:
+
+\startfunctioncall
+tex.setmathcode (["global"], <number> n, <table> mval )
+<table> mval = tex.getmathcode (<number> n)
+tex.setdelcode (["global"], <number> n, <table> dval )
+<table> dval = tex.getdelcode (<number> n)
+\stopfunctioncall
+
+Where the table for \type {mathcode} is an array of 3 numbers, like this:
+
+\starttyping
+{
+ <number> class,
+ <number> family,
+ <number> character
+}
+\stoptyping
+
+And the table for \type {delcode} is an array with 4 numbers, like this:
+
+\starttyping
+{
+ <number> small_fam,
+ <number> small_char,
+ <number> large_fam,
+ <number> large_char
+}
+\stoptyping
+
+You can also avoid the table:
+
+\startfunctioncall
+tex.setmathcode (["global"], <number> n, <number> class,
+ <number> family, <number> character)
+class, family, char =
+ tex.getmathcodes (<number> n)
+tex.setdelcode (["global"], <number> n, <number> smallfam,
+ <number> smallchar, <number> largefam, <number> largechar)
+smallfam, smallchar, largefam, largechar =
+ tex.getdelcodes (<number> n)
+\stopfunctioncall
+
+Normally, the third and fourth values in a delimiter code assignment will be zero
+according to \lpr {Udelcode} usage, but the returned table can have values there
+(if the delimiter code was set using \prm {delcode}, for example). Unset \type
+{delcode}'s can be recognized because \type {dval[1]} is $-1$.
+
+\stopsubsection
+
+\startsubsection[title={Box registers: \type {[get|set]box}}]
+
+\topicindex{registers}
+\topicindex{boxes}
+
+\libindex{box}
+\libindex{setbox} \libindex{getbox}
+
+It is possible to set and query actual boxes, coming for instance from \prm
+{hbox}, \prm {vbox} or \prm {vtop}, using the node interface as defined in the
+\type {node} library:
+
+\starttyping
+tex.box
+\stoptyping
+
+for array access, or
+
+\starttyping
+tex.setbox(["global",] <number> n, <node> s)
+tex.setbox(["global",] <string> cs, <node> s)
+<node> n = tex.getbox(<number> n)
+<node> n = tex.getbox(<string> cs)
+\stoptyping
+
+for function|-|based access. In the function-based interface, it is possible to
+define values globally by using the string \type {global} as the first function
+argument.
+
+Be warned that an assignment like
+
+\starttyping
+tex.box[0] = tex.box[2]
+\stoptyping
+
+does not copy the node list, it just duplicates a node pointer. If \type {\box2}
+will be cleared by \TEX\ commands later on, the contents of \type {\box0} becomes
+invalid as well. To prevent this from happening, always use \type
+{node.copy_list} unless you are assigning to a temporary variable:
+
+\starttyping
+tex.box[0] = node.copy_list(tex.box[2])
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {triggerbuildpage}}]
+
+\topicindex{pages}
+
+\libindex{triggerbuildpage}
+
+You should not expect to much from the \type {triggerbuildpage} helpers because
+often \TEX\ doesn't do much if it thinks nothing has to be done, but it might be
+useful for some applications. It just does as it says it calls the internal
+function that build a page, given that there is something to build.
+
+\stopsubsection
+
+\startsubsection[title={\type {splitbox}}]
+
+\topicindex{boxes+split}
+
+\libindex{splitbox}
+
+You can split a box:
+
+\starttyping
+local vlist = tex.splitbox(n,height,mode)
+\stoptyping
+
+The remainder is kept in the original box and a packaged vlist is returned. This
+operation is comparable to the \prm {vsplit} operation. The mode can be \type
+{additional} or \type {exactly} and concerns the split off box.
+
+\stopsubsection
+
+\startsubsection[title={Accessing math parameters: \type {[get|set]math}}]
+
+\topicindex{math+parameters}
+\topicindex{parameters+math}
+
+\libindex{setmath}
+\libindex{getmath}
+
+It is possible to set and query the internal math parameters using:
+
+\startfunctioncall
+tex.setmath(["global",] <string> n, <string> t, <number> n)
+<number> n = tex.getmath(<string> n, <string> t)
+\stopfunctioncall
+
+As before an optional first parameter \type {global} indicates a global
+assignment.
+
+The first string is the parameter name minus the leading \quote {Umath}, and the
+second string is the style name minus the trailing \quote {style}. Just to be
+complete, the values for the math parameter name are:
+
+\starttyping
+quad axis operatorsize
+overbarkern overbarrule overbarvgap
+underbarkern underbarrule underbarvgap
+radicalkern radicalrule radicalvgap
+radicaldegreebefore radicaldegreeafter radicaldegreeraise
+stackvgap stacknumup stackdenomdown
+fractionrule fractionnumvgap fractionnumup
+fractiondenomvgap fractiondenomdown fractiondelsize
+limitabovevgap limitabovebgap limitabovekern
+limitbelowvgap limitbelowbgap limitbelowkern
+underdelimitervgap underdelimiterbgap
+overdelimitervgap overdelimiterbgap
+subshiftdrop supshiftdrop subshiftdown
+subsupshiftdown subtopmax supshiftup
+supbottommin supsubbottommax subsupvgap
+spaceafterscript connectoroverlapmin
+ordordspacing ordopspacing ordbinspacing ordrelspacing
+ordopenspacing ordclosespacing ordpunctspacing ordinnerspacing
+opordspacing opopspacing opbinspacing oprelspacing
+opopenspacing opclosespacing oppunctspacing opinnerspacing
+binordspacing binopspacing binbinspacing binrelspacing
+binopenspacing binclosespacing binpunctspacing bininnerspacing
+relordspacing relopspacing relbinspacing relrelspacing
+relopenspacing relclosespacing relpunctspacing relinnerspacing
+openordspacing openopspacing openbinspacing openrelspacing
+openopenspacing openclosespacing openpunctspacing openinnerspacing
+closeordspacing closeopspacing closebinspacing closerelspacing
+closeopenspacing closeclosespacing closepunctspacing closeinnerspacing
+punctordspacing punctopspacing punctbinspacing punctrelspacing
+punctopenspacing punctclosespacing punctpunctspacing punctinnerspacing
+innerordspacing inneropspacing innerbinspacing innerrelspacing
+inneropenspacing innerclosespacing innerpunctspacing innerinnerspacing
+\stoptyping
+
+The values for the style parameter are:
+
+\starttyping
+display crampeddisplay
+text crampedtext
+script crampedscript
+scriptscript crampedscriptscript
+\stoptyping
+
+The value is either a number (representing a dimension or number) or a glue spec
+node representing a muskip for \type {ordordspacing} and similar spacing
+parameters.
+
+\stopsubsection
+
+\startsubsection[title={Special list heads: \type {[get|set]list}}]
+
+\topicindex{lists}
+
+\libindex{lists}
+\libindex{setlist}
+\libindex{getlist}
+
+The virtual table \type {tex.lists} contains the set of internal registers that
+keep track of building page lists.
+
+\starttabulate[|l|p|]
+\DB field \BC explanation \NC \NR
+\TB
+\NC \type{page_ins_head} \NC circular list of pending insertions \NC \NR
+\NC \type{contrib_head} \NC the recent contributions \NC \NR
+\NC \type{page_head} \NC the current page content \NC \NR
+%NC \type{temp_head} \NC \NC \NR
+\NC \type{hold_head} \NC used for held-over items for next page \NC \NR
+\NC \type{adjust_head} \NC head of the current \prm {vadjust} list \NC \NR
+\NC \type{pre_adjust_head} \NC head of the current \type {\vadjust pre} list \NC \NR
+%NC \type{align_head} \NC \NC \NR
+\NC \type{page_discards_head} \NC head of the discarded items of a page break \NC \NR
+\NC \type{split_discards_head} \NC head of the discarded items in a vsplit \NC \NR
+\LL
+\stoptabulate
+
+The getter and setter functions are \type {getlist} and \type {setlist}. You have
+to be careful with what you set as \TEX\ can have expectations with regards to
+how a list is constructed or in what state it is.
+
+\stopsubsection
+
+\startsubsection[title={Semantic nest levels: \type {getnest} and \type {ptr}}]
+
+\topicindex{nesting}
+
+\libindex{nest}
+\libindex{ptr}
+%libindex{setnest} % only a message
+\libindex{getnest}
+
+The virtual table \type {nest} contains the currently active semantic nesting
+state. It has two main parts: a zero-based array of userdata for the semantic
+nest itself, and the numerical value \type {ptr}, which gives the highest
+available index. Neither the array items in \type {nest[]} nor \type {ptr} can be
+assigned to (as this would confuse the typesetting engine beyond repair), but you
+can assign to the individual values inside the array items, e.g.\ \type
+{tex.nest[tex.nest.ptr].prevdepth}.
+
+\type {tex.nest[tex.nest.ptr]} is the current nest state, \type {nest[0]} the
+outermost (main vertical list) level. The getter function is \type {getnest}. You
+can pass a number (which gives you a list), nothing or \type {top}, which returns
+the topmost list, or the string \type {ptr} which gives you the index of the
+topmost list.
+
+The known fields are:
+
+\starttabulate[|l|l|l|p|]
+\DB key \BC type \BC modes \BC explanation \NC \NR
+\TB
+\NC \type{mode} \NC number \NC all \NC the meaning of these numbers depends on the engine
+ and sometimes even the version; you can use \typ
+ {tex.getmodevalues()} to get the mapping: positive
+ values signal vertical, horizontal and math mode,
+ while negative values indicate inner and inline
+ variants \NC \NR
+\NC \type{modeline} \NC number \NC all \NC source input line where this mode was entered in,
+ negative inside the output routine \NC \NR
+\NC \type{head} \NC node \NC all \NC the head of the current list \NC \NR
+\NC \type{tail} \NC node \NC all \NC the tail of the current list \NC \NR
+\NC \type{prevgraf} \NC number \NC vmode \NC number of lines in the previous paragraph \NC \NR
+\NC \type{prevdepth} \NC number \NC vmode \NC depth of the previous paragraph \NC \NR
+\NC \type{spacefactor} \NC number \NC hmode \NC the current space factor \NC \NR
+\NC \type{dirs} \NC node \NC hmode \NC used for temporary storage by the line break algorithm\NC \NR
+\NC \type{noad} \NC node \NC mmode \NC used for temporary storage of a pending fraction numerator,
+ for \prm {over} etc. \NC \NR
+\NC \type{delimptr} \NC node \NC mmode \NC used for temporary storage of the previous math delimiter,
+ for \prm {middle} \NC \NR
+\NC \type{mathdir} \NC boolean \NC mmode \NC true when during math processing the \lpr {mathdir} is not
+ the same as the surrounding \lpr {textdir} \NC \NR
+\NC \type{mathstyle} \NC number \NC mmode \NC the current \lpr {mathstyle} \NC \NR
+\LL
+\stoptabulate
+
+When a second string argument is given to the \type {getnest}, the value with
+that name is returned. Of course the level must be valid. When \type {setnest}
+gets a third argument that value is assigned to the field given as second
+argument.
+
+\stopsubsection
+
+\startsubsection[reference=sec:luaprint,title={Print functions}]
+
+\topicindex{printing}
+
+The \type {tex} table also contains the three print functions that are the major
+interface from \LUA\ scripting to \TEX. The arguments to these three functions
+are all stored in an in|-|memory virtual file that is fed to the \TEX\ scanner as
+the result of the expansion of \prm {directlua}.
+
+The total amount of returnable text from a \prm {directlua} command is only
+limited by available system \RAM. However, each separate printed string has to
+fit completely in \TEX's input buffer. The result of using these functions from
+inside callbacks is undefined at the moment.
+
+\subsubsection{\type {print}}
+
+\libindex{print}
+
+\startfunctioncall
+tex.print(<string> s, ...)
+tex.print(<number> n, <string> s, ...)
+tex.print(<table> t)
+tex.print(<number> n, <table> t)
+\stopfunctioncall
+
+Each string argument is treated by \TEX\ as a separate input line. If there is a
+table argument instead of a list of strings, this has to be a consecutive array
+of strings to print (the first non-string value will stop the printing process).
+
+The optional parameter can be used to print the strings using the catcode regime
+defined by \lpr {catcodetable}~\type {n}. If \type {n} is $-1$, the currently
+active catcode regime is used. If \type {n} is $-2$, the resulting catcodes are
+the result of \prm {the} \prm {toks}: all category codes are 12 (other) except for
+the space character, that has category code 10 (space). Otherwise, if \type {n}
+is not a valid catcode table, then it is ignored, and the currently active
+catcode regime is used instead.
+
+The very last string of the very last \type {tex.print} command in a \prm
+{directlua} will not have the \prm {endlinechar} appended, all others do.
+
+\subsubsection{\type {sprint}}
+
+\libindex{sprint}
+
+\startfunctioncall
+tex.sprint(<string> s, ...)
+tex.sprint(<number> n, <string> s, ...)
+tex.sprint(<table> t)
+tex.sprint(<number> n, <table> t)
+\stopfunctioncall
+
+Each string argument is treated by \TEX\ as a special kind of input line that
+makes it suitable for use as a partial line input mechanism:
+
+\startitemize[packed]
+\startitem
+ \TEX\ does not switch to the \quote {new line} state, so that leading spaces
+ are not ignored.
+\stopitem
+\startitem
+ No \prm {endlinechar} is inserted.
+\stopitem
+\startitem
+ Trailing spaces are not removed. Note that this does not prevent \TEX\ itself
+ from eating spaces as result of interpreting the line. For example, in
+
+ \starttyping
+ before\directlua{tex.sprint("\\relax")tex.sprint(" inbetween")}after
+ \stoptyping
+
+ the space before \type {in between} will be gobbled as a result of the \quote
+ {normal} scanning of \prm {relax}.
+\stopitem
+\stopitemize
+
+If there is a table argument instead of a list of strings, this has to be a
+consecutive array of strings to print (the first non-string value will stop the
+printing process).
+
+The optional argument sets the catcode regime, as with \type {tex.print}. This
+influences the string arguments (or numbers turned into strings).
+
+Although this needs to be used with care, you can also pass token or node
+userdata objects. These get injected into the stream. Tokens had best be valid
+tokens, while nodes need to be around when they get injected. Therefore it is
+important to realize the following:
+
+\startitemize
+\startitem
+ When you inject a token, you need to pass a valid token userdata object. This
+ object will be collected by \LUA\ when it no longer is referenced. When it gets
+ printed to \TEX\ the token itself gets copied so there is no interference with the
+ \LUA\ garbage collection. You manage the object yourself. Because tokens are
+ actually just numbers, there is no real extra overhead at the \TEX\ end.
+\stopitem
+\startitem
+ When you inject a node, you need to pass a valid node userdata object. The
+ node related to the object will not be collected by \LUA\ when it no longer
+ is referenced. It lives on at the \TEX\ end in its own memory space. When it
+ gets printed to \TEX\ the node reference is used assuming that node stays
+ around. There is no \LUA\ garbage collection involved. Again, you manage the
+ object yourself. The node itself is freed when \TEX\ is done with it.
+\stopitem
+\stopitemize
+
+If you consider the last remark you might realize that we have a problem when a
+printed mix of strings, tokens and nodes is reused. Inside \TEX\ the sequence
+becomes a linked list of input buffers. So, \type {"123"} or \type {"\foo{123}"}
+gets read and parsed on the fly, while \typ {<token userdata>} already is
+tokenized and effectively is a token list now. A \typ {<node userdata>} is also
+tokenized into a token list but it has a reference to a real node. Normally this
+goes fine. But now assume that you store the whole lot in a macro: in that case
+the tokenized node can be flushed many times. But, after the first such flush the
+node is used and its memory freed. You can prevent this by using copies which is
+controlled by setting \lpr {luacopyinputnodes} to a non|-|zero value. This is one
+of these fuzzy areas you have to live with if you really mess with these low
+level issues.
+
+\subsubsection{\type {tprint}}
+
+\libindex{tprint}
+
+\startfunctioncall
+tex.tprint({<number> n, <string> s, ...}, {...})
+\stopfunctioncall
+
+This function is basically a shortcut for repeated calls to \type
+{tex.sprint(<number> n, <string> s, ...)}, once for each of the supplied argument
+tables.
+
+\subsubsection{\type {cprint}}
+
+\libindex{cprint}
+
+This function takes a number indicating the to be used catcode, plus either a
+table of strings or an argument list of strings that will be pushed into the
+input stream.
+
+\startfunctioncall
+tex.cprint( 1," 1: $&{\\foo}") tex.print("\\par") -- a lot of \bgroup s
+tex.cprint( 2," 2: $&{\\foo}") tex.print("\\par") -- matching \egroup s
+tex.cprint( 9," 9: $&{\\foo}") tex.print("\\par") -- all get ignored
+tex.cprint(10,"10: $&{\\foo}") tex.print("\\par") -- all become spaces
+tex.cprint(11,"11: $&{\\foo}") tex.print("\\par") -- letters
+tex.cprint(12,"12: $&{\\foo}") tex.print("\\par") -- other characters
+tex.cprint(14,"12: $&{\\foo}") tex.print("\\par") -- comment triggers
+\stopfunctioncall
+
+% \subsubsection{\type {write}, \type {twrite}, \type {nwrite}}
+\subsubsection{\type {write}}
+
+\libindex{write}
+% \libindex{twrite}
+% \libindex{nwrite}
+
+\startfunctioncall
+tex.write(<string> s, ...)
+tex.write(<table> t)
+\stopfunctioncall
+
+Each string argument is treated by \TEX\ as a special kind of input line that
+makes it suitable for use as a quick way to dump information:
+
+\startitemize
+\item All catcodes on that line are either \quote{space} (for '~') or \quote
+ {character} (for all others).
+\item There is no \prm {endlinechar} appended.
+\stopitemize
+
+If there is a table argument instead of a list of strings, this has to be a
+consecutive array of strings to print (the first non-string value will stop the
+printing process).
+
+% The functions \type {twrite} and \type {nwrite} can be used to write a token or
+% node back to \TEX\, possibly intermixed with regular strings that will be
+% tokenized. You have to make sure that you pass the right data because sometimes
+% \TEX\ has expectations that need to be met.
+
+\stopsubsection
+
+\startsubsection[title={Helper functions}]
+
+\subsubsection{\type {round}}
+
+\topicindex {helpers}
+
+\libindex{round}
+
+\startfunctioncall
+<number> n = tex.round(<number> o)
+\stopfunctioncall
+
+Rounds \LUA\ number \type {o}, and returns a number that is in the range of a
+valid \TEX\ register value. If the number starts out of range, it generates a
+\quote {number too big} error as well.
+
+\subsubsection{\type {scale}}
+
+\libindex{scale}
+
+\startfunctioncall
+<number> n = tex.scale(<number> o, <number> delta)
+<table> n = tex.scale(table o, <number> delta)
+\stopfunctioncall
+
+Multiplies the \LUA\ numbers \type {o} and \nod {delta}, and returns a rounded
+number that is in the range of a valid \TEX\ register value. In the table
+version, it creates a copy of the table with all numeric top||level values scaled
+in that manner. If the multiplied number(s) are of range, it generates
+\quote{number too big} error(s) as well.
+
+Note: the precision of the output of this function will depend on your computer's
+architecture and operating system, so use with care! An interface to \LUATEX's
+internal, 100\% portable scale function will be added at a later date.
+
+\subsubsection{\type {number} and \type {romannumeral}}
+
+\libindex{number}
+\libindex{romannumeral}
+
+These are the companions to the primitives \prm {number} and \prm
+{romannumeral}. They can be used like:
+
+\startfunctioncall
+tex.print(tex.romannumeral(123))
+\stopfunctioncall
+
+\subsubsection{\type {fontidentifier} and \type {fontname}}
+
+\libindex{fontidentifier}
+\libindex{fontname}
+
+The first one returns the name only, the second one reports the size too.
+
+\startfunctioncall
+tex.print(tex.fontname(tex.fontname))
+tex.print(tex.fontname(tex.fontidentidier))
+\stopfunctioncall
+
+\subsubsection{\type {sp}}
+
+\libindex{sp}
+
+\startfunctioncall
+<number> n = tex.sp(<number> o)
+<number> n = tex.sp(<string> s)
+\stopfunctioncall
+
+Converts the number \type {o} or a string \type {s} that represents an explicit
+dimension into an integer number of scaled points.
+
+For parsing the string, the same scanning and conversion rules are used that
+\LUATEX\ would use if it was scanning a dimension specifier in its \TEX|-|like
+input language (this includes generating errors for bad values), expect for the
+following:
+
+\startitemize[n]
+\startitem
+ only explicit values are allowed, control sequences are not handled
+\stopitem
+\startitem
+ infinite dimension units (\type {fil...}) are forbidden
+\stopitem
+\startitem
+ \type {mu} units do not generate an error (but may not be useful either)
+\stopitem
+\stopitemize
+
+\subsubsection{\type {tex.getlinenumber} and \type {tex.setlinenumber}}
+
+\libindex{getlinenumber}
+\libindex{setlinenumber}
+
+You can mess with the current line number:
+
+\startfunctioncall
+local n = tex.getlinenumber()
+tex.setlinenumber(n+10)
+\stopfunctioncall
+
+which can be shortcut to:
+
+\startfunctioncall
+tex.setlinenumber(10,true)
+\stopfunctioncall
+
+This might be handy when you have a callback that read numbers from a file and
+combines them in one line (in which case an error message probably has to refer
+to the original line). Interference with \TEX's internal handling of numbers is
+of course possible.
+
+\subsubsection{\type {error}, \type {show_context} and \type {gethelptext}}
+
+\topicindex{errors}
+
+\libindex{error}
+\libindex{show_context}
+\libindex{gethelptext}
+
+\startfunctioncall
+tex.error(<string> s)
+tex.error(<string> s, <table> help)
+<string> s = tex.gethelptext()
+\stopfunctioncall
+
+This creates an error somewhat like the combination of \prm {errhelp} and \prm
+{errmessage} would. During this error, deletions are disabled.
+
+The array part of the \type {help} table has to contain strings, one for each
+line of error help.
+
+In case of an error the \type {show_context} function will show the current
+context where we're at (in the expansion).
+
+\subsubsection{\type {getfamilyoffont}}
+
+\libindex {getfamilyoffont}
+
+When you pass a proper family identifier the next helper will return the font
+currently associated with it.
+
+\startfunctioncall
+<integer> id = font.getfamilyoffont(<integer> fam)
+\stopfunctioncall
+
+\subsubsection{\type {[set|get]interaction}}
+
+\libindex{setinteraction}
+\libindex{getinteraction}
+
+The engine can in one of four modes:
+
+\starttabulate[|lT|l|pl|]
+\DB value \NC mode \BC meaning \NC \NR
+\TB
+\NC 0 \NC batch \NC omits all stops and omits terminal output \NC \NR
+\NC 1 \NC nonstop \NC omits all stops \NC \NR
+\NC 2 \NC scroll \NC omits error stops \NC \NR
+\NC 3 \NC errorstop \NC stops at every opportunity to interact \NC \NR
+\LL
+\stoptabulate
+
+The mode can be queried and set with:
+
+\startfunctioncall
+<integer> i = tex.getinteraction()
+tex.setinteraction(<integer> i)
+\stopfunctioncall
+
+\subsubsection{\type {runtoks} and \type {quittoks}}
+
+Because of the fact that \TEX\ is in a complex dance of expanding, dealing with
+fonts, typesetting paragraphs, messing around with boxes, building pages, and so
+on, you cannot easily run a nested \TEX\ run (read nested main loop). However,
+there is an option to force a local run with \type {runtoks}. The content of the
+given token list register gets expanded locally after which we return to where we
+triggered this expansion, at the \LUA\ end. Instead a function can get passed
+that does some work. You have to make sure that at the end \TEX\ is in a sane
+state and this is not always trivial. A more complex mechanism would complicate
+\TEX\ itself (and probably also harm performance) so this simple local expansion
+loop has to do.
+
+\startfunctioncall
+tex.runtoks(<token register>)
+tex.runtoks(<lua function>)
+tex.runtoks(<macro name>)
+tex.runtoks(<register name>)
+\stopfunctioncall
+
+When the \prm {tracingnesting} parameter is set to a value larger than~2 some
+information is reported about the state of the local loop. The return value indicates
+an error:
+
+\starttabulate[|lT|pl|]
+\DB value \NC meaning \NC \NR
+\TB
+\NC 0 \NC no error \NC \NR
+\NC 1 \NC bad register number \NC \NR
+\NC 2 \NC unknown macro or register name \NC \NR
+\NC 3 \NC macro is unsuitable for runtoks (has arguments) \NC \NR
+\LL
+\stoptabulate
+
+This function has two optional arguments in case a token register is passed:
+
+\startfunctioncall
+tex.runtoks(<token register>,force,grouped)
+\stopfunctioncall
+
+Inside for instance an \type {\edef} the \type {runtoks} function behaves (at
+least tries to) like it were an \type {\the}. This prevents unwanted side
+effects: normally in such an definition tokens remain tokens and (for instance)
+characters don't become nodes. With the second argument you can force the local
+main loop, no matter what. The third argument adds a level of grouping.
+
+You can quit the local loop with \type {\endlocalcontrol} or from the \LUA\ end
+with \type {tex.quittoks}. In that case you end one level up! Of course in the
+end that can mean that you arrive at the main level in which case an extra end
+will trigger a redundancy warning (not an abort!).
+
+\subsubsection{\type {forcehmode}}
+
+\libindex{forcehmode}
+
+An example of a (possible error triggering) complication is that \TEX\ expects to
+be in some state, say horizontal mode, and you have to make sure it is when you
+start feeding back something from \LUA\ into \TEX. Normally a user will not run
+into issues but when you start writing tokens or nodes or have a nested run there
+can be situations that you need to run \type {forcehmode}. There is no recipe for
+this and intercepting possible cases would weaken \LUATEX's flexibility.
+
+\subsubsection{\type {hashtokens}}
+
+\libindex{hashtokens}
+
+\topicindex{hash}
+
+\startfunctioncall
+for i,v in pairs (tex.hashtokens()) do ... end
+\stopfunctioncall
+
+Returns a list of names. This can be useful for debugging, but note that this
+also reports control sequences that may be unreachable at this moment due to
+local redefinitions: it is strictly a dump of the hash table. You can use \type
+{token.create} to inspect properties, for instance when the \type {command} key
+in a created table equals \type {123}, you have the \type {cmdname} value \type
+{undefined_cs}.
+
+\subsubsection{\type {definefont}}
+
+\topicindex{fonts+defining}
+
+\libindex{definefont}
+
+\startfunctioncall
+tex.definefont(<string> csname, <number> fontid)
+tex.definefont(<boolean> global, <string> csname, <number> fontid)
+\stopfunctioncall
+
+Associates \type {csname} with the internal font number \type {fontid}. The
+definition is global if (and only if) \type {global} is specified and true (the
+setting of \type {globaldefs} is not taken into account).
+
+\stopsubsection
+
+\startsubsection[reference=luaprimitives,title={Functions for dealing with primitives}]
+
+\subsubsection{\type {enableprimitives}}
+
+\libindex{enableprimitives}
+
+\topicindex{initialization}
+\topicindex{primitives}
+
+\startfunctioncall
+tex.enableprimitives(<string> prefix, <table> primitive names)
+\stopfunctioncall
+
+This function accepts a prefix string and an array of primitive names. For each
+combination of \quote {prefix} and \quote {name}, the \type
+{tex.enableprimitives} first verifies that \quote {name} is an actual primitive
+(it must be returned by one of the \type {tex.extraprimitives} calls explained
+below, or part of \TEX82, or \prm {directlua}). If it is not, \type
+{tex.enableprimitives} does nothing and skips to the next pair.
+
+But if it is, then it will construct a csname variable by concatenating the
+\quote {prefix} and \quote {name}, unless the \quote {prefix} is already the
+actual prefix of \quote {name}. In the latter case, it will discard the \quote
+{prefix}, and just use \quote {name}.
+
+Then it will check for the existence of the constructed csname. If the csname is
+currently undefined (note: that is not the same as \prm {relax}), it will
+globally define the csname to have the meaning: run code belonging to the
+primitive \quote {name}. If for some reason the csname is already defined, it
+does nothing and tries the next pair.
+
+An example:
+
+\starttyping
+tex.enableprimitives('LuaTeX', {'formatname'})
+\stoptyping
+
+will define \type {\LuaTeXformatname} with the same intrinsic meaning as the
+documented primitive \lpr {formatname}, provided that the control sequences \type
+{\LuaTeXformatname} is currently undefined.
+
+When \LUATEX\ is run with \type {--ini} only the \TEX82 primitives and \prm
+{directlua} are available, so no extra primitives {\bf at all}.
+
+If you want to have all the new functionality available using their default
+names, as it is now, you will have to add
+
+\starttyping
+\ifx\directlua\undefined \else
+ \directlua {tex.enableprimitives('',tex.extraprimitives ())}
+\fi
+\stoptyping
+
+near the beginning of your format generation file. Or you can choose different
+prefixes for different subsets, as you see fit.
+
+Calling some form of \type {tex.enableprimitives} is highly important though,
+because if you do not, you will end up with a \TEX82-lookalike that can run \LUA\
+code but not do much else. The defined csnames are (of course) saved in the
+format and will be available at runtime.
+
+\subsubsection{\type {extraprimitives}}
+
+\libindex{extraprimitives}
+
+\startfunctioncall
+<table> t = tex.extraprimitives(<string> s, ...)
+\stopfunctioncall
+
+This function returns a list of the primitives that originate from the engine(s)
+given by the requested string value(s). The possible values and their (current)
+return values are given in the following table. In addition the somewhat special
+primitives \quote{\tex{ }}, \quote{\tex {/}} and \quote{\type {-}} are defined.
+
+\startluacode
+function document.showprimitives(tag)
+ local t = tex.extraprimitives(tag)
+ table.sort(t)
+ for i=1,#t do
+ local v = t[i]
+ if v ~= ' ' and v ~= "/" and v ~= "-" then
+ context.type(v)
+ context.space()
+ end
+ end
+end
+\stopluacode
+
+\starttabulate[|l|pl|]
+\DB name \BC values \NC \NR
+\TB
+\NC tex \NC \ctxlua{document.showprimitives('tex') } \NC \NR
+\NC core \NC \ctxlua{document.showprimitives('core') } \NC \NR
+\NC etex \NC \ctxlua{document.showprimitives('etex') } \NC \NR
+\NC luatex \NC \ctxlua{document.showprimitives('luatex') } \NC \NR
+\LL
+\stoptabulate
+
+Note that \type {luatex} does not contain \type {directlua}, as that is
+considered to be a core primitive, along with all the \TEX82 primitives, so it is
+part of the list that is returned from \type {'core'}.
+
+Running \type {tex.extraprimitives} will give you the complete list of
+primitives \type {-ini} startup. It is exactly equivalent to \type
+{tex.extraprimitives("etex","luatex")}.
+
+\subsubsection{\type {primitives}}
+
+\libindex{primitives}
+
+\startfunctioncall
+<table> t = tex.primitives()
+\stopfunctioncall
+
+This function returns a list of all primitives that \LUATEX\ knows about.
+
+\stopsubsection
+
+\startsubsection[title={Core functionality interfaces}]
+
+\subsubsection{\type {badness}}
+
+\libindex{badness}
+
+\startfunctioncall
+<number> b = tex.badness(<number> t, <number> s)
+\stopfunctioncall
+
+This helper function is useful during linebreak calculations. \type {t} and \type
+{s} are scaled values; the function returns the badness for when total \type {t}
+is supposed to be made from amounts that sum to \type {s}. The returned number is
+a reasonable approximation of \mathematics {100(t/s)^3};
+
+\subsubsection{\type {tex.resetparagraph}}
+
+\topicindex {paragraphs+reset}
+
+\libindex{resetparagraph}
+
+This function resets the parameters that \TEX\ normally resets when a new paragraph
+is seen.
+
+\subsubsection{\type {linebreak}}
+
+\topicindex {linebreaks}
+
+\libindex{linebreak}
+
+\startfunctioncall
+local <node> nodelist, <table> info =
+ tex.linebreak(<node> listhead, <table> parameters)
+\stopfunctioncall
+
+The understood parameters are as follows:
+
+\starttabulate[|l|l|p|]
+\DB name \BC type \BC explanation \NC \NR
+\TB
+\NC \type{pardir} \NC string \NC \NC \NR
+\NC \type{pretolerance} \NC number \NC \NC \NR
+\NC \type{tracingparagraphs} \NC number \NC \NC \NR
+\NC \type{tolerance} \NC number \NC \NC \NR
+\NC \type{looseness} \NC number \NC \NC \NR
+\NC \type{hyphenpenalty} \NC number \NC \NC \NR
+\NC \type{exhyphenpenalty} \NC number \NC \NC \NR
+\NC \type{pdfadjustspacing} \NC number \NC \NC \NR
+\NC \type{adjdemerits} \NC number \NC \NC \NR
+\NC \type{pdfprotrudechars} \NC number \NC \NC \NR
+\NC \type{linepenalty} \NC number \NC \NC \NR
+\NC \type{lastlinefit} \NC number \NC \NC \NR
+\NC \type{doublehyphendemerits} \NC number \NC \NC \NR
+\NC \type{finalhyphendemerits} \NC number \NC \NC \NR
+\NC \type{hangafter} \NC number \NC \NC \NR
+\NC \type{interlinepenalty} \NC number or table \NC if a table, then it is an array like \prm {interlinepenalties} \NC \NR
+\NC \type{clubpenalty} \NC number or table \NC if a table, then it is an array like \prm {clubpenalties} \NC \NR
+\NC \type{widowpenalty} \NC number or table \NC if a table, then it is an array like \prm {widowpenalties} \NC \NR
+\NC \type{brokenpenalty} \NC number \NC \NC \NR
+\NC \type{emergencystretch} \NC number \NC in scaled points \NC \NR
+\NC \type{hangindent} \NC number \NC in scaled points \NC \NR
+\NC \type{hsize} \NC number \NC in scaled points \NC \NR
+\NC \type{leftskip} \NC glue_spec node \NC \NC \NR
+\NC \type{rightskip} \NC glue_spec node \NC \NC \NR
+\NC \type{parshape} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+Note that there is no interface for \prm {displaywidowpenalties}, you have to
+pass the right choice for \type {widowpenalties} yourself.
+
+It is your own job to make sure that \type {listhead} is a proper paragraph list:
+this function does not add any nodes to it. To be exact, if you want to replace
+the core line breaking, you may have to do the following (when you are not
+actually working in the \cbk {pre_linebreak_filter} or \cbk {linebreak_filter}
+callbacks, or when the original list starting at listhead was generated in
+horizontal mode):
+
+\startitemize
+\startitem
+ add an \quote {indent box} and perhaps a \nod {local_par} node at the start
+ (only if you need them)
+\stopitem
+\startitem
+ replace any found final glue by an infinite penalty (or add such a penalty,
+ if the last node is not a glue)
+\stopitem
+\startitem
+ add a glue node for the \prm {parfillskip} after that penalty node
+\stopitem
+\startitem
+ make sure all the \type {prev} pointers are OK
+\stopitem
+\stopitemize
+
+The result is a node list, it still needs to be vpacked if you want to assign it
+to a \prm {vbox}. The returned \type {info} table contains four values that are
+all numbers:
+
+\starttabulate[|l|p|]
+\DB name \BC explanation \NC \NR
+\TB
+\NC prevdepth \NC depth of the last line in the broken paragraph \NC \NR
+\NC prevgraf \NC number of lines in the broken paragraph \NC \NR
+\NC looseness \NC the actual looseness value in the broken paragraph \NC \NR
+\NC demerits \NC the total demerits of the chosen solution \NC \NR
+\LL
+\stoptabulate
+
+Note there are a few things you cannot interface using this function: You cannot
+influence font expansion other than via \type {pdfadjustspacing}, because the
+settings for that take place elsewhere. The same is true for hbadness and hfuzz
+etc. All these are in the \type {hpack} routine, and that fetches its own
+variables via globals.
+
+\subsubsection{\type {shipout}}
+
+\topicindex {shipout}
+
+\libindex{shipout}
+
+\startfunctioncall
+tex.shipout(<number> n)
+\stopfunctioncall
+
+Ships out box number \type {n} to the output file, and clears the box register.
+
+\subsubsection{\type {getpagestate}}
+
+\topicindex {pages}
+
+\libindex{getpagestate}
+
+This helper reports the current page state: \type {empty}, \type {box_there} or
+\type {inserts_only} as integer value.
+
+\subsubsection{\type {getlocallevel}}
+
+\topicindex {nesting}
+
+\libindex{getlocallevel}
+
+This integer reports the current level of the local loop. It's only useful for
+debugging and the (relative state) numbers can change with the implementation.
+
+\stopsubsection
+
+\startsubsection[title={Randomizers}]
+
+\libindex{lua_math_random}
+\libindex{lua_math_randomseed}
+\libindex{init_rand}
+\libindex{normal_rand}
+\libindex{uniform_rand}
+\libindex{uniformdeviate}
+
+For practical reasons \LUATEX\ has its own random number generator. The original
+\LUA\ random function is available as \typ {tex.lua_math_random}. You can
+initialize with a new seed with \type {init_rand} (\typ {lua_math_randomseed} is
+equivalent to this one.
+
+There are three generators: \type {normal_rand} (no argument is used), \type
+{uniform_rand} (takes a number that will get rounded before being used) and \type
+{uniformdeviate} which behaves like the primitive and expects a scaled integer, so
+
+\startfunctioncall
+tex.print(tex.uniformdeviate(65536)/65536)
+\stopfunctioncall
+
+will give a random number between zero and one.
+
+\stopsubsection
+
+\startsubsection[reference=synctex,title={Functions related to synctex}]
+
+\topicindex {synctex}
+
+\libindex{set_synctex_mode} \libindex{get_synctex_mode}
+\libindex{set_synctex_no_files}
+\libindex{set_synctex_tag} \libindex{get_synctex_tag} \libindex{force_synctex_tag}
+\libindex{set_synctex_line} \libindex{get_synctex_line} \libindex{force_synctex_line}
+
+The next helpers only make sense when you implement your own synctex logic. Keep in
+mind that the library used in editors assumes a certain logic and is geared for
+plain and \LATEX, so after a decade users expect a certain behaviour.
+
+\starttabulate[|l|p|]
+\DB name \BC explanation \NC \NR
+\TB
+\NC \type{set_synctex_mode} \NC \type {0} is the default and used normal synctex
+ logic, \type {1} uses the values set by the next
+ helpers while \type {2} also sets these for glyph
+ nodes; \type{3} sets glyphs and glue and \type {4}
+ sets only glyphs \NC \NR
+\NC \type{set_synctex_tag} \NC set the current tag (file) value (obeys save stack) \NC \NR
+\NC \type{set_synctex_line} \NC set the current line value (obeys save stack) \NC \NR
+\NC \type{set_synctex_no_files} \NC disable synctex file logging \NC \NR
+\NC \type{get_synctex_mode} \NC returns the current mode (for values see above) \NC \NR
+\NC \type{get_synctex_tag} \NC get the currently set value of tag (file) \NC \NR
+\NC \type{get_synctex_line} \NC get the currently set value of line \NC \NR
+\NC \type{force_synctex_tag} \NC overload the tag (file) value (\type {0} resets) \NC \NR
+\NC \type{force_synctex_line} \NC overload the line value (\type {0} resets) \NC \NR
+\LL
+\stoptabulate
+
+The last one is somewhat special. Due to the way files are registered in \SYNCTEX\ we need
+to explicitly disable that feature if we provide our own alternative if we want to avoid
+that overhead. Passing a value of 1 disables registering.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={The \type {texconfig} table},reference=texconfig][library=texconfig]
+
+\topicindex{libraries+\type{texconfig}}
+
+\topicindex {configuration}
+
+This is a table that is created empty. A startup \LUA\ script could fill this
+table with a number of settings that are read out by the executable after loading
+and executing the startup file.
+
+\starttabulate[|l|l|l|]
+\DB key \BC type \BC default \NC \NR
+\TB
+\NC \type{max_strings} \NC number \NC 100000 \NC \NR
+\NC \type{strings_free} \NC number \NC 100 \NC \NR
+\NC \type{nest_size} \NC number \NC 50 \NC \NR
+\NC \type{max_in_open} \NC number \NC 100 \NC \NR
+\NC \type{param_size} \NC number \NC 60 \NC \NR
+\NC \type{save_size} \NC number \NC 5000 \NC \NR
+\NC \type{stack_size} \NC number \NC 500 \NC \NR
+\NC \type{expand_depth} \NC number \NC 1000 \NC \NR
+\NC \type{function_size} \NC number \NC 0 \NC \NR
+\NC \type{error_line} \NC number \NC 79 \NC \NR
+\NC \type{half_error_line} \NC number \NC 50 \NC \NR
+\NC \type{hash_extra} \NC number \NC 0 \NC \NR
+\NC \type{formatname} \NC string \NC \NC \NR
+\NC \type{jobname} \NC string \NC \NC \NR
+\LL
+\stoptabulate
+
+If no format name or jobname is given on the command line, the related keys will
+be tested first instead of simply quitting.
+
+\stopsection
+
+\startsection[title={The \type {texio} library}][library=texio]
+
+\topicindex{libraries+\type{texio}}
+\topicindex{\IO}
+
+This library takes care of the low|-|level I/O interface: writing to the log file
+and|/|or console.
+
+\startsubsection[title={\type {write}}]
+
+\libindex{write}
+
+\startfunctioncall
+texio.write(<string> target, <string> s, ...)
+texio.write(<string> s, ...)
+\stopfunctioncall
+
+Without the \type {target} argument, writes all given strings to the same
+location(s) \TEX\ writes messages to at this moment. If \prm {batchmode} is in
+effect, it writes only to the log, otherwise it writes to the log and the
+terminal. The optional \type {target} can be one of three possibilities: \type
+{term}, \type {log} or \type {term and log}.
+
+Note: If several strings are given, and if the first of these strings is or might
+be one of the targets above, the \type {target} must be specified explicitly to
+prevent \LUA\ from interpreting the first string as the target.
+
+\stopsubsection
+
+\startsubsection[title={\type {write_nl}}]
+
+\libindex{write_nl}
+
+\startfunctioncall
+texio.write_nl(<string> target, <string> s, ...)
+texio.write_nl(<string> s, ...)
+\stopfunctioncall
+
+This function behaves like \type {texio.write}, but make sure that the given
+strings will appear at the beginning of a new line. You can pass a single empty
+string if you only want to move to the next line.
+
+\stopsubsection
+
+\startsubsection[title={\type {setescape}}]
+
+\libindex{setescape}
+
+You can disable \type {^^} escaping of control characters by passing a value of
+zero.
+
+\stopsubsection
+
+\startsubsection[title={\type {closeinput}}]
+
+\libindex{closeinput}
+
+This function that should be used with care. It acts as \prm {endinput} but at
+the \LUA\ end. You can use it to (sort of) force a jump back to \TEX. Normally a
+\LUA\ will just collect prints and at the end bump an input level and flush these
+prints. This function can help you stay at the current level but you need to know
+what you're doing (or more precise: what \TEX\ is doing with input).
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={The \type {token} library}][library=token]
+
+\startsubsection[title={The scanner}]
+
+\topicindex{libraries+\type{token}}
+\topicindex{tokens}
+
+\libindex{scan_keyword}
+\libindex{scan_keywordcs}
+\libindex{scan_int}
+\libindex{scan_real}
+\libindex{scan_float}
+\libindex{scan_dimen}
+\libindex{scan_glue}
+\libindex{scan_toks}
+\libindex{scan_code}
+\libindex{scan_string}
+\libindex{scan_argument}
+\libindex{scan_word}
+\libindex{scan_csname}
+\libindex{scan_list}
+
+The token library provides means to intercept the input and deal with it at the
+\LUA\ level. The library provides a basic scanner infrastructure that can be used
+to write macros that accept a wide range of arguments. This interface is on
+purpose kept general and as performance is quite ok. One can build additional
+parsers without too much overhead. It's up to macro package writers to see how
+they can benefit from this as the main principle behind \LUATEX\ is to provide a
+minimal set of tools and no solutions. The scanner functions are probably the
+most intriguing.
+
+\starttabulate[|l|l|p|]
+\DB function \BC argument \BC result \NC \NR
+\TB
+\NC \type{scan_keyword} \NC string \NC returns true if the given keyword is gobbled; as with
+ the regular \TEX\ keyword scanner this is case insensitive
+ (and \ASCII\ based) \NC \NR
+\NC \type{scan_keywordcs} \NC string \NC returns true if the given keyword is gobbled; this variant
+ is case sensitive and also suitable for \UTF8 \NC \NR
+\NC \type{scan_int} \NC \NC returns an integer \NC \NR
+\NC \type{scan_real} \NC \NC returns a number from e.g.\ \type {1}, \type {1.1}, \type {.1} with optional collapsed signs \NC \NR
+\NC \type{scan_float} \NC \NC returns a number from e.g.\ \type {1}, \type {1.1}, \type {.1}, \type {1.1E10}, , \type {.1e-10} with optional collapsed signs \NC \NR
+\NC \type{scan_dimen} \NC infinity, mu-units \NC returns a number representing a dimension and or two numbers being the filler and order \NC \NR
+\NC \type{scan_glue} \NC mu-units \NC returns a glue spec node \NC \NR
+\NC \type{scan_toks} \NC definer, expand \NC returns a table of tokens tokens \NC \NR
+\NC \type{scan_code} \NC bitset \NC returns a character if its category is in the given bitset (representing catcodes) \NC \NR
+\NC \type{scan_string} \NC \NC returns a string given between \type {{}}, as \type {\macro} or as sequence of characters with catcode 11 or 12 \NC \NR
+\NC \type{scan_argument} \NC \NC this one is simular to \type {scanstring} but also accepts a \type {\cs}
+ (which then get expanded) \NC \NR
+\NC \type{scan_word} \NC \NC returns a sequence of characters with catcode 11 or 12 as string \NC \NR
+\NC \type{scan_csname} \NC \NC returns \type {foo} after scanning \type {\foo} \NC \NR
+\NC \type{scan_list} \NC \NC picks up a box specification and returns a \type {[h|v]list} node \NC \NR
+\LL
+\stoptabulate
+
+The scanners can be considered stable apart from the one scanning for a token.
+The \type {scan_code} function takes an optional number, the \type {keyword}
+function a normal \LUA\ string. The \type {infinity} boolean signals that we also
+permit \type {fill} as dimension and the \type {mu-units} flags the scanner that
+we expect math units. When scanning tokens we can indicate that we are defining a
+macro, in which case the result will also provide information about what
+arguments are expected and in the result this is separated from the meaning by a
+separator token. The \type {expand} flag determines if the list will be expanded.
+
+The string scanner scans for something between curly braces and expands on the
+way, or when it sees a control sequence it will return its meaning. Otherwise it
+will scan characters with catcode \type {letter} or \type {other}. So, given the
+following definition:
+
+\startbuffer
+\def\bar{bar}
+\def\foo{foo-\bar}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+we get:
+
+\starttabulate[|l|Tl|l|]
+\DB name \BC result \NC \NR
+\TB
+\NC \type {\directlua{token.scan_string()}{foo}} \NC \directlua{context("{\\red\\type {"..token.scan_string().."}}")} {foo} \NC full expansion \NC \NR
+\NC \type {\directlua{token.scan_string()}foo} \NC \directlua{context("{\\red\\type {"..token.scan_string().."}}")} foo \NC letters and others \NC \NR
+\NC \type {\directlua{token.scan_string()}\foo} \NC \directlua{context("{\\red\\type {"..token.scan_string().."}}")}\foo \NC meaning \NC \NR
+\LL
+\stoptabulate
+
+The \type {\foo} case only gives the meaning, but one can pass an already
+expanded definition (\prm {edef}'d). In the case of the braced variant one can of
+course use the \prm {detokenize} and \prm {unexpanded} primitives since there we
+do expand.
+
+The \type {scan_word} scanner can be used to implement for instance a number scanner:
+
+\starttyping
+function token.scan_number(base)
+ return tonumber(token.scan_word(),base)
+end
+\stoptyping
+
+This scanner accepts any valid \LUA\ number so it is a way to pick up floats
+in the input.
+
+You can use the \LUA\ interface as follows:
+
+\starttyping
+\directlua {
+ function mymacro(n)
+ ...
+ end
+}
+
+\def\mymacro#1{%
+ \directlua {
+ mymacro(\number\dimexpr#1)
+ }%
+}
+
+\mymacro{12pt}
+\mymacro{\dimen0}
+\stoptyping
+
+You can also do this:
+
+\starttyping
+\directlua {
+ function mymacro()
+ local d = token.scan_dimen()
+ ...
+ end
+}
+
+\def\mymacro{%
+ \directlua {
+ mymacro()
+ }%
+}
+
+\mymacro 12pt
+\mymacro \dimen0
+\stoptyping
+
+It is quite clear from looking at the code what the first method needs as
+argument(s). For the second method you need to look at the \LUA\ code to see what
+gets picked up. Instead of passing from \TEX\ to \LUA\ we let \LUA\ fetch from
+the input stream.
+
+In the first case the input is tokenized and then turned into a string, then it
+is passed to \LUA\ where it gets interpreted. In the second case only a function
+call gets interpreted but then the input is picked up by explicitly calling the
+scanner functions. These return proper \LUA\ variables so no further conversion
+has to be done. This is more efficient but in practice (given what \TEX\ has to
+do) this effect should not be overestimated. For numbers and dimensions it saves
+a bit but for passing strings conversion to and from tokens has to be done anyway
+(although we can probably speed up the process in later versions if needed).
+
+\stopsubsection
+
+\startsubsection[title={Picking up one token}]
+
+\libindex {get_next}
+\libindex {scan_token}
+\libindex {expand}
+
+The scanners look for a sequence. When you want to pick up one token from the
+input you use \type {get_next}. This creates a token with the (low level)
+properties as discussed next. This token is just the next one. If you want to
+enforce expansion first you can use \type {scan_token}. Internally tokens are
+characterized by a number that packs a lot of information. In order to access
+the bits of information a token is wrapped in a userdata object.
+
+The \type {expand} function will trigger expansion of the next token in the
+input. This can be quite unpredictable but when you call it you probably know
+enough about \TEX\ not to be too worried about that. It basically is a call to
+the internal expand related function.
+
+\stopsubsection
+
+\startsubsection[title={Creating tokens}]
+
+\libindex{create}
+\libindex{new}
+
+\libindex{is_defined}
+\libindex{is_token}
+\libindex{biggest_char}
+
+\libindex{commands}
+\libindex{command_id}
+
+\libindex{get_command}
+\libindex{get_cmdname}
+\libindex{get_csname}
+\libindex{get_id}
+\libindex{get_active}
+\libindex{get_expandable}
+\libindex{get_protected}
+\libindex{get_mode}
+\libindex{get_index}
+\libindex{get_tok}
+
+\libindex{get_next}
+
+The creator function can be used as follows:
+
+\starttyping
+local t = token.create("relax")
+\stoptyping
+
+This gives back a token object that has the properties of the \prm {relax}
+primitive. The possible properties of tokens are:
+
+\starttabulate[|l|p|]
+\DB name \BC explanation \NC \NR
+\TB
+\NC \type {command} \NC a number representing the internal command number \NC \NR
+\NC \type {cmdname} \NC the type of the command (for instance the catcode in case of a
+ character or the classifier that determines the internal
+ treatment \NC \NR
+\NC \type {csname} \NC the associated control sequence (if applicable) \NC \NR
+\NC \type {id} \NC the unique id of the token \NC \NR
+\NC \type {tok} \NC the full token number as stored in \TEX \NC \NR
+\NC \type {active} \NC a boolean indicating the active state of the token \NC \NR
+\NC \type {expandable} \NC a boolean indicating if the token (macro) is expandable \NC \NR
+\NC \type {protected} \NC a boolean indicating if the token (macro) is protected \NC \NR
+\NC \type {mode} \NC a number either representing a character or another entity \NC \NR
+\NC \type {index} \NC a number running from 0x0000 upto 0xFFFF indicating a \TEX\ register index \NC \NR
+\LL
+\stoptabulate
+
+Alternatively you can use a getter \type {get_<fieldname>} to access a property
+of a token.
+
+The numbers that represent a catcode are the same as in \TEX\ itself, so using
+this information assumes that you know a bit about \TEX's internals. The other
+numbers and names are used consistently but are not frozen. So, when you use them
+for comparing you can best query a known primitive or character first to see the
+values.
+
+You can ask for a list of commands:
+
+\starttyping
+local t = token.commands()
+\stoptyping
+
+The id of a token class can be queried as follows:
+
+\starttyping
+local id = token.command_id("math_shift")
+\stoptyping
+
+If you really know what you're doing you can create character tokens by not
+passing a string but a number:
+
+\starttyping
+local letter_x = token.create(string.byte("x"))
+local other_x = token.create(string.byte("x"),12)
+\stoptyping
+
+Passing weird numbers can give side effects so don't expect too much help with
+that. As said, you need to know what you're doing. The best way to explore the
+way these internals work is to just look at how primitives or macros or \prm
+{chardef}'d commands are tokenized. Just create a known one and inspect its
+fields. A variant that ignores the current catcode table is:
+
+\starttyping
+local whatever = token.new(123,12)
+\stoptyping
+
+You can test if a control sequence is defined with \type {is_defined}, which
+accepts a string and returns a boolean:
+
+\starttyping
+local okay = token.is_defined("foo")
+\stoptyping
+
+The largest character possible is returned by \type {biggest_char}, just in case you
+need to know that boundary condition.
+
+\stopsubsection
+
+\startsubsection[title={Macros}]
+
+\topicindex {macros}
+
+\libindex{set_macro}
+\libindex{get_macro}
+\libindex{get_meaning}
+\libindex{set_char}
+\libindex{set_lua}
+\libindex{get_functions_table}
+
+The \type {set_macro} function can get upto 4 arguments:
+
+\starttyping
+set_macro("csname","content")
+set_macro("csname","content","global")
+set_macro("csname")
+\stoptyping
+
+You can pass a catcodetable identifier as first argument:
+
+\starttyping
+set_macro(catcodetable,"csname","content")
+set_macro(catcodetable,"csname","content","global")
+set_macro(catcodetable,"csname")
+\stoptyping
+
+The results are like:
+
+\starttyping
+ \def\csname{content}
+\gdef\csname{content}
+ \def\csname{}
+\stoptyping
+
+The \type {get_macro} function can be used to get the content of a macro while
+the \type {get_meaning} function gives the meaning including the argument
+specification (as usual in \TEX\ separated by \type {->}).
+
+The \type {set_char} function can be used to do a \prm {chardef} at the
+\LUA\ end, where invalid assignments are silently ignored:
+
+\starttyping
+set_char("csname",number)
+set_char("csname",number,"global")
+\stoptyping
+
+A special one is the following:
+
+\starttyping
+set_lua("mycode",id)
+set_lua("mycode",id,"global","protected")
+\stoptyping
+
+This creates a token that refers to a \LUA\ function with an entry in the table
+that you can access with \type {lua.get_functions_table}. It is the companion
+to \lpr {luadef}. When the first (and only) argument is true the size will preset
+to the value of \type {texconfig.function_size}.
+
+\stopsubsection
+
+\startsubsection[title={Pushing back}]
+
+\libindex{get_next}
+\libindex{put_next}
+
+There is a (for now) experimental putter:
+
+\starttyping
+local t1 = token.get_next()
+local t2 = token.get_next()
+local t3 = token.get_next()
+local t4 = token.get_next()
+-- watch out, we flush in sequence
+token.put_next { t1, t2 }
+-- but this one gets pushed in front
+token.put_next ( t3, t4 )
+\stoptyping
+
+When we scan \type {wxyz!} we get \type {yzwx!} back. The argument is either a table
+with tokens or a list of tokens. The \type {token.expand} function will trigger
+expansion but what happens really depends on what you're doing where.
+
+\stopsubsection
+
+\startsubsection[title={Nota bene}]
+
+When scanning for the next token you need to keep in mind that we're not scanning
+like \TEX\ does: expanding, changing modes and doing things as it goes. When we
+scan with \LUA\ we just pick up tokens. Say that we have:
+
+\starttyping
+\bar
+\stoptyping
+
+but \type {\bar} is undefined. Normally \TEX\ will then issue an error message.
+However, when we have:
+
+\starttyping
+\def\foo{\bar}
+\stoptyping
+
+We get no error, unless we expand \type {\foo} while \type {\bar} is still
+undefined. What happens is that as soon as \TEX\ sees an undefined macro it will
+create a hash entry and when later it gets defined that entry will be reused. So,
+\type {\bar} really exists but can be in an undefined state.
+
+\startbuffer[demo]
+bar : \directlua{tex.print(token.scan_csname())}\bar
+foo : \directlua{tex.print(token.scan_csname())}\foo
+myfirstbar : \directlua{tex.print(token.scan_csname())}\myfirstbar
+\stopbuffer
+
+\startlines
+\getbuffer[demo]
+\stoplines
+
+This was entered as:
+
+\typebuffer[demo]
+
+The reason that you see \type {bar} reported and not \type {myfirstbar} is that
+\type {\bar} was already used in a previous paragraph.
+
+If we now say:
+
+\startbuffer
+\def\foo{}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+we get:
+
+\startlines
+\getbuffer[demo]
+\stoplines
+
+And if we say
+
+\startbuffer
+\def\foo{\bar}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+we get:
+
+\startlines
+\getbuffer[demo]
+\stoplines
+
+When scanning from \LUA\ we are not in a mode that defines (undefined) macros at
+all. There we just get the real primitive undefined macro token.
+
+\startbuffer
+\directlua{local t = token.get_next() tex.print(t.id.." "..t.tok)}\myfirstbar
+\directlua{local t = token.get_next() tex.print(t.id.." "..t.tok)}\mysecondbar
+\directlua{local t = token.get_next() tex.print(t.id.." "..t.tok)}\mythirdbar
+\stopbuffer
+
+\startlines
+\getbuffer
+\stoplines
+
+This was generated with:
+
+\typebuffer
+
+So, we do get a unique token because after all we need some kind of \LUA\ object
+that can be used and garbage collected, but it is basically the same one,
+representing an undefined control sequence.
+
+\stopsubsection
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-titlepage.tex
new file mode 100644
index 00000000000..6f7a6f9a5a5
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-titlepage.tex
@@ -0,0 +1,53 @@
+\environment luametatex-style
+
+\startcomponent luametatex-titlepage
+
+\startstandardmakeup
+
+ \switchtobodyfont
+ [mainfacemedium]
+
+ \definedfont[Bold*default at \the\dimexpr.06\paperheight\relax] \setupinterlinespace
+
+ \setlayer
+ [page]
+ {\useMPgraphic{luapage}}
+
+ \setlayerframed
+ [page]
+ [preset=righttop,
+ location=middletop,
+ hoffset=.500\measured{paperwidth},
+ voffset=.175\measured{paperheight}]
+ [align=middle,
+ foregroundcolor=white,
+ frame=off]
+ {\documentvariable{manual}\crlf Reference\crlf Manual}
+
+ \definedfont[Bold*default at 14pt] \setupinterlinespace
+
+ \setlayerframed
+ [page]
+ [preset=rightbottom,
+ offset=.025\measured{paperheight}]
+ [align=flushright,
+ foregroundcolor=white,
+ frame=off]
+ {\doifsomething{\documentvariable{status}}{\documentvariable{status}\par}
+ \currentdate[month,space,year]\par
+ Version \documentvariable{version}}
+
+ \setlayerframed
+ [page]
+ [preset=middle,
+ hoffset=-.5\dimexpr\measured{paperwidth}-\measured{spinewidth}\relax]
+ [width=.7\measured{paperwidth},
+ align=normal,
+ foregroundstyle=\bf,
+ foregroundcolor=white,
+ frame=off]
+ {\getbuffer[backpage]}
+
+\stopstandardmakeup
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-fonts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-fonts.tex
index d49c63afecb..400550a96dd 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-fonts.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-fonts.tex
@@ -43,6 +43,7 @@ the table are as follows:
complete control to the loader. \NC \NR
\NC \type{fullname} \NC no \NC no \NC yes \NC string \NC output font name, used as a fallback in the \PDF\ output
if the \type {psname} is not set \NC \NR
+\NC \type{subfont} \NC no \NC no \NC yes \NC number \NC default: 0, index in (\type {ttc}) font with multiple fonts \NC \NR
\NC \type{header} \NC yes \NC no \NC no \NC string \NC header comments, if any \NC \NR
\NC \type{hyphenchar} \NC no \NC no \NC yes \NC number \NC default: \TEX's \prm {hyphenchar} \NC \NR
\NC \type{parameters} \NC no \NC yes \NC yes \NC hash \NC default: 7 parameters, all zero \NC \NR
@@ -105,6 +106,11 @@ font in \type {font.fonts}. It is the actual expansion factor (a value between
\type {-shrink} and \type {stretch}, with step \type {step}) of a font that was
automatically generated by the font expansion algorithm.
+The \type {subfont} parameter can be used to specify the subfont in a \type {ttc}
+font. When given, it is used instead of the \type {psname} and \type {fullname}
+combination. The first subfont has number~1. A zero value signals using the names
+as lookup.
+
Because we store the actual state of expansion with each glyph and don't have
special font instances, we can change some font related parameters before lines
are constructed, like:
@@ -722,14 +728,18 @@ font.setfont(<number> n, <table> f)
Note that at the moment, each access to the \type {font.fonts} or call to \type
{font.getfont} creates a \LUA\ table for the whole font unless you cached it.
-This process can be quite slow.
+If you want a copy of the internal data you can use \type {font.copyfont}:
\startfunctioncall
-<table> p = font.getparameters(<number> n)
+<table> f = font.copyfont(<number> n)
\stopfunctioncall
This one will return a table of the parameters as known to \TEX. These can be
-different from the ones in the cached table.
+different from the ones in the cached table:
+
+\startfunctioncall
+<table> p = font.getparameters(<number> n)
+\stopfunctioncall
Also note the following: assignments can only be made to fonts that have already
been defined in \TEX, but have not been accessed {\it at all\/} since that
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-modifications.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-modifications.tex
index 50d23fb1b78..747945f55f7 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-modifications.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-modifications.tex
@@ -128,6 +128,15 @@ functionality, but with a few small adaptations.
(\LUATEX\ uses the variable \type {OVFFONTS} instead of \type {VFFONTS}).
\stopitem
+\startitem
+ The primitives that report a stretch or shrink order report a value in a
+ convenient range zero upto four. Because some macro packages can break on
+ that we also provide \type {\eTeXgluestretchorder} and \type
+ {\eTeXglueshrinkorder} which report values compatible with \ETEX. The (new)
+ \type {fi} value is reported as \type {-1} (so when used in an \type
+ {\ifcase} test that value makes one end up in the \type {\else}).
+\stopitem
+
\stopitemize
\stopsubsection
@@ -253,7 +262,10 @@ backend are decoupled as much as possible.
\startitem
When \lpr {adjustspacing} has value~2, hz optimization will be applied to
glyphs and kerns. When the value is~3, only glyphs will be treated. A value
- smaller than~2 disables this feature.
+ smaller than~2 disables this feature. With value of 1, font expansion is
+ applied after \TEX's normal paragraph breaking routines have broken the
+ paragraph into lines. In this case, line breaks are identical to standard
+ \TEX\ behavior (as with \PDFTEX).
\stopitem
\startitem
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-preamble.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-preamble.tex
index 8293179776d..e6389528414 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-preamble.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-preamble.tex
@@ -11,7 +11,7 @@
\topicindex{\LUA}
This is a reference manual, not a tutorial. This means that we discuss changes
-relative to traditonal \TEX\ and also present new functionality. As a consequence
+relative to traditional \TEX\ and also present new functionality. As a consequence
we will refer to concepts that we assume to be known or that might be explained
later.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex.tex
index 0230af73840..5a98f224379 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex.tex
@@ -44,6 +44,9 @@
% after adding primitives: context mult-prm.mkiv
+% \enabledirectives[pdf.stripzeros]
+% \enabledirectives[metapost.stripzeros]
+
\environment luatex-style
\startmode[book]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-basics.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-basics.tex
index df556e239a8..a52c7a35a63 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-basics.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-basics.tex
@@ -2835,7 +2835,7 @@ eofill fullsquare rotated 45 scaled 2cm
\typebuffer
The \type {eofill} is a \METAFUN\ extension. Hopefully the next explains a bit
-how this works (you can find explanations zon the internet).
+how this works (you can find explanations on the Internet).
\startlinecorrection[blank]
\processMPbuffer
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-names.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-names.tex
new file mode 100644
index 00000000000..55641ecd957
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-names.tex
@@ -0,0 +1,325 @@
+% language=uk
+
+\startcomponent musings-names
+
+\environment musings-style
+
+\startchapter[title={What's in a name}]
+
+\startlines \setupalign[flushright]
+Hans Hagen
+Hasselt NL
+May 2019
+\stoplines
+
+\startsection[title=\TEX]
+
+I sometimes wonder how much the fact that English is the language mostly used in
+programming environments influences the way one looks at a program. For instance,
+translating the names of an operating system \quote {windows}, an image
+manipulation program \quote {photoshop} or a text editing program \quote
+{wordperfect} to Dutch makes them sound kind of silly to me. The name can
+influence what you buy or are willing to use. These are examples of commercial
+programs but there are plenty examples of such naming in the open source universe
+too. I write this in my own bad English so that other non|-|English speakers can
+try to do a similar exercise.
+
+So, when I was reading an article about \CPU\ technology called \quote
+{thread|-|ripper} and after a while also saw the usual talk of yet another bunch
+of technologies marked as \quote {stack} and translated that to Dutch it again
+made me feel somewhat puzzled about such names. From there it was a small step to
+wondering about programming languages, and especially the ones I use: \TEX,
+\METAPOST, and \LUA.
+
+One can even wonder to what extent the quality of programming is influenced by
+the names of commands and keywords. A language name \quote {\BASIC} sounds less
+serious than \quote {C}. A meaningless \quote {\LUA} sounds different than \quote
+{\PYTHON}. Does using your native tongue make a difference? In Dutch and German
+words tend to get long. When I look at my French dictionary it is rather thin,
+but we might need accented characters. Words in a language like Polish can differ
+per usage. What if German or Spanish had been chosen as the language for what is
+now the United States? How would we perceive programming and what would look
+natural to us?
+
+\stopsection
+
+\startsection[title=\TEX]
+
+The \TEX\ language comes with a lot of so called primitives built in. Many of
+these relate to concepts in the program. For instance, a movement in horizontal
+or vertical direction that can stretch or shrink depending on what the boundary
+conditions demand, is called \quote {glue}. When discussing this in Dutch the
+word \quote {lijm} can be used and after seeing it a few times it might sound ok.
+We can probably use \quote {elastiek} (\quote {elastic}).
+
+This internal concept is actually represented to the user via the interface name
+\quote {skip}, take: \type {\abovedisplayskip} and \type {\belowdisplayskip}.
+Here the word \quote {display} refers to math that gets vertical space around it
+and is normally typeset in a somewhat larger way compared to \quote {inline}. The
+word \quote {skip} can be translated to \quote {sprong} (translated back we could
+as well get \quote {jump}). But how to translate \quote {display}? An internet
+translation can be \quote {tentoonspreiding} but apart from it being a long word
+it sounds pretty weird for something math. The combined translation of such a
+command will not work well I think so probably complete different words has to be
+made up to describe these quantities. Taco suggested that {\en \typ
+{\bovenuitstallingkortesprong}} might work for \type {\abovedisplayshortskip} but
+luckily no ordinary \TEX\ user will not set such parameters in a document source.
+
+In \CONTEXT\ we use the somewhat typographical term \type {wit} or \type
+{witruimte} for vertical spacing. Some parameters like \type {\baselineskip} can
+be translated directly to the Dutch \type {\regelafstand} which is a proper
+typographical term (\TEX\ has no concept of line height). Okay, it can become
+messy when we translate \type {\lineskip} by \typ {\interlinespace} as that
+could be seen as the baseline skip too (\quote {interlinie} comes to mind). Quite
+a mess. In many cases we probably would not handle the \type {skip} part in
+parameter: \type {leftskip} could become \type {\linkermarge} and \type
+{\parfillskip} can become \typ {\paragraafuitvulling}.
+
+Another concept is that of \quote {penalty}, or in Dutch \type {boete}. It's
+probably harder to get the combinations right, simply because they have no
+typographical meanings, they're more process controllers. I fear that most
+translations would sound pretty weird to me. So, how do they sound to a native
+English speaker? Words like \quote {club} or \quote {widow} can be translated to
+their Dutch gender neutral counterparts \quote {wees} and \quote {weduw} but how
+strange does {\nl \typ {weduwboete}} sound?
+
+The counter variables are easier. When they end on \type {char} that can become
+\type {karakter}. However, translating \type {\escapechar} with \type
+{\ontsnappingskarakter} might look a bit weird, but as that one is used very
+seldom, a weird one doesn't matter much. Operators like \type {\advance} and
+\type {\multiply} can become \type {\verhoog} and \type {\vermenigvuldig} which
+doesn't sound that strange in this context.
+
+There are \quote {rule}s and \quote {box}es. The first one can be translated to
+\quote {lijn} which sounds quite good. But what to do with the second one. We can
+use \quote {blok} (which translates back to \quote {block}) which is good when we
+start stacking things, but also with \quote {doos} which is more literal but
+sounds to me somewhat silly: \typ {\hdoos {whatever}}. I'm not so sure if I would
+have seen that in a book about \TEX, I'd looked further into the language. The
+optional keywords \quote {width} etc. can be translated well into \quote
+{breedte} etc., so no problem there.
+
+There are all kinds of very peculiar aspects that need a translation. For instance
+the (for new users intimidating) primitive \type {\futurelet}. The \quote {future}
+part is no problem as \quote {toekomst} isn't that weird but the \quote {let}
+will for sure become something very long in Dutch, so we end up with {\nl \typ
+{\toekomstigetoekenning}}, but seeing that long one, we can consider {\nl \type
+{kijkvooruit}} as reasonable alternative. It definitely leads to more verbose
+programming.
+
+Expansion is a tricky one. I have no clue what would make nice translations of
+the primitives \type {\noexpand} and \type {\expandafter}. The Dutch \quote
+{uitbreiden} simply is not sounding good here. Taco Hoekwater came up with a good
+alternative \quote {uitvouwen} for \quote {expand} and I like that one because
+we then can let bookmaker (a somewhat dubious term in itself) Willi Egger organize
+a workshop in unfolding (instead of folding).
+
+Talking of \quote {macros} is less a problem because there is no Dutch word for
+it. There are more words with no real translations: \type {\kern} for instance
+probably would need some thinking but there might be a typographical equivalent
+that can be used.
+
+The \ETEX\ and \LUATEX\ extensions introduce new names, like \type {\detokenize},
+\type {\boundary} and \type {\attribute}. The first one is hard to translate
+because again it relates to an internal concept: \type {tokens}. I get the
+feeling that translating each occurrence of \type {token} by \type {teken} kind
+of makes everything look less serious. To strip something from its special
+meaning, which is actually what \type {\detokenize} does can give weird
+translations: {\nl \typ {\onttekenen}} is not really a Dutch word so a complete
+different one has to be found that describes what happens, like \type
+{\ontwaarderen}. On the other hand, \type {\boundary} and \type {\attribute} can
+translate directly into \type {\grens} and \type {\attribuut} where the last one
+sounds mostly okay.
+
+Just to get you thinking: how would you translate \type {\looseness} (\type
+{losheid}, related to linebreaking), \type {\deadcycles} (\type {\zinlozelus}, in
+the perspective of building pages), \type {\pretolerance} (again line break
+related, here we can use something \type {tolerantie}) and \type {\prevgraf}
+(which is actually even in English a weird one but hardly used anyway, so Taco
+likes {\nl \typ {voorloopregels}})? The easy ones are \type {\omit}, \type {\meaning},
+\type {\number}, maybe even \type {\mark}. The for users often difficult to grasp
+\quote {catcode} can be simplified to \quote {code} which is proper Dutch.
+Concepts like \quote {align} translate well to \quote {uitlijnen}. Short ones
+like \type {\wd} could be a problem but any two letter combination can look bad,
+so \type {\br} could do. In the same fashion \type {\def} is ok as it is also the
+start of the Dutch \quote {definitie}. Mathematical terms like \quote {text},
+\quote {script} and \quote {scriptscript} can be confusing: \quote {tekst} will
+do but \quote {schrift} is strange.
+
+Conditionals are not the hardest part: \type {\if} becomes \type {\als}, \type
+{\else} becomes \type {\anders} and \type {\or} is \type {\of}. However, turning
+\type {\ifcase} into \type {\inhetgevaldat} can be over the top. The \type
+{\every...} register variables can also be translated quite well, by using the
+\type {\elk} or \type {\elke} prefix. They are seldom seen at the user level so
+no real problem there.
+
+The \quote {group} related commands are easy as \quote {groep} is a good Dutch
+equivalent. Even \quote {global} operations translate well (\type {globaal}). A
+dubious one is \type {\font} because we can use {\nl \typ {\lettertype}} but it's
+not really a translation. The internet translations tend towards \quote
+{fountain} kind of things.
+
+The concept of \quote {discretionary} again needs a decent typographical
+translation although \type {\hyphenation} can become \type {\afbreking},
+translating \type {\discretionary} needs some imagination. The concept of \quote
+{leaders} is again something that can best be bound to something more
+typographical because \type {\leaders} turned {\nl \typ {\leidinggevende}} is not
+an option nor is \type {\leiders}.
+
+The prefix \type {\un} as used in \type {\unhbox} can become \type {\ont} so that
+we get \type {\ontdoos} but I get the feeling that this one can be source of
+jokes. The more verbose {\nl \typ {\pakdoosuit}} (equivalent to \typ
+{\unpackbox}) would do better. To translate \type {\unvcopy} into the gibberish
+{\nl \typ {\ontdoosdecopie}} is simply ridiculous and {\nl \typ
+{\copieeruitgepaktedoos}} is a bit long. The \type {\lower} and \type {\raise} on
+the other hand translate well to \type {\verlaag} and \type {\verhoog}. Keeping
+\type {\relax} untranslated sounds ok to me, because \type {\ontspan} really
+makes a language silly.
+
+\stopsection
+
+\startsection[title=\METAPOST]
+
+The \TEX\ language is driving a macro system while \LUA\ is a procedural
+language. The \METAPOST\ language sits somewhere in between. It is still
+expanding all along but it looks a bit more like a programming language with its
+loops, assignments, conditionals, expressions and (sort of) functions. As a
+consequence some of what I mentioned in the previous section applies here.
+
+Translation of for instance \type {truecorners} into \type {echtehoeken} can give
+the language a bit less serious image. Words like \type {linejoin}, \type
+{linecap} and \type {miterlimit} relate directly to the \POSTSCRIPT\ language so
+translating them also relates to translated \POSTSCRIPT.
+
+The \type {primary}, \type {secundary} keywords can be nicely translated into
+serious counterparts \type {primaire} and \type {secundaire} which are words that
+are not really of Dutch origin anyway. The \type {precontrol} and \type
+{postcontrol} words relate to concepts but even there the verbose \type
+{controlepuntvoor} and \type {controlepuntachter} could do. However \type {punt}
+as translation for \type {point} can be confusing because we also use that for
+\type {period}. Translating \type {controls} and \type {curl} needs some
+imagination. Words like \type {tension} becoming \type {spanning} is still
+acceptable soundwise. However:
+
+\starttyping
+voor i=1 stap 2 tot 10:
+ .....
+eindvanvoor; % or: eindvoor
+\stoptyping
+
+Kind of interesting is translating \type {if} into \type {als} because \type {fi}
+then becomes \type {sla} which is \quote {lettuce} or, when see as verb, \quote
+{hit}. The \type {true} and \type {false} keywords becoming \type {goed} and
+\type {fout} is no problem.
+
+Turning \type {atleast} into \type {opzijnminst} at first sight looks strange but
+actually I can appreciate that one. And {\nl \typ {tussendoortje}} as translation
+of \type {interim}, I can live with that one too as it sounds funny. Concepts
+like \quote {suffixes} need thinking but {\nl \typ {uitdr(ukking)}} or more
+literal {\nl \typ {expr(essie)}} for {\nl \typ {expr(ession)}} are okay. The {\nl
+\typ {expandafter}}, {\nl \typ {scantokens}} and similar keywords share the
+problem with \TEX\ that they relate to concepts that are hard to translate.
+
+The \type {redpart} and similar keywords could be translated into \type
+{rooddeel} but {\nl \typ {roodkanaal}} (meaning \type {redchannel}) might be
+better or maybe {\nl \typ {rodecomponent}}. As with \TEX\ grouping related
+keywords are no problem.
+
+A \type {pencircle} becomes \type {pencirkel}, \type {odd} becomes \type
+{oneven}, \type {reverse} becomes {\nl \typ {omgekeerd}} (or {\nl \typ
+{andersom}} or {\nl \typ {tegengesteld}}). For \type {length} we use \type
+{lengte}, and so on. All these sound professional enough, just like \quote
+{corner} related keywords becoming \quote {hoek}, although there a clash with
+\quote {angle} is possible. I'm less sure about \type {clipped} becoming {\nl
+\typ {afgeknepen}} or {\nl \typ {begrensd}} but \type {bounded} then needs some
+thinking as these all are more or less the same. The concept of \quote {stroke}
+maps onto \quote {tekenen} or \quote {vegen} but lucky us that one is not really
+used, contrary to \type {draw} that can map onto \type {teken}, while \type
+{fill} and \type {vul} match well too I guess.
+
+The transformations are no problem but I'd use a directive instead: \type
+{rotated} or \type {roteer}, \type {slanted} or \type {schuin}, \type {scaled} or
+\type {schaal}, and \type {transform} or {\nl \typ {transformeer}}. As you can
+see, these have a reasonable word length too.
+
+The concept of a \type {picture} is known in Dutch as \type {plaatje} or \type
+{tekening}: not an easy choice. Using \type {kleur} for \type {color} is no
+problem at all. A coordinate \type {pair} becomes a \type {paar}: close enough
+not to give subjective side effects. The \type {inner} and \type {outer} keywords
+translate well to \type {binnen} and \type {buiten} but in code it might look a
+bit strange.
+
+So, in general, the translated commands are not that weird but still a graphic
+defined in Dutch keywords instead of English to me might look less serious.
+
+\stopsection
+
+\startsection[title=\LUA]
+
+We now arrived at a more traditional programming language. The \LUA\ language
+only has a few keywords. I suppose that it's just a matter of time before one
+gets accustomed to \typ {als ... dan ... anders ... eind} instead of \typ {if ...
+then ... else ... end}. The loops also translate rather well: \typ {zolang ...
+doe}, \typ {herhaal .. totdat}, \typ {voor ... in ... doe ... einde} are all not
+that verbose. Also, with proper syntax highlighting they stand out and become
+abstract words. But because examples for kids are normally in Dutch, using a
+Dutch programming language might give a toy language feeling.
+
+The \type {local} directive is a bit of a problem because it should be \typ
+{lokale variabele} in order to sound ok in a sentence. The \type {goto} should
+become \type {ganaar} which is also two words with no space in between. The \type
+{function} keyword can become \type {functie}. A \type {coroutine} is a challenge
+(also conceptually); we do have \type {routine} but how about the \type {co}
+part?
+
+Because \LUA\ is such a clean language it doesn't really end up bad. In \CCODE\
+there are some more issues due to the abbreviated \type {struct}, \type {int},
+\type {char}, \type {enum} and \type {typedef}. A literal translation of \type
+{void} to \type {leegte} to me sounds a bit strange. What to do with \type
+{unsigned}? Coming up with something (short) Dutch for \type {return} is not easy
+either. Translating \type {switch} into \type {schakelaar} looks like a bad idea
+but after consulting Taco using \type {keuze} came up. The \type {break} then can
+be \type {klaar} which roundtrips to \quote {finished} and \type {default} can be
+\type {anders} which roundtrips to \quote {otherwise} which is indeed what some
+languages provide.. But, there are programming languages out there that have
+plenty keywords and that are more challenging. But as I'm a happy \LUA\ user I
+don't have to worry about them.
+
+\stopsection
+
+\startsection[title=Conclusion]
+
+Looking at a program source in Dutch the general feeling probably will be
+different. A low level bit of \TEX\ is the worst. For \METAPOST\ it's bearable
+and for \LUA\ it is kind of okay. But in all cases, I'm not convinced that it
+would give me the same feeling. The abstraction of the language due to it not
+being my native tongue makes a difference. This problem is not much different
+than what we have with popular music and songs: for non|-|native speakers it's
+basically sounds, but for a native speaker it is more clear when nonsense is
+sung. The same can happen to me with movies, where watching some scandinavian
+series is different from watching a Dutch one. In the last case one picks up
+different nuances, not necessarily for the best. But it can be worse: post
+synchronized (audio) translations can be pretty unbearable and might compare well
+to programs translated to for instance Dutch. So let's not discuss the way
+Germans would deal with this.
+
+\stopsection
+
+\startsection[title=Side notes]
+
+We now see monospaced fonts showing up that provide ligatures for e.g.\ \type
+{<=} and I've seen examples where ligatures kicked in for \type {fi}. One can
+wonder about that but ligatures are definitely something to keep in mind when
+translating.
+
+The \CONTEXT\ macro package is normally used with the English user interface. But
+the design is such that one can provide different ones too; after all it started
+out Dutch. It is beyond the scope of this musing to discuss the problems with
+translating typographical concepts between languages, especially when there are
+no distinctive words. But it can (and has) been done.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-plain.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-plain.tex
new file mode 100644
index 00000000000..757f7300c55
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-plain.tex
@@ -0,0 +1,553 @@
+% language=uk
+
+% \showfontkerns
+
+\startcomponent musings-manuals
+
+\environment musings-style
+
+\definetyping[narrowtyping][style=\ttx]
+
+\startchapter[title={About what \CONTEXT\ isn't}]
+
+\startsection[title={Introduction}]
+
+It really puzzles me why, when someone someplace asks if \CONTEXT\ is suitable
+for her or is his needs, there are answers like: \quotation {You need to think of
+\CONTEXT\ as being kind of plain \TEX: you have to define everything yourself.}
+That answer probably stems from the fact that for \LATEX\ you load some style
+that defines a lot, which you then might need to undefine or redefine, but that's
+not part of the answer.
+
+In the following sections I will go into a bit more detail of what plain \TEX\ is
+and how it influences macro packages, especially \CONTEXT . I'm sure I have
+discussed this before so consider this another go at it.
+
+The \type {plain.tex} file start with the line:
+
+\starttyping
+% This is the plain TeX format that's described in The TeXbook.
+\stoptyping
+
+A few lines later we read:
+
+\starttyping
+% And don't modify the file under any circumstances.
+\stoptyping
+
+So, this format related to the \TEX\ reference. It serves as a template for what
+is called a macro package. Here I will not go into the details of macro programming
+but an occasional snippet of code can be illustrative.
+
+\stopsection
+
+\startsection[title={Getting started}]
+
+The first code we see in the plain file is:
+
+\startnarrowtyping
+\catcode`\{=1 % left brace is begin-group character
+\catcode`\}=2 % right brace is end-group character
+\catcode`\$=3 % dollar sign is math shift
+\catcode`\&=4 % ampersand is alignment tab
+\catcode`\#=6 % hash mark is macro parameter character
+\catcode`\^=7 \catcode`\^^K=7 % circumflex and uparrow are for superscripts
+\catcode`\_=8 \catcode`\^^A=8 % underline and downarrow are for subscripts
+\catcode`\^^I=10 % ascii tab is a blank space
+\chardef\active=13 \catcode`\~=\active % tilde is active
+\catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par"
+\stopnarrowtyping
+
+Assigning catcodes to the braces and hash are needed in order to make it possible
+to define macros. The dollar is set to enter math mode and the ampersand becomes
+a separator in tables. The superscript and subscript also relate to math. Nothing
+demands these bindings but they are widely accepted. In this respect \CONTEXT\ is
+indeed like plain.
+
+The tab is made equivalent to a space and a tilde is made active which means that
+later on we need to give it some meaning. It is quite normal to make that an
+unbreakable space, and one with the width of a digit when we're doing tables.
+Now, nothing demands that we have to assume \ASCII\ input but for practical
+reasons the formfeed character is made equivalent to a \type {\par}.
+
+Now what do these \type {^^K} and similar triplets represent? The \type {^^A}
+represents character zero and normally all these control characters below decimal
+32 (space) are special. The \type {^^I} is the \ASCII\ tab character, and \type
+{^^L} the formfeed. But, the ones referred to as uparrow and downarrow in the
+comments have only meaning on certain keyboards. So these are typical definitions
+that only made sense for Don Knuth at that time and are not relevant in other
+macro packages that aim at standardized input media.
+
+\startnarrowtyping
+% We had to define the \catcodes right away, before the message line, since
+% \message uses the { and } characters. When INITEX (the TeX initializer) starts
+% up, it has defined the following \catcode values:
+%
+% \catcode`\^^@=9 % ascii null is ignored
+% \catcode`\^^M=5 % ascii return is end-line
+% \catcode`\\=0 % backslash is TeX escape character
+% \catcode`\%=14 % percent sign is comment character
+% \catcode`\ =10 % ascii space is blank space
+% \catcode`\^^?=15 % ascii delete is invalid
+% \catcode`\A=11 ... \catcode`\Z=11 % uppercase letters
+% \catcode`\a=11 ... \catcode`\z=11 % lowercase letters
+% all others are type 12 (other)
+\stopnarrowtyping
+
+The comments above speak for themselves. Changing catcodes is one way to adapt
+interpretation. For instance, in verbatim mode most catcodes can best be made
+letter or other. In \CONTEXT\ we always had so called catcode regimes: for
+defining macros, for normal text, for \XML, for verbatim, etc. In \MKIV\ this
+mechanism was adapted to the new catcode table mechanism available in that
+engine. It was one of the first things we added to \LUATEX. So, again, although
+we follow some standards (expectations) \CONTEXT\ differs from plain.
+
+\startnarrowtyping
+% We make @ signs act like letters, temporarily, to avoid conflict between user
+% names and internal control sequences of plain format.
+
+\catcode`@=11
+\stopnarrowtyping
+
+In \CONTEXT\ we went a step further and when defining macros also adapted
+the catcode of \type {!} and \type {?} and later in \MKIV\ \type {_}. When
+we're in unprotected mode this applies. In addition to regular text
+input math is dealt with:
+
+\startnarrowtyping
+% INITEX sets up \mathcode x=x, for x=0..255, except that
+%
+% \mathcode x=x+"7100, for x = `A to `Z and `a to `z;
+% \mathcode x=x+"7000, for x = `0 to `9.
+
+% The following changes define internal codes as recommended in Appendix C of
+% The TeXbook:
+
+\mathcode`\^^@="2201 % \cdot
+\mathcode`\^^A="3223 % \downarrow
+\mathcode`\^^B="010B % \alpha
+\mathcode`\^^C="010C % \beta
+....................
+\mathcode`\|="026A
+\mathcode`\}="5267
+\mathcode`\^^?="1273 % \smallint
+\stopnarrowtyping
+
+Here we see another set of definitions but the alphabetic ones are not defined in
+\CONTEXT, they are again bindings to the authors special keyboard.
+
+\startnarrowtyping
+% INITEX sets \sfcode x=1000 for all x, except that \sfcode`X=999 for uppercase
+% letters. The following changes are needed:
+
+\sfcode`\)=0 \sfcode`\'=0 \sfcode`\]=0
+
+% The \nonfrenchspacing macro will make further changes to \sfcode values.
+\stopnarrowtyping
+
+Definitions like this depend on the language. Because original \TEX\ was mostly
+meant for typesetting English, these things are hard coded. In \CONTEXT\ such
+definitions relate to languages.
+
+I show these definitions because they also illustrate what \TEX\ is about:
+typesetting math:
+
+\startnarrowtyping
+% Finally, INITEX sets all \delcode values to -1, except \delcode`.=0
+
+\delcode`\(="028300
+\delcode`\)="029301
+\delcode`\[="05B302
+\delcode`\]="05D303
+\delcode`\<="26830A
+\delcode`\>="26930B
+\delcode`\/="02F30E
+\delcode`\|="26A30C
+\delcode`\\="26E30F
+
+% N.B. { and } should NOT get delcodes; otherwise parameter grouping fails!
+\stopnarrowtyping
+
+Watch the last comment. One of the complications of \TEX\ is that because some
+characters have special meanings, we also need to deal with exceptions. It also
+means that arbitrary input is not possible. For instance, unless the percent
+character is made a letter, everything following it till the end of a line will
+be discarded. This is an areas where macro packages can differ but in \MKII\ we
+followed these rules. In \MKIV\ we made what we called \type {\nonknuthmode}
+default which means that ampersands are just that and scripts are only special in
+math (there was also \type {\donknuthmode}). So, \CONTEXT\ is not like plain
+there.
+
+\stopsection
+
+\startsection[title=Housekeeping]
+
+The next section defines some numeric shortcuts. Here the fact is used that a
+defined symbolic character can act as counter value. When the number is larger
+than 255 a math character is to be used. In \LUATEX, which is a \UNICODE\ engine
+character codes can be much larger.
+
+\startnarrowtyping
+% To make the plain macros more efficient in time and space, several constant
+% values are declared here as control sequences. If they were changed, anything
+% could happen; so they are private symbols.
+
+\chardef\@ne=1
+\chardef\tw@=2
+\chardef\thr@@=3
+\chardef\sixt@@n=16
+\chardef\@cclv=255
+\mathchardef\@cclvi=256
+\mathchardef\@m=1000
+\mathchardef\@M=10000
+\mathchardef\@MM=20000
+\stopnarrowtyping
+
+In \CONTEXT\ we still support these shortcuts but never use them ourselves. We
+have plenty more variables and constants and nowadays always use verbose names.
+(There was indeed a time when each extra characters depleted string memory more
+and more so then using short command names made sense.) The comment is right that
+using such variables is more efficient, for instance once loaded a macro is a
+sequence of tokens, so \type {\@one} takes one memory slot. In the case of the
+first three the saving is zero and even interpreting a single character token
+\type {3} is not less efficient than \type {\thr@@}, but in the case of \type
+{\@cclv} the three tokens \type {255} take more memory and also trigger the number
+scanner which is much slower than simply taking the meaning of the \type
+{\chardef}'d token. However, the \CONTEXT\ variable \type {\plusone} is as
+efficient as the \type {\@ne} and it looks prettier in code too (and I'm very
+sensitive for that). So, here \CONTEXT\ is definitely different!
+
+It makes no sense to show the next section here: it deals with managing
+registers, like counters and dimensions and token lists. Traditional \TEX\ has
+255 registers per category. Associating a control sequence (name) with a specific
+counter is done with \type {\countdef} but I don't think that you will find a
+macro package that expects a user to use that primitive. Instead it will provide
+a \type {\newcount} macro. So yes, here \CONTEXT\ is like plain.
+
+Understanding these macros is a test case for understanding \TEX. Take the
+following snippet:
+
+\startnarrowtyping
+\let\newtoks=\relax % we do this to allow plain.tex to be read in twice
+\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
+\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi}
+\stopnarrowtyping
+
+The \type {\outer} prefix flags macros as to be used at the outermost level and
+because the \type {\newtoks} is in the macro body of \type {\newtoks} it has to
+be relaxed first. Don't worry if you don't get it. In \CONTEXT\ we have no outer
+macros so the definitions differ there.
+
+The plain format assumes that the first 10 registers are used for scratch
+purposes, so best also assume this to be the case in other macro packages. There
+is no need for \CONTEXT\ to differ from plain here. The definitions of box
+registers and inserts are special: there is no \type {\boxdef} and inserts use
+multiple registers. Especially the allocation of inserts is macro package
+specific. Anyway, \CONTEXT\ users never see such details because inserts are used
+as building blocks deep down.
+
+Right after defining the allocators some more constants are defined:
+
+\startnarrowtyping
+% Here are some examples of allocation.
+
+\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen>
+\stopnarrowtyping
+
+We do have that one, as it's again a standard but we do have more such constants.
+This definition is kind of interesting as it assumes knowledge about what is
+acceptable for \TEX\ as dimension:
+
+\startbuffer
+{\maxdimen=16383.99999pt \the\maxdimen \quad \number\maxdimen}
+{\maxdimen=16383.99998pt \the\maxdimen \quad \number\maxdimen}
+\stopbuffer
+
+\typebuffer
+
+\startlines
+\getbuffer
+\stoplines
+
+Indeed it is the largest legal dimension but the real largest one is slighly
+less. We could also have said the following, which also indicates what the
+maximum cardinal is:
+
+\startnarrowtyping
+\newdimen\maxdimen \maxdimen=1073741823sp
+\stopnarrowtyping
+
+We dropped some of the others defined in plain. So, \CONTEXT\ is a bit like plain
+but differs substantially. In fact, \MKII\ already used a different allocator
+implementation and \MKIV\ is even more different. We also have more \type {\new}
+things.
+
+The \type {\newif} definition also differs. Now that definition is quite special
+in plain \TEX, so if you want a challenge, look it up. It defines three macros as
+the comment says:
+
+\startnarrowtyping
+% For example, \newif\iffoo creates \footrue, \foofalse to go with \iffoo.
+\stopnarrowtyping
+
+The \type {\iffoo} is either equivalent to \type {\iftrue} or \type {\iffalse}
+because that is what \TEX\ needs to see in order to be able to skip nested
+conditional branches. In \CONTEXT\ we have so called conditionals, which are more
+efficient. So, yes, you will find such defined ifs in the \CONTEXT\ source but
+way less than you'd expect in such a large macro package: \CONTEXT\ code doesn't
+look much like plain code I fear.
+
+\stopsection
+
+\startsection[title=Parameters]
+
+A next stage sets the internal parameters:
+
+\startnarrowtyping
+% All of TeX's numeric parameters are listed here, but the code is commented out
+% if no special value needs to be set. INITEX makes all parameters zero except
+% where noted.
+\stopnarrowtyping
+
+We use different values for many of them. The reason is that the plain \TEX\ format
+is set up for a 10 point Computer Modern font system, and for a particular kind
+of layout, so we use different values for:
+
+\startnarrowtyping
+\hsize=6.5in
+\vsize=8.9in
+\maxdepth=4pt
+\stopnarrowtyping
+
+and
+
+\startnarrowtyping
+\abovedisplayskip=12pt plus 3pt minus 9pt
+\abovedisplayshortskip=0pt plus 3pt
+\belowdisplayskip=12pt plus 3pt minus 9pt
+\belowdisplayshortskip=7pt plus 3pt minus 4pt
+\stopnarrowtyping
+
+No, here \CONTEXT\ is not like plain. But, there is one aspect that we do inherit and
+that is the ratio. Here a 10 point relates to 12 point and this 1.2 factor is carried
+over in some defaults in \CONTEXT. So, in the end we're a bit like plain.
+
+After setting up the internal quantities plain does this:
+
+% We also define special registers that function like parameters:
+
+\startnarrowtyping
+\newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt
+\newskip\medskipamount \medskipamount=6pt plus 2pt minus 2pt
+\newskip\bigskipamount \bigskipamount=12pt plus 4pt minus 4pt
+\newskip\normalbaselineskip \normalbaselineskip=12pt
+\newskip\normallineskip \normallineskip=1pt
+\newdimen\normallineskiplimit \normallineskiplimit=0pt
+\newdimen\jot \jot=3pt
+\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100
+\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100
+\stopnarrowtyping
+
+The first three as well as the following three related variables are not internal
+quantities but preallocated registers. These are not used in the engine but in
+macros. In \CONTEXT\ we do provide them but the first three are never used that
+way. The last three are not defined at all. So, \CONTEXT\ provides a bit what
+plain provides, just in case.
+
+\stopsection
+
+\startsection[title=Fonts]
+
+The font section is quite interesting. I assume that one reason why some want to
+warn users against using \CONTEXT\ is because it supports some of the font
+switching commands found in plain. We had no reasons to come up with different ones
+but they do different things anyway, for instance adapting to situations. So, in
+\CONTEXT\ you will not find the plain definitions:
+
+\startnarrowtyping
+\font\tenrm=cmr10 % roman text
+\font\preloaded=cmr9
+\font\preloaded=cmr8
+\font\sevenrm=cmr7
+\font\preloaded=cmr6
+\font\fiverm=cmr5
+\stopnarrowtyping
+
+There is another thing going on here. Some fonts are defined \type {\preloaded}. So,
+\type {cmr9} is defined, and then \type {cmr8} and \type {cmr6}. But they all use the
+same name. Later on we see:
+
+\startnarrowtyping
+\let\preloaded=\undefined % preloaded fonts must be declared anew later.
+\stopnarrowtyping
+
+If you never ran into the relevant part of the \TEX\ book or read the program
+source of \TEX, you won't realize that preloading means that it stays in memory
+which in turn means that when it gets (re)defined later, the font data doesn't
+come from disk. In fact, as the plain format is normally dumped for faster reload
+later on, the font data is also retained. So, preloading is a speed up hack. In
+\CONTEXT\ font loading has always been delayed till the moment a font is really
+used. This permits plenty of definitions and gives less memory usage. Of course
+we do reuse fonts once loaded. All this, plus the fact that we have a a system of
+related sizes, collections of families, support multiple font encodings
+alongside, collect definitions in so called typescript, etc. makes that the
+\CONTEXT\ font subsystem is far from what plain provides. Only some of the
+command stick, like \type {\rm} and \type {\bf}.
+
+The same is true for math fonts, where we can have different math font setups in
+one document. Definitely in \MKII\ times, we also had to work around limitations
+in the number of available math families, which again complicated the code. In
+\MKIV\ things are even more different, one can even consider the implementation
+somewhat alien for a standard macro package, but that's for another article (if
+at all).
+
+\stopsection
+
+\startsection[title=Macros]
+
+Of course \CONTEXT\ comes with macros, but these are organized in setups,
+environments, instances, etc. The whole process and setup is keyword driven. Out
+of the box all things work: nothing needs to be loaded. If you want it different,
+you change some settings, but you don't need to load something. Maybe that last
+aspect is what is meant with \CONTEXT\ being like plain: you don't (normally)
+load extra stuff. You just adapt the system to your needs. So there we proudly
+follow up on plain \TEX.
+
+In the plain macro section we find definitions like:
+
+\startnarrowtyping
+\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m
+ \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m}
+\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000%
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 }
+\stopnarrowtyping
+
+and:
+
+\startnarrowtyping
+\def\space{ }
+\def\empty{}
+\def\null{\hbox{}}
+
+\let\bgroup={
+\let\egroup=}
+\stopnarrowtyping
+
+and:
+
+\startnarrowtyping
+\def\nointerlineskip{\prevdepth-1000\p@}
+\def\offinterlineskip{\baselineskip-1000\p@
+ \lineskip\z@ \lineskiplimit\maxdimen}
+\stopnarrowtyping
+
+Indeed we also provide these, but apart from the two grouping related aliases
+their implementation is different in \CONTEXT. There is no need to reinvent
+names.
+
+For a while we kept (and did in \MKII) some of the plain helper macros, for
+instance those that deal with tabs, but we have several more extensive table
+models that are normally used. We always had our own code for float placement,
+and we also have more options there. Footnotes are supported but again we have
+multiple classes, placements, options, etc. Idem for itemized lists, one of the
+oldest mechanisms in \CONTEXT. We don't have \type {\beginsection} but of course
+we do have sectioning commands, and have no \type {\proclaim} but provide lots of
+descriptive alternatives, so many that I forgot about most of them by now (so
+plain is a winner in terms of knowing a macro package inside out).
+
+The fact that we use tables, floats and footnotes indeed makes \CONTEXT\ to act
+like plain, but that's then also true for other macro packages. A fact is that
+plain sets the standard for how to think about these matters! The same is true
+for naming characters:
+
+\startnarrowtyping
+\chardef\%=`\%
+\chardef\&=`\&
+\chardef\#=`\#
+\chardef\$=`\$
+\chardef\ss="19
+\chardef\ae="1A
+\chardef\oe="1B
+\chardef\o="1C
+\chardef\AE="1D
+\chardef\OE="1E
+\chardef\O="1F
+\chardef\i="10 \chardef\j="11 % dotless letters
+\stopnarrowtyping
+
+But we have many more and understandable the numbers are different in \CONTEXT\
+because we use different font (encodings). Their implementation is more adaptive.
+The same is true for accented characters:
+
+\startnarrowtyping
+\def\`#1{{\accent18 #1}}
+\def\'#1{{\accent19 #1}}
+\stopnarrowtyping
+
+The definitions in \MKII\ are different (in most cases we use native glyphs) and
+in \MKIV\ we use \UNICODE\ anyway. I think that the \type {\accent} command is
+only used in a few exceptional cases (like very limited fonts) in \MKII\ and never
+in \MKIV. The implementation of for instance accents (and other pasted together
+symbols) in math is also quite different.
+
+There are also definitions that seem to be commonly used in macro packages but
+that we never use in \CONTEXT\ because they interfere badly with all kind of
+other mechanisms, so you will find no usage of
+
+\startnarrowtyping
+\def\leavevmode{\unhbox\voidb@x} % begins a paragraph, if necessary
+\stopnarrowtyping
+
+in \CONTEXT. In order to stress that we provide \type {\dontleavehmode}, a wink
+to not using the one above.
+
+The macro section ends with lots of math definitions. Most of the names used are
+kind of standard so again here \CONTEXT\ is like plain, but the implementation
+can differ as does the level of control.
+
+\stopsection
+
+\startsection[title=Output]
+
+Once a page is ready it gets wrapped up and shipped out. Here \CONTEXT\ is very
+different from plain. The amount of code in plain is not that large but the
+possibilities aren't either, which is exactly what the objectives demand: a
+simple (example) format that can be described in the \TEX book. But, as with
+other aspects of plain, it steered the way macro packages started out as it
+showed the way. As did many examples in the \TEX\ book.
+
+\stopsection
+
+\startsection[title=Hyphenation]
+
+As an afterthought, the plain format ends with loading hyphenation patterns, that
+is the English ones. That said it will be clear that \CONTEXT\ is not like plain:
+we support many languages, and the subsystem deals with labels, specific
+typesetting properties, etc.\ too.
+
+\startnarrowtyping
+\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks
+\input hyphen
+\stopnarrowtyping
+
+We don't even use these patterns as we switched to \UTF\ long ago (also in \MKII)
+if only because we had to deal with a mix of font encodings. But we did preload the
+lot there. In \MKIV\ again things are much different.
+
+\stopsection
+
+\startsection[title=Conclusion]
+
+The plain format does (and provides) what it is supposed to do. It is a showcase
+of possibilities and part of the specification. In that respect it's nice that
+\CONTEXT\ is considered to be like plain. But if it wasn't more, there was no
+reason for its existence. Like more assumptions about \CONTEXT\ it demonstrates
+that those coming up with answers and remarks like that probably missed something
+in assessing \CONTEXT. Just let users find out themselves what suits best (and
+for some that actually might be plain \TEX).
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings.tex
index e2787dc9923..687fcdb50f0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings.tex
@@ -16,6 +16,11 @@
\component musings-staygo
\component musings-stability
\component musings-roadmap
+ \component musings-names
+ \component musings-plain
+ % \component musings-performance
+ % \component musings-history
+ % \component musings-treasures
\stopbodymatter
\stopproduct
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-53.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-53.tex
index 0d5dc1b9cc0..c724bf810d2 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-53.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-53.tex
@@ -2,49 +2,55 @@
\startcomponent onandon-53
+% copy-edited by Alan Braslau
+
\environment onandon-environment
\startchapter[title={From \LUA\ 5.2 to 5.3}]
-When we started with \LUATEX\ we used \LUA\ 5.1 and moved to 5.2 when that became
-available. We didn't run into issues then because there were no fundamental
-changes that could not be dealt with. However, when \LUA\ 5.3 was announced in
-2015 we were not sure if we should make the move. The main reason was that we'd
-chosen \LUA\ because of its clean design which meant that we had only one number
-type: double. In 5.3 on the other hand, deep down a number can be either an
-integer or a floating point quantity.
-
-Internally \TEX\ is mostly (up to) 32-bit integers and when we go from \LUA\ to
-\TEX\ we round numbers. Nonetheless one can expect some benefits in using
-integers. Performance|-|wise we didn't expect much, and memory consumption would
-be the same too. So, the main question then was: can we get the same output and
-not run into trouble due to possible differences in serializing numbers; after
-all \TEX\ is about stability. The serialization aspect is for instance important
-when we compare quantities and|/|or use numbers in hashes.
-
-Apart from this change in number model, which comes with a few extra helpers,
-another extension in 5.3 was that bit|-|wise operations are now part of the
-language. The lpeg library is still not part of stock \LUA. There is some minimal
-\UTF8 support, but less than we provide in \LUATEX\ already. So, looking at these
-changes, we were not in a hurry to update. Also, it made sense to wait till this
-important number|-|related change was stable.
-
-But, a few years later, we still had it on our agenda to test, and after the
-\CONTEXT\ 2017 meeting we decided to give it a try; here are some observations. A
-quick test was just dropping in the new \LUA\ code and seeing if we could make a
-\CONTEXT\ format. Indeed that was no big deal but a test run failed because at
-some point a (for instance) \type {1} became a \type {1.0}. It turned out that
-serializing has some side effects. And with some ad hoc prints for tracing (in
-the \LUATEX\ source) I could figure out what went on. How numbers are seen can
-(to some extent) be deduced from the \type {string.format} function, which is in
-\LUA\ a combination of parsing, splitting and concatenation combined with piping
-to the \CCODE\ \type {sprintf} function. \footnote {Actually, at some point I
-decided to write my own formatter on top of \type {format} and I ended up with
-splitting as well. It's only now that I realize why this is working out so well
-(in terms of performance): simple format (single items) are passed more or less
-directly to \type {sprintf} and as \LUA\ itself is fast, due to some caching, the
-overhead is small compared to the built|-|in splitter method. And the \CONTEXT\
-formatter has many more options and is extensible.}
+When we started with \LUATEX\ we used \LUA\ 5.1 and then moved seamlessly to 5.2
+when that became available. We didn't run into issues with this language version
+change because there were no fundamental differences that could not be easily
+dealt with. However, when \LUA\ 5.3 was announced in 2015 we were not sure if we
+should make the move. The main reason was that we'd chosen \LUA\ because of its
+clean design part of which meant that we had only one number type: double. In 5.3
+on the other hand, deep down a number can be either an integer or a floating
+point quantity.
+
+Internally \TEX\ is mostly (up to) 32-bit integers so when we go from \LUA\ to
+\TEX\ we are forced to round numbers. Nonetheless, or perhaps because of this,
+one can expect some benefits in using integers in \LUA. Performance|-|wise we
+didn't expect much, and memory consumption would be the same too. So the main
+question then was: can we get the same output and not run into trouble due to
+possible differences in serializing numbers? After all \TEX\ is about stability.
+The serialization aspect is for instance important when we compare quantities
+and|/|or use numbers in hashes, so one must be careful.
+
+Apart from this change in the number model (which comes with a few extra
+helpers), another interesting extension in 5.3 was that bit|-|wise operations are
+now part of the language. However, the lpeg library is still not part of stock
+\LUA. There is also added some minimal \UTF8 support, but less than we provide in
+\LUATEX\ already. So, considering these changes, we were not in a big hurry to
+update. Also, it made sense to wait until this important number|-|related change
+became stable.
+
+But, a few years later, we still had it on our agenda to test the new version of
+\LUA, and after the \CONTEXT\ 2017 meeting we decided to give it a try; here are
+some observations. A quick test involved just dropping in the new \LUA\ code and
+seeing if with this we could still compile a \CONTEXT\ format. Indeed that was no
+big deal but the test run failed because at some point a (for instance) \type {1}
+became a \type {1.0}. It turned out that serializing has some side effects, and
+with some ad hoc prints for tracing (in the \LUATEX\ source) I could figure out
+what was going on. How numbers are seen can (to some extent) be deduced from the
+\type {string.format} function, which is in \LUA\ a combination of parsing,
+splitting and concatenation combined with piping to the \CCODE\ \type {sprintf}
+function: \footnote {Actually, at some point I decided to write my own formatter
+on top of \type {format} and I ended up with splitting as well. It's only now
+that I realize why this is working out so well (in terms of performance): simple
+format (single items) are passed more or less directly to \type {sprintf} and as
+\LUA\ itself is fast, due to some caching, the overhead is small compared to the
+built|-|in splitter method. An advantage is that the \CONTEXT\ formatter has many
+more options and is also extensible.}
\starttyping
local a = 2 * (1/2) print(string.format("%s", a),math.type(x))
@@ -76,10 +82,10 @@ This gives the following results:
\BC k \NC -2 \NC .0f \NC 2 \NC integer \NC \NR
\stoptabulate
-This demonstrates that we have to be careful when we need these numbers
-represented as strings. In \CONTEXT\ the number of places where we had to check
-for that was not that large; in fact, only some hashing related to font sizes had
-to be done using explicit rounding.
+This demonstrates that we have to be careful when we need numbers represented as
+strings. In \CONTEXT\ the places where we had to check for this was not that
+many: in fact, only some hashing related to font sizes had to be done using
+explicit rounding.
Another surprising side effect is the following. Instead of:
@@ -103,22 +109,23 @@ because we don't want this to be serialized to \type {64.0} which is due to the
fact that a power results in a float. One can wonder if this makes sense when we
apply it to an integer.
-At any rate, once we could process a file, two documents were chosen for a
-performance test. Some experiments with loops and casts had demonstrated that we
-could expect a small performance hit and indeed, this was the case. Processing
-the \LUATEX\ manual takes 10.7 seconds with 5.2 on my 5-year-old laptop and 11.6
-seconds with 5.3. If we consider that \CONTEXT\ spends 50\% of its time in \LUA,
-then we see a 20\% performance penalty. Processing the \METAFUN\ manual (which
-has lots of \METAPOST\ images) went from less than 20 seconds (\LUAJITTEX\ does
-it in 16 seconds) up to more than 27 seconds. So there we lose more than 50\% on
-the \LUA\ end. When we observed these kinds of differences, Luigi and I
-immediately got into debugging mode, partly out of curiosity, but also because
-consistent performance is important to~us.
-
-Because these numbers made no sense, we traced different sub-mechanisms and
-eventually it became clear that the reason for the speed penalty was that the
+At any rate, once we were able to process a file, two standard documents were
+chosen for a performance test. Some experiments with loops and casts had
+demonstrated that we could expect a small performance hit and indeed, this was
+the case. Processing the \LUATEX\ manual takes 10.7 seconds with 5.2 on my
+5-year-old laptop and 11.6 seconds with 5.3. If we consider that \CONTEXT\ spends
+about 50\% of its time in \LUA, then we find here a 20\% performance penalty
+using the later version of \LUA. Processing the \METAFUN\ manual (which has lots
+of \METAPOST\ images) went from less than 20 seconds (and \LUAJITTEX\ does it in
+16 seconds) to up to more than 27 seconds. So there we lose more than 50\% on the
+\LUA\ end. When we observed these kinds of differences, Luigi and I immediately
+got into debugging mode, partly out of curiosity but also because consistent
+performance is always important to us.
+
+As these results made no sense, we traced different sub-mechanisms and eventually
+it became clear that the reason behind the speed penalty was in fact that the
core \typ {string.format} function was behaving quite badly in the \type {mingw}
-cross-compiled binary, as seen by this test:
+cross|-|compiled binary, as can be seen by this test:
\starttyping
local t = os.clock()
@@ -137,13 +144,13 @@ print(os.clock()-t)
\BC c \NC 0.26 \NC 0.68 \NC 3.67 (0.29) \NC 0.66 \NC \NR
\stoptabulate
-The 5.2 binaries perform the same but the 5.3 Lua binary greatly outperforms
-\LUATEX, and so we had to figure out why. After all, all this integer
-optimization could bring some gain! It took us a while to figure this out. The
-numbers in parentheses are the results after fixing this.
+Both 5.2 binaries perform the same but the 5.3 \LUA\ binary greatly outperforms
+the \LUATEX binary so we had to figure out why. After all, the integer
+optimization should bring some gain! It took us a while to figure out what was
+going wrong, and the numbers in parentheses are the results after fixing \LUATEX.
Because font internals are specified in integers one would expect a gain
-in running:
+in running the command:
\starttyping
mtxrun --script font --reload force
@@ -151,8 +158,10 @@ mtxrun --script font --reload force
and indeed that is the case. On my machine a scan results in 2561 registered
fonts from 4906 read files and with 5.2 that takes 9.1 seconds while 5.3 needs a
-bit less: 8.6 seconds (with the bad format performance) and even less once that
-was fixed. For a test:
+bit less: 8.6 seconds (with the bad cross|-|compiled format performance) and even
+less once that was fixed.
+
+For a test:
\starttyping
\setupbodyfont[modern] \tf \bf \it \bs
@@ -163,21 +172,23 @@ was fixed. For a test:
\starttext \stoptext
\stoptyping
-This code needs 30\% more runtime so the question is: how often do we call \type
-{string.format} there? A first run (when we wipe the font cache) needs some
-715,000 calls while successive runs need 115,000 calls so that slow down
-definitely comes from the bad handling of \type {string.format}. When we drop in
-a \LUA\ update or whatever other dependency we don't want this kind of impact. In
-fact, when one uses external libraries that are or can be compiled under the
-\TEX\ Live infrastructure and the impact would be such, it's bad advertising,
-especially when one considers the occasional complaint about \LUATEX\ being
-slower than other engines.
+This code needs 30\% more runtime using the newer version of \LUA\ so the
+question is: how often do we call \type {string.format} there? A first run (when
+we wipe the font cache) needs some 715\,000 calls while successive runs need
+115\,000 calls so the slow down definitely comes from the bad handling of \type
+{string.format}.
+
+When we drop in a \LUA\ or whatever other dependency update we don't want this
+kind of impact. In fact, when one uses external libraries that are or can be
+compiled under the \TEX\ Live infrastructure and the impact would be so dramatic,
+this would be very bad advertising, especially when one considers the occasional
+complaint about \LUATEX\ being slower than other engines.
The good news is that eventually Luigi was able to nail down this issue and we
got a binary that performed well. It looks like \LUA\ 5.3.4 (cross|)|compiles
-badly with \GCC\ 5.3.0 and 6.3.0.
+badly under both \GCC\ 5.3.0 and 6.3.0.
-So in the end caching the fonts takes:
+So in the end loading the fonts takes:
\starttabulate[||c|c|]
\BC \BC caching \BC running \NC \NR
@@ -186,18 +197,20 @@ So in the end caching the fonts takes:
\BC 5.3 fixed \NC 6.3 \NC 1.0 \NC \NR
\stoptabulate
-So indeed it looks like 5.3 is able to speed up \LUATEX\ a bit, given that one
-integrates it in the right way! Using a recent compiler is needed too, although
-one can wonder when a bad case will show up again. One can also wonder why such a
-slow down can mostly go unnoticed, because for sure \LUATEX\ is not the only
-compiled program.
+So indeed after an initial scare it looks like 5.3 is able to speed up \LUATEX\ a
+bit, given that one integrates it in the right way! The use of a recent compiler
+is needed here, although one can wonder when another bad case will show up again.
+One can also wonder why such a slow down can mostly go unnoticed, because for
+sure \LUATEX\ is not the only compiled program integrating the \LUA\ language.
+\footnote{We can only speculate that others do not pay such close attention to
+performance.}
The next examples are some edge cases that show you need to be aware
that
\startitemize[n,text,nostopper]
\startitem an integer has its limits, \stopitem
- \startitem that hexadecimal numbers are integers and \stopitem
- \startitem that \LUA\ and \LUAJIT\ can be different in details. \stopitem
+ \startitem that hexadecimal numbers are integers, and \stopitem
+ \startitem that \LUA\ 5.2 and \LUAJIT\ can differ in small details: \stopitem
\stopitemize
\starttabulate[||T|T|]
@@ -208,47 +221,53 @@ that
\BC lua 53 \NC -1 \NC 9223372036854775807 \NC \NR
\stoptabulate
-So, to summarize the process. A quick test was relatively easy: move 5.3 into the
-code base, adapt a little bit of internals (there were some \LUATEX\ interfacing
-bits where explicit rounding was needed), run tests and eventually fix some
-issues related to the Makefile (compatibility) and \CCODE\ obscurities (the slow
-\type {sprintf}). Adapting \CONTEXT\ was also not much work, and the test suite
-uncovered some nasty side effects. For instance, the valid 5.2 solution:
+We see here that \LUA\ 5.3 clearly represents some progress.
+
+So, to summarize the migration, a quick test was relatively easy: move 5.3 into
+the code base, make slight adaptations to the internals (there were a few
+\LUATEX\ interfacing bits where explicit rounding was needed), run tests, and
+eventually fix some issues related to the Makefile (compatibility) and \CCODE\
+obscurities (the very slow \type {sprintf}). \footnote{This demonstrates the
+importance of compilers, or rather how one writes code with respect to each
+compiler.}
+
+Adapting \CONTEXT\ was also not much work, but the test suite uncovered some
+nasty side effects. For instance, the valid 5.2 solution:
\starttyping
local s = string.format("02X",u/1024)
local s = string.char (u/1024)
\stoptyping
-now has to become (both 5.2 and 5.3):
+now has to become (works with both 5.2 and 5.3):
\starttyping
local s = string.format("02X",math.floor(u/1024))
local s = string.char (math.floor(u/1024))
\stoptyping
-or (both 5.2 and (emulated or real) 5.3):
+or (with 5.2 and emulated or real 5.3):
\starttyping
local s = string.format("02X",bit32.rshift(u,10))
local s = string.char (bit32.rshift(u,10))
\stoptyping
-or (only 5.3):
+or (5.3 only):
\starttyping
local s = string.format("02X",u >> 10))
local s = string.char (u >> 10)
\stoptyping
-or (only 5.3):
+or (5.3 only):
\starttyping
local s = string.format("02X",u//1024)
local s = string.char (u//1024)
\stoptyping
-A conditional section like:
+Unfortunately, adapting a conditional section like:
\starttyping
if LUAVERSION >= 5.3 then
@@ -260,28 +279,61 @@ else
end
\stoptyping
-will fail because (of course) the 5.2 parser doesn't like that. In \CONTEXT\ we
-have some experimental solutions for that but that is beyond this summary.
+will fail because (of course) the 5.2 parser doesn't like the 5.3 syntax
+elements. In \CONTEXT\ we have some experimental solutions for this but it is
+beyond the scope of this summary.
-In the process a few \UTF\ helpers were added to the string library so that we
-have a common set for \LUAJIT\ and \LUA\ (the \type {utf8} library that was added
-to 5.3 is not that important for \LUATEX). For now we keep the \type {bit32}
-library on board. Of course we'll not mention all the details here.
+In the process of this update a few \UTF\ helpers were added to the string
+library so that we have a common set for both \LUAJIT\ and \LUA\ (the \type
+{utf8} library that was added to 5.3 is not very useful for \LUATEX). For now we
+also keep the \type {bit32} library on board, of course, we'll not mention all
+the details here.
-When we consider a gain in speed of 5-10\% with 5.3 that also means that the gain
-of \LUAJITTEX\ compared to 5.2 becomes less. For instance in font processing both
-engines now perform closer to the same.
+When we consider a gain in speed of 5–10\% with 5.3 that also means that the gain
+obtained using \LUAJITTEX\ compared to \LUA\ 5.2 becomes less important. For
+instance in font processing both engines (\LUA\ 5.3 and \LUAJIT) now perform
+roughly to the same.
As I write this, we've just entered 2018 and after a few months of testing
\LUATEX\ with \LUA\ 5.3 we're confident that we can move the code to the
experimental branch. This means that we will use this version in the \CONTEXT\
-distribution and likely will ship this version as 1.10 in 2019, where it becomes
+distribution and likely will ship this as 1.10 in 2019 where \LUA\ 5.3 becomes
the default. The 2018 version of \TEX~Live will have 1.07 with \LUA\ 5.2 while
intermediate versions of the \LUA\ 5.3 binary will end up on the \CONTEXT\
garden, probably with number 1.08 and 1.09 (who knows what else we will add or
change in the meantime).
-\stopchapter
+\subsubject{Addendum}
+
+Around the 2018 meeting I also started what is to become the next major upgrade
+of \CONTEXT, this time using a new engine \LUAMETATEX. In working on that I
+decided to try \LUA\ 5.4 to see what consequences this new version would have for
+us. There are no real conceptual changes as were found with the number model in
+5.3, so the tests didn't reveal any real issues. But as an additional step
+towards a bit cleaner distinction between strings and numbers, I decided to
+disable the automatic casting so that mixing strings and numbers in expression
+for instance is no longer permitted. If I remember correctly, there was only in
+one place I had to adapt the source (and we're talking about a pretty large \LUA\
+code base).
+
+There is a new mechanism in \LUA\ for freezing constants but I'm not yet sure if
+it makes much sense to use it, although one of the intentions is to produce more
+efficient bytecode. \footnote {Mid July 2019 some quick tests indeed show a
+performance boost with the experimental code base, but if we want to benefit from
+using constants, the \CONTEXT\ codebase has to be adapted, which means that those
+parts no longer will work with stock \LUATEX.} It's use goes along with some
+other restrictions, like the possibility to adapt loop counters inside the loop.
+Inside the body of a loop one could always adapt such a variable, which (I can
+imagine) can come in handy. I haven't checked the source code for that, but
+probably I don't do this anywhere.
+
+Another new feature is an alternative garbage collector which seems to perform
+better when there are many variables with a short life spans. At least for now I
+have decided to default to this variant in future releases.
+
+Overall the performance of \LUA\ 5.4 is better than its predecessors which means
+that the gap between \LUATEX\ and \LUAJITTEX\ is closed or is closing. This is
+good because I have chosen not to support \LUAJIT\ in \LUAMETATEX.
\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-execute.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-execute.tex
index abb3b4d8a15..9d5458fe909 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-execute.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-execute.tex
@@ -6,12 +6,12 @@
\startchapter[title={Executing \TEX}]
-Much of the \LUA\ code in \CONTEXT\ originates from experiments. When it survives
-in the source code it is probably used, waiting to be used or kept for
+Much of the \LUA\ code in \CONTEXT\ originates from experiments. What survives in
+the source code is probably either used, waiting to be used, or kept for
educational purposes. The functionality that we describe here has already been
-present for a while in \CONTEXT, but improved a little starting with \LUATEX\
-1.08 due to an extra helper. The code shown here is generic and not used in
-\CONTEXT\ as such.
+present for a while in \CONTEXT, but has been improved a little starting with
+\LUATEX\ 1.08 due to an extra helper. The code shown here is generic and is not
+used in \CONTEXT\ as such.
Say that we have this code:
@@ -33,8 +33,8 @@ end
% \ctxluabuffer
When we call \type {\directlua} with this snippet we get some 30 pages of \type
-{12345345345}. The printed text is saved till the end of the \LUA\ call, so
-basically we pipe some 170.000 characters to \TEX\ that get interpreted as one
+{12345345345}. The printed text is saved until the end of the \LUA\ call so
+basically we pipe some 170\,000 characters to \TEX\ that get interpreted as one
paragraph.
Now imagine this:
@@ -45,7 +45,8 @@ Now imagine this:
\typebuffer
-which gives \getbuffer. If we check the box in \LUA, with:
+which gives \getbuffer (the width of the \type {box0} register). If we check the
+box in \LUA, with:
\startbuffer
tex.sprint(tex.box[0].width)
@@ -56,10 +57,11 @@ tex.sprint(tex.box[0].width)
\typebuffer
-the result is {\tttf \ctxluabuffer}, which is not what you would expect at first
-sight. However, if you consider that we just pipe to a \TEX\ buffer that gets
-parsed after the \LUA\ call, it will be clear that the reported width is the
-width that we started with. It will work all right if we say:
+the result is {\tttf \ctxluabuffer} i.e. the same number repeated, which is not
+what you would expect at first sight. However, if you consider that we just pipe
+to a \TEX\ buffer that gets parsed \italic {after} the \LUA\ call, it will be
+clear that the reported width is each time the width that we started with. Our
+code will work all right if we use:
\startbuffer
tex.sprint(tex.box[0].width)
@@ -70,9 +72,11 @@ tex.sprint("\\directlua{tex.sprint(tex.box[0].width)}")
\typebuffer
-because now we get: {\tttf\ctxluabuffer}. It's not that complex to write some
-support code that makes this more convenient. This can work out quite well but
-there is a drawback. If we use this code:
+and now we get: {\tttf\ctxluabuffer}, but this use is a bit awkward.
+
+It's not that complex to write some support code that is convenient and this can
+work out quite well but there is a drawback. If we add references to the status
+of the input pointer:
\startbuffer
print(status.input_ptr)
@@ -85,24 +89,24 @@ tex.sprint("\\directlua{print(status.input_ptr)\
\typebuffer
-Here we get \type {6} and \type {7} reported. You can imagine that when a lot of
-nested \type {\directlua} calls happen, we can get an overflow of the input level
-or (depending on what we do) the input stack size. Ideally we want to do a \LUA\
-call, temporarily go to \TEX, return to \LUA, etc.\ without needing to worry
-about nesting and possible crashes due to \LUA\ itself running into problems. One
-charming solution is to use so|-|called coroutines: independent \LUA\ threads
-that one can switch between --- you jump out from the current routine to another
-and from there back to the current one. However, when we use \type {\directlua}
-for that, we still have this nesting issue and what is worse, we keep nesting
-function calls too. This can be compared to:
+we then get \type {6} and \type {7} reported. You can imagine that when a lot of
+nested \type {\directlua} calls happen, this can lead to an overflow of the input
+level or (depending on what we do) the input stack size. Ideally we want to do a
+\LUA\ call, temporarily go to \TEX, return to \LUA, etc.\ without needing to
+worry about nesting and possible crashes due to \LUA\ itself running into
+problems. One charming solution is to use so|-|called coroutines: independent
+\LUA\ threads that one can switch between --- you jump out from the current
+routine to another and from there back to the current one. However, when we use
+\type {\directlua} for that, we still have this nesting issue and what is worse,
+we keep nesting function calls too. This can be compared to:
\starttyping
\def\whatever{\ifdone\whatever\fi}
\stoptyping
-where at some point \type {\ifdone} is false so we quit. But we keep nesting when
-the condition is met, so eventually we can end up with some nesting related
-overflow. The following:
+where at some point \type {\ifdone} would be false so we quit, but we keep
+nesting when the condition is met and eventually we will end up with some nesting
+related overflow. The following:
\starttyping
\def\whatever{\ifdone\expandafter\whatever\fi}
@@ -122,7 +126,7 @@ and call that one with:
\luafunction 1
\stoptyping
-This is a bit faster than calling a function like:
+This is a bit faster than calling a function such as:
\starttyping
\directlua{HiThere()}
@@ -134,14 +138,28 @@ which can also be achieved by
\directlua{print("Hi there!")}
\stoptyping
-which sometimes can be more convenient. Anyway, a function call is what we can
-use for our purpose as it doesn't involve interpretation and effectively behaves
-like a tail call. The following snippet shows what we have in mind:
+and is sometimes more convenient. Don't overestimate the gain in speed because
+\type {directlua} is quite efficient too (and on an average run a user doesn't
+call it that often, millions of times that is). Anyway, a function call is what
+we can use for our purpose as it doesn't involve interpretation and effectively
+behaves like a tail call. The following snippet shows what we have in mind:
+
+\startbuffer[demo]
+tex.routine(function()
+ tex.sprint(tex.box[0].width)
+ tex.sprint("\\enspace")
+ tex.sprint("\\setbox0\\hbox{!}")
+ tex.yield()
+ tex.sprint(tex.box[0].width)
+end)
+\stopbuffer
+
+\typebuffer[demo]
\startbuffer[code]
local stepper = nil
local stack = { }
-local fid = 0xFFFFFF
+local fid = 2 -- make sure to take a free slot
local goback = "\\luafunction" .. fid .. "\\relax"
function tex.resume()
@@ -166,27 +184,24 @@ function tex.routine(f)
stepper = coroutine.create(f)
tex.sprint(goback)
end
-\stopbuffer
-\ctxluabuffer[code]
+-- Because we protect against abuse and overload of functions, in ConTeXt we
+-- need to do the following:
-\startbuffer[demo]
-tex.routine(function()
- tex.sprint(tex.box[0].width)
- tex.sprint("\\enspace")
- tex.sprint("\\setbox0\\hbox{!}")
- tex.yield()
- tex.sprint(tex.box[0].width)
-end)
+if context then
+ fid = context.functions.register(tex.resume)
+ goback = "\\luafunction" .. fid .. "\\relax"
+end
\stopbuffer
-\typebuffer[demo]
We start a routine, jump out to \TEX\ in the middle, come back when we're done
-and continue. This gives us: \ctxluabuffer [demo], which is what we expect.
-
-\setbox0\hbox{xxxxxxxxxxx}
+and continue. This gives us: \ctxluabuffer [code,demo], which is what we expect.
-\ctxluabuffer[demo]
+% What does this accomplish (or is it left over)?
+%
+% \setbox0\hbox{xxxxxxxxxxx}
+%
+% \ctxluabuffer[demo]
This mechanism permits efficient (nested) loops like:
@@ -219,9 +234,10 @@ e.g.\ the space) then the main difference is that instead of a small delay due t
the loop unfolding in a large set of prints and accumulated content, we now get a
steady flushing and processing.
-However, we can still have an overflow of input buffers because we still nest
-them: the limitation at the \TEX\ end has moved to a limitation at the \LUA\ end.
-How come? Here is the code that we use:
+However, even using this scheme we can still have an overflow of input buffers
+because we still nest them: the limitation at the \TEX\ end has moved to a
+limitation at the \LUA\ end. How come? Here is the code that we use defining the
+function \type {tex.yield()}:
\typebuffer[code]
@@ -233,12 +249,12 @@ then you will not easily overflow.
When I picked up this side project and wondered how to get around it, it suddenly
struck me that if we could just quit the current input level then nesting would
not be a problem. Adding a simple helper to the engine made that possible (of
-course figuring it out took a while):
+course figuring this out took a while):
\startbuffer[code]
local stepper = nil
local stack = { }
-local fid = 0xFFFFFF
+local fid = 3 -- make sure to take a frees slot
local goback = "\\luafunction" .. fid .. "\\relax"
function tex.resume()
@@ -270,16 +286,24 @@ function tex.routine(f)
stepper = coroutine.create(f)
tex.sprint(goback)
end
+
+-- Again we need to do it as follows in ConTeXt:
+
+if context then
+ fid = context.functions.register(tex.resume)
+ goback = "\\luafunction" .. fid .. "\\relax"
+end
\stopbuffer
\ctxluabuffer[code]
\typebuffer[code]
-The trick is in \type {texio.closeinput}, a recent helper and one that should be
-used with care. We assume that the user knows what she or he is doing. On an old
-laptop with a i7-3840 processor running \WINDOWS\ 10 the following snippet takes
-less than 0.35 seconds with \LUATEX\ and 0.26 seconds with \LUAJITTEX.
+The trick is in \type {texio.closeinput}, a recent helper to the engine and one
+that should be used with care. We assume that the user knows what she or he is
+doing. On an older laptop with a i7-3840 processor running \WINDOWS\ 10 the
+following snippet takes less than 0.35 seconds with \LUATEX\ and 0.26 seconds
+with \LUAJITTEX.
\startbuffer[code]
tex.routine(function()
@@ -302,7 +326,7 @@ end)
% \testfeatureonce {1} {\setbox0\hpack{\ctxluabuffer[code]}} \elapsedtime
-Say that we run the bad snippet:
+Say that we were to run the bad snippet:
\startbuffer[code]
for i=1,10000 do
@@ -319,7 +343,7 @@ end
% \testfeatureonce {1} {\setbox0\hpack{\ctxluabuffer[code]}} \elapsedtime
-This time we need 0.12 seconds in both engines. So what if we run this:
+This executes in only 0.12 seconds in both engines. So what if we run this:
\startbuffer[code]
\dorecurse{10000}{%
@@ -339,7 +363,7 @@ This time we need 0.12 seconds in both engines. So what if we run this:
Pure \TEX\ needs 0.30 seconds for both engines but there we lose 0.13 seconds on
the loop code. In the \LUA\ example where we yield, the loop code takes hardly
any time. As we need only 0.05 seconds more it demonstrates that when we use the
-power of \LUA\ the performance hit of the switch is quite small: we yield 40.000
+power of \LUA, the performance hit of the switch is quite small: we yield 40.000
times! In general, such differences are far exceeded by the overhead: the time
needed to typeset the content (which \type {\hpack} doesn't do), breaking
paragraphs into lines, constructing pages and other overhead involved in the run.
@@ -385,11 +409,11 @@ Now, in order to stay realistic, this macro can also be defined as:
We get the same result: \quotation {\getbuffer}.
-We have been using a \LUA|-|\TEX\ mix for over a decade now in \CONTEXT, and have
+We have been using a \LUA|-|\TEX\ mix for over a decade now in \CONTEXT\ and have
never really needed this mixed model. There are a few places where we could
-(have) benefitted from it and we might use it in a few places, but so far we have
-done fine without it. In fact, in most cases typesetting can be done fine at the
-\TEX\ end. It's all a matter of imagination.
+(have) benefited from it and now we might use it in a few places, but so far we
+have done fine without it. In fact, in most cases typesetting can be done fine at
+the \TEX\ end. It's all a matter of imagination.
\stopchapter
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/publications/122176.pdf b/Master/texmf-dist/doc/context/sources/general/manuals/publications/122176.pdf
index f8db03c1c25..7bca4089aa6 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/publications/122176.pdf
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/publications/122176.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/publications/124484.pdf b/Master/texmf-dist/doc/context/sources/general/manuals/publications/124484.pdf
index 227a35b2938..3af8bbf9ae0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/publications/124484.pdf
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/publications/124484.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/publications/4953942.pdf b/Master/texmf-dist/doc/context/sources/general/manuals/publications/4953942.pdf
index 02c6cc22a28..860bcf80479 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/publications/4953942.pdf
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/publications/4953942.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/publications/971.pdf b/Master/texmf-dist/doc/context/sources/general/manuals/publications/971.pdf
index a2fbc32c778..2ffb5704492 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/publications/971.pdf
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/publications/971.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/sql/sql-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/sql/sql-mkiv.tex
index 4d2ecbc6e9b..835065ba041 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/sql/sql-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/sql/sql-mkiv.tex
@@ -493,8 +493,8 @@ context --extra=sql-tables --help
\startsection[title=Example]
-The distribution has a few examples, for instance a logger. The following code shows
-a bit of this (we assume that the swiglib sqlite module is present):
+The distribution has a few examples, for instance a logger. The following code
+shows a bit of this (we assume that \SQLITE\ is installed):
\startbuffer
require("util-sql")
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/svg/mozilla-tiger.svg b/Master/texmf-dist/doc/context/sources/general/manuals/svg/mozilla-tiger.svg
new file mode 100644
index 00000000000..f74af7dd117
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/svg/mozilla-tiger.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg"><path fill="#d87512" d="M17.786 44.63c-.606.115-1.23.173-1.854.173-2.444 0-4.644-.864-6.04-2.375-.855-.92-1.394-2.147-1.517-3.47-.126-1.243.067-2.638.58-4.163.325-1.016.83-2.01 1.365-3.064.216-.426.437-.858.65-1.302.702-1.454 1.504-3.164 2.11-5.05.715-2.188.943-4.287.682-6.23-.267-2.102-.994-3.972-1.74-5.685a2.992 2.992 0 0 0-4.15-1.446c-.71.375-1.23 1-1.467 1.77a2.983 2.983 0 0 0 .218 2.292c.632 1.19 1.314 2.596 1.592 3.977.238 1.137.18 2.41-.184 3.897-.37 1.538-.976 3.143-1.522 4.518-.16.406-.33.816-.507 1.234-.507 1.215-1.032 2.47-1.364 3.838-.55 2.14-.666 4.152-.348 5.97.36 2.163 1.41 4.14 2.955 5.567 2.027 1.88 4.808 2.914 7.826 2.914 1.14 0 2.274-.146 3.375-.437l-.66-2.923"/><g fill="#bc600d"><path d="M11.585 43.742s.387 1.248.104 3.05c0 0 2.045-.466 1.898-2.27 0 0-.815-.29-2-.78M9.19 41.484S8.98 42.94 7.93 44.43c0 0 2.103.42 2.774-1.265 0 0-.696-.66-1.515-1.68M8.398 37.21s-.926 1.432-3.23 2.322c0 0 1.514 2.303 3.53.904 0 0-.237-1.388-.3-3.226M12.964 15.833s-1.685.798-3.783 3.45c0 0 2.1 1.55 4.663 2.228 0 0 .285-3.093-.88-5.677M13.5 23.873s-2.988.544-5.57 2.794c0 0 1.615 1.708 3.583 2.62 0 0 1.678-3.39 1.987-5.414M10.32 31.73s-1.483 0-4.483.812c0 0-.01 2.873 2.94 2.823 0 0 .747-1.75 1.544-3.635"/></g><g fill="#d87512"><path d="M53.33 39.37c0-4.484-35.622-4.484-35.622 0 0 10.16.05 10.25 17.81 10.25 17.762 0 17.812-.09 17.812-10.25"/><path d="M42.645 56.04c1.688 2.02 9.275.043 10.504-2.28 5.01-9.482-.006-13.58-.006-13.58l-10.5 1.313s-2.154 11.977 0 14.547"/></g><g fill="#bc600d"><path d="M54.2 41.496s-.336 4.246-4.657 9.573c0 0 4.38-1.7 5.808-4.3 0 0 .448-3.02-1.15-5.274M55.08 48.69s-1.065 1.88-3.563 3.872c0 0 1.78-.03 2.576-.785 0 0 .77-1.41.987-3.086"/></g><path fill="#f29a2e" d="M35.484 60.38c1.87 2.23 8.547 2.09 10.574 0 2.904-2.995 2.78-16.656 2.904-23.314l-12.418-1.053s-3.444 21.52-1.06 24.367"/><g fill="#bc600d"><path d="M48.21 53.53s-3.578-3.443-8.738-.013c0 0 5.754 2.455 7.365 5.672 0 0 1.126-2.245 1.373-5.66M48.775 46.06s-3.852-3.09-7.938 1.43c0 0 4.452-.47 7.632 3.635 0 0 .493-3.05.305-5.065"/></g><g fill="#3e4347"><path d="M43.847 61.57l-.397-2.765 1.344 2.445zM40.41 61.996l.502-3.294.498 3.294zM36.713 61.3l1.317-2.26-.372 2.59z"/></g><path fill="#d87512" d="M28.388 56.04c-1.688 2.02-9.277.043-10.504-2.28-5.01-9.482.004-13.58.004-13.58l10.5 1.313s2.154 11.977 0 14.547"/><g fill="#bc600d"><path d="M16.833 41.496s.336 4.246 4.657 9.573c0 0-4.38-1.7-5.807-4.3 0 0-.448-3.02 1.15-5.274M15.957 48.69s1.066 1.88 3.563 3.872c0 0-1.782-.03-2.576-.785 0 0-.772-1.41-.987-3.086"/></g><path fill="#f29a2e" d="M35.548 60.38c-1.87 2.23-8.548 2.09-10.575 0-2.904-2.995-2.78-16.656-2.904-23.314l12.417-1.053s3.446 21.52 1.06 24.367"/><g fill="#bc600d"><path d="M22.822 53.53s3.58-3.443 8.74-.013c0 0-5.754 2.455-7.367 5.672 0 0-1.125-2.245-1.373-5.66M22.255 46.06s3.852-3.09 7.94 1.43c0 0-4.453-.47-7.633 3.635 0 0-.493-3.05-.307-5.065"/></g><g fill="#3e4347"><path d="M26.24 61.25l1.345-2.445-.395 2.765zM29.62 61.996l.5-3.294.5 3.294zM33.375 61.63L33 59.04l1.32 2.26zM35.516 60.46c-.395-2.48-.482-4.96-.5-7.438.015-2.48.104-4.96.5-7.44.396 2.48.485 4.96.5 7.44-.018 2.48-.106 4.96-.5 7.438"/></g><path fill="#f29a2e" d="M27.777 6.994c0 3.82-2.727 6.987-6.086 6.915C11.83 13.7 15.893 2 15.893 2c3.36 0 11.885 1.176 11.885 4.994"/><path fill="#af5a31" d="M24.05 7.752c0 2.037-1.454 3.727-3.248 3.688-5.26-.11-3.093-6.353-3.093-6.353 1.792 0 6.34.628 6.34 2.665"/><path fill="#f29a2e" d="M43.26 6.994c0 3.82 2.726 6.987 6.086 6.915 9.86-.21 5.8-11.91 5.8-11.91C51.782 2 43.26 3.176 43.26 6.994"/><path fill="#af5a31" d="M46.983 7.752c0 2.037 1.455 3.727 3.247 3.688 5.26-.11 3.094-6.353 3.094-6.353-1.794 0-6.34.628-6.34 2.665"/><path fill="#f29a2e" d="M55.806 33.378c0 7.155-9.517 8.13-20.288 8.13-10.776 0-20.29-.975-20.29-8.13 0-29.96 11.596-29.14 20.29-29.14 8.69 0 20.288-.82 20.288 29.14"/><g fill="#3e4347"><path d="M35.54 7.59c3.24 0 6.15 1.084 8.156 2.81-.77-2.945-4.135-5.16-8.173-5.16-4.06 0-7.442 2.238-8.186 5.204 2.01-1.753 4.938-2.855 8.204-2.855"/><path d="M35.535 11.193c2.217 0 4.21.744 5.584 1.925-.528-2.02-2.835-3.534-5.6-3.534-2.78 0-5.095 1.533-5.605 3.564 1.376-1.198 3.383-1.955 5.62-1.955"/></g><path fill="#ffe8bb" d="M29.553 43.727l-18.408-7.01 4.24-9.06s2.704 3.85 13.29 6.82l.878 9.243"/><path fill="#3e4347" d="M29.37 39.77c-7.462-1.27-16.325-6.673-16.48-6.75l.992-2.168c.184.092 8.806 5.342 15.853 6.544l-.366 2.374"/><path fill="#ffe8bb" d="M41.48 43.727l18.406-7.01-4.24-9.06s-2.704 3.85-13.29 6.82l-.876 9.243"/><path fill="#3e4347" d="M41.663 39.77c7.46-1.27 16.325-6.673 16.48-6.75l-.993-2.168c-.184.092-8.808 5.342-15.852 6.544l.365 2.374"/><g fill="#ffe8bb"><path d="M43.524 45.57C38.752 42.023 41.4 33.86 41.4 33.86c-5.657 5.906-12.662 8.74-12.662 8.74 1.608 5.446 5.77 6.412 5.77 6.412-.34-1.835.663-3.302.663-3.302 1.68 2.22 5.03 2.986 5.03 2.986-1.287-1.508-.948-3.835-.948-3.835 2.326.875 4.27.71 4.27.71"/><path d="M42.29 42.97c-2.634 2.247-10.917 2.247-13.553 0-2.856-2.435-2.495-7.144.1-9.884 2.397-2.527 10.958-2.527 13.355 0 2.595 2.74 2.956 7.45.098 9.883"/></g><g fill="#3e4347"><path d="M36.18 40.48a.69.69 0 0 1-.644-.477c-.227-.67-.77-3.293-.71-5.498.01-.398.325-.71.7-.698.38.01.674.343.663.74-.057 2.01.46 4.466.633 4.974.127.375-.06.786-.414.92a.607.607 0 0 1-.23.04"/><path d="M30.504 43.25c.21-.202.394-.408.582-.61.188-.204.378-.405.57-.604.385-.396.782-.78 1.2-1.145a14.125 14.125 0 0 1 2.745-1.9c.504-.263 1.032-.49 1.59-.654s1.153-.273 1.772-.253c.31.01.623.055.928.146.307.088.602.23.86.416.263.19.485.422.652.684.17.257.287.54.35.83a4.247 4.247 0 0 0-.677-.448 2.567 2.567 0 0 0-.68-.237c-.447-.088-.887-.04-1.33.06-.89.216-1.786.65-2.69 1.114-.905.466-1.818.983-2.776 1.466-.48.24-.97.473-1.48.682-.256.103-.517.202-.783.285-.27.078-.546.155-.833.167"/></g><path fill="#f15a61" d="M41.34 31.743c-1.17-.528-4.757-.57-5.83-.57-1.07 0-4.66.042-5.83.57-.832.376-.187 1.31 2.027 2.116 1.397.506 2.733.666 3.803.666 1.07 0 2.405-.16 3.805-.667 2.213-.808 2.856-1.74 2.025-2.117"/><g fill="#3e4347"><path d="M29.917 23.48l1.61 5.292L26.954 26z"/><path d="M22.645 31.828c-.522 0-.932-.056-1.17-.098-2.986-.52-4.632-1.996-6.09-4.067l.185-2.472c1.52 1.446 3.953 3.76 6.28 4.167 1.156.2 2.853-.016 4.15-1.234 1.537-1.44 2.263-4.05 2.1-7.547l1.635.132c.2 4.312-.116 7.244-2.212 9.212-1.692 1.59-3.613 1.908-4.878 1.908M41.12 23.48l-1.613 5.292L44.08 26z"/><path d="M48.39 31.828c.52 0 .93-.056 1.167-.098 2.99-.52 4.637-1.996 6.09-4.067l-.182-2.472c-1.52 1.446-3.955 3.76-6.28 4.167-1.156.2-2.855-.016-4.154-1.234-1.532-1.44-2.258-4.05-2.095-7.547l-1.636.132c-.202 4.312.114 7.244 2.213 9.212 1.69 1.59 3.61 1.908 4.877 1.908"/></g><path fill="#ffe8bb" d="M30.25 22.09c-.852 5.282-3.728 5.87-6.696 5.577-2.986-.294-5.396-2.667-5.396-6.743 0-4.28 0-4.28 6.647-5.752 6.728-1.49 6 3.437 5.445 6.918"/><path fill="#3e4347" d="M29.16 22.547c-.244 2.534-2.61 4.357-5.287 4.072-2.674-.286-4.645-2.57-4.402-5.102s.28-2.75 5.108-2.237c4.83.514 4.824.737 4.582 3.267"/><path fill="#fff" d="M27.59 21.884c-.16 1.688-1.74 2.903-3.522 2.714-1.785-.19-3.096-1.712-2.936-3.4.163-1.69.186-1.835 3.406-1.493 3.22.344 3.215.49 3.053 2.18"/><g fill="#3e4347"><ellipse cx="25.5" cy="21.08" rx="1.45" ry="1.647"/><path d="M31.27 17.896c.42 0 .807-.284.936-.728.16-.546-.133-1.122-.65-1.29l-5.98-1.924c-.516-.166-1.065.14-1.225.685-.155.543.136 1.12.652 1.287l5.98 1.924a.95.95 0 0 0 .288.046"/></g><path fill="#ffe8bb" d="M40.78 22.09c.855 5.282 3.73 5.87 6.7 5.577 2.984-.294 5.395-2.667 5.395-6.743 0-4.28-.002-4.28-6.646-5.752-6.73-1.49-6.01 3.437-5.45 6.918"/><path fill="#3e4347" d="M41.873 22.547c.243 2.534 2.61 4.357 5.287 4.072 2.674-.286 4.646-2.57 4.402-5.102-.242-2.533-.28-2.75-5.107-2.237-4.83.514-4.824.737-4.582 3.267"/><path fill="#fff" d="M43.44 21.884c.16 1.688 1.737 2.903 3.522 2.714 1.783-.19 3.098-1.712 2.936-3.4-.16-1.69-.188-1.835-3.404-1.493-3.22.344-3.217.49-3.054 2.18"/><g fill="#3e4347"><ellipse cx="47.722" cy="20.932" rx="1.45" ry="1.647"/><path d="M39.76 17.896a.982.982 0 0 1-.935-.728c-.16-.546.132-1.122.65-1.29l5.98-1.924c.517-.166 1.063.14 1.224.685.155.543-.136 1.12-.653 1.287l-5.98 1.924a.96.96 0 0 1-.287.046"/></g></svg>
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx-microsoft.lua b/Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx-microsoft.lua
new file mode 100644
index 00000000000..9b55e87ca15
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx-microsoft.lua
@@ -0,0 +1,113 @@
+return {
+ [[
+ <svg id="glyph7" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <rect x="100" y="-430" width="200" height="430" fill="darkred" />
+ <rect x="100" y="-635" width="200" height="135" fill="darkblue" />
+ </svg>
+ ]],
+ [[
+ <svg id="glyph7" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 1000 1000 1000">
+ <rect x="100" y="570" width="200" height="430" fill="darkgreen" />
+ <rect x="100" y="365" width="200" height="135" fill="darkblue" />
+ </svg>
+ ]],
+ [[
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="i-base">
+ <rect x="100" y="570" width="200" height="430" fill="darkblue" />
+ </g>
+ </defs>
+ <g id="glyph2" transform="translate(0,-1000)">
+ <use xlink:href="#i-base" />
+ </g>
+ </svg>
+ ]],
+ [[
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="i-base">
+ <rect x="100" y="570" width="200" height="430" fill="darkred" />
+ </g>
+ </defs>
+ <g id="glyph13" transform="translate(0,-1000)">
+ <use xlink:href="#i-base" />
+ <rect x="100" y="365" width="200" height="135" fill="darkblue" />
+ </g>
+ </svg>
+ ]],
+ [[
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="i-base">
+ <rect x="100" y="570" width="200" height="430" fill="darkgreen" />
+ </g>
+ </defs>
+ <g id="glyph14" transform="translate(0,-1000)">
+ <use xlink:href="#i-base" />
+ <polygon fill="darkblue" points="120,500 280,500 435,342 208,342"/>
+ </g>
+ </svg>
+ ]],
+ [[
+ <svg id="glyph7" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 1000 1000 1000">
+ <defs>
+ <linearGradient id="grad" x1="0%" y1="0%" x2="0%" y2="100%">
+ <stop offset="0%" stop-color="darkblue" stop-opacity="1" />
+ <stop offset="100%" stop-color="#00aab3" stop-opacity="1" />
+ </linearGradient>
+ </defs>
+ <rect x="100" y="570" width="200" height="430" fill="blue" xfill="url(#grad)" />
+ <rect x="100" y="365" width="200" height="135" fill="green" xfill="currentColor" />
+ </svg>
+ ]],
+ [[
+ <svg id="glyph7" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 1000 1000 1000">
+ <defs>
+ <linearGradient id="grad" x1="0%" y1="0%" x2="0%" y2="100%">
+ <stop offset="0%" stop-color="var(--color0,darkblue)" stop-opacity="1" />
+ <stop offset="100%" stop-color="var(--color1,#00aab3)" stop-opacity="1" />
+ </linearGradient>
+ </defs>
+ <rect x="100" y="570" width="200" height="430" fill="blue" xfill="url(#grad)" />
+ <rect x="100" y="365" width="200" height="135" fill="darkblue" />
+ </svg>
+ ]],
+ [[
+ <svg id="glyph2" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 1000 1000 1000">
+ <image x="100" y="365" width="200" height="635"
+ xlink:href="data:image/png;base64,
+ iVBORw0KGgoAAAANSUhEUgAAAMgAAAJ7CAYAAACmmd5sAAAFZklEQVR42u3XsQ3D
+ MBAEQUpw9ypahrMPGGwiwcFMCQQW9zzWuu4FbJ2eAAQCAgGBgEBAICAQEAgIBAQC
+ CAQEAgIBgYBAQCAgEBAICAQEAggEBAICAYGAQEAgIBAQCAgEEAgIBAQCAgGBgEBA
+ ICAQEAgIBBAICAQEAgIBgYBAQCAgEBAIIBAQCAgEBAICAYGAQEAgIBAQCCAQEAgI
+ BAQCAgGBgEBAICAQQCAgEBAICAQEAgIBgYBAQCAgEEAgIBAQCAgEBAICAYGAQEAg
+ IBBPAAIBgYBAQCAgEBAICAQEAgIBBAICAYGAQEAgIBAQCAgEBAICAQQCAgGBgEBA
+ ICAQEAgIBAQCCAQEAgIBgYBAQCAgEBAICAQEAggEBAICAYGAQEAgIBAQCAgEAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAA4DHHWtftGWDv80sE2Ds9AQgEBAL+IPBuIAoBJxYIBAQCPukgEHBigUBAIOAP
+ AlgQiAtiQsCCgEDAJx0sCFgQsCAgEHBigQUB5oKYELAgIBDwSQcLAhYELAgIBJxY
+ YEEACwItEIWAEwucWGBBwIKABQGBgBMLLAhYEMCCQFwQEwJOLHBigQUBCwICAScW
+ WBCwIGBBAIFAPbHcWGBBwCcdLAgIBJxYYEHAgoAFAYEA88RyY4EFAZ90sCAgEBAI
+ +IOAQMCJBQIBBALxD+ITAj7p4MQCgYBAwB8EBAJOLBAICATwB4EYiELAiQUCAYGA
+ TzoIBJxYIBAQCPiDABYE4oKYELAgIBDwSQcLAhYELAgIBJxYYEGAuSAmBCwICAR8
+ 0sGCgAUBCwICAScWWBDAgkALRCHgxAInFlgQsCBgQUAg4MQCCwIWBLAgEBfEhIAT
+ C5xYYEHAgoBAwIkFFgQsCFgQQCBQTyw3FlgQ8EkHCwICAScWWBCwIGBBQCDAPLHc
+ WGBBwCcdLAgIBAQC/iAgEHBigUAAgUD8g/iEgE86OLFAICAQ8AcBgYATCwQCAgH8
+ QSAGohBwYoFAQCDgkw4CAScWCAQEAv4ggAWBuCAmBCwICAR80sGCgAUBCwICAScW
+ WBBgLogJAQsCAgGfdLAgYEHAgoBAwIkFFgSwINACUQg4scCJBRYELAhYEBAIOLHA
+ goAFASwIxAUxIeDEAicWWBCwICAQcGKBBQELAhYEEAjUE8uNBRYEfNLBgoBAwIkF
+ FgQsCFgQEAgwTyw3FlgQ8EkHCwICAYGAPwgIBJxYIBBAIBD/ID4h4JMOTiwQCAgE
+ /EFAIODEAoGAQAB/EIiBKAScWCAQEAj4pINAwIkFAgGBgD8IYEEgLogJAQsCAgGf
+ dLAgYEHAgoBAwIkFFgSYC2JCwIKAQMAnHSwIWBCwICAQcGKBBQEsCLRAFAJOLHBi
+ gQUBCwIWBAQCTiywIGBBAAsCcUFMCDixwIkFFgQsCAgEnFhgQcCCgAUBBAL1xHJj
+ gQUBn3SwICAQcGKBBQELAhYEBALME8uNBRYEfNLBgoBAQCDgDwICAScWCAQQCMQ/
+ iE8I+KSDEwsEAgIBfxAQCDixQCAgEMAfBGIgCgEnFggEBAI+6SAQcGKBQEAg4A8C
+ WBCIC2JCwIKAQMAnHSwIWBCwICAQcGKBBQHmgpgQsCAgEPBJBwsCFgQsCAgEnFhg
+ QQALAi0QhYATC5xYYEHAgoAFAYGAEwssCFgQwIJAXBATAk4scGKBBQELAgIBJxZY
+ ELAgYEEAgUA9sdxYYEHAJx0sCAgEnFhgQcCCgAUBgQDzxHJjgQUBn3SwICAQEAj4
+ g4BAwIkFAgEEAvEP4hMCPungxAKBgEDgH3wBrUwJtCBGuc0AAAAASUVORK5CYII=
+ "/>
+ </svg>
+ ]],
+}
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx-mozilla.lua b/Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx-mozilla.lua
new file mode 100644
index 00000000000..802efcf3d4a
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx-mozilla.lua
@@ -0,0 +1,365 @@
+return {
+ [[
+ <svg width="160" height="140" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <rect x="10" y="10" width="100" height="100" stroke="blue" fill="purple" fill-opacity="0.5" stroke-opacity="0.8"/>
+ </svg>
+ ]],
+ [[
+ <svg width="160" height="140" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <line x1="40" x2="120" y1="20" y2="20" stroke="black" stroke-width="20" stroke-linecap="butt"/>
+ <line x1="40" x2="120" y1="60" y2="60" stroke="black" stroke-width="20" stroke-linecap="square"/>
+ <line x1="40" x2="120" y1="100" y2="100" stroke="black" stroke-width="20" stroke-linecap="round"/>
+ </svg>
+ ]],
+ [[
+ <svg width="160" height="280" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <polyline points="40 60 80 20 120 60" stroke="black" stroke-width="20" stroke-linecap="butt" fill="none" stroke-linejoin="miter"/>
+ <polyline points="40 140 80 100 120 140" stroke="black" stroke-width="20" stroke-linecap="round" fill="none" stroke-linejoin="round"/>
+ <polyline points="40 220 80 180 120 220" stroke="black" stroke-width="20" stroke-linecap="square" fill="none" stroke-linejoin="bevel"/>
+ </svg>
+ ]],
+ [[
+ <svg width="200" height="150" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <path d="M 10 75 Q 50 10 100 75 T 190 75" stroke="black" stroke-linecap="round" stroke-dasharray="5,10,5" fill="none"/>
+ <path d="M 10 75 L 190 75" stroke="red" stroke-linecap="round" stroke-width="1" stroke-dasharray="5,5" fill="none"/>
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 30 10" xmlns="http://www.w3.org/2000/svg">
+ <circle cx="5" cy="5" r="3" stroke="green" />
+ <circle cx="15" cy="5" r="3" stroke="green" stroke-width="3" />
+ <circle cx="25" cy="5" r="3" stroke="green" stroke-width="2%" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 38 30" xmlns="http://www.w3.org/2000/svg">
+ <path stroke="black" fill="none" stroke-linejoin="miter" id="p1"
+ d="M1,9 l7 ,-3 l7 ,3
+ m2,0 l3.5 ,-3 l3.5 ,3
+ m2,0 l2 ,-3 l2 ,3
+ m2,0 l0.75,-3 l0.75,3
+ m2,0 l0.5 ,-3 l0.5 ,3" />
+ <path stroke="black" fill="none" stroke-linejoin="miter" stroke-miterlimit="1" id="p2"
+ d="M1,19 l7 ,-3 l7 ,3
+ m2, 0 l3.5 ,-3 l3.5 ,3
+ m2, 0 l2 ,-3 l2 ,3
+ m2, 0 l0.75,-3 l0.75,3
+ m2, 0 l0.5 ,-3 l0.5 ,3" />
+ <path stroke="black" fill="none" stroke-linejoin="miter" stroke-miterlimit="8" id="p3"
+ d="M1,29 l7 ,-3 l7 ,3
+ m2, 0 l3.5 ,-3 l3.5 ,3
+ m2, 0 l2 ,-3 l2 ,3
+ m2, 0 l0.75,-3 l0.75,3
+ m2, 0 l0.5 ,-3 l0.5 ,3" />
+ <path stroke="pink" fill="none" stroke-width="0.05"
+ d="M1, 9 l7,-3 l7,3 m2,0 l3.5,-3 l3.5,3 m2,0 l2,-3 l2,3 m2,0 l0.75,-3 l0.75,3 m2,0 l0.5,-3 l0.5,3
+ M1,19 l7,-3 l7,3 m2,0 l3.5,-3 l3.5,3 m2,0 l2,-3 l2,3 m2,0 l0.75,-3 l0.75,3 m2,0 l0.5,-3 l0.5,3
+ M1,29 l7,-3 l7,3 m2,0 l3.5,-3 l3.5,3 m2,0 l2,-3 l2,3 m2,0 l0.75,-3 l0.75,3 m2,0 l0.5,-3 l0.5,3" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="-3 0 33 10" xmlns="http://www.w3.org/2000/svg">
+ <line x1="0" y1="1" x2="30" y2="1" stroke="black" />
+ <line x1="0" y1="3" x2="30" y2="3" stroke="black" stroke-dasharray="3 1" />
+ <line x1="0" y1="5" x2="30" y2="5" stroke="black" stroke-dasharray="3 1" stroke-dashoffset="3" />
+ <line x1="0" y1="7" x2="30" y2="7" stroke="black" stroke-dasharray="3 1" stroke-dashoffset="-3" />
+ <line x1="0" y1="9" x2="30" y2="9" stroke="black" stroke-dasharray="3 1" stroke-dashoffset="1" />
+ <path d="M0,5 h-3 M0,7 h3 M0,9 h-1" stroke="rgba(255,0,0,.5)" />
+ </svg>
+ ]],
+ [[
+ <svg width="200" height="150" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <path d="M 10 75 Q 50 10 100 75 T 190 75" stroke="black" stroke-linecap="round" stroke-dasharray="5,10,5" fill="none"/>
+ <path d="M 10 75 L 190 75" stroke="red" stroke-linecap="round" stroke-dasharray="5,5" fill="none" stroke-width="1"/>
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+ <path fill="none" stroke="red"
+ d="M 10,10 h 10
+ m 0,10 h 10
+ m 0,10 h 10
+ M 40,20 h 10
+ m 0,10 h 10
+ m 0,10 h 10
+ m 0,10 h 10
+ M 50,50 h 10
+ m-20,10 h 10
+ m-20,10 h 10
+ m-20,10 h 10" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
+ <path fill="none" stroke="red" d="M 10,10 L 90,90 V 10 H 50" />
+ <path fill="none" stroke="red" d="M 110,10 l 80,80 v -80 h -40" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <path fill="none" stroke="red" d="M 10,90 C 30,90 25,10 50,10 S 70,90 90,90" />
+ <path fill="none" stroke="red" d="M 110,90 c 20,0 15,-80 40,-80 s 20,80 40,80" />
+ <g id="ControlPoints">
+ <line x1="10" y1="90" x2="30" y2="90" stroke="lightgrey" />
+ <circle cx="30" cy="90" r="1.5"/>
+ <line x1="50" y1="10" x2="25" y2="10" stroke="lightgrey" />
+ <circle cx="25" cy="10" r="1.5"/>
+ <line x1="50" y1="10" x2="75" y2="10" stroke="lightgrey" stroke-dasharray="2" />
+ <circle cx="75" cy="10" r="1.5" fill="lightgrey"/>
+ <line x1="90" y1="90" x2="70" y2="90" stroke="lightgrey" />
+ <circle cx="70" cy="90" r="1.5"/>
+ <circle cx="10" cy="90" r="1.5"/>
+ <circle cx="50" cy="10" r="1.5"/>
+ <circle cx="90" cy="90" r="1.5"/>
+ </g>
+ <use xlink:href="#ControlPoints" x="100" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <path fill="none" stroke="red" d="M 10,50 Q 25,25 40,50 t 30,0 30,0 30,0 30,0 30,0" />
+ <g>
+ <polyline points="10,50 25,25 40,50" stroke="rgba(0,0,0,.2)" fill="none" />
+ <circle cx="25" cy="25" r="1.5" />
+ <circle cx="10" cy="50" r="1.5"/>
+ <circle cx="40" cy="50" r="1.5"/>
+ <g id="SmoothQuadraticDown">
+ <polyline points="40,50 55,75 70,50" stroke="rgba(0,0,0,.2)" stroke-dasharray="2" fill="none" />
+ <circle cx="55" cy="75" r="1.5" fill="lightgrey" />
+ <circle cx="70" cy="50" r="1.5" />
+ </g>
+ <g id="SmoothQuadraticUp">
+ <polyline points="70,50 85,25 100,50" stroke="rgba(0,0,0,.2)" stroke-dasharray="2" fill="none" />
+ <circle cx="85" cy="25" r="1.5" fill="lightgrey" />
+ <circle cx="100" cy="50" r="1.5" />
+ </g>
+ <use xlink:href="#SmoothQuadraticDown" x="60" />
+ <use xlink:href="#SmoothQuadraticUp" x="60" />
+ <use xlink:href="#SmoothQuadraticDown" x="120" />
+ </g>
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
+ <path fill="none" stroke="red" d="M 6,10 A 6 4 10 1 0 14,10" />
+ <path fill="none" stroke="lime" d="M 6,10 A 6 4 10 1 1 14,10" />
+ <path fill="none" stroke="purple" d="M 6,10 A 6 4 10 0 1 14,10" />
+ <path fill="none" stroke="pink" d="M 6,10 A 6 4 10 0 0 14,10" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 -1 30 11" xmlns="http://www.w3.org/2000/svg">
+ <path stroke="red" d="M 5,1 l -4,8 8,0" />
+ <path stroke="red" d="M 15,1 l -4,8 8,0 -4,-8" />
+ <path stroke="red" d="M 25,1 l -4,8 8,0 z" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
+ <ellipse cx="100" cy="50" rx="100" ry="50" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+ <line x1="0" y1="80" x2="100" y2="20" stroke="black" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
+ <polygon points="0,100 50,25 50,75 100,0" />
+ <polygon points="100,100 150,25 150,75 200,0" fill="none" stroke="black" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
+ <polyline points="0,100 50,25 50,75 100,0" />
+ <polyline points="100,100 150,25 150,75 200,0" fill="none" stroke="black" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 220 100" xmlns="http://www.w3.org/2000/svg">
+ <rect width="100" height="100" />
+ <rect x="120" width="100" height="100" rx="15" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+ <path fill="none" stroke="red"
+ d="M 10,30
+ A 20,20 0,0,1 50,30
+ A 20,20 0,0,1 90,30
+ Q 90,60 50,90
+ Q 10,60 10,30 z" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="-10 -10 220 120" xmlns="http://www.w3.org/2000/svg">
+ <polygon fill-rule="nonzero" stroke="red" points="50,0 21,90 98,35 2,35 79,90"/>
+ <polygon fill-rule="evenodd" stroke="red" points="150,0 121,90 198,35 102,35 179,90"/>
+ </svg>
+ ]],
+ [[
+ <svg x="0" width="10" height="10" clip="auto">
+ <circle cx="5" cy="5" r="4" stroke="green" />
+ </svg>
+ ]],
+ [[
+ <svg x="10" width="10" height="10" clip="rect(1, 9, 8, 2)">
+ <circle cx="5" cy="5" r="4" stroke="green" />
+ </svg>
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+ <rect x="0" y="0" width="100%" height="100%" fill="red"/>
+ <circle cx="50%" cy="50%" r="4" fill="yellow"/>
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg">
+ <rect x="0" y="0" width="100%" height="100%" fill="green"/>
+ <circle cx="50%" cy="50%" r="4" fill="yellow"/>
+ </svg>
+ ]],
+ [[
+ <svg viewBox="-5 -5 10 10" xmlns="http://www.w3.org/2000/svg">
+ <rect x="0" y="0" width="100%" height="100%" fill="blue"/>
+ <circle cx="50%" cy="50%" r="4" fill="yellow"/>
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
+ <rect x="10" y="10" width="30" height="20" fill="green" />
+ <rect x="10" y="10" width="30" height="20" fill="red" transform="matrix(3 1 -1 3 30 40)" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+ <rect x="5" y="5" width="40" height="40" fill="green" />
+ <rect x="5" y="5" width="40" height="40" fill="blue" transform="translate(50)" />
+ <rect x="5" y="5" width="40" height="40" fill="red" transform="translate(0 50)" />
+ <rect x="5" y="5" width="40" height="40" fill="yellow" transform="translate(50,50)" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="-50 -50 100 100" xmlns="http://www.w3.org/2000/svg">
+ <circle cx="0" cy="0" r="10" fill="red" transform="scale(4)" />
+ <circle cx="0" cy="0" r="10" fill="yellow" transform="scale(1,4)" />
+ <circle cx="0" cy="0" r="10" fill="pink" transform="scale(4,1)" />
+ <circle cx="0" cy="0" r="10" fill="black" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="-12 -2 34 14" xmlns="http://www.w3.org/2000/svg">
+ <rect x="0" y="0" width="10" height="10" />
+ <rect x="0" y="0" width="10" height="10" fill="red" transform="rotate(100)" />
+ <rect x="0" y="0" width="10" height="10" fill="green" transform="rotate(100,10,10)" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="-5 -5 10 10" xmlns="http://www.w3.org/2000/svg">
+ <rect x="-3" y="-3" width="6" height="6" />
+ <rect x="-3" y="-3" width="6" height="6" fill="red" transform="skewX(30)" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="-5 -5 10 10" xmlns="http://www.w3.org/2000/svg">
+ <rect x="-3" y="-3" width="6" height="6" />
+ <rect x="-3" y="-3" width="6" height="6" fill="red" transform="skewY(30)" />
+ </svg>
+ ]],
+ [[
+ <svg width="100" viewBox="0 0 100 90" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <defs>
+ <path d="M50,0 21,90 98,35 2,35 79,90z" id="star" />
+ </defs>
+ <clipPath id="emptyStar">
+ <use xlink:href="#star" clip-rule="evenodd" />
+ </clipPath>
+ <rect clip-path="url(#emptyStar)" width="50" height="90" fill="blue" />
+ <clipPath id="filledStar">
+ <use xlink:href="#star" clip-rule="nonzero" />
+ </clipPath>
+ <rect clip-path="url(#filledStar)" width="50" height="90" x="50" fill="red" />
+ </svg>
+ ]],
+-- [[
+-- <svg viewBox="0 0 240 80" xmlns="http://www.w3.org/2000/svg">
+-- <style>
+-- .small { font: italic 13px sans-serif; }
+-- .heavy { font: bold 30px sans-serif; }
+-- .Rrrrr { font: italic 40px serif; fill: red; }
+-- </style>
+-- <text x="20" y="35" class="small">My</text>
+-- <text x="40" y="35" class="heavy">cat</text>
+-- <text x="55" y="55" class="small">is</text>
+-- <text x="65" y="55" class="Rrrrr">Grumpy!</text>
+-- </svg>
+-- ]],
+ [[
+ <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <marker id="arrow" viewBox="0 0 10 10" refX="5" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
+ <path d="M 0 0 L 10 5 L 0 10 z" />
+ </marker>
+ <marker id="dot" viewBox="0 0 10 10" refX="5" refY="5" markerWidth="5" markerHeight="5">
+ <circle cx="5" cy="5" r="5" fill="red" />
+ </marker>
+ </defs>
+ <polyline points="10,10 10,90 90,90" fill="none" stroke="black" marker-start="url(#arrow)" marker-end="url(#arrow)" />
+ <polyline points="15,80 29,50 43,60 57,30 71,40 85,15" fill="none" stroke="grey" marker-start="url(#dot)" marker-mid="url(#dot)" marker-end="url(#dot)" />
+ </svg>
+ ]],
+ -- from the attributes section
+ [[
+ <svg viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <linearGradient id="gradient" x1="0%" y1="0%" x2="0" y2="100%">
+ <stop offset="0%" style="stop-color:skyblue;" />
+ <stop offset="100%" style="stop-color:seagreen;" />
+ </linearGradient>
+ </defs>
+ <rect x="0" y="0" width="100%" height="100%" fill="url(#gradient)" />
+ <circle cx="50" cy="50" r="40" fill="black" />
+ <circle cx="150" cy="50" r="40" fill="black" opacity="0.3" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 400 100" xmlns="http://www.w3.org/2000/svg">
+ <circle cx="50" cy="50" r="40" />
+ <circle cx="150" cy="50" r="40" fill-opacity="0.7" />
+ <circle cx="250" cy="50" r="40" fill-opacity="50%" />
+ <circle cx="350" cy="50" r="40" style="fill-opacity: .25;" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 30 10" xmlns="http://www.w3.org/2000/svg">
+ <line x1="0" y1="1" x2="30" y2="1" stroke="black" />
+ <line x1="0" y1="3" x2="30" y2="3" stroke="black" stroke-dasharray="4" />
+ <line x1="0" y1="5" x2="30" y2="5" stroke="black" stroke-dasharray="4 1" />
+ <line x1="0" y1="7" x2="30" y2="7" stroke="black" stroke-dasharray="4 1 2" />
+ <line x1="0" y1="9" x2="30" y2="9" stroke="black" stroke-dasharray="4 1 2 3" />
+ </svg>
+ ]],
+ [[
+ <svg viewBox="-3 0 33 10" xmlns="http://www.w3.org/2000/svg">
+ <line x1="0" y1="1" x2="30" y2="1" stroke="black" />
+ <line x1="0" y1="3" x2="30" y2="3" stroke="black" stroke-dasharray="3 1" />
+ <line x1="0" y1="5" x2="30" y2="5" stroke="black" stroke-dasharray="3 1" stroke-dashoffset="3" />
+ <line x1="0" y1="7" x2="30" y2="7" stroke="black" stroke-dasharray="3 1" stroke-dashoffset="-3" />
+ <line x1="0" y1="9" x2="30" y2="9" stroke="black" stroke-dasharray="3 1" stroke-dashoffset="1" />
+ <path d="M0,5 h-3 M0,7 h3 M0,9 h-1" stroke="rgba(255,0,0,.5)" />
+ </svg>
+ ]],
+ [[
+ svg viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg">
+ <path d="M60,15 L60,110 M30,40 L90,40 M30,75 L90,75 M30,110 L90,110" stroke="grey" />
+ <text text-anchor="start" x="60" y="40">A</text>
+ <text text-anchor="middle" x="60" y="75">A</text>
+ <text text-anchor="end" x="60" y="110">A</text>
+ <circle cx="60" cy="40" r="3" fill="red" />
+ <circle cx="60" cy="75" r="3" fill="red" />
+ <circle cx="60" cy="110" r="3" fill="red" />
+ </svg>
+ ]],
+}
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx.tex b/Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx.tex
new file mode 100644
index 00000000000..11cf338957b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx.tex
@@ -0,0 +1,547 @@
+% language=us
+
+% \enabletrackers[metapost.svg.result]
+% \enabletrackers[metapost.svg.path]
+
+\enabledirectives[pdf.compact]
+
+% \nopdfcompression
+
+\def\showSVGcode#1#2%
+ {\ctxlua{metapost.showsvgpage{
+ filename = "#1",
+ index = tonumber(#2),
+ method = "code"
+ }}}
+
+\def\showSVGcodeG#1#2%
+ {\ctxlua{metapost.showsvgpage{
+ filename = "#1",
+ index = tonumber(#2),
+ method = "code",
+ x = 0,
+ y = 1000,
+ width = 1000,
+ height = 1000,
+ noclip = true
+ }}}
+
+\def\typeSVGcode#1#2%
+ {\ctxlua{metapost.typesvgpage{
+ filename = "#1",
+ index = tonumber(#2)
+ }}}
+
+\usemodule[abbreviations-logos]
+\usemodule[scite]
+
+\setuppapersize
+ [A4,landscape]
+
+\setuplayout
+ [backspace=1cm,
+ cutspace=2cm,
+ topspace=1cm,
+ width=middle,
+ height=middle,
+ header=0pt,
+ footer=0pt]
+
+\setupbodyfont
+ [dejavu,12pt]
+
+\setupwhitespace
+ [big]
+
+\setuphead
+ [chapter]
+ [style=\bfc,
+ color=darkblue]
+
+\setuphead
+ [section]
+ [style=\bfb,
+ color=darkblue]
+
+\starttext
+
+\startMPpage
+ drawlineoptions (withpen pencircle scaled 0.4 withcolor darkgray) ;
+ drawpointoptions (withpen pencircle scaled 0.8 withcolor darkred) ;
+ drawcontroloptions(withpen pencircle scaled 0.6 withcolor darkgreen) ;
+ drawpathoptions (withpen pencircle scaled 1.0 withcolor darkblue) ;
+
+ drawoptionsfactor := .5 ;
+ detailpaths ;
+
+ StartPage ;
+
+ fill Page withcolor darkblue ;
+
+ draw lmt_svg [
+ filename = "svglogo.svg",
+ origin = true,
+ ]
+ ysized (PaperHeight -64mm)
+ shifted (12mm,52mm) ;
+
+ draw textext.llft ("\strut in context")
+ ysized 34mm
+ shifted lrcorner Page
+ shifted (-8mm,84mm)
+ withcolor white ;
+
+ draw textext.llft ("\strut and metafun xl")
+ ysized 34mm
+ shifted lrcorner Page
+ shifted (-8mm,44mm)
+ withcolor white ;
+
+
+ StopPage ;
+\stopMPpage
+
+\starttitle[title=Introduction]
+
+This document is about using \SVG, an \XML\ based format for describing graphics
+and colorful font shapes in \CONTEXT. It's one of the external figure formats.
+Where we can use \METAPOST\ for all kind of systematic graphics, bitmap images
+and artistic outlines come from outside. Inclusion of \SVG\ using the methods
+discussed here is quite efficient and will work for many graphics, but when it
+doesn't you can always fall back on a conversion by \INKSCAPE. It's work in
+progress anyway.
+
+The document is made for viewing on the screen and has a bunch of examples taken
+from websites. We might add more in due time. The cover page has the \SVG\ logo
+taken from \WIKIPEDIA\ but with some details added. It's not a nice cover image
+but it will do for our purpose. Feel free to suggest additional examples.
+
+\startlines
+Hans Hagen
+Hasselt NL
+October 2019\high{+}
+\stoplines
+
+\stoptitle
+
+\starttitle[title=The \SVG\ format]
+
+\startsection[title=What it is]
+
+The Scalable Vector Graphics format (\SVG) showed up around the turn of this
+century. I remember looking into it and wondering to what extent it was a fresh
+development and not some kind of application format turned \XML. Most elements
+are empty elements and data lives in attributes. What I found most puzzling is
+that a path definition was an attribute and not just content, especially because
+it can be a pretty large blob of numbers and commands. Anyway, at that time I
+played a bit with conversion but in the end decided to just consider it an
+external format for which conversion to (say) \PDF\ by an external program was a
+reasonable. At some point that external program became \INKSCAPE\ and \CONTEXT\
+uses that to convert \SVG\ images to \PDF\ runtime (with caching).
+
+In the meantime edition one turned edition two and the advance of \HTML\ and
+\CSS\ has crept features into the format, thereby not making it look better. But,
+because viewers support rendering \SVG, we now also see graphics showing up. The
+ones that I have to deal with are educational graphics, and when you look into
+the files, they can be curiously inconsistent in the way parts of graphics are
+made. For instance, the numbers along an axis of a mathematical graphic can be a
+mix of references to a font (\type {<text/>}), references to symbols \type
+{<symbol/>} that have paths (\type {<path/>}) or just paths \type {<path/>}.
+Using a tool that can spit out something structured doesn't mean that all its
+users will structure.
+
+The \SVG\ format provides lines, rectangles, circles, ellipses, polylines,
+polygons and paths. Paths are defines as a sequence of moves, lines, cubic and
+quadratic curves, arcs, collected in the \type {d} attribute (a funny short name
+compared to the length of its content and the verbosity of other attribute
+names). They can be open or closed, and use different winding rules. Positions
+are absolute or relative. This all leaves a lot of room for error and confusion.
+When a path looks bad, it can be produced bad, or the interpretation can be bad.
+Interpretation can even be such that errors are catched which makes it hard to
+figure out what is really wrong. And as usual, bugs (and supposed catches) can
+become features in the end. So it might take a while before this kind of support
+in \CONTEXT\ becomes stable but once it is, normally we're okay for a while. And,
+one nice side effect of \XML\ is that it can't really crash processing as it's
+just data.
+
+\stopsection
+
+\startsection[title=Color fonts]
+
+Then color fonts showed up in \OPENTYPE\ and \SVG\ is one of the used
+sub|-|formats in that. Again it was convenient enough to rely on \INKSCAPE\ to do
+the conversion to \PDF\ blobs, but after a while I decided that a more native
+(built|-|in) support start making sense. A lot had happened since 2000, most
+noticeably the arrival of \LUATEX\ and \CONTEXT\ \MKIV\ followed by \LUAMETATEX\
+and \CONTEXT\ \LMTX, so a more direct support because more feasible. A more
+direct support has the advantage that we don't need to call an external program
+and cache the results (think of Emoji fonts with thousands of glyphs in \SVG\
+format). Also, direct conversion makes it possible to tweak colors and such,
+simply because the data goes through the \CONTEXT\ internals as part of the
+typesetting process. So, as a prelude to the \CONTEXT\ 2019 meeting a preliminary
+converter was made, color font support was partially redone, and afterward the
+converter got completed to the level needed for embedding more fancy graphics,
+including relabeling.
+
+\stopsection
+
+\startsection[title=In practice]
+
+In the end all is about paths or glyphs, plus some optional clipping and
+transformations. The rendering is controlled by attributes: color, transparency,
+line thickness, the way lines join and end, etc. Now, in the original
+specification that was done only with attributes, which is a clean and robust way
+of doing it, but later styles and classes were introduced and we now have a whole
+chain to consider when resolving a to be used attribute.
+
+\startitemize[packed]
+ \startitem attributes explicitly set by keys to an element \stopitem
+ \startitem attributes set in the \type {style} attribute \stopitem
+ \startitem attributes set via one or more \type {class} assignments \stopitem
+ \startitem attributes set for the specific element \stopitem
+ \startitem attributes inherited from an ancestor (somewhat vague) \stopitem
+ \startitem redundant (nested) attributes (text styling) \stopitem
+\stopitemize
+
+Where examples are often hand codes and therefore look ok, graphics that get
+generated can look quite horrible: the same parameters being set with different
+methods, even inconsistently, to mention one. But also, graphics can be read in,
+tweaked and saved again which in itself generates artifacts, etc. One can of
+course argue that \XML\ is not for human consumption but personally I tend to
+conclude that when a source file looks bad, the likelyhood is great that what it
+encodes looks bad too. And for instance \INKSCAPE\ provides ways to inspect and
+tweak the \XML\ in the editor.
+
+\stopsection
+
+\startsection[title=The conversion]
+
+This brings us to the conversion. As we need \PDF\ operators one method is to
+directly go from \SVG\ to \PDF. There is the issue of fonts, but as we delegate
+that to \TEX\ anyway, because that is kind of an abstraction. Such a conversion
+is comparable with going from \METAPOST\ to \PDF. However, for practical reasons
+an intermediate step has been chosen: we go from \SVG\ to \METAPOST\ first. This
+has the benefit that we need little code for color and transparency because
+\METAPOST\ (read: \METAFUN) already deals with that. We also don't need that much
+for text, as we deal with that in \METAPOST\ too, and that way we can even
+overload and reposition for instance labels in graphics relatively easy.
+
+Another advantage of the intermediate step is that we can combine \SVG\ graphics
+with \METAPOST\ code. Of course we can already combine external graphics with
+\METAPOST, but there is a big advantage here: the output is quite efficient. When
+we transform paths and pens in \METAPOST, the end result is often just a path,
+but where we to do a direct conversion to \PDF, we would either have to do
+calculations on our own, or we would have to use lots of transformation
+directives. In the end, especially because \METAPOST\ is so fast, the indirect
+route pays of well (and I haven't even optimized it yet).
+
+\stopsection
+
+\startsection[title=Remark]
+
+In the perspective if using \TEX\ and \METAPOST\ it makes sense to keep an eye on
+consistency. You can make quite structured \SVG\ images if you want to. When you
+use a graphical editor you can even consider using a normal text editor to clean
+up the code occasionally. The cleaner the code, the more predictable the outcome
+will become. Looking at the code might also give an impression of what features
+not to use of use differently. Of course this makes most sense in situations
+where there are many graphics and long|-|term (re)use is needed.
+
+\stopsection
+
+\stoptitle
+
+\starttitle[title=Embedding graphics]
+
+\startsection[title=External figures]
+
+At least for now, the default \SVG\ inclusions is done via an external converter
+but you can use the internal one by specifying a conversion. The next example
+demonstrates that it works like any external figure:
+
+\startbuffer
+\startcombination[4*1]
+ {\externalfigure[mozilla-tiger.svg][conversion=mp]} {1}
+ {\externalfigure[mozilla-tiger.svg][conversion=mp,height=1cm]} {2}
+ {\externalfigure[mozilla-tiger.svg][conversion=mp,height=3cm,width=1cm]} {3}
+ {\externalfigure[mozilla-tiger.svg][conversion=mp,height=1cm,width=8cm]} {4}
+\stopcombination
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+We get:
+
+\startlinecorrection
+ \getbuffer
+\stoplinecorrection
+
+\stopsection
+
+\startsection[title=Internal figures]
+
+You can put some \SVG\ code in a buffer:
+
+\startbuffer
+\startbuffer[svgtest]
+ <svg>
+ <rect
+ x="0" y="0" width="80" height="20"
+ fill="blue" stroke="red" stroke-width="3"
+ stroke-linejoin="miter"
+ transform="rotate(10)"
+ />
+ </svg>
+\stopbuffer
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+In the future more options might be added but for now there's only an offset
+possible:
+
+\startbuffer
+\startcombination[2*1]
+ {\framed[offset=overlay]{\includesvgbuffer[svgtest]}} {default}
+ {\framed[offset=overlay]{\includesvgbuffer[svgtest][offset=2bp]}} {some offset}
+\stopcombination
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+There is a companion command \type {\includesvgfile} which accepts a filename
+and also supports offsets. Sometimes the offset is needed to prevent unwanted
+clipping.
+
+\stopsection
+
+\startsection[title=Mixing in \METAFUN]
+
+An \SVG\ image can be directly included in an \METAFUN\ image. This makes it
+possible to enhance (or manipulate) such an image, as in:
+
+\startbuffer
+\startMPcode
+ draw lmt_svg [
+ filename = "mozilla-tiger.svg",
+ origin = true,
+ ] rotated 45 slanted .75 ysized 2cm ;
+
+ setbounds currentpicture to
+ boundingbox currentpicture
+ enlarged 1mm ;
+
+ addbackground
+ withcolor "darkgray" ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+An \SVG\ image included this way becomes a regular \METAPOST\ picture, so a
+collection of paths. Because \METAPOST\ on the average produces rather compact
+output the \SVG\ image normally also is efficiently embedded. You don't need to
+worry about loosing quality, because \METAPOST\ is quite accurate and we use so
+called \quote {double} number mode anyway.
+
+\startlinecorrection
+ \getbuffer
+\stoplinecorrection
+
+Another trick is to inline the code:
+
+\startbuffer
+\startMPcode
+ draw svg "<svg>
+ <circle
+ cx='50' cy='50' r='40'
+ stroke='green' stroke-width='10' stroke-opacity='0.3'
+ fill='red' fill-opacity='0.3'
+ />
+ <circle
+ cx='150' cy='50' r='40'
+ stroke='green' stroke-width='10'
+ fill='red'
+ opacity='0.3'
+ />
+ </svg>" ;
+\stopMPcode
+\stopbuffer
+
+It doesn't really make sense as \METAPOST\ code is just as simple but
+it looks cool:
+
+\startlinecorrection
+ \getbuffer
+\stoplinecorrection
+
+And actually it's less code (which internally of course expands to
+more):
+
+\startbuffer
+\startMPcode
+ pickup pencircle scaled 10;
+ path p ; p := fullcircle scaled 80 ;
+ fill p shifted (50,50) withcolor blue
+ withtransparency(1,0.3) ;
+ draw p shifted (50,50) withcolor yellow
+ withtransparency(1,0.3) ;
+ draw image (
+ fill p shifted (150,50) withcolor blue ;
+ draw p shifted (150,50) withcolor yellow ;
+ setgroup currentpicture to boundingbox currentpicture
+ withtransparency(1,0.3) ;
+ ) ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+It's all a matter of taste. Watch the grouping trick!
+
+\startlinecorrection
+ \getbuffer
+\stoplinecorrection
+
+\stopsection
+
+\startsection[title=Fonts]
+
+{\em This is still experimental.}
+
+\stopsection
+
+\startsection[title=Labels]
+
+{\em This is still experimental.}
+
+\stopsection
+
+\startsection[title=Tracing]
+
+{\em This is still experimental.}
+
+\stopsection
+
+\stoptitle
+
+\starttitle[title=Mozilla test snippets]
+
+The Mozilla documentation pages for \SVG\ are pretty good and contain snippets
+that can be used for testing. More examples might be added in due time.
+
+\dorecurse{38}{
+ \page
+ \startsection[title=Snippet #1]
+ \framed
+ [offset=overlay]
+ {\scale[height=4cm]{\showSVGcode{svg-lmtx-mozilla.lua}{#1}}}
+ \blank
+ \start
+ \switchtobodyfont[10pt]
+ \setupalign[flushleft,verytolerant,broad]
+ \typeSVGcode{svg-lmtx-mozilla.lua}{#1}
+ \par
+ \stop
+ \stopsection
+ \page
+}
+
+\stoptitle
+
+\starttitle[title=Microsoft test snippets]
+
+These snippets come from the \MICROSOFT\ typography pages that discuss \OPENTYPE\
+and \SVG. Because these are actually examples of glyphs, we need to set some
+defaults:
+
+\starttabulate[|cT|rT|]
+\NC x \NC 0 \NC \NR
+\NC y \NC 1000 \NC \NR
+\NC width \NC 1000 \NC \NR
+\NC height \NC 1000 \NC \NR
+\stoptabulate
+
+in order to get the right placement. This has to do with the fact that the
+vertical \SVG\ coordinates go in the other direction compared to \METAPOST\ and
+\PDF.
+
+\dorecurse{8}{
+ \page
+ \startsection[title=Snippet #1]
+ \framed
+ [offset=overlay]
+ {\scale[height=4cm]{\showSVGcodeG{svg-lmtx-microsoft.lua}{#1}}}
+ \blank
+ \start
+ \switchtobodyfont[10pt]
+ \setupalign[flushleft,verytolerant,broad]
+ \typeSVGcode{svg-lmtx-microsoft.lua}{#1}
+ \par
+ \stop
+ \page
+ \stopsection
+ \page
+}
+
+\stoptitle
+
+\starttitle[title=Xah Lee test snippets]
+
+These snippets come from the \type {http://xahlee.info/js/svg_path_spec.html},
+which gives a nice overview of \SVG. Not all examples are here. There are some
+nice interactive examples there plus info about using fonts.
+
+\dorecurse{38}{
+ \page
+ \startsection[title=Snippet #1]
+ \framed
+ [offset=overlay]
+ {\scale[height=4cm]{\showSVGcodeG{svg-lmtx-xahlee.lua}{#1}}}
+ \blank
+ \start
+ \switchtobodyfont[10pt]
+ \setupalign[flushleft,verytolerant,broad]
+ \typeSVGcode{svg-lmtx-xahlee.lua}{#1}
+ \par
+ \stop
+ \page
+ \stopsection
+ \page
+}
+
+\stoptitle
+
+\starttitle[title=Our own snippets]
+
+These snippets were made as part if testing. I had some 1500 \SVG\ graphics that
+internally were quite messy (it's surprising what some applications export) so I
+sometimes had to extract bits and pieces and make my own tests to figure out how
+to deal with it.
+
+\dorecurse{2}{
+ \page
+ \startsection[title=Snippet #1]
+ \framed
+ [offset=overlay]
+ {\scale[height=4cm]{\showSVGcode{svg-lmtx-context.lua}{#1}}}
+ \blank
+ \start
+ \switchtobodyfont[10pt]
+ \setupalign[flushleft,verytolerant,broad]
+ \typeSVGcode{svg-lmtx-context.lua}{#1}
+ \par
+ \stop
+ \page
+ \stopsection
+ \page
+}
+
+\stoptitle
+
+\stoptext
+
+% After some contemplating, while listening to Benmont Tench's solo album (2014),
+% after first listening to a nice long interview, which I hit after following some
+% Hammond links, I finally decided that it made sense to write this manual. Life is
+% too short for delays.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/svg/svglogo.svg b/Master/texmf-dist/doc/context/sources/general/manuals/svg/svglogo.svg
new file mode 100644
index 00000000000..c23d92b82f8
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/svg/svglogo.svg
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%" viewBox="0 0 100 100">
+
+ <title>SVG Logo</title>
+
+ <a xlink:href="http://www.w3.org/Graphics/SVG/"
+ xlink:title="W3C SVG Working Group home page">
+
+ <rect
+ id="background"
+ fill="#FF9900"
+ width="100"
+ height="100"
+ rx="4"
+ ry="4"/>
+
+ <rect
+ id="top-left"
+ fill="#FFB13B"
+ width="50"
+ height="50"
+ rx="4"
+ ry="4"/>
+
+ <rect
+ id="bottom-right"
+ x="50"
+ y="50"
+ fill="#DE8500"
+ width="50"
+ height="50"
+ rx="4"
+ ry="4"/>
+
+ <g id="circles" fill="#FF9900">
+ <circle
+ id="n"
+ cx="50"
+ cy="18.4"
+ r="18.4"/>
+
+ <circle
+ id="ne"
+ cx="72.4"
+ cy="27.6"
+ r="18.4"/>
+
+ <circle
+ id="e"
+ cx="81.6"
+ cy="50"
+ r="18.4"/>
+
+ <circle
+ id="se"
+ cx="72.4"
+ cy="72.4"
+ r="18.4"/>
+
+ <circle
+ id="s"
+ cx="50"
+ cy="81.6"
+ r="18.4"/>
+
+ <circle
+ id="sw"
+ cx="27.6"
+ cy="72.4"
+ r="18.4"/>
+
+ <circle
+ id="w"
+ cx="18.4"
+ cy="50"
+ r="18.4"/>
+
+ <circle
+ id="nw"
+ cx="27.6"
+ cy="27.6"
+ r="18.4"/>
+ </g>
+
+ <g id="stars">
+ <path
+ id="black-star"
+ d="M 63.086, 18.385
+ c 0.000, -7.227 -5.859,-13.086 -13.100,-13.086
+ c -7.235, 0.000 -13.096, 5.859 -13.096, 13.086
+ c -5.100, -5.110 -13.395, -5.110 -18.497, 0.000
+ c -5.119, 5.120 -5.119, 13.408 0.000, 18.524
+ c -7.234, 0.000 -13.103, 5.859 -13.103, 13.085
+ c 0.000, 7.230 5.870, 13.098 13.103, 13.098
+ c -5.119, 5.110 -5.119, 13.395 0.000, 18.515
+ c 5.102, 5.104 13.397, 5.104 18.497, 0.000
+ c 0.000, 7.228 5.860, 13.083 13.096, 13.083
+ c 7.240, 0.000 13.100, -5.855 13.100,-13.083
+ c 5.118, 5.104 13.416, 5.104 18.513, 0.000
+ c 5.101, -5.120 5.101,-13.410 0.000,-18.515
+ c 7.216, 0.000 13.081, -5.869 13.081,-13.098
+ c 0.000, -7.227 -5.865,-13.085 -13.081,-13.085
+ c 5.101, -5.119 5.101,-13.406 0.000,-18.524
+ C 76.502, 13.275 68.206, 13.275 63.086, 18.385 z"/>
+
+ <path
+ id="white-star"
+ fill="#FFFFFF"
+ d="M 55.003, 23.405
+ v 14.488
+ L 65.260, 27.640
+ c 0.000, -1.812 0.691,-3.618 2.066, -5.005
+ c 2.780, -2.771 7.275,-2.771 10.024, 0.000
+ c 2.771, 2.766 2.771, 7.255 0.000, 10.027
+ c -1.377, 1.375 -3.195, 2.072 -5.015, 2.072
+ L 62.101, 44.982
+ H 76.590
+ c 1.290, -1.280 3.054,-2.076 5.011, -2.076
+ c 3.900, 0.000 7.078, 3.179 7.078, 7.087
+ c 0.000, 3.906 -3.178, 7.088 -7.078, 7.088
+ c -1.957, 0.000 -3.721,-0.798 -5.011, -2.072
+ H 62.100
+ l 10.229, 10.244
+ c 1.824, 0.000 3.642, 0.694 5.015, 2.086
+ c 2.774, 2.759 2.774, 7.250 0.000, 10.010
+ c -2.750, 2.774 -7.239, 2.774 -10.025, 0.000
+ c -1.372, -1.372 -2.064,-3.192 -2.064, -5.003
+ L 55.000, 62.094
+ v 14.499
+ c 1.271, 1.276 2.084, 3.054 2.084, 5.013
+ c 0.000, 3.906 -3.177, 7.077 -7.098, 7.077
+ c -3.919, 0.000 -7.094,-3.167 -7.094, -7.077
+ c 0.000, -1.959 0.811,-3.732 2.081, -5.013
+ V 62.094
+ L 34.738, 72.346
+ c 0.000, 1.812 -0.705, 3.627 -2.084, 5.003
+ c -2.769, 2.772 -7.251, 2.772 -10.024, 0.000
+ c -2.775, -2.764 -2.775,-7.253 0.000,-10.012
+ c 1.377, -1.390 3.214,-2.086 5.012, -2.086
+ l 10.257,-10.242
+ H 23.414
+ c -1.289, 1.276 -3.072, 2.072 -5.015, 2.072
+ c -3.917, 0.000 -7.096,-3.180 -7.096, -7.088
+ s 3.177, -7.087 7.096,-7.087
+ c 1.940, 0.000 3.725, 0.796 5.015, 2.076
+ h 14.488
+ L 27.646, 34.736
+ c -1.797, 0.000 -3.632,-0.697 -5.012, -2.071
+ c -2.775, -2.772 -2.775,-7.260 0.000,-10.027
+ c 2.773, -2.771 7.256,-2.771 10.027, 0.000
+ c 1.375, 1.386 2.083, 3.195 2.083, 5.005
+ l 10.235, 10.252
+ V 23.407
+ c -1.270, -1.287 -2.082,-3.053 -2.082, -5.023
+ c 0.000, -3.908 3.175,-7.079 7.096, -7.079
+ c 3.919, 0.000 7.097, 3.168 7.097, 7.079
+ C 57.088, 20.356 56.274,22.119 55.003, 23.405 z"/>
+ </g>
+
+ <g id="svg-textbox">
+ <path
+ id="text-backdrop"
+ fill="black"
+ d="M 5.30,50.00
+ H 94.68
+ V 90.00
+ Q 94.68,95.00 89.68,95.00
+ H 10.30
+ Q 5.30,95.00 5.30,90.00 Z"/>
+
+ <path
+ id="shine"
+ fill="#3F3F3F"
+ d="M 14.657,54.211
+ h 71.394
+ c 2.908, 0.000 5.312, 2.385 5.312, 5.315
+ v 17.910
+ c -27.584,-3.403 -54.926,-8.125 -82.011,-7.683
+ V 59.526
+ C 9.353,56.596 11.743,54.211 14.657,54.211
+ L 14.657,54.211 z"/>
+
+ <g id="svg-text">
+ <title>SVG</title>
+ <path
+ id="S"
+ fill="#FFFFFF"
+ stroke="#000000"
+ stroke-width="0.5035"
+ d="M 18.312,72.927
+ c -2.103,-2.107 -3.407, -5.028 -3.407, -8.253
+ c 0.000,-6.445 5.223,-11.672 11.666,-11.672
+ c 6.446, 0.000 11.667, 5.225 11.667, 11.672
+ h -6.832
+ c 0.000,-2.674 -2.168, -4.837 -4.835, -4.837
+ c -2.663, 0.000 -4.838, 2.163 -4.838, 4.837
+ c 0.000, 1.338 0.549, 2.536 1.415, 3.420
+ l 0.000, 0.000
+ c 0.883, 0.874 2.101, 1.405 3.423, 1.405
+ v 0.012
+ c 3.232, 0.000 6.145, 1.309 8.243, 3.416
+ l 0.000, 0.000
+ c 2.118, 2.111 3.424, 5.034 3.424, 8.248
+ c 0.000, 6.454 -5.221, 11.680 -11.667, 11.680
+ c -6.442, 0.000 -11.666, -5.222 -11.666,-11.680
+ h 6.828
+ c 0.000, 2.679 2.175, 4.835 4.838, 4.835
+ c 2.667, 0.000 4.835, -2.156 4.835, -4.835
+ c 0.000,-1.329 -0.545, -2.527 -1.429, -3.407
+ l 0.000, 0.000
+ c -0.864,-0.880 -2.082, -1.418 -3.406, -1.418
+ l 0.000, 0.000
+ C 23.341,76.350 20.429, 75.036 18.312, 72.927
+ L 18.312,72.927
+ L 18.312,72.927 z"/>
+ <polygon
+ id="V"
+ fill="#FFFFFF"
+ stroke="#000000"
+ stroke-width="0.5035"
+ points="61.588,53.005
+ 53.344,92.854
+ 46.494,92.854
+ 38.236,53.005
+ 45.082,53.005
+ 49.920,76.342
+ 54.755,53.005"/>
+
+ <path
+ id="G"
+ fill="#FFFFFF"
+ stroke="#000000"
+ stroke-width="0.5035"
+ d="M 73.255,69.513
+ h 11.683
+ v 11.664
+ l 0.000, 0.000
+ c 0.000, 6.452 -5.226,11.678 -11.669, 11.678
+ c -6.441, 0.000 -11.666,-5.226 -11.666,-11.678
+ l 0.000, 0.000
+ V 64.676
+ h -0.017
+ C 61.586,58.229 66.827,53.000 73.253, 53.000
+ c 6.459, 0.000 11.683, 5.225 11.683, 11.676
+ h -6.849
+ c 0.000,-2.674 -2.152,-4.837 -4.834, -4.837
+ c -2.647, 0.000 -4.820, 2.163 -4.820, 4.837
+ v 16.501
+ l 0.000, 0.000
+ c 0.000, 2.675 2.173, 4.837 4.820, 4.837
+ c 2.682, 0.000 4.834,-2.162 4.834, -4.827
+ v -0.012
+ v -4.827
+ h -4.834
+ L 73.255,69.513
+ L 73.255,69.513 z"/>
+ </g>
+ </g>
+ </a>
+</svg>
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.pdf b/Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.pdf
index 4f321315455..0b6b41e9848 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.pdf
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-graphics.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-graphics.tex
index 55a8ad701e0..2cff143f41f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-graphics.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-graphics.tex
@@ -145,9 +145,54 @@ of special and only makes sense when you use the graphic database options. The
and how conversion of images takes place.
The \type {graphics.lognames} will make sure that some extra information about
-used graphics is saved in the log file, while \type {graphics.usage} will produce
-a file \typ {<jobname>-figures-usage.lua} that contains information about found
-(or not found) images and the way they are used.
+used graphics is saved in the log file, The \type {graphics.usage} tracker will
+produce a file \typ {<jobname>-figures-usage.lua} that contains information about
+found (or not found) images and the way they are used.
+
+\stopsection
+
+\startsection[title=Compression]
+
+A \PNG\ image uses several methods for compression. The image data itself can be
+compacted by taking pixels around each individual pixel into account. Storing
+deltas instead of absolute values can for instance result in strips of zeros.
+These in turn compress well using zlib compression. Each scanline starts with a
+filterbyte that indicates how to look at the surrounding pixels. While in \PDF\ a
+\JPEG\ image is included as|-|is, a \PNG\ often take a bit more work. A
+(optional) mask has to be split off, as does an (optional) index. In the worst
+case we need to deinterlace. The \PNG\ inclusion mechanism in \CONTEXT\ \LMTX\
+takes care of this in an as efficient as possible way. Nevertheless there are
+some knobs you can turn:
+
+\starttyping
+\enabledirectives[graphics.png.recompress]
+\enabledirectives[graphics.png.compresslevel=9]
+\stoptyping
+
+A higher compress level makes the run somewhat smaller but also fives smaller
+files. The default compress level is~3. When an image doesn't need to be
+transformed (due to mask, index or interlace), you have to force recompression
+with the \type {recompress} directive. The sample image \type {mill.png} has a
+size of \type {154,869} bytes.
+
+\starttyping
+\startTEXpage
+ \externalfigure[mill.png]
+\stopTEXpage
+\stoptyping
+
+The next table shows the consequences of setting the directives. The runtime is
+of course dependent of the machine you run the sample on. If you have lots of
+images it might make sense to have a final run with a higher compress level. The
+\PDF\ file has some extra overhead (like metadata and page related information).
+
+\starttabulate[|l|c|c|c|]
+\BC \BC compression \BC filesize \BC runtime \NC \NR
+\BC default \NC \NC 156,964 \NC 0.516 \NC \NR
+\BC recompress \NC 3 \NC 144,418 \NC 0.531 \NC \NR
+\BC compresslevel \NC 0 \NC 281,071 \NC 0.516 \NC \NR
+\BC compresslevel \NC 9 \NC 137,375 \NC 0.547 \NC \NR
+\stoptabulate
\stopsection
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex
index 52070c49e02..a6d29ac429c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex
@@ -15,7 +15,7 @@
% Group journal or otherwise. Thanks to the editors for corrections. Also thanks
% to users for testing, feedback and corrections.
-\setupbackend[export=yes]
+% \setupbackend[export=yes]
\environment workflows-style
diff --git a/Master/texmf-dist/doc/man/man1/context.1 b/Master/texmf-dist/doc/man/man1/context.1
index eed6a572396..9b23bd88b6d 100644
--- a/Master/texmf-dist/doc/man/man1/context.1
+++ b/Master/texmf-dist/doc/man/man1/context.1
@@ -1,6 +1,6 @@
-.TH "mtx-context" "1" "01-01-2019" "version 1.01" "ConTeXt Process Management"
+.TH "mtx-context" "1" "01-01-2020" "version 1.03" "ConTeXt Process Management"
.SH NAME
-.B mtx-context
+ mtx-context - ConTeXt Process Management
.SH SYNOPSIS
.B mtxrun --script context [
.I OPTIONS ...
@@ -69,7 +69,10 @@ disable logcatgories (show list with --showlogcategories)
strip Lua code (only meant for production where no errors are expected)
.TP
.B --errors=list
-show errors at the end of a run, quit when in list (also when ----silent)
+show errors at the end of a run, quit when in list (also when --silent)
+.TP
+.B --htmlerrorpage
+generate html error page instead (optional: =scite)
.TP
.B --noconsole
disable logging to the console (logfile only)
@@ -153,9 +156,6 @@ update context version number (also provide --expert, optionally provide --basep
.B --nostatistics
omit runtime statistics at the end of the run
.TP
-.B --update
-update context from website (not to be confused with contextgarden)
-.TP
.B --profile
profile job (use: mtxrun --script profile --analyze)
.TP
@@ -192,6 +192,9 @@ do not check for file and enter scroll mode (--dummyfile=whatever.tmp)
.TP
.B --sandbox
process file in a limited environment
+.TP
+.B --addbinarypath
+prepend the (found) binarypath to runners
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/man/man1/context.man1.pdf b/Master/texmf-dist/doc/man/man1/context.man1.pdf
index 07244c52612..81daeb7ae7b 100644
--- a/Master/texmf-dist/doc/man/man1/context.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/context.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/luatools.1 b/Master/texmf-dist/doc/man/man1/luatools.1
index 6750af5374a..0d0392f396e 100644
--- a/Master/texmf-dist/doc/man/man1/luatools.1
+++ b/Master/texmf-dist/doc/man/man1/luatools.1
@@ -1,6 +1,6 @@
-.TH "luatools" "1" "01-01-2019" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
+.TH "luatools" "1" "01-01-2020" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
.SH NAME
-.B luatools
+ luatools - ConTeXt TDS Management Tool (aka luatools)
.SH SYNOPSIS
.B luatools [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/luatools.man1.pdf b/Master/texmf-dist/doc/man/man1/luatools.man1.pdf
index 0013b4be8c0..543bccb6607 100644
--- a/Master/texmf-dist/doc/man/man1/luatools.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/luatools.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-babel.1 b/Master/texmf-dist/doc/man/man1/mtx-babel.1
index 68b94478ddf..5ac999c664b 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-babel.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-babel.1
@@ -1,6 +1,6 @@
-.TH "mtx-babel" "1" "01-01-2019" "version 1.20" "Babel Input To UTF Conversion"
+.TH "mtx-babel" "1" "01-01-2020" "version 1.20" "Babel Input To UTF Conversion"
.SH NAME
-.B mtx-babel
+ mtx-babel - Babel Input To UTF Conversion
.SH SYNOPSIS
.B mtxrun --script babel [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-babel.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-babel.man1.pdf
index 481135362a8..ddf9eaf86f6 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-babel.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-babel.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-base.1 b/Master/texmf-dist/doc/man/man1/mtx-base.1
index 757537b1d5e..76f60696f48 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-base.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-base.1
@@ -1,6 +1,6 @@
-.TH "mtx-base" "1" "01-01-2019" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
+.TH "mtx-base" "1" "01-01-2020" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
.SH NAME
-.B mtx-base
+ mtx-base - ConTeXt TDS Management Tool (aka luatools)
.SH SYNOPSIS
.B mtxrun --script base [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-base.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-base.man1.pdf
index 11e713ee166..5b6a87bcd33 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-base.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-base.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-bibtex.1 b/Master/texmf-dist/doc/man/man1/mtx-bibtex.1
index a2ddce859c8..60bfd7e1d40 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-bibtex.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-bibtex.1
@@ -1,6 +1,6 @@
-.TH "mtx-bibtex" "1" "01-01-2019" "version 1.00" "bibtex helpers"
+.TH "mtx-bibtex" "1" "01-01-2020" "version 1.00" "bibtex helpers"
.SH NAME
-.B mtx-bibtex
+ mtx-bibtex - bibtex helpers
.SH SYNOPSIS
.B mtxrun --script bibtex [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-bibtex.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-bibtex.man1.pdf
index 657e4d7cfa9..48b256f2991 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-bibtex.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-bibtex.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-cache.1 b/Master/texmf-dist/doc/man/man1/mtx-cache.1
index e659dd3b873..e266d8da205 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-cache.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-cache.1
@@ -1,6 +1,6 @@
-.TH "mtx-cache" "1" "01-01-2019" "version 0.10" "ConTeXt & MetaTeX Cache Management"
+.TH "mtx-cache" "1" "01-01-2020" "version 1.01" "ConTeXt & MetaTeX Cache Management"
.SH NAME
-.B mtx-cache
+ mtx-cache - ConTeXt & MetaTeX Cache Management
.SH SYNOPSIS
.B mtxrun --script cache [
.I OPTIONS ...
@@ -11,8 +11,8 @@
.B ConTeXt & MetaTeX Cache Management
.SH OPTIONS
.TP
-.B --purge
-remove not used files
+.B --make
+generate databases and formats
.TP
.B --erase
completely remove cache
diff --git a/Master/texmf-dist/doc/man/man1/mtx-cache.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-cache.man1.pdf
index de17f1deda3..52ccc142453 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-cache.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-cache.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-chars.1 b/Master/texmf-dist/doc/man/man1/mtx-chars.1
index dd6c3c6cab7..ad52b5b8909 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-chars.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-chars.1
@@ -1,6 +1,6 @@
-.TH "mtx-chars" "1" "01-01-2019" "version 0.10" "MkII Character Table Generators"
+.TH "mtx-chars" "1" "01-01-2020" "version 0.10" "MkII Character Table Generators"
.SH NAME
-.B mtx-chars
+ mtx-chars - MkII Character Table Generators
.SH SYNOPSIS
.B mtxrun --script chars [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-chars.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-chars.man1.pdf
index b15a5f1d37c..d809b1ebc3b 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-chars.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-chars.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-check.1 b/Master/texmf-dist/doc/man/man1/mtx-check.1
index 6331a2e5361..0525aeb69e8 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-check.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-check.1
@@ -1,6 +1,6 @@
-.TH "mtx-check" "1" "01-01-2019" "version 0.10" "Basic ConTeXt Syntax Checking"
+.TH "mtx-check" "1" "01-01-2020" "version 0.10" "Basic ConTeXt Syntax Checking"
.SH NAME
-.B mtx-check
+ mtx-check - Basic ConTeXt Syntax Checking
.SH SYNOPSIS
.B mtxrun --script check [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-check.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-check.man1.pdf
index a5ad6a841f3..78e43d86f44 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-check.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-check.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-colors.1 b/Master/texmf-dist/doc/man/man1/mtx-colors.1
index 4ef9fab0b42..883d6957310 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-colors.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-colors.1
@@ -1,6 +1,6 @@
-.TH "mtx-colors" "1" "01-01-2019" "version 0.10" "ConTeXt Color Management"
+.TH "mtx-colors" "1" "01-01-2020" "version 0.10" "ConTeXt Color Management"
.SH NAME
-.B mtx-colors
+ mtx-colors - ConTeXt Color Management
.SH SYNOPSIS
.B mtxrun --script colors [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-colors.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-colors.man1.pdf
index 662aa857104..2ac26cec32b 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-colors.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-colors.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-context.1 b/Master/texmf-dist/doc/man/man1/mtx-context.1
index eed6a572396..9b23bd88b6d 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-context.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-context.1
@@ -1,6 +1,6 @@
-.TH "mtx-context" "1" "01-01-2019" "version 1.01" "ConTeXt Process Management"
+.TH "mtx-context" "1" "01-01-2020" "version 1.03" "ConTeXt Process Management"
.SH NAME
-.B mtx-context
+ mtx-context - ConTeXt Process Management
.SH SYNOPSIS
.B mtxrun --script context [
.I OPTIONS ...
@@ -69,7 +69,10 @@ disable logcatgories (show list with --showlogcategories)
strip Lua code (only meant for production where no errors are expected)
.TP
.B --errors=list
-show errors at the end of a run, quit when in list (also when ----silent)
+show errors at the end of a run, quit when in list (also when --silent)
+.TP
+.B --htmlerrorpage
+generate html error page instead (optional: =scite)
.TP
.B --noconsole
disable logging to the console (logfile only)
@@ -153,9 +156,6 @@ update context version number (also provide --expert, optionally provide --basep
.B --nostatistics
omit runtime statistics at the end of the run
.TP
-.B --update
-update context from website (not to be confused with contextgarden)
-.TP
.B --profile
profile job (use: mtxrun --script profile --analyze)
.TP
@@ -192,6 +192,9 @@ do not check for file and enter scroll mode (--dummyfile=whatever.tmp)
.TP
.B --sandbox
process file in a limited environment
+.TP
+.B --addbinarypath
+prepend the (found) binarypath to runners
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/man/man1/mtx-context.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-context.man1.pdf
index 357c689253a..99b5262b2cf 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-context.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-context.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-dvi.1 b/Master/texmf-dist/doc/man/man1/mtx-dvi.1
index e16f2d5b6e7..fe42cb23bd3 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-dvi.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-dvi.1
@@ -1,6 +1,6 @@
-.TH "mtx-dvi" "1" "01-01-2019" "version 0.01" "ConTeXt DVI Helpers"
+.TH "mtx-dvi" "1" "01-01-2020" "version 0.01" "ConTeXt DVI Helpers"
.SH NAME
-.B mtx-dvi
+ mtx-dvi - ConTeXt DVI Helpers
.SH SYNOPSIS
.B mtxrun --script dvi [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-dvi.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-dvi.man1.pdf
index 02305c06e6f..8091a3e8d70 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-dvi.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-dvi.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-epub.1 b/Master/texmf-dist/doc/man/man1/mtx-epub.1
index ffd6d78ed4c..0c0e26b4987 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-epub.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-epub.1
@@ -1,6 +1,6 @@
-.TH "mtx-epub" "1" "01-01-2019" "version 1.10" "ConTeXt EPUB Helpers"
+.TH "mtx-epub" "1" "01-01-2020" "version 1.10" "ConTeXt EPUB Helpers"
.SH NAME
-.B mtx-epub
+ mtx-epub - ConTeXt EPUB Helpers
.SH SYNOPSIS
.B mtxrun --script epub [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-epub.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-epub.man1.pdf
index 83814e28a2c..d52372b1004 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-epub.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-epub.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-evohome.1 b/Master/texmf-dist/doc/man/man1/mtx-evohome.1
index 61355fec1cd..90de5613cdd 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-evohome.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-evohome.1
@@ -1,6 +1,6 @@
-.TH "mtx-evohome" "1" "01-01-2019" "version 1.00" "Evohome Fetcher"
+.TH "mtx-evohome" "1" "01-01-2020" "version 1.00" "Evohome Fetcher"
.SH NAME
-.B mtx-evohome
+ mtx-evohome - Evohome Fetcher
.SH SYNOPSIS
.B mtxrun --script evohome [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-evohome.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-evohome.man1.pdf
index fc925fa87a9..971e8d1777f 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-evohome.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-evohome.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-fcd.1 b/Master/texmf-dist/doc/man/man1/mtx-fcd.1
index 65f21761d4e..6bff46e0d77 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-fcd.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-fcd.1
@@ -1,6 +1,6 @@
-.TH "mtx-fcd" "1" "01-01-2019" "version 1.00" "Fast Directory Change"
+.TH "mtx-fcd" "1" "01-01-2020" "version 1.00" "Fast Directory Change"
.SH NAME
-.B mtx-fcd
+ mtx-fcd - Fast Directory Change
.SH SYNOPSIS
.B mtxrun --script fcd [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-fcd.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-fcd.man1.pdf
index e53f8d7d948..b877303ec69 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-fcd.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-fcd.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-flac.1 b/Master/texmf-dist/doc/man/man1/mtx-flac.1
index 26acb7e411e..b58582f043f 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-flac.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-flac.1
@@ -1,6 +1,6 @@
-.TH "mtx-flac" "1" "01-01-2019" "version 0.10" "ConTeXt Flac Helpers"
+.TH "mtx-flac" "1" "01-01-2020" "version 0.10" "ConTeXt Flac Helpers"
.SH NAME
-.B mtx-flac
+ mtx-flac - ConTeXt Flac Helpers
.SH SYNOPSIS
.B mtxrun --script flac [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-flac.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-flac.man1.pdf
index 8b40abfb879..e19914c3a0e 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-flac.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-flac.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-fonts.1 b/Master/texmf-dist/doc/man/man1/mtx-fonts.1
index a65915e72ed..b137418b909 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-fonts.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-fonts.1
@@ -1,6 +1,6 @@
-.TH "mtx-fonts" "1" "01-01-2019" "version 1.00" "ConTeXt Font Database Management"
+.TH "mtx-fonts" "1" "01-01-2020" "version 1.00" "ConTeXt Font Database Management"
.SH NAME
-.B mtx-fonts
+ mtx-fonts - ConTeXt Font Database Management
.SH SYNOPSIS
.B mtxrun --script fonts [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-fonts.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-fonts.man1.pdf
index 85943d17bca..9ec6b522240 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-fonts.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-fonts.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-grep.1 b/Master/texmf-dist/doc/man/man1/mtx-grep.1
index cd7d527357e..4c9aa39e532 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-grep.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-grep.1
@@ -1,6 +1,6 @@
-.TH "mtx-grep" "1" "01-01-2019" "version 0.10" "Simple Grepper"
+.TH "mtx-grep" "1" "01-01-2020" "version 0.10" "Simple Grepper"
.SH NAME
-.B mtx-grep
+ mtx-grep - Simple Grepper
.SH SYNOPSIS
.B mtxrun --script grep [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-grep.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-grep.man1.pdf
index 68f63ca90e5..7b3a270eafa 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-grep.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-grep.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-interface.1 b/Master/texmf-dist/doc/man/man1/mtx-interface.1
index 026a5f67b70..d3531d45674 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-interface.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-interface.1
@@ -1,6 +1,6 @@
-.TH "mtx-interface" "1" "01-01-2019" "version 0.13" "ConTeXt Interface Related Goodies"
+.TH "mtx-interface" "1" "01-01-2020" "version 0.13" "ConTeXt Interface Related Goodies"
.SH NAME
-.B mtx-interface
+ mtx-interface - ConTeXt Interface Related Goodies
.SH SYNOPSIS
.B mtxrun --script interface [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-interface.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-interface.man1.pdf
index 97ae6d9675b..a9e595b9823 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-interface.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-interface.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-metapost.1 b/Master/texmf-dist/doc/man/man1/mtx-metapost.1
index 11586b727c2..5b110d06cc5 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-metapost.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-metapost.1
@@ -1,6 +1,6 @@
-.TH "mtx-metapost" "1" "01-01-2019" "version 0.10" "MetaPost to PDF processor"
+.TH "mtx-metapost" "1" "01-01-2020" "version 0.10" "MetaPost to PDF processor"
.SH NAME
-.B mtx-metapost
+ mtx-metapost - MetaPost to PDF processor
.SH SYNOPSIS
.B mtxrun --script metapost [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-metapost.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-metapost.man1.pdf
index 7d436167ca3..fe0ee9424fb 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-metapost.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-metapost.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-modules.1 b/Master/texmf-dist/doc/man/man1/mtx-modules.1
index 56172bd0d20..5eaff034ebf 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-modules.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-modules.1
@@ -1,6 +1,6 @@
-.TH "mtx-modules" "1" "01-01-2019" "version 1.00" "ConTeXt Module Documentation Generators"
+.TH "mtx-modules" "1" "01-01-2020" "version 1.00" "ConTeXt Module Documentation Generators"
.SH NAME
-.B mtx-modules
+ mtx-modules - ConTeXt Module Documentation Generators
.SH SYNOPSIS
.B mtxrun --script modules [
.I OPTIONS ...
@@ -12,10 +12,10 @@
.SH OPTIONS
.TP
.B --convert
-convert source files (tex, mkii, mkiv, mp) to 'ted' files
+convert source files (tex, mkii, mkiv, mp, etc.) to 'ted' files
.TP
.B --process
-process source files (tex, mkii, mkiv, mp) to 'pdf' files
+process source files (tex, mkii, mkiv, mp, etc.) to 'pdf' files
.TP
.B --prep
use original name with suffix 'prep' appended
diff --git a/Master/texmf-dist/doc/man/man1/mtx-modules.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-modules.man1.pdf
index 65613c2f603..8f168a7fcdd 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-modules.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-modules.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-package.1 b/Master/texmf-dist/doc/man/man1/mtx-package.1
index d0bbd639828..02671fa9563 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-package.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-package.1
@@ -1,6 +1,6 @@
-.TH "mtx-package" "1" "01-01-2019" "version 0.10" "Distribution Related Goodies"
+.TH "mtx-package" "1" "01-01-2020" "version 0.10" "Distribution Related Goodies"
.SH NAME
-.B mtx-package
+ mtx-package - Distribution Related Goodies
.SH SYNOPSIS
.B mtxrun --script package [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-package.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-package.man1.pdf
index cc39b253442..bcc5df0e092 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-package.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-package.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-patterns.1 b/Master/texmf-dist/doc/man/man1/mtx-patterns.1
new file mode 100644
index 00000000000..320a89e2250
--- /dev/null
+++ b/Master/texmf-dist/doc/man/man1/mtx-patterns.1
@@ -0,0 +1,48 @@
+.TH "mtx-patterns" "1" "01-01-2020" "version 0.20" "ConTeXt Pattern File Management"
+.SH NAME
+ mtx-patterns - ConTeXt Pattern File Management
+.SH SYNOPSIS
+.B mtxrun --script patterns [
+.I OPTIONS ...
+.B ] [
+.I FILENAMES
+.B ]
+.SH DESCRIPTION
+.B ConTeXt Pattern File Management
+.SH OPTIONS
+.TP
+.B --convert
+generate context language files (mnemonic driven, if not given then all)
+.TP
+.B --check
+check pattern file (or those used by context when no file given)
+.TP
+.B --path
+source path where hyph-foo.tex files are stored
+.TP
+.B --destination
+destination path
+.TP
+.B --specification
+additional patterns: e.g.: =cy,hyph-cy,welsh
+.TP
+.B --compress
+compress data
+.TP
+.B --words
+update words in given file
+.TP
+.B --hyphenate
+show hypephenated words
+.SH AUTHOR
+More information about ConTeXt and the tools that come with it can be found at:
+
+
+.B "maillist:"
+ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
+
+.B "webpage:"
+http://www.pragma-ade.nl / http://tex.aanhet.net
+
+.B "wiki:"
+http://contextgarden.net
diff --git a/Master/texmf-dist/doc/man/man1/mtx-patterns.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-patterns.man1.pdf
new file mode 100644
index 00000000000..810121c9739
--- /dev/null
+++ b/Master/texmf-dist/doc/man/man1/mtx-patterns.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-pdf.1 b/Master/texmf-dist/doc/man/man1/mtx-pdf.1
index 8595fcbafcd..df5501b9534 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-pdf.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-pdf.1
@@ -1,6 +1,6 @@
-.TH "mtx-pdf" "1" "01-01-2019" "version 0.10" "ConTeXt PDF Helpers"
+.TH "mtx-pdf" "1" "01-01-2020" "version 0.10" "ConTeXt PDF Helpers"
.SH NAME
-.B mtx-pdf
+ mtx-pdf - ConTeXt PDF Helpers
.SH SYNOPSIS
.B mtxrun --script pdf [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-pdf.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-pdf.man1.pdf
index a5f77179f79..a407e0fabe7 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-pdf.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-pdf.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-plain.1 b/Master/texmf-dist/doc/man/man1/mtx-plain.1
index a242a4a24b2..431db53a107 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-plain.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-plain.1
@@ -1,6 +1,6 @@
-.TH "mtx-plain" "1" "01-01-2019" "version 1.00" "Plain TeX Runner"
+.TH "mtx-plain" "1" "01-01-2020" "version 1.00" "Plain TeX Runner"
.SH NAME
-.B mtx-plain
+ mtx-plain - Plain TeX Runner
.SH SYNOPSIS
.B mtxrun --script plain [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-plain.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-plain.man1.pdf
index 5f71d5f5d72..c9a8ee4d48f 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-plain.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-plain.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-profile.1 b/Master/texmf-dist/doc/man/man1/mtx-profile.1
index 1e38a3b5a25..f520a9e139a 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-profile.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-profile.1
@@ -1,6 +1,6 @@
-.TH "mtx-profile" "1" "01-01-2019" "version 1.00" "ConTeXt MkIV LuaTeX Profiler"
+.TH "mtx-profile" "1" "01-01-2020" "version 1.00" "ConTeXt MkIV LuaTeX Profiler"
.SH NAME
-.B mtx-profile
+ mtx-profile - ConTeXt MkIV LuaTeX Profiler
.SH SYNOPSIS
.B mtxrun --script profile [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-profile.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-profile.man1.pdf
index e338f035e2c..a2e1904bf96 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-profile.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-profile.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-rsync.1 b/Master/texmf-dist/doc/man/man1/mtx-rsync.1
index 49a139cb4d0..60b87707303 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-rsync.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-rsync.1
@@ -1,6 +1,6 @@
-.TH "mtx-rsync" "1" "01-01-2019" "version 0.10" "Rsync Helpers"
+.TH "mtx-rsync" "1" "01-01-2020" "version 0.10" "Rsync Helpers"
.SH NAME
-.B mtx-rsync
+ mtx-rsync - Rsync Helpers
.SH SYNOPSIS
.B mtxrun --script rsync [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-rsync.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-rsync.man1.pdf
index 2d1ab361bed..6c3e71aebf1 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-rsync.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-rsync.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-scite.1 b/Master/texmf-dist/doc/man/man1/mtx-scite.1
index a37d38fde14..2e83387f9df 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-scite.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-scite.1
@@ -1,6 +1,6 @@
-.TH "mtx-scite" "1" "01-01-2019" "version 1.00" "Scite Helper Script"
+.TH "mtx-scite" "1" "01-01-2020" "version 1.00" "Scite Helper Script"
.SH NAME
-.B mtx-scite
+ mtx-scite - Scite Helper Script
.SH SYNOPSIS
.B mtxrun --script scite [
.I OPTIONS ...
@@ -18,7 +18,7 @@ convert spell-*.txt into spell-*.lua
converts a tree into an html tree (--source --target --numbers)
.TP
.B --file
-converts a file into an html tree (--source --target --numbers --lexer)
+converts a file into an html file (--source --target --numbers --lexer)
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/man/man1/mtx-scite.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-scite.man1.pdf
index 132681af4c9..3be27089a61 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-scite.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-scite.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-server.1 b/Master/texmf-dist/doc/man/man1/mtx-server.1
index da0c4c05dd0..ee565d4164e 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-server.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-server.1
@@ -1,6 +1,6 @@
-.TH "mtx-server" "1" "01-01-2019" "version 0.10" "Simple Webserver For Helpers"
+.TH "mtx-server" "1" "01-01-2020" "version 0.10" "Simple Webserver For Helpers"
.SH NAME
-.B mtx-server
+ mtx-server - Simple Webserver For Helpers
.SH SYNOPSIS
.B mtxrun --script server [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-server.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-server.man1.pdf
index aa3244ad0cd..91561ed5010 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-server.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-server.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-texworks.1 b/Master/texmf-dist/doc/man/man1/mtx-texworks.1
index 016aa1f7d7a..67e84a4d7ba 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-texworks.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-texworks.1
@@ -1,6 +1,6 @@
-.TH "mtx-texworks" "1" "01-01-2019" "version 1.00" "TeXworks Startup Script"
+.TH "mtx-texworks" "1" "01-01-2020" "version 1.00" "TeXworks Startup Script"
.SH NAME
-.B mtx-texworks
+ mtx-texworks - TeXworks Startup Script
.SH SYNOPSIS
.B mtxrun --script texworks [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-texworks.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-texworks.man1.pdf
index 57db1fa3a2b..d193a195318 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-texworks.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-texworks.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-timing.1 b/Master/texmf-dist/doc/man/man1/mtx-timing.1
index 479506c7012..582898c1ac0 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-timing.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-timing.1
@@ -1,6 +1,6 @@
-.TH "mtx-timing" "1" "01-01-2019" "version 0.10" "ConTeXt Timing Tools"
+.TH "mtx-timing" "1" "01-01-2020" "version 0.10" "ConTeXt Timing Tools"
.SH NAME
-.B mtx-timing
+ mtx-timing - ConTeXt Timing Tools
.SH SYNOPSIS
.B mtxrun --script timing [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-timing.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-timing.man1.pdf
index 132746870a2..24f3f5fdc8b 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-timing.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-timing.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-tools.1 b/Master/texmf-dist/doc/man/man1/mtx-tools.1
index 1cee94d9d62..6626110b711 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-tools.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-tools.1
@@ -1,6 +1,6 @@
-.TH "mtx-tools" "1" "01-01-2019" "version 1.01" "Some File Related Goodies"
+.TH "mtx-tools" "1" "01-01-2020" "version 1.01" "Some File Related Goodies"
.SH NAME
-.B mtx-tools
+ mtx-tools - Some File Related Goodies
.SH SYNOPSIS
.B mtxrun --script tools [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-tools.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-tools.man1.pdf
index 2dcb6d0ad6a..4642c94d6f4 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-tools.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-tools.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-unicode.1 b/Master/texmf-dist/doc/man/man1/mtx-unicode.1
index e82ee65ee45..072ff371fa5 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-unicode.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-unicode.1
@@ -1,6 +1,6 @@
-.TH "mtx-unicode" "1" "01-01-2019" "version 1.02" "Checker for char-dat.lua"
+.TH "mtx-unicode" "1" "01-01-2020" "version 1.02" "Checker for char-dat.lua"
.SH NAME
-.B mtx-unicode
+ mtx-unicode - Checker for char-dat.lua
.SH SYNOPSIS
.B mtxrun --script unicode [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-unicode.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-unicode.man1.pdf
index 9b6c8d6ba78..34c145412c8 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-unicode.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-unicode.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-unzip.1 b/Master/texmf-dist/doc/man/man1/mtx-unzip.1
index f0243c38cff..d67698c599c 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-unzip.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-unzip.1
@@ -1,6 +1,6 @@
-.TH "mtx-unzip" "1" "01-01-2019" "version 0.10" "Simple Unzipper"
+.TH "mtx-unzip" "1" "01-01-2020" "version 0.10" "Simple Unzipper"
.SH NAME
-.B mtx-unzip
+ mtx-unzip - Simple Unzipper
.SH SYNOPSIS
.B mtxrun --script unzip [
.I OPTIONS ...
@@ -14,11 +14,8 @@
.B --list
list files in archive
.TP
-.B --junk
-flatten unzipped directory structure
-.TP
.B --extract
-extract files
+extract files [--silent --steps]
.SH AUTHOR
More information about ConTeXt and the tools that come with it can be found at:
diff --git a/Master/texmf-dist/doc/man/man1/mtx-unzip.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-unzip.man1.pdf
index fe47503e8b1..cd1e8895d8b 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-unzip.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-unzip.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-update.1 b/Master/texmf-dist/doc/man/man1/mtx-update.1
index 4ec518b0dac..35500fb6daa 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-update.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-update.1
@@ -1,6 +1,6 @@
-.TH "mtx-update" "1" "01-01-2019" "version 1.03" "ConTeXt Minimals Updater"
+.TH "mtx-update" "1" "01-01-2020" "version 1.03" "ConTeXt Minimals Updater"
.SH NAME
-.B mtx-update
+ mtx-update - ConTeXt Minimals Updater
.SH SYNOPSIS
.B mtxrun --script update [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-update.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-update.man1.pdf
index 535c1cc2bfe..7160befb02a 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-update.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-update.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-vscode.1 b/Master/texmf-dist/doc/man/man1/mtx-vscode.1
new file mode 100644
index 00000000000..f1c886fa0f4
--- /dev/null
+++ b/Master/texmf-dist/doc/man/man1/mtx-vscode.1
@@ -0,0 +1,30 @@
+.TH "mtx-vscode" "1" "01-01-2020" "version 1.00" "vscode extension generator"
+.SH NAME
+ mtx-vscode - vscode extension generator
+.SH SYNOPSIS
+.B mtxrun --script vscode [
+.I OPTIONS ...
+.B ] [
+.I FILENAMES
+.B ]
+.SH DESCRIPTION
+.B vscode extension generator
+.SH OPTIONS
+.TP
+.B --generate
+generate extension in sync with current version
+.TP
+.B --start
+start vscode with extension context
+.SH AUTHOR
+More information about ConTeXt and the tools that come with it can be found at:
+
+
+.B "maillist:"
+ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
+
+.B "webpage:"
+http://www.pragma-ade.nl / http://tex.aanhet.net
+
+.B "wiki:"
+http://contextgarden.net
diff --git a/Master/texmf-dist/doc/man/man1/mtx-vscode.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-vscode.man1.pdf
new file mode 100644
index 00000000000..77e628c3e07
--- /dev/null
+++ b/Master/texmf-dist/doc/man/man1/mtx-vscode.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-watch.1 b/Master/texmf-dist/doc/man/man1/mtx-watch.1
index 8cc32f4a552..185dc64bc71 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-watch.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-watch.1
@@ -1,6 +1,6 @@
-.TH "mtx-watch" "1" "01-01-2019" "version 1.00" "ConTeXt Request Watchdog"
+.TH "mtx-watch" "1" "01-01-2020" "version 1.00" "ConTeXt Request Watchdog"
.SH NAME
-.B mtx-watch
+ mtx-watch - ConTeXt Request Watchdog
.SH SYNOPSIS
.B mtxrun --script watch [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-watch.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-watch.man1.pdf
index 16257ac8176..c9f738d2597 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-watch.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-watch.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtx-youless.1 b/Master/texmf-dist/doc/man/man1/mtx-youless.1
index fa650a0b6a0..6d4e8b1df82 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-youless.1
+++ b/Master/texmf-dist/doc/man/man1/mtx-youless.1
@@ -1,6 +1,6 @@
-.TH "mtx-youless" "1" "01-01-2019" "version 1.100" "youless Fetcher"
+.TH "mtx-youless" "1" "01-01-2020" "version 1.100" "youless Fetcher"
.SH NAME
-.B mtx-youless
+ mtx-youless - youless Fetcher
.SH SYNOPSIS
.B mtxrun --script youless [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/mtx-youless.man1.pdf b/Master/texmf-dist/doc/man/man1/mtx-youless.man1.pdf
index ed3509f8e56..34bf9563904 100644
--- a/Master/texmf-dist/doc/man/man1/mtx-youless.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtx-youless.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/mtxrun.1 b/Master/texmf-dist/doc/man/man1/mtxrun.1
index 70dd035c440..8118c9c7f7d 100644
--- a/Master/texmf-dist/doc/man/man1/mtxrun.1
+++ b/Master/texmf-dist/doc/man/man1/mtxrun.1
@@ -1,6 +1,6 @@
-.TH "mtxrun" "1" "01-01-2019" "version 1.33" "ConTeXt TDS Runner Tool"
+.TH "mtxrun" "1" "01-01-2020" "version 1.33" "ConTeXt TDS Runner Tool"
.SH NAME
-.B mtxrun
+ mtxrun - ConTeXt TDS Runner Tool
.SH SYNOPSIS
.B mtxrun [
.I OPTIONS ...
@@ -15,7 +15,7 @@
run an mtx script (lua prefered method) (--noquotes), no script gives list
.TP
.B --evaluate
-run code passed on the commandline (between quotes)
+run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)
.TP
.B --execute
run a script or program (texmfstart method) (--noquotes)
@@ -59,6 +59,9 @@ create windows (mswin) stubs
.B --unix
create unix (linux) stubs
.TP
+.B --addbinarypath
+prepend the (found) binarypath to runners
+.TP
.B --verbose
give a bit more info
.TP
diff --git a/Master/texmf-dist/doc/man/man1/mtxrun.man1.pdf b/Master/texmf-dist/doc/man/man1/mtxrun.man1.pdf
index 0b75f05c507..04ccd4c9d5b 100644
--- a/Master/texmf-dist/doc/man/man1/mtxrun.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/mtxrun.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/texexec.1 b/Master/texmf-dist/doc/man/man1/texexec.1
index d6b057b6592..e783e8d6e47 100644
--- a/Master/texmf-dist/doc/man/man1/texexec.1
+++ b/Master/texmf-dist/doc/man/man1/texexec.1
@@ -1,6 +1,6 @@
-.TH "texexec" "1" "01-01-2019" "version 6.2.1" "TeXExec"
+.TH "texexec" "1" "01-01-2020" "version 6.2.1" "TeXExec"
.SH NAME
-.B texexec
+ texexec - TeXExec
.SH SYNOPSIS
.B texexec [
.I OPTIONS ...
diff --git a/Master/texmf-dist/doc/man/man1/texexec.man1.pdf b/Master/texmf-dist/doc/man/man1/texexec.man1.pdf
index 7d72431f9aa..76427ead144 100644
--- a/Master/texmf-dist/doc/man/man1/texexec.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/texexec.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/texmfstart.1 b/Master/texmf-dist/doc/man/man1/texmfstart.1
index 70dd035c440..8118c9c7f7d 100644
--- a/Master/texmf-dist/doc/man/man1/texmfstart.1
+++ b/Master/texmf-dist/doc/man/man1/texmfstart.1
@@ -1,6 +1,6 @@
-.TH "mtxrun" "1" "01-01-2019" "version 1.33" "ConTeXt TDS Runner Tool"
+.TH "mtxrun" "1" "01-01-2020" "version 1.33" "ConTeXt TDS Runner Tool"
.SH NAME
-.B mtxrun
+ mtxrun - ConTeXt TDS Runner Tool
.SH SYNOPSIS
.B mtxrun [
.I OPTIONS ...
@@ -15,7 +15,7 @@
run an mtx script (lua prefered method) (--noquotes), no script gives list
.TP
.B --evaluate
-run code passed on the commandline (between quotes)
+run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)
.TP
.B --execute
run a script or program (texmfstart method) (--noquotes)
@@ -59,6 +59,9 @@ create windows (mswin) stubs
.B --unix
create unix (linux) stubs
.TP
+.B --addbinarypath
+prepend the (found) binarypath to runners
+.TP
.B --verbose
give a bit more info
.TP
diff --git a/Master/texmf-dist/doc/man/man1/texmfstart.man1.pdf b/Master/texmf-dist/doc/man/man1/texmfstart.man1.pdf
index ccfde373ef5..5945d5e01ee 100644
--- a/Master/texmf-dist/doc/man/man1/texmfstart.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/texmfstart.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/metafun.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/metafun.mpiv
index fa43d3460b5..f00cc260c66 100644
--- a/Master/texmf-dist/metapost/context/base/mpiv/metafun.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mpiv/metafun.mpiv
@@ -15,40 +15,30 @@
%D prevent dependency problems and in the end even may use a patched version,
%D we prefer to use a copy.
-prologues := 0 ;
-mpprocset := 1 ;
+boolean contextlmtxmode ; contextlmtxmode := if known fontmaking : false else: true fi;
+
+prologues := 0 ; % not used
+mpprocset := 1 ; % not used
input "mp-base.mpiv" ;
input "mp-tool.mpiv" ;
input "mp-mlib.mpiv" ;
-% "mp-core.mpiv" ; % todo: namespace and cleanup
-input "mp-luas.mpiv" ; % experimental
-input "mp-page.mpiv" ; % todo: namespace and cleanup
-input "mp-butt.mpiv" ; % todo: namespace and cleanup
-input "mp-shap.mpiv" ; % will be improved
-input "mp-grph.mpiv" ; % todo: namespace and cleanup
-input "mp-grid.mpiv" ; % todo: namespace and cleanup
-input "mp-form.mpiv" ; % under (re)construction
-input "mp-figs.mpiv" ; % obsolete, needs checking
-input "mp-func.mpiv" ; % under construction
-% "mp-text.mpiv" ; % loaded on demand
-% "mp-char.mpiv" ; % loaded on demand
-% "mp-step.mpiv" ; % loaded on demand
-% "mp-chem.mpiv" ; % loaded on demand
-input "mp-node.mpiv" ; % relatively small so preloaded
+input "mp-luas.mpiv" ;
+input "mp-cont.mpiv" ;
+input "mp-page.mpiv" ;
+input "mp-butt.mpiv" ;
+input "mp-shap.mpiv" ;
+input "mp-grph.mpiv" ;
+input "mp-grid.mpiv" ;
+input "mp-form.mpiv" ;
+input "mp-figs.mpiv" ;
+input "mp-func.mpiv" ;
+input "mp-node.mpiv" ;
input "mp-apos.mpiv" ;
input "mp-abck.mpiv" ;
input "mp-blob.mpiv" ;
-string metafunversion ; metafunversion =
- "metafun iv" & " " &
- decimal year & "-" &
- decimal month & "-" &
- decimal day & " " &
- if ((time div 60) < 10) : "0" & fi
- decimal (time div 60) & ":" &
- if ((time-(time div 60)*60) < 10) : "0" & fi
- decimal (time-(time div 60)*60) ;
+string metafunversion ; metafunversion = "metafun iv " & mfun_timestamp;
let normalend = end ;
@@ -58,5 +48,3 @@ if known mplib :
else :
def end = ; message "" ; message metafunversion ; message "" ; normalend ; enddef ;
fi ;
-
-% dump ; % obsolete in mplib
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/metafun.mpxl b/Master/texmf-dist/metapost/context/base/mpiv/metafun.mpxl
new file mode 100644
index 00000000000..a6160ef3e2c
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/base/mpiv/metafun.mpxl
@@ -0,0 +1,46 @@
+%D \module
+%D [ file=metafun.mp,
+%D version=2000.07.15,
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=format generation file,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D First we input John Hobby's metapost plain file. However, because we want to
+%D prevent dependency problems and in the end even may use a patched version,
+%D we prefer to use a copy.
+
+boolean contextlmtxmode ; contextlmtxmode := if known fontmaking : false else: true fi;
+
+input "mp-base.mpiv" ;
+input "mp-tool.mpiv" ;
+input "mp-mlib.mpiv" ;
+input "mp-luas.mpxl" ;
+input "mp-math.mpxl" ;
+input "mp-cont.mpxl" ;
+input "mp-page.mpxl" ;
+input "mp-butt.mpiv" ;
+input "mp-shap.mpiv" ;
+input "mp-grph.mpiv" ;
+input "mp-grid.mpiv" ;
+input "mp-form.mpiv" ;
+input "mp-figs.mpiv" ;
+input "mp-func.mpiv" ;
+input "mp-node.mpiv" ;
+input "mp-apos.mpiv" ;
+input "mp-abck.mpiv" ;
+input "mp-blob.mpiv" ;
+
+input "mp-lmtx.mpxl" ; % playground, not official
+
+string metafunversion ; metafunversion = "metafun xl " & mfun_timestamp;
+
+let normalend = end ;
+
+def end = ; message "" ; message metafunversion ; message "" ; endinput ; enddef ;
+def bye = ; message "" ; message metafunversion ; message "" ; endinput ; enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/minifun.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/minifun.mpiv
index 6d877fddb51..e78bd8e2e19 100644
--- a/Master/texmf-dist/metapost/context/base/mpiv/minifun.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mpiv/minifun.mpiv
@@ -14,6 +14,8 @@
%D This is a minimal \METAFUN\ instance which can be handy for isolated
%D subruns.
+boolean contextlmtxmode ; contextlmtxmode := if known fontmaking : false else: true fi;
+
prologues := 0 ;
mpprocset := 1 ;
@@ -21,17 +23,10 @@ input "mp-base.mpiv" ;
input "mp-tool.mpiv" ;
input "mp-mlib.mpiv" ;
input "mp-luas.mpiv" ;
+input "mp-cont.mpiv" ;
input "mp-page.mpiv" ;
-string minifunversion ; minifunversion =
- "minifun iv" & " " &
- decimal year & "-" &
- decimal month & "-" &
- decimal day & " " &
- if ((time div 60) < 10) : "0" & fi
- decimal (time div 60) & ":" &
- if ((time-(time div 60)*60) < 10) : "0" & fi
- decimal (time-(time div 60)*60) ;
+string minifunversion ; minifunversion = "minifun iv " & mfun_timestamp;
let normalend = end ;
@@ -41,5 +36,3 @@ if known mplib :
else :
def end = ; message "" ; message minifunversion ; message "" ; normalend ; enddef ;
fi ;
-
-% dump ; % obsolete in mplib
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/minifun.mpxl b/Master/texmf-dist/metapost/context/base/mpiv/minifun.mpxl
new file mode 100644
index 00000000000..6769d26e4a9
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/base/mpiv/minifun.mpxl
@@ -0,0 +1,35 @@
+%D \module
+%D [ file=minifun.mp,
+%D version=2018.06.02,
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=format generation file,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is a minimal \METAFUN\ instance which can be handy for isolated
+%D subruns.
+
+boolean contextlmtxmode ; contextlmtxmode := if known fontmaking : false else: true fi;
+
+prologues := 0 ;
+mpprocset := 1 ;
+
+input "mp-base.mpiv" ;
+input "mp-tool.mpiv" ;
+input "mp-mlib.mpiv" ;
+input "mp-luas.mpxl" ;
+input "mp-math.mpxl" ;
+input "mp-cont.mpxl" ;
+input "mp-page.mpiv" ;
+
+string minifunversion ; minifunversion = "minifun xl " & mfun_timestamp;
+
+let normalend = end ;
+
+def end = ; message "" ; message minifunversion ; message "" ; endinput ; enddef ;
+def bye = ; message "" ; message minifunversion ; message "" ; endinput ; enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-base.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/mp-base.mpiv
index 617855473c2..75dd4b4b00a 100644
--- a/Master/texmf-dist/metapost/context/base/mpiv/mp-base.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-base.mpiv
@@ -13,7 +13,7 @@
string base_name, base_version ;
base_name := "plain" ;
-base_version := "1.004 for metafun iv" ;
+base_version := "1.004 for metafun iv and xl" ;
message "loading metafun, including plain.mp version " & base_version ;
@@ -337,7 +337,7 @@ enddef ;
% takepower y of x
% fi
% enddef ;
-%
+%
% def takepower expr y of x =
% if x>0 :
% mexp(y*mlog x)
@@ -818,7 +818,7 @@ enddef ;
newinternal bboxmargin ;
-bboxmargin := 2bp ; % this can bite you
+bboxmargin := 2bp ; % this can bite you, just don't use it in \METAFUN
vardef bbox primary p =
llcorner p - ( bboxmargin, bboxmargin) --
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-blob.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/mp-blob.mpiv
index d1fc7357ba8..dd147bedeb2 100644
--- a/Master/texmf-dist/metapost/context/base/mpiv/mp-blob.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-blob.mpiv
@@ -51,8 +51,8 @@ vardef followtext(expr pth, txt) =
image (
mfun_blob_n := mfun_blob_n + 1 ;
lua.mp.mf_inject_blob(mfun_blob_n,txt);
- save pat, al, at, pl, pc, wid, pos, ap, ad, pic, len, n, sc ;
- path pat ; pat := pth ;
+ save pat, al, at, pl, pc, wid, pos, ap, ad, pic, len, n, b, sc ;
+ path pat, b ; pat := pth ;
numeric al, at, pl, pc, wid, pos, len[], n, sc ;
pair ap, ad ;
picture pic[] ;
@@ -98,15 +98,16 @@ vardef followtext(expr pth, txt) =
draw ap withpen pencircle scaled .50pt withcolor green ;
fi ;
endfor ;
- if ((autoscaleupfollowtext = 2) or (autoscaledownfollowtext = 2)) and
- (sc <> 0) and (sc <> 1):
+ if ((autoscaleupfollowtext = 2) or (autoscaledownfollowtext = 2)) and (sc <> 0) and (sc <> 1):
currentpicture := currentpicture scaled (1/sc) ;
fi ;
+ b := boundingbox currentpicture ;
if tracingfollowtext = 1 :
- draw boundingbox currentpicture withpen pencircle scaled .25pt withcolor blue ;
+ draw b withpen pencircle scaled .25pt withcolor blue ;
fi ;
draw fullcircle scaled 100bp
withprescript "mf_object=followtext"
withprescript "ft_category=" & decimal mfun_blob_n ;
+ setbounds currentpicture to b ;
)
enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-char.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/mp-char.mpiv
index 54e9d6e88a4..130bbea0c28 100644
--- a/Master/texmf-dist/metapost/context/base/mpiv/mp-char.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-char.mpiv
@@ -31,6 +31,7 @@ numeric flow_shape_width ; flow_shape_width := 45pt ;
numeric flow_grid_height ; flow_grid_height := 40pt ;
numeric flow_shape_height ; flow_shape_height := 30pt ;
numeric flow_chart_offset ; flow_chart_offset := 2pt ;
+numeric flow_chart_clip_offset ; flow_chart_offset := 10pt ;
string flow_chart_background_color ; flow_chart_background_color := "white" ;
boolean flow_show_mid_points ; flow_show_mid_points := false ;
boolean flow_show_con_points ; flow_show_con_points := false ;
@@ -102,6 +103,7 @@ def flow_new_chart =
flow_grid_height := 40pt ;
flow_shape_height := 30pt ;
flow_chart_offset := 2pt ;
+ flow_chart_clip_offset := 10pt ;
flow_chart_background_color := "white" ;
flow_show_mid_points := false ;
flow_show_con_points := false ;
@@ -1070,7 +1072,7 @@ enddef ;
def flow_end_chart =
begingroup ;
- save p ; path p ;
+ save p, c ; path p, c ;
flow_flush_shapes ;
flow_flush_connections ;
flow_flush_pictures ;
@@ -1086,8 +1088,9 @@ def flow_end_chart =
(flow_cmax_x,flow_cmax_y)--(flow_cmin_x,flow_cmax_y)--cycle))
flow_scaled_to_grid ;
%draw p withcolor red ;
+ c := p enlarged flow_chart_clip_offset ;
p := p enlarged flow_chart_offset ;
- clip currentpicture to p ;
+ clip currentpicture to c ;
setbounds currentpicture to p ;
endgroup ;
currentpicture := currentpicture scaled flow_chart_scale ;
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-chem.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/mp-chem.mpiv
index 4ed9eaa8fe5..c5f79a88cb8 100644
--- a/Master/texmf-dist/metapost/context/base/mpiv/mp-chem.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-chem.mpiv
@@ -513,10 +513,21 @@ def chem_transformed (suffix $) = % not vardef!
fi
enddef ;
+% vardef chem_draw (expr what, r, c) (text extra) =
+% draw what
+% withpen pencircle scaled r
+% withcolor c
+% extra ;
+% enddef ;
+
vardef chem_draw (expr what, r, c) (text extra) =
draw what
withpen pencircle scaled r
- withcolor c
+ if string c :
+ if c <> "" : withcolor c fi
+ else :
+ withcolor c
+ fi
extra ;
enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-cont.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/mp-cont.mpiv
new file mode 100644
index 00000000000..083286bee44
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-cont.mpiv
@@ -0,0 +1,158 @@
+%D \module
+%D [ file=mp-cont.mpiv,
+%D version=1999.03.10,
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=Interfaces,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module is rather preliminary and subjected to changes.
+
+if known context_cont : endinput ; fi ;
+
+boolean context_cont ; context_cont := true ;
+
+string CurrentLayout ; CurrentLayout := "default" ;
+
+boolean mfun_swapped ;
+
+def SwapPageState =
+ mfun_swapped := true ; % eventually this will go !
+enddef ;
+
+extra_beginfig := extra_beginfig & "mfun_swapped := false ;" ;
+
+% runscript("mp.PaperHeight()") is much faster than lua.mp.PaperHeight() so we use that now:
+
+vardef PaperHeight = runscript("mp.PaperHeight()") enddef ;
+vardef PaperWidth = runscript("mp.PaperWidth()") enddef ;
+vardef PrintPaperHeight = runscript("mp.PrintPaperHeight()") enddef ;
+vardef PrintPaperWidth = runscript("mp.PrintPaperWidth()") enddef ;
+vardef TopSpace = runscript("mp.TopSpace()") enddef ;
+vardef BottomSpace = runscript("mp.BottomSpace()") enddef ;
+vardef BackSpace = runscript("mp.BackSpace()") enddef ;
+vardef CutSpace = runscript("mp.CutSpace()") enddef ;
+vardef MakeupHeight = runscript("mp.MakeupHeight()") enddef ;
+vardef MakeupWidth = runscript("mp.MakeupWidth()") enddef ;
+vardef TopHeight = runscript("mp.TopHeight()") enddef ;
+vardef TopDistance = runscript("mp.TopDistance()") enddef ;
+vardef HeaderHeight = runscript("mp.HeaderHeight()") enddef ;
+vardef HeaderDistance = runscript("mp.HeaderDistance()") enddef ;
+vardef TextHeight = runscript("mp.TextHeight()") enddef ;
+vardef FooterDistance = runscript("mp.FooterDistance()") enddef ;
+vardef FooterHeight = runscript("mp.FooterHeight()") enddef ;
+vardef BottomDistance = runscript("mp.BottomDistance()") enddef ;
+vardef BottomHeight = runscript("mp.BottomHeight()") enddef ;
+vardef LeftEdgeWidth = runscript("mp.LeftEdgeWidth()") enddef ;
+vardef LeftEdgeDistance = runscript("mp.LeftEdgeDistance()") enddef ;
+vardef LeftMarginWidth = runscript("mp.LeftMarginWidth()") enddef ;
+vardef LeftMarginDistance = runscript("mp.LeftMarginDistance()") enddef ;
+vardef TextWidth = runscript("mp.TextWidth()") enddef ;
+vardef RightMarginDistance = runscript("mp.RightMarginDistance()") enddef ;
+vardef RightMarginWidth = runscript("mp.RightMarginWidth()") enddef ;
+vardef RightEdgeDistance = runscript("mp.RightEdgeDistance()") enddef ;
+vardef RightEdgeWidth = runscript("mp.RightEdgeWidth()") enddef ;
+vardef InnerMarginDistance = runscript("mp.InnerMarginDistance()") enddef ;
+vardef InnerMarginWidth = runscript("mp.InnerMarginWidth()") enddef ;
+vardef OuterMarginDistance = runscript("mp.OuterMarginDistance()") enddef ;
+vardef OuterMarginWidth = runscript("mp.OuterMarginWidth()") enddef ;
+vardef InnerEdgeDistance = runscript("mp.InnerEdgeDistance()") enddef ;
+vardef InnerEdgeWidth = runscript("mp.InnerEdgeWidth()") enddef ;
+vardef OuterEdgeDistance = runscript("mp.OuterEdgeDistance()") enddef ;
+vardef OuterEdgeWidth = runscript("mp.OuterEdgeWidth()") enddef ;
+vardef PageOffset = runscript("mp.PageOffset()") enddef ;
+vardef PageDepth = runscript("mp.PageDepth()") enddef ;
+vardef LayoutColumns = runscript("mp.LayoutColumns()") enddef ;
+vardef LayoutColumnDistance = runscript("mp.LayoutColumnDistance()") enddef ;
+vardef LayoutColumnWidth = runscript("mp.LayoutColumnWidth()") enddef ;
+
+vardef OnRightPage = runscript("mp.OnRightPage()") enddef ;
+vardef OnOddPage = runscript("mp.OnOddPage()") enddef ;
+vardef InPageBody = runscript("mp.InPageBody()") enddef ;
+
+vardef RealPageNumber = runscript("mp.RealPageNumber()") enddef ;
+vardef LastPageNumber = runscript("mp.LastPageNumber()") enddef ; % duplicates
+
+vardef PageNumber = runscript("mp.PageNumber()") enddef ;
+vardef NOfPages = runscript("mp.NOfPages()") enddef ;
+
+vardef SubPageNumber = runscript("mp.SubPageNumber()") enddef ;
+vardef NOfSubPages = runscript("mp.NOfSubPages()") enddef ;
+
+vardef CurrentColumn = runscript("mp.CurrentColumn()") enddef ;
+vardef NOfColumns = runscript("mp.NOfColumns()") enddef ;
+
+vardef BaseLineSkip = runscript("mp.BaseLineSkip()") enddef ;
+vardef LineHeight = runscript("mp.LineHeight()") enddef ;
+vardef BodyFontSize = runscript("mp.BodyFontSize()") enddef ;
+
+vardef TopSkip = runscript("mp.TopSkip()") enddef ;
+vardef StrutHeight = runscript("mp.StrutHeight()") enddef ;
+vardef StrutDepth = runscript("mp.StrutDepth()") enddef ;
+
+vardef CurrentWidth = runscript("mp.CurrentWidth()") enddef ;
+vardef CurrentHeight = runscript("mp.CurrentHeight()") enddef ;
+
+vardef HSize = runscript("mp.HSize()") enddef ; % duplicates
+vardef VSize = runscript("mp.VSize()") enddef ; % duplicates
+
+vardef EmWidth = runscript("mp.EmWidth()") enddef ;
+vardef ExHeight = runscript("mp.ExHeight()") enddef ;
+
+vardef PageFraction = runscript("mp.PageFraction()") enddef ;
+
+vardef SpineWidth = runscript("mp.SpineWidth()") enddef ;
+vardef PaperBleed = runscript("mp.PaperBleed()") enddef ;
+
+% CurrentLayout = runscript("mp.CurrentLayout()") enddef ;
+vardef OverlayWidth = runscript("mp.OverlayWidth()") enddef ;
+vardef OverlayHeight = runscript("mp.OverlayHeight()") enddef ;
+vardef OverlayDepth = runscript("mp.OverlayDepth()") enddef ;
+vardef OverlayLineWidth = runscript("mp.OverlayLineWidth()") enddef ;
+vardef OverlayOffset = runscript("mp.OverlayOffset()") enddef ;
+vardef OverlayRegion = runscript("mp.OverlayRegion()") enddef ;
+% OverlayLineColor = runscript("mp.OverlayLineColor()") enddef ;
+% OverlayColor = runscript("mp.OverlayColor()") enddef ;
+
+vardef defaultcolormodel = runscript("mp.defaultcolormodel()") enddef ;
+
+vardef LeftMarginWidth = if mfun_swapped and not OnRightPage : runscript("mp.RightMarginWidth()") else : runscript("mp.LeftMarginWidth()") fi enddef ;
+vardef RightMarginWidth = if mfun_swapped and not OnRightPage : runscript("mp.LeftMarginWidth()") else : runscript("mp.RightMarginWidth()") fi enddef ;
+vardef LeftMarginDistance = if mfun_swapped and not OnRightPage : runscript("mp.RightMarginDistance()") else : runscript("mp.LeftMarginDistance()") fi enddef ;
+vardef RightMarginDistance = if mfun_swapped and not OnRightPage : runscript("mp.LeftMarginDistance()") else : runscript("mp.RightMarginDistance()") fi enddef ;
+
+vardef LeftEdgeWidth = if mfun_swapped and not OnRightPage : runscript("mp.RightEdgeWidth()") else : runscript("mp.LeftEdgeWidth()") fi enddef ;
+vardef RightEdgeWidth = if mfun_swapped and not OnRightPage : runscript("mp.LeftEdgeWidth()") else : runscript("mp.RightEdgeWidth()") fi enddef ;
+vardef LeftEdgeDistance = if mfun_swapped and not OnRightPage : runscript("mp.RightEdgeDistance()") else : runscript("mp.LeftEdgeDistance()") fi enddef ;
+vardef RightEdgeDistance = if mfun_swapped and not OnRightPage : runscript("mp.LeftEdgeDistance()") else : runscript("mp.RightEdgeDistance()") fi enddef ;
+
+vardef BackSpace = if mfun_swapped and not OnRightPage : PaperWidth - MakeupWidth - fi runscript("mp.BackSpace()") enddef ;
+vardef CutSpace = if mfun_swapped and not OnRightPage : PaperWidth - MakeupWidth - fi runscript("mp.CutSpace()") enddef ;
+
+% better use:
+
+vardef OuterMarginWidth = if not OnRightPage : runscript("mp.LeftMarginWidth()") else : runscript("mp.RightMarginWidth()") fi enddef ;
+vardef InnerMarginWidth = if not OnRightPage : runscript("mp.RightMarginWidth()") else : runscript("mp.LeftMarginWidth()") fi enddef ;
+vardef OuterMarginDistance = if not OnRightPage : runscript("mp.LeftMarginDistance()") else : runscript("mp.RightMarginDistance()") fi enddef ;
+vardef InnerMarginDistance = if not OnRightPage : runscript("mp.RightMarginDistance()") else : runscript("mp.LeftMarginDistance()") fi enddef ;
+
+vardef OuterEdgeWidth = if not OnRightPage : runscript("mp.LeftEdgeWidth()") else : runscript("mp.RightEdgeWidth()") fi enddef ;
+vardef InnerEdgeWidth = if not OnRightPage : runscript("mp.RightEdgeWidth()") else : runscript("mp.LeftEdgeWidth()") fi enddef ;
+vardef OuterEdgeDistance = if not OnRightPage : runscript("mp.LeftEdgeDistance()") else : runscript("mp.RightEdgeDistance()") fi enddef ;
+vardef InnerEdgeDistance = if not OnRightPage : runscript("mp.RightEdgeDistance()") else : runscript("mp.LeftEdgeDistance()") fi enddef ;
+
+vardef OuterSpaceWidth = if not OnRightPage : runscript("mp.BackSpace()") else : runscript("mp.CutSpace()") fi enddef ;
+vardef InnerSpaceWidth = if not OnRightPage : runscript("mp.CutSpace()") else : runscript("mp.BackSpace()") fi enddef ;
+
+% indices
+
+vardef OuterMargin = if not OnRightPage : LeftMargin else : RightMargin fi enddef ;
+vardef InnerMargin = if not OnRightPage : RightMargin else : LeftMargin fi enddef ;
+
+vardef OuterEdge = if not OnRightPage : LeftEdge else : RightEdge fi enddef ;
+vardef InnerEdge = if not OnRightPage : Rightedge else : LeftEdge fi enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-cont.mpxl b/Master/texmf-dist/metapost/context/base/mpiv/mp-cont.mpxl
new file mode 100644
index 00000000000..bc318d4b993
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-cont.mpxl
@@ -0,0 +1,158 @@
+%D \module
+%D [ file=mp-cont.mpiv,
+%D version=1999.03.10,
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=Interfaces,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module is rather preliminary and subjected to changes.
+
+if known context_cont : endinput ; fi ;
+
+boolean context_cont ; context_cont := true ;
+
+string CurrentLayout ; CurrentLayout := "default" ;
+
+boolean mfun_swapped ;
+
+def SwapPageState =
+ mfun_swapped := true ; % eventually this will go !
+enddef ;
+
+extra_beginfig := extra_beginfig & "mfun_swapped := false ;" ;
+
+newinternal mfid_PaperHeight ; mfid_PaperHeight := scriptindex "PaperHeight" ; vardef PaperHeight = runscript mfid_PaperHeight enddef ;
+newinternal mfid_PaperWidth ; mfid_PaperWidth := scriptindex "PaperWidth" ; vardef PaperWidth = runscript mfid_PaperWidth enddef ;
+newinternal mfid_PrintPaperHeight ; mfid_PrintPaperHeight := scriptindex "PrintPaperHeight" ; vardef PrintPaperHeight = runscript mfid_PrintPaperHeight enddef ;
+newinternal mfid_PrintPaperWidth ; mfid_PrintPaperWidth := scriptindex "PrintPaperWidth" ; vardef PrintPaperWidth = runscript mfid_PrintPaperWidth enddef ;
+newinternal mfid_TopSpace ; mfid_TopSpace := scriptindex "TopSpace" ; vardef TopSpace = runscript mfid_TopSpace enddef ;
+newinternal mfid_BottomSpace ; mfid_BottomSpace := scriptindex "BottomSpace" ; vardef BottomSpace = runscript mfid_BottomSpace enddef ;
+newinternal mfid_BackSpace ; mfid_BackSpace := scriptindex "BackSpace" ; vardef BackSpace = runscript mfid_BackSpace enddef ;
+newinternal mfid_CutSpace ; mfid_CutSpace := scriptindex "CutSpace" ; vardef CutSpace = runscript mfid_CutSpace enddef ;
+newinternal mfid_MakeupHeight ; mfid_MakeupHeight := scriptindex "MakeupHeight" ; vardef MakeupHeight = runscript mfid_MakeupHeight enddef ;
+newinternal mfid_MakeupWidth ; mfid_MakeupWidth := scriptindex "MakeupWidth" ; vardef MakeupWidth = runscript mfid_MakeupWidth enddef ;
+newinternal mfid_TopHeight ; mfid_TopHeight := scriptindex "TopHeight" ; vardef TopHeight = runscript mfid_TopHeight enddef ;
+newinternal mfid_TopDistance ; mfid_TopDistance := scriptindex "TopDistance" ; vardef TopDistance = runscript mfid_TopDistance enddef ;
+newinternal mfid_HeaderHeight ; mfid_HeaderHeight := scriptindex "HeaderHeight" ; vardef HeaderHeight = runscript mfid_HeaderHeight enddef ;
+newinternal mfid_HeaderDistance ; mfid_HeaderDistance := scriptindex "HeaderDistance" ; vardef HeaderDistance = runscript mfid_HeaderDistance enddef ;
+newinternal mfid_TextHeight ; mfid_TextHeight := scriptindex "TextHeight" ; vardef TextHeight = runscript mfid_TextHeight enddef ;
+newinternal mfid_FooterDistance ; mfid_FooterDistance := scriptindex "FooterDistance" ; vardef FooterDistance = runscript mfid_FooterDistance enddef ;
+newinternal mfid_FooterHeight ; mfid_FooterHeight := scriptindex "FooterHeight" ; vardef FooterHeight = runscript mfid_FooterHeight enddef ;
+newinternal mfid_BottomDistance ; mfid_BottomDistance := scriptindex "BottomDistance" ; vardef BottomDistance = runscript mfid_BottomDistance enddef ;
+newinternal mfid_BottomHeight ; mfid_BottomHeight := scriptindex "BottomHeight" ; vardef BottomHeight = runscript mfid_BottomHeight enddef ;
+newinternal mfid_LeftEdgeWidth ; mfid_LeftEdgeWidth := scriptindex "LeftEdgeWidth" ; vardef LeftEdgeWidth = runscript mfid_LeftEdgeWidth enddef ;
+newinternal mfid_LeftEdgeDistance ; mfid_LeftEdgeDistance := scriptindex "LeftEdgeDistance" ; vardef LeftEdgeDistance = runscript mfid_LeftEdgeDistance enddef ;
+newinternal mfid_LeftMarginWidth ; mfid_LeftMarginWidth := scriptindex "LeftMarginWidth" ; vardef LeftMarginWidth = runscript mfid_LeftMarginWidth enddef ;
+newinternal mfid_LeftMarginDistance ; mfid_LeftMarginDistance := scriptindex "LeftMarginDistance" ; vardef LeftMarginDistance = runscript mfid_LeftMarginDistance enddef ;
+newinternal mfid_TextWidth ; mfid_TextWidth := scriptindex "TextWidth" ; vardef TextWidth = runscript mfid_TextWidth enddef ;
+newinternal mfid_RightMarginDistance ; mfid_RightMarginDistance := scriptindex "RightMarginDistance" ; vardef RightMarginDistance = runscript mfid_RightMarginDistance enddef ;
+newinternal mfid_RightMarginWidth ; mfid_RightMarginWidth := scriptindex "RightMarginWidth" ; vardef RightMarginWidth = runscript mfid_RightMarginWidth enddef ;
+newinternal mfid_RightEdgeDistance ; mfid_RightEdgeDistance := scriptindex "RightEdgeDistance" ; vardef RightEdgeDistance = runscript mfid_RightEdgeDistance enddef ;
+newinternal mfid_RightEdgeWidth ; mfid_RightEdgeWidth := scriptindex "RightEdgeWidth" ; vardef RightEdgeWidth = runscript mfid_RightEdgeWidth enddef ;
+newinternal mfid_InnerMarginDistance ; mfid_InnerMarginDistance := scriptindex "InnerMarginDistance" ; vardef InnerMarginDistance = runscript mfid_InnerMarginDistance enddef ;
+newinternal mfid_InnerMarginWidth ; mfid_InnerMarginWidth := scriptindex "InnerMarginWidth" ; vardef InnerMarginWidth = runscript mfid_InnerMarginWidth enddef ;
+newinternal mfid_OuterMarginDistance ; mfid_OuterMarginDistance := scriptindex "OuterMarginDistance" ; vardef OuterMarginDistance = runscript mfid_OuterMarginDistance enddef ;
+newinternal mfid_OuterMarginWidth ; mfid_OuterMarginWidth := scriptindex "OuterMarginWidth" ; vardef OuterMarginWidth = runscript mfid_OuterMarginWidth enddef ;
+newinternal mfid_InnerEdgeDistance ; mfid_InnerEdgeDistance := scriptindex "InnerEdgeDistance" ; vardef InnerEdgeDistance = runscript mfid_InnerEdgeDistance enddef ;
+newinternal mfid_InnerEdgeWidth ; mfid_InnerEdgeWidth := scriptindex "InnerEdgeWidth" ; vardef InnerEdgeWidth = runscript mfid_InnerEdgeWidth enddef ;
+newinternal mfid_OuterEdgeDistance ; mfid_OuterEdgeDistance := scriptindex "OuterEdgeDistance" ; vardef OuterEdgeDistance = runscript mfid_OuterEdgeDistance enddef ;
+newinternal mfid_OuterEdgeWidth ; mfid_OuterEdgeWidth := scriptindex "OuterEdgeWidth" ; vardef OuterEdgeWidth = runscript mfid_OuterEdgeWidth enddef ;
+newinternal mfid_PageOffset ; mfid_PageOffset := scriptindex "PageOffset" ; vardef PageOffset = runscript mfid_PageOffset enddef ;
+newinternal mfid_PageDepth ; mfid_PageDepth := scriptindex "PageDepth" ; vardef PageDepth = runscript mfid_PageDepth enddef ;
+newinternal mfid_LayoutColumns ; mfid_LayoutColumns := scriptindex "LayoutColumns" ; vardef LayoutColumns = runscript mfid_LayoutColumns enddef ;
+newinternal mfid_LayoutColumnDistance ; mfid_LayoutColumnDistance := scriptindex "LayoutColumnDistance" ; vardef LayoutColumnDistance = runscript mfid_LayoutColumnDistance enddef ;
+newinternal mfid_LayoutColumnWidth ; mfid_LayoutColumnWidth := scriptindex "LayoutColumnWidth" ; vardef LayoutColumnWidth = runscript mfid_LayoutColumnWidth enddef ;
+
+newinternal mfid_OnRightPage ; mfid_OnRightPage := scriptindex "OnRightPage" ; vardef OnRightPage = runscript mfid_OnRightPage enddef ;
+newinternal mfid_OnOddPage ; mfid_OnOddPage := scriptindex "OnOddPage" ; vardef OnOddPage = runscript mfid_OnOddPage enddef ;
+newinternal mfid_InPageBody ; mfid_InPageBody := scriptindex "InPageBody" ; vardef InPageBody = runscript mfid_InPageBody enddef ;
+
+newinternal mfid_RealPageNumber ; mfid_RealPageNumber := scriptindex "RealPageNumber" ; vardef RealPageNumber = runscript mfid_RealPageNumber enddef ;
+newinternal mfid_LastPageNumber ; mfid_LastPageNumber := scriptindex "LastPageNumber" ; vardef LastPageNumber = runscript mfid_LastPageNumber enddef ;
+
+newinternal mfid_PageNumber ; mfid_PageNumber := scriptindex "PageNumber" ; vardef PageNumber = runscript mfid_PageNumber enddef ;
+newinternal mfid_NOfPages ; mfid_NOfPages := scriptindex "NOfPages" ; vardef NOfPages = runscript mfid_NOfPages enddef ;
+
+newinternal mfid_SubPageNumber ; mfid_SubPageNumber := scriptindex "SubPageNumber" ; vardef SubPageNumber = runscript mfid_SubPageNumber enddef ;
+newinternal mfid_NOfSubPages ; mfid_NOfSubPages := scriptindex "NOfSubPages" ; vardef NOfSubPages = runscript mfid_NOfSubPages enddef ;
+
+newinternal mfid_CurrentColumn ; mfid_CurrentColumn := scriptindex "CurrentColumn" ; vardef CurrentColumn = runscript mfid_CurrentColumn enddef ;
+newinternal mfid_NOfColumns ; mfid_NOfColumns := scriptindex "NOfColumns" ; vardef NOfColumns = runscript mfid_NOfColumns enddef ;
+
+newinternal mfid_BaseLineSkip ; mfid_BaseLineSkip := scriptindex "BaseLineSkip" ; vardef BaseLineSkip = runscript mfid_BaseLineSkip enddef ;
+newinternal mfid_LineHeight ; mfid_LineHeight := scriptindex "LineHeight" ; vardef LineHeight = runscript mfid_LineHeight enddef ;
+newinternal mfid_BodyFontSize ; mfid_BodyFontSize := scriptindex "BodyFontSize" ; vardef BodyFontSize = runscript mfid_BodyFontSize enddef ;
+
+newinternal mfid_TopSkip ; mfid_TopSkip := scriptindex "TopSkip" ; vardef TopSkip = runscript mfid_TopSkip enddef ;
+newinternal mfid_StrutHeight ; mfid_StrutHeight := scriptindex "StrutHeight" ; vardef StrutHeight = runscript mfid_StrutHeight enddef ;
+newinternal mfid_StrutDepth ; mfid_StrutDepth := scriptindex "StrutDepth" ; vardef StrutDepth = runscript mfid_StrutDepth enddef ;
+
+newinternal mfid_CurrentWidth ; mfid_CurrentWidth := scriptindex "CurrentWidth" ; vardef CurrentWidth = runscript mfid_CurrentWidth enddef ;
+newinternal mfid_CurrentHeight ; mfid_CurrentHeight := scriptindex "CurrentHeight" ; vardef CurrentHeight = runscript mfid_CurrentHeight enddef ;
+
+newinternal mfid_HSize ; mfid_HSize := scriptindex "HSize" ; vardef HSize = runscript mfid_HSize enddef ;
+newinternal mfid_VSize ; mfid_VSize := scriptindex "VSize" ; vardef VSize = runscript mfid_VSize enddef ;
+
+newinternal mfid_EmWidth ; mfid_EmWidth := scriptindex "EmWidth" ; vardef EmWidth = runscript mfid_EmWidth enddef ;
+newinternal mfid_ExHeight ; mfid_ExHeight := scriptindex "ExHeight" ; vardef ExHeight = runscript mfid_ExHeight enddef ;
+
+newinternal mfid_PageFraction ; mfid_PageFraction := scriptindex "PageFraction" ; vardef PageFraction = runscript mfid_PageFraction enddef ;
+
+newinternal mfid_SpineWidth ; mfid_SpineWidth := scriptindex "SpineWidth" ; vardef SpineWidth = runscript mfid_SpineWidth enddef ;
+newinternal mfid_PaperBleed ; mfid_PaperBleed := scriptindex "PaperBleed" ; vardef PaperBleed = runscript mfid_PaperBleed enddef ;
+
+% mfid_CurrentLayout ; mfid_CurrentLayout := scriptindex "CurrentLayout" ; vardef CurrentLayout = runscript mfid_CurrentLayout enddef ;
+newinternal mfid_OverlayWidth ; mfid_OverlayWidth := scriptindex "OverlayWidth" ; vardef OverlayWidth = runscript mfid_OverlayWidth enddef ;
+newinternal mfid_OverlayHeight ; mfid_OverlayHeight := scriptindex "OverlayHeight" ; vardef OverlayHeight = runscript mfid_OverlayHeight enddef ;
+newinternal mfid_OverlayDepth ; mfid_OverlayDepth := scriptindex "OverlayDepth" ; vardef OverlayDepth = runscript mfid_OverlayDepth enddef ;
+newinternal mfid_OverlayLineWidth ; mfid_OverlayLineWidth := scriptindex "OverlayLineWidth" ; vardef OverlayLineWidth = runscript mfid_OverlayLineWidth enddef ;
+newinternal mfid_OverlayOffset ; mfid_OverlayOffset := scriptindex "OverlayOffset" ; vardef OverlayOffset = runscript mfid_OverlayOffset enddef ;
+newinternal mfid_OverlayRegion ; mfid_OverlayRegion := scriptindex "OverlayRegion" ; vardef OverlayRegion = runscript mfid_OverlayRegion enddef ;
+% mfid_OverlayLineColor ; mfid_OverlayLineColor := scriptindex "OverlayLineColor ; vardef OverlayLineColor = runscript mfid_OverlayLineColor enddef ;
+% mfid_OverlayColor ; mfid_OverlayColor := scriptindex "OverlayColor ; vardef OverlayColor = runscript mfid_OverlayColor enddef ;
+
+newinternal mfid_defaultcolormodel ; mfid_defaultcolormodel := scriptindex "defaultcolormodel" ; vardef defaultcolormodel = runscript mfid_defaultcolormodel enddef ;
+
+vardef LeftMarginWidth = if mfun_swapped and not OnRightPage : runscript mfid_RightMarginWidth else : runscript mfid_LeftMarginWidth fi enddef ;
+vardef RightMarginWidth = if mfun_swapped and not OnRightPage : runscript mfid_LeftMarginWidth else : runscript mfid_RightMarginWidth fi enddef ;
+vardef LeftMarginDistance = if mfun_swapped and not OnRightPage : runscript mfid_RightMarginDistance else : runscript mfid_LeftMarginDistance fi enddef ;
+vardef RightMarginDistance = if mfun_swapped and not OnRightPage : runscript mfid_LeftMarginDistance else : runscript mfid_RightMarginDistance fi enddef ;
+
+vardef LeftEdgeWidth = if mfun_swapped and not OnRightPage : runscript mfid_RightEdgeWidth else : runscript mfid_LeftEdgeWidth fi enddef ;
+vardef RightEdgeWidth = if mfun_swapped and not OnRightPage : runscript mfid_LeftEdgeWidth else : runscript mfid_RightEdgeWidth fi enddef ;
+vardef LeftEdgeDistance = if mfun_swapped and not OnRightPage : runscript mfid_RightEdgeDistance else : runscript mfid_LeftEdgeDistance fi enddef ;
+vardef RightEdgeDistance = if mfun_swapped and not OnRightPage : runscript mfid_LeftEdgeDistance else : runscript mfid_RightEdgeDistance fi enddef ;
+
+vardef BackSpace = if mfun_swapped and not OnRightPage : PaperWidth - MakeupWidth - fi runscript mfid_BackSpace enddef ;
+vardef CutSpace = if mfun_swapped and not OnRightPage : PaperWidth - MakeupWidth - fi runscript mfid_CutSpace enddef ;
+
+% better use:
+
+vardef OuterMarginWidth = if not OnRightPage : runscript mfid_LeftMarginWidth else : runscript mfid_RightMarginWidth fi enddef ;
+vardef InnerMarginWidth = if not OnRightPage : runscript mfid_RightMarginWidth else : runscript mfid_LeftMarginWidth fi enddef ;
+vardef OuterMarginDistance = if not OnRightPage : runscript mfid_LeftMarginDistance else : runscript mfid_RightMarginDistance fi enddef ;
+vardef InnerMarginDistance = if not OnRightPage : runscript mfid_RightMarginDistance else : runscript mfid_LeftMarginDistance fi enddef ;
+
+vardef OuterEdgeWidth = if not OnRightPage : runscript mfid_LeftEdgeWidth else : runscript mfid_RightEdgeWidth fi enddef ;
+vardef InnerEdgeWidth = if not OnRightPage : runscript mfid_RightEdgeWidth else : runscript mfid_LeftEdgeWidth fi enddef ;
+vardef OuterEdgeDistance = if not OnRightPage : runscript mfid_LeftEdgeDistance else : runscript mfid_RightEdgeDistance fi enddef ;
+vardef InnerEdgeDistance = if not OnRightPage : runscript mfid_RightEdgeDistance else : runscript mfid_LeftEdgeDistance fi enddef ;
+
+vardef OuterSpaceWidth = if not OnRightPage : runscript mfid_BackSpace else : runscript mfid_CutSpace fi enddef ;
+vardef InnerSpaceWidth = if not OnRightPage : runscript mfid_CutSpace else : runscript mfid_BackSpace fi enddef ;
+
+% indices
+
+vardef OuterMargin = if not OnRightPage : LeftMargin else : RightMargin fi enddef ;
+vardef InnerMargin = if not OnRightPage : RightMargin else : LeftMargin fi enddef ;
+
+vardef OuterEdge = if not OnRightPage : LeftEdge else : RightEdge fi enddef ;
+vardef InnerEdge = if not OnRightPage : Rightedge else : LeftEdge fi enddef ;
+
+
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-crop.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/mp-crop.mpiv
index e06cf8defa2..b3ae3c28dd5 100644
--- a/Master/texmf-dist/metapost/context/base/mpiv/mp-crop.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-crop.mpiv
@@ -45,10 +45,10 @@ enddef ;
vardef crop_marks_cmyk =
pickup pencircle scaled 1/2 ;
save p ; picture p ; p := image (
- fill ulcircle scaled 12.5 withcolor (1,0,0,0) ;
- fill urcircle scaled 12.5 withcolor (0,1,0,0) ;
- fill lrcircle scaled 12.5 withcolor (0,0,1,0) ;
- fill llcircle scaled 12.5 withcolor (0,0,0,1) ;
+ fill ulcircle scaled 12.5 withcolor (1,0,0,0) ;
+ fill urcircle scaled 12.5 withcolor (0,1,0,0) ;
+ fill lrcircle scaled 12.5 withcolor (0,0,1,0) ;
+ fill llcircle scaled 12.5 withcolor (0,0,0,1) ;
draw (-10,0) -- (10,0) ;
draw (0,-10) -- (0,10) ;
draw fullcircle scaled 12.5 ;
@@ -59,10 +59,10 @@ enddef ;
vardef crop_marks_gray =
save p ; picture p ; p := image (
- fill ulcircle scaled 12.5 withcolor (0.00) ;
- fill urcircle scaled 12.5 withcolor (0.25) ;
- fill lrcircle scaled 12.5 withcolor (0.50) ;
- fill llcircle scaled 12.5 withcolor (0.75) ;
+ fill ulcircle scaled 12.5 withcolor (0.00) ;
+ fill urcircle scaled 12.5 withcolor (0.25) ;
+ fill lrcircle scaled 12.5 withcolor (0.50) ;
+ fill llcircle scaled 12.5 withcolor (0.75) ;
draw (-10,0) -- (10,0) ;
draw (0,-10) -- (0,10) ;
draw (-6,0) -- (6,0) withcolor white ;
@@ -75,14 +75,14 @@ enddef ;
vardef crop_marks_cmykrgb =
save p ; picture p ; p := image (
- fill ulcircle scaled 15 withcolor (1,0,0) ;
- fill urcircle scaled 15 withcolor (0,1,0) ;
- fill lrcircle scaled 15 withcolor (0,0,1) ;
- fill llcircle scaled 15 withcolor (.5,.5,.5) ;
- fill ulcircle scaled 10 withcolor (1,0,0,0) ;
- fill urcircle scaled 10 withcolor (0,1,0,0) ;
- fill lrcircle scaled 10 withcolor (0,0,1,0) ;
- fill llcircle scaled 10 withcolor (0,0,0,1) ;
+ fill ulcircle scaled 15 withcolor (1,0,0) ;
+ fill urcircle scaled 15 withcolor (0,1,0) ;
+ fill lrcircle scaled 15 withcolor (0,0,1) ;
+ fill llcircle scaled 15 withcolor (.5,.5,.5) ;
+ fill ulcircle scaled 10 withcolor (1,0,0,0) ;
+ fill urcircle scaled 10 withcolor (0,1,0,0) ;
+ fill lrcircle scaled 10 withcolor (0,0,1,0) ;
+ fill llcircle scaled 10 withcolor (0,0,0,1) ;
draw (-10,0) -- (10,0) ;
draw (0,-10) -- (0,10) ;
draw fullcircle scaled 10 ;
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-lmtx.mpxl b/Master/texmf-dist/metapost/context/base/mpiv/mp-lmtx.mpxl
new file mode 100644
index 00000000000..2bef6ff8833
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-lmtx.mpxl
@@ -0,0 +1,2253 @@
+%D \module
+%D [ file=mp-luas.lmtx,
+%D version=2019.06.23,
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=\LUA,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% This is an experimental module where I test some new interface methods;
+% for real advanced graphics use the luapost module.
+
+if known context_lmtx : endinput ; fi ;
+
+boolean context_lmtx ; context_lmtx := true ;
+
+presetparameters "text" [
+ offset = 0,
+ strut = "auto",
+ style = "",
+ color = "",
+ text = "",
+ anchor = "",
+ format = "",
+ position = origin,
+ trace = false,
+
+ background = "", % "color",
+ backgroundcolor = "gray",
+] ;
+
+def lmt_text = applyparameters "text" "lmt_do_text" enddef ;
+
+vardef lmt_do_text =
+ image (
+ pushparameters "text" ;
+ save style, anchor, txt, fmt, strt ;
+ string style, anchor, txt, fmt, strt, bgr ;
+ interim textextoffset := getparameter "offset" ;
+ style := getparameter "style" ;
+ anchor := getparameter "anchor" ;
+ strt := getparameter "strut" ;
+ fmt := getparameter "format" ;
+ txt := getparameter "text" ;
+ bgr := getparameter "background" ;
+ if fmt <> "" :
+ txt := "\formatone{" & fmt & "}{" & txt & "}"
+ fi ;
+ if strt = "yes" :
+ txt := "\strut " & txt ;
+ elseif strt = "auto" :
+ txt := "\setstrut\strut " & txt ;
+ fi ;
+ if style <> "" :
+ txt := "\style[" & style & "]{" & txt & "}" ;
+ fi ;
+ if getparameter "trace" :
+ txt := "\ruledhbox{\showstruts" & txt & "}" ;
+ fi ;
+ draw
+ if anchor = "" : thetextext else : scantokens("thetextext." & anchor) fi (
+ txt,
+ getparameter "position"
+ )
+ withcolor getparameter "color" ;
+ if bgr = "color" :
+ addbackground withcolor getparameter "backgroundcolor" ;
+ fi ;
+ popparameters ;
+ )
+enddef ;
+
+presetparameters "grid" [
+ nx = 1, dx = 1,
+ ny = 1, dy = 1,
+] ;
+
+def lmt_grid = applyparameters "grid" "lmt_do_grid" enddef ;
+
+vardef lmt_do_grid =
+ image (
+ save nx; nx := getparameter "grid" "nx" ;
+ save ny; ny := getparameter "grid" "ny" ;
+ save dx; dx := getparameter "grid" "dx" ;
+ save dy; dy := getparameter "grid" "dy" ;
+ for i = 0 step dx until nx :
+ draw ((0,0) -- (0,ny)) shifted (i,0) ;
+ endfor ;
+ for i = 0 step dy until ny :
+ draw ((0,0) -- (nx,0)) shifted (0,i) ;
+ endfor ;
+ )
+enddef ;
+
+def lmt_axis = applyparameters "axis" "lmt_do_axis" enddef ;
+
+presetparameters "axis" [
+ nx = 1, dx = 1, tx = 0, sx = 1, startx = 0,
+ ny = 1, dy = 1, ty = 0, sy = 1, starty = 0,
+
+ samples = { },
+ list = { },
+ connect = false,
+ list = [ close = false ],
+ samplecolors = { "" },
+ axiscolor = "",
+ textcolor = "",
+] ;
+
+vardef lmt_do_axis =
+ image (
+
+ pushparameters "axis" ;
+ save nx, ny, dx, dy, tx, ty ;
+ save c, startx, starty ; string c ;
+ nx := getparameter "nx" ;
+ ny := getparameter "ny" ;
+ dx := getparameter "dx" ;
+ dy := getparameter "dy" ;
+ tx := getparameter "tx" ;
+ ty := getparameter "ty" ;
+ c := getparameter "axiscolor" ;
+ startx := getparameter "startx" ;
+ starty := getparameter "starty" ;
+ draw (startx,starty) -- (startx,ny) withcolor c ;
+ draw (startx,starty) -- (nx,starty) withcolor c ;
+ for i = startx step dx until nx :
+ if (i > startx) or (startx = 0) :
+ draw ((0,0) -- (0,-2)) shifted (i,starty) withcolor c ;
+ fi ;
+ endfor ;
+ for i = starty step dy until ny :
+ if (i > starty) or (starty = 0) :
+ draw ((0,0) -- (-2,0)) shifted (startx,i) withcolor c ;
+ fi ;
+ endfor ;
+ if tx <> 0 :
+ c := getparameter "textcolor" ;
+ for i = startx step tx until nx :
+ if (i > startx) or (startx = 0) :
+ draw
+ textext("\strut " & decimal (i)) ysized 2 shifted (i,-4+starty)
+ withcolor c;
+ fi ;
+ endfor ;
+ fi ;
+ if ty <> 0 :
+ c := getparameter "textcolor" ;
+ for i = starty step ty until ny :
+ if (i > starty) or (starty = 0) :
+ draw
+ textext.lft("\strut " & decimal (i)) ysized 2 shifted (-3+startx,i)
+ withcolor c;
+ fi ;
+ endfor ;
+ fi ;
+
+ if (getparametercount "samples") > 0 :
+ if getparameter "connect" :
+ for s = 1 upto getparametercount "samples" :
+ c := getparameter "samplecolors" s ;
+ draw for i = 1 upto getparametercount "samples" s :
+ if (i > 1) : -- fi (i, getparameter "samples" s i)
+ endfor
+ withcolor c ;
+ endfor ;
+ else :
+ for s = 1 upto getparametercount "samples" :
+ c := getparameter "samplecolors" s ;
+ for i = 1 upto getparametercount "samples" s :
+ draw (i, getparameter "samples" s i)
+ withcolor c ;
+ endfor ;
+ endfor ;
+ fi ;
+ fi ;
+
+ if (getparametercount "list") > 0 :
+
+ save p, ts, a, d ; path p ; numeric ts ; pair a, d ;
+
+ ts := (getparameter "sy") / 20 ;
+
+ pushparameters "list" ;
+ for s = 1 upto getparametercount :
+ pushparameters s ;
+
+ c := getparameter "color" ;
+
+ % p := for i = 1 upto getparametercount "points":
+ % if (i > 1) : -- fi (getparameter "points" i)
+ % endfor
+ % if (getparameterdefault "close" false) : -- cycle fi ;
+
+ % this can become:
+
+ % p := if (getparameterdefault "close" false) :
+ % % getparameterpath "points" "--" true ;
+ % getparameterpath "points" true ;
+ % else :
+ % % getparameterpath "points" "--" false ;
+ % getparameterpath "points" ;
+ % fi ;
+
+ % p := getparameterpath "points" if (getparameterdefault "close" false) : true fi ;
+
+ p := getparameterpath "points" (getparameterdefault "close" false) ;
+ % p := getparameterpath "points" getparameterdefault "close" false ;
+
+ draw p withcolor c ;
+
+ pushparameters "labels" ;
+ if (getparametercount) > 0 :
+ for i = 1 upto getparametercount:
+ n := i - 1 ;
+ a := point n of p ;
+ d := direction n of p ;
+ draw
+ textext(getparametertext i true)
+ ysized ts
+ shifted (a + .5 * unitvector(d) rotated 90) ;
+ endfor ;
+ fi ;
+ popparameters ;
+
+ pushparameters "texts" ;
+ if (getparametercount) > 0 :
+ for i = 1 upto getparametercount :
+ n := i + 0.5 ;
+ a := point n of p ;
+ d := direction n of p ;
+ draw textext.d(getparametertext i true)
+ if d < left : rotated 180 shifted (0,-5) else : shifted (0,5) fi
+ ysized ts
+ shifted a
+ rotatedaround(a,angle(d)) ;
+ endfor ;
+ fi ;
+ popparameters ;
+
+ popparameters ;
+ endfor ;
+ popparameters ;
+ fi ;
+
+ popparameters ;
+
+ )
+ xyscaled(getparameter "axis" "sx",getparameter "axis" "sy")
+enddef ;
+
+presetparameters "outline" [
+ text = "",
+ kind = "draw",
+ fillcolor = "",
+ drawcolor = "",
+ rulethickness = 1/10,
+ align = "",
+ style = "",
+ width = 0,
+] ;
+
+def lmt_outline = applyparameters "outline" "lmt_do_outline" enddef ;
+
+vardef lmt_do_outline =
+ image ( normaldraw image (
+ save kind ; string kind ; kind := getparameter "outline" "kind" ;
+ save align ; string align ; align := getparameter "outline" "align" ;
+ save style ; string style ; style := getparameter "outline" "style" ;
+ save width ; numeric width ; width := getparameter "outline" "width" ;
+ if kind = "draw" :
+ kind := "d" ;
+ elseif kind = "fill" :
+ kind := "f" ;
+ elseif kind = "both" :
+ kind := "b" ;
+ elseif kind = "reverse" :
+ kind := "r" ;
+ elseif kind = "fillup" :
+ kind := "u" ;
+ fi ;
+ currentoutlinetext := currentoutlinetext + 1 ;
+ lua.mp.mf_outline_text(
+ currentoutlinetext,
+ if align = "" :
+ getparameter "outline" "text",
+ else :
+ "\framed[align={" & align & "}"
+ if width > 0 :
+ & ",width=" & decimal width & "bp"
+ fi
+ if style <> "" :
+ & ",foregroundstyle={" & style & "}"
+ fi
+ & ",offset=none,frame=off]{"
+ & (getparameter "outline" "text")
+ & "}",
+ fi,
+ kind
+ ) ;
+ save currentpen; pen currentpen ;
+ pickup pencircle scaled getparameter "outline" "rulethickness" ;
+ if kind = "f" :
+ mfun_do_outline_text_set_f (
+ withcolor getparameter "outline" "fillcolor"
+ );
+ elseif kind = "d" :
+ mfun_do_outline_text_set_d (
+ withcolor getparameter "outline" "drawcolor"
+ );
+ elseif kind = "b" :
+ mfun_do_outline_text_set_b (
+ withcolor getparameter "outline" "fillcolor"
+ ) (
+ withcolor getparameter "outline" "drawcolor"
+ );
+ elseif kind = "u" :
+ mfun_do_outline_text_set_u (
+ withcolor getparameter "outline" "fillcolor"
+ );
+ elseif kind = "r" :
+ mfun_do_outline_text_set_r (
+ withcolor getparameter "outline" "drawcolor"
+ ) (
+ withcolor getparameter "outline" "fillcolor"
+ ) ;
+ elseif kind = "p" :
+ mfun_do_outline_text_set_p ;
+ else :
+ mfun_do_outline_text_set_n (
+ % what to use here
+ );
+ fi ;
+ lua.mp.mf_get_outline_text(currentoutlinetext) ;
+ ) )
+enddef ;
+
+presetparameters "followtext" [
+ text = "",
+ spread = true,
+ trace = false,
+ reverse = false,
+ autoscaleup = "no",
+ autoscaledown = "no",
+ path = (fullcircle),
+] ;
+
+def lmt_followtext = applyparameters "followtext" "lmt_do_followtext" enddef ;
+
+vardef lmt_do_followtext =
+ image (
+ pushparameters "followtext" ;
+ save s_u ; string s_u ; s_u := getparameter "autoscaleup" ;
+ save s_d ; string s_d ; s_d := getparameter "autoscaledown" ;
+ save followtextalternative ; followtextalternative := if getparameter "spread" : 1 else : 0 fi ;
+ save tracingfollowtext ; tracingfollowtext := if getparameter "trace" : 1 else : 0 fi ;
+ save autoscaleupfollowtext ; autoscaleupfollowtext := if s_u = "yes" : 1 elseif s_u = "max" : 2 else : 0 fi ;
+ save autoscaledownfollowtext ; autoscaledownfollowtext := if s_d = "yes" : 1 elseif s_d = "max" : 2 else : 0 fi ;
+ draw followtext (
+ if (getparameter "reverse") : reverse fi (getparameter "path"),
+ getparameter "text"
+ ) ;
+ popparameters ;
+ )
+enddef ;
+
+presetparameters "arrow" [
+ path = origin,
+ % pen = ...,
+ kind = "fill",
+ dimple = 1/5,
+ scale = 3/4,
+ penscale = 3,
+ length = 4,
+ angle = 45,
+ location = "end", % middle both
+ alternative = "normal", % dimpled curved
+ percentage = 50,
+ headonly = false,
+] ;
+
+def lmt_arrow = applyparameters "arrow" "lmt_do_arrow" enddef ;
+
+vardef lmt_do_arrow =
+ image (
+ pushparameters "arrow" ;
+ save a ; string a ; a := getparameter "alternative" ;
+ save l ; string l ; l := getparameter "location" ;
+ save k ; string k ; k := getparameter "kind" ;
+ save p ; path p ; p := getparameter "path" ;
+ save ahvariant ; ahvariant := if a = "dimpled" : 1 elseif a = "curved" : 2 else : 0 fi ;
+ save ahdimple ; ahdimple := getparameter "dimple" ;
+ save ahscale ; ahscale := getparameter "scale" ;
+ save ahangle ; ahangle := getparameter "angle" ;
+ save ahlength ; ahlength := getparameter "length" ;
+ if not getparameter "headonly" :
+ draw p ;
+ fi ;
+ if hasparameter "pen" :
+ % a cheat: we should have a type check in lua
+ if hasoption "pen" "auto" :
+ ahlength := (getparameter "penscale") * boundingradius(currentpen) ;
+ else :
+ ahlength := (getparameter "penscale") * boundingradius(getparameterpen "pen") ;
+ fi ;
+ fi ;
+ if k = "draw" : draw elseif k = "both" : filldraw else : fill fi
+ if l = "middle" :
+ midarrowhead p ;
+ elseif l = "percentage" :
+ arrowheadonpath (p, (getparameter "percentage")/100) ;
+ elseif l = "both" :
+ arrowhead p ;
+ if k = "draw" : draw elseif k = "both" : filldraw else : fill fi
+ arrowhead reverse p ;
+ else :
+ arrowhead p ;
+ fi ;
+ popparameters ;
+ )
+enddef ;
+
+% from dum
+
+presetparameters "placeholder" [
+ color = "red",
+ width = 1,
+ height = 1,
+ reduction = 0,
+ alternative = "circle",
+] ;
+
+def lmt_placeholder = applyparameters "placeholder" "lmt_do_placeholder" enddef ;
+
+def lmt_do_placeholder =
+ begingroup ;
+ pushparameters "placeholder" ;
+ save w, h, d, r, p, c, b, s, q, a ;
+ numeric w, h, d, r ; path p ; string s, a ;
+ s := getparameter "color" ;
+ w := getparameter "width" ;
+ h := getparameter "height" ;
+ r := getparameter "reduction" ;
+ a := getparameter "alternative" ;
+ d := max(w,h) ;
+ if cmykcolor resolvedcolor(s) :
+ cmykcolor c, b ; b := (0,0,0,0)
+ else :
+ color c, b ; b := (1,1,1)
+ fi ;
+ c := resolvedcolor(s) ;
+ p := unitsquare xyscaled (w,h) ;
+ fill p withcolor r[.5c,b] ;
+ if a = "square" :
+ vardef q = fullsquare enddef ;
+ elseif a = "triangle" :
+ vardef q = fulltriangle rotated (90 * round(uniformdeviate(4))) enddef ;
+ else :
+ vardef q = fullcircle enddef ;
+ fi ;
+ for i := 1 upto 60 :
+ fill q
+ scaled (d/5 randomized (d/5))
+ shifted (center p randomized (d))
+ withcolor r[c randomized(.3,.9),b] ;
+ endfor ;
+ clip currentpicture to p ;
+ popparameters ;
+ endgroup ;
+enddef ;
+
+% maybe:
+
+vardef lmt_connected(text t) =
+ save p ; path p ;
+ p := origin t ;
+ subpath (1,length(p)) of p
+enddef ;
+
+def lmt_connection expr t =
+ -- t
+enddef ;
+
+% also (todo)
+
+% % draw lmt_path [
+% % points = [ color = "darkred", size = 6 ],
+% % controls = [ color = "darkgreen", size = 4 ],
+% % lines = [ color = "darkgray", size = 1 ],
+% % shape = [ color = "middlegray", size = 8 ],
+% % labels = [ ],
+% % path = ((1cm,1cm) -- (1.5cm,1.5cm) .. (2cm,0cm) .. cycle)
+% % ] ;
+%
+% presetparameters "path" [
+% labels = [
+% color = "",
+% size = 1
+% ],
+% controls = [
+% color = "black",
+% size = 2.5
+% ],
+% lines = [
+% color = "middlegray",
+% size = 1
+% ],
+% points = [
+% color = "black",
+% size = 4
+% ],
+% path = [
+% color = "lightgray",
+% size = 5,
+% path = origin
+% ]
+% ] ;
+%
+% def lmt_path = applyparameters "path" "lmt_do_path" enddef ;
+%
+% vardef lmt_do_path =
+% image (
+% % This one is not that efficient ... we can better inline the drawing routines here, but
+% % it's just an interfacing test after all.
+% if hasparameter "path" "path" :
+% save p ; path p ; p := getparameter "path" "path" ;
+% drawpath p
+% withpen pencircle scaled (drawoptionsfactor * getparameterdefault "path" "shape" "size" "*")
+% withcolor getparameterdefault "path" "shape" "color" "*"
+% ;
+% if hasparameter "path" "controls" :
+% drawcontrollines p
+% withpen pencircle scaled (drawoptionsfactor * getparameterdefault "path" "lines" "size" "*" )
+% withcolor getparameterdefault "path" "lines" "color" "*"
+% ;
+% drawcontrolpoints p
+% withpen pencircle scaled (drawoptionsfactor * getparameterdefault "path" "controls" "size" "*")
+% withcolor getparameterdefault "path" "controls" "color" "*"
+% ;
+% fi ;
+% if hasparameter "path" "points" :
+% drawpoints p
+% withpen pencircle scaled (drawoptionsfactor * getparameterdefault "path" "points" "size" "*")
+% withcolor getparameterdefault "path" "points" "color" "*"
+% ;
+% if hasparameter "path" "labels" :
+% drawpointlabels p
+% withcolor getparameterdefault "path" "labels" "color" "*"
+% ;
+% fi ;
+% fi ;
+% fi ;
+% )
+% enddef ;
+
+% Here we use nodraw and dodraw to create efficient axis ticks. Yet another demo
+% of coding.
+
+presetparameters "function" [
+ sx = 1mm,
+ sy = 1mm,
+ offset = 0,
+ xmin = 1,
+ xmax = 1,
+ xstep = 1,
+ xsmall = 0,
+ xlarge = 0,
+ xlabels = "no",
+ xticks = "bottom", % top bottom middle
+ xcaption = "",
+ ymin = 1,
+ ymax = 1,
+ ystep = 1,
+ ysmall = 0,
+ ylarge = 0,
+ % xfirst = 0,
+ % xlast = 0,
+ % yfirst = 0,
+ % ylast = 0,
+ ylabels = "no",
+ yticks = "left", % left right middle
+ ycaption = "",
+ code = "",
+ close = false,
+ shape = "curve",
+ fillcolor = "",
+ drawsize = 1,
+ drawcolor = "",
+ frame = "", % yes ticks
+ linewidth = .05mm,
+ pointsymbol = "",
+ pointsize = 2,
+ pointcolor = "",
+ xarrow = "",
+ yarrow = "",
+ reverse = false,
+] ;
+
+def lmt_function = applyparameters "function" "lmt_do_function" enddef ;
+
+vardef lmt_do_function_p(expr xmin, xmax, xstep, code, shape, close, fcolor, dsize, dcolor, psymbol, psize, pcolor) =
+ save p, q ; path p, q ;
+ p := lua.mp.lmt_function_x(xmin,xmax,xstep,code,shape) ;
+ if close :
+ q := (xmin,0) -- p -- (xmax,0) -- cycle ;
+ fill q withcolor fcolor ;
+ else :
+ draw p withpen currentpen scaled dsize withcolor dcolor
+ ;
+ fi ;
+ if psize > 0 :
+ if psymbol = "dot" :
+ draw image (
+ for i = 0 upto length(p) :
+ draw point i of p ;
+ endfor ;
+ ) withpen currentpen scaled psize withcolor pcolor ;
+ fi ;
+ fi ;
+enddef ;
+
+vardef lmt_do_function =
+ image (
+ pushparameters "function" ;
+ save sx, sy, lw, tl, tr, ts, tt, currentpen ; transform tr, tt ; pen currentpen ;
+ sx := getparameter "sx" ;
+ sy := getparameter "sy" ;
+ lw := getparameter "linewidth" ;
+ tl := 1/20 ; % tick length
+ ts := 1/10 ; % text scale
+ tr := identity xyscaled(10/sx,10/sy) ;
+ tt := identity xyscaled(ts/sx,ts/sy) ;
+ pickup pencircle xyscaled(lw/sx,lw/sy) ;
+ draw image (
+ save xmin, xmax, xstep, xsmall, xlarge, ymin, ymax, ystep, ysmall, ylarge, p ;
+ save code, option, txl, txs, tyl, tys, swap ;
+ string code, option ;
+ path txl, txs, tyl, tys ; boolean swap ;
+ picture p ;
+
+ xmin := getparameter "xmin" ;
+ xmax := getparameter "xmax" ;
+ xstep := getparameter "xstep" ;
+ xsmall := getparameter "xsmall" ;
+ xlarge := getparameter "xlarge" ;
+ ymin := getparameter "ymin" ;
+ ymax := getparameter "ymax" ;
+ ystep := getparameter "ystep" ;
+ ysmall := getparameter "ysmall" ;
+ ylarge := getparameter "ylarge" ;
+ code := getparameter "code" ;
+ swap := getparameter "reverse" ;
+
+ p := image (
+
+ if (getparametercount "functions") > 0 :
+ for s = 1 upto getparametercount "functions" :
+ pushparameters "functions" s ;
+ lmt_do_function_p (
+ getparameterdefault "xmin",
+ getparameterdefault "xmax",
+ getparameterdefault "xstep",
+ getparameterdefault "code",
+ getparameterdefault "shape",
+ getparameterdefault "close",
+ getparameterdefault "fillcolor",
+ getparameterdefault "drawsize",
+ getparameterdefault "drawcolor",
+ getparameterdefault "pointsymbol",
+ getparameterdefault "pointsize",
+ getparameterdefault "pointcolor"
+ ) ;
+ popparameters ;
+ endfor ;
+ elseif code <> "" :
+ lmt_do_function_p (
+ getparameter "xmin",
+ getparameter "xmax",
+ getparameter "xstep",
+ getparameter "code",
+ getparameter "shape",
+ getparameter "close",
+ getparameter "fillcolor",
+ getparameter "drawsize",
+ getparameter "drawcolor",
+ getparameter "pointsymbol",
+ getparameter "pointsize",
+ getparameter "pointcolor"
+ ) ;
+ fi ;
+ ) ;
+
+ if not swap : draw p fi ;
+
+ option := getparameter "xticks" ;
+ if option = "top" :
+ txs := (0,0) -- (0,tl) ;
+ elseif option = "bottom" :
+ txs := (0,-tl) -- (0,0) ;
+ else :
+ txs := (0,-tl) -- (0,tl) ;
+ fi ;
+
+ option := getparameter "yticks" ;
+ if option = "left" :
+ tys := (-tl,0) -- (0,0) ;
+ elseif option = "right" :
+ tys := (0,0) -- (tl,0) ;
+ else :
+ tys := (-tl,0) -- (tl,0) ;
+ fi ;
+
+ txs := txs transformed tr ;
+ tys := tys transformed tr ;
+ txl := txs scaled 2 ;
+ tyl := tys scaled 2 ;
+
+ % this arrow head scaling is for Alan to sort out ...
+
+ xmin := getparameterdefault "xfirst" xmin ;
+ xmax := getparameterdefault "xlast" xmax ;
+ ymin := getparameterdefault "yfirst" ymin ;
+ ymax := getparameterdefault "ylast" ymax ;
+
+ if hasoption "frame" "ticks,sticks" :
+ if xsmall > 0 :
+ if hasoption "frame" "horizontal" :
+ for i = ymin step ((ymax-ymin)/ysmall) until ymax :
+ draw (xmin,i) -- (xmax,i) ;
+ endfor ;
+ dodraw (xmin,ymin) ; % flush snippets
+ fi ;
+ fi ;
+ if ysmall > 0 :
+ if hasoption "frame" "vertical" :
+ for i = xmin step ((xmax-xmin)/xsmall) until xmax :
+ draw (i,ymin) -- (i,ymax) ;
+ endfor ;
+ dodraw (xmin,ymin) ; % flush snippets
+ fi ;
+ fi ;
+ fi ;
+
+ option := getparameter "xarrow" ;
+ if option = "yes" :
+ save ahlength ; ahlength := tl ;
+ % save ahangle ; ahangle := 100/sy ;
+ drawarrow (xmin,0) -- (xmax,0) ;
+ else :
+ draw (xmin,0) -- (xmax,0) ;
+ fi ;
+
+ option := getparameter "yarrow" ;
+ if option = "yes" :
+ save ahlength ; ahlength := tl ;
+ % save ahangle ; ahangle := 100/sx ;
+ drawarrow (xmin,ymin) -- (xmin,ymax) ;
+ else :
+ draw (xmin,ymin) -- (xmin,ymax) ;
+ fi ;
+
+ if hasoption "frame" "yes" :
+ draw (xmin,ymin) -- (xmax,ymin) -- (xmax,ymax) -- (xmin,ymax) -- cycle ;
+ fi ;
+
+ if hasoption "frame" "ticks,sticks" :
+ if xsmall > 0 :
+ if hasoption "frame" "horizontal" :
+ for i = ymin step ((ymax-ymin)/ysmall) until ymax :
+ draw (xmin,i) -- (xmax,i) ;
+ endfor ;
+ fi ;
+ if hasoption "frame" "bottom" :
+ txs := ((0,0) -- (0,tl)) if hasoption "frame" "sticks" : rotated 180 fi ;
+ txs := txs transformed tr ;
+ for i = xmin step ((xmax-xmin)/xsmall) until xmax :
+ nodraw txs shifted (i,ymin) ;
+ endfor ;
+ fi ;
+ if hasoption "frame" "top" :
+ txs := (0,0) -- (0,-tl) if hasoption "frame" "sticks" : rotated 180 fi ;
+ txs := txs transformed tr ;
+ for i = xmin step ((xmax-xmin)/xsmall) until xmax :
+ nodraw txs shifted (i,ymax) ;
+ endfor ;
+ fi ;
+ dodraw (xmin,ymin) ; % flush snippets
+ fi ;
+ if ysmall > 0 :
+ if hasoption "frame" "vertical" :
+ for i = xmin step ((xmax-xmin)/xsmall) until xmax :
+ draw (i,ymin) -- (i,ymax) ;
+ endfor ;
+ fi ;
+ if hasoption "frame" "left" :
+ tys := (0,0) -- (tl,0) if hasoption "frame" "sticks" : rotated 180 fi ;
+ tys := tys transformed tr ;
+ for i = ymin step ((ymax-ymin)/ysmall) until ymax :
+ nodraw tys shifted (xmin,i) ;
+ endfor ;
+ fi ;
+ if hasoption "frame" "right" :
+ tys := (0,0) -- (-tl,0) if hasoption "frame" "sticks" : rotated 180 fi ;
+ tys := tys transformed tr ;
+ for i = ymin step ((ymax-ymin)/ysmall) until ymax :
+ nodraw tys shifted (xmax,i) ;
+ endfor ;
+ fi ;
+ dodraw (xmin,ymin) ; % flush snippets
+ fi ;
+ fi ;
+
+ if xsmall > 0 :
+ for i = xmin step xsmall until xmax :
+ nodraw txs shifted (i,0) ;
+ endfor ;
+ fi ;
+
+ if xlarge > 0 :
+ for i = xmin step xlarge until xmax :
+ nodraw txl shifted (i,0) ;
+ endfor ;
+ dodraw (xmin,0) ; % flush snippets
+ elseif xsmall > 0 :
+ dodraw (xmin,0) ; % flush snippets
+ fi ;
+
+ if ysmall > 0 :
+ for i = ymin step ysmall until ymax :
+ nodraw tys shifted (xmin,i) ;
+ endfor ;
+ fi ;
+
+ if ylarge > 0 :
+ for i = ymin step ylarge until ymax :
+ nodraw tyl shifted (xmin,i) ;
+ endfor ;
+ dodraw (xmin,ymin) ; % flush snippets
+ elseif ysmall > 0 :
+ dodraw (xmin,ymin) ; % flush snippets
+ fi ;
+
+ if swap : draw p fi ;
+
+ if xlarge > 0 :
+ option := getparameter "xlabels" ;
+ if option <> "no" :
+ for i = xmin step xlarge until xmax :
+ if ((i <> 0) and ((option <> "nolimits") or ((i > xmin) and (i < xmax)))) :
+ draw textext.bot(decimal i) transformed tt
+ shifted (i,1.25*(ypart point 0 of txl)) ;
+ fi ;
+ endfor ;
+ fi ;
+ fi ;
+
+ if ylarge > 0 :
+ option := getparameter "ylabels" ;
+ if option <> "no" :
+ for i = ymin step ylarge until ymax :
+ if ((i <> 0) and ((option <> "nolimits") or ((i > ymin) and (i < ymax)))) :
+ draw textext.lft(decimal i) transformed tt
+ shifted (xmin+1.25*(xpart point 0 of tyl),i) ;
+ fi ;
+ endfor ;
+ fi ;
+ fi ;
+
+ option := getparameter "xcaption" ;
+ if (option <> "") :
+ draw textext.bot(option) transformed tt
+ shifted (xmin,-tl)
+ shifted center bottomboundary currentpicture ;
+ fi ;
+
+ option := getparameter "ycaption" ;
+ if (option <> "") :
+ draw textext.lft(option) transformed tt
+ shifted (xmin-tl,0)
+ shifted center leftboundary currentpicture ;
+ fi ;
+ )
+
+ xyscaled(sx,sy) ;
+
+ setbounds currentpicture to
+ boundingbox currentpicture
+ enlarged (getparameter "offset") ;
+
+ popparameters ;
+ )
+enddef ;
+
+% Don't use this one!
+
+presetparameters "mesh" [
+ trace = false,
+ auto = false,
+ step = 0.05,
+ % box = ...
+ % paths = { ..., ..., ... }
+] ;
+
+def lmt_mesh = applyparameters "mesh" "lmt_do_mesh" enddef ;
+
+vardef lmt_do_mesh =
+ image (
+ save p, b ; path p, b ;
+ pushparameters "mesh" ;
+ if getparameter "auto" :
+ b := if hasparameter "box" : getparameter "box" else : OverlayBox fi ;
+ for i=1 upto getparametercount "paths" :
+ p := getparameter "paths" i ;
+ p := meshed(p if not cycle p : -- cycle fi,b,getparameter "step") ;
+ if getparameter "trace" :
+ draw p ;
+ fi ;
+ runscript("mp.lmt_mesh_update()") i p ;
+ endfor ;
+ elseif getparameter "trace" :
+ for i=1 upto getparametercount "paths" :
+ p := getparameter "paths" i ;
+ draw p if not cycle p : -- cycle fi ;
+ endfor ;
+ fi ;
+ popparameters ;
+ runscript("mp.lmt_mesh_set()") ;
+ )
+enddef ;
+
+vardef mfun_meshed_clipped(expr pat, box, pct) =
+ pp := point (arctime pct of pat) of pat ;
+ if (ypart pp <= lly) or (ypart pp >= ury) or (xpart pp <= llx) or (xpart pp >= urx) :
+ (cp -- pp) intersection_point bb
+ else :
+ pp
+ fi
+enddef ;
+
+vardef mfun_meshed_clipped(expr pat, box, pct) =
+ pp := point (arctime pct of pat) of pat ;
+ if ypart pp <= lly :
+ if xpart pp <= llx :
+ (llx, lly)
+ elseif xpart pp >= urx :
+ (urx, lly)
+ else :
+ (xpart pp, lly)
+ fi
+ elseif ypart pp >= ury :
+ if xpart pp <= llx :
+ (llx, ury)
+ elseif xpart pp >= urx :
+ (urx, ury)
+ else :
+ (xpart pp, ury)
+ fi
+ elseif xpart pp <= llx :
+ (llx, ypart pp)
+ elseif xpart pp >= urx :
+ (urx, ypart pp)
+ else :
+ pp
+ fi
+enddef ;
+
+vardef meshed(expr pth, box, stp) =
+ begingroup
+ save cb, cp, llx, lly, urx, ury, pp, lp, bb ; pair cb, cp, pp ; path bb ;
+ bb := box enlarged -1/10;
+ cb := center bb ;
+ cp := center pth ;
+ llx := xpart llcorner bb;
+ lly := ypart llcorner bb;
+ urx := xpart urcorner bb;
+ ury := ypart urcorner bb;
+ lp := arclength pth ;
+ for i=stp step stp until 1+stp/2 :
+ cp --
+ mfun_meshed_clipped(pth,bb,lp*(i-stp)) --
+ mfun_meshed_clipped(pth,bb,lp*(i )) --
+ cp --
+ endfor cycle
+ endgroup
+enddef ;
+
+vardef OverlayMesh(expr p, s) =
+ lmt_mesh [ paths = { meshed(p,OverlayBox,s) } ]
+enddef ;
+
+% charts
+
+presetparameters "chart" [
+ originsize = 1mm,
+ trace = false,
+ showlabels = true,
+ center = false,
+
+ samples = { },
+
+ cumulative = false,
+ percentage = false,
+ maximum = 0,
+ distance = 1mm,
+
+ % labels = { },
+ labelstyle = "",
+ labelformat = "",
+ % labelstrut = "auto",
+ % labelanchor = "",
+ % labeloffset = 0,
+ labelfraction = 0.8,
+ labelcolor = "",
+
+ backgroundcolor = "",
+ drawcolor = "white",
+ fillcolors = { % use color palet
+ "darkred", "darkgreen", "darkblue",
+ "darkyellow", "darkmagenta", "darkcyan",
+ "darkgray"
+ },
+ colormode = "global",
+
+ linewidth = .25mm,
+
+ legendcolor = "",
+ legendstyle = "",
+ legend = { },
+] ;
+
+presetparameters "chart:circle" "chart" [
+ height = 5cm,
+ width = 5mm,
+ labelanchor = "",
+ labeloffset = 0,
+ labelstrut = "no",
+] ;
+
+presetparameters "chart:histogram" "chart" [
+ height = 5cm,
+ width = 5mm,
+ labelanchor = "bot",
+ labeloffset = 1mm,
+ labelstrut = "auto",
+] ;
+
+presetparameters "chart:bar" "chart" [
+ height = 5mm,
+ width = 5cm,
+ labelanchor = "lft",
+ labeloffset = 1mm,
+ labelstrut = "no",
+] ;
+
+def lmt_chart_circle = applyparameters "chart:circle" "lmt_do_chart_circle" enddef ;
+def lmt_chart_histogram = applyparameters "chart:histogram" "lmt_do_chart_histogram" enddef ;
+def lmt_chart_bar = applyparameters "chart:bar" "lmt_do_chart_bar" enddef ;
+
+def lmt_do_chart_start (expr what) =
+ pushparameters what ;
+ save width, height, distance, linewidth, labelgap, labelfraction, value, nofsamples, nofsamplesets ;
+ save fillcolor, drawcolor, labelcolor, labelstyle, labelformat, labelstrut, labelanchor, colormode ;
+ string fillcolor, drawcolor, labelcolor, labelstyle, labelformat, labelstrut, labelanchor, colormode ;
+ height := getparameter "height" ;
+ width := getparameter "width" ;
+ distance := getparameter "distance" ;
+ linewidth := getparameter "linewidth" ;
+ drawcolor := getparameter "drawcolor" ;
+ colormode := getparameter "colormode" ;
+ labelcolor := getparameter "labelcolor" ;
+ labelgap := getparameter "labeloffset" ;
+ labelstyle := getparameter "labelstyle" ;
+ labelformat := getparameter "labelformat" ;
+ labelstrut := getparameter "labelstrut" ;
+ labelanchor := getparameter "labelanchor" ;
+ labelfraction := getparameter "labelfraction" ;
+ nofsamplesets := getparametercount "samples" ;
+ nofsamples := getmaxparametercount "samples" ;
+enddef ;
+
+def lmt_do_chart_stop =
+ if getparameter "center" :
+ currentpicture := currentpicture shifted - center currentpicture ;
+ fi
+ if (getparameter "backgroundcolor") <> "" :
+ addbackground withcolor getparameter "backgroundcolor" ;
+ fi
+ if getparameter "trace" :
+ save b ; path b ; b := boundingbox currentpicture ;
+ draw image (
+ draw fullcircle scaled 1mm ;
+ draw b
+ )
+ dashed evenly scaled 1/4
+ withpen pencircle scaled .125mm
+ withcolor "darkgray" ;
+ fi
+ popparameters ;
+enddef ;
+
+vardef lmt_do_chart_text(expr s, i, value) =
+ lmt_text [
+ style = labelstyle,
+ format = labelformat,
+ strut = labelstrut,
+ anchor = labelanchor,
+ offset = labelgap,
+ color = labelcolor,
+ text = (getparameterdefault "labels" s i (decimal value))
+ background = "",
+ ]
+enddef ;
+
+def lmt_do_chart_legend =
+ n := getparametercount "legend" ;
+ if n > 0 :
+ save dx, dy, p, l, w, o, d, ddy ; picture l ;
+ dx := xpart urcorner currentpicture + EmWidth ;
+ dy := ypart urcorner currentpicture ;
+ labelcolor := getparameter "legendcolor" ;
+ labelstyle := getparameter "legendstyle" ;
+ w := 2EmWidth ;
+ o := .25EmWidth ;
+ d := ExHeight ;
+ ddy := .8LineHeight ;
+ for i=1 upto n :
+ dy := dy - ddy ;
+ l := lmt_text [
+ text = getparameter "legend" i,
+ anchor = "rt"
+ style = labelstyle,
+ color = labelcolor,
+ background = "",
+ ] ;
+ fill leftboundary l rightenlarged w
+ shifted (dx,dy+d)
+ withcolor getparameter "fillcolors" i ;
+ draw l
+ shifted (dx+w+o,dy+d) ;
+ endfor ;
+ fi ;
+enddef ;
+
+vardef lmt_do_chart_circle =
+ image (
+ lmt_do_chart_start("chart:circle") ;
+ if (nofsamplesets > 0) and (nofsamples > 0) :
+ nofsamplesets := 1 ;
+ save p, r, s, first, last, total, factor, n, percentage ;
+ path p, r, s[] ; boolean percentage ;
+ percentage := getparameter "percentage" ;
+ total := 0 ;
+ for i = 1 upto nofsamples :
+ total := total + getparameter "samples" (1) i ; % () is needed else 1i
+ endfor ;
+ factor := 100/total ;
+ first := 0 ;
+ p := fullcircle ysized (height) ;
+ r := origin -- (2*height,0) ;
+ for i = 1 upto nofsamples :
+ fillcolor := getparameter "fillcolors" i ;
+ value := (getparameter "samples" (1) i) * factor ;
+ last := first + (360 / 100) * value ;
+ s[i] := ((p cutbefore (r rotated first)) cutafter (r rotated last)) ;
+ fill origin -- s[i] -- cycle withcolor fillcolor ;
+ first := last ;
+ endfor ;
+ if linewidth > 0 :
+ if drawcolor = "" :
+ drawcolor := backgroundcolor ;
+ fi ;
+ for i = 1 upto nofsamples :
+ interim linecap := butt ;
+ draw origin -- (point 0 of s[i]) withpen pencircle scaled linewidth withcolor drawcolor ;
+ draw origin -- (point length(s[i]) of s[i]) withpen pencircle scaled linewidth withcolor drawcolor ;
+ endfor ;
+ fi ;
+ if getparameter "showlabels" :
+ first := 0 ;
+ for i = 1 upto nofsamples :
+ value := getparameter "samples" (1) i ;
+ last := first + (360/100) * value * factor ;
+ draw lmt_do_chart_text (s,i,value)
+ shifted ((labelfraction*(height/2),0) rotated ((first+last)/2)) ;
+ first := last ;
+ endfor ;
+ fi ;
+ lmt_do_chart_legend ;
+ n := getparameter "originsize" ;
+ if n > 0 :
+ fill fullcircle scaled n withcolor "white" ;
+ fi ;
+ fi ;
+ lmt_do_chart_stop ;
+ )
+enddef ;
+
+vardef lmt_do_chart_histogram =
+ image (
+ lmt_do_chart_start("chart:histogram") ;
+ if (nofsamplesets > 0) and (nofsamples > 0) :
+ save value, maximum, cumulative, maxwidth ; boolean cumulative ;
+ maximum := getparameter "maximum" ;
+ cumulative := getparameter "cumulative" ;
+ if labelanchor = "center" :
+ labelanchor := "vcenter" ;
+ fi ;
+ if maximum = 0 :
+ for s = 1 upto nofsamplesets :
+ for i = 1 upto nofsamples :
+ value := getparameter "samples" s i ;
+ maximum := if cumulative :
+ maximum + value ;
+ else :
+ max(maximum,value) ;
+ fi ;
+ endfor ;
+ endfor ;
+ fi ;
+ if nofsamplesets = 1 :
+ distance := 0 ;
+ fi ;
+ maxwidth := nofsamplesets * nofsamples * width + (nofsamples - 1)* distance ;
+ value := 0 ;
+ for s = 1 upto nofsamplesets :
+ for i = 1 upto nofsamples :
+ value := if cumulative : value + fi (getparameter "samples" s i) * height / maximum ;
+ fill unitsquare xyscaled (width,value)
+ if linewidth > 0 :
+ if i > 1 : leftenlarged (-linewidth/2) fi
+ if i < nofsamples : rightenlarged (-linewidth/2) fi
+ fi
+ shifted (nofsamplesets*(i-1)*width+(s-1)*width+(i-1)*distance,0)
+ withcolor getparameter "fillcolors" if colormode = "local" : s else : i fi ;
+ endfor ;
+ endfor ;
+ setbounds currentpicture to unitsquare xyscaled (maxwidth,height) ;
+ for s = 1 upto nofsamplesets :
+ if getparameter "showlabels" :
+ for i = 1 upto nofsamples :
+ draw lmt_do_chart_text (s,i,getparameter "samples" s i)
+ shifted (nofsamplesets*((i-1)*width)+width/2+(s-1)*width+(i-1)*distance,0) ;
+ endfor ;
+ fi ;
+ endfor ;
+ lmt_do_chart_legend ;
+ fi ;
+ lmt_do_chart_stop ;
+ )
+enddef ;
+
+vardef lmt_do_chart_bar =
+
+ image (
+ lmt_do_chart_start("chart:bar") ;
+ if (nofsamplesets > 0) and (nofsamples > 0) :
+ save value, maximum, cumulative, maxheight ; boolean cumulative ;
+ maximum := getparameter "maximum" ;
+ cumulative := getparameter "cumulative" ;
+ if labelanchor = "center" :
+ labelanchor := "hcenter" ;
+ fi ;
+ if maximum = 0 :
+ for s = 1 upto nofsamplesets :
+ for i = 1 upto nofsamples :
+ value := getparameter "samples" s i ;
+ maximum := if cumulative : maximum + value else : max(maximum,value) fi ;
+ endfor ;
+ endfor ;
+ fi ;
+ if nofsamplesets = 1 :
+ distance := 0 ;
+ fi ;
+ maxheight := nofsamplesets * nofsamples * height + (nofsamples - 1)* distance ;
+ for s = 1 upto nofsamplesets :
+ value := 0 ;
+ for i = 1 upto nofsamples :
+ value := if cumulative : value + fi (getparameter "samples" s i) * width / maximum ;
+ fill unitsquare xyscaled (value,height)
+ if linewidth > 0 :
+ if i > 1 : topenlarged (-linewidth/2) fi
+ if i < nofsamples : bottomenlarged (-linewidth/2) fi
+ fi
+ shifted (0,maxheight-nofsamplesets*i*height+(s-1)*height-(i-1)*distance)
+ withcolor getparameter "fillcolors" if colormode = "local" : s else : i fi ;
+ endfor ;
+ endfor ;
+ setbounds currentpicture to unitsquare xyscaled (width,maxheight) ;
+ if getparameter "showlabels" :
+ for s = 1 upto nofsamplesets :
+ for i = 1 upto nofsamples :
+ draw lmt_do_chart_text (s,i,getparameter "samples" s i)
+ shifted (0,maxheight-nofsamplesets*(i*height)+height/2+(s-1)*height-(i-1)*distance) ;
+ endfor ;
+ endfor ;
+ fi ;
+ lmt_do_chart_legend ;
+ fi ;
+ lmt_do_chart_stop ;
+ )
+enddef ;
+
+%D This one is more complex than needed but I want to trace so I need all those
+%D variables.
+
+presetparameters "shade" [
+ alternative = "circular",
+ path = origin -- cycle,
+ trace = false
+
+ % alternative = "circular" | "linear"
+ % domain = { a, b }
+ % radius = a | { a, b }
+ % factor = a
+ % origin = (a,b) | { (a,b), {c, d) }
+ % vector = { a, b }
+ % colors = { a, b }
+ % center = a | { a, b }
+ % direction = "up" | "down" | "left" | "right" | { a, b }
+
+] ;
+
+% TODO: pass colors as strings
+
+def lmt_shade = applyparameters "shade" "lmt_do_shade" enddef ;
+
+vardef lmt_do_shade =
+ image (
+ pushparameters "shade" ;
+
+ save domain_min, domain_max, radius_a, radius_b, factor ;
+ save color_a, color_b, center_a, center_b, alternative, s ;
+ string color_a, color_b, alternative, s ; pair center_a, center_b ;
+
+ alternative := getparameter "alternative" ;
+
+ mfun_with_shade_method_analyze(getparameter "path") ;
+
+ domain_min := 0 ;
+ domain_max := 1 ;
+
+ color_a := "white" ;
+ color_b := "black" ;
+
+ if alternative = "circular" :
+ center_a := center mfun_shade_path ;
+ center_b := center_a ;
+ radius_a := 0 ;
+ radius_b := mfun_max_radius(mfun_shade_path) ;
+ factor := 1.2 ;
+ else :
+ center_a := llcorner mfun_shade_path ;
+ center_b := urcorner mfun_shade_path ;
+ radius_a := 0 ;
+ radius_b := 0 ;
+ factor := 0;
+ fi ;
+
+ if hasparameter "domain" :
+ domain_min := getparameter "domain" 1 ;
+ domain_max := getparameter "domain" 2 ;
+ fi
+ if hasparameter "radius" :
+ if numeric getparameter "radius" :
+ radius_a := 0 ;
+ radius_b := getparameter "radius" ;
+ else :
+ radius_a := getparameter "radius" 1 ;
+ radius_b := getparameter "radius" 2 ;
+ fi ;
+ factor := 1 ;
+ fi
+ if hasparameter "factor" :
+ factor := getparameter "factor" ;
+ fi
+ if hasparameter "origin" :
+ if pair getparameter "origin" :
+ center_a := getparameter "origin" ;
+ center_b := center_b ;
+ else :
+ center_a := getparameter "origin" 1 ;
+ center_b := getparameter "origin" 2 ;
+ fi ;
+ fi
+ if hasparameter "colors" :
+ color_a := getparameter "colors" 1 ;
+ color_b := getparameter "colors" 2 ;
+ fi
+ if hasparameter "direction" :
+ save a, b, bb ; path bb ;
+ bb := boundingbox(mfun_shade_path) ;
+ a := b := -1 ;
+ if string getparameter "direction" :
+ s := getparameter "direction" ;
+ if s = "up" :
+ p_a := xpart shadedup ;
+ p_b := ypart shadedup ;
+ elseif s = "down" :
+ p_a := xpart shadeddown ;
+ p_b := ypart shadeddown ;
+ elseif s = "left" :
+ p_a := xpart shadedleft ;
+ p_b := ypart shadedleft ;
+ elseif s = "right" :
+ p_a := xpart shadedright ;
+ p_b := ypart shadedright ;
+ fi
+ else :
+ p_a := getparameter "direction" 1 ;
+ p_a := getparameter "direction" 2 ;
+ fi
+ if p_a >= 0 :
+ center_a := point p_a of bb ;
+ fi
+ if p_b >= 0 :
+ center_b := point p_b of bb ;
+ fi
+ fi ;
+ if hasparameter "center" :
+ save cx, cy ;
+ if numeric getparameter "center" :
+ cx := getparameter "center" ;
+ cx := cy ;
+ % elseif pair getparameter "center" :
+ % cx := xpart getparameter "center" ;
+ % cy := ypart getparameter "center" ;
+ else :
+ cx := getparameter "center" 1 ;
+ cy := getparameter "center" 2 ;
+ fi
+ center_a := center mfun_shade_path shifted (
+ cx * bbwidth (mfun_shade_path)/2,
+ cy * bbheight(mfun_shade_path)/2
+ ) ;
+ elseif hasparameter "vector" :
+ center_a := point (getparameter "vector" 1) of mfun_shade_path ;
+ center_b := point (getparameter "vector" 2) of mfun_shade_path ;
+ fi
+ fill mfun_shade_path
+ withprescript "sh_domain=" & decimal domain_min & " " & decimal domain_max
+ withprescript "sh_transform=yes"
+ withprescript "sh_color=into"
+ withprescript "sh_color_a=" & colordecimals color_a
+ withprescript "sh_color_b=" & colordecimals color_b
+ withprescript "sh_first=" & ddecimal point 0 of mfun_shade_path % used for support scaling
+ withprescript "sh_set_x=" & ddecimal (mfun_shade_nx,mfun_shade_lx) %
+ withprescript "sh_set_y=" & ddecimal (mfun_shade_ny,mfun_shade_ly) %
+ if alternative = "linear" :
+ withprescript "sh_type=linear"
+ % withprescript "sh_factor=1"
+ withprescript "sh_factor=" & decimal factor
+ withprescript "sh_center_a=" & ddecimal center_a
+ withprescript "sh_center_b=" & ddecimal center_b
+ else :
+ withprescript "sh_type=circular"
+ % withprescript "sh_factor=1.2"
+ withprescript "sh_factor=" & decimal factor
+ withprescript "sh_center_a=" & ddecimal center_a
+ withprescript "sh_center_b=" & ddecimal center_b
+ withprescript "sh_radius_a=" & decimal radius_a
+ withprescript "sh_radius_b=" & decimal radius_b
+ fi ;
+ if getparameter "trace" :
+ draw fullcircle scaled 1mm shifted center_a ;
+ draw fullsquare scaled 2mm shifted center_b ;
+ draw textext.top("\strut\ttx center a") ysized LineHeight shifted center_a shifted (0, 2mm) ;
+ draw textext.bot("\strut\ttx center b") ysized LineHeight shifted center_b shifted (0,-2mm) ;
+ if alternative = "circular" :
+% draw fullcircle scaled ( radius_a * 2) shifted center_a dashed evenly ;
+% draw fullcircle scaled (factor * radius_b * 2) shifted -center_b dashed evenly ;
+ draw fullcircle scaled ( radius_a) shifted center_a dashed evenly ;
+ draw fullcircle scaled (factor * radius_b) shifted -center_b dashed evenly ;
+ fi
+ fi
+ popparameters ;
+ )
+enddef ;
+
+% This is very experimental and will first be tested by a few users who
+% are interested in this.
+
+presetparameters "contour" [
+ xmin = 0,
+ xmax = 0,
+ ymin = 0,
+ ymax = 0,
+ xstep = 0,
+ ystep = 0,
+ levels = 10,
+ % colors = { }, % used when set
+ preamble = "",
+ function = "x + y",
+ color = "lin(l)", % l/n
+ background = "bitmap", % bitmap | shape | band
+ foreground = "auto", % cell| edge | shape | auto: bitmap/edge shape/shape
+ linewidth = .25,
+ backgroundcolor = "black",
+ linecolor = "gray",
+ xformat = "@0.2N",
+ yformat = "@0.2N",
+ zformat = "@0.2N",
+ xstyle = "",
+ ystyle = "",
+ zstyle = "",
+
+ width = 0, % auto when 0
+ height = 0, % auto when 0
+
+ trace = false,
+ checkresult = false,
+ defaultnan = 0,
+ defaultinf = 0,
+
+ legend = "all", % x | y | z | function | range | all (but range)
+ legendheight = LineHeight,
+ legendwidth = LineHeight,
+ legendgap = 0,
+ legenddistance = EmWidth,
+ textdistance = 2EmWidth/3,
+ functiondistance = ExHeight,
+ functionstyle = "",
+
+ level = 4096, % for selecting one (can't be too large for scaled)
+
+ axisdistance = ExHeight,
+ axislinewidth = .25,
+ axisoffset = ExHeight/4,
+ axiscolor = "black",
+ ticklength = ExHeight,
+
+ xtick = 5,
+ ytick = 5,
+ xlabel = 5,
+ ylabel = 5,
+
+] ;
+
+% we can as well push ...
+
+def lmt_contour = applyparameters "contour" "lmt_do_contour" enddef ;
+
+def mfun_only_draw = addto currentpicture doublepath enddef ;
+def mfun_only_fill = addto currentpicture contour enddef ;
+def mfun_only_fillup text t = addto currentpicture doublepath t withpostscript "both" enddef ;
+def mfun_only_nodraw text t = addto currentpicture doublepath t withpostscript "collect" enddef ;
+def mfun_only_nofill text t = addto currentpicture contour t withpostscript "evenodd" enddef ;
+def mfun_only_eofill text t = addto currentpicture contour t withpostscript "collect" enddef ;
+
+def lmt_do_contour_shortcuts =
+ save D ; let D = mfun_only_draw ;
+ save E ; let E = mfun_only_eofill ;
+ save F ; let F = mfun_only_fill ;
+ save U ; let U = mfun_only_fillup ;
+ save d ; let d = mfun_only_nodraw ;
+ save e ; let f = mfun_only_eofill ;
+ save f ; let f = mfun_only_nofill ;
+ save C ; let C = cycle ;
+ save B ; let B = controls ;
+ save A ; let A = and ;
+enddef ;
+
+def lmt_do_contour_band =
+ lua.mp.lmt_contours_edge_set_by_band() ;
+ for v=1 upto lua.mp.lmt_contours_nofvalues() :
+ draw image (
+ lua.mp.lmt_contours_edge_get_band(v) ;
+ )
+ withcolor lua.mp.lmt_contours_color(v) ;
+ endfor ;
+enddef;
+
+def lmt_do_contour_cell(expr dx,dy) =
+ lua.mp.lmt_contours_edge_set_by_cell() ;
+ draw image (
+ if level = 4096 :
+ for v=1+1 upto lua.mp.lmt_contours_nofvalues() :
+ lua.mp.lmt_contours_edge_get_cell(v) ;
+ endfor ;
+ else :
+ lua.mp.lmt_contours_edge_get_cell(level) ;
+ fi
+ )
+ if (dx <>0) or (dy <> 0) : shifted (dx,dy) fi
+ withcolor getparameter "linecolor"
+ withpen pencircle scaled getparameter "linewidth" ;
+enddef ;
+
+def lmt_do_contour_edge(expr dx, dy) =
+ lua.mp.lmt_contours_edge_set() ;
+ draw image (
+ if level = 4096 :
+ for v=1+1 upto lua.mp.lmt_contours_nofvalues() :
+ lua.mp.lmt_contours_edge_paths(v);
+ endfor ;
+ else :
+ lua.mp.lmt_contours_edge_paths(level);
+ fi
+ )
+ if (dx <>0) or (dy <> 0) : shifted (dx,dy) fi
+ withcolor getparameter "linecolor"
+ withpen pencircle scaled getparameter "linewidth" ;
+enddef ;
+
+def lmt_do_contour_edges(expr dx, dy) =
+ lua.mp.lmt_contours_edge_set() ;
+ if level = 4096 :
+ for v=1+1 upto lua.mp.lmt_contours_nofvalues() :
+ draw image (
+ lua.mp.lmt_contours_edge_paths(v);
+ )
+ if (dx <>0) or (dy <> 0) : shifted (dx,dy) fi
+ withpen pencircle scaled getparameter "linewidth"
+ withcolor lua.mp.lmt_contours_color(v) ;
+ endfor ;
+ else :
+ draw image (
+ lua.mp.lmt_contours_edge_paths(level);
+ )
+ if (dx <>0) or (dy <> 0) : shifted (dx,dy) fi
+ withpen pencircle scaled getparameter "linewidth"
+ withcolor lua.mp.lmt_contours_color(level) ;
+ fi ;
+enddef ;
+
+def lmt_do_contour_cells(expr dx, dy) =
+ lua.mp.lmt_contours_edge_set_by_cell() ;
+ if level = 4096 :
+ for v=1+1 upto lua.mp.lmt_contours_nofvalues() :
+ draw image (
+ lua.mp.lmt_contours_edge_get_cell(v) ;
+ )
+ if (dx <>0) or (dy <> 0) : shifted (dx,dy) fi
+ withpen pencircle scaled getparameter "linewidth"
+ withcolor lua.mp.lmt_contours_color(v) ;
+ endfor ;
+ else :
+ draw image (
+ lua.mp.lmt_contours_edge_get_cell(level) ;
+ )
+ if offset : shifted (-1/2,-1/2) fi
+ withpen pencircle scaled getparameter "linewidth"
+ withcolor lua.mp.lmt_contours_color(v) ;
+ fi ;
+enddef ;
+
+def lmt_do_contour_shape(expr dx, dy) =
+ draw image (
+ if level = 4096 :
+ for v=1+1 upto lua.mp.lmt_contours_nofvalues() :
+ lua.mp.lmt_contours_shape_paths(v);
+ endfor ;
+ else :
+ lua.mp.lmt_contours_shape_paths(level);
+ lua.mp.lmt_contours_shape_paths(1);
+ fi
+ )
+ if (dx <>0) or (dy <> 0) : shifted (dx,dy) fi
+ withcolor getparameter "linecolor"
+ withpen pencircle scaled getparameter "linewidth" ;
+enddef ;
+
+def lmt_do_contour_bitmap =
+ lua.mp.lmt_contours_bitmap_set() ;
+ lua.mp.lmt_contours_bitmap_get() ;
+enddef ;
+
+def lmt_do_contour_shades(expr outlines) =
+ lua.mp.lmt_contours_shade_set(outlines) ;
+ if level = 4096 :
+ for v=1 upto lua.mp.lmt_contours_nofvalues() : % no + 1 here
+ draw image (
+ lua.mp.lmt_contours_shade_paths(v) ;
+ )
+ withpen pencircle scaled 0
+ withcolor lua.mp.lmt_contours_color(v) ;
+ endfor ;
+ else :
+ draw image (
+ lua.mp.lmt_contours_shade_paths(level);
+ )
+ withpen pencircle scaled 0
+ withcolor lua.mp.lmt_contours_color(level) ;
+ fi ;
+enddef ;
+
+def lmt_load_mlib_cnt =
+ runscript("lua.registercode('mlib-cnt')");
+ extra_beginfig := extra_beginfig & % todo: use different hook
+ "runscript(" & ditto & "mp.lmt_contours_cleanup()" & ditto & ")" ;
+ let lmt_load_mlib_cnt = relax ;
+enddef ;
+
+vardef lmt_do_contour =
+ image (
+
+ lmt_load_mlib_cnt ;
+
+ pushparameters "contour" ;
+
+ lua.mp.lmt_contours_start() ;
+
+ % graphic
+
+ save bg, fg, nx, ny, trace, level, b, done ; string bg, fg ; boolean trace, done ; path b ;
+
+ bg := getparameter "background" ;
+ fg := getparameter "foreground" ;
+ nx := lua.mp.lmt_contours_nx() ;
+ ny := lua.mp.lmt_contours_ny() ;
+ trace := getparameter "trace" ;
+ level := getparameter "level" ;
+ done := true ;
+
+ begingroup ;
+
+ lmt_do_contour_shortcuts ;
+
+ if bg = "band" :
+ lmt_do_contour_band ;
+ b := boundingbox currentpicture ;
+ if (fg = "auto") or (fg = "cell") :
+ lmt_do_contour_cell(0,0) ;
+ elseif (fg = "edge") :
+ lmt_do_contour_edge(0,0) ; % true ?
+ fi ;
+
+ elseif bg = "bitmap" :
+
+ lmt_do_contour_bitmap ;
+ b := boundingbox currentpicture ;
+ if (fg = "auto") or (fg = "cell") :
+ lmt_do_contour_cell(-1/2,-1/2) ;
+ elseif (fg = "edge") :
+ lmt_do_contour_edge(-1/2,-1/2) ;
+ fi ;
+
+ elseif bg = "shape" :
+
+ lmt_do_contour_shades((fg = "auto") or (fg = "shape")) ;
+ b := boundingbox currentpicture ;
+ if (fg == "auto") or (fg = "shape") :
+ lmt_do_contour_shape(0,0) ;
+ elseif fg == "cell" :
+ lmt_do_contour_cell(-1,-1) ;
+ elseif fg == "edge" :
+ lmt_do_contour_edge(-1,-1) ;
+ fi ;
+
+ % currentpicture := currentpicture reflectedabout ( (0, ny/2), (nx,ny/2) ) ;
+
+ elseif fg = "cell" :
+
+ lmt_do_contour_shortcuts ;
+ lmt_do_contour_cells(0,0) ;
+ b := boundingbox currentpicture ;
+
+ elseif fg = "edge" :
+
+ lmt_do_contour_shortcuts ;
+ lmt_do_contour_edges(0,0) ;
+ b := boundingbox currentpicture ;
+
+ else :
+
+ done := false ;
+
+ fi ;
+
+ endgroup ;
+
+ if done :
+
+ save w, h, cx, cy ;
+
+ cx := - bbwidth (b)/(nx - 1) ;
+ cy := - bbheight(b)/(ny - 1) ;
+ clip currentpicture to b
+ leftenlarged cx rightenlarged cx
+ topenlarged cy bottomenlarged cy ;
+ currentpicture := currentpicture
+ shifted (cx,cy) ;
+
+ w := getparameter "width" ;
+ h := getparameter "height" ;
+
+ % axis
+
+ save xtic, ytic, auto ; boolean auto ;
+
+ xtic := getparameter "xtick" ;
+ ytic := getparameter "ytick" ;
+ auto := (w = 0) and (h = 0) ;
+
+ % resize
+
+ if w <> 0 :
+ if h <> 0 :
+ currentpicture := currentpicture xysized (w,h) ;
+ else :
+ currentpicture := currentpicture xsized w ;
+ fi ;
+ elseif h <> 0 :
+ currentpicture := currentpicture ysized h ;
+ fi ;
+ if w = 0 :
+ w := bbwidth(currentpicture) ;
+ fi ;
+ if h = 0 :
+ h := bbheight(currentpicture) ;
+ fi ;
+
+ % legend
+
+ if hasoption "legend" "all,x,y,z,range" :
+
+ save u, s, sx, sy, ax, ay, ao, al, at, tl, ox, oy, lg, tx, ty, wx, hx, ry, fmt, pmin, pmax ; string fmt; picture pmin, pmax ;
+
+ % move some in the ifs
+
+ if hasoption "legend" "all,z" :
+
+ % colorbar
+
+ fmt := lua.mp.lmt_contours_format() ;
+ pmin := lmt_text [ format = fmt, text = decimal lua.mp.lmt_contours_minmean() ] ;
+ pmax := lmt_text [ format = fmt, text = decimal lua.mp.lmt_contours_maxmean() ] ;
+ wx := max(bbwidth(pmin),bbwidth(pmax)) ;
+ hx := bbheight(pmin) ;
+
+ else :
+
+ hx := 0;
+
+ fi ;
+
+ if auto :
+ % u := 1 ;
+ u := lua.mp.lmt_contours_ny() / 100 ;
+ ry := 4u ;
+ sy := 5u ;
+ sx := 5u ;
+ lg := 0 ;
+ ox := 5u ;
+ oy := - sy/2 + ry/2 ;
+ tx := 2u ;
+ ty := 1u ;
+ ax := 1u ;
+ ay := 1u ;
+ ao := u ;
+ al := u/8 ;
+ at := 3u/2 ;
+ al := u/4 ;
+ else :
+ ry := 0 ;
+ sy := getparameter "legendheight" ;
+ sx := getparameter "legendwidth" ;
+ lg := getparameter "legendgap" ;
+ ox := getparameter "legenddistance" ;
+ oy := - sy/2 + hx/2 ;
+ tx := getparameter "textdistance" ;
+ ty := getparameter "functiondistance" ;
+ ax := getparameter "axisdistance" ;
+ ay := ax ;
+ ao := getparameter "axisoffset" ;
+ at := getparameter "ticklength" ;
+ al := getparameter "axislinewidth" ;
+ fi ;
+
+ if hasoption "legend" "all,z" :
+
+ save dy ; dy := h ;
+
+ for v=1 upto lua.mp.lmt_contours_nofvalues() :
+ dy := dy - sy ;
+ fill unitsquare xyscaled (sx,sy)
+ shifted (w+ox,dy)
+ withcolor lua.mp.lmt_contours_color(v) ;
+ draw
+ lmt_text [
+ trace = trace,
+ anchor = "llft",
+ format = fmt,
+ text = decimal lua.mp.lmt_contours_value(v),
+ style = getparameter "zstyle",
+ position = (wx,0),
+ background = "",
+ ]
+ if ry <> 0 : ysized (ry) fi
+ shifted (w+ox+tx+sx,dy+sy+oy)
+ ;
+ dy := dy - lg ;
+ endfor ;
+
+ fi ;
+
+ if hasoption "legend" "x,all" :
+
+ save n, d, s, xmin, xmax, xlab ;
+
+ xmin := getparameter "xmin" ;
+ xmax := getparameter "xmax" ;
+ xlab := getparameter "xlabel" ;
+
+ draw image (
+ interim linecap := butt ;
+ draw ((0,0) -- (w,0)) ;
+ n := al/2 ; s := (w - al) / xtic ; d := (xmax - xmin) / xtic ;
+ for i=xmin step d until xmax :
+ draw (n,0) -- (n,-at) ;
+ n := n + s ;
+ endfor ;
+ ) shifted (0,-ay)
+ withpen pencircle scaled al
+ withcolor getparameter "axiscolor"
+ ;
+
+ if hasoption "legend" "label,all" :
+
+ draw image (
+ n := al/2 ; s := (w - al) / xlab ; d := (xmax - xmin) / xlab ;
+ for i=xmin step d until xmax :
+ draw lmt_text [
+ trace = trace,
+ anchor = "bot",
+ format = getparameter "xformat",
+ style = getparameter "xstyle",
+ text = decimal i
+ background = "",
+ ]
+ if ry <> 0 : ysized (ry) fi
+ shifted (n,-at-ao)
+ ;
+ n := n + s ;
+ endfor ;
+ ) shifted (0,-ay) ;
+
+ fi ;
+
+ fi ;
+
+ if hasoption "legend" "y,all" :
+
+ save n, d, s, ymin, ymax, ylab ;
+
+ ymin := getparameter "ymin" ;
+ ymax := getparameter "ymax" ;
+ ylab := getparameter "ylabel" ;
+
+ draw image (
+ interim linecap := butt ;
+ draw ((0,0) -- (0,h)) ;
+ n := al/2 ; s := (h - al) / ytic ; d := (ymax - ymin) / ytic ;
+ for i=ymin step d until ymax :
+ draw (0,n) -- (-at,n) ;
+ n := n + s ;
+ endfor ;
+ ) shifted (-ax,0)
+ withpen pencircle scaled al
+ withcolor getparameter "axiscolor" ;
+ ;
+
+ if hasoption "legend" "label,all" :
+
+ draw image (
+ n := al/2 ; s := (h - al) / ylab ; d := (ymax - ymin) / ylab ;
+ for i=ymin step d until ymax :
+ draw lmt_text [
+ trace = trace,
+ anchor = "lft",
+ format = getparameter "yformat",
+ style = getparameter "ystyle",
+ text = decimal i
+ background = "",
+ ]
+ if ry <> 0 : ysized (ry) fi
+ shifted (-at-ao,n)
+ ;
+ n := n + s ;
+ endfor ;
+ ) shifted (-ax,0) ;
+
+ fi ;
+
+ fi ;
+
+ if hasoption "legend" "range,all" :
+
+ % range
+
+ save d ; d := ypart llcorner currentpicture ;
+
+ draw
+ lmt_text [
+ trace = trace,
+ anchor = "bot",
+ text = lua.mp.lmt_contours_range()
+ background = "",
+ ]
+ if ry <> 0 : ysized (ry) fi
+ shifted (w/2,d-ty)
+ ;
+
+ % minmax
+
+ draw
+ lmt_text [
+ trace = trace,
+ anchor = "lrt",
+ text = lua.mp.lmt_contours_xrange()
+ background = "",
+ ]
+ if ry <> 0 : ysized (ry) fi
+ shifted (0,d-ty)
+ ;
+
+ draw
+ lmt_text [
+ trace = trace,
+ anchor = "llft",
+ text = lua.mp.lmt_contours_yrange()
+ background = "",
+ ]
+ if ry <> 0 : ysized (ry) fi
+ shifted (w,d-ty)
+ ;
+
+ fi ;
+
+ if hasoption "legend" "function,all" :
+
+ % formula
+
+ draw
+ lmt_text [
+ trace = trace,
+ anchor = "bot",
+ style = getparameter "functionstyle",
+ text = lua.mp.lmt_contours_function()
+ background = "",
+ ]
+ if ry <> 0 : ysized (ry) fi
+ shifted (w/2,ypart llcorner currentpicture - ty)
+ ;
+
+ fi ;
+
+ if trace :
+ draw boundingbox currentpicture
+ dashed evenly
+ withpen pencircle scaled al ;
+ fi ;
+
+ fi ;
+
+ fi ;
+
+ lua.mp.lmt_contours_stop() ;
+
+ popparameters ;
+ )
+enddef ;
+
+newinternal svgforcecmyk ; svgforcecmyk := 0 ;
+
+vardef svgcolor(expr r,g,b) =
+ if svgforcecmyk > 0 :
+ (1-r,1-g,1-b,0) % simple: no black component, kind of ok for emoji
+ else :
+ (r,g,b)
+ fi
+enddef ;
+
+vardef svggray(expr s) =
+ s
+enddef ;
+
+presetparameters "svg" [
+ filename = "",
+ fontname = "",
+ % unicode = 0,
+ width = 0,
+ height = 0,
+ origin = false,
+ offset = 0,
+] ;
+
+def lmt_svg = applyparameters "svg" "lmt_do_svg" enddef ;
+
+vardef lmt_do_svg =
+ save w, h, o;
+ image (
+ pushparameters "svg" ;
+ w := getparameter "width" ;
+ h := getparameter "height" ;
+ o := getparameter "offset" ;
+ lua.mp.lmt_svg_include() ;
+ if getparameter "origin" :
+ currentpicture := currentpicture shifted -llcorner currentpicture ;
+ fi ;
+ popparameters ;
+ if o <> 0 :
+ setbounds currentpicture to boundingbox currentpicture enlarged o ;
+ fi ;
+ )
+ if w > 0 :
+ if h > 0 : xysized(w,h) else : xsized(w) fi
+ else :
+ if h > 0 : ysized(h) fi
+ fi
+enddef ;
+
+% Another experiment. Parameters might change pending a discussion between Alan
+% and me.
+
+presetparameters "surface" [
+ code = "x + y",
+ color = "f, 0, 0",
+ linecolor = 1,
+ xmin = -1,
+ xmax = 1,
+ ymin = -1,
+ ymax = 1,
+ xstep = .1,
+ ystep = .1,
+ snap = .01,
+ xvector = { -0.7, -0.7 },
+ yvector = { 1, 0 },
+ zvector = { 0, 1 },
+ light = { 3, 3, 10 },
+ bright = 100,
+ clip = false,
+ lines = true,
+ linecolor = 1,
+ % axis = { }
+ % clipaxis = false
+ axiscolor = "gray"
+ axislinewidth = 1/2,
+] ;
+
+def lmt_surface = applyparameters "surface" "lmt_do_surface" enddef ;
+
+vardef lmt_do_surface =
+ image (
+
+ lmt_load_mlib_cnt ;
+
+ pushparameters "surface" ;
+
+ save currentpen; pen currentpen ;
+ currentpen := pencircle scaled .25 ;
+
+ interim linejoin := butt ;
+
+ lmt_do_contour_shortcuts ;
+
+ lua.mp.lmt_surface_do() ;
+
+ currentpicture := currentpicture ysized getparameter "height" ;
+
+ if hasparameter "axis" :
+
+ save p ; picture p ; p := image (
+ if hasparameter "axis" 1 :
+ draw ((origin) -- unitvector(getparameter "xvector")) scaled (getparameter "axis" 1) ;
+ fi ;
+ if hasparameter "axis" 2 :
+ draw ((origin) -- unitvector(getparameter "yvector")) scaled (getparameter "axis" 2) ;
+ fi ;
+ if hasparameter "axis" 3 :
+ draw ((origin) -- unitvector(getparameter "zvector")) scaled (getparameter "axis" 3) ;
+ fi ;
+ ) ;
+
+ if getparameterdefault "clipaxis" false :
+ clip p to boundingbox currentpicture ;
+ fi ;
+
+ draw p
+ withpen pencircle scaled getparameter "axislinewidth"
+ withcolor getparameter "axiscolor"
+ ;
+
+ fi ;
+
+ popparameters ;
+ )
+enddef ;
+
+% I can make a variant that avoids the lmt_do ... and does an immediate function
+% call instead.
+
+presetparameters "mpsglyphs" [
+ name = "dummy",
+ units = 1000,
+] ;
+
+presetparameters "mpsglyph" [
+ category = "dummy",
+ unicode = 0,
+ % unichar = ""
+] ;
+
+def lmt_registerglyphs = applyparameters "mpsglyphs" "lmt_do_registerglyphs" enddef ;
+def lmt_registerglyph = applyparameters "mpsglyph" "lmt_do_registerglyph" enddef ;
+
+vardef lmt_do_registerglyphs = lua.mp.lmt_register_glyphs() ; enddef ;
+vardef lmt_do_registerglyph = lua.mp.lmt_register_glyph () ; enddef ;
+
+% Again an experiment (todo: the faster method):
+
+def lmt_remaptext = runscript("mp.lmt_do_remaptext()") enddef ;
+
+triplet mfun_tt_s ;
+
+vardef rawmaptext(expr s) =
+ mfun_tt_n := mfun_tt_n + 1 ;
+ mfun_tt_c := nullpicture ;
+ mfun_tt_o := nullpicture ;
+ addto mfun_tt_o doublepath origin _op_ ; % save drawoptions
+ mfun_tt_r := lua.mp.mf_map_text(mfun_tt_n,s) ;
+ mfun_tt_s := lua.mp.mf_map_move(mfun_tt_n) ;
+ addto mfun_tt_c doublepath unitsquare
+ xscaled wdpart mfun_tt_r
+ yscaled (htpart mfun_tt_r + dppart mfun_tt_r)
+ shifted (0,-dppart mfun_tt_r)
+ withprescript "mf_object=text"
+ withprescript "tx_index=" & decimal mfun_tt_n
+ withprescript "tx_color=" & colordecimals colorpart mfun_tt_o
+ ;
+ mfun_tt_c
+enddef ;
+
+vardef svgtext(expr t) =
+ save p ; picture p ;
+ % mfun_tt_s := (0,0,0) ;
+ % mfun_tt_r := (0,0,0) ;
+ p := rawmaptext(t) ;
+ p
+ if (mfun_labtype.drt >= 10) : % drt etc
+ shifted (0,ypart center p)
+ fi
+ shifted (
+ - mfun_labshift.drt(p)
+ - (redpart mfun_tt_s,0)
+ + (greenpart mfun_tt_s,bluepart mfun_tt_s)
+ )
+enddef ;
+
+vardef svg expr c = lmt_svg [ code = c ] enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-luas.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/mp-luas.mpiv
index e5cfe0371eb..57937c0c162 100644
--- a/Master/texmf-dist/metapost/context/base/mpiv/mp-luas.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-luas.mpiv
@@ -20,35 +20,10 @@ if known context_luas : endinput ; fi ;
% get passed. Of course in the end the real usage got a bit beyong the intended
% usage. So, in addition to some definitions here there are and will be use in
% other metafun modules too. Of course in retrospect I should have done this five
-% years earlier.
+% years earlier. Older version sof this module show the way it evolved.
boolean context_luas ; context_luas := true ;
-% First variant:
-%
-% let lua = runscript ;
-%
-% Second variant:
-%
-% vardef lua (text t) =
-% runscript(for s = t : s & endfor "")
-% enddef;
-%
-% Third variant:
-%
-% vardef lua (text t) =
-% runscript("" for s = t :
-% if string s :
-% & s
-% elseif numeric s :
-% & decimal s
-% elseif boolean s :
-% & if s : "true" else "false" fi
-% fi endfor)
-% enddef;
-%
-% Fourth variant:
-
string mfun_lua_bs ; mfun_lua_bs := "[===[" ;
string mfun_lua_es ; mfun_lua_es := "]===]" ;
@@ -75,42 +50,13 @@ vardef mlib_luas_luacall(text t) =
)
enddef ;
-% vardef mlib_luas_lualist(expr c)(text t) =
-% save b ; boolean b ; b := false ;
-% runscript(c & "(" for s = t :
-% if b :
-% & ","
-% else :
-% hide(b := true)
-% fi
-% if string s :
-% % & ditto & s & ditto
-% & mfun_lua_bs & s & mfun_lua_es
-% elseif numeric s :
-% & decimal s
-% elseif boolean s :
-% & if s : "true" else : "false" fi
-% elseif pair s :
-% & mfun_pair_to_table(s)
-% elseif path s :
-% & mfun_path_to_table(s)
-% elseif rgbcolor s :
-% & mfun_rgb_to_table(s)
-% elseif cmykcolor s :
-% & mfun_cmyk_to_table(s)
-% else :
-% & ditto & tostring(s) & ditto
-% fi endfor & ")"
-% )
-% enddef ;
-
newinternal mfun_luas_b ;
def mlib_luas_luadone =
exitif numeric begingroup mfun_luas_b := 1 ; endgroup ;
enddef ;
-vardef mlib_luas_lualist(expr c)(text t) =
+vardef mlib_luas_lualist(expr c)(text t) = % we could use mlib_luas_s instead of c
interim mfun_luas_b := 0 ;
runscript(c & for s = t :
if mfun_luas_b = 0 :
@@ -164,6 +110,22 @@ def message expr t =
lua.mp.report(tostring(t)) ;
enddef ;
+% Color:
+
+% We do a low level runscript:
+%
+% lua.mp.namedcolor(s) % conflicts with macro namedcolor
+% lua.mp.mf_named_color(s) % okay but, can also be
+% lua.mp("mf_named_color",s) % which gives expansion mess
+
+def resolvedcolor primary s = % no vardef
+ if string s :
+ runscript("mp.mf_named_color('" & s & "')") % faster anyway
+ else :
+ s
+ fi
+enddef ;
+
% Modes:
vardef texmode (expr s) = lua.mp("mode", s) enddef ;
@@ -214,26 +176,6 @@ vardef texstr(expr name) = lua.mp.texstr(name) enddef ;
%D New experimental feature for Alan-The-Number-Cruncher:
-% \startMPcode{doublefun}
-% path p ; p := (
-% for i=1 upto 20000 :
-% origin randomized 10000 ..
-% endfor cycle
-% ) xysized (TextWidth,TextHeight) ;
-% draw for i inpath p:
-% pointof i .. controls (leftof i) and (rightof i) ..
-% endfor cycle ;
-% \stopMPcode
-
-% def inpath suffix p =
-% = 1 step 1 until lua.mp.mf_path_length(str p)
-% enddef ;
-
-% def inpath suffix p =
-% % = 1 step 1 until lua.mp.mf_path_length(str p)
-% = 1 step 1 until (begingroup save n ; n := lua.mp.mf_path_length(str p) ; if n = 0 : 1 else : n fi endgroup)
-% enddef ;
-
def inpath suffix p = % permits p[0]
= 1 step 1 until
begingroup
@@ -244,8 +186,15 @@ def inpath suffix p = % permits p[0]
endgroup
enddef ;
-vardef pointof primary i = lua.mp.mf_path_point(i) enddef ;
-vardef leftof primary i = lua.mp.mf_path_left (i) enddef ;
-vardef rightof primary i = lua.mp.mf_path_right(i) enddef ;
+% vardef pointof primary i = lua.mp.mf_path_point(i) enddef ;
+% vardef leftof primary i = lua.mp.mf_path_left (i) enddef ;
+% vardef rightof primary i = lua.mp.mf_path_right(i) enddef ;
+
+vardef pointof primary i = runscript("mp.mf_path_point(" & decimal i & ")") enddef ;
+vardef leftof primary i = runscript("mp.mf_path_left(" & decimal i & ")") enddef ;
+vardef rightof primary i = runscript("mp.mf_path_right(" & decimal i & ")") enddef ;
extra_endfig := extra_endfig & " lua.mp.mf_path_reset() ; " ;
+
+vardef utflen(expr s) = lua.mp.utflen(s) enddef ;
+vardef utfsub(expr s,f,t) = lua.mp.utfsub(s,f,t) enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-luas.mpxl b/Master/texmf-dist/metapost/context/base/mpiv/mp-luas.mpxl
new file mode 100644
index 00000000000..421e82946d0
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-luas.mpxl
@@ -0,0 +1,250 @@
+%D \module
+%D [ file=mp-luas.mpiv,
+%D version=2014.04.14,
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=\LUA,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+if known context_luas : endinput ; fi ;
+
+% When I prototyped the runscript primitive I was just thinking of a usage like
+% the original \directlua primitive in luatex: genererate something and pipe
+% that back to metapost, and have access to some internals. Instead of compiling
+% the code a the metapost end here we delegate that to the lua end. Only strings
+% get passed. Of course in the end the real usage got a bit beyong the intended
+% usage. So, in addition to some definitions here there are and will be use in
+% other metafun modules too. Of course in retrospect I should have done this five
+% years earlier.
+
+boolean context_luas ; context_luas := true ;
+
+newinternal mfid_scriptindex ;
+mfid_scriptindex := runscript("mp.mf_script_index('scriptindex')") ;
+
+def scriptindex = runscript mfid_scriptindex enddef ;
+
+string mfun_lua_bs ; mfun_lua_bs := "[===[" ;
+string mfun_lua_es ; mfun_lua_es := "]===]" ;
+
+vardef mlib_luas_luacall(text t) =
+ runscript("" for s = t :
+ if string s :
+ & s
+ % & mfun_lua_bs & s & mfun_lua_es
+ elseif numeric s :
+ & decimal s
+ elseif boolean s :
+ & if s : "true" else : "false" fi
+ elseif pair s :
+ & mfun_pair_to_table(s)
+ elseif path s :
+ & mfun_path_to_table(s)
+ elseif rgbcolor s :
+ & mfun_rgb_to_table(s)
+ elseif cmykcolor s :
+ & mfun_cmyk_to_table(s)
+ else :
+ & ditto & tostring(s) & ditto
+ fi endfor
+ )
+enddef ;
+
+newinternal mfun_luas_b ;
+
+def mlib_luas_luadone =
+ exitif numeric begingroup mfun_luas_b := 1 ; endgroup ;
+enddef ;
+
+vardef mlib_luas_lualist(expr c)(text t) = % we could use mlib_luas_s instead of c
+ interim mfun_luas_b := 0 ;
+ runscript(c & for s = t :
+ if mfun_luas_b = 0 :
+ "("
+ % hide(mfun_luas_b := 1)
+ mlib_luas_luadone
+ else :
+ ","
+ fi
+ &
+ if string s :
+ mfun_lua_bs & s & mfun_lua_es
+ elseif numeric s :
+ decimal s
+ elseif boolean s :
+ if s : "true" else : "false" fi
+ elseif pair s :
+ mfun_pair_to_table(s)
+ elseif path s :
+ mfun_path_to_table(s)
+ elseif rgbcolor s :
+ mfun_rgb_to_table(s)
+ elseif cmykcolor s :
+ mfun_cmyk_to_table(s)
+ else :
+ ditto & tostring(s) & ditto
+ fi & endfor if mfun_luas_b = 0 : "()" else : ")" fi
+ )
+enddef ;
+
+def luacall = mlib_luas_luacall enddef ; % why no let
+
+vardef lualist@#(text t) = mlib_luas_lualist(str @#)(t) enddef ;
+
+string mlib_luas_s ; % saves save/restore
+
+vardef lua@#(text t) =
+ mlib_luas_s := str @# ;
+ if length(mlib_luas_s) > 0 :
+ mlib_luas_lualist(mlib_luas_s,t)
+ else :
+ mlib_luas_luacall(t)
+ fi
+enddef ;
+
+vardef MP@#(text t) =
+ mlib_luas_lualist("MP." & str @#,t)
+enddef ;
+
+def message expr t =
+ lua.mp.report(tostring(t)) ;
+enddef ;
+
+% Color:
+
+% We do a low level runscript:
+%
+% lua.mp.namedcolor(s) % conflicts with macro namedcolor
+% lua.mp.mf_named_color(s) % okay but, can also be
+% lua.mp("mf_named_color",s) % which gives expansion mess
+
+newinternal mfid_resolvedcolor ; mfid_resolvedcolor := scriptindex "namedcolor" ;
+
+def resolvedcolor = runscript mfid_resolvedcolor enddef ;
+
+% Modes:
+
+vardef texmode (expr s) = lua.mp("mode", s) enddef ;
+vardef systemmode(expr s) = lua.mp("systemmode",s) enddef ;
+
+% A few helpers
+
+vardef isarray suffix a = lua.mp.isarray (str a) enddef ;
+vardef prefix suffix a = lua.mp.prefix (str a) enddef ;
+vardef dimension suffix a = lua.mp.dimension(str a) enddef ;
+
+% More access
+
+vardef getmacro(expr k) = lua.mp._get_macro_(k) enddef ;
+vardef getdimen(expr k) = lua.mp._get_dimen_(k) enddef ;
+vardef getcount(expr k) = lua.mp._get_count_(k) enddef ;
+vardef gettoks (expr k) = lua.mp._get_toks_ (k) enddef ;
+
+def setmacro(expr k,v) = lua.mp._set_macro_(k,v) enddef ;
+def setdimen(expr k,v) = lua.mp._set_dimen_(k,v) enddef ;
+def setcount(expr k,v) = lua.mp._set_count_(k,v) enddef ;
+def settoks (expr k,v) = lua.mp._set_toks_ (k,v) enddef ;
+
+vardef positionpath (expr name) = lua.mp.positionpath (name) enddef ;
+vardef positioncurve (expr name) = lua.mp.positioncurve (name) enddef ;
+vardef positionxy (expr name) = lua.mp.positionxy (name) enddef ;
+vardef positionpxy (expr name) = lua.mp.positionpxy (name) enddef ;
+vardef positionwhd (expr name) = lua.mp.positionwhd (name) enddef ;
+vardef positionpage (expr name) = lua.mp.positionpage (name) enddef ;
+vardef positionregion(expr name) = lua.mp.positionregion(name) enddef ;
+vardef positionbox (expr name) = lua.mp.positionbox (name) enddef ;
+vardef positionanchor = lua.mp.positionanchor() enddef ;
+
+let wdpart = redpart ;
+let htpart = greenpart ;
+let dppart = bluepart ;
+
+vardef positioninregion =
+ currentpicture := currentpicture shifted - positionxy(positionanchor) ;
+enddef ;
+
+vardef positionatanchor(expr name) =
+ currentpicture := currentpicture shifted - positionxy(name) ;
+enddef ;
+
+vardef texvar(expr name) = lua.mp.texvar(name) enddef ;
+vardef texstr(expr name) = lua.mp.texstr(name) enddef ;
+
+newinternal mfid_path_lengthof ; mfid_path_lengthof := scriptindex "pathlengthof" ;
+newinternal mfid_path_pointof ; mfid_path_pointof := scriptindex "pathpointof" ;
+newinternal mfid_path_leftof ; mfid_path_leftof := scriptindex "pathleftof" ;
+newinternal mfid_path_rightof ; mfid_path_rightof := scriptindex "pathrightof" ;
+newinternal mfid_path_reset ; mfid_path_reset := scriptindex "pathreset" ;
+
+% 25 pct gain
+
+ def inpath = = 1 step 1 until runscript mfid_path_lengthof enddef ;
+vardef pointof primary i = runscript mfid_path_pointof i enddef ;
+vardef leftof primary i = runscript mfid_path_leftof i enddef ;
+vardef rightof primary i = runscript mfid_path_rightof i enddef ;
+
+% another 10 pct gain
+
+% def inpath = = 1 step 1 until runscript mfid_path_lengthof enddef ;
+% def pointof = runscript mfid_path_pointof enddef ;
+% def leftof = runscript mfid_path_leftof enddef ;
+% def rightof = runscript mfid_path_rightof enddef ;
+
+extra_endfig := extra_endfig & " runscript mfid_path_reset ; " ;
+
+vardef utflen(expr s) = lua.mp.utflen(s) enddef ;
+vardef utfsub(expr s,f,t) = lua.mp.utfsub(s,f,t) enddef ;
+
+newinternal mfid_getparameters ; mfid_getparameters := scriptindex "getparameters" ;
+newinternal mfid_presetparameters ; mfid_presetparameters := scriptindex "presetparameters" ;
+newinternal mfid_hasparameter ; mfid_hasparameter := scriptindex "hasparameter" ;
+newinternal mfid_hasoption ; mfid_hasoption := scriptindex "hasoption" ;
+newinternal mfid_getparameter ; mfid_getparameter := scriptindex "getparameter" ;
+newinternal mfid_getparameterdefault ; mfid_getparameterdefault := scriptindex "getparameterdefault" ;
+newinternal mfid_getparametercount ; mfid_getparametercount := scriptindex "getparametercount" ;
+newinternal mfid_getmaxparametercount ; mfid_getmaxparametercount := scriptindex "getmaxparametercount" ;
+newinternal mfid_getparameterpath ; mfid_getparameterpath := scriptindex "getparameterpath" ;
+newinternal mfid_getparameterpen ; mfid_getparameterpen := scriptindex "getparameterpen" ;
+newinternal mfid_getparametertext ; mfid_getparametertext := scriptindex "getparametertext" ;
+%%%%%%%%%%% mfid_getparameteroption ; mfid_getparameteroption := scriptindex "getparameteroption" ;
+newinternal mfid_applyparameters ; mfid_applyparameters := scriptindex "applyparameters" ;
+newinternal mfid_pushparameters ; mfid_pushparameters := scriptindex "pushparameters" ;
+newinternal mfid_popparameters ; mfid_popparameters := scriptindex "popparameters" ;
+
+def getparameters = runscript mfid_getparameters enddef ;
+def presetparameters = runscript mfid_presetparameters enddef ;
+def hasparameter = runscript mfid_hasparameter enddef ;
+def hasoption = runscript mfid_hasoption enddef ;
+def getparameter = runscript mfid_getparameter enddef ;
+def getparameterdefault = runscript mfid_getparameterdefault enddef ;
+def getparametercount = runscript mfid_getparametercount enddef ;
+def getmaxparametercount = runscript mfid_getmaxparametercount enddef ;
+def getparameterpath = runscript mfid_getparameterpath enddef ;
+def getparameterpen = runscript mfid_getparameterpen enddef ;
+def getparametertext = runscript mfid_getparametertext enddef ;
+%%% getparameteroption = runscript mfid_getparameteroption enddef ;
+def applyparameters = runscript mfid_applyparameters enddef ;
+def pushparameters = runscript mfid_pushparameters enddef ;
+def popparameters = runscript mfid_popparameters enddef ;
+
+% This might also be done in stock mkiv:
+
+newinternal mfid_year ; mfid_year := scriptindex "year" ; vardef year = runscript mfid_year enddef ;
+newinternal mfid_month ; mfid_month := scriptindex "month" ; vardef month = runscript mfid_month enddef ;
+newinternal mfid_day ; mfid_day := scriptindex "day" ; vardef day = runscript mfid_day enddef ;
+newinternal mfid_hour ; mfid_hour := scriptindex "hour" ; vardef hour = runscript mfid_hour enddef ;
+newinternal mfid_minute ; mfid_minute := scriptindex "minute" ; vardef minute = runscript mfid_minute enddef ;
+newinternal mfid_second ; mfid_second := scriptindex "second" ; vardef second = runscript mfid_second enddef ;
+
+% You cannot overload a local color bu using a prefix works ok:
+%
+% \definecolor [ name = "mp:myred", r = .9 ] ;
+
+newinternal mfid_definecolor ; mfid_definecolor := scriptindex "definecolor" ;
+
+def definecolor = runscript mfid_definecolor ; enddef ; % the semicolon prevents lookahead
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-math.mpxl b/Master/texmf-dist/metapost/context/base/mpiv/mp-math.mpxl
new file mode 100644
index 00000000000..ea8c1cd7c7a
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-math.mpxl
@@ -0,0 +1,161 @@
+%D \module
+%D [ file=mp-math.mpiv,
+%D version=2019.07.26, % was mp-core: 1999.08.01, anchoring
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=extra math functions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+if known context_math : endinput ; fi ;
+
+boolean context_math ; context_math := true ;
+
+% draw textext(decimal runscript("mp.numeric(xmath.gamma(.12))")) ;
+
+newinternal mfid_m_acos ; mfid_m_acos := scriptindex "m_acos" ; def m_acos = runscript mfid_m_acos enddef ;
+newinternal mfid_m_acosh ; mfid_m_acosh := scriptindex "m_acosh" ; def m_acosh = runscript mfid_m_acosh enddef ;
+newinternal mfid_m_asin ; mfid_m_asin := scriptindex "m_asin" ; def m_asin = runscript mfid_m_asin enddef ;
+newinternal mfid_m_asinh ; mfid_m_asinh := scriptindex "m_asinh" ; def m_asinh = runscript mfid_m_asinh enddef ;
+newinternal mfid_m_atan ; mfid_m_atan := scriptindex "m_atan" ; def m_atan = runscript mfid_m_atan enddef ;
+newinternal mfid_m_atantwo ; mfid_m_atantwo := scriptindex "m_atan2" ; def m_atantwo = runscript mfid_m_atantwo enddef ; % atan2
+newinternal mfid_m_atanh ; mfid_m_atanh := scriptindex "m_atanh" ; def m_atanh = runscript mfid_m_atanh enddef ;
+newinternal mfid_m_cbrt ; mfid_m_cbrt := scriptindex "m_cbrt" ; def m_cbrt = runscript mfid_m_cbrt enddef ;
+newinternal mfid_m_ceil ; mfid_m_ceil := scriptindex "m_ceil" ; def m_ceil = runscript mfid_m_ceil enddef ;
+newinternal mfid_m_copysign ; mfid_m_copysign := scriptindex "m_copysign" ; def m_copysign = runscript mfid_m_copysign enddef ;
+newinternal mfid_m_cos ; mfid_m_cos := scriptindex "m_cos" ; def m_cos = runscript mfid_m_cos enddef ;
+newinternal mfid_m_cosh ; mfid_m_cosh := scriptindex "m_cosh" ; def m_cosh = runscript mfid_m_cosh enddef ;
+newinternal mfid_m_deg ; mfid_m_deg := scriptindex "m_deg" ; def m_deg = runscript mfid_m_deg enddef ;
+newinternal mfid_m_erf ; mfid_m_erf := scriptindex "m_erf" ; def m_erf = runscript mfid_m_erf enddef ;
+newinternal mfid_m_erfc ; mfid_m_erfc := scriptindex "m_erfc" ; def m_erfc = runscript mfid_m_erfc enddef ;
+newinternal mfid_m_exp ; mfid_m_exp := scriptindex "m_exp" ; def m_exp = runscript mfid_m_exp enddef ;
+newinternal mfid_m_exptwo ; mfid_m_exptwo := scriptindex "m_exp2" ; def m_exptwo = runscript mfid_m_exptwo enddef ; % exp2
+newinternal mfid_m_expm ; mfid_m_expm := scriptindex "m_expm1" ; def m_expm = runscript mfid_m_expm enddef ; % expm1
+newinternal mfid_m_fabs ; mfid_m_fabs := scriptindex "m_fabs" ; def m_fabs = runscript mfid_m_fabs enddef ;
+newinternal mfid_m_fdim ; mfid_m_fdim := scriptindex "m_fdim" ; def m_fdim = runscript mfid_m_fdim enddef ;
+newinternal mfid_m_floor ; mfid_m_floor := scriptindex "m_floor" ; def m_floor = runscript mfid_m_floor enddef ;
+newinternal mfid_m_fma ; mfid_m_fma := scriptindex "m_fma" ; def m_fma = runscript mfid_m_fma enddef ;
+newinternal mfid_m_fmax ; mfid_m_fmax := scriptindex "m_fmax" ; def m_fmax = runscript mfid_m_fmax enddef ;
+newinternal mfid_m_fmin ; mfid_m_fmin := scriptindex "m_fmin" ; def m_fmin = runscript mfid_m_fmin enddef ;
+newinternal mfid_m_fmod ; mfid_m_fmod := scriptindex "m_fmod" ; def m_fmod = runscript mfid_m_fmod enddef ;
+newinternal mfid_m_frexp ; mfid_m_frexp := scriptindex "m_frexp" ; def m_frexp = runscript mfid_m_frexp enddef ;
+newinternal mfid_m_gamma ; mfid_m_gamma := scriptindex "m_gamma" ; def m_gamma = runscript mfid_m_gamma enddef ;
+newinternal mfid_m_hypot ; mfid_m_hypot := scriptindex "m_hypot" ; def m_hypot = runscript mfid_m_hypot enddef ;
+newinternal mfid_m_isfinite ; mfid_m_isfinite := scriptindex "m_isfinite" ; def m_isfinite = runscript mfid_m_isfinite enddef ;
+newinternal mfid_m_isinf ; mfid_m_isinf := scriptindex "m_isinf" ; def m_isinf = runscript mfid_m_isinf enddef ;
+newinternal mfid_m_isnan ; mfid_m_isnan := scriptindex "m_isnan" ; def m_isnan = runscript mfid_m_isnan enddef ;
+newinternal mfid_m_isnormal ; mfid_m_isnormal := scriptindex "m_isnormal" ; def m_isnormal = runscript mfid_m_isnormal enddef ;
+newinternal mfid_m_jz ; mfid_m_jz := scriptindex "m_j0" ; def m_jz = runscript mfid_m_jz enddef ; % j0
+newinternal mfid_m_j ; mfid_m_j := scriptindex "m_j1" ; def m_j = runscript mfid_m_j enddef ; % j1
+newinternal mfid_m_jn ; mfid_m_jn := scriptindex "m_jn" ; def m_jn = runscript mfid_m_jn enddef ;
+newinternal mfid_m_ldexp ; mfid_m_ldexp := scriptindex "m_ldexp" ; def m_ldexp = runscript mfid_m_ldexp enddef ;
+newinternal mfid_m_lgamma ; mfid_m_lgamma := scriptindex "m_lgamma" ; def m_lgamma = runscript mfid_m_lgamma enddef ;
+newinternal mfid_m_log ; mfid_m_log := scriptindex "m_log" ; def m_log = runscript mfid_m_log enddef ;
+newinternal mfid_m_logten ; mfid_m_logte := scriptindex "m_log10" ; def m_logten = runscript mfid_m_logten enddef ; % log10
+newinternal mfid_m_logp ; mfid_m_logp := scriptindex "m_log1p" ; def m_logp = runscript mfid_m_logp enddef ; % log1p
+newinternal mfid_m_logtwo ; mfid_m_logtwo := scriptindex "m_log2" ; def m_logtwo = runscript mfid_m_logtwo enddef ; % log2
+newinternal mfid_m_logb ; mfid_m_logb := scriptindex "m_logb" ; def m_logb = runscript mfid_m_logb enddef ;
+newinternal mfid_m_modf ; mfid_m_modf := scriptindex "m_modf" ; def m_modf = runscript mfid_m_modf enddef ;
+newinternal mfid_m_nearbyint ; mfid_m_nearbyint := scriptindex "m_nearbyint" ; def m_nearbyint = runscript mfid_m_nearbyint enddef ;
+newinternal mfid_m_nextafter ; mfid_m_nextafter := scriptindex "m_nextafter" ; def m_nextafter = runscript mfid_m_nextafter enddef ;
+newinternal mfid_m_pow ; mfid_m_pow := scriptindex "m_pow" ; def m_pow = runscript mfid_m_pow enddef ;
+newinternal mfid_m_rad ; mfid_m_rad := scriptindex "m_rad" ; def m_rad = runscript mfid_m_rad enddef ;
+newinternal mfid_m_remainder ; mfid_m_remainder := scriptindex "m_remainder" ; def m_remainder = runscript mfid_m_remainder enddef ;
+newinternal mfid_m_remquo ; mfid_m_remquo := scriptindex "m_remquo" ; def m_remquo = runscript mfid_m_remquo enddef ;
+newinternal mfid_m_round ; mfid_m_round := scriptindex "m_round" ; def m_round = runscript mfid_m_round enddef ;
+newinternal mfid_m_scalbn ; mfid_m_scalbn := scriptindex "m_scalbn" ; def m_scalbn = runscript mfid_m_scalbn enddef ;
+newinternal mfid_m_sin ; mfid_m_sin := scriptindex "m_sin" ; def m_sin = runscript mfid_m_sin enddef ;
+newinternal mfid_m_sinh ; mfid_m_sinh := scriptindex "m_sinh" ; def m_sinh = runscript mfid_m_sinh enddef ;
+newinternal mfid_m_sqrt ; mfid_m_sqrt := scriptindex "m_sqrt" ; def m_sqrt = runscript mfid_m_sqrt enddef ;
+newinternal mfid_m_tan ; mfid_m_tan := scriptindex "m_tan" ; def m_tan = runscript mfid_m_tan enddef ;
+newinternal mfid_m_tanh ; mfid_m_tanh := scriptindex "m_tanh" ; def m_tanh = runscript mfid_m_tanh enddef ;
+newinternal mfid_m_tgamma ; mfid_m_tgamma := scriptindex "m_tgamma" ; def m_tgamma = runscript mfid_m_tgamma enddef ;
+newinternal mfid_m_trunc ; mfid_m_trunc := scriptindex "m_trunc" ; def m_trunc = runscript mfid_m_trunc enddef ;
+newinternal mfid_m_yz ; mfid_m_yz := scriptindex "m_y0" ; def m_yz = runscript mfid_m_yz enddef ; % y0
+newinternal mfid_m_y ; mfid_m_y := scriptindex "m_y1" ; def m_y = runscript mfid_m_y enddef ; % y1
+newinternal mfid_m_yn ; mfid_m_yn := scriptindex "m_yn" ; def m_yn = runscript mfid_m_yn enddef ;
+
+newinternal mfid_c_sin ; mfid_c_asin := scriptindex "c_sin" ; def c_sin = runscript mfid_c_sin enddef ;
+newinternal mfid_c_cos ; mfid_c_acos := scriptindex "c_cos" ; def c_cos = runscript mfid_c_cos enddef ;
+newinternal mfid_c_tan ; mfid_c_acos := scriptindex "c_tan" ; def c_tan = runscript mfid_c_tan enddef ;
+newinternal mfid_c_sinh ; mfid_c_acos := scriptindex "c_sinh" ; def c_sinh = runscript mfid_c_sinh enddef ;
+newinternal mfid_c_cosh ; mfid_c_acos := scriptindex "c_cosh" ; def c_cosh = runscript mfid_c_cosh enddef ;
+newinternal mfid_c_tanh ; mfid_c_acos := scriptindex "c_tanh" ; def c_tanh = runscript mfid_c_tanh enddef ;
+
+newinternal mfid_c_asin ; mfid_c_acos := scriptindex "c_asin" ; def c_asin = runscript mfid_c_asin enddef ;
+newinternal mfid_c_acos ; mfid_c_acos := scriptindex "c_acos" ; def c_acos = runscript mfid_c_acos enddef ;
+newinternal mfid_c_atan ; mfid_c_acos := scriptindex "c_atan" ; def c_atan = runscript mfid_c_atan enddef ;
+newinternal mfid_c_asinh ; mfid_c_acos := scriptindex "c_asinh" ; def c_asinh = runscript mfid_c_asinh enddef ;
+newinternal mfid_c_acosh ; mfid_c_acos := scriptindex "c_acosh" ; def c_acosh = runscript mfid_c_acosh enddef ;
+newinternal mfid_c_atanh ; mfid_c_acos := scriptindex "c_atanh" ; def c_atanh = runscript mfid_c_atanh enddef ;
+
+newinternal mfid_c_sqrt ; mfid_c_acos := scriptindex "c_sqrt" ; def c_sqrt = runscript mfid_c_sqrt enddef ;
+newinternal mfid_c_abs ; mfid_c_acos := scriptindex "c_abs" ; def c_abs = runscript mfid_c_abs enddef ;
+newinternal mfid_c_arg ; mfid_c_acos := scriptindex "c_arg" ; def c_arg = runscript mfid_c_arg enddef ;
+newinternal mfid_c_conj ; mfid_c_acos := scriptindex "c_conj" ; def c_conj = runscript mfid_c_conj enddef ;
+newinternal mfid_c_exp ; mfid_c_acos := scriptindex "c_exp" ; def c_exp = runscript mfid_c_exp enddef ;
+newinternal mfid_c_log ; mfid_c_acos := scriptindex "c_log" ; def c_log = runscript mfid_c_log enddef ;
+newinternal mfid_c_proj ; mfid_c_acos := scriptindex "c_proj" ; def c_proj = runscript mfid_c_proj enddef ;
+
+newinternal mfid_c_erf ; mfid_c_erf := scriptindex "c_erf" ; def c_erf = runscript mfid_c_erf enddef ;
+newinternal mfid_c_erfc ; mfid_c_erfc := scriptindex "c_erfc" ; def c_erfc = runscript mfid_c_erfc enddef ;
+newinternal mfid_c_erfcx ; mfid_c_erfcx := scriptindex "c_erfcx" ; def c_erfcx = runscript mfid_c_erfcx enddef ;
+newinternal mfid_c_erfi ; mfid_c_erfi := scriptindex "c_erfi" ; def c_erfi = runscript mfid_c_erfi enddef ;
+
+% mfid_c_imag ; mfid_c_acos := scriptindex "c_imag" ; def c_imag = runscript mfid_c_imag enddef ;
+% mfid_c_real ; mfid_c_acos := scriptindex "c_real" ; def c_real = runscript mfid_c_real enddef ;
+% mfid_c_neg ; mfid_c_neg := scriptindex "c_neg" ; def c_neg = runscript mfid_c_neg enddef ;
+
+newinternal mfid_c_pow ; mfid_c_pow := scriptindex "c_pow" ; def c_pow (expr a,b) = runscript mfid_c_pow a b enddef ;
+% mfid_c_add ; mfid_c_add := scriptindex "c_add" ; def c_add (expr a,b) = runscript mfid_c_add a b enddef ;
+% mfid_c_sub ; mfid_c_sub := scriptindex "c_sub" ; def c_sub (expr a,b) = runscript mfid_c_sub a b enddef ;
+newinternal mfid_c_mul ; mfid_c_mul := scriptindex "c_mul" ; def c_mul (expr a,b) = runscript mfid_c_mul a b enddef ;
+newinternal mfid_c_div ; mfid_c_div := scriptindex "c_div" ; def c_div (expr a,b) = runscript mfid_c_div a b enddef ;
+
+newinternal mfid_c_voigt ; mfid_c_voigt := scriptindex "c_voigt" ; def c_voigt (expr a,b,c) = runscript mfid_c_voigt a b c enddef ;
+newinternal mfid_c_voigt_hwhm ; mfid_c_voigt_hwhm := scriptindex "c_voigt_hwhm" ; def c_voigt_hwhm(expr a,b) = runscript mfid_c_voigt_hwhm a b enddef ;
+
+vardef c_add (expr a, b) = a + b enddef ;
+vardef c_sub (expr a, b) = a + b enddef ;
+vardef c_imag(expr a) = ypart a enddef ;
+vardef c_real(expr a) = xpart a enddef ;
+vardef c_neg (expr a) = -a enddef ;
+
+if (numbersystem == "scaled") or (numbersystem == "double") :
+
+ % vardef sqrt primary x = m_sqrt x enddef ;
+
+ % vardef sqr primary x = x*x enddef ;
+ % vardef log primary x = if x=0: 0 else: mlog(x)/mlog(10) fi enddef ;
+ % vardef ln primary x = if x=0: 0 else: mlog(x)/256 fi enddef ;
+ % vardef exp primary x = (mexp 256)**x enddef ;
+ % vardef inv primary x = if x=0: 0 else: x**-1 fi enddef ;
+
+ vardef sin primary x = m_sin x enddef ; vardef sinh primary x = m_sinh x enddef ;
+ vardef cos primary x = m_cos x enddef ; vardef cosh primary x = m_cosh x enddef ;
+ vardef tan primary x = m_tan x enddef ; vardef tanh primary x = m_tanh x enddef ;
+ vardef asin primary x = m_asin x enddef ; vardef asinh primary x = m_asinh x enddef ;
+ vardef acos primary x = m_acos x enddef ; vardef acosh primary x = m_acosh x enddef ;
+ vardef atan primary x = m_atan x enddef ; vardef atanh primary x = m_atanh x enddef ;
+
+ vardef invsin primary x = (m_asin(x))/radian enddef ;
+ vardef invcos primary x = (m_acos(x))/radian enddef ;
+ vardef invtan primary x = (m_atan(x))/radian enddef ;
+
+
+ % vardef sind primary x = angle(m_sin x) enddef ;
+ % vardef cosd primary x = angle(m_cos x) enddef ;
+ % vardef tand primary x = angle(m_tan x) enddef ;
+
+ vardef asind primary x = angle(m_asin x) enddef ;
+ vardef acosd primary x = angle(m_acos x) enddef ;
+ vardef atand primary x = angle(m_atan x) enddef ;
+
+ % vardef tand primary x = sind(x)/cosd(x) enddef ;
+ % vardef cotd primary x = cosd(x)/sind(x) enddef ;
+
+fi ;
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-mlib.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/mp-mlib.mpiv
index f39010e007d..88bf566749a 100644
--- a/Master/texmf-dist/metapost/context/base/mpiv/mp-mlib.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-mlib.mpiv
@@ -22,7 +22,8 @@ boolean context_mlib ; context_mlib := true ;
vardef isobject expr p =
if picture p :
- lua.mp.isobject(prescriptpart p)
+ % lua.mp.isobject(prescriptpart p)
+ runscript("mp.isobject(" & prescriptpart p & ")")
else :
false
fi
@@ -162,13 +163,6 @@ else :
% already defined before the format is loaded
fi ;
-if unknown mfun_first_run :
- boolean mfun_first_run ;
- mfun_first_run := true ;
-else :
- % already defined before the format is loaded
-fi ;
-
def mfun_reset_tex_texts =
mfun_tt_n := 0 ;
mfun_tt_p := nullpicture ;
@@ -189,8 +183,16 @@ extra_beginfig := extra_beginfig & "mfun_reset_tex_texts ;" ;
% and once at the end because we need to flush missing ones.
boolean mfun_onetime_textext ; mfun_onetime_textext := false ;
+numeric mfun_global_textext ; mfun_global_textext := 0 ;
-def notcached = withprescript "tx_cache=no" enddef ;
+def keepcached =
+ hide(mfun_global_textext := mfun_global_textext + 1;)
+ withprescript ("tx_cache=" & decimal mfun_global_textext)
+enddef ;
+
+def notcached =
+ withprescript "tx_cache=no"
+enddef ;
% todo: onetime
@@ -278,21 +280,21 @@ vardef fontsize expr name =
fi
enddef ;
-pair mfun_laboff ; mfun_laboff := (0,0) ;
-pair mfun_laboff.lft ; mfun_laboff.lft := (-1,0) ;
-pair mfun_laboff.rt ; mfun_laboff.rt := (1,0) ;
-pair mfun_laboff.bot ; mfun_laboff.bot := (0,-1) ;
-pair mfun_laboff.top ; mfun_laboff.top := (0,1) ;
-pair mfun_laboff.ulft ; mfun_laboff.ulft := (-.7,.7) ;
-pair mfun_laboff.urt ; mfun_laboff.urt := (.7,.7) ;
-pair mfun_laboff.llft ; mfun_laboff.llft := -(.7,.7) ;
-pair mfun_laboff.lrt ; mfun_laboff.lrt := (.7,-.7) ;
+pair mfun_laboff ; mfun_laboff := origin ;
+pair mfun_laboff.lft ; mfun_laboff.lft := (-1,0) ;
+pair mfun_laboff.rt ; mfun_laboff.rt := (1,0) ;
+pair mfun_laboff.bot ; mfun_laboff.bot := (0,-1) ;
+pair mfun_laboff.top ; mfun_laboff.top := (0,1) ;
+pair mfun_laboff.ulft ; mfun_laboff.ulft := (-.7,.7) ;
+pair mfun_laboff.urt ; mfun_laboff.urt := (.7,.7) ;
+pair mfun_laboff.llft ; mfun_laboff.llft := -(.7,.7) ;
+pair mfun_laboff.lrt ; mfun_laboff.lrt := (.7,-.7) ;
-pair mfun_laboff.d ; mfun_laboff.d := mfun_laboff ;
-pair mfun_laboff.dlft ; mfun_laboff.dlft := mfun_laboff.lft ;
-pair mfun_laboff.drt ; mfun_laboff.drt := mfun_laboff.rt ;
-pair mfun_laboff.origin ; mfun_laboff.origin := origin ;
-pair mfun_laboff.raw ; mfun_laboff.raw := origin ;
+pair mfun_laboff.d ; mfun_laboff.d := mfun_laboff ;
+pair mfun_laboff.dflt ; mfun_laboff.dflt := mfun_laboff.lft ;
+pair mfun_laboff.drt ; mfun_laboff.drt := mfun_laboff.rt ;
+pair mfun_laboff.origin ; mfun_laboff.origin := mfun_laboff ;
+pair mfun_laboff.raw ; mfun_laboff.raw := mfun_laboff ;
pair mfun_laboff.l ; mfun_laboff.l := mfun_laboff.lft ;
pair mfun_laboff.r ; mfun_laboff.r := mfun_laboff.rt ;
@@ -317,11 +319,11 @@ mfun_labxf.urt := mfun_labxf.r_t := mfun_labxf.t_r := 0 ;
mfun_labxf.llft := mfun_labxf.l_b := mfun_labxf.b_l := 1 ;
mfun_labxf.lrt := mfun_labxf.r_b := mfun_labxf.b_r := 0 ;
-mfun_labxf.d := mfun_labxf ;
-mfun_labxf.dlft := mfun_labxf.lft ;
-mfun_labxf.drt := mfun_labxf.rt ;
-mfun_labxf.origin := 0 ;
-mfun_labxf.raw := 0 ;
+mfun_labxf.d := mfun_labxf ;
+mfun_labxf.dflt := mfun_labxf.lft ;
+mfun_labxf.drt := mfun_labxf.rt ;
+mfun_labxf.origin := 0 ;
+mfun_labxf.raw := 0 ;
mfun_labyf := 0.5 ;
mfun_labyf.lft := mfun_labyf.l := 0.5 ;
@@ -333,11 +335,11 @@ mfun_labyf.urt := mfun_labyf.r_t := mfun_labyf.t_r := 0 ;
mfun_labyf.llft := mfun_labyf.l_b := mfun_labyf.b_l := 1 ;
mfun_labyf.lrt := mfun_labyf.r_b := mfun_labyf.b_r := 1 ;
-mfun_labyf.d := mfun_labyf ;
-mfun_labyf.dlft := mfun_labyf.lft ;
-mfun_labyf.drt := mfun_labyf.rt ;
-mfun_labyf.origin := 0 ;
-mfun_labyf.raw := 0 ;
+mfun_labyf.d := mfun_labyf ;
+mfun_labyf.dflt := mfun_labyf.lft ;
+mfun_labyf.drt := mfun_labyf.rt ;
+mfun_labyf.origin := 0 ;
+mfun_labyf.raw := 0 ;
mfun_labtype := 0 ;
mfun_labtype.lft := mfun_labtype.l := 1 ;
@@ -349,20 +351,27 @@ mfun_labtype.urt := mfun_labtype.r_t := mfun_labtype.t_r := 6 ;
mfun_labtype.llft := mfun_labtype.l_b := mfun_labtype.b_l := 7 ;
mfun_labtype.lrt := mfun_labtype.r_b := mfun_labtype.b_r := 8 ;
mfun_labtype.d := 10 ;
-mfun_labtype.dlft := 11 ;
+mfun_labtype.dflt := 11 ;
mfun_labtype.drt := 12 ;
mfun_labtype.origin := 0 ;
mfun_labtype.raw := 0 ;
-% installlabel.foo ( 0, 1, 1, (.5,-1) ) ;
-
vardef installlabel@# (expr type, x, y, offset) =
- numeric labtype@# ; labtype@# := type ;
- pair laboff @# ; laboff @# := offset ;
- numeric labxf @# ; labxf @# := x ;
- numeric labyf @# ; labyf @# := y ;
+ numeric mfun_labtype@# ; mfun_labtype@# := type ;
+ pair mfun_laboff @# ; mfun_laboff @# := offset ;
+ numeric mfun_labxf @# ; mfun_labxf @# := x ;
+ numeric mfun_labyf @# ; mfun_labyf @# := y ;
enddef ;
+installlabel.center (0, 0.5, 0.5, (0,0)) ;
+installlabel.c (0, 0.5, 0.5, (0,0)) ;
+
+installlabel.hcenter(0, 0.5, 0.5, (1,0)) ;
+installlabel.h (0, 0.5, 0.5, (1,0)) ;
+
+installlabel.vcenter(0, 0.5, 0.5, (0,1)) ;
+installlabel.v (0, 0.5, 0.5, (0,1)) ;
+
vardef mfun_labshift@#(expr p) =
(mfun_labxf@#*lrcorner p +
mfun_labyf@#*ulcorner p +
@@ -686,6 +695,24 @@ def mfun_with_shade_method_analyze(expr p) =
endfor ;
enddef ;
+vardef mfun_max_radius(expr p) =
+ max (
+ (xpart center p - xpart llcorner p) ++ (ypart center p - ypart llcorner p),
+ (xpart center p - xpart ulcorner p) ++ (ypart ulcorner p - ypart center p),
+ (xpart lrcorner p - xpart center p) ++ (ypart center p - ypart lrcorner p),
+ (xpart urcorner p - xpart center p) ++ (ypart urcorner p - ypart center p)
+ )
+enddef ;
+
+vardef mfun_min_radius(expr p) =
+ min (
+ (xpart center p - xpart llcorner p) ++ (ypart center p - ypart llcorner p),
+ (xpart center p - xpart ulcorner p) ++ (ypart ulcorner p - ypart center p),
+ (xpart lrcorner p - xpart center p) ++ (ypart center p - ypart lrcorner p),
+ (xpart urcorner p - xpart center p) ++ (ypart urcorner p - ypart center p)
+ )
+enddef ;
+
primarydef p withshademethod m =
hide(mfun_with_shade_method_analyze(p))
p
@@ -708,12 +735,7 @@ primarydef p withshademethod m =
withprescript "sh_center_a=" & ddecimal center p
withprescript "sh_center_b=" & ddecimal center p
withprescript "sh_radius_a=" & decimal 0
- withprescript "sh_radius_b=" & decimal ( max (
- (xpart center p - xpart llcorner p) ++ (ypart center p - ypart llcorner p),
- (xpart center p - xpart ulcorner p) ++ (ypart ulcorner p - ypart center p),
- (xpart lrcorner p - xpart center p) ++ (ypart center p - ypart lrcorner p),
- (xpart urcorner p - xpart center p) ++ (ypart urcorner p - ypart center p)
- ) )
+ withprescript "sh_radius_b=" & decimal mfun_max_radius(p)
fi
enddef ;
@@ -1136,6 +1158,10 @@ vardef mfun_do_outline_text_set_f (text f) text r =
def mfun_do_outline_options_r = r enddef ;
enddef ;
+vardef mfun_do_outline_text_set_u (text f) text r =
+ def mfun_do_outline_options_f = f enddef ;
+enddef ;
+
vardef mfun_do_outline_text_set_d (text d) text r =
def mfun_do_outline_options_d = d enddef ;
def mfun_do_outline_options_r = r enddef ;
@@ -1666,27 +1692,24 @@ def fillup text t = draw t withpostscript "both" enddef ; % we use draw bec
def eofillup text t = draw t withpostscript "eoboth" enddef ; % we use draw because we need the proper boundingbox
def eofill text t = fill t withpostscript "evenodd" enddef ;
def nofill text t = fill t withpostscript "collect" enddef ;
-%%% eoclip text t = clip t withpostscript "evenodd" enddef ; % no postscripts yet
+def nodraw text t = draw t withpostscript "collect" enddef ;
+def dodraw text t = draw t withpostscript "flush" enddef ;
+def dofill text t = fill t withpostscript "flush" enddef ;
-% def withrule expr r =
-% if (t = "even-odd") or (t = "evenodd") : withpostscript "evenodd" fi
-% enddef ;
+% maybe (saves a bogus path but the problem is that it can influence the dimensions):
-% so we can do: withcolor "red"
+% def dodraw text t = draw center currentpicture withpostscript "flush" enddef ;
+% def dofill text t = fill center currentpicture --cycle withpostscript "flush" enddef ;
-% We do a low level runscript:
-%
-% lua.mp.namedcolor(s) % conflicts with macro namedcolor
-% lua.mp.mf_named_color(s) % okay but, can also be
-% lua.mp("mf_named_color",s) % which gives expansion mess
+if contextlmtxmode :
+ def eoclip text t = clip t withpostscript "evenodd" enddef ;
+else :
+ def eoclip text t = clip t enddef ; % no postscripts yet
+fi ;
-def resolvedcolor primary s = % no vardef
- if string s :
- runscript("mp.mf_named_color('" & s & "')") % faster anyway
- else :
- s
- fi
-enddef ;
+% def withrule expr r =
+% if (t = "even-odd") or (t = "evenodd") : withpostscript "evenodd" fi
+% enddef ;
% A comment will end up on top of the graphic in the output. This can be handy for
% locating a graphic: comment("test graphic").
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-page.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/mp-page.mpiv
index eba66a005d2..7bc7c127c24 100644
--- a/Master/texmf-dist/metapost/context/base/mpiv/mp-page.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-page.mpiv
@@ -177,156 +177,13 @@ boolean context_page ; context_page := true ;
% the new way:
-def LoadPageState =
- % now always set
-enddef ;
-
-if unknown PageStateAvailable :
- boolean PageStateAvailable ;
- PageStateAvailable := false ;
-fi ;
-
-string CurrentLayout ; CurrentLayout := "default" ;
-
-% runscript("mp.PaperHeight()") % way faster of course
-
-vardef PaperHeight = lua.mp.PaperHeight () enddef ;
-vardef PaperWidth = lua.mp.PaperWidth () enddef ;
-vardef PrintPaperHeight = lua.mp.PrintPaperHeight () enddef ;
-vardef PrintPaperWidth = lua.mp.PrintPaperWidth () enddef ;
-vardef TopSpace = lua.mp.TopSpace () enddef ;
-vardef BottomSpace = lua.mp.BottomSpace () enddef ;
-vardef BackSpace = lua.mp.BackSpace () enddef ;
-vardef CutSpace = lua.mp.CutSpace () enddef ;
-vardef MakeupHeight = lua.mp.MakeupHeight () enddef ;
-vardef MakeupWidth = lua.mp.MakeupWidth () enddef ;
-vardef TopHeight = lua.mp.TopHeight () enddef ;
-vardef TopDistance = lua.mp.TopDistance () enddef ;
-vardef HeaderHeight = lua.mp.HeaderHeight () enddef ;
-vardef HeaderDistance = lua.mp.HeaderDistance () enddef ;
-vardef TextHeight = lua.mp.TextHeight () enddef ;
-vardef FooterDistance = lua.mp.FooterDistance () enddef ;
-vardef FooterHeight = lua.mp.FooterHeight () enddef ;
-vardef BottomDistance = lua.mp.BottomDistance () enddef ;
-vardef BottomHeight = lua.mp.BottomHeight () enddef ;
-vardef LeftEdgeWidth = lua.mp.LeftEdgeWidth () enddef ;
-vardef LeftEdgeDistance = lua.mp.LeftEdgeDistance () enddef ;
-vardef LeftMarginWidth = lua.mp.LeftMarginWidth () enddef ;
-vardef LeftMarginDistance = lua.mp.LeftMarginDistance () enddef ;
-vardef TextWidth = lua.mp.TextWidth () enddef ;
-vardef RightMarginDistance = lua.mp.RightMarginDistance () enddef ;
-vardef RightMarginWidth = lua.mp.RightMarginWidth () enddef ;
-vardef RightEdgeDistance = lua.mp.RightEdgeDistance () enddef ;
-vardef RightEdgeWidth = lua.mp.RightEdgeWidth () enddef ;
-vardef InnerMarginDistance = lua.mp.InnerMarginDistance () enddef ;
-vardef InnerMarginWidth = lua.mp.InnerMarginWidth () enddef ;
-vardef OuterMarginDistance = lua.mp.OuterMarginDistance () enddef ;
-vardef OuterMarginWidth = lua.mp.OuterMarginWidth () enddef ;
-vardef InnerEdgeDistance = lua.mp.InnerEdgeDistance () enddef ;
-vardef InnerEdgeWidth = lua.mp.InnerEdgeWidth () enddef ;
-vardef OuterEdgeDistance = lua.mp.OuterEdgeDistance () enddef ;
-vardef OuterEdgeWidth = lua.mp.OuterEdgeWidth () enddef ;
-vardef PageOffset = lua.mp.PageOffset () enddef ;
-vardef PageDepth = lua.mp.PageDepth () enddef ;
-vardef LayoutColumns = lua.mp.LayoutColumns () enddef ;
-vardef LayoutColumnDistance = lua.mp.LayoutColumnDistance() enddef ;
-vardef LayoutColumnWidth = lua.mp.LayoutColumnWidth () enddef ;
-
-vardef OnRightPage = lua.mp.OnRightPage () enddef ;
-vardef OnOddPage = lua.mp.OnOddPage () enddef ;
-vardef InPageBody = lua.mp.InPageBody () enddef ;
-
-vardef RealPageNumber = lua.mp.RealPageNumber () enddef ;
-vardef LastPageNumber = lua.mp.LastPageNumber () enddef ; % duplicates
-
-vardef PageNumber = lua.mp.PageNumber () enddef ;
-vardef NOfPages = lua.mp.NOfPages () enddef ;
-
-vardef SubPageNumber = lua.mp.SubPageNumber () enddef ;
-vardef NOfSubPages = lua.mp.NOfSubPages () enddef ;
-
-vardef CurrentColumn = lua.mp.CurrentColumn () enddef ;
-vardef NOfColumns = lua.mp.NOfColumns () enddef ;
-
-vardef BaseLineSkip = lua.mp.BaseLineSkip () enddef ;
-vardef LineHeight = lua.mp.LineHeight () enddef ;
-vardef BodyFontSize = lua.mp.BodyFontSize () enddef ;
-
-vardef TopSkip = lua.mp.TopSkip () enddef ;
-vardef StrutHeight = lua.mp.StrutHeight () enddef ;
-vardef StrutDepth = lua.mp.StrutDepth () enddef ;
-
-vardef CurrentWidth = lua.mp.CurrentWidth () enddef ;
-vardef CurrentHeight = lua.mp.CurrentHeight () enddef ;
-
-vardef HSize = lua.mp.HSize () enddef ; % duplicates
-vardef VSize = lua.mp.VSize () enddef ; % duplicates
-
-vardef EmWidth = lua.mp.EmWidth () enddef ;
-vardef ExHeight = lua.mp.ExHeight () enddef ;
-
-vardef PageFraction = lua.mp.PageFraction () enddef ;
-
-vardef SpineWidth = lua.mp.SpineWidth () enddef ;
-vardef PaperBleed = lua.mp.PaperBleed () enddef ;
-
-boolean mfun_swapped ;
-
-def SwapPageState =
- mfun_swapped := true ; % eventually this will go !
-enddef ;
-
-extra_beginfig := extra_beginfig & "mfun_swapped := false ;" ;
-
-vardef LeftMarginWidth = if mfun_swapped and not OnRightPage : lua.mp.RightMarginWidth () else : lua.mp.LeftMarginWidth () fi enddef ;
-vardef RightMarginWidth = if mfun_swapped and not OnRightPage : lua.mp.LeftMarginWidth () else : lua.mp.RightMarginWidth () fi enddef ;
-vardef LeftMarginDistance = if mfun_swapped and not OnRightPage : lua.mp.RightMarginDistance() else : lua.mp.LeftMarginDistance () fi enddef ;
-vardef RightMarginDistance = if mfun_swapped and not OnRightPage : lua.mp.LeftMarginDistance () else : lua.mp.RightMarginDistance() fi enddef ;
-
-vardef LeftEdgeWidth = if mfun_swapped and not OnRightPage : lua.mp.RightEdgeWidth () else : lua.mp.LeftEdgeWidth () fi enddef ;
-vardef RightEdgeWidth = if mfun_swapped and not OnRightPage : lua.mp.LeftEdgeWidth () else : lua.mp.RightEdgeWidth () fi enddef ;
-vardef LeftEdgeDistance = if mfun_swapped and not OnRightPage : lua.mp.RightEdgeDistance () else : lua.mp.LeftEdgeDistance () fi enddef ;
-vardef RightEdgeDistance = if mfun_swapped and not OnRightPage : lua.mp.LeftEdgeDistance () else : lua.mp.RightEdgeDistance () fi enddef ;
-
-vardef BackSpace = if mfun_swapped and not OnRightPage : PaperWidth - MakeupWidth - fi lua.mp.BackSpace() enddef ;
-vardef CutSpace = if mfun_swapped and not OnRightPage : PaperWidth - MakeupWidth - fi lua.mp.CutSpace () enddef ;
-
-% better use:
-
-vardef OuterMarginWidth = if not OnRightPage : lua.mp.LeftMarginWidth () else : lua.mp.RightMarginWidth () fi enddef ;
-vardef InnerMarginWidth = if not OnRightPage : lua.mp.RightMarginWidth () else : lua.mp.LeftMarginWidth () fi enddef ;
-vardef OuterMarginDistance = if not OnRightPage : lua.mp.LeftMarginDistance () else : lua.mp.RightMarginDistance() fi enddef ;
-vardef InnerMarginDistance = if not OnRightPage : lua.mp.RightMarginDistance() else : lua.mp.LeftMarginDistance () fi enddef ;
-
-vardef OuterEdgeWidth = if not OnRightPage : lua.mp.LeftEdgeWidth () else : lua.mp.RightEdgeWidth () fi enddef ;
-vardef InnerEdgeWidth = if not OnRightPage : lua.mp.RightEdgeWidth () else : lua.mp.LeftEdgeWidth () fi enddef ;
-vardef OuterEdgeDistance = if not OnRightPage : lua.mp.LeftEdgeDistance () else : lua.mp.RightEdgeDistance () fi enddef ;
-vardef InnerEdgeDistance = if not OnRightPage : lua.mp.RightEdgeDistance () else : lua.mp.LeftEdgeDistance () fi enddef ;
-
-vardef OuterSpaceWidth = if not OnRightPage : lua.mp.BackSpace () else : lua.mp.CutSpace () fi enddef ;
-vardef InnerSpaceWidth = if not OnRightPage : lua.mp.CutSpace () else : lua.mp.BackSpace () fi enddef ;
+def LoadPageState = enddef ; % now always set
+def SwapPageState = enddef ; % dynamic
-% indices
-
-vardef OuterMargin = if not OnRightPage : LeftMargin else : RightMargin fi enddef ;
-vardef InnerMargin = if not OnRightPage : RightMargin else : LeftMargin fi enddef ;
-
-vardef OuterEdge = if not OnRightPage : LeftEdge else : RightEdge fi enddef ;
-vardef InnerEdge = if not OnRightPage : Rightedge else : LeftEdge fi enddef ;
-
-% vardef CurrentLayout = lua.mp.CurrentLayout () enddef ;
-
-vardef OverlayWidth = lua.mp.OverlayWidth () enddef ;
-vardef OverlayHeight = lua.mp.OverlayHeight () enddef ;
-vardef OverlayDepth = lua.mp.OverlayDepth () enddef ;
-vardef OverlayLineWidth = lua.mp.OverlayLineWidth() enddef ;
-vardef OverlayOffset = lua.mp.OverlayOffset () enddef ;
-vardef OverlayRegion = lua.mp.OverlayRegion () enddef ;
-
-vardef defaultcolormodel = lua.mp.mf_default_color_model() enddef ;
-
-% def OverlayLineColor = lua.mp.OverlayLineColor() enddef ;
-% def OverlayColor = lua.mp.OverlayColor () enddef ;
+% if unknown PageStateAvailable :
+% boolean PageStateAvailable ;
+% PageStateAvailable := false ;
+% fi ;
% Next we implement the the page area model. First some constants.
@@ -604,13 +461,11 @@ enddef ;
def StartPage =
begingroup ;
- if mfun_first_run :
- if PageStateAvailable :
- LoadPageState ;
- SwapPageState ;
- fi ;
- SetPageVariables ;
- fi ;
+ % if PageStateAvailable :
+ % LoadPageState ;
+ % SwapPageState ;
+ % fi ;
+ SetPageVariables ;
BoundPageAreas ;
enddef ;
@@ -630,14 +485,11 @@ let SetCoverAreas = SetPageVariables ; % compatiblity
def StartCover =
begingroup ;
- if mfun_first_run :
- if PageStateAvailable :
- LoadPageState ;
- % SwapPageState ;
- fi ;
- SetPageVariables ; % was SetPageAreas ;
- SetCoverAreas ;
- fi ;
+ % if PageStateAvailable :
+ % LoadPageState ;
+ % fi ;
+ SetPageVariables ; % was SetPageAreas ;
+ SetCoverAreas ;
BoundCoverAreas ;
enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-page.mpxl b/Master/texmf-dist/metapost/context/base/mpiv/mp-page.mpxl
new file mode 100644
index 00000000000..8a4b735e016
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-page.mpxl
@@ -0,0 +1,243 @@
+%D \module
+%D [ file=mp-page.mpiv,
+%D version=1999.03.10,
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=page enhancements,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module is rather preliminary and subjected to changes.In the process of
+%D moving to \METAFUN2\ this might change.
+
+if known context_page : endinput ; fi ;
+
+boolean context_page ; context_page := true ;
+
+def LoadPageState = enddef ; % just in case some old style uses it
+
+% Next we implement the the page area model. First some constants.
+
+LeftEdge := -4 ; Top := -40 ;
+LeftEdgeSeparator := -3 ; TopSeparator := -30 ;
+LeftMargin := -2 ; Header := -20 ;
+LeftMarginSeparator := -1 ; HeaderSeparator := -10 ;
+Text := 0 ; Text := 0 ;
+RightMarginSeparator := +1 ; FooterSeparator := +10 ;
+RightMargin := +2 ; Footer := +20 ;
+RightEdgeSeparator := +3 ; BottomSeparator := +30 ;
+RightEdge := +4 ; Bottom := +40 ;
+
+numeric HorPos ; HorPos := 0 ;
+numeric VerPos ; VerPos := 0 ;
+
+% Because metapost > 1.50 has dynamic memory management and is less efficient than
+% before we now delay calculations ... (on a document with 150 pages the time spent
+% in mp was close to 5 seconds which was only due to initialising the page related
+% areas, something that was hardly noticeable before. At least now we're back to
+% half a second for such a case.
+
+def SetPageVsize =
+ numeric Vsize[] ;
+ Vsize[Top] = TopHeight ;
+ Vsize[TopSeparator] = TopDistance ;
+ Vsize[Header] = HeaderHeight ;
+ Vsize[HeaderSeparator] = HeaderDistance ;
+ Vsize[Text] = TextHeight ;
+ Vsize[FooterSeparator] = FooterDistance ;
+ Vsize[Footer] = FooterHeight ;
+ Vsize[BottomSeparator] = BottomDistance ;
+ Vsize[Bottom] = BottomHeight ;
+enddef ;
+
+def SetPageHsize =
+ numeric Hsize[] ;
+ Hsize[LeftEdge] = LeftEdgeWidth ;
+ Hsize[LeftEdgeSeparator] = LeftEdgeDistance ;
+ Hsize[LeftMargin] = LeftMarginWidth ;
+ Hsize[LeftMarginSeparator] = LeftMarginDistance ;
+ Hsize[Text] = MakeupWidth ;
+ Hsize[RightMarginSeparator] = RightMarginDistance ;
+ Hsize[RightMargin] = RightMarginWidth ;
+ Hsize[RightEdgeSeparator] = RightEdgeDistance ;
+ Hsize[RightEdge] = RightEdgeWidth ;
+enddef ;
+
+def SetPageVstep =
+ numeric Vstep[] ;
+ Vstep[Top] = Vstep[TopSeparator] +Vsize[TopSeparator] ;
+ Vstep[TopSeparator] = PaperHeight-TopSpace ;
+ Vstep[Header] = Vstep[TopSeparator] -Vsize[Header] ;
+ Vstep[HeaderSeparator] = Vstep[Header] -Vsize[HeaderSeparator] ;
+ Vstep[Text] = Vstep[HeaderSeparator]-Vsize[Text] ;
+ Vstep[FooterSeparator] = Vstep[Text] -Vsize[FooterSeparator] ;
+ Vstep[Footer] = Vstep[FooterSeparator]-Vsize[Footer] ;
+ Vstep[BottomSeparator] = Vstep[Footer] -Vsize[BottomSeparator] ;
+ Vstep[Bottom] = Vstep[BottomSeparator]-Vsize[Bottom] ;
+enddef ;
+
+def SetPageHstep =
+ numeric Hstep[] ;
+ Hstep[LeftEdge] = Hstep[LeftEdgeSeparator] -Hsize[LeftEdge] ;
+ Hstep[LeftEdgeSeparator] = Hstep[LeftMargin] -Hsize[LeftEdgeSeparator] ;
+ Hstep[LeftMargin] = Hstep[LeftMarginSeparator] -Hsize[LeftMargin] ;
+ Hstep[LeftMarginSeparator] = Hstep[Text] -Hsize[LeftMarginSeparator] ;
+ Hstep[Text] = BackSpace ;
+ Hstep[RightMarginSeparator] = Hstep[Text] +Hsize[Text] ;
+ Hstep[RightMargin] = Hstep[RightMarginSeparator]+Hsize[RightMarginSeparator] ;
+ Hstep[RightEdgeSeparator] = Hstep[RightMargin] +Hsize[RightMargin] ;
+ Hstep[RightEdge] = Hstep[RightEdgeSeparator] +Hsize[RightEdgeSeparator] ;
+enddef ;
+
+def SetPageArea =
+ path Area[][] ;
+ for VerPos=Top step 10 until Bottom:
+ for HorPos=LeftEdge step 1 until RightEdge:
+ Area[HorPos][VerPos] := unitsquare xscaled Hsize[HorPos] yscaled Vsize[VerPos] ;
+ Area[VerPos][HorPos] := Area[HorPos][VerPos] ;
+ endfor ;
+ endfor ;
+enddef ;
+
+def SetPageLocation =
+ pair Location[][] ;
+ for VerPos=Top step 10 until Bottom:
+ for HorPos=LeftEdge step 1 until RightEdge:
+ Location[HorPos][VerPos] := (Hstep[HorPos],Vstep[VerPos]) ;
+ Location[VerPos][HorPos] := Location[HorPos][VerPos] ;
+ endfor ;
+ endfor ;
+enddef ;
+
+def SetPageField =
+ path Field[][] ;
+ for VerPos=Top step 10 until Bottom:
+ for HorPos=LeftEdge step 1 until RightEdge:
+ Field[HorPos][VerPos] := unitsquare xscaled Hsize[HorPos] yscaled Vsize[VerPos] shifted (Hstep[HorPos],Vstep[VerPos]) ;
+ Field[VerPos][HorPos] := Field[HorPos][VerPos] ;
+ endfor ;
+ endfor ;
+enddef ;
+
+def Area = hide(SetPageArea ;) Area enddef ;
+def Location = hide(SetPageLocation ;) Location enddef ;
+def Field = hide(SetPageField ;) Field enddef ;
+def Vsize = hide(SetPageVsize ;) Vsize enddef ;
+def Hsize = hide(SetPageHsize ;) Hsize enddef ;
+def Vstep = hide(SetPageVstep ;) Vstep enddef ;
+def Hstep = hide(SetPageHstep ;) Hstep enddef ;
+
+vardef FrontPageWidth = PaperWidth enddef ;
+vardef BackPageWidth = PaperWidth enddef ;
+vardef CoverWidth = 2 * PaperWidth + SpineWidth enddef ;
+vardef CoverHeight = PaperHeight enddef ;
+
+vardef FrontPageHeight = PaperHeight enddef ;
+vardef BackPageHeight = PaperHeight enddef ;
+vardef SpineHeight = PaperHeight enddef ;
+
+def SetPagePage = path Page ; Page := unitsquare xscaled PaperWidth yscaled PaperHeight ; enddef ;
+def SetPageCoverPage = path CoverPage ; CoverPage := unitsquare xscaled CoverWidth yscaled CoverHeight ; enddef ;
+def SetPageSpine = path Spine ; Spine := unitsquare xscaled SpineWidth yscaled CoverHeight shifted (BackPageWidth,0) ; enddef ;
+def SetPageBackPage = path BackPage ; BackPage := unitsquare xscaled BackPageWidth yscaled CoverHeight ; enddef ;
+def SetPageFrontPage = path FrontPage ; FrontPage := unitsquare xscaled FrontPageWidth yscaled CoverHeight shifted (BackPageWidth+SpineWidth,0) ; enddef ;
+
+def Page = hide(SetPagePage ;) Page enddef ;
+def CoverPage = hide(SetPageCoverPage;) CoverPage enddef ;
+def Spine = hide(SetPageSpine ;) Spine enddef ;
+def BackPage = hide(SetPageBackPage ;) BackPage enddef ;
+def FrontPage = hide(SetPageFrontPage;) FrontPage enddef ;
+
+% pages
+
+def StartPage =
+ begingroup ;
+ setbounds currentpicture to Page ;
+enddef ;
+
+def StopPage =
+ setbounds currentpicture to Page ;
+ endgroup ;
+enddef ;
+
+% cover pages
+
+def StartCover =
+ begingroup ;
+ setbounds currentpicture to CoverPage enlarged PaperBleed ;
+enddef ;
+
+def StopCover =
+ setbounds currentpicture to CoverPage enlarged PaperBleed ;
+ endgroup ;
+enddef ;
+
+% overlays:
+
+def OverlayBox =
+ (unitsquare xyscaled (OverlayWidth,OverlayHeight))
+enddef ;
+
+% handy
+
+def innerenlarged =
+ if OnRightPage : leftenlarged else : rightenlarged fi
+enddef ;
+
+def outerenlarged =
+ if OnRightPage : rightenlarged else : leftenlarged fi
+enddef ;
+
+% obsolete
+
+% def llEnlarged (expr p,d) = (llcorner p shifted (-d,-d)) enddef ;
+% def lrEnlarged (expr p,d) = (lrcorner p shifted (+d,-d)) enddef ;
+% def urEnlarged (expr p,d) = (urcorner p shifted (+d,+d)) enddef ;
+% def ulEnlarged (expr p,d) = (ulcorner p shifted (-d,+d)) enddef ;
+
+% def Enlarged (expr p, d) =
+% (
+% llEnlarged (p,d) --
+% lrEnlarged (p,d) --
+% urEnlarged (p,d) --
+% ulEnlarged (p,d) --
+% cycle
+% )
+% enddef ;
+
+% for the moment we put these here:
+
+string RuleDirection ; RuleDirection := "" ;
+string RuleOption ; RuleOption := "" ;
+numeric RuleWidth ; RuleWidth := 0 ;
+numeric RuleHeight ; RuleHeight := 0 ;
+numeric RuleDepth ; RuleDepth := 0 ;
+numeric RuleH ; RuleH := 0 ;
+numeric RuleV ; RuleV := 0 ;
+numeric RuleThickness ; RuleThickness := 0 ;
+numeric RuleFactor ; RuleFactor := 0 ;
+numeric RuleOffset ; RuleOffset := 0 ;
+ def RuleColor = (.5white) enddef ;
+
+def FakeWord(expr RuleWidth, RuleHeight, RuleDepth, RuleThickness) (text RuleColor) =
+ fill unitsquare
+ xscaled RuleWidth
+ yscaled (RuleDepth-RuleThickness/2)
+ withcolor RuleColor ;
+ fill unitsquare
+ xscaled RuleWidth
+ yscaled (RuleHeight-RuleDepth-RuleThickness/2)
+ shifted (0,RuleDepth+RuleThickness)
+ withcolor RuleColor ;
+enddef ;
+
+def FakeRule(expr RuleWidth, RuleHeight, RuleDepth, RuleThickness) (text RuleColor) =
+ fill unitsquare
+ xscaled RuleWidth
+ yscaled RuleHeight
+ withcolor RuleColor ;
+enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-tool.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/mp-tool.mpiv
index 2cdb5fb3983..b05adcc8b70 100644
--- a/Master/texmf-dist/metapost/context/base/mpiv/mp-tool.mpiv
+++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-tool.mpiv
@@ -445,7 +445,7 @@ vardef sinh primary x = save xx ; xx = exp x ; (xx-1/xx)/2 enddef ;
vardef cosh primary x = save xx ; xx = exp x ; (xx+1/xx)/2 enddef ;
vardef tanh primary x = save xx ; xx = exp x ; (xx-1/xx)/(xx+1/xx) enddef ;
-%D Like mod, but useful for anglesl it returns (-.5d,+.5d] and is used
+%D Like mod, but useful for angles, it returns (-.5d,+.5d] and is used
%D in for instance mp-chem.
primarydef a zmod b = (-((b/2 - a) mod b) + b/2) enddef ;
@@ -886,6 +886,13 @@ vardef roundedsquare (expr width, height, offset) =
(0,height-offset) -- (0,offset) {down} .. cycle
enddef ;
+vardef roundedsquarexy (expr width, height, dx, dy) =
+ (dx,0) -- (width-dx,0) {right} ..
+ (width,dy) -- (width,height-dy) {up} ..
+ (width-dx,height) -- (dx,height) {left} ..
+ (0,height-dy) -- (0,dy) {down} .. cycle
+enddef ;
+
%D Some colors.
def resolvedcolor(expr s) =
@@ -895,9 +902,36 @@ enddef ;
let normalwithcolor = withcolor ;
def withcolor expr c =
- normalwithcolor if string c : resolvedcolor(c) else : c fi
+ normalwithcolor if string c : resolvedcolor(c) else : c fi
enddef ;
+% I don't want a "withcolor black" in case of an empty string ... who knows
+% how that can interfere with outer colors. Somehow the next one doesn't
+% always work out ok, but why ... must be some parsing issue. Anyway, when
+% we cannot do that, we need to fix some chem macros instead as empty strings
+% now lead to black while everywhere else in context empty means: leave color
+% untouched.
+
+% def withcolor expr c =
+% if not string c :
+% normalwithcolor c
+% elseif c <> "" :
+% normalwithcolor resolvedcolor(c)
+% fi
+% enddef ;
+
+% So why does this work better than the above:
+%
+% def withcolor expr c =
+% if string c :
+% if c <> "" :
+% normalwithcolor resolvedcolor(c)
+% fi
+% else :
+% normalwithcolor c
+% fi
+% enddef ;
+
vardef colortype expr c =
if cmykcolor c : cmykcolor
elseif rgbcolor c : rgbcolor
@@ -1392,7 +1426,7 @@ def drawcontrollines expr c = path _c_ ; _c_ := c ; mfun_draw_controllines end
def drawpointlabels expr c = path _c_ ; _c_ := c ; mfun_draw_pointlabels enddef ;
def mfun_draw_points text t =
- for _i_=0 upto length(_c_) :
+ for _i_=0 upto length(_c_) if cycle _c_ : -1 fi :
normaldraw point _i_ of _c_ _pnt_opt_ t ;
endfor ;
enddef;
@@ -1416,7 +1450,7 @@ numeric pointlabelscale ; pointlabelscale := 0 ;
string pointlabelfont ; pointlabelfont := "" ;
def mfun_draw_pointlabels text t =
- for _i_=0 upto length(_c_) :
+ for _i_=0 upto length(_c_) if cycle _c_ : -1 fi :
pair _u_ ; _u_ := unitvector(direction _i_ of _c_) rotated if swappointlabels : - fi 90 ;
pair _p_ ; _p_ := (point _i_ of _c_) ;
begingroup ;
@@ -1848,8 +1882,7 @@ def rightarrow (expr pat,tim,len) = pointarrow(pat,tim,len,-len) enddef ;
def leftarrow (expr pat,tim,len) = pointarrow(pat,tim,len,+len) enddef ;
def centerarrow (expr pat,tim,len) = pointarrow(pat,tim,len, 0) enddef ;
-%D The \type {along} and \type {on} operators can be used
-%D as follows:
+%D The \type {along} and \type {on} operators can be used as follows:
%D
%D \starttyping
%D drawdot point .5 along somepath ;
@@ -3602,3 +3635,42 @@ enddef ;
% endfor;
% n
% enddef;
+
+vardef mfun_timestamp =
+ decimal year & "-" &
+ decimal month & "-" &
+ decimal day & " " &
+ if ((time div 60) < 10) : "0" & fi
+ decimal (time div 60) & ":" &
+ if ((time-(time div 60)*60) < 10) : "0" & fi
+ decimal (time-(time div 60)*60)
+enddef ;
+
+vardef totransform(expr x, y, xx, xy, yx, yy) =
+ save t ; transform t ;
+ xxpart t = xx ; yypart t = yy ;
+ xypart t = xy ; yxpart t = yx ;
+ xpart t = x ; ypart t = y ;
+ t
+enddef ;
+
+vardef bymatrix(expr rx, sx, sy, ry, tx, ty) =
+ save t ; transform t ;
+ xxpart t = rx ; yypart t = ry ;
+ xypart t = sx ; yxpart t = sy ;
+ xpart t = tx ; ypart t = ty ;
+ t
+enddef ;
+
+let xslanted = slanted ;
+
+def yslanted primary s =
+ transformed
+ begingroup
+ save t ; transform t ;
+ xxpart t = 1 ; yypart t = 1 ;
+ xypart t = 0 ; yxpart t = s ;
+ xpart t = 0 ; ypart t = 0 ;
+ t
+ endgroup
+enddef ;
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-base.lua b/Master/texmf-dist/scripts/context/lua/mtx-base.lua
index bcc9aeb602b..eab82c9005e 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-base.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-base.lua
@@ -76,14 +76,6 @@ elseif environment.arguments["find-path"] then
resolvers.load()
local path = resolvers.findpath(environment.files[1], fileformat)
print(path) -- quite basic, wil become function in logs
-elseif environment.arguments["run"] then
- resolvers.load("nofiles") -- ! no need for loading databases
- trackers.enable("resolvers.locating")
- environment.run_format(environment.files[1] or "",environment.files[2] or "",environment.files[3] or "")
-elseif environment.arguments["fmt"] then
- resolvers.load("nofiles") -- ! no need for loading databases
- trackers.enable("resolvers.locating")
- environment.run_format(environment.arguments["fmt"], environment.files[1] or "",environment.files[2] or "")
elseif environment.arguments["expand-braces"] then
resolvers.load("nofiles")
resolvers.dowithfilesandreport(resolvers.expandbraces, environment.files)
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-cache.lua b/Master/texmf-dist/scripts/context/lua/mtx-cache.lua
index 56d3df188d2..4f378ff0a69 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-cache.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-cache.lua
@@ -12,12 +12,12 @@ local helpinfo = [[
<metadata>
<entry name="name">mtx-cache</entry>
<entry name="detail">ConTeXt &amp; MetaTeX Cache Management</entry>
- <entry name="version">0.10</entry>
+ <entry name="version">1.01</entry>
</metadata>
<flags>
<category name="basic">
<subcategory>
- <flag name="purge"><short>remove not used files</short></flag>
+ <flag name="make"><short>generate databases and formats</short></flag>
<flag name="erase"><short>completely remove cache</short></flag>
<flag name="list"><short>show cache</short></flag>
</subcategory>
@@ -48,97 +48,86 @@ scripts.cache = scripts.cache or { }
local function collect(path)
local all = dir.glob(path .. "/**/*")
- local tmas, tmcs, rest = { }, { }, { }
+ local ext = table.setmetatableindex("table")
for i=1,#all do
local name = all[i]
- local suffix = filesuffix(name)
- if suffix == "tma" then
- tmas[#tmas+1] = name
- elseif suffix == "tmc" then
- tmcs[#tmcs+1] = name
- else
- rest[#rest+1] = name
- end
+ local list = ext[filesuffix(name)]
+ list[#list+1] = name
end
- return tmas, tmcs, rest, all
+ return ext
end
-local function list(banner,path,tmas,tmcs,rest)
+local function list(banner,path,ext)
+ local total = 0
report("%s: %s",banner,path)
report()
- report("tma : %4i",#tmas)
- report("tmc : %4i",#tmcs)
- report("rest : %4i",#rest)
- report("total : %4i",#tmas+#tmcs+#rest)
+ for k, v in table.sortedhash(ext) do
+ total = total + #v
+ report("%-6s : %4i",k,#v)
+ end
+ report()
+ report("total : %4i",total)
report()
end
-local function purge(banner,path,list,all)
+local function erase(banner,path,list)
report("%s: %s",banner,path)
report()
- local fonts = environment.argument("fonts")
- local n = 0
- for i=1,#list do
- local filename = list[i]
- if find(filename,"luatex%-cache") then -- safeguard
- if fonts and not find(filename,"fonts") then
- -- skip
- elseif all then
+ for ext, list in table.sortedhash(list) do
+ local gone = 0
+ local kept = 0
+ for i=1,#list do
+ local filename = list[i]
+ if find(filename,"luatex%-cache") then
remove(filename)
- n = n + 1
- elseif not fonts or find(filename,"fonts") then
- local suffix = filesuffix(filename)
- if suffix == "tma" then
- local checkname = replacesuffix(filename,"tma","tmc")
- if isfile(checkname) then
- remove(filename)
- n = n + 1
- end
+ if isfile(filename) then
+ kept = kept + 1
+ else
+ gone = gone + 1
end
end
end
+ report("%-6s : %4i gone, %4i kept",ext,gone,kept)
end
- report("removed tma files : %i",n)
report()
- return n
end
-function scripts.cache.purge()
- local writable = caches.getwritablepath()
- local tmas, tmcs, rest = collect(writable)
- list("writable path",writable,tmas,tmcs,rest)
- purge("writable path",writable,tmas)
- list("writable path",writable,tmas,tmcs,rest)
+function scripts.cache.make()
+ os.execute("mtxrun --generate")
+ os.execute("context --make")
+ os.execute("mtxrun --script font --reload")
end
function scripts.cache.erase()
local writable = caches.getwritablepath()
- local tmas, tmcs, rest, all = collect(writable)
- list("writable path",writable,tmas,tmcs,rest)
- purge("writable path",writable,all,true)
- list("writable path",writable,tmas,tmcs,rest)
+ local groups = collect(writable)
+ list("writable path",writable,groups)
+ erase("writable path",writable,groups)
+ if environment.argument("make") then
+ scripts.cache.make()
+ end
end
function scripts.cache.list()
local readables = caches.getreadablepaths()
- local writable = caches.getwritablepath()
- local tmas, tmcs, rest = collect(writable)
- list("writable path",writable,tmas,tmcs,rest)
+ local writable = caches.getwritablepath()
+ local groups = collect(writable)
+ list("writable path",writable,groups)
for i=1,#readables do
local readable = readables[i]
if readable ~= writable then
- local tmas, tmcs = collect(readable)
- list("readable path",readable,tmas,tmcs,rest)
+ local groups = collect(readable)
+ list("readable path",readable,groups)
end
end
end
-if environment.argument("purge") then
- scripts.cache.purge()
-elseif environment.argument("erase") then
+if environment.argument("erase") then
scripts.cache.erase()
elseif environment.argument("list") then
scripts.cache.list()
+elseif environment.argument("make") then
+ scripts.cache.make()
elseif environment.argument("exporthelp") then
application.export(environment.argument("exporthelp"),environment.files[1])
else
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-check.lua b/Master/texmf-dist/scripts/context/lua/mtx-check.lua
index 16b9cb64a82..90f358cce68 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-check.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-check.lua
@@ -184,6 +184,9 @@ local grammars = {
tex = contextgrammar,
mkii = contextgrammar,
mkiv = contextgrammar,
+ mkvi = contextgrammar,
+ mkil = contextgrammar,
+ mkli = contextgrammar,
}
function validator.check(str,filetype)
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-context.lua b/Master/texmf-dist/scripts/context/lua/mtx-context.lua
index 49d40dda8c4..4e8c364d57f 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-context.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-context.lua
@@ -12,7 +12,7 @@ if not modules then modules = { } end modules['mtx-context'] = {
local type, next, tostring, tonumber = type, next, tostring, tonumber
local format, gmatch, match, gsub, find = string.format, string.gmatch, string.match, string.gsub, string.find
local quote, validstring = string.quote, string.valid
-local sort, concat, insert, sortedhash = table.sort, table.concat, table.insert, table.sortedhash
+local sort, concat, insert, sortedhash, tohash = table.sort, table.concat, table.insert, table.sortedhash, table.tohash
local settings_to_array = utilities.parsers.settings_to_array
local appendtable = table.append
local lpegpatterns, lpegmatch, Cs, P = lpeg.patterns, lpeg.match, lpeg.Cs, lpeg.P
@@ -34,7 +34,7 @@ local formatters = string.formatters
local application = logs.application {
name = "mtx-context",
- banner = "ConTeXt Process Management 1.02",
+ banner = "ConTeXt Process Management 1.03",
-- helpinfo = helpinfo, -- table with { category_a = text_1, category_b = text_2 } or helpstring or xml_blob
helpinfo = "mtx-context.xml",
}
@@ -209,7 +209,11 @@ local persistent_runfiles = {
}
local special_runfiles = {
- "%-mpgraph", "%-mprun", "%-temp%-"
+ "%-mpgraph", "%-mprun", "%-temp%-",
+}
+
+local extra_runfiles = {
+ "^l_m_t_x_.-%.pdf$",
}
local function purge_file(dfile,cfile)
@@ -514,35 +518,7 @@ local function result_save_keep(oldbase,newbase)
end
end
--- executing luatex
-
-local function flags_to_string(flags,prefix) -- context flags get prepended by c:
- local t = { }
- for k, v in table.sortedhash(flags) do
- if prefix then
- k = format("c:%s",k)
- end
- if not v or v == "" or v == '""' then
- -- no need to flag false
- elseif v == true then
- t[#t+1] = format('--%s',k)
- elseif type(v) == "string" then
- t[#t+1] = format('--%s=%s',k,quote(v))
- else
- t[#t+1] = format('--%s=%s',k,tostring(v))
- end
- end
- return concat(t," ")
-end
-
-local function luatex_command(l_flags,c_flags,filename,engine)
- return format('%s %s %s "%s"',
- engine or (status and status.luatex_engine) or "luatex",
- flags_to_string(l_flags),
- flags_to_string(c_flags,true),
- filename
- )
-end
+-- use mtx-plain instead
local plain_formats = {
["plain"] = "plain",
@@ -563,10 +539,10 @@ local function run_plain(plainformat,filename)
local pdfview = getargument("autopdf") or getargument("closepdf")
if pdfview then
pdf_close(resultname,pdfview)
- os.execute(command)
+ os.execute(command) -- maybe also a proper runner
pdf_open(resultname,pdfview)
else
- os.execute(command)
+ os.execute(command) -- maybe also a proper runner
end
end
end
@@ -599,8 +575,32 @@ local function run_texexec(filename,a_purge,a_purgeall)
end
end
+-- executing luatex
+
+local function flags_to_string(flags,prefix)
+ -- context flags get prepended by c: ... this will move to the sbx module
+ local t = { }
+ for k, v in table.sortedhash(flags) do
+ if prefix then
+ k = format("c:%s",k)
+ end
+ if not v or v == "" or v == '""' then
+ -- no need to flag false
+ elseif v == true then
+ t[#t+1] = format('--%s',k)
+ elseif type(v) == "string" then
+ t[#t+1] = format('--%s=%s',k,quote(v))
+ else
+ t[#t+1] = format('--%s=%s',k,tostring(v))
+ end
+ end
+ return concat(t," ")
+end
+
function scripts.context.run(ctxdata,filename)
--
+ local verbose = false
+ --
local a_nofile = getargument("nofile")
local a_engine = getargument("engine")
--
@@ -627,9 +627,10 @@ function scripts.context.run(ctxdata,filename)
return
end
--
- local interface = validstring(getargument("interface")) or "en"
+ local interface = validstring(getargument("interface")) or "en"
local formatname = formatofinterface[interface] or "cont-en"
- local formatfile, scriptfile = resolvers.locateformat(formatname) -- regular engine !
+ local formatfile,
+ scriptfile = resolvers.locateformat(formatname) -- regular engine !
if not formatfile or not scriptfile then
report("warning: no format found, forcing remake (commandline driven)")
scripts.context.make(formatname)
@@ -667,17 +668,6 @@ function scripts.context.run(ctxdata,filename)
local a_nodates = getargument("nodates")
local a_trailerid = getargument("trailerid")
local a_nocompression = getargument("nocompression")
-
- -- the following flag is not officially supported because i cannot forsee
- -- side effects (so no bug reports please) .. we provide --sandbox that
- -- does similar things but tries to ensure that context works as expected
-
- -- local a_safer = getargument("safer")
- --
- -- if a_safer then
- -- report("warning: using the luatex safer options, processing is not guaranteed")
- -- end
-
--
a_batchmode = (a_batchmode and "batchmode") or (a_nonstopmode and "nonstopmode") or (a_scrollmode and "scrollmode") or nil
--
@@ -820,8 +810,8 @@ function scripts.context.run(ctxdata,filename)
-- ["safer"] = a_safer, -- better use --sandbox
-- ["no-mktex"] = true,
-- ["file-line-error-style"] = true,
- ["fmt"] = formatfile,
- ["lua"] = scriptfile,
+-- ["fmt"] = formatfile,
+-- ["lua"] = scriptfile,
["jobname"] = jobname,
["jithash"] = a_jithash,
}
@@ -868,15 +858,17 @@ function scripts.context.run(ctxdata,filename)
c_flags.noarrange = a_noarrange or a_arrange or nil
c_flags.profile = a_profile and (tonumber(a_profile) or 0) or nil
--
- local command = luatex_command(l_flags,c_flags,mainfile,a_engine)
- --
- report("run %s: %s",currentrun,command)
print("") -- cleaner, else continuation on same line
--- local returncode, errorstring = os.spawn(command)
- local returncode = os.execute(command)
+ local returncode = environment.run_format(
+ formatfile,
+ scriptfile,
+ mainfile,
+ flags_to_string(l_flags),
+ flags_to_string(c_flags,true),
+ verbose
+ )
-- todo: remake format when no proper format is found
if not returncode then
--- report("fatal error: no return code, message: %s",errorstring or "?")
report("fatal error: no return code")
if resultname then
result_save_error(oldbase,newbase)
@@ -908,6 +900,15 @@ function scripts.context.run(ctxdata,filename)
--
end
--
+ if environment.arguments["ansilog"] then
+ local logfile = file.replacesuffix(jobname,"log")
+ local logdata = io.loaddata(logfile) or ""
+ if logdata ~= "" then
+ io.savedata(logfile,(gsub(logdata,"%[.-m","")))
+ end
+ end
+ --
+ --
-- this will go away after we update luatex
--
local syncctx = fileaddsuffix(jobname,"syncctx")
@@ -922,10 +923,17 @@ function scripts.context.run(ctxdata,filename)
c_flags.currentrun = c_flags.currentrun + 1
c_flags.noarrange = nil
--
- local command = luatex_command(l_flags,c_flags,mainfile,a_engine)
- --
report("arrange run: %s",command)
- local returncode, errorstring = os.spawn(command)
+ --
+ local returncode = environment.run_format(
+ formatfile,
+ scriptfile,
+ mainfile,
+ flags_to_string(l_flags),
+ flags_to_string(c_flags,true),
+ verbose
+ )
+ --
if not returncode then
report("fatal error: no return code, message: %s",errorstring or "?")
os.exit(1)
@@ -985,7 +993,7 @@ function scripts.context.run(ctxdata,filename)
report()
report("making epub file: ",command)
report()
- os.execute(command)
+ os.execute(command) -- todo: also a runner
end
--
if a_timing then
@@ -1047,20 +1055,24 @@ function scripts.context.pipe() -- still used?
io.savedata(filename,"\\relax")
report("entering scrollmode using '%s' with optionfile, end job with \\end",filename)
end
- local command = luatex_command(l_flags,c_flags,filename)
- os.spawn(command)
+ local returncode = environment.run_format(
+ formatfile,
+ scriptfile,
+ filename,
+ flags_to_string(l_flags),
+ flags_to_string(c_flags,true),
+ verbose
+ )
if getargument("purge") then
scripts.context.purge_job(filename)
elseif getargument("purgeall") then
scripts.context.purge_job(filename,true)
removefile(filename)
end
+ elseif formatname then
+ report("error, no format found with name: %s, aborting",formatname)
else
- if formatname then
- report("error, no format found with name: %s, aborting",formatname)
- else
- report("error, no format found (provide formatname or interface)")
- end
+ report("error, no format found (provide formatname or interface)")
end
end
@@ -1231,7 +1243,7 @@ function scripts.context.autoctx()
if chunk then
ctxname = match(chunk,"<%?context%-directive%s+job%s+ctxfile%s+([^ ]-)%s*?>")
end
- elseif suffix == "tex" or suffix == "mkiv" then
+ elseif suffix == "tex" or suffix == "mkiv" or suffix == "mkxl" then
local analysis = preamble_analyze(firstfile)
ctxname = analysis.ctxfile or analysis.ctx
end
@@ -1245,66 +1257,27 @@ function scripts.context.autoctx()
scripts.context.run(ctxdata)
end
--- no longer ok as mlib-run misses something:
-
--- local template = [[
--- \starttext
--- \directMPgraphic{%s}{input "%s"}
--- \stoptext
--- ]]
---
--- local loaded = false
---
--- function scripts.context.metapost()
--- local filename = environment.filenames[1] or ""
--- if not loaded then
--- dofile(resolvers.findfile("mlib-run.lua"))
--- loaded = true
--- commands = commands or { }
--- commands.writestatus = report -- no longer needed
--- end
--- local formatname = getargument("format") or "metafun"
--- if formatname == "" or type(formatname) == "boolean" then
--- formatname = "metafun"
--- end
--- if getargument("pdf") then
--- local basename = removesuffix(filename)
--- local resultname = getargument("result") or basename
--- local jobname = "mtx-context-metapost"
--- local tempname = fileaddsuffix(jobname,"tex")
--- io.savedata(tempname,format(template,"metafun",filename))
--- environment.filenames[1] = tempname
--- setargument("result",resultname)
--- setargument("once",true)
--- scripts.context.run()
--- scripts.context.purge_job(jobname,true)
--- scripts.context.purge_job(resultname,true)
--- elseif getargument("svg") then
--- metapost.directrun(formatname,filename,"svg")
--- else
--- metapost.directrun(formatname,filename,"mps")
--- end
--- end
-
--- --
-
function scripts.context.version()
- local name = resolvers.findfile("context.mkiv")
- if name ~= "" then
- report("main context file: %s",name)
- local data = io.loaddata(name)
- if data then
- local version = match(data,"\\edef\\contextversion{(.-)}")
- if version then
- report("current version: %s",version)
+ local list = { "context.mkiv", "context.mkxl" }
+ for i=1,#list do
+ local base = list[i]
+ local name = resolvers.findfile(base)
+ if name ~= "" then
+ report("main context file: %s",name)
+ local data = io.loaddata(name)
+ if data then
+ local version = match(data,"\\edef\\contextversion{(.-)}")
+ if version then
+ report("current version: %s",version)
+ else
+ report("context version: unknown, no timestamp found")
+ end
else
- report("context version: unknown, no timestamp found")
+ report("context version: unknown, load error")
end
else
- report("context version: unknown, load error")
+ report("main context file: unknown, %a not found",base)
end
- else
- report("main context file: unknown, 'context.mkiv' not found")
end
end
@@ -1340,15 +1313,15 @@ function scripts.context.purge_job(jobname,all,mkiitoo,fulljobname)
end
function scripts.context.purge(all,pattern,mkiitoo)
- local all = all or getargument("all")
- local pattern = getargument("pattern") or (pattern and (pattern.."*")) or "*.*"
- local files = dir.glob(pattern)
- local obsolete = table.tohash(obsolete_results)
- local temporary = table.tohash(temporary_runfiles)
- local synctex = table.tohash(synctex_runfiles)
- local persistent = table.tohash(persistent_runfiles)
- local generic = table.tohash(generic_files)
- local deleted = { }
+ local all = all or getargument("all")
+ local pattern = getargument("pattern") or (pattern and (pattern.."*")) or "*.*"
+ local files = dir.glob(pattern)
+ local obsolete = tohash(obsolete_results)
+ local temporary = tohash(temporary_runfiles)
+ local synctex = tohash(synctex_runfiles)
+ local persistent = tohash(persistent_runfiles)
+ local generic = tohash(generic_files)
+ local deleted = { }
for i=1,#files do
local name = files[i]
local suffix = filesuffix(name)
@@ -1362,6 +1335,11 @@ function scripts.context.purge(all,pattern,mkiitoo)
end
end
end
+ for i=1,#extra_runfiles do
+ if find(basename,extra_runfiles[i]) then
+ deleted[#deleted+1] = purge_file(name)
+ end
+ end
end
if #deleted > 0 then
report("purged files: %s", concat(deleted,", "))
@@ -1422,17 +1400,19 @@ local function touchfiles(suffix,kind,path)
end
end
+local tobetouched = tohash { "mkii", "mkiv", "mkvi", "mkxl", "mklx" }
+
function scripts.context.touch()
if getargument("expert") then
local touch = getargument("touch")
local kind = getargument("kind")
local path = getargument("basepath")
- if touch == "mkii" or touch == "mkiv" or touch == "mkvi" then -- mkix mkxi
+ if tobetouched[touch] then -- mkix mkxi ctix ctxi
touchfiles(touch,kind,path)
else
- touchfiles("mkii",kind,path)
- touchfiles("mkiv",kind,path)
- touchfiles("mkvi",kind,path)
+ for touch in sortedhash(tobetouched) do
+ touchfiles(touch,kind,path)
+ end
end
else
report("touching needs --expert")
@@ -1442,7 +1422,8 @@ end
-- modules
local labels = { "title", "comment", "status" }
-local cards = { "*.mkvi", "*.mkiv", "*.mkxi", "*.mkix", "*.tex" }
+local cards = { "*.mkiv", "*.mkvi", "*.mkix", "*.mkxi", "*.mkxl", "*.mklx", "*.tex" }
+local valid = tohash { "mkiv", "mkvi", "mkix", "mkxi", "mkxl", "mklx", "tex" }
function scripts.context.modules(pattern)
local list = { }
@@ -1468,7 +1449,7 @@ function scripts.context.modules(pattern)
if not done[base] then
done[base] = true
local suffix = filesuffix(base)
- if suffix == "tex" or suffix == "mkiv" or suffix == "mkvi" or suffix == "mkix" or suffix == "mkxi" then
+ if valid[suffix] then
local prefix, rest = match(base,"^([xmst])%-(.*)")
if prefix then
v = resolvers.findfile(base) -- so that files on my dev path are seen
@@ -1588,148 +1569,10 @@ function scripts.context.logcategories()
scripts.context.run()
end
--- updating (often one will use mtx-update instead)
-
function scripts.context.timed(action)
statistics.timed(action,true)
end
-local zipname = "cont-tmf.zip"
-local mainzip = "http://www.pragma-ade.com/context/latest/" .. zipname
-local validtrees = { "texmf-local", "texmf-context" }
-local selfscripts = { "mtxrun.lua" } -- was: { "luatools.lua", "mtxrun.lua" }
-
-function zip.loaddata(zipfile,filename) -- should be in zip lib
- local f = zipfile:open(filename)
- if f then
- local data = f:read("*a")
- f:close()
- return data
- end
- return nil
-end
-
-function scripts.context.update()
- local force = getargument("force")
- local socket = require("socket")
- local http = require("socket.http")
- local basepath = resolvers.findfile("context.mkiv") or ""
- if basepath == "" then
- report("quiting, no 'context.mkiv' found")
- return
- end
- local basetree = basepath.match(basepath,"^(.-)tex/context/base/.*context.mkiv$") or ""
- if basetree == "" then
- report("quiting, no proper tds structure (%s)",basepath)
- return
- end
- local function is_okay(basetree)
- for _, tree in next, validtrees do
- local pattern = gsub(tree,"%-","%%-")
- if find(basetree,pattern) then
- return tree
- end
- end
- return false
- end
- local okay = is_okay(basetree)
- if not okay then
- report("quiting, tree '%s' is protected",okay)
- return
- else
- report("updating tree '%s'",okay)
- end
- if not lfs.chdir(basetree) then
- report("quiting, unable to change to '%s'",okay)
- return
- end
- report("fetching '%s'",mainzip)
- local latest = http.request(mainzip)
- if not latest then
- report("context tree '%s' can be updated, use --force",okay)
- return
- end
- io.savedata("cont-tmf.zip",latest)
- if false then
- -- variant 1
- os.execute("mtxrun --script unzip cont-tmf.zip")
- else
- -- variant 2
- local zipfile = zip.open(zipname)
- if not zipfile then
- report("quiting, unable to open '%s'",zipname)
- return
- end
- local newfile = zip.loaddata(zipfile,"tex/context/base/mkiv/context.mkiv")
- if not newfile then
- report("quiting, unable to open '%s'","context.mkiv")
- return
- end
- local oldfile = io.loaddata(resolvers.findfile("context.mkiv")) or ""
- local function versiontonumber(what,str)
- local version = match(str,"\\edef\\contextversion{(.-)}") or ""
- local year, month, day, hour, minute = match(str,"\\edef\\contextversion{(%d+)%.(%d+)%.(%d+) *(%d+)%:(%d+)}")
- if year and minute then
- local time = os.time { year=year,month=month,day=day,hour=hour,minute=minute}
- report("%s version: %s (%s)",what,version,time)
- return time
- else
- report("%s version: %s (unknown)",what,version)
- return nil
- end
- end
- local oldversion = versiontonumber("old",oldfile)
- local newversion = versiontonumber("new",newfile)
- if not oldversion or not newversion then
- report("quiting, version cannot be determined")
- return
- elseif oldversion == newversion then
- report("quiting, your current version is up-to-date")
- return
- elseif oldversion > newversion then
- report("quiting, your current version is newer")
- return
- end
- for k in zipfile:files() do
- local filename = k.filename
- if find(filename,"/$") then
- lfs.mkdir(filename)
- else
- local data = zip.loaddata(zipfile,filename)
- if data then
- if force then
- io.savedata(filename,data)
- end
- report(filename)
- end
- end
- end
- for _, scriptname in next, selfscripts do
- local oldscript = resolvers.findfile(scriptname) or ""
- if oldscript ~= "" and is_okay(oldscript) then
- local newscript = "./scripts/context/lua/" .. scriptname
- local data = io.loaddata(newscript) or ""
- if data ~= "" then
- report("replacing script '%s' by '%s'",oldscript,newscript)
- if force then
- io.savedata(oldscript,data)
- end
- end
- else
- report("keeping script '%s'",oldscript)
- end
- end
- if force then
- scripts.context.make()
- end
- end
- if force then
- report("context tree '%s' has been updated",okay)
- else
- report("context tree '%s' can been updated (use --force)",okay)
- end
-end
-
-- getting it done
if getargument("timedlog") then
@@ -1753,6 +1596,17 @@ end
do
+ local htmlerrorpage = getargument("htmlerrorpage")
+ if htmlerrorpage == "scite" then
+ directives.enable("system.showerror=scite")
+ elseif htmlerrorpage then
+ directives.enable("system.showerror")
+ end
+
+end
+
+do
+
local silent = getargument("silent")
if type(silent) == "string" then
directives.enable(format("logs.blocked={%s}",silent))
@@ -1786,15 +1640,11 @@ elseif getargument("generate") then
scripts.context.timed(function() scripts.context.generate() end)
elseif getargument("ctx") and not getargument("noctx") then
scripts.context.timed(scripts.context.ctx)
--- elseif getargument("mp") or getargument("metapost") then
--- scripts.context.timed(scripts.context.metapost)
elseif getargument("version") then
application.identify()
scripts.context.version()
elseif getargument("touch") then
scripts.context.touch()
-elseif getargument("update") then
- scripts.context.update()
elseif getargument("expert") then
application.help("expert", "special")
elseif getargument("showmodules") or getargument("modules") then
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-context.xml b/Master/texmf-dist/scripts/context/lua/mtx-context.xml
index 8c21eaa8c5c..0c7038d2680 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-context.xml
+++ b/Master/texmf-dist/scripts/context/lua/mtx-context.xml
@@ -4,7 +4,7 @@
<metadata>
<entry name="name">mtx-context</entry>
<entry name="detail">ConTeXt Process Management</entry>
- <entry name="version">1.01</entry>
+ <entry name="version">1.03</entry>
<entry name="comment">external helpinfo file</entry>
</metadata>
<flags>
@@ -74,7 +74,10 @@
<short>strip Lua code (only meant for production where no errors are expected)</short>
</flag>
<flag name="errors" value="list">
- <short>show errors at the end of a run, quit when in list (also when <ref name="--silent"/>)</short>
+ <short>show errors at the end of a run, quit when in list (also when <ref name="silent"/>)</short>
+ </flag>
+ <flag name="htmlerrorpage">
+ <short>generate html error page instead (optional: =scite)</short>
</flag>
<flag name="noconsole">
<short>disable logging to the console (logfile only)</short>
@@ -131,12 +134,16 @@
<flag name="nonstopmode">
<short>run without stopping</short>
</flag>
+ </subcategory>
+ <subcategory>
<flag name="nosynctex">
<short>never initializes synctex (for production runs)</short>
</flag>
<flag name="synctex">
<short>run with synctex enabled (better use \setupsynctex[state=start]</short>
</flag>
+ </subcategory>
+ <subcategory>
<flag name="nodates">
<short>omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM")</short>
</flag>
@@ -146,7 +153,7 @@
<flag name="trailerid">
<short>alternative trailer id (or constant one)</short>
</flag>
- </subcategory>
+ </subcategory>
<subcategory>
<flag name="generate">
<short>generate file database etc. (as luatools does)</short>
@@ -172,12 +179,12 @@
<flag name="touch">
<short>update context version number (also provide <ref name="expert"/>, optionally provide <ref name="basepath"/>)</short>
</flag>
- <flag name="nostatistics">
+ <flag name="nostatistics">
<short>omit runtime statistics at the end of the run</short>
</flag>
- <flag name="update">
+ <!-- flag name="update">
<short>update context from website (not to be confused with contextgarden)</short>
- </flag>
+ </flag -->
<flag name="profile">
<short>profile job (use: mtxrun <ref name="script"/> profile <ref name="analyze"/>)</short>
</flag>
@@ -225,6 +232,11 @@
<short>process file in a limited environment</short>
</flag>
</subcategory>
+ <subcategory>
+ <flag name="addbinarypath">
+ <short>prepend the (found) binarypath to runners</short>
+ </flag>
+ </subcategory>
</category>
</flags>
</application>
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-convert.lua b/Master/texmf-dist/scripts/context/lua/mtx-convert.lua
index b3e20ea8769..61ce1504072 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-convert.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-convert.lua
@@ -90,7 +90,7 @@ function converters.convertgraphic(kind,oldname,newname)
local command = converters[kind](oldname,tmpname)
report("command: %s",command)
io.flush()
- os.spawn(command)
+ os.execute(command)
os.remove(newname)
os.rename(tmpname,newname)
if lfs.attributes(newname,"size") == 0 then
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua b/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua
index 2e50543c386..fcba696c43c 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua
@@ -16,7 +16,7 @@ local lower = string.lower
local concat = table.concat
local write_nl = (logs and logs.writer) or (texio and texio.write_nl) or print
-local otlversion = 3.106
+local otlversion = 3.111
local helpinfo = [[
<?xml version="1.0"?>
@@ -268,7 +268,7 @@ local function showfeatures(tag,specification)
report()
indeed("instances : % t",instancenames)
end
- local features = fonts.helpers.getfeatures(specification.filename,not getargument("nosave"))
+ local features, tables = fonts.helpers.getfeatures(specification.filename,not getargument("nosave"))
if features then
for what, v in table.sortedhash(features) do
local data = features[what]
@@ -276,7 +276,7 @@ local function showfeatures(tag,specification)
report()
report("%s features:",what)
report()
- report("feature script languages")
+ report(" feature script languages")
report()
for f,ff in table.sortedhash(data) do
local done = false
@@ -288,7 +288,7 @@ local function showfeatures(tag,specification)
else
done = true
end
- report("% -8s % -8s % -8s",f,s,concat(table.sortedkeys(ss), " ")) -- todo: padd 4
+ report(" % -8s % -8s % -8s",f,s,concat(table.sortedkeys(ss), " ")) -- todo: padd 4
end
end
end
@@ -296,6 +296,24 @@ local function showfeatures(tag,specification)
else
report("no features")
end
+ if tables then
+ tables = table.tohash(tables)
+ local methods = {
+ overlay = (tables.colr or tables.cpal) and { format = "cff/ttf", feature = "color:overlay" } or nil,
+ bitmap = (tables.cblc or tables.cbdt) and { format = "png", feature = "color:bitmap" } or nil,
+ outline = (tables.svg ) and { format = "svg", feature = "color:svg" } or nil,
+ }
+ if next(methods) then
+ report()
+ report("color features:")
+ report()
+ report(" method feature formats")
+ report()
+ for k, v in table.sortedhash(methods) do
+ report(" % -8s % -14s %s",k,v.feature,v.format)
+ end
+ end
+ end
report()
collectgarbage("collect")
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-grep.lua b/Master/texmf-dist/scripts/context/lua/mtx-grep.lua
index 9a4237737cf..e4a2a8d2f07 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-grep.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-grep.lua
@@ -173,15 +173,17 @@ function scripts.grep.find(pattern, files, offset)
local globbed = dir.glob(files[i])
for i=1,#globbed do
name = globbed[i]
- local data = io.loaddata(name)
- if data then
- n, m, noffiles = 0, 0, noffiles + 1
- lpegmatch(capture,data)
- if count and m > 0 then
- nofmatches = nofmatches + m
- nofmatchedfiles = nofmatchedfiles + 1
- write_nl(format("%5i %s",m,name))
- io.flush()
+ if not find(name,"/%.") then
+ local data = io.loaddata(name)
+ if data then
+ n, m, noffiles = 0, 0, noffiles + 1
+ lpegmatch(capture,data)
+ if count and m > 0 then
+ nofmatches = nofmatches + m
+ nofmatchedfiles = nofmatchedfiles + 1
+ write_nl(format("%5i %s",m,name))
+ io.flush()
+ end
end
end
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-install.lua b/Master/texmf-dist/scripts/context/lua/mtx-install.lua
index 275102e3789..b9b4103531d 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-install.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-install.lua
@@ -26,6 +26,7 @@ local helpinfo = [[
<flag name="goodies" value="string"><short>extra binaries (like scite and texworks)</short></flag>
<flag name="install"><short>install context</short></flag>
<flag name="update"><short>update context</short></flag>
+ <flag name="erase"><short>wipe the cache</short></flag>
<flag name="identify"><short>create list of files</short></flag>
</subcategory>
</category>
@@ -90,34 +91,39 @@ local platforms = {
--
["linux-armhf"] = "linux-armhf",
--
- ["freebsd"] = "freebsd",
+ ["openbsd"] = "openbsd6.6",
+ ["openbsd-i386"] = "openbsd6.6",
+ ["openbsd-amd64"] = "openbsd6.6-amd64",
--
+ ["freebsd"] = "freebsd",
+ ["freebsd-i386"] = "freebsd",
["freebsd-amd64"] = "freebsd-amd64",
--
- ["kfreebsd"] = "kfreebsd-i386",
- ["kfreebsd-i386"] = "kfreebsd-i386",
- --
- ["kfreebsd-amd64"] = "kfreebsd-amd64",
+ -- ["kfreebsd"] = "kfreebsd-i386",
+ -- ["kfreebsd-i386"] = "kfreebsd-i386",
+ -- ["kfreebsd-amd64"] = "kfreebsd-amd64",
--
- ["linux-ppc"] = "linux-ppc",
- ["ppc"] = "linux-ppc",
+ -- ["linux-ppc"] = "linux-ppc",
+ -- ["ppc"] = "linux-ppc",
--
- ["osx"] = "osx-intel",
- ["macosx"] = "osx-intel",
- ["osx-intel"] = "osx-intel",
- ["osxintel"] = "osx-intel",
+ -- ["osx"] = "osx-intel",
+ -- ["macosx"] = "osx-intel",
+ -- ["osx-intel"] = "osx-intel",
+ -- ["osxintel"] = "osx-intel",
--
- ["osx-ppc"] = "osx-ppc",
- ["osx-powerpc"] = "osx-ppc",
- ["osxppc"] = "osx-ppc",
- ["osxpowerpc"] = "osx-ppc",
+ -- ["osx-ppc"] = "osx-ppc",
+ -- ["osx-powerpc"] = "osx-ppc",
+ -- ["osxppc"] = "osx-ppc",
+ -- ["osxpowerpc"] = "osx-ppc",
--
+ ["macosx"] = "osx-64",
+ ["osx"] = "osx-64",
["osx-64"] = "osx-64",
--
- ["solaris-intel"] = "solaris-intel",
+ -- ["solaris-intel"] = "solaris-intel",
--
- ["solaris-sparc"] = "solaris-sparc",
- ["solaris"] = "solaris-sparc",
+ -- ["solaris-sparc"] = "solaris-sparc",
+ -- ["solaris"] = "solaris-sparc",
--
["unknown"] = "unknown",
}
@@ -127,6 +133,8 @@ function install.identify()
-- We have to be in "...../tex" where subdirectories are prefixed with
-- "texmf". We strip the "tex/texm*/" from the name in the list.
+ local hashdata = sha2 and sha2.HASH256 or md5.hex
+
local function collect(root,tree)
local path = root .. "/" .. tree
@@ -141,12 +149,12 @@ function install.identify()
local total = 0
for i=1,#files do
- local name = files[i]
- local size = filesize(name)
- local base = gsub(name,pattern,"")
- local stamp = md5.hex(io.loaddata(name))
- details[i] = { base, size, stamp }
- total = total + size
+ local name = files[i]
+ local size = filesize(name)
+ local base = gsub(name,pattern,"")
+ local stamp = hashdata(io.loaddata(name))
+ details[i] = { base, size, stamp }
+ total = total + size
end
report("%-20s : %4i files, %3.0f MB",tree,#files,total/(1000*1000))
@@ -164,10 +172,30 @@ function install.identify()
end
end
+ savetable("./tex/status.tma",{
+ name = "context",
+ version = "lmtx",
+ date = os.date("%Y-%m-%d"),
+ })
+
+end
+
+local function disclaimer()
+ report("ConTeXt LMTX with LuaMetaTeX is still experimental and when you get a crash this")
+ report("can be due to a mismatch between Lua bytecode and the engine. In that case you can")
+ report("try the following:")
+ report("")
+ report(" - wipe the texmf-cache directory")
+ report(" - run: mtxrun --generate")
+ report(" - run: context --make")
+ report("")
+ report("When that doesn't solve the problem, ask on the mailing list (ntg-context@ntg.nl).")
end
function install.update()
+ local hashdata = sha2 and sha2.HASH256 or md5.hex
+
local function validdir(d)
local ok = isdir(d)
if not ok then
@@ -177,7 +205,7 @@ function install.update()
return ok
end
- local function download(what,url,target,total,done)
+ local function download(what,url,target,total,done,oldhash)
local data = fetch(url .. "/" .. target)
if data then
if total and done then
@@ -185,11 +213,15 @@ function install.update()
else
report("%-8s : %8i : %s",what,#data,target)
end
- if validdir(dirname(target)) then
- savedata(target,data)
+ if oldhash and oldhash ~= hashdata(data) then
+ return "different hash value"
+ elseif not validdir(dirname(target)) then
+ return "wrong target directory"
else
- -- message
+ savedata(target,data)
end
+ else
+ return "unable to download"
end
end
@@ -338,7 +370,12 @@ function install.update()
if action then
local size = newhash[2]
total = total + size
- todo[#todo+1] = { action, target, size }
+ todo[#todo+1] = {
+ action = action,
+ target = target,
+ size = size,
+ hash = newhash[3],
+ }
end
else
report("skipping %s",target)
@@ -349,8 +386,22 @@ function install.update()
for i=1,count do
local entry = todo[i]
- download(entry[1],url,entry[2],total,done)
- done = done + entry[3]
+ for i=1,5 do
+ local target = entry.target
+ local message = download(entry.action,url,target,total,done,entry.hash)
+ if message then
+ if i == 5 then
+ report("%s, try again later: %s",target)
+ os.exit()
+ else
+ report("%s, trying again: %s",target)
+ os.sleep(2)
+ end
+ else
+ break
+ end
+ end
+ done = done + entry.size
end
for oldname, oldhash in sortedhash(hold) do
@@ -371,39 +422,57 @@ function install.update()
local targetroot = dir.current()
- local server = environment.arguments.server or ""
- local port = environment.arguments.port or ""
- local instance = environment.arguments.instance or ""
+ local server = environment.arguments.server or ""
+ local instance = environment.arguments.instance or ""
+ local osplatform = environment.arguments.platform or nil
+ local platform = platforms[osplatform or os.platform or ""]
- if server == "" then
- report("provide server")
- return
+ if (platform == "unknown" or platform == "" or not platform) and osplatform then
+ -- catches openbsdN.M kind of specifications
+ platform = osplatform
+ elseif not osplatform then
+ osplatform = platform
end
- local url = "http://" .. server
-
- if port ~= "" then
- url = url .. ":" .. port
+ if server == "" then
+ server = "lmtx.contextgarden.net,lmtx.pragma-ade.com,lmtx.pragma-ade.nl,dmz.pragma-ade.nl"
+ end
+ if instance == "" then
+ instance = "install-lmtx"
+ end
+ if not platform then
+ report("unknown platform")
+ return
end
- url = url .. "/"
+ local list = utilities.parsers.settings_to_array(server)
+ local server = false
- if instance ~= "" then
- url = url .. instance .. "/"
+ for i=1,#list do
+ local host = list[i]
+ local data, status, detail = fetch("http://" .. host .. "/" .. instance .. "/tex/status.tma")
+ if status == 200 and type(data) == "string" then
+ local t = loadstring(data)
+ if type(t) == "function" then
+ t = t()
+ end
+ if type(t) == "table" and t.name == "context" and t.version == "lmtx" then
+ server = host
+ break
+ end
+ end
end
- local osplatform = os.platform
- local platform = platforms[osplatform]
-
- if not platform then
- report("unknown platform")
+ if not server then
+ report("provide valid server and instance")
return
end
+ local url = "http://" .. server .. "/" .. instance .. "/"
+
local texmfplatform = "texmf-" .. platform
report("server : %s",server)
- report("port : %s",port == "" and 80 or "80")
report("instance : %s",instance)
report("platform : %s",osplatform)
report("system : %s",ostype)
@@ -495,8 +564,13 @@ function install.update()
end
run("%s --generate",mtxrunbin)
+ if environment.argument("erase") then
+ run("%s --script cache --erase",mtxrunbin)
+ run("%s --generate",mtxrunbin)
+ end
run("%s --make en", contextbin)
+
-- in calling script: update mtxrun.exe and mtxrun.lua
report("")
@@ -504,6 +578,8 @@ function install.update()
report("%-20s : %4i files with %9i bytes installed",unpack(status[i]))
end
report("")
+ disclaimer()
+ report("")
report("update, done")
end
@@ -518,4 +594,6 @@ elseif environment.argument("exporthelp") then
application.export(environment.argument("exporthelp"),environment.files[1])
else
application.help()
+ report("")
+ disclaimer()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-modules.lua b/Master/texmf-dist/scripts/context/lua/mtx-modules.lua
index 78e1418fd98..60427c08674 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-modules.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-modules.lua
@@ -22,8 +22,8 @@ local helpinfo = [[
<flags>
<category name="basic">
<subcategory>
- <flag name="convert"><short>convert source files (tex, mkii, mkiv, mp) to 'ted' files</short></flag>
- <flag name="process"><short>process source files (tex, mkii, mkiv, mp) to 'pdf' files</short></flag>
+ <flag name="convert"><short>convert source files (tex, mkii, mkiv, mp, etc.) to 'ted' files</short></flag>
+ <flag name="process"><short>process source files (tex, mkii, mkiv, mp, etc.) to 'pdf' files</short></flag>
<flag name="prep"><short>use original name with suffix 'prep' appended</short></flag>
<flag name="direct"><short>use old method instead of extra</short></flag>
</subcategory>
@@ -163,7 +163,12 @@ local function source_to_ted(inpname,outname,filetype)
return true
end
-local suffixes = table.tohash { 'tex', 'mkii', 'mkiv', 'mkvi', 'mp', 'mpii', 'mpiv' }
+local suffixes = table.tohash {
+ "tex",
+ "mkii",
+ "mkiv", "mkvi", "mkil", "mkli",
+ "mp", "mpii", "mpiv",
+}
function scripts.modules.process(runtex)
local processed = { }
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-patterns.lua b/Master/texmf-dist/scripts/context/lua/mtx-patterns.lua
index 4eb5711178c..37843a6b604 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-patterns.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-patterns.lua
@@ -133,6 +133,7 @@ scripts.patterns.list = {
-- { "lo", "hyph-lo", "lao" },
{ "lt", "hyph-lt", "lithuanian" },
{ "lv", "hyph-lv", "latvian" },
+ { "mk", "hyph-mk", "macedonian" },
{ "ml", "hyph-ml", "malayalam" },
{ "mn", "hyph-mn-cyrl", "mongolian, cyrillic script" },
-- { "mr", "hyph-mr", "..." },
@@ -163,8 +164,6 @@ scripts.patterns.list = {
-- stripped down from lpeg example:
-local utf = unicode.utf8
-
function utf.check(str)
return lpegmatch(lpegpatterns.validutf8,str)
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-pdf.lua b/Master/texmf-dist/scripts/context/lua/mtx-pdf.lua
index 2e73fa841d3..fbb1a3995e5 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-pdf.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-pdf.lua
@@ -90,6 +90,7 @@ function scripts.pdf.info(filename)
report("%-17s > %s","title", info.Title or unset)
report("%-17s > %s","creator", info.Creator or unset)
report("%-17s > %s","producer", info.Producer or unset)
+ report("%-17s > %s","author", info.Author or unset)
report("%-17s > %s","creation date", info.CreationDate or unset)
report("%-17s > %s","modification date", info.ModDate or unset)
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-plain.lua b/Master/texmf-dist/scripts/context/lua/mtx-plain.lua
index 72cc48f92ad..e6c790f7c33 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-plain.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-plain.lua
@@ -6,11 +6,13 @@ if not modules then modules = { } end modules ['mtx-plain'] = {
license = "see context related readme files"
}
--- future version will use the texmf-cache/generic/formats/<engine> path
+-- Future version will use the texmf-cache/generic/formats/<engine> path
-- instead because then we can use some more of the generic context
-- initializers ... in that case we will also use the regular database
-- instead of kpse here, just like with the font database code (as that
--- one also works with kpse runtime)
+-- one also works with kpse runtime).
+
+-- Maybe I have to update this one to use more recent ways to run programs.
local format = string.format
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-scite.lua b/Master/texmf-dist/scripts/context/lua/mtx-scite.lua
index ae8c673879f..96020de3dba 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-scite.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-scite.lua
@@ -25,7 +25,7 @@ local helpinfo = [[
<subcategory>
<flag name="words"><short>convert spell-*.txt into spell-*.lua</short></flag>
<flag name="tree"><short>converts a tree into an html tree (--source --target --numbers)</short></flag>
- <flag name="file"><short>converts a file into an html tree (--source --target --numbers --lexer)</short></flag>
+ <flag name="file"><short>converts a file into an html file (--source --target --numbers --lexer)</short></flag>
</subcategory>
</category>
</flags>
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-unicode.lua b/Master/texmf-dist/scripts/context/lua/mtx-unicode.lua
index fd65766462d..297807889e4 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-unicode.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-unicode.lua
@@ -57,11 +57,11 @@ if not modules then modules = { } end modules ['mtx-unicode'] = {
-- curl -o unicodedata.txt http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
-- curl -o unihan.zip http://www.unicode.org/Public/UNIDATA/Unihan.zip
--
--- curl -o emoji-data.txt http://unicode.org/Public/emoji/11.0/emoji-data.txt
--- curl -o emoji-sequences.txt http://unicode.org/Public/emoji/11.0/emoji-sequences.txt
--- curl -o emoji-variation-sequences.txt http://unicode.org/Public/emoji/11.0/emoji-variation-sequences.txt
--- curl -o emoji-zwj-sequences.txt http://unicode.org/Public/emoji/11.0/emoji-zwj-sequences.txt
--- curl -o emoji-test.txt http://unicode.org/Public/emoji/11.0/emoji-test.txt
+-- curl -o emoji-data.txt http://unicode.org/Public/emoji/12.0/emoji-data.txt
+-- curl -o emoji-sequences.txt http://unicode.org/Public/emoji/12.0/emoji-sequences.txt
+-- curl -o emoji-variation-sequences.txt http://unicode.org/Public/emoji/12.0/emoji-variation-sequences.txt
+-- curl -o emoji-zwj-sequences.txt http://unicode.org/Public/emoji/12.0/emoji-zwj-sequences.txt
+-- curl -o emoji-test.txt http://unicode.org/Public/emoji/12.0/emoji-test.txt
--
-- todo:
--
@@ -526,10 +526,21 @@ function scripts.unicode.load()
end
end
+-- local variants_emoji={
+-- [0xFE0E]="text style",
+-- [0xFE0F]="emoji style",
+-- }
+--
+-- local variants_forms={
+-- [0xFE00]="corner-justified form",
+-- [0xFE01]="centered form",
+-- }
+
function scripts.unicode.save(filename)
if preamble then
local data = table.serialize(characters.data,"characters.data", { hexify = true, noquotes = true })
data = gsub(data,"%{%s+%[0xFE0E%]=\"text style\",%s+%[0xFE0F%]=\"emoji style\",%s+%}","variants_emoji")
+ data = gsub(data,"%{%s+%[0xFE00%]=\"corner%-justified form\",%s+%[0xFE01%]=\"centered form\",%s+%}","variants_forms")
io.savedata(filename,preamble .. data)
end
end
@@ -688,9 +699,12 @@ do
local hash = { }
+ local crap = lpeg.P("e") * lpeg.R("09","..","09")^1 * lpeg.P(" ")^1
+
local replace = lpeg.replacer {
- ["#"] = "hash",
- ["*"] = "asterisk"
+ [crap] = "",
+ ["#"] = "hash",
+ ["*"] = "asterisk",
}
for i=1,#t do
@@ -722,8 +736,10 @@ else
scripts.unicode.extras()
scripts.unicode.save("char-def-new.lua")
scripts.unicode.emoji("char-emj-new.lua")
+ report("saved file %a","char-def-new.lua")
+ report("saved file %a (current 12.0, check for updates, see above!)","char-emj-new.lua")
else
report("nothing to do")
end
- report("stop working on %a, output char-def-new.lua\n",lfs.currentdir())
+ report("stop working on %a\n",lfs.currentdir())
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-unzip.lua b/Master/texmf-dist/scripts/context/lua/mtx-unzip.lua
index 02d9676bcaa..0bc2193863b 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-unzip.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-unzip.lua
@@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['mtx-unzip'] = {
-- maybe --pattern
-local format = string.format
+local format, find = string.format, string.find
local helpinfo = [[
<?xml version="1.0"?>
@@ -22,8 +22,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="list"><short>list files in archive</short></flag>
- <flag name="junk"><short>flatten unzipped directory structure</short></flag>
- <flag name="extract"><short>extract files</short></flag>
+ <flag name="extract"><short>extract files [--silent --steps]</short></flag>
</subcategory>
</category>
</flags>
@@ -41,92 +40,87 @@ local report = application.report
scripts = scripts or { }
scripts.unzipper = scripts.unzipper or { }
-function scripts.unzipper.opened()
+local function validfile()
local filename = environment.files[1]
if filename and filename ~= "" then
filename = file.addsuffix(filename,'zip')
- local zipfile = zip.open(filename)
- if zipfile then
- return zipfile
+ if lfs.isfile(filename) then
+ return filename
+ else
+ report("invalid zip file: %s",filename)
end
+ else
+ report("no zip file")
end
- report("no zip file: %s",filename)
return false
end
function scripts.unzipper.list()
- local zipfile = scripts.unzipper.opened()
- if zipfile then
- local n = 0
- for k in zipfile:files() do
- if #k.filename > n then n = #k.filename end
- end
- local files, paths, compressed, uncompressed = 0, 0, 0, 0
- local template_a = "%-"..n.."s"
- local template_b = "%-"..n.."s % 9i % 9i"
- local template_c = "\n%-"..n.."s % 9i % 9i"
- for k in zipfile:files() do
- if k.filename:find("/$") then
- paths = paths + 1
- print(format(template_a, k.filename))
- else
- files = files + 1
- local cs, us = k.compressed_size, k.uncompressed_size
- if cs > compressed then
- compressed = cs
- end
- if us > uncompressed then
- uncompressed = us
+ local filename = validfile()
+ if filename then
+ local zipfile = utilities.zipfiles.open(filename)
+ if zipfile then
+ local list = utilities.zipfiles.list(zipfile)
+ if list then
+ local n = 0
+ for i=1,#list do
+ local l = list[i]
+ if #l.filename > n then
+ n = #l.filename
+ end
end
- print(format(template_b,k.filename,cs,us))
+ local files, paths, compressed, uncompressed = 0, 0, 0, 0
+ local template_a = "%-" .. n .."s"
+ local template_b = "%-" .. n .."s % 9i % 9i"
+ local template_c = "\n%-" .. n .."s % 9i % 9i"
+ for i=1,#list do
+ local l = list[i]
+ local f = l.filename
+ if find(f,"/$") then
+ paths = paths + 1
+ print(format(template_a, f))
+ else
+ files = files + 1
+ local cs = l.compressed
+ local us = l.uncompressed
+ if cs > compressed then
+ compressed = cs
+ end
+ if us > uncompressed then
+ uncompressed = us
+ end
+ print(format(template_b,f,cs,us))
+ end
+ end -- check following pattern, n is not enough
+ print(format(template_c,files .. " files, " .. paths .. " directories",compressed,uncompressed))
end
- end -- check following pattern, n is not enough
- print(format(template_c,files .. " files, " .. paths .. " directories",compressed,uncompressed))
- end
-end
-
-function zip.loaddata(zipfile,filename)
- local f = zipfile:open(filename)
- if f then
- local data = f:read("*a")
- f:close()
- return data
+ utilities.zipfiles.close(zipfile)
+ else
+ report("invalid zip file: %s",filename)
+ end
end
- return nil
end
function scripts.unzipper.extract()
- local zipfile = scripts.unzipper.opened()
- if zipfile then
- local junk = environment.arguments["j"] or environment.arguments["junk"]
- for k in zipfile:files() do
- local filename = k.filename
- if filename:find("/$") then
- if not junk then
- lfs.mkdir(filename)
- end
- else
- local data = zip.loaddata(zipfile,filename)
- if data then
- if junk then
- filename = file.basename(filename)
- end
- io.savedata(filename,data)
- print(filename)
- end
- end
- end
+ local filename = validfile()
+ if validfile then
+ -- todo --junk
+ local silent = environment.arguments["silent"]
+ local steps = environment.arguments["steps"]
+ utilities.zipfiles.unzipdir {
+ zipname = filename,
+ path = ".",
+ verbose = not silent and (steps and "steps" or true),
+ }
end
end
-if environment.arguments["h"] or environment.arguments["help"] then
- application.help()
-elseif environment.arguments["l"] or environment.arguments["list"] then
- scripts.unzipper.list(zipfile)
+if environment.arguments["list"] then
+ scripts.unzipper.list()
+elseif environment.arguments["extract"] then
+ scripts.unzipper.extract()
elseif environment.arguments["exporthelp"] then
application.export(environment.arguments["exporthelp"],environment.files[1])
-elseif environment.files[1] then -- implicit --extract
- scripts.unzipper.extract(zipfile)
else
application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-update.lua b/Master/texmf-dist/scripts/context/lua/mtx-update.lua
index d9deb1b36dc..e03012901da 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-update.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-update.lua
@@ -98,13 +98,6 @@ update.repositories = {
"experimental"
}
--- more options than just these two are available (no idea why this is here)
-
-update.versions = {
- "current",
- "latest"
-}
-
-- list of basic folders that are needed to make a functional distribution
update.base = {
@@ -164,19 +157,72 @@ update.goodies = {
},
}
+-- update.platforms = {
+-- ["mswin"] = "mswin",
+-- ["windows"] = "mswin",
+-- ["win32"] = "mswin",
+-- ["win"] = "mswin",
+-- -- ["mswin"] = "win32",
+-- -- ["windows"] = "win32",
+-- -- ["win32"] = "win32",
+-- -- ["win"] = "win32",
+-- --
+-- -- ["mswin-64"] = "mswin-64",
+-- -- ["windows-64"] = "mswin-64",
+-- -- ["win64"] = "mswin-64",
+-- ["mswin-64"] = "win64",
+-- ["windows-64"] = "win64",
+-- ["win64"] = "win64",
+-- --
+-- ["linux"] = "linux",
+-- ["linux-32"] = "linux",
+-- ["linux32"] = "linux",
+-- --
+-- ["linux-64"] = "linux-64",
+-- ["linux64"] = "linux-64",
+-- --
+-- ["linuxmusl-64"] = "linuxmusl-64",
+-- --
+-- ["linux-armhf"] = "linux-armhf",
+-- --
+-- ["freebsd"] = "freebsd",
+-- --
+-- ["freebsd-amd64"] = "freebsd-amd64",
+-- --
+-- ["kfreebsd"] = "kfreebsd-i386",
+-- ["kfreebsd-i386"] = "kfreebsd-i386",
+-- --
+-- ["kfreebsd-amd64"] = "kfreebsd-amd64",
+-- --
+-- ["linux-ppc"] = "linux-ppc",
+-- ["ppc"] = "linux-ppc",
+-- --
+-- ["osx"] = "osx-intel",
+-- ["macosx"] = "osx-intel",
+-- ["osx-intel"] = "osx-intel",
+-- ["osxintel"] = "osx-intel",
+-- --
+-- ["osx-ppc"] = "osx-ppc",
+-- ["osx-powerpc"] = "osx-ppc",
+-- ["osxppc"] = "osx-ppc",
+-- ["osxpowerpc"] = "osx-ppc",
+-- --
+-- ["osx-64"] = "osx-64",
+-- --
+-- ["solaris-intel"] = "solaris-intel",
+-- --
+-- ["solaris-sparc"] = "solaris-sparc",
+-- ["solaris"] = "solaris-sparc",
+-- --
+-- ["unknown"] = "unknown",
+-- }
+
update.platforms = {
["mswin"] = "mswin",
["windows"] = "mswin",
["win32"] = "mswin",
["win"] = "mswin",
- -- ["mswin"] = "win32",
- -- ["windows"] = "win32",
- -- ["win32"] = "win32",
- -- ["win"] = "win32",
--
- -- ["mswin-64"] = "mswin-64",
- -- ["windows-64"] = "mswin-64",
- -- ["win64"] = "mswin-64",
["mswin-64"] = "win64",
["windows-64"] = "win64",
["win64"] = "win64",
@@ -192,34 +238,39 @@ update.platforms = {
--
["linux-armhf"] = "linux-armhf",
--
- ["freebsd"] = "freebsd",
+ ["openbsd"] = "openbsd6.5",
+ ["openbsd-i386"] = "openbsd6.5",
+ ["openbsd-amd64"] = "openbsd6.5-amd64",
--
+ ["freebsd"] = "freebsd",
+ ["freebsd-i386"] = "freebsd",
["freebsd-amd64"] = "freebsd-amd64",
--
- ["kfreebsd"] = "kfreebsd-i386",
- ["kfreebsd-i386"] = "kfreebsd-i386",
- --
- ["kfreebsd-amd64"] = "kfreebsd-amd64",
+ -- ["kfreebsd"] = "kfreebsd-i386",
+ -- ["kfreebsd-i386"] = "kfreebsd-i386",
+ -- ["kfreebsd-amd64"] = "kfreebsd-amd64",
--
- ["linux-ppc"] = "linux-ppc",
- ["ppc"] = "linux-ppc",
+ -- ["linux-ppc"] = "linux-ppc",
+ -- ["ppc"] = "linux-ppc",
--
- ["osx"] = "osx-intel",
- ["macosx"] = "osx-intel",
- ["osx-intel"] = "osx-intel",
- ["osxintel"] = "osx-intel",
+ -- ["osx"] = "osx-intel",
+ -- ["macosx"] = "osx-intel",
+ -- ["osx-intel"] = "osx-intel",
+ -- ["osxintel"] = "osx-intel",
--
- ["osx-ppc"] = "osx-ppc",
- ["osx-powerpc"] = "osx-ppc",
- ["osxppc"] = "osx-ppc",
- ["osxpowerpc"] = "osx-ppc",
+ -- ["osx-ppc"] = "osx-ppc",
+ -- ["osx-powerpc"] = "osx-ppc",
+ -- ["osxppc"] = "osx-ppc",
+ -- ["osxpowerpc"] = "osx-ppc",
--
+ ["macosx"] = "osx-64",
+ ["osx"] = "osx-64",
["osx-64"] = "osx-64",
--
- ["solaris-intel"] = "solaris-intel",
+ -- ["solaris-intel"] = "solaris-intel",
--
- ["solaris-sparc"] = "solaris-sparc",
- ["solaris"] = "solaris-sparc",
+ -- ["solaris-sparc"] = "solaris-sparc",
+ -- ["solaris"] = "solaris-sparc",
--
["unknown"] = "unknown",
}
@@ -626,7 +677,7 @@ if scripts.savestate then
local valid = table.tohash(update.repositories)
for r in gmatch(environment.argument("repository") or "current","([^, ]+)") do
- if valid[r] then states.set("repositories." .. r, true) end
+ if valid[r] then states.set(" ." .. r, true) end
end
local valid = update.engines
@@ -652,15 +703,33 @@ if scripts.savestate then
end
end
+ -- old
+
local valid = update.platforms
for r in gmatch(environment.argument("platform") or os.platform,"([^, ]+)") do
if valid[r] then states.set("platforms." .. r, true) end
end
+ -- new
+
+-- local osplatform = environment.arguments.platform or nil
+-- local platform = platforms[osplatform or os.platform or ""]
+--
+-- if (platform == "unknown" or platform == "" or not platform) and osplatform then
+-- -- catches openbsdN.M kind of specifications
+-- platform = osplatform
+-- elseif not osplatform then
+-- osplatform = platform
+-- end
+-- states.set("platforms." .. platform, true) end
+
+ -- so far
+
local valid = table.tohash(update.texformats)
for r in gmatch(environment.argument("formats") or "","([^, ]+)") do
if valid[r] then states.set("formats." .. r, true) end
end
+
-- local valid = table.tohash(update.mpformats)
-- for r in gmatch(environment.argument("formats") or "","([^, ]+)") do
-- if valid[r] then states.set("formats." .. r, true) end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-vscode.lua b/Master/texmf-dist/scripts/context/lua/mtx-vscode.lua
new file mode 100644
index 00000000000..96cc5f9009b
--- /dev/null
+++ b/Master/texmf-dist/scripts/context/lua/mtx-vscode.lua
@@ -0,0 +1,3179 @@
+if not modules then modules = { } end modules ['mtx-vscode'] = {
+ version = 1.000,
+ comment = "this script is experimental",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE",
+ license = "see context related readme files"
+}
+
+-- todo: folding and comments
+-- todo: runners (awaiting global script setup)
+-- todo: dark theme
+
+-- Already for quite a while lexing in ConTeXt is kind of standardized and the way
+-- the format evolved also relates to how I see the source. We started with lexing
+-- beginning of 1990 with texedit/wdt in Modula2 and went via perltk (texwork),
+-- Scite (native), Scite (lpeg) as well as different stages in verbatim. So, as
+-- github uses VSCODE I decided to convert the couple of base lexers to the format
+-- that this editor likes. It's all about habits and consistency, not about tons of
+-- fancy features that I don't need and would not use anyway.
+--
+-- I use a lua script to generate the lexer definitions simply because that way the
+-- update will be in sync with the updates in the context distribution.
+--
+-- code.exe --extensions-dir e:\vscode\extensions --install-extension context
+--
+-- In the end all these systems look alike so again we we have these token onto
+-- styling mappings. We even have embedded lexers. Actually, when reading the
+-- explanations it has become internally more close to what scintilla does with
+-- tokens and numbers related to it but then mapped back onto css.
+--
+-- Multiline lexing is a pain here, so I just assume that stuff belonging together is
+-- on one line (like keys to simple values). I'm not in the mood for ugly multistep
+-- parsing now. Here the lpeg lexers win.
+--
+-- We can optimize these expressions if needed but it all looks fast enough. Anyway,
+-- we do start from the already old lexers that we use in SciTe. The lexing as well
+-- as use of colors is kind of consistent and standardized in context and I don't
+-- want to change it. The number of colors is not that large and (at least to me) it
+-- looks less extreme. We also use a gray background because over time we figured
+-- out that this works best (1) for long sessions, and (2) for colors. We have quite
+-- some embedding so that is another reason for consistency.
+--
+-- I do remember generating plist files many years ago but stopped doing that
+-- because I never could check them in practice. We're now kind of back to that. The
+-- reason for using a lua script to generate the json file is that it is easier to
+-- keep in sync with context and also because then a user can just generate the
+-- extension her/himself.
+--
+-- There are nice examples of lexer definitions in the vc extensions path. My regexp
+-- experiences are somewhat rusted and I don't really have intentions to spend too
+-- much time on them. Compared to the lpeg lexers the regexp based ones are often
+-- more compact. It's just a different concept. Anyway, I might improve things after
+-- I've read more of the specs (it seems like the regexp engine is the one from ruby).
+
+-- We normally use a light gray background with rather dark colors which at least
+-- for us is less tiresome. The problem with dark backgrounds is that one needs to
+-- use light colors from pastel palettes. I need to figure out a mapping that works
+-- for a dark background so that optionally one can install without color theme.
+
+-- It is possible to define tasks and even relate them to languages but for some reason
+-- it can not be done global but per workspace which makes using vscode no option for
+-- me (too many different folders with source code, documentation etc). It's kind of
+-- strange because simple runners are provided by many editors. I don't want to program
+-- a lot to get such simple things done so, awaiting global tasks I stick to using the
+-- terminal. But we're prepared.
+
+-- Another showstopper is the fact that we cannot disable utf8 for languages (like pdf,
+-- which is just bytes). I couldn't figure out how to set it in the extension.
+
+-- {
+-- "window.zoomLevel": 2,
+-- "editor.renderWhitespace": "all",
+-- "telemetry.enableCrashReporter": false,
+-- "telemetry.enableTelemetry": false,
+-- "editor.fontFamily": "Dejavu Sans Mono, Consolas, 'Courier New', monospace",
+-- "window.autoDetectHighContrast": false,
+-- "zenMode.hideLineNumbers": false,
+-- "zenMode.centerLayout": false,
+-- "zenMode.fullScreen": false,
+-- "zenMode.hideTabs": false,
+-- "workbench.editor.showIcons": false,
+-- "workbench.settings.enableNaturalLanguageSearch": false,
+-- "window.enableMenuBarMnemonics": false,
+-- "search.location": "panel",
+-- "breadcrumbs.enabled": false,
+-- "workbench.activityBar.visible": false,
+-- "editor.minimap.enabled": false,
+-- "workbench.iconTheme": null,
+-- "extensions.ignoreRecommendations": true,
+-- "editor.renderControlCharacters": true,
+-- "terminal.integrated.scrollback": 5000,
+-- "workbench.colorTheme": "ConTeXt",
+-- "[context.cld]": {},
+-- "terminal.integrated.fontSize": 10,
+-- "terminal.integrated.rendererType": "dom",
+-- "workbench.colorCustomizations": {
+-- "terminal.ansiBlack": "#000000",
+-- "terminal.ansiWhite": "#FFFFFF",
+-- "terminal.ansiRed": "#7F0000",
+-- "terminal.ansiGreen": "#007F00",
+-- "terminal.ansiBlue": "#00007F",
+-- "terminal.ansiMagenta": "#7F007F",
+-- "terminal.ansiCyan": "#007F7F",
+-- "terminal.ansiYellow": "#7F7F00",
+-- "terminal.ansiBrightBlack": "#000000",
+-- "terminal.ansiBrightWhite": "#FFFFFF",
+-- "terminal.ansiBrightRed": "#7F0000",
+-- "terminal.ansiBrightGreen": "#007F00",
+-- "terminal.ansiBrightBlue": "#00007F",
+-- "terminal.ansiBrightMagenta": "#7F007F",
+-- "terminal.ansiBrightCyan": "#007F7F",
+-- "terminal.ansiBrightYellow": "#7F7F00",
+-- }
+-- }
+
+-- kind of done:
+--
+-- tex mps lua cld bibtex sql bnf(untested) pdf xml json c(pp)(simplified)
+--
+-- unlikely to be done (ok, i'm not interested in all this ide stuff anyway):
+--
+-- cpp-web tex-web web web-snippets txt
+--
+-- still todo:
+--
+-- xml: preamble and dtd
+-- pdf: nested string (..(..)..)
+
+local helpinfo = [[
+<?xml version="1.0"?>
+<application>
+ <metadata>
+ <entry name="name">mtx-vscode</entry>
+ <entry name="detail">vscode extension generator</entry>
+ <entry name="version">1.00</entry>
+ </metadata>
+ <flags>
+ <category name="basic">
+ <subcategory>
+ <flag name="generate"><short>generate extension in sync with current version</short></flag>
+ <flag name="start"><short>start vscode with extension context</short></flag>
+ </subcategory>
+ </category>
+ </flags>
+ <examples>
+ <category>
+ <title>Example</title>
+ <subcategory>
+ <example><command>mtxrun --script vscode --generate e:/vscode/extensions</command></example>
+ <example><command>mtxrun --script vscode --generate</command></example>
+ <example><command>mtxrun --script vscode --start</command></example>
+ </subcategory>
+ </category>
+ </examples>
+</application>
+]]
+
+local application = logs.application {
+ name = "mtx-vscode",
+ banner = "vscode extension generator",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
+require("util-jsn")
+
+scripts = scripts or { }
+scripts.vscode = scripts.vscode or { }
+
+local readmedata = [[
+These files are generated. You can use these extensions with for instance:
+
+ code.exe --extensions-dir <someplace>/tex/texmf-context/context/data/vscode/extensions --install-extension context
+
+There are examples of scripts and keybindings too.
+]]
+
+local function locate()
+ local name = resolvers.findfile("vscode-context.readme")
+ if name and name ~= "" then
+ local path = file.dirname(file.dirname(name))
+ if lfs.isdir(path) then
+ return path
+ end
+ end
+end
+
+function scripts.vscode.generate(targetpath)
+
+ local targetpath = targetpath or environment.files[1] or locate()
+
+ if not targetpath or targetpath == "" or not lfs.isdir(targetpath) then
+ report("invalid targetpath %a",targetpath)
+ return
+ end
+
+ local contextpath = string.gsub(targetpath,"\\","/") .. "/context"
+
+ dir.makedirs(contextpath)
+
+ if not lfs.chdir(contextpath) then
+ return
+ end
+
+ local syntaxpath = contextpath .. "/syntaxes"
+ local themepath = contextpath .. "/themes"
+ local taskpath = contextpath .. "/tasks"
+ local keybindingpath = contextpath .. "/keybindings"
+ local settingspath = contextpath .. "/settings"
+
+ dir.makedirs(syntaxpath)
+ dir.makedirs(themepath)
+ dir.makedirs(taskpath)
+ dir.makedirs(keybindingpath)
+ dir.makedirs(settingspath)
+
+ if not lfs.isdir(syntaxpath) then return end
+ if not lfs.isdir(themepath) then return end
+ if not lfs.isdir(taskpath) then return end
+ if not lfs.isdir(keybindingpath) then return end
+ if not lfs.isdir(settingspath) then return end
+
+ -- The package.
+
+ local languages = { }
+ local grammars = { }
+ local themes = { }
+ local tasks = { }
+ local keybindings = { }
+
+ local function registerlexer(lexer)
+
+ local category = lexer.category
+ local contextid = "context." .. category
+ local scope = "source." .. contextid
+
+ local setupfile = "./settings/context-settings-" .. category .. ".json"
+ local grammarfile = "./syntaxes/context-syntax-" .. category .. ".json"
+
+ local grammar = utilities.json.tojson {
+ name = contextid,
+ scopeName = scope,
+ version = lexer.version,
+ repository = lexer.repository,
+ patterns = lexer.patterns,
+ }
+
+ local setup = utilities.json.tojson(lexer.setup)
+
+ local suffixes = lexer.suffixes or { }
+ local extensions = { }
+
+ for i=1,#suffixes do
+ extensions[i] = "." .. string.gsub(suffixes[i],"%.","")
+ end
+
+ table.sort(extensions)
+
+ languages[#languages+1] = {
+ id = contextid,
+ extensions = #extensions > 0 and extensions or nil,
+ aliases = { lexer.description },
+ configuration = setupfile,
+ }
+
+ grammars[#grammars+1] = {
+ language = contextid,
+ scopeName = "source." .. contextid,
+ path = grammarfile,
+ }
+
+ report("saving grammar for %a in %a",category,grammarfile)
+ report("saving setup for %a in %a",category,setupfile)
+
+ io.savedata(grammarfile, grammar)
+ io.savedata(setupfile, setup)
+
+ end
+
+ local function registertheme(theme)
+
+ local category = theme.category
+ local filename = "./themes/" .. category .. ".json"
+
+ themes[#themes+1] = {
+ label = theme.description,
+ uiTheme = "vs",
+ path = filename,
+ }
+
+ local data = utilities.json.tojson {
+ ["$schema"] = "vscode://schemas/color-theme",
+ ["name"] = category,
+ ["colors"] = theme.colors,
+ ["tokenColors"] = theme.styles,
+ }
+
+ report("saving theme %a in %a",category,filename)
+
+ io.savedata(filename,data)
+
+ end
+
+ local function registertask(task)
+
+ local category = task.category
+ local filename = "./tasks/" .. category .. ".json"
+
+ tasks[#tasks+1] = {
+ label = task.description,
+ path = filename,
+ }
+
+ local data = utilities.json.tojson {
+ ["name"] = category,
+ ["tasks"] = task.tasks,
+ }
+
+ report("saving task %a in %a",category,filename)
+ io.savedata(filename,data)
+
+ end
+
+ local function registerkeybinding(keybinding)
+
+ local bindings = keybinding.keybindings
+
+ if bindings then
+
+ local category = keybinding.category
+ local filename = "./keybindings/" .. category .. ".json"
+
+ report("saving keybinding %a in %a",category,filename)
+
+ io.savedata(filename,utilities.json.tojson(bindings))
+
+ for i=1,#bindings do
+ keybindings[#keybindings+1] = bindings[i]
+ end
+
+ end
+ end
+
+ local function savepackage()
+
+ local packagefile = "package.json"
+ local whateverfile = "package.nls.json"
+ local readmefile = "vscode-context.readme"
+
+ local specification = utilities.json.tojson {
+ name = "context",
+ displayName = "ConTeXt",
+ description = "ConTeXt Syntax Highlighting",
+ publisher = "ConTeXt Development Team",
+ version = "1.0.0",
+ engines = {
+ vscode = "*"
+ },
+ categories = {
+ "Lexers",
+ "Syntaxes"
+ },
+ contributes = {
+ languages = languages,
+ grammars = grammars,
+ themes = themes,
+ tasks = tasks,
+ keybindings = keybindings,
+ },
+
+ }
+
+ report("saving package in %a",packagefile)
+
+ io.savedata(packagefile,specification)
+
+ local whatever = utilities.json.tojson {
+ displayName = "ConTeXt",
+ description = "Provides syntax highlighting and bracket matching in ConTeXt files.",
+ }
+
+ report("saving whatever in %a",whateverfile)
+
+ io.savedata(whateverfile,whatever)
+
+ report("saving readme in %a",readmefile)
+
+ io.savedata(readmefile,readmedata)
+
+ end
+
+ -- themes
+
+ do
+
+ local mycolors = {
+ red = "#7F0000",
+ green = "#007F00",
+ blue = "#00007F",
+ cyan = "#007F7F",
+ magenta = "#7F007F",
+ yellow = "#7F7F00",
+ orange = "#B07F00",
+ white = "#FFFFFF",
+ light = "#CFCFCF",
+ grey = "#808080",
+ dark = "#4F4F4F",
+ black = "#000000",
+ selection = "#F7F7F7",
+ logpanel = "#E7E7E7",
+ textpanel = "#CFCFCF",
+ linepanel = "#A7A7A7",
+ tippanel = "#444444",
+ right = "#0000FF",
+ wrong = "#FF0000",
+ }
+
+ local colors = {
+ ["editor.background"] = mycolors.textpanel,
+ ["editor.foreground"] = mycolors.black,
+ ["editorLineNumber.foreground"] = mycolors.black,
+ ["editorIndentGuide.background"] = mycolors.textpanel,
+ ["editorBracketMatch.background"] = mycolors.textpanel,
+ ["editorBracketMatch.border"] = mycolors.orange,
+ ["editor.lineHighlightBackground"] = mycolors.textpanel,
+ ["focusBorder"] = mycolors.black,
+
+ ["activityBar.background"] = mycolors.black,
+
+ ["sideBar.background"] = mycolors.linepanel,
+ ["sideBar.foreground"] = mycolors.black,
+ ["sideBar.border"] = mycolors.white,
+ ["sideBarTitle.foreground"] = mycolors.black,
+ ["sideBarSectionHeader.background"] = mycolors.linepanel,
+ ["sideBarSectionHeader.foreground"] = mycolors.black,
+
+ ["statusBar.foreground"] = mycolors.black,
+ ["statusBar.background"] = mycolors.linepanel,
+ ["statusBar.border"] = mycolors.white,
+ ["statusBar.noFolderForeground"] = mycolors.black,
+ ["statusBar.noFolderBackground"] = mycolors.linepanel,
+ ["statusBar.debuggingForeground"] = mycolors.black,
+ ["statusBar.debuggingBackground"] = mycolors.linepanel,
+
+ ["notification.background"] = mycolors.black,
+ }
+
+ local styles = {
+
+ { scope = "context.whitespace", settings = { } },
+ { scope = "context.default", settings = { foreground = mycolors.black } },
+ { scope = "context.number", settings = { foreground = mycolors.cyan } },
+ { scope = "context.comment", settings = { foreground = mycolors.yellow } },
+ { scope = "context.keyword", settings = { foreground = mycolors.blue, fontStyle = "bold" } },
+ { scope = "context.string", settings = { foreground = mycolors.magenta } },
+ { scope = "context.error", settings = { foreground = mycolors.red } },
+ { scope = "context.label", settings = { foreground = mycolors.red, fontStyle = "bold" } },
+ { scope = "context.nothing", settings = { } },
+ { scope = "context.class", settings = { foreground = mycolors.black, fontStyle = "bold" } },
+ { scope = "context.function", settings = { foreground = mycolors.black, fontStyle = "bold" } },
+ { scope = "context.constant", settings = { foreground = mycolors.cyan, fontStyle = "bold" } },
+ { scope = "context.operator", settings = { foreground = mycolors.blue } },
+ { scope = "context.regex", settings = { foreground = mycolors.magenta } },
+ { scope = "context.preprocessor", settings = { foreground = mycolors.yellow, fontStyle = "bold" } },
+ { scope = "context.tag", settings = { foreground = mycolors.cyan } },
+ { scope = "context.type", settings = { foreground = mycolors.blue } },
+ { scope = "context.variable", settings = { foreground = mycolors.black } },
+ { scope = "context.identifier", settings = { } },
+ { scope = "context.linenumber", settings = { background = mycolors.linepanel } },
+ { scope = "context.bracelight", settings = { foreground = mycolors.orange, fontStyle = "bold" } },
+ { scope = "context.bracebad", settings = { foreground = mycolors.orange, fontStyle = "bold" } },
+ { scope = "context.controlchar", settings = { } },
+ { scope = "context.indentguide", settings = { foreground = mycolors.linepanel, back = colors.white } },
+ { scope = "context.calltip", settings = { foreground = mycolors.white, back = colors.tippanel } },
+ { scope = "context.invisible", settings = { background = mycolors.orange } },
+ { scope = "context.quote", settings = { foreground = mycolors.blue, fontStyle = "bold" } },
+ { scope = "context.special", settings = { foreground = mycolors.blue } },
+ { scope = "context.extra", settings = { foreground = mycolors.yellow } },
+ { scope = "context.embedded", settings = { foreground = mycolors.black, fontStyle = "bold" } },
+ { scope = "context.char", settings = { foreground = mycolors.magenta } },
+ { scope = "context.reserved", settings = { foreground = mycolors.magenta, fontStyle = "bold" } },
+ { scope = "context.definition", settings = { foreground = mycolors.black, fontStyle = "bold" } },
+ { scope = "context.okay", settings = { foreground = mycolors.dark } },
+ { scope = "context.warning", settings = { foreground = mycolors.orange } },
+ { scope = "context.standout", settings = { foreground = mycolors.orange, fontStyle = "bold" } },
+ { scope = "context.command", settings = { foreground = mycolors.green, fontStyle = "bold" } },
+ { scope = "context.internal", settings = { foreground = mycolors.orange, fontStyle = "bold" } },
+ { scope = "context.preamble", settings = { foreground = mycolors.yellow } },
+ { scope = "context.grouping", settings = { foreground = mycolors.red } },
+ { scope = "context.primitive", settings = { foreground = mycolors.blue, fontStyle = "bold" } },
+ { scope = "context.plain", settings = { foreground = mycolors.dark, fontStyle = "bold" } },
+ { scope = "context.user", settings = { foreground = mycolors.green } },
+ { scope = "context.data", settings = { foreground = mycolors.cyan, fontStyle = "bold" } },
+ { scope = "context.text", settings = { foreground = mycolors.black } },
+
+ { scope = { "emphasis" }, settings = { fontStyle = "italic" } },
+ { scope = { "strong" }, settings = { fontStyle = "bold" } },
+
+ { scope = { "comment" }, settings = { foreground = mycolors.black } },
+ { scope = { "string" }, settings = { foreground = mycolors.magenta } },
+
+ {
+ scope = {
+ "constant.numeric",
+ "constant.language.null",
+ "variable.language.this",
+ "support.type.primitive",
+ "support.function",
+ "support.variable.dom",
+ "support.variable.property",
+ "support.variable.property",
+ "meta.property-name",
+ "meta.property-value",
+ "support.constant.handlebars"
+ },
+ settings = {
+ foreground = mycolors.cyan,
+ }
+ },
+
+ {
+ scope = {
+ "keyword",
+ "storage.modifier",
+ "storage.type",
+ "variable.parameter"
+ },
+ settings = {
+ foreground = mycolors.blue,
+ fontStyle = "bold",
+ }
+ },
+
+ {
+ scope = {
+ "entity.name.type",
+ "entity.other.inherited-class",
+ "meta.function-call",
+ "entity.other.attribute-name",
+ "entity.name.function.shell"
+ },
+ settings = {
+ foreground = mycolors.black,
+ }
+ },
+
+ {
+ scope = {
+ "entity.name.tag",
+ },
+ settings = {
+ foreground = mycolors.black,
+ }
+ },
+
+ }
+
+ registertheme {
+ category = "context",
+ description = "ConTeXt",
+ colors = colors,
+ styles = styles,
+ }
+
+ end
+
+ do
+
+ local presentation = {
+ echo = true,
+ reveal = "always",
+ focus = false,
+ panel = "shared",
+ showReuseMessage = false,
+ clear = true,
+ }
+
+ local tasks = {
+ {
+ group = "build",
+ label = "process tex file",
+ type = "shell",
+ command = "context --autogenerate --autopdf ${file}",
+ windows = { command = "chcp 65001 ; context.exe --autogenerate --autopdf ${file}" },
+ },
+ {
+ group = "build",
+ label = "check tex file",
+ type = "shell",
+ command = "mtxrun --autogenerate --script check ${file}",
+ windows = { command = "chcp 65001 ; mtxrun.exe --autogenerate --script check ${file}" },
+ },
+ {
+ group = "build",
+ label = "identify fonts",
+ type = "shell",
+ command = "mtxrun --script fonts --reload --force",
+ windows = { command = "chcp 65001 ; mtxrun.exe --script fonts --reload --force" },
+ },
+ {
+ group = "build",
+ label = "process lua file",
+ type = "shell",
+ command = "mtxrun --script ${file}",
+ windows = { command = "chcp 65001 ; mtxrun.exe --script ${file}" },
+ },
+ }
+
+ for i=1,#tasks do
+ local task = tasks[i]
+ if not task.windows then
+ task.windows = { command = "chcp 65001 ; " .. task.command }
+ end
+ if not task.presentation then
+ task.presentation = presentation
+ end
+ end
+
+ registertask {
+ category = "context",
+ description = "ConTeXt Tasks",
+ tasks = tasks,
+ }
+
+ end
+
+ do
+
+ local keybindings = {
+ {
+ -- runner = "context --autogenerate --autopdf ${file}",
+ key = "ctrl-F12",
+ command = "workbench.action.tasks.runTask",
+ args = "process tex file",
+ when = "editorTextFocus && editorLangId == context.tex",
+ },
+ {
+ -- runner = "mtxrun --autogenerate --script check ${file}",
+ key = "F12",
+ command = "workbench.action.tasks.runTask",
+ args = "check tex file",
+ when = "editorTextFocus && editorLangId == context.tex",
+ },
+ {
+ -- runner = "mtxrun --script ${file}",
+ key = "ctrl-F12",
+ command = "workbench.action.tasks.runTask",
+ args = "process lua file",
+ when = "editorTextFocus && editorLangId == context.cld",
+ }
+ }
+
+ registerkeybinding {
+ category = "context",
+ description = "ConTeXt Keybindings",
+ keybindings = keybindings,
+ }
+
+ end
+
+ -- helpers
+
+ local function loaddefinitions(name)
+ return table.load(resolvers.findfile(name))
+ end
+
+ local escapes = {
+ ["."] = "\\.",
+ ["-"] = "\\-",
+ ["+"] = "\\+",
+ ["*"] = "\\*",
+ ['"'] = '\\"',
+ ["'"] = "\\'",
+ ['^'] = '\\^',
+ ['$'] = '\\$',
+ ["|"] = "\\|",
+ ["\\"] = "\\\\",
+ ["["] = "\\[",
+ ["]"] = "\\]",
+ ["("] = "\\(",
+ [")"] = "\\)",
+ ["%"] = "\\%",
+ ["!"] = "\\!",
+ ["&"] = "\\&",
+ ["?"] = "\\?",
+ ["~"] = "\\~",
+ }
+
+ local function sorter(a,b)
+ return a > b
+ end
+
+ local function oneof(t)
+ local result = { }
+ table.sort(t,sorter)
+ for i=1,#t do
+ result[i] = string.gsub(t[i],".",escapes)
+ end
+ return table.concat(result,"|")
+ end
+
+ local function capture(str)
+ return "(" .. str .. ")"
+ end
+
+ local function captures(str)
+ return "\\*(" .. str .. ")\\*"
+ end
+
+ local function include(str)
+ return { include = str }
+ end
+
+ local function configuration(s)
+ if s then
+ local pairs = s.pairs
+ local comments = s.comments
+ return {
+ brackets = pairs,
+ autoClosingPairs = pairs,
+ surroundingPairs = pairs,
+ comments = {
+ lineComment = comments and comments.inline or nil,
+ blockComment = comments and comments.display or nil,
+ },
+ }
+ else
+ return { }
+ end
+ end
+
+ -- I need to figure out a decent mapping for dark as the defaults are just
+ -- not to my taste and we also have a different categorization.
+
+ local mapping = {
+ ["context.default"] = "text source",
+ ["context.number"] = "constant.numeric",
+ ["context.comment"] = "comment",
+ ["context.keyword"] = "keyword",
+ ["context.string"] = "string source",
+ ["context.label"] = "meta.tag",
+ ["context.constant"] = "support.constant",
+ ["context.operator"] = "keyword.operator.js",
+ ["context.identifier"] = "support.variable",
+ ["context.quote"] = "string",
+ ["context.special"] = "unset",
+ ["context.extra"] = "unset",
+ ["context.embedded"] = "meta.embedded",
+ ["context.reserved"] = "unset",
+ ["context.definition"] = "keyword",
+ ["context.warning"] = "invalid",
+ ["context.command"] = "unset",
+ ["context.grouping"] = "unset",
+ ["context.primitive"] = "keyword",
+ ["context.plain"] = "unset",
+ ["context.user"] = "unset",
+ ["context.data"] = "text source",
+ ["context.text"] = "text source",
+ }
+
+ local function styler(namespace)
+ local done = { }
+ local style = function(what,where)
+ if not what or not where then
+ report()
+ report("? %-5s %-20s %s",namespace,what or "?",where or "?")
+ report()
+ os.exit()
+ end
+-- if mapping then
+-- what = mapping[what] or what
+-- end
+ local hash = what .. "." .. where
+ if done[hash] then
+ report("- %-5s %-20s %s",namespace,what,where)
+ else
+ -- report("+ %-5s %-20s %s",namespace,what,where)
+ done[hash] = true
+ end
+ return hash .. "." .. namespace
+ end
+ return style, function(what,where) return { name = style(what, where) } end
+ end
+
+ local function embedded(name)
+ return { { include = "source.context." .. name } }
+ end
+
+ -- The tex lexer.
+
+ do
+
+ local interface_lowlevel = loaddefinitions("scite-context-data-context.lua")
+ local interface_interfaces = loaddefinitions("scite-context-data-interfaces.lua")
+ local interface_tex = loaddefinitions("scite-context-data-tex.lua")
+
+ local constants = interface_lowlevel.constants
+ local helpers = interface_lowlevel.helpers
+ local interfaces = interface_interfaces.common
+ local primitives = { }
+ local overloaded = { }
+
+ for i=1,#helpers do
+ overloaded[helpers[i]] = true
+ end
+ for i=1,#constants do
+ overloaded[constants[i]] = true
+ end
+
+ local function add(data)
+ for k, v in next, data do
+ if v ~= "/" and v ~= "-" then
+ if not overloaded[v] then
+ primitives[#primitives+1] = v
+ end
+ v = "normal" .. v
+ if not overloaded[v] then
+ primitives[#primitives+1] = v
+ end
+ end
+ end
+ end
+
+ add(interface_tex.tex)
+ add(interface_tex.etex)
+ add(interface_tex.pdftex)
+ add(interface_tex.aleph)
+ add(interface_tex.omega)
+ add(interface_tex.luatex)
+ add(interface_tex.xetex)
+
+ local luacommands = {
+ "ctxlua", "ctxcommand", "ctxfunction",
+ "ctxlatelua", "ctxlatecommand",
+ "cldcommand", "cldcontext",
+ "luaexpr", "luascript", "luathread",
+ "directlua", "latelua",
+ }
+
+ local luaenvironments = {
+ "luacode",
+ "luasetups", "luaparameterset",
+ "ctxfunction", "ctxfunctiondefinition",
+ }
+
+ local mpscommands = {
+ "reusableMPgraphic", "usableMPgraphic",
+ "uniqueMPgraphic", "uniqueMPpagegraphic",
+ "useMPgraphic", "reuseMPgraphic",
+ "MPpositiongraphic",
+ }
+
+ local mpsenvironments_o = {
+ "MPpage"
+ }
+
+ local mpsenvironments_a = {
+ "MPcode", "useMPgraphic", "reuseMPgraphic",
+ "MPinclusions", "MPinitializations", "MPdefinitions", "MPextensions",
+ "MPgraphic", "MPcalculation",
+ }
+
+ -- clf_a-zA-z_
+
+ -- btx|xml a-z
+ -- a-z btx|xml a-z
+
+ -- mp argument {...text}
+ local function words(list)
+ table.sort(list,sorter)
+ return "\\\\(" .. table.concat(list,"|") .. ")" .. "(?=[^a-zA-Z])"
+ end
+
+ local function bwords(list)
+ table.sort(list,sorter)
+ return "(\\\\(" .. table.concat(list,"|") .. "))\\s*(\\{)"
+ end
+
+ local function ewords()
+ return "(\\})"
+ end
+
+ local function environments(list)
+ table.sort(list,sorter)
+ last = table.concat(list,"|")
+ if #list > 1 then
+ last = "(?:" .. last .. ")"
+ end
+ return capture("\\\\start" .. last), capture("\\\\stop" .. last)
+ end
+
+ local capturedconstants = words(constants)
+ local capturedprimitives = words(primitives)
+ local capturedhelpers = words(helpers)
+ local capturedcommands = words(interfaces)
+ local capturedmpscommands = words(mpscommands)
+
+ local spaces = "\\s*"
+ local identifier = "[a-zA-Z\\_@!?\127-\255]+"
+
+ local comment = "%.*$\\n?"
+ local ifprimitive = "\\\\if[a-zA-Z\\_@!?\127-\255]*"
+ local csname = "\\\\[a-zA-Z\\_@!?\127-\255]+"
+ local csprefix = "\\\\(btx|xml)[a-z]+"
+ local cssuffix = "\\\\[a-z]+(btx|xml)[a-z]*"
+ local csreserved = "\\\\(\\?\\?|[a-z]\\!)[a-zA-Z\\_@!?\127-\255]+"
+
+ local luaenvironmentopen,
+ luaenvironmentclose = environments(luaenvironments)
+ local luacommandopen,
+ luacommandclose = environments(luacommands)
+
+ local mpsenvironmentopen_o,
+ mpsenvironmentclose_o = environments(mpsenvironments_o)
+ local mpsenvironmentopen_a,
+ mpsenvironmentclose_a = environments(mpsenvironments_a)
+
+ local argumentopen = capture("\\{")
+ local argumentclose = capture("\\}")
+ local argumentcontent = capture("[^\\}]*")
+
+ local optionopen = capture("\\[")
+ local optionclose = capture("\\]")
+ local optioncontent = capture("[^\\]]*")
+
+ -- not ok yet, todo: equal in settings .. but it would become quite ugly, lpeg wins here
+ -- so instead we color differently
+
+ local option = "(?:" .. optionopen .. optioncontent .. optionclose .. ")?"
+ local argument = "(?:" .. argumentopen .. argumentcontent .. argumentclose .. ")?"
+
+ local mpsenvironmentopen_o = mpsenvironmentopen_o .. spaces .. option .. spaces .. option
+ local mpsenvironmentopen_a = mpsenvironmentopen_a .. spaces .. argument .. spaces .. argument
+
+ local style, styled = styler("tex")
+
+ local capturedgroupings = oneof {
+ "{", "}", "$"
+ }
+
+ local capturedextras = oneof {
+ "~", "%", "^", "&", "_",
+ "-", "+", "/",
+ "'", "`",
+ "\\", "|",
+ }
+
+ local capturedspecials = oneof {
+ "(", ")", "[", "]", "<", ">",
+ "#", "=", '"',
+ }
+
+ local capturedescaped = "\\\\."
+
+ registerlexer {
+
+ category = "tex",
+ description = "ConTeXt TEX",
+ suffixes = { "tex", "mkiv", "mkvi", "mkix", "mkxi", "mkil", "mkxl", "mklx" },
+ version = "1.0.0",
+
+ setup = configuration {
+ pairs = {
+ { "{", "}" },
+ { "[", "]" },
+ { "(", ")" },
+ },
+ comments = {
+ inline = "%",
+ },
+ },
+
+ repository = {
+
+ comment = {
+ name = style("context.comment", "comment"),
+ match = texcomment,
+ },
+
+ constant = {
+ name = style("context.constant", "commands.constant"),
+ match = capturedconstants,
+ },
+
+ ifprimitive = {
+ name = style("context.primitive", "commands.if"),
+ match = ifprimitive,
+ },
+
+ primitive = {
+ name = style("context.primitive", "commands.primitive"),
+ match = capturedprimitives,
+ },
+
+ helper = {
+ name = style("context.plain", "commands.plain"),
+ match = capturedhelpers,
+ },
+
+ command = {
+ name = style("context.command", "commands.context"),
+ match = capturedcommands,
+ },
+
+ csname = {
+ name = style("context.user", "commands.user"),
+ match = csname,
+ },
+
+ escaped = {
+ name = style("context.command", "commands.escaped"),
+ match = capturedescaped,
+ },
+
+ subsystem_prefix = {
+ name = style("context.embedded", "subsystem.prefix"),
+ match = csprefix,
+ },
+
+ subsystem_suffix = {
+ name = style("context.embedded", "subsystem.suffix"),
+ match = cssuffix,
+ },
+
+ grouping = {
+ name = style("context.grouping", "symbols.groups"),
+ match = capturedgroupings,
+ },
+
+ extra = {
+ name = style("context.extra", "symbols.extras"),
+ match = capturedextras,
+ },
+
+ special = {
+ name = style("context.special", "symbols.special"),
+ match = capturedspecials,
+ },
+
+ reserved = {
+ name = style("context.reserved", "commands.reserved"),
+ match = csreserved,
+ },
+
+ lua_environment = {
+ ["begin"] = luaenvironmentopen,
+ ["end"] = luaenvironmentclose,
+ patterns = embedded("cld"),
+ beginCaptures = { ["0"] = styled("context.embedded", "lua.environment.open") },
+ endCaptures = { ["0"] = styled("context.embedded", "lua.environment.close") },
+ },
+
+ lua_command = {
+ ["begin"] = luacommandopen,
+ ["end"] = luacommandclose,
+ patterns = embedded("cld"),
+ beginCaptures = {
+ ["1"] = styled("context.embedded", "lua.command.open"),
+ ["2"] = styled("context.grouping", "lua.command.open"),
+ },
+ endCaptures = {
+ ["1"] = styled("context.grouping", "lua.command.close"),
+ },
+
+ },
+
+ metafun_environment_o = {
+ ["begin"] = mpsenvironmentopen_o,
+ ["end"] = mpsenvironmentclose_o,
+ patterns = embedded("mps"),
+ beginCaptures = {
+ ["1"] = styled("context.embedded", "metafun.environment.start.o"),
+ ["2"] = styled("context.embedded", "metafun.environment.open.o.1"),
+ ["3"] = styled("context.warning", "metafun.environment.content.o.1"),
+ ["4"] = styled("context.embedded", "metafun.environment.close.o.1"),
+ ["5"] = styled("context.embedded", "metafun.environment.open.o.2"),
+ ["6"] = styled("context.warning", "metafun.environment.content.o.2"),
+ ["7"] = styled("context.embedded", "metafun.environment.close.o.2"),
+ },
+ endCaptures = {
+ ["0"] = styled("context.embedded", "metafun.environment.stop.o")
+ },
+ },
+
+ metafun_environment_a = {
+ ["begin"] = mpsenvironmentopen_a,
+ ["end"] = mpsenvironmentclose_a,
+ patterns = embedded("mps"),
+ beginCaptures = {
+ ["1"] = styled("context.embedded", "metafun.environment.start.a"),
+ ["2"] = styled("context.embedded", "metafun.environment.open.a.1"),
+ ["3"] = styled("context.warning", "metafun.environment.content.a.1"),
+ ["4"] = styled("context.embedded", "metafun.environment.close.a.1"),
+ ["5"] = styled("context.embedded", "metafun.environment.open.a.2"),
+ ["6"] = styled("context.warning", "metafun.environment.content.a.2"),
+ ["7"] = styled("context.embedded", "metafun.environment.close.a.2"),
+ },
+ endCaptures = {
+ ["0"] = styled("context.embedded", "metafun.environment.stop.a")
+ },
+ },
+
+ metafun_command = {
+ name = style("context.embedded", "metafun.command"),
+ match = capturedmpscommands,
+ },
+
+ },
+
+ patterns = {
+ include("#comment"),
+ include("#constant"),
+ include("#lua_environment"),
+ include("#lua_command"),
+ include("#metafun_environment_o"),
+ include("#metafun_environment_a"),
+ include("#metafun_command"),
+ include("#subsystem_prefix"),
+ include("#subsystem_suffix"),
+ include("#ifprimitive"),
+ include("#helper"),
+ include("#command"),
+ include("#primitive"),
+ include("#reserved"),
+ include("#csname"),
+ include("#escaped"),
+ include("#grouping"),
+ include("#special"),
+ include("#extra"),
+ },
+
+ }
+
+ end
+
+ -- The metafun lexer.
+
+ do
+
+ local metapostprimitives = { }
+ local metapostinternals = { }
+ local metapostshortcuts = { }
+ local metapostcommands = { }
+
+ local metafuninternals = { }
+ local metafunshortcuts = { }
+ local metafuncommands = { }
+
+ local mergedshortcuts = { }
+ local mergedinternals = { }
+
+ do
+
+ local definitions = loaddefinitions("scite-context-data-metapost.lua")
+
+ if definitions then
+ metapostprimitives = definitions.primitives or { }
+ metapostinternals = definitions.internals or { }
+ metapostshortcuts = definitions.shortcuts or { }
+ metapostcommands = definitions.commands or { }
+ end
+
+ local definitions = loaddefinitions("scite-context-data-metafun.lua")
+
+ if definitions then
+ metafuninternals = definitions.internals or { }
+ metafunshortcuts = definitions.shortcuts or { }
+ metafuncommands = definitions.commands or { }
+ end
+
+ for i=1,#metapostshortcuts do
+ mergedshortcuts[#mergedshortcuts+1] = metapostshortcuts[i]
+ end
+ for i=1,#metafunshortcuts do
+ mergedshortcuts[#mergedshortcuts+1] = metafunshortcuts[i]
+ end
+
+ for i=1,#metapostinternals do
+ mergedinternals[#mergedinternals+1] = metapostinternals[i]
+ end
+ for i=1,#metafuninternals do
+ mergedinternals[#mergedinternals+1] = metafuninternals[i]
+ end
+
+
+ end
+
+ local function words(list)
+ table.sort(list,sorter)
+ return "(" .. table.concat(list,"|") .. ")" .. "(?=[^a-zA-Z\\_@!?\127-\255])"
+ end
+
+ local capturedshortcuts = oneof(mergedshortcuts)
+ local capturedinternals = words(mergedinternals)
+ local capturedmetapostcommands = words(metapostcommands)
+ local capturedmetafuncommands = words(metafuncommands)
+ local capturedmetapostprimitives = words(metapostprimitives)
+
+ local capturedsuffixes = oneof {
+ "#@", "@#", "#"
+ }
+ local capturedspecials = oneof {
+ "#@", "@#", "#",
+ "(", ")", "[", "]", "{", "}",
+ "<", ">", "=", ":",
+ '"',
+ }
+ local capturedexatras = oneof {
+ "+-+", "++",
+ "~", "%", "^", "&",
+ "_", "-", "+", "*", "/",
+ "`", "'", "|", "\\",
+ }
+
+ local spaces = "\\s*"
+ local mandatespaces = "\\s+"
+
+ local identifier = "[a-zA-Z\\_@!?\127-\255]+"
+
+ local decnumber = "[\\-]?[0-9]+(\\.[0-9]+)?([eE]\\-?[0-9]+)?"
+
+ local comment = "%.*$\\n?"
+
+ local stringopen = "\""
+ local stringclose = stringopen
+
+ local qualifier = "[\\.]"
+ local optionalqualifier = spaces .. qualifier .. spaces
+
+ local capturedstringopen = capture(stringopen)
+ local capturedstringclose = capture(stringclose)
+
+ local capturedlua = capture("lua")
+
+ local capturedopen = capture("\\(")
+ local capturedclose = capture("\\)")
+
+ local capturedtexopen = capture("(?:b|verbatim)tex") .. mandatespaces
+ local capturedtexclose = mandatespaces .. capture("etex")
+
+ local texcommand = "\\[a-zA-Z\\_@!?\127-\255]+"
+
+ local style, styled = styler("mps")
+
+ registerlexer {
+
+ category = "mps",
+ description = "ConTeXt MetaFun",
+ suffixes = { "mp", "mpii", "mpiv", "mpxl" },
+ version = "1.0.0",
+
+ setup = configuration {
+ pairs = {
+ { "{", "}" },
+ { "[", "]" },
+ { "(", ")" },
+ },
+ comments = {
+ inline = "%",
+ },
+ },
+
+ repository = {
+
+ comment = {
+ name = style("context.comment", "comment"),
+ match = comment,
+ },
+
+ internal = {
+ name = style("context.reserved", "internal"),
+ match = capturedshortcuts,
+ },
+
+ shortcut = {
+ name = style("context.data", "shortcut"),
+ match = capturedinternals,
+ },
+
+ helper = {
+ name = style("context.command.metafun", "helper"),
+ match = capturedmetafuncommands,
+ },
+
+ plain = {
+ name = style("context.plain", "plain"),
+ match = capturedmetapostcommands,
+ },
+
+ primitive = {
+ name = style("context.primitive", "primitive"),
+ match = capturedmetapostprimitives,
+ },
+
+ quoted = {
+ name = style("context.string", "string.text"),
+ ["begin"] = stringopen,
+ ["end"] = stringclose,
+ beginCaptures = { ["0"] = styled("context.special", "string.open") },
+ endCaptures = { ["0"] = styled("context.special", "string.close") },
+ },
+
+ identifier = {
+ name = style("context.default", "identifier"),
+ match = identifier,
+ },
+
+ suffix = {
+ name = style("context.number", "suffix"),
+ match = capturedsuffixes,
+ },
+
+ special = {
+ name = style("context.special", "special"),
+ match = capturedspecials,
+ },
+
+ number = {
+ name = style("context.number", "number"),
+ match = decnumber,
+ },
+
+ extra = {
+ name = "context.extra",
+ match = capturedexatras,
+ },
+
+ luacall = {
+ ["begin"] = capturedlua .. spaces .. capturedopen .. spaces .. capturedstringopen,
+ ["end"] = capturedstringclose .. spaces .. capturedclose,
+ patterns = embedded("cld"),
+ beginCaptures = {
+ ["1"] = styled("context.embedded", "lua.command"),
+ ["2"] = styled("context.special", "lua.open"),
+ ["3"] = styled("context.special", "lua.text.open"),
+ },
+ endCaptures = {
+ ["1"] = styled("context.special", "lua.text.close"),
+ ["2"] = styled("context.special", "lua.close"),
+ },
+ },
+
+ -- default and embedded have the same color but differ in boldness
+
+ luacall_suffixed = {
+ name = style("context.embedded", "luacall"),
+ ["begin"] = capturedlua,
+ ["end"] = "(?!(" .. optionalqualifier .. identifier .. "))",
+ patterns = {
+ {
+ match = qualifier,
+ -- name = style("context.operator", "luacall.qualifier"),
+ name = style("context.default", "luacall.qualifier"),
+ },
+ }
+ },
+
+ texlike = { -- simplified variant
+ name = style("context.warning","unexpected.tex"),
+ match = texcommand,
+ },
+
+ texstuff = {
+ name = style("context.string", "tex"),
+ ["begin"] = capturedtexopen,
+ ["end"] = capturedtexclose,
+ patterns = embedded("tex"),
+ beginCaptures = { ["1"] = styled("context.primitive", "tex.open") },
+ endCaptures = { ["1"] = styled("context.primitive", "tex.close") },
+ },
+
+ },
+
+ patterns = {
+ include("#comment"),
+ include("#internal"),
+ include("#shortcut"),
+ include("#luacall_suffixed"),
+ include("#luacall"),
+ include("#helper"),
+ include("#plain"),
+ include("#primitive"),
+ include("#texstuff"),
+ include("#suffix"),
+ include("#identifier"),
+ include("#number"),
+ include("#quoted"),
+ include("#special"),
+ include("#texlike"),
+ include("#extra"),
+ },
+
+ }
+
+ end
+
+ -- The lua lexer.
+
+ do
+
+ local function words(list)
+ table.sort(list,sorter)
+ return "(" .. table.concat(list,"|") .. ")" .. "(?=[^a-zA-Z])"
+ end
+
+ local capturedkeywords = words {
+ "and", "break", "do", "else", "elseif", "end", "false", "for", "function", -- "goto",
+ "if", "in", "local", "nil", "not", "or", "repeat", "return", "then", "true",
+ "until", "while",
+ }
+
+ local capturedbuiltin = words {
+ "assert", "collectgarbage", "dofile", "error", "getmetatable",
+ "ipairs", "load", "loadfile", "module", "next", "pairs",
+ "pcall", "print", "rawequal", "rawget", "rawset", "require",
+ "setmetatable", "tonumber", "tostring", "type", "unpack", "xpcall", "select",
+ "string", "table", "coroutine", "debug", "file", "io", "lpeg", "math", "os", "package", "bit32", "utf8",
+ -- todo: also extra luametatex ones
+ }
+
+ local capturedconstants = words {
+ "_G", "_VERSION", "_M", "\\.\\.\\.", "_ENV",
+ "__add", "__call", "__concat", "__div", "__idiv", "__eq", "__gc", "__index",
+ "__le", "__lt", "__metatable", "__mode", "__mul", "__newindex",
+ "__pow", "__sub", "__tostring", "__unm", "__len",
+ "__pairs", "__ipairs",
+ "__close",
+ "NaN",
+ "<const>", "<toclose>",
+ }
+
+ local capturedcsnames = words { -- todo: option
+ "commands",
+ "context",
+ -- "ctxcmd",
+ -- "ctx",
+ "metafun",
+ "metapost",
+ "ctx[A-Za-z_]*",
+ }
+
+ local capturedoperators = oneof {
+ "+", "-", "*", "/", "%", "^",
+ "#", "=", "<", ">",
+ ";", ":", ",", ".",
+ "{", "}", "[", "]", "(", ")",
+ "|", "~", "'"
+ }
+
+ local spaces = "\\s*"
+
+ local identifier = "[_\\w][_\\w0-9]*"
+ local qualifier = "[\\.\\:]"
+ local optionalqualifier = spaces .. "[\\.\\:]*" .. spaces
+
+ local doublequote = "\""
+ local singlequote = "\'"
+
+ local doublecontent = "(?:\\\\\"|[^\"])*"
+ local singlecontent = "(?:\\\\\'|[^\'])*"
+
+ local captureddouble = capture(doublequote) .. capture(doublecontent) .. capture(doublequote)
+ local capturedsingle = capture(singlequote) .. capture(singlecontent) .. capture(singlequote)
+
+ local longcommentopen = "--\\[\\["
+ local longcommentclose = "\\]\\]"
+
+ local longstringopen = "\\[(=*)\\["
+ local longstringclose = "\\](\\2)\\]"
+
+ local shortcomment = "--.*$\\n?"
+
+ local hexnumber = "[\\-]?0[xX][A-Fa-f0-9]+(\\.[A-Fa-f0-9]+)?([eEpP]\\-?[A-Fa-f0-9]+)?"
+ local decnumber = "[\\-]?[0-9]+(\\.[0-9]+)?([eEpP]\\-?[0-9]+)?"
+
+ local capturedidentifier = capture(identifier)
+ local capturedgotodelimiter = capture("::")
+ local capturedqualifier = capture(qualifier)
+ local capturedgoto = capture("goto")
+
+ local style, styled = styler("lua")
+
+ local lualexer = {
+
+ category = "lua",
+ description = "ConTeXt Lua",
+ -- suffixes = { "lua", "luc", "cld", "tuc", "luj", "lum", "tma", "lfg", "luv", "lui" },
+ version = "1.0.0",
+
+ setup = configuration {
+ pairs = {
+ { "(", ")" },
+ { "{", "}" },
+ { "[", "]" },
+ },
+ comments = {
+ inline = "--",
+ display = { "--[[", "]]" },
+ },
+ },
+
+ repository = {
+
+ shortcomment = {
+ name = style("context.comment", "comment.short"),
+ match = shortcomment,
+ },
+
+ longcomment = {
+ name = style("context.comment", "comment.long"),
+ ["begin"] = longcommentopen,
+ ["end"] = longcommentclose,
+ },
+
+ keyword = {
+ name = style("context.keyword", "reserved.keyword"),
+ match = capturedkeywords,
+ },
+
+ builtin = {
+ name = style("context.plain", "reserved.builtin"),
+ match = capturedbuiltin,
+ },
+
+ constant = {
+ name = style("context.data", "reserved.constants"),
+ match = capturedconstants,
+ },
+
+ csname = {
+ name = style("context.user", "csname"),
+ ["begin"] = capturedcsnames,
+ ["end"] = "(?!(" .. optionalqualifier .. identifier .. "))",
+ patterns = {
+ {
+ match = qualifier,
+ name = style("context.operator", "csname.qualifier")
+ },
+ }
+ },
+
+ identifier_keyword = {
+ match = spaces .. capturedqualifier .. spaces .. capturedkeywords,
+ captures = {
+ ["1"] = styled("context.operator", "identifier.keyword"),
+ ["2"] = styled("context.warning", "identifier.keyword"),
+ },
+ },
+
+ identifier_valid = {
+ name = style("context.default", "identifier.valid"),
+ match = identifier,
+ },
+
+ ["goto"] = {
+ match = capturedgoto .. spaces .. capturedidentifier,
+ captures = {
+ ["1"] = styled("context.keyword", "goto.keyword"),
+ ["2"] = styled("context.grouping", "goto.target"),
+ }
+ },
+
+ label = {
+ match = capturedgotodelimiter .. capturedidentifier .. capturedgotodelimiter,
+ captures = {
+ ["1"] = styled("context.keyword", "label.open"),
+ ["2"] = styled("context.grouping", "label.target"),
+ ["3"] = styled("context.keyword", "label.close"),
+ }
+ },
+
+ operator = {
+ name = style("context.special", "operator"),
+ match = capturedoperators,
+ },
+
+ string_double = {
+ match = captureddouble,
+ captures = {
+ ["1"] = styled("context.special", "doublequoted.open"),
+ ["2"] = styled("context.string", "doublequoted.text"),
+ ["3"] = styled("context.special", "doublequoted.close"),
+ },
+ },
+
+ string_single = {
+ match = capturedsingle,
+ captures = {
+ ["1"] = styled("context.special", "singlequoted.open"),
+ ["2"] = styled("context.string", "singlequoted.text"),
+ ["3"] = styled("context.special", "singlequoted.close"),
+ },
+ },
+
+ string_long = {
+ name = style("context.string", "long.text"),
+ ["begin"] = longstringopen,
+ ["end"] = longstringclose,
+ beginCaptures = { ["0"] = styled("context.special", "string.long.open") },
+ endCaptures = { ["0"] = styled("context.special", "string.long.close") },
+ },
+
+ number_hex = {
+ name = style("context.number", "hexnumber"),
+ match = hexnumber,
+ },
+
+ number = {
+ name = style("context.number", "decnumber"),
+ match = decnumber,
+ },
+
+ },
+
+ patterns = {
+ include("#keyword"),
+ include("#buildin"),
+ include("#constant"),
+ include("#csname"),
+ include("#goto"),
+ include("#number_hex"),
+ include("#number"),
+ include("#identifier_keyword"),
+ include("#identifier_valid"),
+ include("#longcomment"),
+ include("#string_long"),
+ include("#string_double"),
+ include("#string_single"),
+ include("#shortcomment"),
+ include("#label"),
+ include("#operator"),
+ },
+
+ }
+
+ local texstringopen = "\\\\!!bs"
+ local texstringclose = "\\\\!!es"
+ local texcommand = "\\\\[A-Za-z\127-\255@\\!\\?_]*"
+
+ local cldlexer = {
+
+ category = "cld",
+ description = "ConTeXt CLD",
+ suffixes = { "lua", "luc", "cld", "tuc", "luj", "lum", "tma", "lfg", "luv", "lui" },
+ version = lualexer.version,
+ setup = lualexer.setup,
+
+ repository = {
+
+ texstring = {
+ name = style("context.string", "texstring.text"),
+ ["begin"] = texstringopen,
+ ["end"] = texstringclose,
+ beginCaptures = { ["0"] = styled("context.special", "texstring.open") },
+ endCaptures = { ["0"] = styled("context.special", "texstring.close") },
+ },
+
+ -- texcomment = {
+ -- -- maybe some day
+ -- },
+
+ texcommand = {
+ name = style("context.warning", "texcommand"),
+ match = texcommand
+ },
+
+ },
+
+ patterns = {
+ include("#texstring"),
+ -- include("#texcomment"),
+ include("#texcommand"),
+ },
+
+ }
+
+ table.merge (cldlexer.repository,lualexer.repository)
+ table.imerge(cldlexer.patterns, lualexer.patterns)
+
+ registerlexer(lualexer)
+ registerlexer(cldlexer)
+
+ end
+
+ -- The xml lexer.
+
+ local xmllexer, xmlconfiguration do
+
+ local spaces = "\\s*"
+
+ local namespace = "(?:[-\\w.]+:)?"
+ local name = "[-\\w.:]+"
+
+ local equal = "="
+
+ local elementopen = "<"
+ local elementclose = ">"
+ local elementopenend = "</"
+ local elementempty = "/?"
+ local elementnoclose = "?:([^>]*)"
+
+ local entity = "&.*?;"
+
+ local doublequote = "\""
+ local singlequote = "\'"
+
+ local doublecontent = "(?:\\\\\"|[^\"])*"
+ local singlecontent = "(?:\\\\\'|[^\'])*"
+
+ local captureddouble = capture(doublequote) .. capture(doublecontent) .. capture(doublequote)
+ local capturedsingle = capture(singlequote) .. capture(singlecontent) .. capture(singlequote)
+
+ local capturednamespace = capture(namespace)
+ local capturedname = capture(name)
+ local capturedopen = capture(elementopen)
+ local capturedclose = capture(elementclose)
+ local capturedempty = capture(elementempty)
+ local capturedopenend = capture(elementopenend)
+
+ local cdataopen = "<!\\[CDATA\\["
+ local cdataclose = "]]>"
+
+ local commentopen = "<!--"
+ local commentclose = "-->"
+
+ local processingopen = "<\\?"
+ local processingclose = "\\?>"
+
+ local instructionopen = processingopen .. name
+ local instructionclose = processingclose
+
+ local xmlopen = processingopen .. "xml"
+ local xmlclose = processingclose
+
+ local luaopen = processingopen .. "lua"
+ local luaclose = processingclose
+
+ local style, styled = styler("xml")
+
+ registerlexer {
+
+ category = "xml",
+ description = "ConTeXt XML",
+ suffixes = {
+ "xml", "xsl", "xsd", "fo", "exa", "rlb", "rlg", "rlv", "rng",
+ "xfdf", "xslt", "dtd", "lmx", "htm", "html", "xhtml", "ctx",
+ "export", "svg", "xul",
+ },
+ version = "1.0.0",
+
+ setup = configuration {
+ comments = {
+ display = { "<!--", "-->" },
+ },
+ },
+
+ repository = {
+
+ attribute_double = {
+ match = capturednamespace .. capturedname .. spaces .. equal .. spaces .. captureddouble,
+ captures = {
+ ["1"] = styled("context.plain", "attribute.double.namespace"),
+ ["2"] = styled("context.constant", "attribute.double.name"),
+ ["3"] = styled("context.special", "attribute.double.open"),
+ ["4"] = styled("context.string", "attribute.double.text"),
+ ["5"] = styled("context.special", "attribute.double.close"),
+ },
+ },
+
+ attribute_single = {
+ match = capturednamespace .. capturedname .. spaces .. equal .. spaces .. capturedsingle,
+ captures = {
+ ["1"] = styled("context.plain", "attribute.single.namespace"),
+ ["2"] = styled("context.constant", "attribute.single.name"),
+ ["3"] = styled("context.special", "attribute.single.open"),
+ ["4"] = styled("context.string", "attribute.single.text"),
+ ["5"] = styled("context.special", "attribute.single.close"),
+ },
+ },
+
+ attributes = {
+ patterns = {
+ include("#attribute_double"),
+ include("#attribute_single"),
+ }
+ },
+
+ entity = {
+ name = style("context.constant", "entity"),
+ match = entity,
+ },
+
+ instruction = {
+ name = style("context.default", "instruction.text"),
+ ["begin"] = instructionopen,
+ ["end"] = instructionclose,
+ beginCaptures = { ["0"] = styled("context.command", "instruction.open") },
+ endCaptures = { ["0"] = styled("context.command", "instruction.close") },
+ },
+
+ instruction_xml = {
+ ["begin"] = xmlopen,
+ ["end"] = xmlclose,
+ beginCaptures = { ["0"] = styled("context.command", "instruction.xml.open") },
+ endCaptures = { ["0"] = styled("context.command", "instruction.xml.close") },
+ patterns = { include("#attributes") }
+ },
+
+ instruction_lua = {
+ ["begin"] = luaopen,
+ ["end"] = luaclose,
+ patterns = embedded("cld"),
+ beginCaptures = { ["0"] = styled("context.command", "instruction.lua.open") },
+ endCaptures = { ["0"] = styled("context.command", "instruction.lua.close") },
+ },
+
+ cdata = {
+ name = style("context.default", "cdata.text"),
+ ["begin"] = cdataopen,
+ ["end"] = cdataclose,
+ beginCaptures = { ["0"] = styled("context.command", "cdata.open") },
+ endCaptures = { ["0"] = styled("context.command", "cdata.close") },
+ },
+
+ comment = {
+ name = style("context.comment", "comment.text"),
+ ["begin"] = commentopen,
+ ["end"] = commentclose,
+ beginCaptures = { ["0"] = styled("context.command", "comment.open") },
+ endCaptures = { ["0"] = styled("context.command", "comment.close") },
+ },
+
+ open = {
+ ["begin"] = capturedopen .. capturednamespace .. capturedname,
+ ["end"] = capturedempty .. capturedclose,
+ patterns = { include("#attributes") },
+ beginCaptures = {
+ ["1"] = styled("context.keyword", "open.open"),
+ ["2"] = styled("context.plain", "open.namespace"),
+ ["3"] = styled("context.keyword", "open.name"),
+ },
+ endCaptures = {
+ ["1"] = styled("context.keyword", "open.empty"),
+ ["2"] = styled("context.keyword", "open.close"),
+ },
+ },
+
+ close = {
+ match = capturedopenend .. capturednamespace .. capturedname .. spaces .. capturedclose,
+ captures = {
+ ["1"] = styled("context.keyword", "close.open"),
+ ["2"] = styled("context.plain", "close.namespace"),
+ ["3"] = styled("context.keyword", "close.name"),
+ ["4"] = styled("context.keyword", "close.close"),
+ },
+ },
+
+ element_error = {
+ name = style("context.error","error"),
+ match = elementopen .. elementnoclose .. elementclose,
+ },
+
+ },
+
+ patterns = {
+ -- include("#preamble"),
+ include("#comment"),
+ include("#cdata"),
+ -- include("#doctype"),
+ include("#instruction_xml"),
+ include("#instruction_lua"),
+ include("#instruction"),
+ include("#close"),
+ include("#open"),
+ include("#element_error"),
+ include("#entity"),
+ },
+
+ }
+
+ end
+
+ -- The bibtex lexer. Again we assume the keys to be on the same line as the
+ -- first snippet of the value.
+
+ do
+
+ local spaces = "\\s*"
+ local open = "{"
+ local close = "}"
+ local hash = "#"
+ local equal = "="
+ local comma = ","
+
+ local doublequote = "\""
+ local doublecontent = "(?:\\\\\"|[^\"])*"
+
+ local singlequote = "\'"
+ local singlecontent = "(?:\\\\\'|[^\'])*"
+
+ local groupopen = "{"
+ local groupclose = "}"
+ local groupcontent = "(?:\\\\{|\\\\}|[^\\{\\}])*"
+
+ local shortcut = "@(?:string|String|STRING)" -- enforce consistency
+ local comment = "@(?:comment|Comment|COMMENT)" -- enforce consistency
+
+ local keyword = "[a-zA-Z0-9\\_@:\\-]+"
+
+ local capturedcomment = spaces .. capture(comment) .. spaces
+ local capturedshortcut = spaces .. capture(shortcut) .. spaces
+ local capturedkeyword = spaces .. capture(keyword) .. spaces
+ local capturedopen = spaces .. capture(open) .. spaces
+ local capturedclose = spaces .. capture(close) .. spaces
+ local capturedequal = spaces .. capture(equal) .. spaces
+ local capturedcomma = spaces .. capture(comma) .. spaces
+ local capturedhash = spaces .. capture(hash) .. spaces
+
+ local captureddouble = spaces .. capture(doublequote) .. capture(doublecontent) .. capture(doublequote) .. spaces
+ local capturedsingle = spaces .. capture(singlequote) .. capture(singlecontent) .. capture(singlequote) .. spaces
+ local capturedgroup = spaces .. capture(groupopen) .. capture(groupcontent) .. capture(groupclose) .. spaces
+
+ local forget = "%.*$\\n?"
+
+ local style, styled = styler("bibtex")
+
+ registerlexer {
+
+ category = "bibtex",
+ description = "ConTeXt bibTeX",
+ suffixes = { "bib", "btx" },
+ version = "1.0.0",
+
+ setup = configuration {
+ pairs = {
+ { "{", "}" },
+ },
+ comments = {
+ inline = "%",
+ },
+ },
+
+ repository = {
+
+ forget = {
+ name = style("context.comment", "comment.comment.inline"),
+ match = forget,
+ },
+
+ comment = {
+ name = style("context.comment", "comment.comment.content"),
+ ["begin"] = capturedcomment .. capturedopen,
+ ["end"] = capturedclose,
+ beginCaptures = {
+ ["1"] = styled("context.keyword", "comment.name"),
+ ["2"] = styled("context.grouping", "comment.open"),
+ },
+ endCaptures = {
+ ["1"] = styled("context.grouping", "comment.close"),
+ },
+ },
+
+ -- a bit inefficient but good enough
+
+ string_double = {
+ match = capturedkeyword .. capturedequal .. captureddouble,
+ captures = {
+ ["1"] = styled("context.command","doublequoted.key"),
+ ["2"] = styled("context.operator","doublequoted.equal"),
+ ["3"] = styled("context.special", "doublequoted.open"),
+ ["4"] = styled("context.text", "doublequoted.text"),
+ ["5"] = styled("context.special", "doublequoted.close"),
+ },
+ },
+
+ string_single = {
+ match = capturedkeyword .. capturedequal .. capturedsingle,
+ captures = {
+ ["1"] = styled("context.command","singlequoted.key"),
+ ["2"] = styled("context.operator","singlequoted.equal"),
+ ["3"] = styled("context.special", "singlequoted.open"),
+ ["4"] = styled("context.text", "singlequoted.text"),
+ ["5"] = styled("context.special", "singlequoted.close"),
+ },
+ },
+
+ string_grouped = {
+ match = capturedkeyword .. capturedequal .. capturedgroup,
+ captures = {
+ ["1"] = styled("context.command","grouped.key"),
+ ["2"] = styled("context.operator","grouped.equal"),
+ ["3"] = styled("context.operator", "grouped.open"),
+ ["4"] = styled("context.text", "grouped.text"),
+ ["5"] = styled("context.operator", "grouped.close"),
+ },
+ },
+
+ string_value = {
+ match = capturedkeyword .. capturedequal .. capturedkeyword,
+ captures = {
+ ["1"] = styled("context.command", "value.key"),
+ ["2"] = styled("context.operator", "value.equal"),
+ ["3"] = styled("context.text", "value.text"),
+ },
+ },
+
+ string_concat = {
+ patterns = {
+ {
+ match = capturedhash .. captureddouble,
+ captures = {
+ ["1"] = styled("context.operator","concat.doublequoted.concatinator"),
+ ["2"] = styled("context.special", "concat.doublequoted.open"),
+ ["3"] = styled("context.text", "concat.doublequoted.text"),
+ ["4"] = styled("context.special", "concat.doublequoted.close"),
+ }
+ },
+ {
+ match = capturedhash .. capturedsingle,
+ captures = {
+ ["1"] = styled("context.operator","concat.singlequoted.concatinator"),
+ ["2"] = styled("context.special", "concat.singlequoted.open"),
+ ["3"] = styled("context.text", "concat.singlequoted.text"),
+ ["4"] = styled("context.special", "concat.singlequoted.close"),
+ },
+ },
+ {
+ match = capturedhash .. capturedgroup,
+ captures = {
+ ["1"] = styled("context.operator","concat.grouped.concatinator"),
+ ["2"] = styled("context.operator", "concat.grouped.open"),
+ ["3"] = styled("context.text", "concat.grouped.text"),
+ ["4"] = styled("context.operator", "concat.grouped.close"),
+ },
+ },
+ {
+ match = capturedhash .. capturedkeyword,
+ captured = {
+ ["1"] = styled("context.operator","concat.value.concatinator"),
+ ["2"] = styled("context.text", "concat.value.text"),
+ },
+ },
+ },
+ },
+
+ separator = {
+ match = capturedcomma,
+ name = style("context.operator","definition.separator"),
+ },
+
+ definition = {
+ name = style("context.warning","definition.error"),
+ ["begin"] = capturedkeyword .. capturedopen .. capturedkeyword .. capturedcomma,
+ ["end"] = capturedclose,
+ beginCaptures = {
+ ["1"] = styled("context.keyword", "definition.category"),
+ ["2"] = styled("context.grouping", "definition.open"),
+ ["3"] = styled("context.warning", "definition.label.text"),
+ ["3"] = styled("context.operator", "definition.label.separator"),
+ },
+ endCaptures = {
+ ["1"] = styled("context.grouping", "definition.close"),
+ },
+ patterns = {
+ include("#string_double"),
+ include("#string_single"),
+ include("#string_grouped"),
+ include("#string_value"),
+ include("#string_concat"),
+ include("#separator"),
+ },
+ },
+
+ concatinator = {
+ match = capturedhash,
+ name = style("context.operator","definition.concatinator"),
+ },
+
+ shortcut = {
+ name = style("context.warning","shortcut.error"),
+ ["begin"] = capturedshortcut .. capturedopen,
+ ["end"] = capturedclose,
+ beginCaptures = {
+ ["1"] = styled("context.keyword", "shortcut.name"),
+ ["2"] = styled("context.grouping", "shortcut.open"),
+ },
+ endCaptures = {
+ ["1"] = styled("context.grouping", "shortcut.close"),
+ },
+ patterns = {
+ include("#string_double"),
+ include("#string_single"),
+ include("#string_grouped"),
+ include("#string_value"),
+ include("#string_concat"),
+ },
+ },
+
+ },
+
+ patterns = {
+ include("#forget"),
+ include("#comment"),
+ include("#shortcut"),
+ include("#definition"),
+ },
+
+ }
+
+ end
+
+ -- The sql lexer (only needed occasionally in documentation and so).
+
+ do
+
+ -- ANSI SQL 92 | 99 | 2003
+
+ local function words(list)
+ table.sort(list,sorter)
+ local str = table.concat(list,"|")
+ return "(" .. str .. "|" .. string.upper(str) .. ")" .. "(?=[^a-zA-Z])"
+ end
+
+ local capturedkeywords = words {
+ "absolute", "action", "add", "after", "all", "allocate", "alter", "and", "any",
+ "are", "array", "as", "asc", "asensitive", "assertion", "asymmetric", "at",
+ "atomic", "authorization", "avg", "before", "begin", "between", "bigint",
+ "binary", "bit", "bit_length", "blob", "boolean", "both", "breadth", "by",
+ "call", "called", "cascade", "cascaded", "case", "cast", "catalog", "char",
+ "char_length", "character", "character_length", "check", "clob", "close",
+ "coalesce", "collate", "collation", "column", "commit", "condition", "connect",
+ "connection", "constraint", "constraints", "constructor", "contains", "continue",
+ "convert", "corresponding", "count", "create", "cross", "cube", "current",
+ "current_date", "current_default_transform_group", "current_path",
+ "current_role", "current_time", "current_timestamp",
+ "current_transform_group_for_type", "current_user", "cursor", "cycle", "data",
+ "date", "day", "deallocate", "dec", "decimal", "declare", "default",
+ "deferrable", "deferred", "delete", "depth", "deref", "desc", "describe",
+ "descriptor", "deterministic", "diagnostics", "disconnect", "distinct", "do",
+ "domain", "double", "drop", "dynamic", "each", "element", "else", "elseif",
+ "end", "equals", "escape", "except", "exception", "exec", "execute", "exists",
+ "exit", "external", "extract", "false", "fetch", "filter", "first", "float",
+ "for", "foreign", "found", "free", "from", "full", "function", "general", "get",
+ "global", "go", "goto", "grant", "group", "grouping", "handler", "having",
+ "hold", "hour", "identity", "if", "immediate", "in", "indicator", "initially",
+ "inner", "inout", "input", "insensitive", "insert", "int", "integer",
+ "intersect", "interval", "into", "is", "isolation", "iterate", "join", "key",
+ "language", "large", "last", "lateral", "leading", "leave", "left", "level",
+ "like", "local", "localtime", "localtimestamp", "locator", "loop", "lower",
+ "map", "match", "max", "member", "merge", "method", "min", "minute", "modifies",
+ "module", "month", "multiset", "names", "national", "natural", "nchar", "nclob",
+ "new", "next", "no", "none", "not", "null", "nullif", "numeric", "object",
+ "octet_length", "of", "old", "on", "only", "open", "option", "or", "order",
+ "ordinality", "out", "outer", "output", "over", "overlaps", "pad", "parameter",
+ "partial", "partition", "path", "position", "precision", "prepare", "preserve",
+ "primary", "prior", "privileges", "procedure", "public", "range", "read",
+ "reads", "real", "recursive", "ref", "references", "referencing", "relative",
+ "release", "repeat", "resignal", "restrict", "result", "return", "returns",
+ "revoke", "right", "role", "rollback", "rollup", "routine", "row", "rows",
+ "savepoint", "schema", "scope", "scroll", "search", "second", "section",
+ "select", "sensitive", "session", "session_user", "set", "sets", "signal",
+ "similar", "size", "smallint", "some", "space", "specific", "specifictype",
+ "sql", "sqlcode", "sqlerror", "sqlexception", "sqlstate", "sqlwarning", "start",
+ "state", "static", "submultiset", "substring", "sum", "symmetric", "system",
+ "system_user", "table", "tablesample", "temporary", "then", "time", "timestamp",
+ "timezone_hour", "timezone_minute", "to", "trailing", "transaction", "translate",
+ "translation", "treat", "trigger", "trim", "true", "under", "undo", "union",
+ "unique", "unknown", "unnest", "until", "update", "upper", "usage", "user",
+ "using", "value", "values", "varchar", "varying", "view", "when", "whenever",
+ "where", "while", "window", "with", "within", "without", "work", "write", "year",
+ "zone",
+ }
+
+ -- The dialects list is taken from drupal.org with standard subtracted.
+ --
+ -- MySQL 3.23.x | 4.x | 5.x
+ -- PostGreSQL 8.1
+ -- MS SQL Server 2000
+ -- MS ODBC
+ -- Oracle 10.2
+
+ local captureddialects = words {
+ "a", "abort", "abs", "access", "ada", "admin", "aggregate", "alias", "also",
+ "always", "analyse", "analyze", "assignment", "attribute", "attributes", "audit",
+ "auto_increment", "avg_row_length", "backup", "backward", "bernoulli", "bitvar",
+ "bool", "break", "browse", "bulk", "c", "cache", "cardinality", "catalog_name",
+ "ceil", "ceiling", "chain", "change", "character_set_catalog",
+ "character_set_name", "character_set_schema", "characteristics", "characters",
+ "checked", "checkpoint", "checksum", "class", "class_origin", "cluster",
+ "clustered", "cobol", "collation_catalog", "collation_name", "collation_schema",
+ "collect", "column_name", "columns", "command_function", "command_function_code",
+ "comment", "committed", "completion", "compress", "compute", "condition_number",
+ "connection_name", "constraint_catalog", "constraint_name", "constraint_schema",
+ "containstable", "conversion", "copy", "corr", "covar_pop", "covar_samp",
+ "createdb", "createrole", "createuser", "csv", "cume_dist", "cursor_name",
+ "database", "databases", "datetime", "datetime_interval_code",
+ "datetime_interval_precision", "day_hour", "day_microsecond", "day_minute",
+ "day_second", "dayofmonth", "dayofweek", "dayofyear", "dbcc", "defaults",
+ "defined", "definer", "degree", "delay_key_write", "delayed", "delimiter",
+ "delimiters", "dense_rank", "deny", "derived", "destroy", "destructor",
+ "dictionary", "disable", "disk", "dispatch", "distinctrow", "distributed", "div",
+ "dual", "dummy", "dump", "dynamic_function", "dynamic_function_code", "enable",
+ "enclosed", "encoding", "encrypted", "end-exec", "enum", "errlvl", "escaped",
+ "every", "exclude", "excluding", "exclusive", "existing", "exp", "explain",
+ "fields", "file", "fillfactor", "final", "float4", "float8", "floor", "flush",
+ "following", "force", "fortran", "forward", "freetext", "freetexttable",
+ "freeze", "fulltext", "fusion", "g", "generated", "granted", "grants",
+ "greatest", "header", "heap", "hierarchy", "high_priority", "holdlock", "host",
+ "hosts", "hour_microsecond", "hour_minute", "hour_second", "identified",
+ "identity_insert", "identitycol", "ignore", "ilike", "immutable",
+ "implementation", "implicit", "include", "including", "increment", "index",
+ "infile", "infix", "inherit", "inherits", "initial", "initialize", "insert_id",
+ "instance", "instantiable", "instead", "int1", "int2", "int3", "int4", "int8",
+ "intersection", "invoker", "isam", "isnull", "k", "key_member", "key_type",
+ "keys", "kill", "lancompiler", "last_insert_id", "least", "length", "less",
+ "limit", "lineno", "lines", "listen", "ln", "load", "location", "lock", "login",
+ "logs", "long", "longblob", "longtext", "low_priority", "m", "matched",
+ "max_rows", "maxextents", "maxvalue", "mediumblob", "mediumint", "mediumtext",
+ "message_length", "message_octet_length", "message_text", "middleint",
+ "min_rows", "minus", "minute_microsecond", "minute_second", "minvalue",
+ "mlslabel", "mod", "mode", "modify", "monthname", "more", "move", "mumps",
+ "myisam", "name", "nesting", "no_write_to_binlog", "noaudit", "nocheck",
+ "nocompress", "nocreatedb", "nocreaterole", "nocreateuser", "noinherit",
+ "nologin", "nonclustered", "normalize", "normalized", "nosuperuser", "nothing",
+ "notify", "notnull", "nowait", "nullable", "nulls", "number", "octets", "off",
+ "offline", "offset", "offsets", "oids", "online", "opendatasource", "openquery",
+ "openrowset", "openxml", "operation", "operator", "optimize", "optionally",
+ "options", "ordering", "others", "outfile", "overlay", "overriding", "owner",
+ "pack_keys", "parameter_mode", "parameter_name", "parameter_ordinal_position",
+ "parameter_specific_catalog", "parameter_specific_name",
+ "parameter_specific_schema", "parameters", "pascal", "password", "pctfree",
+ "percent", "percent_rank", "percentile_cont", "percentile_disc", "placing",
+ "plan", "pli", "postfix", "power", "preceding", "prefix", "preorder", "prepared",
+ "print", "proc", "procedural", "process", "processlist", "purge", "quote",
+ "raid0", "raiserror", "rank", "raw", "readtext", "recheck", "reconfigure",
+ "regexp", "regr_avgx", "regr_avgy", "regr_count", "regr_intercept", "regr_r2",
+ "regr_slope", "regr_sxx", "regr_sxy", "regr_syy", "reindex", "reload", "rename",
+ "repeatable", "replace", "replication", "require", "reset", "resource",
+ "restart", "restore", "returned_cardinality", "returned_length",
+ "returned_octet_length", "returned_sqlstate", "rlike", "routine_catalog",
+ "routine_name", "routine_schema", "row_count", "row_number", "rowcount",
+ "rowguidcol", "rowid", "rownum", "rule", "save", "scale", "schema_name",
+ "schemas", "scope_catalog", "scope_name", "scope_schema", "second_microsecond",
+ "security", "self", "separator", "sequence", "serializable", "server_name",
+ "setof", "setuser", "share", "show", "shutdown", "simple", "soname", "source",
+ "spatial", "specific_name", "sql_big_result", "sql_big_selects",
+ "sql_big_tables", "sql_calc_found_rows", "sql_log_off", "sql_log_update",
+ "sql_low_priority_updates", "sql_select_limit", "sql_small_result",
+ "sql_warnings", "sqlca", "sqrt", "ssl", "stable", "starting", "statement",
+ "statistics", "status", "stddev_pop", "stddev_samp", "stdin", "stdout",
+ "storage", "straight_join", "strict", "string", "structure", "style",
+ "subclass_origin", "sublist", "successful", "superuser", "synonym", "sysdate",
+ "sysid", "table_name", "tables", "tablespace", "temp", "template", "terminate",
+ "terminated", "text", "textsize", "than", "ties", "tinyblob", "tinyint",
+ "tinytext", "toast", "top", "top_level_count", "tran", "transaction_active",
+ "transactions_committed", "transactions_rolled_back", "transform", "transforms",
+ "trigger_catalog", "trigger_name", "trigger_schema", "truncate", "trusted",
+ "tsequal", "type", "uescape", "uid", "unbounded", "uncommitted", "unencrypted",
+ "unlisten", "unlock", "unnamed", "unsigned", "updatetext", "use",
+ "user_defined_type_catalog", "user_defined_type_code", "user_defined_type_name",
+ "user_defined_type_schema", "utc_date", "utc_time", "utc_timestamp", "vacuum",
+ "valid", "validate", "validator", "var_pop", "var_samp", "varbinary", "varchar2",
+ "varcharacter", "variable", "variables", "verbose", "volatile", "waitfor",
+ "width_bucket", "writetext", "x509", "xor", "year_month", "zerofill",
+ }
+
+ local capturedoperators = oneof {
+ "+", "-", "*", "/",
+ "%", "^", "!", "&", "|", "?", "~",
+ "=", "<", ">",
+ ";", ":", ".",
+ "{", "}", "[", "]", "(", ")",
+ }
+
+ local spaces = "\\s*"
+ local identifier = "[a-zA-Z\\_][a-zA-Z0-9\\_]*"
+
+ local comment = "%.*$\\n?"
+ local commentopen = "/\\*"
+ local commentclose = "\\*/"
+
+ local doublequote = "\""
+ local singlequote = "\'"
+ local reversequote = "`"
+
+ local doublecontent = "(?:\\\\\"|[^\"])*"
+ local singlecontent = "(?:\\\\\'|[^\'])*"
+ local reversecontent = "(?:\\\\`|[^`])*"
+
+ local decnumber = "[\\-]?[0-9]+(\\.[0-9]+)?([eEpP]\\-?[0-9]+)?"
+
+ local captureddouble = capture(doublequote) .. capture(doublecontent) .. capture(doublequote)
+ local capturedsingle = capture(singlequote) .. capture(singlecontent) .. capture(singlequote)
+ local capturedreverse = capture(reversequote) .. capture(reversecontent) .. capture(reversequote)
+
+ local style, styled = styler("sql")
+
+ registerlexer {
+
+ category = "sql",
+ description = "ConTeXt SQL",
+ suffixes = { "sql" },
+ version = "1.0.0",
+
+ setup = configuration {
+-- comments = {
+-- inline = "...",
+-- display = { "...", "..." },
+-- },
+ },
+
+ repository = {
+
+ comment_short = {
+ name = style("context.comment", "comment.comment"),
+ match = comment,
+ },
+
+ comment_long = {
+ name = style("context.comment", "comment.text"),
+ ["begin"] = commentopen,
+ ["end"] = commentclose,
+ beginCaptures = { ["0"] = styled("context.command", "comment.open") },
+ endCaptures = { ["0"] = styled("context.command", "comment.close") },
+ },
+
+ keyword_standard = {
+ name = style("context.keyword", "reserved.standard"),
+ match = capturedkeywords,
+ },
+
+ keyword_dialect = {
+ name = style("context.keyword", "reserved.dialect"),
+ match = captureddialects,
+ },
+
+ operator = {
+ name = style("context.special", "operator"),
+ match = capturedoperators,
+
+ },
+
+ identifier = {
+ name = style("context.text", "identifier"),
+ match = identifier,
+ },
+
+ string_double = {
+ match = captureddouble,
+ captures = {
+ ["1"] = styled("context.special", "doublequoted.open"),
+ ["2"] = styled("context.text", "doublequoted.text"),
+ ["3"] = styled("context.special", "doublequoted.close"),
+ },
+ },
+
+ string_single = {
+ match = capturedsingle,
+ captures = {
+ ["1"] = styled("context.special", "singlequoted.open"),
+ ["2"] = styled("context.text", "singlequoted.text"),
+ ["3"] = styled("context.special", "singlequoted.close"),
+ },
+ },
+
+ string_reverse = {
+ match = capturedreverse,
+ captures = {
+ ["1"] = styled("context.special", "reversequoted.open"),
+ ["2"] = styled("context.text", "reversequoted.text"),
+ ["3"] = styled("context.special", "reversequoted.close"),
+ },
+ },
+
+ number = {
+ name = style("context.number", "number"),
+ match = decnumber,
+ },
+
+ },
+
+ patterns = {
+ include("#keyword_standard"),
+ include("#keyword_dialect"),
+ include("#identifier"),
+ include("#string_double"),
+ include("#string_single"),
+ include("#string_reverse"),
+ include("#comment_long"),
+ include("#comment_short"),
+ include("#number"),
+ include("#operator"),
+ },
+
+ }
+
+ end
+
+ -- The bnf lexer (only used for documentation, untested).
+
+ do
+
+ local operators = oneof {
+ "*", "+", "-", "/",
+ ",", ".", ":", ";",
+ "(", ")", "<", ">", "{", "}", "[", "]",
+ "#", "=", "?", "@", "|", " ", "!","$", "%", "&", "\\", "^", "-", "_", "`", "~",
+ }
+
+ local spaces = "\\s*"
+
+ local text = "[a-zA-Z0-9]|" .. operators
+
+ local doublequote = "\""
+ local singlequote = "\'"
+
+ local termopen = "<"
+ local termclose = ">"
+ local termcontent = "([a-zA-Z][a-zA-Z0-9\\-]*)"
+
+ local becomes = "::="
+ local extra = "|"
+
+ local captureddouble = capture(doublequote) .. capture(text) .. capture(doublequote)
+ local capturedsingle = capture(singlequote) .. capture(text) .. capture(singlequote)
+ local capturedterm = capture(termopen) .. capture(termcontent) .. capture(termclose)
+
+ local style, styled = styler("bnf")
+
+ registerlexer {
+
+ category = "bnf",
+ description = "ConTeXt BNF",
+ suffixes = { "bnf" },
+ version = "1.0.0",
+
+ setup = configuration {
+ pairs = {
+ { "<", ">" },
+ },
+ },
+
+ repository = {
+
+ term = {
+ match = capturedterm,
+ captures = {
+ ["1"] = styled("context.command", "term.open"),
+ ["2"] = styled("context.text", "term.text"),
+ ["3"] = styled("context.command", "term.close"),
+ },
+ },
+
+ text_single = {
+ match = capturedsingle,
+ captures = {
+ ["1"] = styled("context.special", "singlequoted.open"),
+ ["2"] = styled("context.text", "singlequoted.text"),
+ ["3"] = styled("context.special", "singlequoted.close"),
+ },
+ },
+
+ text_double = {
+ match = captureddouble,
+ captures = {
+ ["1"] = styled("context.special", "doublequoted.open"),
+ ["2"] = styled("context.text", "doublequoted.text"),
+ ["3"] = styled("context.special", "doublequoted.close"),
+ },
+ },
+
+ becomes = {
+ name = style("context.operator", "symbol.becomes"),
+ match = becomes,
+ },
+
+ extra = {
+ name = style("context.extra", "symbol.extra"),
+ match = extra,
+ },
+
+ },
+
+ patterns = {
+ include("#term"),
+ include("#text_single"),
+ include("#text_reverse"),
+ include("#becomes"),
+ include("#extra"),
+ },
+
+ }
+
+ end
+
+ do
+
+ -- A rather simple one, but consistent with the rest. I don't use an IDE or fancy
+ -- features. No tricks for me.
+
+ local function words(list)
+ table.sort(list,sorter)
+ return "\\b(" .. table.concat(list,"|") .. ")\\b"
+ end
+
+ local capturedkeywords = words { -- copied from cpp.lua
+ -- c
+ "asm", "auto", "break", "case", "const", "continue", "default", "do", "else",
+ "extern", "false", "for", "goto", "if", "inline", "register", "return",
+ "sizeof", "static", "switch", "true", "typedef", "volatile", "while",
+ "restrict",
+ -- hm
+ "_Bool", "_Complex", "_Pragma", "_Imaginary",
+ -- c++.
+ "catch", "class", "const_cast", "delete", "dynamic_cast", "explicit",
+ "export", "friend", "mutable", "namespace", "new", "operator", "private",
+ "protected", "public", "signals", "slots", "reinterpret_cast",
+ "static_assert", "static_cast", "template", "this", "throw", "try", "typeid",
+ "typename", "using", "virtual"
+ }
+
+ local captureddatatypes = words { -- copied from cpp.lua
+ "bool", "char", "double", "enum", "float", "int", "long", "short", "signed",
+ "struct", "union", "unsigned", "void"
+ }
+
+ local capturedluatex = words { -- new
+ "word", "halfword", "quarterword", "scaled", "pointer", "glueratio",
+ }
+
+ local capturedmacros = words { -- copied from cpp.lua
+ "define", "elif", "else", "endif", "error", "if", "ifdef", "ifndef", "import",
+ "include", "line", "pragma", "undef", "using", "warning"
+ }
+
+ local operators = oneof {
+ "*", "+", "-", "/",
+ "%", "^", "!", "&", "?", "~", "|",
+ "=", "<", ">",
+ ";", ":", ".",
+ "{", "}", "[", "]", "(", ")",
+ }
+
+ local spaces = "\\s*"
+
+ local identifier = "[A-Za-z_][A-Za-z_0-9]*"
+
+ local comment = "//.*$\\n?"
+ local commentopen = "/\\*"
+ local commentclose = "\\*/"
+
+ local doublequote = "\""
+ local singlequote = "\'"
+ local reversequote = "`"
+
+ local doublecontent = "(?:\\\\\"|[^\"])*"
+ local singlecontent = "(?:\\\\\'|[^\'])*"
+
+ local captureddouble = capture(doublequote) .. capture(doublecontent) .. capture(doublequote)
+ local capturedsingle = capture(singlequote) .. capture(singlecontent) .. capture(singlequote)
+
+ local texopen = "/\\*tex"
+ local texclose = "\\*/"
+
+ local hexnumber = "[\\-]?0[xX][A-Fa-f0-9]+(\\.[A-Fa-f0-9]+)?([eEpP]\\-?[A-Fa-f0-9]+)?"
+ local decnumber = "[\\-]?[0-9]+(\\.[0-9]+)?([eEpP]\\-?[0-9]+)?"
+
+ local capturedmacros = spaces .. capture("#") .. spaces .. capturedmacros
+
+ local style, styled = styler("c")
+
+ registerlexer {
+
+ category = "cpp",
+ description = "ConTeXt C",
+ suffixes = { "c", "h", "cpp", "hpp" },
+ version = "1.0.0",
+
+ setup = configuration {
+ pairs = {
+ { "{", "}" },
+ { "[", "]" },
+ { "(", ")" },
+ },
+ },
+
+ repository = {
+
+ keyword = {
+ match = capturedkeywords,
+ name = style("context.keyword","c"),
+ },
+
+ datatype = {
+ match = captureddatatypes,
+ name = style("context.keyword","datatype"),
+ },
+
+ luatex = {
+ match = capturedluatex,
+ name = style("context.command","luatex"),
+ },
+
+ macro = {
+ match = capturedmacros,
+ captures = {
+ ["1"] = styled("context.data","macro.tag"),
+ ["2"] = styled("context.data","macro.name"),
+ }
+ },
+
+ texcomment = {
+ ["begin"] = texopen,
+ ["end"] = texclose,
+ patterns = embedded("tex"),
+ beginCaptures = { ["0"] = styled("context.comment", "tex.open") },
+ endCaptures = { ["0"] = styled("context.comment", "tex.close") },
+ },
+
+ longcomment = {
+ name = style("context.comment","long"),
+ ["begin"] = commentopen,
+ ["end"] = commentclose,
+ },
+
+ shortcomment = {
+ name = style("context.comment","short"),
+ match = comment,
+ },
+
+ identifier = {
+ name = style("context.default","identifier"),
+ match = identifier,
+ },
+
+ operator = {
+ name = style("context.operator","any"),
+ match = operators,
+ },
+
+ string_double = {
+ match = captureddouble,
+ captures = {
+ ["1"] = styled("context.special", "doublequoted.open"),
+ ["2"] = styled("context.string", "doublequoted.text"),
+ ["3"] = styled("context.special", "doublequoted.close"),
+ },
+ },
+
+ string_single = {
+ match = capturedsingle,
+ captures = {
+ ["1"] = styled("context.special", "singlequoted.open"),
+ ["2"] = styled("context.string", "singlequoted.text"),
+ ["3"] = styled("context.special", "singlequoted.close"),
+ },
+ },
+
+ hexnumber = {
+ name = style("context.number","hex"),
+ match = hexnumber,
+ },
+
+ decnumber = {
+ name = style("context.number","dec"),
+ match = decnumber,
+ },
+
+ },
+
+ patterns = {
+ include("#keyword"),
+ include("#datatype"),
+ include("#luatex"),
+ include("#identifier"),
+ include("#macro"),
+ include("#string_double"),
+ include("#string_single"),
+ include("#texcomment"),
+ include("#longcomment"),
+ include("#shortcomment"),
+ include("#hexnumber"),
+ include("#decnumber"),
+ include("#operator"),
+ },
+
+ }
+
+ end
+
+ -- The pdf lexer.
+
+ do
+
+ -- we can assume no errors in the syntax
+
+ local spaces = "\\s*"
+
+ local reserved = oneof { "true" ,"false" , "null" }
+ local reference = "R"
+
+ local dictionaryopen = "<<"
+ local dictionaryclose = ">>"
+
+ local arrayopen = "\\["
+ local arrayclose = "\\]"
+
+ local stringopen = "\\("
+ local stringcontent = "(?:\\\\[\\(\\)]|[^\\(\\)])*"
+ local stringclose = "\\)"
+
+ local hexstringopen = "<"
+ local hexstringcontent = "[^>]*"
+ local hexstringclose = ">"
+
+ local unicodebomb = "feff"
+
+ local objectopen = "obj" -- maybe also ^ $
+ local objectclose = "endobj" -- maybe also ^ $
+
+ local streamopen = "^stream$"
+ local streamclose = "^endstream$"
+
+ local name = "/[^\\s<>/\\[\\]\\(\\)]+" -- no need to be more clever than this
+ local integer = "[\\-]?[0-9]+" -- no need to be more clever than this
+ local real = "[\\-]?[0-9]*[\\.]?[0-9]+" -- no need to be more clever than this
+
+ local capturedcardinal = "([0-9]+)"
+
+ local captureddictionaryopen = capture(dictionaryopen)
+ local captureddictionaryclose = capture(dictionaryclose)
+
+ local capturedarrayopen = capture(arrayopen)
+ local capturedarrayclose = capture(arrayclose)
+
+ local capturedobjectopen = capture(objectopen)
+ local capturedobjectclose = capture(objectclose)
+
+ local capturedname = capture(name)
+ local capturedinteger = capture(integer)
+ local capturedreal = capture(real)
+ local capturedreserved = capture(reserved)
+ local capturedreference = capture(reference)
+
+ local capturedunicode = capture(hexstringopen) .. capture(unicodebomb) .. capture(hexstringcontent) .. capture(hexstringclose)
+ local capturedunicode = capture(hexstringopen) .. capture(unicodebomb) .. capture(hexstringcontent) .. capture(hexstringclose)
+ local capturedwhatsit = capture(hexstringopen) .. capture(hexstringcontent) .. capture(hexstringclose)
+ local capturedstring = capture(stringopen) .. capture(stringcontent) .. capture(stringclose)
+
+ local style, styled = styler("pdf")
+
+ -- strings are not ok yet: there can be nested unescaped () but not critical now
+
+ registerlexer {
+
+ category = "pdf",
+ description = "ConTeXt PDF",
+ suffixes = { "pdf" },
+ version = "1.0.0",
+
+ setup = configuration {
+ pairs = {
+ { "<", ">" },
+ { "[", "]" },
+ { "(", ")" },
+ },
+ },
+
+ repository = {
+
+ comment = {
+ name = style("context.comment","comment"),
+ match = "%.*$\\n?",
+ },
+
+ content = {
+ patterns = {
+ { include = "#dictionary" },
+ { include = "#stream" },
+ { include = "#array" },
+ {
+ name = style("context.constant","object.content.name"),
+ match = capturedname,
+ },
+ {
+ match = capturedcardinal .. spaces .. capturedcardinal .. spaces .. capturedreference,
+ captures = {
+ ["1"] = styled("context.warning","content.reference.1"),
+ ["2"] = styled("context.warning","content.reference.2"),
+ ["3"] = styled("context.command","content.reference.3"),
+ }
+ },
+ {
+ name = style("context.number","content.real"),
+ match = capturedreal,
+ },
+ {
+ name = style("context.number","content.integer"),
+ match = capturedinteger,
+ },
+ {
+ match = capturedstring,
+ captures = {
+ ["1"] = styled("context.quote","content.string.open"),
+ ["2"] = styled("context.string","content.string.text"),
+ ["3"] = styled("context.quote","content.string.close"),
+ }
+ },
+ {
+ name = style("context.number","content.reserved"),
+ match = capturedreserved,
+ },
+ {
+ match = capturedunicode,
+ captures = {
+ ["1"] = styled("context.quote","content.unicode.open"),
+ ["2"] = styled("context.plain","content.unicode.bomb"),
+ ["3"] = styled("context.string","content.unicode.text"),
+ ["4"] = styled("context.quote","content.unicode.close"),
+ }
+ },
+ {
+ match = capturedwhatsit,
+ captures = {
+ ["1"] = styled("context.quote","content.whatsit.open"),
+ ["2"] = styled("context.string","content.whatsit.text"),
+ ["3"] = styled("context.quote","content.whatsit.close"),
+ }
+ },
+ },
+ },
+
+ object = {
+ ["begin"] = capturedcardinal .. spaces .. capturedcardinal .. spaces .. capturedobjectopen,
+ ["end"] = capturedobjectclose,
+ patterns = { { include = "#content" } },
+ beginCaptures = {
+ ["1"] = styled("context.warning","object.1"),
+ ["2"] = styled("context.warning","object.2"),
+ ["3"] = styled("context.keyword", "object.open")
+ },
+ endCaptures = {
+ ["1"] = styled("context.keyword", "object.close")
+ },
+ },
+
+ array = {
+ ["begin"] = capturedarrayopen,
+ ["end"] = capturedarrayclose,
+ patterns = { { include = "#content" } },
+ beginCaptures = { ["1"] = styled("context.grouping", "array.open") },
+ endCaptures = { ["1"] = styled("context.grouping", "array.close") },
+ },
+
+ dictionary = {
+ ["begin"] = captureddictionaryopen,
+ ["end"] = captureddictionaryclose,
+ beginCaptures = { ["1"] = styled("context.grouping", "dictionary.open") },
+ endCaptures = { ["1"] = styled("context.grouping", "dictionary.close") },
+ patterns = {
+ {
+ ["begin"] = capturedname .. spaces,
+ ["end"] = "(?=[>])",
+ beginCaptures = { ["1"] = styled("context.command", "dictionary.name") },
+ patterns = { { include = "#content" } },
+ },
+ },
+ },
+
+ xref = {
+ ["begin"] = "xref" .. spaces,
+ ["end"] = "(?=[^0-9])",
+ captures = {
+ ["0"] = styled("context.keyword", "xref.1"),
+ },
+ patterns = {
+ {
+ ["begin"] = capturedcardinal .. spaces .. capturedcardinal .. spaces,
+ ["end"] = "(?=[^0-9])",
+ captures = {
+ ["1"] = styled("context.number", "xref.2"),
+ ["2"] = styled("context.number", "xref.3"),
+ },
+ patterns = {
+ {
+ ["begin"] = capturedcardinal .. spaces .. capturedcardinal .. spaces .. "([fn])" .. spaces,
+ ["end"] = "(?=.)",
+ captures = {
+ ["1"] = styled("context.number", "xref.4"),
+ ["2"] = styled("context.number", "xref.5"),
+ ["3"] = styled("context.keyword", "xref.6"),
+ },
+ },
+ },
+ },
+ },
+ },
+
+ startxref = {
+ ["begin"] = "startxref" .. spaces,
+ ["end"] = "(?=[^0-9])",
+ captures = {
+ ["0"] = styled("context.keyword", "startxref.1"),
+ },
+ patterns = {
+ {
+ ["begin"] = capturedcardinal .. spaces,
+ ["end"] = "(?=.)",
+ captures = {
+ ["1"] = styled("context.number", "startxref.2"),
+ },
+ },
+ },
+ },
+
+ trailer = {
+ name = style("context.keyword", "trailer"),
+ match = "trailer",
+ },
+
+ stream = {
+ ["begin"] = streamopen,
+ ["end"] = streamclose,
+ beginCaptures = { ["0"] = styled("context.keyword", "stream.open") },
+ endCaptures = { ["0"] = styled("context.keyword", "stream.close") },
+ },
+
+ },
+
+ patterns = {
+ include("#object"),
+ include("#comment"),
+ include("#trailer"),
+ include("#dictionary"), -- cheat: trailer dict
+ include("#startxref"),
+ include("#xref"),
+ },
+
+ }
+
+ end
+
+ -- The JSON lexer. I don't want to spend time on (and mess up the lexer) with
+ -- some ugly multistage key/value parser so we just assume that the key is on
+ -- the same line as the colon and the value. It looks bad otherwise anyway.
+
+ do
+
+ local spaces = "\\s*"
+ local separator = "\\,"
+ local becomes = "\\:"
+
+ local arrayopen = "\\["
+ local arrayclose = "\\]"
+
+ local hashopen = "\\{"
+ local hashclose = "\\}"
+
+ local stringopen = "\""
+ local stringcontent = "(?:\\\\\"|[^\"])*"
+ local stringclose = stringopen
+
+ local reserved = oneof { "true", "false", "null" }
+
+ local hexnumber = "[\\-]?0[xX][A-Fa-f0-9]+(\\.[A-Fa-f0-9]+)?([eEpP]\\-?[A-Fa-f0-9]+)?"
+ local decnumber = "[\\-]?[0-9]+(\\.[0-9]+)?([eEpP]\\-?[0-9]+)?"
+
+ local capturedarrayopen = capture(arrayopen)
+ local capturedarrayclose = capture(arrayclose)
+ local capturedhashopen = capture(hashopen)
+ local capturedhashclose = capture(hashclose)
+
+ local capturedreserved = capture(reserved)
+ local capturedbecomes = capture(becomes)
+ local capturedseparator = capture(separator)
+ local capturedstring = capture(stringopen) .. capture(stringcontent) .. capture(stringclose)
+ local capturedhexnumber = capture(hexnumber)
+ local captureddecnumber = capture(decnumber)
+
+ local style, styled = styler("json")
+
+ registerlexer {
+
+ category = "json",
+ description = "ConTeXt JSON",
+ suffixes = { "json" },
+ version = "1.0.0",
+
+ setup = configuration {
+ pairs = {
+ { "{", "}" },
+ { "[", "]" },
+ },
+ },
+
+ repository = {
+
+ separator = {
+ name = style("context.operator","separator"),
+ match = spaces .. capturedseparator,
+ },
+
+ reserved = {
+ name = style("context.primitive","reserved"),
+ match = spaces .. capturedreserved,
+ },
+
+ hexnumber = {
+ name = style("context.number","hex"),
+ match = spaces .. capturedhexnumber,
+ },
+
+ decnumber = {
+ name = style("context.number","dec"),
+ match = spaces .. captureddecnumber,
+ },
+
+ string = {
+ match = spaces .. capturedstring,
+ captures = {
+ ["1"] = styled("context.quote","string.open"),
+ ["2"] = styled("context.string","string.text"),
+ ["3"] = styled("context.quote","string.close"),
+ },
+ },
+
+ kv_reserved = {
+ match = capturedstring .. spaces .. capturedbecomes .. spaces .. capturedreserved,
+ captures = {
+ ["1"] = styled("context.quote", "reserved.key.open"),
+ ["2"] = styled("context.text", "reserved.key.text"),
+ ["3"] = styled("context.quote", "reserved.key.close"),
+ ["4"] = styled("context.operator", "reserved.becomes"),
+ ["5"] = styled("context.primitive","reserved.value"),
+ }
+ },
+
+ kv_hexnumber = {
+ match = capturedstring .. spaces .. capturedbecomes .. spaces .. capturedhexnumber,
+ captures = {
+ ["1"] = styled("context.quote", "hex.key.open"),
+ ["2"] = styled("context.text", "hex.key.text"),
+ ["3"] = styled("context.quote", "hex.key.close"),
+ ["4"] = styled("context.operator","hex.becomes"),
+ ["5"] = styled("context.number", "hex.value"),
+ }
+ },
+
+ kv_decnumber = {
+ match = capturedstring .. spaces .. capturedbecomes .. spaces .. captureddecnumber,
+ captures = {
+ ["1"] = styled("context.quote", "dec.key.open"),
+ ["2"] = styled("context.text", "dec.key.text"),
+ ["3"] = styled("context.quote", "dec.key.close"),
+ ["4"] = styled("context.operator","dec.becomes"),
+ ["5"] = styled("context.number", "dec.value"),
+ }
+ },
+
+ kv_string = {
+ match = capturedstring .. spaces .. capturedbecomes .. spaces .. capturedstring,
+ captures = {
+ ["1"] = styled("context.quote", "string.key.open"),
+ ["2"] = styled("context.text", "string.key.text"),
+ ["3"] = styled("context.quote", "string.key.close"),
+ ["4"] = styled("context.operator","string.becomes"),
+ ["5"] = styled("context.quote", "string.value.open"),
+ ["6"] = styled("context.string", "string.value.text"),
+ ["7"] = styled("context.quote", "string.value.close"),
+ },
+ },
+
+ kv_array = {
+ ["begin"] = capturedstring .. spaces .. capturedbecomes .. spaces .. capturedarrayopen,
+ ["end"] = arrayclose,
+ beginCaptures = {
+ ["1"] = styled("context.quote", "array.key.open"),
+ ["2"] = styled("context.text", "array.key.text"),
+ ["3"] = styled("context.quote", "array.key.close"),
+ ["4"] = styled("context.operator","array.becomes"),
+ ["5"] = styled("context.grouping","array.value.open")
+ },
+ endCaptures = {
+ ["0"] = styled("context.grouping","array.value.close")
+ },
+ patterns = { include("#content") },
+ },
+
+ kv_hash = {
+ ["begin"] = capturedstring .. spaces .. capturedbecomes .. spaces .. capturedhashopen,
+ ["end"] = hashclose,
+ beginCaptures = {
+ ["1"] = styled("context.quote", "hash.key.open"),
+ ["2"] = styled("context.text", "hash.key.text"),
+ ["3"] = styled("context.quote", "hash.key.close"),
+ ["4"] = styled("context.operator","hash.becomes"),
+ ["5"] = styled("context.grouping","hash.value.open")
+ },
+ endCaptures = {
+ ["0"] = styled("context.grouping","hash.value.close")
+ },
+ patterns = { include("#kv_content") },
+ },
+
+ content = {
+ patterns = {
+ include("#string"),
+ include("#hexnumber"),
+ include("#decnumber"),
+ include("#reserved"),
+ include("#hash"),
+ include("#array"),
+ include("#separator"),
+ },
+ },
+
+ kv_content = {
+ patterns = {
+ include("#kv_string"),
+ include("#kv_hexnumber"),
+ include("#kv_decnumber"),
+ include("#kv_reserved"),
+ include("#kv_hash"),
+ include("#kv_array"),
+ include("#separator"),
+ },
+ },
+
+ array = {
+ ["begin"] = arrayopen,
+ ["end"] = arrayclose,
+ beginCaptures = { ["0"] = styled("context.grouping","array.open") },
+ endCaptures = { ["0"] = styled("context.grouping","array.close") },
+ patterns = { include("#content") },
+ },
+
+ hash = {
+ ["begin"] = hashopen,
+ ["end"] = hashclose,
+ beginCaptures = { ["0"] = styled("context.grouping","hash.open") },
+ endCaptures = { ["0"] = styled("context.grouping","hash.close") },
+ patterns = { include("#kv_content") },
+ },
+
+ },
+
+ patterns = {
+ include("#content"),
+ },
+
+ }
+
+ end
+
+ savepackage()
+
+end
+
+function scripts.vscode.start()
+ local path = locate()
+ if path then
+ local command = 'start "vs code context" code --reuse-window --ignore-gpu-blacklist --extensions-dir "' .. path .. '" --install-extension context'
+ report("running command: %s",command)
+ os.execute(command)
+ end
+end
+
+if environment.arguments.generate then
+ scripts.vscode.generate()
+elseif environment.arguments.start then
+ scripts.vscode.start()
+elseif environment.arguments.exporthelp then
+ application.export(environment.arguments.exporthelp,environment.files[1])
+else
+ application.help()
+end
+
+scripts.vscode.generate([[t:/vscode/data/context/extensions]])
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-watch.lua b/Master/texmf-dist/scripts/context/lua/mtx-watch.lua
index 8629058e5a2..7815dafdd7a 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-watch.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-watch.lua
@@ -208,11 +208,11 @@ report("checking file %s/%s: %s",dirname,basename,ok and "okay" or "skipped")
local oldpath = lfs.currentdir()
lfs.chdir(newpath)
scripts.watch.save_exa_modes(joblog,ctmname)
- if pipe then result = os.resultof(command) else result = os.spawn(command) end
+ if pipe then result = os.resultof(command) else result = os.execute(command) end
lfs.chdir(oldpath)
else
scripts.watch.save_exa_modes(joblog,ctmname)
- if pipe then result = os.resultof(command) else result = os.spawn(command) end
+ if pipe then result = os.resultof(command) else result = os.execute(command) end
end
report("return value: %s", result)
done = true
diff --git a/Master/texmf-dist/scripts/context/lua/mtxrun.lua b/Master/texmf-dist/scripts/context/lua/mtxrun.lua
index 98fe7f752e3..5907fa33c66 100755
--- a/Master/texmf-dist/scripts/context/lua/mtxrun.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtxrun.lua
@@ -194,7 +194,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 6330, stripped down to: 2831
+-- original size: 6529, stripped down to: 2933
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -313,6 +313,9 @@ elseif not ffi.number then
end
if LUAVERSION>5.3 then
end
+if status and os.setenv then
+ os.setenv("engine",string.lower(status.luatex_engine or "unknown"))
+end
end -- of closure
@@ -321,7 +324,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-macro"] = package.loaded["l-macro"] or true
--- original size: 10131, stripped down to: 5991
+-- original size: 10130, stripped down to: 5990
if not modules then modules={} end modules ['l-macros']={
version=1.001,
@@ -546,7 +549,7 @@ end
macros.loaded=loaded
function required(name,trace)
local filename=file.addsuffix(name,"lua")
- local fullname=resolvers and resolvers.find_file(filename) or filename
+ local fullname=resolvers and resolvers.findfile(filename) or filename
if not fullname or fullname=="" then
return false
end
@@ -576,7 +579,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-sandbox"] = package.loaded["l-sandbox"] or true
--- original size: 9747, stripped down to: 6313
+-- original size: 9604, stripped down to: 6394
if not modules then modules={} end modules ['l-sandbox']={
version=1.001,
@@ -808,6 +811,9 @@ local function supported(library)
return l
end
loadfile=register(loadfile,"loadfile")
+if supported("lua") then
+ lua.openfile=register(lua.openfile,"lua.openfile")
+end
if supported("io") then
io.open=register(io.open,"io.open")
io.popen=register(io.popen,"io.popen")
@@ -1168,7 +1174,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true
--- original size: 38434, stripped down to: 19310
+-- original size: 38440, stripped down to: 19316
if not modules then modules={} end modules ['l-lpeg']={
version=1.001,
@@ -1337,7 +1343,7 @@ patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+unders
patterns.somecontent=(anything-newline-space)^1
patterns.beginline=#(1-newline)
patterns.longtostring=Cs(whitespace^0/""*((patterns.quoted+nonwhitespace^1+whitespace^1/""*(endofstring+Cc(" ")))^0))
-function anywhere(pattern)
+local function anywhere(pattern)
return (1-P(pattern))^0*P(pattern)
end
lpeg.anywhere=anywhere
@@ -1967,7 +1973,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-string"] = package.loaded["l-string"] or true
--- original size: 6461, stripped down to: 3255
+-- original size: 6644, stripped down to: 3410
if not modules then modules={} end modules ['l-string']={
version=1.001,
@@ -2031,9 +2037,11 @@ function string.is_empty(str)
end
end
local anything=patterns.anything
-local allescapes=Cc("%")*S(".-+%?()[]*")
-local someescapes=Cc("%")*S(".-+%()[]")
-local matchescapes=Cc(".")*S("*?")
+local moreescapes=Cc("%")*S(".-+%?()[]*$^{}")
+local allescapes=Cc("%")*S(".-+%?()[]*")
+local someescapes=Cc("%")*S(".-+%()[]")
+local matchescapes=Cc(".")*S("*?")
+local pattern_m=Cs ((moreescapes+anything )^0 )
local pattern_a=Cs ((allescapes+anything )^0 )
local pattern_b=Cs ((someescapes+matchescapes+anything )^0 )
local pattern_c=Cs (Cc("^")*(someescapes+matchescapes+anything )^0*Cc("$") )
@@ -2043,6 +2051,8 @@ end
function string.topattern(str,lowercase,strict)
if str=="" or type(str)~="string" then
return ".*"
+ elseif strict=="all" then
+ str=lpegmatch(pattern_m,str)
elseif strict then
str=lpegmatch(pattern_c,str)
else
@@ -2092,7 +2102,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-table"] = package.loaded["l-table"] or true
--- original size: 41332, stripped down to: 21508
+-- original size: 41758, stripped down to: 22643
if not modules then modules={} end modules ['l-table']={
version=1.001,
@@ -2101,7 +2111,7 @@ if not modules then modules={} end modules ['l-table']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local type,next,tostring,tonumber,select=type,next,tostring,tonumber,select
+local type,next,tostring,tonumber,select,rawget=type,next,tostring,tonumber,select,rawget
local table,string=table,string
local concat,sort=table.concat,table.sort
local format,lower,dump=string.format,string.lower,string.dump
@@ -2435,13 +2445,13 @@ function table.fromhash(t)
end
return hsh
end
-local noquotes,hexify,handle,compact,inline,functions,metacheck
+local noquotes,hexify,handle,compact,inline,functions,metacheck,accurate
local reserved=table.tohash {
'and','break','do','else','elseif','end','false','for','function','if',
'in','local','nil','not','or','repeat','return','then','true','until','while',
- 'NaN','goto',
+ 'NaN','goto','const',
}
-local function is_simple_table(t,hexify)
+local function is_simple_table(t,hexify,accurate)
local nt=#t
if nt>0 then
local n=0
@@ -2460,6 +2470,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i]=format("0x%X",v)
+ elseif accurate then
+ tt[i]=format("%q",v)
else
tt[i]=v
end
@@ -2480,6 +2492,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i+1]=format("0x%X",v)
+ elseif accurate then
+ tt[i+1]=format("%q",v)
else
tt[i+1]=v
end
@@ -2551,6 +2565,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tv=="number" then
if hexify then
handle(format("%s 0x%X,",depth,v))
+ elseif accurate then
+ handle(format("%s %q,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -2560,7 +2576,7 @@ local function do_serialize(root,name,depth,level,indexed)
if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
handle(format("%s { %s },",depth,concat(st,", ")))
else
@@ -2588,12 +2604,16 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
@@ -2601,12 +2621,16 @@ local function do_serialize(root,name,depth,level,indexed)
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
handle(format("%s %s=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s %s=%q,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
handle(format("%s [%q]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -2615,6 +2639,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -2631,6 +2657,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={},",depth,k))
+ elseif accurate then
+ handle(format("%s [%q]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -2643,11 +2671,13 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s [%q]={},",depth,k))
end
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
+ elseif accurate then
+ handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -2669,6 +2699,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
+ elseif accurate then
+ handle(format("%s [%q]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -2688,6 +2720,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=load(%q),",depth,k,f))
+ elseif accurate then
+ handle(format("%s [%q]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -2705,6 +2739,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -2728,6 +2764,7 @@ local function serialize(_handle,root,name,specification)
if type(specification)=="table" then
noquotes=specification.noquotes
hexify=specification.hexify
+ accurate=specification.accurate
handle=_handle or specification.handle or print
functions=specification.functions
compact=specification.compact
@@ -3043,7 +3080,7 @@ end
local function sequenced(t,sep,simple)
if not t then
return ""
- elseif type(t)=="string" then
+ elseif type(t)~="table" then
return t
end
local n=#t
@@ -3082,7 +3119,11 @@ local function sequenced(t,sep,simple)
end
end
end
- return concat(s,sep or " | ")
+ if sep==true then
+ return "{ "..concat(s,", ").." }"
+ else
+ return concat(s,sep or " | ")
+ end
end
table.sequenced=sequenced
function table.print(t,...)
@@ -3213,7 +3254,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-io"] = package.loaded["l-io"] or true
--- original size: 11823, stripped down to: 6325
+-- original size: 11829, stripped down to: 6331
if not modules then modules={} end modules ['l-io']={
version=1.001,
@@ -3227,7 +3268,7 @@ local open,flush,write,read=io.open,io.flush,io.write,io.read
local byte,find,gsub,format=string.byte,string.find,string.gsub,string.format
local concat=table.concat
local type=type
-if string.find(os.getenv("PATH"),";",1,true) then
+if string.find(os.getenv("PATH") or "",";",1,true) then
io.fileseparator,io.pathseparator="\\",";"
else
io.fileseparator,io.pathseparator="/",":"
@@ -3765,7 +3806,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 18916, stripped down to: 10126
+-- original size: 19102, stripped down to: 10192
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -3779,7 +3820,7 @@ local date,time=os.date,os.time
local find,format,gsub,upper,gmatch=string.find,string.format,string.gsub,string.upper,string.gmatch
local concat=table.concat
local random,ceil,randomseed=math.random,math.ceil,math.randomseed
-local rawget,rawset,type,getmetatable,setmetatable,tonumber,tostring=rawget,rawset,type,getmetatable,setmetatable,tonumber,tostring
+local type,setmetatable,tonumber,tostring=type,setmetatable,tonumber,tostring
do
local selfdir=os.selfdir
if selfdir=="" then
@@ -3930,7 +3971,8 @@ local launchers={
unix="xdg-open %s &> /dev/null &",
}
function os.launch(str)
- execute(format(launchers[os.name] or launchers.unix,str))
+ local command=format(launchers[os.name] or launchers.unix,str)
+ execute(command)
end
local gettimeofday=os.gettimeofday or os.clock
os.gettimeofday=gettimeofday
@@ -4185,6 +4227,12 @@ function os.validdate(year,month,day)
end
return year,month,day
end
+function os.date(fmt,...)
+ if not fmt then
+ fmt="%Y-%m-%d %H:%M"
+ end
+ return date(fmt,...)
+end
local osexit=os.exit
local exitcode=nil
function os.setexitcode(code)
@@ -4207,7 +4255,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 21984, stripped down to: 10148
+-- original size: 22175, stripped down to: 10302
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -4229,15 +4277,24 @@ local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
local attributes=lfs.attributes
function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
+ if name then
+ return attributes(name,"mode")=="directory"
+ end
end
function lfs.isfile(name)
- local a=attributes(name,"mode")
- return a=="file" or a=="link" or nil
+ if name then
+ local a=attributes(name,"mode")
+ return a=="file" or a=="link" or nil
+ end
end
function lfs.isfound(name)
- local a=attributes(name,"mode")
- return (a=="file" or a=="link") and name or nil
+ if name then
+ local a=attributes(name,"mode")
+ return (a=="file" or a=="link") and name or nil
+ end
+end
+function lfs.modification(name)
+ return name and attributes(name,"modification") or nil
end
if sandbox then
sandbox.redefine(lfs.isfile,"lfs.isfile")
@@ -4616,7 +4673,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-gzip"] = package.loaded["l-gzip"] or true
--- original size: 1211, stripped down to: 951
+-- original size: 5115, stripped down to: 1699
if not modules then modules={} end modules ['l-gzip']={
version=1.001,
@@ -4624,43 +4681,75 @@ if not modules then modules={} end modules ['l-gzip']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-if not gzip then
- return
-end
-local suffix,suffixes=file.suffix,file.suffixes
-function gzip.load(filename)
- local f=io.open(filename,"rb")
- if not f then
- elseif suffix(filename)=="gz" then
- f:close()
- local g=gzip.open(filename,"rb")
- if g then
- local str=g:read("*all")
- g:close()
- return str
+gzip=gzip or {}
+if not zlib then
+ zlib=xzip
+elseif not xzip then
+ xzip=zlib
+end
+if zlib then
+ local suffix=file.suffix
+ local suffixes=file.suffixes
+ local find=string.find
+ local openfile=io.open
+ local gzipwindow=15+16
+ local gziplevel=3
+ local identifier="^\x1F\x8B\x08"
+ local compress=zlib.compress
+ local decompress=zlib.decompress
+ function gzip.load(filename)
+ local f=openfile(filename,"rb")
+ if not f then
+ else
+ local data=f:read("*all")
+ f:close()
+ if data and data~="" then
+ if suffix(filename)=="gz" then
+ data=decompress(data,gzipwindow)
+ end
+ return data
+ end
end
- else
- local str=f:read("*all")
- f:close()
- return str
end
-end
-function gzip.save(filename,data)
- if suffix(filename)~="gz" then
- filename=filename..".gz"
+ function gzip.save(filename,data,level)
+ if suffix(filename)~="gz" then
+ filename=filename..".gz"
+ end
+ local f=openfile(filename,"wb")
+ if f then
+ data=compress(data or "",level or gziplevel,nil,gzipwindow)
+ f:write(data)
+ f:close()
+ return #data
+ end
end
- local f=io.open(filename,"wb")
- if f then
- local s=zlib.compress(data or "",9,nil,15+16)
- f:write(s)
- f:close()
- return #s
+ function gzip.suffix(filename)
+ local suffix,extra=suffixes(filename)
+ local gzipped=extra=="gz"
+ return suffix,gzipped
+ end
+ function gzip.compressed(s)
+ return s and find(s,identifier)
+ end
+ function gzip.compress(s,level)
+ if s and not find(s,identifier) then
+ if not level then
+ level=gziplevel
+ elseif level<=0 then
+ return s
+ elseif level>9 then
+ level=9
+ end
+ return compress(s,level or gziplevel,nil,gzipwindow) or s
+ end
+ end
+ function gzip.decompress(s)
+ if s and find(s,identifier) then
+ return decompress(s,gzipwindow)
+ else
+ return s
+ end
end
-end
-function gzip.suffix(filename)
- local suffix,extra=suffixes(filename)
- local gzipped=extra=="gz"
- return suffix,gzipped
end
@@ -4670,7 +4759,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-md5"] = package.loaded["l-md5"] or true
--- original size: 3309, stripped down to: 2218
+-- original size: 3414, stripped down to: 2307
if not modules then modules={} end modules ['l-md5']={
version=1.001,
@@ -4689,6 +4778,8 @@ if not md5 then
end
local md5,file=md5,file
local gsub=string.gsub
+local modification,isfile,touch=lfs.modification,lfs.isfile,lfs.touch
+local loaddata,savedata=io.loaddata,io.savedata
do
local patterns=lpeg and lpeg.patterns
if patterns then
@@ -4704,10 +4795,11 @@ do
md5.sumHEXA=md5.HEX
end
end
+local md5HEX=md5.HEX
function file.needsupdating(oldname,newname,threshold)
- local oldtime=lfs.attributes(oldname,"modification")
+ local oldtime=modification(oldname)
if oldtime then
- local newtime=lfs.attributes(newname,"modification")
+ local newtime=modification(newname)
if not newtime then
return true
elseif newtime>=oldtime then
@@ -4723,31 +4815,32 @@ function file.needsupdating(oldname,newname,threshold)
end
file.needs_updating=file.needsupdating
function file.syncmtimes(oldname,newname)
- local oldtime=lfs.attributes(oldname,"modification")
- if oldtime and lfs.isfile(newname) then
- lfs.touch(newname,oldtime,oldtime)
+ local oldtime=modification(oldname)
+ if oldtime and isfile(newname) then
+ touch(newname,oldtime,oldtime)
end
end
-function file.checksum(name)
+local function checksum(name)
if md5 then
- local data=io.loaddata(name)
+ local data=loaddata(name)
if data then
- return md5.HEX(data)
+ return md5HEX(data)
end
end
return nil
end
+file.checksum=checksum
function file.loadchecksum(name)
if md5 then
- local data=io.loaddata(name..".md5")
+ local data=loaddata(name..".md5")
return data and (gsub(data,"%s",""))
end
return nil
end
function file.savechecksum(name,checksum)
- if not checksum then checksum=file.checksum(name) end
+ if not checksum then checksum=checksum(name) end
if checksum then
- io.savedata(name..".md5",checksum)
+ savedata(name..".md5",checksum)
return checksum
end
return nil
@@ -5636,7 +5729,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-unicode"] = package.loaded["l-unicode"] or true
--- original size: 41047, stripped down to: 17171
+-- original size: 41281, stripped down to: 17261
if not modules then modules={} end modules ['l-unicode']={
version=1.001,
@@ -6151,49 +6244,52 @@ end
function utf.utf32_to_utf8_t(t,endian)
return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(b)
- if b<0x10000 then
- return char(b%256,rshift(b,8))
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+if bit32 then
+ local rshift=bit32.rshift
+ local function little(b)
+ if b<0x10000 then
+ return char(b%256,rshift(b,8))
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+ end
end
-end
-local function big(b)
- if b<0x10000 then
- return char(rshift(b,8),b%256)
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ local function big(b)
+ if b<0x10000 then
+ return char(rshift(b,8),b%256)
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ end
end
-end
-local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
-local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
-local function utf8_to_utf16_be(str,nobom)
- if nobom then
- return lpegmatch(b_remap,str)
- else
- return char(254,255)..lpegmatch(b_remap,str)
+ local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+ local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+ local function utf8_to_utf16_be(str,nobom)
+ if nobom then
+ return lpegmatch(b_remap,str)
+ else
+ return char(254,255)..lpegmatch(b_remap,str)
+ end
end
-end
-local function utf8_to_utf16_le(str,nobom)
- if nobom then
- return lpegmatch(l_remap,str)
- else
- return char(255,254)..lpegmatch(l_remap,str)
+ local function utf8_to_utf16_le(str,nobom)
+ if nobom then
+ return lpegmatch(l_remap,str)
+ else
+ return char(255,254)..lpegmatch(l_remap,str)
+ end
end
-end
-utf.utf8_to_utf16_be=utf8_to_utf16_be
-utf.utf8_to_utf16_le=utf8_to_utf16_le
-function utf.utf8_to_utf16(str,littleendian,nobom)
- if littleendian then
- return utf8_to_utf16_le(str,nobom)
- else
- return utf8_to_utf16_be(str,nobom)
+ utf.utf8_to_utf16_be=utf8_to_utf16_be
+ utf.utf8_to_utf16_le=utf8_to_utf16_le
+ function utf.utf8_to_utf16(str,littleendian,nobom)
+ if littleendian then
+ return utf8_to_utf16_le(str,nobom)
+ else
+ return utf8_to_utf16_be(str,nobom)
+ end
end
end
local pattern=Cs (
@@ -6467,7 +6563,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 43488, stripped down to: 21595
+-- original size: 45188, stripped down to: 22734
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -6797,6 +6893,13 @@ local template=[[
%s
return function(%s) return %s end
]]
+local pattern=Cs(Cc('"')*(
+ (1-S('"\\\n\r'))^1+P('"')/'\\"'+P('\\')/'\\\\'+P('\n')/'\\n'+P('\r')/'\\r'
+)^0*Cc('"'))
+patterns.escapedquotes=pattern
+function string.escapedquotes(s)
+ return lpegmatch(pattern,s)
+end
local preamble=""
local environment={
global=global or _G,
@@ -6821,9 +6924,10 @@ local environment={
formattednumber=number.formatted,
sparseexponent=number.sparseexponent,
formattedfloat=number.formattedfloat,
- stripzero=lpeg.patterns.stripzero,
- stripzeros=lpeg.patterns.stripzeros,
- FORMAT=string.f9,
+ stripzero=patterns.stripzero,
+ stripzeros=patterns.stripzeros,
+ escapedquotes=string.escapedquotes,
+ FORMAT=string.f6,
}
local arguments={ "a1" }
setmetatable(arguments,{ __index=function(t,k)
@@ -6874,13 +6978,16 @@ local format_left=function(f)
return format("a%s..utfpadding(a%s,%i)",n,n,-f)
end
end
-local format_q=function()
+local format_q=JITSUPPORTED and function()
n=n+1
return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n)
+end or function()
+ n=n+1
+ return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n)
end
local format_Q=function()
n=n+1
- return format("format('%%q',tostring(a%s))",n)
+ return format("escapedquotes(tostring(a%s))",n)
end
local format_i=function(f)
n=n+1
@@ -7031,12 +7138,25 @@ local format_n=function()
n=n+1
return format("((a%s %% 1 == 0) and format('%%i',a%s) or tostring(a%s))",n,n,n)
end
-local format_N=function(f)
- n=n+1
- if not f or f=="" then
- f=".9"
- end
- return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+local format_N if environment.FORMAT then
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ return format("FORMAT(a%s,'%%.9f')",n)
+ elseif f==".6" or f=="0.6" then
+ return format("FORMAT(a%s)",n)
+ else
+ return format("FORMAT(a%s,'%%%sf')",n,f)
+ end
+ end
+else
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ f=".9"
+ end
+ return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+ end
end
local format_a=function(f)
n=n+1
@@ -7265,9 +7385,9 @@ patterns.xmlescape=Cs((P("<")/"&lt;"+P(">")/"&gt;"+P("&")/"&amp;"+P('"')/"&quot;
patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+anything)^0)
patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0)
patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"'))
-add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=lpeg.patterns.xmlescape })
-add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
-add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
+add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=patterns.xmlescape })
+add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=patterns.texescape })
+add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=patterns.luaescape })
local dquote=patterns.dquote
local equote=patterns.escaped+dquote/'\\"'+1
local cquote=Cc('"')
@@ -7299,6 +7419,27 @@ local f_16_16=formatters["%0.5N"]
function number.to16dot16(n)
return f_16_16(n/65536.0)
end
+if not string.explode then
+ local tsplitat=lpeg.tsplitat
+ local p_utf=patterns.utf8character
+ local p_check=C(p_utf)*(P("+")*Cc(true))^0
+ local p_split=Ct(C(p_utf)^0)
+ local p_space=Ct((C(1-P(" ")^1)+P(" ")^1)^0)
+ function string.explode(str,symbol)
+ if symbol=="" then
+ return lpegmatch(p_split,str)
+ elseif symbol then
+ local a,b=lpegmatch(p_check,symbol)
+ if b then
+ return lpegmatch(tsplitat(P(a)^1),str)
+ else
+ return lpegmatch(tsplitat(a),str)
+ end
+ else
+ return lpegmatch(p_space,str)
+ end
+ end
+end
end -- of closure
@@ -7307,7 +7448,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 28866, stripped down to: 16134
+-- original size: 32649, stripped down to: 18257
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -7544,78 +7685,160 @@ function tables.encapsulate(core,capsule,protect)
} )
end
end
-local f_hashed_string=formatters["[%q]=%q,"]
-local f_hashed_number=formatters["[%q]=%s,"]
-local f_hashed_boolean=formatters["[%q]=%l,"]
-local f_hashed_table=formatters["[%q]="]
-local f_indexed_string=formatters["[%s]=%q,"]
-local f_indexed_number=formatters["[%s]=%s,"]
-local f_indexed_boolean=formatters["[%s]=%l,"]
-local f_indexed_table=formatters["[%s]="]
-local f_ordered_string=formatters["%q,"]
-local f_ordered_number=formatters["%s,"]
-local f_ordered_boolean=formatters["%l,"]
-function table.fastserialize(t,prefix)
- local r={ type(prefix)=="string" and prefix or "return" }
- local m=1
- local function fastserialize(t,outer)
- local n=#t
- m=m+1
- r[m]="{"
- if n>0 then
- for i=0,n do
- local v=t[i]
- local tv=type(v)
- if tv=="string" then
- m=m+1 r[m]=f_ordered_string(v)
- elseif tv=="number" then
- m=m+1 r[m]=f_ordered_number(v)
- elseif tv=="table" then
- fastserialize(v)
- elseif tv=="boolean" then
- m=m+1 r[m]=f_ordered_boolean(v)
+if JITSUPPORTED then
+ local f_hashed_string=formatters["[%Q]=%Q,"]
+ local f_hashed_number=formatters["[%Q]=%s,"]
+ local f_hashed_boolean=formatters["[%Q]=%l,"]
+ local f_hashed_table=formatters["[%Q]="]
+ local f_indexed_string=formatters["[%s]=%Q,"]
+ local f_indexed_number=formatters["[%s]=%s,"]
+ local f_indexed_boolean=formatters["[%s]=%l,"]
+ local f_indexed_table=formatters["[%s]="]
+ local f_ordered_string=formatters["%Q,"]
+ local f_ordered_number=formatters["%s,"]
+ local f_ordered_boolean=formatters["%l,"]
+ function table.fastserialize(t,prefix)
+ local r={ type(prefix)=="string" and prefix or "return" }
+ local m=1
+ local function fastserialize(t,outer)
+ local n=#t
+ m=m+1
+ r[m]="{"
+ if n>0 then
+ local v=t[0]
+ if v then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(0,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(0,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(0)
+ fastserialize(v)
+ m=m+1 r[m]=f_indexed_table(0)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(0,v)
+ end
+ end
+ for i=1,n do
+ local v=t[i]
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_ordered_string(v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_ordered_number(v)
+ elseif tv=="table" then
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_ordered_boolean(v)
+ end
end
end
- end
- for k,v in next,t do
- local tk=type(k)
- if tk=="number" then
- if k>n or k<0 then
+ for k,v in next,t do
+ local tk=type(k)
+ if tk=="number" then
+ if k>n or k<0 then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(k,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(k,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(k)
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(k,v)
+ end
+ end
+ else
local tv=type(v)
if tv=="string" then
- m=m+1 r[m]=f_indexed_string(k,v)
+ m=m+1 r[m]=f_hashed_string(k,v)
elseif tv=="number" then
- m=m+1 r[m]=f_indexed_number(k,v)
+ m=m+1 r[m]=f_hashed_number(k,v)
elseif tv=="table" then
- m=m+1 r[m]=f_indexed_table(k)
+ m=m+1 r[m]=f_hashed_table(k)
fastserialize(v)
elseif tv=="boolean" then
- m=m+1 r[m]=f_indexed_boolean(k,v)
+ m=m+1 r[m]=f_hashed_boolean(k,v)
end
end
+ end
+ m=m+1
+ if outer then
+ r[m]="}"
else
- local tv=type(v)
- if tv=="string" then
- m=m+1 r[m]=f_hashed_string(k,v)
- elseif tv=="number" then
- m=m+1 r[m]=f_hashed_number(k,v)
- elseif tv=="table" then
- m=m+1 r[m]=f_hashed_table(k)
- fastserialize(v)
- elseif tv=="boolean" then
- m=m+1 r[m]=f_hashed_boolean(k,v)
- end
+ r[m]="},"
end
+ return r
end
- m=m+1
- if outer then
- r[m]="}"
- else
- r[m]="},"
+ return concat(fastserialize(t,true))
+ end
+else
+ local f_v=formatters["[%q]=%q,"]
+ local f_t=formatters["[%q]="]
+ local f_q=formatters["%q,"]
+ function table.fastserialize(t,prefix)
+ local r={ type(prefix)=="string" and prefix or "return" }
+ local m=1
+ local function fastserialize(t,outer)
+ local n=#t
+ m=m+1
+ r[m]="{"
+ if n>0 then
+ local v=t[0]
+ if v then
+ m=m+1
+ r[m]="[0]='"
+ if type(v)=="table" then
+ fastserialize(v)
+ else
+ r[m]=format("%q,",v)
+ end
+ end
+ for i=1,n do
+ local v=t[i]
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%i]=",i)
+ fastserialize(v)
+ else
+ r[m]=format("[%i]=%q,",i,v)
+ end
+ end
+ end
+ for k,v in next,t do
+ local tk=type(k)
+ if tk=="number" then
+ if k>n or k<0 then
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%i]=",k)
+ fastserialize(v)
+ else
+ r[m]=format("[%i]=%q,",k,v)
+ end
+ end
+ else
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%q]=",k)
+ fastserialize(v)
+ else
+ r[m]=format("[%q]=%q,",k,v)
+ end
+ end
+ end
+ m=m+1
+ if outer then
+ r[m]="}"
+ else
+ r[m]="},"
+ end
+ return r
end
- return r
+ return concat(fastserialize(t,true))
end
- return concat(fastserialize(t,true))
end
function table.deserialize(str)
if not str or str=="" then
@@ -7709,28 +7932,28 @@ function table.twowaymapper(t)
return t
end
local f_start_key_idx=formatters["%w{"]
-local f_start_key_num=formatters["%w[%s]={"]
+local f_start_key_num=JITSUPPORTED and formatters["%w[%s]={"] or formatters["%w[%q]={"]
local f_start_key_str=formatters["%w[%q]={"]
local f_start_key_boo=formatters["%w[%l]={"]
local f_start_key_nop=formatters["%w{"]
local f_stop=formatters["%w},"]
-local f_key_num_value_num=formatters["%w[%s]=%s,"]
-local f_key_str_value_num=formatters["%w[%q]=%s,"]
-local f_key_boo_value_num=formatters["%w[%l]=%s,"]
-local f_key_num_value_str=formatters["%w[%s]=%q,"]
-local f_key_str_value_str=formatters["%w[%q]=%q,"]
-local f_key_boo_value_str=formatters["%w[%l]=%q,"]
-local f_key_num_value_boo=formatters["%w[%s]=%l,"]
-local f_key_str_value_boo=formatters["%w[%q]=%l,"]
+local f_key_num_value_num=JITSUPPORTED and formatters["%w[%s]=%s,"] or formatters["%w[%s]=%q,"]
+local f_key_str_value_num=JITSUPPORTED and formatters["%w[%Q]=%s,"] or formatters["%w[%Q]=%q,"]
+local f_key_boo_value_num=JITSUPPORTED and formatters["%w[%l]=%s,"] or formatters["%w[%l]=%q,"]
+local f_key_num_value_str=JITSUPPORTED and formatters["%w[%s]=%Q,"] or formatters["%w[%q]=%Q,"]
+local f_key_str_value_str=formatters["%w[%Q]=%Q,"]
+local f_key_boo_value_str=formatters["%w[%l]=%Q,"]
+local f_key_num_value_boo=JITSUPPORTED and formatters["%w[%s]=%l,"] or formatters["%w[%q]=%l,"]
+local f_key_str_value_boo=formatters["%w[%Q]=%l,"]
local f_key_boo_value_boo=formatters["%w[%l]=%l,"]
-local f_key_num_value_not=formatters["%w[%s]={},"]
-local f_key_str_value_not=formatters["%w[%q]={},"]
+local f_key_num_value_not=JITSUPPORTED and formatters["%w[%s]={},"] or formatters["%w[%q]={},"]
+local f_key_str_value_not=formatters["%w[%Q]={},"]
local f_key_boo_value_not=formatters["%w[%l]={},"]
-local f_key_num_value_seq=formatters["%w[%s]={ %, t },"]
-local f_key_str_value_seq=formatters["%w[%q]={ %, t },"]
+local f_key_num_value_seq=JITSUPPORTED and formatters["%w[%s]={ %, t },"] or formatters["%w[%q]={ %, t },"]
+local f_key_str_value_seq=formatters["%w[%Q]={ %, t },"]
local f_key_boo_value_seq=formatters["%w[%l]={ %, t },"]
-local f_val_num=formatters["%w%s,"]
-local f_val_str=formatters["%w%q,"]
+local f_val_num=JITSUPPORTED and formatters["%w%s,"] or formatters["%w%q,"]
+local f_val_str=formatters["%w%Q,"]
local f_val_boo=formatters["%w%l,"]
local f_val_not=formatters["%w{},"]
local f_val_seq=formatters["%w{ %, t },"]
@@ -7738,7 +7961,7 @@ local f_fin_seq=formatters[" %, t }"]
local f_table_return=formatters["return {"]
local f_table_name=formatters["%s={"]
local f_table_direct=formatters["{"]
-local f_table_entry=formatters["[%q]={"]
+local f_table_entry=formatters["[%Q]={"]
local f_table_finish=formatters["}"]
local spaces=utilities.strings.newrepeater(" ")
local original_serialize=table.serialize
@@ -8339,7 +8562,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sac"] = package.loaded["util-sac"] or true
--- original size: 11332, stripped down to: 8420
+-- original size: 12946, stripped down to: 9507
if not modules then modules={} end modules ['util-sac']={
version=1.001,
@@ -8374,6 +8597,7 @@ end
function streams.size(f)
return f and f[3] or 0
end
+streams.getsize=streams.size
function streams.setposition(f,i)
if f[4] then
if i<=0 then
@@ -8566,9 +8790,9 @@ function streams.readfixed2(f)
f[2]=j+1
local a,b=byte(f[1],i,j)
if a>=0x80 then
- tonumber((a-0x100).."."..b)
+ return tonumber((a-0x100).."."..b) or 0
else
- tonumber((a ).."."..b)
+ return tonumber((a ).."."..b) or 0
end
end
function streams.readfixed4(f)
@@ -8577,9 +8801,9 @@ function streams.readfixed4(f)
f[2]=j+1
local a,b,c,d=byte(f[1],i,j)
if a>=0x80 then
- tonumber((0x100*a+b-0x10000).."."..(0x100*c+d))
+ return tonumber((0x100*a+b-0x10000).."."..(0x100*c+d)) or 0
else
- tonumber((0x100*a+b ).."."..(0x100*c+d))
+ return tonumber((0x100*a+b ).."."..(0x100*c+d)) or 0
end
end
if bit32 then
@@ -8659,6 +8883,16 @@ if sio and sio.readcardinal2 then
f[2]=i+4
return readinteger4(f[1],i)
end
+ function streams.readfixed2(f)
+ local i=f[2]
+ f[2]=i+2
+ return readfixed2(f[1],i)
+ end
+ function streams.readfixed4(f)
+ local i=f[2]
+ f[2]=i+4
+ return readfixed4(f[1],i)
+ end
function streams.read2dot4(f)
local i=f[2]
f[2]=i+2
@@ -8758,6 +8992,50 @@ else
return t
end
end
+do
+ local files=utilities.files
+ if files then
+ local openfile=files.open
+ local openstream=streams.open
+ local openstring=streams.openstring
+ local setmetatable=setmetatable
+ function io.newreader(str,method)
+ local f,m
+ if method=="string" then
+ f=openstring(str)
+ m=streams
+ elseif method=="stream" then
+ f=openstream(str)
+ m=streams
+ else
+ f=openfile(str,"rb")
+ m=files
+ end
+ if f then
+ local t={}
+ setmetatable(t,{
+ __index=function(t,k)
+ local r=m[k]
+ if k=="close" then
+ if f then
+ m.close(f)
+ f=nil
+ end
+ return function() end
+ elseif r then
+ local v=function(_,a,b) return r(f,a,b) end
+ t[k]=v
+ return v
+ else
+ print("unknown key",k)
+ end
+ end
+ } )
+ return t
+ end
+ end
+ end
+end
end -- of closure
@@ -9801,7 +10079,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-copas"] = package.loaded["util-soc-imp-copas"] or true
--- original size: 25844, stripped down to: 14821
+-- original size: 25959, stripped down to: 14893
local socket=socket or require("socket")
@@ -9838,6 +10116,7 @@ local copas={
autoclose=true,
running=false,
report=report,
+ trace=false,
}
local function statushandler(status,...)
if status then
@@ -9847,7 +10126,9 @@ local function statushandler(status,...)
if type(err)=="table" then
err=err[1]
end
- report("error: %s",tostring(err))
+ if copas.trace then
+ report("error: %s",tostring(err))
+ end
return nil,err
end
function socket.protect(func)
@@ -9861,7 +10142,9 @@ function socket.newtry(finalizer)
if not status then
local detail=select(2,...)
pcall(finalizer,detail)
- report("error: %s",tostring(detail))
+ if copas.trace then
+ report("error: %s",tostring(detail))
+ end
return
end
return...
@@ -12429,7 +12712,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-set"] = package.loaded["trac-set"] or true
--- original size: 13340, stripped down to: 8826
+-- original size: 13394, stripped down to: 8882
if not modules then modules={} end modules ['trac-set']={
version=1.001,
@@ -12439,8 +12722,9 @@ if not modules then modules={} end modules ['trac-set']={
license="see context related readme files"
}
local type,next,tostring,tonumber=type,next,tostring,tonumber
+local print=print
local concat,sortedhash=table.concat,table.sortedhash
-local format,find,lower,gsub,topattern=string.format,string.find,string.lower,string.gsub,string.topattern
+local formatters,find,lower,gsub,topattern=string.formatters,string.find,string.lower,string.gsub,string.topattern
local is_boolean=string.is_boolean
local settings_to_hash=utilities.parsers.settings_to_hash
local allocate=utilities.storage.allocate
@@ -12450,10 +12734,10 @@ local setters=utilities.setters or {}
utilities.setters=setters
local data={}
local trace_initialize=false
+local frozen=true
function setters.initialize(filename,name,values)
local setter=data[name]
if setter then
- frozen=true
local data=setter.data
if data then
for key,newvalue in sortedhash(values) do
@@ -12647,8 +12931,8 @@ function setters.show(t)
end
end
local enable,disable,register,list,show=setters.enable,setters.disable,setters.register,setters.list,setters.show
-function setters.report(setter,...)
- print(format("%-15s : %s\n",setter.name,format(...)))
+function setters.report(setter,fmt,...)
+ print(formatters["%-15s : %s\n"](setter.name,formatters[fmt](...)))
end
local function default(setter,name)
local d=setter.data[name]
@@ -12668,7 +12952,7 @@ function setters.new(name)
disable=function(...) disable (setter,...) end,
reset=function(...) reset (setter,...) end,
register=function(...) register(setter,...) end,
- list=function(...) list (setter,...) end,
+ list=function(...) return list (setter,...) end,
show=function(...) show (setter,...) end,
default=function(...) return default (setter,...) end,
value=function(...) return value (setter,...) end,
@@ -12771,7 +13055,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 32618, stripped down to: 20935
+-- original size: 33003, stripped down to: 21667
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -12816,14 +13100,30 @@ local function ignore() end
setmetatableindex(logs,function(t,k) t[k]=ignore;return ignore end)
local report,subreport,status,settarget,setformats,settranslations
local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
+local function ansisupported(specification)
+ if specification~="ansi" and specification~="ansilog" then
+ return false
+ elseif os and os.enableansi then
+ return os.enableansi()
+ else
+ return false
+ end
+end
if runningtex and texio then
if texio.setescape then
texio.setescape(0)
end
- if arg then
+ if arg and ansisupported then
for k,v in next,arg do
if v=="--ansi" or v=="--c:ansi" then
- variant="ansi"
+ if ansisupported("ansi") then
+ variant="ansi"
+ end
+ break
+ elseif v=="--ansilog" or v=="--c:ansilog" then
+ if ansisupported("ansilog") then
+ variant="ansilog"
+ end
break
end
end
@@ -12928,6 +13228,10 @@ if runningtex and texio then
},
}
}
+ variants.ansilog={
+ formats=variants.ansi.formats,
+ targets=variants.default.targets,
+ }
logs.flush=io.flush
writer=function(...)
write_nl(target,...)
@@ -13034,6 +13338,9 @@ if runningtex and texio then
t=specification.targets
f=specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification="default"
+ end
local v=variants[specification]
if v then
t=v.targets
@@ -13060,7 +13367,7 @@ if runningtex and texio then
subdirect_nop=f.subdirect_nop
status_yes=f.status_yes
status_nop=f.status_nop
- if variant=="ansi" then
+ if variant=="ansi" or variant=="ansilog" then
useluawrites()
end
settarget(whereto)
@@ -13153,6 +13460,9 @@ else
if type(specification)=="table" then
f=specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification="default"
+ end
local v=variants[specification]
if v then
f=v.formats
@@ -13408,12 +13718,6 @@ end
local nesting=0
local verbose=false
local hasscheme=url.hasscheme
-function logs.show_open(name)
-end
-function logs.show_close(name)
-end
-function logs.show_load(name)
-end
local simple=logs.reporter("comment")
logs.simple=simple
logs.simpleline=simple
@@ -13480,6 +13784,13 @@ local exporters={
logs.reporters=reporters
logs.exporters=exporters
function logs.application(t)
+ local arguments=environment and environment.arguments
+ if arguments then
+ local ansi=arguments.ansi or arguments.ansilog
+ if ansi then
+ logs.setformatters(arguments.ansi and "ansi" or "ansilog")
+ end
+ end
t.name=t.name or "unknown"
t.banner=t.banner
t.moreinfo=moreinfo
@@ -13553,8 +13864,6 @@ else
print(format(...))
end
end
-io.stdout:setvbuf('no')
-io.stderr:setvbuf('no')
if package.helpers.report then
package.helpers.report=logs.reporter("package loader")
end
@@ -13652,7 +13961,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-inf"] = package.loaded["trac-inf"] or true
--- original size: 8966, stripped down to: 5972
+-- original size: 9973, stripped down to: 7492
if not modules then modules={} end modules ['trac-inf']={
version=1.001,
@@ -13674,7 +13983,7 @@ statistics.enable=true
statistics.threshold=0.01
local statusinfo,n,registered,timers={},0,{},{}
setmetatableindex(timers,function(t,k)
- local v={ timing=0,loadtime=0 }
+ local v={ timing=0,loadtime=0,offset=0 }
t[k]=v
return v
end)
@@ -13682,10 +13991,40 @@ local function hastiming(instance)
return instance and timers[instance]
end
local function resettiming(instance)
- timers[instance or "notimer"]={ timing=0,loadtime=0 }
+ timers[instance or "notimer"]={ timing=0,loadtime=0,offset=0 }
end
local ticks=clock
local seconds=function(n) return n or 0 end
+if lua.getpreciseticks then
+ ticks=lua.getpreciseticks
+ seconds=lua.getpreciseseconds
+elseif FFISUPPORTED and ffi and os.type=="windows" then
+ local okay,kernel=pcall(ffi.load,"kernel32")
+ if kernel then
+ local tonumber=ffi.number or tonumber
+ ffi.cdef[[
+ int QueryPerformanceFrequency(int64_t *lpFrequency);
+ int QueryPerformanceCounter(int64_t *lpPerformanceCount);
+ ]]
+ local target=ffi.new("__int64[1]")
+ ticks=function()
+ if kernel.QueryPerformanceCounter(target)==1 then
+ return tonumber(target[0])
+ else
+ return 0
+ end
+ end
+ local target=ffi.new("__int64[1]")
+ seconds=function(ticks)
+ if kernel.QueryPerformanceFrequency(target)==1 then
+ return ticks/tonumber(target[0])
+ else
+ return 0
+ end
+ end
+ end
+else
+end
local function starttiming(instance,reset)
local timer=timers[instance or "notimer"]
local it=timer.timing
@@ -13720,12 +14059,26 @@ local function stoptiming(instance)
end
return 0
end
+local function benchmarktimer(instance)
+ local timer=timers[instance or "notimer"]
+ local it=timer.timing
+ if it>1 then
+ timer.timing=it-1
+ else
+ local starttime=timer.starttime
+ if starttime and starttime>0 then
+ timer.offset=ticks()-starttime
+ else
+ timer.offset=0
+ end
+ end
+end
local function elapsed(instance)
if type(instance)=="number" then
return instance
else
local timer=timers[instance or "notimer"]
- return timer and seconds(timer.loadtime) or 0
+ return timer and seconds(timer.loadtime-2*(timer.offset or 0)) or 0
end
end
local function currenttime(instance)
@@ -13738,7 +14091,7 @@ local function currenttime(instance)
else
local starttime=timer.starttime
if starttime and starttime>0 then
- return seconds(timer.loadtime+ticks()-starttime)
+ return seconds(timer.loadtime+ticks()-starttime-2*(timer.offset or 0))
end
end
return 0
@@ -13764,6 +14117,7 @@ statistics.elapsed=elapsed
statistics.elapsedtime=elapsedtime
statistics.elapsedindeed=elapsedindeed
statistics.elapsedseconds=elapsedseconds
+statistics.benchmarktimer=benchmarktimer
function statistics.register(tag,fnc)
if statistics.enable and type(fnc)=="function" then
local rt=registered[tag] or (#statusinfo+1)
@@ -13780,10 +14134,17 @@ function statistics.show()
return format("%s, type: %s, binary subtree: %s",
os.platform or "unknown",os.type or "unknown",environment.texos or "unknown")
end)
- register("used engine",function()
- return format("%s version %s with functionality level %s, banner: %s",
- LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner))
- end)
+ if LUATEXENGINE=="luametatex" then
+ register("used engine",function()
+ return format("%s version %s, functionality level %s, format id %s",
+ LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,LUATEXFORMATID)
+ end)
+ else
+ register("used engine",function()
+ return format("%s version %s with functionality level %s, banner: %s",
+ LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner))
+ end)
+ end
register("control sequences",function()
return format("%s of %s + %s",status.cs_count,status.hash_size,status.hash_extra)
end)
@@ -13822,7 +14183,11 @@ function statistics.show()
end
function statistics.memused()
local round=math.round or math.floor
- return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000),round(status.luastate_bytes/1000000))
+ return format("%s MB, ctx: %s MB, max: %s MB)",
+ round(collectgarbage("count")/1000),
+ round(status.luastate_bytes/1000000),
+ status.luastate_bytes_max and round(status.luastate_bytes_max/1000000) or "unknown"
+ )
end
starttiming(statistics)
function statistics.formatruntime(runtime)
@@ -14013,7 +14378,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-lua"] = package.loaded["util-lua"] or true
--- original size: 6664, stripped down to: 4589
+-- original size: 7149, stripped down to: 4997
if not modules then modules={} end modules ['util-lua']={
version=1.001,
@@ -14038,16 +14403,21 @@ luautilities.nofstrippedchunks=0
luautilities.nofstrippedbytes=0
local strippedchunks={}
luautilities.strippedchunks=strippedchunks
+if not LUATEXENGINE then
+ LUATEXENGINE=status.luatex_engine and string.lower(status.luatex_engine)
+ JITSUPPORTED=LUATEXENGINE=="luajittex" or jit
+ CONTEXTLMTXMODE=CONTEXTLMTXMODE or (LUATEXENGINE=="luametatex" and 1) or 0
+end
luautilities.suffixes={
tma="tma",
- tmc=jit and "tmb" or "tmc",
+ tmc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tmd") or (jit and "tmb") or "tmc",
lua="lua",
- luc=jit and "lub" or "luc",
+ luc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "lud") or (jit and "lub") or "luc",
lui="lui",
luv="luv",
luj="luj",
tua="tua",
- tuc="tuc",
+ tuc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tud") or (jit and "tub") or "tuc",
}
local function register(name)
if tracestripping then
@@ -14186,7 +14556,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-deb"] = package.loaded["util-deb"] or true
--- original size: 9955, stripped down to: 6693
+-- original size: 10136, stripped down to: 6832
if not modules then modules={} end modules ['util-deb']={
version=1.001,
@@ -14210,7 +14580,13 @@ local dummycalls=10*1000
local nesting=0
local names={}
local initialize=false
-if not (FFISUPPORTED and ffi) then
+if lua.getpreciseticks then
+ initialize=function()
+ ticks=lua.getpreciseticks
+ seconds=lua.getpreciseseconds
+ initialize=false
+ end
+elseif not (FFISUPPORTED and ffi) then
elseif os.type=="windows" then
initialize=function()
local kernel=ffilib("kernel32","system")
@@ -14482,7 +14858,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tpl"] = package.loaded["util-tpl"] or true
--- original size: 7112, stripped down to: 3887
+-- original size: 7722, stripped down to: 4212
if not modules then modules={} end modules ['util-tpl']={
version=1.001,
@@ -14498,6 +14874,7 @@ local report_template=logs.reporter("template")
local tostring,next=tostring,next
local format,sub,byte=string.format,string.sub,string.byte
local P,C,R,Cs,Cc,Carg,lpegmatch,lpegpatterns=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.match,lpeg.patterns
+local formatters=string.formatters
local replacer
local function replacekey(k,t,how,recursive)
local v=t[k]
@@ -14566,6 +14943,10 @@ local function replaceoptional(l,m,r,t,how,recurse)
local v=t[l]
return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
+local function replaceformatted(l,m,r,t,how,recurse)
+ local v=t[r]
+ return v and formatters[l](v)
+end
local single=P("%")
local double=P("%%")
local lquoted=P("%[")
@@ -14579,16 +14960,19 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
+local nolformatted=P(":")/"%%"
+local norformatted=P(":")/""
local noloptional=P("%?")/''
local noroptional=P("?%")/''
local nomoptional=P(":")/''
local args=Carg(1)*Carg(2)*Carg(3)
-local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local key=nosingle*((C((1-nosingle)^1)*args)/replacekey)*nosingle
+local quoted=nolquotedq*((C((1-norquotedq)^1)*args)/replacekeyquoted)*norquotedq
+local unquoted=nolquoted*((C((1-norquoted)^1)*args)/replacekeyunquoted)*norquoted
local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
+local formatted=nosingle*((Cs(nolformatted*(1-norformatted )^1)*norformatted*C((1-nosingle)^1)*args)/replaceformatted)*nosingle
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
+ replacer=Cs((unquoted+quoted+formatted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
@@ -14627,7 +15011,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sbx"] = package.loaded["util-sbx"] or true
--- original size: 20393, stripped down to: 13121
+-- original size: 21084, stripped down to: 13214
if not modules then modules={} end modules ['util-sbx']={
version=1.001,
@@ -14873,37 +15257,50 @@ local iopopen=sandbox.original(io.popen)
local reported={}
local function validcommand(name,program,template,checkers,defaults,variables,reporter,strict)
if validbinaries~=false and (validbinaries==true or validbinaries[program]) then
+ local binpath=nil
if variables then
for variable,value in next,variables do
- local checker=validators[checkers[variable]]
- if checker then
- value=checker(unquoted(value),strict)
- if value then
- variables[variable]=optionalquoted(value)
+ local chktype=checkers[variable]
+ if chktype=="verbose" then
+ else
+ local checker=validators[chktype]
+ if checker then
+ value=checker(unquoted(value),strict)
+ if value then
+ variables[variable]=optionalquoted(value)
+ else
+ report("variable %a with value %a fails the check",variable,value)
+ return
+ end
else
- report("variable %a with value %a fails the check",variable,value)
+ report("variable %a has no checker",variable)
return
end
- else
- report("variable %a has no checker",variable)
- return
end
end
for variable,default in next,defaults do
local value=variables[variable]
if not value or value=="" then
- local checker=validators[checkers[variable]]
- if checker then
- default=checker(unquoted(default),strict)
- if default then
- variables[variable]=optionalquoted(default)
- else
- report("variable %a with default %a fails the check",variable,default)
- return
+ local chktype=checkers[variable]
+ if chktype=="verbose" then
+ else
+ local checker=validators[chktype]
+ if checker then
+ default=checker(unquoted(default),strict)
+ if default then
+ variables[variable]=optionalquoted(default)
+ else
+ report("variable %a with default %a fails the check",variable,default)
+ return
+ end
end
end
end
end
+ binpath=variables.binarypath
+ end
+ if type(binpath)=="string" and binpath~="" then
+ program=binpath.."/"..program
end
local command=program.." "..replace(template,variables)
if reporter then
@@ -14938,7 +15335,8 @@ local runners={
if trace then
report("execute: %s",command)
end
- return osexecute(command)
+ local okay=osexecute(command)
+ return okay
end
end,
pipeto=function(...)
@@ -14972,7 +15370,7 @@ function sandbox.registerrunner(specification)
return
end
if validrunners[name] then
- report("invalid name, runner %a already defined")
+ report("invalid name, runner %a already defined",name)
return
end
local program=specification.program
@@ -15090,8 +15488,8 @@ if io then
end
if os then
overload(os.execute,binaryrunner,"os.execute")
- overload(os.spawn,dummyrunner,"os.spawn")
- overload(os.exec,dummyrunner,"os.exec")
+ overload(os.spawn,dummyrunner,"os.spawn")
+ overload(os.exec,dummyrunner,"os.exec")
overload(os.resultof,binaryrunner,"os.resultof")
overload(os.pipeto,binaryrunner,"os.pipeto")
overload(os.rename,filehandlertwo,"os.rename")
@@ -15116,13 +15514,6 @@ end
if zip then
zip.open=register(zip.open,filehandlerone,"zip.open")
end
-if fontloader then
- fontloader.open=register(fontloader.open,filehandlerone,"fontloader.open")
- fontloader.info=register(fontloader.info,filehandlerone,"fontloader.info")
-end
-if epdf then
- epdf.open=register(epdf.open,filehandlerone,"epdf.open")
-end
sandbox.registerroot=registerroot
sandbox.registerbinary=registerbinary
sandbox.registerlibrary=registerlibrary
@@ -15528,7 +15919,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-env"] = package.loaded["luat-env"] or true
--- original size: 6134, stripped down to: 4118
+-- original size: 6551, stripped down to: 4315
if not modules then modules={} end modules ['luat-env']={
version=1.001,
@@ -15537,7 +15928,7 @@ package.loaded["luat-env"] = package.loaded["luat-env"] or true
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local rawset,rawget,loadfile=rawset,rawget,loadfile
+local rawset,loadfile=rawset,loadfile
local gsub=string.gsub
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_lua=logs.reporter("resolvers","lua")
@@ -15584,6 +15975,12 @@ function environment.texfile(filename)
return resolvers.findfile(filename,'tex')
end
function environment.luafile(filename)
+ if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and file.suffix(filename)=="lua" then
+ local resolved=resolvers.findfile(file.replacesuffix(filename,"lmt")) or ""
+ if resolved~="" then
+ return resolved
+ end
+ end
local resolved=resolvers.findfile(filename,'tex') or ""
if resolved~="" then
return resolved
@@ -15695,7 +16092,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-zip"] = package.loaded["util-zip"] or true
--- original size: 18645, stripped down to: 11291
+-- original size: 19496, stripped down to: 10858
if not modules then modules={} end modules ['util-zip']={
version=1.001,
@@ -15706,7 +16103,7 @@ if not modules then modules={} end modules ['util-zip']={
local type,tostring,tonumber=type,tostring,tonumber
local sort=table.sort
local find,format,sub,gsub=string.find,string.format,string.sub,string.gsub
-local osdate,ostime=os.date,os.time
+local osdate,ostime,osclock=os.date,os.time,os.clock
local ioopen=io.open
local loaddata,savedata=io.loaddata,io.savedata
local filejoin,isdir,dirname,mkdirs=file.join,lfs.isdir,file.dirname,dir.mkdirs
@@ -15721,25 +16118,19 @@ local getposition=files.getposition
local band=bit32.band
local rshift=bit32.rshift
local lshift=bit32.lshift
-local decompress,calculatecrc
-if flate then
- decompress=flate.flate_decompress
- calculatecrc=flate.update_crc32
-else
+local decompress,expandsize,calculatecrc
local zlibdecompress=zlib.decompress
+ local zlibexpandsize=zlib.expandsize
local zlibchecksum=zlib.crc32
- decompress=function(source,targetsize)
- local target=zlibdecompress(source,-15)
- if target then
- return target
- else
- return false,1
- end
+ decompress=function(source)
+ return zlibdecompress(source,-15)
end
+ expandsize=zlibexpandsize and function(source,targetsize)
+ return zlibexpandsize(source,targetsize,-15)
+ end or decompress
calculatecrc=function(buffer,initial)
return zlibchecksum(initial or 0,buffer)
end
-end
local zipfiles={}
utilities.zipfiles=zipfiles
local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
@@ -15864,7 +16255,11 @@ local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
setposition(handle,position)
local result=readstring(handle,compressed)
if data.method==8 then
- result=decompress(result,data.uncompressed)
+ if expandsize then
+ result=expandsize(result,data.uncompressed)
+ else
+ result=decompress(result)
+ end
end
if check and data.crc32~=calculatecrc(result) then
print("checksum mismatch")
@@ -15883,14 +16278,14 @@ local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
zipfiles.list=getziplist
zipfiles.found=foundzipfile
end
-if flate then do
+if xzip then
local writecardinal1=files.writebyte
local writecardinal2=files.writecardinal2le
local writecardinal4=files.writecardinal4le
local logwriter=logs.writer
local globpattern=dir.globpattern
- local compress=flate.flate_compress
- local checksum=flate.update_crc32
+ local compress=xzip.compress
+ local checksum=xzip.crc32
local function fromdostime(dostime,dosdate)
return ostime {
year=rshift(dosdate,9)+1980,
@@ -16087,27 +16482,33 @@ if flate then do
local count=#list
local step=number.idiv(count,10)
local done=0
+ local steps=verbose=="steps"
+ local time=steps and osclock()
for i=1,count do
local l=list[i]
local n=l.filename
local d=unzipfile(z,n)
- local p=filejoin(path,n)
- if mkdirs(dirname(p)) then
- if verbose=="steps" then
- total=total+#d
- done=done+1
- if done>=step then
- done=0
- logwriter(format("%4i files of %4i done, %10i bytes",i,count,total))
+ if d then
+ local p=filejoin(path,n)
+ if mkdirs(dirname(p)) then
+ if steps then
+ total=total+#d
+ done=done+1
+ if done>=step then
+ done=0
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",i,count,total,osclock()-time))
+ end
+ elseif verbose then
+ logwriter(n)
end
- elseif verbose then
- logwriter(n)
+ savedata(p,d)
end
- savedata(p,d)
+ else
+ logwriter(format("problem with file %s",n))
end
end
- if verbose=="steps" then
- logwriter(format("%4i files of %4i done, %10i bytes",count,count,total))
+ if steps then
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",count,count,total,osclock()-time))
end
closezipfile(z)
return true
@@ -16118,37 +16519,8 @@ if flate then do
end
zipfiles.zipdir=zipdir
zipfiles.unzipdir=unzipdir
-end end
-if flate then
- local streams=utilities.streams
- local openfile=streams.open
- local closestream=streams.close
- local setposition=streams.setposition
- local getsize=streams.size
- local readcardinal4=streams.readcardinal4le
- local getstring=streams.getstring
- local decompress=flate.gz_decompress
- function zipfiles.gunzipfile(filename)
- local strm=openfile(filename)
- if strm then
- setposition(strm,getsize(strm)-4+1)
- local size=readcardinal4(strm)
- local data=decompress(getstring(strm),size)
- closestream(strm)
- return data
- end
- end
-elseif gzip then
- local openfile=gzip.open
- function zipfiles.gunzipfile(filename)
- local g=openfile(filename,"rb")
- if g then
- local d=g:read("*a")
- d:close()
- return d
- end
- end
end
+zipfiles.gunzipfile=gzip.load
end -- of closure
@@ -16157,7 +16529,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
--- original size: 60383, stripped down to: 35698
+-- original size: 61191, stripped down to: 35864
if not modules then modules={} end modules ['lxml-tab']={
version=1.001,
@@ -16881,7 +17253,10 @@ local slash=P('/')
local colon=P(':')
local semicolon=P(';')
local ampersand=P('&')
-local valid=R('az','AZ','09')+S('_-.')
+local valid_0=R("\128\255")
+local valid_1=R('az','AZ')+S('_')+valid_0
+local valid_2=valid_1+R('09')+S('-.')
+local valid=valid_1*valid_2^0
local name_yes=C(valid^1)*colon*C(valid^1)
local name_nop=C(P(true))*C(valid^1)
local name=name_yes+name_nop
@@ -16917,8 +17292,9 @@ end
local function entityfile(pattern,k,v,n)
if n then
local okay,data
- if resolvers then
- okay,data=resolvers.loadbinfile(n)
+ local loadbinfile=resolvers and resolvers.loadbinfile
+ if loadbinfile then
+ okay,data=loadbinfile(n)
else
data=io.loaddata(n)
okay=data and data~=""
@@ -17027,12 +17403,14 @@ publicentityfile+publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*op
}
return grammar_parsed_text_one,grammar_parsed_text_two,grammar_unparsed_text
end
-grammar_parsed_text_one_nop,
-grammar_parsed_text_two_nop,
-grammar_unparsed_text_nop=install(space,spacing,anything)
-grammar_parsed_text_one_yes,
-grammar_parsed_text_two_yes,
-grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl)
+local
+ grammar_parsed_text_one_nop,
+ grammar_parsed_text_two_nop,
+ grammar_unparsed_text_nop=install(space,spacing,anything)
+local
+ grammar_parsed_text_one_yes,
+ grammar_parsed_text_two_yes,
+ grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl)
local function _xmlconvert_(data,settings,detail)
settings=settings or {}
preparexmlstate(settings)
@@ -17613,7 +17991,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-lpt"] = package.loaded["lxml-lpt"] or true
--- original size: 55145, stripped down to: 30992
+-- original size: 54626, stripped down to: 31255
if not modules then modules={} end modules ['lxml-lpt']={
version=1.001,
@@ -18095,6 +18473,8 @@ local builtin={
lastindex="(#ll.__p__.dt or 1)",
lastelement="(ll.__p__.en or 1)",
last="#list",
+ list="list",
+ self="ll",
rootposition="order",
order="order",
element="(ll.ei or 1)",
@@ -18203,7 +18583,8 @@ local function register_selector(specification)
end
local function register_expression(expression)
local converted=lpegmatch(converter,expression)
- local runner=load(format(template_e,converted))
+ local wrapped=format(template_e,converted)
+ local runner=load(wrapped)
runner=(runner and runner()) or function() errorrunner_e(expression,converted) end
return { kind="expression",expression=expression,converted=converted,evaluator=runner }
end
@@ -18575,6 +18956,20 @@ expressions.count=function(e,pattern)
local collected=applylpath(e,pattern)
return pattern and (collected and #collected) or 0
end
+expressions.attribute=function(e,name,value)
+ if type(e)=="table" and name then
+ local a=e.at
+ if a then
+ local v=a[name]
+ if value then
+ return v==value
+ else
+ return v
+ end
+ end
+ end
+ return nil
+end
expressions.oneof=function(s,...)
for i=1,select("#",...) do
if s==select(i,...) then
@@ -18621,7 +19016,7 @@ function expressions.contains(str,pattern)
end
return false
end
-function xml.expressions.idstring(str)
+function expressions.idstring(str)
return type(str)=="string" and gsub(str,"^#","") or ""
end
local function traverse(root,pattern,handle)
@@ -20394,7 +20789,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 11099, stripped down to: 7152
+-- original size: 11019, stripped down to: 7086
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -20407,9 +20802,9 @@ local next,type,getmetatable,rawset=next,type,getmetatable,rawset
local gsub,find,gmatch,char=string.gsub,string.find,string.gmatch,string.char
local filedirname,filebasename,filejoin=file.dirname,file.basename,file.join
local ostype,osname,osuname,ossetenv,osgetenv=os.type,os.name,os.uname,os.setenv,os.getenv
+local sortedpairs=table.sortedpairs
local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
-local trace_detail=false trackers.register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers.register("resolvers.expansions",function(v) trace_expansions=v end)
local report_initialization=logs.reporter("resolvers","initialization")
resolvers=resolvers or {}
@@ -20618,7 +21013,7 @@ if ostype=="unix" then
rawset(t,k,v)
end
local colon=P(":")
- for k,v in table.sortedpairs(prefixes) do
+ for k,v in sortedpairs(prefixes) do
if p then
p=P(k)+p
else
@@ -20645,7 +21040,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 18154, stripped down to: 10416
+-- original size: 18179, stripped down to: 10432
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -20929,7 +21324,7 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
scancache[sub(full,1,-2)]=files
return files,remap,n,m,r
end
-function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+local function scanfiles(path,branch,usecache,onlyonce,tolerant)
local realpath=resolveprefix(path)
if usecache then
local content=fullcache[realpath]
@@ -20984,8 +21379,9 @@ function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
statistics.stoptiming(timer)
return content
end
+resolvers.scanfiles=scanfiles
function resolvers.simplescanfiles(path,branch,usecache)
- return resolvers.scanfiles(path,branch,usecache,true,true)
+ return scanfiles(path,branch,usecache,true,true)
end
function resolvers.scandata()
table.sort(scanned)
@@ -21052,7 +21448,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-env"] = package.loaded["data-env"] or true
--- original size: 9360, stripped down to: 6312
+-- original size: 9400, stripped down to: 6347
if not modules then modules={} end modules ['data-env']={
version=1.001,
@@ -21062,7 +21458,7 @@ if not modules then modules={} end modules ['data-env']={
license="see context related readme files",
}
local lower,gsub=string.lower,string.gsub
-local next=next
+local next,rawget=next,rawget
local resolvers=resolvers
local allocate=utilities.storage.allocate
local setmetatableindex=table.setmetatableindex
@@ -21143,13 +21539,13 @@ local relations=allocate {
mp={
names={ "mp" },
variable='MPINPUTS',
- suffixes={ 'mp','mpvi','mpiv','mpii' },
+ suffixes={ 'mp','mpvi','mpiv','mpxl','mpii' },
usertype=true,
},
tex={
names={ "tex" },
variable='TEXINPUTS',
- suffixes={ "tex","mkvi","mkiv","mkii","cld","lfg","xml" },
+ suffixes={ "tex","mkiv","mkvi","mkxl","mklx","mkii","cld","lfg","xml" },
usertype=true,
},
icc={
@@ -21337,7 +21733,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 16284, stripped down to: 10938
+-- original size: 16099, stripped down to: 11379
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -21346,48 +21742,83 @@ if not modules then modules={} end modules ['data-tmp']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local format,lower,gsub,concat=string.format,string.lower,string.gsub,table.concat
-local concat=table.concat
-local mkdirs,isdir,isfile=dir.mkdirs,lfs.isdir,lfs.isfile
-local addsuffix,is_writable,is_readable=file.addsuffix,file.is_writable,file.is_readable
-local formatters=string.formatters
local next,type=next,type
+local pcall,loadfile,collectgarbage=pcall,loadfile,collectgarbage
+local format,lower,gsub=string.format,string.lower,string.gsub
+local concat,serialize,fastserialize,serializetofile=table.concat,table.serialize,table.fastserialize,table.tofile
+local mkdirs,expanddirname,isdir,isfile=dir.mkdirs,dir.expandname,lfs.isdir,lfs.isfile
+local is_writable,is_readable=file.is_writable,file.is_readable
+local collapsepath,joinfile,addsuffix,dirname=file.collapsepath,file.join,file.addsuffix,file.dirname
+local savedata=file.savedata
+local formatters=string.formatters
+local osexit,osdate,osuuid=os.exit,os.date,os.uuid
+local removefile=os.remove
+local md5hex=md5.hex
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local report_caches=logs.reporter("resolvers","caches")
local report_resolvers=logs.reporter("resolvers","caching")
local resolvers=resolvers
local cleanpath=resolvers.cleanpath
-local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
-local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
-local compile=utilities.lua.compile
-function utilities.lua.compile(luafile,lucfile,cleanup,strip)
- if cleanup==nil then cleanup=directive_cleanup end
- if strip==nil then strip=directive_strip end
- return compile(luafile,lucfile,cleanup,strip)
+local resolvepath=resolvers.resolve
+local luautilities=utilities.lua
+do
+ local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
+ local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
+ local compilelua=luautilities.compile
+ function luautilities.compile(luafile,lucfile,cleanup,strip)
+ if cleanup==nil then cleanup=directive_cleanup end
+ if strip==nil then strip=directive_strip end
+ return compilelua(luafile,lucfile,cleanup,strip)
+ end
end
caches=caches or {}
local caches=caches
-local luasuffixes=utilities.lua.suffixes
-caches.base=caches.base or "luatex-cache"
-caches.more=caches.more or "context"
-caches.direct=false
-caches.tree=false
-caches.force=true
-caches.ask=false
-caches.relocate=false
+local writable=nil
+local readables={}
+local usedreadables={}
+local compilelua=luautilities.compile
+local luasuffixes=luautilities.suffixes
+caches.base=caches.base or "luatex-cache"
+caches.more=caches.more or "context"
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
-directives.register("system.caches.fast",function(v) caches.fast=true end)
-local writable,readables,usedreadables=nil,{},{}
+local direct_cache=false
+local fast_cache=false
+local cache_tree=false
+directives.register("system.caches.direct",function(v) direct_cache=true end)
+directives.register("system.caches.fast",function(v) fast_cache=true end)
+local function configfiles()
+ return concat(resolvers.configurationfiles(),";")
+end
+local function hashed(tree)
+ tree=gsub(tree,"[\\/]+$","")
+ tree=lower(tree)
+ local hash=md5hex(tree)
+ if trace_cache or trace_locating then
+ report_caches("hashing tree %a, hash %a",tree,hash)
+ end
+ return hash
+end
+local function treehash()
+ local tree=configfiles()
+ if not tree or tree=="" then
+ return false
+ else
+ return hashed(tree)
+ end
+end
+caches.hashed=hashed
+caches.treehash=treehash
+caches.configfiles=configfiles
local function identify()
local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
if texmfcaches then
for k=1,#texmfcaches do
local cachepath=texmfcaches[k]
if cachepath~="" then
- cachepath=resolvers.resolve(cachepath)
- cachepath=resolvers.cleanpath(cachepath)
- cachepath=file.collapsepath(cachepath)
+ cachepath=resolvepath(cachepath)
+ cachepath=cleanpath(cachepath)
+ cachepath=collapsepath(cachepath)
local valid=isdir(cachepath)
if valid then
if is_readable(cachepath) then
@@ -21396,16 +21827,14 @@ local function identify()
writable=cachepath
end
end
- elseif not writable and caches.force then
- local cacheparent=file.dirname(cachepath)
- if is_writable(cacheparent) and true then
- if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath),"no",{ "yes","no" })=="yes" then
- mkdirs(cachepath)
- if isdir(cachepath) and is_writable(cachepath) then
- report_caches("path %a created",cachepath)
- writable=cachepath
- readables[#readables+1]=cachepath
- end
+ elseif not writable then
+ local cacheparent=dirname(cachepath)
+ if is_writable(cacheparent) then
+ mkdirs(cachepath)
+ if isdir(cachepath) and is_writable(cachepath) then
+ report_caches("path %a created",cachepath)
+ writable=cachepath
+ readables[#readables+1]=cachepath
end
end
end
@@ -21418,8 +21847,8 @@ local function identify()
local cachepath=texmfcaches[k]
cachepath=resolvers.expansion(cachepath)
if cachepath~="" then
- cachepath=resolvers.resolve(cachepath)
- cachepath=resolvers.cleanpath(cachepath)
+ cachepath=resolvepath(cachepath)
+ cachepath=cleanpath(cachepath)
local valid=isdir(cachepath)
if valid and is_readable(cachepath) then
if not writable and is_writable(cachepath) then
@@ -21433,23 +21862,25 @@ local function identify()
end
if not writable then
report_caches("fatal error: there is no valid writable cache path defined")
- os.exit()
+ osexit()
elseif #readables==0 then
report_caches("fatal error: there is no valid readable cache path defined")
- os.exit()
+ osexit()
end
- writable=dir.expandname(resolvers.cleanpath(writable))
- local base,more,tree=caches.base,caches.more,caches.tree or caches.treehash()
+ writable=expanddirname(cleanpath(writable))
+ local base=caches.base
+ local more=caches.more
+ local tree=cache_tree or treehash()
if tree then
- caches.tree=tree
+ cache_tree=tree
writable=mkdirs(writable,base,more,tree)
for i=1,#readables do
- readables[i]=file.join(readables[i],base,more,tree)
+ readables[i]=joinfile(readables[i],base,more,tree)
end
else
writable=mkdirs(writable,base,more)
for i=1,#readables do
- readables[i]=file.join(readables[i],base,more)
+ readables[i]=joinfile(readables[i],base,more)
end
end
if trace_cache then
@@ -21486,27 +21917,8 @@ function caches.usedpaths(separator)
return writable or "?"
end
end
-function caches.configfiles()
- return concat(resolvers.configurationfiles(),";")
-end
-function caches.hashed(tree)
- tree=gsub(tree,"[\\/]+$","")
- tree=lower(tree)
- local hash=md5.hex(tree)
- if trace_cache or trace_locating then
- report_caches("hashing tree %a, hash %a",tree,hash)
- end
- return hash
-end
-function caches.treehash()
- local tree=caches.configfiles()
- if not tree or tree=="" then
- return false
- else
- return caches.hashed(tree)
- end
-end
-local r_cache,w_cache={},{}
+local r_cache={}
+local w_cache={}
local function getreadablepaths(...)
local tags={... }
local hash=concat(tags,"/")
@@ -21516,7 +21928,7 @@ local function getreadablepaths(...)
if #tags>0 then
done={}
for i=1,#readables do
- done[i]=file.join(readables[i],...)
+ done[i]=joinfile(readables[i],...)
end
else
done=readables
@@ -21540,17 +21952,25 @@ local function getwritablepath(...)
end
return done
end
-caches.getreadablepaths=getreadablepaths
-caches.getwritablepath=getwritablepath
-function caches.getfirstreadablefile(filename,...)
- local fullname,path=caches.setfirstwritablefile(filename,...)
+local function setfirstwritablefile(filename,...)
+ local wr=getwritablepath(...)
+ local fullname=joinfile(wr,filename)
+ return fullname,wr
+end
+local function setluanames(path,name)
+ return
+ format("%s/%s.%s",path,name,luasuffixes.tma),
+ format("%s/%s.%s",path,name,luasuffixes.tmc)
+end
+local function getfirstreadablefile(filename,...)
+ local fullname,path=setfirstwritablefile(filename,...)
if is_readable(fullname) then
return fullname,path
end
local rd=getreadablepaths(...)
for i=1,#rd do
local path=rd[i]
- local fullname=file.join(path,filename)
+ local fullname=joinfile(path,filename)
if is_readable(fullname) then
usedreadables[i]=true
return fullname,path
@@ -21558,19 +21978,11 @@ function caches.getfirstreadablefile(filename,...)
end
return fullname,path
end
-function caches.setfirstwritablefile(filename,...)
- local wr=getwritablepath(...)
- local fullname=file.join(wr,filename)
- return fullname,wr
-end
-function caches.define(category,subcategory)
- return function()
- return getwritablepath(category,subcategory)
- end
-end
-function caches.setluanames(path,name)
- return format("%s/%s.%s",path,name,luasuffixes.tma),format("%s/%s.%s",path,name,luasuffixes.tmc)
-end
+caches.getreadablepaths=getreadablepaths
+caches.getwritablepath=getwritablepath
+caches.setfirstwritablefile=setfirstwritablefile
+caches.getfirstreadablefile=getfirstreadablefile
+caches.setluanames=setluanames
function caches.loaddata(readables,name,writable)
if type(readables)=="string" then
readables={ readables }
@@ -21578,21 +21990,22 @@ function caches.loaddata(readables,name,writable)
for i=1,#readables do
local path=readables[i]
local loader=false
- local tmaname,tmcname=caches.setluanames(path,name)
+ local state=false
+ local tmaname,tmcname=setluanames(path,name)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
if not loader and isfile(tmaname) then
- local tmacrap,tmcname=caches.setluanames(writable,name)
+ local tmacrap,tmcname=setluanames(writable,name)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
if not loader then
- loader=loadfile(tmaname)
+ state,loader=pcall(loadfile,tmaname)
end
end
if loader then
@@ -21604,21 +22017,21 @@ function caches.loaddata(readables,name,writable)
return false
end
function caches.is_writable(filepath,filename)
- local tmaname,tmcname=caches.setluanames(filepath,filename)
+ local tmaname,tmcname=setluanames(filepath,filename)
return is_writable(tmaname)
end
-local saveoptions={ compact=true }
-function caches.savedata(filepath,filename,data,raw)
- local tmaname,tmcname=caches.setluanames(filepath,filename)
- data.cache_uuid=os.uuid()
- if caches.fast then
- file.savedata(tmaname,table.fastserialize(data,true))
- elseif caches.direct then
- file.savedata(tmaname,table.serialize(data,true,saveoptions))
+local saveoptions={ compact=true,accurate=not JITSUPPORTED }
+function caches.savedata(filepath,filename,data,fast)
+ local tmaname,tmcname=setluanames(filepath,filename)
+ data.cache_uuid=osuuid()
+ if fast or fast_cache then
+ savedata(tmaname,fastserialize(data,true))
+ elseif direct_cache then
+ savedata(tmaname,serialize(data,true,saveoptions))
else
- table.tofile(tmaname,data,true,saveoptions)
+ serializetofile(tmaname,data,true,saveoptions)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
end
local content_state={}
function caches.contentstate()
@@ -21626,11 +22039,14 @@ function caches.contentstate()
end
function caches.loadcontent(cachename,dataname,filename)
if not filename then
- local name=caches.hashed(cachename)
- local full,path=caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename=file.join(path,name)
+ local name=hashed(cachename)
+ local full,path=getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=joinfile(path,name)
+ end
+ local state,blob=pcall(loadfile,addsuffix(filename,luasuffixes.luc))
+ if not blob then
+ state,blob=pcall(loadfile,addsuffix(filename,luasuffixes.lua))
end
- local blob=loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data=blob()
if data and data.content then
@@ -21663,9 +22079,9 @@ function caches.collapsecontent(content)
end
function caches.savecontent(cachename,dataname,content,filename)
if not filename then
- local name=caches.hashed(cachename)
- local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename=file.join(path,name)
+ local name=hashed(cachename)
+ local full,path=setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=joinfile(path,name)
end
local luaname=addsuffix(filename,luasuffixes.lua)
local lucname=addsuffix(filename,luasuffixes.luc)
@@ -21676,17 +22092,17 @@ function caches.savecontent(cachename,dataname,content,filename)
type=dataname,
root=cachename,
version=resolvers.cacheversion,
- date=os.date("%Y-%m-%d"),
- time=os.date("%H:%M:%S"),
+ date=osdate("%Y-%m-%d"),
+ time=osdate("%H:%M:%S"),
content=content,
- uuid=os.uuid(),
+ uuid=osuuid(),
}
- local ok=io.savedata(luaname,table.serialize(data,true))
+ local ok=savedata(luaname,serialize(data,true))
if ok then
if trace_locating then
report_resolvers("category %a, cachename %a saved in %a",dataname,cachename,luaname)
end
- if utilities.lua.compile(luaname,lucname) then
+ if compilelua(luaname,lucname) then
if trace_locating then
report_resolvers("%a compiled to %a",dataname,lucname)
end
@@ -21695,7 +22111,7 @@ function caches.savecontent(cachename,dataname,content,filename)
if trace_locating then
report_resolvers("compiling failed for %a, deleting file %a",dataname,lucname)
end
- os.remove(lucname)
+ removefile(lucname)
end
elseif trace_locating then
report_resolvers("unable to save %a in %a (access error)",dataname,luaname)
@@ -21709,7 +22125,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-met"] = package.loaded["data-met"] or true
--- original size: 5310, stripped down to: 3784
+-- original size: 5518, stripped down to: 3854
if not modules then modules={} end modules ['data-met']={
version=1.100,
@@ -21718,31 +22134,45 @@ if not modules then modules={} end modules ['data-met']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,format=string.find,string.format
-local sequenced=table.sequenced
+local type=type
+local find=string.find
local addurlscheme,urlhashed=url.addscheme,url.hashed
+local collapsepath,joinfile=file.collapsepath,file.join
+local report_methods=logs.reporter("resolvers","methods")
local trace_locating=false
local trace_methods=false
trackers.register("resolvers.locating",function(v) trace_methods=v end)
trackers.register("resolvers.methods",function(v) trace_methods=v end)
-local report_methods=logs.reporter("resolvers","methods")
local allocate=utilities.storage.allocate
local resolvers=resolvers
local registered={}
local function splitmethod(filename)
if not filename then
- return { scheme="unknown",original=filename }
+ return {
+ scheme="unknown",
+ original=filename,
+ }
end
if type(filename)=="table" then
return filename
end
- filename=file.collapsepath(filename,".")
+ filename=collapsepath(filename,".")
if not find(filename,"://",1,true) then
- return { scheme="file",path=filename,original=filename,filename=filename }
+ return {
+ scheme="file",
+ path=filename,
+ original=filename,
+ filename=filename,
+ }
end
- local specification=url.hashed(filename)
+ local specification=urlhashed(filename)
if not specification.scheme or specification.scheme=="" then
- return { scheme="file",path=filename,original=filename,filename=filename }
+ return {
+ scheme="file",
+ path=filename,
+ original=filename,
+ filename=filename,
+ }
else
return specification
end
@@ -21751,7 +22181,8 @@ resolvers.splitmethod=splitmethod
local function methodhandler(what,first,...)
local method=registered[what]
if method then
- local how,namespace=method.how,method.namespace
+ local how=method.how
+ local namespace=method.namespace
if how=="uri" or how=="url" then
local specification=splitmethod(first)
local scheme=specification.scheme
@@ -21797,7 +22228,10 @@ local function methodhandler(what,first,...)
end
resolvers.methodhandler=methodhandler
function resolvers.registermethod(name,namespace,how)
- registered[name]={ how=how or "tag",namespace=namespace }
+ registered[name]={
+ how=how or "tag",
+ namespace=namespace
+ }
namespace["byscheme"]=function(scheme,filename,...)
if scheme=="file" then
return methodhandler(name,filename,...)
@@ -21806,7 +22240,7 @@ function resolvers.registermethod(name,namespace,how)
end
end
end
-local concatinators=allocate { notfound=file.join }
+local concatinators=allocate { notfound=joinfile }
local locators=allocate { notfound=function() end }
local hashers=allocate { notfound=function() end }
local generators=allocate { notfound=function() end }
@@ -21827,7 +22261,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 68195, stripped down to: 43680
+-- original size: 69576, stripped down to: 44470
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -21838,7 +22272,8 @@ if not modules then modules={} end modules ['data-res']={
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
local concat,insert,remove=table.concat,table.insert,table.remove
-local next,type,rawget=next,type,rawget
+local next,type,rawget,loadfile=next,type,rawget,loadfile
+local mergedtable=table.merged
local os=os
local P,S,R,C,Cc,Cs,Ct,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cc,lpeg.Cs,lpeg.Ct,lpeg.Carg
local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
@@ -21854,13 +22289,14 @@ local joinpath=file.joinpath
local is_qualified_path=file.is_qualified_path
local allocate=utilities.storage.allocate
local settings_to_array=utilities.parsers.settings_to_array
+local urlhasscheme=url.hasscheme
local getcurrentdir=lfs.currentdir
local isfile=lfs.isfile
local isdir=lfs.isdir
local setmetatableindex=table.setmetatableindex
local luasuffixes=utilities.lua.suffixes
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
-local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
+local trace_details=false trackers .register("resolvers.details",function(v) trace_details=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
@@ -21879,10 +22315,17 @@ local ostype,osname,osenv,ossetenv,osgetenv=os.type,os.name,os.env,os.setenv,os.
resolvers.cacheversion="1.100"
resolvers.configbanner=""
resolvers.homedir=environment.homedir
-resolvers.criticalvars=allocate { "SELFAUTOLOC","SELFAUTODIR","SELFAUTOPARENT","TEXMFCNF","TEXMF","TEXOS" }
resolvers.luacnfname="texmfcnf.lua"
resolvers.luacnffallback="contextcnf.lua"
resolvers.luacnfstate="unknown"
+local criticalvars={
+ "SELFAUTOLOC",
+ "SELFAUTODIR",
+ "SELFAUTOPARENT",
+ "TEXMFCNF",
+ "TEXMF",
+ "TEXOS",
+}
if environment.default_texmfcnf then
resolvers.luacnfspec="home:texmf/web2c;"..environment.default_texmfcnf
else
@@ -21902,13 +22345,20 @@ local dangerous=resolvers.dangerous
local suffixmap=resolvers.suffixmap
resolvers.defaultsuffixes={ "tex" }
local instance=nil
-function resolvers.setenv(key,value,raw)
+local variable
+local expansion
+local setenv
+local getenv
+local formatofsuffix=resolvers.formatofsuffix
+local splitpath=resolvers.splitpath
+local splitmethod=resolvers.splitmethod
+setenv=function(key,value,raw)
if instance then
instance.environment[key]=value
ossetenv(key,raw and value or resolveprefix(value))
end
end
-local function getenv(key)
+getenv=function(key)
local value=rawget(instance.environment,key)
if value and value~="" then
return value
@@ -21918,94 +22368,97 @@ local function getenv(key)
end
end
resolvers.getenv=getenv
-resolvers.env=getenv
-local function resolvevariable(k)
- return instance.expansions[k]
-end
+resolvers.setenv=setenv
local dollarstripper=lpeg.stripper("$")
local inhibitstripper=P("!")^0*Cs(P(1)^0)
-local somevariable=P("$")/""
-local somekey=C(R("az","AZ","09","__","--")^1)
-local somethingelse=P(";")*((1-S("!{}/\\"))^1*P(";")/"")+P(";")*(P(";")/"")+P(1)
-local variableexpander=Cs((somevariable*(somekey/resolvevariable)+somethingelse)^1 )
-local cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
-local variablecleaner=Cs((cleaner+P(1))^0)
-local somevariable=R("az","AZ","09","__","--")^1/resolvevariable
-local variable=(P("$")/"")*(somevariable+(P("{")/"")*somevariable*(P("}")/""))
-local variableresolver=Cs((variable+P(1))^0)
-local function expandedvariable(var)
- return lpegmatch(variableexpander,var) or var
-end
-function resolvers.reset()
- if trace_locating then
- report_resolving("creating instance")
- end
- local environment={}
- local variables={}
- local expansions={}
- local order={}
- instance={
- environment=environment,
- variables=variables,
- expansions=expansions,
- order=order,
- files={},
- setups={},
- found={},
- foundintrees={},
- hashes={},
- hashed={},
- pathlists=false,
- specification={},
- lists={},
- data={},
- fakepaths={},
- remember=true,
- diskcache=true,
- renewcache=false,
- renewtree=false,
- loaderror=false,
- savelists=true,
- pattern=nil,
- force_suffixes=true,
- pathstack={},
- }
- setmetatableindex(variables,function(t,k)
- local v
- for i=1,#order do
- v=order[i][k]
+local expandedvariable,resolvedvariable do
+ local function resolveinstancevariable(k)
+ return instance.expansions[k]
+ end
+ local p_variable=P("$")/""
+ local p_key=C(R("az","AZ","09","__","--")^1)
+ local p_whatever=P(";")*((1-S("!{}/\\"))^1*P(";")/"")+P(";")*(P(";")/"")+P(1)
+ local variableexpander=Cs((p_variable*(p_key/resolveinstancevariable)+p_whatever)^1 )
+ local p_cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
+ local variablecleaner=Cs((p_cleaner+P(1))^0)
+ local p_variable=R("az","AZ","09","__","--")^1/resolveinstancevariable
+ local p_variable=(P("$")/"")*(p_variable+(P("{")/"")*p_variable*(P("}")/""))
+ local variableresolver=Cs((p_variable+P(1))^0)
+ expandedvariable=function(var)
+ return lpegmatch(variableexpander,var) or var
+ end
+ function resolvers.reset()
+ if trace_locating then
+ report_resolving("creating instance")
+ end
+ local environment={}
+ local variables={}
+ local expansions={}
+ local order={}
+ instance={
+ environment=environment,
+ variables=variables,
+ expansions=expansions,
+ order=order,
+ files={},
+ setups={},
+ found={},
+ foundintrees={},
+ hashes={},
+ hashed={},
+ pathlists=false,
+ specification={},
+ lists={},
+ data={},
+ fakepaths={},
+ remember=true,
+ diskcache=true,
+ renewcache=false,
+ renewtree=false,
+ loaderror=false,
+ savelists=true,
+ pattern=nil,
+ force_suffixes=true,
+ pathstack={},
+ }
+ setmetatableindex(variables,function(t,k)
+ local v
+ for i=1,#order do
+ v=order[i][k]
+ if v~=nil then
+ t[k]=v
+ return v
+ end
+ end
+ if v==nil then
+ v=""
+ end
+ t[k]=v
+ return v
+ end)
+ local repath=resolvers.repath
+ setmetatableindex(environment,function(t,k)
+ local v=osgetenv(k)
+ if v==nil then
+ v=variables[k]
+ end
if v~=nil then
- t[k]=v
- return v
+ v=checkedvariable(v) or ""
end
- end
- if v==nil then
- v=""
- end
- t[k]=v
- return v
- end)
- setmetatableindex(environment,function(t,k)
- local v=osgetenv(k)
- if v==nil then
- v=variables[k]
- end
- if v~=nil then
- v=checkedvariable(v) or ""
- end
- v=resolvers.repath(v)
- t[k]=v
- return v
- end)
- setmetatableindex(expansions,function(t,k)
- local v=environment[k]
- if type(v)=="string" then
- v=lpegmatch(variableresolver,v)
- v=lpegmatch(variablecleaner,v)
- end
- t[k]=v
- return v
- end)
+ v=repath(v)
+ t[k]=v
+ return v
+ end)
+ setmetatableindex(expansions,function(t,k)
+ local v=environment[k]
+ if type(v)=="string" then
+ v=lpegmatch(variableresolver,v)
+ v=lpegmatch(variablecleaner,v)
+ end
+ t[k]=v
+ return v
+ end)
+ end
end
function resolvers.initialized()
return instance~=nil
@@ -22019,31 +22472,33 @@ local function reset_caches()
instance.lists={}
instance.pathlists=false
end
-local slash=P("/")
-local pathexpressionpattern=Cs (
- Cc("^")*(
- Cc("%")*S(".-")+slash^2*P(-1)/"/.*"
+local makepathexpression do
+ local slash=P("/")
+ local pathexpressionpattern=Cs (
+ Cc("^")*(
+ Cc("%")*S(".-")+slash^2*P(-1)/"/.*"
+slash^2/"/"+(1-slash)*P(-1)*Cc("/")+P(1)
- )^1*Cc("$")
-)
-local cache={}
-local function makepathexpression(str)
- if str=="." then
- return "^%./$"
- else
- local c=cache[str]
- if not c then
- c=lpegmatch(pathexpressionpattern,str)
- cache[str]=c
+ )^1*Cc("$")
+ )
+ local cache={}
+ makepathexpression=function(str)
+ if str=="." then
+ return "^%./$"
+ else
+ local c=cache[str]
+ if not c then
+ c=lpegmatch(pathexpressionpattern,str)
+ cache[str]=c
+ end
+ return c
end
- return c
end
end
local function reportcriticalvariables(cnfspec)
if trace_locating then
- for i=1,#resolvers.criticalvars do
- local k=resolvers.criticalvars[i]
- local v=resolvers.getenv(k) or "unknown"
+ for i=1,#criticalvars do
+ local k=criticalvars[i]
+ local v=getenv(k) or "unknown"
report_resolving("variable %a set to %a",k,v)
end
report_resolving()
@@ -22065,7 +22520,7 @@ local function identify_configuration_files()
resolvers.luacnfstate="environment"
end
reportcriticalvariables(cnfspec)
- local cnfpaths=expandedpathfromlist(resolvers.splitpath(cnfspec))
+ local cnfpaths=expandedpathfromlist(splitpath(cnfspec))
local function locatecnf(luacnfname,kind)
for i=1,#cnfpaths do
local filepath=cnfpaths[i]
@@ -22098,6 +22553,8 @@ local function identify_configuration_files()
end
local function load_configuration_files()
local specification=instance.specification
+ local setups=instance.setups
+ local order=instance.order
if #specification>0 then
local luacnfname=resolvers.luacnfname
for i=1,#specification do
@@ -22107,7 +22564,6 @@ local function load_configuration_files()
local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
- local setups=instance.setups
local data=blob()
local parent=data and data.parent
if parent then
@@ -22118,7 +22574,7 @@ local function load_configuration_files()
local parentdata=blob()
if parentdata then
report_resolving("loading configuration file %a",filename)
- data=table.merged(parentdata,data)
+ data=mergedtable(parentdata,data)
end
end
end
@@ -22150,7 +22606,7 @@ local function load_configuration_files()
if trace_locating then
report_resolving("reloading configuration due to TEXMF redefinition")
end
- resolvers.setenv("TEXMFCNF",cnfspec)
+ setenv("TEXMFCNF",cnfspec)
instance.specification={}
identify_configuration_files()
load_configuration_files()
@@ -22168,7 +22624,7 @@ local function load_configuration_files()
elseif trace_locating then
report_resolving("skipping configuration file %a (no valid format)",filename)
end
- instance.order[#instance.order+1]=instance.setups[pathname]
+ order[#order+1]=setups[pathname]
if instance.loaderror then
break
end
@@ -22177,6 +22633,8 @@ local function load_configuration_files()
report_resolving("warning: no lua configuration files found")
end
end
+local expandedpathlist
+local unexpandedpathlist
function resolvers.configurationfiles()
return instance.specification or {}
end
@@ -22193,7 +22651,7 @@ local function load_file_databases()
end
end
local function locate_file_databases()
- local texmfpaths=resolvers.expandedpathlist("TEXMF")
+ local texmfpaths=expandedpathlist("TEXMF")
if #texmfpaths>0 then
for i=1,#texmfpaths do
local path=collapsepath(texmfpaths[i])
@@ -22202,7 +22660,7 @@ local function locate_file_databases()
if stripped~="" then
local runtime=stripped==path
path=cleanpath(path)
- local spec=resolvers.splitmethod(stripped)
+ local spec=splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme=="file") then
stripped="tree:///"..stripped
elseif spec.scheme=="cache" or spec.scheme=="file" then
@@ -22236,11 +22694,13 @@ local function generate_file_databases()
end
end
local function save_file_databases()
- for i=1,#instance.hashes do
- local hash=instance.hashes[i]
+ local hashes=instance.hashes
+ local files=instance.files
+ for i=1,#hashes do
+ local hash=hashes[i]
local cachename=hash.name
if hash.cache then
- local content=instance.files[cachename]
+ local content=files[cachename]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",cachename)
@@ -22252,8 +22712,9 @@ local function save_file_databases()
end
end
function resolvers.renew(hashname)
+ local files=instance.files
if hashname and hashname~="" then
- local expanded=resolvers.expansion(hashname) or ""
+ local expanded=expansion(hashname) or ""
if expanded~="" then
if trace_locating then
report_resolving("identifying tree %a from %a",expanded,hashname)
@@ -22270,7 +22731,7 @@ function resolvers.renew(hashname)
report_resolving("using path %a",realpath)
end
methodhandler('generators',hashname)
- local content=instance.files[hashname]
+ local content=files[hashname]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",hashname)
@@ -22297,38 +22758,46 @@ local function load_databases()
end
end
function resolvers.appendhash(type,name,cache)
- if not instance.hashed[name] then
+ local hashed=instance.hashed
+ local hashes=instance.hashes
+ if hashed[name] then
+ else
if trace_locating then
report_resolving("hash %a appended",name)
end
- insert(instance.hashes,{ type=type,name=name,cache=cache } )
- instance.hashed[name]=cache
+ insert(hashes,{ type=type,name=name,cache=cache } )
+ hashed[name]=cache
end
end
function resolvers.prependhash(type,name,cache)
- if not instance.hashed[name] then
+ local hashed=instance.hashed
+ local hashes=instance.hashes
+ if hashed[name] then
+ else
if trace_locating then
report_resolving("hash %a prepended",name)
end
- insert(instance.hashes,1,{ type=type,name=name,cache=cache } )
- instance.hashed[name]=cache
+ insert(hashes,1,{ type=type,name=name,cache=cache } )
+ hashed[name]=cache
end
end
function resolvers.extendtexmfvariable(specification)
- local t=resolvers.splitpath(getenv("TEXMF"))
- insert(t,1,specification)
- local newspec=concat(t,",")
- if instance.environment["TEXMF"] then
- instance.environment["TEXMF"]=newspec
- elseif instance.variables["TEXMF"] then
- instance.variables["TEXMF"]=newspec
+ local environment=instance.environment
+ local variables=instance.variables
+ local texmftrees=splitpath(getenv("TEXMF"))
+ insert(texmftrees,1,specification)
+ texmftrees=concat(texmftrees,",")
+ if environment["TEXMF"] then
+ environment["TEXMF"]=texmftrees
+ elseif variables["TEXMF"] then
+ variables["TEXMF"]=texmftrees
else
end
reset_hashes()
end
function resolvers.splitexpansions()
- local ie=instance.expansions
- for k,v in next,ie do
+ local expansions=instance.expansions
+ for k,v in next,expansions do
local t,tn,h,p={},0,{},splitconfigurationpath(v)
for kk=1,#p do
local vv=p[kk]
@@ -22338,33 +22807,37 @@ function resolvers.splitexpansions()
h[vv]=true
end
end
- if #t>1 then
- ie[k]=t
+ if tn>1 then
+ expansions[k]=t
else
- ie[k]=t[1]
+ expansions[k]=t[1]
end
end
end
function resolvers.datastate()
return caches.contentstate()
end
-function resolvers.variable(name)
+variable=function(name)
+ local variables=instance.variables
local name=name and lpegmatch(dollarstripper,name)
- local result=name and instance.variables[name]
+ local result=name and variables[name]
return result~=nil and result or ""
end
-function resolvers.expansion(name)
+expansion=function(name)
+ local expansions=instance.expansions
local name=name and lpegmatch(dollarstripper,name)
- local result=name and instance.expansions[name]
+ local result=name and expansions[name]
return result~=nil and result or ""
end
-function resolvers.unexpandedpathlist(str)
- local pth=resolvers.variable(str)
- local lst=resolvers.splitpath(pth)
+resolvers.variable=variable
+resolvers.expansion=expansion
+unexpandedpathlist=function(str)
+ local pth=variable(str)
+ local lst=splitpath(pth)
return expandedpathfromlist(lst)
end
function resolvers.unexpandedpath(str)
- return joinpath(resolvers.unexpandedpathlist(str))
+ return joinpath(unexpandedpathlist(str))
end
function resolvers.pushpath(name)
local pathstack=instance.pathstack
@@ -22394,8 +22867,8 @@ function resolvers.stackpath()
end
local done={}
function resolvers.resetextrapaths()
- local ep=instance.extra_paths
- if not ep then
+ local extra_paths=instance.extra_paths
+ if not extra_paths then
done={}
instance.extra_paths={}
elseif #ep>0 then
@@ -22416,8 +22889,8 @@ function resolvers.registerextrapath(paths,subpaths)
end
local paths=settings_to_array(paths)
local subpaths=settings_to_array(subpaths)
- local ep=instance.extra_paths or {}
- local oldn=#ep
+ local extra_paths=instance.extra_paths or {}
+ local oldn=#extra_paths
local newn=oldn
local nofpaths=#paths
local nofsubpaths=#subpaths
@@ -22430,7 +22903,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=p.."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=cleanpath(ps)
+ extra_paths[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -22440,7 +22913,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p=paths[i]
if not done[p] then
newn=newn+1
- ep[newn]=cleanpath(p)
+ extra_paths[newn]=cleanpath(p)
done[p]=true
end
end
@@ -22449,17 +22922,17 @@ function resolvers.registerextrapath(paths,subpaths)
for i=1,oldn do
for j=1,nofsubpaths do
local s=subpaths[j]
- local ps=ep[i].."/"..s
+ local ps=extra_paths[i].."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=cleanpath(ps)
+ extra_paths[newn]=cleanpath(ps)
done[ps]=true
end
end
end
end
if newn>0 then
- instance.extra_paths=ep
+ instance.extra_paths=extra_paths
end
if newn~=oldn then
reset_caches()
@@ -22467,17 +22940,19 @@ function resolvers.registerextrapath(paths,subpaths)
end
function resolvers.pushextrapath(path)
local paths=settings_to_array(path)
- if instance.extra_stack then
- insert(instance.extra_stack,1,paths)
+ local extra_stack=instance.extra_stack
+ if extra_stack then
+ insert(extra_stack,1,paths)
else
instance.extra_stack={ paths }
end
reset_caches()
end
function resolvers.popextrapath()
- if instance.extra_stack then
+ local extra_stack=instance.extra_stack
+ if extra_stack then
reset_caches()
- return remove(instance.extra_stack,1)
+ return remove(extra_stack,1)
end
end
local function made_list(instance,list,extra_too)
@@ -22506,33 +22981,21 @@ local function made_list(instance,list,extra_too)
end
end
if extra_too then
- local es=instance.extra_stack
- if es and #es>0 then
- for k=1,#es do
- add(es[k])
+ local extra_stack=instance.extra_stack
+ local extra_paths=instance.extra_paths
+ if extra_stack and #extra_stack>0 then
+ for k=1,#extra_stack do
+ add(extra_stack[k])
end
end
- local ep=instance.extra_paths
- if ep and #ep>0 then
- add(ep)
+ if extra_paths and #extra_paths>0 then
+ add(extra_paths)
end
end
add(list)
return new
end
-function resolvers.cleanpathlist(str)
- local t=resolvers.expandedpathlist(str)
- if t then
- for i=1,#t do
- t[i]=collapsepath(cleanpath(t[i]))
- end
- end
- return t
-end
-function resolvers.expandpath(str)
- return joinpath(resolvers.expandedpathlist(str))
-end
-function resolvers.expandedpathlist(str,extra_too)
+expandedpathlist=function(str,extra_too)
if not str then
return {}
elseif instance.savelists then
@@ -22540,40 +23003,56 @@ function resolvers.expandedpathlist(str,extra_too)
local lists=instance.lists
local lst=lists[str]
if not lst then
- local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
+ local l=made_list(instance,splitpath(expansion(str)),extra_too)
lst=expandedpathfromlist(l)
lists[str]=lst
end
return lst
else
- local lst=resolvers.splitpath(resolvers.expansion(str))
+ local lst=splitpath(expansion(str))
return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
-function resolvers.expandedpathlistfromvariable(str)
+resolvers.expandedpathlist=expandedpathlist
+resolvers.unexpandedpathlist=unexpandedpathlist
+function resolvers.cleanpathlist(str)
+ local t=expandedpathlist(str)
+ if t then
+ for i=1,#t do
+ t[i]=collapsepath(cleanpath(t[i]))
+ end
+ end
+ return t
+end
+function resolvers.expandpath(str)
+ return joinpath(expandedpathlist(str))
+end
+local function expandedpathlistfromvariable(str)
str=lpegmatch(dollarstripper,str)
local tmp=resolvers.variableofformatorsuffix(str)
- return resolvers.expandedpathlist(tmp~="" and tmp or str)
+ return expandedpathlist(tmp~="" and tmp or str)
end
function resolvers.expandpathfromvariable(str)
- return joinpath(resolvers.expandedpathlistfromvariable(str))
+ return joinpath(expandedpathlistfromvariable(str))
end
+resolvers.expandedpathlistfromvariable=expandedpathlistfromvariable
function resolvers.cleanedpathlist(v)
- local t=resolvers.expandedpathlist(v)
+ local t=expandedpathlist(v)
for i=1,#t do
- t[i]=resolvers.resolve(resolvers.cleanpath(t[i]))
+ t[i]=resolveprefix(cleanpath(t[i]))
end
return t
end
function resolvers.expandbraces(str)
- local pth=expandedpathfromlist(resolvers.splitpath(str))
+ local pth=expandedpathfromlist(splitpath(str))
return joinpath(pth)
end
function resolvers.registerfilehash(name,content,someerror)
+ local files=instance.files
if content then
- instance.files[name]=content
+ files[name]=content
else
- instance.files[name]={}
+ files[name]={}
if somerror==true then
instance.loaderror=someerror
end
@@ -22592,7 +23071,7 @@ function resolvers.renewcache()
end
local function isreadable(name)
local readable=isfile(name)
- if trace_detail then
+ if trace_details then
if readable then
report_resolving("file %a is readable",name)
else
@@ -22609,7 +23088,7 @@ local function collect_files(names)
local variant=hash.type
local search=filejoin(root,path,name)
local result=methodhandler('concatinators',variant,root,path,name)
- if trace_detail then
+ if trace_details then
report_resolving("match: variant %a, search %a, result %a",variant,search,result)
end
noffiles=noffiles+1
@@ -22618,7 +23097,7 @@ local function collect_files(names)
end
for k=1,#names do
local filename=names[k]
- if trace_detail then
+ if trace_details then
report_resolving("checking name %a",filename)
end
local basename=filebasename(filename)
@@ -22630,12 +23109,13 @@ local function collect_files(names)
pathname="/"..pathname.."$"
end
local hashes=instance.hashes
+ local files=instance.files
for h=1,#hashes do
local hash=hashes[h]
local hashname=hash.name
- local content=hashname and instance.files[hashname]
+ local content=hashname and files[hashname]
if content then
- if trace_detail then
+ if trace_details then
report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
local path,name=lookup(content,basename)
@@ -22703,7 +23183,6 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat=="" then
if filesuffix=="" or not suffixmap[filesuffix] then
local defaultsuffixes=resolvers.defaultsuffixes
- local formatofsuffix=resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname=filename..'.'..defaultsuffixes[i]
wantedfiles[#wantedfiles+1]=forcedname
@@ -22713,7 +23192,7 @@ local function find_analyze(filename,askedformat,allresults)
end
end
else
- filetype=resolvers.formatofsuffix(filename)
+ filetype=formatofsuffix(filename)
if trace_locating then
report_resolving("using suffix based filetype %a",filetype)
end
@@ -22736,7 +23215,7 @@ local function find_analyze(filename,askedformat,allresults)
end
local function find_direct(filename,allresults)
if not dangerous[askedformat] and isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("file %a found directly",filename)
end
return "direct",{ filename }
@@ -22761,12 +23240,12 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
report_resolving("checking qualified name %a",filename)
end
if isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("qualified file %a found",filename)
end
return "qualified",{ filename }
end
- if trace_detail then
+ if trace_details then
report_resolving("locating qualified file %a",filename)
end
local forcedname,suffix="",suffixonly(filename)
@@ -22774,11 +23253,11 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
local format_suffixes=askedformat=="" and resolvers.defaultsuffixes or suffixes[askedformat]
if format_suffixes then
for i=1,#format_suffixes do
- local s=format_suffixes[i]
- forcedname=filename.."."..s
+ local suffix=format_suffixes[i]
+ forcedname=filename.."."..suffix
if isreadable(forcedname) then
if trace_locating then
- report_resolving("no suffix, forcing format filetype %a",s)
+ report_resolving("no suffix, forcing format filetype %a",suffix)
end
return "qualified",{ forcedname }
end
@@ -22791,7 +23270,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
local savedformat=askedformat
local format=savedformat or ""
if format=="" then
- askedformat=resolvers.formatofsuffix(suffix)
+ askedformat=formatofsuffix(suffix)
end
if not format then
askedformat="othertextfiles"
@@ -22822,7 +23301,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
end
local function check_subpath(fname)
if isreadable(fname) then
- if trace_detail then
+ if trace_details then
report_resolving("found %a by deep scanning",fname)
end
return fname
@@ -22830,7 +23309,7 @@ local function check_subpath(fname)
end
local function makepathlist(list,filetype)
local typespec=resolvers.variableofformat(filetype)
- local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
+ local pathlist=expandedpathlist(typespec,filetype and usertypes[filetype])
local entry={}
if pathlist and #pathlist>0 then
for k=1,#pathlist do
@@ -22841,7 +23320,7 @@ local function makepathlist(list,filetype)
local expression=makepathexpression(pathname)
local barename=gsub(pathname,"/+$","")
barename=resolveprefix(barename)
- local scheme=url.hasscheme(barename)
+ local scheme=urlhasscheme(barename)
local schemename=gsub(barename,"%.%*$",'')
entry[k]={
path=path,
@@ -22878,7 +23357,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
dirlist[i]=filedirname(filelist[i][3]).."/"
end
end
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a in tree",filename)
end
for k=1,#pathlist do
@@ -22888,7 +23367,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local done=false
if filelist then
local expression=entry.expression
- if trace_detail then
+ if trace_details then
report_resolving("using pattern %a for path %a",expression,pathname)
end
for k=1,#filelist do
@@ -22899,16 +23378,16 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
result[#result+1]=resolveprefix(fl[3])
done=true
if allresults then
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, continue scanning",expression,f,d)
end
else
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, quit scanning",expression,f,d)
end
break
end
- elseif trace_detail then
+ elseif trace_details then
report_resolving("no match to %a in hash for file %a and path %a",expression,f,d)
end
end
@@ -22923,7 +23402,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
if not done and not entry.prescanned then
- if trace_detail then
+ if trace_details then
report_resolving("quick root scan for %a",pname)
end
for k=1,#wantedfiles do
@@ -22938,7 +23417,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if not done and entry.recursive then
- if trace_detail then
+ if trace_details then
report_resolving("scanning filesystem for %a",pname)
end
local files=resolvers.simplescanfiles(pname,false,true)
@@ -23004,7 +23483,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
local function find_onpath(filename,filetype,wantedfiles,allresults)
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a, filetype %a, wanted files %a",filename,filetype,concat(wantedfiles," | "))
end
local result={}
@@ -23046,7 +23525,9 @@ collect_instance_files=function(filename,askedformat,allresults)
{ find_onpath (filename,filetype,wantedfiles,true) },
{ find_otherwise(filename,filetype,wantedfiles,true) },
}
- local result,status,done={},{},{}
+ local result={}
+ local status={}
+ local done={}
for k,r in next,results do
local method,list=r[1],r[2]
if method and list then
@@ -23060,7 +23541,7 @@ collect_instance_files=function(filename,askedformat,allresults)
end
end
end
- if trace_detail then
+ if trace_details then
report_resolving("lookup status: %s",table.serialize(status,filename))
end
return result,status
@@ -23117,6 +23598,9 @@ local function findfiles(filename,filetype,allresults)
if not filename or filename=="" then
return {}
end
+ if allresults==nil then
+ allresults=true
+ end
local result,status=collect_instance_files(filename,filetype or "",allresults)
if not result or #result==0 then
local lowered=lower(filename)
@@ -23126,27 +23610,25 @@ local function findfiles(filename,filetype,allresults)
end
return result or {},status
end
-function resolvers.findfiles(filename,filetype)
- if not filename or filename=="" then
- return ""
- else
- return findfiles(filename,filetype,true)
- end
-end
-function resolvers.findfile(filename,filetype)
+local function findfile(filename,filetype)
if not filename or filename=="" then
return ""
else
return findfiles(filename,filetype,false)[1] or ""
end
end
+resolvers.findfiles=findfiles
+resolvers.findfile=findfile
+resolvers.find_file=findfile
+resolvers.find_files=findfiles
function resolvers.findpath(filename,filetype)
return filedirname(findfiles(filename,filetype,false)[1] or "")
end
local function findgivenfiles(filename,allresults)
+ local hashes=instance.hashes
+ local files=instance.files
local base=filebasename(filename)
local result={}
- local hashes=instance.hashes
local function okay(hash,path,name)
local found=methodhandler('concatinators',hash.type,hash.name,path,name)
if found and found~="" then
@@ -23156,7 +23638,7 @@ local function findgivenfiles(filename,allresults)
end
for k=1,#hashes do
local hash=hashes[k]
- local content=instance.files[hash.name]
+ local content=files[hash.name]
if content then
local path,name=lookup(content,base)
if not path then
@@ -23188,14 +23670,14 @@ function resolvers.wildcardpattern(pattern)
return lpegmatch(makewildcard,pattern) or pattern
end
local function findwildcardfiles(filename,allresults,result)
+ local files=instance.files
+ local hashes=instance.hashes
local result=result or {}
local base=filebasename(filename)
local dirn=filedirname(filename)
local path=lower(lpegmatch(makewildcard,dirn) or dirn)
local name=lower(lpegmatch(makewildcard,base) or base)
- local files=instance.files
if find(name,"*",1,true) then
- local hashes=instance.hashes
local function okay(found,path,base,hashname,hashtype)
if find(found,path) then
local full=methodhandler('concatinators',hashtype,hashname,found,base)
@@ -23235,7 +23717,6 @@ local function findwildcardfiles(filename,allresults,result)
end
end
end
- local hashes=instance.hashes
for k=1,#hashes do
local hash=hashes[k]
local hashname=hash.name
@@ -23265,13 +23746,21 @@ end
function resolvers.findwildcardfile(filename)
return findwildcardfiles(filename,false)[1] or ""
end
-function resolvers.automount()
-end
-function resolvers.starttiming()
- statistics.starttiming(instance)
+do
+ local starttiming=statistics.starttiming
+ local stoptiming=statistics.stoptiming
+ local elapsedtime=statistics.elapsedtime
+ function resolvers.starttiming()
+ starttiming(instance)
+ end
+ function resolvers.stoptiming()
+ stoptiming(instance)
+ end
+ function resolvers.loadtime()
+ return elapsedtime(instance)
+ end
end
-function resolvers.stoptiming()
- statistics.stoptiming(instance)
+function resolvers.automount()
end
function resolvers.load(option)
resolvers.starttiming()
@@ -23285,9 +23774,6 @@ function resolvers.load(option)
local files=instance.files
return files and next(files) and true
end
-function resolvers.loadtime()
- return statistics.elapsedtime(instance)
-end
local function report(str)
if trace_locating then
report_resolving(str)
@@ -23317,7 +23803,7 @@ function resolvers.dowithfilesandreport(command,files,...)
end
end
function resolvers.showpath(str)
- return joinpath(resolvers.expandedpathlist(resolvers.formatofvariable(str)))
+ return joinpath(expandedpathlist(resolvers.formatofvariable(str)))
end
function resolvers.registerfile(files,name,path)
if files[name] then
@@ -23331,7 +23817,7 @@ function resolvers.registerfile(files,name,path)
end
end
function resolvers.dowithpath(name,func)
- local pathlist=resolvers.expandedpathlist(name)
+ local pathlist=expandedpathlist(name)
for i=1,#pathlist do
func("^"..cleanpath(pathlist[i]))
end
@@ -23341,11 +23827,11 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
local engine=environment.ownmain or "luatex"
- local barename=removesuffix(name)
+ local barename=removesuffix(file.basename(name))
local fullname=addsuffix(barename,"fmt")
local fmtname=caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname=="" then
- fmtname=resolvers.findfile(fullname)
+ fmtname=findfile(fullname)
fmtname=cleanpath(fmtname)
end
if fmtname~="" then
@@ -23354,17 +23840,17 @@ function resolvers.locateformat(name)
local lucname=addsuffix(barename,luasuffixes.luc)
local luiname=addsuffix(barename,luasuffixes.lui)
if isfile(luiname) then
- return barename,luiname
+ return fmtname,luiname
elseif isfile(lucname) then
- return barename,lucname
+ return fmtname,lucname
elseif isfile(luaname) then
- return barename,luaname
+ return fmtname,luaname
end
end
return nil,nil
end
function resolvers.booleanvariable(str,default)
- local b=resolvers.expansion(str)
+ local b=expansion(str)
if b=="" then
return default
else
@@ -23374,6 +23860,7 @@ function resolvers.booleanvariable(str,default)
end
function resolvers.dowithfilesintree(pattern,handle,before,after)
local hashes=instance.hashes
+ local files=instance.files
for i=1,#hashes do
local hash=hashes[i]
local blobtype=hash.type
@@ -23385,7 +23872,7 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
if before then
before(blobtype,blobpath,pattern)
end
- for path,name in filtered(instance.files[blobpath],pattern) do
+ for path,name in filtered(files[blobpath],pattern) do
if type(path)=="string" then
checked=checked+1
if handle(blobtype,blobpath,path,name) then
@@ -23406,10 +23893,6 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
end
end
end
-local obsolete=resolvers.obsolete or {}
-resolvers.obsolete=obsolete
-resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile
-resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles
function resolvers.knownvariables(pattern)
if instance then
local environment=instance.environment
@@ -23443,7 +23926,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 4854, stripped down to: 2889
+-- original size: 5088, stripped down to: 3144
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -23452,6 +23935,7 @@ if not modules then modules={} end modules ['data-pre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local insert,remove=table.insert,table.remove
local resolvers=resolvers
local prefixes=resolvers.prefixes
local cleanpath=resolvers.cleanpath
@@ -23529,8 +24013,9 @@ prefixes.kpse=prefixes.locate
prefixes.full=prefixes.locate
prefixes.file=prefixes.filename
prefixes.path=prefixes.pathname
+local inputstack={}
+local stackpath=resolvers.stackpath
local function toppath()
- local inputstack=resolvers.inputstack
if not inputstack then
return "."
end
@@ -23542,15 +24027,23 @@ local function toppath()
end
end
local function jobpath()
- local path=resolvers.stackpath()
+ local path=stackpath()
if not path or path=="" then
return "."
else
return path
end
end
+local function pushinputname(name)
+ insert(inputstack,name)
+end
+local function popinputname(name)
+ return remove(inputstack)
+end
resolvers.toppath=toppath
resolvers.jobpath=jobpath
+resolvers.pushinputname=pushinputname
+resolvers.popinputname=popinputname
prefixes.toppath=function(str) return cleanpath(joinpath(toppath(),str)) end
prefixes.jobpath=function(str) return cleanpath(joinpath(jobpath(),str)) end
resolvers.setdynamic("toppath")
@@ -23593,7 +24086,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-out"] = package.loaded["data-out"] or true
--- original size: 530, stripped down to: 470
+-- original size: 551, stripped down to: 470
if not modules then modules={} end modules ['data-out']={
version=1.001,
@@ -23616,7 +24109,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-fil"] = package.loaded["data-fil"] or true
--- original size: 3863, stripped down to: 3170
+-- original size: 4365, stripped down to: 3588
if not modules then modules={} end modules ['data-fil']={
version=1.001,
@@ -23625,39 +24118,46 @@ if not modules then modules={} end modules ['data-fil']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local ioopen=io.open
+local isdir=lfs.isdir
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_files=logs.reporter("resolvers","files")
local resolvers=resolvers
local resolveprefix=resolvers.resolve
-local finders,openers,loaders,savers=resolvers.finders,resolvers.openers,resolvers.loaders,resolvers.savers
-local locators,hashers,generators,concatinators=resolvers.locators,resolvers.hashers,resolvers.generators,resolvers.concatinators
+local findfile=resolvers.findfile
+local scanfiles=resolvers.scanfiles
+local registerfilehash=resolvers.registerfilehash
+local appendhash=resolvers.appendhash
+local loadcachecontent=caches.loadcontent
local checkgarbage=utilities.garbagecollector and utilities.garbagecollector.check
-function locators.file(specification)
+function resolvers.locators.file(specification)
local filename=specification.filename
local realname=resolveprefix(filename)
- if realname and realname~='' and lfs.isdir(realname) then
+ if realname and realname~='' and isdir(realname) then
if trace_locating then
report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',filename,true)
+ appendhash('file',filename,true)
elseif trace_locating then
report_files("file locator %a not found",filename)
end
end
-function hashers.file(specification)
+function resolvers.hashers.file(specification)
local pathname=specification.filename
- local content=caches.loadcontent(pathname,'files')
- resolvers.registerfilehash(pathname,content,content==nil)
+ local content=loadcachecontent(pathname,'files')
+ registerfilehash(pathname,content,content==nil)
end
-function generators.file(specification)
+function resolvers.generators.file(specification)
local pathname=specification.filename
- local content=resolvers.scanfiles(pathname,false,true)
- resolvers.registerfilehash(pathname,content,true)
+ local content=scanfiles(pathname,false,true)
+ registerfilehash(pathname,content,true)
end
-concatinators.file=file.join
+resolvers.concatinators.file=file.join
+local finders=resolvers.finders
+local notfound=finders.notfound
function finders.file(specification,filetype)
local filename=specification.filename
- local foundname=resolvers.findfile(filename,filetype)
+ local foundname=findfile(filename,filetype)
if foundname and foundname~="" then
if trace_locating then
report_files("file finder: %a found",filename)
@@ -23667,37 +24167,55 @@ function finders.file(specification,filetype)
if trace_locating then
report_files("file finder: %a not found",filename)
end
- return finders.notfound()
+ return notfound()
end
end
-function openers.helpers.textopener(tag,filename,f)
+local openers=resolvers.openers
+local notfound=openers.notfound
+local overloaded=false
+local function textopener(tag,filename,f)
return {
- reader=function() return f:read () end,
- close=function() logs.show_close(filename) return f:close() end,
+ reader=function() return f:read () end,
+ close=function() return f:close() end,
}
end
+function openers.helpers.textopener(...)
+ return textopener(...)
+end
+function openers.helpers.settextopener(opener)
+ if overloaded then
+ report_files("file opener: %s overloaded","already")
+ else
+ if trace_locating then
+ report_files("file opener: %s overloaded","once")
+ end
+ overloaded=true
+ textopener=opener
+ end
+end
function openers.file(specification,filetype)
local filename=specification.filename
if filename and filename~="" then
- local f=io.open(filename,"r")
+ local f=ioopen(filename,"r")
if f then
if trace_locating then
report_files("file opener: %a opened",filename)
end
- return openers.helpers.textopener("file",filename,f)
+ return textopener("file",filename,f)
end
end
if trace_locating then
report_files("file opener: %a not found",filename)
end
- return openers.notfound()
+ return notfound()
end
+local loaders=resolvers.loaders
+local notfound=loaders.notfound
function loaders.file(specification,filetype)
local filename=specification.filename
if filename and filename~="" then
- local f=io.open(filename,"rb")
+ local f=ioopen(filename,"rb")
if f then
- logs.show_load(filename)
if trace_locating then
report_files("file loader: %a loaded",filename)
end
@@ -23714,7 +24232,7 @@ function loaders.file(specification,filetype)
if trace_locating then
report_files("file loader: %a not found",filename)
end
- return loaders.notfound()
+ return notfound()
end
@@ -23724,7 +24242,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-con"] = package.loaded["data-con"] or true
--- original size: 5029, stripped down to: 3432
+-- original size: 5388, stripped down to: 3685
if not modules then modules={} end modules ['data-con']={
version=1.100,
@@ -23733,6 +24251,7 @@ if not modules then modules={} end modules ['data-con']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local setmetatable=setmetatable
local format,lower,gsub=string.format,string.lower,string.gsub
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local trace_containers=false trackers.register("resolvers.containers",function(v) trace_containers=v end)
@@ -23740,16 +24259,21 @@ local trace_storage=false trackers.register("resolvers.storage",function(v) tra
containers=containers or {}
local containers=containers
containers.usecache=true
+local getwritablepath=caches.getwritablepath
+local getreadablepaths=caches.getreadablepaths
+local cacheiswritable=caches.is_writable
+local loaddatafromcache=caches.loaddata
+local savedataincache=caches.savedata
local report_containers=logs.reporter("resolvers","containers")
local allocated={}
local mt={
__index=function(t,k)
if k=="writable" then
- local writable=caches.getwritablepath(t.category,t.subcategory) or { "." }
+ local writable=getwritablepath(t.category,t.subcategory) or { "." }
t.writable=writable
return writable
elseif k=="readables" then
- local readables=caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ local readables=getreadablepaths(t.category,t.subcategory) or { "." }
t.readables=readables
return readables
end
@@ -23780,7 +24304,7 @@ function containers.define(category,subcategory,version,enabled)
end
end
function containers.is_usable(container,name)
- return container.enabled and caches and caches.is_writable(container.writable,name)
+ return container.enabled and caches and cacheiswritable(container.writable,name)
end
function containers.is_valid(container,name)
if name and name~="" then
@@ -23794,7 +24318,7 @@ function containers.read(container,name)
local storage=container.storage
local stored=storage[name]
if not stored and container.enabled and caches and containers.usecache then
- stored=caches.loaddata(container.readables,name,container.writable)
+ stored=loaddatafromcache(container.readables,name,container.writable)
if stored and stored.cache_version==container.version then
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","load",container.subcategory,name)
@@ -23810,17 +24334,20 @@ function containers.read(container,name)
end
return stored
end
-function containers.write(container,name,data)
+function containers.write(container,name,data,fast)
if data then
data.cache_version=container.version
if container.enabled and caches then
- local unique,shared=data.unique,data.shared
- data.unique,data.shared=nil,nil
- caches.savedata(container.writable,name,data)
+ local unique=data.unique
+ local shared=data.shared
+ data.unique=nil
+ data.shared=nil
+ savedataincache(container.writable,name,data,fast)
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","save",container.subcategory,name)
end
- data.unique,data.shared=unique,shared
+ data.unique=unique
+ data.shared=shared
end
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","store",container.subcategory,name)
@@ -23843,7 +24370,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-use"] = package.loaded["data-use"] or true
--- original size: 4434, stripped down to: 3180
+-- original size: 5790, stripped down to: 2910
if not modules then modules={} end modules ['data-use']={
version=1.001,
@@ -23852,40 +24379,11 @@ if not modules then modules={} end modules ['data-use']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local format,lower,gsub,find=string.format,string.lower,string.gsub,string.find
+local format=string.format
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_mounts=logs.reporter("resolvers","mounts")
local resolvers=resolvers
-resolvers.automounted=resolvers.automounted or {}
-function resolvers.automount(usecache)
- local mountpaths=resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
- if (not mountpaths or #mountpaths==0) and usecache then
- mountpaths=caches.getreadablepaths("mount")
- end
- if mountpaths and #mountpaths>0 then
- resolvers.starttiming()
- for k=1,#mountpaths do
- local root=mountpaths[k]
- local f=io.open(root.."/url.tmi")
- if f then
- for line in f:lines() do
- if line then
- if find(line,"^[%%#%-]") then
- elseif find(line,"^zip://") then
- if trace_locating then
- report_mounts("mounting %a",line)
- end
- table.insert(resolvers.automounted,line)
- resolvers.usezipfile(line)
- end
- end
- end
- f:close()
- end
- end
- resolvers.stoptiming()
- end
-end
+local findfile=resolvers.findfile
statistics.register("used config file",function() return caches.configfiles() end)
statistics.register("used cache path",function() return caches.usedpaths() end)
function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner)
@@ -23895,9 +24393,11 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner)
local luvdata={
enginebanner=enginebanner,
formatbanner=formatbanner,
- sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"),
+ sourcehash=md5.hex(io.loaddata(findfile(sourcefile)) or "unknown"),
sourcefile=sourcefile,
luaversion=LUAVERSION,
+ formatid=LUATEXFORMATID,
+ functionality=LUATEXFUNCTIONALITY,
}
io.savedata(luvname,table.serialize(luvdata,true))
lua.registerfinalizer(function()
@@ -23917,7 +24417,7 @@ function statistics.checkfmtstatus(texname)
if lfs.isfile(luvname) then
local luv=dofile(luvname)
if luv and luv.sourcefile then
- local sourcehash=md5.hex(io.loaddata(resolvers.findfile(luv.sourcefile)) or "unknown")
+ local sourcehash=md5.hex(io.loaddata(findfile(luv.sourcefile)) or "unknown")
local luvbanner=luv.enginebanner or "?"
if luvbanner~=enginebanner then
return format("engine mismatch (luv: %s <> bin: %s)",luvbanner,enginebanner)
@@ -23927,8 +24427,19 @@ function statistics.checkfmtstatus(texname)
return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash)
end
local luvluaversion=luv.luaversion or 0
- if luvluaversion~=LUAVERSION then
- return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION)
+ local engluaversion=LUAVERSION or 0
+ if luvluaversion~=engluaversion then
+ return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,engluaversion)
+ end
+ local luvfunctionality=luv.functionality or 0
+ local engfunctionality=status.development_id or 0
+ if luvfunctionality~=engfunctionality then
+ return format("functionality mismatch (luv: %s <> bin: %s)",luvfunctionality,engfunctionality)
+ end
+ local luvformatid=luv.formatid or 0
+ local engformatid=status.format_id or 0
+ if luvformatid~=engformatid then
+ return format("formatid mismatch (luv: %s <> bin: %s)",luvformatid,engformatid)
end
else
return "invalid status file"
@@ -23947,7 +24458,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 10263, stripped down to: 7556
+-- original size: 10725, stripped down to: 7949
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -23960,6 +24471,14 @@ local format,find,match=string.format,string.find,string.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_zip=logs.reporter("resolvers","zip")
local resolvers=resolvers
+local findfile=resolvers.findfile
+local registerfile=resolvers.registerfile
+local splitmethod=resolvers.splitmethod
+local prependhash=resolvers.prependhash
+local starttiming=resolvers.starttiming
+local extendtexmf=resolvers.extendtexmfvariable
+local stoptiming=resolvers.stoptiming
+local urlquery=url.query
zip=zip or {}
local zip=zip
local archives=zip.archives or {}
@@ -23974,8 +24493,9 @@ if zipfiles then
closezip=zipfiles.close
validfile=zipfiles.found
wholefile=zipfiles.unzip
+ local listzip=zipfiles.list
traversezip=function(zfile)
- return ipairs(zipfiles.list(zfile))
+ return ipairs(listzip(zfile))
end
local streams=utilities.streams
local openstream=streams.open
@@ -24032,28 +24552,30 @@ local function validzip(str)
return str
end
end
-function zip.openarchive(name)
+local function openarchive(name)
if not name or name=="" then
return nil
else
local arch=archives[name]
if not arch then
- local full=resolvers.findfile(name) or ""
+ local full=findfile(name) or ""
arch=full~="" and openzip(full) or false
archives[name]=arch
end
return arch
end
end
-function zip.closearchive(name)
+local function closearchive(name)
if not name or (name=="" and archives[name]) then
closezip(archives[name])
archives[name]=nil
end
end
+zip.openarchive=openarchive
+zip.closearchive=closearchive
function resolvers.locators.zip(specification)
local archive=specification.filename
- local zipfile=archive and archive~="" and zip.openarchive(archive)
+ local zipfile=archive and archive~="" and openarchive(archive)
if trace_locating then
if zipfile then
report_zip("locator: archive %a found",archive)
@@ -24062,13 +24584,6 @@ function resolvers.locators.zip(specification)
end
end
end
-function resolvers.hashers.zip(specification)
- local archive=specification.filename
- if trace_locating then
- report_zip("loading file %a",archive)
- end
- resolvers.usezipfile(specification.original)
-end
function resolvers.concatinators.zip(zipfile,path,name)
if not path or path=="" then
return format('%s?name=%s',zipfile,name)
@@ -24076,14 +24591,16 @@ function resolvers.concatinators.zip(zipfile,path,name)
return format('%s?name=%s/%s',zipfile,path,name)
end
end
-function resolvers.finders.zip(specification)
+local finders=resolvers.finders
+local notfound=finders.notfound
+function finders.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("finder: archive %a found",archive)
@@ -24104,16 +24621,19 @@ function resolvers.finders.zip(specification)
if trace_locating then
report_zip("finder: %a not found",original)
end
- return resolvers.finders.notfound()
+ return notfound()
end
-function resolvers.openers.zip(specification)
+local openers=resolvers.openers
+local notfound=openers.notfound
+local textopener=openers.helpers.textopener
+function openers.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("opener; archive %a opened",archive)
@@ -24123,7 +24643,7 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: file %a found",queryname)
end
- return resolvers.openers.helpers.textopener('zip',original,handle)
+ return textopener('zip',original,handle)
elseif trace_locating then
report_zip("opener: file %a not found",queryname)
end
@@ -24135,23 +24655,24 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: %a not found",original)
end
- return resolvers.openers.notfound()
+ return notfound()
end
-function resolvers.loaders.zip(specification)
+local loaders=resolvers.loaders
+local notfound=loaders.notfound
+function loaders.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("loader: archive %a opened",archive)
end
local data=wholefile(zfile,queryname)
if data then
- logs.show_load(original)
if trace_locating then
report_zip("loader; file %a loaded",original)
end
@@ -24167,47 +24688,24 @@ function resolvers.loaders.zip(specification)
if trace_locating then
report_zip("loader: %a not found",original)
end
- return resolvers.openers.notfound()
-end
-function resolvers.usezipfile(archive)
- local specification=resolvers.splitmethod(archive)
- local archive=specification.filename
- if archive and not registeredfiles[archive] then
- local z=zip.openarchive(archive)
- if z then
- local tree=url.query(specification.query).tree or ""
- if trace_locating then
- report_zip("registering: archive %a",archive)
- end
- resolvers.starttiming()
- resolvers.prependhash('zip',archive)
- resolvers.extendtexmfvariable(archive)
- registeredfiles[archive]=z
- resolvers.registerfilehash(archive,resolvers.registerzipfile(z,tree))
- resolvers.stoptiming()
- elseif trace_locating then
- report_zip("registering: unknown archive %a",archive)
- end
- elseif trace_locating then
- report_zip("registering: archive %a not found",archive)
- end
+ return notfound()
end
-function resolvers.registerzipfile(z,tree)
+local function registerzipfile(z,tree)
local names={}
local files={}
local remap={}
local n=0
local filter=tree=="" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
- local register=resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
+ starttiming()
for i in traversezip(z) do
local filename=i.filename
local path,name=match(filename,filter)
if not path then
n=n+1
- register(names,filename,"")
+ registerfile(names,filename,"")
local usedname=lower(filename)
files[usedname]=""
if usedname~=filename then
@@ -24224,12 +24722,43 @@ function resolvers.registerzipfile(z,tree)
else
end
end
+ stoptiming()
report_zip("registering: %s files registered",n)
return {
files=files,
remap=remap,
}
end
+local function usezipfile(archive)
+ local specification=splitmethod(archive)
+ local archive=specification.filename
+ if archive and not registeredfiles[archive] then
+ local z=openarchive(archive)
+ if z then
+ local tree=urlquery(specification.query).tree or ""
+ if trace_locating then
+ report_zip("registering: archive %a",archive)
+ end
+ prependhash('zip',archive)
+ extendtexmf(archive)
+ registeredfiles[archive]=z
+ registerfilehash(archive,registerzipfile(z,tree))
+ elseif trace_locating then
+ report_zip("registering: unknown archive %a",archive)
+ end
+ elseif trace_locating then
+ report_zip("registering: archive %a not found",archive)
+ end
+end
+resolvers.usezipfile=usezipfile
+resolvers.registerzipfile=registerzipfile
+function resolvers.hashers.zip(specification)
+ local archive=specification.filename
+ if trace_locating then
+ report_zip("loading file %a",archive)
+ end
+ usezipfile(specification.original)
+end
end -- of closure
@@ -24238,7 +24767,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tre"] = package.loaded["data-tre"] or true
--- original size: 8478, stripped down to: 5223
+-- original size: 10802, stripped down to: 6619
if not modules then modules={} end modules ['data-tre']={
version=1.001,
@@ -24247,180 +24776,255 @@ if not modules then modules={} end modules ['data-tre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local type=type
local find,gsub,lower=string.find,string.gsub,string.lower
-local basename,dirname,joinname=file.basename,file.dirname,file .join
+local basename,dirname,joinname=file.basename,file.dirname,file.join
local globdir,isdir,isfile=dir.glob,lfs.isdir,lfs.isfile
local P,lpegmatch=lpeg.P,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_trees=logs.reporter("resolvers","trees")
local resolvers=resolvers
-local resolveprefix=resolvers.resolve
-local notfound=resolvers.finders.notfound
-local lookup=resolvers.get_from_content
-local collectors={}
-local found={}
-function resolvers.finders.tree(specification)
- local spec=specification.filename
- local okay=found[spec]
- if okay==nil then
- if spec~="" then
- local path=dirname(spec)
- local name=basename(spec)
- if path=="" then
- path="."
- end
- local names=collectors[path]
- if not names then
- local pattern=find(path,"/%*+$") and path or (path.."/*")
- names=globdir(pattern)
- collectors[path]=names
- end
- local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
- for i=1,#names do
- local fullname=names[i]
- if find(fullname,pattern) then
- found[spec]=fullname
- return fullname
- end
- end
- local pattern=lower(pattern)
- for i=1,#names do
- local fullname=lower(names[i])
- if find(fullname,pattern) then
- if isfile(fullname) then
+local finders=resolvers.finders
+local openers=resolvers.openers
+local loaders=resolvers.loaders
+local locators=resolvers.locators
+local hashers=resolvers.hashers
+local generators=resolvers.generators
+do
+ local collectors={}
+ local found={}
+ local notfound=finders.notfound
+ function finders.tree(specification)
+ local spec=specification.filename
+ local okay=found[spec]
+ if okay==nil then
+ if spec~="" then
+ local path=dirname(spec)
+ local name=basename(spec)
+ if path=="" then
+ path="."
+ end
+ local names=collectors[path]
+ if not names then
+ local pattern=find(path,"/%*+$") and path or (path.."/*")
+ names=globdir(pattern)
+ collectors[path]=names
+ end
+ local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
+ for i=1,#names do
+ local fullname=names[i]
+ if find(fullname,pattern) then
found[spec]=fullname
return fullname
- else
- break
+ end
+ end
+ local pattern=lower(pattern)
+ for i=1,#names do
+ local fullname=lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec]=fullname
+ return fullname
+ else
+ break
+ end
end
end
end
+ okay=notfound()
+ found[spec]=okay
end
- okay=notfound()
- found[spec]=okay
+ return okay
end
- return okay
end
-function resolvers.locators.tree(specification)
- local name=specification.filename
- local realname=resolveprefix(name)
- if realname and realname~='' and isdir(realname) then
- if trace_locating then
- report_trees("locator %a found",realname)
+do
+ local resolveprefix=resolvers.resolve
+ local appendhash=resolvers.appendhash
+ local function dolocate(specification)
+ local name=specification.filename
+ local realname=resolveprefix(name)
+ if realname and realname~='' and isdir(realname) then
+ if trace_locating then
+ report_trees("locator %a found",realname)
+ end
+ appendhash('tree',name,false)
+ elseif trace_locating then
+ report_trees("locator %a not found",name)
end
- resolvers.appendhash('tree',name,false)
- elseif trace_locating then
- report_trees("locator %a not found",name)
end
+ locators.tree=dolocate
+ locators.dirlist=dolocate
+ locators.dirfile=dolocate
end
-function resolvers.hashers.tree(specification)
- local name=specification.filename
- if trace_locating then
- report_trees("analyzing %a",name)
- end
- resolvers.methodhandler("hashers",name)
- resolvers.generators.file(specification)
-end
-local collectors={}
-local splitter=lpeg.splitat("/**/")
-local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
-table.setmetatableindex(collectors,function(t,k)
- local rootname=lpegmatch(stripper,k)
- local dataname=joinname(rootname,"dirlist")
- local content=caches.loadcontent(dataname,"files",dataname)
- if not content then
- content=resolvers.scanfiles(rootname,nil,nil,false,true)
- caches.savecontent(dataname,"files",content,dataname)
- end
- t[k]=content
- return content
-end)
-local function checked(root,p,n)
- if p then
- if type(p)=="table" then
- for i=1,#p do
- local fullname=joinname(root,p[i],n)
+do
+ local filegenerator=generators.file
+ generators.dirlist=filegenerator
+ generators.dirfile=filegenerator
+end
+do
+ local filegenerator=generators.file
+ local methodhandler=resolvers.methodhandler
+ local function dohash(specification)
+ local name=specification.filename
+ if trace_locating then
+ report_trees("analyzing %a",name)
+ end
+ methodhandler("hashers",name)
+ filegenerator(specification)
+ end
+ hashers.tree=dohash
+ hashers.dirlist=dohash
+ hashers.dirfile=dohash
+end
+local resolve do
+ local collectors={}
+ local splitter=lpeg.splitat("/**/")
+ local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
+ local loadcontent=caches.loadcontent
+ local savecontent=caches.savecontent
+ local notfound=finders.notfound
+ local scanfiles=resolvers.scanfiles
+ local lookup=resolvers.get_from_content
+ table.setmetatableindex(collectors,function(t,k)
+ local rootname=lpegmatch(stripper,k)
+ local dataname=joinname(rootname,"dirlist")
+ local content=loadcontent(dataname,"files",dataname)
+ if not content then
+ content=scanfiles(rootname,nil,nil,false,true)
+ savecontent(dataname,"files",content,dataname)
+ end
+ t[k]=content
+ return content
+ end)
+ local function checked(root,p,n)
+ if p then
+ if type(p)=="table" then
+ for i=1,#p do
+ local fullname=joinname(root,p[i],n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ else
+ local fullname=joinname(root,p,n)
if isfile(fullname) then
return fullname
end
end
- else
- local fullname=joinname(root,p,n)
- if isfile(fullname) then
- return fullname
- end
end
+ return notfound()
end
- return notfound()
-end
-local function resolve(specification)
- local filename=specification.filename
- if filename~="" then
- local root,rest=lpegmatch(splitter,filename)
- if root and rest then
- local path,name=dirname(rest),basename(rest)
- if name~=rest then
- local content=collectors[root]
- local p,n=lookup(content,name)
- if not p then
- return notfound()
- end
- local pattern=".*/"..path.."$"
- local istable=type(p)=="table"
- if istable then
- for i=1,#p do
- local pi=p[i]
- if pi==path or find(pi,pattern) then
- local fullname=joinname(root,pi,n)
- if isfile(fullname) then
- return fullname
+ resolve=function(specification)
+ local filename=specification.filename
+ if filename~="" then
+ local root,rest=lpegmatch(splitter,filename)
+ if root and rest then
+ local path,name=dirname(rest),basename(rest)
+ if name~=rest then
+ local content=collectors[root]
+ local p,n=lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern=".*/"..path.."$"
+ local istable=type(p)=="table"
+ if istable then
+ for i=1,#p do
+ local pi=p[i]
+ if pi==path or find(pi,pattern) then
+ local fullname=joinname(root,pi,n)
+ if isfile(fullname) then
+ return fullname
+ end
end
end
+ elseif p==path or find(p,pattern) then
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
end
- elseif p==path or find(p,pattern) then
- local fullname=joinname(root,p,n)
- if isfile(fullname) then
- return fullname
+ local queries=specification.queries
+ if queries and queries.option=="fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
end
end
- local queries=specification.queries
- if queries and queries.option=="fileonly" then
- return checked(root,p,n)
- else
- return notfound()
- end
+ end
+ local path=dirname(filename)
+ local name=basename(filename)
+ local root=lpegmatch(stripper,path)
+ local content=collectors[path]
+ local p,n=lookup(content,name)
+ if p then
+ return checked(root,p,n)
end
end
- local path,name=dirname(filename),basename(filename)
- local root=lpegmatch(stripper,path)
- local content=collectors[path]
- local p,n=lookup(content,name)
- if p then
- return checked(root,p,n)
+ return notfound()
+ end
+ finders.dirlist=resolve
+ function finders.dirfile(specification)
+ local queries=specification.queries
+ if queries then
+ queries.option="fileonly"
+ else
+ specification.queries={ option="fileonly" }
end
+ return resolve(specification)
end
- return notfound()
end
-resolvers.finders .dirlist=resolve
-resolvers.locators .dirlist=resolvers.locators .tree
-resolvers.hashers .dirlist=resolvers.hashers .tree
-resolvers.generators.dirlist=resolvers.generators.file
-resolvers.openers .dirlist=resolvers.openers .file
-resolvers.loaders .dirlist=resolvers.loaders .file
-function resolvers.finders.dirfile(specification)
- local queries=specification.queries
- if queries then
- queries.option="fileonly"
- else
- specification.queries={ option="fileonly" }
+do
+ local fileopener=openers.file
+ local fileloader=loaders.file
+ openers.dirlist=fileopener
+ loaders.dirlist=fileloader
+ openers.dirfile=fileopener
+ loaders.dirfile=fileloader
+end
+do
+ local hashfile="dirhash.lua"
+ local kind="HASH256"
+ local version=1.0
+ local loadtable=table.load
+ local savetable=table.save
+ local loaddata=io.loaddata
+ function resolvers.dirstatus(patterns)
+ local t=type(patterns)
+ if t=="string" then
+ patterns={ patterns }
+ elseif t~="table" then
+ return false
+ end
+ local status=loadtable(hashfile)
+ if not status or status.version~=version or status.kind~=kind then
+ status={
+ version=1.0,
+ kind=kind,
+ hashes={},
+ }
+ end
+ local hashes=status.hashes
+ local changed={}
+ local action=sha2[kind]
+ local update={}
+ for i=1,#patterns do
+ local pattern=patterns[i]
+ local files=globdir(pattern)
+ for i=1,#files do
+ local name=files[i]
+ local hash=action(loaddata(name))
+ if hashes[name]~=hash then
+ changed[#changed+1]=name
+ end
+ update[name]=hash
+ end
+ end
+ status.hashes=update
+ savetable(hashfile,status)
+ return #changed>0 and changed or false
end
- return resolve(specification)
end
-resolvers.locators .dirfile=resolvers.locators .dirlist
-resolvers.hashers .dirfile=resolvers.hashers .dirlist
-resolvers.generators.dirfile=resolvers.generators.dirlist
-resolvers.openers .dirfile=resolvers.openers .dirlist
-resolvers.loaders .dirfile=resolvers.loaders .dirlist
end -- of closure
@@ -24429,7 +25033,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-sch"] = package.loaded["data-sch"] or true
--- original size: 6753, stripped down to: 5268
+-- original size: 6945, stripped down to: 5408
if not modules then modules={} end modules ['data-sch']={
version=1.001,
@@ -24439,8 +25043,11 @@ if not modules then modules={} end modules ['data-sch']={
license="see context related readme files"
}
local load,tonumber=load,tonumber
-local gsub,concat,format=string.gsub,table.concat,string.format
+local gsub,format=string.gsub,string.format
+local sortedhash,concat=table.sortedhash,table.concat
local finders,openers,loaders=resolvers.finders,resolvers.openers,resolvers.loaders
+local addsuffix,suffix,splitbase=file.addsuffix,file.suffix,file.splitbase
+local md5hex=md5.hex
local trace_schemes=false trackers.register("resolvers.schemes",function(v) trace_schemes=v end)
local report_schemes=logs.reporter("resolvers","schemes")
local http=require("socket.http")
@@ -24457,7 +25064,7 @@ function cleaners.none(specification)
return specification.original
end
function cleaners.strip(specification)
- local path,name=file.splitbase(specification.original)
+ local path,name=splitbase(specification.original)
if path=="" then
return (gsub(name,"[^%a%d%.]+","-"))
else
@@ -24465,7 +25072,7 @@ function cleaners.strip(specification)
end
end
function cleaners.md5(specification)
- return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
+ return addsuffix(md5hex(specification.original),suffix(specification.path))
end
local cleaner=cleaners.strip
directives.register("schemes.cleanmethod",function(v) cleaner=cleaners[v] or cleaners.strip end)
@@ -24485,7 +25092,7 @@ local runner=sandbox.registerrunner {
name="curl resolver",
method="execute",
program="curl",
- template="--silent --insecure --create-dirs --output %cachename% %original%",
+ template='--silent --insecure --create-dirs --output "%cachename%" "%original%"',
checkers={
cachename="cache",
original="url",
@@ -24556,10 +25163,10 @@ end
schemes.install=install
local function http_handler(specification,cachename)
local tempname=cachename..".tmp"
- local f=io.open(tempname,"wb")
+ local handle=io.open(tempname,"wb")
local status,message=http.request {
url=specification.original,
- sink=ltn12.sink.file(f)
+ sink=ltn12.sink.file(handle)
}
if not status then
os.remove(tempname)
@@ -24574,13 +25181,13 @@ install('https')
install('ftp')
statistics.register("scheme handling time",function()
local l,r,nl,nr={},{},0,0
- for k,v in table.sortedhash(loaded) do
+ for k,v in sortedhash(loaded) do
if v>0 then
nl=nl+1
l[nl]=k..":"..v
end
end
- for k,v in table.sortedhash(reused) do
+ for k,v in sortedhash(reused) do
if v>0 then
nr=nr+1
r[nr]=k..":"..v
@@ -24588,10 +25195,10 @@ statistics.register("scheme handling time",function()
end
local n=nl+nr
if n>0 then
- l=nl>0 and concat(l) or "none"
- r=nr>0 and concat(r) or "none"
+ if nl==0 then l={ "none" } end
+ if nr==0 then r={ "none" } end
return format("%s seconds, %s processed, threshold %s seconds, loaded: %s, reused: %s",
- statistics.elapsedtime(schemes),n,threshold,l,r)
+ statistics.elapsedtime(schemes),n,threshold,concat(l," "),concat(l," "))
else
return nil
end
@@ -24624,7 +25231,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lua"] = package.loaded["data-lua"] or true
--- original size: 4207, stripped down to: 3041
+-- original size: 4227, stripped down to: 3049
if not modules then modules={} end modules ['data-lua']={
version=1.001,
@@ -24634,8 +25241,7 @@ if not modules then modules={} end modules ['data-lua']={
license="see context related readme files"
}
local package,lpeg=package,lpeg
-local gsub=string.gsub
-local concat=table.concat
+local loadfile=loadfile
local addsuffix=file.addsuffix
local P,S,Cs,lpegmatch=lpeg.P,lpeg.S,lpeg.Cs,lpeg.match
local luasuffixes={ 'tex','lua' }
@@ -24646,6 +25252,8 @@ local helpers=package.helpers or {}
local methods=helpers.methods or {}
local resolvers=resolvers
local resolveprefix=resolvers.resolve
+local expandedpaths=resolvers.expandedpathlistfromvariable
+local findfile=resolvers.findfile
helpers.report=logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries",function(v) helpers.trace=v end)
trackers.register("resolvers.locating",function(v) helpers.trace=v end)
@@ -24674,7 +25282,7 @@ local function getluaformatpaths()
if not luaformatpaths then
luaformatpaths={}
for i=1,#luaformats do
- registerpath("lua format","lua",luaformatpaths,resolvers.expandedpathlistfromvariable(luaformats[i]))
+ registerpath("lua format","lua",luaformatpaths,expandedpaths(luaformats[i]))
end
end
return luaformatpaths
@@ -24683,7 +25291,7 @@ local function getlibformatpaths()
if not libformatpaths then
libformatpaths={}
for i=1,#libformats do
- registerpath("lib format","lib",libformatpaths,resolvers.expandedpathlistfromvariable(libformats[i]))
+ registerpath("lib format","lib",libformatpaths,expandedpaths(libformats[i]))
end
end
return libformatpaths
@@ -24693,7 +25301,7 @@ local function loadedbyformat(name,rawname,suffixes,islib,what)
local report=helpers.report
for i=1,#suffixes do
local format=suffixes[i]
- local resolved=resolvers.findfile(name,format) or ""
+ local resolved=findfile(name,format) or ""
if trace then
report("%s format, identifying %a using format %a",what,name,format)
end
@@ -24731,7 +25339,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-aux"] = package.loaded["data-aux"] or true
--- original size: 2452, stripped down to: 1877
+-- original size: 2610, stripped down to: 2019
if not modules then modules={} end modules ['data-aux']={
version=1.001,
@@ -24742,24 +25350,28 @@ if not modules then modules={} end modules ['data-aux']={
}
local find=string.find
local type,next=type,next
+local addsuffix,removesuffix=file.addsuffix,file.removesuffix
+local loaddata,savedata=io.loaddata,io.savedata
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local resolvers=resolvers
+local cleanpath=resolvers.cleanpath
+local findfiles=resolvers.findfiles
local report_scripts=logs.reporter("resolvers","scripts")
function resolvers.updatescript(oldname,newname)
local scriptpath="context/lua"
- newname=file.addsuffix(newname,"lua")
- local oldscript=resolvers.cleanpath(oldname)
+ local oldscript=cleanpath(oldname)
+ local newname=addsuffix(newname,"lua")
+ local newscripts=findfiles(newname) or {}
if trace_locating then
report_scripts("to be replaced old script %a",oldscript)
end
- local newscripts=resolvers.findfiles(newname) or {}
if #newscripts==0 then
if trace_locating then
report_scripts("unable to locate new script")
end
else
for i=1,#newscripts do
- local newscript=resolvers.cleanpath(newscripts[i])
+ local newscript=cleanpath(newscripts[i])
if trace_locating then
report_scripts("checking new script %a",newscript)
end
@@ -24771,17 +25383,17 @@ function resolvers.updatescript(oldname,newname)
if trace_locating then
report_scripts("new script should come from %a",scriptpath)
end
- elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
+ elseif not (find(oldscript,removesuffix(newname).."$") or find(oldscript,newname.."$")) then
if trace_locating then
report_scripts("invalid new script name")
end
else
- local newdata=io.loaddata(newscript)
+ local newdata=loaddata(newscript)
if newdata then
if trace_locating then
report_scripts("old script content replaced by new content: %s",oldscript)
end
- io.savedata(oldscript,newdata)
+ savedata(oldscript,newdata)
break
elseif trace_locating then
report_scripts("unable to load new script")
@@ -24854,7 +25466,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lst"] = package.loaded["data-lst"] or true
--- original size: 1823, stripped down to: 1542
+-- original size: 2038, stripped down to: 1696
if not modules then modules={} end modules ['data-lst']={
version=1.001,
@@ -24864,15 +25476,22 @@ if not modules then modules={} end modules ['data-lst']={
license="see context related readme files"
}
local type=type
-local concat,sortedhash=table.concat,table.sortedhash
+local sortedhash=table.sortedhash
+local isdir=lfs.isdir
local resolvers=resolvers
local listers=resolvers.listers or {}
resolvers.listers=listers
local resolveprefix=resolvers.resolve
+local configurationfiles=resolvers.configurationfiles
+local expandedpathfromlist=resolvers.expandedpathfromlist
+local splitpath=resolvers.splitpath
+local knownvariables=resolvers.knownvariables
local report_lists=logs.reporter("resolvers","lists")
local report_resolved=logs.reporter("system","resolved")
local function tabstr(str)
- if type(str)=='table' then
+ if not str then
+ return "unset"
+ elseif type(str)=='table' then
return concat(str," | ")
else
return str
@@ -24882,22 +25501,22 @@ function listers.variables(pattern)
local result=resolvers.knownvariables(pattern)
for key,value in sortedhash(result) do
report_lists(key)
- report_lists(" env: %s",tabstr(value.environment or "unset"))
- report_lists(" var: %s",tabstr(value.variable or "unset"))
- report_lists(" exp: %s",tabstr(value.expansion or "unset"))
- report_lists(" res: %s",tabstr(value.resolved or "unset"))
+ report_lists(" env: %s",tabstr(value.environment))
+ report_lists(" var: %s",tabstr(value.variable))
+ report_lists(" exp: %s",tabstr(value.expansion))
+ report_lists(" res: %s",tabstr(value.resolved))
end
end
function listers.configurations()
- local configurations=resolvers.configurationfiles()
+ local configurations=configurationfiles()
for i=1,#configurations do
report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
- local list=resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
+ local list=expandedpathfromlist(splitpath(resolvers.luacnfspec))
for i=1,#list do
local li=resolveprefix(list[i])
- if lfs.isdir(li) then
+ if isdir(li) then
report_resolved("path - %s",li)
else
report_resolved("path + %s",li)
@@ -24910,318 +25529,147 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-package.loaded["util-lib"] = package.loaded["util-lib"] or true
+package.loaded["libs-ini"] = package.loaded["libs-ini"] or true
--- original size: 16094, stripped down to: 8443
+-- original size: 5822, stripped down to: 3629
-if not modules then modules={} end modules ['util-lib']={
+if not modules then modules={} end modules ['libs-ini']={
version=1.001,
comment="companion to luat-lib.mkiv",
author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files",
+ license="see context related readme files"
}
+local type,unpack=type,unpack
local type=type
-local next=next
-local pcall=pcall
-local gsub=string.gsub
-local find=string.find
-local sort=table.sort
-local pathpart=file.pathpart
local nameonly=file.nameonly
local joinfile=file.join
-local removesuffix=file.removesuffix
local addsuffix=file.addsuffix
-local findfile=resolvers.findfile
-local findfiles=resolvers.findfiles
-local expandpaths=resolvers.expandedpathlistfromvariable
local qualifiedpath=file.is_qualified_path
local isfile=lfs.isfile
-local done=false
-local function locate(required,version,trace,report,action)
- if type(required)~="string" then
- report("provide a proper library name")
- return
- end
- if trace then
- report("requiring library %a with version %a",required,version or "any")
- end
- local found_library=nil
- local required_full=gsub(required,"%.","/")
- local required_path=pathpart(required_full)
- local required_base=nameonly(required_full)
- if qualifiedpath(required) then
- if isfile(addsuffix(required,os.libsuffix)) then
- if trace then
- report("qualified name %a found",required)
+local findfile=resolvers.findfile
+local expandpaths=resolvers.expandedpathlistfromvariable
+local report=logs.reporter("resolvers","libraries")
+local trace=false
+trackers.register("resolvers.lib",function(v) trace=v end)
+local function findlib(required)
+ local suffix=os.libsuffix or "so"
+ if not qualifiedpath(required) then
+ local list=directives.value("system.librarynames" )
+ local only=nameonly(required)
+ if type(list)=="table" then
+ list=list[only]
+ if type(list)~="table" then
+ list={ only }
end
- found_library=required
else
- if trace then
- report("qualified name %a not found",required)
- end
+ list={ only }
end
- else
- local required_name=required_base.."."..os.libsuffix
- local version=type(version)=="string" and version~="" and version or false
- local engine="luatex"
- if trace and not done then
- local list=expandpaths("lib")
- for i=1,#list do
- report("tds path %i: %s",i,list[i])
- end
- end
- local function found(locate,asked_library,how,...)
- if trace then
- report("checking %s: %a",how,asked_library)
- end
- return locate(asked_library,...)
+ if trace then
+ report("using lookup list for library %a: % | t",only,list)
end
- local function check(locate,...)
- local found=nil
- if version then
- local asked_library=joinfile(required_path,version,required_name)
- if trace then
- report("checking %s: %a","with version",asked_library)
- end
- found=locate(asked_library,...)
+ for i=1,#list do
+ local name=list[i]
+ local found=findfile(name,"lib")
+ if not found then
+ found=findfile(addsuffix(name,suffix),"lib")
end
- if not found or found=="" then
- local asked_library=joinfile(required_path,required_name)
+ if found then
if trace then
- report("checking %s: %a","with version",asked_library)
+ report("library %a resolved via %a path to %a",name,"tds lib",found)
end
- found=locate(asked_library,...)
- end
- return found and found~="" and found or false
- end
- local function attempt(checkpattern)
- if trace then
- report("checking tds lib paths strictly")
- end
- local found=findfile and check(findfile,"lib")
- if found and (not checkpattern or find(found,checkpattern)) then
return found
end
- if trace then
- report("checking tds lib paths with wildcard")
- end
- local asked_library=joinfile(required_path,".*",required_name)
- if trace then
- report("checking %s: %a","latest version",asked_library)
- end
- local list=findfiles(asked_library,"lib",true)
- if list and #list>0 then
- sort(list)
- local found=list[#list]
- if found and (not checkpattern or find(found,checkpattern)) then
- return found
- end
- end
- if trace then
- report("checking lib paths")
- end
- package.extralibpath(environment.ownpath)
- local paths=package.libpaths()
- local pattern="/[^/]+%."..os.libsuffix.."$"
- for i=1,#paths do
- required_path=gsub(paths[i],pattern,"")
- local found=check(lfs.isfound)
- if type(found)=="string" and (not checkpattern or find(found,checkpattern)) then
- return found
- end
- end
- return false
end
- if engine then
- if trace then
- report("attemp 1, engine %a",engine)
- end
- found_library=attempt("/"..engine.."/")
- if not found_library then
- if trace then
- report("attemp 2, no engine",asked_library)
+ if expandpaths then
+ local list=expandpaths("PATH")
+ local base=addsuffix(only,suffix)
+ for i=1,#list do
+ local full=joinfile(list[i],base)
+ local found=isfile(full) and full
+ if found then
+ if trace then
+ report("library %a resolved via %a path to %a",name,"system",found)
+ end
+ return found
end
- found_library=attempt()
end
- else
- found_library=attempt()
end
- end
- if not found_library then
+ elseif isfile(addsuffix(required,suffix)) then
if trace then
- report("not found: %a",required)
+ report("library with qualified name %a %sfound",required,"")
end
- library=false
+ return required
else
if trace then
- report("found: %a",found_library)
- end
- local result,message=action(found_library,required_base)
- if result then
- library=result
- else
- library=false
- report("load error: message %a, library %a",tostring(message or "unknown"),found_library or "no library")
+ report("library with qualified name %a %sfound",required,"not ")
end
end
- if trace then
- if not library then
- report("unknown library: %a",required)
- else
- report("stored library: %a",required)
- end
- end
- return library or nil
+ return false
end
-do
- local report_swiglib=logs.reporter("swiglib")
- local trace_swiglib=false
- local savedrequire=require
- local loadedlibs={}
- local loadlib=package.loadlib
- local pushdir=dir.push
- local popdir=dir.pop
- trackers.register("resolvers.swiglib",function(v) trace_swiglib=v end)
- function requireswiglib(required,version)
- local library=loadedlibs[library]
- if library==nil then
- local trace_swiglib=trace_swiglib or package.helpers.trace
- library=locate(required,version,trace_swiglib,report_swiglib,function(name,base)
- pushdir(pathpart(name))
- local opener="luaopen_"..base
- if trace_swiglib then
- report_swiglib("opening: %a with %a",name,opener)
- end
- local library,message=loadlib(name,opener)
- local libtype=type(library)
- if libtype=="function" then
- library=library()
+local foundlibraries=table.setmetatableindex(function(t,k)
+ local v=findlib(k)
+ t[k]=v
+ return v
+end)
+function resolvers.findlib(required)
+ return foundlibraries[required]
+end
+local libraries={}
+resolvers.libraries=libraries
+local report=logs.reporter("optional")
+if optional then optional.loaded={} end
+function libraries.validoptional(name)
+ local thelib=optional and optional[name]
+ if not thelib then
+ elseif thelib.initialize then
+ return thelib
+ else
+ report("invalid optional library %a",libname)
+ end
+end
+function libraries.optionalloaded(name,libnames)
+ local thelib=optional and optional[name]
+ if not thelib then
+ report("no optional %a library found",name)
+ else
+ local thelib_initialize=thelib.initialize
+ if not thelib_initialize then
+ report("invalid optional library %a",name)
+ else
+ if type(libnames)=="string" then
+ libnames={ libnames }
+ end
+ if type(libnames)=="table" then
+ for i=1,#libnames do
+ local libname=libnames[i]
+ local filename=foundlibraries[libname]
+ if filename then
+ libnames[i]=filename
+ else
+ report("unable to locate library %a",libname)
+ return
+ end
+ end
+ local initialized=thelib_initialize(unpack(libnames))
+ if initialized then
+ report("using library '% + t'",libnames)
else
- report_swiglib("load error: %a returns %a, message %a, library %a",opener,libtype,(string.gsub(message or "no message","[%s]+$","")),found_library or "no library")
- library=false
+ report("unable to initialize library '% + t'",libnames)
end
- popdir()
- return library
- end)
- loadedlibs[required]=library or false
- end
- return library
- end
- function require(name,version)
- if find(name,"^swiglib%.") then
- return requireswiglib(name,version)
- else
- return savedrequire(name)
- end
- end
- local swiglibs={}
- local initializer="core"
- function swiglib(name,version)
- local library=swiglibs[name]
- if not library then
- statistics.starttiming(swiglibs)
- if trace_swiglib then
- report_swiglib("loading %a",name)
- end
- if not find(name,"%."..initializer.."$") then
- fullname="swiglib."..name.."."..initializer
- else
- fullname="swiglib."..name
+ return initialized
end
- library=requireswiglib(fullname,version)
- swiglibs[name]=library
- statistics.stoptiming(swiglibs)
end
- return library
end
- statistics.register("used swiglibs",function()
- if next(swiglibs) then
- return string.format("%s, initial load time %s seconds",table.concat(table.sortedkeys(swiglibs)," "),statistics.elapsedtime(swiglibs))
- end
- end)
end
if FFISUPPORTED and ffi and ffi.load then
- local report_ffilib=logs.reporter("ffilib")
- local trace_ffilib=false
- local savedffiload=ffi.load
- trackers.register("resolvers.ffilib",function(v) trace_ffilib=v end)
- local loaded={}
- local function locateindeed(name)
- name=removesuffix(name)
- local l=loaded[name]
- if l==nil then
- local state,library=pcall(savedffiload,name)
- if type(library)=="userdata" then
- l=library
- elseif type(state)=="userdata" then
- l=state
- else
- l=false
- end
- loaded[name]=l
- elseif trace_ffilib then
- report_ffilib("reusing already loaded %a",name)
- end
- return l
- end
- local function getlist(required)
- local list=directives.value("system.librarynames" )
- if type(list)=="table" then
- list=list[required]
- if type(list)=="table" then
- if trace then
- report("using lookup list for library %a: % | t",required,list)
- end
- return list
- end
- end
- return { required }
- end
- function ffilib(name,version)
- name=removesuffix(name)
- local l=loaded[name]
- if l~=nil then
- if trace_ffilib then
- report_ffilib("reusing already loaded %a",name)
- end
- return l
- end
- local list=getlist(name)
- if version=="system" then
- for i=1,#list do
- local library=locateindeed(list[i])
- if type(library)=="userdata" then
- return library
- end
- end
- else
- for i=1,#list do
- local library=locate(list[i],version,trace_ffilib,report_ffilib,locateindeed)
- if type(library)=="userdata" then
- return library
- end
- end
- end
- end
+ local ffiload=ffi.load
function ffi.load(name)
- local list=getlist(name)
- for i=1,#list do
- local library=ffilib(list[i])
- if type(library)=="userdata" then
- return library
- end
- end
- if trace_ffilib then
- report_ffilib("trying to load %a using normal loader",name)
- end
- for i=1,#list do
- local state,library=pcall(savedffiload,list[i])
- if type(library)=="userdata" then
- return library
- elseif type(state)=="userdata" then
- return library
- end
+ local full=name and foundlibraries[name]
+ if full then
+ return ffiload(full)
+ else
+ return ffiload(name)
end
end
end
@@ -25336,7 +25784,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 9637, stripped down to: 7253
+-- original size: 13964, stripped down to: 10026
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -25350,16 +25798,14 @@ local concat=table.concat
local quoted=string.quoted
local luasuffixes=utilities.lua.suffixes
local report_format=logs.reporter("resolvers","formats")
-local function primaryflags()
- local arguments=environment.arguments
+local function primaryflags(arguments)
local flags={}
if arguments.silent then
flags[#flags+1]="--interaction=batchmode"
end
return concat(flags," ")
end
-local function secondaryflags()
- local arguments=environment.arguments
+local function secondaryflags(arguments)
local trackers=arguments.trackers
local directives=arguments.directives
local flags={}
@@ -25381,6 +25827,9 @@ local function secondaryflags()
if arguments.ansi then
flags[#flags+1]="--c:ansi"
end
+ if arguments.ansilog then
+ flags[#flags+1]="--c:ansilog"
+ end
if arguments.strip then
flags[#flags+1]="--c:strip"
end
@@ -25391,12 +25840,13 @@ local function secondaryflags()
end
local template=[[--ini %primaryflags% --lua=%luafile% %texfile% %secondaryflags% %dump% %redirect%]]
local checkers={
- primaryflags="string",
- secondaryflags="string",
+ primaryflags="verbose",
+ secondaryflags="verbose",
luafile="readable",
texfile="readable",
redirect="string",
dump="string",
+ binarypath="string",
}
local runners={
luatex=sandbox.registerrunner {
@@ -25421,46 +25871,88 @@ local runners={
reporter=report_format,
},
}
-function environment.make_format(name,arguments)
+local function validbinarypath()
+ if not environment.arguments.nobinarypath then
+ local path=environment.ownpath or file.dirname(environment.ownname)
+ if path and path~="" then
+ path=dir.expandname(path)
+ if path~="" and lfs.isdir(path) then
+ return path
+ end
+ end
+ end
+end
+function environment.make_format(formatname)
+ local arguments=environment.arguments
local engine=environment.ownmain or "luatex"
- local silent=environment.arguments.silent
- local errors=environment.arguments.errors
- local olddir=dir.current()
- local path=caches.getwritablepath("formats",engine) or ""
- if path~="" then
- lfs.chdir(path)
- end
- report_format("using format path %a",dir.current())
- local texsourcename=file.addsuffix(name,"mkiv")
- local fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ local silent=arguments.silent
+ local errors=arguments.errors
+ local texsourcename=""
+ local texsourcepath=""
+ local fulltexsourcename=""
+ if engine=="luametatex" then
+ texsourcename=file.addsuffix(formatname,"mkxl")
+ fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ end
+ if fulltexsourcename=="" then
+ texsourcename=file.addsuffix(formatname,"mkiv")
+ fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ end
if fulltexsourcename=="" then
- texsourcename=file.addsuffix(name,"tex")
+ texsourcename=file.addsuffix(formatname,"tex")
fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
end
if fulltexsourcename=="" then
- report_format("no tex source file with name %a (mkiv or tex)",name)
- lfs.chdir(olddir)
+ report_format("no tex source file with name %a (mkiv or tex)",formatname)
return
- else
- report_format("using tex source file %a",fulltexsourcename)
end
- local texsourcepath=dir.expandname(file.dirname(fulltexsourcename))
- local specificationname=file.replacesuffix(fulltexsourcename,"lus")
- local fullspecificationname=resolvers.findfile(specificationname,"tex") or ""
- if fullspecificationname=="" then
- specificationname=file.join(texsourcepath,"context.lus")
- fullspecificationname=resolvers.findfile(specificationname,"tex") or ""
+ report_format("using tex source file %a",fulltexsourcename)
+ fulltexsourcename=dir.expandname(fulltexsourcename)
+ texsourcepath=file.dirname(fulltexsourcename)
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
end
+ local specificationname="context.lus"
+ local specificationpath=""
+ local fullspecificationname=resolvers.findfile(specificationname) or ""
if fullspecificationname=="" then
- report_format("unknown stub specification %a",specificationname)
- lfs.chdir(olddir)
+ report_format("unable to locate specification file %a",specificationname)
+ return
+ end
+ report_format("using specification file %a",fullspecificationname)
+ fullspecificationname=dir.expandname(fullspecificationname)
+ specificationpath=file.dirname(fullspecificationname)
+ if texsourcepath~=specificationpath then
+ report_format("tex source file and specification file are on different paths")
+ return
+ end
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
+ end
+ if not lfs.isfile(fullspecificationname) then
+ report_format("no accessible specification file with name %a",fulltexsourcename)
+ return
+ end
+ report_format("using tex source path %a",texsourcepath)
+ local validformatpath=caches.getwritablepath("formats",engine) or ""
+ local startupdir=dir.current()
+ if validformatpath=="" then
+ report_format("invalid format path, insufficient write access")
+ return
+ end
+ local binarypath=validbinarypath()
+ report_format("changing to format path %a",validformatpath)
+ lfs.chdir(validformatpath)
+ if dir.current()~=validformatpath then
+ report_format("unable to change to format path %a",validformatpath)
return
end
- local specificationpath=file.dirname(fullspecificationname)
local usedluastub=nil
local usedlualibs=dofile(fullspecificationname)
if type(usedlualibs)=="string" then
- usedluastub=file.join(file.dirname(fullspecificationname),usedlualibs)
+ usedluastub=file.join(specificationpath,usedlualibs)
elseif type(usedlualibs)=="table" then
report_format("using stub specification %a",fullspecificationname)
local texbasename=file.basename(name)
@@ -25477,48 +25969,57 @@ function environment.make_format(name,arguments)
end
else
report_format("invalid stub specification %a",fullspecificationname)
- lfs.chdir(olddir)
+ lfs.chdir(startupdir)
return
end
+ local runner=runners[engine]
+ if not runner then
+ report_format("the format %a cannot be generated, no runner available for engine %a",name,engine)
+ lfs.chdir(startupdir)
+ return
+ end
+ local primaryflags=primaryflags(arguments)
+ local secondaryflags=secondaryflags(arguments)
local specification={
- primaryflags=primaryflags(),
- secondaryflags=secondaryflags(),
+ binarypath=binarypath,
+ primaryflags=primaryflags,
+ secondaryflags=secondaryflags,
luafile=quoted(usedluastub),
texfile=quoted(fulltexsourcename),
dump=os.platform=="unix" and "\\\\dump" or "\\dump",
}
- local runner=runners[engine]
- if not runner then
- report_format("format %a cannot be generated, no runner available for engine %a",name,engine)
- elseif silent then
- statistics.starttiming()
+ if silent then
specification.redirect="> temp.log"
- local result=runner(specification)
- local runtime=statistics.stoptiming()
- if result~=0 then
- print(format("%s silent make > fatal error when making format %q",engine,name))
- else
- print(format("%s silent make > format %q made in %.3f seconds",engine,name,runtime))
- end
+ end
+ statistics.starttiming()
+ local result=runner(specification)
+ local runtime=statistics.stoptiming()
+ if silent then
os.remove("temp.log")
- else
- runner(specification)
end
- local pattern=file.removesuffix(file.basename(usedluastub)).."-*.mem"
- local mp=dir.glob(pattern)
- if mp then
- for i=1,#mp do
- local name=mp[i]
- report_format("removing related mplib format %a",file.basename(name))
- os.remove(name)
+ report_format()
+ if binarypath and binarypath~="" then
+ report_format("binary path : %s",binarypath or "?")
end
- end
- lfs.chdir(olddir)
+ report_format("format path : %s",validformatpath)
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",usedluastub)
+ if primaryflags~="" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags~="" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("context file : %s",fulltexsourcename)
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result==0 and "okay" or "error")
+ report_format()
+ lfs.chdir(startupdir)
end
-local template=[[%flags% --fmt=%fmtfile% --lua=%luafile% %texfile% %more%]]
+local template=[[%primaryflags% --fmt=%fmtfile% --lua=%luafile% %texfile% %secondaryflags%]]
local checkers={
- flags="string",
- more="string",
+ primaryflags="verbose",
+ secondaryflags="verbose",
fmtfile="readable",
luafile="readable",
texfile="readable",
@@ -25531,6 +26032,13 @@ local runners={
checkers=checkers,
reporter=report_format,
},
+ luametatex=sandbox.registerrunner {
+ name="run luametatex format",
+ program="luametatex",
+ template=template,
+ checkers=checkers,
+ reporter=report_format,
+ },
luajittex=sandbox.registerrunner {
name="run luajittex format",
program="luajittex",
@@ -25539,51 +26047,78 @@ local runners={
reporter=report_format,
},
}
-function environment.run_format(name,data,more)
- if name and name~="" then
- local engine=environment.ownmain or "luatex"
- local barename=file.removesuffix(name)
- local fmtname=caches.getfirstreadablefile(file.addsuffix(barename,"fmt"),"formats",engine)
- if fmtname=="" then
- fmtname=resolvers.findfile(file.addsuffix(barename,"fmt")) or ""
- end
- fmtname=resolvers.cleanpath(fmtname)
- if fmtname=="" then
- report_format("no format with name %a",name)
- else
- local barename=file.removesuffix(name)
- local luaname=file.addsuffix(barename,"luc")
- if not lfs.isfile(luaname) then
- luaname=file.addsuffix(barename,"lua")
- end
- if not lfs.isfile(luaname) then
- report_format("using format name %a",fmtname)
- report_format("no luc/lua file with name %a",barename)
- else
- local runner=runners[engine]
- if not runner then
- report_format("format %a cannot be run, no runner available for engine %a",name,engine)
- else
- runner {
- flags=primaryflags(),
- fmtfile=quoted(barename),
- luafile=quoted(luaname),
- texfile=quoted(data),
- more=more,
- }
- end
- end
- end
+function environment.run_format(formatname,scriptname,filename,primaryflags,secondaryflags,verbose)
+ local engine=environment.ownmain or "luatex"
+ if not formatname or formatname=="" then
+ report_format("missing format name")
+ return
+ end
+ if not scriptname or scriptname=="" then
+ report_format("missing script name")
+ return
+ end
+ if not lfs.isfile(formatname) or not lfs.isfile(scriptname) then
+ formatname,scriptname=resolvers.locateformat(formatname)
end
+ if not formatname or formatname=="" then
+ report_format("invalid format name")
+ return
+ end
+ if not scriptname or scriptname=="" then
+ report_format("invalid script name")
+ return
+ end
+ local runner=runners[engine]
+ if not runner then
+ report_format("format %a cannot be run, no runner available for engine %a",file.nameonly(name),engine)
+ return
+ end
+ if not filename then
+ filename ""
+ end
+ local binarypath=validbinarypath()
+ local specification={
+ binarypath=binarypath,
+ primaryflags=primaryflags or "",
+ secondaryflags=secondaryflags or "",
+ fmtfile=quoted(formatname),
+ luafile=quoted(scriptname),
+ texfile=filename~="" and quoted(filename) or "",
+ }
+ statistics.starttiming()
+ local result=runner(specification)
+ local runtime=statistics.stoptiming()
+ if verbose then
+ report_format()
+ if binarypath and binarypath~="" then
+ report_format("binary path : %s",binarypath)
+ end
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",scriptname)
+ report_format("tex format file : %s",formatname)
+ if filename~="" then
+ report_format("tex input file : %s",filename)
+ end
+ if primaryflags~="" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags~="" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result==0 and "okay" or "error")
+ report_format()
+ end
+ return result
end
end -- of closure
--- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
+-- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua libs-ini.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 1019480
--- stripped bytes : 403728
+-- original bytes : 1038245
+-- stripped bytes : 409841
-- end library merge
@@ -25697,7 +26232,7 @@ local ownlibs = { -- order can be made better
'data-tmf.lua',
'data-lst.lua',
- 'util-lib.lua', -- swiglib
+ 'libs-ini.lua',
'luat-sta.lua',
'luat-fmt.lua',
@@ -25846,7 +26381,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
- <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -25865,6 +26400,7 @@ local helpinfo = [[
<flag name="stubpath" value="binpath"><short>paths where stubs wil be written</short></flag>
<flag name="windows"><short>create windows (mswin) stubs</short></flag>
<flag name="unix"><short>create unix (linux) stubs</short></flag>
+ <flag name="addbinarypath"><short>prepend the (found) binarypath to runners</short></flag>
</subcategory>
<subcategory>
<flag name="verbose"><short>give a bit more info</short></flag>
@@ -26086,8 +26622,7 @@ end
report()
io.flush()
end
- -- no os.exec because otherwise we get the wrong return value
- local code = os.execute(command) -- maybe spawn
+ local code = os.execute(command)
if code == 0 then
return true
else
@@ -26130,7 +26665,7 @@ function runners.execute_program(fullname)
report()
report()
io.flush()
- local code = os.exec(command) -- (fullname,unpack(after)) does not work / maybe spawn
+ local code = os.execute(command)
return code == 0
end
end
@@ -26517,16 +27052,22 @@ function runners.associate(filename)
end
function runners.evaluate(code,filename) -- for Luigi
+ local environment = table.setmetatableindex(_G)
if code == "loop" then
while true do
- io.write("> ")
+ io.write("lua > ")
local code = io.read()
- if code ~= "" then
+ if code == "quit" or code == "exit" then
+ break
+ elseif code ~= "" then
local temp = string.match(code,"^= (.*)$")
if temp then
- code = "print("..temp..")"
+ code = "inspect("..temp..")"
+ end
+ local compiled, message = load(code,"console","t",environment)
+ if type(compiled) ~= "function" then
+ compiled = load("inspect("..code..")","console","t",environment)
end
- local compiled, message = loadstring(code)
if type(compiled) ~= "function" then
io.write("! " .. (message or code).."\n")
else
@@ -26539,7 +27080,10 @@ function runners.evaluate(code,filename) -- for Luigi
code = filename
end
if code ~= "" then
- local compiled, message = loadstring(code)
+ local compiled, message = load(code,"console","t",environment)
+ if type(compiled) ~= "function" then
+ compiled = load("inspect("..code..")","console","t",environment)
+ end
if type(compiled) ~= "function" then
io.write("invalid lua code: " .. (message or code))
return
@@ -26716,17 +27260,17 @@ do
end
-if e_argument("ansi") then
+-- if e_argument("ansi") or e_argument("ansilog") then
- logs.setformatters("ansi")
+-- logs.setformatters(e_argument("ansi") and "ansi" or "ansilog")
- local script = e_argument("script") or e_argument("scripts")
+-- -- local script = e_argument("script") or e_argument("scripts")
+-- --
+-- -- if type(script) == "string" then
+-- -- logs.writer("]0;"..script.."") -- for Alan to test
+-- -- end
- if type(script) == "string" then
- logs.writer("]0;"..script.."") -- for Alan to test
- end
-
-end
+-- end
if e_argument("script") or e_argument("scripts") then
@@ -26975,11 +27519,11 @@ elseif e_argument("format-path") then
resolvers.load()
report(caches.getwritablepath("format"))
-elseif e_argument("pattern") then
-
- -- luatools
-
- runners.execute_ctx_script("mtx-base","--pattern='" .. e_argument("pattern") .. "'",filename)
+-- elseif e_argument("pattern") then
+--
+-- -- luatools
+--
+-- runners.execute_ctx_script("mtx-base","--pattern='" .. e_argument("pattern") .. "'",filename)
elseif e_argument("generate") then
diff --git a/Master/texmf-dist/scripts/context/stubs/install/first-setup.sh b/Master/texmf-dist/scripts/context/stubs/install/first-setup.sh
index 71fe32c1629..83af6a97e67 100755
--- a/Master/texmf-dist/scripts/context/stubs/install/first-setup.sh
+++ b/Master/texmf-dist/scripts/context/stubs/install/first-setup.sh
@@ -48,7 +48,7 @@ case "$system" in
# a) binutils, this should work almost everywhere
if $(which readelf >/dev/null 2>&1); then
readelf -A /proc/self/exe | grep -q '^ \+Tag_ABI_VFP_args'
- if [ ! $? ]; then
+ if [ $? != 0 ]; then
platform="linux-armel"
fi
# b) debian-specific fallback
@@ -86,16 +86,18 @@ case "$system" in
esac ;;
# OpenBSD
OpenBSD)
+ version=`uname -r`
case "$cpu" in
- i*86) platform="openbsd" ;;
- amd64) platform="openbsd-amd64" ;;
+ i*86) platform="openbsd${version}" ;;
+ amd64) platform="openbsd${version}-amd64" ;;
*) platform="unknown" ;;
esac ;;
# cygwin
CYGWIN*)
case "$cpu" in
- i*86) platform="cygwin" ;;
- x86_64|ia64) platform="cygwin" ;;
+ i*86) platform="mswin" ;; # cygwin
+ # Pavneet Arora. 20190924. For Cygwin 64-bit platform should be win64.
+ x86_64|ia64) platform="win64" ;; # cygwin-64
*) platform="unknown" ;;
esac ;;
# UWIN
@@ -145,15 +147,18 @@ fi
rsync -rlptv rsync://contextgarden.net/minimals/setup/$platform/bin .
# use native windows binaries on cygwin
-if test "$platform" = "cygwin" ; then
- platform=mswin
-fi
+# Pavneet Arora. 20190924.
+# ..Commented out the following section entirely.
+#if test "$platform" = "cygwin" ; then
+# platform=mswin
+#fi
# download or update the distribution
# you may remove the --context=beta switch if you want to use "current"
# you can use --engine=luatex if you want just mkiv
env PATH="$PWD/bin:$CONTEXTROOT/texmf-$platform/bin:$PATH" MTX_PLATFORM="$platform" \
-./bin/mtxrun --script ./bin/mtx-update.lua --force --update --make --context=beta --platform="$platform" --texroot="$CONTEXTROOT" $@
+./bin/mtxrun --script ./bin/mtx-update.lua --force --update --make --context=beta --engine=luatex --platform="$platform" --texroot="$CONTEXTROOT" $@
+echo "./bin/mtxrun --script ./bin/mtx-update.lua --force --update --make --context=beta --engine=luatex --platform=\"$platform\" --texroot=\"$CONTEXTROOT\" $@"
echo
echo "When you want to use context, you need to initialize the tree by typing:"
diff --git a/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua b/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua
index 98fe7f752e3..5907fa33c66 100644
--- a/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua
+++ b/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua
@@ -194,7 +194,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 6330, stripped down to: 2831
+-- original size: 6529, stripped down to: 2933
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -313,6 +313,9 @@ elseif not ffi.number then
end
if LUAVERSION>5.3 then
end
+if status and os.setenv then
+ os.setenv("engine",string.lower(status.luatex_engine or "unknown"))
+end
end -- of closure
@@ -321,7 +324,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-macro"] = package.loaded["l-macro"] or true
--- original size: 10131, stripped down to: 5991
+-- original size: 10130, stripped down to: 5990
if not modules then modules={} end modules ['l-macros']={
version=1.001,
@@ -546,7 +549,7 @@ end
macros.loaded=loaded
function required(name,trace)
local filename=file.addsuffix(name,"lua")
- local fullname=resolvers and resolvers.find_file(filename) or filename
+ local fullname=resolvers and resolvers.findfile(filename) or filename
if not fullname or fullname=="" then
return false
end
@@ -576,7 +579,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-sandbox"] = package.loaded["l-sandbox"] or true
--- original size: 9747, stripped down to: 6313
+-- original size: 9604, stripped down to: 6394
if not modules then modules={} end modules ['l-sandbox']={
version=1.001,
@@ -808,6 +811,9 @@ local function supported(library)
return l
end
loadfile=register(loadfile,"loadfile")
+if supported("lua") then
+ lua.openfile=register(lua.openfile,"lua.openfile")
+end
if supported("io") then
io.open=register(io.open,"io.open")
io.popen=register(io.popen,"io.popen")
@@ -1168,7 +1174,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true
--- original size: 38434, stripped down to: 19310
+-- original size: 38440, stripped down to: 19316
if not modules then modules={} end modules ['l-lpeg']={
version=1.001,
@@ -1337,7 +1343,7 @@ patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+unders
patterns.somecontent=(anything-newline-space)^1
patterns.beginline=#(1-newline)
patterns.longtostring=Cs(whitespace^0/""*((patterns.quoted+nonwhitespace^1+whitespace^1/""*(endofstring+Cc(" ")))^0))
-function anywhere(pattern)
+local function anywhere(pattern)
return (1-P(pattern))^0*P(pattern)
end
lpeg.anywhere=anywhere
@@ -1967,7 +1973,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-string"] = package.loaded["l-string"] or true
--- original size: 6461, stripped down to: 3255
+-- original size: 6644, stripped down to: 3410
if not modules then modules={} end modules ['l-string']={
version=1.001,
@@ -2031,9 +2037,11 @@ function string.is_empty(str)
end
end
local anything=patterns.anything
-local allescapes=Cc("%")*S(".-+%?()[]*")
-local someescapes=Cc("%")*S(".-+%()[]")
-local matchescapes=Cc(".")*S("*?")
+local moreescapes=Cc("%")*S(".-+%?()[]*$^{}")
+local allescapes=Cc("%")*S(".-+%?()[]*")
+local someescapes=Cc("%")*S(".-+%()[]")
+local matchescapes=Cc(".")*S("*?")
+local pattern_m=Cs ((moreescapes+anything )^0 )
local pattern_a=Cs ((allescapes+anything )^0 )
local pattern_b=Cs ((someescapes+matchescapes+anything )^0 )
local pattern_c=Cs (Cc("^")*(someescapes+matchescapes+anything )^0*Cc("$") )
@@ -2043,6 +2051,8 @@ end
function string.topattern(str,lowercase,strict)
if str=="" or type(str)~="string" then
return ".*"
+ elseif strict=="all" then
+ str=lpegmatch(pattern_m,str)
elseif strict then
str=lpegmatch(pattern_c,str)
else
@@ -2092,7 +2102,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-table"] = package.loaded["l-table"] or true
--- original size: 41332, stripped down to: 21508
+-- original size: 41758, stripped down to: 22643
if not modules then modules={} end modules ['l-table']={
version=1.001,
@@ -2101,7 +2111,7 @@ if not modules then modules={} end modules ['l-table']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local type,next,tostring,tonumber,select=type,next,tostring,tonumber,select
+local type,next,tostring,tonumber,select,rawget=type,next,tostring,tonumber,select,rawget
local table,string=table,string
local concat,sort=table.concat,table.sort
local format,lower,dump=string.format,string.lower,string.dump
@@ -2435,13 +2445,13 @@ function table.fromhash(t)
end
return hsh
end
-local noquotes,hexify,handle,compact,inline,functions,metacheck
+local noquotes,hexify,handle,compact,inline,functions,metacheck,accurate
local reserved=table.tohash {
'and','break','do','else','elseif','end','false','for','function','if',
'in','local','nil','not','or','repeat','return','then','true','until','while',
- 'NaN','goto',
+ 'NaN','goto','const',
}
-local function is_simple_table(t,hexify)
+local function is_simple_table(t,hexify,accurate)
local nt=#t
if nt>0 then
local n=0
@@ -2460,6 +2470,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i]=format("0x%X",v)
+ elseif accurate then
+ tt[i]=format("%q",v)
else
tt[i]=v
end
@@ -2480,6 +2492,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i+1]=format("0x%X",v)
+ elseif accurate then
+ tt[i+1]=format("%q",v)
else
tt[i+1]=v
end
@@ -2551,6 +2565,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tv=="number" then
if hexify then
handle(format("%s 0x%X,",depth,v))
+ elseif accurate then
+ handle(format("%s %q,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -2560,7 +2576,7 @@ local function do_serialize(root,name,depth,level,indexed)
if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
handle(format("%s { %s },",depth,concat(st,", ")))
else
@@ -2588,12 +2604,16 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
@@ -2601,12 +2621,16 @@ local function do_serialize(root,name,depth,level,indexed)
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
handle(format("%s %s=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s %s=%q,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
handle(format("%s [%q]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -2615,6 +2639,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -2631,6 +2657,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={},",depth,k))
+ elseif accurate then
+ handle(format("%s [%q]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -2643,11 +2671,13 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s [%q]={},",depth,k))
end
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
+ elseif accurate then
+ handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -2669,6 +2699,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
+ elseif accurate then
+ handle(format("%s [%q]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -2688,6 +2720,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=load(%q),",depth,k,f))
+ elseif accurate then
+ handle(format("%s [%q]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -2705,6 +2739,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -2728,6 +2764,7 @@ local function serialize(_handle,root,name,specification)
if type(specification)=="table" then
noquotes=specification.noquotes
hexify=specification.hexify
+ accurate=specification.accurate
handle=_handle or specification.handle or print
functions=specification.functions
compact=specification.compact
@@ -3043,7 +3080,7 @@ end
local function sequenced(t,sep,simple)
if not t then
return ""
- elseif type(t)=="string" then
+ elseif type(t)~="table" then
return t
end
local n=#t
@@ -3082,7 +3119,11 @@ local function sequenced(t,sep,simple)
end
end
end
- return concat(s,sep or " | ")
+ if sep==true then
+ return "{ "..concat(s,", ").." }"
+ else
+ return concat(s,sep or " | ")
+ end
end
table.sequenced=sequenced
function table.print(t,...)
@@ -3213,7 +3254,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-io"] = package.loaded["l-io"] or true
--- original size: 11823, stripped down to: 6325
+-- original size: 11829, stripped down to: 6331
if not modules then modules={} end modules ['l-io']={
version=1.001,
@@ -3227,7 +3268,7 @@ local open,flush,write,read=io.open,io.flush,io.write,io.read
local byte,find,gsub,format=string.byte,string.find,string.gsub,string.format
local concat=table.concat
local type=type
-if string.find(os.getenv("PATH"),";",1,true) then
+if string.find(os.getenv("PATH") or "",";",1,true) then
io.fileseparator,io.pathseparator="\\",";"
else
io.fileseparator,io.pathseparator="/",":"
@@ -3765,7 +3806,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 18916, stripped down to: 10126
+-- original size: 19102, stripped down to: 10192
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -3779,7 +3820,7 @@ local date,time=os.date,os.time
local find,format,gsub,upper,gmatch=string.find,string.format,string.gsub,string.upper,string.gmatch
local concat=table.concat
local random,ceil,randomseed=math.random,math.ceil,math.randomseed
-local rawget,rawset,type,getmetatable,setmetatable,tonumber,tostring=rawget,rawset,type,getmetatable,setmetatable,tonumber,tostring
+local type,setmetatable,tonumber,tostring=type,setmetatable,tonumber,tostring
do
local selfdir=os.selfdir
if selfdir=="" then
@@ -3930,7 +3971,8 @@ local launchers={
unix="xdg-open %s &> /dev/null &",
}
function os.launch(str)
- execute(format(launchers[os.name] or launchers.unix,str))
+ local command=format(launchers[os.name] or launchers.unix,str)
+ execute(command)
end
local gettimeofday=os.gettimeofday or os.clock
os.gettimeofday=gettimeofday
@@ -4185,6 +4227,12 @@ function os.validdate(year,month,day)
end
return year,month,day
end
+function os.date(fmt,...)
+ if not fmt then
+ fmt="%Y-%m-%d %H:%M"
+ end
+ return date(fmt,...)
+end
local osexit=os.exit
local exitcode=nil
function os.setexitcode(code)
@@ -4207,7 +4255,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 21984, stripped down to: 10148
+-- original size: 22175, stripped down to: 10302
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -4229,15 +4277,24 @@ local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
local attributes=lfs.attributes
function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
+ if name then
+ return attributes(name,"mode")=="directory"
+ end
end
function lfs.isfile(name)
- local a=attributes(name,"mode")
- return a=="file" or a=="link" or nil
+ if name then
+ local a=attributes(name,"mode")
+ return a=="file" or a=="link" or nil
+ end
end
function lfs.isfound(name)
- local a=attributes(name,"mode")
- return (a=="file" or a=="link") and name or nil
+ if name then
+ local a=attributes(name,"mode")
+ return (a=="file" or a=="link") and name or nil
+ end
+end
+function lfs.modification(name)
+ return name and attributes(name,"modification") or nil
end
if sandbox then
sandbox.redefine(lfs.isfile,"lfs.isfile")
@@ -4616,7 +4673,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-gzip"] = package.loaded["l-gzip"] or true
--- original size: 1211, stripped down to: 951
+-- original size: 5115, stripped down to: 1699
if not modules then modules={} end modules ['l-gzip']={
version=1.001,
@@ -4624,43 +4681,75 @@ if not modules then modules={} end modules ['l-gzip']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-if not gzip then
- return
-end
-local suffix,suffixes=file.suffix,file.suffixes
-function gzip.load(filename)
- local f=io.open(filename,"rb")
- if not f then
- elseif suffix(filename)=="gz" then
- f:close()
- local g=gzip.open(filename,"rb")
- if g then
- local str=g:read("*all")
- g:close()
- return str
+gzip=gzip or {}
+if not zlib then
+ zlib=xzip
+elseif not xzip then
+ xzip=zlib
+end
+if zlib then
+ local suffix=file.suffix
+ local suffixes=file.suffixes
+ local find=string.find
+ local openfile=io.open
+ local gzipwindow=15+16
+ local gziplevel=3
+ local identifier="^\x1F\x8B\x08"
+ local compress=zlib.compress
+ local decompress=zlib.decompress
+ function gzip.load(filename)
+ local f=openfile(filename,"rb")
+ if not f then
+ else
+ local data=f:read("*all")
+ f:close()
+ if data and data~="" then
+ if suffix(filename)=="gz" then
+ data=decompress(data,gzipwindow)
+ end
+ return data
+ end
end
- else
- local str=f:read("*all")
- f:close()
- return str
end
-end
-function gzip.save(filename,data)
- if suffix(filename)~="gz" then
- filename=filename..".gz"
+ function gzip.save(filename,data,level)
+ if suffix(filename)~="gz" then
+ filename=filename..".gz"
+ end
+ local f=openfile(filename,"wb")
+ if f then
+ data=compress(data or "",level or gziplevel,nil,gzipwindow)
+ f:write(data)
+ f:close()
+ return #data
+ end
end
- local f=io.open(filename,"wb")
- if f then
- local s=zlib.compress(data or "",9,nil,15+16)
- f:write(s)
- f:close()
- return #s
+ function gzip.suffix(filename)
+ local suffix,extra=suffixes(filename)
+ local gzipped=extra=="gz"
+ return suffix,gzipped
+ end
+ function gzip.compressed(s)
+ return s and find(s,identifier)
+ end
+ function gzip.compress(s,level)
+ if s and not find(s,identifier) then
+ if not level then
+ level=gziplevel
+ elseif level<=0 then
+ return s
+ elseif level>9 then
+ level=9
+ end
+ return compress(s,level or gziplevel,nil,gzipwindow) or s
+ end
+ end
+ function gzip.decompress(s)
+ if s and find(s,identifier) then
+ return decompress(s,gzipwindow)
+ else
+ return s
+ end
end
-end
-function gzip.suffix(filename)
- local suffix,extra=suffixes(filename)
- local gzipped=extra=="gz"
- return suffix,gzipped
end
@@ -4670,7 +4759,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-md5"] = package.loaded["l-md5"] or true
--- original size: 3309, stripped down to: 2218
+-- original size: 3414, stripped down to: 2307
if not modules then modules={} end modules ['l-md5']={
version=1.001,
@@ -4689,6 +4778,8 @@ if not md5 then
end
local md5,file=md5,file
local gsub=string.gsub
+local modification,isfile,touch=lfs.modification,lfs.isfile,lfs.touch
+local loaddata,savedata=io.loaddata,io.savedata
do
local patterns=lpeg and lpeg.patterns
if patterns then
@@ -4704,10 +4795,11 @@ do
md5.sumHEXA=md5.HEX
end
end
+local md5HEX=md5.HEX
function file.needsupdating(oldname,newname,threshold)
- local oldtime=lfs.attributes(oldname,"modification")
+ local oldtime=modification(oldname)
if oldtime then
- local newtime=lfs.attributes(newname,"modification")
+ local newtime=modification(newname)
if not newtime then
return true
elseif newtime>=oldtime then
@@ -4723,31 +4815,32 @@ function file.needsupdating(oldname,newname,threshold)
end
file.needs_updating=file.needsupdating
function file.syncmtimes(oldname,newname)
- local oldtime=lfs.attributes(oldname,"modification")
- if oldtime and lfs.isfile(newname) then
- lfs.touch(newname,oldtime,oldtime)
+ local oldtime=modification(oldname)
+ if oldtime and isfile(newname) then
+ touch(newname,oldtime,oldtime)
end
end
-function file.checksum(name)
+local function checksum(name)
if md5 then
- local data=io.loaddata(name)
+ local data=loaddata(name)
if data then
- return md5.HEX(data)
+ return md5HEX(data)
end
end
return nil
end
+file.checksum=checksum
function file.loadchecksum(name)
if md5 then
- local data=io.loaddata(name..".md5")
+ local data=loaddata(name..".md5")
return data and (gsub(data,"%s",""))
end
return nil
end
function file.savechecksum(name,checksum)
- if not checksum then checksum=file.checksum(name) end
+ if not checksum then checksum=checksum(name) end
if checksum then
- io.savedata(name..".md5",checksum)
+ savedata(name..".md5",checksum)
return checksum
end
return nil
@@ -5636,7 +5729,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-unicode"] = package.loaded["l-unicode"] or true
--- original size: 41047, stripped down to: 17171
+-- original size: 41281, stripped down to: 17261
if not modules then modules={} end modules ['l-unicode']={
version=1.001,
@@ -6151,49 +6244,52 @@ end
function utf.utf32_to_utf8_t(t,endian)
return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(b)
- if b<0x10000 then
- return char(b%256,rshift(b,8))
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+if bit32 then
+ local rshift=bit32.rshift
+ local function little(b)
+ if b<0x10000 then
+ return char(b%256,rshift(b,8))
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+ end
end
-end
-local function big(b)
- if b<0x10000 then
- return char(rshift(b,8),b%256)
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ local function big(b)
+ if b<0x10000 then
+ return char(rshift(b,8),b%256)
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ end
end
-end
-local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
-local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
-local function utf8_to_utf16_be(str,nobom)
- if nobom then
- return lpegmatch(b_remap,str)
- else
- return char(254,255)..lpegmatch(b_remap,str)
+ local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+ local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+ local function utf8_to_utf16_be(str,nobom)
+ if nobom then
+ return lpegmatch(b_remap,str)
+ else
+ return char(254,255)..lpegmatch(b_remap,str)
+ end
end
-end
-local function utf8_to_utf16_le(str,nobom)
- if nobom then
- return lpegmatch(l_remap,str)
- else
- return char(255,254)..lpegmatch(l_remap,str)
+ local function utf8_to_utf16_le(str,nobom)
+ if nobom then
+ return lpegmatch(l_remap,str)
+ else
+ return char(255,254)..lpegmatch(l_remap,str)
+ end
end
-end
-utf.utf8_to_utf16_be=utf8_to_utf16_be
-utf.utf8_to_utf16_le=utf8_to_utf16_le
-function utf.utf8_to_utf16(str,littleendian,nobom)
- if littleendian then
- return utf8_to_utf16_le(str,nobom)
- else
- return utf8_to_utf16_be(str,nobom)
+ utf.utf8_to_utf16_be=utf8_to_utf16_be
+ utf.utf8_to_utf16_le=utf8_to_utf16_le
+ function utf.utf8_to_utf16(str,littleendian,nobom)
+ if littleendian then
+ return utf8_to_utf16_le(str,nobom)
+ else
+ return utf8_to_utf16_be(str,nobom)
+ end
end
end
local pattern=Cs (
@@ -6467,7 +6563,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 43488, stripped down to: 21595
+-- original size: 45188, stripped down to: 22734
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -6797,6 +6893,13 @@ local template=[[
%s
return function(%s) return %s end
]]
+local pattern=Cs(Cc('"')*(
+ (1-S('"\\\n\r'))^1+P('"')/'\\"'+P('\\')/'\\\\'+P('\n')/'\\n'+P('\r')/'\\r'
+)^0*Cc('"'))
+patterns.escapedquotes=pattern
+function string.escapedquotes(s)
+ return lpegmatch(pattern,s)
+end
local preamble=""
local environment={
global=global or _G,
@@ -6821,9 +6924,10 @@ local environment={
formattednumber=number.formatted,
sparseexponent=number.sparseexponent,
formattedfloat=number.formattedfloat,
- stripzero=lpeg.patterns.stripzero,
- stripzeros=lpeg.patterns.stripzeros,
- FORMAT=string.f9,
+ stripzero=patterns.stripzero,
+ stripzeros=patterns.stripzeros,
+ escapedquotes=string.escapedquotes,
+ FORMAT=string.f6,
}
local arguments={ "a1" }
setmetatable(arguments,{ __index=function(t,k)
@@ -6874,13 +6978,16 @@ local format_left=function(f)
return format("a%s..utfpadding(a%s,%i)",n,n,-f)
end
end
-local format_q=function()
+local format_q=JITSUPPORTED and function()
n=n+1
return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n)
+end or function()
+ n=n+1
+ return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n)
end
local format_Q=function()
n=n+1
- return format("format('%%q',tostring(a%s))",n)
+ return format("escapedquotes(tostring(a%s))",n)
end
local format_i=function(f)
n=n+1
@@ -7031,12 +7138,25 @@ local format_n=function()
n=n+1
return format("((a%s %% 1 == 0) and format('%%i',a%s) or tostring(a%s))",n,n,n)
end
-local format_N=function(f)
- n=n+1
- if not f or f=="" then
- f=".9"
- end
- return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+local format_N if environment.FORMAT then
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ return format("FORMAT(a%s,'%%.9f')",n)
+ elseif f==".6" or f=="0.6" then
+ return format("FORMAT(a%s)",n)
+ else
+ return format("FORMAT(a%s,'%%%sf')",n,f)
+ end
+ end
+else
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ f=".9"
+ end
+ return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+ end
end
local format_a=function(f)
n=n+1
@@ -7265,9 +7385,9 @@ patterns.xmlescape=Cs((P("<")/"&lt;"+P(">")/"&gt;"+P("&")/"&amp;"+P('"')/"&quot;
patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+anything)^0)
patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0)
patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"'))
-add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=lpeg.patterns.xmlescape })
-add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
-add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
+add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=patterns.xmlescape })
+add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=patterns.texescape })
+add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=patterns.luaescape })
local dquote=patterns.dquote
local equote=patterns.escaped+dquote/'\\"'+1
local cquote=Cc('"')
@@ -7299,6 +7419,27 @@ local f_16_16=formatters["%0.5N"]
function number.to16dot16(n)
return f_16_16(n/65536.0)
end
+if not string.explode then
+ local tsplitat=lpeg.tsplitat
+ local p_utf=patterns.utf8character
+ local p_check=C(p_utf)*(P("+")*Cc(true))^0
+ local p_split=Ct(C(p_utf)^0)
+ local p_space=Ct((C(1-P(" ")^1)+P(" ")^1)^0)
+ function string.explode(str,symbol)
+ if symbol=="" then
+ return lpegmatch(p_split,str)
+ elseif symbol then
+ local a,b=lpegmatch(p_check,symbol)
+ if b then
+ return lpegmatch(tsplitat(P(a)^1),str)
+ else
+ return lpegmatch(tsplitat(a),str)
+ end
+ else
+ return lpegmatch(p_space,str)
+ end
+ end
+end
end -- of closure
@@ -7307,7 +7448,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 28866, stripped down to: 16134
+-- original size: 32649, stripped down to: 18257
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -7544,78 +7685,160 @@ function tables.encapsulate(core,capsule,protect)
} )
end
end
-local f_hashed_string=formatters["[%q]=%q,"]
-local f_hashed_number=formatters["[%q]=%s,"]
-local f_hashed_boolean=formatters["[%q]=%l,"]
-local f_hashed_table=formatters["[%q]="]
-local f_indexed_string=formatters["[%s]=%q,"]
-local f_indexed_number=formatters["[%s]=%s,"]
-local f_indexed_boolean=formatters["[%s]=%l,"]
-local f_indexed_table=formatters["[%s]="]
-local f_ordered_string=formatters["%q,"]
-local f_ordered_number=formatters["%s,"]
-local f_ordered_boolean=formatters["%l,"]
-function table.fastserialize(t,prefix)
- local r={ type(prefix)=="string" and prefix or "return" }
- local m=1
- local function fastserialize(t,outer)
- local n=#t
- m=m+1
- r[m]="{"
- if n>0 then
- for i=0,n do
- local v=t[i]
- local tv=type(v)
- if tv=="string" then
- m=m+1 r[m]=f_ordered_string(v)
- elseif tv=="number" then
- m=m+1 r[m]=f_ordered_number(v)
- elseif tv=="table" then
- fastserialize(v)
- elseif tv=="boolean" then
- m=m+1 r[m]=f_ordered_boolean(v)
+if JITSUPPORTED then
+ local f_hashed_string=formatters["[%Q]=%Q,"]
+ local f_hashed_number=formatters["[%Q]=%s,"]
+ local f_hashed_boolean=formatters["[%Q]=%l,"]
+ local f_hashed_table=formatters["[%Q]="]
+ local f_indexed_string=formatters["[%s]=%Q,"]
+ local f_indexed_number=formatters["[%s]=%s,"]
+ local f_indexed_boolean=formatters["[%s]=%l,"]
+ local f_indexed_table=formatters["[%s]="]
+ local f_ordered_string=formatters["%Q,"]
+ local f_ordered_number=formatters["%s,"]
+ local f_ordered_boolean=formatters["%l,"]
+ function table.fastserialize(t,prefix)
+ local r={ type(prefix)=="string" and prefix or "return" }
+ local m=1
+ local function fastserialize(t,outer)
+ local n=#t
+ m=m+1
+ r[m]="{"
+ if n>0 then
+ local v=t[0]
+ if v then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(0,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(0,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(0)
+ fastserialize(v)
+ m=m+1 r[m]=f_indexed_table(0)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(0,v)
+ end
+ end
+ for i=1,n do
+ local v=t[i]
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_ordered_string(v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_ordered_number(v)
+ elseif tv=="table" then
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_ordered_boolean(v)
+ end
end
end
- end
- for k,v in next,t do
- local tk=type(k)
- if tk=="number" then
- if k>n or k<0 then
+ for k,v in next,t do
+ local tk=type(k)
+ if tk=="number" then
+ if k>n or k<0 then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(k,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(k,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(k)
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(k,v)
+ end
+ end
+ else
local tv=type(v)
if tv=="string" then
- m=m+1 r[m]=f_indexed_string(k,v)
+ m=m+1 r[m]=f_hashed_string(k,v)
elseif tv=="number" then
- m=m+1 r[m]=f_indexed_number(k,v)
+ m=m+1 r[m]=f_hashed_number(k,v)
elseif tv=="table" then
- m=m+1 r[m]=f_indexed_table(k)
+ m=m+1 r[m]=f_hashed_table(k)
fastserialize(v)
elseif tv=="boolean" then
- m=m+1 r[m]=f_indexed_boolean(k,v)
+ m=m+1 r[m]=f_hashed_boolean(k,v)
end
end
+ end
+ m=m+1
+ if outer then
+ r[m]="}"
else
- local tv=type(v)
- if tv=="string" then
- m=m+1 r[m]=f_hashed_string(k,v)
- elseif tv=="number" then
- m=m+1 r[m]=f_hashed_number(k,v)
- elseif tv=="table" then
- m=m+1 r[m]=f_hashed_table(k)
- fastserialize(v)
- elseif tv=="boolean" then
- m=m+1 r[m]=f_hashed_boolean(k,v)
- end
+ r[m]="},"
end
+ return r
end
- m=m+1
- if outer then
- r[m]="}"
- else
- r[m]="},"
+ return concat(fastserialize(t,true))
+ end
+else
+ local f_v=formatters["[%q]=%q,"]
+ local f_t=formatters["[%q]="]
+ local f_q=formatters["%q,"]
+ function table.fastserialize(t,prefix)
+ local r={ type(prefix)=="string" and prefix or "return" }
+ local m=1
+ local function fastserialize(t,outer)
+ local n=#t
+ m=m+1
+ r[m]="{"
+ if n>0 then
+ local v=t[0]
+ if v then
+ m=m+1
+ r[m]="[0]='"
+ if type(v)=="table" then
+ fastserialize(v)
+ else
+ r[m]=format("%q,",v)
+ end
+ end
+ for i=1,n do
+ local v=t[i]
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%i]=",i)
+ fastserialize(v)
+ else
+ r[m]=format("[%i]=%q,",i,v)
+ end
+ end
+ end
+ for k,v in next,t do
+ local tk=type(k)
+ if tk=="number" then
+ if k>n or k<0 then
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%i]=",k)
+ fastserialize(v)
+ else
+ r[m]=format("[%i]=%q,",k,v)
+ end
+ end
+ else
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%q]=",k)
+ fastserialize(v)
+ else
+ r[m]=format("[%q]=%q,",k,v)
+ end
+ end
+ end
+ m=m+1
+ if outer then
+ r[m]="}"
+ else
+ r[m]="},"
+ end
+ return r
end
- return r
+ return concat(fastserialize(t,true))
end
- return concat(fastserialize(t,true))
end
function table.deserialize(str)
if not str or str=="" then
@@ -7709,28 +7932,28 @@ function table.twowaymapper(t)
return t
end
local f_start_key_idx=formatters["%w{"]
-local f_start_key_num=formatters["%w[%s]={"]
+local f_start_key_num=JITSUPPORTED and formatters["%w[%s]={"] or formatters["%w[%q]={"]
local f_start_key_str=formatters["%w[%q]={"]
local f_start_key_boo=formatters["%w[%l]={"]
local f_start_key_nop=formatters["%w{"]
local f_stop=formatters["%w},"]
-local f_key_num_value_num=formatters["%w[%s]=%s,"]
-local f_key_str_value_num=formatters["%w[%q]=%s,"]
-local f_key_boo_value_num=formatters["%w[%l]=%s,"]
-local f_key_num_value_str=formatters["%w[%s]=%q,"]
-local f_key_str_value_str=formatters["%w[%q]=%q,"]
-local f_key_boo_value_str=formatters["%w[%l]=%q,"]
-local f_key_num_value_boo=formatters["%w[%s]=%l,"]
-local f_key_str_value_boo=formatters["%w[%q]=%l,"]
+local f_key_num_value_num=JITSUPPORTED and formatters["%w[%s]=%s,"] or formatters["%w[%s]=%q,"]
+local f_key_str_value_num=JITSUPPORTED and formatters["%w[%Q]=%s,"] or formatters["%w[%Q]=%q,"]
+local f_key_boo_value_num=JITSUPPORTED and formatters["%w[%l]=%s,"] or formatters["%w[%l]=%q,"]
+local f_key_num_value_str=JITSUPPORTED and formatters["%w[%s]=%Q,"] or formatters["%w[%q]=%Q,"]
+local f_key_str_value_str=formatters["%w[%Q]=%Q,"]
+local f_key_boo_value_str=formatters["%w[%l]=%Q,"]
+local f_key_num_value_boo=JITSUPPORTED and formatters["%w[%s]=%l,"] or formatters["%w[%q]=%l,"]
+local f_key_str_value_boo=formatters["%w[%Q]=%l,"]
local f_key_boo_value_boo=formatters["%w[%l]=%l,"]
-local f_key_num_value_not=formatters["%w[%s]={},"]
-local f_key_str_value_not=formatters["%w[%q]={},"]
+local f_key_num_value_not=JITSUPPORTED and formatters["%w[%s]={},"] or formatters["%w[%q]={},"]
+local f_key_str_value_not=formatters["%w[%Q]={},"]
local f_key_boo_value_not=formatters["%w[%l]={},"]
-local f_key_num_value_seq=formatters["%w[%s]={ %, t },"]
-local f_key_str_value_seq=formatters["%w[%q]={ %, t },"]
+local f_key_num_value_seq=JITSUPPORTED and formatters["%w[%s]={ %, t },"] or formatters["%w[%q]={ %, t },"]
+local f_key_str_value_seq=formatters["%w[%Q]={ %, t },"]
local f_key_boo_value_seq=formatters["%w[%l]={ %, t },"]
-local f_val_num=formatters["%w%s,"]
-local f_val_str=formatters["%w%q,"]
+local f_val_num=JITSUPPORTED and formatters["%w%s,"] or formatters["%w%q,"]
+local f_val_str=formatters["%w%Q,"]
local f_val_boo=formatters["%w%l,"]
local f_val_not=formatters["%w{},"]
local f_val_seq=formatters["%w{ %, t },"]
@@ -7738,7 +7961,7 @@ local f_fin_seq=formatters[" %, t }"]
local f_table_return=formatters["return {"]
local f_table_name=formatters["%s={"]
local f_table_direct=formatters["{"]
-local f_table_entry=formatters["[%q]={"]
+local f_table_entry=formatters["[%Q]={"]
local f_table_finish=formatters["}"]
local spaces=utilities.strings.newrepeater(" ")
local original_serialize=table.serialize
@@ -8339,7 +8562,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sac"] = package.loaded["util-sac"] or true
--- original size: 11332, stripped down to: 8420
+-- original size: 12946, stripped down to: 9507
if not modules then modules={} end modules ['util-sac']={
version=1.001,
@@ -8374,6 +8597,7 @@ end
function streams.size(f)
return f and f[3] or 0
end
+streams.getsize=streams.size
function streams.setposition(f,i)
if f[4] then
if i<=0 then
@@ -8566,9 +8790,9 @@ function streams.readfixed2(f)
f[2]=j+1
local a,b=byte(f[1],i,j)
if a>=0x80 then
- tonumber((a-0x100).."."..b)
+ return tonumber((a-0x100).."."..b) or 0
else
- tonumber((a ).."."..b)
+ return tonumber((a ).."."..b) or 0
end
end
function streams.readfixed4(f)
@@ -8577,9 +8801,9 @@ function streams.readfixed4(f)
f[2]=j+1
local a,b,c,d=byte(f[1],i,j)
if a>=0x80 then
- tonumber((0x100*a+b-0x10000).."."..(0x100*c+d))
+ return tonumber((0x100*a+b-0x10000).."."..(0x100*c+d)) or 0
else
- tonumber((0x100*a+b ).."."..(0x100*c+d))
+ return tonumber((0x100*a+b ).."."..(0x100*c+d)) or 0
end
end
if bit32 then
@@ -8659,6 +8883,16 @@ if sio and sio.readcardinal2 then
f[2]=i+4
return readinteger4(f[1],i)
end
+ function streams.readfixed2(f)
+ local i=f[2]
+ f[2]=i+2
+ return readfixed2(f[1],i)
+ end
+ function streams.readfixed4(f)
+ local i=f[2]
+ f[2]=i+4
+ return readfixed4(f[1],i)
+ end
function streams.read2dot4(f)
local i=f[2]
f[2]=i+2
@@ -8758,6 +8992,50 @@ else
return t
end
end
+do
+ local files=utilities.files
+ if files then
+ local openfile=files.open
+ local openstream=streams.open
+ local openstring=streams.openstring
+ local setmetatable=setmetatable
+ function io.newreader(str,method)
+ local f,m
+ if method=="string" then
+ f=openstring(str)
+ m=streams
+ elseif method=="stream" then
+ f=openstream(str)
+ m=streams
+ else
+ f=openfile(str,"rb")
+ m=files
+ end
+ if f then
+ local t={}
+ setmetatable(t,{
+ __index=function(t,k)
+ local r=m[k]
+ if k=="close" then
+ if f then
+ m.close(f)
+ f=nil
+ end
+ return function() end
+ elseif r then
+ local v=function(_,a,b) return r(f,a,b) end
+ t[k]=v
+ return v
+ else
+ print("unknown key",k)
+ end
+ end
+ } )
+ return t
+ end
+ end
+ end
+end
end -- of closure
@@ -9801,7 +10079,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-copas"] = package.loaded["util-soc-imp-copas"] or true
--- original size: 25844, stripped down to: 14821
+-- original size: 25959, stripped down to: 14893
local socket=socket or require("socket")
@@ -9838,6 +10116,7 @@ local copas={
autoclose=true,
running=false,
report=report,
+ trace=false,
}
local function statushandler(status,...)
if status then
@@ -9847,7 +10126,9 @@ local function statushandler(status,...)
if type(err)=="table" then
err=err[1]
end
- report("error: %s",tostring(err))
+ if copas.trace then
+ report("error: %s",tostring(err))
+ end
return nil,err
end
function socket.protect(func)
@@ -9861,7 +10142,9 @@ function socket.newtry(finalizer)
if not status then
local detail=select(2,...)
pcall(finalizer,detail)
- report("error: %s",tostring(detail))
+ if copas.trace then
+ report("error: %s",tostring(detail))
+ end
return
end
return...
@@ -12429,7 +12712,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-set"] = package.loaded["trac-set"] or true
--- original size: 13340, stripped down to: 8826
+-- original size: 13394, stripped down to: 8882
if not modules then modules={} end modules ['trac-set']={
version=1.001,
@@ -12439,8 +12722,9 @@ if not modules then modules={} end modules ['trac-set']={
license="see context related readme files"
}
local type,next,tostring,tonumber=type,next,tostring,tonumber
+local print=print
local concat,sortedhash=table.concat,table.sortedhash
-local format,find,lower,gsub,topattern=string.format,string.find,string.lower,string.gsub,string.topattern
+local formatters,find,lower,gsub,topattern=string.formatters,string.find,string.lower,string.gsub,string.topattern
local is_boolean=string.is_boolean
local settings_to_hash=utilities.parsers.settings_to_hash
local allocate=utilities.storage.allocate
@@ -12450,10 +12734,10 @@ local setters=utilities.setters or {}
utilities.setters=setters
local data={}
local trace_initialize=false
+local frozen=true
function setters.initialize(filename,name,values)
local setter=data[name]
if setter then
- frozen=true
local data=setter.data
if data then
for key,newvalue in sortedhash(values) do
@@ -12647,8 +12931,8 @@ function setters.show(t)
end
end
local enable,disable,register,list,show=setters.enable,setters.disable,setters.register,setters.list,setters.show
-function setters.report(setter,...)
- print(format("%-15s : %s\n",setter.name,format(...)))
+function setters.report(setter,fmt,...)
+ print(formatters["%-15s : %s\n"](setter.name,formatters[fmt](...)))
end
local function default(setter,name)
local d=setter.data[name]
@@ -12668,7 +12952,7 @@ function setters.new(name)
disable=function(...) disable (setter,...) end,
reset=function(...) reset (setter,...) end,
register=function(...) register(setter,...) end,
- list=function(...) list (setter,...) end,
+ list=function(...) return list (setter,...) end,
show=function(...) show (setter,...) end,
default=function(...) return default (setter,...) end,
value=function(...) return value (setter,...) end,
@@ -12771,7 +13055,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 32618, stripped down to: 20935
+-- original size: 33003, stripped down to: 21667
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -12816,14 +13100,30 @@ local function ignore() end
setmetatableindex(logs,function(t,k) t[k]=ignore;return ignore end)
local report,subreport,status,settarget,setformats,settranslations
local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
+local function ansisupported(specification)
+ if specification~="ansi" and specification~="ansilog" then
+ return false
+ elseif os and os.enableansi then
+ return os.enableansi()
+ else
+ return false
+ end
+end
if runningtex and texio then
if texio.setescape then
texio.setescape(0)
end
- if arg then
+ if arg and ansisupported then
for k,v in next,arg do
if v=="--ansi" or v=="--c:ansi" then
- variant="ansi"
+ if ansisupported("ansi") then
+ variant="ansi"
+ end
+ break
+ elseif v=="--ansilog" or v=="--c:ansilog" then
+ if ansisupported("ansilog") then
+ variant="ansilog"
+ end
break
end
end
@@ -12928,6 +13228,10 @@ if runningtex and texio then
},
}
}
+ variants.ansilog={
+ formats=variants.ansi.formats,
+ targets=variants.default.targets,
+ }
logs.flush=io.flush
writer=function(...)
write_nl(target,...)
@@ -13034,6 +13338,9 @@ if runningtex and texio then
t=specification.targets
f=specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification="default"
+ end
local v=variants[specification]
if v then
t=v.targets
@@ -13060,7 +13367,7 @@ if runningtex and texio then
subdirect_nop=f.subdirect_nop
status_yes=f.status_yes
status_nop=f.status_nop
- if variant=="ansi" then
+ if variant=="ansi" or variant=="ansilog" then
useluawrites()
end
settarget(whereto)
@@ -13153,6 +13460,9 @@ else
if type(specification)=="table" then
f=specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification="default"
+ end
local v=variants[specification]
if v then
f=v.formats
@@ -13408,12 +13718,6 @@ end
local nesting=0
local verbose=false
local hasscheme=url.hasscheme
-function logs.show_open(name)
-end
-function logs.show_close(name)
-end
-function logs.show_load(name)
-end
local simple=logs.reporter("comment")
logs.simple=simple
logs.simpleline=simple
@@ -13480,6 +13784,13 @@ local exporters={
logs.reporters=reporters
logs.exporters=exporters
function logs.application(t)
+ local arguments=environment and environment.arguments
+ if arguments then
+ local ansi=arguments.ansi or arguments.ansilog
+ if ansi then
+ logs.setformatters(arguments.ansi and "ansi" or "ansilog")
+ end
+ end
t.name=t.name or "unknown"
t.banner=t.banner
t.moreinfo=moreinfo
@@ -13553,8 +13864,6 @@ else
print(format(...))
end
end
-io.stdout:setvbuf('no')
-io.stderr:setvbuf('no')
if package.helpers.report then
package.helpers.report=logs.reporter("package loader")
end
@@ -13652,7 +13961,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-inf"] = package.loaded["trac-inf"] or true
--- original size: 8966, stripped down to: 5972
+-- original size: 9973, stripped down to: 7492
if not modules then modules={} end modules ['trac-inf']={
version=1.001,
@@ -13674,7 +13983,7 @@ statistics.enable=true
statistics.threshold=0.01
local statusinfo,n,registered,timers={},0,{},{}
setmetatableindex(timers,function(t,k)
- local v={ timing=0,loadtime=0 }
+ local v={ timing=0,loadtime=0,offset=0 }
t[k]=v
return v
end)
@@ -13682,10 +13991,40 @@ local function hastiming(instance)
return instance and timers[instance]
end
local function resettiming(instance)
- timers[instance or "notimer"]={ timing=0,loadtime=0 }
+ timers[instance or "notimer"]={ timing=0,loadtime=0,offset=0 }
end
local ticks=clock
local seconds=function(n) return n or 0 end
+if lua.getpreciseticks then
+ ticks=lua.getpreciseticks
+ seconds=lua.getpreciseseconds
+elseif FFISUPPORTED and ffi and os.type=="windows" then
+ local okay,kernel=pcall(ffi.load,"kernel32")
+ if kernel then
+ local tonumber=ffi.number or tonumber
+ ffi.cdef[[
+ int QueryPerformanceFrequency(int64_t *lpFrequency);
+ int QueryPerformanceCounter(int64_t *lpPerformanceCount);
+ ]]
+ local target=ffi.new("__int64[1]")
+ ticks=function()
+ if kernel.QueryPerformanceCounter(target)==1 then
+ return tonumber(target[0])
+ else
+ return 0
+ end
+ end
+ local target=ffi.new("__int64[1]")
+ seconds=function(ticks)
+ if kernel.QueryPerformanceFrequency(target)==1 then
+ return ticks/tonumber(target[0])
+ else
+ return 0
+ end
+ end
+ end
+else
+end
local function starttiming(instance,reset)
local timer=timers[instance or "notimer"]
local it=timer.timing
@@ -13720,12 +14059,26 @@ local function stoptiming(instance)
end
return 0
end
+local function benchmarktimer(instance)
+ local timer=timers[instance or "notimer"]
+ local it=timer.timing
+ if it>1 then
+ timer.timing=it-1
+ else
+ local starttime=timer.starttime
+ if starttime and starttime>0 then
+ timer.offset=ticks()-starttime
+ else
+ timer.offset=0
+ end
+ end
+end
local function elapsed(instance)
if type(instance)=="number" then
return instance
else
local timer=timers[instance or "notimer"]
- return timer and seconds(timer.loadtime) or 0
+ return timer and seconds(timer.loadtime-2*(timer.offset or 0)) or 0
end
end
local function currenttime(instance)
@@ -13738,7 +14091,7 @@ local function currenttime(instance)
else
local starttime=timer.starttime
if starttime and starttime>0 then
- return seconds(timer.loadtime+ticks()-starttime)
+ return seconds(timer.loadtime+ticks()-starttime-2*(timer.offset or 0))
end
end
return 0
@@ -13764,6 +14117,7 @@ statistics.elapsed=elapsed
statistics.elapsedtime=elapsedtime
statistics.elapsedindeed=elapsedindeed
statistics.elapsedseconds=elapsedseconds
+statistics.benchmarktimer=benchmarktimer
function statistics.register(tag,fnc)
if statistics.enable and type(fnc)=="function" then
local rt=registered[tag] or (#statusinfo+1)
@@ -13780,10 +14134,17 @@ function statistics.show()
return format("%s, type: %s, binary subtree: %s",
os.platform or "unknown",os.type or "unknown",environment.texos or "unknown")
end)
- register("used engine",function()
- return format("%s version %s with functionality level %s, banner: %s",
- LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner))
- end)
+ if LUATEXENGINE=="luametatex" then
+ register("used engine",function()
+ return format("%s version %s, functionality level %s, format id %s",
+ LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,LUATEXFORMATID)
+ end)
+ else
+ register("used engine",function()
+ return format("%s version %s with functionality level %s, banner: %s",
+ LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner))
+ end)
+ end
register("control sequences",function()
return format("%s of %s + %s",status.cs_count,status.hash_size,status.hash_extra)
end)
@@ -13822,7 +14183,11 @@ function statistics.show()
end
function statistics.memused()
local round=math.round or math.floor
- return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000),round(status.luastate_bytes/1000000))
+ return format("%s MB, ctx: %s MB, max: %s MB)",
+ round(collectgarbage("count")/1000),
+ round(status.luastate_bytes/1000000),
+ status.luastate_bytes_max and round(status.luastate_bytes_max/1000000) or "unknown"
+ )
end
starttiming(statistics)
function statistics.formatruntime(runtime)
@@ -14013,7 +14378,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-lua"] = package.loaded["util-lua"] or true
--- original size: 6664, stripped down to: 4589
+-- original size: 7149, stripped down to: 4997
if not modules then modules={} end modules ['util-lua']={
version=1.001,
@@ -14038,16 +14403,21 @@ luautilities.nofstrippedchunks=0
luautilities.nofstrippedbytes=0
local strippedchunks={}
luautilities.strippedchunks=strippedchunks
+if not LUATEXENGINE then
+ LUATEXENGINE=status.luatex_engine and string.lower(status.luatex_engine)
+ JITSUPPORTED=LUATEXENGINE=="luajittex" or jit
+ CONTEXTLMTXMODE=CONTEXTLMTXMODE or (LUATEXENGINE=="luametatex" and 1) or 0
+end
luautilities.suffixes={
tma="tma",
- tmc=jit and "tmb" or "tmc",
+ tmc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tmd") or (jit and "tmb") or "tmc",
lua="lua",
- luc=jit and "lub" or "luc",
+ luc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "lud") or (jit and "lub") or "luc",
lui="lui",
luv="luv",
luj="luj",
tua="tua",
- tuc="tuc",
+ tuc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tud") or (jit and "tub") or "tuc",
}
local function register(name)
if tracestripping then
@@ -14186,7 +14556,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-deb"] = package.loaded["util-deb"] or true
--- original size: 9955, stripped down to: 6693
+-- original size: 10136, stripped down to: 6832
if not modules then modules={} end modules ['util-deb']={
version=1.001,
@@ -14210,7 +14580,13 @@ local dummycalls=10*1000
local nesting=0
local names={}
local initialize=false
-if not (FFISUPPORTED and ffi) then
+if lua.getpreciseticks then
+ initialize=function()
+ ticks=lua.getpreciseticks
+ seconds=lua.getpreciseseconds
+ initialize=false
+ end
+elseif not (FFISUPPORTED and ffi) then
elseif os.type=="windows" then
initialize=function()
local kernel=ffilib("kernel32","system")
@@ -14482,7 +14858,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tpl"] = package.loaded["util-tpl"] or true
--- original size: 7112, stripped down to: 3887
+-- original size: 7722, stripped down to: 4212
if not modules then modules={} end modules ['util-tpl']={
version=1.001,
@@ -14498,6 +14874,7 @@ local report_template=logs.reporter("template")
local tostring,next=tostring,next
local format,sub,byte=string.format,string.sub,string.byte
local P,C,R,Cs,Cc,Carg,lpegmatch,lpegpatterns=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.match,lpeg.patterns
+local formatters=string.formatters
local replacer
local function replacekey(k,t,how,recursive)
local v=t[k]
@@ -14566,6 +14943,10 @@ local function replaceoptional(l,m,r,t,how,recurse)
local v=t[l]
return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
+local function replaceformatted(l,m,r,t,how,recurse)
+ local v=t[r]
+ return v and formatters[l](v)
+end
local single=P("%")
local double=P("%%")
local lquoted=P("%[")
@@ -14579,16 +14960,19 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
+local nolformatted=P(":")/"%%"
+local norformatted=P(":")/""
local noloptional=P("%?")/''
local noroptional=P("?%")/''
local nomoptional=P(":")/''
local args=Carg(1)*Carg(2)*Carg(3)
-local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local key=nosingle*((C((1-nosingle)^1)*args)/replacekey)*nosingle
+local quoted=nolquotedq*((C((1-norquotedq)^1)*args)/replacekeyquoted)*norquotedq
+local unquoted=nolquoted*((C((1-norquoted)^1)*args)/replacekeyunquoted)*norquoted
local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
+local formatted=nosingle*((Cs(nolformatted*(1-norformatted )^1)*norformatted*C((1-nosingle)^1)*args)/replaceformatted)*nosingle
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
+ replacer=Cs((unquoted+quoted+formatted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
@@ -14627,7 +15011,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sbx"] = package.loaded["util-sbx"] or true
--- original size: 20393, stripped down to: 13121
+-- original size: 21084, stripped down to: 13214
if not modules then modules={} end modules ['util-sbx']={
version=1.001,
@@ -14873,37 +15257,50 @@ local iopopen=sandbox.original(io.popen)
local reported={}
local function validcommand(name,program,template,checkers,defaults,variables,reporter,strict)
if validbinaries~=false and (validbinaries==true or validbinaries[program]) then
+ local binpath=nil
if variables then
for variable,value in next,variables do
- local checker=validators[checkers[variable]]
- if checker then
- value=checker(unquoted(value),strict)
- if value then
- variables[variable]=optionalquoted(value)
+ local chktype=checkers[variable]
+ if chktype=="verbose" then
+ else
+ local checker=validators[chktype]
+ if checker then
+ value=checker(unquoted(value),strict)
+ if value then
+ variables[variable]=optionalquoted(value)
+ else
+ report("variable %a with value %a fails the check",variable,value)
+ return
+ end
else
- report("variable %a with value %a fails the check",variable,value)
+ report("variable %a has no checker",variable)
return
end
- else
- report("variable %a has no checker",variable)
- return
end
end
for variable,default in next,defaults do
local value=variables[variable]
if not value or value=="" then
- local checker=validators[checkers[variable]]
- if checker then
- default=checker(unquoted(default),strict)
- if default then
- variables[variable]=optionalquoted(default)
- else
- report("variable %a with default %a fails the check",variable,default)
- return
+ local chktype=checkers[variable]
+ if chktype=="verbose" then
+ else
+ local checker=validators[chktype]
+ if checker then
+ default=checker(unquoted(default),strict)
+ if default then
+ variables[variable]=optionalquoted(default)
+ else
+ report("variable %a with default %a fails the check",variable,default)
+ return
+ end
end
end
end
end
+ binpath=variables.binarypath
+ end
+ if type(binpath)=="string" and binpath~="" then
+ program=binpath.."/"..program
end
local command=program.." "..replace(template,variables)
if reporter then
@@ -14938,7 +15335,8 @@ local runners={
if trace then
report("execute: %s",command)
end
- return osexecute(command)
+ local okay=osexecute(command)
+ return okay
end
end,
pipeto=function(...)
@@ -14972,7 +15370,7 @@ function sandbox.registerrunner(specification)
return
end
if validrunners[name] then
- report("invalid name, runner %a already defined")
+ report("invalid name, runner %a already defined",name)
return
end
local program=specification.program
@@ -15090,8 +15488,8 @@ if io then
end
if os then
overload(os.execute,binaryrunner,"os.execute")
- overload(os.spawn,dummyrunner,"os.spawn")
- overload(os.exec,dummyrunner,"os.exec")
+ overload(os.spawn,dummyrunner,"os.spawn")
+ overload(os.exec,dummyrunner,"os.exec")
overload(os.resultof,binaryrunner,"os.resultof")
overload(os.pipeto,binaryrunner,"os.pipeto")
overload(os.rename,filehandlertwo,"os.rename")
@@ -15116,13 +15514,6 @@ end
if zip then
zip.open=register(zip.open,filehandlerone,"zip.open")
end
-if fontloader then
- fontloader.open=register(fontloader.open,filehandlerone,"fontloader.open")
- fontloader.info=register(fontloader.info,filehandlerone,"fontloader.info")
-end
-if epdf then
- epdf.open=register(epdf.open,filehandlerone,"epdf.open")
-end
sandbox.registerroot=registerroot
sandbox.registerbinary=registerbinary
sandbox.registerlibrary=registerlibrary
@@ -15528,7 +15919,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-env"] = package.loaded["luat-env"] or true
--- original size: 6134, stripped down to: 4118
+-- original size: 6551, stripped down to: 4315
if not modules then modules={} end modules ['luat-env']={
version=1.001,
@@ -15537,7 +15928,7 @@ package.loaded["luat-env"] = package.loaded["luat-env"] or true
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local rawset,rawget,loadfile=rawset,rawget,loadfile
+local rawset,loadfile=rawset,loadfile
local gsub=string.gsub
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_lua=logs.reporter("resolvers","lua")
@@ -15584,6 +15975,12 @@ function environment.texfile(filename)
return resolvers.findfile(filename,'tex')
end
function environment.luafile(filename)
+ if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and file.suffix(filename)=="lua" then
+ local resolved=resolvers.findfile(file.replacesuffix(filename,"lmt")) or ""
+ if resolved~="" then
+ return resolved
+ end
+ end
local resolved=resolvers.findfile(filename,'tex') or ""
if resolved~="" then
return resolved
@@ -15695,7 +16092,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-zip"] = package.loaded["util-zip"] or true
--- original size: 18645, stripped down to: 11291
+-- original size: 19496, stripped down to: 10858
if not modules then modules={} end modules ['util-zip']={
version=1.001,
@@ -15706,7 +16103,7 @@ if not modules then modules={} end modules ['util-zip']={
local type,tostring,tonumber=type,tostring,tonumber
local sort=table.sort
local find,format,sub,gsub=string.find,string.format,string.sub,string.gsub
-local osdate,ostime=os.date,os.time
+local osdate,ostime,osclock=os.date,os.time,os.clock
local ioopen=io.open
local loaddata,savedata=io.loaddata,io.savedata
local filejoin,isdir,dirname,mkdirs=file.join,lfs.isdir,file.dirname,dir.mkdirs
@@ -15721,25 +16118,19 @@ local getposition=files.getposition
local band=bit32.band
local rshift=bit32.rshift
local lshift=bit32.lshift
-local decompress,calculatecrc
-if flate then
- decompress=flate.flate_decompress
- calculatecrc=flate.update_crc32
-else
+local decompress,expandsize,calculatecrc
local zlibdecompress=zlib.decompress
+ local zlibexpandsize=zlib.expandsize
local zlibchecksum=zlib.crc32
- decompress=function(source,targetsize)
- local target=zlibdecompress(source,-15)
- if target then
- return target
- else
- return false,1
- end
+ decompress=function(source)
+ return zlibdecompress(source,-15)
end
+ expandsize=zlibexpandsize and function(source,targetsize)
+ return zlibexpandsize(source,targetsize,-15)
+ end or decompress
calculatecrc=function(buffer,initial)
return zlibchecksum(initial or 0,buffer)
end
-end
local zipfiles={}
utilities.zipfiles=zipfiles
local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
@@ -15864,7 +16255,11 @@ local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
setposition(handle,position)
local result=readstring(handle,compressed)
if data.method==8 then
- result=decompress(result,data.uncompressed)
+ if expandsize then
+ result=expandsize(result,data.uncompressed)
+ else
+ result=decompress(result)
+ end
end
if check and data.crc32~=calculatecrc(result) then
print("checksum mismatch")
@@ -15883,14 +16278,14 @@ local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
zipfiles.list=getziplist
zipfiles.found=foundzipfile
end
-if flate then do
+if xzip then
local writecardinal1=files.writebyte
local writecardinal2=files.writecardinal2le
local writecardinal4=files.writecardinal4le
local logwriter=logs.writer
local globpattern=dir.globpattern
- local compress=flate.flate_compress
- local checksum=flate.update_crc32
+ local compress=xzip.compress
+ local checksum=xzip.crc32
local function fromdostime(dostime,dosdate)
return ostime {
year=rshift(dosdate,9)+1980,
@@ -16087,27 +16482,33 @@ if flate then do
local count=#list
local step=number.idiv(count,10)
local done=0
+ local steps=verbose=="steps"
+ local time=steps and osclock()
for i=1,count do
local l=list[i]
local n=l.filename
local d=unzipfile(z,n)
- local p=filejoin(path,n)
- if mkdirs(dirname(p)) then
- if verbose=="steps" then
- total=total+#d
- done=done+1
- if done>=step then
- done=0
- logwriter(format("%4i files of %4i done, %10i bytes",i,count,total))
+ if d then
+ local p=filejoin(path,n)
+ if mkdirs(dirname(p)) then
+ if steps then
+ total=total+#d
+ done=done+1
+ if done>=step then
+ done=0
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",i,count,total,osclock()-time))
+ end
+ elseif verbose then
+ logwriter(n)
end
- elseif verbose then
- logwriter(n)
+ savedata(p,d)
end
- savedata(p,d)
+ else
+ logwriter(format("problem with file %s",n))
end
end
- if verbose=="steps" then
- logwriter(format("%4i files of %4i done, %10i bytes",count,count,total))
+ if steps then
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",count,count,total,osclock()-time))
end
closezipfile(z)
return true
@@ -16118,37 +16519,8 @@ if flate then do
end
zipfiles.zipdir=zipdir
zipfiles.unzipdir=unzipdir
-end end
-if flate then
- local streams=utilities.streams
- local openfile=streams.open
- local closestream=streams.close
- local setposition=streams.setposition
- local getsize=streams.size
- local readcardinal4=streams.readcardinal4le
- local getstring=streams.getstring
- local decompress=flate.gz_decompress
- function zipfiles.gunzipfile(filename)
- local strm=openfile(filename)
- if strm then
- setposition(strm,getsize(strm)-4+1)
- local size=readcardinal4(strm)
- local data=decompress(getstring(strm),size)
- closestream(strm)
- return data
- end
- end
-elseif gzip then
- local openfile=gzip.open
- function zipfiles.gunzipfile(filename)
- local g=openfile(filename,"rb")
- if g then
- local d=g:read("*a")
- d:close()
- return d
- end
- end
end
+zipfiles.gunzipfile=gzip.load
end -- of closure
@@ -16157,7 +16529,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
--- original size: 60383, stripped down to: 35698
+-- original size: 61191, stripped down to: 35864
if not modules then modules={} end modules ['lxml-tab']={
version=1.001,
@@ -16881,7 +17253,10 @@ local slash=P('/')
local colon=P(':')
local semicolon=P(';')
local ampersand=P('&')
-local valid=R('az','AZ','09')+S('_-.')
+local valid_0=R("\128\255")
+local valid_1=R('az','AZ')+S('_')+valid_0
+local valid_2=valid_1+R('09')+S('-.')
+local valid=valid_1*valid_2^0
local name_yes=C(valid^1)*colon*C(valid^1)
local name_nop=C(P(true))*C(valid^1)
local name=name_yes+name_nop
@@ -16917,8 +17292,9 @@ end
local function entityfile(pattern,k,v,n)
if n then
local okay,data
- if resolvers then
- okay,data=resolvers.loadbinfile(n)
+ local loadbinfile=resolvers and resolvers.loadbinfile
+ if loadbinfile then
+ okay,data=loadbinfile(n)
else
data=io.loaddata(n)
okay=data and data~=""
@@ -17027,12 +17403,14 @@ publicentityfile+publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*op
}
return grammar_parsed_text_one,grammar_parsed_text_two,grammar_unparsed_text
end
-grammar_parsed_text_one_nop,
-grammar_parsed_text_two_nop,
-grammar_unparsed_text_nop=install(space,spacing,anything)
-grammar_parsed_text_one_yes,
-grammar_parsed_text_two_yes,
-grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl)
+local
+ grammar_parsed_text_one_nop,
+ grammar_parsed_text_two_nop,
+ grammar_unparsed_text_nop=install(space,spacing,anything)
+local
+ grammar_parsed_text_one_yes,
+ grammar_parsed_text_two_yes,
+ grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl)
local function _xmlconvert_(data,settings,detail)
settings=settings or {}
preparexmlstate(settings)
@@ -17613,7 +17991,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-lpt"] = package.loaded["lxml-lpt"] or true
--- original size: 55145, stripped down to: 30992
+-- original size: 54626, stripped down to: 31255
if not modules then modules={} end modules ['lxml-lpt']={
version=1.001,
@@ -18095,6 +18473,8 @@ local builtin={
lastindex="(#ll.__p__.dt or 1)",
lastelement="(ll.__p__.en or 1)",
last="#list",
+ list="list",
+ self="ll",
rootposition="order",
order="order",
element="(ll.ei or 1)",
@@ -18203,7 +18583,8 @@ local function register_selector(specification)
end
local function register_expression(expression)
local converted=lpegmatch(converter,expression)
- local runner=load(format(template_e,converted))
+ local wrapped=format(template_e,converted)
+ local runner=load(wrapped)
runner=(runner and runner()) or function() errorrunner_e(expression,converted) end
return { kind="expression",expression=expression,converted=converted,evaluator=runner }
end
@@ -18575,6 +18956,20 @@ expressions.count=function(e,pattern)
local collected=applylpath(e,pattern)
return pattern and (collected and #collected) or 0
end
+expressions.attribute=function(e,name,value)
+ if type(e)=="table" and name then
+ local a=e.at
+ if a then
+ local v=a[name]
+ if value then
+ return v==value
+ else
+ return v
+ end
+ end
+ end
+ return nil
+end
expressions.oneof=function(s,...)
for i=1,select("#",...) do
if s==select(i,...) then
@@ -18621,7 +19016,7 @@ function expressions.contains(str,pattern)
end
return false
end
-function xml.expressions.idstring(str)
+function expressions.idstring(str)
return type(str)=="string" and gsub(str,"^#","") or ""
end
local function traverse(root,pattern,handle)
@@ -20394,7 +20789,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 11099, stripped down to: 7152
+-- original size: 11019, stripped down to: 7086
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -20407,9 +20802,9 @@ local next,type,getmetatable,rawset=next,type,getmetatable,rawset
local gsub,find,gmatch,char=string.gsub,string.find,string.gmatch,string.char
local filedirname,filebasename,filejoin=file.dirname,file.basename,file.join
local ostype,osname,osuname,ossetenv,osgetenv=os.type,os.name,os.uname,os.setenv,os.getenv
+local sortedpairs=table.sortedpairs
local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
-local trace_detail=false trackers.register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers.register("resolvers.expansions",function(v) trace_expansions=v end)
local report_initialization=logs.reporter("resolvers","initialization")
resolvers=resolvers or {}
@@ -20618,7 +21013,7 @@ if ostype=="unix" then
rawset(t,k,v)
end
local colon=P(":")
- for k,v in table.sortedpairs(prefixes) do
+ for k,v in sortedpairs(prefixes) do
if p then
p=P(k)+p
else
@@ -20645,7 +21040,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 18154, stripped down to: 10416
+-- original size: 18179, stripped down to: 10432
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -20929,7 +21324,7 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
scancache[sub(full,1,-2)]=files
return files,remap,n,m,r
end
-function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+local function scanfiles(path,branch,usecache,onlyonce,tolerant)
local realpath=resolveprefix(path)
if usecache then
local content=fullcache[realpath]
@@ -20984,8 +21379,9 @@ function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
statistics.stoptiming(timer)
return content
end
+resolvers.scanfiles=scanfiles
function resolvers.simplescanfiles(path,branch,usecache)
- return resolvers.scanfiles(path,branch,usecache,true,true)
+ return scanfiles(path,branch,usecache,true,true)
end
function resolvers.scandata()
table.sort(scanned)
@@ -21052,7 +21448,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-env"] = package.loaded["data-env"] or true
--- original size: 9360, stripped down to: 6312
+-- original size: 9400, stripped down to: 6347
if not modules then modules={} end modules ['data-env']={
version=1.001,
@@ -21062,7 +21458,7 @@ if not modules then modules={} end modules ['data-env']={
license="see context related readme files",
}
local lower,gsub=string.lower,string.gsub
-local next=next
+local next,rawget=next,rawget
local resolvers=resolvers
local allocate=utilities.storage.allocate
local setmetatableindex=table.setmetatableindex
@@ -21143,13 +21539,13 @@ local relations=allocate {
mp={
names={ "mp" },
variable='MPINPUTS',
- suffixes={ 'mp','mpvi','mpiv','mpii' },
+ suffixes={ 'mp','mpvi','mpiv','mpxl','mpii' },
usertype=true,
},
tex={
names={ "tex" },
variable='TEXINPUTS',
- suffixes={ "tex","mkvi","mkiv","mkii","cld","lfg","xml" },
+ suffixes={ "tex","mkiv","mkvi","mkxl","mklx","mkii","cld","lfg","xml" },
usertype=true,
},
icc={
@@ -21337,7 +21733,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 16284, stripped down to: 10938
+-- original size: 16099, stripped down to: 11379
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -21346,48 +21742,83 @@ if not modules then modules={} end modules ['data-tmp']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local format,lower,gsub,concat=string.format,string.lower,string.gsub,table.concat
-local concat=table.concat
-local mkdirs,isdir,isfile=dir.mkdirs,lfs.isdir,lfs.isfile
-local addsuffix,is_writable,is_readable=file.addsuffix,file.is_writable,file.is_readable
-local formatters=string.formatters
local next,type=next,type
+local pcall,loadfile,collectgarbage=pcall,loadfile,collectgarbage
+local format,lower,gsub=string.format,string.lower,string.gsub
+local concat,serialize,fastserialize,serializetofile=table.concat,table.serialize,table.fastserialize,table.tofile
+local mkdirs,expanddirname,isdir,isfile=dir.mkdirs,dir.expandname,lfs.isdir,lfs.isfile
+local is_writable,is_readable=file.is_writable,file.is_readable
+local collapsepath,joinfile,addsuffix,dirname=file.collapsepath,file.join,file.addsuffix,file.dirname
+local savedata=file.savedata
+local formatters=string.formatters
+local osexit,osdate,osuuid=os.exit,os.date,os.uuid
+local removefile=os.remove
+local md5hex=md5.hex
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local report_caches=logs.reporter("resolvers","caches")
local report_resolvers=logs.reporter("resolvers","caching")
local resolvers=resolvers
local cleanpath=resolvers.cleanpath
-local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
-local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
-local compile=utilities.lua.compile
-function utilities.lua.compile(luafile,lucfile,cleanup,strip)
- if cleanup==nil then cleanup=directive_cleanup end
- if strip==nil then strip=directive_strip end
- return compile(luafile,lucfile,cleanup,strip)
+local resolvepath=resolvers.resolve
+local luautilities=utilities.lua
+do
+ local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
+ local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
+ local compilelua=luautilities.compile
+ function luautilities.compile(luafile,lucfile,cleanup,strip)
+ if cleanup==nil then cleanup=directive_cleanup end
+ if strip==nil then strip=directive_strip end
+ return compilelua(luafile,lucfile,cleanup,strip)
+ end
end
caches=caches or {}
local caches=caches
-local luasuffixes=utilities.lua.suffixes
-caches.base=caches.base or "luatex-cache"
-caches.more=caches.more or "context"
-caches.direct=false
-caches.tree=false
-caches.force=true
-caches.ask=false
-caches.relocate=false
+local writable=nil
+local readables={}
+local usedreadables={}
+local compilelua=luautilities.compile
+local luasuffixes=luautilities.suffixes
+caches.base=caches.base or "luatex-cache"
+caches.more=caches.more or "context"
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
-directives.register("system.caches.fast",function(v) caches.fast=true end)
-local writable,readables,usedreadables=nil,{},{}
+local direct_cache=false
+local fast_cache=false
+local cache_tree=false
+directives.register("system.caches.direct",function(v) direct_cache=true end)
+directives.register("system.caches.fast",function(v) fast_cache=true end)
+local function configfiles()
+ return concat(resolvers.configurationfiles(),";")
+end
+local function hashed(tree)
+ tree=gsub(tree,"[\\/]+$","")
+ tree=lower(tree)
+ local hash=md5hex(tree)
+ if trace_cache or trace_locating then
+ report_caches("hashing tree %a, hash %a",tree,hash)
+ end
+ return hash
+end
+local function treehash()
+ local tree=configfiles()
+ if not tree or tree=="" then
+ return false
+ else
+ return hashed(tree)
+ end
+end
+caches.hashed=hashed
+caches.treehash=treehash
+caches.configfiles=configfiles
local function identify()
local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
if texmfcaches then
for k=1,#texmfcaches do
local cachepath=texmfcaches[k]
if cachepath~="" then
- cachepath=resolvers.resolve(cachepath)
- cachepath=resolvers.cleanpath(cachepath)
- cachepath=file.collapsepath(cachepath)
+ cachepath=resolvepath(cachepath)
+ cachepath=cleanpath(cachepath)
+ cachepath=collapsepath(cachepath)
local valid=isdir(cachepath)
if valid then
if is_readable(cachepath) then
@@ -21396,16 +21827,14 @@ local function identify()
writable=cachepath
end
end
- elseif not writable and caches.force then
- local cacheparent=file.dirname(cachepath)
- if is_writable(cacheparent) and true then
- if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath),"no",{ "yes","no" })=="yes" then
- mkdirs(cachepath)
- if isdir(cachepath) and is_writable(cachepath) then
- report_caches("path %a created",cachepath)
- writable=cachepath
- readables[#readables+1]=cachepath
- end
+ elseif not writable then
+ local cacheparent=dirname(cachepath)
+ if is_writable(cacheparent) then
+ mkdirs(cachepath)
+ if isdir(cachepath) and is_writable(cachepath) then
+ report_caches("path %a created",cachepath)
+ writable=cachepath
+ readables[#readables+1]=cachepath
end
end
end
@@ -21418,8 +21847,8 @@ local function identify()
local cachepath=texmfcaches[k]
cachepath=resolvers.expansion(cachepath)
if cachepath~="" then
- cachepath=resolvers.resolve(cachepath)
- cachepath=resolvers.cleanpath(cachepath)
+ cachepath=resolvepath(cachepath)
+ cachepath=cleanpath(cachepath)
local valid=isdir(cachepath)
if valid and is_readable(cachepath) then
if not writable and is_writable(cachepath) then
@@ -21433,23 +21862,25 @@ local function identify()
end
if not writable then
report_caches("fatal error: there is no valid writable cache path defined")
- os.exit()
+ osexit()
elseif #readables==0 then
report_caches("fatal error: there is no valid readable cache path defined")
- os.exit()
+ osexit()
end
- writable=dir.expandname(resolvers.cleanpath(writable))
- local base,more,tree=caches.base,caches.more,caches.tree or caches.treehash()
+ writable=expanddirname(cleanpath(writable))
+ local base=caches.base
+ local more=caches.more
+ local tree=cache_tree or treehash()
if tree then
- caches.tree=tree
+ cache_tree=tree
writable=mkdirs(writable,base,more,tree)
for i=1,#readables do
- readables[i]=file.join(readables[i],base,more,tree)
+ readables[i]=joinfile(readables[i],base,more,tree)
end
else
writable=mkdirs(writable,base,more)
for i=1,#readables do
- readables[i]=file.join(readables[i],base,more)
+ readables[i]=joinfile(readables[i],base,more)
end
end
if trace_cache then
@@ -21486,27 +21917,8 @@ function caches.usedpaths(separator)
return writable or "?"
end
end
-function caches.configfiles()
- return concat(resolvers.configurationfiles(),";")
-end
-function caches.hashed(tree)
- tree=gsub(tree,"[\\/]+$","")
- tree=lower(tree)
- local hash=md5.hex(tree)
- if trace_cache or trace_locating then
- report_caches("hashing tree %a, hash %a",tree,hash)
- end
- return hash
-end
-function caches.treehash()
- local tree=caches.configfiles()
- if not tree or tree=="" then
- return false
- else
- return caches.hashed(tree)
- end
-end
-local r_cache,w_cache={},{}
+local r_cache={}
+local w_cache={}
local function getreadablepaths(...)
local tags={... }
local hash=concat(tags,"/")
@@ -21516,7 +21928,7 @@ local function getreadablepaths(...)
if #tags>0 then
done={}
for i=1,#readables do
- done[i]=file.join(readables[i],...)
+ done[i]=joinfile(readables[i],...)
end
else
done=readables
@@ -21540,17 +21952,25 @@ local function getwritablepath(...)
end
return done
end
-caches.getreadablepaths=getreadablepaths
-caches.getwritablepath=getwritablepath
-function caches.getfirstreadablefile(filename,...)
- local fullname,path=caches.setfirstwritablefile(filename,...)
+local function setfirstwritablefile(filename,...)
+ local wr=getwritablepath(...)
+ local fullname=joinfile(wr,filename)
+ return fullname,wr
+end
+local function setluanames(path,name)
+ return
+ format("%s/%s.%s",path,name,luasuffixes.tma),
+ format("%s/%s.%s",path,name,luasuffixes.tmc)
+end
+local function getfirstreadablefile(filename,...)
+ local fullname,path=setfirstwritablefile(filename,...)
if is_readable(fullname) then
return fullname,path
end
local rd=getreadablepaths(...)
for i=1,#rd do
local path=rd[i]
- local fullname=file.join(path,filename)
+ local fullname=joinfile(path,filename)
if is_readable(fullname) then
usedreadables[i]=true
return fullname,path
@@ -21558,19 +21978,11 @@ function caches.getfirstreadablefile(filename,...)
end
return fullname,path
end
-function caches.setfirstwritablefile(filename,...)
- local wr=getwritablepath(...)
- local fullname=file.join(wr,filename)
- return fullname,wr
-end
-function caches.define(category,subcategory)
- return function()
- return getwritablepath(category,subcategory)
- end
-end
-function caches.setluanames(path,name)
- return format("%s/%s.%s",path,name,luasuffixes.tma),format("%s/%s.%s",path,name,luasuffixes.tmc)
-end
+caches.getreadablepaths=getreadablepaths
+caches.getwritablepath=getwritablepath
+caches.setfirstwritablefile=setfirstwritablefile
+caches.getfirstreadablefile=getfirstreadablefile
+caches.setluanames=setluanames
function caches.loaddata(readables,name,writable)
if type(readables)=="string" then
readables={ readables }
@@ -21578,21 +21990,22 @@ function caches.loaddata(readables,name,writable)
for i=1,#readables do
local path=readables[i]
local loader=false
- local tmaname,tmcname=caches.setluanames(path,name)
+ local state=false
+ local tmaname,tmcname=setluanames(path,name)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
if not loader and isfile(tmaname) then
- local tmacrap,tmcname=caches.setluanames(writable,name)
+ local tmacrap,tmcname=setluanames(writable,name)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
if not loader then
- loader=loadfile(tmaname)
+ state,loader=pcall(loadfile,tmaname)
end
end
if loader then
@@ -21604,21 +22017,21 @@ function caches.loaddata(readables,name,writable)
return false
end
function caches.is_writable(filepath,filename)
- local tmaname,tmcname=caches.setluanames(filepath,filename)
+ local tmaname,tmcname=setluanames(filepath,filename)
return is_writable(tmaname)
end
-local saveoptions={ compact=true }
-function caches.savedata(filepath,filename,data,raw)
- local tmaname,tmcname=caches.setluanames(filepath,filename)
- data.cache_uuid=os.uuid()
- if caches.fast then
- file.savedata(tmaname,table.fastserialize(data,true))
- elseif caches.direct then
- file.savedata(tmaname,table.serialize(data,true,saveoptions))
+local saveoptions={ compact=true,accurate=not JITSUPPORTED }
+function caches.savedata(filepath,filename,data,fast)
+ local tmaname,tmcname=setluanames(filepath,filename)
+ data.cache_uuid=osuuid()
+ if fast or fast_cache then
+ savedata(tmaname,fastserialize(data,true))
+ elseif direct_cache then
+ savedata(tmaname,serialize(data,true,saveoptions))
else
- table.tofile(tmaname,data,true,saveoptions)
+ serializetofile(tmaname,data,true,saveoptions)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
end
local content_state={}
function caches.contentstate()
@@ -21626,11 +22039,14 @@ function caches.contentstate()
end
function caches.loadcontent(cachename,dataname,filename)
if not filename then
- local name=caches.hashed(cachename)
- local full,path=caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename=file.join(path,name)
+ local name=hashed(cachename)
+ local full,path=getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=joinfile(path,name)
+ end
+ local state,blob=pcall(loadfile,addsuffix(filename,luasuffixes.luc))
+ if not blob then
+ state,blob=pcall(loadfile,addsuffix(filename,luasuffixes.lua))
end
- local blob=loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data=blob()
if data and data.content then
@@ -21663,9 +22079,9 @@ function caches.collapsecontent(content)
end
function caches.savecontent(cachename,dataname,content,filename)
if not filename then
- local name=caches.hashed(cachename)
- local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename=file.join(path,name)
+ local name=hashed(cachename)
+ local full,path=setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=joinfile(path,name)
end
local luaname=addsuffix(filename,luasuffixes.lua)
local lucname=addsuffix(filename,luasuffixes.luc)
@@ -21676,17 +22092,17 @@ function caches.savecontent(cachename,dataname,content,filename)
type=dataname,
root=cachename,
version=resolvers.cacheversion,
- date=os.date("%Y-%m-%d"),
- time=os.date("%H:%M:%S"),
+ date=osdate("%Y-%m-%d"),
+ time=osdate("%H:%M:%S"),
content=content,
- uuid=os.uuid(),
+ uuid=osuuid(),
}
- local ok=io.savedata(luaname,table.serialize(data,true))
+ local ok=savedata(luaname,serialize(data,true))
if ok then
if trace_locating then
report_resolvers("category %a, cachename %a saved in %a",dataname,cachename,luaname)
end
- if utilities.lua.compile(luaname,lucname) then
+ if compilelua(luaname,lucname) then
if trace_locating then
report_resolvers("%a compiled to %a",dataname,lucname)
end
@@ -21695,7 +22111,7 @@ function caches.savecontent(cachename,dataname,content,filename)
if trace_locating then
report_resolvers("compiling failed for %a, deleting file %a",dataname,lucname)
end
- os.remove(lucname)
+ removefile(lucname)
end
elseif trace_locating then
report_resolvers("unable to save %a in %a (access error)",dataname,luaname)
@@ -21709,7 +22125,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-met"] = package.loaded["data-met"] or true
--- original size: 5310, stripped down to: 3784
+-- original size: 5518, stripped down to: 3854
if not modules then modules={} end modules ['data-met']={
version=1.100,
@@ -21718,31 +22134,45 @@ if not modules then modules={} end modules ['data-met']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,format=string.find,string.format
-local sequenced=table.sequenced
+local type=type
+local find=string.find
local addurlscheme,urlhashed=url.addscheme,url.hashed
+local collapsepath,joinfile=file.collapsepath,file.join
+local report_methods=logs.reporter("resolvers","methods")
local trace_locating=false
local trace_methods=false
trackers.register("resolvers.locating",function(v) trace_methods=v end)
trackers.register("resolvers.methods",function(v) trace_methods=v end)
-local report_methods=logs.reporter("resolvers","methods")
local allocate=utilities.storage.allocate
local resolvers=resolvers
local registered={}
local function splitmethod(filename)
if not filename then
- return { scheme="unknown",original=filename }
+ return {
+ scheme="unknown",
+ original=filename,
+ }
end
if type(filename)=="table" then
return filename
end
- filename=file.collapsepath(filename,".")
+ filename=collapsepath(filename,".")
if not find(filename,"://",1,true) then
- return { scheme="file",path=filename,original=filename,filename=filename }
+ return {
+ scheme="file",
+ path=filename,
+ original=filename,
+ filename=filename,
+ }
end
- local specification=url.hashed(filename)
+ local specification=urlhashed(filename)
if not specification.scheme or specification.scheme=="" then
- return { scheme="file",path=filename,original=filename,filename=filename }
+ return {
+ scheme="file",
+ path=filename,
+ original=filename,
+ filename=filename,
+ }
else
return specification
end
@@ -21751,7 +22181,8 @@ resolvers.splitmethod=splitmethod
local function methodhandler(what,first,...)
local method=registered[what]
if method then
- local how,namespace=method.how,method.namespace
+ local how=method.how
+ local namespace=method.namespace
if how=="uri" or how=="url" then
local specification=splitmethod(first)
local scheme=specification.scheme
@@ -21797,7 +22228,10 @@ local function methodhandler(what,first,...)
end
resolvers.methodhandler=methodhandler
function resolvers.registermethod(name,namespace,how)
- registered[name]={ how=how or "tag",namespace=namespace }
+ registered[name]={
+ how=how or "tag",
+ namespace=namespace
+ }
namespace["byscheme"]=function(scheme,filename,...)
if scheme=="file" then
return methodhandler(name,filename,...)
@@ -21806,7 +22240,7 @@ function resolvers.registermethod(name,namespace,how)
end
end
end
-local concatinators=allocate { notfound=file.join }
+local concatinators=allocate { notfound=joinfile }
local locators=allocate { notfound=function() end }
local hashers=allocate { notfound=function() end }
local generators=allocate { notfound=function() end }
@@ -21827,7 +22261,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 68195, stripped down to: 43680
+-- original size: 69576, stripped down to: 44470
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -21838,7 +22272,8 @@ if not modules then modules={} end modules ['data-res']={
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
local concat,insert,remove=table.concat,table.insert,table.remove
-local next,type,rawget=next,type,rawget
+local next,type,rawget,loadfile=next,type,rawget,loadfile
+local mergedtable=table.merged
local os=os
local P,S,R,C,Cc,Cs,Ct,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cc,lpeg.Cs,lpeg.Ct,lpeg.Carg
local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
@@ -21854,13 +22289,14 @@ local joinpath=file.joinpath
local is_qualified_path=file.is_qualified_path
local allocate=utilities.storage.allocate
local settings_to_array=utilities.parsers.settings_to_array
+local urlhasscheme=url.hasscheme
local getcurrentdir=lfs.currentdir
local isfile=lfs.isfile
local isdir=lfs.isdir
local setmetatableindex=table.setmetatableindex
local luasuffixes=utilities.lua.suffixes
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
-local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
+local trace_details=false trackers .register("resolvers.details",function(v) trace_details=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
@@ -21879,10 +22315,17 @@ local ostype,osname,osenv,ossetenv,osgetenv=os.type,os.name,os.env,os.setenv,os.
resolvers.cacheversion="1.100"
resolvers.configbanner=""
resolvers.homedir=environment.homedir
-resolvers.criticalvars=allocate { "SELFAUTOLOC","SELFAUTODIR","SELFAUTOPARENT","TEXMFCNF","TEXMF","TEXOS" }
resolvers.luacnfname="texmfcnf.lua"
resolvers.luacnffallback="contextcnf.lua"
resolvers.luacnfstate="unknown"
+local criticalvars={
+ "SELFAUTOLOC",
+ "SELFAUTODIR",
+ "SELFAUTOPARENT",
+ "TEXMFCNF",
+ "TEXMF",
+ "TEXOS",
+}
if environment.default_texmfcnf then
resolvers.luacnfspec="home:texmf/web2c;"..environment.default_texmfcnf
else
@@ -21902,13 +22345,20 @@ local dangerous=resolvers.dangerous
local suffixmap=resolvers.suffixmap
resolvers.defaultsuffixes={ "tex" }
local instance=nil
-function resolvers.setenv(key,value,raw)
+local variable
+local expansion
+local setenv
+local getenv
+local formatofsuffix=resolvers.formatofsuffix
+local splitpath=resolvers.splitpath
+local splitmethod=resolvers.splitmethod
+setenv=function(key,value,raw)
if instance then
instance.environment[key]=value
ossetenv(key,raw and value or resolveprefix(value))
end
end
-local function getenv(key)
+getenv=function(key)
local value=rawget(instance.environment,key)
if value and value~="" then
return value
@@ -21918,94 +22368,97 @@ local function getenv(key)
end
end
resolvers.getenv=getenv
-resolvers.env=getenv
-local function resolvevariable(k)
- return instance.expansions[k]
-end
+resolvers.setenv=setenv
local dollarstripper=lpeg.stripper("$")
local inhibitstripper=P("!")^0*Cs(P(1)^0)
-local somevariable=P("$")/""
-local somekey=C(R("az","AZ","09","__","--")^1)
-local somethingelse=P(";")*((1-S("!{}/\\"))^1*P(";")/"")+P(";")*(P(";")/"")+P(1)
-local variableexpander=Cs((somevariable*(somekey/resolvevariable)+somethingelse)^1 )
-local cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
-local variablecleaner=Cs((cleaner+P(1))^0)
-local somevariable=R("az","AZ","09","__","--")^1/resolvevariable
-local variable=(P("$")/"")*(somevariable+(P("{")/"")*somevariable*(P("}")/""))
-local variableresolver=Cs((variable+P(1))^0)
-local function expandedvariable(var)
- return lpegmatch(variableexpander,var) or var
-end
-function resolvers.reset()
- if trace_locating then
- report_resolving("creating instance")
- end
- local environment={}
- local variables={}
- local expansions={}
- local order={}
- instance={
- environment=environment,
- variables=variables,
- expansions=expansions,
- order=order,
- files={},
- setups={},
- found={},
- foundintrees={},
- hashes={},
- hashed={},
- pathlists=false,
- specification={},
- lists={},
- data={},
- fakepaths={},
- remember=true,
- diskcache=true,
- renewcache=false,
- renewtree=false,
- loaderror=false,
- savelists=true,
- pattern=nil,
- force_suffixes=true,
- pathstack={},
- }
- setmetatableindex(variables,function(t,k)
- local v
- for i=1,#order do
- v=order[i][k]
+local expandedvariable,resolvedvariable do
+ local function resolveinstancevariable(k)
+ return instance.expansions[k]
+ end
+ local p_variable=P("$")/""
+ local p_key=C(R("az","AZ","09","__","--")^1)
+ local p_whatever=P(";")*((1-S("!{}/\\"))^1*P(";")/"")+P(";")*(P(";")/"")+P(1)
+ local variableexpander=Cs((p_variable*(p_key/resolveinstancevariable)+p_whatever)^1 )
+ local p_cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
+ local variablecleaner=Cs((p_cleaner+P(1))^0)
+ local p_variable=R("az","AZ","09","__","--")^1/resolveinstancevariable
+ local p_variable=(P("$")/"")*(p_variable+(P("{")/"")*p_variable*(P("}")/""))
+ local variableresolver=Cs((p_variable+P(1))^0)
+ expandedvariable=function(var)
+ return lpegmatch(variableexpander,var) or var
+ end
+ function resolvers.reset()
+ if trace_locating then
+ report_resolving("creating instance")
+ end
+ local environment={}
+ local variables={}
+ local expansions={}
+ local order={}
+ instance={
+ environment=environment,
+ variables=variables,
+ expansions=expansions,
+ order=order,
+ files={},
+ setups={},
+ found={},
+ foundintrees={},
+ hashes={},
+ hashed={},
+ pathlists=false,
+ specification={},
+ lists={},
+ data={},
+ fakepaths={},
+ remember=true,
+ diskcache=true,
+ renewcache=false,
+ renewtree=false,
+ loaderror=false,
+ savelists=true,
+ pattern=nil,
+ force_suffixes=true,
+ pathstack={},
+ }
+ setmetatableindex(variables,function(t,k)
+ local v
+ for i=1,#order do
+ v=order[i][k]
+ if v~=nil then
+ t[k]=v
+ return v
+ end
+ end
+ if v==nil then
+ v=""
+ end
+ t[k]=v
+ return v
+ end)
+ local repath=resolvers.repath
+ setmetatableindex(environment,function(t,k)
+ local v=osgetenv(k)
+ if v==nil then
+ v=variables[k]
+ end
if v~=nil then
- t[k]=v
- return v
+ v=checkedvariable(v) or ""
end
- end
- if v==nil then
- v=""
- end
- t[k]=v
- return v
- end)
- setmetatableindex(environment,function(t,k)
- local v=osgetenv(k)
- if v==nil then
- v=variables[k]
- end
- if v~=nil then
- v=checkedvariable(v) or ""
- end
- v=resolvers.repath(v)
- t[k]=v
- return v
- end)
- setmetatableindex(expansions,function(t,k)
- local v=environment[k]
- if type(v)=="string" then
- v=lpegmatch(variableresolver,v)
- v=lpegmatch(variablecleaner,v)
- end
- t[k]=v
- return v
- end)
+ v=repath(v)
+ t[k]=v
+ return v
+ end)
+ setmetatableindex(expansions,function(t,k)
+ local v=environment[k]
+ if type(v)=="string" then
+ v=lpegmatch(variableresolver,v)
+ v=lpegmatch(variablecleaner,v)
+ end
+ t[k]=v
+ return v
+ end)
+ end
end
function resolvers.initialized()
return instance~=nil
@@ -22019,31 +22472,33 @@ local function reset_caches()
instance.lists={}
instance.pathlists=false
end
-local slash=P("/")
-local pathexpressionpattern=Cs (
- Cc("^")*(
- Cc("%")*S(".-")+slash^2*P(-1)/"/.*"
+local makepathexpression do
+ local slash=P("/")
+ local pathexpressionpattern=Cs (
+ Cc("^")*(
+ Cc("%")*S(".-")+slash^2*P(-1)/"/.*"
+slash^2/"/"+(1-slash)*P(-1)*Cc("/")+P(1)
- )^1*Cc("$")
-)
-local cache={}
-local function makepathexpression(str)
- if str=="." then
- return "^%./$"
- else
- local c=cache[str]
- if not c then
- c=lpegmatch(pathexpressionpattern,str)
- cache[str]=c
+ )^1*Cc("$")
+ )
+ local cache={}
+ makepathexpression=function(str)
+ if str=="." then
+ return "^%./$"
+ else
+ local c=cache[str]
+ if not c then
+ c=lpegmatch(pathexpressionpattern,str)
+ cache[str]=c
+ end
+ return c
end
- return c
end
end
local function reportcriticalvariables(cnfspec)
if trace_locating then
- for i=1,#resolvers.criticalvars do
- local k=resolvers.criticalvars[i]
- local v=resolvers.getenv(k) or "unknown"
+ for i=1,#criticalvars do
+ local k=criticalvars[i]
+ local v=getenv(k) or "unknown"
report_resolving("variable %a set to %a",k,v)
end
report_resolving()
@@ -22065,7 +22520,7 @@ local function identify_configuration_files()
resolvers.luacnfstate="environment"
end
reportcriticalvariables(cnfspec)
- local cnfpaths=expandedpathfromlist(resolvers.splitpath(cnfspec))
+ local cnfpaths=expandedpathfromlist(splitpath(cnfspec))
local function locatecnf(luacnfname,kind)
for i=1,#cnfpaths do
local filepath=cnfpaths[i]
@@ -22098,6 +22553,8 @@ local function identify_configuration_files()
end
local function load_configuration_files()
local specification=instance.specification
+ local setups=instance.setups
+ local order=instance.order
if #specification>0 then
local luacnfname=resolvers.luacnfname
for i=1,#specification do
@@ -22107,7 +22564,6 @@ local function load_configuration_files()
local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
- local setups=instance.setups
local data=blob()
local parent=data and data.parent
if parent then
@@ -22118,7 +22574,7 @@ local function load_configuration_files()
local parentdata=blob()
if parentdata then
report_resolving("loading configuration file %a",filename)
- data=table.merged(parentdata,data)
+ data=mergedtable(parentdata,data)
end
end
end
@@ -22150,7 +22606,7 @@ local function load_configuration_files()
if trace_locating then
report_resolving("reloading configuration due to TEXMF redefinition")
end
- resolvers.setenv("TEXMFCNF",cnfspec)
+ setenv("TEXMFCNF",cnfspec)
instance.specification={}
identify_configuration_files()
load_configuration_files()
@@ -22168,7 +22624,7 @@ local function load_configuration_files()
elseif trace_locating then
report_resolving("skipping configuration file %a (no valid format)",filename)
end
- instance.order[#instance.order+1]=instance.setups[pathname]
+ order[#order+1]=setups[pathname]
if instance.loaderror then
break
end
@@ -22177,6 +22633,8 @@ local function load_configuration_files()
report_resolving("warning: no lua configuration files found")
end
end
+local expandedpathlist
+local unexpandedpathlist
function resolvers.configurationfiles()
return instance.specification or {}
end
@@ -22193,7 +22651,7 @@ local function load_file_databases()
end
end
local function locate_file_databases()
- local texmfpaths=resolvers.expandedpathlist("TEXMF")
+ local texmfpaths=expandedpathlist("TEXMF")
if #texmfpaths>0 then
for i=1,#texmfpaths do
local path=collapsepath(texmfpaths[i])
@@ -22202,7 +22660,7 @@ local function locate_file_databases()
if stripped~="" then
local runtime=stripped==path
path=cleanpath(path)
- local spec=resolvers.splitmethod(stripped)
+ local spec=splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme=="file") then
stripped="tree:///"..stripped
elseif spec.scheme=="cache" or spec.scheme=="file" then
@@ -22236,11 +22694,13 @@ local function generate_file_databases()
end
end
local function save_file_databases()
- for i=1,#instance.hashes do
- local hash=instance.hashes[i]
+ local hashes=instance.hashes
+ local files=instance.files
+ for i=1,#hashes do
+ local hash=hashes[i]
local cachename=hash.name
if hash.cache then
- local content=instance.files[cachename]
+ local content=files[cachename]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",cachename)
@@ -22252,8 +22712,9 @@ local function save_file_databases()
end
end
function resolvers.renew(hashname)
+ local files=instance.files
if hashname and hashname~="" then
- local expanded=resolvers.expansion(hashname) or ""
+ local expanded=expansion(hashname) or ""
if expanded~="" then
if trace_locating then
report_resolving("identifying tree %a from %a",expanded,hashname)
@@ -22270,7 +22731,7 @@ function resolvers.renew(hashname)
report_resolving("using path %a",realpath)
end
methodhandler('generators',hashname)
- local content=instance.files[hashname]
+ local content=files[hashname]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",hashname)
@@ -22297,38 +22758,46 @@ local function load_databases()
end
end
function resolvers.appendhash(type,name,cache)
- if not instance.hashed[name] then
+ local hashed=instance.hashed
+ local hashes=instance.hashes
+ if hashed[name] then
+ else
if trace_locating then
report_resolving("hash %a appended",name)
end
- insert(instance.hashes,{ type=type,name=name,cache=cache } )
- instance.hashed[name]=cache
+ insert(hashes,{ type=type,name=name,cache=cache } )
+ hashed[name]=cache
end
end
function resolvers.prependhash(type,name,cache)
- if not instance.hashed[name] then
+ local hashed=instance.hashed
+ local hashes=instance.hashes
+ if hashed[name] then
+ else
if trace_locating then
report_resolving("hash %a prepended",name)
end
- insert(instance.hashes,1,{ type=type,name=name,cache=cache } )
- instance.hashed[name]=cache
+ insert(hashes,1,{ type=type,name=name,cache=cache } )
+ hashed[name]=cache
end
end
function resolvers.extendtexmfvariable(specification)
- local t=resolvers.splitpath(getenv("TEXMF"))
- insert(t,1,specification)
- local newspec=concat(t,",")
- if instance.environment["TEXMF"] then
- instance.environment["TEXMF"]=newspec
- elseif instance.variables["TEXMF"] then
- instance.variables["TEXMF"]=newspec
+ local environment=instance.environment
+ local variables=instance.variables
+ local texmftrees=splitpath(getenv("TEXMF"))
+ insert(texmftrees,1,specification)
+ texmftrees=concat(texmftrees,",")
+ if environment["TEXMF"] then
+ environment["TEXMF"]=texmftrees
+ elseif variables["TEXMF"] then
+ variables["TEXMF"]=texmftrees
else
end
reset_hashes()
end
function resolvers.splitexpansions()
- local ie=instance.expansions
- for k,v in next,ie do
+ local expansions=instance.expansions
+ for k,v in next,expansions do
local t,tn,h,p={},0,{},splitconfigurationpath(v)
for kk=1,#p do
local vv=p[kk]
@@ -22338,33 +22807,37 @@ function resolvers.splitexpansions()
h[vv]=true
end
end
- if #t>1 then
- ie[k]=t
+ if tn>1 then
+ expansions[k]=t
else
- ie[k]=t[1]
+ expansions[k]=t[1]
end
end
end
function resolvers.datastate()
return caches.contentstate()
end
-function resolvers.variable(name)
+variable=function(name)
+ local variables=instance.variables
local name=name and lpegmatch(dollarstripper,name)
- local result=name and instance.variables[name]
+ local result=name and variables[name]
return result~=nil and result or ""
end
-function resolvers.expansion(name)
+expansion=function(name)
+ local expansions=instance.expansions
local name=name and lpegmatch(dollarstripper,name)
- local result=name and instance.expansions[name]
+ local result=name and expansions[name]
return result~=nil and result or ""
end
-function resolvers.unexpandedpathlist(str)
- local pth=resolvers.variable(str)
- local lst=resolvers.splitpath(pth)
+resolvers.variable=variable
+resolvers.expansion=expansion
+unexpandedpathlist=function(str)
+ local pth=variable(str)
+ local lst=splitpath(pth)
return expandedpathfromlist(lst)
end
function resolvers.unexpandedpath(str)
- return joinpath(resolvers.unexpandedpathlist(str))
+ return joinpath(unexpandedpathlist(str))
end
function resolvers.pushpath(name)
local pathstack=instance.pathstack
@@ -22394,8 +22867,8 @@ function resolvers.stackpath()
end
local done={}
function resolvers.resetextrapaths()
- local ep=instance.extra_paths
- if not ep then
+ local extra_paths=instance.extra_paths
+ if not extra_paths then
done={}
instance.extra_paths={}
elseif #ep>0 then
@@ -22416,8 +22889,8 @@ function resolvers.registerextrapath(paths,subpaths)
end
local paths=settings_to_array(paths)
local subpaths=settings_to_array(subpaths)
- local ep=instance.extra_paths or {}
- local oldn=#ep
+ local extra_paths=instance.extra_paths or {}
+ local oldn=#extra_paths
local newn=oldn
local nofpaths=#paths
local nofsubpaths=#subpaths
@@ -22430,7 +22903,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=p.."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=cleanpath(ps)
+ extra_paths[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -22440,7 +22913,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p=paths[i]
if not done[p] then
newn=newn+1
- ep[newn]=cleanpath(p)
+ extra_paths[newn]=cleanpath(p)
done[p]=true
end
end
@@ -22449,17 +22922,17 @@ function resolvers.registerextrapath(paths,subpaths)
for i=1,oldn do
for j=1,nofsubpaths do
local s=subpaths[j]
- local ps=ep[i].."/"..s
+ local ps=extra_paths[i].."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=cleanpath(ps)
+ extra_paths[newn]=cleanpath(ps)
done[ps]=true
end
end
end
end
if newn>0 then
- instance.extra_paths=ep
+ instance.extra_paths=extra_paths
end
if newn~=oldn then
reset_caches()
@@ -22467,17 +22940,19 @@ function resolvers.registerextrapath(paths,subpaths)
end
function resolvers.pushextrapath(path)
local paths=settings_to_array(path)
- if instance.extra_stack then
- insert(instance.extra_stack,1,paths)
+ local extra_stack=instance.extra_stack
+ if extra_stack then
+ insert(extra_stack,1,paths)
else
instance.extra_stack={ paths }
end
reset_caches()
end
function resolvers.popextrapath()
- if instance.extra_stack then
+ local extra_stack=instance.extra_stack
+ if extra_stack then
reset_caches()
- return remove(instance.extra_stack,1)
+ return remove(extra_stack,1)
end
end
local function made_list(instance,list,extra_too)
@@ -22506,33 +22981,21 @@ local function made_list(instance,list,extra_too)
end
end
if extra_too then
- local es=instance.extra_stack
- if es and #es>0 then
- for k=1,#es do
- add(es[k])
+ local extra_stack=instance.extra_stack
+ local extra_paths=instance.extra_paths
+ if extra_stack and #extra_stack>0 then
+ for k=1,#extra_stack do
+ add(extra_stack[k])
end
end
- local ep=instance.extra_paths
- if ep and #ep>0 then
- add(ep)
+ if extra_paths and #extra_paths>0 then
+ add(extra_paths)
end
end
add(list)
return new
end
-function resolvers.cleanpathlist(str)
- local t=resolvers.expandedpathlist(str)
- if t then
- for i=1,#t do
- t[i]=collapsepath(cleanpath(t[i]))
- end
- end
- return t
-end
-function resolvers.expandpath(str)
- return joinpath(resolvers.expandedpathlist(str))
-end
-function resolvers.expandedpathlist(str,extra_too)
+expandedpathlist=function(str,extra_too)
if not str then
return {}
elseif instance.savelists then
@@ -22540,40 +23003,56 @@ function resolvers.expandedpathlist(str,extra_too)
local lists=instance.lists
local lst=lists[str]
if not lst then
- local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
+ local l=made_list(instance,splitpath(expansion(str)),extra_too)
lst=expandedpathfromlist(l)
lists[str]=lst
end
return lst
else
- local lst=resolvers.splitpath(resolvers.expansion(str))
+ local lst=splitpath(expansion(str))
return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
-function resolvers.expandedpathlistfromvariable(str)
+resolvers.expandedpathlist=expandedpathlist
+resolvers.unexpandedpathlist=unexpandedpathlist
+function resolvers.cleanpathlist(str)
+ local t=expandedpathlist(str)
+ if t then
+ for i=1,#t do
+ t[i]=collapsepath(cleanpath(t[i]))
+ end
+ end
+ return t
+end
+function resolvers.expandpath(str)
+ return joinpath(expandedpathlist(str))
+end
+local function expandedpathlistfromvariable(str)
str=lpegmatch(dollarstripper,str)
local tmp=resolvers.variableofformatorsuffix(str)
- return resolvers.expandedpathlist(tmp~="" and tmp or str)
+ return expandedpathlist(tmp~="" and tmp or str)
end
function resolvers.expandpathfromvariable(str)
- return joinpath(resolvers.expandedpathlistfromvariable(str))
+ return joinpath(expandedpathlistfromvariable(str))
end
+resolvers.expandedpathlistfromvariable=expandedpathlistfromvariable
function resolvers.cleanedpathlist(v)
- local t=resolvers.expandedpathlist(v)
+ local t=expandedpathlist(v)
for i=1,#t do
- t[i]=resolvers.resolve(resolvers.cleanpath(t[i]))
+ t[i]=resolveprefix(cleanpath(t[i]))
end
return t
end
function resolvers.expandbraces(str)
- local pth=expandedpathfromlist(resolvers.splitpath(str))
+ local pth=expandedpathfromlist(splitpath(str))
return joinpath(pth)
end
function resolvers.registerfilehash(name,content,someerror)
+ local files=instance.files
if content then
- instance.files[name]=content
+ files[name]=content
else
- instance.files[name]={}
+ files[name]={}
if somerror==true then
instance.loaderror=someerror
end
@@ -22592,7 +23071,7 @@ function resolvers.renewcache()
end
local function isreadable(name)
local readable=isfile(name)
- if trace_detail then
+ if trace_details then
if readable then
report_resolving("file %a is readable",name)
else
@@ -22609,7 +23088,7 @@ local function collect_files(names)
local variant=hash.type
local search=filejoin(root,path,name)
local result=methodhandler('concatinators',variant,root,path,name)
- if trace_detail then
+ if trace_details then
report_resolving("match: variant %a, search %a, result %a",variant,search,result)
end
noffiles=noffiles+1
@@ -22618,7 +23097,7 @@ local function collect_files(names)
end
for k=1,#names do
local filename=names[k]
- if trace_detail then
+ if trace_details then
report_resolving("checking name %a",filename)
end
local basename=filebasename(filename)
@@ -22630,12 +23109,13 @@ local function collect_files(names)
pathname="/"..pathname.."$"
end
local hashes=instance.hashes
+ local files=instance.files
for h=1,#hashes do
local hash=hashes[h]
local hashname=hash.name
- local content=hashname and instance.files[hashname]
+ local content=hashname and files[hashname]
if content then
- if trace_detail then
+ if trace_details then
report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
local path,name=lookup(content,basename)
@@ -22703,7 +23183,6 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat=="" then
if filesuffix=="" or not suffixmap[filesuffix] then
local defaultsuffixes=resolvers.defaultsuffixes
- local formatofsuffix=resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname=filename..'.'..defaultsuffixes[i]
wantedfiles[#wantedfiles+1]=forcedname
@@ -22713,7 +23192,7 @@ local function find_analyze(filename,askedformat,allresults)
end
end
else
- filetype=resolvers.formatofsuffix(filename)
+ filetype=formatofsuffix(filename)
if trace_locating then
report_resolving("using suffix based filetype %a",filetype)
end
@@ -22736,7 +23215,7 @@ local function find_analyze(filename,askedformat,allresults)
end
local function find_direct(filename,allresults)
if not dangerous[askedformat] and isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("file %a found directly",filename)
end
return "direct",{ filename }
@@ -22761,12 +23240,12 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
report_resolving("checking qualified name %a",filename)
end
if isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("qualified file %a found",filename)
end
return "qualified",{ filename }
end
- if trace_detail then
+ if trace_details then
report_resolving("locating qualified file %a",filename)
end
local forcedname,suffix="",suffixonly(filename)
@@ -22774,11 +23253,11 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
local format_suffixes=askedformat=="" and resolvers.defaultsuffixes or suffixes[askedformat]
if format_suffixes then
for i=1,#format_suffixes do
- local s=format_suffixes[i]
- forcedname=filename.."."..s
+ local suffix=format_suffixes[i]
+ forcedname=filename.."."..suffix
if isreadable(forcedname) then
if trace_locating then
- report_resolving("no suffix, forcing format filetype %a",s)
+ report_resolving("no suffix, forcing format filetype %a",suffix)
end
return "qualified",{ forcedname }
end
@@ -22791,7 +23270,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
local savedformat=askedformat
local format=savedformat or ""
if format=="" then
- askedformat=resolvers.formatofsuffix(suffix)
+ askedformat=formatofsuffix(suffix)
end
if not format then
askedformat="othertextfiles"
@@ -22822,7 +23301,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
end
local function check_subpath(fname)
if isreadable(fname) then
- if trace_detail then
+ if trace_details then
report_resolving("found %a by deep scanning",fname)
end
return fname
@@ -22830,7 +23309,7 @@ local function check_subpath(fname)
end
local function makepathlist(list,filetype)
local typespec=resolvers.variableofformat(filetype)
- local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
+ local pathlist=expandedpathlist(typespec,filetype and usertypes[filetype])
local entry={}
if pathlist and #pathlist>0 then
for k=1,#pathlist do
@@ -22841,7 +23320,7 @@ local function makepathlist(list,filetype)
local expression=makepathexpression(pathname)
local barename=gsub(pathname,"/+$","")
barename=resolveprefix(barename)
- local scheme=url.hasscheme(barename)
+ local scheme=urlhasscheme(barename)
local schemename=gsub(barename,"%.%*$",'')
entry[k]={
path=path,
@@ -22878,7 +23357,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
dirlist[i]=filedirname(filelist[i][3]).."/"
end
end
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a in tree",filename)
end
for k=1,#pathlist do
@@ -22888,7 +23367,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local done=false
if filelist then
local expression=entry.expression
- if trace_detail then
+ if trace_details then
report_resolving("using pattern %a for path %a",expression,pathname)
end
for k=1,#filelist do
@@ -22899,16 +23378,16 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
result[#result+1]=resolveprefix(fl[3])
done=true
if allresults then
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, continue scanning",expression,f,d)
end
else
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, quit scanning",expression,f,d)
end
break
end
- elseif trace_detail then
+ elseif trace_details then
report_resolving("no match to %a in hash for file %a and path %a",expression,f,d)
end
end
@@ -22923,7 +23402,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
if not done and not entry.prescanned then
- if trace_detail then
+ if trace_details then
report_resolving("quick root scan for %a",pname)
end
for k=1,#wantedfiles do
@@ -22938,7 +23417,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if not done and entry.recursive then
- if trace_detail then
+ if trace_details then
report_resolving("scanning filesystem for %a",pname)
end
local files=resolvers.simplescanfiles(pname,false,true)
@@ -23004,7 +23483,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
local function find_onpath(filename,filetype,wantedfiles,allresults)
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a, filetype %a, wanted files %a",filename,filetype,concat(wantedfiles," | "))
end
local result={}
@@ -23046,7 +23525,9 @@ collect_instance_files=function(filename,askedformat,allresults)
{ find_onpath (filename,filetype,wantedfiles,true) },
{ find_otherwise(filename,filetype,wantedfiles,true) },
}
- local result,status,done={},{},{}
+ local result={}
+ local status={}
+ local done={}
for k,r in next,results do
local method,list=r[1],r[2]
if method and list then
@@ -23060,7 +23541,7 @@ collect_instance_files=function(filename,askedformat,allresults)
end
end
end
- if trace_detail then
+ if trace_details then
report_resolving("lookup status: %s",table.serialize(status,filename))
end
return result,status
@@ -23117,6 +23598,9 @@ local function findfiles(filename,filetype,allresults)
if not filename or filename=="" then
return {}
end
+ if allresults==nil then
+ allresults=true
+ end
local result,status=collect_instance_files(filename,filetype or "",allresults)
if not result or #result==0 then
local lowered=lower(filename)
@@ -23126,27 +23610,25 @@ local function findfiles(filename,filetype,allresults)
end
return result or {},status
end
-function resolvers.findfiles(filename,filetype)
- if not filename or filename=="" then
- return ""
- else
- return findfiles(filename,filetype,true)
- end
-end
-function resolvers.findfile(filename,filetype)
+local function findfile(filename,filetype)
if not filename or filename=="" then
return ""
else
return findfiles(filename,filetype,false)[1] or ""
end
end
+resolvers.findfiles=findfiles
+resolvers.findfile=findfile
+resolvers.find_file=findfile
+resolvers.find_files=findfiles
function resolvers.findpath(filename,filetype)
return filedirname(findfiles(filename,filetype,false)[1] or "")
end
local function findgivenfiles(filename,allresults)
+ local hashes=instance.hashes
+ local files=instance.files
local base=filebasename(filename)
local result={}
- local hashes=instance.hashes
local function okay(hash,path,name)
local found=methodhandler('concatinators',hash.type,hash.name,path,name)
if found and found~="" then
@@ -23156,7 +23638,7 @@ local function findgivenfiles(filename,allresults)
end
for k=1,#hashes do
local hash=hashes[k]
- local content=instance.files[hash.name]
+ local content=files[hash.name]
if content then
local path,name=lookup(content,base)
if not path then
@@ -23188,14 +23670,14 @@ function resolvers.wildcardpattern(pattern)
return lpegmatch(makewildcard,pattern) or pattern
end
local function findwildcardfiles(filename,allresults,result)
+ local files=instance.files
+ local hashes=instance.hashes
local result=result or {}
local base=filebasename(filename)
local dirn=filedirname(filename)
local path=lower(lpegmatch(makewildcard,dirn) or dirn)
local name=lower(lpegmatch(makewildcard,base) or base)
- local files=instance.files
if find(name,"*",1,true) then
- local hashes=instance.hashes
local function okay(found,path,base,hashname,hashtype)
if find(found,path) then
local full=methodhandler('concatinators',hashtype,hashname,found,base)
@@ -23235,7 +23717,6 @@ local function findwildcardfiles(filename,allresults,result)
end
end
end
- local hashes=instance.hashes
for k=1,#hashes do
local hash=hashes[k]
local hashname=hash.name
@@ -23265,13 +23746,21 @@ end
function resolvers.findwildcardfile(filename)
return findwildcardfiles(filename,false)[1] or ""
end
-function resolvers.automount()
-end
-function resolvers.starttiming()
- statistics.starttiming(instance)
+do
+ local starttiming=statistics.starttiming
+ local stoptiming=statistics.stoptiming
+ local elapsedtime=statistics.elapsedtime
+ function resolvers.starttiming()
+ starttiming(instance)
+ end
+ function resolvers.stoptiming()
+ stoptiming(instance)
+ end
+ function resolvers.loadtime()
+ return elapsedtime(instance)
+ end
end
-function resolvers.stoptiming()
- statistics.stoptiming(instance)
+function resolvers.automount()
end
function resolvers.load(option)
resolvers.starttiming()
@@ -23285,9 +23774,6 @@ function resolvers.load(option)
local files=instance.files
return files and next(files) and true
end
-function resolvers.loadtime()
- return statistics.elapsedtime(instance)
-end
local function report(str)
if trace_locating then
report_resolving(str)
@@ -23317,7 +23803,7 @@ function resolvers.dowithfilesandreport(command,files,...)
end
end
function resolvers.showpath(str)
- return joinpath(resolvers.expandedpathlist(resolvers.formatofvariable(str)))
+ return joinpath(expandedpathlist(resolvers.formatofvariable(str)))
end
function resolvers.registerfile(files,name,path)
if files[name] then
@@ -23331,7 +23817,7 @@ function resolvers.registerfile(files,name,path)
end
end
function resolvers.dowithpath(name,func)
- local pathlist=resolvers.expandedpathlist(name)
+ local pathlist=expandedpathlist(name)
for i=1,#pathlist do
func("^"..cleanpath(pathlist[i]))
end
@@ -23341,11 +23827,11 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
local engine=environment.ownmain or "luatex"
- local barename=removesuffix(name)
+ local barename=removesuffix(file.basename(name))
local fullname=addsuffix(barename,"fmt")
local fmtname=caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname=="" then
- fmtname=resolvers.findfile(fullname)
+ fmtname=findfile(fullname)
fmtname=cleanpath(fmtname)
end
if fmtname~="" then
@@ -23354,17 +23840,17 @@ function resolvers.locateformat(name)
local lucname=addsuffix(barename,luasuffixes.luc)
local luiname=addsuffix(barename,luasuffixes.lui)
if isfile(luiname) then
- return barename,luiname
+ return fmtname,luiname
elseif isfile(lucname) then
- return barename,lucname
+ return fmtname,lucname
elseif isfile(luaname) then
- return barename,luaname
+ return fmtname,luaname
end
end
return nil,nil
end
function resolvers.booleanvariable(str,default)
- local b=resolvers.expansion(str)
+ local b=expansion(str)
if b=="" then
return default
else
@@ -23374,6 +23860,7 @@ function resolvers.booleanvariable(str,default)
end
function resolvers.dowithfilesintree(pattern,handle,before,after)
local hashes=instance.hashes
+ local files=instance.files
for i=1,#hashes do
local hash=hashes[i]
local blobtype=hash.type
@@ -23385,7 +23872,7 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
if before then
before(blobtype,blobpath,pattern)
end
- for path,name in filtered(instance.files[blobpath],pattern) do
+ for path,name in filtered(files[blobpath],pattern) do
if type(path)=="string" then
checked=checked+1
if handle(blobtype,blobpath,path,name) then
@@ -23406,10 +23893,6 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
end
end
end
-local obsolete=resolvers.obsolete or {}
-resolvers.obsolete=obsolete
-resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile
-resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles
function resolvers.knownvariables(pattern)
if instance then
local environment=instance.environment
@@ -23443,7 +23926,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 4854, stripped down to: 2889
+-- original size: 5088, stripped down to: 3144
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -23452,6 +23935,7 @@ if not modules then modules={} end modules ['data-pre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local insert,remove=table.insert,table.remove
local resolvers=resolvers
local prefixes=resolvers.prefixes
local cleanpath=resolvers.cleanpath
@@ -23529,8 +24013,9 @@ prefixes.kpse=prefixes.locate
prefixes.full=prefixes.locate
prefixes.file=prefixes.filename
prefixes.path=prefixes.pathname
+local inputstack={}
+local stackpath=resolvers.stackpath
local function toppath()
- local inputstack=resolvers.inputstack
if not inputstack then
return "."
end
@@ -23542,15 +24027,23 @@ local function toppath()
end
end
local function jobpath()
- local path=resolvers.stackpath()
+ local path=stackpath()
if not path or path=="" then
return "."
else
return path
end
end
+local function pushinputname(name)
+ insert(inputstack,name)
+end
+local function popinputname(name)
+ return remove(inputstack)
+end
resolvers.toppath=toppath
resolvers.jobpath=jobpath
+resolvers.pushinputname=pushinputname
+resolvers.popinputname=popinputname
prefixes.toppath=function(str) return cleanpath(joinpath(toppath(),str)) end
prefixes.jobpath=function(str) return cleanpath(joinpath(jobpath(),str)) end
resolvers.setdynamic("toppath")
@@ -23593,7 +24086,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-out"] = package.loaded["data-out"] or true
--- original size: 530, stripped down to: 470
+-- original size: 551, stripped down to: 470
if not modules then modules={} end modules ['data-out']={
version=1.001,
@@ -23616,7 +24109,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-fil"] = package.loaded["data-fil"] or true
--- original size: 3863, stripped down to: 3170
+-- original size: 4365, stripped down to: 3588
if not modules then modules={} end modules ['data-fil']={
version=1.001,
@@ -23625,39 +24118,46 @@ if not modules then modules={} end modules ['data-fil']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local ioopen=io.open
+local isdir=lfs.isdir
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_files=logs.reporter("resolvers","files")
local resolvers=resolvers
local resolveprefix=resolvers.resolve
-local finders,openers,loaders,savers=resolvers.finders,resolvers.openers,resolvers.loaders,resolvers.savers
-local locators,hashers,generators,concatinators=resolvers.locators,resolvers.hashers,resolvers.generators,resolvers.concatinators
+local findfile=resolvers.findfile
+local scanfiles=resolvers.scanfiles
+local registerfilehash=resolvers.registerfilehash
+local appendhash=resolvers.appendhash
+local loadcachecontent=caches.loadcontent
local checkgarbage=utilities.garbagecollector and utilities.garbagecollector.check
-function locators.file(specification)
+function resolvers.locators.file(specification)
local filename=specification.filename
local realname=resolveprefix(filename)
- if realname and realname~='' and lfs.isdir(realname) then
+ if realname and realname~='' and isdir(realname) then
if trace_locating then
report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',filename,true)
+ appendhash('file',filename,true)
elseif trace_locating then
report_files("file locator %a not found",filename)
end
end
-function hashers.file(specification)
+function resolvers.hashers.file(specification)
local pathname=specification.filename
- local content=caches.loadcontent(pathname,'files')
- resolvers.registerfilehash(pathname,content,content==nil)
+ local content=loadcachecontent(pathname,'files')
+ registerfilehash(pathname,content,content==nil)
end
-function generators.file(specification)
+function resolvers.generators.file(specification)
local pathname=specification.filename
- local content=resolvers.scanfiles(pathname,false,true)
- resolvers.registerfilehash(pathname,content,true)
+ local content=scanfiles(pathname,false,true)
+ registerfilehash(pathname,content,true)
end
-concatinators.file=file.join
+resolvers.concatinators.file=file.join
+local finders=resolvers.finders
+local notfound=finders.notfound
function finders.file(specification,filetype)
local filename=specification.filename
- local foundname=resolvers.findfile(filename,filetype)
+ local foundname=findfile(filename,filetype)
if foundname and foundname~="" then
if trace_locating then
report_files("file finder: %a found",filename)
@@ -23667,37 +24167,55 @@ function finders.file(specification,filetype)
if trace_locating then
report_files("file finder: %a not found",filename)
end
- return finders.notfound()
+ return notfound()
end
end
-function openers.helpers.textopener(tag,filename,f)
+local openers=resolvers.openers
+local notfound=openers.notfound
+local overloaded=false
+local function textopener(tag,filename,f)
return {
- reader=function() return f:read () end,
- close=function() logs.show_close(filename) return f:close() end,
+ reader=function() return f:read () end,
+ close=function() return f:close() end,
}
end
+function openers.helpers.textopener(...)
+ return textopener(...)
+end
+function openers.helpers.settextopener(opener)
+ if overloaded then
+ report_files("file opener: %s overloaded","already")
+ else
+ if trace_locating then
+ report_files("file opener: %s overloaded","once")
+ end
+ overloaded=true
+ textopener=opener
+ end
+end
function openers.file(specification,filetype)
local filename=specification.filename
if filename and filename~="" then
- local f=io.open(filename,"r")
+ local f=ioopen(filename,"r")
if f then
if trace_locating then
report_files("file opener: %a opened",filename)
end
- return openers.helpers.textopener("file",filename,f)
+ return textopener("file",filename,f)
end
end
if trace_locating then
report_files("file opener: %a not found",filename)
end
- return openers.notfound()
+ return notfound()
end
+local loaders=resolvers.loaders
+local notfound=loaders.notfound
function loaders.file(specification,filetype)
local filename=specification.filename
if filename and filename~="" then
- local f=io.open(filename,"rb")
+ local f=ioopen(filename,"rb")
if f then
- logs.show_load(filename)
if trace_locating then
report_files("file loader: %a loaded",filename)
end
@@ -23714,7 +24232,7 @@ function loaders.file(specification,filetype)
if trace_locating then
report_files("file loader: %a not found",filename)
end
- return loaders.notfound()
+ return notfound()
end
@@ -23724,7 +24242,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-con"] = package.loaded["data-con"] or true
--- original size: 5029, stripped down to: 3432
+-- original size: 5388, stripped down to: 3685
if not modules then modules={} end modules ['data-con']={
version=1.100,
@@ -23733,6 +24251,7 @@ if not modules then modules={} end modules ['data-con']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local setmetatable=setmetatable
local format,lower,gsub=string.format,string.lower,string.gsub
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local trace_containers=false trackers.register("resolvers.containers",function(v) trace_containers=v end)
@@ -23740,16 +24259,21 @@ local trace_storage=false trackers.register("resolvers.storage",function(v) tra
containers=containers or {}
local containers=containers
containers.usecache=true
+local getwritablepath=caches.getwritablepath
+local getreadablepaths=caches.getreadablepaths
+local cacheiswritable=caches.is_writable
+local loaddatafromcache=caches.loaddata
+local savedataincache=caches.savedata
local report_containers=logs.reporter("resolvers","containers")
local allocated={}
local mt={
__index=function(t,k)
if k=="writable" then
- local writable=caches.getwritablepath(t.category,t.subcategory) or { "." }
+ local writable=getwritablepath(t.category,t.subcategory) or { "." }
t.writable=writable
return writable
elseif k=="readables" then
- local readables=caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ local readables=getreadablepaths(t.category,t.subcategory) or { "." }
t.readables=readables
return readables
end
@@ -23780,7 +24304,7 @@ function containers.define(category,subcategory,version,enabled)
end
end
function containers.is_usable(container,name)
- return container.enabled and caches and caches.is_writable(container.writable,name)
+ return container.enabled and caches and cacheiswritable(container.writable,name)
end
function containers.is_valid(container,name)
if name and name~="" then
@@ -23794,7 +24318,7 @@ function containers.read(container,name)
local storage=container.storage
local stored=storage[name]
if not stored and container.enabled and caches and containers.usecache then
- stored=caches.loaddata(container.readables,name,container.writable)
+ stored=loaddatafromcache(container.readables,name,container.writable)
if stored and stored.cache_version==container.version then
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","load",container.subcategory,name)
@@ -23810,17 +24334,20 @@ function containers.read(container,name)
end
return stored
end
-function containers.write(container,name,data)
+function containers.write(container,name,data,fast)
if data then
data.cache_version=container.version
if container.enabled and caches then
- local unique,shared=data.unique,data.shared
- data.unique,data.shared=nil,nil
- caches.savedata(container.writable,name,data)
+ local unique=data.unique
+ local shared=data.shared
+ data.unique=nil
+ data.shared=nil
+ savedataincache(container.writable,name,data,fast)
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","save",container.subcategory,name)
end
- data.unique,data.shared=unique,shared
+ data.unique=unique
+ data.shared=shared
end
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","store",container.subcategory,name)
@@ -23843,7 +24370,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-use"] = package.loaded["data-use"] or true
--- original size: 4434, stripped down to: 3180
+-- original size: 5790, stripped down to: 2910
if not modules then modules={} end modules ['data-use']={
version=1.001,
@@ -23852,40 +24379,11 @@ if not modules then modules={} end modules ['data-use']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local format,lower,gsub,find=string.format,string.lower,string.gsub,string.find
+local format=string.format
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_mounts=logs.reporter("resolvers","mounts")
local resolvers=resolvers
-resolvers.automounted=resolvers.automounted or {}
-function resolvers.automount(usecache)
- local mountpaths=resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
- if (not mountpaths or #mountpaths==0) and usecache then
- mountpaths=caches.getreadablepaths("mount")
- end
- if mountpaths and #mountpaths>0 then
- resolvers.starttiming()
- for k=1,#mountpaths do
- local root=mountpaths[k]
- local f=io.open(root.."/url.tmi")
- if f then
- for line in f:lines() do
- if line then
- if find(line,"^[%%#%-]") then
- elseif find(line,"^zip://") then
- if trace_locating then
- report_mounts("mounting %a",line)
- end
- table.insert(resolvers.automounted,line)
- resolvers.usezipfile(line)
- end
- end
- end
- f:close()
- end
- end
- resolvers.stoptiming()
- end
-end
+local findfile=resolvers.findfile
statistics.register("used config file",function() return caches.configfiles() end)
statistics.register("used cache path",function() return caches.usedpaths() end)
function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner)
@@ -23895,9 +24393,11 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner)
local luvdata={
enginebanner=enginebanner,
formatbanner=formatbanner,
- sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"),
+ sourcehash=md5.hex(io.loaddata(findfile(sourcefile)) or "unknown"),
sourcefile=sourcefile,
luaversion=LUAVERSION,
+ formatid=LUATEXFORMATID,
+ functionality=LUATEXFUNCTIONALITY,
}
io.savedata(luvname,table.serialize(luvdata,true))
lua.registerfinalizer(function()
@@ -23917,7 +24417,7 @@ function statistics.checkfmtstatus(texname)
if lfs.isfile(luvname) then
local luv=dofile(luvname)
if luv and luv.sourcefile then
- local sourcehash=md5.hex(io.loaddata(resolvers.findfile(luv.sourcefile)) or "unknown")
+ local sourcehash=md5.hex(io.loaddata(findfile(luv.sourcefile)) or "unknown")
local luvbanner=luv.enginebanner or "?"
if luvbanner~=enginebanner then
return format("engine mismatch (luv: %s <> bin: %s)",luvbanner,enginebanner)
@@ -23927,8 +24427,19 @@ function statistics.checkfmtstatus(texname)
return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash)
end
local luvluaversion=luv.luaversion or 0
- if luvluaversion~=LUAVERSION then
- return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION)
+ local engluaversion=LUAVERSION or 0
+ if luvluaversion~=engluaversion then
+ return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,engluaversion)
+ end
+ local luvfunctionality=luv.functionality or 0
+ local engfunctionality=status.development_id or 0
+ if luvfunctionality~=engfunctionality then
+ return format("functionality mismatch (luv: %s <> bin: %s)",luvfunctionality,engfunctionality)
+ end
+ local luvformatid=luv.formatid or 0
+ local engformatid=status.format_id or 0
+ if luvformatid~=engformatid then
+ return format("formatid mismatch (luv: %s <> bin: %s)",luvformatid,engformatid)
end
else
return "invalid status file"
@@ -23947,7 +24458,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 10263, stripped down to: 7556
+-- original size: 10725, stripped down to: 7949
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -23960,6 +24471,14 @@ local format,find,match=string.format,string.find,string.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_zip=logs.reporter("resolvers","zip")
local resolvers=resolvers
+local findfile=resolvers.findfile
+local registerfile=resolvers.registerfile
+local splitmethod=resolvers.splitmethod
+local prependhash=resolvers.prependhash
+local starttiming=resolvers.starttiming
+local extendtexmf=resolvers.extendtexmfvariable
+local stoptiming=resolvers.stoptiming
+local urlquery=url.query
zip=zip or {}
local zip=zip
local archives=zip.archives or {}
@@ -23974,8 +24493,9 @@ if zipfiles then
closezip=zipfiles.close
validfile=zipfiles.found
wholefile=zipfiles.unzip
+ local listzip=zipfiles.list
traversezip=function(zfile)
- return ipairs(zipfiles.list(zfile))
+ return ipairs(listzip(zfile))
end
local streams=utilities.streams
local openstream=streams.open
@@ -24032,28 +24552,30 @@ local function validzip(str)
return str
end
end
-function zip.openarchive(name)
+local function openarchive(name)
if not name or name=="" then
return nil
else
local arch=archives[name]
if not arch then
- local full=resolvers.findfile(name) or ""
+ local full=findfile(name) or ""
arch=full~="" and openzip(full) or false
archives[name]=arch
end
return arch
end
end
-function zip.closearchive(name)
+local function closearchive(name)
if not name or (name=="" and archives[name]) then
closezip(archives[name])
archives[name]=nil
end
end
+zip.openarchive=openarchive
+zip.closearchive=closearchive
function resolvers.locators.zip(specification)
local archive=specification.filename
- local zipfile=archive and archive~="" and zip.openarchive(archive)
+ local zipfile=archive and archive~="" and openarchive(archive)
if trace_locating then
if zipfile then
report_zip("locator: archive %a found",archive)
@@ -24062,13 +24584,6 @@ function resolvers.locators.zip(specification)
end
end
end
-function resolvers.hashers.zip(specification)
- local archive=specification.filename
- if trace_locating then
- report_zip("loading file %a",archive)
- end
- resolvers.usezipfile(specification.original)
-end
function resolvers.concatinators.zip(zipfile,path,name)
if not path or path=="" then
return format('%s?name=%s',zipfile,name)
@@ -24076,14 +24591,16 @@ function resolvers.concatinators.zip(zipfile,path,name)
return format('%s?name=%s/%s',zipfile,path,name)
end
end
-function resolvers.finders.zip(specification)
+local finders=resolvers.finders
+local notfound=finders.notfound
+function finders.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("finder: archive %a found",archive)
@@ -24104,16 +24621,19 @@ function resolvers.finders.zip(specification)
if trace_locating then
report_zip("finder: %a not found",original)
end
- return resolvers.finders.notfound()
+ return notfound()
end
-function resolvers.openers.zip(specification)
+local openers=resolvers.openers
+local notfound=openers.notfound
+local textopener=openers.helpers.textopener
+function openers.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("opener; archive %a opened",archive)
@@ -24123,7 +24643,7 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: file %a found",queryname)
end
- return resolvers.openers.helpers.textopener('zip',original,handle)
+ return textopener('zip',original,handle)
elseif trace_locating then
report_zip("opener: file %a not found",queryname)
end
@@ -24135,23 +24655,24 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: %a not found",original)
end
- return resolvers.openers.notfound()
+ return notfound()
end
-function resolvers.loaders.zip(specification)
+local loaders=resolvers.loaders
+local notfound=loaders.notfound
+function loaders.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("loader: archive %a opened",archive)
end
local data=wholefile(zfile,queryname)
if data then
- logs.show_load(original)
if trace_locating then
report_zip("loader; file %a loaded",original)
end
@@ -24167,47 +24688,24 @@ function resolvers.loaders.zip(specification)
if trace_locating then
report_zip("loader: %a not found",original)
end
- return resolvers.openers.notfound()
-end
-function resolvers.usezipfile(archive)
- local specification=resolvers.splitmethod(archive)
- local archive=specification.filename
- if archive and not registeredfiles[archive] then
- local z=zip.openarchive(archive)
- if z then
- local tree=url.query(specification.query).tree or ""
- if trace_locating then
- report_zip("registering: archive %a",archive)
- end
- resolvers.starttiming()
- resolvers.prependhash('zip',archive)
- resolvers.extendtexmfvariable(archive)
- registeredfiles[archive]=z
- resolvers.registerfilehash(archive,resolvers.registerzipfile(z,tree))
- resolvers.stoptiming()
- elseif trace_locating then
- report_zip("registering: unknown archive %a",archive)
- end
- elseif trace_locating then
- report_zip("registering: archive %a not found",archive)
- end
+ return notfound()
end
-function resolvers.registerzipfile(z,tree)
+local function registerzipfile(z,tree)
local names={}
local files={}
local remap={}
local n=0
local filter=tree=="" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
- local register=resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
+ starttiming()
for i in traversezip(z) do
local filename=i.filename
local path,name=match(filename,filter)
if not path then
n=n+1
- register(names,filename,"")
+ registerfile(names,filename,"")
local usedname=lower(filename)
files[usedname]=""
if usedname~=filename then
@@ -24224,12 +24722,43 @@ function resolvers.registerzipfile(z,tree)
else
end
end
+ stoptiming()
report_zip("registering: %s files registered",n)
return {
files=files,
remap=remap,
}
end
+local function usezipfile(archive)
+ local specification=splitmethod(archive)
+ local archive=specification.filename
+ if archive and not registeredfiles[archive] then
+ local z=openarchive(archive)
+ if z then
+ local tree=urlquery(specification.query).tree or ""
+ if trace_locating then
+ report_zip("registering: archive %a",archive)
+ end
+ prependhash('zip',archive)
+ extendtexmf(archive)
+ registeredfiles[archive]=z
+ registerfilehash(archive,registerzipfile(z,tree))
+ elseif trace_locating then
+ report_zip("registering: unknown archive %a",archive)
+ end
+ elseif trace_locating then
+ report_zip("registering: archive %a not found",archive)
+ end
+end
+resolvers.usezipfile=usezipfile
+resolvers.registerzipfile=registerzipfile
+function resolvers.hashers.zip(specification)
+ local archive=specification.filename
+ if trace_locating then
+ report_zip("loading file %a",archive)
+ end
+ usezipfile(specification.original)
+end
end -- of closure
@@ -24238,7 +24767,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tre"] = package.loaded["data-tre"] or true
--- original size: 8478, stripped down to: 5223
+-- original size: 10802, stripped down to: 6619
if not modules then modules={} end modules ['data-tre']={
version=1.001,
@@ -24247,180 +24776,255 @@ if not modules then modules={} end modules ['data-tre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local type=type
local find,gsub,lower=string.find,string.gsub,string.lower
-local basename,dirname,joinname=file.basename,file.dirname,file .join
+local basename,dirname,joinname=file.basename,file.dirname,file.join
local globdir,isdir,isfile=dir.glob,lfs.isdir,lfs.isfile
local P,lpegmatch=lpeg.P,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_trees=logs.reporter("resolvers","trees")
local resolvers=resolvers
-local resolveprefix=resolvers.resolve
-local notfound=resolvers.finders.notfound
-local lookup=resolvers.get_from_content
-local collectors={}
-local found={}
-function resolvers.finders.tree(specification)
- local spec=specification.filename
- local okay=found[spec]
- if okay==nil then
- if spec~="" then
- local path=dirname(spec)
- local name=basename(spec)
- if path=="" then
- path="."
- end
- local names=collectors[path]
- if not names then
- local pattern=find(path,"/%*+$") and path or (path.."/*")
- names=globdir(pattern)
- collectors[path]=names
- end
- local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
- for i=1,#names do
- local fullname=names[i]
- if find(fullname,pattern) then
- found[spec]=fullname
- return fullname
- end
- end
- local pattern=lower(pattern)
- for i=1,#names do
- local fullname=lower(names[i])
- if find(fullname,pattern) then
- if isfile(fullname) then
+local finders=resolvers.finders
+local openers=resolvers.openers
+local loaders=resolvers.loaders
+local locators=resolvers.locators
+local hashers=resolvers.hashers
+local generators=resolvers.generators
+do
+ local collectors={}
+ local found={}
+ local notfound=finders.notfound
+ function finders.tree(specification)
+ local spec=specification.filename
+ local okay=found[spec]
+ if okay==nil then
+ if spec~="" then
+ local path=dirname(spec)
+ local name=basename(spec)
+ if path=="" then
+ path="."
+ end
+ local names=collectors[path]
+ if not names then
+ local pattern=find(path,"/%*+$") and path or (path.."/*")
+ names=globdir(pattern)
+ collectors[path]=names
+ end
+ local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
+ for i=1,#names do
+ local fullname=names[i]
+ if find(fullname,pattern) then
found[spec]=fullname
return fullname
- else
- break
+ end
+ end
+ local pattern=lower(pattern)
+ for i=1,#names do
+ local fullname=lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec]=fullname
+ return fullname
+ else
+ break
+ end
end
end
end
+ okay=notfound()
+ found[spec]=okay
end
- okay=notfound()
- found[spec]=okay
+ return okay
end
- return okay
end
-function resolvers.locators.tree(specification)
- local name=specification.filename
- local realname=resolveprefix(name)
- if realname and realname~='' and isdir(realname) then
- if trace_locating then
- report_trees("locator %a found",realname)
+do
+ local resolveprefix=resolvers.resolve
+ local appendhash=resolvers.appendhash
+ local function dolocate(specification)
+ local name=specification.filename
+ local realname=resolveprefix(name)
+ if realname and realname~='' and isdir(realname) then
+ if trace_locating then
+ report_trees("locator %a found",realname)
+ end
+ appendhash('tree',name,false)
+ elseif trace_locating then
+ report_trees("locator %a not found",name)
end
- resolvers.appendhash('tree',name,false)
- elseif trace_locating then
- report_trees("locator %a not found",name)
end
+ locators.tree=dolocate
+ locators.dirlist=dolocate
+ locators.dirfile=dolocate
end
-function resolvers.hashers.tree(specification)
- local name=specification.filename
- if trace_locating then
- report_trees("analyzing %a",name)
- end
- resolvers.methodhandler("hashers",name)
- resolvers.generators.file(specification)
-end
-local collectors={}
-local splitter=lpeg.splitat("/**/")
-local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
-table.setmetatableindex(collectors,function(t,k)
- local rootname=lpegmatch(stripper,k)
- local dataname=joinname(rootname,"dirlist")
- local content=caches.loadcontent(dataname,"files",dataname)
- if not content then
- content=resolvers.scanfiles(rootname,nil,nil,false,true)
- caches.savecontent(dataname,"files",content,dataname)
- end
- t[k]=content
- return content
-end)
-local function checked(root,p,n)
- if p then
- if type(p)=="table" then
- for i=1,#p do
- local fullname=joinname(root,p[i],n)
+do
+ local filegenerator=generators.file
+ generators.dirlist=filegenerator
+ generators.dirfile=filegenerator
+end
+do
+ local filegenerator=generators.file
+ local methodhandler=resolvers.methodhandler
+ local function dohash(specification)
+ local name=specification.filename
+ if trace_locating then
+ report_trees("analyzing %a",name)
+ end
+ methodhandler("hashers",name)
+ filegenerator(specification)
+ end
+ hashers.tree=dohash
+ hashers.dirlist=dohash
+ hashers.dirfile=dohash
+end
+local resolve do
+ local collectors={}
+ local splitter=lpeg.splitat("/**/")
+ local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
+ local loadcontent=caches.loadcontent
+ local savecontent=caches.savecontent
+ local notfound=finders.notfound
+ local scanfiles=resolvers.scanfiles
+ local lookup=resolvers.get_from_content
+ table.setmetatableindex(collectors,function(t,k)
+ local rootname=lpegmatch(stripper,k)
+ local dataname=joinname(rootname,"dirlist")
+ local content=loadcontent(dataname,"files",dataname)
+ if not content then
+ content=scanfiles(rootname,nil,nil,false,true)
+ savecontent(dataname,"files",content,dataname)
+ end
+ t[k]=content
+ return content
+ end)
+ local function checked(root,p,n)
+ if p then
+ if type(p)=="table" then
+ for i=1,#p do
+ local fullname=joinname(root,p[i],n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ else
+ local fullname=joinname(root,p,n)
if isfile(fullname) then
return fullname
end
end
- else
- local fullname=joinname(root,p,n)
- if isfile(fullname) then
- return fullname
- end
end
+ return notfound()
end
- return notfound()
-end
-local function resolve(specification)
- local filename=specification.filename
- if filename~="" then
- local root,rest=lpegmatch(splitter,filename)
- if root and rest then
- local path,name=dirname(rest),basename(rest)
- if name~=rest then
- local content=collectors[root]
- local p,n=lookup(content,name)
- if not p then
- return notfound()
- end
- local pattern=".*/"..path.."$"
- local istable=type(p)=="table"
- if istable then
- for i=1,#p do
- local pi=p[i]
- if pi==path or find(pi,pattern) then
- local fullname=joinname(root,pi,n)
- if isfile(fullname) then
- return fullname
+ resolve=function(specification)
+ local filename=specification.filename
+ if filename~="" then
+ local root,rest=lpegmatch(splitter,filename)
+ if root and rest then
+ local path,name=dirname(rest),basename(rest)
+ if name~=rest then
+ local content=collectors[root]
+ local p,n=lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern=".*/"..path.."$"
+ local istable=type(p)=="table"
+ if istable then
+ for i=1,#p do
+ local pi=p[i]
+ if pi==path or find(pi,pattern) then
+ local fullname=joinname(root,pi,n)
+ if isfile(fullname) then
+ return fullname
+ end
end
end
+ elseif p==path or find(p,pattern) then
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
end
- elseif p==path or find(p,pattern) then
- local fullname=joinname(root,p,n)
- if isfile(fullname) then
- return fullname
+ local queries=specification.queries
+ if queries and queries.option=="fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
end
end
- local queries=specification.queries
- if queries and queries.option=="fileonly" then
- return checked(root,p,n)
- else
- return notfound()
- end
+ end
+ local path=dirname(filename)
+ local name=basename(filename)
+ local root=lpegmatch(stripper,path)
+ local content=collectors[path]
+ local p,n=lookup(content,name)
+ if p then
+ return checked(root,p,n)
end
end
- local path,name=dirname(filename),basename(filename)
- local root=lpegmatch(stripper,path)
- local content=collectors[path]
- local p,n=lookup(content,name)
- if p then
- return checked(root,p,n)
+ return notfound()
+ end
+ finders.dirlist=resolve
+ function finders.dirfile(specification)
+ local queries=specification.queries
+ if queries then
+ queries.option="fileonly"
+ else
+ specification.queries={ option="fileonly" }
end
+ return resolve(specification)
end
- return notfound()
end
-resolvers.finders .dirlist=resolve
-resolvers.locators .dirlist=resolvers.locators .tree
-resolvers.hashers .dirlist=resolvers.hashers .tree
-resolvers.generators.dirlist=resolvers.generators.file
-resolvers.openers .dirlist=resolvers.openers .file
-resolvers.loaders .dirlist=resolvers.loaders .file
-function resolvers.finders.dirfile(specification)
- local queries=specification.queries
- if queries then
- queries.option="fileonly"
- else
- specification.queries={ option="fileonly" }
+do
+ local fileopener=openers.file
+ local fileloader=loaders.file
+ openers.dirlist=fileopener
+ loaders.dirlist=fileloader
+ openers.dirfile=fileopener
+ loaders.dirfile=fileloader
+end
+do
+ local hashfile="dirhash.lua"
+ local kind="HASH256"
+ local version=1.0
+ local loadtable=table.load
+ local savetable=table.save
+ local loaddata=io.loaddata
+ function resolvers.dirstatus(patterns)
+ local t=type(patterns)
+ if t=="string" then
+ patterns={ patterns }
+ elseif t~="table" then
+ return false
+ end
+ local status=loadtable(hashfile)
+ if not status or status.version~=version or status.kind~=kind then
+ status={
+ version=1.0,
+ kind=kind,
+ hashes={},
+ }
+ end
+ local hashes=status.hashes
+ local changed={}
+ local action=sha2[kind]
+ local update={}
+ for i=1,#patterns do
+ local pattern=patterns[i]
+ local files=globdir(pattern)
+ for i=1,#files do
+ local name=files[i]
+ local hash=action(loaddata(name))
+ if hashes[name]~=hash then
+ changed[#changed+1]=name
+ end
+ update[name]=hash
+ end
+ end
+ status.hashes=update
+ savetable(hashfile,status)
+ return #changed>0 and changed or false
end
- return resolve(specification)
end
-resolvers.locators .dirfile=resolvers.locators .dirlist
-resolvers.hashers .dirfile=resolvers.hashers .dirlist
-resolvers.generators.dirfile=resolvers.generators.dirlist
-resolvers.openers .dirfile=resolvers.openers .dirlist
-resolvers.loaders .dirfile=resolvers.loaders .dirlist
end -- of closure
@@ -24429,7 +25033,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-sch"] = package.loaded["data-sch"] or true
--- original size: 6753, stripped down to: 5268
+-- original size: 6945, stripped down to: 5408
if not modules then modules={} end modules ['data-sch']={
version=1.001,
@@ -24439,8 +25043,11 @@ if not modules then modules={} end modules ['data-sch']={
license="see context related readme files"
}
local load,tonumber=load,tonumber
-local gsub,concat,format=string.gsub,table.concat,string.format
+local gsub,format=string.gsub,string.format
+local sortedhash,concat=table.sortedhash,table.concat
local finders,openers,loaders=resolvers.finders,resolvers.openers,resolvers.loaders
+local addsuffix,suffix,splitbase=file.addsuffix,file.suffix,file.splitbase
+local md5hex=md5.hex
local trace_schemes=false trackers.register("resolvers.schemes",function(v) trace_schemes=v end)
local report_schemes=logs.reporter("resolvers","schemes")
local http=require("socket.http")
@@ -24457,7 +25064,7 @@ function cleaners.none(specification)
return specification.original
end
function cleaners.strip(specification)
- local path,name=file.splitbase(specification.original)
+ local path,name=splitbase(specification.original)
if path=="" then
return (gsub(name,"[^%a%d%.]+","-"))
else
@@ -24465,7 +25072,7 @@ function cleaners.strip(specification)
end
end
function cleaners.md5(specification)
- return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
+ return addsuffix(md5hex(specification.original),suffix(specification.path))
end
local cleaner=cleaners.strip
directives.register("schemes.cleanmethod",function(v) cleaner=cleaners[v] or cleaners.strip end)
@@ -24485,7 +25092,7 @@ local runner=sandbox.registerrunner {
name="curl resolver",
method="execute",
program="curl",
- template="--silent --insecure --create-dirs --output %cachename% %original%",
+ template='--silent --insecure --create-dirs --output "%cachename%" "%original%"',
checkers={
cachename="cache",
original="url",
@@ -24556,10 +25163,10 @@ end
schemes.install=install
local function http_handler(specification,cachename)
local tempname=cachename..".tmp"
- local f=io.open(tempname,"wb")
+ local handle=io.open(tempname,"wb")
local status,message=http.request {
url=specification.original,
- sink=ltn12.sink.file(f)
+ sink=ltn12.sink.file(handle)
}
if not status then
os.remove(tempname)
@@ -24574,13 +25181,13 @@ install('https')
install('ftp')
statistics.register("scheme handling time",function()
local l,r,nl,nr={},{},0,0
- for k,v in table.sortedhash(loaded) do
+ for k,v in sortedhash(loaded) do
if v>0 then
nl=nl+1
l[nl]=k..":"..v
end
end
- for k,v in table.sortedhash(reused) do
+ for k,v in sortedhash(reused) do
if v>0 then
nr=nr+1
r[nr]=k..":"..v
@@ -24588,10 +25195,10 @@ statistics.register("scheme handling time",function()
end
local n=nl+nr
if n>0 then
- l=nl>0 and concat(l) or "none"
- r=nr>0 and concat(r) or "none"
+ if nl==0 then l={ "none" } end
+ if nr==0 then r={ "none" } end
return format("%s seconds, %s processed, threshold %s seconds, loaded: %s, reused: %s",
- statistics.elapsedtime(schemes),n,threshold,l,r)
+ statistics.elapsedtime(schemes),n,threshold,concat(l," "),concat(l," "))
else
return nil
end
@@ -24624,7 +25231,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lua"] = package.loaded["data-lua"] or true
--- original size: 4207, stripped down to: 3041
+-- original size: 4227, stripped down to: 3049
if not modules then modules={} end modules ['data-lua']={
version=1.001,
@@ -24634,8 +25241,7 @@ if not modules then modules={} end modules ['data-lua']={
license="see context related readme files"
}
local package,lpeg=package,lpeg
-local gsub=string.gsub
-local concat=table.concat
+local loadfile=loadfile
local addsuffix=file.addsuffix
local P,S,Cs,lpegmatch=lpeg.P,lpeg.S,lpeg.Cs,lpeg.match
local luasuffixes={ 'tex','lua' }
@@ -24646,6 +25252,8 @@ local helpers=package.helpers or {}
local methods=helpers.methods or {}
local resolvers=resolvers
local resolveprefix=resolvers.resolve
+local expandedpaths=resolvers.expandedpathlistfromvariable
+local findfile=resolvers.findfile
helpers.report=logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries",function(v) helpers.trace=v end)
trackers.register("resolvers.locating",function(v) helpers.trace=v end)
@@ -24674,7 +25282,7 @@ local function getluaformatpaths()
if not luaformatpaths then
luaformatpaths={}
for i=1,#luaformats do
- registerpath("lua format","lua",luaformatpaths,resolvers.expandedpathlistfromvariable(luaformats[i]))
+ registerpath("lua format","lua",luaformatpaths,expandedpaths(luaformats[i]))
end
end
return luaformatpaths
@@ -24683,7 +25291,7 @@ local function getlibformatpaths()
if not libformatpaths then
libformatpaths={}
for i=1,#libformats do
- registerpath("lib format","lib",libformatpaths,resolvers.expandedpathlistfromvariable(libformats[i]))
+ registerpath("lib format","lib",libformatpaths,expandedpaths(libformats[i]))
end
end
return libformatpaths
@@ -24693,7 +25301,7 @@ local function loadedbyformat(name,rawname,suffixes,islib,what)
local report=helpers.report
for i=1,#suffixes do
local format=suffixes[i]
- local resolved=resolvers.findfile(name,format) or ""
+ local resolved=findfile(name,format) or ""
if trace then
report("%s format, identifying %a using format %a",what,name,format)
end
@@ -24731,7 +25339,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-aux"] = package.loaded["data-aux"] or true
--- original size: 2452, stripped down to: 1877
+-- original size: 2610, stripped down to: 2019
if not modules then modules={} end modules ['data-aux']={
version=1.001,
@@ -24742,24 +25350,28 @@ if not modules then modules={} end modules ['data-aux']={
}
local find=string.find
local type,next=type,next
+local addsuffix,removesuffix=file.addsuffix,file.removesuffix
+local loaddata,savedata=io.loaddata,io.savedata
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local resolvers=resolvers
+local cleanpath=resolvers.cleanpath
+local findfiles=resolvers.findfiles
local report_scripts=logs.reporter("resolvers","scripts")
function resolvers.updatescript(oldname,newname)
local scriptpath="context/lua"
- newname=file.addsuffix(newname,"lua")
- local oldscript=resolvers.cleanpath(oldname)
+ local oldscript=cleanpath(oldname)
+ local newname=addsuffix(newname,"lua")
+ local newscripts=findfiles(newname) or {}
if trace_locating then
report_scripts("to be replaced old script %a",oldscript)
end
- local newscripts=resolvers.findfiles(newname) or {}
if #newscripts==0 then
if trace_locating then
report_scripts("unable to locate new script")
end
else
for i=1,#newscripts do
- local newscript=resolvers.cleanpath(newscripts[i])
+ local newscript=cleanpath(newscripts[i])
if trace_locating then
report_scripts("checking new script %a",newscript)
end
@@ -24771,17 +25383,17 @@ function resolvers.updatescript(oldname,newname)
if trace_locating then
report_scripts("new script should come from %a",scriptpath)
end
- elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
+ elseif not (find(oldscript,removesuffix(newname).."$") or find(oldscript,newname.."$")) then
if trace_locating then
report_scripts("invalid new script name")
end
else
- local newdata=io.loaddata(newscript)
+ local newdata=loaddata(newscript)
if newdata then
if trace_locating then
report_scripts("old script content replaced by new content: %s",oldscript)
end
- io.savedata(oldscript,newdata)
+ savedata(oldscript,newdata)
break
elseif trace_locating then
report_scripts("unable to load new script")
@@ -24854,7 +25466,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lst"] = package.loaded["data-lst"] or true
--- original size: 1823, stripped down to: 1542
+-- original size: 2038, stripped down to: 1696
if not modules then modules={} end modules ['data-lst']={
version=1.001,
@@ -24864,15 +25476,22 @@ if not modules then modules={} end modules ['data-lst']={
license="see context related readme files"
}
local type=type
-local concat,sortedhash=table.concat,table.sortedhash
+local sortedhash=table.sortedhash
+local isdir=lfs.isdir
local resolvers=resolvers
local listers=resolvers.listers or {}
resolvers.listers=listers
local resolveprefix=resolvers.resolve
+local configurationfiles=resolvers.configurationfiles
+local expandedpathfromlist=resolvers.expandedpathfromlist
+local splitpath=resolvers.splitpath
+local knownvariables=resolvers.knownvariables
local report_lists=logs.reporter("resolvers","lists")
local report_resolved=logs.reporter("system","resolved")
local function tabstr(str)
- if type(str)=='table' then
+ if not str then
+ return "unset"
+ elseif type(str)=='table' then
return concat(str," | ")
else
return str
@@ -24882,22 +25501,22 @@ function listers.variables(pattern)
local result=resolvers.knownvariables(pattern)
for key,value in sortedhash(result) do
report_lists(key)
- report_lists(" env: %s",tabstr(value.environment or "unset"))
- report_lists(" var: %s",tabstr(value.variable or "unset"))
- report_lists(" exp: %s",tabstr(value.expansion or "unset"))
- report_lists(" res: %s",tabstr(value.resolved or "unset"))
+ report_lists(" env: %s",tabstr(value.environment))
+ report_lists(" var: %s",tabstr(value.variable))
+ report_lists(" exp: %s",tabstr(value.expansion))
+ report_lists(" res: %s",tabstr(value.resolved))
end
end
function listers.configurations()
- local configurations=resolvers.configurationfiles()
+ local configurations=configurationfiles()
for i=1,#configurations do
report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
- local list=resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
+ local list=expandedpathfromlist(splitpath(resolvers.luacnfspec))
for i=1,#list do
local li=resolveprefix(list[i])
- if lfs.isdir(li) then
+ if isdir(li) then
report_resolved("path - %s",li)
else
report_resolved("path + %s",li)
@@ -24910,318 +25529,147 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-package.loaded["util-lib"] = package.loaded["util-lib"] or true
+package.loaded["libs-ini"] = package.loaded["libs-ini"] or true
--- original size: 16094, stripped down to: 8443
+-- original size: 5822, stripped down to: 3629
-if not modules then modules={} end modules ['util-lib']={
+if not modules then modules={} end modules ['libs-ini']={
version=1.001,
comment="companion to luat-lib.mkiv",
author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files",
+ license="see context related readme files"
}
+local type,unpack=type,unpack
local type=type
-local next=next
-local pcall=pcall
-local gsub=string.gsub
-local find=string.find
-local sort=table.sort
-local pathpart=file.pathpart
local nameonly=file.nameonly
local joinfile=file.join
-local removesuffix=file.removesuffix
local addsuffix=file.addsuffix
-local findfile=resolvers.findfile
-local findfiles=resolvers.findfiles
-local expandpaths=resolvers.expandedpathlistfromvariable
local qualifiedpath=file.is_qualified_path
local isfile=lfs.isfile
-local done=false
-local function locate(required,version,trace,report,action)
- if type(required)~="string" then
- report("provide a proper library name")
- return
- end
- if trace then
- report("requiring library %a with version %a",required,version or "any")
- end
- local found_library=nil
- local required_full=gsub(required,"%.","/")
- local required_path=pathpart(required_full)
- local required_base=nameonly(required_full)
- if qualifiedpath(required) then
- if isfile(addsuffix(required,os.libsuffix)) then
- if trace then
- report("qualified name %a found",required)
+local findfile=resolvers.findfile
+local expandpaths=resolvers.expandedpathlistfromvariable
+local report=logs.reporter("resolvers","libraries")
+local trace=false
+trackers.register("resolvers.lib",function(v) trace=v end)
+local function findlib(required)
+ local suffix=os.libsuffix or "so"
+ if not qualifiedpath(required) then
+ local list=directives.value("system.librarynames" )
+ local only=nameonly(required)
+ if type(list)=="table" then
+ list=list[only]
+ if type(list)~="table" then
+ list={ only }
end
- found_library=required
else
- if trace then
- report("qualified name %a not found",required)
- end
+ list={ only }
end
- else
- local required_name=required_base.."."..os.libsuffix
- local version=type(version)=="string" and version~="" and version or false
- local engine="luatex"
- if trace and not done then
- local list=expandpaths("lib")
- for i=1,#list do
- report("tds path %i: %s",i,list[i])
- end
- end
- local function found(locate,asked_library,how,...)
- if trace then
- report("checking %s: %a",how,asked_library)
- end
- return locate(asked_library,...)
+ if trace then
+ report("using lookup list for library %a: % | t",only,list)
end
- local function check(locate,...)
- local found=nil
- if version then
- local asked_library=joinfile(required_path,version,required_name)
- if trace then
- report("checking %s: %a","with version",asked_library)
- end
- found=locate(asked_library,...)
+ for i=1,#list do
+ local name=list[i]
+ local found=findfile(name,"lib")
+ if not found then
+ found=findfile(addsuffix(name,suffix),"lib")
end
- if not found or found=="" then
- local asked_library=joinfile(required_path,required_name)
+ if found then
if trace then
- report("checking %s: %a","with version",asked_library)
+ report("library %a resolved via %a path to %a",name,"tds lib",found)
end
- found=locate(asked_library,...)
- end
- return found and found~="" and found or false
- end
- local function attempt(checkpattern)
- if trace then
- report("checking tds lib paths strictly")
- end
- local found=findfile and check(findfile,"lib")
- if found and (not checkpattern or find(found,checkpattern)) then
return found
end
- if trace then
- report("checking tds lib paths with wildcard")
- end
- local asked_library=joinfile(required_path,".*",required_name)
- if trace then
- report("checking %s: %a","latest version",asked_library)
- end
- local list=findfiles(asked_library,"lib",true)
- if list and #list>0 then
- sort(list)
- local found=list[#list]
- if found and (not checkpattern or find(found,checkpattern)) then
- return found
- end
- end
- if trace then
- report("checking lib paths")
- end
- package.extralibpath(environment.ownpath)
- local paths=package.libpaths()
- local pattern="/[^/]+%."..os.libsuffix.."$"
- for i=1,#paths do
- required_path=gsub(paths[i],pattern,"")
- local found=check(lfs.isfound)
- if type(found)=="string" and (not checkpattern or find(found,checkpattern)) then
- return found
- end
- end
- return false
end
- if engine then
- if trace then
- report("attemp 1, engine %a",engine)
- end
- found_library=attempt("/"..engine.."/")
- if not found_library then
- if trace then
- report("attemp 2, no engine",asked_library)
+ if expandpaths then
+ local list=expandpaths("PATH")
+ local base=addsuffix(only,suffix)
+ for i=1,#list do
+ local full=joinfile(list[i],base)
+ local found=isfile(full) and full
+ if found then
+ if trace then
+ report("library %a resolved via %a path to %a",name,"system",found)
+ end
+ return found
end
- found_library=attempt()
end
- else
- found_library=attempt()
end
- end
- if not found_library then
+ elseif isfile(addsuffix(required,suffix)) then
if trace then
- report("not found: %a",required)
+ report("library with qualified name %a %sfound",required,"")
end
- library=false
+ return required
else
if trace then
- report("found: %a",found_library)
- end
- local result,message=action(found_library,required_base)
- if result then
- library=result
- else
- library=false
- report("load error: message %a, library %a",tostring(message or "unknown"),found_library or "no library")
+ report("library with qualified name %a %sfound",required,"not ")
end
end
- if trace then
- if not library then
- report("unknown library: %a",required)
- else
- report("stored library: %a",required)
- end
- end
- return library or nil
+ return false
end
-do
- local report_swiglib=logs.reporter("swiglib")
- local trace_swiglib=false
- local savedrequire=require
- local loadedlibs={}
- local loadlib=package.loadlib
- local pushdir=dir.push
- local popdir=dir.pop
- trackers.register("resolvers.swiglib",function(v) trace_swiglib=v end)
- function requireswiglib(required,version)
- local library=loadedlibs[library]
- if library==nil then
- local trace_swiglib=trace_swiglib or package.helpers.trace
- library=locate(required,version,trace_swiglib,report_swiglib,function(name,base)
- pushdir(pathpart(name))
- local opener="luaopen_"..base
- if trace_swiglib then
- report_swiglib("opening: %a with %a",name,opener)
- end
- local library,message=loadlib(name,opener)
- local libtype=type(library)
- if libtype=="function" then
- library=library()
+local foundlibraries=table.setmetatableindex(function(t,k)
+ local v=findlib(k)
+ t[k]=v
+ return v
+end)
+function resolvers.findlib(required)
+ return foundlibraries[required]
+end
+local libraries={}
+resolvers.libraries=libraries
+local report=logs.reporter("optional")
+if optional then optional.loaded={} end
+function libraries.validoptional(name)
+ local thelib=optional and optional[name]
+ if not thelib then
+ elseif thelib.initialize then
+ return thelib
+ else
+ report("invalid optional library %a",libname)
+ end
+end
+function libraries.optionalloaded(name,libnames)
+ local thelib=optional and optional[name]
+ if not thelib then
+ report("no optional %a library found",name)
+ else
+ local thelib_initialize=thelib.initialize
+ if not thelib_initialize then
+ report("invalid optional library %a",name)
+ else
+ if type(libnames)=="string" then
+ libnames={ libnames }
+ end
+ if type(libnames)=="table" then
+ for i=1,#libnames do
+ local libname=libnames[i]
+ local filename=foundlibraries[libname]
+ if filename then
+ libnames[i]=filename
+ else
+ report("unable to locate library %a",libname)
+ return
+ end
+ end
+ local initialized=thelib_initialize(unpack(libnames))
+ if initialized then
+ report("using library '% + t'",libnames)
else
- report_swiglib("load error: %a returns %a, message %a, library %a",opener,libtype,(string.gsub(message or "no message","[%s]+$","")),found_library or "no library")
- library=false
+ report("unable to initialize library '% + t'",libnames)
end
- popdir()
- return library
- end)
- loadedlibs[required]=library or false
- end
- return library
- end
- function require(name,version)
- if find(name,"^swiglib%.") then
- return requireswiglib(name,version)
- else
- return savedrequire(name)
- end
- end
- local swiglibs={}
- local initializer="core"
- function swiglib(name,version)
- local library=swiglibs[name]
- if not library then
- statistics.starttiming(swiglibs)
- if trace_swiglib then
- report_swiglib("loading %a",name)
- end
- if not find(name,"%."..initializer.."$") then
- fullname="swiglib."..name.."."..initializer
- else
- fullname="swiglib."..name
+ return initialized
end
- library=requireswiglib(fullname,version)
- swiglibs[name]=library
- statistics.stoptiming(swiglibs)
end
- return library
end
- statistics.register("used swiglibs",function()
- if next(swiglibs) then
- return string.format("%s, initial load time %s seconds",table.concat(table.sortedkeys(swiglibs)," "),statistics.elapsedtime(swiglibs))
- end
- end)
end
if FFISUPPORTED and ffi and ffi.load then
- local report_ffilib=logs.reporter("ffilib")
- local trace_ffilib=false
- local savedffiload=ffi.load
- trackers.register("resolvers.ffilib",function(v) trace_ffilib=v end)
- local loaded={}
- local function locateindeed(name)
- name=removesuffix(name)
- local l=loaded[name]
- if l==nil then
- local state,library=pcall(savedffiload,name)
- if type(library)=="userdata" then
- l=library
- elseif type(state)=="userdata" then
- l=state
- else
- l=false
- end
- loaded[name]=l
- elseif trace_ffilib then
- report_ffilib("reusing already loaded %a",name)
- end
- return l
- end
- local function getlist(required)
- local list=directives.value("system.librarynames" )
- if type(list)=="table" then
- list=list[required]
- if type(list)=="table" then
- if trace then
- report("using lookup list for library %a: % | t",required,list)
- end
- return list
- end
- end
- return { required }
- end
- function ffilib(name,version)
- name=removesuffix(name)
- local l=loaded[name]
- if l~=nil then
- if trace_ffilib then
- report_ffilib("reusing already loaded %a",name)
- end
- return l
- end
- local list=getlist(name)
- if version=="system" then
- for i=1,#list do
- local library=locateindeed(list[i])
- if type(library)=="userdata" then
- return library
- end
- end
- else
- for i=1,#list do
- local library=locate(list[i],version,trace_ffilib,report_ffilib,locateindeed)
- if type(library)=="userdata" then
- return library
- end
- end
- end
- end
+ local ffiload=ffi.load
function ffi.load(name)
- local list=getlist(name)
- for i=1,#list do
- local library=ffilib(list[i])
- if type(library)=="userdata" then
- return library
- end
- end
- if trace_ffilib then
- report_ffilib("trying to load %a using normal loader",name)
- end
- for i=1,#list do
- local state,library=pcall(savedffiload,list[i])
- if type(library)=="userdata" then
- return library
- elseif type(state)=="userdata" then
- return library
- end
+ local full=name and foundlibraries[name]
+ if full then
+ return ffiload(full)
+ else
+ return ffiload(name)
end
end
end
@@ -25336,7 +25784,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 9637, stripped down to: 7253
+-- original size: 13964, stripped down to: 10026
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -25350,16 +25798,14 @@ local concat=table.concat
local quoted=string.quoted
local luasuffixes=utilities.lua.suffixes
local report_format=logs.reporter("resolvers","formats")
-local function primaryflags()
- local arguments=environment.arguments
+local function primaryflags(arguments)
local flags={}
if arguments.silent then
flags[#flags+1]="--interaction=batchmode"
end
return concat(flags," ")
end
-local function secondaryflags()
- local arguments=environment.arguments
+local function secondaryflags(arguments)
local trackers=arguments.trackers
local directives=arguments.directives
local flags={}
@@ -25381,6 +25827,9 @@ local function secondaryflags()
if arguments.ansi then
flags[#flags+1]="--c:ansi"
end
+ if arguments.ansilog then
+ flags[#flags+1]="--c:ansilog"
+ end
if arguments.strip then
flags[#flags+1]="--c:strip"
end
@@ -25391,12 +25840,13 @@ local function secondaryflags()
end
local template=[[--ini %primaryflags% --lua=%luafile% %texfile% %secondaryflags% %dump% %redirect%]]
local checkers={
- primaryflags="string",
- secondaryflags="string",
+ primaryflags="verbose",
+ secondaryflags="verbose",
luafile="readable",
texfile="readable",
redirect="string",
dump="string",
+ binarypath="string",
}
local runners={
luatex=sandbox.registerrunner {
@@ -25421,46 +25871,88 @@ local runners={
reporter=report_format,
},
}
-function environment.make_format(name,arguments)
+local function validbinarypath()
+ if not environment.arguments.nobinarypath then
+ local path=environment.ownpath or file.dirname(environment.ownname)
+ if path and path~="" then
+ path=dir.expandname(path)
+ if path~="" and lfs.isdir(path) then
+ return path
+ end
+ end
+ end
+end
+function environment.make_format(formatname)
+ local arguments=environment.arguments
local engine=environment.ownmain or "luatex"
- local silent=environment.arguments.silent
- local errors=environment.arguments.errors
- local olddir=dir.current()
- local path=caches.getwritablepath("formats",engine) or ""
- if path~="" then
- lfs.chdir(path)
- end
- report_format("using format path %a",dir.current())
- local texsourcename=file.addsuffix(name,"mkiv")
- local fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ local silent=arguments.silent
+ local errors=arguments.errors
+ local texsourcename=""
+ local texsourcepath=""
+ local fulltexsourcename=""
+ if engine=="luametatex" then
+ texsourcename=file.addsuffix(formatname,"mkxl")
+ fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ end
+ if fulltexsourcename=="" then
+ texsourcename=file.addsuffix(formatname,"mkiv")
+ fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ end
if fulltexsourcename=="" then
- texsourcename=file.addsuffix(name,"tex")
+ texsourcename=file.addsuffix(formatname,"tex")
fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
end
if fulltexsourcename=="" then
- report_format("no tex source file with name %a (mkiv or tex)",name)
- lfs.chdir(olddir)
+ report_format("no tex source file with name %a (mkiv or tex)",formatname)
return
- else
- report_format("using tex source file %a",fulltexsourcename)
end
- local texsourcepath=dir.expandname(file.dirname(fulltexsourcename))
- local specificationname=file.replacesuffix(fulltexsourcename,"lus")
- local fullspecificationname=resolvers.findfile(specificationname,"tex") or ""
- if fullspecificationname=="" then
- specificationname=file.join(texsourcepath,"context.lus")
- fullspecificationname=resolvers.findfile(specificationname,"tex") or ""
+ report_format("using tex source file %a",fulltexsourcename)
+ fulltexsourcename=dir.expandname(fulltexsourcename)
+ texsourcepath=file.dirname(fulltexsourcename)
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
end
+ local specificationname="context.lus"
+ local specificationpath=""
+ local fullspecificationname=resolvers.findfile(specificationname) or ""
if fullspecificationname=="" then
- report_format("unknown stub specification %a",specificationname)
- lfs.chdir(olddir)
+ report_format("unable to locate specification file %a",specificationname)
+ return
+ end
+ report_format("using specification file %a",fullspecificationname)
+ fullspecificationname=dir.expandname(fullspecificationname)
+ specificationpath=file.dirname(fullspecificationname)
+ if texsourcepath~=specificationpath then
+ report_format("tex source file and specification file are on different paths")
+ return
+ end
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
+ end
+ if not lfs.isfile(fullspecificationname) then
+ report_format("no accessible specification file with name %a",fulltexsourcename)
+ return
+ end
+ report_format("using tex source path %a",texsourcepath)
+ local validformatpath=caches.getwritablepath("formats",engine) or ""
+ local startupdir=dir.current()
+ if validformatpath=="" then
+ report_format("invalid format path, insufficient write access")
+ return
+ end
+ local binarypath=validbinarypath()
+ report_format("changing to format path %a",validformatpath)
+ lfs.chdir(validformatpath)
+ if dir.current()~=validformatpath then
+ report_format("unable to change to format path %a",validformatpath)
return
end
- local specificationpath=file.dirname(fullspecificationname)
local usedluastub=nil
local usedlualibs=dofile(fullspecificationname)
if type(usedlualibs)=="string" then
- usedluastub=file.join(file.dirname(fullspecificationname),usedlualibs)
+ usedluastub=file.join(specificationpath,usedlualibs)
elseif type(usedlualibs)=="table" then
report_format("using stub specification %a",fullspecificationname)
local texbasename=file.basename(name)
@@ -25477,48 +25969,57 @@ function environment.make_format(name,arguments)
end
else
report_format("invalid stub specification %a",fullspecificationname)
- lfs.chdir(olddir)
+ lfs.chdir(startupdir)
return
end
+ local runner=runners[engine]
+ if not runner then
+ report_format("the format %a cannot be generated, no runner available for engine %a",name,engine)
+ lfs.chdir(startupdir)
+ return
+ end
+ local primaryflags=primaryflags(arguments)
+ local secondaryflags=secondaryflags(arguments)
local specification={
- primaryflags=primaryflags(),
- secondaryflags=secondaryflags(),
+ binarypath=binarypath,
+ primaryflags=primaryflags,
+ secondaryflags=secondaryflags,
luafile=quoted(usedluastub),
texfile=quoted(fulltexsourcename),
dump=os.platform=="unix" and "\\\\dump" or "\\dump",
}
- local runner=runners[engine]
- if not runner then
- report_format("format %a cannot be generated, no runner available for engine %a",name,engine)
- elseif silent then
- statistics.starttiming()
+ if silent then
specification.redirect="> temp.log"
- local result=runner(specification)
- local runtime=statistics.stoptiming()
- if result~=0 then
- print(format("%s silent make > fatal error when making format %q",engine,name))
- else
- print(format("%s silent make > format %q made in %.3f seconds",engine,name,runtime))
- end
+ end
+ statistics.starttiming()
+ local result=runner(specification)
+ local runtime=statistics.stoptiming()
+ if silent then
os.remove("temp.log")
- else
- runner(specification)
end
- local pattern=file.removesuffix(file.basename(usedluastub)).."-*.mem"
- local mp=dir.glob(pattern)
- if mp then
- for i=1,#mp do
- local name=mp[i]
- report_format("removing related mplib format %a",file.basename(name))
- os.remove(name)
+ report_format()
+ if binarypath and binarypath~="" then
+ report_format("binary path : %s",binarypath or "?")
end
- end
- lfs.chdir(olddir)
+ report_format("format path : %s",validformatpath)
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",usedluastub)
+ if primaryflags~="" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags~="" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("context file : %s",fulltexsourcename)
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result==0 and "okay" or "error")
+ report_format()
+ lfs.chdir(startupdir)
end
-local template=[[%flags% --fmt=%fmtfile% --lua=%luafile% %texfile% %more%]]
+local template=[[%primaryflags% --fmt=%fmtfile% --lua=%luafile% %texfile% %secondaryflags%]]
local checkers={
- flags="string",
- more="string",
+ primaryflags="verbose",
+ secondaryflags="verbose",
fmtfile="readable",
luafile="readable",
texfile="readable",
@@ -25531,6 +26032,13 @@ local runners={
checkers=checkers,
reporter=report_format,
},
+ luametatex=sandbox.registerrunner {
+ name="run luametatex format",
+ program="luametatex",
+ template=template,
+ checkers=checkers,
+ reporter=report_format,
+ },
luajittex=sandbox.registerrunner {
name="run luajittex format",
program="luajittex",
@@ -25539,51 +26047,78 @@ local runners={
reporter=report_format,
},
}
-function environment.run_format(name,data,more)
- if name and name~="" then
- local engine=environment.ownmain or "luatex"
- local barename=file.removesuffix(name)
- local fmtname=caches.getfirstreadablefile(file.addsuffix(barename,"fmt"),"formats",engine)
- if fmtname=="" then
- fmtname=resolvers.findfile(file.addsuffix(barename,"fmt")) or ""
- end
- fmtname=resolvers.cleanpath(fmtname)
- if fmtname=="" then
- report_format("no format with name %a",name)
- else
- local barename=file.removesuffix(name)
- local luaname=file.addsuffix(barename,"luc")
- if not lfs.isfile(luaname) then
- luaname=file.addsuffix(barename,"lua")
- end
- if not lfs.isfile(luaname) then
- report_format("using format name %a",fmtname)
- report_format("no luc/lua file with name %a",barename)
- else
- local runner=runners[engine]
- if not runner then
- report_format("format %a cannot be run, no runner available for engine %a",name,engine)
- else
- runner {
- flags=primaryflags(),
- fmtfile=quoted(barename),
- luafile=quoted(luaname),
- texfile=quoted(data),
- more=more,
- }
- end
- end
- end
+function environment.run_format(formatname,scriptname,filename,primaryflags,secondaryflags,verbose)
+ local engine=environment.ownmain or "luatex"
+ if not formatname or formatname=="" then
+ report_format("missing format name")
+ return
+ end
+ if not scriptname or scriptname=="" then
+ report_format("missing script name")
+ return
+ end
+ if not lfs.isfile(formatname) or not lfs.isfile(scriptname) then
+ formatname,scriptname=resolvers.locateformat(formatname)
end
+ if not formatname or formatname=="" then
+ report_format("invalid format name")
+ return
+ end
+ if not scriptname or scriptname=="" then
+ report_format("invalid script name")
+ return
+ end
+ local runner=runners[engine]
+ if not runner then
+ report_format("format %a cannot be run, no runner available for engine %a",file.nameonly(name),engine)
+ return
+ end
+ if not filename then
+ filename ""
+ end
+ local binarypath=validbinarypath()
+ local specification={
+ binarypath=binarypath,
+ primaryflags=primaryflags or "",
+ secondaryflags=secondaryflags or "",
+ fmtfile=quoted(formatname),
+ luafile=quoted(scriptname),
+ texfile=filename~="" and quoted(filename) or "",
+ }
+ statistics.starttiming()
+ local result=runner(specification)
+ local runtime=statistics.stoptiming()
+ if verbose then
+ report_format()
+ if binarypath and binarypath~="" then
+ report_format("binary path : %s",binarypath)
+ end
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",scriptname)
+ report_format("tex format file : %s",formatname)
+ if filename~="" then
+ report_format("tex input file : %s",filename)
+ end
+ if primaryflags~="" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags~="" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result==0 and "okay" or "error")
+ report_format()
+ end
+ return result
end
end -- of closure
--- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
+-- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua libs-ini.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 1019480
--- stripped bytes : 403728
+-- original bytes : 1038245
+-- stripped bytes : 409841
-- end library merge
@@ -25697,7 +26232,7 @@ local ownlibs = { -- order can be made better
'data-tmf.lua',
'data-lst.lua',
- 'util-lib.lua', -- swiglib
+ 'libs-ini.lua',
'luat-sta.lua',
'luat-fmt.lua',
@@ -25846,7 +26381,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
- <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -25865,6 +26400,7 @@ local helpinfo = [[
<flag name="stubpath" value="binpath"><short>paths where stubs wil be written</short></flag>
<flag name="windows"><short>create windows (mswin) stubs</short></flag>
<flag name="unix"><short>create unix (linux) stubs</short></flag>
+ <flag name="addbinarypath"><short>prepend the (found) binarypath to runners</short></flag>
</subcategory>
<subcategory>
<flag name="verbose"><short>give a bit more info</short></flag>
@@ -26086,8 +26622,7 @@ end
report()
io.flush()
end
- -- no os.exec because otherwise we get the wrong return value
- local code = os.execute(command) -- maybe spawn
+ local code = os.execute(command)
if code == 0 then
return true
else
@@ -26130,7 +26665,7 @@ function runners.execute_program(fullname)
report()
report()
io.flush()
- local code = os.exec(command) -- (fullname,unpack(after)) does not work / maybe spawn
+ local code = os.execute(command)
return code == 0
end
end
@@ -26517,16 +27052,22 @@ function runners.associate(filename)
end
function runners.evaluate(code,filename) -- for Luigi
+ local environment = table.setmetatableindex(_G)
if code == "loop" then
while true do
- io.write("> ")
+ io.write("lua > ")
local code = io.read()
- if code ~= "" then
+ if code == "quit" or code == "exit" then
+ break
+ elseif code ~= "" then
local temp = string.match(code,"^= (.*)$")
if temp then
- code = "print("..temp..")"
+ code = "inspect("..temp..")"
+ end
+ local compiled, message = load(code,"console","t",environment)
+ if type(compiled) ~= "function" then
+ compiled = load("inspect("..code..")","console","t",environment)
end
- local compiled, message = loadstring(code)
if type(compiled) ~= "function" then
io.write("! " .. (message or code).."\n")
else
@@ -26539,7 +27080,10 @@ function runners.evaluate(code,filename) -- for Luigi
code = filename
end
if code ~= "" then
- local compiled, message = loadstring(code)
+ local compiled, message = load(code,"console","t",environment)
+ if type(compiled) ~= "function" then
+ compiled = load("inspect("..code..")","console","t",environment)
+ end
if type(compiled) ~= "function" then
io.write("invalid lua code: " .. (message or code))
return
@@ -26716,17 +27260,17 @@ do
end
-if e_argument("ansi") then
+-- if e_argument("ansi") or e_argument("ansilog") then
- logs.setformatters("ansi")
+-- logs.setformatters(e_argument("ansi") and "ansi" or "ansilog")
- local script = e_argument("script") or e_argument("scripts")
+-- -- local script = e_argument("script") or e_argument("scripts")
+-- --
+-- -- if type(script) == "string" then
+-- -- logs.writer("]0;"..script.."") -- for Alan to test
+-- -- end
- if type(script) == "string" then
- logs.writer("]0;"..script.."") -- for Alan to test
- end
-
-end
+-- end
if e_argument("script") or e_argument("scripts") then
@@ -26975,11 +27519,11 @@ elseif e_argument("format-path") then
resolvers.load()
report(caches.getwritablepath("format"))
-elseif e_argument("pattern") then
-
- -- luatools
-
- runners.execute_ctx_script("mtx-base","--pattern='" .. e_argument("pattern") .. "'",filename)
+-- elseif e_argument("pattern") then
+--
+-- -- luatools
+--
+-- runners.execute_ctx_script("mtx-base","--pattern='" .. e_argument("pattern") .. "'",filename)
elseif e_argument("generate") then
diff --git a/Master/texmf-dist/scripts/context/stubs/unix/mtxrun b/Master/texmf-dist/scripts/context/stubs/unix/mtxrun
index 98fe7f752e3..5907fa33c66 100755
--- a/Master/texmf-dist/scripts/context/stubs/unix/mtxrun
+++ b/Master/texmf-dist/scripts/context/stubs/unix/mtxrun
@@ -194,7 +194,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 6330, stripped down to: 2831
+-- original size: 6529, stripped down to: 2933
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -313,6 +313,9 @@ elseif not ffi.number then
end
if LUAVERSION>5.3 then
end
+if status and os.setenv then
+ os.setenv("engine",string.lower(status.luatex_engine or "unknown"))
+end
end -- of closure
@@ -321,7 +324,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-macro"] = package.loaded["l-macro"] or true
--- original size: 10131, stripped down to: 5991
+-- original size: 10130, stripped down to: 5990
if not modules then modules={} end modules ['l-macros']={
version=1.001,
@@ -546,7 +549,7 @@ end
macros.loaded=loaded
function required(name,trace)
local filename=file.addsuffix(name,"lua")
- local fullname=resolvers and resolvers.find_file(filename) or filename
+ local fullname=resolvers and resolvers.findfile(filename) or filename
if not fullname or fullname=="" then
return false
end
@@ -576,7 +579,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-sandbox"] = package.loaded["l-sandbox"] or true
--- original size: 9747, stripped down to: 6313
+-- original size: 9604, stripped down to: 6394
if not modules then modules={} end modules ['l-sandbox']={
version=1.001,
@@ -808,6 +811,9 @@ local function supported(library)
return l
end
loadfile=register(loadfile,"loadfile")
+if supported("lua") then
+ lua.openfile=register(lua.openfile,"lua.openfile")
+end
if supported("io") then
io.open=register(io.open,"io.open")
io.popen=register(io.popen,"io.popen")
@@ -1168,7 +1174,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true
--- original size: 38434, stripped down to: 19310
+-- original size: 38440, stripped down to: 19316
if not modules then modules={} end modules ['l-lpeg']={
version=1.001,
@@ -1337,7 +1343,7 @@ patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+unders
patterns.somecontent=(anything-newline-space)^1
patterns.beginline=#(1-newline)
patterns.longtostring=Cs(whitespace^0/""*((patterns.quoted+nonwhitespace^1+whitespace^1/""*(endofstring+Cc(" ")))^0))
-function anywhere(pattern)
+local function anywhere(pattern)
return (1-P(pattern))^0*P(pattern)
end
lpeg.anywhere=anywhere
@@ -1967,7 +1973,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-string"] = package.loaded["l-string"] or true
--- original size: 6461, stripped down to: 3255
+-- original size: 6644, stripped down to: 3410
if not modules then modules={} end modules ['l-string']={
version=1.001,
@@ -2031,9 +2037,11 @@ function string.is_empty(str)
end
end
local anything=patterns.anything
-local allescapes=Cc("%")*S(".-+%?()[]*")
-local someescapes=Cc("%")*S(".-+%()[]")
-local matchescapes=Cc(".")*S("*?")
+local moreescapes=Cc("%")*S(".-+%?()[]*$^{}")
+local allescapes=Cc("%")*S(".-+%?()[]*")
+local someescapes=Cc("%")*S(".-+%()[]")
+local matchescapes=Cc(".")*S("*?")
+local pattern_m=Cs ((moreescapes+anything )^0 )
local pattern_a=Cs ((allescapes+anything )^0 )
local pattern_b=Cs ((someescapes+matchescapes+anything )^0 )
local pattern_c=Cs (Cc("^")*(someescapes+matchescapes+anything )^0*Cc("$") )
@@ -2043,6 +2051,8 @@ end
function string.topattern(str,lowercase,strict)
if str=="" or type(str)~="string" then
return ".*"
+ elseif strict=="all" then
+ str=lpegmatch(pattern_m,str)
elseif strict then
str=lpegmatch(pattern_c,str)
else
@@ -2092,7 +2102,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-table"] = package.loaded["l-table"] or true
--- original size: 41332, stripped down to: 21508
+-- original size: 41758, stripped down to: 22643
if not modules then modules={} end modules ['l-table']={
version=1.001,
@@ -2101,7 +2111,7 @@ if not modules then modules={} end modules ['l-table']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local type,next,tostring,tonumber,select=type,next,tostring,tonumber,select
+local type,next,tostring,tonumber,select,rawget=type,next,tostring,tonumber,select,rawget
local table,string=table,string
local concat,sort=table.concat,table.sort
local format,lower,dump=string.format,string.lower,string.dump
@@ -2435,13 +2445,13 @@ function table.fromhash(t)
end
return hsh
end
-local noquotes,hexify,handle,compact,inline,functions,metacheck
+local noquotes,hexify,handle,compact,inline,functions,metacheck,accurate
local reserved=table.tohash {
'and','break','do','else','elseif','end','false','for','function','if',
'in','local','nil','not','or','repeat','return','then','true','until','while',
- 'NaN','goto',
+ 'NaN','goto','const',
}
-local function is_simple_table(t,hexify)
+local function is_simple_table(t,hexify,accurate)
local nt=#t
if nt>0 then
local n=0
@@ -2460,6 +2470,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i]=format("0x%X",v)
+ elseif accurate then
+ tt[i]=format("%q",v)
else
tt[i]=v
end
@@ -2480,6 +2492,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i+1]=format("0x%X",v)
+ elseif accurate then
+ tt[i+1]=format("%q",v)
else
tt[i+1]=v
end
@@ -2551,6 +2565,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tv=="number" then
if hexify then
handle(format("%s 0x%X,",depth,v))
+ elseif accurate then
+ handle(format("%s %q,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -2560,7 +2576,7 @@ local function do_serialize(root,name,depth,level,indexed)
if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
handle(format("%s { %s },",depth,concat(st,", ")))
else
@@ -2588,12 +2604,16 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
@@ -2601,12 +2621,16 @@ local function do_serialize(root,name,depth,level,indexed)
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
handle(format("%s %s=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s %s=%q,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
handle(format("%s [%q]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -2615,6 +2639,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -2631,6 +2657,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={},",depth,k))
+ elseif accurate then
+ handle(format("%s [%q]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -2643,11 +2671,13 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s [%q]={},",depth,k))
end
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
+ elseif accurate then
+ handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -2669,6 +2699,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
+ elseif accurate then
+ handle(format("%s [%q]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -2688,6 +2720,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=load(%q),",depth,k,f))
+ elseif accurate then
+ handle(format("%s [%q]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -2705,6 +2739,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -2728,6 +2764,7 @@ local function serialize(_handle,root,name,specification)
if type(specification)=="table" then
noquotes=specification.noquotes
hexify=specification.hexify
+ accurate=specification.accurate
handle=_handle or specification.handle or print
functions=specification.functions
compact=specification.compact
@@ -3043,7 +3080,7 @@ end
local function sequenced(t,sep,simple)
if not t then
return ""
- elseif type(t)=="string" then
+ elseif type(t)~="table" then
return t
end
local n=#t
@@ -3082,7 +3119,11 @@ local function sequenced(t,sep,simple)
end
end
end
- return concat(s,sep or " | ")
+ if sep==true then
+ return "{ "..concat(s,", ").." }"
+ else
+ return concat(s,sep or " | ")
+ end
end
table.sequenced=sequenced
function table.print(t,...)
@@ -3213,7 +3254,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-io"] = package.loaded["l-io"] or true
--- original size: 11823, stripped down to: 6325
+-- original size: 11829, stripped down to: 6331
if not modules then modules={} end modules ['l-io']={
version=1.001,
@@ -3227,7 +3268,7 @@ local open,flush,write,read=io.open,io.flush,io.write,io.read
local byte,find,gsub,format=string.byte,string.find,string.gsub,string.format
local concat=table.concat
local type=type
-if string.find(os.getenv("PATH"),";",1,true) then
+if string.find(os.getenv("PATH") or "",";",1,true) then
io.fileseparator,io.pathseparator="\\",";"
else
io.fileseparator,io.pathseparator="/",":"
@@ -3765,7 +3806,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 18916, stripped down to: 10126
+-- original size: 19102, stripped down to: 10192
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -3779,7 +3820,7 @@ local date,time=os.date,os.time
local find,format,gsub,upper,gmatch=string.find,string.format,string.gsub,string.upper,string.gmatch
local concat=table.concat
local random,ceil,randomseed=math.random,math.ceil,math.randomseed
-local rawget,rawset,type,getmetatable,setmetatable,tonumber,tostring=rawget,rawset,type,getmetatable,setmetatable,tonumber,tostring
+local type,setmetatable,tonumber,tostring=type,setmetatable,tonumber,tostring
do
local selfdir=os.selfdir
if selfdir=="" then
@@ -3930,7 +3971,8 @@ local launchers={
unix="xdg-open %s &> /dev/null &",
}
function os.launch(str)
- execute(format(launchers[os.name] or launchers.unix,str))
+ local command=format(launchers[os.name] or launchers.unix,str)
+ execute(command)
end
local gettimeofday=os.gettimeofday or os.clock
os.gettimeofday=gettimeofday
@@ -4185,6 +4227,12 @@ function os.validdate(year,month,day)
end
return year,month,day
end
+function os.date(fmt,...)
+ if not fmt then
+ fmt="%Y-%m-%d %H:%M"
+ end
+ return date(fmt,...)
+end
local osexit=os.exit
local exitcode=nil
function os.setexitcode(code)
@@ -4207,7 +4255,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 21984, stripped down to: 10148
+-- original size: 22175, stripped down to: 10302
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -4229,15 +4277,24 @@ local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
local attributes=lfs.attributes
function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
+ if name then
+ return attributes(name,"mode")=="directory"
+ end
end
function lfs.isfile(name)
- local a=attributes(name,"mode")
- return a=="file" or a=="link" or nil
+ if name then
+ local a=attributes(name,"mode")
+ return a=="file" or a=="link" or nil
+ end
end
function lfs.isfound(name)
- local a=attributes(name,"mode")
- return (a=="file" or a=="link") and name or nil
+ if name then
+ local a=attributes(name,"mode")
+ return (a=="file" or a=="link") and name or nil
+ end
+end
+function lfs.modification(name)
+ return name and attributes(name,"modification") or nil
end
if sandbox then
sandbox.redefine(lfs.isfile,"lfs.isfile")
@@ -4616,7 +4673,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-gzip"] = package.loaded["l-gzip"] or true
--- original size: 1211, stripped down to: 951
+-- original size: 5115, stripped down to: 1699
if not modules then modules={} end modules ['l-gzip']={
version=1.001,
@@ -4624,43 +4681,75 @@ if not modules then modules={} end modules ['l-gzip']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-if not gzip then
- return
-end
-local suffix,suffixes=file.suffix,file.suffixes
-function gzip.load(filename)
- local f=io.open(filename,"rb")
- if not f then
- elseif suffix(filename)=="gz" then
- f:close()
- local g=gzip.open(filename,"rb")
- if g then
- local str=g:read("*all")
- g:close()
- return str
+gzip=gzip or {}
+if not zlib then
+ zlib=xzip
+elseif not xzip then
+ xzip=zlib
+end
+if zlib then
+ local suffix=file.suffix
+ local suffixes=file.suffixes
+ local find=string.find
+ local openfile=io.open
+ local gzipwindow=15+16
+ local gziplevel=3
+ local identifier="^\x1F\x8B\x08"
+ local compress=zlib.compress
+ local decompress=zlib.decompress
+ function gzip.load(filename)
+ local f=openfile(filename,"rb")
+ if not f then
+ else
+ local data=f:read("*all")
+ f:close()
+ if data and data~="" then
+ if suffix(filename)=="gz" then
+ data=decompress(data,gzipwindow)
+ end
+ return data
+ end
end
- else
- local str=f:read("*all")
- f:close()
- return str
end
-end
-function gzip.save(filename,data)
- if suffix(filename)~="gz" then
- filename=filename..".gz"
+ function gzip.save(filename,data,level)
+ if suffix(filename)~="gz" then
+ filename=filename..".gz"
+ end
+ local f=openfile(filename,"wb")
+ if f then
+ data=compress(data or "",level or gziplevel,nil,gzipwindow)
+ f:write(data)
+ f:close()
+ return #data
+ end
end
- local f=io.open(filename,"wb")
- if f then
- local s=zlib.compress(data or "",9,nil,15+16)
- f:write(s)
- f:close()
- return #s
+ function gzip.suffix(filename)
+ local suffix,extra=suffixes(filename)
+ local gzipped=extra=="gz"
+ return suffix,gzipped
+ end
+ function gzip.compressed(s)
+ return s and find(s,identifier)
+ end
+ function gzip.compress(s,level)
+ if s and not find(s,identifier) then
+ if not level then
+ level=gziplevel
+ elseif level<=0 then
+ return s
+ elseif level>9 then
+ level=9
+ end
+ return compress(s,level or gziplevel,nil,gzipwindow) or s
+ end
+ end
+ function gzip.decompress(s)
+ if s and find(s,identifier) then
+ return decompress(s,gzipwindow)
+ else
+ return s
+ end
end
-end
-function gzip.suffix(filename)
- local suffix,extra=suffixes(filename)
- local gzipped=extra=="gz"
- return suffix,gzipped
end
@@ -4670,7 +4759,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-md5"] = package.loaded["l-md5"] or true
--- original size: 3309, stripped down to: 2218
+-- original size: 3414, stripped down to: 2307
if not modules then modules={} end modules ['l-md5']={
version=1.001,
@@ -4689,6 +4778,8 @@ if not md5 then
end
local md5,file=md5,file
local gsub=string.gsub
+local modification,isfile,touch=lfs.modification,lfs.isfile,lfs.touch
+local loaddata,savedata=io.loaddata,io.savedata
do
local patterns=lpeg and lpeg.patterns
if patterns then
@@ -4704,10 +4795,11 @@ do
md5.sumHEXA=md5.HEX
end
end
+local md5HEX=md5.HEX
function file.needsupdating(oldname,newname,threshold)
- local oldtime=lfs.attributes(oldname,"modification")
+ local oldtime=modification(oldname)
if oldtime then
- local newtime=lfs.attributes(newname,"modification")
+ local newtime=modification(newname)
if not newtime then
return true
elseif newtime>=oldtime then
@@ -4723,31 +4815,32 @@ function file.needsupdating(oldname,newname,threshold)
end
file.needs_updating=file.needsupdating
function file.syncmtimes(oldname,newname)
- local oldtime=lfs.attributes(oldname,"modification")
- if oldtime and lfs.isfile(newname) then
- lfs.touch(newname,oldtime,oldtime)
+ local oldtime=modification(oldname)
+ if oldtime and isfile(newname) then
+ touch(newname,oldtime,oldtime)
end
end
-function file.checksum(name)
+local function checksum(name)
if md5 then
- local data=io.loaddata(name)
+ local data=loaddata(name)
if data then
- return md5.HEX(data)
+ return md5HEX(data)
end
end
return nil
end
+file.checksum=checksum
function file.loadchecksum(name)
if md5 then
- local data=io.loaddata(name..".md5")
+ local data=loaddata(name..".md5")
return data and (gsub(data,"%s",""))
end
return nil
end
function file.savechecksum(name,checksum)
- if not checksum then checksum=file.checksum(name) end
+ if not checksum then checksum=checksum(name) end
if checksum then
- io.savedata(name..".md5",checksum)
+ savedata(name..".md5",checksum)
return checksum
end
return nil
@@ -5636,7 +5729,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-unicode"] = package.loaded["l-unicode"] or true
--- original size: 41047, stripped down to: 17171
+-- original size: 41281, stripped down to: 17261
if not modules then modules={} end modules ['l-unicode']={
version=1.001,
@@ -6151,49 +6244,52 @@ end
function utf.utf32_to_utf8_t(t,endian)
return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(b)
- if b<0x10000 then
- return char(b%256,rshift(b,8))
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+if bit32 then
+ local rshift=bit32.rshift
+ local function little(b)
+ if b<0x10000 then
+ return char(b%256,rshift(b,8))
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+ end
end
-end
-local function big(b)
- if b<0x10000 then
- return char(rshift(b,8),b%256)
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ local function big(b)
+ if b<0x10000 then
+ return char(rshift(b,8),b%256)
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ end
end
-end
-local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
-local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
-local function utf8_to_utf16_be(str,nobom)
- if nobom then
- return lpegmatch(b_remap,str)
- else
- return char(254,255)..lpegmatch(b_remap,str)
+ local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+ local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+ local function utf8_to_utf16_be(str,nobom)
+ if nobom then
+ return lpegmatch(b_remap,str)
+ else
+ return char(254,255)..lpegmatch(b_remap,str)
+ end
end
-end
-local function utf8_to_utf16_le(str,nobom)
- if nobom then
- return lpegmatch(l_remap,str)
- else
- return char(255,254)..lpegmatch(l_remap,str)
+ local function utf8_to_utf16_le(str,nobom)
+ if nobom then
+ return lpegmatch(l_remap,str)
+ else
+ return char(255,254)..lpegmatch(l_remap,str)
+ end
end
-end
-utf.utf8_to_utf16_be=utf8_to_utf16_be
-utf.utf8_to_utf16_le=utf8_to_utf16_le
-function utf.utf8_to_utf16(str,littleendian,nobom)
- if littleendian then
- return utf8_to_utf16_le(str,nobom)
- else
- return utf8_to_utf16_be(str,nobom)
+ utf.utf8_to_utf16_be=utf8_to_utf16_be
+ utf.utf8_to_utf16_le=utf8_to_utf16_le
+ function utf.utf8_to_utf16(str,littleendian,nobom)
+ if littleendian then
+ return utf8_to_utf16_le(str,nobom)
+ else
+ return utf8_to_utf16_be(str,nobom)
+ end
end
end
local pattern=Cs (
@@ -6467,7 +6563,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 43488, stripped down to: 21595
+-- original size: 45188, stripped down to: 22734
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -6797,6 +6893,13 @@ local template=[[
%s
return function(%s) return %s end
]]
+local pattern=Cs(Cc('"')*(
+ (1-S('"\\\n\r'))^1+P('"')/'\\"'+P('\\')/'\\\\'+P('\n')/'\\n'+P('\r')/'\\r'
+)^0*Cc('"'))
+patterns.escapedquotes=pattern
+function string.escapedquotes(s)
+ return lpegmatch(pattern,s)
+end
local preamble=""
local environment={
global=global or _G,
@@ -6821,9 +6924,10 @@ local environment={
formattednumber=number.formatted,
sparseexponent=number.sparseexponent,
formattedfloat=number.formattedfloat,
- stripzero=lpeg.patterns.stripzero,
- stripzeros=lpeg.patterns.stripzeros,
- FORMAT=string.f9,
+ stripzero=patterns.stripzero,
+ stripzeros=patterns.stripzeros,
+ escapedquotes=string.escapedquotes,
+ FORMAT=string.f6,
}
local arguments={ "a1" }
setmetatable(arguments,{ __index=function(t,k)
@@ -6874,13 +6978,16 @@ local format_left=function(f)
return format("a%s..utfpadding(a%s,%i)",n,n,-f)
end
end
-local format_q=function()
+local format_q=JITSUPPORTED and function()
n=n+1
return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n)
+end or function()
+ n=n+1
+ return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n)
end
local format_Q=function()
n=n+1
- return format("format('%%q',tostring(a%s))",n)
+ return format("escapedquotes(tostring(a%s))",n)
end
local format_i=function(f)
n=n+1
@@ -7031,12 +7138,25 @@ local format_n=function()
n=n+1
return format("((a%s %% 1 == 0) and format('%%i',a%s) or tostring(a%s))",n,n,n)
end
-local format_N=function(f)
- n=n+1
- if not f or f=="" then
- f=".9"
- end
- return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+local format_N if environment.FORMAT then
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ return format("FORMAT(a%s,'%%.9f')",n)
+ elseif f==".6" or f=="0.6" then
+ return format("FORMAT(a%s)",n)
+ else
+ return format("FORMAT(a%s,'%%%sf')",n,f)
+ end
+ end
+else
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ f=".9"
+ end
+ return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+ end
end
local format_a=function(f)
n=n+1
@@ -7265,9 +7385,9 @@ patterns.xmlescape=Cs((P("<")/"&lt;"+P(">")/"&gt;"+P("&")/"&amp;"+P('"')/"&quot;
patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+anything)^0)
patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0)
patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"'))
-add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=lpeg.patterns.xmlescape })
-add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
-add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
+add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=patterns.xmlescape })
+add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=patterns.texescape })
+add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=patterns.luaescape })
local dquote=patterns.dquote
local equote=patterns.escaped+dquote/'\\"'+1
local cquote=Cc('"')
@@ -7299,6 +7419,27 @@ local f_16_16=formatters["%0.5N"]
function number.to16dot16(n)
return f_16_16(n/65536.0)
end
+if not string.explode then
+ local tsplitat=lpeg.tsplitat
+ local p_utf=patterns.utf8character
+ local p_check=C(p_utf)*(P("+")*Cc(true))^0
+ local p_split=Ct(C(p_utf)^0)
+ local p_space=Ct((C(1-P(" ")^1)+P(" ")^1)^0)
+ function string.explode(str,symbol)
+ if symbol=="" then
+ return lpegmatch(p_split,str)
+ elseif symbol then
+ local a,b=lpegmatch(p_check,symbol)
+ if b then
+ return lpegmatch(tsplitat(P(a)^1),str)
+ else
+ return lpegmatch(tsplitat(a),str)
+ end
+ else
+ return lpegmatch(p_space,str)
+ end
+ end
+end
end -- of closure
@@ -7307,7 +7448,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 28866, stripped down to: 16134
+-- original size: 32649, stripped down to: 18257
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -7544,78 +7685,160 @@ function tables.encapsulate(core,capsule,protect)
} )
end
end
-local f_hashed_string=formatters["[%q]=%q,"]
-local f_hashed_number=formatters["[%q]=%s,"]
-local f_hashed_boolean=formatters["[%q]=%l,"]
-local f_hashed_table=formatters["[%q]="]
-local f_indexed_string=formatters["[%s]=%q,"]
-local f_indexed_number=formatters["[%s]=%s,"]
-local f_indexed_boolean=formatters["[%s]=%l,"]
-local f_indexed_table=formatters["[%s]="]
-local f_ordered_string=formatters["%q,"]
-local f_ordered_number=formatters["%s,"]
-local f_ordered_boolean=formatters["%l,"]
-function table.fastserialize(t,prefix)
- local r={ type(prefix)=="string" and prefix or "return" }
- local m=1
- local function fastserialize(t,outer)
- local n=#t
- m=m+1
- r[m]="{"
- if n>0 then
- for i=0,n do
- local v=t[i]
- local tv=type(v)
- if tv=="string" then
- m=m+1 r[m]=f_ordered_string(v)
- elseif tv=="number" then
- m=m+1 r[m]=f_ordered_number(v)
- elseif tv=="table" then
- fastserialize(v)
- elseif tv=="boolean" then
- m=m+1 r[m]=f_ordered_boolean(v)
+if JITSUPPORTED then
+ local f_hashed_string=formatters["[%Q]=%Q,"]
+ local f_hashed_number=formatters["[%Q]=%s,"]
+ local f_hashed_boolean=formatters["[%Q]=%l,"]
+ local f_hashed_table=formatters["[%Q]="]
+ local f_indexed_string=formatters["[%s]=%Q,"]
+ local f_indexed_number=formatters["[%s]=%s,"]
+ local f_indexed_boolean=formatters["[%s]=%l,"]
+ local f_indexed_table=formatters["[%s]="]
+ local f_ordered_string=formatters["%Q,"]
+ local f_ordered_number=formatters["%s,"]
+ local f_ordered_boolean=formatters["%l,"]
+ function table.fastserialize(t,prefix)
+ local r={ type(prefix)=="string" and prefix or "return" }
+ local m=1
+ local function fastserialize(t,outer)
+ local n=#t
+ m=m+1
+ r[m]="{"
+ if n>0 then
+ local v=t[0]
+ if v then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(0,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(0,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(0)
+ fastserialize(v)
+ m=m+1 r[m]=f_indexed_table(0)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(0,v)
+ end
+ end
+ for i=1,n do
+ local v=t[i]
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_ordered_string(v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_ordered_number(v)
+ elseif tv=="table" then
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_ordered_boolean(v)
+ end
end
end
- end
- for k,v in next,t do
- local tk=type(k)
- if tk=="number" then
- if k>n or k<0 then
+ for k,v in next,t do
+ local tk=type(k)
+ if tk=="number" then
+ if k>n or k<0 then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(k,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(k,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(k)
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(k,v)
+ end
+ end
+ else
local tv=type(v)
if tv=="string" then
- m=m+1 r[m]=f_indexed_string(k,v)
+ m=m+1 r[m]=f_hashed_string(k,v)
elseif tv=="number" then
- m=m+1 r[m]=f_indexed_number(k,v)
+ m=m+1 r[m]=f_hashed_number(k,v)
elseif tv=="table" then
- m=m+1 r[m]=f_indexed_table(k)
+ m=m+1 r[m]=f_hashed_table(k)
fastserialize(v)
elseif tv=="boolean" then
- m=m+1 r[m]=f_indexed_boolean(k,v)
+ m=m+1 r[m]=f_hashed_boolean(k,v)
end
end
+ end
+ m=m+1
+ if outer then
+ r[m]="}"
else
- local tv=type(v)
- if tv=="string" then
- m=m+1 r[m]=f_hashed_string(k,v)
- elseif tv=="number" then
- m=m+1 r[m]=f_hashed_number(k,v)
- elseif tv=="table" then
- m=m+1 r[m]=f_hashed_table(k)
- fastserialize(v)
- elseif tv=="boolean" then
- m=m+1 r[m]=f_hashed_boolean(k,v)
- end
+ r[m]="},"
end
+ return r
end
- m=m+1
- if outer then
- r[m]="}"
- else
- r[m]="},"
+ return concat(fastserialize(t,true))
+ end
+else
+ local f_v=formatters["[%q]=%q,"]
+ local f_t=formatters["[%q]="]
+ local f_q=formatters["%q,"]
+ function table.fastserialize(t,prefix)
+ local r={ type(prefix)=="string" and prefix or "return" }
+ local m=1
+ local function fastserialize(t,outer)
+ local n=#t
+ m=m+1
+ r[m]="{"
+ if n>0 then
+ local v=t[0]
+ if v then
+ m=m+1
+ r[m]="[0]='"
+ if type(v)=="table" then
+ fastserialize(v)
+ else
+ r[m]=format("%q,",v)
+ end
+ end
+ for i=1,n do
+ local v=t[i]
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%i]=",i)
+ fastserialize(v)
+ else
+ r[m]=format("[%i]=%q,",i,v)
+ end
+ end
+ end
+ for k,v in next,t do
+ local tk=type(k)
+ if tk=="number" then
+ if k>n or k<0 then
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%i]=",k)
+ fastserialize(v)
+ else
+ r[m]=format("[%i]=%q,",k,v)
+ end
+ end
+ else
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%q]=",k)
+ fastserialize(v)
+ else
+ r[m]=format("[%q]=%q,",k,v)
+ end
+ end
+ end
+ m=m+1
+ if outer then
+ r[m]="}"
+ else
+ r[m]="},"
+ end
+ return r
end
- return r
+ return concat(fastserialize(t,true))
end
- return concat(fastserialize(t,true))
end
function table.deserialize(str)
if not str or str=="" then
@@ -7709,28 +7932,28 @@ function table.twowaymapper(t)
return t
end
local f_start_key_idx=formatters["%w{"]
-local f_start_key_num=formatters["%w[%s]={"]
+local f_start_key_num=JITSUPPORTED and formatters["%w[%s]={"] or formatters["%w[%q]={"]
local f_start_key_str=formatters["%w[%q]={"]
local f_start_key_boo=formatters["%w[%l]={"]
local f_start_key_nop=formatters["%w{"]
local f_stop=formatters["%w},"]
-local f_key_num_value_num=formatters["%w[%s]=%s,"]
-local f_key_str_value_num=formatters["%w[%q]=%s,"]
-local f_key_boo_value_num=formatters["%w[%l]=%s,"]
-local f_key_num_value_str=formatters["%w[%s]=%q,"]
-local f_key_str_value_str=formatters["%w[%q]=%q,"]
-local f_key_boo_value_str=formatters["%w[%l]=%q,"]
-local f_key_num_value_boo=formatters["%w[%s]=%l,"]
-local f_key_str_value_boo=formatters["%w[%q]=%l,"]
+local f_key_num_value_num=JITSUPPORTED and formatters["%w[%s]=%s,"] or formatters["%w[%s]=%q,"]
+local f_key_str_value_num=JITSUPPORTED and formatters["%w[%Q]=%s,"] or formatters["%w[%Q]=%q,"]
+local f_key_boo_value_num=JITSUPPORTED and formatters["%w[%l]=%s,"] or formatters["%w[%l]=%q,"]
+local f_key_num_value_str=JITSUPPORTED and formatters["%w[%s]=%Q,"] or formatters["%w[%q]=%Q,"]
+local f_key_str_value_str=formatters["%w[%Q]=%Q,"]
+local f_key_boo_value_str=formatters["%w[%l]=%Q,"]
+local f_key_num_value_boo=JITSUPPORTED and formatters["%w[%s]=%l,"] or formatters["%w[%q]=%l,"]
+local f_key_str_value_boo=formatters["%w[%Q]=%l,"]
local f_key_boo_value_boo=formatters["%w[%l]=%l,"]
-local f_key_num_value_not=formatters["%w[%s]={},"]
-local f_key_str_value_not=formatters["%w[%q]={},"]
+local f_key_num_value_not=JITSUPPORTED and formatters["%w[%s]={},"] or formatters["%w[%q]={},"]
+local f_key_str_value_not=formatters["%w[%Q]={},"]
local f_key_boo_value_not=formatters["%w[%l]={},"]
-local f_key_num_value_seq=formatters["%w[%s]={ %, t },"]
-local f_key_str_value_seq=formatters["%w[%q]={ %, t },"]
+local f_key_num_value_seq=JITSUPPORTED and formatters["%w[%s]={ %, t },"] or formatters["%w[%q]={ %, t },"]
+local f_key_str_value_seq=formatters["%w[%Q]={ %, t },"]
local f_key_boo_value_seq=formatters["%w[%l]={ %, t },"]
-local f_val_num=formatters["%w%s,"]
-local f_val_str=formatters["%w%q,"]
+local f_val_num=JITSUPPORTED and formatters["%w%s,"] or formatters["%w%q,"]
+local f_val_str=formatters["%w%Q,"]
local f_val_boo=formatters["%w%l,"]
local f_val_not=formatters["%w{},"]
local f_val_seq=formatters["%w{ %, t },"]
@@ -7738,7 +7961,7 @@ local f_fin_seq=formatters[" %, t }"]
local f_table_return=formatters["return {"]
local f_table_name=formatters["%s={"]
local f_table_direct=formatters["{"]
-local f_table_entry=formatters["[%q]={"]
+local f_table_entry=formatters["[%Q]={"]
local f_table_finish=formatters["}"]
local spaces=utilities.strings.newrepeater(" ")
local original_serialize=table.serialize
@@ -8339,7 +8562,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sac"] = package.loaded["util-sac"] or true
--- original size: 11332, stripped down to: 8420
+-- original size: 12946, stripped down to: 9507
if not modules then modules={} end modules ['util-sac']={
version=1.001,
@@ -8374,6 +8597,7 @@ end
function streams.size(f)
return f and f[3] or 0
end
+streams.getsize=streams.size
function streams.setposition(f,i)
if f[4] then
if i<=0 then
@@ -8566,9 +8790,9 @@ function streams.readfixed2(f)
f[2]=j+1
local a,b=byte(f[1],i,j)
if a>=0x80 then
- tonumber((a-0x100).."."..b)
+ return tonumber((a-0x100).."."..b) or 0
else
- tonumber((a ).."."..b)
+ return tonumber((a ).."."..b) or 0
end
end
function streams.readfixed4(f)
@@ -8577,9 +8801,9 @@ function streams.readfixed4(f)
f[2]=j+1
local a,b,c,d=byte(f[1],i,j)
if a>=0x80 then
- tonumber((0x100*a+b-0x10000).."."..(0x100*c+d))
+ return tonumber((0x100*a+b-0x10000).."."..(0x100*c+d)) or 0
else
- tonumber((0x100*a+b ).."."..(0x100*c+d))
+ return tonumber((0x100*a+b ).."."..(0x100*c+d)) or 0
end
end
if bit32 then
@@ -8659,6 +8883,16 @@ if sio and sio.readcardinal2 then
f[2]=i+4
return readinteger4(f[1],i)
end
+ function streams.readfixed2(f)
+ local i=f[2]
+ f[2]=i+2
+ return readfixed2(f[1],i)
+ end
+ function streams.readfixed4(f)
+ local i=f[2]
+ f[2]=i+4
+ return readfixed4(f[1],i)
+ end
function streams.read2dot4(f)
local i=f[2]
f[2]=i+2
@@ -8758,6 +8992,50 @@ else
return t
end
end
+do
+ local files=utilities.files
+ if files then
+ local openfile=files.open
+ local openstream=streams.open
+ local openstring=streams.openstring
+ local setmetatable=setmetatable
+ function io.newreader(str,method)
+ local f,m
+ if method=="string" then
+ f=openstring(str)
+ m=streams
+ elseif method=="stream" then
+ f=openstream(str)
+ m=streams
+ else
+ f=openfile(str,"rb")
+ m=files
+ end
+ if f then
+ local t={}
+ setmetatable(t,{
+ __index=function(t,k)
+ local r=m[k]
+ if k=="close" then
+ if f then
+ m.close(f)
+ f=nil
+ end
+ return function() end
+ elseif r then
+ local v=function(_,a,b) return r(f,a,b) end
+ t[k]=v
+ return v
+ else
+ print("unknown key",k)
+ end
+ end
+ } )
+ return t
+ end
+ end
+ end
+end
end -- of closure
@@ -9801,7 +10079,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-copas"] = package.loaded["util-soc-imp-copas"] or true
--- original size: 25844, stripped down to: 14821
+-- original size: 25959, stripped down to: 14893
local socket=socket or require("socket")
@@ -9838,6 +10116,7 @@ local copas={
autoclose=true,
running=false,
report=report,
+ trace=false,
}
local function statushandler(status,...)
if status then
@@ -9847,7 +10126,9 @@ local function statushandler(status,...)
if type(err)=="table" then
err=err[1]
end
- report("error: %s",tostring(err))
+ if copas.trace then
+ report("error: %s",tostring(err))
+ end
return nil,err
end
function socket.protect(func)
@@ -9861,7 +10142,9 @@ function socket.newtry(finalizer)
if not status then
local detail=select(2,...)
pcall(finalizer,detail)
- report("error: %s",tostring(detail))
+ if copas.trace then
+ report("error: %s",tostring(detail))
+ end
return
end
return...
@@ -12429,7 +12712,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-set"] = package.loaded["trac-set"] or true
--- original size: 13340, stripped down to: 8826
+-- original size: 13394, stripped down to: 8882
if not modules then modules={} end modules ['trac-set']={
version=1.001,
@@ -12439,8 +12722,9 @@ if not modules then modules={} end modules ['trac-set']={
license="see context related readme files"
}
local type,next,tostring,tonumber=type,next,tostring,tonumber
+local print=print
local concat,sortedhash=table.concat,table.sortedhash
-local format,find,lower,gsub,topattern=string.format,string.find,string.lower,string.gsub,string.topattern
+local formatters,find,lower,gsub,topattern=string.formatters,string.find,string.lower,string.gsub,string.topattern
local is_boolean=string.is_boolean
local settings_to_hash=utilities.parsers.settings_to_hash
local allocate=utilities.storage.allocate
@@ -12450,10 +12734,10 @@ local setters=utilities.setters or {}
utilities.setters=setters
local data={}
local trace_initialize=false
+local frozen=true
function setters.initialize(filename,name,values)
local setter=data[name]
if setter then
- frozen=true
local data=setter.data
if data then
for key,newvalue in sortedhash(values) do
@@ -12647,8 +12931,8 @@ function setters.show(t)
end
end
local enable,disable,register,list,show=setters.enable,setters.disable,setters.register,setters.list,setters.show
-function setters.report(setter,...)
- print(format("%-15s : %s\n",setter.name,format(...)))
+function setters.report(setter,fmt,...)
+ print(formatters["%-15s : %s\n"](setter.name,formatters[fmt](...)))
end
local function default(setter,name)
local d=setter.data[name]
@@ -12668,7 +12952,7 @@ function setters.new(name)
disable=function(...) disable (setter,...) end,
reset=function(...) reset (setter,...) end,
register=function(...) register(setter,...) end,
- list=function(...) list (setter,...) end,
+ list=function(...) return list (setter,...) end,
show=function(...) show (setter,...) end,
default=function(...) return default (setter,...) end,
value=function(...) return value (setter,...) end,
@@ -12771,7 +13055,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 32618, stripped down to: 20935
+-- original size: 33003, stripped down to: 21667
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -12816,14 +13100,30 @@ local function ignore() end
setmetatableindex(logs,function(t,k) t[k]=ignore;return ignore end)
local report,subreport,status,settarget,setformats,settranslations
local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
+local function ansisupported(specification)
+ if specification~="ansi" and specification~="ansilog" then
+ return false
+ elseif os and os.enableansi then
+ return os.enableansi()
+ else
+ return false
+ end
+end
if runningtex and texio then
if texio.setescape then
texio.setescape(0)
end
- if arg then
+ if arg and ansisupported then
for k,v in next,arg do
if v=="--ansi" or v=="--c:ansi" then
- variant="ansi"
+ if ansisupported("ansi") then
+ variant="ansi"
+ end
+ break
+ elseif v=="--ansilog" or v=="--c:ansilog" then
+ if ansisupported("ansilog") then
+ variant="ansilog"
+ end
break
end
end
@@ -12928,6 +13228,10 @@ if runningtex and texio then
},
}
}
+ variants.ansilog={
+ formats=variants.ansi.formats,
+ targets=variants.default.targets,
+ }
logs.flush=io.flush
writer=function(...)
write_nl(target,...)
@@ -13034,6 +13338,9 @@ if runningtex and texio then
t=specification.targets
f=specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification="default"
+ end
local v=variants[specification]
if v then
t=v.targets
@@ -13060,7 +13367,7 @@ if runningtex and texio then
subdirect_nop=f.subdirect_nop
status_yes=f.status_yes
status_nop=f.status_nop
- if variant=="ansi" then
+ if variant=="ansi" or variant=="ansilog" then
useluawrites()
end
settarget(whereto)
@@ -13153,6 +13460,9 @@ else
if type(specification)=="table" then
f=specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification="default"
+ end
local v=variants[specification]
if v then
f=v.formats
@@ -13408,12 +13718,6 @@ end
local nesting=0
local verbose=false
local hasscheme=url.hasscheme
-function logs.show_open(name)
-end
-function logs.show_close(name)
-end
-function logs.show_load(name)
-end
local simple=logs.reporter("comment")
logs.simple=simple
logs.simpleline=simple
@@ -13480,6 +13784,13 @@ local exporters={
logs.reporters=reporters
logs.exporters=exporters
function logs.application(t)
+ local arguments=environment and environment.arguments
+ if arguments then
+ local ansi=arguments.ansi or arguments.ansilog
+ if ansi then
+ logs.setformatters(arguments.ansi and "ansi" or "ansilog")
+ end
+ end
t.name=t.name or "unknown"
t.banner=t.banner
t.moreinfo=moreinfo
@@ -13553,8 +13864,6 @@ else
print(format(...))
end
end
-io.stdout:setvbuf('no')
-io.stderr:setvbuf('no')
if package.helpers.report then
package.helpers.report=logs.reporter("package loader")
end
@@ -13652,7 +13961,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-inf"] = package.loaded["trac-inf"] or true
--- original size: 8966, stripped down to: 5972
+-- original size: 9973, stripped down to: 7492
if not modules then modules={} end modules ['trac-inf']={
version=1.001,
@@ -13674,7 +13983,7 @@ statistics.enable=true
statistics.threshold=0.01
local statusinfo,n,registered,timers={},0,{},{}
setmetatableindex(timers,function(t,k)
- local v={ timing=0,loadtime=0 }
+ local v={ timing=0,loadtime=0,offset=0 }
t[k]=v
return v
end)
@@ -13682,10 +13991,40 @@ local function hastiming(instance)
return instance and timers[instance]
end
local function resettiming(instance)
- timers[instance or "notimer"]={ timing=0,loadtime=0 }
+ timers[instance or "notimer"]={ timing=0,loadtime=0,offset=0 }
end
local ticks=clock
local seconds=function(n) return n or 0 end
+if lua.getpreciseticks then
+ ticks=lua.getpreciseticks
+ seconds=lua.getpreciseseconds
+elseif FFISUPPORTED and ffi and os.type=="windows" then
+ local okay,kernel=pcall(ffi.load,"kernel32")
+ if kernel then
+ local tonumber=ffi.number or tonumber
+ ffi.cdef[[
+ int QueryPerformanceFrequency(int64_t *lpFrequency);
+ int QueryPerformanceCounter(int64_t *lpPerformanceCount);
+ ]]
+ local target=ffi.new("__int64[1]")
+ ticks=function()
+ if kernel.QueryPerformanceCounter(target)==1 then
+ return tonumber(target[0])
+ else
+ return 0
+ end
+ end
+ local target=ffi.new("__int64[1]")
+ seconds=function(ticks)
+ if kernel.QueryPerformanceFrequency(target)==1 then
+ return ticks/tonumber(target[0])
+ else
+ return 0
+ end
+ end
+ end
+else
+end
local function starttiming(instance,reset)
local timer=timers[instance or "notimer"]
local it=timer.timing
@@ -13720,12 +14059,26 @@ local function stoptiming(instance)
end
return 0
end
+local function benchmarktimer(instance)
+ local timer=timers[instance or "notimer"]
+ local it=timer.timing
+ if it>1 then
+ timer.timing=it-1
+ else
+ local starttime=timer.starttime
+ if starttime and starttime>0 then
+ timer.offset=ticks()-starttime
+ else
+ timer.offset=0
+ end
+ end
+end
local function elapsed(instance)
if type(instance)=="number" then
return instance
else
local timer=timers[instance or "notimer"]
- return timer and seconds(timer.loadtime) or 0
+ return timer and seconds(timer.loadtime-2*(timer.offset or 0)) or 0
end
end
local function currenttime(instance)
@@ -13738,7 +14091,7 @@ local function currenttime(instance)
else
local starttime=timer.starttime
if starttime and starttime>0 then
- return seconds(timer.loadtime+ticks()-starttime)
+ return seconds(timer.loadtime+ticks()-starttime-2*(timer.offset or 0))
end
end
return 0
@@ -13764,6 +14117,7 @@ statistics.elapsed=elapsed
statistics.elapsedtime=elapsedtime
statistics.elapsedindeed=elapsedindeed
statistics.elapsedseconds=elapsedseconds
+statistics.benchmarktimer=benchmarktimer
function statistics.register(tag,fnc)
if statistics.enable and type(fnc)=="function" then
local rt=registered[tag] or (#statusinfo+1)
@@ -13780,10 +14134,17 @@ function statistics.show()
return format("%s, type: %s, binary subtree: %s",
os.platform or "unknown",os.type or "unknown",environment.texos or "unknown")
end)
- register("used engine",function()
- return format("%s version %s with functionality level %s, banner: %s",
- LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner))
- end)
+ if LUATEXENGINE=="luametatex" then
+ register("used engine",function()
+ return format("%s version %s, functionality level %s, format id %s",
+ LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,LUATEXFORMATID)
+ end)
+ else
+ register("used engine",function()
+ return format("%s version %s with functionality level %s, banner: %s",
+ LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner))
+ end)
+ end
register("control sequences",function()
return format("%s of %s + %s",status.cs_count,status.hash_size,status.hash_extra)
end)
@@ -13822,7 +14183,11 @@ function statistics.show()
end
function statistics.memused()
local round=math.round or math.floor
- return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000),round(status.luastate_bytes/1000000))
+ return format("%s MB, ctx: %s MB, max: %s MB)",
+ round(collectgarbage("count")/1000),
+ round(status.luastate_bytes/1000000),
+ status.luastate_bytes_max and round(status.luastate_bytes_max/1000000) or "unknown"
+ )
end
starttiming(statistics)
function statistics.formatruntime(runtime)
@@ -14013,7 +14378,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-lua"] = package.loaded["util-lua"] or true
--- original size: 6664, stripped down to: 4589
+-- original size: 7149, stripped down to: 4997
if not modules then modules={} end modules ['util-lua']={
version=1.001,
@@ -14038,16 +14403,21 @@ luautilities.nofstrippedchunks=0
luautilities.nofstrippedbytes=0
local strippedchunks={}
luautilities.strippedchunks=strippedchunks
+if not LUATEXENGINE then
+ LUATEXENGINE=status.luatex_engine and string.lower(status.luatex_engine)
+ JITSUPPORTED=LUATEXENGINE=="luajittex" or jit
+ CONTEXTLMTXMODE=CONTEXTLMTXMODE or (LUATEXENGINE=="luametatex" and 1) or 0
+end
luautilities.suffixes={
tma="tma",
- tmc=jit and "tmb" or "tmc",
+ tmc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tmd") or (jit and "tmb") or "tmc",
lua="lua",
- luc=jit and "lub" or "luc",
+ luc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "lud") or (jit and "lub") or "luc",
lui="lui",
luv="luv",
luj="luj",
tua="tua",
- tuc="tuc",
+ tuc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tud") or (jit and "tub") or "tuc",
}
local function register(name)
if tracestripping then
@@ -14186,7 +14556,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-deb"] = package.loaded["util-deb"] or true
--- original size: 9955, stripped down to: 6693
+-- original size: 10136, stripped down to: 6832
if not modules then modules={} end modules ['util-deb']={
version=1.001,
@@ -14210,7 +14580,13 @@ local dummycalls=10*1000
local nesting=0
local names={}
local initialize=false
-if not (FFISUPPORTED and ffi) then
+if lua.getpreciseticks then
+ initialize=function()
+ ticks=lua.getpreciseticks
+ seconds=lua.getpreciseseconds
+ initialize=false
+ end
+elseif not (FFISUPPORTED and ffi) then
elseif os.type=="windows" then
initialize=function()
local kernel=ffilib("kernel32","system")
@@ -14482,7 +14858,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tpl"] = package.loaded["util-tpl"] or true
--- original size: 7112, stripped down to: 3887
+-- original size: 7722, stripped down to: 4212
if not modules then modules={} end modules ['util-tpl']={
version=1.001,
@@ -14498,6 +14874,7 @@ local report_template=logs.reporter("template")
local tostring,next=tostring,next
local format,sub,byte=string.format,string.sub,string.byte
local P,C,R,Cs,Cc,Carg,lpegmatch,lpegpatterns=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.match,lpeg.patterns
+local formatters=string.formatters
local replacer
local function replacekey(k,t,how,recursive)
local v=t[k]
@@ -14566,6 +14943,10 @@ local function replaceoptional(l,m,r,t,how,recurse)
local v=t[l]
return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
+local function replaceformatted(l,m,r,t,how,recurse)
+ local v=t[r]
+ return v and formatters[l](v)
+end
local single=P("%")
local double=P("%%")
local lquoted=P("%[")
@@ -14579,16 +14960,19 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
+local nolformatted=P(":")/"%%"
+local norformatted=P(":")/""
local noloptional=P("%?")/''
local noroptional=P("?%")/''
local nomoptional=P(":")/''
local args=Carg(1)*Carg(2)*Carg(3)
-local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local key=nosingle*((C((1-nosingle)^1)*args)/replacekey)*nosingle
+local quoted=nolquotedq*((C((1-norquotedq)^1)*args)/replacekeyquoted)*norquotedq
+local unquoted=nolquoted*((C((1-norquoted)^1)*args)/replacekeyunquoted)*norquoted
local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
+local formatted=nosingle*((Cs(nolformatted*(1-norformatted )^1)*norformatted*C((1-nosingle)^1)*args)/replaceformatted)*nosingle
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
+ replacer=Cs((unquoted+quoted+formatted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
@@ -14627,7 +15011,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sbx"] = package.loaded["util-sbx"] or true
--- original size: 20393, stripped down to: 13121
+-- original size: 21084, stripped down to: 13214
if not modules then modules={} end modules ['util-sbx']={
version=1.001,
@@ -14873,37 +15257,50 @@ local iopopen=sandbox.original(io.popen)
local reported={}
local function validcommand(name,program,template,checkers,defaults,variables,reporter,strict)
if validbinaries~=false and (validbinaries==true or validbinaries[program]) then
+ local binpath=nil
if variables then
for variable,value in next,variables do
- local checker=validators[checkers[variable]]
- if checker then
- value=checker(unquoted(value),strict)
- if value then
- variables[variable]=optionalquoted(value)
+ local chktype=checkers[variable]
+ if chktype=="verbose" then
+ else
+ local checker=validators[chktype]
+ if checker then
+ value=checker(unquoted(value),strict)
+ if value then
+ variables[variable]=optionalquoted(value)
+ else
+ report("variable %a with value %a fails the check",variable,value)
+ return
+ end
else
- report("variable %a with value %a fails the check",variable,value)
+ report("variable %a has no checker",variable)
return
end
- else
- report("variable %a has no checker",variable)
- return
end
end
for variable,default in next,defaults do
local value=variables[variable]
if not value or value=="" then
- local checker=validators[checkers[variable]]
- if checker then
- default=checker(unquoted(default),strict)
- if default then
- variables[variable]=optionalquoted(default)
- else
- report("variable %a with default %a fails the check",variable,default)
- return
+ local chktype=checkers[variable]
+ if chktype=="verbose" then
+ else
+ local checker=validators[chktype]
+ if checker then
+ default=checker(unquoted(default),strict)
+ if default then
+ variables[variable]=optionalquoted(default)
+ else
+ report("variable %a with default %a fails the check",variable,default)
+ return
+ end
end
end
end
end
+ binpath=variables.binarypath
+ end
+ if type(binpath)=="string" and binpath~="" then
+ program=binpath.."/"..program
end
local command=program.." "..replace(template,variables)
if reporter then
@@ -14938,7 +15335,8 @@ local runners={
if trace then
report("execute: %s",command)
end
- return osexecute(command)
+ local okay=osexecute(command)
+ return okay
end
end,
pipeto=function(...)
@@ -14972,7 +15370,7 @@ function sandbox.registerrunner(specification)
return
end
if validrunners[name] then
- report("invalid name, runner %a already defined")
+ report("invalid name, runner %a already defined",name)
return
end
local program=specification.program
@@ -15090,8 +15488,8 @@ if io then
end
if os then
overload(os.execute,binaryrunner,"os.execute")
- overload(os.spawn,dummyrunner,"os.spawn")
- overload(os.exec,dummyrunner,"os.exec")
+ overload(os.spawn,dummyrunner,"os.spawn")
+ overload(os.exec,dummyrunner,"os.exec")
overload(os.resultof,binaryrunner,"os.resultof")
overload(os.pipeto,binaryrunner,"os.pipeto")
overload(os.rename,filehandlertwo,"os.rename")
@@ -15116,13 +15514,6 @@ end
if zip then
zip.open=register(zip.open,filehandlerone,"zip.open")
end
-if fontloader then
- fontloader.open=register(fontloader.open,filehandlerone,"fontloader.open")
- fontloader.info=register(fontloader.info,filehandlerone,"fontloader.info")
-end
-if epdf then
- epdf.open=register(epdf.open,filehandlerone,"epdf.open")
-end
sandbox.registerroot=registerroot
sandbox.registerbinary=registerbinary
sandbox.registerlibrary=registerlibrary
@@ -15528,7 +15919,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-env"] = package.loaded["luat-env"] or true
--- original size: 6134, stripped down to: 4118
+-- original size: 6551, stripped down to: 4315
if not modules then modules={} end modules ['luat-env']={
version=1.001,
@@ -15537,7 +15928,7 @@ package.loaded["luat-env"] = package.loaded["luat-env"] or true
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local rawset,rawget,loadfile=rawset,rawget,loadfile
+local rawset,loadfile=rawset,loadfile
local gsub=string.gsub
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_lua=logs.reporter("resolvers","lua")
@@ -15584,6 +15975,12 @@ function environment.texfile(filename)
return resolvers.findfile(filename,'tex')
end
function environment.luafile(filename)
+ if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and file.suffix(filename)=="lua" then
+ local resolved=resolvers.findfile(file.replacesuffix(filename,"lmt")) or ""
+ if resolved~="" then
+ return resolved
+ end
+ end
local resolved=resolvers.findfile(filename,'tex') or ""
if resolved~="" then
return resolved
@@ -15695,7 +16092,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-zip"] = package.loaded["util-zip"] or true
--- original size: 18645, stripped down to: 11291
+-- original size: 19496, stripped down to: 10858
if not modules then modules={} end modules ['util-zip']={
version=1.001,
@@ -15706,7 +16103,7 @@ if not modules then modules={} end modules ['util-zip']={
local type,tostring,tonumber=type,tostring,tonumber
local sort=table.sort
local find,format,sub,gsub=string.find,string.format,string.sub,string.gsub
-local osdate,ostime=os.date,os.time
+local osdate,ostime,osclock=os.date,os.time,os.clock
local ioopen=io.open
local loaddata,savedata=io.loaddata,io.savedata
local filejoin,isdir,dirname,mkdirs=file.join,lfs.isdir,file.dirname,dir.mkdirs
@@ -15721,25 +16118,19 @@ local getposition=files.getposition
local band=bit32.band
local rshift=bit32.rshift
local lshift=bit32.lshift
-local decompress,calculatecrc
-if flate then
- decompress=flate.flate_decompress
- calculatecrc=flate.update_crc32
-else
+local decompress,expandsize,calculatecrc
local zlibdecompress=zlib.decompress
+ local zlibexpandsize=zlib.expandsize
local zlibchecksum=zlib.crc32
- decompress=function(source,targetsize)
- local target=zlibdecompress(source,-15)
- if target then
- return target
- else
- return false,1
- end
+ decompress=function(source)
+ return zlibdecompress(source,-15)
end
+ expandsize=zlibexpandsize and function(source,targetsize)
+ return zlibexpandsize(source,targetsize,-15)
+ end or decompress
calculatecrc=function(buffer,initial)
return zlibchecksum(initial or 0,buffer)
end
-end
local zipfiles={}
utilities.zipfiles=zipfiles
local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
@@ -15864,7 +16255,11 @@ local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
setposition(handle,position)
local result=readstring(handle,compressed)
if data.method==8 then
- result=decompress(result,data.uncompressed)
+ if expandsize then
+ result=expandsize(result,data.uncompressed)
+ else
+ result=decompress(result)
+ end
end
if check and data.crc32~=calculatecrc(result) then
print("checksum mismatch")
@@ -15883,14 +16278,14 @@ local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
zipfiles.list=getziplist
zipfiles.found=foundzipfile
end
-if flate then do
+if xzip then
local writecardinal1=files.writebyte
local writecardinal2=files.writecardinal2le
local writecardinal4=files.writecardinal4le
local logwriter=logs.writer
local globpattern=dir.globpattern
- local compress=flate.flate_compress
- local checksum=flate.update_crc32
+ local compress=xzip.compress
+ local checksum=xzip.crc32
local function fromdostime(dostime,dosdate)
return ostime {
year=rshift(dosdate,9)+1980,
@@ -16087,27 +16482,33 @@ if flate then do
local count=#list
local step=number.idiv(count,10)
local done=0
+ local steps=verbose=="steps"
+ local time=steps and osclock()
for i=1,count do
local l=list[i]
local n=l.filename
local d=unzipfile(z,n)
- local p=filejoin(path,n)
- if mkdirs(dirname(p)) then
- if verbose=="steps" then
- total=total+#d
- done=done+1
- if done>=step then
- done=0
- logwriter(format("%4i files of %4i done, %10i bytes",i,count,total))
+ if d then
+ local p=filejoin(path,n)
+ if mkdirs(dirname(p)) then
+ if steps then
+ total=total+#d
+ done=done+1
+ if done>=step then
+ done=0
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",i,count,total,osclock()-time))
+ end
+ elseif verbose then
+ logwriter(n)
end
- elseif verbose then
- logwriter(n)
+ savedata(p,d)
end
- savedata(p,d)
+ else
+ logwriter(format("problem with file %s",n))
end
end
- if verbose=="steps" then
- logwriter(format("%4i files of %4i done, %10i bytes",count,count,total))
+ if steps then
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",count,count,total,osclock()-time))
end
closezipfile(z)
return true
@@ -16118,37 +16519,8 @@ if flate then do
end
zipfiles.zipdir=zipdir
zipfiles.unzipdir=unzipdir
-end end
-if flate then
- local streams=utilities.streams
- local openfile=streams.open
- local closestream=streams.close
- local setposition=streams.setposition
- local getsize=streams.size
- local readcardinal4=streams.readcardinal4le
- local getstring=streams.getstring
- local decompress=flate.gz_decompress
- function zipfiles.gunzipfile(filename)
- local strm=openfile(filename)
- if strm then
- setposition(strm,getsize(strm)-4+1)
- local size=readcardinal4(strm)
- local data=decompress(getstring(strm),size)
- closestream(strm)
- return data
- end
- end
-elseif gzip then
- local openfile=gzip.open
- function zipfiles.gunzipfile(filename)
- local g=openfile(filename,"rb")
- if g then
- local d=g:read("*a")
- d:close()
- return d
- end
- end
end
+zipfiles.gunzipfile=gzip.load
end -- of closure
@@ -16157,7 +16529,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
--- original size: 60383, stripped down to: 35698
+-- original size: 61191, stripped down to: 35864
if not modules then modules={} end modules ['lxml-tab']={
version=1.001,
@@ -16881,7 +17253,10 @@ local slash=P('/')
local colon=P(':')
local semicolon=P(';')
local ampersand=P('&')
-local valid=R('az','AZ','09')+S('_-.')
+local valid_0=R("\128\255")
+local valid_1=R('az','AZ')+S('_')+valid_0
+local valid_2=valid_1+R('09')+S('-.')
+local valid=valid_1*valid_2^0
local name_yes=C(valid^1)*colon*C(valid^1)
local name_nop=C(P(true))*C(valid^1)
local name=name_yes+name_nop
@@ -16917,8 +17292,9 @@ end
local function entityfile(pattern,k,v,n)
if n then
local okay,data
- if resolvers then
- okay,data=resolvers.loadbinfile(n)
+ local loadbinfile=resolvers and resolvers.loadbinfile
+ if loadbinfile then
+ okay,data=loadbinfile(n)
else
data=io.loaddata(n)
okay=data and data~=""
@@ -17027,12 +17403,14 @@ publicentityfile+publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*op
}
return grammar_parsed_text_one,grammar_parsed_text_two,grammar_unparsed_text
end
-grammar_parsed_text_one_nop,
-grammar_parsed_text_two_nop,
-grammar_unparsed_text_nop=install(space,spacing,anything)
-grammar_parsed_text_one_yes,
-grammar_parsed_text_two_yes,
-grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl)
+local
+ grammar_parsed_text_one_nop,
+ grammar_parsed_text_two_nop,
+ grammar_unparsed_text_nop=install(space,spacing,anything)
+local
+ grammar_parsed_text_one_yes,
+ grammar_parsed_text_two_yes,
+ grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl)
local function _xmlconvert_(data,settings,detail)
settings=settings or {}
preparexmlstate(settings)
@@ -17613,7 +17991,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-lpt"] = package.loaded["lxml-lpt"] or true
--- original size: 55145, stripped down to: 30992
+-- original size: 54626, stripped down to: 31255
if not modules then modules={} end modules ['lxml-lpt']={
version=1.001,
@@ -18095,6 +18473,8 @@ local builtin={
lastindex="(#ll.__p__.dt or 1)",
lastelement="(ll.__p__.en or 1)",
last="#list",
+ list="list",
+ self="ll",
rootposition="order",
order="order",
element="(ll.ei or 1)",
@@ -18203,7 +18583,8 @@ local function register_selector(specification)
end
local function register_expression(expression)
local converted=lpegmatch(converter,expression)
- local runner=load(format(template_e,converted))
+ local wrapped=format(template_e,converted)
+ local runner=load(wrapped)
runner=(runner and runner()) or function() errorrunner_e(expression,converted) end
return { kind="expression",expression=expression,converted=converted,evaluator=runner }
end
@@ -18575,6 +18956,20 @@ expressions.count=function(e,pattern)
local collected=applylpath(e,pattern)
return pattern and (collected and #collected) or 0
end
+expressions.attribute=function(e,name,value)
+ if type(e)=="table" and name then
+ local a=e.at
+ if a then
+ local v=a[name]
+ if value then
+ return v==value
+ else
+ return v
+ end
+ end
+ end
+ return nil
+end
expressions.oneof=function(s,...)
for i=1,select("#",...) do
if s==select(i,...) then
@@ -18621,7 +19016,7 @@ function expressions.contains(str,pattern)
end
return false
end
-function xml.expressions.idstring(str)
+function expressions.idstring(str)
return type(str)=="string" and gsub(str,"^#","") or ""
end
local function traverse(root,pattern,handle)
@@ -20394,7 +20789,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 11099, stripped down to: 7152
+-- original size: 11019, stripped down to: 7086
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -20407,9 +20802,9 @@ local next,type,getmetatable,rawset=next,type,getmetatable,rawset
local gsub,find,gmatch,char=string.gsub,string.find,string.gmatch,string.char
local filedirname,filebasename,filejoin=file.dirname,file.basename,file.join
local ostype,osname,osuname,ossetenv,osgetenv=os.type,os.name,os.uname,os.setenv,os.getenv
+local sortedpairs=table.sortedpairs
local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
-local trace_detail=false trackers.register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers.register("resolvers.expansions",function(v) trace_expansions=v end)
local report_initialization=logs.reporter("resolvers","initialization")
resolvers=resolvers or {}
@@ -20618,7 +21013,7 @@ if ostype=="unix" then
rawset(t,k,v)
end
local colon=P(":")
- for k,v in table.sortedpairs(prefixes) do
+ for k,v in sortedpairs(prefixes) do
if p then
p=P(k)+p
else
@@ -20645,7 +21040,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 18154, stripped down to: 10416
+-- original size: 18179, stripped down to: 10432
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -20929,7 +21324,7 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
scancache[sub(full,1,-2)]=files
return files,remap,n,m,r
end
-function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+local function scanfiles(path,branch,usecache,onlyonce,tolerant)
local realpath=resolveprefix(path)
if usecache then
local content=fullcache[realpath]
@@ -20984,8 +21379,9 @@ function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
statistics.stoptiming(timer)
return content
end
+resolvers.scanfiles=scanfiles
function resolvers.simplescanfiles(path,branch,usecache)
- return resolvers.scanfiles(path,branch,usecache,true,true)
+ return scanfiles(path,branch,usecache,true,true)
end
function resolvers.scandata()
table.sort(scanned)
@@ -21052,7 +21448,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-env"] = package.loaded["data-env"] or true
--- original size: 9360, stripped down to: 6312
+-- original size: 9400, stripped down to: 6347
if not modules then modules={} end modules ['data-env']={
version=1.001,
@@ -21062,7 +21458,7 @@ if not modules then modules={} end modules ['data-env']={
license="see context related readme files",
}
local lower,gsub=string.lower,string.gsub
-local next=next
+local next,rawget=next,rawget
local resolvers=resolvers
local allocate=utilities.storage.allocate
local setmetatableindex=table.setmetatableindex
@@ -21143,13 +21539,13 @@ local relations=allocate {
mp={
names={ "mp" },
variable='MPINPUTS',
- suffixes={ 'mp','mpvi','mpiv','mpii' },
+ suffixes={ 'mp','mpvi','mpiv','mpxl','mpii' },
usertype=true,
},
tex={
names={ "tex" },
variable='TEXINPUTS',
- suffixes={ "tex","mkvi","mkiv","mkii","cld","lfg","xml" },
+ suffixes={ "tex","mkiv","mkvi","mkxl","mklx","mkii","cld","lfg","xml" },
usertype=true,
},
icc={
@@ -21337,7 +21733,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 16284, stripped down to: 10938
+-- original size: 16099, stripped down to: 11379
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -21346,48 +21742,83 @@ if not modules then modules={} end modules ['data-tmp']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local format,lower,gsub,concat=string.format,string.lower,string.gsub,table.concat
-local concat=table.concat
-local mkdirs,isdir,isfile=dir.mkdirs,lfs.isdir,lfs.isfile
-local addsuffix,is_writable,is_readable=file.addsuffix,file.is_writable,file.is_readable
-local formatters=string.formatters
local next,type=next,type
+local pcall,loadfile,collectgarbage=pcall,loadfile,collectgarbage
+local format,lower,gsub=string.format,string.lower,string.gsub
+local concat,serialize,fastserialize,serializetofile=table.concat,table.serialize,table.fastserialize,table.tofile
+local mkdirs,expanddirname,isdir,isfile=dir.mkdirs,dir.expandname,lfs.isdir,lfs.isfile
+local is_writable,is_readable=file.is_writable,file.is_readable
+local collapsepath,joinfile,addsuffix,dirname=file.collapsepath,file.join,file.addsuffix,file.dirname
+local savedata=file.savedata
+local formatters=string.formatters
+local osexit,osdate,osuuid=os.exit,os.date,os.uuid
+local removefile=os.remove
+local md5hex=md5.hex
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local report_caches=logs.reporter("resolvers","caches")
local report_resolvers=logs.reporter("resolvers","caching")
local resolvers=resolvers
local cleanpath=resolvers.cleanpath
-local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
-local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
-local compile=utilities.lua.compile
-function utilities.lua.compile(luafile,lucfile,cleanup,strip)
- if cleanup==nil then cleanup=directive_cleanup end
- if strip==nil then strip=directive_strip end
- return compile(luafile,lucfile,cleanup,strip)
+local resolvepath=resolvers.resolve
+local luautilities=utilities.lua
+do
+ local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
+ local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
+ local compilelua=luautilities.compile
+ function luautilities.compile(luafile,lucfile,cleanup,strip)
+ if cleanup==nil then cleanup=directive_cleanup end
+ if strip==nil then strip=directive_strip end
+ return compilelua(luafile,lucfile,cleanup,strip)
+ end
end
caches=caches or {}
local caches=caches
-local luasuffixes=utilities.lua.suffixes
-caches.base=caches.base or "luatex-cache"
-caches.more=caches.more or "context"
-caches.direct=false
-caches.tree=false
-caches.force=true
-caches.ask=false
-caches.relocate=false
+local writable=nil
+local readables={}
+local usedreadables={}
+local compilelua=luautilities.compile
+local luasuffixes=luautilities.suffixes
+caches.base=caches.base or "luatex-cache"
+caches.more=caches.more or "context"
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
-directives.register("system.caches.fast",function(v) caches.fast=true end)
-local writable,readables,usedreadables=nil,{},{}
+local direct_cache=false
+local fast_cache=false
+local cache_tree=false
+directives.register("system.caches.direct",function(v) direct_cache=true end)
+directives.register("system.caches.fast",function(v) fast_cache=true end)
+local function configfiles()
+ return concat(resolvers.configurationfiles(),";")
+end
+local function hashed(tree)
+ tree=gsub(tree,"[\\/]+$","")
+ tree=lower(tree)
+ local hash=md5hex(tree)
+ if trace_cache or trace_locating then
+ report_caches("hashing tree %a, hash %a",tree,hash)
+ end
+ return hash
+end
+local function treehash()
+ local tree=configfiles()
+ if not tree or tree=="" then
+ return false
+ else
+ return hashed(tree)
+ end
+end
+caches.hashed=hashed
+caches.treehash=treehash
+caches.configfiles=configfiles
local function identify()
local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
if texmfcaches then
for k=1,#texmfcaches do
local cachepath=texmfcaches[k]
if cachepath~="" then
- cachepath=resolvers.resolve(cachepath)
- cachepath=resolvers.cleanpath(cachepath)
- cachepath=file.collapsepath(cachepath)
+ cachepath=resolvepath(cachepath)
+ cachepath=cleanpath(cachepath)
+ cachepath=collapsepath(cachepath)
local valid=isdir(cachepath)
if valid then
if is_readable(cachepath) then
@@ -21396,16 +21827,14 @@ local function identify()
writable=cachepath
end
end
- elseif not writable and caches.force then
- local cacheparent=file.dirname(cachepath)
- if is_writable(cacheparent) and true then
- if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath),"no",{ "yes","no" })=="yes" then
- mkdirs(cachepath)
- if isdir(cachepath) and is_writable(cachepath) then
- report_caches("path %a created",cachepath)
- writable=cachepath
- readables[#readables+1]=cachepath
- end
+ elseif not writable then
+ local cacheparent=dirname(cachepath)
+ if is_writable(cacheparent) then
+ mkdirs(cachepath)
+ if isdir(cachepath) and is_writable(cachepath) then
+ report_caches("path %a created",cachepath)
+ writable=cachepath
+ readables[#readables+1]=cachepath
end
end
end
@@ -21418,8 +21847,8 @@ local function identify()
local cachepath=texmfcaches[k]
cachepath=resolvers.expansion(cachepath)
if cachepath~="" then
- cachepath=resolvers.resolve(cachepath)
- cachepath=resolvers.cleanpath(cachepath)
+ cachepath=resolvepath(cachepath)
+ cachepath=cleanpath(cachepath)
local valid=isdir(cachepath)
if valid and is_readable(cachepath) then
if not writable and is_writable(cachepath) then
@@ -21433,23 +21862,25 @@ local function identify()
end
if not writable then
report_caches("fatal error: there is no valid writable cache path defined")
- os.exit()
+ osexit()
elseif #readables==0 then
report_caches("fatal error: there is no valid readable cache path defined")
- os.exit()
+ osexit()
end
- writable=dir.expandname(resolvers.cleanpath(writable))
- local base,more,tree=caches.base,caches.more,caches.tree or caches.treehash()
+ writable=expanddirname(cleanpath(writable))
+ local base=caches.base
+ local more=caches.more
+ local tree=cache_tree or treehash()
if tree then
- caches.tree=tree
+ cache_tree=tree
writable=mkdirs(writable,base,more,tree)
for i=1,#readables do
- readables[i]=file.join(readables[i],base,more,tree)
+ readables[i]=joinfile(readables[i],base,more,tree)
end
else
writable=mkdirs(writable,base,more)
for i=1,#readables do
- readables[i]=file.join(readables[i],base,more)
+ readables[i]=joinfile(readables[i],base,more)
end
end
if trace_cache then
@@ -21486,27 +21917,8 @@ function caches.usedpaths(separator)
return writable or "?"
end
end
-function caches.configfiles()
- return concat(resolvers.configurationfiles(),";")
-end
-function caches.hashed(tree)
- tree=gsub(tree,"[\\/]+$","")
- tree=lower(tree)
- local hash=md5.hex(tree)
- if trace_cache or trace_locating then
- report_caches("hashing tree %a, hash %a",tree,hash)
- end
- return hash
-end
-function caches.treehash()
- local tree=caches.configfiles()
- if not tree or tree=="" then
- return false
- else
- return caches.hashed(tree)
- end
-end
-local r_cache,w_cache={},{}
+local r_cache={}
+local w_cache={}
local function getreadablepaths(...)
local tags={... }
local hash=concat(tags,"/")
@@ -21516,7 +21928,7 @@ local function getreadablepaths(...)
if #tags>0 then
done={}
for i=1,#readables do
- done[i]=file.join(readables[i],...)
+ done[i]=joinfile(readables[i],...)
end
else
done=readables
@@ -21540,17 +21952,25 @@ local function getwritablepath(...)
end
return done
end
-caches.getreadablepaths=getreadablepaths
-caches.getwritablepath=getwritablepath
-function caches.getfirstreadablefile(filename,...)
- local fullname,path=caches.setfirstwritablefile(filename,...)
+local function setfirstwritablefile(filename,...)
+ local wr=getwritablepath(...)
+ local fullname=joinfile(wr,filename)
+ return fullname,wr
+end
+local function setluanames(path,name)
+ return
+ format("%s/%s.%s",path,name,luasuffixes.tma),
+ format("%s/%s.%s",path,name,luasuffixes.tmc)
+end
+local function getfirstreadablefile(filename,...)
+ local fullname,path=setfirstwritablefile(filename,...)
if is_readable(fullname) then
return fullname,path
end
local rd=getreadablepaths(...)
for i=1,#rd do
local path=rd[i]
- local fullname=file.join(path,filename)
+ local fullname=joinfile(path,filename)
if is_readable(fullname) then
usedreadables[i]=true
return fullname,path
@@ -21558,19 +21978,11 @@ function caches.getfirstreadablefile(filename,...)
end
return fullname,path
end
-function caches.setfirstwritablefile(filename,...)
- local wr=getwritablepath(...)
- local fullname=file.join(wr,filename)
- return fullname,wr
-end
-function caches.define(category,subcategory)
- return function()
- return getwritablepath(category,subcategory)
- end
-end
-function caches.setluanames(path,name)
- return format("%s/%s.%s",path,name,luasuffixes.tma),format("%s/%s.%s",path,name,luasuffixes.tmc)
-end
+caches.getreadablepaths=getreadablepaths
+caches.getwritablepath=getwritablepath
+caches.setfirstwritablefile=setfirstwritablefile
+caches.getfirstreadablefile=getfirstreadablefile
+caches.setluanames=setluanames
function caches.loaddata(readables,name,writable)
if type(readables)=="string" then
readables={ readables }
@@ -21578,21 +21990,22 @@ function caches.loaddata(readables,name,writable)
for i=1,#readables do
local path=readables[i]
local loader=false
- local tmaname,tmcname=caches.setluanames(path,name)
+ local state=false
+ local tmaname,tmcname=setluanames(path,name)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
if not loader and isfile(tmaname) then
- local tmacrap,tmcname=caches.setluanames(writable,name)
+ local tmacrap,tmcname=setluanames(writable,name)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
if not loader then
- loader=loadfile(tmaname)
+ state,loader=pcall(loadfile,tmaname)
end
end
if loader then
@@ -21604,21 +22017,21 @@ function caches.loaddata(readables,name,writable)
return false
end
function caches.is_writable(filepath,filename)
- local tmaname,tmcname=caches.setluanames(filepath,filename)
+ local tmaname,tmcname=setluanames(filepath,filename)
return is_writable(tmaname)
end
-local saveoptions={ compact=true }
-function caches.savedata(filepath,filename,data,raw)
- local tmaname,tmcname=caches.setluanames(filepath,filename)
- data.cache_uuid=os.uuid()
- if caches.fast then
- file.savedata(tmaname,table.fastserialize(data,true))
- elseif caches.direct then
- file.savedata(tmaname,table.serialize(data,true,saveoptions))
+local saveoptions={ compact=true,accurate=not JITSUPPORTED }
+function caches.savedata(filepath,filename,data,fast)
+ local tmaname,tmcname=setluanames(filepath,filename)
+ data.cache_uuid=osuuid()
+ if fast or fast_cache then
+ savedata(tmaname,fastserialize(data,true))
+ elseif direct_cache then
+ savedata(tmaname,serialize(data,true,saveoptions))
else
- table.tofile(tmaname,data,true,saveoptions)
+ serializetofile(tmaname,data,true,saveoptions)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
end
local content_state={}
function caches.contentstate()
@@ -21626,11 +22039,14 @@ function caches.contentstate()
end
function caches.loadcontent(cachename,dataname,filename)
if not filename then
- local name=caches.hashed(cachename)
- local full,path=caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename=file.join(path,name)
+ local name=hashed(cachename)
+ local full,path=getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=joinfile(path,name)
+ end
+ local state,blob=pcall(loadfile,addsuffix(filename,luasuffixes.luc))
+ if not blob then
+ state,blob=pcall(loadfile,addsuffix(filename,luasuffixes.lua))
end
- local blob=loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data=blob()
if data and data.content then
@@ -21663,9 +22079,9 @@ function caches.collapsecontent(content)
end
function caches.savecontent(cachename,dataname,content,filename)
if not filename then
- local name=caches.hashed(cachename)
- local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename=file.join(path,name)
+ local name=hashed(cachename)
+ local full,path=setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=joinfile(path,name)
end
local luaname=addsuffix(filename,luasuffixes.lua)
local lucname=addsuffix(filename,luasuffixes.luc)
@@ -21676,17 +22092,17 @@ function caches.savecontent(cachename,dataname,content,filename)
type=dataname,
root=cachename,
version=resolvers.cacheversion,
- date=os.date("%Y-%m-%d"),
- time=os.date("%H:%M:%S"),
+ date=osdate("%Y-%m-%d"),
+ time=osdate("%H:%M:%S"),
content=content,
- uuid=os.uuid(),
+ uuid=osuuid(),
}
- local ok=io.savedata(luaname,table.serialize(data,true))
+ local ok=savedata(luaname,serialize(data,true))
if ok then
if trace_locating then
report_resolvers("category %a, cachename %a saved in %a",dataname,cachename,luaname)
end
- if utilities.lua.compile(luaname,lucname) then
+ if compilelua(luaname,lucname) then
if trace_locating then
report_resolvers("%a compiled to %a",dataname,lucname)
end
@@ -21695,7 +22111,7 @@ function caches.savecontent(cachename,dataname,content,filename)
if trace_locating then
report_resolvers("compiling failed for %a, deleting file %a",dataname,lucname)
end
- os.remove(lucname)
+ removefile(lucname)
end
elseif trace_locating then
report_resolvers("unable to save %a in %a (access error)",dataname,luaname)
@@ -21709,7 +22125,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-met"] = package.loaded["data-met"] or true
--- original size: 5310, stripped down to: 3784
+-- original size: 5518, stripped down to: 3854
if not modules then modules={} end modules ['data-met']={
version=1.100,
@@ -21718,31 +22134,45 @@ if not modules then modules={} end modules ['data-met']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,format=string.find,string.format
-local sequenced=table.sequenced
+local type=type
+local find=string.find
local addurlscheme,urlhashed=url.addscheme,url.hashed
+local collapsepath,joinfile=file.collapsepath,file.join
+local report_methods=logs.reporter("resolvers","methods")
local trace_locating=false
local trace_methods=false
trackers.register("resolvers.locating",function(v) trace_methods=v end)
trackers.register("resolvers.methods",function(v) trace_methods=v end)
-local report_methods=logs.reporter("resolvers","methods")
local allocate=utilities.storage.allocate
local resolvers=resolvers
local registered={}
local function splitmethod(filename)
if not filename then
- return { scheme="unknown",original=filename }
+ return {
+ scheme="unknown",
+ original=filename,
+ }
end
if type(filename)=="table" then
return filename
end
- filename=file.collapsepath(filename,".")
+ filename=collapsepath(filename,".")
if not find(filename,"://",1,true) then
- return { scheme="file",path=filename,original=filename,filename=filename }
+ return {
+ scheme="file",
+ path=filename,
+ original=filename,
+ filename=filename,
+ }
end
- local specification=url.hashed(filename)
+ local specification=urlhashed(filename)
if not specification.scheme or specification.scheme=="" then
- return { scheme="file",path=filename,original=filename,filename=filename }
+ return {
+ scheme="file",
+ path=filename,
+ original=filename,
+ filename=filename,
+ }
else
return specification
end
@@ -21751,7 +22181,8 @@ resolvers.splitmethod=splitmethod
local function methodhandler(what,first,...)
local method=registered[what]
if method then
- local how,namespace=method.how,method.namespace
+ local how=method.how
+ local namespace=method.namespace
if how=="uri" or how=="url" then
local specification=splitmethod(first)
local scheme=specification.scheme
@@ -21797,7 +22228,10 @@ local function methodhandler(what,first,...)
end
resolvers.methodhandler=methodhandler
function resolvers.registermethod(name,namespace,how)
- registered[name]={ how=how or "tag",namespace=namespace }
+ registered[name]={
+ how=how or "tag",
+ namespace=namespace
+ }
namespace["byscheme"]=function(scheme,filename,...)
if scheme=="file" then
return methodhandler(name,filename,...)
@@ -21806,7 +22240,7 @@ function resolvers.registermethod(name,namespace,how)
end
end
end
-local concatinators=allocate { notfound=file.join }
+local concatinators=allocate { notfound=joinfile }
local locators=allocate { notfound=function() end }
local hashers=allocate { notfound=function() end }
local generators=allocate { notfound=function() end }
@@ -21827,7 +22261,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 68195, stripped down to: 43680
+-- original size: 69576, stripped down to: 44470
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -21838,7 +22272,8 @@ if not modules then modules={} end modules ['data-res']={
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
local concat,insert,remove=table.concat,table.insert,table.remove
-local next,type,rawget=next,type,rawget
+local next,type,rawget,loadfile=next,type,rawget,loadfile
+local mergedtable=table.merged
local os=os
local P,S,R,C,Cc,Cs,Ct,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cc,lpeg.Cs,lpeg.Ct,lpeg.Carg
local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
@@ -21854,13 +22289,14 @@ local joinpath=file.joinpath
local is_qualified_path=file.is_qualified_path
local allocate=utilities.storage.allocate
local settings_to_array=utilities.parsers.settings_to_array
+local urlhasscheme=url.hasscheme
local getcurrentdir=lfs.currentdir
local isfile=lfs.isfile
local isdir=lfs.isdir
local setmetatableindex=table.setmetatableindex
local luasuffixes=utilities.lua.suffixes
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
-local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
+local trace_details=false trackers .register("resolvers.details",function(v) trace_details=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
@@ -21879,10 +22315,17 @@ local ostype,osname,osenv,ossetenv,osgetenv=os.type,os.name,os.env,os.setenv,os.
resolvers.cacheversion="1.100"
resolvers.configbanner=""
resolvers.homedir=environment.homedir
-resolvers.criticalvars=allocate { "SELFAUTOLOC","SELFAUTODIR","SELFAUTOPARENT","TEXMFCNF","TEXMF","TEXOS" }
resolvers.luacnfname="texmfcnf.lua"
resolvers.luacnffallback="contextcnf.lua"
resolvers.luacnfstate="unknown"
+local criticalvars={
+ "SELFAUTOLOC",
+ "SELFAUTODIR",
+ "SELFAUTOPARENT",
+ "TEXMFCNF",
+ "TEXMF",
+ "TEXOS",
+}
if environment.default_texmfcnf then
resolvers.luacnfspec="home:texmf/web2c;"..environment.default_texmfcnf
else
@@ -21902,13 +22345,20 @@ local dangerous=resolvers.dangerous
local suffixmap=resolvers.suffixmap
resolvers.defaultsuffixes={ "tex" }
local instance=nil
-function resolvers.setenv(key,value,raw)
+local variable
+local expansion
+local setenv
+local getenv
+local formatofsuffix=resolvers.formatofsuffix
+local splitpath=resolvers.splitpath
+local splitmethod=resolvers.splitmethod
+setenv=function(key,value,raw)
if instance then
instance.environment[key]=value
ossetenv(key,raw and value or resolveprefix(value))
end
end
-local function getenv(key)
+getenv=function(key)
local value=rawget(instance.environment,key)
if value and value~="" then
return value
@@ -21918,94 +22368,97 @@ local function getenv(key)
end
end
resolvers.getenv=getenv
-resolvers.env=getenv
-local function resolvevariable(k)
- return instance.expansions[k]
-end
+resolvers.setenv=setenv
local dollarstripper=lpeg.stripper("$")
local inhibitstripper=P("!")^0*Cs(P(1)^0)
-local somevariable=P("$")/""
-local somekey=C(R("az","AZ","09","__","--")^1)
-local somethingelse=P(";")*((1-S("!{}/\\"))^1*P(";")/"")+P(";")*(P(";")/"")+P(1)
-local variableexpander=Cs((somevariable*(somekey/resolvevariable)+somethingelse)^1 )
-local cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
-local variablecleaner=Cs((cleaner+P(1))^0)
-local somevariable=R("az","AZ","09","__","--")^1/resolvevariable
-local variable=(P("$")/"")*(somevariable+(P("{")/"")*somevariable*(P("}")/""))
-local variableresolver=Cs((variable+P(1))^0)
-local function expandedvariable(var)
- return lpegmatch(variableexpander,var) or var
-end
-function resolvers.reset()
- if trace_locating then
- report_resolving("creating instance")
- end
- local environment={}
- local variables={}
- local expansions={}
- local order={}
- instance={
- environment=environment,
- variables=variables,
- expansions=expansions,
- order=order,
- files={},
- setups={},
- found={},
- foundintrees={},
- hashes={},
- hashed={},
- pathlists=false,
- specification={},
- lists={},
- data={},
- fakepaths={},
- remember=true,
- diskcache=true,
- renewcache=false,
- renewtree=false,
- loaderror=false,
- savelists=true,
- pattern=nil,
- force_suffixes=true,
- pathstack={},
- }
- setmetatableindex(variables,function(t,k)
- local v
- for i=1,#order do
- v=order[i][k]
+local expandedvariable,resolvedvariable do
+ local function resolveinstancevariable(k)
+ return instance.expansions[k]
+ end
+ local p_variable=P("$")/""
+ local p_key=C(R("az","AZ","09","__","--")^1)
+ local p_whatever=P(";")*((1-S("!{}/\\"))^1*P(";")/"")+P(";")*(P(";")/"")+P(1)
+ local variableexpander=Cs((p_variable*(p_key/resolveinstancevariable)+p_whatever)^1 )
+ local p_cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
+ local variablecleaner=Cs((p_cleaner+P(1))^0)
+ local p_variable=R("az","AZ","09","__","--")^1/resolveinstancevariable
+ local p_variable=(P("$")/"")*(p_variable+(P("{")/"")*p_variable*(P("}")/""))
+ local variableresolver=Cs((p_variable+P(1))^0)
+ expandedvariable=function(var)
+ return lpegmatch(variableexpander,var) or var
+ end
+ function resolvers.reset()
+ if trace_locating then
+ report_resolving("creating instance")
+ end
+ local environment={}
+ local variables={}
+ local expansions={}
+ local order={}
+ instance={
+ environment=environment,
+ variables=variables,
+ expansions=expansions,
+ order=order,
+ files={},
+ setups={},
+ found={},
+ foundintrees={},
+ hashes={},
+ hashed={},
+ pathlists=false,
+ specification={},
+ lists={},
+ data={},
+ fakepaths={},
+ remember=true,
+ diskcache=true,
+ renewcache=false,
+ renewtree=false,
+ loaderror=false,
+ savelists=true,
+ pattern=nil,
+ force_suffixes=true,
+ pathstack={},
+ }
+ setmetatableindex(variables,function(t,k)
+ local v
+ for i=1,#order do
+ v=order[i][k]
+ if v~=nil then
+ t[k]=v
+ return v
+ end
+ end
+ if v==nil then
+ v=""
+ end
+ t[k]=v
+ return v
+ end)
+ local repath=resolvers.repath
+ setmetatableindex(environment,function(t,k)
+ local v=osgetenv(k)
+ if v==nil then
+ v=variables[k]
+ end
if v~=nil then
- t[k]=v
- return v
+ v=checkedvariable(v) or ""
end
- end
- if v==nil then
- v=""
- end
- t[k]=v
- return v
- end)
- setmetatableindex(environment,function(t,k)
- local v=osgetenv(k)
- if v==nil then
- v=variables[k]
- end
- if v~=nil then
- v=checkedvariable(v) or ""
- end
- v=resolvers.repath(v)
- t[k]=v
- return v
- end)
- setmetatableindex(expansions,function(t,k)
- local v=environment[k]
- if type(v)=="string" then
- v=lpegmatch(variableresolver,v)
- v=lpegmatch(variablecleaner,v)
- end
- t[k]=v
- return v
- end)
+ v=repath(v)
+ t[k]=v
+ return v
+ end)
+ setmetatableindex(expansions,function(t,k)
+ local v=environment[k]
+ if type(v)=="string" then
+ v=lpegmatch(variableresolver,v)
+ v=lpegmatch(variablecleaner,v)
+ end
+ t[k]=v
+ return v
+ end)
+ end
end
function resolvers.initialized()
return instance~=nil
@@ -22019,31 +22472,33 @@ local function reset_caches()
instance.lists={}
instance.pathlists=false
end
-local slash=P("/")
-local pathexpressionpattern=Cs (
- Cc("^")*(
- Cc("%")*S(".-")+slash^2*P(-1)/"/.*"
+local makepathexpression do
+ local slash=P("/")
+ local pathexpressionpattern=Cs (
+ Cc("^")*(
+ Cc("%")*S(".-")+slash^2*P(-1)/"/.*"
+slash^2/"/"+(1-slash)*P(-1)*Cc("/")+P(1)
- )^1*Cc("$")
-)
-local cache={}
-local function makepathexpression(str)
- if str=="." then
- return "^%./$"
- else
- local c=cache[str]
- if not c then
- c=lpegmatch(pathexpressionpattern,str)
- cache[str]=c
+ )^1*Cc("$")
+ )
+ local cache={}
+ makepathexpression=function(str)
+ if str=="." then
+ return "^%./$"
+ else
+ local c=cache[str]
+ if not c then
+ c=lpegmatch(pathexpressionpattern,str)
+ cache[str]=c
+ end
+ return c
end
- return c
end
end
local function reportcriticalvariables(cnfspec)
if trace_locating then
- for i=1,#resolvers.criticalvars do
- local k=resolvers.criticalvars[i]
- local v=resolvers.getenv(k) or "unknown"
+ for i=1,#criticalvars do
+ local k=criticalvars[i]
+ local v=getenv(k) or "unknown"
report_resolving("variable %a set to %a",k,v)
end
report_resolving()
@@ -22065,7 +22520,7 @@ local function identify_configuration_files()
resolvers.luacnfstate="environment"
end
reportcriticalvariables(cnfspec)
- local cnfpaths=expandedpathfromlist(resolvers.splitpath(cnfspec))
+ local cnfpaths=expandedpathfromlist(splitpath(cnfspec))
local function locatecnf(luacnfname,kind)
for i=1,#cnfpaths do
local filepath=cnfpaths[i]
@@ -22098,6 +22553,8 @@ local function identify_configuration_files()
end
local function load_configuration_files()
local specification=instance.specification
+ local setups=instance.setups
+ local order=instance.order
if #specification>0 then
local luacnfname=resolvers.luacnfname
for i=1,#specification do
@@ -22107,7 +22564,6 @@ local function load_configuration_files()
local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
- local setups=instance.setups
local data=blob()
local parent=data and data.parent
if parent then
@@ -22118,7 +22574,7 @@ local function load_configuration_files()
local parentdata=blob()
if parentdata then
report_resolving("loading configuration file %a",filename)
- data=table.merged(parentdata,data)
+ data=mergedtable(parentdata,data)
end
end
end
@@ -22150,7 +22606,7 @@ local function load_configuration_files()
if trace_locating then
report_resolving("reloading configuration due to TEXMF redefinition")
end
- resolvers.setenv("TEXMFCNF",cnfspec)
+ setenv("TEXMFCNF",cnfspec)
instance.specification={}
identify_configuration_files()
load_configuration_files()
@@ -22168,7 +22624,7 @@ local function load_configuration_files()
elseif trace_locating then
report_resolving("skipping configuration file %a (no valid format)",filename)
end
- instance.order[#instance.order+1]=instance.setups[pathname]
+ order[#order+1]=setups[pathname]
if instance.loaderror then
break
end
@@ -22177,6 +22633,8 @@ local function load_configuration_files()
report_resolving("warning: no lua configuration files found")
end
end
+local expandedpathlist
+local unexpandedpathlist
function resolvers.configurationfiles()
return instance.specification or {}
end
@@ -22193,7 +22651,7 @@ local function load_file_databases()
end
end
local function locate_file_databases()
- local texmfpaths=resolvers.expandedpathlist("TEXMF")
+ local texmfpaths=expandedpathlist("TEXMF")
if #texmfpaths>0 then
for i=1,#texmfpaths do
local path=collapsepath(texmfpaths[i])
@@ -22202,7 +22660,7 @@ local function locate_file_databases()
if stripped~="" then
local runtime=stripped==path
path=cleanpath(path)
- local spec=resolvers.splitmethod(stripped)
+ local spec=splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme=="file") then
stripped="tree:///"..stripped
elseif spec.scheme=="cache" or spec.scheme=="file" then
@@ -22236,11 +22694,13 @@ local function generate_file_databases()
end
end
local function save_file_databases()
- for i=1,#instance.hashes do
- local hash=instance.hashes[i]
+ local hashes=instance.hashes
+ local files=instance.files
+ for i=1,#hashes do
+ local hash=hashes[i]
local cachename=hash.name
if hash.cache then
- local content=instance.files[cachename]
+ local content=files[cachename]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",cachename)
@@ -22252,8 +22712,9 @@ local function save_file_databases()
end
end
function resolvers.renew(hashname)
+ local files=instance.files
if hashname and hashname~="" then
- local expanded=resolvers.expansion(hashname) or ""
+ local expanded=expansion(hashname) or ""
if expanded~="" then
if trace_locating then
report_resolving("identifying tree %a from %a",expanded,hashname)
@@ -22270,7 +22731,7 @@ function resolvers.renew(hashname)
report_resolving("using path %a",realpath)
end
methodhandler('generators',hashname)
- local content=instance.files[hashname]
+ local content=files[hashname]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",hashname)
@@ -22297,38 +22758,46 @@ local function load_databases()
end
end
function resolvers.appendhash(type,name,cache)
- if not instance.hashed[name] then
+ local hashed=instance.hashed
+ local hashes=instance.hashes
+ if hashed[name] then
+ else
if trace_locating then
report_resolving("hash %a appended",name)
end
- insert(instance.hashes,{ type=type,name=name,cache=cache } )
- instance.hashed[name]=cache
+ insert(hashes,{ type=type,name=name,cache=cache } )
+ hashed[name]=cache
end
end
function resolvers.prependhash(type,name,cache)
- if not instance.hashed[name] then
+ local hashed=instance.hashed
+ local hashes=instance.hashes
+ if hashed[name] then
+ else
if trace_locating then
report_resolving("hash %a prepended",name)
end
- insert(instance.hashes,1,{ type=type,name=name,cache=cache } )
- instance.hashed[name]=cache
+ insert(hashes,1,{ type=type,name=name,cache=cache } )
+ hashed[name]=cache
end
end
function resolvers.extendtexmfvariable(specification)
- local t=resolvers.splitpath(getenv("TEXMF"))
- insert(t,1,specification)
- local newspec=concat(t,",")
- if instance.environment["TEXMF"] then
- instance.environment["TEXMF"]=newspec
- elseif instance.variables["TEXMF"] then
- instance.variables["TEXMF"]=newspec
+ local environment=instance.environment
+ local variables=instance.variables
+ local texmftrees=splitpath(getenv("TEXMF"))
+ insert(texmftrees,1,specification)
+ texmftrees=concat(texmftrees,",")
+ if environment["TEXMF"] then
+ environment["TEXMF"]=texmftrees
+ elseif variables["TEXMF"] then
+ variables["TEXMF"]=texmftrees
else
end
reset_hashes()
end
function resolvers.splitexpansions()
- local ie=instance.expansions
- for k,v in next,ie do
+ local expansions=instance.expansions
+ for k,v in next,expansions do
local t,tn,h,p={},0,{},splitconfigurationpath(v)
for kk=1,#p do
local vv=p[kk]
@@ -22338,33 +22807,37 @@ function resolvers.splitexpansions()
h[vv]=true
end
end
- if #t>1 then
- ie[k]=t
+ if tn>1 then
+ expansions[k]=t
else
- ie[k]=t[1]
+ expansions[k]=t[1]
end
end
end
function resolvers.datastate()
return caches.contentstate()
end
-function resolvers.variable(name)
+variable=function(name)
+ local variables=instance.variables
local name=name and lpegmatch(dollarstripper,name)
- local result=name and instance.variables[name]
+ local result=name and variables[name]
return result~=nil and result or ""
end
-function resolvers.expansion(name)
+expansion=function(name)
+ local expansions=instance.expansions
local name=name and lpegmatch(dollarstripper,name)
- local result=name and instance.expansions[name]
+ local result=name and expansions[name]
return result~=nil and result or ""
end
-function resolvers.unexpandedpathlist(str)
- local pth=resolvers.variable(str)
- local lst=resolvers.splitpath(pth)
+resolvers.variable=variable
+resolvers.expansion=expansion
+unexpandedpathlist=function(str)
+ local pth=variable(str)
+ local lst=splitpath(pth)
return expandedpathfromlist(lst)
end
function resolvers.unexpandedpath(str)
- return joinpath(resolvers.unexpandedpathlist(str))
+ return joinpath(unexpandedpathlist(str))
end
function resolvers.pushpath(name)
local pathstack=instance.pathstack
@@ -22394,8 +22867,8 @@ function resolvers.stackpath()
end
local done={}
function resolvers.resetextrapaths()
- local ep=instance.extra_paths
- if not ep then
+ local extra_paths=instance.extra_paths
+ if not extra_paths then
done={}
instance.extra_paths={}
elseif #ep>0 then
@@ -22416,8 +22889,8 @@ function resolvers.registerextrapath(paths,subpaths)
end
local paths=settings_to_array(paths)
local subpaths=settings_to_array(subpaths)
- local ep=instance.extra_paths or {}
- local oldn=#ep
+ local extra_paths=instance.extra_paths or {}
+ local oldn=#extra_paths
local newn=oldn
local nofpaths=#paths
local nofsubpaths=#subpaths
@@ -22430,7 +22903,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=p.."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=cleanpath(ps)
+ extra_paths[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -22440,7 +22913,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p=paths[i]
if not done[p] then
newn=newn+1
- ep[newn]=cleanpath(p)
+ extra_paths[newn]=cleanpath(p)
done[p]=true
end
end
@@ -22449,17 +22922,17 @@ function resolvers.registerextrapath(paths,subpaths)
for i=1,oldn do
for j=1,nofsubpaths do
local s=subpaths[j]
- local ps=ep[i].."/"..s
+ local ps=extra_paths[i].."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=cleanpath(ps)
+ extra_paths[newn]=cleanpath(ps)
done[ps]=true
end
end
end
end
if newn>0 then
- instance.extra_paths=ep
+ instance.extra_paths=extra_paths
end
if newn~=oldn then
reset_caches()
@@ -22467,17 +22940,19 @@ function resolvers.registerextrapath(paths,subpaths)
end
function resolvers.pushextrapath(path)
local paths=settings_to_array(path)
- if instance.extra_stack then
- insert(instance.extra_stack,1,paths)
+ local extra_stack=instance.extra_stack
+ if extra_stack then
+ insert(extra_stack,1,paths)
else
instance.extra_stack={ paths }
end
reset_caches()
end
function resolvers.popextrapath()
- if instance.extra_stack then
+ local extra_stack=instance.extra_stack
+ if extra_stack then
reset_caches()
- return remove(instance.extra_stack,1)
+ return remove(extra_stack,1)
end
end
local function made_list(instance,list,extra_too)
@@ -22506,33 +22981,21 @@ local function made_list(instance,list,extra_too)
end
end
if extra_too then
- local es=instance.extra_stack
- if es and #es>0 then
- for k=1,#es do
- add(es[k])
+ local extra_stack=instance.extra_stack
+ local extra_paths=instance.extra_paths
+ if extra_stack and #extra_stack>0 then
+ for k=1,#extra_stack do
+ add(extra_stack[k])
end
end
- local ep=instance.extra_paths
- if ep and #ep>0 then
- add(ep)
+ if extra_paths and #extra_paths>0 then
+ add(extra_paths)
end
end
add(list)
return new
end
-function resolvers.cleanpathlist(str)
- local t=resolvers.expandedpathlist(str)
- if t then
- for i=1,#t do
- t[i]=collapsepath(cleanpath(t[i]))
- end
- end
- return t
-end
-function resolvers.expandpath(str)
- return joinpath(resolvers.expandedpathlist(str))
-end
-function resolvers.expandedpathlist(str,extra_too)
+expandedpathlist=function(str,extra_too)
if not str then
return {}
elseif instance.savelists then
@@ -22540,40 +23003,56 @@ function resolvers.expandedpathlist(str,extra_too)
local lists=instance.lists
local lst=lists[str]
if not lst then
- local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
+ local l=made_list(instance,splitpath(expansion(str)),extra_too)
lst=expandedpathfromlist(l)
lists[str]=lst
end
return lst
else
- local lst=resolvers.splitpath(resolvers.expansion(str))
+ local lst=splitpath(expansion(str))
return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
-function resolvers.expandedpathlistfromvariable(str)
+resolvers.expandedpathlist=expandedpathlist
+resolvers.unexpandedpathlist=unexpandedpathlist
+function resolvers.cleanpathlist(str)
+ local t=expandedpathlist(str)
+ if t then
+ for i=1,#t do
+ t[i]=collapsepath(cleanpath(t[i]))
+ end
+ end
+ return t
+end
+function resolvers.expandpath(str)
+ return joinpath(expandedpathlist(str))
+end
+local function expandedpathlistfromvariable(str)
str=lpegmatch(dollarstripper,str)
local tmp=resolvers.variableofformatorsuffix(str)
- return resolvers.expandedpathlist(tmp~="" and tmp or str)
+ return expandedpathlist(tmp~="" and tmp or str)
end
function resolvers.expandpathfromvariable(str)
- return joinpath(resolvers.expandedpathlistfromvariable(str))
+ return joinpath(expandedpathlistfromvariable(str))
end
+resolvers.expandedpathlistfromvariable=expandedpathlistfromvariable
function resolvers.cleanedpathlist(v)
- local t=resolvers.expandedpathlist(v)
+ local t=expandedpathlist(v)
for i=1,#t do
- t[i]=resolvers.resolve(resolvers.cleanpath(t[i]))
+ t[i]=resolveprefix(cleanpath(t[i]))
end
return t
end
function resolvers.expandbraces(str)
- local pth=expandedpathfromlist(resolvers.splitpath(str))
+ local pth=expandedpathfromlist(splitpath(str))
return joinpath(pth)
end
function resolvers.registerfilehash(name,content,someerror)
+ local files=instance.files
if content then
- instance.files[name]=content
+ files[name]=content
else
- instance.files[name]={}
+ files[name]={}
if somerror==true then
instance.loaderror=someerror
end
@@ -22592,7 +23071,7 @@ function resolvers.renewcache()
end
local function isreadable(name)
local readable=isfile(name)
- if trace_detail then
+ if trace_details then
if readable then
report_resolving("file %a is readable",name)
else
@@ -22609,7 +23088,7 @@ local function collect_files(names)
local variant=hash.type
local search=filejoin(root,path,name)
local result=methodhandler('concatinators',variant,root,path,name)
- if trace_detail then
+ if trace_details then
report_resolving("match: variant %a, search %a, result %a",variant,search,result)
end
noffiles=noffiles+1
@@ -22618,7 +23097,7 @@ local function collect_files(names)
end
for k=1,#names do
local filename=names[k]
- if trace_detail then
+ if trace_details then
report_resolving("checking name %a",filename)
end
local basename=filebasename(filename)
@@ -22630,12 +23109,13 @@ local function collect_files(names)
pathname="/"..pathname.."$"
end
local hashes=instance.hashes
+ local files=instance.files
for h=1,#hashes do
local hash=hashes[h]
local hashname=hash.name
- local content=hashname and instance.files[hashname]
+ local content=hashname and files[hashname]
if content then
- if trace_detail then
+ if trace_details then
report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
local path,name=lookup(content,basename)
@@ -22703,7 +23183,6 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat=="" then
if filesuffix=="" or not suffixmap[filesuffix] then
local defaultsuffixes=resolvers.defaultsuffixes
- local formatofsuffix=resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname=filename..'.'..defaultsuffixes[i]
wantedfiles[#wantedfiles+1]=forcedname
@@ -22713,7 +23192,7 @@ local function find_analyze(filename,askedformat,allresults)
end
end
else
- filetype=resolvers.formatofsuffix(filename)
+ filetype=formatofsuffix(filename)
if trace_locating then
report_resolving("using suffix based filetype %a",filetype)
end
@@ -22736,7 +23215,7 @@ local function find_analyze(filename,askedformat,allresults)
end
local function find_direct(filename,allresults)
if not dangerous[askedformat] and isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("file %a found directly",filename)
end
return "direct",{ filename }
@@ -22761,12 +23240,12 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
report_resolving("checking qualified name %a",filename)
end
if isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("qualified file %a found",filename)
end
return "qualified",{ filename }
end
- if trace_detail then
+ if trace_details then
report_resolving("locating qualified file %a",filename)
end
local forcedname,suffix="",suffixonly(filename)
@@ -22774,11 +23253,11 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
local format_suffixes=askedformat=="" and resolvers.defaultsuffixes or suffixes[askedformat]
if format_suffixes then
for i=1,#format_suffixes do
- local s=format_suffixes[i]
- forcedname=filename.."."..s
+ local suffix=format_suffixes[i]
+ forcedname=filename.."."..suffix
if isreadable(forcedname) then
if trace_locating then
- report_resolving("no suffix, forcing format filetype %a",s)
+ report_resolving("no suffix, forcing format filetype %a",suffix)
end
return "qualified",{ forcedname }
end
@@ -22791,7 +23270,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
local savedformat=askedformat
local format=savedformat or ""
if format=="" then
- askedformat=resolvers.formatofsuffix(suffix)
+ askedformat=formatofsuffix(suffix)
end
if not format then
askedformat="othertextfiles"
@@ -22822,7 +23301,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
end
local function check_subpath(fname)
if isreadable(fname) then
- if trace_detail then
+ if trace_details then
report_resolving("found %a by deep scanning",fname)
end
return fname
@@ -22830,7 +23309,7 @@ local function check_subpath(fname)
end
local function makepathlist(list,filetype)
local typespec=resolvers.variableofformat(filetype)
- local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
+ local pathlist=expandedpathlist(typespec,filetype and usertypes[filetype])
local entry={}
if pathlist and #pathlist>0 then
for k=1,#pathlist do
@@ -22841,7 +23320,7 @@ local function makepathlist(list,filetype)
local expression=makepathexpression(pathname)
local barename=gsub(pathname,"/+$","")
barename=resolveprefix(barename)
- local scheme=url.hasscheme(barename)
+ local scheme=urlhasscheme(barename)
local schemename=gsub(barename,"%.%*$",'')
entry[k]={
path=path,
@@ -22878,7 +23357,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
dirlist[i]=filedirname(filelist[i][3]).."/"
end
end
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a in tree",filename)
end
for k=1,#pathlist do
@@ -22888,7 +23367,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local done=false
if filelist then
local expression=entry.expression
- if trace_detail then
+ if trace_details then
report_resolving("using pattern %a for path %a",expression,pathname)
end
for k=1,#filelist do
@@ -22899,16 +23378,16 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
result[#result+1]=resolveprefix(fl[3])
done=true
if allresults then
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, continue scanning",expression,f,d)
end
else
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, quit scanning",expression,f,d)
end
break
end
- elseif trace_detail then
+ elseif trace_details then
report_resolving("no match to %a in hash for file %a and path %a",expression,f,d)
end
end
@@ -22923,7 +23402,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
if not done and not entry.prescanned then
- if trace_detail then
+ if trace_details then
report_resolving("quick root scan for %a",pname)
end
for k=1,#wantedfiles do
@@ -22938,7 +23417,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if not done and entry.recursive then
- if trace_detail then
+ if trace_details then
report_resolving("scanning filesystem for %a",pname)
end
local files=resolvers.simplescanfiles(pname,false,true)
@@ -23004,7 +23483,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
local function find_onpath(filename,filetype,wantedfiles,allresults)
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a, filetype %a, wanted files %a",filename,filetype,concat(wantedfiles," | "))
end
local result={}
@@ -23046,7 +23525,9 @@ collect_instance_files=function(filename,askedformat,allresults)
{ find_onpath (filename,filetype,wantedfiles,true) },
{ find_otherwise(filename,filetype,wantedfiles,true) },
}
- local result,status,done={},{},{}
+ local result={}
+ local status={}
+ local done={}
for k,r in next,results do
local method,list=r[1],r[2]
if method and list then
@@ -23060,7 +23541,7 @@ collect_instance_files=function(filename,askedformat,allresults)
end
end
end
- if trace_detail then
+ if trace_details then
report_resolving("lookup status: %s",table.serialize(status,filename))
end
return result,status
@@ -23117,6 +23598,9 @@ local function findfiles(filename,filetype,allresults)
if not filename or filename=="" then
return {}
end
+ if allresults==nil then
+ allresults=true
+ end
local result,status=collect_instance_files(filename,filetype or "",allresults)
if not result or #result==0 then
local lowered=lower(filename)
@@ -23126,27 +23610,25 @@ local function findfiles(filename,filetype,allresults)
end
return result or {},status
end
-function resolvers.findfiles(filename,filetype)
- if not filename or filename=="" then
- return ""
- else
- return findfiles(filename,filetype,true)
- end
-end
-function resolvers.findfile(filename,filetype)
+local function findfile(filename,filetype)
if not filename or filename=="" then
return ""
else
return findfiles(filename,filetype,false)[1] or ""
end
end
+resolvers.findfiles=findfiles
+resolvers.findfile=findfile
+resolvers.find_file=findfile
+resolvers.find_files=findfiles
function resolvers.findpath(filename,filetype)
return filedirname(findfiles(filename,filetype,false)[1] or "")
end
local function findgivenfiles(filename,allresults)
+ local hashes=instance.hashes
+ local files=instance.files
local base=filebasename(filename)
local result={}
- local hashes=instance.hashes
local function okay(hash,path,name)
local found=methodhandler('concatinators',hash.type,hash.name,path,name)
if found and found~="" then
@@ -23156,7 +23638,7 @@ local function findgivenfiles(filename,allresults)
end
for k=1,#hashes do
local hash=hashes[k]
- local content=instance.files[hash.name]
+ local content=files[hash.name]
if content then
local path,name=lookup(content,base)
if not path then
@@ -23188,14 +23670,14 @@ function resolvers.wildcardpattern(pattern)
return lpegmatch(makewildcard,pattern) or pattern
end
local function findwildcardfiles(filename,allresults,result)
+ local files=instance.files
+ local hashes=instance.hashes
local result=result or {}
local base=filebasename(filename)
local dirn=filedirname(filename)
local path=lower(lpegmatch(makewildcard,dirn) or dirn)
local name=lower(lpegmatch(makewildcard,base) or base)
- local files=instance.files
if find(name,"*",1,true) then
- local hashes=instance.hashes
local function okay(found,path,base,hashname,hashtype)
if find(found,path) then
local full=methodhandler('concatinators',hashtype,hashname,found,base)
@@ -23235,7 +23717,6 @@ local function findwildcardfiles(filename,allresults,result)
end
end
end
- local hashes=instance.hashes
for k=1,#hashes do
local hash=hashes[k]
local hashname=hash.name
@@ -23265,13 +23746,21 @@ end
function resolvers.findwildcardfile(filename)
return findwildcardfiles(filename,false)[1] or ""
end
-function resolvers.automount()
-end
-function resolvers.starttiming()
- statistics.starttiming(instance)
+do
+ local starttiming=statistics.starttiming
+ local stoptiming=statistics.stoptiming
+ local elapsedtime=statistics.elapsedtime
+ function resolvers.starttiming()
+ starttiming(instance)
+ end
+ function resolvers.stoptiming()
+ stoptiming(instance)
+ end
+ function resolvers.loadtime()
+ return elapsedtime(instance)
+ end
end
-function resolvers.stoptiming()
- statistics.stoptiming(instance)
+function resolvers.automount()
end
function resolvers.load(option)
resolvers.starttiming()
@@ -23285,9 +23774,6 @@ function resolvers.load(option)
local files=instance.files
return files and next(files) and true
end
-function resolvers.loadtime()
- return statistics.elapsedtime(instance)
-end
local function report(str)
if trace_locating then
report_resolving(str)
@@ -23317,7 +23803,7 @@ function resolvers.dowithfilesandreport(command,files,...)
end
end
function resolvers.showpath(str)
- return joinpath(resolvers.expandedpathlist(resolvers.formatofvariable(str)))
+ return joinpath(expandedpathlist(resolvers.formatofvariable(str)))
end
function resolvers.registerfile(files,name,path)
if files[name] then
@@ -23331,7 +23817,7 @@ function resolvers.registerfile(files,name,path)
end
end
function resolvers.dowithpath(name,func)
- local pathlist=resolvers.expandedpathlist(name)
+ local pathlist=expandedpathlist(name)
for i=1,#pathlist do
func("^"..cleanpath(pathlist[i]))
end
@@ -23341,11 +23827,11 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
local engine=environment.ownmain or "luatex"
- local barename=removesuffix(name)
+ local barename=removesuffix(file.basename(name))
local fullname=addsuffix(barename,"fmt")
local fmtname=caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname=="" then
- fmtname=resolvers.findfile(fullname)
+ fmtname=findfile(fullname)
fmtname=cleanpath(fmtname)
end
if fmtname~="" then
@@ -23354,17 +23840,17 @@ function resolvers.locateformat(name)
local lucname=addsuffix(barename,luasuffixes.luc)
local luiname=addsuffix(barename,luasuffixes.lui)
if isfile(luiname) then
- return barename,luiname
+ return fmtname,luiname
elseif isfile(lucname) then
- return barename,lucname
+ return fmtname,lucname
elseif isfile(luaname) then
- return barename,luaname
+ return fmtname,luaname
end
end
return nil,nil
end
function resolvers.booleanvariable(str,default)
- local b=resolvers.expansion(str)
+ local b=expansion(str)
if b=="" then
return default
else
@@ -23374,6 +23860,7 @@ function resolvers.booleanvariable(str,default)
end
function resolvers.dowithfilesintree(pattern,handle,before,after)
local hashes=instance.hashes
+ local files=instance.files
for i=1,#hashes do
local hash=hashes[i]
local blobtype=hash.type
@@ -23385,7 +23872,7 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
if before then
before(blobtype,blobpath,pattern)
end
- for path,name in filtered(instance.files[blobpath],pattern) do
+ for path,name in filtered(files[blobpath],pattern) do
if type(path)=="string" then
checked=checked+1
if handle(blobtype,blobpath,path,name) then
@@ -23406,10 +23893,6 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
end
end
end
-local obsolete=resolvers.obsolete or {}
-resolvers.obsolete=obsolete
-resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile
-resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles
function resolvers.knownvariables(pattern)
if instance then
local environment=instance.environment
@@ -23443,7 +23926,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 4854, stripped down to: 2889
+-- original size: 5088, stripped down to: 3144
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -23452,6 +23935,7 @@ if not modules then modules={} end modules ['data-pre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local insert,remove=table.insert,table.remove
local resolvers=resolvers
local prefixes=resolvers.prefixes
local cleanpath=resolvers.cleanpath
@@ -23529,8 +24013,9 @@ prefixes.kpse=prefixes.locate
prefixes.full=prefixes.locate
prefixes.file=prefixes.filename
prefixes.path=prefixes.pathname
+local inputstack={}
+local stackpath=resolvers.stackpath
local function toppath()
- local inputstack=resolvers.inputstack
if not inputstack then
return "."
end
@@ -23542,15 +24027,23 @@ local function toppath()
end
end
local function jobpath()
- local path=resolvers.stackpath()
+ local path=stackpath()
if not path or path=="" then
return "."
else
return path
end
end
+local function pushinputname(name)
+ insert(inputstack,name)
+end
+local function popinputname(name)
+ return remove(inputstack)
+end
resolvers.toppath=toppath
resolvers.jobpath=jobpath
+resolvers.pushinputname=pushinputname
+resolvers.popinputname=popinputname
prefixes.toppath=function(str) return cleanpath(joinpath(toppath(),str)) end
prefixes.jobpath=function(str) return cleanpath(joinpath(jobpath(),str)) end
resolvers.setdynamic("toppath")
@@ -23593,7 +24086,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-out"] = package.loaded["data-out"] or true
--- original size: 530, stripped down to: 470
+-- original size: 551, stripped down to: 470
if not modules then modules={} end modules ['data-out']={
version=1.001,
@@ -23616,7 +24109,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-fil"] = package.loaded["data-fil"] or true
--- original size: 3863, stripped down to: 3170
+-- original size: 4365, stripped down to: 3588
if not modules then modules={} end modules ['data-fil']={
version=1.001,
@@ -23625,39 +24118,46 @@ if not modules then modules={} end modules ['data-fil']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local ioopen=io.open
+local isdir=lfs.isdir
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_files=logs.reporter("resolvers","files")
local resolvers=resolvers
local resolveprefix=resolvers.resolve
-local finders,openers,loaders,savers=resolvers.finders,resolvers.openers,resolvers.loaders,resolvers.savers
-local locators,hashers,generators,concatinators=resolvers.locators,resolvers.hashers,resolvers.generators,resolvers.concatinators
+local findfile=resolvers.findfile
+local scanfiles=resolvers.scanfiles
+local registerfilehash=resolvers.registerfilehash
+local appendhash=resolvers.appendhash
+local loadcachecontent=caches.loadcontent
local checkgarbage=utilities.garbagecollector and utilities.garbagecollector.check
-function locators.file(specification)
+function resolvers.locators.file(specification)
local filename=specification.filename
local realname=resolveprefix(filename)
- if realname and realname~='' and lfs.isdir(realname) then
+ if realname and realname~='' and isdir(realname) then
if trace_locating then
report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',filename,true)
+ appendhash('file',filename,true)
elseif trace_locating then
report_files("file locator %a not found",filename)
end
end
-function hashers.file(specification)
+function resolvers.hashers.file(specification)
local pathname=specification.filename
- local content=caches.loadcontent(pathname,'files')
- resolvers.registerfilehash(pathname,content,content==nil)
+ local content=loadcachecontent(pathname,'files')
+ registerfilehash(pathname,content,content==nil)
end
-function generators.file(specification)
+function resolvers.generators.file(specification)
local pathname=specification.filename
- local content=resolvers.scanfiles(pathname,false,true)
- resolvers.registerfilehash(pathname,content,true)
+ local content=scanfiles(pathname,false,true)
+ registerfilehash(pathname,content,true)
end
-concatinators.file=file.join
+resolvers.concatinators.file=file.join
+local finders=resolvers.finders
+local notfound=finders.notfound
function finders.file(specification,filetype)
local filename=specification.filename
- local foundname=resolvers.findfile(filename,filetype)
+ local foundname=findfile(filename,filetype)
if foundname and foundname~="" then
if trace_locating then
report_files("file finder: %a found",filename)
@@ -23667,37 +24167,55 @@ function finders.file(specification,filetype)
if trace_locating then
report_files("file finder: %a not found",filename)
end
- return finders.notfound()
+ return notfound()
end
end
-function openers.helpers.textopener(tag,filename,f)
+local openers=resolvers.openers
+local notfound=openers.notfound
+local overloaded=false
+local function textopener(tag,filename,f)
return {
- reader=function() return f:read () end,
- close=function() logs.show_close(filename) return f:close() end,
+ reader=function() return f:read () end,
+ close=function() return f:close() end,
}
end
+function openers.helpers.textopener(...)
+ return textopener(...)
+end
+function openers.helpers.settextopener(opener)
+ if overloaded then
+ report_files("file opener: %s overloaded","already")
+ else
+ if trace_locating then
+ report_files("file opener: %s overloaded","once")
+ end
+ overloaded=true
+ textopener=opener
+ end
+end
function openers.file(specification,filetype)
local filename=specification.filename
if filename and filename~="" then
- local f=io.open(filename,"r")
+ local f=ioopen(filename,"r")
if f then
if trace_locating then
report_files("file opener: %a opened",filename)
end
- return openers.helpers.textopener("file",filename,f)
+ return textopener("file",filename,f)
end
end
if trace_locating then
report_files("file opener: %a not found",filename)
end
- return openers.notfound()
+ return notfound()
end
+local loaders=resolvers.loaders
+local notfound=loaders.notfound
function loaders.file(specification,filetype)
local filename=specification.filename
if filename and filename~="" then
- local f=io.open(filename,"rb")
+ local f=ioopen(filename,"rb")
if f then
- logs.show_load(filename)
if trace_locating then
report_files("file loader: %a loaded",filename)
end
@@ -23714,7 +24232,7 @@ function loaders.file(specification,filetype)
if trace_locating then
report_files("file loader: %a not found",filename)
end
- return loaders.notfound()
+ return notfound()
end
@@ -23724,7 +24242,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-con"] = package.loaded["data-con"] or true
--- original size: 5029, stripped down to: 3432
+-- original size: 5388, stripped down to: 3685
if not modules then modules={} end modules ['data-con']={
version=1.100,
@@ -23733,6 +24251,7 @@ if not modules then modules={} end modules ['data-con']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local setmetatable=setmetatable
local format,lower,gsub=string.format,string.lower,string.gsub
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local trace_containers=false trackers.register("resolvers.containers",function(v) trace_containers=v end)
@@ -23740,16 +24259,21 @@ local trace_storage=false trackers.register("resolvers.storage",function(v) tra
containers=containers or {}
local containers=containers
containers.usecache=true
+local getwritablepath=caches.getwritablepath
+local getreadablepaths=caches.getreadablepaths
+local cacheiswritable=caches.is_writable
+local loaddatafromcache=caches.loaddata
+local savedataincache=caches.savedata
local report_containers=logs.reporter("resolvers","containers")
local allocated={}
local mt={
__index=function(t,k)
if k=="writable" then
- local writable=caches.getwritablepath(t.category,t.subcategory) or { "." }
+ local writable=getwritablepath(t.category,t.subcategory) or { "." }
t.writable=writable
return writable
elseif k=="readables" then
- local readables=caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ local readables=getreadablepaths(t.category,t.subcategory) or { "." }
t.readables=readables
return readables
end
@@ -23780,7 +24304,7 @@ function containers.define(category,subcategory,version,enabled)
end
end
function containers.is_usable(container,name)
- return container.enabled and caches and caches.is_writable(container.writable,name)
+ return container.enabled and caches and cacheiswritable(container.writable,name)
end
function containers.is_valid(container,name)
if name and name~="" then
@@ -23794,7 +24318,7 @@ function containers.read(container,name)
local storage=container.storage
local stored=storage[name]
if not stored and container.enabled and caches and containers.usecache then
- stored=caches.loaddata(container.readables,name,container.writable)
+ stored=loaddatafromcache(container.readables,name,container.writable)
if stored and stored.cache_version==container.version then
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","load",container.subcategory,name)
@@ -23810,17 +24334,20 @@ function containers.read(container,name)
end
return stored
end
-function containers.write(container,name,data)
+function containers.write(container,name,data,fast)
if data then
data.cache_version=container.version
if container.enabled and caches then
- local unique,shared=data.unique,data.shared
- data.unique,data.shared=nil,nil
- caches.savedata(container.writable,name,data)
+ local unique=data.unique
+ local shared=data.shared
+ data.unique=nil
+ data.shared=nil
+ savedataincache(container.writable,name,data,fast)
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","save",container.subcategory,name)
end
- data.unique,data.shared=unique,shared
+ data.unique=unique
+ data.shared=shared
end
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","store",container.subcategory,name)
@@ -23843,7 +24370,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-use"] = package.loaded["data-use"] or true
--- original size: 4434, stripped down to: 3180
+-- original size: 5790, stripped down to: 2910
if not modules then modules={} end modules ['data-use']={
version=1.001,
@@ -23852,40 +24379,11 @@ if not modules then modules={} end modules ['data-use']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local format,lower,gsub,find=string.format,string.lower,string.gsub,string.find
+local format=string.format
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_mounts=logs.reporter("resolvers","mounts")
local resolvers=resolvers
-resolvers.automounted=resolvers.automounted or {}
-function resolvers.automount(usecache)
- local mountpaths=resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
- if (not mountpaths or #mountpaths==0) and usecache then
- mountpaths=caches.getreadablepaths("mount")
- end
- if mountpaths and #mountpaths>0 then
- resolvers.starttiming()
- for k=1,#mountpaths do
- local root=mountpaths[k]
- local f=io.open(root.."/url.tmi")
- if f then
- for line in f:lines() do
- if line then
- if find(line,"^[%%#%-]") then
- elseif find(line,"^zip://") then
- if trace_locating then
- report_mounts("mounting %a",line)
- end
- table.insert(resolvers.automounted,line)
- resolvers.usezipfile(line)
- end
- end
- end
- f:close()
- end
- end
- resolvers.stoptiming()
- end
-end
+local findfile=resolvers.findfile
statistics.register("used config file",function() return caches.configfiles() end)
statistics.register("used cache path",function() return caches.usedpaths() end)
function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner)
@@ -23895,9 +24393,11 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner)
local luvdata={
enginebanner=enginebanner,
formatbanner=formatbanner,
- sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"),
+ sourcehash=md5.hex(io.loaddata(findfile(sourcefile)) or "unknown"),
sourcefile=sourcefile,
luaversion=LUAVERSION,
+ formatid=LUATEXFORMATID,
+ functionality=LUATEXFUNCTIONALITY,
}
io.savedata(luvname,table.serialize(luvdata,true))
lua.registerfinalizer(function()
@@ -23917,7 +24417,7 @@ function statistics.checkfmtstatus(texname)
if lfs.isfile(luvname) then
local luv=dofile(luvname)
if luv and luv.sourcefile then
- local sourcehash=md5.hex(io.loaddata(resolvers.findfile(luv.sourcefile)) or "unknown")
+ local sourcehash=md5.hex(io.loaddata(findfile(luv.sourcefile)) or "unknown")
local luvbanner=luv.enginebanner or "?"
if luvbanner~=enginebanner then
return format("engine mismatch (luv: %s <> bin: %s)",luvbanner,enginebanner)
@@ -23927,8 +24427,19 @@ function statistics.checkfmtstatus(texname)
return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash)
end
local luvluaversion=luv.luaversion or 0
- if luvluaversion~=LUAVERSION then
- return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION)
+ local engluaversion=LUAVERSION or 0
+ if luvluaversion~=engluaversion then
+ return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,engluaversion)
+ end
+ local luvfunctionality=luv.functionality or 0
+ local engfunctionality=status.development_id or 0
+ if luvfunctionality~=engfunctionality then
+ return format("functionality mismatch (luv: %s <> bin: %s)",luvfunctionality,engfunctionality)
+ end
+ local luvformatid=luv.formatid or 0
+ local engformatid=status.format_id or 0
+ if luvformatid~=engformatid then
+ return format("formatid mismatch (luv: %s <> bin: %s)",luvformatid,engformatid)
end
else
return "invalid status file"
@@ -23947,7 +24458,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 10263, stripped down to: 7556
+-- original size: 10725, stripped down to: 7949
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -23960,6 +24471,14 @@ local format,find,match=string.format,string.find,string.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_zip=logs.reporter("resolvers","zip")
local resolvers=resolvers
+local findfile=resolvers.findfile
+local registerfile=resolvers.registerfile
+local splitmethod=resolvers.splitmethod
+local prependhash=resolvers.prependhash
+local starttiming=resolvers.starttiming
+local extendtexmf=resolvers.extendtexmfvariable
+local stoptiming=resolvers.stoptiming
+local urlquery=url.query
zip=zip or {}
local zip=zip
local archives=zip.archives or {}
@@ -23974,8 +24493,9 @@ if zipfiles then
closezip=zipfiles.close
validfile=zipfiles.found
wholefile=zipfiles.unzip
+ local listzip=zipfiles.list
traversezip=function(zfile)
- return ipairs(zipfiles.list(zfile))
+ return ipairs(listzip(zfile))
end
local streams=utilities.streams
local openstream=streams.open
@@ -24032,28 +24552,30 @@ local function validzip(str)
return str
end
end
-function zip.openarchive(name)
+local function openarchive(name)
if not name or name=="" then
return nil
else
local arch=archives[name]
if not arch then
- local full=resolvers.findfile(name) or ""
+ local full=findfile(name) or ""
arch=full~="" and openzip(full) or false
archives[name]=arch
end
return arch
end
end
-function zip.closearchive(name)
+local function closearchive(name)
if not name or (name=="" and archives[name]) then
closezip(archives[name])
archives[name]=nil
end
end
+zip.openarchive=openarchive
+zip.closearchive=closearchive
function resolvers.locators.zip(specification)
local archive=specification.filename
- local zipfile=archive and archive~="" and zip.openarchive(archive)
+ local zipfile=archive and archive~="" and openarchive(archive)
if trace_locating then
if zipfile then
report_zip("locator: archive %a found",archive)
@@ -24062,13 +24584,6 @@ function resolvers.locators.zip(specification)
end
end
end
-function resolvers.hashers.zip(specification)
- local archive=specification.filename
- if trace_locating then
- report_zip("loading file %a",archive)
- end
- resolvers.usezipfile(specification.original)
-end
function resolvers.concatinators.zip(zipfile,path,name)
if not path or path=="" then
return format('%s?name=%s',zipfile,name)
@@ -24076,14 +24591,16 @@ function resolvers.concatinators.zip(zipfile,path,name)
return format('%s?name=%s/%s',zipfile,path,name)
end
end
-function resolvers.finders.zip(specification)
+local finders=resolvers.finders
+local notfound=finders.notfound
+function finders.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("finder: archive %a found",archive)
@@ -24104,16 +24621,19 @@ function resolvers.finders.zip(specification)
if trace_locating then
report_zip("finder: %a not found",original)
end
- return resolvers.finders.notfound()
+ return notfound()
end
-function resolvers.openers.zip(specification)
+local openers=resolvers.openers
+local notfound=openers.notfound
+local textopener=openers.helpers.textopener
+function openers.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("opener; archive %a opened",archive)
@@ -24123,7 +24643,7 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: file %a found",queryname)
end
- return resolvers.openers.helpers.textopener('zip',original,handle)
+ return textopener('zip',original,handle)
elseif trace_locating then
report_zip("opener: file %a not found",queryname)
end
@@ -24135,23 +24655,24 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: %a not found",original)
end
- return resolvers.openers.notfound()
+ return notfound()
end
-function resolvers.loaders.zip(specification)
+local loaders=resolvers.loaders
+local notfound=loaders.notfound
+function loaders.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("loader: archive %a opened",archive)
end
local data=wholefile(zfile,queryname)
if data then
- logs.show_load(original)
if trace_locating then
report_zip("loader; file %a loaded",original)
end
@@ -24167,47 +24688,24 @@ function resolvers.loaders.zip(specification)
if trace_locating then
report_zip("loader: %a not found",original)
end
- return resolvers.openers.notfound()
-end
-function resolvers.usezipfile(archive)
- local specification=resolvers.splitmethod(archive)
- local archive=specification.filename
- if archive and not registeredfiles[archive] then
- local z=zip.openarchive(archive)
- if z then
- local tree=url.query(specification.query).tree or ""
- if trace_locating then
- report_zip("registering: archive %a",archive)
- end
- resolvers.starttiming()
- resolvers.prependhash('zip',archive)
- resolvers.extendtexmfvariable(archive)
- registeredfiles[archive]=z
- resolvers.registerfilehash(archive,resolvers.registerzipfile(z,tree))
- resolvers.stoptiming()
- elseif trace_locating then
- report_zip("registering: unknown archive %a",archive)
- end
- elseif trace_locating then
- report_zip("registering: archive %a not found",archive)
- end
+ return notfound()
end
-function resolvers.registerzipfile(z,tree)
+local function registerzipfile(z,tree)
local names={}
local files={}
local remap={}
local n=0
local filter=tree=="" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
- local register=resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
+ starttiming()
for i in traversezip(z) do
local filename=i.filename
local path,name=match(filename,filter)
if not path then
n=n+1
- register(names,filename,"")
+ registerfile(names,filename,"")
local usedname=lower(filename)
files[usedname]=""
if usedname~=filename then
@@ -24224,12 +24722,43 @@ function resolvers.registerzipfile(z,tree)
else
end
end
+ stoptiming()
report_zip("registering: %s files registered",n)
return {
files=files,
remap=remap,
}
end
+local function usezipfile(archive)
+ local specification=splitmethod(archive)
+ local archive=specification.filename
+ if archive and not registeredfiles[archive] then
+ local z=openarchive(archive)
+ if z then
+ local tree=urlquery(specification.query).tree or ""
+ if trace_locating then
+ report_zip("registering: archive %a",archive)
+ end
+ prependhash('zip',archive)
+ extendtexmf(archive)
+ registeredfiles[archive]=z
+ registerfilehash(archive,registerzipfile(z,tree))
+ elseif trace_locating then
+ report_zip("registering: unknown archive %a",archive)
+ end
+ elseif trace_locating then
+ report_zip("registering: archive %a not found",archive)
+ end
+end
+resolvers.usezipfile=usezipfile
+resolvers.registerzipfile=registerzipfile
+function resolvers.hashers.zip(specification)
+ local archive=specification.filename
+ if trace_locating then
+ report_zip("loading file %a",archive)
+ end
+ usezipfile(specification.original)
+end
end -- of closure
@@ -24238,7 +24767,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tre"] = package.loaded["data-tre"] or true
--- original size: 8478, stripped down to: 5223
+-- original size: 10802, stripped down to: 6619
if not modules then modules={} end modules ['data-tre']={
version=1.001,
@@ -24247,180 +24776,255 @@ if not modules then modules={} end modules ['data-tre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local type=type
local find,gsub,lower=string.find,string.gsub,string.lower
-local basename,dirname,joinname=file.basename,file.dirname,file .join
+local basename,dirname,joinname=file.basename,file.dirname,file.join
local globdir,isdir,isfile=dir.glob,lfs.isdir,lfs.isfile
local P,lpegmatch=lpeg.P,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_trees=logs.reporter("resolvers","trees")
local resolvers=resolvers
-local resolveprefix=resolvers.resolve
-local notfound=resolvers.finders.notfound
-local lookup=resolvers.get_from_content
-local collectors={}
-local found={}
-function resolvers.finders.tree(specification)
- local spec=specification.filename
- local okay=found[spec]
- if okay==nil then
- if spec~="" then
- local path=dirname(spec)
- local name=basename(spec)
- if path=="" then
- path="."
- end
- local names=collectors[path]
- if not names then
- local pattern=find(path,"/%*+$") and path or (path.."/*")
- names=globdir(pattern)
- collectors[path]=names
- end
- local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
- for i=1,#names do
- local fullname=names[i]
- if find(fullname,pattern) then
- found[spec]=fullname
- return fullname
- end
- end
- local pattern=lower(pattern)
- for i=1,#names do
- local fullname=lower(names[i])
- if find(fullname,pattern) then
- if isfile(fullname) then
+local finders=resolvers.finders
+local openers=resolvers.openers
+local loaders=resolvers.loaders
+local locators=resolvers.locators
+local hashers=resolvers.hashers
+local generators=resolvers.generators
+do
+ local collectors={}
+ local found={}
+ local notfound=finders.notfound
+ function finders.tree(specification)
+ local spec=specification.filename
+ local okay=found[spec]
+ if okay==nil then
+ if spec~="" then
+ local path=dirname(spec)
+ local name=basename(spec)
+ if path=="" then
+ path="."
+ end
+ local names=collectors[path]
+ if not names then
+ local pattern=find(path,"/%*+$") and path or (path.."/*")
+ names=globdir(pattern)
+ collectors[path]=names
+ end
+ local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
+ for i=1,#names do
+ local fullname=names[i]
+ if find(fullname,pattern) then
found[spec]=fullname
return fullname
- else
- break
+ end
+ end
+ local pattern=lower(pattern)
+ for i=1,#names do
+ local fullname=lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec]=fullname
+ return fullname
+ else
+ break
+ end
end
end
end
+ okay=notfound()
+ found[spec]=okay
end
- okay=notfound()
- found[spec]=okay
+ return okay
end
- return okay
end
-function resolvers.locators.tree(specification)
- local name=specification.filename
- local realname=resolveprefix(name)
- if realname and realname~='' and isdir(realname) then
- if trace_locating then
- report_trees("locator %a found",realname)
+do
+ local resolveprefix=resolvers.resolve
+ local appendhash=resolvers.appendhash
+ local function dolocate(specification)
+ local name=specification.filename
+ local realname=resolveprefix(name)
+ if realname and realname~='' and isdir(realname) then
+ if trace_locating then
+ report_trees("locator %a found",realname)
+ end
+ appendhash('tree',name,false)
+ elseif trace_locating then
+ report_trees("locator %a not found",name)
end
- resolvers.appendhash('tree',name,false)
- elseif trace_locating then
- report_trees("locator %a not found",name)
end
+ locators.tree=dolocate
+ locators.dirlist=dolocate
+ locators.dirfile=dolocate
end
-function resolvers.hashers.tree(specification)
- local name=specification.filename
- if trace_locating then
- report_trees("analyzing %a",name)
- end
- resolvers.methodhandler("hashers",name)
- resolvers.generators.file(specification)
-end
-local collectors={}
-local splitter=lpeg.splitat("/**/")
-local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
-table.setmetatableindex(collectors,function(t,k)
- local rootname=lpegmatch(stripper,k)
- local dataname=joinname(rootname,"dirlist")
- local content=caches.loadcontent(dataname,"files",dataname)
- if not content then
- content=resolvers.scanfiles(rootname,nil,nil,false,true)
- caches.savecontent(dataname,"files",content,dataname)
- end
- t[k]=content
- return content
-end)
-local function checked(root,p,n)
- if p then
- if type(p)=="table" then
- for i=1,#p do
- local fullname=joinname(root,p[i],n)
+do
+ local filegenerator=generators.file
+ generators.dirlist=filegenerator
+ generators.dirfile=filegenerator
+end
+do
+ local filegenerator=generators.file
+ local methodhandler=resolvers.methodhandler
+ local function dohash(specification)
+ local name=specification.filename
+ if trace_locating then
+ report_trees("analyzing %a",name)
+ end
+ methodhandler("hashers",name)
+ filegenerator(specification)
+ end
+ hashers.tree=dohash
+ hashers.dirlist=dohash
+ hashers.dirfile=dohash
+end
+local resolve do
+ local collectors={}
+ local splitter=lpeg.splitat("/**/")
+ local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
+ local loadcontent=caches.loadcontent
+ local savecontent=caches.savecontent
+ local notfound=finders.notfound
+ local scanfiles=resolvers.scanfiles
+ local lookup=resolvers.get_from_content
+ table.setmetatableindex(collectors,function(t,k)
+ local rootname=lpegmatch(stripper,k)
+ local dataname=joinname(rootname,"dirlist")
+ local content=loadcontent(dataname,"files",dataname)
+ if not content then
+ content=scanfiles(rootname,nil,nil,false,true)
+ savecontent(dataname,"files",content,dataname)
+ end
+ t[k]=content
+ return content
+ end)
+ local function checked(root,p,n)
+ if p then
+ if type(p)=="table" then
+ for i=1,#p do
+ local fullname=joinname(root,p[i],n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ else
+ local fullname=joinname(root,p,n)
if isfile(fullname) then
return fullname
end
end
- else
- local fullname=joinname(root,p,n)
- if isfile(fullname) then
- return fullname
- end
end
+ return notfound()
end
- return notfound()
-end
-local function resolve(specification)
- local filename=specification.filename
- if filename~="" then
- local root,rest=lpegmatch(splitter,filename)
- if root and rest then
- local path,name=dirname(rest),basename(rest)
- if name~=rest then
- local content=collectors[root]
- local p,n=lookup(content,name)
- if not p then
- return notfound()
- end
- local pattern=".*/"..path.."$"
- local istable=type(p)=="table"
- if istable then
- for i=1,#p do
- local pi=p[i]
- if pi==path or find(pi,pattern) then
- local fullname=joinname(root,pi,n)
- if isfile(fullname) then
- return fullname
+ resolve=function(specification)
+ local filename=specification.filename
+ if filename~="" then
+ local root,rest=lpegmatch(splitter,filename)
+ if root and rest then
+ local path,name=dirname(rest),basename(rest)
+ if name~=rest then
+ local content=collectors[root]
+ local p,n=lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern=".*/"..path.."$"
+ local istable=type(p)=="table"
+ if istable then
+ for i=1,#p do
+ local pi=p[i]
+ if pi==path or find(pi,pattern) then
+ local fullname=joinname(root,pi,n)
+ if isfile(fullname) then
+ return fullname
+ end
end
end
+ elseif p==path or find(p,pattern) then
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
end
- elseif p==path or find(p,pattern) then
- local fullname=joinname(root,p,n)
- if isfile(fullname) then
- return fullname
+ local queries=specification.queries
+ if queries and queries.option=="fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
end
end
- local queries=specification.queries
- if queries and queries.option=="fileonly" then
- return checked(root,p,n)
- else
- return notfound()
- end
+ end
+ local path=dirname(filename)
+ local name=basename(filename)
+ local root=lpegmatch(stripper,path)
+ local content=collectors[path]
+ local p,n=lookup(content,name)
+ if p then
+ return checked(root,p,n)
end
end
- local path,name=dirname(filename),basename(filename)
- local root=lpegmatch(stripper,path)
- local content=collectors[path]
- local p,n=lookup(content,name)
- if p then
- return checked(root,p,n)
+ return notfound()
+ end
+ finders.dirlist=resolve
+ function finders.dirfile(specification)
+ local queries=specification.queries
+ if queries then
+ queries.option="fileonly"
+ else
+ specification.queries={ option="fileonly" }
end
+ return resolve(specification)
end
- return notfound()
end
-resolvers.finders .dirlist=resolve
-resolvers.locators .dirlist=resolvers.locators .tree
-resolvers.hashers .dirlist=resolvers.hashers .tree
-resolvers.generators.dirlist=resolvers.generators.file
-resolvers.openers .dirlist=resolvers.openers .file
-resolvers.loaders .dirlist=resolvers.loaders .file
-function resolvers.finders.dirfile(specification)
- local queries=specification.queries
- if queries then
- queries.option="fileonly"
- else
- specification.queries={ option="fileonly" }
+do
+ local fileopener=openers.file
+ local fileloader=loaders.file
+ openers.dirlist=fileopener
+ loaders.dirlist=fileloader
+ openers.dirfile=fileopener
+ loaders.dirfile=fileloader
+end
+do
+ local hashfile="dirhash.lua"
+ local kind="HASH256"
+ local version=1.0
+ local loadtable=table.load
+ local savetable=table.save
+ local loaddata=io.loaddata
+ function resolvers.dirstatus(patterns)
+ local t=type(patterns)
+ if t=="string" then
+ patterns={ patterns }
+ elseif t~="table" then
+ return false
+ end
+ local status=loadtable(hashfile)
+ if not status or status.version~=version or status.kind~=kind then
+ status={
+ version=1.0,
+ kind=kind,
+ hashes={},
+ }
+ end
+ local hashes=status.hashes
+ local changed={}
+ local action=sha2[kind]
+ local update={}
+ for i=1,#patterns do
+ local pattern=patterns[i]
+ local files=globdir(pattern)
+ for i=1,#files do
+ local name=files[i]
+ local hash=action(loaddata(name))
+ if hashes[name]~=hash then
+ changed[#changed+1]=name
+ end
+ update[name]=hash
+ end
+ end
+ status.hashes=update
+ savetable(hashfile,status)
+ return #changed>0 and changed or false
end
- return resolve(specification)
end
-resolvers.locators .dirfile=resolvers.locators .dirlist
-resolvers.hashers .dirfile=resolvers.hashers .dirlist
-resolvers.generators.dirfile=resolvers.generators.dirlist
-resolvers.openers .dirfile=resolvers.openers .dirlist
-resolvers.loaders .dirfile=resolvers.loaders .dirlist
end -- of closure
@@ -24429,7 +25033,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-sch"] = package.loaded["data-sch"] or true
--- original size: 6753, stripped down to: 5268
+-- original size: 6945, stripped down to: 5408
if not modules then modules={} end modules ['data-sch']={
version=1.001,
@@ -24439,8 +25043,11 @@ if not modules then modules={} end modules ['data-sch']={
license="see context related readme files"
}
local load,tonumber=load,tonumber
-local gsub,concat,format=string.gsub,table.concat,string.format
+local gsub,format=string.gsub,string.format
+local sortedhash,concat=table.sortedhash,table.concat
local finders,openers,loaders=resolvers.finders,resolvers.openers,resolvers.loaders
+local addsuffix,suffix,splitbase=file.addsuffix,file.suffix,file.splitbase
+local md5hex=md5.hex
local trace_schemes=false trackers.register("resolvers.schemes",function(v) trace_schemes=v end)
local report_schemes=logs.reporter("resolvers","schemes")
local http=require("socket.http")
@@ -24457,7 +25064,7 @@ function cleaners.none(specification)
return specification.original
end
function cleaners.strip(specification)
- local path,name=file.splitbase(specification.original)
+ local path,name=splitbase(specification.original)
if path=="" then
return (gsub(name,"[^%a%d%.]+","-"))
else
@@ -24465,7 +25072,7 @@ function cleaners.strip(specification)
end
end
function cleaners.md5(specification)
- return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
+ return addsuffix(md5hex(specification.original),suffix(specification.path))
end
local cleaner=cleaners.strip
directives.register("schemes.cleanmethod",function(v) cleaner=cleaners[v] or cleaners.strip end)
@@ -24485,7 +25092,7 @@ local runner=sandbox.registerrunner {
name="curl resolver",
method="execute",
program="curl",
- template="--silent --insecure --create-dirs --output %cachename% %original%",
+ template='--silent --insecure --create-dirs --output "%cachename%" "%original%"',
checkers={
cachename="cache",
original="url",
@@ -24556,10 +25163,10 @@ end
schemes.install=install
local function http_handler(specification,cachename)
local tempname=cachename..".tmp"
- local f=io.open(tempname,"wb")
+ local handle=io.open(tempname,"wb")
local status,message=http.request {
url=specification.original,
- sink=ltn12.sink.file(f)
+ sink=ltn12.sink.file(handle)
}
if not status then
os.remove(tempname)
@@ -24574,13 +25181,13 @@ install('https')
install('ftp')
statistics.register("scheme handling time",function()
local l,r,nl,nr={},{},0,0
- for k,v in table.sortedhash(loaded) do
+ for k,v in sortedhash(loaded) do
if v>0 then
nl=nl+1
l[nl]=k..":"..v
end
end
- for k,v in table.sortedhash(reused) do
+ for k,v in sortedhash(reused) do
if v>0 then
nr=nr+1
r[nr]=k..":"..v
@@ -24588,10 +25195,10 @@ statistics.register("scheme handling time",function()
end
local n=nl+nr
if n>0 then
- l=nl>0 and concat(l) or "none"
- r=nr>0 and concat(r) or "none"
+ if nl==0 then l={ "none" } end
+ if nr==0 then r={ "none" } end
return format("%s seconds, %s processed, threshold %s seconds, loaded: %s, reused: %s",
- statistics.elapsedtime(schemes),n,threshold,l,r)
+ statistics.elapsedtime(schemes),n,threshold,concat(l," "),concat(l," "))
else
return nil
end
@@ -24624,7 +25231,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lua"] = package.loaded["data-lua"] or true
--- original size: 4207, stripped down to: 3041
+-- original size: 4227, stripped down to: 3049
if not modules then modules={} end modules ['data-lua']={
version=1.001,
@@ -24634,8 +25241,7 @@ if not modules then modules={} end modules ['data-lua']={
license="see context related readme files"
}
local package,lpeg=package,lpeg
-local gsub=string.gsub
-local concat=table.concat
+local loadfile=loadfile
local addsuffix=file.addsuffix
local P,S,Cs,lpegmatch=lpeg.P,lpeg.S,lpeg.Cs,lpeg.match
local luasuffixes={ 'tex','lua' }
@@ -24646,6 +25252,8 @@ local helpers=package.helpers or {}
local methods=helpers.methods or {}
local resolvers=resolvers
local resolveprefix=resolvers.resolve
+local expandedpaths=resolvers.expandedpathlistfromvariable
+local findfile=resolvers.findfile
helpers.report=logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries",function(v) helpers.trace=v end)
trackers.register("resolvers.locating",function(v) helpers.trace=v end)
@@ -24674,7 +25282,7 @@ local function getluaformatpaths()
if not luaformatpaths then
luaformatpaths={}
for i=1,#luaformats do
- registerpath("lua format","lua",luaformatpaths,resolvers.expandedpathlistfromvariable(luaformats[i]))
+ registerpath("lua format","lua",luaformatpaths,expandedpaths(luaformats[i]))
end
end
return luaformatpaths
@@ -24683,7 +25291,7 @@ local function getlibformatpaths()
if not libformatpaths then
libformatpaths={}
for i=1,#libformats do
- registerpath("lib format","lib",libformatpaths,resolvers.expandedpathlistfromvariable(libformats[i]))
+ registerpath("lib format","lib",libformatpaths,expandedpaths(libformats[i]))
end
end
return libformatpaths
@@ -24693,7 +25301,7 @@ local function loadedbyformat(name,rawname,suffixes,islib,what)
local report=helpers.report
for i=1,#suffixes do
local format=suffixes[i]
- local resolved=resolvers.findfile(name,format) or ""
+ local resolved=findfile(name,format) or ""
if trace then
report("%s format, identifying %a using format %a",what,name,format)
end
@@ -24731,7 +25339,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-aux"] = package.loaded["data-aux"] or true
--- original size: 2452, stripped down to: 1877
+-- original size: 2610, stripped down to: 2019
if not modules then modules={} end modules ['data-aux']={
version=1.001,
@@ -24742,24 +25350,28 @@ if not modules then modules={} end modules ['data-aux']={
}
local find=string.find
local type,next=type,next
+local addsuffix,removesuffix=file.addsuffix,file.removesuffix
+local loaddata,savedata=io.loaddata,io.savedata
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local resolvers=resolvers
+local cleanpath=resolvers.cleanpath
+local findfiles=resolvers.findfiles
local report_scripts=logs.reporter("resolvers","scripts")
function resolvers.updatescript(oldname,newname)
local scriptpath="context/lua"
- newname=file.addsuffix(newname,"lua")
- local oldscript=resolvers.cleanpath(oldname)
+ local oldscript=cleanpath(oldname)
+ local newname=addsuffix(newname,"lua")
+ local newscripts=findfiles(newname) or {}
if trace_locating then
report_scripts("to be replaced old script %a",oldscript)
end
- local newscripts=resolvers.findfiles(newname) or {}
if #newscripts==0 then
if trace_locating then
report_scripts("unable to locate new script")
end
else
for i=1,#newscripts do
- local newscript=resolvers.cleanpath(newscripts[i])
+ local newscript=cleanpath(newscripts[i])
if trace_locating then
report_scripts("checking new script %a",newscript)
end
@@ -24771,17 +25383,17 @@ function resolvers.updatescript(oldname,newname)
if trace_locating then
report_scripts("new script should come from %a",scriptpath)
end
- elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
+ elseif not (find(oldscript,removesuffix(newname).."$") or find(oldscript,newname.."$")) then
if trace_locating then
report_scripts("invalid new script name")
end
else
- local newdata=io.loaddata(newscript)
+ local newdata=loaddata(newscript)
if newdata then
if trace_locating then
report_scripts("old script content replaced by new content: %s",oldscript)
end
- io.savedata(oldscript,newdata)
+ savedata(oldscript,newdata)
break
elseif trace_locating then
report_scripts("unable to load new script")
@@ -24854,7 +25466,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lst"] = package.loaded["data-lst"] or true
--- original size: 1823, stripped down to: 1542
+-- original size: 2038, stripped down to: 1696
if not modules then modules={} end modules ['data-lst']={
version=1.001,
@@ -24864,15 +25476,22 @@ if not modules then modules={} end modules ['data-lst']={
license="see context related readme files"
}
local type=type
-local concat,sortedhash=table.concat,table.sortedhash
+local sortedhash=table.sortedhash
+local isdir=lfs.isdir
local resolvers=resolvers
local listers=resolvers.listers or {}
resolvers.listers=listers
local resolveprefix=resolvers.resolve
+local configurationfiles=resolvers.configurationfiles
+local expandedpathfromlist=resolvers.expandedpathfromlist
+local splitpath=resolvers.splitpath
+local knownvariables=resolvers.knownvariables
local report_lists=logs.reporter("resolvers","lists")
local report_resolved=logs.reporter("system","resolved")
local function tabstr(str)
- if type(str)=='table' then
+ if not str then
+ return "unset"
+ elseif type(str)=='table' then
return concat(str," | ")
else
return str
@@ -24882,22 +25501,22 @@ function listers.variables(pattern)
local result=resolvers.knownvariables(pattern)
for key,value in sortedhash(result) do
report_lists(key)
- report_lists(" env: %s",tabstr(value.environment or "unset"))
- report_lists(" var: %s",tabstr(value.variable or "unset"))
- report_lists(" exp: %s",tabstr(value.expansion or "unset"))
- report_lists(" res: %s",tabstr(value.resolved or "unset"))
+ report_lists(" env: %s",tabstr(value.environment))
+ report_lists(" var: %s",tabstr(value.variable))
+ report_lists(" exp: %s",tabstr(value.expansion))
+ report_lists(" res: %s",tabstr(value.resolved))
end
end
function listers.configurations()
- local configurations=resolvers.configurationfiles()
+ local configurations=configurationfiles()
for i=1,#configurations do
report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
- local list=resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
+ local list=expandedpathfromlist(splitpath(resolvers.luacnfspec))
for i=1,#list do
local li=resolveprefix(list[i])
- if lfs.isdir(li) then
+ if isdir(li) then
report_resolved("path - %s",li)
else
report_resolved("path + %s",li)
@@ -24910,318 +25529,147 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-package.loaded["util-lib"] = package.loaded["util-lib"] or true
+package.loaded["libs-ini"] = package.loaded["libs-ini"] or true
--- original size: 16094, stripped down to: 8443
+-- original size: 5822, stripped down to: 3629
-if not modules then modules={} end modules ['util-lib']={
+if not modules then modules={} end modules ['libs-ini']={
version=1.001,
comment="companion to luat-lib.mkiv",
author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files",
+ license="see context related readme files"
}
+local type,unpack=type,unpack
local type=type
-local next=next
-local pcall=pcall
-local gsub=string.gsub
-local find=string.find
-local sort=table.sort
-local pathpart=file.pathpart
local nameonly=file.nameonly
local joinfile=file.join
-local removesuffix=file.removesuffix
local addsuffix=file.addsuffix
-local findfile=resolvers.findfile
-local findfiles=resolvers.findfiles
-local expandpaths=resolvers.expandedpathlistfromvariable
local qualifiedpath=file.is_qualified_path
local isfile=lfs.isfile
-local done=false
-local function locate(required,version,trace,report,action)
- if type(required)~="string" then
- report("provide a proper library name")
- return
- end
- if trace then
- report("requiring library %a with version %a",required,version or "any")
- end
- local found_library=nil
- local required_full=gsub(required,"%.","/")
- local required_path=pathpart(required_full)
- local required_base=nameonly(required_full)
- if qualifiedpath(required) then
- if isfile(addsuffix(required,os.libsuffix)) then
- if trace then
- report("qualified name %a found",required)
+local findfile=resolvers.findfile
+local expandpaths=resolvers.expandedpathlistfromvariable
+local report=logs.reporter("resolvers","libraries")
+local trace=false
+trackers.register("resolvers.lib",function(v) trace=v end)
+local function findlib(required)
+ local suffix=os.libsuffix or "so"
+ if not qualifiedpath(required) then
+ local list=directives.value("system.librarynames" )
+ local only=nameonly(required)
+ if type(list)=="table" then
+ list=list[only]
+ if type(list)~="table" then
+ list={ only }
end
- found_library=required
else
- if trace then
- report("qualified name %a not found",required)
- end
+ list={ only }
end
- else
- local required_name=required_base.."."..os.libsuffix
- local version=type(version)=="string" and version~="" and version or false
- local engine="luatex"
- if trace and not done then
- local list=expandpaths("lib")
- for i=1,#list do
- report("tds path %i: %s",i,list[i])
- end
- end
- local function found(locate,asked_library,how,...)
- if trace then
- report("checking %s: %a",how,asked_library)
- end
- return locate(asked_library,...)
+ if trace then
+ report("using lookup list for library %a: % | t",only,list)
end
- local function check(locate,...)
- local found=nil
- if version then
- local asked_library=joinfile(required_path,version,required_name)
- if trace then
- report("checking %s: %a","with version",asked_library)
- end
- found=locate(asked_library,...)
+ for i=1,#list do
+ local name=list[i]
+ local found=findfile(name,"lib")
+ if not found then
+ found=findfile(addsuffix(name,suffix),"lib")
end
- if not found or found=="" then
- local asked_library=joinfile(required_path,required_name)
+ if found then
if trace then
- report("checking %s: %a","with version",asked_library)
+ report("library %a resolved via %a path to %a",name,"tds lib",found)
end
- found=locate(asked_library,...)
- end
- return found and found~="" and found or false
- end
- local function attempt(checkpattern)
- if trace then
- report("checking tds lib paths strictly")
- end
- local found=findfile and check(findfile,"lib")
- if found and (not checkpattern or find(found,checkpattern)) then
return found
end
- if trace then
- report("checking tds lib paths with wildcard")
- end
- local asked_library=joinfile(required_path,".*",required_name)
- if trace then
- report("checking %s: %a","latest version",asked_library)
- end
- local list=findfiles(asked_library,"lib",true)
- if list and #list>0 then
- sort(list)
- local found=list[#list]
- if found and (not checkpattern or find(found,checkpattern)) then
- return found
- end
- end
- if trace then
- report("checking lib paths")
- end
- package.extralibpath(environment.ownpath)
- local paths=package.libpaths()
- local pattern="/[^/]+%."..os.libsuffix.."$"
- for i=1,#paths do
- required_path=gsub(paths[i],pattern,"")
- local found=check(lfs.isfound)
- if type(found)=="string" and (not checkpattern or find(found,checkpattern)) then
- return found
- end
- end
- return false
end
- if engine then
- if trace then
- report("attemp 1, engine %a",engine)
- end
- found_library=attempt("/"..engine.."/")
- if not found_library then
- if trace then
- report("attemp 2, no engine",asked_library)
+ if expandpaths then
+ local list=expandpaths("PATH")
+ local base=addsuffix(only,suffix)
+ for i=1,#list do
+ local full=joinfile(list[i],base)
+ local found=isfile(full) and full
+ if found then
+ if trace then
+ report("library %a resolved via %a path to %a",name,"system",found)
+ end
+ return found
end
- found_library=attempt()
end
- else
- found_library=attempt()
end
- end
- if not found_library then
+ elseif isfile(addsuffix(required,suffix)) then
if trace then
- report("not found: %a",required)
+ report("library with qualified name %a %sfound",required,"")
end
- library=false
+ return required
else
if trace then
- report("found: %a",found_library)
- end
- local result,message=action(found_library,required_base)
- if result then
- library=result
- else
- library=false
- report("load error: message %a, library %a",tostring(message or "unknown"),found_library or "no library")
+ report("library with qualified name %a %sfound",required,"not ")
end
end
- if trace then
- if not library then
- report("unknown library: %a",required)
- else
- report("stored library: %a",required)
- end
- end
- return library or nil
+ return false
end
-do
- local report_swiglib=logs.reporter("swiglib")
- local trace_swiglib=false
- local savedrequire=require
- local loadedlibs={}
- local loadlib=package.loadlib
- local pushdir=dir.push
- local popdir=dir.pop
- trackers.register("resolvers.swiglib",function(v) trace_swiglib=v end)
- function requireswiglib(required,version)
- local library=loadedlibs[library]
- if library==nil then
- local trace_swiglib=trace_swiglib or package.helpers.trace
- library=locate(required,version,trace_swiglib,report_swiglib,function(name,base)
- pushdir(pathpart(name))
- local opener="luaopen_"..base
- if trace_swiglib then
- report_swiglib("opening: %a with %a",name,opener)
- end
- local library,message=loadlib(name,opener)
- local libtype=type(library)
- if libtype=="function" then
- library=library()
+local foundlibraries=table.setmetatableindex(function(t,k)
+ local v=findlib(k)
+ t[k]=v
+ return v
+end)
+function resolvers.findlib(required)
+ return foundlibraries[required]
+end
+local libraries={}
+resolvers.libraries=libraries
+local report=logs.reporter("optional")
+if optional then optional.loaded={} end
+function libraries.validoptional(name)
+ local thelib=optional and optional[name]
+ if not thelib then
+ elseif thelib.initialize then
+ return thelib
+ else
+ report("invalid optional library %a",libname)
+ end
+end
+function libraries.optionalloaded(name,libnames)
+ local thelib=optional and optional[name]
+ if not thelib then
+ report("no optional %a library found",name)
+ else
+ local thelib_initialize=thelib.initialize
+ if not thelib_initialize then
+ report("invalid optional library %a",name)
+ else
+ if type(libnames)=="string" then
+ libnames={ libnames }
+ end
+ if type(libnames)=="table" then
+ for i=1,#libnames do
+ local libname=libnames[i]
+ local filename=foundlibraries[libname]
+ if filename then
+ libnames[i]=filename
+ else
+ report("unable to locate library %a",libname)
+ return
+ end
+ end
+ local initialized=thelib_initialize(unpack(libnames))
+ if initialized then
+ report("using library '% + t'",libnames)
else
- report_swiglib("load error: %a returns %a, message %a, library %a",opener,libtype,(string.gsub(message or "no message","[%s]+$","")),found_library or "no library")
- library=false
+ report("unable to initialize library '% + t'",libnames)
end
- popdir()
- return library
- end)
- loadedlibs[required]=library or false
- end
- return library
- end
- function require(name,version)
- if find(name,"^swiglib%.") then
- return requireswiglib(name,version)
- else
- return savedrequire(name)
- end
- end
- local swiglibs={}
- local initializer="core"
- function swiglib(name,version)
- local library=swiglibs[name]
- if not library then
- statistics.starttiming(swiglibs)
- if trace_swiglib then
- report_swiglib("loading %a",name)
- end
- if not find(name,"%."..initializer.."$") then
- fullname="swiglib."..name.."."..initializer
- else
- fullname="swiglib."..name
+ return initialized
end
- library=requireswiglib(fullname,version)
- swiglibs[name]=library
- statistics.stoptiming(swiglibs)
end
- return library
end
- statistics.register("used swiglibs",function()
- if next(swiglibs) then
- return string.format("%s, initial load time %s seconds",table.concat(table.sortedkeys(swiglibs)," "),statistics.elapsedtime(swiglibs))
- end
- end)
end
if FFISUPPORTED and ffi and ffi.load then
- local report_ffilib=logs.reporter("ffilib")
- local trace_ffilib=false
- local savedffiload=ffi.load
- trackers.register("resolvers.ffilib",function(v) trace_ffilib=v end)
- local loaded={}
- local function locateindeed(name)
- name=removesuffix(name)
- local l=loaded[name]
- if l==nil then
- local state,library=pcall(savedffiload,name)
- if type(library)=="userdata" then
- l=library
- elseif type(state)=="userdata" then
- l=state
- else
- l=false
- end
- loaded[name]=l
- elseif trace_ffilib then
- report_ffilib("reusing already loaded %a",name)
- end
- return l
- end
- local function getlist(required)
- local list=directives.value("system.librarynames" )
- if type(list)=="table" then
- list=list[required]
- if type(list)=="table" then
- if trace then
- report("using lookup list for library %a: % | t",required,list)
- end
- return list
- end
- end
- return { required }
- end
- function ffilib(name,version)
- name=removesuffix(name)
- local l=loaded[name]
- if l~=nil then
- if trace_ffilib then
- report_ffilib("reusing already loaded %a",name)
- end
- return l
- end
- local list=getlist(name)
- if version=="system" then
- for i=1,#list do
- local library=locateindeed(list[i])
- if type(library)=="userdata" then
- return library
- end
- end
- else
- for i=1,#list do
- local library=locate(list[i],version,trace_ffilib,report_ffilib,locateindeed)
- if type(library)=="userdata" then
- return library
- end
- end
- end
- end
+ local ffiload=ffi.load
function ffi.load(name)
- local list=getlist(name)
- for i=1,#list do
- local library=ffilib(list[i])
- if type(library)=="userdata" then
- return library
- end
- end
- if trace_ffilib then
- report_ffilib("trying to load %a using normal loader",name)
- end
- for i=1,#list do
- local state,library=pcall(savedffiload,list[i])
- if type(library)=="userdata" then
- return library
- elseif type(state)=="userdata" then
- return library
- end
+ local full=name and foundlibraries[name]
+ if full then
+ return ffiload(full)
+ else
+ return ffiload(name)
end
end
end
@@ -25336,7 +25784,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 9637, stripped down to: 7253
+-- original size: 13964, stripped down to: 10026
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -25350,16 +25798,14 @@ local concat=table.concat
local quoted=string.quoted
local luasuffixes=utilities.lua.suffixes
local report_format=logs.reporter("resolvers","formats")
-local function primaryflags()
- local arguments=environment.arguments
+local function primaryflags(arguments)
local flags={}
if arguments.silent then
flags[#flags+1]="--interaction=batchmode"
end
return concat(flags," ")
end
-local function secondaryflags()
- local arguments=environment.arguments
+local function secondaryflags(arguments)
local trackers=arguments.trackers
local directives=arguments.directives
local flags={}
@@ -25381,6 +25827,9 @@ local function secondaryflags()
if arguments.ansi then
flags[#flags+1]="--c:ansi"
end
+ if arguments.ansilog then
+ flags[#flags+1]="--c:ansilog"
+ end
if arguments.strip then
flags[#flags+1]="--c:strip"
end
@@ -25391,12 +25840,13 @@ local function secondaryflags()
end
local template=[[--ini %primaryflags% --lua=%luafile% %texfile% %secondaryflags% %dump% %redirect%]]
local checkers={
- primaryflags="string",
- secondaryflags="string",
+ primaryflags="verbose",
+ secondaryflags="verbose",
luafile="readable",
texfile="readable",
redirect="string",
dump="string",
+ binarypath="string",
}
local runners={
luatex=sandbox.registerrunner {
@@ -25421,46 +25871,88 @@ local runners={
reporter=report_format,
},
}
-function environment.make_format(name,arguments)
+local function validbinarypath()
+ if not environment.arguments.nobinarypath then
+ local path=environment.ownpath or file.dirname(environment.ownname)
+ if path and path~="" then
+ path=dir.expandname(path)
+ if path~="" and lfs.isdir(path) then
+ return path
+ end
+ end
+ end
+end
+function environment.make_format(formatname)
+ local arguments=environment.arguments
local engine=environment.ownmain or "luatex"
- local silent=environment.arguments.silent
- local errors=environment.arguments.errors
- local olddir=dir.current()
- local path=caches.getwritablepath("formats",engine) or ""
- if path~="" then
- lfs.chdir(path)
- end
- report_format("using format path %a",dir.current())
- local texsourcename=file.addsuffix(name,"mkiv")
- local fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ local silent=arguments.silent
+ local errors=arguments.errors
+ local texsourcename=""
+ local texsourcepath=""
+ local fulltexsourcename=""
+ if engine=="luametatex" then
+ texsourcename=file.addsuffix(formatname,"mkxl")
+ fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ end
+ if fulltexsourcename=="" then
+ texsourcename=file.addsuffix(formatname,"mkiv")
+ fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ end
if fulltexsourcename=="" then
- texsourcename=file.addsuffix(name,"tex")
+ texsourcename=file.addsuffix(formatname,"tex")
fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
end
if fulltexsourcename=="" then
- report_format("no tex source file with name %a (mkiv or tex)",name)
- lfs.chdir(olddir)
+ report_format("no tex source file with name %a (mkiv or tex)",formatname)
return
- else
- report_format("using tex source file %a",fulltexsourcename)
end
- local texsourcepath=dir.expandname(file.dirname(fulltexsourcename))
- local specificationname=file.replacesuffix(fulltexsourcename,"lus")
- local fullspecificationname=resolvers.findfile(specificationname,"tex") or ""
- if fullspecificationname=="" then
- specificationname=file.join(texsourcepath,"context.lus")
- fullspecificationname=resolvers.findfile(specificationname,"tex") or ""
+ report_format("using tex source file %a",fulltexsourcename)
+ fulltexsourcename=dir.expandname(fulltexsourcename)
+ texsourcepath=file.dirname(fulltexsourcename)
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
end
+ local specificationname="context.lus"
+ local specificationpath=""
+ local fullspecificationname=resolvers.findfile(specificationname) or ""
if fullspecificationname=="" then
- report_format("unknown stub specification %a",specificationname)
- lfs.chdir(olddir)
+ report_format("unable to locate specification file %a",specificationname)
+ return
+ end
+ report_format("using specification file %a",fullspecificationname)
+ fullspecificationname=dir.expandname(fullspecificationname)
+ specificationpath=file.dirname(fullspecificationname)
+ if texsourcepath~=specificationpath then
+ report_format("tex source file and specification file are on different paths")
+ return
+ end
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
+ end
+ if not lfs.isfile(fullspecificationname) then
+ report_format("no accessible specification file with name %a",fulltexsourcename)
+ return
+ end
+ report_format("using tex source path %a",texsourcepath)
+ local validformatpath=caches.getwritablepath("formats",engine) or ""
+ local startupdir=dir.current()
+ if validformatpath=="" then
+ report_format("invalid format path, insufficient write access")
+ return
+ end
+ local binarypath=validbinarypath()
+ report_format("changing to format path %a",validformatpath)
+ lfs.chdir(validformatpath)
+ if dir.current()~=validformatpath then
+ report_format("unable to change to format path %a",validformatpath)
return
end
- local specificationpath=file.dirname(fullspecificationname)
local usedluastub=nil
local usedlualibs=dofile(fullspecificationname)
if type(usedlualibs)=="string" then
- usedluastub=file.join(file.dirname(fullspecificationname),usedlualibs)
+ usedluastub=file.join(specificationpath,usedlualibs)
elseif type(usedlualibs)=="table" then
report_format("using stub specification %a",fullspecificationname)
local texbasename=file.basename(name)
@@ -25477,48 +25969,57 @@ function environment.make_format(name,arguments)
end
else
report_format("invalid stub specification %a",fullspecificationname)
- lfs.chdir(olddir)
+ lfs.chdir(startupdir)
return
end
+ local runner=runners[engine]
+ if not runner then
+ report_format("the format %a cannot be generated, no runner available for engine %a",name,engine)
+ lfs.chdir(startupdir)
+ return
+ end
+ local primaryflags=primaryflags(arguments)
+ local secondaryflags=secondaryflags(arguments)
local specification={
- primaryflags=primaryflags(),
- secondaryflags=secondaryflags(),
+ binarypath=binarypath,
+ primaryflags=primaryflags,
+ secondaryflags=secondaryflags,
luafile=quoted(usedluastub),
texfile=quoted(fulltexsourcename),
dump=os.platform=="unix" and "\\\\dump" or "\\dump",
}
- local runner=runners[engine]
- if not runner then
- report_format("format %a cannot be generated, no runner available for engine %a",name,engine)
- elseif silent then
- statistics.starttiming()
+ if silent then
specification.redirect="> temp.log"
- local result=runner(specification)
- local runtime=statistics.stoptiming()
- if result~=0 then
- print(format("%s silent make > fatal error when making format %q",engine,name))
- else
- print(format("%s silent make > format %q made in %.3f seconds",engine,name,runtime))
- end
+ end
+ statistics.starttiming()
+ local result=runner(specification)
+ local runtime=statistics.stoptiming()
+ if silent then
os.remove("temp.log")
- else
- runner(specification)
end
- local pattern=file.removesuffix(file.basename(usedluastub)).."-*.mem"
- local mp=dir.glob(pattern)
- if mp then
- for i=1,#mp do
- local name=mp[i]
- report_format("removing related mplib format %a",file.basename(name))
- os.remove(name)
+ report_format()
+ if binarypath and binarypath~="" then
+ report_format("binary path : %s",binarypath or "?")
end
- end
- lfs.chdir(olddir)
+ report_format("format path : %s",validformatpath)
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",usedluastub)
+ if primaryflags~="" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags~="" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("context file : %s",fulltexsourcename)
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result==0 and "okay" or "error")
+ report_format()
+ lfs.chdir(startupdir)
end
-local template=[[%flags% --fmt=%fmtfile% --lua=%luafile% %texfile% %more%]]
+local template=[[%primaryflags% --fmt=%fmtfile% --lua=%luafile% %texfile% %secondaryflags%]]
local checkers={
- flags="string",
- more="string",
+ primaryflags="verbose",
+ secondaryflags="verbose",
fmtfile="readable",
luafile="readable",
texfile="readable",
@@ -25531,6 +26032,13 @@ local runners={
checkers=checkers,
reporter=report_format,
},
+ luametatex=sandbox.registerrunner {
+ name="run luametatex format",
+ program="luametatex",
+ template=template,
+ checkers=checkers,
+ reporter=report_format,
+ },
luajittex=sandbox.registerrunner {
name="run luajittex format",
program="luajittex",
@@ -25539,51 +26047,78 @@ local runners={
reporter=report_format,
},
}
-function environment.run_format(name,data,more)
- if name and name~="" then
- local engine=environment.ownmain or "luatex"
- local barename=file.removesuffix(name)
- local fmtname=caches.getfirstreadablefile(file.addsuffix(barename,"fmt"),"formats",engine)
- if fmtname=="" then
- fmtname=resolvers.findfile(file.addsuffix(barename,"fmt")) or ""
- end
- fmtname=resolvers.cleanpath(fmtname)
- if fmtname=="" then
- report_format("no format with name %a",name)
- else
- local barename=file.removesuffix(name)
- local luaname=file.addsuffix(barename,"luc")
- if not lfs.isfile(luaname) then
- luaname=file.addsuffix(barename,"lua")
- end
- if not lfs.isfile(luaname) then
- report_format("using format name %a",fmtname)
- report_format("no luc/lua file with name %a",barename)
- else
- local runner=runners[engine]
- if not runner then
- report_format("format %a cannot be run, no runner available for engine %a",name,engine)
- else
- runner {
- flags=primaryflags(),
- fmtfile=quoted(barename),
- luafile=quoted(luaname),
- texfile=quoted(data),
- more=more,
- }
- end
- end
- end
+function environment.run_format(formatname,scriptname,filename,primaryflags,secondaryflags,verbose)
+ local engine=environment.ownmain or "luatex"
+ if not formatname or formatname=="" then
+ report_format("missing format name")
+ return
+ end
+ if not scriptname or scriptname=="" then
+ report_format("missing script name")
+ return
+ end
+ if not lfs.isfile(formatname) or not lfs.isfile(scriptname) then
+ formatname,scriptname=resolvers.locateformat(formatname)
end
+ if not formatname or formatname=="" then
+ report_format("invalid format name")
+ return
+ end
+ if not scriptname or scriptname=="" then
+ report_format("invalid script name")
+ return
+ end
+ local runner=runners[engine]
+ if not runner then
+ report_format("format %a cannot be run, no runner available for engine %a",file.nameonly(name),engine)
+ return
+ end
+ if not filename then
+ filename ""
+ end
+ local binarypath=validbinarypath()
+ local specification={
+ binarypath=binarypath,
+ primaryflags=primaryflags or "",
+ secondaryflags=secondaryflags or "",
+ fmtfile=quoted(formatname),
+ luafile=quoted(scriptname),
+ texfile=filename~="" and quoted(filename) or "",
+ }
+ statistics.starttiming()
+ local result=runner(specification)
+ local runtime=statistics.stoptiming()
+ if verbose then
+ report_format()
+ if binarypath and binarypath~="" then
+ report_format("binary path : %s",binarypath)
+ end
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",scriptname)
+ report_format("tex format file : %s",formatname)
+ if filename~="" then
+ report_format("tex input file : %s",filename)
+ end
+ if primaryflags~="" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags~="" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result==0 and "okay" or "error")
+ report_format()
+ end
+ return result
end
end -- of closure
--- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
+-- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua libs-ini.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 1019480
--- stripped bytes : 403728
+-- original bytes : 1038245
+-- stripped bytes : 409841
-- end library merge
@@ -25697,7 +26232,7 @@ local ownlibs = { -- order can be made better
'data-tmf.lua',
'data-lst.lua',
- 'util-lib.lua', -- swiglib
+ 'libs-ini.lua',
'luat-sta.lua',
'luat-fmt.lua',
@@ -25846,7 +26381,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
- <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -25865,6 +26400,7 @@ local helpinfo = [[
<flag name="stubpath" value="binpath"><short>paths where stubs wil be written</short></flag>
<flag name="windows"><short>create windows (mswin) stubs</short></flag>
<flag name="unix"><short>create unix (linux) stubs</short></flag>
+ <flag name="addbinarypath"><short>prepend the (found) binarypath to runners</short></flag>
</subcategory>
<subcategory>
<flag name="verbose"><short>give a bit more info</short></flag>
@@ -26086,8 +26622,7 @@ end
report()
io.flush()
end
- -- no os.exec because otherwise we get the wrong return value
- local code = os.execute(command) -- maybe spawn
+ local code = os.execute(command)
if code == 0 then
return true
else
@@ -26130,7 +26665,7 @@ function runners.execute_program(fullname)
report()
report()
io.flush()
- local code = os.exec(command) -- (fullname,unpack(after)) does not work / maybe spawn
+ local code = os.execute(command)
return code == 0
end
end
@@ -26517,16 +27052,22 @@ function runners.associate(filename)
end
function runners.evaluate(code,filename) -- for Luigi
+ local environment = table.setmetatableindex(_G)
if code == "loop" then
while true do
- io.write("> ")
+ io.write("lua > ")
local code = io.read()
- if code ~= "" then
+ if code == "quit" or code == "exit" then
+ break
+ elseif code ~= "" then
local temp = string.match(code,"^= (.*)$")
if temp then
- code = "print("..temp..")"
+ code = "inspect("..temp..")"
+ end
+ local compiled, message = load(code,"console","t",environment)
+ if type(compiled) ~= "function" then
+ compiled = load("inspect("..code..")","console","t",environment)
end
- local compiled, message = loadstring(code)
if type(compiled) ~= "function" then
io.write("! " .. (message or code).."\n")
else
@@ -26539,7 +27080,10 @@ function runners.evaluate(code,filename) -- for Luigi
code = filename
end
if code ~= "" then
- local compiled, message = loadstring(code)
+ local compiled, message = load(code,"console","t",environment)
+ if type(compiled) ~= "function" then
+ compiled = load("inspect("..code..")","console","t",environment)
+ end
if type(compiled) ~= "function" then
io.write("invalid lua code: " .. (message or code))
return
@@ -26716,17 +27260,17 @@ do
end
-if e_argument("ansi") then
+-- if e_argument("ansi") or e_argument("ansilog") then
- logs.setformatters("ansi")
+-- logs.setformatters(e_argument("ansi") and "ansi" or "ansilog")
- local script = e_argument("script") or e_argument("scripts")
+-- -- local script = e_argument("script") or e_argument("scripts")
+-- --
+-- -- if type(script) == "string" then
+-- -- logs.writer("]0;"..script.."") -- for Alan to test
+-- -- end
- if type(script) == "string" then
- logs.writer("]0;"..script.."") -- for Alan to test
- end
-
-end
+-- end
if e_argument("script") or e_argument("scripts") then
@@ -26975,11 +27519,11 @@ elseif e_argument("format-path") then
resolvers.load()
report(caches.getwritablepath("format"))
-elseif e_argument("pattern") then
-
- -- luatools
-
- runners.execute_ctx_script("mtx-base","--pattern='" .. e_argument("pattern") .. "'",filename)
+-- elseif e_argument("pattern") then
+--
+-- -- luatools
+--
+-- runners.execute_ctx_script("mtx-base","--pattern='" .. e_argument("pattern") .. "'",filename)
elseif e_argument("generate") then
diff --git a/Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua b/Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua
index 98fe7f752e3..5907fa33c66 100644
--- a/Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua
+++ b/Master/texmf-dist/scripts/context/stubs/win64/mtxrun.lua
@@ -194,7 +194,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 6330, stripped down to: 2831
+-- original size: 6529, stripped down to: 2933
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -313,6 +313,9 @@ elseif not ffi.number then
end
if LUAVERSION>5.3 then
end
+if status and os.setenv then
+ os.setenv("engine",string.lower(status.luatex_engine or "unknown"))
+end
end -- of closure
@@ -321,7 +324,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-macro"] = package.loaded["l-macro"] or true
--- original size: 10131, stripped down to: 5991
+-- original size: 10130, stripped down to: 5990
if not modules then modules={} end modules ['l-macros']={
version=1.001,
@@ -546,7 +549,7 @@ end
macros.loaded=loaded
function required(name,trace)
local filename=file.addsuffix(name,"lua")
- local fullname=resolvers and resolvers.find_file(filename) or filename
+ local fullname=resolvers and resolvers.findfile(filename) or filename
if not fullname or fullname=="" then
return false
end
@@ -576,7 +579,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-sandbox"] = package.loaded["l-sandbox"] or true
--- original size: 9747, stripped down to: 6313
+-- original size: 9604, stripped down to: 6394
if not modules then modules={} end modules ['l-sandbox']={
version=1.001,
@@ -808,6 +811,9 @@ local function supported(library)
return l
end
loadfile=register(loadfile,"loadfile")
+if supported("lua") then
+ lua.openfile=register(lua.openfile,"lua.openfile")
+end
if supported("io") then
io.open=register(io.open,"io.open")
io.popen=register(io.popen,"io.popen")
@@ -1168,7 +1174,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true
--- original size: 38434, stripped down to: 19310
+-- original size: 38440, stripped down to: 19316
if not modules then modules={} end modules ['l-lpeg']={
version=1.001,
@@ -1337,7 +1343,7 @@ patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+unders
patterns.somecontent=(anything-newline-space)^1
patterns.beginline=#(1-newline)
patterns.longtostring=Cs(whitespace^0/""*((patterns.quoted+nonwhitespace^1+whitespace^1/""*(endofstring+Cc(" ")))^0))
-function anywhere(pattern)
+local function anywhere(pattern)
return (1-P(pattern))^0*P(pattern)
end
lpeg.anywhere=anywhere
@@ -1967,7 +1973,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-string"] = package.loaded["l-string"] or true
--- original size: 6461, stripped down to: 3255
+-- original size: 6644, stripped down to: 3410
if not modules then modules={} end modules ['l-string']={
version=1.001,
@@ -2031,9 +2037,11 @@ function string.is_empty(str)
end
end
local anything=patterns.anything
-local allescapes=Cc("%")*S(".-+%?()[]*")
-local someescapes=Cc("%")*S(".-+%()[]")
-local matchescapes=Cc(".")*S("*?")
+local moreescapes=Cc("%")*S(".-+%?()[]*$^{}")
+local allescapes=Cc("%")*S(".-+%?()[]*")
+local someescapes=Cc("%")*S(".-+%()[]")
+local matchescapes=Cc(".")*S("*?")
+local pattern_m=Cs ((moreescapes+anything )^0 )
local pattern_a=Cs ((allescapes+anything )^0 )
local pattern_b=Cs ((someescapes+matchescapes+anything )^0 )
local pattern_c=Cs (Cc("^")*(someescapes+matchescapes+anything )^0*Cc("$") )
@@ -2043,6 +2051,8 @@ end
function string.topattern(str,lowercase,strict)
if str=="" or type(str)~="string" then
return ".*"
+ elseif strict=="all" then
+ str=lpegmatch(pattern_m,str)
elseif strict then
str=lpegmatch(pattern_c,str)
else
@@ -2092,7 +2102,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-table"] = package.loaded["l-table"] or true
--- original size: 41332, stripped down to: 21508
+-- original size: 41758, stripped down to: 22643
if not modules then modules={} end modules ['l-table']={
version=1.001,
@@ -2101,7 +2111,7 @@ if not modules then modules={} end modules ['l-table']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local type,next,tostring,tonumber,select=type,next,tostring,tonumber,select
+local type,next,tostring,tonumber,select,rawget=type,next,tostring,tonumber,select,rawget
local table,string=table,string
local concat,sort=table.concat,table.sort
local format,lower,dump=string.format,string.lower,string.dump
@@ -2435,13 +2445,13 @@ function table.fromhash(t)
end
return hsh
end
-local noquotes,hexify,handle,compact,inline,functions,metacheck
+local noquotes,hexify,handle,compact,inline,functions,metacheck,accurate
local reserved=table.tohash {
'and','break','do','else','elseif','end','false','for','function','if',
'in','local','nil','not','or','repeat','return','then','true','until','while',
- 'NaN','goto',
+ 'NaN','goto','const',
}
-local function is_simple_table(t,hexify)
+local function is_simple_table(t,hexify,accurate)
local nt=#t
if nt>0 then
local n=0
@@ -2460,6 +2470,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i]=format("0x%X",v)
+ elseif accurate then
+ tt[i]=format("%q",v)
else
tt[i]=v
end
@@ -2480,6 +2492,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i+1]=format("0x%X",v)
+ elseif accurate then
+ tt[i+1]=format("%q",v)
else
tt[i+1]=v
end
@@ -2551,6 +2565,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tv=="number" then
if hexify then
handle(format("%s 0x%X,",depth,v))
+ elseif accurate then
+ handle(format("%s %q,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -2560,7 +2576,7 @@ local function do_serialize(root,name,depth,level,indexed)
if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
handle(format("%s { %s },",depth,concat(st,", ")))
else
@@ -2588,12 +2604,16 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
@@ -2601,12 +2621,16 @@ local function do_serialize(root,name,depth,level,indexed)
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
handle(format("%s %s=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s %s=%q,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
handle(format("%s [%q]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -2615,6 +2639,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -2631,6 +2657,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={},",depth,k))
+ elseif accurate then
+ handle(format("%s [%q]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -2643,11 +2671,13 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s [%q]={},",depth,k))
end
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
+ elseif accurate then
+ handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -2669,6 +2699,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
+ elseif accurate then
+ handle(format("%s [%q]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -2688,6 +2720,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=load(%q),",depth,k,f))
+ elseif accurate then
+ handle(format("%s [%q]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -2705,6 +2739,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -2728,6 +2764,7 @@ local function serialize(_handle,root,name,specification)
if type(specification)=="table" then
noquotes=specification.noquotes
hexify=specification.hexify
+ accurate=specification.accurate
handle=_handle or specification.handle or print
functions=specification.functions
compact=specification.compact
@@ -3043,7 +3080,7 @@ end
local function sequenced(t,sep,simple)
if not t then
return ""
- elseif type(t)=="string" then
+ elseif type(t)~="table" then
return t
end
local n=#t
@@ -3082,7 +3119,11 @@ local function sequenced(t,sep,simple)
end
end
end
- return concat(s,sep or " | ")
+ if sep==true then
+ return "{ "..concat(s,", ").." }"
+ else
+ return concat(s,sep or " | ")
+ end
end
table.sequenced=sequenced
function table.print(t,...)
@@ -3213,7 +3254,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-io"] = package.loaded["l-io"] or true
--- original size: 11823, stripped down to: 6325
+-- original size: 11829, stripped down to: 6331
if not modules then modules={} end modules ['l-io']={
version=1.001,
@@ -3227,7 +3268,7 @@ local open,flush,write,read=io.open,io.flush,io.write,io.read
local byte,find,gsub,format=string.byte,string.find,string.gsub,string.format
local concat=table.concat
local type=type
-if string.find(os.getenv("PATH"),";",1,true) then
+if string.find(os.getenv("PATH") or "",";",1,true) then
io.fileseparator,io.pathseparator="\\",";"
else
io.fileseparator,io.pathseparator="/",":"
@@ -3765,7 +3806,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 18916, stripped down to: 10126
+-- original size: 19102, stripped down to: 10192
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -3779,7 +3820,7 @@ local date,time=os.date,os.time
local find,format,gsub,upper,gmatch=string.find,string.format,string.gsub,string.upper,string.gmatch
local concat=table.concat
local random,ceil,randomseed=math.random,math.ceil,math.randomseed
-local rawget,rawset,type,getmetatable,setmetatable,tonumber,tostring=rawget,rawset,type,getmetatable,setmetatable,tonumber,tostring
+local type,setmetatable,tonumber,tostring=type,setmetatable,tonumber,tostring
do
local selfdir=os.selfdir
if selfdir=="" then
@@ -3930,7 +3971,8 @@ local launchers={
unix="xdg-open %s &> /dev/null &",
}
function os.launch(str)
- execute(format(launchers[os.name] or launchers.unix,str))
+ local command=format(launchers[os.name] or launchers.unix,str)
+ execute(command)
end
local gettimeofday=os.gettimeofday or os.clock
os.gettimeofday=gettimeofday
@@ -4185,6 +4227,12 @@ function os.validdate(year,month,day)
end
return year,month,day
end
+function os.date(fmt,...)
+ if not fmt then
+ fmt="%Y-%m-%d %H:%M"
+ end
+ return date(fmt,...)
+end
local osexit=os.exit
local exitcode=nil
function os.setexitcode(code)
@@ -4207,7 +4255,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 21984, stripped down to: 10148
+-- original size: 22175, stripped down to: 10302
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -4229,15 +4277,24 @@ local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
local attributes=lfs.attributes
function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
+ if name then
+ return attributes(name,"mode")=="directory"
+ end
end
function lfs.isfile(name)
- local a=attributes(name,"mode")
- return a=="file" or a=="link" or nil
+ if name then
+ local a=attributes(name,"mode")
+ return a=="file" or a=="link" or nil
+ end
end
function lfs.isfound(name)
- local a=attributes(name,"mode")
- return (a=="file" or a=="link") and name or nil
+ if name then
+ local a=attributes(name,"mode")
+ return (a=="file" or a=="link") and name or nil
+ end
+end
+function lfs.modification(name)
+ return name and attributes(name,"modification") or nil
end
if sandbox then
sandbox.redefine(lfs.isfile,"lfs.isfile")
@@ -4616,7 +4673,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-gzip"] = package.loaded["l-gzip"] or true
--- original size: 1211, stripped down to: 951
+-- original size: 5115, stripped down to: 1699
if not modules then modules={} end modules ['l-gzip']={
version=1.001,
@@ -4624,43 +4681,75 @@ if not modules then modules={} end modules ['l-gzip']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-if not gzip then
- return
-end
-local suffix,suffixes=file.suffix,file.suffixes
-function gzip.load(filename)
- local f=io.open(filename,"rb")
- if not f then
- elseif suffix(filename)=="gz" then
- f:close()
- local g=gzip.open(filename,"rb")
- if g then
- local str=g:read("*all")
- g:close()
- return str
+gzip=gzip or {}
+if not zlib then
+ zlib=xzip
+elseif not xzip then
+ xzip=zlib
+end
+if zlib then
+ local suffix=file.suffix
+ local suffixes=file.suffixes
+ local find=string.find
+ local openfile=io.open
+ local gzipwindow=15+16
+ local gziplevel=3
+ local identifier="^\x1F\x8B\x08"
+ local compress=zlib.compress
+ local decompress=zlib.decompress
+ function gzip.load(filename)
+ local f=openfile(filename,"rb")
+ if not f then
+ else
+ local data=f:read("*all")
+ f:close()
+ if data and data~="" then
+ if suffix(filename)=="gz" then
+ data=decompress(data,gzipwindow)
+ end
+ return data
+ end
end
- else
- local str=f:read("*all")
- f:close()
- return str
end
-end
-function gzip.save(filename,data)
- if suffix(filename)~="gz" then
- filename=filename..".gz"
+ function gzip.save(filename,data,level)
+ if suffix(filename)~="gz" then
+ filename=filename..".gz"
+ end
+ local f=openfile(filename,"wb")
+ if f then
+ data=compress(data or "",level or gziplevel,nil,gzipwindow)
+ f:write(data)
+ f:close()
+ return #data
+ end
end
- local f=io.open(filename,"wb")
- if f then
- local s=zlib.compress(data or "",9,nil,15+16)
- f:write(s)
- f:close()
- return #s
+ function gzip.suffix(filename)
+ local suffix,extra=suffixes(filename)
+ local gzipped=extra=="gz"
+ return suffix,gzipped
+ end
+ function gzip.compressed(s)
+ return s and find(s,identifier)
+ end
+ function gzip.compress(s,level)
+ if s and not find(s,identifier) then
+ if not level then
+ level=gziplevel
+ elseif level<=0 then
+ return s
+ elseif level>9 then
+ level=9
+ end
+ return compress(s,level or gziplevel,nil,gzipwindow) or s
+ end
+ end
+ function gzip.decompress(s)
+ if s and find(s,identifier) then
+ return decompress(s,gzipwindow)
+ else
+ return s
+ end
end
-end
-function gzip.suffix(filename)
- local suffix,extra=suffixes(filename)
- local gzipped=extra=="gz"
- return suffix,gzipped
end
@@ -4670,7 +4759,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-md5"] = package.loaded["l-md5"] or true
--- original size: 3309, stripped down to: 2218
+-- original size: 3414, stripped down to: 2307
if not modules then modules={} end modules ['l-md5']={
version=1.001,
@@ -4689,6 +4778,8 @@ if not md5 then
end
local md5,file=md5,file
local gsub=string.gsub
+local modification,isfile,touch=lfs.modification,lfs.isfile,lfs.touch
+local loaddata,savedata=io.loaddata,io.savedata
do
local patterns=lpeg and lpeg.patterns
if patterns then
@@ -4704,10 +4795,11 @@ do
md5.sumHEXA=md5.HEX
end
end
+local md5HEX=md5.HEX
function file.needsupdating(oldname,newname,threshold)
- local oldtime=lfs.attributes(oldname,"modification")
+ local oldtime=modification(oldname)
if oldtime then
- local newtime=lfs.attributes(newname,"modification")
+ local newtime=modification(newname)
if not newtime then
return true
elseif newtime>=oldtime then
@@ -4723,31 +4815,32 @@ function file.needsupdating(oldname,newname,threshold)
end
file.needs_updating=file.needsupdating
function file.syncmtimes(oldname,newname)
- local oldtime=lfs.attributes(oldname,"modification")
- if oldtime and lfs.isfile(newname) then
- lfs.touch(newname,oldtime,oldtime)
+ local oldtime=modification(oldname)
+ if oldtime and isfile(newname) then
+ touch(newname,oldtime,oldtime)
end
end
-function file.checksum(name)
+local function checksum(name)
if md5 then
- local data=io.loaddata(name)
+ local data=loaddata(name)
if data then
- return md5.HEX(data)
+ return md5HEX(data)
end
end
return nil
end
+file.checksum=checksum
function file.loadchecksum(name)
if md5 then
- local data=io.loaddata(name..".md5")
+ local data=loaddata(name..".md5")
return data and (gsub(data,"%s",""))
end
return nil
end
function file.savechecksum(name,checksum)
- if not checksum then checksum=file.checksum(name) end
+ if not checksum then checksum=checksum(name) end
if checksum then
- io.savedata(name..".md5",checksum)
+ savedata(name..".md5",checksum)
return checksum
end
return nil
@@ -5636,7 +5729,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-unicode"] = package.loaded["l-unicode"] or true
--- original size: 41047, stripped down to: 17171
+-- original size: 41281, stripped down to: 17261
if not modules then modules={} end modules ['l-unicode']={
version=1.001,
@@ -6151,49 +6244,52 @@ end
function utf.utf32_to_utf8_t(t,endian)
return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(b)
- if b<0x10000 then
- return char(b%256,rshift(b,8))
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+if bit32 then
+ local rshift=bit32.rshift
+ local function little(b)
+ if b<0x10000 then
+ return char(b%256,rshift(b,8))
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+ end
end
-end
-local function big(b)
- if b<0x10000 then
- return char(rshift(b,8),b%256)
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ local function big(b)
+ if b<0x10000 then
+ return char(rshift(b,8),b%256)
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ end
end
-end
-local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
-local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
-local function utf8_to_utf16_be(str,nobom)
- if nobom then
- return lpegmatch(b_remap,str)
- else
- return char(254,255)..lpegmatch(b_remap,str)
+ local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+ local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+ local function utf8_to_utf16_be(str,nobom)
+ if nobom then
+ return lpegmatch(b_remap,str)
+ else
+ return char(254,255)..lpegmatch(b_remap,str)
+ end
end
-end
-local function utf8_to_utf16_le(str,nobom)
- if nobom then
- return lpegmatch(l_remap,str)
- else
- return char(255,254)..lpegmatch(l_remap,str)
+ local function utf8_to_utf16_le(str,nobom)
+ if nobom then
+ return lpegmatch(l_remap,str)
+ else
+ return char(255,254)..lpegmatch(l_remap,str)
+ end
end
-end
-utf.utf8_to_utf16_be=utf8_to_utf16_be
-utf.utf8_to_utf16_le=utf8_to_utf16_le
-function utf.utf8_to_utf16(str,littleendian,nobom)
- if littleendian then
- return utf8_to_utf16_le(str,nobom)
- else
- return utf8_to_utf16_be(str,nobom)
+ utf.utf8_to_utf16_be=utf8_to_utf16_be
+ utf.utf8_to_utf16_le=utf8_to_utf16_le
+ function utf.utf8_to_utf16(str,littleendian,nobom)
+ if littleendian then
+ return utf8_to_utf16_le(str,nobom)
+ else
+ return utf8_to_utf16_be(str,nobom)
+ end
end
end
local pattern=Cs (
@@ -6467,7 +6563,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 43488, stripped down to: 21595
+-- original size: 45188, stripped down to: 22734
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -6797,6 +6893,13 @@ local template=[[
%s
return function(%s) return %s end
]]
+local pattern=Cs(Cc('"')*(
+ (1-S('"\\\n\r'))^1+P('"')/'\\"'+P('\\')/'\\\\'+P('\n')/'\\n'+P('\r')/'\\r'
+)^0*Cc('"'))
+patterns.escapedquotes=pattern
+function string.escapedquotes(s)
+ return lpegmatch(pattern,s)
+end
local preamble=""
local environment={
global=global or _G,
@@ -6821,9 +6924,10 @@ local environment={
formattednumber=number.formatted,
sparseexponent=number.sparseexponent,
formattedfloat=number.formattedfloat,
- stripzero=lpeg.patterns.stripzero,
- stripzeros=lpeg.patterns.stripzeros,
- FORMAT=string.f9,
+ stripzero=patterns.stripzero,
+ stripzeros=patterns.stripzeros,
+ escapedquotes=string.escapedquotes,
+ FORMAT=string.f6,
}
local arguments={ "a1" }
setmetatable(arguments,{ __index=function(t,k)
@@ -6874,13 +6978,16 @@ local format_left=function(f)
return format("a%s..utfpadding(a%s,%i)",n,n,-f)
end
end
-local format_q=function()
+local format_q=JITSUPPORTED and function()
n=n+1
return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n)
+end or function()
+ n=n+1
+ return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n)
end
local format_Q=function()
n=n+1
- return format("format('%%q',tostring(a%s))",n)
+ return format("escapedquotes(tostring(a%s))",n)
end
local format_i=function(f)
n=n+1
@@ -7031,12 +7138,25 @@ local format_n=function()
n=n+1
return format("((a%s %% 1 == 0) and format('%%i',a%s) or tostring(a%s))",n,n,n)
end
-local format_N=function(f)
- n=n+1
- if not f or f=="" then
- f=".9"
- end
- return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+local format_N if environment.FORMAT then
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ return format("FORMAT(a%s,'%%.9f')",n)
+ elseif f==".6" or f=="0.6" then
+ return format("FORMAT(a%s)",n)
+ else
+ return format("FORMAT(a%s,'%%%sf')",n,f)
+ end
+ end
+else
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ f=".9"
+ end
+ return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+ end
end
local format_a=function(f)
n=n+1
@@ -7265,9 +7385,9 @@ patterns.xmlescape=Cs((P("<")/"&lt;"+P(">")/"&gt;"+P("&")/"&amp;"+P('"')/"&quot;
patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+anything)^0)
patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0)
patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"'))
-add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=lpeg.patterns.xmlescape })
-add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
-add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
+add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=patterns.xmlescape })
+add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=patterns.texescape })
+add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=patterns.luaescape })
local dquote=patterns.dquote
local equote=patterns.escaped+dquote/'\\"'+1
local cquote=Cc('"')
@@ -7299,6 +7419,27 @@ local f_16_16=formatters["%0.5N"]
function number.to16dot16(n)
return f_16_16(n/65536.0)
end
+if not string.explode then
+ local tsplitat=lpeg.tsplitat
+ local p_utf=patterns.utf8character
+ local p_check=C(p_utf)*(P("+")*Cc(true))^0
+ local p_split=Ct(C(p_utf)^0)
+ local p_space=Ct((C(1-P(" ")^1)+P(" ")^1)^0)
+ function string.explode(str,symbol)
+ if symbol=="" then
+ return lpegmatch(p_split,str)
+ elseif symbol then
+ local a,b=lpegmatch(p_check,symbol)
+ if b then
+ return lpegmatch(tsplitat(P(a)^1),str)
+ else
+ return lpegmatch(tsplitat(a),str)
+ end
+ else
+ return lpegmatch(p_space,str)
+ end
+ end
+end
end -- of closure
@@ -7307,7 +7448,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 28866, stripped down to: 16134
+-- original size: 32649, stripped down to: 18257
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -7544,78 +7685,160 @@ function tables.encapsulate(core,capsule,protect)
} )
end
end
-local f_hashed_string=formatters["[%q]=%q,"]
-local f_hashed_number=formatters["[%q]=%s,"]
-local f_hashed_boolean=formatters["[%q]=%l,"]
-local f_hashed_table=formatters["[%q]="]
-local f_indexed_string=formatters["[%s]=%q,"]
-local f_indexed_number=formatters["[%s]=%s,"]
-local f_indexed_boolean=formatters["[%s]=%l,"]
-local f_indexed_table=formatters["[%s]="]
-local f_ordered_string=formatters["%q,"]
-local f_ordered_number=formatters["%s,"]
-local f_ordered_boolean=formatters["%l,"]
-function table.fastserialize(t,prefix)
- local r={ type(prefix)=="string" and prefix or "return" }
- local m=1
- local function fastserialize(t,outer)
- local n=#t
- m=m+1
- r[m]="{"
- if n>0 then
- for i=0,n do
- local v=t[i]
- local tv=type(v)
- if tv=="string" then
- m=m+1 r[m]=f_ordered_string(v)
- elseif tv=="number" then
- m=m+1 r[m]=f_ordered_number(v)
- elseif tv=="table" then
- fastserialize(v)
- elseif tv=="boolean" then
- m=m+1 r[m]=f_ordered_boolean(v)
+if JITSUPPORTED then
+ local f_hashed_string=formatters["[%Q]=%Q,"]
+ local f_hashed_number=formatters["[%Q]=%s,"]
+ local f_hashed_boolean=formatters["[%Q]=%l,"]
+ local f_hashed_table=formatters["[%Q]="]
+ local f_indexed_string=formatters["[%s]=%Q,"]
+ local f_indexed_number=formatters["[%s]=%s,"]
+ local f_indexed_boolean=formatters["[%s]=%l,"]
+ local f_indexed_table=formatters["[%s]="]
+ local f_ordered_string=formatters["%Q,"]
+ local f_ordered_number=formatters["%s,"]
+ local f_ordered_boolean=formatters["%l,"]
+ function table.fastserialize(t,prefix)
+ local r={ type(prefix)=="string" and prefix or "return" }
+ local m=1
+ local function fastserialize(t,outer)
+ local n=#t
+ m=m+1
+ r[m]="{"
+ if n>0 then
+ local v=t[0]
+ if v then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(0,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(0,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(0)
+ fastserialize(v)
+ m=m+1 r[m]=f_indexed_table(0)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(0,v)
+ end
+ end
+ for i=1,n do
+ local v=t[i]
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_ordered_string(v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_ordered_number(v)
+ elseif tv=="table" then
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_ordered_boolean(v)
+ end
end
end
- end
- for k,v in next,t do
- local tk=type(k)
- if tk=="number" then
- if k>n or k<0 then
+ for k,v in next,t do
+ local tk=type(k)
+ if tk=="number" then
+ if k>n or k<0 then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(k,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(k,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(k)
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(k,v)
+ end
+ end
+ else
local tv=type(v)
if tv=="string" then
- m=m+1 r[m]=f_indexed_string(k,v)
+ m=m+1 r[m]=f_hashed_string(k,v)
elseif tv=="number" then
- m=m+1 r[m]=f_indexed_number(k,v)
+ m=m+1 r[m]=f_hashed_number(k,v)
elseif tv=="table" then
- m=m+1 r[m]=f_indexed_table(k)
+ m=m+1 r[m]=f_hashed_table(k)
fastserialize(v)
elseif tv=="boolean" then
- m=m+1 r[m]=f_indexed_boolean(k,v)
+ m=m+1 r[m]=f_hashed_boolean(k,v)
end
end
+ end
+ m=m+1
+ if outer then
+ r[m]="}"
else
- local tv=type(v)
- if tv=="string" then
- m=m+1 r[m]=f_hashed_string(k,v)
- elseif tv=="number" then
- m=m+1 r[m]=f_hashed_number(k,v)
- elseif tv=="table" then
- m=m+1 r[m]=f_hashed_table(k)
- fastserialize(v)
- elseif tv=="boolean" then
- m=m+1 r[m]=f_hashed_boolean(k,v)
- end
+ r[m]="},"
end
+ return r
end
- m=m+1
- if outer then
- r[m]="}"
- else
- r[m]="},"
+ return concat(fastserialize(t,true))
+ end
+else
+ local f_v=formatters["[%q]=%q,"]
+ local f_t=formatters["[%q]="]
+ local f_q=formatters["%q,"]
+ function table.fastserialize(t,prefix)
+ local r={ type(prefix)=="string" and prefix or "return" }
+ local m=1
+ local function fastserialize(t,outer)
+ local n=#t
+ m=m+1
+ r[m]="{"
+ if n>0 then
+ local v=t[0]
+ if v then
+ m=m+1
+ r[m]="[0]='"
+ if type(v)=="table" then
+ fastserialize(v)
+ else
+ r[m]=format("%q,",v)
+ end
+ end
+ for i=1,n do
+ local v=t[i]
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%i]=",i)
+ fastserialize(v)
+ else
+ r[m]=format("[%i]=%q,",i,v)
+ end
+ end
+ end
+ for k,v in next,t do
+ local tk=type(k)
+ if tk=="number" then
+ if k>n or k<0 then
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%i]=",k)
+ fastserialize(v)
+ else
+ r[m]=format("[%i]=%q,",k,v)
+ end
+ end
+ else
+ m=m+1
+ if type(v)=="table" then
+ r[m]=format("[%q]=",k)
+ fastserialize(v)
+ else
+ r[m]=format("[%q]=%q,",k,v)
+ end
+ end
+ end
+ m=m+1
+ if outer then
+ r[m]="}"
+ else
+ r[m]="},"
+ end
+ return r
end
- return r
+ return concat(fastserialize(t,true))
end
- return concat(fastserialize(t,true))
end
function table.deserialize(str)
if not str or str=="" then
@@ -7709,28 +7932,28 @@ function table.twowaymapper(t)
return t
end
local f_start_key_idx=formatters["%w{"]
-local f_start_key_num=formatters["%w[%s]={"]
+local f_start_key_num=JITSUPPORTED and formatters["%w[%s]={"] or formatters["%w[%q]={"]
local f_start_key_str=formatters["%w[%q]={"]
local f_start_key_boo=formatters["%w[%l]={"]
local f_start_key_nop=formatters["%w{"]
local f_stop=formatters["%w},"]
-local f_key_num_value_num=formatters["%w[%s]=%s,"]
-local f_key_str_value_num=formatters["%w[%q]=%s,"]
-local f_key_boo_value_num=formatters["%w[%l]=%s,"]
-local f_key_num_value_str=formatters["%w[%s]=%q,"]
-local f_key_str_value_str=formatters["%w[%q]=%q,"]
-local f_key_boo_value_str=formatters["%w[%l]=%q,"]
-local f_key_num_value_boo=formatters["%w[%s]=%l,"]
-local f_key_str_value_boo=formatters["%w[%q]=%l,"]
+local f_key_num_value_num=JITSUPPORTED and formatters["%w[%s]=%s,"] or formatters["%w[%s]=%q,"]
+local f_key_str_value_num=JITSUPPORTED and formatters["%w[%Q]=%s,"] or formatters["%w[%Q]=%q,"]
+local f_key_boo_value_num=JITSUPPORTED and formatters["%w[%l]=%s,"] or formatters["%w[%l]=%q,"]
+local f_key_num_value_str=JITSUPPORTED and formatters["%w[%s]=%Q,"] or formatters["%w[%q]=%Q,"]
+local f_key_str_value_str=formatters["%w[%Q]=%Q,"]
+local f_key_boo_value_str=formatters["%w[%l]=%Q,"]
+local f_key_num_value_boo=JITSUPPORTED and formatters["%w[%s]=%l,"] or formatters["%w[%q]=%l,"]
+local f_key_str_value_boo=formatters["%w[%Q]=%l,"]
local f_key_boo_value_boo=formatters["%w[%l]=%l,"]
-local f_key_num_value_not=formatters["%w[%s]={},"]
-local f_key_str_value_not=formatters["%w[%q]={},"]
+local f_key_num_value_not=JITSUPPORTED and formatters["%w[%s]={},"] or formatters["%w[%q]={},"]
+local f_key_str_value_not=formatters["%w[%Q]={},"]
local f_key_boo_value_not=formatters["%w[%l]={},"]
-local f_key_num_value_seq=formatters["%w[%s]={ %, t },"]
-local f_key_str_value_seq=formatters["%w[%q]={ %, t },"]
+local f_key_num_value_seq=JITSUPPORTED and formatters["%w[%s]={ %, t },"] or formatters["%w[%q]={ %, t },"]
+local f_key_str_value_seq=formatters["%w[%Q]={ %, t },"]
local f_key_boo_value_seq=formatters["%w[%l]={ %, t },"]
-local f_val_num=formatters["%w%s,"]
-local f_val_str=formatters["%w%q,"]
+local f_val_num=JITSUPPORTED and formatters["%w%s,"] or formatters["%w%q,"]
+local f_val_str=formatters["%w%Q,"]
local f_val_boo=formatters["%w%l,"]
local f_val_not=formatters["%w{},"]
local f_val_seq=formatters["%w{ %, t },"]
@@ -7738,7 +7961,7 @@ local f_fin_seq=formatters[" %, t }"]
local f_table_return=formatters["return {"]
local f_table_name=formatters["%s={"]
local f_table_direct=formatters["{"]
-local f_table_entry=formatters["[%q]={"]
+local f_table_entry=formatters["[%Q]={"]
local f_table_finish=formatters["}"]
local spaces=utilities.strings.newrepeater(" ")
local original_serialize=table.serialize
@@ -8339,7 +8562,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sac"] = package.loaded["util-sac"] or true
--- original size: 11332, stripped down to: 8420
+-- original size: 12946, stripped down to: 9507
if not modules then modules={} end modules ['util-sac']={
version=1.001,
@@ -8374,6 +8597,7 @@ end
function streams.size(f)
return f and f[3] or 0
end
+streams.getsize=streams.size
function streams.setposition(f,i)
if f[4] then
if i<=0 then
@@ -8566,9 +8790,9 @@ function streams.readfixed2(f)
f[2]=j+1
local a,b=byte(f[1],i,j)
if a>=0x80 then
- tonumber((a-0x100).."."..b)
+ return tonumber((a-0x100).."."..b) or 0
else
- tonumber((a ).."."..b)
+ return tonumber((a ).."."..b) or 0
end
end
function streams.readfixed4(f)
@@ -8577,9 +8801,9 @@ function streams.readfixed4(f)
f[2]=j+1
local a,b,c,d=byte(f[1],i,j)
if a>=0x80 then
- tonumber((0x100*a+b-0x10000).."."..(0x100*c+d))
+ return tonumber((0x100*a+b-0x10000).."."..(0x100*c+d)) or 0
else
- tonumber((0x100*a+b ).."."..(0x100*c+d))
+ return tonumber((0x100*a+b ).."."..(0x100*c+d)) or 0
end
end
if bit32 then
@@ -8659,6 +8883,16 @@ if sio and sio.readcardinal2 then
f[2]=i+4
return readinteger4(f[1],i)
end
+ function streams.readfixed2(f)
+ local i=f[2]
+ f[2]=i+2
+ return readfixed2(f[1],i)
+ end
+ function streams.readfixed4(f)
+ local i=f[2]
+ f[2]=i+4
+ return readfixed4(f[1],i)
+ end
function streams.read2dot4(f)
local i=f[2]
f[2]=i+2
@@ -8758,6 +8992,50 @@ else
return t
end
end
+do
+ local files=utilities.files
+ if files then
+ local openfile=files.open
+ local openstream=streams.open
+ local openstring=streams.openstring
+ local setmetatable=setmetatable
+ function io.newreader(str,method)
+ local f,m
+ if method=="string" then
+ f=openstring(str)
+ m=streams
+ elseif method=="stream" then
+ f=openstream(str)
+ m=streams
+ else
+ f=openfile(str,"rb")
+ m=files
+ end
+ if f then
+ local t={}
+ setmetatable(t,{
+ __index=function(t,k)
+ local r=m[k]
+ if k=="close" then
+ if f then
+ m.close(f)
+ f=nil
+ end
+ return function() end
+ elseif r then
+ local v=function(_,a,b) return r(f,a,b) end
+ t[k]=v
+ return v
+ else
+ print("unknown key",k)
+ end
+ end
+ } )
+ return t
+ end
+ end
+ end
+end
end -- of closure
@@ -9801,7 +10079,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-copas"] = package.loaded["util-soc-imp-copas"] or true
--- original size: 25844, stripped down to: 14821
+-- original size: 25959, stripped down to: 14893
local socket=socket or require("socket")
@@ -9838,6 +10116,7 @@ local copas={
autoclose=true,
running=false,
report=report,
+ trace=false,
}
local function statushandler(status,...)
if status then
@@ -9847,7 +10126,9 @@ local function statushandler(status,...)
if type(err)=="table" then
err=err[1]
end
- report("error: %s",tostring(err))
+ if copas.trace then
+ report("error: %s",tostring(err))
+ end
return nil,err
end
function socket.protect(func)
@@ -9861,7 +10142,9 @@ function socket.newtry(finalizer)
if not status then
local detail=select(2,...)
pcall(finalizer,detail)
- report("error: %s",tostring(detail))
+ if copas.trace then
+ report("error: %s",tostring(detail))
+ end
return
end
return...
@@ -12429,7 +12712,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-set"] = package.loaded["trac-set"] or true
--- original size: 13340, stripped down to: 8826
+-- original size: 13394, stripped down to: 8882
if not modules then modules={} end modules ['trac-set']={
version=1.001,
@@ -12439,8 +12722,9 @@ if not modules then modules={} end modules ['trac-set']={
license="see context related readme files"
}
local type,next,tostring,tonumber=type,next,tostring,tonumber
+local print=print
local concat,sortedhash=table.concat,table.sortedhash
-local format,find,lower,gsub,topattern=string.format,string.find,string.lower,string.gsub,string.topattern
+local formatters,find,lower,gsub,topattern=string.formatters,string.find,string.lower,string.gsub,string.topattern
local is_boolean=string.is_boolean
local settings_to_hash=utilities.parsers.settings_to_hash
local allocate=utilities.storage.allocate
@@ -12450,10 +12734,10 @@ local setters=utilities.setters or {}
utilities.setters=setters
local data={}
local trace_initialize=false
+local frozen=true
function setters.initialize(filename,name,values)
local setter=data[name]
if setter then
- frozen=true
local data=setter.data
if data then
for key,newvalue in sortedhash(values) do
@@ -12647,8 +12931,8 @@ function setters.show(t)
end
end
local enable,disable,register,list,show=setters.enable,setters.disable,setters.register,setters.list,setters.show
-function setters.report(setter,...)
- print(format("%-15s : %s\n",setter.name,format(...)))
+function setters.report(setter,fmt,...)
+ print(formatters["%-15s : %s\n"](setter.name,formatters[fmt](...)))
end
local function default(setter,name)
local d=setter.data[name]
@@ -12668,7 +12952,7 @@ function setters.new(name)
disable=function(...) disable (setter,...) end,
reset=function(...) reset (setter,...) end,
register=function(...) register(setter,...) end,
- list=function(...) list (setter,...) end,
+ list=function(...) return list (setter,...) end,
show=function(...) show (setter,...) end,
default=function(...) return default (setter,...) end,
value=function(...) return value (setter,...) end,
@@ -12771,7 +13055,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 32618, stripped down to: 20935
+-- original size: 33003, stripped down to: 21667
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -12816,14 +13100,30 @@ local function ignore() end
setmetatableindex(logs,function(t,k) t[k]=ignore;return ignore end)
local report,subreport,status,settarget,setformats,settranslations
local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
+local function ansisupported(specification)
+ if specification~="ansi" and specification~="ansilog" then
+ return false
+ elseif os and os.enableansi then
+ return os.enableansi()
+ else
+ return false
+ end
+end
if runningtex and texio then
if texio.setescape then
texio.setescape(0)
end
- if arg then
+ if arg and ansisupported then
for k,v in next,arg do
if v=="--ansi" or v=="--c:ansi" then
- variant="ansi"
+ if ansisupported("ansi") then
+ variant="ansi"
+ end
+ break
+ elseif v=="--ansilog" or v=="--c:ansilog" then
+ if ansisupported("ansilog") then
+ variant="ansilog"
+ end
break
end
end
@@ -12928,6 +13228,10 @@ if runningtex and texio then
},
}
}
+ variants.ansilog={
+ formats=variants.ansi.formats,
+ targets=variants.default.targets,
+ }
logs.flush=io.flush
writer=function(...)
write_nl(target,...)
@@ -13034,6 +13338,9 @@ if runningtex and texio then
t=specification.targets
f=specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification="default"
+ end
local v=variants[specification]
if v then
t=v.targets
@@ -13060,7 +13367,7 @@ if runningtex and texio then
subdirect_nop=f.subdirect_nop
status_yes=f.status_yes
status_nop=f.status_nop
- if variant=="ansi" then
+ if variant=="ansi" or variant=="ansilog" then
useluawrites()
end
settarget(whereto)
@@ -13153,6 +13460,9 @@ else
if type(specification)=="table" then
f=specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification="default"
+ end
local v=variants[specification]
if v then
f=v.formats
@@ -13408,12 +13718,6 @@ end
local nesting=0
local verbose=false
local hasscheme=url.hasscheme
-function logs.show_open(name)
-end
-function logs.show_close(name)
-end
-function logs.show_load(name)
-end
local simple=logs.reporter("comment")
logs.simple=simple
logs.simpleline=simple
@@ -13480,6 +13784,13 @@ local exporters={
logs.reporters=reporters
logs.exporters=exporters
function logs.application(t)
+ local arguments=environment and environment.arguments
+ if arguments then
+ local ansi=arguments.ansi or arguments.ansilog
+ if ansi then
+ logs.setformatters(arguments.ansi and "ansi" or "ansilog")
+ end
+ end
t.name=t.name or "unknown"
t.banner=t.banner
t.moreinfo=moreinfo
@@ -13553,8 +13864,6 @@ else
print(format(...))
end
end
-io.stdout:setvbuf('no')
-io.stderr:setvbuf('no')
if package.helpers.report then
package.helpers.report=logs.reporter("package loader")
end
@@ -13652,7 +13961,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-inf"] = package.loaded["trac-inf"] or true
--- original size: 8966, stripped down to: 5972
+-- original size: 9973, stripped down to: 7492
if not modules then modules={} end modules ['trac-inf']={
version=1.001,
@@ -13674,7 +13983,7 @@ statistics.enable=true
statistics.threshold=0.01
local statusinfo,n,registered,timers={},0,{},{}
setmetatableindex(timers,function(t,k)
- local v={ timing=0,loadtime=0 }
+ local v={ timing=0,loadtime=0,offset=0 }
t[k]=v
return v
end)
@@ -13682,10 +13991,40 @@ local function hastiming(instance)
return instance and timers[instance]
end
local function resettiming(instance)
- timers[instance or "notimer"]={ timing=0,loadtime=0 }
+ timers[instance or "notimer"]={ timing=0,loadtime=0,offset=0 }
end
local ticks=clock
local seconds=function(n) return n or 0 end
+if lua.getpreciseticks then
+ ticks=lua.getpreciseticks
+ seconds=lua.getpreciseseconds
+elseif FFISUPPORTED and ffi and os.type=="windows" then
+ local okay,kernel=pcall(ffi.load,"kernel32")
+ if kernel then
+ local tonumber=ffi.number or tonumber
+ ffi.cdef[[
+ int QueryPerformanceFrequency(int64_t *lpFrequency);
+ int QueryPerformanceCounter(int64_t *lpPerformanceCount);
+ ]]
+ local target=ffi.new("__int64[1]")
+ ticks=function()
+ if kernel.QueryPerformanceCounter(target)==1 then
+ return tonumber(target[0])
+ else
+ return 0
+ end
+ end
+ local target=ffi.new("__int64[1]")
+ seconds=function(ticks)
+ if kernel.QueryPerformanceFrequency(target)==1 then
+ return ticks/tonumber(target[0])
+ else
+ return 0
+ end
+ end
+ end
+else
+end
local function starttiming(instance,reset)
local timer=timers[instance or "notimer"]
local it=timer.timing
@@ -13720,12 +14059,26 @@ local function stoptiming(instance)
end
return 0
end
+local function benchmarktimer(instance)
+ local timer=timers[instance or "notimer"]
+ local it=timer.timing
+ if it>1 then
+ timer.timing=it-1
+ else
+ local starttime=timer.starttime
+ if starttime and starttime>0 then
+ timer.offset=ticks()-starttime
+ else
+ timer.offset=0
+ end
+ end
+end
local function elapsed(instance)
if type(instance)=="number" then
return instance
else
local timer=timers[instance or "notimer"]
- return timer and seconds(timer.loadtime) or 0
+ return timer and seconds(timer.loadtime-2*(timer.offset or 0)) or 0
end
end
local function currenttime(instance)
@@ -13738,7 +14091,7 @@ local function currenttime(instance)
else
local starttime=timer.starttime
if starttime and starttime>0 then
- return seconds(timer.loadtime+ticks()-starttime)
+ return seconds(timer.loadtime+ticks()-starttime-2*(timer.offset or 0))
end
end
return 0
@@ -13764,6 +14117,7 @@ statistics.elapsed=elapsed
statistics.elapsedtime=elapsedtime
statistics.elapsedindeed=elapsedindeed
statistics.elapsedseconds=elapsedseconds
+statistics.benchmarktimer=benchmarktimer
function statistics.register(tag,fnc)
if statistics.enable and type(fnc)=="function" then
local rt=registered[tag] or (#statusinfo+1)
@@ -13780,10 +14134,17 @@ function statistics.show()
return format("%s, type: %s, binary subtree: %s",
os.platform or "unknown",os.type or "unknown",environment.texos or "unknown")
end)
- register("used engine",function()
- return format("%s version %s with functionality level %s, banner: %s",
- LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner))
- end)
+ if LUATEXENGINE=="luametatex" then
+ register("used engine",function()
+ return format("%s version %s, functionality level %s, format id %s",
+ LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,LUATEXFORMATID)
+ end)
+ else
+ register("used engine",function()
+ return format("%s version %s with functionality level %s, banner: %s",
+ LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner))
+ end)
+ end
register("control sequences",function()
return format("%s of %s + %s",status.cs_count,status.hash_size,status.hash_extra)
end)
@@ -13822,7 +14183,11 @@ function statistics.show()
end
function statistics.memused()
local round=math.round or math.floor
- return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000),round(status.luastate_bytes/1000000))
+ return format("%s MB, ctx: %s MB, max: %s MB)",
+ round(collectgarbage("count")/1000),
+ round(status.luastate_bytes/1000000),
+ status.luastate_bytes_max and round(status.luastate_bytes_max/1000000) or "unknown"
+ )
end
starttiming(statistics)
function statistics.formatruntime(runtime)
@@ -14013,7 +14378,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-lua"] = package.loaded["util-lua"] or true
--- original size: 6664, stripped down to: 4589
+-- original size: 7149, stripped down to: 4997
if not modules then modules={} end modules ['util-lua']={
version=1.001,
@@ -14038,16 +14403,21 @@ luautilities.nofstrippedchunks=0
luautilities.nofstrippedbytes=0
local strippedchunks={}
luautilities.strippedchunks=strippedchunks
+if not LUATEXENGINE then
+ LUATEXENGINE=status.luatex_engine and string.lower(status.luatex_engine)
+ JITSUPPORTED=LUATEXENGINE=="luajittex" or jit
+ CONTEXTLMTXMODE=CONTEXTLMTXMODE or (LUATEXENGINE=="luametatex" and 1) or 0
+end
luautilities.suffixes={
tma="tma",
- tmc=jit and "tmb" or "tmc",
+ tmc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tmd") or (jit and "tmb") or "tmc",
lua="lua",
- luc=jit and "lub" or "luc",
+ luc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "lud") or (jit and "lub") or "luc",
lui="lui",
luv="luv",
luj="luj",
tua="tua",
- tuc="tuc",
+ tuc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tud") or (jit and "tub") or "tuc",
}
local function register(name)
if tracestripping then
@@ -14186,7 +14556,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-deb"] = package.loaded["util-deb"] or true
--- original size: 9955, stripped down to: 6693
+-- original size: 10136, stripped down to: 6832
if not modules then modules={} end modules ['util-deb']={
version=1.001,
@@ -14210,7 +14580,13 @@ local dummycalls=10*1000
local nesting=0
local names={}
local initialize=false
-if not (FFISUPPORTED and ffi) then
+if lua.getpreciseticks then
+ initialize=function()
+ ticks=lua.getpreciseticks
+ seconds=lua.getpreciseseconds
+ initialize=false
+ end
+elseif not (FFISUPPORTED and ffi) then
elseif os.type=="windows" then
initialize=function()
local kernel=ffilib("kernel32","system")
@@ -14482,7 +14858,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tpl"] = package.loaded["util-tpl"] or true
--- original size: 7112, stripped down to: 3887
+-- original size: 7722, stripped down to: 4212
if not modules then modules={} end modules ['util-tpl']={
version=1.001,
@@ -14498,6 +14874,7 @@ local report_template=logs.reporter("template")
local tostring,next=tostring,next
local format,sub,byte=string.format,string.sub,string.byte
local P,C,R,Cs,Cc,Carg,lpegmatch,lpegpatterns=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.match,lpeg.patterns
+local formatters=string.formatters
local replacer
local function replacekey(k,t,how,recursive)
local v=t[k]
@@ -14566,6 +14943,10 @@ local function replaceoptional(l,m,r,t,how,recurse)
local v=t[l]
return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
+local function replaceformatted(l,m,r,t,how,recurse)
+ local v=t[r]
+ return v and formatters[l](v)
+end
local single=P("%")
local double=P("%%")
local lquoted=P("%[")
@@ -14579,16 +14960,19 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
+local nolformatted=P(":")/"%%"
+local norformatted=P(":")/""
local noloptional=P("%?")/''
local noroptional=P("?%")/''
local nomoptional=P(":")/''
local args=Carg(1)*Carg(2)*Carg(3)
-local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local key=nosingle*((C((1-nosingle)^1)*args)/replacekey)*nosingle
+local quoted=nolquotedq*((C((1-norquotedq)^1)*args)/replacekeyquoted)*norquotedq
+local unquoted=nolquoted*((C((1-norquoted)^1)*args)/replacekeyunquoted)*norquoted
local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
+local formatted=nosingle*((Cs(nolformatted*(1-norformatted )^1)*norformatted*C((1-nosingle)^1)*args)/replaceformatted)*nosingle
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
+ replacer=Cs((unquoted+quoted+formatted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
@@ -14627,7 +15011,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sbx"] = package.loaded["util-sbx"] or true
--- original size: 20393, stripped down to: 13121
+-- original size: 21084, stripped down to: 13214
if not modules then modules={} end modules ['util-sbx']={
version=1.001,
@@ -14873,37 +15257,50 @@ local iopopen=sandbox.original(io.popen)
local reported={}
local function validcommand(name,program,template,checkers,defaults,variables,reporter,strict)
if validbinaries~=false and (validbinaries==true or validbinaries[program]) then
+ local binpath=nil
if variables then
for variable,value in next,variables do
- local checker=validators[checkers[variable]]
- if checker then
- value=checker(unquoted(value),strict)
- if value then
- variables[variable]=optionalquoted(value)
+ local chktype=checkers[variable]
+ if chktype=="verbose" then
+ else
+ local checker=validators[chktype]
+ if checker then
+ value=checker(unquoted(value),strict)
+ if value then
+ variables[variable]=optionalquoted(value)
+ else
+ report("variable %a with value %a fails the check",variable,value)
+ return
+ end
else
- report("variable %a with value %a fails the check",variable,value)
+ report("variable %a has no checker",variable)
return
end
- else
- report("variable %a has no checker",variable)
- return
end
end
for variable,default in next,defaults do
local value=variables[variable]
if not value or value=="" then
- local checker=validators[checkers[variable]]
- if checker then
- default=checker(unquoted(default),strict)
- if default then
- variables[variable]=optionalquoted(default)
- else
- report("variable %a with default %a fails the check",variable,default)
- return
+ local chktype=checkers[variable]
+ if chktype=="verbose" then
+ else
+ local checker=validators[chktype]
+ if checker then
+ default=checker(unquoted(default),strict)
+ if default then
+ variables[variable]=optionalquoted(default)
+ else
+ report("variable %a with default %a fails the check",variable,default)
+ return
+ end
end
end
end
end
+ binpath=variables.binarypath
+ end
+ if type(binpath)=="string" and binpath~="" then
+ program=binpath.."/"..program
end
local command=program.." "..replace(template,variables)
if reporter then
@@ -14938,7 +15335,8 @@ local runners={
if trace then
report("execute: %s",command)
end
- return osexecute(command)
+ local okay=osexecute(command)
+ return okay
end
end,
pipeto=function(...)
@@ -14972,7 +15370,7 @@ function sandbox.registerrunner(specification)
return
end
if validrunners[name] then
- report("invalid name, runner %a already defined")
+ report("invalid name, runner %a already defined",name)
return
end
local program=specification.program
@@ -15090,8 +15488,8 @@ if io then
end
if os then
overload(os.execute,binaryrunner,"os.execute")
- overload(os.spawn,dummyrunner,"os.spawn")
- overload(os.exec,dummyrunner,"os.exec")
+ overload(os.spawn,dummyrunner,"os.spawn")
+ overload(os.exec,dummyrunner,"os.exec")
overload(os.resultof,binaryrunner,"os.resultof")
overload(os.pipeto,binaryrunner,"os.pipeto")
overload(os.rename,filehandlertwo,"os.rename")
@@ -15116,13 +15514,6 @@ end
if zip then
zip.open=register(zip.open,filehandlerone,"zip.open")
end
-if fontloader then
- fontloader.open=register(fontloader.open,filehandlerone,"fontloader.open")
- fontloader.info=register(fontloader.info,filehandlerone,"fontloader.info")
-end
-if epdf then
- epdf.open=register(epdf.open,filehandlerone,"epdf.open")
-end
sandbox.registerroot=registerroot
sandbox.registerbinary=registerbinary
sandbox.registerlibrary=registerlibrary
@@ -15528,7 +15919,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-env"] = package.loaded["luat-env"] or true
--- original size: 6134, stripped down to: 4118
+-- original size: 6551, stripped down to: 4315
if not modules then modules={} end modules ['luat-env']={
version=1.001,
@@ -15537,7 +15928,7 @@ package.loaded["luat-env"] = package.loaded["luat-env"] or true
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local rawset,rawget,loadfile=rawset,rawget,loadfile
+local rawset,loadfile=rawset,loadfile
local gsub=string.gsub
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_lua=logs.reporter("resolvers","lua")
@@ -15584,6 +15975,12 @@ function environment.texfile(filename)
return resolvers.findfile(filename,'tex')
end
function environment.luafile(filename)
+ if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and file.suffix(filename)=="lua" then
+ local resolved=resolvers.findfile(file.replacesuffix(filename,"lmt")) or ""
+ if resolved~="" then
+ return resolved
+ end
+ end
local resolved=resolvers.findfile(filename,'tex') or ""
if resolved~="" then
return resolved
@@ -15695,7 +16092,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-zip"] = package.loaded["util-zip"] or true
--- original size: 18645, stripped down to: 11291
+-- original size: 19496, stripped down to: 10858
if not modules then modules={} end modules ['util-zip']={
version=1.001,
@@ -15706,7 +16103,7 @@ if not modules then modules={} end modules ['util-zip']={
local type,tostring,tonumber=type,tostring,tonumber
local sort=table.sort
local find,format,sub,gsub=string.find,string.format,string.sub,string.gsub
-local osdate,ostime=os.date,os.time
+local osdate,ostime,osclock=os.date,os.time,os.clock
local ioopen=io.open
local loaddata,savedata=io.loaddata,io.savedata
local filejoin,isdir,dirname,mkdirs=file.join,lfs.isdir,file.dirname,dir.mkdirs
@@ -15721,25 +16118,19 @@ local getposition=files.getposition
local band=bit32.band
local rshift=bit32.rshift
local lshift=bit32.lshift
-local decompress,calculatecrc
-if flate then
- decompress=flate.flate_decompress
- calculatecrc=flate.update_crc32
-else
+local decompress,expandsize,calculatecrc
local zlibdecompress=zlib.decompress
+ local zlibexpandsize=zlib.expandsize
local zlibchecksum=zlib.crc32
- decompress=function(source,targetsize)
- local target=zlibdecompress(source,-15)
- if target then
- return target
- else
- return false,1
- end
+ decompress=function(source)
+ return zlibdecompress(source,-15)
end
+ expandsize=zlibexpandsize and function(source,targetsize)
+ return zlibexpandsize(source,targetsize,-15)
+ end or decompress
calculatecrc=function(buffer,initial)
return zlibchecksum(initial or 0,buffer)
end
-end
local zipfiles={}
utilities.zipfiles=zipfiles
local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
@@ -15864,7 +16255,11 @@ local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
setposition(handle,position)
local result=readstring(handle,compressed)
if data.method==8 then
- result=decompress(result,data.uncompressed)
+ if expandsize then
+ result=expandsize(result,data.uncompressed)
+ else
+ result=decompress(result)
+ end
end
if check and data.crc32~=calculatecrc(result) then
print("checksum mismatch")
@@ -15883,14 +16278,14 @@ local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
zipfiles.list=getziplist
zipfiles.found=foundzipfile
end
-if flate then do
+if xzip then
local writecardinal1=files.writebyte
local writecardinal2=files.writecardinal2le
local writecardinal4=files.writecardinal4le
local logwriter=logs.writer
local globpattern=dir.globpattern
- local compress=flate.flate_compress
- local checksum=flate.update_crc32
+ local compress=xzip.compress
+ local checksum=xzip.crc32
local function fromdostime(dostime,dosdate)
return ostime {
year=rshift(dosdate,9)+1980,
@@ -16087,27 +16482,33 @@ if flate then do
local count=#list
local step=number.idiv(count,10)
local done=0
+ local steps=verbose=="steps"
+ local time=steps and osclock()
for i=1,count do
local l=list[i]
local n=l.filename
local d=unzipfile(z,n)
- local p=filejoin(path,n)
- if mkdirs(dirname(p)) then
- if verbose=="steps" then
- total=total+#d
- done=done+1
- if done>=step then
- done=0
- logwriter(format("%4i files of %4i done, %10i bytes",i,count,total))
+ if d then
+ local p=filejoin(path,n)
+ if mkdirs(dirname(p)) then
+ if steps then
+ total=total+#d
+ done=done+1
+ if done>=step then
+ done=0
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",i,count,total,osclock()-time))
+ end
+ elseif verbose then
+ logwriter(n)
end
- elseif verbose then
- logwriter(n)
+ savedata(p,d)
end
- savedata(p,d)
+ else
+ logwriter(format("problem with file %s",n))
end
end
- if verbose=="steps" then
- logwriter(format("%4i files of %4i done, %10i bytes",count,count,total))
+ if steps then
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",count,count,total,osclock()-time))
end
closezipfile(z)
return true
@@ -16118,37 +16519,8 @@ if flate then do
end
zipfiles.zipdir=zipdir
zipfiles.unzipdir=unzipdir
-end end
-if flate then
- local streams=utilities.streams
- local openfile=streams.open
- local closestream=streams.close
- local setposition=streams.setposition
- local getsize=streams.size
- local readcardinal4=streams.readcardinal4le
- local getstring=streams.getstring
- local decompress=flate.gz_decompress
- function zipfiles.gunzipfile(filename)
- local strm=openfile(filename)
- if strm then
- setposition(strm,getsize(strm)-4+1)
- local size=readcardinal4(strm)
- local data=decompress(getstring(strm),size)
- closestream(strm)
- return data
- end
- end
-elseif gzip then
- local openfile=gzip.open
- function zipfiles.gunzipfile(filename)
- local g=openfile(filename,"rb")
- if g then
- local d=g:read("*a")
- d:close()
- return d
- end
- end
end
+zipfiles.gunzipfile=gzip.load
end -- of closure
@@ -16157,7 +16529,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
--- original size: 60383, stripped down to: 35698
+-- original size: 61191, stripped down to: 35864
if not modules then modules={} end modules ['lxml-tab']={
version=1.001,
@@ -16881,7 +17253,10 @@ local slash=P('/')
local colon=P(':')
local semicolon=P(';')
local ampersand=P('&')
-local valid=R('az','AZ','09')+S('_-.')
+local valid_0=R("\128\255")
+local valid_1=R('az','AZ')+S('_')+valid_0
+local valid_2=valid_1+R('09')+S('-.')
+local valid=valid_1*valid_2^0
local name_yes=C(valid^1)*colon*C(valid^1)
local name_nop=C(P(true))*C(valid^1)
local name=name_yes+name_nop
@@ -16917,8 +17292,9 @@ end
local function entityfile(pattern,k,v,n)
if n then
local okay,data
- if resolvers then
- okay,data=resolvers.loadbinfile(n)
+ local loadbinfile=resolvers and resolvers.loadbinfile
+ if loadbinfile then
+ okay,data=loadbinfile(n)
else
data=io.loaddata(n)
okay=data and data~=""
@@ -17027,12 +17403,14 @@ publicentityfile+publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*op
}
return grammar_parsed_text_one,grammar_parsed_text_two,grammar_unparsed_text
end
-grammar_parsed_text_one_nop,
-grammar_parsed_text_two_nop,
-grammar_unparsed_text_nop=install(space,spacing,anything)
-grammar_parsed_text_one_yes,
-grammar_parsed_text_two_yes,
-grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl)
+local
+ grammar_parsed_text_one_nop,
+ grammar_parsed_text_two_nop,
+ grammar_unparsed_text_nop=install(space,spacing,anything)
+local
+ grammar_parsed_text_one_yes,
+ grammar_parsed_text_two_yes,
+ grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl)
local function _xmlconvert_(data,settings,detail)
settings=settings or {}
preparexmlstate(settings)
@@ -17613,7 +17991,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["lxml-lpt"] = package.loaded["lxml-lpt"] or true
--- original size: 55145, stripped down to: 30992
+-- original size: 54626, stripped down to: 31255
if not modules then modules={} end modules ['lxml-lpt']={
version=1.001,
@@ -18095,6 +18473,8 @@ local builtin={
lastindex="(#ll.__p__.dt or 1)",
lastelement="(ll.__p__.en or 1)",
last="#list",
+ list="list",
+ self="ll",
rootposition="order",
order="order",
element="(ll.ei or 1)",
@@ -18203,7 +18583,8 @@ local function register_selector(specification)
end
local function register_expression(expression)
local converted=lpegmatch(converter,expression)
- local runner=load(format(template_e,converted))
+ local wrapped=format(template_e,converted)
+ local runner=load(wrapped)
runner=(runner and runner()) or function() errorrunner_e(expression,converted) end
return { kind="expression",expression=expression,converted=converted,evaluator=runner }
end
@@ -18575,6 +18956,20 @@ expressions.count=function(e,pattern)
local collected=applylpath(e,pattern)
return pattern and (collected and #collected) or 0
end
+expressions.attribute=function(e,name,value)
+ if type(e)=="table" and name then
+ local a=e.at
+ if a then
+ local v=a[name]
+ if value then
+ return v==value
+ else
+ return v
+ end
+ end
+ end
+ return nil
+end
expressions.oneof=function(s,...)
for i=1,select("#",...) do
if s==select(i,...) then
@@ -18621,7 +19016,7 @@ function expressions.contains(str,pattern)
end
return false
end
-function xml.expressions.idstring(str)
+function expressions.idstring(str)
return type(str)=="string" and gsub(str,"^#","") or ""
end
local function traverse(root,pattern,handle)
@@ -20394,7 +20789,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-ini"] = package.loaded["data-ini"] or true
--- original size: 11099, stripped down to: 7152
+-- original size: 11019, stripped down to: 7086
if not modules then modules={} end modules ['data-ini']={
version=1.001,
@@ -20407,9 +20802,9 @@ local next,type,getmetatable,rawset=next,type,getmetatable,rawset
local gsub,find,gmatch,char=string.gsub,string.find,string.gmatch,string.char
local filedirname,filebasename,filejoin=file.dirname,file.basename,file.join
local ostype,osname,osuname,ossetenv,osgetenv=os.type,os.name,os.uname,os.setenv,os.getenv
+local sortedpairs=table.sortedpairs
local P,S,R,C,Cs,Cc,lpegmatch=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
-local trace_detail=false trackers.register("resolvers.details",function(v) trace_detail=v end)
local trace_expansions=false trackers.register("resolvers.expansions",function(v) trace_expansions=v end)
local report_initialization=logs.reporter("resolvers","initialization")
resolvers=resolvers or {}
@@ -20618,7 +21013,7 @@ if ostype=="unix" then
rawset(t,k,v)
end
local colon=P(":")
- for k,v in table.sortedpairs(prefixes) do
+ for k,v in sortedpairs(prefixes) do
if p then
p=P(k)+p
else
@@ -20645,7 +21040,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 18154, stripped down to: 10416
+-- original size: 18179, stripped down to: 10432
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -20929,7 +21324,7 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
scancache[sub(full,1,-2)]=files
return files,remap,n,m,r
end
-function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+local function scanfiles(path,branch,usecache,onlyonce,tolerant)
local realpath=resolveprefix(path)
if usecache then
local content=fullcache[realpath]
@@ -20984,8 +21379,9 @@ function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
statistics.stoptiming(timer)
return content
end
+resolvers.scanfiles=scanfiles
function resolvers.simplescanfiles(path,branch,usecache)
- return resolvers.scanfiles(path,branch,usecache,true,true)
+ return scanfiles(path,branch,usecache,true,true)
end
function resolvers.scandata()
table.sort(scanned)
@@ -21052,7 +21448,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-env"] = package.loaded["data-env"] or true
--- original size: 9360, stripped down to: 6312
+-- original size: 9400, stripped down to: 6347
if not modules then modules={} end modules ['data-env']={
version=1.001,
@@ -21062,7 +21458,7 @@ if not modules then modules={} end modules ['data-env']={
license="see context related readme files",
}
local lower,gsub=string.lower,string.gsub
-local next=next
+local next,rawget=next,rawget
local resolvers=resolvers
local allocate=utilities.storage.allocate
local setmetatableindex=table.setmetatableindex
@@ -21143,13 +21539,13 @@ local relations=allocate {
mp={
names={ "mp" },
variable='MPINPUTS',
- suffixes={ 'mp','mpvi','mpiv','mpii' },
+ suffixes={ 'mp','mpvi','mpiv','mpxl','mpii' },
usertype=true,
},
tex={
names={ "tex" },
variable='TEXINPUTS',
- suffixes={ "tex","mkvi","mkiv","mkii","cld","lfg","xml" },
+ suffixes={ "tex","mkiv","mkvi","mkxl","mklx","mkii","cld","lfg","xml" },
usertype=true,
},
icc={
@@ -21337,7 +21733,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 16284, stripped down to: 10938
+-- original size: 16099, stripped down to: 11379
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -21346,48 +21742,83 @@ if not modules then modules={} end modules ['data-tmp']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local format,lower,gsub,concat=string.format,string.lower,string.gsub,table.concat
-local concat=table.concat
-local mkdirs,isdir,isfile=dir.mkdirs,lfs.isdir,lfs.isfile
-local addsuffix,is_writable,is_readable=file.addsuffix,file.is_writable,file.is_readable
-local formatters=string.formatters
local next,type=next,type
+local pcall,loadfile,collectgarbage=pcall,loadfile,collectgarbage
+local format,lower,gsub=string.format,string.lower,string.gsub
+local concat,serialize,fastserialize,serializetofile=table.concat,table.serialize,table.fastserialize,table.tofile
+local mkdirs,expanddirname,isdir,isfile=dir.mkdirs,dir.expandname,lfs.isdir,lfs.isfile
+local is_writable,is_readable=file.is_writable,file.is_readable
+local collapsepath,joinfile,addsuffix,dirname=file.collapsepath,file.join,file.addsuffix,file.dirname
+local savedata=file.savedata
+local formatters=string.formatters
+local osexit,osdate,osuuid=os.exit,os.date,os.uuid
+local removefile=os.remove
+local md5hex=md5.hex
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local report_caches=logs.reporter("resolvers","caches")
local report_resolvers=logs.reporter("resolvers","caching")
local resolvers=resolvers
local cleanpath=resolvers.cleanpath
-local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
-local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
-local compile=utilities.lua.compile
-function utilities.lua.compile(luafile,lucfile,cleanup,strip)
- if cleanup==nil then cleanup=directive_cleanup end
- if strip==nil then strip=directive_strip end
- return compile(luafile,lucfile,cleanup,strip)
+local resolvepath=resolvers.resolve
+local luautilities=utilities.lua
+do
+ local directive_cleanup=false directives.register("system.compile.cleanup",function(v) directive_cleanup=v end)
+ local directive_strip=false directives.register("system.compile.strip",function(v) directive_strip=v end)
+ local compilelua=luautilities.compile
+ function luautilities.compile(luafile,lucfile,cleanup,strip)
+ if cleanup==nil then cleanup=directive_cleanup end
+ if strip==nil then strip=directive_strip end
+ return compilelua(luafile,lucfile,cleanup,strip)
+ end
end
caches=caches or {}
local caches=caches
-local luasuffixes=utilities.lua.suffixes
-caches.base=caches.base or "luatex-cache"
-caches.more=caches.more or "context"
-caches.direct=false
-caches.tree=false
-caches.force=true
-caches.ask=false
-caches.relocate=false
+local writable=nil
+local readables={}
+local usedreadables={}
+local compilelua=luautilities.compile
+local luasuffixes=luautilities.suffixes
+caches.base=caches.base or "luatex-cache"
+caches.more=caches.more or "context"
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
-directives.register("system.caches.fast",function(v) caches.fast=true end)
-local writable,readables,usedreadables=nil,{},{}
+local direct_cache=false
+local fast_cache=false
+local cache_tree=false
+directives.register("system.caches.direct",function(v) direct_cache=true end)
+directives.register("system.caches.fast",function(v) fast_cache=true end)
+local function configfiles()
+ return concat(resolvers.configurationfiles(),";")
+end
+local function hashed(tree)
+ tree=gsub(tree,"[\\/]+$","")
+ tree=lower(tree)
+ local hash=md5hex(tree)
+ if trace_cache or trace_locating then
+ report_caches("hashing tree %a, hash %a",tree,hash)
+ end
+ return hash
+end
+local function treehash()
+ local tree=configfiles()
+ if not tree or tree=="" then
+ return false
+ else
+ return hashed(tree)
+ end
+end
+caches.hashed=hashed
+caches.treehash=treehash
+caches.configfiles=configfiles
local function identify()
local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
if texmfcaches then
for k=1,#texmfcaches do
local cachepath=texmfcaches[k]
if cachepath~="" then
- cachepath=resolvers.resolve(cachepath)
- cachepath=resolvers.cleanpath(cachepath)
- cachepath=file.collapsepath(cachepath)
+ cachepath=resolvepath(cachepath)
+ cachepath=cleanpath(cachepath)
+ cachepath=collapsepath(cachepath)
local valid=isdir(cachepath)
if valid then
if is_readable(cachepath) then
@@ -21396,16 +21827,14 @@ local function identify()
writable=cachepath
end
end
- elseif not writable and caches.force then
- local cacheparent=file.dirname(cachepath)
- if is_writable(cacheparent) and true then
- if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath),"no",{ "yes","no" })=="yes" then
- mkdirs(cachepath)
- if isdir(cachepath) and is_writable(cachepath) then
- report_caches("path %a created",cachepath)
- writable=cachepath
- readables[#readables+1]=cachepath
- end
+ elseif not writable then
+ local cacheparent=dirname(cachepath)
+ if is_writable(cacheparent) then
+ mkdirs(cachepath)
+ if isdir(cachepath) and is_writable(cachepath) then
+ report_caches("path %a created",cachepath)
+ writable=cachepath
+ readables[#readables+1]=cachepath
end
end
end
@@ -21418,8 +21847,8 @@ local function identify()
local cachepath=texmfcaches[k]
cachepath=resolvers.expansion(cachepath)
if cachepath~="" then
- cachepath=resolvers.resolve(cachepath)
- cachepath=resolvers.cleanpath(cachepath)
+ cachepath=resolvepath(cachepath)
+ cachepath=cleanpath(cachepath)
local valid=isdir(cachepath)
if valid and is_readable(cachepath) then
if not writable and is_writable(cachepath) then
@@ -21433,23 +21862,25 @@ local function identify()
end
if not writable then
report_caches("fatal error: there is no valid writable cache path defined")
- os.exit()
+ osexit()
elseif #readables==0 then
report_caches("fatal error: there is no valid readable cache path defined")
- os.exit()
+ osexit()
end
- writable=dir.expandname(resolvers.cleanpath(writable))
- local base,more,tree=caches.base,caches.more,caches.tree or caches.treehash()
+ writable=expanddirname(cleanpath(writable))
+ local base=caches.base
+ local more=caches.more
+ local tree=cache_tree or treehash()
if tree then
- caches.tree=tree
+ cache_tree=tree
writable=mkdirs(writable,base,more,tree)
for i=1,#readables do
- readables[i]=file.join(readables[i],base,more,tree)
+ readables[i]=joinfile(readables[i],base,more,tree)
end
else
writable=mkdirs(writable,base,more)
for i=1,#readables do
- readables[i]=file.join(readables[i],base,more)
+ readables[i]=joinfile(readables[i],base,more)
end
end
if trace_cache then
@@ -21486,27 +21917,8 @@ function caches.usedpaths(separator)
return writable or "?"
end
end
-function caches.configfiles()
- return concat(resolvers.configurationfiles(),";")
-end
-function caches.hashed(tree)
- tree=gsub(tree,"[\\/]+$","")
- tree=lower(tree)
- local hash=md5.hex(tree)
- if trace_cache or trace_locating then
- report_caches("hashing tree %a, hash %a",tree,hash)
- end
- return hash
-end
-function caches.treehash()
- local tree=caches.configfiles()
- if not tree or tree=="" then
- return false
- else
- return caches.hashed(tree)
- end
-end
-local r_cache,w_cache={},{}
+local r_cache={}
+local w_cache={}
local function getreadablepaths(...)
local tags={... }
local hash=concat(tags,"/")
@@ -21516,7 +21928,7 @@ local function getreadablepaths(...)
if #tags>0 then
done={}
for i=1,#readables do
- done[i]=file.join(readables[i],...)
+ done[i]=joinfile(readables[i],...)
end
else
done=readables
@@ -21540,17 +21952,25 @@ local function getwritablepath(...)
end
return done
end
-caches.getreadablepaths=getreadablepaths
-caches.getwritablepath=getwritablepath
-function caches.getfirstreadablefile(filename,...)
- local fullname,path=caches.setfirstwritablefile(filename,...)
+local function setfirstwritablefile(filename,...)
+ local wr=getwritablepath(...)
+ local fullname=joinfile(wr,filename)
+ return fullname,wr
+end
+local function setluanames(path,name)
+ return
+ format("%s/%s.%s",path,name,luasuffixes.tma),
+ format("%s/%s.%s",path,name,luasuffixes.tmc)
+end
+local function getfirstreadablefile(filename,...)
+ local fullname,path=setfirstwritablefile(filename,...)
if is_readable(fullname) then
return fullname,path
end
local rd=getreadablepaths(...)
for i=1,#rd do
local path=rd[i]
- local fullname=file.join(path,filename)
+ local fullname=joinfile(path,filename)
if is_readable(fullname) then
usedreadables[i]=true
return fullname,path
@@ -21558,19 +21978,11 @@ function caches.getfirstreadablefile(filename,...)
end
return fullname,path
end
-function caches.setfirstwritablefile(filename,...)
- local wr=getwritablepath(...)
- local fullname=file.join(wr,filename)
- return fullname,wr
-end
-function caches.define(category,subcategory)
- return function()
- return getwritablepath(category,subcategory)
- end
-end
-function caches.setluanames(path,name)
- return format("%s/%s.%s",path,name,luasuffixes.tma),format("%s/%s.%s",path,name,luasuffixes.tmc)
-end
+caches.getreadablepaths=getreadablepaths
+caches.getwritablepath=getwritablepath
+caches.setfirstwritablefile=setfirstwritablefile
+caches.getfirstreadablefile=getfirstreadablefile
+caches.setluanames=setluanames
function caches.loaddata(readables,name,writable)
if type(readables)=="string" then
readables={ readables }
@@ -21578,21 +21990,22 @@ function caches.loaddata(readables,name,writable)
for i=1,#readables do
local path=readables[i]
local loader=false
- local tmaname,tmcname=caches.setluanames(path,name)
+ local state=false
+ local tmaname,tmcname=setluanames(path,name)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
if not loader and isfile(tmaname) then
- local tmacrap,tmcname=caches.setluanames(writable,name)
+ local tmacrap,tmcname=setluanames(writable,name)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
if isfile(tmcname) then
- loader=loadfile(tmcname)
+ state,loader=pcall(loadfile,tmcname)
end
if not loader then
- loader=loadfile(tmaname)
+ state,loader=pcall(loadfile,tmaname)
end
end
if loader then
@@ -21604,21 +22017,21 @@ function caches.loaddata(readables,name,writable)
return false
end
function caches.is_writable(filepath,filename)
- local tmaname,tmcname=caches.setluanames(filepath,filename)
+ local tmaname,tmcname=setluanames(filepath,filename)
return is_writable(tmaname)
end
-local saveoptions={ compact=true }
-function caches.savedata(filepath,filename,data,raw)
- local tmaname,tmcname=caches.setluanames(filepath,filename)
- data.cache_uuid=os.uuid()
- if caches.fast then
- file.savedata(tmaname,table.fastserialize(data,true))
- elseif caches.direct then
- file.savedata(tmaname,table.serialize(data,true,saveoptions))
+local saveoptions={ compact=true,accurate=not JITSUPPORTED }
+function caches.savedata(filepath,filename,data,fast)
+ local tmaname,tmcname=setluanames(filepath,filename)
+ data.cache_uuid=osuuid()
+ if fast or fast_cache then
+ savedata(tmaname,fastserialize(data,true))
+ elseif direct_cache then
+ savedata(tmaname,serialize(data,true,saveoptions))
else
- table.tofile(tmaname,data,true,saveoptions)
+ serializetofile(tmaname,data,true,saveoptions)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
end
local content_state={}
function caches.contentstate()
@@ -21626,11 +22039,14 @@ function caches.contentstate()
end
function caches.loadcontent(cachename,dataname,filename)
if not filename then
- local name=caches.hashed(cachename)
- local full,path=caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename=file.join(path,name)
+ local name=hashed(cachename)
+ local full,path=getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=joinfile(path,name)
+ end
+ local state,blob=pcall(loadfile,addsuffix(filename,luasuffixes.luc))
+ if not blob then
+ state,blob=pcall(loadfile,addsuffix(filename,luasuffixes.lua))
end
- local blob=loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data=blob()
if data and data.content then
@@ -21663,9 +22079,9 @@ function caches.collapsecontent(content)
end
function caches.savecontent(cachename,dataname,content,filename)
if not filename then
- local name=caches.hashed(cachename)
- local full,path=caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename=file.join(path,name)
+ local name=hashed(cachename)
+ local full,path=setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename=joinfile(path,name)
end
local luaname=addsuffix(filename,luasuffixes.lua)
local lucname=addsuffix(filename,luasuffixes.luc)
@@ -21676,17 +22092,17 @@ function caches.savecontent(cachename,dataname,content,filename)
type=dataname,
root=cachename,
version=resolvers.cacheversion,
- date=os.date("%Y-%m-%d"),
- time=os.date("%H:%M:%S"),
+ date=osdate("%Y-%m-%d"),
+ time=osdate("%H:%M:%S"),
content=content,
- uuid=os.uuid(),
+ uuid=osuuid(),
}
- local ok=io.savedata(luaname,table.serialize(data,true))
+ local ok=savedata(luaname,serialize(data,true))
if ok then
if trace_locating then
report_resolvers("category %a, cachename %a saved in %a",dataname,cachename,luaname)
end
- if utilities.lua.compile(luaname,lucname) then
+ if compilelua(luaname,lucname) then
if trace_locating then
report_resolvers("%a compiled to %a",dataname,lucname)
end
@@ -21695,7 +22111,7 @@ function caches.savecontent(cachename,dataname,content,filename)
if trace_locating then
report_resolvers("compiling failed for %a, deleting file %a",dataname,lucname)
end
- os.remove(lucname)
+ removefile(lucname)
end
elseif trace_locating then
report_resolvers("unable to save %a in %a (access error)",dataname,luaname)
@@ -21709,7 +22125,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-met"] = package.loaded["data-met"] or true
--- original size: 5310, stripped down to: 3784
+-- original size: 5518, stripped down to: 3854
if not modules then modules={} end modules ['data-met']={
version=1.100,
@@ -21718,31 +22134,45 @@ if not modules then modules={} end modules ['data-met']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local find,format=string.find,string.format
-local sequenced=table.sequenced
+local type=type
+local find=string.find
local addurlscheme,urlhashed=url.addscheme,url.hashed
+local collapsepath,joinfile=file.collapsepath,file.join
+local report_methods=logs.reporter("resolvers","methods")
local trace_locating=false
local trace_methods=false
trackers.register("resolvers.locating",function(v) trace_methods=v end)
trackers.register("resolvers.methods",function(v) trace_methods=v end)
-local report_methods=logs.reporter("resolvers","methods")
local allocate=utilities.storage.allocate
local resolvers=resolvers
local registered={}
local function splitmethod(filename)
if not filename then
- return { scheme="unknown",original=filename }
+ return {
+ scheme="unknown",
+ original=filename,
+ }
end
if type(filename)=="table" then
return filename
end
- filename=file.collapsepath(filename,".")
+ filename=collapsepath(filename,".")
if not find(filename,"://",1,true) then
- return { scheme="file",path=filename,original=filename,filename=filename }
+ return {
+ scheme="file",
+ path=filename,
+ original=filename,
+ filename=filename,
+ }
end
- local specification=url.hashed(filename)
+ local specification=urlhashed(filename)
if not specification.scheme or specification.scheme=="" then
- return { scheme="file",path=filename,original=filename,filename=filename }
+ return {
+ scheme="file",
+ path=filename,
+ original=filename,
+ filename=filename,
+ }
else
return specification
end
@@ -21751,7 +22181,8 @@ resolvers.splitmethod=splitmethod
local function methodhandler(what,first,...)
local method=registered[what]
if method then
- local how,namespace=method.how,method.namespace
+ local how=method.how
+ local namespace=method.namespace
if how=="uri" or how=="url" then
local specification=splitmethod(first)
local scheme=specification.scheme
@@ -21797,7 +22228,10 @@ local function methodhandler(what,first,...)
end
resolvers.methodhandler=methodhandler
function resolvers.registermethod(name,namespace,how)
- registered[name]={ how=how or "tag",namespace=namespace }
+ registered[name]={
+ how=how or "tag",
+ namespace=namespace
+ }
namespace["byscheme"]=function(scheme,filename,...)
if scheme=="file" then
return methodhandler(name,filename,...)
@@ -21806,7 +22240,7 @@ function resolvers.registermethod(name,namespace,how)
end
end
end
-local concatinators=allocate { notfound=file.join }
+local concatinators=allocate { notfound=joinfile }
local locators=allocate { notfound=function() end }
local hashers=allocate { notfound=function() end }
local generators=allocate { notfound=function() end }
@@ -21827,7 +22261,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-res"] = package.loaded["data-res"] or true
--- original size: 68195, stripped down to: 43680
+-- original size: 69576, stripped down to: 44470
if not modules then modules={} end modules ['data-res']={
version=1.001,
@@ -21838,7 +22272,8 @@ if not modules then modules={} end modules ['data-res']={
}
local gsub,find,lower,upper,match,gmatch=string.gsub,string.find,string.lower,string.upper,string.match,string.gmatch
local concat,insert,remove=table.concat,table.insert,table.remove
-local next,type,rawget=next,type,rawget
+local next,type,rawget,loadfile=next,type,rawget,loadfile
+local mergedtable=table.merged
local os=os
local P,S,R,C,Cc,Cs,Ct,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.Cc,lpeg.Cs,lpeg.Ct,lpeg.Carg
local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns
@@ -21854,13 +22289,14 @@ local joinpath=file.joinpath
local is_qualified_path=file.is_qualified_path
local allocate=utilities.storage.allocate
local settings_to_array=utilities.parsers.settings_to_array
+local urlhasscheme=url.hasscheme
local getcurrentdir=lfs.currentdir
local isfile=lfs.isfile
local isdir=lfs.isdir
local setmetatableindex=table.setmetatableindex
local luasuffixes=utilities.lua.suffixes
local trace_locating=false trackers .register("resolvers.locating",function(v) trace_locating=v end)
-local trace_detail=false trackers .register("resolvers.details",function(v) trace_detail=v end)
+local trace_details=false trackers .register("resolvers.details",function(v) trace_details=v end)
local trace_expansions=false trackers .register("resolvers.expansions",function(v) trace_expansions=v end)
local trace_paths=false trackers .register("resolvers.paths",function(v) trace_paths=v end)
local resolve_otherwise=true directives.register("resolvers.otherwise",function(v) resolve_otherwise=v end)
@@ -21879,10 +22315,17 @@ local ostype,osname,osenv,ossetenv,osgetenv=os.type,os.name,os.env,os.setenv,os.
resolvers.cacheversion="1.100"
resolvers.configbanner=""
resolvers.homedir=environment.homedir
-resolvers.criticalvars=allocate { "SELFAUTOLOC","SELFAUTODIR","SELFAUTOPARENT","TEXMFCNF","TEXMF","TEXOS" }
resolvers.luacnfname="texmfcnf.lua"
resolvers.luacnffallback="contextcnf.lua"
resolvers.luacnfstate="unknown"
+local criticalvars={
+ "SELFAUTOLOC",
+ "SELFAUTODIR",
+ "SELFAUTOPARENT",
+ "TEXMFCNF",
+ "TEXMF",
+ "TEXOS",
+}
if environment.default_texmfcnf then
resolvers.luacnfspec="home:texmf/web2c;"..environment.default_texmfcnf
else
@@ -21902,13 +22345,20 @@ local dangerous=resolvers.dangerous
local suffixmap=resolvers.suffixmap
resolvers.defaultsuffixes={ "tex" }
local instance=nil
-function resolvers.setenv(key,value,raw)
+local variable
+local expansion
+local setenv
+local getenv
+local formatofsuffix=resolvers.formatofsuffix
+local splitpath=resolvers.splitpath
+local splitmethod=resolvers.splitmethod
+setenv=function(key,value,raw)
if instance then
instance.environment[key]=value
ossetenv(key,raw and value or resolveprefix(value))
end
end
-local function getenv(key)
+getenv=function(key)
local value=rawget(instance.environment,key)
if value and value~="" then
return value
@@ -21918,94 +22368,97 @@ local function getenv(key)
end
end
resolvers.getenv=getenv
-resolvers.env=getenv
-local function resolvevariable(k)
- return instance.expansions[k]
-end
+resolvers.setenv=setenv
local dollarstripper=lpeg.stripper("$")
local inhibitstripper=P("!")^0*Cs(P(1)^0)
-local somevariable=P("$")/""
-local somekey=C(R("az","AZ","09","__","--")^1)
-local somethingelse=P(";")*((1-S("!{}/\\"))^1*P(";")/"")+P(";")*(P(";")/"")+P(1)
-local variableexpander=Cs((somevariable*(somekey/resolvevariable)+somethingelse)^1 )
-local cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
-local variablecleaner=Cs((cleaner+P(1))^0)
-local somevariable=R("az","AZ","09","__","--")^1/resolvevariable
-local variable=(P("$")/"")*(somevariable+(P("{")/"")*somevariable*(P("}")/""))
-local variableresolver=Cs((variable+P(1))^0)
-local function expandedvariable(var)
- return lpegmatch(variableexpander,var) or var
-end
-function resolvers.reset()
- if trace_locating then
- report_resolving("creating instance")
- end
- local environment={}
- local variables={}
- local expansions={}
- local order={}
- instance={
- environment=environment,
- variables=variables,
- expansions=expansions,
- order=order,
- files={},
- setups={},
- found={},
- foundintrees={},
- hashes={},
- hashed={},
- pathlists=false,
- specification={},
- lists={},
- data={},
- fakepaths={},
- remember=true,
- diskcache=true,
- renewcache=false,
- renewtree=false,
- loaderror=false,
- savelists=true,
- pattern=nil,
- force_suffixes=true,
- pathstack={},
- }
- setmetatableindex(variables,function(t,k)
- local v
- for i=1,#order do
- v=order[i][k]
+local expandedvariable,resolvedvariable do
+ local function resolveinstancevariable(k)
+ return instance.expansions[k]
+ end
+ local p_variable=P("$")/""
+ local p_key=C(R("az","AZ","09","__","--")^1)
+ local p_whatever=P(";")*((1-S("!{}/\\"))^1*P(";")/"")+P(";")*(P(";")/"")+P(1)
+ local variableexpander=Cs((p_variable*(p_key/resolveinstancevariable)+p_whatever)^1 )
+ local p_cleaner=P("\\")/"/"+P(";")*S("!{}/\\")^0*P(";")^1/";"
+ local variablecleaner=Cs((p_cleaner+P(1))^0)
+ local p_variable=R("az","AZ","09","__","--")^1/resolveinstancevariable
+ local p_variable=(P("$")/"")*(p_variable+(P("{")/"")*p_variable*(P("}")/""))
+ local variableresolver=Cs((p_variable+P(1))^0)
+ expandedvariable=function(var)
+ return lpegmatch(variableexpander,var) or var
+ end
+ function resolvers.reset()
+ if trace_locating then
+ report_resolving("creating instance")
+ end
+ local environment={}
+ local variables={}
+ local expansions={}
+ local order={}
+ instance={
+ environment=environment,
+ variables=variables,
+ expansions=expansions,
+ order=order,
+ files={},
+ setups={},
+ found={},
+ foundintrees={},
+ hashes={},
+ hashed={},
+ pathlists=false,
+ specification={},
+ lists={},
+ data={},
+ fakepaths={},
+ remember=true,
+ diskcache=true,
+ renewcache=false,
+ renewtree=false,
+ loaderror=false,
+ savelists=true,
+ pattern=nil,
+ force_suffixes=true,
+ pathstack={},
+ }
+ setmetatableindex(variables,function(t,k)
+ local v
+ for i=1,#order do
+ v=order[i][k]
+ if v~=nil then
+ t[k]=v
+ return v
+ end
+ end
+ if v==nil then
+ v=""
+ end
+ t[k]=v
+ return v
+ end)
+ local repath=resolvers.repath
+ setmetatableindex(environment,function(t,k)
+ local v=osgetenv(k)
+ if v==nil then
+ v=variables[k]
+ end
if v~=nil then
- t[k]=v
- return v
+ v=checkedvariable(v) or ""
end
- end
- if v==nil then
- v=""
- end
- t[k]=v
- return v
- end)
- setmetatableindex(environment,function(t,k)
- local v=osgetenv(k)
- if v==nil then
- v=variables[k]
- end
- if v~=nil then
- v=checkedvariable(v) or ""
- end
- v=resolvers.repath(v)
- t[k]=v
- return v
- end)
- setmetatableindex(expansions,function(t,k)
- local v=environment[k]
- if type(v)=="string" then
- v=lpegmatch(variableresolver,v)
- v=lpegmatch(variablecleaner,v)
- end
- t[k]=v
- return v
- end)
+ v=repath(v)
+ t[k]=v
+ return v
+ end)
+ setmetatableindex(expansions,function(t,k)
+ local v=environment[k]
+ if type(v)=="string" then
+ v=lpegmatch(variableresolver,v)
+ v=lpegmatch(variablecleaner,v)
+ end
+ t[k]=v
+ return v
+ end)
+ end
end
function resolvers.initialized()
return instance~=nil
@@ -22019,31 +22472,33 @@ local function reset_caches()
instance.lists={}
instance.pathlists=false
end
-local slash=P("/")
-local pathexpressionpattern=Cs (
- Cc("^")*(
- Cc("%")*S(".-")+slash^2*P(-1)/"/.*"
+local makepathexpression do
+ local slash=P("/")
+ local pathexpressionpattern=Cs (
+ Cc("^")*(
+ Cc("%")*S(".-")+slash^2*P(-1)/"/.*"
+slash^2/"/"+(1-slash)*P(-1)*Cc("/")+P(1)
- )^1*Cc("$")
-)
-local cache={}
-local function makepathexpression(str)
- if str=="." then
- return "^%./$"
- else
- local c=cache[str]
- if not c then
- c=lpegmatch(pathexpressionpattern,str)
- cache[str]=c
+ )^1*Cc("$")
+ )
+ local cache={}
+ makepathexpression=function(str)
+ if str=="." then
+ return "^%./$"
+ else
+ local c=cache[str]
+ if not c then
+ c=lpegmatch(pathexpressionpattern,str)
+ cache[str]=c
+ end
+ return c
end
- return c
end
end
local function reportcriticalvariables(cnfspec)
if trace_locating then
- for i=1,#resolvers.criticalvars do
- local k=resolvers.criticalvars[i]
- local v=resolvers.getenv(k) or "unknown"
+ for i=1,#criticalvars do
+ local k=criticalvars[i]
+ local v=getenv(k) or "unknown"
report_resolving("variable %a set to %a",k,v)
end
report_resolving()
@@ -22065,7 +22520,7 @@ local function identify_configuration_files()
resolvers.luacnfstate="environment"
end
reportcriticalvariables(cnfspec)
- local cnfpaths=expandedpathfromlist(resolvers.splitpath(cnfspec))
+ local cnfpaths=expandedpathfromlist(splitpath(cnfspec))
local function locatecnf(luacnfname,kind)
for i=1,#cnfpaths do
local filepath=cnfpaths[i]
@@ -22098,6 +22553,8 @@ local function identify_configuration_files()
end
local function load_configuration_files()
local specification=instance.specification
+ local setups=instance.setups
+ local order=instance.order
if #specification>0 then
local luacnfname=resolvers.luacnfname
for i=1,#specification do
@@ -22107,7 +22564,6 @@ local function load_configuration_files()
local realname=resolveprefix(filename)
local blob=loadfile(realname)
if blob then
- local setups=instance.setups
local data=blob()
local parent=data and data.parent
if parent then
@@ -22118,7 +22574,7 @@ local function load_configuration_files()
local parentdata=blob()
if parentdata then
report_resolving("loading configuration file %a",filename)
- data=table.merged(parentdata,data)
+ data=mergedtable(parentdata,data)
end
end
end
@@ -22150,7 +22606,7 @@ local function load_configuration_files()
if trace_locating then
report_resolving("reloading configuration due to TEXMF redefinition")
end
- resolvers.setenv("TEXMFCNF",cnfspec)
+ setenv("TEXMFCNF",cnfspec)
instance.specification={}
identify_configuration_files()
load_configuration_files()
@@ -22168,7 +22624,7 @@ local function load_configuration_files()
elseif trace_locating then
report_resolving("skipping configuration file %a (no valid format)",filename)
end
- instance.order[#instance.order+1]=instance.setups[pathname]
+ order[#order+1]=setups[pathname]
if instance.loaderror then
break
end
@@ -22177,6 +22633,8 @@ local function load_configuration_files()
report_resolving("warning: no lua configuration files found")
end
end
+local expandedpathlist
+local unexpandedpathlist
function resolvers.configurationfiles()
return instance.specification or {}
end
@@ -22193,7 +22651,7 @@ local function load_file_databases()
end
end
local function locate_file_databases()
- local texmfpaths=resolvers.expandedpathlist("TEXMF")
+ local texmfpaths=expandedpathlist("TEXMF")
if #texmfpaths>0 then
for i=1,#texmfpaths do
local path=collapsepath(texmfpaths[i])
@@ -22202,7 +22660,7 @@ local function locate_file_databases()
if stripped~="" then
local runtime=stripped==path
path=cleanpath(path)
- local spec=resolvers.splitmethod(stripped)
+ local spec=splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme=="file") then
stripped="tree:///"..stripped
elseif spec.scheme=="cache" or spec.scheme=="file" then
@@ -22236,11 +22694,13 @@ local function generate_file_databases()
end
end
local function save_file_databases()
- for i=1,#instance.hashes do
- local hash=instance.hashes[i]
+ local hashes=instance.hashes
+ local files=instance.files
+ for i=1,#hashes do
+ local hash=hashes[i]
local cachename=hash.name
if hash.cache then
- local content=instance.files[cachename]
+ local content=files[cachename]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",cachename)
@@ -22252,8 +22712,9 @@ local function save_file_databases()
end
end
function resolvers.renew(hashname)
+ local files=instance.files
if hashname and hashname~="" then
- local expanded=resolvers.expansion(hashname) or ""
+ local expanded=expansion(hashname) or ""
if expanded~="" then
if trace_locating then
report_resolving("identifying tree %a from %a",expanded,hashname)
@@ -22270,7 +22731,7 @@ function resolvers.renew(hashname)
report_resolving("using path %a",realpath)
end
methodhandler('generators',hashname)
- local content=instance.files[hashname]
+ local content=files[hashname]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",hashname)
@@ -22297,38 +22758,46 @@ local function load_databases()
end
end
function resolvers.appendhash(type,name,cache)
- if not instance.hashed[name] then
+ local hashed=instance.hashed
+ local hashes=instance.hashes
+ if hashed[name] then
+ else
if trace_locating then
report_resolving("hash %a appended",name)
end
- insert(instance.hashes,{ type=type,name=name,cache=cache } )
- instance.hashed[name]=cache
+ insert(hashes,{ type=type,name=name,cache=cache } )
+ hashed[name]=cache
end
end
function resolvers.prependhash(type,name,cache)
- if not instance.hashed[name] then
+ local hashed=instance.hashed
+ local hashes=instance.hashes
+ if hashed[name] then
+ else
if trace_locating then
report_resolving("hash %a prepended",name)
end
- insert(instance.hashes,1,{ type=type,name=name,cache=cache } )
- instance.hashed[name]=cache
+ insert(hashes,1,{ type=type,name=name,cache=cache } )
+ hashed[name]=cache
end
end
function resolvers.extendtexmfvariable(specification)
- local t=resolvers.splitpath(getenv("TEXMF"))
- insert(t,1,specification)
- local newspec=concat(t,",")
- if instance.environment["TEXMF"] then
- instance.environment["TEXMF"]=newspec
- elseif instance.variables["TEXMF"] then
- instance.variables["TEXMF"]=newspec
+ local environment=instance.environment
+ local variables=instance.variables
+ local texmftrees=splitpath(getenv("TEXMF"))
+ insert(texmftrees,1,specification)
+ texmftrees=concat(texmftrees,",")
+ if environment["TEXMF"] then
+ environment["TEXMF"]=texmftrees
+ elseif variables["TEXMF"] then
+ variables["TEXMF"]=texmftrees
else
end
reset_hashes()
end
function resolvers.splitexpansions()
- local ie=instance.expansions
- for k,v in next,ie do
+ local expansions=instance.expansions
+ for k,v in next,expansions do
local t,tn,h,p={},0,{},splitconfigurationpath(v)
for kk=1,#p do
local vv=p[kk]
@@ -22338,33 +22807,37 @@ function resolvers.splitexpansions()
h[vv]=true
end
end
- if #t>1 then
- ie[k]=t
+ if tn>1 then
+ expansions[k]=t
else
- ie[k]=t[1]
+ expansions[k]=t[1]
end
end
end
function resolvers.datastate()
return caches.contentstate()
end
-function resolvers.variable(name)
+variable=function(name)
+ local variables=instance.variables
local name=name and lpegmatch(dollarstripper,name)
- local result=name and instance.variables[name]
+ local result=name and variables[name]
return result~=nil and result or ""
end
-function resolvers.expansion(name)
+expansion=function(name)
+ local expansions=instance.expansions
local name=name and lpegmatch(dollarstripper,name)
- local result=name and instance.expansions[name]
+ local result=name and expansions[name]
return result~=nil and result or ""
end
-function resolvers.unexpandedpathlist(str)
- local pth=resolvers.variable(str)
- local lst=resolvers.splitpath(pth)
+resolvers.variable=variable
+resolvers.expansion=expansion
+unexpandedpathlist=function(str)
+ local pth=variable(str)
+ local lst=splitpath(pth)
return expandedpathfromlist(lst)
end
function resolvers.unexpandedpath(str)
- return joinpath(resolvers.unexpandedpathlist(str))
+ return joinpath(unexpandedpathlist(str))
end
function resolvers.pushpath(name)
local pathstack=instance.pathstack
@@ -22394,8 +22867,8 @@ function resolvers.stackpath()
end
local done={}
function resolvers.resetextrapaths()
- local ep=instance.extra_paths
- if not ep then
+ local extra_paths=instance.extra_paths
+ if not extra_paths then
done={}
instance.extra_paths={}
elseif #ep>0 then
@@ -22416,8 +22889,8 @@ function resolvers.registerextrapath(paths,subpaths)
end
local paths=settings_to_array(paths)
local subpaths=settings_to_array(subpaths)
- local ep=instance.extra_paths or {}
- local oldn=#ep
+ local extra_paths=instance.extra_paths or {}
+ local oldn=#extra_paths
local newn=oldn
local nofpaths=#paths
local nofsubpaths=#subpaths
@@ -22430,7 +22903,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps=p.."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=cleanpath(ps)
+ extra_paths[newn]=cleanpath(ps)
done[ps]=true
end
end
@@ -22440,7 +22913,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p=paths[i]
if not done[p] then
newn=newn+1
- ep[newn]=cleanpath(p)
+ extra_paths[newn]=cleanpath(p)
done[p]=true
end
end
@@ -22449,17 +22922,17 @@ function resolvers.registerextrapath(paths,subpaths)
for i=1,oldn do
for j=1,nofsubpaths do
local s=subpaths[j]
- local ps=ep[i].."/"..s
+ local ps=extra_paths[i].."/"..s
if not done[ps] then
newn=newn+1
- ep[newn]=cleanpath(ps)
+ extra_paths[newn]=cleanpath(ps)
done[ps]=true
end
end
end
end
if newn>0 then
- instance.extra_paths=ep
+ instance.extra_paths=extra_paths
end
if newn~=oldn then
reset_caches()
@@ -22467,17 +22940,19 @@ function resolvers.registerextrapath(paths,subpaths)
end
function resolvers.pushextrapath(path)
local paths=settings_to_array(path)
- if instance.extra_stack then
- insert(instance.extra_stack,1,paths)
+ local extra_stack=instance.extra_stack
+ if extra_stack then
+ insert(extra_stack,1,paths)
else
instance.extra_stack={ paths }
end
reset_caches()
end
function resolvers.popextrapath()
- if instance.extra_stack then
+ local extra_stack=instance.extra_stack
+ if extra_stack then
reset_caches()
- return remove(instance.extra_stack,1)
+ return remove(extra_stack,1)
end
end
local function made_list(instance,list,extra_too)
@@ -22506,33 +22981,21 @@ local function made_list(instance,list,extra_too)
end
end
if extra_too then
- local es=instance.extra_stack
- if es and #es>0 then
- for k=1,#es do
- add(es[k])
+ local extra_stack=instance.extra_stack
+ local extra_paths=instance.extra_paths
+ if extra_stack and #extra_stack>0 then
+ for k=1,#extra_stack do
+ add(extra_stack[k])
end
end
- local ep=instance.extra_paths
- if ep and #ep>0 then
- add(ep)
+ if extra_paths and #extra_paths>0 then
+ add(extra_paths)
end
end
add(list)
return new
end
-function resolvers.cleanpathlist(str)
- local t=resolvers.expandedpathlist(str)
- if t then
- for i=1,#t do
- t[i]=collapsepath(cleanpath(t[i]))
- end
- end
- return t
-end
-function resolvers.expandpath(str)
- return joinpath(resolvers.expandedpathlist(str))
-end
-function resolvers.expandedpathlist(str,extra_too)
+expandedpathlist=function(str,extra_too)
if not str then
return {}
elseif instance.savelists then
@@ -22540,40 +23003,56 @@ function resolvers.expandedpathlist(str,extra_too)
local lists=instance.lists
local lst=lists[str]
if not lst then
- local l=made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
+ local l=made_list(instance,splitpath(expansion(str)),extra_too)
lst=expandedpathfromlist(l)
lists[str]=lst
end
return lst
else
- local lst=resolvers.splitpath(resolvers.expansion(str))
+ local lst=splitpath(expansion(str))
return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
-function resolvers.expandedpathlistfromvariable(str)
+resolvers.expandedpathlist=expandedpathlist
+resolvers.unexpandedpathlist=unexpandedpathlist
+function resolvers.cleanpathlist(str)
+ local t=expandedpathlist(str)
+ if t then
+ for i=1,#t do
+ t[i]=collapsepath(cleanpath(t[i]))
+ end
+ end
+ return t
+end
+function resolvers.expandpath(str)
+ return joinpath(expandedpathlist(str))
+end
+local function expandedpathlistfromvariable(str)
str=lpegmatch(dollarstripper,str)
local tmp=resolvers.variableofformatorsuffix(str)
- return resolvers.expandedpathlist(tmp~="" and tmp or str)
+ return expandedpathlist(tmp~="" and tmp or str)
end
function resolvers.expandpathfromvariable(str)
- return joinpath(resolvers.expandedpathlistfromvariable(str))
+ return joinpath(expandedpathlistfromvariable(str))
end
+resolvers.expandedpathlistfromvariable=expandedpathlistfromvariable
function resolvers.cleanedpathlist(v)
- local t=resolvers.expandedpathlist(v)
+ local t=expandedpathlist(v)
for i=1,#t do
- t[i]=resolvers.resolve(resolvers.cleanpath(t[i]))
+ t[i]=resolveprefix(cleanpath(t[i]))
end
return t
end
function resolvers.expandbraces(str)
- local pth=expandedpathfromlist(resolvers.splitpath(str))
+ local pth=expandedpathfromlist(splitpath(str))
return joinpath(pth)
end
function resolvers.registerfilehash(name,content,someerror)
+ local files=instance.files
if content then
- instance.files[name]=content
+ files[name]=content
else
- instance.files[name]={}
+ files[name]={}
if somerror==true then
instance.loaderror=someerror
end
@@ -22592,7 +23071,7 @@ function resolvers.renewcache()
end
local function isreadable(name)
local readable=isfile(name)
- if trace_detail then
+ if trace_details then
if readable then
report_resolving("file %a is readable",name)
else
@@ -22609,7 +23088,7 @@ local function collect_files(names)
local variant=hash.type
local search=filejoin(root,path,name)
local result=methodhandler('concatinators',variant,root,path,name)
- if trace_detail then
+ if trace_details then
report_resolving("match: variant %a, search %a, result %a",variant,search,result)
end
noffiles=noffiles+1
@@ -22618,7 +23097,7 @@ local function collect_files(names)
end
for k=1,#names do
local filename=names[k]
- if trace_detail then
+ if trace_details then
report_resolving("checking name %a",filename)
end
local basename=filebasename(filename)
@@ -22630,12 +23109,13 @@ local function collect_files(names)
pathname="/"..pathname.."$"
end
local hashes=instance.hashes
+ local files=instance.files
for h=1,#hashes do
local hash=hashes[h]
local hashname=hash.name
- local content=hashname and instance.files[hashname]
+ local content=hashname and files[hashname]
if content then
- if trace_detail then
+ if trace_details then
report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
local path,name=lookup(content,basename)
@@ -22703,7 +23183,6 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat=="" then
if filesuffix=="" or not suffixmap[filesuffix] then
local defaultsuffixes=resolvers.defaultsuffixes
- local formatofsuffix=resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname=filename..'.'..defaultsuffixes[i]
wantedfiles[#wantedfiles+1]=forcedname
@@ -22713,7 +23192,7 @@ local function find_analyze(filename,askedformat,allresults)
end
end
else
- filetype=resolvers.formatofsuffix(filename)
+ filetype=formatofsuffix(filename)
if trace_locating then
report_resolving("using suffix based filetype %a",filetype)
end
@@ -22736,7 +23215,7 @@ local function find_analyze(filename,askedformat,allresults)
end
local function find_direct(filename,allresults)
if not dangerous[askedformat] and isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("file %a found directly",filename)
end
return "direct",{ filename }
@@ -22761,12 +23240,12 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
report_resolving("checking qualified name %a",filename)
end
if isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("qualified file %a found",filename)
end
return "qualified",{ filename }
end
- if trace_detail then
+ if trace_details then
report_resolving("locating qualified file %a",filename)
end
local forcedname,suffix="",suffixonly(filename)
@@ -22774,11 +23253,11 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
local format_suffixes=askedformat=="" and resolvers.defaultsuffixes or suffixes[askedformat]
if format_suffixes then
for i=1,#format_suffixes do
- local s=format_suffixes[i]
- forcedname=filename.."."..s
+ local suffix=format_suffixes[i]
+ forcedname=filename.."."..suffix
if isreadable(forcedname) then
if trace_locating then
- report_resolving("no suffix, forcing format filetype %a",s)
+ report_resolving("no suffix, forcing format filetype %a",suffix)
end
return "qualified",{ forcedname }
end
@@ -22791,7 +23270,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
local savedformat=askedformat
local format=savedformat or ""
if format=="" then
- askedformat=resolvers.formatofsuffix(suffix)
+ askedformat=formatofsuffix(suffix)
end
if not format then
askedformat="othertextfiles"
@@ -22822,7 +23301,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped)
end
local function check_subpath(fname)
if isreadable(fname) then
- if trace_detail then
+ if trace_details then
report_resolving("found %a by deep scanning",fname)
end
return fname
@@ -22830,7 +23309,7 @@ local function check_subpath(fname)
end
local function makepathlist(list,filetype)
local typespec=resolvers.variableofformat(filetype)
- local pathlist=resolvers.expandedpathlist(typespec,filetype and usertypes[filetype])
+ local pathlist=expandedpathlist(typespec,filetype and usertypes[filetype])
local entry={}
if pathlist and #pathlist>0 then
for k=1,#pathlist do
@@ -22841,7 +23320,7 @@ local function makepathlist(list,filetype)
local expression=makepathexpression(pathname)
local barename=gsub(pathname,"/+$","")
barename=resolveprefix(barename)
- local scheme=url.hasscheme(barename)
+ local scheme=urlhasscheme(barename)
local schemename=gsub(barename,"%.%*$",'')
entry[k]={
path=path,
@@ -22878,7 +23357,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
dirlist[i]=filedirname(filelist[i][3]).."/"
end
end
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a in tree",filename)
end
for k=1,#pathlist do
@@ -22888,7 +23367,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
local done=false
if filelist then
local expression=entry.expression
- if trace_detail then
+ if trace_details then
report_resolving("using pattern %a for path %a",expression,pathname)
end
for k=1,#filelist do
@@ -22899,16 +23378,16 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
result[#result+1]=resolveprefix(fl[3])
done=true
if allresults then
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, continue scanning",expression,f,d)
end
else
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, quit scanning",expression,f,d)
end
break
end
- elseif trace_detail then
+ elseif trace_details then
report_resolving("no match to %a in hash for file %a and path %a",expression,f,d)
end
end
@@ -22923,7 +23402,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
if not find(pname,"*",1,true) then
if can_be_dir(pname) then
if not done and not entry.prescanned then
- if trace_detail then
+ if trace_details then
report_resolving("quick root scan for %a",pname)
end
for k=1,#wantedfiles do
@@ -22938,7 +23417,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
if not done and entry.recursive then
- if trace_detail then
+ if trace_details then
report_resolving("scanning filesystem for %a",pname)
end
local files=resolvers.simplescanfiles(pname,false,true)
@@ -23004,7 +23483,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
end
local function find_onpath(filename,filetype,wantedfiles,allresults)
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a, filetype %a, wanted files %a",filename,filetype,concat(wantedfiles," | "))
end
local result={}
@@ -23046,7 +23525,9 @@ collect_instance_files=function(filename,askedformat,allresults)
{ find_onpath (filename,filetype,wantedfiles,true) },
{ find_otherwise(filename,filetype,wantedfiles,true) },
}
- local result,status,done={},{},{}
+ local result={}
+ local status={}
+ local done={}
for k,r in next,results do
local method,list=r[1],r[2]
if method and list then
@@ -23060,7 +23541,7 @@ collect_instance_files=function(filename,askedformat,allresults)
end
end
end
- if trace_detail then
+ if trace_details then
report_resolving("lookup status: %s",table.serialize(status,filename))
end
return result,status
@@ -23117,6 +23598,9 @@ local function findfiles(filename,filetype,allresults)
if not filename or filename=="" then
return {}
end
+ if allresults==nil then
+ allresults=true
+ end
local result,status=collect_instance_files(filename,filetype or "",allresults)
if not result or #result==0 then
local lowered=lower(filename)
@@ -23126,27 +23610,25 @@ local function findfiles(filename,filetype,allresults)
end
return result or {},status
end
-function resolvers.findfiles(filename,filetype)
- if not filename or filename=="" then
- return ""
- else
- return findfiles(filename,filetype,true)
- end
-end
-function resolvers.findfile(filename,filetype)
+local function findfile(filename,filetype)
if not filename or filename=="" then
return ""
else
return findfiles(filename,filetype,false)[1] or ""
end
end
+resolvers.findfiles=findfiles
+resolvers.findfile=findfile
+resolvers.find_file=findfile
+resolvers.find_files=findfiles
function resolvers.findpath(filename,filetype)
return filedirname(findfiles(filename,filetype,false)[1] or "")
end
local function findgivenfiles(filename,allresults)
+ local hashes=instance.hashes
+ local files=instance.files
local base=filebasename(filename)
local result={}
- local hashes=instance.hashes
local function okay(hash,path,name)
local found=methodhandler('concatinators',hash.type,hash.name,path,name)
if found and found~="" then
@@ -23156,7 +23638,7 @@ local function findgivenfiles(filename,allresults)
end
for k=1,#hashes do
local hash=hashes[k]
- local content=instance.files[hash.name]
+ local content=files[hash.name]
if content then
local path,name=lookup(content,base)
if not path then
@@ -23188,14 +23670,14 @@ function resolvers.wildcardpattern(pattern)
return lpegmatch(makewildcard,pattern) or pattern
end
local function findwildcardfiles(filename,allresults,result)
+ local files=instance.files
+ local hashes=instance.hashes
local result=result or {}
local base=filebasename(filename)
local dirn=filedirname(filename)
local path=lower(lpegmatch(makewildcard,dirn) or dirn)
local name=lower(lpegmatch(makewildcard,base) or base)
- local files=instance.files
if find(name,"*",1,true) then
- local hashes=instance.hashes
local function okay(found,path,base,hashname,hashtype)
if find(found,path) then
local full=methodhandler('concatinators',hashtype,hashname,found,base)
@@ -23235,7 +23717,6 @@ local function findwildcardfiles(filename,allresults,result)
end
end
end
- local hashes=instance.hashes
for k=1,#hashes do
local hash=hashes[k]
local hashname=hash.name
@@ -23265,13 +23746,21 @@ end
function resolvers.findwildcardfile(filename)
return findwildcardfiles(filename,false)[1] or ""
end
-function resolvers.automount()
-end
-function resolvers.starttiming()
- statistics.starttiming(instance)
+do
+ local starttiming=statistics.starttiming
+ local stoptiming=statistics.stoptiming
+ local elapsedtime=statistics.elapsedtime
+ function resolvers.starttiming()
+ starttiming(instance)
+ end
+ function resolvers.stoptiming()
+ stoptiming(instance)
+ end
+ function resolvers.loadtime()
+ return elapsedtime(instance)
+ end
end
-function resolvers.stoptiming()
- statistics.stoptiming(instance)
+function resolvers.automount()
end
function resolvers.load(option)
resolvers.starttiming()
@@ -23285,9 +23774,6 @@ function resolvers.load(option)
local files=instance.files
return files and next(files) and true
end
-function resolvers.loadtime()
- return statistics.elapsedtime(instance)
-end
local function report(str)
if trace_locating then
report_resolving(str)
@@ -23317,7 +23803,7 @@ function resolvers.dowithfilesandreport(command,files,...)
end
end
function resolvers.showpath(str)
- return joinpath(resolvers.expandedpathlist(resolvers.formatofvariable(str)))
+ return joinpath(expandedpathlist(resolvers.formatofvariable(str)))
end
function resolvers.registerfile(files,name,path)
if files[name] then
@@ -23331,7 +23817,7 @@ function resolvers.registerfile(files,name,path)
end
end
function resolvers.dowithpath(name,func)
- local pathlist=resolvers.expandedpathlist(name)
+ local pathlist=expandedpathlist(name)
for i=1,#pathlist do
func("^"..cleanpath(pathlist[i]))
end
@@ -23341,11 +23827,11 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
local engine=environment.ownmain or "luatex"
- local barename=removesuffix(name)
+ local barename=removesuffix(file.basename(name))
local fullname=addsuffix(barename,"fmt")
local fmtname=caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname=="" then
- fmtname=resolvers.findfile(fullname)
+ fmtname=findfile(fullname)
fmtname=cleanpath(fmtname)
end
if fmtname~="" then
@@ -23354,17 +23840,17 @@ function resolvers.locateformat(name)
local lucname=addsuffix(barename,luasuffixes.luc)
local luiname=addsuffix(barename,luasuffixes.lui)
if isfile(luiname) then
- return barename,luiname
+ return fmtname,luiname
elseif isfile(lucname) then
- return barename,lucname
+ return fmtname,lucname
elseif isfile(luaname) then
- return barename,luaname
+ return fmtname,luaname
end
end
return nil,nil
end
function resolvers.booleanvariable(str,default)
- local b=resolvers.expansion(str)
+ local b=expansion(str)
if b=="" then
return default
else
@@ -23374,6 +23860,7 @@ function resolvers.booleanvariable(str,default)
end
function resolvers.dowithfilesintree(pattern,handle,before,after)
local hashes=instance.hashes
+ local files=instance.files
for i=1,#hashes do
local hash=hashes[i]
local blobtype=hash.type
@@ -23385,7 +23872,7 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
if before then
before(blobtype,blobpath,pattern)
end
- for path,name in filtered(instance.files[blobpath],pattern) do
+ for path,name in filtered(files[blobpath],pattern) do
if type(path)=="string" then
checked=checked+1
if handle(blobtype,blobpath,path,name) then
@@ -23406,10 +23893,6 @@ function resolvers.dowithfilesintree(pattern,handle,before,after)
end
end
end
-local obsolete=resolvers.obsolete or {}
-resolvers.obsolete=obsolete
-resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile
-resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles
function resolvers.knownvariables(pattern)
if instance then
local environment=instance.environment
@@ -23443,7 +23926,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-pre"] = package.loaded["data-pre"] or true
--- original size: 4854, stripped down to: 2889
+-- original size: 5088, stripped down to: 3144
if not modules then modules={} end modules ['data-pre']={
version=1.001,
@@ -23452,6 +23935,7 @@ if not modules then modules={} end modules ['data-pre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local insert,remove=table.insert,table.remove
local resolvers=resolvers
local prefixes=resolvers.prefixes
local cleanpath=resolvers.cleanpath
@@ -23529,8 +24013,9 @@ prefixes.kpse=prefixes.locate
prefixes.full=prefixes.locate
prefixes.file=prefixes.filename
prefixes.path=prefixes.pathname
+local inputstack={}
+local stackpath=resolvers.stackpath
local function toppath()
- local inputstack=resolvers.inputstack
if not inputstack then
return "."
end
@@ -23542,15 +24027,23 @@ local function toppath()
end
end
local function jobpath()
- local path=resolvers.stackpath()
+ local path=stackpath()
if not path or path=="" then
return "."
else
return path
end
end
+local function pushinputname(name)
+ insert(inputstack,name)
+end
+local function popinputname(name)
+ return remove(inputstack)
+end
resolvers.toppath=toppath
resolvers.jobpath=jobpath
+resolvers.pushinputname=pushinputname
+resolvers.popinputname=popinputname
prefixes.toppath=function(str) return cleanpath(joinpath(toppath(),str)) end
prefixes.jobpath=function(str) return cleanpath(joinpath(jobpath(),str)) end
resolvers.setdynamic("toppath")
@@ -23593,7 +24086,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-out"] = package.loaded["data-out"] or true
--- original size: 530, stripped down to: 470
+-- original size: 551, stripped down to: 470
if not modules then modules={} end modules ['data-out']={
version=1.001,
@@ -23616,7 +24109,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-fil"] = package.loaded["data-fil"] or true
--- original size: 3863, stripped down to: 3170
+-- original size: 4365, stripped down to: 3588
if not modules then modules={} end modules ['data-fil']={
version=1.001,
@@ -23625,39 +24118,46 @@ if not modules then modules={} end modules ['data-fil']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local ioopen=io.open
+local isdir=lfs.isdir
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_files=logs.reporter("resolvers","files")
local resolvers=resolvers
local resolveprefix=resolvers.resolve
-local finders,openers,loaders,savers=resolvers.finders,resolvers.openers,resolvers.loaders,resolvers.savers
-local locators,hashers,generators,concatinators=resolvers.locators,resolvers.hashers,resolvers.generators,resolvers.concatinators
+local findfile=resolvers.findfile
+local scanfiles=resolvers.scanfiles
+local registerfilehash=resolvers.registerfilehash
+local appendhash=resolvers.appendhash
+local loadcachecontent=caches.loadcontent
local checkgarbage=utilities.garbagecollector and utilities.garbagecollector.check
-function locators.file(specification)
+function resolvers.locators.file(specification)
local filename=specification.filename
local realname=resolveprefix(filename)
- if realname and realname~='' and lfs.isdir(realname) then
+ if realname and realname~='' and isdir(realname) then
if trace_locating then
report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',filename,true)
+ appendhash('file',filename,true)
elseif trace_locating then
report_files("file locator %a not found",filename)
end
end
-function hashers.file(specification)
+function resolvers.hashers.file(specification)
local pathname=specification.filename
- local content=caches.loadcontent(pathname,'files')
- resolvers.registerfilehash(pathname,content,content==nil)
+ local content=loadcachecontent(pathname,'files')
+ registerfilehash(pathname,content,content==nil)
end
-function generators.file(specification)
+function resolvers.generators.file(specification)
local pathname=specification.filename
- local content=resolvers.scanfiles(pathname,false,true)
- resolvers.registerfilehash(pathname,content,true)
+ local content=scanfiles(pathname,false,true)
+ registerfilehash(pathname,content,true)
end
-concatinators.file=file.join
+resolvers.concatinators.file=file.join
+local finders=resolvers.finders
+local notfound=finders.notfound
function finders.file(specification,filetype)
local filename=specification.filename
- local foundname=resolvers.findfile(filename,filetype)
+ local foundname=findfile(filename,filetype)
if foundname and foundname~="" then
if trace_locating then
report_files("file finder: %a found",filename)
@@ -23667,37 +24167,55 @@ function finders.file(specification,filetype)
if trace_locating then
report_files("file finder: %a not found",filename)
end
- return finders.notfound()
+ return notfound()
end
end
-function openers.helpers.textopener(tag,filename,f)
+local openers=resolvers.openers
+local notfound=openers.notfound
+local overloaded=false
+local function textopener(tag,filename,f)
return {
- reader=function() return f:read () end,
- close=function() logs.show_close(filename) return f:close() end,
+ reader=function() return f:read () end,
+ close=function() return f:close() end,
}
end
+function openers.helpers.textopener(...)
+ return textopener(...)
+end
+function openers.helpers.settextopener(opener)
+ if overloaded then
+ report_files("file opener: %s overloaded","already")
+ else
+ if trace_locating then
+ report_files("file opener: %s overloaded","once")
+ end
+ overloaded=true
+ textopener=opener
+ end
+end
function openers.file(specification,filetype)
local filename=specification.filename
if filename and filename~="" then
- local f=io.open(filename,"r")
+ local f=ioopen(filename,"r")
if f then
if trace_locating then
report_files("file opener: %a opened",filename)
end
- return openers.helpers.textopener("file",filename,f)
+ return textopener("file",filename,f)
end
end
if trace_locating then
report_files("file opener: %a not found",filename)
end
- return openers.notfound()
+ return notfound()
end
+local loaders=resolvers.loaders
+local notfound=loaders.notfound
function loaders.file(specification,filetype)
local filename=specification.filename
if filename and filename~="" then
- local f=io.open(filename,"rb")
+ local f=ioopen(filename,"rb")
if f then
- logs.show_load(filename)
if trace_locating then
report_files("file loader: %a loaded",filename)
end
@@ -23714,7 +24232,7 @@ function loaders.file(specification,filetype)
if trace_locating then
report_files("file loader: %a not found",filename)
end
- return loaders.notfound()
+ return notfound()
end
@@ -23724,7 +24242,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-con"] = package.loaded["data-con"] or true
--- original size: 5029, stripped down to: 3432
+-- original size: 5388, stripped down to: 3685
if not modules then modules={} end modules ['data-con']={
version=1.100,
@@ -23733,6 +24251,7 @@ if not modules then modules={} end modules ['data-con']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local setmetatable=setmetatable
local format,lower,gsub=string.format,string.lower,string.gsub
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local trace_containers=false trackers.register("resolvers.containers",function(v) trace_containers=v end)
@@ -23740,16 +24259,21 @@ local trace_storage=false trackers.register("resolvers.storage",function(v) tra
containers=containers or {}
local containers=containers
containers.usecache=true
+local getwritablepath=caches.getwritablepath
+local getreadablepaths=caches.getreadablepaths
+local cacheiswritable=caches.is_writable
+local loaddatafromcache=caches.loaddata
+local savedataincache=caches.savedata
local report_containers=logs.reporter("resolvers","containers")
local allocated={}
local mt={
__index=function(t,k)
if k=="writable" then
- local writable=caches.getwritablepath(t.category,t.subcategory) or { "." }
+ local writable=getwritablepath(t.category,t.subcategory) or { "." }
t.writable=writable
return writable
elseif k=="readables" then
- local readables=caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ local readables=getreadablepaths(t.category,t.subcategory) or { "." }
t.readables=readables
return readables
end
@@ -23780,7 +24304,7 @@ function containers.define(category,subcategory,version,enabled)
end
end
function containers.is_usable(container,name)
- return container.enabled and caches and caches.is_writable(container.writable,name)
+ return container.enabled and caches and cacheiswritable(container.writable,name)
end
function containers.is_valid(container,name)
if name and name~="" then
@@ -23794,7 +24318,7 @@ function containers.read(container,name)
local storage=container.storage
local stored=storage[name]
if not stored and container.enabled and caches and containers.usecache then
- stored=caches.loaddata(container.readables,name,container.writable)
+ stored=loaddatafromcache(container.readables,name,container.writable)
if stored and stored.cache_version==container.version then
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","load",container.subcategory,name)
@@ -23810,17 +24334,20 @@ function containers.read(container,name)
end
return stored
end
-function containers.write(container,name,data)
+function containers.write(container,name,data,fast)
if data then
data.cache_version=container.version
if container.enabled and caches then
- local unique,shared=data.unique,data.shared
- data.unique,data.shared=nil,nil
- caches.savedata(container.writable,name,data)
+ local unique=data.unique
+ local shared=data.shared
+ data.unique=nil
+ data.shared=nil
+ savedataincache(container.writable,name,data,fast)
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","save",container.subcategory,name)
end
- data.unique,data.shared=unique,shared
+ data.unique=unique
+ data.shared=shared
end
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","store",container.subcategory,name)
@@ -23843,7 +24370,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-use"] = package.loaded["data-use"] or true
--- original size: 4434, stripped down to: 3180
+-- original size: 5790, stripped down to: 2910
if not modules then modules={} end modules ['data-use']={
version=1.001,
@@ -23852,40 +24379,11 @@ if not modules then modules={} end modules ['data-use']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local format,lower,gsub,find=string.format,string.lower,string.gsub,string.find
+local format=string.format
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_mounts=logs.reporter("resolvers","mounts")
local resolvers=resolvers
-resolvers.automounted=resolvers.automounted or {}
-function resolvers.automount(usecache)
- local mountpaths=resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
- if (not mountpaths or #mountpaths==0) and usecache then
- mountpaths=caches.getreadablepaths("mount")
- end
- if mountpaths and #mountpaths>0 then
- resolvers.starttiming()
- for k=1,#mountpaths do
- local root=mountpaths[k]
- local f=io.open(root.."/url.tmi")
- if f then
- for line in f:lines() do
- if line then
- if find(line,"^[%%#%-]") then
- elseif find(line,"^zip://") then
- if trace_locating then
- report_mounts("mounting %a",line)
- end
- table.insert(resolvers.automounted,line)
- resolvers.usezipfile(line)
- end
- end
- end
- f:close()
- end
- end
- resolvers.stoptiming()
- end
-end
+local findfile=resolvers.findfile
statistics.register("used config file",function() return caches.configfiles() end)
statistics.register("used cache path",function() return caches.usedpaths() end)
function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner)
@@ -23895,9 +24393,11 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner)
local luvdata={
enginebanner=enginebanner,
formatbanner=formatbanner,
- sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"),
+ sourcehash=md5.hex(io.loaddata(findfile(sourcefile)) or "unknown"),
sourcefile=sourcefile,
luaversion=LUAVERSION,
+ formatid=LUATEXFORMATID,
+ functionality=LUATEXFUNCTIONALITY,
}
io.savedata(luvname,table.serialize(luvdata,true))
lua.registerfinalizer(function()
@@ -23917,7 +24417,7 @@ function statistics.checkfmtstatus(texname)
if lfs.isfile(luvname) then
local luv=dofile(luvname)
if luv and luv.sourcefile then
- local sourcehash=md5.hex(io.loaddata(resolvers.findfile(luv.sourcefile)) or "unknown")
+ local sourcehash=md5.hex(io.loaddata(findfile(luv.sourcefile)) or "unknown")
local luvbanner=luv.enginebanner or "?"
if luvbanner~=enginebanner then
return format("engine mismatch (luv: %s <> bin: %s)",luvbanner,enginebanner)
@@ -23927,8 +24427,19 @@ function statistics.checkfmtstatus(texname)
return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash)
end
local luvluaversion=luv.luaversion or 0
- if luvluaversion~=LUAVERSION then
- return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION)
+ local engluaversion=LUAVERSION or 0
+ if luvluaversion~=engluaversion then
+ return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,engluaversion)
+ end
+ local luvfunctionality=luv.functionality or 0
+ local engfunctionality=status.development_id or 0
+ if luvfunctionality~=engfunctionality then
+ return format("functionality mismatch (luv: %s <> bin: %s)",luvfunctionality,engfunctionality)
+ end
+ local luvformatid=luv.formatid or 0
+ local engformatid=status.format_id or 0
+ if luvformatid~=engformatid then
+ return format("formatid mismatch (luv: %s <> bin: %s)",luvformatid,engformatid)
end
else
return "invalid status file"
@@ -23947,7 +24458,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 10263, stripped down to: 7556
+-- original size: 10725, stripped down to: 7949
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -23960,6 +24471,14 @@ local format,find,match=string.format,string.find,string.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_zip=logs.reporter("resolvers","zip")
local resolvers=resolvers
+local findfile=resolvers.findfile
+local registerfile=resolvers.registerfile
+local splitmethod=resolvers.splitmethod
+local prependhash=resolvers.prependhash
+local starttiming=resolvers.starttiming
+local extendtexmf=resolvers.extendtexmfvariable
+local stoptiming=resolvers.stoptiming
+local urlquery=url.query
zip=zip or {}
local zip=zip
local archives=zip.archives or {}
@@ -23974,8 +24493,9 @@ if zipfiles then
closezip=zipfiles.close
validfile=zipfiles.found
wholefile=zipfiles.unzip
+ local listzip=zipfiles.list
traversezip=function(zfile)
- return ipairs(zipfiles.list(zfile))
+ return ipairs(listzip(zfile))
end
local streams=utilities.streams
local openstream=streams.open
@@ -24032,28 +24552,30 @@ local function validzip(str)
return str
end
end
-function zip.openarchive(name)
+local function openarchive(name)
if not name or name=="" then
return nil
else
local arch=archives[name]
if not arch then
- local full=resolvers.findfile(name) or ""
+ local full=findfile(name) or ""
arch=full~="" and openzip(full) or false
archives[name]=arch
end
return arch
end
end
-function zip.closearchive(name)
+local function closearchive(name)
if not name or (name=="" and archives[name]) then
closezip(archives[name])
archives[name]=nil
end
end
+zip.openarchive=openarchive
+zip.closearchive=closearchive
function resolvers.locators.zip(specification)
local archive=specification.filename
- local zipfile=archive and archive~="" and zip.openarchive(archive)
+ local zipfile=archive and archive~="" and openarchive(archive)
if trace_locating then
if zipfile then
report_zip("locator: archive %a found",archive)
@@ -24062,13 +24584,6 @@ function resolvers.locators.zip(specification)
end
end
end
-function resolvers.hashers.zip(specification)
- local archive=specification.filename
- if trace_locating then
- report_zip("loading file %a",archive)
- end
- resolvers.usezipfile(specification.original)
-end
function resolvers.concatinators.zip(zipfile,path,name)
if not path or path=="" then
return format('%s?name=%s',zipfile,name)
@@ -24076,14 +24591,16 @@ function resolvers.concatinators.zip(zipfile,path,name)
return format('%s?name=%s/%s',zipfile,path,name)
end
end
-function resolvers.finders.zip(specification)
+local finders=resolvers.finders
+local notfound=finders.notfound
+function finders.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("finder: archive %a found",archive)
@@ -24104,16 +24621,19 @@ function resolvers.finders.zip(specification)
if trace_locating then
report_zip("finder: %a not found",original)
end
- return resolvers.finders.notfound()
+ return notfound()
end
-function resolvers.openers.zip(specification)
+local openers=resolvers.openers
+local notfound=openers.notfound
+local textopener=openers.helpers.textopener
+function openers.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("opener; archive %a opened",archive)
@@ -24123,7 +24643,7 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: file %a found",queryname)
end
- return resolvers.openers.helpers.textopener('zip',original,handle)
+ return textopener('zip',original,handle)
elseif trace_locating then
report_zip("opener: file %a not found",queryname)
end
@@ -24135,23 +24655,24 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: %a not found",original)
end
- return resolvers.openers.notfound()
+ return notfound()
end
-function resolvers.loaders.zip(specification)
+local loaders=resolvers.loaders
+local notfound=loaders.notfound
+function loaders.zip(specification)
local original=specification.original
local archive=specification.filename
if archive then
- local query=url.query(specification.query)
+ local query=urlquery(specification.query)
local queryname=query.name
if queryname then
- local zfile=zip.openarchive(archive)
+ local zfile=openarchive(archive)
if zfile then
if trace_locating then
report_zip("loader: archive %a opened",archive)
end
local data=wholefile(zfile,queryname)
if data then
- logs.show_load(original)
if trace_locating then
report_zip("loader; file %a loaded",original)
end
@@ -24167,47 +24688,24 @@ function resolvers.loaders.zip(specification)
if trace_locating then
report_zip("loader: %a not found",original)
end
- return resolvers.openers.notfound()
-end
-function resolvers.usezipfile(archive)
- local specification=resolvers.splitmethod(archive)
- local archive=specification.filename
- if archive and not registeredfiles[archive] then
- local z=zip.openarchive(archive)
- if z then
- local tree=url.query(specification.query).tree or ""
- if trace_locating then
- report_zip("registering: archive %a",archive)
- end
- resolvers.starttiming()
- resolvers.prependhash('zip',archive)
- resolvers.extendtexmfvariable(archive)
- registeredfiles[archive]=z
- resolvers.registerfilehash(archive,resolvers.registerzipfile(z,tree))
- resolvers.stoptiming()
- elseif trace_locating then
- report_zip("registering: unknown archive %a",archive)
- end
- elseif trace_locating then
- report_zip("registering: archive %a not found",archive)
- end
+ return notfound()
end
-function resolvers.registerzipfile(z,tree)
+local function registerzipfile(z,tree)
local names={}
local files={}
local remap={}
local n=0
local filter=tree=="" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
- local register=resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
+ starttiming()
for i in traversezip(z) do
local filename=i.filename
local path,name=match(filename,filter)
if not path then
n=n+1
- register(names,filename,"")
+ registerfile(names,filename,"")
local usedname=lower(filename)
files[usedname]=""
if usedname~=filename then
@@ -24224,12 +24722,43 @@ function resolvers.registerzipfile(z,tree)
else
end
end
+ stoptiming()
report_zip("registering: %s files registered",n)
return {
files=files,
remap=remap,
}
end
+local function usezipfile(archive)
+ local specification=splitmethod(archive)
+ local archive=specification.filename
+ if archive and not registeredfiles[archive] then
+ local z=openarchive(archive)
+ if z then
+ local tree=urlquery(specification.query).tree or ""
+ if trace_locating then
+ report_zip("registering: archive %a",archive)
+ end
+ prependhash('zip',archive)
+ extendtexmf(archive)
+ registeredfiles[archive]=z
+ registerfilehash(archive,registerzipfile(z,tree))
+ elseif trace_locating then
+ report_zip("registering: unknown archive %a",archive)
+ end
+ elseif trace_locating then
+ report_zip("registering: archive %a not found",archive)
+ end
+end
+resolvers.usezipfile=usezipfile
+resolvers.registerzipfile=registerzipfile
+function resolvers.hashers.zip(specification)
+ local archive=specification.filename
+ if trace_locating then
+ report_zip("loading file %a",archive)
+ end
+ usezipfile(specification.original)
+end
end -- of closure
@@ -24238,7 +24767,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tre"] = package.loaded["data-tre"] or true
--- original size: 8478, stripped down to: 5223
+-- original size: 10802, stripped down to: 6619
if not modules then modules={} end modules ['data-tre']={
version=1.001,
@@ -24247,180 +24776,255 @@ if not modules then modules={} end modules ['data-tre']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local type=type
local find,gsub,lower=string.find,string.gsub,string.lower
-local basename,dirname,joinname=file.basename,file.dirname,file .join
+local basename,dirname,joinname=file.basename,file.dirname,file.join
local globdir,isdir,isfile=dir.glob,lfs.isdir,lfs.isfile
local P,lpegmatch=lpeg.P,lpeg.match
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local report_trees=logs.reporter("resolvers","trees")
local resolvers=resolvers
-local resolveprefix=resolvers.resolve
-local notfound=resolvers.finders.notfound
-local lookup=resolvers.get_from_content
-local collectors={}
-local found={}
-function resolvers.finders.tree(specification)
- local spec=specification.filename
- local okay=found[spec]
- if okay==nil then
- if spec~="" then
- local path=dirname(spec)
- local name=basename(spec)
- if path=="" then
- path="."
- end
- local names=collectors[path]
- if not names then
- local pattern=find(path,"/%*+$") and path or (path.."/*")
- names=globdir(pattern)
- collectors[path]=names
- end
- local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
- for i=1,#names do
- local fullname=names[i]
- if find(fullname,pattern) then
- found[spec]=fullname
- return fullname
- end
- end
- local pattern=lower(pattern)
- for i=1,#names do
- local fullname=lower(names[i])
- if find(fullname,pattern) then
- if isfile(fullname) then
+local finders=resolvers.finders
+local openers=resolvers.openers
+local loaders=resolvers.loaders
+local locators=resolvers.locators
+local hashers=resolvers.hashers
+local generators=resolvers.generators
+do
+ local collectors={}
+ local found={}
+ local notfound=finders.notfound
+ function finders.tree(specification)
+ local spec=specification.filename
+ local okay=found[spec]
+ if okay==nil then
+ if spec~="" then
+ local path=dirname(spec)
+ local name=basename(spec)
+ if path=="" then
+ path="."
+ end
+ local names=collectors[path]
+ if not names then
+ local pattern=find(path,"/%*+$") and path or (path.."/*")
+ names=globdir(pattern)
+ collectors[path]=names
+ end
+ local pattern="/"..gsub(name,"([%.%-%+])","%%%1").."$"
+ for i=1,#names do
+ local fullname=names[i]
+ if find(fullname,pattern) then
found[spec]=fullname
return fullname
- else
- break
+ end
+ end
+ local pattern=lower(pattern)
+ for i=1,#names do
+ local fullname=lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec]=fullname
+ return fullname
+ else
+ break
+ end
end
end
end
+ okay=notfound()
+ found[spec]=okay
end
- okay=notfound()
- found[spec]=okay
+ return okay
end
- return okay
end
-function resolvers.locators.tree(specification)
- local name=specification.filename
- local realname=resolveprefix(name)
- if realname and realname~='' and isdir(realname) then
- if trace_locating then
- report_trees("locator %a found",realname)
+do
+ local resolveprefix=resolvers.resolve
+ local appendhash=resolvers.appendhash
+ local function dolocate(specification)
+ local name=specification.filename
+ local realname=resolveprefix(name)
+ if realname and realname~='' and isdir(realname) then
+ if trace_locating then
+ report_trees("locator %a found",realname)
+ end
+ appendhash('tree',name,false)
+ elseif trace_locating then
+ report_trees("locator %a not found",name)
end
- resolvers.appendhash('tree',name,false)
- elseif trace_locating then
- report_trees("locator %a not found",name)
end
+ locators.tree=dolocate
+ locators.dirlist=dolocate
+ locators.dirfile=dolocate
end
-function resolvers.hashers.tree(specification)
- local name=specification.filename
- if trace_locating then
- report_trees("analyzing %a",name)
- end
- resolvers.methodhandler("hashers",name)
- resolvers.generators.file(specification)
-end
-local collectors={}
-local splitter=lpeg.splitat("/**/")
-local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
-table.setmetatableindex(collectors,function(t,k)
- local rootname=lpegmatch(stripper,k)
- local dataname=joinname(rootname,"dirlist")
- local content=caches.loadcontent(dataname,"files",dataname)
- if not content then
- content=resolvers.scanfiles(rootname,nil,nil,false,true)
- caches.savecontent(dataname,"files",content,dataname)
- end
- t[k]=content
- return content
-end)
-local function checked(root,p,n)
- if p then
- if type(p)=="table" then
- for i=1,#p do
- local fullname=joinname(root,p[i],n)
+do
+ local filegenerator=generators.file
+ generators.dirlist=filegenerator
+ generators.dirfile=filegenerator
+end
+do
+ local filegenerator=generators.file
+ local methodhandler=resolvers.methodhandler
+ local function dohash(specification)
+ local name=specification.filename
+ if trace_locating then
+ report_trees("analyzing %a",name)
+ end
+ methodhandler("hashers",name)
+ filegenerator(specification)
+ end
+ hashers.tree=dohash
+ hashers.dirlist=dohash
+ hashers.dirfile=dohash
+end
+local resolve do
+ local collectors={}
+ local splitter=lpeg.splitat("/**/")
+ local stripper=lpeg.replacer { [P("/")*P("*")^1*P(-1)]="" }
+ local loadcontent=caches.loadcontent
+ local savecontent=caches.savecontent
+ local notfound=finders.notfound
+ local scanfiles=resolvers.scanfiles
+ local lookup=resolvers.get_from_content
+ table.setmetatableindex(collectors,function(t,k)
+ local rootname=lpegmatch(stripper,k)
+ local dataname=joinname(rootname,"dirlist")
+ local content=loadcontent(dataname,"files",dataname)
+ if not content then
+ content=scanfiles(rootname,nil,nil,false,true)
+ savecontent(dataname,"files",content,dataname)
+ end
+ t[k]=content
+ return content
+ end)
+ local function checked(root,p,n)
+ if p then
+ if type(p)=="table" then
+ for i=1,#p do
+ local fullname=joinname(root,p[i],n)
+ if isfile(fullname) then
+ return fullname
+ end
+ end
+ else
+ local fullname=joinname(root,p,n)
if isfile(fullname) then
return fullname
end
end
- else
- local fullname=joinname(root,p,n)
- if isfile(fullname) then
- return fullname
- end
end
+ return notfound()
end
- return notfound()
-end
-local function resolve(specification)
- local filename=specification.filename
- if filename~="" then
- local root,rest=lpegmatch(splitter,filename)
- if root and rest then
- local path,name=dirname(rest),basename(rest)
- if name~=rest then
- local content=collectors[root]
- local p,n=lookup(content,name)
- if not p then
- return notfound()
- end
- local pattern=".*/"..path.."$"
- local istable=type(p)=="table"
- if istable then
- for i=1,#p do
- local pi=p[i]
- if pi==path or find(pi,pattern) then
- local fullname=joinname(root,pi,n)
- if isfile(fullname) then
- return fullname
+ resolve=function(specification)
+ local filename=specification.filename
+ if filename~="" then
+ local root,rest=lpegmatch(splitter,filename)
+ if root and rest then
+ local path,name=dirname(rest),basename(rest)
+ if name~=rest then
+ local content=collectors[root]
+ local p,n=lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern=".*/"..path.."$"
+ local istable=type(p)=="table"
+ if istable then
+ for i=1,#p do
+ local pi=p[i]
+ if pi==path or find(pi,pattern) then
+ local fullname=joinname(root,pi,n)
+ if isfile(fullname) then
+ return fullname
+ end
end
end
+ elseif p==path or find(p,pattern) then
+ local fullname=joinname(root,p,n)
+ if isfile(fullname) then
+ return fullname
+ end
end
- elseif p==path or find(p,pattern) then
- local fullname=joinname(root,p,n)
- if isfile(fullname) then
- return fullname
+ local queries=specification.queries
+ if queries and queries.option=="fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
end
end
- local queries=specification.queries
- if queries and queries.option=="fileonly" then
- return checked(root,p,n)
- else
- return notfound()
- end
+ end
+ local path=dirname(filename)
+ local name=basename(filename)
+ local root=lpegmatch(stripper,path)
+ local content=collectors[path]
+ local p,n=lookup(content,name)
+ if p then
+ return checked(root,p,n)
end
end
- local path,name=dirname(filename),basename(filename)
- local root=lpegmatch(stripper,path)
- local content=collectors[path]
- local p,n=lookup(content,name)
- if p then
- return checked(root,p,n)
+ return notfound()
+ end
+ finders.dirlist=resolve
+ function finders.dirfile(specification)
+ local queries=specification.queries
+ if queries then
+ queries.option="fileonly"
+ else
+ specification.queries={ option="fileonly" }
end
+ return resolve(specification)
end
- return notfound()
end
-resolvers.finders .dirlist=resolve
-resolvers.locators .dirlist=resolvers.locators .tree
-resolvers.hashers .dirlist=resolvers.hashers .tree
-resolvers.generators.dirlist=resolvers.generators.file
-resolvers.openers .dirlist=resolvers.openers .file
-resolvers.loaders .dirlist=resolvers.loaders .file
-function resolvers.finders.dirfile(specification)
- local queries=specification.queries
- if queries then
- queries.option="fileonly"
- else
- specification.queries={ option="fileonly" }
+do
+ local fileopener=openers.file
+ local fileloader=loaders.file
+ openers.dirlist=fileopener
+ loaders.dirlist=fileloader
+ openers.dirfile=fileopener
+ loaders.dirfile=fileloader
+end
+do
+ local hashfile="dirhash.lua"
+ local kind="HASH256"
+ local version=1.0
+ local loadtable=table.load
+ local savetable=table.save
+ local loaddata=io.loaddata
+ function resolvers.dirstatus(patterns)
+ local t=type(patterns)
+ if t=="string" then
+ patterns={ patterns }
+ elseif t~="table" then
+ return false
+ end
+ local status=loadtable(hashfile)
+ if not status or status.version~=version or status.kind~=kind then
+ status={
+ version=1.0,
+ kind=kind,
+ hashes={},
+ }
+ end
+ local hashes=status.hashes
+ local changed={}
+ local action=sha2[kind]
+ local update={}
+ for i=1,#patterns do
+ local pattern=patterns[i]
+ local files=globdir(pattern)
+ for i=1,#files do
+ local name=files[i]
+ local hash=action(loaddata(name))
+ if hashes[name]~=hash then
+ changed[#changed+1]=name
+ end
+ update[name]=hash
+ end
+ end
+ status.hashes=update
+ savetable(hashfile,status)
+ return #changed>0 and changed or false
end
- return resolve(specification)
end
-resolvers.locators .dirfile=resolvers.locators .dirlist
-resolvers.hashers .dirfile=resolvers.hashers .dirlist
-resolvers.generators.dirfile=resolvers.generators.dirlist
-resolvers.openers .dirfile=resolvers.openers .dirlist
-resolvers.loaders .dirfile=resolvers.loaders .dirlist
end -- of closure
@@ -24429,7 +25033,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-sch"] = package.loaded["data-sch"] or true
--- original size: 6753, stripped down to: 5268
+-- original size: 6945, stripped down to: 5408
if not modules then modules={} end modules ['data-sch']={
version=1.001,
@@ -24439,8 +25043,11 @@ if not modules then modules={} end modules ['data-sch']={
license="see context related readme files"
}
local load,tonumber=load,tonumber
-local gsub,concat,format=string.gsub,table.concat,string.format
+local gsub,format=string.gsub,string.format
+local sortedhash,concat=table.sortedhash,table.concat
local finders,openers,loaders=resolvers.finders,resolvers.openers,resolvers.loaders
+local addsuffix,suffix,splitbase=file.addsuffix,file.suffix,file.splitbase
+local md5hex=md5.hex
local trace_schemes=false trackers.register("resolvers.schemes",function(v) trace_schemes=v end)
local report_schemes=logs.reporter("resolvers","schemes")
local http=require("socket.http")
@@ -24457,7 +25064,7 @@ function cleaners.none(specification)
return specification.original
end
function cleaners.strip(specification)
- local path,name=file.splitbase(specification.original)
+ local path,name=splitbase(specification.original)
if path=="" then
return (gsub(name,"[^%a%d%.]+","-"))
else
@@ -24465,7 +25072,7 @@ function cleaners.strip(specification)
end
end
function cleaners.md5(specification)
- return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
+ return addsuffix(md5hex(specification.original),suffix(specification.path))
end
local cleaner=cleaners.strip
directives.register("schemes.cleanmethod",function(v) cleaner=cleaners[v] or cleaners.strip end)
@@ -24485,7 +25092,7 @@ local runner=sandbox.registerrunner {
name="curl resolver",
method="execute",
program="curl",
- template="--silent --insecure --create-dirs --output %cachename% %original%",
+ template='--silent --insecure --create-dirs --output "%cachename%" "%original%"',
checkers={
cachename="cache",
original="url",
@@ -24556,10 +25163,10 @@ end
schemes.install=install
local function http_handler(specification,cachename)
local tempname=cachename..".tmp"
- local f=io.open(tempname,"wb")
+ local handle=io.open(tempname,"wb")
local status,message=http.request {
url=specification.original,
- sink=ltn12.sink.file(f)
+ sink=ltn12.sink.file(handle)
}
if not status then
os.remove(tempname)
@@ -24574,13 +25181,13 @@ install('https')
install('ftp')
statistics.register("scheme handling time",function()
local l,r,nl,nr={},{},0,0
- for k,v in table.sortedhash(loaded) do
+ for k,v in sortedhash(loaded) do
if v>0 then
nl=nl+1
l[nl]=k..":"..v
end
end
- for k,v in table.sortedhash(reused) do
+ for k,v in sortedhash(reused) do
if v>0 then
nr=nr+1
r[nr]=k..":"..v
@@ -24588,10 +25195,10 @@ statistics.register("scheme handling time",function()
end
local n=nl+nr
if n>0 then
- l=nl>0 and concat(l) or "none"
- r=nr>0 and concat(r) or "none"
+ if nl==0 then l={ "none" } end
+ if nr==0 then r={ "none" } end
return format("%s seconds, %s processed, threshold %s seconds, loaded: %s, reused: %s",
- statistics.elapsedtime(schemes),n,threshold,l,r)
+ statistics.elapsedtime(schemes),n,threshold,concat(l," "),concat(l," "))
else
return nil
end
@@ -24624,7 +25231,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lua"] = package.loaded["data-lua"] or true
--- original size: 4207, stripped down to: 3041
+-- original size: 4227, stripped down to: 3049
if not modules then modules={} end modules ['data-lua']={
version=1.001,
@@ -24634,8 +25241,7 @@ if not modules then modules={} end modules ['data-lua']={
license="see context related readme files"
}
local package,lpeg=package,lpeg
-local gsub=string.gsub
-local concat=table.concat
+local loadfile=loadfile
local addsuffix=file.addsuffix
local P,S,Cs,lpegmatch=lpeg.P,lpeg.S,lpeg.Cs,lpeg.match
local luasuffixes={ 'tex','lua' }
@@ -24646,6 +25252,8 @@ local helpers=package.helpers or {}
local methods=helpers.methods or {}
local resolvers=resolvers
local resolveprefix=resolvers.resolve
+local expandedpaths=resolvers.expandedpathlistfromvariable
+local findfile=resolvers.findfile
helpers.report=logs.reporter("resolvers","libraries")
trackers.register("resolvers.libraries",function(v) helpers.trace=v end)
trackers.register("resolvers.locating",function(v) helpers.trace=v end)
@@ -24674,7 +25282,7 @@ local function getluaformatpaths()
if not luaformatpaths then
luaformatpaths={}
for i=1,#luaformats do
- registerpath("lua format","lua",luaformatpaths,resolvers.expandedpathlistfromvariable(luaformats[i]))
+ registerpath("lua format","lua",luaformatpaths,expandedpaths(luaformats[i]))
end
end
return luaformatpaths
@@ -24683,7 +25291,7 @@ local function getlibformatpaths()
if not libformatpaths then
libformatpaths={}
for i=1,#libformats do
- registerpath("lib format","lib",libformatpaths,resolvers.expandedpathlistfromvariable(libformats[i]))
+ registerpath("lib format","lib",libformatpaths,expandedpaths(libformats[i]))
end
end
return libformatpaths
@@ -24693,7 +25301,7 @@ local function loadedbyformat(name,rawname,suffixes,islib,what)
local report=helpers.report
for i=1,#suffixes do
local format=suffixes[i]
- local resolved=resolvers.findfile(name,format) or ""
+ local resolved=findfile(name,format) or ""
if trace then
report("%s format, identifying %a using format %a",what,name,format)
end
@@ -24731,7 +25339,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-aux"] = package.loaded["data-aux"] or true
--- original size: 2452, stripped down to: 1877
+-- original size: 2610, stripped down to: 2019
if not modules then modules={} end modules ['data-aux']={
version=1.001,
@@ -24742,24 +25350,28 @@ if not modules then modules={} end modules ['data-aux']={
}
local find=string.find
local type,next=type,next
+local addsuffix,removesuffix=file.addsuffix,file.removesuffix
+local loaddata,savedata=io.loaddata,io.savedata
local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end)
local resolvers=resolvers
+local cleanpath=resolvers.cleanpath
+local findfiles=resolvers.findfiles
local report_scripts=logs.reporter("resolvers","scripts")
function resolvers.updatescript(oldname,newname)
local scriptpath="context/lua"
- newname=file.addsuffix(newname,"lua")
- local oldscript=resolvers.cleanpath(oldname)
+ local oldscript=cleanpath(oldname)
+ local newname=addsuffix(newname,"lua")
+ local newscripts=findfiles(newname) or {}
if trace_locating then
report_scripts("to be replaced old script %a",oldscript)
end
- local newscripts=resolvers.findfiles(newname) or {}
if #newscripts==0 then
if trace_locating then
report_scripts("unable to locate new script")
end
else
for i=1,#newscripts do
- local newscript=resolvers.cleanpath(newscripts[i])
+ local newscript=cleanpath(newscripts[i])
if trace_locating then
report_scripts("checking new script %a",newscript)
end
@@ -24771,17 +25383,17 @@ function resolvers.updatescript(oldname,newname)
if trace_locating then
report_scripts("new script should come from %a",scriptpath)
end
- elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
+ elseif not (find(oldscript,removesuffix(newname).."$") or find(oldscript,newname.."$")) then
if trace_locating then
report_scripts("invalid new script name")
end
else
- local newdata=io.loaddata(newscript)
+ local newdata=loaddata(newscript)
if newdata then
if trace_locating then
report_scripts("old script content replaced by new content: %s",oldscript)
end
- io.savedata(oldscript,newdata)
+ savedata(oldscript,newdata)
break
elseif trace_locating then
report_scripts("unable to load new script")
@@ -24854,7 +25466,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-lst"] = package.loaded["data-lst"] or true
--- original size: 1823, stripped down to: 1542
+-- original size: 2038, stripped down to: 1696
if not modules then modules={} end modules ['data-lst']={
version=1.001,
@@ -24864,15 +25476,22 @@ if not modules then modules={} end modules ['data-lst']={
license="see context related readme files"
}
local type=type
-local concat,sortedhash=table.concat,table.sortedhash
+local sortedhash=table.sortedhash
+local isdir=lfs.isdir
local resolvers=resolvers
local listers=resolvers.listers or {}
resolvers.listers=listers
local resolveprefix=resolvers.resolve
+local configurationfiles=resolvers.configurationfiles
+local expandedpathfromlist=resolvers.expandedpathfromlist
+local splitpath=resolvers.splitpath
+local knownvariables=resolvers.knownvariables
local report_lists=logs.reporter("resolvers","lists")
local report_resolved=logs.reporter("system","resolved")
local function tabstr(str)
- if type(str)=='table' then
+ if not str then
+ return "unset"
+ elseif type(str)=='table' then
return concat(str," | ")
else
return str
@@ -24882,22 +25501,22 @@ function listers.variables(pattern)
local result=resolvers.knownvariables(pattern)
for key,value in sortedhash(result) do
report_lists(key)
- report_lists(" env: %s",tabstr(value.environment or "unset"))
- report_lists(" var: %s",tabstr(value.variable or "unset"))
- report_lists(" exp: %s",tabstr(value.expansion or "unset"))
- report_lists(" res: %s",tabstr(value.resolved or "unset"))
+ report_lists(" env: %s",tabstr(value.environment))
+ report_lists(" var: %s",tabstr(value.variable))
+ report_lists(" exp: %s",tabstr(value.expansion))
+ report_lists(" res: %s",tabstr(value.resolved))
end
end
function listers.configurations()
- local configurations=resolvers.configurationfiles()
+ local configurations=configurationfiles()
for i=1,#configurations do
report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
- local list=resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
+ local list=expandedpathfromlist(splitpath(resolvers.luacnfspec))
for i=1,#list do
local li=resolveprefix(list[i])
- if lfs.isdir(li) then
+ if isdir(li) then
report_resolved("path - %s",li)
else
report_resolved("path + %s",li)
@@ -24910,318 +25529,147 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-package.loaded["util-lib"] = package.loaded["util-lib"] or true
+package.loaded["libs-ini"] = package.loaded["libs-ini"] or true
--- original size: 16094, stripped down to: 8443
+-- original size: 5822, stripped down to: 3629
-if not modules then modules={} end modules ['util-lib']={
+if not modules then modules={} end modules ['libs-ini']={
version=1.001,
comment="companion to luat-lib.mkiv",
author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright="PRAGMA ADE / ConTeXt Development Team",
- license="see context related readme files",
+ license="see context related readme files"
}
+local type,unpack=type,unpack
local type=type
-local next=next
-local pcall=pcall
-local gsub=string.gsub
-local find=string.find
-local sort=table.sort
-local pathpart=file.pathpart
local nameonly=file.nameonly
local joinfile=file.join
-local removesuffix=file.removesuffix
local addsuffix=file.addsuffix
-local findfile=resolvers.findfile
-local findfiles=resolvers.findfiles
-local expandpaths=resolvers.expandedpathlistfromvariable
local qualifiedpath=file.is_qualified_path
local isfile=lfs.isfile
-local done=false
-local function locate(required,version,trace,report,action)
- if type(required)~="string" then
- report("provide a proper library name")
- return
- end
- if trace then
- report("requiring library %a with version %a",required,version or "any")
- end
- local found_library=nil
- local required_full=gsub(required,"%.","/")
- local required_path=pathpart(required_full)
- local required_base=nameonly(required_full)
- if qualifiedpath(required) then
- if isfile(addsuffix(required,os.libsuffix)) then
- if trace then
- report("qualified name %a found",required)
+local findfile=resolvers.findfile
+local expandpaths=resolvers.expandedpathlistfromvariable
+local report=logs.reporter("resolvers","libraries")
+local trace=false
+trackers.register("resolvers.lib",function(v) trace=v end)
+local function findlib(required)
+ local suffix=os.libsuffix or "so"
+ if not qualifiedpath(required) then
+ local list=directives.value("system.librarynames" )
+ local only=nameonly(required)
+ if type(list)=="table" then
+ list=list[only]
+ if type(list)~="table" then
+ list={ only }
end
- found_library=required
else
- if trace then
- report("qualified name %a not found",required)
- end
+ list={ only }
end
- else
- local required_name=required_base.."."..os.libsuffix
- local version=type(version)=="string" and version~="" and version or false
- local engine="luatex"
- if trace and not done then
- local list=expandpaths("lib")
- for i=1,#list do
- report("tds path %i: %s",i,list[i])
- end
- end
- local function found(locate,asked_library,how,...)
- if trace then
- report("checking %s: %a",how,asked_library)
- end
- return locate(asked_library,...)
+ if trace then
+ report("using lookup list for library %a: % | t",only,list)
end
- local function check(locate,...)
- local found=nil
- if version then
- local asked_library=joinfile(required_path,version,required_name)
- if trace then
- report("checking %s: %a","with version",asked_library)
- end
- found=locate(asked_library,...)
+ for i=1,#list do
+ local name=list[i]
+ local found=findfile(name,"lib")
+ if not found then
+ found=findfile(addsuffix(name,suffix),"lib")
end
- if not found or found=="" then
- local asked_library=joinfile(required_path,required_name)
+ if found then
if trace then
- report("checking %s: %a","with version",asked_library)
+ report("library %a resolved via %a path to %a",name,"tds lib",found)
end
- found=locate(asked_library,...)
- end
- return found and found~="" and found or false
- end
- local function attempt(checkpattern)
- if trace then
- report("checking tds lib paths strictly")
- end
- local found=findfile and check(findfile,"lib")
- if found and (not checkpattern or find(found,checkpattern)) then
return found
end
- if trace then
- report("checking tds lib paths with wildcard")
- end
- local asked_library=joinfile(required_path,".*",required_name)
- if trace then
- report("checking %s: %a","latest version",asked_library)
- end
- local list=findfiles(asked_library,"lib",true)
- if list and #list>0 then
- sort(list)
- local found=list[#list]
- if found and (not checkpattern or find(found,checkpattern)) then
- return found
- end
- end
- if trace then
- report("checking lib paths")
- end
- package.extralibpath(environment.ownpath)
- local paths=package.libpaths()
- local pattern="/[^/]+%."..os.libsuffix.."$"
- for i=1,#paths do
- required_path=gsub(paths[i],pattern,"")
- local found=check(lfs.isfound)
- if type(found)=="string" and (not checkpattern or find(found,checkpattern)) then
- return found
- end
- end
- return false
end
- if engine then
- if trace then
- report("attemp 1, engine %a",engine)
- end
- found_library=attempt("/"..engine.."/")
- if not found_library then
- if trace then
- report("attemp 2, no engine",asked_library)
+ if expandpaths then
+ local list=expandpaths("PATH")
+ local base=addsuffix(only,suffix)
+ for i=1,#list do
+ local full=joinfile(list[i],base)
+ local found=isfile(full) and full
+ if found then
+ if trace then
+ report("library %a resolved via %a path to %a",name,"system",found)
+ end
+ return found
end
- found_library=attempt()
end
- else
- found_library=attempt()
end
- end
- if not found_library then
+ elseif isfile(addsuffix(required,suffix)) then
if trace then
- report("not found: %a",required)
+ report("library with qualified name %a %sfound",required,"")
end
- library=false
+ return required
else
if trace then
- report("found: %a",found_library)
- end
- local result,message=action(found_library,required_base)
- if result then
- library=result
- else
- library=false
- report("load error: message %a, library %a",tostring(message or "unknown"),found_library or "no library")
+ report("library with qualified name %a %sfound",required,"not ")
end
end
- if trace then
- if not library then
- report("unknown library: %a",required)
- else
- report("stored library: %a",required)
- end
- end
- return library or nil
+ return false
end
-do
- local report_swiglib=logs.reporter("swiglib")
- local trace_swiglib=false
- local savedrequire=require
- local loadedlibs={}
- local loadlib=package.loadlib
- local pushdir=dir.push
- local popdir=dir.pop
- trackers.register("resolvers.swiglib",function(v) trace_swiglib=v end)
- function requireswiglib(required,version)
- local library=loadedlibs[library]
- if library==nil then
- local trace_swiglib=trace_swiglib or package.helpers.trace
- library=locate(required,version,trace_swiglib,report_swiglib,function(name,base)
- pushdir(pathpart(name))
- local opener="luaopen_"..base
- if trace_swiglib then
- report_swiglib("opening: %a with %a",name,opener)
- end
- local library,message=loadlib(name,opener)
- local libtype=type(library)
- if libtype=="function" then
- library=library()
+local foundlibraries=table.setmetatableindex(function(t,k)
+ local v=findlib(k)
+ t[k]=v
+ return v
+end)
+function resolvers.findlib(required)
+ return foundlibraries[required]
+end
+local libraries={}
+resolvers.libraries=libraries
+local report=logs.reporter("optional")
+if optional then optional.loaded={} end
+function libraries.validoptional(name)
+ local thelib=optional and optional[name]
+ if not thelib then
+ elseif thelib.initialize then
+ return thelib
+ else
+ report("invalid optional library %a",libname)
+ end
+end
+function libraries.optionalloaded(name,libnames)
+ local thelib=optional and optional[name]
+ if not thelib then
+ report("no optional %a library found",name)
+ else
+ local thelib_initialize=thelib.initialize
+ if not thelib_initialize then
+ report("invalid optional library %a",name)
+ else
+ if type(libnames)=="string" then
+ libnames={ libnames }
+ end
+ if type(libnames)=="table" then
+ for i=1,#libnames do
+ local libname=libnames[i]
+ local filename=foundlibraries[libname]
+ if filename then
+ libnames[i]=filename
+ else
+ report("unable to locate library %a",libname)
+ return
+ end
+ end
+ local initialized=thelib_initialize(unpack(libnames))
+ if initialized then
+ report("using library '% + t'",libnames)
else
- report_swiglib("load error: %a returns %a, message %a, library %a",opener,libtype,(string.gsub(message or "no message","[%s]+$","")),found_library or "no library")
- library=false
+ report("unable to initialize library '% + t'",libnames)
end
- popdir()
- return library
- end)
- loadedlibs[required]=library or false
- end
- return library
- end
- function require(name,version)
- if find(name,"^swiglib%.") then
- return requireswiglib(name,version)
- else
- return savedrequire(name)
- end
- end
- local swiglibs={}
- local initializer="core"
- function swiglib(name,version)
- local library=swiglibs[name]
- if not library then
- statistics.starttiming(swiglibs)
- if trace_swiglib then
- report_swiglib("loading %a",name)
- end
- if not find(name,"%."..initializer.."$") then
- fullname="swiglib."..name.."."..initializer
- else
- fullname="swiglib."..name
+ return initialized
end
- library=requireswiglib(fullname,version)
- swiglibs[name]=library
- statistics.stoptiming(swiglibs)
end
- return library
end
- statistics.register("used swiglibs",function()
- if next(swiglibs) then
- return string.format("%s, initial load time %s seconds",table.concat(table.sortedkeys(swiglibs)," "),statistics.elapsedtime(swiglibs))
- end
- end)
end
if FFISUPPORTED and ffi and ffi.load then
- local report_ffilib=logs.reporter("ffilib")
- local trace_ffilib=false
- local savedffiload=ffi.load
- trackers.register("resolvers.ffilib",function(v) trace_ffilib=v end)
- local loaded={}
- local function locateindeed(name)
- name=removesuffix(name)
- local l=loaded[name]
- if l==nil then
- local state,library=pcall(savedffiload,name)
- if type(library)=="userdata" then
- l=library
- elseif type(state)=="userdata" then
- l=state
- else
- l=false
- end
- loaded[name]=l
- elseif trace_ffilib then
- report_ffilib("reusing already loaded %a",name)
- end
- return l
- end
- local function getlist(required)
- local list=directives.value("system.librarynames" )
- if type(list)=="table" then
- list=list[required]
- if type(list)=="table" then
- if trace then
- report("using lookup list for library %a: % | t",required,list)
- end
- return list
- end
- end
- return { required }
- end
- function ffilib(name,version)
- name=removesuffix(name)
- local l=loaded[name]
- if l~=nil then
- if trace_ffilib then
- report_ffilib("reusing already loaded %a",name)
- end
- return l
- end
- local list=getlist(name)
- if version=="system" then
- for i=1,#list do
- local library=locateindeed(list[i])
- if type(library)=="userdata" then
- return library
- end
- end
- else
- for i=1,#list do
- local library=locate(list[i],version,trace_ffilib,report_ffilib,locateindeed)
- if type(library)=="userdata" then
- return library
- end
- end
- end
- end
+ local ffiload=ffi.load
function ffi.load(name)
- local list=getlist(name)
- for i=1,#list do
- local library=ffilib(list[i])
- if type(library)=="userdata" then
- return library
- end
- end
- if trace_ffilib then
- report_ffilib("trying to load %a using normal loader",name)
- end
- for i=1,#list do
- local state,library=pcall(savedffiload,list[i])
- if type(library)=="userdata" then
- return library
- elseif type(state)=="userdata" then
- return library
- end
+ local full=name and foundlibraries[name]
+ if full then
+ return ffiload(full)
+ else
+ return ffiload(name)
end
end
end
@@ -25336,7 +25784,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 9637, stripped down to: 7253
+-- original size: 13964, stripped down to: 10026
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -25350,16 +25798,14 @@ local concat=table.concat
local quoted=string.quoted
local luasuffixes=utilities.lua.suffixes
local report_format=logs.reporter("resolvers","formats")
-local function primaryflags()
- local arguments=environment.arguments
+local function primaryflags(arguments)
local flags={}
if arguments.silent then
flags[#flags+1]="--interaction=batchmode"
end
return concat(flags," ")
end
-local function secondaryflags()
- local arguments=environment.arguments
+local function secondaryflags(arguments)
local trackers=arguments.trackers
local directives=arguments.directives
local flags={}
@@ -25381,6 +25827,9 @@ local function secondaryflags()
if arguments.ansi then
flags[#flags+1]="--c:ansi"
end
+ if arguments.ansilog then
+ flags[#flags+1]="--c:ansilog"
+ end
if arguments.strip then
flags[#flags+1]="--c:strip"
end
@@ -25391,12 +25840,13 @@ local function secondaryflags()
end
local template=[[--ini %primaryflags% --lua=%luafile% %texfile% %secondaryflags% %dump% %redirect%]]
local checkers={
- primaryflags="string",
- secondaryflags="string",
+ primaryflags="verbose",
+ secondaryflags="verbose",
luafile="readable",
texfile="readable",
redirect="string",
dump="string",
+ binarypath="string",
}
local runners={
luatex=sandbox.registerrunner {
@@ -25421,46 +25871,88 @@ local runners={
reporter=report_format,
},
}
-function environment.make_format(name,arguments)
+local function validbinarypath()
+ if not environment.arguments.nobinarypath then
+ local path=environment.ownpath or file.dirname(environment.ownname)
+ if path and path~="" then
+ path=dir.expandname(path)
+ if path~="" and lfs.isdir(path) then
+ return path
+ end
+ end
+ end
+end
+function environment.make_format(formatname)
+ local arguments=environment.arguments
local engine=environment.ownmain or "luatex"
- local silent=environment.arguments.silent
- local errors=environment.arguments.errors
- local olddir=dir.current()
- local path=caches.getwritablepath("formats",engine) or ""
- if path~="" then
- lfs.chdir(path)
- end
- report_format("using format path %a",dir.current())
- local texsourcename=file.addsuffix(name,"mkiv")
- local fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ local silent=arguments.silent
+ local errors=arguments.errors
+ local texsourcename=""
+ local texsourcepath=""
+ local fulltexsourcename=""
+ if engine=="luametatex" then
+ texsourcename=file.addsuffix(formatname,"mkxl")
+ fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ end
+ if fulltexsourcename=="" then
+ texsourcename=file.addsuffix(formatname,"mkiv")
+ fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
+ end
if fulltexsourcename=="" then
- texsourcename=file.addsuffix(name,"tex")
+ texsourcename=file.addsuffix(formatname,"tex")
fulltexsourcename=resolvers.findfile(texsourcename,"tex") or ""
end
if fulltexsourcename=="" then
- report_format("no tex source file with name %a (mkiv or tex)",name)
- lfs.chdir(olddir)
+ report_format("no tex source file with name %a (mkiv or tex)",formatname)
return
- else
- report_format("using tex source file %a",fulltexsourcename)
end
- local texsourcepath=dir.expandname(file.dirname(fulltexsourcename))
- local specificationname=file.replacesuffix(fulltexsourcename,"lus")
- local fullspecificationname=resolvers.findfile(specificationname,"tex") or ""
- if fullspecificationname=="" then
- specificationname=file.join(texsourcepath,"context.lus")
- fullspecificationname=resolvers.findfile(specificationname,"tex") or ""
+ report_format("using tex source file %a",fulltexsourcename)
+ fulltexsourcename=dir.expandname(fulltexsourcename)
+ texsourcepath=file.dirname(fulltexsourcename)
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
end
+ local specificationname="context.lus"
+ local specificationpath=""
+ local fullspecificationname=resolvers.findfile(specificationname) or ""
if fullspecificationname=="" then
- report_format("unknown stub specification %a",specificationname)
- lfs.chdir(olddir)
+ report_format("unable to locate specification file %a",specificationname)
+ return
+ end
+ report_format("using specification file %a",fullspecificationname)
+ fullspecificationname=dir.expandname(fullspecificationname)
+ specificationpath=file.dirname(fullspecificationname)
+ if texsourcepath~=specificationpath then
+ report_format("tex source file and specification file are on different paths")
+ return
+ end
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
+ end
+ if not lfs.isfile(fullspecificationname) then
+ report_format("no accessible specification file with name %a",fulltexsourcename)
+ return
+ end
+ report_format("using tex source path %a",texsourcepath)
+ local validformatpath=caches.getwritablepath("formats",engine) or ""
+ local startupdir=dir.current()
+ if validformatpath=="" then
+ report_format("invalid format path, insufficient write access")
+ return
+ end
+ local binarypath=validbinarypath()
+ report_format("changing to format path %a",validformatpath)
+ lfs.chdir(validformatpath)
+ if dir.current()~=validformatpath then
+ report_format("unable to change to format path %a",validformatpath)
return
end
- local specificationpath=file.dirname(fullspecificationname)
local usedluastub=nil
local usedlualibs=dofile(fullspecificationname)
if type(usedlualibs)=="string" then
- usedluastub=file.join(file.dirname(fullspecificationname),usedlualibs)
+ usedluastub=file.join(specificationpath,usedlualibs)
elseif type(usedlualibs)=="table" then
report_format("using stub specification %a",fullspecificationname)
local texbasename=file.basename(name)
@@ -25477,48 +25969,57 @@ function environment.make_format(name,arguments)
end
else
report_format("invalid stub specification %a",fullspecificationname)
- lfs.chdir(olddir)
+ lfs.chdir(startupdir)
return
end
+ local runner=runners[engine]
+ if not runner then
+ report_format("the format %a cannot be generated, no runner available for engine %a",name,engine)
+ lfs.chdir(startupdir)
+ return
+ end
+ local primaryflags=primaryflags(arguments)
+ local secondaryflags=secondaryflags(arguments)
local specification={
- primaryflags=primaryflags(),
- secondaryflags=secondaryflags(),
+ binarypath=binarypath,
+ primaryflags=primaryflags,
+ secondaryflags=secondaryflags,
luafile=quoted(usedluastub),
texfile=quoted(fulltexsourcename),
dump=os.platform=="unix" and "\\\\dump" or "\\dump",
}
- local runner=runners[engine]
- if not runner then
- report_format("format %a cannot be generated, no runner available for engine %a",name,engine)
- elseif silent then
- statistics.starttiming()
+ if silent then
specification.redirect="> temp.log"
- local result=runner(specification)
- local runtime=statistics.stoptiming()
- if result~=0 then
- print(format("%s silent make > fatal error when making format %q",engine,name))
- else
- print(format("%s silent make > format %q made in %.3f seconds",engine,name,runtime))
- end
+ end
+ statistics.starttiming()
+ local result=runner(specification)
+ local runtime=statistics.stoptiming()
+ if silent then
os.remove("temp.log")
- else
- runner(specification)
end
- local pattern=file.removesuffix(file.basename(usedluastub)).."-*.mem"
- local mp=dir.glob(pattern)
- if mp then
- for i=1,#mp do
- local name=mp[i]
- report_format("removing related mplib format %a",file.basename(name))
- os.remove(name)
+ report_format()
+ if binarypath and binarypath~="" then
+ report_format("binary path : %s",binarypath or "?")
end
- end
- lfs.chdir(olddir)
+ report_format("format path : %s",validformatpath)
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",usedluastub)
+ if primaryflags~="" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags~="" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("context file : %s",fulltexsourcename)
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result==0 and "okay" or "error")
+ report_format()
+ lfs.chdir(startupdir)
end
-local template=[[%flags% --fmt=%fmtfile% --lua=%luafile% %texfile% %more%]]
+local template=[[%primaryflags% --fmt=%fmtfile% --lua=%luafile% %texfile% %secondaryflags%]]
local checkers={
- flags="string",
- more="string",
+ primaryflags="verbose",
+ secondaryflags="verbose",
fmtfile="readable",
luafile="readable",
texfile="readable",
@@ -25531,6 +26032,13 @@ local runners={
checkers=checkers,
reporter=report_format,
},
+ luametatex=sandbox.registerrunner {
+ name="run luametatex format",
+ program="luametatex",
+ template=template,
+ checkers=checkers,
+ reporter=report_format,
+ },
luajittex=sandbox.registerrunner {
name="run luajittex format",
program="luajittex",
@@ -25539,51 +26047,78 @@ local runners={
reporter=report_format,
},
}
-function environment.run_format(name,data,more)
- if name and name~="" then
- local engine=environment.ownmain or "luatex"
- local barename=file.removesuffix(name)
- local fmtname=caches.getfirstreadablefile(file.addsuffix(barename,"fmt"),"formats",engine)
- if fmtname=="" then
- fmtname=resolvers.findfile(file.addsuffix(barename,"fmt")) or ""
- end
- fmtname=resolvers.cleanpath(fmtname)
- if fmtname=="" then
- report_format("no format with name %a",name)
- else
- local barename=file.removesuffix(name)
- local luaname=file.addsuffix(barename,"luc")
- if not lfs.isfile(luaname) then
- luaname=file.addsuffix(barename,"lua")
- end
- if not lfs.isfile(luaname) then
- report_format("using format name %a",fmtname)
- report_format("no luc/lua file with name %a",barename)
- else
- local runner=runners[engine]
- if not runner then
- report_format("format %a cannot be run, no runner available for engine %a",name,engine)
- else
- runner {
- flags=primaryflags(),
- fmtfile=quoted(barename),
- luafile=quoted(luaname),
- texfile=quoted(data),
- more=more,
- }
- end
- end
- end
+function environment.run_format(formatname,scriptname,filename,primaryflags,secondaryflags,verbose)
+ local engine=environment.ownmain or "luatex"
+ if not formatname or formatname=="" then
+ report_format("missing format name")
+ return
+ end
+ if not scriptname or scriptname=="" then
+ report_format("missing script name")
+ return
+ end
+ if not lfs.isfile(formatname) or not lfs.isfile(scriptname) then
+ formatname,scriptname=resolvers.locateformat(formatname)
end
+ if not formatname or formatname=="" then
+ report_format("invalid format name")
+ return
+ end
+ if not scriptname or scriptname=="" then
+ report_format("invalid script name")
+ return
+ end
+ local runner=runners[engine]
+ if not runner then
+ report_format("format %a cannot be run, no runner available for engine %a",file.nameonly(name),engine)
+ return
+ end
+ if not filename then
+ filename ""
+ end
+ local binarypath=validbinarypath()
+ local specification={
+ binarypath=binarypath,
+ primaryflags=primaryflags or "",
+ secondaryflags=secondaryflags or "",
+ fmtfile=quoted(formatname),
+ luafile=quoted(scriptname),
+ texfile=filename~="" and quoted(filename) or "",
+ }
+ statistics.starttiming()
+ local result=runner(specification)
+ local runtime=statistics.stoptiming()
+ if verbose then
+ report_format()
+ if binarypath and binarypath~="" then
+ report_format("binary path : %s",binarypath)
+ end
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",scriptname)
+ report_format("tex format file : %s",formatname)
+ if filename~="" then
+ report_format("tex input file : %s",filename)
+ end
+ if primaryflags~="" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags~="" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result==0 and "okay" or "error")
+ report_format()
+ end
+ return result
end
end -- of closure
--- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
+-- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua libs-ini.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 1019480
--- stripped bytes : 403728
+-- original bytes : 1038245
+-- stripped bytes : 409841
-- end library merge
@@ -25697,7 +26232,7 @@ local ownlibs = { -- order can be made better
'data-tmf.lua',
'data-lst.lua',
- 'util-lib.lua', -- swiglib
+ 'libs-ini.lua',
'luat-sta.lua',
'luat-fmt.lua',
@@ -25846,7 +26381,7 @@ local helpinfo = [[
<category name="basic">
<subcategory>
<flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag>
- <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag>
+ <flag name="evaluate"><short>run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)</short></flag>
<flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag>
<flag name="resolve"><short>resolve prefixed arguments</short></flag>
<flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag>
@@ -25865,6 +26400,7 @@ local helpinfo = [[
<flag name="stubpath" value="binpath"><short>paths where stubs wil be written</short></flag>
<flag name="windows"><short>create windows (mswin) stubs</short></flag>
<flag name="unix"><short>create unix (linux) stubs</short></flag>
+ <flag name="addbinarypath"><short>prepend the (found) binarypath to runners</short></flag>
</subcategory>
<subcategory>
<flag name="verbose"><short>give a bit more info</short></flag>
@@ -26086,8 +26622,7 @@ end
report()
io.flush()
end
- -- no os.exec because otherwise we get the wrong return value
- local code = os.execute(command) -- maybe spawn
+ local code = os.execute(command)
if code == 0 then
return true
else
@@ -26130,7 +26665,7 @@ function runners.execute_program(fullname)
report()
report()
io.flush()
- local code = os.exec(command) -- (fullname,unpack(after)) does not work / maybe spawn
+ local code = os.execute(command)
return code == 0
end
end
@@ -26517,16 +27052,22 @@ function runners.associate(filename)
end
function runners.evaluate(code,filename) -- for Luigi
+ local environment = table.setmetatableindex(_G)
if code == "loop" then
while true do
- io.write("> ")
+ io.write("lua > ")
local code = io.read()
- if code ~= "" then
+ if code == "quit" or code == "exit" then
+ break
+ elseif code ~= "" then
local temp = string.match(code,"^= (.*)$")
if temp then
- code = "print("..temp..")"
+ code = "inspect("..temp..")"
+ end
+ local compiled, message = load(code,"console","t",environment)
+ if type(compiled) ~= "function" then
+ compiled = load("inspect("..code..")","console","t",environment)
end
- local compiled, message = loadstring(code)
if type(compiled) ~= "function" then
io.write("! " .. (message or code).."\n")
else
@@ -26539,7 +27080,10 @@ function runners.evaluate(code,filename) -- for Luigi
code = filename
end
if code ~= "" then
- local compiled, message = loadstring(code)
+ local compiled, message = load(code,"console","t",environment)
+ if type(compiled) ~= "function" then
+ compiled = load("inspect("..code..")","console","t",environment)
+ end
if type(compiled) ~= "function" then
io.write("invalid lua code: " .. (message or code))
return
@@ -26716,17 +27260,17 @@ do
end
-if e_argument("ansi") then
+-- if e_argument("ansi") or e_argument("ansilog") then
- logs.setformatters("ansi")
+-- logs.setformatters(e_argument("ansi") and "ansi" or "ansilog")
- local script = e_argument("script") or e_argument("scripts")
+-- -- local script = e_argument("script") or e_argument("scripts")
+-- --
+-- -- if type(script) == "string" then
+-- -- logs.writer("]0;"..script.."") -- for Alan to test
+-- -- end
- if type(script) == "string" then
- logs.writer("]0;"..script.."") -- for Alan to test
- end
-
-end
+-- end
if e_argument("script") or e_argument("scripts") then
@@ -26975,11 +27519,11 @@ elseif e_argument("format-path") then
resolvers.load()
report(caches.getwritablepath("format"))
-elseif e_argument("pattern") then
-
- -- luatools
-
- runners.execute_ctx_script("mtx-base","--pattern='" .. e_argument("pattern") .. "'",filename)
+-- elseif e_argument("pattern") then
+--
+-- -- luatools
+--
+-- runners.execute_ctx_script("mtx-base","--pattern='" .. e_argument("pattern") .. "'",filename)
elseif e_argument("generate") then
diff --git a/Master/texmf-dist/tex/context/base/mkii/cont-new.mkii b/Master/texmf-dist/tex/context/base/mkii/cont-new.mkii
index a1981921bed..682160a3608 100644
--- a/Master/texmf-dist/tex/context/base/mkii/cont-new.mkii
+++ b/Master/texmf-dist/tex/context/base/mkii/cont-new.mkii
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2019.03.21 21:39}
+\newcontextversion{2020.02.17 12:06}
%D This file is loaded at runtime, thereby providing an
%D excellent place for hacks, patches, extensions and new
diff --git a/Master/texmf-dist/tex/context/base/mkii/context.mkii b/Master/texmf-dist/tex/context/base/mkii/context.mkii
index a6f8647ee54..bc6869fecc6 100644
--- a/Master/texmf-dist/tex/context/base/mkii/context.mkii
+++ b/Master/texmf-dist/tex/context/base/mkii/context.mkii
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2019.03.21 21:39}
+\edef\contextversion{2020.02.17 12:06}
%D For those who want to use this:
@@ -34,10 +34,7 @@
\ifx\normalinput\undefined \let\normalinput\input \fi
-\def\loadcorefile#1{\normalinput#1\relax}
\def\loadmarkfile#1{\normalinput#1.\mksuffix\relax}
-\def\loadmkiifile#1{\normalinput#1\relax}
-\def\loadmkivfile#1{}
%D First we load the system modules. These implement a lot of
%D manipulation macros. The first one loads \PLAIN\ \TEX, as
diff --git a/Master/texmf-dist/tex/context/base/mkii/grph-trf.mkii b/Master/texmf-dist/tex/context/base/mkii/grph-trf.mkii
index bd9875806b9..68e53d3760b 100644
--- a/Master/texmf-dist/tex/context/base/mkii/grph-trf.mkii
+++ b/Master/texmf-dist/tex/context/base/mkii/grph-trf.mkii
@@ -554,7 +554,7 @@
%D \stopbuffer
%D
%D \typebuffer \getbuffer
-
+
%D Mirroring.
\def\domirrorbox % \hbox/\vbox/\vtop
diff --git a/Master/texmf-dist/tex/context/base/mkii/mult-cs.mkii b/Master/texmf-dist/tex/context/base/mkii/mult-cs.mkii
index 4ab875e4da6..687c2bd4ccb 100644
--- a/Master/texmf-dist/tex/context/base/mkii/mult-cs.mkii
+++ b/Master/texmf-dist/tex/context/base/mkii/mult-cs.mkii
@@ -147,6 +147,7 @@
\setinterfacevariable{comment}{komentar}
\setinterfacevariable{component}{komponenta}
\setinterfacevariable{compressseparator}{compressseparator}
+\setinterfacevariable{compressstopper}{compressstopper}
\setinterfacevariable{concept}{koncept}
\setinterfacevariable{construction}{construction}
\setinterfacevariable{content}{obsah}
@@ -231,8 +232,10 @@
\setinterfacevariable{handwritten}{rukopisne}
\setinterfacevariable{hang}{zaveseni}
\setinterfacevariable{hanging}{visici}
+\setinterfacevariable{hangingboth}{hangingboth}
\setinterfacevariable{head}{hlavicka}
\setinterfacevariable{header}{zahlavi}
+\setinterfacevariable{headintext}{headintext}
\setinterfacevariable{height}{vyska}
\setinterfacevariable{helptext}{textnapovedy}
\setinterfacevariable{hencefore}{vyse}
@@ -373,6 +376,7 @@
\setinterfacevariable{nohz}{nohz}
\setinterfacevariable{noline}{noline}
\setinterfacevariable{nomarking}{zadneznaceni}
+\setinterfacevariable{nomenubar}{nomenubar}
\setinterfacevariable{none}{zadny}
\setinterfacevariable{nonumber}{nonumber}
\setinterfacevariable{norepeat}{norepeat}
@@ -476,6 +480,7 @@
\setinterfacevariable{sectionnumber}{cislooddilu}
\setinterfacevariable{see}{viz}
\setinterfacevariable{selectfont}{selectfont}
+\setinterfacevariable{separator}{separator}
\setinterfacevariable{september}{zari}
\setinterfacevariable{serif}{serif}
\setinterfacevariable{serifbold}{serifbold}
@@ -569,6 +574,7 @@
\setinterfacevariable{temporary}{docasne}
\setinterfacevariable{test}{test}
\setinterfacevariable{text}{text}
+\setinterfacevariable{textnote}{textnote}
\setinterfacevariable{three}{tri}
\setinterfacevariable{thursday}{ctvrtek}
\setinterfacevariable{tight}{tight}
@@ -633,6 +639,7 @@
\setinterfaceconstant{aligntitle}{zarovnejtitul}
\setinterfaceconstant{alternative}{alternativa}
\setinterfaceconstant{anchor}{anchor}
+\setinterfaceconstant{anchoring}{anchoring}
\setinterfaceconstant{andtext}{andtext}
\setinterfaceconstant{apa}{apa}
\setinterfaceconstant{arguments}{arguments}
@@ -729,7 +736,10 @@
\setinterfaceconstant{component}{component}
\setinterfaceconstant{compoundhyphen}{compoundhyphen}
\setinterfaceconstant{compress}{compress}
+\setinterfaceconstant{compressdistance}{compressdistance}
+\setinterfaceconstant{compressmethod}{compressmethod}
\setinterfaceconstant{compressseparator}{compressseparator}
+\setinterfaceconstant{compressstopper}{compressstopper}
\setinterfaceconstant{concerns}{concerns}
\setinterfaceconstant{connector}{connector}
\setinterfaceconstant{continue}{pokracovat}
@@ -859,6 +869,7 @@
\setinterfaceconstant{hfil}{hfil}
\setinterfaceconstant{hidenumber}{hidenumber}
\setinterfaceconstant{hoffset}{hoffset}
+\setinterfaceconstant{horizontal}{horizontalne}
\setinterfaceconstant{horoffset}{horoffset}
\setinterfaceconstant{hyphen}{hyphen}
\setinterfaceconstant{hyphens}{hyphens}
@@ -959,9 +970,12 @@
\setinterfaceconstant{menu}{menu}
\setinterfaceconstant{method}{metoda}
\setinterfaceconstant{middle}{stredni}
+\setinterfaceconstant{middlecolor}{middlecolor}
\setinterfaceconstant{middlecommand}{middlecommand}
\setinterfaceconstant{middlespeech}{middlespeech}
+\setinterfaceconstant{middlestyle}{middlestyle}
\setinterfaceconstant{middletext}{strednitext}
+\setinterfaceconstant{middlewidth}{middlewidth}
\setinterfaceconstant{midsentence}{midsentence}
\setinterfaceconstant{min}{min}
\setinterfaceconstant{mindepth}{mindepth}
@@ -1031,6 +1045,7 @@
\setinterfaceconstant{overprint}{overprint}
\setinterfaceconstant{ownerpassword}{ownerpassword}
\setinterfaceconstant{ownnumber}{vlastnicislo}
+\setinterfaceconstant{packcriterium}{packcriterium}
\setinterfaceconstant{page}{stranka}
\setinterfaceconstant{pageboundaries}{hranicestranky}
\setinterfaceconstant{pagecolor}{barvastranky}
@@ -1040,6 +1055,7 @@
\setinterfaceconstant{pageconversion}{pageconversion}
\setinterfaceconstant{pageconversionset}{pageconversionset}
\setinterfaceconstant{pageleft}{pageleft}
+\setinterfaceconstant{pagemethod}{pagemethod}
\setinterfaceconstant{pagenumber}{cislostranky}
\setinterfaceconstant{pageprefix}{pageprefix}
\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
@@ -1279,6 +1295,7 @@
\setinterfaceconstant{vcompact}{vcompact}
\setinterfaceconstant{vector}{vector}
\setinterfaceconstant{veroffset}{offsethlavicky}
+\setinterfaceconstant{vertical}{vertikalne}
\setinterfaceconstant{vfactor}{vfaktor}
\setinterfaceconstant{vfil}{vfil}
\setinterfaceconstant{viewerprefix}{viewerprefix}
@@ -1289,6 +1306,7 @@
\setinterfaceconstant{white}{bily}
\setinterfaceconstant{width}{sirka}
\setinterfaceconstant{words}{words}
+\setinterfaceconstant{xanchor}{xanchor}
\setinterfaceconstant{xfactor}{xfaktor}
\setinterfaceconstant{xhtml}{xhtml}
\setinterfaceconstant{xmax}{xmax}
@@ -1296,6 +1314,7 @@
\setinterfaceconstant{xoffset}{xoffset}
\setinterfaceconstant{xscale}{xmeritko}
\setinterfaceconstant{xstep}{xkrok}
+\setinterfaceconstant{yanchor}{yanchor}
\setinterfaceconstant{yfactor}{yfaktor}
\setinterfaceconstant{ymax}{ymax}
\setinterfaceconstant{yoffset}{yoffset}
diff --git a/Master/texmf-dist/tex/context/base/mkii/mult-de.mkii b/Master/texmf-dist/tex/context/base/mkii/mult-de.mkii
index 46a2393045c..1690133a5e2 100644
--- a/Master/texmf-dist/tex/context/base/mkii/mult-de.mkii
+++ b/Master/texmf-dist/tex/context/base/mkii/mult-de.mkii
@@ -147,6 +147,7 @@
\setinterfacevariable{comment}{kommentar}
\setinterfacevariable{component}{komponente}
\setinterfacevariable{compressseparator}{compressseparator}
+\setinterfacevariable{compressstopper}{compressstopper}
\setinterfacevariable{concept}{konzept}
\setinterfacevariable{construction}{construction}
\setinterfacevariable{content}{inhalt}
@@ -231,8 +232,10 @@
\setinterfacevariable{handwritten}{handschrift}
\setinterfacevariable{hang}{haengend}
\setinterfacevariable{hanging}{haengend}
+\setinterfacevariable{hangingboth}{hangingboth}
\setinterfacevariable{head}{kopf}
\setinterfacevariable{header}{kopfzeile}
+\setinterfacevariable{headintext}{headintext}
\setinterfacevariable{height}{hoehe}
\setinterfacevariable{helptext}{hilfetext}
\setinterfacevariable{hencefore}{vorher}
@@ -373,6 +376,7 @@
\setinterfacevariable{nohz}{nohz}
\setinterfacevariable{noline}{noline}
\setinterfacevariable{nomarking}{keinebeschriftung}
+\setinterfacevariable{nomenubar}{nomenubar}
\setinterfacevariable{none}{kein}
\setinterfacevariable{nonumber}{nonumber}
\setinterfacevariable{norepeat}{norepeat}
@@ -476,6 +480,7 @@
\setinterfacevariable{sectionnumber}{abschnittsnummer}
\setinterfacevariable{see}{sieh}
\setinterfacevariable{selectfont}{selectfont}
+\setinterfacevariable{separator}{separator}
\setinterfacevariable{september}{september}
\setinterfacevariable{serif}{serif}
\setinterfacevariable{serifbold}{serifbold}
@@ -569,6 +574,7 @@
\setinterfacevariable{temporary}{temporaer}
\setinterfacevariable{test}{test}
\setinterfacevariable{text}{text}
+\setinterfacevariable{textnote}{textnote}
\setinterfacevariable{three}{drei}
\setinterfacevariable{thursday}{donnerstag}
\setinterfacevariable{tight}{tight}
@@ -633,6 +639,7 @@
\setinterfaceconstant{aligntitle}{titelausrichten}
\setinterfaceconstant{alternative}{alternative}
\setinterfaceconstant{anchor}{anchor}
+\setinterfaceconstant{anchoring}{anchoring}
\setinterfaceconstant{andtext}{andtext}
\setinterfaceconstant{apa}{apa}
\setinterfaceconstant{arguments}{arguments}
@@ -729,7 +736,10 @@
\setinterfaceconstant{component}{component}
\setinterfaceconstant{compoundhyphen}{compoundhyphen}
\setinterfaceconstant{compress}{compress}
+\setinterfaceconstant{compressdistance}{compressdistance}
+\setinterfaceconstant{compressmethod}{compressmethod}
\setinterfaceconstant{compressseparator}{compressseparator}
+\setinterfaceconstant{compressstopper}{compressstopper}
\setinterfaceconstant{concerns}{concerns}
\setinterfaceconstant{connector}{connector}
\setinterfaceconstant{continue}{fortsetzen}
@@ -859,6 +869,7 @@
\setinterfaceconstant{hfil}{hfil}
\setinterfaceconstant{hidenumber}{hidenumber}
\setinterfaceconstant{hoffset}{hoffset}
+\setinterfaceconstant{horizontal}{horizontal}
\setinterfaceconstant{horoffset}{rumpfabstand}
\setinterfaceconstant{hyphen}{hyphen}
\setinterfaceconstant{hyphens}{hyphens}
@@ -959,9 +970,12 @@
\setinterfaceconstant{menu}{menue}
\setinterfaceconstant{method}{methode}
\setinterfaceconstant{middle}{mittig}
+\setinterfaceconstant{middlecolor}{middlecolor}
\setinterfaceconstant{middlecommand}{middlecommand}
\setinterfaceconstant{middlespeech}{middlespeech}
+\setinterfaceconstant{middlestyle}{middlestyle}
\setinterfaceconstant{middletext}{mittigertext}
+\setinterfaceconstant{middlewidth}{middlewidth}
\setinterfaceconstant{midsentence}{midsentence}
\setinterfaceconstant{min}{min}
\setinterfaceconstant{mindepth}{mindepth}
@@ -1031,6 +1045,7 @@
\setinterfaceconstant{overprint}{overprint}
\setinterfaceconstant{ownerpassword}{ownerpassword}
\setinterfaceconstant{ownnumber}{eigenenummer}
+\setinterfaceconstant{packcriterium}{packcriterium}
\setinterfaceconstant{page}{seite}
\setinterfaceconstant{pageboundaries}{seitenbegrenzung}
\setinterfaceconstant{pagecolor}{seitenfarbe}
@@ -1040,6 +1055,7 @@
\setinterfaceconstant{pageconversion}{pageconversion}
\setinterfaceconstant{pageconversionset}{pageconversionset}
\setinterfaceconstant{pageleft}{pageleft}
+\setinterfaceconstant{pagemethod}{pagemethod}
\setinterfaceconstant{pagenumber}{seitennummer}
\setinterfaceconstant{pageprefix}{pageprefix}
\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
@@ -1279,6 +1295,7 @@
\setinterfaceconstant{vcompact}{vcompact}
\setinterfaceconstant{vector}{vector}
\setinterfaceconstant{veroffset}{kopfoffset}
+\setinterfaceconstant{vertical}{vertikal}
\setinterfaceconstant{vfactor}{vfaktor}
\setinterfaceconstant{vfil}{vfil}
\setinterfaceconstant{viewerprefix}{viewerprefix}
@@ -1289,6 +1306,7 @@
\setinterfaceconstant{white}{weiss}
\setinterfaceconstant{width}{breite}
\setinterfaceconstant{words}{words}
+\setinterfaceconstant{xanchor}{xanchor}
\setinterfaceconstant{xfactor}{xfaktor}
\setinterfaceconstant{xhtml}{xhtml}
\setinterfaceconstant{xmax}{xmax}
@@ -1296,6 +1314,7 @@
\setinterfaceconstant{xoffset}{xoffset}
\setinterfaceconstant{xscale}{xformat}
\setinterfaceconstant{xstep}{xschritt}
+\setinterfaceconstant{yanchor}{yanchor}
\setinterfaceconstant{yfactor}{yfaktor}
\setinterfaceconstant{ymax}{ymax}
\setinterfaceconstant{yoffset}{yoffset}
diff --git a/Master/texmf-dist/tex/context/base/mkii/mult-en.mkii b/Master/texmf-dist/tex/context/base/mkii/mult-en.mkii
index 0f9cc15e1c8..3d7935db7c0 100644
--- a/Master/texmf-dist/tex/context/base/mkii/mult-en.mkii
+++ b/Master/texmf-dist/tex/context/base/mkii/mult-en.mkii
@@ -147,6 +147,7 @@
\setinterfacevariable{comment}{comment}
\setinterfacevariable{component}{component}
\setinterfacevariable{compressseparator}{compressseparator}
+\setinterfacevariable{compressstopper}{compressstopper}
\setinterfacevariable{concept}{concept}
\setinterfacevariable{construction}{construction}
\setinterfacevariable{content}{content}
@@ -231,8 +232,10 @@
\setinterfacevariable{handwritten}{handwritten}
\setinterfacevariable{hang}{hang}
\setinterfacevariable{hanging}{hanging}
+\setinterfacevariable{hangingboth}{hangingboth}
\setinterfacevariable{head}{head}
\setinterfacevariable{header}{header}
+\setinterfacevariable{headintext}{headintext}
\setinterfacevariable{height}{height}
\setinterfacevariable{helptext}{helptext}
\setinterfacevariable{hencefore}{hencefore}
@@ -373,6 +376,7 @@
\setinterfacevariable{nohz}{nohz}
\setinterfacevariable{noline}{noline}
\setinterfacevariable{nomarking}{nomarking}
+\setinterfacevariable{nomenubar}{nomenubar}
\setinterfacevariable{none}{none}
\setinterfacevariable{nonumber}{nonumber}
\setinterfacevariable{norepeat}{norepeat}
@@ -476,6 +480,7 @@
\setinterfacevariable{sectionnumber}{sectionnumber}
\setinterfacevariable{see}{see}
\setinterfacevariable{selectfont}{selectfont}
+\setinterfacevariable{separator}{separator}
\setinterfacevariable{september}{september}
\setinterfacevariable{serif}{serif}
\setinterfacevariable{serifbold}{serifbold}
@@ -569,6 +574,7 @@
\setinterfacevariable{temporary}{temporary}
\setinterfacevariable{test}{test}
\setinterfacevariable{text}{text}
+\setinterfacevariable{textnote}{textnote}
\setinterfacevariable{three}{three}
\setinterfacevariable{thursday}{thursday}
\setinterfacevariable{tight}{tight}
@@ -633,6 +639,7 @@
\setinterfaceconstant{aligntitle}{aligntitle}
\setinterfaceconstant{alternative}{alternative}
\setinterfaceconstant{anchor}{anchor}
+\setinterfaceconstant{anchoring}{anchoring}
\setinterfaceconstant{andtext}{andtext}
\setinterfaceconstant{apa}{apa}
\setinterfaceconstant{arguments}{arguments}
@@ -729,7 +736,10 @@
\setinterfaceconstant{component}{component}
\setinterfaceconstant{compoundhyphen}{compoundhyphen}
\setinterfaceconstant{compress}{compress}
+\setinterfaceconstant{compressdistance}{compressdistance}
+\setinterfaceconstant{compressmethod}{compressmethod}
\setinterfaceconstant{compressseparator}{compressseparator}
+\setinterfaceconstant{compressstopper}{compressstopper}
\setinterfaceconstant{concerns}{concerns}
\setinterfaceconstant{connector}{connector}
\setinterfaceconstant{continue}{continue}
@@ -859,6 +869,7 @@
\setinterfaceconstant{hfil}{hfil}
\setinterfaceconstant{hidenumber}{hidenumber}
\setinterfaceconstant{hoffset}{hoffset}
+\setinterfaceconstant{horizontal}{horizontal}
\setinterfaceconstant{horoffset}{horoffset}
\setinterfaceconstant{hyphen}{hyphen}
\setinterfaceconstant{hyphens}{hyphens}
@@ -959,9 +970,12 @@
\setinterfaceconstant{menu}{menu}
\setinterfaceconstant{method}{method}
\setinterfaceconstant{middle}{middle}
+\setinterfaceconstant{middlecolor}{middlecolor}
\setinterfaceconstant{middlecommand}{middlecommand}
\setinterfaceconstant{middlespeech}{middlespeech}
+\setinterfaceconstant{middlestyle}{middlestyle}
\setinterfaceconstant{middletext}{middletext}
+\setinterfaceconstant{middlewidth}{middlewidth}
\setinterfaceconstant{midsentence}{midsentence}
\setinterfaceconstant{min}{min}
\setinterfaceconstant{mindepth}{mindepth}
@@ -1031,6 +1045,7 @@
\setinterfaceconstant{overprint}{overprint}
\setinterfaceconstant{ownerpassword}{ownerpassword}
\setinterfaceconstant{ownnumber}{ownnumber}
+\setinterfaceconstant{packcriterium}{packcriterium}
\setinterfaceconstant{page}{page}
\setinterfaceconstant{pageboundaries}{pageboundaries}
\setinterfaceconstant{pagecolor}{pagecolor}
@@ -1040,6 +1055,7 @@
\setinterfaceconstant{pageconversion}{pageconversion}
\setinterfaceconstant{pageconversionset}{pageconversionset}
\setinterfaceconstant{pageleft}{pageleft}
+\setinterfaceconstant{pagemethod}{pagemethod}
\setinterfaceconstant{pagenumber}{pagenumber}
\setinterfaceconstant{pageprefix}{pageprefix}
\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
@@ -1279,6 +1295,7 @@
\setinterfaceconstant{vcompact}{vcompact}
\setinterfaceconstant{vector}{vector}
\setinterfaceconstant{veroffset}{veroffset}
+\setinterfaceconstant{vertical}{vertical}
\setinterfaceconstant{vfactor}{vfactor}
\setinterfaceconstant{vfil}{vfil}
\setinterfaceconstant{viewerprefix}{viewerprefix}
@@ -1289,6 +1306,7 @@
\setinterfaceconstant{white}{white}
\setinterfaceconstant{width}{width}
\setinterfaceconstant{words}{words}
+\setinterfaceconstant{xanchor}{xanchor}
\setinterfaceconstant{xfactor}{xfactor}
\setinterfaceconstant{xhtml}{xhtml}
\setinterfaceconstant{xmax}{xmax}
@@ -1296,6 +1314,7 @@
\setinterfaceconstant{xoffset}{xoffset}
\setinterfaceconstant{xscale}{xscale}
\setinterfaceconstant{xstep}{xstep}
+\setinterfaceconstant{yanchor}{yanchor}
\setinterfaceconstant{yfactor}{yfactor}
\setinterfaceconstant{ymax}{ymax}
\setinterfaceconstant{yoffset}{yoffset}
diff --git a/Master/texmf-dist/tex/context/base/mkii/mult-fr.mkii b/Master/texmf-dist/tex/context/base/mkii/mult-fr.mkii
index fe883d50f14..de8778e451d 100644
--- a/Master/texmf-dist/tex/context/base/mkii/mult-fr.mkii
+++ b/Master/texmf-dist/tex/context/base/mkii/mult-fr.mkii
@@ -147,6 +147,7 @@
\setinterfacevariable{comment}{commentaire}
\setinterfacevariable{component}{composant}
\setinterfacevariable{compressseparator}{compressseparator}
+\setinterfacevariable{compressstopper}{compressstopper}
\setinterfacevariable{concept}{concept}
\setinterfacevariable{construction}{construction}
\setinterfacevariable{content}{contenu}
@@ -231,8 +232,10 @@
\setinterfacevariable{handwritten}{manuscript}
\setinterfacevariable{hang}{suspend}
\setinterfacevariable{hanging}{suspend}
+\setinterfacevariable{hangingboth}{hangingboth}
\setinterfacevariable{head}{tete}
\setinterfacevariable{header}{entete}
+\setinterfacevariable{headintext}{headintext}
\setinterfacevariable{height}{hauteur}
\setinterfacevariable{helptext}{texteaide}
\setinterfacevariable{hencefore}{precedent}
@@ -373,6 +376,7 @@
\setinterfacevariable{nohz}{nohz}
\setinterfacevariable{noline}{noline}
\setinterfacevariable{nomarking}{sansmarquage}
+\setinterfacevariable{nomenubar}{nomenubar}
\setinterfacevariable{none}{rien}
\setinterfacevariable{nonumber}{sansnumero}
\setinterfacevariable{norepeat}{norepeat}
@@ -476,6 +480,7 @@
\setinterfacevariable{sectionnumber}{numerosection}
\setinterfacevariable{see}{voit}
\setinterfacevariable{selectfont}{selectfont}
+\setinterfacevariable{separator}{separator}
\setinterfacevariable{september}{septembre}
\setinterfacevariable{serif}{serif}
\setinterfacevariable{serifbold}{serifbold}
@@ -569,6 +574,7 @@
\setinterfacevariable{temporary}{temporaire}
\setinterfacevariable{test}{test}
\setinterfacevariable{text}{texte}
+\setinterfacevariable{textnote}{textnote}
\setinterfacevariable{three}{trois}
\setinterfacevariable{thursday}{jeudi}
\setinterfacevariable{tight}{tight}
@@ -587,6 +593,7 @@
\setinterfacevariable{understrike}{understrike}
\setinterfacevariable{understrikes}{understrikes}
\setinterfacevariable{unframed}{unframed}
+\setinterfacevariable{unicode}{unicode}
\setinterfacevariable{unit}{unite}
\setinterfacevariable{units}{unites}
\setinterfacevariable{unknown}{inconnu}
@@ -632,6 +639,7 @@
\setinterfaceconstant{aligntitle}{alignementtitre}
\setinterfaceconstant{alternative}{alternative}
\setinterfaceconstant{anchor}{anchor}
+\setinterfaceconstant{anchoring}{anchoring}
\setinterfaceconstant{andtext}{andtext}
\setinterfaceconstant{apa}{apa}
\setinterfaceconstant{arguments}{arguments}
@@ -728,7 +736,10 @@
\setinterfaceconstant{component}{composant}
\setinterfaceconstant{compoundhyphen}{compoundhyphen}
\setinterfaceconstant{compress}{compress}
+\setinterfaceconstant{compressdistance}{compressdistance}
+\setinterfaceconstant{compressmethod}{compressmethod}
\setinterfaceconstant{compressseparator}{compressseparator}
+\setinterfaceconstant{compressstopper}{compressstopper}
\setinterfaceconstant{concerns}{concerns}
\setinterfaceconstant{connector}{connector}
\setinterfaceconstant{continue}{continue}
@@ -858,6 +869,7 @@
\setinterfaceconstant{hfil}{hfil}
\setinterfaceconstant{hidenumber}{hidenumber}
\setinterfaceconstant{hoffset}{decalagehauteur}
+\setinterfaceconstant{horizontal}{horizontale}
\setinterfaceconstant{horoffset}{horoffset}
\setinterfaceconstant{hyphen}{hyphen}
\setinterfaceconstant{hyphens}{hyphens}
@@ -958,9 +970,12 @@
\setinterfaceconstant{menu}{menu}
\setinterfaceconstant{method}{methode}
\setinterfaceconstant{middle}{milieu}
+\setinterfaceconstant{middlecolor}{middlecolor}
\setinterfaceconstant{middlecommand}{middlecommand}
\setinterfaceconstant{middlespeech}{middlespeech}
+\setinterfaceconstant{middlestyle}{middlestyle}
\setinterfaceconstant{middletext}{textecentre}
+\setinterfaceconstant{middlewidth}{middlewidth}
\setinterfaceconstant{midsentence}{midsentence}
\setinterfaceconstant{min}{min}
\setinterfaceconstant{mindepth}{profondeurmin}
@@ -1030,6 +1045,7 @@
\setinterfaceconstant{overprint}{overprint}
\setinterfaceconstant{ownerpassword}{ownerpassword}
\setinterfaceconstant{ownnumber}{numeroproprio}
+\setinterfaceconstant{packcriterium}{packcriterium}
\setinterfaceconstant{page}{page}
\setinterfaceconstant{pageboundaries}{limitespage}
\setinterfaceconstant{pagecolor}{couleurpage}
@@ -1039,6 +1055,7 @@
\setinterfaceconstant{pageconversion}{pageconversion}
\setinterfaceconstant{pageconversionset}{pageconversionset}
\setinterfaceconstant{pageleft}{pageleft}
+\setinterfaceconstant{pagemethod}{pagemethod}
\setinterfaceconstant{pagenumber}{numeropage}
\setinterfaceconstant{pageprefix}{pageprefix}
\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
@@ -1278,6 +1295,7 @@
\setinterfaceconstant{vcompact}{vcompact}
\setinterfaceconstant{vector}{vector}
\setinterfaceconstant{veroffset}{veroffset}
+\setinterfaceconstant{vertical}{verticale}
\setinterfaceconstant{vfactor}{vfactor}
\setinterfaceconstant{vfil}{vfil}
\setinterfaceconstant{viewerprefix}{viewerprefix}
@@ -1288,6 +1306,7 @@
\setinterfaceconstant{white}{blanc}
\setinterfaceconstant{width}{largeur}
\setinterfaceconstant{words}{words}
+\setinterfaceconstant{xanchor}{xanchor}
\setinterfaceconstant{xfactor}{xfactor}
\setinterfaceconstant{xhtml}{xhtml}
\setinterfaceconstant{xmax}{xmax}
@@ -1295,6 +1314,7 @@
\setinterfaceconstant{xoffset}{xoffset}
\setinterfaceconstant{xscale}{xscale}
\setinterfaceconstant{xstep}{xstep}
+\setinterfaceconstant{yanchor}{yanchor}
\setinterfaceconstant{yfactor}{yfactor}
\setinterfaceconstant{ymax}{ymax}
\setinterfaceconstant{yoffset}{yoffset}
diff --git a/Master/texmf-dist/tex/context/base/mkii/mult-it.mkii b/Master/texmf-dist/tex/context/base/mkii/mult-it.mkii
index d83672d3895..1d2425c9a6a 100644
--- a/Master/texmf-dist/tex/context/base/mkii/mult-it.mkii
+++ b/Master/texmf-dist/tex/context/base/mkii/mult-it.mkii
@@ -147,6 +147,7 @@
\setinterfacevariable{comment}{commento}
\setinterfacevariable{component}{componente}
\setinterfacevariable{compressseparator}{compressseparator}
+\setinterfacevariable{compressstopper}{compressstopper}
\setinterfacevariable{concept}{concetto}
\setinterfacevariable{construction}{construction}
\setinterfacevariable{content}{indice}
@@ -231,8 +232,10 @@
\setinterfacevariable{handwritten}{grafiamanuale}
\setinterfacevariable{hang}{sospendi}
\setinterfacevariable{hanging}{sospeso}
+\setinterfacevariable{hangingboth}{hangingboth}
\setinterfacevariable{head}{testa}
\setinterfacevariable{header}{intestazione}
+\setinterfacevariable{headintext}{headintext}
\setinterfacevariable{height}{altezza}
\setinterfacevariable{helptext}{testoaiuto}
\setinterfacevariable{hencefore}{precedente}
@@ -373,6 +376,7 @@
\setinterfacevariable{nohz}{nohz}
\setinterfacevariable{noline}{noline}
\setinterfacevariable{nomarking}{nomarcature}
+\setinterfacevariable{nomenubar}{nomenubar}
\setinterfacevariable{none}{nessuno}
\setinterfacevariable{nonumber}{nonumber}
\setinterfacevariable{norepeat}{norepeat}
@@ -476,6 +480,7 @@
\setinterfacevariable{sectionnumber}{numerosezione}
\setinterfacevariable{see}{vedi}
\setinterfacevariable{selectfont}{selectfont}
+\setinterfacevariable{separator}{separator}
\setinterfacevariable{september}{settembre}
\setinterfacevariable{serif}{serif}
\setinterfacevariable{serifbold}{serifbold}
@@ -569,6 +574,7 @@
\setinterfacevariable{temporary}{temporaneo}
\setinterfacevariable{test}{test}
\setinterfacevariable{text}{testo}
+\setinterfacevariable{textnote}{textnote}
\setinterfacevariable{three}{tre}
\setinterfacevariable{thursday}{giovedi}
\setinterfacevariable{tight}{tight}
@@ -633,6 +639,7 @@
\setinterfaceconstant{aligntitle}{allineatitolo}
\setinterfaceconstant{alternative}{alternativa}
\setinterfaceconstant{anchor}{anchor}
+\setinterfaceconstant{anchoring}{anchoring}
\setinterfaceconstant{andtext}{andtext}
\setinterfaceconstant{apa}{apa}
\setinterfaceconstant{arguments}{arguments}
@@ -729,7 +736,10 @@
\setinterfaceconstant{component}{component}
\setinterfaceconstant{compoundhyphen}{compoundhyphen}
\setinterfaceconstant{compress}{compress}
+\setinterfaceconstant{compressdistance}{compressdistance}
+\setinterfaceconstant{compressmethod}{compressmethod}
\setinterfaceconstant{compressseparator}{compressseparator}
+\setinterfaceconstant{compressstopper}{compressstopper}
\setinterfaceconstant{concerns}{concerns}
\setinterfaceconstant{connector}{connector}
\setinterfaceconstant{continue}{continua}
@@ -859,6 +869,7 @@
\setinterfaceconstant{hfil}{hfil}
\setinterfaceconstant{hidenumber}{hidenumber}
\setinterfaceconstant{hoffset}{hoffset}
+\setinterfaceconstant{horizontal}{orizzontale}
\setinterfaceconstant{horoffset}{horoffset}
\setinterfaceconstant{hyphen}{hyphen}
\setinterfaceconstant{hyphens}{hyphens}
@@ -959,9 +970,12 @@
\setinterfaceconstant{menu}{menu}
\setinterfaceconstant{method}{metodo}
\setinterfaceconstant{middle}{centro}
+\setinterfaceconstant{middlecolor}{middlecolor}
\setinterfaceconstant{middlecommand}{middlecommand}
\setinterfaceconstant{middlespeech}{middlespeech}
+\setinterfaceconstant{middlestyle}{middlestyle}
\setinterfaceconstant{middletext}{testocentro}
+\setinterfaceconstant{middlewidth}{middlewidth}
\setinterfaceconstant{midsentence}{midsentence}
\setinterfaceconstant{min}{min}
\setinterfaceconstant{mindepth}{mindepth}
@@ -1031,6 +1045,7 @@
\setinterfaceconstant{overprint}{overprint}
\setinterfaceconstant{ownerpassword}{ownerpassword}
\setinterfaceconstant{ownnumber}{numeroproprio}
+\setinterfaceconstant{packcriterium}{packcriterium}
\setinterfaceconstant{page}{pagina}
\setinterfaceconstant{pageboundaries}{limitipagina}
\setinterfaceconstant{pagecolor}{colorepagina}
@@ -1040,6 +1055,7 @@
\setinterfaceconstant{pageconversion}{pageconversion}
\setinterfaceconstant{pageconversionset}{pageconversionset}
\setinterfaceconstant{pageleft}{pageleft}
+\setinterfaceconstant{pagemethod}{pagemethod}
\setinterfaceconstant{pagenumber}{numeropagina}
\setinterfaceconstant{pageprefix}{pageprefix}
\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
@@ -1279,6 +1295,7 @@
\setinterfaceconstant{vcompact}{vcompact}
\setinterfaceconstant{vector}{vector}
\setinterfaceconstant{veroffset}{veroffset}
+\setinterfaceconstant{vertical}{verticale}
\setinterfaceconstant{vfactor}{vfactor}
\setinterfaceconstant{vfil}{vfil}
\setinterfaceconstant{viewerprefix}{viewerprefix}
@@ -1289,6 +1306,7 @@
\setinterfaceconstant{white}{bianco}
\setinterfaceconstant{width}{ampiezza}
\setinterfaceconstant{words}{words}
+\setinterfaceconstant{xanchor}{xanchor}
\setinterfaceconstant{xfactor}{xfactor}
\setinterfaceconstant{xhtml}{xhtml}
\setinterfaceconstant{xmax}{xmax}
@@ -1296,6 +1314,7 @@
\setinterfaceconstant{xoffset}{xoffset}
\setinterfaceconstant{xscale}{xscale}
\setinterfaceconstant{xstep}{xstep}
+\setinterfaceconstant{yanchor}{yanchor}
\setinterfaceconstant{yfactor}{yfactor}
\setinterfaceconstant{ymax}{ymax}
\setinterfaceconstant{yoffset}{yoffset}
diff --git a/Master/texmf-dist/tex/context/base/mkii/mult-nl.mkii b/Master/texmf-dist/tex/context/base/mkii/mult-nl.mkii
index 6376b158a88..8b7e22f857f 100644
--- a/Master/texmf-dist/tex/context/base/mkii/mult-nl.mkii
+++ b/Master/texmf-dist/tex/context/base/mkii/mult-nl.mkii
@@ -147,6 +147,7 @@
\setinterfacevariable{comment}{commentaar}
\setinterfacevariable{component}{onderdeel}
\setinterfacevariable{compressseparator}{compressseparator}
+\setinterfacevariable{compressstopper}{compressstopper}
\setinterfacevariable{concept}{concept}
\setinterfacevariable{construction}{construction}
\setinterfacevariable{content}{inhoud}
@@ -231,8 +232,10 @@
\setinterfacevariable{handwritten}{handschrift}
\setinterfacevariable{hang}{hang}
\setinterfacevariable{hanging}{hangend}
+\setinterfacevariable{hangingboth}{beidehangend}
\setinterfacevariable{head}{kop}
\setinterfacevariable{header}{hoofd}
+\setinterfacevariable{headintext}{kopintekst}
\setinterfacevariable{height}{hoogte}
\setinterfacevariable{helptext}{helptekst}
\setinterfacevariable{hencefore}{hierboven}
@@ -373,6 +376,7 @@
\setinterfacevariable{nohz}{geenhz}
\setinterfacevariable{noline}{noline}
\setinterfacevariable{nomarking}{geenmarkering}
+\setinterfacevariable{nomenubar}{geenmenubalk}
\setinterfacevariable{none}{geen}
\setinterfacevariable{nonumber}{geennummer}
\setinterfacevariable{norepeat}{norepeat}
@@ -476,6 +480,7 @@
\setinterfacevariable{sectionnumber}{sectienummer}
\setinterfacevariable{see}{zie}
\setinterfacevariable{selectfont}{selectfont}
+\setinterfacevariable{separator}{scheider}
\setinterfacevariable{september}{september}
\setinterfacevariable{serif}{serif}
\setinterfacevariable{serifbold}{serifbold}
@@ -569,6 +574,7 @@
\setinterfacevariable{temporary}{voorlopig}
\setinterfacevariable{test}{test}
\setinterfacevariable{text}{tekst}
+\setinterfacevariable{textnote}{tekstnoot}
\setinterfacevariable{three}{drie}
\setinterfacevariable{thursday}{donderdag}
\setinterfacevariable{tight}{krap}
@@ -633,6 +639,7 @@
\setinterfaceconstant{aligntitle}{titeluitlijnen}
\setinterfaceconstant{alternative}{variant}
\setinterfaceconstant{anchor}{anker}
+\setinterfaceconstant{anchoring}{verankering}
\setinterfaceconstant{andtext}{andtext}
\setinterfaceconstant{apa}{apa}
\setinterfaceconstant{arguments}{argumenten}
@@ -729,7 +736,10 @@
\setinterfaceconstant{component}{component}
\setinterfaceconstant{compoundhyphen}{koppelteken}
\setinterfaceconstant{compress}{comprimeren}
+\setinterfaceconstant{compressdistance}{compressdistance}
+\setinterfaceconstant{compressmethod}{compressmethod}
\setinterfaceconstant{compressseparator}{compressseparator}
+\setinterfaceconstant{compressstopper}{compressstopper}
\setinterfaceconstant{concerns}{betreft}
\setinterfaceconstant{connector}{connector}
\setinterfaceconstant{continue}{doorgaan}
@@ -859,6 +869,7 @@
\setinterfaceconstant{hfil}{hfil}
\setinterfaceconstant{hidenumber}{hidenumber}
\setinterfaceconstant{hoffset}{hoffset}
+\setinterfaceconstant{horizontal}{horizontaal}
\setinterfaceconstant{horoffset}{rugoffset}
\setinterfaceconstant{hyphen}{hyphen}
\setinterfaceconstant{hyphens}{hyphens}
@@ -959,9 +970,12 @@
\setinterfaceconstant{menu}{menu}
\setinterfaceconstant{method}{methode}
\setinterfaceconstant{middle}{midden}
+\setinterfaceconstant{middlecolor}{middenkleur}
\setinterfaceconstant{middlecommand}{middencommando}
\setinterfaceconstant{middlespeech}{middenuitspraak}
+\setinterfaceconstant{middlestyle}{middenletter}
\setinterfaceconstant{middletext}{middentekst}
+\setinterfaceconstant{middlewidth}{middenbreedte}
\setinterfaceconstant{midsentence}{middenzin}
\setinterfaceconstant{min}{min}
\setinterfaceconstant{mindepth}{mindiepte}
@@ -1031,6 +1045,7 @@
\setinterfaceconstant{overprint}{overprint}
\setinterfaceconstant{ownerpassword}{ownerpassword}
\setinterfaceconstant{ownnumber}{eigennummer}
+\setinterfaceconstant{packcriterium}{opelkaarcriterium}
\setinterfaceconstant{page}{pagina}
\setinterfaceconstant{pageboundaries}{paginaovergangen}
\setinterfaceconstant{pagecolor}{paginakleur}
@@ -1040,6 +1055,7 @@
\setinterfaceconstant{pageconversion}{pageconversion}
\setinterfaceconstant{pageconversionset}{pageconversionset}
\setinterfaceconstant{pageleft}{pageleft}
+\setinterfaceconstant{pagemethod}{paginamethode}
\setinterfaceconstant{pagenumber}{paginanummer}
\setinterfaceconstant{pageprefix}{pageprefix}
\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
@@ -1279,6 +1295,7 @@
\setinterfaceconstant{vcompact}{vcomprimeer}
\setinterfaceconstant{vector}{vector}
\setinterfaceconstant{veroffset}{kopoffset}
+\setinterfaceconstant{vertical}{vertikaal}
\setinterfaceconstant{vfactor}{vfactor}
\setinterfaceconstant{vfil}{vfil}
\setinterfaceconstant{viewerprefix}{viewerprefix}
@@ -1289,6 +1306,7 @@
\setinterfaceconstant{white}{wit}
\setinterfaceconstant{width}{breedte}
\setinterfaceconstant{words}{words}
+\setinterfaceconstant{xanchor}{xanker}
\setinterfaceconstant{xfactor}{xfactor}
\setinterfaceconstant{xhtml}{xhtml}
\setinterfaceconstant{xmax}{xmax}
@@ -1296,6 +1314,7 @@
\setinterfaceconstant{xoffset}{xoffset}
\setinterfaceconstant{xscale}{xschaal}
\setinterfaceconstant{xstep}{xstap}
+\setinterfaceconstant{yanchor}{yanker}
\setinterfaceconstant{yfactor}{yfactor}
\setinterfaceconstant{ymax}{ymax}
\setinterfaceconstant{yoffset}{yoffset}
diff --git a/Master/texmf-dist/tex/context/base/mkii/mult-pe.mkii b/Master/texmf-dist/tex/context/base/mkii/mult-pe.mkii
index 57cbe5600e2..b9d71fe33a6 100644
--- a/Master/texmf-dist/tex/context/base/mkii/mult-pe.mkii
+++ b/Master/texmf-dist/tex/context/base/mkii/mult-pe.mkii
@@ -147,6 +147,7 @@
\setinterfacevariable{comment}{توضیح}
\setinterfacevariable{component}{مولÙÙ‡}
\setinterfacevariable{compressseparator}{compressseparator}
+\setinterfacevariable{compressstopper}{compressstopper}
\setinterfacevariable{concept}{Ù…Ùهوم}
\setinterfacevariable{construction}{construction}
\setinterfacevariable{content}{محتوا}
@@ -231,8 +232,10 @@
\setinterfacevariable{handwritten}{دست‌نوشته}
\setinterfacevariable{hang}{بیاویز}
\setinterfacevariable{hanging}{آویزان}
+\setinterfacevariable{hangingboth}{hangingboth}
\setinterfacevariable{head}{سر}
\setinterfacevariable{header}{سربرگ}
+\setinterfacevariable{headintext}{headintext}
\setinterfacevariable{height}{ارتÙاع}
\setinterfacevariable{helptext}{متن‌کمکی}
\setinterfacevariable{hencefore}{hencefore}
@@ -373,6 +376,7 @@
\setinterfacevariable{nohz}{nohz}
\setinterfacevariable{noline}{noline}
\setinterfacevariable{nomarking}{بدون‌نشانه‌گذاری}
+\setinterfacevariable{nomenubar}{nomenubar}
\setinterfacevariable{none}{هیچکدام}
\setinterfacevariable{nonumber}{بدون‌شماره}
\setinterfacevariable{norepeat}{norepeat}
@@ -476,6 +480,7 @@
\setinterfacevariable{sectionnumber}{شماره‌بخش}
\setinterfacevariable{see}{ببینید}
\setinterfacevariable{selectfont}{selectfont}
+\setinterfacevariable{separator}{separator}
\setinterfacevariable{september}{سپتامبر}
\setinterfacevariable{serif}{سریÙ}
\setinterfacevariable{serifbold}{serifbold}
@@ -569,6 +574,7 @@
\setinterfacevariable{temporary}{موقتی}
\setinterfacevariable{test}{تست}
\setinterfacevariable{text}{متن}
+\setinterfacevariable{textnote}{textnote}
\setinterfacevariable{three}{سه}
\setinterfacevariable{thursday}{پنج‌شنبه}
\setinterfacevariable{tight}{tight}
@@ -587,6 +593,7 @@
\setinterfacevariable{understrike}{understrike}
\setinterfacevariable{understrikes}{understrikes}
\setinterfacevariable{unframed}{unframed}
+\setinterfacevariable{unicode}{unicode}
\setinterfacevariable{unit}{واحد}
\setinterfacevariable{units}{واحدها}
\setinterfacevariable{unknown}{ناشناس}
@@ -632,6 +639,7 @@
\setinterfaceconstant{aligntitle}{عنوان‌تنظیم}
\setinterfaceconstant{alternative}{جایگزین}
\setinterfaceconstant{anchor}{anchor}
+\setinterfaceconstant{anchoring}{anchoring}
\setinterfaceconstant{andtext}{andtext}
\setinterfaceconstant{apa}{apa}
\setinterfaceconstant{arguments}{arguments}
@@ -728,7 +736,10 @@
\setinterfaceconstant{component}{مولÙÙ‡}
\setinterfaceconstant{compoundhyphen}{compoundhyphen}
\setinterfaceconstant{compress}{Ùشردن}
+\setinterfaceconstant{compressdistance}{compressdistance}
+\setinterfaceconstant{compressmethod}{compressmethod}
\setinterfaceconstant{compressseparator}{compressseparator}
+\setinterfaceconstant{compressstopper}{compressstopper}
\setinterfaceconstant{concerns}{concerns}
\setinterfaceconstant{connector}{connector}
\setinterfaceconstant{continue}{ادامه}
@@ -858,6 +869,7 @@
\setinterfaceconstant{hfil}{پرکردن‌ارتÙاع}
\setinterfaceconstant{hidenumber}{hidenumber}
\setinterfaceconstant{hoffset}{Ø¢Ùست‌ا}
+\setinterfaceconstant{horizontal}{اÙÙ‚ÛŒ}
\setinterfaceconstant{horoffset}{Ø¢Ùست‌اÙÙ‚}
\setinterfaceconstant{hyphen}{شکستن}
\setinterfaceconstant{hyphens}{hyphens}
@@ -958,9 +970,12 @@
\setinterfaceconstant{menu}{منو}
\setinterfaceconstant{method}{روش}
\setinterfaceconstant{middle}{میان}
+\setinterfaceconstant{middlecolor}{middlecolor}
\setinterfaceconstant{middlecommand}{middlecommand}
\setinterfaceconstant{middlespeech}{سخنرانی‌میانی}
+\setinterfaceconstant{middlestyle}{middlestyle}
\setinterfaceconstant{middletext}{متن‌میانی}
+\setinterfaceconstant{middlewidth}{middlewidth}
\setinterfaceconstant{midsentence}{جمله‌میانی}
\setinterfaceconstant{min}{کمترین}
\setinterfaceconstant{mindepth}{کمترین‌عمق}
@@ -1030,6 +1045,7 @@
\setinterfaceconstant{overprint}{overprint}
\setinterfaceconstant{ownerpassword}{ownerpassword}
\setinterfaceconstant{ownnumber}{شماره‌خود}
+\setinterfaceconstant{packcriterium}{packcriterium}
\setinterfaceconstant{page}{صÙحه}
\setinterfaceconstant{pageboundaries}{مرزهای‌صÙحه}
\setinterfaceconstant{pagecolor}{رنگ‌صÙحه}
@@ -1039,6 +1055,7 @@
\setinterfaceconstant{pageconversion}{pageconversion}
\setinterfaceconstant{pageconversionset}{pageconversionset}
\setinterfaceconstant{pageleft}{pageleft}
+\setinterfaceconstant{pagemethod}{pagemethod}
\setinterfaceconstant{pagenumber}{شماره‌صÙحه}
\setinterfaceconstant{pageprefix}{pageprefix}
\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
@@ -1278,6 +1295,7 @@
\setinterfaceconstant{vcompact}{vcompact}
\setinterfaceconstant{vector}{vector}
\setinterfaceconstant{veroffset}{Ø¢Ùست‌عم}
+\setinterfaceconstant{vertical}{عمودی}
\setinterfaceconstant{vfactor}{vfactor}
\setinterfaceconstant{vfil}{vfil}
\setinterfaceconstant{viewerprefix}{viewerprefix}
@@ -1288,6 +1306,7 @@
\setinterfaceconstant{white}{سÙید}
\setinterfaceconstant{width}{عرض}
\setinterfaceconstant{words}{words}
+\setinterfaceconstant{xanchor}{xanchor}
\setinterfaceconstant{xfactor}{Ùاکتورایکس}
\setinterfaceconstant{xhtml}{xhtml}
\setinterfaceconstant{xmax}{xmax}
@@ -1295,6 +1314,7 @@
\setinterfaceconstant{xoffset}{Ø¢Ùست‌ایکس}
\setinterfaceconstant{xscale}{مقیاس‌ایکس}
\setinterfaceconstant{xstep}{گام‌ایکس}
+\setinterfaceconstant{yanchor}{yanchor}
\setinterfaceconstant{yfactor}{Ùاکتوروای}
\setinterfaceconstant{ymax}{ymax}
\setinterfaceconstant{yoffset}{Ø¢Ùست‌وای}
diff --git a/Master/texmf-dist/tex/context/base/mkii/mult-ro.mkii b/Master/texmf-dist/tex/context/base/mkii/mult-ro.mkii
index 78631995613..219e59dd892 100644
--- a/Master/texmf-dist/tex/context/base/mkii/mult-ro.mkii
+++ b/Master/texmf-dist/tex/context/base/mkii/mult-ro.mkii
@@ -147,6 +147,7 @@
\setinterfacevariable{comment}{comentariu}
\setinterfacevariable{component}{componenta}
\setinterfacevariable{compressseparator}{compressseparator}
+\setinterfacevariable{compressstopper}{compressstopper}
\setinterfacevariable{concept}{concept}
\setinterfacevariable{construction}{construction}
\setinterfacevariable{content}{cuprins}
@@ -231,8 +232,10 @@
\setinterfacevariable{handwritten}{scrismanual}
\setinterfacevariable{hang}{suspenda}
\setinterfacevariable{hanging}{suspendat}
+\setinterfacevariable{hangingboth}{hangingboth}
\setinterfacevariable{head}{antet}
\setinterfacevariable{header}{antet}
+\setinterfacevariable{headintext}{headintext}
\setinterfacevariable{height}{inaltime}
\setinterfacevariable{helptext}{textajutator}
\setinterfacevariable{hencefore}{precedent}
@@ -373,6 +376,7 @@
\setinterfacevariable{nohz}{nohz}
\setinterfacevariable{noline}{noline}
\setinterfacevariable{nomarking}{faramarcare}
+\setinterfacevariable{nomenubar}{nomenubar}
\setinterfacevariable{none}{niciunul}
\setinterfacevariable{nonumber}{nonumber}
\setinterfacevariable{norepeat}{norepeat}
@@ -476,6 +480,7 @@
\setinterfacevariable{sectionnumber}{numarsetiune}
\setinterfacevariable{see}{vezi}
\setinterfacevariable{selectfont}{selectfont}
+\setinterfacevariable{separator}{separator}
\setinterfacevariable{september}{septembrie}
\setinterfacevariable{serif}{serif}
\setinterfacevariable{serifbold}{serifbold}
@@ -569,6 +574,7 @@
\setinterfacevariable{temporary}{temporar}
\setinterfacevariable{test}{test}
\setinterfacevariable{text}{text}
+\setinterfacevariable{textnote}{textnote}
\setinterfacevariable{three}{trei}
\setinterfacevariable{thursday}{joi}
\setinterfacevariable{tight}{tight}
@@ -633,6 +639,7 @@
\setinterfaceconstant{aligntitle}{alinieretitlu}
\setinterfaceconstant{alternative}{alternativ}
\setinterfaceconstant{anchor}{anchor}
+\setinterfaceconstant{anchoring}{anchoring}
\setinterfaceconstant{andtext}{andtext}
\setinterfaceconstant{apa}{apa}
\setinterfaceconstant{arguments}{arguments}
@@ -729,7 +736,10 @@
\setinterfaceconstant{component}{component}
\setinterfaceconstant{compoundhyphen}{compoundhyphen}
\setinterfaceconstant{compress}{compress}
+\setinterfaceconstant{compressdistance}{compressdistance}
+\setinterfaceconstant{compressmethod}{compressmethod}
\setinterfaceconstant{compressseparator}{compressseparator}
+\setinterfaceconstant{compressstopper}{compressstopper}
\setinterfaceconstant{concerns}{concerns}
\setinterfaceconstant{connector}{connector}
\setinterfaceconstant{continue}{continua}
@@ -859,6 +869,7 @@
\setinterfaceconstant{hfil}{hfil}
\setinterfaceconstant{hidenumber}{hidenumber}
\setinterfaceconstant{hoffset}{hoffset}
+\setinterfaceconstant{horizontal}{orizontal}
\setinterfaceconstant{horoffset}{offsetoriz}
\setinterfaceconstant{hyphen}{hyphen}
\setinterfaceconstant{hyphens}{hyphens}
@@ -959,9 +970,12 @@
\setinterfaceconstant{menu}{meniu}
\setinterfaceconstant{method}{metoda}
\setinterfaceconstant{middle}{mijloc}
+\setinterfaceconstant{middlecolor}{middlecolor}
\setinterfaceconstant{middlecommand}{middlecommand}
\setinterfaceconstant{middlespeech}{middlespeech}
+\setinterfaceconstant{middlestyle}{middlestyle}
\setinterfaceconstant{middletext}{textmijloc}
+\setinterfaceconstant{middlewidth}{middlewidth}
\setinterfaceconstant{midsentence}{midsentence}
\setinterfaceconstant{min}{min}
\setinterfaceconstant{mindepth}{mindepth}
@@ -1031,6 +1045,7 @@
\setinterfaceconstant{overprint}{overprint}
\setinterfaceconstant{ownerpassword}{ownerpassword}
\setinterfaceconstant{ownnumber}{numarpropriu}
+\setinterfaceconstant{packcriterium}{packcriterium}
\setinterfaceconstant{page}{pagina}
\setinterfaceconstant{pageboundaries}{marginipagina}
\setinterfaceconstant{pagecolor}{culoarepagina}
@@ -1040,6 +1055,7 @@
\setinterfaceconstant{pageconversion}{pageconversion}
\setinterfaceconstant{pageconversionset}{pageconversionset}
\setinterfaceconstant{pageleft}{pageleft}
+\setinterfaceconstant{pagemethod}{pagemethod}
\setinterfaceconstant{pagenumber}{numarpagina}
\setinterfaceconstant{pageprefix}{pageprefix}
\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
@@ -1279,6 +1295,7 @@
\setinterfaceconstant{vcompact}{vcompact}
\setinterfaceconstant{vector}{vector}
\setinterfaceconstant{veroffset}{veroffset}
+\setinterfaceconstant{vertical}{vertical}
\setinterfaceconstant{vfactor}{vfactor}
\setinterfaceconstant{vfil}{vfil}
\setinterfaceconstant{viewerprefix}{viewerprefix}
@@ -1289,6 +1306,7 @@
\setinterfaceconstant{white}{alb}
\setinterfaceconstant{width}{latime}
\setinterfaceconstant{words}{words}
+\setinterfaceconstant{xanchor}{xanchor}
\setinterfaceconstant{xfactor}{xfactor}
\setinterfaceconstant{xhtml}{xhtml}
\setinterfaceconstant{xmax}{xmax}
@@ -1296,6 +1314,7 @@
\setinterfaceconstant{xoffset}{xoffset}
\setinterfaceconstant{xscale}{xscala}
\setinterfaceconstant{xstep}{xstep}
+\setinterfaceconstant{yanchor}{yanchor}
\setinterfaceconstant{yfactor}{yfactor}
\setinterfaceconstant{ymax}{ymax}
\setinterfaceconstant{yoffset}{yoffset}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/anch-bar.mkiv b/Master/texmf-dist/tex/context/base/mkiv/anch-bar.mkiv
index f8581da325b..49e9e29461b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/anch-bar.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/anch-bar.mkiv
@@ -102,7 +102,7 @@
\edef\m_level{\sidebarparameter\c!level}%
\ifx\m_level\empty
\ifnum\c_anch_sidebars_level=\plusone
- \ifdim\scratchdimen=\zeropoint
+ \ifzeropt\scratchdimen
\advance\d_anch_sidebars_distance\scratchdistance\relax
\else
\d_anch_sidebars_distance\scratchdimen
@@ -112,7 +112,7 @@
\fi
\else
\ifnum\m_level=\plusone
- \ifdim\scratchdimen=\zeropoint
+ \ifzeropt\scratchdimen
\advance\d_anch_sidebars_distance\scratchdistance\relax
\else
\d_anch_sidebars_distance\scratchdimen
diff --git a/Master/texmf-dist/tex/context/base/mkiv/anch-pgr.lua b/Master/texmf-dist/tex/context/base/mkiv/anch-pgr.lua
index 14afa3967ae..be9e28c08dc 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/anch-pgr.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/anch-pgr.lua
@@ -25,6 +25,8 @@ local jobpositions = job.positions
local formatters = string.formatters
local setmetatableindex = table.setmetatableindex
+local enableaction = nodes.tasks.enableaction
+
local commands = commands
local context = context
@@ -76,6 +78,7 @@ local getdepth = nuts.getdepth
local nodecodes = nodes.nodecodes
local localpar_code = nodecodes.localpar
+local start_of_par = nuts.start_of_par
local insert_before = nuts.insert_before
local insert_after = nuts.insert_after
@@ -85,6 +88,7 @@ local unsetvalue = attributes.unsetvalue
local jobpositions = job.positions
local getpos = jobpositions.getpos
+local getfree = jobpositions.getfree
local data = { }
local realpage = 1
@@ -161,7 +165,7 @@ local function flush(head,f,l,a,parent,depth)
ln = new_hlist(setlink(new_rule(65536,65536*4,0),new_kern(-65536),ln))
rn = new_hlist(setlink(new_rule(65536,0,65536*4),new_kern(-65536),rn))
end
- if getid(f) == localpar_code and getsubtype(f) == 0 then -- we need to clean this mess
+ if getid(f) == localpar_code and start_of_par(f) then -- we need to clean this mess
insert_after(head,f,ln)
else
head, f = insert_before(head,f,ln)
@@ -193,7 +197,7 @@ local function registerbackground(name)
}
texsetattribute(a_textbackground,n)
if not enabled then
- nodes.tasks.enableaction("contributers", "nodes.handlers.textbackgrounds")
+ enableaction("contributers", "nodes.handlers.textbackgrounds")
enabled = true
end
else
@@ -1130,7 +1134,7 @@ local function fetchmultipar(n,anchor,page)
local k = data.bpos.k
if k ~= 3 then
-- to be checked: no need in txt mode
- freemultipar(pagedata,jobpositions.free[page])
+ freemultipar(pagedata,getfree(page))
end
local nofmultipars = #pagedata
if trace_shapes then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/anch-pgr.mkiv b/Master/texmf-dist/tex/context/base/mkiv/anch-pgr.mkiv
index 7fa378cd14f..f2195818ab8 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/anch-pgr.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/anch-pgr.mkiv
@@ -70,7 +70,7 @@
{\anch_positions_trace_action_yes
\the\everyinsertpositionaction
\the\everypositionaction
- \csname\??positionaction\currentpositionaction\endcsname
+ \begincsname\??positionaction\currentpositionaction\endcsname
\anch_positions_cleanup_action}%
\smashedbox\scratchbox % smashing is really needed else we get problems with too big overlays
\endgroup}
@@ -367,7 +367,7 @@
\obeyMPboxorigin % do we also set the size ? when needed this must be done in mp ... might change
\def\anch_positions_meta_graphic_direct{\anch_positions_meta_graphic_nested{#3}}% takes two extra arguments
\setbox\b_anch_positions_graphic\hbox % \hpack
- {\ignorespaces\csname#1#2\endcsname\removelastspace}%
+ {\ignorespaces\begincsname#1#2\endcsname\removelastspace}%
\smashbox\b_anch_positions_graphic
\box\b_anch_positions_graphic
\endgroup}
@@ -377,7 +377,7 @@
\setupMPvariables[#2][#1,#3]%
\edef\currentmpvariableclass{#2}%
\anch_positions_meta_graphic_prepare
- \csname\??positiongraphic#2\endcsname
+ \begincsname\??positiongraphic#2\endcsname
\endgroup}%
\def\startMPpositionmethod#1#2\stopMPpositionmethod
diff --git a/Master/texmf-dist/tex/context/base/mkiv/anch-pos.lua b/Master/texmf-dist/tex/context/base/mkiv/anch-pos.lua
index a0d2eee2c8e..2788c9d1a55 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/anch-pos.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/anch-pos.lua
@@ -24,10 +24,9 @@ more efficient.</p>
-- we need virtual table accessors as well as have tag/id accessors ... we don't
-- save much here (at least not now)
-local tostring, next, rawget, rawset, setmetatable, tonumber = tostring, next, rawget, rawset, setmetatable, tonumber
+local tostring, next, setmetatable, tonumber = tostring, next, setmetatable, tonumber
local sort = table.sort
local format, gmatch = string.format, string.gmatch
-local rawget = rawget
local lpegmatch = lpeg.match
local insert, remove = table.insert, table.remove
local allocate = utilities.storage.allocate
@@ -54,8 +53,6 @@ local texget = tex.get
local texsp = tex.sp
----- texsp = string.todimen -- because we cache this is much faster but no rounding
-local pdf = pdf -- h and v are variables
-
local setmetatableindex = table.setmetatableindex
local setmetatablenewindex = table.setmetatablenewindex
@@ -71,7 +68,7 @@ local getwhd = nuts.getwhd
local hlist_code = nodes.nodecodes.hlist
local find_tail = nuts.tail
-local hpack = nuts.hpack
+----- hpack = nuts.hpack
local new_latelua = nuts.pool.latelua
@@ -123,17 +120,17 @@ local f_region = formatters["region:%s"]
local f_tag_three = formatters["%s:%s:%s"]
local f_tag_two = formatters["%s:%s"]
-jobpositions.used = false
-
local nofregular = 0
local nofspecial = 0
local splitter = lpeg.splitat(":",true)
+local pagedata = { }
+local columndata = setmetatableindex("table") -- per page
+local freedata = setmetatableindex("table") -- per page
+
local function initializer()
tobesaved = jobpositions.tobesaved
collected = jobpositions.collected
- local pagedata = { }
- local freedata = setmetatableindex("table")
for tag, data in next, collected do
local prefix, rest = lpegmatch(splitter,tag)
if prefix == "p" then
@@ -145,6 +142,8 @@ local function initializer()
nofspecial = nofspecial + 1
local t = freedata[data.p or 0]
t[#t+1] = data
+ elseif prefix == "columnarea" then
+ columndata[data.p or 0][data.c or 0] = data
end
setmetatable(data,default)
end
@@ -173,101 +172,23 @@ local function initializer()
end
end
end
- jobpositions.page = pagedata
- jobpositions.free = freedata
- jobpositions.used = next(collected)
+ jobpositions.pagedata = pagedata
end
--- -- we can gain a little when we group positions but then we still have to
--- -- deal with regions and cells so we either end up with lots of extra small
--- -- tables pointing to them and/or assembling/disassembling so in the end
--- -- it makes no sense to do it (now) and still have such a mix
---
--- local splitter = lpeg.splitat(":",true)
---
--- local function setpos(t,k,v)
--- local class, tag = lpegmatch(splitter,k)
--- if tag then
--- local c = rawget(t,class)
--- if c then
--- c[tonumber(tag) or tag] = v
--- else
--- rawset(t,class,{ [tonumber(tag) or tag] = v })
--- end
--- else
--- t.default[tonumber(k) or k] = v
--- end
--- end
---
--- local function getpos(t,k)
--- local class, tag = lpegmatch(splitter,k)
--- if tag then
--- local c = rawget(t,class)
--- if c then
--- return c[tonumber(tag) or tag]
--- end
--- else
--- return c.default[tonumber(k) or k]
--- end
--- end
---
--- tobesaved.default = tobesaved.default or { }
--- setmetatablenewindex(tobesaved,setpos)
--- setmetatableindex (tobesaved,getpos)
---
--- local function initializer()
--- tobesaved = jobpositions.tobesaved
--- collected = jobpositions.collected
---
--- tobesaved.default = tobesaved.default or { }
--- collected.default = collected.default or { }
---
--- setmetatablenewindex(tobesaved,setpos)
--- setmetatableindex (collected,getpos)
--- setmetatableindex (tobesaved,getpos)
---
--- for class, list in next, collected do
--- for tag, data in next, list do
--- setmetatable(data,default)
--- nofregular = nofregular + 1
--- end
--- end
---
--- local pagedata = collected.page or { }
--- local freedata = setmetatableindex("table")
---
--- for tag, data in next, collected.free or { } do
--- local t = freedata[data.p or 0]
--- t[#t+1] = data
--- end
---
--- local pages = structures.pages.collected
--- if pages then
--- local last = nil
--- for p=1,#pages do
--- local data = pagedata[p]
--- local free = freedata[p]
--- if free then
--- sort(free,function(a,b) return b.y < a.y end) -- order matters !
--- end
--- if data then
--- last = data
--- last.free = free
--- elseif last then
--- local t = setmetatableindex({ free = free, p = p },last)
--- if not pagedata[p] then
--- pagedata[p] = t
--- end
--- end
--- end
--- end
--- jobpositions.page = pagedata
--- jobpositions.free = freedata
--- jobpositions.used = next(collected)
--- end
+function jobpositions.used()
+ return next(collected) -- we can safe it
+end
+
+function jobpositions.getfree(page)
+ return freedata[page]
+end
+
+-- we can gain a little when we group positions but then we still have to
+-- deal with regions and cells so we either end up with lots of extra small
+-- tables pointing to them and/or assembling/disassembling so in the end
+-- it makes no sense to do it (now) and still have such a mix
--
--- function jobpositions.getcollected(class,tag) if tag then return collected[class..tag] else return collected[class] end end
--- function jobpositions.gettobesaved(class,tag) if tag then return tobesaved[class..tag] else return tobesaved[class] end end
+-- proof of concept code removed ... see archive
local function finalizer()
-- We make the (possible extensive) shape lists sparse working
@@ -334,14 +255,18 @@ local getpos, gethpos, getvpos
function jobpositions.registerhandlers(t)
getpos = t and t.getpos or function() return 0, 0 end
- gethpos = t and t.gethpos or function() return 0 end
- getvpos = t and t.getvpos or function() return 0 end
+ getrpos = t and t.getrpos or function() return 0, 0, 0 end
+ gethpos = t and t.gethpos or function() return 0 end
+ getvpos = t and t.getvpos or function() return 0 end
end
function jobpositions.getpos () return getpos () end
+function jobpositions.getrpos() return getrpos() end
function jobpositions.gethpos() return gethpos() end
function jobpositions.getvpos() return getvpos() end
+-------- jobpositions.getcolumn() return column end
+
jobpositions.registerhandlers()
local function setall(name,p,x,y,w,h,d,extra)
@@ -401,7 +326,8 @@ end
-- use that one instead of a table (so, a 3rd / 4th argument: key, e.g. "x")
local function set(name,index,value) -- ,key
- local data = enhance(tobesaved[value or index])
+ -- officially there should have been a settobesaved
+ local data = enhance(value or {})
if value then
container = tobesaved[name]
if not container then
@@ -420,7 +346,7 @@ local function setspec(specification)
local name = specification.name
local index = specification.index
local value = specification.value
- local data = enhance(tobesaved[value or index])
+ local data = enhance(value or {})
if value then
container = tobesaved[name]
if not container then
@@ -553,7 +479,7 @@ jobpositions.e_region = e_region
local lastregion
-local function setregionbox(n,tag,k,lo,ro,to,bo) -- kind
+local function setregionbox(n,tag,k,lo,ro,to,bo,column) -- kind
if not tag or tag == "" then
nofregions = nofregions + 1
tag = f_region(nofregions)
@@ -572,6 +498,7 @@ local function setregionbox(n,tag,k,lo,ro,to,bo) -- kind
ro = ro ~= 0 and ro or nil,
to = to ~= 0 and to or nil,
bo = bo ~= 0 and bo or nil,
+ c = column or nil,
}
lastregion = tag
return tag, box
@@ -615,6 +542,13 @@ function jobpositions.gettobesaved(name,tag)
end
end
+function jobpositions.settobesaved(name,tag,data)
+ local t = tobesaved[name]
+ if t and tag and data then
+ t[tag] = data
+ end
+end
+
local nofparagraphs = 0
scanners.parpos = function()
@@ -803,12 +737,22 @@ function jobpositions.replace(id,p,x,y,w,h,d)
collected[id] = { p = p, x = x, y = y, w = w, h = h, d = d } -- c g
end
-function jobpositions.page(id)
+local function getpage(id)
local jpi = collected[id]
return jpi and jpi.p
end
-function jobpositions.region(id)
+local function getcolumn(id)
+ local jpi = collected[id]
+ return jpi and jpi.c or false
+end
+
+local function getparagraph(id)
+ local jpi = collected[id]
+ return jpi and jpi.n
+end
+
+local function getregion(id)
local jpi = collected[id]
if jpi then
local r = jpi.r
@@ -823,20 +767,15 @@ function jobpositions.region(id)
return false
end
-function jobpositions.column(id)
- local jpi = collected[id]
- return jpi and jpi.c or false
-end
-
-function jobpositions.paragraph(id)
- local jpi = collected[id]
- return jpi and jpi.n
-end
+jobpositions.page = getpage
+jobpositions.column = getcolumn
+jobpositions.paragraph = getparagraph
+jobpositions.region = getregion
-jobpositions.p = jobpositions.page
-jobpositions.r = jobpositions.region
-jobpositions.c = jobpositions.column
-jobpositions.n = jobpositions.paragraph
+jobpositions.p = getpage -- not used, kind of obsolete
+jobpositions.c = getcolumn -- idem
+jobpositions.n = getparagraph -- idem
+jobpositions.r = getregion -- idem
function jobpositions.x(id)
local jpi = collected[id]
@@ -1030,8 +969,24 @@ local function onsamepage(list,page)
return page
end
+local function columnofpos(realpage,xposition)
+ local p = columndata[realpage]
+ if p then
+ for i=1,#p do
+ local c = p[i]
+ local x = c.x or 0
+ local w = c.w or 0
+ if xposition >= x and xposition <= (x + w) then
+ return i
+ end
+ end
+ end
+ return 1
+end
+
jobpositions.overlapping = overlapping
jobpositions.onsamepage = onsamepage
+jobpositions.columnofpos = columnofpos
-- interface
@@ -1287,7 +1242,7 @@ scanners.MPposset = function() -- name (special helper, used in backgrounds)
local b = f_b_tag(name)
local e = f_e_tag(name)
local w = f_w_tag(name)
- local p = f_p_tag(jobpositions.n(b))
+ local p = f_p_tag(getparagraph(b))
MPpos(b) context(",") MPpos(e) context(",") MPpos(w) context(",") MPpos(p) context(",") MPpardata(p)
end
@@ -1387,6 +1342,10 @@ scanners.doifelsepositionsonthispage = function() -- list
doifelse(onsamepage(scanstring(),tostring(texgetcount("realpageno"))))
end
+-- scanners.columnofpos = function()
+-- context(columnofpos(scaninteger(),scandimen())
+-- end
+
scanners.doifelsepositionsused = function()
doifelse(next(collected))
end
@@ -1403,6 +1362,11 @@ scanners.markregionboxtagged = function() -- box tag
markregionbox(scaninteger(),scanstring())
end
+scanners.markregionboxtaggedn = function() -- box tag n
+ markregionbox(scaninteger(),scanstring(),nil,
+ nil,nil,nil,nil,nil,scaninteger())
+end
+
scanners.setregionboxtagged = function() -- box tag
setregionbox(scaninteger(),scanstring())
end
@@ -1441,3 +1405,12 @@ statistics.register("positions", function()
return nil
end
end)
+
+-- We support the low level positional commands too:
+
+local newsavepos = nodes.pool.savepos
+local implement = interfaces.implement
+
+implement { name = "savepos", actions = function() context(newsavepos()) end }
+implement { name = "lastxpos", actions = function() context(gethpos()) end }
+implement { name = "lastypos", actions = function() context(getvpos()) end }
diff --git a/Master/texmf-dist/tex/context/base/mkiv/anch-pos.mkiv b/Master/texmf-dist/tex/context/base/mkiv/anch-pos.mkiv
index fbebb5f173b..2762a53c65c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/anch-pos.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/anch-pos.mkiv
@@ -279,9 +279,9 @@
% beware we need to pass \somethingexpanded or { }
-\unexpanded\def\anch_mark_column_box#1%
+\unexpanded\def\anch_mark_column_box#1#2% box n
{\global\advance\c_anch_column\plusone
- \clf_markregionboxtagged#1{columnarea:\the\c_anch_column}} % extra height
+ \clf_markregionboxtaggedn#1{columnarea:\the\c_anch_column}#2\relax} % extra height
\unexpanded\def\anch_mark_region_box
{\iftrialtypesetting
@@ -497,4 +497,10 @@
\let\doifpositionsusedelse\doifelsepositionsused
+%D Moved here:
+
+\unexpanded\def\savepos {\clf_savepos}
+\unexpanded\def\lastxpos{\numexpr\clf_lastxpos\relax}
+\unexpanded\def\lastypos{\numexpr\clf_lastypos\relax}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/anch-snc.lua b/Master/texmf-dist/tex/context/base/mkiv/anch-snc.lua
index 8006f3bd674..ee13adca39d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/anch-snc.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/anch-snc.lua
@@ -7,18 +7,14 @@ if not modules then modules = { } end modules ['anch-snc'] = {
}
-function mp.xxOverlayRegion()
- local r = tokens.getters.macro("m_overlay_region")
- mp.quoted('"'.. r .. '"')
--- mp.print('"'.. r .. '"')
-end
-
-- use factors as in mlib-int.lua
local tonumber, next, setmetatable = tonumber, next, setmetatable
local concat, sort, remove, copy = table.concat, table.sort, table.remove, table.copy
local match, find = string.match, string.find
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+
+local P, Cc = lpeg.P, lpeg.Cc
local setmetatableindex = table.setmetatableindex
@@ -28,11 +24,10 @@ local mpnumeric = mp.numeric
local mppoints = mp.points
local texgetdimen = tex.getdimen
-local p_number = lpeg.patterns.cardinal/tonumber
-local p_space = lpeg.patterns.whitespace^0
-local p_tag = lpeg.P("syncpos:") * p_number * lpeg.P(":") * p_number
-local p_option = p_number -- for now
- * ((lpeg.P(",") * p_space * lpeg.P("reset") * lpeg.Cc(true)) + lpeg.Cc(false))
+local p_number = patterns.cardinal/tonumber
+local p_space = patterns.whitespace^0
+local p_tag = P("syncpos:") * p_number * P(":") * p_number
+local p_option = p_number * ((P(",") * p_space * P("reset") * Cc(true)) + Cc(false)) -- for now
local list = { }
local colors = setmetatableindex("table")
@@ -269,3 +264,9 @@ function mp.sync_get_y() mpnumeric((list.page.y or 0)*factor) end
function mp.sync_get_w() mpnumeric((list.page.w or 0)*factor) end
function mp.sync_get_h() mpnumeric((list.page.h or 0)*factor) end
function mp.sync_get_d() mpnumeric((list.page.d or 0)*factor) end
+
+-- function mp.xxOverlayRegion()
+-- local r = tokens.getters.macro("m_overlay_region")
+-- mp.quoted('"'.. r .. '"')
+-- end
+
diff --git a/Master/texmf-dist/tex/context/base/mkiv/attr-col.lua b/Master/texmf-dist/tex/context/base/mkiv/attr-col.lua
index 5ea72c7e3b3..15590dccceb 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/attr-col.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/attr-col.lua
@@ -549,7 +549,7 @@ local function extender(transparencies,key)
end
local function reviver(data,n)
- if transparencies.supported then
+ if n and transparencies.supported then
local v = values[n]
local d
if not v then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/attr-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/attr-ini.lua
index dd971afc149..6145fa08d08 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/attr-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/attr-ini.lua
@@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['attr-ini'] = {
}
local next, type = next, type
+local osexit = os.exit
--[[ldx--
<p>We start with a registration system for atributes so that we can use the
@@ -34,6 +35,8 @@ attributes.states = attributes.states or { }
attributes.handlers = attributes.handlers or { }
attributes.unsetvalue = -0x7FFFFFFF
+local currentfont = font.current
+
local names = attributes.names
local numbers = attributes.numbers
local list = attributes.list
@@ -74,7 +77,7 @@ function attributes.private(name) -- at the lua end (hidden from user)
sharedstorage.attributes_last_private = last
else
report_attribute("no more room for private attributes")
- os.exit()
+ osexit()
end
number = last
numbers[name], names[number], list[number] = number, name, { }
@@ -91,7 +94,7 @@ function attributes.public(name) -- at the lua end (hidden from user)
sharedstorage.attributes_last_public = last
else
report_attribute("no more room for public attributes")
- os.exit()
+ osexit()
end
number = last
numbers[name], names[number], list[number] = number, name, { }
@@ -146,7 +149,7 @@ function attributes.save(name)
end
store[name] = {
attr = t,
- font = font.current(),
+ font = currentfont(),
}
end
@@ -163,7 +166,8 @@ function attributes.restore(name)
end
if font then
-- tex.font = font
- context.getvalue(fonts.hashes.csnames[font]) -- we don't have a direct way yet (will discuss it with taco)
+ -- context.getvalue(fonts.hashes.csnames[font])
+ currentfont(font)
end
end
-- store[name] = nil
diff --git a/Master/texmf-dist/tex/context/base/mkiv/attr-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/attr-ini.mkiv
index 3792b1c6370..49a1126b9a6 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/attr-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/attr-ini.mkiv
@@ -57,31 +57,60 @@
\def\attr_basics_define {\attr_basics_define_indeed\s!public}
\def\attr_basics_define_system{\attr_basics_define_indeed\s!private}
- % here public means 'visible' so it's not to be confused with 'public' at the lua end
+% todo: define global !
+
+% here public means 'visible' so it's not to be confused with 'public' at the lua end
+
+% \def\attr_basics_define_indeed#1[#2][#3]%
+% {\ifcsname\??attributecount#2\endcsname\else
+% \scratchcounter\clf_defineattribute{#2}{#1}\relax
+% %\writestatus\m!system{defining #1 attribute #2 with number \number\scratchcounter}%
+% \expandafter\attributedef\csname\??attributecount#2\endcsname\scratchcounter
+% \expandafter\newconstant \csname\??attributeid#2\endcsname
+% \csname\??attributeid#2\endcsname\scratchcounter
+% % some attributes are always global
+% \doifelseinset\s!global{#3}%
+% {\etoksapp\t_attr_list_global{\csname\??attributecount#2\endcsname\attributeunsetvalue}}%
+% {\etoksapp\t_attr_list_local {\csname\??attributecount#2\endcsname\attributeunsetvalue}}%
+% \doifinset\s!nomath{#3}%
+% {\etoksapp\t_attr_list_nomath{\csname\??attributecount#2\endcsname\attributeunsetvalue}}%
+% \doifinset\s!public{#3}%
+% {\expandafter\let\csname#2\s!attribute\expandafter\endcsname\csname\??attributeid#2\endcsname}%
+% \doifinset\s!pickup{#3}%
+% {\expandafter\newconstant\csname\??attributepickup#2\endcsname
+% \csname\??attributepickup#2\endcsname\attributeunsetvalue
+% \etoksapp\t_attr_list_pickup{\csname\??attributecount#2\endcsname\csname\??attributepickup#2\endcsname}%
+% \ifcsname#2\s!attribute\endcsname
+% \expandafter\edef\csname\s!pickup#2\s!attribute\endcsname
+% {\csname\??attributepickup#2\endcsname\csname\??attributecount#2\endcsname}%
+% \expandafter\edef\csname\s!forget#2\s!attribute\endcsname
+% {\csname\??attributepickup#2\endcsname\attributeunsetvalue}%
+% \fi}%
+% \fi}
\def\attr_basics_define_indeed#1[#2][#3]%
{\ifcsname\??attributecount#2\endcsname\else
\scratchcounter\clf_defineattribute{#2}{#1}\relax
%\writestatus\m!system{defining #1 attribute #2 with number \number\scratchcounter}%
- \expandafter\attributedef\csname\??attributecount#2\endcsname\scratchcounter
- \expandafter\newconstant \csname\??attributeid#2\endcsname
- \csname\??attributeid#2\endcsname\scratchcounter
+ \global\expandafter\attributedef\csname\??attributecount#2\endcsname\scratchcounter
+ \global\expandafter\newconstant \csname\??attributeid#2\endcsname
+ \global\csname\??attributeid#2\endcsname\scratchcounter
% some attributes are always global
\doifelseinset\s!global{#3}%
- {\etoksapp\t_attr_list_global{\csname\??attributecount#2\endcsname\attributeunsetvalue}}%
- {\etoksapp\t_attr_list_local {\csname\??attributecount#2\endcsname\attributeunsetvalue}}%
+ {\xtoksapp\t_attr_list_global{\csname\??attributecount#2\endcsname\attributeunsetvalue}}%
+ {\xtoksapp\t_attr_list_local {\csname\??attributecount#2\endcsname\attributeunsetvalue}}%
\doifinset\s!nomath{#3}%
- {\etoksapp\t_attr_list_nomath{\csname\??attributecount#2\endcsname\attributeunsetvalue}}%
+ {\xtoksapp\t_attr_list_nomath{\csname\??attributecount#2\endcsname\attributeunsetvalue}}%
\doifinset\s!public{#3}%
- {\expandafter\let\csname#2\s!attribute\expandafter\endcsname\csname\??attributeid#2\endcsname}%
+ {\expandafter\glet\csname#2\s!attribute\expandafter\endcsname\csname\??attributeid#2\endcsname}%
\doifinset\s!pickup{#3}%
- {\expandafter\newconstant\csname\??attributepickup#2\endcsname
- \csname\??attributepickup#2\endcsname\attributeunsetvalue
- \etoksapp\t_attr_list_pickup{\csname\??attributecount#2\endcsname\csname\??attributepickup#2\endcsname}%
+ {\global\expandafter\newconstant\csname\??attributepickup#2\endcsname
+ \global\csname\??attributepickup#2\endcsname\attributeunsetvalue
+ \xtoksapp\t_attr_list_pickup{\csname\??attributecount#2\endcsname\csname\??attributepickup#2\endcsname}%
\ifcsname#2\s!attribute\endcsname
- \expandafter\edef\csname\s!pickup#2\s!attribute\endcsname
+ \expandafter\xdef\csname\s!pickup#2\s!attribute\endcsname
{\csname\??attributepickup#2\endcsname\csname\??attributecount#2\endcsname}%
- \expandafter\edef\csname\s!forget#2\s!attribute\endcsname
+ \expandafter\xdef\csname\s!forget#2\s!attribute\endcsname
{\csname\??attributepickup#2\endcsname\attributeunsetvalue}%
\fi}%
\fi}
@@ -95,9 +124,13 @@
% \unexpanded\def\pickupattributelater#1%
% {\csname\??attributepickup#1\endcsname\csname\??attributecount#1\endcsname}
+% \unexpanded\def\newattribute#1%
+% {\attr_basics_define_indeed\s!public[\csstring#1][]%
+% \expandafter\let\expandafter#1\csname\??attributeid\csstring#1\endcsname}
+
\unexpanded\def\newattribute#1%
{\attr_basics_define_indeed\s!public[\csstring#1][]%
- \expandafter\let\expandafter#1\csname\??attributeid\csstring#1\endcsname}
+ \expandafter\glet\expandafter#1\csname\??attributeid\csstring#1\endcsname}
% expandable so we can \edef them for speed
@@ -108,8 +141,13 @@
\let\dompattribute\gobbletwoarguments
-\unexpanded\def\resetglobalattributes{\the\t_attr_list_global\attribute\zerocount\zerocount}
-\unexpanded\def\resetlocalattributes {\the\t_attr_list_local \attribute\zerocount\zerocount}
+\ifcase\contextlmtxmode
+ \unexpanded\def\resetglobalattributes{\the\t_attr_list_global\attribute\zerocount\zerocount}
+ \unexpanded\def\resetlocalattributes {\the\t_attr_list_local \attribute\zerocount\zerocount}
+\else
+ \unexpanded\def\resetglobalattributes{\the\t_attr_list_global\glyphdatafield \zerocount}
+ \unexpanded\def\resetlocalattributes {\the\t_attr_list_local \glyphdatafield \zerocount}
+\fi
\let\resetallattributes\resetlocalattributes
@@ -147,12 +185,18 @@
\unexpanded\def\showattributes{\clf_showattributes}
+%D Todo:
+
+% \appendtoks
+% \clf_cleanupattributes
+% \to \everyafterpagebreak
+
\protect \endinput
% for the luatex list:
%
% \attributedef\zeroattribute=0
-% \attributedef\someatriubute=999
+% \attributedef\someattribute=999
%
% \directlua {
% local createtoken = newtoken.create
diff --git a/Master/texmf-dist/tex/context/base/mkiv/attr-lay.lua b/Master/texmf-dist/tex/context/base/mkiv/attr-lay.lua
index ff9d1c38fd3..28f6e92765c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/attr-lay.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/attr-lay.lua
@@ -201,6 +201,7 @@ function viewerlayers.start(name)
else
texsetattribute(a_viewerlayer,a)
end
+ -- or macro
texsettokenlist("currentviewerlayertoks",name)
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-exp.lua b/Master/texmf-dist/tex/context/base/mkiv/back-exp.lua
index f5035d3cfab..00c939b999b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/back-exp.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-exp.lua
@@ -34,7 +34,7 @@ if not modules then modules = { } end modules ['back-exp'] = {
-- check setting __i__
local next, type, tonumber = next, type, tonumber
-local sub, gsub = string.sub, string.gsub
+local sub, gsub, match = string.sub, string.gsub, string.match
local validstring = string.valid
local lpegmatch = lpeg.match
local utfchar, utfvalues, utflen = utf.char, utf.values, utf.len
@@ -46,7 +46,7 @@ local replacetemplate = utilities.templates.replace
local trace_export = false trackers.register ("export.trace", function(v) trace_export = v end)
local trace_spacing = false trackers.register ("export.trace.spacing", function(v) trace_spacing = v end)
-local trace_detail = false trackers.register ("export.trace.detail", function(v) trace_detail = v end)
+local trace_details = false trackers.register ("export.trace.details", function(v) trace_details = v end)
local less_state = false directives.register("export.lessstate", function(v) less_state = v end)
local show_comment = true directives.register("export.comment", function(v) show_comment = v end)
@@ -305,7 +305,7 @@ document,
%namespace%div.document {
font-size : %size% !important ;
max-width : %width% !important ;
- text-width : %align% !important ;
+ text-align : %align% !important ;
hyphens : %hyphens% !important ;
}]]
@@ -334,7 +334,7 @@ local styletemplate = [[
namespace = contextns,
-- cssnamespaceurl = usecssnamespace and cssnamespaceurl or cssnamespacenop,
cssnamespaceurl = cssnamespaceurl,
- }) }
+ },false,true) }
--
local bodyfont = finetuning.bodyfont
local width = finetuning.width
@@ -438,7 +438,7 @@ local imagetemplate = [[
namespace = contextns,
-- cssnamespaceurl = usecssnamespace and cssnamespaceurl or "",
cssnamespaceurl = cssnamespaceurl,
- }) }
+ },false,true) }
for element, details in sortedhash(usedimages) do
for detail, data in sortedhash(details) do
local name = data.name
@@ -1234,28 +1234,38 @@ do
local ndata = #data
local roottg = root.tg
if roottg == "msubsup" then
+ -- kind of tricky: we have a diufferent order in display mode
local nucleus, superscript, subscript
- for i=1,ndata do
- local di = data[i]
- if not di then
- -- weird
- elseif di.content then
- -- text
- elseif not nucleus then
- nucleus = i
- elseif not superscript then
- superscript = i
- elseif not subscript then
- subscript = i
- else
- -- error
+ if ndata > 3 then
+ -- error
+ else
+ for i=1,ndata do
+ local di = data[i]
+ if not di then
+ -- weird
+ elseif di.content then
+ -- text
+ else
+ local s = specifications[di.fulltag]
+ if s.subscript then
+ subscript = i
+ elseif s.superscript then
+ superscript = i
+ else
+ nucleus = i
+ end
+ end
+ end
+ if superscript or subscript then
+ -- we probably always have 3 anyway ... needs checking
+ local nuc = nucleus and data[nucleus]
+ local sub = subscript and data[subscript]
+ local sup = superscript and data[superscript]
+ local n = 0 -- play safe
+ if nuc then n = n + 1 ; data[n] = nuc end
+ if sub then n = n + 1 ; data[n] = sub end
+ if sup then n = n + 1 ; data[n] = sup end
end
- end
- if superscript and subscript then
- local sup, sub = data[superscript], data[subscript]
- data[superscript], data[subscript] = sub, sup
- -- sub.__o__, sup.__o__ = subscript, superscript
- sub.__i__, sup.__i__ = superscript, subscript
end
-- elseif roottg == "msup" or roottg == "msub" then
-- -- m$^2$
@@ -1982,6 +1992,10 @@ do
end
end
+ function structurestags.gettablecell(fulltag)
+ return tabledata[fulltag]
+ end
+
function extras.tablecell(di,element,n,fulltag)
local hash = tabledata[fulltag]
if hash then
@@ -2017,6 +2031,10 @@ do
end
end
+ function structurestags.gettabulatecell(fulltag)
+ return tabulatedata[fulltag]
+ end
+
function extras.tabulate(di,element,n,fulltag)
local data = di.data
for i=1,#data do
@@ -2086,6 +2104,29 @@ do
end
+do
+
+ local usedparagraphs = { }
+
+ function structurestags.setparagraph(align)
+ if align ~= "" then
+ usedparagraphs[locatedtag("paragraph")] = {
+ dataset = dataset,
+ tag = tag,
+ align = align,
+ }
+ end
+ end
+
+ function extras.paragraph(di,element,n,fulltag)
+ local hash = usedparagraphs[fulltag]
+ if hash then
+ setattribute(di,"align",hash.align)
+ end
+ end
+
+end
+
-- flusher
do
@@ -2659,16 +2700,16 @@ local function push(fulltag,depth)
end
local treedata = tree.data
local t = { -- maybe we can use the tag table
- tg = tg,
- fulltag = fulltag,
- detail = detail,
- n = n, -- already a number
- element = element,
- nature = nature,
- data = { },
- attribute = currentattribute,
- parnumber = currentparagraph,
- record = record, -- we can consider storing properties
+ tg = tg,
+ fulltag = fulltag,
+ detail = detail,
+ n = n, -- already a number
+ element = element,
+ nature = nature,
+ data = { },
+ attribute = currentattribute,
+ parnumber = currentparagraph,
+ record = record, -- we can consider storing properties
}
treedata[#treedata+1] = t
currentdepth = currentdepth + 1
@@ -2701,9 +2742,9 @@ local function pop()
currentdepth = currentdepth - 1
if trace_export then
if top then
- report_export("%w</%s>",currentdepth,tree.tg)
+ report_export("%w</%s>",currentdepth,match(top,"[^>]+"))
else
- report_export("</%s>",tree.tg)
+ report_export("</BAD>")
end
end
else
@@ -2906,6 +2947,8 @@ local collectresults do -- too many locals otherwise
local getkern = nuts.getkern
local getwidth = nuts.getwidth
+ local start_of_par = nuts.start_of_par
+
local nexthlist = nuts.traversers.hlist
local nextnode = nuts.traversers.node
@@ -2947,7 +2990,7 @@ local collectresults do -- too many locals otherwise
local maybewrong
local pid
for n, id, subtype in nextnode, head do
- if trace_detail then
+ if trace_details then
showdetail(n,id,subtype)
end
if id == glyph_code then
@@ -3280,7 +3323,7 @@ local collectresults do -- too many locals otherwise
last = nil
currentparagraph = nil
end
- elseif not localparagraph and id == localpar_code and subtype == 0 then
+ elseif not localparagraph and id == localpar_code and start_of_par(n) then
localparagraph = getattr(n,a_taggedpar)
end
p = n
@@ -3444,7 +3487,7 @@ local htmltemplate = [[
namespace = contextns,
-- cssnamespaceurl = usecssnamespace and cssnamespaceurl or "",
cssnamespaceurl = cssnamespaceurl,
- }) }
+ },false,true) }
for element, details in sortedhash(used) do
if namespaces[element] then
-- skip math
@@ -3921,7 +3964,7 @@ local htmltemplate = [[
end
- local examplefilename = resolvers.find_file("export-example.css")
+ local examplefilename = resolvers.findfile("export-example.css")
if examplefilename then
local data = io.loaddata(examplefilename)
if not data or data == "" then
@@ -4250,3 +4293,9 @@ implement {
actions = structurestags.setpublication,
arguments = "2 strings"
}
+
+implement {
+ name = "settagparagraph",
+ actions = structurestags.setparagraph,
+ arguments = "string"
+}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-exp.mkiv b/Master/texmf-dist/tex/context/base/mkiv/back-exp.mkiv
index 03dbe709a97..3e8469b145e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/back-exp.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-exp.mkiv
@@ -262,6 +262,13 @@
\fi}%
\to \everyenableelements
+\appendtoks
+ \unexpanded\def\dotagparagraph#1%
+ {\iftrialtypesetting\else
+ \clf_settagparagraph{#1}\relax
+ \fi}%
+\to \everyenableelements
+
% The action: \setupbackend[export=yes] % or filename
% maybe xhtml css settings will move to setupexport
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/back-ini.lua
index b7af1529b71..b0af61edcd8 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/back-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-ini.lua
@@ -8,31 +8,21 @@ if not modules then modules = { } end modules ['back-ini'] = {
local next, type = next, type
local format = string.format
-local sind, cosd, abs = math.sind, math.cosd, math.abs
-local insert, remove = table.insert, table.remove
-local unpack = unpack
backends = backends or { }
local backends = backends
-local trace_backend = false trackers.register("backend.initializers", function(v) trace_finalizers = v end)
+local context = context
+local trace = false trackers.register("backend", function(v) trace = v end)
local report = logs.reporter("backend")
-local report_backend = logs.reporter("backend","initializing")
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
local setaction = nodes.tasks.setaction
-local scanners = tokens.scanners
-local scannumber = scanners.number
-local scankeyword = scanners.keyword
-local scancount = scanners.count
-local scanstring = scanners.string
-
-local scanners = interfaces.scanners
-
local implement = interfaces.implement
+local variables = interfaces.variables
local texset = tex.set
@@ -76,7 +66,7 @@ local lmtx_mode = nil
local function lmtxmode()
if lmtx_mode == nil then
- lmtx_mode = ((tonumber(CONTEXTLMTXMODE) or 0) > 0) and drivers and drivers.lmtxversion
+ lmtx_mode = CONTEXTLMTXMODE > 0 and drivers and drivers.lmtxversion
end
return lmtx_mode
end
@@ -87,11 +77,11 @@ function backends.install(what)
if type(what) == "string" then
local backend = backends[what]
if backend then
- if trace_backend then
+ if trace then
if backend.comment then
- report_backend("initializing backend %a, %a",what,backend.comment)
+ report("initializing backend %a, %a",what,backend.comment)
else
- report_backend("initializing backend %a",what)
+ report("initializing backend %a",what)
end
end
backends.current = what
@@ -101,8 +91,8 @@ function backends.install(what)
setmetatableindex(plugin, default)
setmetatableindex(target, plugin)
end
- elseif trace_backend then
- report_backend("no backend named %a",what)
+ elseif trace then
+ report("no backend named %a",what)
end
end
end
@@ -139,7 +129,7 @@ interfaces.implement {
name = "setrealspaces",
arguments = "string",
actions = function(v)
- setaction("shipouts","nodes.handlers.accessibility",v == interfaces.variables.yes)
+ setaction("shipouts","nodes.handlers.accessibility",v == variables.yes)
end
}
@@ -192,125 +182,31 @@ implement {
end
}
--- could also be codeinjections
-
-function backends.noflatelua()
- return status.late_callbacks or 0
-end
-
---
-
-local stack = { }
-local restore = true -- false
-local nodepool = nodes.pool
-local savenode = nodepool.save
-local restorenode = nodepool.restore
-local setmatrixnode = nodepool.setmatrix
+local page_x_origin = 0
+local page_y_origin = 0
-updaters.register("backend.update",function()
- savenode = nodepool.save
- restorenode = nodepool.restore
- setmatrixnode = nodepool.setmatrix
-end)
-
-local function stopsomething()
- local top = remove(stack)
- if top == false then
- -- not wrapped
- elseif top == true then
- context(restorenode())
- elseif top then
- context(setmatrixnode(unpack(top))) -- not really needed anymore
- context(restorenode())
- else
- -- nesting error
- end
-end
-
-local function startrotation()
- local a = scannumber()
- if a == 0 then
- insert(stack,false)
- else
- local s, c = sind(a), cosd(a)
- if abs(s) < 0.000001 then
- s = 0 -- otherwise funny -0.00000
- end
- if abs(c) < 0.000001 then
- c = 0 -- otherwise funny -0.00000
- end
- context(savenode())
- context(setmatrixnode(c,s,-s,c))
- insert(stack,restore and { c, -s, s, c } or true)
- end
+function codeinjections.setpageorigin(x,y)
+ page_x_origin = x
+ page_y_origin = y
end
-implement { name = "startrotation", actions = startrotation }
-implement { name = "stoprotation", actions = stopsomething }
-
-local function startscaling() -- at the tex end we use sx and sy instead of rx and ry
- local rx, ry = 1, 1
- while true do
- if scankeyword("rx") then
- rx = scannumber()
- elseif scankeyword("ry") then
- ry = scannumber()
- -- elseif scankeyword("revert") then
- -- local top = stack[#stack]
- -- if top then
- -- rx = top[1]
- -- ry = top[4]
- -- else
- -- rx = 1
- -- ry = 1
- -- end
- else
- break
- end
- end
- if rx == 1 and ry == 1 then
- insert(stack,false)
- else
- if rx == 0 then
- rx = 0.0001
- end
- if ry == 0 then
- ry = 0.0001
- end
- context(savenode())
- context(setmatrixnode(rx,0,0,ry))
- insert(stack,restore and { 1/rx, 0, 0, 1/ry } or true)
- end
+function codeinjections.getpageorigin()
+ local x = page_x_origin
+ local y = page_y_origin
+ page_x_origin = 0
+ page_y_origin = 0
+ return x, y, (x ~= 0 or y ~= 0)
end
-implement { name = "startscaling", actions = startscaling }
-implement { name = "stopscaling", actions = stopsomething }
-
-local function startmatrix() -- rx sx sy ry -- tx, ty
- local rx, sx, sy, ry = 1, 0, 0, 1
- while true do
- if scankeyword("rx") then rx = scannumber()
- elseif scankeyword("ry") then ry = scannumber()
- elseif scankeyword("sx") then sx = scannumber()
- elseif scankeyword("sy") then sy = scannumber()
- else break end
- end
- if rx == 1 and sx == 0 and sy == 0 and ry == 1 then
- insert(stack,false)
- else
- context(savenode())
- context(setmatrixnode(rx,sx,sy,ry))
- insert(stack,store and { -rx, -sx, -sy, -ry } or true)
- end
-end
+implement {
+ name = "setpageorigin",
+ arguments = { "dimension", "dimension" },
+ actions = codeinjections.setpageorigin,
+}
-implement { name = "startmatrix", actions = startmatrix }
-implement { name = "stopmatrix", actions = stopsomething }
+-- could also be codeinjections
-local function startmirroring()
- context(setmatrixnode(-1,0,0,1))
+function backends.noflatelua()
+ return status.late_callbacks or 0
end
-
-implement { name = "startmirroring", actions = startmirroring }
-implement { name = "stopmirroring", actions = startmirroring } -- not: stopsomething
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/back-ini.mkiv
index 8729403f848..43fe48ee0a9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/back-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-ini.mkiv
@@ -11,35 +11,12 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D Most will go away here as it is replaced by \LUA\ calls to
-%D backend functions.
-
\writestatus{loading}{ConTeXt Backend Macros / Initialization}
-%D The exact page model depends on the backend so we just define some
-%D variables that are used. A helper at the \LUA\ end will synchronize
-%D with the internal variables. We store these in the format.
-
-% \newdimen\backendpageheight
-% \newdimen\backendpagewidth
-% \newdimen\backendinchoffset \backendinchoffset=1in
-
-%D Now we load the \LUA\ code:
-
\registerctxluafile{back-ini}{}
-\registerctxluafile{back-res}{}
-
-\doifelsefileexists{back-out.mkiv}{\loadmarkfile{back-out}}{}
-
-%D We currently have a curious mix between tex and lua backend handling but
-%D eventually most will move to \LUA.
\unprotect
-\ifdefined\everybackendshipout \else \newtoks\everybackendshipout \fi
-\ifdefined\everylastbackendshipout \else \newtoks\everylastbackendshipout \fi
-\ifdefined\everybackendlastinshipout \else \newtoks\everybackendlastinshipout \fi % e.g. finalize via latelua
-
%D Right from the start \CONTEXT\ had a backend system based on runtime pluggable
%D code. As most backend issues involved specials and since postprocessors had not
%D that much in common, we ended up with a system where we could switch backend as
@@ -52,104 +29,31 @@
%D At this moment \DVI\ is no longer used for advanced document output and we
%D therefore dropped support for this format. Future versions might support more
%D backends again, but this has a low priority.
-%D
-%D Not everything here makes sense and the content of this file will definitely
-%D change (or even go away).
-
-% rotation
-
-\unexpanded\def\dostartrotation#1%
- {\forcecolorhack
- \clf_startrotation#1\relax} % todo: implement without Q q
-
-\unexpanded\def\dostoprotation
- {\clf_stoprotation
- \forcecolorhack}
-
-% scaling
-
-\unexpanded\def\dostartscaling#1#2%
- {\forcecolorhack
- \clf_startscaling rx #1 ry #2\relax}
-
-\unexpanded\def\dostopscaling
- {\clf_stopscaling
- \forcecolorhack}
-
-% mirroring
-
-\unexpanded\def\dostartmirroring
- {\clf_startmirroring}
-
-\unexpanded\def\dostopmirroring
- {\clf_stopmirroring}
-
-% transform
-
-\unexpanded\def\dotransformnextbox#1#2#3#4#5#6%
- {\dowithnextbox{\dodotransformnextbox{#1}{#2}{#3}{#4}{#5}{#6}}}
-\unexpanded\def\dodotransformnextbox#1#2#3#4#5#6%
- {\hpack
- {\kern #5\onebasepoint
- \raise#6\onebasepoint
- \hpack
- {\clf_startmatrix rx #1 sx #2 sy #3 ry #4\relax
- \box\nextbox
- \clf_stopmatrix}}}
+\outputmode\plusone
+\let\outputmode\relax
+\newcount\outputmode
+\outputmode\plusone
+\let\normaloutputmode\outputmode
-%D \macros
-%D {back_ovalbox}
-%D
-%D When we look at the implementation, this is a complicated one. There are seven
-%D arguments.
-%D
-%D \starttyping
-%D \back_ovalbox {w} {h} {d} {linewidth} {radius} {stroke} {fill} {variant}
-%D \stoptyping
-%D
-%D This command has to return a \type {\vbox} which can be used to lay over another
-%D one (with text). The radius is in degrees, the stroke and fill are~\type {1}
-%D (true) of~\type {0} (false).
-
-\let\back_ovalbox \gobbleeightarguments
-
-%D \macros
-%D {dostartclipping,dostopclipping}
-%D
-%D Clipping is implemented in such a way that an arbitrary code can be fed.
-%D
-%D \starttyping
-%D \dostartclipping {pathname} {width} {height}
-%D \dostopclipping
-%D \stoptyping
+%D The exact page model depends on the backend so we just define some variables that
+%D are used. A helper at the \LUA\ end will synchronize with the internal variables.
+%D We store these in the format.
-\let \dostartclipping \gobblethreearguments
-\let \dostopclipping \donothing
-
-%D \macros
-%D {jobsuffix}
-%D
-%D By default, \TEX\ produces \DVI\ files which can be converted to other filetypes.
-%D Sometimes it is handy to know what the target file will be. In other driver
-%D modules we wil set \type {\jobsuffix} to \type {pdf}.
+\ifdefined\everybackendshipout \else \newtoks\everybackendshipout \fi
+\ifdefined\everylastbackendshipout \else \newtoks\everylastbackendshipout \fi
+\ifdefined\everybackendlastinshipout \else \newtoks\everybackendlastinshipout \fi
-%D Backend configuration:
+%D In \MKIV\ there is just one backend, \PDF, plus an additional export. We never
+%D came to seperate them, but \LMTX\ might do that.
\installcorenamespace{backend}
\installsetuponlycommandhandler \??backend {backend}
-\let\jobsuffix\empty
-
-\unexpanded\def\back_job_set_suffix#1% % checking could happen in mode
- {\ifx\jobsuffix\empty\else\resetsystemmode\jobsuffix\fi
- \edef\jobsuffix{#1}%
- \ifx\jobsuffix\empty\else\setsystemmode \jobsuffix\fi}
-
-\back_job_set_suffix{pdf} % default
-
-% \setupbackend[space=yes] % replace spacing in (pdf) file
+%D \starttyping
+%D \setupbackend[space=yes]
+%D \stoptyping
\appendtoks
\clf_setrealspaces{\backendparameter\c!space}%
@@ -161,8 +65,7 @@
\fi
\to \everysetupbackend
-%D For older styles:
-
-\let\setupoutput\gobbleoneoptional
+\unexpanded\def\setupoutput[#1]%
+ {\clf_enabledriver{#1}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-ini.mkxl b/Master/texmf-dist/tex/context/base/mkiv/back-ini.mkxl
new file mode 100644
index 00000000000..4e2fa351ef0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-ini.mkxl
@@ -0,0 +1,81 @@
+%D \module
+%D [ file=back-ini,
+%D version=2009.04.15,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Backend Macros / Initialization}
+
+\registerctxluafile{back-ini}{}
+
+\unprotect
+
+%D Right from the start \CONTEXT\ had a backend system based on runtime pluggable
+%D code. As most backend issues involved specials and since postprocessors had not
+%D that much in common, we ended up with a system where we could switch backend as
+%D well as output code for multiple backends at the same time.
+%D
+%D Because \LUATEX\ has the backend built in, and since some backend issues have
+%D been moved to the frontend I decided to provide new backend code for \MKIV,
+%D starting with what was actually used.
+%D
+%D At this moment \DVI\ is no longer used for advanced document output and we
+%D therefore dropped support for this format. Future versions might support more
+%D backends again, but this has a low priority.
+
+%D The exact page model depends on the backend so we just define some variables that
+%D are used. A helper at the \LUA\ end will synchronize with the internal variables.
+%D We store these in the format.
+
+\ifdefined\everybackendshipout \else \newtoks\everybackendshipout \fi
+\ifdefined\everylastbackendshipout \else \newtoks\everylastbackendshipout \fi
+\ifdefined\everybackendlastinshipout \else \newtoks\everybackendlastinshipout \fi
+
+\installcorenamespace{backend}
+
+\installsetuponlycommandhandler \??backend {backend}
+
+%D \starttyping
+%D \setupbackend[space=yes]
+%D \stoptyping
+
+\appendtoks
+ \clf_setrealspaces{\backendparameter\c!space}%
+\to \everysetupbackend
+
+\appendtoks
+ \ifdefined\clf_resetmapfile
+ \clf_resetmapfile
+ \fi
+\to \everysetupbackend
+
+%D For the moment this is an experiment (defauls is pdf, but we also
+%D have lua, json and mps).
+%D
+%D \starttyping
+%D % \setupoutput[lua]
+%D % \setupoutput[json]
+%D % \setupoutput[mps]
+%D % \setupoutput[none] % for testing only
+%D % \setupoutput[empty] % for testing only
+%D
+%D \starttext
+%D \dorecurse{1000}{
+%D {\tf \red \samplefile{tufte}} \par
+%D {\bf \green \samplefile {ward}} \par
+%D {\sl \blue \samplefile{davis}} \par
+%D }
+%D \stoptext
+%D \stoptyping
+
+\unexpanded\def\setupoutput[#1]%
+ {\clf_enabledriver{#1}}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-lua.lua b/Master/texmf-dist/tex/context/base/mkiv/back-lua.lua
new file mode 100644
index 00000000000..4e95d37e3fb
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-lua.lua
@@ -0,0 +1,354 @@
+if not modules then modules = { } end modules ['back-lua'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- we can remap fonts
+
+local fontproperties = fonts.hashes.properties
+local fontparameters = fonts.hashes.parameters
+local fontshapes = fonts.hashes.shapes
+
+local starttiming = statistics.starttiming
+local stoptiming = statistics.stoptiming
+
+local bpfactor = number.dimenfactors.bp
+local texgetbox = tex.getbox
+
+local rulecodes = nodes.rulecodes
+local normalrule_code = rulecodes.normal
+----- boxrule_code = rulecodes.box
+----- imagerule_code = rulecodes.image
+----- emptyrule_code = rulecodes.empty
+----- userrule_code = rulecodes.user
+----- overrule_code = rulecodes.over
+----- underrule_code = rulecodes.under
+----- fractionrule_code = rulecodes.fraction
+----- radicalrule_code = rulecodes.radical
+local outlinerule_code = rulecodes.outline
+
+-- todo : per instance
+
+local pages = { }
+local fonts = { }
+local names = { }
+local mapping = { }
+local used = { }
+local shapes = { }
+local glyphs = { }
+local buffer = { }
+local b = 0
+local converter = nil
+
+local compact = false -- true
+local shapestoo = true
+
+local x, y, d, f, c, w, h, t, r, o
+
+local function reset()
+ buffer = { }
+ b = 0
+ t = nil
+ x = nil
+ y = nil
+ d = nil
+ f = nil
+ c = nil
+ w = nil
+ h = nil
+ r = nil
+ o = nil
+end
+
+local function result()
+ -- todo: we're now still in the pdf backend but need different codeinjections
+ local codeinjections = backends.pdf.codeinjections
+ local getvariable = codeinjections.getidentityvariable or function() end
+ local jobname = environment.jobname or tex.jobname or "unknown"
+ return {
+ metadata = {
+ unit = "bp",
+ jobname = jobname,
+ title = getvariable("title") or jobname,
+ subject = getvariable("subject"),
+ author = getvariable("author"),
+ keywords = getvariable("keywords"),
+ time = os.date("%Y-%m-%d %H:%M"),
+ engine = environment.luatexengine .. " " .. environment.luatexversion,
+ context = environment.version,
+ },
+ fonts = fonts,
+ pages = pages,
+ shapes = shapes,
+ }
+end
+
+-- actions
+
+local function outputfilename(driver)
+ return tex.jobname .. "-output.lua"
+end
+
+local function save() -- might become a driver function that already is plugged into stopactions
+ local filename = outputfilename()
+ drivers.report("saving result in %a",filename)
+ starttiming(drivers)
+ local data = result()
+ if data then
+ io.savedata(filename,table.serialize(data))
+ end
+ stoptiming(drivers)
+end
+
+local function prepare(driver)
+ converter = drivers.converters.lmtx
+ luatex.registerstopactions(1,function()
+ save()
+ end)
+end
+
+local function initialize(driver,details)
+ reset()
+end
+
+local function finalize(driver,details)
+ local n = details.pagenumber
+ local b = details.boundingbox
+ pages[n] = {
+ number = n,
+ content = buffer,
+ boundingbox = {
+ b[1] * bpfactor,
+ b[2] * bpfactor,
+ b[3] * bpfactor,
+ b[4] * bpfactor,
+ },
+ }
+end
+
+local function wrapup(driver)
+end
+
+local function cleanup(driver)
+ reset()
+end
+
+local function convert(driver,boxnumber,pagenumber)
+ converter(driver,texgetbox(boxnumber),"page",pagenumber)
+end
+
+-- flushers
+
+local function updatefontstate(id)
+ if not mapping[id] then
+ local fn = #fonts + 1
+ mapping[id] = fn
+ local properties = fontproperties[id]
+ local parameters = fontparameters[id]
+ local filename = file.basename(properties.filename)
+ local fontname = properties.fullname or properties.fontname
+ if shapestoo then
+ if not names[fontname] then
+ local sn = #shapes+1
+ names[fontname] = sn
+ shapes[sn] = { }
+ glyphs[sn] = fontshapes[id].glyphs
+ end
+ end
+ fonts[fn] = {
+ filename = filename,
+ name = fontname,
+ size = parameters.size * bpfactor,
+ shapes = shapestoo and names[fontname] or nil,
+ }
+ end
+end
+
+local function flushcharacter(current, pos_h, pos_v, pos_r, font, char)
+ local fnt = mapping[font]
+ b = b + 1
+ buffer[b] = {
+ t = "glyph" ~= t and "glyph" or nil,
+ f = font ~= f and fnt or nil,
+ c = char ~= c and char or nil,
+ x = pos_h ~= x and (pos_h * bpfactor) or nil,
+ y = pos_v ~= y and (pos_v * bpfactor) or nil,
+ d = pos_r ~= d and (pos_r == 1 and "r2l" or "l2r") or nil,
+ }
+ t = "glyph"
+ f = font
+ c = char
+ x = pos_h
+ y = pos_v
+ d = pos_r
+ if shapestoo then
+ -- can be sped up if needed
+ local sn = fonts[fnt].shapes
+ local shp = shapes[sn]
+ if not shp[char] then
+ shp[char] = glyphs[sn][char]
+ end
+ end
+end
+
+local function rule(pos_h, pos_v, pos_r, size_h, size_v, rule_s, rule_o)
+ b = b + 1
+ buffer[b] = {
+ t = "rule" ~= t and "rule" or nil,
+ r = rule_s ~= r and rule_s or nil,
+ o = rule_s == "outline" and rule_o ~= o and (rule_o * bpfactor) or nil,
+ w = size_h ~= w and (size_h * bpfactor) or nil,
+ h = size_v ~= h and (size_v * bpfactor) or nil,
+ x = pos_h ~= x and (pos_h * bpfactor) or nil,
+ y = pos_v ~= y and (pos_v * bpfactor) or nil,
+ d = pos_r ~= d and (pos_r == 1 and "r2l" or "l2r") or nil,
+ }
+ t = "rule"
+ w = size_h
+ h = size_v
+ x = pos_h
+ y = pos_v
+ d = pos_r
+end
+
+local function flushrule(current, pos_h, pos_v, pos_r, size_h, size_v, subtype)
+ local rule_s, rule_o
+ if subtype == normalrule_code then
+ rule_s = "normal"
+ elseif subtype == outlinerule_code then
+ rule_s = "outline"
+ rule_o = getdata(current)
+ else
+ return
+ end
+ return rule(pos_h, pos_v, pos_r, size_h, size_v, rule_s, rule_o)
+end
+
+local function flushsimplerule(current, pos_h, pos_v, pos_r, size_h, size_v)
+ return rule(pos_h, pos_v, pos_r, size_h, size_v, "normal", nil)
+end
+
+-- file stuff too
+-- todo: default flushers
+-- also color (via hash)
+
+-- installer
+
+drivers.install {
+ name = "lua",
+ actions = {
+ prepare = prepare,
+ initialize = initialize,
+ finalize = finalize,
+ wrapup = wrapup,
+ cleanup = cleanup,
+ convert = convert,
+ outputfilename = outputfilename,
+ },
+ flushers = {
+ updatefontstate = updatefontstate,
+ character = flushcharacter,
+ rule = flushrule,
+ }
+}
+
+-- actions
+
+local function outputfilename(driver)
+ return tex.jobname .. "-output.json"
+end
+
+local function save() -- might become a driver function that already is plugged into stopactions
+ local filename = outputfilename()
+ drivers.report("saving result in %a",filename)
+ starttiming(drivers)
+ local data = result()
+ if data then
+ if not utilities.json then
+ require("util-jsn")
+ end
+ io.savedata(filename,utilities.json.tostring(data,not compact))
+ end
+ stoptiming(drivers)
+end
+
+local function prepare(driver)
+ converter = drivers.converters.lmtx
+ luatex.registerstopactions(1,function()
+ save()
+ end)
+end
+
+-- installer
+
+drivers.install {
+ name = "json",
+ actions = {
+ prepare = prepare,
+ initialize = initialize,
+ finalize = finalize,
+ wrapup = wrapup,
+ cleanup = cleanup,
+ convert = convert,
+ outputfilename = outputfilename,
+ },
+ flushers = {
+ updatefontstate = updatefontstate,
+ character = flushcharacter,
+ rule = flushrule,
+ }
+}
+
+-- actions
+
+local function outputfilename(driver)
+ return tex.jobname .. "-output.js"
+end
+
+local function save() -- might become a driver function that already is plugged into stopactions
+ local filename = outputfilename()
+ drivers.report("saving result in %a",filename)
+ starttiming(drivers)
+ local data = result()
+ if data then
+ if not utilities.json then
+ require("util-jsn")
+ end
+ io.savedata(filename,
+ "const JSON_CONTEXT = JSON.parse ( `" ..
+ utilities.json.tostring(data,not compact) ..
+ "` ) ;\n"
+ )
+ end
+ stoptiming(drivers)
+end
+
+local function prepare(driver)
+ converter = drivers.converters.lmtx
+ luatex.registerstopactions(1,function()
+ save()
+ end)
+end
+
+-- installer
+
+drivers.install {
+ name = "js",
+ actions = {
+ prepare = prepare,
+ initialize = initialize,
+ finalize = finalize,
+ wrapup = wrapup,
+ cleanup = cleanup,
+ convert = convert,
+ outputfilename = outputfilename,
+ },
+ flushers = {
+ updatefontstate = updatefontstate,
+ character = flushcharacter,
+ rule = flushrule,
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-lua.mkxl b/Master/texmf-dist/tex/context/base/mkiv/back-lua.mkxl
new file mode 100644
index 00000000000..82ba8f9f196
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-lua.mkxl
@@ -0,0 +1,18 @@
+%D \module
+%D [ file=back-lua,
+%D version=2018.07.26,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=\LUA,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifcase\contextlmtxmode \else
+ \registerctxluafile{back-lua}{optimize}
+\fi
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-mps.lua b/Master/texmf-dist/tex/context/base/mkiv/back-mps.lua
new file mode 100644
index 00000000000..96c850ed63e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-mps.lua
@@ -0,0 +1,205 @@
+if not modules then modules = { } end modules ['back-mps'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local fontproperties = fonts.hashes.properties
+local fontparameters = fonts.hashes.parameters
+
+local starttiming = statistics.starttiming
+local stoptiming = statistics.stoptiming
+
+local bpfactor = number.dimenfactors.bp
+local texgetbox = tex.getbox
+local formatters = string.formatters
+
+local rulecodes = nodes.rulecodes
+local normalrule_code = rulecodes.normal
+----- boxrule_code = rulecodes.box
+----- imagerule_code = rulecodes.image
+----- emptyrule_code = rulecodes.empty
+----- userrule_code = rulecodes.user
+----- overrule_code = rulecodes.over
+----- underrule_code = rulecodes.under
+----- fractionrule_code = rulecodes.fraction
+----- radicalrule_code = rulecodes.radical
+local outlinerule_code = rulecodes.outline
+
+local fonts = { }
+local pages = { }
+local buffer = { }
+local b = 0
+local converter = nil
+
+local function reset()
+ buffer = { }
+ b = 0
+end
+
+local f_font = formatters[ "\\definefont[%s][file:%s*none @ %sbp]\n" ]
+
+local f_glyph = formatters[ [[draw textext.drt("\%s\char%i\relax") shifted (%N,%N);]] ]
+local f_rule = formatters[ [[fill unitsquare xscaled %N yscaled %N shifted (%N,%N);]] ]
+local f_outline = formatters[ [[draw unitsquare xscaled %N yscaled %N shifted (%N,%N);]] ]
+
+-- actions
+
+local function outputfilename(driver)
+ return tex.jobname .. "-output.tex"
+end
+
+local function save() -- might become a driver function that already is plugged into stopactions
+ starttiming(drivers)
+ if #pages > 0 then
+ local filename = outputfilename()
+ drivers.report("saving result in %a",filename)
+ reset()
+ b = b + 1
+ buffer[b] = "\\starttext\n"
+ for k, v in table.sortedhash(fonts) do
+ b = b + 1
+ buffer[b] = f_font(v.name,v.filename,v.size)
+ end
+ for i=1,#pages do
+ b = b + 1
+ buffer[b] = pages[i]
+ end
+ b = b + 1
+ buffer[b] = "\\stoptext\n"
+ io.savedata(filename,table.concat(buffer,"",1,b))
+ end
+ stoptiming(drivers)
+end
+
+local function prepare(driver)
+ converter = drivers.converters.lmtx
+ luatex.registerstopactions(1,function()
+ save()
+ end)
+end
+
+local function initialize(driver,details)
+ reset()
+ b = b + 1
+ buffer[b] = "\n\\startMPpage"
+end
+
+local function finalize(driver,details)
+ b = b + 1
+ buffer[b] = "\\stopMPpage\n"
+ pages[details.pagenumber] = table.concat(buffer,"\n",1,b)
+end
+
+local function wrapup(driver)
+end
+
+local function cleanup(driver)
+ reset()
+end
+
+local function convert(driver,boxnumber,pagenumber)
+ converter(driver,texgetbox(boxnumber),"page",pagenumber)
+end
+
+-- flushers
+
+local last
+
+local function updatefontstate(id)
+ if fonts[id] then
+ last = fonts[id].name
+ else
+ last = "MPSfont" .. converters.Characters(id)
+ fonts[id] = {
+ filename = file.basename(fontproperties[id].filename),
+ size = fontparameters[id].size * bpfactor,
+ name = last,
+ }
+ end
+end
+
+local function flushcharacter(current, pos_h, pos_v, pod_r, font, char)
+ b = b + 1
+ buffer[b] = f_glyph(last,char,pos_h*bpfactor,pos_v*bpfactor)
+end
+
+local function flushrule(current, pos_h, pos_v, pod_r, size_h, size_v, subtype)
+ if subtype == normalrule_code then
+ b = b + 1
+ buffer[b] = f_rule(size_h*bpfactor,size_v*bpfactor,pos_h*bpfactor,pos_v*bpfactor)
+ elseif subtype == outlinerule_code then
+ b = b + 1
+ buffer[b] = f_outline(size_h*bpfactor,size_v*bpfactor,pos_h*bpfactor,pos_v*bpfactor)
+ end
+end
+
+local function flushsimplerule(current, pos_h, pos_v, pod_r, size_h, size_v)
+ b = b + 1
+ buffer[b] = f_rule(size_h*bpfactor,size_v*bpfactor,pos_h*bpfactor,pos_v*bpfactor)
+end
+
+-- installer
+
+drivers.install {
+ name = "mps",
+ actions = {
+ prepare = prepare,
+ initialize = initialize,
+ finalize = finalize,
+ wrapup = wrapup,
+ cleanup = cleanup,
+ convert = convert,
+ outputfilename = outputfilename,
+ },
+ flushers = {
+ updatefontstate = updatefontstate,
+ character = flushcharacter,
+ rule = flushrule,
+ simplerule = flushsimplerule,
+ }
+}
+
+-- extras
+
+-- if not mp then
+-- return
+-- end
+--
+-- local mpprint = mp.print
+-- local formatters = string.formatters
+--
+-- local f_glyph = formatters[ [[draw textext.drt("\setfontid%i\relax\char%i\relax") shifted (%N,%N);]] ]
+-- local f_rule = formatters[ [[fill unitsquare xscaled %N yscaled %N shifted (%N,%N);]] ]
+--
+-- local current = nil
+-- local size = 0
+--
+-- function mp.place_buffermake(box)
+-- drivers.convert("mps",box)
+-- current = drivers.action("mps","fetch")
+-- size = #current
+-- end
+--
+-- function mp.place_buffersize()
+-- mpprint(size)
+-- end
+--
+-- function mp.place_bufferslot(i)
+-- if i > 0 and i <= size then
+-- local b = buffer[i]
+-- local t = b[1]
+-- if t == "glyph" then
+-- mpprint(f_glyph(b[2],b[3],b[4]*bpfactor,b[5]*bpfactor))
+-- elseif t == "rule" then
+-- mpprint(f_rule(b[2]*bpfactor,b[3]*bpfactor,b[4]*bpfactor,b[5]*bpfactor))
+-- end
+-- end
+-- end
+--
+-- function mp.place_bufferwipe()
+-- current = nil
+-- size = 0
+-- end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-mps.mkxl b/Master/texmf-dist/tex/context/base/mkiv/back-mps.mkxl
new file mode 100644
index 00000000000..0a6640614aa
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-mps.mkxl
@@ -0,0 +1,18 @@
+%D \module
+%D [ file=back-mps,
+%D version=2018.07.26,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=\METAPOST,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifcase\contextlmtxmode \else
+ \registerctxluafile{back-mps}{optimize}
+\fi
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-out.lua b/Master/texmf-dist/tex/context/base/mkiv/back-out.lua
new file mode 100644
index 00000000000..5ea5aa048ac
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-out.lua
@@ -0,0 +1,259 @@
+if not modules then modules = { } end modules ['back-out'] = {
+ version = 1.001,
+ comment = "companion to back-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local type = type
+local loadstring = loadstring
+
+local context = context
+
+-- tokens.scanners.....
+
+local get = token.get_index
+local scaninteger = token.scan_int
+local scanstring = token.scan_string
+local scankeyword = token.scan_keyword
+local scantokenlist = token.scan_tokenlist
+----- scancode = token.scan_code
+
+local tokentostring = token.to_string
+
+local logwriter = logs.writer
+local openfile = io.open
+local flushio = io.flush
+
+local nuts = nodes.nuts
+local tonode = nuts.tonode
+local copynode = nuts.copy
+local nodepool = nuts.pool
+
+local getdata = nuts.getdata
+
+local whatsit_code = nodes.nodecodes.whatsit
+
+local whatsitcodes = nodes.whatsitcodes
+
+local literalvalues = nodes.literalvalues
+local originliteral_code = literalvalues.origin
+local pageliteral_code = literalvalues.page
+local directliteral_code = literalvalues.direct
+local rawliteral_code = literalvalues.raw
+
+local nodeproperties = nodes.properties.data
+
+local channels = { }
+
+local register = nodepool.register
+local newnut = nuts.new
+
+local opennode = register(newnut(whatsit_code,whatsitcodes.open))
+local writenode = register(newnut(whatsit_code,whatsitcodes.write))
+local closenode = register(newnut(whatsit_code,whatsitcodes.close))
+local lateluanode = register(newnut(whatsit_code,whatsitcodes.latelua))
+local literalnode = register(newnut(whatsit_code,whatsitcodes.literal))
+local savenode = register(newnut(whatsit_code,whatsitcodes.save))
+local restorenode = register(newnut(whatsit_code,whatsitcodes.restore))
+local setmatrixnode = register(newnut(whatsit_code,whatsitcodes.setmatrix))
+
+local tomatrix = drivers.helpers.tomatrix
+
+local immediately = false -- not watertight
+
+local open_command, write_command, close_command
+
+backends = backends or { }
+
+local function openout()
+ local channel = scaninteger()
+ scankeyword("=") -- hack
+ local filename = scanstring()
+ if not immediately then
+ local n = copynode(opennode)
+ nodeproperties[n] = { channel = channel, filename = filename } -- action = "open"
+ return context(tonode(n))
+ elseif not channels[channel] then
+ local handle = openfile(filename,"wb") or false
+ if handle then
+ channels[channel] = handle
+ else
+ -- error
+ end
+ end
+ immediately = false
+end
+
+function backends.openout(n)
+ local p = nodeproperties[n]
+ if p then
+ local handle = openfile(p.filename,"wb") or false
+ if handle then
+ channels[p.channel] = handle
+ else
+ -- error
+ end
+ end
+end
+
+local function write()
+ local channel = scaninteger()
+ if not immediately then
+ local t = scantokenlist()
+ local n = copynode(writenode)
+ nodeproperties[n] = { channel = channel, data = t } -- action = "write"
+ return context(tonode(n))
+ else
+ local content = scanstring()
+ local handle = channels[channel]
+ if handle then
+ handle:write(content,"\n")
+ else
+ logwriter(content,"\n")
+ end
+ end
+ immediately = false
+end
+
+function backends.writeout(n)
+ local p = nodeproperties[n]
+ if p then
+ local handle = channels[p.channel]
+ local content = tokentostring(p.data)
+ if handle then
+ handle:write(content,"\n")
+ else
+ logwriter(content,"\n")
+ end
+ end
+end
+
+local function closeout()
+ local channel = scaninteger()
+ if not immediately then
+ local n = copynode(closenode)
+ nodeproperties[n] = { channel = channel } -- action = "close"
+ return context(tonode(n))
+ else
+ local handle = channels[channel]
+ if handle then
+ handle:close()
+ channels[channel] = false
+ flushio()
+ else
+ -- error
+ end
+ end
+ immediately = false
+end
+
+function backends.closeout(n)
+ local p = nodeproperties[n]
+ if p then
+ local channel = p.channel
+ local handle = channels[channel]
+ if handle then
+ handle:close()
+ channels[channel] = false
+ flushio()
+ else
+ -- error
+ end
+ end
+end
+
+local function immediate()
+ immediately = true
+end
+
+local noflatelua = 0
+
+local function latelua()
+ local node = copynode(lateluanode)
+ local name = "latelua"
+ if scankeyword("name") then
+ name = scanstring()
+ end
+ local data = scantokenlist()
+ nodeproperties[node] = { name = name, data = data }
+ return context(tonode(node))
+end
+
+function backends.latelua(current,pos_h,pos_v) -- todo: pass pos_h and pos_v (more efficient in lmtx)
+ local p = nodeproperties[current]
+ if p then
+ data = p.data
+ else
+ data = getdata(current)
+ end
+ noflatelua = noflatelua + 1
+ local kind = type(data)
+ if kind == "table" then
+ data.action(data.specification or data)
+ elseif kind == "function" then
+ data()
+ else
+ if kind ~= "string" then
+ data = tokentostring(data)
+ end
+ if #data ~= "" then
+ local code = loadstring(data)
+ if code then
+ code()
+ end
+ end
+ end
+end
+
+function backends.noflatelua()
+ return noflatelua
+end
+
+function nodepool.originliteral(str) local t = copynode(literalnode) nodeproperties[t] = { data = str, mode = originliteral_code } return t end
+function nodepool.pageliteral (str) local t = copynode(literalnode) nodeproperties[t] = { data = str, mode = pageliteral_code } return t end
+function nodepool.directliteral(str) local t = copynode(literalnode) nodeproperties[t] = { data = str, mode = directliteral_code } return t end
+function nodepool.rawliteral (str) local t = copynode(literalnode) nodeproperties[t] = { data = str, mode = rawliteral_code } return t end
+
+local pdfliterals = {
+ [originliteral_code] = originliteral_code, [literalvalues[originliteral_code]] = originliteral_code,
+ [pageliteral_code] = pageliteral_code, [literalvalues[pageliteral_code]] = pageliteral_code,
+ [directliteral_code] = directliteral_code, [literalvalues[directliteral_code]] = directliteral_code,
+ [rawliteral_code] = rawliteral_code, [literalvalues[rawliteral_code]] = rawliteral_code,
+}
+
+function nodepool.literal(mode,str)
+ local t = copynode(literalnode)
+ if str then
+ nodeproperties[t] = { data = str, mode = pdfliterals[mode] or pageliteral_code }
+ else
+ nodeproperties[t] = { data = mode, mode = pageliteral_code }
+ end
+ return t
+end
+
+function nodepool.save()
+ return copynode(savenode)
+end
+
+function nodepool.restore()
+ return copynode(restorenode)
+end
+
+function nodepool.setmatrix(rx,sx,sy,ry,tx,ty)
+ local t = copynode(setmatrixnode)
+ nodeproperties[t] = { matrix = tomatrix(rx,sx,sy,ry,tx,ty) }
+ return t
+end
+
+interfaces.implement { name = "immediate", actions = immediate, public = true, protected = true }
+interfaces.implement { name = "openout", actions = openout, public = true, protected = true }
+interfaces.implement { name = "write", actions = write, public = true, protected = true }
+interfaces.implement { name = "closeout", actions = closeout, public = true, protected = true }
+interfaces.implement { name = "latelua", actions = latelua, public = true, protected = true }
+interfaces.implement { name = "special", actions = scanstring, public = true, protected = true }
+
+open_command = get(token.create("openout"))
+write_command = get(token.create("write"))
+close_command = get(token.create("closeout"))
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-out.mkxl b/Master/texmf-dist/tex/context/base/mkiv/back-out.mkxl
new file mode 100644
index 00000000000..26548a0a496
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-out.mkxl
@@ -0,0 +1,23 @@
+%D \module
+%D [ file=back-out,
+%D version=2019.02.08,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=Output,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{back-out}{}
+
+\let\normalimmediate\immediate
+\let\normalopenout \openout
+\let\normalwrite \write
+\let\normalcloseout \closeout
+\let\normallatelua \latelua
+\let\normalspecial \special
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-pdf.lua b/Master/texmf-dist/tex/context/base/mkiv/back-pdf.lua
index 8886967e0c5..5f845fdcd97 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/back-pdf.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-pdf.lua
@@ -10,17 +10,38 @@ if not modules then modules = { } end modules ['back-pdf'] = {
-- the way we manage resources, info, etc. Users should use the \type {lpdf}
-- interface instead. If needed I will provide replacement functionality.
+local setmetatableindex = table.setmetatableindex
+
interfaces.implement {
name = "setpdfcompression",
arguments = { "integer", "integer" },
actions = lpdf.setcompression,
}
-if CONTEXTLMTXMODE == 0 then
- updaters.apply("backend.update.pdf")
- updaters.apply("backend.update.lpdf")
- updaters.apply("backend.update.tex")
- updaters.apply("backend.update")
+do
+
+ local dummy = function() end
+ local report = logs.reporter("backend")
+
+ local function unavailable(t,k)
+ report("calling unavailable pdf.%s function",k)
+ t[k] = dummy
+ return dummy
+ end
+
+ updaters.register("backend.update",function()
+ --
+ -- For now we keep this for tikz. If really needed some more can be made
+ -- accessible but it has to happen in a controlled way then, for instance
+ -- by first loading or enabling some compatibility layer so that we can
+ -- trace possible interferences.
+ --
+ pdf = {
+ immediateobj = pdf.immediateobj
+ }
+ setmetatableindex(pdf,unavailable)
+ end)
+
end
backends.install("pdf")
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-pdf.mkiv b/Master/texmf-dist/tex/context/base/mkiv/back-pdf.mkiv
index 9e88ab19399..ec1c641e690 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/back-pdf.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-pdf.mkiv
@@ -11,12 +11,15 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D The less there is here, the better.
+%D The less there is here, the better. After a decade it is time to remove the \type
+%D {\pdf*} ones completely. For the moment I keep them commented but even that will
+%D go away.
\writestatus{loading}{ConTeXt Backend Macros / PDF}
\registerctxluafile{lpdf-ini}{optimize}
\registerctxluafile{lpdf-nod}{}
+\registerctxluafile{lpdf-eng}{optimize}
\registerctxluafile{lpdf-col}{}
\registerctxluafile{lpdf-xmp}{}
\registerctxluafile{lpdf-ano}{}
@@ -32,21 +35,10 @@
\registerctxluafile{lpdf-tag}{}
\registerctxluafile{lpdf-fmt}{}
\registerctxluafile{lpdf-pde}{}
-
-\ifcase\contextlmtxmode\else
- \registerctxluafile{lpdf-img}{optimize}
-\fi
-
\registerctxluafile{lpdf-epa}{}
-
-\ifcase\contextlmtxmode\else
- \registerctxluafile{lpdf-emb}{optimize}
-\fi
-
-\registerctxluafile{back-pdp}{}
-
\registerctxluafile{lpdf-fnt}{}
+\registerctxluafile{back-pdp}{}
\registerctxluafile{back-pdf}{} % some code will move to lpdf-*
\loadmarkfile{back-u3d} % this will become a module
@@ -57,184 +49,51 @@
%D We will minimize the number of calls to \PDF\ specific primitives and delegate
%D all management and injection of code to the backend.
%D
-%D Here we initialize some internal quantities. We also protect them.
-
-\ifdefined\outputmode
- \outputmode\plusone
- \let\outputmode\relax
- \newcount\outputmode
- \outputmode\plusone
- \let\normaloutputmode\outputmode
-\fi
-
%D Because we do a lot in \LUA\ and don't want interferences, we nil most of the
%D \PDFTEX\ primitives. Of course one can always use the \type {\pdfvariable},
%D \type {\pdfextension} and \type {\pdffeedback} primitives but it will probably
%D have bad side effects.
-%D For the moment we put these here as they are pdf related but they might move to
-%D a better place. We overload the primitives with our own but use a bit of indirection
-%D for the purpose of tracing.
-
-\unexpanded\def\saveboxresource {\clf_saveboxresource}
-\unexpanded\def\lastsavedboxresourceindex {\numexpr\clf_lastsavedboxresourceindex\relax}
-\unexpanded\def\useboxresource {\clf_useboxresource}
-
-\unexpanded\def\saveimageresource {\clf_saveimageresource}
-\unexpanded\def\lastsavedimageresourceindex{\numexpr\clf_lastsavedimageresourceindex\relax}
-\unexpanded\def\lastsavedimageresourcepages{\numexpr\clf_lastsavedimageresourcepages\relax}
-\unexpanded\def\useimageresource {\clf_useimageresource}
-
-\unexpanded\def\savepos {\clf_savepos}
- \def\lastxpos {\clf_lastxpos}
- \def\lastypos {\clf_lastypos}
-
-\unexpanded\def\pdfextension {\clf_pdfextension}
- \def\pdffeedback {\clf_pdffeedback}
-
-%D These are no-ops and don't even intercept what comes next. Maybe some day
-%D I'll write a parser that maps onto \CONTEXT.
-
-\unexpanded\def\unsupportedpdfprimitive#1%
- {\writestatus{fatal error}{the primitive \string#1\space is not supported}%
- \directlua{os.exit()}}
-
-\unexpanded\def\pdfcolorstack {\unsupportedpdfprimitive\pdfcolorstack}
-\unexpanded\def\pdfcolorstackinit{\unsupportedpdfprimitive\pdfcolorstackinit}
-% pdfannot
-\unexpanded\def\pdfstartlink {\unsupportedpdfprimitive\pdfstartlink}
-\unexpanded\def\pdfendlink {\unsupportedpdfprimitive\pdfendlink}
-\unexpanded\def\pdfoutline {\unsupportedpdfprimitive\pdfoutline}
-% pdfdest
-\unexpanded\def\pdfthread {\unsupportedpdfprimitive\pdfthread}
-\unexpanded\def\pdfstartthread {\unsupportedpdfprimitive\pdfstartthread}
-\unexpanded\def\pdfendthread {\unsupportedpdfprimitive\pdfendthread}
-\unexpanded\def\pdffontattr {\unsupportedpdfprimitive\pdffontattr}
-\unexpanded\def\pdfglyphtounicode{\unsupportedpdfprimitive\pdfglyphtounicode}
-
-\unexpanded\def\pdfannot {\clf_pdfannot}
-\unexpanded\def\pdfdest {\clf_pdfdest}
-
-%D Here we do intercept (silently) what gets passed. One should use the \CONTEXT\
-%D interfaces instead.
-
-\let\pdfcatalog \relax \newtoks\pdfcatalog
-\let\pdfinfo \relax \newtoks\pdfinfo
-\let\pdfnames \relax \newtoks\pdfnames
-\let\pdftrailer \relax \newtoks\pdftrailer
-\let\pdfpageresources \relax \newtoks\pdfpageresources
-\let\pdfpageattr \relax \newtoks\pdfpageattr
-\let\pdfpagesattr \relax \newtoks\pdfpagesattr
-\let\pdfxformattr \relax \newtoks\pdfxformattr
-\let\pdfxformresources\relax \newtoks\pdfxformresources
-
-%D We use the \LUA\ interface (which then permits more control over possible pdf/x
-%D extensions).
-
-\let\pdfcompresslevel \relax \newcount\pdfcompresslevel
-\let\pdfobjcompresslevel\relax \newcount\pdfobjcompresslevel
-
-%D But we still provide:
+\unexpanded\def\pdfextension{\clf_pdfextension}
+ \def\pdffeedback {\clf_pdffeedback}
+
+%D For the moment we keep this for tikz but hopefully it will at some point use
+%D the proper ones. Consider them obsolete:
+
+\unexpanded\def\pdfliteral {\clf_pdfliteral}
+\unexpanded\def\pdfobj {\clf_pdfobj}%
+\unexpanded\def\pdflastobj {\numexpr\clf_pdflastobj\relax}
+\unexpanded\def\pdfrefobj {\clf_pdfrefobj }
+
+\unexpanded\def\pdfrestore {\clf_restore}
+\unexpanded\def\pdfsave {\clf_save}
+\unexpanded\def\pdfsetmatrix{\clf_setmatrix}
+
+ \let\pdfxform \saveboxresource
+ \let\pdflastxform \lastsavedboxresourceindex
+ \let\pdfrefxform \useboxresource
+
+%D Here are quick and dirty compression flippers, mostly used when testing something
+%D as one can best stick to the defaults that also adapt to specific standards.
\unexpanded\def\nopdfcompression {\clf_setpdfcompression\zerocount\zerocount}
\unexpanded\def\onlypdfobjectcompression{\clf_setpdfcompression\zerocount\plusthree}
\unexpanded\def\maximumpdfcompression {\clf_setpdfcompression\plusnine \plusnine }
\unexpanded\def\normalpdfcompression {\clf_setpdfcompression\plusthree\plusthree}
-%D These might even become no-ops as we don't need them in \CONTEXT:
-
-\unexpanded\def\pdfmapfile#1{} % obsolete
-\unexpanded\def\pdfmapline#1{} % obsolete
-
-%D We don't support these directives, at least not this way. If they are needed
-%D by third party modules we can provide some interface.
-
-%pdfcreationdate
-\let\pdfdecimaldigits \relax \newcount\pdfdecimaldigits
-\let\pdfdestmargin \relax \newdimen\pdfdestmargin
-% pdffontname
-% pdffontobjnum
-\let\pdffontsize \relax \newcount\pdffontsize
-\let\pdfgamma \relax \newcount\pdfgamma
-\let\pdfgentounicode \relax \newcount\pdfgentounicode
-\let\pdfhorigin \relax \newcount\pdfhorigin
-\let\pdfignoreunknownimages \relax \newcount\pdfignoreunknownimages
-\let\pdfimageaddfilename \relax \newcount\pdfimageaddfilename
-\let\pdfimageapplygamma \relax \newcount\pdfimageapplygamma
-\let\pdfimagegamma \relax \newcount\pdfimagegamma
-\let\pdfimagehicolor \relax \newcount\pdfimagehicolor
-\let\pdfimageresolution \relax \newcount\pdfimageresolution
-\let\pdfincludechars \relax \newtoks \pdfincludechars
-\let\pdfinclusioncopyfonts \relax \newcount\pdfinclusioncopyfonts
-\let\pdfinclusionerrorlevel \relax \newcount\pdfinclusionerrorlevel
-\let\pdfinfoomitdate \relax \newcount\pdfinfoomitdate
-% pdflastannot
-% pdflastlink
-\let\pdflinkmargin \relax \newdimen\pdflinkmargin
-\let\pdfmajorversion \relax \newcount\pdfmajorversion
-\let\pdfminorversion \relax \newcount\pdfminorversion
-\let\pdfpagebox \relax \newcount\pdfpagebox
-% pdfpageref
-\let\pdfpkfixeddpi \relax \newcount\pdfpkfixeddpi
-\let\pdfpkmode \relax \newtoks \pdfpkmode
-\let\pdfpkresolution \relax \newcount\pdfpkresolution
-% pdfretval
-\let\pdfsuppressoptionalinfo \relax \newcount\pdfsuppressoptionalinfo
-\let\pdfsuppressptexinfo \relax \newcount\pdfsuppressptexinfo
-% pdftexrevision
-% pdftexversion
-\let\pdfthreadmargin \relax \newdimen\pdfthreadmargin
-\let\pdftrailerid \relax \newtoks \pdftrailerid
-\let\pdfuniqueresname \relax \newcount\pdfuniqueresname
-\let\pdfvorigin \relax \newcount\pdfvorigin
-\let\pdfxformmargin \relax \newdimen\pdfxformmargin
-% \pdfxformname
-
-%D These are still accepted but are normally not needed.
-
-\let\pdfxform \saveboxresource
-\let\pdfximage \saveimageresource
-
-\let\pdflastxform \lastsavedboxresourceindex
-\let\pdflastximage \lastsavedimageresourceindex
-
-\let\pdfrefxform \useboxresource
-\let\pdfrefximage \useimageresource
-
-\let\pdflastximagepages \lastsavedimageresourcepages
-
-\let\pdfsavepos \savepos
-\let\pdflastxpos \lastxpos
-\let\pdflastypos \lastypos
-
-%D For the moment we keep these as they are but they will become \LUA\ calls
-%D eventually, after which we will nil the three \type {\pdf} interface primitives.
-
-\normalprotected\def\pdfliteral {\clf_pdfliteral}%
-
-\normalprotected\def\pdfobj {\clf_pdfobj}%
-\normalprotected\def\pdflastobj {\numexpr\clf_pdflastobj\relax}%
-
-\normalprotected\def\pdfrefobj {\pdfextension refobj }
-\normalprotected\def\pdfrestore {\clf_restore}
-\normalprotected\def\pdfsave {\clf_save}
-\normalprotected\def\pdfsetmatrix{\clf_setmatrix}
-
-%D This one can be consulted by users although the suffix is also a system mode.
-
-\back_job_set_suffix{pdf}
-
%D PDF/X (maybe combine the two lua calls)
\setupbackend
[xmpfile=]
\appendtoks
- \doifsomething{\backendparameter{xmpfile}}
- {\clf_setxmpfile{\backendparameter{xmpfile}}}%
+ \edef\p_file{\backendparameter{xmpfile}}%
+ \ifx\p_file\empty\else
+ \clf_setxmpfile{\p_file}%
+ \fi
\to \everysetupbackend
-% \doifsomething{\backendparameter\c!format} .. at the lua end
+%D This will change:
\appendtoks
\clf_setformat
@@ -247,281 +106,35 @@
\relax
\to \everysetupbackend
-%D For the moment we keep these.
+%D These are the only official methods to add stuff to the resources. If more is
+%D needed for third party low level code, it can be added.
-%newtoks \pdfbackendeveryximage
-\newtoks \pdfbackendeveryxform
+\unexpanded\def\pdfbackendsetcatalog #1#2{\clf_lpdf_addtocatalog{#1}{#2}}
+\unexpanded\def\pdfbackendsetinfo #1#2{\clf_lpdf_addtoinfo{#1}{#2}}
+\unexpanded\def\pdfbackendsetname #1#2{\clf_lpdf_addtonames{#1}{#2}}
-%D These are the only official methods to add stuff to the resources.
+\unexpanded\def\pdfbackendsetpageattribute #1#2{\clf_lpdf_addtopageattributes{#1}{#2}}
+\unexpanded\def\pdfbackendsetpagesattribute#1#2{\clf_lpdf_addtopagesattributes{#1}{#2}}
+\unexpanded\def\pdfbackendsetpageresource #1#2{\clf_lpdf_addtopageresources{#1}{#2}}
-\unexpanded\def\pdfbackendsetcatalog #1#2{\clf_lpdf_addtocatalog {#1}{#2}}
-\unexpanded\def\pdfbackendsetinfo #1#2{\clf_lpdf_addtoinfo {#1}{#2}}
-\unexpanded\def\pdfbackendsetname #1#2{\clf_lpdf_addtonames {#1}{#2}}
-
-\unexpanded\def\pdfbackendsetpageattribute #1#2{\clf_lpdf_addtopageattributes {#1}{#2}}
-\unexpanded\def\pdfbackendsetpagesattribute#1#2{\clf_lpdf_addtopagesattributes {#1}{#2}}
-\unexpanded\def\pdfbackendsetpageresource #1#2{\clf_lpdf_addtopageresources {#1}{#2}}
-
-\unexpanded\def\pdfbackendsetextgstate #1#2{\clf_lpdf_adddocumentextgstate {#1}{#2}}
+\unexpanded\def\pdfbackendsetextgstate #1#2{\clf_lpdf_adddocumentextgstate{#1}{#2}}
\unexpanded\def\pdfbackendsetcolorspace #1#2{\clf_lpdf_adddocumentcolorspace{#1}{#2}}
-\unexpanded\def\pdfbackendsetpattern #1#2{\clf_lpdf_adddocumentpattern {#1}{#2}}
-\unexpanded\def\pdfbackendsetshade #1#2{\clf_lpdf_adddocumentshade {#1}{#2}}
+\unexpanded\def\pdfbackendsetpattern #1#2{\clf_lpdf_adddocumentpattern{#1}{#2}}
+\unexpanded\def\pdfbackendsetshade #1#2{\clf_lpdf_adddocumentshade{#1}{#2}}
\def\pdfbackendcurrentresources {\clf_lpdf_collectedresources}
\def\pdfcolor #1{\clf_lpdf_color\numexpr\thecolorattribute{#1}\relax}
- \let\PDFcolor\pdfcolor
-
-% clipping
-\unexpanded\def\dostartclipping#1#2#3% we can move this to lua and only set a box here
- {\forcecolorhack
- \edef\width {\tobigpoints#2}%
- \edef\height{\tobigpoints#3}%
- \meta_grab_clip_path{#1}\width\height{%
- 0 0 m %
- \width\space 0 l %
- \width\space \height\space l %
- 0 \height\space l%
- }%
- \pdfliteral{q 0 w \MPclippath\space W n}}
+%D This is a temporary hack mthat will be removed, improved or somehow can become
+%D default.
-\unexpanded\def\dostopclipping
- {\pdfliteral{Q}}
-
-%D Temporary hack, will be removed or improved or default.
-
-% attr {/Group << /S /Transparency /I false /K true >>}
-
-%def\TransparencyHack{\ctxlua{backends.codeinjections.addtransparencygroup()}}
\def\TransparencyHack{\setupcolors[\c!pagecolormodel=\v!auto]}
-% Still here:
-
-%D \macros
-%D {back_ovalbox}
+%D Just in case one needs this \unknown:
%D
-%D Drawing frames with round corners is inherited from the main module. For drawing
-%D ovals we use quite raw \PDF\ code. The next implementation does not differ that
-%D much from the one implemented in the \POSTSCRIPT\ driver. This code is somewhat
-%D obsolete as we now have metapost embedded.
-
-\unexpanded\def\back_ovalbox#1#2#3#4#5#6#7#8%
- {\forcecolorhack
- \bgroup
- \edef\stroke{\tobigpoints\dimexpr#4\relax\space}%
- \edef\radius{\tobigpoints\dimexpr#5\relax\space}%
- \scratchdimen\dimexpr#4/\plustwo\relax
- \edef\xmin {\tobigpoints \scratchdimen \space}%
- \edef\xmax {\tobigpoints\dimexpr #1-\scratchdimen\relax\space}%
- \edef\ymax {\tobigpoints\dimexpr #2-\scratchdimen\relax\space}%
- \edef\ymin {\tobigpoints\dimexpr-#3+\scratchdimen\relax\space}%
- \advance\scratchdimen by #5\relax
- \edef\xxmin{\tobigpoints \scratchdimen \space}%
- \edef\xxmax{\tobigpoints\dimexpr #1-\scratchdimen\relax\space}%
- \edef\yymax{\tobigpoints\dimexpr #2-\scratchdimen\relax\space}%
- \edef\yymin{\tobigpoints\dimexpr-#3+\scratchdimen\relax\space}%
- %
- \edef\dostroke{\number#6}%
- \edef\dofill {\number#7}%
- \scratchcounter#8\relax
- \setbox\scratchbox\naturalhpack
- {\ifnum\dostroke\dofill>\zerocount
- \pdfliteral
- {q
- \stroke w
- \ifcase\scratchcounter
- \xxmin \ymin m
- \xxmax \ymin l
- \xmax \ymin \xmax \yymin y
- \xmax \yymax l
- \xmax \ymax \xxmax \ymax y
- \xxmin \ymax l
- \xmin \ymax \xmin \yymax y
- \xmin \yymin l
- \xmin \ymin \xxmin \ymin y
- h
- \or % 1
- \xxmin \ymin m
- \xxmax \ymin l
- \xmax \ymin \xmax \yymin y
- \xmax \ymax l
- \xmin \ymax l
- \xmin \yymin l
- \xmin \ymin \xxmin \ymin y
- h
- \or % 2
- \xxmin \ymin m
- \xmax \ymin l
- \xmax \ymax l
- \xxmin \ymax l
- \xmin \ymax \xmin \yymax y
- \xmin \yymin l
- \xmin \ymin \xxmin \ymin y
- h
- \or % 3
- \xmin \ymin m
- \xmax \ymin l
- \xmax \yymax l
- \xmax \ymax \xxmax \ymax y
- \xxmin \ymax l
- \xmin \ymax \xmin \yymax y
- \xmin \ymin l
- h
- \or % 4
- \xmin \ymin m
- \xxmax \ymin l
- \xmax \ymin \xmax \yymin y
- \xmax \yymax l
- \xmax \ymax \xxmax \ymax y
- \xmin \ymax l
- \xmin \ymin l
- h
- \or % 5
- \xmin \ymin m
- \xmax \ymin l
- \xmax \yymax l
- \xmax \ymax \xxmax \ymax y
- \xmin \ymax l
- \xmin \ymin l
- h
- \or % 6
- \xmin \ymin m
- \xxmax \ymin l
- \xmax \ymin \xmax \yymin y
- \xmax \ymax l
- \xmin \ymax l
- \xmin \ymin l
- h
- \or % 7
- \xxmin \ymin m
- \xmax \ymin l
- \xmax \ymax l
- \xmin \ymax l
- \xmin \yymin l
- \xmin \ymin \xxmin \ymin y
- h
- \or % 8
- \xmin \ymin m
- \xmax \ymin l
- \xmax \ymax l
- \xxmin \ymax l
- \xmin \ymax \xmin \yymax y
- \xmin \ymin l
- h
- \or % 9 top open
- \xmin \ymax m
- \xmin \yymin l
- \xmin \ymin \xxmin \ymin y
- \xxmax \ymin l
- \xmax \ymin \xmax \yymin y
- \xmax \ymax l
- \or % 10 right open
- \xmax \ymax m
- \xxmin \ymax l
- \xmin \ymax \xmin \yymax y
- \xmin \yymin l
- \xmin \ymin \xxmin \ymin y
- \xmax \ymin l
- \or % 11 bottom open
- \xmax \ymin m
- \xmax \yymax l
- \xmax \ymax \xxmax \ymax y
- \xxmin \ymax l
- \xmin \ymax \xmin \yymax y
- \xmin \ymin l
- \or % 12 left open
- \xmin \ymax m
- \xxmax \ymax l
- \xmax \ymax \xmax \yymax y
- \xmax \yymin l
- \xmax \ymin \xxmax \ymin y
- \xmin \ymin l
- \or % 13
- \xmin \ymax m
- \xxmax \ymax l
- \xmax \ymax \xmax \yymax y
- \xmax \ymin l
- \or % 14
- \xmax \ymax m
- \xmax \yymin l
- \xmax \ymin \xxmax \ymin y
- \xmin \ymin l
- \or % 15
- \xmax \ymin m
- \xxmin \ymin l
- \xmin \ymin \xmin \yymin y
- \xmin \ymax l
- \or % 16
- \xmin \ymin m
- \xmin \yymax l
- \xmin \ymax \xxmin \ymax y
- \xmax \ymax l
- \or % 17
- \xxmax \ymax m
- \xmax \ymax \xmax \yymax y
- \or % 18
- \xmax \yymin m
- \xmax \ymin \xxmax \ymin y
- \or % 19
- \xxmin \ymin m
- \xmin \ymin \xmin \yymin y
- \or % 20
- \xmin \yymax m
- \xmin \ymax \xxmin \ymax y
- \or % 21
- \xxmax \ymax m
- \xmax \ymax \xmax \yymax y
- \xmin \yymax m
- \xmin \ymax \xxmin \ymax y
- \or % 22
- \xxmax \ymax m
- \xmax \ymax \xmax \yymax y
- \xmax \yymin m
- \xmax \ymin \xxmax \ymin y
- \or % 23
- \xmax \yymin m
- \xmax \ymin \xxmax \ymin y
- \xxmin \ymin m
- \xmin \ymin \xmin \yymin y
- \or % 24
- \xxmin \ymin m
- \xmin \ymin \xmin \yymin y
- \xmin \yymax m
- \xmin \ymax \xxmin \ymax y
- \or % 25
- \xxmax \ymax m
- \xmax \ymax \xmax \yymax y
- \xmax \yymin m
- \xmax \ymin \xxmax \ymin y
- \xxmin \ymin m
- \xmin \ymin \xmin \yymin y
- \xmin \yymax m
- \xmin \ymax \xxmin \ymax y
- \or % 26
- \xmax \yymin m
- \xmax \ymin \xxmax \ymin y
- \xmin \yymax m
- \xmin \ymax \xxmin \ymax y
- \or % 27
- \xxmax \ymax m
- \xmax \ymax \xmax \yymax y
- \xxmin \ymin m
- \xmin \ymin \xmin \yymin y
- \or % 28
- \fi
- \ifnum\scratchcounter>\pluseight
- S
- \else
- \ifnum\dostroke=\plusone S \fi
- \ifnum\dofill =\plusone f \fi
- \fi
- Q}%
- \fi}%
- \wd\scratchbox#1%
- \ht\scratchbox#2%
- \dp\scratchbox#3%
- \box\scratchbox
- \egroup}
+%D \starttyping
+%D text \pdfbackendactualtext{Meier}{Müller} text
+%D \stoptyping
\unexpanded\def\pdfbackendactualtext#1#2% not interfaced
{\clf_startactualtext{#2}%
@@ -530,8 +143,12 @@
\let\pdfactualtext\pdfbackendactualtext
-% \starttext
-% text \pdfbackendactualtext{Meier}{Müller} text
-% \stoptext
+%D Bah, this is also needed for tikz:
+
+\ifdefined\pdfsavepos\else
+ \let\pdfsavepos \savepos
+ \let\pdflastxpos\lastxpos
+ \let\pdflastypos\lastypos
+\fi
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-pdf.mkxl b/Master/texmf-dist/tex/context/base/mkiv/back-pdf.mkxl
new file mode 100644
index 00000000000..ab65458c576
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-pdf.mkxl
@@ -0,0 +1,156 @@
+%D \module
+%D [ file=back-pdf,
+%D version=2009.04.15,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=\PDF,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The less there is here, the better. After a decade it is time to remove the \type
+%D {\pdf*} ones completely. For the moment I keep them commented but even that will
+%D go away.
+
+\writestatus{loading}{ConTeXt Backend Macros / PDF}
+
+\registerctxluafile{lpdf-ini}{optimize}
+\registerctxluafile{lpdf-lmt}{optimize}
+
+\registerctxluafile{lpdf-col}{}
+\registerctxluafile{lpdf-xmp}{}
+\registerctxluafile{lpdf-ano}{}
+\registerctxluafile{lpdf-res}{}
+\registerctxluafile{lpdf-mis}{}
+\registerctxluafile{lpdf-ren}{}
+\registerctxluafile{lpdf-grp}{}
+\registerctxluafile{lpdf-wid}{}
+\registerctxluafile{lpdf-fld}{}
+\registerctxluafile{lpdf-mov}{}
+\registerctxluafile{lpdf-u3d}{} % this will become a module
+\registerctxluafile{lpdf-swf}{} % this will become a module
+\registerctxluafile{lpdf-tag}{}
+\registerctxluafile{lpdf-fmt}{}
+\registerctxluafile{lpdf-pde}{}
+\registerctxluafile{lpdf-img}{optimize}
+\registerctxluafile{lpdf-epa}{}
+\registerctxluafile{lpdf-emb}{optimize}
+\registerctxluafile{lpdf-fnt}{}
+
+\registerctxluafile{back-pdp}{}
+\registerctxluafile{back-pdf}{} % some code will move to lpdf-*
+
+\loadmarkfile{back-u3d} % this will become a module
+\loadmarkfile{back-swf} % this will become a module
+
+\unprotect
+
+%D We will minimize the number of calls to \PDF\ specific primitives and delegate
+%D all management and injection of code to the backend.
+%D
+%D Because we do a lot in \LUA\ and don't want interferences, we nil most of the
+%D \PDFTEX\ primitives. Of course one can always use the \type {\pdfvariable},
+%D \type {\pdfextension} and \type {\pdffeedback} primitives but it will probably
+%D have bad side effects.
+
+\unexpanded\def\pdfextension{\clf_pdfextension}
+ \def\pdffeedback {\clf_pdffeedback}
+
+%D For the moment we keep this for tikz but hopefully it will at some point use
+%D the proper ones. Consider them obsolete:
+
+\unexpanded\def\pdfliteral {\clf_pdfliteral}
+\unexpanded\def\pdfobj {\clf_pdfobj}%
+\unexpanded\def\pdflastobj {\numexpr\clf_pdflastobj\relax}
+\unexpanded\def\pdfrefobj {\clf_pdfrefobj }
+
+\unexpanded\def\pdfrestore {\clf_restore}
+\unexpanded\def\pdfsave {\clf_save}
+\unexpanded\def\pdfsetmatrix{\clf_setmatrix}
+
+ \let\pdfxform \saveboxresource
+ \let\pdflastxform \lastsavedboxresourceindex
+ \let\pdfrefxform \useboxresource
+
+%D Here are quick and dirty compression flippers, mostly used when testing something
+%D as one can best stick to the defaults that also adapt to specific standards.
+
+\unexpanded\def\nopdfcompression {\clf_setpdfcompression\zerocount\zerocount}
+\unexpanded\def\onlypdfobjectcompression{\clf_setpdfcompression\zerocount\plusthree}
+\unexpanded\def\maximumpdfcompression {\clf_setpdfcompression\plusnine \plusnine }
+\unexpanded\def\normalpdfcompression {\clf_setpdfcompression\plusthree\plusthree}
+
+%D PDF/X (maybe combine the two lua calls)
+
+\setupbackend
+ [xmpfile=]
+
+\appendtoks
+ \edef\p_file{\backendparameter{xmpfile}}%
+ \ifx\p_file\empty\else
+ \clf_setxmpfile{\p_file}%
+ \fi
+\to \everysetupbackend
+
+%D This will change:
+
+\appendtoks
+ \clf_setformat
+ format {\backendparameter\c!format}%
+ level {\backendparameter\c!level}%
+ option {\backendparameter\c!option}%
+ profile {\backendparameter\c!profile}%
+ intent {\backendparameter\c!intent}%
+ file {\backendparameter\c!file}%
+ \relax
+\to \everysetupbackend
+
+%D These are the only official methods to add stuff to the resources. If more is
+%D needed for third party low level code, it can be added.
+
+\unexpanded\def\pdfbackendsetcatalog #1#2{\clf_lpdf_addtocatalog{#1}{#2}}
+\unexpanded\def\pdfbackendsetinfo #1#2{\clf_lpdf_addtoinfo{#1}{#2}}
+\unexpanded\def\pdfbackendsetname #1#2{\clf_lpdf_addtonames{#1}{#2}}
+
+\unexpanded\def\pdfbackendsetpageattribute #1#2{\clf_lpdf_addtopageattributes{#1}{#2}}
+\unexpanded\def\pdfbackendsetpagesattribute#1#2{\clf_lpdf_addtopagesattributes{#1}{#2}}
+\unexpanded\def\pdfbackendsetpageresource #1#2{\clf_lpdf_addtopageresources{#1}{#2}}
+
+\unexpanded\def\pdfbackendsetextgstate #1#2{\clf_lpdf_adddocumentextgstate{#1}{#2}}
+\unexpanded\def\pdfbackendsetcolorspace #1#2{\clf_lpdf_adddocumentcolorspace{#1}{#2}}
+\unexpanded\def\pdfbackendsetpattern #1#2{\clf_lpdf_adddocumentpattern{#1}{#2}}
+\unexpanded\def\pdfbackendsetshade #1#2{\clf_lpdf_adddocumentshade{#1}{#2}}
+
+ \def\pdfbackendcurrentresources {\clf_lpdf_collectedresources}
+ \def\pdfcolor #1{\clf_lpdf_color\numexpr\thecolorattribute{#1}\relax}
+
+%D This is a temporary hack mthat will be removed, improved or somehow can become
+%D default.
+
+\def\TransparencyHack{\setupcolors[\c!pagecolormodel=\v!auto]}
+
+%D Just in case one needs this \unknown:
+%D
+%D \starttyping
+%D text \pdfbackendactualtext{Meier}{Müller} text
+%D \stoptyping
+
+\unexpanded\def\pdfbackendactualtext#1#2% not interfaced
+ {\clf_startactualtext{#2}%
+ #1%
+ \clf_stopactualtext}
+
+\let\pdfactualtext\pdfbackendactualtext
+
+%D Bah, this is also needed for tikz:
+
+\ifdefined\pdfsavepos\else
+ \let\pdfsavepos \savepos
+ \let\pdflastxpos\lastxpos
+ \let\pdflastypos\lastypos
+\fi
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-pdp.lua b/Master/texmf-dist/tex/context/base/mkiv/back-pdp.lua
index 7363cfcae4d..6111cf469b2 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/back-pdp.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-pdp.lua
@@ -9,7 +9,8 @@ if not modules then modules = { } end modules ['back-pdp'] = {
-- This is temporary ... awaiting a better test .. basically we can
-- always use this: pdf primitives.
-local context = context
+local context = context
+local lpdf = lpdf
local lpdfreserveobject = lpdf.reserveobject
local lpdfcompresslevel = lpdf.compresslevel
@@ -17,22 +18,17 @@ local lpdfobj = lpdf.obj
local lpdfpagereference = lpdf.pagereference
local lpdfxformname = lpdf.xformname
-local jobpositions = job.positions
-local gethpos = jobpositions.gethpos
-local getvpos = jobpositions.getvpos
-
local tokenscanners = tokens.scanners
local scanword = tokenscanners.word
local scankeyword = tokenscanners.keyword
local scanstring = tokenscanners.string
local scaninteger = tokenscanners.integer
-local scandimension = tokenscanners.dimension
+local scanwhd = tokenscanners.whd
-local trace = false trackers.register("commands", function(v) trace = v end)
-local report = logs.reporter("command")
+local trace = false trackers.register("backend", function(v) trace = v end)
+local report = logs.reporter("backend")
local nodepool = nodes.pool
-local newsavepos = nodepool.savepos
local newliteral = nodepool.literal
local newsave = nodepool.save
local newrestore = nodepool.restore
@@ -42,183 +38,12 @@ local implement = interfaces.implement
local constants = interfaces.constants
local variables = interfaces.variables
--- helper
-
-local function scanwhd()
- local width, height, depth
- while true do
- if scankeyword("width") then
- width = scandimension()
- elseif scankeyword("height") then
- height = scandimension()
- elseif scankeyword("depth") then
- depth = scandimension()
- else
- break
- end
- end
- if width or height or depth then
- return width or 0, height or 0, depth or 0
- else
- -- we inherit
- end
-end
-
--- positions
-
-local function savepos()
- context(newsavepos())
-end
-
-local function lastxpos()
- context(gethpos())
-end
-
-local function lastypos()
- context(getvpos())
-end
-
-implement { name = "savepos", actions = savepos }
-implement { name = "lastxpos", actions = lastxpos }
-implement { name = "lastypos", actions = lastypos }
-
-- literals
local function pdfliteral()
context(newliteral(scanword() or "origin",scanstring()))
end
-implement { name = "pdfliteral", actions = pdfliteral }
-
--- box resources
-
-local boxresources = tex.boxresources
-local savebox = boxresources.save
-local usebox = boxresources.use
-
-local lastindex = 0
-
-local function saveboxresource()
- local immediate = true
- local kind = scankeyword("type") and scaninteger() or 0
- local attributes = scankeyword("attr") and scanstring() or nil
- local resources = scankeyword("resources") and scanstring() or nil
- local margin = scankeyword("margin") and scandimension() or 0 -- register
- local boxnumber = scaninteger()
- --
- lastindex = savebox(boxnumber,attributes,resources,immediate,kind,margin)
- if trace then
- report("\\saveboxresource: index %i",lastindex)
- end
-end
-
-local function lastsavedboxresourceindex()
- if trace then
- report("\\lastsaveboxresource: index %i",lastindex)
- end
- context("%i",lastindex)
-end
-
-local function useboxresource()
- local width, height, depth = scanwhd()
- local index = scaninteger()
- local node = usebox(index,width,height,depth)
- if trace then
- report("\\useboxresource: index %i",index)
- end
- context(node)
-end
-
-implement { name = "saveboxresource", actions = saveboxresource }
-implement { name = "lastsavedboxresourceindex", actions = lastsavedboxresourceindex }
-implement { name = "useboxresource", actions = useboxresource }
-
--- image resources (messy: will move)
-
-local imageresources = { }
-local lastindex = 0
-local lastpages = 1
-
-local function saveimageresource()
- local width, height, depth = scanwhd()
- local page = 1
- local immediate = true
- local margin = 0 -- or dimension
- local attributes = scankeyword("attr") and scanstring() or nil
- if scankeyword("named") then
- scanstring() -- ignored
- elseif scankeyword("page") then
- page = scaninteger()
- end
- local userpassword = scankeyword("userpassword") and scanstring() or nil
- local ownerpassword = scankeyword("ownerpassword") and scanstring() or nil
- local visiblefilename = scankeyword("visiblefilename") and scanstring() or nil
- local colorspace = scankeyword("colorspace") and scaninteger() or nil
- local pagebox = scanword() or nil
- local filename = scanstring()
--- pcall
- context.getfiguredimensions( { filename }, {
- [constants.userpassword] = userpassword,
- [constants.ownerpassword] = ownerpassword,
- [constants.page] = page or 1,
- [constants.size] = pagebox,
- })
- context.relax()
- lastindex = lastindex + 1
- lastpages = 1
- imageresources[lastindex] = {
- filename = filename,
- page = page or 1,
- size = pagebox,
- width = width,
- height = height,
- depth = depth,
- attr = attributes,
- -- margin = margin,
- }
-end
-
-local function lastsavedimageresourceindex()
- context("%i",lastindex or 0)
-end
-
-local function lastsavedimageresourcepages()
- context("%i",lastpages or 0) -- todo
-end
-
-local function useimageresource()
- local width, height, depth = scanwhd()
- if scankeyword("keepopen") then
- -- ignored
- end
- local index = scaninteger()
- local l = imageresources[index]
- if l then
- if not (width or height or depth) then
- width = l.width
- height = l.height
- depth = l.depth
- end
--- pcall
- context.externalfigure( { l.filename }, {
- [constants.userpassword] = l.userpassword,
- [constants.ownerpassword] = l.ownerpassword,
- [constants.width] = width and (width .. "sp") or nil,
- [constants.height] = height and (height .. "sp") or nil,
- [constants.page] = l.page or 1,
- [constants.size] = pagebox,
- })
- context.relax()
- else
- print("no image resource",index)
- end
-end
-
-implement { name = "saveimageresource", actions = saveimageresource }
-implement { name = "lastsavedimageresourceindex", actions = lastsavedimageresourceindex }
-implement { name = "lastsavedimageresourcepages", actions = lastsavedimageresourcepages }
-implement { name = "useimageresource", actions = useimageresource }
-
-- objects
local lastobjnum = 0
@@ -233,16 +58,20 @@ local function pdfobj()
local immediate = true
local objnum = scankeyword("useobjnum") and scaninteger() or lpdfreserveobject()
local uncompress = scankeyword("uncompressed") or lpdfcompresslevel() == 0
- local streamobject = scankeyword("stream") and true or false
- local attributes = scankeyword("attr") and scanstring()
+ local streamobject = scankeyword("stream")
+ local attributes = scankeyword("attr") and scanstring() or nil
local fileobject = scankeyword("file")
local content = scanstring()
- local object = {
+ local object = streamobject and {
+ type = "stream",
+ objnum = objnum,
immediate = immediate,
attr = attributes,
- objnum = objnum,
- type = streamobject and "stream" or nil,
compresslevel = uncompress and 0 or nil,
+ } or {
+ type = "raw",
+ objnum = objnum,
+ immediate = immediate,
}
if fileobject then
object.filename = content
@@ -271,10 +100,6 @@ local function pdfrefobj()
end
end
-implement { name = "pdfobj", actions = pdfobj }
-implement { name = "pdflastobj", actions = pdflastobj }
-implement { name = "pdfrefobj", actions = pdfrefobj }
-
-- annotations
local lastobjnum = 0
@@ -306,8 +131,6 @@ local function pdfannot()
end
end
-implement { name = "pdfannot", actions = pdfannot }
-
local function pdfdest()
local name = false
local zoom = false
@@ -345,11 +168,8 @@ local function pdfdest()
context(backends.nodeinjections.destination(width or 0,height or 0,depth or 0,{ name or "" },view or "fit"))
end
-implement { name = "pdfdest", actions = pdfdest }
-
-- management
-
local function pdfsave()
context(newsave())
end
@@ -362,7 +182,6 @@ local function pdfsetmatrix()
context(newsetmatrix(scanstring()))
end
-
-- extras
local function pdfpageref()
@@ -400,8 +219,6 @@ local function pdfextension()
end
end
-implement { name = "pdfextension", actions = pdfextension }
-
-- feedbacks: colorstackinit creationdate fontname fontobjnum fontsize lastannot
-- lastlink lastobj pageref retval revision version xformname
@@ -423,8 +240,6 @@ local function pdffeedback()
end
end
-implement { name = "pdffeedback", actions = pdffeedback }
-
-- variables: (integers:) compresslevel decimaldigits gamma gentounicode
-- ignoreunknownimages imageaddfilename imageapplygamma imagegamma imagehicolor
-- imageresolution inclusioncopyfonts inclusionerrorlevel majorversion minorversion
@@ -450,4 +265,17 @@ implement { name = "pdffeedback", actions = pdffeedback }
-- end
-- end
---------- { name = "pdfvariable", actions = pdfvariable }
+-- kept:
+
+implement { name = "pdfextension", actions = pdfextension }
+implement { name = "pdffeedback", actions = pdffeedback }
+--------- { name = "pdfvariable", actions = pdfvariable }
+
+-- for the moment (tikz)
+
+implement { name = "pdfliteral", actions = pdfliteral }
+implement { name = "pdfobj", actions = pdfobj }
+implement { name = "pdflastobj", actions = pdflastobj }
+implement { name = "pdfrefobj", actions = pdfrefobj }
+--------- { name = "pdfannot", actions = pdfannot }
+--------- { name = "pdfdest", actions = pdfdest }
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-res.lua b/Master/texmf-dist/tex/context/base/mkiv/back-res.lua
index be92c74a6db..2ca4a5ac8b0 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/back-res.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-res.lua
@@ -1,15 +1,32 @@
if not modules then modules = { } end modules ['back-res'] = {
version = 1.001,
- comment = "companion to lpdf-ini.mkiv",
+ comment = "companion to back-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
--- A box resource has an index. This happens to be an object number
--- due to the pdf backend but in fact it's an abstraction. This is why
--- we have explicit fetchers. The internal number (as in \Fm123) is yet
--- another number.
+local context = context
+
+local trace = false trackers.register("backend", function(v) trace = v end)
+local report = logs.reporter("backend")
+
+local scanners = tokens.scanners
+local scankeyword = scanners.keyword
+local scaninteger = scanners.integer
+local scanstring = scanners.string
+local scandimension = scanners.dimension
+local scanword = scanners.word
+local scanwhd = scanners.whd
+
+local scanners = interfaces.scanners
+local implement = interfaces.implement
+local constants = interfaces.constants
+local variables = interfaces.variables
+
+-- A box resource has an index. This happens to be an object number due to the pdf
+-- backend but in fact it's an abstraction. This is why we have explicit fetchers.
+-- The internal number (as in \Fm123) is yet another number.
local tex_saveboxresource = tex.saveboxresource
local tex_useboxresource = tex.useboxresource
@@ -23,13 +40,20 @@ updaters.register("backend.update",function()
tex_getboxresourcedimensions = tex.getboxresourcedimensions
end)
-tex.boxresources = {
- save = function(...) return tex_saveboxresource(...) end,
- use = function(...) return tex_useboxresource(...) end,
- getbox = function(...) return tex_getboxresourcebox(...) end,
- getdimensions = function(...) return tex_getboxresourcedimensions(...) end,
+local savebox = function(...) return tex_saveboxresource(...) end
+local usebox = function(...) return tex_useboxresource(...) end
+local getbox = function(...) return tex_getboxresourcebox(...) end
+local getwhd = function(...) return tex_getboxresourcedimensions(...) end
+
+local boxresources = {
+ save = savebox,
+ use = usebox,
+ getbox = getbox,
+ getdimensions = getwhd,
}
+tex.boxresources = boxresources
+
-- local tex_saveimageresource = tex.saveimageresource
-- local tex_useimageresource = tex.useimageresource
--
@@ -42,3 +66,126 @@ tex.boxresources = {
-- save = function(...) return tex_saveimageresource(...) end,
-- use = function(...) return tex_useimageresource(...) end,
-- }
+
+local lastindex = 0
+
+local function saveboxresource()
+ local immediate = true
+ local kind = scankeyword("type") and scaninteger() or 0
+ local attributes = scankeyword("attr") and scanstring() or nil
+ local resources = scankeyword("resources") and scanstring() or nil
+ local margin = scankeyword("margin") and scandimension() or 0 -- register
+ local boxnumber = scaninteger()
+ --
+ lastindex = savebox(boxnumber,attributes,resources,immediate,kind,margin)
+ if trace then
+ report("\\saveboxresource: index %i",lastindex)
+ end
+end
+
+local function lastsavedboxresourceindex()
+ if trace then
+ report("\\lastsaveboxresource: index %i",lastindex)
+ end
+ context("%i",lastindex)
+end
+
+local function useboxresource()
+ local width, height, depth = scanwhd()
+ local index = scaninteger()
+ local node = usebox(index,width,height,depth)
+ if trace then
+ report("\\useboxresource: index %i",index)
+ end
+ context(node)
+end
+
+implement { name = "saveboxresource", actions = saveboxresource }
+implement { name = "lastsavedboxresourceindex", actions = lastsavedboxresourceindex }
+implement { name = "useboxresource", actions = useboxresource }
+
+-- image resources
+
+local imageresources = { }
+local lastindex = 0
+local lastpages = 1
+
+local function saveimageresource()
+ local width, height, depth = scanwhd()
+ local page = 1
+ local immediate = true
+ local margin = 0 -- or dimension
+ local attributes = scankeyword("attr") and scanstring() or nil
+ if scankeyword("named") then
+ scanstring() -- ignored
+ elseif scankeyword("page") then
+ page = scaninteger()
+ end
+ local userpassword = scankeyword("userpassword") and scanstring() or nil
+ local ownerpassword = scankeyword("ownerpassword") and scanstring() or nil
+ local visiblefilename = scankeyword("visiblefilename") and scanstring() or nil
+ local colorspace = scankeyword("colorspace") and scaninteger() or nil
+ local pagebox = scanword() or nil
+ local filename = scanstring()
+-- pcall
+ context.getfiguredimensions( { filename }, {
+ [constants.userpassword] = userpassword,
+ [constants.ownerpassword] = ownerpassword,
+ [constants.page] = page or 1,
+ [constants.size] = pagebox,
+ })
+ context.relax()
+ lastindex = lastindex + 1
+ lastpages = 1
+ imageresources[lastindex] = {
+ filename = filename,
+ page = page or 1,
+ size = pagebox,
+ width = width,
+ height = height,
+ depth = depth,
+ attr = attributes,
+ -- margin = margin,
+ }
+end
+
+local function lastsavedimageresourceindex()
+ context("%i",lastindex or 0)
+end
+
+local function lastsavedimageresourcepages()
+ context("%i",lastpages or 0) -- todo
+end
+
+local function useimageresource()
+ local width, height, depth = scanwhd()
+ if scankeyword("keepopen") then
+ -- ignored
+ end
+ local index = scaninteger()
+ local l = imageresources[index]
+ if l then
+ if not (width or height or depth) then
+ width = l.width
+ height = l.height
+ depth = l.depth
+ end
+ -- pcall / we could use a dedicated call instead:
+ context.externalfigure( { l.filename }, {
+ [constants.userpassword] = l.userpassword,
+ [constants.ownerpassword] = l.ownerpassword,
+ [constants.width] = width and (width .. "sp") or nil,
+ [constants.height] = height and (height .. "sp") or nil,
+ [constants.page] = l.page or 1,
+ [constants.size] = pagebox,
+ })
+ context.relax()
+ else
+ report("no valid image resource %a",index)
+ end
+end
+
+implement { name = "saveimageresource", actions = saveimageresource }
+implement { name = "lastsavedimageresourceindex", actions = lastsavedimageresourceindex }
+implement { name = "lastsavedimageresourcepages", actions = lastsavedimageresourcepages }
+implement { name = "useimageresource", actions = useimageresource }
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-res.mkiv b/Master/texmf-dist/tex/context/base/mkiv/back-res.mkiv
new file mode 100644
index 00000000000..fd7b208c949
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-res.mkiv
@@ -0,0 +1,32 @@
+%D \module
+%D [ file=back-res,
+%D version=2019.05.23, % 2009.04.15,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=Resources,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Backend Macros / Resources}
+
+\registerctxluafile{back-res}{}
+
+\unprotect
+
+%D We overload the primitives with our own but use a bit of indirection for the
+%D purpose of tracing. Some of these are needes for packages like tikz.
+
+\unexpanded\def\saveboxresource {\clf_saveboxresource}
+\unexpanded\def\lastsavedboxresourceindex {\numexpr\clf_lastsavedboxresourceindex\relax}
+\unexpanded\def\useboxresource {\clf_useboxresource}
+
+\unexpanded\def\saveimageresource {\clf_saveimageresource}
+\unexpanded\def\lastsavedimageresourceindex{\numexpr\clf_lastsavedimageresourceindex\relax}
+\unexpanded\def\lastsavedimageresourcepages{\numexpr\clf_lastsavedimageresourcepages\relax}
+\unexpanded\def\useimageresource {\clf_useimageresource}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-trf.lua b/Master/texmf-dist/tex/context/base/mkiv/back-trf.lua
new file mode 100644
index 00000000000..1586bc440f4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-trf.lua
@@ -0,0 +1,164 @@
+if not modules then modules = { } end modules ['back-trf'] = {
+ version = 1.001,
+ comment = "companion to back-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local sind, cosd, abs = math.sind, math.cosd, math.abs
+local insert, remove = table.insert, table.remove
+local unpack = unpack
+
+local context = context
+
+local formatters = string.formatters
+
+local scanners = tokens.scanners
+local scankeyword = scanners.keyword
+local scaninteger = scanners.integer
+local scannumber = scanners.number
+local scanstring = scanners.string
+
+local implement = interfaces.implement
+
+local nodepool = nodes.pool
+local savenode = nodepool.save
+local restorenode = nodepool.restore
+local setmatrixnode = nodepool.setmatrix
+local literalnode = nodepool.literal -- has to become some nodeinjection
+
+local stack = { }
+local restore = true -- false
+
+updaters.register("backend.update",function()
+ savenode = nodepool.save
+ restorenode = nodepool.restore
+ setmatrixnode = nodepool.setmatrix
+ literalnode = nodepool.literal -- has to become some nodeinjection
+end)
+
+local function stopsomething()
+ local top = remove(stack)
+ if top == false then
+ -- not wrapped
+ elseif top == true then
+ context(restorenode())
+ elseif top then
+ context(setmatrixnode(unpack(top))) -- not really needed anymore
+ context(restorenode())
+ else
+ -- nesting error
+ end
+end
+
+local function startrotation()
+ local a = scannumber()
+ if a == 0 then
+ insert(stack,false)
+ else
+ local s, c = sind(a), cosd(a)
+ if abs(s) < 0.000001 then
+ s = 0 -- otherwise funny -0.00000
+ end
+ if abs(c) < 0.000001 then
+ c = 0 -- otherwise funny -0.00000
+ end
+ context(savenode())
+ context(setmatrixnode(c,s,-s,c))
+ insert(stack,restore and { c, -s, s, c } or true)
+ end
+end
+
+implement { name = "startrotation", actions = startrotation }
+implement { name = "stoprotation", actions = stopsomething }
+
+local function startscaling() -- at the tex end we use sx and sy instead of rx and ry
+ local rx, ry = 1, 1
+ while true do
+ if scankeyword("rx") then
+ rx = scannumber()
+ elseif scankeyword("ry") then
+ ry = scannumber()
+ -- elseif scankeyword("revert") then
+ -- local top = stack[#stack]
+ -- if top then
+ -- rx = top[1]
+ -- ry = top[4]
+ -- else
+ -- rx = 1
+ -- ry = 1
+ -- end
+ else
+ break
+ end
+ end
+ if rx == 1 and ry == 1 then
+ insert(stack,false)
+ else
+ if rx == 0 then
+ rx = 0.0001
+ end
+ if ry == 0 then
+ ry = 0.0001
+ end
+ context(savenode())
+ context(setmatrixnode(rx,0,0,ry))
+ insert(stack,restore and { 1/rx, 0, 0, 1/ry } or true)
+ end
+end
+
+implement { name = "startscaling", actions = startscaling }
+implement { name = "stopscaling", actions = stopsomething }
+
+local function startmatrix() -- rx sx sy ry -- tx, ty
+ local rx, sx, sy, ry = 1, 0, 0, 1
+ while true do
+ if scankeyword("rx") then rx = scannumber()
+ elseif scankeyword("ry") then ry = scannumber()
+ elseif scankeyword("sx") then sx = scannumber()
+ elseif scankeyword("sy") then sy = scannumber()
+ else break end
+ end
+ if rx == 1 and sx == 0 and sy == 0 and ry == 1 then
+ insert(stack,false)
+ else
+ context(savenode())
+ context(setmatrixnode(rx,sx,sy,ry))
+ insert(stack,store and { -rx, -sx, -sy, -ry } or true)
+ end
+end
+
+implement { name = "startmatrix", actions = startmatrix }
+implement { name = "stopmatrix", actions = stopsomething }
+
+local function startmirroring()
+ context(setmatrixnode(-1,0,0,1))
+end
+
+implement { name = "startmirroring", actions = startmirroring }
+implement { name = "stopmirroring", actions = startmirroring } -- not: stopsomething
+
+-- this could also run on top of pack-rul ... todo
+
+-- local function startclipping()
+-- -- context(savenode())
+-- context(literalnode("origin",formatters["q 0 w %s W n"](scanstring())))
+-- end
+--
+-- local function stopclipping()
+-- -- context(restorenode())
+-- context(literalnode("Q"))
+-- end
+
+local function startclipping()
+ context(savenode())
+ context(literalnode("origin",formatters["0 w %s W n"](scanstring())))
+end
+
+local function stopclipping()
+ context(restorenode())
+end
+
+implement { name = "startclipping", actions = startclipping }
+implement { name = "stopclipping", actions = stopclipping }
diff --git a/Master/texmf-dist/tex/context/base/mkiv/back-trf.mkiv b/Master/texmf-dist/tex/context/base/mkiv/back-trf.mkiv
new file mode 100644
index 00000000000..3d8477a8214
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/back-trf.mkiv
@@ -0,0 +1,79 @@
+%D \module
+%D [ file=back-trf,
+%D version=2019.02.08, % 2009.04.15,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=Transformations,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\registerctxluafile{back-trf}{}
+
+% rotation
+
+\unexpanded\def\dostartrotation#1%
+ {\forcecolorhack
+ \clf_startrotation#1\relax} % todo: implement without Q q
+
+\unexpanded\def\dostoprotation
+ {\clf_stoprotation
+ \forcecolorhack}
+
+% scaling
+
+\unexpanded\def\dostartscaling#1#2%
+ {\forcecolorhack
+ \clf_startscaling rx #1 ry #2\relax}
+
+\unexpanded\def\dostopscaling
+ {\clf_stopscaling
+ \forcecolorhack}
+
+% mirroring
+
+\unexpanded\def\dostartmirroring
+ {\clf_startmirroring}
+
+\unexpanded\def\dostopmirroring
+ {\clf_stopmirroring}
+
+% transform
+
+\unexpanded\def\dotransformnextbox#1#2#3#4#5#6%
+ {\dowithnextbox{\dodotransformnextbox{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\unexpanded\def\dodotransformnextbox#1#2#3#4#5#6%
+ {\hpack
+ {\kern #5\onebasepoint
+ \raise#6\onebasepoint
+ \hpack
+ {\clf_startmatrix rx #1 sx #2 sy #3 ry #4\relax
+ \box\nextbox
+ \clf_stopmatrix}}}
+
+%D \macros
+%D {dostartclipping,dostopclipping}
+%D
+%D Clipping is implemented in such a way that an arbitrary code can be fed.
+%D
+%D \starttyping
+%D \dostartclipping {pathname} {width} {height}
+%D \dostopclipping
+%D \stoptyping
+
+\unexpanded\def\dostartclipping#1#2#3% we can move this to lua and only set a box here
+ {\forcecolorhack
+ \meta_grab_clip_path{#1}{#2}{#3}%
+ \clf_startclipping{\MPclippath}%
+ \glet\MPclippath\empty}
+
+\unexpanded\def\dostopclipping
+ {\clf_stopclipping}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/bibl-tra.lua b/Master/texmf-dist/tex/context/base/mkiv/bibl-tra.lua
index 76171cb7f21..d6fb7c6c7ed 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/bibl-tra.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/bibl-tra.lua
@@ -68,7 +68,7 @@ local runners = {
name = "bibtex",
method = "execute",
program = "bibtex",
- template = [["%filename%"]],
+ template = "%filename%",
checkers = {
filename = "readable",
}
@@ -77,7 +77,7 @@ local runners = {
name = "mlbibtex",
method = "execute",
program = "mlbibcontext",
- template = [["%filename%"]],
+ template = "%filename%",
checkers = {
filename = "readable",
}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/buff-imp-default.mkiv b/Master/texmf-dist/tex/context/base/mkiv/buff-imp-default.mkiv
index 4da4ff0df20..1a125a07324 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/buff-imp-default.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/buff-imp-default.mkiv
@@ -15,11 +15,13 @@
\unprotect
-\setupstartstop
- [DefaultSnippet]
- [\c!before={\typingparameter\c!before},
- \c!after={\typingparameter\c!after},
- \c!style={\typingparameter\c!style}]
+% Happens elsewhere:
+%
+% \setupstartstop
+% [DefaultSnippet]
+% [\c!before={\typingparameter\c!before},
+% \c!after={\typingparameter\c!after},
+% \c!style={\typingparameter\c!style}]
% Name
% NamePrimitive
diff --git a/Master/texmf-dist/tex/context/base/mkiv/buff-imp-xml.lua b/Master/texmf-dist/tex/context/base/mkiv/buff-imp-xml.lua
index 0c48ed3b090..b7fa85818a0 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/buff-imp-xml.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/buff-imp-xml.lua
@@ -41,7 +41,9 @@ local handler = visualizers.newhandler {
}
local comment = P("--")
-local name = (patterns.letter + patterns.digit + S('_-.'))^1
+local alsoname = patterns.utf8two + patterns.utf8three + patterns.utf8four
+----- alsoname = R("\128\255") -- basically any encoding without checking (fast)
+local name = (patterns.letter + patterns.digit + S('_-.') + alsoname)^1
local entity = P("&") * (1-P(";"))^1 * P(";")
local openbegin = P("<")
local openend = P("</")
@@ -57,11 +59,11 @@ local closecdata = P("]]>")
local grammar = visualizers.newgrammar("default", { "visualizer",
sstring =
makepattern(handler,"string",patterns.dquote)
- * (V("whitespace") + makepattern(handler,"default",1-patterns.dquote))^0
+ * (V("whitespace") + makepattern(handler,"default",(1-patterns.dquote)^0))
* makepattern(handler,"string",patterns.dquote),
dstring =
makepattern(handler,"string",patterns.squote)
- * (V("whitespace") + makepattern(handler,"default",1-patterns.squote))^0
+ * (V("whitespace") + makepattern(handler,"default",(1-patterns.squote)^0))
* makepattern(handler,"string",patterns.squote),
entity =
makepattern(handler,"entity",entity),
diff --git a/Master/texmf-dist/tex/context/base/mkiv/buff-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/buff-ini.lua
index ecb5d9dd054..5b5c4786756 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/buff-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/buff-ini.lua
@@ -36,6 +36,7 @@ local scanstring = scanners.string
local scaninteger = scanners.integer
local scanboolean = scanners.boolean
local scancode = scanners.code
+local scantokencode = scanners.tokencode
----- scantoken = scanners.token
local getters = tokens.getters
@@ -357,6 +358,23 @@ local split = table.setmetatableindex(function(t,k)
return v
end)
+local tochar = {
+ [ 0] = "\\",
+ [ 1] = "{",
+ [ 2] = "}",
+ [ 3] = "$",
+ [ 4] = "&",
+ [ 5] = "\n",
+ [ 6] = "#",
+ [ 7] = "^",
+ [ 8] = "_",
+ [10] = " ",
+ [14] = "%",
+}
+
+local experiment = false
+local experiment = scantokencode and true
+
function tokens.pickup(start,stop)
local stoplist = split[stop] -- totable(stop)
local stoplength = #stoplist
@@ -367,7 +385,8 @@ function tokens.pickup(start,stop)
local list = { }
local size = 0
local depth = 0
--- local done = 32
+-- local done = 32
+ local scancode = experiment and scantokencode or scancode
while true do -- or use depth
local char = scancode()
if char then
@@ -418,15 +437,37 @@ function tokens.pickup(start,stop)
local t = gettoken()
if t then
-- we're skipping leading stuff, like obeyedlines and relaxes
+ if experiment and size > 0 then
+ -- we're probably in a macro
+ local char = tochar[token.get_command(t)] -- could also be char(token.get_mode(t))
+ if char then
+ size = size + 1 ; list[size] = char
+ else
+ local csname = token.get_csname(t)
+ if csname == stop then
+ stoplength = 0
+ break
+ else
+ size = size + 1 ; list[size] = "\\"
+ size = size + 1 ; list[size] = csname
+ size = size + 1 ; list[size] = " "
+ end
+ end
+ else
+ -- ignore and hope for the best
+ end
else
break
end
end
end
local start = 1
- local stop = size-stoplength-1
+ local stop = size - stoplength - 1
-- not good enough: only empty lines, but even then we miss the leading
-- for verbatim
+ --
+ -- the next is not yet adapted to the new scanner ... we don't need lpeg here
+ --
for i=start,stop do
local li = list[i]
if lpegmatch(blackspace,li) then
@@ -445,6 +486,7 @@ function tokens.pickup(start,stop)
break
end
end
+ --
if start <= stop then
return concat(list,"",start,stop)
else
@@ -512,7 +554,7 @@ local runner = sandbox.registerrunner {
name = "run buffer",
program = "context",
method = "execute",
- template = "--purgeall " .. (jit and "--jit" or "") .. " %filename%",
+ template = jit and "--purgeall --jit %filename%" or "--purgeall %filename%",
reporter = report_typeset,
checkers = {
filename = "readable",
diff --git a/Master/texmf-dist/tex/context/base/mkiv/buff-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/buff-ini.mkiv
index 145f0f39245..8e71c9865ad 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/buff-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/buff-ini.mkiv
@@ -132,7 +132,7 @@
\unexpanded\def\buff_stop#1%
{\endgroup % (3 & 4 & 5 & 6)
- \csname#1\endcsname}
+ \begincsname#1\endcsname}
% \installctxfunction\dopickupbuffer{commands.dopickupbuffer}
@@ -185,6 +185,15 @@
{\processcommalist[#1]\buff_get_stored_indeed}%
\namedbufferparameter\empty\c!after\relax}
+% \installcommalistprocessorcommand \buff_get_stored_list \empty \buff_get_stored_indeed
+%
+% \unexpanded\def\buff_get[#1]% [name]
+% {\namedbufferparameter\empty\c!before\relax
+% \doifelsenothing{#1}
+% {\buff_get_stored_indeed\empty}
+% {\buff_get_stored_list[#1]}%
+% \namedbufferparameter\empty\c!after\relax}
+
\unexpanded\def\buff_get_stored#1#2%
{\namedbufferparameter{#1}\c!before\relax
\buff_get_stored_indeed{#2}%
diff --git a/Master/texmf-dist/tex/context/base/mkiv/buff-ver.lua b/Master/texmf-dist/tex/context/base/mkiv/buff-ver.lua
index 969a28055e2..ad06dceeca3 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/buff-ver.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/buff-ver.lua
@@ -127,7 +127,8 @@ local signal = "\000"
visualizers.signal = signal
visualizers.signalpattern = P(signal)
-local functions = { __index = {
+local functions = {
+ __index = {
emptyline = f_emptyline,
newline = f_newline,
default = f_default,
diff --git a/Master/texmf-dist/tex/context/base/mkiv/buff-ver.mkiv b/Master/texmf-dist/tex/context/base/mkiv/buff-ver.mkiv
index 7cf829b746c..75ee992e41b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/buff-ver.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/buff-ver.mkiv
@@ -140,8 +140,7 @@
%D \macros
%D {definetype,setuptype}
%D
-%D Specific inline verbatim commands can be defined with the
-%D following command.
+%D Specific inline verbatim commands can be defined with the following command.
\installcorenamespace{type}
@@ -158,9 +157,8 @@
%D \macros
%D {definetyping,setuptyping}
%D
-%D For most users the standard \type{\start}||\type{\stop}||pair
-%D will suffice, but for documentation purposes the next
-%D definition command can be of use:
+%D For most users the standard \type {\start}||\type {\stop}||pair will suffice, but
+%D for documentation purposes the next definition command can be of use:
%D
%D \starttyping
%D \definetyping[extratyping][margin=3em]
@@ -198,31 +196,27 @@
\let\doifvisualizerelse\doifelsevisualizer
-%D Verbatim command are very sensitive to argument processing,
-%D which is a direct result of the \CATCODES\ being fixed at
-%D reading time.
+%D Verbatim command are very sensitive to argument processing, which is a direct
+%D result of the \CATCODES\ being fixed at reading time.
%D
-%D Typesetting inline verbatim can be accomplished by
-%D \type{\type}, which in this sentence was typeset by saying
-%D just \type{\type{\type}}, which in turn was typeset by
-%D \unknown. Using the normal grouping characters \type{{}} is
-%D the most natural way of using this command.
+%D Typesetting inline verbatim can be accomplished by \type {\type}, which in this
+%D sentence was typeset by saying just \type {\type {\type}}, which in turn was
+%D typeset by \unknown. Using the normal grouping characters \type {{}} is the most
+%D natural way of using this command.
%D
-%D A second, more or less redundant, alternative is delimiting
-%D the argument with an own character. This method was
-%D implemented in the context of a publication in the \MAPS,
-%D where this way of delimiting is recognized by \LATEX\ users.
+%D A second, more or less redundant, alternative is delimiting the argument with an
+%D own character. This method was implemented in the context of a publication in the
+%D \MAPS, where this way of delimiting is recognized by \LATEX\ users.
+%D
+%D The third, more original alternative, is the one using \type {<<} and \type {>>}
+%D as delimiters. This alternative can be used in situations where slanted
+%D typeseting is needed.
%D
-%D The third, more original alternative, is the one using
-%D \type{<<} and \type{>>} as delimiters. This alternative can
-%D be used in situations where slanted typeseting is needed.
-
%D \macros
%D {type}
%D
-%D We define \type{\type} as a protected command. This command
-%D has several invocations: grouped, wirt boundary characters,
-%D and with font switches.
+%D We define \type {\type} as a protected command. This command has several
+%D invocations: grouped, wirt boundary characters, and with font switches.
%D
%D \starttyping
%D normal: \par \type{xx<<..xx..<<xx <<xx>> >>..>>xx} \par \type<<....>> \par \type<<..<<xx>>..>> \par
@@ -234,17 +228,14 @@
%D none: \par \type{xx<<..xx..<<xx <<xx>> >>..>>xx} \par \type<<....>> \par \type<<..<<xx>>..>> \par
%D \stoptyping
%D
-%D When writing the manual to \CONTEXT\ and documenting this
-%D source we needed to typeset \type{<<} and \type{>>}. Because
-%D we wanted to do this in the natural way, we've adapted the
-%D original definition a bit. This implementation went through
-%D several live cycles. The final implementation looks a bit
-%D further and treats the lone \type{<<} and \type{>>} a bit
-%D different. The \type {\null} prevents ligatures, which
-%D unfortunately turn up in Lucida fonts.
+%D When writing the manual to \CONTEXT\ and documenting this source we needed to
+%D typeset \type {<<} and \type {>>}. Because we wanted to do this in the natural
+%D way, we've adapted the original definition a bit. This implementation went
+%D through several live cycles. The final implementation looks a bit further and
+%D treats the lone \type {<<} and \type {>>} a bit different. The \type {\null}
+%D prevents ligatures, which unfortunately turn up in Lucida fonts.
%D
-%D The following lines show what happens when we set
-%D \type {option=commands}.
+%D The following lines show what happens when we set \type {option=commands}.
%D
%D \startbuffer
%D \starttyping
@@ -261,9 +252,8 @@
%D
%D \typebuffer
-% Beware, the command is supposed to do something like \framed and not
-% manipulate content i.e. it gets no argument but something b/egrouped
-% instead:
+% Beware, the command is supposed to do something like \framed and not manipulate
+% content i.e. it gets no argument but something b/egrouped instead:
\def\buff_verbatim_left_of_type
{\typeparameter\c!left
@@ -286,10 +276,6 @@
{\setupcurrenttype[#1]%
\buff_verbatim_type_nop}
-\def\buff_verbatim_type_nop
- {\buff_verbatim_left_of_type
- \futurelet\next\buff_verbatim_type_one}
-
\def\buff_verbatim_typ#1%
{\dontleavehmode
\bgroup
@@ -298,6 +284,10 @@
\let\specialobeyedspace\specialstretchedspace
\doifelsenextoptionalcs\buff_verbatim_type_yes\buff_verbatim_type_nop}
+\def\buff_verbatim_type_nop
+ {\buff_verbatim_left_of_type
+ \futurelet\next\buff_verbatim_type_one}
+
\def\buff_verbatim_type_one
{\ifx\next\bgroup
\expandafter\buff_verbatim_type_a
@@ -379,12 +369,11 @@
%D \macros
%D {obeyhyphens,obeybreakpoints}
%D
-%D Although it's not clear from the macros, one character
-%D trait of this macros, which are build on top of the support
-%D module, is that they don't hyphenate. We therefore offer
-%D the alternative \type{\typ}. The current implementation
-%D works all right, but a decent hyphenation support of
-%D \type{\tt} text will be implemented soon.
+%D Although it's not clear from the macros, one character trait of this macros,
+%D which are build on top of the support module, is that they don't hyphenate. We
+%D therefore offer the alternative \type{\typ}. The current implementation works all
+%D right, but a decent hyphenation support of \type{\tt} text will be implemented
+%D soon.
\unexpanded\def\specialfixedspace {\kern\interwordspace\relax}
\unexpanded\def\specialobeyedspace {\hskip\interwordspace\relax} % better than spaceskip
@@ -418,13 +407,11 @@
%D \macros
%D {tex,arg,mat,dis,astype}
%D
-%D Sometimes, for instance when we pass verbatim text as an
-%D argument, the fixed \CATCODES\ interfere with our wishes. An
-%D experimental implementation of character by character
-%D processing of verbatim text did overcome this limitation,
-%D but we've decided not to use that slow and sometimes
-%D troublesome solution. Instead we stick to some 'old'
-%D \CONTEXT\ macros for typesetting typical \TEX\ characters.
+%D Sometimes, for instance when we pass verbatim text as an argument, the fixed
+%D \CATCODES\ interfere with our wishes. An experimental implementation of character
+%D by character processing of verbatim text did overcome this limitation, but we've
+%D decided not to use that slow and sometimes troublesome solution. Instead we stick
+%D to some 'old' \CONTEXT\ macros for typesetting typical \TEX\ characters.
\def\lesscharacter {<} % obsolete
\def\morecharacter {>} % obsolete
@@ -502,12 +489,25 @@
\buff_verbatim_setup_keep_together
\normalexpanded{\buff_verbatim_type_block{\e!start\currenttyping}{\e!stop\currenttyping}}}
+% \def\buff_verbatim_typing_start_yes[#1]%
+% {\typingparameter\c!before
+% \startpacked[\v!blank]%
+% \doifelseassignment{#1}
+% {\setupcurrenttyping[#1]}
+% {\doif\v!continue{#1}{\lettypingparameter\c!continue\v!yes}}%
+% \buff_verbatim_setup_line_numbering
+% \buff_verbatim_initialize_typing_one
+% \buff_verbatim_setup_keep_together
+% \normalexpanded{\buff_verbatim_type_block{\e!start\currenttyping}{\e!stop\currenttyping}}}
+
\def\buff_verbatim_typing_start_yes[#1]%
{\typingparameter\c!before
\startpacked[\v!blank]%
- \doifelseassignment{#1}
- {\setupcurrenttyping[#1]}
- {\doif\v!continue{#1}{\lettypingparameter\c!continue\v!yes}}%
+ \ifcondition\validassignment{#1}%
+ \setupcurrenttyping[#1]%
+ \else
+ \doif\v!continue{#1}{\lettypingparameter\c!continue\v!yes}%
+ \fi
\buff_verbatim_setup_line_numbering
\buff_verbatim_initialize_typing_one
\buff_verbatim_setup_keep_together
@@ -549,8 +549,8 @@
\endgroup
\dorechecknextindentation}
-%D Line numbering for files is combined with filtering, while
-%D display verbatim has the ability to continue.
+%D Line numbering for files is combined with filtering, while display verbatim has
+%D the ability to continue.
%D
%D \starttyping
%D \typefile[numbering=file,start=10,stop=12]{test.tex}
@@ -596,10 +596,9 @@
%D \macros
%D {typefile}
%D
-%D Typesetting files verbatim (for the moment) only supports
-%D colorization of \TEX\ sources as valid option. The other
-%D setup values are inherited from display verbatim.
-%D The implementation of \type{\typefile} is straightforward:
+%D Typesetting files verbatim (for the moment) only supports colorization of \TEX\
+%D sources as valid option. The other setup values are inherited from display
+%D verbatim. The implementation of \type {\typefile} is straightforward:
% [category] [settings] {name} % for historic reasons, all filenames are {}
@@ -610,20 +609,39 @@
\setuevalue{\e!type\currenttyping\v!file}{\typefile[\currenttyping]}%
\to \everydefinetyping
+% \def\buff_verbatim_type_file[#1][#2]#3%
+% {\begingroup
+% \ifsecondargument
+% \setuptyping[#1][#2]%
+% \buff_verbatim_type_file_checked{#1}{#3}%
+% \else\iffirstargument
+% \doifelseassignment{#1}
+% {\setuptyping[\v!file][#1]%
+% \buff_verbatim_type_file_checked\v!file{#3}}
+% {\buff_verbatim_type_file_checked{#1}{#3}}%
+% \else
+% \buff_verbatim_type_file_checked\v!file{#3}%
+% \fi\fi
+% \endgroup}
+
\def\buff_verbatim_type_file[#1][#2]#3%
{\begingroup
\ifsecondargument
\setuptyping[#1][#2]%
\buff_verbatim_type_file_checked{#1}{#3}%
\else\iffirstargument
- \doifelseassignment{#1}
- {\setuptyping[\v!file][#1]
- \buff_verbatim_type_file_checked\v!file{#3}}
- {\buff_verbatim_type_file_checked{#1}{#3}}%
+ \ifcondition\validassignment{#1}%
+ \setuptyping[\v!file][#1]%
+ \buff_verbatim_type_file_checked\v!file{#3}%
+ \else
+ \buff_verbatim_type_file_checked{#1}{#3}%
+ \fi
\else
\buff_verbatim_type_file_checked\v!file{#3}%
\fi\fi
- \endgroup}
+ \useindentnextparameter\typingparameter % needs checking
+ \endgroup
+ \dorechecknextindentation} % needs checking
\def\buff_verbatim_type_file_checked#1#2%
{\doifelsetypingfile{#2}
@@ -721,10 +739,9 @@
\unexpanded\def\verbatim#1{\detokenize{#1}}
-%D The setups for display verbatim and file verbatim are
-%D shared. One can adapt the extra defined typing environments,
-%D but they also default to the values below. Watch the
-%D alternative escape character.
+%D The setups for display verbatim and file verbatim are shared. One can adapt the
+%D extra defined typing environments, but they also default to the values below.
+%D Watch the alternative escape character.
% \tttf gives problems with {\tx \type...}
% \tt\tf does not adapt to e.g. \bf
@@ -806,19 +823,36 @@
\setuevalue{\e!type\currenttyping\v!buffer}{\buff_verbatim_type_buffer_class{\currenttyping}}%
\to \everydefinetyping
+% \unexpanded\def\buff_verbatim_type_buffer[#1][#2]%
+% {\ifsecondargument
+% \setupcurrenttyping[#2]%
+% \processcommalist[#1]{\buff_verbatim_type_buffer_indeed\currenttyping}% [name] [settings]
+% \else\iffirstargument
+% \doifelseassignment{#1}
+% {\setupcurrenttyping[#1]%
+% \buff_verbatim_type_buffer_indeed\currenttyping\empty}% [settings]
+% {\processcommalist[#1]{\buff_verbatim_type_buffer_indeed\currenttyping}}% [name]
+% \else
+% \buff_verbatim_type_buffer_indeed\currenttyping\empty% []
+% \fi\fi
+% \endgroup}
+
\unexpanded\def\buff_verbatim_type_buffer[#1][#2]%
{\ifsecondargument
\setupcurrenttyping[#2]%
\processcommalist[#1]{\buff_verbatim_type_buffer_indeed\currenttyping}% [name] [settings]
\else\iffirstargument
- \doifelseassignment{#1}
- {\setupcurrenttyping[#1]%
- \buff_verbatim_type_buffer_indeed\currenttyping\empty}% [settings]
- {\processcommalist[#1]{\buff_verbatim_type_buffer_indeed\currenttyping}}% [name]
+ \ifcondition\validassignment{#1}%
+ \setupcurrenttyping[#1]%
+ \buff_verbatim_type_buffer_indeed\currenttyping\empty% [settings]
+ \else
+ \processcommalist[#1]{\buff_verbatim_type_buffer_indeed\currenttyping}% [name]
+ \fi
\else
\buff_verbatim_type_buffer_indeed\currenttyping\empty% []
\fi\fi
- \endgroup}
+ \endgroup
+ \dorechecknextindentation}
\unexpanded\def\buff_verbatim_type_buffer_class#1%
{\begingroup
@@ -857,7 +891,8 @@
\endofverbatimlines
\dostoptagged
\stoppacked
- \typingparameter\c!after}
+ \typingparameter\c!after
+ \dorechecknextindentation}
\unexpanded\def\typeinlinebuffer
{\dontleavehmode
@@ -891,16 +926,33 @@
{\writestatus{nota bene}{\string\processbuffer\space is obsolete}%
\dodoubleempty\buff_verbatim_process}
+% \def\buff_verbatim_process[#1][#2]%
+% {\begingroup
+% \ifsecondargument
+% \setuptyping[\v!buffer][#2]%
+% \processcommalist[#1]{\buff_verbatim_process_indeed\v!buffer}% [name] [settings]
+% \else\iffirstargument
+% \doifelseassignment{#1}
+% {\setuptyping[\v!buffer][#1]%
+% \buff_verbatim_process_indeed\v!buffer\empty}% [settings]
+% {\processcommalist[#1]{\buff_verbatim_process_indeed\v!buffer}}% [name]
+% \else
+% \buff_verbatim_process_indeed\v!buffer\empty% []
+% \fi\fi
+% \endgroup}
+
\def\buff_verbatim_process[#1][#2]%
{\begingroup
\ifsecondargument
\setuptyping[\v!buffer][#2]%
\processcommalist[#1]{\buff_verbatim_process_indeed\v!buffer}% [name] [settings]
\else\iffirstargument
- \doifelseassignment{#1}
- {\setuptyping[\v!buffer][#1]%
- \buff_verbatim_process_indeed\v!buffer\empty}% [settings]
- {\processcommalist[#1]{\buff_verbatim_process_indeed\v!buffer}}% [name]
+ \ifcondition\validassignment{#1}%
+ \setuptyping[\v!buffer][#1]%
+ \buff_verbatim_process_indeed\v!buffer\empty% [settings]
+ \else
+ \processcommalist[#1]{\buff_verbatim_process_indeed\v!buffer}% [name]
+ \fi
\else
\buff_verbatim_process_indeed\v!buffer\empty% []
\fi\fi
@@ -949,7 +1001,7 @@
\else
\blank[\typingparameter\c!blank]%
\fi
- \dostarttagged\t!verbatimlines\empty}
+ \dostarttagged\t!verbatimlines\empty}
% hooks:
diff --git a/Master/texmf-dist/tex/context/base/mkiv/buff-ver.mkxl b/Master/texmf-dist/tex/context/base/mkiv/buff-ver.mkxl
new file mode 100644
index 00000000000..dec4dfb4a02
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/buff-ver.mkxl
@@ -0,0 +1,1005 @@
+%D \module
+%D [ file=buff-ver, % was core-ver
+%D version=2000.05.09,
+%D title=\CONTEXT\ Buffer Macros,
+%D subtitle=Verbatim,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% check after-first and before-last breaks
+
+\writestatus{loading}{ConTeXt Buffer Macros / Verbatim}
+
+\registerctxluafile{buff-ver}{}
+
+\unprotect
+
+\startcontextdefinitioncode
+
+\definesystemattribute[verbatimline][public]
+
+\appendtoksonce
+ \attribute\verbatimlineattribute\attributeunsetvalue
+\to \everyforgetall
+
+%D Initializations.
+
+\installcorenamespace{typinglines}
+\installcorenamespace{typingspace}
+\installcorenamespace{typingblank} % needs checking ... used?
+
+\newtoks\everyinitializeverbatim
+
+\appendtoks
+ \the\everyresettypesetting
+ \resetfontfeature
+ \resetcharacterspacing
+\to \everyinitializeverbatim
+
+\unexpanded\def\setverbatimspaceskip % to be checked: must happen after font switch
+ {\spaceskip\fontcharwd\font`x\relax
+ \xspaceskip\spaceskip}
+
+\setvalue{\??typinglines\v!no }{\buff_verbatim_ignore_hyphens}
+\setvalue{\??typinglines\v!normal }{\buff_verbatim_ignore_hyphens}
+\setvalue{\??typinglines\v!yes }{\buff_verbatim_obey_breakpoints}
+\setvalue{\??typinglines\v!hyphenated}{\buff_verbatim_obey_hyphens}
+
+\setvalue{\??typingspace\v!on }{\let\obeyedspace\specialcontrolspace}
+\setvalue{\??typingspace\v!stretch }{\let\obeyedspace\specialstretchedspace}
+\setvalue{\??typingspace\v!normal }{}
+\setvalue{\??typingspace\v!fixed }{\let\obeyedspace\specialfixedspace}
+
+\setvalue{\??typingblank\v!standard }{\s_spac_whitespace_parskip}
+\setvalue{\??typingblank\v!small }{\smallskipamount}
+\setvalue{\??typingblank\v!medium }{\medskipamount}
+\setvalue{\??typingblank\v!big }{\bigskipamount}
+\setvalue{\??typingblank\v!halfline }{.5\baselineskip}
+\setvalue{\??typingblank\v!line }{\baselineskip}
+\setvalue{\??typingblank\v!none }{\zeropoint}
+
+\unexpanded\def\buff_verbatim_obey_hyphens
+ {}
+
+\unexpanded\def\buff_verbatim_obey_breakpoints
+ {\language\minusone % tricky as this affects the pagebuilder
+ \veryraggedright}
+
+\unexpanded\def\buff_verbatim_ignore_hyphens
+ {\language\minusone} % tricky as this affects the pagebuilder
+
+\def\buff_verbatim_initialize_type_one
+ {\let\obeylines\ignorelines
+ \edef\p_buff_option{\typeparameter\c!option}%
+ \ifx\p_buff_option\v!none
+ \usetypestyleandcolor\c!style\c!color
+ \orelse\ifx\p_buff_option\empty
+ \usetypestyleandcolor\c!style\c!color
+ \else
+ \usetypestyleparameter\c!style % no color
+ \fi
+ \setcatcodetable\vrbcatcodes}
+
+\def\buff_verbatim_initialize_type_two
+ {\spaceskip.5\emwidth\relax
+ \let\obeyedspace\specialobeyedspace
+ \let\controlspace\specialcontrolspace
+ \edef\p_buff_lines{\typeparameter\c!lines}%
+ \begincsname\??typinglines\p_buff_lines\endcsname
+ \edef\p_buff_space{\typeparameter\c!space}%
+ \begincsname\??typingspace\p_buff_space\endcsname
+ \relax\the\everyinitializeverbatim\relax}
+
+\unexpanded\def\doinitializeverbatim % for use elsewhere .. temp hack (see lxml-ini)
+ {\buff_verbatim_initialize_type_one
+ \buff_verbatim_initialize_type_two}
+
+\let\buff_verbatim_set_line_margin\relax
+
+\def\buff_verbatim_set_line_margin_indeed
+ {\hskip\doifelseoddpage{\typingparameter\c!oddmargin}{\typingparameter\c!evenmargin}\relax}
+
+\def\buff_verbatim_initialize_typing_one
+ {\usebodyfontparameter\typingparameter
+ \scratchskip\typingparameter\c!oddmargin\relax
+ \ifzeropt\scratchskip \else
+ \let\buff_verbatim_set_line_margin\buff_verbatim_set_line_margin_indeed
+ \fi
+ \scratchskip\typingparameter\c!evenmargin\relax
+ \ifzeropt\scratchskip \else
+ \let\buff_verbatim_set_line_margin\buff_verbatim_set_line_margin_indeed
+ \fi
+ \ifx\buff_verbatim_set_line_margin\relax
+ \doadaptleftskip{\typingparameter\c!margin}%
+ \fi
+ \edef\p_buff_option{\typingparameter\c!option}%
+ \ifx\p_buff_option\v!none
+ \usetypingstyleandcolor\c!style\c!color
+ \orelse\ifx\p_buff_option\empty
+ \usetypingstyleandcolor\c!style\c!color
+ \else
+ \usetypingstyleparameter\c!style % no color !
+ \fi
+ \usealignparameter\typingparameter}
+
+\def\buff_verbatim_initialize_typing_two
+ {\spaceskip.5\emwidth\relax
+ \let\obeyedspace\specialobeyedspace
+ \let\controlspace\specialcontrolspace
+ \edef\p_buff_lines{\typingparameter\c!lines}%
+ \begincsname\??typinglines\p_buff_lines\endcsname
+ \edef\p_buff_space{\typingparameter\c!space}%
+ \begincsname\??typingspace\p_buff_space\endcsname
+ \relax\the\everyinitializeverbatim\relax}
+
+%D \macros
+%D {definetype,setuptype}
+%D
+%D Specific inline verbatim commands can be defined with the following command.
+
+\installcorenamespace{type}
+
+\installcommandhandler \??type {type} \??type
+
+\appendtoks
+ \setuevalue{\currenttype}{\buff_verbatim_type{\currenttype}}%
+\to \everydefinetype
+
+\appendtoks
+ \buff_verbatim_initialize_visualizer{\typeparameter\c!option}%
+\to \everysetuptype
+
+%D \macros
+%D {definetyping,setuptyping}
+%D
+%D For most users the standard \type {\start}||\type {\stop}||pair will suffice, but
+%D for documentation purposes the next definition command can be of use:
+%D
+%D \starttyping
+%D \definetyping[extratyping][margin=3em]
+%D
+%D \startextratyping
+%D these extra ones are indented by 1 em
+%D \stopextratyping
+%D \stoptyping
+%D
+%D The definitions default to the standard typing values.
+
+\installcorenamespace{typing}
+
+\installcommandhandler \??typing {typing} \??typing
+
+\appendtoks
+ \setuevalue{\e!start\currenttyping}{\buff_verbatim_typing_start{\currenttyping}}%
+ \setuevalue{\e!stop \currenttyping}{\buff_verbatim_typing_stop {\currenttyping}}%
+ \ifx\currenttypingparent\empty
+ \normalexpanded{\definelinenumbering[\currenttyping]}%
+ \else
+ \normalexpanded{\definelinenumbering[\currenttyping][\currenttypingparent]}%
+ \fi
+\to \everydefinetyping
+
+\appendtoks
+ \buff_verbatim_initialize_visualizer{\typingparameter\c!option}% we can check at the tex end
+\to \everysetuptyping
+
+\def\buff_verbatim_initialize_visualizer#1%
+ {\ifproductionrun\clf_loadvisualizer{#1}\fi}
+
+\unexpanded\def\doifelsevisualizer#1%
+ {\clf_doifelsevisualizer{#1}}
+
+\let\doifvisualizerelse\doifelsevisualizer
+
+%D Verbatim command are very sensitive to argument processing, which is a direct
+%D result of the \CATCODES\ being fixed at reading time.
+%D
+%D Typesetting inline verbatim can be accomplished by \type {\type}, which in this
+%D sentence was typeset by saying just \type {\type {\type}}, which in turn was
+%D typeset by \unknown. Using the normal grouping characters \type {{}} is the most
+%D natural way of using this command.
+%D
+%D A second, more or less redundant, alternative is delimiting the argument with an
+%D own character. This method was implemented in the context of a publication in the
+%D \MAPS, where this way of delimiting is recognized by \LATEX\ users.
+%D
+%D The third, more original alternative, is the one using \type {<<} and \type {>>}
+%D as delimiters. This alternative can be used in situations where slanted
+%D typeseting is needed.
+%D
+%D \macros
+%D {type}
+%D
+%D We define \type {\type} as a protected command. This command has several
+%D invocations: grouped, wirt boundary characters, and with font switches.
+%D
+%D \starttyping
+%D normal: \par \type{xx<<..xx..<<xx <<xx>> >>..>>xx} \par \type<<....>> \par \type<<..<<xx>>..>> \par
+%D normal: \par \type{xx<..xx..<xx <slanted> >..>xx} \par \type{<....>} \par \type{<..<xx>..>}
+%D \setuptype[option=slanted]
+%D slanted: \par \type{xx<<..sl..<<xx <<sl>> xx>>..sl..>>xx} \par \type<<..xx..>> \par \type<<..<<sl>>..>> \par
+%D slanted: \par \type{xx<<..sl..<xx <sl> xx>..sl..>>xx} \par \type<<..xx..>> \par \type<<..<sl>..>> \par
+%D \setuptype[option=none]
+%D none: \par \type{xx<<..xx..<<xx <<xx>> >>..>>xx} \par \type<<....>> \par \type<<..<<xx>>..>> \par
+%D \stoptyping
+%D
+%D When writing the manual to \CONTEXT\ and documenting this source we needed to
+%D typeset \type {<<} and \type {>>}. Because we wanted to do this in the natural
+%D way, we've adapted the original definition a bit. This implementation went
+%D through several live cycles. The final implementation looks a bit further and
+%D treats the lone \type {<<} and \type {>>} a bit different. The \type {\null}
+%D prevents ligatures, which unfortunately turn up in Lucida fonts.
+%D
+%D The following lines show what happens when we set \type {option=commands}.
+%D
+%D \startbuffer
+%D \starttyping
+%D test//test test/BTEX \footnote{test test test}/ETEX test
+%D test//test test/BTEX \footnote{test test test}/ETEX test
+%D test test test/BTEX \bf(nota bene)/ETEX test
+%D test test test /BTEX \bf(nota bene)/ETEX test
+%D \stoptyping
+%D \stopbuffer
+%D
+%D % \bgroup\setuptyping[option=commands]\getbuffer\egroup
+%D
+%D this was keyed in as:
+%D
+%D \typebuffer
+
+% Beware, the command is supposed to do something like \framed and not manipulate
+% content i.e. it gets no argument but something b/egrouped instead:
+
+\def\buff_verbatim_left_of_type
+ {\typeparameter\c!left
+ \typeparameter\c!command\bgroup}
+
+\def\buff_verbatim_right_of_type
+ {\egroup
+ \typeparameter\c!right}
+
+\unexpanded\def\type{\buff_verbatim_type\empty}
+\unexpanded\def\typ {\buff_verbatim_typ \empty}
+
+\unexpanded\def\buff_verbatim_type#1%
+ {\dontleavehmode
+ \bgroup
+ \edef\currenttype{#1}%
+ \doifelsenextoptionalcs\buff_verbatim_type_yes\buff_verbatim_type_nop}
+
+\def\buff_verbatim_type_yes[#1]%
+ {\setupcurrenttype[#1]%
+ \buff_verbatim_type_nop}
+
+\def\buff_verbatim_typ#1%
+ {\dontleavehmode
+ \bgroup
+ \edef\currenttype{#1}%
+ \lettypeparameter\c!lines\v!hyphenated
+ \let\specialobeyedspace\specialstretchedspace
+ \doifelsenextoptionalcs\buff_verbatim_type_yes\buff_verbatim_type_nop}
+
+\def\buff_verbatim_type_nop
+ {\buff_verbatim_left_of_type
+ \futureexpand\bgroup\buff_verbatim_type_a\buff_verbatim_type_one}
+
+\def\buff_verbatim_type_one
+ {\catcode`<=\othercatcode % old precaution
+ \catcode`>=\othercatcode % old precaution
+ \futureexpandis<\buff_verbatim_type_b\buff_verbatim_type_c}
+
+\def\buff_verbatim_type_three
+ {\if\next<%
+ \expandafter\buff_verbatim_type_b
+ \else
+ \expandafter\buff_verbatim_type_c
+ \fi}
+
+\def\buff_verbatim_type_a
+ {\buff_verbatim_initialize_type_one
+ \setcatcodetable\tpacatcodes
+ \buff_verbatim_type_normal}
+
+\def\buff_verbatim_type_b#1%
+ {\buff_verbatim_initialize_type_one
+ \setcatcodetable\tpbcatcodes
+ \buff_verbatim_type_nested}
+
+\def\buff_verbatim_type_c#1%
+ {\buff_verbatim_initialize_type_one
+ \setcatcodetable\vrbcatcodes
+ \def\next##1#1{\buff_verbatim_type_normal{##1}}%
+ \next}
+
+\def\buff_verbatim_type_normal#1%
+ {\buff_verbatim_initialize_type_two
+ \dostarttaggedchained\t!verbatim\currenttype\??type
+ \clf_type
+ data {\detokenize{#1}}%
+ tab {\typeparameter\c!tab}%
+ method {\p_buff_option}%
+ compact {\typeparameter\c!compact}% % none | all | last (all needed in tabulate etc for manuals)
+ escape {\typeparameter\c!escape}% % new but rather useless imo (escaping in general is not used much)
+ % nature {inline}% is default
+ \relax
+ \dostoptagged
+ \buff_verbatim_right_of_type
+ \egroup}
+
+\def\buff_verbatim_type_nested#1%
+ {\buff_verbatim_initialize_type_two
+ \dostarttaggedchained\t!verbatim\currenttype\??type
+ \clf_type
+ data {\detokenize{#1}}%
+ tab {\typeparameter\c!tab}%
+ method {\p_buff_option}% % extra visualizer (maybe: nested,\typeparameter\c!option)
+ escape {\typeparameter\c!escape}% % new but rather useless imo (escaping in general is not used much)
+ % nature {inline}% is default
+ method {nested}%
+ \relax
+ \dostoptagged
+ \buff_verbatim_right_of_type
+ \egroup
+ \gobbleoneargument} % grab last >
+
+%D The \type {compact} option can come in handy in the case of inline argument passing
+%D
+%D \starttyping
+%D \definetype[TeXcodeA][option=TEX]
+%D \definetype[TeXcodeB][option=TEX,compact=all]
+%D \definetype[TeXcodeC][option=TEX,compact=absolute]
+%D
+%D \def\argA#1{\TeXcodeA{{#1}}}
+%D \def\argB#1{\TeXcodeB{{#1}}}
+%D \def\argC#1{\TeXcodeC{{#1}}}
+%D \stoptyping
+
+%D \macros
+%D {obeyhyphens,obeybreakpoints}
+%D
+%D Although it's not clear from the macros, one character trait of this macros,
+%D which are build on top of the support module, is that they don't hyphenate. We
+%D therefore offer the alternative \type{\typ}. The current implementation works all
+%D right, but a decent hyphenation support of \type{\tt} text will be implemented
+%D soon.
+
+\unexpanded\def\specialfixedspace {\kern\interwordspace\relax}
+\unexpanded\def\specialobeyedspace {\hskip\interwordspace\relax} % better than spaceskip
+\unexpanded\def\specialstretchedspace {\hskip.5\interwordspace\s!plus.125\interwordspace\relax} % \interwordstretch can be zero
+\unexpanded\def\specialcontrolspace {\normalcontrolspace\allowbreak} % uses fallback
+
+\unexpanded\def\explicitfixedspace {\asciispacechar}
+\unexpanded\def\explicitobeyedspace {\asciispacechar\allowbreak}
+\unexpanded\def\explicitstretchedspace{\asciispacechar\hskip\zeropoint\s!plus.125\interwordspace\relax}%
+\unexpanded\def\explicitcontrolspace {\optionalcontrolspace\allowbreak} % uses asciispace
+
+\appendtoks
+ \unexpanded\def\obeyedspace{\hskip\zeropoint\asciispacechar\hskip\zeropoint}%
+\to \everyenableelements
+
+\unexpanded\def\obeyhyphens
+ {\let\obeyedspace \specialobeyedspace % maybe \specialstretchedspace
+ \let\controlspace\specialcontrolspace
+ \spaceskip.25\emwidth\relax} % hm a bit of stretch !
+
+\unexpanded\def\obeybreakpoints
+ {\ignorehyphens
+ \veryraggedright}
+
+\unexpanded\def\ignorehyphens
+ {\language\minusone % extra bonus, the \null should do the job too
+ \let\obeyedspace \specialobeyedspace
+ \let\controlspace\specialcontrolspace
+ \spaceskip.5\emwidth\relax}
+
+%D \macros
+%D {tex,arg,mat,dis,astype}
+%D
+%D Sometimes, for instance when we pass verbatim text as an argument, the fixed
+%D \CATCODES\ interfere with our wishes. An experimental implementation of character
+%D by character processing of verbatim text did overcome this limitation, but we've
+%D decided not to use that slow and sometimes troublesome solution. Instead we stick
+%D to some 'old' \CONTEXT\ macros for typesetting typical \TEX\ characters.
+
+\def\lesscharacter {<} % obsolete
+\def\morecharacter {>} % obsolete
+
+\let\texescape \textbackslash
+\let\leftargument \textbraceleft
+\let\rightargument \textbraceright
+\let\inlinemathmarker \textdollar
+\def\displaymathmarker{\textdollar\textdollar}
+
+\def\buff_verbatim_special_type#1#2#% # gobbles spaces
+ {\dontleavehmode\bgroup
+ \buff_verbatim_initialize_type_one
+ \catcode\leftbraceasciicode \begingroupcatcode
+ \catcode\rightbraceasciicode\endgroupcatcode
+ #1%
+ \bgroup % else wrong font for #2
+ \aftergroup#2%
+ \aftergroup\egroup
+ \let\nexttoken}
+
+\unexpanded\def\tex{\buff_verbatim_special_type\texescape \relax}
+\unexpanded\def\arg{\buff_verbatim_special_type\leftargument \rightargument}
+\unexpanded\def\mat{\buff_verbatim_special_type\inlinemathmarker \inlinemathmarker}
+\unexpanded\def\dis{\buff_verbatim_special_type\displaymathmarker\displaymathmarker}
+
+\let\normaltexttex\tex
+\let\normaltextarg\arg
+\let\normaltextmat\mat
+\let\normaltextdis\dis
+
+\unexpanded\def\astype
+ {\dontleavehmode
+ \bgroup\usetypestyleandcolor\c!style\c!color\let\nexttoken}
+
+\unexpanded\def\asciistr#1% used in some old styles
+ {\dontleavehmode\begingroup
+ \dostarttagged\t!verbatim\empty
+ \usetypestyleandcolor\c!style\c!color\detokenize{#1}%
+ \dostoptagged
+ \endgroup}
+
+%D The basic display verbatim commands are defined in an indirect way. As we
+%D will see, they are a specific case of a more general mechanism.
+
+\let\beginofverbatimlines\relax % hooks
+\let\endofverbatimlines \relax % hooks
+
+\unexpanded\def\buff_verbatim_typing_start#1% tricky non standard lookahead
+ {\begingroup
+ \edef\currenttyping{#1}%
+ \obeylines
+ \futureexpandis[\buff_verbatim_typing_start_yes\buff_verbatim_typing_start_nop}
+
+\unexpanded\def\buff_verbatim_setup_keep_together
+ {\edef\p_keeptogether{\typingparameter\c!keeptogether}%
+ \ifx\p_keeptogether\v!yes
+ \settrue \c_buff_optimize_linebreaks
+ \else
+ \setfalse\c_buff_optimize_linebreaks
+ \fi}
+
+\def\buff_verbatim_typing_start_nop
+ {\typingparameter\c!before
+ \startpacked[\v!blank]%
+ \buff_verbatim_setup_line_numbering
+ \buff_verbatim_initialize_typing_one
+ \buff_verbatim_setup_keep_together
+ \normalexpanded{\buff_verbatim_type_block{\e!start\currenttyping}{\e!stop\currenttyping}}}
+
+\def\buff_verbatim_typing_start_yes[#1]%
+ {\typingparameter\c!before
+ \startpacked[\v!blank]%
+ \ifcondition\validassignment{#1}%
+ \setupcurrenttyping[#1]%
+ \else
+ \doif\v!continue{#1}{\lettypingparameter\c!continue\v!yes}%
+ \fi
+ \buff_verbatim_setup_line_numbering
+ \buff_verbatim_initialize_typing_one
+ \buff_verbatim_setup_keep_together
+ \normalexpanded{\buff_verbatim_type_block{\e!start\currenttyping}{\e!stop\currenttyping}}}
+
+\unexpanded\def\buff_verbatim_type_block#1#2%
+ {\edef\p_strip{\typingparameter\c!strip}%
+ \normalexpanded{\buff_pickup
+ {_typing_}%
+ {#1}%
+ {#2}%
+ {}%
+ {\buff_verbatim_type_block_verbatim_indeed{#1}{#2}}%
+ \ifx\p_strip\v!no\zerocount\else\plusone\fi}}
+
+\unexpanded\def\buff_verbatim_type_block_verbatim_indeed#1#2%
+ {\buff_verbatim_initialize_typing_two
+ \dostarttaggedchained\t!verbatimblock\currenttyping\??typing
+ \beginofverbatimlines
+ \dostarttagged\t!verbatimlines\empty
+ \clf_typebuffer
+ name {_typing_}%
+ strip {\typingparameter\c!strip}%
+ range {\typingparameter\c!range}%
+ tab {\typingparameter\c!tab}%
+ method {\p_buff_option}%
+ escape {\typingparameter\c!escape}%
+ nature {display}%
+ \relax
+ \dostoptagged
+ \endofverbatimlines
+ \dostoptagged
+ \begincsname#2\endcsname}
+
+\unexpanded\def\buff_verbatim_typing_stop#1% hm, currenttyping
+ {\stoppacked
+ \typingparameter\c!after
+ \useindentnextparameter\typingparameter
+ \endgroup
+ \dorechecknextindentation}
+
+%D Line numbering for files is combined with filtering, while display verbatim has
+%D the ability to continue.
+%D
+%D \starttyping
+%D \typefile[numbering=file,start=10,stop=12]{test.tex}
+%D
+%D \definetyping[code][numbering=line]
+%D
+%D \starttext
+%D \startcode
+%D ...
+%D ...
+%D \stopcode
+%D
+%D \startcode[start=continue]
+%D ...
+%D ...
+%D \stopcode
+%D
+%D \startcode[start=10]
+%D ...
+%D \stopcode
+%D \stoptyping
+
+%D Ranges:
+%D
+%D \starttyping
+%D % label:start:one
+%D
+%D \def\MyMacro
+%D {just an example}
+%D
+%D % label:stop:one
+%D
+%D \starttext
+%D
+%D % \typefile[file][range={3,6}] {whatever.tex}
+%D % \typefile[file][range={3,+2}]{whatever.tex}
+%D
+%D \typefile[file][range={label:start:one,label:stop:one}]{whatever.tex}
+%D
+%D \stoptext
+%D \stoptyping
+
+%D \macros
+%D {typefile}
+%D
+%D Typesetting files verbatim (for the moment) only supports colorization of \TEX\
+%D sources as valid option. The other setup values are inherited from display
+%D verbatim. The implementation of \type {\typefile} is straightforward:
+
+% [category] [settings] {name} % for historic reasons, all filenames are {}
+
+\unexpanded\def\typefile
+ {\dodoubleempty\buff_verbatim_type_file}
+
+\appendtoks
+ \setuevalue{\e!type\currenttyping\v!file}{\typefile[\currenttyping]}%
+\to \everydefinetyping
+
+\def\buff_verbatim_type_file[#1][#2]#3%
+ {\begingroup
+ \ifsecondargument
+ \setuptyping[#1][#2]%
+ \buff_verbatim_type_file_checked{#1}{#3}%
+ \orelse\iffirstargument
+ \ifcondition\validassignment{#1}%
+ \setuptyping[\v!file][#1]%
+ \buff_verbatim_type_file_checked\v!file{#3}%
+ \else
+ \buff_verbatim_type_file_checked{#1}{#3}%
+ \fi
+ \else
+ \buff_verbatim_type_file_checked\v!file{#3}%
+ \fi
+ \useindentnextparameter\typingparameter % needs checking
+ \endgroup
+ \dorechecknextindentation} % needs checking
+
+\def\buff_verbatim_type_file_checked#1#2%
+ {\doifelsetypingfile{#2}
+ {\buff_verbatim_type_file_indeed{#1}\askedtypingfile}
+ {\showmessage\m!verbatims1{#2}}}
+
+\unexpanded\def\doifelsetypingfile#1%
+ {\edef\askedtypingfile{\locfilename{#1}}%
+ \ifx\askedtypingfile\empty
+ \edef\askedtypingfile{\locfilename{#1.tex}}% downward compatible
+ \fi
+ \ifx\askedtypingfile\empty
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\let\doiftypingfileelse\doifelsetypingfile
+
+\def\buff_verbatim_type_file_indeed#1#2% category name
+ {\edef\currenttyping{#1}%
+ \typingparameter\c!before
+ \startpacked[\v!blank]
+ \buff_verbatim_setup_line_numbering
+ \buff_verbatim_initialize_typing_one
+ \buff_verbatim_initialize_typing_two
+ \dostarttaggedchained\t!verbatimblock\currenttyping\??typing
+ \beginofverbatimlines
+ \dostarttagged\t!verbatimlines\empty
+ \clf_typefile
+ name {#2}%
+ strip {\typingparameter\c!strip}%
+ range {\typingparameter\c!range}%
+ regime {\currentregime}%
+ tab {\typingparameter\c!tab}%
+ method {\p_buff_option}%
+ nature {display}%
+ \relax
+ \dostoptagged
+ \endofverbatimlines
+ \dostoptagged
+ \stoppacked
+ \typingparameter\c!after}
+
+%D Line numbering:
+
+\newconditional\verbatimnumberinglines
+
+\def\beginofverbatimlinenumbering
+ {\startlinenumbering
+ [\currenttyping]%
+ [\c!continue=\typingparameter\c!continue,
+ \c!method=\v!type,
+ \c!start=\typingparameter\c!start,
+ \c!stop=\typingparameter\c!stop, % ?
+ \c!step=\typingparameter\c!step]}
+
+\def\endofverbatimlinenumbering
+ {\stoplinenumbering}
+
+\def\buff_verbatim_setup_line_numbering
+ {\ifdefined\startlinenumbering
+ \edef\currenttypingnumbering{\typingparameter\c!numbering}%
+ \ifx\currenttypingnumbering\v!file
+ \setuplinenumbering[\currenttyping][\c!method=\v!file]%
+ \settrue\verbatimnumberinglines
+ \orelse\ifx\currenttypingnumbering\v!line
+ \settrue\verbatimnumberinglines
+ \else
+ \setfalse\verbatimnumberinglines
+ \fi
+ \ifconditional\verbatimnumberinglines
+ \let\beginofverbatimlines\beginofverbatimlinenumbering
+ \let\endofverbatimlines \endofverbatimlinenumbering
+ \fi
+ \fi}
+
+%D \macros
+%D {filename}
+%D
+%D Typesetting filenames in monospaced fonts is possible with
+%D
+%D \starttyping
+%D \filename{here/there/filename.suffix}
+%D \stoptyping
+%D
+%D The definition is not that spectacular.
+
+\unexpanded\def\filename#1{{\tttf\hyphenatedfilename{#1}}}
+
+%D \macros
+%D {verbatim}
+%d
+%D And a bonus macro, an unexpanded detokenize:
+
+\unexpanded\def\verbatim#1{\detokenize{#1}}
+
+%D The setups for display verbatim and file verbatim are shared. One can adapt the
+%D extra defined typing environments, but they also default to the values below.
+%D Watch the alternative escape character.
+
+% \tttf gives problems with {\tx \type...}
+% \tt\tf does not adapt to e.g. \bf
+
+\setuptyping
+ [\c!before=\blank,
+ \c!after=\blank,
+ %\c!keeptogether=yes, % this will become default (when tested enough)
+ %\c!bodyfont=,
+ %\c!color=,
+ \c!space=\v!off,
+ \c!lines=\v!no,
+ \c!page=\v!no,
+ \c!tab=\v!yes, % what is this: \s!ascii ?
+ \c!option=\v!none,
+ \c!text=\v!no,
+ \c!style=\tt,
+ \c!indentnext=\v!yes,
+ \c!margin=\zeropoint,
+ \c!evenmargin=\zeropoint,
+ \c!oddmargin=\zeropoint,
+ \c!blank=\v!line,
+ %\c!escape=, % yes | no | {START,STOP} | default when yes: {BTEX,ETEX}
+ \c!numbering=\v!no,
+ %\c!range=,
+ \c!start=1,
+ %\c!stop=,
+ \c!step=1,
+ %\c!continue=,
+ \c!strip=\v!no] % auto or number
+
+\definetyping[\v!typing]
+
+% the \zeropoint forces the number to the margin but also works ok in text
+
+\setuplinenumbering[\v!typing][\c!location=\v!left,\c!width=\zeropoint]
+
+\setuptyping [\v!file] [\s!parent=\??typing \v!typing] % we don't want \start..\stop overload
+\setuplinenumbering[\v!file] [\s!parent=\??linenumbering\v!typing]
+
+\setuptyping [\v!buffer][\s!parent=\??typing \v!file] % we don't want \start..\stop overload
+\setuplinenumbering[\v!buffer][\s!parent=\??linenumbering\v!file]
+
+%D The setups for inline verbatim default to:
+
+\setuptype
+ [\c!space=\v!off,
+ \c!lines=\v!no,
+ %\c!color=,
+ \c!style=\tt,
+ %\c!option=\v!normal,
+ \c!page=\v!no,
+ \c!tab=\v!yes,
+ \c!compact=\v!all]
+
+%D Buffers
+
+% [name] [settings] | [name] | [settings]
+
+% \unexpanded\def\typebuffer
+% {\dodoubleempty\buff_verbatim_type_buffer}
+
+\unexpanded\def\typebuffer
+ {\begingroup
+ \let\currenttyping\v!buffer
+ \dodoubleempty\buff_verbatim_type_buffer}
+
+\unexpanded\def\buff_verbatim_type_defined_buffer
+ {\dotripleempty\buff_verbatim_type_defined_buffer_indeed}
+
+\unexpanded\def\typedefinedbuffer[#1]%
+ {\buff_verbatim_type_defined_buffer[\v!buffer][\thedefinedbuffer{#1}]}%
+
+\appendtoks
+ \setuevalue{\e!type\currentbuffer}{\buff_verbatim_type_defined_buffer[\v!buffer][\currentdefinedbuffer]}%
+\to \everydefinebuffer
+
+\appendtoks % \e!buffer
+ \setuevalue{\e!type\currenttyping\v!buffer}{\buff_verbatim_type_buffer_class{\currenttyping}}%
+\to \everydefinetyping
+
+\unexpanded\def\buff_verbatim_type_buffer[#1][#2]%
+ {\ifsecondargument
+ \setupcurrenttyping[#2]%
+ \processcommalist[#1]{\buff_verbatim_type_buffer_indeed\currenttyping}% [name] [settings]
+ \orelse\iffirstargument
+ \ifcondition\validassignment{#1}%
+ \setupcurrenttyping[#1]%
+ \buff_verbatim_type_buffer_indeed\currenttyping\empty% [settings]
+ \else
+ \processcommalist[#1]{\buff_verbatim_type_buffer_indeed\currenttyping}% [name]
+ \fi
+ \else
+ \buff_verbatim_type_buffer_indeed\currenttyping\empty% []
+ \fi
+ \endgroup
+ \dorechecknextindentation}
+
+\unexpanded\def\buff_verbatim_type_buffer_class#1%
+ {\begingroup
+ \edef\currenttyping{#1}%
+ \dodoubleempty\buff_verbatim_type_buffer}
+
+\unexpanded\def\buff_verbatim_type_defined_buffer_indeed[#1][#2][#3]% category name settings
+ {\begingroup
+ \ifthirdargument
+ \setuptyping[#1][#3]%
+ \fi
+ \buff_verbatim_type_buffer_indeed{#1}{#2}%
+ \endgroup}
+
+\unexpanded\def\buff_verbatim_type_buffer_indeed#1#2% category name
+ {\edef\currenttyping{#1}%
+ \typingparameter\c!before
+ \startpacked[\v!blank]
+ \buff_verbatim_setup_line_numbering
+ \buff_verbatim_initialize_typing_one
+ \buff_verbatim_initialize_typing_two
+ \dostarttaggedchained\t!verbatimblock{#1}\??typing
+ \beginofverbatimlines
+ \dostarttagged\t!verbatimlines\empty
+ \clf_typebuffer
+ name {#2}%
+ strip {\typingparameter\c!strip}%
+ range {\typingparameter\c!range}%
+ regime {\currentregime}%
+ tab {\typingparameter\c!tab}%
+ method {\p_buff_option}%
+ escape {\typingparameter\c!escape}%
+ nature {display}%
+ \relax
+ \dostoptagged
+ \endofverbatimlines
+ \dostoptagged
+ \stoppacked
+ \typingparameter\c!after
+ \dorechecknextindentation}
+
+\unexpanded\def\typeinlinebuffer
+ {\dontleavehmode
+ \begingroup
+ \let\buff_verbatim_type_buffer_indeed\buff_verbatim_type_buffer_indeed_inline
+ \let\setupcurrenttyping\setupcurrenttype % a terrible hack but it saves code
+ \let\currenttype\empty
+ \dodoubleempty\buff_verbatim_type_buffer}
+
+\unexpanded\def\buff_verbatim_type_buffer_indeed_inline#1#2% category name
+ {\edef\currenttype{#1}%
+ \buff_verbatim_initialize_type_one
+ \dostarttaggedchained\t!verbatim\currenttype\??type
+ \clf_typebuffer
+ name {#2}%
+ strip {\v!yes}%
+ regime {\currentregime}%
+ method {\p_buff_option}%
+ nature {inline}% is default anyway
+ \relax
+ \dostoptagged}
+
+% get : before/after of buffer
+% typing : before/after of typing
+% process : no before/after (special case anyway)
+
+% the next one is obsolete (bad name and used nowhere) so if it stays
+% the name will change
+
+\unexpanded\def\processbuffer
+ {\writestatus{nota bene}{\string\processbuffer\space is obsolete}%
+ \dodoubleempty\buff_verbatim_process}
+
+\def\buff_verbatim_process[#1][#2]%
+ {\begingroup
+ \ifsecondargument
+ \setuptyping[\v!buffer][#2]%
+ \processcommalist[#1]{\buff_verbatim_process_indeed\v!buffer}% [name] [settings]
+ \orelse\iffirstargument
+ \ifcondition\validassignment{#1}%
+ \setuptyping[\v!buffer][#1]%
+ \buff_verbatim_process_indeed\v!buffer\empty% [settings]
+ \else
+ \processcommalist[#1]{\buff_verbatim_process_indeed\v!buffer}% [name]
+ \fi
+ \else
+ \buff_verbatim_process_indeed\v!buffer\empty% []
+ \fi
+ \endgroup}
+
+\def\buff_verbatim_process_indeed#1#2%
+ {\edef\currenttyping{#1}%
+ \clf_processbuffer
+ name {#2}%
+ strip {\typingparameter\c!strip}%
+ tab {\typingparameter\c!tab}%
+ % method {\p_buff_option}%
+ nature {direct}%
+ \relax}
+
+% so far for obsolete
+
+% line numbering, keep broken lines together
+
+\newcount\nofverbatimlines
+
+\unexpanded\def\buff_verbatim_begin_of_line
+ {\ifconditional\verbatimnumberinglines
+ \global\advance\nofverbatimlines\plusone
+ \attribute\verbatimlineattribute\nofverbatimlines
+ \fi
+ \noindent
+ \buff_verbatim_set_line_margin
+ \the\everyline % maybe also after starttagged
+ \strut % after starttagged, else break !
+ \dostarttagged\t!verbatimline\empty
+ }
+
+\unexpanded\def\buff_verbatim_end_of_line
+ {\dostoptagged
+ \obeyedline % still needed?
+ \par
+ \ifconditional\verbatimnumberinglines
+ \attribute\verbatimlineattribute\attributeunsetvalue
+ \fi}
+
+\unexpanded\def\buff_verbatim_empty_line
+ {\dostoptagged
+ \ifconditional\verbatimnumberinglines
+ \par\strut\par % this will be an option where we use a signal instead of a strut
+ \else
+ \blank[\typingparameter\c!blank]%
+ \fi
+ \dostarttagged\t!verbatimlines\empty}
+
+% hooks:
+
+\newcount \c_buff_verbatim_noflines
+\newcount \c_buff_verbatim_current
+\newconditional\c_buff_optimize_linebreaks
+
+ \def\doverbatimspace {\obeyedspace}
+
+\unexpanded\def\doinlineverbatimstart {}
+\unexpanded\def\doinlineverbatimstop {}
+\unexpanded\def\doinlineverbatimbeginline {}
+\unexpanded\def\doinlineverbatimnewline {\obeyedspace}
+\unexpanded\def\doinlineverbatimemptyline {\obeyedspace}
+
+\unexpanded\def\dodisplayverbatimstart {\advance\c_buff_verbatim_current\plusone
+ \buff_verbatim_begin_of_line}
+\unexpanded\def\dodisplayverbatimstop {\buff_verbatim_end_of_line}
+\unexpanded\def\dodisplayverbatimbeginline{\advance\c_buff_verbatim_current\plusone
+ \buff_verbatim_begin_of_line}
+\unexpanded\def\dodisplayverbatimnewline {\buff_verbatim_end_of_line
+ \par
+ \ifconditional\c_buff_optimize_linebreaks
+ \buff_verbatim_inject_breaks
+ \fi}
+\unexpanded\def\dodisplayverbatimemptyline{\buff_verbatim_empty_line}
+
+\unexpanded\def\buff_verbatim_inject_breaks
+ {\ifnum\c_buff_verbatim_current=\plusone
+ \nobreak
+ \orelse\ifnum\c_buff_verbatim_noflines=\plusthree
+ \nobreak
+ \orelse\ifnum\c_buff_verbatim_current=\numexpr\c_buff_verbatim_noflines-\plusone\relax
+ \nobreak
+ \fi}
+
+\unexpanded\def\dodisplayverbatiminitialize#1%
+ {\forgetparindent % maybe more
+ \c_buff_verbatim_noflines#1\relax
+ \c_buff_verbatim_current\zerocount}
+
+\loadmarkfile{buff-imp-default} % preloaded as otherwise spurious spaces inline due to loading
+\loadmarkfile{buff-imp-nested} % preloaded as otherwise spurious spaces inline due to loading
+\loadmarkfile{buff-imp-escaped} % for completeness
+
+%D To be considered:
+
+% \installcorenamespace{visualizer}
+%
+% \installcommandhandler \??visualizer {visualizer} \??visualizer
+%
+% \appendtoks
+% \setuevalue{\currentvisualizer}{\buff_verbatim_visualize{\currentvisualizer}}%
+% \to \everydefinevisualizer
+%
+% \unexpanded\def\buff_verbatim_visualize#1%
+% {\bgroup
+% \def\currentvisualizer{#1}%
+% \usevisualizerstyleandcolor\c!style\c!color
+% \let\next}
+
+\appendtoks
+ %def\type#1{\letterbackslash\checkedstrippedcsname#1}% or maybe detokenize
+ \def\type#1{\detokenize\expandafter{\csstring#1}}% or maybe detokenize
+ \def\tex #1{\letterbackslash#1}%
+\to \everysimplifycommands
+
+\stopcontextdefinitioncode
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/catc-sym.mkiv b/Master/texmf-dist/tex/context/base/mkiv/catc-sym.mkiv
index ae12532720d..5cda010fe38 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/catc-sym.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/catc-sym.mkiv
@@ -55,6 +55,20 @@
.egroup
+\bgroup
+
+\catcode`_=\lettercatcode
+
+%xdef\_n_u_l_{\expandafter\string\Uchar1} % nul(l)
+%xdef\_s_o_h_{\expandafter\string\Uchar1} % start of header ^^^^0001
+\xdef\_s_t_x_{\expandafter\string\Uchar2} % start of text ^^^^0002
+\xdef\_e_t_x_{\expandafter\string\Uchar3} % end of text ^^^^0003
+\xdef\_e_o_t_{\expandafter\string\Uchar4} % end of transmission ^^^^0004
+%xdef\_e_n_q_{\expandafter\string\Uchar5} % enquiry
+%xdef\_a_c_k_{\expandafter\string\Uchar6} % aknowledgement
+
+\egroup
+
%D \macros
%D {uncatcodespecials,setnaturalcatcodes,setnormalcatcodes,
%D uncatcodecharacters,uncatcodeallcharacters,
diff --git a/Master/texmf-dist/tex/context/base/mkiv/char-def.lua b/Master/texmf-dist/tex/context/base/mkiv/char-def.lua
index c17400a7942..953d33f4a0e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/char-def.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/char-def.lua
@@ -26,6 +26,11 @@ local variants_emoji={
[0xFE0F]="emoji style",
}
+local variants_forms={
+ [0xFE00]="corner-justified form",
+ [0xFE01]="centered form",
+}
+
characters = characters or { }
characters.data={
@@ -22001,7 +22006,7 @@ characters.data={
category="mn",
description="BENGALI SIGN CANDRABINDU",
direction="nsm",
- indic="o",
+ indic="m",
indicorder="ap",
linebreak="cm",
unicodeslot=0x981,
@@ -22469,7 +22474,7 @@ characters.data={
category="mc",
description="BENGALI VOWEL SIGN II",
direction="l",
- indic="d",
+ indic="o",
indicmark="r",
indicorder="ap",
linebreak="cm",
@@ -22525,7 +22530,7 @@ characters.data={
description="BENGALI VOWEL SIGN E",
direction="l",
indic="d",
- indicmark="r",
+ indicmark="l",
indicorder="bh",
linebreak="cm",
unicodeslot=0x9C7,
@@ -22536,7 +22541,7 @@ characters.data={
description="BENGALI VOWEL SIGN AI",
direction="l",
indic="d",
- indicmark="r",
+ indicmark="l",
indicorder="bh",
linebreak="cm",
unicodeslot=0x9C8,
@@ -22546,7 +22551,8 @@ characters.data={
category="mc",
description="BENGALI VOWEL SIGN O",
direction="l",
- indic="s",
+ indic="d",
+ indicmark="s",
linebreak="cm",
specials={ "char", 0x9C7, 0x9BE },
unicodeslot=0x9CB,
@@ -22556,7 +22562,8 @@ characters.data={
category="mc",
description="BENGALI VOWEL SIGN AU",
direction="l",
- indic="s",
+ indic="d",
+ indicmark="s",
linebreak="cm",
specials={ "char", 0x9C7, 0x9D7 },
unicodeslot=0x9CC,
@@ -22756,6 +22763,7 @@ characters.data={
description="BENGALI LETTER RA WITH MIDDLE DIAGONAL",
direction="l",
indic="o",
+ indicclass="ra",
indicorder="as",
linebreak="al",
shcode=0x9B0,
@@ -23648,6 +23656,7 @@ characters.data={
description="GUJARATI SIGN ANUSVARA",
direction="nsm",
indic="o",
+ indicmark="t",
linebreak="cm",
unicodeslot=0xA82,
},
@@ -24016,6 +24025,7 @@ characters.data={
description="GUJARATI LETTER YA",
direction="l",
indic="c",
+ indicorder="ap",
linebreak="al",
unicodeslot=0xAAF,
},
@@ -24972,7 +24982,7 @@ characters.data={
description="ORIYA VOWEL SIGN AI",
direction="l",
indic="d",
- indicmark="l",
+ indicmark="s",
linebreak="cm",
specials={ "char", 0xB47, 0xB56 },
unicodeslot=0xB48,
@@ -26389,7 +26399,7 @@ characters.data={
description="TELUGU VOWEL SIGN AI",
direction="nsm",
indic="d",
- indicmark="t",
+ indicmark="s",
linebreak="cm",
specials={ "char", 0xC46, 0xC56 },
unicodeslot=0xC48,
@@ -26593,6 +26603,13 @@ characters.data={
linebreak="nu",
unicodeslot=0xC6F,
},
+ [0xC77]={
+ category="po",
+ description="TELUGU SIGN SIDDHAM",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0xC77,
+ },
[0xC78]={
category="no",
description="TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR",
@@ -27134,7 +27151,7 @@ characters.data={
description="KANNADA VOWEL SIGN II",
direction="l",
indic="d",
- indicmark="r",
+ indicmark="s",
linebreak="cm",
specials={ "char", 0xCBF, 0xCD5 },
unicodeslot=0xCC0,
@@ -27194,7 +27211,7 @@ characters.data={
description="KANNADA VOWEL SIGN EE",
direction="l",
indic="d",
- indicmark="r",
+ indicmark="s",
linebreak="cm",
specials={ "char", 0xCC6, 0xCD5 },
unicodeslot=0xCC7,
@@ -27204,7 +27221,7 @@ characters.data={
description="KANNADA VOWEL SIGN AI",
direction="l",
indic="d",
- indicmark="r",
+ indicmark="s",
linebreak="cm",
specials={ "char", 0xCC6, 0xCD6 },
unicodeslot=0xCC8,
@@ -27214,7 +27231,7 @@ characters.data={
description="KANNADA VOWEL SIGN O",
direction="l",
indic="d",
- indicmark="r",
+ indicmark="s",
linebreak="cm",
specials={ "char", 0xCC6, 0xCC2 },
unicodeslot=0xCCA,
@@ -27224,7 +27241,7 @@ characters.data={
description="KANNADA VOWEL SIGN OO",
direction="l",
indic="d",
- indicmark="r",
+ indicmark="s",
linebreak="cm",
specials={ "char", 0xCCA, 0xCD5 },
unicodeslot=0xCCB,
@@ -27244,7 +27261,7 @@ characters.data={
combining=0x9,
description="KANNADA SIGN VIRAMA",
direction="nsm",
- indic="s",
+ indic="o",
indicclass="halant",
linebreak="cm",
unicodeslot=0xCCD,
@@ -27253,7 +27270,8 @@ characters.data={
category="mc",
description="KANNADA LENGTH MARK",
direction="l",
- indic="o",
+ indic="d",
+ indicmark="r",
indicorder="as",
linebreak="cm",
unicodeslot=0xCD5,
@@ -27262,7 +27280,8 @@ characters.data={
category="mc",
description="KANNADA AI LENGTH MARK",
direction="l",
- indic="o",
+ indic="d",
+ indicmark="b",
indicorder="as",
linebreak="cm",
unicodeslot=0xCD6,
@@ -28017,7 +28036,7 @@ characters.data={
combining=0x9,
description="MALAYALAM SIGN VIRAMA",
direction="nsm",
- indic="s",
+ indic="o",
indicclass="halant",
linebreak="cm",
synonyms={ "malayalam chandrakkala", "malayalam vowel half-u" },
@@ -29741,6 +29760,13 @@ characters.data={
linebreak="sa",
unicodeslot=0xE84,
},
+ [0xE86]={
+ category="lo",
+ description="LAO LETTER PALI GHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xE86,
+ },
[0xE87]={
category="lo",
description="LAO LETTER NGO",
@@ -29755,6 +29781,13 @@ characters.data={
linebreak="sa",
unicodeslot=0xE88,
},
+ [0xE89]={
+ category="lo",
+ description="LAO LETTER PALI CHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xE89,
+ },
[0xE8A]={
category="lo",
description="LAO LETTER SO TAM",
@@ -29762,6 +29795,13 @@ characters.data={
linebreak="sa",
unicodeslot=0xE8A,
},
+ [0xE8C]={
+ category="lo",
+ description="LAO LETTER PALI JHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xE8C,
+ },
[0xE8D]={
category="lo",
description="LAO LETTER NYO",
@@ -29769,6 +29809,48 @@ characters.data={
linebreak="sa",
unicodeslot=0xE8D,
},
+ [0xE8E]={
+ category="lo",
+ description="LAO LETTER PALI NYA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xE8E,
+ },
+ [0xE8F]={
+ category="lo",
+ description="LAO LETTER PALI TTA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xE8F,
+ },
+ [0xE90]={
+ category="lo",
+ description="LAO LETTER PALI TTHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xE90,
+ },
+ [0xE91]={
+ category="lo",
+ description="LAO LETTER PALI DDA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xE91,
+ },
+ [0xE92]={
+ category="lo",
+ description="LAO LETTER PALI DDHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xE92,
+ },
+ [0xE93]={
+ category="lo",
+ description="LAO LETTER PALI NNA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xE93,
+ },
[0xE94]={
category="lo",
description="LAO LETTER DO",
@@ -29797,6 +29879,13 @@ characters.data={
linebreak="sa",
unicodeslot=0xE97,
},
+ [0xE98]={
+ category="lo",
+ description="LAO LETTER PALI DHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xE98,
+ },
[0xE99]={
category="lo",
description="LAO LETTER NO",
@@ -29846,6 +29935,13 @@ characters.data={
linebreak="sa",
unicodeslot=0xE9F,
},
+ [0xEA0]={
+ category="lo",
+ description="LAO LETTER PALI BHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xEA0,
+ },
[0xEA1]={
category="lo",
description="LAO LETTER MO",
@@ -29881,6 +29977,20 @@ characters.data={
linebreak="sa",
unicodeslot=0xEA7,
},
+ [0xEA8]={
+ category="lo",
+ description="LAO LETTER SANSKRIT SHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xEA8,
+ },
+ [0xEA9]={
+ category="lo",
+ description="LAO LETTER SANSKRIT SSA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xEA9,
+ },
[0xEAA]={
category="lo",
description="LAO LETTER SO SUNG",
@@ -29895,6 +30005,13 @@ characters.data={
linebreak="sa",
unicodeslot=0xEAB,
},
+ [0xEAC]={
+ category="lo",
+ description="LAO LETTER PALI LLA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0xEAC,
+ },
[0xEAD]={
category="lo",
description="LAO LETTER O",
@@ -29989,6 +30106,14 @@ characters.data={
linebreak="sa",
unicodeslot=0xEB9,
},
+ [0xEBA]={
+ category="mn",
+ combining=0x9,
+ description="LAO SIGN PALI VIRAMA",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0xEBA,
+ },
[0xEBB]={
category="mn",
description="LAO VOWEL SIGN MAI KON",
@@ -53570,14 +53695,14 @@ characters.data={
category="mc",
description="VEDIC SIGN ARDHAVISARGA",
direction="l",
- linebreak="cm",
+ linebreak="al",
unicodeslot=0x1CF2,
},
[0x1CF3]={
category="mc",
description="VEDIC SIGN ROTATED ARDHAVISARGA",
direction="l",
- linebreak="cm",
+ linebreak="al",
unicodeslot=0x1CF3,
},
[0x1CF4]={
@@ -53625,6 +53750,13 @@ characters.data={
linebreak="cm",
unicodeslot=0x1CF9,
},
+ [0x1CFA]={
+ category="lo",
+ description="VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1CFA,
+ },
[0x1D00]={
category="ll",
description="LATIN LETTER SMALL CAPITAL A",
@@ -85787,6 +85919,13 @@ characters.data={
linebreak="al",
unicodeslot=0x2BC8,
},
+ [0x2BC9]={
+ category="so",
+ description="NEPTUNE FORM TWO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BC9,
+ },
[0x2BCA]={
category="so",
description="TOP HALF BLACK CIRCLE",
@@ -86159,6 +86298,13 @@ characters.data={
mirror=0x221F,
unicodeslot=0x2BFE,
},
+ [0x2BFF]={
+ category="so",
+ description="HELLSCHREIBER PAUSE SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2BFF,
+ },
[0x2C00]={
category="lu",
description="GLAGOLITIC CAPITAL LETTER AZU",
@@ -90247,6 +90393,13 @@ characters.data={
linebreak="ba",
unicodeslot=0x2E4E,
},
+ [0x2E4F]={
+ category="po",
+ description="CORNISH VERSE DIVIDER",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E4F,
+ },
[0x2E80]={
category="so",
cjkwd="w",
@@ -93210,6 +93363,7 @@ characters.data={
direction="on",
linebreak="cl",
unicodeslot=0x3001,
+ variants=variants_forms,
},
[0x3002]={
adobename="ideographicperiod",
@@ -93219,6 +93373,7 @@ characters.data={
direction="on",
linebreak="cl",
unicodeslot=0x3002,
+ variants=variants_forms,
},
[0x3003]={
adobename="dittomark",
@@ -100600,6 +100755,15 @@ characters.data={
specials={ "circle", 0x30F2 },
unicodeslot=0x32FE,
},
+ [0x32FF]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE ERA NAME REIWA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x4EE4, 0x548C },
+ unicodeslot=0x32FF,
+ },
[0x3300]={
adobename="apaatosquare",
category="so",
@@ -118280,6 +118444,83 @@ characters.data={
linebreak="al",
unicodeslot=0xA7B9,
},
+ [0xA7BA]={
+ category="lu",
+ description="LATIN CAPITAL LETTER GLOTTAL A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7BA,
+ },
+ [0xA7BB]={
+ category="ll",
+ description="LATIN SMALL LETTER GLOTTAL A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7BB,
+ },
+ [0xA7BC]={
+ category="lu",
+ description="LATIN CAPITAL LETTER GLOTTAL I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7BC,
+ },
+ [0xA7BD]={
+ category="ll",
+ description="LATIN SMALL LETTER GLOTTAL I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7BD,
+ },
+ [0xA7BE]={
+ category="lu",
+ description="LATIN CAPITAL LETTER GLOTTAL U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7BE,
+ },
+ [0xA7BF]={
+ category="ll",
+ description="LATIN SMALL LETTER GLOTTAL U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7BF,
+ },
+ [0xA7C2]={
+ category="lu",
+ description="LATIN CAPITAL LETTER ANGLICANA W",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7C2,
+ },
+ [0xA7C3]={
+ category="ll",
+ description="LATIN SMALL LETTER ANGLICANA W",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7C3,
+ },
+ [0xA7C4]={
+ category="lu",
+ description="LATIN CAPITAL LETTER C WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7C4,
+ },
+ [0xA7C5]={
+ category="lu",
+ description="LATIN CAPITAL LETTER S WITH HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7C5,
+ },
+ [0xA7C6]={
+ category="lu",
+ description="LATIN CAPITAL LETTER Z WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA7C6,
+ },
[0xA7F7]={
category="lo",
description="LATIN EPIGRAPHIC LETTER SIDEWAYS I",
@@ -119926,7 +120167,7 @@ characters.data={
combining=0xE6,
description="COMBINING DEVANAGARI LETTER VI",
direction="nsm",
- indic="m",
+ indic="o",
indicmark="t",
linebreak="cm",
unicodeslot=0xA8F0,
@@ -121301,7 +121542,7 @@ characters.data={
[0xA9BD]={
category="mc",
description="JAVANESE CONSONANT SIGN KERET",
- direction="l",
+ direction="nsm",
linebreak="cm",
unicodeslot=0xA9BD,
},
@@ -123911,6 +124152,20 @@ characters.data={
linebreak="al",
unicodeslot=0xAB65,
},
+ [0xAB66]={
+ category="ll",
+ description="LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB66,
+ },
+ [0xAB67]={
+ category="ll",
+ description="LATIN SMALL LETTER TS DIGRAPH WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xAB67,
+ },
[0xAB70]={
category="ll",
description="CHEROKEE SMALL LETTER A",
@@ -137206,6 +137461,7 @@ characters.data={
linebreak="ex",
specials={ "wide", 0x21 },
unicodeslot=0xFF01,
+ variants=variants_forms,
},
[0xFF02]={
adobename="quotedblmonospace",
@@ -137320,6 +137576,7 @@ characters.data={
linebreak="cl",
specials={ "wide", 0x2C },
unicodeslot=0xFF0C,
+ variants=variants_forms,
},
[0xFF0D]={
adobename="hyphenmonospace",
@@ -137340,6 +137597,7 @@ characters.data={
linebreak="cl",
specials={ "wide", 0x2E },
unicodeslot=0xFF0E,
+ variants=variants_forms,
},
[0xFF0F]={
adobename="slashmonospace",
@@ -137463,6 +137721,7 @@ characters.data={
linebreak="ns",
specials={ "wide", 0x3A },
unicodeslot=0xFF1A,
+ variants=variants_forms,
},
[0xFF1B]={
adobename="semicolonmonospace",
@@ -137473,6 +137732,7 @@ characters.data={
linebreak="ns",
specials={ "wide", 0x3B },
unicodeslot=0xFF1B,
+ variants=variants_forms,
},
[0xFF1C]={
adobename="lessmonospace",
@@ -137517,6 +137777,7 @@ characters.data={
linebreak="ex",
specials={ "wide", 0x3F },
unicodeslot=0xFF1F,
+ variants=variants_forms,
},
[0xFF20]={
adobename="atmonospace",
@@ -156690,6 +156951,167 @@ characters.data={
linebreak="al",
unicodeslot=0x10F59,
},
+ [0x10FE0]={
+ category="lo",
+ description="ELYMAIC LETTER ALEPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FE0,
+ },
+ [0x10FE1]={
+ category="lo",
+ description="ELYMAIC LETTER BETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FE1,
+ },
+ [0x10FE2]={
+ category="lo",
+ description="ELYMAIC LETTER GIMEL",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FE2,
+ },
+ [0x10FE3]={
+ category="lo",
+ description="ELYMAIC LETTER DALETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FE3,
+ },
+ [0x10FE4]={
+ category="lo",
+ description="ELYMAIC LETTER HE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FE4,
+ },
+ [0x10FE5]={
+ category="lo",
+ description="ELYMAIC LETTER WAW",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FE5,
+ },
+ [0x10FE6]={
+ category="lo",
+ description="ELYMAIC LETTER ZAYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FE6,
+ },
+ [0x10FE7]={
+ category="lo",
+ description="ELYMAIC LETTER HETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FE7,
+ },
+ [0x10FE8]={
+ category="lo",
+ description="ELYMAIC LETTER TETH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FE8,
+ },
+ [0x10FE9]={
+ category="lo",
+ description="ELYMAIC LETTER YODH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FE9,
+ },
+ [0x10FEA]={
+ category="lo",
+ description="ELYMAIC LETTER KAPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FEA,
+ },
+ [0x10FEB]={
+ category="lo",
+ description="ELYMAIC LETTER LAMEDH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FEB,
+ },
+ [0x10FEC]={
+ category="lo",
+ description="ELYMAIC LETTER MEM",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FEC,
+ },
+ [0x10FED]={
+ category="lo",
+ description="ELYMAIC LETTER NUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FED,
+ },
+ [0x10FEE]={
+ category="lo",
+ description="ELYMAIC LETTER SAMEKH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FEE,
+ },
+ [0x10FEF]={
+ category="lo",
+ description="ELYMAIC LETTER AYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FEF,
+ },
+ [0x10FF0]={
+ category="lo",
+ description="ELYMAIC LETTER PE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FF0,
+ },
+ [0x10FF1]={
+ category="lo",
+ description="ELYMAIC LETTER SADHE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FF1,
+ },
+ [0x10FF2]={
+ category="lo",
+ description="ELYMAIC LETTER QOPH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FF2,
+ },
+ [0x10FF3]={
+ category="lo",
+ description="ELYMAIC LETTER RESH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FF3,
+ },
+ [0x10FF4]={
+ category="lo",
+ description="ELYMAIC LETTER SHIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FF4,
+ },
+ [0x10FF5]={
+ category="lo",
+ description="ELYMAIC LETTER TAW",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FF5,
+ },
+ [0x10FF6]={
+ category="lo",
+ description="ELYMAIC LIGATURE ZAYIN-YODH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10FF6,
+ },
[0x11000]={
category="mc",
description="BRAHMI SIGN CANDRABINDU",
@@ -162207,6 +162629,13 @@ characters.data={
linebreak="cm",
unicodeslot=0x1145E,
},
+ [0x1145F]={
+ category="lo",
+ description="NEWA LETTER VEDIC ANUSVARA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1145F,
+ },
[0x11480]={
category="lo",
description="TIRHUTA ANJI",
@@ -164473,6 +164902,13 @@ characters.data={
linebreak="cm",
unicodeslot=0x116B7,
},
+ [0x116B8]={
+ category="lo",
+ description="TAKRI LETTER ARCHAIC KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x116B8,
+ },
[0x116C0]={
category="nd",
description="TAKRI DIGIT ZERO",
@@ -165960,6 +166396,462 @@ characters.data={
linebreak="al",
unicodeslot=0x118FF,
},
+ [0x119A0]={
+ category="lo",
+ description="NANDINAGARI LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119A0,
+ },
+ [0x119A1]={
+ category="lo",
+ description="NANDINAGARI LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119A1,
+ },
+ [0x119A2]={
+ category="lo",
+ description="NANDINAGARI LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119A2,
+ },
+ [0x119A3]={
+ category="lo",
+ description="NANDINAGARI LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119A3,
+ },
+ [0x119A4]={
+ category="lo",
+ description="NANDINAGARI LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119A4,
+ },
+ [0x119A5]={
+ category="lo",
+ description="NANDINAGARI LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119A5,
+ },
+ [0x119A6]={
+ category="lo",
+ description="NANDINAGARI LETTER VOCALIC R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119A6,
+ },
+ [0x119A7]={
+ category="lo",
+ description="NANDINAGARI LETTER VOCALIC RR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119A7,
+ },
+ [0x119AA]={
+ category="lo",
+ description="NANDINAGARI LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119AA,
+ },
+ [0x119AB]={
+ category="lo",
+ description="NANDINAGARI LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119AB,
+ },
+ [0x119AC]={
+ category="lo",
+ description="NANDINAGARI LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119AC,
+ },
+ [0x119AD]={
+ category="lo",
+ description="NANDINAGARI LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119AD,
+ },
+ [0x119AE]={
+ category="lo",
+ description="NANDINAGARI LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119AE,
+ },
+ [0x119AF]={
+ category="lo",
+ description="NANDINAGARI LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119AF,
+ },
+ [0x119B0]={
+ category="lo",
+ description="NANDINAGARI LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119B0,
+ },
+ [0x119B1]={
+ category="lo",
+ description="NANDINAGARI LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119B1,
+ },
+ [0x119B2]={
+ category="lo",
+ description="NANDINAGARI LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119B2,
+ },
+ [0x119B3]={
+ category="lo",
+ description="NANDINAGARI LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119B3,
+ },
+ [0x119B4]={
+ category="lo",
+ description="NANDINAGARI LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119B4,
+ },
+ [0x119B5]={
+ category="lo",
+ description="NANDINAGARI LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119B5,
+ },
+ [0x119B6]={
+ category="lo",
+ description="NANDINAGARI LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119B6,
+ },
+ [0x119B7]={
+ category="lo",
+ description="NANDINAGARI LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119B7,
+ },
+ [0x119B8]={
+ category="lo",
+ description="NANDINAGARI LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119B8,
+ },
+ [0x119B9]={
+ category="lo",
+ description="NANDINAGARI LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119B9,
+ },
+ [0x119BA]={
+ category="lo",
+ description="NANDINAGARI LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119BA,
+ },
+ [0x119BB]={
+ category="lo",
+ description="NANDINAGARI LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119BB,
+ },
+ [0x119BC]={
+ category="lo",
+ description="NANDINAGARI LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119BC,
+ },
+ [0x119BD]={
+ category="lo",
+ description="NANDINAGARI LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119BD,
+ },
+ [0x119BE]={
+ category="lo",
+ description="NANDINAGARI LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119BE,
+ },
+ [0x119BF]={
+ category="lo",
+ description="NANDINAGARI LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119BF,
+ },
+ [0x119C0]={
+ category="lo",
+ description="NANDINAGARI LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119C0,
+ },
+ [0x119C1]={
+ category="lo",
+ description="NANDINAGARI LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119C1,
+ },
+ [0x119C2]={
+ category="lo",
+ description="NANDINAGARI LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119C2,
+ },
+ [0x119C3]={
+ category="lo",
+ description="NANDINAGARI LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119C3,
+ },
+ [0x119C4]={
+ category="lo",
+ description="NANDINAGARI LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119C4,
+ },
+ [0x119C5]={
+ category="lo",
+ description="NANDINAGARI LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119C5,
+ },
+ [0x119C6]={
+ category="lo",
+ description="NANDINAGARI LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119C6,
+ },
+ [0x119C7]={
+ category="lo",
+ description="NANDINAGARI LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119C7,
+ },
+ [0x119C8]={
+ category="lo",
+ description="NANDINAGARI LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119C8,
+ },
+ [0x119C9]={
+ category="lo",
+ description="NANDINAGARI LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119C9,
+ },
+ [0x119CA]={
+ category="lo",
+ description="NANDINAGARI LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119CA,
+ },
+ [0x119CB]={
+ category="lo",
+ description="NANDINAGARI LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119CB,
+ },
+ [0x119CC]={
+ category="lo",
+ description="NANDINAGARI LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119CC,
+ },
+ [0x119CD]={
+ category="lo",
+ description="NANDINAGARI LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119CD,
+ },
+ [0x119CE]={
+ category="lo",
+ description="NANDINAGARI LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119CE,
+ },
+ [0x119CF]={
+ category="lo",
+ description="NANDINAGARI LETTER LLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119CF,
+ },
+ [0x119D0]={
+ category="lo",
+ description="NANDINAGARI LETTER RRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119D0,
+ },
+ [0x119D1]={
+ category="mc",
+ description="NANDINAGARI VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x119D1,
+ },
+ [0x119D2]={
+ category="mc",
+ description="NANDINAGARI VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x119D2,
+ },
+ [0x119D3]={
+ category="mc",
+ description="NANDINAGARI VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x119D3,
+ },
+ [0x119D4]={
+ category="mn",
+ description="NANDINAGARI VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x119D4,
+ },
+ [0x119D5]={
+ category="mn",
+ description="NANDINAGARI VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x119D5,
+ },
+ [0x119D6]={
+ category="mn",
+ description="NANDINAGARI VOWEL SIGN VOCALIC R",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x119D6,
+ },
+ [0x119D7]={
+ category="mn",
+ description="NANDINAGARI VOWEL SIGN VOCALIC RR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x119D7,
+ },
+ [0x119DA]={
+ category="mn",
+ description="NANDINAGARI VOWEL SIGN E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x119DA,
+ },
+ [0x119DB]={
+ category="mn",
+ description="NANDINAGARI VOWEL SIGN AI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x119DB,
+ },
+ [0x119DC]={
+ category="mc",
+ description="NANDINAGARI VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x119DC,
+ },
+ [0x119DD]={
+ category="mc",
+ description="NANDINAGARI VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x119DD,
+ },
+ [0x119DE]={
+ category="mc",
+ description="NANDINAGARI SIGN ANUSVARA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x119DE,
+ },
+ [0x119DF]={
+ category="mc",
+ description="NANDINAGARI SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x119DF,
+ },
+ [0x119E0]={
+ category="mn",
+ combining=0x9,
+ description="NANDINAGARI SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x119E0,
+ },
+ [0x119E1]={
+ category="lo",
+ description="NANDINAGARI SIGN AVAGRAHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119E1,
+ },
+ [0x119E2]={
+ category="po",
+ description="NANDINAGARI SIGN SIDDHAM",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x119E2,
+ },
+ [0x119E3]={
+ category="lo",
+ description="NANDINAGARI HEADSTROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x119E3,
+ },
+ [0x119E4]={
+ category="mc",
+ description="NANDINAGARI VOWEL SIGN PRISHTHAMATRA E",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x119E4,
+ },
[0x11A00]={
category="lo",
description="ZANABAZAR SQUARE LETTER A",
@@ -166830,6 +167722,20 @@ characters.data={
linebreak="al",
unicodeslot=0x11A83,
},
+ [0x11A84]={
+ category="lo",
+ description="SOYOMBO SIGN JIHVAMULIYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11A84,
+ },
+ [0x11A85]={
+ category="lo",
+ description="SOYOMBO SIGN UPADHMANIYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11A85,
+ },
[0x11A86]={
category="lo",
description="SOYOMBO CLUSTER-INITIAL LETTER RA",
@@ -169734,6 +170640,363 @@ characters.data={
linebreak="al",
unicodeslot=0x11EF8,
},
+ [0x11FC0]={
+ category="no",
+ description="TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FC0,
+ },
+ [0x11FC1]={
+ category="no",
+ description="TAMIL FRACTION ONE ONE-HUNDRED-AND-SIXTIETH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FC1,
+ },
+ [0x11FC2]={
+ category="no",
+ description="TAMIL FRACTION ONE EIGHTIETH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FC2,
+ },
+ [0x11FC3]={
+ category="no",
+ description="TAMIL FRACTION ONE SIXTY-FOURTH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FC3,
+ },
+ [0x11FC4]={
+ category="no",
+ description="TAMIL FRACTION ONE FORTIETH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FC4,
+ },
+ [0x11FC5]={
+ category="no",
+ description="TAMIL FRACTION ONE THIRTY-SECOND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FC5,
+ },
+ [0x11FC6]={
+ category="no",
+ description="TAMIL FRACTION THREE EIGHTIETHS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FC6,
+ },
+ [0x11FC7]={
+ category="no",
+ description="TAMIL FRACTION THREE SIXTY-FOURTHS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FC7,
+ },
+ [0x11FC8]={
+ category="no",
+ description="TAMIL FRACTION ONE TWENTIETH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FC8,
+ },
+ [0x11FC9]={
+ category="no",
+ description="TAMIL FRACTION ONE SIXTEENTH-1",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FC9,
+ },
+ [0x11FCA]={
+ category="no",
+ description="TAMIL FRACTION ONE SIXTEENTH-2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FCA,
+ },
+ [0x11FCB]={
+ category="no",
+ description="TAMIL FRACTION ONE TENTH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FCB,
+ },
+ [0x11FCC]={
+ category="no",
+ description="TAMIL FRACTION ONE EIGHTH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FCC,
+ },
+ [0x11FCD]={
+ category="no",
+ description="TAMIL FRACTION THREE TWENTIETHS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FCD,
+ },
+ [0x11FCE]={
+ category="no",
+ description="TAMIL FRACTION THREE SIXTEENTHS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FCE,
+ },
+ [0x11FCF]={
+ category="no",
+ description="TAMIL FRACTION ONE FIFTH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FCF,
+ },
+ [0x11FD0]={
+ category="no",
+ description="TAMIL FRACTION ONE QUARTER",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FD0,
+ },
+ [0x11FD1]={
+ category="no",
+ description="TAMIL FRACTION ONE HALF-1",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FD1,
+ },
+ [0x11FD2]={
+ category="no",
+ description="TAMIL FRACTION ONE HALF-2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FD2,
+ },
+ [0x11FD3]={
+ category="no",
+ description="TAMIL FRACTION THREE QUARTERS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FD3,
+ },
+ [0x11FD4]={
+ category="no",
+ description="TAMIL FRACTION DOWNSCALING FACTOR KIIZH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x11FD4,
+ },
+ [0x11FD5]={
+ category="so",
+ description="TAMIL SIGN NEL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FD5,
+ },
+ [0x11FD6]={
+ category="so",
+ description="TAMIL SIGN CEVITU",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FD6,
+ },
+ [0x11FD7]={
+ category="so",
+ description="TAMIL SIGN AAZHAAKKU",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FD7,
+ },
+ [0x11FD8]={
+ category="so",
+ description="TAMIL SIGN UZHAKKU",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FD8,
+ },
+ [0x11FD9]={
+ category="so",
+ description="TAMIL SIGN MUUVUZHAKKU",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FD9,
+ },
+ [0x11FDA]={
+ category="so",
+ description="TAMIL SIGN KURUNI",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FDA,
+ },
+ [0x11FDB]={
+ category="so",
+ description="TAMIL SIGN PATHAKKU",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FDB,
+ },
+ [0x11FDC]={
+ category="so",
+ description="TAMIL SIGN MUKKURUNI",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FDC,
+ },
+ [0x11FDD]={
+ category="sc",
+ description="TAMIL SIGN KAACU",
+ direction="et",
+ linebreak="po",
+ unicodeslot=0x11FDD,
+ },
+ [0x11FDE]={
+ category="sc",
+ description="TAMIL SIGN PANAM",
+ direction="et",
+ linebreak="po",
+ unicodeslot=0x11FDE,
+ },
+ [0x11FDF]={
+ category="sc",
+ description="TAMIL SIGN PON",
+ direction="et",
+ linebreak="po",
+ unicodeslot=0x11FDF,
+ },
+ [0x11FE0]={
+ category="sc",
+ description="TAMIL SIGN VARAAKAN",
+ direction="et",
+ linebreak="po",
+ unicodeslot=0x11FE0,
+ },
+ [0x11FE1]={
+ category="so",
+ description="TAMIL SIGN PAARAM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FE1,
+ },
+ [0x11FE2]={
+ category="so",
+ description="TAMIL SIGN KUZHI",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FE2,
+ },
+ [0x11FE3]={
+ category="so",
+ description="TAMIL SIGN VELI",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FE3,
+ },
+ [0x11FE4]={
+ category="so",
+ description="TAMIL WET CULTIVATION SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FE4,
+ },
+ [0x11FE5]={
+ category="so",
+ description="TAMIL DRY CULTIVATION SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FE5,
+ },
+ [0x11FE6]={
+ category="so",
+ description="TAMIL LAND SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FE6,
+ },
+ [0x11FE7]={
+ category="so",
+ description="TAMIL SALT PAN SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FE7,
+ },
+ [0x11FE8]={
+ category="so",
+ description="TAMIL TRADITIONAL CREDIT SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FE8,
+ },
+ [0x11FE9]={
+ category="so",
+ description="TAMIL TRADITIONAL NUMBER SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FE9,
+ },
+ [0x11FEA]={
+ category="so",
+ description="TAMIL CURRENT SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FEA,
+ },
+ [0x11FEB]={
+ category="so",
+ description="TAMIL AND ODD SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FEB,
+ },
+ [0x11FEC]={
+ category="so",
+ description="TAMIL SPENT SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FEC,
+ },
+ [0x11FED]={
+ category="so",
+ description="TAMIL TOTAL SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FED,
+ },
+ [0x11FEE]={
+ category="so",
+ description="TAMIL IN POSSESSION SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FEE,
+ },
+ [0x11FEF]={
+ category="so",
+ description="TAMIL STARTING FROM SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FEF,
+ },
+ [0x11FF0]={
+ category="so",
+ description="TAMIL SIGN MUTHALIYA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FF0,
+ },
+ [0x11FF1]={
+ category="so",
+ description="TAMIL SIGN VAKAIYARAA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x11FF1,
+ },
+ [0x11FFF]={
+ category="po",
+ description="TAMIL PUNCTUATION END OF TEXT",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x11FFF,
+ },
[0x12000]={
category="lo",
description="CUNEIFORM SIGN A",
@@ -185871,6 +187134,69 @@ characters.data={
linebreak="al",
unicodeslot=0x1342E,
},
+ [0x13430]={
+ category="cf",
+ description="EGYPTIAN HIEROGLYPH VERTICAL JOINER",
+ direction="l",
+ linebreak="gl",
+ unicodeslot=0x13430,
+ },
+ [0x13431]={
+ category="cf",
+ description="EGYPTIAN HIEROGLYPH HORIZONTAL JOINER",
+ direction="l",
+ linebreak="gl",
+ unicodeslot=0x13431,
+ },
+ [0x13432]={
+ category="cf",
+ description="EGYPTIAN HIEROGLYPH INSERT AT TOP START",
+ direction="l",
+ linebreak="gl",
+ unicodeslot=0x13432,
+ },
+ [0x13433]={
+ category="cf",
+ description="EGYPTIAN HIEROGLYPH INSERT AT BOTTOM START",
+ direction="l",
+ linebreak="gl",
+ unicodeslot=0x13433,
+ },
+ [0x13434]={
+ category="cf",
+ description="EGYPTIAN HIEROGLYPH INSERT AT TOP END",
+ direction="l",
+ linebreak="gl",
+ unicodeslot=0x13434,
+ },
+ [0x13435]={
+ category="cf",
+ description="EGYPTIAN HIEROGLYPH INSERT AT BOTTOM END",
+ direction="l",
+ linebreak="gl",
+ unicodeslot=0x13435,
+ },
+ [0x13436]={
+ category="cf",
+ description="EGYPTIAN HIEROGLYPH OVERLAY MIDDLE",
+ direction="l",
+ linebreak="gl",
+ unicodeslot=0x13436,
+ },
+ [0x13437]={
+ category="cf",
+ description="EGYPTIAN HIEROGLYPH BEGIN SEGMENT",
+ direction="l",
+ linebreak="op",
+ unicodeslot=0x13437,
+ },
+ [0x13438]={
+ category="cf",
+ description="EGYPTIAN HIEROGLYPH END SEGMENT",
+ direction="l",
+ linebreak="cl",
+ unicodeslot=0x13438,
+ },
[0x14400]={
category="lo",
description="ANATOLIAN HIEROGLYPH A001",
@@ -196509,6 +197835,55 @@ characters.data={
linebreak="al",
unicodeslot=0x16F44,
},
+ [0x16F45]={
+ category="lo",
+ description="MIAO LETTER BRI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F45,
+ },
+ [0x16F46]={
+ category="lo",
+ description="MIAO LETTER SYI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F46,
+ },
+ [0x16F47]={
+ category="lo",
+ description="MIAO LETTER DZYI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F47,
+ },
+ [0x16F48]={
+ category="lo",
+ description="MIAO LETTER TE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F48,
+ },
+ [0x16F49]={
+ category="lo",
+ description="MIAO LETTER TSE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F49,
+ },
+ [0x16F4A]={
+ category="lo",
+ description="MIAO LETTER RTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F4A,
+ },
+ [0x16F4F]={
+ category="mn",
+ description="MIAO SIGN CONSONANT MODIFIER BAR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x16F4F,
+ },
[0x16F50]={
category="lo",
description="MIAO LETTER NASALIZATION",
@@ -196838,6 +198213,69 @@ characters.data={
linebreak="cm",
unicodeslot=0x16F7E,
},
+ [0x16F7F]={
+ category="mc",
+ description="MIAO VOWEL SIGN UOG",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x16F7F,
+ },
+ [0x16F80]={
+ category="mc",
+ description="MIAO VOWEL SIGN YUI",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x16F80,
+ },
+ [0x16F81]={
+ category="mc",
+ description="MIAO VOWEL SIGN OG",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x16F81,
+ },
+ [0x16F82]={
+ category="mc",
+ description="MIAO VOWEL SIGN OER",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x16F82,
+ },
+ [0x16F83]={
+ category="mc",
+ description="MIAO VOWEL SIGN VW",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x16F83,
+ },
+ [0x16F84]={
+ category="mc",
+ description="MIAO VOWEL SIGN IG",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x16F84,
+ },
+ [0x16F85]={
+ category="mc",
+ description="MIAO VOWEL SIGN EA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x16F85,
+ },
+ [0x16F86]={
+ category="mc",
+ description="MIAO VOWEL SIGN IONG",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x16F86,
+ },
+ [0x16F87]={
+ category="mc",
+ description="MIAO VOWEL SIGN UI",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x16F87,
+ },
[0x16F8F]={
category="mn",
description="MIAO TONE RIGHT",
@@ -196973,6 +198411,22 @@ characters.data={
linebreak="ns",
unicodeslot=0x16FE1,
},
+ [0x16FE2]={
+ category="po",
+ cjkwd="w",
+ description="OLD CHINESE HOOK MARK",
+ direction="on",
+ linebreak="ns",
+ unicodeslot=0x16FE2,
+ },
+ [0x16FE3]={
+ category="lm",
+ cjkwd="w",
+ description="OLD CHINESE ITERATION MARK",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x16FE3,
+ },
[0x18800]={
category="lo",
cjkwd="w",
@@ -205309,6 +206763,62 @@ characters.data={
linebreak="id",
unicodeslot=0x1B11E,
},
+ [0x1B150]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL WI",
+ direction="l",
+ linebreak="cj",
+ unicodeslot=0x1B150,
+ },
+ [0x1B151]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL WE",
+ direction="l",
+ linebreak="cj",
+ unicodeslot=0x1B151,
+ },
+ [0x1B152]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL WO",
+ direction="l",
+ linebreak="cj",
+ unicodeslot=0x1B152,
+ },
+ [0x1B164]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL WI",
+ direction="l",
+ linebreak="cj",
+ unicodeslot=0x1B164,
+ },
+ [0x1B165]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL WE",
+ direction="l",
+ linebreak="cj",
+ unicodeslot=0x1B165,
+ },
+ [0x1B166]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL WO",
+ direction="l",
+ linebreak="cj",
+ unicodeslot=0x1B166,
+ },
+ [0x1B167]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL N",
+ direction="l",
+ linebreak="cj",
+ unicodeslot=0x1B167,
+ },
[0x1B170]={
category="lo",
cjkwd="w",
@@ -228068,6 +229578,927 @@ characters.data={
linebreak="cm",
unicodeslot=0x1E02A,
},
+ [0x1E100]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E100,
+ },
+ [0x1E101]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER TSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E101,
+ },
+ [0x1E102]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER NTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E102,
+ },
+ [0x1E103]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E103,
+ },
+ [0x1E104]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E104,
+ },
+ [0x1E105]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E105,
+ },
+ [0x1E106]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER XA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E106,
+ },
+ [0x1E107]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER NKA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E107,
+ },
+ [0x1E108]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E108,
+ },
+ [0x1E109]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E109,
+ },
+ [0x1E10A]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E10A,
+ },
+ [0x1E10B]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E10B,
+ },
+ [0x1E10C]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER NCA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E10C,
+ },
+ [0x1E10D]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER NTSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E10D,
+ },
+ [0x1E10E]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E10E,
+ },
+ [0x1E10F]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E10F,
+ },
+ [0x1E110]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E110,
+ },
+ [0x1E111]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER NRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E111,
+ },
+ [0x1E112]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E112,
+ },
+ [0x1E113]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER NTXA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E113,
+ },
+ [0x1E114]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER TXA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E114,
+ },
+ [0x1E115]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E115,
+ },
+ [0x1E116]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E116,
+ },
+ [0x1E117]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER QA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E117,
+ },
+ [0x1E118]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E118,
+ },
+ [0x1E119]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER NQA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E119,
+ },
+ [0x1E11A]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E11A,
+ },
+ [0x1E11B]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER XYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E11B,
+ },
+ [0x1E11C]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER NPA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E11C,
+ },
+ [0x1E11D]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER DLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E11D,
+ },
+ [0x1E11E]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER NPLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E11E,
+ },
+ [0x1E11F]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER HAH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E11F,
+ },
+ [0x1E120]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER MLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E120,
+ },
+ [0x1E121]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER PLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E121,
+ },
+ [0x1E122]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E122,
+ },
+ [0x1E123]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER RRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E123,
+ },
+ [0x1E124]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E124,
+ },
+ [0x1E125]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E125,
+ },
+ [0x1E126]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E126,
+ },
+ [0x1E127]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E127,
+ },
+ [0x1E128]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E128,
+ },
+ [0x1E129]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E129,
+ },
+ [0x1E12A]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E12A,
+ },
+ [0x1E12B]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E12B,
+ },
+ [0x1E12C]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LETTER W",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E12C,
+ },
+ [0x1E130]={
+ category="mn",
+ combining=0xE6,
+ description="NYIAKENG PUACHUE HMONG TONE-B",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E130,
+ },
+ [0x1E131]={
+ category="mn",
+ combining=0xE6,
+ description="NYIAKENG PUACHUE HMONG TONE-M",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E131,
+ },
+ [0x1E132]={
+ category="mn",
+ combining=0xE6,
+ description="NYIAKENG PUACHUE HMONG TONE-J",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E132,
+ },
+ [0x1E133]={
+ category="mn",
+ combining=0xE6,
+ description="NYIAKENG PUACHUE HMONG TONE-V",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E133,
+ },
+ [0x1E134]={
+ category="mn",
+ combining=0xE6,
+ description="NYIAKENG PUACHUE HMONG TONE-S",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E134,
+ },
+ [0x1E135]={
+ category="mn",
+ combining=0xE6,
+ description="NYIAKENG PUACHUE HMONG TONE-G",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E135,
+ },
+ [0x1E136]={
+ category="mn",
+ combining=0xE6,
+ description="NYIAKENG PUACHUE HMONG TONE-D",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E136,
+ },
+ [0x1E137]={
+ category="lm",
+ description="NYIAKENG PUACHUE HMONG SIGN FOR PERSON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E137,
+ },
+ [0x1E138]={
+ category="lm",
+ description="NYIAKENG PUACHUE HMONG SIGN FOR THING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E138,
+ },
+ [0x1E139]={
+ category="lm",
+ description="NYIAKENG PUACHUE HMONG SIGN FOR LOCATION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E139,
+ },
+ [0x1E13A]={
+ category="lm",
+ description="NYIAKENG PUACHUE HMONG SIGN FOR ANIMAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E13A,
+ },
+ [0x1E13B]={
+ category="lm",
+ description="NYIAKENG PUACHUE HMONG SIGN FOR INVERTEBRATE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E13B,
+ },
+ [0x1E13C]={
+ category="lm",
+ description="NYIAKENG PUACHUE HMONG SIGN XW XW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E13C,
+ },
+ [0x1E13D]={
+ category="lm",
+ description="NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E13D,
+ },
+ [0x1E140]={
+ category="nd",
+ description="NYIAKENG PUACHUE HMONG DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E140,
+ },
+ [0x1E141]={
+ category="nd",
+ description="NYIAKENG PUACHUE HMONG DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E141,
+ },
+ [0x1E142]={
+ category="nd",
+ description="NYIAKENG PUACHUE HMONG DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E142,
+ },
+ [0x1E143]={
+ category="nd",
+ description="NYIAKENG PUACHUE HMONG DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E143,
+ },
+ [0x1E144]={
+ category="nd",
+ description="NYIAKENG PUACHUE HMONG DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E144,
+ },
+ [0x1E145]={
+ category="nd",
+ description="NYIAKENG PUACHUE HMONG DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E145,
+ },
+ [0x1E146]={
+ category="nd",
+ description="NYIAKENG PUACHUE HMONG DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E146,
+ },
+ [0x1E147]={
+ category="nd",
+ description="NYIAKENG PUACHUE HMONG DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E147,
+ },
+ [0x1E148]={
+ category="nd",
+ description="NYIAKENG PUACHUE HMONG DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E148,
+ },
+ [0x1E149]={
+ category="nd",
+ description="NYIAKENG PUACHUE HMONG DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E149,
+ },
+ [0x1E14E]={
+ category="lo",
+ description="NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E14E,
+ },
+ [0x1E14F]={
+ category="so",
+ description="NYIAKENG PUACHUE HMONG CIRCLED CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E14F,
+ },
+ [0x1E2C0]={
+ category="lo",
+ description="WANCHO LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2C0,
+ },
+ [0x1E2C1]={
+ category="lo",
+ description="WANCHO LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2C1,
+ },
+ [0x1E2C2]={
+ category="lo",
+ description="WANCHO LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2C2,
+ },
+ [0x1E2C3]={
+ category="lo",
+ description="WANCHO LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2C3,
+ },
+ [0x1E2C4]={
+ category="lo",
+ description="WANCHO LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2C4,
+ },
+ [0x1E2C5]={
+ category="lo",
+ description="WANCHO LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2C5,
+ },
+ [0x1E2C6]={
+ category="lo",
+ description="WANCHO LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2C6,
+ },
+ [0x1E2C7]={
+ category="lo",
+ description="WANCHO LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2C7,
+ },
+ [0x1E2C8]={
+ category="lo",
+ description="WANCHO LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2C8,
+ },
+ [0x1E2C9]={
+ category="lo",
+ description="WANCHO LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2C9,
+ },
+ [0x1E2CA]={
+ category="lo",
+ description="WANCHO LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2CA,
+ },
+ [0x1E2CB]={
+ category="lo",
+ description="WANCHO LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2CB,
+ },
+ [0x1E2CC]={
+ category="lo",
+ description="WANCHO LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2CC,
+ },
+ [0x1E2CD]={
+ category="lo",
+ description="WANCHO LETTER FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2CD,
+ },
+ [0x1E2CE]={
+ category="lo",
+ description="WANCHO LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2CE,
+ },
+ [0x1E2CF]={
+ category="lo",
+ description="WANCHO LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2CF,
+ },
+ [0x1E2D0]={
+ category="lo",
+ description="WANCHO LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2D0,
+ },
+ [0x1E2D1]={
+ category="lo",
+ description="WANCHO LETTER ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2D1,
+ },
+ [0x1E2D2]={
+ category="lo",
+ description="WANCHO LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2D2,
+ },
+ [0x1E2D3]={
+ category="lo",
+ description="WANCHO LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2D3,
+ },
+ [0x1E2D4]={
+ category="lo",
+ description="WANCHO LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2D4,
+ },
+ [0x1E2D5]={
+ category="lo",
+ description="WANCHO LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2D5,
+ },
+ [0x1E2D6]={
+ category="lo",
+ description="WANCHO LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2D6,
+ },
+ [0x1E2D7]={
+ category="lo",
+ description="WANCHO LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2D7,
+ },
+ [0x1E2D8]={
+ category="lo",
+ description="WANCHO LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2D8,
+ },
+ [0x1E2D9]={
+ category="lo",
+ description="WANCHO LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2D9,
+ },
+ [0x1E2DA]={
+ category="lo",
+ description="WANCHO LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2DA,
+ },
+ [0x1E2DB]={
+ category="lo",
+ description="WANCHO LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2DB,
+ },
+ [0x1E2DC]={
+ category="lo",
+ description="WANCHO LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2DC,
+ },
+ [0x1E2DD]={
+ category="lo",
+ description="WANCHO LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2DD,
+ },
+ [0x1E2DE]={
+ category="lo",
+ description="WANCHO LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2DE,
+ },
+ [0x1E2DF]={
+ category="lo",
+ description="WANCHO LETTER LLHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2DF,
+ },
+ [0x1E2E0]={
+ category="lo",
+ description="WANCHO LETTER TSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2E0,
+ },
+ [0x1E2E1]={
+ category="lo",
+ description="WANCHO LETTER TRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2E1,
+ },
+ [0x1E2E2]={
+ category="lo",
+ description="WANCHO LETTER ONG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2E2,
+ },
+ [0x1E2E3]={
+ category="lo",
+ description="WANCHO LETTER AANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2E3,
+ },
+ [0x1E2E4]={
+ category="lo",
+ description="WANCHO LETTER ANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2E4,
+ },
+ [0x1E2E5]={
+ category="lo",
+ description="WANCHO LETTER ING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2E5,
+ },
+ [0x1E2E6]={
+ category="lo",
+ description="WANCHO LETTER ON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2E6,
+ },
+ [0x1E2E7]={
+ category="lo",
+ description="WANCHO LETTER EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2E7,
+ },
+ [0x1E2E8]={
+ category="lo",
+ description="WANCHO LETTER AAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2E8,
+ },
+ [0x1E2E9]={
+ category="lo",
+ description="WANCHO LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2E9,
+ },
+ [0x1E2EA]={
+ category="lo",
+ description="WANCHO LETTER UEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2EA,
+ },
+ [0x1E2EB]={
+ category="lo",
+ description="WANCHO LETTER YIH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1E2EB,
+ },
+ [0x1E2EC]={
+ category="mn",
+ combining=0xE6,
+ description="WANCHO TONE TUP",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E2EC,
+ },
+ [0x1E2ED]={
+ category="mn",
+ combining=0xE6,
+ description="WANCHO TONE TUPNI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E2ED,
+ },
+ [0x1E2EE]={
+ category="mn",
+ combining=0xE6,
+ description="WANCHO TONE KOI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E2EE,
+ },
+ [0x1E2EF]={
+ category="mn",
+ combining=0xE6,
+ description="WANCHO TONE KOINI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1E2EF,
+ },
+ [0x1E2F0]={
+ category="nd",
+ description="WANCHO DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F0,
+ },
+ [0x1E2F1]={
+ category="nd",
+ description="WANCHO DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F1,
+ },
+ [0x1E2F2]={
+ category="nd",
+ description="WANCHO DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F2,
+ },
+ [0x1E2F3]={
+ category="nd",
+ description="WANCHO DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F3,
+ },
+ [0x1E2F4]={
+ category="nd",
+ description="WANCHO DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F4,
+ },
+ [0x1E2F5]={
+ category="nd",
+ description="WANCHO DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F5,
+ },
+ [0x1E2F6]={
+ category="nd",
+ description="WANCHO DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F6,
+ },
+ [0x1E2F7]={
+ category="nd",
+ description="WANCHO DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F7,
+ },
+ [0x1E2F8]={
+ category="nd",
+ description="WANCHO DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F8,
+ },
+ [0x1E2F9]={
+ category="nd",
+ description="WANCHO DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1E2F9,
+ },
+ [0x1E2FF]={
+ category="sc",
+ description="WANCHO NGUN SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x1E2FF,
+ },
[0x1E800]={
category="lo",
description="MENDE KIKAKUI SYLLABLE M001 KI",
@@ -230166,6 +232597,14 @@ characters.data={
linebreak="cm",
unicodeslot=0x1E94A,
},
+ [0x1E94B]={
+ arabic="t",
+ category="lm",
+ description="ADLAM NASALIZATION MARK",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1E94B,
+ },
[0x1E950]={
category="nd",
description="ADLAM DIGIT ZERO",
@@ -230726,6 +233165,433 @@ characters.data={
linebreak="al",
unicodeslot=0x1ECB4,
},
+ [0x1ED01]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER ONE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED01,
+ },
+ [0x1ED02]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER TWO",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED02,
+ },
+ [0x1ED03]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER THREE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED03,
+ },
+ [0x1ED04]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER FOUR",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED04,
+ },
+ [0x1ED05]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER FIVE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED05,
+ },
+ [0x1ED06]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER SIX",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED06,
+ },
+ [0x1ED07]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER SEVEN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED07,
+ },
+ [0x1ED08]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER EIGHT",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED08,
+ },
+ [0x1ED09]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER NINE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED09,
+ },
+ [0x1ED0A]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER TEN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED0A,
+ },
+ [0x1ED0B]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER TWENTY",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED0B,
+ },
+ [0x1ED0C]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER THIRTY",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED0C,
+ },
+ [0x1ED0D]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER FORTY",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED0D,
+ },
+ [0x1ED0E]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER FIFTY",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED0E,
+ },
+ [0x1ED0F]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER SIXTY",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED0F,
+ },
+ [0x1ED10]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER SEVENTY",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED10,
+ },
+ [0x1ED11]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER EIGHTY",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED11,
+ },
+ [0x1ED12]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER NINETY",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED12,
+ },
+ [0x1ED13]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER ONE HUNDRED",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED13,
+ },
+ [0x1ED14]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER TWO HUNDRED",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED14,
+ },
+ [0x1ED15]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER THREE HUNDRED",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED15,
+ },
+ [0x1ED16]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER FOUR HUNDRED",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED16,
+ },
+ [0x1ED17]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER FIVE HUNDRED",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED17,
+ },
+ [0x1ED18]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER SIX HUNDRED",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED18,
+ },
+ [0x1ED19]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER SEVEN HUNDRED",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED19,
+ },
+ [0x1ED1A]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER EIGHT HUNDRED",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED1A,
+ },
+ [0x1ED1B]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER NINE HUNDRED",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED1B,
+ },
+ [0x1ED1C]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER ONE THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED1C,
+ },
+ [0x1ED1D]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER TWO THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED1D,
+ },
+ [0x1ED1E]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER THREE THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED1E,
+ },
+ [0x1ED1F]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER FOUR THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED1F,
+ },
+ [0x1ED20]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER FIVE THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED20,
+ },
+ [0x1ED21]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER SIX THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED21,
+ },
+ [0x1ED22]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER SEVEN THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED22,
+ },
+ [0x1ED23]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER EIGHT THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED23,
+ },
+ [0x1ED24]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER NINE THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED24,
+ },
+ [0x1ED25]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER TEN THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED25,
+ },
+ [0x1ED26]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER TWENTY THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED26,
+ },
+ [0x1ED27]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER THIRTY THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED27,
+ },
+ [0x1ED28]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER FORTY THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED28,
+ },
+ [0x1ED29]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER FIFTY THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED29,
+ },
+ [0x1ED2A]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER SIXTY THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED2A,
+ },
+ [0x1ED2B]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER SEVENTY THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED2B,
+ },
+ [0x1ED2C]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER EIGHTY THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED2C,
+ },
+ [0x1ED2D]={
+ category="no",
+ description="OTTOMAN SIYAQ NUMBER NINETY THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED2D,
+ },
+ [0x1ED2E]={
+ category="so",
+ description="OTTOMAN SIYAQ MARRATAN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED2E,
+ },
+ [0x1ED2F]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER TWO",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED2F,
+ },
+ [0x1ED30]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER THREE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED30,
+ },
+ [0x1ED31]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER FOUR",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED31,
+ },
+ [0x1ED32]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER FIVE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED32,
+ },
+ [0x1ED33]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER SIX",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED33,
+ },
+ [0x1ED34]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER SEVEN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED34,
+ },
+ [0x1ED35]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER EIGHT",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED35,
+ },
+ [0x1ED36]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER NINE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED36,
+ },
+ [0x1ED37]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER TEN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED37,
+ },
+ [0x1ED38]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER FOUR HUNDRED",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED38,
+ },
+ [0x1ED39]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER SIX HUNDRED",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED39,
+ },
+ [0x1ED3A]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER TWO THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED3A,
+ },
+ [0x1ED3B]={
+ category="no",
+ description="OTTOMAN SIYAQ ALTERNATE NUMBER TEN THOUSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED3B,
+ },
+ [0x1ED3C]={
+ category="no",
+ description="OTTOMAN SIYAQ FRACTION ONE HALF",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED3C,
+ },
+ [0x1ED3D]={
+ category="no",
+ description="OTTOMAN SIYAQ FRACTION ONE SIXTH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x1ED3D,
+ },
[0x1EE00]={
category="lo",
comment="check math properties",
@@ -234508,6 +237374,14 @@ characters.data={
synonyms={ "marque deposee" },
unicodeslot=0x1F16B,
},
+ [0x1F16C]={
+ category="so",
+ description="RAISED MR SIGN",
+ direction="on",
+ linebreak="al",
+ specials={ "super", 0x4D, 0x52 },
+ unicodeslot=0x1F16C,
+ },
[0x1F170]={
category="so",
cjkwd="a",
@@ -238661,7 +241535,7 @@ characters.data={
cjkwd="w",
description="FAMILY",
direction="on",
- linebreak="id",
+ linebreak="eb",
unicodeslot=0x1F46A,
},
[0x1F46B]={
@@ -238669,7 +241543,7 @@ characters.data={
cjkwd="w",
description="MAN AND WOMAN HOLDING HANDS",
direction="on",
- linebreak="id",
+ linebreak="eb",
unicodeslot=0x1F46B,
},
[0x1F46C]={
@@ -238677,7 +241551,7 @@ characters.data={
cjkwd="w",
description="TWO MEN HOLDING HANDS",
direction="on",
- linebreak="id",
+ linebreak="eb",
unicodeslot=0x1F46C,
},
[0x1F46D]={
@@ -238685,7 +241559,7 @@ characters.data={
cjkwd="w",
description="TWO WOMEN HOLDING HANDS",
direction="on",
- linebreak="id",
+ linebreak="eb",
unicodeslot=0x1F46D,
},
[0x1F46E]={
@@ -238701,7 +241575,7 @@ characters.data={
cjkwd="w",
description="WOMAN WITH BUNNY EARS",
direction="on",
- linebreak="id",
+ linebreak="eb",
unicodeslot=0x1F46F,
},
[0x1F470]={
@@ -238958,7 +241832,7 @@ characters.data={
cjkwd="w",
description="KISS",
direction="on",
- linebreak="id",
+ linebreak="eb",
unicodeslot=0x1F48F,
},
[0x1F490]={
@@ -238974,7 +241848,7 @@ characters.data={
cjkwd="w",
description="COUPLE WITH HEART",
direction="on",
- linebreak="id",
+ linebreak="eb",
unicodeslot=0x1F491,
},
[0x1F492]={
@@ -243446,6 +246320,14 @@ characters.data={
linebreak="id",
unicodeslot=0x1F6D4,
},
+ [0x1F6D5]={
+ category="so",
+ cjkwd="w",
+ description="HINDU TEMPLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6D5,
+ },
[0x1F6E0]={
category="so",
description="HAMMER AND WRENCH",
@@ -243624,6 +246506,14 @@ characters.data={
linebreak="id",
unicodeslot=0x1F6F9,
},
+ [0x1F6FA]={
+ category="so",
+ cjkwd="w",
+ description="AUTO RICKSHAW",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F6FA,
+ },
[0x1F700]={
category="so",
description="ALCHEMICAL SYMBOL FOR QUINTESSENCE",
@@ -245060,6 +247950,102 @@ characters.data={
linebreak="id",
unicodeslot=0x1F7D8,
},
+ [0x1F7E0]={
+ category="so",
+ cjkwd="w",
+ description="LARGE ORANGE CIRCLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F7E0,
+ },
+ [0x1F7E1]={
+ category="so",
+ cjkwd="w",
+ description="LARGE YELLOW CIRCLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F7E1,
+ },
+ [0x1F7E2]={
+ category="so",
+ cjkwd="w",
+ description="LARGE GREEN CIRCLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F7E2,
+ },
+ [0x1F7E3]={
+ category="so",
+ cjkwd="w",
+ description="LARGE PURPLE CIRCLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F7E3,
+ },
+ [0x1F7E4]={
+ category="so",
+ cjkwd="w",
+ description="LARGE BROWN CIRCLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F7E4,
+ },
+ [0x1F7E5]={
+ category="so",
+ cjkwd="w",
+ description="LARGE RED SQUARE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F7E5,
+ },
+ [0x1F7E6]={
+ category="so",
+ cjkwd="w",
+ description="LARGE BLUE SQUARE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F7E6,
+ },
+ [0x1F7E7]={
+ category="so",
+ cjkwd="w",
+ description="LARGE ORANGE SQUARE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F7E7,
+ },
+ [0x1F7E8]={
+ category="so",
+ cjkwd="w",
+ description="LARGE YELLOW SQUARE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F7E8,
+ },
+ [0x1F7E9]={
+ category="so",
+ cjkwd="w",
+ description="LARGE GREEN SQUARE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F7E9,
+ },
+ [0x1F7EA]={
+ category="so",
+ cjkwd="w",
+ description="LARGE PURPLE SQUARE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F7EA,
+ },
+ [0x1F7EB]={
+ category="so",
+ cjkwd="w",
+ description="LARGE BROWN SQUARE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F7EB,
+ },
[0x1F800]={
category="so",
description="LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD",
@@ -246180,6 +249166,30 @@ characters.data={
linebreak="al",
unicodeslot=0x1F90B,
},
+ [0x1F90D]={
+ category="so",
+ cjkwd="w",
+ description="WHITE HEART",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F90D,
+ },
+ [0x1F90E]={
+ category="so",
+ cjkwd="w",
+ description="BROWN HEART",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F90E,
+ },
+ [0x1F90F]={
+ category="so",
+ cjkwd="w",
+ description="PINCHING HAND",
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F90F,
+ },
[0x1F910]={
category="so",
cjkwd="w",
@@ -246289,7 +249299,7 @@ characters.data={
cjkwd="w",
description="HANDSHAKE",
direction="on",
- linebreak="id",
+ linebreak="eb",
unicodeslot=0x1F91D,
},
[0x1F91E]={
@@ -246540,7 +249550,7 @@ characters.data={
cjkwd="w",
description="WRESTLERS",
direction="on",
- linebreak="id",
+ linebreak="eb",
unicodeslot=0x1F93C,
},
[0x1F93D]={
@@ -246559,6 +249569,14 @@ characters.data={
linebreak="eb",
unicodeslot=0x1F93E,
},
+ [0x1F93F]={
+ category="so",
+ cjkwd="w",
+ description="DIVING MASK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F93F,
+ },
[0x1F940]={
category="so",
cjkwd="w",
@@ -246955,6 +249973,14 @@ characters.data={
linebreak="id",
unicodeslot=0x1F970,
},
+ [0x1F971]={
+ category="so",
+ cjkwd="w",
+ description="YAWNING FACE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F971,
+ },
[0x1F973]={
category="so",
cjkwd="w",
@@ -246995,6 +250021,14 @@ characters.data={
linebreak="id",
unicodeslot=0x1F97A,
},
+ [0x1F97B]={
+ category="so",
+ cjkwd="w",
+ description="SARI",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F97B,
+ },
[0x1F97C]={
category="so",
cjkwd="w",
@@ -247308,6 +250342,70 @@ characters.data={
linebreak="id",
unicodeslot=0x1F9A2,
},
+ [0x1F9A5]={
+ category="so",
+ cjkwd="w",
+ description="SLOTH",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9A5,
+ },
+ [0x1F9A6]={
+ category="so",
+ cjkwd="w",
+ description="OTTER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9A6,
+ },
+ [0x1F9A7]={
+ category="so",
+ cjkwd="w",
+ description="ORANGUTAN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9A7,
+ },
+ [0x1F9A8]={
+ category="so",
+ cjkwd="w",
+ description="SKUNK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9A8,
+ },
+ [0x1F9A9]={
+ category="so",
+ cjkwd="w",
+ description="FLAMINGO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9A9,
+ },
+ [0x1F9AA]={
+ category="so",
+ cjkwd="w",
+ description="OYSTER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9AA,
+ },
+ [0x1F9AE]={
+ category="so",
+ cjkwd="w",
+ description="GUIDE DOG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9AE,
+ },
+ [0x1F9AF]={
+ category="so",
+ cjkwd="w",
+ description="PROBING CANE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9AF,
+ },
[0x1F9B0]={
category="so",
cjkwd="w",
@@ -247388,6 +250486,54 @@ characters.data={
linebreak="eb",
unicodeslot=0x1F9B9,
},
+ [0x1F9BA]={
+ category="so",
+ cjkwd="w",
+ description="SAFETY VEST",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9BA,
+ },
+ [0x1F9BB]={
+ category="so",
+ cjkwd="w",
+ description="EAR WITH HEARING AID",
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F9BB,
+ },
+ [0x1F9BC]={
+ category="so",
+ cjkwd="w",
+ description="MOTORIZED WHEELCHAIR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9BC,
+ },
+ [0x1F9BD]={
+ category="so",
+ cjkwd="w",
+ description="MANUAL WHEELCHAIR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9BD,
+ },
+ [0x1F9BE]={
+ category="so",
+ cjkwd="w",
+ description="MECHANICAL ARM",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9BE,
+ },
+ [0x1F9BF]={
+ category="so",
+ cjkwd="w",
+ description="MECHANICAL LEG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9BF,
+ },
[0x1F9C0]={
category="so",
cjkwd="w",
@@ -247412,6 +250558,94 @@ characters.data={
linebreak="id",
unicodeslot=0x1F9C2,
},
+ [0x1F9C3]={
+ category="so",
+ cjkwd="w",
+ description="BEVERAGE BOX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9C3,
+ },
+ [0x1F9C4]={
+ category="so",
+ cjkwd="w",
+ description="GARLIC",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9C4,
+ },
+ [0x1F9C5]={
+ category="so",
+ cjkwd="w",
+ description="ONION",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9C5,
+ },
+ [0x1F9C6]={
+ category="so",
+ cjkwd="w",
+ description="FALAFEL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9C6,
+ },
+ [0x1F9C7]={
+ category="so",
+ cjkwd="w",
+ description="WAFFLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9C7,
+ },
+ [0x1F9C8]={
+ category="so",
+ cjkwd="w",
+ description="BUTTER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9C8,
+ },
+ [0x1F9C9]={
+ category="so",
+ cjkwd="w",
+ description="MATE DRINK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9C9,
+ },
+ [0x1F9CA]={
+ category="so",
+ cjkwd="w",
+ description="ICE CUBE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1F9CA,
+ },
+ [0x1F9CD]={
+ category="so",
+ cjkwd="w",
+ description="STANDING PERSON",
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F9CD,
+ },
+ [0x1F9CE]={
+ category="so",
+ cjkwd="w",
+ description="KNEELING PERSON",
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F9CE,
+ },
+ [0x1F9CF]={
+ category="so",
+ cjkwd="w",
+ description="DEAF PERSON",
+ direction="on",
+ linebreak="eb",
+ unicodeslot=0x1F9CF,
+ },
[0x1F9D0]={
category="so",
cjkwd="w",
@@ -247796,6 +251030,594 @@ characters.data={
linebreak="id",
unicodeslot=0x1F9FF,
},
+ [0x1FA00]={
+ category="so",
+ description="NEUTRAL CHESS KING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA00,
+ },
+ [0x1FA01]={
+ category="so",
+ description="NEUTRAL CHESS QUEEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA01,
+ },
+ [0x1FA02]={
+ category="so",
+ description="NEUTRAL CHESS ROOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA02,
+ },
+ [0x1FA03]={
+ category="so",
+ description="NEUTRAL CHESS BISHOP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA03,
+ },
+ [0x1FA04]={
+ category="so",
+ description="NEUTRAL CHESS KNIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA04,
+ },
+ [0x1FA05]={
+ category="so",
+ description="NEUTRAL CHESS PAWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA05,
+ },
+ [0x1FA06]={
+ category="so",
+ description="WHITE CHESS KNIGHT ROTATED FORTY-FIVE DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA06,
+ },
+ [0x1FA07]={
+ category="so",
+ description="BLACK CHESS KNIGHT ROTATED FORTY-FIVE DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA07,
+ },
+ [0x1FA08]={
+ category="so",
+ description="NEUTRAL CHESS KNIGHT ROTATED FORTY-FIVE DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA08,
+ },
+ [0x1FA09]={
+ category="so",
+ description="WHITE CHESS KING ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA09,
+ },
+ [0x1FA0A]={
+ category="so",
+ description="WHITE CHESS QUEEN ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA0A,
+ },
+ [0x1FA0B]={
+ category="so",
+ description="WHITE CHESS ROOK ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA0B,
+ },
+ [0x1FA0C]={
+ category="so",
+ description="WHITE CHESS BISHOP ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA0C,
+ },
+ [0x1FA0D]={
+ category="so",
+ description="WHITE CHESS KNIGHT ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA0D,
+ },
+ [0x1FA0E]={
+ category="so",
+ description="WHITE CHESS PAWN ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA0E,
+ },
+ [0x1FA0F]={
+ category="so",
+ description="BLACK CHESS KING ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA0F,
+ },
+ [0x1FA10]={
+ category="so",
+ description="BLACK CHESS QUEEN ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA10,
+ },
+ [0x1FA11]={
+ category="so",
+ description="BLACK CHESS ROOK ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA11,
+ },
+ [0x1FA12]={
+ category="so",
+ description="BLACK CHESS BISHOP ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA12,
+ },
+ [0x1FA13]={
+ category="so",
+ description="BLACK CHESS KNIGHT ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA13,
+ },
+ [0x1FA14]={
+ category="so",
+ description="BLACK CHESS PAWN ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA14,
+ },
+ [0x1FA15]={
+ category="so",
+ description="NEUTRAL CHESS KING ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA15,
+ },
+ [0x1FA16]={
+ category="so",
+ description="NEUTRAL CHESS QUEEN ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA16,
+ },
+ [0x1FA17]={
+ category="so",
+ description="NEUTRAL CHESS ROOK ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA17,
+ },
+ [0x1FA18]={
+ category="so",
+ description="NEUTRAL CHESS BISHOP ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA18,
+ },
+ [0x1FA19]={
+ category="so",
+ description="NEUTRAL CHESS KNIGHT ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA19,
+ },
+ [0x1FA1A]={
+ category="so",
+ description="NEUTRAL CHESS PAWN ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA1A,
+ },
+ [0x1FA1B]={
+ category="so",
+ description="WHITE CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA1B,
+ },
+ [0x1FA1C]={
+ category="so",
+ description="BLACK CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA1C,
+ },
+ [0x1FA1D]={
+ category="so",
+ description="NEUTRAL CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA1D,
+ },
+ [0x1FA1E]={
+ category="so",
+ description="WHITE CHESS TURNED KING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA1E,
+ },
+ [0x1FA1F]={
+ category="so",
+ description="WHITE CHESS TURNED QUEEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA1F,
+ },
+ [0x1FA20]={
+ category="so",
+ description="WHITE CHESS TURNED ROOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA20,
+ },
+ [0x1FA21]={
+ category="so",
+ description="WHITE CHESS TURNED BISHOP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA21,
+ },
+ [0x1FA22]={
+ category="so",
+ description="WHITE CHESS TURNED KNIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA22,
+ },
+ [0x1FA23]={
+ category="so",
+ description="WHITE CHESS TURNED PAWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA23,
+ },
+ [0x1FA24]={
+ category="so",
+ description="BLACK CHESS TURNED KING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA24,
+ },
+ [0x1FA25]={
+ category="so",
+ description="BLACK CHESS TURNED QUEEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA25,
+ },
+ [0x1FA26]={
+ category="so",
+ description="BLACK CHESS TURNED ROOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA26,
+ },
+ [0x1FA27]={
+ category="so",
+ description="BLACK CHESS TURNED BISHOP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA27,
+ },
+ [0x1FA28]={
+ category="so",
+ description="BLACK CHESS TURNED KNIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA28,
+ },
+ [0x1FA29]={
+ category="so",
+ description="BLACK CHESS TURNED PAWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA29,
+ },
+ [0x1FA2A]={
+ category="so",
+ description="NEUTRAL CHESS TURNED KING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA2A,
+ },
+ [0x1FA2B]={
+ category="so",
+ description="NEUTRAL CHESS TURNED QUEEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA2B,
+ },
+ [0x1FA2C]={
+ category="so",
+ description="NEUTRAL CHESS TURNED ROOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA2C,
+ },
+ [0x1FA2D]={
+ category="so",
+ description="NEUTRAL CHESS TURNED BISHOP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA2D,
+ },
+ [0x1FA2E]={
+ category="so",
+ description="NEUTRAL CHESS TURNED KNIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA2E,
+ },
+ [0x1FA2F]={
+ category="so",
+ description="NEUTRAL CHESS TURNED PAWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA2F,
+ },
+ [0x1FA30]={
+ category="so",
+ description="WHITE CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA30,
+ },
+ [0x1FA31]={
+ category="so",
+ description="BLACK CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA31,
+ },
+ [0x1FA32]={
+ category="so",
+ description="NEUTRAL CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA32,
+ },
+ [0x1FA33]={
+ category="so",
+ description="WHITE CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA33,
+ },
+ [0x1FA34]={
+ category="so",
+ description="WHITE CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA34,
+ },
+ [0x1FA35]={
+ category="so",
+ description="WHITE CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA35,
+ },
+ [0x1FA36]={
+ category="so",
+ description="WHITE CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA36,
+ },
+ [0x1FA37]={
+ category="so",
+ description="WHITE CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA37,
+ },
+ [0x1FA38]={
+ category="so",
+ description="WHITE CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA38,
+ },
+ [0x1FA39]={
+ category="so",
+ description="BLACK CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA39,
+ },
+ [0x1FA3A]={
+ category="so",
+ description="BLACK CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA3A,
+ },
+ [0x1FA3B]={
+ category="so",
+ description="BLACK CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA3B,
+ },
+ [0x1FA3C]={
+ category="so",
+ description="BLACK CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA3C,
+ },
+ [0x1FA3D]={
+ category="so",
+ description="BLACK CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA3D,
+ },
+ [0x1FA3E]={
+ category="so",
+ description="BLACK CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA3E,
+ },
+ [0x1FA3F]={
+ category="so",
+ description="NEUTRAL CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA3F,
+ },
+ [0x1FA40]={
+ category="so",
+ description="NEUTRAL CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA40,
+ },
+ [0x1FA41]={
+ category="so",
+ description="NEUTRAL CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA41,
+ },
+ [0x1FA42]={
+ category="so",
+ description="NEUTRAL CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA42,
+ },
+ [0x1FA43]={
+ category="so",
+ description="NEUTRAL CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA43,
+ },
+ [0x1FA44]={
+ category="so",
+ description="NEUTRAL CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA44,
+ },
+ [0x1FA45]={
+ category="so",
+ description="WHITE CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA45,
+ },
+ [0x1FA46]={
+ category="so",
+ description="BLACK CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA46,
+ },
+ [0x1FA47]={
+ category="so",
+ description="NEUTRAL CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA47,
+ },
+ [0x1FA48]={
+ category="so",
+ description="WHITE CHESS EQUIHOPPER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA48,
+ },
+ [0x1FA49]={
+ category="so",
+ description="BLACK CHESS EQUIHOPPER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA49,
+ },
+ [0x1FA4A]={
+ category="so",
+ description="NEUTRAL CHESS EQUIHOPPER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA4A,
+ },
+ [0x1FA4B]={
+ category="so",
+ description="WHITE CHESS EQUIHOPPER ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA4B,
+ },
+ [0x1FA4C]={
+ category="so",
+ description="BLACK CHESS EQUIHOPPER ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA4C,
+ },
+ [0x1FA4D]={
+ category="so",
+ description="NEUTRAL CHESS EQUIHOPPER ROTATED NINETY DEGREES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA4D,
+ },
+ [0x1FA4E]={
+ category="so",
+ description="WHITE CHESS KNIGHT-QUEEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA4E,
+ },
+ [0x1FA4F]={
+ category="so",
+ description="WHITE CHESS KNIGHT-ROOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA4F,
+ },
+ [0x1FA50]={
+ category="so",
+ description="WHITE CHESS KNIGHT-BISHOP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA50,
+ },
+ [0x1FA51]={
+ category="so",
+ description="BLACK CHESS KNIGHT-QUEEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA51,
+ },
+ [0x1FA52]={
+ category="so",
+ description="BLACK CHESS KNIGHT-ROOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA52,
+ },
+ [0x1FA53]={
+ category="so",
+ description="BLACK CHESS KNIGHT-BISHOP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1FA53,
+ },
[0x1FA60]={
category="so",
description="XIANGQI RED GENERAL",
@@ -247894,6 +251716,134 @@ characters.data={
linebreak="id",
unicodeslot=0x1FA6D,
},
+ [0x1FA70]={
+ category="so",
+ cjkwd="w",
+ description="BALLET SHOES",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA70,
+ },
+ [0x1FA71]={
+ category="so",
+ cjkwd="w",
+ description="ONE-PIECE SWIMSUIT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA71,
+ },
+ [0x1FA72]={
+ category="so",
+ cjkwd="w",
+ description="BRIEFS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA72,
+ },
+ [0x1FA73]={
+ category="so",
+ cjkwd="w",
+ description="SHORTS",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA73,
+ },
+ [0x1FA78]={
+ category="so",
+ cjkwd="w",
+ description="DROP OF BLOOD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA78,
+ },
+ [0x1FA79]={
+ category="so",
+ cjkwd="w",
+ description="ADHESIVE BANDAGE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA79,
+ },
+ [0x1FA7A]={
+ category="so",
+ cjkwd="w",
+ description="STETHOSCOPE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA7A,
+ },
+ [0x1FA80]={
+ category="so",
+ cjkwd="w",
+ description="YO-YO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA80,
+ },
+ [0x1FA81]={
+ category="so",
+ cjkwd="w",
+ description="KITE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA81,
+ },
+ [0x1FA82]={
+ category="so",
+ cjkwd="w",
+ description="PARACHUTE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA82,
+ },
+ [0x1FA90]={
+ category="so",
+ cjkwd="w",
+ description="RINGED PLANET",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA90,
+ },
+ [0x1FA91]={
+ category="so",
+ cjkwd="w",
+ description="CHAIR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA91,
+ },
+ [0x1FA92]={
+ category="so",
+ cjkwd="w",
+ description="RAZOR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA92,
+ },
+ [0x1FA93]={
+ category="so",
+ cjkwd="w",
+ description="AXE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA93,
+ },
+ [0x1FA94]={
+ category="so",
+ cjkwd="w",
+ description="DIYA LAMP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA94,
+ },
+ [0x1FA95]={
+ category="so",
+ cjkwd="w",
+ description="BANJO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x1FA95,
+ },
[0x2F800]={
category="lo",
cjkwd="w",
diff --git a/Master/texmf-dist/tex/context/base/mkiv/char-emj.lua b/Master/texmf-dist/tex/context/base/mkiv/char-emj.lua
index b00e9ebf809..e6c059174b7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/char-emj.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/char-emj.lua
@@ -16,6 +16,7 @@ return {
["a button (blood type)"]={ 0x1F170, 0xFE0F },
["ab button (blood type)"]={ 0x1F18E },
["abacus"]={ 0x1F9EE },
+ ["accordion"]={ 0x1FA97 },
["adhesive bandage"]={ 0x1FA79 },
["admission tickets"]={ 0x1F39F, 0xFE0F },
["aerial tramway"]={ 0x1F6A1 },
@@ -29,6 +30,7 @@ return {
["ambulance"]={ 0x1F691 },
["american football"]={ 0x1F3C8 },
["amphora"]={ 0x1F3FA },
+ ["anatomical heart"]={ 0x1FAC0 },
["anchor"]={ 0x2693 },
["anger symbol"]={ 0x1F4A2 },
["angry face"]={ 0x1F620 },
@@ -40,8 +42,20 @@ return {
["aquarius"]={ 0x2652 },
["aries"]={ 0x2648 },
["articulated lorry"]={ 0x1F69B },
+ ["artist"]={ 0x1F9D1, 0x200D, 0x1F3A8 },
["artist palette"]={ 0x1F3A8 },
+ ["artist: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F3A8 },
+ ["artist: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F3A8 },
+ ["artist: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F3A8 },
+ ["artist: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F3A8 },
+ ["artist: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F3A8 },
["astonished face"]={ 0x1F632 },
+ ["astronaut"]={ 0x1F9D1, 0x200D, 0x1F680 },
+ ["astronaut: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F680 },
+ ["astronaut: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F680 },
+ ["astronaut: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F680 },
+ ["astronaut: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F680 },
+ ["astronaut: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F680 },
["atm sign"]={ 0x1F3E7 },
["atom symbol"]={ 0x269B, 0xFE0F },
["auto rickshaw"]={ 0x1F6FA },
@@ -115,9 +129,12 @@ return {
["beaming face with smiling eyes"]={ 0x1F601 },
["bear"]={ 0x1F43B },
["beating heart"]={ 0x1F493 },
+ ["beaver"]={ 0x1F9AB },
["bed"]={ 0x1F6CF, 0xFE0F },
["beer mug"]={ 0x1F37A },
+ ["beetle"]={ 0x1FAB2 },
["bell"]={ 0x1F514 },
+ ["bell pepper"]={ 0x1FAD1 },
["bell with slash"]={ 0x1F515 },
["bellhop bell"]={ 0x1F6CE, 0xFE0F },
["bento box"]={ 0x1F371 },
@@ -128,6 +145,8 @@ return {
["biohazard"]={ 0x2623, 0xFE0F },
["bird"]={ 0x1F426 },
["birthday cake"]={ 0x1F382 },
+ ["bison"]={ 0x1F9AC },
+ ["black cat"]={ 0x1F408, 0x200D, 0x2B1B },
["black circle"]={ 0x26AB },
["black flag"]={ 0x1F3F4 },
["black heart"]={ 0x1F5A4 },
@@ -143,12 +162,14 @@ return {
["blue circle"]={ 0x1F535 },
["blue heart"]={ 0x1F499 },
["blue square"]={ 0x1F7E6 },
+ ["blueberries"]={ 0x1FAD0 },
["boar"]={ 0x1F417 },
["bomb"]={ 0x1F4A3 },
["bone"]={ 0x1F9B4 },
["bookmark"]={ 0x1F516 },
["bookmark tabs"]={ 0x1F4D1 },
["books"]={ 0x1F4DA },
+ ["boomerang"]={ 0x1FA83 },
["bottle with popping cork"]={ 0x1F37E },
["bouquet"]={ 0x1F490 },
["bow and arrow"]={ 0x1F3F9 },
@@ -170,14 +191,9 @@ return {
["breast-feeding: medium-dark skin tone"]={ 0x1F931, 0x1F3FE },
["breast-feeding: medium-light skin tone"]={ 0x1F931, 0x1F3FC },
["brick"]={ 0x1F9F1 },
- ["bride with veil"]={ 0x1F470 },
- ["bride with veil: dark skin tone"]={ 0x1F470, 0x1F3FF },
- ["bride with veil: light skin tone"]={ 0x1F470, 0x1F3FB },
- ["bride with veil: medium skin tone"]={ 0x1F470, 0x1F3FD },
- ["bride with veil: medium-dark skin tone"]={ 0x1F470, 0x1F3FE },
- ["bride with veil: medium-light skin tone"]={ 0x1F470, 0x1F3FC },
["bridge at night"]={ 0x1F309 },
["briefcase"]={ 0x1F4BC },
+ ["briefs"]={ 0x1FA72 },
["bright button"]={ 0x1F506 },
["broccoli"]={ 0x1F966 },
["broken heart"]={ 0x1F494 },
@@ -185,6 +201,8 @@ return {
["brown circle"]={ 0x1F7E4 },
["brown heart"]={ 0x1F90E },
["brown square"]={ 0x1F7EB },
+ ["bubble tea"]={ 0x1F9CB },
+ ["bucket"]={ 0x1FAA3 },
["bug"]={ 0x1F41B },
["building construction"]={ 0x1F3D7, 0xFE0F },
["bullet train"]={ 0x1F685 },
@@ -218,6 +236,7 @@ return {
["card index dividers"]={ 0x1F5C2, 0xFE0F },
["carousel horse"]={ 0x1F3A0 },
["carp streamer"]={ 0x1F38F },
+ ["carpentry saw"]={ 0x1FA9A },
["carrot"]={ 0x1F955 },
["castle"]={ 0x1F3F0 },
["cat"]={ 0x1F408 },
@@ -284,9 +303,11 @@ return {
["club suit"]={ 0x2663, 0xFE0F },
["clutch bag"]={ 0x1F45D },
["coat"]={ 0x1F9E5 },
+ ["cockroach"]={ 0x1FAB3 },
["cocktail glass"]={ 0x1F378 },
["coconut"]={ 0x1F965 },
["coffin"]={ 0x26B0, 0xFE0F },
+ ["coin"]={ 0x1FA99 },
["cold face"]={ 0x1F976 },
["collision"]={ 0x1F4A5 },
["comet"]={ 0x2604, 0xFE0F },
@@ -305,6 +326,12 @@ return {
["construction worker: medium-light skin tone"]={ 0x1F477, 0x1F3FC },
["control knobs"]={ 0x1F39B, 0xFE0F },
["convenience store"]={ 0x1F3EA },
+ ["cook"]={ 0x1F9D1, 0x200D, 0x1F373 },
+ ["cook: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F373 },
+ ["cook: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F373 },
+ ["cook: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F373 },
+ ["cook: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F373 },
+ ["cook: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F373 },
["cooked rice"]={ 0x1F35A },
["cookie"]={ 0x1F36A },
["cooking"]={ 0x1F373 },
@@ -392,12 +419,14 @@ return {
["dim button"]={ 0x1F505 },
["direct hit"]={ 0x1F3AF },
["disappointed face"]={ 0x1F61E },
+ ["disguised face"]={ 0x1F978 },
+ ["divide"]={ 0x2797 },
["diving mask"]={ 0x1F93F },
- ["division sign"]={ 0x2797 },
["diya lamp"]={ 0x1FA94 },
["dizzy"]={ 0x1F4AB },
["dizzy face"]={ 0x1F635 },
["dna"]={ 0x1F9EC },
+ ["dodo"]={ 0x1F9A4 },
["dog"]={ 0x1F415 },
["dog face"]={ 0x1F436 },
["dollar banknote"]={ 0x1F4B5 },
@@ -447,6 +476,7 @@ return {
["eject button"]={ 0x23CF, 0xFE0F },
["electric plug"]={ 0x1F50C },
["elephant"]={ 0x1F418 },
+ ["elevator"]={ 0x1F6D7 },
["eleven o’clock"]={ 0x1F55A },
["eleven-thirty"]={ 0x1F566 },
["elf"]={ 0x1F9DD },
@@ -486,6 +516,12 @@ return {
["face with tongue"]={ 0x1F61B },
["face without mouth"]={ 0x1F636 },
["factory"]={ 0x1F3ED },
+ ["factory worker"]={ 0x1F9D1, 0x200D, 0x1F3ED },
+ ["factory worker: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F3ED },
+ ["factory worker: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F3ED },
+ ["factory worker: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F3ED },
+ ["factory worker: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F3ED },
+ ["factory worker: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F3ED },
["fairy"]={ 0x1F9DA },
["fairy: dark skin tone"]={ 0x1F9DA, 0x1F3FF },
["fairy: light skin tone"]={ 0x1F9DA, 0x1F3FB },
@@ -520,12 +556,19 @@ return {
["family: woman, woman, girl"]={ 0x1F469, 0x200D, 0x1F469, 0x200D, 0x1F467 },
["family: woman, woman, girl, boy"]={ 0x1F469, 0x200D, 0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F466 },
["family: woman, woman, girl, girl"]={ 0x1F469, 0x200D, 0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F467 },
+ ["farmer"]={ 0x1F9D1, 0x200D, 0x1F33E },
+ ["farmer: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F33E },
+ ["farmer: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F33E },
+ ["farmer: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F33E },
+ ["farmer: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F33E },
+ ["farmer: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F33E },
["fast down button"]={ 0x23EC },
["fast reverse button"]={ 0x23EA },
["fast up button"]={ 0x23EB },
["fast-forward button"]={ 0x23E9 },
["fax machine"]={ 0x1F4E0 },
["fearful face"]={ 0x1F628 },
+ ["feather"]={ 0x1FAB6 },
["female sign"]={ 0x2640, 0xFE0F },
["ferris wheel"]={ 0x1F3A1 },
["ferry"]={ 0x26F4, 0xFE0F },
@@ -538,6 +581,12 @@ return {
["fire engine"]={ 0x1F692 },
["fire extinguisher"]={ 0x1F9EF },
["firecracker"]={ 0x1F9E8 },
+ ["firefighter"]={ 0x1F9D1, 0x200D, 0x1F692 },
+ ["firefighter: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F692 },
+ ["firefighter: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F692 },
+ ["firefighter: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F692 },
+ ["firefighter: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F692 },
+ ["firefighter: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F692 },
["fireworks"]={ 0x1F386 },
["first quarter moon"]={ 0x1F313 },
["first quarter moon face"]={ 0x1F31B },
@@ -684,7 +733,6 @@ return {
["flag: lithuania"]={ 0x1F1F1, 0x1F1F9 },
["flag: luxembourg"]={ 0x1F1F1, 0x1F1FA },
["flag: macao sar china"]={ 0x1F1F2, 0x1F1F4 },
- ["flag: macedonia"]={ 0x1F1F2, 0x1F1F0 },
["flag: madagascar"]={ 0x1F1F2, 0x1F1EC },
["flag: malawi"]={ 0x1F1F2, 0x1F1FC },
["flag: malaysia"]={ 0x1F1F2, 0x1F1FE },
@@ -718,6 +766,7 @@ return {
["flag: niue"]={ 0x1F1F3, 0x1F1FA },
["flag: norfolk island"]={ 0x1F1F3, 0x1F1EB },
["flag: north korea"]={ 0x1F1F0, 0x1F1F5 },
+ ["flag: north macedonia"]={ 0x1F1F2, 0x1F1F0 },
["flag: northern mariana islands"]={ 0x1F1F2, 0x1F1F5 },
["flag: norway"]={ 0x1F1F3, 0x1F1F4 },
["flag: oman"]={ 0x1F1F4, 0x1F1F2 },
@@ -811,6 +860,7 @@ return {
["flamingo"]={ 0x1F9A9 },
["flashlight"]={ 0x1F526 },
["flat shoe"]={ 0x1F97F },
+ ["flatbread"]={ 0x1FAD3 },
["fleur-de-lis"]={ 0x269C, 0xFE0F },
["flexed biceps"]={ 0x1F4AA },
["flexed biceps: dark skin tone"]={ 0x1F4AA, 0x1F3FF },
@@ -821,6 +871,7 @@ return {
["floppy disk"]={ 0x1F4BE },
["flower playing cards"]={ 0x1F3B4 },
["flushed face"]={ 0x1F633 },
+ ["fly"]={ 0x1FAB0 },
["flying disc"]={ 0x1F94F },
["flying saucer"]={ 0x1F6F8 },
["fog"]={ 0x1F32B, 0xFE0F },
@@ -831,6 +882,7 @@ return {
["folded hands: medium skin tone"]={ 0x1F64F, 0x1F3FD },
["folded hands: medium-dark skin tone"]={ 0x1F64F, 0x1F3FE },
["folded hands: medium-light skin tone"]={ 0x1F64F, 0x1F3FC },
+ ["fondue"]={ 0x1FAD5 },
["foot"]={ 0x1F9B6 },
["foot: dark skin tone"]={ 0x1F9B6, 0x1F3FF },
["foot: light skin tone"]={ 0x1F9B6, 0x1F3FB },
@@ -926,6 +978,13 @@ return {
["handshake"]={ 0x1F91D },
["hatching chick"]={ 0x1F423 },
["headphone"]={ 0x1F3A7 },
+ ["headstone"]={ 0x1FAA6 },
+ ["health worker"]={ 0x1F9D1, 0x200D, 0x2695, 0xFE0F },
+ ["health worker: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x2695, 0xFE0F },
+ ["health worker: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x2695, 0xFE0F },
+ ["health worker: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x2695, 0xFE0F },
+ ["health worker: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x2695, 0xFE0F },
+ ["health worker: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x2695, 0xFE0F },
["hear-no-evil monkey"]={ 0x1F649 },
["heart decoration"]={ 0x1F49F },
["heart exclamation"]={ 0x2763, 0xFE0F },
@@ -947,6 +1006,7 @@ return {
["hollow red circle"]={ 0x2B55 },
["honey pot"]={ 0x1F36F },
["honeybee"]={ 0x1F41D },
+ ["hook"]={ 0x1FA9D },
["horizontal traffic light"]={ 0x1F6A5 },
["horse"]={ 0x1F40E },
["horse face"]={ 0x1F434 },
@@ -971,8 +1031,9 @@ return {
["hugging face"]={ 0x1F917 },
["hundred points"]={ 0x1F4AF },
["hushed face"]={ 0x1F62F },
+ ["hut"]={ 0x1F6D6 },
+ ["ice"]={ 0x1F9CA },
["ice cream"]={ 0x1F368 },
- ["ice cube"]={ 0x1F9CA },
["ice hockey"]={ 0x1F3D2 },
["ice skate"]={ 0x26F8, 0xFE0F },
["id button"]={ 0x1F194 },
@@ -1016,6 +1077,12 @@ return {
["jeans"]={ 0x1F456 },
["joker"]={ 0x1F0CF },
["joystick"]={ 0x1F579, 0xFE0F },
+ ["judge"]={ 0x1F9D1, 0x200D, 0x2696, 0xFE0F },
+ ["judge: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x2696, 0xFE0F },
+ ["judge: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x2696, 0xFE0F },
+ ["judge: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x2696, 0xFE0F },
+ ["judge: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x2696, 0xFE0F },
+ ["judge: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x2696, 0xFE0F },
["kaaba"]={ 0x1F54B },
["kangaroo"]={ 0x1F998 },
["key"]={ 0x1F511 },
@@ -1047,12 +1114,14 @@ return {
["kitchen knife"]={ 0x1F52A },
["kite"]={ 0x1FA81 },
["kiwi fruit"]={ 0x1F95D },
+ ["knot"]={ 0x1FAA2 },
["koala"]={ 0x1F428 },
["lab coat"]={ 0x1F97C },
["label"]={ 0x1F3F7, 0xFE0F },
["lacrosse"]={ 0x1F94D },
+ ["ladder"]={ 0x1FA9C },
["lady beetle"]={ 0x1F41E },
- ["laptop computer"]={ 0x1F4BB },
+ ["laptop"]={ 0x1F4BB },
["large blue diamond"]={ 0x1F537 },
["large orange diamond"]={ 0x1F536 },
["last quarter moon"]={ 0x1F317 },
@@ -1099,6 +1168,7 @@ return {
["locked with pen"]={ 0x1F50F },
["locomotive"]={ 0x1F682 },
["lollipop"]={ 0x1F36D },
+ ["long drum"]={ 0x1FA98 },
["lotion bottle"]={ 0x1F9F4 },
["loudly crying face"]={ 0x1F62D },
["loudspeaker"]={ 0x1F4E2 },
@@ -1111,6 +1181,7 @@ return {
["love-you gesture: medium-dark skin tone"]={ 0x1F91F, 0x1F3FE },
["love-you gesture: medium-light skin tone"]={ 0x1F91F, 0x1F3FC },
["luggage"]={ 0x1F9F3 },
+ ["lungs"]={ 0x1FAC1 },
["lying face"]={ 0x1F925 },
["mage"]={ 0x1F9D9 },
["mage: dark skin tone"]={ 0x1F9D9, 0x1F3FF },
@@ -1118,11 +1189,13 @@ return {
["mage: medium skin tone"]={ 0x1F9D9, 0x1F3FD },
["mage: medium-dark skin tone"]={ 0x1F9D9, 0x1F3FE },
["mage: medium-light skin tone"]={ 0x1F9D9, 0x1F3FC },
+ ["magic wand"]={ 0x1FA84 },
["magnet"]={ 0x1F9F2 },
["magnifying glass tilted left"]={ 0x1F50D },
["magnifying glass tilted right"]={ 0x1F50E },
["mahjong red dragon"]={ 0x1F004 },
["male sign"]={ 0x2642, 0xFE0F },
+ ["mammoth"]={ 0x1F9A3 },
["man"]={ 0x1F468 },
["man artist"]={ 0x1F468, 0x200D, 0x1F3A8 },
["man artist: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F3A8 },
@@ -1220,6 +1293,12 @@ return {
["man farmer: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F33E },
["man farmer: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F33E },
["man farmer: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F33E },
+ ["man feeding baby"]={ 0x1F468, 0x200D, 0x1F37C },
+ ["man feeding baby: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F37C },
+ ["man feeding baby: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F37C },
+ ["man feeding baby: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F37C },
+ ["man feeding baby: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F37C },
+ ["man feeding baby: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F37C },
["man firefighter"]={ 0x1F468, 0x200D, 0x1F692 },
["man firefighter: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F692 },
["man firefighter: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F692 },
@@ -1299,18 +1378,12 @@ return {
["man in steamy room: medium skin tone"]={ 0x1F9D6, 0x1F3FD, 0x200D, 0x2642, 0xFE0F },
["man in steamy room: medium-dark skin tone"]={ 0x1F9D6, 0x1F3FE, 0x200D, 0x2642, 0xFE0F },
["man in steamy room: medium-light skin tone"]={ 0x1F9D6, 0x1F3FC, 0x200D, 0x2642, 0xFE0F },
- ["man in suit levitating"]={ 0x1F574, 0xFE0F },
- ["man in suit levitating: dark skin tone"]={ 0x1F574, 0x1F3FF },
- ["man in suit levitating: light skin tone"]={ 0x1F574, 0x1F3FB },
- ["man in suit levitating: medium skin tone"]={ 0x1F574, 0x1F3FD },
- ["man in suit levitating: medium-dark skin tone"]={ 0x1F574, 0x1F3FE },
- ["man in suit levitating: medium-light skin tone"]={ 0x1F574, 0x1F3FC },
- ["man in tuxedo"]={ 0x1F935 },
- ["man in tuxedo: dark skin tone"]={ 0x1F935, 0x1F3FF },
- ["man in tuxedo: light skin tone"]={ 0x1F935, 0x1F3FB },
- ["man in tuxedo: medium skin tone"]={ 0x1F935, 0x1F3FD },
- ["man in tuxedo: medium-dark skin tone"]={ 0x1F935, 0x1F3FE },
- ["man in tuxedo: medium-light skin tone"]={ 0x1F935, 0x1F3FC },
+ ["man in tuxedo"]={ 0x1F935, 0x200D, 0x2642, 0xFE0F },
+ ["man in tuxedo: dark skin tone"]={ 0x1F935, 0x1F3FF, 0x200D, 0x2642, 0xFE0F },
+ ["man in tuxedo: light skin tone"]={ 0x1F935, 0x1F3FB, 0x200D, 0x2642, 0xFE0F },
+ ["man in tuxedo: medium skin tone"]={ 0x1F935, 0x1F3FD, 0x200D, 0x2642, 0xFE0F },
+ ["man in tuxedo: medium-dark skin tone"]={ 0x1F935, 0x1F3FE, 0x200D, 0x2642, 0xFE0F },
+ ["man in tuxedo: medium-light skin tone"]={ 0x1F935, 0x1F3FC, 0x200D, 0x2642, 0xFE0F },
["man judge"]={ 0x1F468, 0x200D, 0x2696, 0xFE0F },
["man judge: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x2696, 0xFE0F },
["man judge: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x2696, 0xFE0F },
@@ -1497,18 +1570,18 @@ return {
["man wearing turban: medium skin tone"]={ 0x1F473, 0x1F3FD, 0x200D, 0x2642, 0xFE0F },
["man wearing turban: medium-dark skin tone"]={ 0x1F473, 0x1F3FE, 0x200D, 0x2642, 0xFE0F },
["man wearing turban: medium-light skin tone"]={ 0x1F473, 0x1F3FC, 0x200D, 0x2642, 0xFE0F },
- ["man with chinese cap"]={ 0x1F472 },
- ["man with chinese cap: dark skin tone"]={ 0x1F472, 0x1F3FF },
- ["man with chinese cap: light skin tone"]={ 0x1F472, 0x1F3FB },
- ["man with chinese cap: medium skin tone"]={ 0x1F472, 0x1F3FD },
- ["man with chinese cap: medium-dark skin tone"]={ 0x1F472, 0x1F3FE },
- ["man with chinese cap: medium-light skin tone"]={ 0x1F472, 0x1F3FC },
- ["man with probing cane"]={ 0x1F468, 0x200D, 0x1F9AF },
- ["man with probing cane: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F9AF },
- ["man with probing cane: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F9AF },
- ["man with probing cane: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F9AF },
- ["man with probing cane: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F9AF },
- ["man with probing cane: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F9AF },
+ ["man with veil"]={ 0x1F470, 0x200D, 0x2642, 0xFE0F },
+ ["man with veil: dark skin tone"]={ 0x1F470, 0x1F3FF, 0x200D, 0x2642, 0xFE0F },
+ ["man with veil: light skin tone"]={ 0x1F470, 0x1F3FB, 0x200D, 0x2642, 0xFE0F },
+ ["man with veil: medium skin tone"]={ 0x1F470, 0x1F3FD, 0x200D, 0x2642, 0xFE0F },
+ ["man with veil: medium-dark skin tone"]={ 0x1F470, 0x1F3FE, 0x200D, 0x2642, 0xFE0F },
+ ["man with veil: medium-light skin tone"]={ 0x1F470, 0x1F3FC, 0x200D, 0x2642, 0xFE0F },
+ ["man with white cane"]={ 0x1F468, 0x200D, 0x1F9AF },
+ ["man with white cane: dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F9AF },
+ ["man with white cane: light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F9AF },
+ ["man with white cane: medium skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F9AF },
+ ["man with white cane: medium-dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F9AF },
+ ["man with white cane: medium-light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F9AF },
["man zombie"]={ 0x1F9DF, 0x200D, 0x2642, 0xFE0F },
["man: bald"]={ 0x1F468, 0x200D, 0x1F9B2 },
["man: beard"]={ 0x1F9D4 },
@@ -1560,6 +1633,12 @@ return {
["martial arts uniform"]={ 0x1F94B },
["mate"]={ 0x1F9C9 },
["meat on bone"]={ 0x1F356 },
+ ["mechanic"]={ 0x1F9D1, 0x200D, 0x1F527 },
+ ["mechanic: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F527 },
+ ["mechanic: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F527 },
+ ["mechanic: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F527 },
+ ["mechanic: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F527 },
+ ["mechanic: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F527 },
["mechanical arm"]={ 0x1F9BE },
["mechanical leg"]={ 0x1F9BF },
["medical symbol"]={ 0x2695, 0xFE0F },
@@ -1573,15 +1652,25 @@ return {
["men holding hands: dark skin tone, medium-dark skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FE },
["men holding hands: dark skin tone, medium-light skin tone"]={ 0x1F468, 0x1F3FF, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FC },
["men holding hands: light skin tone"]={ 0x1F46C, 0x1F3FB },
+ ["men holding hands: light skin tone, dark skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FF },
+ ["men holding hands: light skin tone, medium skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FD },
+ ["men holding hands: light skin tone, medium-dark skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FE },
+ ["men holding hands: light skin tone, medium-light skin tone"]={ 0x1F468, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FC },
["men holding hands: medium skin tone"]={ 0x1F46C, 0x1F3FD },
+ ["men holding hands: medium skin tone, dark skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FF },
["men holding hands: medium skin tone, light skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FB },
+ ["men holding hands: medium skin tone, medium-dark skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FE },
["men holding hands: medium skin tone, medium-light skin tone"]={ 0x1F468, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FC },
["men holding hands: medium-dark skin tone"]={ 0x1F46C, 0x1F3FE },
+ ["men holding hands: medium-dark skin tone, dark skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FF },
["men holding hands: medium-dark skin tone, light skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FB },
["men holding hands: medium-dark skin tone, medium skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FD },
["men holding hands: medium-dark skin tone, medium-light skin tone"]={ 0x1F468, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FC },
["men holding hands: medium-light skin tone"]={ 0x1F46C, 0x1F3FC },
+ ["men holding hands: medium-light skin tone, dark skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FF },
["men holding hands: medium-light skin tone, light skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FB },
+ ["men holding hands: medium-light skin tone, medium skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FD },
+ ["men holding hands: medium-light skin tone, medium-dark skin tone"]={ 0x1F468, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F468, 0x1F3FE },
["men with bunny ears"]={ 0x1F46F, 0x200D, 0x2642, 0xFE0F },
["men wrestling"]={ 0x1F93C, 0x200D, 0x2642, 0xFE0F },
["menorah"]={ 0x1F54E },
@@ -1614,10 +1703,12 @@ return {
["middle finger: medium skin tone"]={ 0x1F595, 0x1F3FD },
["middle finger: medium-dark skin tone"]={ 0x1F595, 0x1F3FE },
["middle finger: medium-light skin tone"]={ 0x1F595, 0x1F3FC },
+ ["military helmet"]={ 0x1FA96 },
["military medal"]={ 0x1F396, 0xFE0F },
["milky way"]={ 0x1F30C },
["minibus"]={ 0x1F690 },
- ["minus sign"]={ 0x2796 },
+ ["minus"]={ 0x2796 },
+ ["mirror"]={ 0x1FA9E },
["moai"]={ 0x1F5FF },
["mobile phone"]={ 0x1F4F1 },
["mobile phone off"]={ 0x1F4F4 },
@@ -1643,6 +1734,7 @@ return {
["mountain railway"]={ 0x1F69E },
["mouse"]={ 0x1F401 },
["mouse face"]={ 0x1F42D },
+ ["mouse trap"]={ 0x1FAA4 },
["mouth"]={ 0x1F444 },
["movie camera"]={ 0x1F3A5 },
["mrs. claus"]={ 0x1F936 },
@@ -1651,13 +1743,19 @@ return {
["mrs. claus: medium skin tone"]={ 0x1F936, 0x1F3FD },
["mrs. claus: medium-dark skin tone"]={ 0x1F936, 0x1F3FE },
["mrs. claus: medium-light skin tone"]={ 0x1F936, 0x1F3FC },
- ["multiplication sign"]={ 0x2716, 0xFE0F },
+ ["multiply"]={ 0x2716, 0xFE0F },
["mushroom"]={ 0x1F344 },
["musical keyboard"]={ 0x1F3B9 },
["musical note"]={ 0x1F3B5 },
["musical notes"]={ 0x1F3B6 },
["musical score"]={ 0x1F3BC },
["muted speaker"]={ 0x1F507 },
+ ["mx claus"]={ 0x1F9D1, 0x200D, 0x1F384 },
+ ["mx claus: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F384 },
+ ["mx claus: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F384 },
+ ["mx claus: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F384 },
+ ["mx claus: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F384 },
+ ["mx claus: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F384 },
["nail polish"]={ 0x1F485 },
["nail polish: dark skin tone"]={ 0x1F485, 0x1F3FF },
["nail polish: light skin tone"]={ 0x1F485, 0x1F3FB },
@@ -1670,6 +1768,7 @@ return {
["nazar amulet"]={ 0x1F9FF },
["necktie"]={ 0x1F454 },
["nerd face"]={ 0x1F913 },
+ ["nesting dolls"]={ 0x1FA86 },
["neutral face"]={ 0x1F610 },
["new button"]={ 0x1F195 },
["new moon"]={ 0x1F311 },
@@ -1680,6 +1779,12 @@ return {
["night with stars"]={ 0x1F303 },
["nine o’clock"]={ 0x1F558 },
["nine-thirty"]={ 0x1F564 },
+ ["ninja"]={ 0x1F977 },
+ ["ninja: dark skin tone"]={ 0x1F977, 0x1F3FF },
+ ["ninja: light skin tone"]={ 0x1F977, 0x1F3FB },
+ ["ninja: medium skin tone"]={ 0x1F977, 0x1F3FD },
+ ["ninja: medium-dark skin tone"]={ 0x1F977, 0x1F3FE },
+ ["ninja: medium-light skin tone"]={ 0x1F977, 0x1F3FC },
["no bicycles"]={ 0x1F6B3 },
["no entry"]={ 0x26D4 },
["no littering"]={ 0x1F6AF },
@@ -1701,6 +1806,12 @@ return {
["octopus"]={ 0x1F419 },
["oden"]={ 0x1F362 },
["office building"]={ 0x1F3E2 },
+ ["office worker"]={ 0x1F9D1, 0x200D, 0x1F4BC },
+ ["office worker: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F4BC },
+ ["office worker: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F4BC },
+ ["office worker: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F4BC },
+ ["office worker: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F4BC },
+ ["office worker: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F4BC },
["ogre"]={ 0x1F479 },
["oil drum"]={ 0x1F6E2, 0xFE0F },
["ok button"]={ 0x1F197 },
@@ -1729,6 +1840,7 @@ return {
["older person: medium skin tone"]={ 0x1F9D3, 0x1F3FD },
["older person: medium-dark skin tone"]={ 0x1F9D3, 0x1F3FE },
["older person: medium-light skin tone"]={ 0x1F9D3, 0x1F3FC },
+ ["olive"]={ 0x1FAD2 },
["om"]={ 0x1F549, 0xFE0F },
["on! arrow"]={ 0x1F51B },
["oncoming automobile"]={ 0x1F698 },
@@ -1809,15 +1921,26 @@ return {
["people holding hands: dark skin tone, medium-dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FE },
["people holding hands: dark skin tone, medium-light skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FC },
["people holding hands: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FB },
+ ["people holding hands: light skin tone, dark skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FF },
+ ["people holding hands: light skin tone, medium skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FD },
+ ["people holding hands: light skin tone, medium-dark skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FE },
+ ["people holding hands: light skin tone, medium-light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FC },
["people holding hands: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FD },
+ ["people holding hands: medium skin tone, dark skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FF },
["people holding hands: medium skin tone, light skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FB },
+ ["people holding hands: medium skin tone, medium-dark skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FE },
["people holding hands: medium skin tone, medium-light skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FC },
["people holding hands: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FE },
+ ["people holding hands: medium-dark skin tone, dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FF },
["people holding hands: medium-dark skin tone, light skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FB },
["people holding hands: medium-dark skin tone, medium skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FD },
["people holding hands: medium-dark skin tone, medium-light skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FC },
["people holding hands: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FC },
+ ["people holding hands: medium-light skin tone, dark skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FF },
["people holding hands: medium-light skin tone, light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FB },
+ ["people holding hands: medium-light skin tone, medium skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FD },
+ ["people holding hands: medium-light skin tone, medium-dark skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F9D1, 0x1F3FE },
+ ["people hugging"]={ 0x1FAC2 },
["people with bunny ears"]={ 0x1F46F },
["people wrestling"]={ 0x1F93C },
["performing arts"]={ 0x1F3AD },
@@ -1859,6 +1982,12 @@ return {
["person facepalming: medium skin tone"]={ 0x1F926, 0x1F3FD },
["person facepalming: medium-dark skin tone"]={ 0x1F926, 0x1F3FE },
["person facepalming: medium-light skin tone"]={ 0x1F926, 0x1F3FC },
+ ["person feeding baby"]={ 0x1F9D1, 0x200D, 0x1F37C },
+ ["person feeding baby: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F37C },
+ ["person feeding baby: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F37C },
+ ["person feeding baby: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F37C },
+ ["person feeding baby: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F37C },
+ ["person feeding baby: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F37C },
["person fencing"]={ 0x1F93A },
["person frowning"]={ 0x1F64D },
["person frowning: dark skin tone"]={ 0x1F64D, 0x1F3FF },
@@ -1908,12 +2037,36 @@ return {
["person in lotus position: medium skin tone"]={ 0x1F9D8, 0x1F3FD },
["person in lotus position: medium-dark skin tone"]={ 0x1F9D8, 0x1F3FE },
["person in lotus position: medium-light skin tone"]={ 0x1F9D8, 0x1F3FC },
+ ["person in manual wheelchair"]={ 0x1F9D1, 0x200D, 0x1F9BD },
+ ["person in manual wheelchair: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F9BD },
+ ["person in manual wheelchair: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F9BD },
+ ["person in manual wheelchair: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F9BD },
+ ["person in manual wheelchair: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F9BD },
+ ["person in manual wheelchair: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F9BD },
+ ["person in motorized wheelchair"]={ 0x1F9D1, 0x200D, 0x1F9BC },
+ ["person in motorized wheelchair: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F9BC },
+ ["person in motorized wheelchair: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F9BC },
+ ["person in motorized wheelchair: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F9BC },
+ ["person in motorized wheelchair: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F9BC },
+ ["person in motorized wheelchair: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F9BC },
["person in steamy room"]={ 0x1F9D6 },
["person in steamy room: dark skin tone"]={ 0x1F9D6, 0x1F3FF },
["person in steamy room: light skin tone"]={ 0x1F9D6, 0x1F3FB },
["person in steamy room: medium skin tone"]={ 0x1F9D6, 0x1F3FD },
["person in steamy room: medium-dark skin tone"]={ 0x1F9D6, 0x1F3FE },
["person in steamy room: medium-light skin tone"]={ 0x1F9D6, 0x1F3FC },
+ ["person in suit levitating"]={ 0x1F574, 0xFE0F },
+ ["person in suit levitating: dark skin tone"]={ 0x1F574, 0x1F3FF },
+ ["person in suit levitating: light skin tone"]={ 0x1F574, 0x1F3FB },
+ ["person in suit levitating: medium skin tone"]={ 0x1F574, 0x1F3FD },
+ ["person in suit levitating: medium-dark skin tone"]={ 0x1F574, 0x1F3FE },
+ ["person in suit levitating: medium-light skin tone"]={ 0x1F574, 0x1F3FC },
+ ["person in tuxedo"]={ 0x1F935 },
+ ["person in tuxedo: dark skin tone"]={ 0x1F935, 0x1F3FF },
+ ["person in tuxedo: light skin tone"]={ 0x1F935, 0x1F3FB },
+ ["person in tuxedo: medium skin tone"]={ 0x1F935, 0x1F3FD },
+ ["person in tuxedo: medium-dark skin tone"]={ 0x1F935, 0x1F3FE },
+ ["person in tuxedo: medium-light skin tone"]={ 0x1F935, 0x1F3FC },
["person juggling"]={ 0x1F939 },
["person juggling: dark skin tone"]={ 0x1F939, 0x1F3FF },
["person juggling: light skin tone"]={ 0x1F939, 0x1F3FB },
@@ -2022,25 +2175,80 @@ return {
["person wearing turban: medium skin tone"]={ 0x1F473, 0x1F3FD },
["person wearing turban: medium-dark skin tone"]={ 0x1F473, 0x1F3FE },
["person wearing turban: medium-light skin tone"]={ 0x1F473, 0x1F3FC },
+ ["person with skullcap"]={ 0x1F472 },
+ ["person with skullcap: dark skin tone"]={ 0x1F472, 0x1F3FF },
+ ["person with skullcap: light skin tone"]={ 0x1F472, 0x1F3FB },
+ ["person with skullcap: medium skin tone"]={ 0x1F472, 0x1F3FD },
+ ["person with skullcap: medium-dark skin tone"]={ 0x1F472, 0x1F3FE },
+ ["person with skullcap: medium-light skin tone"]={ 0x1F472, 0x1F3FC },
+ ["person with veil"]={ 0x1F470 },
+ ["person with veil: dark skin tone"]={ 0x1F470, 0x1F3FF },
+ ["person with veil: light skin tone"]={ 0x1F470, 0x1F3FB },
+ ["person with veil: medium skin tone"]={ 0x1F470, 0x1F3FD },
+ ["person with veil: medium-dark skin tone"]={ 0x1F470, 0x1F3FE },
+ ["person with veil: medium-light skin tone"]={ 0x1F470, 0x1F3FC },
+ ["person with white cane"]={ 0x1F9D1, 0x200D, 0x1F9AF },
+ ["person with white cane: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F9AF },
+ ["person with white cane: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F9AF },
+ ["person with white cane: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F9AF },
+ ["person with white cane: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F9AF },
+ ["person with white cane: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F9AF },
+ ["person: bald"]={ 0x1F9D1, 0x200D, 0x1F9B2 },
["person: blond hair"]={ 0x1F471 },
+ ["person: curly hair"]={ 0x1F9D1, 0x200D, 0x1F9B1 },
["person: dark skin tone"]={ 0x1F9D1, 0x1F3FF },
+ ["person: dark skin tone, bald"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F9B2 },
["person: dark skin tone, blond hair"]={ 0x1F471, 0x1F3FF },
+ ["person: dark skin tone, curly hair"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F9B1 },
+ ["person: dark skin tone, red hair"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F9B0 },
+ ["person: dark skin tone, white hair"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F9B3 },
["person: light skin tone"]={ 0x1F9D1, 0x1F3FB },
+ ["person: light skin tone, bald"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F9B2 },
["person: light skin tone, blond hair"]={ 0x1F471, 0x1F3FB },
+ ["person: light skin tone, curly hair"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F9B1 },
+ ["person: light skin tone, red hair"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F9B0 },
+ ["person: light skin tone, white hair"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F9B3 },
["person: medium skin tone"]={ 0x1F9D1, 0x1F3FD },
+ ["person: medium skin tone, bald"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F9B2 },
["person: medium skin tone, blond hair"]={ 0x1F471, 0x1F3FD },
+ ["person: medium skin tone, curly hair"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F9B1 },
+ ["person: medium skin tone, red hair"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F9B0 },
+ ["person: medium skin tone, white hair"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F9B3 },
["person: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE },
+ ["person: medium-dark skin tone, bald"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F9B2 },
["person: medium-dark skin tone, blond hair"]={ 0x1F471, 0x1F3FE },
+ ["person: medium-dark skin tone, curly hair"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F9B1 },
+ ["person: medium-dark skin tone, red hair"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F9B0 },
+ ["person: medium-dark skin tone, white hair"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F9B3 },
["person: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC },
+ ["person: medium-light skin tone, bald"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F9B2 },
["person: medium-light skin tone, blond hair"]={ 0x1F471, 0x1F3FC },
+ ["person: medium-light skin tone, curly hair"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F9B1 },
+ ["person: medium-light skin tone, red hair"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F9B0 },
+ ["person: medium-light skin tone, white hair"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F9B3 },
+ ["person: red hair"]={ 0x1F9D1, 0x200D, 0x1F9B0 },
+ ["person: white hair"]={ 0x1F9D1, 0x200D, 0x1F9B3 },
["petri dish"]={ 0x1F9EB },
["pick"]={ 0x26CF, 0xFE0F },
+ ["pickup truck"]={ 0x1F6FB },
["pie"]={ 0x1F967 },
["pig"]={ 0x1F416 },
["pig face"]={ 0x1F437 },
["pig nose"]={ 0x1F43D },
["pile of poo"]={ 0x1F4A9 },
["pill"]={ 0x1F48A },
+ ["pilot"]={ 0x1F9D1, 0x200D, 0x2708, 0xFE0F },
+ ["pilot: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x2708, 0xFE0F },
+ ["pilot: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x2708, 0xFE0F },
+ ["pilot: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x2708, 0xFE0F },
+ ["pilot: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x2708, 0xFE0F },
+ ["pilot: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x2708, 0xFE0F },
+ ["pinched fingers"]={ 0x1F90C },
+ ["pinched fingers: dark skin tone"]={ 0x1F90C, 0x1F3FF },
+ ["pinched fingers: light skin tone"]={ 0x1F90C, 0x1F3FB },
+ ["pinched fingers: medium skin tone"]={ 0x1F90C, 0x1F3FD },
+ ["pinched fingers: medium-dark skin tone"]={ 0x1F90C, 0x1F3FE },
+ ["pinched fingers: medium-light skin tone"]={ 0x1F90C, 0x1F3FC },
["pinching hand"]={ 0x1F90F },
["pinching hand: dark skin tone"]={ 0x1F90F, 0x1F3FF },
["pinching hand: light skin tone"]={ 0x1F90F, 0x1F3FB },
@@ -2054,11 +2262,15 @@ return {
["pisces"]={ 0x2653 },
["pistol"]={ 0x1F52B },
["pizza"]={ 0x1F355 },
+ ["piñata"]={ 0x1FA85 },
+ ["placard"]={ 0x1FAA7 },
["place of worship"]={ 0x1F6D0 },
["play button"]={ 0x25B6, 0xFE0F },
["play or pause button"]={ 0x23EF, 0xFE0F },
["pleading face"]={ 0x1F97A },
- ["plus sign"]={ 0x2795 },
+ ["plunger"]={ 0x1FAA0 },
+ ["plus"]={ 0x2795 },
+ ["polar bear"]={ 0x1F43B, 0x200D, 0x2744, 0xFE0F },
["police car"]={ 0x1F693 },
["police car light"]={ 0x1F6A8 },
["police officer"]={ 0x1F46E },
@@ -2076,6 +2288,7 @@ return {
["pot of food"]={ 0x1F372 },
["potable water"]={ 0x1F6B0 },
["potato"]={ 0x1F954 },
+ ["potted plant"]={ 0x1FAB4 },
["poultry leg"]={ 0x1F357 },
["pound banknote"]={ 0x1F4B7 },
["pouting cat"]={ 0x1F63E },
@@ -2101,7 +2314,6 @@ return {
["princess: medium-dark skin tone"]={ 0x1F478, 0x1F3FE },
["princess: medium-light skin tone"]={ 0x1F478, 0x1F3FC },
["printer"]={ 0x1F5A8, 0xFE0F },
- ["probing cane"]={ 0x1F9AF },
["prohibited"]={ 0x1F6AB },
["purple circle"]={ 0x1F7E3 },
["purple heart"]={ 0x1F49C },
@@ -2187,10 +2399,12 @@ return {
["ringed planet"]={ 0x1FA90 },
["roasted sweet potato"]={ 0x1F360 },
["robot"]={ 0x1F916 },
+ ["rock"]={ 0x1FAA8 },
["rocket"]={ 0x1F680 },
["roll of paper"]={ 0x1F9FB },
["rolled-up newspaper"]={ 0x1F5DE, 0xFE0F },
["roller coaster"]={ 0x1F3A2 },
+ ["roller skate"]={ 0x1F6FC },
["rolling on the floor laughing"]={ 0x1F923 },
["rooster"]={ 0x1F413 },
["rose"]={ 0x1F339 },
@@ -2220,10 +2434,18 @@ return {
["saxophone"]={ 0x1F3B7 },
["scarf"]={ 0x1F9E3 },
["school"]={ 0x1F3EB },
+ ["scientist"]={ 0x1F9D1, 0x200D, 0x1F52C },
+ ["scientist: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F52C },
+ ["scientist: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F52C },
+ ["scientist: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F52C },
+ ["scientist: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F52C },
+ ["scientist: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F52C },
["scissors"]={ 0x2702, 0xFE0F },
["scorpio"]={ 0x264F },
["scorpion"]={ 0x1F982 },
+ ["screwdriver"]={ 0x1FA9B },
["scroll"]={ 0x1F4DC },
+ ["seal"]={ 0x1F9AD },
["seat"]={ 0x1F4BA },
["see-no-evil monkey"]={ 0x1F648 },
["seedling"]={ 0x1F331 },
@@ -2236,6 +2458,7 @@ return {
["service dog"]={ 0x1F415, 0x200D, 0x1F9BA },
["seven o’clock"]={ 0x1F556 },
["seven-thirty"]={ 0x1F562 },
+ ["sewing needle"]={ 0x1FAA1 },
["shallow pan of food"]={ 0x1F958 },
["shamrock"]={ 0x2618, 0xFE0F },
["shark"]={ 0x1F988 },
@@ -2259,6 +2482,12 @@ return {
["sign of the horns: medium skin tone"]={ 0x1F918, 0x1F3FD },
["sign of the horns: medium-dark skin tone"]={ 0x1F918, 0x1F3FE },
["sign of the horns: medium-light skin tone"]={ 0x1F918, 0x1F3FC },
+ ["singer"]={ 0x1F9D1, 0x200D, 0x1F3A4 },
+ ["singer: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F3A4 },
+ ["singer: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F3A4 },
+ ["singer: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F3A4 },
+ ["singer: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F3A4 },
+ ["singer: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F3A4 },
["six o’clock"]={ 0x1F555 },
["six-thirty"]={ 0x1F561 },
["skateboard"]={ 0x1F6F9 },
@@ -2285,6 +2514,7 @@ return {
["smiling face with horns"]={ 0x1F608 },
["smiling face with smiling eyes"]={ 0x1F60A },
["smiling face with sunglasses"]={ 0x1F60E },
+ ["smiling face with tear"]={ 0x1F972 },
["smirking face"]={ 0x1F60F },
["snail"]={ 0x1F40C },
["snake"]={ 0x1F40D },
@@ -2345,6 +2575,12 @@ return {
["stopwatch"]={ 0x23F1, 0xFE0F },
["straight ruler"]={ 0x1F4CF },
["strawberry"]={ 0x1F353 },
+ ["student"]={ 0x1F9D1, 0x200D, 0x1F393 },
+ ["student: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F393 },
+ ["student: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F393 },
+ ["student: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F393 },
+ ["student: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F393 },
+ ["student: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F393 },
["studio microphone"]={ 0x1F399, 0xFE0F },
["stuffed flatbread"]={ 0x1F959 },
["sun"]={ 0x2600, 0xFE0F },
@@ -2374,19 +2610,32 @@ return {
["suspension railway"]={ 0x1F69F },
["swan"]={ 0x1F9A2 },
["sweat droplets"]={ 0x1F4A6 },
- ["swim brief"]={ 0x1FA72 },
["synagogue"]={ 0x1F54D },
["syringe"]={ 0x1F489 },
["t-rex"]={ 0x1F996 },
["t-shirt"]={ 0x1F455 },
["taco"]={ 0x1F32E },
["takeout box"]={ 0x1F961 },
+ ["tamale"]={ 0x1FAD4 },
["tanabata tree"]={ 0x1F38B },
["tangerine"]={ 0x1F34A },
["taurus"]={ 0x2649 },
["taxi"]={ 0x1F695 },
+ ["teacher"]={ 0x1F9D1, 0x200D, 0x1F3EB },
+ ["teacher: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F3EB },
+ ["teacher: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F3EB },
+ ["teacher: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F3EB },
+ ["teacher: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F3EB },
+ ["teacher: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F3EB },
["teacup without handle"]={ 0x1F375 },
+ ["teapot"]={ 0x1FAD6 },
["tear-off calendar"]={ 0x1F4C6 },
+ ["technologist"]={ 0x1F9D1, 0x200D, 0x1F4BB },
+ ["technologist: dark skin tone"]={ 0x1F9D1, 0x1F3FF, 0x200D, 0x1F4BB },
+ ["technologist: light skin tone"]={ 0x1F9D1, 0x1F3FB, 0x200D, 0x1F4BB },
+ ["technologist: medium skin tone"]={ 0x1F9D1, 0x1F3FD, 0x200D, 0x1F4BB },
+ ["technologist: medium-dark skin tone"]={ 0x1F9D1, 0x1F3FE, 0x200D, 0x1F4BB },
+ ["technologist: medium-light skin tone"]={ 0x1F9D1, 0x1F3FC, 0x200D, 0x1F4BB },
["teddy bear"]={ 0x1F9F8 },
["telephone"]={ 0x260E, 0xFE0F },
["telephone receiver"]={ 0x1F4DE },
@@ -2399,6 +2648,7 @@ return {
["test tube"]={ 0x1F9EA },
["thermometer"]={ 0x1F321, 0xFE0F },
["thinking face"]={ 0x1F914 },
+ ["thong sandal"]={ 0x1FA74 },
["thought balloon"]={ 0x1F4AD },
["thread"]={ 0x1F9F5 },
["three o’clock"]={ 0x1F552 },
@@ -2426,6 +2676,7 @@ return {
["tongue"]={ 0x1F445 },
["toolbox"]={ 0x1F9F0 },
["tooth"]={ 0x1F9B7 },
+ ["toothbrush"]={ 0x1FAA5 },
["top arrow"]={ 0x1F51D },
["top hat"]={ 0x1F3A9 },
["tornado"]={ 0x1F32A, 0xFE0F },
@@ -2435,6 +2686,8 @@ return {
["train"]={ 0x1F686 },
["tram"]={ 0x1F68A },
["tram car"]={ 0x1F68B },
+ ["transgender flag"]={ 0x1F3F3, 0xFE0F, 0x200D, 0x26A7, 0xFE0F },
+ ["transgender symbol"]={ 0x26A7, 0xFE0F },
["triangular flag"]={ 0x1F6A9 },
["triangular ruler"]={ 0x1F4D0 },
["trident emblem"]={ 0x1F531 },
@@ -2519,6 +2772,7 @@ return {
["whale"]={ 0x1F40B },
["wheel of dharma"]={ 0x2638, 0xFE0F },
["wheelchair symbol"]={ 0x267F },
+ ["white cane"]={ 0x1F9AF },
["white circle"]={ 0x26AA },
["white exclamation mark"]={ 0x2755 },
["white flag"]={ 0x1F3F3, 0xFE0F },
@@ -2533,6 +2787,7 @@ return {
["wilted flower"]={ 0x1F940 },
["wind chime"]={ 0x1F390 },
["wind face"]={ 0x1F32C, 0xFE0F },
+ ["window"]={ 0x1FA9F },
["wine glass"]={ 0x1F377 },
["winking face"]={ 0x1F609 },
["winking face with tongue"]={ 0x1F61C },
@@ -2660,6 +2915,12 @@ return {
["woman farmer: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F33E },
["woman farmer: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F33E },
["woman farmer: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F33E },
+ ["woman feeding baby"]={ 0x1F469, 0x200D, 0x1F37C },
+ ["woman feeding baby: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F37C },
+ ["woman feeding baby: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F37C },
+ ["woman feeding baby: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F37C },
+ ["woman feeding baby: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F37C },
+ ["woman feeding baby: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F37C },
["woman firefighter"]={ 0x1F469, 0x200D, 0x1F692 },
["woman firefighter: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F692 },
["woman firefighter: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F692 },
@@ -2739,6 +3000,12 @@ return {
["woman in steamy room: medium skin tone"]={ 0x1F9D6, 0x1F3FD, 0x200D, 0x2640, 0xFE0F },
["woman in steamy room: medium-dark skin tone"]={ 0x1F9D6, 0x1F3FE, 0x200D, 0x2640, 0xFE0F },
["woman in steamy room: medium-light skin tone"]={ 0x1F9D6, 0x1F3FC, 0x200D, 0x2640, 0xFE0F },
+ ["woman in tuxedo"]={ 0x1F935, 0x200D, 0x2640, 0xFE0F },
+ ["woman in tuxedo: dark skin tone"]={ 0x1F935, 0x1F3FF, 0x200D, 0x2640, 0xFE0F },
+ ["woman in tuxedo: light skin tone"]={ 0x1F935, 0x1F3FB, 0x200D, 0x2640, 0xFE0F },
+ ["woman in tuxedo: medium skin tone"]={ 0x1F935, 0x1F3FD, 0x200D, 0x2640, 0xFE0F },
+ ["woman in tuxedo: medium-dark skin tone"]={ 0x1F935, 0x1F3FE, 0x200D, 0x2640, 0xFE0F },
+ ["woman in tuxedo: medium-light skin tone"]={ 0x1F935, 0x1F3FC, 0x200D, 0x2640, 0xFE0F },
["woman judge"]={ 0x1F469, 0x200D, 0x2696, 0xFE0F },
["woman judge: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x2696, 0xFE0F },
["woman judge: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x2696, 0xFE0F },
@@ -2931,12 +3198,18 @@ return {
["woman with headscarf: medium skin tone"]={ 0x1F9D5, 0x1F3FD },
["woman with headscarf: medium-dark skin tone"]={ 0x1F9D5, 0x1F3FE },
["woman with headscarf: medium-light skin tone"]={ 0x1F9D5, 0x1F3FC },
- ["woman with probing cane"]={ 0x1F469, 0x200D, 0x1F9AF },
- ["woman with probing cane: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F9AF },
- ["woman with probing cane: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F9AF },
- ["woman with probing cane: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F9AF },
- ["woman with probing cane: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F9AF },
- ["woman with probing cane: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F9AF },
+ ["woman with veil"]={ 0x1F470, 0x200D, 0x2640, 0xFE0F },
+ ["woman with veil: dark skin tone"]={ 0x1F470, 0x1F3FF, 0x200D, 0x2640, 0xFE0F },
+ ["woman with veil: light skin tone"]={ 0x1F470, 0x1F3FB, 0x200D, 0x2640, 0xFE0F },
+ ["woman with veil: medium skin tone"]={ 0x1F470, 0x1F3FD, 0x200D, 0x2640, 0xFE0F },
+ ["woman with veil: medium-dark skin tone"]={ 0x1F470, 0x1F3FE, 0x200D, 0x2640, 0xFE0F },
+ ["woman with veil: medium-light skin tone"]={ 0x1F470, 0x1F3FC, 0x200D, 0x2640, 0xFE0F },
+ ["woman with white cane"]={ 0x1F469, 0x200D, 0x1F9AF },
+ ["woman with white cane: dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F9AF },
+ ["woman with white cane: light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F9AF },
+ ["woman with white cane: medium skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F9AF },
+ ["woman with white cane: medium-dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F9AF },
+ ["woman with white cane: medium-light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F9AF },
["woman zombie"]={ 0x1F9DF, 0x200D, 0x2640, 0xFE0F },
["woman: bald"]={ 0x1F469, 0x200D, 0x1F9B2 },
["woman: blond hair"]={ 0x1F471, 0x200D, 0x2640, 0xFE0F },
@@ -2984,20 +3257,32 @@ return {
["women holding hands: dark skin tone, medium-dark skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FE },
["women holding hands: dark skin tone, medium-light skin tone"]={ 0x1F469, 0x1F3FF, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FC },
["women holding hands: light skin tone"]={ 0x1F46D, 0x1F3FB },
+ ["women holding hands: light skin tone, dark skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FF },
+ ["women holding hands: light skin tone, medium skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FD },
+ ["women holding hands: light skin tone, medium-dark skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FE },
+ ["women holding hands: light skin tone, medium-light skin tone"]={ 0x1F469, 0x1F3FB, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FC },
["women holding hands: medium skin tone"]={ 0x1F46D, 0x1F3FD },
+ ["women holding hands: medium skin tone, dark skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FF },
["women holding hands: medium skin tone, light skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FB },
+ ["women holding hands: medium skin tone, medium-dark skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FE },
["women holding hands: medium skin tone, medium-light skin tone"]={ 0x1F469, 0x1F3FD, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FC },
["women holding hands: medium-dark skin tone"]={ 0x1F46D, 0x1F3FE },
+ ["women holding hands: medium-dark skin tone, dark skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FF },
["women holding hands: medium-dark skin tone, light skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FB },
["women holding hands: medium-dark skin tone, medium skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FD },
["women holding hands: medium-dark skin tone, medium-light skin tone"]={ 0x1F469, 0x1F3FE, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FC },
["women holding hands: medium-light skin tone"]={ 0x1F46D, 0x1F3FC },
+ ["women holding hands: medium-light skin tone, dark skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FF },
["women holding hands: medium-light skin tone, light skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FB },
+ ["women holding hands: medium-light skin tone, medium skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FD },
+ ["women holding hands: medium-light skin tone, medium-dark skin tone"]={ 0x1F469, 0x1F3FC, 0x200D, 0x1F91D, 0x200D, 0x1F469, 0x1F3FE },
["women with bunny ears"]={ 0x1F46F, 0x200D, 0x2640, 0xFE0F },
["women wrestling"]={ 0x1F93C, 0x200D, 0x2640, 0xFE0F },
["women’s room"]={ 0x1F6BA },
+ ["wood"]={ 0x1FAB5 },
["woozy face"]={ 0x1F974 },
["world map"]={ 0x1F5FA, 0xFE0F },
+ ["worm"]={ 0x1FAB1 },
["worried face"]={ 0x1F61F },
["wrapped gift"]={ 0x1F381 },
["wrench"]={ 0x1F527 },
diff --git a/Master/texmf-dist/tex/context/base/mkiv/char-fio.lua b/Master/texmf-dist/tex/context/base/mkiv/char-fio.lua
index 9939bf04143..b1f652eedb0 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/char-fio.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/char-fio.lua
@@ -92,7 +92,11 @@ directives.register("filters.utf.reorder", function(v) configure("characters.f
directives.register("filters.utf.collapse", function(v) configure("characters.filters.utf.collapse", v) end)
directives.register("filters.utf.decompose", function(v) configure("characters.filters.utf.decompose",v) end)
-utffilters.setskippable { "mkiv", "mkvi", "mkix", "mkxi" }
+utffilters.setskippable {
+ "mkiv", "mkvi",
+ "mkix", "mkxi",
+ "mkxl", "mklx",
+}
interfaces.implement {
name = "enableutf",
diff --git a/Master/texmf-dist/tex/context/base/mkiv/char-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/char-ini.lua
index fb9d9f126e4..1d202c8d42d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/char-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/char-ini.lua
@@ -192,6 +192,7 @@ insert(characters.ranges,{
end,
})
+
local blocks = allocate {
["adlam"] = { first = 0x1E900, last = 0x1E95F, description = "Adlam" },
["aegeannumbers"] = { first = 0x10100, last = 0x1013F, description = "Aegean Numbers" },
@@ -297,12 +298,14 @@ local blocks = allocate {
-- ["digitsthai"] = { first = 0x00E50, last = 0x00E59, math = true },
-- ["digitstibetan"] = { first = 0x00F20, last = 0x00F29, math = true },
["dingbats"] = { first = 0x02700, last = 0x027BF, description = "Dingbats" },
- ["dogra"] = { first = 0x11800, last = 0x1184F, description = "Dogra" },
+ ["dogra"] = { first = 0x11800, last = 0x1184F, description = "Dogra" },
["dominotiles"] = { first = 0x1F030, last = 0x1F09F, description = "Domino Tiles" },
["duployan"] = { first = 0x1BC00, last = 0x1BC9F, description = "Duployan" },
["earlydynasticcuneiform"] = { first = 0x12480, last = 0x1254F, description = "Early Dynastic Cuneiform" },
+ ["egyptianhieroglyphformatcontrols"] = { first = 0x13430, last = 0x1343F, description = "Egyptian Hieroglyph Format Controls" },
["egyptianhieroglyphs"] = { first = 0x13000, last = 0x1342F, description = "Egyptian Hieroglyphs" },
["elbasan"] = { first = 0x10500, last = 0x1052F, description = "Elbasan" },
+ ["elymaic"] = { first = 0x10FE0, last = 0x10FFF, description = "Elymaic" },
["emoticons"] = { first = 0x1F600, last = 0x1F64F, description = "Emoticons" },
["enclosedalphanumerics"] = { first = 0x02460, last = 0x024FF, description = "Enclosed Alphanumerics" },
["enclosedalphanumericsupplement"] = { first = 0x1F100, last = 0x1F1FF, description = "Enclosed Alphanumeric Supplement" },
@@ -316,7 +319,7 @@ local blocks = allocate {
["geometricshapes"] = { first = 0x025A0, last = 0x025FF, math = true, description = "Geometric Shapes" },
["geometricshapesextended"] = { first = 0x1F780, last = 0x1F7FF, description = "Geometric Shapes Extended" },
["georgian"] = { first = 0x010A0, last = 0x010FF, otf="geor", description = "Georgian" },
- ["georgianextended"] = { first = 0x01C90, last = 0x01CBF, description = "Georgian Extended" },
+ ["georgianextended"] = { first = 0x01C90, last = 0x01CBF, description = "Georgian Extended" },
["georgiansupplement"] = { first = 0x02D00, last = 0x02D2F, otf="geor", description = "Georgian Supplement" },
["glagolitic"] = { first = 0x02C00, last = 0x02C5F, otf="glag", description = "Glagolitic" },
["glagoliticsupplement"] = { first = 0x1E000, last = 0x1E02F, description = "Glagolitic Supplement" },
@@ -325,7 +328,7 @@ local blocks = allocate {
["greekandcoptic"] = { first = 0x00370, last = 0x003FF, otf="grek", description = "Greek and Coptic" },
["greekextended"] = { first = 0x01F00, last = 0x01FFF, otf="grek", description = "Greek Extended" },
["gujarati"] = { first = 0x00A80, last = 0x00AFF, otf="gujr", description = "Gujarati" },
- ["gunjalagondi"] = { first = 0x11D60, last = 0x11DAF, description = "Gunjala Gondi" },
+ ["gunjalagondi"] = { first = 0x11D60, last = 0x11DAF, description = "Gunjala Gondi" },
["gurmukhi"] = { first = 0x00A00, last = 0x00A7F, otf="guru", description = "Gurmukhi" },
["halfwidthandfullwidthforms"] = { first = 0x0FF00, last = 0x0FFEF, description = "Halfwidth and Fullwidth Forms" },
["hangulcompatibilityjamo"] = { first = 0x03130, last = 0x0318F, otf="jamo", description = "Hangul Compatibility Jamo" },
@@ -333,7 +336,7 @@ local blocks = allocate {
["hanguljamoextendeda"] = { first = 0x0A960, last = 0x0A97F, description = "Hangul Jamo Extended-A" },
["hanguljamoextendedb"] = { first = 0x0D7B0, last = 0x0D7FF, description = "Hangul Jamo Extended-B" },
["hangulsyllables"] = { first = 0x0AC00, last = 0x0D7AF, otf="hang", description = "Hangul Syllables" },
- ["hanifirohingya"] = { first = 0x10D00, last = 0x10D3F, description = "Hanifi Rohingya" },
+ ["hanifirohingya"] = { first = 0x10D00, last = 0x10D3F, description = "Hanifi Rohingya" },
["hanunoo"] = { first = 0x01720, last = 0x0173F, otf="hano", description = "Hanunoo" },
["hatran"] = { first = 0x108E0, last = 0x108FF, description = "Hatran" },
["hebrew"] = { first = 0x00590, last = 0x005FF, otf="hebr", description = "Hebrew" },
@@ -343,7 +346,7 @@ local blocks = allocate {
["ideographicdescriptioncharacters"] = { first = 0x02FF0, last = 0x02FFF, description = "Ideographic Description Characters" },
["ideographicsymbolsandpunctuation"] = { first = 0x16FE0, last = 0x16FFF, description = "Ideographic Symbols and Punctuation" },
["imperialaramaic"] = { first = 0x10840, last = 0x1085F, description = "Imperial Aramaic" },
- ["indicsiyaqnumbers"] = { first = 0x1EC70, last = 0x1ECBF, description = "Indic Siyaq Numbers" },
+ ["indicsiyaqnumbers"] = { first = 0x1EC70, last = 0x1ECBF, description = "Indic Siyaq Numbers" },
["inscriptionalpahlavi"] = { first = 0x10B60, last = 0x10B7F, description = "Inscriptional Pahlavi" },
["inscriptionalparthian"] = { first = 0x10B40, last = 0x10B5F, description = "Inscriptional Parthian" },
["ipaextensions"] = { first = 0x00250, last = 0x002AF, description = "IPA Extensions" },
@@ -402,7 +405,7 @@ local blocks = allocate {
["lydian"] = { first = 0x10920, last = 0x1093F, description = "Lydian" },
["mahajani"] = { first = 0x11150, last = 0x1117F, description = "Mahajani" },
["mahjongtiles"] = { first = 0x1F000, last = 0x1F02F, description = "Mahjong Tiles" },
- ["makasar"] = { first = 0x11EE0, last = 0x11EFF, description = "Makasar" },
+ ["makasar"] = { first = 0x11EE0, last = 0x11EFF, description = "Makasar" },
["malayalam"] = { first = 0x00D00, last = 0x00D7F, otf="mlym", description = "Malayalam" },
["mandaic"] = { first = 0x00840, last = 0x0085F, otf="mand", description = "Mandaic" },
["manichaean"] = { first = 0x10AC0, last = 0x10AFF, description = "Manichaean" },
@@ -410,8 +413,8 @@ local blocks = allocate {
["masaramgondi"] = { first = 0x11D00, last = 0x11D5F, description = "Masaram Gondi" },
["mathematicalalphanumericsymbols"] = { first = 0x1D400, last = 0x1D7FF, math = true, description = "Mathematical Alphanumeric Symbols" },
["mathematicaloperators"] = { first = 0x02200, last = 0x022FF, math = true, description = "Mathematical Operators" },
- ["mayannumerals"] = { first = 0x1D2E0, last = 0x1D2FF, description = "Mayan Numerals" },
- ["medefaidrin"] = { first = 0x16E40, last = 0x16E9F, description = "Medefaidrin" },
+ ["mayannumerals"] = { first = 0x1D2E0, last = 0x1D2FF, description = "Mayan Numerals" },
+ ["medefaidrin"] = { first = 0x16E40, last = 0x16E9F, description = "Medefaidrin" },
["meeteimayek"] = { first = 0x0ABC0, last = 0x0ABFF, description = "Meetei Mayek" },
["meeteimayekextensions"] = { first = 0x0AAE0, last = 0x0AAFF, description = "Meetei Mayek Extensions" },
["mendekikakui"] = { first = 0x1E800, last = 0x1E8DF, description = "Mende Kikakui" },
@@ -435,11 +438,13 @@ local blocks = allocate {
["myanmarextendeda"] = { first = 0x0AA60, last = 0x0AA7F, description = "Myanmar Extended-A" },
["myanmarextendedb"] = { first = 0x0A9E0, last = 0x0A9FF, description = "Myanmar Extended-B" },
["nabataean"] = { first = 0x10880, last = 0x108AF, description = "Nabataean" },
+ ["nandinagari"] = { first = 0x119A0, last = 0x119FF, description = "Nandinagari" },
["newa"] = { first = 0x11400, last = 0x1147F, description = "Newa" },
["newtailue"] = { first = 0x01980, last = 0x019DF, description = "New Tai Lue" },
["nko"] = { first = 0x007C0, last = 0x007FF, otf="nko", description = "NKo" },
["numberforms"] = { first = 0x02150, last = 0x0218F, description = "Number Forms" },
["nushu"] = { first = 0x1B170, last = 0x1B2FF, description = "Nushu" },
+ ["nyiakengpuachuehmong"] = { first = 0x1E100, last = 0x1E14F, description = "Nyiakeng Puachue Hmong" },
["ogham"] = { first = 0x01680, last = 0x0169F, otf="ogam", description = "Ogham" },
["olchiki"] = { first = 0x01C50, last = 0x01C7F, description = "Ol Chiki" },
["oldhungarian"] = { first = 0x10C80, last = 0x10CFF, description = "Old Hungarian" },
@@ -447,7 +452,7 @@ local blocks = allocate {
["oldnortharabian"] = { first = 0x10A80, last = 0x10A9F, description = "Old North Arabian" },
["oldpermic"] = { first = 0x10350, last = 0x1037F, description = "Old Permic" },
["oldpersian"] = { first = 0x103A0, last = 0x103DF, otf="xpeo", description = "Old Persian" },
- ["oldsogdian"] = { first = 0x10F00, last = 0x10F2F, description = "Old Sogdian" },
+ ["oldsogdian"] = { first = 0x10F00, last = 0x10F2F, description = "Old Sogdian" },
["oldsoutharabian"] = { first = 0x10A60, last = 0x10A7F, description = "Old South Arabian" },
["oldturkic"] = { first = 0x10C00, last = 0x10C4F, description = "Old Turkic" },
["opticalcharacterrecognition"] = { first = 0x02440, last = 0x0245F, description = "Optical Character Recognition" },
@@ -455,6 +460,7 @@ local blocks = allocate {
["ornamentaldingbats"] = { first = 0x1F650, last = 0x1F67F, description = "Ornamental Dingbats" },
["osage"] = { first = 0x104B0, last = 0x104FF, description = "Osage" },
["osmanya"] = { first = 0x10480, last = 0x104AF, otf="osma", description = "Osmanya" },
+ ["ottomansiyaqnumbers"] = { first = 0x1ED00, last = 0x1ED4F, description = "Ottoman Siyaq Numbers" },
["pahawhhmong"] = { first = 0x16B00, last = 0x16B8F, description = "Pahawh Hmong" },
["palmyrene"] = { first = 0x10860, last = 0x1087F, description = "Palmyrene" },
["paucinhau"] = { first = 0x11AC0, last = 0x11AFF, description = "Pau Cin Hau" },
@@ -478,7 +484,8 @@ local blocks = allocate {
["sinhala"] = { first = 0x00D80, last = 0x00DFF, otf="sinh", description = "Sinhala" },
["sinhalaarchaicnumbers"] = { first = 0x111E0, last = 0x111FF, description = "Sinhala Archaic Numbers" },
["smallformvariants"] = { first = 0x0FE50, last = 0x0FE6F, description = "Small Form Variants" },
- ["sogdian"] = { first = 0x10F30, last = 0x10F6F, description = "Sogdian" },
+ ["smallkanaextension"] = { first = 0x1B130, last = 0x1B16F, description = "Small Kana Extension" },
+ ["sogdian"] = { first = 0x10F30, last = 0x10F6F, description = "Sogdian" },
["sorasompeng"] = { first = 0x110D0, last = 0x110FF, description = "Sora Sompeng" },
["soyombo"] = { first = 0x11A50, last = 0x11AAF, description = "Soyombo" },
["spacingmodifierletters"] = { first = 0x002B0, last = 0x002FF, description = "Spacing Modifier Letters" },
@@ -496,6 +503,7 @@ local blocks = allocate {
["supplementaryprivateuseareab"] = { first = 0x100000,last = 0x10FFFF, description = "Supplementary Private Use Area-B" },
["suttonsignwriting"] = { first = 0x1D800, last = 0x1DAAF, description = "Sutton SignWriting" },
["sylotinagri"] = { first = 0x0A800, last = 0x0A82F, otf="sylo", description = "Syloti Nagri" },
+ ["symbolsandpictographsextendeda"] = { first = 0x1FA70, last = 0x1FAFF, description = "Symbols and Pictographs Extended-A" },
["syriac"] = { first = 0x00700, last = 0x0074F, otf="syrc", description = "Syriac" },
["syriacsupplement"] = { first = 0x00860, last = 0x0086F, description = "Syriac Supplement" },
["tagalog"] = { first = 0x01700, last = 0x0171F, otf="tglg", description = "Tagalog" },
@@ -507,6 +515,7 @@ local blocks = allocate {
["taixuanjingsymbols"] = { first = 0x1D300, last = 0x1D35F, description = "Tai Xuan Jing Symbols" },
["takri"] = { first = 0x11680, last = 0x116CF, description = "Takri" },
["tamil"] = { first = 0x00B80, last = 0x00BFF, otf="taml", description = "Tamil" },
+ ["tamilsupplement"] = { first = 0x11FC0, last = 0x11FFF, description = "Tamil Supplement" },
["tangut"] = { first = 0x17000, last = 0x187FF, description = "Tangut" },
["tangutcomponents"] = { first = 0x18800, last = 0x18AFF, description = "Tangut Components" },
["telugu"] = { first = 0x00C00, last = 0x00C7F, otf="telu", description = "Telugu" },
@@ -544,6 +553,7 @@ local blocks = allocate {
["variationselectorssupplement"] = { first = 0xE0100, last = 0xE01EF, description = "Variation Selectors Supplement" },
["vedicextensions"] = { first = 0x01CD0, last = 0x01CFF, description = "Vedic Extensions" },
["verticalforms"] = { first = 0x0FE10, last = 0x0FE1F, description = "Vertical Forms" },
+ ["wancho"] = { first = 0x1E2C0, last = 0x1E2FF, description = "Wancho" },
["warangciti"] = { first = 0x118A0, last = 0x118FF, description = "Warang Citi" },
["yijinghexagramsymbols"] = { first = 0x04DC0, last = 0x04DFF, otf="yi", description = "Yijing Hexagram Symbols" },
["yiradicals"] = { first = 0x0A490, last = 0x0A4CF, otf="yi", description = "Yi Radicals" },
@@ -1516,7 +1526,7 @@ do
)^1)
local function load()
- local name = resolvers.find_file("char-emj.lua")
+ local name = resolvers.findfile("char-emj.lua")
local data = name and name ~= "" and dofile(name) or { }
local hash = { }
for d, c in next, data do
diff --git a/Master/texmf-dist/tex/context/base/mkiv/char-tex.lua b/Master/texmf-dist/tex/context/base/mkiv/char-tex.lua
index bbaf11875d0..b361a9a0776 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/char-tex.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/char-tex.lua
@@ -692,7 +692,6 @@ if not csletters then
else
mark(csletters)
-
end
lpegpatterns.csletter = utfchartabletopattern(csletters)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/chem-str.lua b/Master/texmf-dist/tex/context/base/mkiv/chem-str.lua
index 9f0738fc516..1316769cac5 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/chem-str.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/chem-str.lua
@@ -69,7 +69,8 @@ local chemistry = chemistry
chemistry.instance = "chemistry"
chemistry.format = "metafun"
chemistry.method = "double"
-chemistry.structures = 0
+
+local nofstructures = 0
local common_keys = {
b = "line",
@@ -739,7 +740,7 @@ function chemistry.start(settings)
return
end
--
- chemistry.structures = chemistry.structures + 1
+ nofstructures = nofstructures + 1
--
rotation = tonumber(rotation) or 0
--
@@ -749,7 +750,7 @@ function chemistry.start(settings)
report_chemistry("%s scale %a, rotation %a, width %s, height %s, left %s, right %s, top %s, bottom %s","used",scale,rotation,width,height,left,right,top,bottom)
end
metacode[#metacode+1] = f_start_structure(
- chemistry.structures,
+ nofstructures,
left, right, top, bottom,
rotation, topoints(unit), bondlength, scale, topoints(offset),
tostring(settings.axis == v_on), topoints(rulethickness), axiscolor
@@ -788,8 +789,8 @@ function chemistry.component(spec,text,rulethickness,rulecolor)
end
statistics.register("chemical formulas", function()
- if chemistry.structures > 0 then
- return format("%s chemical structure formulas",chemistry.structures) -- no timing needed, part of metapost
+ if nofstructures > 0 then
+ return format("%s chemical structure formulas",nofstructures) -- no timing needed, part of metapost
end
end)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cldf-bas.lua b/Master/texmf-dist/tex/context/base/mkiv/cldf-bas.lua
index f55132a0612..9e789a72fe8 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/cldf-bas.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/cldf-bas.lua
@@ -193,34 +193,12 @@ context.registers = {
newchar = function(name,u) context([[\chardef\%s=%s\relax]],name,u) end,
}
-do
-
- if CONTEXTLMTXMODE > 1 then
-
- function context.latelua(f)
- -- table check moved elsewhere
- local latelua = new_latelua(f)
- setattrlist(latelua,true) -- will become an option
- ctx_flushnode(latelua,true)
- end
-
- else
-
- function context.latelua(f)
- if type(f) == "table" then
- local action = f.action
- local specification = f.specification or f
- f = function() action(specification) end
- end
- local latelua = new_latelua(f)
- setattrlist(latelua,true) -- will become an option
- ctx_flushnode(latelua,true)
- end
-
- end
-
+function context.latelua(f)
+ -- table check moved elsewhere
+ local latelua = new_latelua(f)
+ setattrlist(latelua,true) -- will become an option
+ ctx_flushnode(latelua,true)
end
--- yes or no
do
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cldf-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/cldf-ini.lua
index 15ebc9d9595..e22de5a5b80 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/cldf-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/cldf-ini.lua
@@ -124,8 +124,8 @@ local scannerdefmode = true
local maxflushnodeindex = 0x10FFFF - 1
-- tokenflushmode = false
--- scannerdefmode = false
-- nodeflushmode = false
+-- scannerdefmode = false
-- In earlier experiments a function tables was referred to as lua.calls and the
-- primitive \luafunctions was \luacall and we used our own implementation of
@@ -137,7 +137,7 @@ function context.trialtypesetting()
return texgetcount(trialtypesettingstate) ~= 0
end
-local knownfunctions = lua.get_functions_table(true)
+local knownfunctions = (lua.getfunctionstable or lua.get_functions_table)(true)
local showstackusage = false
trackers.register("context.stack",function(v) showstackusage = v end)
@@ -326,6 +326,39 @@ end
setmetatablecall(knownfunctions,function(t,n) return knownfunctions[n](n) end)
+-- some protection
+
+do
+
+ local stub = { }
+ local done = false
+ local message = function()
+ -- one time message
+ if not done then
+ report_cld("")
+ report_cld("use : slot = context.functions.register(f)")
+ report_cld("and : context.functions.unregister(slot)")
+ report_cld("")
+ done = true
+ end
+ end
+
+ setmetatable(stub, {
+ __index = message,
+ __newindex = message,
+ })
+
+ function lua.getfunctionstable()
+ message()
+ return stub
+ end
+
+ lua.get_functions_table = lua.getfunctionstable
+
+end
+
+-- so far
+
-- The next hack is a convenient way to define scanners at the Lua end and
-- get them available at the TeX end. There is some dirty magic needed to
-- prevent overload during format loading.
@@ -713,9 +746,15 @@ local s_cldl_argument_e = "}"
-- local s_cldl_argument_b = "{"
-- local s_cldl_argument_f = "{ "
-local t_cldl_luafunction = createtoken("luafunctioncall")
+local t_cldl_luafunction = newtoken("luafunctioncall",0)
local lua_expandable_call_token_code = token.command_id and token.command_id("lua_expandable_call")
+local sortedhashindeed = false
+
+directives.register("context.sorthash",function(v)
+ sortedhashindeed = v and table.sortedhash or nil
+end)
+
local function writer(parent,command,...) -- already optimized before call
if type(command) == "string" then -- for now
@@ -766,20 +805,39 @@ local function writer(parent,command,...) -- already optimized before call
local tn = #ti
if tn == 0 then
local done = false
- for k, v in next, ti do
- if done then
- if v == "" then
- flush(currentcatcodes,",",k,'=')
+ if sortedhashindeed then
+ for k, v in sortedhashindeed(ti) do
+ if done then
+ if v == "" then
+ flush(currentcatcodes,",",k,'=')
+ else
+ flush(currentcatcodes,",",k,"={",v,"}")
+ end
else
- flush(currentcatcodes,",",k,"={",v,"}")
+ if v == "" then
+ flush(currentcatcodes,"[",k,"=")
+ else
+ flush(currentcatcodes,"[",k,"={",v,"}")
+ end
+ done = true
end
- else
- if v == "" then
- flush(currentcatcodes,"[",k,"=")
+ end
+ else
+ for k, v in next, ti do
+ if done then
+ if v == "" then
+ flush(currentcatcodes,",",k,'=')
+ else
+ flush(currentcatcodes,",",k,"={",v,"}")
+ end
else
- flush(currentcatcodes,"[",k,"={",v,"}")
+ if v == "" then
+ flush(currentcatcodes,"[",k,"=")
+ else
+ flush(currentcatcodes,"[",k,"={",v,"}")
+ end
+ done = true
end
- done = true
end
end
if done then
@@ -792,11 +850,11 @@ local function writer(parent,command,...) -- already optimized before call
if type(tj) == "function" then
tj = storefunction(tj)
if tokenflushmode then
- if newtoken then
+ -- if newtoken then
flush(currentcatcodes,"[",newtoken(tj,lua_expandable_call_token_code),"]")
- else
- flush(currentcatcodes,"[",t_cldl_luafunction,tj,"]")
- end
+ -- else
+ -- flush(currentcatcodes,"[",t_cldl_luafunction,tj,"]")
+ -- end
else
flush(currentcatcodes,s_cldl_option_b,tj,s_cldl_option_e)
end
@@ -810,11 +868,11 @@ local function writer(parent,command,...) -- already optimized before call
if type(tj) == "function" then
tj = storefunction(tj)
if tokenflushmode then
- if newtoken then
+ -- if newtoken then
flush(currentcatcodes,"[",newtoken(tj,lua_expandable_call_token_code),j == tn and "]" or ",")
- else
- flush(currentcatcodes,"[",t_cldl_luafunction,tj,j == tn and "]" or ",")
- end
+ -- else
+ -- flush(currentcatcodes,"[",t_cldl_luafunction,tj,j == tn and "]" or ",")
+ -- end
else
flush(currentcatcodes,s_cldl_option_s,tj,j == tn and "]" or ",")
end
@@ -831,11 +889,11 @@ local function writer(parent,command,...) -- already optimized before call
-- todo: ctx|prt|texcatcodes
ti = storefunction(ti)
if tokenflushmode then
- if newtoken then
+ -- if newtoken then
flush(currentcatcodes,"{",newtoken(ti,lua_expandable_call_token_code),"}")
- else
- flush(currentcatcodes,"{",t_cldl_luafunction,ti,"}")
- end
+ -- else
+ -- flush(currentcatcodes,"{",t_cldl_luafunction,ti,"}")
+ -- end
else
flush(currentcatcodes,s_cldl_argument_f,ti,s_cldl_argument_e)
end
@@ -1060,11 +1118,11 @@ local caller = function(parent,f,a,...)
-- ignored: a ...
f = storefunction(f)
if tokenflushmode then
- if newtoken then
+ -- if newtoken then
flush(currentcatcodes,"{",newtoken(f,lua_expandable_call_token_code),"}")
- else
- flush(currentcatcodes,"{",t_cldl_luafunction,f,"}")
- end
+ -- else
+ -- flush(currentcatcodes,"{",t_cldl_luafunction,f,"}")
+ -- end
else
flush(currentcatcodes,s_cldl_argument_b,f,s_cldl_argument_e) -- todo: ctx|prt|texcatcodes
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cldf-int.lua b/Master/texmf-dist/tex/context/base/mkiv/cldf-int.lua
index 52cfea8d0ae..86420f422b1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/cldf-int.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/cldf-int.lua
@@ -11,8 +11,9 @@ if not modules then modules = { } end modules ['cldf-int'] = {
-- needs checking
-- todo: multilingual
-local format, insert, remove, concat = string.format, table.insert, table.remove, table.concat
-local unpack = unpack or table.unpack
+local format, byte = string.format, string.byte
+local insert, remove, concat = table.insert, table.remove, table.concat
+local unpack, type = unpack or table.unpack, type
local catcodenumbers = catcodes.numbers
@@ -24,140 +25,291 @@ local contextsprint = context.sprint
local trace_define = false trackers.register("context.define", function(v) trace_define = v end)
-interfaces = interfaces or { }
+interfaces = interfaces or { }
+local implement = interfaces.implement
+local estart = interfaces.elements.start
+local estop = interfaces.elements.stop
-_clmh_ = utilities.parsers.settings_to_hash
-_clma_ = utilities.parsers.settings_to_array
+if CONTEXTLMTXMODE > 0 then
-local starters, stoppers, macros, stack = { }, { }, { }, { }
+ local scanners = tokens.scanners
+ local shortcuts = tokens.shortcuts
-local checkers = {
- [0] = "",
- "\\dosingleempty",
- "\\dodoubleempty",
- "\\dotripleempty",
- "\\doquadrupleempty",
- "\\doquintupleempty",
- "\\dosixtupleempty",
-}
+ local scanpeek = scanners.peek
+ local scankey = scanners.key
+ local scanvalue = scanners.value
+ local scanskip = scanners.skip
-function _clmm_(name,...)
- macros[name](...)
-end
+ local open = byte('[')
+ local close = byte(']')
+ local equal = byte('=')
+ local comma = byte(',')
-function _clmb_(name,...)
- local sn = stack[name]
- insert(sn,{...})
- starters[name](...)
-end
-
-function _clme_(name)
- local sn = stack[name]
- local sv = remove(sn)
- if sv then
- stoppers[name](unpack(sv))
- else
- -- nesting error
+ function scanhash(scanners)
+ if scanpeek() == open then
+ local data = { }
+ scanskip()
+ while true do
+ local c = scanpeek()
+ if c == comma then
+ scanskip()
+ elseif c == close then
+ scanskip()
+ break
+ else
+ local key = scankey(equal)
+ if key then
+ if scanpeek() == equal then
+ scanskip()
+ if scanners then
+ local scanner = scanners[key]
+ if scanner then
+ data[key] = scanner()
+ else
+ data[key] = scanvalue(comma,close) or ""
+ end
+ else
+ data[key] = scanvalue(comma,close) or ""
+ end
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ end
+ return data
+ end
end
-end
-_clmn_ = tonumber
+ function scanarray()
+ if scanpeek() == open then
+ local data = { }
+ local d = 0
+ scanskip()
+ while true do
+ local c = scanpeek()
+ if c == comma then
+ scanskip()
+ elseif c == close then
+ scanskip()
+ break
+ else
+ local v = scanvalue(comma,close) or ""
+ d = d + 1
+ data[d] = v
+ end
+ end
+ return data
+ end
+ end
-local estart = interfaces.elements.start
-local estop = interfaces.elements.stop
+ shortcuts.scanhash = scanhash
+ shortcuts.scanarray = scanarray
--- this is a bit old definition ... needs to be modernized
+ scanners.hash = scanhash
+ scanners.array = scanarray
-function interfaces.definecommand(name,specification) -- name is optional
- if type(name) == "table" then
- specification = name
- name = specification.name
+ local function remap(arguments)
+ -- backward compatibility
+ if type(arguments) == "table" then
+ for i=1,#arguments do
+ local a = arguments[i]
+ if type(a) == "table" then
+ local t = a[2]
+ arguments[i] = t == "list" and "array" or t
+ end
+ end
+ return arguments
+ end
end
- if name and specification then
- local arguments = specification.arguments
- local na = (arguments and #arguments) or 0
- local environment = specification.environment
- if na == 0 then
+
+ function interfaces.definecommand(name,specification) -- name is optional
+ if type(name) == "table" then
+ specification = name
+ name = specification.name
+ end
+ if name and specification then
+ local environment = specification.environment
+ local arguments = remap(specification.arguments)
if environment then
- contextsprint(ctxcatcodes,"\\setuvalue{",estart,name,"}{\\ctxlua{_clmb_('",name,"')}}")
- contextsprint(ctxcatcodes,"\\setuvalue{",estop, name,"}{\\ctxlua{_clme_('",name,"')}}")
+ local starter = specification.starter
+ local stopper = specification.stopper
+ if starter and stopper then
+ implement {
+ name = estart .. name,
+ arguments = arguments,
+ public = true,
+ protected = true,
+ actions = starter,
+ }
+ implement {
+ name = estop .. name,
+ public = true,
+ protected = true,
+ actions = stopper,
+ }
+ else
+ -- message
+ end
end
if not environment or environment == "both" then
- contextsprint(ctxcatcodes,"\\setuvalue{", name,"}{\\ctxlua{_clmm_('",name,"')}}")
- end
- else
- -- we could flush immediate but tracing is bad then
- stack[name] = { }
- local opt = 0
- local done = false
- local snippets = { } -- we can reuse it
- local mkivdo = "\\mkivdo" .. name -- maybe clddo
- snippets[#snippets+1] = "\\def"
- snippets[#snippets+1] = mkivdo
- for i=1,na do
- local a = arguments[i]
- local variant = a[1]
- if variant == "option" then
- snippets[#snippets+1] = "[#"
- snippets[#snippets+1] = i
- snippets[#snippets+1] = "]"
- if not done then
- opt = opt + 1
- end
+ local macro = specification.macro
+ if macro then
+ implement {
+ name = name,
+ arguments = arguments,
+ public = true,
+ protected = true,
+ actions = macro,
+ }
else
- done = true -- no more optional checking after this
- snippets[#snippets+1] = "#"
- snippets[#snippets+1] = i
+ -- message
end
end
- if environment then
- snippets[#snippets+1] = "{\\ctxlua{_clmb_('"
- snippets[#snippets+1] = name
- snippets[#snippets+1] = "'"
+ else
+ -- message
+ end
+ end
+
+
+else
+
+ _clmh_ = utilities.parsers.settings_to_hash
+ _clma_ = utilities.parsers.settings_to_array
+
+ local starters, stoppers, macros, stack = { }, { }, { }, { }
+
+ local checkers = {
+ [0] = "",
+ "\\dosingleempty",
+ "\\dodoubleempty",
+ "\\dotripleempty",
+ "\\doquadrupleempty",
+ "\\doquintupleempty",
+ "\\dosixtupleempty",
+ }
+
+ function _clmm_(name,...)
+ macros[name](...)
+ end
+
+ function _clmb_(name,...)
+ local sn = stack[name]
+ insert(sn,{...})
+ starters[name](...)
+ end
+
+ function _clme_(name)
+ local sn = stack[name]
+ local sv = remove(sn)
+ if sv then
+ stoppers[name](unpack(sv))
+ else
+ -- nesting error
+ end
+ end
+
+ _clmn_ = tonumber
+
+ local estart = interfaces.elements.start
+ local estop = interfaces.elements.stop
+
+ -- this is a bit old definition ... needs to be modernized
+
+ function interfaces.definecommand(name,specification) -- name is optional
+ if type(name) == "table" then
+ specification = name
+ name = specification.name
+ end
+ if name and specification then
+ local arguments = specification.arguments
+ local na = (arguments and #arguments) or 0
+ local environment = specification.environment
+ if na == 0 then
+ if environment then
+ contextsprint(ctxcatcodes,"\\setuvalue{",estart,name,"}{\\ctxlua{_clmb_('",name,"')}}")
+ contextsprint(ctxcatcodes,"\\setuvalue{",estop, name,"}{\\ctxlua{_clme_('",name,"')}}")
+ end
+ if not environment or environment == "both" then
+ contextsprint(ctxcatcodes,"\\setuvalue{", name,"}{\\ctxlua{_clmm_('",name,"')}}")
+ end
else
- snippets[#snippets+1] = "{\\ctxlua{_clmm_('"
- snippets[#snippets+1] = name
- snippets[#snippets+1] = "'"
- end
- for i=1,na do
- local a = arguments[i]
- local variant = a[2]
- if variant == "list" then
- snippets[#snippets+1] = ",_clma_([[#"
- snippets[#snippets+1] = i
- snippets[#snippets+1] = "]])"
- elseif variant == "hash" then
- snippets[#snippets+1] = ",_clmh_([[#"
- snippets[#snippets+1] = i
- snippets[#snippets+1] = "]])"
- elseif variant == "number" then
- snippets[#snippets+1] = ",_clmn_([[#"
- snippets[#snippets+1] = i
- snippets[#snippets+1] = "]])"
+ -- we could flush immediate but tracing is bad then
+ stack[name] = { }
+ local opt = 0
+ local done = false
+ local snippets = { } -- we can reuse it
+ local mkivdo = "\\mkivdo" .. name -- maybe clddo
+ snippets[#snippets+1] = "\\def"
+ snippets[#snippets+1] = mkivdo
+ for i=1,na do
+ local a = arguments[i]
+ local variant = a[1]
+ if variant == "option" then
+ snippets[#snippets+1] = "[#"
+ snippets[#snippets+1] = i
+ snippets[#snippets+1] = "]"
+ if not done then
+ opt = opt + 1
+ end
+ else
+ done = true -- no more optional checking after this
+ snippets[#snippets+1] = "#"
+ snippets[#snippets+1] = i
+ end
+ end
+ if environment then
+ snippets[#snippets+1] = "{\\ctxlua{_clmb_('"
+ snippets[#snippets+1] = name
+ snippets[#snippets+1] = "'"
else
- snippets[#snippets+1] = ",[[#"
- snippets[#snippets+1] = i
- snippets[#snippets+1] = "]]"
+ snippets[#snippets+1] = "{\\ctxlua{_clmm_('"
+ snippets[#snippets+1] = name
+ snippets[#snippets+1] = "'"
+ end
+ for i=1,na do
+ local a = arguments[i]
+ local variant = a[2]
+ if variant == "list" then
+ snippets[#snippets+1] = ",_clma_([==[#"
+ snippets[#snippets+1] = i
+ snippets[#snippets+1] = "]==])"
+ elseif variant == "hash" then
+ snippets[#snippets+1] = ",_clmh_([==[#"
+ snippets[#snippets+1] = i
+ snippets[#snippets+1] = "]==])"
+ elseif variant == "number" then
+ snippets[#snippets+1] = ",_clmn_([==[#"
+ snippets[#snippets+1] = i
+ snippets[#snippets+1] = "]==])"
+ else
+ snippets[#snippets+1] = ",[==[#"
+ snippets[#snippets+1] = i
+ snippets[#snippets+1] = "]==]"
+ end
+ end
+ snippets[#snippets+1] = ")}}"
+ contextsprint(ctxcatcodes,unpack(snippets))
+ if environment then
+ -- needs checking
+ contextsprint(ctxcatcodes,"\\setuvalue{",estart,name,"}{",checkers[opt],mkivdo,"}")
+ contextsprint(ctxcatcodes,"\\setuvalue{",estop, name,"}{\\ctxlua{_clme_('",name,"')}}")
+ end
+ if not environment or environment == "both" then
+ contextsprint(ctxcatcodes,"\\setuvalue{", name,"}{",checkers[opt],mkivdo,"}")
end
end
- snippets[#snippets+1] = ")}}"
- contextsprint(ctxcatcodes,unpack(snippets))
if environment then
- -- needs checking
- contextsprint(ctxcatcodes,"\\setuvalue{",estart,name,"}{",checkers[opt],mkivdo,"}")
- contextsprint(ctxcatcodes,"\\setuvalue{",estop, name,"}{\\ctxlua{_clme_('",name,"')}}")
- end
- if not environment or environment == "both" then
- contextsprint(ctxcatcodes,"\\setuvalue{", name,"}{",checkers[opt],mkivdo,"}")
+ starters[name] = specification.starter
+ stoppers[name] = specification.stopper
+ else
+ macros[name] = specification.macro
end
end
- if environment then
- starters[name] = specification.starter
- stoppers[name] = specification.stopper
- else
- macros[name] = specification.macro
- end
end
+
end
function interfaces.tolist(t)
@@ -223,3 +375,20 @@ end
-- \stopluacode
--
-- more: \startmore[1] one \startmore[2] two \stopmore one \stopmore
+--
+-- More modern (no need for option or content):
+--
+-- \startluacode
+-- interfaces.definecommand {
+-- name = "test",
+-- arguments = {
+-- "array", -- or list
+-- "hash",
+-- "string",
+-- "number",
+-- },
+-- macro = test,
+-- }
+-- \stopluacode
+--
+
diff --git a/Master/texmf-dist/tex/context/base/mkiv/colo-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/colo-ini.lua
index 3c8d23abc09..6b3f515b90e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/colo-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/colo-ini.lua
@@ -109,6 +109,8 @@ colors.pushset = pushset
colors.popset = popset
colors.setlist = setlist
+-- todo: set at the lua end
+
local ctx_colordefagc = context.colordefagc
local ctx_colordefagt = context.colordefagt
local ctx_colordefalc = context.colordefalc
@@ -508,6 +510,59 @@ local function defineprocesscolor(name,str,global,freeze) -- still inconsistent
colorset[name] = true-- maybe we can store more
end
+-- You cannot overload a local color so one then has to use some prefix, like
+-- mp:red. Kind of protection.
+
+local function defineprocesscolordirect(settings)
+ if settings then
+ local name = settings.name
+ if name then
+ local r = settings.r
+ local g = settings.g
+ local b = settings.b
+ if r or g or b then
+ -- we can consider a combined rgb cmyk s definition
+ register_color(name,'rgb', r or 0, g or 0, b or 0)
+ else
+ local c = settings.c
+ local m = settings.m
+ local y = settings.y
+ local k = settings.k
+ if c or m or y or k then
+ register_color(name,'cmyk',c or 0, m or 0, y or 0, k or 0)
+ else
+ local h = settings.h
+ local s = settings.s
+ local v = settings.v
+ if v then
+ r, g, b = colors.hsvtorgb(h or 0, s or 1, v or 1) -- maybe later native
+ register_color(name,'rgb',r,g,b)
+ else
+ local x = settings.x or h
+ if x then
+ r, g, b = lpegmatch(hexpattern,x) -- can be inlined
+ if r and g and b then
+ register_color(name,'rgb',r,g,b)
+ else
+ register_color(name,'gray',r or 0)
+ end
+ else
+ register_color(name,'gray',s or 0)
+ end
+ end
+ end
+ end
+ local a = settings.a
+ local t = settings.t
+ if a and t then
+ transparencies.register(name,transparent[a] or a or 1,t or 1)
+ end
+ colorset[name] = true-- maybe we can store more
+ valid[name] = true
+ end
+ end
+end
+
local function isblack(ca) -- maybe commands
local cv = ca > 0 and colorvalues[ca]
return (cv and cv[2] == 0) or false
@@ -519,7 +574,6 @@ colors.isblack = isblack
-- if c and c > 1 then -- 1 is black
-- local v = attributes.colors.values[c]
-
local function definespotcolor(name,parent,str,global)
if parent == "" or find(parent,"=",1,true) then
colors.registerspotcolor(name, parent) -- does that work? no attr
@@ -657,6 +711,8 @@ colors.defineprocesscolor = defineprocesscolor
colors.definespotcolor = definespotcolor
colors.definemultitonecolor = definemultitonecolor
+colors.defineprocesscolordirect = defineprocesscolordirect -- test for mp
+
-- will move to mlib-col as colors in mp are somewhat messy due to the fact
-- that we cannot cast .. so we really need to use (s,s,s) for gray in order
-- to be able to map onto 'color'
@@ -734,10 +790,13 @@ local function namedcolorattributes(name)
elseif color == true then
color = paletnamespace .. prefix .. name
end
- elseif valid[name] then
- color = name
else
- return space, l_color.black
+ color = valid[name]
+ if not color then
+ return space, l_color.black
+ elseif color == true then
+ color = name
+ end
end
color = counts[color]
if color then
@@ -773,7 +832,6 @@ colors.mpoptions = mpoptions
-- mpprint(mpnamedcolor(str))
-- end
-
-- local function formatcolor(ca,separator)
-- local cv = colorvalues[ca]
-- if cv then
@@ -953,6 +1011,12 @@ local function complement(one,fraction,i)
return otf
end
+colors.helpers = {
+ inbetween = inbetween,
+ justone = justone,
+ complement = complement,
+}
+
defineintermediatecolor = function(name,fraction,c_one,c_two,a_one,a_two,specs,global,freeze)
fraction = tonumber(fraction) or 1
local one, two = colorvalues[c_one], colorvalues[c_two] -- beware, it uses the globals
@@ -1014,6 +1078,7 @@ colors.defineintermediatecolor = defineintermediatecolor
-- for the moment downward compatible
local patterns = {
+ CONTEXTLMTXMODE > 0 and "colo-imp-%s.mkxl" or "",
"colo-imp-%s.mkiv",
"colo-imp-%s.tex",
-- obsolete:
@@ -1022,13 +1087,7 @@ local patterns = {
}
local function action(name,foundname)
- -- could be one command
- context.startreadingfile()
- context.startcolorset { name }
- context.input(foundname)
- context.showmessage("colors",4,name)
- context.stopcolorset()
- context.stopreadingfile()
+ context.loadfoundcolorsetfile(name,foundname)
end
local function failure(name)
@@ -1037,7 +1096,7 @@ local function failure(name)
end
local function usecolors(name)
- commands.uselibrary {
+ resolvers.uselibrary {
category = "color definition",
name = name,
patterns = patterns,
diff --git a/Master/texmf-dist/tex/context/base/mkiv/colo-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/colo-ini.mkiv
index 7079322f7a2..c489635deca 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/colo-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/colo-ini.mkiv
@@ -37,16 +37,15 @@
\unprotect
-%D In \MKIV\ we have independent color, colorspace and transparency
-%D but I'm still not sure if I keep it that way as it's probably more
-%D efficient to combine them (less attributes and finalizing). If
-%D it becomes a bottleneck we can set up a more complex system
-%D with one shared attribute for colorspace, color and transparency.
+%D In \MKIV\ we have independent color, colorspace and transparency but I'm still
+%D not sure if I keep it that way as it's probably more efficient to combine them
+%D (less attributes and finalizing). If it becomes a bottleneck we can set up a more
+%D complex system with one shared attribute for colorspace, color and transparency.
%D
-%D When typesetting for paper, we prefer using the \CMYK\ color space,
-%D but for on||screen viewing we prefer \RGB\ (the previous
-%D implementation supported only this scheme). Independant of such
-%D specifications, we support some automatic conversions:
+%D When typesetting for paper, we prefer using the \CMYK\ color space, but for
+%D on||screen viewing we prefer \RGB\ (the previous implementation supported only
+%D this scheme). Independant of such specifications, we support some automatic
+%D conversions:
%D
%D \startitemize[packed]
%D \item convert all colors to \RGB
@@ -108,11 +107,18 @@
\unexpanded\def\definetransparency {\dodoubleargument\colo_basics_define_transpancy}
\unexpanded\def\defineglobaltransparency{\dodoubleargument\colo_basics_define_transpancy_global}
+\unexpanded\def\loadfoundcolorsetfile#1#2% name foundname / not a user command
+ {\startreadingfile
+ \startcolorset[#1]%
+ \input{#2}%
+ \stopcolorset
+ \showmessage\m!colors4{#1}%
+ \stopreadingfile}
+
%D \macros
%D {startcolor,stopcolor,color,graycolor}
%D
-%D The local and global commands are here just for compatibility
-%D with \MKII.
+%D The local and global commands are here just for compatibility with \MKII.
%D
%D \showsetup{startcolor}
%D
@@ -131,42 +137,6 @@
\unexpanded\def\switchtocolor[#1]{\begincsname#1\endcsname}
-% \unexpanded\def\color [#1]{\bgroup
-% \def\g_color{\colo_helpers_activate{#1}}%
-% \afterassignment\g_color
-% \let\nexttoken}
-%
-% \unexpanded\def\graycolor [#1]{\bgroup
-% \def\g_color{\colo_helpers_set_model\s!gray\colo_helpers_activate{#1}}%
-% \afterassignment\g_color
-% \let\nexttoken}
-%
-% \unexpanded\def\startcolor [#1]{\begingroup
-% \colo_helpers_activate{#1}}
-%
-% \unexpanded\def\stopcolor {\endgroup}
-%
-% \unexpanded\def\colored [#1]{\bgroup
-% \def\g_color{\colo_basics_defined_and_activated{#1}}%
-% \afterassignment\g_color
-% \let\nexttoken}
-%
-% \unexpanded\def\fastcolored[#1]#2{\begingroup % is this command still needed?
-% \colo_basics_defined_and_activated{#1}%
-% #2%
-% \endgroup}
-%
-% \unexpanded\def\directcolored[#1]{\colo_basics_defined_and_activated{#1}}
-%
-% \unexpanded\def\fastcolor [#1]#2{\begingroup % is this command still needed?
-% \colo_helpers_activate{#1}%
-% #2%
-% \endgroup}
-%
-% \unexpanded\def\directcolor [#1]{\colo_helpers_activate{#1}}
-%
-% \afterassignment was a left-over artifact
-
% transparency
\unexpanded\def\transparent[#1]%
@@ -259,7 +229,7 @@
\unexpanded\def\directcolored[#1]%
{\colo_basics_defined_and_activated{#1}}
-\unexpanded\def\fastcolor [#1]#2%
+\unexpanded\def\fastcolor[#1]#2%
{\begingroup % is this command still needed?
\edef\currentcolorname{#1}%
\ifx\currentcolorprefix\empty
@@ -310,11 +280,11 @@
%D
%D \showsetup{usecolors}
%D
-%D Some default colors are specified in \type {colo-imp-rgb},
-%D which is loaded into the format by default.
+%D Some default colors are specified in \type {colo-imp-rgb}, which is loaded into
+%D the format by default.
%D
-%D Some demo palets and groups are defined in \type {colo-imp-dem}
-%D which can be loaded with:
+%D Some demo palets and groups are defined in \type {colo-imp-dem} which can be
+%D loaded with:
%D
%D \starttyping
%D \usecolors[dem]
@@ -407,33 +377,27 @@
{\attribute\colorattribute \c_colo_saved_attribute_color
\attribute\transparencyattribute\c_colo_saved_attribute_transparency}
-%D In this documentation we will not go into too much details
-%D on palets. Curious users can find more information on this
-%D topic in \from[use of color].
+%D In this documentation we will not go into too much details on palets. Curious
+%D users can find more information on this topic in \from[use of color].
%D
-%D At the moment we implemented color in \CONTEXT\ color
-%D printing was not yet on the desktop. In spite of this lack our
-%D graphics designer made colorfull illustrations. When printed
-%D on a black and white printer, distinctive colors can come
-%D out equally gray. We therefore decided to use only colors
-%D that were distinctive in colors as well as in black and
-%D white print.
+%D At the moment we implemented color in \CONTEXT\ color printing was not yet on the
+%D desktop. In spite of this lack our graphics designer made colorfull
+%D illustrations. When printed on a black and white printer, distinctive colors can
+%D come out equally gray. We therefore decided to use only colors that were
+%D distinctive in colors as well as in black and white print.
%D
-%D Although none of the graphic packages we used supported
-%D logical colors and global color redefition, we build this
-%D support into \CONTEXT. This enabled us to experiment and
-%D also prepared us for the future.
+%D Although none of the graphic packages we used supported logical colors and global
+%D color redefition, we build this support into \CONTEXT. This enabled us to
+%D experiment and also prepared us for the future.
%D \macros
%D {definepalet}
%D
-%D Colors are grouped in palets. The colors in such a palet can
-%D have colorful names, but best is to use names that specify
-%D their use, like {\em important} or {\em danger}. As a sort
-%D of example \CONTEXT\ has some palets predefined,
-%D like:\footnote{At the time I wrote the palet support, I was
-%D reading 'A hort history of time' of S.~Hawkins, so that's
-%D why we stuck to quarks.}
+%D Colors are grouped in palets. The colors in such a palet can have colorful names,
+%D but best is to use names that specify their use, like {\em important} or {\em
+%D danger}. As a sort of example \CONTEXT\ has some palets predefined,
+%D like:\footnote{At the time I wrote the palet support, I was reading 'A hort
+%D history of time' of S.~Hawkins, so that's why we stuck to quarks.}
%D
%D \starttyping
%D \definepalet
@@ -460,8 +424,8 @@
%D \getbuffer[palet]
%D \stoplinecorrection
%D
-%D This bar shows both the color and gray alternatives of the
-%D palet components (not visible in black and white print).
+%D This bar shows both the color and gray alternatives of the palet components (not
+%D visible in black and white print).
%D
%D When needed, one can copy a palet by saying:
%D
@@ -469,8 +433,8 @@
%D \definepalet [TEXcolorpretty] [colorpretty]
%D \stoptyping
%D
-%D This saves us some typing in for instance the modules that
-%D deal with pretty verbatim typesetting.
+%D This saves us some typing in for instance the modules that deal with pretty
+%D verbatim typesetting.
\installcorenamespace{paletlist}
\installcorenamespace{paletsize}
@@ -485,7 +449,7 @@
\def\colo_palet_prepare#1%
{\edef\colo_palet_name{#1}%
\ifcsname\??paletlist\colo_palet_name\endcsname
- \csname\??paletsize#1\endcsname\zerocount
+ \csname\??paletsize\colo_palet_name\endcsname\zerocount
\else
\colo_palet_allocate\colo_palet_name
\fi
@@ -527,14 +491,25 @@
\expandafter\colo_palets_define_a
\fi}
+% \unexpanded\def\colo_palets_define_a[#1][#2][#3]%
+% {\colo_palet_prepare{#1}%
+% \doifelseassignment{#2}
+% {\setevalue{\??colorpaletspecification#1}{#2}%
+% \processcommalist[#2]{\colo_palets_define_one{#1}}}
+% {\ifcsname\??colorpaletspecification#2\endcsname
+% \normalexpanded{\colo_palets_define[#1][\lastnamedcs]}%
+% \fi}}
+
\unexpanded\def\colo_palets_define_a[#1][#2][#3]%
{\colo_palet_prepare{#1}%
- \doifelseassignment{#2}
- {\setevalue{\??colorpaletspecification#1}{#2}%
- \processcommalist[#2]{\colo_palets_define_one{#1}}}
- {\ifcsname\??colorpaletspecification#2\endcsname
- \normalexpanded{\colo_palets_define[#1][\lastnamedcs]}%
- \fi}}
+ \ifcondition\validassignment{#2}%
+ \setevalue{\??colorpaletspecification#1}{#2}%
+ \processcommalist[#2]{\colo_palets_define_one{#1}}%
+ \else
+ \ifcsname\??colorpaletspecification#2\endcsname
+ \normalexpanded{\colo_palets_define[#1][\lastnamedcs]}%
+ \fi
+ \fi}
\unexpanded\def\colo_palets_define_b[#1][#2][#3]%
{\colo_palet_prepare{#1}%
@@ -542,10 +517,17 @@
\colo_palet_extend{#2}%
\colo_palets_define_assign{#1}{#2}{#3}}
+% \def\colo_palets_define_one#1#2% get rid of { }
+% {\doifelseassignment{#2} % catch empty entries
+% {\colo_palets_define_two{#1}[#2]}
+% {\colo_palets_define_three{#1}{#2}}}
+
\def\colo_palets_define_one#1#2% get rid of { }
- {\doifelseassignment{#2} % catch empty entries
- {\colo_palets_define_two{#1}[#2]}
- {\colo_palets_define_three{#1}{#2}}}
+ {\ifcondition\validassignment{#2}% catch empty entries
+ \colo_palets_define_two{#1}[#2]%
+ \else
+ \colo_palets_define_three{#1}{#2}%
+ \fi}
\def\colo_palets_define_two#1[#2=#3]%
{\colo_palet_extend{#2}%
@@ -556,8 +538,7 @@
\processcommacommand[\lastnamedcs]{\colo_palets_define_one{#1}}%
\fi}
-%D Instead of refering to colors, one can also directly specify
-%D a color:
+%D Instead of refering to colors, one can also directly specify a color:
%D
%D \starttyping
%D \definepalet[test][xx=green]
@@ -567,8 +548,8 @@
%D \macros
%D {setuppalet}
%D
-%D Colors are taken from the current palet, if defined.
-%D Setting the current palet is done by:
+%D Colors are taken from the current palet, if defined. Setting the current palet is
+%D done by:
%D
%D \showsetup{setuppalet}
@@ -660,8 +641,8 @@
%D \macros
%D {showcolor}
%D
-%D But let's not forget that we also have the more traditional
-%D non||related colors. These show up after:
+%D But let's not forget that we also have the more traditional non||related colors.
+%D These show up after:
%D
%D \starttyping
%D \showcolor [name]
@@ -673,8 +654,8 @@
\fetchruntimecommand \showcolor \f!colo_run
-%D It would make sense to put the following code in \type
-%D {colo-mps}, but it it rather low level.
+%D It would make sense to put the following code in \type {colo-mps}, but it it
+%D rather low level.
%D \macros
%D {negatecolorcomponent,negatedcolorcomponent}
@@ -705,8 +686,8 @@
%D \macros
%D {MPcolor}
%D
-%D A very special macro is \type{\MPcolor}. This one can be
-%D used to pass a \CONTEXT\ color to \METAPOST.
+%D A very special macro is \type{\MPcolor}. This one can be used to pass a \CONTEXT\
+%D color to \METAPOST.
%D
%D \starttyping
%D \MPcolor{my own red}
@@ -715,15 +696,13 @@
%D This macro returns \METAPOST\ code that represents the
%D color.
%D
-%D For the moment we keep the next downward compatibility
-%D switch, i.e.\ expanded colors. However, predefined colors
-%D and palets are no longer expanded (which is what I wanted
-%D in the first place).
+%D For the moment we keep the next downward compatibility switch, i.e.\ expanded
+%D colors. However, predefined colors and palets are no longer expanded (which is
+%D what I wanted in the first place).
%D
-%D In \MKIV\ we don't support color separation as we might now
-%D assume that printing houses have the right programs to do
-%D it themselves. If it's ever needed in \MKIV\ It is relatively
-%D easy to support it in the backend code.
+%D In \MKIV\ we don't support color separation as we might now assume that printing
+%D houses have the right programs to do it themselves. If it's ever needed in \MKIV\
+%D It is relatively easy to support it in the backend code.
% todo: palets in definecolor
% todo: {\red xx} vs \red{xx}
@@ -773,12 +752,12 @@
\fi
\fi}
-% Currently in mkiv transparency is implemented independent of color. This costs
-% a bit more processing time but gives the possibility to apply transparency
-% independently in the future. Is this useful? If not we may as well combine them
-% again in the future. By coupling we are downward compatible. When we decouple we
-% need to do more tricky housekeeping (e.g. persist color independent transparencies
-% when color bound ones are nil.
+%D Currently in mkiv transparency is implemented independent of color. This costs a
+%D bit more processing time but gives the possibility to apply transparency
+%D independently in the future. Is this useful? If not we may as well combine them
+%D again in the future. By coupling we are downward compatible. When we decouple we
+%D need to do more tricky housekeeping (e.g. persist color independent
+%D transparencies when color bound ones are nil.
% Since we couple definitions, we could stick to one test. Todo. Same for mpcolor.
@@ -804,21 +783,21 @@
\def\colo_helpers_fast_activate_yes#1%
{\ifcsname\??colorsetter\currentcolorprefix#1\endcsname
\lastnamedcs
- \csname\??transparencysetter\currentcolorprefix#1\endcsname
+ \begincsname\??transparencysetter\currentcolorprefix#1\endcsname
\else\ifcsname\??colorsetter#1\endcsname
\lastnamedcs
- \csname\??transparencysetter#1\endcsname
+ \begincsname\??transparencysetter#1\endcsname
\fi\fi}
\def\colo_helpers_fast_activate_nop#1%
{\ifcsname\??colorsetter#1\endcsname
\lastnamedcs
- \csname\??transparencysetter#1\endcsname
+ \begincsname\??transparencysetter#1\endcsname
\fi}
\def\colo_helpers_activate_dummy
- {\csname\??colorsetter \v_colo_dummy_name\endcsname
- \csname\??transparencysetter\v_colo_dummy_name\endcsname}
+ {\begincsname\??colorsetter \v_colo_dummy_name\endcsname
+ \begincsname\??transparencysetter\v_colo_dummy_name\endcsname}
\let\dofastcoloractivation\colo_helpers_fast_activate
@@ -835,16 +814,16 @@
\def\colo_helpers_activate_yes
{\ifcsname\??colorsetter\currentcolorprefix\currentcolorname\endcsname
\lastnamedcs
- \csname\??transparencysetter\currentcolorprefix\currentcolorname\endcsname
+ \begincsname\??transparencysetter\currentcolorprefix\currentcolorname\endcsname
\else\ifcsname\??colorsetter\currentcolorname\endcsname
\lastnamedcs
- \csname\??transparencysetter\currentcolorname\endcsname
+ \begincsname\??transparencysetter\currentcolorname\endcsname
\fi\fi}
\def\colo_helpers_activate_nop
{\ifcsname\??colorsetter\currentcolorname\endcsname
\lastnamedcs
- \csname\??transparencysetter\currentcolorname\endcsname
+ \begincsname\??transparencysetter\currentcolorname\endcsname
\fi}
\def\colo_helpers_activate_yes_only
@@ -870,10 +849,10 @@
{\let\currentcolorname\currentcolorparameter % maybe only when success
\ifcsname\??colorsetter\currentcolorprefix\currentcolorparameter\endcsname
\lastnamedcs
- \csname\??transparencysetter\currentcolorprefix\currentcolorparameter\endcsname
+ \begincsname\??transparencysetter\currentcolorprefix\currentcolorparameter\endcsname
\else\ifcsname\??colorsetter\currentcolorparameter\endcsname
\lastnamedcs
- \csname\??transparencysetter\currentcolorparameter\endcsname
+ \begincsname\??transparencysetter\currentcolorparameter\endcsname
\fi\fi}
\let\dosetcolorattribute\dousecolorhashparameter % for a while
@@ -888,7 +867,7 @@
% \let\colo_basics_synchronize\gobbleoneargument % used in mp interface
% \let\colo_basics_inherit \gobbletwoarguments % used in mp interface
-\def\colo_basics_allocate#1%
+\def\colo_basics_allocate#1% todo: use a chardef instead
{\expandafter\newcount\csname\??colornumber#1\endcsname
\clf_synccolorcount{#1}\c_syst_last_allocated_count}
@@ -971,10 +950,9 @@
\unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}%
\fi}
-% Spotcolors used setxvalue but that messes up currentcolor
-% and probably no global is needed either but they are global
-% at the lua end (true argument) so we keep that if only because
-% spot colors often are a document wide property
+%D Spotcolors used setxvalue but that messes up currentcolor and probably no global
+%D is needed either but they are global at the lua end (true argument) so we keep
+%D that if only because spot colors often are a document wide property
\def\colo_basics_define_spot[#1][#2][#3]%
{\clf_definespotcolorglobal{#1}{#2}{#3}%
@@ -1026,8 +1004,8 @@
%
% \definecolor[one][two]
%
-% only color one is actually defined and two is not seen at the
-% \LUA\ end. This means that this doesn't work:
+% Only color one is actually defined and two is not seen at the \LUA\ end. This
+% means that this doesn't work:
%
% \definecolor[ColorA][red]
% \definecolor[ColorB][.5(ColorA)]
@@ -1111,9 +1089,8 @@
%D \macros
%D {doifcolorelse, doifcolor}
%D
-%D Switching to a color is done by means of the following
-%D command. Later on we will explain the use of palets. We
-%D define ourselves a color conditional first.
+%D Switching to a color is done by means of the following command. Later on we will
+%D explain the use of palets. We define ourselves a color conditional first.
\def\doifelsecolor#1%
{\ifcsname\??colorattribute\currentcolorprefix#1\endcsname
@@ -1138,13 +1115,11 @@
%D \macros
%D {startregistercolor,stopregistercolor,permitcolormode}
%D
-%D If you only want to register a color, the switch \type
-%D {\ifpermitcolormode} can be used. That way the nested
-%D colors know where to go back to.
+%D If you only want to register a color, the switch \type {\ifpermitcolormode} can
+%D be used. That way the nested colors know where to go back to.
%D
-%D We use these macros for implementing text colors
-%D (actually, the first application was in foreground
-%D colors).
+%D We use these macros for implementing text colors (actually, the first application
+%D was in foreground colors).
%D
%D \starttyping
%D \starttextcolor[red]
@@ -1233,16 +1208,28 @@
\fi
\to \everysetupcolors
+% \def\colo_palets_define_set#1#2#3%
+% {\doifelseassignment{#3}% \definepalet[test][xx={y=.4}]
+% {\colo_palets_define_assign}%
+% {\ifcsname\??colorsetter#3\endcsname
+% % \definepalet[test][xx=green]
+% \expandafter\colo_palets_define_inherit
+% \else
+% % not entered when making format
+% \expandafter\colo_palets_define_undefine
+% \fi}%
+% {#1}{#2}{#3}}
+
\def\colo_palets_define_set#1#2#3%
- {\doifelseassignment{#3}% \definepalet[test][xx={y=.4}]
- {\colo_palets_define_assign}%
- {\ifcsname\??colorsetter#3\endcsname
- % \definepalet[test][xx=green]
- \expandafter\colo_palets_define_inherit
- \else
- % not entered when making format
- \expandafter\colo_palets_define_undefine
- \fi}%
+ {\ifcondition\validassignment{#3}% \definepalet[test][xx={y=.4}]
+ \expandafter\colo_palets_define_assign
+ \else\ifcsname\??colorsetter#3\endcsname
+ % \definepalet[test][xx=green]
+ \doubleexpandafter\colo_palets_define_inherit
+ \else
+ % not entered when making format
+ \doubleexpandafter\colo_palets_define_undefine
+ \fi\fi
{#1}{#2}{#3}}
\def\colo_palets_define_inherit#1#2#3%
@@ -1298,8 +1285,8 @@
%D \macros
%D {colorvalue, grayvalue}
%D
-%D We can typeset the color components using \type{\colorvalue} and
-%D \type{\grayvalue}. The commands:
+%D We can typeset the color components using \type {\colorvalue} and \type
+%D {\grayvalue}. The commands:
%D
%D \startbuffer
%D color value of SomeKindOfRed: \colorvalue{SomeKindOfRed} \crlf
@@ -1376,8 +1363,8 @@
%D \macros
%D {forcecolorhack}
%D
-%D We can out this in front of (for instance) a special and so force color
-%D to be applied (only glyphs, rules and leaders are handled).
+%D We can out this in front of (for instance) a special and so force color to be
+%D applied (only glyphs, rules and leaders are handled).
%D
%D \startbuffer
%D \framed
@@ -1438,10 +1425,10 @@
\definecolor[trace:g][g=.75,t=.5,a=1]
\definecolor[trace:b][b=.75,t=.5,a=1]
%definecolor[trace:c][c=.75,t=.5,a=1]
-\definecolor[trace:c][g=.75,b=.75,t=.5,a=1]
%definecolor[trace:m][m=.75,t=.5,a=1]
-\definecolor[trace:m][r=.75,b=.75,t=.5,a=1]
%definecolor[trace:y][y=.75,t=.5,a=1]
+\definecolor[trace:c][g=.75,b=.75,t=.5,a=1]
+\definecolor[trace:m][r=.75,b=.75,t=.5,a=1]
\definecolor[trace:y][r=.75,g=.75,t=.5,a=1]
\definecolor[trace:s][s=.75,t=.5,a=1]
\definecolor[trace:d][s=.25,t=.5,a=1]
@@ -1452,11 +1439,11 @@
\definecolor[trace:dg][g=.75,t=.75,a=1]
\definecolor[trace:db][b=.75,t=.75,a=1]
%definecolor[trace:dc][c=.75,t=.75,a=1]
-\definecolor[trace:dc][g=.75,b=.75,t=.75,a=1]
%definecolor[trace:dm][m=.75,t=.75,a=1]
-\definecolor[trace:dm][r=.75,b=.75,t=.75,a=1]
%definecolor[trace:dy][y=.75,t=.75,a=1]
-\definecolor[trace:y][r=.75,g=.75,t=.75,a=1]
+\definecolor[trace:dc][g=.75,b=.75,t=.75,a=1]
+\definecolor[trace:dm][r=.75,b=.75,t=.75,a=1]
+\definecolor[trace:dy][r=.75,g=.75,t=.75,a=1]
\definecolor[trace:ds][s=.75,t=.75,a=1]
\definecolor[trace:dd][s=.25,t=.75,a=1]
\definecolor[trace:do][r=1,g=.6,b=.1,t=.75,a=1]
diff --git a/Master/texmf-dist/tex/context/base/mkiv/colo-ini.mkxl b/Master/texmf-dist/tex/context/base/mkiv/colo-ini.mkxl
new file mode 100644
index 00000000000..e821fb7e282
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/colo-ini.mkxl
@@ -0,0 +1,1407 @@
+%D \module
+%D [ file=colo-ini,
+%D version=2007.08.08,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D We need to clean this up further but first we have to make sure that mkiv
+%D code works ok.
+
+\writestatus{loading}{ConTeXt Color Macros / Initialization}
+
+%D Todo: move color space in color attribute (last two bits)
+
+%D This module implements color. Since \MKII\ and \MKIV\ use a completely
+%D different approach, this module only implements a few generic mechanisms.
+
+\installcorenamespace{color}
+\installcorenamespace{colorattribute}
+\installcorenamespace{transparencyattribute}
+\installcorenamespace{colorsetter}
+\installcorenamespace{transparencysetter}
+\installcorenamespace{colorpaletspecification}
+\installcorenamespace{colorpalet}
+\installcorenamespace{colorstack}
+\installcorenamespace{colorconversions}
+\installcorenamespace{colornumber}
+
+\registerctxluafile{colo-ini}{}
+\registerctxluafile{colo-icc}{}
+
+\unprotect
+
+%D In \MKIV\ we have independent color, colorspace and transparency but I'm still
+%D not sure if I keep it that way as it's probably more efficient to combine them
+%D (less attributes and finalizing). If it becomes a bottleneck we can set up a more
+%D complex system with one shared attribute for colorspace, color and transparency.
+%D
+%D When typesetting for paper, we prefer using the \CMYK\ color space, but for
+%D on||screen viewing we prefer \RGB\ (the previous implementation supported only
+%D this scheme). Independant of such specifications, we support some automatic
+%D conversions:
+%D
+%D \startitemize[packed]
+%D \item convert all colors to \RGB
+%D \item convert all colors to \CMYK
+%D \item convert all colors to gray scales
+%D \stopitemize
+%D
+%D These options are communicated by means of:
+
+\newconditional\c_colo_rgb_supported
+\newconditional\c_colo_cmyk_supported
+\newconditional\c_colo_spot_supported % backend driven
+\newconditional\c_colo_convert_gray \settrue\c_colo_convert_gray
+\newconditional\c_colo_enabled
+\newconditional\c_colo_expanded
+
+\let\m_colo_weight_gray\v!yes
+
+\let\currentcolormodel \empty
+\let\currentcolorname \empty
+\let\currentcolorpalet \empty
+\let\currentcolorprefix\empty % \currentcolorpalet:
+
+%D \macros
+%D {definecolor,defineglobalcolor,definenamedcolor,definespotcolor,definemultitonecolor,
+%D definetransparency}
+%D
+%D \starttyping
+%D \definecolor [blue] [c=1,m=.38,y=0,k=.64] % pantone pms 2965 uncoated m
+%D \definecolor [yellow] [c=0,m=.28,y=1,k=.06] % pantone pms 124 uncoated m
+%D
+%D \definespotcolor [blue-100] [blue] [p=1]
+%D \definespotcolor [yellow-100] [yellow] [p=1]
+%D
+%D \definemultitonecolor [pdftoolscolor] [blue=.12,yellow=.28] [c=.1,m=.1,y=.3,k=.1]
+%D
+%D \defineprocesscolor[myred][r=.5]
+%D \defineprocesscolor[myredish][red][a=1,t=.5]
+%D
+%D \blackrule[color=myred,width=\hsize,height=1cm] \par
+%D \blackrule[color=myredish,width=\hsize,height=1cm]
+%D
+%D \useexternalfigure[demofig][mill.png][object=no]
+%D
+%D \startcombination[4*1]
+%D {\externalfigure[demofig]} {no color}
+%D {\externalfigure[demofig][color=pdftoolscolor]} {indexed duotone}
+%D {\externalfigure[demofig][color=blue-100]} {spot color}
+%D {\externalfigure[demofig][color=yellow-100]} {spot color}
+%D \stopcombination
+%D \stoptyping
+
+\unexpanded\def\definecolor {\dodoubleargument\colo_basics_define}
+\unexpanded\def\defineglobalcolor {\dodoubleargument\colo_basics_define_global}
+\unexpanded\def\defineprocesscolor {\dotripleargument\colo_basics_define_process}
+\unexpanded\def\definenamedcolor {\dodoubleargument\colo_basics_define_named}
+\unexpanded\def\definespotcolor {\dotripleargument\colo_basics_define_spot}
+\unexpanded\def\definemultitonecolor {\doquadrupleempty\colo_basics_define_multitone}
+\unexpanded\def\definetransparency {\dodoubleargument\colo_basics_define_transpancy}
+\unexpanded\def\defineglobaltransparency{\dodoubleargument\colo_basics_define_transpancy_global}
+
+\unexpanded\def\loadfoundcolorsetfile#1#2% name foundname / not a user command
+ {\startreadingfile
+ \startcolorset[#1]%
+ \input{#2}%
+ \stopcolorset
+ \showmessage\m!colors4{#1}%
+ \stopreadingfile}
+
+%D \macros
+%D {startcolor,stopcolor,color,graycolor}
+%D
+%D The local and global commands are here just for compatibility with \MKII.
+%D
+%D \showsetup{startcolor}
+%D
+%D The simple color commands are:
+%D
+%D \showsetup{color}
+%D \showsetup{graycolor}
+
+%D We expect sane behaviour in \MKIV\ so we don't used grouped command any
+%D longer.
+
+% \testfeatureonce{100000}{\color[red]{}} % 1.046 => 0.541
+
+\let\g_color\empty
+\let\g_style\empty
+
+\unexpanded\def\switchtocolor[#1]{\begincsname#1\endcsname}
+
+% transparency
+
+\unexpanded\def\transparent[#1]%
+ {\bgroup
+ \edef\currenttransparencyname{#1}%
+ % the \relax catches a non existent csname
+ \ifx\currenttransparencyname\v!reset
+ \attribute\transparencyattribute\attributeunsetvalue
+ \else
+ \begincsname\??transparencysetter\currenttransparencyname\endcsname\relax
+ \fi
+ \let\nexttoken}
+
+\unexpanded\def\starttransparent[#1]%$
+ {\begingroup
+ \edef\currenttransparencyname{#1}%
+ \ifx\currenttransparencyname\v!reset
+ \attribute\transparencyattribute\attributeunsetvalue
+ \else
+ \begincsname\??transparencysetter\currenttransparencyname\endcsname\relax
+ \fi}
+
+\unexpanded\def\stoptransparent
+ {\endgroup}
+
+% color
+
+\unexpanded\def\coloronly[#1]%
+ {\bgroup
+ \edef\currentcolorname{#1}%
+ \ifx\currentcolorprefix\empty
+ \colo_helpers_activate_nop_only
+ \else
+ \colo_helpers_activate_yes_only
+ \fi
+ \let\nexttoken}
+
+\unexpanded\def\startcoloronly[#1]%$
+ {\begingroup
+ \edef\currentcolorname{#1}%
+ \ifx\currentcolorprefix\empty
+ \colo_helpers_activate_nop_only
+ \else
+ \colo_helpers_activate_yes_only
+ \fi}
+
+\unexpanded\def\stopcoloronly
+ {\endgroup}
+
+% color + transparency
+
+\unexpanded\def\color[#1]%
+ {\bgroup
+ \edef\currentcolorname{#1}%
+ \ifx\currentcolorprefix\empty
+ \colo_helpers_activate_nop
+ \else
+ \colo_helpers_activate_yes
+ \fi
+ \let\nexttoken}
+
+\unexpanded\def\graycolor[#1]%
+ {\bgroup
+ \colo_helpers_set_model\s!gray\colo_helpers_activate{#1}%
+ \let\nexttoken}
+
+\unexpanded\def\startcolor[#1]%$
+ {\begingroup
+ \edef\currentcolorname{#1}%
+ \ifx\currentcolorprefix\empty
+ \colo_helpers_activate_nop
+ \else
+ \colo_helpers_activate_yes
+ \fi}
+
+\unexpanded\def\stopcolor
+ {\endgroup}
+
+\unexpanded\def\colored[#1]%
+ {\bgroup
+ \colo_basics_defined_and_activated{#1}%
+ \let\nexttoken}
+
+\unexpanded\def\fastcolored[#1]#2%
+ {\begingroup % is this command still needed?
+ \colo_basics_defined_and_activated{#1}%
+ #2%
+ \endgroup}
+
+\unexpanded\def\directcolored[#1]%
+ {\colo_basics_defined_and_activated{#1}}
+
+\unexpanded\def\fastcolor [#1]#2%
+ {\begingroup % is this command still needed?
+ \edef\currentcolorname{#1}%
+ \ifx\currentcolorprefix\empty
+ \colo_helpers_activate_nop
+ \else
+ \colo_helpers_activate_yes
+ \fi
+ #2%
+ \endgroup}
+
+\unexpanded\def\directcolor[#1]%
+ {\edef\currentcolorname{#1}%
+ \ifx\currentcolorprefix\empty
+ \colo_helpers_activate_nop
+ \else
+ \colo_helpers_activate_yes
+ \fi}
+
+%D The following command is obsolete:
+
+\unexpanded\def\startcolorpage {\startcolor[\ifx\maintextcolor\empty\defaulttextcolor\else\maintextcolor\fi]}
+\unexpanded\def\stopcolorpage {\stopcolor}
+
+\unexpanded\def\getcolorattributevalue#1#2% obsolete, use \thecolorattribute instead ...
+ {\begingroup
+ \colo_helpers_activate{#1}%
+ \normalexpanded{\endgroup\edef\noexpand#2%
+ {\ifnum\attribute\colorattribute=\attributeunsetvalue\else\number\attribute\colorattribute\fi}}}
+
+\let\grey\graycolor % these macros are only used in tracing
+
+%D \macros
+%D {startcurrentcolor,stopcurrentcolor}
+
+\unexpanded\def\startcurrentcolor{\startcolor[\outercolorname]}
+\unexpanded\def\stopcurrentcolor {\stopcolor}
+
+%D \macros
+%D {setupcolor}
+%D
+%D Color definitions can be grouped in files with the name:
+%D
+%D \starttyping
+%D colo-imp-tag.tex
+%D \stoptyping
+%D
+%D Loading such a file is done by:
+%D
+%D \showsetup{usecolors}
+%D
+%D Some default colors are specified in \type {colo-imp-rgb}, which is loaded into
+%D the format by default.
+%D
+%D Some demo palets and groups are defined in \type {colo-imp-dem} which can be
+%D loaded with:
+%D
+%D \starttyping
+%D \usecolors[dem]
+%D \stoptyping
+
+\unexpanded\def\startcolorset[#1]{\clf_startcolorset{#1}}
+\unexpanded\def\stopcolorset {\clf_stopcolorset}
+\unexpanded\def\usecolors [#1]{\clf_usecolors{#1}}
+
+\let\setupcolor\usecolors
+
+\installsetuponlycommandhandler \??color {colors}
+
+\let\colo_helpers_show_message\gobblethreearguments
+
+% \newtoks\everysetupcolors
+
+\let\v_colo_freeze_state\s!false
+
+\setvalue{\??colorconversions\v!yes}%
+ {\settrue \c_colo_convert_gray}
+
+\setvalue{\??colorconversions\v!always}%
+ {\settrue \c_colo_convert_gray
+ \setfalse\c_colo_rgb_supported
+ \setfalse\c_colo_cmyk_supported}
+
+\appendtoks
+ %
+ \doifelse{\directcolorsparameter\c!spot }\v!yes \settrue \setfalse\c_colo_spot_supported
+ \doifelse{\directcolorsparameter\c!expansion}\v!yes \settrue \setfalse\c_colo_expanded
+ \doifelse{\directcolorsparameter\c!rgb }\v!yes \settrue \setfalse\c_colo_rgb_supported
+ \doifelse{\directcolorsparameter\c!cmyk }\v!yes \settrue \setfalse\c_colo_cmyk_supported
+ \doifelse{\directcolorsparameter\c!state }\v!start\settrue \setfalse\c_colo_enabled
+ %
+ \edef\m_colo_weight_gray{\directcolorsparameter\c!factor}%
+ %
+ \ifconditional\c_colo_expanded
+ \let\v_colo_freeze_state\s!true
+ \else
+ \let\v_colo_freeze_state\s!false
+ \fi
+ %
+ \setfalse\c_colo_convert_gray
+ \begincsname\??colorconversions\directcolorsparameter\c!conversion\endcsname
+ % too often:
+ \ifconditional\c_colo_rgb_supported \colo_helpers_show_message\m!colors{10}\v!rgb \fi
+ \ifconditional\c_colo_cmyk_supported\colo_helpers_show_message\m!colors{10}\v!cmyk\fi
+ \colo_helpers_set_current_model
+ \ifproductionrun
+ \edef\p_pagecolormodel{\directcolorsparameter\c!pagecolormodel}%
+ \clf_setpagecolormodel{\ifx\p_pagecolormodel\v!auto\currentcolormodel\else\p_pagecolormodel\fi}%
+ \fi
+\to \everysetupcolors
+
+\appendtoks
+ \setupcolors[\c!state=\v!start]%
+ \clf_enablecolor % this can as well happen when
+ \clf_enabletransparency % the handler is defined in lua
+ \let\colo_helpers_show_message\showmessage
+\to \everyjob
+
+%D We provide stacking independent of grouping.
+
+\newcount\c_colo_nesting
+
+\unexpanded\def\pushcolor[#1]%
+ {\global\advance\c_colo_nesting\plusone
+ \expandafter\edef\csname\??colorstack\number\c_colo_nesting\endcsname
+ {\attribute\colormodelattribute \the\attribute\colormodelattribute
+ \attribute\colorattribute \the\attribute\colorattribute
+ \attribute\transparencyattribute\the\attribute\transparencyattribute
+ \relax}% stack
+ \colo_helpers_activate{#1}}
+
+\unexpanded\def\popcolor
+ {\csname\??colorstack\number\c_colo_nesting\endcsname
+ \global\advance\c_colo_nesting\minusone}
+
+% a simple one: assumes grouping
+
+\newcount\c_colo_saved_attribute_color
+\newcount\c_colo_saved_attribute_transparency
+
+\unexpanded\def\savecolor
+ {\c_colo_saved_attribute_color \attribute\colorattribute
+ \c_colo_saved_attribute_transparency\attribute\transparencyattribute}
+
+\unexpanded\def\restorecolor
+ {\attribute\colorattribute \c_colo_saved_attribute_color
+ \attribute\transparencyattribute\c_colo_saved_attribute_transparency}
+
+%D In this documentation we will not go into too much details on palets. Curious
+%D users can find more information on this topic in \from[use of color].
+%D
+%D At the moment we implemented color in \CONTEXT\ color printing was not yet on the
+%D desktop. In spite of this lack our graphics designer made colorfull
+%D illustrations. When printed on a black and white printer, distinctive colors can
+%D come out equally gray. We therefore decided to use only colors that were
+%D distinctive in colors as well as in black and white print.
+%D
+%D Although none of the graphic packages we used supported logical colors and global
+%D color redefition, we build this support into \CONTEXT. This enabled us to
+%D experiment and also prepared us for the future.
+
+%D \macros
+%D {definepalet}
+%D
+%D Colors are grouped in palets. The colors in such a palet can have colorful names,
+%D but best is to use names that specify their use, like {\em important} or {\em
+%D danger}. As a sort of example \CONTEXT\ has some palets predefined,
+%D like:\footnote{At the time I wrote the palet support, I was reading 'A hort
+%D history of time' of S.~Hawkins, so that's why we stuck to quarks.}
+%D
+%D \starttyping
+%D \definepalet
+%D [alfa]
+%D [ top=rood:7,
+%D bottom=groen:6,
+%D up=blauw:5,
+%D down=cyaan:4,
+%D strange=magenta:3,
+%D charm=geel:2]
+%D \stoptyping
+%D
+%D It's formal definition is:
+%D
+%D \showsetup{definepalet}
+%D
+%D Visualized, such a palet looks like:
+%D
+%D \startbuffer[palet]
+%D \showpalet [alfa] [horizontal,name,number,value]
+%D \stopbuffer
+%D
+%D \startlinecorrection
+%D \getbuffer[palet]
+%D \stoplinecorrection
+%D
+%D This bar shows both the color and gray alternatives of the palet components (not
+%D visible in black and white print).
+%D
+%D When needed, one can copy a palet by saying:
+%D
+%D \starttyping
+%D \definepalet [TEXcolorpretty] [colorpretty]
+%D \stoptyping
+%D
+%D This saves us some typing in for instance the modules that deal with pretty
+%D verbatim typesetting.
+
+\installcorenamespace{paletlist}
+\installcorenamespace{paletsize}
+
+\let\m_colo_palet\relax
+\let\c_colo_palet\relax
+
+\def\colo_palet_allocate#1%
+ {\expandafter\let \csname\??paletlist#1\endcsname\empty
+ \expandafter\newcount\csname\??paletsize#1\endcsname}
+
+\def\colo_palet_prepare#1%
+ {\edef\colo_palet_name{#1}%
+ \ifcsname\??paletlist\colo_palet_name\endcsname
+ \csname\??paletsize\colo_palet_name\endcsname\zerocount
+ \else
+ \colo_palet_allocate\colo_palet_name
+ \fi
+ \edef\m_colo_palet{\begincsname\??paletlist\colo_palet_name\endcsname}%
+ \expandafter\let\expandafter\c_colo_palet\csname\??paletsize\colo_palet_name\endcsname}
+
+\def\colo_palet_extend#1%
+ {\addtocommalist{#1}\m_colo_palet
+ \expandafter\let\csname\??paletlist\colo_palet_name\endcsname\m_colo_palet
+ \advance\c_colo_palet\plusone}
+
+\unexpanded\def\doifelsecolorpalet#1%
+ {\ifcsname\??paletlist#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\paletlist\empty
+\let\paletsize\!!zerocount
+
+\unexpanded\def\getpaletlist[#1]%
+ {\edef\paletlist{\begincsname\??paletlist#1\endcsname}}
+
+\unexpanded\def\getpaletsize[#1]%
+ {\ifcsname\??paletsize#1\endcsname
+ \edef\paletsize{\the\lastnamedcs}%
+ \else
+ \let\paletsize\!!zerocount
+ \fi}
+
+\unexpanded\def\definepalet
+ {\dotripleempty\colo_palets_define}
+
+\def\colo_palets_define
+ {\ifthirdargument
+ \expandafter\colo_palets_define_b
+ \else
+ \expandafter\colo_palets_define_a
+ \fi}
+
+\unexpanded\def\colo_palets_define_a[#1][#2][#3]%
+ {\colo_palet_prepare{#1}%
+ \ifcondition\validassignment{#2}%
+ \setevalue{\??colorpaletspecification#1}{#2}%
+ \processcommalist[#2]{\colo_palets_define_one{#1}}%
+ \orelse\ifcsname\??colorpaletspecification#2\endcsname
+ \normalexpanded{\colo_palets_define[#1][\lastnamedcs]}%
+ \fi}
+
+\unexpanded\def\colo_palets_define_b[#1][#2][#3]%
+ {\colo_palet_prepare{#1}%
+ \setevalue{\??colorpaletspecification#1}{#2}%
+ \colo_palet_extend{#2}%
+ \colo_palets_define_assign{#1}{#2}{#3}}
+
+\def\colo_palets_define_one#1#2% get rid of { }
+ {\ifcondition\validassignment{#2}% catch empty entries
+ \colo_palets_define_two{#1}[#2]%
+ \else
+ \colo_palets_define_three{#1}{#2}%
+ \fi}
+
+\def\colo_palets_define_two#1[#2=#3]%
+ {\colo_palet_extend{#2}%
+ \colo_palets_define_set{#1}{#2}{#3}}%
+
+\def\colo_palets_define_three#1#2%
+ {\ifcsname\??colorpaletspecification#2\endcsname
+ \processcommacommand[\lastnamedcs]{\colo_palets_define_one{#1}}%
+ \fi}
+
+%D Instead of refering to colors, one can also directly specify a color:
+%D
+%D \starttyping
+%D \definepalet[test][xx=green]
+%D \definepalet[test][xx={y=.4}]
+%D \stoptyping
+
+%D \macros
+%D {setuppalet}
+%D
+%D Colors are taken from the current palet, if defined. Setting the current palet is
+%D done by:
+%D
+%D \showsetup{setuppalet}
+
+\newtoks\everysetuppalet
+
+\unexpanded\def\setuppalet
+ {\dosingleempty\colo_palets_setup}
+
+% \newtoks\t_colo_prefix % used in mp interface
+
+\def\colo_palets_setup[#1]%
+ {\edef\currentcolorpalet{#1}%
+ \ifx\currentcolorpalet\empty
+ % seems to be a reset
+ \let\currentcolorprefix\empty
+ %\t_colo_prefix\emptytoks
+ \orelse\ifcsname\??paletlist\currentcolorpalet\endcsname
+ \edef\currentcolorprefix{#1:}%
+ %\t_colo_prefix\expandafter{\currentcolorprefix}%
+ \else
+ \colo_helpers_show_message\m!colors7\currentcolorpalet
+ \let\currentcolorpalet\empty
+ \let\currentcolorprefix\empty
+ %\t_colo_prefix\emptytoks
+ \fi
+ \the\everysetuppalet
+ \colo_helpers_initialize_maintextcolor}
+
+%D \macros
+%D {showpalet}
+%D
+%D The previous visualization was typeset with:
+%D
+%D \typebuffer[palet]
+%D
+%D This commands is defined as:
+%D
+%D \showsetup{showpalet}
+
+\fetchruntimecommand \showpalet \f!colo_run
+
+%D \macros
+%D {showcolorcomponents}
+%D
+%D \starttyping
+%D \showcolorcomponents[color-1,color-2]
+%D \stoptyping
+
+\fetchruntimecommand \showcolorcomponents \f!colo_run
+
+%D \macros
+%D {comparepalet}
+%D
+%D There are some more testing macros available:
+%D
+%D \startbuffer
+%D \comparepalet [alfa]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D shows the palet colors against a background:
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D The formal definition is:
+%D
+%D \showsetup{comparepalet}
+
+\fetchruntimecommand \comparepalet \f!colo_run
+
+%D \macros
+%D {showcolor}
+%D
+%D But let's not forget that we also have the more traditional non||related colors.
+%D These show up after:
+%D
+%D \starttyping
+%D \showcolor [name]
+%D \stoptyping
+%D
+%D Where \type{name} for instance can be \type{rgb}.
+%D
+%D \showsetup{showcolor}
+
+\fetchruntimecommand \showcolor \f!colo_run
+
+%D It would make sense to put the following code in \type {colo-mps}, but it it
+%D rather low level.
+
+%D \macros
+%D {negatecolorcomponent,negatedcolorcomponent}
+%D
+%D These speak for themselves. See \type {colo-ext} for usage.
+
+\unexpanded\def\negatecolorcomponent#1% #1 = \macro
+ {\edef#1{\clf_negatecolorcomponent{#1}}}
+
+\def\negatedcolorcomponent#1%
+ {\clf_negatecolorcomponent{#1}}
+
+%D \macros
+%D {MPcolor}
+%D
+%D A very special macro is \type{\MPcolor}. This one can be used to pass a \CONTEXT\
+%D color to \METAPOST.
+%D
+%D \starttyping
+%D \MPcolor{my own red}
+%D \stoptyping
+%D
+%D This macro returns \METAPOST\ code that represents the
+%D color.
+%D
+%D For the moment we keep the next downward compatibility switch, i.e.\ expanded
+%D colors. However, predefined colors and palets are no longer expanded (which is
+%D what I wanted in the first place).
+%D
+%D In \MKIV\ we don't support color separation as we might now assume that printing
+%D houses have the right programs to do it themselves. If it's ever needed in \MKIV\
+%D It is relatively easy to support it in the backend code.
+
+% todo: palets in definecolor
+% todo: {\red xx} vs \red{xx}
+
+% \def\mptexcolor#1{"\dogetattributeid\s!color \somecolorattribute{#1} A"}
+%
+% \startMPpage
+% fill fullcircle scaled 10cm ;
+% fill fullcircle scaled 5cm withprescript \mptexcolor{red} withpostscript \mptexcolor{black} ;
+% fill fullcircle scaled 3cm ;
+% draw btex test etex withprescript \mptexcolor{blue} ;
+% \stopMPpage
+
+\unexpanded\def\setcolormodel[#1]% % beware, \setupcolors will overload this, so this one is
+ {\colo_helpers_set_model{#1}} % only for local usage
+
+\def\colo_helpers_set_model#1% direct
+ {\edef\currentcolormodel{#1}%
+ \clf_setcolormodel{\currentcolormodel}{\m_colo_weight_gray}} % sets attribute at lua end
+
+\colo_helpers_set_model\s!all
+
+\def\colo_helpers_set_current_model
+ {\ifconditional\c_colo_enabled
+ \ifconditional\c_colo_rgb_supported
+ \ifconditional\c_colo_cmyk_supported
+ \colo_helpers_set_model\s!all
+ \else
+ \colo_helpers_set_model\s!rgb
+ \fi
+ \else
+ \ifconditional\c_colo_cmyk_supported
+ \colo_helpers_set_model\s!cmyk
+ \else
+ \ifconditional\c_colo_convert_gray
+ \colo_helpers_set_model\s!gray
+ \else
+ \colo_helpers_set_model\s!none
+ \fi
+ \fi
+ \fi
+ \else
+ \ifconditional\c_colo_convert_gray
+ \colo_helpers_set_model\s!gray
+ \else
+ \colo_helpers_set_model\s!none
+ \fi
+ \fi}
+
+%D Currently in mkiv transparency is implemented independent of color. This costs a
+%D bit more processing time but gives the possibility to apply transparency
+%D independently in the future. Is this useful? If not we may as well combine them
+%D again in the future. By coupling we are downward compatible. When we decouple we
+%D need to do more tricky housekeeping (e.g. persist color independent
+%D transparencies when color bound ones are nil.
+
+% Since we couple definitions, we could stick to one test. Todo. Same for mpcolor.
+
+\def\v_colo_dummy_name{c_o_l_o_r}
+
+\letvalue{\??colorattribute \v_colo_dummy_name}\empty
+\letvalue{\??transparencyattribute\v_colo_dummy_name}\empty
+\letvalue{\??colorsetter \v_colo_dummy_name}\empty
+\letvalue{\??transparencysetter \v_colo_dummy_name}\empty
+
+\letvalue{\??colorsetter -}\empty % used?
+\letvalue{\??transparencysetter-}\empty % used?
+
+% new: expandable (see tbl)
+
+\def\colo_helpers_fast_activate
+ {\ifx\currentcolorprefix\empty
+ \expandafter\colo_helpers_fast_activate_nop
+ \else
+ \expandafter\colo_helpers_fast_activate_yes
+ \fi}
+
+\def\colo_helpers_fast_activate_yes#1%
+ {\ifcsname\??colorsetter\currentcolorprefix#1\endcsname
+ \lastnamedcs
+ \begincsname\??transparencysetter\currentcolorprefix#1\endcsname
+ \orelse\ifcsname\??colorsetter#1\endcsname
+ \lastnamedcs
+ \begincsname\??transparencysetter#1\endcsname
+ \fi}
+
+\def\colo_helpers_fast_activate_nop#1%
+ {\ifcsname\??colorsetter#1\endcsname
+ \lastnamedcs
+ \begincsname\??transparencysetter#1\endcsname
+ \fi}
+
+\def\colo_helpers_activate_dummy
+ {\begincsname\??colorsetter \v_colo_dummy_name\endcsname
+ \begincsname\??transparencysetter\v_colo_dummy_name\endcsname}
+
+\let\dofastcoloractivation\colo_helpers_fast_activate
+
+% so far
+
+\def\colo_helpers_activate#1% two-step is not that much faster but less tracing
+ {\edef\currentcolorname{#1}%
+ \ifx\currentcolorprefix\empty
+ \expandafter\colo_helpers_activate_nop
+ \else
+ \expandafter\colo_helpers_activate_yes
+ \fi}
+
+\def\colo_helpers_activate_yes
+ {\ifcsname\??colorsetter\currentcolorprefix\currentcolorname\endcsname
+ \lastnamedcs
+ \begincsname\??transparencysetter\currentcolorprefix\currentcolorname\endcsname
+ \orelse\ifcsname\??colorsetter\currentcolorname\endcsname
+ \lastnamedcs
+ \begincsname\??transparencysetter\currentcolorname\endcsname
+ \fi}
+
+\def\colo_helpers_activate_nop
+ {\ifcsname\??colorsetter\currentcolorname\endcsname
+ \lastnamedcs
+ \begincsname\??transparencysetter\currentcolorname\endcsname
+ \fi}
+
+\def\colo_helpers_activate_yes_only
+ {\ifcsname\??colorsetter\currentcolorprefix\currentcolorname\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??colorsetter\currentcolorname\endcsname
+ \lastnamedcs
+ \fi}
+
+\def\colo_helpers_activate_nop_only
+ {\ifcsname\??colorsetter\currentcolorname\endcsname
+ \lastnamedcs
+ \fi}
+
+\let\dousecolorparameter\colo_helpers_activate
+
+\unexpanded\def\dousecolorhashparameter#1#2%
+ {\ifcsname#1#2\endcsname
+ \expandafter\dousecolorparameter\csname#1#2\endcsname
+ \fi}
+
+\unexpanded\def\dousecurrentcolorparameter
+ {\let\currentcolorname\currentcolorparameter % maybe only when success
+ \ifcsname\??colorsetter\currentcolorprefix\currentcolorparameter\endcsname
+ \lastnamedcs
+ \begincsname\??transparencysetter\currentcolorprefix\currentcolorparameter\endcsname
+ \orelse\ifcsname\??colorsetter\currentcolorparameter\endcsname
+ \lastnamedcs
+ \begincsname\??transparencysetter\currentcolorparameter\endcsname
+ \fi}
+
+\let\dosetcolorattribute\dousecolorhashparameter % for a while
+
+\unexpanded\def\deactivatecolor % sort of public but a bad name
+ {\let\currentcolorname\s!black
+ \attribute\colorattribute\attributeunsetvalue
+ \attribute\transparencyattribute\attributeunsetvalue}
+
+% todo: check if color is overloading a non-color command
+
+% \let\colo_basics_synchronize\gobbleoneargument % used in mp interface
+% \let\colo_basics_inherit \gobbletwoarguments % used in mp interface
+
+\def\colo_basics_allocate#1%
+ {\expandafter\newcount\csname\??colornumber#1\endcsname
+ \clf_synccolorcount{#1}\c_syst_last_allocated_count}
+
+\def\colo_basics_synchronize#1%
+ {\ifcsname\??colornumber#1\endcsname\else
+ \colo_basics_allocate{#1}%
+ \fi
+ \clf_synccolor{#1}%
+ %\csname\??colornumber#1\endcsname\csname\??colorattribute#1\endcsname
+ \lastnamedcs\csname\??colorattribute#1\endcsname}
+
+\let\colo_basics_inherit\clf_synccolorclone
+
+\newcount\c_colo_protection
+
+\unexpanded\def\startprotectedcolors
+ {\advance\c_colo_protection\plusone}
+
+\unexpanded\def\stopprotectedcolors
+ {\advance\c_colo_protection\minusone}
+
+\def\colo_basics_define[#1][#2]%
+ {\edef\m_colo_old{#1}%
+ \edef\m_colo_new{#2}%
+ \ifx\m_colo_old\m_colo_new
+ % maybe a warning
+ \else
+ \clf_defineprocesscolorlocal{#1}{#2}\v_colo_freeze_state\relax
+ \colo_basics_synchronize{#1}%
+ \ifcase\c_colo_protection
+ \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi
+ \fi}
+
+\def\colo_basics_define_global[#1][#2]%
+ {\edef\m_colo_old{#1}%
+ \edef\m_colo_new{#2}%
+ \ifx\m_colo_old\m_colo_new
+ % maybe a warning
+ \else
+ \clf_defineprocesscolorglobal{#1}{#2}\v_colo_freeze_state\relax
+ \colo_basics_synchronize{#1}%
+ \ifcase\c_colo_protection
+ \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi
+ \fi}
+
+\let\colo_basics_define_named\colo_basics_define
+
+\def\dodefinefastcolor[#1][#2]% still not fast but ok (might change)
+ {\clf_defineprocesscolorlocal{#1}{#2}\v_colo_freeze_state\relax
+ \colo_basics_synchronize{#1}%
+ \ifcase\c_colo_protection
+ \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
+
+\def\colo_basics_defined_and_activated#1%
+ {\clf_defineprocesscolordummy{#1}% we could pass dummy here too
+ \colo_basics_synchronize{\v_colo_dummy_name}%
+ \colo_helpers_activate_dummy}
+
+\def\colo_basics_define_process
+ {\ifthirdargument
+ \expandafter\colo_basics_define_process_yes
+ \else
+ \expandafter\colo_basics_define_process_nop
+ \fi}
+
+\def\colo_basics_define_process_yes[#1][#2][#3]%
+ {\clf_defineprocesscolorlocal{#1}{\processcolorcomponents{#2},#3}\v_colo_freeze_state\relax
+ \colo_basics_synchronize{#1}%
+ \ifcase\c_colo_protection
+ \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
+
+\def\colo_basics_define_process_nop[#1][#2][#3]%
+ {\clf_defineprocesscolorlocal{#1}{#2}\v_colo_freeze_state\relax
+ \colo_basics_synchronize{#1}%
+ \ifcase\c_colo_protection
+ \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
+
+%D Spotcolors used setxvalue but that messes up currentcolor and probably no global
+%D is needed either but they are global at the lua end (true argument) so we keep
+%D that if only because spot colors often are a document wide property
+
+\def\colo_basics_define_spot[#1][#2][#3]%
+ {\clf_definespotcolorglobal{#1}{#2}{#3}%
+ \colo_basics_synchronize{#1}%
+ \ifcase\c_colo_protection
+ \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
+
+\def\colo_basics_define_multitone[#1][#2][#3][#4]%
+ {\clf_definemultitonecolorglobal{#1}{#2}{#3}{#4}%
+ \colo_basics_synchronize{#1}%
+ \ifcase\c_colo_protection
+ \unexpanded\setgvalue{#1}{\colo_helpers_activate{#1}}%
+ \fi}
+
+%D Transparencies (only):
+
+\def\colo_basics_define_transpancy[#1][#2]%
+ {\clf_definetransparency{#1}{#2}}
+
+\def\colo_basics_define_transpancy_global[#1][#2]%
+ {\clf_definetransparencyglobal{#1}{#2}}
+
+% A goodie that replaces the startMPcolor hackery
+
+% \definecolor[red-t] [r=1,t=0.5,a=1]
+% \definecolor[green-t][g=1,t=0.5,a=1]
+%
+% \defineintermediatecolor[mycolora][0.5,red,green]
+% \defineintermediatecolor[mycolorb][0.5,red-t,green-t]
+%
+% \definecolor[mycolorc][.5(blue,red)]
+% \definecolor[mycolord][.5(blue)]
+% \definecolor[mycolord][-.5(blue,red)] % complement
+% \definecolor[mycolord][-(blue)] % complement
+%
+% \enabledirectives[colors.pgf]
+% \definecolor[mycolorx][magenta!50!yellow]
+%
+% \starttext
+% test {\mycolora OEPS} test
+% test {\mycolorb OEPS} test
+% test {\mycolorc OEPS} test
+% test {\mycolord OEPS} test
+% test {\mycolorx OEPS} test
+% \stoptext
+%
+% Beware: if we say:
+%
+% \definecolor[one][two]
+%
+% Only color one is actually defined and two is not seen at the \LUA\ end. This
+% means that this doesn't work:
+%
+% \definecolor[ColorA][red]
+% \definecolor[ColorB][.5(ColorA)]
+% \definecolor[ColorC][.5(ColorB,white)]
+%
+% But this does work:
+%
+% \definecolor[ColorA][1.0(red)]
+% \definecolor[ColorB][0.5(ColorA)]
+% \definecolor[ColorC][0.5(ColorB,white)]
+%
+% because the fractional definition results in a new definition.
+
+\unexpanded\def\defineintermediatecolor
+ {\dotripleempty\colo_basics_define_intermediate}
+
+\def\colo_basics_define_intermediate[#1][#2][#3]% \dotripleempty adds {} inside []
+ {\colo_basics_define_intermediate_indeed[#1][#2][#3]}
+
+\def\colo_basics_define_intermediate_indeed[#1][#2,#3,#4][#5]%
+ {\clf_defineintermediatecolor % not global
+ {#1}%
+ {#2}%
+ \rawcolorattribute{#3} %
+ \rawcolorattribute{#4} %
+ \rawtransparencyattribute{#3} %
+ \rawtransparencyattribute{#4} %
+ {#5}%
+ \v_colo_freeze_state
+ \relax
+ \colo_basics_synchronize{#1}%
+ \unexpanded\setvalue{#1}{\colo_helpers_activate{#1}}}
+
+%D Here is a more efficient helper for pgf:
+%D
+%D \starttyping
+%D \startluacode
+%D function commands.pgfxcolorspec(ca) -- {}{}{colorspace}{list}
+%D local cv = attributes.colors.values[ca]
+%D if cv then
+%D local model = cv[1]
+%D if model == 2 then
+%D context("{}{}{gray}{%1.3f}",cv[2])
+%D elseif model == 3 then
+%D context("{}{}{rgb}{%1.3f,%1.3f,%1.3f}",cv[3],cv[4],cv[5])
+%D elseif model == 4 then
+%D context("{}{}{cmyk}{%1.3f,%1.3f,%1.3f,%1.3f}",cv[6],cv[7],cv[8],cv[9])
+%D else
+%D context("{}{}{gray}{%1.3f}",cv[2])
+%D end
+%D else
+%D context("{}{}{gray}{0}")
+%D end
+%D end
+%D \stopluacode
+%D
+%D \def\pgfutil@registercolor#1%
+%D {\setevalue{\string\color@#1}{\noexpand\xcolor@\ctxcommand{pgfxcolorspec(\thecolorattribute{#1})}}}
+%D
+%D \definecolor [darkblue] [r=0,g=0,b=0.5]
+%D
+%D \starttikzpicture
+%D \fill [blue] (0,0) circle(1);
+%D \fill [darkblue] (0,0) circle(1);
+%D \stoptikzpicture
+%D \stoptyping
+%D
+%D \stopmode
+
+\def\pgf@context@registercolor#1{\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\clf_pgfxcolorspec\zerocount\thecolorattribute{#1}}}
+\def\pgf@context@registergray #1{\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\clf_pgfxcolorspec\plustwo \thecolorattribute{#1}}}
+\def\pgf@context@registerrgb #1{\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\clf_pgfxcolorspec\plusthree\thecolorattribute{#1}}}
+\def\pgf@context@registercmyk #1{\setevalue{\string\color@#1}{\noexpand\xcolor@{}{}\clf_pgfxcolorspec\plusfour \thecolorattribute{#1}}}
+
+%D \starttyping
+%D \ifdefined\pgf@context@registercolor
+%D \let\pgfutil@registercolor\pgf@context@registercolor
+%D \fi
+%D \stoptyping
+
+%D \macros
+%D {doifcolorelse, doifcolor}
+%D
+%D Switching to a color is done by means of the following command. Later on we will
+%D explain the use of palets. We define ourselves a color conditional first.
+
+\def\doifelsecolor#1%
+ {\ifcsname\??colorattribute\currentcolorprefix#1\endcsname
+ \expandafter\firstoftwoarguments
+ \orelse\ifcsname\??colorattribute#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifcolorelse\doifelsecolor
+
+\def\doifcolor#1%
+ {\ifcsname\??colorattribute\currentcolorprefix#1\endcsname
+ \expandafter\firstofoneargument
+ \orelse\ifcsname\??colorattribute#1\endcsname
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+%D \macros
+%D {startregistercolor,stopregistercolor,permitcolormode}
+%D
+%D If you only want to register a color, the switch \type {\ifpermitcolormode} can
+%D be used. That way the nested colors know where to go back to.
+%D
+%D We use these macros for implementing text colors (actually, the first application
+%D was in foreground colors).
+%D
+%D \starttyping
+%D \starttextcolor[red]
+%D \dorecurse{10}{\input tufte \color[green]{oeps} \par}
+%D \stoptextcolor
+%D \stoptyping
+%D
+%D This is more efficient than the alternative:
+%D
+%D \starttyping
+%D \setupbackgrounds[text][foregroundcolor=red]
+%D \startregistercolor[red]
+%D \dorecurse{10}{\input tufte \color[green]{oeps} \par}
+%D \stopregistercolor
+%D \stoptyping
+
+\let\maintextcolor \empty
+\def\defaulttextcolor {black}
+\def\s!themaintextcolor{themaintextcolor}
+
+\unexpanded\def\inheritmaintextcolor
+ {\ifx\maintextcolor\empty\else\colo_helpers_activate\maintextcolor\fi}
+
+\unexpanded\def\onlyinheritmaintextcolor
+ {\ifx\maintextcolor\empty
+ \deactivatecolor
+ \else
+ \colo_helpers_activate\maintextcolor
+ \fi}
+
+\appendtoks
+ \deactivatecolor % public?
+ \inheritmaintextcolor
+\to \everybeforeoutput
+
+\def\colo_helpers_switch_to_maintextcolor#1%
+ {\let\maintextcolor\s!themaintextcolor
+ \definecolor[\maintextcolor][#1]% can be fast one
+ \colo_helpers_activate\maintextcolor
+ \clf_registermaintextcolor\thecolorattribute\maintextcolor\relax}
+
+\unexpanded\def\starttextcolor[#1]%
+ {\doifsomething{#1}
+ {\colo_helpers_switch_to_maintextcolor{#1}}}
+
+\let\stoptextcolor\relax
+
+\let\p_colo_textcolor\empty
+
+\def\colo_helpers_initialize_maintextcolor
+ {\edef\p_colo_textcolor{\directcolorsparameter\c!textcolor}%
+ \ifx\p_colo_textcolor\empty
+ \colo_helpers_switch_to_maintextcolor\defaulttextcolor
+ \else
+ \colo_helpers_switch_to_maintextcolor\p_colo_textcolor
+ \fi}
+
+\appendtoks \colo_helpers_initialize_maintextcolor \to \everyjob
+\appendtoks \colo_helpers_initialize_maintextcolor \to \everysetupcolors
+
+\letvalue{\??colorsetter }\empty \letvalue{\??colorattribute }\!!zerocount
+\letvalue{\??transparencysetter}\empty \letvalue{\??transparencyattribute}\!!zerocount
+
+\def\colo_helpers_inherited_direct_cs#1{\ifcsname\??colorsetter #1\endcsname\lastnamedcs\fi}
+\def\colo_helpers_inherited_direct_ca#1{\ifcsname\??colorattribute #1\endcsname\lastnamedcs\else\!!zerocount\fi}
+\def\colo_helpers_inherited_direct_ts#1{\ifcsname\??transparencysetter #1\endcsname\lastnamedcs\fi}
+\def\colo_helpers_inherited_direct_ta#1{\ifcsname\??transparencyattribute#1\endcsname\lastnamedcs\else\!!zerocount\fi}
+
+% %def\colo_helpers_inherited_palet_cs#1#2{\csname\??colorsetter \ifcsname\??colorsetter \??colorpalet#1:#2\endcsname\??colorpalet#1:#2\fi\endcsname}
+% %def\colo_helpers_inherited_palet_ca#1#2{\csname\??colorattribute \ifcsname\??colorattribute \??colorpalet#1:#2\endcsname\??colorpalet#1:#2\fi\endcsname}
+% %def\colo_helpers_inherited_palet_ts#1#2{\csname\??transparencysetter \ifcsname\??transparencysetter \??colorpalet#1:#2\endcsname\??colorpalet#1:#2\fi\endcsname}
+% %def\colo_helpers_inherited_palet_ta#1#2{\csname\??transparencyattribute\ifcsname\??transparencyattribute\??colorpalet#1:#2\endcsname\??colorpalet#1:#2\fi\endcsname}
+%
+% \def\colo_helpers_inherited_palet_cs#1#2{\ifcsname\??colorsetter \??colorpalet#1:#2\endcsname\lastnamedcs\fi}
+% \def\colo_helpers_inherited_palet_ca#1#2{\ifcsname\??colorattribute \??colorpalet#1:#2\endcsname\lastnamedcs\else\!!zerocount\fi}
+% \def\colo_helpers_inherited_palet_ts#1#2{\ifcsname\??transparencysetter \??colorpalet#1:#2\endcsname\lastnamedcs}
+% \def\colo_helpers_inherited_palet_ta#1#2{\ifcsname\??transparencyattribute\??colorpalet#1:#2\endcsname\lastnamedcs\else\!!zerocount\fi}
+
+\let\colo_helpers_set_value\setvalue
+
+\appendtoks
+ \ifconditional\c_colo_expanded
+ \let\colo_helpers_set_value\setevalue
+ \else
+ \let\colo_helpers_set_value\setvalue
+ \fi
+\to \everysetupcolors
+
+\def\colo_palets_define_set#1#2#3%
+ {\ifcondition\validassignment{#3}% \definepalet[test][xx={y=.4}]
+ \expandafter\colo_palets_define_assign
+ \orelse\ifcsname\??colorsetter#3\endcsname
+ % \definepalet[test][xx=green]
+ \expandafter\colo_palets_define_inherit
+ \else
+ % not entered when making format
+ \expandafter\colo_palets_define_undefine
+ \fi
+ {#1}{#2}{#3}}
+
+\def\colo_palets_define_inherit#1#2#3%
+ {\colo_basics_inherit{#1:#2}{#3}%
+ \colo_helpers_set_value{\??colorsetter #1:#2}{\colo_helpers_inherited_direct_cs{#3}}%
+ \colo_helpers_set_value{\??colorattribute #1:#2}{\colo_helpers_inherited_direct_ca{#3}}%
+ \colo_helpers_set_value{\??transparencysetter #1:#2}{\colo_helpers_inherited_direct_ts{#3}}%
+ \colo_helpers_set_value{\??transparencyattribute#1:#2}{\colo_helpers_inherited_direct_ta{#3}}}
+
+\def\colo_palets_define_undefine#1#2#3%
+ {\localundefine{\??colorsetter #1:#2}%
+ \localundefine{\??colorattribute #1:#2}%
+ \localundefine{\??transparencysetter #1:#2}%
+ \localundefine{\??transparencyattribute#1:#2}}
+
+\def\colo_palets_define_assign#1#2#3%
+ {\definecolor[\??colorpalet#1:#2][#3]%
+ \colo_helpers_set_value{\??colorsetter #1:#2}{\colo_helpers_inherited_direct_cs{\??colorpalet#1:#2}}%
+ \colo_helpers_set_value{\??colorattribute #1:#2}{\colo_helpers_inherited_direct_ca{\??colorpalet#1:#2}}%
+ \colo_helpers_set_value{\??transparencysetter #1:#2}{\colo_helpers_inherited_direct_ts{\??colorpalet#1:#2}}%
+ \colo_helpers_set_value{\??transparencyattribute#1:#2}{\colo_helpers_inherited_direct_ta{\??colorpalet#1:#2}}}
+
+\setvalue{\??colorattribute currentcolor}{\the\attribute\colorattribute} % for mpcolor
+\setvalue{\??transparencyattribute currentcolor}{\the\attribute\transparencyattribute} % for mpcolor
+
+%def\colo_helpers_inherited_current_ca#1{\csname\??colorattribute \ifcsname\??colorattribute \currentcolorprefix#1\endcsname\currentcolorprefix#1\else\ifcsname\??colorattribute #1\endcsname#1\fi\fi\endcsname}
+%def\colo_helpers_inherited_current_cs#1{\csname\??colorsetter \ifcsname\??colorsetter \currentcolorprefix#1\endcsname\currentcolorprefix#1\else\ifcsname\??colorsetter #1\endcsname#1\fi\fi\endcsname}
+%def\colo_helpers_inherited_current_ta#1{\csname\??transparencyattribute\ifcsname\??transparencyattribute\currentcolorprefix#1\endcsname\currentcolorprefix#1\else\ifcsname\??transparencyattribute#1\endcsname#1\fi\fi\endcsname}
+%def\colo_helpers_inherited_current_ts#1{\csname\??transparencysetter \ifcsname\??transparencysetter \currentcolorprefix#1\endcsname\currentcolorprefix#1\else\ifcsname\??transparencysetter #1\endcsname#1\fi\fi\endcsname}
+
+\def\colo_helpers_inherited_current_ca#1{\ifcsname\??colorattribute \currentcolorprefix#1\endcsname\lastnamedcs\else\ifcsname\??colorattribute #1\endcsname\lastnamedcs\else\!!zerocount\fi\fi}
+\def\colo_helpers_inherited_current_cs#1{\ifcsname\??colorsetter \currentcolorprefix#1\endcsname\lastnamedcs\else\ifcsname\??colorsetter #1\endcsname\lastnamedcs\else\fi\fi}
+\def\colo_helpers_inherited_current_ta#1{\ifcsname\??transparencyattribute\currentcolorprefix#1\endcsname\lastnamedcs\else\ifcsname\??transparencyattribute#1\endcsname\lastnamedcs\else\!!zerocount\fi\fi}
+\def\colo_helpers_inherited_current_ts#1{\ifcsname\??transparencysetter \currentcolorprefix#1\endcsname\lastnamedcs\else\ifcsname\??transparencysetter #1\endcsname\lastnamedcs\else\fi\fi}
+
+%D Low level defs:
+
+\unexpanded\def\colordefalc#1#2{\setevalue{\??colorattribute #1}{#2}\setvalue {\??colorsetter #1}{\attribute\colorattribute #2 }}
+\unexpanded\def\colordefagc#1#2{\setxvalue{\??colorattribute #1}{#2}\setgvalue{\??colorsetter #1}{\attribute\colorattribute #2 }} % was not g
+\unexpanded\def\colordefalt#1#2{\setevalue{\??transparencyattribute#1}{#2}\setvalue {\??transparencysetter#1}{\attribute\transparencyattribute#2 }}
+\unexpanded\def\colordefagt#1#2{\setxvalue{\??transparencyattribute#1}{#2}\setgvalue{\??transparencysetter#1}{\attribute\transparencyattribute#2 }}
+
+\unexpanded\def\colordefflc#1#2{\setvalue {\??colorattribute #1}{\colo_helpers_inherited_current_ca{#2}}\setvalue {\??colorsetter #1}{\colo_helpers_inherited_current_cs{#2}}}
+\unexpanded\def\colordeffgc#1#2{\setgvalue{\??colorattribute #1}{\colo_helpers_inherited_current_ca{#2}}\setvalue {\??colorsetter #1}{\colo_helpers_inherited_current_cs{#2}}}
+\unexpanded\def\colordefflt#1#2{\setvalue {\??transparencyattribute#1}{\colo_helpers_inherited_current_ta{#2}}\setvalue {\??transparencysetter#1}{\colo_helpers_inherited_current_ts{#2}}}
+\unexpanded\def\colordeffgt#1#2{\setgvalue{\??transparencyattribute#1}{\colo_helpers_inherited_current_ta{#2}}\setgvalue{\??transparencysetter#1}{\colo_helpers_inherited_current_ts{#2}}}
+
+\unexpanded\def\colordefrlc #1{\localundefine {\??colorattribute #1}\localundefine {\??colorsetter #1}}
+\unexpanded\def\colordefrgc #1{\globalundefine{\??colorattribute #1}\globalundefine{\??colorsetter #1}}
+\unexpanded\def\colordefrlt #1{\localundefine {\??transparencyattribute#1}\localundefine {\??transparencysetter#1}}
+\unexpanded\def\colordefrgt #1{\globalundefine{\??transparencyattribute#1}\globalundefine{\??transparencysetter#1}}
+
+%D \macros
+%D {colorvalue, grayvalue}
+%D
+%D We can typeset the color components using \type {\colorvalue} and \type
+%D {\grayvalue}. The commands:
+%D
+%D \startbuffer
+%D color value of SomeKindOfRed: \colorvalue{SomeKindOfRed} \crlf
+%D gray value of SomeKindOfRed: \grayvalue{SomeKindOfRed}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D show us:
+%D
+%D \startexample
+%D \getbuffer
+%D \stopexample
+
+\let\currentcolorname\s!black % todo
+\let\outercolorname \s!black % todo
+
+\let\colorformatseparator\space
+
+\def\MPcolor#1%
+ {\clf_mpcolor
+ \attribute\colormodelattribute
+ \colo_helpers_inherited_current_ca{#1} %
+ \colo_helpers_inherited_current_ta{#1} }
+
+\def\MPcoloronly#1%
+ {\clf_mpcolor
+ \attribute\colormodelattribute
+ \colo_helpers_inherited_current_ca{#1} %
+ \zerocount}
+
+\def\MPtransparency#1%
+ {\clf_mpcolor
+ \zerocount
+ \zerocount
+ \colo_helpers_inherited_current_ta{#1} }
+
+\def\MPoptions#1%
+ {\clf_mpoptions
+ \attribute\colormodelattribute
+ \colo_helpers_inherited_current_ca{#1} %
+ \colo_helpers_inherited_current_ta{#1} }
+
+\def\thecolormodelattribute {\the\attribute\colormodelattribute}
+
+%def\thecolorattribute #1{\number\csname\??colorattribute \ifcsname\??colorattribute \currentcolorprefix#1\endcsname\currentcolorprefix#1\else\ifcsname\??colorattribute #1\endcsname#1\fi\fi\endcsname}
+%def\thetransparencyattribute#1{\number\csname\??transparencyattribute\ifcsname\??transparencyattribute\currentcolorprefix#1\endcsname\currentcolorprefix#1\else\ifcsname\??transparencyattribute#1\endcsname#1\fi\fi\endcsname}
+
+\def\rawcolorattribute #1{\ifcsname\??colorattribute \currentcolorprefix#1\endcsname\lastnamedcs\orelse\ifcsname\??colorattribute #1\endcsname\lastnamedcs\else\zerocount\fi}
+\def\rawtransparencyattribute#1{\ifcsname\??transparencyattribute\currentcolorprefix#1\endcsname\lastnamedcs\orelse\ifcsname\??transparencyattribute#1\endcsname\lastnamedcs\else\zerocount\fi}
+
+\def\thecolorattribute #1{\number\ifcsname\??colorattribute \currentcolorprefix#1\endcsname\lastnamedcs\orelse\ifcsname\??colorattribute #1\endcsname\lastnamedcs\else\zerocount\fi}
+\def\thetransparencyattribute#1{\number\ifcsname\??transparencyattribute\currentcolorprefix#1\endcsname\lastnamedcs\orelse\ifcsname\??transparencyattribute#1\endcsname\lastnamedcs\else\zerocount\fi}
+\def\internalspotcolorname #1{\clf_spotcolorname \thecolorattribute{#1} }
+\def\internalspotcolorparent #1{\clf_spotcolorparent\thecolorattribute{#1} }
+\def\internalspotcolorsize #1{\clf_spotcolorvalue \thecolorattribute{#1} }
+
+\def\colorcomponents #1{\clf_colorcomponents \thecolorattribute {#1} }
+\def\transparencycomponents #1{\clf_transparencycomponents\thetransparencyattribute{#1} }
+\def\processcolorcomponents #1{\clf_processcolorcomponents\thecolorattribute {#1} }
+
+\def\colorvalue #1{\clf_formatcolor\thecolorattribute{#1}{\colorformatseparator}}
+\def\grayvalue #1{\clf_formatgray \thecolorattribute{#1}{\colorformatseparator}}
+
+\def\doifelseblack #1{\clf_doifelseblack\thecolorattribute{#1} }
+\def\doifelsedrawingblack {\clf_doifelsedrawingblack}
+
+\let\doifblackelse \doifelseblack
+\let\doifdrawingblackelse \doifelsedrawingblack
+
+\let\doifblackelse \doifelseblack
+\let\doifdrawingblackelse\doifelsedrawingblack
+
+%D \macros
+%D {forcecolorhack}
+%D
+%D We can out this in front of (for instance) a special and so force color to be
+%D applied (only glyphs, rules and leaders are handled).
+%D
+%D \startbuffer
+%D \framed
+%D [background=color,backgroundcolor=yellow,framecolor=red,corner=round]
+%D {test}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+% ignores in attribute handler
+%
+% \def\forcecolorhack{\vrule\s!width\zeropoint\s!height\zeropoint\s!depth\zeropoint}
+
+% \normal added else fails in metafun manual (leaders do a hard scan)
+
+\unexpanded\def\forcecolorhack{\leaders\hrule\hskip\zeropoint\relax} % relax is needed !
+
+%D We default to the colors defined in \type {colo-imp-rgb} and
+%D support both \RGB\ and \CMYK\ output. Transparencies are defined
+%D here:
+
+\definecolor[black][s=0]
+\definecolor[white][s=1]
+
+\definetransparency [none] [0]
+\definetransparency [normal] [1]
+\definetransparency [multiply] [2]
+\definetransparency [screen] [3]
+\definetransparency [overlay] [4]
+\definetransparency [softlight] [5]
+\definetransparency [hardlight] [6]
+\definetransparency [colordodge] [7]
+\definetransparency [colorburn] [8]
+\definetransparency [darken] [9]
+\definetransparency [lighten] [10]
+\definetransparency [difference] [11]
+\definetransparency [exclusion] [12]
+\definetransparency [hue] [13]
+\definetransparency [saturation] [14]
+\definetransparency [color] [15]
+\definetransparency [luminosity] [16]
+
+%D Some common ones:
+
+\definecolor[trace:0][s=.4]
+\definecolor[trace:1][r=.6]
+\definecolor[trace:2][g=.6]
+\definecolor[trace:3][b=.6]
+\definecolor[trace:4][r=.6,g=.6]
+\definecolor[trace:5][r=.6,b=.6]
+\definecolor[trace:6][g=.6,b=.6]
+\definecolor[trace:7][r=.8,g=.4]
+\definecolor[trace:8][r=.8,b=.4]
+\definecolor[trace:9][g=.4,b=.8]
+
+\definecolor[trace:w][s=1]
+\definecolor[trace:r][r=.75,t=.5,a=1]
+\definecolor[trace:g][g=.75,t=.5,a=1]
+\definecolor[trace:b][b=.75,t=.5,a=1]
+%definecolor[trace:c][c=.75,t=.5,a=1]
+%definecolor[trace:m][m=.75,t=.5,a=1]
+%definecolor[trace:y][y=.75,t=.5,a=1]
+\definecolor[trace:c][g=.75,b=.75,t=.5,a=1]
+\definecolor[trace:m][r=.75,b=.75,t=.5,a=1]
+\definecolor[trace:y][r=.75,g=.75,t=.5,a=1]
+\definecolor[trace:s][s=.75,t=.5,a=1]
+\definecolor[trace:d][s=.25,t=.5,a=1]
+\definecolor[trace:o][r=1,g=.6,b=.1,t=.5,a=1]
+
+\definecolor[trace:dw][s=1]
+\definecolor[trace:dr][r=.75,t=.75,a=1]
+\definecolor[trace:dg][g=.75,t=.75,a=1]
+\definecolor[trace:db][b=.75,t=.75,a=1]
+%definecolor[trace:dc][c=.75,t=.75,a=1]
+%definecolor[trace:dm][m=.75,t=.75,a=1]
+%definecolor[trace:dy][y=.75,t=.75,a=1]
+\definecolor[trace:dc][g=.75,b=.75,t=.75,a=1]
+\definecolor[trace:dm][r=.75,b=.75,t=.75,a=1]
+\definecolor[trace:dy][r=.75,g=.75,t=.75,a=1]
+\definecolor[trace:ds][s=.75,t=.75,a=1]
+\definecolor[trace:dd][s=.25,t=.75,a=1]
+\definecolor[trace:do][r=1,g=.6,b=.1,t=.75,a=1]
+
+\setupcolors
+ [\c!state=\v!stop, % color will be enabled later on
+ \c!conversion=\v!yes,
+ \c!rgb=\v!yes,
+ \c!cmyk=\v!yes,
+ \c!spot=\v!yes,
+ \c!pagecolormodel=\v!none,
+ \c!expansion=\v!no,
+ \c!textcolor=,
+ \c!factor=\v!yes]
+
+\setupcolor
+ [\v!rgb]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-cs.mkxl b/Master/texmf-dist/tex/context/base/mkiv/cont-cs.mkxl
new file mode 100644
index 00000000000..8e5ae567cc4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-cs.mkxl
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-cs,
+%D version=1998.12.02,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Czech Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {czech}
+\def\defaultlanguagetag{cs}
+
+\input context.mkxl
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-de.mkxl b/Master/texmf-dist/tex/context/base/mkiv/cont-de.mkxl
new file mode 100644
index 00000000000..579cc88c3c3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-de.mkxl
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-de,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ German Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {german}
+\def\defaultlanguagetag{de}
+
+\input context.mkxl
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-en.mkxl b/Master/texmf-dist/tex/context/base/mkiv/cont-en.mkxl
new file mode 100644
index 00000000000..bfb17ffb3c2
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-en.mkxl
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-en,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ English Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {english}
+\def\defaultlanguagetag{en}
+
+\input context.mkxl
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-fil.mkiv b/Master/texmf-dist/tex/context/base/mkiv/cont-fil.mkiv
index 9257e2e1ed6..aa7d9ddb314 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/cont-fil.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-fil.mkiv
@@ -16,137 +16,142 @@
\writestatus{loading}{ConTeXt File Synonyms}
-\definefilesynonym [chemics] [chemic]
-
-\definefilesynonym [unit] [units]
-
-\definefilesynonym [pstric] [pstricks]
-\definefilesynonym [pstrick] [pstricks]
-
-\definefilesynonym [finance] [financ]
-
-\definefilesynonym [dir-make] [dir-01]
-\definefilesynonym [dir-identify] [dir-05]
-
-\definefilesynonym [int-load] [set-11]
-\definefilesynonym [int-make] [set-12]
-
- \definefilesynonym [fig-base] [fig-00]
- \definefilesynonym [fig-make] [fig-01]
- \definefilesynonym [fig-fake] [fig-02]
- \definefilesynonym [fig-missing] [fig-06]
-
-\definefilesynonym [exi-interface] [exi-21]
-
- \definefilesynonym [res-make] [res-01]
- \definefilesynonym [res-base] [res-04]
- \definefilesynonym [res-crop] [res-07]
- \definefilesynonym [res-trace] [res-08]
- \definefilesynonym [res-log] [res-09]
- \definefilesynonym [res-identify] [res-12]
-
- \definefilesynonym [med-show] [res-50]
-
-\definefilesynonym [pre-general] [pre-00]
-\definefilesynonym [pre-01] [present-original]
-\definefilesynonym [pre-original] [present-original]
-\definefilesynonym [pre-02] [present-green]
-\definefilesynonym [pre-green] [present-green]
-\definefilesynonym [pre-03] [present-funny]
-\definefilesynonym [pre-funny] [present-funny]
-\definefilesynonym [pre-04] [present-colorful]
-\definefilesynonym [pre-colorful] [present-colorful]
-\definefilesynonym [pre-05] [present-fuzzy]
-\definefilesynonym [pre-fuzzy] [present-fuzzy]
-\definefilesynonym [pre-polish] [pre-06]
-\definefilesynonym [pre-spider] [pre-07]
-\definefilesynonym [pre-wonder] [pre-08]
-\definefilesynonym [pre-09] [present-windows]
-\definefilesynonym [pre-windows] [present-windows]
-\definefilesynonym [pre-10] [present-grow]
-\definefilesynonym [pre-grow] [present-grow]
-\definefilesynonym [pre-11] [present-stack]
-\definefilesynonym [pre-stack] [present-stack]
-\definefilesynonym [pre-arrows] [pre-12]
-\definefilesynonym [pre-writing] [pre-13]
-\definefilesynonym [pre-split] [present-split]
-\definefilesynonym [pre-14] [present-split]
-\definefilesynonym [pre-balls] [present-balls]
-\definefilesynonym [pre-15] [present-balls]
-\definefilesynonym [pre-knot] [pre-16]
-\definefilesynonym [pre-17] [present-weird]
-\definefilesynonym [pre-weird] [present-weird]
-\definefilesynonym [pre-shade] [pre-18]
-\definefilesynonym [pre-organic] [pre-19]
-\definefilesynonym [pre-speckle] [pre-20]
-\definefilesynonym [pre-zoom] [pre-21]
-\definefilesynonym [pre-cycle] [pre-22]
-\definefilesynonym [pre-super] [pre-23]
-%definefilesynonym [pre-more] [pre-24]
-%definefilesynonym [pre-more] [pre-25]
-\definefilesynonym [pre-more] [pre-26]
-%definefilesynonym [pre-more] [pre-27]
-%definefilesynonym [pre-more] [pre-28]
-%definefilesynonym [pre-more] [pre-29]
-%definefilesynonym [pre-more] [pre-30]
-\definefilesynonym [pre-41] [present-tiles]
-\definefilesynonym [pre-60] [present-stepwise]
-\definefilesynonym [pre-stepwise] [present-stepwise]
-\definefilesynonym [pre-61] [present-stepper]
-\definefilesynonym [pre-stepper] [present-stepper]
-\definefilesynonym [pre-62] [present-overlap]
-\definefilesynonym [pre-69] [present-wobbling]
-\definefilesynonym [pre-punk] [present-punk]
-\definefilesynonym [pre-70] [present-punk]
-\definefilesynonym [pre-random] [present-random]
-\definefilesynonym [pre-71] [present-random]
-
-\definefilesynonym [abr-01] [abbreviations-pseudocaps]
-\definefilesynonym [abr-02] [abbreviations-smallcaps]
-\definefilesynonym [abr-03] [abbreviations-words]
-\definefilesynonym [abr-04] [abbreviations-mixed]
-
-\definefilesynonym [art-01] [article-basic]
-\definefilesynonym [article] [article-basic]
-\definefilesynonym [mag-01] [magazine-basic]
-\definefilesynonym [magazine] [magazine-basic]
-\definefilesynonym [mod-01] [module-basic]
-\definefilesynonym [module] [module-basic]
-
-\definefilesynonym [map-10] [maps] % for a while
-
-\definefilesynonym [mml] [mathml]
-\definefilesynonym [cml] [chemml]
-
-\definefilesynonym [letter] [cor-01]
-\definefilesynonym [memo] [cor-02]
-\definefilesynonym [resume] [cor-03]
-
-\definefilesynonym [fnt-10] [fonts-complete]
-\definefilesynonym [fnt-11] [fonts-system]
-\definefilesynonym [fnt-20] [fonts-steps]
-\definefilesynonym [fnt-21] [fonts-steps]
-\definefilesynonym [fnt-22] [fonts-engines]
-\definefilesynonym [fnt-23] [fonts-shapes]
-\definefilesynonym [fnt-24] [fonts-cjk]
-\definefilesynonym [fnt-25] [math-characters]
-\definefilesynonym [fnt-28] [fonts-goodies]
-\definefilesynonym [fnt-29] [fonts-shapes]
-\definefilesynonym [fnt-31] [fonts-coverage]
-\definefilesynonym [fnt-33] [math-coverage]
-
-\definefilesynonym [mat-10] [math-characters]
-\definefilesynonym [mat-11] [math-characters]
-\definefilesynonym [mat-12] [math-parameters]
-\definefilesynonym [mat-20] [math-parameters]
-
-\definefilesynonym [syn-01] [syntax]
-
-\definefilesynonym [reg-01] [regimes-list]
-
-\definefilesynonym [set-11] [setups-basics]
-\definefilesynonym [set-12] [setups-overview]
-%definefilesynonym [set-13] [setups-proofing]
-%definefilesynonym [set-15] [setups-generate]
+\definefilesynonym [chemics] [chemic]
+
+\definefilesynonym [unit] [units]
+
+\definefilesynonym [pstric] [pstricks]
+\definefilesynonym [pstrick] [pstricks]
+
+\definefilesynonym [finance] [financ]
+
+\definefilesynonym [dir-make] [dir-01]
+\definefilesynonym [dir-identify] [dir-05]
+
+\definefilesynonym [int-load] [set-11]
+\definefilesynonym [int-make] [set-12]
+
+ \definefilesynonym [fig-base] [fig-00]
+ \definefilesynonym [fig-make] [fig-01]
+ \definefilesynonym [fig-fake] [fig-02]
+ \definefilesynonym [fig-missing] [fig-06]
+
+ \definefilesynonym [exi-interface] [exi-21]
+
+ \definefilesynonym [res-make] [res-01]
+ \definefilesynonym [res-base] [res-04]
+ \definefilesynonym [res-crop] [res-07]
+ \definefilesynonym [res-trace] [res-08]
+ \definefilesynonym [res-log] [res-09]
+ \definefilesynonym [res-identify] [res-12]
+
+ \definefilesynonym [med-show] [res-50]
+
+\definefilesynonym [pre-general] [pre-00]
+\definefilesynonym [pre-01] [present-original]
+\definefilesynonym [pre-original] [present-original]
+\definefilesynonym [pre-02] [present-green]
+\definefilesynonym [pre-green] [present-green]
+\definefilesynonym [pre-03] [present-funny]
+\definefilesynonym [pre-funny] [present-funny]
+\definefilesynonym [pre-04] [present-colorful]
+\definefilesynonym [pre-colorful] [present-colorful]
+\definefilesynonym [pre-05] [present-fuzzy]
+\definefilesynonym [pre-fuzzy] [present-fuzzy]
+\definefilesynonym [pre-polish] [pre-06]
+\definefilesynonym [pre-spider] [pre-07]
+\definefilesynonym [pre-wonder] [pre-08]
+\definefilesynonym [pre-09] [present-windows]
+\definefilesynonym [pre-windows] [present-windows]
+\definefilesynonym [pre-10] [present-grow]
+\definefilesynonym [pre-grow] [present-grow]
+\definefilesynonym [pre-11] [present-stack]
+\definefilesynonym [pre-stack] [present-stack]
+\definefilesynonym [pre-arrows] [pre-12]
+\definefilesynonym [pre-writing] [pre-13]
+\definefilesynonym [pre-split] [present-split]
+\definefilesynonym [pre-14] [present-split]
+\definefilesynonym [pre-balls] [present-balls]
+\definefilesynonym [pre-15] [present-balls]
+\definefilesynonym [pre-knot] [pre-16]
+\definefilesynonym [pre-17] [present-weird]
+\definefilesynonym [pre-weird] [present-weird]
+\definefilesynonym [pre-shade] [pre-18]
+\definefilesynonym [pre-organic] [pre-19]
+\definefilesynonym [pre-speckle] [pre-20]
+\definefilesynonym [pre-zoom] [pre-21]
+\definefilesynonym [pre-cycle] [pre-22]
+\definefilesynonym [pre-super] [pre-23]
+%definefilesynonym [pre-more] [pre-24]
+%definefilesynonym [pre-more] [pre-25]
+\definefilesynonym [pre-more] [pre-26]
+%definefilesynonym [pre-more] [pre-27]
+%definefilesynonym [pre-more] [pre-28]
+%definefilesynonym [pre-more] [pre-29]
+%definefilesynonym [pre-more] [pre-30]
+\definefilesynonym [pre-41] [present-tiles]
+\definefilesynonym [pre-60] [present-stepwise]
+\definefilesynonym [pre-stepwise] [present-stepwise]
+\definefilesynonym [pre-61] [present-stepper]
+\definefilesynonym [pre-stepper] [present-stepper]
+\definefilesynonym [pre-62] [present-overlap]
+\definefilesynonym [pre-69] [present-wobbling]
+\definefilesynonym [pre-punk] [present-punk]
+\definefilesynonym [pre-70] [present-punk]
+\definefilesynonym [pre-random] [present-random]
+\definefilesynonym [pre-71] [present-random]
+
+\definefilesynonym [abr-01] [abbreviations-pseudocaps]
+\definefilesynonym [abr-02] [abbreviations-smallcaps]
+\definefilesynonym [abr-03] [abbreviations-words]
+\definefilesynonym [abr-04] [abbreviations-mixed]
+
+\definefilesynonym [art-01] [article-basic]
+\definefilesynonym [article] [article-basic]
+\definefilesynonym [mag-01] [magazine-basic]
+\definefilesynonym [magazine] [magazine-basic]
+\definefilesynonym [mod-01] [module-basic]
+\definefilesynonym [module] [module-basic]
+
+\definefilesynonym [map-10] [maps] % for a while
+
+\definefilesynonym [mml] [mathml]
+\definefilesynonym [cml] [chemml]
+
+\definefilesynonym [letter] [cor-01]
+\definefilesynonym [memo] [cor-02]
+\definefilesynonym [resume] [cor-03]
+
+\definefilesynonym [fnt-10] [fonts-complete]
+\definefilesynonym [fnt-11] [fonts-system]
+\definefilesynonym [fnt-20] [fonts-steps]
+\definefilesynonym [fnt-21] [fonts-steps]
+\definefilesynonym [fnt-22] [fonts-engines]
+\definefilesynonym [fnt-23] [fonts-shapes]
+\definefilesynonym [fnt-24] [fonts-cjk]
+\definefilesynonym [fnt-25] [math-characters]
+\definefilesynonym [fnt-28] [fonts-goodies]
+\definefilesynonym [fnt-29] [fonts-shapes]
+\definefilesynonym [fnt-31] [fonts-coverage]
+\definefilesynonym [fnt-33] [math-coverage]
+
+\definefilesynonym [mat-10] [math-characters]
+\definefilesynonym [mat-11] [math-characters]
+\definefilesynonym [mat-12] [math-parameters]
+\definefilesynonym [mat-20] [math-parameters]
+
+\definefilesynonym [syn-01] [syntax]
+
+\definefilesynonym [reg-01] [regimes-list]
+
+\definefilesynonym [set-11] [setups-basics]
+\definefilesynonym [set-12] [setups-overview]
+%definefilesynonym [set-13] [setups-proofing]
+%definefilesynonym [set-15] [setups-generate]
+
+\ifcase\contextlmtxmode \else
+ \definefilesynonym [ecmascript] [libs-imp-mujs]
+ \definefilesynonym [zint] [libs-imp-zint]
+\fi
\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-fr.mkxl b/Master/texmf-dist/tex/context/base/mkiv/cont-fr.mkxl
new file mode 100644
index 00000000000..bedae536b66
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-fr.mkxl
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-de,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ French Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {french}
+\def\defaultlanguagetag{fr}
+
+\input context.mkxl
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-gb.mkxl b/Master/texmf-dist/tex/context/base/mkiv/cont-gb.mkxl
new file mode 100644
index 00000000000..464b237da87
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-gb.mkxl
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-uk,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ English Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {english}
+\def\defaultlanguagetag{gb}
+
+\input context.mkxl
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-it.mkxl b/Master/texmf-dist/tex/context/base/mkiv/cont-it.mkxl
new file mode 100644
index 00000000000..1702a872fa4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-it.mkxl
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-it,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Italian Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {italian}
+\def\defaultlanguagetag{it}
+
+\input context.mkxl
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-log.mkiv b/Master/texmf-dist/tex/context/base/mkiv/cont-log.mkiv
index f9fc6a8f765..75d87eb81d9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/cont-log.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-log.mkiv
@@ -52,7 +52,7 @@
\begingroup
\setbox\scratchbox\hbox{L}%
\scratchdimen\ht\scratchbox
- \setbox\scratchbox\hbox{\txx A}%
+ \setbox\scratchbox\hbox{\doresetattribute{case}\txx A}%
L\kern-.55\wd\scratchbox
\raise\scratchdimen\hbox{\lower\ht\scratchbox\copy\scratchbox}%
\kern-.2\wd\scratchbox\TeX
@@ -198,14 +198,14 @@
%D Some placeholders:
-\unexpanded\def\eTeX {\mathematics{\varepsilon}-\TeX}
-\unexpanded\def\pdfTeX {pdf\wordboundary\TeX}
-\unexpanded\def\pdfeTeX {pdfe-\wordboundary\TeX}
-\unexpanded\def\luaTeX {lua\wordboundary\TeX}
-\unexpanded\def\Lua {Lua}
-\unexpanded\def\luajitTeX{luajit\wordboundary\TeX}
-\unexpanded\def\metaTeX {meta\wordboundary\TeX}
-%unexpanded\def\XeTeX {X\lower.5\exheight\hbox{\kern-.15\emwidth\mirror{E}}\kern-.1667\emwidth\TeX}
+\unexpanded\def\eTeX {\mathematics{\varepsilon}-\TeX}
+\unexpanded\def\pdfTeX {pdf\wordboundary\TeX}
+\unexpanded\def\pdfeTeX {pdfe-\wordboundary\TeX}
+\unexpanded\def\luaTeX {lua\wordboundary\TeX}
+\unexpanded\def\Lua {Lua}
+\unexpanded\def\luajitTeX {lua\wordboundary jit\wordboundary\TeX}
+\unexpanded\def\luametaTeX{lua\wordboundary meta\wordboundary\TeX}
+%unexpanded\def\XeTeX {X\lower.5\exheight\hbox{\kern-.15\emwidth\mirror{E}}\kern-.1667\emwidth\TeX}
% Adapted from a patch by Mojca:
@@ -229,13 +229,15 @@
\fi}%
\kern-.1667\emwidth\TeX}
-\let\ETEX \eTeX
-\let\PDFTEX \pdfTeX
-\let\PDFETEX \pdfeTeX
-\let\LUATEX \luaTeX
-\let\LUAJITTEX\luajitTeX
-\let\LuaTeX \luaTeX
-\let\XETEX \XeTeX
+\let\ETEX \eTeX
+\let\PDFTEX \pdfTeX
+\let\PDFETEX \pdfeTeX
+\let\LUATEX \luaTeX
+\let\LUAJITTEX \luajitTeX
+\let\LuaTeX \luaTeX
+\let\LuaMetaTeX\luametaTeX
+\let\LUAMETATEX\luametaTeX
+\let\XETEX \XeTeX
\unexpanded\def\LuaTeX
{\dontleavehmode
@@ -273,28 +275,33 @@
\let\LUATEX \LuaTeX
\let\LUAJITTEX\LuajitTeX
-\unexpanded\def\MKII{MkII}
-\unexpanded\def\MKIV{MkIV}
-\unexpanded\def\MKVI{MkVI}
-\unexpanded\def\MKIX{MkIX}
-\unexpanded\def\MKXI{MkXI}
+\unexpanded\def\MKII{MkII} % MarkTwo
+\unexpanded\def\MKIV{MkIV} % MarkFour : MKIV
+\unexpanded\def\MKVI{MkVI} % MarkSix : MKIV
+\unexpanded\def\MKXL{MkXL} % MarkFourty : LMTX
+\unexpanded\def\MKLX{MkLX} % MarkSixty : LMTX
+\unexpanded\def\MKIX{MkIX} % : MKIV / LMTX
+\unexpanded\def\MKXI{MkXI} % : MKIV / LMTX
-\unexpanded\def\MPII{MpII}
-\unexpanded\def\MPIV{MpIV}
-\unexpanded\def\MPVI{MpVI}
+\unexpanded\def\MPII{MpII} % MarkTwo
+\unexpanded\def\MPIV{MpIV} % MarkFour : MetaFun
+\unexpanded\def\MPVI{MpVI} % MarkSix : MetaFun
+\unexpanded\def\MPXL{MpXL} % MarkFourty : LuaMetaFun
+\unexpanded\def\MPLX{MpLX} % MarkSixty : LuaMetaFun
-\unexpanded\def\LMTX{lmtx}
+\unexpanded\def\LMTX{lmtx} % for LuaMetaTeX
\appendtoks
- \def\ConTeXt {ConTeXt}%
- \def\MetaPost {MetaPost}%
- \def\MetaFont {MetaFont}%
- \def\MetaFun {MetaFun}%
- \def\TeX {TeX}%
- \def\TeXsuffix{TeX}%
- \def\TeXprefix{TeX}%
- \def\LuaTeX {LuaTeX}%
- \def\LuajitTeX{LuajitTeX}%
+ \def\ConTeXt {ConTeXt}%
+ \def\MetaPost {MetaPost}%
+ \def\MetaFont {MetaFont}%
+ \def\MetaFun {MetaFun}%
+ \def\TeX {TeX}%
+ \def\TeXsuffix {TeX}%
+ \def\TeXprefix {TeX}%
+ \def\LuaTeX {LuaTeX}%
+ \def\LuajitTeX {LuajitTeX}%
+ \def\LuaMetaTeX{LuaMetaTeX}%
\let\wordboundary\empty
\to \everysimplifycommands
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-new.mkiv b/Master/texmf-dist/tex/context/base/mkiv/cont-new.mkiv
index f7581465258..97d5d207165 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/cont-new.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-new.mkiv
@@ -11,7 +11,9 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2019.03.21 21:39}
+% \normalend % uncomment this to get the real base runtime
+
+\newcontextversion{2020.02.17 12:06}
%D This file is loaded at runtime, thereby providing an excellent place for
%D hacks, patches, extensions and new features.
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-nl.mkxl b/Master/texmf-dist/tex/context/base/mkiv/cont-nl.mkxl
new file mode 100644
index 00000000000..1f00e7e892f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-nl.mkxl
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-nl,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Dutch Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {dutch}
+\def\defaultlanguagetag{nl}
+
+\input context.mkxl
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-pe.mkxl b/Master/texmf-dist/tex/context/base/mkiv/cont-pe.mkxl
new file mode 100644
index 00000000000..82bf7372195
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-pe.mkxl
@@ -0,0 +1,22 @@
+%D \module
+%D [ file=cont-en,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ English Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {persian}
+\def\messageinterface {english}
+\def\defaultlanguagetag{pe}
+
+\input context.mkxl
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-ro.mkxl b/Master/texmf-dist/tex/context/base/mkiv/cont-ro.mkxl
new file mode 100644
index 00000000000..6d636c7dc87
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-ro.mkxl
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-ro,
+%D version=2000.01.09,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Romanian Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {romanian}
+\def\defaultlanguagetag{ro}
+
+\input context.mkxl
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/cont-run.lua b/Master/texmf-dist/tex/context/base/mkiv/cont-run.lua
index 2634654fe77..9a2b3db965c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/cont-run.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/cont-run.lua
@@ -166,10 +166,7 @@ if sandboxing then
-- We block some potential escapes from protection.
- context [[
- \let\primitive \relax
- \let\normalprimitive\relax
- ]]
+ context [[\let\primitive\relax\let\normalprimitive\relax]]
debug = {
traceback = traceback,
diff --git a/Master/texmf-dist/tex/context/base/mkiv/context-error.lmx b/Master/texmf-dist/tex/context/base/mkiv/context-error.lmx
index b82b552f88f..d1a758b050a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/context-error.lmx
+++ b/Master/texmf-dist/tex/context/base/mkiv/context-error.lmx
@@ -46,7 +46,7 @@
</table>
<br/>
<pre>
- <?lua pv('errorcontext')?>
+<?lua pv('errorcontext')?>
</pre>
</div></div>
<div id="bottom"><div id="bottom-one"><div id="bottom-two">
diff --git a/Master/texmf-dist/tex/context/base/mkiv/context-lmtx-error.pdf b/Master/texmf-dist/tex/context/base/mkiv/context-lmtx-error.pdf
new file mode 100644
index 00000000000..0455781a396
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/context-lmtx-error.pdf
Binary files differ
diff --git a/Master/texmf-dist/tex/context/base/mkiv/context-lmtx-error.tex b/Master/texmf-dist/tex/context/base/mkiv/context-lmtx-error.tex
new file mode 100644
index 00000000000..25020cb59fb
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/context-lmtx-error.tex
@@ -0,0 +1,8 @@
+\startTEXpage[offset=overlay,toffset=.5pt,boffset=.5pt,background=color,backgroundcolor=gray]
+ \definedfont[LMTypewriterVarWd-Regular]%
+ \darkred e%
+ \darkgreen r%
+ \darkblue r%
+ \darkyellow o%
+ \darkgray r%
+\stopTEXpage
diff --git a/Master/texmf-dist/tex/context/base/mkiv/context-todo.tex b/Master/texmf-dist/tex/context/base/mkiv/context-todo.tex
index a356d596423..6aa5bca08a8 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/context-todo.tex
+++ b/Master/texmf-dist/tex/context/base/mkiv/context-todo.tex
@@ -70,16 +70,18 @@
draw d withcolor "ColorTwo" withpen pencircle scaled (o - 5) ;
draw l withcolor white withpen pencircle scaled (o / 5) ;
draw l withcolor "ColorTwo" withpen pencircle scaled (o /10) ;
- draw thelabel.ulft(t xsized .5PaperWidth,lrcorner Page shifted - (PaperWidth/20,-PaperWidth/40)) ;
+ draw thelabel.ulft((t xsized .5PaperWidth),lrcorner Page shifted - (PaperWidth/20,-PaperWidth/40)) ;
StopPage ;
\stopMPpage
-
\startsubject[title={Introduction}]
-There is not really a long term roadmap for development. One reason is that there is already
-a lot available. When we started with \LUATEX, the \CONTEXT\ code was mostly rewritten,
-and that process is more of less finished. Of course there is always work left.
+There is not really a long term roadmap for development. One reason is that there
+is already a lot available. When we started with \LUATEX, the \CONTEXT\ code was
+mostly rewritten from \MKII\ to \MKIV, and that process is more of less finished.
+Of course there is always work left. We have moved on to \LUAMETATEX\ and \LMTX\
+as follow up on \MKIV. Deep down some things might (and will) change but the user
+interface will stay the same (as usual).
This file is not a complete overview of our plans but users can at least get an
idea of what we're working on and what is coming. Feel free to submit
@@ -93,35 +95,32 @@ Hasselt NL
\stopsubject
-\startsubject[title={On the agenda for \LUATEX}]
+\startsubject[title={On the agenda for \LUAMETATEX}]
+
+The agenda for \LUATEX\ is basically empty as this program is (supposed to be)
+frozen, but for \LUAMETATEX\ we can still consider improvements. In fact, there
+are quite some changes between the engines already (internally). Items that
+concern \LUATEX\ have been removed from the agenda but some improvements in
+\LUAMETATEX\ might trickle back.
\startitemize
\startitem
- cleanup passive nodes
- \stopitem
- \startitem
- optimize some callback resolution (more direct)
+ cleanup passive nodes in the par builder
\stopitem
\startitem
- add \type {--output-filename} for \PDF\ filename
+ optimize some callback resolution (more direct) but there is not that
+ much to gain there
\stopitem
\startitem
- more consistent \type {lang_variables} and \type {tex_language} in \type
- {texlang.w} and also store the \type {*mins}
+ remove local par in head of line when done with linebreak and maybe also
+ ensure leftskip and rightskip
\stopitem
\startitem
- remove local par in head of line when done with linebreak
+ only return nil in lua helpers when we expect multiple calls in in one
+ line
\stopitem
\startitem
- check why leftskip doesn't always inherit attributes (maybe dir notes don't have them)
- (also check redundant \type {delete_attribute_ref} after \type {new_glue})
- \stopitem
- \startitem
- only return nil when we expect multiple calls in in one line
- \stopitem
- \startitem
- pdf injection in virtual characters (currently qQ interferes with font switch
- flushing) so a pdf page hack is needed
+ experiment a bit more with the new protrusion code
\stopitem
\stopitemize
@@ -140,7 +139,7 @@ Hasselt NL
add flag to font for math engine
\stopitem
\startitem
- get rid of components
+ get rid of components in glyph nodes
\stopitem
\startitem
play with box attributes
@@ -150,15 +149,24 @@ Hasselt NL
styles, properties)
\stopitem
\startitem
+ freeze actions and tasks (by name or function), maybe a register
+ function that does that so no one can overload built-in features
+ \startitem
redo some of the spacing (adapt to improvements in engine)
\stopitem
\startitem
- reorganize position data (more subtables)
+ more node and code injections
+ \stopitem
+ \startitem
+ maybe reorganize position data (more subtables)
\stopitem
\startitem
use \type {\matheqnogapstep}, \type {\Ustack}, \type {\mathscriptsmode},
\type {\mathdisplayskipmode} and other new math primitives
\stopitem
+ \startitem
+ cleanup some lua helpers (io.exists vs lfs.isfile)
+ \stopitem
\stopitemize
\stopsubject
diff --git a/Master/texmf-dist/tex/context/base/mkiv/context.mkiv b/Master/texmf-dist/tex/context/base/mkiv/context.mkiv
index 4059a29759b..9cdb78c47e7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/context.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/context.mkiv
@@ -18,31 +18,34 @@
% 0.2 sec : format dumped
% 0.2 sec : char-def/char-ini (no bytecode)
%
-% So a format still saves some 1.5 seconds (with luajjitex) startup and
-% on network shares cq. when no files are cached by the os it's of course
-% much worse. A zero run is .27 sec with luajittex.
+%D So a format still saves some 1.5 seconds (with luajjitex) startup and on network
+%D shares cq. when no files are cached by the os it's of course much worse. A zero
+%D run is .27 sec with luajittex. In luametatex it's faster anyway (2.4 sec).
-% http://build.contextgarden.net/waterfall?tag=c/luatex
+%D The real minimal startup time can be measured by uncommenting \type {\normalend}
+%D in the \type {cont-new.mkiv} file. When we subtract .250 for \LUA\ initialization
+%D from 0.300 runtime and also subtract some 0.030 for the resolver, we get about
+%D 0.020 for format loading which is pretty fast. We're talking \LUAMETATEX\ here.
-% Welcome to context, pronounced as kontekst (rather dutch) and not as
-% conτεχt.
+% http://build.contextgarden.net/waterfall?tag=c/lua(meta)tex
+
+%D Welcome to context, pronounced as kontekst (rather dutch) and not as conτεχt.
\catcode`\{=1 \catcode`\}=2 \catcode`\#=6
-%D From the next string (which is set by the script that assembles the
-%D distribution) later on we will calculate a number that can be used
-%D by use modules to identify the feature level. Starting with version
-%D 2004.8.30 the low level interface is english. Watch out and adapt
-%D your styles an modules.
+%D From the next string (which is set by the script that assembles the distribution)
+%D later on we will calculate a number that can be used by use modules to identify
+%D the feature level. Starting with version 2004.8.30 the low level interface is
+%D english. Watch out and adapt your styles an modules.
% \everypar{\writestatus{!!!!}{some spurious input in line \the\inputlineno}\wait}
-%D The order of loading will change when all modules have been cleaned
-%D up and the dependencies are more consistent. beware, the version number
-%D has to match \type {YYYY.MM.DD HH:MM} format.
+%D The order of loading will change when all modules have been cleaned up and the
+%D dependencies are more consistent. Beware, the version number has to match \type
+%D {YYYY.MM.DD HH:MM} format.
\edef\contextformat {\jobname}
-\edef\contextversion{2019.03.21 21:39}
+\edef\contextversion{2020.02.17 12:06}
\edef\contextkind {beta}
%D Kind of special:
@@ -61,31 +64,30 @@
\ifx\normalinput\undefined \let\normalinput\input \fi
-\def\loadcorefile#1{\normalinput#1\relax}
-\def\loadmarkfile#1{\normalinput#1.\mksuffix\relax}
-\def\loadmkiifile#1{}
-\def\loadmkivfile#1{\normalinput#1.mkiv\relax}
-\def\loadmkvifile#1{\normalinput#1.mkvi\relax}
+\def\loadmarkfile#1{\normalinput{#1.\mksuffix}}
+\def\loadmkivfile#1{\normalinput{#1.mkiv}}
+\def\loadmkvifile#1{\normalinput{#1.mkvi}}
+%def\loadmkilfile#1{\normalinput{#1.mkil}}
+%def\loadmklifile#1{\normalinput{#1.mkli}}
-%D First we load the system modules. These implement a lot of
-%D manipulation macros. We start with setting up some basic \TEX\
-%D machinery.
+%D First we load the system modules. These implement a lot of manipulation macros.
+%D We start with setting up some basic \TEX\ machinery.
\loadmarkfile{syst-ini}
+%D We just quit if new functionality is expected.
+
+\ifnum\luatexversion<110 % also change message
+ \writestatus{!!!!}{Your luatex binary is too old, you need at least version 1.10!}
+ \expandafter\end
+\fi
+
%D Some checking (more primitives are now defined):
\ifdefined\defaultinterface \else \def\defaultinterface {english} \fi
%ifdefined\messageinterface \else \let\messageinterface \defaultinterface \fi
\ifdefined\defaultlanguagetag \else \def\defaultlanguagetag{en} \fi
-%D We just quit if new functionality is expected.
-
-\ifnum\luatexversion<109 % also change message
- \writestatus{!!!!}{Your luatex binary is too old, you need at least version 1.09!}
- \expandafter\end
-\fi
-
%D There is only this way to pass the version info to \LUA\ (currently). Hm, we could
%D now put it into the environment.
@@ -116,8 +118,8 @@
% \tracecatcodetables
-% From here on we have \unexpanded being \normalprotected, as we already had
-% \unexpanded long before etex came around.
+%D From here on we have \unexpanded being \normalprotected, as we already had
+%D \type {\unexpanded} long before etex came around.
\loadmarkfile{luat-ini}
\loadmarkfile{toks-scn}
@@ -135,13 +137,11 @@
\loadmkvifile{file-res}
\loadmkvifile{file-lib}
-\doifelsefileexists{core-lmt.mkiv} {\loadmarkfile{core-lmt}} {}
-
-% needs more checking for clashes:
-%
-% no need to register, just execute once, slightly faster
-%
-% \doifelsefileexists{l-macro-imp-codes.lua}{\registerctxluafile{l-macro-imp-codes}{}}{}
+%D This needs more checking for clashes:
+%D
+%D \starttyping
+%D \doifelsefileexists{l-macro-imp-codes.lua}{\registerctxluafile{l-macro-imp-codes}{}}{}
+%D \stoptyping
\loadmarkfile{supp-dir}
@@ -154,7 +154,6 @@
\loadmarkfile{mult-aux}
\loadmarkfile{mult-def}
\loadmarkfile{mult-chk}
-%loadmarkfile{mult-aux} % moved up
\loadmkvifile{mult-dim}
\loadmarkfile{cldf-int} % interface
@@ -182,9 +181,11 @@
\loadmarkfile{node-mig}
%loadmarkfile{node-pag}
-\loadmarkfile{driv-ini}
+\loadmarkfile{driv-ini} % lmtx
\loadmarkfile{back-ini}
+\loadmarkfile{back-res}
+\loadmarkfile{back-trf}
\loadmarkfile{attr-col}
\loadmarkfile{attr-lay}
@@ -523,6 +524,7 @@
\loadmkvifile{strc-not}
\loadmkvifile{strc-lnt}
+\loadmkivfile{strc-tnt}
\loadmkivfile{strc-usr}
\loadmarkfile{pack-com}
@@ -580,8 +582,7 @@
% now we hook in backend code (needs checking)
\loadmarkfile{back-exp}
-
-\loadmarkfile{back-pdf} % actually, this one should load the next three using document.arguments.backend
+\loadmarkfile{back-pdf}
\loadmarkfile{mlib-pdf}
\loadmarkfile{mlib-pps}
@@ -598,8 +599,6 @@
\loadmarkfile{cont-run} % the main runner (used in cont-yes.mkiv)
-\doifelsefileexists{driv-shp.mkiv} {\loadmarkfile{driv-shp}} {}
-
\setupcurrentlanguage[\defaultlanguagetag]
\prependtoks
diff --git a/Master/texmf-dist/tex/context/base/mkiv/context.mkxl b/Master/texmf-dist/tex/context/base/mkiv/context.mkxl
new file mode 100644
index 00000000000..5cb85c4cd32
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/context.mkxl
@@ -0,0 +1,619 @@
+%D \module
+%D [ file=context,
+%D version=2019.07.24, % 2008.28.10, % 1995.10.10,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Format Generation,
+%D author=Hans Hagen, % ɦɑns ɦɑˈχən
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% http://build.contextgarden.net/waterfall?tag=c/lua(meta)tex
+
+%D Welcome to context, pronounced as kontekst (rather dutch) and not as conτεχt.
+
+\catcode`\{=1 \catcode`\}=2 \catcode`\#=6
+
+%D From the next string (which is set by the script that assembles the distribution)
+%D later on we will calculate a number that can be used by use modules to identify
+%D the feature level. Starting with version 2004.8.30 the low level interface is
+%D english. Watch out and adapt your styles an modules.
+
+% \everypar{\writestatus{!!!!}{some spurious input in line \the\inputlineno}\wait}
+
+%D The order of loading will change when all modules have been cleaned up and the
+%D dependencies are more consistent. Beware, the version number has to match \type
+%D {YYYY.MM.DD HH:MM} format.
+
+\edef\contextformat {\jobname}
+\edef\contextversion{2020.02.17 12:06}
+\edef\contextkind {beta}
+
+%D Kind of special:
+
+\chardef\contextlmtxmode\directlua{tex.print(CONTEXTLMTXMODE or 0)}\relax
+
+%D For those who want to use this:
+
+\let\fmtname \contextformat
+\let\fmtversion\contextversion
+
+%D Loading:
+
+\edef\mksuffix {mkiv}
+\edef\contextmark{MKIV}
+
+\ifx\normalinput\undefined \let\normalinput\input \fi
+
+\def\loadmarkfile#1{\normalinput{#1.\mksuffix}}
+\def\loadmkivfile#1{\normalinput{#1.mkiv}}
+\def\loadmkvifile#1{\normalinput{#1.mkvi}}
+\def\loadmkxlfile#1{\normalinput{#1.mkxl}}
+\def\loadmklxfile#1{\normalinput{#1.mklx}}
+
+%D First we load the system modules. These implement a lot of manipulation macros.
+%D We start with setting up some basic \TEX\ machinery.
+
+\loadmkxlfile{syst-ini} % LMTX
+
+%D We just quit if new functionality is expected.
+
+\ifnum\luatexversion<200 % also change message
+ \writestatus{!!!!}{Your luametatex binary is too old, you need at least version 2.00!}
+ \expandafter\end
+\fi
+
+%D Some checking (more primitives are now defined):
+
+\ifdefined\defaultinterface \else \def\defaultinterface {english} \fi
+%ifdefined\messageinterface \else \let\messageinterface \defaultinterface \fi
+\ifdefined\defaultlanguagetag \else \def\defaultlanguagetag{en} \fi
+
+%D There is only this way to pass the version info to \LUA\ (currently). Hm, we could
+%D now put it into the environment.
+
+\newtoks\contextversiontoks \contextversiontoks\expandafter{\contextversion}
+\newtoks\contextkindtoks \contextkindtoks \expandafter{\contextkind}
+
+% \normaleverypar{\wait} % uncomment for test of funny injections
+
+%D Now the more fundamental code gets defined.
+
+\loadmarkfile{norm-ctx}
+\loadmarkfile{syst-pln}
+\loadmarkfile{syst-mes}
+
+\loadmarkfile{luat-cod}
+\loadmarkfile{luat-bas}
+\loadmarkfile{luat-lib}
+\loadmarkfile{luat-soc}
+
+\loadmarkfile{catc-ini}
+\loadmarkfile{catc-act}
+\loadmarkfile{catc-def}
+\loadmarkfile{catc-ctx}
+\loadmarkfile{catc-sym}
+
+\loadmarkfile{toks-ini}
+\loadmarkfile{cldf-ini}
+
+% \tracecatcodetables
+
+%D From here on we have \unexpanded being \normalprotected, as we already had
+%D \type {\unexpanded} long before etex came around.
+
+\loadmarkfile{luat-ini}
+\loadmarkfile{toks-scn}
+
+\loadmkxlfile{syst-aux} % LMTX
+\loadmkxlfile{syst-lua} % LMTX
+\loadmkxlfile{syst-con} % LMTX
+
+\loadmarkfile{syst-fnt}
+\loadmarkfile{syst-rtp}
+
+\loadmarkfile{luat-usr}
+
+\loadmkvifile{file-ini}
+\loadmkvifile{file-res}
+\loadmkvifile{file-lib}
+
+\loadmkxlfile{core-lmt} % LMTX
+
+%D This needs more checking for clashes:
+%D
+%D \starttyping
+%D \doifelsefileexists{l-macro-imp-codes.lua}{\registerctxluafile{l-macro-imp-codes}{}}{}
+%D \stoptyping
+
+\loadmarkfile{supp-dir}
+
+\loadmarkfile{char-utf} % generic code (i.e. not much tex) ... could become unic-ini
+\loadmarkfile{char-ini} % tex / context specific
+\loadmarkfile{char-act} % even more specific
+
+\loadmarkfile{mult-ini}
+\loadmarkfile{mult-sys}
+\loadmkxlfile{mult-aux} % LMTX
+\loadmarkfile{mult-def}
+\loadmarkfile{mult-chk}
+\loadmkvifile{mult-dim}
+
+\loadmarkfile{cldf-int} % interface
+
+\loadmarkfile{trac-ctx} % maybe move up
+
+% \loadmarkfile{luat-ini}
+
+\loadmarkfile{toks-tra}
+\loadmarkfile{toks-aux}
+%loadmarkfile{toks-map} % obsolete, never used
+
+\loadmarkfile{attr-ini}
+
+\loadmarkfile{core-ini}
+\loadmarkfile{core-env}
+
+\loadmarkfile{layo-ini}
+
+\loadmarkfile{node-ini}
+
+\loadmarkfile{cldf-bas} % basics / depends on nodes
+
+\loadmkivfile{node-fin}
+\loadmarkfile{node-mig}
+%loadmarkfile{node-pag}
+
+\loadmkxlfile{driv-ini} % LMTX
+
+\loadmkxlfile{back-ini} % LMTX
+\loadmarkfile{back-res}
+\loadmarkfile{back-trf}
+\loadmkxlfile{back-out} % LMTX
+
+\loadmarkfile{attr-col}
+\loadmarkfile{attr-lay}
+\loadmarkfile{attr-neg}
+\loadmarkfile{attr-eff}
+\loadmarkfile{attr-mkr}
+
+\loadmarkfile{trac-tex}
+\loadmarkfile{trac-deb} % will move up
+
+%loadmarkfile{blob-ini} % not to be used, we only use a helper
+
+\loadmkxlfile{supp-box} % LMTX
+
+\loadmarkfile{supp-ran}
+\loadmarkfile{supp-mat}
+
+\loadmarkfile{core-uti}
+\loadmkvifile{file-job}
+
+\loadmarkfile{anch-pos}
+
+\loadmarkfile{typo-ini}
+\loadmarkfile{typo-lin}
+\loadmarkfile{typo-bld} % par builders
+
+\loadmarkfile{typo-inj}
+
+\loadmkvifile{file-syn}
+\loadmkvifile{file-mod}
+
+\loadmarkfile{core-sys}
+\loadmarkfile{core-con}
+
+\loadmarkfile{cont-fil}
+
+\loadmarkfile{regi-ini}
+\loadmarkfile{enco-ini}
+\loadmkxlfile{hand-ini}
+
+\loadmkxlfile{lang-ini} % LMTX
+\loadmarkfile{lang-hyp} % also loads dis
+\loadmkxlfile{lang-lab} % LMTX
+
+\loadmarkfile{unic-ini}
+
+% \loadmarkfile{core-uti}
+\loadmarkfile{core-two}
+\loadmarkfile{core-dat}
+
+\loadmkxlfile{colo-ini} % LMTX
+\loadmarkfile{colo-grp} % optional
+\loadmarkfile{colo-ext}
+
+\loadmarkfile{node-bck} % overloads anch-pgr (experimental and undocumented)
+
+\loadmarkfile{pack-cut}
+
+\loadmarkfile{lang-mis}
+\loadmarkfile{lang-url}
+\loadmarkfile{lang-def}
+
+% \loadmkvifile{file-job} % why so late?
+
+\loadmarkfile{symb-ini} % brrr depends on fonts
+
+\loadmarkfile{sort-ini}
+
+\loadmkvifile{pack-mis}
+\loadmkxlfile{pack-ori} % LMTX
+\loadmkxlfile{pack-rul} % LMTX
+\loadmarkfile{pack-mrl}
+\loadmkvifile{pack-bck}
+\loadmarkfile{pack-fen}
+
+\loadmarkfile{lxml-ini}
+\loadmarkfile{lxml-sor}
+
+\loadmkvifile{typo-prc}
+
+% \loadmarkfile{anch-pos}
+
+\loadmkvifile{strc-ini}
+\loadmarkfile{strc-tag}
+\loadmarkfile{strc-doc}
+\loadmarkfile{strc-num}
+\loadmarkfile{strc-mar}
+\loadmarkfile{strc-sbe}
+\loadmkvifile{strc-lst}
+\loadmarkfile{strc-sec}
+\loadmarkfile{strc-pag} % hm, depends on core-num
+\loadmarkfile{strc-ren}
+\loadmarkfile{strc-xml}
+\loadmarkfile{strc-def} % might happen later
+\loadmkvifile{strc-ref}
+%loadmarkfile{strc-reg}
+\loadmkvifile{strc-lev} % experiment
+
+\loadmarkfile{spac-hor}
+\loadmarkfile{spac-ali}
+\loadmarkfile{spac-flr}
+\loadmkxlfile{spac-ver} % LMTX beware, hooks into strc-sec
+\loadmarkfile{spac-lin}
+\loadmarkfile{spac-pag}
+\loadmarkfile{spac-par}
+\loadmarkfile{spac-def}
+\loadmkvifile{spac-prf}
+\loadmarkfile{spac-grd}
+
+%loadmarkfile{anch-pos}
+
+\loadmkvifile{scrn-ini}
+\loadmkvifile{scrn-ref}
+
+\loadmarkfile{pack-obj}
+
+\loadmklxfile{strc-itm} % LMTX
+
+\loadmkvifile{strc-con}
+\loadmkvifile{strc-des}
+\loadmkvifile{strc-enu}
+
+\loadmarkfile{strc-ind}
+\loadmarkfile{strc-lab}
+\loadmarkfile{strc-syn}
+
+% \loadmarkfile{core-sys}
+
+\loadmarkfile{page-var}
+\loadmkvifile{page-otr}
+\loadmarkfile{page-ini}
+\loadmarkfile{page-ins}
+\loadmarkfile{page-fac}
+\loadmarkfile{page-brk}
+\loadmarkfile{page-col}
+\loadmarkfile{page-inf}
+\loadmarkfile{page-flt}
+\loadmarkfile{page-bck}
+\loadmarkfile{page-not}
+\loadmarkfile{page-one}
+\loadmarkfile{page-lay}
+\loadmkvifile{page-box}
+\loadmklxfile{page-txt} % LMTX
+\loadmarkfile{page-sid} % when
+
+\loadmkvifile{strc-flt}
+
+\loadmarkfile{page-pst}
+\loadmkvifile{page-mbk}
+%loadmarkfile{page-mul} % \usecolumns[old-multicolumns]
+\loadmarkfile{page-mix}
+\loadmarkfile{page-smp}
+%loadmarkfile{page-set} % \usecolumns[old-columnsets]
+\loadmarkfile{page-cst}
+\loadmarkfile{page-pcl} % new
+\loadmkxlfile{pack-lyr} % LMTX
+\loadmarkfile{pack-pos}
+\loadmkvifile{page-mak}
+
+\loadmarkfile{strc-reg} % uses mixed columns
+
+\loadmkvifile{page-lin}
+\loadmarkfile{page-par}
+\loadmarkfile{typo-pag}
+\loadmarkfile{typo-mar}
+\loadmarkfile{typo-itm}
+
+\loadmarkfile{buff-ini}
+\loadmkxlfile{buff-ver} % LMTX
+\loadmkvifile{buff-par}
+
+\loadmarkfile{buff-imp-tex} % optional as also runtime if not loaded
+\loadmarkfile{buff-imp-mp} % optional as also runtime if not loaded
+\loadmarkfile{buff-imp-lua} % optional as also runtime if not loaded
+\loadmarkfile{buff-imp-xml} % optional as also runtime if not loaded
+
+\loadmarkfile{buff-imp-parsed-xml} % optional
+%loadmarkfile{buff-imp-parsed-lua} % optional
+
+\loadmarkfile{strc-blk}
+
+\loadmarkfile{page-imp}
+\loadmkvifile{page-sel} % optional
+\loadmkvifile{page-inj} % optional
+
+\loadmkvifile{scrn-pag}
+\loadmkvifile{scrn-wid}
+\loadmkvifile{scrn-but}
+\loadmkvifile{scrn-bar}
+
+\loadmarkfile{page-com} % optional (after scrn-pag)
+
+\loadmarkfile{strc-bkm} % bookmarks
+
+\loadmarkfile{java-ini}
+
+\loadmkvifile{scrn-fld}
+\loadmkvifile{scrn-hlp}
+
+\loadmarkfile{char-enc} % will move up
+
+\loadmkvifile{font-lib} % way too late but after language
+\loadmklxfile{font-fil} % LMTX
+\loadmkvifile{font-var}
+\loadmkvifile{font-fea}
+\loadmklxfile{font-mat} % LMTX
+\loadmklxfile{font-ini} % LMTX
+\loadmklxfile{font-sym} % LMTX
+\loadmklxfile{font-sty} % LMTX
+\loadmkvifile{font-set}
+\loadmklxfile{font-emp} % LMTX
+\loadmarkfile{font-pre}
+\loadmarkfile{font-unk}
+\loadmarkfile{font-tra}
+\loadmarkfile{font-chk}
+\loadmarkfile{font-uni}
+\loadmkvifile{font-col}
+\loadmkvifile{font-gds}
+\loadmkvifile{font-aux}
+\loadmkvifile{font-sel}
+
+\loadmarkfile{typo-tal}
+\loadmarkfile{typo-par} % par builders (uses fonts)
+
+\loadmarkfile{tabl-com}
+\loadmarkfile{tabl-pln}
+
+\loadmarkfile{tabl-tab} % thrd-tab stripped and merged
+
+\loadmkxlfile{tabl-tbl} % LMTX
+\loadmkxlfile{tabl-ntb} % LMTX
+\loadmarkfile{tabl-nte}
+\loadmarkfile{tabl-ltb}
+\loadmarkfile{tabl-frm}
+\loadmarkfile{tabl-tsp}
+\loadmkvifile{tabl-xtb}
+\loadmarkfile{tabl-mis}
+
+\loadmarkfile{typo-lan}
+
+\loadmarkfile{lxml-css}
+
+\loadmarkfile{spac-chr} % depends on fonts
+
+\loadmarkfile{blob-ini} % not to be used, we only use a helper
+
+\loadmarkfile{trac-vis}
+\loadmarkfile{trac-jus}
+
+\loadmarkfile{typo-cln}
+\loadmarkfile{typo-wrp}
+\loadmarkfile{typo-spa}
+\loadmarkfile{typo-krn}
+\loadmkvifile{typo-itc}
+\loadmarkfile{typo-dir}
+\loadmarkfile{typo-brk}
+\loadmarkfile{typo-cap}
+\loadmarkfile{typo-dig}
+\loadmarkfile{typo-rep}
+\loadmkvifile{typo-txt}
+\loadmarkfile{typo-drp}
+\loadmarkfile{typo-fln}
+\loadmarkfile{typo-sus}
+\loadmarkfile{typo-lig}
+\loadmarkfile{typo-chr}
+\loadmarkfile{typo-rub}
+\loadmkivfile{typo-fkr}
+\loadmkivfile{typo-pnc}
+
+\loadmklxfile{type-ini} % LMTX
+\loadmarkfile{type-set}
+
+\loadmarkfile{scrp-ini}
+
+\loadmarkfile{symb-emj}
+
+\loadmarkfile{lang-wrd} % can be optional (discussion with mm sideeffect)
+\loadmarkfile{lang-rep} % can be optional (bt 2013 side effect)
+
+\loadmarkfile{prop-ini} % only for downward compatibility
+
+\loadmkxlfile{mlib-ctx} % LMTX % messy order
+
+\loadmkxlfile{meta-ini} % LMTX
+\loadmarkfile{meta-tex}
+\loadmarkfile{meta-fun}
+\loadmkxlfile{meta-pag}
+\loadmarkfile{meta-grd}
+\loadmarkfile{meta-fnt}
+\loadmarkfile{meta-nod}
+\loadmarkfile{meta-lua}
+\loadmkxlfile{meta-mac} % LMTX
+
+\loadmarkfile{page-mrk} % depends on mp
+
+\loadmarkfile{page-flw}
+\loadmarkfile{page-spr}
+\loadmarkfile{page-plg}
+\loadmarkfile{page-str}
+
+\loadmarkfile{anch-pgr} % can be moved up (nicer for dependencies)
+\loadmkvifile{anch-bck}
+\loadmarkfile{anch-tab} % overloads tabl-tbl
+\loadmarkfile{anch-bar}
+%loadmarkfile{anch-snc} % when needed this one will be redone
+
+\loadmarkfile{math-ini} % way after font-pre !
+\loadmarkfile{math-pln}
+\loadmarkfile{math-for}
+\loadmarkfile{math-def} % also saves some meanings
+\loadmarkfile{math-ali}
+%loadmarkfile{math-arr}
+\loadmkvifile{math-stc}
+\loadmarkfile{math-frc}
+\loadmarkfile{math-mis}
+\loadmarkfile{math-scr}
+\loadmarkfile{math-int}
+\loadmarkfile{math-del}
+\loadmarkfile{math-fen}
+\loadmkvifile{math-acc}
+\loadmkvifile{math-rad}
+\loadmarkfile{math-inl}
+\loadmarkfile{math-dis}
+%loadmarkfile{math-lan}
+
+%loadmarkfile{phys-dim} % moved to after typo-scr
+
+\loadmarkfile{strc-mat}
+
+\loadmarkfile{chem-ini}
+\loadmarkfile{chem-str}
+
+\loadmarkfile{typo-scr}
+\loadmarkfile{phys-dim}
+
+\loadmarkfile{node-rul} % beware, defined \underbar so after math
+\loadmkvifile{font-sol} % font solutions
+
+\loadmkvifile{strc-not}
+\loadmkvifile{strc-lnt}
+\loadmkivfile{strc-tnt}
+\loadmkivfile{strc-usr}
+
+\loadmarkfile{pack-com}
+\loadmarkfile{typo-del}
+
+\loadmarkfile{grph-trf}
+\loadmarkfile{grph-inc}
+\loadmarkfile{grph-fig}
+\loadmarkfile{grph-raw}
+\loadmarkfile{grph-rul}
+\loadmarkfile{grph-pat}
+
+\loadmarkfile{pack-box}
+\loadmarkfile{pack-bar}
+\loadmarkfile{page-app}
+\loadmarkfile{meta-fig}
+
+\loadmarkfile{page-ffl}
+
+\loadmarkfile{lang-spa} % will become obsolete
+
+\loadmarkfile{typo-ovl} % fuzzy project (tracing) code
+
+% old bibtex support: (will be m-oldbibtex.mkiv)
+
+% \loadmarkfile{bibl-bib}
+% \loadmarkfile{bibl-tra}
+
+% new bibtex support:
+
+\loadmarkfile{publ-ini}
+\loadmarkfile{publ-tra}
+\loadmarkfile{publ-xml}
+\loadmarkfile{publ-old}
+
+%loadmarkfile{x-xtag} % no longer preloaded
+
+\loadmarkfile{meta-xml}
+
+\loadmarkfile{cont-log}
+
+% \loadmarkfile{task-ini}
+
+\loadmarkfile{cldf-ver} % verbatim, this can come late
+\loadmarkfile{cldf-com} % commands, this can come late
+
+\loadmarkfile{core-ctx} % this order might change but we need to check depedencies / move to another namespace
+
+\loadmarkfile{core-def}
+
+%usemodule[x][res-04] % xml resource libraries
+%usemodule[x][res-08] % rlx runtime conversion
+%usemodule[x][res-12] % rli external indentification
+
+% now we hook in backend code (needs checking)
+
+\loadmkxlfile{driv-shp} % LMTX
+
+\loadmarkfile{back-exp}
+\loadmkxlfile{back-pdf} % LMTX
+\loadmkxlfile{back-mps} % LMTX
+\loadmkxlfile{back-lua} % LMTX
+
+\loadmkxlfile{mlib-pdf} % LMTX
+\loadmarkfile{mlib-pps}
+\loadmarkfile{meta-pdf}
+\loadmarkfile{meta-blb}
+\loadmarkfile{grph-epd}
+
+\loadmarkfile{math-inc} % an experiment
+\loadmarkfile{publ-inc} % an experiment
+
+\loadmarkfile{task-ini}
+
+\loadmarkfile{syst-cmp} % compatibility stuff moved here
+
+\loadmkxlfile{libs-ini}
+
+\loadmarkfile{cont-run} % the main runner (used in cont-yes.mkiv)
+
+\setupcurrentlanguage[\defaultlanguagetag]
+
+\prependtoks
+ \ctxlua{statistics.starttiming(statistics)}%
+\to \everyjob
+
+\appendtoks
+ \ctxlua{statistics.stoptiming(statistics)}%
+\to \everyjob
+
+% \appendtoks
+% \ctxlua{job.prepare()}%
+% \to \everyjob
+
+% \appendtoks
+% \enabletrackers[*]%
+% \to \everyjob
+
+\appendtoks
+ \ctxlua{statistics.savefmtstatus("\jobname","\contextversion","context.mkxl","\contextkind","\contextbanner")}% can become automatic
+\to \everydump
+
+\errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/core-con.lua b/Master/texmf-dist/tex/context/base/mkiv/core-con.lua
index 3829efc9c82..4f6090ef5b5 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/core-con.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/core-con.lua
@@ -311,11 +311,15 @@ local function textime()
return tonumber(osdate("%H")) * 60 + tonumber(osdate("%M"))
end
-function converters.year () return osdate("%Y") end
-function converters.month () return osdate("%m") end
-function converters.hour () return osdate("%H") end
-function converters.minute() return osdate("%M") end
-function converters.second() return osdate("%S") end
+-- For consistenty we need to add day here but that conflicts with the current
+-- serializer so then best is to have none from now on:
+
+-- function converters.year () return osdate("%Y") end
+-- function converters.month () return osdate("%m") end -- always two digits
+-- function converters.day () return osdate("%d") end -- conflicts
+-- function converters.hour () return osdate("%H") end
+-- function converters.minute() return osdate("%M") end
+-- function converters.second() return osdate("%S") end
converters.weekday = weekday
converters.isleapyear = isleapyear
@@ -329,6 +333,7 @@ implement { name = "nofdays", actions = { nofdays, context }, arguments = { "i
implement { name = "year", actions = { osdate, context }, arguments = "'%Y'" }
implement { name = "month", actions = { osdate, context }, arguments = "'%m'" }
+implement { name = "day", actions = { osdate, context }, arguments = "'%d'" }
implement { name = "hour", actions = { osdate, context }, arguments = "'%H'" }
implement { name = "minute", actions = { osdate, context }, arguments = "'%M'" }
implement { name = "second", actions = { osdate, context }, arguments = "'%S'" }
@@ -1675,3 +1680,8 @@ implement {
}
}
+local function field(n) return context(osdate("*t")[n]) end
+
+implement { name = "actualday", public = true, actions = function() field("day") end }
+implement { name = "actualmonth", public = true, actions = function() field("month") end }
+implement { name = "actualyear", public = true, actions = function() field("year") end }
diff --git a/Master/texmf-dist/tex/context/base/mkiv/core-con.mkiv b/Master/texmf-dist/tex/context/base/mkiv/core-con.mkiv
index 303fb12910f..b73280d00f1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/core-con.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/core-con.mkiv
@@ -186,9 +186,9 @@
%D \macros
%D {normaltime,normalyear,normalmonth,normalday}
%D
-%D The last part of this module is dedicated to converting dates. Because we
-%D want to use as meaningful commands as possible, and because \TEX\ already
-%D uses up some of those, we save the original meanings.
+%D The last part of this module is dedicated to converting dates. Because we want to
+%D use as meaningful commands as possible, and because \TEX\ already uses up some of
+%D those, we save the original meanings.
% \savenormalmeaning\time
% \savenormalmeaning\year
@@ -274,8 +274,8 @@
%D \getbuffer
%D \stoplines
%D
-%D The macro \type {\getdayoftheweek} can be used to calculate the number
-%D \type {\normalweekday}.
+%D The macro \type {\getdayoftheweek} can be used to calculate the number \type
+%D {\normalweekday}.
%D \macros
%D {doifleapyearelse,
@@ -363,8 +363,8 @@
%D
%D \typebuffer
%D
-%D The date is specified by one character keys. When no date is given, we
-%D get the current date.
+%D The date is specified by one character keys. When no date is given, we get the
+%D current date.
%D
%D \startlines
%D \getbuffer
@@ -425,26 +425,25 @@
\unexpanded\def\date
{\dodoubleempty\syst_converters_date}
-\def\syst_converters_date[#1][#2]%
+\def\syst_converters_date[#1][#2]% sets the date !
{\dontleavehmode
- \begingroup
- \scratchcounterone \normalyear
- \scratchcountertwo \normalmonth
- \scratchcounterthree\normalday
\iffirstargument
- \letdummyparameter\c!y\empty
- \letdummyparameter\c!m\empty
- \letdummyparameter\c!d\empty
+ \begingroup
+ \letdummyparameter\c!d\normalday
+ \letdummyparameter\c!m\normalmonth
+ \letdummyparameter\c!y\normalyear
\getdummyparameters[#1]%
- \edef\temp{\dummyparameter\c!y}\ifx\temp\empty\else\scratchcounterone \temp\fi
- \edef\temp{\dummyparameter\c!m}\ifx\temp\empty\else\scratchcountertwo \temp\fi
- \edef\temp{\dummyparameter\c!d}\ifx\temp\empty\else\scratchcounterthree\temp\fi
- \relax
+ \normalexpanded
+ {\endgroup
+ \normalday \number\directdummyparameter\c!d\relax
+ \normalmonth\number\directdummyparameter\c!m\relax
+ \normalyear \number\directdummyparameter\c!y\relax}%
\fi
+ \begingroup
\the\everycurrentdate
\clf_currentdate
{#2}{\currentdatespecification}{\labellanguage}%
- \scratchcounterone\scratchcountertwo\scratchcounterthree
+ \normalyear\normalmonth\normalday
\endgroup}
\def\rawdate[#1]% expandable and no labels
@@ -535,10 +534,10 @@
\installcorenamespace {conversionarguments}
\installcorenamespace {conversionwords}
-%D It might be better to move more to lua as we also need conversion there
-%D and doublicating logic doesn't make things cleaner. It means that all
-%D conversions will get a language argument too. However, we permit definitions
-%D at the \TEX\ end so we have to provide some hybrid method.
+%D It might be better to move more to \LUA\ as we also need conversion there and
+%D doublicating logic doesn't make things cleaner. It means that all conversions
+%D will get a language argument too. However, we permit definitions at the \TEX\ end
+%D so we have to provide some hybrid method.
% checkedconversion(method,n,language)
@@ -561,9 +560,9 @@
\def\syst_converters_checked_conversion#1#2%
{\clf_checkedconversion{#1}\numexpr#2\relax}
-%D If a conversion is just a font switch then we need to make sure that the
-%D number is indeed ends up as number in the input, so we need to handle the
-%D second argument.
+%D If a conversion is just a font switch then we need to make sure that the number
+%D is indeed ends up as number in the input, so we need to handle the second
+%D argument.
\def\convertnumber#1#2% expandable
{\csname\??conversionarguments
diff --git a/Master/texmf-dist/tex/context/base/mkiv/core-def.mkiv b/Master/texmf-dist/tex/context/base/mkiv/core-def.mkiv
index 95f7f2577d0..d10527d7bc7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/core-def.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/core-def.mkiv
@@ -107,6 +107,9 @@
\initializenewlinechar
\calculatecurrenttime
\syst_files_load
+ % for the moment here (before doc env)
+ \setupoutput[pdf]%
+ %
\clf_setdocumentcommandline
\clf_setdocumentctxfile
\clf_setdocumentfilenames
diff --git a/Master/texmf-dist/tex/context/base/mkiv/core-env.mkiv b/Master/texmf-dist/tex/context/base/mkiv/core-env.mkiv
index 758ee126d1a..09de435e7c0 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/core-env.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/core-env.mkiv
@@ -17,6 +17,8 @@
\unprotect
+\def\wildcardsymbol{*}
+
%D Modes:
%D
%D \starttyping
@@ -35,12 +37,11 @@
%D
%D system modes have a * as prefix
%D
-%D Sometimes, we want to prevent a mode for being set. Think
-%D of situations where a style enables a mode, but an outer
-%D level style does not want that. Preventing can be
-%D considered a permanent disabling on forehand.
+%D Sometimes, we want to prevent a mode for being set. Think of situations where a
+%D style enables a mode, but an outer level style does not want that. Preventing can
+%D be considered a permanent disabling on forehand.
-\def\systemmodeprefix{*}
+\let\systemmodeprefix\wildcardsymbol
% we will have \installcorenamespace{mode} but need some hackery at the lua end then
@@ -129,26 +130,18 @@
\unexpanded\def\globalenablemode {\let\syst_mode_prefix\global\unprotect\syst_modes_enable }
\unexpanded\def\globaldisablemode{\let\syst_mode_prefix\global\unprotect\syst_modes_disable}
-\def\syst_modes_prevent[#1]{\protect\rawprocesscommacommand[#1]\syst_modes_prevent_indeed\let\syst_mode_prefix\relax}
-\def\syst_modes_enable [#1]{\protect\rawprocesscommacommand[#1]\syst_modes_enable_indeed \let\syst_mode_prefix\relax}
-\def\syst_modes_disable[#1]{\protect\rawprocesscommacommand[#1]\syst_modes_disable_indeed\let\syst_mode_prefix\relax}
+% \def\syst_modes_prevent[#1]{\protect\rawprocesscommacommand[#1]\syst_modes_prevent_indeed\let\syst_mode_prefix\relax}
+% \def\syst_modes_enable [#1]{\protect\rawprocesscommacommand[#1]\syst_modes_enable_indeed \let\syst_mode_prefix\relax}
+% \def\syst_modes_disable[#1]{\protect\rawprocesscommacommand[#1]\syst_modes_disable_indeed\let\syst_mode_prefix\relax}
+
+\def\syst_modes_prevent[#1]{\protect\fastprocesscommacommand[#1]\syst_modes_prevent_indeed\let\syst_mode_prefix\relax}
+\def\syst_modes_enable [#1]{\protect\fastprocesscommacommand[#1]\syst_modes_enable_indeed \let\syst_mode_prefix\relax}
+\def\syst_modes_disable[#1]{\protect\fastprocesscommacommand[#1]\syst_modes_disable_indeed\let\syst_mode_prefix\relax}
\def\syst_modes_prevent_indeed#1%
{\ifcsname\??mode#1\endcsname\else\syst_modes_new{#1}\fi
\syst_mode_prefix\lastnamedcs\preventedmode}
-% \def\syst_modes_enable_indeed#1% we can speed it up by moving the new outside
-% {\ifcsname\??mode#1\endcsname\else\syst_modes_new{#1}\fi
-% \ifnum\csname\??mode#1\endcsname=\preventedmode \else
-% \syst_mode_prefix\lastnamedcs\enabledmode
-% \fi}
-%
-% \def\syst_modes_disable_indeed#1%
-% {\ifcsname\??mode#1\endcsname\else\syst_modes_new{#1}\fi
-% \ifnum\csname\??mode#1\endcsname=\preventedmode \else
-% \syst_mode_prefix\lastnamedcs\disabledmode
-% \fi}
-
\def\syst_modes_enable_indeed#1% we can speed it up by moving the new outside
{\ifcsname\??mode#1\endcsname\else\syst_modes_new{#1}\fi
\ifnum\lastnamedcs=\preventedmode\else
@@ -174,19 +167,8 @@
\def\syst_modes_define[#1][#2]%
{\protect
\edef\m_modes_asked{#2}%
- \rawprocesscommacommand[#1]\syst_modes_define_indeed}
-
-% \def\syst_modes_define_indeed#1%
-% {\ifcsname\??mode#1\endcsname
-% % already set
-% \else
-% \syst_modes_new{#1}
-% \fi
-% \ifx\m_modes_asked\v!keep
-% % not changes, disabled when undefined
-% \else
-% \csname\??mode#1\endcsname\ifx\m_modes_asked\v!yes\enabledmode\else\disabledmode\fi
-% \fi}
+ % \rawprocesscommacommand[#1]\syst_modes_define_indeed}
+ \fastprocesscommacommand[#1]\syst_modes_define_indeed}
\def\syst_modes_define_indeed#1%
{\ifcsname\??mode#1\endcsname
@@ -230,7 +212,8 @@
\def\syst_modes_check_nop#1#2#3%
{\let\syst_modes_check_step\syst_modes_check_indeed
- \rawprocesscommacommand[#3]\syst_modes_check_step
+ % \rawprocesscommacommand[#3]\syst_modes_check_step
+ \fastprocesscommacommand[#3]\syst_modes_check_step
\ifx\syst_modes_check_step\gobbleoneargument
\expandafter#1%
\else
@@ -277,7 +260,7 @@
\def\syst_modes_check_all_lr#1#2#3%
{\let\syst_modes_check_all_step\syst_modes_check_all_indeed
- \rawprocesscommacommand[#3]\syst_modes_check_all_step
+ \fastprocesscommacommand[#3]\syst_modes_check_all_step
\ifx\syst_modes_check_all_step\gobbleoneargument
\expandafter#2%
\else
@@ -286,7 +269,7 @@
\def\syst_modes_check_all_ss#1#2[#3]%
{\let\syst_modes_check_all_step\syst_modes_check_all_indeed
- \rawprocesscommacommand[#3]\syst_modes_check_all_step
+ \fastprocesscommacommand[#3]\syst_modes_check_all_step
\ifx\syst_modes_check_all_step\gobbleoneargument
\expandafter#2%
\else
@@ -319,28 +302,6 @@
%D Pushing/popping:
-% \unexpanded\def\pushmode[#1]%
-% {\ifcsname\??mode#1\endcsname\else\syst_modes_new{#1}\fi
-% \expandafter\edef\csname\??modestack#1\endcsname{\number\csname\??mode#1\endcsname}%
-% \expandafter\pushmacro\csname\??modestack#1\endcsname}
-%
-% \unexpanded\def\popmode[#1]%
-% {\ifcsname\??modestack#1\endcsname
-% \expandafter\popmacro\csname\??modestack#1\endcsname
-% \csname\??mode#1\endcsname\csname\??modestack#1\endcsname\relax
-% \fi}
-%
-% \def\pushsystemmode#1%
-% {\ifcsname\??mode\systemmodeprefix#1\endcsname\else\syst_modes_new{\systemmodeprefix#1}\fi
-% \expandafter\edef\csname\??modestack\systemmodeprefix#1\endcsname{\number\csname\??mode\systemmodeprefix#1\endcsname}%
-% \expandafter\pushmacro\csname\??modestack\systemmodeprefix#1\endcsname}
-%
-% \def\popsystemmode#1%
-% {\ifcsname\??modestack\systemmodeprefix#1\endcsname
-% \expandafter\popmacro\csname\??modestack\systemmodeprefix#1\endcsname
-% \csname\??mode\systemmodeprefix#1\endcsname\csname\??modestack\systemmodeprefix#1\endcsname\relax
-% \fi}
-
\unexpanded\def\pushmode[#1]%
{\ifcsname\??mode#1\endcsname\else\syst_modes_new{#1}\fi
\expandafter\edef\csname\??modestack#1\expandafter\endcsname\expandafter{\number\lastnamedcs}%
@@ -450,14 +411,6 @@
\unexpanded\def\startsetups{} % to please dep checker
\unexpanded\def\stopsetups {} % to please dep checker
-% \expanded % will become obsolete
-% {\def\expandafter\noexpand\csname\e!start\v!setups\endcsname
-% {\begingroup\noexpand\doifnextoptionalcselse
-% {\noexpand\dostartsetupsA\expandafter\noexpand\csname\e!stop\v!setups\endcsname}
-% {\noexpand\dostartsetupsB\expandafter\noexpand\csname\e!stop\v!setups\endcsname}}}
-%
-% \letvalue{\e!stop\v!setups}\relax
-
\unexpanded\def\setups{\doifelsenextbgroup\syst_setups_a\syst_setups_b} % {..} or [..]
\unexpanded\def\setup {\doifelsenextbgroup\syst_setups \syst_setups_c} % {..} or [..]
@@ -499,9 +452,6 @@
\expandafter\syst_setups_process_local
\fi}
-% \def\syst_setups_process_local
-% {\expandafter\processcommalist\expandafter[\m_syst_setups_asked]\syst_setups}
-
% setups=S1
% setups=lua(S2)
% setups=S3
@@ -666,9 +616,9 @@
\def\luasetup#1{\ctxlua{\syst_setups{#1}}}
-% % % %
+%D System setups:
-\def\systemsetupsprefix{*}
+\let\systemsetupsprefix\wildcardsymbol
\def\systemsetups#1{\syst_setups{\systemsetupsprefix#1}}
@@ -679,19 +629,9 @@
\dodoglobal\undefinevalue{\??setup:#1}%
\fi}
-% \unexpanded\def\resetsetups[#1]% see x-fo for usage
-% {\dodoglobal\expandafter\let\csname\??setup
-% \ifgridsnapping\ifcsname\??setup\v!grid:#1\endcsname\v!grid\fi
-% :#1\endcsname\undefined}
-
\unexpanded\def\copysetups
{\dodoubleargument\syst_setups_copy}
-% \def\syst_setups_copy[#1][#2]%
-% {\ifcsname\??setup:#2\endcsname
-% \expandafter\let\csname\??setup:#1\expandafter\endcsname\csname\??setup:#2\endcsname
-% \fi}
-
\def\syst_setups_copy[#1][#2]%
{\ifcsname\??setup:#2\endcsname
\expandafter\let\csname\??setup:#1\expandafter\endcsname\lastnamedcs
@@ -723,27 +663,20 @@
{\dotripleargument\syst_variables_set[\globalgetrawparameters]}
\def\syst_variables_set[#1][#2][#3]% tricky, test on s-pre-60
- {\errorisfataltrue
- \doifelse{#2}\currentvariableclass
+ {\doifelse{#2}\currentvariableclass
{#1[\??variables#2:][#3]}%
{\pushmacro\currentvariableclass
\def\currentvariableclass{#2}%
\getvariable{#2}\s!reset
#1[\??variables#2:][#3]%
\getvariable{#2}\s!set
- \popmacro\currentvariableclass}%
- \errorisfatalfalse}
+ \popmacro\currentvariableclass}}
\unexpanded\def\setvariable #1#2#3{\expandafter\def \csname\??variables#1:#2\endcsname{#3}}
\unexpanded\def\setevariable#1#2#3{\expandafter\edef\csname\??variables#1:#2\endcsname{#3}}
\unexpanded\def\setgvariable#1#2#3{\expandafter\gdef\csname\??variables#1:#2\endcsname{#3}}
\unexpanded\def\setxvariable#1#2#3{\expandafter\xdef\csname\??variables#1:#2\endcsname{#3}}
-% \def\getvariable#1#2%
-% {\csname
-% \ifcsname\??variables#1:#2\endcsname\??variables#1:#2\else\s!empty\fi
-% \endcsname}
-
\def\getvariable#1#2%
{\begincsname\??variables#1:#2\endcsname}
@@ -767,7 +700,6 @@
\def\syst_variables_check_value#1#2#3%
{\ifcsname\??variables#1:#2\endcsname
- %\edef\m_syst_variables_temp{\csname\??variables#1:#2\endcsname}%
\edef\m_syst_variables_temp{\lastnamedcs}%
\ifx\m_syst_variables_temp\empty
\expandafter\def\csname\??variables#1:#2\endcsname{#3}%
@@ -804,13 +736,12 @@
\expandafter\firstofoneargument
\fi}
-%D A few more (we could use a public test variable so that we only need
-%D to expand once, assuming expandable variables):
+%D A few more (we could use a public test variable so that we only need to expand
+%D once, assuming expandable variables):
\letvalue{\??variables:}\empty
\unexpanded\def\doifelseemptyvariable#1#2%
- %{\edef\m_syst_string_one{\csname\??variables\ifcsname\??variables#1:#2\endcsname#1:#2\else:\fi\endcsname}%
{\edef\m_syst_string_one{\begincsname\??variables#1:#2\endcsname}%
\ifx\m_syst_string_one\empty
\expandafter\firstoftwoarguments
@@ -821,7 +752,6 @@
\let\doifemptyvariableelse\doifelseemptyvariable
\unexpanded\def\doifemptyvariable#1#2%
- %{\edef\m_syst_string_one{\csname\??variables\ifcsname\??variables#1:#2\endcsname#1:#2\else:\fi\endcsname}%
{\edef\m_syst_string_one{\begincsname\??variables#1:#2\endcsname}%
\ifx\m_syst_string_one\empty
\expandafter\firstofoneargument
@@ -830,7 +760,6 @@
\fi}
\unexpanded\def\doifnotemptyvariable#1#2%
- %{\edef\m_syst_string_one{\csname\??variables\ifcsname\??variables#1:#2\endcsname#1:#2\else:\fi\endcsname}%
{\edef\m_syst_string_one{\begincsname\??variables#1:#2\endcsname}%
\ifx\m_syst_string_one\empty
\expandafter\gobbleoneargument
@@ -839,7 +768,6 @@
\fi}
\def\getvariabledefault#1#2% #3% can be command
- %{\executeifdefined{\??variables#1:#2}}% {#3}
{\ifcsname\??variables#1:#2\endcsname
\expandafter\expandafter\expandafter\lastnamedcs\expandafter\gobbleoneargument
\else
diff --git a/Master/texmf-dist/tex/context/base/mkiv/core-lmt.mkiv b/Master/texmf-dist/tex/context/base/mkiv/core-lmt.mkxl
index eda66796918..75a791a50d9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/core-lmt.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/core-lmt.mkxl
@@ -1,6 +1,6 @@
%D \module
%D [ file=core-lmt,
-%D version=2010.08.2,
+%D version=2018.08.2,
%D title=\CONTEXT\ System Macros,
%D subtitle=Primitives,
%D author=Hans Hagen,
@@ -11,13 +11,12 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\ifcase\contextlmtxmode\expandafter\endinput\fi
-
\writestatus{loading}{ConTeXt System Macros / Primitives}
-\ifdefined\textdir \else
- \registerctxluafile{core-lmt}{}
-\fi
+%D This is offered temporarily because in the end we don't expect u sers to use the
+%D low level direction directives directly.
+
+\registerctxluafile{core-lmt}{}
\unprotect
diff --git a/Master/texmf-dist/tex/context/base/mkiv/core-sys.lua b/Master/texmf-dist/tex/context/base/mkiv/core-sys.lua
index 4078ab8a8a9..7e9648fb845 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/core-sys.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/core-sys.lua
@@ -53,6 +53,10 @@ function environment.initializefilenames()
environment.filename = filename
environment.suffix = suffix
+ -- if tex then
+ -- tex.jobname = jobfilename
+ -- end
+
report_files("jobname %a, input %a, result %a",jobfilename,inputfilename,outputfilename)
function environment.initializefilenames() end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/core-sys.mkiv b/Master/texmf-dist/tex/context/base/mkiv/core-sys.mkiv
index 4d99d8647b0..7a04df8408f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/core-sys.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/core-sys.mkiv
@@ -78,18 +78,6 @@
\fi
\to \everysetupsystem
-\let\m_system_job_suffix\s!unknown
-
-\appendtoks
- \resetsystemmode{suffix-\m_system_job_suffix}%
- \edef\m_system_job_suffix{\jobsuffix}%
- \setsystemmode{suffix-\m_system_job_suffix}%
-\to \everysetupsystem
-
-% \appendtoks
-% \ctxcommand{updatefilenames("\jobame","\inputfilename","\outputfilename")}%
-% \to \everysetupsystem
-
\newconditional\prerollrun % when true it means that we have a forced number of runs
% Some mechanisms (see x-res-01) use either \jobfilename or
diff --git a/Master/texmf-dist/tex/context/base/mkiv/core-uti.lua b/Master/texmf-dist/tex/context/base/mkiv/core-uti.lua
index cd867db1bce..50c7bc9dc6a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/core-uti.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/core-uti.lua
@@ -269,6 +269,16 @@ end
local function load(filename)
if lfs.isfile(filename) then
+
+ local function dofile(filename)
+ local result = loadstring(io.loaddata(filename))
+ if result then
+ return result()
+ else
+ return nil
+ end
+ end
+
local okay, data = pcall(dofile,filename)
if okay and type(data) == "table" then
local jobversion = job.version
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-aux.lua b/Master/texmf-dist/tex/context/base/mkiv/data-aux.lua
index c57f16d2c57..028794e51aa 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-aux.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-aux.lua
@@ -8,29 +8,33 @@ if not modules then modules = { } end modules ['data-aux'] = {
local find = string.find
local type, next = type, next
+local addsuffix, removesuffix = file.addsuffix, file.removesuffix
+local loaddata, savedata = io.loaddata, io.savedata
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
local resolvers = resolvers
+local cleanpath = resolvers.cleanpath
+local findfiles = resolvers.findfiles
local report_scripts = logs.reporter("resolvers","scripts")
function resolvers.updatescript(oldname,newname) -- oldname -> own.name, not per se a suffix
-- local scriptpath = "scripts/context/lua"
local scriptpath = "context/lua"
- newname = file.addsuffix(newname,"lua")
- local oldscript = resolvers.cleanpath(oldname)
+ local oldscript = cleanpath(oldname)
+ local newname = addsuffix(newname,"lua")
+ local newscripts = findfiles(newname) or { }
if trace_locating then
report_scripts("to be replaced old script %a", oldscript)
end
- local newscripts = resolvers.findfiles(newname) or { }
if #newscripts == 0 then
if trace_locating then
report_scripts("unable to locate new script")
end
else
for i=1,#newscripts do
- local newscript = resolvers.cleanpath(newscripts[i])
+ local newscript = cleanpath(newscripts[i])
if trace_locating then
report_scripts("checking new script %a", newscript)
end
@@ -42,17 +46,17 @@ function resolvers.updatescript(oldname,newname) -- oldname -> own.name, not per
if trace_locating then
report_scripts("new script should come from %a",scriptpath)
end
- elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
+ elseif not (find(oldscript,removesuffix(newname).."$") or find(oldscript,newname.."$")) then
if trace_locating then
report_scripts("invalid new script name")
end
else
- local newdata = io.loaddata(newscript)
+ local newdata = loaddata(newscript)
if newdata then
if trace_locating then
report_scripts("old script content replaced by new content: %s",oldscript)
end
- io.savedata(oldscript,newdata)
+ savedata(oldscript,newdata)
break
elseif trace_locating then
report_scripts("unable to load new script")
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-bin.lua b/Master/texmf-dist/tex/context/base/mkiv/data-bin.lua
index 1d1e8b74959..2bac901ea47 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-bin.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-bin.lua
@@ -6,22 +6,25 @@ if not modules then modules = { } end modules ['data-bin'] = {
license = "see context related readme files"
}
-local resolvers = resolvers
+local resolvers = resolvers
local methodhandler = resolvers.methodhandler
+local notfound = resolvers.loaders.notfound
function resolvers.findbinfile(filename,filetype)
return methodhandler('finders',filename,filetype)
end
-function resolvers.openbinfile(filename)
+local function openbinfile(filename)
return methodhandler('loaders',filename) -- a bit weird: load
end
+resolvers.openbinfile = openbinfile
+
function resolvers.loadbinfile(filename,filetype)
local fname = methodhandler('finders',filename,filetype)
if fname and fname ~= "" then
- return resolvers.openbinfile(fname) -- a bit weird: open
+ return openbinfile(fname) -- a bit weird: open
else
- return resolvers.loaders.notfound()
+ return notfound()
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-con.lua b/Master/texmf-dist/tex/context/base/mkiv/data-con.lua
index c79fca7c5c1..ec2251b3534 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-con.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-con.lua
@@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['data-con'] = {
license = "see context related readme files"
}
+local setmetatable = setmetatable
local format, lower, gsub = string.format, string.lower, string.gsub
local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
@@ -13,21 +14,28 @@ local trace_containers = false trackers.register("resolvers.containers", functi
local trace_storage = false trackers.register("resolvers.storage", function(v) trace_storage = v end)
--[[ldx--
-<p>Once we found ourselves defining similar cache constructs
-several times, containers were introduced. Containers are used
-to collect tables in memory and reuse them when possible based
-on (unique) hashes (to be provided by the calling function).</p>
+<p>Once we found ourselves defining similar cache constructs several times,
+containers were introduced. Containers are used to collect tables in memory and
+reuse them when possible based on (unique) hashes (to be provided by the calling
+function).</p>
-<p>Caching to disk is disabled by default. Version numbers are
-stored in the saved table which makes it possible to change the
-table structures without bothering about the disk cache.</p>
+<p>Caching to disk is disabled by default. Version numbers are stored in the
+saved table which makes it possible to change the table structures without
+bothering about the disk cache.</p>
-<p>Examples of usage can be found in the font related code.</p>
+<p>Examples of usage can be found in the font related code. This code is not
+ideal but we need it in generic too so we compromise.</p>
--ldx]]--
-containers = containers or { }
-local containers = containers
-containers.usecache = true
+containers = containers or { }
+local containers = containers
+containers.usecache = true
+
+local getwritablepath = caches.getwritablepath
+local getreadablepaths = caches.getreadablepaths
+local cacheiswritable = caches.is_writable
+local loaddatafromcache = caches.loaddata
+local savedataincache = caches.savedata
local report_containers = logs.reporter("resolvers","containers")
@@ -36,11 +44,11 @@ local allocated = { }
local mt = {
__index = function(t,k)
if k == "writable" then
- local writable = caches.getwritablepath(t.category,t.subcategory) or { "." }
+ local writable = getwritablepath(t.category,t.subcategory) or { "." }
t.writable = writable
return writable
elseif k == "readables" then
- local readables = caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ local readables = getreadablepaths(t.category,t.subcategory) or { "." }
t.readables = readables
return readables
end
@@ -64,8 +72,8 @@ function containers.define(category, subcategory, version, enabled)
enabled = enabled,
version = version or math.pi, -- after all, this is TeX
trace = false,
- -- writable = caches.getwritablepath and caches.getwritablepath (category,subcategory) or { "." },
- -- readables = caches.getreadablepaths and caches.getreadablepaths(category,subcategory) or { "." },
+ -- writable = getwritablepath and getwritablepath (category,subcategory) or { "." },
+ -- readables = getreadablepaths and getreadablepaths(category,subcategory) or { "." },
}
setmetatable(s,mt)
c[subcategory] = s
@@ -75,7 +83,7 @@ function containers.define(category, subcategory, version, enabled)
end
function containers.is_usable(container,name)
- return container.enabled and caches and caches.is_writable(container.writable, name)
+ return container.enabled and caches and cacheiswritable(container.writable, name)
end
function containers.is_valid(container,name)
@@ -91,7 +99,7 @@ function containers.read(container,name)
local storage = container.storage
local stored = storage[name]
if not stored and container.enabled and caches and containers.usecache then
- stored = caches.loaddata(container.readables,name,container.writable)
+ stored = loaddatafromcache(container.readables,name,container.writable)
if stored and stored.cache_version == container.version then
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","load",container.subcategory,name)
@@ -108,17 +116,20 @@ function containers.read(container,name)
return stored
end
-function containers.write(container, name, data)
+function containers.write(container, name, data, fast)
if data then
data.cache_version = container.version
if container.enabled and caches then
- local unique, shared = data.unique, data.shared
- data.unique, data.shared = nil, nil
- caches.savedata(container.writable, name, data)
+ local unique = data.unique
+ local shared = data.shared
+ data.unique = nil
+ data.shared = nil
+ savedataincache(container.writable, name, data, fast)
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","save",container.subcategory,name)
end
- data.unique, data.shared = unique, shared
+ data.unique = unique
+ data.shared = shared
end
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","store",container.subcategory,name)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-crl.lua b/Master/texmf-dist/tex/context/base/mkiv/data-crl.lua
index dec9972f186..bdc5cf5308e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-crl.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-crl.lua
@@ -26,7 +26,7 @@ local runner = sandbox.registerrunner {
name = "curl resolver",
method = "execute",
program = "curl",
- template = "--silent --insecure --create-dirs --output %cachename% %original%",
+ template = '--silent --insecure --create-dirs --output "%cachename%" "%original%"',
checkers = {
cachename = "cache",
original = "url",
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-env.lua b/Master/texmf-dist/tex/context/base/mkiv/data-env.lua
index 1b31caab65c..53f0c27cc27 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-env.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-env.lua
@@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['data-env'] = {
}
local lower, gsub = string.lower, string.gsub
-local next = next
+local next, rawget = next, rawget
local resolvers = resolvers
@@ -94,13 +94,13 @@ local relations = allocate { -- todo: handlers also here
mp = {
names = { "mp" },
variable = 'MPINPUTS',
- suffixes = { 'mp', 'mpvi', 'mpiv', 'mpii' },
+ suffixes = { 'mp', 'mpvi', 'mpiv', 'mpxl', 'mpii' },
usertype = true,
},
tex = {
names = { "tex" },
variable = 'TEXINPUTS',
- suffixes = { "tex", "mkvi", "mkiv", "mkii", "cld", "lfg", "xml" }, -- known suffixes have less lookups
+ suffixes = { "tex", "mkiv", "mkvi", "mkxl", "mklx", "mkii", "cld", "lfg", "xml" }, -- known suffixes have less lookups
usertype = true,
},
icc = {
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-exp.lua b/Master/texmf-dist/tex/context/base/mkiv/data-exp.lua
index ce7f952228b..98c2f6839f9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-exp.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-exp.lua
@@ -198,7 +198,7 @@ local function expandedhome()
return usedhomedir
end
-local dohome = ((P("~")+P("$HOME")+P("%HOME%"))/expandedhome)^0
+local dohome = ((P("~") + P("$HOME") + P("%HOME%")) / expandedhome)^0
local cleanup = Cs(donegation * dohome * doslashes)
resolvers.cleanpath = function(str)
@@ -423,7 +423,7 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
return files, remap, n, m, r
end
-function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
+local function scanfiles(path,branch,usecache,onlyonce,tolerant)
local realpath = resolveprefix(path)
if usecache then
local content = fullcache[realpath]
@@ -480,8 +480,10 @@ function resolvers.scanfiles(path,branch,usecache,onlyonce,tolerant)
return content
end
+resolvers.scanfiles = scanfiles
+
function resolvers.simplescanfiles(path,branch,usecache)
- return resolvers.scanfiles(path,branch,usecache,true,true) -- onlyonce
+ return scanfiles(path,branch,usecache,true,true) -- onlyonce
end
function resolvers.scandata()
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-fil.lua b/Master/texmf-dist/tex/context/base/mkiv/data-fil.lua
index b699fc9e38f..bbcc954b2ea 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-fil.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-fil.lua
@@ -6,48 +6,57 @@ if not modules then modules = { } end modules ['data-fil'] = {
license = "see context related readme files"
}
+local ioopen = io.open
+local isdir = lfs.isdir
+
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
local report_files = logs.reporter("resolvers","files")
-local resolvers = resolvers
-local resolveprefix = resolvers.resolve
+local resolvers = resolvers
+local resolveprefix = resolvers.resolve
+local findfile = resolvers.findfile
+local scanfiles = resolvers.scanfiles
+local registerfilehash = resolvers.registerfilehash
+local appendhash = resolvers.appendhash
-local finders, openers, loaders, savers = resolvers.finders, resolvers.openers, resolvers.loaders, resolvers.savers
-local locators, hashers, generators, concatinators = resolvers.locators, resolvers.hashers, resolvers.generators, resolvers.concatinators
+local loadcachecontent = caches.loadcontent
-local checkgarbage = utilities.garbagecollector and utilities.garbagecollector.check
+local checkgarbage = utilities.garbagecollector and utilities.garbagecollector.check
-function locators.file(specification)
+function resolvers.locators.file(specification)
local filename = specification.filename
local realname = resolveprefix(filename) -- no shortcut
- if realname and realname ~= '' and lfs.isdir(realname) then
+ if realname and realname ~= '' and isdir(realname) then
if trace_locating then
report_files("file locator %a found as %a",filename,realname)
end
- resolvers.appendhash('file',filename,true) -- cache
+ appendhash('file',filename,true) -- cache
elseif trace_locating then
report_files("file locator %a not found",filename)
end
end
-function hashers.file(specification)
+function resolvers.hashers.file(specification)
local pathname = specification.filename
- local content = caches.loadcontent(pathname,'files')
- resolvers.registerfilehash(pathname,content,content==nil)
+ local content = loadcachecontent(pathname,'files')
+ registerfilehash(pathname,content,content==nil)
end
-function generators.file(specification)
+function resolvers.generators.file(specification)
local pathname = specification.filename
- local content = resolvers.scanfiles(pathname,false,true) -- scan once
- resolvers.registerfilehash(pathname,content,true)
+ local content = scanfiles(pathname,false,true) -- scan once
+ registerfilehash(pathname,content,true)
end
-concatinators.file = file.join
+resolvers.concatinators.file = file.join
+
+local finders = resolvers.finders
+local notfound = finders.notfound
function finders.file(specification,filetype)
local filename = specification.filename
- local foundname = resolvers.findfile(filename,filetype)
+ local foundname = findfile(filename,filetype)
if foundname and foundname ~= "" then
if trace_locating then
report_files("file finder: %a found",filename)
@@ -57,42 +66,64 @@ function finders.file(specification,filetype)
if trace_locating then
report_files("file finder: %a not found",filename)
end
- return finders.notfound()
+ return notfound()
end
end
-- The default textopener will be overloaded later on.
-function openers.helpers.textopener(tag,filename,f)
+local openers = resolvers.openers
+local notfound = openers.notfound
+local overloaded = false
+
+local function textopener(tag,filename,f)
return {
- reader = function() return f:read () end,
- close = function() logs.show_close(filename) return f:close() end,
+ reader = function() return f:read () end,
+ close = function() return f:close() end,
}
end
+function openers.helpers.textopener(...)
+ return textopener(...)
+end
+
+function openers.helpers.settextopener(opener)
+ if overloaded then
+ report_files("file opener: %s overloaded","already")
+ else
+ if trace_locating then
+ report_files("file opener: %s overloaded","once")
+ end
+ overloaded = true
+ textopener = opener
+ end
+end
+
function openers.file(specification,filetype)
local filename = specification.filename
if filename and filename ~= "" then
- local f = io.open(filename,"r")
+ local f = ioopen(filename,"r")
if f then
if trace_locating then
report_files("file opener: %a opened",filename)
end
- return openers.helpers.textopener("file",filename,f)
+ return textopener("file",filename,f)
end
end
if trace_locating then
report_files("file opener: %a not found",filename)
end
- return openers.notfound()
+ return notfound()
end
+local loaders = resolvers.loaders
+local notfound = loaders.notfound
+
function loaders.file(specification,filetype)
local filename = specification.filename
if filename and filename ~= "" then
- local f = io.open(filename,"rb")
+ local f = ioopen(filename,"rb")
if f then
- logs.show_load(filename)
if trace_locating then
report_files("file loader: %a loaded",filename)
end
@@ -109,5 +140,5 @@ function loaders.file(specification,filetype)
if trace_locating then
report_files("file loader: %a not found",filename)
end
- return loaders.notfound()
+ return notfound()
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/data-ini.lua
index 09357368ca9..0fe70b5f11a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-ini.lua
@@ -10,11 +10,11 @@ local next, type, getmetatable, rawset = next, type, getmetatable, rawset
local gsub, find, gmatch, char = string.gsub, string.find, string.gmatch, string.char
local filedirname, filebasename, filejoin = file.dirname, file.basename, file.join
local ostype, osname, osuname, ossetenv, osgetenv = os.type, os.name, os.uname, os.setenv, os.getenv
+local sortedpairs = table.sortedpairs
local P, S, R, C, Cs, Cc, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.match
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
-local trace_detail = false trackers.register("resolvers.details", function(v) trace_detail = v end)
local trace_expansions = false trackers.register("resolvers.expansions", function(v) trace_expansions = v end)
local report_initialization = logs.reporter("resolvers","initialization")
@@ -333,7 +333,7 @@ if ostype == "unix" then
rawset(t,k,v)
end
local colon = P(":")
- for k, v in table.sortedpairs(prefixes) do
+ for k, v in sortedpairs(prefixes) do
if p then
p = P(k) + p
else
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-lst.lua b/Master/texmf-dist/tex/context/base/mkiv/data-lst.lua
index f061393e5a3..f349409e41a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-lst.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-lst.lua
@@ -9,19 +9,26 @@ if not modules then modules = { } end modules ['data-lst'] = {
-- used in mtxrun, can be loaded later .. todo
local type = type
-local concat, sortedhash = table.concat,table.sortedhash
+local sortedhash = table.sortedhash
+local isdir = lfs.isdir
-local resolvers = resolvers
-local listers = resolvers.listers or { }
-resolvers.listers = listers
+local resolvers = resolvers
+local listers = resolvers.listers or { }
+resolvers.listers = listers
-local resolveprefix = resolvers.resolve
+local resolveprefix = resolvers.resolve
+local configurationfiles = resolvers.configurationfiles
+local expandedpathfromlist = resolvers.expandedpathfromlist
+local splitpath = resolvers.splitpath
+local knownvariables = resolvers.knownvariables
-local report_lists = logs.reporter("resolvers","lists")
-local report_resolved = logs.reporter("system","resolved")
+local report_lists = logs.reporter("resolvers","lists")
+local report_resolved = logs.reporter("system","resolved")
local function tabstr(str)
- if type(str) == 'table' then
+ if not str then
+ return "unset"
+ elseif type(str) == 'table' then
return concat(str," | ")
else
return str
@@ -32,23 +39,23 @@ function listers.variables(pattern)
local result = resolvers.knownvariables(pattern)
for key, value in sortedhash(result) do
report_lists(key)
- report_lists(" env: %s",tabstr(value.environment or "unset"))
- report_lists(" var: %s",tabstr(value.variable or "unset"))
- report_lists(" exp: %s",tabstr(value.expansion or "unset"))
- report_lists(" res: %s",tabstr(value.resolved or "unset"))
+ report_lists(" env: %s",tabstr(value.environment))
+ report_lists(" var: %s",tabstr(value.variable))
+ report_lists(" exp: %s",tabstr(value.expansion))
+ report_lists(" res: %s",tabstr(value.resolved))
end
end
function listers.configurations()
- local configurations = resolvers.configurationfiles()
+ local configurations = configurationfiles()
for i=1,#configurations do
report_resolved("file : %s",resolveprefix(configurations[i]))
end
report_resolved("")
- local list = resolvers.expandedpathfromlist(resolvers.splitpath(resolvers.luacnfspec))
+ local list = expandedpathfromlist(splitpath(resolvers.luacnfspec))
for i=1,#list do
local li = resolveprefix(list[i])
- if lfs.isdir(li) then
+ if isdir(li) then
report_resolved("path - %s",li)
else
report_resolved("path + %s",li)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-lua.lua b/Master/texmf-dist/tex/context/base/mkiv/data-lua.lua
index 3022ae55037..03d899e846b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-lua.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-lua.lua
@@ -10,8 +10,7 @@ if not modules then modules = { } end modules ['data-lua'] = {
local package, lpeg = package, lpeg
-local gsub = string.gsub
-local concat = table.concat
+local loadfile = loadfile
local addsuffix = file.addsuffix
local P, S, Cs, lpegmatch = lpeg.P, lpeg.S, lpeg.Cs, lpeg.match
@@ -25,6 +24,8 @@ local methods = helpers.methods or { }
local resolvers = resolvers
local resolveprefix = resolvers.resolve
+local expandedpaths = resolvers.expandedpathlistfromvariable
+local findfile = resolvers.findfile
helpers.report = logs.reporter("resolvers","libraries")
@@ -50,9 +51,9 @@ function helpers.cleanpath(path) -- hm, don't we have a helper for this?
return resolveprefix(lpegmatch(pattern,path))
end
-local loadedaslib = helpers.loadedaslib
-local registerpath = helpers.registerpath
-local lualibfile = helpers.lualibfile
+local loadedaslib = helpers.loadedaslib
+local registerpath = helpers.registerpath
+local lualibfile = helpers.lualibfile
local luaformatpaths
local libformatpaths
@@ -61,7 +62,7 @@ local function getluaformatpaths()
if not luaformatpaths then
luaformatpaths = { }
for i=1,#luaformats do
- registerpath("lua format","lua",luaformatpaths,resolvers.expandedpathlistfromvariable(luaformats[i]))
+ registerpath("lua format","lua",luaformatpaths,expandedpaths(luaformats[i]))
end
end
return luaformatpaths
@@ -71,7 +72,7 @@ local function getlibformatpaths()
if not libformatpaths then
libformatpaths = { }
for i=1,#libformats do
- registerpath("lib format","lib",libformatpaths,resolvers.expandedpathlistfromvariable(libformats[i]))
+ registerpath("lib format","lib",libformatpaths,expandedpaths(libformats[i]))
end
end
return libformatpaths
@@ -81,8 +82,8 @@ local function loadedbyformat(name,rawname,suffixes,islib,what)
local trace = helpers.trace
local report = helpers.report
for i=1,#suffixes do -- so we use findfile and not a lookup loop
- local format = suffixes[i]
- local resolved = resolvers.findfile(name,format) or ""
+ local format = suffixes[i]
+ local resolved = findfile(name,format) or ""
if trace then
report("%s format, identifying %a using format %a",what,name,format)
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-met.lua b/Master/texmf-dist/tex/context/base/mkiv/data-met.lua
index bb892957733..8004ad2cdac 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-met.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-met.lua
@@ -6,9 +6,12 @@ if not modules then modules = { } end modules ['data-met'] = {
license = "see context related readme files"
}
-local find, format = string.find, string.format
-local sequenced = table.sequenced
+local type = type
+local find = string.find
local addurlscheme, urlhashed = url.addscheme, url.hashed
+local collapsepath, joinfile = file.collapsepath, file.join
+
+local report_methods = logs.reporter("resolvers","methods")
local trace_locating = false
local trace_methods = false
@@ -16,31 +19,38 @@ local trace_methods = false
trackers.register("resolvers.locating", function(v) trace_methods = v end)
trackers.register("resolvers.methods", function(v) trace_methods = v end)
---~ trace_methods = true
-
-local report_methods = logs.reporter("resolvers","methods")
-
-local allocate = utilities.storage.allocate
-
-local resolvers = resolvers
+local allocate = utilities.storage.allocate
+local resolvers = resolvers
local registered = { }
local function splitmethod(filename) -- todo: filetype in specification
if not filename then
- return { scheme = "unknown", original = filename }
+ return {
+ scheme = "unknown",
+ original = filename,
+ }
end
if type(filename) == "table" then
return filename -- already split
end
- filename = file.collapsepath(filename,".") -- hm, we should keep ./ in some cases
-
+ filename = collapsepath(filename,".") -- hm, we should keep ./ in some cases
if not find(filename,"://",1,true) then
- return { scheme = "file", path = filename, original = filename, filename = filename }
+ return {
+ scheme = "file",
+ path = filename,
+ original = filename,
+ filename = filename,
+ }
end
- local specification = url.hashed(filename)
+ local specification = urlhashed(filename)
if not specification.scheme or specification.scheme == "" then
- return { scheme = "file", path = filename, original = filename, filename = filename }
+ return {
+ scheme = "file",
+ path = filename,
+ original = filename,
+ filename = filename,
+ }
else
return specification
end
@@ -53,7 +63,7 @@ end
-- if type(filename) == "table" then
-- return filename -- already split
-- end
--- return url.hashed(filename)
+-- return urlhashed(filename)
-- end
resolvers.splitmethod = splitmethod -- bad name but ok
@@ -64,11 +74,12 @@ resolvers.splitmethod = splitmethod -- bad name but ok
local function methodhandler(what,first,...) -- filename can be nil or false
local method = registered[what]
if method then
- local how, namespace = method.how, method.namespace
+ local how = method.how
+ local namespace = method.namespace
if how == "uri" or how == "url" then
local specification = splitmethod(first)
- local scheme = specification.scheme
- local resolver = namespace and namespace[scheme]
+ local scheme = specification.scheme
+ local resolver = namespace and namespace[scheme]
if resolver then
if trace_methods then
report_methods("resolving, method %a, how %a, handler %a, argument %a",what,how,scheme,first)
@@ -112,7 +123,10 @@ end
resolvers.methodhandler = methodhandler
function resolvers.registermethod(name,namespace,how)
- registered[name] = { how = how or "tag", namespace = namespace }
+ registered[name] = {
+ how = how or "tag",
+ namespace = namespace
+ }
namespace["byscheme"] = function(scheme,filename,...)
if scheme == "file" then
return methodhandler(name,filename,...)
@@ -122,7 +136,7 @@ function resolvers.registermethod(name,namespace,how)
end
end
-local concatinators = allocate { notfound = file.join } -- concatinate paths
+local concatinators = allocate { notfound = joinfile } -- concatinate paths
local locators = allocate { notfound = function() end } -- locate databases
local hashers = allocate { notfound = function() end } -- load databases
local generators = allocate { notfound = function() end } -- generate databases
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-out.lua b/Master/texmf-dist/tex/context/base/mkiv/data-out.lua
index 11304c2ced3..6cd02a22e2e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-out.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-out.lua
@@ -6,13 +6,12 @@ if not modules then modules = { } end modules ['data-out'] = {
license = "see context related readme files"
}
-local allocate = utilities.storage.allocate
-local resolvers = resolvers
+local allocate = utilities.storage.allocate
+local resolvers = resolvers
local registermethod = resolvers.registermethod
-local savers = allocate { helpers = { } }
-
-resolvers.savers = savers
+local savers = allocate { helpers = { } }
+resolvers.savers = savers
registermethod("savers", savers, "uri")
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-pre.lua b/Master/texmf-dist/tex/context/base/mkiv/data-pre.lua
index 5e3020b7065..f7df8b91870 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-pre.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-pre.lua
@@ -25,6 +25,8 @@ if not modules then modules = { } end modules ['data-pre'] = {
-- version : operating system version
-- release : operating system release
+local insert, remove = table.insert, table.remove
+
local resolvers = resolvers
local prefixes = resolvers.prefixes
@@ -121,8 +123,10 @@ prefixes.path = prefixes.pathname
-- This one assumes that inputstack is set (used in the tex loader). It is a momentary resolve
-- as the top of the input stack changes.
+local inputstack = { }
+local stackpath = resolvers.stackpath
+
local function toppath()
- local inputstack = resolvers.inputstack -- dependency, actually the code should move but it's
if not inputstack then -- more convenient to keep it here
return "."
end
@@ -139,7 +143,7 @@ end
-- stucture.
local function jobpath()
- local path = resolvers.stackpath()
+ local path = stackpath()
if not path or path == "" then
return "."
else
@@ -147,8 +151,18 @@ local function jobpath()
end
end
-resolvers.toppath = toppath
-resolvers.jobpath = jobpath
+local function pushinputname(name)
+ insert(inputstack,name)
+end
+
+local function popinputname(name)
+ return remove(inputstack)
+end
+
+resolvers.toppath = toppath
+resolvers.jobpath = jobpath
+resolvers.pushinputname = pushinputname
+resolvers.popinputname = popinputname
-- This hook sit into the resolver:
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-res.lua b/Master/texmf-dist/tex/context/base/mkiv/data-res.lua
index 0c2735fc274..8afc09b9792 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-res.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-res.lua
@@ -10,7 +10,9 @@ if not modules then modules = { } end modules ['data-res'] = {
local gsub, find, lower, upper, match, gmatch = string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch
local concat, insert, remove = table.concat, table.insert, table.remove
-local next, type, rawget = next, type, rawget
+local next, type, rawget, loadfile = next, type, rawget, loadfile
+local mergedtable = table.merged
+
local os = os
local P, S, R, C, Cc, Cs, Ct, Carg = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Carg
@@ -30,6 +32,8 @@ local is_qualified_path = file.is_qualified_path
local allocate = utilities.storage.allocate
local settings_to_array = utilities.parsers.settings_to_array
+local urlhasscheme = url.hasscheme
+
local getcurrentdir = lfs.currentdir
local isfile = lfs.isfile
local isdir = lfs.isdir
@@ -38,7 +42,7 @@ local setmetatableindex = table.setmetatableindex
local luasuffixes = utilities.lua.suffixes
local trace_locating = false trackers .register("resolvers.locating", function(v) trace_locating = v end)
-local trace_detail = false trackers .register("resolvers.details", function(v) trace_detail = v end)
+local trace_details = false trackers .register("resolvers.details", function(v) trace_details = v end)
local trace_expansions = false trackers .register("resolvers.expansions", function(v) trace_expansions = v end)
local trace_paths = false trackers .register("resolvers.paths", function(v) trace_paths = v end)
local resolve_otherwise = true directives.register("resolvers.otherwise", function(v) resolve_otherwise = v end)
@@ -63,11 +67,19 @@ local ostype, osname, osenv, ossetenv, osgetenv = os.type, os.name, os.env, os.s
resolvers.cacheversion = "1.100"
resolvers.configbanner = ""
resolvers.homedir = environment.homedir
-resolvers.criticalvars = allocate { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF", "TEXMF", "TEXOS" }
resolvers.luacnfname = "texmfcnf.lua"
resolvers.luacnffallback = "contextcnf.lua"
resolvers.luacnfstate = "unknown"
+local criticalvars = {
+ "SELFAUTOLOC",
+ "SELFAUTODIR",
+ "SELFAUTOPARENT",
+ "TEXMFCNF",
+ "TEXMF",
+ "TEXOS",
+}
+
-- The web2c tex binaries as well as kpse have built in paths for the configuration
-- files and there can be a depressing truckload of them. This is actually the weak
-- spot of a distribution. So we don't want:
@@ -145,14 +157,27 @@ local suffixmap = resolvers.suffixmap
resolvers.defaultsuffixes = { "tex" } -- "mkiv", "cld" -- too tricky
-local instance = nil -- the current one (fast access)
+local instance = nil -- the current one (fast access)
+
+-- forward declarations
+
+local variable
+local expansion
+local setenv
+local getenv
+
+-- done
+
+local formatofsuffix = resolvers.formatofsuffix
+local splitpath = resolvers.splitpath
+local splitmethod = resolvers.splitmethod
-- An instance has an environment (coming from the outside, kept raw), variables
-- (coming from the configuration file), and expansions (variables with nested
-- variables replaced). One can push something into the outer environment and
-- its internal copy, but only the later one will be the raw unprefixed variant.
-function resolvers.setenv(key,value,raw)
+setenv = function(key,value,raw)
if instance then
-- this one will be consulted first when we stay inside
-- the current environment (prefixes are not resolved here)
@@ -167,7 +192,7 @@ end
-- Beware we don't want empty here as this one can be called early on
-- and therefore we use rawget.
-local function getenv(key)
+getenv = function(key)
local value = rawget(instance.environment,key)
if value and value ~= "" then
return value
@@ -178,115 +203,121 @@ local function getenv(key)
end
resolvers.getenv = getenv
-resolvers.env = getenv
+resolvers.setenv = setenv
-- We are going to use some metatable trickery where we backtrack from
-- expansion to variable to environment.
-local function resolvevariable(k)
- return instance.expansions[k]
-end
-
local dollarstripper = lpeg.stripper("$")
local inhibitstripper = P("!")^0 * Cs(P(1)^0)
-local somevariable = P("$") / ""
-local somekey = C(R("az","AZ","09","__","--")^1)
-local somethingelse = P(";") * ((1-S("!{}/\\"))^1 * P(";") / "")
- + P(";") * (P(";") / "")
- + P(1)
-local variableexpander = Cs( (somevariable * (somekey/resolvevariable) + somethingelse)^1 )
+local expandedvariable, resolvedvariable do
-local cleaner = P("\\") / "/" + P(";") * S("!{}/\\")^0 * P(";")^1 / ";"
-local variablecleaner = Cs((cleaner + P(1))^0)
+ local function resolveinstancevariable(k)
+ return instance.expansions[k]
+ end
-local somevariable = R("az","AZ","09","__","--")^1 / resolvevariable
-local variable = (P("$")/"") * (somevariable + (P("{")/"") * somevariable * (P("}")/""))
-local variableresolver = Cs((variable + P(1))^0)
+ local p_variable = P("$") / ""
+ local p_key = C(R("az","AZ","09","__","--")^1)
+ local p_whatever = P(";") * ((1-S("!{}/\\"))^1 * P(";") / "")
+ + P(";") * (P(";") / "")
+ + P(1)
+ local variableexpander = Cs( (p_variable * (p_key/resolveinstancevariable) + p_whatever)^1 )
-local function expandedvariable(var)
- return lpegmatch(variableexpander,var) or var
-end
+ local p_cleaner = P("\\") / "/" + P(";") * S("!{}/\\")^0 * P(";")^1 / ";"
+ local variablecleaner = Cs((p_cleaner + P(1))^0)
-function resolvers.reset()
+ local p_variable = R("az","AZ","09","__","--")^1 / resolveinstancevariable
+ local p_variable = (P("$")/"") * (p_variable + (P("{")/"") * p_variable * (P("}")/""))
+ local variableresolver = Cs((p_variable + P(1))^0)
- -- normally we only need one instance but for special cases we can (re)load one so
- -- we stick to this model.
+ expandedvariable = function(var)
+ return lpegmatch(variableexpander,var) or var
+ end
- if trace_locating then
- report_resolving("creating instance")
- end
-
- local environment = { }
- local variables = { }
- local expansions = { }
- local order = { }
-
- instance = {
- environment = environment,
- variables = variables,
- expansions = expansions,
- order = order,
- files = { },
- setups = { },
- found = { },
- foundintrees = { },
- hashes = { },
- hashed = { },
- pathlists = false,-- delayed
- specification = { },
- lists = { },
- data = { }, -- only for loading
- fakepaths = { },
- remember = true,
- diskcache = true,
- renewcache = false,
- renewtree = false,
- loaderror = false,
- savelists = true,
- pattern = nil, -- lists
- force_suffixes = true,
- pathstack = { },
- }
-
- setmetatableindex(variables,function(t,k)
- local v
- for i=1,#order do
- v = order[i][k]
- if v ~= nil then
- t[k] = v
- return v
+ function resolvers.reset()
+
+ -- normally we only need one instance but for special cases we can (re)load one so
+ -- we stick to this model.
+
+ if trace_locating then
+ report_resolving("creating instance")
+ end
+
+ local environment = { }
+ local variables = { }
+ local expansions = { }
+ local order = { }
+
+ instance = {
+ environment = environment,
+ variables = variables,
+ expansions = expansions,
+ order = order,
+ files = { },
+ setups = { },
+ found = { },
+ foundintrees = { },
+ hashes = { },
+ hashed = { },
+ pathlists = false,-- delayed
+ specification = { },
+ lists = { },
+ data = { }, -- only for loading
+ fakepaths = { },
+ remember = true,
+ diskcache = true,
+ renewcache = false,
+ renewtree = false,
+ loaderror = false,
+ savelists = true,
+ pattern = nil, -- lists
+ force_suffixes = true,
+ pathstack = { },
+ }
+
+ setmetatableindex(variables,function(t,k)
+ local v
+ for i=1,#order do
+ v = order[i][k]
+ if v ~= nil then
+ t[k] = v
+ return v
+ end
end
- end
- if v == nil then
- v = ""
- end
- t[k] = v
- return v
- end)
+ if v == nil then
+ v = ""
+ end
+ t[k] = v
+ return v
+ end)
- setmetatableindex(environment, function(t,k)
- local v = osgetenv(k)
- if v == nil then
- v = variables[k]
- end
- if v ~= nil then
- v = checkedvariable(v) or ""
- end
- v = resolvers.repath(v) -- for taco who has a : separated osfontdir
- t[k] = v
- return v
- end)
+ local repath = resolvers.repath
- setmetatableindex(expansions, function(t,k)
- local v = environment[k]
- if type(v) == "string" then
- v = lpegmatch(variableresolver,v)
- v = lpegmatch(variablecleaner,v)
- end
- t[k] = v
- return v
- end)
+ setmetatableindex(environment, function(t,k)
+ local v = osgetenv(k)
+ if v == nil then
+ v = variables[k]
+ end
+ if v ~= nil then
+ v = checkedvariable(v) or ""
+ end
+ v = repath(v) -- for taco who has a : separated osfontdir
+ t[k] = v
+ return v
+ end)
+
+ setmetatableindex(expansions, function(t,k)
+ local v = environment[k]
+ if type(v) == "string" then
+ v = lpegmatch(variableresolver,v)
+ v = lpegmatch(variablecleaner,v)
+ end
+ t[k] = v
+ return v
+ end)
+
+ end
end
@@ -305,40 +336,44 @@ local function reset_caches()
instance.pathlists = false
end
-local slash = P("/")
+local makepathexpression do
-local pathexpressionpattern = Cs ( -- create lpeg instead (2013/2014)
- Cc("^") * (
- Cc("%") * S(".-")
- + slash^2 * P(-1) / "/.*"
- -- + slash^2 / "/.-/"
- -- + slash^2 / "/[^/]*/*" -- too general
- + slash^2 / "/"
- + (1-slash) * P(-1) * Cc("/")
- + P(1)
- )^1 * Cc("$") -- yes or no $
-)
+ local slash = P("/")
-local cache = { }
+ local pathexpressionpattern = Cs ( -- create lpeg instead (2013/2014)
+ Cc("^") * (
+ Cc("%") * S(".-")
+ + slash^2 * P(-1) / "/.*"
+ -- + slash^2 / "/.-/"
+ -- + slash^2 / "/[^/]*/*" -- too general
+ + slash^2 / "/"
+ + (1-slash) * P(-1) * Cc("/")
+ + P(1)
+ )^1 * Cc("$") -- yes or no $
+ )
-local function makepathexpression(str)
- if str == "." then
- return "^%./$"
- else
- local c = cache[str]
- if not c then
- c = lpegmatch(pathexpressionpattern,str)
- cache[str] = c
+ local cache = { }
+
+ makepathexpression = function(str)
+ if str == "." then
+ return "^%./$"
+ else
+ local c = cache[str]
+ if not c then
+ c = lpegmatch(pathexpressionpattern,str)
+ cache[str] = c
+ end
+ return c
end
- return c
end
+
end
local function reportcriticalvariables(cnfspec)
if trace_locating then
- for i=1,#resolvers.criticalvars do
- local k = resolvers.criticalvars[i]
- local v = resolvers.getenv(k) or "unknown" -- this one will not resolve !
+ for i=1,#criticalvars do
+ local k = criticalvars[i]
+ local v = getenv(k) or "unknown" -- this one will not resolve !
report_resolving("variable %a set to %a",k,v)
end
report_resolving()
@@ -361,7 +396,7 @@ local function identify_configuration_files()
resolvers.luacnfstate = "environment"
end
reportcriticalvariables(cnfspec)
- local cnfpaths = expandedpathfromlist(resolvers.splitpath(cnfspec))
+ local cnfpaths = expandedpathfromlist(splitpath(cnfspec))
local function locatecnf(luacnfname,kind)
for i=1,#cnfpaths do
@@ -398,6 +433,8 @@ end
local function load_configuration_files()
local specification = instance.specification
+ local setups = instance.setups
+ local order = instance.order
if #specification > 0 then
local luacnfname = resolvers.luacnfname
for i=1,#specification do
@@ -407,7 +444,6 @@ local function load_configuration_files()
local realname = resolveprefix(filename) -- no shortcut
local blob = loadfile(realname)
if blob then
- local setups = instance.setups
local data = blob()
local parent = data and data.parent
if parent then
@@ -418,7 +454,7 @@ local function load_configuration_files()
local parentdata = blob()
if parentdata then
report_resolving("loading configuration file %a",filename)
- data = table.merged(parentdata,data)
+ data = mergedtable(parentdata,data)
end
end
end
@@ -454,7 +490,7 @@ local function load_configuration_files()
-- we push the value into the main environment (osenv) so
-- that it takes precedence over the default one and therefore
-- also over following definitions
- resolvers.setenv("TEXMFCNF",cnfspec) -- resolves prefixes
+ setenv("TEXMFCNF",cnfspec) -- resolves prefixes
-- we now identify and load the specified configuration files
instance.specification = { }
identify_configuration_files()
@@ -476,7 +512,7 @@ local function load_configuration_files()
elseif trace_locating then
report_resolving("skipping configuration file %a (no valid format)",filename)
end
- instance.order[#instance.order+1] = instance.setups[pathname]
+ order[#order+1] = setups[pathname]
if instance.loaderror then
break
end
@@ -486,6 +522,13 @@ local function load_configuration_files()
end
end
+-- forward declarations:
+
+local expandedpathlist
+local unexpandedpathlist
+
+-- done
+
function resolvers.configurationfiles()
return instance.specification or { }
end
@@ -507,7 +550,7 @@ end
local function locate_file_databases()
-- todo: cache:// and tree:// (runtime)
- local texmfpaths = resolvers.expandedpathlist("TEXMF")
+ local texmfpaths = expandedpathlist("TEXMF")
if #texmfpaths > 0 then
for i=1,#texmfpaths do
local path = collapsepath(texmfpaths[i])
@@ -516,7 +559,7 @@ local function locate_file_databases()
if stripped ~= "" then
local runtime = stripped == path
path = cleanpath(path)
- local spec = resolvers.splitmethod(stripped)
+ local spec = splitmethod(stripped)
if runtime and (spec.noscheme or spec.scheme == "file") then
stripped = "tree:///" .. stripped
elseif spec.scheme == "cache" or spec.scheme == "file" then
@@ -552,11 +595,13 @@ local function generate_file_databases()
end
local function save_file_databases() -- will become cachers
- for i=1,#instance.hashes do
- local hash = instance.hashes[i]
+ local hashes = instance.hashes
+ local files = instance.files
+ for i=1,#hashes do
+ local hash = hashes[i]
local cachename = hash.name
if hash.cache then
- local content = instance.files[cachename]
+ local content = files[cachename]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",cachename)
@@ -569,8 +614,9 @@ local function save_file_databases() -- will become cachers
end
function resolvers.renew(hashname)
+ local files = instance.files
if hashname and hashname ~= "" then
- local expanded = resolvers.expansion(hashname) or ""
+ local expanded = expansion(hashname) or ""
if expanded ~= "" then
if trace_locating then
report_resolving("identifying tree %a from %a",expanded,hashname)
@@ -588,7 +634,7 @@ function resolvers.renew(hashname)
end
methodhandler('generators',hashname)
-- could be shared
- local content = instance.files[hashname]
+ local content = files[hashname]
caches.collapsecontent(content)
if trace_locating then
report_resolving("saving tree %a",hashname)
@@ -618,35 +664,43 @@ local function load_databases()
end
function resolvers.appendhash(type,name,cache)
- -- safeguard ... tricky as it's actually a bug when seen twice
- if not instance.hashed[name] then
+ local hashed = instance.hashed
+ local hashes = instance.hashes
+ if hashed[name] then
+ -- safeguard ... tricky as it's actually a bug when seen twice
+ else
if trace_locating then
report_resolving("hash %a appended",name)
end
- insert(instance.hashes, { type = type, name = name, cache = cache } )
- instance.hashed[name] = cache
+ insert(hashes, { type = type, name = name, cache = cache } )
+ hashed[name] = cache
end
end
function resolvers.prependhash(type,name,cache)
- -- safeguard ... tricky as it's actually a bug when seen twice
- if not instance.hashed[name] then
+ local hashed = instance.hashed
+ local hashes = instance.hashes
+ if hashed[name] then
+ -- safeguard ... tricky as it's actually a bug when seen twice
+ else
if trace_locating then
report_resolving("hash %a prepended",name)
end
- insert(instance.hashes, 1, { type = type, name = name, cache = cache } )
- instance.hashed[name] = cache
+ insert(hashes, 1, { type = type, name = name, cache = cache } )
+ hashed[name] = cache
end
end
function resolvers.extendtexmfvariable(specification) -- crap, we could better prepend the hash
- local t = resolvers.splitpath(getenv("TEXMF")) -- okay?
- insert(t,1,specification)
- local newspec = concat(t,",") -- not ;
- if instance.environment["TEXMF"] then
- instance.environment["TEXMF"] = newspec
- elseif instance.variables["TEXMF"] then
- instance.variables["TEXMF"] = newspec
+ local environment = instance.environment
+ local variables = instance.variables
+ local texmftrees = splitpath(getenv("TEXMF")) -- okay?
+ insert(texmftrees,1,specification)
+ texmftrees = concat(texmftrees,",") -- not ;
+ if environment["TEXMF"] then
+ environment["TEXMF"] = texmftrees
+ elseif variables["TEXMF"] then
+ variables["TEXMF"] = texmftrees
else
-- weird
end
@@ -654,8 +708,8 @@ function resolvers.extendtexmfvariable(specification) -- crap, we could better p
end
function resolvers.splitexpansions()
- local ie = instance.expansions
- for k,v in next, ie do
+ local expansions = instance.expansions
+ for k, v in next, expansions do
local t, tn, h, p = { }, 0, { }, splitconfigurationpath(v)
for kk=1,#p do
local vv = p[kk]
@@ -665,10 +719,10 @@ function resolvers.splitexpansions()
h[vv] = true
end
end
- if #t > 1 then
- ie[k] = t
+ if tn > 1 then
+ expansions[k] = t
else
- ie[k] = t[1]
+ expansions[k] = t[1]
end
end
end
@@ -682,26 +736,31 @@ function resolvers.datastate()
return caches.contentstate()
end
-function resolvers.variable(name)
+variable = function(name)
+ local variables = instance.variables
local name = name and lpegmatch(dollarstripper,name)
- local result = name and instance.variables[name]
+ local result = name and variables[name]
return result ~= nil and result or ""
end
-function resolvers.expansion(name)
+expansion = function(name)
+ local expansions = instance.expansions
local name = name and lpegmatch(dollarstripper,name)
- local result = name and instance.expansions[name]
+ local result = name and expansions[name]
return result ~= nil and result or ""
end
-function resolvers.unexpandedpathlist(str)
- local pth = resolvers.variable(str)
- local lst = resolvers.splitpath(pth)
+resolvers.variable = variable
+resolvers.expansion = expansion
+
+unexpandedpathlist = function(str)
+ local pth = variable(str)
+ local lst = splitpath(pth)
return expandedpathfromlist(lst)
end
function resolvers.unexpandedpath(str)
- return joinpath(resolvers.unexpandedpathlist(str))
+ return joinpath(unexpandedpathlist(str))
end
function resolvers.pushpath(name)
@@ -736,8 +795,8 @@ end
local done = { }
function resolvers.resetextrapaths()
- local ep = instance.extra_paths
- if not ep then
+ local extra_paths = instance.extra_paths
+ if not extra_paths then
done = { }
instance.extra_paths = { }
elseif #ep > 0 then
@@ -760,8 +819,8 @@ function resolvers.registerextrapath(paths,subpaths)
end
local paths = settings_to_array(paths)
local subpaths = settings_to_array(subpaths)
- local ep = instance.extra_paths or { }
- local oldn = #ep
+ local extra_paths = instance.extra_paths or { }
+ local oldn = #extra_paths
local newn = oldn
local nofpaths = #paths
local nofsubpaths = #subpaths
@@ -774,7 +833,7 @@ function resolvers.registerextrapath(paths,subpaths)
local ps = p .. "/" .. s
if not done[ps] then
newn = newn + 1
- ep[newn] = cleanpath(ps)
+ extra_paths[newn] = cleanpath(ps)
done[ps] = true
end
end
@@ -784,7 +843,7 @@ function resolvers.registerextrapath(paths,subpaths)
local p = paths[i]
if not done[p] then
newn = newn + 1
- ep[newn] = cleanpath(p)
+ extra_paths[newn] = cleanpath(p)
done[p] = true
end
end
@@ -793,17 +852,17 @@ function resolvers.registerextrapath(paths,subpaths)
for i=1,oldn do
for j=1,nofsubpaths do
local s = subpaths[j]
- local ps = ep[i] .. "/" .. s
+ local ps = extra_paths[i] .. "/" .. s
if not done[ps] then
newn = newn + 1
- ep[newn] = cleanpath(ps)
+ extra_paths[newn] = cleanpath(ps)
done[ps] = true
end
end
end
end
if newn > 0 then
- instance.extra_paths = ep -- register paths
+ instance.extra_paths = extra_paths -- register paths
end
if newn ~= oldn then
reset_caches()
@@ -812,8 +871,9 @@ end
function resolvers.pushextrapath(path)
local paths = settings_to_array(path)
- if instance.extra_stack then
- insert(instance.extra_stack,1,paths)
+ local extra_stack = instance.extra_stack
+ if extra_stack then
+ insert(extra_stack,1,paths)
else
instance.extra_stack = { paths }
end
@@ -821,9 +881,10 @@ function resolvers.pushextrapath(path)
end
function resolvers.popextrapath()
- if instance.extra_stack then
+ local extra_stack = instance.extra_stack
+ if extra_stack then
reset_caches()
- return remove(instance.extra_stack,1)
+ return remove(extra_stack,1)
end
end
@@ -856,17 +917,17 @@ local function made_list(instance,list,extra_too)
end
end
if extra_too then
+ local extra_stack = instance.extra_stack
+ local extra_paths = instance.extra_paths
-- first the stacked paths
- local es = instance.extra_stack
- if es and #es > 0 then
- for k=1,#es do
- add(es[k])
+ if extra_stack and #extra_stack > 0 then
+ for k=1,#extra_stack do
+ add(extra_stack[k])
end
end
-- then the extra paths
- local ep = instance.extra_paths
- if ep and #ep > 0 then
- add(ep)
+ if extra_paths and #extra_paths > 0 then
+ add(extra_paths)
end
end
-- last the formal paths
@@ -874,21 +935,7 @@ local function made_list(instance,list,extra_too)
return new
end
-function resolvers.cleanpathlist(str)
- local t = resolvers.expandedpathlist(str)
- if t then
- for i=1,#t do
- t[i] = collapsepath(cleanpath(t[i]))
- end
- end
- return t
-end
-
-function resolvers.expandpath(str)
- return joinpath(resolvers.expandedpathlist(str))
-end
-
-function resolvers.expandedpathlist(str,extra_too)
+expandedpathlist = function(str,extra_too)
if not str then
return { }
elseif instance.savelists then -- hm, what if two cases, with and without extra_too
@@ -896,45 +943,65 @@ function resolvers.expandedpathlist(str,extra_too)
local lists = instance.lists
local lst = lists[str]
if not lst then
- local l = made_list(instance,resolvers.splitpath(resolvers.expansion(str)),extra_too)
+ local l = made_list(instance,splitpath(expansion(str)),extra_too)
lst = expandedpathfromlist(l)
lists[str] = lst
end
return lst
else
- local lst = resolvers.splitpath(resolvers.expansion(str))
+ local lst = splitpath(expansion(str))
return made_list(instance,expandedpathfromlist(lst),extra_too)
end
end
-function resolvers.expandedpathlistfromvariable(str) -- brrr / could also have cleaner ^!! /$ //
+resolvers.expandedpathlist = expandedpathlist
+resolvers.unexpandedpathlist = unexpandedpathlist
+
+function resolvers.cleanpathlist(str)
+ local t = expandedpathlist(str)
+ if t then
+ for i=1,#t do
+ t[i] = collapsepath(cleanpath(t[i]))
+ end
+ end
+ return t
+end
+
+function resolvers.expandpath(str)
+ return joinpath(expandedpathlist(str))
+end
+
+local function expandedpathlistfromvariable(str) -- brrr / could also have cleaner ^!! /$ //
str = lpegmatch(dollarstripper,str)
local tmp = resolvers.variableofformatorsuffix(str)
- return resolvers.expandedpathlist(tmp ~= "" and tmp or str)
+ return expandedpathlist(tmp ~= "" and tmp or str)
end
function resolvers.expandpathfromvariable(str)
- return joinpath(resolvers.expandedpathlistfromvariable(str))
+ return joinpath(expandedpathlistfromvariable(str))
end
+resolvers.expandedpathlistfromvariable = expandedpathlistfromvariable
+
function resolvers.cleanedpathlist(v) -- can be cached if needed
- local t = resolvers.expandedpathlist(v)
+ local t = expandedpathlist(v)
for i=1,#t do
- t[i] = resolvers.resolve(resolvers.cleanpath(t[i]))
+ t[i] = resolveprefix(cleanpath(t[i]))
end
return t
end
function resolvers.expandbraces(str) -- output variable and brace expansion of STRING
- local pth = expandedpathfromlist(resolvers.splitpath(str))
+ local pth = expandedpathfromlist(splitpath(str))
return joinpath(pth)
end
function resolvers.registerfilehash(name,content,someerror)
+ local files = instance.files
if content then
- instance.files[name] = content
+ files[name] = content
else
- instance.files[name] = { }
+ files[name] = { }
if somerror == true then -- can be unset
instance.loaderror = someerror
end
@@ -956,8 +1023,8 @@ function resolvers.renewcache()
end
local function isreadable(name)
- local readable = isfile(name) -- not file.is_readable(name) asit can be a dir
- if trace_detail then
+ local readable = isfile(name) -- not file.is_readable(name) as it can be a dir
+ if trace_details then
if readable then
report_resolving("file %a is readable",name)
else
@@ -977,7 +1044,7 @@ local function collect_files(names) -- potential files .. sort of too much when
local variant = hash.type
local search = filejoin(root,path,name) -- funny no concatinator
local result = methodhandler('concatinators',variant,root,path,name)
- if trace_detail then
+ if trace_details then
report_resolving("match: variant %a, search %a, result %a",variant,search,result)
end
noffiles = noffiles + 1
@@ -986,7 +1053,7 @@ local function collect_files(names) -- potential files .. sort of too much when
end
for k=1,#names do
local filename = names[k]
- if trace_detail then
+ if trace_details then
report_resolving("checking name %a",filename)
end
local basename = filebasename(filename)
@@ -998,12 +1065,13 @@ local function collect_files(names) -- potential files .. sort of too much when
pathname = "/" .. pathname .. "$"
end
local hashes = instance.hashes
+ local files = instance.files
for h=1,#hashes do
local hash = hashes[h]
local hashname = hash.name
- local content = hashname and instance.files[hashname]
+ local content = hashname and files[hashname]
if content then
- if trace_detail then
+ if trace_details then
report_resolving("deep checking %a, base %a, pattern %a",hashname,basename,pathname)
end
local path, name = lookup(content,basename)
@@ -1089,7 +1157,6 @@ local function find_analyze(filename,askedformat,allresults)
if askedformat == "" then
if filesuffix == "" or not suffixmap[filesuffix] then
local defaultsuffixes = resolvers.defaultsuffixes
- local formatofsuffix = resolvers.formatofsuffix
for i=1,#defaultsuffixes do
local forcedname = filename .. '.' .. defaultsuffixes[i]
wantedfiles[#wantedfiles+1] = forcedname
@@ -1099,7 +1166,7 @@ local function find_analyze(filename,askedformat,allresults)
end
end
else
- filetype = resolvers.formatofsuffix(filename)
+ filetype = formatofsuffix(filename)
if trace_locating then
report_resolving("using suffix based filetype %a",filetype)
end
@@ -1123,7 +1190,7 @@ end
local function find_direct(filename,allresults)
if not dangerous[askedformat] and isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("file %a found directly",filename)
end
return "direct", { filename }
@@ -1150,12 +1217,12 @@ local function find_qualified(filename,allresults,askedformat,alsostripped) -- t
report_resolving("checking qualified name %a", filename)
end
if isreadable(filename) then
- if trace_detail then
+ if trace_details then
report_resolving("qualified file %a found", filename)
end
return "qualified", { filename }
end
- if trace_detail then
+ if trace_details then
report_resolving("locating qualified file %a", filename)
end
local forcedname, suffix = "", suffixonly(filename)
@@ -1163,11 +1230,11 @@ local function find_qualified(filename,allresults,askedformat,alsostripped) -- t
local format_suffixes = askedformat == "" and resolvers.defaultsuffixes or suffixes[askedformat]
if format_suffixes then
for i=1,#format_suffixes do
- local s = format_suffixes[i]
- forcedname = filename .. "." .. s
+ local suffix = format_suffixes[i]
+ forcedname = filename .. "." .. suffix
if isreadable(forcedname) then
if trace_locating then
- report_resolving("no suffix, forcing format filetype %a", s)
+ report_resolving("no suffix, forcing format filetype %a", suffix)
end
return "qualified", { forcedname }
end
@@ -1182,7 +1249,7 @@ local function find_qualified(filename,allresults,askedformat,alsostripped) -- t
local savedformat = askedformat
local format = savedformat or ""
if format == "" then
- askedformat = resolvers.formatofsuffix(suffix)
+ askedformat = formatofsuffix(suffix)
end
if not format then
askedformat = "othertextfiles" -- kind of everything, maybe all
@@ -1231,7 +1298,7 @@ end
local function check_subpath(fname)
if isreadable(fname) then
- if trace_detail then
+ if trace_details then
report_resolving("found %a by deep scanning",fname)
end
return fname
@@ -1244,7 +1311,7 @@ end
local function makepathlist(list,filetype)
local typespec = resolvers.variableofformat(filetype)
- local pathlist = resolvers.expandedpathlist(typespec,filetype and usertypes[filetype]) -- only extra path with user files
+ local pathlist = expandedpathlist(typespec,filetype and usertypes[filetype]) -- only extra path with user files
local entry = { }
if pathlist and #pathlist > 0 then
for k=1,#pathlist do
@@ -1255,7 +1322,7 @@ local function makepathlist(list,filetype)
local expression = makepathexpression(pathname)
local barename = gsub(pathname,"/+$","")
barename = resolveprefix(barename)
- local scheme = url.hasscheme(barename)
+ local scheme = urlhasscheme(barename)
local schemename = gsub(barename,"%.%*$",'') -- after scheme
-- local prescanned = path ~= pathname -- ^!!
-- local resursive = find(pathname,'//$')
@@ -1300,7 +1367,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
dirlist[i] = filedirname(filelist[i][3]) .. "/" -- was [2] .. gamble
end
end
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a in tree",filename)
end
for k=1,#pathlist do
@@ -1312,7 +1379,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
if filelist then -- database
-- compare list entries with permitted pattern -- /xx /xx//
local expression = entry.expression
- if trace_detail then
+ if trace_details then
report_resolving("using pattern %a for path %a",expression,pathname)
end
for k=1,#filelist do
@@ -1325,16 +1392,16 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
result[#result+1] = resolveprefix(fl[3]) -- no shortcut
done = true
if allresults then
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, continue scanning",expression,f,d)
end
else
- if trace_detail then
+ if trace_details then
report_resolving("match to %a in hash for file %a and path %a, quit scanning",expression,f,d)
end
break
end
- elseif trace_detail then
+ elseif trace_details then
report_resolving("no match to %a in hash for file %a and path %a",expression,f,d)
end
end
@@ -1355,9 +1422,8 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
-- that are not hashed (like sources on my machine) .. so, this is slightly
-- out of order but at least fast (and we seldom end up here, only when a file
-- is not already found
--- inspect(entry)
if not done and not entry.prescanned then
- if trace_detail then
+ if trace_details then
report_resolving("quick root scan for %a",pname)
end
for k=1,#wantedfiles do
@@ -1373,7 +1439,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
if not done and entry.recursive then -- maybe also when allresults
-- collect files in path (and cache the result)
- if trace_detail then
+ if trace_details then
report_resolving("scanning filesystem for %a",pname)
end
local files = resolvers.simplescanfiles(pname,false,true)
@@ -1446,7 +1512,7 @@ local function find_intree(filename,filetype,wantedfiles,allresults)
end
local function find_onpath(filename,filetype,wantedfiles,allresults)
- if trace_detail then
+ if trace_details then
report_resolving("checking filename %a, filetype %a, wanted files %a",filename,filetype,concat(wantedfiles," | "))
end
local result = { }
@@ -1481,10 +1547,8 @@ collect_instance_files = function(filename,askedformat,allresults) -- uses neste
return { }
end
askedformat = askedformat or ""
- filename = collapsepath(filename,".")
-
- filename = gsub(filename,"^%./",getcurrentdir().."/") -- we will merge dir.expandname and collapse some day
-
+ filename = collapsepath(filename,".")
+ filename = gsub(filename,"^%./",getcurrentdir().."/") -- we will merge dir.expandname and collapse some day
if allresults then
-- no need for caching, only used for tracing
local filetype, wantedfiles = find_analyze(filename,askedformat)
@@ -1496,7 +1560,9 @@ collect_instance_files = function(filename,askedformat,allresults) -- uses neste
{ find_onpath (filename,filetype,wantedfiles,true) },
{ find_otherwise(filename,filetype,wantedfiles,true) },
}
- local result, status, done = { }, { }, { }
+ local result = { }
+ local status = { }
+ local done = { }
for k, r in next, results do
local method, list = r[1], r[2]
if method and list then
@@ -1510,7 +1576,7 @@ collect_instance_files = function(filename,askedformat,allresults) -- uses neste
end
end
end
- if trace_detail then
+ if trace_details then
report_resolving("lookup status: %s",table.serialize(status,filename))
end
return result, status
@@ -1571,6 +1637,9 @@ local function findfiles(filename,filetype,allresults)
if not filename or filename == "" then
return { }
end
+ if allresults == nil then
+ allresults = true
+ end
local result, status = collect_instance_files(filename,filetype or "",allresults)
if not result or #result == 0 then
local lowered = lower(filename)
@@ -1581,32 +1650,29 @@ local function findfiles(filename,filetype,allresults)
return result or { }, status
end
-function resolvers.findfiles(filename,filetype)
- if not filename or filename == "" then
- -- weird ... why called then
- return ""
- else
- return findfiles(filename,filetype,true)
- end
-end
-
-function resolvers.findfile(filename,filetype)
+local function findfile(filename,filetype)
if not filename or filename == "" then
- -- weird ... why called then
return ""
else
return findfiles(filename,filetype,false)[1] or ""
end
end
+resolvers.findfiles = findfiles
+resolvers.findfile = findfile
+
+resolvers.find_file = findfile -- obsolete
+resolvers.find_files = findfiles -- obsolete
+
function resolvers.findpath(filename,filetype)
return filedirname(findfiles(filename,filetype,false)[1] or "")
end
local function findgivenfiles(filename,allresults)
+ local hashes = instance.hashes
+ local files = instance.files
local base = filebasename(filename)
local result = { }
- local hashes = instance.hashes
--
local function okay(hash,path,name)
local found = methodhandler('concatinators',hash.type,hash.name,path,name)
@@ -1618,7 +1684,7 @@ local function findgivenfiles(filename,allresults)
--
for k=1,#hashes do
local hash = hashes[k]
- local content = instance.files[hash.name]
+ local content = files[hash.name]
if content then
local path, name = lookup(content,base)
if not path then
@@ -1661,15 +1727,16 @@ end
-- why bother
local function findwildcardfiles(filename,allresults,result)
+ local files = instance.files
+ local hashes = instance.hashes
+ --
local result = result or { }
local base = filebasename(filename)
local dirn = filedirname(filename)
local path = lower(lpegmatch(makewildcard,dirn) or dirn)
local name = lower(lpegmatch(makewildcard,base) or base)
- local files = instance.files
--
if find(name,"*",1,true) then
- local hashes = instance.hashes
local function okay(found,path,base,hashname,hashtype)
if find(found,path) then
local full = methodhandler('concatinators',hashtype,hashname,found,base)
@@ -1710,7 +1777,6 @@ local function findwildcardfiles(filename,allresults,result)
end
end
--
- local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
local hashname = hash.name
@@ -1746,18 +1812,30 @@ function resolvers.findwildcardfile(filename)
return findwildcardfiles(filename,false)[1] or ""
end
--- main user functions
+do
-function resolvers.automount()
- -- implemented later
-end
+ local starttiming = statistics.starttiming
+ local stoptiming = statistics.stoptiming
+ local elapsedtime = statistics.elapsedtime
+
+ function resolvers.starttiming()
+ starttiming(instance)
+ end
+
+ function resolvers.stoptiming()
+ stoptiming(instance)
+ end
+
+ function resolvers.loadtime()
+ return elapsedtime(instance)
+ end
-function resolvers.starttiming()
- statistics.starttiming(instance)
end
-function resolvers.stoptiming()
- statistics.stoptiming(instance)
+-- main user functions
+
+function resolvers.automount()
+ -- implemented later (maybe a one-time setter like textopener)
end
function resolvers.load(option)
@@ -1773,10 +1851,6 @@ function resolvers.load(option)
return files and next(files) and true
end
-function resolvers.loadtime()
- return statistics.elapsedtime(instance)
-end
-
local function report(str)
if trace_locating then
report_resolving(str) -- has already verbose
@@ -1807,13 +1881,11 @@ function resolvers.dowithfilesandreport(command, files, ...) -- will move
end
end
--- obsolete
-
-- resolvers.varvalue = resolvers.variable -- output the value of variable $STRING.
--- resolvers.expandvar = resolvers.expansion -- output variable expansion of STRING.
+-- resolvers.expandvar = expansion -- output variable expansion of STRING.
function resolvers.showpath(str) -- output search path for file type NAME
- return joinpath(resolvers.expandedpathlist(resolvers.formatofvariable(str)))
+ return joinpath(expandedpathlist(resolvers.formatofvariable(str)))
end
function resolvers.registerfile(files, name, path)
@@ -1829,7 +1901,7 @@ function resolvers.registerfile(files, name, path)
end
function resolvers.dowithpath(name,func)
- local pathlist = resolvers.expandedpathlist(name)
+ local pathlist = expandedpathlist(name)
for i=1,#pathlist do
func("^"..cleanpath(pathlist[i]))
end
@@ -1840,12 +1912,12 @@ function resolvers.dowithvariable(name,func)
end
function resolvers.locateformat(name)
- local engine = environment.ownmain or "luatex"
- local barename = removesuffix(name)
+ local engine = environment.ownmain or "luatex"
+ local barename = removesuffix(file.basename(name))
local fullname = addsuffix(barename,"fmt")
- local fmtname = caches.getfirstreadablefile(fullname,"formats",engine) or ""
+ local fmtname = caches.getfirstreadablefile(fullname,"formats",engine) or ""
if fmtname == "" then
- fmtname = resolvers.findfile(fullname)
+ fmtname = findfile(fullname)
fmtname = cleanpath(fmtname)
end
if fmtname ~= "" then
@@ -1854,18 +1926,18 @@ function resolvers.locateformat(name)
local lucname = addsuffix(barename,luasuffixes.luc)
local luiname = addsuffix(barename,luasuffixes.lui)
if isfile(luiname) then
- return barename, luiname
+ return fmtname, luiname
elseif isfile(lucname) then
- return barename, lucname
+ return fmtname, lucname
elseif isfile(luaname) then
- return barename, luaname
+ return fmtname, luaname
end
end
return nil, nil
end
function resolvers.booleanvariable(str,default)
- local b = resolvers.expansion(str)
+ local b = expansion(str)
if b == "" then
return default
else
@@ -1876,6 +1948,7 @@ end
function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move, can be a nice iterator instead
local hashes = instance.hashes
+ local files = instance.files
for i=1,#hashes do
local hash = hashes[i]
local blobtype = hash.type
@@ -1887,7 +1960,7 @@ function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move,
if before then
before(blobtype,blobpath,pattern)
end
- for path, name in filtered(instance.files[blobpath],pattern) do
+ for path, name in filtered(files[blobpath],pattern) do
if type(path) == "string" then
checked = checked + 1
if handle(blobtype,blobpath,path,name) then
@@ -1909,12 +1982,6 @@ function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move,
end
end
-local obsolete = resolvers.obsolete or { }
-resolvers.obsolete = obsolete
-
-resolvers.find_file = resolvers.findfile obsolete.find_file = resolvers.findfile
-resolvers.find_files = resolvers.findfiles obsolete.find_files = resolvers.findfiles
-
-- moved here
function resolvers.knownvariables(pattern)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-sch.lua b/Master/texmf-dist/tex/context/base/mkiv/data-sch.lua
index 2e880e99740..d869520ba28 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-sch.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-sch.lua
@@ -6,9 +6,14 @@ if not modules then modules = { } end modules ['data-sch'] = {
license = "see context related readme files"
}
+-- this one will be redone / localized
+
local load, tonumber = load, tonumber
-local gsub, concat, format = string.gsub, table.concat, string.format
+local gsub, format = string.gsub, string.format
+local sortedhash, concat = table.sortedhash, table.concat
local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
+local addsuffix, suffix, splitbase = file.addsuffix, file.suffix, file.splitbase
+local md5hex = md5.hex
local trace_schemes = false trackers.register("resolvers.schemes",function(v) trace_schemes = v end)
local report_schemes = logs.reporter("resolvers","schemes")
@@ -39,7 +44,7 @@ end
-- end
function cleaners.strip(specification) -- keep suffixes
- local path, name = file.splitbase(specification.original)
+ local path, name = splitbase(specification.original)
if path == "" then
return (gsub(name,"[^%a%d%.]+","-"))
else
@@ -48,7 +53,7 @@ function cleaners.strip(specification) -- keep suffixes
end
function cleaners.md5(specification)
- return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
+ return addsuffix(md5hex(specification.original),suffix(specification.path))
end
local cleaner = cleaners.strip
@@ -72,7 +77,7 @@ local runner = sandbox.registerrunner {
name = "curl resolver",
method = "execute",
program = "curl",
- template = "--silent --insecure --create-dirs --output %cachename% %original%",
+ template = '--silent --insecure --create-dirs --output "%cachename%" "%original%"',
checkers = {
cachename = "cache",
original = "url",
@@ -149,10 +154,10 @@ schemes.install = install
local function http_handler(specification,cachename)
local tempname = cachename .. ".tmp"
- local f = io.open(tempname,"wb")
+ local handle = io.open(tempname,"wb")
local status, message = http.request {
url = specification.original,
- sink = ltn12.sink.file(f)
+ sink = ltn12.sink.file(handle)
}
if not status then
os.remove(tempname)
@@ -169,13 +174,13 @@ install('ftp')
statistics.register("scheme handling time", function()
local l, r, nl, nr = { }, { }, 0, 0
- for k, v in table.sortedhash(loaded) do
+ for k, v in sortedhash(loaded) do
if v > 0 then
nl = nl + 1
l[nl] = k .. ":" .. v
end
end
- for k, v in table.sortedhash(reused) do
+ for k, v in sortedhash(reused) do
if v > 0 then
nr = nr + 1
r[nr] = k .. ":" .. v
@@ -183,10 +188,10 @@ statistics.register("scheme handling time", function()
end
local n = nl + nr
if n > 0 then
- l = nl > 0 and concat(l) or "none"
- r = nr > 0 and concat(r) or "none"
+ if nl == 0 then l = { "none" } end
+ if nr == 0 then r = { "none" } end
return format("%s seconds, %s processed, threshold %s seconds, loaded: %s, reused: %s",
- statistics.elapsedtime(schemes), n, threshold, l, r)
+ statistics.elapsedtime(schemes), n, threshold, concat(l," "), concat(l," "))
else
return nil
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-tex.lua b/Master/texmf-dist/tex/context/base/mkiv/data-tex.lua
index 8f978a204f3..e7c4941cae7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-tex.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-tex.lua
@@ -6,20 +6,25 @@ if not modules then modules = { } end modules ['data-tex'] = {
license = "see context related readme files"
}
+local tostring, tonumber, type = tostring, tonumber, type
local char, find = string.char, string.find
-local insert, remove = table.insert, table.remove
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
local report_tex = logs.reporter("resolvers","tex")
-local resolvers = resolvers
local sequencers = utilities.sequencers
-local methodhandler = resolvers.methodhandler
-local splitlines = string.splitlines
local utffiletype = utf.filetype
local setmetatableindex = table.setmetatableindex
+local loaddata = io.loaddata
+----- readall = io.readall
+
+local resolvers = resolvers
+local methodhandler = resolvers.methodhandler
+local loadbinfile = resolvers.loadbinfile
+local pushinputname = resolvers.pushinputname
+local popinputname = resolvers.popinputname
-- local fileprocessor = nil
-- local lineprocessor = nil
@@ -36,8 +41,9 @@ local textlineactions = sequencers.new {
results = "str",
}
-local helpers = resolvers.openers.helpers
-local appendgroup = sequencers.appendgroup
+local helpers = resolvers.openers.helpers
+local appendgroup = sequencers.appendgroup
+local appendaction = sequencers.appendaction
helpers.textfileactions = textfileactions
helpers.textlineactions = textlineactions
@@ -53,10 +59,6 @@ appendgroup(textlineactions,"after" ) -- user
local ctrl_d = char( 4) -- unix
local ctrl_z = char(26) -- windows
-resolvers.inputstack = resolvers.inputstack or { }
-
-local inputstack = resolvers.inputstack
-
----------------------------------------
local lpegmatch = lpeg.match
@@ -84,18 +86,25 @@ end
-----------------------------------------
-function helpers.textopener(tag,filename,filehandle,coding)
+local wideutfcoding = {
+ ["utf-16-be"] = utf.utf16_to_utf8_be_t,
+ ["utf-16-le"] = utf.utf16_to_utf8_le_t,
+ ["utf-32-be"] = utf.utf32_to_utf8_be_t,
+ ["utf-32-le"] = utf.utf32_to_utf8_le_t,
+}
+
+local function textopener(tag,filename,filehandle,coding)
local lines
local t_filehandle = type(filehandle)
if not filehandle then
- lines = io.loaddata(filename)
+ lines = loaddata(filename)
elseif t_filehandle == "string" then
lines = filehandle
elseif t_filehandle == "table" then
lines = filehandle
else
- lines = filehandle:read("*a") -- io.readall(filehandle) ... but never that large files anyway
- -- lines = io.readall(filehandle)
+ lines = filehandle:read("*a") -- readall(filehandle) ... but never that large files anyway
+ -- lines = readall(filehandle)
filehandle:close()
end
if type(lines) == "string" then
@@ -103,14 +112,9 @@ function helpers.textopener(tag,filename,filehandle,coding)
if trace_locating then
report_tex("%a opener: %a opened using method %a",tag,filename,coding)
end
- if coding == "utf-16-be" then
- lines = utf.utf16_to_utf8_be_t(lines)
- elseif coding == "utf-16-le" then
- lines = utf.utf16_to_utf8_le_t(lines)
- elseif coding == "utf-32-be" then
- lines = utf.utf32_to_utf8_be_t(lines)
- elseif coding == "utf-32-le" then
- lines = utf.utf32_to_utf8_le_t(lines)
+ local wideutf = wideutfcoding[coding]
+ if wideutf then
+ lines = wideutf(lines)
else -- utf8 or unknown (could be a mkvi file)
local runner = textfileactions.runner
if runner then
@@ -125,19 +129,17 @@ function helpers.textopener(tag,filename,filehandle,coding)
if lines[noflines] == "" then -- maybe some special check is needed
lines[noflines] = nil
end
- logs.show_open(filename)
- insert(inputstack,filename)
+ pushinputname(filename)
local currentline, noflines = 0, noflines
local t = {
filename = filename,
noflines = noflines,
-- currentline = 0,
close = function()
+ local usedname = popinputname() -- should match filename
if trace_locating then
report_tex("%a closer: %a closed",tag,filename)
end
- logs.show_close(filename)
- remove(inputstack)
t = nil
end,
reader = function(self)
@@ -176,6 +178,8 @@ function helpers.textopener(tag,filename,filehandle,coding)
return t
end
+helpers.settextopener(textopener) -- can only be done once
+
function resolvers.findtexfile(filename,filetype)
return methodhandler('finders',filename,filetype)
end
@@ -191,7 +195,7 @@ end
function resolvers.loadtexfile(filename,filetype)
-- todo: optionally apply filters
- local ok, data, size = resolvers.loadbinfile(filename, filetype)
+ local ok, data, size = loadbinfile(filename, filetype)
return data or ""
end
@@ -202,14 +206,14 @@ local function installhandler(namespace,what,where,func)
where, func = "after", where
end
if where == "before" or where == "after" then
- sequencers.appendaction(namespace,where,func)
+ appendaction(namespace,where,func)
else
report_tex("installing input %a handlers in %a is not possible",what,tostring(where))
end
end
-function resolvers.installinputlinehandler(...) installhandler(helpers.textlineactions,"line",...) end
-function resolvers.installinputfilehandler(...) installhandler(helpers.textfileactions,"file",...) end
+function resolvers.installinputlinehandler(...) installhandler(textlineactions,"line",...) end
+function resolvers.installinputfilehandler(...) installhandler(textfileactions,"file",...) end
-- local basename = file.basename
-- resolvers.installinputlinehandler(function(str,filename,linenumber,noflines)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-tmp.lua b/Master/texmf-dist/tex/context/base/mkiv/data-tmp.lua
index d25a6b2f972..9b0117c1562 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-tmp.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-tmp.lua
@@ -7,28 +7,32 @@ if not modules then modules = { } end modules ['data-tmp'] = {
}
--[[ldx--
-<p>This module deals with caching data. It sets up the paths and
-implements loaders and savers for tables. Best is to set the
-following variable. When not set, the usual paths will be
-checked. Personally I prefer the (users) temporary path.</p>
+<p>This module deals with caching data. It sets up the paths and implements
+loaders and savers for tables. Best is to set the following variable. When not
+set, the usual paths will be checked. Personally I prefer the (users) temporary
+path.</p>
</code>
TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
</code>
-<p>Currently we do no locking when we write files. This is no real
-problem because most caching involves fonts and the chance of them
-being written at the same time is small. We also need to extend
-luatools with a recache feature.</p>
+<p>Currently we do no locking when we write files. This is no real problem
+because most caching involves fonts and the chance of them being written at the
+same time is small. We also need to extend luatools with a recache feature.</p>
--ldx]]--
-local format, lower, gsub, concat = string.format, string.lower, string.gsub, table.concat
------ serialize, serializetofile = table.serialize, table.tofile -- overloaded so no local
-local concat = table.concat
-local mkdirs, isdir, isfile = dir.mkdirs, lfs.isdir, lfs.isfile
-local addsuffix, is_writable, is_readable = file.addsuffix, file.is_writable, file.is_readable
-local formatters = string.formatters
local next, type = next, type
+local pcall, loadfile, collectgarbage = pcall, loadfile, collectgarbage
+local format, lower, gsub = string.format, string.lower, string.gsub
+local concat, serialize, fastserialize, serializetofile = table.concat, table.serialize, table.fastserialize, table.tofile
+local mkdirs, expanddirname, isdir, isfile = dir.mkdirs, dir.expandname, lfs.isdir, lfs.isfile
+local is_writable, is_readable = file.is_writable, file.is_readable
+local collapsepath, joinfile, addsuffix, dirname = file.collapsepath, file.join, file.addsuffix, file.dirname
+local savedata = file.savedata
+local formatters = string.formatters
+local osexit, osdate, osuuid = os.exit, os.date, os.uuid
+local removefile = os.remove
+local md5hex = md5.hex
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
@@ -36,44 +40,80 @@ local trace_cache = false trackers.register("resolvers.cache", function(v
local report_caches = logs.reporter("resolvers","caches")
local report_resolvers = logs.reporter("resolvers","caching")
-local resolvers = resolvers
-local cleanpath = resolvers.cleanpath
+local resolvers = resolvers
+local cleanpath = resolvers.cleanpath
+local resolvepath = resolvers.resolve
+
+local luautilities = utilities.lua
-- intermezzo
-local directive_cleanup = false directives.register("system.compile.cleanup", function(v) directive_cleanup = v end)
-local directive_strip = false directives.register("system.compile.strip", function(v) directive_strip = v end)
+do
+
+ local directive_cleanup = false directives.register("system.compile.cleanup", function(v) directive_cleanup = v end)
+ local directive_strip = false directives.register("system.compile.strip", function(v) directive_strip = v end)
-local compile = utilities.lua.compile
+ local compilelua = luautilities.compile
+
+ function luautilities.compile(luafile,lucfile,cleanup,strip)
+ if cleanup == nil then cleanup = directive_cleanup end
+ if strip == nil then strip = directive_strip end
+ return compilelua(luafile,lucfile,cleanup,strip)
+ end
-function utilities.lua.compile(luafile,lucfile,cleanup,strip)
- if cleanup == nil then cleanup = directive_cleanup end
- if strip == nil then strip = directive_strip end
- return compile(luafile,lucfile,cleanup,strip)
end
-- end of intermezzo
-caches = caches or { }
-local caches = caches
+caches = caches or { }
+local caches = caches
+local writable = nil
+local readables = { }
+local usedreadables = { }
-local luasuffixes = utilities.lua.suffixes
+local compilelua = luautilities.compile
+local luasuffixes = luautilities.suffixes
-caches.base = caches.base or "luatex-cache"
-caches.more = caches.more or "context"
-caches.direct = false -- true is faster but may need huge amounts of memory
-caches.tree = false
-caches.force = true
-caches.ask = false
-caches.relocate = false
-caches.defaults = { "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
+caches.base = caches.base or "luatex-cache" -- can be local
+caches.more = caches.more or "context" -- can be local
+caches.defaults = { "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
-directives.register("system.caches.fast",function(v) caches.fast = true end)
+local direct_cache = false -- true is faster but may need huge amounts of memory
+local fast_cache = false
+local cache_tree = false
-local writable, readables, usedreadables = nil, { }, { }
+directives.register("system.caches.direct",function(v) direct_cache = true end)
+directives.register("system.caches.fast", function(v) fast_cache = true end)
-- we could use a metatable for writable and readable but not yet
+local function configfiles()
+ return concat(resolvers.configurationfiles(),";")
+end
+
+local function hashed(tree)
+ tree = gsub(tree,"[\\/]+$","")
+ tree = lower(tree)
+ local hash = md5hex(tree)
+ if trace_cache or trace_locating then
+ report_caches("hashing tree %a, hash %a",tree,hash)
+ end
+ return hash
+end
+
+local function treehash()
+ local tree = configfiles()
+ if not tree or tree == "" then
+ return false
+ else
+ return hashed(tree)
+ end
+end
+
+caches.hashed = hashed
+caches.treehash = treehash
+caches.configfiles = configfiles
+
local function identify()
-- Combining the loops makes it messy. First we check the format cache path
-- and when the last component is not present we try to create it.
@@ -82,9 +122,9 @@ local function identify()
for k=1,#texmfcaches do
local cachepath = texmfcaches[k]
if cachepath ~= "" then
- cachepath = resolvers.resolve(cachepath)
- cachepath = resolvers.cleanpath(cachepath)
- cachepath = file.collapsepath(cachepath)
+ cachepath = resolvepath(cachepath)
+ cachepath = cleanpath(cachepath)
+ cachepath = collapsepath(cachepath)
local valid = isdir(cachepath)
if valid then
if is_readable(cachepath) then
@@ -93,16 +133,14 @@ local function identify()
writable = cachepath
end
end
- elseif not writable and caches.force then
- local cacheparent = file.dirname(cachepath)
- if is_writable(cacheparent) and true then -- we go on anyway (needed for mojca's kind of paths)
- if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
- mkdirs(cachepath)
- if isdir(cachepath) and is_writable(cachepath) then
- report_caches("path %a created",cachepath)
- writable = cachepath
- readables[#readables+1] = cachepath
- end
+ elseif not writable then
+ local cacheparent = dirname(cachepath)
+ if is_writable(cacheparent) then -- we go on anyway (needed for mojca's kind of paths)
+ mkdirs(cachepath)
+ if isdir(cachepath) and is_writable(cachepath) then
+ report_caches("path %a created",cachepath)
+ writable = cachepath
+ readables[#readables+1] = cachepath
end
end
end
@@ -117,8 +155,8 @@ local function identify()
local cachepath = texmfcaches[k]
cachepath = resolvers.expansion(cachepath) -- was getenv
if cachepath ~= "" then
- cachepath = resolvers.resolve(cachepath)
- cachepath = resolvers.cleanpath(cachepath)
+ cachepath = resolvepath(cachepath)
+ cachepath = cleanpath(cachepath)
local valid = isdir(cachepath)
if valid and is_readable(cachepath) then
if not writable and is_writable(cachepath) then
@@ -134,25 +172,27 @@ local function identify()
-- quit.
if not writable then
report_caches("fatal error: there is no valid writable cache path defined")
- os.exit()
+ osexit()
elseif #readables == 0 then
report_caches("fatal error: there is no valid readable cache path defined")
- os.exit()
+ osexit()
end
-- why here
- writable = dir.expandname(resolvers.cleanpath(writable)) -- just in case
- -- moved here
- local base, more, tree = caches.base, caches.more, caches.tree or caches.treehash() -- we have only one writable tree
+ writable = expanddirname(cleanpath(writable)) -- just in case
+ -- moved here ( we have only one writable tree)
+ local base = caches.base
+ local more = caches.more
+ local tree = cache_tree or treehash() -- we have only one writable tree
if tree then
- caches.tree = tree
+ cache_tree = tree
writable = mkdirs(writable,base,more,tree)
for i=1,#readables do
- readables[i] = file.join(readables[i],base,more,tree)
+ readables[i] = joinfile(readables[i],base,more,tree)
end
else
writable = mkdirs(writable,base,more)
for i=1,#readables do
- readables[i] = file.join(readables[i],base,more)
+ readables[i] = joinfile(readables[i],base,more)
end
end
-- end
@@ -192,30 +232,8 @@ function caches.usedpaths(separator)
end
end
-function caches.configfiles()
- return concat(resolvers.configurationfiles(),";")
-end
-
-function caches.hashed(tree)
- tree = gsub(tree,"[\\/]+$","")
- tree = lower(tree)
- local hash = md5.hex(tree)
- if trace_cache or trace_locating then
- report_caches("hashing tree %a, hash %a",tree,hash)
- end
- return hash
-end
-
-function caches.treehash()
- local tree = caches.configfiles()
- if not tree or tree == "" then
- return false
- else
- return caches.hashed(tree)
- end
-end
-
-local r_cache, w_cache = { }, { } -- normally w in in r but who cares
+local r_cache = { }
+local w_cache = { }
local function getreadablepaths(...)
local tags = { ... }
@@ -226,7 +244,7 @@ local function getreadablepaths(...)
if #tags > 0 then
done = { }
for i=1,#readables do
- done[i] = file.join(readables[i],...)
+ done[i] = joinfile(readables[i],...)
end
else
done = readables
@@ -252,31 +270,21 @@ local function getwritablepath(...)
return done
end
-caches.getreadablepaths = getreadablepaths
-caches.getwritablepath = getwritablepath
-
--- this can be tricky as we can have a pre-generated format while at the same time
--- use e.g. a home path where we have updated file databases and so maybe we need
--- to check first if we do have a writable one
-
--- function caches.getfirstreadablefile(filename,...)
--- local rd = getreadablepaths(...)
--- for i=1,#rd do
--- local path = rd[i]
--- local fullname = file.join(path,filename)
--- if is_readable(fullname) then
--- usedreadables[i] = true
--- return fullname, path
--- end
--- end
--- return caches.setfirstwritablefile(filename,...)
--- end
+local function setfirstwritablefile(filename,...)
+ local wr = getwritablepath(...)
+ local fullname = joinfile(wr,filename)
+ return fullname, wr
+end
--- next time we have an issue, we can test this instead:
+local function setluanames(path,name)
+ return
+ format("%s/%s.%s",path,name,luasuffixes.tma),
+ format("%s/%s.%s",path,name,luasuffixes.tmc)
+end
-function caches.getfirstreadablefile(filename,...)
+local function getfirstreadablefile(filename,...)
-- check if we have already written once
- local fullname, path = caches.setfirstwritablefile(filename,...)
+ local fullname, path = setfirstwritablefile(filename,...)
if is_readable(fullname) then
return fullname, path -- , true
end
@@ -284,7 +292,7 @@ function caches.getfirstreadablefile(filename,...)
local rd = getreadablepaths(...)
for i=1,#rd do
local path = rd[i]
- local fullname = file.join(path,filename)
+ local fullname = joinfile(path,filename)
if is_readable(fullname) then
usedreadables[i] = true
return fullname, path -- , false
@@ -294,21 +302,19 @@ function caches.getfirstreadablefile(filename,...)
return fullname, path -- , true
end
-function caches.setfirstwritablefile(filename,...)
- local wr = getwritablepath(...)
- local fullname = file.join(wr,filename)
- return fullname, wr
-end
+caches.getreadablepaths = getreadablepaths
+caches.getwritablepath = getwritablepath
+caches.setfirstwritablefile = setfirstwritablefile
+caches.getfirstreadablefile = getfirstreadablefile
+caches.setluanames = setluanames
-function caches.define(category,subcategory) -- not used
- return function()
- return getwritablepath(category,subcategory)
- end
-end
-
-function caches.setluanames(path,name)
- return format("%s/%s.%s",path,name,luasuffixes.tma), format("%s/%s.%s",path,name,luasuffixes.tmc)
-end
+-- -- not used:
+--
+-- function caches.define(category,subcategory)
+-- return function()
+-- return getwritablepath(category,subcategory)
+-- end
+-- end
-- This works best if the first writable is the first readable too. In practice
-- we can have these situations for file databases:
@@ -325,22 +331,23 @@ function caches.loaddata(readables,name,writable)
for i=1,#readables do
local path = readables[i]
local loader = false
- local tmaname, tmcname = caches.setluanames(path,name)
+ local state = false
+ local tmaname, tmcname = setluanames(path,name)
if isfile(tmcname) then
- loader = loadfile(tmcname)
+ state, loader = pcall(loadfile,tmcname)
end
if not loader and isfile(tmaname) then
-- can be different paths when we read a file database from disk
- local tmacrap, tmcname = caches.setluanames(writable,name)
+ local tmacrap, tmcname = setluanames(writable,name)
if isfile(tmcname) then
- loader = loadfile(tmcname)
+ state, loader = pcall(loadfile,tmcname)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
if isfile(tmcname) then
- loader = loadfile(tmcname)
+ state, loader = pcall(loadfile,tmcname)
end
if not loader then
- loader = loadfile(tmaname)
+ state, loader = pcall(loadfile,tmaname)
end
end
if loader then
@@ -353,27 +360,23 @@ function caches.loaddata(readables,name,writable)
end
function caches.is_writable(filepath,filename)
- local tmaname, tmcname = caches.setluanames(filepath,filename)
+ local tmaname, tmcname = setluanames(filepath,filename)
return is_writable(tmaname)
end
-local saveoptions = { compact = true }
-
--- add some point we will only use the internal bytecode compiler and
--- then we can flag success in the tma so that it can trigger a compile
--- if the other engine
+local saveoptions = { compact = true, accurate = not JITSUPPORTED }
-function caches.savedata(filepath,filename,data,raw)
- local tmaname, tmcname = caches.setluanames(filepath,filename)
- data.cache_uuid = os.uuid()
- if caches.fast then
- file.savedata(tmaname,table.fastserialize(data,true))
- elseif caches.direct then
- file.savedata(tmaname,table.serialize(data,true,saveoptions))
+function caches.savedata(filepath,filename,data,fast)
+ local tmaname, tmcname = setluanames(filepath,filename)
+ data.cache_uuid = osuuid()
+ if fast or fast_cache then
+ savedata(tmaname,fastserialize(data,true))
+ elseif direct_cache then
+ savedata(tmaname,serialize(data,true,saveoptions))
else
- table.tofile(tmaname,data,true,saveoptions)
+ serializetofile(tmaname,data,true,saveoptions)
end
- utilities.lua.compile(tmaname,tmcname)
+ compilelua(tmaname,tmcname)
end
-- moved from data-res:
@@ -386,11 +389,14 @@ end
function caches.loadcontent(cachename,dataname,filename)
if not filename then
- local name = caches.hashed(cachename)
- local full, path = caches.getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename = file.join(path,name)
+ local name = hashed(cachename)
+ local full, path = getfirstreadablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename = joinfile(path,name)
+ end
+ local state, blob = pcall(loadfile,addsuffix(filename,luasuffixes.luc))
+ if not blob then
+ state, blob = pcall(loadfile,addsuffix(filename,luasuffixes.lua))
end
- local blob = loadfile(addsuffix(filename,luasuffixes.luc)) or loadfile(addsuffix(filename,luasuffixes.lua))
if blob then
local data = blob()
if data and data.content then
@@ -425,9 +431,9 @@ end
function caches.savecontent(cachename,dataname,content,filename)
if not filename then
- local name = caches.hashed(cachename)
- local full, path = caches.setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
- filename = file.join(path,name) -- is full
+ local name = hashed(cachename)
+ local full, path = setfirstwritablefile(addsuffix(name,luasuffixes.lua),"trees")
+ filename = joinfile(path,name) -- is full
end
local luaname = addsuffix(filename,luasuffixes.lua)
local lucname = addsuffix(filename,luasuffixes.luc)
@@ -438,17 +444,17 @@ function caches.savecontent(cachename,dataname,content,filename)
type = dataname,
root = cachename,
version = resolvers.cacheversion,
- date = os.date("%Y-%m-%d"),
- time = os.date("%H:%M:%S"),
+ date = osdate("%Y-%m-%d"),
+ time = osdate("%H:%M:%S"),
content = content,
- uuid = os.uuid(),
+ uuid = osuuid(),
}
- local ok = io.savedata(luaname,table.serialize(data,true))
+ local ok = savedata(luaname,serialize(data,true))
if ok then
if trace_locating then
report_resolvers("category %a, cachename %a saved in %a",dataname,cachename,luaname)
end
- if utilities.lua.compile(luaname,lucname) then
+ if compilelua(luaname,lucname) then
if trace_locating then
report_resolvers("%a compiled to %a",dataname,lucname)
end
@@ -457,7 +463,7 @@ function caches.savecontent(cachename,dataname,content,filename)
if trace_locating then
report_resolvers("compiling failed for %a, deleting file %a",dataname,lucname)
end
- os.remove(lucname)
+ removefile(lucname)
end
elseif trace_locating then
report_resolvers("unable to save %a in %a (access error)",dataname,luaname)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-tre.lua b/Master/texmf-dist/tex/context/base/mkiv/data-tre.lua
index c4d43e3eb20..8958dfbea9c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-tre.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-tre.lua
@@ -6,6 +6,10 @@ if not modules then modules = { } end modules ['data-tre'] = {
license = "see context related readme files"
}
+-- A tree search is rather dumb ... there is some basic caching of searched trees
+-- but nothing is cached over runs ... it's also a wildcard one so we cannot use
+-- the normal scanner.
+
-- tree://e:/temporary/mb-mp/**/drawing.jpg
-- tree://e:/temporary/mb-mp/**/Drawing.jpg
-- tree://t:./**/tufte.tex
@@ -19,8 +23,9 @@ if not modules then modules = { } end modules ['data-tre'] = {
-- dirlist://///storage-2/resources/mb-mp/**/drawing.jpg
-- dirlist://e:/**/drawing.jpg
+local type = type
local find, gsub, lower = string.find, string.gsub, string.lower
-local basename, dirname, joinname = file.basename, file.dirname, file .join
+local basename, dirname, joinname = file.basename, file.dirname, file.join
local globdir, isdir, isfile = dir.glob, lfs.isdir, lfs.isfile
local P, lpegmatch = lpeg.P, lpeg.match
@@ -28,83 +33,119 @@ local trace_locating = false trackers.register("resolvers.locating", function(v
local report_trees = logs.reporter("resolvers","trees")
-local resolvers = resolvers
-local resolveprefix = resolvers.resolve
-local notfound = resolvers.finders.notfound
-local lookup = resolvers.get_from_content
+local resolvers = resolvers
+local finders = resolvers.finders
+local openers = resolvers.openers
+local loaders = resolvers.loaders
+local locators = resolvers.locators
+local hashers = resolvers.hashers
+local generators = resolvers.generators
--- A tree search is rather dumb ... there is some basic caching of searched trees
--- but nothing is cached over runs ... it's also a wildcard one so we cannot use
--- the normal scanner.
+do
-local collectors = { }
-local found = { }
-
-function resolvers.finders.tree(specification) -- to be adapted to new formats
- local spec = specification.filename
- local okay = found[spec]
- if okay == nil then
- if spec ~= "" then
- local path = dirname(spec)
- local name = basename(spec)
- if path == "" then
- path = "."
- end
- local names = collectors[path]
- if not names then
- local pattern = find(path,"/%*+$") and path or (path .. "/*")
- names = globdir(pattern)
- collectors[path] = names
- end
- local pattern = "/" .. gsub(name,"([%.%-%+])", "%%%1") .. "$"
- for i=1,#names do
- local fullname = names[i]
- if find(fullname,pattern) then
- found[spec] = fullname
- return fullname
+ local collectors = { }
+ local found = { }
+ local notfound = finders.notfound
+
+ function finders.tree(specification) -- to be adapted to new formats
+ local spec = specification.filename
+ local okay = found[spec]
+ if okay == nil then
+ if spec ~= "" then
+ local path = dirname(spec)
+ local name = basename(spec)
+ if path == "" then
+ path = "."
end
- end
- -- let's be nice:
- local pattern = lower(pattern)
- for i=1,#names do
- local fullname = lower(names[i])
- if find(fullname,pattern) then
- if isfile(fullname) then
+ local names = collectors[path]
+ if not names then
+ local pattern = find(path,"/%*+$") and path or (path .. "/*")
+ names = globdir(pattern)
+ collectors[path] = names
+ end
+ local pattern = "/" .. gsub(name,"([%.%-%+])", "%%%1") .. "$"
+ for i=1,#names do
+ local fullname = names[i]
+ if find(fullname,pattern) then
found[spec] = fullname
return fullname
- else
- -- no os name mapping
- break
+ end
+ end
+ -- let's be nice:
+ local pattern = lower(pattern)
+ for i=1,#names do
+ local fullname = lower(names[i])
+ if find(fullname,pattern) then
+ if isfile(fullname) then
+ found[spec] = fullname
+ return fullname
+ else
+ -- no os name mapping
+ break
+ end
end
end
end
+ okay = notfound() -- false
+ found[spec] = okay
end
- okay = notfound() -- false
- found[spec] = okay
+ return okay
end
- return okay
+
end
-function resolvers.locators.tree(specification)
- local name = specification.filename
- local realname = resolveprefix(name) -- no shortcut
- if realname and realname ~= '' and isdir(realname) then
- if trace_locating then
- report_trees("locator %a found",realname)
+do
+
+ local resolveprefix = resolvers.resolve
+ local appendhash = resolvers.appendhash
+
+ local function dolocate(specification)
+ local name = specification.filename
+ local realname = resolveprefix(name) -- no shortcut
+ if realname and realname ~= '' and isdir(realname) then
+ if trace_locating then
+ report_trees("locator %a found",realname)
+ end
+ appendhash('tree',name,false) -- don't cache
+ elseif trace_locating then
+ report_trees("locator %a not found",name)
end
- resolvers.appendhash('tree',name,false) -- don't cache
- elseif trace_locating then
- report_trees("locator %a not found",name)
end
+
+ locators.tree = dolocate
+ locators.dirlist = dolocate
+ locators.dirfile = dolocate
+
end
-function resolvers.hashers.tree(specification)
- local name = specification.filename
- if trace_locating then
- report_trees("analyzing %a",name)
+
+do
+
+ local filegenerator = generators.file
+
+ generators.dirlist = filegenerator
+ generators.dirfile = filegenerator
+
+end
+
+do
+
+ local filegenerator = generators.file
+ local methodhandler = resolvers.methodhandler
+
+ local function dohash(specification)
+ local name = specification.filename
+ if trace_locating then
+ report_trees("analyzing %a",name)
+ end
+ methodhandler("hashers",name)
+ filegenerator(specification)
end
- resolvers.methodhandler("hashers",name)
- resolvers.generators.file(specification)
+
+ hashers.tree = dohash
+ hashers.dirlist = dohash
+ hashers.dirfile = dohash
+
end
-- This is a variation on tree lookups but this time we do cache in the given
@@ -112,121 +153,181 @@ end
-- for instance trees with 50K xml files plus a similar amount of resources to
-- deal and we don't want too much overhead.
-local collectors = { }
-local splitter = lpeg.splitat("/**/")
-local stripper = lpeg.replacer { [P("/") * P("*")^1 * P(-1)] = "" }
-
-table.setmetatableindex(collectors, function(t,k)
- local rootname = lpegmatch(stripper,k)
- local dataname = joinname(rootname,"dirlist")
- local content = caches.loadcontent(dataname,"files",dataname)
- if not content then
- -- path branch usecache onlyonce tolerant
- content = resolvers.scanfiles(rootname,nil,nil,false,true) -- so we accept crap
- caches.savecontent(dataname,"files",content,dataname)
- end
- t[k] = content
- return content
-end)
+local resolve do
+ local collectors = { }
+ local splitter = lpeg.splitat("/**/")
+ local stripper = lpeg.replacer { [P("/") * P("*")^1 * P(-1)] = "" }
+
+ local loadcontent = caches.loadcontent
+ local savecontent = caches.savecontent
+
+ local notfound = finders.notfound
+
+ local scanfiles = resolvers.scanfiles
+ local lookup = resolvers.get_from_content
+
+ table.setmetatableindex(collectors, function(t,k)
+ local rootname = lpegmatch(stripper,k)
+ local dataname = joinname(rootname,"dirlist")
+ local content = loadcontent(dataname,"files",dataname)
+ if not content then
+ -- path branch usecache onlyonce tolerant
+ content = scanfiles(rootname,nil,nil,false,true) -- so we accept crap
+ savecontent(dataname,"files",content,dataname)
+ end
+ t[k] = content
+ return content
+ end)
-local function checked(root,p,n)
- if p then
- if type(p) == "table" then
- for i=1,#p do
- local fullname = joinname(root,p[i],n)
+ local function checked(root,p,n)
+ if p then
+ if type(p) == "table" then
+ for i=1,#p do
+ local fullname = joinname(root,p[i],n)
+ if isfile(fullname) then -- safeguard
+ return fullname
+ end
+ end
+ else
+ local fullname = joinname(root,p,n)
if isfile(fullname) then -- safeguard
return fullname
end
end
- else
- local fullname = joinname(root,p,n)
- if isfile(fullname) then -- safeguard
- return fullname
- end
end
+ return notfound()
end
- return notfound()
-end
--- no funny characters in path but in filename permitted .. sigh
-
-local function resolve(specification) -- can be called directly too
- local filename = specification.filename
- -- inspect(specification)
- if filename ~= "" then
- local root, rest = lpegmatch(splitter,filename)
- if root and rest then
- local path, name = dirname(rest), basename(rest)
- if name ~= rest then
- local content = collectors[root]
- local p, n = lookup(content,name)
- if not p then
- return notfound()
- end
- local pattern = ".*/" .. path .. "$"
- local istable = type(p) == "table"
- if istable then
- for i=1,#p do
- local pi = p[i]
- if pi == path or find(pi,pattern) then
- local fullname = joinname(root,pi,n)
- if isfile(fullname) then -- safeguard
- return fullname
+ -- no funny characters in path but in filename permitted .. sigh
+
+ resolve = function(specification) -- can be called directly too
+ local filename = specification.filename
+ -- inspect(specification)
+ if filename ~= "" then
+ local root, rest = lpegmatch(splitter,filename)
+ if root and rest then
+ local path, name = dirname(rest), basename(rest)
+ if name ~= rest then
+ local content = collectors[root]
+ local p, n = lookup(content,name)
+ if not p then
+ return notfound()
+ end
+ local pattern = ".*/" .. path .. "$"
+ local istable = type(p) == "table"
+ if istable then
+ for i=1,#p do
+ local pi = p[i]
+ if pi == path or find(pi,pattern) then
+ local fullname = joinname(root,pi,n)
+ if isfile(fullname) then -- safeguard
+ return fullname
+ end
end
end
+ elseif p == path or find(p,pattern) then
+ local fullname = joinname(root,p,n)
+ if isfile(fullname) then -- safeguard
+ return fullname
+ end
end
- elseif p == path or find(p,pattern) then
- local fullname = joinname(root,p,n)
- if isfile(fullname) then -- safeguard
- return fullname
+ local queries = specification.queries
+ if queries and queries.option == "fileonly" then
+ return checked(root,p,n)
+ else
+ return notfound()
end
end
- local queries = specification.queries
- if queries and queries.option == "fileonly" then
- return checked(root,p,n)
- else
- return notfound()
- end
+ end
+ local path = dirname(filename)
+ local name = basename(filename)
+ local root = lpegmatch(stripper,path)
+ local content = collectors[path]
+ local p, n = lookup(content,name)
+ if p then
+ return checked(root,p,n)
end
end
- local path, name = dirname(filename), basename(filename)
- local root = lpegmatch(stripper,path)
- local content = collectors[path]
- local p, n = lookup(content,name)
- if p then
- return checked(root,p,n)
- end
+ return notfound()
end
- return notfound()
-end
-resolvers.finders .dirlist = resolve
-resolvers.locators .dirlist = resolvers.locators .tree
-resolvers.hashers .dirlist = resolvers.hashers .tree
-resolvers.generators.dirlist = resolvers.generators.file
-resolvers.openers .dirlist = resolvers.openers .file
-resolvers.loaders .dirlist = resolvers.loaders .file
-
-function resolvers.finders.dirfile(specification)
- local queries = specification.queries
- if queries then
- queries.option = "fileonly"
- else
- specification.queries = { option = "fileonly" }
+ finders.dirlist = resolve
+
+ function finders.dirfile(specification)
+ local queries = specification.queries
+ if queries then
+ queries.option = "fileonly"
+ else
+ specification.queries = { option = "fileonly" }
+ end
+ return resolve(specification)
end
- return resolve(specification)
+
end
-resolvers.locators .dirfile = resolvers.locators .dirlist
-resolvers.hashers .dirfile = resolvers.hashers .dirlist
-resolvers.generators.dirfile = resolvers.generators.dirlist
-resolvers.openers .dirfile = resolvers.openers .dirlist
-resolvers.loaders .dirfile = resolvers.loaders .dirlist
+do
+
+ local fileopener = openers.file
+ local fileloader = loaders.file
+
+ openers.dirlist = fileopener
+ loaders.dirlist = fileloader
--- local locate = collectors[ [[E:\temporary\mb-mp]] ]
--- local locate = collectors( [[\\storage-2\resources\mb-mp]] )
+ openers.dirfile = fileopener
+ loaders.dirfile = fileloader
+
+end
-- print(resolvers.findtexfile("tree://e:/temporary/mb-mp/**/VB_wmf_03_vw_01d_ant.jpg"))
-- print(resolvers.findtexfile("tree://t:/**/tufte.tex"))
-- print(resolvers.findtexfile("dirlist://e:/temporary/mb-mp/**/VB_wmf_03_vw_01d_ant.jpg"))
+
+
+do
+
+ local hashfile = "dirhash.lua"
+ local kind = "HASH256"
+ local version = 1.0
+
+ local loadtable = table.load
+ local savetable = table.save
+ local loaddata = io.loaddata
+
+ function resolvers.dirstatus(patterns)
+ local t = type(patterns)
+ if t == "string" then
+ patterns = { patterns }
+ elseif t ~= "table" then
+ return false
+ end
+ local status = loadtable(hashfile)
+ if not status or status.version ~= version or status.kind ~= kind then
+ status = {
+ version = 1.0,
+ kind = kind,
+ hashes = { },
+ }
+ end
+ local hashes = status.hashes
+ local changed = { }
+ local action = sha2[kind]
+ local update = { }
+ for i=1,#patterns do
+ local pattern = patterns[i]
+ local files = globdir(pattern)
+ for i=1,#files do
+ local name = files[i]
+ local hash = action(loaddata(name))
+ if hashes[name] ~= hash then
+ changed[#changed+1] = name
+ end
+ update[name] = hash
+ end
+ end
+ status.hashes = update
+ savetable(hashfile,status)
+ return #changed > 0 and changed or false
+ end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-use.lua b/Master/texmf-dist/tex/context/base/mkiv/data-use.lua
index 5985a2eac24..7df416b65c9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-use.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-use.lua
@@ -6,48 +6,60 @@ if not modules then modules = { } end modules ['data-use'] = {
license = "see context related readme files"
}
-local format, lower, gsub, find = string.format, string.lower, string.gsub, string.find
+local format = string.format
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
local report_mounts = logs.reporter("resolvers","mounts")
local resolvers = resolvers
+local findfile = resolvers.findfile
--- we will make a better format, maybe something xml or just text or lua
-
-resolvers.automounted = resolvers.automounted or { }
-
-function resolvers.automount(usecache)
- local mountpaths = resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
- if (not mountpaths or #mountpaths == 0) and usecache then
- mountpaths = caches.getreadablepaths("mount")
- end
- if mountpaths and #mountpaths > 0 then
- resolvers.starttiming()
- for k=1,#mountpaths do
- local root = mountpaths[k]
- local f = io.open(root.."/url.tmi")
- if f then
- for line in f:lines() do
- if line then
- if find(line,"^[%%#%-]") then -- or %W
- -- skip
- elseif find(line,"^zip://") then
- if trace_locating then
- report_mounts("mounting %a",line)
- end
- table.insert(resolvers.automounted,line)
- resolvers.usezipfile(line)
- end
- end
- end
- f:close()
- end
- end
- resolvers.stoptiming()
- end
-end
+-- -- This should mount a zip file so that we can run from zip files but I never went
+-- -- on with it. It's really old code, from right when we started with luatex and
+-- -- mkiv. Nowadays I'd use a lua specification file instead of a line based url.tmi,
+-- -- file so just to be modern I patched it but it's untested. This is a normally a
+-- -- startup-only feature.
+--
+-- do
+--
+-- local mounted = { }
+--
+-- function resolvers.automount(usecache)
+-- local mountpaths = resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
+-- if (not mountpaths or #mountpaths == 0) and usecache then
+-- mountpaths = caches.getreadablepaths("mount")
+-- end
+-- if mountpaths and #mountpaths > 0 then
+-- resolvers.starttiming()
+-- for k=1,#mountpaths do
+-- local root = mountpaths[k]
+-- local list = table.load("automount.lua")
+-- if list then
+-- local archives = list.archives
+-- if archives then
+-- for i=1,#archives do
+-- local archive = archives[i]
+-- local already = false
+-- for i=1,#mounted do
+-- if archive == mounted[i] then
+-- already = true
+-- break
+-- end
+-- end
+-- if not already then
+-- mounted[#mounted+1] = archive
+-- resolvers.usezipfile(archive)
+-- end
+-- end
+-- end
+-- end
+-- end
+-- resolvers.stoptiming()
+-- end
+-- end
+--
+-- end
-- status info
@@ -61,11 +73,13 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner) -
if formatbanner and enginebanner and sourcefile then
local luvname = file.replacesuffix(texname,"luv") -- utilities.lua.suffixes.luv
local luvdata = {
- enginebanner = enginebanner,
- formatbanner = formatbanner,
- sourcehash = md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"),
- sourcefile = sourcefile,
- luaversion = LUAVERSION,
+ enginebanner = enginebanner,
+ formatbanner = formatbanner,
+ sourcehash = md5.hex(io.loaddata(findfile(sourcefile)) or "unknown"),
+ sourcefile = sourcefile,
+ luaversion = LUAVERSION,
+ formatid = LUATEXFORMATID,
+ functionality = LUATEXFUNCTIONALITY,
}
io.savedata(luvname,table.serialize(luvdata,true))
lua.registerfinalizer(function()
@@ -90,7 +104,7 @@ function statistics.checkfmtstatus(texname)
if lfs.isfile(luvname) then
local luv = dofile(luvname)
if luv and luv.sourcefile then
- local sourcehash = md5.hex(io.loaddata(resolvers.findfile(luv.sourcefile)) or "unknown")
+ local sourcehash = md5.hex(io.loaddata(findfile(luv.sourcefile)) or "unknown")
local luvbanner = luv.enginebanner or "?"
if luvbanner ~= enginebanner then
return format("engine mismatch (luv: %s <> bin: %s)",luvbanner,enginebanner)
@@ -100,8 +114,19 @@ function statistics.checkfmtstatus(texname)
return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash)
end
local luvluaversion = luv.luaversion or 0
- if luvluaversion ~= LUAVERSION then
- return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION)
+ local engluaversion = LUAVERSION or 0
+ if luvluaversion ~= engluaversion then
+ return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,engluaversion)
+ end
+ local luvfunctionality = luv.functionality or 0
+ local engfunctionality = status.development_id or 0
+ if luvfunctionality ~= engfunctionality then
+ return format("functionality mismatch (luv: %s <> bin: %s)",luvfunctionality,engfunctionality)
+ end
+ local luvformatid = luv.formatid or 0
+ local engformatid = status.format_id or 0
+ if luvformatid ~= engformatid then
+ return format("formatid mismatch (luv: %s <> bin: %s)",luvformatid,engformatid)
end
else
return "invalid status file"
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-vir.lua b/Master/texmf-dist/tex/context/base/mkiv/data-vir.lua
index 7e25c822d07..4b19ee53720 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-vir.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-vir.lua
@@ -6,7 +6,8 @@ if not modules then modules = { } end modules ['data-vir'] = {
license = "see context related readme files"
}
-local formatters, validstrings = string.formatters, string.valid
+local type = type
+local formatters = string.formatters
local trace_virtual = false
local report_virtual = logs.reporter("resolvers","virtual")
@@ -15,17 +16,20 @@ trackers.register("resolvers.locating", function(v) trace_virtual = v end)
trackers.register("resolvers.virtual", function(v) trace_virtual = v end)
local resolvers = resolvers
+local savers = resolvers.savers
-local finders, openers, loaders, savers = resolvers.finders, resolvers.openers, resolvers.loaders, resolvers.savers
+local data = { }
+local n = 0 -- hm, number can be query
+local f_virtual_n = formatters["virtual://%s.%s"]
+local f_virtual_y = formatters["virtual://%s-%s.%s"]
-local data = { }
-local n = 0 -- hm, number can be query
-local f_virtual = formatters["virtual://%s.%s"]
-
-function savers.virtual(specification,content)
+function savers.virtual(specification,content,suffix)
n = n + 1 -- one number for all namespaces
- local path = specification.path
- local filename = f_virtual(path ~= "" and path or "virtualfile",n)
+ local path = type(specification) == "table" and specification.path or specification
+ if type(path) ~= "string" or path == "" then
+ path = "virtualfile"
+ end
+ local filename = suffix and f_virtual_y(path,n,suffix) or f_virtual_n(path,n)
if trace_virtual then
report_virtual("saver: file %a saved",filename)
end
@@ -33,6 +37,9 @@ function savers.virtual(specification,content)
return filename
end
+local finders = resolvers.finders
+local notfound = finders.notfound
+
function finders.virtual(specification)
local original = specification.original
local d = data[original]
@@ -45,10 +52,14 @@ function finders.virtual(specification)
if trace_virtual then
report_virtual("finder: unknown file %a",original)
end
- return finders.notfound()
+ return notfound()
end
end
+local openers = resolvers.openers
+local notfound = openers.notfound
+local textopener = openers.helpers.textopener
+
function openers.virtual(specification)
local original = specification.original
local d = data[original]
@@ -59,15 +70,18 @@ function openers.virtual(specification)
data[original] = nil -- when we comment this we can have error messages
-- With utf-8 we signal that no regime is to be applied!
-- characters.showstring(d)
- return openers.helpers.textopener("virtual",original,d,"utf-8")
+ return textopener("virtual",original,d,"utf-8")
else
if trace_virtual then
report_virtual("opener: file %a not found",original)
end
- return openers.notfound()
+ return notfound()
end
end
+local loaders = resolvers.loaders
+local notfound = loaders.notfound
+
function loaders.virtual(specification)
local original = specification.original
local d = data[original]
@@ -81,5 +95,5 @@ function loaders.virtual(specification)
if trace_virtual then
report_virtual("loader: file %a not loaded",original)
end
- return loaders.notfound()
+ return notfound()
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/data-zip.lua b/Master/texmf-dist/tex/context/base/mkiv/data-zip.lua
index 388ae0c1053..8d914b842de 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/data-zip.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/data-zip.lua
@@ -26,7 +26,16 @@ zip:///texmf-mine.zip?tree=/tex/texmf-projects
</typing>
--ldx]]--
-local resolvers = resolvers
+local resolvers = resolvers
+local findfile = resolvers.findfile
+local registerfile = resolvers.registerfile
+local splitmethod = resolvers.splitmethod
+local prependhash = resolvers.prependhash
+local starttiming = resolvers.starttiming
+local extendtexmf = resolvers.extendtexmfvariable
+local stoptiming = resolvers.stoptiming
+
+local urlquery = url.query
zip = zip or { }
local zip = zip
@@ -50,8 +59,10 @@ if zipfiles then
validfile = zipfiles.found
wholefile = zipfiles.unzip
+ local listzip = zipfiles.list
+
traversezip = function(zfile)
- return ipairs(zipfiles.list(zfile))
+ return ipairs(listzip(zfile))
end
local streams = utilities.streams
@@ -120,13 +131,13 @@ local function validzip(str) -- todo: use url splitter
end
end
-function zip.openarchive(name)
+local function openarchive(name)
if not name or name == "" then
return nil
else
local arch = archives[name]
if not arch then
- local full = resolvers.findfile(name) or ""
+ local full = findfile(name) or ""
arch = full ~= "" and openzip(full) or false
archives[name] = arch
end
@@ -134,16 +145,19 @@ function zip.openarchive(name)
end
end
-function zip.closearchive(name)
+local function closearchive(name)
if not name or (name == "" and archives[name]) then
closezip(archives[name])
archives[name] = nil
end
end
+zip.openarchive = openarchive
+zip.closearchive = closearchive
+
function resolvers.locators.zip(specification)
local archive = specification.filename
- local zipfile = archive and archive ~= "" and zip.openarchive(archive) -- tricky, could be in to be initialized tree
+ local zipfile = archive and archive ~= "" and openarchive(archive) -- tricky, could be in to be initialized tree
if trace_locating then
if zipfile then
report_zip("locator: archive %a found",archive)
@@ -153,14 +167,6 @@ function resolvers.locators.zip(specification)
end
end
-function resolvers.hashers.zip(specification)
- local archive = specification.filename
- if trace_locating then
- report_zip("loading file %a",archive)
- end
- resolvers.usezipfile(specification.original)
-end
-
function resolvers.concatinators.zip(zipfile,path,name) -- ok ?
if not path or path == "" then
return format('%s?name=%s',zipfile,name)
@@ -169,14 +175,17 @@ function resolvers.concatinators.zip(zipfile,path,name) -- ok ?
end
end
-function resolvers.finders.zip(specification)
+local finders = resolvers.finders
+local notfound = finders.notfound
+
+function finders.zip(specification)
local original = specification.original
- local archive = specification.filename
+ local archive = specification.filename
if archive then
- local query = url.query(specification.query)
+ local query = urlquery(specification.query)
local queryname = query.name
if queryname then
- local zfile = zip.openarchive(archive)
+ local zfile = openarchive(archive)
if zfile then
if trace_locating then
report_zip("finder: archive %a found",archive)
@@ -197,17 +206,21 @@ function resolvers.finders.zip(specification)
if trace_locating then
report_zip("finder: %a not found",original)
end
- return resolvers.finders.notfound()
+ return notfound()
end
-function resolvers.openers.zip(specification)
+local openers = resolvers.openers
+local notfound = openers.notfound
+local textopener = openers.helpers.textopener
+
+function openers.zip(specification)
local original = specification.original
- local archive = specification.filename
+ local archive = specification.filename
if archive then
- local query = url.query(specification.query)
+ local query = urlquery(specification.query)
local queryname = query.name
if queryname then
- local zfile = zip.openarchive(archive)
+ local zfile = openarchive(archive)
if zfile then
if trace_locating then
report_zip("opener; archive %a opened",archive)
@@ -217,7 +230,7 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: file %a found",queryname)
end
- return resolvers.openers.helpers.textopener('zip',original,handle)
+ return textopener('zip',original,handle)
elseif trace_locating then
report_zip("opener: file %a not found",queryname)
end
@@ -229,24 +242,26 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener: %a not found",original)
end
- return resolvers.openers.notfound()
+ return notfound()
end
-function resolvers.loaders.zip(specification)
+local loaders = resolvers.loaders
+local notfound = loaders.notfound
+
+function loaders.zip(specification)
local original = specification.original
- local archive = specification.filename
+ local archive = specification.filename
if archive then
- local query = url.query(specification.query)
+ local query = urlquery(specification.query)
local queryname = query.name
if queryname then
- local zfile = zip.openarchive(archive)
+ local zfile = openarchive(archive)
if zfile then
if trace_locating then
report_zip("loader: archive %a opened",archive)
end
local data = wholefile(zfile,queryname)
if data then
- logs.show_load(original)
if trace_locating then
report_zip("loader; file %a loaded",original)
end
@@ -262,52 +277,28 @@ function resolvers.loaders.zip(specification)
if trace_locating then
report_zip("loader: %a not found",original)
end
- return resolvers.openers.notfound()
+ return notfound()
end
-- zip:///somefile.zip
-- zip:///somefile.zip?tree=texmf-local -> mount
-function resolvers.usezipfile(archive)
- local specification = resolvers.splitmethod(archive) -- to be sure
- local archive = specification.filename
- if archive and not registeredfiles[archive] then
- local z = zip.openarchive(archive)
- if z then
- local tree = url.query(specification.query).tree or ""
- if trace_locating then
- report_zip("registering: archive %a",archive)
- end
- resolvers.starttiming()
- resolvers.prependhash('zip',archive)
- resolvers.extendtexmfvariable(archive) -- resets hashes too
- registeredfiles[archive] = z
- resolvers.registerfilehash(archive,resolvers.registerzipfile(z,tree))
- resolvers.stoptiming()
- elseif trace_locating then
- report_zip("registering: unknown archive %a",archive)
- end
- elseif trace_locating then
- report_zip("registering: archive %a not found",archive)
- end
-end
-
-function resolvers.registerzipfile(z,tree)
+local function registerzipfile(z,tree)
local names = { }
local files = { } -- somewhat overkill .. todo
local remap = { } -- somewhat overkill .. todo
local n = 0
local filter = tree == "" and "^(.+)/(.-)$" or format("^%s/(.+)/(.-)$",tree)
- local register = resolvers.registerfile
if trace_locating then
report_zip("registering: using filter %a",filter)
end
+ starttiming()
for i in traversezip(z) do
local filename = i.filename
local path, name = match(filename,filter)
if not path then
n = n + 1
- register(names,filename,"")
+ registerfile(names,filename,"")
local usedname = lower(filename)
files[usedname] = ""
if usedname ~= filename then
@@ -325,6 +316,7 @@ function resolvers.registerzipfile(z,tree)
-- directory
end
end
+ stoptiming()
report_zip("registering: %s files registered",n)
return {
-- metadata = { },
@@ -332,3 +324,36 @@ function resolvers.registerzipfile(z,tree)
remap = remap,
}
end
+
+local function usezipfile(archive)
+ local specification = splitmethod(archive) -- to be sure
+ local archive = specification.filename
+ if archive and not registeredfiles[archive] then
+ local z = openarchive(archive)
+ if z then
+ local tree = urlquery(specification.query).tree or ""
+ if trace_locating then
+ report_zip("registering: archive %a",archive)
+ end
+ prependhash('zip',archive)
+ extendtexmf(archive) -- resets hashes too
+ registeredfiles[archive] = z
+ registerfilehash(archive,registerzipfile(z,tree))
+ elseif trace_locating then
+ report_zip("registering: unknown archive %a",archive)
+ end
+ elseif trace_locating then
+ report_zip("registering: archive %a not found",archive)
+ end
+end
+
+resolvers.usezipfile = usezipfile
+resolvers.registerzipfile = registerzipfile
+
+function resolvers.hashers.zip(specification)
+ local archive = specification.filename
+ if trace_locating then
+ report_zip("loading file %a",archive)
+ end
+ usezipfile(specification.original)
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/driv-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/driv-ini.lua
index e16327f27d7..316613b2167 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/driv-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/driv-ini.lua
@@ -19,19 +19,33 @@ local report = logs.reporter("drivers")
local instances = { }
local helpers = { }
+local converters = { }
local prepared = { }
local wrappedup = { }
+local cleanedup = { }
local currentdriver = "default"
+local currentinstance = nil
+
+local shipout = tex.shipout
+local texgetbox = tex.getbox
+local texgetcount = tex.getcount
+
+function converters.engine(driver,boxnumber,mode,number,specification)
+ return shipout(boxnumber)
+end
local prepare = nil
local convert = nil
local wrapup = nil
+local cleanup = nil
local outputfilename = nil
drivers = drivers or {
instances = instances,
helpers = helpers,
+ converters = converters,
lmtxversion = 0.10,
+ report = report,
}
local dummy = function() end
@@ -42,6 +56,7 @@ local defaulthandlers = {
finalize = dummy,
updatefontstate = dummy,
wrapup = dummy,
+ cleanup = dummy,
convert = dummy,
outputfilename = dummy,
}
@@ -62,45 +77,74 @@ function drivers.install(specification)
report("no flushers for driver %a",name)
return
end
- setmetatableindex(actions,defaulthandlers)
+ -- report("driver %a is installed",name)
+ setmetatableindex(actions, defaulthandlers)
+ setmetatableindex(flushers, function() return dummy end)
instances[name] = specification
end
function drivers.convert(boxnumber)
- callbacks.functions.start_page_number()
- starttiming(drivers)
- convert(boxnumber)
- stoptiming(drivers)
- callbacks.functions.stop_page_number()
+ if currentinstance then
+ callbacks.functions.start_page_number()
+ starttiming(drivers)
+ convert(currentinstance,boxnumber,texgetcount("realpageno"))
+ stoptiming(drivers)
+ callbacks.functions.stop_page_number()
+ end
end
function drivers.outputfilename()
- return outputfilename()
+ if currentinstance then
+ return outputfilename(currentinstance)
+ end
end
-
luatex.wrapup(function()
- if not wrappedup[currentdriver] then
+ if currentinstance and wrapup and not wrappedup[currentdriver] then
starttiming(drivers)
- wrapup()
+ wrapup(currentinstance)
stoptiming(drivers)
wrappedup[currentdriver] = true
+ cleanedup[currentdriver] = true
end
end)
-function drivers.enable(name)
- currentdriver = name or "default"
- local actions = instances[currentdriver].actions
- prepare = actions.prepare
- wrapup = actions.wrapup
- convert = actions.convert
- outputfilename = actions.outputfilename
- --
- if prepare and not prepared[currentdriver] then
+luatex.cleanup(function()
+ if currentinstance and cleanup and not cleanedup[currentdriver] then
starttiming(drivers)
- prepare()
+ cleanup(currentinstance)
stoptiming(drivers)
- prepared[currentdriver] = true
+ wrappedup[currentdriver] = true
+ cleanedup[currentdriver] = true
+ end
+end)
+
+function drivers.enable(name)
+ if name ~= currentdriver then
+ if currentinstance then
+ starttiming(drivers)
+ cleanup(currentinstance)
+ stoptiming(drivers)
+ end
+ currentdriver = name or "default"
+ currentinstance = instances[currentdriver]
+ if currentinstance then
+ local actions = currentinstance.actions
+ prepare = actions.prepare
+ wrapup = actions.wrapup
+ cleanup = actions.cleanup
+ convert = actions.convert
+ outputfilename = actions.outputfilename
+ --
+ if prepare and not prepared[currentdriver] then
+ starttiming(drivers)
+ prepare(currentinstance)
+ stoptiming(drivers)
+ prepared[currentdriver] = true
+ end
+ else
+ report("bad driver")
+ end
end
end
@@ -129,8 +173,8 @@ do
drivers.install {
name = "default",
actions = {
- convert = tex.shipout,
- outputfilename = function()
+ convert = drivers.converters.engine,
+ outputfilename = function(driver)
if not filename then
filename = addsuffix(tex.jobname,"pdf")
end
@@ -144,6 +188,41 @@ do
end
+-- No driver:
+
+do
+
+ drivers.install {
+ name = "none",
+ actions = { },
+ flushers = { },
+ }
+
+end
+
+do
+
+ local function prepare(driver)
+ converter = drivers.converters.lmtx
+ end
+
+ local function convert(driver,boxnumber,pagenumber)
+ converter(driver,texgetbox(boxnumber),"page",pagenumber)
+ end
+
+ drivers.install {
+ name = "empty",
+ actions = {
+ prepare = prepare,
+ convert = convert,
+ },
+ flushers = { },
+ }
+
+end
+
+--
+
setmetatableindex(instances,function() return instances.default end)
-- for now:
@@ -153,13 +232,8 @@ drivers.enable("default")
-- helpers
local s_matrix_0 = "1 0 0 1"
-local f_matrix_2 = formatters["%.6F 0 0 %.6F"]
-local f_matrix_4 = formatters["%.6F %.6F %.6F %.6F"]
-
-directives.register("pdf.stripzeros",function()
- f_matrix_2 = formatters["%.6N 0 0 %.6N"]
- f_matrix_4 = formatters["%.6N %.6N %.6N %.6N"]
-end)
+local f_matrix_2 = formatters["%.6N 0 0 %.6N"]
+local f_matrix_4 = formatters["%.6N %.6N %.6N %.6N"]
function helpers.tomatrix(rx,sx,sy,ry,tx,ty) -- todo: tx ty
if type(rx) == "string" then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/driv-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/driv-ini.mkiv
index 95b6c88a7b4..96e7460a3c1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/driv-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/driv-ini.mkiv
@@ -13,13 +13,18 @@
\writestatus{loading}{ConTeXt Driver Macros / Initialization}
+%D Around the \CONTEXT\ 2018 meeting I had a preliminary backend written in \LUA\ as
+%D alternative for the hard coded variant (we're talking of the font embedding and
+%D page stream output, the part we still used). Therefore there is a pluggable
+%D output driver. But \unknown\ I decided not to waste time on supporting both
+%D \LUATEX\ and the new kid \LUAMETATEX, also because in practice \LUATEX\ would be
+%D used as benchmark, using the more traditional approach. So, the code in the
+%D driver modules is mostly a kind of simple placeholder now and although I could
+%D simplify it ther eis no real reason for it. It is no problem to getit all working
+%D well in normal \LUATEX, it's just that we don't need it there.
+
\registerctxluafile{driv-ini}{}
\unprotect
-\def\page_shipout_box#1%
- {\clf_shipoutpage#1\relax
- \setbox#1\emptybox
- \global\deadcycles\zerocount}
-
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/driv-ini.mkxl b/Master/texmf-dist/tex/context/base/mkiv/driv-ini.mkxl
new file mode 100644
index 00000000000..9f489a2a1a6
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/driv-ini.mkxl
@@ -0,0 +1,20 @@
+%D \module
+%D [ file=driv-ini,
+%D version=2018.07.26,
+%D title=\CONTEXT\ Driver Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Driver Macros / Initialization}
+
+\registerctxluafile{driv-ini}{}
+
+\unprotect
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/driv-shp.lua b/Master/texmf-dist/tex/context/base/mkiv/driv-shp.lua
new file mode 100644
index 00000000000..a4e36105d09
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/driv-shp.lua
@@ -0,0 +1,1328 @@
+if not modules then modules = { } end modules ['driv-shp'] = {
+ version = 1.001,
+ comment = "companion to driv-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local type, next = type, next
+local round = math.round
+
+local setmetatableindex = table.setmetatableindex
+local formatters = string.formatters
+local concat = table.concat
+local keys = table.keys
+local sortedhash = table.sortedhash
+local splitstring = string.split
+local idiv = number.idiv
+local extract = bit32.extract
+local nuts = nodes.nuts
+
+local tonut = nodes.tonut
+local tonode = nodes.tonode
+
+local getdirection = nuts.getdirection
+local getlist = nuts.getlist
+local getoffsets = nuts.getoffsets
+local getorientation = nuts.getorientation
+local getfield = nuts.getfield
+local getwhd = nuts.getwhd
+local getkern = nuts.getkern
+local getheight = nuts.getheight
+local getdepth = nuts.getdepth
+----- getwidth = nuts.getwidth
+local getnext = nuts.getnext
+local getsubtype = nuts.getsubtype
+local getid = nuts.getid
+local getleader = nuts.getleader
+----- getglue = nuts.getglue
+local getshift = nuts.getshift
+local getdata = nuts.getdata
+----- getexpansion = nuts.getexpansion
+local getreplace = nuts.getreplace
+local setreplace = nuts.setreplace
+local getfont = nuts.getfont
+
+local setdirection = nuts.setdirection
+local setfield = nuts.setfield
+local setlink = nuts.setlink
+
+local isglyph = nuts.isglyph
+local findtail = nuts.tail
+local nextdir = nuts.traversers.dir
+local nextnode = nuts.traversers.node
+
+local rangedimensions = node.direct.rangedimensions -- nuts ?
+local effectiveglue = nuts.effective_glue
+local start_of_par = nuts.start_of_par
+local dirdimensions = nuts.dirdimensions
+
+local texget = tex.get
+
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
+local characters = fonthashes.characters
+local parameters = fonthashes.parameters
+
+local nodecodes = nodes.nodecodes
+local whatsitcodes = nodes.whatsitcodes
+local leadercodes = nodes.leadercodes
+local gluecodes = nodes.gluecodes
+local dircodes = nodes.dircodes
+local dirvalues = nodes.dirvalues
+local subtypes = nodes.subtypes
+
+local normaldir_code <const> = dircodes.normal
+
+local lefttoright_code <const> = dirvalues.lefttoright
+local righttoleft_code <const> = dirvalues.righttoleft
+
+local glyph_code <const> = nodecodes.glyph
+local kern_code <const> = nodecodes.kern
+local glue_code <const> = nodecodes.glue
+local hlist_code <const> = nodecodes.hlist
+local vlist_code <const> = nodecodes.vlist
+local dir_code <const> = nodecodes.dir
+local disc_code <const> = nodecodes.disc
+local math_code <const> = nodecodes.math
+local rule_code <const> = nodecodes.rule
+local marginkern_code <const> = nodecodes.marginkern
+local whatsit_code <const> = nodecodes.whatsit
+----- penalty_code <const> = nodecodes.penalty
+----- boundary_code <const> = nodecodes.boundary
+
+local leaders_code <const> = leadercodes.leaders
+local cleaders_code <const> = leadercodes.cleaders
+local xleaders_code <const> = leadercodes.xleaders
+local gleaders_code <const> = leadercodes.gleaders
+
+local spaceskip_code <const> = gluecodes.spaceskip
+
+local saveposwhatsit_code <const> = whatsitcodes.savepos
+local userdefinedwhatsit_code <const> = whatsitcodes.userdefined
+local openwhatsit_code <const> = whatsitcodes.open
+local writewhatsit_code <const> = whatsitcodes.write
+local closewhatsit_code <const> = whatsitcodes.close
+local lateluawhatsit_code <const> = whatsitcodes.latelua
+local literalwhatsit_code <const> = whatsitcodes.literal
+local setmatrixwhatsit_code <const> = whatsitcodes.setmatrix
+local savewhatsit_code <const> = whatsitcodes.save
+local restorewhatsit_code <const> = whatsitcodes.restore
+
+local getpagedimensions getpagedimensions = function()
+ getpagedimensions = backends.codeinjections.getpagedimensions
+ return getpagedimensions()
+end
+
+local drivers = drivers
+local instances = drivers.instances
+
+local report = logs.reporter("drivers")
+
+---------------------------------------------------------------------------------------
+
+local lastfont = nil
+local fontcharacters = nil
+
+local magicconstants = tex.magicconstants
+local trueinch = magicconstants.trueinch
+local maxdimen = magicconstants.maxdimen
+local running = magicconstants.running
+
+local pos_h = 0
+local pos_v = 0
+local pos_r = lefttoright_code
+local shippingmode = "none"
+
+local abs_max_v = 0
+local abs_max_h = 0
+
+local shipbox_h = 0
+local shipbox_v = 0
+local page_size_h = 0
+local page_size_v = 0
+----- page_h_origin = 0 -- trueinch
+----- page_v_origin = 0 -- trueinch
+
+local initialize
+local finalize
+local updatefontstate
+local pushorientation
+local poporientation
+local flushcharacter
+local flushfontchar
+local flushrule
+local flushliteral
+local flushsetmatrix
+local flushsave
+local flushrestore
+local flushspecial
+----- flushimage
+
+-- make local
+
+function drivers.getpos () return round(pos_h), round(pos_v) end
+function drivers.getrpos() return round(pos_h), round(pos_v), pos_r end
+function drivers.gethpos() return round(pos_h) end
+function drivers.getvpos() return round(pos_v) end
+
+-- characters
+
+local flush_character
+
+local stack = setmetatableindex("table")
+local level = 0
+local nesting = 0
+local main = 0
+
+-- experiment (smaller page stream but might be fragile)
+
+local tospace = false directives.register("backends.spaces", function(v) tospace = v end)
+
+-- todo: cache streams
+
+local function flush_vf_packet(pos_h,pos_v,pos_r,font,char,data,factor,vfcommands)
+
+ if nesting > 100 then
+ return
+ elseif nesting == 0 then
+ main = font
+ end
+
+ nesting = nesting + 1
+
+ local saved_h = pos_h
+ local saved_v = pos_v
+ local saved_r = pos_r
+ pos_r = lefttoright_code
+
+ local data = fontdata[font]
+ local fnt = font
+ local fonts = data.fonts
+ local siz = (data.parameters.factor or 1)/65536
+
+ local function flushchar(font,char,fnt,chr,f,e)
+ if fnt then
+ local nest = char ~= chr or font ~= fnt
+ if fnt == 0 then
+ fnt = main
+ end
+ return flush_character(false,fnt,chr,factor,nest,pos_h,pos_v,pos_r,f,e)
+ else
+ return 0
+ end
+ end
+
+ -- we assume resolved fonts: id mandate but maybe also size
+
+ for i=1,#vfcommands do
+ local packet = vfcommands[i]
+ local command = packet[1]
+ if command == "char" then
+ local chr = packet[2]
+ local f = packet[3]
+ local e = packet[4]
+ pos_h = pos_h + flushchar(font,char,fnt,chr,f,e)
+ elseif command == "slot" then
+ local index = packet[2]
+ local chr = packet[3]
+ local f = packet[4]
+ local e = packet[5]
+ if index == 0 then
+ pos_h = pos_h + flushchar(font,char,font,chr,f,e)
+ else
+ local okay = fonts and fonts[index]
+ if okay then
+ local fnt = okay.id
+ if fnt then
+ pos_h = pos_h + flushchar(font,char,fnt,chr,f,e)
+ end
+ else
+ -- safeguard, we assume the font itself (often index 1)
+ pos_h = pos_h + flushchar(font,char,font,chr,f,e)
+ end
+ end
+ elseif command == "use" then
+ local index = packet[2]
+ if index then
+ local fnt
+ if index == 0 then
+ fnt = font
+ else
+ local okay = fonts and fonts[index]
+ if okay then
+ fnt = okay.id
+ end
+ end
+ if fnt then
+ -- not efficient but ok for now as experiment
+ local d = characters[fnt]
+ if d then
+ for i=3,#packet do
+ local chr = packet[i]
+ local dat = d[chr]
+ if dat then
+ flushfontchar(fnt,chr,dat)
+ end
+ end
+ end
+ end
+ end
+ elseif command == "right" then
+ local h = packet[2] -- * siz
+ if factor ~= 0 and h ~= 0 then
+ h = h + h * factor / 1000 -- expansion
+ end
+ pos_h = pos_h + h
+ elseif command == "down" then
+ local v = packet[2] -- * siz
+ pos_v = pos_v - v
+ elseif command == "push" then
+ level = level + 1
+ local s = stack[level]
+ s[1] = pos_h
+ s[2] = pos_v
+ elseif command == "pop" then
+ if level > 0 then
+ local s = stack[level]
+ pos_h = s[1]
+ pos_v = s[2]
+ level = level - 1
+ end
+ elseif command == "pdf" then
+ flushliteral(false,pos_h,pos_v,packet[2],packet[3])
+ elseif command == "rule" then
+ local size_v = packet[2]
+ local size_h = packet[3]
+ if factor ~= 0 and size_h > 0 then
+ size_h = size_h + size_h * factor / 1000
+ end
+ if size_h > 0 and size_v > 0 then
+ flushsimplerule(pos_h,pos_v,pos_r,size_h,size_v)
+ pos_h = pos_h + size_h
+ end
+ elseif command == "font" then
+ local index = packet[2]
+ local okay = fonts and fonts[index]
+ if okay then
+ fnt = okay.id or fnt -- or maybe just return
+ end
+ elseif command == "lua" then
+ local code = packet[2]
+ if type(code) ~= "function" then
+ code = loadstring(code)
+ end
+ if type(code) == "function" then
+ code(font,char,pos_h,pos_v)
+ end
+ elseif command == "node" then
+ hlist_out(packet[2])
+ elseif command == "image" then
+ -- doesn't work because intercepted by engine so we use a different
+ -- mechanism (for now)
+ local image = packet[2]
+ -- to do
+ elseif command == "pdfmode" then
+ -- doesn't happen
+ -- elseif command == "special" then
+ -- -- not supported
+ -- elseif command == "nop" then
+ -- -- nothing to do|
+ -- elseif command == "scale" then
+ -- -- not supported
+ end
+ end
+
+ pos_h = saved_h
+ pos_v = saved_v
+ pos_r = saved_r
+
+ nesting = nesting - 1
+end
+
+local onetimemessage -- could be defined later (todo: make plug for this)
+
+flush_character = function(current,font,char,factor,vfcommands,pos_h,pos_v,pos_r,f,e)
+
+ if font ~= lastfont then
+ lastfont = font
+ fontcharacters = characters[font]
+ updatefontstate(font)
+ end
+
+ local data = fontcharacters[char]
+ if not data then
+ if char > 0 then
+ if not onetimemessage then
+ onetimemessage = fonts.loggers.onetimemessage
+ end
+ onetimemessage(font,char,"missing")
+ end
+ return 0, 0, 0
+ end
+
+ local width, height, depth, naturalwidth
+ if current then
+ naturalwidth, height, depth, factor = getwhd(current,true)
+ if factor == 0 then
+ width = naturalwidth
+ else
+ -- width = (1.0 + factor/1000000.0) * naturalwidth
+ width = naturalwidth + naturalwidth * factor/1000000.0
+ -- width = naturalwidth + naturalwidth * 0.000001 * factor
+ end
+ else
+ width = data.width or 0
+ height = data.height or 0
+ depth = data.depth or 0
+ naturalwidth = width
+ if not factor then
+ factor = 0
+ end
+ end
+
+ if pos_r == righttoleft_code then
+ pos_h = pos_h - width
+ end
+ if vfcommands then
+ vfcommands = data.commands
+ end
+ if vfcommands then
+ flush_vf_packet(pos_h,pos_v,pos_r,font,char,data,factor,vfcommands) -- also f ?
+ else
+ -- kind of messy that we do orientation here and offsets elsewhere
+ local orientation = data.orientation
+ if orientation and (orientation == 1 or orientation == 3) then
+ local x = data.xoffset
+ local y = data.yoffset
+ if x then
+ pos_h = pos_h + x
+ end
+ if y then
+ pos_v = pos_v + y
+ end
+ pushorientation(orientation,pos_h,pos_v)
+ flushcharacter(current,pos_h,pos_v,pos_r,font,char,data,f,e,factor) -- ,naturalwidth,width)
+ poporientation(orientation,pos_h,pos_v)
+ else
+ flushcharacter(current,pos_h,pos_v,pos_r,font,char,data,f,e,factor) -- ,naturalwidth,width)
+ end
+ end
+ return width, height, depth
+end
+
+-- end of characters
+
+local function reset_state()
+ pos_h = 0
+ pos_v = 0
+ pos_r = lefttoright_code
+ shipbox_h = 0
+ shipbox_v = 0
+ shippingmode = "none"
+ page_size_h = 0
+ page_size_v = 0
+ -- page_h_origin = 0 -- trueinch
+ -- page_v_origin = 0 -- trueinch
+end
+
+-- local function dirstackentry(t,k)
+-- local v = {
+-- cur_h = 0,
+-- cur_v = 0,
+-- ref_h = 0,
+-- ref_v = 0,
+-- }
+-- t[k] = v
+-- return v
+-- end
+
+----- dirstack = { }
+local dirstack = setmetatableindex(dirstackentry)
+
+local function reset_dir_stack()
+ -- dirstack = setmetatableindex(dirstackentry)
+ dirstack = { }
+end
+
+local function flushlatelua(current,h,v)
+ return backends.latelua(current,h,v)
+end
+
+local function flushwriteout(current)
+ if not doing_leaders then
+ backends.writeout(current)
+ end
+end
+
+local function flushopenout(current)
+ if not doing_leaders then
+ backends.openout(current)
+ end
+end
+
+local function flushcloseout(current)
+ if not doing_leaders then
+ backends.closeout(current)
+ end
+end
+
+local hlist_out, vlist_out do
+
+ local function applyanchor(orientation,x,y,width,height,depth,woffset,hoffset,doffset,xoffset,yoffset)
+ local ot = extract(orientation, 0,4)
+ local ay = extract(orientation, 4,4)
+ local ax = extract(orientation, 8,4)
+ local of = extract(orientation,12,4)
+ if ot == 4 then
+ ot, ay = 0, 1
+ elseif ot == 5 then
+ ot, ay = 0, 2
+ end
+ if ot == 0 or ot == 2 then
+ if ax == 1 then x = x - width
+ elseif ax == 2 then x = x + width
+ elseif ax == 3 then x = x - width/2
+ elseif ax == 4 then x = x + width/2
+ end
+ if ot == 2 then
+ doffset, hoffset = hoffset, doffset
+ end
+ if ay == 1 then y = y - doffset
+ elseif ay == 2 then y = y + hoffset
+ elseif ay == 3 then y = y + (doffset + hoffset)/2 - doffset
+ end
+ elseif ot == 1 or ot == 3 then
+ if ay == 1 then y = y - height
+ elseif ay == 2 then y = y + height
+ elseif ay == 3 then y = y - height/2
+ end
+ if ot == 1 then
+ doffset, hoffset = hoffset, doffset
+ end
+ if ax == 1 then x = x - width
+ elseif ax == 2 then x = x + width
+ elseif ax == 3 then x = x - width/2
+ elseif ax == 4 then x = x + width/2
+ elseif ax == 5 then x = x - hoffset
+ elseif ax == 6 then x = x + doffset
+ end
+ end
+ return ot, x + xoffset, y - yoffset
+ end
+
+ -- to be checked: begin- or enddir kan nil zijn, weird
+
+ -- local function calculate_width_to_enddir(this_box,begindir) -- can be a helper
+ -- local dir_nest = 1
+ -- local enddir = begindir
+ -- for current, subtype in nextdir, getnext(begindir) do
+ -- if subtype == normaldir_code then -- todo
+ -- dir_nest = dir_nest + 1
+ -- else
+ -- dir_nest = dir_nest - 1
+ -- end
+ -- if dir_nest == 0 then -- does the type matter
+ -- enddir = current
+ -- local width = rangedimensions(this_box,begindir,enddir)
+ -- return enddir, width
+ -- end
+ -- end
+ -- if enddir == begindir then
+ -- local width = rangedimensions(this_box,begindir) -- ,enddir)
+ -- return enddir, width
+ -- end
+ -- return enddir, 0
+ -- end
+
+ -- check frequencies of nodes
+
+ hlist_out = function(this_box,current)
+ local outer_doing_leaders = false
+
+ local ref_h = pos_h
+ local ref_v = pos_v
+ local ref_r = pos_r
+ pos_r = getdirection(this_box)
+ local boxwidth,
+ boxheight,
+ boxdepth = getwhd(this_box)
+
+ local cur_h = 0
+ local cur_v = 0
+
+ if not current then
+ current = getlist(this_box)
+ end
+
+ -- we can encounter localpar, boundary and penalty nodes but a special
+ -- iterator over content nodes won't save much
+
+ for current, id, subtype in nextnode, current do
+ if id == glyph_code then
+ local char, font = isglyph(current)
+ local x_offset, y_offset = getoffsets(current)
+ if x_offset ~= 0 or y_offset ~= 0 then
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - (cur_h + x_offset)
+ else
+ pos_h = ref_h + (cur_h + x_offset)
+ end
+ pos_v = ref_v - (cur_v - y_offset)
+ -- synced
+ end
+ -- local wd, ht, dp = flush_character(current,font,char,false,true,pos_h,pos_v,pos_r)
+ local wd = flush_character(current,font,char,false,true,pos_h,pos_v,pos_r)
+ cur_h = cur_h + wd
+ elseif id == glue_code then
+ local gluewidth = effectiveglue(current,this_box)
+ if gluewidth ~= 0 then
+ if subtype >= leaders_code then
+ local leader = getleader(current)
+ if leader then
+ local width, height, depth = getwhd(leader)
+ if getid(leader) == rule_code then
+ if gluewidth > 0 then
+ if height == running then
+ height = boxheight
+ end
+ if depth == running then
+ depth = boxdepth
+ end
+ local total = height + depth
+ if total > 0 then
+ if pos_r == righttoleft_code then
+ pos_h = pos_h - gluewidth
+ end
+ pos_v = pos_v - depth
+ flushrule(leader,pos_h,pos_v,pos_r,gluewidth,total,getsubtype(leader))
+ end
+ cur_h = cur_h + gluewidth
+ end
+ elseif width > 0 and gluewidth > 0 then
+ local boxdir = getdirection(leader) or lefttoright_code
+ gluewidth = gluewidth + 10
+ local edge = cur_h + gluewidth
+ local lx = 0
+ if subtype == gleaders_code then
+ local save_h = cur_h
+ if pos_r == righttoleft_code then
+ cur_h = ref_h - shipbox_h - cur_h
+ cur_h = width * (cur_h / width)
+ cur_h = ref_h - shipbox_h - cur_h
+ else
+ cur_h = cur_h + ref_h - shipbox_h
+ cur_h = width * (cur_h / width)
+ cur_h = cur_h - ref_h - shipbox_h
+ end
+ if cur_h < save_h then
+ cur_h = cur_h + width
+ end
+ elseif subtype == leaders_code then
+ local save_h = cur_h
+ cur_h = width * (cur_h / width)
+ if cur_h < save_h then
+ cur_h = cur_h + width
+ end
+ else
+ lq = gluewidth / width
+ lr = gluewidth % width
+ if subtype == cleaders_code then
+ cur_h = cur_h + lr / 2
+ else
+ lx = lr / (lq + 1)
+ cur_h = cur_h + (lr - (lq - 1) * lx) / 2
+ end
+ end
+ local shift = getshift(leader)
+ while cur_h + width <= edge do
+ local basepoint_h = 0
+ -- local basepoint_v = shift
+ if boxdir ~= pos_r then
+ basepoint_h = boxwidth
+ end
+ -- synch_pos_with_cur(ref_h,ref_v,cur_h + basepoint_h,shift)
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - (cur_h + basepoint_h)
+ else
+ pos_h = ref_h + (cur_h + basepoint_h)
+ end
+ pos_v = ref_v - shift
+ -- synced
+ outer_doing_leaders = doing_leaders
+ doing_leaders = true
+ if getid(leader) == vlist_code then
+ vlist_out(leader)
+ else
+ hlist_out(leader)
+ end
+ doing_leaders = outer_doing_leaders
+ cur_h = cur_h + width + lx
+ end
+ cur_h = edge - 10
+ else
+ cur_h = cur_h + gluewidth
+ end
+ else
+ cur_h = cur_h + gluewidth
+ end
+ else
+ if tospace and subtype == spaceskip_code then
+ -- todo: flush_space
+ flush_character(false,getfont(current),32,false,true,pos_h,pos_v,pos_r)
+ end
+ cur_h = cur_h + gluewidth
+ end
+ end
+ elseif id == hlist_code or id == vlist_code then
+ local boxdir = getdirection(current) or lefttoright_code
+ local width, height, depth = getwhd(current)
+ local list = getlist(current)
+ if list then
+ local shift, orientation = getshift(current)
+ if not orientation then
+ local basepoint_h = boxdir ~= pos_r and width or 0
+ -- local basepoint_v = shift
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - (cur_h + basepoint_h)
+ else
+ pos_h = ref_h + (cur_h + basepoint_h)
+ end
+ pos_v = ref_v - shift
+ -- synced
+ if id == vlist_code then
+ vlist_out(current,list)
+ else
+ hlist_out(current,list)
+ end
+ elseif orientation == 0x1000 then
+ local orientation, xoffset, yoffset = getorientation(current)
+ local basepoint_h = boxdir ~= pos_r and width or 0
+ -- local basepoint_v = shift
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - (cur_h + basepoint_h + xoffset)
+ else
+ pos_h = ref_h + (cur_h + basepoint_h + xoffset)
+ end
+ pos_v = ref_v - (shift - yoffset)
+ -- synced
+ if id == vlist_code then
+ vlist_out(current,list)
+ else
+ hlist_out(current,list)
+ end
+ else
+ local orientation, xoffset, yoffset, woffset, hoffset, doffset = getorientation(current)
+ local orientation, basepoint_h, basepoint_v = applyanchor(orientation,0,shift,width,height,depth,woffset,hoffset,doffset,xoffset,yoffset)
+ if orientation == 1 then
+ basepoint_h = basepoint_h + doffset
+ if boxdir == pos_r then
+ basepoint_v = basepoint_v - height
+ end
+ elseif orientation == 2 then
+ if boxdir == pos_r then
+ basepoint_h = basepoint_h + width
+ end
+ elseif orientation == 3 then
+ basepoint_h = basepoint_h + hoffset
+ if boxdir ~= pos_r then
+ basepoint_v = basepoint_v - height
+ end
+ end
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - (cur_h + basepoint_h)
+ else
+ pos_h = ref_h + (cur_h + basepoint_h)
+ end
+ pos_v = ref_v - (cur_v + basepoint_v)
+ -- synced
+ pushorientation(orientation,pos_h,pos_v,pos_r)
+ if id == vlist_code then
+ vlist_out(current,list)
+ else
+ hlist_out(current,list)
+ end
+ poporientation(orientation,pos_h,pos_v,pos_r)
+ end
+ end
+ cur_h = cur_h + width
+ elseif id == disc_code then
+ local replace, tail = getreplace(current)
+ if replace and subtype ~= select_disc then
+ -- we could flatten .. no gain
+ setlink(tail,getnext(current))
+ setlink(current,replace)
+ setreplace(current)
+ end
+ elseif id == kern_code then
+ local kern, factor = getkern(current,true)
+ if kern ~= 0 then
+ if factor and factor ~= 0 then
+ cur_h = cur_h + (1.0 + factor/1000000.0) * kern
+ else
+ cur_h = cur_h + kern
+ end
+ end
+ elseif id == rule_code then
+ local width, height, depth = getwhd(current)
+ if width > 0 then
+ if height == running then
+ height = boxheight
+ end
+ if depth == running then
+ depth = boxdepth
+ end
+ local total = height + depth
+ if total > 0 then
+ local xoffset, yoffset, left, right = getoffsets(current) -- top bottom
+ if left ~= 0 then
+ pos_v = pos_v + left
+ total = total - left
+ end
+ if right ~= 0 then
+ depth = depth - right
+ total = total - right
+ end
+ if pos_r == righttoleft_code then
+ pos_h = pos_h - width
+ xoffset = - xoffset
+ end
+ pos_v = pos_v - depth
+ flushrule(current,pos_h + xoffset,pos_v + yoffset,pos_r,width,total,subtype)
+ end
+ cur_h = cur_h + width
+ end
+ elseif id == math_code then
+ -- local kern = getkern(current)
+ -- if kern ~= 0 then
+ -- cur_h = cur_h + kern
+ -- else
+ cur_h = cur_h + effectiveglue(current,this_box)
+ -- end
+ elseif id == dir_code then
+ -- We normally have proper begin-end pairs. A begin without end is (silently) handled
+ -- and an end without a begin will be (silently) skipped we only need to move forward
+ -- so we then have a faster calculation.
+ local dir, cancel = getdirection(current)
+ if cancel then
+ local ds = dirstack[current]
+ if ds then
+ ref_h = ds.ref_h
+ ref_v = ds.ref_v
+ cur_h = ds.cur_h
+ cur_v = ds.cur_v
+ else
+ -- pardir
+ end
+ pos_r = dir
+ else
+ local width, enddir = dirdimensions(this_box,current)
+ local new_h = cur_h + width
+ if dir ~= pos_r then
+ cur_h = new_h
+ end
+ if enddir ~= current then
+ dirstack[enddir] = {
+ cur_h = new_h,
+ cur_v = cur_v,
+ ref_h = ref_h,
+ ref_v = ref_v,
+ }
+ setdirection(enddir,pos_r)
+ end
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - cur_h
+ else
+ pos_h = ref_h + cur_h
+ end
+ pos_v = ref_v - cur_v
+ -- synced
+ ref_h = pos_h
+ ref_v = pos_v
+ cur_h = 0
+ cur_v = 0
+ pos_r = dir
+ goto synced
+ end
+ elseif id == whatsit_code then
+ if subtype == literalwhatsit_code then
+ flushliteral(current,pos_h,pos_v)
+ elseif subtype == lateluawhatsit_code then
+ flushlatelua(current,pos_h,pos_v)
+ elseif subtype == setmatrixwhatsit_code then
+ flushsetmatrix(current,pos_h,pos_v)
+ elseif subtype == savewhatsit_code then
+ flushsave(current,pos_h,pos_v)
+ elseif subtype == restorewhatsit_code then
+ flushrestore(current,pos_h,pos_v)
+ elseif subtype == saveposwhatsit_code then
+ last_position_x = pos_h
+ last_position_y = pos_v
+ elseif subtype == writewhatsit_code then
+ flushwriteout(current)
+ elseif subtype == closewhatsit_code then
+ flushcloseout(current)
+ elseif subtype == openwhatsit_code then
+ flushopenout(current)
+ end
+ elseif id == marginkern_code then
+ cur_h = cur_h + getkern(current)
+ -- elseif id == localpar_code and start_of_par(current) then
+ -- local pardir = getdirection(current) or lefttoright_code
+ -- if pardir == righttoleft_code then
+ -- end
+ -- end
+ end
+ -- There is no gain in skipping over this when we have zero progression
+ -- and such.
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - cur_h
+ else
+ pos_h = ref_h + cur_h
+ end
+ pos_v = ref_v - cur_v
+ ::synced::
+ end
+ pos_h = ref_h
+ pos_v = ref_v
+ pos_r = ref_r
+ end
+
+ vlist_out = function(this_box,current)
+ local outer_doing_leaders = false
+
+ local ref_h = pos_h
+ local ref_v = pos_v
+ local ref_r = pos_r
+ pos_r = getdirection(this_box)
+
+ local boxwidth,
+ boxheight,
+ boxdepth = getwhd(this_box)
+
+ local cur_h = 0
+ local cur_v = - boxheight
+
+ local top_edge = cur_v
+
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - cur_h
+ else
+ pos_h = ref_h + cur_h
+ end
+ pos_v = ref_v - cur_v
+ -- synced
+
+ if not current then
+ current = getlist(this_box)
+ end
+
+ -- while current do
+ -- local id = getid(current)
+ for current, id, subtype in nextnode, current do
+ if id == glue_code then
+ local glueheight = effectiveglue(current,this_box)
+ if glueheight ~= 0 then
+ if subtype >= leaders_code then
+ local leader = getleader(current)
+ if leader then
+ local width, height, depth = getwhd(leader)
+ local total = height + depth
+ if getid(leader) == rule_code then
+ depth = 0 -- hm
+ if total > 0 then
+ if width == running then
+ width = boxwidth
+ end
+ if width > 0 then
+ if pos_r == righttoleft_code then
+ cur_h = cur_h - width
+ end
+ flushrule(leader,pos_h,pos_v - total,pos_r,width,total,getsubtype(leader))
+ end
+ cur_v = cur_v + total
+ end
+ elseif total > 0 and glueheight > 0 then
+ glueheight = glueheight + 10
+ local edge = cur_v + glueheight
+ local ly = 0
+ if subtype == gleaders_code then
+ save_v = cur_v
+ cur_v = ref_v - shipbox_v - cur_v
+ cur_v = total * (cur_v / total)
+ cur_v = ref_v - shipbox_v - cur_v
+ if cur_v < save_v then
+ cur_v = cur_v + total
+ end
+ elseif subtype == leaders_code then -- aleader
+ save_v = cur_v
+ cur_v = top_edge + total * ((cur_v - top_edge) / total)
+ if cur_v < save_v then
+ cur_v = cur_v + total
+ end
+ else
+ lq = glueheight / total
+ lr = glueheight % total
+ if subtype == cleaders_code then
+ cur_v = cur_v + lr / 2
+ else
+ ly = lr / (lq + 1)
+ cur_v = cur_v + (lr - (lq - 1) * ly) / 2
+ end
+ end
+ local shift = getshift(leader)
+ while cur_v + total <= edge do -- todo: <= edge - total
+ -- synch_pos_with_cur(ref_h, ref_v, getshift(leader), cur_v + height)
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - shift
+ else
+ pos_h = ref_h + shift
+ end
+ pos_v = ref_v - (cur_v + height)
+ -- synced
+ outer_doing_leaders = doing_leaders
+ doing_leaders = true
+ if getid(leader) == vlist_code then
+ vlist_out(leader)
+ else
+ hlist_out(leader)
+ end
+ doing_leaders = outer_doing_leaders
+ cur_v = cur_v + total + ly
+ end
+ cur_v = edge - 10
+ else
+ cur_v = cur_v + glueheight
+ end
+ end
+ else
+ cur_v = cur_v + glueheight
+ end
+ end
+ elseif id == hlist_code or id == vlist_code then
+ local boxdir = getdirection(current) or lefttoright_code
+ local width, height, depth = getwhd(current)
+ local list = getlist(current)
+ if list then
+ local shift, orientation = getshift(current)
+ if not orientation then
+ -- local basepoint_h = shift
+ -- local basepoint_v = height
+ if boxdir ~= pos_r then
+ shift = shift + width
+ end
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - shift
+ else
+ pos_h = ref_h + shift
+ end
+ pos_v = ref_v - (cur_v + height)
+ -- synced
+ if id == vlist_code then
+ vlist_out(current,list)
+ else
+ hlist_out(current,list)
+ end
+ elseif orientation == 0x1000 then
+ local orientation, xoffset, yoffset = getorientation(current)
+ -- local basepoint_h = shift
+ -- local basepoint_v = height
+ if boxdir ~= pos_r then
+ shift = shift + width
+ end
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - (shift + xoffset)
+ else
+ pos_h = ref_h + (shift + xoffset)
+ end
+ pos_v = ref_v - (cur_v + height - yoffset)
+ -- synced
+ if id == vlist_code then
+ vlist_out(current,list)
+ else
+ hlist_out(current,list)
+ end
+ else
+ local orientation, xoffset, yoffset, woffset, hoffset, doffset = getorientation(current)
+ local orientation, basepoint_h, basepoint_v = applyanchor(orientation,shift,height,width,height,depth,woffset,hoffset,doffset,xoffset,yoffset)
+ if orientation == 1 then
+ basepoint_h = basepoint_h + width - height
+ basepoint_v = basepoint_v - height
+ elseif orientation == 2 then
+ basepoint_h = basepoint_h + width
+ basepoint_v = basepoint_v + depth - height
+ elseif orientation == 3 then -- weird
+ basepoint_h = basepoint_h + height
+ end
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - basepoint_h
+ else
+ pos_h = ref_h + basepoint_h
+ end
+ pos_v = ref_v - (cur_v + basepoint_v)
+ -- synced
+ pushorientation(orientation,pos_h,pos_v,pos_r)
+ if id == vlist_code then
+ vlist_out(current,list)
+ else
+ hlist_out(current,list)
+ end
+ poporientation(orientation,pos_h,pos_v,pos_r)
+ end
+ end
+ cur_v = cur_v + height + depth
+ elseif id == kern_code then
+ cur_v = cur_v + getkern(current)
+ elseif id == rule_code then
+ local width, height, depth = getwhd(current)
+ local total = height + depth
+ if total > 0 then
+ if width == running then
+ width = boxwidth
+ end
+ if width > 0 then
+ local xoffset, yoffset, left, right = getoffsets(current)
+ if left ~= 0 then
+ width = width - left
+ xoffset = left
+ end
+ if right ~= 0 then
+ width = width - right
+ end
+ if pos_r == righttoleft_code then
+ xoffset = - xoffset - width
+ end
+ flushrule(current,pos_h + xoffset,pos_v - total - yoffset,pos_r,width,total,subtype)
+ end
+ cur_v = cur_v + total
+ end
+ elseif id == whatsit_code then
+ if subtype == literalwhatsit_code then
+ flushliteral(current,pos_h,pos_v)
+ elseif subtype == lateluawhatsit_code then
+ flushlatelua(current,pos_h,pos_v)
+ elseif subtype == setmatrixwhatsit_code then
+ flushsetmatrix(current,pos_h,pos_v)
+ elseif subtype == savewhatsit_code then
+ flushsave(current,pos_h,pos_v)
+ elseif subtype == restorewhatsit_code then
+ flushrestore(current,pos_h,pos_v)
+ elseif subtype == saveposwhatsit_code then
+ last_position_x = pos_h
+ last_position_y = pos_v
+ elseif subtype == writewhatsit_code then
+ flushwriteout(current)
+ elseif subtype == closewhatsit_code then
+ flushcloseout(current)
+ elseif subtype == openwhatsit_code then
+ flushopenout(current)
+ end
+ end
+ if pos_r == righttoleft_code then
+ pos_h = ref_h - cur_h
+ else
+ pos_h = ref_h + cur_h
+ end
+ pos_v = ref_v - cur_v
+ ::synced::
+ end
+ pos_h = ref_h
+ pos_v = ref_v
+ pos_r = ref_r
+ end
+
+end
+
+function drivers.converters.lmtx(driver,box,smode,objnum,specification)
+
+ if not driver then
+ report("error in converter, no driver")
+ return
+ end
+
+ if box then
+ box = tonut(box)
+ else
+ report("error in converter, no box")
+ return
+ end
+
+ local actions = driver.actions
+ local flushers = driver.flushers
+
+ initialize = actions.initialize
+ finalize = actions.finalize
+
+ updatefontstate = flushers.updatefontstate
+
+ pushorientation = flushers.pushorientation
+ poporientation = flushers.poporientation
+
+ flushcharacter = flushers.character
+ flushfontchar = flushers.fontchar
+ flushrule = flushers.rule
+ flushsimplerule = flushers.simplerule
+ flushspecial = flushers.special
+ flushliteral = flushers.literal
+ flushsetmatrix = flushers.setmatrix
+ flushsave = flushers.save
+ flushrestore = flushers.restore
+ -- flushimage = flushers.image
+
+ reset_dir_stack()
+ reset_state()
+
+ shippingmode = smode
+
+ local details = nil -- must be outside labels
+
+ local width, height, depth = getwhd(box)
+
+ local total = height + depth
+
+ ----- v_offset_par = 0
+ ----- h_offset_par = 0
+
+ local max_v = total -- + v_offset_par
+ local max_h = width -- + h_offset_par
+
+ if height > maxdimen or depth > maxdimen or width > maxdimen then
+ goto DONE
+ end
+
+ if max_v > maxdimen then
+ goto DONE
+ elseif max_v > abs_max_v then
+ abs_max_v = max_v
+ end
+
+ if max_h > maxdimen then
+ goto DONE
+ elseif max_h > abs_max_h then
+ abs_max_h = max_h
+ end
+
+ if shippingmode == "page" then
+
+ -- We have zero offsets in ConTeXt.
+
+ local pagewidth, pageheight = getpagedimensions()
+
+ -- local h_offset_par = texget("hoffset")
+ -- local v_offset_par = texget("voffset")
+
+ -- page_h_origin = trueinch
+ -- page_v_origin = trueinch
+
+ pos_r = lefttoright_code
+
+ if pagewidth > 0 then
+ page_size_h = pagewidth
+ else
+ page_size_h = width
+ end
+
+ if page_size_h == 0 then
+ page_size_h = width
+ end
+
+ if pageheight > 0 then
+ page_size_v = pageheight
+ else
+ page_size_v = total
+ end
+
+ if page_size_v == 0 then
+ page_size_v = total
+ end
+
+ local refpoint_h = 0 -- + page_h_origin + h_offset_par
+ local refpoint_v = page_size_v -- - page_v_origin - v_offset_par
+
+ pos_h = refpoint_h
+ pos_v = refpoint_v - height
+ -- synced
+
+ else
+
+ -- page_h_origin = 0
+ -- page_v_origin = 0
+ page_size_h = width
+ page_size_v = total
+ pos_r = getdirection(box)
+ pos_v = depth
+ pos_h = pos_r == righttoleft_code and width or 0
+
+ end
+
+ shipbox_ref_h = pos_h
+ shipbox_ref_v = pos_v
+
+ details = {
+ shippingmode = smode, -- target
+ boundingbox = { 0, 0, page_size_h, page_size_v },
+ objectnumber = smode ~= "page" and objnum or nil,
+ pagenumber = smode == "page" and objnum or nil,
+ specification = specification,
+ }
+
+ initialize(driver,details)
+
+ lastfont = nil -- this forces a sync each page / object
+
+ if getid(box) == vlist_code then
+ vlist_out(box)
+ else
+ hlist_out(box)
+ end
+
+ ::DONE::
+
+ finalize(driver,details)
+
+ shippingmode = "none"
+end
+
+-- This will move to back-out.lua eventually.
+
+do
+
+ ----- sortedhash = table.sortedhash
+
+ ----- tonut = nodes.tonut
+ local properties = nodes.properties.data
+ local flush = texio.write_nl
+
+ local periods = utilities.strings.newrepeater(".")
+
+ local function showdetails(n,l)
+ local p = properties[tonut(n)]
+ if p then
+ local done = false
+ for k, v in sortedhash(p) do
+ if done then
+ flush("\n")
+ else
+ done = true
+ end
+ flush(periods[l+1] .. " " .. k .. " = " .. tostring(v))
+ end
+ end
+ end
+
+ local whatsittracers = {
+ latelua = showdetails,
+ literal = showdetails,
+ }
+
+ callback.register("show_whatsit",function(n,l)
+ local s = nodes.whatsitcodes[n.subtype]
+ texio.write(" [" .. s .. "]")
+ local w = whatsittracers[s]
+ if w then
+ w(n,l)
+ end
+ end)
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/driv-shp.mkxl b/Master/texmf-dist/tex/context/base/mkiv/driv-shp.mkxl
new file mode 100644
index 00000000000..68b62c72a72
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/driv-shp.mkxl
@@ -0,0 +1,18 @@
+%D \module
+%D [ file=driv-shp,
+%D version=2018.07.26,
+%D title=\CONTEXT\ Driver Macros,
+%D subtitle=Shipout,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{driv-shp}{optimize}
+
+\unprotect
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/export-example.css b/Master/texmf-dist/tex/context/base/mkiv/export-example.css
index c39f0bec637..19a2a071e88 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/export-example.css
+++ b/Master/texmf-dist/tex/context/base/mkiv/export-example.css
@@ -78,13 +78,13 @@ context|div.document {
font-family : "DejaVu Serif", "Lucida Bright", serif ;
font-size : 12pt ;
/* line-height : 14.4pt; */
- line-height : 2.8ex;
+ line-height : 2.8ex;
max-width : 50em ;
padding : 1em ;
- /* text-align : justify ; */
- text-align : justify ;
- /* hyphens : manual ; */
- /* text-justify : inter-word ; */
+ /* text-align : justify ; */
+ text-align : justify ;
+ /* hyphens : manual ; */
+ /* text-justify : inter-word ; */
}
document>metadata,
@@ -124,7 +124,7 @@ context|div.document context|div.metadata context|div.metavariable.metaname-titl
font-family : "DejaVu Serif", "Lucida Bright", serif ;
font-weight : bold ;
font-size : 3em ;
- text-align : left ;
+ text-align : left ;
margin-bottom : 2ex ;
}
@@ -183,7 +183,7 @@ context|div.section {
sectioncaption,
context|div.sectioncaption {
display : block ;
- text-align : left ;
+ text-align : left ;
page-break-after : avoid ;
margin-top : 3ex ;
margin-bottom : 2ex ;
@@ -343,7 +343,7 @@ context|div.section.summary context|div.sectioncaption context|div.sectiontitle
border-bottom-style : solid ;
border-color : rgb(50%,50%,100%) ;
border-width : .15em;
- text-align : left ;
+ text-align : left ;
}
section[detail="subsummary"]>sectioncaption>sectiontitle,
@@ -355,7 +355,7 @@ context|div.section.subsummary context|div.sectioncaption context|div.sectiontit
border-color : rgb(50%,50%,100%) ;
border-bottom-style : dotted ;
border-width : .15em ;
- text-align : left ;
+ text-align : left ;
}
/* itemgroup : display */
@@ -367,13 +367,13 @@ context|div.section.subsummary context|div.sectioncaption context|div.sectiontit
/* suffix : '.' ; */
@counter-style lower-greek { /* css 3 */
- type : non-repeating ;
- glyphs : 'α' 'β' 'γ' 'δ' 'ε' 'ζ' 'η' 'θ' 'ι' 'κ' 'λ' 'μ' 'ν' 'ξ' 'ο' 'Ï€' 'Ï' 'σ' 'Ï„' 'Ï…' 'φ' 'χ' 'ψ' 'ω' ;
+ type : non-repeating ;
+ glyphs : 'α' 'β' 'γ' 'δ' 'ε' 'ζ' 'η' 'θ' 'ι' 'κ' 'λ' 'μ' 'ν' 'ξ' 'ο' 'Ï€' 'Ï' 'σ' 'Ï„' 'Ï…' 'φ' 'χ' 'ψ' 'ω' ;
}
@counter-style upper-greek { /* css 3 */
- type : non-repeating ;
- glyphs : 'Α' 'B' 'Γ' 'Δ' 'Ε' 'Ζ' 'Η' 'Θ' 'Ι' 'Κ' 'Λ' 'Îœ' 'Î' 'Ξ' 'Ο' 'Π' 'Ρ' 'Σ' 'Τ' 'Î¥' 'Φ' 'Χ' 'Ψ' 'Ω' ;
+ type : non-repeating ;
+ glyphs : 'Α' 'B' 'Γ' 'Δ' 'Ε' 'Ζ' 'Η' 'Θ' 'Ι' 'Κ' 'Λ' 'Îœ' 'Î' 'Ξ' 'Ο' 'Π' 'Ρ' 'Σ' 'Τ' 'Î¥' 'Φ' 'Χ' 'Ψ' 'Ω' ;
}
itemgroup,
@@ -428,11 +428,11 @@ context|div.description {
descriptiontag,
context|div.descriptiontag {
display : inline ;
- float : left ;
- clear : left ;
+ float : left ;
+ clear : left ;
margin-right : 1em ;
- text-align : left ;
- font-weight : bold ;
+ text-align : left ;
+ font-weight : bold ;
}
descriptioncontent,
@@ -537,8 +537,8 @@ context|div.registerlocation:after {
content : "\25B6\00A0\00A0" ;
color : rgb(40%,40%,40%) ;
font-size : x-small ;
- line-height : 0 ;
- padding-top : 0.5ex ;
+ line-height : 0 ;
+ padding-top : 0.5ex ;
vertical-align : top ;
}
@@ -814,22 +814,22 @@ context|div.delimitedblock.quote:after {
delimited,
context|div.delimited {
- display : inline
+ display : inline
}
delimitedcontent,
context|div.delimitedcontent {
- display : inline
+ display : inline
}
delimitedsymbol,
context|div.delimitedsymbol {
- display : inline
+ display : inline
}
delimitedblock,
context|div.delimitedblock {
- display : block
+ display : block
}
subsentence:before,
@@ -841,17 +841,17 @@ context|div.subsentence:after {
subsentence,
context|div.subsentence {
- display : inline
+ display : inline
}
subsentencecontent,
context|div.subsentencecontent {
- display : inline
+ display : inline
}
subsentencesymbol,
context|div.subsentencesymbol {
- display : inline
+ display : inline
}
/* label : mixed */
diff --git a/Master/texmf-dist/tex/context/base/mkiv/file-job.lua b/Master/texmf-dist/tex/context/base/mkiv/file-job.lua
index 486aee63a72..407c3c15da1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/file-job.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/file-job.lua
@@ -46,7 +46,7 @@ local dirname = file.dirname
local is_qualified_path = file.is_qualified_path
local cleanpath = resolvers.cleanpath
-local inputstack = resolvers.inputstack
+local toppath = resolvers.toppath
local resolveprefix = resolvers.resolve
local hasscheme = url.hasscheme
@@ -172,8 +172,8 @@ implement {
-- moved from tex to lua:
-local texpatterns = { "%s.mkvi", "%s.mkiv", "%s.tex" }
-local luapatterns = { "%s" .. utilities.lua.suffixes.luc, "%s.lua" }
+local texpatterns = { "%s.mkvi", "%s.mkiv", "%s.mklx", "%s.mkxl", "%s.tex" }
+local luapatterns = { "%s" .. utilities.lua.suffixes.luc, "%s.lua", "%s.lmt" }
local cldpatterns = { "%s.cld" }
local xmlpatterns = { "%s.xml" }
@@ -326,6 +326,8 @@ end
local suffixes = {
mkvi = usetexfile,
mkiv = usetexfile,
+ mklx = usetexfile,
+ mkxl = usetexfile,
tex = usetexfile,
luc = useluafile,
lua = useluafile,
@@ -789,7 +791,7 @@ end
local function autoname(name)
if name == "*" then
- name = nameonly(inputstack[#inputstack] or name)
+ name = nameonly(toppath() or name)
end
return name
end
@@ -1114,11 +1116,11 @@ function document.setfilenames()
end
end
-implement { name = "setdocumentcommandline", actions = document.setcommandline, onlyonce = true }
-implement { name = "setdocumentmodes", actions = document.setmodes, onlyonce = true }
-implement { name = "setdocumentmodules", actions = document.setmodules, onlyonce = true }
-implement { name = "setdocumentenvironments", actions = document.setenvironments, onlyonce = true }
-implement { name = "setdocumentfilenames", actions = document.setfilenames, onlyonce = true }
+implement { name = "setdocumentcommandline", actions = document.setcommandline, onlyonce = true }
+implement { name = "setdocumentmodes", actions = document.setmodes, onlyonce = true }
+implement { name = "setdocumentmodules", actions = document.setmodules, onlyonce = true }
+implement { name = "setdocumentenvironments", actions = document.setenvironments, onlyonce = true }
+implement { name = "setdocumentfilenames", actions = document.setfilenames, onlyonce = true }
do
diff --git a/Master/texmf-dist/tex/context/base/mkiv/file-lib.lua b/Master/texmf-dist/tex/context/base/mkiv/file-lib.lua
index 62cf938ba4d..9b0679e250d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/file-lib.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/file-lib.lua
@@ -61,13 +61,18 @@ function resolvers.uselibrary(specification) -- todo: reporter
if not foundname then
-- pattern based search
for i=1,#patterns do
- local wanted = format(patterns[i],barename)
- foundname = found(wanted)
- if trace_libraries then
- report_library("checking %a as %a: %s",filename,wanted,foundname or "not found")
- end
- if foundname then
- break
+ local pattern = patterns[i]
+ if pattern and pattern ~= "" then
+ local wanted = format(pattern,barename)
+ foundname = found(wanted)
+ if trace_libraries then
+ report_library("checking %a as %a: %s",filename,wanted,foundname or "not found")
+ end
+ if foundname then
+ break
+ end
+ else
+ -- can be a bogus path (coming from a test)
end
end
end
@@ -89,4 +94,24 @@ function resolvers.uselibrary(specification) -- todo: reporter
end
end
-commands.uselibrary = resolvers.uselibrary -- for the moment
+-- We keep these in the commands namespace even if it's not that logical
+-- but this way we are compatible.
+
+function commands.loadlibrary(name,foundname,nointerference)
+ if not foundname then
+ foundname = name
+ end
+ if foundname and foundname ~= "" then
+ if nointerference then
+ context.startnointerference()
+ end
+ context.startreadingfile()
+ context.input(foundname)
+ context.stopreadingfile()
+ if nointerference then
+ context.stopnointerference()
+ end
+ end
+end
+
+commands.uselibrary = resolvers.uselibrary
diff --git a/Master/texmf-dist/tex/context/base/mkiv/file-mod.lua b/Master/texmf-dist/tex/context/base/mkiv/file-mod.lua
index 81320f96eff..10a18717865 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/file-mod.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/file-mod.lua
@@ -36,7 +36,7 @@ local iterator = utilities.parsers.iterator
-- modules can have a specific suffix or can specify one
-local prefixes = {
+local prefixes = {
"m", -- module, extends functionality
"p", -- private code
"s", -- styles
@@ -47,13 +47,24 @@ local prefixes = {
-- the order might change and how about cld
-local suffixes = {
- "mkvi", -- proprocessed mkiv files
+local suffixes = CONTEXTLMTXMODE > 0 and
+{
+ "mklx", -- preprocessed mkiv lmtx files
+ "mkxl", -- mkiv lmtx files
+ "mkvi", -- preprocessed mkiv files
"mkiv", -- mkiv files
"tex", -- normally source code files
"cld", -- context lua documents (often stand alone)
"lua", -- lua files
}
+ or
+{
+ "mkvi",
+ "mkiv",
+ "tex",
+ "cld",
+ "lua",
+}
local modstatus = { }
local missing = false
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-age.lua b/Master/texmf-dist/tex/context/base/mkiv/font-age.lua
index b20a57538e2..1545c1c8d3c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-age.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-age.lua
@@ -12,6 +12,9 @@ if context then
os.exit()
end
+-- There is no need for a special script to generate this list as it's seldom
+-- changes: inspect(fonts.encodings.agl.unicodes) will do.
+
return {
["A"]=65,
["AE"]=198,
@@ -1603,6 +1606,7 @@ return {
["eightideographicparen"]=12839,
["eightinferior"]=8328,
["eightmonospace"]=65304,
+ ["eightoldstyle"]=56,
["eightparen"]=9339,
["eightperiod"]=9359,
["eightpersian"]=1784,
@@ -1760,6 +1764,7 @@ return {
["fiveideographicparen"]=12836,
["fiveinferior"]=8325,
["fivemonospace"]=65301,
+ ["fiveoldstyle"]=53,
["fiveparen"]=9336,
["fiveperiod"]=9356,
["fivepersian"]=1781,
@@ -1788,6 +1793,7 @@ return {
["fourinferior"]=8324,
["fourmonospace"]=65300,
["fournumeratorbengali"]=2551,
+ ["fouroldstyle"]=52,
["fourparen"]=9335,
["fourperiod"]=9355,
["fourpersian"]=1780,
@@ -2616,6 +2622,7 @@ return {
["nineideographicparen"]=12840,
["nineinferior"]=8329,
["ninemonospace"]=65305,
+ ["nineoldstyle"]=57,
["nineparen"]=9340,
["nineperiod"]=9360,
["ninepersian"]=1785,
@@ -2782,6 +2789,7 @@ return {
["oneinferior"]=8321,
["onemonospace"]=65297,
["onenumeratorbengali"]=2548,
+ ["oneoldstyle"]=49,
["oneparen"]=9332,
["oneperiod"]=9352,
["onepersian"]=1777,
@@ -3298,6 +3306,7 @@ return {
["sevenideographicparen"]=12838,
["seveninferior"]=8327,
["sevenmonospace"]=65303,
+ ["sevenoldstyle"]=55,
["sevenparen"]=9338,
["sevenperiod"]=9358,
["sevenpersian"]=1783,
@@ -3394,6 +3403,7 @@ return {
["sixideographicparen"]=12837,
["sixinferior"]=8326,
["sixmonospace"]=65302,
+ ["sixoldstyle"]=54,
["sixparen"]=9337,
["sixperiod"]=9357,
["sixpersian"]=1782,
@@ -3602,6 +3612,7 @@ return {
["threeinferior"]=8323,
["threemonospace"]=65299,
["threenumeratorbengali"]=2550,
+ ["threeoldstyle"]=51,
["threeparen"]=9334,
["threeperiod"]=9354,
["threepersian"]=1779,
@@ -3722,6 +3733,7 @@ return {
["twoinferior"]=8322,
["twomonospace"]=65298,
["twonumeratorbengali"]=2549,
+ ["twooldstyle"]=50,
["twoparen"]=9333,
["twoperiod"]=9353,
["twopersian"]=1778,
@@ -4088,6 +4100,7 @@ return {
["zerohackarabic"]=1632,
["zeroinferior"]=8320,
["zeromonospace"]=65296,
+ ["zerooldstyle"]=48,
["zeropersian"]=1776,
["zerosuperior"]=8304,
["zerothai"]=3664,
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-agl.lua b/Master/texmf-dist/tex/context/base/mkiv/font-agl.lua
index 49b85421f1c..19912b94478 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-agl.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-agl.lua
@@ -395,7 +395,7 @@ local synonyms = allocate {
zeroarabic = 0x0660,
}
-local extras = allocate { -- private extensions
+local extras = allocate { -- private extensions
Dcroat = 0x0110,
Delta = 0x2206,
Euro = 0x20AC,
@@ -635,6 +635,17 @@ local extras = allocate { -- private extensions
theta1 = 0x03D1,
twodotenleader = 0x2025,
+ zerooldstyle = 0x0030,
+ oneoldstyle = 0x0031,
+ twooldstyle = 0x0032,
+ threeoldstyle = 0x0033,
+ fouroldstyle = 0x0034,
+ fiveoldstyle = 0x0035,
+ sixoldstyle = 0x0036,
+ sevenoldstyle = 0x0037,
+ eightoldstyle = 0x0038,
+ nineoldstyle = 0x0039,
+
dotlessj = 0x0237,
}
@@ -653,7 +664,7 @@ if names then
mark(unicodes)
mark(ctxcodes)
-else
+elseif characters then
names = allocate { } -- filled from char-def.lua
unicodes = allocate { }
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-aux.lua b/Master/texmf-dist/tex/context/base/mkiv/font-aux.lua
index 4ac6278cbcf..0e4d7add3f0 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-aux.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-aux.lua
@@ -240,3 +240,7 @@ function fonts.getmultiple(tfmdata,k,kind)
return 0
end
end
+
+function fonts.getindices(tfmdata)
+ return getindices(tfmdata)
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-cff.lua b/Master/texmf-dist/tex/context/base/mkiv/font-cff.lua
index 46deedb5f93..72b0a038f17 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-cff.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-cff.lua
@@ -27,7 +27,7 @@ if not modules then modules = { } end modules ['font-cff'] = {
-- the other hand, we can now feed back cff2 stuff.
local next, type, tonumber, rawget = next, type, tonumber, rawget
-local byte, char, gmatch = string.byte, string.char, string.gmatch
+local byte, char, gmatch, sub = string.byte, string.char, string.gmatch, string.sub
local concat, remove, unpack = table.concat, table.remove, table.unpack
local floor, abs, round, ceil, min, max = math.floor, math.abs, math.round, math.ceil, math.min, math.max
local P, C, R, S, C, Cs, Ct = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Ct
@@ -145,6 +145,38 @@ local defaultstrings = { [0] = -- taken from ff
"Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold",
}
+local standardnames = { [0] = -- needed for seac
+ false, false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ "space", "exclam", "quotedbl", "numbersign", "dollar", "percent",
+ "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four",
+ "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less",
+ "equal", "greater", "question", "at", "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", "bracketleft", "backslash", "bracketright", "asciicircum",
+ "underscore", "quoteleft", "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", "braceleft", "bar", "braceright", "asciitilde", false, false, false,
+ false, false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, "exclamdown",
+ "cent", "sterling", "fraction", "yen", "florin", "section", "currency",
+ "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft",
+ "guilsinglright", "fi", "fl", false, "endash", "dagger", "daggerdbl",
+ "periodcentered", false, "paragraph", "bullet", "quotesinglbase",
+ "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand",
+ false, "questiondown", false, "grave", "acute", "circumflex", "tilde",
+ "macron", "breve", "dotaccent", "dieresis", false, "ring", "cedilla", false,
+ "hungarumlaut", "ogonek", "caron", "emdash", false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false, false,
+ false, "AE", false, "ordfeminine", false, false, false, false, "Lslash",
+ "Oslash", "OE", "ordmasculine", false, false, false, false, false, "ae",
+ false, false, false, "dotlessi", false, false, "lslash", "oslash", "oe",
+ "germandbls", false, false, false, false
+}
+
local cffreaders = {
readbyte,
readushort,
@@ -152,6 +184,15 @@ local cffreaders = {
readulong,
}
+directives.register("fonts.streamreader",function()
+ cffreaders = {
+ readbyte,
+ readushort,
+ readuint,
+ readulong,
+ }
+end)
+
-- The header contains information about its own size.
local function readheader(f)
@@ -655,6 +696,7 @@ do
local x = 0
local y = 0
local width = false
+ local lsb = 0
local r = 0
local stems = 0
local globalbias = 0
@@ -678,6 +720,9 @@ do
local factors = false
local axis = false
local vsindex = 0
+ local justpass = false
+ local seacs = { }
+ local procidx = nil
local function showstate(where)
report("%w%-10s : [%s] n=%i",depth*2,where,concat(stack," ",1,top),top)
@@ -1012,43 +1057,6 @@ do
top = 0
end
--- local function xxcurveto(swap)
--- local last = top % 4 ~= 0 and stack[top]
--- if last then
--- top = top - 1
--- end
--- for i=1,top,4 do
--- local ax, ay, bx, by
--- if swap then
--- ax = x + stack[i]
--- ay = y
--- bx = ax + stack[i+1]
--- by = ay + stack[i+2]
--- y = by + stack[i+3]
--- if last and i+3 == top then
--- x = bx + last
--- else
--- x = bx
--- end
--- swap = false
--- else
--- ax = x
--- ay = y + stack[i]
--- bx = ax + stack[i+1]
--- by = ay + stack[i+2]
--- x = bx + stack[i+3]
--- if last and i+3 == top then
--- y = by + last
--- else
--- y = by
--- end
--- swap = true
--- end
--- xycurveto(ax,ay,bx,by,x,y)
--- end
--- top = 0
--- end
-
local function xxcurveto(swap)
local last = top % 4 ~= 0 and stack[top]
if last then
@@ -1086,7 +1094,6 @@ do
top = 0
end
-
local function hvcurveto()
if trace_charstrings then
showstate("hvcurveto")
@@ -1302,7 +1309,7 @@ do
end
local function divide()
- if version == 1 then
+ if version == "cff" then
local d = stack[top]
top = top - 1
stack[top] = stack[top] / d
@@ -1310,7 +1317,7 @@ do
end
local function closepath()
- if version == 1 then
+ if version == "cff" then
if trace_charstrings then
showstate("closepath")
end
@@ -1319,65 +1326,90 @@ do
end
local function hsbw()
- if version == 1 then
+ if version == "cff" then
if trace_charstrings then
showstate("hsbw")
end
- -- lsb = stack[top-1]
+ lsb = stack[top-1] or 0
width = stack[top]
end
top = 0
end
- local function seac()
- if version == 1 then
+ local function sbw()
+ if version == "cff" then
if trace_charstrings then
- showstate("seac")
+ showstate("sbw")
end
+ lsb = stack[top-3]
+ width = stack[top-1]
end
top = 0
end
- local function sbw()
- if version == 1 then
+ -- asb adx ady bchar achar seac (accented characters)
+
+ local function seac()
+ if version == "cff" then
if trace_charstrings then
- showstate("sbw")
+ showstate("seac")
end
- width = stack[top-1]
end
top = 0
end
- -- these are probably used for special cases i.e. call out to postscript
+ -- These are probably used for special cases i.e. call out to the
+ -- postscript interpreter (p 61 of the spec as well as chapter 8).
+ --
+ -- This needs checking (I have to ask Taco next time we meet.)
+
+ local popped = 3
+ local hints = 3
+
+ -- arg1 ... argn n othersubr# <callothersubr> (on postscript stack)
local function callothersubr()
- if version == 1 then
- -- we don't support this (ok, we could mimick these othersubs)
+ if version == "cff" then
if trace_charstrings then
- showstate("callothersubr (unsupported)")
+ showstate("callothersubr")
+ end
+ if stack[top] == hints then
+ popped = stack[top-2]
+ else
+ popped = 3
+ end
+ local t = stack[top-1]
+ if t then
+ top = top - (t + 2)
+ if top < 0 then
+ top = 0
+ end
+ else
+ top = 0
end
+ else
+ top = 0
end
- top = 0
end
+ -- <pop> number (from postscript stack)
+
local function pop()
- if version == 1 then
- -- we don't support this
+ if version == "cff" then
if trace_charstrings then
- showstate("pop (unsupported)")
+ showstate("pop")
end
top = top + 1
- stack[top] = 0 -- a dummy
+ stack[top] = popped
else
top = 0
end
end
local function setcurrentpoint()
- if version == 1 then
- -- we don't support this
+ if version == "cff" then
if trace_charstrings then
- showstate("pop (unsupported)")
+ showstate("setcurrentpoint (unsupported)")
end
x = x + stack[top-1]
y = y + stack[top]
@@ -1527,6 +1559,41 @@ do
hvcurveto, -- 31
}
+ local reverse = { [0] =
+ "unsupported",
+ "getstem",
+ "unsupported",
+ "getstem",
+ "vmoveto",
+ "rlineto",
+ "hlineto",
+ "vlineto",
+ "rrcurveto",
+ "unsupported",
+ "unsupported",
+ "unsupported",
+ "unsupported",
+ "hsbw",
+ "unsupported",
+ "setvsindex",
+ "blend",
+ "unsupported",
+ "getstem",
+ "getmask",
+ "getmask",
+ "rmoveto",
+ "hmoveto",
+ "getstem",
+ "rcurveline",
+ "rlinecurve",
+ "vvcurveto",
+ "hhcurveto",
+ "unsupported",
+ "unsupported",
+ "vhcurveto",
+ "hvcurveto",
+ }
+
local subactions = {
-- cff 1
[000] = dotsection,
@@ -1578,6 +1645,7 @@ do
for i=1132,2048 do
t[i] = char(28,band(rshift(i,8),0xFF),band(i,0xFF))
end
+ -- we could inline some ...
setmetatableindex(encode,function(t,k)
-- 16.16-bit signed fixed value
local r = round(k)
@@ -1663,7 +1731,7 @@ do
local function call(scope,list,bias) -- ,process)
depth = depth + 1
if top == 0 then
- showstate(formatters["unknown %s call"](scope))
+ showstate(formatters["unknown %s call %s, case %s"](scope,"?",1))
top = 0
else
local index = stack[top] + bias
@@ -1675,7 +1743,7 @@ do
if tab then
process(tab)
else
- showstate(formatters["unknown %s call %i"](scope,index))
+ showstate(formatters["unknown %s call %s, case %s"](scope,index,2))
top = 0
end
end
@@ -1684,8 +1752,6 @@ do
-- precompiling and reuse is much slower than redoing the calls
- local justpass = false
-
-- local function decode(str)
-- local a, b, c, d, e = byte(str,1,5)
-- if a == 28 then
@@ -1796,13 +1862,24 @@ do
i = i + 1
local t = tab[i]
if justpass then
- if t >= 34 or t <= 37 then -- flexes
+ if t >= 34 and t <= 37 then -- flexes
for i=1,top do
r = r + 1 ; result[r] = encode[stack[i]]
end
r = r + 1 ; result[r] = chars[12]
r = r + 1 ; result[r] = chars[t]
top = 0
+ elseif t == 6 then
+ seacs[procidx] = {
+ asb = stack[1],
+ adx = stack[2],
+ ady = stack[3],
+ base = stack[4],
+ accent = stack[5],
+ width = width,
+ lsb = lsb,
+ }
+ top = 0
else
local a = subactions[t]
if a then
@@ -1834,46 +1911,56 @@ do
-- cff 1: (when cff2 strip them)
elseif t == 1 or t == 3 or t == 18 or operation == 23 then
p_getstem() -- at the start
-if true then
- if top > 0 then
- for i=1,top do
- r = r + 1 ; result[r] = encode[stack[i]]
+ if true then
+ if top > 0 then
+ for i=1,top do
+ r = r + 1 ; result[r] = encode[stack[i]]
+ end
+ top = 0
end
+ r = r + 1 ; result[r] = chars[t]
+ else
top = 0
end
- r = r + 1 ; result[r] = chars[t]
-else
- top = 0
-end
i = i + 1
-- cff 1: (when cff2 strip them)
elseif t == 19 or t == 20 then
local s = p_getmask() or 0 -- after the stems
-if true then
- if top > 0 then
- for i=1,top do
- r = r + 1 ; result[r] = encode[stack[i]]
+ if true then
+ if top > 0 then
+ for i=1,top do
+ r = r + 1 ; result[r] = encode[stack[i]]
+ end
+ top = 0
end
+ r = r + 1 ; result[r] = chars[t]
+ for j=1,s do
+ i = i + 1
+ r = r + 1 ; result[r] = chars[tab[i]]
+ end
+ else
+ i = i + s
top = 0
end
- r = r + 1 ; result[r] = chars[t]
- for j=1,s do
- i = i + 1
- r = r + 1 ; result[r] = chars[tab[i]]
- end
-else
- i = i + s
- top = 0
-end
i = i + 1
-- cff 1: closepath
elseif t == 9 then
top = 0
i = i + 1
elseif t == 13 then
- local s = hsbw() or 0
- i = i + s + 1
+ hsbw()
+ if version == "cff" then
+ -- we do a moveto over lsb
+ r = r + 1 ; result[r] = encode[lsb]
+ r = r + 1 ; result[r] = chars[22]
+ else
+ -- lsb is supposed to be zero
+ end
+ i = i + 1
else
+ if trace_charstrings then
+ showstate(reverse[t] or "<action>")
+ end
if top > 0 then
for i=1,top do
r = r + 1 ; result[r] = encode[stack[i]]
@@ -1894,7 +1981,7 @@ end
end
else
if trace_charstrings then
- showvalue("<action>",t)
+ showstate(reverse[t] or "<action>")
end
top = 0
i = i + 1
@@ -1941,24 +2028,19 @@ end
-- end
-- end
- local function setbias(globals,locals)
--- if version == 1 then -- charstring version, not cff
--- return
--- 0,
--- 0
--- return
--- 1,
--- 1
--- else
+ local function setbias(globals,locals,nobias)
+ if nobias then
+ return 0, 0
+ else
local g = #globals
local l = #locals
return
((g < 1240 and 107) or (g < 33900 and 1131) or 32768) + 1,
((l < 1240 and 107) or (l < 33900 and 1131) or 32768) + 1
--- end
+ end
end
- local function processshape(tab,index)
+ local function processshape(tab,index,hack)
if not tab then
glyphs[index] = {
@@ -1974,10 +2056,13 @@ end
x = 0
y = 0
width = false
+ lsb = 0
r = 0
top = 0
stems = 0
result = { } -- we could reuse it when only boundingbox calculations are needed
+ popped = 3
+ procidx = index
xmin = 0
xmax = 0
@@ -1995,6 +2080,10 @@ end
process(tab)
+ if hack then
+ return x, y
+ end
+
local boundingbox = {
round(xmin),
round(ymin),
@@ -2059,6 +2148,8 @@ end
axis = false
regions = data.regions
justpass = streams == true
+ popped = 3
+ seacs = { }
if regions then
regions = { regions } -- needs checking
axis = data.factors or false
@@ -2073,6 +2164,8 @@ end
locals = false
globals = false
strings = false
+ popped = 3
+ seacs = { }
end
local function setwidths(private)
@@ -2086,7 +2179,7 @@ end
return privatedata.nominalwidthx or 0, privatedata.defaultwidthx or 0
end
- parsecharstrings = function(fontdata,data,glphs,doshapes,tversion,streams)
+ parsecharstrings = function(fontdata,data,glphs,doshapes,tversion,streams,nobias)
local dictionary = data.dictionaries[1]
local charstrings = dictionary.charstrings
@@ -2100,14 +2193,42 @@ end
vsindex = dictionary.vsindex or 0
glyphs = glphs or { }
- globalbias, localbias = setbias(globals,locals)
+ globalbias, localbias = setbias(globals,locals,nobias)
nominalwidth, defaultwidth = setwidths(dictionary.private)
if charstrings then
startparsing(fontdata,data,streams)
for index=1,#charstrings do
processshape(charstrings[index],index-1)
--- charstrings[index] = nil -- free memory (what if used more often?)
+ end
+ if justpass and next(seacs) then
+ -- old type 1 stuff ... seacs
+ local charset = data.dictionaries[1].charset
+ if charset then
+ local lookup = table.swapped(charset)
+ for index, v in next, seacs do
+ local bindex = lookup[standardnames[v.base]]
+ local aindex = lookup[standardnames[v.accent]]
+ local bglyph = bindex and glyphs[bindex]
+ local aglyph = aindex and glyphs[aindex]
+ if bglyph and aglyph then
+ -- this is a real ugly hack but we seldom enter this branch (e.g. old lbr)
+ local jp = justpass
+ justpass = false
+ local x, y = processshape(charstrings[bindex+1],bindex,true)
+ justpass = jp
+ --
+ local base = bglyph.stream
+ local accent = aglyph.stream
+ local moveto = encode[-x-v.asb+v.adx] .. chars[22]
+ .. encode[-y +v.ady] .. chars[ 4]
+ -- prune an endchar
+ base = sub(base,1,#base-1)
+ -- combine them
+ glyphs[index].stream = base .. moveto .. accent
+ end
+ end
+ end
end
stopparsing(fontdata,data)
else
@@ -2127,9 +2248,10 @@ end
vsindex = dictionary.vsindex or 0
glyphs = glphs or { }
- justpass = streams == true
+ justpass = streams == true
+ seacs = { }
- globalbias, localbias = setbias(globals,locals)
+ globalbias, localbias = setbias(globals,locals,nobias)
nominalwidth, defaultwidth = setwidths(dictionary.private)
processshape(tab,index-1)
@@ -2428,8 +2550,8 @@ function readers.cff(f,fontdata,specification)
if private then
local data = private.data
if type(data) == "table" then
- cffinfo.defaultwidth = data.defaultwidth or cffinfo.defaultwidth
- cffinfo.nominalwidth = data.nominalwidth or cffinfo.nominalwidth
+ cffinfo.defaultwidth = data.defaultwidthx or cffinfo.defaultwidth
+ cffinfo.nominalwidth = data.nominalwidthx or cffinfo.nominalwidth
cffinfo.bluevalues = data.bluevalues
cffinfo.otherblues = data.otherblues
cffinfo.familyblues = data.familyblues
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-con.lua b/Master/texmf-dist/tex/context/base/mkiv/font-con.lua
index 93ce9f5da47..1bb63aa5192 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-con.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-con.lua
@@ -40,7 +40,6 @@ local setmetatableindex = table.setmetatableindex
-- will be directives
constructors.dontembed = allocate()
-constructors.autocleanup = true
constructors.namemode = "fullpath" -- will be a function
constructors.version = 1.01
@@ -51,6 +50,8 @@ constructors.cacheintex = true -- so we see the original table in fonts.fon
constructors.addtounicode = true
+constructors.fixprotrusion = true
+
-- This might become an interface:
local designsizes = allocate()
@@ -134,21 +135,10 @@ make this profitable and the <l n='lua'/> based variant was just faster. A days
wasted day but an experience richer.</p>
--ldx]]--
--- we can get rid of the tfm instance when we have fast access to the
--- scaled character dimensions at the tex end, e.g. a fontobject.width
--- actually we already have some of that now as virtual keys in glyphs
---
--- flushing the kern and ligature tables from memory saves a lot (only
--- base mode) but it complicates vf building where the new characters
--- demand this data .. solution: functions that access them
-
function constructors.cleanuptable(tfmdata)
- if constructors.autocleanup and tfmdata.properties.virtualized then
- for k, v in next, tfmdata.characters do
- if v.commands then v.commands = nil end
- -- if v.kerns then v.kerns = nil end
- end
- end
+ -- This no longer makes sense because the addition of font.getcopy and its
+ -- possible usage in generic implicates that we need to return the whole
+ -- lot now.
end
-- experimental, sharing kerns (unscaled and scaled) saves memory
@@ -444,9 +434,10 @@ function constructors.scale(tfmdata,specification)
-- boundarychar = 65536, -- there is now a string 'right_boundary'
-- false_boundarychar = 65536, -- produces invalid tfm in luatex
--
- targetproperties.language = properties.language or "dflt" -- inherited
- targetproperties.script = properties.script or "dflt" -- inherited
- targetproperties.mode = properties.mode or "base" -- inherited
+ targetproperties.language = properties.language or "dflt" -- inherited
+ targetproperties.script = properties.script or "dflt" -- inherited
+ targetproperties.mode = properties.mode or "base" -- inherited
+ targetproperties.method = properties.method
--
local askedscaledpoints = scaledpoints
local scaledpoints, delta = constructors.calculatescale(tfmdata,scaledpoints,nil,specification) -- no shortcut, dan be redefined
@@ -465,6 +456,7 @@ function constructors.scale(tfmdata,specification)
target.size = scaledpoints
--
target.encodingbytes = properties.encodingbytes or 1
+ target.subfont = properties.subfont
target.embedding = properties.embedding or "subset"
target.tounicode = 1
target.cidinfo = properties.cidinfo
@@ -595,10 +587,12 @@ function constructors.scale(tfmdata,specification)
targetparameters.descender = delta * descender
end
--
--- inspect(targetparameters)
constructors.enhanceparameters(targetparameters) -- official copies for us, now virtual
--
- local protrusionfactor = (targetquad ~= 0 and 1000/targetquad) or 0
+ -- I need to fix this in luatex ... get rid of quad there so that we can omit this here.
+ --
+ local protrusionfactor = constructors.fixprotrusion and ((targetquad ~= 0 and 1000/targetquad) or 1) or 1
+ --
local scaledwidth = defaultwidth * hdelta
local scaledheight = defaultheight * vdelta
local scaleddepth = defaultdepth * vdelta
@@ -983,15 +977,15 @@ function constructors.finalize(tfmdata)
end
--
if not parameters.slantfactor then
- parameters.slantfactor = tfmdata.slant or 0
+ parameters.slantfactor = (tfmdata.slant or 0)/1000
end
--
if not parameters.extendfactor then
- parameters.extendfactor = tfmdata.extend or 0
+ parameters.extendfactor = (tfmdata.extend or 1000)/1000
end
--
if not parameters.squeezefactor then
- parameters.squeezefactor = tfmdata.squeeze or 0
+ parameters.squeezefactor = (tfmdata.squeeze or 1000)/1000
end
--
local designsize = parameters.designsize
@@ -1027,13 +1021,14 @@ function constructors.finalize(tfmdata)
properties.virtualized = tfmdata.type == "virtual"
end
--
- properties.fontname = tfmdata.fontname
- properties.filename = tfmdata.filename
- properties.fullname = tfmdata.fullname
- properties.name = tfmdata.name
- properties.psname = tfmdata.psname
+ properties.fontname = properties.fontname or tfmdata.fontname
+ properties.filename = properties.filename or tfmdata.filename
+ properties.fullname = properties.fullname or tfmdata.fullname
+ properties.name = properties.name or tfmdata.name
+ properties.psname = properties.psname or tfmdata.psname
--
properties.encodingbytes = tfmdata.encodingbytes or 1
+ properties.subfont = tfmdata.subfont or nil
properties.embedding = tfmdata.embedding or "subset"
properties.tounicode = tfmdata.tounicode or 1
properties.cidinfo = tfmdata.cidinfo or nil
@@ -1067,6 +1062,7 @@ function constructors.finalize(tfmdata)
tfmdata.psname = nil
--
tfmdata.encodingbytes = nil
+ tfmdata.subfont = nil
tfmdata.embedding = nil
tfmdata.tounicode = nil
tfmdata.cidinfo = nil
@@ -1143,6 +1139,7 @@ hashmethods.normal = function(list)
m = m + 1
t[m] = k .. '=' .. tostring(v)
end
+ sort(t)
s[n] = k .. '={' .. concat(t,",") .. "}"
else
s[n] = k .. '=' .. tostring(v)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-ctx.lua b/Master/texmf-dist/tex/context/base/mkiv/font-ctx.lua
index 6847a2b8d30..bf14dd309b1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-ctx.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-ctx.lua
@@ -87,8 +87,6 @@ local getprop = nuts.getprop
local setprop = nuts.setprop
local setsubtype = nuts.setsubtype
-local texgetattribute = tex.getattribute
-local texsetattribute = tex.setattribute
local texgetdimen = tex.getdimen
local texsetcount = tex.setcount
local texget = tex.get
@@ -170,10 +168,34 @@ addformatter(formatters,"font:features",[["'"..sequenced(%s," ",true).."'"]],{ s
constructors.resolvevirtualtoo = true -- context specific (due to resolver)
+if CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 then
+ constructors.fixprotrusion = false
+end
+
constructors.sharefonts = true -- experimental
constructors.nofsharedhashes = 0
constructors.nofsharedvectors = 0
constructors.noffontsloaded = 0
+constructors.autocleanup = true
+
+-- we can get rid of the tfm instance when we have fast access to the
+-- scaled character dimensions at the tex end, e.g. a fontobject.width
+-- actually we already have some of that now as virtual keys in glyphs
+--
+-- flushing the kern and ligature tables from memory saves a lot (only
+-- base mode) but it complicates vf building where the new characters
+-- demand this data .. solution: functions that access them
+
+-- font.getcopy = font.getfont -- we always want the table that context uses
+
+function constructors.cleanuptable(tfmdata)
+ if constructors.autocleanup and tfmdata.properties.virtualized then
+ for k, v in next, tfmdata.characters do
+ if v.commands then v.commands = nil end
+ -- if v.kerns then v.kerns = nil end
+ end
+ end
+end
do
@@ -181,7 +203,7 @@ do
local hashes = { }
local nofinstances = 0
- local instances = table.setmetatableindex(function(t,k)
+ local instances = setmetatableindex(function(t,k)
nofinstances = nofinstances + 1
t[k] = nofinstances
return nofinstances
@@ -572,6 +594,21 @@ end
-- \definefontfeature[demo][a={b,c}]
-- \definefontfeature[demo][a={b=12,c={34,35}}]
+local h = setmetatableindex(function(t,k)
+ local v = "," .. k .. ","
+ t[k] = v
+ return v
+end)
+
+-- local function removefromhash(hash,key)
+-- local pattern = h[key]
+-- for k in next, hash do
+-- if k ~= key and find(h[k],pattern) then -- if find(k,",") and ...
+-- hash[k] = nil
+-- end
+-- end
+-- end
+
local function presetcontext(name,parent,features) -- will go to con and shared
if features == "" and find(parent,"=",1,true) then
features = parent
@@ -637,14 +674,23 @@ local function presetcontext(name,parent,features) -- will go to con and shared
-- if v then t[k] = v end
t[k] = v
end
- -- needed for dynamic features
- -- maybe number should always be renewed as we can redefine features
- local number = setups[name] and setups[name].number or 0 -- hm, numbers[name]
+ -- the number is needed for dynamic features; maybe number should always be
+ -- renewed as we can redefine features ... i need a test
+ local number = setups[name] and setups[name].number or 0
if number == 0 then
number = #numbers + 1
numbers[number] = name
end
+ --
t.number = number
+ -- there is the special case of combined features as we have in math but maybe
+ -- this has to change some day ... otherwise we mess up dynamics (ok, we could
+ -- impose a limit there: no combined features)
+ --
+ -- done elsewhere (!)
+ --
+ -- removefromhash(setups,name) -- can have changed (like foo,extramath)
+ --
setups[name] = t
return number, t
end
@@ -841,23 +887,6 @@ specifiers.definecontext = definecontext
-- we extend the hasher:
--- constructors.hashmethods.virtual = function(list)
--- local s = { }
--- local n = 0
--- for k, v in next, list do
--- n = n + 1
--- s[n] = k -- no checking on k
--- end
--- if n > 0 then
--- sort(s)
--- for i=1,n do
--- local k = s[i]
--- s[i] = k .. '=' .. tostring(list[k])
--- end
--- return concat(s,"+")
--- end
--- end
-
constructors.hashmethods.virtual = function(list)
local s = { }
local n = 0
@@ -878,6 +907,54 @@ constructors.hashmethods.virtual = function(list)
end
end
+if not JITSUPPORTED then
+
+ constructors.hashmethods.normal = function(list)
+ local s = { }
+ local n = 0
+ for k, v in next, list do
+ if not k then
+ -- no need to add to hash
+ elseif k == "number" or k == "features" then
+ -- no need to add to hash (maybe we need a skip list)
+ else
+ n = n + 1
+ if type(v) == "table" then
+ -- table.sequenced
+ local t = { }
+ local m = 0
+ for k, v in next, v do
+ m = m + 1
+ t[m] = format("%q=%q",k,v)
+ end
+ sort(t)
+ s[n] = format("%q={%s}",k,concat(t,","))
+ else
+ s[n] = format("%q=%q",k,v)
+ end
+ end
+ end
+ if n > 0 then
+ sort(s)
+ return concat(s,"+")
+ end
+ end
+
+ constructors.hashmethods.virtual = function(list)
+ local s = { }
+ local n = 0
+ for k, v in next, list do
+ n = n + 1
+ s[n] = format("%q=%q",k,v)
+ end
+ if n > 0 then
+ sort(s)
+ return concat(s,"+")
+ end
+ end
+
+end
+
-- end of redefine
-- local withcache = { } -- concat might be less efficient than nested tables
@@ -915,14 +992,37 @@ end
-- return fastcopy(setups[features] or (presetcontext(features,"","") and setups[features]))
-- end
+-- local function splitcontext(features) -- presetcontext creates dummy here
+-- local sf = setups[features]
+-- if not sf then
+-- local n -- number
+-- if find(features,",") then
+-- -- let's assume a combination which is not yet defined but just specified (as in math)
+-- n, sf = presetcontext(features,features,"")
+-- else
+-- -- we've run into an unknown feature and or a direct spec so we create a dummy
+-- n, sf = presetcontext(features,"","")
+-- end
+-- end
+-- return fastcopy(sf)
+-- end
+
local function splitcontext(features) -- presetcontext creates dummy here
- local sf = setups[features]
- if not sf then
- local n -- number
- if find(features,",",a,true) then
- -- let's assume a combination which is not yet defined but just specified (as in math)
- n, sf = presetcontext(features,features,"")
- else
+ local n, sf
+ if find(features,",") then
+ --
+ -- from elsewhere (!)
+ --
+ -- this will become:
+ --
+ -- if find(features,"^reset," then
+ setups[features] = nil
+ -- end
+ -- let's assume a combination which is not yet defined but just specified (as in math)
+ n, sf = presetcontext(features,features,"")
+ else
+ sf = setups[features]
+ if not sf then
-- we've run into an unknown feature and or a direct spec so we create a dummy
n, sf = presetcontext(features,"","")
end
@@ -1129,199 +1229,17 @@ do -- else too many locals
end
end
- local n = 0
-
- -- we can also move rscale to here (more consistent)
- -- the argument list will become a table
-
local function nice_cs(cs)
return (gsub(cs,".->", ""))
end
- -- function commands.definefont_two(global,cs,str,size,inheritancemode,classfeatures,fontfeatures,classfallbacks,fontfallbacks,
- -- mathsize,textsize,relativeid,classgoodies,goodies,classdesignsize,fontdesignsize,scaledfontmode)
-
--- scanners.definefont_two = function()
-
--- local global = scanboolean() -- \ifx\fontclass\empty\s!false\else\s!true\fi
--- local cs = scanstring () -- {#csname}%
--- local str = scanstring () -- \somefontfile
--- local size = scaninteger() -- \d_font_scaled_font_size
--- local inheritancemode = scaninteger() -- \c_font_feature_inheritance_mode
--- local classfeatures = scanstring () -- \m_font_class_features
--- local fontfeatures = scanstring () -- \m_font_features
--- local classfallbacks = scanstring () -- \m_font_class_fallbacks
--- local fontfallbacks = scanstring () -- \m_font_fallbacks
--- local mathsize = scaninteger() -- \fontface
--- local textsize = scaninteger() -- \d_font_scaled_text_face
--- local relativeid = scaninteger() -- \relativefontid
--- local classgoodies = scanstring () -- \m_font_class_goodies
--- local goodies = scanstring () -- \m_font_goodies
--- local classdesignsize = scanstring () -- \m_font_class_designsize
--- local fontdesignsize = scanstring () -- \m_font_designsize
--- local scaledfontmode = scaninteger() -- \scaledfontmode
-
--- if trace_defining then
--- report_defining("start stage two: %s, size %s, features %a & %a",str,size,classfeatures,fontfeatures)
--- end
--- -- name is now resolved and size is scaled cf sa/mo
--- local lookup, name, sub, method, detail = getspecification(str or "")
--- -- new (todo: inheritancemode)
--- local designsize = fontdesignsize ~= "" and fontdesignsize or classdesignsize or ""
--- local designname = designsizefilename(name,designsize,size)
--- if designname and designname ~= "" then
--- if trace_defining or trace_designsize then
--- report_defining("remapping name %a, specification %a, size %a, designsize %a",name,designsize,size,designname)
--- end
--- -- we don't catch detail here
--- local o_lookup, o_name, o_sub, o_method, o_detail = getspecification(designname)
--- if o_lookup and o_lookup ~= "" then lookup = o_lookup end
--- if o_method and o_method ~= "" then method = o_method end
--- if o_detail and o_detail ~= "" then detail = o_detail end
--- name = o_name
--- sub = o_sub
--- end
--- -- so far
--- -- some settings can have been overloaded
--- if lookup and lookup ~= "" then
--- specification.lookup = lookup
--- end
--- if relativeid and relativeid ~= "" then -- experimental hook
--- local id = tonumber(relativeid) or 0
--- specification.relativeid = id > 0 and id
--- end
--- --
--- specification.name = name
--- specification.size = size
--- specification.sub = (sub and sub ~= "" and sub) or specification.sub
--- specification.mathsize = mathsize
--- specification.textsize = textsize
--- specification.goodies = goodies
--- specification.cs = cs
--- specification.global = global
--- specification.scalemode = scaledfontmode -- context specific
--- if detail and detail ~= "" then
--- specification.method = method or "*"
--- specification.detail = detail
--- elseif specification.detail and specification.detail ~= "" then
--- -- already set
--- elseif inheritancemode == 0 then
--- -- nothing
--- elseif inheritancemode == 1 then
--- -- fontonly
--- if fontfeatures and fontfeatures ~= "" then
--- specification.method = "*"
--- specification.detail = fontfeatures
--- end
--- if fontfallbacks and fontfallbacks ~= "" then
--- specification.fallbacks = fontfallbacks
--- end
--- elseif inheritancemode == 2 then
--- -- classonly
--- if classfeatures and classfeatures ~= "" then
--- specification.method = "*"
--- specification.detail = classfeatures
--- end
--- if classfallbacks and classfallbacks ~= "" then
--- specification.fallbacks = classfallbacks
--- end
--- elseif inheritancemode == 3 then
--- -- fontfirst
--- if fontfeatures and fontfeatures ~= "" then
--- specification.method = "*"
--- specification.detail = fontfeatures
--- elseif classfeatures and classfeatures ~= "" then
--- specification.method = "*"
--- specification.detail = classfeatures
--- end
--- if fontfallbacks and fontfallbacks ~= "" then
--- specification.fallbacks = fontfallbacks
--- elseif classfallbacks and classfallbacks ~= "" then
--- specification.fallbacks = classfallbacks
--- end
--- elseif inheritancemode == 4 then
--- -- classfirst
--- if classfeatures and classfeatures ~= "" then
--- specification.method = "*"
--- specification.detail = classfeatures
--- elseif fontfeatures and fontfeatures ~= "" then
--- specification.method = "*"
--- specification.detail = fontfeatures
--- end
--- if classfallbacks and classfallbacks ~= "" then
--- specification.fallbacks = classfallbacks
--- elseif fontfallbacks and fontfallbacks ~= "" then
--- specification.fallbacks = fontfallbacks
--- end
--- end
--- local tfmdata = definers.read(specification,size) -- id not yet known (size in spec?)
--- --
--- local lastfontid = 0
--- if not tfmdata then
--- report_defining("unable to define %a as %a",name,nice_cs(cs))
--- lastfontid = -1
--- texsetcount("scaledfontsize",0)
--- -- ctx_letvaluerelax(cs) -- otherwise the current definition takes the previous one
--- elseif type(tfmdata) == "number" then
--- if trace_defining then
--- report_defining("reusing %s, id %a, target %a, features %a / %a, fallbacks %a / %a, goodies %a / %a, designsize %a / %a",
--- name,tfmdata,nice_cs(cs),classfeatures,fontfeatures,classfallbacks,fontfallbacks,classgoodies,goodies,classdesignsize,fontdesignsize)
--- end
--- csnames[tfmdata] = specification.cs
--- texdefinefont(global,cs,tfmdata)
--- -- resolved (when designsize is used):
--- local size = fontdata[tfmdata].parameters.size or 0
--- -- ctx_setsomefontsize(size .. "sp")
--- setmacro("somefontsize",size.."sp")
--- texsetcount("scaledfontsize",size)
--- lastfontid = tfmdata
--- else
--- -- setting the extra characters will move elsewhere
--- local characters = tfmdata.characters
--- local parameters = tfmdata.parameters
--- -- we use char0 as signal; cf the spec pdf can handle this (no char in slot)
--- characters[0] = nil
--- -- characters[0x00A0] = { width = parameters.space }
--- -- characters[0x2007] = { width = characters[0x0030] and characters[0x0030].width or parameters.space } -- figure
--- -- characters[0x2008] = { width = characters[0x002E] and characters[0x002E].width or parameters.space } -- period
--- --
--- local id = definefont(tfmdata)
--- csnames[id] = specification.cs
--- tfmdata.properties.id = id
--- definers.register(tfmdata,id) -- to be sure, normally already done
--- texdefinefont(global,cs,id)
--- constructors.cleanuptable(tfmdata)
--- constructors.finalize(tfmdata)
--- if trace_defining then
--- report_defining("defining %a, id %a, target %a, features %a / %a, fallbacks %a / %a",
--- name,id,nice_cs(cs),classfeatures,fontfeatures,classfallbacks,fontfallbacks)
--- end
--- -- resolved (when designsize is used):
--- local size = tfmdata.parameters.size or 655360
--- setmacro("somefontsize",size.."sp")
--- -- ctx_setsomefontsize(size .. "sp")
--- texsetcount("scaledfontsize",size)
--- lastfontid = id
--- end
--- if trace_defining then
--- report_defining("memory usage after: %s",statistics.memused())
--- report_defining("stop stage two")
--- end
--- --
--- texsetcount("global","lastfontid",lastfontid)
--- specifiers[lastfontid] = { str, size }
--- if not mathsize then
--- -- forget about it
--- elseif mathsize == 0 then
--- lastmathids[1] = lastfontid
--- else
--- lastmathids[mathsize] = lastfontid
--- end
--- --
--- stoptiming(fonts)
--- end
+ local n = 0
+ local busy = false
+ local combinefeatures = false
- local busy = false
+ directives.register("fonts.features.combine",function(v)
+ combinefeatures = v
+ end)
scanners.definefont_two = function()
local global = scanboolean() -- \ifx\fontclass\empty\s!false\else\s!true\fi
@@ -1343,7 +1261,7 @@ do -- else too many locals
local scaledfontmode = scaninteger() -- \scaledfontmode
if trace_defining then
- report_defining("start stage two: %s, size %s, features %a & %a",str,size,classfeatures,fontfeatures)
+ report_defining("start stage two: %s, size %s, features %a & %a, mode %a",str,size,classfeatures,fontfeatures,inheritancemode)
end
-- name is now resolved and size is scaled cf sa/mo
local lookup, name, sub, method, detail = getspecification(str or "")
@@ -1408,12 +1326,26 @@ do -- else too many locals
end
elseif inheritancemode == 3 then
-- fontfirst
- if fontfeatures and fontfeatures ~= "" then
- specification.method = "*"
- specification.detail = fontfeatures
- elseif classfeatures and classfeatures ~= "" then
- specification.method = "*"
- specification.detail = classfeatures
+ if combinefeatures then
+ if classfeatures and classfeatures ~= "" then
+ specification.method = "*"
+ if fontfeatures and fontfeatures ~= "" and fontfeatures ~= classfeatures then
+ specification.detail = classfeatures .. "," .. fontfeatures
+ else
+ specification.detail = classfeatures
+ end
+ elseif fontfeatures and fontfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = fontfeatures
+ end
+ else
+ if fontfeatures and fontfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = fontfeatures
+ elseif classfeatures and classfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = classfeatures
+ end
end
if fontfallbacks and fontfallbacks ~= "" then
specification.fallbacks = fontfallbacks
@@ -1422,12 +1354,26 @@ do -- else too many locals
end
elseif inheritancemode == 4 then
-- classfirst
- if classfeatures and classfeatures ~= "" then
- specification.method = "*"
- specification.detail = classfeatures
- elseif fontfeatures and fontfeatures ~= "" then
- specification.method = "*"
- specification.detail = fontfeatures
+ if combinefeatures then
+ if fontfeatures and fontfeatures ~= "" then
+ specification.method = "*"
+ if classfeatures and classfeatures ~= "" and classfeatures ~= fontfeatures then
+ specification.detail = fontfeatures .. "," .. classfeatures
+ else
+ specification.detail = fontfeatures
+ end
+ elseif classfeatures and classfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = classfeatures
+ end
+ else
+ if classfeatures and classfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = classfeatures
+ elseif fontfeatures and fontfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = fontfeatures
+ end
end
if classfallbacks and classfallbacks ~= "" then
specification.fallbacks = classfallbacks
@@ -1583,7 +1529,7 @@ do -- else too many locals
--
- function definers.define(specification)
+ local function define(specification)
--
local name = specification.name
if not name or name == "" then
@@ -1631,6 +1577,7 @@ do -- else too many locals
texdefinefont(specification.global,cs,tfmdata)
csnames[tfmdata] = cs
end
+ stoptiming(fonts)
return tfmdata, fontdata[tfmdata]
else
local id = definefont(tfmdata)
@@ -1642,12 +1589,14 @@ do -- else too many locals
end
constructors.cleanuptable(tfmdata)
constructors.finalize(tfmdata)
+ stoptiming(fonts)
return id, tfmdata
end
- stoptiming(fonts)
end
end
+ definers.define = define
+
-- local id, cs = fonts.definers.internal { }
-- local id, cs = fonts.definers.internal { number = 2 }
-- local id, cs = fonts.definers.internal { name = "dejavusans" }
@@ -1674,7 +1623,7 @@ do -- else too many locals
else
specification.cs = cs
end
- id = definers.define {
+ id = define {
name = name,
size = size,
cs = cs,
@@ -1686,13 +1635,25 @@ do -- else too many locals
return id, csnames[id]
end
+ local read
+
+ if CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 then -- maybe always
+ read = function(name,size)
+ return (define { name = name, size = size } or 0)
+ end
+ else
+ read = definers.read
+ end
+
+ callbacks.register('define_font', read, "definition of fonts (tfmdata preparation)")
+
-- here
local infofont = 0
function fonts.infofont()
if infofont == 0 then
- infofont = definers.define { name = "dejavusansmono", size = texsp("6pt") }
+ infofont = define { name = "dejavusansmono", size = texsp("6pt") }
end
return infofont
end
@@ -2380,7 +2341,7 @@ if environment.initex then
statistics.register("font processing", function()
local l = { }
for what, handler in table.sortedpairs(handlers) do
- local features = handler.features
+ local features = handler and handler.features
if features then
l[#l+1] = format("[%s (base initializers: %s) (base processors: %s) (base manipulators: %s) (node initializers: %s) (node processors: %s) (node manipulators: %s)]",
what,
@@ -2429,6 +2390,26 @@ to scale virtual characters.</p>
do
+ -- can become luat-tex.lua
+
+ local texsetglyphdata = tex.setglyphdata
+ local texgetglyphdata = tex.getglyphdata
+
+ if not texsetglyphdata then
+
+ local texsetattribute = tex.setattribute
+ local texgetattribute = tex.getattribute
+
+ texsetglyphdata = function(n) return texsetattribute(0,n) end
+ texgetglyphdata = function() return texgetattribute(0) end
+
+ tex.setglyphdata = texsetglyphdata
+ tex.getglyphdata = texgetglyphdata
+
+ end
+
+ -- till here
+
local setmacro = tokens.setters.macro
function constructors.currentfonthasfeature(n)
@@ -2452,6 +2433,63 @@ do
local f_strip = formatters["%0.2fpt"] -- normally this value is changed only once
local stripper = lpeg.patterns.stripzeros
+ local cache = { }
+
+ local hows = {
+ ["+"] = "add",
+ ["-"] = "subtract",
+ ["="] = "replace",
+ }
+
+ local function setfeature(how,parent,name,font) -- 0/1 test temporary for testing
+ if not how or how == 0 then
+ if trace_features and texgetglyphdata() ~= 0 then
+ report_cummulative("font %!font:name!, reset",fontdata[font or true])
+ end
+ texsetglyphdata(0)
+ elseif how == true or how == 1 then
+ local hash = "feature > " .. parent
+ local done = cache[hash]
+ if trace_features and done then
+ report_cummulative("font %!font:name!, revive %a : %!font:features!",fontdata[font or true],parent,setups[numbers[done]])
+ end
+ texsetglyphdata(done or 0)
+ else
+ local full = parent .. how .. name
+ local hash = "feature > " .. full
+ local done = cache[hash]
+ if not done then
+ local n = setups[full]
+ if n then
+ -- already defined
+ else
+ n = mergecontextfeatures(parent,name,how,full)
+ end
+ done = registercontextfeature(hash,full,how)
+ cache[hash] = done
+ if trace_features then
+ report_cummulative("font %!font:name!, %s %a : %!font:features!",fontdata[font or true],hows[how],full,setups[numbers[done]])
+ end
+ end
+ texsetglyphdata(done)
+ end
+ end
+
+ local function resetfeature()
+ if trace_features and texgetglyphdata() ~= 0 then
+ report_cummulative("font %!font:name!, reset",fontdata[true])
+ end
+ texsetglyphdata(0)
+ end
+
+ local function setfontfeature(tag)
+ texsetglyphdata(contextnumber(tag))
+ end
+
+ local function resetfontfeature()
+ texsetglyphdata(0)
+ end
+
implement {
name = "nbfs",
arguments = "dimen",
@@ -2469,13 +2507,13 @@ do
implement {
name = "setfontfeature",
arguments = "string",
- actions = function(tag) texsetattribute(0,contextnumber(tag)) end
+ actions = setfontfeature,
}
implement {
name = "resetfontfeature",
- arguments = { 0, 0 },
- actions = texsetattribute,
+ -- arguments = { 0, 0 },
+ actions = resetfontfeature,
}
implement {
@@ -2504,62 +2542,12 @@ do
actions = function(name) ctx_doif(contextnumber(name) == 0) end,
}
-
implement {
name = "adaptfontfeature",
arguments = "2 strings",
actions = adaptcontext
}
- local cache = { }
-
- local hows = {
- ["+"] = "add",
- ["-"] = "subtract",
- ["="] = "replace",
- }
-
- local function setfeature(how,parent,name,font) -- 0/1 test temporary for testing
- if not how or how == 0 then
- if trace_features and texgetattribute(0) ~= 0 then
- report_cummulative("font %!font:name!, reset",fontdata[font or true])
- end
- texsetattribute(0,0)
- elseif how == true or how == 1 then
- local hash = "feature > " .. parent
- local done = cache[hash]
- if trace_features and done then
- report_cummulative("font %!font:name!, revive %a : %!font:features!",fontdata[font or true],parent,setups[numbers[done]])
- end
- texsetattribute(0,done or 0)
- else
- local full = parent .. how .. name
- local hash = "feature > " .. full
- local done = cache[hash]
- if not done then
- local n = setups[full]
- if n then
- -- already defined
- else
- n = mergecontextfeatures(parent,name,how,full)
- end
- done = registercontextfeature(hash,full,how)
- cache[hash] = done
- if trace_features then
- report_cummulative("font %!font:name!, %s %a : %!font:features!",fontdata[font or true],hows[how],full,setups[numbers[done]])
- end
- end
- texsetattribute(0,done)
- end
- end
-
- local function resetfeature()
- if trace_features and texgetattribute(0) ~= 0 then
- report_cummulative("font %!font:name!, reset",fontdata[true])
- end
- texsetattribute(0,0)
- end
-
local function registerlanguagefeatures()
local specifications = languages.data.specifications
for i=1,#specifications do
@@ -3184,9 +3172,9 @@ end
do
- local family_font = node.family_font
- local new_glyph = nodes.pool.glyph
- local fontproperties = fonts.hashes.properties
+ local getfontoffamily = font.getfontoffamily
+ local new_glyph = nodes.pool.glyph
+ local fontproperties = fonts.hashes.properties
local function getprivateslot(id,name)
if not name then
@@ -3255,7 +3243,7 @@ do
name = "getprivatemathchar",
arguments = "string",
actions = function(name)
- local p = getprivateslot(family_font(0),name)
+ local p = getprivateslot(getfontoffamily(0),name)
if p then
context(utfchar(p))
end
@@ -3381,3 +3369,8 @@ function fonts.helpers.collectanchors(tfmdata)
return anchors
end
+
+if CONTEXTLMTXMODE > 0 then
+ fonts.constructors.addtounicode = false
+ fonts.constructors.autocleanup = false
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-def.lua b/Master/texmf-dist/tex/context/base/mkiv/font-def.lua
index f3d0f818718..e287bf79ce5 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-def.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-def.lua
@@ -45,7 +45,6 @@ specifiers.variants = variants
definers.methods = definers.methods or { }
local internalized = allocate() -- internal tex numbers (private)
-local lastdefined = nil -- we don't want this one to end up in s-tra-02
local loadedfonts = constructors.loadedfonts
local designsizes = constructors.designsizes
@@ -455,10 +454,6 @@ not gain much. By the way, passing id's back to in the callback was
introduced later in the development.</p>
--ldx]]--
-function definers.current() -- or maybe current
- return lastdefined
-end
-
function definers.registered(hash)
local id = internalized[hash]
return id, id and fontdata[id]
@@ -511,7 +506,6 @@ function definers.read(specification,size,id) -- id can be optional, name can al
end
end
end
- lastdefined = tfmdata or id -- todo ! ! ! ! !
if not tfmdata then -- or id?
report_defining( "unknown font %a, loading aborted",specification.name)
elseif trace_defining and type(tfmdata) == "table" then
@@ -533,4 +527,6 @@ end
<p>We overload the <l n='tfm'/> reader.</p>
--ldx]]--
-callbacks.register('define_font', definers.read, "definition of fonts (tfmdata preparation)")
+if not context then
+ callbacks.register('define_font', definers.read, "definition of fonts (tfmdata preparation)")
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-dsp.lua b/Master/texmf-dist/tex/context/base/mkiv/font-dsp.lua
index f8bf6f2c872..3058be37b9a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-dsp.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-dsp.lua
@@ -1473,6 +1473,123 @@ end
-- ValueFormat1 applies to the ValueRecord of the first glyph in each pair. ValueRecords for all first glyphs must use ValueFormat1. If ValueFormat1 is set to zero (0), the corresponding glyph has no ValueRecord and, therefore, should not be repositioned.
-- ValueFormat2 applies to the ValueRecord of the second glyph in each pair. ValueRecords for all second glyphs must use ValueFormat2. If ValueFormat2 is set to null, then the second glyph of the pair is the “next†glyph for which a lookup should be performed.
+-- local simple = {
+-- [true] = { [true] = { true, true }, [false] = { true } },
+-- [false] = { [true] = { false, true }, [false] = { false } },
+-- }
+
+-- function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
+-- local tableoffset = lookupoffset + offset
+-- setposition(f,tableoffset)
+-- local subtype = readushort(f)
+-- local getdelta = fontdata.temporary.getdelta
+-- if subtype == 1 then
+-- local coverage = readushort(f)
+-- local format1 = readushort(f)
+-- local format2 = readushort(f)
+-- local sets = readarray(f)
+-- sets = readpairsets(f,tableoffset,sets,format1,format2,mainoffset,getdelta)
+-- coverage = readcoverage(f,tableoffset + coverage)
+-- local shared = { } -- partial sparse, when set also needs to be handled in the packer
+-- for index, newindex in next, coverage do
+-- local set = sets[newindex+1]
+-- local hash = { }
+-- for i=1,#set do
+-- local value = set[i]
+-- if value then
+-- local other = value[1]
+-- if shared then
+-- local s = shared[value]
+-- if s == nil then
+-- local first = value[2]
+-- local second = value[3]
+-- if first or second then
+-- s = { first, second or nil } -- needs checking
+-- else
+-- s = false
+-- end
+-- shared[value] = s
+-- end
+-- hash[other] = s or nil
+-- else
+-- local first = value[2]
+-- local second = value[3]
+-- if first or second then
+-- hash[other] = { first, second or nil } -- needs checking
+-- else
+-- hash[other] = nil -- what if set, maybe warning
+-- end
+-- end
+-- end
+-- end
+-- coverage[index] = hash
+-- end
+-- return {
+-- shared = shared and true or nil,
+-- format = "pair",
+-- coverage = coverage,
+-- }
+-- elseif subtype == 2 then
+-- local coverage = readushort(f)
+-- local format1 = readushort(f)
+-- local format2 = readushort(f)
+-- local classdef1 = readushort(f)
+-- local classdef2 = readushort(f)
+-- local nofclasses1 = readushort(f) -- incl class 0
+-- local nofclasses2 = readushort(f) -- incl class 0
+-- local classlist = readpairclasssets(f,nofclasses1,nofclasses2,format1,format2,tableoffset,getdelta)
+-- coverage = readcoverage(f,tableoffset+coverage)
+-- classdef1 = readclassdef(f,tableoffset+classdef1,coverage)
+-- classdef2 = readclassdef(f,tableoffset+classdef2,nofglyphs)
+-- local usedcoverage = { }
+-- local shared = { } -- partial sparse, when set also needs to be handled in the packer
+-- for g1, c1 in next, classdef1 do
+-- if coverage[g1] then
+-- local l1 = classlist[c1]
+-- if l1 then
+-- local hash = { }
+-- for paired, class in next, classdef2 do
+-- local offsets = l1[class]
+-- if offsets then
+-- local first = offsets[1]
+-- local second = offsets[2]
+-- if first or second then
+-- if shared then
+-- local s1 = shared[first]
+-- if s1 == nil then
+-- s1 = { }
+-- shared[first] = s1
+-- end
+-- local s2 = s1[second]
+-- if s2 == nil then
+-- s2 = { first, second or nil }
+-- s1[second] = s2
+-- end
+-- hash[paired] = s2
+-- else
+-- hash[paired] = { first, second or nil }
+-- end
+-- else
+-- -- upto the next lookup for this combination
+-- end
+-- end
+-- end
+-- usedcoverage[g1] = hash
+-- end
+-- end
+-- end
+-- return {
+-- shared = shared and true or nil,
+-- format = "pair",
+-- coverage = usedcoverage,
+-- }
+-- elseif subtype == 3 then
+-- report("yet unsupported subtype %a in %a positioning",subtype,"pair")
+-- else
+-- report("unsupported subtype %a in %a positioning",subtype,"pair")
+-- end
+-- end
+
function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs)
local tableoffset = lookupoffset + offset
setposition(f,tableoffset)
@@ -1485,25 +1602,32 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly
local sets = readarray(f)
sets = readpairsets(f,tableoffset,sets,format1,format2,mainoffset,getdelta)
coverage = readcoverage(f,tableoffset + coverage)
+ local shared = { } -- partial sparse, when set also needs to be handled in the packer
for index, newindex in next, coverage do
local set = sets[newindex+1]
local hash = { }
for i=1,#set do
local value = set[i]
if value then
- local other = value[1]
- local first = value[2]
- local second = value[3]
- if first or second then
- hash[other] = { first, second or nil } -- needs checking
- else
- hash[other] = nil -- what if set, maybe warning
+ local other = value[1]
+ local share = shared[value]
+ if share == nil then
+ local first = value[2]
+ local second = value[3]
+ if first or second then
+ share = { first, second or nil } -- needs checking
+ else
+ share = false
+ end
+ shared[value] = share
end
+ hash[other] = share or nil -- really overload ?
end
end
coverage[index] = hash
end
return {
+ shared = shared and true or nil,
format = "pair",
coverage = coverage,
}
@@ -1520,6 +1644,7 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly
classdef1 = readclassdef(f,tableoffset+classdef1,coverage)
classdef2 = readclassdef(f,tableoffset+classdef2,nofglyphs)
local usedcoverage = { }
+ local shared = { } -- partial sparse, when set also needs to be handled in the packer
for g1, c1 in next, classdef1 do
if coverage[g1] then
local l1 = classlist[c1]
@@ -1531,9 +1656,17 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly
local first = offsets[1]
local second = offsets[2]
if first or second then
- hash[paired] = { first, second or nil }
- else
- -- upto the next lookup for this combination
+ local s1 = shared[first]
+ if s1 == nil then
+ s1 = { }
+ shared[first] = s1
+ end
+ local s2 = s1[second]
+ if s2 == nil then
+ s2 = { first, second or nil }
+ s1[second] = s2
+ end
+ hash[paired] = s2
end
end
end
@@ -1542,6 +1675,7 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly
end
end
return {
+ shared = shared and true or nil,
format = "pair",
coverage = usedcoverage,
}
@@ -3025,6 +3159,14 @@ function readers.cpal(f,fontdata,specification)
end
end
+local compress = gzip and gzip.compress
+local compressed = compress and gzip.compressed
+
+-- At some point I will delay loading and only store the offsets (in context lmtx
+-- only).
+
+-- compressed = false
+
function readers.svg(f,fontdata,specification)
local tableoffset = gotodatatable(f,fontdata,"svg",specification.glyphs)
if tableoffset then
@@ -3050,10 +3192,14 @@ function readers.svg(f,fontdata,specification)
for i=1,nofentries do
local entry = entries[i]
setposition(f,entry.offset)
+ local data = readstring(f,entry.length)
+ if compressed and not compressed(data) then
+ data = compress(data)
+ end
entries[i] = {
first = entry.first,
last = entry.last,
- data = readstring(f,entry.length)
+ data = data
}
end
fontdata.svgshapes = entries
@@ -3091,7 +3237,8 @@ function readers.sbix(f,fontdata,specification)
return b.ppem < a.ppem
end
end)
- local glyphs = { }
+ local glyphs = { }
+ local delayed = CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 or fonts.handlers.typethree
for i=1,nofstrikes do
local strike = strikes[i]
local strikeppem = strike.ppem
@@ -3108,13 +3255,28 @@ function readers.sbix(f,fontdata,specification)
local datasize = nextoffset - glyphoffset
if datasize > 0 then
setposition(f,strikeoffset + glyphoffset)
+ local x = readshort(f)
+ local y = readshort(f)
+ local tag = readtag(f) -- or just skip, we never needed it till now
+ local size = datasize - 8
+ local data = nil
+ local offset = nil
+ if delayed then
+ offset = getposition(f)
+ data = nil
+ else
+ data = readstring(f,size)
+ size = nil
+ end
shapes[i] = {
- x = readshort(f),
- y = readshort(f),
- tag = readtag(f), -- maybe for tracing
- data = readstring(f,datasize-8),
- ppem = strikeppem, -- not used, for tracing
- ppi = strikeppi, -- not used, for tracing
+ x = x,
+ y = y,
+ o = offset,
+ s = size,
+ data = data,
+ -- tag = tag, -- maybe for tracing
+ -- ppem = strikeppem, -- not used, for tracing
+ -- ppi = strikeppi, -- not used, for tracing
}
done = done + 1
if done == nofglyphs then
@@ -3316,32 +3478,48 @@ do
local default = { width = 0, height = 0 }
local glyphs = fontdata.glyphs
+ local delayed = CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 or fonts.handlers.typethree
for index, subtable in sortedhash(shapes) do
if type(subtable) == "table" then
local data = nil
+ local size = nil
local metrics = default
local format = subtable.format
local offset = subtable.offsets[index]
setposition(f,offset)
if format == 17 then
metrics = getsmallmetrics(f)
- data = readstring(f,readulong(f))
+ size = true
elseif format == 18 then
metrics = getbigmetrics(f)
- data = readstring(f,readulong(f))
+ size = true
elseif format == 19 then
metrics = subtable.metrics
- data = readstring(f,readulong(f))
+ size = true
else
-- forget about it
end
+ if size then
+ size = readulong(f)
+ if delayed then
+ offset = getposition(f)
+ data = nil
+ else
+ offset = nil
+ data = readstring(f,size)
+ size = nil
+ end
+ else
+ offset = nil
+ end
local x = metrics.width
local y = metrics.height
shapes[index] = {
- -- maybe some metrics
x = x,
y = y,
+ o = offset,
+ s = size,
data = data,
}
-- I'll look into this in more details when needed
@@ -3352,12 +3530,11 @@ do
local height = width * y/x
glyph.boundingbox = { 0, 0, width, height }
end
-
else
shapes[index] = {
x = 0,
y = 0,
- data = "",
+ data = "", -- or just nil
}
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-emp.mklx b/Master/texmf-dist/tex/context/base/mkiv/font-emp.mklx
new file mode 100644
index 00000000000..2bd6f3cf9c2
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-emp.mklx
@@ -0,0 +1,256 @@
+%D \module
+%D [ file=font-emp,
+%D version=20120106, % (moved from font-ini)
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Emphasis,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Font Macros / Emphasis}
+
+\unprotect
+
+%D \macros
+%D {em,emphasistypeface,emphasisboldface}
+%D
+%D The next macro started as a copy of Donald Arseneau's \type {\em} (\TUGNEWS\
+%D Vol.~3, no.~1, 1994). His implementation was a bit more sophisticated version of
+%D the standard \LATEX\ one. We further enhanced the macro, so now it also adapts
+%D itself to boldface mode. Because we favor {\sl slanted} type over {\it italic},
+%D we made the emphasis adaptable, for instance:
+%D
+%D \starttyping
+%D \def\emphasistypeface {\it}
+%D \def\emphasisboldface {\bi}
+%D \stoptyping
+%D
+%D But we prefer:
+%D
+%D \starttyping
+%D \unexpanded\def\emphasistypeface{\sl}
+%D \unexpanded\def\emphasisboldface{\bs}
+%D \stoptyping
+%D
+%D or even better:
+
+\let\m_font_emphasized_typeface\empty
+
+\def\font_emphasis_checked_typeface#slanted#italic%
+ {\edef\m_font_emphasized_typeface{\font_bodyfontvariable\s!em}%
+ \ifx\m_font_emphasized_typeface\v!slanted
+ #slanted%
+ \orelse\ifx\m_font_emphasized_typeface\v!italic
+ #italic%
+ \orelse\ifx\m_font_emphasized_typeface\empty
+ #slanted%
+ \else
+ \csname\m_font_emphasized_typeface\endcsname
+ \fi}
+
+\unexpanded\def\emphasistypeface{\font_emphasis_checked_typeface\sl\it}
+\unexpanded\def\emphasisboldface{\font_emphasis_checked_typeface\bs\bi}
+
+\unexpanded\def\normalboldface % public
+ {\relax
+ \ifx\fontalternative\s!it\bi\orelse
+ \ifx\fontalternative\s!sl\bs\else
+ \bf\fi}
+
+\unexpanded\def\normalitalicface % public
+ {\relax
+ \ifx\fontalternative\s!tf\it\orelse
+ \ifx\fontalternative\s!bf\bi\else
+ \tf\fi}
+
+\unexpanded\def\normalslantedface % public
+ {\relax \ifx\fontalternative\s!tf\sl
+ \orelse\ifx\fontalternative\s!bf\bs
+ \else \tf\fi}
+
+\unexpanded\def\normaltypeface % public
+ {\relax
+ \ifx\fontalternative\s!bi \it \orelse
+ \ifx\fontalternative\s!bs \sl \else
+ \tf \fi}
+
+\unexpanded\def\swaptypeface % public
+ {\relax
+ \ifx\fontalternative\s!it \tf \orelse
+ \ifx\fontalternative\s!sl \tf \orelse
+ \ifx\fontalternative\s!bf \emphasisboldface \orelse
+ \ifx\fontalternative\s!bs \bf \orelse
+ \ifx\fontalternative\s!bi \bf \else
+ \emphasistypeface \fi}
+
+\let\typeface \normaltypeface % public
+\let\boldface \normalboldface % public
+\let\slantedface\normalslantedface % public
+\let\italicface \normalitalicface % public
+\let\swapface \swaptypeface % public
+
+%D To be set with the default body font environment: \type
+%D {em} being \type {slanted} or \type {italic}.
+
+% maybe a \csname...\fontalternative\endcsname
+
+\newconditional\c_font_emphasis_needed
+
+\unexpanded\def\em
+ {\relax
+ \ifdim\slantperpoint>\zeropoint
+ \settrue\c_font_emphasis_needed
+ \else
+ \setfalse\c_font_emphasis_needed
+ \fi
+ \font_emphasis_set_emphasis_boldface % new
+ \ifx\fontalternative\s!it
+ \unexpanded\def\emphasistypeface{\it}\tf
+ \orelse\ifx\fontalternative\s!sl
+ \unexpanded\def\emphasistypeface{\sl}\tf
+ \orelse\ifx\fontalternative\s!bf
+ \emphasisboldface
+ \orelse\ifx\fontalternative\s!bs
+ \unexpanded\def\emphasisboldface{\bs}\bf
+ \orelse\ifx\fontalternative\s!bi
+ \unexpanded\def\emphasisboldface{\bi}\bf
+ \else
+ \emphasistypeface
+ \fi
+ \ifconditional\c_font_emphasis_needed\else
+ \expandafter\aftergroup
+ \fi
+ \emphasiscorrection}
+
+%D The next feature was not present in previous versions. It
+%D takes care of \type {\em \bf ...} situations.
+
+\let\font_emphasis_saved_emphasis_boldface\relax
+
+\def\font_emphasis_set_emphasis_boldface
+ {\let\font_emphasis_saved_emphasis_boldface\bf
+ \let\font_emphasis_set_emphasis_boldface\relax
+ \let\bf\font_emphasis_bold_bold}
+
+\unexpanded\def\font_emphasis_bold_bold
+ {%\relax
+ \let\bf\relax % new
+ \ifx\fontalternative\s!it
+ \bi
+ \orelse\ifx\fontalternative\s!sl
+ \bs
+ \else
+ \font_emphasis_saved_emphasis_boldface
+ \fi
+ \let\bf\font_emphasis_saved_emphasis_boldface}
+
+%D Donald's (adapted) macros take the next character into account when placing
+%D italic correction. As a bonus we also look for something that looks like a dash,
+%D in which case we don't correct.
+
+\let\italiccorrection=\/ % tex primitive
+
+\def\emphasiscorrection % public, not in raw alignment groups, else omit problem
+ {\ifhmode\ifnum\currentgrouptype=\aligngroupcode\else
+ \expandafter\expandafter\expandafter\font_emphasis_look
+ \fi\fi}
+
+\def\font_emphasis_look
+ {\begingroup
+ \futurelet\nexttoken\font_emphasis_test}
+
+\def\font_emphasis_test
+ {\ifcat\noexpand\nexttoken,% we can do better in luatex ... some day ...
+ \expandafter\font_emphasis_a
+ \else
+ \expandafter\font_emphasis_b
+ \fi}
+
+\def\font_emphasis_a
+ {\futurelet\nexttoken\font_emphasis_correction}
+
+\def\font_emphasis_correction
+ {\setbox\scratchbox\hbox{\nexttoken}% tricky as next can be a macro
+ \ifzeropt\ht\scratchbox % probably a space
+ \expandafter\font_emphasis_b
+ \orelse\ifdim\ht\scratchbox<.3\exheight
+ \expandafter\expandafter\expandafter\endgroup
+ \else
+ \expandafter\expandafter\expandafter\font_emphasis_b
+ \fi}
+
+\def\font_emphasis_b
+ {\scratchskip\lastskip
+ \ifzeropt\scratchskip
+ \italiccorrection\relax
+ \else
+ \unskip\italiccorrection\hskip\scratchskip
+ \fi
+ \endgroup}
+
+%D We end with some examples which show the behavior when some punctuation is met.
+%D We also show how the mechanism adapts itself to bold, italic and slanted typing.
+%D
+%D \startbuffer
+%D test {test}test \par
+%D test {\sl test}test \par
+%D test {\em test}test \par
+%D test {\em test}--test \par
+%D
+%D test {test}, test \par
+%D test {\em test}, test \par
+%D
+%D test {\em test {\em test {\em test} test} test} test \par
+%D test {\bf test {\em test {\em test} test} test} test \par
+%D test {\sl test {\em test {\em test} test} test} test \par
+%D test {\it test {\em test {\em test} test} test} test \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D We get:
+%D
+%D \startpacked
+%D \getbuffer
+%D \stoppacked
+
+%D \macros
+%D {emphbf,emphit,emphsl,emphtf}
+%D
+%D The next emphasis alternatives are for \THANH. They adapt their style as good as
+%D possible. These macros are obsolete in \MKIV.
+
+% \unexpanded\def\emphbf{\groupedcommand{\bf\def\emphit{\bi}\def\emphsl{\bs}}{}}
+% \unexpanded\def\emphit{\groupedcommand{\it\def\emphbf{\bi}\def\emphsl{\sl}}{}}
+% \unexpanded\def\emphsl{\groupedcommand{\sl\def\emphbf{\bs}\def\emphit{\it}}{}}
+% \unexpanded\def\emphtf{\groupedcommand{\tf\def\emphbf{\bf}\def\emphit{\it}\def\emphsl{\sl}}{}}
+% \unexpanded\def\emph {\groupedcommand{\em}{}}
+
+\unexpanded\def\font_emphasis_bf{\bf\def\emphit{\bi}\def\emphsl{\bs}}
+\unexpanded\def\font_emphasis_it{\it\def\emphbf{\bi}\def\emphsl{\sl}}
+\unexpanded\def\font_emphasis_sl{\sl\def\emphbf{\bs}\def\emphit{\it}}
+\unexpanded\def\font_emphasis_tf{\tf\def\emphbf{\bf}\def\emphit{\it}\def\emphsl{\sl}}
+
+\unexpanded\def\emphbf{\triggergroupedcommandcs\font_emphasis_bf}
+\unexpanded\def\emphit{\triggergroupedcommandcs\font_emphasis_it}
+\unexpanded\def\emphsl{\triggergroupedcommandcs\font_emphasis_sl}
+\unexpanded\def\emphtf{\triggergroupedcommandcs\font_emphasis_tf}
+\unexpanded\def\emph {\triggergroupedcommandcs\em}
+
+\unexpanded\def\emphasized{\bgroup\em\let\nexttoken}
+
+%D \startbuffer
+%D TEXT {\emphbf text \emphit text \emphtf text \emphsl text} TEXT
+%D TEXT \emphbf{text \emphit{text} \emphtf{text} \emphsl{text}} TEXT
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-emp.mkvi b/Master/texmf-dist/tex/context/base/mkiv/font-emp.mkvi
index b5c09d4c265..38305abeff4 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-emp.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-emp.mkvi
@@ -18,13 +18,11 @@
%D \macros
%D {em,emphasistypeface,emphasisboldface}
%D
-%D The next macro started as a copy of Donald Arseneau's
-%D \type{\em} (\TUGNEWS\ Vol.~3, no.~1, 1994). His
-%D implementation was a bit more sophisticated version of the
-%D standard \LATEX\ one. We further enhanced the macro, so now
-%D it also adapts itself to boldface mode. Because we favor
-%D {\sl slanted} type over {\it italic}, we made the emphasis
-%D adaptable, for instance:
+%D The next macro started as a copy of Donald Arseneau's \type {\em} (\TUGNEWS\
+%D Vol.~3, no.~1, 1994). His implementation was a bit more sophisticated version of
+%D the standard \LATEX\ one. We further enhanced the macro, so now it also adapts
+%D itself to boldface mode. Because we favor {\sl slanted} type over {\it italic},
+%D we made the emphasis adaptable, for instance:
%D
%D \starttyping
%D \def\emphasistypeface {\it}
@@ -148,10 +146,9 @@
\fi\fi
\let\bf\font_emphasis_saved_emphasis_boldface}
-%D Donald's (adapted) macros take the next character into
-%D account when placing italic correction. As a bonus we also
-%D look for something that looks like a dash, in which case we
-%D don't correct.
+%D Donald's (adapted) macros take the next character into account when placing
+%D italic correction. As a bonus we also look for something that looks like a dash,
+%D in which case we don't correct.
\let\italiccorrection=\/ % tex primitive
@@ -176,7 +173,7 @@
\def\font_emphasis_correction
{\setbox\scratchbox\hbox{\nexttoken}% tricky as next can be a macro
- \ifdim\ht\scratchbox=\zeropoint % probably a space
+ \ifzeropt\ht\scratchbox % probably a space
\expandafter\font_emphasis_b
\else\ifdim\ht\scratchbox<.3\exheight
\expandafter\expandafter\expandafter\endgroup
@@ -186,16 +183,15 @@
\def\font_emphasis_b
{\scratchskip\lastskip
- \ifdim\scratchskip=\zeropoint\relax % == \ifzeropt\scratchskip
+ \ifzeropt\scratchskip
\italiccorrection\relax
\else
\unskip\italiccorrection\hskip\scratchskip
\fi
\endgroup}
-%D We end with some examples which show the behavior when
-%D some punctuation is met. We also show how the mechanism
-%D adapts itself to bold, italic and slanted typing.
+%D We end with some examples which show the behavior when some punctuation is met.
+%D We also show how the mechanism adapts itself to bold, italic and slanted typing.
%D
%D \startbuffer
%D test {test}test \par
@@ -223,9 +219,8 @@
%D \macros
%D {emphbf,emphit,emphsl,emphtf}
%D
-%D The next emphasis alternatives are for \THANH. They adapt
-%D their style as good as possible. These macros are obsolete
-%D in \MKIV.
+%D The next emphasis alternatives are for \THANH. They adapt their style as good as
+%D possible. These macros are obsolete in \MKIV.
% \unexpanded\def\emphbf{\groupedcommand{\bf\def\emphit{\bi}\def\emphsl{\bs}}{}}
% \unexpanded\def\emphit{\groupedcommand{\it\def\emphbf{\bi}\def\emphsl{\sl}}{}}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-enc.lua b/Master/texmf-dist/tex/context/base/mkiv/font-enc.lua
index f448685a69a..608539c59ad 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-enc.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-enc.lua
@@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['font-enc'] = {
-- this module is obsolete
-local next = next
+local next, rawget = next, rawget
local match, gmatch, gsub = string.match, string.gmatch, string.gsub
local setmetatableindex = table.setmetatableindex
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-fbk.lua b/Master/texmf-dist/tex/context/base/mkiv/font-fbk.lua
index 122e43ddc71..b6c9a430ddf 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-fbk.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-fbk.lua
@@ -189,6 +189,7 @@ local function composecharacters(tfmdata)
chr_t,
}
end
+t.depth = a_ury
elseif c_ury > a_lly then -- messy test
local dy
if compose then
@@ -219,6 +220,7 @@ local function composecharacters(tfmdata)
else
dy = - deltaxheight + extraxheight
end
+t.height = a_ury-dy
local right = rightcommand[dx+dd]
local down = downcommand[dy]
if trace_visualize then
@@ -245,6 +247,7 @@ local function composecharacters(tfmdata)
chr_t,
}
end
+t.height = a_ury
end
end
else
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-fea.mkvi b/Master/texmf-dist/tex/context/base/mkiv/font-fea.mkvi
index 4a5356090e9..3737632fe2e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-fea.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-fea.mkvi
@@ -137,11 +137,14 @@
\def\font_basics_features_list[#name][#separator]% todo: arg voor type
{\clf_featurelist{#name}{\detokenize{#separator}}}
-\attribute\zerocount\zerocount % first in list, so fast match
-
-\prependtoks
- \attribute\zerocount\attributeunsetvalue % new per 2017-08-30
-\to \t_attr_list_local
+\ifcase\contextlmtxmode
+ \attribute\zerocount\zerocount
+ \def\font_dynamic_value{\attribute\zerocount}
+\else
+ \attribute\zerocount\attributeunsetvalue
+ \glyphdatafield\zerocount
+ \let\font_dynamic_value\glyphdatafield
+\fi
% beware: these are global features on top of existing font features
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-fil.mklx b/Master/texmf-dist/tex/context/base/mkiv/font-fil.mklx
new file mode 100644
index 00000000000..6cc25db1036
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-fil.mklx
@@ -0,0 +1,422 @@
+%D \module
+%D [ file=font-fil,
+%D version=2011.01.13, % (copied fron font-ini)
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Classes and Files,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Font Macros / Classes and Files}
+
+\unprotect
+
+%D Personally I think that using \TEX\ macro packages is complicated by the way
+%D fonts are handled. Apart from the many encodings, we also deal with different
+%D naming schemes. Confronted with this problem, I decided to change the definitions
+%D into:
+%D
+%D \starttyping
+%D \definebodyfont [12pt] [rm] [tf=Times-Roman at 12pt]
+%D \stoptyping
+%D
+%D combined with for instance:
+%D
+%D \starttyping
+%D \definefontsynonym [Times-Roman] [tir]
+%D \stoptyping
+
+% \definetypeface[palatino][rm][serif][palatino,allbold][default]
+%
+% \startfontclass[palatino]
+% \definefontsynonym [Serif] [SerifBold]
+% \definefontsynonym [SerifItalic] [SerifBoldItalic]
+% \definefontsynonym [SerifSlanted] [SerifBoldSlanted]
+% \definefontsynonym [SerifCaps] [SerifBold]
+% \stopfontclass
+%
+% \setupbodyfont[palatino]
+
+\unexpanded\def\startfontclass
+ {\dosingleempty\font_basics_start_font_class}
+
+\def\font_basics_start_font_class[#class]%
+ {\push_macro_fontclass
+ \doifelse{#class}\v!each
+ {\let\fontclass\empty}
+ {\doifsomething{#class}{\def\fontclass{#class}}}}
+
+\unexpanded\def\stopfontclass
+ {\pop_macro_fontclass}
+
+\def\classfont#class#name{#class#name} % \definefont[whatever][\classfont{xx}{yy} at 10pt]
+
+%D \macros
+%D {definefontsynonym, doifelsefontsynonym,
+%D expandfontsynonym, truefontname, truefontdata}
+%D
+%D While looking for fonts, fontsynonyms are used for accessing
+%D the files!
+%D
+%D \starttyping
+%D \definefontsynonym[Serif][Lucida-Bright]
+%D \definefontsynonym[Lucida-Bright][lbr][encoding=texnansi]
+%D \stoptyping
+
+\installcorenamespace {fontfile} % file synonyms
+
+\let\m_font_name\empty
+\let\m_font_file\empty
+
+\def \defaultfontfile{\truefontname{Normal}} % was cmtt10, but that one is gone
+\edef\nullfontname {\fontname\nullfont}
+
+\unexpanded\def\definefontsynonym[#name]#crap[#file]%
+ {\edef\m_font_name{#name}%
+ \edef\m_font_file{#file}%
+ \ifx\fontclass\empty
+ \expandafter\font_basics_define_font_synonym_nop
+ \else
+ \expandafter\font_basics_define_font_synonym_yes
+ \fi}
+
+\unexpanded\def\font_basics_define_font_synonym_nop
+ {\expandafter\let\csname\??fontfile\m_font_name\endcsname\m_font_file
+ \doifelsenextoptionalcs\font_basics_define_font_synonym_nop_opt\font_basics_define_font_synonym_nop_nil}
+
+\unexpanded\def\font_basics_define_font_synonym_yes
+ {\expandafter\let\csname\??fontfile\fontclass\m_font_name\endcsname\m_font_file
+ \doifelsenextoptionalcs\font_basics_define_font_synonym_yes_opt\font_basics_define_font_synonym_yes_nil}
+
+\unexpanded\def\edefinefontsynonym[#name]#crap[#file]%
+ {\edef\m_font_name{#name}%
+ \edef\m_font_file{#file}%
+ \ifx\fontclass\empty
+ \expandafter\font_basics_define_font_synonym_nop_expanded
+ \else
+ \expandafter\font_basics_define_font_synonym_yes_expanded
+ \fi}
+
+\unexpanded\def\font_basics_define_font_synonym_nop_expanded#crap[#spec]%
+ {\expandafter\let\csname\??fontfile\m_font_name\endcsname\m_font_file
+ \normalexpanded{\font_basics_define_font_synonym_nop_opt[#1]}}
+
+\unexpanded\def\font_basics_define_font_synonym_yes_expanded#crap[#spec]%
+ {\expandafter\let\csname\??fontfile\fontclass\m_font_name\endcsname\m_font_file
+ \normalexpanded{\font_basics_define_font_synonym_yes_opt[#spec]}}
+
+\unexpanded\def\font_basics_define_font_synonym_nop_opt[#specification]%
+ {\let\p_features \undefined
+ \let\p_fallbacks \undefined
+ \let\p_goodies \undefined
+ \let\p_designsize\undefined
+ \expandafter\font_basics_get_font_parameter_nop#specification,]=,}
+
+\unexpanded\def\font_basics_define_font_synonym_yes_opt[#specification]%
+ {\let\p_features \undefined
+ \let\p_fallbacks \undefined
+ \let\p_goodies \undefined
+ \let\p_designsize\undefined
+ \expandafter\font_basics_get_font_parameter_yes#specification,]=,}
+
+% todo: check if we can use \edef but then we need to protect \mathsizesuffix .. in fact that
+% can be default then: \let\mathsizesuffix\relax .. i need to play with it first
+
+\def\font_basics_get_font_parameter_nop#key=#value,%
+ {\if]#key%
+ \font_basics_get_font_parameter_nop_finish
+ \else
+ \expandafter\normaldef\csname p_#key\endcsname{#value}% % no edef as we need to keep \mathsizesuffix
+ \expandafter\font_basics_get_font_parameter_nop
+ \fi}
+
+\def\font_basics_get_font_parameter_yes#key=#value,%
+ {\if]#key%
+ \font_basics_get_font_parameter_yes_finish
+ \else
+ \expandafter\normaldef\csname p_#key\endcsname{#value}% % no edef as we need to keep \mathsizesuffix
+ \expandafter\font_basics_get_font_parameter_yes
+ \fi}
+
+% helpers, some day these will be toks and counts
+
+% \def\fntsetdefname {\glet\somefontname\defaultfontfile}
+% \def\fntsetsomename{\gdef\somefontname} % takes argument
+% \def\fntsetnopsize {\let\somefontsize\empty}
+% \def\fntsetsomesize{\def\somefontsize} % takes argument
+
+% happens later, else mkvi parsing gets into troubles
+
+% end of helpers
+
+% we could collect them in one macro (but no expansion)
+
+\def\font_basics_define_font_synonym_nop_nil
+ {\expandafter\let\csname\??fontfile\m_font_name\s!features \endcsname\undefined
+ \expandafter\let\csname\??fontfile\m_font_name\s!fallbacks \endcsname\undefined
+ \expandafter\let\csname\??fontfile\m_font_name\s!goodies \endcsname\undefined
+ \expandafter\let\csname\??fontfile\m_font_name\s!designsize\endcsname\undefined}
+
+\def\font_basics_define_font_synonym_yes_nil
+ {\expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!features \endcsname\undefined
+ \expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!fallbacks \endcsname\undefined
+ \expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!goodies \endcsname\undefined
+ \expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!designsize\endcsname\undefined}
+
+\def\font_basics_get_font_parameter_nop_finish
+ {\expandafter\let\csname\??fontfile\m_font_name\s!features \endcsname\p_features
+ \expandafter\let\csname\??fontfile\m_font_name\s!fallbacks \endcsname\p_fallbacks
+ \expandafter\let\csname\??fontfile\m_font_name\s!goodies \endcsname\p_goodies
+ \expandafter\let\csname\??fontfile\m_font_name\s!designsize\endcsname\p_designsize}
+
+\def\font_basics_get_font_parameter_yes_finish
+ {\expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!features \endcsname\p_features
+ \expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!fallbacks \endcsname\p_fallbacks
+ \expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!goodies \endcsname\p_goodies
+ \expandafter\glet\csname\??fontfile\fontclass\m_font_name\s!designsize\endcsname\p_designsize}
+
+%\definefontsynonym [KopFont] [\fontclassname{officina}{SerifBold}]
+%
+%\defineclassfontsynonym [KopFont] [officina] [SerifBold]
+
+\unexpanded\def\defineclassfontsynonym
+ {\dotripleargument\font_basics_define_class_font_synonym}
+
+%\definefontsynonym[#tag][\fontclassname{#class}{#fileortag}]}
+
+\def\font_basics_define_class_font_synonym[#tag][#class][#fileortag]% needs testing
+ {\expandafter\normaldef\csname\??fontfile\fontclass#tag\endcsname{\fontclassname{#class}{#fileortag}}%
+ \font_basics_define_font_synonym_yes_nil}
+
+\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater
+
+\unexpanded\def\setupfontsynonym
+ {\dodoubleempty\dosetupfontsynonym}
+
+\def\dosetupfontsynonym[#name][#settings]% not yet supported, will do when needed
+ {}
+
+% todo: replace * by ... less messy with features
+
+\def\truefontname#name%
+ {\expandafter\font_helpers_true_fontname#name*\empty*\relax}
+
+\def\font_helpers_true_fontname#name*#first#rest*#crap\relax
+ {\ifcsname\??fontfile\fontclass#name\endcsname
+ \ifx#first\empty
+ %\expandafter\truefontname\csname\??fontfile\fontclass#name\endcsname
+ \expandafter\truefontname\lastnamedcs
+ \else
+ %\expandafter\font_helpers_true_fontname_check\csname\??fontfile\fontclass#name\endcsname*#first#rest%
+ \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest%
+ \fi
+ \orelse\ifcsname\??fontfile\defaultfontclass#name\endcsname
+ \ifx#first\empty
+ %\expandafter\truefontname\csname\??fontfile\defaultfontclass#name\endcsname
+ \expandafter\truefontname\lastnamedcs
+ \else
+ %\expandafter\font_helpers_true_fontname_check\csname\??fontfile\defaultfontclass#name\endcsname*#first#rest%
+ \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest%
+ \fi
+ \orelse\ifcsname\??fontfile#name\endcsname
+ \ifx#first\empty
+ %\expandafter\truefontname\csname\??fontfile#name\endcsname
+ \expandafter\truefontname\lastnamedcs
+ \else
+ %\expandafter\font_helpers_true_fontname_check\csname\??fontfile#name\endcsname*#first#rest%
+ \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest%
+ \fi
+ \else
+ #name\ifx#first\empty\else*#first#rest\fi
+ \fi}
+
+\def\font_helpers_true_fontname_check#name%
+ {\expandafter\font_helpers_true_fontname_check_indeed#name*\relax}
+
+\def\font_helpers_true_fontname_check_indeed#name*#crap\relax
+ {\ifcsname\??fontfile\fontclass#name\endcsname
+ %\expandafter\font_helpers_true_fontname_check\csname\??fontfile\fontclass#name\endcsname
+ \expandafter\font_helpers_true_fontname_check\lastnamedcs
+ \orelse\ifcsname\??fontfile\defaultfontclass#name\endcsname
+ %\expandafter\font_helpers_true_fontname_check\csname\??fontfile\defaultfontclass#name\endcsname
+ \expandafter\font_helpers_true_fontname_check\lastnamedcs
+ \orelse\ifcsname\??fontfile#name\endcsname
+ %\expandafter\font_helpers_true_fontname_check\csname\??fontfile#name\endcsname
+ \expandafter\font_helpers_true_fontname_check\lastnamedcs
+ \else
+ #name%
+ \fi}
+
+% ok when the last lookup is not stripped .. we need to be able to define synonyms for symbols
+%
+% \def\truefontname#name%
+% %{\normalexpanded{\noexpand\font_helpers_true_fontname{\clf_truefontname{#name}}}}
+% {\expandafter\expandafter\expandafter\font_helpers_true_fontname\expandafter\expandafter\expandafter{\clf_truefontname{#name}}}
+%
+% \def\font_helpers_true_fontname#name%
+% {\ifcsname\??fontfile\fontclass#name\endcsname
+% \expandafter\font_helpers_true_fontname\expandafter{\lastnamedcs}%
+% \orelse\ifcsname\??fontfile\defaultfontclass#name\endcsname
+% \expandafter\font_helpers_true_fontname\expandafter{\lastnamedcs}%
+% \orelse\ifcsname\??fontfile#name\endcsname
+% \expandafter\font_helpers_true_fontname\expandafter{\lastnamedcs}%
+% \else
+% % \clf_truefontname{#name}%
+% #name% so the last one can have features !
+% \fi}
+
+\def\expandfontsynonym#command#name% one level expansion
+ {\ifcsname\??fontfile\fontclass#name\endcsname
+ %\expandafter\normaldef\expandafter#command\expandafter{\csname\??fontfile\fontclass#name\endcsname}%
+ \expandafter\normaldef\expandafter#command\expandafter{\lastnamedcs}%
+ \orelse\ifcsname\??fontfile\defaultfontclass#2\endcsname
+ %\expandafter\normaldef\expandafter#command\expandafter{\csname\??fontfile\defaultfontclass#name\endcsname}%
+ \expandafter\normaldef\expandafter#command\expandafter{\lastnamedcs}%
+ \fi}
+
+\def\doifelsefontsynonym#name%
+ {\ifcsname\??fontfile\fontclass#name\endcsname
+ \expandafter\firstoftwoarguments
+ \orelse\ifcsname\??fontfile\defaultfontclass#name\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doiffontsynonymelse\doifelsefontsynonym
+
+%D \macros
+%D {tracedfontname}
+%D
+%D A goody:
+
+\def\tracedfontname#name%
+ {#name\ifcsname\??fontfile\fontclass#name\endcsname
+ %\expandafter\tracedfontname\csname\??fontfile\fontclass#name\endcsname
+ \expandafter\tracedfontname\lastnamedcs
+ \orelse\ifcsname\??fontfile#name\endcsname
+ %\expandafter\tracedfontname\csname\??fontfile#name\endcsname
+ \expandafter\tracedfontname\lastnamedcs
+ \fi}
+
+%D \macros
+%D {fontclass, defaultfontclass}
+%D
+%D The fontclass model was introduced a while after we implement the basic font
+%D model and at that time we still defaulted to no model at all. Nowadays we default
+%D to the \type {modern} fontclass.
+
+\let\fontclass \empty
+\let\defaultfontclass\empty
+
+\def\fontclassname#class#name% tricky ... no lastnamedcs here due to nesting
+ {\ifcsname\??fontfile#class#name\endcsname
+ \fontclassname{#class}{\csname\??fontfile#class#name\endcsname}%
+ \orelse\ifcsname\??fontfile#name\endcsname
+ \fontclassname{#class}{\csname\??fontfile#name\endcsname}%
+ \else
+ #2%
+ \fi}
+
+\installmacrostack\fontclass
+
+%D Files or names can have properties and these need to be consulted at some point.
+%D They can inherit them.
+
+% Why these expanded and rscale not ... maybe not worth the trouble (delayed
+% expansion actually would be better i.e. macros in feature specs). Test
+% without pre-expansion.
+
+\def\font_helpers_update_font_class_parameters
+ {\edef\m_font_class_direction {\begincsname\??fontclass\fontclass\fontstyle\s!direction \endcsname}%
+ \edef\m_font_class_features {\begincsname\??fontclass\fontclass\fontstyle\s!features \endcsname}%
+ \edef\m_font_class_fallbacks {\begincsname\??fontclass\fontclass\fontstyle\s!fallbacks \endcsname}%
+ \edef\m_font_class_goodies {\begincsname\??fontclass\fontclass\fontstyle\s!goodies \endcsname}%
+ \edef\m_font_class_designsize{\begincsname\??fontclass\fontclass\fontstyle\s!designsize\endcsname}}
+
+% resolve
+
+\def\font_helpers_set_features_yes#name%
+ {\ifcsname\??fontfile\fontclass#name\s!features\endcsname \edef\m_font_features{\lastnamedcs}\orelse % class + symbolic_name
+ \ifcsname\??fontfile #name\s!features\endcsname \edef\m_font_features{\lastnamedcs}\orelse % symbolic_name
+ \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_features_yes\lastnamedcs \orelse % class + parent_name
+ \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_features_yes\lastnamedcs \else % parent_name
+ \let\m_font_features\empty\fi}
+
+\def\font_helpers_set_fallbacks_yes#name%
+ {\ifcsname\??fontfile\fontclass#name\s!fallbacks\endcsname \edef\m_font_fallbacks{\lastnamedcs}\orelse
+ \ifcsname\??fontfile #name\s!fallbacks\endcsname \edef\m_font_fallbacks{\lastnamedcs}\orelse
+ \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_fallbacks_yes\lastnamedcs \orelse
+ \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_fallbacks_yes\lastnamedcs \else
+ \let\m_font_fallbacks\empty\fi}
+
+\def\font_helpers_set_goodies_yes#name%
+ {\ifcsname\??fontfile\fontclass#name\s!goodies \endcsname \edef\m_font_goodies{\lastnamedcs}\orelse
+ \ifcsname\??fontfile #name\s!goodies \endcsname \edef\m_font_goodies{\lastnamedcs}\orelse
+ \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_goodies_yes\lastnamedcs \orelse
+ \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_goodies_yes\lastnamedcs \else
+ \let\m_font_goodies\empty\fi}
+
+\def\font_helpers_set_designsize_yes#name%
+ {\ifcsname\??fontfile\fontclass#name\s!designsize\endcsname \edef\m_font_designsize{\lastnamedcs}\orelse
+ \ifcsname\??fontfile #name\s!designsize\endcsname \edef\m_font_designsize{\lastnamedcs}\orelse
+ \ifcsname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_set_designsize_yes\lastnamedcs \orelse
+ \ifcsname\??fontfile #name\endcsname \expandafter\font_helpers_set_designsize_yes\lastnamedcs \else
+ \let\m_font_designsize\empty\fi}
+
+\def\font_helpers_set_features_nop#name%
+ {\ifcsname\??fontfile#name\s!features\endcsname \edef\m_font_features{\lastnamedcs}\orelse
+ \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_features_nop\lastnamedcs \else
+ \let\m_font_features\empty\fi}
+
+\def\font_helpers_set_fallbacks_nop#name%
+ {\ifcsname\??fontfile#name\s!fallbacks\endcsname \edef\m_font_fallbacks{\lastnamedcs}\orelse
+ \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_fallbacks_nop\lastnamedcs \else
+ \let\m_font_fallbacks\empty\fi}
+
+\def\font_helpers_set_goodies_nop#name%
+ {\ifcsname\??fontfile#name\s!goodies\endcsname \edef\m_font_goodies{\lastnamedcs}\orelse
+ \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_goodies_nop\lastnamedcs \else
+ \let\m_font_goodies\empty\fi}
+
+\def\font_helpers_set_designsize_nop#name%
+ {\ifcsname\??fontfile#name\s!designsize\endcsname \edef\m_font_designsize{\lastnamedcs}\orelse
+ \ifcsname\??fontfile#name\endcsname \expandafter\font_helpers_set_designsize_nop\lastnamedcs \else
+ \let\m_font_designsize\empty\fi}
+
+\def\font_helpers_update_font_parameters_yes
+ {\font_helpers_set_features_yes \somefontname
+ \font_helpers_set_fallbacks_yes \somefontname
+ \font_helpers_set_goodies_yes \somefontname
+ \font_helpers_set_designsize_yes\somefontname}
+
+\def\font_helpers_update_font_parameters_nop
+ {\font_helpers_set_features_nop \somefontname
+ \font_helpers_set_fallbacks_nop \somefontname
+ \font_helpers_set_goodies_nop \somefontname
+ \font_helpers_set_designsize_nop\somefontname}
+
+\def\font_helpers_update_font_parameters
+ {\ifx\fontclass\empty\font_helpers_update_font_parameters_nop\else\font_helpers_update_font_parameters_yes\fi}
+
+\installcorenamespace{fontclass}
+
+% we can pack them (don't use \setxvalue!)
+
+\unexpanded\def\savefontclassparameters#style#rscale#features#fallbacks#goodies#designsize#direction%
+ {\letgvalue{\??fontclass\fontclass#style\s!rscale }#rscale%
+ \letgvalue{\??fontclass\fontclass#style\s!features }#features%
+ \letgvalue{\??fontclass\fontclass#style\s!fallbacks }#fallbacks%
+ \letgvalue{\??fontclass\fontclass#style\s!goodies }#goodies%
+ \letgvalue{\??fontclass\fontclass#style\s!designsize}#designsize%
+ \letgvalue{\??fontclass\fontclass#style\s!direction }#direction}% math
+
+% bonus
+
+\let\currentfontinstancespec\clf_currentfontinstancespec % expandable
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-fil.mkvi b/Master/texmf-dist/tex/context/base/mkiv/font-fil.mkvi
index ae83ef4c4f4..8622e733f3d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-fil.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-fil.mkvi
@@ -15,11 +15,10 @@
\unprotect
-%D Personally I think that using \TEX\ macro packages is
-%D complicated by the way fonts are handled. Apart from the
-%D many encodings, we also deal with different naming schemes.
-%D Confronted with this problem, I decided to change the
-%D definitions into:
+%D Personally I think that using \TEX\ macro packages is complicated by the way
+%D fonts are handled. Apart from the many encodings, we also deal with different
+%D naming schemes. Confronted with this problem, I decided to change the definitions
+%D into:
%D
%D \starttyping
%D \definebodyfont [12pt] [rm] [tf=Times-Roman at 12pt]
@@ -307,10 +306,9 @@
%D \macros
%D {fontclass, defaultfontclass}
%D
-%D The fontclass model was introduced a while after we implement
-%D the basic font model and at that time we still defaulted to
-%D no model at all. Nowadays we default to the \type {modern}
-%D fontclass.
+%D The fontclass model was introduced a while after we implement the basic font
+%D model and at that time we still defaulted to no model at all. Nowadays we default
+%D to the \type {modern} fontclass.
\let\fontclass \empty
\let\defaultfontclass\empty
@@ -326,8 +324,8 @@
\installmacrostack\fontclass
-%D Files or names can have properties and these need to be consulted
-%D at some point. They can inherit them.
+%D Files or names can have properties and these need to be consulted at some point.
+%D They can inherit them.
% Why these expanded and rscale not ... maybe not worth the trouble (delayed
% expansion actually would be better i.e. macros in feature specs). Test
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-imp-dimensions.lua b/Master/texmf-dist/tex/context/base/mkiv/font-imp-dimensions.lua
index a7125625da7..24891a2cdf3 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-imp-dimensions.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-imp-dimensions.lua
@@ -48,13 +48,42 @@ local function initialize(tfmdata,key,value)
elseif value == "mono" then
newwidth = emwidth
else
+ -- there are fonts out there with no x_height ...
local spec = settings_to_array(value)
- newwidth = tonumber(spec[1])
- newheight = tonumber(spec[2])
- newdepth = tonumber(spec[3])
- if newwidth then newwidth = newwidth * emwidth end
- if newheight then newheight = newheight * exheight end
- if newdepth then newdepth = newdepth * exheight end
+ newwidth = spec[1]
+ newheight = spec[2]
+ newdepth = spec[3]
+ local quad = parameters.quad or 0
+ local ascender = parameters.ascender or 0
+ local descender = parameters.descender or 0
+ if newwidth == "max" then
+ newwidth = quad
+ else
+ newwidth = tonumber(newwidth)
+ if newwidth then
+ newwidth = newwidth * emwidth
+ end
+ end
+ if newheight == "max" then
+ newheight = ascender
+ else
+ newheight = tonumber(newheight)
+ if newheight then
+ newheight = newheight * exheight
+ end
+ end
+ if newdepth == "max" then
+ newdepth = descender
+ else
+ newdepth = tonumber(newdepth)
+ if newdepth then
+ newdepth = newdepth * exheight
+ end
+ end
+ if parameters.x_heigth == 0 then
+ -- maybe a fourth parameter
+ parameters.x_heigth = (ascender + descender) / 2
+ end
end
if newwidth or newheight or newdepth then
for unicode, character in next, characters do
@@ -107,7 +136,7 @@ end
registerotffeature {
name = "realdimensions",
- description = "accept negative dimenions",
+ description = "accept negative dimensions",
initializers = {
base = initialize,
node = initialize,
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-imp-properties.lua b/Master/texmf-dist/tex/context/base/mkiv/font-imp-properties.lua
index 5805235b780..21b55aeb2b0 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-imp-properties.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-imp-properties.lua
@@ -35,7 +35,6 @@ local constructors = fonts.constructors
local getprivate = constructors.getprivate
local allocate = utilities.storage.allocate
-local family_font = node.family_font
local setmetatableindex = table.setmetatableindex
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-imp-quality.lua b/Master/texmf-dist/tex/context/base/mkiv/font-imp-quality.lua
index 01f0afe6309..053a2562f9b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-imp-quality.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-imp-quality.lua
@@ -9,8 +9,6 @@ if not modules then modules = { } end modules ['font-imp-quality'] = {
if not context then return end
local next, type, tonumber = next, type, tonumber
-local byte = string.byte
-local insert = table.insert
local fonts = fonts
local utilities = utilities
@@ -65,26 +63,63 @@ local vectors = expansions.vectors or allocate()
expansions.classes = classes
expansions.vectors = vectors
--- beware, pdftex itself uses percentages * 10
---
--- todo: get rid of byte() here
-
-classes.preset = { stretch = 2, shrink = 2, step = .5, factor = 1 }
+classes.preset = {
+ stretch = 2,
+ shrink = 2,
+ step = .5,
+ factor = 1,
+}
classes['quality'] = {
- stretch = 2, shrink = 2, step = .5, vector = 'default', factor = 1
+ stretch = 2,
+ shrink = 2,
+ step = .5,
+ vector = 'default',
+ factor = 1,
}
vectors['default'] = {
- [byte('A')] = 0.5, [byte('B')] = 0.7, [byte('C')] = 0.7, [byte('D')] = 0.5, [byte('E')] = 0.7,
- [byte('F')] = 0.7, [byte('G')] = 0.5, [byte('H')] = 0.7, [byte('K')] = 0.7, [byte('M')] = 0.7,
- [byte('N')] = 0.7, [byte('O')] = 0.5, [byte('P')] = 0.7, [byte('Q')] = 0.5, [byte('R')] = 0.7,
- [byte('S')] = 0.7, [byte('U')] = 0.7, [byte('W')] = 0.7, [byte('Z')] = 0.7,
- [byte('a')] = 0.7, [byte('b')] = 0.7, [byte('c')] = 0.7, [byte('d')] = 0.7, [byte('e')] = 0.7,
- [byte('g')] = 0.7, [byte('h')] = 0.7, [byte('k')] = 0.7, [byte('m')] = 0.7, [byte('n')] = 0.7,
- [byte('o')] = 0.7, [byte('p')] = 0.7, [byte('q')] = 0.7, [byte('s')] = 0.7, [byte('u')] = 0.7,
- [byte('w')] = 0.7, [byte('z')] = 0.7,
- [byte('2')] = 0.7, [byte('3')] = 0.7, [byte('6')] = 0.7, [byte('8')] = 0.7, [byte('9')] = 0.7,
+ [0x0041] = 0.5, -- A
+ [0x0042] = 0.7, -- B
+ [0x0043] = 0.7, -- C
+ [0x0044] = 0.5, -- D
+ [0x0045] = 0.7, -- E
+ [0x0046] = 0.7, -- F
+ [0x0047] = 0.5, -- G
+ [0x0048] = 0.7, -- H
+ [0x004B] = 0.7, -- K
+ [0x004D] = 0.7, -- M
+ [0x004E] = 0.7, -- N
+ [0x004F] = 0.5, -- O
+ [0x0050] = 0.7, -- P
+ [0x0051] = 0.5, -- Q
+ [0x0052] = 0.7, -- R
+ [0x0053] = 0.7, -- S
+ [0x0055] = 0.7, -- U
+ [0x0057] = 0.7, -- W
+ [0x005A] = 0.7, -- Z
+ [0x0061] = 0.7, -- a
+ [0x0062] = 0.7, -- b
+ [0x0063] = 0.7, -- c
+ [0x0064] = 0.7, -- d
+ [0x0065] = 0.7, -- e
+ [0x0067] = 0.7, -- g
+ [0x0068] = 0.7, -- h
+ [0x006B] = 0.7, -- k
+ [0x006D] = 0.7, -- m
+ [0x006E] = 0.7, -- n
+ [0x006F] = 0.7, -- o
+ [0x0070] = 0.7, -- p
+ [0x0071] = 0.7, -- q
+ [0x0073] = 0.7, -- s
+ [0x0075] = 0.7, -- u
+ [0x0077] = 0.7, -- w
+ [0x007A] = 0.7, -- z
+ [0x0032] = 0.7, -- 2
+ [0x0033] = 0.7, -- 3
+ [0x0036] = 0.7, -- 6
+ [0x0038] = 0.7, -- 8
+ [0x0039] = 0.7, -- 9
}
vectors['quality'] = vectors['default'] -- metatable ?
@@ -153,15 +188,11 @@ registerafmfeature(specification)
fonts.goodies.register("expansions", function(...) return fonts.goodies.report("expansions", trace_expansion, ...) end)
-if context then
-
- implement {
- name = "setupfontexpansion",
- arguments = "2 strings",
- actions = function(class,settings) getparameters(classes,class,'preset',settings) end
- }
-
-end
+implement {
+ name = "setupfontexpansion",
+ arguments = "2 strings",
+ actions = function(class,settings) getparameters(classes,class,'preset',settings) end
+}
-- -- -- -- -- --
-- protrusion
@@ -178,21 +209,17 @@ local vectors = protrusions.vectors
-- the values need to be revisioned
-classes.preset = { factor = 1, left = 1, right = 1 }
-
-classes['pure'] = {
- vector = 'pure', factor = 1
-}
-classes['punctuation'] = {
- vector = 'punctuation', factor = 1
-}
-classes['alpha'] = {
- vector = 'alpha', factor = 1
-}
-classes['quality'] = {
- vector = 'quality', factor = 1
+classes.preset = {
+ factor = 1,
+ left = 1,
+ right = 1,
}
+classes['pure'] = { vector = 'pure', factor = 1 }
+classes['punctuation'] = { vector = 'punctuation', factor = 1 }
+classes['alpha'] = { vector = 'alpha', factor = 1 }
+classes['quality'] = { vector = 'quality', factor = 1 }
+
vectors['pure'] = {
[0x002C] = { 0, 1 }, -- comma
@@ -254,24 +281,24 @@ vectors['punctuation'] = {
vectors['alpha'] = {
- [byte("A")] = { .05, .05 },
- [byte("F")] = { 0, .05 },
- [byte("J")] = { .05, 0 },
- [byte("K")] = { 0, .05 },
- [byte("L")] = { 0, .05 },
- [byte("T")] = { .05, .05 },
- [byte("V")] = { .05, .05 },
- [byte("W")] = { .05, .05 },
- [byte("X")] = { .05, .05 },
- [byte("Y")] = { .05, .05 },
-
- [byte("k")] = { 0, .05 },
- [byte("r")] = { 0, .05 },
- [byte("t")] = { 0, .05 },
- [byte("v")] = { .05, .05 },
- [byte("w")] = { .05, .05 },
- [byte("x")] = { .05, .05 },
- [byte("y")] = { .05, .05 },
+ [0x0041] = { .05, .05 }, -- A
+ [0x0046] = { 0, .05 }, -- F
+ [0x004A] = { .05, 0 }, -- J
+ [0x004B] = { 0, .05 }, -- K
+ [0x004C] = { 0, .05 }, -- L
+ [0x0054] = { .05, .05 }, -- T
+ [0x0056] = { .05, .05 }, -- V
+ [0x0057] = { .05, .05 }, -- W
+ [0x0058] = { .05, .05 }, -- X
+ [0x0059] = { .05, .05 }, -- Y
+
+ [0x006B] = { 0, .05 }, -- k
+ [0x0072] = { 0, .05 }, -- r
+ [0x0074] = { 0, .05 }, -- t
+ [0x0076] = { .05, .05 }, -- v
+ [0x0077] = { .05, .05 }, -- w
+ [0x0078] = { .05, .05 }, -- x
+ [0x0079] = { .05, .05 }, -- y
}
@@ -305,7 +332,9 @@ vectors['quality'] = table.merged(
-- \definefontfeature[whocares][default][mode=node,protrusion=2,opbd=yes,script=latn,featurefile=texgyrepagella-regularxx.fea]
classes['double'] = { -- for testing opbd
- factor = 2, left = 1, right = 1,
+ factor = 2,
+ left = 1,
+ right = 1,
}
local function map_opbd_onto_protrusion(tfmdata,value,opbd)
@@ -438,8 +467,7 @@ local function initialize(tfmdata,value)
report_protrusions("setting class %a, vector %a, factor %a, left %a, right %a",
value,class.vector,factor,left,right)
end
- local data = characters.data
- local emwidth = tfmdata.parameters.quad
+ local data = characters.data
local lfactor = left * factor
local rfactor = right * factor
if trace_protrusion then
@@ -516,12 +544,40 @@ registerafmfeature(specification)
fonts.goodies.register("protrusions", function(...) return fonts.goodies.report("protrusions", trace_protrusion, ...) end)
-if context then
+implement {
+ name = "setupfontprotrusion",
+ arguments = "2 strings",
+ actions = function(class,settings) getparameters(classes,class,'preset',settings) end
+}
+
+local function initialize(tfmdata,value)
+ local properties = tfmdata.properties
+ local parameters = tfmdata.parameters
+ if properties then
+ value = tonumber(value)
+ if value then
+ if value < 0 then
+ value = 0
+ elseif value > 10 then
+ report_expansions("threshold for %a @ %p limited to 10 pct",properties.fontname,parameters.size)
+ value = 10
+ end
+ if value > 5 then
+ report_expansions("threshold for %a @ %p exceeds 5 pct",properties.fontname,parameters.size)
+ end
+ end
+ properties.threshold = value or nil -- nil enforces default
+ end
+end
- implement {
- name = "setupfontprotrusion",
- arguments = "2 strings",
- actions = function(class,settings) getparameters(classes,class,'preset',settings) end
+local specification = {
+ name = "threshold",
+ description = "threshold for quality features",
+ initializers = {
+ base = initialize,
+ node = initialize,
}
+}
-end
+registerotffeature(specification)
+registerafmfeature(specification)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-imp-spacekerns.lua b/Master/texmf-dist/tex/context/base/mkiv/font-imp-spacekerns.lua
new file mode 100644
index 00000000000..0e2b0f9b0ae
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-imp-spacekerns.lua
@@ -0,0 +1,258 @@
+if not modules then modules = { } end modules ['font-imp-spacekerns'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv and hand-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if not context then return end
+
+-- This is an experiment. See font-ots.lua for original implementation.
+
+local type, next = type, next
+local insert, setmetatableindex = table.insert, table.setmetatableindex
+
+local fonts = fonts
+local otf = fonts.handlers.otf
+local fontdata = fonts.hashes.identifiers
+local fontfeatures = fonts.hashes.features
+local otffeatures = fonts.constructors.features.otf
+local registerotffeature = otffeatures.register
+local handlers = otf.handlers
+local setspacekerns = nodes.injections.setspacekerns
+
+function handlers.trigger_space_kerns(head,dataset,sequence,initialrl,font,attr)
+ local features = fontfeatures[font]
+ local enabled = features and features.spacekern
+ if enabled then
+ setspacekerns(font,sequence) -- called quite often, each glyphrun
+ end
+ return head, enabled
+end
+
+local function hasspacekerns(data)
+ local resources = data.resources
+ local sequences = resources.sequences
+ local validgpos = resources.features.gpos
+ if validgpos and sequences then
+ for i=1,#sequences do
+ local sequence = sequences[i]
+ local steps = sequence.steps
+ if steps then -- and sequence.features[tag] then
+ local kind = sequence.type
+ if kind == "gpos_pair" then -- or kind == "gpos_single" then
+ for i=1,#steps do
+ local step = steps[i]
+ local coverage = step.coverage
+ local rules = step.rules
+ -- if rules then
+ -- -- not now: analyze (simple) rules
+ -- elseif not coverage then
+ -- -- nothing to do
+ -- elseif kind == "gpos_single" then
+ -- -- maybe a message that we ignore
+ -- elseif kind == "gpos_pair" then
+ if coverage and not rules then
+ local format = step.format
+ if format == "move" or format == "kern" then
+ local kerns = coverage[32]
+ if kerns then
+ return true
+ end
+ for k, v in next, coverage do
+ if v[32] then
+ return true
+ end
+ end
+ elseif format == "pair" then
+ local kerns = coverage[32]
+ if kerns then
+ for k, v in next, kerns do
+ local one = v[1]
+ if one and one ~= true then
+ return true
+ end
+ end
+ end
+ for k, v in next, coverage do
+ local kern = v[32]
+ if kern then
+ local one = kern[1]
+ if one and one ~= true then
+ return true
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ return false
+end
+
+otf.readers.registerextender {
+ name = "spacekerns",
+ action = function(data)
+ data.properties.hasspacekerns = hasspacekerns(data)
+ end
+}
+
+local function newdata(t,k)
+ local v = {
+ left = { },
+ right = { },
+ last = 0,
+ feat = nil,
+ }
+ t[k] = v
+ return v
+end
+
+local function spaceinitializer(tfmdata,value) -- attr
+ local resources = tfmdata.resources
+ local spacekerns = resources and resources.spacekerns
+ if value and spacekerns == nil then
+ local rawdata = tfmdata.shared and tfmdata.shared.rawdata
+ local properties = rawdata.properties
+ if properties and properties.hasspacekerns then
+ local sequences = resources.sequences
+ local validgpos = resources.features.gpos
+ if validgpos and sequences then
+ local data = setmetatableindex(newdata)
+ for i=1,#sequences do
+ local sequence = sequences[i]
+ local steps = sequence.steps
+ if steps then
+ -- we don't support space kerns in other features
+ -- local kern = sequence.features[tag]
+ -- if kern then
+ for tag, kern in next, sequence.features do
+
+ local d = data[tag]
+ local left = d.left
+ local right = d.right
+ local last = d.last
+ local feat = d.feat
+
+ local kind = sequence.type
+ if kind == "gpos_pair" then -- or kind == "gpos_single" then
+ if feat then
+ for script, languages in next, kern do
+ local f = feat[script]
+ if f then
+ for l in next, languages do
+ f[l] = true
+ end
+ else
+ feat[script] = languages
+ end
+ end
+ else
+ feat = kern
+ d.feat = feat
+ end
+ for i=1,#steps do
+ local step = steps[i]
+ local coverage = step.coverage
+ local rules = step.rules
+ -- if rules then
+ -- -- not now: analyze (simple) rules
+ -- elseif not coverage then
+ -- -- nothing to do
+ -- elseif kind == "gpos_single" then
+ -- -- makes no sense in TeX
+ -- elseif kind == "gpos_pair" then
+ if coverage and not rules then
+ local format = step.format
+ if format == "move" or format == "kern" then
+ local kerns = coverage[32]
+ if kerns then
+ for k, v in next, kerns do
+ right[k] = v
+ end
+ end
+ for k, v in next, coverage do
+ local kern = v[32]
+ if kern then
+ left[k] = kern
+ end
+ end
+ elseif format == "pair" then
+ local kerns = coverage[32]
+ if kerns then
+ for k, v in next, kerns do
+ local one = v[1]
+ if one and one ~= true then
+ right[k] = one[3]
+ end
+ end
+ end
+ for k, v in next, coverage do
+ local kern = v[32]
+ if kern then
+ local one = kern[1]
+ if one and one ~= true then
+ left[k] = one[3]
+ end
+ end
+ end
+ end
+ end
+ end
+ last = i
+ end
+d.last = last
+ end
+ end
+ end
+
+ for tag, d in next, data do
+ local left = d.left
+ local right = d.right
+ left = next(left) and left or false
+ right = next(right) and right or false
+ if left or right then
+
+ local last = d.last
+ local feat = d.feat
+
+ if last > 0 then
+ local triggersequence = {
+ -- no steps, see (!!)
+ features = { [tag] = feat or { dflt = { dflt = true, } } },
+ flags = noflags,
+ name = "trigger_space_kerns",
+ order = { tag },
+ type = "trigger_space_kerns",
+ left = left,
+ right = right,
+ }
+ insert(sequences,last,triggersequence)
+ d.last = d.last + 1
+ spacekerns = true
+ end
+ end
+
+ end
+ end
+ end
+ if not spacekerns then
+ spacekerns = false
+ end
+ resources.spacekerns = spacekerns
+ end
+ return spacekerns
+end
+
+registerotffeature {
+ name = "spacekern",
+ description = "space kern injection",
+ default = true,
+ initializers = {
+ node = spaceinitializer,
+ },
+}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/font-ini.lua
index 462e30bf909..8bab6d90295 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-ini.lua
@@ -52,3 +52,7 @@ fonts.privateoffsets = {
mathbase = 0xFF000, -- used for hidden (virtual math)
keepnames = false, -- when set to true names are always kept (not for context)
}
+
+if node and not tex.getfontoffamily then
+ tex.getfontoffamily = node.family_font -- we moved this
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-ini.mklx b/Master/texmf-dist/tex/context/base/mkiv/font-ini.mklx
new file mode 100644
index 00000000000..4b112322dc3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-ini.mklx
@@ -0,0 +1,2563 @@
+%D \module
+%D [ file=font-ini,
+%D version=1998.09.11, % (second)
+%D version=2001.02.20, % (third)
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% todo: < 3 pt => 3pt
+% todo: check where more class usage
+% todo: split font-nam (style/alternative/size)
+% todo: split font-dim (scales etc)
+% todo: reconsider defaultfontclass
+%
+
+%D Watch out: as we define inside macros in sometimes special ways,
+%D an occasional \type {\normaldef} is used in order to please the
+%D \MKVI\ parser.
+
+%D Beware, we use a special set of parameters here:
+%D
+%D \starttabulate[|l|l|]
+%D \NC system variable (fixed) \NC \type {\s!text} \NC \NR
+%D \NC system variable (fixed) \NC \type {\s!script} \NC \NR
+%D \NC system variable (fixed) \NC \type {\s!scriptscript} \NC \NR
+%D \NC system variable (fixed) \NC \type {\s!x} \NC \NR
+%D \NC system variable (fixed) \NC \type {\s!xx} \NC \NR
+%D \NC variable (value) \NC \type {\v!big} \NC \NR
+%D \NC variable (value) \NC \type {\v!small} \NC \NR
+%D \NC constant (regular key) \NC \type {\c!interlinespace} \NC \NR
+%D \NC constant (regular key) \NC \type {\c!em} \NC \NR
+%D \stoptabulate
+%D
+%D The math related ones are similar to the ones used in \TEX\ itself,
+%D the size related ones show up as keywords in the user interface
+%D when switching sizes, and the two constants are used in key|/|value
+%D situations.
+
+%D We should consider design sizes ... maybe kick 'm out which removes
+%D the size code and simplifies things considerably. After all, there
+%D will be no latin modern math in sizes.
+
+\writestatus{loading}{ConTeXt Font Macros / Initialization}
+
+%D Documentation is somewhat messy as it contains bits and pieces of
+%D previous versions.
+
+\unprotect
+
+%D There are several ways to specify a font. Three of them are pure \TEX\ ones, the
+%D fourth one is new:
+%D
+%D \starttyping
+%D \font\name=cmr12
+%D \font\name=cmr12 at 10pt
+%D \font\name=cmr12 scaled 2
+%D \font\name=cmr12 sa 1.440
+%D \stoptyping
+%D
+%D The non||\TEX\ alternative \type{sa} stands for {\em scaled at}. This means as
+%D much as: scale the bodyfontsize with this factor. The scaled option is not that
+%D useful as one needs to know the design size.
+%D
+%D Because \type {sa} (scaled at) and \type {mo} (mapped on) are not low level \TEX\
+%D supported alternatives, we have to test for it ourselves. In doing so, we need an
+%D auxiliary \DIMENSION. We cannot use \type{\scratchdimen} because font loading can
+%D happen at any moment due to postponed loading. We could instead have used dirty
+%D grouping tricks, but this one works too.
+
+% \enableexperiments[fonts.autorscale]
+%
+% \starttypescript[mscore]
+% \definetypeface [mscore] [rm] [serif] [mscoretimes] [default]
+% \definetypeface [mscore] [ss] [sans] [mscorearial] [default] [rscale=auto] % 0.860]
+% \definetypeface [mscore] [tt] [mono] [mscorecourier] [default] [rscale=auto] % 1.065]
+% \definetypeface [mscore] [mm] [math] [times] [default] [rscale=auto] % 1.020]
+% \stoptypescript
+%
+% \starttext
+% \setupbodyfont[mscore,12pt]
+% \startTEXpage
+% test \ss test \tt test
+% \stopTEXpage
+% \stoptext
+
+% \definetypeface[one][rm][serif][computer-roman][default]
+% \definetypeface[two][rm][serif][computer-roman][default][rscale=.9]
+%
+% {\one \bf test \two test}
+% {\one \bf test \pushcurrentfont \two \popcurrentfont test}
+
+%D \macros
+%D {rm,ss,tt,hw,cg}
+%D
+%D Fonts are defined in separate files. When we define a font, we distinguish
+%D between several styles. In most cases we will use:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC roman regular serif \NC \type{\rm} \NC\FR
+%D \NC sansserif sans support \NC \type{\ss} \NC\MR
+%D \NC type teletype mono \NC \type{\tt} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D The number of styles is not limited to these three. When using Lucida Bright we
+%D can for instance also define:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC handwritten \NC \type{\hw} \NC\FR
+%D \NC calligraphic \NC \type{\cg} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D Within such a font set (\type{cmr}) and style (\type{\rm}) we can define a number
+%D of text font alternatives:
+%D
+%D \startlinecorrection
+%D \starttable[|l||]
+%D \HL
+%D \NC typeface \NC \type{\tf} \NC\FR
+%D \NC boldface \NC \type{\bf} \NC\MR
+%D \NC slanted \NC \type{\sl} \NC\MR
+%D \NC italic \NC \type{\it} \NC\MR
+%D \NC boldslanted \NC \type{\bs} \NC\MR
+%D \NC bolditalic \NC \type{\bi} \NC\MR
+%D \NC smallcaps \NC \type{\sc} \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D Internally fonts are stored as combination of size, style
+%D and alternative, e.g. \type{12pt}+\type{\ss}+\type{\bf}. Users are not confronted
+%D with sizes, but use the style or style+alternative to activate them.
+%D
+%D During the definition of a bodyfont one can also declare the available larger
+%D alternatives:
+%D
+%D \starttyping
+%D \tf \tfa \tfb \tfc ...
+%D \bf \bfa \bfb \bfc ...
+%D \sl \sla \slb \slc ...
+%D \stoptyping
+%D
+%D The smaller ones are automatically supplied and derived from
+%D the the bodyfont environment.
+%D
+%D \starttyping
+%D \tfx \tfxx
+%D \bfx \bfxx
+%D \slx \slxx
+%D \stoptyping
+%D
+%D There are only two smaller alternatives per style. The larger alternatives on the
+%D other hand have no limitations.
+%D
+%D These larger alternatives are mostly used in chapter and section titles or on
+%D title pages. When one switches to a larger alternative, the bold an other ones
+%D automatically adapt themselves:
+%D
+%D \startbuffer
+%D \tfd Hi \bf there\sl, here \tfb I \bf am
+%D \stopbuffer
+%D
+%S \startnarrower
+%D \typebuffer
+%S \stopnarrower
+%D
+%D therefore becomes:
+%D
+%D \startexample
+%D \getbuffer
+%D \stopexample
+%D
+%D Maybe this mechanism isn't always as logic, but as said before, we tried to make
+%D it as intuitive as possible.
+%D
+%D So a specific kind of glyph can be characterized by:
+%D
+%D \startnarrower
+%D family (cmr) + bodyfont (12pt) + style (rm) + alternative (bf) + size (a)
+%D \stopnarrower
+%D
+%D The last component (the size) is optional.
+%D
+%D We introduced \type {\tf} as command to call for the current normally sized
+%D typeface. This commands results in roman, sans serif, teletype or whatever style
+%D is in charge. Such rather massive switches of style sometimes take more
+%D processing time than comfortable. Of course there is a workaround for this: we
+%D can call fonts directly by means of commands like:
+%D
+%D \starttyping
+%D \rmtf \sssl \tttf \rmbsa
+%D \stoptyping
+%D
+%D One should realize that this fast calls have limitations, they lack for instance
+%D automatic super- and subscript support.
+%D
+%D This leaves us two more commands: \type {\tx} and \type {\txx}. These activate a
+%D smaller and even more smaller font than the current one and adapt themselves to
+%D the current alternative, so when \type {\bf} is active, \type {\tx} gives a
+%D smaller boldface, which in turn can be called directly by \type {\bfx}.
+%D
+%D These two smaller alternatives are specified by the bodyfont environment and
+%D therefore not necessarily have similar sizes as \type {\scriptsize} and \type
+%D {\scriptscriptsize}. The main reason for this incompatibility (which can easily
+%D be undone) lays in the fact that we often want a bit bigger characters than in
+%D math mode. In \CONTEXT\ for instance the \type {\tx} and \type {\txx} commands
+%D are used for surrogate \cap {smallcaps} which support both nesting and
+%D alternatives, like in {\bf \cap {a \cap {small} world}}, which was typeset by
+%D
+%D \starttyping
+%D \bf\cap{a \cap{small} world}
+%D \stoptyping
+%D
+%D And compare $\rm \scriptstyle THIS$ with the slightly larger \cap {THIS}:
+%D \ruledhbox {$\rm \scriptstyle scriptstyle: THIS$} or \ruledhbox {\cap {x style:
+%D THIS}} makes a big difference.
+%D
+%D The \type {x..d} sizes should be used grouped. If you don't group them, i.e. call
+%D them in a row, \CONTEXT\ will not be able to sort out your intention (\type {x}
+%D inside \type {d} inside \type {x}. etc.). The following table demonstrates this:
+%D
+%D \def\FontState{\setstrut\ruledhbox{\strut Hello}}
+%D
+%D \starttabulate[|||||]
+%D \HL
+%D \NC \rlap{\quad\bf grouped} \NC \NC \type {\tx} \NC \type {\txx} \NC \NR
+%D \HL
+%D \NC \type{\tfx} \NC \tfx \FontState \NC \tfx \tx \FontState \NC \tfx \txx \FontState \NC \NR
+%D \NC \type{\tfxx} \NC \tfxx \FontState \NC \tfxx\tx \FontState \NC \tfxx\txx \FontState \NC \NR
+%D \NC \type{\tf} \NC \tf \FontState \NC \tf \tx \FontState \NC \tf \txx \FontState \NC \NR
+%D \NC \type{\tfa} \NC \tfa \FontState \NC \tfa \tx \FontState \NC \tfa \txx \FontState \NC \NR
+%D \NC \type{\tfb} \NC \tfb \FontState \NC \tfb \tx \FontState \NC \tfb \txx \FontState \NC \NR
+%D \NC \type{\tfc} \NC \tfc \FontState \NC \tfc \tx \FontState \NC \tfc \txx \FontState \NC \NR
+%D \NC \type{\tfd} \NC \tfd \FontState \NC \tfd \tx \FontState \NC \tfd \txx \FontState \NC \NR
+%D \NC \type{\tfx} \NC \tfx \FontState \NC \tfx \tx \FontState \NC \tfx \txx \FontState \NC \NR
+%D \NC \type{\tfxx} \NC \tfxx \FontState \NC \tfxx\tx \FontState \NC \tfxx\txx \FontState \NC \NR
+%D \HL
+%D \stoptabulate
+%D
+%D \blank
+%D
+%D \starttabulate[|||||]
+%D \HL
+%D \NC \rlap{\quad\bf stacked} \NC \NC \type {\tx} \NC \type {\txx} \NC \NR
+%D \HL
+%D \NC \type{\tfx}
+%D \NC \tfx \FontState
+%D \NC \tfx \tx \FontState
+%D \NC \tfx \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfxx}
+%D \NC \tfx\tfxx \FontState
+%D \NC \tfx\tfxx \tx \FontState
+%D \NC \tfx\tfxx \txx \FontState
+%D \NC \NR
+%D \NC \type{\tf}
+%D \NC \tfx\tfxx\tf \FontState
+%D \NC \tfx\tfxx\tf \tx \FontState
+%D \NC \tfx\tfxx\tf \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfa}
+%D \NC \tfx\tfxx\tf\tfa \FontState
+%D \NC \tfx\tfxx\tf\tfa \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfb}
+%D \NC \tfx\tfxx\tf\tfa\tfb \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfc}
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfd}
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfd \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfd \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfd \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfx}
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx \txx \FontState
+%D \NC \NR
+%D \NC \type{\tfxx}
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx\tfxx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx\tfxx \tx \FontState
+%D \NC \tfx\tfxx\tf\tfa\tfb\tfc\tfx\tfxx \txx \FontState
+%D \NC \NR
+%D \HL
+%D \stoptabulate
+
+\fontslantperpoint \nullfont 0\scaledpoint
+\fontinterwordspace \nullfont 256377\scaledpoint
+\fontinterwordstretch\nullfont 128188\scaledpoint
+\fontinterwordshrink \nullfont 85459\scaledpoint
+\fontexheight \nullfont 338952\scaledpoint
+\fontemwidth \nullfont 786432\scaledpoint
+\fontextraspace \nullfont 85459\scaledpoint
+
+\appendtoks
+ \fontslantperpoint \nullfont 0\scaledpoint
+ \fontinterwordspace \nullfont 256377\scaledpoint
+ \fontinterwordstretch\nullfont 128188\scaledpoint
+ \fontinterwordshrink \nullfont 85459\scaledpoint
+ \fontexheight \nullfont 338952\scaledpoint
+ \fontemwidth \nullfont 786432\scaledpoint
+ \fontextraspace \nullfont 85459\scaledpoint
+\to \everyjob
+
+%D Tracing
+
+\newtoks\t_font_tracers_definitions
+
+\unexpanded\def\tracefontdefinitions
+ {\the\t_font_tracers_definitions}
+
+%D Some housekeeping macros:
+
+\unexpanded\def\setfontparameters
+ {\setfalse\c_font_synchronize
+ \the\everybodyfont
+ \settrue\c_font_synchronize}
+
+\let\savedfont\empty
+
+\installmacrostack\savedfont
+
+\unexpanded\def\savefont
+ {\edef\savedfont{\the\font}% gives \csname
+ \push_macro_savedfont}
+
+\unexpanded\def\restorefont
+ {\pop_macro_savedfont
+ \savedfont}
+
+\unexpanded\def\pushcurrentfont
+ {\edef\popcurrentfont
+ {\def\noexpand\fontbody {\fontbody}%
+ \def\noexpand\fontstyle {\fontstyle}%
+ \def\noexpand\fontalternative{\fontalternative}%
+ \def\noexpand\fontsize {\fontsize}%
+ \font_helpers_check_big_math_synchronization
+ \font_helpers_synchronize_font}}
+
+%D \macros{definedfont}
+
+\let\thedefinedfont\relax % not to be confused with \everydefinefont
+
+\unexpanded\def\definedfont
+ {\doifelsenextoptionalcs\font_basics_defined_font_yes\font_basics_defined_font_nop}
+
+\def\font_basics_defined_font_yes[#specification]%
+ {\c_font_feature_inheritance_mode\c_font_feature_inheritance_fontonly
+ \font_basics_define_font_without_parameters{thedefinedfont}{#specification}%
+ \thedefinedfont
+ \the\everydefinedfont}
+
+\def\font_basics_defined_font_nop
+ {\c_font_feature_inheritance_mode\c_font_feature_inheritance_fontonly
+ \thedefinedfont
+ \the\everydefinedfont}
+
+%D \macros{startfont}
+
+\unexpanded\def\startfont{\begingroup\definedfont}
+\unexpanded\def\stopfont {\endgroup}
+
+%D \macros
+%D {everybodyfont,everyglobalbodyfont}
+%D
+%D Every change in bodyfont size has conseqences for the baseline distance and skips
+%D between paragraphs. These are initialized in other modules. Here we only provide
+%D the hooks that garantees their handling.
+%D
+%D At the system level one can initialize thing like:
+%D
+%D \starttyping
+%D \appendtoks \setupspacing \to \everybodyfont
+%D \stoptyping
+
+%D \macros
+%D {globalbodyfontsize,localbodyfontsize,bodyfontsize}
+%D
+%D Here we have to distinguish between the global (overal) bodyfont size and the
+%D local (sometimes in the textflow) size. We store these dimensions in two
+%D \DIMENSION\ registers. These registers are not to be misused in calculations.
+
+\ifdefined\globalbodyfontsize\else \newdimen\globalbodyfontsize \fi \globalbodyfontsize=12pt
+\ifdefined\localbodyfontsize \else \newdimen\localbodyfontsize \fi \localbodyfontsize =\globalbodyfontsize
+\ifdefined\bodyfontsize \else \newdimen\bodyfontsize \fi \bodyfontsize =\globalbodyfontsize
+
+%D When we assign for instance 12pt to a \DIMENSION\ register the \type {\the}'d
+%D value comes out as 12.0pt, which is often not the way users specify the bodyfont
+%D size. Therefore we use normalized values. They are cached to save overhead in
+%D \LUA\ calls.
+
+\installcorenamespace{fontnormalizedbody}
+
+\def\normalizebodyfontsize#macro#body%
+ {\expandafter\let\expandafter#macro\csname\??fontnormalizedbody\number\dimexpr#body\endcsname
+ \ifx#macro\relax
+ \normalizebodyfontsize_indeed#macro{#body}%
+ \fi}
+
+\def\normalizebodyfontsize_indeed#macro#body%
+ {\edef#macro{\clf_nbfs\dimexpr#body\relax}%
+ \expandafter\glet\csname\??fontnormalizedbody\number\dimexpr#body\endcsname#macro}
+
+\def\thenormalizedbodyfontsize#body%
+ {\clf_nbfs\dimexpr#body\relax}
+
+\edef\normalizedglobalbodyfontsize{\thenormalizedbodyfontsize\bodyfontsize}
+\edef\normalizedlocalbodyfontsize {\thenormalizedbodyfontsize\bodyfontsize}
+\edef\normalizedbodyfontsize {\thenormalizedbodyfontsize\bodyfontsize}
+
+%D \macros
+%D {mapfontsize}
+%D
+%D For special purposes, like in math, you may want to use slightly different sizes
+%D than the ones given. This happens for instance with the Math Times fonts. Mapped
+%D font sizes can be specified by using the \type {mo} key instead of \type {sa} in
+%D font definitions.
+%D
+%D \startbuffer
+%D \mapfontsize[10pt][11pt]
+%D \mapfontsize[11pt][12pt]
+%D \mapfontsize[12pt][13pt]
+%D
+%D \definefont[test][Serif]\test TEST \par
+%D \definefont[test][Serif sa 5]\test TEST \par
+%D \definefont[test][Serif mo 5]\test TEST \par
+%D \definefont[test][Serif sa d]\test TEST \par
+%D \definefont[test][Serif at 60pt]\test TEST \par
+%D \definefont[test][Serif scaled 6000]\test TEST \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startpacked
+%D \getbuffer
+%D \stoppacked
+
+\installcorenamespace{mappedfontsize}
+
+\unexpanded\def\mapfontsize
+ {\dodoubleargument\font_basics_map_fontsize}
+
+\def\font_basics_map_fontsize[#from][#to]%
+ {\setvalue{\??mappedfontsize\the\dimexpr#from\relax}{#to}}
+
+\def\font_basics_set_mapped_fontsize#from%
+ {\ifcsname\??mappedfontsize\the\dimexpr#from\relax\endcsname
+ \lastnamedcs\else#from%
+ \fi}
+
+\installcorenamespace{fontbodyknown}
+\installcorenamespace{fontclassyes} % fontclass
+\installcorenamespace{fontclassnop} % nofontclass
+
+\def\font_helpers_process_relative_size_list#command% could be a toks
+ {#command\v!big
+ #command\v!small}
+
+\let\v_font_size_relative \plusone
+\def\v_font_size_absolute {\fontbody}
+
+\let\v_font_rscale_default\!!plusone
+\let\p_font_rscale \v_font_rscale_default
+
+\def\font_helpers_check_relative_font_id % can be plugged in later
+ {\let\p_font_rscale\minusone
+ \let\p_font_rscale\v_font_rscale_default}
+
+\def\font_helpers_check_relative_font_size#style%
+ {\edef\p_font_rscale
+ {\ifcsname\??fontclass\fontclass#style\s!rscale\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??fontclass\defaultfontclass#style\s!rscale\endcsname % brr
+ \lastnamedcs
+ \else
+ \v_font_rscale_default
+ \fi}%
+ % move elsewhere
+ \ifx\p_font_rscale\v!auto
+ \let\p_font_rscale\plusone
+ \font_helpers_check_relative_font_id
+ \else
+ \let\relativefontid\minusone
+ \fi}
+
+\def\font_rscale_xx#style%
+ {\ifcsname\??fontclass\fontclass#style\s!rscale\endcsname
+ \lastnamedcs
+ \else
+ \v_font_rscale_default
+ \fi}
+
+\def\font_rscale_mm
+ {\ifcsname\??fontclass\fontclass\s!mm\s!rscale\endcsname
+ \lastnamedcs
+ \else
+ \v_font_rscale_default
+ \fi}
+
+\def\font_helpers_register_fontbody#body%
+ {\expandafter\let\csname\??fontbodyknown#body\endcsname\empty}
+
+%D \macros
+%D {definefontstyle,definefontsize,definefontalternative}
+%D
+%D When setting of switching the overall style we can use the short identifier like
+%D rm and ss, but when defined we can also use more verbose names like roman or
+%D sansserif. Such names are defined by:
+%D
+%D \starttyping
+%D \definefontstyle [serif,rm] [rm]
+%D \definefontstyle [sansserif,ss] [ss]
+%D \stoptyping
+
+\installcorenamespace{fontstyle} % full style prefix (roman etc)
+\installcorenamespace{fontshortstyle} % short style prefix (rm etc)
+
+\installcorenamespace{fontstyleknown}
+\installcorenamespace{fontalternativeknown}
+\installcorenamespace{fontsizeknown}
+
+\newtoks\t_font_style_commands
+\newtoks\t_font_size_commands
+\newtoks\t_font_alternative_commands
+
+\setnewmacro\m_font_style_command \gobbleoneargument
+\setnewmacro\m_font_size_command \gobbleoneargument
+\setnewmacro\m_font_alternative_command\gobbleoneargument
+
+\def\font_helpers_process_style_list #command{\def\m_font_style_command {#command}\the\t_font_style_commands}
+\def\font_helpers_process_size_list #command{\def\m_font_size_command {#command}\the\t_font_size_commands}
+\def\font_helpers_process_alternative_list#command{\def\m_font_alternative_command{#command}\the\t_font_alternative_commands}
+
+\def\font_helpers_register_style #style{\expandafter\let\csname\??fontstyleknown #style\endcsname\empty}
+\def\font_helpers_register_size #size{\expandafter\let\csname\??fontsizeknown #size\endcsname\empty}
+\def\font_helpers_register_alternative#alternative{\expandafter\let\csname\??fontalternativeknown#alternative\endcsname\empty}
+
+\unexpanded\def\definefontstyle
+ {\dodoubleargument\font_basics_define_fontstyle}
+
+\def\font_basics_define_fontstyle[#commands][#style]% style: rm ss tt ...
+ {\ifcsname\??fontstyleknown#style\endcsname \else % can be delayed till used (cg, hw)
+ \font_helpers_register_style{#style}%
+ \toksapp\t_font_style_commands{\m_font_style_command{#style}}%
+ \fi
+ \processcommalist[#commands]{\font_basics_define_fontstyle_indeed{#style}}}
+
+\def\font_basics_define_fontstyle_indeed#style#command%
+ {\setvalue{\??fontshortstyle#command}{#style}%
+ \setvalue{\??fontstyle #command}{\csname#style\endcsname}}
+
+\unexpanded\def\definefontsize[#size]%
+ {\ifcsname\??fontsizeknown#size\endcsname \else
+ \font_helpers_register_size{#size}%
+ \toksapp\t_font_size_commands{\m_font_size_command{#size}}%
+ \fi
+ \font_helpers_check_fontname_combinations}
+
+\unexpanded\def\definefontalternative[#alternative]%
+ {\ifcsname\??fontalternativeknown#alternative\endcsname \else
+ \font_helpers_register_alternative{#alternative}%
+ \toksapp\t_font_alternative_commands{\m_font_alternative_command{#alternative}}%
+ \fi
+ \font_helpers_check_fontname_combinations}
+
+\unexpanded\def\font_helpers_check_fontname_combinations % we need to split math and text here ... todo (math only has mr and mb)
+ {\font_helpers_process_style_list\font_helpers_check_fontname_combinations_s}
+
+\def\font_helpers_check_fontname_combinations_s#style%
+ {\font_helpers_process_alternative_list{\font_helpers_check_fontname_combinations_indeed_s_a{#style}}}
+
+\def\font_helpers_check_fontname_combinations_indeed_s_a#style#alternative%
+ {\font_helpers_process_size_list{\font_basics_check_fontname_combination{#style}{#alternative}}}
+
+\definefontstyle [\s!mm] [\s!mm]
+\definefontstyle [\s!rm] [\s!rm]
+\definefontstyle [\s!ss] [\s!ss]
+\definefontstyle [\s!tt] [\s!tt]
+
+%D We define all the font switching commands globally. After all they are part of
+%D the formal font interface once defined. The size can be empty (so checking is
+%D needed as \type {\bf} is already defined).
+%D
+%D The \type {\normal..} variants are available as extras for cases where the \type
+%D {..} is overloaded.
+
+\newmacro\m_font_mm
+
+\def\font_basics_check_fontname_combination#style% alternative size
+ {\edef\m_font_mm{#style}%
+ \ifx\m_font_mm\s!mm % prevents \max and alike (re)defs
+ \expandafter\font_basics_check_math_bodyfont
+ \else
+ \expandafter\font_basics_check_text_bodyfont
+ \fi{#style}} % no \m_font_mm, not expanded later on
+
+\def\font_basics_check_math_bodyfont#style#alternative#size%
+ {}
+
+\def\font_basics_check_text_bodyfont_step#whatever#body% size can be empty (checking needed as \bf is already defined)
+ {\ifcsname#whatever\endcsname\else
+ \setugvalue{#whatever}{#body}%
+ \fi}
+
+\def\font_basics_check_text_bodyfont#style#alternative#size% size can be empty (checking needed as \bf is already defined)
+ {\font_basics_check_text_bodyfont_step{#style#size}{\font_helpers_set_current_font_style_size{#style}{#size}}% \rma
+ \font_basics_check_text_bodyfont_step{#alternative#size}{\font_helpers_set_current_font_alternative_size{#alternative}{#size}}% \sla
+ \font_basics_check_text_bodyfont_step{#style#alternative#size}{\font_helpers_set_current_font_style_alternative_size{#style}{#alternative}{#size}}% \rmsla
+ \font_basics_check_text_bodyfont_step{#style}{\font_helpers_set_current_font_style{#style}}% \rm
+ \font_basics_check_text_bodyfont_step{#alternative}{\font_helpers_set_current_font_alternative{#alternative}}% \sl
+ \font_basics_check_text_bodyfont_step{#style\s!x }{\font_helpers_set_current_font_x_style_alternative{#style}}% \rmx
+ \font_basics_check_text_bodyfont_step{#style\s!xx}{\font_helpers_set_current_font_xx_style_alternative{#style}}% \rmxx
+ \font_basics_check_text_bodyfont_step{#alternative\s!x }{\font_helpers_set_current_font_x_alternative{#alternative}}% \slx
+ \font_basics_check_text_bodyfont_step{#alternative\s!xx}{\font_helpers_set_current_font_xx_alternative{#alternative}}% \slxx
+ \font_basics_check_text_bodyfont_step{#style#alternative}{\font_helpers_set_current_font_style_alternative{#style}{#alternative}}}% \rmsl
+
+%D Scaling macros:
+%D
+%D This system is somewhat complicated by two (possible conflicting) demands:
+%D
+%D \startitemize
+%D \item We support wildcards like \type {sa *} which will adapt to the current
+%D size. This is also the default specification.
+%D \item We support named scales like \type {sa d}; beware: \type {x} and \type {xx}
+%D are valid scales but they are not alway the same as the ones used in for
+%D instance \type {\bfx} because there the sized come from the bodyfont
+%D environment. In the future there maybe a switch that also honors the
+%D environment in named scales.
+%D \stopitemize
+%D
+%D Keep in mind that the smaller sizes are just for text super and subscripts while
+%D larger sizes can be used in titles where for instance math follows the size.
+
+% b:x{\definedfont[SerifBold sa b]x}{\bfb x $x^x$}\par
+% 1:x{\definedfont[SerifBold sa 1]x}{\bf x $x^x$}\par
+% x:x{\definedfont[SerifBold sa x]x}{\bfx x $x^x$}\par
+% xx:x{\definedfont[SerifBold sa xx]x}{\bfxx x $x^x$}\par
+%
+% *:x{\definedfont[Serif sa *]x}\par
+% 1:x{\definedfont[Serif sa 1]x}\par
+% 2:x{\definedfont[Serif sa 2]x}\par
+% 3:x{\definedfont[Serif sa 3]x}\par
+% 4:x{\definedfont[Serif sa 4]x}\par
+% 5:x{\definedfont[Serif sa 5]x}\par
+
+\def\safontscale{\number\dimexpr\v_font_size_absolute\relax}
+\def\mofontscale{\number\dimexpr\font_basics_set_mapped_fontsize\v_font_size_absolute\relax}
+
+\let\somefontname\s!unknown
+\let\somefontspec\s!unknown
+\let\somefontsize\zerocount
+
+\newcount\scaledfontmode % also used at the lua end
+\newcount\scaledfontsize % also used at the lua end
+\newcount\lastfontid % also used at the lua end / tex end
+\newtoks \everydefinefont
+
+\let\relativefontid\minusone % todo, not yet used
+
+\let\c_font_feature_inheritance_fontnone \zerocount % none
+\let\c_font_feature_inheritance_fontonly \plusone % fontonly
+\let\c_font_feature_inheritance_classonly \plustwo % classonly
+\let\c_font_feature_inheritance_fontfirst \plusthree % fontfirst
+\let\c_font_feature_inheritance_classfirst\plusfour % classfirst
+
+\let\c_font_feature_inheritance_default \c_font_feature_inheritance_fontfirst
+
+\setnewconstant\c_font_feature_inheritance_mode \c_font_feature_inheritance_default
+
+\newdimen \d_font_scaled_text_face
+\newdimen \d_font_scaled_font_size
+\newconditional\c_font_body_scale
+\newfraction \f_font_body_scale
+
+\unexpanded\def\font_helpers_low_level_define#specification#csname%
+ {% we can now set more at the lua end
+ \glet\somefontname\defaultfontfile
+ \let\somefontsize\empty
+ \clf_definefont_one{\detokenize\expandafter{\normalexpanded{#specification}}}% the escapestring catches at \somedimen
+ % sets \scaledfontmode and \somefontname and \somefontsize
+ \ifcase\fontface\relax
+ % \let\v_font_size_absolute\textface % fontbody
+ \or
+ \let\v_font_size_absolute\textface
+ \or
+ \let\v_font_size_absolute\scriptface
+ \or
+ \let\v_font_size_absolute\scriptscriptface
+ \or
+ \let\v_font_size_absolute\xtextface
+ \or
+ \let\v_font_size_absolute\xxtextface
+ \fi
+ %
+ \ifcase\scaledfontmode\relax
+ % none, avoid the designsize if possible
+ \d_font_scaled_font_size-\plusthousand\scaledpoint
+ \or
+ % at
+ \d_font_scaled_font_size\somefontsize
+ \or
+ % sa
+ \d_font_scaled_font_size\v_font_size_absolute\relax
+ \d_font_scaled_font_size\currentfontbodysize\d_font_scaled_font_size % uses \somefontsize set by lua
+ \or
+ % mo
+ \d_font_scaled_font_size\font_basics_set_mapped_fontsize\v_font_size_absolute
+ \d_font_scaled_font_size\currentfontbodysize\d_font_scaled_font_size
+ \or
+ % scaled, don't use this one as it's unpredictable
+ \d_font_scaled_font_size-\somefontsize\scaledpoint
+ \else % ht cp
+ % experiment, yet undocumented
+ \d_font_scaled_font_size\somefontsize
+ \fi
+ \relax
+ \d_font_scaled_font_size\v_font_size_relative\d_font_scaled_font_size
+ \ifconditional\c_font_auto_size
+ \font_helpers_check_body_scale\fontsize
+ \ifconditional\c_font_body_scale
+ \d_font_scaled_font_size\f_font_body_scale\d_font_scaled_font_size
+ \d_font_scaled_text_face\f_font_body_scale\dimexpr\textface\relax
+ \else
+ \d_font_scaled_font_size\f_font_body_scale
+ \d_font_scaled_text_face\textface
+ \fi
+ \else
+ \d_font_scaled_text_face\textface
+ \fi
+ \edef\somefontspec{at \number\d_font_scaled_font_size sp}%
+ \edef\somefontfile{\truefontname\somefontname}%
+ \ifx\somefontfile\s!unknown
+ \edef\somefontfile{\defaultfontfile}%
+ \fi
+ \font_helpers_update_font_parameters
+ \font_helpers_update_font_class_parameters
+ %\writestatus{fonts}{low level define: #csname/\somefontfile/\number\d_font_scaled_font_size/\fontface/\number\d_font_scaled_text_face}%
+ \clf_definefont_two
+ \ifx\fontclass\empty\s!false\else\s!true\fi
+ {#csname}%
+ {\somefontfile}%
+ \d_font_scaled_font_size
+ \c_font_feature_inheritance_mode
+ {\m_font_class_features}%
+ {\m_font_features}%
+ {\m_font_class_fallbacks}%
+ {\m_font_fallbacks}%
+ \fontface
+ \d_font_scaled_text_face
+ \relativefontid
+ {\m_font_class_goodies}%
+ {\m_font_goodies}%
+ {\m_font_class_designsize}%
+ {\m_font_designsize}%
+ \scaledfontmode
+ \relax
+ \ifcase\scaledfontsize
+ %\scaledfontsize\plusone
+ \let\somefontspec\empty
+ \let\lastrawfontcall\relax
+ \expandafter\let\csname#csname\endcsname\relax
+ \else
+ \edef\somefontspec{at \number\scaledfontsize sp}% we need the resolved designsize (for fallbacks)
+ \expandafter\let\expandafter\lastrawfontcall\csname#csname\endcsname
+ \the\everydefinefont
+ \fi
+ \c_font_feature_inheritance_mode\c_font_feature_inheritance_default}
+
+\def\font_helpers_check_body_scale#fontsize% gets character (x xx a etc)
+ {\ifcsname\??fontenvironments\fontclass\fontbody#fontsize\endcsname
+ \expandafter\let\expandafter\f_font_body_scale\lastnamedcs
+ \setfalse\c_font_body_scale % !
+ \orelse\ifcsname\??fontenvironments\fontclass\s!default#fontsize\endcsname
+ \expandafter\let\expandafter\f_font_body_scale\lastnamedcs
+ \settrue\c_font_body_scale
+ \orelse\ifcsname\??fontenvironments\fontbody#fontsize\endcsname
+ \expandafter\let\expandafter\f_font_body_scale\lastnamedcs
+ \setfalse\c_font_body_scale % !
+ \orelse\ifcsname\??fontenvironments\s!default#fontsize\endcsname
+ \expandafter\let\expandafter\f_font_body_scale\lastnamedcs
+ \settrue\c_font_body_scale
+ \orelse\ifcsname\??fontenvironments\fontclass\s!default\s!text\endcsname
+ \expandafter\let\expandafter\f_font_body_scale\lastnamedcs
+ \settrue\c_font_body_scale
+ \orelse\ifcsname\??fontenvironments\s!default\s!text\endcsname
+ \expandafter\let\expandafter\f_font_body_scale\lastnamedcs
+ \settrue\c_font_body_scale
+ \else
+ \let\f_font_body_scale\plusone
+ \settrue\c_font_body_scale
+ \fi}
+
+%D The following macros are used at the \LUA\ end. Watch the \type {\normal}
+%D hackery: this makes the mkvi parser happy.
+
+% \normaldef\fntsetdefname {\glet\somefontname\defaultfontfile} % do before calling
+% \normaldef\fntsetnopsize {\let\somefontsize\empty} % do before calling
+% \normaldef\fntsetsomename{\normalgdef\somefontname} % takes argument
+% \normaldef\fntsetsomesize{\normaldef\somefontsize} % takes argument
+
+\newif\ifskipfontcharacteristics \skipfontcharacteristicstrue
+
+\tracingfonts\plussix % <id: name @ size>
+
+%D When fontclasses are used, we define the font global, since namespaces are
+%D used. Otherwise we parse the specs each time.
+
+\let\fontfile\s!unknown
+
+%D Relatively new:
+
+\installcorenamespace{fonts}
+\installcorenamespace{fontslanguage}
+
+\installsetuponlycommandhandler \??fonts {fonts}
+
+\newconstant\c_fonts_auto_language
+
+\letvalue{\??fontslanguage\v!auto}\plusone % experimental
+%letvalue{\??fontslanguage\v!yes }\plustwo % less efficient, for experiments
+
+\appendtoks
+ \c_fonts_auto_language
+ \ifcsname\??fontslanguage\fontsparameter\c!language\endcsname
+ \lastnamedcs
+ \else
+ \zerocount
+ \fi
+\to \everysetupfonts
+
+\appendtoks
+ \ifcase\c_fonts_auto_language
+ % nothing
+ \or
+ \addfflanguage
+ % \or
+ % font
+ \fi
+\to \everylanguage
+
+% \setupfonts
+% [\c!language=\v!auto]
+
+%D \macros
+%D {everyfont,everyfontswitch}
+
+\ifdefined\everyfont \else \newtoks\everyfont \fi
+\ifdefined\everyfontswitch \else \newtoks\everyfontswitch \fi
+
+\def\setfontcharacteristics{\the\everyfont}
+
+% \appendtoks
+% \ifcase\c_fonts_auto_language
+% % nothing
+% \or
+% % auto
+% \or
+% \addfflanguage
+% \fi
+% \to \everyfont
+
+%D \macros
+%D {definefont}
+%D
+%D We also accept \type{sa a}||\type{sa d} as specification.
+%D
+%D Before we implement the main definition macro, we first show one for local use:
+%D
+%D \starttyping
+%D \definefont[Some][LucidaBright at 100pt] \Some some
+%D \definefont[More][LucidaBright scaled 3000] \More more
+%D \definefont[Nice][LucidaBright mo 2] \Nice nice
+%D \definefont[Text][LucidaBright sa 5.4] \Text last
+%D \stoptyping
+%D
+%D The implementation looks as follows:
+
+\unexpanded\def\definefont % [name][spec][1.6 | line=10pt | setup_id]
+ {\dotripleempty\font_basics_define_font}
+
+\def\font_basics_define_font
+ {\ifthirdargument
+ \expandafter\font_basics_define_font_a
+ \else
+ \expandafter\font_basics_define_font_b
+ \fi}
+
+\def\font_basics_define_font_a[#name][#specification][#settings]% [name][spec][1.6 | line=10pt | setup_id]
+ {\doifelsesetups{#settings}%
+ {\setuvalue{#name}{\font_basics_define_font_with_setups {#name}{#specification}{#settings}}}
+ {\setuvalue{#name}{\font_basics_define_font_with_parameters{#name}{#specification}{#settings}}}}
+
+\def\font_basics_define_font_b[#name][#specification][#dummy]%
+ {\setuvalue{#name}{\font_basics_define_font_without_parameters{#name}{#specification}}}
+
+\def\font_basics_define_font_with_parameters#name#specification#settings%
+ {\font_basics_define_font_without_parameters{#name}{#specification}%
+ \setuplocalinterlinespace[#settings]%
+ \setupspacing\relax} % is this really needed ?
+
+\def\font_basics_define_font_with_setups#name#specification#settings%
+ {\font_basics_define_font_without_parameters{#name}{#specification}%
+ \setups[#settings]}
+
+%D Beware, in the frozen variants no settings are supported yet, but that might happen
+%D some day.
+
+\unexpanded\def\definefrozenfont
+ {\dotripleempty\font_basics_define_frozen_font}
+
+% \def\font_basics_define_frozen_font[#name][#specification][#settings]%
+% {\begingroup
+% \font_basics_define_font[#name][#specification][#settings]%
+% \csname#name\endcsname
+% \expandafter\expandafter\expandafter\endgroup\expandafter\let\csname#name\endcsname\lastrawfontcall}
+
+\def\font_basics_define_frozen_font[#name][#specification][#settings]%
+ {\begingroup
+ \font_basics_define_font[#name][#specification][#settings]%
+ \csname#name\endcsname
+ \glet\lastglobalrawfontcall\lastrawfontcall
+ \endgroup
+ \expandafter\let\csname#name\endcsname\lastglobalrawfontcall}
+
+%D The instance namespace protection makes the switch local so that we can redefine a
+%D logical name and/or change the size in between.
+
+% todo: now mathsize twice in name (so it can go here)
+% todo: check when mathsize is needed
+
+\ifdefined\??fontinstanceready \else \installcorenamespace{fontinstanceready} \fi
+\ifdefined\??fontinstancebasic \else \installcorenamespace{fontinstancebasic} \fi
+\ifdefined\??fontinstanceclass \else \installcorenamespace{fontinstanceclass} \fi
+
+\newconditional\c_font_auto_size \settrue\c_font_auto_size
+
+\let\lastfontidentifier\empty
+
+\def\v_font_identifier_basic{\??fontinstancebasic \lastfontidentifier-\fontsize-\fontface}
+\def\v_font_identifier_class{\??fontinstanceclass\fontclass-\lastfontidentifier-\fontsize-\fontface}
+
+\let\v_font_identifier_basic_saved\v_font_identifier_basic
+\let\v_font_identifier_class_saved\v_font_identifier_class
+
+% \def\v_font_identifier_class{\??fontinstanceclass\fontclass-\lastfontidentifier-\fontstyle-\fontsize} % no \fontface
+
+\def\font_basics_define_font_without_parameters#identifier#2%
+ {\c_font_feature_inheritance_mode\c_font_feature_inheritance_fontonly
+ \edef\lastfontidentifier{#identifier}%
+ \let\v_font_size_relative\v_font_rscale_default
+ \let\v_font_size_absolute\fontbody
+ \font_helpers_low_level_define{#2}\v_font_identifier_basic
+ \csname\v_font_identifier_basic\endcsname
+ \setfalse\c_font_auto_size
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \let\v_font_identifier_basic\v_font_identifier_basic_saved}
+
+\unexpanded\def\font_helpers_trigger#identifier% make a traced variant
+ {\edef\lastfontidentifier{#identifier}%
+ \ifcsname\v_font_identifier_class\endcsname
+ % \writestatus{fonts}{trigger: reusing \v_font_identifier_class}%
+ \expandafter\font_helpers_trigger_reuse
+ \else
+ % \writestatus{fonts}{trigger: defining \v_font_identifier_class}%
+ \expandafter\font_helpers_trigger_define
+ \fi}
+
+\def\font_helpers_trigger_define#relative#absolute#specification%
+ {\def\v_font_size_relative{#relative}%
+ \def\v_font_size_absolute{#absolute}%
+ \font_helpers_low_level_define{#specification}\v_font_identifier_class
+ \csname\v_font_identifier_class\endcsname
+ \setfalse\c_font_auto_size
+ \ifskipfontcharacteristics \else
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \fi
+ \let\v_font_identifier_class\v_font_identifier_class_saved}
+
+\def\font_helpers_trigger_reuse#relative#absolute#specification%
+ {\csname\v_font_identifier_class\endcsname
+ \setfalse\c_font_auto_size
+ \ifskipfontcharacteristics \else
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \fi
+ \let\v_font_identifier_class\v_font_identifier_class_saved}
+
+%D \macros
+%D {currentfontbodyscale}
+%D
+%D Sometimes we need to have access to the font scale including the \type {a}||\type
+%D {d} sizes. The next macro returns the current scaling factor. Take a look at
+%D \type {cont-log.tex} for an example of its use.
+
+\installcorenamespace{fontenvironments}
+
+\def\currentfontbodysize % gets number (the normal sa 1 etc)
+ {\ifcsname\??fontenvironments\fontclass\s!default\somefontsize\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??fontenvironments\s!default\somefontsize\endcsname
+ \lastnamedcs
+ \else
+ \somefontsize
+ \fi}
+
+\def\currentfontbodyscale % gets character (x xx a etc)
+ {\csname\??fontenvironments
+ \ifcsname\??fontenvironments\fontclass\s!default\fontsize\endcsname\fontclass\s!default\fontsize\orelse
+ \ifcsname\??fontenvironments \s!default\fontsize\endcsname \s!default\fontsize\orelse
+ \ifcsname\??fontenvironments\fontclass\s!default\s!text \endcsname\fontclass\s!default\s!text \orelse
+ \ifcsname\??fontenvironments \s!default\s!text \endcsname \s!default\s!text \else
+ \s!default \fi
+ \endcsname}
+
+\def\font_currentfontbodyscale % gets character (x xx a etc)
+ {\ifcsname\??fontenvironments\fontclass\s!default\fontsize\endcsname\lastnamedcs\orelse
+ \ifcsname\??fontenvironments \s!default\fontsize\endcsname\lastnamedcs\orelse
+ \ifcsname\??fontenvironments\fontclass\s!default\s!text \endcsname\lastnamedcs\orelse
+ \ifcsname\??fontenvironments \s!default\s!text \endcsname\lastnamedcs\else
+ \csname\??fontenvironments \s!default \endcsname \fi}
+
+\def\currentfontscale % used in default definition
+ {\csname\??fontenvironments
+ \ifcsname\??fontenvironments\fontclass\s!default\xfontsize\endcsname\fontclass\s!default\fontsize\orelse
+ \ifcsname\??fontenvironments \s!default\xfontsize\endcsname \s!default\fontsize\orelse
+ \ifcsname\??fontenvironments\fontclass\s!default\s!text \endcsname\fontclass\s!default\s!text \orelse
+ \ifcsname\??fontenvironments \s!default\s!text \endcsname \s!default\s!text \else
+ \s!default \fi
+ \endcsname}
+
+\def\font_currentfontscale % used in default definition
+ {\ifcsname\??fontenvironments\fontclass\s!default\xfontsize\endcsname\lastnamedcs\orelse
+ \ifcsname\??fontenvironments \s!default\xfontsize\endcsname\lastnamedcs\orelse
+ \ifcsname\??fontenvironments\fontclass\s!default\s!text \endcsname\lastnamedcs\orelse
+ \ifcsname\??fontenvironments \s!default\s!text \endcsname\lastnamedcs\else
+ \csname\??fontenvironments \s!default \endcsname \fi}
+
+\setvalue{\??fontenvironments\s!default}{1}
+
+%D In the following macros we use \type {\currentxfontsize} to hold the current
+%D x||size of the font. This enables us to support for instance \type {\sl} inside a
+%D \type {\tx} switch.
+
+\newconstant\currentxfontsize
+
+\def\xfontsize{\ifcase\currentxfontsize\fontsize\or\s!x\else\s!xx\fi}
+
+%D Now we enter the area of font switching. The switching mechanism has to take care
+%D of several situations, like:
+%D
+%D \startitemize[packed]
+%D \item changing the overal document fonts (including margins, headers and footers)
+%D \item changing local fonts (only the running text)
+%D \item smaller and even more smaller alternatives (super- and subscripts)
+%D \stopitemize
+%D
+%D \TEX\ offers a powerfull family mechanism for super- and subscripts in math mode.
+%D In text mode however, we don't use families for the smaller alternatives, and
+%D therefore have to take care of it otherwise.
+%D
+%D \macros
+%D {definebodyfontenvironment,setupbodyfontenvironment}
+%D
+%D The relationship between the several sizes of a font, is
+%D defined by:
+%D
+%D \showsetup{definebodyfontenvironment}
+%D
+%D Later on we will see how these parameters are used, so for the moment we stick
+%D with an example:
+%D
+%D \starttyping
+%D \definebodyfontenvironment
+%D [12pt]
+%D [ text=12pt,
+%D script=9pt,
+%D scriptscript=7pt,
+%D x=10pt,
+%D xx=8pt,
+%D big=12pt,
+%D small=10pt]
+%D \stoptyping
+%D
+%D The first argument specifies the bodyfont size to which the settings apply. All
+%D second parameters are specified in dimensions and tell us more about related
+%D sizes.
+%D
+%D Afterwards, one can change values with
+%D
+%D \showsetup{setupbodyfontenvironment}
+%D
+%D When instead of a size the keyword \type{unknown} is
+%D passed, fractions (relations) are used instead of fixed
+%D sizes.
+
+%D {\bf Remark:} We need to cover the following cases, otherwise users can get
+%D confused:
+%D
+%D \starttyping
+%D \setupbodyfont[23pt]
+%D
+%D \definebodyfontenvironment[23pt]
+%D \setupbodyfont[23pt]
+%D
+%D \definebodyfontenvironment[23pt]
+%D \definebodyfont[23pt][rm,ss,tt][default]
+%D \setupbodyfont[23pt]
+%D \stoptyping
+%D
+%D Beware: while some font defs can be global, the bodyfont environment checks
+%D local. This means that multiple local checks resulting in definitions are not
+%D that efficient. So, apart from an occasional switch, one should define an
+%D environment at the outer level.
+
+% \definebodyfontenvironment[33pt]
+% \definebodyfontenvironment[dejavu][default][1=.5]
+% \definebodyfontenvironment[dejavu][default][x=1.2]
+% \definebodyfontenvironment[dejavu][default][a=5]
+% \definebodyfontenvironment[dejavu][33pt][x=100pt]
+
+% the lookup order is:
+%
+% [class] [dimension] [parameters]
+% [class] [default] [parameters] % factors
+% [dimension] [parameters]
+% [default] [parameters] % factors
+%
+% with defaults providing factors
+
+% todo: class:size
+% todo: make assignments global
+
+\letvalue\??fontenvironments\empty % so we default to empty
+
+\def\bodyfontvariable#parameter%
+ {\csname\??fontenvironments
+ \ifcsname\??fontenvironments\fontclass\normalizedbodyfontsize#parameter\endcsname\fontclass\normalizedbodyfontsize#parameter\orelse
+ \ifcsname\??fontenvironments\fontclass #parameter\endcsname\fontclass #parameter\orelse
+ \ifcsname\??fontenvironments \normalizedbodyfontsize#parameter\endcsname \normalizedbodyfontsize#parameter\orelse
+ \ifcsname\??fontenvironments\s!default #parameter\endcsname\s!default #parameter\fi
+ \endcsname}
+
+\def\font_bodyfontvariable#parameter%
+ {\ifcsname\??fontenvironments\fontclass\normalizedbodyfontsize#parameter\endcsname\lastnamedcs\orelse
+ \ifcsname\??fontenvironments\fontclass #parameter\endcsname\lastnamedcs\orelse
+ \ifcsname\??fontenvironments \normalizedbodyfontsize#parameter\endcsname\lastnamedcs\orelse
+ \ifcsname\??fontenvironments\s!default #parameter\endcsname\lastnamedcs\fi}
+
+\def\bodyfontsizevariable#size#parameter%
+ {\csname\??fontenvironments
+ \ifcsname\??fontenvironments\fontclass#size#parameter\endcsname\fontclass#size#parameter\orelse
+ \ifcsname\??fontenvironments\fontclass #parameter\endcsname\fontclass #parameter\orelse
+ \ifcsname\??fontenvironments #size#parameter\endcsname #size#parameter\orelse
+ \ifcsname\??fontenvironments\s!default #parameter\endcsname\s!default #parameter\fi
+ \endcsname}
+
+\def\font_bodyfontsizevariable#size#parameter%
+ {\ifcsname\??fontenvironments\fontclass#size#parameter\endcsname\lastnamedcs\orelse
+ \ifcsname\??fontenvironments\fontclass #parameter\endcsname\lastnamedcs\orelse
+ \ifcsname\??fontenvironments #size#parameter\endcsname\lastnamedcs\orelse
+ \ifcsname\??fontenvironments\s!default #parameter\endcsname\lastnamedcs\fi}
+
+\def\bodyfontinterlinespace{\bodyfontvariable\c!interlinespace} % used elsewhere
+
+\def\bodyfontdimension#class#size#parameter#body%
+ {\the\dimexpr
+ \ifcsname\??fontenvironments #class#size#parameter\endcsname \lastnamedcs \orelse
+ \ifcsname\??fontenvironments#class\s!default#parameter\endcsname \lastnamedcs\dimexpr#body\relax\orelse % factor
+ \ifcsname\??fontenvironments #size#parameter\endcsname \lastnamedcs \else
+ \lastnamedcs\dimexpr#body\relax\fi % factor
+ \relax}
+
+\unexpanded\def\definebodyfontenvironment
+ {\dotripleempty\font_basics_define_body_font_environment}
+
+\let\setupbodyfontenvironment\definebodyfontenvironment
+
+\installcorenamespace{fontenvironmentknown}
+
+\def\font_helpers_register_environment#class#body%
+ {\expandafter\let\csname\??fontenvironmentknown#class#body\endcsname\empty}
+
+\newmacro\m_font_body
+\newmacro\m_font_body_normalized
+
+\def\font_basics_define_body_font_environment
+ {\ifthirdargument
+ \singleexpandafter\font_basics_define_body_font_environment_class
+ \orelse\ifsecondargument
+ \expandafter\font_basics_define_body_font_environment_empty
+ \else
+ \expandafter\font_basics_define_body_font_environment_unset
+ \fi}
+
+%D First we handle the class specific case. Beware: you can change values before
+%D a bodyfont is loaded but changing them afterwards can be sort of tricky as
+%D values are not consulted afterwards.
+
+\def\processbodyfontenvironmentlist#1% no \unexpanded as then we cannot use it in alignments
+ {\clf_processbodyfontsizes{\strippedcsname#1}}
+
+\def\bodyfontenvironmentlist
+ {\clf_getbodyfontsizes}
+
+\def\font_basics_define_body_font_environment_class[#class][#body][#settings]%
+ {\edef\m_font_body{#body}%
+ \ifx\m_font_body\s!default
+ % these are the last resort within a class
+ \getrawparameters[\??fontenvironments#class\s!default][#settings]%
+ \else
+ \normalizebodyfontsize\m_font_body_normalized\m_font_body
+ \font_basics_define_body_font_environment_size[#class][\m_font_body_normalized][#settings]%
+ \clf_registerbodyfontsize{\m_font_body_normalized}%
+ \fi}
+
+%D The empty case uses the same code but needs to ignore the current class settings
+%D (just to be sure, as it's not really needed).
+
+\def\font_basics_define_body_font_environment_empty[#body][#settings][#dummy]%
+ {\push_macro_fontclass
+ \let\fontclass\empty
+ \font_basics_define_body_font_environment_class[][#body][#settings]%
+ \pop_macro_fontclass}
+
+\def\font_basics_define_body_font_environment_unset[#body][#dummya][#dummyb]%
+ {\push_macro_fontclass
+ \let\fontclass\empty
+ \font_basics_define_body_font_environment_class[][#body][]%
+ \pop_macro_fontclass}
+
+%D We don't check too soon as we can refer to later definitions.
+
+\newconditional\c_font_defining_environment_state % controls messages
+
+\def\font_basics_define_body_font_environment_size[#class][#normalizedbody][#settings]% normalized body
+ {\getrawparameters[\??fontenvironments#class#normalizedbody][#settings]%
+ \ifcsname\??fontenvironmentknown#class#normalizedbody\endcsname
+ % environment and size already defined
+ \orelse\ifproductionrun
+ \push_macro_fontclass
+ \edef\fontclass{#class}%
+ \font_helpers_register_environment{#class}{#normalizedbody}%
+ \settrue\c_font_defining_environment_state
+ \font_helpers_define_unknown_font{#normalizedbody}% current class
+ \setfalse\c_font_defining_environment_state
+ \pop_macro_fontclass
+ \fi
+ \font_helpers_register_fontbody{#normalizedbody}}
+
+%D Checking
+
+\def\font_helpers_check_bodyfont_environment#normalizedbody#body%
+ {\ifcsname\??fontenvironmentknown\fontclass#normalizedbody\endcsname
+ % already defined
+ \else
+ \font_helpers_check_bodyfont_environment_indeed{#normalizedbody}{#body}%
+ \fi}
+
+\def\font_helpers_check_bodyfont_environment_indeed#normalizedbody#body%
+ {\font_helpers_register_environment\fontclass{#normalizedbody}%
+ \ifcsname\??fontbodyknown#normalizedbody\endcsname
+ \else
+ \font_helpers_define_unknown_font{#normalizedbody}%
+ \fi}
+
+%D We default all parameters to the main bodyfont size, so the next setup is valid
+%D too:
+%D
+%D \starttyping
+%D \definebodyfontenvironment[24pt]
+%D \stoptyping
+%D
+%D All parameters can be redefined when needed, so one doesnot have to stick to the
+%D default ones.
+
+%D \macros
+%D {definebodyfont}
+%D
+%D The next step in defining a bodyfont involves the actual font files, which can be
+%D recognized by their extension \type {tfm}. Installing those file is often beyond
+%D the scope of the user and up to the system administrator.
+%D
+%D \showsetup{definebodyfont}
+%D
+%D This commands takes three arguments: a (series of) bodyfont size(s), the style
+%D group to which the definitions belong, and an alternative, as specified by the
+%D \TEX\ (math) families, extended with~a, b~\unknown.
+%D
+%D We show two examples, that show all the alternative scaling options. The \type
+%D {\tfa} alternatives can be extended with \type {\bfa}, \type {\slb}, etc. or even
+%D \type {e} and higher alternatives. The magic scaled values are derived from plain
+%D \TEX's \type {\magstep}:
+%D
+%D \starttyping
+%D \definebodyfont [12pt] [rm]
+%D [tf=cmr12,
+%D bf=cmbx12,
+%D it=cmti12,
+%D sl=cmsl12,
+%D bi=cmbxti10 at 12pt,
+%D bs=cmbxsl10 at 12pt,
+%D tfa=cmr12 scaled 1.200,
+%D tfb=cmr12 scaled 1.440,
+%D tfc=cmr12 scaled 1.728,
+%D tfd=cmr12 scaled 2.074,
+%D sc=cmcsc10 at 12pt]
+%D
+%D \definebodyfont [12pt,11pt,10pt,9pt,8pt] [rm]
+%D [tf=lbr sa 1,
+%D bf=lbd sa 1,
+%D it=lbi sa 1,
+%D sl=lbsl sa 1,
+%D bi=lbdi sa 1,
+%D bs=lbdi sa 1,
+%D tfa=lbr sa 1.200,
+%D tfb=lbr sa 1.440,
+%D tfc=lbr sa 1.728,
+%D tfd=lbr sa 2.074,
+%D sc=lbr sa 0.833]
+%D \stoptyping
+%D
+%D The second example shows that we can define more sizes at once. The main
+%D difference between these examples is that the Computer Modern Roman come in many
+%D design sizes. This means that there we cannot define them in bulk using \type
+%D {sa}. Instead of \type {rm} (roman) one can define \type {ss} (sans serif), \type
+%D {tt} (teletype), \type {hw} (hand written), \type {cg} (calygraphic) and whatever
+%D styles.
+%D
+%D The first argument may be a comma separated list. This, combined with
+%D specifications using \type{sa} can save a lot of typing. Although all arguments
+%D should be specified, we treat the second argument as optional.
+%D
+%D Defining a bodyfont involves two actions: defining the specific style related
+%D alternatives, like \type {\rma}, \type {\bfa} and \type {\rmsla}, and storing the
+%D definitions of their bodyfont size related fonts. The first step is bodyfont
+%D independant but executed every time. This permits user definitions like \type
+%D {\tfw} or \type {\bfq} for real large alternatives.
+%D
+%D If we move design size info to the lfg file (after all only lm has design sizes)
+%D we can get rid of much code .. 2012 or so.
+
+\installcorenamespace{fontdefinitions}
+
+% [class] [name] [rm,ss] [settings]
+% [class] [10pt,11pt] [rm,ss] [settings]
+% [class] [10pt,11pt] [rm,ss] [name]
+
+% [class] [name] [settings] == [name] [rm] [settings]
+% [class] [10pt,11pt] [settings] == [name] [rm] [settings]
+% [class] [10pt,11pt] [name] == [10pt,11pt] [rm] [name]
+
+\unexpanded\def\definebodyfont
+ {\doquadrupleempty\font_basics_define_body_font}
+
+\def\font_basics_define_body_font[#1][#2][#3][#4]%
+ {\iffourthargument
+ \processcommacommand[#1]{\font_basics_define_body_font_class_given[#2][#3][#4]}%
+ \else
+ \font_basics_define_body_font_class_known[#1][#2][#3]%
+ \fi}
+
+\def\font_basics_define_body_font_class_given[#1][#2][#3]#4%
+ {\push_macro_fontclass
+ \doifelse{#4}\s!default
+ {\let\fontclass\empty}
+ {\def\fontclass{#4}}%
+ \definebodyfont[#1][#2][#3]%
+ \pop_macro_fontclass}
+
+\def\font_basics_define_body_font_class_known
+ {\ifthirdargument
+ \singleexpandafter\font_basics_define_body_font_a
+ \orelse\ifsecondargument
+ \expandafter\font_basics_define_body_font_b
+ \else
+ \expandafter\font_basics_define_body_font_c
+ \fi}
+
+\unexpanded\def\font_basics_define_body_font_b[#whatever][#specification][#dummy]% body|identifier defs|identifier
+ {\font_basics_define_body_font_a[#whatever][\s!rm][#specification]}
+
+\unexpanded\def\font_basics_define_body_font_c[#whatever][#dummya][#dummyb]% body|identifier
+ {\font_basics_define_body_font_a[#whatever][\s!rm][]}
+
+\unexpanded\def\font_basics_define_body_font_a[#whatever]%
+ {\doifelsenumber{#whatever}%
+ \font_basics_define_body_font_body
+ \font_basics_define_body_font_name
+ [#whatever]}
+
+\unexpanded\def\font_basics_define_body_font_body[#body][#style][#specification]%
+ {\ifcondition\validassignment{#specification}%
+ \expandafter\font_basics_define_body_font_body_assignment
+ \else
+ \expandafter\font_basics_define_body_font_body_identifier
+ \fi
+ [#body][#style][#specification]}%
+
+\unexpanded\def\font_basics_define_body_font_name[#name][#style][#specification]%
+ {\ifcondition\validassignment{#specification}%
+ \expandafter\font_basics_define_body_font_name_assignment
+ \else
+ \expandafter\font_basics_define_body_font_name_identifier
+ \fi
+ [#name][#style][#specification]}%
+
+\unexpanded\def\font_basics_define_body_font_body_assignment[#bodylist][#stylelist][#assignments]%
+ {\processcommalist[#bodylist]{\font_basics_define_body_font_body_assignment_a{#stylelist}{#assignments}}}
+
+\unexpanded\def\font_basics_define_body_font_body_assignment_a#stylelist#assignments#body%
+ {\normalizebodyfontsize\m_font_asked_body{#body}%
+ % normally we define quite a lot in advance, i.e global defs
+ \font_helpers_check_bodyfont_environment\m_font_asked_body\m_font_asked_body % !!
+ \processcommalist[#stylelist]{\font_basics_define_body_font_body_assignment_b{#assignments}}}
+
+\unexpanded\def\font_basics_define_body_font_body_assignment_b#assignments#style%
+ {\edef\m_font_asked_style{#style}%
+ \processcommalist[#assignments]\font_basics_define_body_font_defs}
+
+\unexpanded\def\font_basics_define_body_font_defs
+ {\ifx\fontclass\empty
+ \expandafter\font_basics_define_body_font_defs_nop
+ \else
+ \expandafter\font_basics_define_body_font_defs_yes
+ \fi}
+
+\unexpanded\def\font_basics_define_body_font_defs_yes_normal#assignment%
+ {\ifx\m_font_asked_style\s!mm
+ \expandafter\font_basics_define_body_font_yes_mm
+ \else
+ \expandafter\font_basics_define_body_font_yes_xx
+ \fi[#assignment]}
+
+\unexpanded\def\font_basics_define_body_font_defs_nop_normal#assignment%
+ {\ifx\m_font_asked_style\s!mm
+ \expandafter\font_basics_define_body_font_nop_mm
+ \else
+ \expandafter\font_basics_define_body_font_nop_xx
+ \fi[#assignment]}
+
+\unexpanded\def\font_basics_define_body_font_defs_yes_traced#assignment%
+ {\writestatus\m!fonts{[\fontclass] [\m_font_asked_body] [\m_font_asked_style] [#assignment]}%
+ \ifx\m_font_asked_style\s!mm
+ \expandafter\font_basics_define_body_font_yes_mm
+ \else
+ \expandafter\font_basics_define_body_font_yes_xx
+ \fi[#assignment]}
+
+\unexpanded\def\font_basics_define_body_font_defs_nop_traced#assignment%
+ {\writestatus\m!fonts{[\fontclass] [\m_font_asked_body] [\m_font_asked_style] [#assignment]}%
+ \ifx\m_font_asked_style\s!mm
+ \expandafter\font_basics_define_body_font_nop_mm
+ \else
+ \expandafter\font_basics_define_body_font_nop_xx
+ \fi[#assignment]}
+
+\let\font_basics_define_body_font_defs_yes\font_basics_define_body_font_defs_yes_normal
+\let\font_basics_define_body_font_defs_nop\font_basics_define_body_font_defs_nop_normal
+
+\appendtoks
+ \let\font_basics_define_body_font_defs_yes\font_basics_define_body_font_defs_yes_traced
+ \let\font_basics_define_body_font_defs_nop\font_basics_define_body_font_defs_nop_traced
+\to \t_font_tracers_definitions
+
+%D We split into two characters (first part of spec) and the rest: the first two are
+%D the style and the rest is a size, although in practice one will seldom define the
+%D size directly. We might even drop that as it gives faster code.
+
+\unexpanded\def\font_basics_define_body_font_nop_xx[#one#two#rest=#value]% local
+ {\ifcsname\m_font_asked_style#one#two#rest\endcsname\else\font_basics_check_fontname_combination\m_font_asked_style{#one#two}{#rest}\fi
+ \expandafter\let\csname\??fontinstanceclass\m_font_asked_body-\m_font_asked_style-#one#two-#rest-0\endcsname\undefined
+ \unexpanded\expandafter\normaledef\csname\??fontinstanceready\m_font_asked_body-\m_font_asked_style-#one#two-#rest-0\endcsname
+ {\font_helpers_trigger{\m_font_asked_body-\m_font_asked_style-#one#two#rest}{\noexpand\font_rscale_xx{\m_font_asked_style}}{\m_font_asked_body}{\normalunexpanded{#value}}}%
+ \expandafter\let\csname\??fontinstanceclass\m_font_asked_body-\m_font_asked_style-#one#two-#rest-4\endcsname\undefined
+ \unexpanded\expandafter\normaledef\csname\??fontinstanceready\m_font_asked_body-\m_font_asked_style-#one#two-#rest-4\endcsname
+ {\font_helpers_trigger{\m_font_asked_body-\m_font_asked_style-#one#two#rest}{\noexpand\font_rscale_xx{\m_font_asked_style}}{\m_font_asked_body}{\normalunexpanded{#value}}}%
+ \expandafter\let\csname\??fontinstanceclass\m_font_asked_body-\m_font_asked_style-#one#two-#rest-5\endcsname\undefined
+ \unexpanded\expandafter\normaledef\csname\??fontinstanceready\m_font_asked_body-\m_font_asked_style-#one#two-#rest-5\endcsname
+ {\font_helpers_trigger{\m_font_asked_body-\m_font_asked_style-#one#two#rest}{\noexpand\font_rscale_xx{\m_font_asked_style}}{\m_font_asked_body}{\normalunexpanded{#value}}}%
+ }
+
+\unexpanded\def\font_basics_define_body_font_yes_xx[#one#two#rest=#value]% global
+ {\ifcsname\m_font_asked_style#one#two#rest\endcsname\else\font_basics_check_fontname_combination\m_font_asked_style{#one#two}{#rest}\fi
+ \expandafter\glet\csname\??fontinstanceclass\fontclass-\m_font_asked_body-\m_font_asked_style-#one#two-#rest-1\endcsname\undefined
+ \unexpanded\expandafter\normalxdef\csname\??fontinstanceready\fontclass-\m_font_asked_body-\m_font_asked_style-#one#two-#rest-0\endcsname
+ {\font_helpers_trigger{\m_font_asked_body-\m_font_asked_style-#one#two#rest-0}{\number\p_font_rscale}{\m_font_asked_body}{\normalunexpanded{#value}}}%
+ \expandafter\glet\csname\??fontinstanceclass\fontclass-\m_font_asked_body-\m_font_asked_style-#one#two-#rest-2\endcsname\undefined
+ \unexpanded\expandafter\normalxdef\csname\??fontinstanceready\fontclass-\m_font_asked_body-\m_font_asked_style-#one#two-#rest-4\endcsname
+ {\font_helpers_trigger{\m_font_asked_body-\m_font_asked_style-#one#two#rest-4}{\number\p_font_rscale}{\m_font_asked_body}{\normalunexpanded{#value}}}%
+ \expandafter\glet\csname\??fontinstanceclass\fontclass-\m_font_asked_body-\m_font_asked_style-#one#two-#rest-3\endcsname\undefined
+ \unexpanded\expandafter\normalxdef\csname\??fontinstanceready\fontclass-\m_font_asked_body-\m_font_asked_style-#one#two-#rest-5\endcsname
+ {\font_helpers_trigger{\m_font_asked_body-\m_font_asked_style-#one#two#rest-5}{\number\p_font_rscale}{\m_font_asked_body}{\normalunexpanded{#value}}}%
+ }
+
+% \writestatus{fonts}{define \m_asked_style\space yes: {\expandafter\meaning\csname\fontclass\m_font_asked_body\m_font_asked_style#one#two#rest\endcsname}
+
+%D Here the rest concerns rl or lr so in this case it is not a size specifier but
+%D a directional one.
+
+\unexpanded\def\font_basics_define_body_font_nop_mm[#one#two#rest=#value]% local
+ {%\ifcsname\s!mm\endcsname\else\font_basics_check_fontname_combination\s!mm{#one#two}{#rest}\fi
+ \expandafter\let\csname\??fontinstanceclass\m_font_asked_body-\s!mm-#one#two#rest-1\endcsname\undefined
+ % \expandafter\let\csname\??fontinstanceclass\m_font_asked_body-\s!mm-#one#two#rest-2\endcsname\undefined
+ % \expandafter\let\csname\??fontinstanceclass\m_font_asked_body-\s!mm-#one#two#rest-3\endcsname\undefined
+ \unexpanded\expandafter\normaledef\csname\??fontinstanceready\m_font_asked_body-\s!mm-#one#two#rest\endcsname
+ {\font_helpers_trigger{\m_font_asked_body-\s!mm-#one#two#rest}{\noexpand\font_rscale_mm}{\m_font_asked_body}{\normalunexpanded{#value}}}%
+ }
+
+% \writestatus{fonts}{define \m_asked_style\space nop: \expandafter\meaning\csname\m_font_asked_body\m_font_asked_style#one#two#rest\endcsname}%
+
+\unexpanded\def\font_basics_define_body_font_yes_mm[#one#two#rest=#value]% global
+ {%\ifcsname\s!mm\endcsname\else\font_basics_check_fontname_combination\s!mm{#one#two}{#rest}\fi
+ \expandafter\glet\csname\??fontinstanceclass\fontclass-\m_font_asked_body-\s!mm-#one#two#rest-1\endcsname\undefined
+ % \expandafter\glet\csname\??fontinstanceclass\fontclass-\m_font_asked_body-\s!mm-#one#two#rest-2\endcsname\undefined
+ % \expandafter\glet\csname\??fontinstanceclass\fontclass-\m_font_asked_body-\s!mm-#one#two#rest-3\endcsname\undefined
+ \unexpanded\expandafter\normalxdef\csname\??fontinstanceready\fontclass-\m_font_asked_body-\s!mm-#one#two#rest\endcsname
+ {\font_helpers_trigger{\m_font_asked_body-\s!mm-#one#two#rest}{\number\p_font_rscale}{\m_font_asked_body}{\normalunexpanded{#value}}}%
+ }
+
+% \writestatus{fonts}{define \m_asked_style\space yes: \expandafter\meaning\csname\fontclass\m_font_asked_body\m_font_asked_style#one#two#rest\endcsname}%
+
+\unexpanded\def\font_basics_define_body_font_body_identifier[#bodylist][#stylelist][#name]%
+ {\processcommalist[#bodylist]{\font_basics_define_body_font_body_identifier_a{#stylelist}{#name}}}
+
+\unexpanded\def\font_basics_define_body_font_body_identifier_a#stylelist#name#body%
+ {\normalizebodyfontsize\m_font_asked_body{#body}%
+ \font_helpers_check_bodyfont_environment\m_font_asked_body\m_font_asked_body % !!
+ \processcommalist[#stylelist]{\font_basics_define_body_font_body_identifier_b{#name}}}
+
+\unexpanded\def\font_basics_define_body_font_body_identifier_b#name#style%
+ {\edef\m_font_asked_style{#style}%
+ %\writestatus\m!fonts{[\fontclass] [\m_font_asked_body] [\m_font_asked_style] => [#name]}%
+ \csname\??fontdefinitions#name:\m_font_asked_style\endcsname} % no checking
+
+\unexpanded\def\font_basics_define_body_font_name_assignment[#name][#stylelist][#assignments]%
+ {\processcommalist[#stylelist]{\font_basics_define_body_font_name_assignment_a{#name}{#assignments}}}
+
+\unexpanded\def\font_basics_define_body_font_name_assignment_a#name#assignments#style%
+ {%\writestatus\m!fonts{[#name:#style] => [#assignments]}%
+ \setevalue{\??fontdefinitions#name:#style}{\font_basics_define_body_font_default{#assignments}}}
+
+\unexpanded\def\font_basics_define_body_font_name_identifier[#name][#stylelist][#identifier]%
+ {\processcommalist[#stylelist]{\font_basics_define_body_font_name_identifier_a{#name}{#identifier}}}
+
+\unexpanded\def\font_basics_define_body_font_name_identifier_a#name#identifier#style%
+ {%\writestatus\m!fonts{[#name:#style] => [##identifier:#style]}%
+ \ifcsname\??fontdefinitions#name:#style\endcsname
+ \expandafter\let\csname\??fontdefinitions#name:#style\expandafter\endcsname\csname\??fontdefinitions#identifier:#style\endcsname
+ \else
+ \expandafter\def\csname\??fontdefinitions#name:#style\endcsname{\csname\??fontdefinitions#identifier:#style\endcsname}%
+ \fi}
+
+%D The unknown:
+
+\newconditional\c_font_defining_unknown
+\newconditional\c_font_defining_state
+
+\unexpanded\def\font_helpers_define_unknown_font#body% one level only
+ {\font_helpers_register_fontbody{#body}% prevents loop, can go
+ \setfalse\c_font_defining_state
+ \font_helpers_process_relative_size_list{\font_helpers_define_unknown_check_sizes{#body}}%
+ \ifconditional\c_font_defining_state
+ \setfalse\c_font_defining_state
+ \font_helpers_process_style_list{\font_helpers_define_unknown_check_definitions{#body}}%
+ \ifconditional\c_font_defining_state
+ \ifconditional\c_font_defining_environment_state\else
+ %\showmessage\m!fonts{14}{#body}% main
+ \clf_registerunknownbodysize{#body}%
+ \fi
+ \setfalse\c_font_defining_state
+ \font_helpers_register_fontbody{#body}%
+ % needed ?
+ \ifconditional\c_font_defining_unknown
+ \else
+ \settrue\c_font_defining_unknown
+ \font_helpers_process_relative_size_list{\font_helpers_define_unknown_check_relatives{#body}}%
+ \setfalse\c_font_defining_unknown
+ \fi
+ \fi
+ \fi}
+
+\def\font_helpers_define_unknown_check_sizes#body#relativesize%
+ {\ifcsname\??fontenvironments\s!default#relativesize\endcsname % fontclass ?
+ \expandafter\normalizebodyfontsize\csname\??fontenvironments#body#relativesize\endcsname{\csname\??fontenvironments\s!default#relativesize\endcsname\dimexpr#body\relax}%
+ \settrue\c_font_defining_state
+ \fi}
+
+\def\font_helpers_define_unknown_check_definitions#body#style%
+ {\ifcsname\??fontdefinitions\s!default:#style\endcsname
+ \edef\m_font_asked_body{#body}%
+ \edef\m_font_asked_style{#style}%
+ \lastnamedcs
+ \settrue\c_font_defining_state
+ \fi}
+
+% \def\font_helpers_define_unknown_check_relatives#body#relativesize%
+% {\ifcsname\??fontbodyknown\csname\??fontenvironments#body#relativesize\endcsname\endcsname \else
+% % how \lastnamedcs here
+% \expandafter\font_helpers_define_unknown_font\csname\??fontenvironments#body#relativesize\endcsname
+% \settrue\c_font_defining_state
+% \fi}
+
+\def\font_helpers_define_unknown_check_relatives#body#relativesize%
+ {\ifcsname\??fontbodyknown\csname\??fontenvironments#body#relativesize\endcsname\endcsname \else
+ \expandafter\font_helpers_define_unknown_font\csname\??fontenvironments#body#relativesize\endcsname
+ \settrue\c_font_defining_state
+ \fi}
+
+\unexpanded\def\font_basics_define_body_font_default#assignments%
+ {\font_helpers_check_relative_font_size\m_font_asked_style % still needed here?
+ \ifcsname\m_font_asked_style\endcsname\else
+ \normalexpanded{\definefontstyle[\m_font_asked_style][\m_font_asked_style]}%
+ \fi
+ \processcommalist[#assignments]\font_basics_define_body_font_defs
+ \let\p_font_rscale\v_font_rscale_default}
+
+%D These macros show that quite some definitions take place. Fonts are not loaded
+%D yet! This means that at format generation time, no font files are present.
+
+\unexpanded\def\font_basics_switch_points#body%
+ {\ifcsname\??fontbodyknown#body\endcsname \else
+ % we need to check the relative sizes for this body
+ \font_helpers_define_unknown_font{#body}%
+ \fi%
+ \ifcsname\??fontbodyknown#body\endcsname % always true now
+ \font_basics_complete_switch{#body}%
+ \localbodyfontsize#body\relax
+ \normalizebodyfontsize\normalizedbodyfontsize\localbodyfontsize
+ \font_helpers_check_bodyfont_environment\normalizedbodyfontsize\normalizedbodyfontsize % !!
+ \else
+ \showmessage\m!fonts4{#body}%
+ \fi}
+
+\unexpanded\def\font_basics_switch_style#style%
+ {\ifcsname\??fontstyle#style\endcsname
+ \lastnamedcs
+ \edef\fontstyle{#style}%
+ \ifmmode\mr\fi % in order to be compatible with \rm in math mode
+ % \the\everybodyfont % cleaner, in setting size as well as style
+ \else
+ \showmessage\m!fonts5{#style}%
+ \fi}
+
+%D Here comes the main font switching macros. These macros handle changes in size as
+%D well as returning to the global bodyfont size.
+
+\ifdefined\font_preloads_at_definition \else \let\font_preloads_at_definition\relax \fi
+
+\def\font_helpers_set_font#method#specification%
+ {\edef\m_font_specification{#specification}%
+ \ifx\m_font_specification\empty \else
+ \ifx\m_font_specification\v!global % we can have all kind of presets
+ \restoreglobalbodyfont
+ \else
+ \processcommacommand[\m_font_specification]{\font_helpers_set_font_check_size}%
+ \processcommacommand[\m_font_specification]{\font_helpers_set_font_set_font{#method}}%
+ \ifproductionrun
+ \font_preloads_at_definition
+ \font_basics_switch_points\normalizedbodyfontsize
+ \font_basics_switch_style\fontstyle
+ \ifx\defaultfontclass\empty
+ \let\defaultfontclass\fontclass
+ \fi
+ \fi
+ \fi
+ \currentxfontsize\zerocount
+ \fi}
+
+\def\font_helpers_set_font_check_size#option%
+ {\doifelsenumber{#option}{\font_helpers_check_bodyfont_environment{#option}{#option}}\donothing}
+
+\def\font_helpers_set_font_set_font#method#option% method=1: set, method=2: switch
+ {\doifsomething{#option}{\font_helpers_set_font_set_font_option{#method}{#option}}}
+
+\def\font_helpers_set_font_set_font_option#method#option%
+ {\doifelsenumber{#option}%
+ \font_helpers_set_font_set_font_option_body
+ \font_helpers_set_font_set_font_option_keyword
+ {#method}{#option}{#option}}
+
+\newmacro\m_font_keyword
+
+\unexpanded\def\font_helpers_set_font_set_font_option_keyword#method#keyword#message%
+ {\edef\m_font_keyword{#keyword}%
+ \ifcsname\??fontenvironments\normalizedbodyfontsize\m_font_keyword\endcsname
+ \edef\m_font_step{\font_bodyfontvariable\m_font_keyword}%
+ \normalexpanded{\font_helpers_set_font_set_font_option_body{#method}{\m_font_step}{#message}}%
+ \orelse\ifx\m_font_keyword\v!reset
+ \let\fontstyle\empty % new 31/7/2006
+ \let\fontsize \empty
+ \orelse\ifcsname\??fontstyle\m_font_keyword\endcsname
+ \let\fontstyle\m_font_keyword
+ \else
+ \setcurrentfontclass\m_font_keyword
+ \ifcase#method\relax
+ \let\globalfontclass\globalfontclass % -)
+ \else
+ \let\globalfontclass\fontclass
+ \fi
+ \font_helpers_set_fontstyle_of_fontclass
+ \fi}
+
+\def\font_helpers_set_fontstyle_of_fontclass % will be overloaded later
+ {\let\fontstyle\s!rm}
+
+\unexpanded\def\font_helpers_set_font_set_font_option_body#method#body#message%
+ {\normalizebodyfontsize\normalizedsetfont{#body}% redundant for some calls
+ \ifcsname\??fontbodyknown\normalizedsetfont\endcsname \else
+ \font_helpers_define_unknown_font\normalizedsetfont
+ \fi
+ \ifcsname\??fontbodyknown\normalizedsetfont\endcsname
+ \localbodyfontsize\normalizedsetfont
+ \let\normalizedbodyfontsize\normalizedsetfont
+ \else
+ \showmessage\m!fonts4{#message}%
+ %\font_helpers_set_font_set_font_option_body_fallbacks{#method}{#body}%
+ \fi}
+
+% we need to check the fontclass
+
+\def\registerfontclass#class%
+ {\letgvalue{\??fontclassyes#class}\v!yes} % global ?
+
+\def\setcurrentfontclass#class%
+ {\ifcsname\??fontclassyes#class\endcsname
+ \edef\fontclass{#class}%
+ \orelse\ifcsname\??fontclassnop#class\endcsname
+ % already tried
+ \else % too messy: \ifcase\currentgrouplevel % (unpredictable)
+ \trycurrentfontclass{#class}%
+ \fi}
+
+\ifdefined\trycurrentfontclass \else
+
+ \unexpanded\def\trycurrentfontclass#typeface%
+ {\letvalueempty{\??fontclassnop#typeface}}
+
+\fi
+
+\let\defaultfontstyle \s!rm
+\let\defaultfontalternative\s!tf
+\let\defaultfontsize \empty
+\let\defaultfontface \!!zerocount
+
+%D So far for synchronisation. (We can inline the following macros.)
+
+\unexpanded\def\setcurrentfont#body#style#alternative#size% not used
+ {\edef\fontbody {#body}%
+ \edef\fontstyle {#style}%
+ \edef\fontalternative{#alternative}%
+ \edef\fontsize {#size}%
+ \font_helpers_check_big_math_synchronization
+ \font_helpers_synchronize_font}
+
+\unexpanded\def\setcurrentfontbody#body% % not used
+ {\edef\fontbody{#body}%
+ \font_helpers_synchronize_font}
+
+% For Taco: optional fall backs:
+
+\ifdefined\font_typescripts_inherit_check \else
+ \let\font_typescripts_inherit_check\gobbleoneargument % implemented in type-ini
+\fi
+
+\unexpanded\def\font_helpers_set_current_font_style#style%
+ {\edef\fontstyle{#style}%
+ \font_typescripts_inherit_check\fontstyle
+ \ifmmode\mr\fi % otherwise \rm not downward compatible ... not adapted yet
+ \font_helpers_synchronize_font}
+
+\unexpanded\def\font_helpers_set_current_xsize_alternative#xsize#alternative%
+ {\edef\fontface{#xsize}%
+ \edef\fontalternative{#alternative}%
+ \font_helpers_synchronize_font}
+
+\unexpanded\def\font_helpers_set_current_font_alternative#alternative%
+ {\edef\fontalternative{#alternative}%
+ \font_helpers_synchronize_font}
+
+\unexpanded\def\font_helpers_set_current_font_size#size%
+ {\edef\fontsize{#size}%
+ \font_helpers_check_big_math_synchronization % double? better in everymath?
+ \font_helpers_synchronize_font}
+
+\unexpanded\def\font_helpers_set_current_font_style_alternative#style#alternative% \rmsl
+ {\edef\fontstyle {#style}%
+ \edef\fontalternative{#alternative}%
+ \font_helpers_synchronize_font}
+
+\unexpanded\def\font_helpers_set_current_font_style_size#style#size% \rma
+ {\edef\fontstyle{#style}%
+ \edef\fontsize {#size}%
+ \font_helpers_check_big_math_synchronization % double? better in everymath?
+ \font_helpers_synchronize_font}
+
+\unexpanded\def\font_helpers_set_current_font_alternative_size#alternative#size% \sla
+ {\edef\fontalternative{#alternative}%
+ \edef\fontsize {#size}%
+ \font_helpers_check_big_math_synchronization % double? better in everymath?
+ \font_helpers_synchronize_font}
+
+\unexpanded\def\font_helpers_set_current_font_style_alternative_size#style#alternative#size% \rmsla
+ {\edef\fontstyle {#style}%
+ \edef\fontalternative{#alternative}%
+ \edef\fontsize {#size}%
+ \font_helpers_check_big_math_synchronization % double? better in everymath?
+ \font_helpers_synchronize_font}
+
+\unexpanded\def\font_helpers_synchronize_font % we can have dups i.e. no need to let fontstrategy
+ {\ifx\fontclass\empty
+ \applyfontstrategies
+ \else
+ \applyfontclassstrategies
+ \fi
+ \setfalse\c_font_auto_size
+ \ifskipfontcharacteristics
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \fi}
+
+%D This is the resolver for special cases (sizes) and in practice it is not called
+%D that often so further optimization makes no sense.
+
+\def\font_helpers_check_strategy_class_a % --- --- --- --- % pt tt bf a
+ {\ifcsname\??fontinstanceready\fontclass-\fontbody-\fontstyle-\fontalternative-\fontsize-\fontface\endcsname
+ \setfalse\c_font_auto_size
+ \lastnamedcs
+ \else
+ \expandafter\font_helpers_check_strategy_class_b
+ \fi}
+
+\def\font_helpers_check_strategy_class_b % --- --- --- def % pt tt bf
+ {\ifcsname\??fontinstanceready\fontclass-\fontbody-\fontstyle-\fontalternative-\defaultfontsize-\fontface\endcsname
+ \settrue\c_font_auto_size
+ \lastnamedcs
+ \else
+ \expandafter\font_helpers_check_strategy_class_c
+ \fi}
+
+\def\font_helpers_check_strategy_class_c % --- --- def --- % pt tt tf a
+ {\ifcsname\??fontinstanceready\fontclass-\fontbody-\fontstyle-\defaultfontalternative-\fontsize-\fontface\endcsname
+ \settrue\c_font_auto_size
+ \lastnamedcs
+ \else
+ \expandafter\font_helpers_check_strategy_class_d
+ \fi}
+
+\def\font_helpers_check_strategy_class_d % --- --- def def % pt tt tf
+ {\ifcsname\??fontinstanceready\fontclass-\fontbody-\fontstyle-\defaultfontalternative-\defaultfontsize-\fontface\endcsname
+ \settrue\c_font_auto_size
+ \lastnamedcs
+ \else
+ \expandafter\font_helpers_check_strategy_class_e
+ \fi}
+
+\def\font_helpers_check_strategy_class_e % --- def def def % pt rm tf
+ {\ifcsname\??fontinstanceready\fontclass-\fontbody-\defaultfontstyle-\defaultfontalternative-\defaultfontsize-\fontface\endcsname
+ \setfalse\c_font_auto_size
+ \lastnamedcs
+ \else
+ \expandafter\font_helpers_check_strategy_class_f
+ \fi}
+
+\def\font_helpers_check_strategy_class_f % def def def def % rm tf
+ {\ifcsname\??fontinstanceready\fontclass-\defaultfontbody-\defaultfontstyle-\defaultfontalternative-\defaultfontsize-\fontface\endcsname
+ \settrue\c_font_auto_size
+ \lastnamedcs
+ \else
+ \expandafter\font_helpers_check_strategy_a
+ \fi}
+
+% no class
+
+\def\font_helpers_check_strategy_a % --- --- --- --- % pt tt bf a
+ {\ifcsname\??fontinstanceready\fontbody-\fontstyle-\fontalternative-\fontsize-\fontface\endcsname
+ \setfalse\c_font_auto_size
+ \lastnamedcs
+ \else
+ \expandafter\font_helpers_check_strategy_b
+ \fi}
+
+\def\font_helpers_check_strategy_b % --- --- --- --- % pt tt bf a
+ {\ifcsname\??fontinstanceready\fontbody-\fontstyle-\fontalternative-\defaultfontsize-\fontface\endcsname
+ \settrue\c_font_auto_size
+ \lastnamedcs
+ \else
+ \expandafter\font_helpers_check_strategy_c
+ \fi}
+
+\def\font_helpers_check_strategy_c % --- --- --- --- % pt tt bf a
+ {\ifcsname\??fontinstanceready\fontbody-\fontstyle-\defaultfontalternative-\fontsize-\fontface\endcsname
+ \settrue\c_font_auto_size
+ \lastnamedcs
+ \else
+ \expandafter\font_helpers_check_strategy_d
+ \fi}
+
+\def\font_helpers_check_strategy_d % --- --- --- --- % pt tt bf a
+ {\ifcsname\??fontinstanceready\fontbody-\fontstyle-\defaultfontalternative-\defaultfontsize-\fontface\endcsname
+ \settrue\c_font_auto_size
+ \lastnamedcs
+ \else
+ \expandafter\font_helpers_check_strategy_e
+ \fi}
+
+\def\font_helpers_check_strategy_e % --- --- --- --- % pt tt bf a
+ {\ifcsname\??fontinstanceready\fontbody-\defaultfontstyle-\defaultfontalternative-\defaultfontsize-\fontface\endcsname
+ \setfalse\c_font_auto_size
+ \lastnamedcs
+ \else
+ \expandafter\font_helpers_check_strategy_f
+ \fi}
+
+\def\font_helpers_check_strategy_f % --- --- --- --- % pt tt bf a
+ {\ifcsname\??fontinstanceready\defaultfontbody-\defaultfontstyle-\defaultfontalternative-\defaultfontsize-\fontface\endcsname
+ \settrue\c_font_auto_size
+ \lastnamedcs
+ \fi}
+
+\let\applyfontstrategies \font_helpers_check_strategy_a
+\let\applyfontclassstrategies\font_helpers_check_strategy_class_a
+
+%D Let's synchronize:
+
+\newconditional\c_font_synchronize \settrue\c_font_synchronize
+
+\prependtoks
+ \ifconditional\c_font_synchronize
+ \font_helpers_synchronize_math
+ \font_helpers_synchronize_font % problem: syncs last font
+ \fi
+\to \everybodyfont
+
+%D Setting the normal sizes as well as the x and xx smaller sizes is accomplished by
+%D the next set of macros. When in math mode, the commands \type {\tx} and \type
+%D {\txx} are just a switch to the script and double script styles, but in text mode
+%D the values defined by the bodyfontenvironment are used. Here we also set \type
+%D {\currentxfontsize}.
+
+\def\font_helpers_set_current_font_xxx_alternative#alternative#xsize#scriptstyle%
+ {\ifmmode
+ #scriptstyle%
+ \else
+ \font_helpers_set_current_xsize_alternative{#xsize}{#alternative}%
+ \fi}
+
+\def\font_helpers_reset_x_fontsize
+ {\ifcase\currentxfontsize\else
+ \currentxfontsize\zerocount
+ % also \sx and \sxx ?
+ \let\tx \normaltx
+ \let\txx\normaltxx
+ \fi}
+
+\let\font_helpers_check_nested_x_fontsize\relax
+
+\def\font_helpers_set_current_font_x_alternative#alternative%
+ {\font_helpers_check_nested_x_fontsize
+ \font_helpers_set_current_font_xxx_alternative{#alternative}{4}\scriptstyle
+ \currentxfontsize\plusone
+ \let\tx\txx}
+
+\def\font_helpers_set_current_font_xx_alternative#alternative%
+ {\font_helpers_check_nested_x_fontsize
+ \font_helpers_set_current_font_xxx_alternative{#alternative}{5}\scriptscriptstyle
+ \currentxfontsize\plustwo
+ \let\tx\empty
+ \let\txx\empty}
+
+%D This alterative is not really needed, but for old time's sake we keep it there.
+%D We can speed it up when needed.
+
+\def\font_helpers_set_current_font_x_style_alternative #alternative{\csname#alternative\endcsname\tx}
+\def\font_helpers_set_current_font_xx_style_alternative#alternative{\csname#alternative\endcsname\txx}
+
+%D These macros also show us that when we call for \type {\tx}, this macro is
+%D redefined to be \type {\txx}. Therefore calls like:
+%D
+%D \startbuffer
+%D {small \tx is \tx beautiful}
+%D {small \tx is \txx beautiful}
+%D {small \txx is \tx beautiful}
+%D {small \txx is \txx beautiful}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D result in:
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D
+%D Setting the main size involves the style list and therefore takes a bit more
+%D time. Keep in mind that the fontsize is represented by a character or empty.
+
+\installcorenamespace{fontscalex}
+\installcorenamespace{fontscalexx}
+
+\newconditional\c_font_inherit_scale
+
+\def\font_scale_inherit#1%
+ {\begingroup
+ \scratchcounterone\fontid\font\relax
+ \currentxfontsize\plusone
+ \normalexpanded{\definedfont[\clf_specifiedfont\scratchcounterone\font_currentfontscale\relax]}%
+ \scratchcountertwo\fontid\font\relax
+ \currentxfontsize\plustwo
+ \normalexpanded{\definedfont[\clf_specifiedfont\scratchcounterone\font_currentfontscale\relax]}%
+ \scratchcounterthree\fontid\font\relax
+ % parent -> x -> xx
+ % parent -> xx
+ \global\expandafter\chardef\csname\??fontscalex \number\scratchcounterone\endcsname\scratchcountertwo
+ \global\expandafter\chardef\csname\??fontscalexx\number\scratchcounterone\endcsname\scratchcounterthree
+ \global\expandafter\chardef\csname\??fontscalex \number\scratchcountertwo\endcsname\scratchcounterthree
+ \global\expandafter\chardef\csname\??fontscalexx\number\scratchcountertwo\endcsname\scratchcounterthree
+ \endgroup
+ \setfontid\csname#1\number\fontid\font\endcsname}
+
+\def\font_scale_inherit_x
+ {\ifcsname\??fontscalex\number\fontid\font\endcsname
+ \setfontid\lastnamedcs
+ \else
+ \font_scale_inherit\??fontscalex
+ \fi
+ \ifskipfontcharacteristics
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \fi}
+
+\def\font_scale_inherit_xx
+ {\ifcsname\??fontscalexx\number\fontid\font\endcsname
+ \setfontid\lastnamedcs
+ \else
+ \font_scale_inherit\??fontscalexx
+ \fi
+ \ifskipfontcharacteristics
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \fi}
+
+\def\font_scale_defined_x
+ {\let\fontface\!!plusfour
+ \let\fontalternative\fontalternative
+ \font_helpers_synchronize_font}
+
+\def\font_scale_defined_xx
+ {\let\fontface\!!plusfive
+ \let\fontalternative\fontalternative
+ \font_helpers_synchronize_font}
+
+\unexpanded\def\tx
+ {\currentxfontsize\plusone
+ \ifmmode
+ \scriptstyle
+ \else\ifconditional\c_font_inherit_scale
+ \font_scale_inherit_x
+ \else
+ \font_scale_defined_x
+ \fi\fi
+ \let\tx\txx}
+
+\unexpanded\def\txx
+ {\currentxfontsize\plustwo
+ \ifmmode
+ \scriptscriptstyle
+ \else\ifconditional\c_font_inherit_scale
+ \font_scale_inherit_xx
+ \else
+ \font_scale_defined_xx
+ \fi\fi
+ \let\tx \empty
+ \let\txx\empty}
+
+\unexpanded\def\sx
+ {\currentxfontsize\plusone
+ \ifmmode
+ \scriptstyle
+ \else
+ \font_scale_inherit_x
+ \fi
+ \let\tx\txx
+ \let\sx\sxx}
+
+\unexpanded\def\sxx
+ {\currentxfontsize\plustwo
+ \ifmmode
+ \scriptscriptstyle
+ \else
+ \font_scale_inherit_xx
+ \fi
+ \let\tx \empty
+ \let\txx\empty
+ \let\sx \empty
+ \let\sxx\empty}
+
+\unexpanded\def\useinheritxsizes{\settrue \c_font_inherit_scale} % not yet public, playground for WS and me
+\unexpanded\def\usedefinedxsizes{\setfalse\c_font_inherit_scale} % not yet public, playground for WS and me
+
+\let\normaltx \tx
+\let\normaltxx\txx
+
+\let\normalsx \sx
+\let\normalsxx\sxx
+
+%D When asking for a complete font switch, for instance from 10 to 12~points, the
+%D next macro does the job. First we normalize the size, next we define the current
+%D range of text, script and scriptscript sizes, then we set the text fonts and the
+%D math families and finally we activate the default typeface and also set the font
+%D specific parameters assigned to \type {\everybodyfont}.
+
+\def\textface {\currentbodyfontdimension\s!text }
+\def\scriptface {\currentbodyfontdimension\s!script }
+\def\scriptscriptface{\currentbodyfontdimension\s!scriptscript}
+\def\xtextface {\currentbodyfontdimension\s!x }
+\def\xxtextface {\currentbodyfontdimension\s!xx }
+
+\installcorenamespace{fontbodyfaces}
+
+\unexpanded\def\font_basics_complete_switch#size%
+ {\bodyfontsize#size\relax
+ \normalizebodyfontsize\normalizedbodyfontsize\bodyfontsize
+ \expandafter\let\expandafter\font_basics_set_faces\csname\??fontbodyfaces\fontbody\endcsname
+ \ifx\font_basics_set_faces\relax
+ \font_basics_set_faces_preset
+ \fi
+ \font_basics_set_faces}
+
+\def\font_basics_set_faces_preset
+ {\edef\font_basics_set_faces{% 0.2 sec on 10K \tfa
+ \noexpand\edef\noexpand\textface {\currentbodyfontdimension\s!text }%
+ \noexpand\edef\noexpand\scriptface {\currentbodyfontdimension\s!script }%
+ \noexpand\edef\noexpand\scriptscriptface{\currentbodyfontdimension\s!scriptscript}%
+ \noexpand\edef\noexpand\xtextface {\currentbodyfontdimension\s!x }%
+ \noexpand\edef\noexpand\xxtextface {\currentbodyfontdimension\s!xx }%
+ }%
+ \expandafter\glet\csname\??fontbodyfaces\fontbody\endcsname\font_basics_set_faces}
+
+\def\currentbodyfontdimension#parameter% there can be factors here
+ {\the\dimexpr
+ \ifcsname\??fontenvironments\fontclass\normalizedbodyfontsize#parameter\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??fontenvironments\fontclass\s!default#parameter\endcsname
+ \lastnamedcs
+ \dimexpr\normalizedbodyfontsize\relax
+ \orelse\ifcsname\??fontenvironments\normalizedbodyfontsize#parameter\endcsname
+ \lastnamedcs
+ \else
+ \csname\??fontenvironments\s!default#parameter\endcsname
+ \dimexpr\normalizedbodyfontsize\relax
+ \fi
+ \relax}
+
+%D \macros
+%D {setupbodyfont,switchtobodyfont}
+%D
+%D The next two macros are user ones. With \type {\setupbodyfont} one can set the
+%D document bodyfont size, font family, style and/or options defined in files, for
+%D example:
+%D
+%D \starttyping
+%D \setupbodyfont[modern,12pt,roman]
+%D \stoptyping
+%D
+%D This command affects the document as a whole: text, headers and footers. The
+%D second macro however affects only the text:
+%D
+%D \starttyping
+%D \switchtobodyfont[10pt]
+%D \stoptyping
+%D
+%D So we've got:
+%D
+%D \showsetup{setupbodyfont}
+%D \showsetup{switchtobodyfont}
+%D
+%D Both macros look alike. The second one also has to take all kind of keywords into
+%D account.
+
+\ifx\saveinterlinespace \undefined \let\saveinterlinespace \relax \fi
+\ifx\restoreinterlinespace\undefined \let\restoreinterlinespace\relax \fi
+
+% \newtoks \everysetupbodyfont
+% \newtoks \everyswitchtobodyfont
+
+\unexpanded\def\setupbodyfont
+ {\doifelsenextoptionalcs\font_basics_setupbodyfont_yes\font_basics_setupbodyfont_nop}
+
+\def\font_basics_setupbodyfont_nop
+ {\restoreglobalbodyfont
+ \saveinterlinespace}
+
+\def\font_basics_setupbodyfont_yes[#specification]%
+ {\doifsomething{#specification}
+ {\font_helpers_set_font\plusone{#specification}%
+ \globalbodyfontsize\localbodyfontsize
+ \normalizebodyfontsize\normalizedglobalbodyfontsize\globalbodyfontsize
+ \let\globalfontstyle\fontstyle
+ \ifproductionrun
+ \the\everybodyfont
+ \the\everyglobalbodyfont
+ \saveinterlinespace
+ \fi
+ \the\everysetupbodyfont}}
+
+\unexpanded\def\font_basics_switchtobodyfont#specification%
+ {\edef\m_font_step{\font_bodyfontvariable{#specification}}%
+ \ifx\m_font_step\empty
+ \font_helpers_set_font\zerocount{#specification}%
+ \else
+ \font_helpers_switch_bodyfont_step % so we have a fast [small] switch
+ \fi
+ \the\everybodyfont
+ \the\everyswitchtobodyfont}
+
+\unexpanded\def\switchtobodyfont[#specification]% could become an ifx
+ {\doifsomething{#specification}{\font_basics_switchtobodyfont{#specification}}}
+
+\unexpanded\def\usebodyfontparameter#1%
+ {\edef\m_font_bodyfont_asked{#1\c!bodyfont}%
+ \ifx\m_font_bodyfont_asked\empty\else
+ \font_basics_switchtobodyfont\m_font_bodyfont_asked
+ \fi}
+
+\def\font_helpers_switch_bodyfont_step
+ {\font_basics_switch_points\m_font_step
+ \font_basics_switch_style \fontstyle}
+
+%D The following alternative is meant for math||to||text switching and will be
+%D optimized.
+
+\unexpanded\def\fastswitchtobodyfont#name%
+ {\ifcsname\??fontenvironments\normalizedbodyfontsize#name\endcsname
+ %\edef\futurebodyfontsize{\csname\??fontenvironments\normalizedbodyfontsize#name\endcsname}%
+ \edef\futurebodyfontsize{\lastnamedcs}%
+ \ifcsname\??fontbodyknown\futurebodyfontsize\endcsname
+ \font_basics_complete_switch\futurebodyfontsize
+ \localbodyfontsize\futurebodyfontsize\relax
+ \fi
+ \fi
+ \csname\??fontstyle\fontstyle\endcsname
+ \the\everybodyfont}
+
+%D \starttyping
+%D $\cases{& \ccaron}$ $x=\hbox{\ccaron $x=\hbox{\ccaron}$}$
+%D \stoptyping
+
+%D \macros
+%D {usebodyfont}
+%D
+%D This looks nicer then a switch in the preamble
+%D
+%D \starttyping
+%D \usebodyfont[pagella,10pt]
+%D \usebodyfont[termes,10pt]
+%D \usebodyfont[dejavu,10pt]
+%D
+%D \setupbodyfont[dejavu]
+%D
+%D \starttext
+%D test
+%D \stoptext
+%D \stoptyping
+
+\unexpanded\def\usebodyfont[#1]%
+ {\ifx\fontclass\empty
+ \setupbodyfont[#1]%
+ \else
+ \switchtobodyfont[#1]%
+ \fullrestoreglobalbodyfont
+ \fi}
+
+\unexpanded\def\showbodyfontstate
+ {\dontleavehmode
+ \start
+ \infofont
+ [fontclass: \fontclass,\space
+ fontbody: \fontbody ,\space
+ fontface: \fontface ,\space
+ fontsize: \fontsize ]%
+ \stop}
+
+%D Handy for manuals:
+
+%D The \type {\tochar} commmand takes a specification:
+%D
+%D \starttabulate[|l|l|l|]
+%D \NC e \NC entity \NC e:eacute \NC \NR
+%D \NC x \NC hexadecimal unicode \NC x:013D \NC \NR
+%D \NC d \NC decimal unicode \NC d:123 \NC \NR
+%D \NC s \NC hexadecimal index (slot) \NC s:210D \NC \NR
+%D \NC i \NC decimal index \NC i:456 \NC \NR
+%D \NC n \NC name \NC n:eight \NC \NR
+%D \NC c \NC name \NC c:x \NC \NR
+%D \NC u \NC unicode descriptions \NC u:dog \NC \NR
+%D \NC a \NC all (also descriptions) \NC a:rewind \NC \NR
+%D \stoptabulate
+%D
+%D This is an expandable command!
+
+\unexpanded\def\fontchar #character{\clf_fontchar{#character}}
+\unexpanded\def\fontcharbyindex #index{\clf_fontcharbyindex#index\relax}
+ \def\tochar #specifications{\clf_tochar{#specifications}} % expanded (also used in edef)
+
+%D The next auxilliary macro is an alternative to \type {\fontname}.
+
+\def\purefontname#font{\clf_purefontname{\fontname#font}}
+
+%D \macros
+%D {switchstyleonly}
+%D
+%D For switching a style but keeping the alternative, there
+%D is:
+%D
+%D \starttyping
+%D {\bf text \switchstyleonly\ss text}
+%D {\bf text \switchstyleonly[ss]text}
+%D {\sl text \switchstyleonly[sansserif]text}
+%D \stoptyping
+
+\unexpanded\def\switchstyleonly
+ {\doifelsenextoptionalcs\font_basics_switch_style_only_opt\font_basics_switch_style_only_arg}
+
+\def\font_basics_switch_style_only_arg#name% stupid version
+ {\font_helpers_set_current_font_style{\csname\??fontshortstyle\checkedstrippedcsname#name\endcsname}%
+ \the\everybodyfont} % needed ?
+
+\def\font_basics_switch_style_only_opt[#name]% todo : check
+ {\font_helpers_set_current_font_style{\csname\??fontshortstyle#name\endcsname}%
+ \the\everybodyfont} % needed ?
+
+%D \macros
+%D {definebodyfontswitch}
+%D
+%D \PLAIN\ \TEX\ defines some macro's like \type {\tenpoint} to switch to a specific
+%D bodyfontsize. Just for the sake of compatibility we can define them like:
+%D
+%D \starttyping
+%D \definebodyfontswitch [twelvepoint] [12pt]
+%D \stoptyping
+%D
+%D We don't support language specific synonyms here.
+
+\unexpanded\def\definebodyfontswitch
+ {\dodoubleargument\font_basics_define_bodyfont_switch}
+
+\def\font_basics_define_bodyfont_switch[#command][#specification]% no longer a commalist (not useful)
+ {\setvalue{#command}{\switchtobodyfont[#specification]}}%
+
+%D \macros
+%D {setsmallbodyfont,setmainbodyfont,setbigbodyfont}
+%D
+%D When we're typesetting at for instance 10pt, we can call for the \type {small} as
+%D well as the \type {big} alternative, related to this main size, using \type
+%D {\switchtobodyfont[small]}. The three alternatives can be activated by the next
+%D three system calls and are defined by the bodyfontenvironment.
+
+\newmacro\m_font_step
+
+\def\font_helpers_set_bodyfont_step#step%
+ {\edef\m_font_step{\font_bodyfontvariable{#step}}% not always \cs
+ \font_basics_switch_points\m_font_step
+ \font_basics_switch_style \fontstyle}
+
+\unexpanded\def\setsmallbodyfont{\font_helpers_set_bodyfont_step\v!small\the\everybodyfont}
+\unexpanded\def\setbigbodyfont {\font_helpers_set_bodyfont_step\v!big \the\everybodyfont}
+
+\unexpanded\def\setmainbodyfont
+ {\font_basics_switch_points\normalizedbodyfontsize
+ \font_basics_switch_style\fontstyle
+ \the\everybodyfont
+ \the\everyglobalbodyfont
+ \saveinterlinespace}
+
+%D \macros
+%D {restoreglobalbodyfont}
+%D
+%D Users can set whatever font available while typesetting text. Pagenumbers,
+%D footers, headers etc. however must be typeset in the main bodyfont and style of
+%D the document. Returning to the global state can be done with the next macro:
+%D
+%D This macro has to be called when entering the pagebody handling routine as well
+%D as the footnote insert routine. Users can access this feature |<|for instance
+%D when one wants to typeset tables and alike in the main bodyfont and style while
+%D the running text is temporary set to a smaller one|>| by saying \type
+%D {\switchtobodyfont [global]}.
+
+\let\globalfontstyle\s!rm
+
+\unexpanded\def\fullrestoreglobalbodyfont
+ {\let\fontsize\defaultfontsize
+ \let\fontbody\defaultfontbody
+ \let\fontface\defaultfontface
+ \currentxfontsize\zerocount
+ \let\fontclass\globalfontclass
+ \font_basics_switch_points\normalizedglobalbodyfontsize
+ \font_basics_switch_style\globalfontstyle
+ \redoconvertfont % just in case a pagebreak occurs
+ \tf
+ \the\everybodyfont
+ \the\everyglobalbodyfont
+ \saveinterlinespace}
+
+\unexpanded\def\partialrestoreglobalbodyfont
+ {\let\fontsize\defaultfontsize
+ \let\fontbody\defaultfontbody
+ \let\fontface\defaultfontface
+ \currentxfontsize\zerocount
+ \redoconvertfont
+ \tf
+ \the\everybodyfont % indeed needed
+ \the\everyglobalbodyfont % indeed needed
+ \saveinterlinespace}
+
+\unexpanded\def\restoreglobalbodyfont % ook style etc
+ {\ifx\fontclass\globalfontclass
+ \ifx\fontstyle\globalfontstyle
+ \ifx\normalizedbodyfontsize\normalizedglobalbodyfontsize
+ \partialrestoreglobalbodyfont
+ \else
+ \fullrestoreglobalbodyfont
+ \fi
+ \else
+ \fullrestoreglobalbodyfont
+ \fi
+ \else
+ \fullrestoreglobalbodyfont
+ \fi}
+
+% in case of troubles: \let\restorebodyfont\fullrestoreglobalbodyfont
+
+%D Here are some fast variants that can be used in cases where no font system is
+%D needed and where fonts are frozen:
+%D
+%D \starttyping
+%D \definefont [TestA][Serif at 10pt]
+%D \predefinefont[TestB][Serif at 20pt]
+%D
+%D \testfeatureonce{1000}{{\TestA}} % .312
+%D \testfeatureonce{1000}{{\TestB}} % < .016
+%D \testfeatureonce{1000}{{\definedfont[Serif at 30pt]}} % .312
+%D \testfeatureonce{1000}{{\predefinedfont[Serif at 40pt]}} % < .016
+%D \stoptyping
+
+\installcorenamespace{predefinedfont}
+
+\unexpanded\def\predefinefont[#1]#2[#3]% global !
+ {\setugvalue{#1}{\font_basics_predefine{#1}{#3}}}
+
+\unexpanded\def\predefinedfont[#1]% global !
+ {\ifcsname\??predefinedfont#1\endcsname
+ \lastnamedcs
+ \else
+ \font_basics_predefined{#1}%
+ \fi}
+
+\unexpanded\def\font_basics_predefine#1#2%
+ {\font_basics_defined_font_yes[#2]%
+ \expandafter\glet\csname#1\expandafter\endcsname\csname\v_font_identifier_basic\endcsname}
+
+\unexpanded\def\font_basics_predefined#1%
+ {\font_basics_predefine{\??predefinedfont#1}{#1}}
+
+%D Handy helper:
+
+\unexpanded\def\savedefinedfont[#1]%
+ {\bgroup
+ \definedfont[#1]%
+ \xdef\saveddefinedfontid {\number\fontid\font}%
+ \xdef\saveddefinedfontname{\fontname\font}%
+ \egroup}
+
+\def\saveddefinedfontid {\number\fontid\font}
+\def\saveddefinedfontname{\fontname\font}
+
+%D Ugly helper:
+
+\unexpanded\def\saverunningstyleandcolor
+ {\unexpanded\edef\restorerunningstyleandcolor
+ {\setfontid \number\fontid\font
+ \attribute\colormodelattribute \the\attribute\colormodelattribute
+ \attribute\colorattribute \the\attribute\colorattribute
+ \attribute\transparencyattribute\the\attribute\transparencyattribute
+ \relax}}
+
+\let\restorerunningstyleandcolor\relax
+
+%D Handy for defining additional glyphs:
+
+\let\getprivateglyphslot\clf_getprivateglyphslot % kind of private macro
+
+\let\getprivatechar \clf_getprivatechar % gives back a utf !
+\let\getprivatemathchar \clf_getprivatemathchar % gives back a utf !
+\let\getprivateslot \clf_getprivateslot % companion to fonts.helpers.addprivate
+
+% \unexpanded\def\getprivatemathchar#1%
+% {\begingroup\the\textfont\zerocount\getprivatechar{#1}\endgroup}
+
+\def\privatechar % the text variant gets expanded to utf
+ {\ifmmode
+ \expandafter\getprivatemathchar
+ \else
+ \expandafter\getprivatechar
+ \fi}
+
+%D Some fonts can have color specifiers:
+%D
+%D \starttyping
+%D \definefontfeature[seguiemj-cl][default][colr=yes,ccmp=yes,dist=yes]
+%D \definefontsynonym[emoji][seguiemj*seguiemj-cl]
+%D
+%D \definecolor[emoji-red] [r=.4]
+%D \definecolor[emoji-gray][s=1,t=.5,a=1]
+%D
+%D %definefontcolorpalette [emoji-r] [emoji-red,emoji-gray,textcolor] % bad
+%D \definefontcolorpalette [emoji-r] [emoji-red,emoji-gray] % okay
+%D
+%D \definefontfeature[seguiemj-r][ccmp=yes,dist=yes,colr=emoji-r]
+%D
+%D \definefont[MyEmojiR][seguiemj*seguiemj-r @ 100pt]
+%D
+%D \startTEXpage[offset=10pt]
+%D \MyEmojiR\resolvedemoji{triangular ruler}
+%D \stopTEXpage
+%D \stoptyping
+
+\unexpanded\def\definefontcolorpalette
+ {\dodoubleargument\font_define_color_palette}
+
+\def\font_define_color_palette[#1][#2]%
+ {\clf_definefontcolorpalette{#1}{#2}}
+
+%D \macros
+%D {addfontpath}
+%D
+%D A way to add a path at runtime (no need to generate database):
+
+\unexpanded\def\usefontpath[#1]%
+ {\clf_addfontpath{#1}}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-ini.mkvi b/Master/texmf-dist/tex/context/base/mkiv/font-ini.mkvi
index dd8a5f14834..99e7117a38e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-ini.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-ini.mkvi
@@ -53,8 +53,8 @@
\unprotect
-%D There are several ways to specify a font. Three of them are
-%D pure \TeX\ ones, the fourth one is new:
+%D There are several ways to specify a font. Three of them are pure \TEX\ ones, the
+%D fourth one is new:
%D
%D \starttyping
%D \font\name=cmr12
@@ -63,18 +63,15 @@
%D \font\name=cmr12 sa 1.440
%D \stoptyping
%D
-%D The non||\TEX\ alternative \type{sa} stands for {\em scaled
-%D at}. This means as much as: scale the bodyfontsize with this
-%D factor. The scaled option is not that useful as one needs to
-%D know the design size.
+%D The non||\TEX\ alternative \type{sa} stands for {\em scaled at}. This means as
+%D much as: scale the bodyfontsize with this factor. The scaled option is not that
+%D useful as one needs to know the design size.
%D
-%D Because \type {sa} (scaled at) and \type {mo} (mapped on)
-%D are not low level \TEX\ supported alternatives, we have to
-%D test for it ourselves. In doing so, we need an auxiliary
-%D \DIMENSION. We cannot use \type{\scratchdimen} because font
-%D loading can happen at any moment due to postponed loading.
-%D We could instead have used dirty grouping tricks, but this
-%D one works too.
+%D Because \type {sa} (scaled at) and \type {mo} (mapped on) are not low level \TEX\
+%D supported alternatives, we have to test for it ourselves. In doing so, we need an
+%D auxiliary \DIMENSION. We cannot use \type{\scratchdimen} because font loading can
+%D happen at any moment due to postponed loading. We could instead have used dirty
+%D grouping tricks, but this one works too.
% \enableexperiments[fonts.autorscale]
%
@@ -101,9 +98,8 @@
%D \macros
%D {rm,ss,tt,hw,cg}
%D
-%D Fonts are defined in separate files. When we define a font,
-%D we distinguish between several styles. In most cases we will
-%D use:
+%D Fonts are defined in separate files. When we define a font, we distinguish
+%D between several styles. In most cases we will use:
%D
%D \startlinecorrection
%D \starttable[|l||]
@@ -115,8 +111,8 @@
%D \stoptable
%D \stoplinecorrection
%D
-%D The number of styles is not limited to these three. When
-%D using Lucida Bright we can for instance also define:
+%D The number of styles is not limited to these three. When using Lucida Bright we
+%D can for instance also define:
%D
%D \startlinecorrection
%D \starttable[|l||]
@@ -127,8 +123,8 @@
%D \stoptable
%D \stoplinecorrection
%D
-%D Within such a font set (\type{cmr}) and style (\type{\rm})
-%D we can define a number of text font alternatives:
+%D Within such a font set (\type{cmr}) and style (\type{\rm}) we can define a number
+%D of text font alternatives:
%D
%D \startlinecorrection
%D \starttable[|l||]
@@ -145,12 +141,11 @@
%D \stoplinecorrection
%D
%D Internally fonts are stored as combination of size, style
-%D and alternative, e.g. \type{12pt}+\type{\ss}+\type{\bf}.
-%D Users are not confronted with sizes, but use the style or
-%D style+alternative to activate them.
+%D and alternative, e.g. \type{12pt}+\type{\ss}+\type{\bf}. Users are not confronted
+%D with sizes, but use the style or style+alternative to activate them.
%D
-%D During the definition of a bodyfont one can also declare the
-%D available larger alternatives:
+%D During the definition of a bodyfont one can also declare the available larger
+%D alternatives:
%D
%D \starttyping
%D \tf \tfa \tfb \tfc ...
@@ -167,13 +162,12 @@
%D \slx \slxx
%D \stoptyping
%D
-%D There are only two smaller alternatives per style. The
-%D larger alternatives on the other hand have no limitations.
+%D There are only two smaller alternatives per style. The larger alternatives on the
+%D other hand have no limitations.
%D
-%D These larger alternatives are mostly used in chapter and
-%D section titles or on title pages. When one switches to a
-%D larger alternative, the bold an other ones automatically
-%D adapt themselves:
+%D These larger alternatives are mostly used in chapter and section titles or on
+%D title pages. When one switches to a larger alternative, the bold an other ones
+%D automatically adapt themselves:
%D
%D \startbuffer
%D \tfd Hi \bf there\sl, here \tfb I \bf am
@@ -189,8 +183,8 @@
%D \getbuffer
%D \stopexample
%D
-%D Maybe this mechanism isn't always as logic, but as said
-%D before, we tried to make it as intuitive as possible.
+%D Maybe this mechanism isn't always as logic, but as said before, we tried to make
+%D it as intuitive as possible.
%D
%D So a specific kind of glyph can be characterized by:
%D
@@ -200,52 +194,43 @@
%D
%D The last component (the size) is optional.
%D
-%D We introduced \type{\tf} as command to call for the current
-%D normally sized typeface. This commands results in roman,
-%D sans serif, teletype or whatever style is in charge. Such
-%D rather massive switches of style sometimes take more
-%D processing time than comfortable. Of course there is a
-%D workaround for this: we can call fonts directly by means of
-%D commands like:
+%D We introduced \type {\tf} as command to call for the current normally sized
+%D typeface. This commands results in roman, sans serif, teletype or whatever style
+%D is in charge. Such rather massive switches of style sometimes take more
+%D processing time than comfortable. Of course there is a workaround for this: we
+%D can call fonts directly by means of commands like:
%D
%D \starttyping
%D \rmtf \sssl \tttf \rmbsa
%D \stoptyping
%D
-%D One should realize that this fast calls have limitations,
-%D they lack for instance automatic super- and subscript
-%D support.
-%D
-%D This leaves us two more commands: \type{\tx} and
-%D \type{\txx}. These activate a smaller and even more smaller
-%D font than the current one and adapt themselves to the
-%D current alternative, so when \type{\bf} is active,
-%D \type{\tx} gives a smaller boldface, which in turn can be
-%D called directly by \type{\bfx}.
-%D
-%D These two smaller alternatives are specified by the bodyfont
-%D environment and therefore not necessarily have similar sizes
-%D as \type{\scriptsize} and \type{\scriptscriptsize}. The main
-%D reason for this incompatibility (which can easily be undone)
-%D lays in the fact that we often want a bit bigger characters
-%D than in math mode. In \CONTEXT\ for instance the \type{\tx}
-%D and \type{\txx} commands are used for surrogate
-%D \cap{smallcaps} which support both nesting and alternatives,
-%D like in {\bf\cap{a \cap{small} world}}, which was typeset by
+%D One should realize that this fast calls have limitations, they lack for instance
+%D automatic super- and subscript support.
+%D
+%D This leaves us two more commands: \type {\tx} and \type {\txx}. These activate a
+%D smaller and even more smaller font than the current one and adapt themselves to
+%D the current alternative, so when \type {\bf} is active, \type {\tx} gives a
+%D smaller boldface, which in turn can be called directly by \type {\bfx}.
+%D
+%D These two smaller alternatives are specified by the bodyfont environment and
+%D therefore not necessarily have similar sizes as \type {\scriptsize} and \type
+%D {\scriptscriptsize}. The main reason for this incompatibility (which can easily
+%D be undone) lays in the fact that we often want a bit bigger characters than in
+%D math mode. In \CONTEXT\ for instance the \type {\tx} and \type {\txx} commands
+%D are used for surrogate \cap {smallcaps} which support both nesting and
+%D alternatives, like in {\bf \cap {a \cap {small} world}}, which was typeset by
%D
%D \starttyping
%D \bf\cap{a \cap{small} world}
%D \stoptyping
%D
-%D And compare $\rm \scriptstyle THIS$ with the slightly larger
-%D \cap{THIS}: \ruledhbox{$\rm \scriptstyle scriptstyle: THIS$}
-%D or \ruledhbox{\cap{x style: THIS}} makes a big difference.
+%D And compare $\rm \scriptstyle THIS$ with the slightly larger \cap {THIS}:
+%D \ruledhbox {$\rm \scriptstyle scriptstyle: THIS$} or \ruledhbox {\cap {x style:
+%D THIS}} makes a big difference.
%D
-%D The \type{x..d} sizes should be used grouped. If you
-%D don't group them, i.e. call them in a row, \CONTEXT\ will
-%D not be able to sort out your intention (\type {x} inside
-%D \type {d} inside \type {x}. etc.). The following table
-%D demonstrates this:
+%D The \type {x..d} sizes should be used grouped. If you don't group them, i.e. call
+%D them in a row, \CONTEXT\ will not be able to sort out your intention (\type {x}
+%D inside \type {d} inside \type {x}. etc.). The following table demonstrates this:
%D
%D \def\FontState{\setstrut\ruledhbox{\strut Hello}}
%D
@@ -327,6 +312,16 @@
\fontemwidth \nullfont 786432\scaledpoint
\fontextraspace \nullfont 85459\scaledpoint
+\appendtoks
+ \fontslantperpoint \nullfont 0\scaledpoint
+ \fontinterwordspace \nullfont 256377\scaledpoint
+ \fontinterwordstretch\nullfont 128188\scaledpoint
+ \fontinterwordshrink \nullfont 85459\scaledpoint
+ \fontexheight \nullfont 338952\scaledpoint
+ \fontemwidth \nullfont 786432\scaledpoint
+ \fontextraspace \nullfont 85459\scaledpoint
+\to \everyjob
+
%D Tracing
\newtoks\t_font_tracers_definitions
@@ -388,10 +383,9 @@
%D \macros
%D {everybodyfont,everyglobalbodyfont}
%D
-%D Every change in bodyfont size has conseqences for the baseline
-%D distance and skips between paragraphs. These are initialized
-%D in other modules. Here we only provide the hooks that
-%D garantees their handling.
+%D Every change in bodyfont size has conseqences for the baseline distance and skips
+%D between paragraphs. These are initialized in other modules. Here we only provide
+%D the hooks that garantees their handling.
%D
%D At the system level one can initialize thing like:
%D
@@ -401,20 +395,19 @@
%D \macros
%D {globalbodyfontsize,localbodyfontsize,bodyfontsize}
-
-%D Here we have to distinguish between the global (overal) bodyfont
-%D size and the local (sometimes in the textflow) size. We store
-%D these dimensions in two \DIMENSION\ registers. These registers are
-%D not to be misused in calculations.
+%D
+%D Here we have to distinguish between the global (overal) bodyfont size and the
+%D local (sometimes in the textflow) size. We store these dimensions in two
+%D \DIMENSION\ registers. These registers are not to be misused in calculations.
\ifdefined\globalbodyfontsize\else \newdimen\globalbodyfontsize \fi \globalbodyfontsize=12pt
\ifdefined\localbodyfontsize \else \newdimen\localbodyfontsize \fi \localbodyfontsize =\globalbodyfontsize
\ifdefined\bodyfontsize \else \newdimen\bodyfontsize \fi \bodyfontsize =\globalbodyfontsize
-%D When we assign for instance 12pt to a \DIMENSION\ register the \type
-%D {\the}'d value comes out as 12.0pt, which is often not the way users
-%D specify the bodyfont size. Therefore we use normalized values. They
-%D are cached to save overhead in \LUA\ calls.
+%D When we assign for instance 12pt to a \DIMENSION\ register the \type {\the}'d
+%D value comes out as 12.0pt, which is often not the way users specify the bodyfont
+%D size. Therefore we use normalized values. They are cached to save overhead in
+%D \LUA\ calls.
% \setnewconstant\fontdigits\plustwo % from now on always 2
@@ -455,11 +448,10 @@
%D \macros
%D {mapfontsize}
%D
-%D For special purposes, like in math, you may want to use
-%D slightly different sizes than the ones given. This happens
-%D for instance with the Math Times fonts. Mapped font sizes
-%D can be specified by using the \type {mo} key instead of
-%D \type {sa} in font definitions.
+%D For special purposes, like in math, you may want to use slightly different sizes
+%D than the ones given. This happens for instance with the Math Times fonts. Mapped
+%D font sizes can be specified by using the \type {mo} key instead of \type {sa} in
+%D font definitions.
%D
%D \startbuffer
%D \mapfontsize[10pt][11pt]
@@ -548,10 +540,9 @@
%D \macros
%D {definefontstyle,definefontsize,definefontalternative}
%D
-%D When setting of switching the overall style we can use the
-%D short identifier like rm and ss, but when defined we can
-%D also use more verbose names like roman or sansserif. Such
-%D names are defined by:
+%D When setting of switching the overall style we can use the short identifier like
+%D rm and ss, but when defined we can also use more verbose names like roman or
+%D sansserif. Such names are defined by:
%D
%D \starttyping
%D \definefontstyle [serif,rm] [rm]
@@ -623,12 +614,12 @@
\definefontstyle [\s!ss] [\s!ss]
\definefontstyle [\s!tt] [\s!tt]
-%D We define all the font switching commands globally. After all they are part
-%D of the formal font interface once defined. The size can be empty (so
-%D checking is needed as \type {\bf} is already defined)
-
-%D The \type {\normal..} variants are available as extras for cases where
-%D the \type {..} is overloaded.
+%D We define all the font switching commands globally. After all they are part of
+%D the formal font interface once defined. The size can be empty (so checking is
+%D needed as \type {\bf} is already defined).
+%D
+%D The \type {\normal..} variants are available as extras for cases where the \type
+%D {..} is overloaded.
\newmacro\m_font_mm
@@ -714,23 +705,20 @@
%D Scaling macros:
%D
-%D This system is somewhat complicated by two (possible conflicting)
-%D demands:
+%D This system is somewhat complicated by two (possible conflicting) demands:
%D
%D \startitemize
-%D \item We support wildcards like \type {sa *} which will adapt
-%D to the current size. This is also the default specification.
-%D \item We support named scales like \type {sa d}; beware: \type
-%D {x} and \type {xx} are valid scales but they are not alway
-%D the same as the ones used in for instance \type {\bfx} because
-%D there the sized come from the bodyfont environment. In the
-%D future there maybe a switch that also honors the environment
-%D in named scales.
+%D \item We support wildcards like \type {sa *} which will adapt to the current
+%D size. This is also the default specification.
+%D \item We support named scales like \type {sa d}; beware: \type {x} and \type {xx}
+%D are valid scales but they are not alway the same as the ones used in for
+%D instance \type {\bfx} because there the sized come from the bodyfont
+%D environment. In the future there maybe a switch that also honors the
+%D environment in named scales.
%D \stopitemize
%D
-%D Keep in mind that the smaller sizes are just for text super and
-%D subscripts while larger sizes can be used in titles where for
-%D instance math follows the size.
+%D Keep in mind that the smaller sizes are just for text super and subscripts while
+%D larger sizes can be used in titles where for instance math follows the size.
% b:x{\definedfont[SerifBold sa b]x}{\bfb x $x^x$}\par
% 1:x{\definedfont[SerifBold sa 1]x}{\bf x $x^x$}\par
@@ -983,8 +971,7 @@
%D
%D We also accept \type{sa a}||\type{sa d} as specification.
%D
-%D Before we implement the main definition macro, we first show
-%D one for local use:
+%D Before we implement the main definition macro, we first show one for local use:
%D
%D \starttyping
%D \definefont[Some][LucidaBright at 100pt] \Some some
@@ -1110,9 +1097,8 @@
%D \macros
%D {currentfontbodyscale}
%D
-%D Sometimes we need to have access to the font scale
-%D including the \type{a}||\type{d} sizes. The next macro
-%D returns the current scaling factor. Take a look at
+%D Sometimes we need to have access to the font scale including the \type {a}||\type
+%D {d} sizes. The next macro returns the current scaling factor. Take a look at
%D \type {cont-log.tex} for an example of its use.
\installcorenamespace{fontenvironments}
@@ -1182,30 +1168,27 @@
\setvalue{\??fontenvironments\s!default}{1}
-%D In the following macros we use \type{\currentxfontsize} to
-%D hold the current x||size of the font. This enables us to
-%D support for instance \type{\sl} inside a \type{\tx} switch.
+%D In the following macros we use \type {\currentxfontsize} to hold the current
+%D x||size of the font. This enables us to support for instance \type {\sl} inside a
+%D \type {\tx} switch.
\newconstant\currentxfontsize
\def\xfontsize{\ifcase\currentxfontsize\fontsize\or\s!x\else\s!xx\fi}
-%D Now we enter the area of font switching. The switching
-%D mechanism has to take care of several situations, like:
+%D Now we enter the area of font switching. The switching mechanism has to take care
+%D of several situations, like:
%D
%D \startitemize[packed]
-%D \item changing the overal document fonts (including margins,
-%D headers and footers)
-%D \item changing local fonts (only the running text)
-%D \item smaller and even more smaller alternatives (super-
-%D and subscripts)
+%D \item changing the overal document fonts (including margins, headers and footers)
+%D \item changing local fonts (only the running text)
+%D \item smaller and even more smaller alternatives (super- and subscripts)
%D \stopitemize
%D
-%D \TEX\ offers a powerfull family mechanism for super- and
-%D subscripts in math mode. In text mode however, we don't use
-%D families for the smaller alternatives, and therefore have
-%D to take care of it otherwise.
-
+%D \TEX\ offers a powerfull family mechanism for super- and subscripts in math mode.
+%D In text mode however, we don't use families for the smaller alternatives, and
+%D therefore have to take care of it otherwise.
+%D
%D \macros
%D {definebodyfontenvironment,setupbodyfontenvironment}
%D
@@ -1214,8 +1197,8 @@
%D
%D \showsetup{definebodyfontenvironment}
%D
-%D Later on we will see how these parameters are used, so for
-%D the moment we stick with an example:
+%D Later on we will see how these parameters are used, so for the moment we stick
+%D with an example:
%D
%D \starttyping
%D \definebodyfontenvironment
@@ -1229,9 +1212,9 @@
%D small=10pt]
%D \stoptyping
%D
-%D The first argument specifies the bodyfont size to which the
-%D settings apply. All second parameters are specified in
-%D dimensions and tell us more about related sizes.
+%D The first argument specifies the bodyfont size to which the settings apply. All
+%D second parameters are specified in dimensions and tell us more about related
+%D sizes.
%D
%D Afterwards, one can change values with
%D
@@ -1241,8 +1224,8 @@
%D passed, fractions (relations) are used instead of fixed
%D sizes.
-%D {\bf Remark:} We need to cover the following cases, otherwise users can
-%D get confused:
+%D {\bf Remark:} We need to cover the following cases, otherwise users can get
+%D confused:
%D
%D \starttyping
%D \setupbodyfont[23pt]
@@ -1255,10 +1238,9 @@
%D \setupbodyfont[23pt]
%D \stoptyping
%D
-%D Beware: while some font defs can be global, the bodyfont
-%D environment checks local. This means that multiple local
-%D checks resulting in definitions are not that efficient.
-%D So, apart from an occasional switch, one should define an
+%D Beware: while some font defs can be global, the bodyfont environment checks
+%D local. This means that multiple local checks resulting in definitions are not
+%D that efficient. So, apart from an occasional switch, one should define an
%D environment at the outer level.
% \definebodyfontenvironment[33pt]
@@ -1373,8 +1355,8 @@
\clf_registerbodyfontsize{\m_font_body_normalized}%
\fi}
-%D The empty case uses the same code but needs to ignore the current class
-%D settings (just to be sure, as it's not really needed).
+%D The empty case uses the same code but needs to ignore the current class settings
+%D (just to be sure, as it's not really needed).
\def\font_basics_define_body_font_environment_empty[#body][#settings][#dummy]%
{\push_macro_fontclass
@@ -1423,36 +1405,33 @@
\font_helpers_define_unknown_font{#normalizedbody}%
\fi}
-%D We default all parameters to the main bodyfont size, so the next
-%D setup is valid too:
+%D We default all parameters to the main bodyfont size, so the next setup is valid
+%D too:
%D
%D \starttyping
%D \definebodyfontenvironment[24pt]
%D \stoptyping
%D
-%D All parameters can be redefined when needed, so one doesnot have to
-%D stick to the default ones.
+%D All parameters can be redefined when needed, so one doesnot have to stick to the
+%D default ones.
%D \macros
%D {definebodyfont}
%D
-%D The next step in defining a bodyfont involves the actual font
-%D files, which can be recognized by their extension
-%D \type{tfm}. Installing those file is often beyond the
-%D scope of the user and up to the system administrator.
+%D The next step in defining a bodyfont involves the actual font files, which can be
+%D recognized by their extension \type {tfm}. Installing those file is often beyond
+%D the scope of the user and up to the system administrator.
%D
%D \showsetup{definebodyfont}
%D
-%D This commands takes three arguments: a (series of) bodyfont
-%D size(s), the style group to which the definitions belong,
-%D and an alternative, as specified by the \TEX\ (math) families,
-%D extended with~a, b~\unknown.
+%D This commands takes three arguments: a (series of) bodyfont size(s), the style
+%D group to which the definitions belong, and an alternative, as specified by the
+%D \TEX\ (math) families, extended with~a, b~\unknown.
%D
-%D We show two examples, that show all the alternative
-%D scaling options. The \type{\tfa} alternatives can be
-%D extended with \type{\bfa}, \type{\slb}, etc. or even
-%D \type{e} and higher alternatives. The magic scaled
-%D values are derived from plain \TEX's \type {\magstep}:
+%D We show two examples, that show all the alternative scaling options. The \type
+%D {\tfa} alternatives can be extended with \type {\bfa}, \type {\slb}, etc. or even
+%D \type {e} and higher alternatives. The magic scaled values are derived from plain
+%D \TEX's \type {\magstep}:
%D
%D \starttyping
%D \definebodyfont [12pt] [rm]
@@ -1482,29 +1461,25 @@
%D sc=lbr sa 0.833]
%D \stoptyping
%D
-%D The second example shows that we can define more sizes at
-%D once. The main difference between these examples is that the
-%D Computer Modern Roman come in many design sizes. This means
-%D that there we cannot define them in bulk using \type{sa}.
-%D Instead of \type{rm} (roman) one can define \type{ss} (sans
-%D serif), \type{tt} (teletype), \type{hw} (hand written),
-%D \type{cg} (calygraphic) and whatever styles.
-%D
-%D The first argument may be a comma separated list. This,
-%D combined with specifications using \type{sa} can save a lot
-%D of typing. Although all arguments should be specified, we
-%D treat the second argument as optional.
-%D
-%D Defining a bodyfont involves two actions: defining the
-%D specific style related alternatives, like \type{\rma},
-%D \type{\bfa} and \type{\rmsla}, and storing the definitions
-%D of their bodyfont size related fonts. The first step is
-%D bodyfont independant but executed every time. This permits
-%D user definitions like \type{\tfw} or \type{\bfq} for real
-%D large alternatives.
-
-%D If we move design size info to the lfg file (after all only lm
-%D has design sizes) we can get rid of much code .. 2012 or so.
+%D The second example shows that we can define more sizes at once. The main
+%D difference between these examples is that the Computer Modern Roman come in many
+%D design sizes. This means that there we cannot define them in bulk using \type
+%D {sa}. Instead of \type {rm} (roman) one can define \type {ss} (sans serif), \type
+%D {tt} (teletype), \type {hw} (hand written), \type {cg} (calygraphic) and whatever
+%D styles.
+%D
+%D The first argument may be a comma separated list. This, combined with
+%D specifications using \type{sa} can save a lot of typing. Although all arguments
+%D should be specified, we treat the second argument as optional.
+%D
+%D Defining a bodyfont involves two actions: defining the specific style related
+%D alternatives, like \type {\rma}, \type {\bfa} and \type {\rmsla}, and storing the
+%D definitions of their bodyfont size related fonts. The first step is bodyfont
+%D independant but executed every time. This permits user definitions like \type
+%D {\tfw} or \type {\bfq} for real large alternatives.
+%D
+%D If we move design size info to the lfg file (after all only lm has design sizes)
+%D we can get rid of much code .. 2012 or so.
\installcorenamespace{fontdefinitions}
@@ -1555,17 +1530,33 @@
\font_basics_define_body_font_name
[#whatever]}
+% \unexpanded\def\font_basics_define_body_font_body[#body][#style][#specification]%
+% {\doifelseassignment{#specification}
+% \font_basics_define_body_font_body_assignment
+% \font_basics_define_body_font_body_identifier
+% [#body][#style][#specification]}%
+
\unexpanded\def\font_basics_define_body_font_body[#body][#style][#specification]%
- {\doifelseassignment{#specification}
- \font_basics_define_body_font_body_assignment
- \font_basics_define_body_font_body_identifier
- [#body][#style][#specification]}%
+ {\ifcondition\validassignment{#specification}%
+ \expandafter\font_basics_define_body_font_body_assignment
+ \else
+ \expandafter\font_basics_define_body_font_body_identifier
+ \fi
+ [#body][#style][#specification]}%
+
+% \unexpanded\def\font_basics_define_body_font_name[#name][#style][#specification]%
+% {\doifelseassignment{#specification}
+% \font_basics_define_body_font_name_assignment
+% \font_basics_define_body_font_name_identifier
+% [#name][#style][#specification]}%
\unexpanded\def\font_basics_define_body_font_name[#name][#style][#specification]%
- {\doifelseassignment{#specification}
- \font_basics_define_body_font_name_assignment
- \font_basics_define_body_font_name_identifier
- [#name][#style][#specification]}%
+ {\ifcondition\validassignment{#specification}%
+ \expandafter\font_basics_define_body_font_name_assignment
+ \else
+ \expandafter\font_basics_define_body_font_name_identifier
+ \fi
+ [#name][#style][#specification]}%
\unexpanded\def\font_basics_define_body_font_body_assignment[#bodylist][#stylelist][#assignments]%
{\processcommalist[#bodylist]{\font_basics_define_body_font_body_assignment_a{#stylelist}{#assignments}}}
@@ -1625,9 +1616,9 @@
\let\font_basics_define_body_font_defs_nop\font_basics_define_body_font_defs_nop_traced
\to \t_font_tracers_definitions
-% We split into two characters (first part of spec) and the rest: the first two are the style and
-% the rest is a size, although in practice one will seldom define the size directly. We might even
-% drop that as it gives faster code.
+%D We split into two characters (first part of spec) and the rest: the first two are
+%D the style and the rest is a size, although in practice one will seldom define the
+%D size directly. We might even drop that as it gives faster code.
\unexpanded\def\font_basics_define_body_font_nop_xx[#one#two#rest=#value]% local
{\ifcsname\m_font_asked_style#one#two#rest\endcsname\else\font_basics_check_fontname_combination\m_font_asked_style{#one#two}{#rest}\fi
@@ -1818,9 +1809,8 @@
\showmessage\m!fonts5{#style}%
\fi}
-%D Here comes the main font switching macros. These macros
-%D handle changes in size as well as returning to the global
-%D bodyfont size.
+%D Here comes the main font switching macros. These macros handle changes in size as
+%D well as returning to the global bodyfont size.
\ifdefined\font_preloads_at_definition \else \let\font_preloads_at_definition\relax \fi
@@ -1996,8 +1986,8 @@
\the\everyfontswitch
\fi}
-%D This is the resolver for special cases (sizes) and in practice it is not called that often
-%D so further optimization makes no sense.
+%D This is the resolver for special cases (sizes) and in practice it is not called
+%D that often so further optimization makes no sense.
\def\font_helpers_check_strategy_class_a % --- --- --- --- % pt tt bf a
{\ifcsname\??fontinstanceready\fontclass-\fontbody-\fontstyle-\fontalternative-\fontsize-\fontface\endcsname
@@ -2109,12 +2099,11 @@
\fi
\to \everybodyfont
-%D Setting the normal sizes as well as the x and xx smaller
-%D sizes is accomplished by the next set of macros. When in
-%D math mode, the commands \type{\tx} and \type{\txx} are
-%D just a switch to the script and double script styles, but
-%D in text mode the values defined by the bodyfontenvironment are
-%D used. Here we also set \type{\currentxfontsize}.
+%D Setting the normal sizes as well as the x and xx smaller sizes is accomplished by
+%D the next set of macros. When in math mode, the commands \type {\tx} and \type
+%D {\txx} are just a switch to the script and double script styles, but in text mode
+%D the values defined by the bodyfontenvironment are used. Here we also set \type
+%D {\currentxfontsize}.
\def\font_helpers_set_current_font_xxx_alternative#alternative#xsize#scriptstyle%
{\ifmmode
@@ -2155,15 +2144,14 @@
\let\tx\empty
\let\txx\empty}
-% This alterative is not really needed, but for old time's sake
-% we keep it there. We can speed it up when needed.
+%D This alterative is not really needed, but for old time's sake we keep it there.
+%D We can speed it up when needed.
\def\font_helpers_set_current_font_x_style_alternative #alternative{\csname#alternative\endcsname\tx}
\def\font_helpers_set_current_font_xx_style_alternative#alternative{\csname#alternative\endcsname\txx}
-%D These macros also show us that when we call for \type{\tx},
-%D this macro is redefined to be \type{\txx}. Therefore calls
-%D like:
+%D These macros also show us that when we call for \type {\tx}, this macro is
+%D redefined to be \type {\txx}. Therefore calls like:
%D
%D \startbuffer
%D {small \tx is \tx beautiful}
@@ -2180,9 +2168,8 @@
%D \getbuffer
%D \stoplines
%D
-%D Setting the main size involves the style list and therefore
-%D takes a bit more time. Keep in mind that the fontsize is
-%D represented by a character or empty.
+%D Setting the main size involves the style list and therefore takes a bit more
+%D time. Keep in mind that the fontsize is represented by a character or empty.
% \unexpanded\def\tx {\font_helpers_set_current_font_x_alternative \fontalternative}
% \unexpanded\def\txx{\font_helpers_set_current_font_xx_alternative\fontalternative}
@@ -2317,13 +2304,11 @@
\let\normalsx \sx
\let\normalsxx\sxx
-%D When asking for a complete font switch, for instance from 10
-%D to 12~points, the next macro does the job. First we
-%D normalize the size, next we define the current range of
-%D text, script and scriptscript sizes, then we set the text
-%D fonts and the math families and finally we activate the
-%D default typeface and also set the font specific parameters
-%D assigned to \type{\everybodyfont}
+%D When asking for a complete font switch, for instance from 10 to 12~points, the
+%D next macro does the job. First we normalize the size, next we define the current
+%D range of text, script and scriptscript sizes, then we set the text fonts and the
+%D math families and finally we activate the default typeface and also set the font
+%D specific parameters assigned to \type {\everybodyfont}.
\def\textface {\currentbodyfontdimension\s!text }
\def\scriptface {\currentbodyfontdimension\s!script }
@@ -2390,16 +2375,16 @@
%D \macros
%D {setupbodyfont,switchtobodyfont}
%D
-%D The next two macros are user ones. With \type{\setupbodyfont}
-%D one can set the document bodyfont size, font family, style
-%D and/or options defined in files, for example:
+%D The next two macros are user ones. With \type {\setupbodyfont} one can set the
+%D document bodyfont size, font family, style and/or options defined in files, for
+%D example:
%D
%D \starttyping
%D \setupbodyfont[modern,12pt,roman]
%D \stoptyping
%D
-%D This command affects the document as a whole: text, headers
-%D and footers. The second macro however affects only the text:
+%D This command affects the document as a whole: text, headers and footers. The
+%D second macro however affects only the text:
%D
%D \starttyping
%D \switchtobodyfont[10pt]
@@ -2410,8 +2395,8 @@
%D \showsetup{setupbodyfont}
%D \showsetup{switchtobodyfont}
%D
-%D Both macros look alike. The second one also has to take
-%D all kind of keywords into account.
+%D Both macros look alike. The second one also has to take all kind of keywords into
+%D account.
\ifx\saveinterlinespace \undefined \let\saveinterlinespace \relax \fi
\ifx\restoreinterlinespace\undefined \let\restoreinterlinespace\relax \fi
@@ -2462,8 +2447,8 @@
{\font_basics_switch_points\m_font_step
\font_basics_switch_style \fontstyle}
-%D The following alternative is meant for math||to||text
-%D switching and will be optimized.
+%D The following alternative is meant for math||to||text switching and will be
+%D optimized.
\unexpanded\def\fastswitchtobodyfont#name%
{\ifcsname\??fontenvironments\normalizedbodyfontsize#name\endcsname
@@ -2582,9 +2567,8 @@
%D \macros
%D {definebodyfontswitch}
%D
-%D \PLAIN\ \TEX\ defines some macro's like \type{\tenpoint}
-%D to switch to a specific bodyfontsize. Just for the sake of
-%D compatibility we can define them like:
+%D \PLAIN\ \TEX\ defines some macro's like \type {\tenpoint} to switch to a specific
+%D bodyfontsize. Just for the sake of compatibility we can define them like:
%D
%D \starttyping
%D \definebodyfontswitch [twelvepoint] [12pt]
@@ -2601,11 +2585,10 @@
%D \macros
%D {setsmallbodyfont,setmainbodyfont,setbigbodyfont}
%D
-%D When we're typesetting at for instance 10pt, we can call for
-%D the \type{small} as well as the \type{big} alternative,
-%D related to this main size, using \type{\switchtobodyfont[small]}.
-%D The three alternatives can be activated by the next three
-%D system calls and are defined by the bodyfontenvironment.
+%D When we're typesetting at for instance 10pt, we can call for the \type {small} as
+%D well as the \type {big} alternative, related to this main size, using \type
+%D {\switchtobodyfont[small]}. The three alternatives can be activated by the next
+%D three system calls and are defined by the bodyfontenvironment.
\newmacro\m_font_step
@@ -2627,17 +2610,15 @@
%D \macros
%D {restoreglobalbodyfont}
%D
-%D Users can set whatever font available while typesetting text.
-%D Pagenumbers, footers, headers etc. however must be typeset
-%D in the main bodyfont and style of the document. Returning to
-%D the global state can be done with the next macro:
+%D Users can set whatever font available while typesetting text. Pagenumbers,
+%D footers, headers etc. however must be typeset in the main bodyfont and style of
+%D the document. Returning to the global state can be done with the next macro:
%D
-%D This macro has to be called when entering the pagebody
-%D handling routine as well as the footnote insert routine.
-%D Users can access this feature |<|for instance when one wants
-%D to typeset tables and alike in the main bodyfont and style
-%D while the running text is temporary set to a smaller one|>|
-%D by saying \type{\switchtobodyfont[global]}.
+%D This macro has to be called when entering the pagebody handling routine as well
+%D as the footnote insert routine. Users can access this feature |<|for instance
+%D when one wants to typeset tables and alike in the main bodyfont and style while
+%D the running text is temporary set to a smaller one|>| by saying \type
+%D {\switchtobodyfont [global]}.
\let\globalfontstyle\s!rm
@@ -2683,8 +2664,8 @@
% in case of troubles: \let\restorebodyfont\fullrestoreglobalbodyfont
-%D Here are some fast variants that can be used in cases where no font
-%D system is needed and where fonts are frozen:
+%D Here are some fast variants that can be used in cases where no font system is
+%D needed and where fonts are frozen:
%D
%D \starttyping
%D \definefont [TestA][Serif at 10pt]
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-lib.mkvi b/Master/texmf-dist/tex/context/base/mkiv/font-lib.mkvi
index 081ae0f388c..8953c9b320b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-lib.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-lib.mkvi
@@ -28,7 +28,6 @@
% helpers
-
\registerctxluafile{font-otr}{optimize} % opentype fontloader
\registerctxluafile{font-web}{} % opentype fontloader
\registerctxluafile{font-cff}{optimize} % quadratic outlines
@@ -50,8 +49,19 @@
\registerctxluafile{font-otc}{}
\registerctxluafile{font-oth}{}
\registerctxluafile{font-osd}{}
-% \doifelsefileexists{font-osm.lua}{\registerctxluafile{font-osm}{}}{}
-\registerctxluafile{font-ocl}{}
+%registerctxluafile{font-osm}{}
+
+\ifcase\contextlmtxmode
+ \ifnum\luatexversion>111
+ \doifelsefileexists{font-ocm.lua}
+ {\registerctxluafile{font-ocm}{}} % mkiv new
+ {\registerctxluafile{font-ocl}{}}
+ \else
+ \registerctxluafile{font-ocl}{} % generic (will become luatex-fonts-ocl)
+ \fi
+\else
+ \registerctxluafile{font-ogr}{} % lmtx
+\fi
% we use otf code for type one
@@ -61,12 +71,8 @@
% tfm
-\doifelsefileexists {font-tpk.lua} {
- \registerctxluafile{font-tpk}{optimize}
- \registerctxluafile{font-tfm}{}
-} {
- \registerctxluafile{font-tfm}{}
-}
+\registerctxluafile{font-tpk}{optimize}
+\registerctxluafile{font-tfm}{}
% name database
@@ -111,6 +117,7 @@
\registerctxluafile{font-imp-quality}{}
\registerctxluafile{font-imp-italics}{}
\registerctxluafile{font-imp-dimensions}{}
+\registerctxluafile{font-imp-spacekerns}{}
\doifelsefileexists{font-imp-scripts.lua} {
\registerctxluafile{font-imp-scripts}{}
@@ -153,5 +160,21 @@
\def\cleanfontname #1{\clf_cleanfontname{#1}}
\unexpanded\def\setfontofid #1{\clf_setfontofid\numexpr#1\relax}
+% this is an ugly hack needed for postponed inclusion stuff ... don't try
+% to understand this ... these are kind of old mkiv solutions
+
+\unexpanded\def\typethreefont#1{\setfontid#1\relax}
+\unexpanded\def\typethreechar#1{\char#1\hskip-\fontcharwd\font#1\relax}
+\unexpanded\def\typethreelast#1{\char#1\relax}
+\unexpanded\def\typethreecode#1{\pdfliteral direct {#1}}
+
+\newtoks\typethreetoks
+\let \typethreemacro\empty
+
+\typethreetoks {%
+ \setbox\zerocount\hpack{\typethreemacro}%
+ \setbox\zerocount\hpack{\raise\dp\zerocount\box\zerocount}%
+}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-mat.mklx b/Master/texmf-dist/tex/context/base/mkiv/font-mat.mklx
new file mode 100644
index 00000000000..d08a2ce879f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-mat.mklx
@@ -0,0 +1,500 @@
+%D \module
+%D [ file=font-mat,
+%D version=2011.01.13, % (copied fron font-ini)
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Math,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Font Macros / Math}
+
+\unprotect
+
+%D Be nice:
+
+\ifdefined\??fontinstanceready \else \installcorenamespace{fontinstanceready} \fi
+\ifdefined\??fontinstancebasic \else \installcorenamespace{fontinstancebasic} \fi
+\ifdefined\??fontinstanceclass \else \installcorenamespace{fontinstanceclass} \fi
+
+%D The order 3 2 1 of siuze matters: needed for math-fbk relative size storage!
+
+%D \macros
+%D {textonly}
+%D
+%D Traditionally math has a big impact on font definitions, mainly because we need
+%D to define alphabet variants using families and fonts. This means that one can
+%D easily get 10 fonts loaded per math size. In \MKIV\ we use a different approach:
+%D one family which has either a virtual font made of traditional fonts, or an
+%D \OPENTYPE\ font that has it all.
+%D
+%D We currently use only one math family but in the future we might consider using a
+%D second one for bold math. For the moment we keep the \MKII\ method of using a
+%D token register for definitions but we already dropped the text and symbols ones
+%D since they now live in the same family.
+
+\newtoks \t_font_math_strategies
+\newconditional\c_font_synchronize_math_fonts \settrue\c_font_synchronize_math_fonts
+
+\unexpanded\def\font_helpers_synchronize_math % math stuff in mmode
+ {\ifconditional\c_font_synchronize_math_fonts\the\t_font_math_strategies\fi}
+
+\unexpanded\def\textonly{\setfalse\c_font_synchronize_math_fonts} % document this
+
+%D The main math font definer. We have removed some optimized code simply because we
+%D now always have a fontclass. We could check for fontclass being default or empty
+%D and save a few tests but it does not help us when no math is defined.
+%D
+%D Because we want to keep mr=.. and mb=... settings (read: not break downward
+%D compatibility by enforcing mrlr etc) we need a bit more code that optimal.
+
+% todo: \c_font_fam_mr
+
+\let\c_font_fam_mr \zerocount % math regular
+\let\c_font_fam_mr_lr\plusone % math regular l2r
+\let\c_font_fam_mr_rl\plustwo % math regular r2l
+
+\let\c_font_fam_mb \plusthree % math bold
+\let\c_font_fam_mb_lr\plusfour % math bold l2r
+\let\c_font_fam_mb_rl\plusfive % math bold r2l
+
+\definesystemattribute[mathfamily][public]
+
+\newconditional\c_font_bidirectional_mathstrategy % can be default, not that much overhead: \settrue\c_font_bidirectional_mathstrategy
+\newconditional\c_font_complete_bold_mathstrategy \settrue\c_font_complete_bold_mathstrategy
+
+\def\mathtextsuffix {-text}
+\def\mathscriptsuffix {-script}
+\def\mathscriptscriptsuffix{-scriptscript}
+
+\def\mathsizesuffix{\ifcase\fontface\or\mathtextsuffix\or\mathscriptsuffix\or\mathscriptscriptsuffix\fi}
+
+%D Beware: truefontname also does a fallback on defaultfontclass so there
+%D can be some interference here, which is why we use a different method
+%D for bold.
+
+\def\font_helpers_set_math_family_a
+ {\ifcsname\??fontinstanceready\fontclass -\fontbody-\s!mm-\fontfamily-\fontsize\endcsname \setfalse\c_font_auto_size
+ \lastnamedcs \orelse
+ \ifcsname\??fontinstanceready\fontclass -\fontbody-\s!mm-\fontfamily \endcsname \settrue \c_font_auto_size
+ \lastnamedcs \else
+ \font_helpers_set_math_family_b
+ \fi}
+
+\def\font_helpers_set_math_family_b
+ {\ifcsname\??fontinstanceready\defaultfontclass-\fontbody-\s!mm-\fontfamily-\fontsize\endcsname \setfalse\c_font_auto_size
+ \lastnamedcs \orelse
+ \ifcsname\??fontinstanceready\defaultfontclass-\fontbody-\s!mm-\fontfamily \endcsname \settrue \c_font_auto_size
+ \lastnamedcs \else
+ \font_helpers_set_math_family_c
+ \fi}
+
+\def\font_helpers_set_math_family_c
+ {\ifcsname\??fontinstanceready \fontbody-\s!mm-\fontfamily-\fontsize\endcsname \setfalse\c_font_auto_size
+ \lastnamedcs \orelse
+ \ifcsname\??fontinstanceready \fontbody-\s!mm-\fontfamily \endcsname \settrue \c_font_auto_size
+ \lastnamedcs \else
+ \settrue \c_font_auto_size
+ \fi}
+
+\let\mathsizesuffix\empty
+
+\def\font_helpers_set_math_family_indeed#mrtag#family% \fontface etc are also used later on
+ {\let\savedfontbody\fontbody
+ \let\fontfamily#family%
+ % the order is important as we depend on known id's when completing fonts
+ % enabling is needed when we have fallbacks which spoils the families
+ \let\mathsizesuffix\mathscriptscriptsuffix\let\fontface\!!plusthree
+ \font_helpers_set_math_family_a\scriptscriptfont#mrtag\font % defines
+ \font_helpers_set_math_family_a\scriptscriptfont#mrtag\font % enables
+ \let\mathsizesuffix\mathscriptsuffix \let\fontface\!!plustwo
+ \font_helpers_set_math_family_a\scriptfont #mrtag\font % defines
+ \font_helpers_set_math_family_a\scriptfont #mrtag\font % enables
+ \let\mathsizesuffix\mathtextsuffix \let\fontface\!!plusone
+ \font_helpers_set_math_family_a\textfont #mrtag\font % defines
+ \font_helpers_set_math_family_a\textfont #mrtag\font % enables
+ \let\mathsizesuffix\empty \let\fontface\!!zerocount
+ \let\fontbody\savedfontbody
+ \setfalse\c_font_auto_size}
+
+\def\font_helpers_set_math_family_bold_a#font#mbfam#mrfam%
+ {\ifcsname\??fontinstanceready\fontclass-\fontbody-\s!mm-\fontfamily-\fontsize\endcsname \setfalse\c_font_auto_size
+ \lastnamedcs #font#mbfam\font \orelse
+ \ifcsname\??fontinstanceready\fontclass-\fontbody-\s!mm-\fontfamily \endcsname \settrue \c_font_auto_size
+ \lastnamedcs #font#mbfam\font \else
+ #font#mbfam#font#mrfam%
+ \fi}
+
+\def\font_helpers_set_math_family_bold_indeed#mbfam#familytag#mrfam% \c_font_fam_mb \s!mb \c_font_fam_mr
+ {\let\savedfontclass\defaultfontclass
+ \let\defaultfontclass\fontclass % else truefontname falls back on the wrong one
+ \let\savedfontbody\fontbody
+ \let\fontfamily#familytag%
+ \let\mathsizesuffix\mathscriptscriptsuffix\let\fontface\!!plusthree
+ \font_helpers_set_math_family_bold_a\scriptscriptfont#mbfam#mrfam% defines
+ \font_helpers_set_math_family_bold_a\scriptscriptfont#mbfam#mrfam% enables
+ \let\mathsizesuffix\mathscriptsuffix \let\fontface\!!plustwo
+ \font_helpers_set_math_family_bold_a\scriptfont #mbfam#mrfam% defines
+ \font_helpers_set_math_family_bold_a\scriptfont #mbfam#mrfam% enables
+ \let\mathsizesuffix\mathtextsuffix \let\fontface\!!plusone
+ \font_helpers_set_math_family_bold_a\textfont #mbfam#mrfam% defines
+ \font_helpers_set_math_family_bold_a\textfont #mbfam#mrfam% enables
+ \let\mathsizesuffix\empty \let\fontface\!!zerocount
+ \let\fontbody\savedfontbody
+ \let\defaultfontclass\savedfontclass
+ \setfalse\c_font_auto_size}
+
+% optimized: math fonts are never changed (10K \bfa $x$: 3.2 => 2.5 (baseline 1.0))
+%
+% sort of tricky: we cannot reset in \everybeforedefinetypeface as we don't know
+% all sizes so we postpone the optimization to the first starttext
+%
+% pitfall: we should reset 'm when a fontclass name is reused
+
+\newconditional\optimizemathfontdefinitions \settrue\optimizemathfontdefinitions
+
+\def\font_helpers_set_math_family#mrfam#familytag%
+ {\ifconditional\optimizemathfontdefinitions
+ \ifcsname\??fontinstanceclass\fontclass-\fontbody-\s!mm-#familytag-\fontsize-1\endcsname
+ % \writestatus{fonts}{math: reusing \fontclass\fontbody\s!mm#familytag\fontsize1}%
+ \font_helpers_preset_math_family_indeed#mrfam#familytag%
+ \else
+ % \writestatus{fonts}{math: defining \fontclass\fontbody\s!mm#familytag\fontsize1}%
+ \font_helpers_set_math_family_indeed#mrfam#familytag%
+ \fi
+ \else
+ \font_helpers_set_math_family_indeed#mrfam#familytag%
+ \fi}
+
+\def\font_helpers_set_math_family_bold#mbfam#familytag#mrfam%
+ {\ifconditional\optimizemathfontdefinitions
+ %\ifcsname\??fontinstanceclass\fontclass-\textface-\s!mm-#familytag-\fontsize-1\endcsname
+ \ifcsname\??fontinstanceclass\fontclass-\fontbody-\s!mm-#familytag-\fontsize-1\endcsname
+ \font_helpers_preset_math_family_indeed#mbfam#familytag%
+ \else
+ \font_helpers_set_math_family_bold_indeed#mbfam#familytag#mrfam%
+ \fi
+ \else
+ \font_helpers_set_math_family_bold_indeed#mbfam#familytag#mrfam%
+ \fi}
+
+%D It can happen that we use a bodyfont with no math in which case we have a problem
+%D with setting the global bodyfont size in the page builder. For instance in:
+%D
+%D \starttext
+%D \definetypeface[test][rm][serif][pagella][default]
+%D \setupbodyfont[test]
+%D test
+%D \stoptext
+%D
+%D This is why we need the check. At the cost of some extra checking we gain a
+%D little in restoring global states and, what's more important, we get rid of large
+%D math parameter push/pop in tracingall when not needed.
+
+\def\font_helpers_preset_math_family_indeed#fam#familytag%
+ {\expandafter\let\expandafter\v_font_math_one\csname\??fontinstanceclass\fontclass-\fontbody-\s!mm-#familytag-\fontsize-1\endcsname
+ \ifx\v_font_math_one\relax
+ \font_helpers_preset_math_family_warning
+ \orelse\ifnum\fontid\textfont#fam=\fontid\v_font_math_one\else
+ \font_helpers_preset_math_family_indeed_changed#fam#familytag%
+ \fi}
+
+\def\font_helpers_preset_math_family_warning
+ {\writestatus{fonts}{math: unset for global bodyfont \fontclass\space at \fontbody}}
+
+\def\font_helpers_preset_math_family_indeed_changed#fam#familytag%
+ {\scriptscriptfont#fam\csname\??fontinstanceclass\fontclass-\fontbody-\s!mm-#familytag-\fontsize-3\endcsname
+ \scriptfont #fam\csname\??fontinstanceclass\fontclass-\fontbody-\s!mm-#familytag-\fontsize-2\endcsname
+ \textfont #fam\v_font_math_one}
+
+\let\font_helpers_reset_fontclass_math_families\gobbleoneargument
+
+%D It would be nice if characters could be defined in a neutral way (say fam 255)
+%D and be mapped to a real family during noad list construction. However, this
+%D changes tex in critical places so for the moment we simulate this using
+%D manipulation.
+%D
+%D For tracing purposes we use three families but in l2r mode 1 and 2 are copies of
+%D 0 while in rl mode 0 is a copy of 1. There is no real overhead involved in this.
+%D This also permits different font definitions for normal and mixed.
+
+\let\m_font_class_direction\empty
+\let\m_font_class_features \empty
+\let\m_font_class_fallbacks\empty
+\let\m_font_class_goodies \empty
+
+\let\m_font_direction\empty
+\let\m_font_features \empty
+\let\m_font_fallbacks\empty
+\let\m_font_goodies \empty
+
+\appendtoks % can be analyzed once
+ % why here ..
+ %\edef\m_font_class_direction{\ifcsname\??fontclass\fontclass\s!mm\s!direction\endcsname\csname\??fontclass\fontclass\s!mm\s!direction\endcsname\fi}%
+ \edef\m_font_class_direction{\begincsname\??fontclass\fontclass\s!mm\s!direction\endcsname}%
+ % ...
+ \ifx\m_font_class_direction\v!both
+ \settrue\c_font_bidirectional_mathstrategy
+ \else
+ \setfalse\c_font_bidirectional_mathstrategy
+ \fi
+\to \t_font_math_strategies
+
+\def\font_helpers_bidirectional_mathstrategy_yes
+ {\font_helpers_set_math_family\c_font_fam_mr_lr\s!mrlr
+ \font_helpers_set_math_family\c_font_fam_mr_rl\s!mrrl
+ \ifnum\fontid\textfont\c_font_fam_mr=\fontid\textfont\c_font_fam_mr_lr\else
+ \font_helpers_bidirectional_mathstrategy_yes_changed
+ \fi}
+
+\def\font_helpers_bidirectional_mathstrategy_yes_changed
+ {\textfont \c_font_fam_mr\textfont \c_font_fam_mr_lr
+ \scriptfont \c_font_fam_mr\scriptfont \c_font_fam_mr_lr
+ \scriptscriptfont\c_font_fam_mr\scriptscriptfont\c_font_fam_mr_lr}
+
+\def\font_helpers_bidirectional_mathstrategy_nop
+ {\font_helpers_set_math_family\c_font_fam_mr\s!mr
+ \ifnum\fontid\textfont\c_font_fam_mr_rl=\fontid\textfont\c_font_fam_mr\else
+ \font_helpers_bidirectional_mathstrategy_nop_changed
+ \fi}
+
+\def\font_helpers_bidirectional_mathstrategy_nop_changed
+ {\textfont \c_font_fam_mr_lr\textfont \c_font_fam_mr
+ \scriptfont \c_font_fam_mr_lr\scriptfont \c_font_fam_mr
+ \scriptscriptfont\c_font_fam_mr_lr\scriptscriptfont\c_font_fam_mr
+ \textfont \c_font_fam_mr_rl\textfont \c_font_fam_mr
+ \scriptfont \c_font_fam_mr_rl\scriptfont \c_font_fam_mr
+ \scriptscriptfont\c_font_fam_mr_rl\scriptscriptfont\c_font_fam_mr}
+
+\appendtoks
+ \ifconditional\c_font_bidirectional_mathstrategy
+ \font_helpers_bidirectional_mathstrategy_yes
+ \else
+ \font_helpers_bidirectional_mathstrategy_nop
+ \fi
+\to \t_font_math_strategies
+
+\def\font_helpers_complete_bold_mathstrategy_yes_bidi
+ {\font_helpers_set_math_family_bold\c_font_fam_mb_lr\s!mblr\c_font_fam_mr_lr
+ \font_helpers_set_math_family_bold\c_font_fam_mb_rl\s!mbrl\c_font_fam_mr_rl
+ \ifnum\fontid\textfont\c_font_fam_mb=\fontid\textfont\c_font_fam_mb_lr\else
+ \font_helpers_complete_bold_mathstrategy_yes_bidi_changed
+ \fi}
+
+\def\font_helpers_complete_bold_mathstrategy_yes_bidi_changed
+ {\textfont \c_font_fam_mb\textfont \c_font_fam_mb_lr
+ \scriptfont \c_font_fam_mb\scriptfont \c_font_fam_mb_lr
+ \scriptscriptfont\c_font_fam_mb\scriptscriptfont\c_font_fam_mb_lr}
+
+\def\font_helpers_complete_bold_mathstrategy_yes
+ {\font_helpers_set_math_family_bold\c_font_fam_mb\s!mb\c_font_fam_mr\relax
+ \ifnum\fontid\textfont\c_font_fam_mb_rl=\fontid\textfont\c_font_fam_mb\else
+ \font_helpers_complete_bold_mathstrategy_yes_changed
+ \fi}
+
+\def\font_helpers_complete_bold_mathstrategy_yes_changed
+ {\textfont \c_font_fam_mb_rl\textfont \c_font_fam_mb
+ \scriptfont \c_font_fam_mb_rl\scriptfont \c_font_fam_mb
+ \scriptscriptfont\c_font_fam_mb_rl\scriptscriptfont\c_font_fam_mb
+ \textfont \c_font_fam_mb_lr\textfont \c_font_fam_mb
+ \scriptfont \c_font_fam_mb_lr\scriptfont \c_font_fam_mb
+ \scriptscriptfont\c_font_fam_mb_lr\scriptscriptfont\c_font_fam_mb}
+
+\def\font_helpers_complete_bold_mathstrategy_nop
+ {\ifnum\fontid\textfont\c_font_fam_mb=\fontid\textfont\c_font_fam_mr\else
+ \font_helpers_complete_bold_mathstrategy_nop_changed
+ \fi}
+
+\def\font_helpers_complete_bold_mathstrategy_nop_changed
+ {\textfont \c_font_fam_mb \textfont \c_font_fam_mr
+ \scriptfont \c_font_fam_mb \scriptfont \c_font_fam_mr
+ \scriptscriptfont\c_font_fam_mb \scriptscriptfont\c_font_fam_mr
+ \textfont \c_font_fam_mb_lr\textfont \c_font_fam_mr_lr
+ \scriptfont \c_font_fam_mb_lr\scriptfont \c_font_fam_mr_lr
+ \scriptscriptfont\c_font_fam_mb_lr\scriptscriptfont\c_font_fam_mr_lr
+ \textfont \c_font_fam_mb_rl\textfont \c_font_fam_mr_rl
+ \scriptfont \c_font_fam_mb_rl\scriptfont \c_font_fam_mr_rl
+ \scriptscriptfont\c_font_fam_mb_rl\scriptscriptfont\c_font_fam_mr_rl}
+
+\def\font_helpers_apply_complete_bold_mathstrategy
+ {\ifconditional\c_font_complete_bold_mathstrategy
+ \ifconditional\c_font_bidirectional_mathstrategy
+ \font_helpers_complete_bold_mathstrategy_yes_bidi
+ \else
+ \font_helpers_complete_bold_mathstrategy_yes
+ \fi
+ \else
+ \font_helpers_complete_bold_mathstrategy_nop
+ \fi}
+
+\appendtoks
+ \font_helpers_apply_complete_bold_mathstrategy
+\to \t_font_math_strategies
+
+\ifdefined\defaultmathfamily \else
+ \setnewconstant\defaultmathfamily\zerocount
+\fi
+
+\appendtoks
+ \fam\defaultmathfamily % all characters and symbols are in this family
+\to \everymathematics
+
+\unexpanded\def\font_helpers_synchronize_math_family_mr
+ {\attribute\mathfamilyattribute\ifconditional\c_font_bidirectional_mathstrategy
+ \ifconditional\c_math_right_to_left
+ \plustwo
+ \else
+ \plusone
+ \fi
+ \else
+ \zerocount
+ \fi}
+
+\unexpanded\def\font_helpers_synchronize_math_family_mb
+ {\attribute\mathfamilyattribute\ifconditional\c_font_bidirectional_mathstrategy
+ \ifconditional\c_math_right_to_left
+ \ifconditional\c_font_pseudo_bold_math_state\pluseight\else\plusfive\fi
+ \else
+ \ifconditional\c_font_pseudo_bold_math_state\plusseven\else\plusfour\fi
+ \fi
+ \else
+ \ifconditional\c_font_pseudo_bold_math_state\plussix\else\plusthree\fi
+ \fi}
+
+\installcorenamespace{fontmathsynchronizer}
+\installcorenamespace{fontmathstoredstrategy}
+
+\letvalue{\??fontmathsynchronizer\s!tf }\font_helpers_synchronize_math_family_mr
+\letvalue{\??fontmathsynchronizer\s!sl }\font_helpers_synchronize_math_family_mr
+\letvalue{\??fontmathsynchronizer\s!it }\font_helpers_synchronize_math_family_mr
+\letvalue{\??fontmathsynchronizer\s!bf }\font_helpers_synchronize_math_family_mb
+\letvalue{\??fontmathsynchronizer\s!bs }\font_helpers_synchronize_math_family_mb
+\letvalue{\??fontmathsynchronizer\s!bi }\font_helpers_synchronize_math_family_mb
+\letvalue{\??fontmathsynchronizer\empty}\font_helpers_synchronize_math_family_mr
+
+% \def\font_helpers_synchronize_math_family
+% {\csname\??fontmathsynchronizer\ifcsname\??fontmathsynchronizer\fontalternative\endcsname\fontalternative\fi\endcsname}
+
+\def\font_helpers_synchronize_math_family
+ {\ifcsname\??fontmathsynchronizer\fontalternative\endcsname
+ \lastnamedcs
+ \else
+ \font_helpers_synchronize_math_family_mr
+ \fi}
+
+\ifdefined \fontid % we need to keep this test for a while
+ \appendtoks
+ \ifnum\fontid\textfont\zerocount=\fontid\textfont\plusthree
+ \letvalue{\??fontmathstoredstrategy\fontclass}\font_helpers_set_math_partial_bold_strategy
+ \else
+ \letvalue{\??fontmathstoredstrategy\fontclass}\font_helpers_set_math_full_bold_strategy
+ \fi
+ \to \t_font_math_strategies
+\else
+ \appendtoks
+ \edef\currentmathfontmr{\fontname\textfont\zerocount}%
+ \edef\currentmathfontmb{\fontname\textfont\plusthree}%
+ \ifx\currentmathfontmr\currentmathfontmb
+ \letvalue{\??fontmathstoredstrategy\fontclass}\font_helpers_set_math_partial_bold_strategy
+ \else
+ \letvalue{\??fontmathstoredstrategy\fontclass}\font_helpers_set_math_full_bold_strategy
+ \fi
+ \to \t_font_math_strategies
+\fi
+
+%def\font_helpers_synchronize_math_bold_strategy{\csname\??fontmathstoredstrategy\fontclass\endcsname}
+\def\font_helpers_synchronize_math_bold_strategy{\begincsname\??fontmathstoredstrategy\fontclass\endcsname}
+
+\newconditional\c_font_pseudo_bold_math_state
+
+\def\font_helpers_set_math_partial_bold_strategy{\settrue \c_font_pseudo_bold_math_state}
+\def\font_helpers_set_math_full_bold_strategy {\setfalse\c_font_pseudo_bold_math_state}
+
+\appendtoks
+ \font_helpers_synchronize_math_bold_strategy
+\to \everymathematics
+
+%D Bold is somewhat special as we might want both full-bold-math mixed regular-math,
+%D as well as automatic adaption to outer bold (in titles and inline text bold) so
+%D we will need explicit switches as well as an automatic one. (We will use lucida
+%D as an example.)
+
+\ifdefined\mathdefault \else \let\mathdefault\relax \fi
+
+\newconditional\c_math_bold
+
+\unexpanded\def\mr % math regular
+ {\ifmmode
+ \font_helpers_synchronize_math_family_mr
+ \else
+ \font_helpers_set_current_font_alternative\s!mr
+ \fi
+ \mathdefault
+ \setfalse\c_math_bold}
+
+\unexpanded\def\mb % math bold
+ {\ifmmode
+ \font_helpers_synchronize_math_family_mb
+ \else
+ \font_helpers_set_current_font_alternative\s!mb
+ \fi
+ \mathdefault
+ \settrue\c_math_bold}
+
+\appendtoks
+ \font_helpers_synchronize_math_family % auto bold
+\to \everymathematics
+
+\appendtoks
+ \ifconditional\c_math_bold\mb\fi
+\to \everymathematics
+
+%D \macros
+%D {bigmath,nobigmath}
+%D
+%D We can inhibit this slow||downer with:
+
+% these can best be combined
+
+% 0=never 1=everymath 2=always
+
+\setnewconstant\synchronizebigmathflag\plusone
+
+\appendtoks
+ \ifcase\synchronizebigmathflag
+ % never
+ \or
+ \synchronizebigmath
+ \or
+ % always
+ \fi
+\to \everymathematics
+
+\unexpanded\def\nobigmath {\synchronizebigmathflag\zerocount}
+\unexpanded\def\autobigmath{\synchronizebigmathflag\plusone\synchronizebigmath}
+\unexpanded\def\bigmath {\synchronizebigmathflag\plustwo\synchronizebigmath}
+
+\let\bigmathfontsize\empty
+
+\unexpanded\def\synchronizebigmath
+ {\ifx\bigmathfontsize\fontsize
+ % already in sync
+ \else
+ \let\bigmathfontsize\fontsize
+ \font_helpers_synchronize_math
+ \fi}
+
+\unexpanded\def\font_helpers_check_big_math_synchronization
+ {\ifcase\synchronizebigmathflag
+ % never
+ \or
+ \ifmmode \synchronizebigmath \fi
+ \or
+ \synchronizebigmath
+ \fi}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-mis.lua b/Master/texmf-dist/tex/context/base/mkiv/font-mis.lua
index c75b9298454..fe972114f47 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-mis.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-mis.lua
@@ -21,38 +21,41 @@ local readers = otf.readers
if readers then
- otf.version = otf.version or 3.107
+ otf.version = otf.version or 3.111
otf.cache = otf.cache or containers.define("fonts", "otl", otf.version, true)
function fonts.helpers.getfeatures(name,save)
local filename = resolvers.findfile(name) or ""
if filename ~= "" then
--- local name = file.removesuffix(file.basename(filename))
--- local cleanname = containers.cleanname(name)
--- local data = containers.read(otf.cache,cleanname)
--- if data then
--- readers.unpack(data)
--- else
--- data = readers.loadfont(filename) -- we can do a more minimal load
--- -- if data and save then
--- -- -- keep this in sync with font-otl
--- -- readers.compact(data)
--- -- readers.rehash(data,"unicodes")
--- -- readers.addunicodetable(data)
--- -- readers.extend(data)
--- -- readers.pack(data)
--- -- -- till here
--- -- containers.write(otf.cache,cleanname,data)
--- -- end
--- end
--- if not data then
--- data = readers.loadfont(filename) -- we can do a more minimal load
--- end
--- if data then
--- readers.unpack(data)
--- end
-local data = otf.load(filename)
- return data and data.resources and data.resources.features
+ -- local name = file.removesuffix(file.basename(filename))
+ -- local cleanname = containers.cleanname(name)
+ -- local data = containers.read(otf.cache,cleanname)
+ -- if data then
+ -- readers.unpack(data)
+ -- else
+ -- data = readers.loadfont(filename) -- we can do a more minimal load
+ -- -- if data and save then
+ -- -- -- keep this in sync with font-otl
+ -- -- readers.compact(data)
+ -- -- readers.rehash(data,"unicodes")
+ -- -- readers.addunicodetable(data)
+ -- -- readers.extend(data)
+ -- -- readers.pack(data)
+ -- -- -- till here
+ -- -- containers.write(otf.cache,cleanname,data)
+ -- -- end
+ -- end
+ -- if not data then
+ -- data = readers.loadfont(filename) -- we can do a more minimal load
+ -- end
+ -- if data then
+ -- readers.unpack(data)
+ -- end
+ local data = otf.load(filename)
+ local resources = data and data.resources
+ if resources then
+ return data.resources.features, data.resources.foundtables, data
+ end
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-mps.lua b/Master/texmf-dist/tex/context/base/mkiv/font-mps.lua
index 89583595826..8bfe23b892b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-mps.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-mps.lua
@@ -22,9 +22,9 @@ fonts = fonts or { }
local metapost = fonts.metapost or { }
fonts.metapost = metapost
-local f_moveto = formatters["(%.6F,%.6F)"]
-local f_lineto = formatters["--(%.6F,%.6F)"]
-local f_curveto = formatters["..controls(%.6F,%.6F)and(%.6F,%.6F)..(%.6F,%.6F)"]
+local f_moveto = formatters["(%N,%N)"]
+local f_lineto = formatters["--(%N,%N)"]
+local f_curveto = formatters["..controls(%N,%N)and(%N,%N)..(%N,%N)"]
local s_cycle = "--cycle"
local f_nofill = formatters["nofill %s;"]
@@ -33,19 +33,8 @@ local f_dofill = formatters["fill %s;"]
local f_draw_trace = formatters["drawpathonly %s;"]
local f_draw = formatters["draw %s;"]
-local f_boundingbox = formatters["((%.6F,%.6F)--(%.6F,%.6F)--(%.6F,%.6F)--(%.6F,%.6F)--cycle)"]
-local f_vertical = formatters["((%.6F,%.6F)--(%.6F,%.6F))"]
-
-directives.register("metapost.stripzeros", function()
-
- f_moveto = formatters["(%.6N,%.6N)"]
- f_lineto = formatters["--(%.6N,%.6N)"]
- f_curveto = formatters["..controls(%.6N,%.6N)and(%.6N,%.6N)..(%.6N,%.6N)"]
-
- f_boundingbox = formatters["((%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--cycle)"]
- f_vertical = formatters["((%.6N,%.6N)--(%.6N,%.6N))"]
-
-end)
+local f_boundingbox = formatters["((%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--cycle)"]
+local f_vertical = formatters["((%N,%N)--(%N,%N))"]
function metapost.boundingbox(d,factor)
local bounds = d.boundingbox
@@ -279,7 +268,7 @@ local getnext = nuts.getnext
local getid = nuts.getid
local getlist = nuts.getlist
local getsubtype = nuts.getsubtype
-local getfield = nuts.getfield
+local getreplace = nuts.getreplace
local getbox = nuts.getbox
local getwhd = nuts.getwhd
local getkern = nuts.getkern
@@ -297,19 +286,13 @@ local parameters = fonts.hashes.parameters
local shapes = fonts.hashes.shapes
local topaths = metapost.paths
-local f_code = formatters["mfun_do_outline_text_flush(%q,%i,%.6F,%.6F,%q)(%,t);"]
-local f_rule = formatters["mfun_do_outline_rule_flush(%q,%.6F,%.6F,%.6F,%.6F);"]
-local f_bounds = formatters["checkbounds(%.6F,%.6F,%.6F,%.6F);"]
+local f_code = formatters["mfun_do_outline_text_flush(%q,%i,%N,%N,%q)(%,t);"]
+local f_rule = formatters["mfun_do_outline_rule_flush(%q,%N,%N,%N,%N);"]
+local f_bounds = formatters["checkbounds(%N,%N,%N,%N);"]
local s_nothing = "(origin scaled 10)"
-directives.register("metapost.stripzeros", function()
- f_code = formatters["mfun_do_outline_text_flush(%q,%i,%.6N,%.6N,%q)(%,t);"]
- f_rule = formatters["mfun_do_outline_rule_flush(%q,%.6N,%.6N,%.6N,%.6N);"]
- f_bounds = formatters["checkbounds(%.6N,%.6N,%.6N,%.6N);"]
-end)
-
-local sc = 10
-local fc = number.dimenfactors.bp * sc / 10
+local sc = 10
+local fc = number.dimenfactors.bp * sc / sc
-- todo: make the next more efficient:
@@ -372,7 +355,7 @@ function fonts.metapost.boxtomp(n,kind)
result[#result+1] = code
dx = dx + width
elseif id == disc_code then
- local replace = getfield(current,"replace")
+ local replace = getreplace(current)
if replace then
dx = dx + horizontal(parent,replace,xoffset+dx,yoffset)
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-nod.lua b/Master/texmf-dist/tex/context/base/mkiv/font-nod.lua
index a0eb88a252c..8c0f6e441a7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-nod.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-nod.lua
@@ -56,7 +56,6 @@ local kern_code = nodecodes.kern
local dir_code = nodecodes.dir
local localpar_code = nodecodes.localpar
-local getfield = nuts.getfield
local getnext = nuts.getnext
local getprev = nuts.getprev
local getid = nuts.getid
@@ -64,6 +63,7 @@ local getfont = nuts.getfont
local getsubtype = nuts.getsubtype
local getlist = nuts.getlist
local getdisc = nuts.getdisc
+local getreplace = nuts.getreplace
local isglyph = nuts.isglyph
local getkern = nuts.getkern
local getdirection = nuts.getdirection
@@ -77,6 +77,7 @@ local copy_node_list = nuts.copy_list
local hpack_node_list = nuts.hpack
local flush_node_list = nuts.flush_list
local protect_glyphs = nuts.protect_glyphs
+local start_of_par = nuts.start_of_par
local nextnode = nuts.traversers.node
local nextglyph = nuts.traversers.glyph
@@ -395,7 +396,7 @@ function step_tracers.codes(i,command,space)
local char, id = isglyph(c)
if char then
showchar(char,id)
- elseif id == dir_code or (id == localpar_code and getsubtype(c) == 0) then
+ elseif id == dir_code or (id == localpar_code and start_of_par(c)) then
context("[%s]",getdirection(c) or "?")
elseif id == disc_code then
local pre, post, replace = getdisc(c)
@@ -519,7 +520,8 @@ local function toutf(list,result,nofresult,stopcriterium,nostrip)
result[nofresult] = f_badcode(c)
end
elseif id == disc_code then
- result, nofresult = toutf(getfield(n,"replace"),result,nofresult,false,true) -- needed?
+ local replace = getreplace(n)
+ result, nofresult = toutf(replace,result,nofresult,false,true) -- needed?
elseif id == hlist_code or id == vlist_code then
-- if nofresult > 0 and result[nofresult] ~= " " then
-- nofresult = nofresult + 1
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-ocl.lua b/Master/texmf-dist/tex/context/base/mkiv/font-ocl.lua
index 0976cdb21c0..eef221e4686 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-ocl.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-ocl.lua
@@ -8,9 +8,14 @@ if not modules then modules = { } end modules ['font-ocl'] = {
-- todo : user list of colors
+if CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 then
+ return
+end
+
local tostring, tonumber, next = tostring, tonumber, next
local round, max = math.round, math.round
-local sortedkeys, sortedhash = table.sortedkeys, table.sortedhash
+local gsub, find = string.gsub, string.find
+local sortedkeys, sortedhash, concat = table.sortedkeys, table.sortedhash, table.concat
local setmetatableindex = table.setmetatableindex
local formatters = string.formatters
@@ -24,6 +29,7 @@ local leftcommand = helpers.commands.left
local downcommand = helpers.commands.down
local otf = fonts.handlers.otf
+local otfregister = otf.features.register
local f_color = formatters["%.3f %.3f %.3f rg"]
local f_gray = formatters["%.3f g"]
@@ -150,7 +156,7 @@ local pop = { "pdf", "page", "Q" }
-- -- only shows the first glyph in acrobat and nothing more. No problem with other
-- -- renderers.
--
--- local function initialize(tfmdata,kind,value) -- hm, always value
+-- local function initializeoverlay(tfmdata,kind,value) -- hm, always value
-- if value then
-- local resources = tfmdata.resources
-- local palettes = resources.colorpalettes
@@ -193,11 +199,11 @@ local pop = { "pdf", "page", "Q" }
-- local goback = w ~= 0 and leftcommand[w] or nil -- needs checking: are widths the same
-- local t = {
-- start,
--- not u and actualb or { "pdf", "page", (getactualtext(tounicode(u))) }
+-- not u and actualb or { "pdf", "page", (getactualtext(tounicode(u))) },
+-- push,
-- }
--- local n = 2
+-- local n = 3
-- local l = nil
--- n = n + 1 t[n] = push
-- for i=1,s do
-- local entry = colorlist[i]
-- local v = colorvalues[entry.class] or default
@@ -220,11 +226,8 @@ local pop = { "pdf", "page", "Q" }
-- end
-- end
-- end
---
--- -- Here we have no color change in BT .. ET and more q Q pairs but even then acrobat
--- -- fails displaying the overlays correctly. Other renderers do it right.
-local function initialize(tfmdata,kind,value)
+local function initializeoverlay(tfmdata,kind,value)
if value then
local resources = tfmdata.resources
local palettes = resources.colorpalettes
@@ -271,54 +274,40 @@ local function initialize(tfmdata,kind,value)
local s = #colorlist
local goback = w ~= 0 and leftcommand[w] or nil -- needs checking: are widths the same
local t = {
- start, -- really needed
- not u and actualb or { "pdf", "page", (getactualtext(tounicode(u))) }
+ not u and actualb or { "pdf", "page", (getactualtext(tounicode(u))) },
+ push,
}
local n = 2
local l = nil
- local f = false
for i=1,s do
local entry = colorlist[i]
local v = colorvalues[entry.class] or default
if v and l ~= v then
- if f then
- n = n + 1 t[n] = pop
- end
- n = n + 1 t[n] = push
- f = true
n = n + 1 t[n] = v
l = v
- else
- if f then
- n = n + 1 t[n] = pop
- end
- f = false
- l = nil
end
n = n + 1 t[n] = charcommand[entry.slot]
if s > 1 and i < s and goback then
n = n + 1 t[n] = goback
end
end
- if f then
- n = n + 1 t[n] = pop
- end
+ n = n + 1 t[n] = pop
n = n + 1 t[n] = actuale
- -- n = n + 1 t[n] = stop -- not needed
character.commands = t
end
end
end
+ return true
end
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name = "colr",
description = "color glyphs",
manipulators = {
- base = initialize,
- node = initialize,
+ base = initializeoverlay,
+ node = initializeoverlay,
}
}
@@ -330,39 +319,19 @@ do
local hashed = { }
local cache = { }
- if epdf then
-
- local openpdf = epdf.openMemStream
-
- function otf.storepdfdata(pdf)
- local done = hashed[pdf]
- if not done then
- nofstreams = nofstreams + 1
- local o, n = openpdf(pdf,#pdf,f_name(nofstreams))
- cache[n] = o -- we need to keep in mem
- done = f_used(n)
- hashed[pdf] = done
- end
- return done
+ local openpdf = pdfe.new
+ ----- prefix = "data:application/pdf,"
+
+ function otf.storepdfdata(pdf)
+ local done = hashed[pdf]
+ if not done then
+ nofstreams = nofstreams + 1
+ local f = f_name(nofstreams)
+ local n = openpdf(pdf,#pdf,f)
+ done = f_used(n)
+ hashed[pdf] = done
end
-
- else
-
- local openpdf = pdfe.new
- ----- prefix = "data:application/pdf,"
-
- function otf.storepdfdata(pdf)
- local done = hashed[pdf]
- if not done then
- nofstreams = nofstreams + 1
- local f = f_name(nofstreams)
- local n = openpdf(pdf,#pdf,f)
- done = f_used(n)
- hashed[pdf] = done
- end
- return done
- end
-
+ return done
end
end
@@ -394,7 +363,6 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) -- kind = png|svg
local actuale = { "pdf", "page", e } -- saves tables
--
local vfimage = lpdf and lpdf.vfimage or function(wd,ht,dp,data,name)
- -- needed for generic (if used there at all)
local name = storepdfdata(data)
return { "image", { filename = name, width = wd, height = ht, depth = dp } }
end
@@ -402,19 +370,25 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) -- kind = png|svg
for unicode, character in sortedhash(characters) do -- sort is nicer for svg
local index = character.index
if index then
- local pdf = pdfshapes[index]
- local typ = type(pdf)
- local data = nil
- local dx = nil
- local dy = nil
+ local pdf = pdfshapes[index]
+ local typ = type(pdf)
+ local data = nil
+ local dx = nil
+ local dy = nil
+ local scale = 1
if typ == "table" then
- data = pdf.data
- dx = pdf.dx or 0
- dy = pdf.dy or 0
+ data = pdf.data
+ dx = pdf.x or pdf.dx or 0
+ dy = pdf.y or pdf.dy or 0
+ scale = pdf.scale or 1
elseif typ == "string" then
data = pdf
dx = 0
dy = 0
+ elseif typ == "number" then
+ data = pdf
+ dx = 0
+ dy = 0
end
if data then
-- We can delay storage by a lua function in commands: but then we need to
@@ -424,12 +398,20 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) -- kind = png|svg
local wd = character.width or 0
local ht = character.height or 0
local dp = character.depth or 0
- -- The down and right will change too (we can move that elsewhere).
+ -- The down and right will change too (we can move that elsewhere). We have
+ -- a different treatment in lmtx but the next kind of works. These images are
+ -- a mess anyway as in svg the bbox can be messed up absent). A png image
+ -- needs the x/y. I might normalize this once we move to lmtx exlusively.
character.commands = {
not unicode and actualb or { "pdf", "page", (getactualtext(unicode)) },
- downcommand[dp + dy * hfactor],
- rightcommand[dx * hfactor],
- vfimage(wd,ht,dp,data,name),
+ -- lmtx (when we deal with depth in vfimage, currently disabled):
+ -- downcommand [dy * hfactor],
+ -- rightcommand[dx * hfactor],
+ -- vfimage(wd,ht,dp,data,name),
+ -- mkiv
+ downcommand [dp + dy * hfactor],
+ rightcommand[ dx * hfactor],
+ vfimage(scale*wd,ht,dp,data,pdfshapes.filename or ""),
actuale,
}
character[kind] = true
@@ -456,6 +438,8 @@ do
local xmlfirst = xml.first
function otfsvg.filterglyph(entry,index)
+ -- we only support decompression in lmtx, so one needs to wipe the
+ -- cache when invalid xml is reported
local svg = xmlconvert(entry.data)
local root = svg and xmlfirst(svg,"/svg[@id='glyph"..index.."']")
local data = root and tostring(root)
@@ -475,7 +459,7 @@ do
name = "otfsvg",
program = "inkscape",
method = "pipeto",
- template = "--shell > temp-otf-svg-shape.log",
+ template = "--export-area-drawing --shell > temp-otf-svg-shape.log",
reporter = report_svg,
}
@@ -484,20 +468,31 @@ do
-- poor mans variant for generic:
--
runner = function()
- return io.open("inkscape --shell > temp-otf-svg-shape.log","w")
+ return io.popen("inkscape --export-area-drawing --shell > temp-otf-svg-shape.log","w")
end
end
- function otfsvg.topdf(svgshapes)
+ -- There are svg out there with bad viewBox specifications where shapes lay outside that area,
+ -- but trying to correct that didn't work out well enough so I discarded that code. BTW, we
+ -- decouple the inskape run and the loading run because inkscape is working in the background
+ -- in the files so we need to have unique files.
+ --
+ -- Because a generic setup can be flawed we need to catch bad inkscape runs which add a bit of
+ -- ugly overhead. Bah.
+
+ function otfsvg.topdf(svgshapes,tfmdata)
local pdfshapes = { }
local inkscape = runner()
if inkscape then
- local nofshapes = #svgshapes
- local f_svgfile = formatters["temp-otf-svg-shape-%i.svg"]
- local f_pdffile = formatters["temp-otf-svg-shape-%i.pdf"]
- local f_convert = formatters["%s --export-pdf=%s\n"]
- local filterglyph = otfsvg.filterglyph
- local nofdone = 0
+ -- local indices = fonts.getindices(tfmdata)
+ local descriptions = tfmdata.descriptions
+ local nofshapes = #svgshapes
+ local f_svgfile = formatters["temp-otf-svg-shape-%i.svg"]
+ local f_pdffile = formatters["temp-otf-svg-shape-%i.pdf"]
+ local f_convert = formatters["%s --export-pdf=%s\n"]
+ local filterglyph = otfsvg.filterglyph
+ local nofdone = 0
+ local processed = { }
report_svg("processing %i svg containers",nofshapes)
statistics.starttiming()
for i=1,nofshapes do
@@ -509,24 +504,55 @@ do
local pdffile = f_pdffile(index)
savedata(svgfile,data)
inkscape:write(f_convert(svgfile,pdffile))
- pdfshapes[index] = true
+ processed[index] = true
nofdone = nofdone + 1
- if nofdone % 100 == 0 then
- report_svg("%i shapes processed",nofdone)
+ if nofdone % 25 == 0 then
+ report_svg("%i shapes submitted",nofdone)
end
end
end
end
+ if nofdone % 25 ~= 0 then
+ report_svg("%i shapes submitted",nofdone)
+ end
+ report_svg("processing can be going on for a while")
inkscape:write("quit\n")
inkscape:close()
report_svg("processing %i pdf results",nofshapes)
- for index in next, pdfshapes do
+ for index in next, processed do
local svgfile = f_svgfile(index)
local pdffile = f_pdffile(index)
- pdfshapes[index] = loaddata(pdffile)
+ -- local fntdata = descriptions[indices[index]]
+ -- local bounds = fntdata and fntdata.boundingbox
+ local pdfdata = loaddata(pdffile)
+ if pdfdata and pdfdata ~= "" then
+ pdfshapes[index] = {
+ data = pdfdata,
+ -- x = bounds and bounds[1] or 0,
+ -- y = bounds and bounds[2] or 0,
+ }
+ end
remove(svgfile)
remove(pdffile)
end
+ local characters = tfmdata.characters
+ for k, v in next, characters do
+ local d = descriptions[k]
+ local i = d.index
+ if i then
+ local p = pdfshapes[i]
+ if p then
+ local w = d.width
+ local l = d.boundingbox[1]
+ local r = d.boundingbox[3]
+ p.scale = (r - l) / w
+ p.x = l
+ end
+ end
+ end
+ if not next(pdfshapes) then
+ report_svg("there are no converted shapes, fix your setup")
+ end
statistics.stoptiming()
if statistics.elapsedseconds then
report_svg("svg conversion time %s",statistics.elapsedseconds() or "-")
@@ -547,20 +573,23 @@ local function initializesvg(tfmdata,kind,value) -- hm, always value
end
local pdffile = containers.read(otf.pdfcache,hash)
local pdfshapes = pdffile and pdffile.pdfshapes
- if not pdfshapes or pdffile.timestamp ~= timestamp then
+ if not pdfshapes or pdffile.timestamp ~= timestamp or not next(pdfshapes) then
+ -- the next test tries to catch errors in generic usage but of course can result
+ -- in running again and again
local svgfile = containers.read(otf.svgcache,hash)
local svgshapes = svgfile and svgfile.svgshapes
- pdfshapes = svgshapes and otfsvg.topdf(svgshapes) or { }
+ pdfshapes = svgshapes and otfsvg.topdf(svgshapes,tfmdata,otf.pdfcache.writable,hash) or { }
containers.write(otf.pdfcache, hash, {
pdfshapes = pdfshapes,
timestamp = timestamp,
})
end
pdftovirtual(tfmdata,pdfshapes,"svg")
+ return true
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name = "svg",
description = "svg glyphs",
manipulators = {
@@ -668,10 +697,11 @@ local function initializepng(tfmdata,kind,value) -- hm, always value
end
--
pdftovirtual(tfmdata,pdfshapes,"png")
+ return true
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name = "sbix",
description = "sbix glyphs",
manipulators = {
@@ -680,7 +710,7 @@ fonts.handlers.otf.features.register {
}
}
-fonts.handlers.otf.features.register {
+otfregister {
name = "cblc",
description = "cblc glyphs",
manipulators = {
@@ -688,3 +718,36 @@ fonts.handlers.otf.features.register {
node = initializepng,
}
}
+
+if context then
+
+ -- untested in generic and might clash with other color trickery
+ -- anyway so let's stick to context only
+
+ local function initializecolor(tfmdata,kind,value)
+ if value == "auto" then
+ return
+ initializeoverlay(tfmdata,kind,value) or
+ initializesvg(tfmdata,kind,value) or
+ initializepng(tfmdata,kind,value)
+ elseif value == "overlay" then
+ return initializeoverlay(tfmdata,kind,value)
+ elseif value == "svg" then
+ return initializesvg(tfmdata,kind,value)
+ elseif value == "png" or value == "bitmap" then
+ return initializepng(tfmdata,kind,value)
+ else
+ -- forget about it
+ end
+ end
+
+ otfregister {
+ name = "color",
+ description = "color glyphs",
+ manipulators = {
+ base = initializecolor,
+ node = initializecolor,
+ }
+ }
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-off.lua b/Master/texmf-dist/tex/context/base/mkiv/font-off.lua
deleted file mode 100644
index 7e509c2c3d7..00000000000
--- a/Master/texmf-dist/tex/context/base/mkiv/font-off.lua
+++ /dev/null
@@ -1,230 +0,0 @@
-if not modules then modules = { } end modules ['font-off'] = {
- version = 1.001,
- comment = "companion to font-ini.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local tonumber = tonumber
-local lower = string.lower
-local round = math.round
-local setmetatableindex = table.setmetatableindex
-
-local fontloader = fontloader
------ font_to_table = fontloader.to_table
-local open_font = fontloader.open
------ get_font_info = fontloader.info
-local close_font = fontloader.close
------ font_fields = fontloader.fields
-
--- table={
--- ["familyname"]="TeXGyrePagella",
--- ["fontname"]="TeXGyrePagella-Regular",
--- ["fullname"]="TeXGyrePagella-Regular",
--- ["italicangle"]=0,
--- ["names"]={
--- {
--- ["lang"]="English (US)",
--- ["names"]={
--- ["copyright"]="Copyright 2006, 2009 for TeX Gyre extensions by B. Jackowski and J.M. Nowacki (on behalf of TeX users groups). This work is released under the GUST Font License -- see http://tug.org/fonts/licenses/GUST-FONT-LICENSE.txt for details.",
--- ["family"]="TeXGyrePagella",
--- ["fullname"]="TeXGyrePagella-Regular",
--- ["postscriptname"]="TeXGyrePagella-Regular",
--- ["preffamilyname"]="TeX Gyre Pagella",
--- ["subfamily"]="Regular",
--- ["trademark"]="Please refer to the Copyright section for the font trademark attribution notices.",
--- ["uniqueid"]="2.004;UKWN;TeXGyrePagella-Regular",
--- ["version"]="Version 2.004;PS 2.004;hotconv 1.0.49;makeotf.lib2.0.14853",
--- },
--- },
--- },
--- ["pfminfo"]={
--- ["avgwidth"]=528,
--- ["codepages"]={ 536871315, 0 },
--- ["firstchar"]=32,
--- ["fstype"]=12,
--- ["hhead_ascent"]=1098,
--- ["hhead_descent"]=-283,
--- ["hheadascent_add"]=0,
--- ["hheaddescent_add"]=0,
--- ["hheadset"]=1,
--- ["lastchar"]=64260,
--- ["linegap"]=0,
--- ["os2_breakchar"]=32,
--- ["os2_capheight"]=692,
--- ["os2_defaultchar"]=0,
--- ["os2_family_class"]=0,
--- ["os2_strikeypos"]=269,
--- ["os2_strikeysize"]=50,
--- ["os2_subxoff"]=0,
--- ["os2_subxsize"]=650,
--- ["os2_subyoff"]=75,
--- ["os2_subysize"]=600,
--- ["os2_supxoff"]=0,
--- ["os2_supxsize"]=650,
--- ["os2_supyoff"]=350,
--- ["os2_supysize"]=600,
--- ["os2_typoascent"]=726,
--- ["os2_typodescent"]=-274,
--- ["os2_typolinegap"]=200,
--- ["os2_vendor"]="UKWN",
--- ["os2_winascent"]=1098,
--- ["os2_windescent"]=283,
--- ["os2_xheight"]=449,
--- ["panose"]={
--- ["armstyle"]="Any",
--- ["contrast"]="Any",
--- ["familytype"]="Any",
--- ["letterform"]="Any",
--- ["midline"]="Any",
--- ["proportion"]="Any",
--- ["serifstyle"]="Any",
--- ["strokevariation"]="Any",
--- ["weight"]="Book",
--- ["xheight"]="Any",
--- },
--- ["panose_set"]=1,
--- ["pfmfamily"]=81,
--- ["pfmset"]=1,
--- ["subsuper_set"]=1,
--- ["typoascent_add"]=0,
--- ["typodescent_add"]=0,
--- ["unicoderanges"]={ 536871047, 0, 0, 0 },
--- ["vheadset"]=0,
--- ["vlinegap"]=0,
--- ["weight"]=400,
--- ["width"]=5,
--- ["winascent_add"]=0,
--- ["windescent_add"]=0,
--- },
--- ["units_per_em"]=1000,
--- ["version"]="2.004;PS 2.004;hotconv 1.0.49;makeotf.lib2.0.14853",
--- ["weight"]="Book",
--- }
-
--- We had this as temporary solution because we needed a bit more info but in the
--- meantime it got an interesting side effect: currently luatex delays loading of e.g.
--- glyphs so here we first load and then discard which is a waste. In the past it did
--- free memory because a full load was done. One of these things that goes unnoticed.
---
--- local function get_full_info(...) -- check with taco what we get / could get
--- local ff = open_font(...)
--- if ff then
--- local d = ff -- and font_to_table(ff)
--- d.glyphs, d.subfonts, d.gpos, d.gsub, d.lookups = nil, nil, nil, nil, nil
--- close_font(ff)
--- return d
--- else
--- return nil, "error in loading font"
--- end
--- end
-
--- Phillip suggested this faster variant but it's still a hack as fontloader.info should
--- return these keys/values (and maybe some more) but at least we close the loader which
--- might save some memory in the end.
-
--- local function get_full_info(name)
--- local ff = open_font(name)
--- if ff then
--- local fields = table.tohash(font_fields(ff),true) -- isn't that one stable
--- local d = {
--- names = fields.names and ff.names,
--- familyname = fields.familyname and ff.familyname,
--- fullname = fields.fullname and ff.fullname,
--- fontname = fields.fontname and ff.fontname,
--- weight = fields.weight and ff.weight,
--- italicangle = fields.italicangle and ff.italicangle,
--- units = fields.units_per_em and ff.units_per_em,
--- designsize = fields.design_size and ff.design_size,
--- minsize = fields.design_range_bottom and ff.design_range_bottom,
--- maxsize = fields.design_range_top and ff.design_range_top,
--- italicangle = fields.italicangle and ff.italicangle,
--- pfmweight = pfminfo and pfminfo.weight or 400,
--- pfmwidth = pfminfo and pfminfo.width or 5,
--- }
--- -- setmetatableindex(d,function(t,k)
--- -- report_names("warning, trying to access field %a in font table of %a",k,name)
--- -- end)
--- close_font(ff)
--- return d
--- else
--- return nil, "error in loading font"
--- end
--- end
-
--- more efficient:
-
-local fields = nil
-
-local function check_names(names)
- if names then
- for i=1,#names do
- local name = names[i]
- if lower(name.lang) == "english (us)" then -- lower added
- return name.names
- end
- end
- end
-end
-
-local function get_full_info(name)
- local ff = open_font(name)
- if ff then
- -- unfortunately luatex aborts when a field is not available but we just make
- -- sure that we only access a few known ones
- local pfminfo = ff.pfminfo or { }
- local names = check_names(ff.names) or { }
- local weight = names.weight or ff.weight
- local width = names.width -- no: ff.width
- local d = {
- fontname = ff.fontname,
- fullname = names.fullname or ff.fullname,
- family = names.family,
- subfamily = names.subfamily,
- familyname = names.preffamilyname or names.family or ff.familyname,
- subfamilyname = names.prefmodifiers or names.subfamily,
- weight = weight and lower(weight),
- width = width and lower(width),
- italicangle = round(1000*(tonumber(ff.italicangle) or 0))/1000 or 0,
- units = ff.units_per_em,
- designsize = ff.design_size,
- minsize = ff.design_range_bottom,
- maxsize = ff.design_range_top,
- pfmweight = pfminfo.weight or 400,
- pfmwidth = pfminfo.width or 5,
- monospaced = pfminfo.panose and pfminfo.panose.proportion == "Monospaced",
- }
- close_font(ff)
- return d
- else
- return nil, "error in loading font"
- end
-end
-
--- As we have lazy loading anyway, this one still is full and with less code than
--- the previous one. But this depends on the garbage collector to kick in and in the
--- current version that somehow happens not that often (on my machine I end up with
--- some 3 GB extra before that happens).
-
--- local function get_full_info(...)
--- local ff = open_font(...)
--- if ff then
--- local d = { } -- ff is userdata so [1] or # fails on it
--- setmetatableindex(d,ff)
--- return d -- garbage collection will do the close_font(ff)
--- else
--- return nil, "error in loading font"
--- end
--- end
-
-fonts = fonts or { }
-local handlers = fonts.handlers or { }
-fonts.handlers = handlers
-local otf = handlers.otf or { }
-handlers.otf = otf
-local readers = otf.readers or { }
-otf.readers = readers
-
-fontloader.fullinfo = get_full_info
-readers.getinfo = readers.getinfo or get_full_info
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-ogr.lua b/Master/texmf-dist/tex/context/base/mkiv/font-ogr.lua
new file mode 100644
index 00000000000..b45728c6cc1
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-ogr.lua
@@ -0,0 +1,670 @@
+if not modules then modules = { } end modules ['font-ogr'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Here we deal with graphic variants and for now also color support ends up here
+-- but that might change. It's lmtx only code.
+
+if not context then
+ return
+elseif CONTEXTLMTXMODE == 0 then
+ return
+end
+
+local tostring, tonumber, next, type = tostring, tonumber, next, type
+local round, max, mod, div = math.round, math.max, math.mod, math.div
+local find = string.find
+local concat, setmetatableindex, sortedhash = table.concat, table.setmetatableindex, table.sortedhash
+local utfbyte = utf.byte
+local formatters = string.formatters
+local settings_to_hash_strict, settings_to_array = utilities.parsers.settings_to_hash_strict, utilities.parsers.settings_to_array
+
+local otf = fonts.handlers.otf
+local otfregister = otf.features.register
+otf.svgenabled = true
+otf.pngenabled = true
+
+-- Just to remind me ... rewritten around the time this was posted on YT which
+-- was also around the 2019 ctx meeting:
+--
+-- Gavin Harrison - "Threatening War" by The Pineapple Thief
+-- https://www.youtube.com/watch?v=ENF9wth4kwM
+
+-- todo: svg color plugin
+-- todo: get rid of double cm in svg (tricky as also elsewhere)
+-- todo: png offsets (depth)
+-- todo: maybe collapse indices so that we have less files (harder to debug)
+-- todo: manage (read: assign) font id's in lua so we know in advance
+
+-- what here and what in backend ...
+
+do
+
+ -- This is a prelude to something better but I'm still experimenting.
+
+ local dropins = { }
+ fonts.dropins = dropins
+ local droppedin = 0
+ local identifiers = fonts.hashes.identifiers
+
+ function dropins.nextid()
+ droppedin = droppedin - 1
+ return droppedin
+ end
+
+ -- todo: pass specification table instead
+
+ function dropins.provide(method,t_tfmdata,indexdata,...)
+ local droppedin = dropins.nextid()
+ local t_characters = t_tfmdata.characters
+ local t_descriptions = t_tfmdata.descriptions
+ local t_properties = t_tfmdata.properties
+ local d_tfmdata = setmetatableindex({ },t_tfmdata)
+ local d_properties = setmetatableindex({ },t_properties)
+ d_tfmdata.properties = d_properties
+ local d_characters = { } -- setmetatableindex({ },t_characters) -- hm, index vs unicode
+ local d_descriptions = { } -- setmetatableindex({ },t_descriptions) -- hm, index vs unicode
+ d_tfmdata.characters = d_characters
+ d_tfmdata.descriptions = d_descriptions
+ d_properties.instance = - droppedin -- will become an extra element in the hash
+ t_properties.virtualized = true
+ identifiers[droppedin] = d_tfmdata
+ local fonts = t_tfmdata.fonts or { }
+ t_tfmdata.fonts = fonts
+ d_properties.format = "type3"
+ d_properties.method = method
+ d_properties.indexdata = { indexdata, ... } -- can take quite some memory
+ local slot = #fonts + 1
+ fonts[slot] = { id = droppedin }
+ return slot, droppedin, d_tfmdata, d_properties
+ end
+
+ function dropins.clone(method,tfmdata,shapes,...) -- by index
+ if method and shapes then
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local droppedin, tfmdrop, dropchars, dropdescs, colrshapes
+ local idx = 255
+ local slot = 0
+ for k, v in next, characters do
+ local index = v.index
+ if index then
+ local description = descriptions[k]
+ if description then
+ local shape = shapes[index]
+ if shape then
+ if idx >= 255 then
+ idx = 1
+ colrshapes = setmetatableindex({ },shapes)
+ slot, droppedin, tfmdrop = dropins.provide(method,tfmdata,colrshapes)
+ dropchars = tfmdrop.characters
+ dropdescs = tfmdrop.descriptions
+ else
+ idx = idx + 1
+ end
+ colrshapes[idx] = shape -- so not: description
+ -- todo: prepend
+ v.commands = { { "slot", slot, idx } }
+ -- hack to prevent that type 3 also gets 'use' flags .. todo
+ local c = { commands = false, index = idx, dropin = tfmdrop }
+ local d = { } -- { index = idx, dropin = tfmdrop }
+ setmetatableindex(c,v)
+ setmetatableindex(d,description)
+ dropchars[idx] = c
+ dropdescs[idx] = d -- not needed
+ end
+ end
+ end
+ end
+ else
+ -- error
+ end
+ end
+
+ function dropins.swap(method,tfmdata,shapes,...) -- by unicode
+ if method and shapes then
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local droppedin, tfmdrop, dropchars, dropdescs, colrshapes
+ local idx = 255
+ local slot = 0
+ -- we can have a variant where shaped are by unicode and not by index
+ for k, v in next, characters do
+ local description = descriptions[k]
+ if description then
+ local shape = shapes[k]
+ if shape then
+ if idx >= 255 then
+ idx = 1
+ colrshapes = setmetatableindex({ },shapes)
+ slot, droppedin, tfmdrop = dropins.provide(method,tfmdata,colrshapes)
+ dropchars = tfmdrop.characters
+ dropdescs = tfmdrop.descriptions
+ else
+ idx = idx + 1
+ end
+ colrshapes[idx] = shape -- so not: description
+ -- todo: prepend
+ v.commands = { { "slot", slot, idx } }
+ -- hack to prevent that type 3 also gets 'use' flags .. todo
+ local c = { commands = false, index = idx, dropin = tfmdrop }
+ local d = { } -- index = idx, dropin = tfmdrop }
+ setmetatableindex(c,v)
+ setmetatableindex(d,description)
+ dropchars[idx] = c
+ dropdescs[idx] = d -- not needed
+ end
+ end
+ end
+ else
+ -- error
+ end
+ end
+
+end
+
+do -- this will move to its own module
+
+ local dropins = fonts.dropins
+
+ local shapes = setmetatableindex(function(t,k)
+ local v = {
+ glyphs = { },
+ parameters = {
+ units = 1000
+ },
+ }
+ t[k] = v
+ return v
+ end)
+
+ function dropins.registerglyphs(parameters)
+ local category = parameters.name
+ local target = shapes[category].parameters
+ for k, v in next, parameters do
+ if k ~= "glyphs" then
+ target[k] = v
+ end
+ end
+ end
+
+ function dropins.registerglyph(parameters)
+ local category = parameters.category
+ local unicode = parameters.unicode
+ local private = parameters.private
+ local unichar = parameters.unichar
+ if private then
+ unicode = fonts.helpers.newprivateslot(private)
+ elseif type(unichar) == "string" then
+ unicode = utfbyte(unichar)
+ else
+ local unitype = type(unicode)
+ if unitype == "string" then
+ local uninumber = tonumber(unicode)
+ if uninumber then
+ unicode = round(uninumber)
+ else
+ unicode = utfbyte(unicode)
+ end
+ elseif unitype == "number" then
+ unicode = round(unicode)
+ end
+ end
+ if unicode then
+ parameters.unicode = unicode
+ -- print(category,unicode)
+ shapes[category].glyphs[unicode] = parameters
+ else
+ -- error
+ end
+ end
+
+ -- local function hascolorspec(t)
+ -- if (t.color or "") ~= "" then
+ -- return true
+ -- elseif (t.fillcolor or "") ~= "" then
+ -- return true
+ -- elseif (t.drawcolor or "") ~= "" then
+ -- return true
+ -- elseif (t.linecolor or "") ~= "" then
+ -- return true
+ -- else
+ -- return false
+ -- end
+ -- end
+
+ local function hascolorspec(t)
+ for k, v in next, t do
+ if find(k,"color") then
+ return true
+ end
+ end
+ return false
+ end
+
+ local function initializemps(tfmdata,kind,value)
+ if value then
+ local specification = settings_to_hash_strict(value)
+ if not specification or not next(specification) then
+ specification = { category = value }
+ end
+ -- todo: multiple categories but then maybe also different
+ -- clones because of the units .. for now we assume the same
+ -- units
+ local category = specification.category
+ if category and category ~= "" then
+ local categories = settings_to_array(category)
+ local usedshapes = nil
+ local index = 0
+ local spread = tonumber(specification.spread or 0)
+ local hascolor = hascolorspec(specification)
+ specification.spread = spread -- now a number
+ for i=1,#categories do
+ local category = categories[i]
+ local mpsshapes = shapes[category]
+ if mpsshapes then
+ local properties = tfmdata.properties
+ local parameters = tfmdata.parameters
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local mpsparameters = mpsshapes.parameters
+ local units = mpsparameters.units or 1000
+ local defaultwidth = mpsparameters.width or 0
+ local defaultheight = mpsparameters.height or 0
+ local defaultdepth = mpsparameters.depth or 0
+ local usecolor = mpsparameters.usecolor
+ local spread = spread * units
+ local defaultcode = mpsparameters.code or ""
+ local scale = parameters.size / units
+ if hascolor then
+ -- the graphic has color
+ usecolor = false
+ else
+ -- do whatever is specified
+ end
+ usedshapes = usedshapes or {
+ instance = "simplefun",
+ units = units,
+ usecolor = usecolor,
+ specification = specification,
+ shapes = mpsshapes,
+ }
+ -- todo: deal with extensibles and more properties
+ for unicode, shape in sortedhash(mpsshapes.glyphs) do
+ -- local oldc = characters[unicode]
+ -- if oldc then
+ index = index + 1 -- todo: somehow we end up with 2 as first entry after 0
+ local wd = shape.width or defaultwidth
+ local ht = shape.height or defaultheight
+ local dp = shape.depth or defaultdepth
+ local newc = {
+ index = index, -- into usedshapes
+ width = scale * (wd + spread),
+ height = scale * ht,
+ depth = scale * dp,
+ unicode = unicode,
+ }
+ --
+ characters [unicode] = newc
+ descriptions[unicode] = newc
+ --
+ usedshapes[unicode] = shape.code or defaultcode
+ -- end
+ end
+ end
+ end
+ if usedshapes then
+ -- todo: different font when units and usecolor changes, maybe move into loop
+ -- above
+ dropins.swap("mps",tfmdata,usedshapes)
+ end
+ end
+ end
+ end
+
+ -- This kicks in quite late, after features have been checked. So if needed
+ -- substitutions need to be defined with force.
+
+ otfregister {
+ name = "metapost",
+ description = "metapost glyphs",
+ manipulators = {
+ base = initializemps,
+ node = initializemps,
+ }
+ }
+
+end
+
+-- This sits here for historcal reasons so for now we keep it here.
+
+local startactualtext = nil
+local stopactualtext = nil
+
+function otf.getactualtext(s)
+ if not startactualtext then
+ startactualtext = backends.codeinjections.startunicodetoactualtextdirect
+ stopactualtext = backends.codeinjections.stopunicodetoactualtextdirect
+ end
+ return startactualtext(s), stopactualtext()
+end
+
+-- This is also somewhat specific.
+
+local sharedpalettes do
+
+ sharedpalettes = { }
+
+ local colors = attributes.list[attributes.private('color')] or { }
+ local transparencies = attributes.list[attributes.private('transparency')] or { }
+
+ function otf.registerpalette(name,values)
+ sharedpalettes[name] = values
+ local color = lpdf.color
+ local transparency = lpdf.transparency
+ local register = colors.register
+ for i=1,#values do
+ local v = values[i]
+ if v == "textcolor" then
+ values[i] = false
+ else
+ local c = nil
+ local t = nil
+ if type(v) == "table" then
+ c = register(name,"rgb",
+ max(round((v.r or 0)*255),255)/255,
+ max(round((v.g or 0)*255),255)/255,
+ max(round((v.b or 0)*255),255)/255
+ )
+ else
+ c = colors[v]
+ t = transparencies[v]
+ end
+ if c and t then
+ values[i] = color(1,c) .. " " .. transparency(t)
+ elseif c then
+ values[i] = color(1,c)
+ elseif t then
+ values[i] = color(1,t)
+ end
+ end
+ end
+ end
+
+end
+
+local initializeoverlay do
+
+ -- we should use the proper interface instead but for now:
+
+ local colors = attributes.colors
+ local rgbtocmyk = colors.rgbtocmyk
+
+ local f_cmyk = formatters["%.3N %.3f %.3N %.3N k"]
+ local f_rgb = formatters["%.3N %.3f %.3N rg"]
+ local f_gray = formatters["%.3N g"]
+
+ local function convert(t,k)
+ local v = { }
+ local m = colors.model
+ for i=1,#k do
+ local p = k[i]
+ local r, g, b = p[1]/255, p[2]/255, p[3]/255
+ if r == g and g == b then
+ p = f_gray(r)
+ elseif m == "cmyk" then
+ p = f_cmyk(rgbtocmyk(r,g,b))
+ else
+ p = f_rgb(r,g,b)
+ end
+ v[i] = p
+ end
+ t[k] = v
+ return v
+ end
+
+ initializeoverlay = function(tfmdata,kind,value) -- we really need the id ... todo
+ if value then
+ local resources = tfmdata.resources
+ local palettes = resources.colorpalettes
+ if palettes then
+ --
+ local converted = resources.converted
+ if not converted then
+ converted = setmetatableindex(convert)
+ resources.converted = converted
+ end
+ local colorvalues = sharedpalettes[value]
+ local default = false -- so the text color (bad for icon overloads)
+ if colorvalues then
+ default = colorvalues[#colorvalues]
+ else
+ colorvalues = converted[palettes[tonumber(value) or 1] or palettes[1]] or { }
+ end
+ local classes = #colorvalues
+ if classes == 0 then
+ return
+ end
+ --
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local droppedin, tfmdrop, dropchars, dropdescs, colrshapes
+ local idx = 255
+ local slot = 0
+ --
+ -- todo: delay
+ --
+ for k, v in next, characters do
+ local index = v.index
+ if index then
+ local description = descriptions[k]
+ if description then
+ local colorlist = description.colors
+ if colorlist then
+ if idx >= 255 then
+ idx = 1
+ colrshapes = { }
+ slot, droppedin, tfmdrop = fonts.dropins.provide("color",tfmdata,colrshapes,colorvalues)
+ dropchars = tfmdrop.characters
+ dropdescs = tfmdrop.descriptions
+ else
+ idx = idx + 1
+ end
+ --
+ colrshapes[idx] = description
+ -- todo: use extender
+ local u = { "use", 0 }
+ for i=1,#colorlist do
+ u[i+2] = colorlist[i].slot
+ end
+ v.commands = { u, { "slot", slot, idx } }
+ -- hack to prevent that type 3 also gets 'use' flags .. todo
+ local c = { commands = false, index = idx, dropin = tfmdata }
+ local d = { } -- index = idx, dropin = tfmdrop
+ setmetatableindex(c,v)
+ setmetatableindex(d,description)
+ dropchars[idx] = c
+ dropdescs[idx] = d -- not needed
+ end
+ end
+ end
+ end
+ return true
+ end
+ end
+ end
+
+ fonts.handlers.otf.features.register {
+ name = "colr",
+ description = "color glyphs",
+ manipulators = {
+ base = initializeoverlay,
+ node = initializeoverlay,
+ }
+ }
+
+end
+
+local initializesvg do
+
+ local report_svg = logs.reporter("fonts","svg")
+
+ local cached = true -- maybe always false (after i've optimized the lot)
+
+ directives.register("fonts.svg.cached", function(v) cached = v end)
+
+ initializesvg = function(tfmdata,kind,value) -- hm, always value
+ if value then
+ local properties = tfmdata.properties
+ local svg = properties.svg
+ local hash = svg and svg.hash
+ local timestamp = svg and svg.timestamp
+ if not hash then
+ return
+ end
+ local shapes = nil
+ local method = nil
+ local enforce = attributes.colors.model == "cmyk"
+ if cached and not enforce then
+ -- we need a different hash than for mkiv, so we append:
+ local pdfhash = hash .. "-svg"
+ local pdffile = containers.read(otf.pdfcache,pdfhash)
+ local pdfshapes = pdffile and pdffile.pdfshapes
+ local pdftarget = file.join(otf.pdfcache.writable,file.addsuffix(pdfhash,"pdf"))
+ if not pdfshapes or pdffile.timestamp ~= timestamp or not next(pdfshapes) or not lfs.isfile(pdftarget) then
+ local svgfile = containers.read(otf.svgcache,hash)
+ local svgshapes = svgfile and svgfile.svgshapes
+ pdfshapes = svgshapes and metapost.svgshapestopdf(svgshapes,pdftarget,report_svg,tfmdata.parameters.units) or { }
+ -- look at ocl: we should store scale and x and y
+ containers.write(otf.pdfcache, pdfhash, {
+ pdfshapes = pdfshapes,
+ timestamp = timestamp,
+ })
+ end
+ shapes = pdfshapes
+ method = "pdf"
+ else
+ local mpsfile = containers.read(otf.mpscache,hash)
+ local mpsshapes = mpsfile and mpsfile.mpsshapes
+ if not mpsshapes or mpsfile.timestamp ~= timestamp or not next(mpsshapes) then
+ local svgfile = containers.read(otf.svgcache,hash)
+ local svgshapes = svgfile and svgfile.svgshapes
+ -- still suboptimal
+ mpsshapes = svgshapes and metapost.svgshapestomp(svgshapes,report_svg,tfmdata.parameters.units) or { }
+ if enforce then
+ -- cheap conversion, no black component generation
+ mpsshapes.preamble = "interim svgforcecmyk := 1;"
+ end
+ containers.write(otf.mpscache, hash, {
+ mpsshapes = mpsshapes,
+ timestamp = timestamp,
+ })
+ end
+ shapes = mpsshapes
+ method = "mps"
+ end
+ if shapes then
+ shapes.fixdepth = value == "fixdepth"
+ fonts.dropins.clone(method,tfmdata,shapes)
+ end
+ return true
+ end
+ end
+
+ otfregister {
+ name = "svg",
+ description = "svg glyphs",
+ manipulators = {
+ base = initializesvg,
+ node = initializesvg,
+ }
+ }
+
+end
+
+local initializepng do
+
+ -- If this is really critical we can also use a pdf file as cache but I don't expect
+ -- png fonts to remain used.
+
+ local colors = attributes.colors
+
+ local report_png = logs.reporter("fonts","png conversion")
+
+ initializepng = function(tfmdata,kind,value) -- hm, always value
+ if value then
+ local properties = tfmdata.properties
+ local png = properties.png
+ local hash = png and png.hash
+ local timestamp = png and png.timestamp
+ if not hash then
+ return
+ end
+ local pngfile = containers.read(otf.pngcache,hash)
+ local pngshapes = pngfile and pngfile.pngshapes
+ if pngshapes then
+ if colors.model == "cmyk" then
+ pngshapes.enforcecmyk = true
+ end
+ fonts.dropins.clone("png",tfmdata,pngshapes)
+ end
+ return true
+ end
+ end
+
+ otfregister {
+ name = "sbix",
+ description = "sbix glyphs",
+ manipulators = {
+ base = initializepng,
+ node = initializepng,
+ }
+ }
+
+ otfregister {
+ name = "cblc",
+ description = "cblc glyphs",
+ manipulators = {
+ base = initializepng,
+ node = initializepng,
+ }
+ }
+
+end
+
+do
+
+ -- I need to check jpeg and such but will do that when I run into
+ -- it.
+
+ local function initializecolor(tfmdata,kind,value)
+ if value == "auto" then
+ return
+ initializeoverlay(tfmdata,kind,value) or
+ initializesvg(tfmdata,kind,value) or
+ initializepng(tfmdata,kind,value)
+ elseif value == "overlay" then
+ return initializeoverlay(tfmdata,kind,value)
+ elseif value == "svg" then
+ return initializesvg(tfmdata,kind,value)
+ elseif value == "png" or value == "bitmap" then
+ return initializepng(tfmdata,kind,value)
+ else
+ -- forget about it
+ end
+ end
+
+ otfregister {
+ name = "color",
+ description = "color glyphs",
+ manipulators = {
+ base = initializecolor,
+ node = initializecolor,
+ }
+ }
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-one.lua b/Master/texmf-dist/tex/context/base/mkiv/font-one.lua
index 9b296cac551..5387516b4d5 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-one.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-one.lua
@@ -483,8 +483,9 @@ local function copytotfm(data)
local filename = constructors.checkedfilename(resources)
local fontname = metadata.fontname or metadata.fullname
local fullname = metadata.fullname or metadata.fontname
- local endash = 0x0020 -- space
+ local endash = 0x2013
local emdash = 0x2014
+ local space = 0x0020 -- space
local spacer = "space"
local spaceunits = 500
--
@@ -496,28 +497,33 @@ local function copytotfm(data)
parameters.italicangle = italicangle
parameters.charwidth = charwidth
parameters.charxheight = charxheight
- -- same as otf
+ -- nearly the same as otf, catches
+ local d_endash = descriptions[endash]
+ local d_emdash = descriptions[emdash]
+ local d_space = descriptions[space]
+ if not d_space or d_space == 0 then
+ d_space = d_endash
+ end
+ if d_space then
+ spaceunits, spacer = d_space.width or 0, "space"
+ end
if properties.monospaced then
- if descriptions[endash] then
- spaceunits, spacer = descriptions[endash].width, "space"
- end
- if not spaceunits and descriptions[emdash] then
- spaceunits, spacer = descriptions[emdash].width, "emdash"
- end
- if not spaceunits and charwidth then
- spaceunits, spacer = charwidth, "charwidth"
+ if spaceunits == 0 and d_emdash then
+ spaceunits, spacer = d_emdash.width or 0, "emdash"
end
else
- if descriptions[endash] then
- spaceunits, spacer = descriptions[endash].width, "space"
- end
- if not spaceunits and charwidth then
- spaceunits, spacer = charwidth, "charwidth"
+ if spaceunits == 0 and d_endash then
+ spaceunits, spacer = d_emdash.width or 0, "endash"
end
end
- spaceunits = tonumber(spaceunits)
- if spaceunits < 200 then
- -- todo: warning
+ if spaceunits == 0 and charwidth then
+ spaceunits, spacer = charwidth or 0, "charwidth"
+ end
+ if spaceunits == 0 then
+ spaceunits = tonumber(spaceunits) or 500
+ end
+ if spaceunits == 0 then
+ spaceunits = 500
end
--
parameters.slant = 0
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-onr.lua b/Master/texmf-dist/tex/context/base/mkiv/font-onr.lua
index 8523d8729ab..fc6bead5889 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-onr.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-onr.lua
@@ -21,7 +21,7 @@ add features.</p>
local fonts, logs, trackers, resolvers = fonts, logs, trackers, resolvers
-local next, type, tonumber, rawget, rawset = next, type, tonumber, rawget, rawset
+local next, type, tonumber, rawset = next, type, tonumber, rawset
local match, lower, gsub, strip, find = string.match, string.lower, string.gsub, string.strip, string.find
local char, byte, sub = string.char, string.byte, string.sub
local abs = math.abs
@@ -235,7 +235,6 @@ do
binary = decrypt(binary,55665,4)
local names = { }
-
local encoding = lpegmatch(p_filterencoding,ascii)
local metadata = lpegmatch(p_filtermetadata,ascii,1,{})
local glyphs = { }
@@ -255,7 +254,7 @@ do
},
}
-- only cff 1 in type 1 fonts
- fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,"cff",streams)
+ fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,"cff",streams,true)
else
lpegmatch(p_filternames,binary,1,filename)
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-osd.lua b/Master/texmf-dist/tex/context/base/mkiv/font-osd.lua
index f51ae7bf71b..b97ac9c6f57 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-osd.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-osd.lua
@@ -81,7 +81,7 @@ if not modules then modules = { } end modules ['font-osd'] = { -- script devanag
-- malayalam, oriya, tamil and tolugu but not all are checked. Also, some of the
-- code below might need to be adapted to the extra scripts.
-local insert, imerge, copy = table.insert, table.imerge, table.copy
+local insert, imerge, copy, tohash = table.insert, table.imerge, table.copy, table.tohash
local next, type = next, type
local report = logs.reporter("otf","devanagari")
@@ -114,7 +114,7 @@ local setchar = nuts.setchar
local getprop = nuts.getprop
local setprop = nuts.setprop
-local ischar = nuts.is_char
+local ischar = nuts.ischar
local insert_node_after = nuts.insert_after
local copy_node = nuts.copy
@@ -143,6 +143,7 @@ local s_half = states.half
local s_pref = states.pref
local s_blwf = states.blwf
local s_pstf = states.pstf
+local s_init = states.init
local replace_all_nbsp = nil
@@ -209,10 +210,10 @@ if not indicgroups and characters then
local indicorders = {
bp = { }, -- before_postscript
ap = { }, -- after_postscript
- bs = { }, -- before_half
- as = { }, -- after_half
- bh = { }, -- before_subscript
- ah = { }, -- after_subscript
+ bs = { }, -- before_subscript
+ as = { }, -- after_subscript
+ bh = { }, -- before_half
+ ah = { }, -- after_half
bm = { }, -- before_main
am = { }, -- after_main
}
@@ -324,17 +325,11 @@ local zw_char = { -- both_joiners_true
}
local dflt_true = {
- dflt = true
+ dflt = true,
}
-local two_defaults = {
- dev2 = dflt_true,
-}
-
-local one_defaults = {
- dev2 = dflt_true,
- deva = dflt_true,
-}
+local two_defaults = { }
+local one_defaults = { }
local false_flags = { false, false, false, false }
@@ -367,7 +362,7 @@ local sequence_reorder_reph = {
}
local sequence_reorder_pre_base_reordering_consonants = {
- features = { dv03 = two_defaults },
+ features = { dv03 = one_defaults },
flags = false_flags,
name = "dv03_reorder_pre_base_reordering_consonants",
order = { "dv03" },
@@ -399,34 +394,20 @@ local sequence_remove_joiners = {
-- as it might depends on the font. Not that it's a bottleneck.
local basic_shaping_forms = {
- -- init = true, -- new
- -- abvs = true, -- new
akhn = true,
blwf = true,
- -- calt = true, -- new
cjct = true,
half = true,
- -- haln = true, -- new
nukt = true,
pref = true,
- -- pres = true, -- new
pstf = true,
- -- psts = true, -- new
rkrf = true,
rphf = true,
vatu = true,
+ locl = true,
}
local valid = {
- -- akhn = true, -- malayalam
- -- rphf = true,
- -- pref = true,
- -- half = true,
- -- blwf = true,
- -- pstf = true,
- -- pres = true, -- malayalam
- -- blws = true, -- malayalam
- -- psts = true, -- malayalam
abvs = true,
akhn = true,
blwf = true,
@@ -448,6 +429,7 @@ local valid = {
psts = true,
haln = true,
calt = true,
+ locl = true,
}
local scripts = { }
@@ -462,7 +444,7 @@ for i=1,nofscripts do
local two = scripts_two[i]
scripts[one] = true
scripts[two] = true
- two_defaults[one] = dflt_true
+ two_defaults[two] = dflt_true
one_defaults[one] = dflt_true
one_defaults[two] = dflt_true
end
@@ -483,28 +465,75 @@ local function initializedevanagi(tfmdata)
local sequences = resources.sequences
local sharedfeatures = tfmdata.shared.features
--
- local lastmatch = 0
- for s=1,#sequences do -- classify chars
+ gsubfeatures["dv01"] = two_defaults -- reorder matras
+ gsubfeatures["dv02"] = two_defaults -- reorder reph
+ gsubfeatures["dv03"] = one_defaults -- reorder pre base reordering consonants
+ gsubfeatures["dv04"] = one_defaults -- remove joiners
+ --
+ local reorder_pre_base_reordering_consonants = copy(sequence_reorder_pre_base_reordering_consonants)
+ local reorder_reph = copy(sequence_reorder_reph)
+ local reorder_matras = copy(sequence_reorder_matras)
+ local remove_joiners = copy(sequence_remove_joiners)
+
+ local lastmatch = 0
+ for s=1,#sequences do -- classify chars and make sure basic_shaping_forms come first
local features = sequences[s].features
if features then
for k, v in next, features do
+ if k == "locl" then
+ local steps = sequences[s].steps
+ local nofsteps = sequences[s].nofsteps
+ for i=1,nofsteps do
+ local step = steps[i]
+ local coverage = step.coverage
+ if coverage then
+ for k, v in next, pre_mark do
+ local locl = coverage[k]
+ if locl then
+ if #locl > 0 then --contextchain; KE: is this right?
+ for j=1,#locl do
+ local ck = locl[j]
+ local f = ck[4]
+ local chainlookups = ck[6]
+ if chainlookups then
+ local chainlookup = chainlookups[f]
+ for j=1,#chainlookup do
+ local chainstep = chainlookup[j]
+ local steps = chainstep.steps
+ local nofsteps = chainstep.nofsteps
+ for i=1,nofsteps do
+ local step = steps[i]
+ local coverage = step.coverage
+ if coverage then
+ locl = coverage[k]
+ end
+ end
+ end
+ end
+ end
+ end
+ if locl then
+ reorder_matras.steps[1].coverage[locl] = true
+ end
+ end
+ end
+ end
+ end
+ end
if basic_shaping_forms[k] then
- lastmatch = s
+ lastmatch = lastmatch + 1
+ if s ~= lastmatch then
+ table.insert(sequences, lastmatch, table.remove(sequences, s))
+ end
end
end
end
end
local insertindex = lastmatch + 1
--
- gsubfeatures["dv01"] = two_defaults -- reorder matras
- gsubfeatures["dv02"] = two_defaults -- reorder reph
- gsubfeatures["dv03"] = two_defaults -- reorder pre base reordering consonants
- gsubfeatures["dv04"] = one_defaults -- remove joiners
- --
- local reorder_pre_base_reordering_consonants = copy(sequence_reorder_pre_base_reordering_consonants)
- local reorder_reph = copy(sequence_reorder_reph)
- local reorder_matras = copy(sequence_reorder_matras)
- local remove_joiners = copy(sequence_remove_joiners)
+ if tfmdata.properties.language then
+ dflt_true[tfmdata.properties.language] = true
+ end
--
insert(sequences,insertindex,reorder_pre_base_reordering_consonants)
insert(sequences,insertindex,reorder_reph)
@@ -512,6 +541,8 @@ local function initializedevanagi(tfmdata)
insert(sequences,insertindex,remove_joiners)
--
local blwfcache = { }
+ local vatucache = { }
+ local pstfcache = { }
local seqsubset = { }
local rephstep = {
coverage = { } -- will be adapted each work
@@ -520,6 +551,8 @@ local function initializedevanagi(tfmdata)
reph = false,
vattu = false,
blwfcache = blwfcache,
+ vatucache = vatucache,
+ pstfcache = pstfcache,
seqsubset = seqsubset,
reorderreph = rephstep,
@@ -539,41 +572,148 @@ local function initializedevanagi(tfmdata)
local features = sequence.features
local has_rphf = features.rphf
local has_blwf = features.blwf
- if has_rphf and has_rphf.deva then
+ local has_vatu = features.vatu
+ local has_pstf = features.pstf
+ if has_rphf and has_rphf[script] then
devanagari.reph = true
- elseif has_blwf and has_blwf.deva then
+ elseif (has_blwf and has_blwf[script] ) or (has_vatu and has_vatu[script] ) then
devanagari.vattu = true
for i=1,nofsteps do
local step = steps[i]
local coverage = step.coverage
if coverage then
for k, v in next, coverage do
- if not blwfcache[k] then
- blwfcache[k] = v
+ for h, w in next, halant do
+ if v[h] then
+ if not blwfcache[k] then
+ blwfcache[k] = v
+ end
+ end
+ if has_vatu and has_vatu[script] and not vatucache[k] then
+ vatucache[k] = v
+ end
+ end
+ end
+ end
+ end
+ elseif has_pstf and has_pstf[script] then
+ for i=1,nofsteps do
+ local step = steps[i]
+ local coverage = step.coverage
+ if coverage then
+ for k, v in next, coverage do
+ if not pstfcache[k] then
+ pstfcache[k] = v
+ end
+ end
+ for k, v in next, ra do
+ local r = coverage[k]
+ if r then
+ local found = false
+ if #r > 0 then -- contextchain; KE: is this right?
+ for j=1,#r do
+ local ck = r[j]
+ local f = ck[4]
+ local chainlookups = ck[6]
+ if chainlookups and chainlookups[f] then --KE: why is check for chainlookups[f] necessacy???
+ local chainlookup = chainlookups[f]
+ for j=1,#chainlookup do
+ local chainstep = chainlookup[j]
+ local steps = chainstep.steps
+ local nofsteps = chainstep.nofsteps
+ for i=1,nofsteps do
+ local step = steps[i]
+ local coverage = step.coverage
+ if coverage then
+ local h = coverage[k]
+ if h then
+ for k, v in next, h do
+ found = v and v.ligature
+ if found then
+ pre_base_reordering_consonants[found] = true
+ break
+ end
+ end
+ if found then
+ break
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ else
+ for k, v in next, r do
+ found = v and v.ligature
+ if found then
+ pre_base_reordering_consonants[found] = true
+ break
+ end
+ end
+ end
+ if found then
+ break
+ end
end
end
end
end
end
for kind, spec in next, features do
- -- if spec.dev2 and valid[kind] then
if valid[kind] and valid_two(spec)then
for i=1,nofsteps do
local step = steps[i]
local coverage = step.coverage
if coverage then
- local reph = false
+ local reph, rephbase = false, false
if kind == "rphf" then
-- rphf acts on consonant + halant
for k, v in next, ra do
local r = coverage[k]
if r then
+ rephbase = k
local h = false
- for k, v in next, halant do
- local h = r[k]
- if h then
- reph = h.ligature or false
- break
+ if #r > 0 then --contextchain; KE: is this right?
+ for j=1,#r do
+ local ck = r[j]
+ local f = ck[4]
+ local chainlookups = ck[6]
+ if chainlookups then
+ local chainlookup = chainlookups[f]
+ for j=1,#chainlookup do
+ local chainstep = chainlookup[j]
+ local steps = chainstep.steps
+ local nofsteps = chainstep.nofsteps
+ for i=1,nofsteps do
+ local step = steps[i]
+ local coverage = step.coverage
+ if coverage then
+ local r = coverage[k]
+ if r then
+ for k, v in next, halant do
+ local h = r[k]
+ if h then
+ reph = h.ligature or false
+ break
+ end
+ end
+ if h then
+ break
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ else
+ for k, v in next, halant do
+ local h = r[k]
+ if h then
+ reph = h.ligature or false
+ break
+ end
end
end
if reph then
@@ -582,7 +722,7 @@ local function initializedevanagi(tfmdata)
end
end
end
- seqsubset[#seqsubset+1] = { kind, coverage, reph }
+ seqsubset[#seqsubset+1] = { kind, coverage, reph, rephbase }
end
end
end
@@ -597,11 +737,46 @@ local function initializedevanagi(tfmdata)
local h = coverage[k]
if h then
local found = false
- for k, v in next, h do
- found = v and v.ligature
- if found then
- pre_base_reordering_consonants[k] = found
- break
+ if #h > 0 then -- contextchain; KE: is this right?
+ for j=1,#h do
+ local ck = h[j]
+ local f = ck[4]
+ local chainlookups = ck[6]
+ if chainlookups then
+ local chainlookup = chainlookups[f]
+ for j=1,#chainlookup do
+ local chainstep = chainlookup[j]
+ local steps = chainstep.steps
+ local nofsteps = chainstep.nofsteps
+ for i=1,nofsteps do
+ local step = steps[i]
+ local coverage = step.coverage
+ if coverage then
+ local h = coverage[k]
+ if h then
+ for k, v in next, h do
+ found = v and v.ligature
+ if found then
+ pre_base_reordering_consonants[found] = true
+ break
+ end
+ end
+ if found then
+ break
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ else
+ for k, v in next, h do
+ found = v and v.ligature
+ if found then
+ pre_base_reordering_consonants[found] = true
+ break
+ end
end
end
if found then
@@ -615,45 +790,17 @@ local function initializedevanagi(tfmdata)
end
end
--
- -- needs checking: this might be needed per instance ?
- --
- if script == "deva" then
- sharedfeatures["dv04"] = true -- dv04_remove_joiners
- elseif script == "dev2" then
+ if two_defaults[script] then
sharedfeatures["dv01"] = true -- dv01_reorder_matras
sharedfeatures["dv02"] = true -- dv02_reorder_reph
sharedfeatures["dv03"] = true -- dv03_reorder_pre_base_reordering_consonants
sharedfeatures["dv04"] = true -- dv04_remove_joiners
- elseif script == "mlym" then
- sharedfeatures["pstf"] = true
- elseif script == "mlm2" then
- sharedfeatures["pstf"] = true
- sharedfeatures["pref"] = true
+ elseif one_defaults[script] then
sharedfeatures["dv03"] = true -- dv03_reorder_pre_base_reordering_consonants
- gsubfeatures ["dv03"] = two_defaults -- reorder pre base reordering consonants
- insert(sequences,insertindex,sequence_reorder_pre_base_reordering_consonants)
- -- elseif script == "beng" then
- -- elseif script == "bng2" then
- -- elseif script == "gujr" then
- -- elseif script == "gjr2" then
- -- elseif script == "guru" then
- -- elseif script == "gur2" then
- -- elseif script == "knda" then
- -- elseif script == "knd2" then
- elseif script == "taml" then
sharedfeatures["dv04"] = true -- dv04_remove_joiners
-sharedfeatures["pstf"] = true
- elseif script == "tml2" then
--- sharedfeatures["pstf"] = true
--- sharedfeatures["pref"] = true
--- sharedfeatures["dv01"] = true -- dv01_reorder_matras
--- sharedfeatures["dv02"] = true -- dv02_reorder_reph
--- sharedfeatures["dv03"] = true -- dv03_reorder_pre_base_reordering_consonants
--- sharedfeatures["dv04"] = true -- dv04_remove_joiners
- -- elseif script == "telu" then
- -- elseif script == "tel2" then
- else
- report("todo: enable the right features for script %a",script)
+ end
+ if script == "mlym" or script == "taml" then
+ devanagari.left_matra_before_base = true
end
end
end
@@ -695,6 +842,8 @@ local function initialize_one(font,attr) -- we need a proper hook into the datas
reph = false,
vattu = false,
blwfcache = { },
+ vatucache = { },
+ pstfcache = { },
}
datasets.devanagari = devanagaridata
local resources = tfmdata.resources
@@ -707,31 +856,97 @@ local function initialize_one(font,attr) -- we need a proper hook into the datas
if kind == "rphf" then
-- deva
devanagaridata.reph = true
- elseif kind == "blwf" then
+ elseif kind == "blwf" or kind == "vatu" then
-- deva
devanagaridata.vattu = true
-- dev2
devanagaridata.blwfcache = devanagari.blwfcache
+ devanagaridata.vatucache = devanagari.vatucache
+ devanagaridata.pstfcache = devanagari.pstfcache
end
end
end
end
- return devanagaridata.reph, devanagaridata.vattu, devanagaridata.blwfcache
+ return devanagaridata.reph, devanagaridata.vattu, devanagaridata.blwfcache, devanagaridata.vatucache, devanagaridata.pstfcache
end
+local function contextchain(contexts, n)
+ local char = getchar(n)
+ for k=1,#contexts do
+ local ck = contexts[k]
+ local seq = ck[3]
+ local f = ck[4]
+ local l = ck[5]
+ if (l - f) == 1 and seq[f+1][char] then
+ local ok = true
+ local c = n
+ for i=l+1,#seq do
+ c = getnext(c)
+ if not c or not seq[i][ischar(c)] then
+ ok = false
+ break
+ end
+ end
+ if ok then
+ c = getprev(n)
+ for i=1,f-1 do
+ c = getprev(c)
+ if not c or not seq[f-i][ischar(c)] then
+ ok = false
+ end
+ end
+ end
+ if ok then
+ return true
+ end
+ end
+ end
+ return false
+end
+
+local function order_matras(c)
+ local cn = getnext(c)
+ local char = getchar(cn)
+ while dependent_vowel[char] do
+ local next = getnext(cn)
+ local cc = c
+ local cchar = getchar(cc)
+ while cc ~= cn do
+ if (above_mark[char] and (below_mark[cchar] or post_mark[cchar])) or (below_mark[char] and (post_mark[cchar])) then
+ local prev, next = getboth(cn)
+ if next then
+ setprev(next,prev)
+ end
+ -- todo: setlink
+ setnext(prev,next)
+ setnext(getprev(cc),cn)
+ setprev(cn,getprev(cc))
+ setnext(cn,cc)
+ setprev(cc,cn)
+ break
+ end
+ cc = getnext(cc)
+ cchar = getchar(cc)
+ end
+ cn = next
+ char = getchar(cn)
+ end
+end
+
local function reorder_one(head,start,stop,font,attr,nbspaces)
- local reph, vattu, blwfcache = initialize_one(font,attr) -- todo: a hash[font]
+ local reph, vattu, blwfcache, vatucache, pstfcache = initialize_one(font,attr) -- todo: a hash[font]
- local current = start
- local n = getnext(start)
- local base = nil
- local firstcons = nil
- local lastcons = nil
- local basefound = false
+ local devanagari = fontdata[font].resources.devanagari
+ local current = start
+ local n = getnext(start)
+ local base = nil
+ local firstcons = nil
+ local lastcons = nil
+ local basefound = false
if reph and ra[getchar(start)] and halant[getchar(n)] then
-- if syllable starts with Ra + H and script has 'Reph' then exclude Reph
@@ -814,8 +1029,11 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
if not base then
base = current
elseif blwfcache[char] then
- -- consonant has below-base (or post-base) form
+ -- consonant has below-base form
setprop(current,a_state,s_blwf)
+ elseif pstfcache[char] then
+ -- consonant has post-base form
+ setprop(current,a_state,s_pstf)
else
base = current
end
@@ -894,16 +1112,14 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
current = next
end
- if base ~= stop and getprop(base,a_state) then
+ if base ~= stop and getprop(base,a_state) then -- a_state can also be init
local next = getnext(base)
if halant[getchar(next)] and not (next ~= stop and getchar(getnext(next)) == c_zwj) then
setprop(base,a_state,unsetvalue)
end
end
- -- ToDo: split two- or three-part matras into their parts. Then, move the left 'matra' part to the beginning of the syllable.
- -- Not necessary for Devanagari. However it is necessay for other scripts, such as Tamil (e.g. TAMIL VOWEL SIGN O - 0BCA)
-
+ -- split two- or three-part matras into their parts. Then, move the left 'matra' part to the beginning of the syllable.
-- classify consonants and 'matra' parts as pre-base, above-base (Reph), below-base or post-base, and group elements of the syllable (consonants and 'matras') according to this classification
local current, allreordered, moved = start, false, { [base] = true }
@@ -929,6 +1145,17 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
n = getnext(n)
ch = getchar(n)
end
+
+ local tpm = twopart_mark[ch]
+ while tpm do
+ local extra = copy_node(n)
+ copyinjection(extra,n)
+ ch = tpm[1]
+ setchar(n,ch)
+ setchar(extra,tpm[2])
+ head = insert_node_after(head,current,extra)
+ tpm = twopart_mark[ch]
+ end
while c ~= stop and dependent_vowel[ch] do
c = n
n = getnext(n)
@@ -947,15 +1174,51 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
end
end
end
- local bp = getprev(firstcons)
- local cn = getnext(current)
+ local bp = getprev(firstcons)
+ local cn = getnext(current)
local last = getnext(c)
while cn ~= last do
-- move pre-base matras...
if pre_mark[getchar(cn)] then
- if bp then
- setnext(bp,cn)
+ if devanagari.left_matra_before_base then
+ local prev, next = getboth(cn)
+ setlink(prev,next)
+ if cn == stop then
+ stop = getprev(cn)
+ end
+ if base == start then
+ if head == start then
+ head = cn
+ end
+ start = cn
+ end
+ setlink(getprev(base),cn)
+ setlink(cn,base)
+ -- setlink(getprev(base),cn,base) -- maybe
+ cn = next
+ else
+ if bp then
+ setnext(bp,cn)
+ end
+ local prev, next = getboth(cn)
+ if next then
+ setprev(next,prev)
+ end
+ setnext(prev,next)
+ if cn == stop then
+ stop = prev
+ end
+ setprev(cn,bp)
+ setlink(cn,firstcons)
+ if firstcons == start then
+ if head == start then
+ head = cn
+ end
+ start = cn
+ end
+ cn = next
end
+ elseif current ~= base and dependent_vowel[getchar(cn)] then
local prev, next = getboth(cn)
if next then
setprev(next,prev)
@@ -964,17 +1227,19 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
if cn == stop then
stop = prev
end
- setprev(cn,bp)
- setlink(cn,firstcons)
- if firstcons == start then
- if head == start then
- head = cn
- end
- start = cn
+ setlink(b,cn,getnext(b))
+ order_matras(cn)
+ cn = next
+ elseif current == base and dependent_vowel[getchar(cn)] then
+ local cnn = getnext(cn)
+ order_matras(cn)
+ cn = cnn
+ while cn ~= last and dependent_vowel[getchar(cn)] do
+ cn = getnext(cn)
end
- break
+ else
+ cn = getnext(cn)
end
- cn = getnext(cn)
end
allreordered = c == stop
current = getnext(c)
@@ -1020,7 +1285,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
local cp = getprev(current)
local cnsn = getnext(cns)
setlink(cp,n)
- setlink(cns,current)
+ setlink(cns,current) -- cns ?
setlink(c,cnsn)
if c == stop then
stop = cp
@@ -1036,6 +1301,13 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
if halant[getchar(next)] then
cns = next
end
+ if not vatucache[char] then
+ next = getnext(cns)
+ while dependent_vowel[getchar(next)] do
+ cns = next
+ next = getnext(cns)
+ end
+ end
elseif char == c_nbsp then
nbspaces = nbspaces + 1
cns = current
@@ -1043,6 +1315,13 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
if halant[getchar(next)] then
cns = next
end
+ if not vatucache[char] then
+ next = getnext(cns)
+ while dependent_vowel[getchar(next)] do
+ cns = next
+ next = getnext(cns)
+ end
+ end
end
end
current = getnext(current)
@@ -1051,6 +1330,9 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
if getchar(base) == c_nbsp then
nbspaces = nbspaces - 1
+ if base == stop then
+ stop = getprev(stop)
+ end
head = remove_node(head,base)
flush_node(base)
end
@@ -1075,7 +1357,7 @@ function handlers.devanagari_reorder_matras(head,start) -- no leak
local char = ischar(current,startfont)
local next = getnext(current)
if char and getprop(current,a_syllabe) == startattr then
- if halant[char] and not getprop(current,a_state) then
+ if halant[char] then -- a_state can also be init
if next then
local char = ischar(next,startfont)
if char and zw_char[char] and getprop(next,a_syllabe) == startattr then
@@ -1091,6 +1373,18 @@ function handlers.devanagari_reorder_matras(head,start) -- no leak
-- setlink(current,start,next) -- maybe
start = startnext
break
+ -- elseif consonant[char] and ( not getprop(current,a_state) or getprop(current,a_state) == s_init) then
+ -- startnext = getnext(start)
+ -- head = remove_node(head,start)
+ -- if current == head then
+ -- setlink(start,current)
+ -- head = start
+ -- else
+ -- setlink(getprev(current),start)
+ -- setlink(start,current)
+ -- end
+ -- start = startnext
+ -- break
end
else
break
@@ -1109,6 +1403,8 @@ end
-- In Devanagari reph has reordering position 'before postscript' and dev2 only
-- follows step 2, 4, and 6.
+local rephbase = { }
+
function handlers.devanagari_reorder_reph(head,start)
local current = getnext(start)
local startnext = nil
@@ -1120,6 +1416,12 @@ function handlers.devanagari_reorder_reph(head,start)
--
-- If reph should be positioned after post-base consonant forms, proceed to step 5.
--
+ local char = ischar(start,startfont)
+ local rephbase = rephbase[startfont][char]
+ if char and after_subscript[rephbase] then
+ goto step_5
+ end
+ --
::step_2::
--
-- If the reph repositioning class is not after post-base: target position is after
@@ -1130,39 +1432,64 @@ function handlers.devanagari_reorder_reph(head,start)
-- fixed in shaping engine, there was no case where reph position will be found on
-- this step.
--
- while current do
- local char = ischar(current,startfont)
- if char and getprop(current,a_syllabe) == startattr then
- if halant[char] and not getprop(current,a_state) then
- local next = getnext(current)
- if next then
- local nextchar = ischar(next,startfont)
- if nextchar and zw_char[nextchar] and getprop(next,a_syllabe) == startattr then
- current = next
- next = getnext(current)
+ if char and not after_postscript[rephbase] then
+ while current do
+ local char = ischar(current,startfont)
+ if char and getprop(current,a_syllabe) == startattr then
+ if halant[char] then
+ local next = getnext(current)
+ if next then
+ local nextchar = ischar(next,startfont)
+ if nextchar and zw_char[nextchar] and getprop(next,a_syllabe) == startattr then
+ current = next
+ next = getnext(current)
+ end
end
+ startnext = getnext(start)
+ head = remove_node(head,start)
+ setlink(start,next)
+ setlink(current,start)
+ -- setlink(current,start,next) -- maybe
+ start = startnext
+ startattr = getprop(start,a_syllabe)
+ break
end
- startnext = getnext(start)
- head = remove_node(head,start)
- setlink(start,next)
- setlink(current,start)
- -- setlink(current,start,next) -- maybe
- start = startnext
- startattr = getprop(start,a_syllabe)
+ current = getnext(current)
+ else
break
end
- current = getnext(current)
- else
- break
end
end
+ --
::step_3::
--
- -- If reph should be repositioned after the main consonant: from the first consonant
+ -- If reph should be repositioned after the main consonant: find the first consonant
-- not ligated with main, or find the first consonant that is not a potential
-- pre-base reordering Ra.
--
- -- Kai: todo
+ if not startnext then
+ if char and after_main[rephbase] then
+ current = getnext(start)
+ while current do
+ local char = ischar(current,startfont)
+ if char and getprop(current,a_syllabe) == startattr then
+ if consonant[char] and not getprop(current,a_state) == s_pref then
+ startnext = getnext(start)
+ head = remove_node(head,start)
+ setlink(current,start)
+ setlink(start,getnext(current))
+ -- setlink(current,start,getnext(current)) -- maybe
+ start = startnext
+ startattr = getprop(start,a_syllabe)
+ break
+ end
+ current = getnext(current)
+ else
+ break
+ end
+ end
+ end
+ end
--
::step_4::
--
@@ -1171,23 +1498,37 @@ function handlers.devanagari_reorder_reph(head,start)
-- position should be before the first matra, syllable modifier sign or vedic sign.
--
if not startnext then
- current = getnext(start)
- while current do
- local char = ischar(current,startfont)
- if char and getprop(current,a_syllabe) == startattr then
- if getprop(current,a_state) == s_pstf then -- post-base
- startnext = getnext(start)
- head = remove_node(head,start)
- setlink(getprev(current),start)
- setlink(start,current)
- -- setlink(getprev(current),start,current) -- maybe
- start = startnext
- startattr = getprop(start,a_syllabe)
+ if char and before_postscript[rephbase] then
+ current = getnext(start)
+ local c = nil
+ while current do
+ local char = ischar(current,startfont)
+ if char and getprop(current,a_syllabe) == startattr then
+ if getprop(current,a_state) == s_pstf then -- post-base
+ startnext = getnext(start)
+ head = remove_node(head,start)
+ setlink(getprev(current),start)
+ setlink(start,current)
+ -- setlink(getprev(current),start,current) -- maybe
+ start = startnext
+ startattr = getprop(start,a_syllabe)
+ break
+ elseif not c and ( vowel_modifier[char] or stress_tone_mark[char] ) then
+ c = current
+ end
+ current = getnext(current)
+ else
+ if c then
+ startnext = getnext(start)
+ head = remove_node(head,start)
+ setlink(getprev(c),start)
+ setlink(start,c)
+ -- setlink(getprev(c),start,c) -- maybe
+ start = startnext
+ startattr = getprop(start,a_syllabe)
+ end
break
end
- current = getnext(current)
- else
- break
end
end
end
@@ -1206,7 +1547,10 @@ function handlers.devanagari_reorder_reph(head,start)
while current do
local char = ischar(current,startfont)
if char and getprop(current,a_syllabe) == startattr then
- if not c and mark_above_below_post[char] and not after_subscript[char] then
+ local state = getprop(current,a_state)
+ if before_subscript[rephbase] and (state == s_blwf or state == s_pstf) then
+ c = current
+ elseif after_subscript[rephbase] and (state == s_pstf) then
c = current
end
current = getnext(current)
@@ -1271,67 +1615,82 @@ end
-- return head, start, done
-- end
+local reordered_pre_base_reordering_consonants = { } -- shared ? not reset ?
+
function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start)
- local current = start
- local startnext = nil
- local startprev = nil
+ if reordered_pre_base_reordering_consonants[start] then
+ return head, start, true
+ end
+ local current = start -- we could cache attributes here
local startfont = getfont(start)
local startattr = getprop(start,a_syllabe)
- -- can be fast for loop + caching state
while current do
local char = ischar(current,startfont)
+ local next = getnext(current)
if char and getprop(current,a_syllabe) == startattr then
- local next = getnext(current)
- if halant[char] and not getprop(current,a_state) then
+ if halant[char] then -- a_state can also be init
if next then
- local nextchar = ischar(next,startfont)
- if nextchar and getprop(next,a_syllabe) == startattr then
- if nextchar == c_zwnj or nextchar == c_zwj then
- current = next
- next = getnext(current)
- end
+ local char = ischar(next,startfont)
+ if char and zw_char[char] and getprop(next,a_syllabe) == startattr then
+ current = next
+ next = getnext(current)
end
end
- startnext = getnext(start)
- removenode(start,start)
+ -- can be optimzied
+ local startnext = getnext(start)
+ head = remove_node(head,start)
setlink(start,next)
setlink(current,start)
-- setlink(current,start,next) -- maybe
+ reordered_pre_base_reordering_consonants[start] = true
start = startnext
- break
+ return head, start, true
+ -- elseif consonant[char] and ( not getprop(current,a_state) or getprop(current,a_state) == s_init) then
+ -- startnext = getnext(start)
+ -- head = remove_node(head,start)
+ -- if current == head then
+ -- setlink(start,current)
+ -- head = start
+ -- else
+ -- setlink(getprev(current),start)
+ -- setlink(start,current)
+ -- end
+ -- start = startnext
+ -- break
end
- current = next
else
break
end
+ current = next
end
- if not startnext then
- current = getnext(start)
- startattr = getprop(start,a_syllabe)
- while current do
- local char = ischar(current,startfont)
- if char and getprop(current,a_syllabe) == startattr then
- if not consonant[char] and getprop(current,a_state) then -- main
- startnext = getnext(start)
- removenode(start,start)
- setlink(getprev(current),start)
- setlink(start,current)
- -- setlink(getprev(current),start,current) -- maybe
- start = startnext
- break
- end
- current = getnext(current)
+
+ local startattr = getprop(start,a_syllabe)
+ local current = getprev(start)
+ while current and getprop(current,a_syllabe) == startattr do
+ local char = ischar(current)
+ if ( not dependent_vowel[char] and not getprop(current,a_state) or getprop(current,a_state) == s_init) then
+ startnext = getnext(start)
+ head = remove_node(head,start)
+ if current == head then
+ setlink(start,current)
+ head = start
else
- break
+ setlink(getprev(current),start)
+ setlink(start,current)
end
+ reordered_pre_base_reordering_consonants[start] = true
+ start = startnext
+ break
end
+ current = getprev(current)
end
+
return head, start, true
end
function handlers.devanagari_remove_joiners(head,start,kind,lookupname,replacement)
local stop = getnext(start)
- local font = getfont(start) -- hm
+ local font = getfont(start)
local last = start
while stop do
local char = ischar(stop,font)
@@ -1372,15 +1731,15 @@ end
-- of the actions
local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pass over (determine stop in sweep)
-
local seqsubset, reorderreph = initialize_two(font,attr)
- local reph = false -- was nil ... probably went unnoticed because never assigned
local halfpos = nil
local basepos = nil
local subpos = nil
local postpos = nil
- local locl = { }
+
+ reorderreph.coverage = { }
+ rephbase[font] = { }
for i=1,#seqsubset do
@@ -1390,17 +1749,17 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
local kind = subset[1]
local lookupcache = subset[2]
if kind == "rphf" then
- reph = subset[3]
+ reorderreph.coverage[subset[3]] = true -- neat
+ rephbase[font][subset[3]] = subset[4]
local current = start
local last = getnext(stop)
while current ~= last do
if current ~= stop then
- local c = locl[current] or getchar(current)
+ local c = getchar(current)
local found = lookupcache[c]
if found then
local next = getnext(current)
- local n = locl[next] or getchar(next)
- if found[n] then --above-base: rphf Consonant + Halant
+ if found[getchar(next)] or contextchain(found, next) then --above-base: rphf Consonant + Halant
local afternext = next ~= stop and getnext(next)
if afternext and zw_char[getchar(afternext)] then -- ZWJ and ZWNJ prevent creation of reph
current = afternext -- getnext(next)
@@ -1420,15 +1779,16 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
local last = getnext(stop)
while current ~= last do
if current ~= stop then
- local c = locl[current] or getchar(current)
+ local c = getchar(current)
local found = lookupcache[c]
if found then -- pre-base: pref Halant + Consonant
local next = getnext(current)
- local n = locl[next] or getchar(next)
- if found[n] then
- setprop(current,a_state,s_pref)
- setprop(next,a_state,s_pref)
- current = next
+ if found[getchar(next)] or contextchain(found, next) then
+ if (not getprop(current,a_state) and not getprop(next,a_state)) then --KE: a_state can also be init...
+ setprop(current,a_state,s_pref)
+ setprop(next,a_state,s_pref)
+ current = next
+ end
end
end
end
@@ -1439,15 +1799,14 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
local last = getnext(stop)
while current ~= last do
if current ~= stop then
- local c = locl[current] or getchar(current)
+ local c = getchar(current)
local found = lookupcache[c]
if found then
local next = getnext(current)
- local n = locl[next] or getchar(next)
- if found[n] then
+ if found[getchar(next)] or contextchain(found, next) then
if next ~= stop and getchar(getnext(next)) == c_zwnj then -- zwnj prevent creation of half
current = next
- else
+ elseif (not getprop(current,a_state)) then --KE: a_state can also be init...
setprop(current,a_state,s_half)
if not halfpos then
halfpos = current
@@ -1459,21 +1818,22 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
end
current = getnext(current)
end
- elseif kind == "blwf" then -- below-base: blwf / Halant + Consonant
+ elseif kind == "blwf" or kind == "vatu" then -- below-base: blwf / Halant + Consonant
local current = start
local last = getnext(stop)
while current ~= last do
if current ~= stop then
- local c = locl[current] or getchar(current)
+ local c = getchar(current)
local found = lookupcache[c]
if found then
local next = getnext(current)
- local n = locl[next] or getchar(next)
- if found[n] then
- setprop(current,a_state,s_blwf)
- setprop(next,a_state,s_blwf)
- current = next
- subpos = current
+ if found[getchar(next)] or contextchain(found, next) then
+ if (not getprop(current,a_state) and not getprop(next,a_state)) then --KE: a_state can also be init...
+ setprop(current,a_state,s_blwf)
+ setprop(next,a_state,s_blwf)
+ current = next
+ subpos = current
+ end
end
end
end
@@ -1484,16 +1844,17 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
local last = getnext(stop)
while current ~= last do
if current ~= stop then
- local c = locl[current] or getchar(current)
+ local c = getchar(current)
local found = lookupcache[c]
if found then
local next = getnext(current)
- local n = locl[next] or getchar(next)
- if found[n] then
- setprop(current,a_state,s_pstf)
- setprop(next,a_state,s_pstf)
- current = next
- postpos = current
+ if found[getchar(next)] or contextchain(found, next) then
+ if (not getprop(current,a_state) and not getprop(next,a_state)) then --KE: a_state can also be init...
+ setprop(current,a_state,s_pstf)
+ setprop(next,a_state,s_pstf)
+ current = next
+ postpos = current
+ end
end
end
end
@@ -1502,12 +1863,6 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
end
end
- -- this one changes per word ...
-
- reorderreph.coverage = { [reph] = true } -- neat
-
- -- end of weird
-
local current, base, firstcons = start, nil, nil
if getprop(start,a_state) == s_rphf then
@@ -1573,7 +1928,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
end
-- check whether consonant has below-base or post-base form or is pre-base reordering Ra
local a = getprop(current,a_state)
- if not (a == s_pref or a == s_blwf or a == s_pstf) then
+ if not (a == s_blwf or a == s_pstf or (a ~= s_rphf and a ~= s_blwf and ra[getchar(current)])) then
base = current
end
end
@@ -1591,7 +1946,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
end
return head, stop, nbspaces
else
- if getprop(base,a_state) then
+ if getprop(base,a_state) then -- a_state can also be init
setprop(base,a_state,unsetvalue)
end
basepos = base
@@ -1608,24 +1963,27 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
-- Matra characters are classified and reordered by which consonant in a conjunct they have affinity for
- local moved = { }
+ local moved = { }
local current = start
- local last = getnext(stop)
+ local last = getnext(stop)
while current ~= last do
- local char, target, cn = locl[current] or getchar(current), nil, getnext(current)
+ local char = getchar(current)
+ local target = nil
+ local cn = getnext(current)
-- not so efficient (needed for malayalam)
local tpm = twopart_mark[char]
- if tpm then
+ while tpm do
local extra = copy_node(current)
copyinjection(extra,current)
char = tpm[1]
setchar(current,char)
setchar(extra,tpm[2])
head = insert_node_after(head,current,extra)
+ tpm = twopart_mark[char]
end
--
if not moved[current] and dependent_vowel[char] then
- if pre_mark[char] then -- Before first half form in the syllable
+ if pre_mark[char] then -- or: if before_main or before_half
moved[current] = true
-- can be helper to remove one node
local prev, next = getboth(current)
@@ -1633,17 +1991,47 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
if current == stop then
stop = getprev(current)
end
- if halfpos == start then
+
+ local pos
+ if before_main[char] then
+ pos = basepos
+ -- basepos = current -- is this correct?
+ else
+ -- must be before_half
+ pos = halfpos
+ -- halfpos = current -- is this correct?
+ end
+
+ local ppos = getprev(pos) -- necessary?
+ while ppos and getprop(ppos,a_syllabe) == getprop(pos,a_syllabe) do
+ if getprop(ppos,a_state) == s_pref then
+ pos = ppos
+ end
+ ppos = getprev(ppos)
+ end
+
+ local ppos = getprev(pos) -- necessary?
+ while ppos and getprop(ppos,a_syllabe) == getprop(pos,a_syllabe) and halant[ischar(ppos)] do
+ ppos = getprev(ppos)
+ if ppos and getprop(ppos,a_syllabe) == getprop(pos,a_syllabe) and consonant[ischar(ppos)] then
+ pos = ppos
+ ppos = getprev(ppos)
+ else
+ break
+ end
+ end
+
+ if pos == start then
if head == start then
head = current
end
start = current
end
- setlink(getprev(halfpos),current)
- setlink(current,halfpos)
- -- setlink(getprev(halfpos),current,halfpos) -- maybe
- halfpos = current
- elseif above_mark[char] then -- After main consonant
+ setlink(getprev(pos),current)
+ setlink(current,pos)
+ -- setlink(getprev(pos),current,pos) -- maybe
+ elseif above_mark[char] then
+ -- after main consonant
target = basepos
if subpos == basepos then
subpos = current
@@ -1652,13 +2040,25 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
postpos = current
end
basepos = current
- elseif below_mark[char] then -- After subjoined consonants
+ elseif below_mark[char] then
+ -- after subjoined consonants
target = subpos
if postpos == subpos then
postpos = current
end
subpos = current
- elseif post_mark[char] then -- After post-form consonant
+ elseif post_mark[char] then
+ -- after post-form consonant
+ local n = getnext(postpos) -- nukta and vedic sign come first - is that right? and also halant+ra
+ while n do
+ local v = ischar(n,font)
+ if nukta[v] or stress_tone_mark[v] or vowel_modifier[v] then
+ postpos = n
+ else
+ break
+ end
+ n = getnext(n)
+ end
target = postpos
postpos = current
end
@@ -1679,9 +2079,44 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
current = cn
end
+ -- reorder halant+Ra
+
+ local current = getnext(start)
+ local last = getnext(stop)
+ while current ~= last do
+ local char = getchar(current)
+ local cn = getnext(current)
+ if halant[char] and ra[ischar(cn)] and getprop(cn,a_state) ~= s_rphf and getprop(cn,a_state) ~= s_blwf then
+ if after_main[ischar(cn)] then
+ local prev = getprev(current)
+ local next = getnext(cn)
+ local bpn = getnext(basepos)
+ while bpn and dependent_vowel[ischar(bpn)] do
+ basepos = bpn
+ bpn = getnext(bpn)
+ end
+ if basepos ~= prev then
+ setlink(prev,next)
+ setlink(cn, getnext(basepos))
+ setlink(basepos, current)
+ if cn == stop then
+ stop = prev
+ end
+ cn = next
+ end
+ end
+ -- after_postscript
+ -- after_subscript
+ -- before_postscript
+ -- before_subscript
+ end
+ current = cn
+ end
+
-- Reorder marks to canonical order: Adjacent nukta and halant or nukta and vedic sign are always repositioned if necessary, so that the nukta is first.
- local current, c = start, nil
+ local current = start
+ local c = nil
while current ~= stop do
local char = getchar(current)
if halant[char] or stress_tone_mark[char] then
@@ -1810,7 +2245,25 @@ local function analyze_next_chars_one(c,font,variant) -- skip one dependent vowe
if not v then
return c
end
- if dependent_vowel[v] then
+ local already_pre_mark -- = false
+ local already_above_mark -- = false
+ local already_below_mark -- = false
+ local already_post_mark -- = false
+ while dependent_vowel[v] do
+ local vowels = twopart_mark[v] or { v }
+ for k, v in next, vowels do
+ if pre_mark[v] and not already_pre_mark then
+ already_pre_mark = true
+ elseif above_mark[v] and not already_above_mark then
+ already_above_mark = true
+ elseif below_mark[v] and not already_below_mark then
+ already_below_mark = true
+ elseif post_mark[v] and not already_post_mark then
+ already_post_mark = true
+ else
+ return c
+ end
+ end
c = getnext(c)
n = getnext(c)
if not n then
@@ -1982,7 +2435,25 @@ local function analyze_next_chars_two(c,font)
else
-- c = ms_matra(c)
-- same as one
- if dependent_vowel[v] then
+ local already_pre_mark -- = false
+ local already_above_mark -- = false
+ local already_below_mark -- = false
+ local already_post_mark -- = false
+ while dependent_vowel[v] do
+ local vowels = twopart_mark[v] or { v }
+ for k, v in next, vowels do
+ if pre_mark[v] and not already_pre_mark then
+ already_pre_mark = true
+ elseif above_mark[v] and not already_above_mark then
+ already_above_mark = true
+ elseif below_mark[v] and not already_below_mark then
+ already_below_mark = true
+ elseif post_mark[v] and not already_post_mark then
+ already_post_mark = true
+ else
+ return c
+ end
+ end
c = n
n = getnext(c)
if not n then
@@ -2054,6 +2525,7 @@ local function method_one(head,font,attr)
local start = true
local done = false
local nbspaces = 0
+ local syllabe = 0
while current do
local char = ischar(current,font)
if char then
@@ -2203,6 +2675,15 @@ local function method_one(head,font,attr)
end
end
if syllablestart ~= syllableend then
+ if syllableend then
+ syllabe = syllabe + 1
+ local c = syllablestart
+ local n = getnext(syllableend)
+ while c ~= n do
+ setprop(c,a_syllabe,syllabe)
+ c = getnext(c)
+ end
+ end
head, current, nbspaces = reorder_one(head,syllablestart,syllableend,font,attr,nbspaces)
current = getnext(current)
end
@@ -2244,6 +2725,21 @@ local function method_one(head,font,attr)
head = replace_all_nbsp(head)
end
+ current = head
+ local n = 0
+ while current do
+ local char = ischar(current,font)
+ if char then
+ if n == 0 and not getprop(current,a_state) then
+ setprop(current,a_state,s_init)
+ end
+ n = n + 1
+ else
+ n = 0
+ end
+ current = getnext(current)
+ end
+
return head, done
end
@@ -2324,7 +2820,7 @@ local function method_two(head,font,attr)
end
if not syllableend and show_syntax_errors then
local char = ischar(current,font)
- if char and not getprop(current,a_state) then
+ if char and not getprop(current,a_state) then -- a_state can also be init
local mark = mark_four[char]
if mark then
head, current = inject_syntax_error(head,current,char)
@@ -2339,6 +2835,21 @@ local function method_two(head,font,attr)
head = replace_all_nbsp(head)
end
+ current = head
+ local n = 0
+ while current do
+ local char = ischar(current,font)
+ if char then
+ if n == 0 and not getprop(current,a_state) then -- a_state can also be init
+ setprop(current,a_state,s_init)
+ end
+ n = n + 1
+ else
+ n = 0
+ end
+ current = getnext(current)
+ end
+
return head, done
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-ota.lua b/Master/texmf-dist/tex/context/base/mkiv/font-ota.lua
index 76c267a8176..3d217b3f4d0 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-ota.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-ota.lua
@@ -39,7 +39,7 @@ local getprop = nuts.getprop
local setprop = nuts.setprop
local getsubtype = nuts.getsubtype
local getchar = nuts.getchar
-local ischar = nuts.is_char
+local ischar = nuts.ischar
local end_of_math = nuts.end_of_math
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-otc.lua b/Master/texmf-dist/tex/context/base/mkiv/font-otc.lua
index a774a81c2c9..2643d022a57 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-otc.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-otc.lua
@@ -22,9 +22,10 @@ local otf = fonts.handlers.otf
local registerotffeature = otf.features.register
local setmetatableindex = table.setmetatableindex
-local checkmerge = fonts.helpers.checkmerge
-local checkflags = fonts.helpers.checkflags
-local checksteps = fonts.helpers.checksteps
+local fonthelpers = fonts.helpers
+local checkmerge = fonthelpers.checkmerge
+local checkflags = fonthelpers.checkflags
+local checksteps = fonthelpers.checksteps
local normalized = {
substitution = "substitution",
@@ -167,6 +168,7 @@ local function addfeature(data,feature,specifications)
local done = 0
local skip = 0
local aglunicodes = false
+ local privateslot = fonthelpers.privateslot
local specifications = validspecification(specifications,feature)
if not specifications then
@@ -196,6 +198,13 @@ local function addfeature(data,feature,specifications)
return u
end
end
+ if privateslot then
+ u = privateslot(code) -- no creation !
+ if u then
+ -- unicodes[code] = u
+ return u
+ end
+ end
local u = lpegmatch(p,code)
if u then
-- unicodes[code] = u
@@ -229,7 +238,7 @@ local function addfeature(data,feature,specifications)
replacement = replacement[1]
end
replacement = tounicode(replacement)
- if replacement and descriptions[replacement] then
+ if replacement and (nocheck or descriptions[replacement]) then
cover(coverage,unicode,replacement)
done = done + 1
else
@@ -620,7 +629,6 @@ local function addfeature(data,feature,specifications)
local featuretype = normalized[specification.type or "substitution"] or "substitution"
local featureflags = specification.flags or noflags
local nocheck = specification.nocheck
- local futuresteps = specification.futuresteps
local featureorder = specification.order or { feature }
local featurechain = (featuretype == "chainsubstitution" or featuretype == "chainposition") and 1 or 0
local nofsteps = 0
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-otj.lua b/Master/texmf-dist/tex/context/base/mkiv/font-otj.lua
index bb30389357c..2e7878d3dfd 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-otj.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-otj.lua
@@ -90,7 +90,7 @@ local getboth = nuts.getboth
local getdisc = nuts.getdisc
local setdisc = nuts.setdisc
local setoffsets = nuts.setoffsets
-local ischar = nuts.is_char
+local ischar = nuts.ischar
local getkern = nuts.getkern
local setkern = nuts.setkern
local setlink = nuts.setlink
@@ -836,8 +836,8 @@ local function inject_positions_only(head,where)
if replace then
-- error, we expect an empty one
else
---KE setfield(next,"replace",fontkern(rightkern)) -- maybe also leftkern
- replace = fontkern(rightkern) -- maybe also leftkern --KE
+ -- KE setfield(next,"replace",fontkern(rightkern)) -- maybe also leftkern
+ replace = fontkern(rightkern) -- maybe also leftkern
done = true --KE
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-otl.lua b/Master/texmf-dist/tex/context/base/mkiv/font-otl.lua
index 6e0939e76bd..aff4cc8c8d9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-otl.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-otl.lua
@@ -52,11 +52,12 @@ local report_otf = logs.reporter("fonts","otf loading")
local fonts = fonts
local otf = fonts.handlers.otf
-otf.version = 3.107 -- beware: also sync font-mis.lua and in mtx-fonts
+otf.version = 3.111 -- beware: also sync font-mis.lua and in mtx-fonts
otf.cache = containers.define("fonts", "otl", otf.version, true)
otf.svgcache = containers.define("fonts", "svg", otf.version, true)
otf.pngcache = containers.define("fonts", "png", otf.version, true)
otf.pdfcache = containers.define("fonts", "pdf", otf.version, true)
+otf.mpscache = containers.define("fonts", "mps", otf.version, true)
otf.svgenabled = false
otf.pngenabled = false
@@ -491,6 +492,7 @@ local function copytotfm(data,cache_id)
parameters.ascender = abs(metadata.ascender or 0)
parameters.descender = abs(metadata.descender or 0)
parameters.units = units
+ parameters.vheight = metadata.defaultvheight
--
properties.space = spacer
properties.encodingbytes = 2
@@ -532,6 +534,9 @@ local converters = {
}
}
+-- We can get differences between daylight saving etc ... but it makes no sense to
+-- mess with trickery .. so be it when you use a different binary.
+
local function checkconversion(specification)
local filename = specification.filename
local converter = converters[lower(file.suffix(filename))]
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-oto.lua b/Master/texmf-dist/tex/context/base/mkiv/font-oto.lua
index 6f6d89d434a..6f5f2fb418f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-oto.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-oto.lua
@@ -9,16 +9,15 @@ if not modules then modules = { } end modules ['font-oto'] = { -- original tex
local concat, unpack = table.concat, table.unpack
local insert, remove = table.insert, table.remove
local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip
-local type, next, tonumber, tostring, rawget = type, next, tonumber, tostring, rawget
-
-local trace_baseinit = false trackers.register("otf.baseinit", function(v) trace_baseinit = v end)
-local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end)
-local trace_multiples = false trackers.register("otf.multiples", function(v) trace_multiples = v end)
-local trace_alternatives = false trackers.register("otf.alternatives", function(v) trace_alternatives = v end)
-local trace_ligatures = false trackers.register("otf.ligatures", function(v) trace_ligatures = v end)
------ trace_ligatures_detail = false trackers.register("otf.ligatures.detail", function(v) trace_ligatures_detail = v end)
-local trace_kerns = false trackers.register("otf.kerns", function(v) trace_kerns = v end)
-local trace_preparing = false trackers.register("otf.preparing", function(v) trace_preparing = v end)
+local type, next, tonumber, tostring = type, next, tonumber, tostring
+
+local trace_baseinit = false trackers.register("otf.baseinit", function(v) trace_baseinit = v end)
+local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end)
+local trace_multiples = false trackers.register("otf.multiples", function(v) trace_multiples = v end)
+local trace_alternatives = false trackers.register("otf.alternatives", function(v) trace_alternatives = v end)
+local trace_ligatures = false trackers.register("otf.ligatures", function(v) trace_ligatures = v end)
+local trace_kerns = false trackers.register("otf.kerns", function(v) trace_kerns = v end)
+local trace_preparing = false trackers.register("otf.preparing", function(v) trace_preparing = v end)
local report_prepare = logs.reporter("fonts","otf prepare")
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-otr.lua b/Master/texmf-dist/tex/context/base/mkiv/font-otr.lua
index e851c315704..e726053202f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-otr.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-otr.lua
@@ -65,7 +65,7 @@ if not modules then modules = { } end modules ['font-otr'] = {
-- require("char-ini")
-- end
-local next, type, tonumber = next, type, tonumber
+local next, type, tonumber, rawget = next, type, tonumber, rawget
local byte, lower, char, gsub = string.byte, string.lower, string.char, string.gsub
local fullstrip = string.fullstrip
local floor, round = math.floor, math.round
@@ -73,56 +73,54 @@ local P, R, S, C, Cs, Cc, Ct, Carg, Cmt = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.C
local lpegmatch = lpeg.match
local rshift = bit32.rshift
-local setmetatableindex = table.setmetatableindex
-local sortedkeys = table.sortedkeys
-local sortedhash = table.sortedhash
-local stripstring = string.nospaces
-local utf16_to_utf8_be = utf.utf16_to_utf8_be
-
-local report = logs.reporter("otf reader")
-
-local trace_cmap = false -- only for checking issues
-local trace_cmap_detail = false -- only for checking issues
-
--- local trace_cmap = true
--- local trace_cmap_detail = true
-
-fonts = fonts or { }
-local handlers = fonts.handlers or { }
-fonts.handlers = handlers
-local otf = handlers.otf or { }
-handlers.otf = otf
-local readers = otf.readers or { }
-otf.readers = readers
-
------ streamreader = utilities.streams -- faster on big files (not true any longer)
-local streamreader = utilities.files -- faster on identify (also uses less memory)
-local streamwriter = utilities.files
-
-readers.streamreader = streamreader
-readers.streamwriter = streamwriter
-
-local openfile = streamreader.open
-local closefile = streamreader.close
------ skipbytes = streamreader.skip
-local setposition = streamreader.setposition
-local skipshort = streamreader.skipshort
-local readbytes = streamreader.readbytes
-local readstring = streamreader.readstring
-local readbyte = streamreader.readcardinal1 -- 8-bit unsigned integer
-local readushort = streamreader.readcardinal2 -- 16-bit unsigned integer
-local readuint = streamreader.readcardinal3 -- 24-bit unsigned integer
-local readulong = streamreader.readcardinal4 -- 32-bit unsigned integer
------ readchar = streamreader.readinteger1 -- 8-bit signed integer
-local readshort = streamreader.readinteger2 -- 16-bit signed integer
-local readlong = streamreader.readinteger4 -- 32-bit unsigned integer
-local readfixed = streamreader.readfixed4
-local read2dot14 = streamreader.read2dot14 -- 16-bit signed fixed number with the low 14 bits of fraction (2.14) (F2DOT14)
-local readfword = readshort -- 16-bit signed integer that describes a quantity in FUnits
-local readufword = readushort -- 16-bit unsigned integer that describes a quantity in FUnits
-local readoffset = readushort
-local readcardinaltable = streamreader.readcardinaltable
-local readintegertable = streamreader.readintegertable
+local setmetatableindex = table.setmetatableindex
+local sortedkeys = table.sortedkeys
+local sortedhash = table.sortedhash
+local stripstring = string.nospaces
+local utf16_to_utf8_be = utf.utf16_to_utf8_be
+
+local report = logs.reporter("otf reader")
+local report_cmap = logs.reporter("otf reader","cmap")
+
+local trace_cmap = false trackers.register("otf.cmap", function(v) trace_cmap = v end)
+local trace_cmap_details = false trackers.register("otf.cmap.details", function(v) trace_cmap_details = v end)
+
+fonts = fonts or { }
+local handlers = fonts.handlers or { }
+fonts.handlers = handlers
+local otf = handlers.otf or { }
+handlers.otf = otf
+local readers = otf.readers or { }
+otf.readers = readers
+
+----- streamreader = utilities.streams -- faster on big files (not true any longer)
+local streamreader = utilities.files -- faster on identify (also uses less memory)
+local streamwriter = utilities.files
+
+readers.streamreader = streamreader
+readers.streamwriter = streamwriter
+
+local openfile = streamreader.open
+local closefile = streamreader.close
+----- skipbytes = streamreader.skip
+local setposition = streamreader.setposition
+local skipshort = streamreader.skipshort
+local readbytes = streamreader.readbytes
+local readstring = streamreader.readstring
+local readbyte = streamreader.readcardinal1 -- 8-bit unsigned integer
+local readushort = streamreader.readcardinal2 -- 16-bit unsigned integer
+local readuint = streamreader.readcardinal3 -- 24-bit unsigned integer
+local readulong = streamreader.readcardinal4 -- 32-bit unsigned integer
+----- readchar = streamreader.readinteger1 -- 8-bit signed integer
+local readshort = streamreader.readinteger2 -- 16-bit signed integer
+local readlong = streamreader.readinteger4 -- 32-bit unsigned integer
+local readfixed = streamreader.readfixed4
+local read2dot14 = streamreader.read2dot14 -- 16-bit signed fixed number with the low 14 bits of fraction (2.14) (F2DOT14)
+local readfword = readshort -- 16-bit signed integer that describes a quantity in FUnits
+local readufword = readushort -- 16-bit unsigned integer that describes a quantity in FUnits
+local readoffset = readushort
+local readcardinaltable = streamreader.readcardinaltable
+local readintegertable = streamreader.readintegertable
function streamreader.readtag(f)
return lower(stripstring(readstring(f,4)))
@@ -1213,18 +1211,18 @@ readers.vmtx = function(f,fontdata,specification)
local glyphs = fontdata.glyphs
local nofglyphs = fontdata.nofglyphs
local vheight = 0
- local vdefault = verticalheader.ascender + verticalheader.descender
+ local vdefault = verticalheader.ascender - verticalheader.descender
local topsidebearing = 0
for i=0,nofmetrics-1 do
local glyph = glyphs[i]
- vheight = readshort(f)
+ vheight = readushort(f)
topsidebearing = readshort(f)
if vheight ~= 0 and vheight ~= vdefault then
glyph.vheight = vheight
end
- -- if topsidebearing ~= 0 then
- -- glyph.tsb = topsidebearing
- -- end
+ if topsidebearing ~= 0 then
+ glyph.tsb = topsidebearing
+ end
end
-- The next can happen in for instance a monospace font or in a cjk font
-- with fixed heights.
@@ -1233,9 +1231,6 @@ readers.vmtx = function(f,fontdata,specification)
if vheight ~= 0 and vheight ~= vdefault then
glyph.vheight = vheight
end
- -- if topsidebearing ~= 0 then
- -- glyph.tsb = topsidebearing
- -- end
end
end
end
@@ -1320,32 +1315,23 @@ local formatreaders = { }
local duplicatestoo = true
local sequence = {
+ -- these is some provision against redundant loading
{ 3, 1, 4 },
{ 3, 10, 12 },
{ 0, 3, 4 },
+ { 0, 3, 12 },
{ 0, 1, 4 },
- -- { 0, 4, 12 },
+ { 0, 1, 12 }, -- for some old mac fonts
{ 0, 0, 6 },
{ 3, 0, 6 },
+ { 3, 0, 4 }, -- for (likely) old crap
-- variants
{ 0, 5, 14 },
-- last resort ranges
-{ 0, 4, 12 },
+ { 0, 4, 12 },
{ 3, 10, 13 },
}
--- local sequence = {
--- { 0, 1, 4 },
--- { 0, 4, 12 },
--- { 0, 3, 4 },
--- { 3, 1, 4 },
--- { 3, 10, 12 },
--- { 0, 0, 6 },
--- { 3, 0, 6 },
--- -- variants
--- { 0, 5, 14 },
--- }
-
local supported = { }
for i=1,#sequence do
@@ -1398,7 +1384,7 @@ formatreaders[4] = function(f,fontdata,offset)
elseif offset == 0xFFFF then
-- bad encoding
elseif offset == 0 then
- if trace_cmap_detail then
+ if trace_cmap_details then
report("format 4.%i segment %2i from %C upto %C at index %H",1,segment,startchar,endchar,(startchar + delta) % 65536)
end
for unicode=startchar,endchar do
@@ -1431,8 +1417,8 @@ formatreaders[4] = function(f,fontdata,offset)
end
else
local shift = (segment-nofsegments+offset/2) - startchar
- if trace_cmap_detail then
- report("format 4.%i segment %2i from %C upto %C at index %H",0,segment,startchar,endchar,(startchar + delta) % 65536)
+ if trace_cmap_details then
+ report_cmap("format 4.%i segment %2i from %C upto %C at index %H",0,segment,startchar,endchar,(startchar + delta) % 65536)
end
for unicode=startchar,endchar do
local slot = shift + unicode
@@ -1481,8 +1467,8 @@ formatreaders[6] = function(f,fontdata,offset)
local count = readushort(f)
local stop = start+count-1
local nofdone = 0
- if trace_cmap_detail then
- report("format 6 from %C to %C",2,start,stop)
+ if trace_cmap_details then
+ report_cmap("format 6 from %C to %C",2,start,stop)
end
for unicode=start,stop do
local index = readushort(f)
@@ -1518,8 +1504,8 @@ formatreaders[12] = function(f,fontdata,offset)
local first = readulong(f)
local last = readulong(f)
local index = readulong(f)
- if trace_cmap_detail then
- report("format 12 from %C to %C starts at index %i",first,last,index)
+ if trace_cmap_details then
+ report_cmap("format 12 from %C to %C starts at index %i",first,last,index)
end
for unicode=first,last do
local glyph = glyphs[index]
@@ -1562,8 +1548,8 @@ formatreaders[13] = function(f,fontdata,offset)
local last = readulong(f)
local index = readulong(f)
if first < privateoffset then
- if trace_cmap_detail then
- report("format 13 from %C to %C get index %i",first,last,index)
+ if trace_cmap_details then
+ report_cmap("format 13 from %C to %C get index %i",first,last,index)
end
local glyph = glyphs[index]
local unicode = glyph.unicode
@@ -1649,27 +1635,46 @@ formatreaders[14] = function(f,fontdata,offset)
end
local function checkcmap(f,fontdata,records,platform,encoding,format)
- local data = records[platform]
- if not data then
+ local pdata = records[platform]
+ if not pdata then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","no platform",platform,encoding,format)
+ end
return 0
end
- data = data[encoding]
- if not data then
+ local edata = pdata[encoding]
+ if not edata then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","no encoding",platform,encoding,format)
+ end
return 0
end
- data = data[format]
- if not data then
+ local fdata = edata[format]
+ if not fdata then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","no format",platform,encoding,format)
+ end
+ return 0
+ elseif type(fdata) ~= "number" then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","already done",platform,encoding,format)
+ end
return 0
end
+ edata[format] = true -- done
local reader = formatreaders[format]
if not reader then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","unsupported format",platform,encoding,format)
+ end
return 0
end
- local p = platforms[platform]
- local e = encodings[p]
- local n = reader(f,fontdata,data) or 0
- if trace_cmap then
- report("cmap checked: platform %i (%s), encoding %i (%s), format %i, new unicodes %i",platform,p,encoding,e and e[encoding] or "?",format,n)
+ local n = reader(f,fontdata,fdata) or 0
+ if trace_cmap_details or trace_cmap then
+ local p = platforms[platform]
+ local e = encodings[p]
+ report_cmap("checked, platform %i (%s), encoding %i (%s), format %i, new unicodes %i",
+ platform,p,encoding,e and e[encoding] or "?",format,n)
end
return n
end
@@ -1904,6 +1909,7 @@ local function getinfo(maindata,sub,platformnames,rawfamilynames,metricstoo,inst
local postscript = fontdata.postscript or { }
local fontheader = fontdata.fontheader or { }
local cffinfo = fontdata.cffinfo or { }
+ local verticalheader = fontdata.verticalheader or { }
local filename = fontdata.filename
local weight = getname(fontdata,"weight") or (cffinfo and cffinfo.weight) or (metrics and metrics.weight)
local width = getname(fontdata,"width") or (cffinfo and cffinfo.width ) or (metrics and metrics.width )
@@ -1973,6 +1979,7 @@ local function getinfo(maindata,sub,platformnames,rawfamilynames,metricstoo,inst
platformnames = platformnames or nil,
instancenames = instancenames or nil,
tableoffsets = fontdata.tableoffsets,
+ defaultvheight = (verticalheader.ascender or 0) - (verticalheader.descender or 0)
}
if metricstoo then
local keys = {
@@ -2073,9 +2080,7 @@ end
local function readtable(tag,f,fontdata,specification,...)
local reader = readers[tag]
if reader then
- -- local t = os.clock()
reader(f,fontdata,specification,...)
- -- report("reading table %a took %0.4f seconds",tag,os.clock()-t)
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-ots.lua b/Master/texmf-dist/tex/context/base/mkiv/font-ots.lua
index b9f719a5fd8..c4f89c156be 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-ots.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-ots.lua
@@ -177,7 +177,6 @@ registertracker("otf.sample.silent", "otf.steps=silent","otf.substitutions","otf
local nuts = nodes.nuts
-local getfield = nuts.getfield
local getnext = nuts.getnext
local setnext = nuts.setnext
local getprev = nuts.getprev
@@ -185,8 +184,6 @@ local setprev = nuts.setprev
local getboth = nuts.getboth
local setboth = nuts.setboth
local getid = nuts.getid
-local getattr = nuts.getattr
-local setattr = nuts.setattr
local getprop = nuts.getprop
local setprop = nuts.setprop
local getsubtype = nuts.getsubtype
@@ -195,12 +192,16 @@ local getchar = nuts.getchar
local setchar = nuts.setchar
local getdisc = nuts.getdisc
local setdisc = nuts.setdisc
+local getreplace = nuts.getreplace
local setlink = nuts.setlink
local getcomponents = nuts.getcomponents -- the original one, not yet node-aux
local setcomponents = nuts.setcomponents -- the original one, not yet node-aux
local getwidth = nuts.getwidth
+local getattr = nuts.getattr
+
+local getglyphdata = nuts.getglyphdata
-local ischar = nuts.is_char
+local ischar = nuts.ischar
local isglyph = nuts.isglyph
local usesfont = nuts.uses_font
@@ -212,6 +213,7 @@ local find_node_tail = nuts.tail
local flush_node_list = nuts.flush_list
local flush_node = nuts.flush_node
local end_of_math = nuts.end_of_math
+local start_of_par = nuts.start_of_par
local setmetatable = setmetatable
local setmetatableindex = table.setmetatableindex
@@ -2089,7 +2091,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
if keepdisc then
keepdisc = false
lookaheaddisc = current
- local replace = getfield(current,"replace")
+ local replace = getreplace(current)
if not replace then
sweepoverflow = true
sweepnode = current
@@ -2166,7 +2168,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
lookaheaddisc = current
end
-- we assume a simple text only replace (we could use nuts.count)
- local replace = getfield(current,"replace")
+ local replace = getreplace(current)
while replace and i < s do
if getid(replace) == glyph_code then
i = i + 1
@@ -2212,7 +2214,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
backtrackdisc = current
end
-- we assume a simple text only replace (we could use nuts.count)
- local replace = getfield(current,"replace")
+ local replace = getreplace(current)
while replace and i > 1 do
if getid(replace) == glyph_code then
i = i - 1
@@ -3177,7 +3179,7 @@ local function testrun(disc,t_run,c_run,...)
end
local pre, post, replace, pretail, posttail, replacetail = getdisc(disc,true)
local renewed = false
- if (post or replace) and prev then
+ if (post or replace) then -- and prev then -- hm, we can start with a disc
if post then
setlink(posttail,next)
else
@@ -3291,7 +3293,7 @@ end
-- discretionaries (maybe we need to tag those some day). So, at least for now, we don't
-- have the following test in the sub runs:
--
--- -- local a = getattr(start,0)
+-- -- local a = getglyhpdata(start)
-- -- if a then
-- -- a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
-- -- else
@@ -3301,7 +3303,7 @@ end
--
-- but use this instead:
--
--- -- local a = getattr(start,0)
+-- -- local a = getglyphdata(start)
-- -- if not a or (a == attr) then
--
-- and even that one is probably not needed. However, we can handle interesting
@@ -3327,7 +3329,7 @@ local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlm
if char then
local a -- happens often so no assignment is faster
if attr then
- a = getattr(start,0)
+ a = getglyphdata(start)
end
if not a or (a == attr) then
local lookupmatch = lookupcache[char]
@@ -3367,7 +3369,7 @@ local function t_run_single(start,stop,font,attr,lookupcache)
if char then
local a -- happens often so no assignment is faster
if attr then
- a = getattr(start,0)
+ a = getglyphdata(start)
end
local startnext = getnext(start)
if not a or (a == attr) then
@@ -3385,7 +3387,7 @@ local function t_run_single(start,stop,font,attr,lookupcache)
-- how about post ... we can probably merge this into the while
while getid(s) == disc_code do
ss = getnext(s)
- s = getfield(s,"replace")
+ s = getreplace(s)
if not s then
s = ss
ss = nil
@@ -3412,12 +3414,13 @@ local function t_run_single(start,stop,font,attr,lookupcache)
end
while getid(s) == disc_code do
ss = getnext(s)
- s = getfield(s,"replace")
+ s = getreplace(s)
if not s then
s = ss
ss = nil
end
end
+lookupmatch = lg
else
break
end
@@ -3451,7 +3454,7 @@ end
local function k_run_single(sub,injection,last,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
local a -- happens often so no assignment is faster
if attr then
- a = getattr(sub,0)
+ a = getglyphdata(sub)
end
if not a or (a == attr) then
for n in nextnode, sub do -- only gpos
@@ -3487,7 +3490,7 @@ local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlm
if char then
local a -- happens often so no assignment is faster
if attr then
- a = getattr(start,0)
+ a = getglyphdata(start)
end
if not a or (a == attr) then
for i=1,nofsteps do
@@ -3535,7 +3538,7 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
if char then
local a -- happens often so no assignment is faster
if attr then
- a = getattr(start,0)
+ a = getglyphdata(start)
end
local startnext = getnext(start)
if not a or (a == attr) then
@@ -3554,7 +3557,7 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
end
while getid(s) == disc_code do
ss = getnext(s)
- s = getfield(s,"replace")
+ s = getreplace(s)
if not s then
s = ss
ss = nil
@@ -3581,12 +3584,13 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
end
while getid(s) == disc_code do
ss = getnext(s)
- s = getfield(s,"replace")
+ s = getreplace(s)
if not s then
s = ss
ss = nil
end
end
+lookupmatch = lg
else
break
end
@@ -3616,7 +3620,7 @@ end
local function k_run_multiple(sub,injection,last,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
local a -- happens often so no assignment is faster
if attr then
- a = getattr(sub,0)
+ a = getglyphdata(sub)
end
if not a or (a == attr) then
for n in nextnode, sub do -- only gpos
@@ -3709,7 +3713,7 @@ do
-- reference:
--
- -- local a = attr and getattr(start,0)
+ -- local a = attr and getglyphdata(start)
-- if a then
-- a = (a == attr) and (not attribute or getprop(start,a_state) == attribute)
-- else
@@ -3720,7 +3724,7 @@ do
--
-- local a -- happens often so no assignment is faster
-- if attr then
- -- if getattr(start,0) == attr and (not attribute or getprop(start,a_state) == attribute) then
+ -- if getglyphdata(start) == attr and (not attribute or getprop(start,a_state) == attribute) then
-- a = true
-- end
-- elseif not attribute or getprop(start,a_state) == attribute then
@@ -3801,7 +3805,7 @@ do
local initialrl = 0
- if getid(head) == localpar_code and getsubtype(head) == 0 then
+ if getid(head) == localpar_code and start_of_par(head) then
initialrl = pardirstate(head)
elseif direction == 1 or direction == "TRT" then
initialrl = -1
@@ -3860,7 +3864,7 @@ do
if m then
local a -- happens often so no assignment is faster
if attr then
- a = getattr(start,0)
+ a = getglyphdata(start)
end
if not a or (a == attr) then
for i=m[1],m[2] do
@@ -3907,7 +3911,7 @@ do
if lookupmatch then
local a -- happens often so no assignment is faster
if attr then
- if getattr(start,0) == attr and (not attribute or getprop(start,a_state) == attribute) then
+ if getglyphdata(start) == attr and (not attribute or getprop(start,a_state) == attribute) then
a = true
end
elseif not attribute or getprop(start,a_state) == attribute then
@@ -3955,7 +3959,7 @@ do
elseif id == dir_code then
topstack, rlmode = txtdirstate(start,dirstack,topstack,rlparmode)
start = getnext(start)
- -- elseif id == localpar_code then
+ -- elseif id == localpar_code and start_of_par(start) then
-- rlparmode, rlmode = pardirstate(start)
-- start = getnext(start)
else
@@ -3974,7 +3978,7 @@ do
if m then
local a -- happens often so no assignment is faster
if attr then
- if getattr(start,0) == attr and (not attribute or getprop(start,a_state) == attribute) then
+ if getglyphdata(start) == attr and (not attribute or getprop(start,a_state) == attribute) then
a = true
end
elseif not attribute or getprop(start,a_state) == attribute then
@@ -4039,7 +4043,7 @@ do
elseif id == dir_code then
topstack, rlmode = txtdirstate(start,dirstack,topstack,rlparmode)
start = getnext(start)
- -- elseif id == localpar_code then
+ -- elseif id == localpar_code and start_of_par(start) then
-- rlparmode, rlmode = pardirstate(start)
-- start = getnext(start)
else
@@ -4150,7 +4154,7 @@ do
elseif id == dir_code then
topstack, rlmode = txtdirstate(start,dirstack,topstack,rlparmode)
start = getnext(start)
- -- elseif id == localpar_code then
+ -- elseif id == localpar_code and start_of_par(start) then
-- rlparmode, rlmode = pardirstate(start)
-- start = getnext(start)
else
@@ -4231,9 +4235,26 @@ registerotffeature {
}
}
+-- Moved here (up) a bit. This doesn't really belong in generic so it will
+-- move to a context module some day.
+
+local function markinitializer(tfmdata,value)
+ local properties = tfmdata.properties
+ properties.checkmarks = value
+end
+
+registerotffeature {
+ name = "checkmarks",
+ description = "check mark widths",
+ default = true,
+ initializers = {
+ node = markinitializer,
+ },
+}
+
-- This can be used for extra handlers, but should be used with care! We implement one
-- here but some more can be found in the osd (script devanagary) file. Now watch out:
--- when a handlers has steps, it is called as the other ones, but when we have no steps,
+-- when a handler has steps, it is called as the other ones, but when we have no steps,
-- we use a different call:
--
-- function(head,dataset,sequence,initialrl,font,attr)
@@ -4244,22 +4265,28 @@ registerotffeature {
otf.handlers = handlers
+if context then
+ return
+else
+ -- todo: move the following code someplace else
+end
+
local setspacekerns = nodes.injections.setspacekerns if not setspacekerns then os.exit() end
-local tag = "kern" -- maybe some day a merge
+local tag = "kern"
-if fontfeatures then
+-- if fontfeatures then
- function handlers.trigger_space_kerns(head,dataset,sequence,initialrl,font,attr)
- local features = fontfeatures[font]
- local enabled = features and features.spacekern and features[tag]
- if enabled then
- setspacekerns(font,sequence)
- end
- return head, enabled
- end
+-- function handlers.trigger_space_kerns(head,dataset,sequence,initialrl,font,attr)
+-- local features = fontfeatures[font]
+-- local enabled = features and features.spacekern and features[tag]
+-- if enabled then
+-- setspacekerns(font,sequence)
+-- end
+-- return head, enabled
+-- end
-else -- generic (no hashes)
+-- else -- generic (no hashes)
function handlers.trigger_space_kerns(head,dataset,sequence,initialrl,font,attr)
local shared = fontdata[font].shared
@@ -4271,7 +4298,7 @@ else -- generic (no hashes)
return head, enabled
end
-end
+-- end
-- There are fonts out there that change the space but we don't do that kind of
-- things in TeX.
@@ -4389,7 +4416,7 @@ local function spaceinitializer(tfmdata,value) -- attr
if rules then
-- not now: analyze (simple) rules
elseif not coverage then
- -- nothng to do
+ -- nothing to do
elseif kind == "gpos_single" then
-- makes no sense in TeX
elseif kind == "gpos_pair" then
@@ -4473,17 +4500,3 @@ registerotffeature {
node = spaceinitializer,
},
}
-
-local function markinitializer(tfmdata,value)
- local properties = tfmdata.properties
- properties.checkmarks = value
-end
-
-registerotffeature {
- name = "checkmarks",
- description = "check mark widths",
- default = true,
- initializers = {
- node = markinitializer,
- },
-}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-ott.lua b/Master/texmf-dist/tex/context/base/mkiv/font-ott.lua
index 10420f6eeb1..c9e467f2253 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-ott.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-ott.lua
@@ -27,14 +27,19 @@ local statistics = otf.statistics or { }
otf.statistics = statistics
local scripts = allocate {
+ ["adlm"] = "adlam",
+ ["aghb"] = "caucasian albanian",
+ ["ahom"] = "ahom",
["arab"] = "arabic",
["armi"] = "imperial aramaic",
["armn"] = "armenian",
["avst"] = "avestan",
["bali"] = "balinese",
["bamu"] = "bamum",
+ ["bass"] = "bassa vah",
["batk"] = "batak",
["beng"] = "bengali",
+ ["bhks"] = "bhaiksuki",
["bng2"] = "bengali variant 2",
["bopo"] = "bopomofo",
["brah"] = "brahmi",
@@ -50,23 +55,33 @@ local scripts = allocate {
["copt"] = "coptic",
["cprt"] = "cypriot syllabary",
["cyrl"] = "cyrillic",
- ["deva"] = "devanagari",
["dev2"] = "devanagari variant 2",
+ ["deva"] = "devanagari",
+ ["dogr"] = "dogra",
["dsrt"] = "deseret",
+ ["dupl"] = "duployan",
["egyp"] = "egyptian heiroglyphs",
+ ["elba"] = "elbasan",
["ethi"] = "ethiopic",
["geor"] = "georgian",
+ ["gjr2"] = "gujarati variant 2",
["glag"] = "glagolitic",
+ ["gong"] = "gunjala gondi",
+ ["gonm"] = "masaram gondi",
["goth"] = "gothic",
+ ["gran"] = "grantha",
["grek"] = "greek",
["gujr"] = "gujarati",
- ["gjr2"] = "gujarati variant 2",
- ["guru"] = "gurmukhi",
["gur2"] = "gurmukhi variant 2",
+ ["guru"] = "gurmukhi",
["hang"] = "hangul",
["hani"] = "cjk ideographic",
["hano"] = "hanunoo",
+ ["hatr"] = "hatran",
["hebr"] = "hebrew",
+ ["hluw"] = "anatolian hieroglyphs",
+ ["hmng"] = "pahawh hmong",
+ ["hung"] = "old hungarian",
["ital"] = "old italic",
["jamo"] = "hangul jamo",
["java"] = "javanese",
@@ -74,49 +89,77 @@ local scripts = allocate {
["kana"] = "hiragana and katakana",
["khar"] = "kharosthi",
["khmr"] = "khmer",
- ["knda"] = "kannada",
+ ["khoj"] = "khojki",
["knd2"] = "kannada variant 2",
+ ["knda"] = "kannada",
["kthi"] = "kaithi",
["lana"] = "tai tham",
["lao" ] = "lao",
["latn"] = "latin",
["lepc"] = "lepcha",
["limb"] = "limbu",
+ ["lina"] = "linear a",
["linb"] = "linear b",
["lisu"] = "lisu",
["lyci"] = "lycian",
["lydi"] = "lydian",
+ ["mahj"] = "mahajani",
+ ["maka"] = "makasar",
["mand"] = "mandaic and mandaean",
+ ["mani"] = "manichaean",
+ ["marc"] = "marchen",
["math"] = "mathematical alphanumeric symbols",
+ ["medf"] = "medefaidrin",
+ ["mend"] = "mende kikakui",
["merc"] = "meroitic cursive",
["mero"] = "meroitic hieroglyphs",
- ["mlym"] = "malayalam",
["mlm2"] = "malayalam variant 2",
+ ["mlym"] = "malayalam",
+ ["modi"] = "modi",
["mong"] = "mongolian",
+ ["mroo"] = "mro",
["mtei"] = "meitei Mayek",
+ ["mult"] = "multani",
["musc"] = "musical symbols",
["mym2"] = "myanmar variant 2",
["mymr"] = "myanmar",
+ ["narb"] = "old north arabian",
+ ["nbat"] = "nabataean",
+ ["newa"] = "newa",
["nko" ] = 'n"ko',
+ ["nshu"] = "nüshu",
["ogam"] = "ogham",
["olck"] = "ol chiki",
["orkh"] = "old turkic and orkhon runic",
- ["orya"] = "oriya",
["ory2"] = "odia variant 2",
+ ["orya"] = "oriya",
+ ["osge"] = "osage",
["osma"] = "osmanya",
+ ["palm"] = "palmyrene",
+ ["pauc"] = "pau cin hau",
+ ["perm"] = "old permic",
["phag"] = "phags-pa",
["phli"] = "inscriptional pahlavi",
+ ["phlp"] = "psalter pahlavi",
["phnx"] = "phoenician",
+ ["plrd"] = "miao",
["prti"] = "inscriptional parthian",
["rjng"] = "rejang",
+ ["rohg"] = "hanifi rohingya",
["runr"] = "runic",
["samr"] = "samaritan",
["sarb"] = "old south arabian",
["saur"] = "saurashtra",
+ ["sgnw"] = "sign writing",
["shaw"] = "shavian",
["shrd"] = "sharada",
+ ["sidd"] = "siddham",
+ ["sind"] = "khudawadi",
["sinh"] = "sinhala",
+ ["sogd"] = "sogdian",
+ ["sogo"] = "old sogdian",
["sora"] = "sora sompeng",
+ ["soyo"] = "soyombo",
["sund"] = "sundanese",
["sylo"] = "syloti nagri",
["syrc"] = "syriac",
@@ -125,20 +168,24 @@ local scripts = allocate {
["tale"] = "tai le",
["talu"] = "tai lu",
["taml"] = "tamil",
+ ["tang"] = "tangut",
["tavt"] = "tai viet",
- ["telu"] = "telugu",
["tel2"] = "telugu variant 2",
+ ["telu"] = "telugu",
["tfng"] = "tifinagh",
["tglg"] = "tagalog",
["thaa"] = "thaana",
["thai"] = "thai",
["tibt"] = "tibetan",
+ ["tirh"] = "tirhuta",
["tml2"] = "tamil variant 2",
["ugar"] = "ugaritic cuneiform",
["vai" ] = "vai",
+ ["wara"] = "warang citi",
["xpeo"] = "old persian cuneiform",
["xsux"] = "sumero-akkadian cuneiform",
["yi" ] = "yi",
+ ["zanb"] = "zanabazar square",
}
local languages = allocate {
@@ -208,12 +255,15 @@ local languages = allocate {
["brm" ] = "burmese",
["brx" ] = "bodo",
["bsh" ] = "bashkir",
+ ["bsk" ] = "burushaski",
["bti" ] = "beti",
["bts" ] = "batak simalungun",
["bug" ] = "bugis",
+ ["byv" ] = "medumba",
["cak" ] = "kaqchikel",
["cat" ] = "catalan",
["cbk" ] = "zamboanga chavacano",
+ ["cchn"] = "chinantec",
["ceb" ] = "cebuano",
["cgg" ] = "chiga",
["cha" ] = "chamorro",
@@ -228,6 +278,8 @@ local languages = allocate {
["chr" ] = "cherokee",
["chu" ] = "chuvash",
["chy" ] = "cheyenne",
+ ["cja" ] = "western cham",
+ ["cjm" ] = "eastern cham",
["cmr" ] = "comorian",
["cop" ] = "coptic",
["cor" ] = "cornish",
@@ -283,6 +335,7 @@ local languages = allocate {
["fin" ] = "finnish",
["fji" ] = "fijian",
["fle" ] = "dutch (flemish)",
+ ["fmp" ] = "fe’fe’",
["fne" ] = "forest nenets",
["fon" ] = "fon",
["fos" ] = "faroese",
@@ -361,6 +414,7 @@ local languages = allocate {
["jan" ] = "japanese",
["jav" ] = "javanese",
["jbo" ] = "lojban",
+ ["jct" ] = "krymchak",
["jii" ] = "yiddish",
["jud" ] = "ladino",
["jul" ] = "jula",
@@ -397,6 +451,7 @@ local languages = allocate {
["kmn" ] = "kumaoni",
["kmo" ] = "komo",
["kms" ] = "komso",
+ ["kmz" ] = "khorasani turkic",
["knr" ] = "kanuri",
["kod" ] = "kodagu",
["koh" ] = "korean old hangul",
@@ -473,6 +528,7 @@ local languages = allocate {
["mar" ] = "marathi",
["maw" ] = "marwari",
["mbn" ] = "mbundu",
+ ["mbo" ] = "mbo",
["mch" ] = "manchu",
["mcr" ] = "moose cree",
["mde" ] = "mende",
@@ -489,6 +545,7 @@ local languages = allocate {
["mle" ] = "male",
["mlg" ] = "malagasy",
["mln" ] = "malinke",
+ ["mlr" ] = "malayalam reformed",
["mly" ] = "malay",
["mnd" ] = "mandinka",
["mng" ] = "mongolian",
@@ -542,6 +599,7 @@ local languages = allocate {
["nto" ] = "esperanto",
["nym" ] = "nyamwezi",
["nyn" ] = "norwegian nynorsk",
+ ["nza" ] = "mbembe tigon",
["oci" ] = "occitan",
["ocr" ] = "oji-cree",
["ojb" ] = "ojibway",
@@ -605,6 +663,7 @@ local languages = allocate {
["say" ] = "sayisi",
["scn" ] = "sicilian",
["sco" ] = "scots",
+ ["scs" ] = "north slavey",
["sek" ] = "sekota",
["sel" ] = "selkup",
["sga" ] = "old irish",
@@ -649,6 +708,9 @@ local languages = allocate {
["sxu" ] = "upper saxon",
["syl" ] = "sylheti",
["syr" ] = "syriac",
+ ["syre"] = "estrangela syriac",
+ ["syrj"] = "western syriac",
+ ["syrn"] = "eastern syriac",
["szl" ] = "silesian",
["tab" ] = "tabasaran",
["taj" ] = "tajiki",
@@ -680,6 +742,7 @@ local languages = allocate {
["tsj" ] = "tshangla",
["tua" ] = "turoyo aramaic",
["tul" ] = "tulu",
+ ["tum" ] = "tulu",
["tuv" ] = "tuvin",
["tvl" ] = "tuvalu",
["twi" ] = "twi",
@@ -705,6 +768,7 @@ local languages = allocate {
["wel" ] = "welsh",
["wlf" ] = "wolof",
["wln" ] = "walloon",
+ ["wtm" ] = "mewati",
["xbd" ] = "lü",
["xhs" ] = "xhosa",
["xjb" ] = "minjangbal",
@@ -730,6 +794,7 @@ local languages = allocate {
["zza" ] = "zazaki",
}
+
local features = allocate {
["aalt"] = "access all alternates",
["abvf"] = "above-base forms",
@@ -869,6 +934,7 @@ local features = allocate {
["vkna"] = "vertical kana alternates",
["vkrn"] = "vertical kerning",
["vpal"] = "proportional alternate vertical metrics",
+ ["vrtr"] = "vertical alternates for rotation",
["vrt2"] = "vertical rotation",
["zero"] = "slashed zero",
@@ -879,8 +945,9 @@ local features = allocate {
["cv.."] = "character variant ..",
["js.."] = "justification ..",
- ["dv.."] = "devanagari ..",
- ["ml.."] = "malayalam ..",
+ ["dv.."] = "devanagari ..", -- for internal use
+ ["ml.."] = "malayalam ..", -- for internal use
+
}
local baselines = allocate {
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-oup.lua b/Master/texmf-dist/tex/context/base/mkiv/font-oup.lua
index d1faadbf712..0e7e25808ca 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-oup.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-oup.lua
@@ -720,6 +720,10 @@ local function checklookups(fontdata,missing,nofmissing)
end
end
+local firstprivate = fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000
+local puafirst = 0xE000
+local pualast = 0xF8FF
+
local function unifymissing(fontdata)
if not fonts.mappings then
require("font-map")
@@ -730,20 +734,22 @@ local function unifymissing(fontdata)
resources.unicodes = unicodes
for unicode, d in next, fontdata.descriptions do
if unicode < privateoffset then
- local name = d.name
- if name then
- unicodes[name] = unicode
+ if unicode >= puafirst and unicode <= pualast then
+ -- report_unicodes("resolving private unicode %U",unicode)
+ else
+ local name = d.name
+ if name then
+ unicodes[name] = unicode
+ end
end
+ else
+ -- report_unicodes("resolving private unicode %U",unicode)
end
end
fonts.mappings.addtounicode(fontdata,fontdata.filename,checklookups)
resources.unicodes = nil
end
-local firstprivate = fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000
-local puafirst = 0xE000
-local pualast = 0xF8FF
-
local function unifyglyphs(fontdata,usenames)
local private = fontdata.private or privateoffset
local glyphs = fontdata.glyphs
@@ -1573,16 +1579,34 @@ function readers.pack(data)
if kind == "gpos_pair" then
local c = step.coverage
if c then
- if step.format == "pair" then
+ if step.format ~= "pair" then
+ for g1, d1 in next, c do
+ c[g1] = pack_normal(d1)
+ end
+ elseif step.shared then
+ -- This branch results from classes. We already share at the reader end. Maybe
+ -- the sharing should be moved there altogether but it becomes kind of messy
+ -- then. Here we're still wasting time because in the second pass we serialize
+ -- and hash. So we compromise. We could merge the two passes ...
+ local shared = { }
for g1, d1 in next, c do
for g2, d2 in next, d1 do
- local f = d2[1] if f and f ~= true then d2[1] = pack_indexed(f) end
- local s = d2[2] if s and s ~= true then d2[2] = pack_indexed(s) end
+ if not shared[d2] then
+ local f = d2[1] if f and f ~= true then d2[1] = pack_indexed(f) end
+ local s = d2[2] if s and s ~= true then d2[2] = pack_indexed(s) end
+ shared[d2] = true
+ end
end
end
+ if pass == 2 then
+ step.shared = nil -- weird, so dups
+ end
else
for g1, d1 in next, c do
- c[g1] = pack_normal(d1)
+ for g2, d2 in next, d1 do
+ local f = d2[1] if f and f ~= true then d2[1] = pack_indexed(f) end
+ local s = d2[2] if s and s ~= true then d2[2] = pack_indexed(s) end
+ end
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-pre.mkiv b/Master/texmf-dist/tex/context/base/mkiv/font-pre.mkiv
index c1c24b8544f..721c4c6ebcb 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-pre.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-pre.mkiv
@@ -497,14 +497,18 @@
[boldened]
[boldened-30]
-%D Emoji:
+%D Emoji etc:
\definefontfeature[bandw:overlay][ccmp=yes,dist=yes]
\definefontfeature[color:overlay][ccmp=yes,dist=yes,colr=yes]
%definefontfeature[bandw:svg] [ccmp=yes,dist=yes]
\definefontfeature[color:svg] [ccmp=yes,dist=yes,svg=yes]
%definefontfeature[bandw:bitmap] [ccmp=yes,dist=yes,sbix=yes]
-\definefontfeature[color:bitmap] [ccmp=yes,dist=yes,sbix=yes]
+\definefontfeature[color:bitmap] [ccmp=yes,dist=yes,sbix=yes] % also cblc
+
+% Plus an automatic one:
+
+\definefontfeature[color] [ccmp=yes,dist=yes,color=auto]
%D We define some colors that are used in tracing (for instance \OPENTYPE\
%D features). We cannot yet inherit because no colors are predefined.
@@ -755,6 +759,8 @@
\definealternativestyle [italicface] [\italicface] []
\definealternativestyle [swapface] [\swapface] []
+\definealternativestyle [emphasize] [\em] [\em] % new
+
% For Alan:
\definealternativestyle
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-prv.lua b/Master/texmf-dist/tex/context/base/mkiv/font-prv.lua
index 20c06d2e54e..c3323ca743e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-prv.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-prv.lua
@@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['font-prv'] = {
license = "see context related readme files"
}
-local type = type
+local type, rawget = type, rawget
local formatters = string.formatters
local fonts = fonts
@@ -76,3 +76,7 @@ end
function helpers.privateslot(name)
return rawget(sharedprivates,name)
end
+
+function helpers.newprivateslot(name)
+ return sharedprivates[name]
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-run.mkiv b/Master/texmf-dist/tex/context/base/mkiv/font-run.mkiv
index 610f2e62c95..2f6cd32df9f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-run.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-run.mkiv
@@ -158,7 +158,7 @@
{\vss
\hpack to \scratchdimenone
{\dummy
- \ifdim\interwordspace=\zeropoint
+ \ifzeropt\interwordspace
\setbox##1\hpack
{\raise.5\dp##1\hpack
{\lower.5\ht##1\copy##1}}%
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-shp.lua b/Master/texmf-dist/tex/context/base/mkiv/font-shp.lua
index d5c194c858e..3d2e5b7c902 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-shp.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-shp.lua
@@ -17,12 +17,16 @@ local pfb = fonts.handlers.pfb
local hashes = fonts.hashes
local identifiers = hashes.identifiers
-local version = 0.007
+local version = 0.009
local shapescache = containers.define("fonts", "shapes", version, true)
local streamscache = containers.define("fonts", "streams", version, true)
-- shapes (can be come a separate file at some point)
+local compact_streams = false
+
+directives.register("fonts.streams.compact", function(v) compact_streams = v end)
+
local function packoutlines(data,makesequence)
local subfonts = data.subfonts
if subfonts then
@@ -40,26 +44,27 @@ local function packoutlines(data,makesequence)
return
end
if makesequence then
--- for index=1,#glyphs do
- for index=0,#glyphs-1 do
+ for index=0,#glyphs do
local glyph = glyphs[index]
- local segments = glyph.segments
- if segments then
- local sequence = { }
- local nofsequence = 0
- for i=1,#segments do
- local segment = segments[i]
- local nofsegment = #segment
- -- why last first ... needs documenting
- nofsequence = nofsequence + 1
- sequence[nofsequence] = segment[nofsegment]
- for i=1,nofsegment-1 do
+ if glyph then
+ local segments = glyph.segments
+ if segments then
+ local sequence = { }
+ local nofsequence = 0
+ for i=1,#segments do
+ local segment = segments[i]
+ local nofsegment = #segment
+ -- why last first ... needs documenting
nofsequence = nofsequence + 1
- sequence[nofsequence] = segment[i]
+ sequence[nofsequence] = segment[nofsegment]
+ for i=1,nofsegment-1 do
+ nofsequence = nofsequence + 1
+ sequence[nofsequence] = segment[i]
+ end
end
+ glyph.sequence = sequence
+ glyph.segments = nil
end
- glyph.sequence = sequence
- glyph.segments = nil
end
end
else
@@ -67,32 +72,36 @@ local function packoutlines(data,makesequence)
local common = { }
local reverse = { }
local last = 0
--- for index=1,#glyphs do
- for index=0,#glyphs-1 do
- local segments = glyphs[index].segments
- if segments then
- for i=1,#segments do
- local h = concat(segments[i]," ")
- hash[h] = (hash[h] or 0) + 1
+ for index=0,#glyphs do
+ local glyph = glyphs[index]
+ if glyph then
+ local segments = glyph.segments
+ if segments then
+ for i=1,#segments do
+ local h = concat(segments[i]," ")
+ hash[h] = (hash[h] or 0) + 1
+ end
end
end
end
--- for index=1,#glyphs do
- for index=0,#glyphs-1 do
- local segments = glyphs[index].segments
- if segments then
- for i=1,#segments do
- local segment = segments[i]
- local h = concat(segment," ")
- if hash[h] > 1 then -- minimal one shared in order to hash
- local idx = reverse[h]
- if not idx then
- last = last + 1
- reverse[h] = last
- common[last] = segment
- idx = last
+ for index=0,#glyphs do
+ local glyph = glyphs[index]
+ if glyph then
+ local segments = glyph.segments
+ if segments then
+ for i=1,#segments do
+ local segment = segments[i]
+ local h = concat(segment," ")
+ if hash[h] > 1 then -- minimal one shared in order to hash
+ local idx = reverse[h]
+ if not idx then
+ last = last + 1
+ reverse[h] = last
+ common[last] = segment
+ idx = last
+ end
+ segments[i] = idx
end
- segments[i] = idx
end
end
end
@@ -119,14 +128,16 @@ local function unpackoutlines(data)
if not glyphs then
return
end
--- for index=1,#glyphs do
- for index=0,#glyphs-1 do
- local segments = glyphs[index].segments
- if segments then
- for i=1,#segments do
- local c = common[segments[i]]
- if c then
- segments[i] = c
+ for index=0,#glyphs do
+ local glyph = glyphs[index]
+ if glyph then
+ local segments = glyph.segments
+ if segments then
+ for i=1,#segments do
+ local c = common[segments[i]]
+ if c then
+ segments[i] = c
+ end
end
end
end
@@ -202,6 +213,11 @@ local function loadoutlines(cache,filename,sub,instance)
return data
end
+local function cachethem(cache,hash,data)
+ containers.write(cache,hash,data,compact_streams) -- arg 4 aka fast
+ return containers.read(cache,hash) -- frees old mem
+end
+
local function loadstreams(cache,filename,sub,instance)
local base = file.basename(filename)
local name = file.removesuffix(base)
@@ -210,7 +226,7 @@ local function loadstreams(cache,filename,sub,instance)
local size = attr and attr.size or 0
local time = attr and attr.modification or 0
local sub = tonumber(sub)
- if size > 0 and (kind == "otf" or kind == "ttf" or kind == "tcc") then
+ if size > 0 and (kind == "otf" or kind == "ttf" or kind == "ttc") then
local hash = makehash(filename,sub,instance)
data = containers.read(cache,hash)
if not data or data.time ~= time or data.size ~= size then
@@ -219,8 +235,13 @@ local function loadstreams(cache,filename,sub,instance)
local glyphs = data.glyphs
local streams = { }
if glyphs then
- for i=0,#glyphs-1 do
- streams[i] = glyphs[i].stream or ""
+ for i=0,#glyphs do
+ local glyph = glyphs[i]
+ if glyph then
+ streams[i] = glyph.stream or ""
+ else
+ streams[i] = ""
+ end
end
end
data.streams = streams
@@ -228,8 +249,7 @@ local function loadstreams(cache,filename,sub,instance)
data.size = size
data.format = data.format or (kind == "otf" and "opentype") or "truetype"
data.time = time
- containers.write(cache,hash,data)
- data = containers.read(cache,hash) -- frees old mem
+ data = cachethem(cache,hash,data)
end
end
elseif size > 0 and (kind == "pfb") then
@@ -283,8 +303,7 @@ local function loadstreams(cache,filename,sub,instance)
weight = metadata.weight,
},
}
- containers.write(cache,hash,data)
- data = containers.read(cache,hash) -- frees old mem
+ data = cachethem(cache,hash,data)
end
end
else
@@ -333,8 +352,11 @@ end
local function loadstreamdata(fontdata)
local properties = fontdata.properties
+ local shared = fontdata.shared
+ local rawdata = shared and shared.rawdata
+ local metadata = rawdata and rawdata.metadata
local filename = properties.filename
- local subindex = fontdata.subindex
+ local subindex = metadata and metadata.subfontindex
local instance = properties.instance
local hash = makehash(filename,subindex,instance)
local loaded = loadedstreams[hash]
@@ -348,26 +370,18 @@ end
hashes.streams = table.setmetatableindex(function(t,k)
local f = identifiers[k]
if f then
- return loadstreamdata(f,true)
+ return loadstreamdata(f)
end
end)
otf.loadoutlinedata = loadoutlinedata -- not public
otf.loadstreamdata = loadstreamdata -- not public
otf.loadshapes = loadshapes
-otf.getstreamhash = getstreamhash -- not public, might move to other namespace
+otf.getstreamhash = getstreamhash -- not public, might move to other namespace
--- experimental code, for me only ... unsupported (todo: use %N)
-
-local f_c = formatters["%F %F %F %F %F %F c"]
-local f_l = formatters["%F %F l"]
-local f_m = formatters["%F %F m"]
-
-directives.register("pdf.stripzeros",function()
- f_c = formatters["%N %N %N %N %N %N c"]
- f_l = formatters["%N %N l"]
- f_m = formatters["%N %N m"]
-end)
+local f_c = formatters["%.6N %.6N %.6N %.6N %.6N %.6N c"]
+local f_l = formatters["%.6N %.6N l"]
+local f_m = formatters["%.6N %.6N m"]
local function segmentstopdf(segments,factor,bt,et)
local t = { }
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-sol.lua b/Master/texmf-dist/tex/context/base/mkiv/font-sol.lua
index 002f9df131f..2017afcb225 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-sol.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-sol.lua
@@ -82,6 +82,7 @@ local hpack_nodes = nuts.hpack
local insert_node_before = nuts.insert_before
local insert_node_after = nuts.insert_after
local protect_glyphs = nuts.protect_glyphs
+local start_of_par = nuts.start_of_par
local nextnode = nuts.traversers.next
local nexthlist = nuts.traversers.hlist
@@ -434,7 +435,7 @@ function splitters.split(head) -- best also pass the direction
end
local direction, pop = getdirection(current)
r2l = not pop and direction == righttoleft
- elseif id == localpar_code and getsubtype(current) == 0 then
+ elseif id == localpar_code and start_of_par(current) then
if start then
flush() -- very unlikely as this starts a paragraph
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-sty.mklx b/Master/texmf-dist/tex/context/base/mkiv/font-sty.mklx
new file mode 100644
index 00000000000..81884333bb1
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-sty.mklx
@@ -0,0 +1,458 @@
+%D \module
+%D [ file=font-sty,
+%D version=2011.01.13, % (copied fron font-ini)
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Styles,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Font Macros / Styles}
+
+\unprotect
+
+%D \macros
+%D {definealternativestyle}
+%D
+%D In the main modules we are going to implement lots of parameterized commands and
+%D one of these parameters will concern the font to use. To suit consistent use of
+%D fonts we here implement a mechanism for defining the keywords that present a
+%D particular style or alternative.
+%D
+%D \starttyping
+%D \definealternativestyle [keywords] [\style] [\nostyle]
+%D \stoptyping
+%D
+%D The first command is used in the normal textflow, while the second command takes
+%D care of headings and alike. Consider the next two definitions:
+%D
+%D \starttyping
+%D \definealternativestyle [bold] [\bf] []
+%D \definealternativestyle [cap] [\cap] [\cap]
+%D \stoptyping
+%D
+%D A change \type {\bf} in a heading which is to be set in \type {\tfd} does not look
+%D that well, so therefore we leave the second argument of \type
+%D {\definealternativestyle} empty. When we capatalize characters using the pseudo
+%D small cap command \type {\cap}, we want this to take effect in both text and
+%D headings, which is accomplished by assigning both arguments.
+
+\installcorenamespace{alternativestyles} % settings
+\installcorenamespace{alternativestyle} % instances
+
+\installsetuponlycommandhandler \??alternativestyles {alternativestyles}
+
+\setnewconstant \c_font_current_alternative_style_index \plusone
+
+\unexpanded\def\definealternativestyle
+ {\dotripleempty\font_basics_define_alternative_style}
+
+\def\font_basics_define_alternative_style[#commands][#variantone][#varianttwo]%
+ {\processcommalist[#commands]{\font_basics_define_alternative_style_indeed{#variantone}{#varianttwo}}}
+
+\let\definestyle\definealternativestyle % later redefined
+
+\newconstant\c_fonts_basics_alternative_style_method
+
+\def\font_basics_define_alternative_style_indeed#variantone#varianttwo#command%
+ {\setuvalue{\??alternativestyle#command}{\font_helpers_apply_alternative_style{#variantone}{#varianttwo}}%
+ \ifcsname#command\endcsname
+ % no redefinition
+ \orelse\ifnum\c_fonts_basics_alternative_style_method=\plusone
+ \ifthirdargument
+ \setuevalue{#command}{\triggergroupedcommandcs\begincsname\??alternativestyle#command\endcsname}%
+ \else
+ \setuvalue{#command}{\triggergroupedcommand{#variantone}}%
+ \fi
+ \else
+ \setuvalue{#command}{\triggergroupedcommand{#variantone}}%
+ \fi}
+
+\def\font_helpers_apply_alternative_style
+ {\ifcase\c_font_current_alternative_style_index
+ \expandafter\gobbletwoarguments
+ \or
+ \expandafter\firstoftwoarguments
+ \or
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\def\applyalternativestyle#name% public
+ {\begincsname\??alternativestyle#name\endcsname}
+
+\appendtoks
+ \doifelse{\alternativestylesparameter\c!method}\v!auto
+ {\c_fonts_basics_alternative_style_method\plusone}%
+ {\c_fonts_basics_alternative_style_method\zerocount}%
+\to \everysetupalternativestyles
+
+%D Maybe too generic, but probably ok is the following. (Maybe one day we will use a
+%D dedicated grouped command for styles.)
+
+% \appendtoks
+% \let\groupedcommand\thirdofthreearguments
+% \to \everysimplifycommands
+
+%D This command also defines the keyword as command. This means that the example
+%D definition of \type {bold} we gave before, results in a command \type {\bold}
+%D which can be used as:
+%D
+%D \startbuffer
+%D He's a \bold{bold} man with a {\bold head}.
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or
+%D
+%D \startexample
+%D \definealternativestyle[bold][\bf][]\getbuffer
+%D \stopexample
+%D
+%D Such definitions are of course unwanted for \type {\cap} because this would
+%D result in an endless recursive call. Therefore we check on the existance of both
+%D the command and the substitution. The latter is needed because for instance \type
+%D {\type} is an entirely diferent command. That command handles verbatim, while the
+%D style command would just switch to teletype font. This is just an example of a
+%D tricky naming coincidence.
+%D
+%D \macros
+%D {doconvertfont,noconvertfont,
+%D dontconvertfont,redoconvertfont}
+%D
+%D After having defined such keywords, we can call for them by using
+%D
+%D \starttyping
+%D \doconvertfont{keyword}{text}
+%D \stoptyping
+%D
+%D We deliberately pass an argument. This enables us to assign converters that
+%D handle one argument, like \type {\cap}.
+%D
+%D By default the first specification is used to set the style, exept when we say
+%D \type {\dontconvertfont}, after which the second specification is used. We can
+%D also directly call for \type {\noconvertfont}. In nested calls, we can restore
+%D the conversion by saying \type {\redoconvertfont}.
+%D
+%D These commands are not grouped! Grouping is most probably done by the calling
+%D macro's and would lead to unnecessary overhead.
+
+\let\m_current_convert_font \empty
+\let\m_current_convert_font_dt\empty
+
+\unexpanded\def\doconvertfont#specification% takes second argument / this command is obsolete
+ {\edef\m_current_convert_font{#specification}%
+ \ifx\m_current_convert_font\empty
+ %\expandafter\firstofoneargument
+ \else
+ \expandafter\font_helpers_do_convert_font
+ \fi}
+
+\def\font_helpers_do_convert_font
+ {\edef\m_current_convert_font_dt{\detokenize\expandafter{\m_current_convert_font}}%
+ \ifcsname\??alternativestyle\m_current_convert_font_dt\endcsname
+ \expandafter\lastnamedcs
+ \orelse\ifcsname\m_current_convert_font_dt\endcsname
+ \expandafter\lastnamedcs
+ \else
+ \expandafter\m_current_convert_font
+ \fi}
+
+%D Low level switches (downward compatible, but we keep them as one can use them in
+%D styles):
+%D
+%D \starttyping
+%D \usemodule[abr-02]
+%D \setuphead[chapter][style=\bfb]
+%D \setupfooter[style=\dontconvertfont\bf]
+%D \chapter{This is \TEX}
+%D \stoptyping
+
+\unexpanded\def\dontconvertfont{\c_font_current_alternative_style_index\plustwo} % needs checking in usage
+\unexpanded\def\redoconvertfont{\c_font_current_alternative_style_index\plusone} % needs checking in usage
+
+%D The new one:
+
+\setfalse\fontattributeisset
+
+\unexpanded\def\dousestyleparameter#value%
+ {\edef\currentstyleparameter{#value}%
+ \ifx\currentstyleparameter\empty\else
+ \expandafter\dousecurrentstyleparameter
+ \fi}
+
+\unexpanded\def\dousestylehashparameter#hash#parameter%
+ {\ifcsname#hash#parameter\endcsname
+ \expandafter\dousestyleparameter\lastnamedcs
+ \fi}
+
+\unexpanded\def\dousecurrentstyleparameter % empty check outside here
+ {\edef\detokenizedstyleparameter{\detokenize\expandafter{\currentstyleparameter}}%
+ \settrue\fontattributeisset % reset is done elsewhere
+ \ifcsname\??alternativestyle\detokenizedstyleparameter\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\detokenizedstyleparameter\endcsname
+ \lastnamedcs
+ \else
+ \currentstyleparameter
+ \fi}
+
+\let\dosetfontattribute\dousestylehashparameter % for a while
+
+%D New commands (not yet interfaced):
+%D
+%D \startbuffer
+%D \definestyle[one][style=bold,color=darkblue]
+%D
+%D test \one{test} test
+%D test \style[one]{test} test
+%D test \style[color=red]{test} test
+%D test \style[Serif at 20pt]{test} test
+%D \stopbuffer
+%D
+%D \typebuffer \startlines \getbuffer \stoplines
+
+% definitions .. no tagging here
+
+\installcorenamespace{style}
+\installcorenamespace{stylecheck}
+\installcorenamespace{stylehack}
+
+\installcommandhandler \??style {style} \??style
+
+\setupstyle
+ [%\c!style=,
+ %\c!color=,
+ \c!method=\v!command]
+
+\appendtoks
+ \letvalue{\??stylecheck\currentstyle}\relax
+ \edef\p_method{\styleparameter\c!method}%
+ \ifx\p_method\v!command
+ \setuevalue{\e!start\currentstyle}{\font_styles_apply_start{\currentstyle}}%
+ \setuevalue{\e!stop \currentstyle}{\font_styles_apply_stop}%
+ \setuevalue {\currentstyle}{\font_styles_apply_grouped{\currentstyle}}% no longer groupedcommand here
+ \fi
+\to \everydefinestyle
+
+\unexpanded\def\font_styles_apply_start#name%
+ {\begingroup
+ \font_styles_use_defined{#name}}
+
+\unexpanded\def\font_styles_apply_stop
+ {\endgroup}
+
+\unexpanded\def\font_styles_apply_grouped#name% assumes that the next is { or \bgroup
+ {\bgroup
+ \def\g_style{\font_styles_use_defined{#name}}%
+ \afterassignment\g_style
+ \let\nexttoken}
+
+\unexpanded\def\font_styles_use_defined#name%
+ {\edef\currentstyle{#name}%
+ \usestylestyleandcolor\c!style\c!color}
+
+\unexpanded\def\font_styles_use_generic#specification%
+ {\let\currentstyle\s!unknown % reasonable generic tag
+ \letstyleparameter\c!style\empty
+ \letstyleparameter\c!color\empty
+ \setupcurrentstyle[#specification]%
+ \usestylestyleandcolor\c!style\c!color}
+
+% commands
+
+\installcorenamespace{styleargument}
+
+\unexpanded\def\style[#name]% as this is can be a switch we use groupedcommand
+ {\csname\??styleargument
+ \ifcsname\??stylecheck#name\endcsname
+ 2% defined as style
+ \orelse\ifcsname\??stylehack#name\endcsname
+ 4% defined as command
+ \orelse\ifcsname#name\endcsname
+ 1% defined as command
+ \else
+ 3% specification
+ \fi
+ \endcsname{#name}}
+
+% \setvalue{\??styleargument1}#name%
+% {\groupedcommand{\begincsname#name\endcsname}{}}
+
+\setvalue{\??styleargument1}#name%
+ {\expandafter\triggergroupedcommandcs\begincsname#name\endcsname}
+
+% \setvalue{\??styleargument2}#name%
+% {\groupedcommand{\font_styles_use_defined{#name}}{}} % or {\font_styles_apply_grouped{#name}}
+
+\setvalue{\??styleargument2}#name%
+ {\triggergroupedcommand{\font_styles_use_defined{#name}}} % or {\font_styles_apply_grouped{#name}}
+
+\setvalue{\??styleargument3}#specification%
+ {\doifelseassignment{#specification}\font_styles_assignment\font_styles_direct{#specification}}
+
+\setvalue{\??styleargument4}#name%
+ {\expandafter\triggergroupedcommandcs\begincsname\??stylehack#name\endcsname}
+
+\setvalue{\??stylehack\s!math}% dirty trick
+ {\groupedcommand\normalstartimath\normalstopimath}
+
+% \def\font_styles_assignment#specification{\groupedcommand{\font_styles_use_generic{#specification}}{}}
+% \def\font_styles_direct #specification{\groupedcommand{\definedfont[#specification]}{}}
+
+\def\font_styles_assignment#specification{\triggergroupedcommand{\font_styles_use_generic{#specification}}}
+\def\font_styles_direct #specification{\triggergroupedcommand{\definedfont[#specification]}}
+
+% environments
+
+\installcorenamespace{styleenvironment}
+
+\unexpanded\def\startstyle[#name]%
+ {\begingroup
+ \csname\??styleenvironment
+ \ifcsname\??stylecheck#name\endcsname
+ 2% defined as style
+ \orelse\ifcsname#name\endcsname
+ 1% defined as command
+ \else
+ 3% specification
+ \fi
+ \endcsname{#name}}
+
+\unexpanded\def\stopstyle
+ {\endgroup
+ \autoinsertnextspace} % will be configurable, maybe also in \definestartstop
+
+\setvalue{\??styleenvironment1}#name%
+ {\csname#name\endcsname}
+
+\setvalue{\??styleenvironment2}#name%
+ {\font_styles_use_defined{#name}}
+
+\setvalue{\??styleenvironment3}#specification%
+ {\doifelseassignment{#specification}\font_styles_start_assignment\font_styles_start_direct{#specification}}
+
+\def\font_styles_start_assignment#specification{\font_styles_use_generic{#specification}}
+\def\font_styles_start_direct #specification{\definedfont[#specification]\relax}
+
+%D Still experimental (might even go away).
+
+% \definestylecollection[mine]
+
+% \definestyleinstance[mine][default][sorry]
+% \definestyleinstance[mine][tt][bs][ttbs:\rm\sl]
+% \definestyleinstance[mine][tt][bf][ttbf:\rm\sl]
+% \definestyleinstance[mine][bf][\sl]
+% \definestyleinstance[mine][sl][\tt]
+
+% {\bf test \mine test \sl test \mine test \bs oeps \mine oeps {\tt test \mine \bf test}}
+
+\installcorenamespace{stylecollection}
+
+\unexpanded\def\definestylecollection
+ {\dosingleargument\font_styles_define_style_collection}
+
+\def\font_styles_define_style_collection[#name]%
+ {\iffirstargument
+ \setuvalue{#name}{\styleinstance[#name]}%
+ \def\font_styles_define_style_collection_a#style%
+ {\def\font_styles_define_style_collection_b#alternative{\undefinevalue{\??stylecollection#name:#style:#alternative}}%
+ \font_helpers_process_alternative_list\font_styles_define_style_collection_b
+ \font_styles_define_style_collection_b\s!default}%
+ \font_helpers_process_style_list\font_styles_define_style_collection_a
+ \font_styles_define_style_collection_a\s!default
+ \fi}
+
+\let\font_styles_define_style_collection_a\relax
+\let\font_styles_define_style_collection_b\relax
+
+\unexpanded\def\definestyleinstance
+ {\doquadrupleargument\font_styles_define_style_instance}
+
+\def\font_styles_define_style_instance[#instance][#2][#3][#4]% [name] [rm|ss|tt|..] [sl|bf|...] [whatever]
+ {\iffirstargument
+ \ifcsname#instance\endcsname\else\font_styles_define_style_collection[#instance]\fi
+ \fi
+ \iffourthargument
+ \setvalue{\??stylecollection#instance:#2:#3}{#4}%
+ \orelse\ifthirdargument
+ \setvalue{\??stylecollection#instance::#2}{#3}%
+ \orelse\ifsecondargument
+ \letvalueempty{\??stylecollection#instance::#2}%
+ \fi}
+
+% \unexpanded\def\styleinstance[#instance]% will be made faster
+% {%\begingroup\normalexpanded{\noexpand\infofont[#1:\fontstyle:\fontalternative]}\endgroup
+% \executeifdefined{\??stylecollection#instance:\fontstyle:\fontalternative}%
+% {\executeifdefined{\??stylecollection#instance:\fontstyle:\s!default}%
+% {\executeifdefined{\??stylecollection#instance::\fontalternative}
+% {\getvalue {\??stylecollection#instance::\s!default}}}}}
+
+\unexpanded\def\styleinstance[#instance]% maybe \lastnamedcs here too
+ {\csname\??stylecollection#instance:%
+ \ifcsname\??stylecollection#instance:\fontstyle:\fontalternative\endcsname
+ \fontstyle:\fontalternative
+ \orelse\ifcsname\??stylecollection#instance:\fontstyle:\s!default\endcsname
+ \fontstyle:\s!default
+ \orelse\ifcsname\??stylecollection#instance::\fontalternative\endcsname
+ :\fontalternative
+ \else
+ :\s!default
+ \fi
+ \endcsname}
+
+%D Variant selectors
+%D
+%D \starttyping
+%D \mathematics {\vsone{\utfchar{0x2229}}}
+%D \mathematics {\utfchar{0x2229}\vsone{}}
+%D \stoptyping
+
+\unexpanded\edef\vsone#character{#character\normalUchar"FE00 } % used
+\unexpanded\edef\vstwo#character{#character\normalUchar"FE01 } % not used but handy for testing
+
+%D For historic reasons we keep the following around but they are no longer that
+%D relevant for \MKIV.
+
+\unexpanded\def\doattributes#1#2#3#4%
+ {\begingroup % geen \bgroup, anders in mathmode lege \hbox
+ \dousestylehashparameter{#1}{#2}%
+ \dousecolorhashparameter{#1}{#3}%
+ #4%
+ \endgroup}
+
+\unexpanded\def\dostartattributes#1#2#3%
+ {\begingroup % geen \bgroup, anders in mathmode lege \hbox
+ \dousestylehashparameter{#1}{#2}%
+ \dousecolorhashparameter{#1}{#3}}
+
+\let\dostopattributes\endgroup
+
+%D New but it needs to be supported explicitly (as in natural tables).
+
+\newconditional\c_font_styles_math
+
+\unexpanded\def\font_styles_math_reset
+ {\setfalse\c_font_styles_math}
+
+\unexpanded\def\font_styles_math_start
+ {\ifconditional\c_font_styles_math
+ \startimath
+ \fi
+ \relax}
+
+\unexpanded\def\font_styles_math_stop
+ {\relax
+ \ifconditional\c_font_styles_math
+ \stopimath
+ \fi}
+
+\definealternativestyle[\v!math][\settrue\c_font_styles_math]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-sty.mkvi b/Master/texmf-dist/tex/context/base/mkiv/font-sty.mkvi
index 8200aa95748..a24194355e2 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-sty.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-sty.mkvi
@@ -222,6 +222,7 @@
\installcorenamespace{style}
\installcorenamespace{stylecheck}
+\installcorenamespace{stylehack}
\installcommandhandler \??style {style} \??style
@@ -272,11 +273,13 @@
{\csname\??styleargument
\ifcsname\??stylecheck#name\endcsname
2% defined as style
+ \else\ifcsname\??stylehack#name\endcsname
+ 4% defined as command
\else\ifcsname#name\endcsname
1% defined as command
\else
3% specification
- \fi\fi
+ \fi\fi\fi
\endcsname{#name}}
% \setvalue{\??styleargument1}#name%
@@ -294,6 +297,12 @@
\setvalue{\??styleargument3}#specification%
{\doifelseassignment{#specification}\font_styles_assignment\font_styles_direct{#specification}}
+\setvalue{\??styleargument4}#name%
+ {\expandafter\triggergroupedcommandcs\begincsname\??stylehack#name\endcsname}
+
+\setvalue{\??stylehack\s!math}% dirty trick
+ {\groupedcommand\normalstartimath\normalstopimath}
+
% \def\font_styles_assignment#specification{\groupedcommand{\font_styles_use_generic{#specification}}{}}
% \def\font_styles_direct #specification{\groupedcommand{\definedfont[#specification]}{}}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-sym.mklx b/Master/texmf-dist/tex/context/base/mkiv/font-sym.mklx
new file mode 100644
index 00000000000..33f8a62da7b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-sym.mklx
@@ -0,0 +1,245 @@
+%D \module
+%D [ file=font-mat,
+%D version=2011.01.13, % (copied fron font-ini)
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Symbolic Access,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Font Macros / Symbolic Access}
+
+\unprotect
+
+%D \macros
+%D {getglyph, symbolicfont}
+%D
+%D Individual glyphs can be accessed by using
+%D
+%D \starttyping
+%D \getglyph{fontname}{character}
+%D \stoptyping
+%D
+%D This macro is used in for instance the symbol modules and as one can see, it does
+%D obey the small and even smaller sizes. The \type {\symbolicfont} macro can be
+%D used to switch to a font named \type {fontname} (see \type {cont-log} and \type
+%D {symb-eur} for examples of symbolic definitions.
+
+\def\v_font_string_a
+ {\ifx\fontstyle\s!rm \s!Serif \orelse
+ \ifx\fontstyle\s!ss \s!Sans \orelse
+ \ifx\fontstyle\s!tt \s!Mono \else
+ \s!Serif \fi}
+
+\def\v_font_string_b
+ {\ifx\fontstyle\s!rm \s!Regular \orelse
+ \ifx\fontstyle\s!ss \s!Support \orelse
+ \ifx\fontstyle\s!tt \s!Type \else
+ \s!Serif \fi}
+
+\def\v_font_string_c
+ {\ifx\fontalternative\s!bf \s!Bold \orelse
+ \ifx\fontalternative\s!sl \s!Slanted \orelse
+ \ifx\fontalternative\s!it \s!Italic \orelse
+ \ifx\fontalternative\s!bs \s!BoldSlanted \orelse
+ \ifx\fontalternative\s!bi \s!BoldItalic \fi}
+
+\let\v_font_string_d\s!Serif % default fontstyle (will be redefined in type-ini)
+
+\definefontsynonym
+ [CurrentFont]
+ [\noexpand\v_font_string_a\noexpand\v_font_string_c]
+
+% potential generalization:
+%
+% \letvalue{\??fontfile:t:\s!rm}\s!Serif
+% \letvalue{\??fontfile:t:\s!ss}\s!Sans
+% \letvalue{\??fontfile:t:\s!tt}\s!Mono
+%
+% \letvalue{\??fontfile:a:\s!rm}\s!Regular
+% \letvalue{\??fontfile:a:\s!ss}\s!Support
+% \letvalue{\??fontfile:a:\s!tt}\s!Type
+%
+% \letvalue{\??fontfile:s:\s!bf}\s!Bold
+% \letvalue{\??fontfile:s:\s!sl}\s!Slanted
+% \letvalue{\??fontfile:s:\s!it}\s!Italic
+% \letvalue{\??fontfile:s:\s!bs}\s!BoldSlanted
+% \letvalue{\??fontfile:s:\s!bi}\s!BoldItalic
+%
+% \def\v_font_string_a{\executeifdefined{\??fontfile:t:\fontstyle}\s!Serif}
+% \def\v_font_string_a{\executeifdefined{\??fontfile:t:\fontstyle}\s!Serif}
+% \def\v_font_string_b{\executeifdefined{\??fontfile:a:\fontstyle}\s!Serif}
+% \def\v_font_string_c{\executeifdefined{\??fontfile:s:\fontstyle}\empty}
+% \def\v_font_string_d{\executeifdefined{\??fontfile:t:\csname\??typescriptdefaultstyles\fontclass\endcsname}\s!Serif}
+
+%D \macros
+%D {fontstylesuffix}
+%D
+%D The next macro is used to map non latin fontnames on fonts. See \type
+%D {font-uni} for an example of its use.
+
+\def\fontstylesuffix% why the \s!Regular ? see \getglyph
+ {\ifx\fontalternative\s!tf \s!Regular \orelse
+ \ifx\fontalternative\s!bf \s!Bold \orelse
+ \ifx\fontalternative\s!sl \s!Slanted \orelse
+ \ifx\fontalternative\s!it \s!Italic \orelse
+ \ifx\fontalternative\s!bs \s!BoldSlanted \orelse
+ \ifx\fontalternative\s!bi \s!BoldItalic \orelse
+ \ifx\fontalternative\s!sc \s!Caps \else
+ \s!Regular \fi}
+
+\def\glyphfontfile#base% appends
+ {#base%
+ \ifcsname\??fontfile#base\v_font_string_a\v_font_string_c\endcsname
+ \v_font_string_a\v_font_string_c
+ \orelse\ifcsname\??fontfile#base\v_font_string_b\v_font_string_c\endcsname
+ \v_font_string_b\v_font_string_c
+ \orelse\ifcsname\??fontfile#base\v_font_string_a\endcsname
+ \v_font_string_a
+ \orelse\ifcsname\??fontfile#base\v_font_string_b\endcsname
+ \v_font_string_b
+ \orelse\ifcsname\??fontfile#base\v_font_string_c\endcsname
+ \v_font_string_c
+ \fi}
+
+%D The next macro can be used to make decisions based on the shape:
+
+\def\doifelseitalic#yes#nop%
+ {\ifx\fontalternative\s!sl#yes\orelse
+ \ifx\fontalternative\s!it#yes\orelse
+ \ifx\fontalternative\s!bs#yes\orelse
+ \ifx\fontalternative\s!bi#yes\else#nop\fi}
+
+\let\doifitalicelse\doifelseitalic
+
+%D For an example of usage of the following command, see \type {cont-log.tex}.
+%D
+%D \starttyping
+%D \def\symbolicfont#specification{\definedfont[\glyphfontfile{#specification} sa *]}
+%D \stoptyping
+%D
+%D Since we know what scaling it to be applied, we can implement a much faster
+%D alternative:
+
+\installcorenamespace{symbolfont}
+
+\let\thedefinedfont\relax
+
+\def\setscaledstyledsymbolicfont#1#2#3% quite a slowdown, glyphfontfile
+ {\edef\askedsymbolfont{\truefontname{\glyphfontfile{#3}} at \the\dimexpr#2\dimexpr\currentfontbodyscale\dimexpr#1}%
+ \ifcsname\??symbolfont\askedsymbolfont\endcsname
+ \lastnamedcs
+ \else
+ \font_basics_define_symbolic_font
+ \fi}
+
+\def\setscaleddirectsymbolicfont#1#2#3% quite a slowdown, glyphfontfile
+ {\edef\askedsymbolfont{\truefontname{#3} at \the\dimexpr#2\dimexpr\currentfontbodyscale\dimexpr#1}%
+ \ifcsname\??symbolfont\askedsymbolfont\endcsname
+ \lastnamedcs
+ \else
+ \font_basics_define_symbolic_font
+ \fi}
+
+\def\setstyledsymbolicfont#fontname% quite a slowdown, glyphfontfile
+ {\edef\askedsymbolfont{\truefontname{\glyphfontfile{#fontname}} at \the\dimexpr\currentfontbodyscale\dimexpr\fontbody}%
+ \ifcsname\??symbolfont\askedsymbolfont\endcsname
+ \lastnamedcs
+ \else
+ \font_basics_define_symbolic_font
+ \fi}
+
+\def\setdirectsymbolicfont#fontname%
+ {\edef\askedsymbolfont{\truefontname{#fontname} at \the\dimexpr\currentfontbodyscale\dimexpr\fontbody}%
+ \ifcsname\??symbolfont\askedsymbolfont\endcsname
+ \lastnamedcs
+ \else
+ \font_basics_define_symbolic_font
+ \fi}
+
+\def\font_basics_define_symbolic_font
+ {\definefont[currentsymbolfont][\askedsymbolfont]%
+ \currentsymbolfont
+ \expandafter\glet\csname\??symbolfont\askedsymbolfont\endcsname\lastrawfontcall}
+
+\unexpanded\def\getnamedglyphstyled#fontname#character{{\setstyledsymbolicfont{#fontname}\clf_fontchar{#character}}}
+\unexpanded\def\getnamedglyphdirect#fontname#character{{\setdirectsymbolicfont{#fontname}\clf_fontchar{#character}}}
+\unexpanded\def\getglyphstyled #fontname#character{{\setstyledsymbolicfont{#fontname}\doifelsenumber{#character}\char\donothing#character}}
+\unexpanded\def\getglyphdirect #fontname#character{{\setdirectsymbolicfont{#fontname}\doifelsenumber{#character}\char\donothing#character}}
+\unexpanded\def\resolvedglyphstyled#fontname#character{{\setstyledsymbolicfont{#fontname}\clf_tochar{#character}}}
+\unexpanded\def\resolvedglyphdirect#fontname#character{{\setdirectsymbolicfont{#fontname}\clf_tochar{#character}}}
+
+% this one is wrong:
+
+\unexpanded\def\getscaledglyph#scale#name#content%
+ {{\setscaledstyledsymbolicfont\fontbody{#scale}{#name}\doifelsenumber{#content}\char\donothing#content}}
+
+\let\getglyph \getglyphstyled % old
+\let\getrawglyph \getglyphdirect % old
+\let\symbolicsizedfont\setscaledstyledsymbolicfont % old
+\let\symbolicfont \setstyledsymbolicfont % old
+
+\unexpanded\def\symbolicscaledfont{\setsscaledstyledsymbolicfont\fontbody}
+\unexpanded\def\symbolicscaledfont{\setscaledstyledsymbolicfont\fontbody}
+
+%D The last implementation of \type {\getglyph} permits definitions like:
+%D
+%D \starttyping
+%D \definefontsynonym [EuroSans] [eurose]
+%D \definefontsynonym [EuroSansBold] [euroseb]
+%D \definefontsynonym [EuroSansItalic] [eurosei]
+%D \definefontsynonym [EuroSansSlanted] [eurosei]
+%D \definefontsynonym [EuroSansBoldItalic] [eurosebi]
+%D \definefontsynonym [EuroSansBoldSlanted] [eurosebi]
+%D
+%D \definesymbol [euro] [\getglyph{Euro}{\char160}]
+%D
+%D \def\euro{\symbol[euro]}
+%D \stoptyping
+%D
+%D These definitions guarantee that the next calls work okay:
+%D
+%D \starttyping
+%D \ss \tf\euro \bf\euro \sla\euro \itd\euro \bs\euro \bic\euro
+%D \stoptyping
+%D
+%D The shape as well as the size is adapted to the current environment.
+
+%D \macros
+%D {setfont}
+%D
+%D Every now and then we want to define a font directly, for instance when we
+%D typeset title pages. The next macro saves some typing:
+
+\unexpanded\def\setfont% geen \font_helpers_set_font mogelijk
+ {\afterassignment\font_basics_set_font\font\nextfont=}
+
+\def\font_basics_set_font
+ {\nextfont\setupinterlinespace}% hm, we need to use \setuplocalinterlinespace
+
+%D One can call this macro as:
+%D
+%D \starttyping
+%D \setfont cmr10 at 60pt
+%D \stoptyping
+%D
+%D After which the font is active and the baselines and struts are set.
+
+%D \macros{doiffontcharelse}
+
+\unexpanded\def\doifelsefontchar#specification#unicode% this could be a direct lua call
+ {\begingroup
+ \font_basics_define_font_without_parameters{thedefinedfont}{#specification}%
+ \iffontchar\font#unicode\relax
+ \endgroup\expandafter\firstoftwoarguments
+ \else
+ \endgroup\expandafter\secondoftwoarguments
+ \fi}
+
+\let\doiffontcharelse\doifelsefontchar
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-sym.mkvi b/Master/texmf-dist/tex/context/base/mkiv/font-sym.mkvi
index 3ff85fb4a84..b6479535b3a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-sym.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-sym.mkvi
@@ -24,12 +24,10 @@
%D \getglyph{fontname}{character}
%D \stoptyping
%D
-%D This macro is used in for instance the symbol modules and
-%D as one can see, it does obey the small and even smaller
-%D sizes. The \type {\symbolicfont} macro can be used to
-%D switch to a font named \type {fontname} (see \type
-%D {cont-log} and \type {symb-eur} for examples of symbolic
-%D definitions.
+%D This macro is used in for instance the symbol modules and as one can see, it does
+%D obey the small and even smaller sizes. The \type {\symbolicfont} macro can be
+%D used to switch to a font named \type {fontname} (see \type {cont-log} and \type
+%D {symb-eur} for examples of symbolic definitions.
\def\v_font_string_a
{\ifx\fontstyle\s!rm \s!Serif \else
@@ -118,15 +116,14 @@
\let\doifitalicelse\doifelseitalic
-%D For an example of usage of the following command,
-%D see \type {cont-log.tex}.
+%D For an example of usage of the following command, see \type {cont-log.tex}.
%D
%D \starttyping
%D \def\symbolicfont#specification{\definedfont[\glyphfontfile{#specification} sa *]}
%D \stoptyping
%D
-%D Since we know what scaling it to be applied, we can
-%D implement a much faster alternative:
+%D Since we know what scaling it to be applied, we can implement a much faster
+%D alternative:
\installcorenamespace{symbolfont}
@@ -189,8 +186,7 @@
\unexpanded\def\symbolicscaledfont{\setsscaledstyledsymbolicfont\fontbody}
\unexpanded\def\symbolicscaledfont{\setscaledstyledsymbolicfont\fontbody}
-%D The last implementation of \type {\getglyph} permits
-%D definitions like:
+%D The last implementation of \type {\getglyph} permits definitions like:
%D
%D \starttyping
%D \definefontsynonym [EuroSans] [eurose]
@@ -211,15 +207,13 @@
%D \ss \tf\euro \bf\euro \sla\euro \itd\euro \bs\euro \bic\euro
%D \stoptyping
%D
-%D The shape as well as the size is adapted to the current
-%D environment.
+%D The shape as well as the size is adapted to the current environment.
%D \macros
%D {setfont}
%D
-%D Every now and then we want to define a font directly, for
-%D instance when we typeset title pages. The next macro saves
-%D some typing:
+%D Every now and then we want to define a font directly, for instance when we
+%D typeset title pages. The next macro saves some typing:
\unexpanded\def\setfont% geen \font_helpers_set_font mogelijk
{\afterassignment\font_basics_set_font\font\nextfont=}
@@ -233,8 +227,7 @@
%D \setfont cmr10 at 60pt
%D \stoptyping
%D
-%D After which the font is active and the baselines and
-%D struts are set.
+%D After which the font is active and the baselines and struts are set.
%D \macros{doiffontcharelse}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-syn.lua b/Master/texmf-dist/tex/context/base/mkiv/font-syn.lua
index 18c25fbfd97..1d5e1803243 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-syn.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-syn.lua
@@ -26,6 +26,7 @@ local formatters, topattern = string.formatters, string.topattern
local round = math.round
local P, R, S, C, Cc, Ct, Cs = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Ct, lpeg.Cs
local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local isfile, modificationtime = lfs.isfile, lfs.modification
local allocate = utilities.storage.allocate
local sparse = utilities.storage.sparse
@@ -46,9 +47,6 @@ local findfile = resolvers.findfile
local cleanpath = resolvers.cleanpath
local resolveprefix = resolvers.resolve
------ fontloader = fontloader -- still needed for pfb (now)
------ get_font_info = fontloader.info
-
local settings_to_hash = utilities.parsers.settings_to_hash_tolerant
local trace_names = false trackers.register("fonts.names", function(v) trace_names = v end)
@@ -468,11 +466,11 @@ function names.getpaths(trace)
if name == "" then
-- after all, fontconfig is a unix thing
name = filejoin("/etc",confname)
- if not lfs.isfile(name) then
+ if not isfile(name) then
name = "" -- force quit
end
end
- if name ~= "" and lfs.isfile(name) then
+ if name ~= "" and isfile(name) then
if trace_names then
report_names("%s fontconfig file %a","loading",name)
end
@@ -485,7 +483,7 @@ function names.getpaths(trace)
incname = filejoin(path,incname)
end
end
- if lfs.isfile(incname) then
+ if isfile(incname) then
if trace_names then
report_names("%s fontconfig file %a","merging included",incname)
end
@@ -1099,7 +1097,7 @@ local function analyzefiles(olddata)
end
-- needs checking with ttc / ttx : date not updated ?
local result = nil
- local modification = lfs.attributes(completename,"modification")
+ local modification = modificationtime(completename)
if olddata and modification and modification > 0 then
local oldindex = oldindices[storedname] -- index into specifications
if oldindex then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-tfm.lua b/Master/texmf-dist/tex/context/base/mkiv/font-tfm.lua
index 6e4f8698052..e2f0d22f2a8 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-tfm.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-tfm.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['font-tfm'] = {
license = "see context related readme files"
}
+if not context then return end -- use luatex-fonts-tfm.lua instead
+
local next, type = next, type
local match, format = string.match, string.format
local concat, sortedhash = table.concat, table.sortedhash
@@ -118,266 +120,216 @@ local depth = { } -- table.setmetatableindex("number")
--
-- So "czechdqcheat=yes" is then a valid feature. And yes, it's a cheat.
-local read_from_tfm, check_tfm do
-
- local tfmreaders = context and tfm.readers
- local loadtfmvf = tfmreaders and tfmreaders.loadtfmvf
- local loadtfm = font.read_tfm
- local loadvf = font.read_vf
+local loadtfmvf = tfm.readers.loadtfmvf
- directives.register("fonts.tfm.builtin",function(v)
- loadtfmvf = tfmreaders and tfmreaders.loadtfmvf
- if v and loadtfm then
- loadtfmvf = false
+local function read_from_tfm(specification)
+ local filename = specification.filename
+ local size = specification.size
+ depth[filename] = (depth[filename] or 0) + 1
+ if trace_defining then
+ report_defining("loading tfm file %a at size %s",filename,size)
+ end
+ local tfmdata = loadtfmvf(filename,size)
+ if tfmdata then
+
+ local features = specification.features and specification.features.normal or { }
+ local features = constructors.checkedfeatures("tfm",features)
+ specification.features.normal = features
+
+ -- If reencode returns a new table, we assume that we're doing something
+ -- special. An 'auto' reencode picks up its vector from the pfb file.
+
+ if lpdf and lpdf.getmapentry and not features.reencode then
+ -- This can happen multiple times but not that often so we don't
+ -- optimize this.
+ local encoding, pfbfile, encfile = lpdf.getmapentry(filename)
+ if encoding and pfbfile then
+ features.reencode = encfile
+ features.pfbfile = pfbfile
+ end
end
- end)
- read_from_tfm = function(specification)
- local filename = specification.filename
- local size = specification.size
- depth[filename] = (depth[filename] or 0) + 1
- if trace_defining then
- report_defining("loading tfm file %a at size %s",filename,size)
+ local newtfmdata = (depth[filename] == 1) and tfm.reencode(tfmdata,specification)
+ if newtfmdata then
+ tfmdata = newtfmdata
end
- local tfmdata -- not cached, fast enough
- if loadtfmvf then
- tfmdata = loadtfmvf(filename,size)
- else
- tfmdata = loadtfm(filename,size)
- end
- if tfmdata then
-
- local features = specification.features and specification.features.normal or { }
- local features = constructors.checkedfeatures("tfm",features)
- specification.features.normal = features
- -- If reencode returns a new table, we assume that we're doing something
- -- special. An 'auto' reencode picks up its vector from the pfb file.
-
- local newtfmdata = (depth[filename] == 1) and tfm.reencode(tfmdata,specification)
- if newtfmdata then
- tfmdata = newtfmdata
+ local resources = tfmdata.resources or { }
+ local properties = tfmdata.properties or { }
+ local parameters = tfmdata.parameters or { }
+ local shared = tfmdata.shared or { }
+ --
+ shared.features = features
+ shared.resources = resources
+ --
+ properties.name = tfmdata.name -- todo: fallback
+ properties.fontname = tfmdata.fontname -- todo: fallback
+ properties.psname = tfmdata.psname -- todo: fallback
+ properties.fullname = tfmdata.fullname -- todo: fallback
+ properties.filename = specification.filename -- todo: fallback
+ properties.format = tfmdata.format or fonts.formats.tfm -- better than nothing
+ properties.usedbitmap = tfmdata.usedbitmap
+ --
+if lpdf and lpdf.getmapentry and newtfmdata then
+ properties.filename = features.pfbfile
+end
+ --
+ tfmdata.properties = properties
+ tfmdata.resources = resources
+ tfmdata.parameters = parameters
+ tfmdata.shared = shared
+ --
+ shared.rawdata = { resources = resources }
+ shared.features = features
+ --
+ -- The next branch is only entered when we have a proper encoded file i.e.
+ -- unicodes and such. It really nakes no sense to do feature juggling when
+ -- we have no names and unicodes.
+ --
+ if newtfmdata then
+ --
+ -- Some opentype processing assumes these to be present:
+ --
+ if not resources.marks then
+ resources.marks = { }
+ end
+ if not resources.sequences then
+ resources.sequences = { }
+ end
+ if not resources.features then
+ resources.features = {
+ gsub = { },
+ gpos = { },
+ }
+ end
+ if not tfmdata.changed then
+ tfmdata.changed = { }
+ end
+ if not tfmdata.descriptions then
+ tfmdata.descriptions = tfmdata.characters
end
-
- local resources = tfmdata.resources or { }
- local properties = tfmdata.properties or { }
- local parameters = tfmdata.parameters or { }
- local shared = tfmdata.shared or { }
--
- shared.features = features
- shared.resources = resources
+ -- It might be handy to have this:
--
- properties.name = tfmdata.name -- todo: fallback
- properties.fontname = tfmdata.fontname -- todo: fallback
- properties.psname = tfmdata.psname -- todo: fallback
- properties.fullname = tfmdata.fullname -- todo: fallback
- properties.filename = specification.filename -- todo: fallback
- properties.format = tfmdata.format or fonts.formats.tfm -- better than nothing
- properties.usedbitmap = tfmdata.usedbitmap
+ otf.readers.addunicodetable(tfmdata)
--
- tfmdata.properties = properties
- tfmdata.resources = resources
- tfmdata.parameters = parameters
- tfmdata.shared = shared
+ -- We make a pseudo opentype font, e.g. kerns and ligatures etc:
--
- shared.rawdata = { resources = resources }
- shared.features = features
+ tfmenhancers.apply(tfmdata,filename)
--
- -- The next branch is only entered when we have a proper encoded file i.e.
- -- unicodes and such. It really nakes no sense to do feature juggling when
- -- we have no names and unicodes.
+ -- Now user stuff can kick in.
--
- if newtfmdata then
- --
- -- Some opentype processing assumes these to be present:
- --
- if not resources.marks then
- resources.marks = { }
- end
- if not resources.sequences then
- resources.sequences = { }
- end
- if not resources.features then
- resources.features = {
- gsub = { },
- gpos = { },
- }
- end
- if not tfmdata.changed then
- tfmdata.changed = { }
- end
- if not tfmdata.descriptions then
- tfmdata.descriptions = tfmdata.characters
- end
- --
- -- It might be handy to have this:
- --
- otf.readers.addunicodetable(tfmdata)
- --
- -- We make a pseudo opentype font, e.g. kerns and ligatures etc:
- --
- tfmenhancers.apply(tfmdata,filename)
- --
- -- Now user stuff can kick in.
- --
- constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm)
- --
- -- As that can also mess with names and such, we are now ready for finalizing
- -- the unicode information. This is a different order that for instance type one
- -- (afm) files. First we try to deduce unicodes from already present information.
- --
- otf.readers.unifymissing(tfmdata)
- --
- -- Next we fill in the gaps, based on names from teh agl. Probably not much will
- -- happen here.
- --
- fonts.mappings.addtounicode(tfmdata,filename)
- --
- -- The tounicode data is passed to the backend that constructs the vectors for us.
- --
- tfmdata.tounicode = 1
- local tounicode = fonts.mappings.tounicode
- for unicode, v in next, tfmdata.characters do
- local u = v.unicode
- if u then
- v.tounicode = tounicode(u)
- end
- end
- --
- -- However, when we use a bitmap font those vectors can't be constructed because
- -- that information is not carried with those fonts (there is no name info, nor
- -- proper index info, nor unicodes at that end). So, we provide it ourselves.
- --
- if tfmdata.usedbitmap then
- tfm.addtounicode(tfmdata)
- end
- end
+ constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm)
--
- shared.processes = next(features) and tfm.setfeatures(tfmdata,features) or nil
+ -- As that can also mess with names and such, we are now ready for finalizing
+ -- the unicode information. This is a different order that for instance type one
+ -- (afm) files. First we try to deduce unicodes from already present information.
--
- if size < 0 then
- size = idiv(65536 * -size,100)
- end
- parameters.factor = 1 -- already scaled
- parameters.units = 1000 -- just in case
- parameters.size = size
- parameters.slant = parameters.slant or parameters[1] or 0
- parameters.space = parameters.space or parameters[2] or 0
- parameters.space_stretch = parameters.space_stretch or parameters[3] or 0
- parameters.space_shrink = parameters.space_shrink or parameters[4] or 0
- parameters.x_height = parameters.x_height or parameters[5] or 0
- parameters.quad = parameters.quad or parameters[6] or 0
- parameters.extra_space = parameters.extra_space or parameters[7] or 0
+ otf.readers.unifymissing(tfmdata)
--
- constructors.enhanceparameters(parameters) -- official copies for us
+ -- Next we fill in the gaps, based on names from teh agl. Probably not much will
+ -- happen here.
--
- properties.private = properties.private or tfmdata.private or privateoffset
+ fonts.mappings.addtounicode(tfmdata,filename)
--
- if newtfmdata then
- --
- -- We do nothing as we assume flat tfm files. It would become real messy
- -- otherwise and I don't have something for testing on my system anyway.
- --
- elseif loadtfmvf then
- -- already loaded
- local fonts = tfmdata.fonts
- if fonts then
- for i=1,#fonts do
- local font = fonts[i]
- local id = font.id
- if not id then
- local name = font.name
- local size = font.size
- if name and size then
- local data, id = constructors.readanddefine(name,size)
- if id then
- font.id = id
- font.name = nil
- font.size = nil
- end
- end
- end
- end
- end
- elseif constructors.resolvevirtualtoo then
- fonts.loggers.register(tfmdata,file.suffix(filename),specification) -- strange, why here
- local vfname = findbinfile(specification.name, 'ovf')
- if vfname and vfname ~= "" then
- local vfdata = loadvf(vfname,size)
- if vfdata then
- local chars = tfmdata.characters
- for k,v in next, vfdata.characters do
- chars[k].commands = v.commands
- end
- properties.virtualized = true
- tfmdata.fonts = vfdata.fonts
- tfmdata.type = "virtual" -- else nested calls with cummulative scaling
- local fontlist = vfdata.fonts
- local name = file.nameonly(filename)
- for i=1,#fontlist do
- local n = fontlist[i].name
- local s = fontlist[i].size
- local d = depth[filename]
- s = constructors.scaled(s,vfdata.designsize)
- if d > tfm.maxnestingdepth then
- report_defining("too deeply nested virtual font %a with size %a, max nesting depth %s",n,s,tfm.maxnestingdepth)
- fontlist[i] = { id = 0 }
- elseif (d > 1) and (s > tfm.maxnestingsize) then
- report_defining("virtual font %a exceeds size %s",n,s)
- fontlist[i] = { id = 0 }
- else
- local t, id = constructors.readanddefine(n,s)
- fontlist[i] = { id = id }
- end
- end
- end
+ -- The tounicode data is passed to the backend that constructs the vectors for us.
+ --
+ tfmdata.tounicode = 1
+ local tounicode = fonts.mappings.tounicode
+ for unicode, v in next, tfmdata.characters do
+ local u = v.unicode
+ if u then
+ v.tounicode = tounicode(u)
end
end
--
- -- This is for old times sake (and context specific) so we comment it. It has
- -- to do with encoding prefixes (a context naming that was later adopted by
- -- the lm/gyre project)
- --
- -- if not features.encoding then
- -- local encoding, filename = match(properties.filename,"^(.-)%-(.*)$")
- -- if filename and encoding and encodings.known and encodings.known[encoding] then
- -- features.encoding = encoding
- -- end
- -- end
- --
- -- Some afterthoughts:
+ -- However, when we use a bitmap font those vectors can't be constructed because
+ -- that information is not carried with those fonts (there is no name info, nor
+ -- proper index info, nor unicodes at that end). So, we provide it ourselves.
--
- properties.haskerns = true
- properties.hasligatures = true
- properties.hasitalics = true
- resources.unicodes = { }
- resources.lookuptags = { }
+ if tfmdata.usedbitmap then
+ tfm.addtounicode(tfmdata)
+ end
+ end
+ --
+ shared.processes = next(features) and tfm.setfeatures(tfmdata,features) or nil
+ --
+ if size < 0 then
+ size = idiv(65536 * -size,100)
+ end
+
+ parameters.factor = 1 -- already scaled
+ parameters.units = 1000 -- just in case
+ parameters.size = size
+ parameters.slant = parameters.slant or parameters[1] or 0
+ parameters.space = parameters.space or parameters[2] or 0
+ parameters.space_stretch = parameters.space_stretch or parameters[3] or 0
+ parameters.space_shrink = parameters.space_shrink or parameters[4] or 0
+ parameters.x_height = parameters.x_height or parameters[5] or 0
+ parameters.quad = parameters.quad or parameters[6] or 0
+ parameters.extra_space = parameters.extra_space or parameters[7] or 0
+ --
+ constructors.enhanceparameters(parameters) -- official copies for us
+ --
+ properties.private = properties.private or tfmdata.private or privateoffset
+ --
+ if newtfmdata then
--
- depth[filename] = depth[filename] - 1
+ -- We do nothing as we assume flat tfm files. It would become real messy
+ -- otherwise and I don't have something for testing on my system anyway.
--
- return tfmdata
else
- depth[filename] = depth[filename] - 1
+ -- already loaded
+ local fonts = tfmdata.fonts
+ if fonts then
+ for i=1,#fonts do
+ local font = fonts[i]
+ local id = font.id
+ if not id then
+ local name = font.name
+ local size = font.size
+ if name and size then
+ local data, id = constructors.readanddefine(name,size)
+ if id then
+ font.id = id
+ font.name = nil
+ font.size = nil
+ end
+ end
+ end
+ end
+ end
end
+ --
+ properties.haskerns = true
+ properties.hasligatures = true
+ properties.hasitalics = true
+ resources.unicodes = { }
+ resources.lookuptags = { }
+ --
+ depth[filename] = depth[filename] - 1
+ --
+ return tfmdata
+ else
+ depth[filename] = depth[filename] - 1
end
+end
- check_tfm = function(specification,fullname) -- we could split up like afm/otf
- local foundname = findbinfile(fullname, 'tfm') or ""
- if foundname == "" then
- foundname = findbinfile(fullname, 'ofm') or "" -- not needed in context
- end
- if foundname == "" then
- foundname = fonts.names.getfilename(fullname,"tfm") or ""
- end
- if foundname ~= "" then
- specification.filename = foundname
- specification.format = "ofm"
- return read_from_tfm(specification)
- elseif trace_defining then
- report_defining("loading tfm with name %a fails",specification.name)
- end
+local function check_tfm(specification,fullname) -- we could split up like afm/otf
+ local foundname = findbinfile(fullname, 'tfm') or ""
+ if foundname == "" then
+ foundname = findbinfile(fullname, 'ofm') or "" -- not needed in context
+ end
+ if foundname == "" then
+ foundname = fonts.names.getfilename(fullname,"tfm") or ""
+ end
+ if foundname ~= "" then
+ specification.filename = foundname
+ specification.format = "ofm"
+ return read_from_tfm(specification)
+ elseif trace_defining then
+ report_defining("loading tfm with name %a fails",specification.name)
end
-
end
readers.check_tfm = check_tfm
@@ -437,7 +389,7 @@ do
return
end
- local pfbfile = outfiles[tfmfile]
+ local pfbfile = pfbfile or outfiles[tfmfile]
if pfbfile == nil then
if bitmap then
@@ -458,7 +410,6 @@ do
local encoding = false
local vector = false
-
if type(pfbfile) == "string" then
local pfb = constructors.handlers.pfb
if pfb and pfb.loadvector then
@@ -490,17 +441,18 @@ do
local indices = { }
local parentfont = { "font", 1 }
local private = tfmdata.privateoffset or constructors.privateoffset
- local reported = encdone[tfmfile][encfile]
-
+ local reported = encdone[tfmfile][encfile] -- bah, encdone for tfm or pfb ?
-- create characters table
+ -- vector : pfbindex -> name
+ -- encoding : tfmindex -> name
+
local backmap = vector and table.swapped(vector)
local done = { } -- prevent duplicate
-
- for index, name in sortedhash(encoding) do -- predictable order
- local unicode = unicoding[name]
- local original = originals[index]
+ for tfmindex, name in sortedhash(encoding) do -- predictable order
+ local original = originals[tfmindex]
if original then
+ local unicode = unicoding[name]
if unicode then
original.unicode = unicode
else
@@ -511,17 +463,17 @@ do
end
end
characters[unicode] = original
- indices[index] = unicode
+ indices[tfmindex] = unicode
original.name = name -- so one can lookup weird names
if backmap then
- original.index = backmap[name]
+ original.index = backmap[name] -- the pfb index
else -- probably bitmap
- original.commands = { parentfont, charcommand[index] } -- or "slot"
- original.oindex = index
+ original.commands = { parentfont, charcommand[tfmindex] } -- or "slot"
+ original.oindex = tfmindex
end
done[name] = true
elseif not done[name] then
- report_tfm("bad index %a in font %a with name %a",index,tfmfile,name)
+ report_tfm("bad index %a in font %a with name %a",tfmindex,tfmfile,name)
end
end
@@ -575,68 +527,6 @@ do
end
--- This code adds a ToUnicode vector for bitmap fonts. We don't bother about
--- ranges because we have small fonts. it works ok with acrobat but fails with
--- the other viewers (they get confused by the bitmaps I guess).
-
-do
-
- local template = [[
-/CIDInit /ProcSet findresource begin
- 12 dict begin
- begincmap
- /CIDSystemInfo << /Registry (TeX) /Ordering (bitmap-%s) /Supplement 0 >> def
- /CMapName /TeX-bitmap-%s def
- /CMapType 2 def
- 1 begincodespacerange
- <00> <FF>
- endcodespacerange
- %s beginbfchar
-%s
- endbfchar
- endcmap
-CMapName currentdict /CMap defineresource pop end
-end
-end
-]]
-
- local flushstreamobject = lpdf and lpdf.flushstreamobject -- context
- local setfontattributes = lpdf and lpdf.setfontattributes -- context
-
- if not flushstreamobject then
- flushstreamobject = function(data)
- return pdf.obj { immediate = true, type = "stream", string = data } -- generic
- end
- end
-
- if not setfontattributes then
- setfontattributes = function(id,data)
- return pdf.setfontattributes(id,data) -- generic
- end
- end
-
- function tfm.addtounicode(tfmdata)
- local id = tfmdata.usedbitmap
- local map = { }
- local char = { } -- no need for range, hardly used
- for k, v in next, tfmdata.characters do
- local index = v.oindex
- local tounicode = v.tounicode
- if index and tounicode then
- map[index] = tounicode
- end
- end
- for k, v in sortedhash(map) do
- char[#char+1] = format("<%02X> <%s>",k,v)
- end
- char = concat(char,"\n")
- local stream = format(template,id,id,#char,char)
- local reference = flushstreamobject(stream,nil,true)
- setfontattributes(id,format("/ToUnicode %i 0 R",reference))
- end
-
-end
-
-- Now we implement the regular features handlers. We need to convert the
-- tfm specific structures to opentype structures. In basemode they are
-- converted back so that is a bit of a waste but it's fast enough.
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-tpk.lua b/Master/texmf-dist/tex/context/base/mkiv/font-tpk.lua
new file mode 100644
index 00000000000..05ecdd45ce1
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-tpk.lua
@@ -0,0 +1,1304 @@
+ if not modules then modules = { } end modules ['font-tpk'] = {
+ version = 1.001,
+ comment = "companion to font-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- The bitmap loader is more or less derived from the luatex version (taco)
+-- which is derived from pdftex (thanh) who uses code from dvips (thomas)
+-- adapted by piet ... etc. The tfm and vf readers are also derived from
+-- luatex. All do things a bit more luaish and errors are of course mine.
+
+local next = next
+local extract, band, lshift, rshift = bit32.extract, bit32.band, bit32.lshift, bit32.rshift
+local idiv = number.idiv
+local char = string.char
+local concat, insert, remove, copy = table.concat, table.insert, table.remove, table.copy
+local tobitstring = number.tobitstring
+local formatters = string.formatters
+local round = math.round
+
+local streams = utilities.streams
+local openstream = streams.open
+local streamsize = streams.size
+local readcardinal1 = streams.readcardinal1
+local readcardinal2 = streams.readcardinal2
+local readcardinal3 = streams.readcardinal3
+local readcardinal4 = streams.readcardinal4
+local readinteger1 = streams.readinteger1
+local readinteger2 = streams.readinteger2
+local readinteger3 = streams.readinteger3
+local readinteger4 = streams.readinteger4
+local readbyte = streams.readbyte
+local readbytes = streams.readbytes
+local readstring = streams.readstring
+local skipbytes = streams.skipbytes
+local getposition = streams.getposition
+local setposition = streams.setposition
+
+if not fonts then fonts = { handlers = { tfm = { } } } end
+
+local handlers = fonts.handlers
+local tfm = handlers.tfm or { }
+handlers.tfm = tfm
+local readers = tfm.readers or { }
+tfm.readers = readers
+
+tfm.version = 1.005
+tfm.cache = containers.define("fonts", "tfm", tfm.version, true)
+
+-- Performance is no real issue here so I didn't optimize too much. After
+-- all, these files are small and we mostly use opentype or type1 fonts.
+
+do
+
+ local function readbitmap(glyph,s,flagbyte)
+
+ local inputbyte = 0
+ local bitweight = 0
+ local dynf = 0
+ local remainder = 0
+ local realfunc = nil
+ local repeatcount = 0
+
+ local function getnyb() -- can be inlined
+ if bitweight == 0 then
+ bitweight = 16
+ inputbyte = readbyte(s)
+ return extract(inputbyte,4,4)
+ else
+ bitweight = 0
+ return band(inputbyte,15)
+ end
+ end
+
+ local function getbit() -- can be inlined
+ bitweight = rshift(bitweight,1)
+ if bitweight == 0 then -- actually we can check for 1
+ inputbyte = readbyte(s)
+ bitweight = 128
+ end
+ return band(inputbyte,bitweight)
+ end
+
+ local function pkpackednum()
+ local i = getnyb(s)
+ if i == 0 then
+ repeat
+ j = getnyb()
+ i = i + 1
+ until (j ~= 0)
+ if i > 3 then
+ return handlehuge(i,j)
+ else
+ for i=1,i do
+ j = j * 16 + getnyb()
+ end
+ return j - 15 + (13 - dynf) * 16 + dynf
+ end
+ elseif i <= dynf then
+ return i
+ elseif i < 14 then
+ return (i - dynf - 1) * 16 + getnyb() + dynf + 1
+ elseif i == 14 then
+ repeatcount = pkpackednum()
+ else
+ repeatcount = 1
+ end
+ return realfunc()
+ end
+
+ local function rest()
+ if remainder < 0 then
+ remainder = -remainder
+ return 0
+ elseif remainder > 4000 then
+ remainder = 4000 - remainder
+ return 4000
+ elseif remainder > 0 then
+ local i = remainder
+ remainder = 0
+ realfunc = pkpackednum
+ return i
+ else
+ -- error = "pk issue that shouldn't happen"
+ return 0
+ end
+ end
+
+ local function handlehuge(i,j)
+ while i ~= 0 do
+ j = lshift(j,4) + getnyb()
+ -- j = extract(j,8,4) + getnyb()
+ i = i - 1
+ end
+ remainder = j - 15 + (13 - dynf) * 16 + dynf
+ realfunc = rest
+ return rest()
+ end
+
+ local gpower = { [0] =
+ 0, 1, 3, 7, 15, 31, 63, 127,
+ 255, 511, 1023, 2047, 4095, 8191, 16383, 32767,
+ 65535
+ }
+
+ local raster = { }
+ local r = 0
+ glyph.stream = raster
+
+ local xsize = glyph.xsize
+ local ysize = glyph.ysize
+ local word = 0
+ local wordweight = 0
+ local wordwidth = idiv(xsize + 15,16)
+ local rowsleft = 0
+ local turnon = band(flagbyte,8) == 8 and true or false
+ local hbit = 0
+ local count = 0
+ --
+ realfunc = pkpackednum
+ dynf = idiv(flagbyte,16)
+ --
+ if dynf == 14 then
+ bitweight = 0
+ for i=1,ysize do
+ word = 0
+ wordweight = 32768
+ for j=1,xsize do
+ if getbit() ~= 0 then
+ word = word + wordweight
+ end
+ wordweight = rshift(wordweight,1)
+ if wordweight == 0 then
+ r = r + 1
+ raster[r] = word
+ word = 0
+ wordweight = 32768
+ end
+ end
+ if wordweight ~= 32768 then
+ r = r + 1
+ raster[r] = word
+ end
+ end
+ else
+ rowsleft = ysize
+ hbit = xsize
+ repeatcount = 0
+ wordweight = 16
+ word = 0
+ bitweight = 0
+ while rowsleft > 0 do
+ count = realfunc()
+ while count ~= 0 do
+ if count < wordweight and count < hbit then
+ if turnon then
+ word = word + gpower[wordweight] - gpower[wordweight - count]
+ end
+ hbit = hbit - count
+ wordweight = wordweight - count
+ count = 0
+ elseif count >= hbit and hbit <= wordweight then
+ if turnon then
+ word = word + gpower[wordweight] - gpower[wordweight - hbit]
+ end
+ r = r + 1
+ raster[r] = word
+ for i=1,repeatcount*wordwidth do
+ r = r + 1
+ raster[r] = raster[r - wordwidth]
+ end
+ rowsleft = rowsleft - repeatcount - 1
+ repeatcount = 0
+ word = 0
+ wordweight = 16
+ count = count - hbit
+ hbit = xsize
+ else
+ if turnon then
+ word = word + gpower[wordweight]
+ end
+ r = r + 1
+ raster[r] = word
+ word = 0
+ count = count - wordweight
+ hbit = hbit - wordweight
+ wordweight = 16
+ end
+ end
+ turnon = not turnon
+ end
+ if rowsleft ~= 0 or hbit ~= xsize then
+ print("ERROR",rowsleft,hbit,xsize)
+ -- error = "error while unpacking, more bits than required"
+ end
+ end
+
+ end
+
+ function readers.showpk(glyph)
+ local xsize = glyph.xsize
+ local ysize = glyph.ysize
+ local stream = glyph.stream
+ local result = { }
+ local rr = { }
+ local r = 0
+ local s = 0
+ local cw = idiv(xsize+ 7, 8)
+ local rw = idiv(xsize+15,16)
+ local extra = 2 * rw == cw
+ local b
+ for y=1,ysize do
+ r = 0
+ for x=1,rw-1 do
+ s = s + 1 ; b = stream[s]
+ r = r + 1 ; rr[r] = tobitstring(b,16,16)
+ end
+ s = s + 1 ; b = stream[s]
+ if extra then
+ r = r + 1 ; rr[r] = tobitstring(b,16,16)
+ else
+ r = r + 1 ; rr[r] = tobitstring(extract(b,8+(8-cw),cw),cw,cw)
+ end
+ result[y] = concat(rr)
+ end
+ return concat(result,"\n")
+ end
+
+ local template = formatters [ [[
+%.3N 0 %i %i %i %i d1
+q
+%i 0 0 %i %i %i cm
+BI
+ /W %i
+ /H %i
+ /IM true
+ /BPC 1
+ /D [1 0]
+ID %t
+EI
+Q]] ]
+
+ function readers.pktopdf(glyph,data,factor)
+ local width = data.width * factor
+ local xsize = glyph.xsize or 0
+ local ysize = glyph.ysize or 0
+ local xoffset = glyph.xoffset or 0
+ local yoffset = glyph.yoffset or 0
+ local stream = glyph.stream
+
+ local dpi = 1
+ local newdpi = 1
+
+ local xdpi = dpi * xsize / newdpi
+ local ydpi = dpi * ysize / newdpi
+
+ local llx = - xoffset
+ local lly = yoffset - ysize + 1
+ local urx = llx + xsize + 1
+ local ury = lly + ysize
+
+ local result = { }
+ local r = 0
+ local s = 0
+ local cw = idiv(xsize+ 7, 8)
+ local rw = idiv(xsize+15,16)
+ local extra = 2 * rw == cw
+ local b
+ for y=1,ysize do
+ for x=1,rw-1 do
+ s = s + 1 ; b = stream[s]
+ r = r + 1 ; result[r] = char(extract(b,8,8),extract(b,0,8))
+ end
+ s = s + 1 ; b = stream[s]
+ if extra then
+ r = r + 1 ; result[r] = char(extract(b,8,8),extract(b,0,8))
+ else
+ r = r + 1 ; result[r] = char(extract(b,8,8))
+ end
+ end
+ return template(width,llx,lly,urx,ury,xdpi,ydpi,llx,lly,xsize,ysize,result), width
+ end
+
+ function readers.loadpk(filename)
+ local s = openstream(filename)
+ local preamble = readcardinal1(s)
+ local version = readcardinal1(s)
+ local comment = readstring(s,readcardinal1(s))
+ local designsize = readcardinal4(s)
+ local checksum = readcardinal4(s)
+ local hppp = readcardinal4(s)
+ local vppp = readcardinal4(s)
+ if preamble ~= 247 or version ~= 89 or not vppp then
+ return { error = "invalid preamble" }
+ end
+ local glyphs = { }
+ local data = {
+ designsize = designsize,
+ comment = comment,
+ hppp = hppp,
+ vppp = vppp,
+ glyphs = glyphs,
+ }
+ while true do
+ local flagbyte = readcardinal1(s)
+ if flagbyte < 240 then
+ local c = band(flagbyte,7)
+ local length, index, width, pixels, xsize, ysize, xoffset, yoffset
+ if c >= 0 and c <= 3 then
+ length = band(flagbyte,7) * 256 + readcardinal1(s) - 3
+ index = readcardinal1(s)
+ width = readinteger3(s)
+ pixels = readcardinal1(s)
+ xsize = readcardinal1(s)
+ ysize = readcardinal1(s)
+ xoffset = readcardinal1(s)
+ yoffset = readcardinal1(s)
+ if xoffset > 127 then
+ xoffset = xoffset - 256
+ end
+ if yoffset > 127 then
+ yoffset = yoffset - 256
+ end
+ elseif c >= 4 and c <= 6 then
+ length = band(flagbyte,3) * 65536 + readcardinal1(s) * 256 + readcardinal1(s) - 4
+ index = readcardinal1(s)
+ width = readinteger3(s)
+ pixels = readcardinal2(s)
+ xsize = readcardinal2(s)
+ ysize = readcardinal2(s)
+ xoffset = readcardinal2(s)
+ yoffset = readcardinal2(s)
+ else -- 7
+ length = readcardinal4(s) - 9
+ index = readcardinal4(s)
+ width = readinteger4(s)
+ pixels = readcardinal4(s)
+ readcardinal4(s)
+ xsize = readcardinal4(s)
+ ysize = readcardinal4(s)
+ xoffset = readcardinal4(s)
+ yoffset = readcardinal4(s)
+ end
+ local glyph = {
+ index = index,
+ width = width,
+ pixels = pixels,
+ xsize = xsize,
+ ysize = ysize,
+ xoffset = xoffset,
+ yoffset = yoffset,
+ }
+ if length <= 0 then
+ data.error = "bad packet"
+ return data
+ end
+ readbitmap(glyph,s,flagbyte)
+ glyphs[index] = glyph
+ elseif flagbyte == 240 then
+ -- k[1] x[k]
+ skipbytes(s,readcardinal1(s))
+ elseif flagbyte == 241 then
+ -- k[2] x[k]
+ skipbytes(s,readcardinal2(s)*2)
+ elseif flagbyte == 242 then
+ -- k[3] x[k]
+ skipbytes(s,readcardinal3(s)*3)
+ elseif flagbyte == 243 then
+ -- k[4] x[k]
+ skipbytes(s,readcardinal4(s)*4) -- readinteger4
+ elseif flagbyte == 244 then
+ -- y[4]
+ skipbytes(s,4)
+ elseif flagbyte == 245 then
+ break
+ elseif flagbyte == 246 then
+ -- nop
+ else
+ data.error = "unknown pk command"
+ break
+ end
+ end
+ return data
+ end
+
+end
+
+do
+
+ local leftboundary = -1
+ local rightboundary = -2
+ local boundarychar = 65536
+
+ function readers.loadtfm(filename)
+ local data
+ --
+ local function someerror(m)
+ if not data then
+ data = { }
+ end
+ data.error = m or "fatal error"
+ return data
+ end
+ --
+ local s = openstream(filename)
+ if not s then
+ return someerror()
+ end
+ --
+ local wide = false
+ local header = 0
+ local max = 0
+ local size = streamsize(s)
+ local glyphs = table.setmetatableindex(function(t,k)
+ local v = {
+ -- we default because boundary chars have no dimension s
+ width = 0,
+ height = 0,
+ depth = 0,
+ italic = 0,
+ }
+ t[k] = v
+ return v
+ end)
+ local parameters = { }
+ local direction = 0
+ --
+ local lf, lh, bc, ec, nw, nh, nd, ni, nl, nk, ne, np
+ --
+ lf = readcardinal2(s)
+ if lf ~= 0 then
+ header = 6
+ max = 255
+ wide = false
+ lh = readcardinal2(s)
+ bc = readcardinal2(s)
+ ec = readcardinal2(s)
+ nw = readcardinal2(s)
+ nh = readcardinal2(s)
+ nd = readcardinal2(s)
+ ni = readcardinal2(s)
+ nl = readcardinal2(s)
+ nk = readcardinal2(s)
+ ne = readcardinal2(s)
+ np = readcardinal2(s)
+ else
+ header = 14
+ max = 65535
+ wide = readcardinal4(s) == 0
+ if not wide then
+ return someerror("invalid format")
+ end
+ lf = readcardinal4(s)
+ lh = readcardinal4(s)
+ bc = readcardinal4(s)
+ ec = readcardinal4(s)
+ nw = readcardinal4(s)
+ nh = readcardinal4(s)
+ nd = readcardinal4(s)
+ ni = readcardinal4(s)
+ nl = readcardinal4(s)
+ nk = readcardinal4(s)
+ ne = readcardinal4(s)
+ np = readcardinal4(s)
+ direction = readcardinal4(s)
+ end
+ if (bc > ec + 1) or (ec > max) then
+ return someerror("file is too small")
+ end
+ if bc > max then
+ bc, ec = 1, 0
+ end
+ local nlw = (wide and 2 or 1) * nl
+ local neew = (wide and 2 or 1) * ne
+ local ncw = (wide and 2 or 1) * (ec - bc + 1)
+ if lf ~= (header + lh + ncw + nw + nh + nd + ni + nlw + nk + neew + np) then
+ return someerror("file is too small")
+ end
+ if nw == 0 or nh == 0 or nd == 0 or ni == 0 then
+ return someerror("no glyphs")
+ end
+ if lf * 4 > size then
+ return someerror("file is too small")
+ end
+ local slh = lh
+ if lh < 2 then
+ return someerror("file is too small")
+ end
+ local checksum = readcardinal4(s)
+ local designsize = readcardinal2(s)
+ designsize = designsize * 256 + readcardinal1(s)
+ designsize = designsize * 16 + rshift(readcardinal1(s),4)
+ if designsize < 0xFFFF then
+ return someerror("weird designsize")
+ end
+ --
+ local alpha = 16
+ local z = designsize
+ while z >= 040000000 do
+ z = rshift(z,1)
+ alpha = alpha + alpha
+ end
+ local beta = idiv(256,alpha)
+ alpha = alpha * z
+ --
+ local function readscaled()
+ local a, b, c, d = readbytes(s,4)
+ local n = idiv(rshift(rshift(d*z,8)+c*z,8)+b*z,beta)
+ if a == 0 then
+ return n
+ elseif a == 255 then
+ return n - alpha
+ else
+ return 0
+ end
+ end
+ --
+ local function readunscaled()
+ local a, b, c, d = readbytes(s,4)
+ if a > 127 then
+ a = a - 256
+ end
+ return a * 0xFFFFF + b * 0xFFF + c * 0xF + rshift(d,4)
+ end
+ --
+ while lh > 2 do -- can be one-liner
+ skipbytes(s,4)
+ lh = lh - 1
+ end
+ local saved = getposition(s)
+ setposition(s,(header + slh + ncw) * 4 + 1)
+ local widths = { } for i=0,nw-1 do widths [i] = readscaled() end
+ local heights = { } for i=0,nh-1 do heights[i] = readscaled() end
+ local depths = { } for i=0,nd-1 do depths [i] = readscaled() end
+ local italics = { } for i=0,ni-1 do italics[i] = readscaled() end
+ if widths[0] ~= 0 or heights[0] ~= 0 or depths[0] ~= 0 then
+ return someerror("invalid dimensions")
+ end
+ --
+ local blabel = nl
+ local bchar = boundarychar
+ --
+ local ligatures = { }
+ if nl > 0 then
+ for i=0,nl-1 do
+ local a, b, c, d = readbytes(s,4)
+ ligatures[i] = {
+ skip = a,
+ nxt = b,
+ op = c,
+ rem = d,
+ }
+ if a > 128 then
+ if 256 * c + d >= nl then
+ return someerror("invalid ligature table")
+ end
+ if a == 255 and i == 0 then
+ bchar = b
+ end
+ else
+ if c < 128 then
+ -- whatever
+ elseif 256 * (c - 128) + d >= nk then
+ return someerror("invalid ligature table")
+ end
+ if (a < 128) and (i - 0 + a + 1 >= nl) then
+ return someerror("invalid ligature table")
+ end
+ end
+ if a == 255 then
+ blabel = 256 * c + d
+ end
+ end
+ end
+ local allkerns = { }
+ for i=0,nk-1 do
+ allkerns[i] = readscaled()
+ end
+ local extensibles = { }
+ for i=0,ne-1 do
+ extensibles[i] = wide and {
+ top = readcardinal2(s),
+ bot = readcardinal2(s),
+ mid = readcardinal2(s),
+ rep = readcardinal2(s),
+ } or {
+ top = readcardinal1(s),
+ bot = readcardinal1(s),
+ mid = readcardinal1(s),
+ rep = readcardinal1(s),
+ }
+ end
+ for i=1,np do
+ if i == 1 then
+ parameters[i] = readunscaled()
+ else
+ parameters[i] = readscaled()
+ end
+ end
+ for i=1,7 do
+ if not parameters[i] then
+ parameters[i] = 0
+ end
+ end
+ --
+ setposition(s,saved)
+ local extras = false
+ if blabel ~= nl then
+ local k = blabel
+ while true do
+ local l = ligatures[k]
+ local skip = l.skip
+ if skip <= 128 then
+ -- if l.op >= 128 then
+ -- extras = true -- kern
+ -- else
+ extras = true -- ligature
+ -- end
+ end
+ if skip == 0 then
+ k = k + 1
+ else
+ if skip >= 128 then
+ break
+ end
+ k = k + skip + 1
+ end
+ end
+ end
+ if extras then
+ local ligas = { }
+ local kerns = { }
+ local k = blabel
+ while true do
+ local l = ligatures[k]
+ local skip = l.skip
+ if skip <= 128 then
+ local nxt = l.nxt
+ local op = l.op
+ local rem = l.rem
+ if op >= 128 then
+ kerns[nxt] = allkerns[256 * (op - 128) + rem]
+ else
+ ligas[nxt] = { type = op * 2 + 1, char = rem }
+ end
+ end
+ if skip == 0 then
+ k = k + 1
+ else
+ if skip >= 128 then
+ break;
+ end
+ k = k + skip + 1
+ end
+ end
+ if next(kerns) then
+ local glyph = glyphs[leftboundary]
+ glyph.kerns = kerns
+ glyph.remainder = 0
+ end
+ if next(ligas) then
+ local glyph = glyphs[leftboundary]
+ glyph.ligatures = ligas
+ glyph.remainder = 0
+ end
+ end
+ for i=bc,ec do
+ local glyph, width, height, depth, italic, tag, remainder
+ if wide then
+ width = readcardinal2(s)
+ height = readcardinal1(s)
+ depth = readcardinal1(s)
+ italic = readcardinal1(s)
+ tag = readcardinal1(s)
+ remainder = readcardinal2(s)
+ else
+ width = readcardinal1(s)
+ height = readcardinal1(s)
+ depth = extract(height,0,4)
+ height = extract(height,4,4)
+ italic = readcardinal1(s)
+ tag = extract(italic,0,2)
+ italic = extract(italic,2,6)
+ remainder = readcardinal1(s)
+ end
+ if width == 0 then
+ -- nothing
+ else
+ if width >= nw or height >= nh or depth >= nd or italic >= ni then
+ return someerror("invalid dimension index")
+ end
+ local extensible, nextinsize
+ if tag == 0 then
+ -- nothing special
+ else
+ local r = remainder
+ if tag == 1 then
+ if r >= nl then
+ return someerror("invalid ligature index")
+ end
+ elseif tag == 2 then
+ if r < bc or r > ec then
+ return someerror("invalid chain index")
+ end
+ while r < i do
+ local g = glyphs[r]
+ if g.tag ~= list_tag then
+ break
+ end
+ r = g.remainder
+ end
+ if r == i then
+ return someerror("cycles in chain")
+ end
+ nextinsize = r
+ elseif tag == 3 then
+ if r >= ne then
+ return someerror("bad extensible")
+ end
+ extensible = extensibles[r] -- remainder ?
+ remainder = 0
+ end
+ end
+ glyphs[i] = {
+ width = widths [width],
+ height = heights[height],
+ depth = depths [depth],
+ italic = italics[italic],
+ tag = tag,
+ -- index = i,
+ remainder = remainder,
+ extensible = extensible,
+ next = nextinsize,
+ }
+ end
+ end
+ for i=bc,ec do
+ local glyph = glyphs[i]
+ if glyph.tag == 1 then
+ -- ligature
+ local k = glyph.remainder
+ local l = ligatures[k]
+ if l.skip > 128 then
+ k = 256 * l.op + l.rem
+ end
+ local ligas = { }
+ local kerns = { }
+ while true do
+ local l = ligatures[k]
+ local skip = l.skip
+ if skip <= 128 then
+ local nxt = l.nxt
+ local op = l.op
+ local rem = l.rem
+ if op >= 128 then
+ local kern = allkerns[256 * (op - 128) + rem]
+ if nxt == bchar then
+ kerns[rightboundary] = kern
+ end
+ kerns[nxt] = kern
+ else
+ local ligature = { type = op * 2 + 1, char = rem }
+ if nxt == bchar then
+ ligas[rightboundary] = ligature
+ end
+ ligas[nxt] = ligature -- shared
+ end
+ end
+ if skip == 0 then
+ k = k + 1
+ else
+ if skip >= 128 then
+ break
+ end
+ k = k + skip + 1
+ end
+ end
+ if next(kerns)then
+ glyph.kerns = kerns
+ glyph.remainder = 0
+ end
+ if next(ligas) then
+ glyph.ligatures = ligas
+ glyph.remainder = 0
+ end
+ end
+ end
+ --
+ if bchar ~= boundarychar then
+ glyphs[rightboundary] = copy(glyphs[bchar])
+ end
+ --
+ -- for k, v in next, glyphs do
+ -- v.tag = nil
+ -- v.remainder = nil
+ -- end
+ --
+ return {
+ name = file.nameonly(filename),
+ fontarea = file.pathpart(filename),
+ glyphs = glyphs,
+ parameters = parameters,
+ designsize = designsize,
+ size = designsize,
+ direction = direction,
+ -- checksum = checksum,
+ -- embedding = "unknown",
+ -- encodingbytes = 0,
+ -- extend = 1000,
+ -- slant = 0,
+ -- squeeze = 0,
+ -- format = "unknown",
+ -- identity = "unknown",
+ -- mode = 0,
+ -- streamprovider = 0,
+ -- tounicode = 0,
+ -- type = "unknown",
+ -- units_per_em = 0,
+ -- used = false,
+ -- width = 0,
+ -- writingmode = "unknown",
+ }
+ end
+
+end
+
+do
+
+ local push = { "push" }
+ local push = { "pop" }
+
+ local w, x, y, z, f
+ local stack
+ local s, result, r
+ local alpha, beta, z
+
+ local function scaled1()
+ local a = readbytes(s,1)
+ if a == 0 then
+ return 0
+ elseif a == 255 then
+ return - alpha
+ else
+ return 0 -- error
+ end
+ end
+
+ local function scaled2()
+ local a, b = readbytes(s,2)
+ local sw = idiv(b*z,beta)
+ if a == 0 then
+ return sw
+ elseif a == 255 then
+ return sw - alpha
+ else
+ return 0 -- error
+ end
+ end
+
+ local function scaled3()
+ local a, b, c = readbytes(s,3)
+ local sw = idiv(rshift(c*z,8)+b*z,beta)
+ if a == 0 then
+ return sw
+ elseif a == 255 then
+ return sw - alpha
+ else
+ return 0 -- error
+ end
+ end
+
+ local function scaled4()
+ local a, b, c, d = readbytes(s,4)
+ local sw = idiv( rshift(rshift(d*z,8)+(c*z),8)+b*z,beta)
+ if a == 0 then
+ return sw
+ elseif a == 255 then
+ return sw - alpha
+ else
+ return 0 -- error
+ end
+ end
+
+ local function dummy()
+ end
+
+ local actions = {
+
+ [128] = function() r = r + 1 result[r] = { "slot", f or 1, readcardinal1(s) } p = p + 1 end,
+ [129] = function() r = r + 1 result[r] = { "slot", f or 1, readcardinal2(s) } p = p + 2 end,
+ [130] = function() r = r + 1 result[r] = { "slot", f or 1, readcardinal3(s) } p = p + 3 end,
+ [131] = function() r = r + 1 result[r] = { "slot", f or 1, readcardinal4(s) } p = p + 4 end,
+
+ [132] = function()
+ r = r + 1
+ result[r] = { "rule", scaled4(), scaled4() }
+ p = p + 8
+ end,
+
+ [133] = function()
+ r = r + 1 result[r] = push
+ r = r + 1 result[r] = { "slot", f or 1, readcardinal1(s) }
+ r = r + 1 result[r] = pop
+ p = p + 1
+ end,
+ [134] = function()
+ r = r + 1 result[r] = push
+ r = r + 1 result[r] = { "slot", f or 1, readcardinal2(s) }
+ r = r + 1 result[r] = pop
+ p = p + 2
+ end,
+ [135] = function()
+ r = r + 1 result[r] = push
+ r = r + 1 result[r] = { "slot", f or 1, readcardinal2(s) }
+ r = r + 1 result[r] = pop
+ p = p + 3
+ end,
+ [136] = function()
+ r = r + 1 result[r] = push
+ r = r + 1 result[r] = { "slot", f or 1, readcardinal4(s) }
+ r = r + 1 result[r] = pop
+ p = p + 4
+ end,
+
+ [137] = function()
+ r = r + 1 result[r] = push
+ r = r + 1 result[r] = { "rule", scaled4(), scaled4() }
+ r = r + 1 result[r] = pop
+ p = p + 8
+ end,
+
+ [138] = dummy, -- nop
+ [139] = dummy, -- bop
+ [140] = dummy, -- eop
+
+ [141] = function()
+ insert(stack, { w, x, y, z })
+ r = r + 1
+ result[r] = push
+ end,
+ [142] = function()
+ local t = remove(stack)
+ if t then
+ w, x, y, z = t[1], t[2], t[3], t[4]
+ r = r + 1
+ result[r] = pop
+ end
+ end,
+
+ [143] = function() r = r + 1 result[r] = { "right", scaled1() } p = p + 1 end,
+ [144] = function() r = r + 1 result[r] = { "right", scaled2() } p = p + 2 end,
+ [145] = function() r = r + 1 result[r] = { "right", scaled3() } p = p + 3 end,
+ [146] = function() r = r + 1 result[r] = { "right", scaled4() } p = p + 4 end,
+
+ [148] = function() w = scaled1() r = r + 1 result[r] = { "right", w } p = p + 1 end,
+ [149] = function() w = scaled2() r = r + 1 result[r] = { "right", w } p = p + 2 end,
+ [150] = function() w = scaled3() r = r + 1 result[r] = { "right", w } p = p + 3 end,
+ [151] = function() w = scaled4() r = r + 1 result[r] = { "right", w } p = p + 4 end,
+
+ [153] = function() x = scaled1() r = r + 1 result[r] = { "right", x } p = p + 1 end,
+ [154] = function() x = scaled2() r = r + 1 result[r] = { "right", x } p = p + 2 end,
+ [155] = function() x = scaled3() r = r + 1 result[r] = { "right", x } p = p + 3 end,
+ [156] = function() x = scaled4() r = r + 1 result[r] = { "right", x } p = p + 4 end,
+
+ [157] = function() r = r + 1 result[r] = { "down", scaled1() } p = p + 1 end,
+ [158] = function() r = r + 1 result[r] = { "down", scaled2() } p = p + 2 end,
+ [159] = function() r = r + 1 result[r] = { "down", scaled3() } p = p + 3 end,
+ [160] = function() r = r + 1 result[r] = { "down", scaled4() } p = p + 4 end,
+
+ [162] = function() y = scaled1() r = r + 1 result[r] = { "down", y } p = p + 1 end,
+ [163] = function() y = scaled2() r = r + 1 result[r] = { "down", y } p = p + 2 end,
+ [164] = function() y = scaled3() r = r + 1 result[r] = { "down", y } p = p + 3 end,
+ [165] = function() y = scaled3() r = r + 1 result[r] = { "down", y } p = p + 4 end,
+
+ [167] = function() z = scaled1() r = r + 1 ; result[r] = { "down", z } p = p + 4 end,
+ [168] = function() z = scaled2() r = r + 1 ; result[r] = { "down", z } p = p + 4 end,
+ [169] = function() z = scaled3() r = r + 1 ; result[r] = { "down", z } p = p + 4 end,
+ [170] = function() z = scaled4() r = r + 1 ; result[r] = { "down", z } p = p + 4 end,
+
+ [147] = function() r = r + 1 result[r] = { "right", w } end,
+ [152] = function() r = r + 1 result[r] = { "right", x } end,
+ [161] = function() r = r + 1 result[r] = { "down", y } end,
+ [166] = function() r = r + 1 result[r] = { "down", z } end,
+
+ [235] = function() f = readcardinal1(s) p = p + 1 end,
+ [236] = function() f = readcardinal2(s) p = p + 3 end,
+ [237] = function() f = readcardinal3(s) p = p + 3 end,
+ [238] = function() f = readcardinal4(s) p = p + 4 end,
+
+ [239] = function() local n = readcardinal1(s) r = r + 1 result[r] = { "special", readstring(s,n) } p = p + 1 + n end,
+ [240] = function() local n = readcardinal2(s) r = r + 1 result[r] = { "special", readstring(s,n) } p = p + 2 + n end,
+ [241] = function() local n = readcardinal3(s) r = r + 1 result[r] = { "special", readstring(s,n) } p = p + 3 + n end,
+ [242] = function() local n = readcardinal4(s) r = r + 1 result[r] = { "special", readstring(s,n) } p = p + 4 + n end,
+
+ [250] = function() local n = readcardinal1(s) r = r + 1 result[r] = { "pdf", readstring(s,n) } p = p + 1 + n end,
+ [251] = function() local n = readcardinal2(s) r = r + 1 result[r] = { "pdf", readstring(s,n) } p = p + 2 + n end,
+ [252] = function() local n = readcardinal3(s) r = r + 1 result[r] = { "pdf", readstring(s,n) } p = p + 3 + n end,
+ [253] = function() local n = readcardinal4(s) r = r + 1 result[r] = { "pdf", readstring(s,n) } p = p + 4 + n end,
+
+ }
+
+ table.setmetatableindex(actions,function(t,cmd)
+ local v
+ if cmd >= 0 and cmd <= 127 then
+ v = function()
+ if f == 0 then
+ f = 1
+ end
+ r = r + 1 ; result[r] = { "slot", f, cmd }
+ end
+ elseif cmd >= 171 and cmd <= 234 then
+ cmd = cmd - 170
+ v = function()
+ r = r + 1 ; result[r] = { "font", cmd }
+ end
+ else
+ v = dummy
+ end
+ t[cmd] = v
+ return v
+ end)
+
+ function readers.loadvf(filename,data)
+ --
+ local function someerror(m)
+ if not data then
+ data = { }
+ end
+ data.error = m or "fatal error"
+ return data
+ end
+ --
+ s = openstream(filename)
+ if not s then
+ return someerror()
+ end
+ --
+ local cmd = readcardinal1(s)
+ if cmd ~= 247 then
+ return someerror("bad preamble")
+ end
+ cmd = readcardinal1(s)
+ if cmd ~= 202 then
+ return someerror("bad version")
+ end
+ local header = readstring(s,readcardinal1(s))
+ local checksum = readcardinal4(s)
+ local designsize = idiv(readcardinal4(s),16)
+ local fonts = data and data.fonts or { }
+ local glyphs = data and data.glyphs or { }
+ --
+ alpha = 16
+ z = designsize
+ while z >= 040000000 do
+ z = rshift(z,1)
+ alpha = alpha + alpha
+ end
+ beta = idiv(256,alpha)
+ alpha = alpha * z
+ --
+ cmd = readcardinal1(s)
+ while true do
+ local n
+ if cmd == 243 then
+ n = readcardinal1(s) + 1
+ elseif cmd == 244 then
+ n = readcardinal2(s) + 1
+ elseif cmd == 245 then
+ n = readcardinal3(s) + 1
+ elseif cmd == 246 then
+ n = readcardinal4(s) + 1
+ else
+ break
+ end
+ local checksum = skipbytes(s,4)
+ local size = scaled4()
+ local designsize = idiv(readcardinal4(s),16)
+ local pathlen = readcardinal1(s)
+ local namelen = readcardinal1(s)
+ local path = readstring(s,pathlen)
+ local name = readstring(s,namelen)
+ fonts[n] = { path = path, name = name, size = size }
+ cmd = readcardinal1(s)
+ end
+ local index = 0
+ while cmd and cmd <= 242 do
+ local width = 0
+ local length = 0
+ local checksum = 0
+ if cmd == 242 then
+ length = readcardinal4(s)
+ checksum = readcardinal4(s)
+ width = readcardinal4(s)
+ else
+ length = cmd
+ checksum = readcardinal1(s)
+ width = readcardinal3(s)
+ end
+ w, x, y, z, f = 0, 0, 0, 0, false
+ stack, result, r, p = { }, { }, 0, 0
+ while p < length do
+ local cmd = readcardinal1(s)
+ p = p + 1
+ actions[cmd]()
+ end
+ local glyph = glyphs[index]
+ if glyph then
+ glyph.width = width
+ glyph.commands = result
+ else
+ glyphs[index] = {
+ width = width,
+ commands = result,
+ }
+ end
+ index = index + 1
+ if #stack > 0 then
+ -- error: more pushes than pops
+ end
+ if packet_length ~= 0 then
+ -- error: invalid packet length
+ end
+ cmd = readcardinal1(s)
+ end
+ if readcardinal1(s) ~= 248 then
+ -- error: no post
+ end
+ s, result, r = nil, nil, nil
+ if data then
+ data.glyphs = data.glyphs or glyphs
+ data.fonts = data.fonts or fonts
+ return data
+ else
+ return {
+ name = file.nameonly(filename),
+ fontarea = file.pathpart(filename),
+ glyphs = glyphs,
+ designsize = designsize,
+ header = header,
+ fonts = fonts,
+ }
+ end
+ end
+
+ -- the replacement loader (not sparse):
+
+ function readers.loadtfmvf(tfmname,size)
+ local vfname = file.addsuffix(file.nameonly(tfmfile),"vf")
+ local tfmfile = tfmname
+ local vffile = resolvers.findbinfile(vfname,"ovf")
+ if tfmfile and tfmfile ~= "" then
+ if size < 0 then
+ size = idiv(65536 * -size,100)
+ end
+ local data = readers.loadtfm(tfmfile)
+ if data.error then
+ return data
+ end
+ if vffile and vffile ~= "" then
+ data = readers.loadvf(vffile,data)
+ if data.error then
+ return data
+ end
+ end
+ local designsize = data.designsize
+ local glyphs = data.glyphs
+ local parameters = data.parameters
+ local fonts = data.fonts
+ if size ~= designsize then
+ local factor = size / designsize
+ for index, glyph in next, glyphs do
+ if next(glyph) then
+ glyph.width = round(factor*glyph.width)
+ glyph.height = round(factor*glyph.height)
+ glyph.depth = round(factor*glyph.depth)
+ local italic = glyph.italic
+ if italic == 0 then
+ glyph.italic = nil
+ else
+ glyph.italic = round(factor*glyph.italic)
+ end
+ --
+ local kerns = glyph.kerns
+ if kerns then
+ for index, kern in next, kerns do
+ kerns[index] = round(factor*kern)
+ end
+ end
+ --
+ local commands = glyph.commands
+ if commands then
+ for i=1,#commands do
+ local c = commands[i]
+ local t = c[1]
+ if t == "down" or t == "right" then
+ c[2] = round(factor*c[2])
+ elseif t == "rule" then
+ c[2] = round(factor*c[2])
+ c[3] = round(factor*c[3])
+ end
+ end
+ end
+ else
+ glyphs[index] = nil
+ end
+ end
+ for i=2,30 do
+ local p = parameters[i]
+ if p then
+ parameters[i] = round(factor*p)
+ else
+ break
+ end
+ end
+ if fonts then
+ for k, v in next, fonts do
+ v.size = round(factor*v.size)
+ end
+ end
+ else
+ for index, glyph in next, glyphs do
+ if next(glyph) then
+ if glyph.italic == 0 then
+ glyph.italic = nil
+ end
+ else
+ glyphs[index] = nil
+ end
+ end
+ end
+ --
+ parameters.slant = parameters[1]
+ parameters.space = parameters[2]
+ parameters.space_stretch = parameters[3]
+ parameters.space_shrink = parameters[4]
+ parameters.x_height = parameters[5]
+ parameters.quad = parameters[6]
+ parameters.extra_space = parameters[7]
+ --
+ for i=1,7 do
+ parameters[i] = nil -- so no danger for async
+ end
+ --
+ data.characters = glyphs
+ data.glyphs = nil
+ data.size = size
+ -- we assume type1 for now ... maybe the format should be unknown
+ data.filename = tfmfile -- file.replacesuffix(tfmfile,"pfb")
+ data.format = "unknown"
+ --
+ return data
+ end
+ end
+
+end
+
+-- inspect(readers.loadtfmvf(resolvers.findfile("mi-iwonari.tfm")))
+-- inspect(readers.loadtfm(resolvers.findfile("texnansi-palatinonova-regular.tfm")))
+-- inspect(readers.loadtfm(resolvers.findfile("cmex10.tfm")))
+-- inspect(readers.loadtfm(resolvers.findfile("cmr10.tfm")))
+-- local t = readers.loadtfmvf("texnansi-lte50019.tfm")
+-- inspect(t)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-tra.mkiv b/Master/texmf-dist/tex/context/base/mkiv/font-tra.mkiv
index 205ca5ca02d..89a50c5aeb2 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-tra.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-tra.mkiv
@@ -126,7 +126,7 @@
{\otfstepspace
\doif{#3}{mark}{\underbar}{U+\hexnumber{#2}}:%
\setbox\scratchbox\hbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}%
- \ifdim\wd\scratchbox=\zeropoint
+ \ifzeropt\wd\scratchbox
\scratchwidth.125\onepoint
\scratchdistance\dimexpr(\emwidth/2-\scratchwidth)\relax
\kern\scratchdistance
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-ttf.lua b/Master/texmf-dist/tex/context/base/mkiv/font-ttf.lua
index d2fe0917c53..651ede17e21 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/font-ttf.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/font-ttf.lua
@@ -733,7 +733,15 @@ local function repackpoints(glyphs,shapes)
currentx = px
currenty = py
if lastflag == fl then
- nofflags = nofflags + 1
+ if nofflags == 255 then
+ -- This happens in koeieletters!
+ lastflag = lastflag + 0x08
+ r = r + 1 result[r] = char(lastflag,nofflags-1)
+ nofflags = 1
+ lastflag = fl
+ else
+ nofflags = nofflags + 1
+ end
else -- if > 255
if nofflags == 1 then
-- r = r + 1 result[r] = char(lastflag)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/grph-bmp.lua b/Master/texmf-dist/tex/context/base/mkiv/grph-bmp.lua
new file mode 100644
index 00000000000..e10b01aa4b6
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/grph-bmp.lua
@@ -0,0 +1,96 @@
+if not modules then modules = { } end modules ['grph-bmp'] = {
+ version = 1.001,
+ comment = "companion to grph-inc.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local random = math.random
+local context = context
+
+local report_bitmap = logs.reporter("graphics","bitmap")
+
+local bitmaps = { }
+graphics.bitmaps = bitmaps
+
+local wrapimage = images.wrap
+
+function bitmaps.new(xsize,ysize,colorspace,colordepth,mask,index)
+ if not xsize or not ysize or xsize == 0 or ysize == 0 then
+ report_bitmap("provide 'xsize' and 'ysize' larger than zero")
+ return
+ end
+ if not colorspace then
+ report_bitmap("provide 'colorspace' (1, 2, 3, 'gray', 'rgb', 'cmyk'")
+ return
+ end
+ if not colordepth then
+ report_bitmap("provide 'colordepth' (1, 2)")
+ return
+ end
+ return graphics.identifiers.bitmap {
+ colorspace = colorspace,
+ colordepth = colordepth,
+ xsize = xsize,
+ ysize = ysize,
+ mask = mask and true or nil,
+ index = index and true or nil,
+ }
+end
+
+-- function backends.codeinjections.bitmap(bitmap)
+-- return lpdf.injectors.bitmap(bitmap)
+-- end
+
+local function flush(bitmap)
+ local specification = backends.codeinjections.bitmap(bitmap)
+ if specification then
+ return wrapimage(specification)
+ end
+end
+
+bitmaps.flush = flush
+
+function bitmaps.tocontext(bitmap,width,height)
+ local bmp = flush(bitmap)
+ if bmp then
+ if type(width) == "number" then
+ width = width .. "sp"
+ end
+ if type(height) == "number" then
+ height = height .. "sp"
+ end
+ if width or height then
+ context.scale (
+ {
+ width = width,
+ height = height,
+ },
+ bmp
+ )
+ else
+ context(bmp)
+ end
+ end
+end
+
+local function placeholder(nx,ny)
+
+ local nx = nx or 8
+ local ny = ny or nx
+ local bitmap = bitmaps.new(nx,ny,"gray",1)
+ local data = bitmap.data
+
+ for i=1,ny do
+ local d = data[i]
+ for j=1,nx do
+ d[j] = random(100,199)
+ end
+ end
+
+ return lpdf.injectors.bitmap(bitmap)
+
+end
+
+bitmaps.placeholder = placeholder
diff --git a/Master/texmf-dist/tex/context/base/mkiv/grph-chk.lua b/Master/texmf-dist/tex/context/base/mkiv/grph-chk.lua
new file mode 100644
index 00000000000..ed78b856c60
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/grph-chk.lua
@@ -0,0 +1,277 @@
+if not modules then modules = { } end modules ['grph-inc'] = {
+ version = 1.001,
+ comment = "companion to grph-inc.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local xpcall, pcall = xpcall, pcall
+
+local bpfactor = number.dimenfactors.bp
+
+local report = logs.reporter("graphics")
+local report_inclusion = logs.reporter("graphics","inclusion")
+local report_bitmap = logs.reporter("graphics","bitmap")
+local report_pdf = logs.reporter("graphics","pdf")
+
+local trace_pdf = false trackers.register("graphics.pdf", function(v) trace_pdf = v end)
+
+local checkers = figures.checkers
+local genericchecker = checkers.generic
+
+local placeholder = graphics.bitmaps.placeholder
+
+-- This is an experiment. The following method uses Lua to handle the embedding
+-- using the epdf library. This feature will be used when we make the transition
+-- from the pre 1.10 epdf library (using an unsuported low level poppler api) to a
+-- new (lightweight, small and statically compiled) library. More on that later.
+--
+-- The method implemented below has the same performance as the hard coded inclusion
+-- but opens up some possibilities (like merging fonts) that I will look into some
+-- day.
+
+function checkers.pdf(data)
+ local request = data.request
+ local used = data.used
+ if request and used and not request.scanimage then
+ local image = lpdf.epdf.image
+ local openpdf = image.open
+ local closepdf = image.close
+ local querypdf = image.query
+ local copypage = image.copy
+ local pdfdoc = nil
+ local filename = nil
+ request.scanimage = function(t)
+ if pdfdoc then
+ if trace_pdf then
+ report_pdf("scan image %a",filename)
+ end
+ if not filename then
+ filename = pdfdoc.filename
+ end
+ else
+ filename = t.filename
+ if trace_pdf then
+ report_pdf("open and scan image %a",filename)
+ end
+ pdfdoc = openpdf(filename,request.userpassword,request.ownerpassword)
+ end
+ if pdfdoc then
+ --
+ local info = querypdf(pdfdoc,request.page,request.size)
+ if info then
+ local bbox = info and info.boundingbox or { 0, 0, 0, 0 }
+ local height = bbox[4] - bbox[2]
+ local width = bbox[3] - bbox[1]
+ local rotation = info.rotation or 0
+ if rotation == 90 then
+ rotation, height, width = 3, width, height
+ elseif rotation == 180 then
+ rotation = 2
+ elseif rotation == 270 then
+ rotation, height, width = 1, width, height
+ elseif rotation == 1 or rotation == 3 then
+ height, width = width, height
+ else
+ rotation = 0
+ end
+ return {
+ filename = filename,
+ -- page = 1,
+ pages = pdfdoc.nofpages,
+ width = width,
+ height = height,
+ depth = 0,
+ colordepth = 0,
+ xres = 0,
+ yres = 0,
+ xsize = width,
+ ysize = height,
+ rotation = rotation,
+ pdfdoc = pdfdoc,
+ }
+ end
+ end
+ end
+ request.copyimage = function(t)
+ if not pdfdoc then
+ pdfdoc = t.pdfdoc
+ end
+ if pdfdoc then
+ local page = request.page
+ local copied = pdfdoc.nofcopied or 0
+ if not pdfdoc.copied[page] then
+ pdfdoc.copied[page] = true
+ copied = copied + 1
+ end
+ pdfdoc.nofcopied = copied
+ if trace_pdf then
+ report_pdf("copy page %i from image %a, %i pages copied",page,filename,copied)
+ end
+ local result = copypage(pdfdoc,page,nil,request.compact,request.width,request.height,request.attr)
+ if pdfdoc.nofcopied >= pdfdoc.nofpages then
+ if trace_pdf then
+ report_pdf("closing image %a, %i pages copied",filename,copied)
+ end
+ closepdf(pdfdoc)
+ pdfdoc = nil
+ t.pdfdoc = nil
+ end
+ return result
+ else
+ -- message, should not happen as we always first scan so that reopens
+ end
+ end
+ end
+ return genericchecker(data)
+end
+
+local function wrappedidentify(identify,filename)
+ local wrapup = function() report_inclusion("fatal error reading %a",filename) end
+ local _, result = xpcall(identify,wrapup,filename)
+ if result then
+ local xsize = result.xsize or 0
+ local ysize = result.ysize or 0
+ local xres = result.xres or 0
+ local yres = result.yres or 0
+ if xres == 0 or yres == 0 then
+ xres = 300
+ yres = 300
+ end
+ result.xsize = xsize
+ result.ysize = ysize
+ result.xres = xres
+ result.yres = yres
+ result.width = result.width or ((72/xres) * xsize / bpfactor)
+ result.height = result.height or ((72/yres) * ysize / bpfactor)
+ result.depth = result.depth or 0
+ result.filename = filename
+ result.colordepth = result.colordepth or 0
+ result.colorspace = result.colorspace or 0
+ result.rotation = result.rotation or 0
+ result.orientation = result.orientation or 0
+ result.transform = result.transform or 0
+ return result
+ else
+ return { error = "fatal error" }
+ end
+end
+
+function checkers.jpg(data)
+ local request = data.request
+ local used = data.used
+ if request and used and not request.scanimage then
+ local identify = graphics.identify
+ local inject = lpdf.injectors.jpg
+ local found = false
+ request.scanimage = function(t)
+ local result = wrappedidentify(identify,t.filename)
+ found = not result.error
+ return {
+ filename = result.filename,
+ width = result.width,
+ height = result.height,
+ depth = result.depth,
+ colordepth = result.colordepth,
+ xres = result.xres,
+ yres = result.yres,
+ xsize = result.xsize,
+ ysize = result.ysize,
+ colorspace = result.colorspace,
+ rotation = result.rotation,
+ orientation = result.orientation,
+ transform = result.transform,
+ }
+ end
+ request.copyimage = function(t)
+ if found then
+ found = false
+ return inject(t)
+ end
+ end
+ end
+ return genericchecker(data)
+end
+
+function checkers.jp2(data) -- idem as jpg
+ local request = data.request
+ local used = data.used
+ if request and used and not request.scanimage then
+ local identify = graphics.identify
+ local inject = lpdf.injectors.jp2
+ local found = false
+ request.scanimage = function(t)
+ local result = wrappedidentify(identify,t.filename)
+ found = not result.error
+ return {
+ filename = result.filename,
+ width = result.width,
+ height = result.height,
+ depth = result.depth,
+ colordepth = result.colordepth,
+ xres = result.xres,
+ yres = result.yres,
+ xsize = result.xsize,
+ ysize = result.ysize,
+ rotation = result.rotation,
+ colorspace = result.colorspace,
+ orientation = result.orientation,
+ transform = result.transform,
+ }
+ end
+ request.copyimage = function(t)
+ if found then
+ found = false
+ return inject(t)
+ end
+ end
+ end
+ return genericchecker(data)
+end
+
+function checkers.png(data) -- same as jpg (for now)
+ local request = data.request
+ local used = data.used
+ if request and used and not request.scanimage then
+ local identify = graphics.identify
+ local inject = lpdf.injectors.png -- currently pdf specific
+ local found = false
+ request.scanimage = function(t)
+ local result = wrappedidentify(identify,t.filename)
+ found = not result.error
+ return {
+ filename = result.filename,
+ width = result.width,
+ height = result.height,
+ depth = result.depth,
+ colordepth = result.colordepth,
+ xres = result.xres,
+ yres = result.yres,
+ xsize = result.xsize,
+ ysize = result.ysize,
+ rotation = result.rotation,
+ colorspace = result.colorspace,
+ tables = result.tables,
+ interlace = result.interlace,
+ filter = result.filter,
+ orientation = result.orientation,
+ transform = result.transform,
+ }
+ end
+ request.copyimage = function(t)
+ t.colorref = used.colorref -- this is a bit of a hack
+ if found then
+ found = false
+ local ok, result = pcall(inject,t)
+ if ok then
+ return result
+ else
+ report_inclusion("bad bitmap image")
+ return placeholder()
+ end
+ end
+ end
+ end
+ return genericchecker(data)
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/grph-con.lua b/Master/texmf-dist/tex/context/base/mkiv/grph-con.lua
index f106e1036c5..c3c711b0c72 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/grph-con.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/grph-con.lua
@@ -12,6 +12,7 @@ local tonumber = tonumber
local longtostring = string.longtostring
local formatters = string.formatters
local expandfilename = dir.expandname
+local isfile = lfs.isfile
local settings_to_array = utilities.parsers.settings_to_array
local settings_to_hash = utilities.parsers.settings_to_hash
@@ -68,9 +69,9 @@ do -- eps | ps
-dPDFSETTINGS=/%presets%
-dEPSCrop
-dCompatibilityLevel=%level%
- -sOutputFile="%newname%"
+ -sOutputFile=%newname%
%colorspace%
- "%oldname%"
+ %oldname%
-c quit
]],
checkers = {
@@ -121,7 +122,7 @@ do -- eps | ps
local presets = resolutions[resolution or "high"] or resolutions.high
local level = codeinjections.getformatoption("pdf_level") or "1.3"
local tmpname = oldname
- if not tmpname or tmpname == "" or not lfs.isfile(tmpname) then
+ if not tmpname or tmpname == "" or not isfile(tmpname) then
return
end
if cleanups.ai then
@@ -197,9 +198,9 @@ do -- svg
name = "svg to something",
program = "inkscape",
template = longtostring [[
- "%oldname%"
+ %oldname%
--export-dpi=%resolution%
- --export-%format%="%newname%"
+ --export-%format%=%newname%
]],
checkers = {
oldname = "readable",
@@ -289,7 +290,7 @@ do -- png | jpg | profiles
local pngconverters = converters.png
local function profiles()
- if not lfs.isfile(rgbprofile) then
+ if not isfile(rgbprofile) then
local found = resolvers.findfile(rgbprofile)
if found and found ~= "" then
rgbprofile = found
@@ -297,7 +298,7 @@ do -- png | jpg | profiles
report_figures("unknown profile %a",rgbprofile)
end
end
- if not lfs.isfile(cmykprofile) then
+ if not isfile(cmykprofile) then
local found = resolvers.findfile(cmykprofile)
if found and found ~= "" then
cmykprofile = found
@@ -324,7 +325,7 @@ do -- png | jpg | profiles
local pngtocmykpdf = sandbox.registerrunner {
name = "png to cmyk pdf",
program = "gm",
- template = [[convert -compress Zip -strip +profile "*" -profile "%rgbprofile%" -profile "%cmykprofile%" -sampling-factor 1x1 "%oldname%" "%newname%"]],
+ template = [[convert -compress Zip -strip +profile "*" -profile %rgbprofile% -profile %cmykprofile% -sampling-factor 1x1 %oldname% %newname%]],
checkers = checkers,
defaults = defaults,
}
@@ -332,7 +333,7 @@ do -- png | jpg | profiles
local jpgtocmykpdf = sandbox.registerrunner {
name = "jpg to cmyk pdf",
program = "gm",
- template = [[convert -compress JPEG -strip +profile "*" -profile "%rgbprofile%" -profile "%cmykprofile%" -sampling-factor 1x1 "%oldname%" "%newname%"]],
+ template = [[convert -compress JPEG -strip +profile "*" -profile %rgbprofile% -profile %cmykprofile% -sampling-factor 1x1 %oldname% %newname%]],
checkers = checkers,
defaults = defaults,
}
@@ -340,7 +341,7 @@ do -- png | jpg | profiles
local pngtograypdf = sandbox.registerrunner {
name = "png to gray pdf",
program = "gm",
- template = [[convert -colorspace gray -compress Zip -sampling-factor 1x1 "%oldname%" "%newname%"]],
+ template = [[convert -colorspace gray -compress Zip -sampling-factor 1x1 %oldname% %newname%]],
checkers = checkers,
defaults = defaults,
}
@@ -348,7 +349,7 @@ do -- png | jpg | profiles
local jpgtograypdf = sandbox.registerrunner {
name = "jpg to gray pdf",
program = "gm",
- template = [[convert -colorspace gray -compress Zip -sampling-factor 1x1 "%oldname%" "%newname%"]],
+ template = [[convert -colorspace gray -compress Zip -sampling-factor 1x1 %oldname% %newname%]],
checkers = checkers,
defaults = defaults,
}
@@ -401,7 +402,7 @@ do -- png | jpg | profiles
local recolorpng = sandbox.registerrunner {
name = "recolor png",
program = "gm",
- template = [[convert -recolor "%color%" "%oldname%" "%newname%"]],
+ template = [[convert -recolor %color% %oldname% %newname%]],
checkers = checkers,
defaults = defaults,
}
@@ -420,3 +421,25 @@ do -- png | jpg | profiles
end
end
+
+if CONTEXTLMTXMODE > 0 then
+
+ -- This might also work ok in mkiv but is yet untested. Anyway, it's experimental as we
+ -- go through TeX which is is inefficient. I'll improve the buffer trick.
+
+ local function remap(specification)
+ local fullname = specification.fullname
+ if fullname then
+ local only = file.nameonly(fullname)
+ local name = formatters["svg-%s-inclusion"](only)
+ local code = formatters["\\includesvgfile[%s]\\resetbuffer[%s]"](fullname,name)
+ buffers.assign(name,code)
+ specification.format = "buffer"
+ specification.fullname = name
+ end
+ return specification
+ end
+
+ figures.remappers.svg = { mp = remap }
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/grph-fil.lua b/Master/texmf-dist/tex/context/base/mkiv/grph-fil.lua
index 540356c46cf..b3980783038 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/grph-fil.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/grph-fil.lua
@@ -45,7 +45,7 @@ job.register('job.files.collected', tobesaved, initializer)
local runner = sandbox.registerrunner {
name = "hashed context run",
program = "context",
- template = [[%options% "%filename%"]],
+ template = [[%options% %filename%]],
checkers = {
options = "string",
filename = "readable",
@@ -57,10 +57,32 @@ function jobfiles.run(name,action)
local oldchecksum = collected[usedname]
local newchecksum = checksum(usedname)
local resultfile = replacesuffix(usedname,resultsuffix)
- if jobfiles.forcerun or not oldchecksum or oldchecksum ~= newchecksum or not isfile(resultfile) then
+ local tobedone = false
+ if jobfiles.forcerun then
+ tobedone = true
if trace_run then
- report_run("processing file, changes in %a, processing forced",name)
+ report_run("processing file, changes in %a, %s",name,"processing forced")
end
+ end
+ if not tobedone and not oldchecksum then
+ tobedone = true
+ if trace_run then
+ report_run("processing file, changes in %a, %s",name,"no checksum yet")
+ end
+ end
+ if not tobedone and oldchecksum ~= newchecksum then
+ tobedone = true
+ if trace_run then
+ report_run("processing file, changes in %a, %s",name,"checksum mismatch")
+ end
+ end
+ if not tobedone and not isfile(resultfile) then
+ tobedone = true
+ if trace_run then
+ report_run("processing file, changes in %a, %s",name,"no result file")
+ end
+ end
+ if tobedone then
local ta = type(action)
if ta == "function" then
action(name)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/grph-img.lua b/Master/texmf-dist/tex/context/base/mkiv/grph-img.lua
new file mode 100644
index 00000000000..4b4bee1fc08
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/grph-img.lua
@@ -0,0 +1,738 @@
+ if not modules then modules = { } end modules ['grph-img'] = {
+ version = 1.001,
+ comment = "companion to grph-inc.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- The jpg identification and inclusion code is based on the code in \LUATEX\ but as we
+-- use \LUA\ we can do it a bit cleaner. We can also use some helpers for reading from
+-- file. We could make it even more lean and mean. When all works out ok I will clean
+-- up this code a bit as we can divert more from luatex.
+
+local lower, strip = string.lower, string.strip
+local round = math.round
+local concat = table.concat
+local suffixonly = file.suffix
+
+local newreader = io.newreader
+local setmetatableindex = table.setmetatableindex
+local setmetatablecall = table.setmetatablecall
+
+local graphics = graphics or { }
+local identifiers = { }
+graphics.identifiers = identifiers
+
+do
+
+ local colorspaces = {
+ [1] = 1, -- gray
+ [3] = 2, -- rgb
+ [4] = 3, -- cmyk
+ }
+
+ local tags = {
+ [0xC0] = { name = "SOF0", }, -- baseline DCT
+ [0xC1] = { name = "SOF1", }, -- extended sequential DCT
+ [0xC2] = { name = "SOF2", }, -- progressive DCT
+ [0xC3] = { name = "SOF3", supported = false }, -- lossless (sequential)
+
+ [0xC5] = { name = "SOF5", supported = false }, -- differential sequential DCT
+ [0xC6] = { name = "SOF6", supported = false }, -- differential progressive DCT
+ [0xC7] = { name = "SOF7", supported = false }, -- differential lossless (sequential)
+
+ [0xC8] = { name = "JPG", }, -- reserved for JPEG extensions
+ [0xC9] = { name = "SOF9", }, -- extended sequential DCT
+ [0xCA] = { name = "SOF10", supported = false }, -- progressive DCT
+ [0xCB] = { name = "SOF11", supported = false }, -- lossless (sequential)
+
+ [0xCD] = { name = "SOF13", supported = false }, -- differential sequential DCT
+ [0xCE] = { name = "SOF14", supported = false }, -- differential progressive DCT
+ [0xCF] = { name = "SOF15", supported = false }, -- differential lossless (sequential)
+
+ [0xC4] = { name = "DHT" }, -- define Huffman table(s)
+
+ [0xCC] = { name = "DAC" }, -- define arithmetic conditioning table
+
+ [0xD0] = { name = "RST0", zerolength = true }, -- restart
+ [0xD1] = { name = "RST1", zerolength = true }, -- restart
+ [0xD2] = { name = "RST2", zerolength = true }, -- restart
+ [0xD3] = { name = "RST3", zerolength = true }, -- restart
+ [0xD4] = { name = "RST4", zerolength = true }, -- restart
+ [0xD5] = { name = "RST5", zerolength = true }, -- restart
+ [0xD6] = { name = "RST6", zerolength = true }, -- restart
+ [0xD7] = { name = "RST7", zerolength = true }, -- restart
+
+ [0xD8] = { name = "SOI", zerolength = true }, -- start of image
+ [0xD9] = { name = "EOI", zerolength = true }, -- end of image
+ [0xDA] = { name = "SOS" }, -- start of scan
+ [0xDB] = { name = "DQT" }, -- define quantization tables
+ [0xDC] = { name = "DNL" }, -- define number of lines
+ [0xDD] = { name = "DRI" }, -- define restart interval
+ [0xDE] = { name = "DHP" }, -- define hierarchical progression
+ [0xDF] = { name = "EXP" }, -- expand reference image(s)
+
+ [0xE0] = { name = "APP0" }, -- application marker, used for JFIF
+ [0xE1] = { name = "APP1" }, -- application marker
+ [0xE2] = { name = "APP2" }, -- application marker
+ [0xE3] = { name = "APP3" }, -- application marker
+ [0xE4] = { name = "APP4" }, -- application marker
+ [0xE5] = { name = "APP5" }, -- application marker
+ [0xE6] = { name = "APP6" }, -- application marker
+ [0xE7] = { name = "APP7" }, -- application marker
+ [0xE8] = { name = "APP8" }, -- application marker
+ [0xE9] = { name = "APP9" }, -- application marker
+ [0xEA] = { name = "APP10" }, -- application marker
+ [0xEB] = { name = "APP11" }, -- application marker
+ [0xEC] = { name = "APP12" }, -- application marker
+ [0xED] = { name = "APP13" }, -- application marker
+ [0xEE] = { name = "APP14" }, -- application marker, used by Adobe
+ [0xEF] = { name = "APP15" }, -- application marker
+
+ [0xF0] = { name = "JPG0" }, -- reserved for JPEG extensions
+ [0xFD] = { name = "JPG13" }, -- reserved for JPEG extensions
+ [0xFE] = { name = "COM" }, -- comment
+
+ [0x01] = { name = "TEM", zerolength = true }, -- temporary use
+ }
+
+ -- More can be found in http://www.exif.org/Exif2-2.PDF but basically we have
+ -- good old tiff tags here.
+
+ local function read_APP1_Exif(f, xres, yres, orientation) -- untested
+ local position = false
+ local littleendian = false
+ -- endian II|MM
+ while true do
+ position = f:getposition()
+ local b = f:readbyte()
+ if b == 0 then
+ -- next one
+ elseif b == 0x4D and f:readbyte() == 0x4D then -- M
+ -- big endian
+ break
+ elseif b == 0x49 and f:readbyte() == 0x49 then -- I
+ -- little endian
+ littleendian = true
+ break
+ else
+ -- warning "bad exif data"
+ return xres, yres, orientation
+ end
+ end
+ -- version
+ local version = littleendian and f:readcardinal2le() or f:readcardinal2()
+ if version ~= 42 then
+ return xres, yres, orientation
+ end
+ -- offset to records
+ local offset = littleendian and f:readcardinal4le() or f:readcardinal4()
+ if not offset then
+ return xres, yres, orientation
+ end
+ f:setposition(position + offset)
+ local entries = littleendian and f:readcardinal2le() or f:readcardinal2()
+ if not entries or entries == 0 then
+ return xres, yres, orientation
+ end
+ local x_res, y_res, x_res_ms, y_res_ms, x_temp, y_temp
+ local res_unit, res_unit_ms
+ for i=1,entries do
+ local tag = littleendian and f:readcardinal2le() or f:readcardinal2()
+ local kind = littleendian and f:readcardinal2le() or f:readcardinal2()
+ local size = littleendian and f:readcardinal4le() or f:readcardinal4()
+ local value = 0
+ local num = 0
+ local den = 0
+ if kind == 1 or kind == 7 then -- byte | undefined
+ value = f:readbyte()
+ f:skip(3)
+ elseif kind == 3 or kind == 8 then -- (un)signed short
+ value = littleendian and f:readcardinal2le() or f:readcardinal2()
+ f:skip(2)
+ elseif kind == 4 or kind == 9 then -- (un)signed long
+ value = littleendian and f:readcardinal4le() or f:readcardinal4()
+ elseif kind == 5 or kind == 10 then -- (s)rational
+ local offset = littleendian and f:readcardinal4le() or f:readcardinal4()
+ local saved = f:getposition()
+ f:setposition(position+offset)
+ num = littleendian and f:readcardinal4le() or f:readcardinal4()
+ den = littleendian and f:readcardinal4le() or f:readcardinal4()
+ f:setposition(saved)
+ else -- 2 -- ascii
+ f:skip(4)
+ end
+ if tag == 274 then -- orientation
+ orientation = value
+ elseif tag == 282 then -- x resolution
+ if den ~= 0 then
+ x_res = num/den
+ end
+ elseif tag == 283 then -- y resolution
+ if den ~= 0 then
+ y_res = num/den
+ end
+ elseif tag == 296 then -- resolution unit
+ if value == 2 then
+ res_unit = 1
+ elseif value == 3 then
+ res_unit = 2.54
+ end
+ elseif tag == 0x5110 then -- pixel unit
+ res_unit_ms = value == 1
+ elseif tag == 0x5111 then -- x pixels per unit
+ x_res_ms = value
+ elseif tag == 0x5112 then -- y pixels per unit
+ y_res_ms = value
+ end
+ end
+ if x_res and y_res and res_unit and res_unit > 0 then
+ x_temp = round(x_res * res_unit)
+ y_temp = round(y_res * res_unit)
+ elseif x_res_ms and y_res_ms and res_unit_ms then
+ x_temp = round(x_res_ms * 0.0254) -- in meters
+ y_temp = round(y_res_ms * 0.0254) -- in meters
+ end
+ if x_temp and a_temp and x_temp > 0 and y_temp > 0 then
+ if (x_temp ~= x_res or y_temp ~= y_res) and x_res ~= 0 and y_res ~= 0 then
+ -- exif resolution differs from already found resolution
+ elseif x_temp == 1 or y_temp == 1 then
+ -- exif resolution is kind of weird
+ else
+ return x_temp, y_temp, orientation
+ end
+ end
+ return round(xres), round(yres), orientation
+ end
+
+ function identifiers.jpg(filename,method)
+ local specification = {
+ filename = filename,
+ filetype = "jpg",
+ }
+ if not filename or filename == "" then
+ specification.error = "invalid filename"
+ return specification -- error
+ end
+ local f = newreader(filename,method)
+ if not f then
+ specification.error = "unable to open file"
+ return specification -- error
+ end
+ specification.xres = 0
+ specification.yres = 0
+ specification.orientation = 1
+ specification.totalpages = 1
+ specification.pagenum = 1
+ specification.length = 0
+ local banner = f:readcardinal2()
+ if banner ~= 0xFFD8 then
+ specification.error = "no jpeg file"
+ return specification -- error
+ end
+ local xres = 0
+ local yres = 0
+ local orientation = 1
+ local okay = false
+ local filesize = f:getsize() -- seek end
+ -- local majorversion = pdfmajorversion and pdfmajorversion() or 1
+ -- local minorversion = pdfminorversion and pdfminorversion() or 7
+ while f:getposition() < filesize do
+ local b = f:readbyte()
+ if not b then
+ break
+ elseif b ~= 0xFF then
+ if not okay then
+ -- or check for size
+ specification.error = "incomplete file"
+ end
+ break
+ end
+ local category = f:readbyte()
+ local position = f:getposition()
+ local length = 0
+ local tagdata = tags[category]
+ if not tagdata then
+ specification.error = "invalid tag"
+ break
+ elseif tagdata.supported == false then
+ specification.error = "unsupported " .. tagdata.comment
+ break
+ end
+ local name = tagdata.name
+ if name == "SOF0" or name == "SOF1" or name == "SOF2" then
+ --
+ -- It makes no sense to support pdf < 1.3 so we now just omit this
+ -- test. There is no need to polute the code with useless tests.
+ --
+ -- if majorversion == 1 and minorversion <= 2 then
+ -- specification.error = "no progressive DCT in PDF <= 1.2"
+ -- break
+ -- end
+ length = f:readcardinal2()
+ specification.colordepth = f:readcardinal()
+ specification.ysize = f:readcardinal2()
+ specification.xsize = f:readcardinal2()
+ specification.colorspace = colorspaces[f:readcardinal()]
+ if not specification.colorspace then
+ specification.error = "unsupported color space"
+ break
+ end
+ okay = true
+ elseif name == "APP0" then
+ length = f:readcardinal2()
+ if length > 6 then
+ local format = f:readstring(5)
+ if format == "JFIF\000" then
+ f:skip(2)
+ units = f:readcardinal()
+ xres = f:readcardinal2()
+ yres = f:readcardinal2()
+ if units == 1 then
+ -- pixels per inch
+ if xres == 1 or yres == 1 then
+ -- warning
+ end
+ elseif units == 2 then
+ -- pixels per cm */
+ xres = xres * 2.54
+ yres = yres * 2.54
+ else
+ xres = 0
+ yres = 0
+ end
+ end
+ end
+ elseif name == "APP1" then
+ length = f:readcardinal2()
+ if length > 7 then
+ local format = f:readstring(5)
+ if format == "Exif\000" then
+ xres, yres, orientation = read_APP1_Exif(f,xres,yres,orientation)
+ end
+ end
+ elseif not tagdata.zerolength then
+ length = f:readcardinal2()
+ end
+ if length > 0 then
+ f:setposition(position+length)
+ end
+ end
+ f:close()
+ if not okay then
+ specification.error = specification.error or "invalid file"
+ elseif not specification.error then
+ if xres == 0 and yres ~= 0 then
+ xres = yres
+ end
+ if yres == 0 and xres ~= 0 then
+ yres = xres
+ end
+ end
+ specification.xres = xres
+ specification.yres = yres
+ specification.orientation = orientation
+ specification.length = filesize
+ return specification
+ end
+
+end
+
+do
+
+ local function read_boxhdr(specification,f)
+ local size = f:readcardinal4()
+ local kind = f:readstring(4)
+ if kind then
+ kind = strip(lower(kind))
+ else
+ kind = ""
+ end
+ if size == 1 then
+ size = f:readcardinal4() * 0xFFFF0000 + f:readcardinal4()
+ end
+ if size == 0 and kind ~= "jp2c" then -- move this
+ specification.error = "invalid size"
+ end
+ return kind, size
+ end
+
+ local function scan_ihdr(specification,f)
+ specification.ysize = f:readcardinal4()
+ specification.xsize = f:readcardinal4()
+ f:skip(2) -- nc
+ specification.colordepth = f:readcardinal() + 1
+ f:skip(3) -- c unkc ipr
+ end
+
+ local function scan_resc_resd(specification,f)
+ local vr_n = f:readcardinal2()
+ local vr_d = f:readcardinal2()
+ local hr_n = f:readcardinal2()
+ local hr_d = f:readcardinal2()
+ local vr_e = f:readcardinal()
+ local hr_e = f:readcardinal()
+ specification.xres = math.round((hr_n / hr_d) * math.exp(hr_e * math.log(10.0)) * 0.0254)
+ specification.yres = math.round((vr_n / vr_d) * math.exp(vr_e * math.log(10.0)) * 0.0254)
+ end
+
+ local function scan_res(specification,f,last)
+ local pos = f:getposition()
+ while true do
+ local kind, size = read_boxhdr(specification,f)
+ pos = pos + size
+ if kind == "resc" then
+ if specification.xres == 0 and specification.yres == 0 then
+ scan_resc_resd(specification,f)
+ if f:getposition() ~= pos then
+ specification.error = "invalid resc"
+ return
+ end
+ end
+ elseif tpos == "resd" then
+ scan_resc_resd(specification,f)
+ if f:getposition() ~= pos then
+ specification.error = "invalid resd"
+ return
+ end
+ elseif pos > last then
+ specification.error = "invalid res"
+ return
+ elseif pos == last then
+ break
+ end
+ if specification.error then
+ break
+ end
+ f:setposition(pos)
+ end
+ end
+
+ local function scan_jp2h(specification,f,last)
+ local okay = false
+ local pos = f:getposition()
+ while true do
+ local kind, size = read_boxhdr(specification,f)
+ pos = pos + size
+ if kind == "ihdr" then
+ scan_ihdr(specification,f)
+ if f:getposition() ~= pos then
+ specification.error = "invalid ihdr"
+ return false
+ end
+ okay = true
+ elseif kind == "res" then
+ scan_res(specification,f,pos)
+ elseif pos > last then
+ specification.error = "invalid jp2h"
+ return false
+ elseif pos == last then
+ break
+ end
+ if specification.error then
+ break
+ end
+ f:setposition(pos)
+ end
+ return okay
+ end
+
+ function identifiers.jp2(filename,method)
+ local specification = {
+ filename = filename,
+ filetype = "jp2",
+ }
+ if not filename or filename == "" then
+ specification.error = "invalid filename"
+ return specification -- error
+ end
+ local f = newreader(filename,method)
+ if not f then
+ specification.error = "unable to open file"
+ return specification -- error
+ end
+ specification.xres = 0
+ specification.yres = 0
+ specification.orientation = 1
+ specification.totalpages = 1
+ specification.pagenum = 1
+ specification.length = 0
+ local xres = 0
+ local yres = 0
+ local orientation = 1
+ local okay = false
+ local filesize = f:getsize() -- seek end
+ --
+ local pos = 0
+ -- signature
+ local kind, size = read_boxhdr(specification,f)
+ pos = pos + size
+ f:setposition(pos)
+ -- filetype
+ local kind, size = read_boxhdr(specification,f)
+ if kind ~= "ftyp" then
+ specification.error = "missing ftyp box"
+ return specification
+ end
+ pos = pos + size
+ f:setposition(pos)
+ while not okay do
+ local kind, size = read_boxhdr(specification,f)
+ pos = pos + size
+ if kind == "jp2h" then
+ okay = scan_jp2h(specification,f,pos)
+ elseif kind == "jp2c" and not okay then
+ specification.error = "no ihdr box found"
+ return specification
+ end
+ f:setposition(pos)
+ end
+ --
+ f:close()
+ if not okay then
+ specification.error = "invalid file"
+ elseif not specification.error then
+ if xres == 0 and yres ~= 0 then
+ xres = yres
+ end
+ if yres == 0 and xres ~= 0 then
+ yres = xres
+ end
+ end
+ specification.xres = xres
+ specification.yres = yres
+ specification.orientation = orientation
+ specification.length = filesize
+ return specification
+ end
+
+end
+
+do
+
+ -- 0 = gray "image b"
+ -- 2 = rgb "image c"
+ -- 3 = palette "image c" + "image i"
+ -- 4 = gray + alpha "image b"
+ -- 6 = rgb + alpha "image c"
+
+ -- for i=1,length/3 do
+ -- palette[i] = f:readstring3)
+ -- end
+
+ local function grab(t,f,once)
+ if once then
+ for i=1,#t do
+ local l = t[i]
+ f:setposition(l.offset)
+ t[i] = f:readstring(l.length)
+ end
+ local data = concat(t)
+ -- t wiped in caller
+ return data
+ else
+ local data = { }
+ for i=1,#t do
+ local l = t[i]
+ f:setposition(l.offset)
+ data[i] = f:readstring(l.length)
+ end
+ return concat(data)
+ end
+ end
+
+ function identifiers.png(filename,method)
+ local specification = {
+ filename = filename,
+ filetype = "png",
+ }
+ if not filename or filename == "" then
+ specification.error = "invalid filename"
+ return specification -- error
+ end
+ local f = newreader(filename,method)
+ if not f then
+ specification.error = "unable to open file"
+ return specification -- error
+ end
+ specification.xres = 0
+ specification.yres = 0
+ specification.orientation = 1
+ specification.totalpages = 1
+ specification.pagenum = 1
+ specification.offset = 0
+ specification.length = 0
+ local filesize = f:getsize() -- seek end
+ local tables = { }
+ local banner = f:readstring(8)
+ if banner ~= "\137PNG\013\010\026\010" then
+ specification.error = "no png file"
+ return specification -- error
+ end
+ while true do
+ local position = f:getposition()
+ if position >= filesize then
+ break
+ end
+ local length = f:readcardinal4()
+ if not length then
+ break
+ end
+ local kind = f:readstring(4)
+ if kind then
+ kind = lower(kind)
+ else
+ break
+ end
+ if kind == "ihdr" then -- metadata
+ specification.xsize = f:readcardinal4()
+ specification.ysize = f:readcardinal4()
+ specification.colordepth = f:readcardinal()
+ specification.colorspace = f:readcardinal()
+ specification.compression = f:readcardinal()
+ specification.filter = f:readcardinal()
+ specification.interlace = f:readcardinal()
+ tables[kind] = true
+ elseif kind == "iend" then
+ tables[kind] = true
+ break
+ elseif kind == "phys" then
+ local x = f:readcardinal4()
+ local y = f:readcardinal4()
+ local u = f:readcardinal()
+ if u == 1 then -- meters
+ -- x = round(0.0254 * x)
+ -- y = round(0.0254 * y)
+ end
+ specification.xres = x
+ specification.yres = y
+ tables[kind] = true
+ elseif kind == "idat" or kind == "plte" or kind == "gama" or kind == "trns" then
+ local t = tables[kind]
+ if not t then
+ t = setmetatablecall(grab)
+ tables[kind] = t
+ end
+ t[#t+1] = {
+ offset = f:getposition(),
+ length = length,
+ }
+ else
+ tables[kind] = true
+ end
+ f:setposition(position+length+12) -- #size #kind #crc
+ end
+ f:close()
+ specification.tables = tables
+ return specification
+ end
+
+end
+
+do
+
+ local function gray(t,k)
+ local v = 0
+ t[k] = v
+ return v
+ end
+
+ local function rgb(t,k)
+ local v = { 0, 0, 0 }
+ t[k] = v
+ return v
+ end
+
+ local function cmyk(t,k)
+ local v = { 0, 0, 0, 0 }
+ t[k] = v
+ return v
+ end
+
+ function identifiers.bitmap(specification)
+ local xsize = specification.xsize or 0
+ local ysize = specification.ysize or 0
+ local width = specification.width or xsize * 65536
+ local height = specification.height or ysize * 65536
+ local colordepth = specification.colordepth or 1 -- 1 .. 2
+ local colorspace = specification.colorspace or 1 -- 1 .. 3
+ local pixel = false
+ local data = specification.data
+ local mask = specification.mask
+ local index = specification.index
+ if colorspace == 1 or colorspace == "gray" then
+ pixel = gray
+ colorspace = 1
+ elseif colorspace == 2 or colorspace == "rgb" then
+ pixel = rgb
+ colorspace = 2
+ elseif colorspace == 3 or colorspace == "cmyk" then
+ pixel = cmyk
+ colorspace = 3
+ else
+ return
+ end
+ if colordepth == 8 then
+ colordepth = 1
+ elseif colordepth == 16 then
+ colordepth = 2
+ end
+ if colordepth > 1 then
+ -- not yet
+ return
+ end
+ if data then
+ -- assume correct data
+ else
+ data = { }
+ for i=1,ysize do
+ data[i] = setmetatableindex(pixel)
+ end
+ end
+ if mask == true then
+ mask = { }
+ for i=1,ysize do
+ mask[i] = setmetatableindex(gray)
+ end
+ end
+ if index then
+ index = setmetatableindex(pixel)
+ end
+ local specification = {
+ xsize = xsize,
+ ysize = ysize,
+ width = width,
+ height = height,
+ colordepth = colordepth,
+ colorspace = colorspace,
+ data = data,
+ mask = mask,
+ index = index,
+ }
+ return specification
+ end
+
+end
+
+function graphics.identify(filename,filetype)
+ local identify = filetype and identifiers[filetype]
+ if identify then
+ return identify(filename)
+ end
+ local identify = identifiers[suffixonly(filename)]
+ if identify then
+ identify = identify(filename)
+ else
+ identify = {
+ filename = filename,
+ filetype = filetype,
+ error = "identification failed",
+ }
+ end
+ -- inspect(identify)
+ return identify
+end
+
+-- inspect(identifiers.jpg("t:/sources/hacker.jpg"))
+-- inspect(identifiers.png("t:/sources/mill.png"))
diff --git a/Master/texmf-dist/tex/context/base/mkiv/grph-inc.lua b/Master/texmf-dist/tex/context/base/mkiv/grph-inc.lua
index 0856e0de9bb..8032f3c240f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/grph-inc.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/grph-inc.lua
@@ -55,6 +55,7 @@ local todimen = string.todimen
local collapsepath = file.collapsepath
local formatters = string.formatters
local odd = math.odd
+local isfile, isdir, modificationtime = lfs.isfile, lfs.isdir, lfs.modification
local P, R, S, Cc, C, Cs, Ct, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.Cc, lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.match
@@ -157,36 +158,11 @@ function checkimage(figure)
end
end
---- begin of mapping / this will become graphics & code|nodeinjections but not this year
+-- This is a bit of abstraction. Fro a while we will follow the luatex image
+-- model.
-local __img__ = type(img) == "table" and img or { }
-images.__img__ =__img__
-
-local imgnew = __img__.new
-local imgscan = __img__.scan
-local imgcopy = __img__.copy
-local imgwrap = __img__.node
-local imgembed = __img__.immediatewrite
-
-if imgnew then
- -- catch (actually we should be less picky in img)
- local __img__new__ = imgnew
- imgnew = function(t)
- t.kind = nil
- return __img__new__(t)
- end
-end
-
-updaters.register("backend.update.img",function()
- local img = images.__img__
- imgnew = img.new
- imgscan = img.scan
- imgcopy = img.copy
- imgwrap = img.wrap
- imgembed = img.embed
-end)
-
-local imagekeys = { -- only relevant ones
+local imagekeys = {
+ -- only relevant ones (permitted in luatex)
"width", "height", "depth", "bbox",
"colordepth", "colorspace",
"filename", "filepath", "visiblefilename",
@@ -214,28 +190,26 @@ images.keys = imagekeys
images.types = imagetypes
images.sizes = imagesizes
--- new interface
-
local function createimage(specification)
- return imgnew(specification)
+ return backends.codeinjections.newimage(specification)
end
local function copyimage(specification)
- return imgcopy(specification)
+ return backends.codeinjections.copyimage(specification)
end
local function scanimage(specification)
- return imgscan(specification)
+ return backends.codeinjections.scanimage(specification)
end
local function embedimage(specification)
-- write the image to file
- return imgembed(specification)
+ return backends.codeinjections.embedimage(specification)
end
local function wrapimage(specification)
-- create an image rule
- return imgwrap(specification)
+ return backends.codeinjections.wrapimage(specification)
end
images.create = createimage
@@ -244,20 +218,20 @@ images.copy = copyimage
images.wrap = wrapimage
images.embed = embedimage
--- now we reimplement img:
-
-img = {
- new = createimage,
- scan = scanimage,
- copy = copyimage,
- node = wrapimage,
- write = function(specification) context(wrapimage(specification)) end,
- immediatewrite = embedimage,
- immediatewriteobject = function() end, -- not upported, experimental anyway
- boxes = function() return sortedkeys(imagesizes) end,
- fields = function() return imagekeys end,
- types = function() return { unpack(imagetypes,0,#imagetypes) } end,
-}
+-- If really needed we can provide:
+--
+-- img = {
+-- new = createimage,
+-- scan = scanimage,
+-- copy = copyimage,
+-- node = wrapimage,
+-- write = function(specification) context(wrapimage(specification)) end,
+-- immediatewrite = embedimage,
+-- immediatewriteobject = function() end, -- not upported, experimental anyway
+-- boxes = function() return sortedkeys(imagesizes) end,
+-- fields = function() return imagekeys end,
+-- types = function() return { unpack(imagetypes,0,#imagetypes) } end,
+-- }
-- end of copies / mapping
@@ -325,6 +299,7 @@ local figures_resources = allocate() figures.resources = figures_resources
local existers = allocate() figures.existers = existers
local checkers = allocate() figures.checkers = checkers
local includers = allocate() figures.includers = includers
+local remappers = allocate() figures.remappers = remappers
local converters = allocate() figures.converters = converters
local identifiers = allocate() figures.identifiers = identifiers
local programs = allocate() figures.programs = programs
@@ -351,7 +326,7 @@ local figures_order = allocate {
local figures_formats = allocate { -- magic and order will move here
["pdf"] = { list = { "pdf" } },
- ["mps"] = { patterns = { "mps", "%d+" } },
+ ["mps"] = { patterns = { "^mps$", "^%d+$" } }, -- we need to anchor
["jpg"] = { list = { "jpg", "jpeg" } },
["png"] = { list = { "png" } },
["jp2"] = { list = { "jp2" } },
@@ -806,24 +781,32 @@ local function register(askedname,specification)
arguments or ""
)
end
- -- quick hack
- local converter = (newformat ~= format or resolution or arguments) and converters[format]
+ -- begin of quick hack
+ local remapper = remappers[format]
+ if remapper then
+ remapper = remapper[conversion]
+ if remapper then
+ specification = remapper(specification) or specification
+ format = specification.format
+ newformat = format
+ conversion = nil
+ end
+ end
+ -- end of quick hack
+ local converter = (not remapper) and (newformat ~= format or resolution or arguments) and converters[format]
if converter then
- if converter[newformat] then
- converter = converter[newformat]
+ local okay = converter[newformat]
+ if okay then
+ converter = okay
else
newformat = defaultformat
- if converter[newformat] then
- converter = converter[newformat]
- else
- converter = nil
- newformat = defaultformat
- end
+ converter = converter[newformat]
end
elseif trace_conversion then
report_inclusion("no converter for %a to %a",format,newformat)
end
if converter then
+ -- todo: make this a function
--
-- todo: outline as helper function
--
@@ -850,7 +833,7 @@ local function register(askedname,specification)
if subpath and subpath ~= "" and subpath ~= "." then
newpath = newpath .. "/" .. subpath
end
- if not lfs.isdir(newpath) then
+ if not isdir(newpath) then
dir.makedirs(newpath)
if not file.is_writable(newpath) then
if trace_conversion then
@@ -888,8 +871,8 @@ local function register(askedname,specification)
local newname = file.join(newpath,newbase)
oldname = collapsepath(oldname)
newname = collapsepath(newname)
- local oldtime = lfs.attributes(oldname,'modification') or 0
- local newtime = lfs.attributes(newname,'modification') or 0
+ local oldtime = modificationtime(oldname) or 0
+ local newtime = modificationtime(newname) or 0
if newtime == 0 or oldtime > newtime then
if trace_conversion then
report_inclusion("converting %a (%a) from %a to %a",askedname,oldname,format,newformat)
@@ -918,7 +901,7 @@ local function register(askedname,specification)
format = suffix
end
end
-specification.format = format
+ specification.format = format
elseif io.exists(oldname) then
report_inclusion("file %a is bugged",oldname)
if format and imagetypes[format] then
@@ -1021,7 +1004,7 @@ local function locate(request) -- name, format, cache
end
else
local foundname = resolvers.findbinfile(askedname)
- if not foundname or not lfs.isfile(foundname) then -- foundname can be dummy
+ if not foundname or not isfile(foundname) then -- foundname can be dummy
if trace_figures then
report_inclusion("unknown url %a",askedname)
end
@@ -1408,7 +1391,7 @@ function existers.generic(askedname,resolve)
local result
if hasscheme(askedname) then
result = resolvers.findbinfile(askedname)
- elseif lfs.isfile(askedname) then
+ elseif isfile(askedname) then
result = askedname
elseif resolve then
result = resolvers.findbinfile(askedname)
@@ -1452,6 +1435,7 @@ local transforms = setmetatableindex (
local function checktransform(figure,forced)
if auto_transform then
+
local orientation = (forced ~= "" and forced ~= v_auto and forced) or figure.orientation or 0
local transform = transforms["orientation-"..orientation]
figure.transform = transform
@@ -1536,6 +1520,11 @@ function checkers.generic(data)
-- tricky as img doesn't allow it
f.attr = figure.attr
end
+ if dr.cmyk == v_yes then
+ f.enforcecmyk = true
+ elseif dr.cmyk == v_auto and attributes.colors.model == "cmyk" then
+ f.enforcecmyk = true
+ end
figure = f
end
local f, d = codeinjections.setfigurealternative(data,figure)
@@ -2086,6 +2075,7 @@ implement {
{ "conversion" },
{ "resolution" },
{ "color" },
+ { "cmyk" },
{ "arguments" },
{ "repeat" },
{ "transform" },
diff --git a/Master/texmf-dist/tex/context/base/mkiv/grph-inc.mkiv b/Master/texmf-dist/tex/context/base/mkiv/grph-inc.mkiv
index 20e7c11a61b..578bad1d067 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/grph-inc.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/grph-inc.mkiv
@@ -20,11 +20,10 @@
\writestatus{loading}{ConTeXt Graphic Macros / Figure Inclusion}
-\ifcase\contextlmtxmode
- \registerctxluafile{grph-inc}{}
-\else
- \registerctxluafile{grph-img}{}
- \registerctxluafile{grph-inc}{}
+\registerctxluafile{grph-img}{}
+\registerctxluafile{grph-inc}{}
+
+\ifcase\contextlmtxmode \else
\registerctxluafile{grph-bmp}{}
\registerctxluafile{grph-chk}{}
\fi
@@ -116,6 +115,7 @@
\c!userpassword =,
\c!ownerpassword =,
\c!compact =,
+ \c!cmyk =,
]
%D Defining figures.
@@ -197,19 +197,39 @@
% label file settings
% label file parent
+% \def\grph_include_use[#1][#2][#3][#4]%
+% {\doifelsenothing{#1}
+% {\doifsomething{#2}
+% {\doifelseassignment{#3}
+% {\grph_include_use_indeed{#2}{#2}{#3}{#4}}
+% {\grph_include_use_indeed{#2}{#2}\empty{#4}}}}
+% {\doifelsenothing{#2}
+% {\doifelseassignment{#3}
+% {\grph_include_use_indeed{#1}{#1}\empty{#3}}
+% {\grph_include_use_indeed{#1}{#1}{#3}{#4}}}
+% {\doifelseassignment{#3}
+% {\grph_include_use_indeed{#1}{#2}\empty{#3}}
+% {\grph_include_use_indeed{#1}{#2}{#3}{#4}}}}}
+
\def\grph_include_use[#1][#2][#3][#4]%
{\doifelsenothing{#1}
{\doifsomething{#2}
- {\doifelseassignment{#3}
- {\grph_include_use_indeed{#2}{#2}{#3}{#4}}
- {\grph_include_use_indeed{#2}{#2}\empty{#4}}}}
+ {\ifcondition\validassignment{#3}%
+ \grph_include_use_indeed{#2}{#2}{#3}{#4}%
+ \else
+ \grph_include_use_indeed{#2}{#2}\empty{#4}%
+ \fi}}%
{\doifelsenothing{#2}
- {\doifelseassignment{#3}
- {\grph_include_use_indeed{#1}{#1}\empty{#3}}
- {\grph_include_use_indeed{#1}{#1}{#3}{#4}}}
- {\doifelseassignment{#3}
- {\grph_include_use_indeed{#1}{#2}\empty{#3}}
- {\grph_include_use_indeed{#1}{#2}{#3}{#4}}}}}
+ {\ifcondition\validassignment{#3}%
+ \grph_include_use_indeed{#1}{#1}\empty{#3}%
+ \else
+ \grph_include_use_indeed{#1}{#1}{#3}{#4}%
+ \fi}
+ {\ifcondition\validassignment{#3}%
+ \grph_include_use_indeed{#1}{#2}\empty{#3}
+ \else
+ \grph_include_use_indeed{#1}{#2}{#3}{#4}%
+ \fi}}}
\def\grph_include_use_indeed#1#2#3#4%
{\dodoglobal\setvalue{\??externalfigureinstance#1}{\grph_include_setup{#2}{#3}{#4}}%
@@ -221,8 +241,9 @@
{\dotripleempty\grph_include_figure}
\def\grph_include_figure[#1][#2][#3]%
- {\docheckassignment{#2}%
- \ifassignment
+% {\docheckassignment{#2}%
+% \ifassignment
+ {\ifcondition\validassignment{#2}%
\grph_include_place[#1][][#2]%
\else
\grph_include_place[#1][#2][#3]%
@@ -301,8 +322,9 @@
%
\edef\p_grph_include_label{#1}%
\let\p_grph_include_name\p_grph_include_label
- \docheckassignment{#2}%
- \ifassignment
+ % \docheckassignment{#2}%
+ % \ifassignment
+ \ifcondition\validassignment{#2}%
% [label] [settings]
\let\p_grph_include_parent\p_grph_include_label
\grph_include_place_inherit
@@ -346,6 +368,7 @@
conversion {\externalfigureparameter\c!conversion}%
resolution {\externalfigureparameter\c!resolution}%
color {\externalfigureparameter\c!color}% unprocessed raw key
+ cmyk {\externalfigureparameter\c!cmyk}% kind of special
arguments {\externalfigureparameter\c!arguments}% used for converters
repeat {\externalfigureparameter\c!repeat}%
transform {\externalfigureparameter\c!transform}%
@@ -353,10 +376,10 @@
userpassword {\externalfigureparameter\c!userpassword}%
ownerpassword{\externalfigureparameter\c!ownerpassword}%
\ifx\p_width\empty \else
- width \dimexpr\p_width\relax
+ width \dimexpr\p_width\relax
\fi
\ifx\p_height\empty \else
- height \dimexpr\p_height\relax
+ height \dimexpr\p_height\relax
\fi
}%\relax
\clf_figure_identify
@@ -485,29 +508,6 @@
\c!height =\externalfigureparameter\c!height,
\c!lines =\externalfigureparameter\c!lines]
-% % this will become:
-%
-% \unexpanded\def\doscalefigure % used at lua end
-% {\global\setbox\foundexternalfigure\vbox\bgroup
-% \bgroup
-% \let\currentscale\currentexternalfigure
-% \let\scaleparameter\externalfigureparameter
-% \dowithnextboxcs\grph_scale_finish\hbox{\dowithfigure{\box\foundexternalfigure}}%
-% \egroup}
-%
-% % or even better:
-%
-% \def\grph_scale_inherited#1%
-% {\bgroup
-% \expandafter\let\expandafter\currentscale \csname current#1\endcsname
-% \expandafter\let\expandafter\scaleparameter\csname #1parameter\endcsname
-% \dowithnextboxcs\grph_scale_finish\hbox}
-%
-% \unexpanded\def\doscalefigure % used at lua end
-% {\global\setbox\foundexternalfigure\vbox\bgroup
-% \grph_scale_inherited{externalfigure}{\dowithfigure{\box\foundexternalfigure}}%
-% \egroup}
-
%D You can register additional suffixes with the following command:
%D
%D \starttyping
@@ -904,6 +904,25 @@
\unexpanded\def\overlayfigure#1%
{\externalfigure[#1][\c!width=\d_overlay_width,\c!height=\d_overlay_height]}
+% Experimental (will become cleaner):
+
+\ifcase\contextlmtxmode \else
+
+ \unexpanded\def\includesvgfile {\dontleavehmode\begingroup\dodoubleempty\grph_include_svg_file}
+ \unexpanded\def\includesvgbuffer{\dontleavehmode\begingroup\dodoubleempty\grph_include_svg_buffer}
+
+ \def\grph_include_svg_file[#1][#2]%
+ {\getdummyparameters[\c!offset=\zeropoint,#2]%
+ \clf_includesvgfile{#1}\dimexpr\dummyparameter\c!offset\relax
+ \endgroup}
+
+ \def\grph_include_svg_buffer[#1][#2]%
+ {\getdummyparameters[\c!offset=\zeropoint,#2]%
+ \clf_includesvgbuffer{#1}\dimexpr\dummyparameter\c!offset\relax
+ \endgroup}
+
+\fi
+
% Bonus:
\useexternalfigure
@@ -961,6 +980,10 @@
\unexpanded\def\inlinefigure[#1]{\dontleavehmode\sbox{\externalfigure[#1][\v!inline]}}
+%D Needs to be done global:
+
+\definelayer[epdfcontent]
+
\protect \endinput
%D Moved here because this already old code is nowhere documents (so I need to check
diff --git a/Master/texmf-dist/tex/context/base/mkiv/grph-mem.lua b/Master/texmf-dist/tex/context/base/mkiv/grph-mem.lua
index ff35483505a..bde21682693 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/grph-mem.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/grph-mem.lua
@@ -21,142 +21,74 @@ local report = logs.reporter("memstream")
local trace = false trackers.register ("graphics.memstreams", function(v) trace = v end)
local data = { }
-if pdfe then
-
- local function setmemstream(name,stream,once)
- if once and data[name] then
- if trace then
- report("not overloading %a",name) --
- end
- return data[name]
- end
- local kind = figures.guessfromstring(stream)
- local identifier = false
- if kind == "pdf" then
- identifier = pdfe.new(stream,#stream,name)
- if not identifier then
- report("no valid pdf stream %a",name)
- elseif trace then
- report("setting %a with identifier %a",name,identifier)
- end
- else
- identifier = "m_k_i_v_memstream_" .. name .. "." .. kind
- io.savedata(identifier,stream)
- end
- if not identifier then
- identifier = "invalid-memstream"
- end
- data[name] = identifier
- return identifier
- end
-
- resolvers.setmemstream = setmemstream
-
- function resolvers.finders.memstream(specification)
- local name = specification.path
- local identifier = data[name]
- if identifier then
- if trace then
- report("reusing %a with identifier %a",name,identifier)
- end
- return identifier
- end
- local stream = io.loaddata(name)
- if stream and stream ~= "" then
- return setmemstream(name,stream)
- end
+local function setmemstream(name,stream,once)
+ if once and data[name] then
if trace then
- report("no valid memstream %a",name)
+ report("not overloading %a",name) --
end
- return resolvers.finders.notfound()
+ return data[name]
end
-
- local flush = { }
-
- function resolvers.resetmemstream(name,afterpage)
- if afterpage then
- flush[#flush+1] = name
- end
- end
-
- luatex.registerpageactions(function()
- if #flush > 0 then
- for i=1,#flush do
- local identifier = data[name]
- if identifier then
- os.remove(identifier)
- data[name] = nil
- end
- end
- flush = { }
- end
- end)
-
-else
-
- local opened = { }
-
- local function setmemstream(name,stream,once)
- if once and data[name] then
- if trace then
- report("not overloading %a",name) --
- end
- return data[name]
- end
- local memstream, identifier = epdf.openMemStream(stream,#stream,name)
+ local kind = figures.guessfromstring(stream)
+ local identifier = false
+ if kind == "pdf" then
+ identifier = pdfe.new(stream,#stream,name)
if not identifier then
- report("no valid stream %a",name)
- identifier = "invalid-memstream"
+ report("no valid pdf stream %a",name)
elseif trace then
report("setting %a with identifier %a",name,identifier)
end
- data [name] = identifier
- opened[name] = memstream
- return identifier
+ else
+ identifier = "m_k_i_v_memstream_" .. name .. "." .. kind
+ io.savedata(identifier,stream)
end
+ if not identifier then
+ identifier = "invalid-memstream"
+ end
+ data[name] = identifier
+ return identifier
+end
- resolvers.setmemstream = setmemstream
+resolvers.setmemstream = setmemstream
- function resolvers.finders.memstream(specification)
- local name = specification.path
- local identifier = data[name]
- if identifier then
- if trace then
- report("reusing %a with identifier %a",name,identifier)
- end
- return identifier
- end
- local stream = io.loaddata(name)
- if not stream or stream == "" then
- if trace then
- report("no valid file %a",name)
- end
- return resolvers.finders.notfound()
- else
- return setmemstream(name,stream)
+function resolvers.finders.memstream(specification)
+ local name = specification.path
+ local identifier = data[name]
+ if identifier then
+ if trace then
+ report("reusing %a with identifier %a",name,identifier)
end
+ return identifier
+ end
+ local stream = io.loaddata(name)
+ if stream and stream ~= "" then
+ return setmemstream(name,stream)
end
+ if trace then
+ report("no valid memstream %a",name)
+ end
+ return resolvers.finders.notfound()
+end
- local flush = { }
+local flush = { }
- function resolvers.resetmemstream(name,afterpage)
- if afterpage then
- flush[#flush+1] = name
- else
- opened[name] = nil
- end
+function resolvers.resetmemstream(name,afterpage)
+ if afterpage then
+ flush[#flush+1] = name
end
+end
- luatex.registerpageactions(function()
- if #flush > 0 then
- for i=1,#flush do
- opened[flush[i]] = nil -- we keep of course data[name] because of reuse
+luatex.registerpageactions(function()
+ if #flush > 0 then
+ for i=1,#flush do
+ local identifier = data[name]
+ if identifier then
+ os.remove(identifier)
+ data[name] = nil
end
- flush = { }
end
- end)
-
-end
+ flush = { }
+ end
+end)
figures.identifiers.list[#figures.identifiers.list+1] = function(specification)
local name = specification.request.name
diff --git a/Master/texmf-dist/tex/context/base/mkiv/grph-rul.lua b/Master/texmf-dist/tex/context/base/mkiv/grph-rul.lua
index 08edade1fe4..5067b0165ee 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/grph-rul.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/grph-rul.lua
@@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['grph-rul'] = {
}
local tonumber, next, type = tonumber, next, type
+local concat = table.concat
local attributes = attributes
local nodes = nodes
@@ -15,6 +16,7 @@ local context = context
local bpfactor = number.dimenfactors.bp
local nuts = nodes.nuts
+local nodepool = nuts.pool
local userrule = nuts.rules.userrule
local outlinerule = nuts.pool.outlinerule
local ruleactions = nuts.rules.ruleactions
@@ -24,6 +26,8 @@ local setattr = nuts.setattr
local tonode = nuts.tonode
local getattribute = tex.getattribute
+local getwhd = nuts.getwhd
+local setwhd = nuts.setwhd
local lefttoright_code = nodes.dirvalues.lefttoright
@@ -143,25 +147,188 @@ end
do
- -- maybe %.6F
+ -- This is the old oval method that we keep it for compatibility reasons. Of
+ -- course one can use mp instead. It could be improved but at the cost of more
+ -- code than I'm willing to add for something hardly used.
- local f_rectangle = formatters["%.6F w %.6F %.6F %.6F %.6F re %s"]
- local f_baselined = formatters["%.6F w %.6F %.6F %.6F %.6F re s %.6F %.6F m %.6F %.6F l s"]
- local f_dashlined = formatters["%.6F w %.6F %.6F %.6F %.6F re s [%.6F %.6F] 2 d %.6F %.6F m %.6F %.6F l s"]
- local f_radtangle = formatters[
- [[%.6F w %.6F %.6F m
-%.6F %.6F l %.6F %.6F %.6F %.6F y
-%.6F %.6F l %.6F %.6F %.6F %.6F y
-%.6F %.6F l %.6F %.6F %.6F %.6F y
-%.6F %.6F l %.6F %.6F %.6F %.6F y
-h %s]]
- ]
+ local function round(p,kind)
+ local method = tonumber(p.corner) or 0
+ if method < 0 or method > 27 then
+ method = 0
+ end
+ local width = p.width or 0
+ local height = p.height or 0
+ local depth = p.depth or 0
+ local total = height + depth
+ local radius = p.radius or 655360
+ local line = p.line or 65536
+ local how = (method > 8 or kind ~= "fill") and "S" or "f"
+ local half = line / 2
+ local xmin = half * bpfactor
+ local xmax = ( width - half) * bpfactor
+ local ymax = ( height - half) * bpfactor
+ local ymin = (-depth + half) * bpfactor
+ local full = ( radius + half)
+ local xxmin = full * bpfactor
+ local xxmax = ( width - full) * bpfactor
+ local yymax = ( height - full) * bpfactor
+ local yymin = (-depth + full) * bpfactor
+ line = line * bpfactor
+ if xxmin <= xxmax and yymin <= yymax then
+ local list = nil
+ if method == 0 then
+ list = {
+ "q", line, "w", xxmin, ymin, "m", xxmax, ymin, "l", xmax, ymin, xmax, yymin, "y",
+ xmax, yymax, "l", xmax, ymax, xxmax, ymax, "y", xxmin, ymax, "l", xmin, ymax,
+ xmin, yymax, "y", xmin, yymin, "l", xmin, ymin, xxmin, ymin, "y", "h", how, "Q",
+ }
+ elseif method == 1 then
+ list = {
+ "q", line, "w", xxmin, ymin, "m", xxmax, ymin, "l", xmax, ymin, xmax, yymin, "y",
+ xmax, ymax, "l", xmin, ymax, "l", xmin, yymin, "l", xmin, ymin, xxmin, ymin, "y",
+ "h", how, "Q",
+ }
+ elseif method == 2 then
+ list = {
+ "q", line, "w", xxmin, ymin, "m", xmax, ymin, "l", xmax, ymax, "l", xxmin, ymax,
+ "l", xmin, ymax, xmin, yymax, "y", xmin, yymin, "l", xmin, ymin, xxmin, ymin,
+ "y", "h", how, "Q",
+ }
+ elseif method == 3 then
+ list = {
+ "q", line, "w", xmin, ymin, "m", xmax, ymin, "l", xmax, yymax, "l", xmax, ymax,
+ xxmax, ymax, "y", xxmin, ymax, "l", xmin, ymax, xmin, yymax, "y", xmin, ymin,
+ "l", "h", how, "Q",
+ }
+
+ elseif method == 4 then
+ list = {
+ "q", line, "w", xmin, ymin, "m", xxmax, ymin, "l", xmax, ymin, xmax, yymin, "y",
+ xmax, yymax, "l", xmax, ymax, xxmax, ymax, "y", xmin, ymax, "l", xmin, ymin, "l",
+ "h", how, "Q",
+ }
+ elseif method == 5 then
+ list = {
+ "q", line, "w", xmin, ymin, "m", xmax, ymin, "l", xmax, yymax, "l", xmax, ymax,
+ xxmax, ymax, "y", xmin, ymax, "l", xmin, ymin, "l", "h", how, "Q",
+ }
+ elseif method == 6 then
+ list = {
+ "q", line, "w", xmin, ymin, "m", xxmax, ymin, "l", xmax, ymin, xmax, yymin, "y",
+ xmax, ymax, "l", xmin, ymax, "l", xmin, ymin, "l", "h", how, "Q",
+ }
+ elseif method == 7 then
+ list = {
+ "q", line, "w", xxmin, ymin, "m", xmax, ymin, "l", xmax, ymax, "l", xmin, ymax,
+ "l", xmin, yymin, "l", xmin, ymin, xxmin, ymin, "y", "h", how, "Q",
+ }
+ elseif method == 8 then
+ list = {
+ "q", line, "w", xmin, ymin, "m", xmax, ymin, "l", xmax, ymax, "l", xxmin, ymax,
+ "l", xmin, ymax, xmin, yymax, "y", xmin, ymin, "l", "h", how, "Q",
+ }
+ elseif method == 9 then
+ list = {
+ "q", line, "w", xmin, ymax, "m", xmin, yymin, "l", xmin, ymin, xxmin, ymin, "y",
+ xxmax, ymin, "l", xmax, ymin, xmax, yymin, "y", xmax, ymax, "l", how, "Q",
+ }
+ elseif method == 10 then
+ list = {
+ "q", line, "w", xmax, ymax, "m", xxmin, ymax, "l", xmin, ymax, xmin, yymax, "y",
+ xmin, yymin, "l", xmin, ymin, xxmin, ymin, "y", xmax, ymin, "l", how, "Q",
+ }
+ elseif method == 11 then
+ list = {
+ "q", line, "w", xmax, ymin, "m", xmax, yymax, "l", xmax, ymax, xxmax, ymax, "y",
+ xxmin, ymax, "l", xmin, ymax, xmin, yymax, "y", xmin, ymin, "l", how, "Q",
+ }
+ elseif method == 12 then
+ list = {
+ "q", line, "w", xmin, ymax, "m", xxmax, ymax, "l", xmax, ymax, xmax, yymax, "y",
+ xmax, yymin, "l", xmax, ymin, xxmax, ymin, "y", xmin, ymin, "l", how, "Q",
+ }
+ elseif method == 13 then
+ list = {
+ "q", line, "w", xmin, ymax, "m", xxmax, ymax, "l", xmax, ymax, xmax, yymax, "y",
+ xmax, ymin, "l", how, "Q",
+ }
+ elseif method == 14 then
+ list = {
+ "q", line, "w", xmax, ymax, "m", xmax, yymin, "l", xmax, ymin, xxmax, ymin, "y",
+ xmin, ymin, "l", how, "Q",
+ }
+ elseif method == 15 then
+ list = {
+ "q", line, "w", xmax, ymin, "m", xxmin, ymin, "l", xmin, ymin, xmin, yymin, "y",
+ xmin, ymax, "l", how, "Q",
+ }
+ elseif method == 16 then
+ list = {
+ "q", line, "w", xmin, ymin, "m", xmin, yymax, "l", xmin, ymax, xxmin, ymax, "y",
+ xmax, ymax, "l", how, "Q",
+ }
+ elseif method == 17 then
+ list = {
+ "q", line, "w", xxmax, ymax, "m", xmax, ymax, xmax, yymax, "y", how, "Q",
+ }
+ elseif method == 18 then
+ list = {
+ "q", line, "w", xmax, yymin, "m", xmax, ymin, xxmax, ymin, "y", how, "Q",
+ }
+ elseif method == 19 then
+ list = {
+ "q", line, "w", xxmin, ymin, "m", xmin, ymin, xmin, yymin, "y", how, "Q",
+ }
+ elseif method == 20 then
+ list = {
+ "q", line, "w", xmin, yymax, "m", xmin, ymax, xxmin, ymax, "y", how, "Q",
+ }
+ elseif method == 21 then
+ list = {
+ "q", line, "w", xxmax, ymax, "m", xmax, ymax, xmax, yymax, "y", xmin, yymax, "m",
+ xmin, ymax, xxmin, ymax, "y", how, "Q",
+ }
+ elseif method == 22 then
+ list = {
+ "q", line, "w", xxmax, ymax, "m", xmax, ymax, xmax, yymax, "y", xmax, yymin, "m",
+ xmax, ymin, xxmax, ymin, "y", how, "Q",
+ }
+ elseif method == 23 then
+ list = {
+ "q", line, "w", xmax, yymin, "m", xmax, ymin, xxmax, ymin, "y", xxmin, ymin, "m",
+ xmin, ymin, xmin, yymin, "y", how, "Q",
+ }
+ elseif method == 24 then
+ list = {
+ "q", line, "w", xxmin, ymin, "m", xmin, ymin, xmin, yymin, "y", xmin, yymax, "m",
+ xmin, ymax, xxmin, ymax, "y", how, "Q",
+ }
+ elseif method == 25 then
+ list = {
+ "q", line, "w", xxmax, ymax, "m", xmax, ymax, xmax, yymax, "y", xmax, yymin, "m",
+ xmax, ymin, xxmax, ymin, "y", xxmin, ymin, "m", xmin, ymin, xmin, yymin, "y",
+ xmin, yymax, "m", xmin, ymax, xxmin, ymax, "y", how, "Q",
+ }
+ elseif method == 26 then
+ list = {
+ "q", line, "w", xmax, yymin, "m", xmax, ymin, xxmax, ymin, "y", xmin, yymax, "m",
+ xmin, ymax, xxmin, ymax, "y", how, "Q",
+ }
+
+ elseif method == 27 then
+ list = {
+ "q", line, "w", xxmax, ymax, "m", xmax, ymax, xmax, yymax, "y", xxmin, ymin, "m",
+ xmin, ymin, xmin, yymin, "y", how, "Q",
+ }
+ end
+ pdfprint("direct",concat(list," "))
+ end
+ end
- directives.register("metapost.stripzeros",function() -- confusing name but ok
- f_rectangle = formatters["%.6N w %.6N %.6N %.6N %.6N re %s"]
- f_baselined = formatters["%.6N w %.6N %.6N %.6N %.6N re s %.6N %.6N m %.6N %.6N l s"]
- f_dashlined = formatters["%.6N w %.6N %.6N %.6N %.6N re s [%.6N %.6N] 2 d %.6N %.6N m %.6N %.6N l s"]
- f_radtangle = formatters[
+ local f_rectangle = formatters["%.6N w %.6N %.6N %.6N %.6N re %s"]
+ local f_baselined = formatters["%.6N w %.6N %.6N %.6N %.6N re s %.6N %.6N m %.6N %.6N l s"]
+ local f_dashlined = formatters["%.6N w %.6N %.6N %.6N %.6N re s [%.6N %.6N] 2 d %.6N %.6N m %.6N %.6N l s"]
+ local f_radtangle = formatters[
[[%.6N w %.6N %.6N m
%.6N %.6N l %.6N %.6N %.6N %.6N y
%.6N %.6N l %.6N %.6N %.6N %.6N y
@@ -169,33 +336,34 @@ h %s]]
%.6N %.6N l %.6N %.6N %.6N %.6N y
h %s]]
]
- end)
ruleactions.fill = function(p,h,v,i,n)
- local l = (p.line or 65536)*bpfactor
- local r = p and (p.radius or 0)*bpfactor or 0
- local w = h * bpfactor
- local h = v * bpfactor
- local m = nil
- local t = i == "fill" and "f" or "s"
- local o = l / 2
- if r > 0 then
- w = w - o
- h = h - o
- m = f_radtangle(l, r,o, w-r,o, w,o,w,r, w,h-r, w,h,w-r,h, r,h, o,h,o,h-r, o,r, o,o,r,o, t)
+ if p.corner then
+ return round(p,i)
else
- w = w - l
- h = h - l
- m = f_rectangle(l,o,o,w,h,t)
+ local l = (p.line or 65536)*bpfactor
+ local r = p and (p.radius or 0)*bpfactor or 0
+ local w = h * bpfactor
+ local h = v * bpfactor
+ local m = nil
+ local t = i == "fill" and "f" or "s"
+ local o = l / 2
+ if r > 0 then
+ w = w - o
+ h = h - o
+ m = f_radtangle(l, r,o, w-r,o, w,o,w,r, w,h-r, w,h,w-r,h, r,h, o,h,o,h-r, o,r, o,o,r,o, t)
+ else
+ w = w - l
+ h = h - l
+ m = f_rectangle(l,o,o,w,h,t)
+ end
+ pdfprint("direct",m)
end
- pdfprint("direct",m)
end
ruleactions.draw = ruleactions.fill
ruleactions.stroke = ruleactions.fill
- local getwhd = nodes.nuts.getwhd
-
ruleactions.box = function(p,h,v,i,n)
local w, h, d = getwhd(n)
local line = p.line or 65536
@@ -231,22 +399,17 @@ interfaces.implement {
{ "type", "string" },
{ "data", "string" },
{ "name", "string" },
+ { "radius", "dimension" },
+ { "corner", "string" },
} } ,
actions = function(t)
- -- no nuts !
local rule = userrule(t)
- local ma = getattribute(a_colormodel) or 1
- local ca = getattribute(a_color)
- local ta = getattribute(a_transparency)
- setattrlist(rule,true)
if t.type == "mp" then
- t.ma = ma
- t.ca = ca
- t.ta = ta
+ t.ma = getattribute(a_colormodel) or 1
+ t.ca = getattribute(a_color)
+ t.ta = getattribute(a_transparency)
else
- setattr(rule,a_colormodel,ma)
- setattr(rule,a_color,ca)
- setattr(rule,a_transparency,ta)
+ setattrlist(rule,true)
end
context(tonode(rule)) -- will become context.nodes.flush
end
@@ -306,5 +469,3 @@ interfaces.implement {
context(tonode(rule))
end
}
-
-
diff --git a/Master/texmf-dist/tex/context/base/mkiv/grph-trf.mkiv b/Master/texmf-dist/tex/context/base/mkiv/grph-trf.mkiv
index 35e812b3edb..f9218036c33 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/grph-trf.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/grph-trf.mkiv
@@ -139,7 +139,7 @@
%
\d_grph_scale_dp\dp\nextbox
\ifx\p_depth\v!no \ifzeropt\d_grph_scale_dp \else
- \setbox\nextbox\hpack{\raise\d_grph_scale_dp\box\nextbox}% new
+ \setbox\nextbox\naturalhpack{\raise\d_grph_scale_dp\box\nextbox}% new
\d_grph_scale_dp\dp\nextbox
\fi \fi
\d_grph_scale_wd\wd\nextbox
@@ -168,7 +168,7 @@
% {\d_grph_scale_wd\finalscaleboxxscale\d_grph_scale_wd
% \d_grph_scale_ht\finalscaleboxyscale\d_grph_scale_ht
% \d_grph_scale_dp\finalscaleboxyscale\d_grph_scale_dp
-% \setbox\nextbox\hpack
+% \setbox\nextbox\naturalhpack
% {\dostartscaling \finalscaleboxxscale \finalscaleboxyscale
% \smashedbox\nextbox
% \dostopscaling}%
@@ -195,7 +195,7 @@
\fi}
\def\grph_scale_apply_yes
- {\setbox\nextbox\hpack
+ {\setbox\nextbox\naturalhpack
{\dostartscaling \finalscaleboxxscale \finalscaleboxyscale
\smashedbox\nextbox
\dostopscaling}%
@@ -567,13 +567,13 @@
{\ifx\p_equalwidth\empty \else
\scratchdimen\p_equalwidth\relax
\ifdim\d_grph_scale_wd<\scratchdimen
- \setbox\nextbox\hpack to \scratchdimen{\hss\box\nextbox\hss}%
+ \setbox\nextbox\naturalhpack to \scratchdimen{\hss\box\nextbox\hss}%
\fi
\fi
\ifx\p_equalheight\empty \else
\scratchdimen\p_equalheight\relax
\ifdim\d_grph_scale_ht<\scratchdimen
- \setbox\nextbox\vpack to \scratchdimen{\vss\box\nextbox\vss}%
+ \setbox\nextbox\naturalvpack to \scratchdimen{\vss\box\nextbox\vss}%
\fi
\fi}
@@ -603,8 +603,18 @@
\edef\p_sy{#2}%
\dowithnextboxcs\grph_scale_fast_sx_xy_finish\hbox}
+% \def\grph_scale_fast_sx_xy_finish
+% {\grph_scale_check_sx_sy
+% \grph_scale_calculations_nop
+% \grph_scale_apply
+% \box\nextbox
+% \egroup}
+
\def\grph_scale_fast_sx_xy_finish
{\grph_scale_check_sx_sy
+ \d_grph_scale_wd\wd\nextbox
+ \d_grph_scale_ht\ht\nextbox
+ \d_grph_scale_dp\dp\nextbox
\grph_scale_calculations_nop
\grph_scale_apply
\box\nextbox
@@ -677,7 +687,7 @@
\scratchheight\clippingparameter\c!sy\scratchheight
\advance\scratchyoffset \ht\nextbox
\fi
- \setbox\nextbox\hpack
+ \setbox\nextbox\naturalhpack
{\advance\scratchxoffset -\clippingparameter\c!leftoffset \relax
\advance\scratchyoffset -\clippingparameter\c!bottomoffset\relax
\hskip-\scratchxoffset
@@ -686,13 +696,13 @@
\wd\nextbox\zeropoint
\ht\nextbox\zeropoint
\dp\nextbox\zeropoint
- \setbox\nextbox\hpack
+ \setbox\nextbox\naturalhpack
{\advance\scratchwidth \dimexpr\clippingparameter\c!leftoffset +\clippingparameter\c!rightoffset\relax
\advance\scratchheight\dimexpr\clippingparameter\c!bottomoffset+\clippingparameter\c!topoffset \relax
\dostartclipping{\clippingparameter\c!mp}\scratchwidth\scratchheight
\box\nextbox
\dostopclipping}%
- \setbox\nextbox\hpack
+ \setbox\nextbox\naturalhpack
{\hskip-\clippingparameter\c!leftoffset
\lower \clippingparameter\c!bottomoffset
\box\nextbox}%
@@ -750,7 +760,11 @@
{\scratchdimen\wd\nextbox
% better use an hbox (if no \forgetall, leftskip etc may creep in)
%\setbox\nextbox\vbox{\forgetall\dostartmirroring\hskip-\wd\nextbox\box\nextbox\dostopmirroring}%
- \setbox\nextbox\hpack{\dostartmirroring\hskip-\wd\nextbox\box\nextbox\dostopmirroring}%
+ \setbox\nextbox\naturalhpack
+ {\dostartmirroring
+ \hskip-\wd\nextbox
+ \box\nextbox
+ \dostopmirroring}%
\wd\nextbox\scratchdimen
\box\nextbox
\egroup}
@@ -898,7 +912,7 @@
\egroup}
\def\grph_rotate_finish_indeed
- {\hpack\bgroup
+ {\naturalhpack\bgroup
\ifx\p_rotation_rotation\empty
\grph_rotate_finish_nop
\else
@@ -910,10 +924,10 @@
{\boxcursor\box\nextbox}
\setvalue{\??rotatepreset\v!left}%
- {\edef\p_rotation_rotation{\doifelseoddpage{90}{270}}}
+ {\edef\p_rotation_rotation{90}}
\setvalue{\??rotatepreset\v!right}%
- {\edef\p_rotation_rotation{\doifelseoddpage{270}{90}}}
+ {\edef\p_rotation_rotation{270}}
\setvalue{\??rotatepreset\v!inner}%
{\signalrightpage
@@ -924,25 +938,23 @@
\doifelserightpage{\def\p_rotation_rotation{90}}{\def\p_rotation_rotation{270}}}
\setvalue{\??rotatepreset\v!default}%
- {\edef\p_rotation_rotation{\realnumber{\p_rotation_rotation}}}% get rid of leading zeros and spaces
+ {}
\def\grph_rotate_finish_yes
- {\csname\??rotatepreset
- \ifcsname\??rotatepreset\p_rotation_rotation\endcsname\p_rotation_rotation\else\v!default\fi
- \endcsname
- \setbox\nextbox\vpack{\box\nextbox}% not really needed
+ {\begincsname\??rotatepreset\p_rotation_rotation\endcsname
+ \setbox\nextbox\naturalvpack{\box\nextbox}% not really needed
\dontcomplain
\ifconditional\c_grph_rotate_center
\d_grph_rotate_saved_width \wd\nextbox
\d_grph_rotate_saved_height\ht\nextbox
\d_grph_rotate_saved_depth \dp\nextbox
- \setbox\nextbox\vpack{\vskip.5\ht\nextbox\hskip-.5\wd\nextbox\box\nextbox}%
+ \setbox\nextbox\naturalvpack{\vskip.5\ht\nextbox\hskip-.5\wd\nextbox\box\nextbox}%
\smashbox\nextbox
\fi
\d_grph_rotate_width \wd\nextbox
\d_grph_rotate_height\ht\nextbox
\d_grph_rotate_depth \dp\nextbox
- \setbox\nextbox\vpack{\hpack{\raise\dp\nextbox\box\nextbox}}%
+ \setbox\nextbox\naturalvpack{\naturalhpack{\raise\dp\nextbox\box\nextbox}}%
\d_grph_rotate_used_height \ht\nextbox
% much of the next happens in lua (all the sin and cos) so we can do that in
% one go if needed
@@ -973,7 +985,7 @@
\fi\fi
\fi
\ifconditional\c_grph_rotate_center
- \setbox\nextbox\vpack{\vskip-.5\d_grph_rotate_saved_height\hskip.5\d_grph_rotate_saved_height\box\nextbox}%
+ \setbox\nextbox\naturalvpack{\vskip-.5\d_grph_rotate_saved_height\hskip.5\d_grph_rotate_saved_height\box\nextbox}%
\wd\nextbox\d_grph_rotate_saved_width
\ht\nextbox\d_grph_rotate_saved_height
\dp\nextbox\d_grph_rotate_saved_depth
@@ -1039,9 +1051,9 @@
\fi}
\def\grph_rotate_apply
- {\setbox\nextbox\vpack to \d_grph_rotate_y_size
+ {\setbox\nextbox\naturalvpack to \d_grph_rotate_y_size
{\vfill
- \hpack to \d_grph_rotate_x_size
+ \naturalhpack to \d_grph_rotate_x_size
{\dostartrotation\p_rotation_rotation
\wd\nextbox\zeropoint
\ht\nextbox\zeropoint
@@ -1049,7 +1061,7 @@
\dostoprotation
\hfill}%
\kern\d_grph_rotate_y_position}%
- \setbox\nextbox\hpack
+ \setbox\nextbox\naturalhpack
{\kern\dimexpr\d_grph_rotate_x_position+\d_grph_rotate_x_offset\relax
\lower\d_grph_rotate_y_offset\box\nextbox}}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/hand-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/hand-ini.mkiv
index f678a88da40..dc6d1b19829 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/hand-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/hand-ini.mkiv
@@ -60,11 +60,12 @@
\def\font_expansion_enable {\normaladjustspacing\plusthree}
\def\font_expansion_enable_k{\normaladjustspacing\plustwo}
-\def\font_expansion_enable_n{\normaladjustspacing\plusone}
+%def\font_expansion_enable_n{\normaladjustspacing\plusone}
\def\font_expansion_disable {\normaladjustspacing\zerocount}
-\def\font_protruding_enable {\normalprotrudechars\plustwo }
-\def\font_protruding_disable{\normalprotrudechars\zerocount}
+\def\font_protruding_enable_b{\normalprotrudechars\plusthree} % also deal with r2l (experimental lmtx)
+\def\font_protruding_enable {\normalprotrudechars\plustwo }
+\def\font_protruding_disable {\normalprotrudechars\zerocount}
\appendtoks \font_expansion_disable \to \everyforgetall % Here or not here?
\appendtoks \font_protruding_disable \to \everyforgetall % Here or not here?
diff --git a/Master/texmf-dist/tex/context/base/mkiv/hand-ini.mkxl b/Master/texmf-dist/tex/context/base/mkiv/hand-ini.mkxl
new file mode 100644
index 00000000000..ca6922dddeb
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/hand-ini.mkxl
@@ -0,0 +1,111 @@
+%D \module
+%D [ file=hand-ini,
+%D version=2008.02.12,
+%D title=\CONTEXT\ Handling Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Handling is implemented differently in \MKIV. Maybe I'll cook up
+%D some compatibility hack.
+
+% \definefontfeature[demo][default][mode=node,expansion=quality]
+% \definefontfeature[demo][default][mode=node,protrusion=pure]
+
+% experimental setup:
+%
+% \showframe \setupalign[hanging] \enabletrackers[fonts.protrusion]
+%
+% \definefontfeature[default] [default][mode=node,script=latn]
+% %definefontfeature[whatever][default][mode=node,lfbd=yes,rtbd=yes,script=latn]
+% \definefontfeature[whatever][default][mode=node,protrusion=quality]
+% \definefontfeature[whocares][default][mode=node,protrusion=yes,opbd=yes,script=latn] % left|right|yes
+%
+% \definedfont[fxlbi.otf*default] \input tufte 0123456789 \par \dorecurse{15}{1 2 3 4 5 6 7 8 9 0 } \par
+% \definedfont[fxlbi.otf*whatever] \input tufte 0123456789 \par \dorecurse{15}{1 2 3 4 5 6 7 8 9 0 } \par
+% \definedfont[fxlbi.otf*whocares] \input tufte 0123456789 \par \dorecurse{15}{1 2 3 4 5 6 7 8 9 0 } \par
+%
+% %definefontfeature[whocares][default][mode=node,protrusion=2,opbd=yes,script=latn,featurefile=texgyrepagella-regularxx.fea]
+% \definefontfeature[whocares][default][mode=node,protrusion=2,opbd=yes,script=latn]
+%
+% \definedfont[texgyrepagella-regularxx.otf*whocares] \input tufte
+
+\unprotect
+
+%D New stuff.
+
+\unexpanded\def\setupfontexpansion {\dodoubleargument\font_expansion_setup }
+\unexpanded\def\setupfontprotrusion{\dodoubleargument\font_protrusion_setup}
+
+\def\font_expansion_setup [#1][#2]{\clf_setupfontexpansion {#1}{#2}}
+\def\font_protrusion_setup[#1][#2]{\clf_setupfontprotrusion{#1}{#2}}
+
+% \setupfontprotrusion[quality-upright][vector=quality]
+% \setupfontprotrusion[quality-slanted][vector=quality,right=1.5]
+
+\let\adjustspacing\relax \newcount\adjustspacing % a little bit protection
+\let\protrudechars\relax \newcount\protrudechars % a little bit protection
+
+% at some point we can introduce extreme expansion, i.e. \normaladjustspacing\plustwo
+
+% 0 = disabled
+% 1 = notused (thesis)
+% 2 = glyph + kern
+% 3 = glyph only
+
+\def\font_expansion_enable {\normaladjustspacing\plusthree}
+\def\font_expansion_enable_k{\normaladjustspacing\plustwo}
+%def\font_expansion_enable_n{\normaladjustspacing\plusone}
+\def\font_expansion_disable {\normaladjustspacing\zerocount}
+
+\def\font_protruding_enable_b{\normalprotrudechars\plusthree} % also deal with r2l (experimental lmtx)
+\def\font_protruding_enable {\normalprotrudechars\plustwo }
+\def\font_protruding_disable {\normalprotrudechars\zerocount}
+
+\appendtoks \font_expansion_disable \to \everyforgetall % Here or not here?
+\appendtoks \font_protruding_disable \to \everyforgetall % Here or not here?
+
+% \def\fonthandlingerror{\writestatus\m!fonts{font handling is replaced by features in mkiv}}
+%
+% \let\fonthandling\empty
+%
+% \unexpanded\def\startfonthandling #1{\fonthandlingerror\fonthandlingerror\gobbleuntil\stopfonthandling} % can't happen
+% \unexpanded\def\definefonthandling {\dotripleempty\dodefinefonthandling}
+% \unexpanded\def\setupfonthandling {\dodoubleempty\dosetupfonthandling }
+% \def\dodefinefonthandling[#1][#2][#3]{\fonthandlingerror}
+% \def\dosetupfonthandling [#1][#2]{\fonthandlingerror}
+% \def\usehandling [#1]{\fonthandlingerror}
+
+\installcorenamespace{expansion}
+
+\installcommandhandler \??expansion {expansion} \??expansion
+
+\appendtoks
+ \setuevalue{\??expansion:\currentexpansion}%
+ {\adjustspacingstep \expansionparameter\c!step\relax
+ \adjustspacingstretch\expansionparameter\c!stretch\relax
+ \adjustspacingshrink \expansionparameter\c!shrink\relax}%
+\to \everydefineexpansion
+
+\defineexpansion
+ [\c!step=1,
+ \c!stretch=40,
+ \c!shrink=20]
+
+% \defineexpansion
+% [myexpansion]
+% [\c!stretch=50,
+% \c!shrink=20]
+
+\unexpanded\def\setexpansion
+ {\dosingleempty\font_expansion_set}
+
+\unexpanded\def\font_expansion_set[#1]%
+ {\begincsname\??expansion:#1\endcsname}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/java-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/java-ini.lua
index b41b065e89d..ebe51d15ee8 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/java-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/java-ini.lua
@@ -199,6 +199,7 @@ function javascripts.flushpreambles()
end
local patterns = {
+ CONTEXTLMTXMODE > 0 and "java-imp-%s.mkxl" or "",
"java-imp-%s.mkiv",
"java-imp-%s.tex",
-- obsolete:
@@ -207,12 +208,8 @@ local patterns = {
}
local function action(name,foundname)
- context.startnointerference()
- context.startreadingfile()
- context.input(foundname)
+ commands.loadlibrary(name,foundname,true)
status_javascripts("loaded: library %a",name)
- context.stopreadingfile()
- context.stopnointerference()
end
local function failure(name)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-file.lua b/Master/texmf-dist/tex/context/base/mkiv/l-file.lua
index 1b039a43866..d0af94f09d4 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-file.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-file.lua
@@ -76,17 +76,27 @@ local P, R, S, C, Cs, Cp, Cc, Ct = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg
local attributes = lfs.attributes
function lfs.isdir(name)
- return attributes(name,"mode") == "directory"
+ if name then
+ return attributes(name,"mode") == "directory"
+ end
end
function lfs.isfile(name)
- local a = attributes(name,"mode")
- return a == "file" or a == "link" or nil
+ if name then
+ local a = attributes(name,"mode")
+ return a == "file" or a == "link" or nil
+ end
end
function lfs.isfound(name)
- local a = attributes(name,"mode")
- return (a == "file" or a == "link") and name or nil
+ if name then
+ local a = attributes(name,"mode")
+ return (a == "file" or a == "link") and name or nil
+ end
+end
+
+function lfs.modification(name)
+ return name and attributes(name,"modification") or nil
end
if sandbox then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-gzip.lua b/Master/texmf-dist/tex/context/base/mkiv/l-gzip.lua
index 5100e47222c..f141b5ebbbe 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-gzip.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-gzip.lua
@@ -5,50 +5,176 @@ if not modules then modules = { } end modules ['l-gzip'] = {
license = "see context related readme files"
}
-if not gzip then
+-- We only have a few official methods here:
+--
+-- local decompressed = gzip.load (filename)
+-- local resultsize = gzip.save (filename,compresslevel)
+-- local compressed = gzip.compress (str,compresslevel)
+-- local decompressed = gzip.decompress (str)
+-- local iscompressed = gzip.compressed (str)
+-- local suffix, okay = gzip.suffix (filename)
+--
+-- In LuaMetaTeX we have only xzip which implements a very few methods:
+--
+-- compress (str,level,method,window,memory,strategy)
+-- decompress (str,window)
+-- adler32 (str,checksum)
+-- crc32 (str,checksum)
+--
+-- Special window values are:
+--
+-- flate : - 15
+-- zlib : 15
+-- gzip : 15 | 16
+-- auto : 15 | 32
- -- no fallback yet
-
- return
+gzip = gzip or { } -- so in luatex we keep the old ones too
+if not zlib then
+ zlib = xzip -- in luametatex we shadow the old one
+elseif not xzip then
+ xzip = zlib
end
-local suffix, suffixes = file.suffix, file.suffixes
-
-function gzip.load(filename)
- local f = io.open(filename,"rb")
- if not f then
- -- invalid file
- elseif suffix(filename) == "gz" then
- f:close()
- local g = gzip.open(filename,"rb")
- if g then
- local str = g:read("*all")
- g:close()
- return str
+if zlib then
+
+ local suffix = file.suffix
+ local suffixes = file.suffixes
+ local find = string.find
+ local openfile = io.open
+
+ local gzipwindow = 15 + 16 -- +16: gzip, +32: gzip|zlib
+ local gziplevel = 3
+ local identifier = "^\x1F\x8B\x08"
+
+ local compress = zlib.compress
+ local decompress = zlib.decompress
+
+ function gzip.load(filename)
+ local f = openfile(filename,"rb")
+ if not f then
+ -- invalid file
+ else
+ local data = f:read("*all")
+ f:close()
+ if data and data ~= "" then
+ if suffix(filename) == "gz" then
+ data = decompress(data,gzipwindow)
+ end
+ return data
+ end
end
- else
- local str = f:read("*all")
- f:close()
- return str
end
-end
-function gzip.save(filename,data)
- if suffix(filename) ~= "gz" then
- filename = filename .. ".gz"
+ function gzip.save(filename,data,level)
+ if suffix(filename) ~= "gz" then
+ filename = filename .. ".gz"
+ end
+ local f = openfile(filename,"wb")
+ if f then
+ data = compress(data or "",level or gziplevel,nil,gzipwindow)
+ f:write(data)
+ f:close()
+ return #data
+ end
end
- local f = io.open(filename,"wb")
- if f then
- local s = zlib.compress(data or "",9,nil,15+16)
- f:write(s)
- f:close()
- return #s
+
+ function gzip.suffix(filename)
+ local suffix, extra = suffixes(filename)
+ local gzipped = extra == "gz"
+ return suffix, gzipped
+ end
+
+ function gzip.compressed(s)
+ return s and find(s,identifier)
+ end
+
+ function gzip.compress(s,level)
+ if s and not find(s,identifier) then -- the find check might go away
+ if not level then
+ level = gziplevel
+ elseif level <= 0 then
+ return s
+ elseif level > 9 then
+ level = 9
+ end
+ return compress(s,level or gziplevel,nil,gzipwindow) or s
+ end
+ end
+
+ function gzip.decompress(s)
+ if s and find(s,identifier) then
+ return decompress(s,gzipwindow)
+ else
+ return s
+ end
end
-end
-function gzip.suffix(filename)
- local suffix, extra = suffixes(filename)
- local gzipped = extra == "gz"
- return suffix, gzipped
end
+
+-- In luametatex we can use this one but it doesn't look like there wil be stream
+-- support so for now we still use zlib (the performance difference is not that
+-- spectacular in our usage.
+
+-- if flate then
+--
+-- local type = type
+-- local find = string.find
+--
+-- local compress = flate.gz_compress
+-- local decompress = flate.gz_decompress
+--
+-- local absmax = 128*1024*1024
+-- local initial = 64*1024
+-- local identifier = "^\x1F\x8B\x08"
+--
+-- function gzip.compressed(s)
+-- return s and find(s,identifier)
+-- end
+--
+-- function gzip.compress(s,level)
+-- if s and not find(s,identifier) then -- the find check might go away
+-- if not level then
+-- level = 3
+-- elseif level <= 0 then
+-- return s
+-- elseif level > 9 then
+-- level = 9
+-- end
+-- return compress(s,level) or s
+-- end
+-- end
+--
+-- function gzip.decompress(s,size,iterate)
+-- if s and find(s,identifier) then
+-- if type(size) ~= "number" then
+-- size = initial
+-- end
+-- if size > absmax then
+-- size = absmax
+-- end
+-- if type(iterate) == "number" then
+-- max = size * iterate
+-- elseif iterate == nil or iterate == true then
+-- iterate = true
+-- max = absmax
+-- end
+-- if max > absmax then
+-- max = absmax
+-- end
+-- while true do
+-- local d = decompress(s,size)
+-- if d then
+-- return d
+-- end
+-- size = 2 * size
+-- if not iterate or size > max then
+-- return false
+-- end
+-- end
+-- else
+-- return s
+-- end
+-- end
+--
+-- end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-io.lua b/Master/texmf-dist/tex/context/base/mkiv/l-io.lua
index fa3ad3c4cda..a955262a31e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-io.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-io.lua
@@ -13,7 +13,7 @@ local concat = table.concat
----- floor = math.floor
local type = type
-if string.find(os.getenv("PATH"),";",1,true) then
+if string.find(os.getenv("PATH") or "",";",1,true) then
io.fileseparator, io.pathseparator = "\\", ";"
else
io.fileseparator, io.pathseparator = "/" , ":"
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-lpeg.lua b/Master/texmf-dist/tex/context/base/mkiv/l-lpeg.lua
index 51bc1d3df30..7979a40fb94 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-lpeg.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-lpeg.lua
@@ -295,7 +295,7 @@ patterns.longtostring = Cs(whitespace^0/"" * ((patterns.quoted + nonwhitespace^
-- return P { P(pattern) + 1 * V(1) }
-- end
-function anywhere(pattern) -- faster
+local function anywhere(pattern) -- faster
return (1-P(pattern))^0 * P(pattern)
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-lua.lua b/Master/texmf-dist/tex/context/base/mkiv/l-lua.lua
index 5570e83dc8d..f411230d4aa 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-lua.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-lua.lua
@@ -35,6 +35,12 @@ if LUAVERSION < 5.2 and jit then
LUAVERSION = 5.2
end
+-- this is lmtx only:
+
+-- if lua and lua.openfile then
+-- io.open = lua.openfile
+-- end
+
-- lpeg
if not lpeg then
@@ -212,7 +218,7 @@ FFISUPPORTED = type(ffi) == "table" and ffi.os ~= "" and ffi.arch ~= "" and ffi.
if not FFISUPPORTED then
- -- Maybe we should check for LUATEXENGINE but that's also a bti tricky as we still
+ -- Maybe we should check for LUATEXENGINE but that's also a bit tricky as we still
-- can have a weird ffi library laying around. Checking for presence of 'jit' is
-- also not robust. So for now we hope for the best.
@@ -253,3 +259,7 @@ if LUAVERSION > 5.3 then
-- collectgarbage("collect")
-- collectgarbage("generational") -- crashes on unix
end
+
+if status and os.setenv then
+ os.setenv("engine",string.lower(status.luatex_engine or "unknown"))
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-macro.lua b/Master/texmf-dist/tex/context/base/mkiv/l-macro.lua
index 24a3d07bc23..98cf20d05cb 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-macro.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-macro.lua
@@ -273,7 +273,7 @@ macros.loaded = loaded
function required(name,trace)
local filename = file.addsuffix(name,"lua")
- local fullname = resolvers and resolvers.find_file(filename) or filename
+ local fullname = resolvers and resolvers.findfile(filename) or filename
if not fullname or fullname == "" then
return false
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-md5.lua b/Master/texmf-dist/tex/context/base/mkiv/l-md5.lua
index 6758fa44441..9e3f7672d6b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-md5.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-md5.lua
@@ -20,6 +20,8 @@ end
local md5, file = md5, file
local gsub = string.gsub
+local modification, isfile, touch = lfs.modification, lfs.isfile, lfs.touch
+local loaddata, savedata = io.loaddata, io.savedata
-- local gsub, format, byte = string.gsub, string.format, string.byte
--
@@ -55,10 +57,12 @@ do
end
+local md5HEX = md5.HEX
+
function file.needsupdating(oldname,newname,threshold) -- size modification access change
- local oldtime = lfs.attributes(oldname,"modification")
+ local oldtime = modification(oldname)
if oldtime then
- local newtime = lfs.attributes(newname,"modification")
+ local newtime = modification(newname)
if not newtime then
return true -- no new file, so no updating needed
elseif newtime >= oldtime then
@@ -76,34 +80,36 @@ end
file.needs_updating = file.needsupdating
function file.syncmtimes(oldname,newname)
- local oldtime = lfs.attributes(oldname,"modification")
- if oldtime and lfs.isfile(newname) then
- lfs.touch(newname,oldtime,oldtime)
+ local oldtime = modification(oldname)
+ if oldtime and isfile(newname) then
+ touch(newname,oldtime,oldtime)
end
end
-function file.checksum(name)
+local function checksum(name)
if md5 then
- local data = io.loaddata(name)
+ local data = loaddata(name)
if data then
- return md5.HEX(data)
+ return md5HEX(data)
end
end
return nil
end
+file.checksum = checksum
+
function file.loadchecksum(name)
if md5 then
- local data = io.loaddata(name .. ".md5")
+ local data = loaddata(name .. ".md5")
return data and (gsub(data,"%s",""))
end
return nil
end
function file.savechecksum(name,checksum)
- if not checksum then checksum = file.checksum(name) end
+ if not checksum then checksum = checksum(name) end
if checksum then
- io.savedata(name .. ".md5",checksum)
+ savedata(name .. ".md5",checksum)
return checksum
end
return nil
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-os.lua b/Master/texmf-dist/tex/context/base/mkiv/l-os.lua
index 15408565c34..64c7de567c4 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-os.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-os.lua
@@ -30,7 +30,7 @@ local date, time = os.date, os.time
local find, format, gsub, upper, gmatch = string.find, string.format, string.gsub, string.upper, string.gmatch
local concat = table.concat
local random, ceil, randomseed = math.random, math.ceil, math.randomseed
-local rawget, rawset, type, getmetatable, setmetatable, tonumber, tostring = rawget, rawset, type, getmetatable, setmetatable, tonumber, tostring
+local type, setmetatable, tonumber, tostring = type, setmetatable, tonumber, tostring
-- This check needs to happen real early on. Todo: we can pick it up from the commandline
-- if we pass --binpath= (which is useful anyway)
@@ -227,7 +227,10 @@ local launchers = {
}
function os.launch(str)
- execute(format(launchers[os.name] or launchers.unix,str))
+ local command = format(launchers[os.name] or launchers.unix,str)
+ -- todo: pcall
+-- print(command)
+ execute(command)
end
local gettimeofday = os.gettimeofday or os.clock
@@ -634,6 +637,14 @@ function os.validdate(year,month,day)
return year, month, day
end
+function os.date(fmt,...)
+ if not fmt then
+ -- otherwise differences between unix, mingw and msvc
+ fmt = "%Y-%m-%d %H:%M"
+ end
+ return date(fmt,...)
+end
+
local osexit = os.exit
local exitcode = nil
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-pdfview.lua b/Master/texmf-dist/tex/context/base/mkiv/l-pdfview.lua
index d2add91886e..dc3888df59f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-pdfview.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-pdfview.lua
@@ -28,8 +28,6 @@ local allcalls -- a table with templates that close all open pdf documents
local runner -- runner function
local expander -- filename cleanup function
--- maybe spawn/execute spec in calls
-
if os.type == "windows" then
-- os.setenv("path",os.getenv("path") .. ";" .. "c:/data/system/pdf-xchange")
@@ -164,7 +162,7 @@ function pdfview.close(...)
for i=1,#t do
local name = expander(fullname(t[i]))
if io.exists(name) then
- replace(closecall,{ filename = name })
+ runner(closecall,{ filename = name })
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-sandbox.lua b/Master/texmf-dist/tex/context/base/mkiv/l-sandbox.lua
index c2e1753d3ab..276e54937b7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-sandbox.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-sandbox.lua
@@ -281,20 +281,24 @@ end
loadfile = register(loadfile,"loadfile")
+if supported("lua") then
+ lua.openfile = register(lua.openfile,"lua.openfile")
+end
+
if supported("io") then
- io.open = register(io.open, "io.open")
- io.popen = register(io.popen, "io.popen") -- needs checking
- io.lines = register(io.lines, "io.lines")
- io.output = register(io.output, "io.output")
- io.input = register(io.input, "io.input")
+ io.open = register(io.open, "io.open")
+ io.popen = register(io.popen, "io.popen") -- needs checking
+ io.lines = register(io.lines, "io.lines")
+ io.output = register(io.output,"io.output")
+ io.input = register(io.input, "io.input")
end
if supported("os") then
- os.execute = register(os.execute, "os.execute")
- os.spawn = register(os.spawn, "os.spawn")
- os.exec = register(os.exec, "os.exec")
- os.rename = register(os.rename, "os.rename")
- os.remove = register(os.remove, "os.remove")
+ os.execute = register(os.execute,"os.execute")
+ os.spawn = register(os.spawn, "os.spawn")
+ os.exec = register(os.exec, "os.exec")
+ os.rename = register(os.rename, "os.rename")
+ os.remove = register(os.remove, "os.remove")
end
if supported("lfs") then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-string.lua b/Master/texmf-dist/tex/context/base/mkiv/l-string.lua
index 8ae8d8d1d76..1dee85e2894 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-string.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-string.lua
@@ -155,11 +155,13 @@ end
--- needs checking
local anything = patterns.anything
-local allescapes = Cc("%") * S(".-+%?()[]*") -- also {} and ^$ ?
-local someescapes = Cc("%") * S(".-+%()[]") -- also {} and ^$ ?
-local matchescapes = Cc(".") * S("*?") -- wildcard and single match
+local moreescapes = Cc("%") * S(".-+%?()[]*$^{}")
+local allescapes = Cc("%") * S(".-+%?()[]*") -- also {} and ^$ ?
+local someescapes = Cc("%") * S(".-+%()[]") -- also {} and ^$ ?
+local matchescapes = Cc(".") * S("*?") -- wildcard and single match
-local pattern_a = Cs ( ( allescapes + anything )^0 )
+local pattern_m = Cs ( ( moreescapes + anything )^0 )
+local pattern_a = Cs ( ( allescapes + anything )^0 )
local pattern_b = Cs ( ( someescapes + matchescapes + anything )^0 )
local pattern_c = Cs ( Cc("^") * ( someescapes + matchescapes + anything )^0 * Cc("$") )
@@ -170,6 +172,8 @@ end
function string.topattern(str,lowercase,strict)
if str == "" or type(str) ~= "string" then
return ".*"
+ elseif strict == "all" then
+ str = lpegmatch(pattern_m,str)
elseif strict then
str = lpegmatch(pattern_c,str)
else
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-table.lua b/Master/texmf-dist/tex/context/base/mkiv/l-table.lua
index 192347b0619..c20bd4733c4 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-table.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-table.lua
@@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['l-table'] = {
license = "see context related readme files"
}
-local type, next, tostring, tonumber, select = type, next, tostring, tonumber, select
+local type, next, tostring, tonumber, select, rawget = type, next, tostring, tonumber, select, rawget
local table, string = table, string
local concat, sort = table.concat, table.sort
local format, lower, dump = string.format, string.lower, string.dump
@@ -287,6 +287,37 @@ local function sortedhash(t,cmp)
return nothing
end
+-- local function iterate(t,i)
+-- local i = i + 1
+-- if i <= t.n then
+-- local k = t[i]
+-- return i, k, t.t[k]
+-- end
+-- end
+--
+-- local function indexedhash(t,cmp)
+-- if t then
+-- local s
+-- if cmp then
+-- -- it would be nice if the sort function would accept a third argument (or nicer, an optional first)
+-- s = sortedhashkeys(t,function(a,b) return cmp(t,a,b) end)
+-- else
+-- s = sortedkeys(t) -- the robust one
+-- end
+-- local m = #s
+-- if m == 1 then
+-- return next, t
+-- elseif m > 0 then
+-- s.n = m
+-- s.t = t
+-- return iterate, s, 0
+-- end
+-- end
+-- return nothing
+-- end
+--
+-- -- for i, k, v in indexedhash(t) do print(k,v,s) end
+
table.sortedhash = sortedhash
table.sortedpairs = sortedhash -- obsolete
@@ -494,84 +525,15 @@ function table.fromhash(t)
return hsh
end
-local noquotes, hexify, handle, compact, inline, functions, metacheck
+local noquotes, hexify, handle, compact, inline, functions, metacheck, accurate
local reserved = table.tohash { -- intercept a language inconvenience: no reserved words as key
'and', 'break', 'do', 'else', 'elseif', 'end', 'false', 'for', 'function', 'if',
'in', 'local', 'nil', 'not', 'or', 'repeat', 'return', 'then', 'true', 'until', 'while',
- 'NaN', 'goto',
+ 'NaN', 'goto', 'const',
}
--- local function is_simple_table(t)
--- if #t > 0 then
--- local n = 0
--- for _,v in next, t do
--- n = n + 1
--- end
--- if n == #t then
--- local tt, nt = { }, 0
--- for i=1,#t do
--- local v = t[i]
--- local tv = type(v)
--- if tv == "number" then
--- nt = nt + 1
--- if hexify then
--- tt[nt] = format("0x%X",v)
--- else
--- tt[nt] = tostring(v) -- tostring not needed
--- end
--- elseif tv == "string" then
--- nt = nt + 1
--- tt[nt] = format("%q",v)
--- elseif tv == "boolean" then
--- nt = nt + 1
--- tt[nt] = v and "true" or "false"
--- else
--- return nil
--- end
--- end
--- return tt
--- end
--- end
--- return nil
--- end
-
--- local function is_simple_table(t)
--- local nt = #t
--- if nt > 0 then
--- local n = 0
--- for _,v in next, t do
--- n = n + 1
--- -- if type(v) == "table" then
--- -- return nil
--- -- end
--- end
--- if n == nt then
--- local tt = { }
--- for i=1,nt do
--- local v = t[i]
--- local tv = type(v)
--- if tv == "number" then
--- if hexify then
--- tt[i] = format("0x%X",v)
--- else
--- tt[i] = tostring(v) -- tostring not needed
--- end
--- elseif tv == "string" then
--- tt[i] = format("%q",v)
--- elseif tv == "boolean" then
--- tt[i] = v and "true" or "false"
--- else
--- return nil
--- end
--- end
--- return tt
--- end
--- end
--- return nil
--- end
-
-local function is_simple_table(t,hexify) -- also used in util-tab so maybe public
+local function is_simple_table(t,hexify,accurate) -- also used in util-tab so maybe public
local nt = #t
if nt > 0 then
local n = 0
@@ -592,6 +554,8 @@ local function is_simple_table(t,hexify) -- also used in util-tab so maybe publi
-- tt[i] = v -- not needed tostring(v)
if hexify then
tt[i] = format("0x%X",v)
+ elseif accurate then
+ tt[i] = format("%q",v)
else
tt[i] = v -- not needed tostring(v)
end
@@ -613,6 +577,8 @@ local function is_simple_table(t,hexify) -- also used in util-tab so maybe publi
-- tt[i+1] = v -- not needed tostring(v)
if hexify then
tt[i+1] = format("0x%X",v)
+ elseif accurate then
+ tt[i+1] = format("%q",v)
else
tt[i+1] = v -- not needed tostring(v)
end
@@ -707,6 +673,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tv == "number" then
if hexify then
handle(format("%s 0x%X,",depth,v))
+ elseif accurate then
+ handle(format("%s %q,",depth,v))
else
handle(format("%s %s,",depth,v)) -- %.99g
end
@@ -716,7 +684,7 @@ local function do_serialize(root,name,depth,level,indexed)
if next(v) == nil then
handle(format("%s {},",depth))
elseif inline then -- and #t > 0
- local st = is_simple_table(v,hexify)
+ local st = is_simple_table(v,hexify,accurate)
if st then
handle(format("%s { %s },",depth,concat(st,", ")))
else
@@ -744,12 +712,16 @@ local function do_serialize(root,name,depth,level,indexed)
if tk == "number" then
if hexify then
handle(format("%s [0x%X]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v)) -- %.99g
end
elseif tk == "boolean" then
if hexify then
handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v)) -- %.99g
end
@@ -758,12 +730,16 @@ local function do_serialize(root,name,depth,level,indexed)
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
handle(format("%s %s=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s %s=%q,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v)) -- %.99g
end
else
if hexify then
handle(format("%s [%q]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v)) -- %.99g
end
@@ -772,6 +748,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk == "number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -789,6 +767,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk == "number" then
if hexify then
handle(format("%s [0x%X]={},",depth,k))
+ elseif accurate then
+ handle(format("%s [%q]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -802,11 +782,13 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s [%q]={},",depth,k))
end
elseif inline then
- local st = is_simple_table(v,hexify)
+ local st = is_simple_table(v,hexify,accurate)
if st then
if tk == "number" then
if hexify then
handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
+ elseif accurate then
+ handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -829,6 +811,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk == "number" then
if hexify then
handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
+ elseif accurate then
+ handle(format("%s [%q]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -850,6 +834,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk == "number" then
if hexify then
handle(format("%s [0x%X]=load(%q),",depth,k,f))
+ elseif accurate then
+ handle(format("%s [%q]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -868,6 +854,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk == "number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -896,6 +884,7 @@ local function serialize(_handle,root,name,specification) -- handle wins
if type(specification) == "table" then
noquotes = specification.noquotes
hexify = specification.hexify
+ accurate = specification.accurate
handle = _handle or specification.handle or print
functions = specification.functions
compact = specification.compact
@@ -1261,10 +1250,12 @@ function table.reverse(t) -- check with 5.3 ?
end
end
+-- This one is for really simple cases where need a hash from a table.
+
local function sequenced(t,sep,simple)
if not t then
return ""
- elseif type(t) == "string" then
+ elseif type(t) ~= "table" then
return t -- handy fallback
end
local n = #t
@@ -1305,7 +1296,11 @@ local function sequenced(t,sep,simple)
end
end
end
- return concat(s,sep or " | ")
+ if sep == true then
+ return "{ " .. concat(s,", ") .. " }"
+ else
+ return concat(s,sep or " | ")
+ end
end
table.sequenced = sequenced
diff --git a/Master/texmf-dist/tex/context/base/mkiv/l-unicode.lua b/Master/texmf-dist/tex/context/base/mkiv/l-unicode.lua
index 13e0a3fa1c1..c57aaf33ebc 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/l-unicode.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/l-unicode.lua
@@ -1081,56 +1081,62 @@ function utf.utf32_to_utf8_t(t,endian)
return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(b)
- if b < 0x10000 then
- return char(b%256,rshift(b,8))
- else
- b = b - 0x10000
- local b1 = rshift(b,10) + 0xD800
- local b2 = b%1024 + 0xDC00
- return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+if bit32 then
+
+ local rshift = bit32.rshift
+
+ local function little(b)
+ if b < 0x10000 then
+ return char(b%256,rshift(b,8))
+ else
+ b = b - 0x10000
+ local b1 = rshift(b,10) + 0xD800
+ local b2 = b%1024 + 0xDC00
+ return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+ end
end
-end
-local function big(b)
- if b < 0x10000 then
- return char(rshift(b,8),b%256)
- else
- b = b - 0x10000
- local b1 = rshift(b,10) + 0xD800
- local b2 = b%1024 + 0xDC00
- return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ local function big(b)
+ if b < 0x10000 then
+ return char(rshift(b,8),b%256)
+ else
+ b = b - 0x10000
+ local b1 = rshift(b,10) + 0xD800
+ local b2 = b%1024 + 0xDC00
+ return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ end
end
-end
-local l_remap = Cs((p_utf8byte/little+P(1)/"")^0)
-local b_remap = Cs((p_utf8byte/big +P(1)/"")^0)
+ local l_remap = Cs((p_utf8byte/little+P(1)/"")^0)
+ local b_remap = Cs((p_utf8byte/big +P(1)/"")^0)
-local function utf8_to_utf16_be(str,nobom)
- if nobom then
- return lpegmatch(b_remap,str)
- else
- return char(254,255) .. lpegmatch(b_remap,str)
+ local function utf8_to_utf16_be(str,nobom)
+ if nobom then
+ return lpegmatch(b_remap,str)
+ else
+ return char(254,255) .. lpegmatch(b_remap,str)
+ end
end
-end
-local function utf8_to_utf16_le(str,nobom)
- if nobom then
- return lpegmatch(l_remap,str)
- else
- return char(255,254) .. lpegmatch(l_remap,str)
+ local function utf8_to_utf16_le(str,nobom)
+ if nobom then
+ return lpegmatch(l_remap,str)
+ else
+ return char(255,254) .. lpegmatch(l_remap,str)
+ end
end
-end
-utf.utf8_to_utf16_be = utf8_to_utf16_be
-utf.utf8_to_utf16_le = utf8_to_utf16_le
+ utf.utf8_to_utf16_be = utf8_to_utf16_be
+ utf.utf8_to_utf16_le = utf8_to_utf16_le
-function utf.utf8_to_utf16(str,littleendian,nobom)
- if littleendian then
- return utf8_to_utf16_le(str,nobom)
- else
- return utf8_to_utf16_be(str,nobom)
+ function utf.utf8_to_utf16(str,littleendian,nobom)
+ if littleendian then
+ return utf8_to_utf16_le(str,nobom)
+ else
+ return utf8_to_utf16_be(str,nobom)
+ end
end
+
end
local pattern = Cs (
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lang-hyp.lua b/Master/texmf-dist/tex/context/base/mkiv/lang-hyp.lua
index 92b400d4f53..93457c7a22c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lang-hyp.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lang-hyp.lua
@@ -74,7 +74,7 @@ if not modules then modules = { } end modules ['lang-hyp'] = {
-- ins : when hyphenationbounds 2 or 3
-- adjust : when hyphenationbounds 2 or 3
-local type, rawset, tonumber, next = type, rawset, tonumber, next
+local type, rawget, rawset, tonumber, next = type, rawget, rawset, tonumber, next
local P, R, S, Cg, Cf, Ct, Cc, C, Carg, Cs = lpeg.P, lpeg.R, lpeg.S, lpeg.Cg, lpeg.Cf, lpeg.Ct, lpeg.Cc, lpeg.C, lpeg.Carg, lpeg.Cs
local lpegmatch = lpeg.match
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lang-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/lang-ini.mkiv
index 296cf7f1c86..f9d7e0f510f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lang-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/lang-ini.mkiv
@@ -195,19 +195,35 @@
\unexpanded\def\installlanguage
{\dodoubleargument\lang_basics_install}
+% \def\lang_basics_install[#1][#2]%
+% {\doifelseassignment{#2}
+% {\doifelselanguage{#1}
+% {\getparameters[\??language#1][#2]}
+% {\setvalue{\??languagelinked#1}{#1}%
+% \lang_basics_install_indeed{#1}{#1}%
+% \getparameters[\??language#1][\c!state=\v!start,#2]}%
+% \edef\currentsetuplanguage{#1}%
+% \clf_definelanguage{#1}{\specificlanguageparameter{#1}\s!default}%
+% \the\everysetuplanguage}
+% {\setvalue{\??languagelinked#1}{#2}%
+% \clf_setlanguagesynonym{#1}{#2}%
+% \lang_basics_install_indeed{#1}{#2}}}
+
\def\lang_basics_install[#1][#2]%
- {\doifelseassignment{#2}
- {\doifelselanguage{#1}
- {\getparameters[\??language#1][#2]}
- {\setvalue{\??languagelinked#1}{#1}%
- \lang_basics_install_indeed{#1}{#1}%
- \getparameters[\??language#1][\c!state=\v!start,#2]}%
- \edef\currentsetuplanguage{#1}%
- \clf_definelanguage{#1}{\specificlanguageparameter{#1}\s!default}%
- \the\everysetuplanguage}
- {\setvalue{\??languagelinked#1}{#2}%
- \clf_setlanguagesynonym{#1}{#2}%
- \lang_basics_install_indeed{#1}{#2}}}
+ {\ifcondition\validassignment{#2}%
+ \doifelselanguage{#1}
+ {\getparameters[\??language#1][#2]}
+ {\setvalue{\??languagelinked#1}{#1}%
+ \lang_basics_install_indeed{#1}{#1}%
+ \getparameters[\??language#1][\c!state=\v!start,#2]}%
+ \edef\currentsetuplanguage{#1}%
+ \clf_definelanguage{#1}{\specificlanguageparameter{#1}\s!default}%
+ \the\everysetuplanguage
+ \else
+ \setvalue{\??languagelinked#1}{#2}%
+ \clf_setlanguagesynonym{#1}{#2}%
+ \lang_basics_install_indeed{#1}{#2}%
+ \fi}
\def\lang_basics_install_indeed#1#2%
{\ifcsname#1\endcsname\else\setuvalue{#1}{\lang_basics_set_current[#2]}\fi}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lang-ini.mkxl b/Master/texmf-dist/tex/context/base/mkiv/lang-ini.mkxl
new file mode 100644
index 00000000000..8bcba01d8d0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/lang-ini.mkxl
@@ -0,0 +1,730 @@
+%D \module
+%D [ file=lang-ini,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module needs a further cleanup (real split between ii/iv).
+
+% \cldcontext{languages.numbers[tex.count.mainlanguagenumber]}
+
+%D This module implements multi||language support of \CONTEXT, which should not be
+%D confused with the multi||lingual interface. This support will be extended when
+%D needed. Properties of languages are defined in \TEX\ files as well as \LUA\
+%D files.
+
+\writestatus{loading}{ConTeXt Language Macros / Initialization}
+
+\registerctxluafile{lang-ini}{}
+\registerctxluafile{lang-def}{}
+\registerctxluafile{lang-cnt}{}
+
+\unprotect
+
+\ifdefined\nonfrenchspacing\else \let\nonfrenchspacing\relax \fi
+\ifdefined\frenchspacing \else \let\frenchspacing \relax \fi
+
+%D When loading hyphenation patterns, \TEX\ assign a number to each loaded table,
+%D starting with~0. Switching to a specific table is done by assigning the relevant
+%D number to the predefined \COUNTER\ \type {\language}. However, in \MKIV\ a lot
+%D of management is delegated to \LUA.
+
+%D We keep track of the last loaded patterns by means of a pseudo \COUNTER. This
+%D just one of those situations in which we don't want to spent a real one. Language
+%D zero has no patterns, first of all because I like to start numbering at one. It
+%D may come in handy for special purposes as well.
+
+\normallanguage\zerocount \def\loadedlanguage{1}
+
+%D \macros
+%D {currentlanguage, setupcurrentlanguage}
+%D
+%D Instead of numbers,we are going to use symbolic names for the languages. The
+%D current langage is saved in the macro \type {\currentlanguage}. The setup macro
+%D is mainly used for cosmetic purposes.
+%D
+%D \starttyping
+%D \dorecurse{3}
+%D {\language[nl]
+%D \startmode[*en] english \stopmode
+%D \startmode[*nl] dutch \stopmode
+%D \language[en]
+%D \startmode[*en] english \stopmode
+%D \startmode[*nl] dutch \stopmode}
+%D \stoptyping
+
+\let\currentlanguage \empty
+\let\currentmainlanguage\empty
+
+%D \macros
+%D {defaultlanguage,languageparameter,specificlanguageparameter}
+%D
+%D We don't use the commandhandler here (yet) because we have a rather special
+%D fallback mechanism so quite some compatibility testing is needed.
+
+\installcorenamespace{language}
+\installcorenamespace{languagelinked}
+
+\def\currentusedlanguage{\currentlanguage}
+
+\def\defaultlanguage#1%
+ {\ifcsname\??language#1\s!default\endcsname
+ \expandafter\defaultlanguage\lastnamedcs
+ \else
+ #1%
+ \fi}
+
+\def\languageparameter#1%
+ {\ifcsname\??language\currentlanguage#1\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??language\currentlanguage\s!default\endcsname
+ \expandafter\specificlanguageparameter\lastnamedcs{#1}%
+ \orelse\ifcsname\??language\s!default#1\endcsname
+ \lastnamedcs
+ \fi}
+
+\def\specificlanguageparameter#1#2%
+ {\ifcsname\??language#1#2\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??language#1\s!default\endcsname
+ \expandafter\specificlanguageparameter\lastnamedcs{#2}%
+ \orelse\ifcsname\??language\s!default#2\endcsname
+ \lastnamedcs
+ \fi}
+
+\def\mainlanguageparameter#1%
+ {\ifcsname\??language\currentmainlanguage#1\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??language\currentmainlanguage\s!default\endcsname
+ \expandafter\specificlanguageparameter\lastnamedcs{#1}%
+ \orelse\ifcsname\??language\s!default#1\endcsname
+ \lastnamedcs
+ \fi}
+
+\let\usedlanguageparameter\languageparameter
+
+\def\askedlanguageparameter#1% assumes \currentusedlanguage being set
+ {\ifcsname\??language\currentusedlanguage#1\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??language\currentusedlanguage\s!default\endcsname
+ \expandafter\specificlanguageparameter\lastnamedcs{#1}%
+ \orelse\ifcsname\??language\s!default#1\endcsname
+ \lastnamedcs
+ \fi}
+
+\unexpanded\def\setusedlanguage#1%
+ {\edef\currentusedlanguage{\reallanguagetag{#1}}%
+ \ifx\currentusedlanguage\empty
+ \let\currentusedlanguage \currentlanguage
+ \let\usedlanguageparameter\languageparameter
+ \orelse\ifx\currentusedlanguage\v!global
+ \let\currentusedlanguage \currentmainlanguage
+ \let\usedlanguageparameter\mainlanguageparameter
+ \orelse\ifx\currentusedlanguage\v!local
+ \let\currentusedlanguage \currentlanguage
+ \let\usedlanguageparameter\languageparameter
+ \else
+ \let\usedlanguageparameter\askedlanguageparameter
+ \fi}
+
+\unexpanded\def\setupcurrentlanguage[#1]%
+ {\setcurrentlanguage\currentmainlanguage{#1}}
+
+\unexpanded\def\setcurrentlanguage#1#2% sets modes: **id (currentmain) *id (current)
+ {\edef\xaskedlanguage{#1}% otherwise clash with \askedlanguage
+ \ifx\xaskedlanguage\empty \else
+ \ifx\currentmainlanguage\empty\else\resetsystemmode{\systemmodeprefix\currentmainlanguage}\fi
+ \let\currentmainlanguage\xaskedlanguage
+ \setsystemmode{\systemmodeprefix\currentmainlanguage}%
+ \fi
+ \edef\xaskedlanguage{#2}%
+ \ifx\xaskedlanguage\empty \else
+ \ifx\currentlanguage\empty\else\resetsystemmode\currentlanguage\fi
+ \let\currentlanguage\xaskedlanguage
+ \setsystemmode\currentlanguage
+ \fi}
+
+%D The internal macros will be defined later.
+
+%D \macros
+%D {installlanguage}
+%D
+%D Hyphenation patterns can only be loaded when the format file is prepared. The
+%D next macro takes care of this loading. A language is specified with
+%D
+%D \showsetup{installlanguage}
+%D
+%D When \type {state} equals \type {start}, both patterns and additional hyphenation
+%D specifications are loaded. These files are seached for in the patterns path
+%D have names like \type {lang-nl.lua}.
+%D
+%D The \type {spacing} variable specifies how the spaces after punctuation has to be
+%D handled. English is by tradition more tolerant to inter||sentence spacing than
+%D other languages.
+%D
+%D This macro also defines \type {\identifier} as a shortcut switch to the language.
+%D Furthermore the command defined as being language specific, are executed. With
+%D \type {default} we can default to another language (patterns) at format
+%D generation time. Patterns are loaded at runtime.
+
+\newtoks \everysetuplanguage
+
+\def\installedlanguages{\clf_installedlanguages}
+
+\unexpanded\def\doifelselanguage#1%
+ {\ifcsname\??language#1\c!state\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doiflanguageelse\doifelselanguage
+
+\def\reallanguagetag#1%
+ {\ifcsname\??languagelinked#1\endcsname\lastnamedcs\else#1\fi}
+
+% \language[#1] gave unwanted side effect of loading language specifics
+
+\unexpanded\def\installlanguage
+ {\dodoubleargument\lang_basics_install}
+
+% \def\lang_basics_install[#1][#2]%
+% {\doifelseassignment{#2}
+% {\doifelselanguage{#1}
+% {\getparameters[\??language#1][#2]}
+% {\setvalue{\??languagelinked#1}{#1}%
+% \lang_basics_install_indeed{#1}{#1}%
+% \getparameters[\??language#1][\c!state=\v!start,#2]}%
+% \edef\currentsetuplanguage{#1}%
+% \clf_definelanguage{#1}{\specificlanguageparameter{#1}\s!default}%
+% \the\everysetuplanguage}
+% {\setvalue{\??languagelinked#1}{#2}%
+% \clf_setlanguagesynonym{#1}{#2}%
+% \lang_basics_install_indeed{#1}{#2}}}
+
+\def\lang_basics_install[#1][#2]%
+ {\ifcondition\validassignment{#2}%
+ \doifelselanguage{#1}
+ {\getparameters[\??language#1][#2]}
+ {\setvalue{\??languagelinked#1}{#1}%
+ \lang_basics_install_indeed{#1}{#1}%
+ \getparameters[\??language#1][\c!state=\v!start,#2]}%
+ \edef\currentsetuplanguage{#1}%
+ \clf_definelanguage{#1}{\specificlanguageparameter{#1}\s!default}%
+ \the\everysetuplanguage
+ \else
+ \setvalue{\??languagelinked#1}{#2}%
+ \clf_setlanguagesynonym{#1}{#2}%
+ \lang_basics_install_indeed{#1}{#2}%
+ \fi}
+
+\def\lang_basics_install_indeed#1#2%
+ {\ifcsname#1\endcsname\else\setuvalue{#1}{\lang_basics_set_current[#2]}\fi}
+
+%D When the second argument is a language identifier, a synonym is created. This
+%D feature is present because we used dutch mnemonics in the dutch version, but
+%D nowadays conform a standard.
+
+\unexpanded\def\doifelsepatterns#1%
+ {\begingroup % will change
+ \lang_basics_set_current[#1]%
+ \ifnum\normallanguage>\zerocount
+ \endgroup\expandafter\firstoftwoarguments
+ \else
+ \endgroup\expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifpatternselse\doifelsepatterns
+
+%D \macros
+%D {setuplanguage}
+%D
+%D Quick and dirty, but useful:
+%D
+%D \showsetup{setuplanguage}
+%D
+%D Beware, this command can only be used when a language is installed.
+
+\unexpanded\def\setuplanguage
+ {\dodoubleempty\lang_basics_setup}
+
+\ifdefined\lang_basics_synchronize \else
+ \let\lang_basics_synchronize\relax % be nice for setups till we have one
+\fi
+
+\installmacrostack\currentlanguage
+
+\def\lang_basics_setup[#1][#2]%
+ {\ifsecondargument
+ \push_macro_currentlanguage % can be default
+ \edef\currentsetuplanguage{\reallanguagetag{#1}}%
+ \getparameters[\??language\currentsetuplanguage][#2]%
+ \the\everysetuplanguage
+ \pop_macro_currentlanguage
+ %\doif\currentsetuplanguage\currentlanguage we can have influenced inheritance (default)
+ \else
+ \let\currentsetuplanguage\currentlanguage
+ \getparameters[\??language\currentsetuplanguage][#1]%
+ \the\everysetuplanguage
+ \fi
+ \lang_basics_synchronize}
+
+\appendtoks
+ \clf_unloadlanguage{\currentsetuplanguage}%
+\to \everysetuplanguage
+
+\setuplanguage
+ [\s!default]
+ [\s!patterns=,
+ \s!lefthyphenmin=2,
+ \s!righthyphenmin=2,
+ \s!lefthyphenchar=-1,
+ \s!righthyphenchar=45,
+ % used in compound i.e. interfaced with c! and can be anything so no numbers
+ \c!lefthyphen=,
+ \c!righthyphen=-,
+ \c!hyphen=-,
+ \c!spacing=\v!packed,
+ \c!compoundhyphen=\compoundhyphen,
+ \c!rightcompoundhyphen=\compoundhyphen,
+ \c!leftcompoundhyphen=,
+ \c!midsentence=---,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!leftspeech=\languageparameter\c!leftquotation,
+ \c!middlespeech=,
+ \c!rightspeech=\languageparameter\c!rightquotation,
+ \c!limittext=\unknown,
+ \c!time={h,:,m},
+ \c!date={\v!year,\ ,\v!month,\ ,\v!day},
+ \c!text=Ag,
+ \s!font=] % \v!auto : experimental !
+
+% to be tested:
+%
+% \setuplanguage
+% [\s!default]
+% [\c!righthyphenchar="AD]
+
+%D The values \type {leftsentence} and \type {rightsentence} can be (and are) used
+%D to implement automatic subsentence boundary glyphs, like in {\fr |<|french
+%D guillemots|>|} or {\de |<|german guillemots|>|} or {\nl |<|dutch dashes|>|} like
+%D situations. Furthermore \type {leftquotation} and \type {leftquote} come into
+%D view \quotation {when we quote} or \quote {quote} something.
+
+%D \macros
+%D {currentdatespecification, currenttimespecification}
+%D
+%D Just to make things easy we can ask for the current date specification by saying:
+
+\def\currentdatespecification{\languageparameter\c!date}
+\def\currenttimespecification{\languageparameter\c!time}
+
+%D Carefull reading of these macros shows that it's legal to say
+%D
+%D \starttyping
+%D \installlanguage [du] [de]
+%D \stoptyping
+
+%D \macros
+%D {language,mainlanguage}
+%D
+%D Switching to another language (actually another hyphenation pattern) is done
+%D with:
+%D
+%D \starttyping
+%D \language[identifier]
+%D \stoptyping
+%D
+%D or with \type {\identifier}. Just to be compatible with \PLAIN\ \TEX, we still
+%D support the original meaning, so
+%D
+%D \starttyping
+%D \language=1
+%D \stoptyping
+%D
+%D is a valid operation, where the relation between number and language depends on
+%D the order in installing languages.
+%D
+%D \showsetup{language}
+%D \showsetup{mainlanguage}
+%D
+%D Both commands take a predefined language identifier as argument. We can use \type
+%D {\mainlanguage[identifier]} for setting the (indeed) main language. This is the
+%D language used for translating labels like {\em figure} and {\em table}. The main
+%D language defaults to the current language.
+
+\newtoks \everylanguage
+
+\installcorenamespace{languagenumbers}
+
+\appendtoks
+ % we need to reassign the number because new patterns can be defined later on
+ % so let's hope not that many \setups happen during a run
+ \expandafter\glet\csname\??languagenumbers\currentlanguage\endcsname\undefined
+\to \everysetuplanguage
+
+\def\lang_basics_synchronize_yes
+ {\zerocount % see below
+ \global\expandafter\chardef\csname\??languagenumbers\currentlanguage\endcsname
+ \clf_languagenumber
+ {\currentlanguage}%
+ {\defaultlanguage\currentlanguage}%
+ {\languageparameter\s!patterns}%
+ {\languageparameter\c!factor}%
+ \relax
+ \normallanguage\csname\??languagenumbers\currentlanguage\endcsname}
+
+\let\lang_basics_synchronize_nop\zerocount % not loaded anyway
+
+\letvalue{\??languagenumbers}\lang_basics_synchronize_nop % initime
+
+\appendtoks
+ \letvalue{\??languagenumbers}\lang_basics_synchronize_yes % runtime
+\to \everydump
+
+\def\lang_basics_synchronize
+ {\normallanguage\csname\??languagenumbers
+ \ifcsname\??languagenumbers\currentlanguage\endcsname
+ \currentlanguage
+ \fi
+ \endcsname
+ \relax
+ \the\everylanguage
+ \relax}
+
+\newcount\hyphenstate
+\newcount\hyphenminoffset
+
+\unexpanded\def\lesshyphens
+ {\advance\hyphenminoffset\plusone
+ \lang_basics_synchronize_min_max}
+
+\unexpanded\def\morehyphens
+ {\ifcase\hyphenminoffset \else
+ \advance\hyphenminoffset\minusone
+ \fi
+ \lang_basics_synchronize_min_max}
+
+\unexpanded\def\nohyphens % nicer for url's
+ {\ifx\dohyphens\relax
+ \unexpanded\edef\dohyphens
+ {\hyphenminoffset\the\hyphenminoffset\relax
+ \lang_basics_synchronize_min_max}%
+ \fi
+ \hyphenminoffset\plusthousand
+ \lang_basics_synchronize_min_max}
+
+\let\dohyphens\relax
+
+\unexpanded\def\lang_basics_synchronize_min_max % maybe store this at the lua end
+ {% these values are stored along with glyph nodes
+ \lefthyphenmin \numexpr0\languageparameter\s!lefthyphenmin +\hyphenminoffset\relax
+ \righthyphenmin\numexpr0\languageparameter\s!righthyphenmin+\hyphenminoffset\relax
+ \hyphenationmin\numexpr0\languageparameter\s!hyphenmin\relax
+ % these values are stored with the language (global!)
+ \prehyphenchar \languageparameter\s!righthyphenchar\relax
+ \posthyphenchar\languageparameter\s!lefthyphenchar \relax}
+
+\appendtoks
+ \lang_basics_synchronize_min_max
+\to \everylanguage
+
+\unexpanded\def\unhyphenated
+ {\groupedcommand{\lefthyphenmin\maxdimen}\donothing}
+
+% \appendtoks
+% \setups[\languageparameter\c!setups]%
+% \to \everylanguage
+
+%D You can setup the default language to reset settings.
+
+\appendtoks
+ \edef\currentlanguagesetups{\languageparameter\c!setups}%
+ \ifx\currentlanguagesetups\empty \else
+ \setups[\currentlanguagesetups]%
+ \fi
+\to \everylanguage
+
+% new
+
+\appendtoks
+ \usebidiparameter\languageparameter
+\to \everylanguage
+
+% this will move to core-spa !
+
+\appendtoks
+ \edef\p_spacing{\languageparameter\c!spacing}%
+ \ifx\p_spacing\v!broad
+ \nonfrenchspacing
+ \else
+ \frenchspacing
+ \fi
+\to \everylanguage
+
+% \mainlanguage[nl] \setuplanguage[nl][lefthyphen=,righthyphen=?]
+%
+% \dorecurse{100}{dit is toch wel een heel\normalhyphendiscretionary lang\normalhyphendiscretionary woord \recurselevel\ }
+% \dorecurse{100}{dit is toch wel een heellangwoord \recurselevel\ }
+
+% new experimental feature
+
+\unexpanded\def\setuplanguages
+ {\setuplanguage[\s!default]}
+
+% \setuplanguages[\s!font=\v!auto]
+% \setuplanguage[\s!default][\s!font=\v!auto]
+% \setuplanguage[nl][\s!font=\v!auto]
+
+\appendtoks
+ \edef\p_language_font{\languageparameter\s!font}%
+ \ifx\p_language_font\empty
+ \orelse\ifx\p_language_font\v!auto
+ \doaddfeature\currentlanguage
+ \else
+ \doaddfeature\p_language_font
+ \fi
+\to \everylanguage
+
+%D Fast switcher
+
+\def\lang_basics_switch_asked
+ {\ifcsname\??languagelinked\askedlanguage\endcsname
+ \edef\askedlanguage{\lastnamedcs}%
+ \ifx\currentlanguage\askedlanguage \else
+ \setcurrentlanguage\currentmainlanguage\askedlanguage
+ \lang_basics_synchronize
+ \fi
+ \fi}
+
+\unexpanded\def\uselanguageparameter#1%
+ {\edef\askedlanguage{#1\c!language}%
+ \ifx\askedlanguage\empty\else\lang_basics_switch_asked\fi}
+
+\unexpanded\def\douselanguageparameter#1% fast setter
+ {\edef\askedlanguage{#1}%
+ \ifx\askedlanguage\empty\else\lang_basics_switch_asked\fi}
+
+\unexpanded\def\lang_basics_set_current[#1]%
+ {\edef\askedlanguage{#1}%
+ \ifx\askedlanguage\empty\else\lang_basics_switch_asked\fi}
+
+\unexpanded\def\language
+ {\doifelsenextoptionalcs\lang_basics_set_current\normallanguage}
+
+\let\setlanguage\language % we make these synonyms
+
+\let\patterns\gobbleoneargument
+
+\newcount\mainlanguagenumber
+
+%D Beware: you might need to use \type {\dontleavehmode} outside and|/|or \type {\par}
+%D inside the group!
+
+\unexpanded\def\startlanguage
+ {\begingroup\language}
+
+\let\stoplanguage\endgroup
+
+\unexpanded\def\mainlanguage[#1]%
+ {\edef\askedlanguage{#1}%
+ \ifx\askedlanguage\empty
+ \orelse\ifcsname\??languagelinked\askedlanguage\endcsname
+ %\edef\askedlanguage{\csname\??languagelinked\askedlanguage\endcsname}%
+ \edef\askedlanguage{\lastnamedcs}%
+ \ifx\currentlanguage\askedlanguage
+ \ifx\currentmainlanguage\askedlanguage \else
+ \setcurrentlanguage\askedlanguage\askedlanguage
+ \lang_basics_synchronize
+ \fi
+ \else
+ \setcurrentlanguage\askedlanguage\askedlanguage
+ \lang_basics_synchronize
+ \fi
+ \fi
+ \mainlanguagenumber\normallanguage}
+
+\appendtoks
+ \normallanguage\mainlanguagenumber
+\to \everybeforepagebody
+
+%D Used at all?
+
+\def\splitsequence#1#2%
+ {\doifelse{#1}\v!no{#2}{\doifelse{#1}\v!yes{\languageparameter\c!limittext}{#1}}}
+
+\def\splitsymbol#1%
+ {\splitsequence{#1}{\languageparameter\c!limittext}}
+
+%D Just like with subsentence boundary symbols, quotes placement depends on the
+%D current language, therefore we show the defaults here.
+%D
+%D \def\ShowLanguageValues [#1] [#2] #3 #4
+%D {\blank
+%D \startlinecorrection
+%D \vbox\bgroup
+%D \language[#1]
+%D \midaligned{\bf#2 subsentence symbol and quotes}
+%D \framed[width=\hsize,frame=off,topframe=on,bottomframe=on,offset=.5ex]
+%D {\hfil\quotation{#3 #4}\hfil\quote{#2}\hfil
+%D \startsubsentence\startsubsentence#3\stopsubsentence#4\stopsubsentence\hfil}
+%D \egroup
+%D \stoplinecorrection
+%D \blank}
+%D
+%D \ShowLanguageValues [af] [afrikaans] afrikaanse ...
+%D \ShowLanguageValues [ca] [catalan] catalan ...
+%D \ShowLanguageValues [cs] [czech] tjechisch tex
+%D \ShowLanguageValues [cs] [slovak] slowaakse ...
+%D \ShowLanguageValues [da] [danish] deense ...
+%D \ShowLanguageValues [de] [german] duitse degelijkheid
+%D \ShowLanguageValues [en] [english] engelse humor
+%D \ShowLanguageValues [et] [estonian] ...
+%D \ShowLanguageValues [fi] [finnish] finse ...
+%D \ShowLanguageValues [fr] [french] franse slag
+%D \ShowLanguageValues [it] [italian] italiaanse ...
+%D \ShowLanguageValues [la] [latin] latijnse missen
+%D \ShowLanguageValues [nl] [dutch] nederlandse zuinigheid
+%D \ShowLanguageValues [nb] [bokmal] noorse zalm
+%D \ShowLanguageValues [nn] [nnynorsk] noorse zalm
+%D \ShowLanguageValues [pl] [polish] poolse vlag
+%D \ShowLanguageValues [pt] [portuguese] portugese ...
+%D \ShowLanguageValues [es] [spanish] spaans benauwd
+%D \ShowLanguageValues [sv] [swedish] zweedse ...
+%D \ShowLanguageValues [tr] [turkish] turks fruit
+
+%D We support a lot of languages. These are specified and loaded in separate files,
+%D according to their roots. Here we only take care of (postponed) setting of the
+%D current language.
+%D
+%D \unprotect
+%D \placetable{The germanic languages (\type{lang-ger})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!nl \NC dutch \NC germanic \NC\FR
+%D \NC \s!en \NC english \NC germanic \NC\MR
+%D \NC \s!de \NC german \NC germanic \NC\MR
+%D \NC \s!da \NC danish \NC germanic \NC\MR
+%D \NC \s!sv \NC swedish \NC germanic \NC\MR
+%D \NC \s!af \NC afrikaans \NC germanic \NC\MR
+%D \NC \s!nb \NC bokmal \NC germanic \NC\LR
+%D \NC \s!nn \NC nynorsk \NC germanic \NC\LR
+%D \HL
+%D \stoptable
+%D \protect
+%D
+%D \unprotect
+%D \placetable{The italic languages (\type{lang-ita})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!fr \NC french \NC italic \NC\FR
+%D \NC \s!ca \NC catalan \NC italic \NC\MR
+%D \NC \s!es \NC spanish \NC italic \NC\MR
+%D \NC \s!it \NC italian \NC italic \NC\MR
+%D \NC \s!la \NC latin \NC italic \NC\MR
+%D \NC \s!pt \NC portuguese \NC italic \NC\LR
+%D \HL
+%D \stoptable
+%D \protect
+%D
+%D \unprotect
+%D \placetable{The slavic languages (\type{lang-sla})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!pl \NC polish \NC slavic \NC\FR
+%D \NC \s!cs \NC czech \NC slavic \NC\MR
+%D \NC \s!sk \NC slavik \NC slavic \NC\LR
+%D \HL
+%D \stoptable
+%D \protect
+%D \unprotect
+%D
+%D \placetable{The altaic languages (\type{lang-alt})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!tr \NC turkish \NC altaic \NC\SR
+%D \HL
+%D \stoptable
+%D
+%D \placetable{The uralic languages (\type{lang-ura})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!fi \NC finnish \NC uralic \NC\SR
+%D \HL
+%D \stoptable
+%D \protect
+
+\unexpanded\def\nopatterns{\normallanguage\minusone}
+
+%D We default to the language belonging to the interface. This is one of the few
+%D places outside the interface modules where \type {\startinterface} is used.
+
+\setupcurrentlanguage[\s!en]
+
+\unexpanded\def\initializemainlanguage
+ {\mainlanguage[\currentlanguage]%
+ \showmessage\m!languages9\currentlanguage}
+
+%D New:
+
+\let\stopexceptions\relax
+
+\unexpanded\def\startexceptions
+ {\dosingleempty\lang_basics_start_exceptions}
+
+\def\lang_basics_start_exceptions[#1]#2\stopexceptions % multilingual or not?
+ {\begingroup
+ \edef\askedlanguage{\reallanguagetag{#1}}%
+ \ifx\askedlanguage\empty
+ \let\askedlanguage\currentlanguage
+ \fi
+ \clf_setlanguageexceptions{\askedlanguage}{#2}%
+ \endgroup}
+
+\unexpanded\def\hyphenation
+ {\clf_setlanguageexceptions{\currentlanguage}}
+
+%D For the moment here:
+
+\uchyph 1 % also treat uppercase
+\exhyphenchar 45 % to permit breaking at explicit hyphens
+
+%D New:
+
+\unexpanded\def\traceddiscretionary#1#2#3%
+ {\dontleavehmode
+ \discretionary{\darkred#1}{\darkgreen#2}{\darkblue#3}}
+
+\unexpanded\def\samplediscretionary
+ {\traceddiscretionary
+ {pre\clf_currentprehyphenchar}%
+ {\clf_currentposthyphenchar post}%
+ {replace}}
+
+% todo: make this configurable
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lang-lab.mkiv b/Master/texmf-dist/tex/context/base/mkiv/lang-lab.mkiv
index 9d73d96e589..1ae2d4c741c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lang-lab.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/lang-lab.mkiv
@@ -24,26 +24,23 @@
\def\sixperemspace{\normalUchar"2006}
\fi
-%D In this module we deal with language dependant labels and
-%D prefixes, like in {\em Figure~12} and {\em Chapter 1}. In
-%D this file we set the default values. Users can easily
-%D overrule these.
+%D In this module we deal with language dependant labels and prefixes, like in {\em
+%D Figure~12} and {\em Chapter 1}. In this file we set the default values. Users can
+%D easily overrule these.
%D
-%D This module is dedicated to the grandfather of Tobias
-%D Burnus, who's extensive languages oriented library helped us
-%D a lot in finding the right translations. All those labels
-%D are collected in files that reflect their common ancestor.
+%D This module is dedicated to the grandfather of Tobias Burnus, who's extensive
+%D languages oriented library helped us a lot in finding the right translations. All
+%D those labels are collected in files that reflect their common ancestor.
%D
-%D Not all languages can be satisfied with the labeling
-%D mechanism as provided here. Chinese for instance put a label
-%D in front as well as after a part number. This is why the
-%D current implementation of labels supports two labels too.
+%D Not all languages can be satisfied with the labeling mechanism as provided here.
+%D Chinese for instance put a label in front as well as after a part number. This is
+%D why the current implementation of labels supports two labels too.
%D \macros
%D {setupheadtext, setuplabeltext}
%D
-%D First we present some macros that deal with what we will
-%D call head and label texts. Such texts are defines by:
+%D First we present some macros that deal with what we will call head and label
+%D texts. Such texts are defines by:
%D
%D \showsetup{setupheadtext}
%D \showsetup{setuplabeltext}
@@ -165,8 +162,8 @@
%D \macros
%D {presetheadtext,presetlabeltext}
%D
-%D These macros enable us to automatically define head and label
-%D texts without replacing predefined ones. They are internal macros.
+%D These macros enable us to automatically define head and label texts without
+%D replacing predefined ones. They are internal macros.
\appendtoks \let\labellanguage\currentlanguage \to \everycurrentdate
@@ -301,9 +298,8 @@
%D \macros
%D {translate}
%D
-%D Sometimes macros contain language specific words that are to
-%D be typeset. Such macros can be made (more) language
-%D independant by using:
+%D Sometimes macros contain language specific words that are to be typeset. Such
+%D macros can be made (more) language independant by using:
%D
%D \showsetup{translate}
%D
@@ -313,8 +309,7 @@
%D \translate[en=something,nl=iets]
%D \stoptyping
%D
-%D which expands to {\em something} or {\em iets}, depending on
-%D de current language.
+%D which expands to {\em something} or {\em iets}, depending on de current language.
\installcorenamespace{translation}
@@ -331,8 +326,8 @@
[translation #1]%
\fi\fi}
-%D When used without argument, the last defined values are
-%D used. This enables repetitive use like
+%D When used without argument, the last defined values are used. This enables
+%D repetitive use like
%D
%D \starttyping
%D \en \translate\ means \nl \translate
@@ -341,8 +336,8 @@
%D \macros
%D {assigntranslation}
%D
-%D This macro is a system macro, and can be used to assign a
-%D translation to a macro. Its form is:
+%D This macro is a system macro, and can be used to assign a translation to a macro.
+%D Its form is:
%D
%D \starttyping
%D \assigntranslation[en=something,nl=iets]\to\command
@@ -350,7 +345,7 @@
\unexpanded\def\assigntranslation[#1]\to#2% bad, this \to
{\getparameters[\??translation][#1]%
- \edef#2{\csname\??translation\currentlanguage\endcsname}}
+ \edef#2{\begincsname\??translation\currentlanguage\endcsname}}
%D \macros
%D {commalistsentence}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lang-lab.mkxl b/Master/texmf-dist/tex/context/base/mkiv/lang-lab.mkxl
new file mode 100644
index 00000000000..a527224e9dc
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/lang-lab.mkxl
@@ -0,0 +1,390 @@
+%D \module
+%D [ file=lang-lab,
+%D version=1997.08.27,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Labels,
+%D author=Hans Hagen / Tobias Burnus,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Labels}
+
+\registerctxluafile{lang-lab}{}
+\registerctxluafile{lang-txt}{}
+
+\unprotect
+
+%D Left-overs:
+
+\ifdefined\sixperemspace \else
+ \def\sixperemspace{\normalUchar"2006}
+\fi
+
+%D In this module we deal with language dependant labels and prefixes, like in {\em
+%D Figure~12} and {\em Chapter 1}. In this file we set the default values. Users can
+%D easily overrule these.
+%D
+%D This module is dedicated to the grandfather of Tobias Burnus, who's extensive
+%D languages oriented library helped us a lot in finding the right translations. All
+%D those labels are collected in files that reflect their common ancestor.
+%D
+%D Not all languages can be satisfied with the labeling mechanism as provided here.
+%D Chinese for instance put a label in front as well as after a part number. This is
+%D why the current implementation of labels supports two labels too.
+
+%D \macros
+%D {setupheadtext, setuplabeltext}
+%D
+%D First we present some macros that deal with what we will call head and label
+%D texts. Such texts are defines by:
+%D
+%D \showsetup{setupheadtext}
+%D \showsetup{setuplabeltext}
+%D
+%D A regular \CONTEXT\ stores some 1500 labels at most.
+%D
+%D These commands accept all kind of inputs:
+%D
+%D \starttyping
+%D \setuplabeltext [language] [labellabel=text]
+%D \setuplabeltext [language] [labellabel=text,labellabel=text,...]
+%D \setuplabeltext [labellabel=text]
+%D \setuplabeltext [labellabel=text,labellabel=text,...]
+%D \stoptyping
+%D
+%D The last two cases concern the current language.
+
+\installcorenamespace{label}
+
+\let\currentlabelcategory\empty
+
+\unexpanded\def\definelabelclass
+ {\dodoubleempty\lang_labels_define_class}
+
+\def\lang_labels_define_class[#1][#2]%
+ {\normalexpanded
+ {\lang_labels_define_class_indeed
+ {#1}%
+ {\ifsecondargument#2\else\zerocount\fi}%
+ \expandafter\noexpand\csname dogetupsome#1text\endcsname
+ \expandafter\noexpand\csname #1language\endcsname
+ \expandafter\noexpand\csname dodogetupsome#1text\endcsname
+ \expandafter\noexpand\csname left#1text\endcsname
+ \expandafter\noexpand\csname right#1text\endcsname
+ \expandafter\noexpand\csname #1texts\endcsname
+ \expandafter\noexpand\csname #1text\endcsname}}
+
+% hm, not interfaced
+
+\let\thetextprefix\empty
+
+\unexpanded\def\lang_labels_define_class_indeed#1#2#3#4#5#6#7#8#9%
+ {\setuvalue{setup#1text}{\protecttextprefixes#2\def\currenttextprefixclass{#1}\dodoubleempty\lang_labels_text_prefix_setup}%
+ \setuvalue{preset#1text}{\protecttextprefixes1\def\currenttextprefixclass{#1}\dodoubleempty\lang_labels_text_prefix_setup}%
+ \setuvalue{copy#1text}{\protecttextprefixes1\def\currenttextprefixclass{#1}\dodoubleempty\lang_labels_text_prefix_copy}%
+ \setuvalue{start#1text}{\protecttextprefixes1\def\currenttextprefixclass{#1}\dotripleempty\lang_labels_text_prefix_start[#1]}%
+ \letvalue{stop#1text}\relax
+ \def#4{\reallanguagetag{\defaultlanguage\currentmainlanguage}}%
+ \ifnum#2=\plustwo % used for math and tags
+ \def#3{#5#4}%
+ \def#5##1##2% ##1=language
+ {\ifcsname\??label\currentlabelcategory#1:##1:##2\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??label#1:##1:##2\endcsname
+ \lastnamedcs
+ % \orelse\ifcsname\??language#4\s!default\endcsname
+ % \expandafter#5\csname\??language#4\s!default\endcsname{##2}%
+ \orelse\ifcsname\??language##1\s!default\endcsname
+ %\expandafter#5\csname\??language##1\s!default\endcsname{##2}%
+ \expandafter#5\lastnamedcs{##2}%
+ \orelse\ifcsname\??label\currentlabelcategory#1:##2\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??label#1:##2\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??label\currentlabelcategory#1:\s!en:##2\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??label#1:\s!en:##2\endcsname
+ \lastnamedcs
+ \else
+ ##2%
+ \fi}%
+ \let#6\gobbleoneargument
+ \let#7\gobbleoneargument
+ \let#8\gobbletwoarguments
+ \let#9#3%
+ \else
+ \unexpanded\def#3{#5#4}%
+ \unexpanded\def#5##1##2%
+ {\ifcsname\??label#1:##1:##2\endcsname
+ %\expandafter\let\expandafter\thetextprefix\csname\??label#1:##1:##2\endcsname
+ \expandafter\let\expandafter\thetextprefix\lastnamedcs
+ \orelse\ifcsname\??language#4\s!default\endcsname
+ %\expandafter#5\csname\??language#4\s!default\endcsname{##2}%
+ \expandafter#5\lastnamedcs{##2}%
+ \orelse\ifcsname\??label#1:##2\endcsname
+ %\expandafter\let\expandafter\thetextprefix\csname\??label#1:##2\endcsname
+ \expandafter\let\expandafter\thetextprefix\lastnamedcs
+ \orelse\ifcsname\??label#1:\s!en:##2\endcsname
+ %\expandafter\let\expandafter\thetextprefix\csname\??label#1:\s!en:##2\endcsname
+ \expandafter\let\expandafter\thetextprefix\lastnamedcs
+ \else
+ \let\thetextprefix\dummytextprefix
+ \fi}%
+ \unexpanded\def#6##1{#3{##1}\expandafter\flushleftlabelclass \thetextprefix}%
+ \unexpanded\def#7##1{#3{##1}\expandafter\flushrightlabelclass\thetextprefix}%
+ \unexpanded\def#8##1{#3{##1}\expandafter\flushbothlabelclass \thetextprefix}% #2
+ \unexpanded\def#9##1{#3{##1}\expandafter\flushleftlabelclass \thetextprefix}%
+ \fi
+ \appendtoks
+ \let#6\firstofoneargument % to be checked
+ \let#7\firstofoneargument % to be checked
+ \let#8\firstofoneargument % to be checked
+ \let#9\firstofoneargument % to be checked
+ \to \everysimplifycommands}
+
+\let\flushleftlabelclass \firstoftwoarguments
+\let\flushrightlabelclass\secondoftwoarguments
+\def\flushbothlabelclass #1#2#3{#1#3#2}
+\def\dummytextprefix {\empty\empty}
+
+%D \macros
+%D {headtext, labeltext, leftlabeltext, rightlabeltext, labeltexts}
+%D
+%D Once defined, head and label texts can be called upon using:
+%D
+%D \showsetup{headtext}
+%D \showsetup{labeltext}
+%D
+%D \macros
+%D {presetheadtext,presetlabeltext}
+%D
+%D These macros enable us to automatically define head and label texts without
+%D replacing predefined ones. They are internal macros.
+
+\appendtoks \let\labellanguage\currentlanguage \to \everycurrentdate
+
+\newconstant\protecttextprefixes
+
+\let\currenttextprefixtag \s!unknown
+\let\currenttextprefixclass\s!unknown
+
+\def\lang_labels_text_prefix_start[#1][#2][#3]% class language name
+ {\ifthirdargument
+ \edef\currenttextprefixtag{\reallanguagetag{#2}}%
+ \edef\currenttextprefixname{#3}%
+ \else
+ \edef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}%
+ \edef\currenttextprefixname{#2}%
+ \fi
+ \grabuntil{stop#1text}\lang_labels_text_prefix_start_indeed}
+
+\def\lang_labels_text_prefix_start_indeed#1% text (not special checking done here yet, only for long texts anyway)
+ {\expandafter\edef\csname\??label\currenttextprefixclass:\currenttextprefixtag:\currenttextprefixname\endcsname%
+ {{\clf_strip{#1}}\empty}}
+
+\def\lang_labels_text_prefix_setup[#1][#2]%
+ {\ifsecondargument
+ \edef\currenttextprefixtag{\reallanguagetag{#1}}%
+ \processcommalist[#2]\lang_labels_text_prefix_setup_indeed
+ \else
+ \edef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}%
+ \processcommalist[#1]\lang_labels_text_prefix_setup_indeed
+ \fi}
+
+\def\lang_labels_text_prefix_setup_indeed#1%
+ {\lang_labels_text_prefix_assign[#1]}
+
+\def\lang_labels_text_prefix_assign[#1=#2]%
+ {\lang_labels_text_prefix_assign_indeed{#1}[#2,,]}
+
+\def\lang_labels_text_prefix_assign_indeed#1%
+ {\ifcase\protecttextprefixes
+ % no checking
+ \expandafter\lang_labels_text_prefix_assign_yes
+ \or
+ % checking
+ \ifcsname\??label\currenttextprefixclass:\currenttextprefixtag:#1\endcsname
+ \expandafter\expandafter\expandafter\lang_labels_text_prefix_assign_nop
+ \else
+ \expandafter\expandafter\expandafter\lang_labels_text_prefix_assign_yes
+ \fi
+ \or
+ % simple assignment (a bit overkill but it fits in the whole)
+ \expandafter\lang_labels_text_prefix_assign_dumb
+ \fi{#1}}
+
+\let\m_lang_labels_left \empty
+\let\m_lang_labels_right\empty
+
+% \def\lang_labels_text_prefix_assign_yes#1[#2,#3,#4]%
+% {\def\m_lang_labels_left {#2}% no longer an edef ... else \Word undefined expansion issues
+% \def\m_lang_labels_right{#3}% no longer an edef ... else \Word undefined expansion issues
+% \ifx\m_lang_labels_right\empty
+% \ifx\m_lang_labels_left\empty
+% \expandafter\def\csname\??label\currenttextprefixclass:\currenttextprefixtag:#1\endcsname{\empty\empty}%
+% \else
+% \expandafter\def\csname\??label\currenttextprefixclass:\currenttextprefixtag:#1\endcsname{{#2}\empty}%
+% \fi
+% \else
+% \expandafter\def\csname\??label\currenttextprefixclass:\currenttextprefixtag:#1\endcsname{{#2}{#3}}%
+% \fi}
+%
+% how we love obscure efficicency ...
+
+\def\lang_labels_text_prefix_assign_yes#1[#2,#3,#4]%
+ {\def\m_lang_labels_left {#2}% no longer an edef ... else \Word undefined expansion issues
+ \def\m_lang_labels_right{#3}% no longer an edef ... else \Word undefined expansion issues
+ \expandafter\def\csname\??label\currenttextprefixclass:\currenttextprefixtag:#1%
+ \ifx\m_lang_labels_right\empty
+ \ifx\m_lang_labels_left\empty
+ \endcsname{\empty\empty}%
+ \else
+ \endcsname{{#2}\empty}%
+ \fi
+ \else
+ \endcsname{{#2}{#3}}%
+ \fi}
+
+\def\lang_labels_text_prefix_assign_nop#1[#2]%
+ {}
+
+\def\lang_labels_text_prefix_assign_dumb#1[#2,#3]%
+ {\expandafter\def\csname\??label\currenttextprefixclass:\currenttextprefixtag:#1\endcsname{#2}}
+
+\unexpanded\def\setlabeltextpair#1#2#3#4#5% a fast one for usage at the Lua end
+ {%\writestatus{!!!!}{#1:\reallanguagetag{#2}:#3}%
+ \expandafter\def\csname\??label#1:\reallanguagetag{#2}:#3\endcsname{{#4}{#5}}} % class tag key left right
+
+\def\lang_labels_text_prefix_copy[#1][#2]%
+ {\ifsecondargument
+ \edef\currenttextprefixtag{\reallanguagetag{#1}}%
+ \processcommalist[#2]\lang_labels_text_prefix_copy_indeed
+ \else
+ \edef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}%
+ \processcommalist[#1]\lang_labels_text_prefix_copy_indeed
+ \fi}
+
+\def\lang_labels_text_prefix_copy_indeed#1%
+ {\lang_labels_text_prefix_copy_pair[#1]}
+
+\def\lang_labels_text_prefix_copy_pair[#1=#2]%
+ {\lang_labels_text_prefix_copy_pair_indeed{#1}[#2,,]}
+
+% \def\lang_labels_text_prefix_copy_pair_indeed#1[#2,#3]%
+% {\expandafter\let
+% \csname\??label\currenttextprefixclass:\currenttextprefixtag:#1\expandafter\endcsname
+% \csname\??label\currenttextprefixclass:\currenttextprefixtag:#2\endcsname}
+%
+% this delays the aliasing so that we can switch maillanguage in between
+
+\def\lang_labels_text_prefix_copy_pair_indeed#1[#2,#3]%
+ {\expandafter\edef\csname\??label\currenttextprefixclass:#1\endcsname
+ {{\noexpand\csname\??label\currenttextprefixclass:\noexpand\reallanguagetag\noexpand\currentmainlanguage:#2\endcsname}{}}}
+
+\definelabelclass [head] [0] % titles
+\definelabelclass [label] [0] % texts
+\definelabelclass [mathlabel] [0] % functions
+\definelabelclass [taglabel] [2] % tags
+
+\clf_definelabels{head}{titles}\s!true\relax
+\clf_definelabels{label}{texts}\s!true\relax
+\clf_definelabels{mathlabel}{functions}\s!false\relax
+\clf_definelabels{taglabel}{tags}\s!false\relax
+
+%D \macros
+%D {translate}
+%D
+%D Sometimes macros contain language specific words that are to be typeset. Such
+%D macros can be made (more) language independant by using:
+%D
+%D \showsetup{translate}
+%D
+%D like for instance:
+%D
+%D \starttyping
+%D \translate[en=something,nl=iets]
+%D \stoptyping
+%D
+%D which expands to {\em something} or {\em iets}, depending on de current language.
+
+\installcorenamespace{translation}
+
+\unexpanded\def\translate
+ {\dosingleempty\lang_translate}
+
+\def\lang_translate[#1]%
+ {\getparameters[\??translation][#1]%
+ \ifcsname\??translation\currentlanguage\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??translation\s!en\endcsname
+ \lastnamedcs
+ \else
+ [translation #1]%
+ \fi}
+
+%D When used without argument, the last defined values are used. This enables
+%D repetitive use like
+%D
+%D \starttyping
+%D \en \translate\ means \nl \translate
+%D \stoptyping
+
+%D \macros
+%D {assigntranslation}
+%D
+%D This macro is a system macro, and can be used to assign a translation to a macro.
+%D Its form is:
+%D
+%D \starttyping
+%D \assigntranslation[en=something,nl=iets]\to\command
+%D \stoptyping
+
+\unexpanded\def\assigntranslation[#1]\to#2% bad, this \to
+ {\getparameters[\??translation][#1]%
+ \edef#2{\begincsname\??translation\currentlanguage\endcsname}}
+
+%D \macros
+%D {commalistsentence}
+%D
+%D Redone in \LUA:
+%D
+%D \startbuffer
+%D \commalistsentence[aap,noot,mies]
+%D \commalistsentence[aap,noot]
+%D \commalistsentence[aap]
+%D \commalistsentence[a,b,c]
+%D \commalistsentence[a,b,c][{ \& },{ and }]
+%D \commalistsentence[a,b,c][+,-]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+\unexpanded\def\commalistsentence
+ {\dodoubleempty\typo_helpers_concat_comma_list}
+
+\def\typo_helpers_concat_comma_list[#1][#2]%
+ {\clf_concatcommalist
+ text {#1}%
+ separators {#2}%
+ separator {\detokenize\expandafter{\normalexpanded{\labeltext{and-1}}}}%
+ last {\detokenize\expandafter{\normalexpanded{\labeltext{and-2}}}}%
+ \relax}
+
+\setuplabeltext [\s!nl] [and-1={{, }}, and-2={{ en }}] % 1, 2 en 3
+\setuplabeltext [\s!en] [and-1={{, }}, and-2={{, }}] % 1, 2, 3
+\setuplabeltext [\s!de] [and-1={{, }}, and-2={{ und }}] % 1, 2 und 3
+\setuplabeltext [\s!hr] [and-1={{, }}, and-2={{ i }}] % 1, 2 i 3
+
+%D Goodie (handy at \LUA\ end):
+
+\unexpanded\def\LABELTEXT#1{\WORD{\labeltext{#1}}} % only for simple cases!
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lang-rep.lua b/Master/texmf-dist/tex/context/base/mkiv/lang-rep.lua
index 93509d82a3e..d0f6f6d5f24 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lang-rep.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lang-rep.lua
@@ -34,8 +34,8 @@ local splitter = Ct((
local stripper = P("{") * Cs((1-P(-2))^0) * P("}") * P(-1)
-local trace_replacements = false trackers.register("languages.replacements", function(v) trace_replacements = v end)
-local trace_detail = false trackers.register("languages.replacements.detail", function(v) trace_detail = v end)
+local trace_replacements = false trackers.register("languages.replacements", function(v) trace_replacements = v end)
+local trace_details = false trackers.register("languages.replacements.details", function(v) trace_details = v end)
local report_replacement = logs.reporter("languages","replacements")
@@ -179,7 +179,7 @@ local function hit(a,head)
else
local final = newroot.final
if final then
- if trace_detail then
+ if trace_details then
report_replacement("hitting word %a, replacement %a",final.word,final.replacement)
end
lastrun = current
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lang-txt.lua b/Master/texmf-dist/tex/context/base/mkiv/lang-txt.lua
index d287f7e6d6c..f89795e3972 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lang-txt.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lang-txt.lua
@@ -36,6 +36,7 @@ if not modules then modules = { } end modules ['lang-txt'] = {
-- kr Korean Jeong Dalyoung
-- la Latin ...
-- lt Lithuanian Marius AlekneviÄius
+-- mk Macedonian Jakub Loula, Tomáš Hála (2019), Stojan Trajanovski
-- nb Norwegian Hans Fredrik Nordhaug, ...
-- nn Norwegian Hans Fredrik Nordhaug, ...
-- nl Dutch Hans Hagen
@@ -44,7 +45,7 @@ if not modules then modules = { } end modules ['lang-txt'] = {
-- pt Portuguese Pedro F. M. Mendonça
-- ro Romanian Dan Seracu, ...
-- ru Russian Olga Briginets, Alexander Bokovoy, Victor Figurnov, ...
--- sk Slovak ...
+-- sk Slovak Tomáš Hála (2012)
-- sl Slovenian Mojca Miklavec
-- sv Swedish ...
-- tk Turkish Tobias Burnus
@@ -64,6 +65,8 @@ local languages = languages
languages.data = languages.data or utilities.storage.allocate { }
local data = languages.data
+local hairspace = utf.char(0x200A)
+
data.labels={
["btx"]={
["In"]={
@@ -71,6 +74,7 @@ data.labels={
["en"]="In",
["es"]="En",
["fr"]="Dans",
+ ["mk"]="во",
["pe"]="در",
},
},
@@ -79,6 +83,7 @@ data.labels={
["de"]="Numer",
["en"]="Number",
["fr"]="Numéro",
+ ["mk"]="Број",
["nl"]="Nummer",
["pe"]="شماره",
},
@@ -88,6 +93,7 @@ data.labels={
["de"]="Band",
["en"]="Volume",
["et"]="Köide",
+ ["mk"]="Том",
["nl"]="Deel",
["pe"]="جلد",
},
@@ -100,6 +106,7 @@ data.labels={
["et"]="ja",
["fr"]="et",
["it"]="e",
+ ["mk"]="и",
["nl"]="en",
["pe"]="Ùˆ",
},
@@ -112,6 +119,7 @@ data.labels={
["et"]="väljaanne",
["fr"]="édition",
["it"]="edizione",
+ ["mk"]="издание",
["nl"]="editie",
["pe"]="ویرایش",
},
@@ -123,6 +131,7 @@ data.labels={
["et"]="toimetaja",
["fr"]="éditeur",
["it"]="a cura di",
+ ["mk"]="уредник",
["pe"]="ویراستار",
},
},
@@ -134,6 +143,8 @@ data.labels={
["et"]="toimetajad",
["fr"]="éditeurs",
["it"]="a cura di",
+ ["mk"]="уредници",
+
},
},
["in"]={
@@ -141,6 +152,7 @@ data.labels={
["en"]="in",
["es"]="en",
["fr"]="dans",
+ ["mk"]="во",
["pe"]="در",
},
},
@@ -152,6 +164,7 @@ data.labels={
["et"]="magistritöö",
["fr"]="Thèse de master (DEA, DESS, master)",
["it"]="Tesi di laurea",
+ ["mk"]="МагиÑтерÑка диÑертација",
["nl"]="Masterproef",
["pe"]="پایان‌نامه کارشناسی ارشد",
},
@@ -161,6 +174,7 @@ data.labels={
["de"]="Numer",
["en"]="number",
["fr"]="numéro",
+ ["mk"]="број",
["nl"]="nummer",
["pe"]="شماره",
},
@@ -170,6 +184,7 @@ data.labels={
["de"]="von",
["en"]="of",
["fr"]="de",
+ ["mk"]="од",
["nl"]="van",
},
},
@@ -177,12 +192,14 @@ data.labels={
["labels"]={
["en"]="et al.",
["et"]="jt",
+ ["mk"]="и др.",
},
},
["p"]={
["labels"]={
["de"]="S.",
["en"]="p.",
+ ["mk"]="ÑÑ‚Ñ€.",
["et"]="lk",
["pe"]="ص",
},
@@ -192,6 +209,7 @@ data.labels={
["de"]="Seiten",
["en"]="pages",
["et"]="leheküljed",
+ ["mk"]="Ñтраници",
["nl"]="paginas",
["pe"]="صÙحات",
},
@@ -204,6 +222,7 @@ data.labels={
["et"]="Patent",
["fr"]="Brevet",
["it"]="Brevetto",
+ ["mk"]="Патент",
["nl"]="Octrooi",
},
},
@@ -215,6 +234,7 @@ data.labels={
["et"]="doktoritöö",
["fr"]="Thèse de doctorat",
["it"]="Tesi di dottorato",
+ ["mk"]="ДокторÑка диÑертација",
["nl"]="Proefschrift",
["pe"]="رساله دکتری",
},
@@ -224,6 +244,7 @@ data.labels={
["de"]="S.",
["en"]="pp.",
["et"]="lk-d",
+ ["mk"]="ÑÑ‚Ñ€.",
["pe"]="صص",
},
},
@@ -235,6 +256,7 @@ data.labels={
["et"]="tehniline raport",
["fr"]="Rapport technique",
["it"]="Relazione tecnica",
+ ["mk"]="Технички извештај",
["nl"]="Technisch rapport",
["pe"]="گزارش ÙÙ†ÛŒ",
},
@@ -244,6 +266,7 @@ data.labels={
["de"]="Band",
["en"]="volume",
["et"]="köide",
+ ["mk"]="том",
["nl"]="deel",
["pe"]="جلد",
},
@@ -256,6 +279,7 @@ data.labels={
["et"]="koos",
["fr"]="avec",
["it"]="con",
+ ["mk"]="Ñо",
["nl"]="met",
},
},
@@ -265,6 +289,7 @@ data.labels={
["labels"]={
["cz"]="P",
["en"]="Pr",
+ ["mk"]="P",
["sk"]="P",
},
},
@@ -274,6 +299,7 @@ data.labels={
["en"]="arccos",
["es"]="arc\\sixperemspace cos",
["hr"]="arc\\sixperemspace cos",
+ ["mk"]="arccos",
["pl"]="arc\\sixperemspace cos",
["sk"]="arccos",
},
@@ -284,6 +310,7 @@ data.labels={
["en"]="arccosh",
["es"]="arc\\sixperemspace cosh",
["hr"]="arc\\sixperemspace cosh",
+ ["mk"]="arccosh",
["pl"]="arc\\sixperemspace cosh",
["sk"]="arccosh",
},
@@ -294,6 +321,7 @@ data.labels={
["en"]="arccot",
["es"]="arc\\sixperemspace cot",
["hr"]="arc\\sixperemspace ctg",
+ ["mk"]="arccotg",
["pl"]="arc\\sixperemspace ctg",
["sk"]="arccotg",
},
@@ -304,6 +332,7 @@ data.labels={
["en"]="arcsin",
["es"]="arc\\sixperemspace sen",
["hr"]="arc\\sixperemspace sin",
+ ["mk"]="arcsin",
["pl"]="arc\\sixperemspace sin",
["sk"]="arcsin",
},
@@ -314,6 +343,7 @@ data.labels={
["en"]="arcsinh",
["es"]="arc\\sixperemspace senh",
["hr"]="arc\\sixperemspace sinh",
+ ["mk"]="arcsinh",
["pl"]="arc\\sixperemspace sinh",
["sk"]="arcsinh",
},
@@ -324,6 +354,7 @@ data.labels={
["en"]="arctan",
["es"]="arc\\sixperemspace tan",
["hr"]="arc\\sixperemspace tg",
+ ["mk"]="arctg",
["pl"]="arc\\sixperemspace tg",
["sk"]="arctg",
},
@@ -334,8 +365,9 @@ data.labels={
["en"]="arctanh",
["es"]="arc\\sixperemspace tanh",
["hr"]="arc\\sixperemspace tgh",
+ ["mk"]="arctgh",
["pl"]="arc\\sixperemspace tgh",
- ["sk"]="arctg",
+ ["sk"]="arctgh",
},
},
["arg"]={
@@ -343,6 +375,7 @@ data.labels={
["cz"]="arg",
["en"]="arg",
["es"]="arg",
+ ["mk"]="arg",
["sk"]="arg",
},
},
@@ -351,6 +384,7 @@ data.labels={
["cz"]="cos",
["en"]="cos",
["es"]="cos",
+ ["mk"]="cos",
["sk"]="cos",
},
},
@@ -359,6 +393,7 @@ data.labels={
["cz"]="cosh",
["en"]="cosh",
["es"]="cosh",
+ ["mk"]="cosh",
["sk"]="cosh",
},
},
@@ -368,6 +403,7 @@ data.labels={
["en"]="cot",
["es"]="cot",
["hr"]="ctg",
+ ["mk"]="ctg",
["pl"]="ctg",
["sk"]="cotg",
},
@@ -377,6 +413,7 @@ data.labels={
["cz"]="cotgh",
["en"]="coth",
["es"]="coth",
+ ["mk"]="ctgh",
["sk"]="cotgh",
},
},
@@ -385,6 +422,7 @@ data.labels={
["cz"]="cosec",
["en"]="csc",
["es"]="csc",
+ ["mk"]="cosec",
["sk"]="cosec",
},
},
@@ -394,6 +432,7 @@ data.labels={
["en"]="cot",
["es"]="cot",
["hr"]="ctg",
+ ["mk"]="ctg",
["pl"]="ctg",
["sk"]="cotg",
},
@@ -403,6 +442,7 @@ data.labels={
["cz"]="deg",
["en"]="deg",
["es"]="gr",
+ ["mk"]="deg",
["sk"]="deg",
},
},
@@ -424,6 +464,7 @@ data.labels={
["cz"]="dim",
["en"]="dim",
["es"]="dim",
+ ["mk"]="dim",
["sk"]="dim",
},
},
@@ -441,6 +482,7 @@ data.labels={
["en"]="gcd",
["es"]="mcd",
["hr"]="nzd",
+ ["mk"]="ÐЗД",
["nl"]="ggd",
["sk"]="NSD",
},
@@ -458,6 +500,7 @@ data.labels={
["cz"]="inf",
["en"]="inf",
["es"]="inf",
+ ["mk"]="inf",
["sk"]="inf",
},
},
@@ -483,6 +526,7 @@ data.labels={
["en"]="lcm",
["es"]="MCM",
["hr"]="nzv",
+ ["mk"]="ÐЗС",
["nl"]="kgv",
["sk"]="NSN",
},
@@ -492,6 +536,7 @@ data.labels={
["cz"]="log",
["en"]="lg",
["es"]="log",
+ ["mk"]="lg",
["sk"]="log",
},
},
@@ -500,6 +545,7 @@ data.labels={
["cz"]="lim",
["en"]="lim",
["es"]="lím",
+ ["mk"]="lim",
["sk"]="lim",
},
},
@@ -508,6 +554,7 @@ data.labels={
["cz"]="lim\\sixperemspace inf",
["en"]="lim\\sixperemspace inf",
["es"]="lím\\sixperemspace inf",
+ ["mk"]="lim\\sixperemspace inf",
["sk"]="lim\\sixperemspace inf",
},
},
@@ -516,6 +563,7 @@ data.labels={
["cz"]="lim\\sixperemspace sup",
["en"]="lim\\sixperemspace sup",
["es"]="lím\\sixperemspace sup",
+ ["mk"]="lim\\sixperemspace sup",
["sk"]="lim\\sixperemspace sup",
},
},
@@ -524,6 +572,7 @@ data.labels={
["cz"]="ln",
["en"]="ln",
["es"]="ln",
+ ["mk"]="ln",
["sk"]="ln",
},
},
@@ -532,6 +581,7 @@ data.labels={
["cz"]="log",
["en"]="log",
["es"]="log",
+ ["mk"]="log",
["sk"]="log",
},
},
@@ -540,6 +590,7 @@ data.labels={
["cz"]="max",
["en"]="max",
["es"]="máx",
+ ["mk"]="max",
["sk"]="max",
},
},
@@ -556,6 +607,7 @@ data.labels={
["cz"]="min",
["en"]="min",
["es"]="mín",
+ ["mk"]="min",
["sk"]="min",
},
},
@@ -564,6 +616,7 @@ data.labels={
["cz"]="mod",
["en"]="mod",
["es"]="mod",
+ ["mk"]="mod",
["sk"]="mod",
},
},
@@ -580,6 +633,7 @@ data.labels={
["cz"]="sec",
["en"]="sec",
["es"]="sec",
+ ["mk"]="sec",
["sk"]="sec",
},
},
@@ -588,6 +642,7 @@ data.labels={
["cz"]="sin",
["en"]="sin",
["es"]="sen",
+ ["mk"]="sin",
["sk"]="sin",
},
},
@@ -596,6 +651,7 @@ data.labels={
["cz"]="sinh",
["en"]="sinh",
["es"]="senh",
+ ["mk"]="sinh",
["sk"]="sinh",
},
},
@@ -604,6 +660,7 @@ data.labels={
["cz"]="sup",
["en"]="sup",
["es"]="sup",
+ ["mk"]="sup",
["sk"]="sup",
},
},
@@ -613,6 +670,7 @@ data.labels={
["en"]="tan",
["es"]="tan",
["hr"]="tg",
+ ["mk"]="tg",
["pl"]="tg",
["sk"]="tg",
},
@@ -622,11 +680,24 @@ data.labels={
["cz"]="tgh",
["en"]="tanh",
["es"]="tanh",
+ ["mk"]="tgh",
["sk"]="tgh",
},
},
},
["texts"]={
+ ["following:singular"]={
+ ["labels"]={
+ ["en"]="f.",
+ ["fr"]=hairspace .. "sq",
+ },
+ },
+ ["following:plural"]={
+ ["labels"]={
+ ["en"]="ff.",
+ ["fr"]=hairspace .. "sqq",
+ },
+ },
["and"]={
["labels"]={
["af"]="",
@@ -645,6 +716,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="",
+ ["mk"]=" и ",
["nb"]="",
["nl"]=" en ",
["nn"]="",
@@ -685,6 +757,7 @@ data.labels={
["kr"]="부ë¡",
["la"]="",
["lt"]="",
+ ["mk"]="Додаток ",
["nb"]="Tillegg ",
["nl"]="",
["nn"]="Tillegg ",
@@ -727,6 +800,7 @@ data.labels={
["la"]="Aprilis",
["lt"]="balandžio",
["nb"]="april",
+ ["mk"]="април",
["nl"]="april",
["nn"]="april",
["pe"]="آوریل",
@@ -767,6 +841,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="apr",
+ ["mk"]="апр.",
["nb"]="april",
["nl"]="",
["nn"]="april",
@@ -802,6 +877,7 @@ data.labels={
["it"]="a pagina ",
["la"]="",
["lt"]="puslapyje ",
+ ["mk"]="на Ñтраница ",
["nb"]="på side ",
["nl"]="op pagina ",
["nn"]="på side ",
@@ -844,6 +920,7 @@ data.labels={
["kr"]="8",
["la"]="Augustus",
["lt"]="rugpjÅ«Äio",
+ ["mk"]="авгуÑÑ‚",
["nb"]="august",
["nl"]="augustus",
["nn"]="august",
@@ -885,6 +962,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="aug",
+ ["mk"]="авг.",
["nb"]="aug.",
["nl"]="",
["nn"]="aug.",
@@ -924,6 +1002,7 @@ data.labels={
["kr"]={ "제", "장" },
["la"]="",
["lt"]="",
+ ["mk"]="Глава ",
["nb"]="",
["nl"]="",
["nn"]="",
@@ -959,6 +1038,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="",
+ ["mk"]=" (продолжение)",
["nb"]="",
["nl"]=" (vervolgd)",
["nn"]="",
@@ -981,6 +1061,7 @@ data.labels={
["en"]="day",
["et"]="päev",
["kr"]="ì¼",
+ ["mk"]="ден",
["nl"]="dag",
["pe"]="روز",
},
@@ -1010,6 +1091,7 @@ data.labels={
["la"]="December",
["lt"]="gruodžio",
["nb"]="desember",
+ ["mk"]="декември",
["nl"]="december",
["nn"]="desember",
["pe"]="دسامبر",
@@ -1050,6 +1132,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="dec",
+ ["mk"]="дек.",
["nb"]="des.",
["nl"]="",
["nn"]="des.",
@@ -1090,6 +1173,7 @@ data.labels={
["kr"]="2",
["la"]="Februarius",
["lt"]="vasario",
+ ["mk"]="февруари",
["nb"]="februar",
["nl"]="februari",
["nn"]="februar",
@@ -1131,6 +1215,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="feb",
+ ["mk"]="фев.",
["nb"]="feb.",
["nl"]="",
["nn"]="feb.",
@@ -1169,6 +1254,7 @@ data.labels={
["kr"]="그림 ",
["la"]="Imago ",
["lt"]={ "", " pav." },
+ ["mk"]="Слика ",
["nb"]="Figur ",
["nl"]="Figuur ",
["nn"]="Figur ",
@@ -1190,6 +1276,7 @@ data.labels={
["labels"]={
["en"]="on a following page",
["et"]="järgmisel leheküljel",
+ ["mk"]="на Ñледната Ñтраница",
["nl"]="op een volgende bladzijde",
["pe"]="در صÙحات آینده",
},
@@ -1216,6 +1303,7 @@ data.labels={
["kr"]="금요ì¼",
["la"]="Dies Veneris",
["lt"]="penktadienis",
+ ["mk"]="петок",
["nb"]="fredag",
["nl"]="vrijdag",
["nn"]="fredag",
@@ -1254,6 +1342,7 @@ data.labels={
["ja"]="イラスト",
["la"]="Typus ",
["lt"]="Graphic ",
+ ["mk"]="График ",
["nb"]="Bilde ",
["nl"]="Grafiek ",
["nn"]="Bilete ",
@@ -1291,6 +1380,7 @@ data.labels={
["kr"]="그러므로",
["la"]="",
["lt"]="kaip parodyta aukÅ¡Äiau",
+ ["mk"]="како што е прикажано погоре",
["nb"]="som vist over",
["nl"]="hierboven",
["nn"]="som vist over",
@@ -1328,6 +1418,7 @@ data.labels={
["kr"]="ì´í›„ë¡œ",
["la"]="",
["lt"]="kaip parodyta žemiau",
+ ["mk"]="како што е прикажано подолу",
["nb"]="som vist under",
["nl"]="hieronder",
["nn"]="som vist under",
@@ -1367,6 +1458,7 @@ data.labels={
["kr"]="간주곡",
["la"]="Intermissum ",
["lt"]="Intermezzo ",
+ ["mk"]="ДигреÑија ",
["nb"]="Intermesso ",
["nl"]="Intermezzo ",
["nn"]="Intermesso ",
@@ -1407,6 +1499,7 @@ data.labels={
["kr"]="1",
["la"]="Ianuarius",
["lt"]="sausio",
+ ["mk"]="јануари",
["nb"]="januar",
["nl"]="januari",
["nn"]="januar",
@@ -1448,6 +1541,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="jan",
+ ["mk"]="jан.",
["nb"]="jan.",
["nl"]="",
["nn"]="jan.",
@@ -1489,6 +1583,7 @@ data.labels={
["kr"]="7",
["la"]="Iulius",
["lt"]="liepos",
+ ["mk"]="јули",
["nb"]="juli",
["nl"]="juli",
["nn"]="juli",
@@ -1530,6 +1625,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="jul",
+ ["mk"]="јул.",
["nb"]="juli",
["nl"]="",
["nn"]="juli",
@@ -1570,6 +1666,7 @@ data.labels={
["kr"]="6",
["la"]="Iunius",
["lt"]="birželio",
+ ["mk"]="јуни",
["nb"]="juni",
["nl"]="juni",
["nn"]="juni",
@@ -1611,6 +1708,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="jun",
+ ["mk"]="јун.",
["nb"]="juni",
["nl"]="",
["nn"]="juni",
@@ -1649,6 +1747,7 @@ data.labels={
["kr"]="í–‰",
["la"]="versus ",
["lt"]="line ",
+ ["mk"]="линија ",
["nb"]="linje ",
["nl"]="regel ",
["nn"]="linje ",
@@ -1688,6 +1787,7 @@ data.labels={
["kr"]="í–‰",
["la"]="versus ",
["lt"]="lines ",
+ ["mk"]="линии ",
["nb"]="linjer ",
["nl"]="regels ",
["nn"]="linjer ",
@@ -1728,6 +1828,7 @@ data.labels={
["kr"]="3",
["la"]="Martius",
["lt"]="kovo",
+ ["mk"]="март",
["nb"]="mars",
["nl"]="maart",
["nn"]="mars",
@@ -1769,6 +1870,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="mar",
+ ["mk"]="мар.",
["nb"]="mars",
["nl"]="",
["nn"]="mars",
@@ -1810,6 +1912,7 @@ data.labels={
["kr"]="5",
["la"]="Maius",
["lt"]="gegužės",
+ ["mk"]="мај",
["nb"]="mai",
["nl"]="mei",
["nn"]="mai",
@@ -1851,6 +1954,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="may",
+ ["mk"]="мај",
["nb"]="mai",
["nl"]="",
["nn"]="mai",
@@ -1889,6 +1993,7 @@ data.labels={
["kr"]="월요ì¼",
["la"]="Dies Lunae",
["lt"]="pirmadienis",
+ ["mk"]="понеделник",
["nb"]="mandag",
["nl"]="maandag",
["nn"]="måndag",
@@ -1911,6 +2016,7 @@ data.labels={
["en"]="month",
["et"]="kuu",
["kr"]="ì›”",
+ ["mk"]="меÑец",
["nl"]="maand",
["pe"]="ماه",
},
@@ -1939,6 +2045,7 @@ data.labels={
["kr"]="11",
["la"]="November",
["lt"]="lapkriÄio",
+ ["mk"]="ноември",
["nb"]="november",
["nl"]="november",
["nn"]="november",
@@ -1980,6 +2087,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="nov",
+ ["mk"]="ноем.",
["nb"]="nov.",
["nl"]="",
["nn"]="nov.",
@@ -2019,6 +2127,7 @@ data.labels={
["kr"]="10",
["la"]="October",
["lt"]="spalio",
+ ["mk"]="октомври",
["nb"]="oktober",
["nl"]="oktober",
["nn"]="oktober",
@@ -2060,6 +2169,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="oct",
+ ["mk"]="окт.",
["nb"]="okt.",
["nl"]="",
["nn"]="okt.",
@@ -2096,6 +2206,7 @@ data.labels={
["kr"]="쪽",
["la"]="",
["lt"]="puslapis ",
+ ["mk"]="Ñтраница ",
["nb"]="side ",
["nl"]="pagina ",
["nn"]="side ",
@@ -2135,7 +2246,8 @@ data.labels={
["kr"]={ "제", "부" },
["la"]="Pars ",
["lt"]={ "", " dalis" },
- ["nb"]="Del",
+ ["mk"]="Дел ",
+ ["nb"]="Del ",
["nl"]="Deel ",
["nn"]="Del",
["pe"]="قسمت ",
@@ -2156,6 +2268,7 @@ data.labels={
["labels"]={
["en"]="on a preceding page",
["et"]="eelmisel lehel",
+ ["mk"]="на претходната Ñтраница",
["nl"]="op een voorgaande bladzijde",
["pe"]="در صÙحات گذشته",
},
@@ -2182,6 +2295,7 @@ data.labels={
["kr"]="토요ì¼",
["la"]="Dies Saturni",
["lt"]="šeštadienis",
+ ["mk"]="Ñабота",
["nb"]="lørdag",
["nl"]="zaterdag",
["nn"]="laurdag",
@@ -2223,6 +2337,7 @@ data.labels={
["la"]="",
["lt"]="",
["nb"]="",
+ ["mk"]="Поглавје ",
["nl"]="",
["nn"]="",
["pe"]="بخش ",
@@ -2259,6 +2374,7 @@ data.labels={
["kr"]="",
["la"]="",
["lt"]="žiūrėti ",
+ ["mk"]="види ",
["nb"]="se ",
["nl"]="zie ",
["nn"]="sjå ",
@@ -2300,6 +2416,7 @@ data.labels={
["kr"]="9",
["la"]="September",
["lt"]="rugsÄ—jo",
+ ["mk"]="Ñептември",
["nb"]="september",
["nl"]="september",
["nn"]="september",
@@ -2341,6 +2458,7 @@ data.labels={
["it"]="",
["la"]="",
["lt"]="sep",
+ ["mk"]="Ñепт.",
["nb"]="sep.",
["nl"]="",
["nn"]="sep.",
@@ -2379,6 +2497,7 @@ data.labels={
["ja"]="",
["la"]="",
["lt"]="",
+ ["mk"]="Подпоглавје ",
["nb"]="",
["nl"]="",
["nn"]="",
@@ -2418,6 +2537,7 @@ data.labels={
["ja"]="",
["la"]="",
["lt"]="",
+ ["mk"]="Подподпоглавје ",
["nb"]="",
["nl"]="",
["nn"]="",
@@ -2457,6 +2577,7 @@ data.labels={
["ja"]="",
["la"]="",
["lt"]="",
+ ["mk"]="Подподподпоглавје ",
["nb"]="",
["nl"]="",
["nn"]="",
@@ -2496,6 +2617,7 @@ data.labels={
["kr"]="ì¼ìš”ì¼",
["la"]="Dies Solis",
["lt"]="sekmadienis",
+ ["mk"]="недела",
["nb"]="søndag",
["nl"]="zondag",
["nn"]="sundag",
@@ -2535,6 +2657,7 @@ data.labels={
["kr"]="표 ",
["la"]="Tabula ",
["lt"]={ "", " lentelÄ—." },
+ ["mk"]="Табела ",
["nb"]="Tabell ",
["nl"]="Tabel ",
["nn"]="Tabell ",
@@ -2574,6 +2697,7 @@ data.labels={
["kr"]="목요ì¼",
["la"]="Dies Iovis",
["lt"]="ketvirtadienis",
+ ["mk"]="четврток",
["nb"]="torsdag",
["nl"]="donderdag",
["nn"]="torsdag",
@@ -2613,6 +2737,7 @@ data.labels={
["kr"]="화요ì¼",
["la"]="Dies Martis",
["lt"]="antradienis",
+ ["mk"]="вторник",
["nb"]="tirsdag",
["nl"]="dinsdag",
["nn"]="tysdag",
@@ -2652,6 +2777,7 @@ data.labels={
["kr"]="수요ì¼",
["la"]="Dies Mercuri",
["lt"]="treÄiadienis",
+ ["mk"]="Ñреда",
["nb"]="onsdag",
["nl"]="woensdag",
["nn"]="onsdag",
@@ -2674,6 +2800,7 @@ data.labels={
["en"]="year",
["et"]="aasta",
["kr"]="ë…„",
+ ["mk"]="година",
["nl"]="jaar",
["pe"]="سال",
},
@@ -2702,6 +2829,7 @@ data.labels={
["kr"]="약어",
["la"]="Notae",
["lt"]="Santrumpos",
+ ["mk"]="Скратеници",
["nb"]="Forkortelser",
["nl"]="Afkortingen",
["nn"]="Forkortingar",
@@ -2741,6 +2869,7 @@ data.labels={
["kr"]="목차",
["la"]="Quod in libro continetur",
["lt"]="Turinys",
+ ["mk"]="Содржина",
["nb"]="Innhold",
["nl"]="Inhoud",
["nn"]="Innhald",
@@ -2780,6 +2909,7 @@ data.labels={
["kr"]="그림 ",
["la"]="Imagines",
["lt"]="Iliustracijos",
+ ["mk"]="ЛиÑта на Ñлики",
["nb"]="Figurer",
["nl"]="Figuren",
["nn"]="Figurar",
@@ -2819,6 +2949,7 @@ data.labels={
["kr"]="그래픽 ",
["la"]="Typi",
["lt"]="Graphics",
+ ["mk"]="ЛиÑта на графици",
["nb"]="Bilde",
["nl"]="Grafieken",
["nn"]="Bilete",
@@ -2858,6 +2989,7 @@ data.labels={
["kr"]="찾아보기",
["la"]="Indices",
["lt"]="RodyklÄ—",
+ ["mk"]="ИндекÑ",
["nb"]="Register",
["nl"]="Index",
["nn"]="Register",
@@ -2897,6 +3029,7 @@ data.labels={
["kr"]="간주곡",
["la"]="Intermissa",
["lt"]="Intermezzos",
+ ["mk"]="ЛиÑта на дигреÑии",
["nb"]="Intermesso",
["nl"]="Intermezzo's",
["nn"]="Intermesso",
@@ -2935,6 +3068,7 @@ data.labels={
["kr"]="ì´ì„±",
["la"]="Typi negotiales",
["lt"]="Logos",
+ ["mk"]="Логоа",
["nb"]="Logoer",
["nl"]="Logo's",
["nn"]="Logoar",
@@ -2971,6 +3105,7 @@ data.labels={
["kr"]="참고문헌",
["la"]="",
["lt"]="Literatūra",
+ ["mk"]="Литература",
["nb"]="",
["nl"]="Literatuur",
["nn"]="",
@@ -3010,6 +3145,7 @@ data.labels={
["kr"]="표 ",
["la"]="Tabulae",
["lt"]="LentelÄ—s",
+ ["mk"]="ЛиÑта на табели",
["nb"]="Tabeller",
["nl"]="Tabellen",
["nn"]="Tabellar",
@@ -3049,6 +3185,7 @@ data.labels={
["kr"]="측정단위",
["la"]="Modi",
["lt"]="Units",
+ ["mk"]="Единици",
["nb"]="Enheter",
["nl"]="Eenheden",
["nn"]="Einingar",
diff --git a/Master/texmf-dist/tex/context/base/mkiv/libs-imp-curl.lua b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-curl.lua
new file mode 100644
index 00000000000..b307397948c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-curl.lua
@@ -0,0 +1,296 @@
+if not modules then modules = { } end modules ['libs-imp-curl'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkxl",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- c:/data/develop/tex-context/tex/texmf-win64/bin/lib/luametatex/lua/copies/curl/libcurl.dll
+
+local libname = "curl"
+local libfile = "libcurl"
+
+local curllib = resolvers.libraries.validoptional(libname)
+
+if not curllib then return end
+
+-- We're good, so we continue.
+
+local next, type = next, type
+local lower, gsub = string.lower, string.gsub
+
+local mapping = {
+ ["acceptencoding"] = 102,
+ ["accepttimeoutms"] = 212,
+ ["addressscope"] = 171,
+ ["append"] = 50,
+ ["autoreferer"] = 58,
+ ["buffersize"] = 98,
+ ["cainfo"] = 65,
+ ["capath"] = 97,
+ ["certinfo"] = 172,
+ -- ["chunkbgnfunction"] = 198,
+ ["chunkdata"] = 201,
+ -- ["chunkendfunction"] = 199,
+ ["closepolicy"] = 72,
+ ["closesocketdata"] = 209,
+ -- ["closesocketfunction"] = 208,
+ ["connectonly"] = 141,
+ ["connecttimeout"] = 78,
+ ["connecttimeoutms"] = 156,
+ -- ["convfromnetworkfunction"] = 142,
+ -- ["convfromutf8function"] = 144,
+ -- ["convtonetworkfunction"] = 143,
+ ["cookie"] = 22,
+ ["cookiefile"] = 31,
+ ["cookiejar"] = 82,
+ ["cookielist"] = 135,
+ ["cookiesessionv"] = 96,
+ ["copypostfields"] = 165,
+ ["crlf"] = 27,
+ ["crlfile"] = 169,
+ ["customrequest"] = 36,
+ ["debugdata"] = 95,
+ -- ["debugfunction"] = 94,
+ ["dirlistonly"] = 48,
+ ["dnscachetimeout"] = 92,
+ ["dnsinterface"] = 221,
+ ["dnslocalip4"] = 222,
+ ["dnslocalip6"] = 223,
+ ["dnsservers"] = 211,
+ ["dnsuseglobalcache"] = 91,
+ ["egdsocket"] = 77,
+ ["errorbuffer"] = 10,
+ ["expect100timeoutms"] = 227,
+ ["failonerror"] = 45,
+ ["file"] = 1,
+ ["filetime"] = 69,
+ ["fnmatchdata"] = 202,
+ -- ["fnmatchfunction"] = 200,
+ ["followlocation"] = 52,
+ ["forbidreuse"] = 75,
+ ["freshconnect"] = 74,
+ ["ftpaccount"] = 134,
+ ["ftpalternativetouser"] = 147,
+ ["ftpcreatemissingdirs"] = 110,
+ ["ftpfilemethod"] = 138,
+ ["ftpresponsetimeout"] = 112,
+ ["ftpskippasvip"] = 137,
+ ["ftpsslccc"] = 154,
+ ["ftpuseeprt"] = 106,
+ ["ftpuseepsv"] = 85,
+ ["ftpusepret"] = 188,
+ ["ftpport"] = 17,
+ ["ftpsslauth"] = 129,
+ ["gssapidelegation"] = 210,
+ ["header"] = 42,
+ ["headerdata"] = 29,
+ -- ["headerfunction"] = 79,
+ ["http200aliases"] = 104,
+ ["httpcontentdecoding"] = 158,
+ ["httptransferdecoding"] = 157,
+ ["httpversion"] = 84,
+ ["httpauth"] = 107,
+ ["httpget"] = 80,
+ ["httpheader"] = 23,
+ ["httppost"] = 24,
+ ["httpproxytunnel"] = 61,
+ ["ignorecontentlength"] = 136,
+ ["infile"] = 9,
+ ["infilesize"] = 14,
+ ["infilesizelarge"] = 115,
+ ["interface"] = 62,
+ ["interleavedata"] = 195,
+ -- ["interleavefunction"] = 196,
+ ["ioctldata"] = 131,
+ -- ["ioctlfunction"] = 130,
+ ["ipresolve"] = 113,
+ ["issuercert"] = 170,
+ ["keypasswd"] = 26,
+ ["krblevel"] = 63,
+ ["localport"] = 139,
+ ["localportrange"] = 140,
+ ["loginoptions"] = 224,
+ ["lowspeedlimit"] = 19,
+ ["lowspeedtime"] = 20,
+ ["mailauth"] = 217,
+ ["mailfrom"] = 186,
+ ["mailrcpt"] = 187,
+ ["maxrecvspeedlarge"] = 146,
+ ["maxsendspeedlarge"] = 145,
+ ["maxconnects"] = 71,
+ ["maxfilesize"] = 114,
+ ["maxfilesizelarge"] = 117,
+ ["maxredirs"] = 68,
+ ["netrc"] = 51,
+ ["netrcfile"] = 118,
+ ["newdirectoryperms"] = 160,
+ ["newfileperms"] = 159,
+ ["nobody"] = 44,
+ ["noprogress"] = 43,
+ ["noproxy"] = 177,
+ ["nosignal"] = 99,
+ ["opensocketdata"] = 164,
+ -- ["opensocketfunction"] = 163,
+ ["password"] = 174,
+ ["port"] = 3,
+ ["post"] = 47,
+ -- ["postfields"] = 15,
+ -- ["postfieldsize"] = 60,
+ -- ["postfieldsizelarge"] = 120,
+ ["postquote"] = 39,
+ ["postredir"] = 161,
+ ["prequote"] = 93,
+ ["private"] = 103,
+ ["progressdata"] = 57,
+ -- ["progressfunction"] = 56,
+ ["protocols"] = 181,
+ ["proxy"] = 4,
+ ["proxytransfermode"] = 166,
+ ["proxyauth"] = 111,
+ ["proxypassword"] = 176,
+ ["proxyport"] = 59,
+ ["proxytype"] = 101,
+ ["proxyusername"] = 175,
+ ["proxyuserpwd"] = 6,
+ ["put"] = 54,
+ ["quote"] = 28,
+ ["randomfile"] = 76,
+ ["range"] = 7,
+ ["readdata"] = 9,
+ -- ["readfunction"] = 12,
+ ["redirprotocols"] = 182,
+ ["referer"] = 16,
+ ["resolve"] = 203,
+ ["resumefrom"] = 21,
+ ["resumefromlarge"] = 116,
+ ["rtspclientcseq"] = 193,
+ ["rtsprequest"] = 189,
+ ["rtspservercseq"] = 194,
+ ["rtspsessionid"] = 190,
+ ["rtspstreamuri"] = 191,
+ ["rtsptransport"] = 192,
+ ["rtspheader"] = 23,
+ ["saslir"] = 218,
+ ["seekdata"] = 168,
+ -- ["seekfunction"] = 167,
+ ["serverresponsetimeout"] = 112,
+ ["share"] = 100,
+ ["sockoptdata"] = 149,
+ -- ["sockoptfunction"] = 148,
+ ["socks5gssapinec"] = 180,
+ ["socks5gssapiservice"] = 179,
+ ["sshauthtypes"] = 151,
+ ["sshhostpublickeymd5"] = 162,
+ ["sshkeydata"] = 185,
+ -- ["sshkeyfunction"] = 184,
+ ["sshknownhosts"] = 183,
+ ["sshprivatekeyfile"] = 153,
+ ["sshpublickeyfile"] = 152,
+ ["sslcipherlist"] = 83,
+ ["sslctxdata"] = 109,
+ -- ["sslctxfunction"] = 108,
+ ["sslenablealpn"] = 226,
+ ["sslenablenpn"] = 225,
+ ["ssloptions"] = 216,
+ ["sslsessionidcache"] = 150,
+ ["sslverifyhost"] = 81,
+ ["sslverifypeer"] = 64,
+ ["sslcert"] = 25,
+ ["sslcerttype"] = 86,
+ ["sslengine"] = 89,
+ ["sslenginedefault"] = 90,
+ ["sslkey"] = 87,
+ ["sslkeytype"] = 88,
+ ["sslversion"] = 32,
+ ["stderr"] = 37,
+ ["tcpkeepalive"] = 213,
+ ["tcpkeepidle"] = 214,
+ ["tcpkeepintvl"] = 215,
+ ["tcpnodelay"] = 121,
+ ["telnetoptions"] = 70,
+ ["tftpblksize"] = 178,
+ ["timecondition"] = 33,
+ ["timeout"] = 13,
+ ["timeoutms"] = 155,
+ ["timevalue"] = 34,
+ ["tlsauthpassword"] = 205,
+ ["tlsauthtype"] = 206,
+ ["tlsauthusername"] = 204,
+ ["transferencoding"] = 207,
+ ["transfertext"] = 53,
+ ["unrestrictedauth"] = 105,
+ ["upload"] = 46,
+ ["url"] = 2,
+ ["usessl"] = 119,
+ ["useragent"] = 18,
+ ["username"] = 173,
+ ["userpwd"] = 5,
+ ["verbose"] = 41,
+ ["wildcardmatch"] = 197,
+ ["writedata"] = 1,
+ -- ["writefunction"] = 11,
+ ["writeheader"] = 29,
+ ["writeinfo"] = 40,
+ ["xferinfodata"] = 57,
+ -- ["xferinfofunction"] = 219,
+ ["xoauth2bearer"] = 220,
+}
+
+table.setmetatableindex(mapping,function(t,k)
+ local s = gsub(lower(k),"[^a-z0-9]","")
+ local v = rawget(t,s) or false
+ t[k] = v
+ return v
+end)
+
+local curl_fetch = curllib.fetch
+local curl_escape = curllib.escape
+local curl_unescape = curllib.unescape
+local curl_getversion = curllib.getversion
+
+local report = logs.reporter(libname)
+
+local function okay()
+ if resolvers.libraries.optionalloaded(libname,libfile) then
+ okay = function() return true end
+ else
+ okay = function() return false end
+ end
+ return okay()
+end
+
+local function fetch(options)
+ if okay() then
+ local t = type(options)
+ if t == "table" then
+ local o = { }
+ for name, value in next, options do
+ local index = mapping[name]
+ if index then
+ o[index] = value
+ end
+ end
+ return curl_fetch(o)
+ elseif t == "string" then
+ return curl_fetch { [mapping.url] = options }
+ else
+ report("invalid argument")
+ end
+ end
+end
+
+local curl = {
+ getversion = function () return okay() and curl_getversion() end,
+ escape = function (s) return okay() and curl_escape (s) end,
+ unescape = function (s) return okay() and curl_unescape (s) end,
+ fetch = fetch,
+}
+
+-- inspect(curl.fetch("http://www.pragma-ade.com/index.html"))
+-- inspect(curl.fetch { url = "http://www.pragma-ade.com/index.html" })
+
+package.loaded[libname] = curl
+
+return curl
diff --git a/Master/texmf-dist/tex/context/base/mkiv/libs-imp-ghostscript.lua b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-ghostscript.lua
new file mode 100644
index 00000000000..b129a58c143
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-ghostscript.lua
@@ -0,0 +1,111 @@
+if not modules then modules = { } end modules ['libs-imp-ghostscript'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkxl",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+local libname = "ghostscript"
+local libfile = "gsdll64" -- what on unix?
+
+local gslib = resolvers.libraries.validoptional(libname)
+
+if not gslib then return end
+
+local function okay()
+ if resolvers.libraries.optionalloaded(libname,libfile) then
+ okay = function() return true end
+ else
+ okay = function() return false end
+ end
+ return okay()
+end
+
+local insert = table.insert
+local formatters = string.formatters
+
+local ghostscript = utilities.ghostscript or { }
+utilities.ghostscript = ghostscript
+
+local gs_execute = gslib.execute
+local nofruns = 0
+local report = logs.reporter(libname)
+
+function ghostscript.convert(specification)
+ if okay() then
+ --
+ nofruns = nofruns + 1
+ statistics.starttiming(ghostscript)
+ --
+ local inputname = specification.inputname
+ if not inputname or inputname == "" then
+ report("invalid run %s, no inputname specified",nofruns)
+ statistics.stoptiming(ghostscript)
+ return false
+ end
+ local outputname = specification.outputname
+ if not outputname or outputname == "" then
+ outputname = file.replacesuffix(inputname,"pdf")
+ end
+ --
+ if not lfs.isfile(inputname) then
+ report("invalid run %s, input file %a is not found",nofruns,inputname)
+ statistics.stoptiming(ghostscript)
+ return false
+ end
+ --
+ local device = specification.device
+ if not device or device == "" then
+ device = "pdfwrite"
+ end
+ --
+ local code = specification.code
+ if not code or code == "" then
+ code = ".setpdfwrite"
+ end
+ --
+ local options = specification.options or { }
+ --
+ insert(options,"-dNOPAUSE")
+ insert(options,"-dBATCH")
+ insert(options,"-dSAFER")
+ insert(options,formatters["-sDEVICE=%s"](device))
+ insert(options,formatters["-sOutputFile=%s"](outputname))
+ insert(options,"-c")
+ insert(options,code)
+ insert(options,"-f")
+ insert(options,inputname)
+ --
+ report("run %s, input file %a, outputfile %a",nofruns,inputname,outputname)
+ report("")
+ local done = gslib_execute(options)
+ report("")
+ --
+ statistics.stoptiming(ghostscript)
+ if done then
+ return outputname
+ else
+ report("run %s quit with errors",nofruns)
+ return false
+ end
+ end
+end
+
+function ghostscript.statistics(report)
+ local runtime = statistics.elapsedtime(ghostscript)
+ if report then
+ report("nofruns %s, runtime %s",nofruns,runtime)
+ else
+ return {
+ runtime = runtime,
+ nofruns = nofruns,
+ }
+ end
+end
+
+-- for i=1,100 do
+-- ghostscript.convert { inputname = "temp.eps" }
+-- ghostscript.convert { inputname = "t:/escrito/tiger.eps" }
+-- end
+-- ghostscript.statistics(true)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/libs-imp-graphicsmagick.lua b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-graphicsmagick.lua
new file mode 100644
index 00000000000..6f5d1d967fd
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-graphicsmagick.lua
@@ -0,0 +1,77 @@
+if not modules then modules = { } end modules ['libs-imp-graphicsmagick'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkxl",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+local libname = "graphicsmagick"
+local libfile = { "CORE_RL_magick_", "CORE_RL_wand_" }
+
+local gmlib = resolvers.libraries.validoptional(libname)
+
+if not gmlib then return end
+
+local function okay()
+ if resolvers.libraries.optionalloaded(libname,libfile) then
+ okay = function() return true end
+ else
+ okay = function() return false end
+ end
+ return okay()
+end
+
+local graphicsmagick = utilities.graphicsmagick or { }
+utilities.graphicsmagick = graphicsmagick
+utilities.graphicmagick = graphicsmagick
+
+local gm_execute = gmlib.execute
+local nofruns = 0
+local report = logs.reporter(libname)
+
+function graphicsmagick.convert(specification)
+ if okay() then
+ --
+ nofruns = nofruns + 1
+ statistics.starttiming(graphicsmagick)
+ --
+ local inputname = specification.inputname
+ if not inputname or inputname == "" then
+ report("invalid run %s, no inputname specified",nofruns)
+ statistics.stoptiming(graphicsmagick)
+ return false
+ end
+ local outputname = specification.outputname
+ if not outputname or outputname == "" then
+ outputname = file.replacesuffix(inputname,"pdf")
+ end
+ --
+ if not lfs.isfile(inputname) then
+ report("invalid run %s, input file %a is not found",nofruns,inputname)
+ statistics.stoptiming(graphicsmagick)
+ return false
+ end
+ --
+ report("run %s, input file %a, outputfile %a",nofruns,inputname,outputname)
+ --
+ gm_execute { inputfile = inputname, outputfile = outputname }
+ --
+ statistics.stoptiming(graphicsmagick)
+ end
+end
+
+function graphicsmagick.statistics(report)
+ local runtime = statistics.elapsedtime(graphicsmagick)
+ if report then
+ report("nofruns %s, runtime %s",nofruns,runtime)
+ else
+ return {
+ runtime = runtime,
+ nofruns = nofruns,
+ }
+ end
+end
+
+-- graphicsmagick.convert { inputname = "t:/sources/hacker.jpg", outputname = "e:/tmp/hacker.png" }
+-- graphicsmagick.statistics(true)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/libs-imp-mujs.lua b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-mujs.lua
new file mode 100644
index 00000000000..264c8e53126
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-mujs.lua
@@ -0,0 +1,126 @@
+if not modules then modules = { } end modules ['libs-imp-mujs'] = {
+ version = 1.001,
+ comment = "companion to luat-imp-mujs.mkxl",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This is an experiment. When a new user knows \JAVASCRIPT\ it can be a
+-- stepping stone to using \LUA.
+
+-- local ecmascript = optional.mujs.initialize("libmujs")
+-- local execute = optional.mujs.execute
+
+local libname = "mujs"
+local libfile = "libmujs"
+
+if package.loaded[libname] then
+ return package.loaded[libname]
+end
+
+local mujslib = resolvers.libraries.validoptional(libname)
+
+if not mujslib then
+ return
+end
+
+local files = { }
+local openfile = io.open
+local findfile = resolvers.findfile
+
+local mujs_execute = mujslib.execute
+local mujs_dofile = mujslib.dofile
+local mujs_reset = mujslib.reset
+
+local function okay()
+ if resolvers.libraries.optionalloaded(libname,libfile) then
+ mujs_execute(
+ "var catcodes = { " ..
+ "'tex': " .. tex.texcatcodes .. "," ..
+ "'ctx': " .. tex.ctxcatcodes .. "," ..
+ "'prt': " .. tex.prtcatcodes .. "," ..
+ "'vrb': " .. tex.vrbcatcodes .. "," ..
+ "};"
+ )
+ okay = function() return true end
+ else
+ okay = function() return false end
+ end
+ return okay()
+end
+
+mujslib.setfindfile(findfile)
+
+mujslib.setopenfile(function(name)
+ local full = findfile(name)
+ if full then
+ local f = openfile(full,"rb")
+ if f then
+ for i=1,100 do
+ if not files[i] then
+ files[i] = f
+ return i
+ end
+ end
+ end
+ end
+end)
+
+mujslib.setclosefile(function(id)
+ local f = files[id]
+ if f then
+ f:close()
+ files[id] = false
+ end
+end)
+
+mujslib.setreadfile(function(id,how)
+ local f = files[id]
+ if f then
+ return (f:read(how or "*l"))
+ end
+end)
+
+mujslib.setseekfile(function(id,whence,offset)
+ local f = files[id]
+ if f then
+ return (f:seek(whence,offset))
+ end
+end)
+
+local reporters = {
+ console = logs.reporter("mujs","console"),
+ report = logs.reporter("mujs","report"),
+}
+
+mujslib.setconsole(function(category,name)
+ reporters[category](name)
+end)
+
+local mujs = {
+ ["execute"] = function(c,s) if okay() then mujs_execute(c,s) end end,
+ ["dofile"] = function(n) if okay() then mujs_dofile(n) end end,
+ ["reset"] = function(n) if okay() then mujs_reset(n) end end,
+}
+
+package.loaded[libname] = mujs
+
+optional.loaded.mujs = mujs
+
+interfaces.implement {
+ name = "ecmacode",
+ actions = mujs.execute,
+ arguments = "string",
+ public = true,
+}
+
+interfaces.implement {
+ name = "ecmafile",
+ actions = mujs.dofile,
+ arguments = "string",
+ public = true,
+ protected = true,
+}
+
+return mujs
diff --git a/Master/texmf-dist/tex/context/base/mkiv/libs-imp-mujs.mkxl b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-mujs.mkxl
new file mode 100644
index 00000000000..0f278dff5b2
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-mujs.mkxl
@@ -0,0 +1,121 @@
+%D \module
+%D [ file=libs-imp-mujs,
+%D version=2020.02.08,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=MuJS interpreter,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Just an experiment:
+%D
+%D \starttyping
+%D http://mujs.com
+%D \stoptyping
+
+\ifdefined\ecmacode
+ \expandafter \endinput
+\fi
+
+\registerctxluafile{libs-imp-mujs}{}
+
+\unprotect
+
+% todo: environment
+
+\let\stopecmacode\relax
+
+\normalprotected\def\startecmacode % \stopecmacode
+ {\begingroup
+ \obeylualines
+ \obeyluatokens
+ \luat_start_ecma_code_indeed}
+
+\def\luat_start_ecma_code_indeed#1\stopecmacode
+ {\normalexpanded{\endgroup\noexpand\ecmacode{#1}}}
+
+\protect
+
+\continueifinputfile{libs-imp-mujs.mkxl}
+
+\usemodule[article-basic,abbreviations-logos]
+
+\starttext
+
+\startbuffer
+\startluacode
+ local mujs = require("libs-imp-mujs")
+
+ mujs.execute [[
+ var MyMax = 1000;
+ ]]
+
+ mujs.execute [[
+ console("Example One!");
+ texsprint("\\startpacked");
+ for (var i = 1; i <= MyMax; i = i + 1) {
+ texprint(
+ "This is a buildbot compilation challenge for Mojca: "
+ .concat(Math.sqrt(i/MyMax))
+ .concat("!\\par")
+ );
+ }
+ texsprint("\\stoppacked");
+ ]]
+
+ -- mujs.execute [[
+ -- something very bad: an error
+ -- ]]
+\stopluacode
+
+\startecmacode
+ console("Example Two!");
+ for (var i = 1; i <= MyMax; i = i + 1) {
+ texsprint(
+ "And an opportunity for Alan to attract highschool students to \\TeX: "
+ .concat(i)
+ .concat("! ")
+ );
+ }
+\stopecmacode
+
+\ecmacode {
+ console("Example Three!");
+ texprint("And otherwise a way to prototype \\JAVASCRIPT\\ code in \\PDF.")
+}
+
+\startecmacode
+ var f = File("libs-imp-mujs.mkxl","r");
+ console(f);
+ // var l = f.read(400);
+ var l = f.read("*a");
+ console(l);
+ f.close();
+\stopecmacode
+
+\startecmacode
+ console("Example Four!");
+ texsprint("\\startMPcode "
+ .concat(' fill fullcircle scaled 6cm withcolor "darkred";')
+ .concat(' fill fullcircle scaled 4cm withcolor "darkgreen";')
+ .concat(' fill fullcircle scaled 2cm withcolor "darkblue";')
+ .concat("\\stopMPcode ")
+ );
+\stopecmacode
+
+\startluacode
+ context.startMPcode()
+ context('fill fullcircle scaled 6cm withcolor "middlecyan";')
+ context('fill fullcircle scaled 4cm withcolor "middlemagenta";')
+ context('fill fullcircle scaled 2cm withcolor "middleyellow";')
+ context.stopMPcode()
+\stopluacode
+\stopbuffer
+
+\typebuffer \page \getbuffer
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/mkiv/libs-imp-mysql.lua b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-mysql.lua
new file mode 100644
index 00000000000..3e938a6de48
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-mysql.lua
@@ -0,0 +1,220 @@
+if not modules then modules = { } end modules ['libs-imp-mysql'] = {
+ version = 1.001,
+ comment = "companion to util-sql.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- c:/data/develop/tex-context/tex/texmf-win64/bin/lib/luametatex/lua/copies/mysql/libmysql.dll
+
+local libname = "mysql"
+local libfile = "libmysql"
+
+local mysqllib = resolvers.libraries.validoptional(libname)
+
+if not mysqllib then return end
+
+local function okay()
+ if resolvers.libraries.optionalloaded(libname,libfile) then
+ okay = function() return true end
+ else
+ okay = function() return false end
+ end
+ return okay()
+end
+
+local lpegmatch = lpeg.match
+local setmetatable = setmetatable
+
+local sql = utilities.sql or require("util-sql")
+local report = logs.reporter(libname)
+
+local trace_sql = false trackers.register("sql.trace", function(v) trace_sql = v end)
+local trace_queries = false trackers.register("sql.queries",function(v) trace_queries = v end)
+
+local mysql_open = mysqllib.open
+local mysql_close = mysqllib.close
+local mysql_execute = mysqllib.execute
+local mysql_getmessage = mysqllib.getmessage
+
+local helpers = sql.helpers
+local methods = sql.methods
+local validspecification = helpers.validspecification
+local preparetemplate = helpers.preparetemplate
+local querysplitter = helpers.querysplitter
+local cache = { }
+local timeout -- = 3600 -- to be tested
+
+local function connect(specification)
+ local db = mysql_open(
+ specification.database or "",
+ specification.username or "",
+ specification.password or "",
+ specification.host or "",
+ specification.port
+ )
+ if db and timeout then
+ mysql_execute(db,formatters["SET SESSION connect_timeout=%s ;"](timeout))
+ end
+ return db
+end
+
+local function execute_once(specification,retry)
+ if okay() then
+ if trace_sql then
+ report("executing mysql")
+ end
+ if not validspecification(specification) then
+ report("error in specification")
+ end
+ local query = preparetemplate(specification)
+ if not query then
+ report("error in preparation")
+ return
+ else
+ query = lpegmatch(querysplitter,query)
+ end
+ local base = specification.database -- or specification.presets and specification.presets.database
+ if not base then
+ report("no database specified")
+ return
+ end
+ local result = { }
+ local keys = { }
+ local id = specification.id
+ local db = nil
+ if id then
+ local session = cache[id]
+ if session then
+ db = session.db
+ else
+ db = connect(specification)
+ if not db then
+ report("no session database specified")
+ else
+ cache[id] = {
+ specification = specification,
+ db = db,
+ }
+ end
+ end
+ else
+ db = connect(specification)
+ end
+ if not db then
+ report("no database opened")
+ else
+ local converter = specification.converter
+ local nofrows = 0
+ local callback = nil
+ if converter then
+ local convert = converter.mysql
+ callback = function(nofcolumns,values,fields)
+ nofrows = nofrows + 1
+ result[nofrows] = convert(values)
+ end
+ else
+ callback = function(nofcolumns,values,fields)
+ local column = { }
+ for i=1,nofcolumns do
+ local field
+ if fields then
+ field = fields[i]
+ keys[i] = field
+ else
+ field = keys[i]
+ end
+ if field then
+ column[field] = values[i]
+ end
+ end
+ nofrows = nofrows + 1
+ result[nofrows] = column
+ end
+ end
+ for i=1,#query do
+ local okay = mysql_execute(db,query[i],callback)
+ if not okay then
+ if id and retry and i == 1 then
+ report("error: %s, retrying to connect",mysql_getmessage(db))
+ mysql_close(db)
+ cache[id] = nil
+ return execute_once(specification,false)
+ else
+ report("error: %s",mysql_getmessage(db))
+ end
+ end
+ end
+ end
+ if db and not id then
+ mysql_close(db)
+ end
+ -- bonus
+ local one = result[1]
+ if one then
+ setmetatable(result,{ __index = one } )
+ end
+ --
+ return result, keys
+ else
+ report("error: ","no library loaded")
+ end
+end
+
+local function execute(specification)
+ return execute_once(specification,true)
+end
+
+-- Here we build the dataset stepwise so we don't use the data hack that
+-- is used in the client variant.
+
+local wraptemplate = [[
+local converters = utilities.sql.converters
+local deserialize = utilities.sql.deserialize
+
+local tostring = tostring
+local tonumber = tonumber
+local booleanstring = string.booleanstring
+
+%s
+
+return function(cells)
+ -- %s (not needed)
+ -- %s (not needed)
+ return {
+ %s
+ }
+end
+]]
+
+-- return function(result)
+-- if not result then
+-- return { }
+-- end
+-- local nofrows = #result
+-- if nofrows == 0 then
+-- return { }
+-- end
+-- local target = { } -- no %s needed here
+-- for i=1,nofrows do
+-- target[%s] = {
+-- %s
+-- }
+-- end
+-- return result
+-- end
+
+local celltemplate = "cells[%s]"
+
+methods.mysql = {
+ execute = execute,
+ usesfiles = false,
+ wraptemplate = wraptemplate,
+ celltemplate = celltemplate,
+}
+
+package.loaded["util-sql-imp-ffi"] = methods.mysql
+package.loaded["util-sql-imp-mysql"] = methods.mysql
+package.loaded["util-sql-imp-library"] = methods.mysql
+package.loaded[libname] = methods.mysql
diff --git a/Master/texmf-dist/tex/context/base/mkiv/libs-imp-postgress.lua b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-postgress.lua
new file mode 100644
index 00000000000..629079b01a5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-postgress.lua
@@ -0,0 +1,200 @@
+if not modules then modules = { } end modules ['libs-imp-postgress'] = {
+ version = 1.001,
+ comment = "companion to util-sql.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Not yet untested !
+
+-- c:/data/develop/tex-context/tex/texmf-win64/bin/lib/luametatex/lua/copies/postgress/libpq.dll
+
+-- we can now share the code between mysql, postgress, sqlite ... todo
+
+local libname = "postgress"
+local libfile = "libpq"
+
+local postgresslib = resolvers.libraries.validoptional(libname)
+
+if not postgresslib then return end
+
+local function okay()
+ if resolvers.libraries.optionalloaded(libname,libfile) then
+ okay = function() return true end
+ else
+ okay = function() return false end
+ end
+ return okay()
+end
+
+local lpegmatch = lpeg.match
+local setmetatable = setmetatable
+
+local sql = utilities.sql or require("util-sql")
+local report = logs.reporter(libname)
+
+local trace_sql = false trackers.register("sql.trace", function(v) trace_sql = v end)
+local trace_queries = false trackers.register("sql.queries",function(v) trace_queries = v end)
+
+local postgress_open = postgresslib.open
+local postgress_close = postgresslib.close
+local postgress_execute = postgresslib.execute
+local postgress_getmessage = postgresslib.getmessage
+
+local helpers = sql.helpers
+local methods = sql.methods
+local validspecification = helpers.validspecification
+local preparetemplate = helpers.preparetemplate
+local querysplitter = helpers.querysplitter -- not needed
+local cache = { }
+
+local function connect(specification)
+ return postgress_open(
+ specification.database or "",
+ specification.username or "",
+ specification.password or "",
+ specification.host or "",
+ specification.port
+ )
+end
+
+local function execute_once(specification,retry)
+ if okay() then
+ if trace_sql then
+ report("executing postgress")
+ end
+ if not validspecification(specification) then
+ report("error in specification")
+ end
+ local query = preparetemplate(specification)
+ if not query then
+ report("error in preparation")
+ return
+ else
+ query = lpegmatch(querysplitter,query) -- not needed
+ end
+ local base = specification.database -- or specification.presets and specification.presets.database
+ if not base then
+ report("no database specified")
+ return
+ end
+ local result = { }
+ local keys = { }
+ local id = specification.id
+ local db = nil
+ if id then
+ local session = cache[id]
+ if session then
+ db = session.db
+ else
+ db = connect(specification)
+ if not db then
+ report("no session database specified")
+ else
+ cache[id] = {
+ specification = specification,
+ db = db,
+ }
+ end
+ end
+ else
+ db = connect(specification)
+ end
+ if not db then
+ report("no database opened")
+ else
+ local converter = specification.converter
+ local nofrows = 0
+ local callback = nil
+ if converter then
+ local convert = converter.postgress
+ callback = function(nofcolumns,values,fields)
+ nofrows = nofrows + 1
+ result[nofrows] = convert(values)
+ end
+ else
+ callback = function(nofcolumns,values,fields)
+ local column = { }
+ for i=1,nofcolumns do
+ local field
+ if fields then
+ field = fields[i]
+ keys[i] = field
+ else
+ field = keys[i]
+ end
+ if field then
+ column[field] = values[i]
+ end
+ end
+ nofrows = nofrows + 1
+ result[nofrows] = column
+ end
+ end
+ for i=1,#query do
+ local okay = postgress_execute(db,query[i],callback)
+ if not okay then
+ if id and retry and i == 1 then
+ report("error: %s, retrying to connect",postgress_getmessage(db))
+ postgress_close(db)
+ cache[id] = nil
+ return execute_once(specification,false)
+ else
+ report("error: %s",postgress_getmessage(db))
+ end
+ end
+ end
+ end
+ if db and not id then
+ postgress_close(db)
+ end
+ -- bonus
+ local one = result[1]
+ if one then
+ setmetatable(result,{ __index = one } )
+ end
+ --
+ return result, keys
+ else
+ report("error: ","no library loaded")
+ end
+end
+
+local function execute(specification)
+ return execute_once(specification,true)
+end
+
+-- Here we build the dataset stepwise so we don't use the data hack that
+-- is used in the client variant.
+
+local wraptemplate = [[
+local converters = utilities.sql.converters
+local deserialize = utilities.sql.deserialize
+
+local tostring = tostring
+local tonumber = tonumber
+local booleanstring = string.booleanstring
+
+%s
+
+return function(cells)
+ -- %s (not needed)
+ -- %s (not needed)
+ return {
+ %s
+ }
+end
+]]
+
+local celltemplate = "cells[%s]"
+
+methods.postgress = {
+ execute = execute,
+ usesfiles = false,
+ wraptemplate = wraptemplate,
+ celltemplate = celltemplate,
+}
+
+package.loaded["util-sql-imp-postgress"] = methods.postgress
+package.loaded[libname] = methods.postgress
diff --git a/Master/texmf-dist/tex/context/base/mkiv/libs-imp-sqlite.lua b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-sqlite.lua
new file mode 100644
index 00000000000..5d38986f347
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-sqlite.lua
@@ -0,0 +1,187 @@
+if not modules then modules = { } end modules ['libs-imp-sqlite'] = {
+ version = 1.001,
+ comment = "companion to util-sql.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- c:/data/develop/tex-context/tex/texmf-win64/bin/lib/luametatex/lua/copies/sqlite/sqlite3.dll
+
+local libname = "sqlite"
+local libfile = "sqlite3"
+
+local sqlitelib = resolvers.libraries.validoptional(libname)
+
+if not sqlitelib then return end
+
+local function okay()
+ if resolvers.libraries.optionalloaded(libname,libfile) then
+ okay = function() return true end
+ else
+ okay = function() return false end
+ end
+ return okay()
+end
+
+local next, tonumber = next, tonumber
+local setmetatable = setmetatable
+local formatters = string.formatters
+
+local sql = utilities.sql or require("util-sql")
+local report = logs.reporter(libname)
+
+local trace_sql = false trackers.register("sql.trace", function(v) trace_sql = v end)
+local trace_queries = false trackers.register("sql.queries",function(v) trace_queries = v end)
+
+local sqlite_open = sqlitelib.open
+local sqlite_close = sqlitelib.close
+local sqlite_execute = sqlitelib.execute
+local sqlite_getmessage = sqlitelib.getmessage
+
+local helpers = sql.helpers
+local methods = sql.methods
+local validspecification = helpers.validspecification
+local preparetemplate = helpers.preparetemplate
+local cache = { }
+
+-- synchronous journal_mode locking_mode 1000 logger inserts
+--
+-- normal normal normal 6.8
+-- off off normal 0.1
+-- normal off normal 2.1
+-- normal persist normal 5.8
+-- normal truncate normal 4.2
+-- normal truncate exclusive 4.1
+
+local f_preamble = formatters[ [[
+ATTACH `%s` AS `%s` ;
+PRAGMA `%s`.synchronous = normal ;
+]] ]
+
+local function execute(specification)
+ if okay() then
+ if trace_sql then
+ report("executing sqlite")
+ end
+ if not validspecification(specification) then
+ report("error in specification")
+ end
+ local query = preparetemplate(specification)
+ if not query then
+ report("error in preparation")
+ return
+ end
+ local base = specification.database -- or specification.presets and specification.presets.database
+ if not base then
+ report("no database specified")
+ return
+ end
+ local filename = file.addsuffix(base,"db")
+ local result = { }
+ local keys = { }
+ local id = specification.id
+ local db = nil
+ local preamble = nil
+ if id then
+ local session = cache[id]
+ if session then
+ db = session.db
+ else
+ db = sqlite_open(filename)
+ preamble = f_preamble(filename,base,base)
+ if not db then
+ report("no session database specified")
+ else
+ cache[id] = {
+ name = filename,
+ db = db,
+ }
+ end
+ end
+ else
+ db = open_db(filename)
+ preamble = f_preamble(filename,base,base)
+ end
+ if not db then
+ report("no database opened")
+ else
+ local converter = specification.converter
+ local nofrows = 0
+ local callback = nil
+ if preamble then
+ query = preamble .. query -- only needed in open
+ end
+ if converter then
+ local convert = converter.sqlite
+ callback = function(nofcolumns,values,fields)
+ nofrows = nofrows + 1
+ result[nofrows] = convert(values)
+ end
+ else
+ callback = function(nofcolumns,values,fields)
+ local column = { }
+ for i=1,nofcolumns do
+ local field
+ if fields then
+ field = fields[i]
+ keys[i] = field
+ else
+ field = keys[i]
+ end
+ if field then
+ column[field] = values[i]
+ end
+ end
+ nofrows = nofrows + 1
+ result[nofrows] = column
+ end
+ end
+ local okay = sqlite_execute(db,query,callback)
+ if not okay then
+ report("error: %s",sqlite_getmessage(db))
+ -- elseif converter then
+ -- result = converter.sqlite(result)
+ end
+ end
+ if db and not id then
+ sqlite_close(db)
+ end
+ return result, keys
+ else
+ report("error: ","no library loaded")
+ end
+end
+
+local wraptemplate = [[
+local converters = utilities.sql.converters
+local deserialize = utilities.sql.deserialize
+
+local tostring = tostring
+local tonumber = tonumber
+local booleanstring = string.booleanstring
+
+%s
+
+return function(cells)
+ -- %s (not needed)
+ -- %s (not needed)
+ return {
+ %s
+ }
+end
+]]
+
+local celltemplate = "cells[%s]"
+
+methods.sqlite = {
+ execute = execute,
+ usesfiles = false,
+ wraptemplate = wraptemplate,
+ celltemplate = celltemplate,
+}
+
+package.loaded["util-sql-imp-sqlite"] = methods.sqlite
+package.loaded[libname] = methods.sqlite
+
+return methods.sqlite
diff --git a/Master/texmf-dist/tex/context/base/mkiv/libs-imp-zint.lua b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-zint.lua
new file mode 100644
index 00000000000..2c346ae7d5f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-zint.lua
@@ -0,0 +1,161 @@
+if not modules then modules = { } end modules ['libs-imp-ghostscript'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkxl",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+local libname = "zint"
+local libfile = "libzint" -- what on unix?
+-- local libfile = "/usr/local/lib/libzint.so"
+
+local zintlib = resolvers.libraries.validoptional(libname)
+
+if not zintlib then return end
+
+local function okay()
+ if resolvers.libraries.optionalloaded(libname,libfile) then
+ okay = function() return true end
+ else
+ okay = function() return false end
+ end
+ return okay()
+end
+
+local zint = utilities.zint or { }
+utilities.zint = zint
+
+local zintlib_execute = zintlib.execute
+
+local next, type, unpack = next, type, unpack
+local lower, gsub = string.lower, string.gsub
+
+local mapping = {
+ ["code 11"] = 1, ["pharma one-track"] = 51, ["aztec code"] = 92,
+ ["standard 2of5"] = 2, ["pzn"] = 52, ["daft code"] = 93,
+ ["interleaved 2of5"] = 3, ["pharma two-track"] = 53, ["micro qr code"] = 97,
+ ["iata 2of5"] = 4, ["pdf417"] = 55, ["hibc code 128"] = 98,
+ ["data logic"] = 6, ["pdf417 trunc"] = 56, ["hibc code 39"] = 99,
+ ["industrial 2of5"] = 7, ["maxicode"] = 57, ["hibc data matrix"] = 102,
+ ["code 39"] = 8, ["qr code"] = 58, ["hibc qr code"] = 104,
+ ["extended code 39"] = 9, ["code 128-b"] = 60, ["hibc pdf417"] = 106,
+ ["ean"] = 13, ["ap standard customer"] = 63, ["hibc micropdf417"] = 108,
+ ["ean + check"] = 14, ["ap reply paid"] = 66, ["hibc codablock-f"] = 110,
+ ["gs1-128"] = 16, ["ap routing"] = 67, ["hibc aztec code"] = 112,
+ ["codabar"] = 18, ["ap redirection"] = 68, ["dotcode"] = 115,
+ ["code 128"] = 20, ["isbn"] = 69, ["han xin code"] = 116,
+ ["leitcode"] = 21, ["rm4scc"] = 70, ["rm mailmark"] = 121,
+ ["identcode"] = 22, ["data matrix"] = 71, ["aztec runes"] = 128,
+ ["code 16k"] = 23, ["ean-14"] = 72, ["code 32"] = 129,
+ ["code 49"] = 24, ["vin (north america)"] = 73, ["comp ean"] = 130,
+ ["code 93"] = 25, ["codablock-f"] = 74, ["comp gs1-128"] = 131,
+ ["flattermarken"] = 28, ["nve-18"] = 75, ["comp databar omni"] = 132,
+ ["gs1 databar omni"] = 29, ["japanese post"] = 76, ["comp databar ltd"] = 133,
+ ["gs1 databar ltd"] = 30, ["korea post"] = 77, ["comp databar expom"] = 134,
+ ["gs1 databar expom"] = 31, ["gs1 databar stack"] = 79, ["comp upc-a"] = 135,
+ ["telepen alpha"] = 32, ["gs1 databar stack omni"] = 80, ["comp upc-e"] = 136,
+ ["upc-a"] = 34, ["gs1 databar eso"] = 81, ["comp databar stack"] = 137,
+ ["upc-a + check"] = 35, ["planet"] = 82, ["comp databar stack omni"] = 138,
+ ["upc-e"] = 37, ["micropdf"] = 84, ["comp databar eso"] = 139,
+ ["upc-e + check"] = 38, ["usps onecode"] = 85, ["channel code"] = 140,
+ ["postnet"] = 40, ["uk plessey"] = 86, ["code one"] = 141,
+ ["msi plessey"] = 47, ["telepen numeric"] = 87, ["grid matrix"] = 142,
+ ["fim"] = 49, ["itf-14"] = 89, ["upnqr"] = 143,
+ ["logmars"] = 50, ["kix code"] = 90, ["rmqr"] = 145,
+}
+
+table.setmetatableindex(mapping,function(t,k)
+ local s = gsub(lower(k),"[^a-z0-9]","")
+ local v = rawget(t,s) or false
+ t[k] = v
+ return v
+end)
+
+local report = logs.reporter("zint")
+local context = context
+local shown = false
+
+----- f_rectangle = string.formatters["%sofill unitsquare xysized (%N,%N) shifted (%N,%N);"]
+
+local function execute(specification)
+ if okay() then
+ local code = specification.code
+ local text = specification.text
+ if code then
+ local id = mapping[code]
+ if id then
+ specification.code = id
+ local result = zintlib_execute(specification)
+ if result then
+ -- not that fast but if needed we can speed it up
+ context.startMPcode()
+ local rectangles = result.rectangles
+ local hexagons = result.hexagons
+ local circles = result.circles
+ local strings = result.strings
+ if rectangles then
+ local n = #rectangles
+ for i=1,n do
+ local r = rectangles[i]
+ context("%sofill unitsquare xysized (%N,%N) shifted (%N,%N);",
+ i == n and "d" or "n",r[3],r[4],r[1],r[2])
+ -- rectangles[i] = f_rectangle(i == n and "d" or "n",r[3],r[4],r[1],r[2])
+ end
+ -- context("% t",rectangles)
+ end
+ if hexagons then
+ local n = #hexagons
+ for i=1,#hexagons do
+ context("%sofill (%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--cycle;",
+ i == n and "d" or "n",unpack(hexagons[i]))
+ end
+ end
+ if circles then
+ local n = #circles
+ for i=1,#circles do
+ local c = circles[i]
+ context("%sofill unitcircle scaled %N shifted (%N,%N);",
+ i == n and "d" or "n",c[3],c[1],c[2])
+ end
+ end
+ if strings then
+ -- We set the font at the encapsulating level.
+ for i=1,#strings do
+ local s = strings[i]
+ context('draw textext("%s") scaled (%N/10) shifted (%N,%N);',
+ s[4],s[3],s[1],s[2])
+ end
+ end
+ context.stopMPcode()
+ end
+ else
+ report("unknown barcode alternative %a",code)
+ if not shown then
+ report("")
+ report("valid barcode alternatives:")
+ report("")
+ local list = table.sortedkeys(mapping)
+ for i=1,#list do
+ report(" %s", list[i])
+ end
+ report("")
+ shown = true
+ end
+ end
+ end
+ end
+end
+
+optional.loaded.zint = { execute = execute }
+
+interfaces.implement {
+ name = "zint",
+ actions = execute,
+ arguments = {
+ {
+ { "code" },
+ { "text" },
+ }
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/libs-imp-zint.mkxl b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-zint.mkxl
new file mode 100644
index 00000000000..72ce8157efe
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/libs-imp-zint.mkxl
@@ -0,0 +1,64 @@
+%D \module
+%D [ file=m-zint,
+%D version=2010.12.07,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Zint Barcode Generator,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Using \type {zint} seems to be the easiest way to generate
+%D (PDF417) barcodes so therefore we now have this module. There
+%D are proper (also windows) binaries at:
+%D
+%D \starttyping
+%D http://www.zint.org.uk
+%D \stoptyping
+%D
+%D There is a bit more code than needed as we want to be able to
+%D feed names.
+
+\registerctxluafile{libs-imp-zint}{}
+
+\unprotect
+
+\definefont[usedzintfont][dejavusansmono at 10bp]
+
+\unexpanded\def\barcode[#1]% [alternative=,text=]
+ {\bgroup
+ \usedzintfont
+ \getdummyparameters
+ [\c!alternative=,\c!text=,#1]%
+ \scale
+ [#1]%
+ {\clf_zint
+ code {\dummyparameter\c!alternative}
+ text {\dummyparameter\c!text}
+ \relax}
+ \egroup}
+
+\protect
+
+\continueifinputfile{libs-imp-zint.mkxl}
+
+\starttext
+
+% \dorecurse{1000}{
+ \startTEXpage
+ \barcode[alternative=PDF417,text={Hans Hagen}]%
+ \blank
+ \barcode[alternative=PDF417,text={Ton Otten}]%
+ \blank
+ \barcode[alternative=ISBN,text=9789490688011]%
+ \blank
+ \barcode[alternative=isbn,text=9789490688011,width=3cm]%
+ \stopTEXpage
+% }
+
+\stoptext
+
+
diff --git a/Master/texmf-dist/tex/context/base/mkiv/libs-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/libs-ini.lua
new file mode 100644
index 00000000000..2bac3201d28
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/libs-ini.lua
@@ -0,0 +1,196 @@
+if not modules then modules = { } end modules ['libs-ini'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This is a loader for optional libraries in luametatex with context lmtx. It's
+-- kind of experimental. We also use a different locator than in mkiv because we
+-- don't support loading lua libraries and swiglibs any more. Of course one can
+-- try the regular lua loaders but we just assume that a user then knows what (s)he
+-- is doing.
+
+local type, unpack = type, unpack
+
+-- here we implement the resolver
+
+local type = type
+
+local nameonly = file.nameonly
+local joinfile = file.join
+local addsuffix = file.addsuffix
+local qualifiedpath = file.is_qualified_path
+
+local isfile = lfs.isfile
+
+local findfile = resolvers.findfile
+local expandpaths = resolvers.expandedpathlistfromvariable
+
+local report = logs.reporter("resolvers","libraries")
+local trace = false
+
+trackers.register("resolvers.lib", function(v) trace = v end)
+
+local function findlib(required) -- todo: cache
+ local suffix = os.libsuffix or "so"
+ if not qualifiedpath(required) then
+ local list = directives.value("system.librarynames" )
+ local only = nameonly(required)
+ if type(list) == "table" then
+ list = list[only]
+ if type(list) ~= "table" then
+ list = { only }
+ end
+ else
+ list = { only }
+ end
+ if trace then
+ report("using lookup list for library %a: % | t",only,list)
+ end
+ for i=1,#list do
+ local name = list[i]
+ local found = findfile(name,"lib")
+ if not found then
+ found = findfile(addsuffix(name,suffix),"lib")
+ end
+ if found then
+ if trace then
+ report("library %a resolved via %a path to %a",name,"tds lib",found)
+ end
+ return found
+ end
+ end
+ if expandpaths then
+ local list = expandpaths("PATH")
+ local base = addsuffix(only,suffix)
+ for i=1,#list do
+ local full = joinfile(list[i],base)
+ local found = isfile(full) and full
+ if found then
+ if trace then
+ report("library %a resolved via %a path to %a",name,"system",found)
+ end
+ return found
+ end
+ end
+ end
+ elseif isfile(addsuffix(required,suffix)) then
+ if trace then
+ report("library with qualified name %a %sfound",required,"")
+ end
+ return required
+ else
+ if trace then
+ report("library with qualified name %a %sfound",required,"not ")
+ end
+ end
+ return false
+end
+
+local foundlibraries = table.setmetatableindex(function(t,k)
+ local v = findlib(k)
+ t[k] = v
+ return v
+end)
+
+function resolvers.findlib(required)
+ return foundlibraries[required]
+end
+
+-- here we implement the loader
+
+local libraries = { }
+resolvers.libraries = libraries
+
+local report = logs.reporter("optional")
+
+if optional then optional.loaded = { } end
+
+function libraries.validoptional(name)
+ local thelib = optional and optional[name]
+ if not thelib then
+ -- forget about it, no message here
+ elseif thelib.initialize then
+ return thelib
+ else
+ report("invalid optional library %a",libname)
+ end
+end
+
+function libraries.optionalloaded(name,libnames)
+ local thelib = optional and optional[name]
+ if not thelib then
+ report("no optional %a library found",name)
+ else
+ local thelib_initialize = thelib.initialize
+ if not thelib_initialize then
+ report("invalid optional library %a",name)
+ else
+ if type(libnames) == "string" then
+ libnames = { libnames }
+ end
+ if type(libnames) == "table" then
+ for i=1,#libnames do
+ local libname = libnames[i]
+ local filename = foundlibraries[libname]
+ if filename then
+ libnames[i] = filename
+ else
+ report("unable to locate library %a",libname)
+ return
+ end
+ end
+ local initialized = thelib_initialize(unpack(libnames))
+ if initialized then
+ report("using library '% + t'",libnames)
+ else
+ report("unable to initialize library '% + t'",libnames)
+ end
+ return initialized
+ end
+ end
+ end
+end
+
+if FFISUPPORTED and ffi and ffi.load then
+
+ local ffiload = ffi.load
+
+ function ffi.load(name)
+ local full = name and foundlibraries[name]
+ if full then
+ return ffiload(full)
+ else
+ return ffiload(name)
+ end
+ end
+
+end
+
+-- local patterns = {
+-- "libs-imp-%s.mkxl",
+-- "libs-imp-%s.mklx",
+-- }
+--
+-- local function action(name,foundname)
+-- -- could be one command
+-- context.startreadingfile()
+-- context.input(foundname)
+-- context.stopreadingfile()
+-- end
+--
+-- interfaces.implement {
+-- name = "uselibrary",
+-- arguments = "string"
+-- actions = function(name)
+-- resolvers.uselibrary {
+-- category = "color definition",
+-- name = name,
+-- patterns = patterns,
+-- action = action,
+-- onlyonce = true,
+-- }
+-- end
+-- }
diff --git a/Master/texmf-dist/tex/context/base/mkiv/libs-ini.mkxl b/Master/texmf-dist/tex/context/base/mkiv/libs-ini.mkxl
new file mode 100644
index 00000000000..18163beed12
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/libs-ini.mkxl
@@ -0,0 +1,31 @@
+%D \module
+%D [ file=libs-ini,
+%D version=2020.01.02,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=Libraries,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{libs-ini}{}
+
+\registerctxluafile{libs-imp-curl}{}
+\registerctxluafile{libs-imp-ghostscript}{}
+\registerctxluafile{libs-imp-graphicsmagick}{}
+
+% These are loaded on demand:
+
+% \registerctxluafile{libs-imp-mysql}{}
+% \registerctxluafile{libs-imp-sqlite}{}
+% \registerctxluafile{libs-imp-postgress}{}
+
+\unprotect
+
+% \unexpanded\def\uselibrary[#1]%
+% {\clf_uselibrary{#1}}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-ano.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-ano.lua
index 49bf973c9f8..c04ada15156 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-ano.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-ano.lua
@@ -18,7 +18,7 @@ local rep, format, find = string.rep, string.format, string.find
local min = math.min
local lpegmatch = lpeg.match
local formatters = string.formatters
-local sortedkeys = table.sortedkeys
+local sortedkeys, concat = table.sortedkeys, table.concat
local backends, lpdf = backends, lpdf
@@ -93,7 +93,7 @@ local pdfrectangle = lpdf.rectangle
-- todo: 3dview
-local pdf_annot = pdfconstant("Annot")
+----- pdf_annot = pdfconstant("Annot")
local pdf_uri = pdfconstant("URI")
local pdf_gotor = pdfconstant("GoToR")
local pdf_goto = pdfconstant("GoTo")
@@ -133,6 +133,99 @@ local function checkautoprefixes(destinations)
end
end
+local maxslice = 32 -- could be made configureable ... 64 is also ok
+
+local function pdfmakenametree(list,apply)
+ if not next(list) then
+ return
+ end
+ local slices = { }
+ local sorted = sortedkeys(list)
+ local size = #sorted
+ local maxslice = maxslice
+ if size <= 1.5*maxslice then
+ maxslice = size
+ end
+ for i=1,size,maxslice do
+ local amount = min(i+maxslice-1,size)
+ local names = pdfarray { }
+ local n = 0
+ for j=i,amount do
+ local name = sorted[j]
+ local target = list[name]
+ n = n + 1 ; names[n] = tostring(name)
+ n = n + 1 ; names[n] = apply and apply(target) or target
+ end
+ local first = sorted[i]
+ local last = sorted[amount]
+ local limits = pdfarray {
+ first,
+ last,
+ }
+ local d = pdfdictionary {
+ Names = names,
+ Limits = limits,
+ }
+ slices[#slices+1] = {
+ reference = pdfreference(pdfflushobject(d)),
+ limits = limits,
+ }
+ end
+ local function collectkids(slices,first,last)
+ local f = slices[first]
+ local l = slices[last]
+ if f and l then
+ local k = pdfarray()
+ local n = 0
+ local d = pdfdictionary {
+ Kids = k,
+ Limits = pdfarray {
+ f.limits[1],
+ l.limits[2],
+ },
+ }
+ for i=first,last do
+ n = n + 1 ; k[n] = slices[i].reference
+ end
+ return d
+ end
+ end
+ if #slices == 1 then
+ return slices[1].reference
+ else
+ while true do
+ local size = #slices
+ if size > maxslice then
+ local temp = { }
+ local n = 0
+ for i=1,size,maxslice do
+ local kids = collectkids(slices,i,min(i+maxslice-1,size))
+ if kids then
+ n = n + 1
+ temp[n] = {
+ reference = pdfreference(pdfflushobject(kids)),
+ limits = kids.Limits,
+ }
+ else
+ -- error
+ end
+ end
+ slices = temp
+ else
+ local kids = collectkids(slices,1,size)
+ if kids then
+ return pdfreference(pdfflushobject(kids))
+ else
+ -- error
+ return
+ end
+ end
+ end
+ end
+end
+
+lpdf.makenametree = pdfmakenametree
+
-- Bah, I hate this kind of features .. anyway, as we have delayed resolving we
-- only support a document-wide setup and it has to be set before the first one
-- is used. Also, we default to a non-intrusive gray and the outline is kept
@@ -237,8 +330,6 @@ end
lpdf.registerdestination = pdfregisterdestination
-local maxslice = 32 -- could be made configureable ... 64 is also ok
-
logs.registerfinalactions(function()
if log_destinations and next(destinations) then
local report = logs.startfilelogging("references","used destinations")
@@ -252,98 +343,10 @@ logs.registerfinalactions(function()
end
end)
-local function pdfnametree(destinations)
- local slices = { }
- checkautoprefixes(destinations)
- if not next(destinations) then
- return
- end
- local sorted = sortedkeys(destinations)
- local size = #sorted
-
- if size <= 1.5*maxslice then
- maxslice = size
- end
-
- for i=1,size,maxslice do
- local amount = min(i+maxslice-1,size)
- local names = pdfarray { }
- local n = 0
- for j=i,amount do
- local destination = sorted[j]
- local pagenumber = destinations[destination]
- n = n + 1 ; names[n] = tostring(destination) -- tostring is a safeguard
- n = n + 1 ; names[n] = pdfreference(pagenumber)
- end
- local first = sorted[i]
- local last = sorted[amount]
- local limits = pdfarray {
- first,
- last,
- }
- local d = pdfdictionary {
- Names = names,
- Limits = limits,
- }
- slices[#slices+1] = {
- reference = pdfreference(pdfflushobject(d)),
- limits = limits,
- }
- end
- local function collectkids(slices,first,last)
- local f = slices[first]
- local l = slices[last]
- if f and l then
- local k = pdfarray()
- local n = 0
- local d = pdfdictionary {
- Kids = k,
- Limits = pdfarray {
- f.limits[1],
- l.limits[2],
- },
- }
- for i=first,last do
- n = n + 1 ; k[n] = slices[i].reference
- end
- return d
- end
- end
- if #slices == 1 then
- return slices[1].reference
- else
- while true do
- if #slices > maxslice then
- local temp = { }
- local size = #slices
- for i=1,size,maxslice do
- local kids = collectkids(slices,i,min(i+maxslice-1,size))
- if kids then
- temp[#temp+1] = {
- reference = pdfreference(pdfflushobject(kids)),
- limits = kids.Limits,
- }
- else
- -- error
- end
- end
- slices = temp
- else
- local kids = collectkids(slices,1,#slices)
- if kids then
- return pdfreference(pdfflushobject(kids))
- else
- -- error
- return
- end
- end
- end
- end
-end
-
local function pdfdestinationspecification()
if next(destinations) then -- safeguard
- local r = pdfnametree(destinations)
+ checkautoprefixes(destinations)
+ local r = pdfmakenametree(destinations,pdfreference)
if r then
pdfaddtonames("Dests",r)
end
@@ -353,7 +356,6 @@ local function pdfdestinationspecification()
end
end
-lpdf.nametree = pdfnametree
lpdf.destinationspecification = pdfdestinationspecification
lpdf.registerdocumentfinalizer(pdfdestinationspecification,"collect destinations")
@@ -362,25 +364,14 @@ lpdf.registerdocumentfinalizer(pdfdestinationspecification,"collect destinations
local destinations = { }
-local f_xyz = formatters["<< /D [ %i 0 R /XYZ %.6F %.6F null ] >>"]
+local f_xyz = formatters["<< /D [ %i 0 R /XYZ %.6N %.6N null ] >>"]
local f_fit = formatters["<< /D [ %i 0 R /Fit ] >>"]
local f_fitb = formatters["<< /D [ %i 0 R /FitB ] >>"]
-local f_fith = formatters["<< /D [ %i 0 R /FitH %.6F ] >>"]
-local f_fitv = formatters["<< /D [ %i 0 R /FitV %.6F ] >>"]
-local f_fitbh = formatters["<< /D [ %i 0 R /FitBH %.6F ] >>"]
-local f_fitbv = formatters["<< /D [ %i 0 R /FitBV %.6F ] >>"]
-local f_fitr = formatters["<< /D [ %i 0 R /FitR %.6F %.6F %.6F %.6F ] >>"]
-
-directives.register("pdf.stripzeros",function()
- f_xyz = formatters["<< /D [ %i 0 R /XYZ %.6N %.6N null ] >>"]
- f_fit = formatters["<< /D [ %i 0 R /Fit ] >>"]
- f_fitb = formatters["<< /D [ %i 0 R /FitB ] >>"]
- f_fith = formatters["<< /D [ %i 0 R /FitH %.6N ] >>"]
- f_fitv = formatters["<< /D [ %i 0 R /FitV %.6N ] >>"]
- f_fitbh = formatters["<< /D [ %i 0 R /FitBH %.6N ] >>"]
- f_fitbv = formatters["<< /D [ %i 0 R /FitBV %.6N ] >>"]
- f_fitr = formatters["<< /D [ %i 0 R /FitR %.6N %.6N %.6N %.6N ] >>"]
-end)
+local f_fith = formatters["<< /D [ %i 0 R /FitH %.6N ] >>"]
+local f_fitv = formatters["<< /D [ %i 0 R /FitV %.6N ] >>"]
+local f_fitbh = formatters["<< /D [ %i 0 R /FitBH %.6N ] >>"]
+local f_fitbv = formatters["<< /D [ %i 0 R /FitBV %.6N ] >>"]
+local f_fitr = formatters["<< /D [ %i 0 R /FitR %.6N %.6N %.6N %.6N ] >>"]
local v_standard = variables.standard
local v_frame = variables.frame
@@ -634,9 +625,9 @@ local function pdffilelink(filename,destination,page,actions)
destination = pdfarray { (page or 1) - 1, pdf_fit }
end
return pdfdictionary {
- S = pdf_gotor, -- can also be pdf_launch
- F = filename,
- D = destination or defaultdestination,
+ S = pdf_gotor, -- can also be pdf_launch
+ F = filename,
+ D = destination or defaultdestination,
NewWindow = actions.newwindow and true or nil,
}
end
@@ -758,11 +749,8 @@ local nofused = 0
local nofspecial = 0
local share = true
-local f_annot = formatters["<< /Type /Annot %s /Rect [ %0.6F %0.6F %0.6F %0.6F ] >>"]
-
-directives.register("pdf.stripzeros",function()
- f_annot = formatters["<< /Type /Annot %s /Rect [ %0.6N %0.6N %0.6N %0.6N ] >>"]
-end)
+local f_annot = formatters["<< /Type /Annot %s /Rect [ %.6N %.6N %.6N %.6N ] >>"]
+local f_quadp = formatters["<< /Type /Annot %s /QuadPoints [ %s ] /Rect [ %.6N %.6N %.6N %.6N ] >>"]
directives.register("references.sharelinks", function(v)
share = v
@@ -777,10 +765,41 @@ setmetatableindex(hashed,function(t,k)
return v
end)
-local function finishreference(specification) -- %0.2f looks okay enough (no scaling anyway)
- local annot = hashed[f_annot(specification.prerolled,pdfrectangle(specification.width,specification.height,specification.depth))]
+local function toquadpoints(paths)
+ local t, n = { }, 0
+ for i=1,#paths do
+ local path = paths[i]
+ local size = #path
+ for j=1,size do
+ local p = path[j]
+ n = n + 1 ; t[n] = p[1]
+ n = n + 1 ; t[n] = p[2]
+ end
+ local m = size % 4
+ if m > 0 then
+ local p = path[size]
+ for j=size+1,m do
+ n = n + 1 ; t[n] = p[1]
+ n = n + 1 ; t[n] = p[2]
+ end
+ end
+ end
+ return concat(t," ")
+end
+
+local function finishreference(specification)
+ local prerolled = specification.prerolled
+ local quadpoints = specification.mesh
+ local llx, lly,
+ urx, ury = pdfrectangle(specification.width,specification.height,specification.depth)
+ local specifier = nil
+ if quadpoints and #quadpoints > 0 then
+ specifier = f_quadp(prerolled,toquadpoints(quadpoints),llx,lly,urx,ury)
+ else
+ specifier = f_annot(prerolled,llx,lly,urx,ury)
+ end
nofused = nofused + 1
- return pdfregisterannotation(annot)
+ return pdfregisterannotation(hashed[specifier])
end
local function finishannotation(specification)
@@ -799,7 +818,7 @@ local function finishannotation(specification)
return pdfregisterannotation(objref)
end
-function nodeinjections.reference(width,height,depth,prerolled)
+function nodeinjections.reference(width,height,depth,prerolled,mesh)
if prerolled then
if trace_references then
report_references("link: width %p, height %p, depth %p, prerolled %a",width,height,depth,prerolled)
@@ -810,6 +829,7 @@ function nodeinjections.reference(width,height,depth,prerolled)
height = height,
depth = depth,
prerolled = prerolled,
+ mesh = mesh,
}
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-col.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-col.lua
index 9ba64abba75..c586300e55b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-col.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-col.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['lpdf-col'] = {
license = "see context related readme files"
}
+-- slants also page ?
+
local type, next, tostring, tonumber = type, next, tostring, tonumber
local char, byte, format, gsub, rep, gmatch = string.char, string.byte, string.format, string.gsub, string.rep, string.gmatch
local settings_to_array, settings_to_numbers = utilities.parsers.settings_to_array, utilities.parsers.settings_to_numbers
@@ -58,25 +60,18 @@ local setmetatableindex = table.setmetatableindex
local c_transparency = pdfconstant("Transparency")
-local f_gray = formatters["%.3F g %.3F G"]
-local f_rgb = formatters["%.3F %.3F %.3F rg %.3F %.3F %.3F RG"]
-local f_cmyk = formatters["%.3F %.3F %.3F %.3F k %.3F %.3F %.3F %.3F K"]
+local f_gray = formatters["%.3N g %.3N G"]
+local f_rgb = formatters["%.3N %.3N %.3N rg %.3N %.3N %.3N RG"]
+local f_cmyk = formatters["%.3N %.3N %.3N %.3N k %.3N %.3N %.3N %.3N K"]
local f_spot = formatters["/%s cs /%s CS %s SCN %s scn"]
local f_tr = formatters["Tr%s"]
-local f_cm = formatters["q %.6F %.6F %.6F %.6F %.6F %.6F cm"]
-local f_effect = formatters["%s Tc %s w %s Tr"] -- %.3F ?
+local f_cm = formatters["q %.6N %.6N %.6N %.6N %.6N %.6N cm"]
+local f_effect = formatters["%s Tc %s w %s Tr"] -- %.6N ?
local f_tr_gs = formatters["/Tr%s gs"]
-local f_num_1 = tostring
-local f_num_2 = formatters["%s %s"]
-local f_num_3 = formatters["%s %s %s"]
-local f_num_4 = formatters["%s %s %s %s"]
-
-directives.register("pdf.stripzeros",function()
- f_gray = formatters["%.3N g %.3N G"]
- f_rgb = formatters["%.3N %.3N %.3N rg %.3N %.3N %.3N RG"]
- f_cmyk = formatters["%.3N %.3N %.3N %.3N k %.3N %.3N %.3N %.3N K"]
- f_cm = formatters["q %.6N %.6N %.6N %.6N %.6N %.6N cm"]
-end)
+local f_num_1 = formatters["%.3N %.3N"]
+local f_num_2 = formatters["%.3N %.3N"]
+local f_num_3 = formatters["%.3N %.3N %.3N"]
+local f_num_4 = formatters["%.3N %.3N %.3N %.3N"]
local report_color = logs.reporter("colors","backend")
@@ -733,43 +728,39 @@ do
local pdfcolor = lpdf.color
local pdftransparency = lpdf.transparency
- local f_slant = formatters["q 1 0 %.6F 1 0 0 cm"]
-
- directives.register("pdf.stripzeros",function()
- f_slant = formatters["q 1 0 %.6N 1 0 0 cm"]
- end)
+ local f_slant = formatters["q 1 0 %N 1 0 0 cm"]
-- local fillcolors = {
- -- red = { "pdf", "origin", "1 0 0 rg" },
- -- green = { "pdf", "origin", "0 1 0 rg" },
- -- blue = { "pdf", "origin", "0 0 1 rg" },
- -- gray = { "pdf", "origin", ".5 g" },
- -- black = { "pdf", "origin", "0 g" },
- -- palered = { "pdf", "origin", "1 .75 .75 rg" },
- -- palegreen = { "pdf", "origin", ".75 1 .75 rg" },
- -- paleblue = { "pdf", "origin", ".75 .75 1 rg" },
- -- palegray = { "pdf", "origin", ".75 g" },
+ -- red = { "pdf", "page", "1 0 0 rg" },
+ -- green = { "pdf", "page", "0 1 0 rg" },
+ -- blue = { "pdf", "page", "0 0 1 rg" },
+ -- gray = { "pdf", "page", ".5 g" },
+ -- black = { "pdf", "page", "0 g" },
+ -- palered = { "pdf", "page", "1 .75 .75 rg" },
+ -- palegreen = { "pdf", "page", ".75 1 .75 rg" },
+ -- paleblue = { "pdf", "page", ".75 .75 1 rg" },
+ -- palegray = { "pdf", "page", ".75 g" },
-- }
--
-- local strokecolors = {
- -- red = { "pdf", "origin", "1 0 0 RG" },
- -- green = { "pdf", "origin", "0 1 0 RG" },
- -- blue = { "pdf", "origin", "0 0 1 RG" },
- -- gray = { "pdf", "origin", ".5 G" },
- -- black = { "pdf", "origin", "0 G" },
- -- palered = { "pdf", "origin", "1 .75 .75 RG" },
- -- palegreen = { "pdf", "origin", ".75 1 .75 RG" },
- -- paleblue = { "pdf", "origin", ".75 .75 1 RG" },
- -- palegray = { "pdf", "origin", ".75 G" },
+ -- red = { "pdf", "page", "1 0 0 RG" },
+ -- green = { "pdf", "page", "0 1 0 RG" },
+ -- blue = { "pdf", "page", "0 0 1 RG" },
+ -- gray = { "pdf", "page", ".5 G" },
+ -- black = { "pdf", "page", "0 G" },
+ -- palered = { "pdf", "page", "1 .75 .75 RG" },
+ -- palegreen = { "pdf", "page", ".75 1 .75 RG" },
+ -- paleblue = { "pdf", "page", ".75 .75 1 RG" },
+ -- palegray = { "pdf", "page", ".75 G" },
-- }
--
-- backends.pdf.tables.vfspecials = allocate { -- todo: distinguish between glyph and rule color
--
- -- red = { "pdf", "origin", "1 0 0 rg 1 0 0 RG" },
- -- green = { "pdf", "origin", "0 1 0 rg 0 1 0 RG" },
- -- blue = { "pdf", "origin", "0 0 1 rg 0 0 1 RG" },
- -- gray = { "pdf", "origin", ".75 g .75 G" },
- -- black = { "pdf", "origin", "0 g 0 G" },
+ -- red = { "pdf", "page", "1 0 0 rg 1 0 0 RG" },
+ -- green = { "pdf", "page", "0 1 0 rg 0 1 0 RG" },
+ -- blue = { "pdf", "page", "0 0 1 rg 0 0 1 RG" },
+ -- gray = { "pdf", "page", ".75 g .75 G" },
+ -- black = { "pdf", "page", "0 g 0 G" },
--
-- -- rulecolors = fillcolors,
-- -- fillcolors = fillcolors,
@@ -792,7 +783,7 @@ do
local c_cache = setmetatableindex(function(t,m)
local v = setmetatableindex(function(t,c)
- local p = { "pdf", "origin", "q " .. pdfcolor(m,c) }
+ local p = { "pdf", "page", "q " .. pdfcolor(m,c) }
t[c] = p
return p
end)
@@ -806,7 +797,7 @@ do
local p = pdftransparency(transparency)
local v = setmetatableindex(function(t,colormodel)
local v = setmetatableindex(function(t,color)
- local v = { "pdf", "origin", "q " .. pdfcolor(colormodel,color) .. " " .. p }
+ local v = { "pdf", "page", "q " .. pdfcolor(colormodel,color) .. " " .. p }
t[color] = v
return v
end)
@@ -830,8 +821,8 @@ do
backends.pdf.tables.vfspecials = allocate { -- todo: distinguish between glyph and rule color
startcolor = startcolor,
- -- stopcolor = { "pdf", "origin", "0 g 0 G Q" },
- stopcolor = { "pdf", "origin", "Q" },
+ -- stopcolor = { "pdf", "page", "0 g 0 G Q" },
+ stopcolor = { "pdf", "page", "Q" },
startslant = startslant,
stopslant = { "pdf", "origin", "Q" },
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-emb.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-emb.lua
new file mode 100644
index 00000000000..4ffcfd8a846
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-emb.lua
@@ -0,0 +1,2224 @@
+if not modules then modules = { } end modules ['lpdf-ini'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- vkgoeswild: Pink Floyd - Shine on You Crazy Diamond - piano cover (around that
+-- time I redid the code, a reminder so to say)
+
+-- At some point I wanted to have access to the shapes so that we could use them in
+-- metapost. So, after looking at the cff and ttf specifications, I decided to write
+-- parsers. At somepoint we needed a cff parser anyway in order to calculate the
+-- dimensions. Then variable fonts came around and a option was added to recreate
+-- streams of operators and a logical next step was to do all inclusion that way. It
+-- was only then that I found out that some of the juggling also happens in the the
+-- backend, but spread over places, so I could have saved myself some time
+-- deciphering the specifications. Anyway, here we go.
+--
+-- Color fonts are a bit messy. Catching issues with older fonts will break new ones
+-- so I don't think that it's wise to build in too many catches (like for fonts with
+-- zero boundingboxes, weird dimensions, transformations that in a next version are
+-- fixed, etc.). Better is then to wait till something gets fixed. If a spec doesn't
+-- tell me how to deal with it ... I'll happily wait till it does. After all we're
+-- not in a hurry as these fonts are mostly meant for the web or special purposes
+-- with manual tweaking in desk top publishing applications. Keep in mind that Emoji
+-- can have funny dimensions (e.g. to be consistent within a font, so no tight ones).
+
+-- When we have moved to lmtx I will document a bit more. Till then it's experimental
+-- and subjected to change.
+
+local next, type, unpack, rawget = next, type, unpack, rawget
+local char, byte, gsub, sub, match, rep, gmatch = string.char, string.byte, string.gsub, string.sub, string.match, string.rep, string.gmatch
+local formatters = string.formatters
+local format = string.format
+local concat, sortedhash, sort = table.concat, table.sortedhash, table.sort
+local utfchar = utf.char
+local random, round, max, abs, ceiling = math.random, math.round, math.max, math.abs, math.ceiling
+local extract, lshift, rshift, band, bor = bit32.extract, bit32.lshift, bit32.rshift, bit32.band, bit32.bor
+local idiv = number.idiv
+local setmetatableindex = table.setmetatableindex
+
+local pdfnull = lpdf.null
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfconstant = lpdf.constant
+local pdfstring = lpdf.string
+local pdfreference = lpdf.reference
+local pdfreserveobject = lpdf.reserveobject
+local pdfflushobject = lpdf.flushobject
+local pdfflushstreamobject = lpdf.flushstreamobject
+
+local report_fonts = logs.reporter("backend","fonts")
+
+local trace_fonts = false
+local trace_details = false
+
+local dimenfactors = number.dimenfactors
+local bpfactor = dimenfactors.bp
+local ptfactor = dimenfactors.pt
+
+trackers.register("backend.pdf.fonts",function(v) trace_fonts = v end)
+
+local readers = fonts.handlers.otf.readers
+local getinfo = readers.getinfo
+
+local setposition = utilities.files.setposition
+local readstring = utilities.files.readstring
+local openfile = utilities.files.open
+local closefile = utilities.files.close
+
+
+-- needs checking: signed vs unsigned
+
+local tocardinal1 = char
+
+local function tocardinal2(n)
+ return char(extract(n,8,8),extract(n,0,8))
+end
+
+local function tocardinal3(n)
+ return char(extract(n,16,8),extract(n,8,8),extract(n,0,8))
+end
+
+local function tocardinal4(n)
+ return char(extract(n,24,8),extract(n,16,8),extract(n,8,8),extract(n,0,8))
+end
+
+local function tointeger2(n)
+ return char(extract(n,8,8),extract(n,0,8))
+end
+
+local function tointeger3(n)
+ return char(extract(n,16,8),extract(n,8,8),extract(n,0,8))
+end
+
+local function tointeger4(n)
+ return char(extract(n,24,8),extract(n,16,8),extract(n,8,8),extract(n,0,8))
+end
+
+local function tocardinal8(n)
+ local l = idiv(n,0x100000000)
+ local r = n % 0x100000000
+ return char(extract(l,24,8),extract(l,16,8),extract(l,8,8),extract(l,0,8),
+ extract(r,24,8),extract(r,16,8),extract(r,8,8),extract(r,0,8))
+end
+
+-- A couple of shared helpers.
+
+local tounicodedictionary, widtharray, collectindices, subsetname, includecidset, forcecidset, tocidsetdictionary
+
+do
+
+ -- Because we supply tounicodes ourselves we only use bfchar mappings (as in the
+ -- backend). In fact, we can now no longer pass the tounicodes to the frontend but
+ -- pick them up from the descriptions.
+
+ local f_mapping_2 = formatters["<%02X> <%s>"]
+ local f_mapping_4 = formatters["<%04X> <%s>"]
+
+ local tounicode = fonts.mappings.tounicode
+
+local tounicode_template = [[
+%%!PS-Adobe-3.0 Resource-CMap
+%%%%DocumentNeededResources: ProcSet (CIDInit)
+%%%%IncludeResource: ProcSet (CIDInit)
+%%%%BeginResource: CMap (TeX-%s-0)
+%%%%Title: (TeX-%s-0 TeX %s 0)|
+%%%%Version: 1.000
+%%%%EndComments
+/CIDInit /ProcSet findresource begin
+ 12 dict begin
+ begincmap
+ /CIDSystemInfo
+ << /Registry (TeX) /Ordering (%s) /Supplement 0 >>
+ def
+ /CMapName
+ /TeX-Identity-%s
+ def
+ /CMapType
+ 2
+ def
+ 1 begincodespacerange
+ <%s> <%s>
+ endcodespacerange
+ %i beginbfchar
+%s
+ endbfchar
+ endcmap
+ CMapName currentdict /CMap defineresource pop
+ end
+end
+%%%%EndResource
+%%%%EOF]]
+
+ tounicodedictionary = function(details,indices,maxindex,name,wide)
+ local mapping = { }
+ local length = 0
+ if maxindex > 0 then
+ local f_mapping = wide and f_mapping_4 or f_mapping_2
+ for index=1,maxindex do
+ local data = indices[index]
+ if data then
+ length = length + 1
+ local unicode = data.unicode
+ if unicode then
+ unicode = tounicode(unicode)
+ else
+ unicode = "FFFD"
+ end
+ mapping[length] = f_mapping(index,unicode)
+ end
+ end
+ end
+ local name = gsub(name,"%+","-") -- like luatex does
+ local first = wide and "0000" or "00"
+ local last = wide and "FFFF" or "FF"
+ local blob = format(tounicode_template,name,name,name,name,name,first,last,length,concat(mapping,"\n"))
+ return blob
+ end
+
+ widtharray = function(details,indices,maxindex,units)
+ local widths = pdfarray()
+ local length = 0
+ local factor = 10000 / units
+ if maxindex > 0 then
+ local lastindex = -1
+ local sublist = nil
+ for index=1,maxindex do
+ local data = indices[index]
+ if data then
+ local width = data.width -- hm, is inaccurate for cff, so take from elsewhere
+ if width then
+ -- width = round(width * 10000 / units) / 10
+ width = round(width * factor) / 10
+ else
+ width = 0
+ end
+ if index == lastindex + 1 then
+ sublist[#sublist+1] = width
+ else
+ if sublist then
+ length = length + 1
+ widths[length] = sublist
+ end
+ sublist = pdfarray { width }
+ length = length + 1
+ widths[length] = index
+ end
+ lastindex = index
+ end
+ end
+ length = length + 1
+ widths[length] = sublist
+ end
+ return widths
+ end
+
+ collectindices = function(descriptions,indices)
+ local minindex = 0xFFFF
+ local maxindex = 0
+ local reverse = { }
+ -- todo: already at definition time trigger copying streams
+ -- and add extra indices ... first i need a good example of
+ -- a clash
+ -- for unicode, data in next, descriptions do
+ -- local i = data.index or unicode
+ -- if reverse[i] then
+ -- print("CLASH")
+ -- else
+ -- reverse[i] = data
+ -- end
+ -- end
+ for unicode, data in next, descriptions do
+ reverse[data.index or unicode] = data
+ end
+ for index in next, indices do
+ if index > maxindex then
+ maxindex = index
+ end
+ if index < minindex then
+ minindex = index
+ end
+ indices[index] = reverse[index]
+ end
+ if minindex > maxindex then
+ minindex = maxindex
+ end
+ return indices, minindex, maxindex
+ end
+
+ includecidset = false
+ forcecidset = false -- for private testing only
+
+ directives.register("backend.pdf.forcecidset",function(v)
+ forcecidset = v
+ end)
+
+ tocidsetdictionary = function(indices,min,max)
+ if includecidset or forcecidset then
+ local b = { }
+ local m = idiv(max+7,8)
+ for i=0,max do
+ b[i] = 0
+ end
+ b[0] = bor(b[0],lshift(1,7)) -- force notdef into the file
+ for i=min,max do
+ if indices[i] then
+ local bi = idiv(i,8)
+ local ni = i % 8
+ b[bi] = bor(b[bi],lshift(1,7-ni))
+ end
+ end
+ b = char(unpack(b,0,#b))
+ return pdfreference(pdfflushstreamobject(b))
+ end
+ end
+
+ -- Actually we can use the same as we only embed once.
+
+ -- subsetname = function(name)
+ -- return "CONTEXT" .. name
+ -- end
+
+ local prefixes = { } -- todo: set fixed one
+
+ subsetname = function(name)
+ local prefix
+ while true do
+ prefix = utfchar(random(65,90),random(65,90),random(65,90),random(65,90),random(65,90),random(65,90))
+ if not prefixes[prefix] then
+ prefixes[prefix] = true
+ break
+ end
+ end
+ return prefix .. "+" .. name
+ end
+
+end
+
+-- Map file mess.
+
+local loadmapfile, loadmapline, getmapentry do
+
+ -- We only need to pick up the filename and optionally the enc file
+ -- as we only use them for old school virtual math fonts. We might as
+ -- we drop this completely.
+
+ local find, match, splitlines = string.find, string.match, string.splitlines
+
+
+ local mappings = { }
+
+ loadmapline = function(n)
+ if trace_fonts then
+ report_fonts("mapline: %s",n)
+ end
+ local name, fullname, encfile, pfbfile = match(n,"(%S+)%s+(%S+).-<(.-%.enc).-<(.-%.pfb)")
+ if name then
+ mappings[name] = { fullname, encfile, pfbfile }
+ end
+ end
+
+ loadmapfile = function(n)
+ local okay, data = resolvers.loadbinfile(n,"map")
+ if okay and data then
+ data = splitlines(data)
+ for i=1,#data do
+ local d = data[i]
+ if d ~= "" and not find(d,"^[#%%]") then
+ loadmapline(d)
+ end
+ end
+ end
+ end
+
+ getmapentry = function(n)
+ local n = file.nameonly(n)
+ local m = mappings[n]
+ if m then
+ local encfile = m[2]
+ local encoding = fonts.encodings.load(encfile)
+ if not encoding then
+ return
+ end
+ local pfbfile = resolvers.findfile(m[3],"pfb")
+ if not pfbfile or pfbfile == "" then
+ return
+ end
+ return encoding, pfbfile, encfile
+ end
+ end
+
+ lpdf.getmapentry = getmapentry
+
+end
+
+-- The three writers: opentype, truetype and type1.
+
+local mainwriters = { }
+
+do
+
+ -- advh = os2.ascender - os2.descender
+ -- tsb = default_advh - os2.ascender
+
+ -- truetype has the following tables:
+
+ -- head : mandate
+ -- hhea : mandate
+ -- vhea : mandate
+ -- hmtx : mandate
+ -- maxp : mandate
+ -- glyf : mandate
+ -- loca : mandate
+ --
+ -- cvt : if needed (but we flatten)
+ -- fpgm : if needed (but we flatten)
+ -- prep : if needed (but we flatten)
+ -- PCLT : if needed (but we flatten)
+ --
+ -- name : not needed for T2: backend does that
+ -- post : not needed for T2: backend does that
+ -- OS/2 : not needed for T2: backend does that
+ -- cmap : not needed for T2: backend does that
+
+ local streams = utilities.streams
+ local openstring = streams.openstring
+ local readcardinal2 = streams.readcardinal2
+ ----- readcardinal4 = streams.readcardinal4
+
+ local otfreaders = fonts.handlers.otf.readers
+
+ local function readcardinal4(f) -- this needs to be sorted out
+ local a = readcardinal2(f)
+ local b = readcardinal2(f)
+ if a and b then
+ return a * 0x10000 + b
+ end
+ end
+
+ -- -- --
+
+ local tablereaders = { }
+ local tablewriters = { }
+ local tablecreators = { }
+ local tableloaders = { }
+
+ local openfontfile, closefontfile, makefontfile, makemetadata do
+
+ local details = {
+ details = true,
+ platformnames = true,
+ platformextras = true,
+ }
+
+ -- .022 sec on luatex manual, neglectable:
+
+ -- local function checksum(data)
+ -- local s = openstring(data)
+ -- local n = 0
+ -- local d = #data
+ -- while true do
+ -- local c = readcardinal4(s)
+ -- if c then
+ -- n = (n + c) % 0x100000000
+ -- else
+ -- break
+ -- end
+ -- end
+ -- return n
+ -- end
+
+ local function checksum(data)
+ local s = openstring(data)
+ local n = 0
+ local d = #data
+ while true do
+ local a = readcardinal2(s)
+ local b = readcardinal2(s)
+ if b then
+ n = (n + a * 0x10000 + b) % 0x100000000
+ else
+ break
+ end
+ end
+ return n
+ end
+
+ openfontfile = function(details)
+ return {
+ offset = 0,
+ order = { },
+ used = { },
+ details = details,
+ streams = details.streams,
+ }
+ end
+
+ closefontfile = function(fontfile)
+ for k, v in next, fontfile do
+ fontfile[k] = nil -- so it can be collected asap
+ end
+ end
+
+ local metakeys = {
+ "uniqueid", "version",
+ "copyright", "license", "licenseurl",
+ "manufacturer", "vendorurl",
+ "family", "subfamily",
+ "typographicfamily", "typographicsubfamily",
+ "fullname", "postscriptname",
+ }
+
+ local template = [[
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+ <x:xmpmeta xmlns:x="adobe:ns:meta/">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about="" xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/">
+
+%s
+
+ </rdf:Description>
+ </rdf:RDF>
+ </x:xmpmeta>
+<?xpacket end="w"?>]]
+
+ makemetadata = function(fontfile)
+ local names = fontfile.streams.names
+ local list = { }
+ local f_name = formatters["<pdfx:%s>%s</pdfx:%s>"]
+ for i=1,#metakeys do
+ local m = metakeys[i]
+ local n = names[m]
+ if n then
+ list[#list+1] = f_name(m,n,m)
+ end
+ end
+ return format(template,concat(list,"\n"))
+ end
+
+ makefontfile = function(fontfile)
+ local order = fontfile.order
+ local used = fontfile.used
+ local count = 0
+ for i=1,#order do
+ local tag = order[i]
+ local data = fontfile[tag]
+ if data and #data > 0 then
+ count = count + 1
+ else
+ fontfile[tag] = false
+ end
+ end
+ local offset = 12 + (count * 16)
+ local headof = 0
+ local list = {
+ "" -- placeholder
+ }
+ local i = 1
+ local k = 0
+ while i <= count do
+ i = lshift(i,1)
+ k = k + 1
+ end
+ local searchrange = lshift(i,3)
+ local entryselector = k - 1
+ local rangeshift = lshift(count,4) - lshift(i,3)
+ local index = {
+ tocardinal4(0x00010000), -- tables.version
+ tocardinal2(count),
+ tocardinal2(searchrange),
+ tocardinal2(entryselector),
+ tocardinal2(rangeshift),
+ }
+ --
+ local ni = #index
+ local nl = #list
+ for i=1,#order do
+ local tag = order[i]
+ local data = fontfile[tag]
+ if data then
+ local csum = checksum(data)
+ local dlength = #data
+ local length = idiv(dlength+3,4) * 4
+ local padding = length - dlength
+ nl = nl + 1 ; list[nl] = data
+ for i=1,padding do
+ nl = nl + 1 ; list[nl] = "\0"
+ end
+ if #tag == 3 then
+ tag = tag .. " "
+ end
+ ni = ni + 1 ; index[ni] = tag -- must be 4 chars
+ ni = ni + 1 ; index[ni] = tocardinal4(csum)
+ ni = ni + 1 ; index[ni] = tocardinal4(offset)
+ ni = ni + 1 ; index[ni] = tocardinal4(dlength)
+ used[i] = offset -- not used
+ if tag == "head" then
+ headof = offset
+ end
+ offset = offset + length
+ end
+ end
+ list[1] = concat(index)
+ local off = #list[1] + headof + 1 + 8
+ list = concat(list)
+ local csum = (0xB1B0AFBA - checksum(list)) % 0x100000000
+ list = sub(list,1,off-1) .. tocardinal4(csum) .. sub(list,off+4,#list)
+ return list
+ end
+
+ local function register(fontfile,name)
+ local u = fontfile.used
+ local o = fontfile.order
+ if not u[name] then
+ o[#o+1] = name
+ u[name] = true
+ end
+ end
+
+ local function create(fontfile,name)
+ local t = { }
+ fontfile[name] = t
+ return t
+ end
+
+ local function write(fontfile,name)
+ local t = fontfile[name]
+ if not t then
+ return
+ end
+ register(fontfile,name)
+ if type(t) == "table" then
+ if t[0] then
+ fontfile[name] = concat(t,"",0,#t)
+ elseif #t > 0 then
+ fontfile[name] = concat(t)
+ else
+ fontfile[name] = false
+ end
+ end
+ end
+
+ tablewriters.head = function(fontfile)
+ register(fontfile,"head")
+ local t = fontfile.streams.fontheader
+ fontfile.head = concat {
+ tocardinal4(t.version),
+ tocardinal4(t.fontversionnumber),
+ tocardinal4(t.checksum),
+ tocardinal4(t.magic),
+ tocardinal2(t.flags),
+ tocardinal2(t.units),
+ tocardinal8(t.created),
+ tocardinal8(t.modified),
+ tocardinal2(t.xmin),
+ tocardinal2(t.ymin),
+ tocardinal2(t.xmax),
+ tocardinal2(t.ymax),
+ tocardinal2(t.macstyle),
+ tocardinal2(t.smallpixels),
+ tocardinal2(t.directionhint),
+ tocardinal2(t.indextolocformat),
+ tocardinal2(t.glyphformat),
+ }
+ end
+
+ tablewriters.hhea = function(fontfile)
+ register(fontfile,"hhea")
+ local t = fontfile.streams.horizontalheader
+ local n = t and fontfile.nofglyphs or 0
+ fontfile.hhea = concat {
+ tocardinal4(t.version),
+ tocardinal2(t.ascender),
+ tocardinal2(t.descender),
+ tocardinal2(t.linegap),
+ tocardinal2(t.maxadvancewidth),
+ tocardinal2(t.minleftsidebearing),
+ tocardinal2(t.minrightsidebearing),
+ tocardinal2(t.maxextent),
+ tocardinal2(t.caretsloperise),
+ tocardinal2(t.caretsloperun),
+ tocardinal2(t.caretoffset),
+ tocardinal2(t.reserved_1),
+ tocardinal2(t.reserved_2),
+ tocardinal2(t.reserved_3),
+ tocardinal2(t.reserved_4),
+ tocardinal2(t.metricdataformat),
+ tocardinal2(n) -- t.nofmetrics
+ }
+ end
+
+ tablewriters.vhea = function(fontfile)
+ local t = fontfile.streams.verticalheader
+ local n = t and fontfile.nofglyphs or 0
+ register(fontfile,"vhea")
+ fontfile.vhea = concat {
+ tocardinal4(t.version),
+ tocardinal2(t.ascender),
+ tocardinal2(t.descender),
+ tocardinal2(t.linegap),
+ tocardinal2(t.maxadvanceheight),
+ tocardinal2(t.mintopsidebearing),
+ tocardinal2(t.minbottomsidebearing),
+ tocardinal2(t.maxextent),
+ tocardinal2(t.caretsloperise),
+ tocardinal2(t.caretsloperun),
+ tocardinal2(t.caretoffset),
+ tocardinal2(t.reserved_1),
+ tocardinal2(t.reserved_2),
+ tocardinal2(t.reserved_3),
+ tocardinal2(t.reserved_4),
+ tocardinal2(t.metricdataformat),
+ tocardinal2(n) -- t.nofmetrics
+ }
+ end
+
+ tablewriters.maxp = function(fontfile)
+ register(fontfile,"maxp")
+ local t = fontfile.streams.maximumprofile
+ local n = fontfile.nofglyphs
+ -- if fontfile.streams.cffinfo then
+ -- error
+ -- end
+ fontfile.maxp = concat {
+ tocardinal4(0x00010000),
+ tocardinal2(n),
+ tocardinal2(t.points),
+ tocardinal2(t.contours),
+ tocardinal2(t.compositepoints),
+ tocardinal2(t.compositecontours),
+ tocardinal2(t.zones),
+ tocardinal2(t.twilightpoints),
+ tocardinal2(t.storage),
+ tocardinal2(t.functiondefs),
+ tocardinal2(t.instructiondefs),
+ tocardinal2(t.stackelements),
+ tocardinal2(t.sizeofinstructions),
+ tocardinal2(t.componentelements),
+ tocardinal2(t.componentdepth),
+ }
+ end
+
+ tablecreators.loca = function(fontfile) return create(fontfile,"loca") end
+ tablewriters .loca = function(fontfile) return write (fontfile,"loca") end
+
+ tablecreators.glyf = function(fontfile) return create(fontfile,"glyf") end
+ tablewriters .glyf = function(fontfile) return write (fontfile,"glyf") end
+
+ tablecreators.hmtx = function(fontfile) return create(fontfile,"hmtx") end
+ tablewriters .hmtx = function(fontfile) return write (fontfile,"hmtx") end
+
+ tablecreators.vmtx = function(fontfile) return create(fontfile,"vmtx") end
+ tablewriters .vmtx = function(fontfile) return write (fontfile,"vmtx") end
+
+ tableloaders .cmap = function(fontfile) return read (fontfile,"cmap") end
+ tablewriters .cmap = function(fontfile) return write (fontfile,"cmap") end
+
+ tableloaders .name = function(fontfile) return read (fontfile,"name") end
+ tablewriters .name = function(fontfile) return write (fontfile,"name") end
+
+ tableloaders .post = function(fontfile) return read (fontfile,"post") end
+ tablewriters .post = function(fontfile) return write (fontfile,"post") end
+
+ end
+
+ mainwriters["truetype"] = function(details)
+ --
+ local fontfile = openfontfile(details)
+ local basefontname = details.basefontname
+ local streams = details.streams
+ local blobs = streams.streams
+ local fontheader = streams.fontheader
+ local horizontalheader = streams.horizontalheader
+ local verticalheader = streams.verticalheader
+ local maximumprofile = streams.maximumprofile
+ local names = streams.names
+ local descriptions = details.rawdata.descriptions
+ local metadata = details.rawdata.metadata
+ local indices = details.indices
+ local metabbox = { fontheader.xmin, fontheader.ymin, fontheader.xmax, fontheader.ymax }
+ local indices,
+ minindex,
+ maxindex = collectindices(descriptions,indices)
+ local glyphstreams = tablecreators.glyf(fontfile)
+ local locations = tablecreators.loca(fontfile)
+ local horizontals = tablecreators.hmtx(fontfile)
+ local verticals = tablecreators.vmtx(fontfile)
+ --
+ local zero2 = tocardinal2(0)
+ local zero4 = tocardinal4(0)
+ --
+ local horizontal = horizontalheader.nofmetrics > 0
+ local vertical = verticalheader.nofmetrics > 0
+ --
+ local streamoffset = 0
+ local lastoffset = zero4
+ local g, h, v = 0, 0, 0
+ --
+ -- todo: locate notdef
+ --
+ if minindex > 0 then
+ local blob = blobs[0]
+ if blob and #blob > 0 then
+ locations[0] = lastoffset
+ g = g + 1 ; glyphstreams[g] = blob
+ h = h + 1 ; horizontals [h] = zero4
+ if vertical then
+ v = v + 1 ; verticals[v] = zero4
+ end
+ streamoffset = streamoffset + #blob
+ lastoffset = tocardinal4(streamoffset)
+ else
+ report_fonts("missing .notdef in font %a",basefontname)
+ end
+ -- todo: use a rep for h/v
+ for index=1,minindex-1 do
+ locations[index] = lastoffset
+ h = h + 1 ; horizontals[h] = zero4
+ if vertical then
+ v = v + 1 ; verticals[v] = zero4
+ end
+ end
+ end
+ for index=minindex,maxindex do
+ locations[index] = lastoffset
+ local data = indices[index]
+ if data then
+ local blob = blobs[index] -- we assume padding
+ if blob and #blob > 0 then
+ g = g + 1 ; glyphstreams[g] = blob
+ h = h + 1 ; horizontals [h] = tocardinal2(data.width or 0)
+ h = h + 1 ; horizontals [h] = tocardinal2(data.boundingbox[1])
+ if vertical then
+ v = v + 1 ; verticals[v] = tocardinal2(data.height or 0)
+ v = v + 1 ; verticals[v] = tocardinal2(data.boundingbox[3])
+ end
+ streamoffset = streamoffset + #blob
+ lastoffset = tocardinal4(streamoffset)
+ else
+ h = h + 1 ; horizontals[h] = zero4
+ if vertical then
+ v = v + 1 ; verticals[v] = zero4
+ end
+ report_fonts("missing blob for index %i in font %a",index,basefontname)
+ end
+ else
+ h = h + 1 ; horizontals[h] = zero4
+ if vertical then
+ v = v + 1 ; verticals[v] = zero4
+ end
+ end
+ end
+ locations[maxindex+1] = lastoffset -- cf spec
+ --
+ local nofglyphs = maxindex + 1 -- include zero
+ --
+ fontheader.checksum = 0
+ fontheader.indextolocformat = 1
+ maximumprofile.nofglyphs = nofglyphs
+ --
+ fontfile.format = "tff"
+ fontfile.basefontname = basefontname
+ fontfile.nofglyphs = nofglyphs
+ --
+ tablewriters.head(fontfile)
+ tablewriters.hhea(fontfile)
+ if vertical then
+ tablewriters.vhea(fontfile)
+ end
+ tablewriters.maxp(fontfile)
+
+ tablewriters.loca(fontfile)
+ tablewriters.glyf(fontfile)
+
+ tablewriters.hmtx(fontfile)
+ if vertical then
+ tablewriters.vmtx(fontfile)
+ end
+ --
+ local fontdata = makefontfile(fontfile)
+ local fontmeta = makemetadata(fontfile)
+ --
+ fontfile = closefontfile(fontfile)
+ --
+ local units = metadata.units
+ local basefont = pdfconstant(basefontname)
+ local widths = widtharray(details,indices,maxindex,units)
+ local object = details.objectnumber
+ local tounicode = tounicodedictionary(details,indices,maxindex,basefontname,true)
+ local tocidset = tocidsetdictionary(indices,minindex,maxindex)
+ local metabbox = metadata.boundingbox or { 0, 0, 0, 0 }
+ local fontbbox = pdfarray { unpack(metabbox) }
+ local ascender = metadata.ascender
+ local descender = metadata.descender
+ local capheight = metadata.capheight or fontbbox[4]
+ local stemv = metadata.weightclass
+ local italicangle = metadata.italicangle
+ local xheight = metadata.xheight or fontbbox[4]
+ --
+ if stemv then
+ stemv = (stemv/65)^2 + 50
+ end
+ --
+ local function scale(n)
+ if n then
+ return round((n) * 10000 / units) / 10
+ else
+ return 0
+ end
+ end
+ --
+ local reserved = pdfreserveobject()
+ local child = pdfdictionary {
+ Type = pdfconstant("Font"),
+ Subtype = pdfconstant("CIDFontType2"),
+ BaseFont = basefont,
+ FontDescriptor = pdfreference(reserved),
+ W = pdfreference(pdfflushobject(widths)),
+ CIDToGIDMap = pdfconstant("Identity"),
+ CIDSystemInfo = pdfdictionary {
+ Registry = pdfstring("Adobe"),
+ Ordering = pdfstring("Identity"),
+ Supplement = 0,
+ }
+ }
+ local descendants = pdfarray {
+ pdfreference(pdfflushobject(child)),
+ }
+ local descriptor = pdfdictionary {
+ Type = pdfconstant("FontDescriptor"),
+ FontName = basefont,
+ Flags = 4,
+ FontBBox = fontbbox,
+ Ascent = scale(ascender),
+ Descent = scale(descender),
+ ItalicAngle = round(italicangle or 0),
+ CapHeight = scale(capheight),
+ StemV = scale(stemv),
+ XHeight = scale(xheight),
+ FontFile2 = pdfreference(pdfflushstreamobject(fontdata)),
+ CIDSet = tocidset,
+ Metadata = fontmeta and pdfreference(pdfflushstreamobject(fontmeta)) or nil,
+ }
+ local parent = pdfdictionary {
+ Type = pdfconstant("Font"),
+ Subtype = pdfconstant("Type0"),
+ Encoding = pdfconstant(details.properties.writingmode == "vertical" and "Identity-V" or "Identity-H"),
+ BaseFont = basefont,
+ DescendantFonts = descendants,
+ ToUnicode = pdfreference(pdfflushstreamobject(tounicode)),
+ }
+ pdfflushobject(reserved,descriptor)
+ pdfflushobject(object,parent)
+ --
+ -- if trace_details then
+ -- local name = "temp.ttf"
+ -- report_fonts("saving %a",name)
+ -- io.savedata(name,fontdata)
+ -- inspect(fonts.handlers.otf.readers.loadfont(name))
+ -- end
+ --
+ end
+
+ do
+ -- todo : cff2
+
+ local details = {
+ details = true,
+ platformnames = true,
+ platformextras = true,
+ }
+
+ tablecreators.cff = function(fontfile)
+ fontfile.charstrings = { }
+ fontfile.charmappings = { }
+ fontfile.cffstrings = { }
+ fontfile.cffhash = { }
+ return fontfile.charstrings , fontfile.charmappings
+ end
+
+ local todictnumber, todictreal, todictinteger, todictoffset do
+
+ local maxnum = 0x7FFFFFFF
+ local minnum = - 0x7FFFFFFF - 1
+ local epsilon = 1.0e-5
+
+ local int2tag = "\28"
+ local int4tag = "\29"
+ local realtag = "\30"
+
+ todictinteger = function(n)
+ if not n then
+ return char(band(139,0xFF))
+ elseif n >= -107 and n <= 107 then
+ return char(band(n + 139,0xFF))
+ elseif n >= 108 and n <= 1131 then
+ n = 0xF700 + n - 108
+ return char(band(rshift(n,8),0xFF),band(n,0xFF))
+ elseif n >= -1131 and n <= -108 then
+ n = 0xFB00 - n - 108
+ return char(band(rshift(n,8),0xFF),band(n,0xFF))
+ elseif n >= -32768 and n <= 32767 then
+ -- return int2tag .. tointeger2(n)
+ return char(28,extract(n,8,8),extract(n,0,8))
+ else
+ -- return int4tag .. tointeger4(n)
+ return char(29,extract(n,24,8),extract(n,16,8),extract(n,8,8),extract(n,0,8))
+ end
+ end
+
+ -- -- not called that often
+ --
+ -- local encoder = readers.cffencoder
+ --
+ -- todictinteger = function(n)
+ -- if not n then
+ -- return encoder[0]
+ -- elseif n >= -1131 and n <= 1131 then
+ -- return encoder[n]
+ -- elseif n >= -32768 and n <= 32767 then
+ -- -- return int2tag .. tointeger2(n)
+ -- return char(28,extract(n,8,8),extract(n,0,8))
+ -- else
+ -- -- return int4tag .. tointeger4(n)
+ -- return char(29,extract(n,24,8),extract(n,16,8),extract(n,8,8),extract(n,0,8))
+ -- end
+ -- end
+
+ todictoffset = function(n)
+ return int4tag .. tointeger4(n)
+ end
+
+ local e = false
+ local z = byte("0")
+ local dp = 10
+ local ep = 11
+ local em = 12
+ local mn = 14
+ local es = 15
+
+ local fg = formatters["%g"]
+
+ todictreal = function(v)
+ local s = fg(v)
+ local t = { [0] = realtag }
+ local n = 0
+ for s in gmatch(s,".") do
+ if s == "e" or s == "E" then
+ e = true
+ elseif s == "+" then
+ -- skip
+ elseif s == "-" then
+ n = n + 1
+ if e then
+ t[n] = em
+ e = false
+ else
+ t[n] = mn
+ end
+ else
+ if e then
+ n = n + 1
+ t[n] = ep
+ e = false
+ end
+ n = n + 1
+ if s == "." then
+ t[n] = dp
+ else
+ t[n] = byte(s) - z
+ end
+ end
+ end
+ n = n + 1
+ t[n] = es
+ if (n % 2) ~= 0 then
+ n = n + 1
+ t[n] = es
+ end
+ local j = 0
+ for i=1,n,2 do
+ j = j + 1
+ t[j] = char(t[i]*0x10+t[i+1])
+ end
+ t = concat(t,"",0,j)
+ return t
+ end
+
+ todictnumber = function(n)
+ if not n or n == 0 then
+ return todictinteger(0)
+ elseif (n > maxnum or n < minnum or (abs(n - round(n)) > epsilon)) then
+ return todictreal(n)
+ else
+ return todictinteger(n)
+ end
+ end
+
+ end
+
+ local todictkey = char
+
+ local function todictstring(fontfile,value)
+ if not value then
+ value = ""
+ end
+ local s = fontfile.cffstrings
+ local h = fontfile.cffhash
+ local n = h[value]
+ if not n then
+ n = #s + 1
+ s[n] = value
+ h[value] = n
+ end
+ return todictinteger(390+n)
+ end
+
+ local function todictboolean(b)
+ return todictinteger(b and 1 or 0)
+ end
+
+ local function todictdeltas(t)
+ local r = { }
+ for i=1,#t do
+ r[i] = todictnumber(t[i]-(t[i-1] or 0))
+ end
+ return concat(r)
+ end
+
+ local function todictarray(t)
+ local r = { }
+ for i=1,#t do
+ r[i] = todictnumber(t[i])
+ end
+ return concat(r)
+ end
+
+ local function writestring(target,source,offset,what)
+ target[#target+1] = source
+ -- report_fonts("string : %-11s %06i # %05i",what,offset,#source)
+ return offset + #source
+ end
+
+ local function writetable(target,source,offset,what)
+ source = concat(source)
+ target[#target+1] = source
+ -- report_fonts("table : %-11s %06i # %05i",what,offset,#source)
+ return offset + #source
+ end
+
+ local function writeindex(target,source,offset,what)
+ local n = #source
+ local t = #target
+ t = t + 1 ; target[t] = tocardinal2(n)
+ if n > 0 then
+ local data = concat(source)
+ local size = #data -- assume the worst
+ local offsetsize, tocardinal
+ if size < 0xFF then
+ offsetsize, tocardinal = 1, tocardinal1
+ elseif size < 0xFFFF then
+ offsetsize, tocardinal = 2, tocardinal2
+ elseif size < 0xFFFFFF then
+ offsetsize, tocardinal = 3, tocardinal3
+ elseif size < 0xFFFFFFFF then
+ offsetsize, tocardinal = 4, tocardinal4
+ end
+ -- report_fonts("index : %-11s %06i # %05i (%i entries with offset size %i)",what,offset,#data,n,offsetsize)
+ offset = offset + 2 + 1 + (n + 1) * offsetsize + size
+ -- bytes per offset
+ t = t + 1 ; target[t] = tocardinal1(offsetsize)
+ -- list of offsets (one larger for length calculation)
+ local offset = 1 -- mandate
+ t = t + 1 ; target[t] = tocardinal(offset)
+ for i=1,n do
+ offset = offset + #source[i]
+ t = t + 1 ; target[t] = tocardinal(offset)
+ end
+ t = t + 1 ; target[t] = data
+ else
+ -- report_fonts("index : %-11s %06i # %05i (no entries)",what,offset,0)
+ offset = offset + 2
+ end
+ -- print("offset",offset,#concat(target))
+ return offset
+ end
+
+ tablewriters.cff = function(fontfile)
+ --
+ local streams = fontfile.streams
+ local cffinfo = streams.cffinfo or { }
+ local names = streams.names or { }
+ local fontheader = streams.fontheader or { }
+ local basefontname = fontfile.basefontname
+ --
+ local offset = 0
+ local dictof = 0
+ local target = { }
+ --
+ local charstrings = fontfile.charstrings
+ local nofglyphs = #charstrings + 1
+ local fontmatrix = { 0.001, 0, 0, 0.001, 0, 0 } -- todo
+ local fontbbox = fontfile.fontbbox
+ local defaultwidth = cffinfo.defaultwidth or 0
+ local nominalwidth = cffinfo.nominalwidth or 0
+ local bluevalues = cffinfo.bluevalues
+ local otherblues = cffinfo.otherblues
+ local familyblues = cffinfo.familyblues
+ local familyotherblues = cffinfo.familyotherblues
+ local bluescale = cffinfo.bluescale
+ local blueshift = cffinfo.blueshift
+ local bluefuzz = cffinfo.bluefuzz
+ local stdhw = cffinfo.stdhw
+ local stdvw = cffinfo.stdvw
+ --
+ if defaultwidth == 0 then defaultwidth = nil end
+ if nomimalwidth == 0 then nominalwidth = nil end
+ if bluevalues then bluevalues = todictarray(bluevalues) end
+ if otherblues then otherblues = todictarray(otherblues) end
+ if familyblues then familyblues = todictarray(familyblues) end
+ if familyotherblues then familyotherblues = todictarray(familyotherblues) end
+ if bluescale then bluescale = todictnumber(bluescale) end
+ if blueshift then blueshift = todictnumber(blueshift) end
+ if bluefuzz then bluefuzz = todictnumber(bluefuzz) end
+ if stdhw then stdhw = todictdeltas(stdhw) end
+ if stdvw then stdvw = todictdeltas(stdvw) end
+ --
+ local fontversion = todictstring(fontfile,fontheader.fontversion or "uknown version")
+ local familyname = todictstring(fontfile,cffinfo.familyname or names.family or basefontname)
+ local fullname = todictstring(fontfile,cffinfo.fullname or basefontname)
+ local weight = todictstring(fontfile,cffinfo.weight or "Normal")
+ local fontbbox = todictarray(fontbbox)
+ local strokewidth = todictnumber(cffinfo.strokewidth)
+ local monospaced = todictboolean(cffinfo.monospaced)
+ local italicangle = todictnumber(cffinfo.italicangle)
+ local underlineposition = todictnumber(cffinfo.underlineposition)
+ local underlinethickness = todictnumber(cffinfo.underlinethickness)
+ local charstringtype = todictnumber(2)
+ local fontmatrix = todictarray(fontmatrix)
+ local ros = todictstring(fontfile,"Adobe") -- registry
+ .. todictstring(fontfile,"Identity") -- identity
+ .. todictnumber(0) -- supplement
+ local cidcount = todictnumber(fontfile.nofglyphs)
+ local fontname = todictstring(fontfile,basefontname)
+ local fdarrayoffset = todictoffset(0)
+ local fdselectoffset = todictoffset(0)
+ local charstringoffset = todictoffset(0)
+ local charsetoffset = todictoffset(0)
+ local privateoffset = todictoffset(0)
+ --
+ local defaultwidthx = todictnumber(defaultwidth)
+ local nominalwidthx = todictnumber(nominalwidth)
+ local private = ""
+ .. (defaultwidthx and (defaultwidthx .. todictkey(20)) or "")
+ .. (nominalwidthx and (nominalwidthx .. todictkey(21)) or "")
+ .. (bluevalues and (bluevalues .. todictkey(6)) or "")
+ .. (otherblues and (otherblues .. todictkey(7)) or "")
+ .. (familyblues and (familyblues .. todictkey(8)) or "")
+ .. (familyotherblues and (familyotherblues .. todictkey(9)) or "")
+ .. (bluescale and (bluescale .. todictkey(12,9)) or "")
+ .. (blueshift and (blueshift .. todictkey(12,10)) or "")
+ .. (bluefuzz and (bluefuzz .. todictkey(12,11)) or "")
+ .. (stdhw and (stdhw .. todictkey(12,12)) or "")
+ .. (stdvw and (stdvw .. todictkey(12,13)) or "")
+ local privatesize = todictnumber(#private)
+ local privatespec = privatesize .. privateoffset
+ --
+ -- header (fixed @ 1)
+ --
+ local header =
+ tocardinal1(1) -- major
+ .. tocardinal1(0) -- minor
+ .. tocardinal1(4) -- header size
+ .. tocardinal1(4) -- offset size
+ --
+ offset = writestring(target,header,offset,"header")
+ --
+ -- name index (fixed @ 2) (has to be sorted)
+ --
+ local names = {
+ basefontname,
+ }
+ --
+ offset = writeindex(target,names,offset,"names")
+ --
+ -- topdict index (fixed @ 3)
+ --
+ local topvars =
+ charstringoffset .. todictkey(17)
+ .. charsetoffset .. todictkey(15)
+ .. fdarrayoffset .. todictkey(12,36)
+ .. fdselectoffset .. todictkey(12,37)
+ .. privatespec .. todictkey(18)
+ --
+ local topdict = {
+ ros .. todictkey(12,30) -- first
+ .. cidcount .. todictkey(12,34)
+ .. familyname .. todictkey( 3)
+ .. fullname .. todictkey( 2)
+ .. weight .. todictkey( 4)
+ .. fontbbox .. todictkey( 5)
+ .. monospaced .. todictkey(12, 1)
+ .. italicangle .. todictkey(12, 2)
+ .. underlineposition .. todictkey(12, 3)
+ .. underlinethickness .. todictkey(12, 4)
+ .. charstringtype .. todictkey(12, 6)
+ .. fontmatrix .. todictkey(12, 7)
+ .. strokewidth .. todictkey(12, 8)
+ .. topvars
+ }
+ --
+ offset = writeindex(target,topdict,offset,"topdict")
+ dictof = #target
+ --
+ -- string index (fixed @ 4)
+ --
+ offset = writeindex(target,fontfile.cffstrings,offset,"strings")
+ --
+ -- global subroutine index (fixed @ 5)
+ --
+ offset = writeindex(target,{},offset,"globals")
+ --
+ -- Encoding (cff1)
+ --
+ -- offset = writeindex(target,{},offset,"encoding")
+ --
+ -- Charsets
+ --
+ charsetoffset = todictoffset(offset)
+ offset = writetable(target,fontfile.charmappings,offset,"charsets")
+ --
+ -- fdselect
+ --
+ local fdselect =
+ tocardinal1(3) -- format
+ .. tocardinal2(1) -- n of ranges
+ -- entry 1
+ .. tocardinal2(0) -- first gid
+ .. tocardinal1(0) -- fd index
+ -- entry 2
+-- .. tocardinal2(fontfile.sparsemax-1) -- sentinel
+ .. tocardinal2(fontfile.sparsemax) -- sentinel
+ --
+ fdselectoffset = todictoffset(offset)
+ offset = writestring(target,fdselect,offset,"fdselect")
+ --
+ -- charstrings
+ --
+ charstringoffset = todictoffset(offset)
+ offset = writeindex(target,charstrings,offset,"charstrings")
+ --
+ -- font dict
+ --
+ -- offset = writeindex(target,{},offset,"fontdict")
+ --
+ -- private
+ --
+ privateoffset = todictoffset(offset)
+ privatespec = privatesize .. privateoffset
+ offset = writestring(target,private,offset,"private")
+ --
+ local fdarray = {
+ fontname .. todictkey(12,38)
+ .. privatespec .. todictkey(18)
+ }
+ fdarrayoffset = todictoffset(offset)
+ offset = writeindex(target,fdarray,offset,"fdarray")
+ --
+ topdict = target[dictof]
+ topdict = sub(topdict,1,#topdict-#topvars)
+ topvars =
+ charstringoffset .. todictkey(17)
+ .. charsetoffset .. todictkey(15)
+ .. fdarrayoffset .. todictkey(12,36)
+ .. fdselectoffset .. todictkey(12,37)
+ .. privatespec .. todictkey(18)
+ target[dictof] = topdict .. topvars
+ --
+ target = concat(target)
+ -- if trace_details then
+ -- local name = "temp.cff"
+ -- report_fonts("saving %a",name)
+ -- io.savedata(name,target)
+ -- inspect(fonts.handlers.otf.readers.cffcheck(name))
+ -- end
+ return target
+ end
+
+ end
+
+ -- todo: check widths (missing a decimal)
+
+ mainwriters["opentype"] = function(details)
+ --
+ local fontfile = openfontfile(details)
+ local basefontname = details.basefontname
+ local streams = details.streams
+ local blobs = streams.streams
+ local fontheader = streams.fontheader
+ local maximumprofile = streams.maximumprofile
+ local names = streams.names
+ local descriptions = details.rawdata.descriptions
+ local metadata = details.rawdata.metadata
+ local indices = details.indices
+ local metabbox = { fontheader.xmin, fontheader.ymin, fontheader.xmax, fontheader.ymax }
+ local correction = 1
+
+ -- (*) We share code with type1 and when we have old school tfm with
+ -- pfb but without descriptions we're kind of toast.
+
+ if not descriptions or not next(descriptions) then
+ -- This is good enough, we only need indices and widths.
+ descriptions = details.fontdata.characters
+ -- This is a hack, we have no basepoints.
+ correction = details.fontdata.parameters.size / 1000
+ -- And this needs checking.
+ correction = correction * bpfactor / ptfactor
+ metadata = { }
+ end
+
+ --
+
+ local indices,
+ minindex,
+ maxindex = collectindices(descriptions,indices)
+ local streamoffset = 0
+ local glyphstreams,
+ charmappings = tablecreators.cff(fontfile)
+ --
+ local zero2 = tocardinal2(0)
+ local zero4 = tocardinal4(0)
+ --
+ -- we need to locate notdef (or store its unicode someplace)
+ --
+ local blob = blobs[0] or "\14"
+ local sparsemax = 1
+ local lastoffset = zero4
+ glyphstreams[sparsemax] = blob
+ charmappings[sparsemax] = tocardinal1(0) -- format 0
+ streamoffset = streamoffset + #blob
+ lastoffset = tocardinal4(streamoffset)
+ if minindex == 0 then
+ minindex = 1
+ end
+ for index=minindex,maxindex do
+ if indices[index] then
+ local blob = blobs[index] or "\14"
+ sparsemax = sparsemax + 1
+ glyphstreams[sparsemax] = blob
+ charmappings[sparsemax] = tocardinal2(index)
+ streamoffset = streamoffset + #blob
+ lastoffset = tocardinal4(streamoffset)
+ end
+ end
+ --
+ fontfile.nofglyphs = maxindex + 1
+ fontfile.sparsemax = sparsemax
+ fontfile.format = "cff"
+ fontfile.basefontname = basefontname
+ fontfile.fontbbox = metabbox
+ --
+ local fontdata = tablewriters.cff(fontfile)
+ local fontmeta = makemetadata(fontfile)
+ --
+ fontfile = closefontfile(fontfile)
+ --
+ local units = fontheader.units or metadata.units
+
+ local basefont = pdfconstant(basefontname)
+ local widths = widtharray(details,indices,maxindex,units * correction)
+ local object = details.objectnumber
+ local tounicode = tounicodedictionary(details,indices,maxindex,basefontname,true)
+ local tocidset = tocidsetdictionary(indices,minindex,maxindex)
+ local fontbbox = pdfarray { unpack(metabbox) }
+ local ascender = metadata.ascender or 0
+ local descender = metadata.descender or 0
+ local capheight = metadata.capheight or fontbbox[4]
+ local stemv = metadata.weightclass
+ local italicangle = metadata.italicangle
+ local xheight = metadata.xheight or fontbbox[4]
+ if stemv then
+ stemv = (stemv/65)^2 + 50
+ else
+-- stemv = 2
+ end
+ --
+ local function scale(n)
+ if n then
+ return round((n) * 10000 / units) / 10
+ else
+ return 0
+ end
+ end
+ --
+ local reserved = pdfreserveobject()
+ local child = pdfdictionary {
+ Type = pdfconstant("Font"),
+ Subtype = pdfconstant("CIDFontType0"),
+ BaseFont = basefont,
+ FontDescriptor = pdfreference(reserved),
+ W = pdfreference(pdfflushobject(widths)),
+ CIDSystemInfo = pdfdictionary {
+ Registry = pdfstring("Adobe"),
+ Ordering = pdfstring("Identity"),
+ Supplement = 0,
+ }
+ }
+ local descendants = pdfarray {
+ pdfreference(pdfflushobject(child)),
+ }
+ local fontstream = pdfdictionary {
+ Subtype = pdfconstant("CIDFontType0C"),
+ }
+ local descriptor = pdfdictionary {
+ Type = pdfconstant("FontDescriptor"),
+ FontName = basefont,
+ Flags = 4,
+ FontBBox = fontbbox,
+ Ascent = scale(ascender),
+ Descent = scale(descender),
+ ItalicAngle = round(italicangle or 0),
+ CapHeight = scale(capheight),
+ StemV = scale(stemv),
+ XHeight = scale(xheight),
+ CIDSet = tocidset,
+ FontFile3 = pdfreference(pdfflushstreamobject(fontdata,fontstream())),
+ Metadata = fontmeta and pdfreference(pdfflushstreamobject(fontmeta)) or nil,
+ }
+ local parent = pdfdictionary {
+ Type = pdfconstant("Font"),
+ Subtype = pdfconstant("Type0"),
+ Encoding = pdfconstant(details.properties.writingmode == "vertical" and "Identity-V" or "Identity-H"),
+ BaseFont = basefont,
+ DescendantFonts = descendants,
+ ToUnicode = pdfreference(pdfflushstreamobject(tounicode)),
+ }
+ pdfflushobject(reserved,descriptor)
+ pdfflushobject(object,parent)
+ end
+
+ mainwriters["type1"] = function(details)
+ -- We abuse the cff includer which is ok but for special cases like
+ -- tfm -> pfb we don't have the right descriptions and scale so this
+ -- is why we cheat elsewhere. Maybe I should just drop that kind of
+ -- support and assume afm files to be present. See (*) above.
+ local s = details.streams
+ local m = details.rawdata.metadata
+ if m then
+ local h = s.horizontalheader
+ local c = s.cffinfo
+ local n = s.names
+ h.ascender = m.ascender or h.ascender
+ h.descender = m.descender or h.descender
+ n.copyright = m.copyright or n.copyright
+ n.family = m.familyname or n.familyname
+ n.fullname = m.fullname or n.fullname
+ n.fontname = m.fontname or n.fontname
+ n.subfamily = m.subfamilyname or n.subfamilyname
+ n.version = m.version or n.version
+ setmetatableindex(h,m)
+ setmetatableindex(c,m)
+ setmetatableindex(n,m)
+ end
+ mainwriters["opentype"](details)
+ end
+
+ do
+
+ -- The methods might become plugins.
+
+ local methods = { }
+
+ local pdfimage = lpdf.epdf.image
+ local openpdf = pdfimage.open
+ local closepdf = pdfimage.close
+ local copypage = pdfimage.copy
+
+ local embedimage = images.embed
+
+ local f_glyph = formatters["G%d"]
+ local f_char = formatters["BT /V%d 1 Tf [<%04X>] TJ ET"]
+ local f_width = formatters["%.6N 0 d0"]
+ local f_index = formatters["I%d"]
+ local f_image_xy = formatters["%.6N 0 d0 1 0 0 1 %.6N %.6N cm /%s Do"]
+ local f_image_c = formatters["/%s Do"]
+ local f_image_c_xy = formatters["%.6N 0 0 %.6N %.6N %.6N cm /%s Do"]
+ local f_image_w = formatters["%.6N 0 d0 %s"]
+ local f_image_d = formatters["%.6N 0 d0 1 0 0 1 0 %.6N cm /%s Do"]
+ local f_stream = formatters["%.6N 0 d0 %s"]
+ local f_stream_c = formatters["%.6N 0 0 0 0 0 d1 %s"]
+ local f_stream_d = formatters["%.6N 0 d0 1 0 0 1 0 %.6N cm %s"]
+
+ -- A type 3 font has at most 256 characters and Acrobat also wants a zero slot
+ -- to be filled. We can share a mandate zero slot character. We also need to
+ -- make sure that we use bytes as index in the page stream as well as in the
+ -- tounicode vector.
+
+ local c_notdef = nil
+ local r_notdef = nil
+ local w_notdef = nil
+ local fontbbox = nil
+
+ -- pk inclusion (not really tested but not really used either)
+
+ function methods.pk(filename)
+ local pkfullname = resolvers.findpk(basedfontname,resolution)
+ if not pkfullname or pkfullname == "" then
+ return
+ end
+ local readers = fonts.handlers.tfm.readers
+ local result = readers.loadpk(pkfullname)
+ local convert = readers.pktopdf
+ if not result or result.error then
+ return
+ end
+ local resolution = 600
+ local widthfactor = resolution / 72
+ local scalefactor = 72 / resolution / 10
+ local factor = widthfactor / 65536
+ local function pktopdf(glyph,data)
+ return convert(glyph,data,factor) -- return pdfcode, width
+ end
+ return result.glyphs, scalefactor, pktopdf, false, false
+ end
+
+ -- pdf inclusion
+
+ local used = setmetatableindex("table")
+
+ function methods.pdf(filename,details)
+ local properties = details.properties
+ local pdfshapes = properties.indexdata[1]
+ local pdfdoc = openpdf(pdfshapes.filename)
+ local xforms = pdfdictionary()
+ local nofglyphs = 0
+ if pdfdoc then
+ local scale = 10 * details.parameters.size/details.parameters.designsize
+ local units = details.parameters.units
+ local factor = units * bpfactor / scale
+ local fixdepth = pdfshapes.fixdepth
+ local useddoc = used[pdfdoc]
+ local function pdftopdf(glyph,data)
+ local width = (data.width or 0) * factor
+ local image = useddoc[glyph]
+ local reference = nil
+ if not image then
+ image = embedimage(copypage(pdfdoc,glyph))
+ nofglyphs = nofglyphs + 1
+ local name = f_glyph(nofglyphs)
+ local stream = nil
+ if fixdepth then
+ local depth = data.depth or 0
+ local height = data.height or 0
+ if depth ~= 0 or height ~= 0 then
+ local d = data.dropin.descriptions[data.index]
+ local b = d.boundingbox
+ local l = b[1]
+ local r = b[3]
+ local w = r - l
+ local scale = w / d.width
+ local x = l
+ local y = - b[4] - b[2] - d.depth
+ local scale = w / (image.width * bpfactor)
+ stream = f_image_c_xy(scale,scale,x,y,name)
+ else
+ stream = f_image_c(name)
+ end
+ else
+ stream = f_image_c(name)
+ end
+ useddoc[glyph] = image
+ image.embedded_name = name
+ image.embedded_stream = stream
+ image.embedded_reference = pdfreference(image.objnum)
+ end
+ xforms[image.embedded_name] = image.embedded_reference
+ return f_image_w(width,image.embedded_stream), width
+ end
+ local function closepdf()
+ -- closepdf(pdfdoc)
+ end
+ local function getresources()
+ return pdfdictionary { XObject = xforms }
+ end
+ return pdfshapes, 1/units, pdftopdf, closepdf, getresources
+ end
+ end
+
+ -- mps inclusion
+
+ local decompress = gzip.decompress
+ local metapost = metapost
+ local simplemprun = metapost.simple
+ local setparameterset = metapost.setparameterset
+
+ function methods.mps(filename,details)
+ local properties = details.properties
+ local parameters = details.parameters
+ local mpshapes = properties.indexdata[1] -- indexdata will change
+ if mpshapes then
+ local scale = 10 * parameters.size/parameters.designsize
+ local units = mpshapes.units or parameters.units
+ local factor = units * bpfactor / scale
+ local fixdepth = mpshapes.fixdepth
+ local usecolor = mpshapes.usecolor
+ local specification = mpshapes.specification
+ local shapedefinitions = mpshapes.shapes
+ local instance = mpshapes.instance
+ --
+ simplemprun(instance,"begingroup;",true,true)
+ setparameterset("mpsfont",specification)
+ if shapedefinitions then
+ local preamble = shapedefinitions.parameters.preamble
+ if preamble then
+ simplemprun(instance,preamble,true,true)
+ end
+ end
+ --
+ local function mpstopdf(mp,data)
+ local width = data.width
+ if decompress then
+ mp = decompress(mp)
+ end
+ local pdf = simplemprun(instance,mp,true) -- can be sped up, minifun
+ local width = width * factor
+ if usecolor then
+ return f_stream_c(width,pdf), width
+ elseif fixdepth then
+ local depth = data.depth or 0
+ local height = data.height or 0
+ if depth ~= 0 or height ~= 0 then
+ return f_stream_d(width,(-height-depth)*factor,pdf), width
+ end
+ end
+ return f_stream(width,pdf), width
+ end
+ --
+ local function resetmps()
+ setparameterset("mpsfont")
+ simplemprun(instance,"endgroup;",true,true)
+ end
+ --
+ local function getresources()
+ return lpdf.collectedresources {
+ serialize = false,
+ }
+ end
+ --
+ return mpshapes, 1/units, mpstopdf, resetmps, getresources
+ end
+ end
+
+ -- png inclusion
+
+ -- With d1 the image mask is used when given and obeys color. So it is needed for pure bw
+ -- bitmap fonts, so here we really need d0.
+ --
+ -- Acrobat X pro only seems to see the image mask but other viewers are doing it ok. Acrobat
+ -- reader crashes. We really need to add a notdef!
+
+ local files = utilities.files
+ local openfile = files.open
+ local closefile = files.close
+ local setposition = files.setposition
+ local readstring = files.readstring
+
+ function methods.png(filename,details)
+ local properties = details.properties
+ local pngshapes = properties.indexdata[1]
+ if pngshapes then
+ local parameters = details.parameters
+ local png = properties.png
+ local hash = png.hash
+ local xforms = pdfdictionary()
+ local nofglyphs = 0
+ local scale = 10 * parameters.size/parameters.designsize
+ local factor = bpfactor / scale
+ -- local units = parameters.units -- / 1000
+ local units = 1000
+ local filehandle = openfile(details.filename,true)
+ local function pngtopdf(glyph,data)
+ -- local info = graphics.identifiers.png(glyph.data,"string")
+ local offset = glyph.o
+ local size = glyph.s
+ local pdfdata = nil
+ if offset and size then
+ setposition(filehandle,offset)
+ local blob = readstring(filehandle,size)
+ local info = graphics.identifiers.png(blob,"string")
+ info.enforcecmyk = pngshapes.enforcecmyk
+ local image = lpdf.injectors.png(info,"string")
+ local width = (data.width or 0) * factor
+ if image then
+ embedimage(image)
+ nofglyphs = nofglyphs + 1
+ local xoffset = (glyph.x or 0) / units
+ local yoffset = (glyph.y or 0) / units
+ local name = f_glyph(nofglyphs)
+ xforms[name] = pdfreference(image.objnum)
+ pdfdata = f_image_xy(width,xoffset,yoffset,name)
+ end
+ end
+ return pdfdata or f_stream(width), width
+ end
+ local function closepng()
+ if filehandle then
+ closefile(filehandle)
+ end
+ pngshapes = nil
+ end
+ local function getresources()
+ return pdfdictionary { XObject = xforms }
+ end
+ return pngshapes, 1, pngtopdf, closepng, getresources
+ end
+ end
+
+ function methods.color(filename,details)
+ local colrshapes = details.properties.indexdata[1]
+ local colrvalues = details.properties.indexdata[2]
+ local usedfonts = { }
+ local function colrtopdf(description,data)
+ -- descriptions by index
+ local colorlist = description.colors
+ if colorlist then
+ local dropdata = data.dropin
+ local dropid = dropdata.properties.id
+ local dropunits = dropdata.parameters.units -- shared
+ local descriptions = dropdata.descriptions
+ usedfonts[dropid] = dropid
+ local w = description.width or 0
+ local s = #colorlist
+ local l = nil
+ local t = { f_width(w) }
+ local n = 1
+ local d = colrvalues[#colrvalues]
+ for i=1,s do
+ local entry = colorlist[i]
+ local v = colrvalues[entry.class] or d
+ if v and l ~= v then
+ n = n + 1 ; t[n] = v
+ l = v
+ end
+ local e = descriptions[entry.slot]
+ if e then
+ n = n + 1 ; t[n] = f_char(dropid,e.index)
+ end
+ end
+ return concat(t," "), w / dropunits
+ end
+ end
+ local function getresources()
+ return lpdf.collectedresources {
+ serialize = false,
+ fonts = usedfonts,
+ fontprefix = "V",
+ }
+ end
+ return colrshapes, 1, colrtopdf, false, getresources
+ end
+
+ mainwriters["type3"] = function(details)
+ local properties = details.properties
+ local basefontname = details.basefontname or properties.name
+ local askedmethod = properties.method or "pk"
+ local method = methods[askedmethod] or methods.pk
+ if not method then
+ return
+ end
+ local glyphs, scalefactor, glyphtopdf, reset, getresources = method(basedfontname,details)
+ if not glyphs then
+ return
+ end
+ local parameters = details.parameters
+ local object = details.objectnumber
+ local factor = parameters.factor -- normally 1
+ local fontmatrix = pdfarray { scalefactor, 0, 0, scalefactor, 0, 0 }
+ local indices,
+ minindex,
+ maxindex = collectindices(details.fontdata.characters,details.indices)
+ local widths = pdfarray()
+ local differences = pdfarray()
+ local charprocs = pdfdictionary()
+ local basefont = pdfconstant(basefontname)
+ local d = 0
+ local w = 0
+ local forcenotdef = minindex > 0
+ local lastindex = -0xFF
+ if forcenotdef then
+ widths[0] = 0
+ minindex = 0
+ lastindex = 0
+ d = 2
+ if not c_notdef then
+ w_notdef = 0
+ c_notdef = pdfconstant(".notdef")
+ r_notdef = pdfreference(pdfflushstreamobject("0 0 d0"))
+ end
+ differences[1] = w_notdef
+ differences[2] = c_notdef
+ charprocs[".notdef"] = r_notdef
+ end
+
+ for i=1,maxindex-minindex+1 do
+ widths[i] = 0
+ end
+
+ for index, data in sortedhash(indices) do
+ local name = f_index(index)
+ local glyph = glyphs[index]
+ if glyph then
+ local stream, width = glyphtopdf(glyph,data)
+ if stream then
+ if index - 1 ~= lastindex then
+ d = d + 1 differences[d] = index
+ end
+ lastindex = index
+ d = d + 1 differences[d] = pdfconstant(name)
+ charprocs[name] = pdfreference(pdfflushstreamobject(stream))
+ widths[index-minindex+1] = width
+ end
+ else
+ report_fonts("missing glyph %i in type3 font %a",index,basefontname)
+ end
+ end
+ if not fontbbox then
+ -- The specification permits zero values and these are actually also more
+ -- robust as then there are no assumptions and no accuracy is needed.
+ fontbbox = pdfarray { 0, 0, 0, 0 }
+ end
+ local encoding = pdfdictionary {
+ Type = pdfconstant("Encoding"),
+ Differences = differences,
+ }
+ local tounicode = tounicodedictionary(details,indices,maxindex,basefontname,false)
+ local resources = getresources and getresources()
+ if not resources or not next(resources) then
+ -- resources = lpdf.procset(true)
+ resources = nil
+ end
+ local descriptor = pdfdictionary {
+ -- most is optional in type3
+ Type = pdfconstant("FontDescriptor"),
+ FontName = basefont,
+ Flags = 4,
+ ItalicAngle = 0,
+ }
+ local parent = pdfdictionary {
+ Type = pdfconstant("Font"),
+ Subtype = pdfconstant("Type3"),
+ Name = basefont,
+ FontBBox = fontbbox,
+ FontMatrix = fontmatrix,
+ CharProcs = pdfreference(pdfflushobject(charprocs)),
+ Encoding = pdfreference(pdfflushobject(encoding)),
+ FirstChar = minindex,
+ LastChar = maxindex,
+ Widths = pdfreference(pdfflushobject(widths)),
+ FontDescriptor = pdfreference(pdfflushobject(descriptor)),
+ Resources = resources,
+ ToUnicode = tounicode and pdfreference(pdfflushstreamobject(tounicode)),
+ }
+ pdfflushobject(object,parent)
+ if reset then
+ reset()
+ end
+ end
+
+ end
+
+end
+
+-- writingmode
+
+local usedfonts = fonts.hashes.identifiers -- for now
+local noffonts = 0
+
+-- The main injector.
+
+-- here we need to test for sharing otherwise we reserve too many
+-- objects
+
+local getstreamhash = fonts.handlers.otf.getstreamhash
+local loadstreamdata = fonts.handlers.otf.loadstreamdata
+
+-- we can actually now number upwards (so not use fontid in /F)
+
+local objects = setmetatableindex(function(t,k)
+ local v
+ if type(k) == "number" then
+ local h = getstreamhash(k)
+ v = rawget(t,h)
+ if not v then
+ v = pdfreserveobject()
+ t[h] = v
+ end
+ if trace_fonts then
+ report_fonts("font id %i bound to hash %s and object %i",k,h,v)
+ end
+ else
+ -- no problem as it can be svg only
+ -- report_fonts("fatal error, hash %s asked but not used",k,h,v)
+ v = pdfreserveobject()
+ t[k] = v
+ end
+ return v
+end)
+
+local n = 0
+
+local names = setmetatableindex(function(t,k)
+ local v
+ if type(k) == "number" then
+ local h = getstreamhash(k)
+ v = rawget(t,h)
+ if not v then
+ n = n + 1
+ v = n
+ t[h] = v
+ end
+ if trace_fonts then
+ report_fonts("font id %i bound to hash %s and name %i",k,h,n)
+ end
+ end
+ t[k] = v
+ return v
+end)
+
+function lpdf.flushfonts()
+
+ local mainfonts = { }
+
+ statistics.starttiming(objects)
+
+ for fontid, used in sortedhash(lpdf.usedcharacters) do
+
+ -- for a bitmap we need a different hash unless we stick to a fixed high
+ -- resolution which makes much sense
+
+ local hash = getstreamhash(fontid)
+ if hash then
+ local parent = mainfonts[hash]
+ if not parent then
+ local fontdata = usedfonts[fontid]
+ local rawdata = fontdata.shared and fontdata.shared.rawdata
+ local resources = fontdata.resources
+ local properties = fontdata.properties -- writingmode and type3
+ local parameters = fontdata.parameters -- used in type3
+ if not rawdata then
+ -- we have a virtual font that loaded directly ... at some point i will
+ -- sort this out (in readanddefine we need to do a bit more) .. the problem
+ -- is that we have a hybrid font then
+ for xfontid, xfontdata in next, fonts.hashes.identifiers do
+ if fontid ~= xfontid then
+ local xhash = getstreamhash(xfontid)
+ if hash == xhash then
+ rawdata = xfontdata.shared and xfontdata.shared.rawdata
+ if rawdata then
+ resources = xfontdata.resources
+ properties = xfontdata.properties
+ parameters = xfontdata.parameters
+ break
+ end
+ end
+ end
+ end
+ end
+ if rawdata then
+ parent = {
+ hash = hash,
+ fontdata = fontdata,
+ filename = resources.filename or properties.filename or "unset",
+ indices = { },
+ rawdata = rawdata,
+ properties = properties, -- we assume consistency
+ parameters = parameters, -- we assume consistency
+ streams = { },
+ objectnumber = objects[hash],
+ basefontname = subsetname(properties.psname or properties.name or "unset"),
+ name = names[hash],
+ }
+ mainfonts[hash] = parent
+ noffonts = noffonts + 1
+ end
+ end
+ if parent then
+ local indices = parent.indices
+ for k in next, used do
+ indices[k] = true
+ end
+ end
+ end
+ end
+
+ -- this is no not yet ok for tfm / type 1 .. we need to move the nested blobs ourside the loop
+
+ for hash, details in sortedhash(mainfonts) do
+ local filename = details.filename
+ if next(details.indices) then
+ if trace_fonts then
+ report_fonts("embedding %a hashed as %a",filename,hash)
+ end
+ local properties = details.properties
+ local bitmap = properties.usedbitmap
+ local method = properties.method -- will be pk | pdf | svg | ...
+ if bitmap or method then
+ local format = "type3"
+ local writer = mainwriters[format]
+ if writer then
+ if trace_fonts then
+ report_fonts("using main writer %a",format)
+ end
+ writer(details)
+ end
+ else
+ local format = properties.format
+ local writer = mainwriters[format]
+ if not writer then
+ -- This will move to the tpk module where we will also deal
+ -- with bitmaps then.
+ local encoding, pfbfile, encfile = getmapentry(filename)
+ if trace_fonts then
+ report_fonts("file %a resolved to encoding %a and file %a",filename,encoding,pfbfile)
+ end
+ if encoding and pfbfile then
+ filename = pfbfile
+ format = "type1"
+ --
+ -- another (temp) hack
+ local size = details.fontdata.parameters.size
+ local factor = details.fontdata.parameters.factor
+ local descriptions = { }
+ local characters = details.fontdata.characters
+ --
+ local names, _, _, metadata = fonts.constructors.handlers.pfb.loadvector(pfbfile)
+ local reverse = table.swapped(names)
+ local vector = encoding.vector
+ local indices = details.indices
+ local remapped = { }
+ local factor = bpfactor * size / 65536
+ for k, v in next, indices do
+ local name = vector[k]
+ local index = reverse[name] or 0
+ local width = factor * (characters[k].width or 0)
+ descriptions[k] = {
+ width = width,
+ index = index,
+ name = name,
+ }
+ remapped[index] = true
+ end
+ details.indices = remapped
+ --
+ details.rawdata.descriptions = descriptions
+ details.filename = filename
+ details.rawdata.metadata = { }
+ --
+ properties.filename = filename
+ properties.format = format
+ writer = mainwriters[format]
+ end
+ end
+ if not writer then
+ local pfbfile = file.replacesuffix(filename,"pfb")
+ if encoding and pfbfile then
+ filename = pfbfile
+ format = "type1"
+ --
+ -- another (temp) hack
+ local size = details.fontdata.parameters.size
+ local factor = details.fontdata.parameters.factor
+ local descriptions = { }
+ local characters = details.fontdata.characters
+ --
+ local names, _, _, metadata = fonts.constructors.handlers.pfb.loadvector(pfbfile)
+ local reverse = table.swapped(names)
+ local vector = encoding.vector
+ local indices = details.indices
+ local remapped = { }
+ local factor = bpfactor * size / 65536
+ for k, v in next, indices do
+ local name = vector[k]
+ local index = reverse[name] or 0
+ local width = factor * (characters[k].width or 0)
+ descriptions[k] = {
+ width = width,
+ index = index,
+ name = name,
+ }
+ remapped[index] = true
+ end
+ details.indices = remapped
+ --
+ details.rawdata.descriptions = descriptions
+ details.filename = filename
+ details.rawdata.metadata = { }
+ --
+ properties.filename = filename
+ properties.format = format
+ writer = mainwriters[format]
+ end
+ end
+ if writer then
+ if trace_fonts then
+ report_fonts("using main writer %a",format)
+ end
+ -- better move this test to the writers .. cleaner
+ local streams = loadstreamdata(details.fontdata)
+ if streams and streams.fontheader and streams.names then
+ details.streams = streams
+ writer(details)
+ details.streams = { }
+ elseif trace_fonts then
+ -- can be ok for e.g. emoji
+ report_fonts("no streams in %a",filename)
+ end
+ -- free some memory
+ else -- if trace_fonts then
+ report_fonts("no %a writer for %a",format,filename)
+ end
+ end
+ else -- not problem for svg ...
+ -- report_fonts("no indices for %a",filename)
+ end
+ if trace_fonts then
+ report_fonts("embedded indices: % t",table.sortedkeys(details.indices))
+ end
+ mainfonts[details.hash] = false -- done
+ end
+
+ statistics.stoptiming(objects)
+
+end
+
+statistics.register("font embedding time",function()
+ if noffonts > 0 then
+ return format("%s seconds, %s fonts", statistics.elapsedtime(objects),noffonts)
+ end
+end)
+
+-- this is temporary
+
+local done = false
+
+updaters.register("backend.update.pdf",function()
+ if not done then
+ function pdf.getfontobjnum (k) return objects[k] end
+ function pdf.getfontname (k) return names [k] end
+ function pdf.includechar () end -- maybe, when we need it
+ function pdf.includefont () end -- maybe, when we need it
+ function pdf.includecharlist () end -- maybe, when we need it
+ function pdf.setomitcidset (v) includecidset = not toboolean(v) end
+ function pdf.setomitcharset () end -- we don't need that in lmtx
+ function pdf.setsuppressoptionalinfo() end -- we don't need that in lmtx
+ function pdf.mapfile (n) loadmapfile(n) end
+ function pdf.mapline (n) loadmapline(n) end
+ -- this will change
+ lpdf.registerdocumentfinalizer(lpdf.flushfonts,1,"wrapping up fonts")
+ done = true
+ end
+end)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-eng.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-eng.lua
new file mode 100644
index 00000000000..21c7e66e999
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-eng.lua
@@ -0,0 +1,96 @@
+if not modules then modules = { } end modules ['lpdf-eng'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Here we plug in the regular luatex image handler. The low level module itself
+-- is hidden from the user.
+
+local codeinjections = backends.pdf.codeinjections
+local imgnew = img.new
+
+function codeinjections.newimage(specification)
+ if type(specification) == "table" then
+ specification.kind = nil
+ end
+ return imgnew(specification)
+end
+
+codeinjections.copyimage = img.copy
+codeinjections.scanimage = img.scan
+codeinjections.embedimage = img.immediatewrite
+codeinjections.wrapimage = img.node
+
+-- We cannot nil the img table because the backend code explicitly accesses the
+-- new field when dealing with virtual characters. I should patch luatex for that
+-- and maybe I will. So no:
+--
+-- img = nil
+--
+-- We keep the low level img.new function but make the rest kind of unseen. At some
+-- point the other ones will be gone and one has to use the images.* wrappers.
+
+local unpack = unpack
+local sortedkeys = table.sortedkeys
+local context = context
+
+img = table.setmetatableindex (
+ {
+ new = images.create,
+ },
+ {
+ -- new = images.create,
+ scan = images.scan,
+ copy = images.copy,
+ node = images.wrap,
+ write = function(specification) context(images.wrap(specification)) end,
+ immediatewrite = images.embed,
+ immediatewriteobject = function() end, -- not upported, experimental anyway
+ boxes = function() return sortedkeys(images.sizes) end,
+ fields = function() return images.keys end,
+ types = function() return { unpack(images.types,0,#images.types) } end,
+ }
+)
+
+--
+
+do
+
+ local function prepare(driver)
+ if not environment.initex then
+ -- install new functions in pdf namespace
+ updaters.apply("backend.update.pdf")
+ -- install new functions in lpdf namespace
+ updaters.apply("backend.update.lpdf")
+ -- adapt existing shortcuts to lpdf namespace
+ updaters.apply("backend.update.tex")
+ -- adapt existing shortcuts to tex namespace
+ updaters.apply("backend.update")
+ --
+ end
+ end
+
+ local function outputfilename(driver)
+ if not filename then
+ filename = addsuffix(tex.jobname,"pdf")
+ end
+ return filename
+ end
+
+ drivers.install {
+ name = "pdf",
+ flushers = {
+ -- nothing here
+ },
+ actions = {
+ convert = drivers.converters.engine,
+ outputfilename = outputfilename,
+ prepare = prepare,
+ },
+ }
+
+end
+
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-epa.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-epa.lua
index 570d738817f..45000aebc75 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-epa.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-epa.lua
@@ -31,7 +31,6 @@ local report_field = logs.reporter("backend","field")
local report_outline = logs.reporter("backend","outline")
local lpdf = lpdf
-local epdf = epdf
local backends = backends
local context = context
@@ -73,7 +72,7 @@ local maxdimen = 0x3FFFFFFF -- 2^30-1
local bpfactor = number.dimenfactors.bp
-local layerspec = { -- predefining saves time
+local layerspec = {
"epdfcontent"
}
@@ -144,11 +143,18 @@ end
local layerused = false
+-- local function initializelayer(height,width)
+-- if not layerused then
+-- context.definelayer(layerspec, { height = height .. "bp", width = width .. "bp" })
+-- layerused = true
+-- end
+-- end
+
local function initializelayer(height,width)
- if not layerused then
- context.definelayer(layerspec, { height = height .. "bp", width = width .. "bp" })
+-- if not layerused then
+ context.setuplayer(layerspec, { height = height .. "bp", width = width .. "bp" })
layerused = true
- end
+-- end
end
function codeinjections.flushmergelayer()
@@ -295,6 +301,12 @@ function codeinjections.mergereferences(specification)
if annotation.Subtype == "Link" then
local a = annotation.A
if not a then
+ local d = annotation.Dest
+ if d then
+ annotation.A = { S = "GoTo", D = d } -- no need for a dict
+ end
+ end
+ if not a then
report_link("missing link annotation")
else
local x, y, w, h = getdimensions(annotation,llx,lly,xscale,yscale,width,height,report_link)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-epd.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-epd.lua
deleted file mode 100644
index 86aa6f29445..00000000000
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-epd.lua
+++ /dev/null
@@ -1,1313 +0,0 @@
-if not modules then modules = { } end modules ['lpdf-epd'] = {
- version = 1.001,
- comment = "companion to lpdf-epa.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- This is an experimental layer around the epdf library. The reason for this layer is that
--- I want to be independent of the library (which implements a selection of what a file
--- provides) and also because I want an interface closer to Lua's table model while the API
--- stays close to the original xpdf library. Of course, after prototyping a solution, we can
--- optimize it using the low level epdf accessors. However, not all are accessible (this will
--- be fixed).
---
--- It will be handy when we have a __length and __next that can trigger the resolve till then
--- we will provide .n as #; maybe in Lua 5.3 or later.
---
--- As there can be references to the parent we cannot expand a tree. I played with some
--- expansion variants but it does not pay off; adding extra checks is not worth the trouble.
---
--- The document stays open. In order to free memory one has to explicitly unload the loaded
--- document.
---
--- We have much more checking then needed in the prepare functions because occasionally
--- we run into bugs in poppler or the epdf interface. It took us a while to realize that
--- there was a long standing gc issue the on long runs with including many pages could
--- crash the analyzer.
---
--- Normally a value is fetched by key, as in foo.Title but as it can be in pdfdoc encoding
--- a safer bet is foo("Title") which will return a decoded string (or the original if it
--- already was unicode).
-
-local setmetatable, rawset, rawget, type, next = setmetatable, rawset, rawget, type, next
-local tostring, tonumber, unpack = tostring, tonumber, unpack
-local lower, match, char, byte, find = string.lower, string.match, string.char, string.byte, string.find
-local abs = math.abs
-local concat = table.concat
-local toutf, toeight, utfchar = string.toutf, utf.toeight, utf.char
-local setmetatableindex = table.setmetatableindex
-
-local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
-local P, C, S, R, Ct, Cc, V, Carg, Cs, Cf, Cg = lpeg.P, lpeg.C, lpeg.S, lpeg.R, lpeg.Ct, lpeg.Cc, lpeg.V, lpeg.Carg, lpeg.Cs, lpeg.Cf, lpeg.Cg
-
-local epdf = epdf
- lpdf = lpdf or { }
-local lpdf = lpdf
-local lpdf_epdf = { }
-lpdf.epdf = lpdf_epdf
-
--- local getDict, getArray, getReal, getNum, getString, getBool, getName, getRef, getRefNum
--- local getType, getTypeName
--- local dictGetLength, dictGetVal, dictGetValNF, dictGetKey
--- local arrayGetLength, arrayGetNF, arrayGet
--- local streamReset, streamGetDict, streamGetChar
-
--- We use as little as possible and also not an object interface. After all, we
--- don't know how the library (and its api) evolves so we better can be prepared
--- for wrappers.
-
-local registry = debug.getregistry()
-
-local object = registry["epdf.Object"]
-local dictionary = registry["epdf.Dict"]
-local array = registry["epdf.Array"]
-local xref = registry["epdf.XRef"]
-local catalog = registry["epdf.Catalog"]
-local pdfdoc = registry["epdf.PDFDoc"]
-
-if not (object and dictionary and array and xref and catalog and pdfdoc) then
- logs.report("fatal error","invalid pdf inclusion library (%s)",1)
- os.exit()
-end
-
-local openPDF = epdf.open
-
-local getMajorVersion = pdfdoc.getPDFMajorVersion
-local getMinorVersion = pdfdoc.getPDFMinorVersion
-local getXRef = pdfdoc.getXRef
-local getRawCatalog = pdfdoc.getCatalog
-
-if not (openPDF and getMajorVersion and getMinorVersion and getXRef and getRawCatalog) then
- logs.report("fatal error","invalid pdf inclusion library (%s)",2)
- os.exit()
-end
-
-local getDict = object.getDict
-local getArray = object.getArray
-local getReal = object.getReal
-local getInt = object.getInt
-local getString = object.getString
-local getBool = object.getBool
-local getName = object.getName
-local getRef = object.getRef
-local getRefNum = object.getRefNum
-
-local getType = object.getType
-
-if not (getDict and getArray and getReal and getInt and getString and getBool and getName and getRef and getRefNum and getType) then
- logs.report("fatal error","invalid pdf inclusion library (%s)",3)
- os.exit()
-end
-
-local streamReset = object.streamReset
-local streamGetDict = object.streamGetDict
-local streamGetChar = object.streamGetChar
-local streamGetAll = object.streamGetAll
-
-if not (streamReset and streamGetDict and streamGetChar) then
- logs.report("fatal error","invalid pdf inclusion library (%s)",3)
- os.exit()
-end
-
-local dictGetLength = dictionary.getLength
-local dictGetVal = dictionary.getVal
-local dictGetValNF = dictionary.getValNF
-local dictGetKey = dictionary.getKey
-
-if not (dictGetLength and dictGetVal and dictGetValNF and dictGetKey) then
- logs.report("fatal error","invalid pdf inclusion library (%s)",4)
- os.exit()
-end
-
-local arrayGetLength = array.getLength
-local arrayGetNF = array.getNF
-local arrayGet = array.get
-
-if not (arrayGetLength and arrayGetNF and arrayGet) then
- logs.report("fatal error","invalid pdf inclusion library (%s)",5)
- os.exit()
-end
-
--- these are kind of weird as they can't be accessed by (root) object
-
-local getNumPages = catalog.getNumPages
-local getPageRef = catalog.getPageRef
-
-local fetch = xref.fetch
-local getCatalog = xref.getCatalog
-local getDocInfo = xref.getDocInfo
-
-if not (getNumPages and getPageRef and fetch and getCatalog and getDocInfo) then
- logs.report("fatal error","invalid pdf inclusion library (%s)",6)
- os.exit()
-end
-
--- we're done with library shortcuts
-
-local typenames = { [0] =
- "boolean",
- "integer",
- "real",
- "string",
- "name",
- "null",
- "array",
- "dictionary",
- "stream",
- "ref",
- "cmd",
- "error",
- "eof",
- "none",
- "integer64",
-}
-
-local typenumbers = table.swapped(typenames)
-
-local null_object_code = typenumbers.null
-local ref_object_code = typenumbers.ref
-
-local report_epdf = logs.reporter("epdf")
-
-local function fatal_error(...)
- report_epdf(...)
- report_epdf("aborting job in order to avoid crash")
- os.exit()
-end
-
--- epdf is the built-in library
-
-function epdf.type(o)
- local t = lower(match(tostring(o),"[^ :]+"))
- return t or "?"
-end
-
-local checked_access
-
--- dictionaries (can be optimized: ... resolve and redefine when all locals set)
-
-local frompdfdoc = lpdf.frompdfdoc
-
-local get_flagged
-
-if lpdf.dictionary then
-
- local pdfdictionary = lpdf.dictionary
- local pdfarray = lpdf.array
- local pdfconstant = lpdf.constant
- local pdfstring = lpdf.string
- local pdfunicode = lpdf.unicode
-
- get_flagged = function(t,f,k)
- local tk = t[k] -- triggers resolve
- local fk = f[k]
- if not fk then
- return tk
- elseif fk == "name" then
- return pdfconstant(tk)
- elseif fk == "array" then
- return pdfarray(tk)
- elseif fk == "dictionary" then
- return pdfarray(tk)
- elseif fk == "rawtext" then
- return pdfstring(tk)
- elseif fk == "unicode" then
- return pdfunicode(tk)
- else
- return tk
- end
- end
-
-else
-
- get_flagged = function(t,f,k)
- local tk = t[k] -- triggers resolve
- local fk = f[k]
- if not fk then
- return tk
- elseif fk == "rawtext" then
- return frompdfdoc(tk)
- else
- return tk
- end
- end
-
-end
-
-local function prepare(document,d,t,n,k,mt,flags)
- for i=1,n do
- local v = dictGetVal(d,i)
- if v then
- local r = dictGetValNF(d,i)
- local kind = getType(v)
- if kind == null_object_code then
- -- ignore
- elseif kind then
- local key = dictGetKey(d,i)
- if r and getType(r) == ref_object_code then
- local objnum = getRefNum(r)
- local cached = document.__cache__[objnum]
- if not cached then
- cached = checked_access[kind](v,document,objnum,mt)
- if cached then
- document.__cache__[objnum] = cached
- document.__xrefs__[cached] = objnum
- end
- end
- t[key] = cached
- else
- local v, flag = checked_access[kind](v,document)
- t[key] = v
- if flag and flags then
- flags[key] = flag -- flags
- end
- end
- else
- report_epdf("warning: nil value for key %a in dictionary",key)
- end
- else
- fatal_error("error: invalid value at index %a in dictionary of %a",i,document.filename)
- end
- end
- if mt then
- setmetatable(t,mt)
- else
- getmetatable(t).__index = nil
- end
- return t[k]
-end
-
--- local function prepare(document,d,t,n,k,mt,flags)
--- for i=1,n do
--- local v = dictGetValNF(d,i)
--- if v then
--- local key = dictGetKey(d,i)
--- local kind = getType(v)
--- if kind == ref_object_code then
--- local objnum = getRefNum(v)
--- local cached = document.__cache__[objnum]
--- if not cached then
--- local v = dictGetVal(d,i)
--- local kind = getType(v)
--- cached = checked_access[kind](v,document,objnum,mt)
--- if cached then
--- document.__cache__[objnum] = cached
--- document.__xrefs__[cached] = objnum
--- end
--- end
--- t[key] = cached
--- else
--- local v, flag = checked_access[kind](v,document)
--- t[key] = v
--- if flag and flags then
--- flags[key] = flag -- flags
--- end
--- end
--- end
--- end
--- if mt then
--- setmetatable(t,mt)
--- else
--- getmetatable(t).__index = nil
--- end
--- return t[k]
--- end
-
-local function some_dictionary(d,document)
- local n = d and dictGetLength(d) or 0
- if n > 0 then
- local t = { }
- local f = { }
- setmetatable(t, {
- __index = function(t,k)
- return prepare(document,d,t,n,k,_,_,f)
- end,
- __call = function(t,k)
- return get_flagged(t,f,k)
- end,
- -- __kind = function(k)
- -- return f[k] or type(t[k])
- -- end,
- } )
- return t, "dictionary"
- end
-end
-
-local function get_dictionary(object,document,r,mt)
- local d = getDict(object)
- local n = d and dictGetLength(d) or 0
- if n > 0 then
- local t = { }
- local f = { }
- setmetatable(t, {
- __index = function(t,k)
- return prepare(document,d,t,n,k,mt,f)
- end,
- __call = function(t,k)
- return get_flagged(t,f,k)
- end,
- -- __kind = function(k)
- -- return f[k] or type(t[k])
- -- end,
- } )
- return t, "dictionary"
- end
-end
-
--- arrays (can be optimized: ... resolve and redefine when all locals set)
-
-local function prepare(document,a,t,n,k)
- for i=1,n do
- local v = arrayGet(a,i)
- if v then
- local kind = getType(v)
- if kind == null_object_code then
- -- ignore
- elseif kind then
- local r = arrayGetNF(a,i)
- if r and getType(r) == ref_object_code then
- local objnum = getRefNum(r)
- local cached = document.__cache__[objnum]
- if not cached then
- cached = checked_access[kind](v,document,objnum)
- document.__cache__[objnum] = cached
- document.__xrefs__[cached] = objnum
- end
- t[i] = cached
- else
- t[i] = checked_access[kind](v,document)
- end
- else
- report_epdf("warning: nil value for index %a in array",i)
- end
- else
- fatal_error("error: invalid value at index %a in array of %a",i,document.filename)
- end
- end
- local m = getmetatable(t)
- if m then
- m.__index = nil
- m.__len = nil
- end
- if k then
- return t[k]
- end
-end
-
--- local function prepare(document,a,t,n,k)
--- for i=1,n do
--- local v = arrayGetNF(a,i)
--- if v then
--- local kind = getType(v)
--- if kind == ref_object_code then
--- local objnum = getRefNum(v)
--- local cached = document.__cache__[objnum]
--- if not cached then
--- local v = arrayGet(a,i)
--- local kind = getType(v)
--- cached = checked_access[kind](v,document,objnum)
--- document.__cache__[objnum] = cached
--- document.__xrefs__[cached] = objnum
--- end
--- t[i] = cached
--- else
--- t[i] = checked_access[kind](v,document)
--- end
--- end
--- end
--- local m = getmetatable(t)
--- if m then
--- m.__index = nil
--- m.__len = nil
--- end
--- if k then
--- return t[k]
--- end
--- end
-
-local function some_array(a,document)
- local n = a and arrayGetLength(a) or 0
- if n > 0 then
- local t = { n = n }
- setmetatable(t, {
- __index = function(t,k)
- return prepare(document,a,t,n,k,_,_,f)
- end,
- __len = function(t)
- prepare(document,a,t,n,_,_,f)
- return n
- end,
- __call = function(t,k)
- return get_flagged(t,f,k)
- end,
- -- __kind = function(k)
- -- return f[k] or type(t[k])
- -- end,
- } )
- return t, "array"
- end
-end
-
-local function get_array(object,document)
- local a = getArray(object)
- local n = a and arrayGetLength(a) or 0
- if n > 0 then
- local t = { n = n }
- local f = { }
- setmetatable(t, {
- __index = function(t,k)
- return prepare(document,a,t,n,k,_,_,f)
- end,
- __len = function(t)
- prepare(document,a,t,n,_,_,f)
- return n
- end,
- __call = function(t,k)
- return get_flagged(t,f,k)
- end,
- -- __kind = function(k)
- -- return f[k] or type(t[k])
- -- end,
- } )
- return t, "array"
- end
-end
-
--- todo: collect chunks
-
--- local function streamaccess(s,_,what)
--- if not what or what == "all" or what == "*all" then
--- local t, n = { }, 0
--- streamReset(s)
--- while true do
--- local c = streamGetChar(s)
--- if c < 0 then
--- break
--- else
--- n = n + 1
--- t[n] = char(c)
--- end
--- end
--- return concat(t,"",1,n)
--- end
--- end
-
-local function getstream(s)
- streamReset(s)
- if streamGetAll then
- return streamGetAll(s)
- else
- local t, b, n = { }, { }, 0
- while true do
- local c = streamGetChar(s)
- if c < 0 then
- break
- else
- n = n + 1
- b[n] = c
- end
- if n == 2000 then
- t[#t+1] = char(unpack(b,1,n))
- n = 1
- end
- end
- t[#t+1] = char(unpack(b,1,n))
- return concat(t)
- end
-end
-
-local function streamaccess(s,_,what)
- if not what or what == "all" or what == "*all" then
- return getstream(s)
- end
-end
-
-local function get_stream(d,document)
- if d then
- streamReset(d)
- local s = some_dictionary(streamGetDict(d),document)
- getmetatable(s).__call = function(...) return streamaccess(d,...) end
- return s
- end
-end
-
--- We need to convert the string from utf16 although there is no way to
--- check if we have a regular string starting with a bom. So, we have
--- na dilemma here: a pdf doc encoded string can be invalid utf.
-
--- <hex encoded> : implicit 0 appended if odd
--- (byte encoded) : \( \) \\ escaped
---
--- <FE><FF> : utf16be
---
--- \r \r \t \b \f \( \) \\ \NNN and \<newline> : append next line
---
--- the getString function gives back bytes so we don't need to worry about
--- the hex aspect.
-
-local u_pattern = lpeg.patterns.utfbom_16_be * lpeg.patterns.utf16_to_utf8_be
------ b_pattern = lpeg.patterns.hextobytes
-
-local function get_string(v)
- -- the toutf function only converts a utf16 string and leaves the original
- -- untouched otherwise; one might want to apply lpdf.frompdfdoc to a
- -- non-unicode string
- local s = getString(v)
- if not s or s == "" then
- return ""
- end
- local u = lpegmatch(u_pattern,s)
- if u then
- return u, "unicode"
- end
- -- this is too tricky and fails on e.g. reload of url www.pragma-ade.com)
- -- local b = lpegmatch(b_pattern,s)
- -- if b then
- -- return b, "rawtext"
- -- end
- return s, "rawtext"
-end
-
-local function get_name(v)
- return getName(v), "name"
-end
-
-local function get_null()
- return nil
-end
-
--- we have dual access: by typenumber and by typename
-
-local function invalidaccess(k,document)
- local fullname = type(document) == "table" and document.fullname
- if fullname then
- fatal_error("error, asking for key %a in checker of %a",k,fullname)
- else
- fatal_error("error, asking for key %a in checker",k)
- end
-end
-
-checked_access = setmetatableindex(function(t,k)
- return function(v,document)
- invalidaccess(k,document)
- end
-end)
-
-checked_access[typenumbers.boolean] = getBool
-checked_access[typenumbers.integer] = getInt
-checked_access[typenumbers.real] = getReal
-checked_access[typenumbers.string] = get_string -- getString
-checked_access[typenumbers.name] = get_name
-checked_access[typenumbers.null] = get_null
-checked_access[typenumbers.array] = get_array -- d,document,r
-checked_access[typenumbers.dictionary] = get_dictionary -- d,document,r
-checked_access[typenumbers.stream] = get_stream
-checked_access[typenumbers.ref] = getRef
-
-for i=0,#typenames do
- local checker = checked_access[i]
- if not checker then
- checker = function()
- return function(v,document)
- invalidaccess(i,document)
- end
- end
- checked_access[i] = checker
- end
- checked_access[typenames[i]] = checker
-end
-
-local function getnames(document,n,target) -- direct
- if n then
- local Names = n.Names
- if Names then
- if not target then
- target = { }
- end
- for i=1,Names.n,2 do
- target[Names[i]] = Names[i+1]
- end
- else
- local Kids = n.Kids
- if Kids then
- for i=1,Kids.n do
- target = getnames(document,Kids[i],target)
- end
- end
- end
- return target
- end
-end
-
-local function getkids(document,n,target) -- direct
- if n then
- local Kids = n.Kids
- if Kids then
- for i=1,Kids.n do
- target = getkids(document,Kids[i],target)
- end
- elseif target then
- target[#target+1] = n
- else
- target = { n }
- end
- return target
- end
-end
-
--- /OCProperties <<
--- /OCGs [ 15 0 R 17 0 R 19 0 R 21 0 R 23 0 R 25 0 R 27 0 R ]
--- /D <<
--- /Order [ 15 0 R 17 0 R 19 0 R 21 0 R 23 0 R 25 0 R 27 0 R ]
--- /ON [ 15 0 R 17 0 R 19 0 R 21 0 R 23 0 R 25 0 R 27 0 R ]
--- /OFF [ ]
--- >>
--- >>
-
-local function getlayers(document)
- local properties = document.Catalog.OCProperties
- if properties then
- local layers = properties.OCGs
- if layers then
- local t = { }
- local n = layers.n
- for i=1,n do
- local layer = layers[i]
- t[i] = layer.Name
- end
- t.n = n
- return t
- end
- end
-end
-
-local function getstructure(document)
- -- this might become a tree
- return document.Catalog.StructTreeRoot
-end
-
--- This is the only messy helper. We can't access the root as any object (it seems)
--- so we need a few low level acessors. It's anyway sort of simple enough to deal
--- with but it won't win a beauty contest.
-
-local function getpages(document,Catalog)
- local __data__ = document.__data__
- local __xrefs__ = document.__xrefs__
- local __cache__ = document.__cache__
- local __xref__ = document.__xref__
- --
- local rawcatalog = getRawCatalog(__data__)
- local nofpages = getNumPages(rawcatalog)
- --
- local majorversion = getMajorVersion(__data__)
- local minorversion = getMinorVersion(__data__)
- --
- local pages = { }
- local metatable = { __index = Catalog.Pages } -- somewhat empty
- --
- for pagenumber=1,nofpages do
- local pagereference = getPageRef(rawcatalog,pagenumber).num
- local pageobject = fetch(__xref__,pagereference,0)
- local pagedata = get_dictionary(pageobject,document,pagereference,metatable)
- if pagedata then
- -- rawset(pagedata,"number",pagenumber)
- pagedata.number = pagenumber
- pagedata.object = pageobject
- pages[pagenumber] = pagedata
- __xrefs__[pagedata] = pagereference
- __cache__[pagereference] = pagedata
- else
- report_epdf("missing pagedata at slot %i",i)
- end
- end
- --
- pages.n = nofpages
- --
- document.pages = pages
- document.majorversion = majorversion
- document.minorversion = minorversion
- --
- return pages
-end
-
-local function resolve(document,k)
- local entry = nil
- local Catalog = document.Catalog
- local Names = Catalog.Names
- if k == "pages" then
- entry = getpages(document,Catalog)
- elseif k == "destinations" then
- entry = getnames(document,Names and Names.Dests)
- elseif k == "javascripts" then
- entry = getnames(document,Names and Names.JS)
- elseif k == "widgets" then
- entry = getnames(document,Names and Names.AcroForm)
- elseif k == "embeddedfiles" then
- entry = getnames(document,Names and Names.EmbeddedFiles)
- elseif k == "layers" then
- entry = getlayers(document)
- elseif k == "structure" then
- entry = getstructure(document)
- end
- document[k] = entry
- return entry
-end
-
-local loaded = { }
-
-function lpdf_epdf.load(filename)
- local document = loaded[filename]
- if not document then
- statistics.starttiming(lpdf_epdf)
- local __data__ = openPDF(filename) -- maybe resolvers.find_file
- if __data__ then
- local __xref__ = getXRef(__data__)
- document = {
- filename = filename,
- __cache__ = { },
- __xrefs__ = { },
- __fonts__ = { },
- __data__ = __data__,
- __xref__ = __xref__
- }
- document.Catalog = some_dictionary(getDict(getCatalog(__xref__)),document)
- document.Info = some_dictionary(getDict(getDocInfo(__xref__)),document)
- setmetatableindex(document,resolve)
- --
- document.nofpages = getNumPages(getRawCatalog(__data__))
- else
- document = false
- end
- loaded[filename] = document
- loaded[document] = document
- statistics.stoptiming(lpdf_epdf)
- -- print(statistics.elapsedtime(lpdf_epdf))
- end
- return document or nil
-end
-
-function lpdf_epdf.unload(filename)
- local document = loaded[filename]
- if document then
- loaded[document] = nil
- loaded[filename] = nil
- end
-end
-
--- for k, v in next, expand(t) do
-
-local function expand(t)
- if type(t) == "table" then
- local dummy = t.dummy
- end
- return t
-end
-
--- for k, v in expanded(t) do
-
-local function expanded(t)
- if type(t) == "table" then
- local dummy = t.dummy
- end
- return next, t
-end
-
-lpdf_epdf.expand = expand
-lpdf_epdf.expanded = expanded
-
--- we could resolve the text stream in one pass if we directly handle the
--- font but why should we complicate things
-
-local hexdigit = R("09","AF")
-local numchar = ( P("\\") * ( (R("09")^3/tonumber) + C(1) ) ) + C(1)
-local number = lpegpatterns.number / tonumber
-local spaces = lpegpatterns.whitespace^1
-local optspaces = lpegpatterns.whitespace^0
-local keyword = P("/") * C(R("AZ","az","09")^1)
-local operator = C((R("AZ","az")+P("'")+P('"'))^1)
-
-local grammar = P { "start",
- start = (keyword + number + V("dictionary") + V("unicode") + V("string") + V("unicode")+ V("array") + spaces)^1,
- -- keyvalue = (keyword * spaces * V("start") + spaces)^1,
- keyvalue = optspaces * Cf(Ct("") * Cg(keyword * optspaces * V("start") * optspaces)^1,rawset),
- array = P("[") * Ct(V("start")^1) * P("]"),
- dictionary = P("<<") * V("keyvalue") * P(">>"),
- unicode = P("<") * Ct(Cc("hex") * C((1-P(">"))^1)) * P(">"),
- string = P("(") * Ct(Cc("dec") * C((V("string")+numchar)^1)) * P(")"), -- untested
-}
-
-local operation = Ct(grammar^1 * operator)
-local parser = Ct((operation + P(1))^1)
-
--- beginbfrange : <start> <stop> <firstcode>
--- <start> <stop> [ <firstsequence> <firstsequence> <firstsequence> ]
--- beginbfchar : <code> <newcodes>
-
-local fromsixteen = lpdf.fromsixteen -- maybe inline the lpeg ... but not worth it
-
-local function f_bfchar(t,a,b)
- t[tonumber(a,16)] = fromsixteen(b)
-end
-
-local function f_bfrange_1(t,a,b,c)
- print("todo 1",a,b,c)
- -- c is string
- -- todo t[tonumber(a,16)] = fromsixteen(b)
-end
-
-local function f_bfrange_2(t,a,b,c)
- print("todo 2",a,b,c)
- -- c is table
- -- todo t[tonumber(a,16)] = fromsixteen(b)
-end
-
-local optionals = spaces^0
-local hexstring = optionals * P("<") * C((1-P(">"))^1) * P(">")
-local bfchar = Carg(1) * hexstring * hexstring / f_bfchar
-local bfrange = Carg(1) * hexstring * hexstring * hexstring / f_bfrange_1
- + Carg(1) * hexstring * hexstring * optionals * P("[") * Ct(hexstring^1) * optionals * P("]") / f_bfrange_2
-local fromunicode = (
- P("beginbfchar" ) * bfchar ^1 * optionals * P("endbfchar" ) +
- P("beginbfrange") * bfrange^1 * optionals * P("endbfrange") +
- spaces +
- P(1)
-)^1 * Carg(1)
-
-local function analyzefonts(document,resources) -- unfinished, see mtx-pdf for better code
- local fonts = document.__fonts__
- if resources then
- local fontlist = resources.Font
- if fontlist then
- for id, data in expanded(fontlist) do
- if not fonts[id] then
- -- a quick hack ... I will look into it more detail if I find a real
- -- -application for it
- local tounicode = data.ToUnicode()
- if tounicode then
- tounicode = lpegmatch(fromunicode,tounicode,1,{})
- end
- fonts[id] = {
- tounicode = type(tounicode) == "table" and tounicode or { }
- }
- setmetatableindex(fonts[id],"self")
- end
- end
- end
- end
- return fonts
-end
-
-local more = 0
-local unic = nil -- cheaper than passing each time as Carg(1)
-
-local p_hex_to_utf = C(4) / function(s) -- needs checking !
- local now = tonumber(s,16)
- if more > 0 then
- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong
- more = 0
- return unic[now] or utfchar(now)
- elseif now >= 0xD800 and now <= 0xDBFF then
- more = now
- -- return ""
- else
- return unic[now] or utfchar(now)
- end
-end
-
-local p_dec_to_utf = C(1) / function(s) -- needs checking !
- local now = byte(s)
- return unic[now] or utfchar(now)
-end
-
-local p_hex_to_utf = P(true) / function() more = 0 end * Cs(p_hex_to_utf^1)
-local p_dec_to_utf = P(true) / function() more = 0 end * Cs(p_dec_to_utf^1)
-
-function lpdf_epdf.getpagecontent(document,pagenumber)
-
- local page = document.pages[pagenumber]
-
- if not page then
- return
- end
-
- local fonts = analyzefonts(document,page.Resources)
-
- local content = page.Contents() or ""
- local list = lpegmatch(parser,content)
- local font = nil
- -- local unic = nil
-
- for i=1,#list do
- local entry = list[i]
- local size = #entry
- local operator = entry[size]
- if operator == "Tf" then
- font = fonts[entry[1]]
- unic = font.tounicode
- elseif operator == "TJ" then -- { array, TJ }
- local list = entry[1]
- for i=1,#list do
- local li = list[i]
- if type(li) == "table" then
- if li[1] == "hex" then
- list[i] = lpegmatch(p_hex_to_utf,li[2])
- else
- list[i] = lpegmatch(p_dec_to_utf,li[2])
- end
- else
- -- kern
- end
- end
- elseif operator == "Tj" or operator == "'" or operator == '"' then -- { string, Tj } { string, ' } { n, m, string, " }
- local list = entry[size-1]
- if list[1] == "hex" then
- list[2] = lpegmatch(p_hex_to_utf,li[2])
- else
- list[2] = lpegmatch(p_dec_to_utf,li[2])
- end
- end
- end
-
- unic = nil -- can be collected
-
- return list
-
-end
-
--- This is also an experiment. When I really need it I can improve it, for instance
--- with proper position calculating. It might be usefull for some search or so.
-
-local softhyphen = utfchar(0xAD) .. "$"
-local linefactor = 1.3
-
-function lpdf_epdf.contenttotext(document,list) -- maybe signal fonts
- local last_y = 0
- local last_f = 0
- local text = { }
- local last = 0
-
- for i=1,#list do
- local entry = list[i]
- local size = #entry
- local operator = entry[size]
- if operator == "Tf" then
- last_f = entry[2]
- elseif operator == "TJ" then
- local list = entry[1]
- for i=1,#list do
- local li = list[i]
- if type(li) == "string" then
- last = last + 1
- text[last] = li
- elseif li < -50 then
- last = last + 1
- text[last] = " "
- end
- end
- line = concat(list)
- elseif operator == "Tj" then
- last = last + 1
- text[last] = entry[size-1]
- elseif operator == "cm" or operator == "Tm" then
- local ty = entry[6]
- local dy = abs(last_y - ty)
- if dy > linefactor*last_f then
- if last > 0 then
- if find(text[last],softhyphen,1,true) then
- -- ignore
- else
- last = last + 1
- text[last] = "\n"
- end
- end
- end
- last_y = ty
- end
- end
-
- return concat(text)
-end
-
-function lpdf_epdf.getstructure(document,list) -- just a test
- local depth = 0
- for i=1,#list do
- local entry = list[i]
- local size = #entry
- local operator = entry[size]
- if operator == "BDC" then
- report_epdf("%w%s : %s",depth,entry[1] or "?",entry[2].MCID or "?")
- depth = depth + 1
- elseif operator == "EMC" then
- depth = depth - 1
- elseif operator == "TJ" then
- local list = entry[1]
- for i=1,#list do
- local li = list[i]
- if type(li) == "string" then
- report_epdf("%w > %s",depth,li)
- elseif li < -50 then
- report_epdf("%w >",depth,li)
- end
- end
- elseif operator == "Tj" then
- report_epdf("%w > %s",depth,entry[size-1])
- end
- end
-end
-
--- document.Catalog.StructTreeRoot.ParentTree.Nums[2][1].A.P[1])
-
--- helpers
-
--- function lpdf_epdf.getdestinationpage(document,name)
--- local destination = document.__data__:findDest(name)
--- return destination and destination.number
--- end
-
--- This is experimental code that we need for testing the transition from
--- poppler to a new lightweight library. Don't rely on this code to remain
--- as it is now. Interesting is that performance of this variant is the same
--- as the natural page includer.
-
-if img then do
-
- local copydictionary = nil
- local copyarray = nil
-
- local ref_object_code = typenumbers.ref
- local boolean_object_code = typenumbers.boolean
- local integer_object_code = typenumbers.integer
- local real_object_code = typenumbers.real
- local string_object_code = typenumbers.string
- local name_object_code = typenumbers.name
- local null_object_code = typenumbers.null
- local array_object_code = typenumbers.array
- local dictionary_object_code = typenumbers.dictionary
- local stream_object_code = typenumbers.stream
- local cmd_object_code = typenumbers.cmd
-
- local pdfreserveobject = lpdf.reserveobject
- local pdfflushobject = lpdf.flushobject
- local pdfflushstreamobject = lpdf.flushstreamobject
- local pdfreference = lpdf.reference
- local pdfconstant = lpdf.constant
- local pdfarray = lpdf.array
- local pdfdictionary = lpdf.dictionary
- local pdfunicode = lpdf.unicode
- local pdfstring = lpdf.string
- local pdfnull = lpdf.null
-
- local report = logs.reporter("backend","xobjects")
-
- local factor = 65536 / (7200/7227) -- 1/number.dimenfactors.bp
-
- local createimage = images.create
-
- local function scaledbbox(b)
- return { b[1]*factor, b[2]*factor, b[3]*factor, b[4]*factor }
- end
-
- local function copyobject(xref,copied,kind,r,v)
- if kind == null_object_code then
- return pdfnull()
- elseif r and getType(r) == ref_object_code then
- local objnum = getRefNum(r)
- local r = copied[objnum]
- if r then
- -- report("%s object %i is reused",kind,objnum)
- else
- local o
- r = pdfreserveobject()
- copied[objnum] = r
- if kind == array_object_code then
- local a = copyarray(xref,copied,fetch(xref,objnum,0))
- pdfflushobject(r,tostring(a))
- elseif kind == dictionary_object_code then
- local d = copydictionary(xref,copied,fetch(xref,objnum,0))
- pdfflushobject(r,tostring(d))
- elseif kind == stream_object_code then
- local f = fetch(xref,objnum,0)
- local d = copydictionary(xref,copied,false,streamGetDict(f))
- local s = getstream(f)
- --
- d.Filter = nil
- d.Length = nil
- d.DecodeParms = nil
- d.DL = nil
- --
- pdfflushstreamobject(s,d,true,r)
- else
- report("reference not done: %s", kind)
- end
- end
- return pdfreference(r)
- elseif kind == array_object_code then
- return copyarray(xref,copied,v)
- elseif kind == dictionary_object_code then
- return copydictionary(xref,copied,v)
- elseif kind == integer_object_code then
- return getInt(v)
- elseif kind == real_object_code then
- return getReal(v)
- elseif kind == name_object_code then
- return pdfconstant(getName(v))
- elseif kind == string_object_code then
- local s = getString(v)
- if not s or s == "" then
- return ""
- end
- local u = lpegmatch(u_pattern,s)
- if u then
- return pdfunicode(s)
- end
- return pdfstring(s)
- elseif kind == boolean_object_code then
- return getBool(v)
- elseif kind == stream_object_code then
- -- hm ...
- return getStream(v)
- else
- report("object not done: %s", kind)
- end
- end
-
- copyarray = function (xref,copied,object)
- local a = getArray(object)
- local n = a and arrayGetLength(a) or 0
- if n > 0 then
- local target = pdfarray()
- for i=1,n do
- local v = arrayGet(a,i)
- if v then
- local kind = getType(v)
- local r = arrayGetNF(a,i)
- target[i] = copyobject(xref,copied,kind,r,v)
- end
- end
- return target
- end
- end
-
- copydictionary = function (xref,copied,object,d)
- local d = d or getDict(object)
- local n = d and dictGetLength(d) or 0
- if n > 0 then
- local target = pdfdictionary()
- for i=1,n do
- local v = dictGetVal(d,i)
- if v then
- local kind = getType(v)
- local key = dictGetKey(d,i)
- local r = dictGetValNF(d,i)
- target[key] = copyobject(xref,copied,kind,r,v)
- end
- end
- return target
- end
- end
-
- local function copy_resources(pdfdoc,xref,copied,pagedata)
- local object = pagedata.object
- if object then
- local d = getDict(object)
- local n = d and dictGetLength(d) or 0
- for i=1,n do
- local k = dictGetKey(d,i)
- if v and k == "Resources" then
- local v = dictGetVal(d,i)
- local kind = getType(v)
- local r = dictGetValNF(d,i)
- return copyobject(xref,copied,kind,r,v)
- end
- end
- end
- end
-
- local function openpdf(filename)
- local pdfdoc = lpdf_epdf.load(filename)
- if pdfdoc then
- pdfdoc.__copied__ = pdfdoc.__copied__ or { }
- pdfdoc.filename = filename
- return pdfdoc
- end
- end
-
- local function closepdf(pdfdoc)
- if pdfdoc then
- lpdf_epdf.unload(pdfdoc.filename)
- end
- end
-
- local function querypdf(pdfdoc,pagenumber)
- if pdfdoc then
- if not pagenumber then
- pagenumber = 1
- end
- local root = pdfdoc.Catalog
- local page = pdfdoc.pages[pagenumber]
- if page then
- local mediabox = page.MediaBox or { 0, 0, 0, 0 }
- local cropbox = page.CropBox or mediabox
- return {
- filename = pdfdoc.filename,
- pagenumber = pagenumber,
- nofpages = pdfdoc.nofpages,
- boundingbox = scaledbbox(cropbox),
- cropbox = cropbox,
- mediabox = mediabox,
- bleedbox = page.BleedBox or cropbox,
- trimbox = page.TrimBox or cropbox,
- artbox = page.ArtBox or cropbox,
- }
- end
- end
- end
-
- local function copypage(pdfdoc,pagenumber,attributes)
- if pdfdoc then
- local root = pdfdoc.Catalog
- local page = pdfdoc.pages[pagenumber or 1]
- local pageinfo = querypdf(pdfdoc,pagenumber)
- local contents = page.Contents
- local xref = pdfdoc.__xref__
- local copied = pdfdoc.__copied__
- --
- local xobject = pdfdictionary {
- Type = pdfconstant("XObject"),
- Subtype = pdfconstant("Form"),
- -- image attributes
- FormType = 1,
- BBox = pageinfo.cropbox,
- -- Metadata = copy(xref,copied,root,"Metadata"),
- -- Group = copy(xref,copied,page,"Group"),
- -- LastModified = copy(xref,copied,page,"LastModified"),
- -- Metadata = copy(xref,copied,page,"Metadata"),
- -- PieceInfo = copy(xref,copied,page,"PieceInfo"),
- Resources = copy_resources(pdfdoc,xref,copied,page),
- -- SeparationInfo = copy(xref,copied,page,"SeparationInfo"),
- }
- if attributes then
- for k, v in next, expand(attributes) do
- page[k] = v -- maybe nested
- end
- end
- return createimage {
- bbox = pageinfo.boundingbox,
- stream = contents(),
- attr = xobject(),
- }
- end
- end
-
- -- todo: codeinjections
-
- lpdf_epdf.image = {
- open = openpdf,
- close = closepdf,
- query = querypdf,
- copy = copypage,
- }
-
-end end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-fld.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-fld.lua
index 983be508f2c..e5a95fdab7c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-fld.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-fld.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['lpdf-fld'] = {
license = "see context related readme files"
}
+-- TURN OFF: preferences -> forms -> highlight -> etc
+
-- The problem with widgets is that so far each version of acrobat has some
-- rendering problem. I tried to keep up with this but it makes no sense to do so as
-- one cannot rely on the viewer not changing. Especially Btn fields are tricky as
@@ -87,6 +89,7 @@ local pdfflushobject = lpdf.flushobject
local pdfshareobjectreference = lpdf.shareobjectreference
local pdfshareobject = lpdf.shareobject
local pdfreserveobject = lpdf.reserveobject
+local pdfpagereference = lpdf.pagereference
local pdfaction = lpdf.action
local pdfmajorversion = lpdf.majorversion
@@ -911,8 +914,11 @@ end
local collected = pdfarray()
local forceencoding = false
+-- todo : check #opt
+
local function finishfields()
local sometext = forceencoding
+ local somefont = next(usedfonts)
for name, field in sortedhash(fields) do
local kids = field.kids
if kids then
@@ -943,15 +949,33 @@ local function finishfields()
Fields = pdfreference(pdfflushobject(collected)),
CO = fieldsetlist(calculationset),
}
- if sometext then
+ if sometext or somefont then
checkpdfdocencoding()
- usedfonts.tttf = fontnames.tt.tf
- acroform.DA = "/tttf 12 Tf 0 g"
+ if sometext then
+ usedfonts.tttf = fontnames.tt.tf
+ acroform.DA = "/tttf 12 Tf 0 g"
+ end
acroform.DR = pdfdictionary {
Font = registerfonts(),
Encoding = pdfdocencodingcapsule,
}
end
+ -- maybe:
+ -- if sometext then
+ -- checkpdfdocencoding()
+ -- if sometext then
+ -- usedfonts.tttf = fontnames.tt.tf
+ -- acroform.DA = "/tttf 12 Tf 0 g"
+ -- end
+ -- acroform.DR = pdfdictionary {
+ -- Font = registerfonts(),
+ -- Encoding = pdfdocencodingcapsule,
+ -- }
+ -- elseif somefont then
+ -- acroform.DR = pdfdictionary {
+ -- Font = registerfonts(),
+ -- }
+ -- end
lpdf.addtocatalog("AcroForm",pdfreference(pdfflushobject(acroform)))
end
end
@@ -1350,6 +1374,65 @@ local function makeradioparent(field,specification)
save_parent(field,specification,d,true)
end
+-- local function makeradiochild(name,specification)
+-- local field = clones[name]
+-- local parent = nil
+-- local pname = nil
+-- if field then
+-- pname = field.parent
+-- field = radios[pname]
+-- parent = fields[pname]
+-- if not parent.pobj then
+-- if trace_fields then
+-- report_fields("forcing parent radio %a",parent.name)
+-- end
+-- makeradioparent(parent,parent)
+-- end
+-- else
+-- field = radios[name]
+-- if not field then
+-- report_fields("there is some problem with field %a",name)
+-- return nil
+-- end
+-- pname = field.parent
+-- parent = fields[pname]
+-- if not parent.pobj then
+-- if trace_fields then
+-- report_fields("using parent radio %a",name)
+-- end
+-- makeradioparent(parent,parent)
+-- end
+-- end
+-- if trace_fields then
+-- report_fields("using child radio %a with values %a and default %a",name,field.values,field.default)
+-- end
+-- local fontsymbol = specification.fontsymbol
+-- -- fontsymbol = "circle"
+-- local d = pdfdictionary {
+-- Subtype = pdf_widget,
+-- Parent = pdfreference(parent.pobj),
+-- F = fieldplus(specification),
+-- OC = fieldlayer(specification),
+-- AA = fieldactions(specification),
+-- H = pdf_n,
+-- -- H = pdf_p,
+-- -- P = pdfpagereference(true),
+-- }
+-- if fontsymbol and fontsymbol ~= "" then
+-- specification.fontsymbol = todingbat(fontsymbol)
+-- specification.fontstyle = "symbol"
+-- specification.fontalternative = "dingbats"
+-- d.DA = fieldsurrounding(specification)
+-- d.MK = fieldrendering(specification)
+-- return save_kid(parent,specification,d) -- todo: what if no value
+-- else
+-- local appearance, default, value = fieldstates_radio(field,name,fields[pname])
+-- d.AP = appearance
+-- d.AS = default -- /Whatever
+-- return save_kid(parent,specification,d,value)
+-- end
+-- end
+
local function makeradiochild(name,specification)
local field, parent = clones[name], nil
if field then
@@ -1398,6 +1481,8 @@ local function makeradiochild(name,specification)
local appearance, default, value = fieldstates_radio(field,name,fields[field.parent])
d.AP = appearance
d.AS = default -- /Whatever
+-- d.MK = pdfdictionary { BC = pdfarray {0}, BG = pdfarray { 1 } }
+d.BS = pdfdictionary { S = pdfconstant("I"), W = 1 }
return save_kid(parent,specification,d,value)
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-fmt.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-fmt.lua
index 25a72fa49bc..388db0be3d9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-fmt.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-fmt.lua
@@ -81,10 +81,13 @@ local prefixes = {
cmyk = "DefaultCMYK",
}
-local formatspecification, formatname = nil, nil
+local formatspecification = nil
+local formatname = nil
-- * correspondent document wide flags (write once) needed for permission tests
+-- defaults as mt
+
local formats = utilities.storage.allocate {
version = {
external_icc_profiles = 1.4, -- 'p' in name; URL reference of output intent
@@ -95,6 +98,7 @@ local formats = utilities.storage.allocate {
optional_content = 1.5,
transparency = 1.4,
object_compression = 1.5,
+ attachments = 1.7,
},
default = {
pdf_version = 1.7, -- todo: block tex primitive
@@ -113,10 +117,11 @@ local formats = utilities.storage.allocate {
open_prepress_interface = true, -- unknown
optional_content = true, -- todo: block at lua level
transparency = true, -- todo: block at lua level
- jbig2_compression = true, -- todo: block at lua level
- jpeg2000_compression = true, -- todo: block at lua level
+ jbig2_compression = true, -- todo: block at lua level (dropped anyway)
+ jpeg2000_compression = true, -- todo: block at lua level (dropped anyway)
include_cidsets = true,
include_charsets = true,
+ attachments = true,
inject_metadata = function()
-- nothing
end
@@ -133,6 +138,7 @@ local formats = utilities.storage.allocate {
internal_icc_profiles = true,
include_cidsets = true,
include_charsets = true,
+ attachments = false,
inject_metadata = function()
addtoinfo("GTS_PDFXVersion","PDF/X-1a:2001")
injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfxid='http://www.npes.org/pdfx/ns/id/'><pdfxid:GTS_PDFXVersion>PDF/X-1a:2001</pdfxid:GTS_PDFXVersion></rdf:Description>",false)
@@ -149,6 +155,7 @@ local formats = utilities.storage.allocate {
internal_icc_profiles = true,
include_cidsets = true,
include_charsets = true,
+ attachments = false,
inject_metadata = function()
addtoinfo("GTS_PDFXVersion","PDF/X-1a:2003")
injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfxid='http://www.npes.org/pdfx/ns/id/'><pdfxid:GTS_PDFXVersion>PDF/X-1a:2003</pdfxid:GTS_PDFXVersion></rdf:Description>",false)
@@ -169,6 +176,7 @@ local formats = utilities.storage.allocate {
include_intents = true,
include_cidsets = true,
include_charsets = true,
+ attachments = false,
inject_metadata = function()
addtoinfo("GTS_PDFXVersion","PDF/X-3:2002")
end
@@ -189,6 +197,7 @@ local formats = utilities.storage.allocate {
jbig2_compression = true,
include_cidsets = true,
include_charsets = true,
+ attachments = false,
inject_metadata = function()
addtoinfo("GTS_PDFXVersion","PDF/X-3:2003")
end
@@ -213,6 +222,7 @@ local formats = utilities.storage.allocate {
object_compression = true,
include_cidsets = true,
include_charsets = true,
+ attachments = false,
inject_metadata = function()
injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfxid='http://www.npes.org/pdfx/ns/id/'><pdfxid:GTS_PDFXVersion>PDF/X-4</pdfxid:GTS_PDFXVersion></rdf:Description>",false)
insertxmpinfo("xml://rdf:Description/xmpMM:InstanceID","<xmpMM:VersionID>1</xmpMM:VersionID>",false)
@@ -240,6 +250,7 @@ local formats = utilities.storage.allocate {
object_compression = true,
include_cidsets = true,
include_charsets = true,
+ attachments = false,
inject_metadata = function()
injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfxid='http://www.npes.org/pdfx/ns/id/'><pdfxid:GTS_PDFXVersion>PDF/X-4p</pdfxid:GTS_PDFXVersion></rdf:Description>",false)
insertxmpinfo("xml://rdf:Description/xmpMM:InstanceID","<xmpMM:VersionID>1</xmpMM:VersionID>",false)
@@ -267,6 +278,7 @@ local formats = utilities.storage.allocate {
object_compression = true,
include_cidsets = true,
include_charsets = true,
+ attachments = false,
inject_metadata = function()
-- todo
end
@@ -293,6 +305,7 @@ local formats = utilities.storage.allocate {
object_compression = true,
include_cidsets = true,
include_charsets = true,
+ attachments = false,
inject_metadata = function()
-- todo
end
@@ -318,6 +331,7 @@ local formats = utilities.storage.allocate {
object_compression = true,
include_cidsets = true,
include_charsets = true,
+ attachments = false,
inject_metadata = function()
-- todo
end
@@ -334,11 +348,12 @@ local formats = utilities.storage.allocate {
calibrated_rgb_colors = true, -- unknown
cielab_colors = true, -- unknown
include_intents = true,
- forms = true, -- NEW; forms are allowed (with limitations); no JS, other restrictions are unknown (TODO)
- tagging = true, -- NEW; the only difference to PDF/A-1b
+ forms = true, -- new: forms are allowed (with limitations); no JS, other restrictions are unknown (TODO)
+ tagging = true, -- new: the only difference to PDF/A-1b
internal_icc_profiles = true,
include_cidsets = true,
include_charsets = true,
+ attachments = false,
inject_metadata = function()
injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfaid='http://www.aiim.org/pdfa/ns/id/'><pdfaid:part>1</pdfaid:part><pdfaid:conformance>A</pdfaid:conformance></rdf:Description>",false)
end
@@ -359,11 +374,14 @@ local formats = utilities.storage.allocate {
internal_icc_profiles = true,
include_cidsets = true,
include_charsets = true,
+ attachments = false,
inject_metadata = function()
injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfaid='http://www.aiim.org/pdfa/ns/id/'><pdfaid:part>1</pdfaid:part><pdfaid:conformance>B</pdfaid:conformance></rdf:Description>",false)
end
},
- ["pdf/a-2a"] = { -- untested; only PDF/A Attachments are allowed
+ -- Only PDF/A Attachments are allowed but we don't check the attachments
+ -- for any quality: they are just blobs.
+ ["pdf/a-2a"] = {
pdf_version = 1.7,
format_name = "pdf/a-2a",
xmp_file = "lpdf-pda.xml",
@@ -378,17 +396,74 @@ local formats = utilities.storage.allocate {
forms = true,
tagging = true,
internal_icc_profiles = true,
- transparency = true, -- NEW
+ transparency = true, -- new
jbig2_compression = true,
- jpeg2000_compression = true, -- NEW
- object_compression = true,
+ jpeg2000_compression = true, -- new
+ object_compression = true, -- new
include_cidsets = false,
include_charsets = false,
+ attachments = true, -- new
inject_metadata = function()
injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfaid='http://www.aiim.org/pdfa/ns/id/'><pdfaid:part>2</pdfaid:part><pdfaid:conformance>A</pdfaid:conformance></rdf:Description>",false)
end
},
- ["pdf/a-3a"] = { -- untested; NEW: any type of attachment is allowed
+ ["pdf/a-2b"] = {
+ pdf_version = 1.7,
+ format_name = "pdf/a-2b",
+ xmp_file = "lpdf-pda.xml",
+ gts_flag = "GTS_PDFA1",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ spot_colors = true,
+ calibrated_rgb_colors = true, -- unknown
+ cielab_colors = true, -- unknown
+ include_intents = true,
+ forms = true,
+ tagging = false,
+ internal_icc_profiles = true,
+ transparency = true,
+ jbig2_compression = true,
+ jpeg2000_compression = true,
+ object_compression = true,
+ include_cidsets = false,
+ include_charsets = false,
+ attachments = true,
+ inject_metadata = function()
+ injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfaid='http://www.aiim.org/pdfa/ns/id/'><pdfaid:part>2</pdfaid:part><pdfaid:conformance>B</pdfaid:conformance></rdf:Description>",false)
+ end
+ },
+ -- This is like the b variant, but it requires Unicode mapping of fonts
+ -- which we do anyway.
+ ["pdf/a-2u"] = {
+ pdf_version = 1.7,
+ format_name = "pdf/a-2u",
+ xmp_file = "lpdf-pda.xml",
+ gts_flag = "GTS_PDFA1",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ spot_colors = true,
+ calibrated_rgb_colors = true, -- unknown
+ cielab_colors = true, -- unknown
+ include_intents = true,
+ forms = true,
+ tagging = false,
+ internal_icc_profiles = true,
+ transparency = true,
+ jbig2_compression = true,
+ jpeg2000_compression = true,
+ object_compression = true,
+ include_cidsets = false,
+ include_charsets = false,
+ attachments = true,
+ inject_metadata = function()
+ injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfaid='http://www.aiim.org/pdfa/ns/id/'><pdfaid:part>2</pdfaid:part><pdfaid:conformance>U</pdfaid:conformance></rdf:Description>",false)
+ end
+ },
+ -- Any type of attachment is allowed but we don't check the quality
+ -- of them.
+ ["pdf/a-3a"] = {
pdf_version = 1.7,
format_name = "pdf/a-3a",
xmp_file = "lpdf-pda.xml",
@@ -409,10 +484,63 @@ local formats = utilities.storage.allocate {
object_compression = true,
include_cidsets = false,
include_charsets = false,
+ attachments = true,
inject_metadata = function()
injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfaid='http://www.aiim.org/pdfa/ns/id/'><pdfaid:part>3</pdfaid:part><pdfaid:conformance>A</pdfaid:conformance></rdf:Description>",false)
end
},
+ ["pdf/a-3b"] = {
+ pdf_version = 1.7,
+ format_name = "pdf/a-3b",
+ xmp_file = "lpdf-pda.xml",
+ gts_flag = "GTS_PDFA1",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ spot_colors = true,
+ calibrated_rgb_colors = true, -- unknown
+ cielab_colors = true, -- unknown
+ include_intents = true,
+ forms = true,
+ tagging = false,
+ internal_icc_profiles = true,
+ transparency = true,
+ jbig2_compression = true,
+ jpeg2000_compression = true,
+ object_compression = true,
+ include_cidsets = false,
+ include_charsets = false,
+ attachments = true,
+ inject_metadata = function()
+ injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfaid='http://www.aiim.org/pdfa/ns/id/'><pdfaid:part>3</pdfaid:part><pdfaid:conformance>B</pdfaid:conformance></rdf:Description>",false)
+ end
+ },
+ ["pdf/a-3u"] = {
+ pdf_version = 1.7,
+ format_name = "pdf/a-3u",
+ xmp_file = "lpdf-pda.xml",
+ gts_flag = "GTS_PDFA1",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ spot_colors = true,
+ calibrated_rgb_colors = true, -- unknown
+ cielab_colors = true, -- unknown
+ include_intents = true,
+ forms = true,
+ tagging = false,
+ internal_icc_profiles = true,
+ transparency = true,
+ jbig2_compression = true,
+ jpeg2000_compression = true,
+ object_compression = true,
+ include_cidsets = false,
+ include_charsets = false,
+ attachments = true,
+ inject_metadata = function()
+ injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfaid='http://www.aiim.org/pdfa/ns/id/'><pdfaid:part>3</pdfaid:part><pdfaid:conformance>U</pdfaid:conformance></rdf:Description>",false)
+ end
+ },
["pdf/ua-1"] = { -- based on PDF/A-3a, but no 'gts_flag'
pdf_version = 1.7,
format_name = "pdf/ua-1",
@@ -433,6 +561,7 @@ local formats = utilities.storage.allocate {
object_compression = true,
include_cidsets = true,
include_charsets = true, --- really ?
+ attachments = true,
inject_metadata = function()
injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfaid='http://www.aiim.org/pdfa/ns/id/'><pdfaid:part>3</pdfaid:part><pdfaid:conformance>A</pdfaid:conformance></rdf:Description>",false)
injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfuaid='http://www.aiim.org/pdfua/ns/id/'><pdfuaid:part>1</pdfuaid:part></rdf:Description>",false)
@@ -626,10 +755,16 @@ local function handledefaultprofile(s,spec) -- specification
end
end
-local loadedintents, intents = { }, pdfarray()
+local loadedintents = { }
+local intents = pdfarray()
local function handleoutputintent(s,spec)
- local name, url, filename, id, outputcondition, info = s.info or s.filename or "", s.url or "", s.filename or "", s.id or "", s.outputcondition or "", s.info or ""
+ local url = s.url or ""
+ local filename = s.filename or ""
+ local name = s.info or filename
+ local id = s.id or ""
+ local outputcondition = s.outputcondition or ""
+ local info = s.info or ""
if name == "" or id == "" then
report_backend("error in output intent specification: %s",serialize(s,false))
elseif not loadedintents[name] then
@@ -771,8 +906,13 @@ function codeinjections.setformat(s)
-- cid sets can always omitted now, but those validators still complain so let's
-- for a while keep it (for luigi):
--
- lpdf.setomitcidset (formatspecification.include_cidsets == false and 1 or 0)
- lpdf.setomitcharset(formatspecification.include_charsets == false and 1 or 0)
+ lpdf.setomitcidset (formatspecification.include_cidsets == false and 1 or 0) -- why a number
+ lpdf.setomitcharset(formatspecification.include_charsets == false and 1 or 0) -- why a number
+ --
+ -- maybe block by pdf version
+ --
+ codeinjections.settaggingsupport(formatspecification.tagging)
+ codeinjections.setattachmentsupport(formatspecification.attachments)
--
-- context.setupcolors { -- not this way
-- cmyk = spec.cmyk_colors and variables.yes or variables.no,
@@ -847,6 +987,10 @@ function codeinjections.getformatoption(key)
return formatspecification and formatspecification[key]
end
+-- function codeinjections.getformatspecification()
+-- return formatspecification
+-- end
+
function codeinjections.supportedformats()
local t = { }
for k, v in sortedhash(formats.data) do
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-fnt.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-fnt.lua
index 1caa2f93c98..6729578a269 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-fnt.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-fnt.lua
@@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['lpdf-fnt'] = {
-- This is experimental code.
local match, gmatch = string.match, string.gmatch
-local tonumber = tonumber
+local tonumber, rawget = tonumber, rawget
local pdfreserveobject = lpdf.reserveobject
local pdfincludechar = lpdf.includechar
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-grp.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-grp.lua
index 49cc7687111..e827419a6ce 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-grp.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-grp.lua
@@ -262,14 +262,9 @@ end
-- experimental (q Q is not really needed)
-local f_pattern = formatters["q /Pattern cs /%s scn 0 0 %.6F %.6F re f Q"]
-
-directives.register("pdf.stripzeros",function()
- f_pattern = formatters["q /Pattern cs /%s scn 0 0 %.6N %.6N re f Q"]
-end)
-
-local saveboxresource = tex.boxresources.save
-local nofpatterns = 0
+local saveboxresource = tex.boxresources.save
+local nofpatterns = 0
+local f_pattern = formatters["q /Pattern cs /%s scn 0 0 %.6N %.6N re f Q"]
function lpdf.registerpattern(specification)
nofpatterns = nofpatterns + 1
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-img.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-img.lua
new file mode 100644
index 00000000000..17305a1cfa6
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-img.lua
@@ -0,0 +1,1340 @@
+if not modules then modules = { } end modules ['lpdf-img'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This started as an experiment but has potential for some (cached) optimizations.
+-- At some point we can also use it for fonts. For small images performance is ok
+-- with pure lua but for bigger images we can use some helpers. Normally in a
+-- typesetting workflow non-interlaced images are used. One should convert
+-- interlaced images to more efficient non-interlaced ones (ok, we can cache
+-- them if needed).
+--
+-- The \LUA\ code is slightly optimized so we could have done with less lines if
+-- we wanted but best gain a little. The idea is that we collect striped (in stages)
+-- so that we can play with substitutions.
+
+local type = type
+local concat, move = table.concat, table.move
+local ceil, min = math.ceil, math.min
+local char, byte, find, gmatch = string.char, string.byte, string.find, string.gmatch
+local idiv = number.idiv
+local band, rshift = bit32.band, bit32.rshift
+
+local loaddata = io.loaddata
+local setmetatableindex = table.setmetatableindex
+local formatters = string.formatters
+
+local streams = utilities.streams
+local openstring = streams.openstring
+local readstring = streams.readstring
+local readbytetable = streams.readbytetable
+
+local newreader = io.newreader
+
+local tobytetable = string.bytetable
+
+local lpdf = lpdf or { }
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfconstant = lpdf.constant
+local pdfstring = lpdf.string
+local pdfflushstreamobject = lpdf.flushstreamobject
+local pdfreference = lpdf.reference
+local pdfverbose = lpdf.verbose
+
+local pdfmajorversion = lpdf.majorversion
+local pdfminorversion = lpdf.minorversion
+
+local createimage = images.create
+
+local zlibcompress = (xzip or zlib).compress
+local zlibdecompress = (xzip or zlib).decompress
+
+local trace = false
+
+local report_jpg = logs.reporter("graphics","jpg")
+local report_jp2 = logs.reporter("graphics","jp2")
+local report_png = logs.reporter("graphics","png")
+
+trackers.register("graphics.backend", function(v) trace = v end)
+
+local injectors = { }
+lpdf.injectors = injectors
+
+-- todo: load from a virtual file
+
+local function loadcontent(filename,method)
+ return method == "string" and filename or loaddata(filename)
+end
+
+local function newcontent(filename,method)
+ return newreader(filename,method)
+end
+
+--
+
+local chars = setmetatableindex(function(t,k) -- share this one
+ local v = (k <= 0 and "\000") or (k >= 255 and "\255") or char(k)
+ t[k] = v
+ return v
+end)
+
+do
+
+ function injectors.jpg(specification,method)
+ if specification.error then
+ return
+ end
+ local filename = specification.filename
+ if not filename then
+ return
+ end
+ local colorspace = specification.colorspace or jpg_gray
+ local decodearray = nil
+ ----- procset = colorspace == 0 and "image b" or "image c"
+ if colorspace == 1 then
+ colorspace = "DeviceGray"
+ elseif colorspace == 2 then
+ colorspace = "DeviceRGB"
+ elseif colorspace == 3 then
+ colorspace = "DeviceCMYK"
+ decodearray = pdfarray { 1, 0, 1, 0, 1, 0, 1, 0 }
+ end
+ -- todo: set filename
+ local xsize = specification.xsize
+ local ysize = specification.ysize
+ local colordepth = specification.colordepth
+ local content = loadcontent(filename,method)
+ local xobject = pdfdictionary {
+ Type = pdfconstant("XObject"),
+ Subtype = pdfconstant("Image"),
+ -- BBox = pdfarray { 0, 0, xsize, ysize },
+ Width = xsize,
+ Height = ysize,
+ BitsPerComponent = colordepth,
+ Filter = pdfconstant("DCTDecode"),
+ ColorSpace = pdfconstant(colorspace),
+ Decode = decodearray,
+ Length = #content, -- specification.length
+ } + specification.attr
+ if trace then
+ report_jpg("%s: width %i, height %i, colordepth %i, size %i",filename,xsize,ysize,colordepth,#content)
+ end
+ return createimage {
+ bbox = { 0, 0, specification.width/xsize, specification.height/ysize }, -- mandate
+ transform = specification.transform,
+ nolength = true,
+ nobbox = true,
+ notype = true,
+ stream = content,
+ attr = xobject(),
+ }
+ end
+
+end
+
+do
+
+ function injectors.jp2(specification,method)
+ if specification.error then
+ return
+ end
+ local filename = specification.filename
+ if not filename then
+ return
+ end
+ -- todo: set filename
+ local xsize = specification.xsize
+ local ysize = specification.ysize
+ local content = loadcontent(filename,method)
+ local xobject = pdfdictionary {
+ Type = pdfconstant("XObject"),
+ Subtype = pdfconstant("Image"),
+ BBox = pdfarray { 0, 0, xsize, ysize },
+ Width = xsize,
+ Height = ysize,
+ Filter = pdfconstant("JPXDecode"),
+ Length = #content, -- specification.length
+ } + specification.attr
+ if trace then
+ report_jp2("%s: width %i, height %i, size %i",filename,xsize,ysize,#content)
+ end
+ return createimage {
+ bbox = { 0, 0, specification.width/xsize, specification.height/ysize }, -- mandate
+ transform = specification.transform,
+ nolength = true,
+ nobbox = true,
+ notype = true,
+ stream = content,
+ attr = xobject(),
+ }
+ end
+
+end
+
+do
+
+ -- We don't like interlaced files. You can deinterlace them beforehand because otherwise
+ -- each run you add runtime. Actually, even masked images can best be converted to PDF
+ -- beforehand.
+
+ -- The amount of code is larger that I like and looks somewhat redundant but we sort of
+ -- optimize a few combinations that happen often.
+
+ local pngapplyfilter = pngdecode.applyfilter
+ local pngsplitmask = pngdecode.splitmask
+ local pnginterlace = pngdecode.interlace
+ local pngexpand = pngdecode.expand
+ local pngtocmyk = pngdecode.tocmyk
+
+ local filtermask, decodemask, decodestrip, transpose, expand, tocmyk
+
+ local newindex = lua.newindex
+ local newtable = lua.newtable
+
+ local function newoutput(size)
+ if newindex then
+ return newindex(size,0)
+ end
+ local t = newtable and newtable(size,0) or { }
+ for i=1,size do
+ t[i] = 0
+ end
+ return t
+ end
+
+ local function convert(t)
+ if type(t) == "table" then
+ for i=1,#t do
+ local ti = t[i]
+ if ti ~= "" then -- soon gone
+ t[i] = chars[ti]
+ end
+ end
+ return concat(t)
+ else
+ return t
+ end
+ end
+
+ local function zero(t,k)
+ return 0
+ end
+
+ local function applyfilter(t,xsize,ysize,bpp)
+ local len = xsize * bpp + 1
+ local n = 1
+ local m = len - 1
+ for i=1,ysize do
+ local filter = t[n]
+ t[n] = ""
+ if filter == 0 then
+ elseif filter == 1 then
+ for j=n+bpp+1,n+m do
+ t[j] = (t[j] + t[j-bpp]) % 256
+ end
+ elseif filter == 2 then
+ for j=n+1,n+m do
+ t[j] = (t[j] + t[j-len]) % 256
+ end
+ elseif filter == 3 then
+ for j=n+1,n+bpp do
+ t[j] = (t[j] + idiv(t[j-len],2)) % 256
+ end
+ for j=n+bpp+1,n+m do
+ t[j] = (t[j] + idiv(t[j-bpp] + t[j-len],2)) % 256
+ end
+ elseif filter == 4 then
+ for j=n+1,n+bpp do
+ local p = j - len
+ local b = t[p]
+ if b > 0 then
+ t[j] = (t[j] + b) % 256
+ end
+ end
+ for j=n+bpp+1,n+m do
+ local p = j - len
+ local a = t[j-bpp]
+ local b = t[p]
+ local c = t[p-bpp]
+ local pa = b - c
+ local pb = a - c
+ local pc = pa + pb
+ if pa < 0 then pa = - pa end
+ if pb < 0 then pb = - pb end
+ if pc < 0 then pc = - pc end
+ t[j] = (t[j] + ((pa <= pb and pa <= pc and a) or (pb <= pc and b) or c)) % 256
+ end
+ end
+ n = n + len
+ end
+ return t
+ end
+
+ local filtermask_l = function (content,xsize,ysize,colordepth,colorspace,hasfilter)
+ local mask = { }
+ local bytes = colordepth == 16 and 2 or 1
+ local bpp = colorspace == "DeviceRGB" and 3 or 1
+ local length = #content
+ local size = ysize * xsize * ((bpp+1)*bytes + (hasfilter and 1 or 0))
+ local n = 1
+ local l = 1
+ if bytes == 2 then
+ if bpp == 1 then
+ for i=1,ysize do
+ if hasfilter then
+ content[n] = "" ; n = n + 1
+ end
+ for j=1,xsize do
+ content[n] = chars[content[n]] ; n = n + 1
+ content[n] = chars[content[n]] ; n = n + 1
+ mask[l] = chars[content[n]] ; l = l + 1
+ content[n] = "" ; n = n + 1
+ mask[l] = chars[content[n]] ; l = l + 1
+ content[n] = "" ; n = n + 1
+ end
+ end
+ elseif bpp == 3 then
+ for i=1,ysize do
+ if hasfilter then
+ content[n] = "" ; n = n + 1
+ end
+ for j=1,xsize do
+ content[n] = chars[content[n]] ; n = n + 1
+ content[n] = chars[content[n]] ; n = n + 1
+ content[n] = chars[content[n]] ; n = n + 1
+ content[n] = chars[content[n]] ; n = n + 1
+ content[n] = chars[content[n]] ; n = n + 1
+ content[n] = chars[content[n]] ; n = n + 1
+ mask[l] = chars[content[n]] ; l = l + 1
+ content[n] = "" ; n = n + 1
+ mask[l] = chars[content[n]] ; l = l + 1
+ content[n] = "" ; n = n + 1
+ end
+ end
+ else
+ return "", ""
+ end
+ else
+ if bpp == 1 then
+ for i=1,ysize do
+ if hasfilter then
+ content[n] = "" ; n = n + 1
+ end
+ for j=1,xsize do
+ content[n] = chars[content[n]] ; n = n + 1
+ mask[l] = chars[content[n]] ; l = l + 1
+ content[n] = "" ; n = n + 1
+ end
+ end
+ elseif bpp == 3 then
+ for i=1,ysize do
+ if hasfilter then
+ content[n] = "" ; n = n + 1
+ end
+ for j=1,xsize do
+ content[n] = chars[content[n]] ; n = n + 1
+ content[n] = chars[content[n]] ; n = n + 1
+ content[n] = chars[content[n]] ; n = n + 1
+ mask[l] = chars[content[n]] ; l = l + 1
+ content[n] = "" ; n = n + 1
+ end
+ end
+ else
+ return "", ""
+ end
+ end
+ return concat(content), concat(mask)
+ end
+
+ local decodemask_l = function(content,xsize,ysize,colordepth,colorspace)
+ local bytes = colordepth == 16 and 2 or 1
+ local bpp = colorspace == "DeviceRGB" and 3 or 1
+ local slice = bytes*(bpp+1)
+ local length = #content
+ local size = ysize * xsize * ((bpp+1)*bytes + 1) -- assume filter
+ content = openstring(content)
+ content = readbytetable(content,length)
+ setmetatableindex(content,zero)
+ applyfilter(content,xsize,ysize,slice)
+ content, mask = filtermask(content,xsize,ysize,colordepth,colorspace,true)
+ return content, mask
+ end
+
+ local filtermask_c = function(content,xsize,ysize,colordepth,colorspace)
+ local bytes = colordepth == 16 and 2 or 1
+ local bpp = colorspace == "DeviceRGB" and 3 or 1
+ return pngsplitmask(content,xsize,ysize,bpp,bytes)
+ end
+
+ local decodemask_c = function(content,xsize,ysize,colordepth,colorspace)
+ local mask = true
+ local filter = false
+ local bytes = colordepth == 16 and 2 or 1
+ local bpp = colorspace == "DeviceRGB" and 3 or 1
+ local slice = bytes * (bpp + 1) -- always a mask
+ content = pngapplyfilter(content,xsize,ysize,slice)
+ return pngsplitmask(content,xsize,ysize,bpp,bytes,mask,filter)
+ end
+
+ local function decodestrip_l(s,nx,ny,slice)
+ local input = readbytetable(s,ny*(nx*slice+1))
+ setmetatableindex(input,zero)
+ applyfilter(input,nx,ny,slice)
+ return input, true
+ end
+
+ local function decodestrip_c(s,nx,ny,slice)
+ local input = readstring(s,ny*(nx*slice+1))
+ input = pngapplyfilter(input,nx,ny,slice)
+ return input, false
+ end
+
+ local xstart = { 0, 4, 0, 2, 0, 1, 0 }
+ local ystart = { 0, 0, 4, 0, 2, 0, 1 }
+ local xstep = { 8, 8, 4, 4, 2, 2, 1 }
+ local ystep = { 8, 8, 8, 4, 4, 2, 2 }
+
+ local xblock = { 8, 4, 4, 2, 2, 1, 1 }
+ local yblock = { 8, 8, 4, 4, 2, 2, 1 }
+
+ local function transpose_l(xsize,ysize,slice,pass,input,output,filter)
+ local xstart = xstart[pass]
+ local xstep = xstep[pass]
+ local ystart = ystart[pass]
+ local ystep = ystep[pass]
+ local nx = idiv(xsize + xstep - xstart - 1,xstep)
+ local ny = idiv(ysize + ystep - ystart - 1,ystep)
+ local offset = filter and 1 or 0
+ local xstep = xstep * slice
+ local xstart = xstart * slice
+ local xsize = xsize * slice
+ local target = ystart * xsize + xstart + 1
+ local ystep = ystep * xsize
+ local start = 1
+ local plus = nx * xstep
+ local step = plus - xstep
+ if not output then
+ output = newoutput(xsize*(parts or slice)*ysize)
+ end
+ if slice == 1 then
+ for j=0,ny-1 do
+ start = start + offset
+ local target = target + j * ystep
+ for target=target,target+step,xstep do
+ output[target] = input[start]
+ start = start + slice
+ end
+ end
+ elseif slice == 2 then
+ for j=0,ny-1 do
+ start = start + offset
+ local target = target + j * ystep
+ for target=target,target+step,xstep do
+ output[target] = input[start]
+ output[target+1] = input[start+1]
+ start = start + slice
+ end
+ end
+ elseif slice == 3 then
+ for j=0,ny-1 do
+ start = start + offset
+ local target = target + j * ystep
+ for target=target,target+step,xstep do
+ output[target] = input[start]
+ output[target+1] = input[start+1]
+ output[target+2] = input[start+2]
+ start = start + slice
+ end
+ end
+ elseif slice == 4 then
+ for j=0,ny-1 do
+ start = start + offset
+ local target = target + j * ystep
+ for target=target,target+step,xstep do
+ output[target] = input[start]
+ output[target+1] = input[start+1]
+ output[target+2] = input[start+2]
+ output[target+3] = input[start+3]
+ start = start + slice
+ end
+ end
+ else
+ local delta = slice - 1
+ for j=0,ny-1 do
+ start = start + offset
+ local target = target + j * ystep
+ for target=target,target+step,xstep do
+ move(input,start,start+delta,target,output)
+ start = start + slice
+ end
+ end
+ end
+ return output;
+ end
+
+ local transpose_c = pnginterlace
+
+ -- print(band(rshift(v,4),0x03),extract(v,4,2))
+ -- print(band(rshift(v,6),0x03),extract(v,6,2))
+
+ local function expand_l(t,xsize,ysize,parts,run,factor,filter)
+ local size = ysize * xsize + 1 -- a bit of overshoot, needs testing, probably a few bytes us ok
+ local xline = filter and (run+1) or run
+ local f = filter and 1 or 0
+ local l = xline - 1
+ local n = 1
+ local o = newoutput(size)
+ local k = 0
+ if factor then
+ if parts == 4 then
+ for i=1,ysize do
+ for j=n+f,n+l do
+ local v = t[j]
+ if v == 0 then
+ k = k + 2
+ else
+ k = k + 1 ; o[k] = extract4(v,4) * 0x11
+ k = k + 1 ; o[k] = extract4(v,0) * 0x11
+ end
+ end
+ k = i * xsize
+ n = n + xline
+ end
+ elseif parts == 2 then
+ for i=1,ysize do
+ for j=n+f,n+l do
+ local v = t[j]
+ if v == 0 then
+ k = k + 4
+ else
+ k = k + 1 ; o[k] = extract2(v,6) * 0x55
+ k = k + 1 ; o[k] = extract2(v,4) * 0x55
+ k = k + 1 ; o[k] = extract2(v,2) * 0x55
+ k = k + 1 ; o[k] = extract2(v,0) * 0x55
+ end
+ end
+ k = i * xsize
+ n = n + xline
+ end
+ else
+ for i=1,ysize do
+ for j=n+f,n+l do
+ local v = t[j]
+ if v == 0 then
+ k = k + 8
+ else
+ k = k + 1 ; if band(v,0x80) ~= 0 then o[k] = 0xFF end -- o[k] = extract1(v,7) * 0xFF
+ k = k + 1 ; if band(v,0x40) ~= 0 then o[k] = 0xFF end -- o[k] = extract1(v,6) * 0xFF
+ k = k + 1 ; if band(v,0x20) ~= 0 then o[k] = 0xFF end -- o[k] = extract1(v,5) * 0xFF
+ k = k + 1 ; if band(v,0x10) ~= 0 then o[k] = 0xFF end -- o[k] = extract1(v,4) * 0xFF
+ k = k + 1 ; if band(v,0x08) ~= 0 then o[k] = 0xFF end -- o[k] = extract1(v,3) * 0xFF
+ k = k + 1 ; if band(v,0x04) ~= 0 then o[k] = 0xFF end -- o[k] = extract1(v,2) * 0xFF
+ k = k + 1 ; if band(v,0x02) ~= 0 then o[k] = 0xFF end -- o[k] = extract1(v,1) * 0xFF
+ k = k + 1 ; if band(v,0x01) ~= 0 then o[k] = 0xFF end -- o[k] = extract1(v,0) * 0xFF
+ end
+ end
+ k = i * xsize
+ n = n + xline
+ end
+ end
+ else
+ if parts == 4 then
+ for i=1,ysize do
+ for j=n+f,n+l do
+ local v = t[j]
+ if v == 0 then
+ k = k + 2
+ else
+ k = k + 1 ; o[k] = extract4(v,4)
+ k = k + 1 ; o[k] = extract4(v,0)
+ end
+ end
+ k = i * xsize
+ n = n + xline
+ end
+ elseif parts == 2 then
+ for i=1,ysize do
+ for j=n+f,n+l do
+ local v = t[j]
+ if v == 0 then
+ k = k + 4
+ else
+ k = k + 1 ; o[k] = extract2(v,6)
+ k = k + 1 ; o[k] = extract2(v,4)
+ k = k + 1 ; o[k] = extract2(v,2)
+ k = k + 1 ; o[k] = extract2(v,0)
+ end
+ end
+ k = i * xsize
+ n = n + xline
+ end
+ else
+ for i=1,ysize do
+ for j=n+f,n+l do
+ local v = t[j]
+ if v == 0 then
+ k = k + 8
+ else
+ k = k + 1 ; if band(v,0x80) ~= 0 then o[k] = 1 end -- o[k] = extract1(v,7)
+ k = k + 1 ; if band(v,0x40) ~= 0 then o[k] = 1 end -- o[k] = extract1(v,6)
+ k = k + 1 ; if band(v,0x20) ~= 0 then o[k] = 1 end -- o[k] = extract1(v,5)
+ k = k + 1 ; if band(v,0x10) ~= 0 then o[k] = 1 end -- o[k] = extract1(v,4)
+ k = k + 1 ; if band(v,0x08) ~= 0 then o[k] = 1 end -- o[k] = extract1(v,3)
+ k = k + 1 ; if band(v,0x04) ~= 0 then o[k] = 1 end -- o[k] = extract1(v,2)
+ k = k + 1 ; if band(v,0x02) ~= 0 then o[k] = 1 end -- o[k] = extract1(v,1)
+ k = k + 1 ; if band(v,0x01) ~= 0 then o[k] = 1 end -- o[k] = extract1(v,0)
+ end
+ end
+ k = i * xsize
+ n = n + xline
+ end
+ end
+ end
+ for i=size,xsize * ysize +1,-1 do
+ o[i] = nil
+ end
+ return o, false
+ end
+
+ local expand_c = pngexpand
+
+ local function analyze(colordepth,colorspace,palette,mask)
+ -- return bytes, parts, factor
+ if palette then
+ if colordepth == 16 then
+ return 2, false, false
+ elseif colordepth == 8 then
+ return 1, false, false
+ elseif colordepth == 4 then
+ return 1, 4, false
+ elseif colordepth == 2 then
+ return 1, 2, false
+ elseif colordepth == 1 then
+ return 1, 1, false
+ end
+ elseif colorspace == "DeviceGray" then
+ if colordepth == 16 then
+ return mask and 4 or 2, false, false
+ elseif colordepth == 8 then
+ return mask and 2 or 1, false, false
+ elseif colordepth == 4 then
+ return 1, 4, true
+ elseif colordepth == 2 then
+ return 1, 2, true
+ elseif colordepth == 1 then
+ return 1, 1, true
+ end
+ else
+ if colordepth == 16 then
+ return mask and 8 or 6, false, false
+ elseif colordepth == 8 then
+ return mask and 4 or 3, false, false
+ elseif colordepth == 4 then
+ return 3, 4, true
+ elseif colordepth == 2 then
+ return 3, 2, true
+ elseif colordepth == 1 then
+ return 3, 1, true
+ end
+ end
+ return false, false, false
+ end
+
+ -- 1 6 4 6 2 6 4 6
+ -- 7 7 7 7 7 7 7 7
+ -- 5 6 5 6 5 6 5 6
+ -- 7 7 7 7 7 7 7 7
+ -- 3 6 4 6 3 6 4 6
+ -- 7 7 7 7 7 7 7 7
+ -- 5 6 5 6 5 6 5 6
+ -- 7 7 7 7 7 7 7 7
+
+ local function deinterlace(content,xsize,ysize,colordepth,colorspace,palette,mask)
+ local slice, parts, factor = analyze(colordepth,colorspace,palette,mask)
+ if slice then
+ content = openstring(zlibdecompress(content))
+ local filter = false
+ local output = false
+ for pass=1,7 do
+ local xstart = xstart[pass]
+ local xstep = xstep[pass]
+ local ystart = ystart[pass]
+ local ystep = ystep[pass]
+ local nx = idiv(xsize + xstep - xstart - 1,xstep)
+ local ny = idiv(ysize + ystep - ystart - 1,ystep)
+ if nx > 0 and ny > 0 then
+ local input, filter
+ if parts then
+ local nxx = ceil(nx*parts/8)
+ input, filter = decodestrip(content,nxx,ny,slice)
+ input, filter = expand(input,nx,ny,parts,nxx,factor,filter)
+ else
+ input, filter = decodestrip(content,nx,ny,slice)
+ end
+ output = transpose(xsize,ysize,slice,pass,input,output,filter)
+ end
+ -- if pass == 3 then
+ -- break -- still looks ok, could be nice for a preroll
+ -- end
+ end
+ return output, parts and 8 or false
+ end
+ end
+
+ -- 1 (palette used), 2 (color used), and 4 (alpha channel used)
+
+ -- paeth:
+ --
+ -- p = a + b - c
+ -- pa = abs(p - a) => a + b - c - a => b - c
+ -- pb = abs(p - b) => a + b - c - b => a - c
+ -- pc = abs(p - c) => a + b - c - c => a + b - c - c => a - c + b - c => pa + pb
+
+ local function full(t,k) local v = "\xFF" t[k] = v return v end
+
+ local function expandvector(transparent)
+ local s = openstring(transparent)
+ local n = #transparent
+ local r = { }
+ for i=0,n-1 do
+ r[i] = readstring(s,1) -- readchar
+ end
+ setmetatableindex(r,full)
+ return r
+ end
+
+ local function createmask_l(content,palette,transparent,xsize,ysize,colordepth,colorspace)
+ if palette then
+ local r = expandvector(transparent)
+ local size = xsize*ysize
+ local len = ceil(xsize*colordepth/8) + 1
+ local o = newoutput(xsize*ysize)
+ local u = setmetatableindex(zero)
+ content = zlibdecompress(content)
+ content = openstring(content)
+ for i=0,ysize-1 do
+ local t = readbytetable(content,len)
+ local k = i * xsize
+ local filter = t[1]
+ if filter == 0 then
+ elseif filter == 1 then
+ for j=3,len do
+ t[j] = (t[j] + t[j-1]) % 256
+ end
+ elseif filter == 2 then
+ for j=2,len do
+ t[j] = (t[j] + u[j]) % 256
+ end
+ elseif filter == 3 then
+ local j = 2
+ t[j] = (t[j] + idiv(u[j],2)) % 256
+ for j=3,len do
+ t[j] = (t[j] + idiv(t[j-1] + u[j],2)) % 256
+ end
+ elseif filter == 4 then
+ local j = 2
+ local p = j - len
+ local b = t[p]
+ if b < 0 then
+ b = - b
+ end
+ if b > 0 then
+ t[j] = (t[j] + b) % 256
+ end
+ for j=3,len do
+ local p = j - len
+ local a = t[j-1]
+ local b = t[p]
+ local c = t[p-1]
+ local pa = b - c
+ local pb = a - c
+ local pc = pa + pb
+ if pa < 0 then pa = - pa end
+ if pb < 0 then pb = - pb end
+ if pc < 0 then pc = - pc end
+ t[j] = (t[j] + ((pa <= pb and pa <= pc and a) or (pb <= pc and b) or c)) % 256
+ end
+ end
+ if colordepth == 8 then
+ for j=2,len do
+ local v = t[j]
+ k = k + 1 ; o[k] = r[v]
+ end
+ elseif colordepth == 4 then
+ for j=2,len do
+ local v = t[j]
+ k = k + 1 ; o[k] = r[extract4(v,4)]
+ k = k + 1 ; o[k] = r[extract4(v,0)]
+ end
+ elseif colordepth == 2 then
+ for j=2,len do
+ local v = t[j]
+ k = k + 1 ; o[k] = r[extract2(v,6)]
+ k = k + 1 ; o[k] = r[extract2(v,4)]
+ k = k + 1 ; o[k] = r[extract2(v,2)]
+ k = k + 1 ; o[k] = r[extract2(v,0)]
+ end
+ else
+ for j=2,len do
+ local v = t[j]
+ k = k + 1 ; o[k] = r[extract1(v,7)]
+ k = k + 1 ; o[k] = r[extract1(v,6)]
+ k = k + 1 ; o[k] = r[extract1(v,5)]
+ k = k + 1 ; o[k] = r[extract1(v,4)]
+ k = k + 1 ; o[k] = r[extract1(v,3)]
+ k = k + 1 ; o[k] = r[extract1(v,2)]
+ k = k + 1 ; o[k] = r[extract1(v,1)]
+ k = k + 1 ; o[k] = r[extract1(v,0)]
+ end
+ end
+ u = t
+ end
+ return concat(o,"",1,size)
+ end
+ end
+
+ local function createmask_c(content,palette,transparent,xsize,ysize,colordepth,colorspace)
+ if palette then
+ local r = expandvector(transparent)
+ local size = xsize*ysize
+ local len = ceil(xsize*colordepth/8)
+ local o = newoutput(size)
+ content = zlibdecompress(content)
+ content = pngapplyfilter(content,len,ysize,1) -- nostrip (saves copy)
+ content = openstring(content)
+ for i=0,ysize-1 do
+ local t = readbytetable(content,len)
+ local k = i * xsize
+ if colordepth == 8 then
+ for j=1,len do
+ local v = t[j]
+ k = k + 1 ; o[k] = r[v]
+ end
+ elseif colordepth == 4 then
+ for j=1,len do
+ local v = t[j]
+ k = k + 1 ; o[k] = r[extract4(v,4)]
+ k = k + 1 ; o[k] = r[extract4(v,0)]
+ end
+ elseif colordepth == 2 then
+ for j=1,len do
+ local v = t[j]
+ k = k + 1 ; o[k] = r[extract2(v,6)]
+ k = k + 1 ; o[k] = r[extract2(v,4)]
+ k = k + 1 ; o[k] = r[extract2(v,2)]
+ k = k + 1 ; o[k] = r[extract2(v,0)]
+ end
+ else
+ for j=1,len do
+ local v = t[j]
+ k = k + 1 ; o[k] = r[extract1(v,7)]
+ k = k + 1 ; o[k] = r[extract1(v,6)]
+ k = k + 1 ; o[k] = r[extract1(v,5)]
+ k = k + 1 ; o[k] = r[extract1(v,4)]
+ k = k + 1 ; o[k] = r[extract1(v,3)]
+ k = k + 1 ; o[k] = r[extract1(v,2)]
+ k = k + 1 ; o[k] = r[extract1(v,1)]
+ k = k + 1 ; o[k] = r[extract1(v,0)]
+ end
+ end
+ end
+ return concat(o,"",1,size)
+ end
+ end
+
+ local function tocmyk_l(content,colordepth)
+ local l = #content
+ local t = { }
+ local n = 0
+ if colordepth == 8 then
+ for i=1,l,3 do
+ local r, g, b = byte(content,i,i+2)
+ n = n + 1 ; t[n] = char(255-r,255-g,255-b,0) -- a tad faster than chars[...]
+ end
+ else
+ for i=1,l,6 do
+ local r1, r2, g1, g2, b1, b2 = byte(content,i,i+5)
+ n = n + 1 ; t[n] = char(255-r1,255-r2,255-g1,255-g2,255-b1,255-b2,0,0)
+ end
+ end
+ return concat(t)
+ end
+
+ local tocmyk_c = pngtocmyk or tocmyk_l
+
+ local function converttocmyk(content,colorspace,colordepth)
+ if colorspace == "DeviceRGB" and colordepth == 8 or colordepth == 16 then
+ local done = tocmyk(content,colordepth)
+ if done then
+ content = done
+ colorspace = "DeviceCMYK"
+ end
+ end
+ return content, colorspace
+ end
+
+ local function switch(v)
+ if v then
+ filtermask = filtermask_l
+ decodemask = decodemask_l
+ decodestrip = decodestrip_l
+ transpose = transpose_l
+ expand = expand_l
+ createmask = createmask_l
+ tocmyk = tocmyk_l
+ else
+ filtermask = filtermask_c
+ decodemask = decodemask_c
+ decodestrip = decodestrip_c
+ transpose = transpose_c
+ expand = expand_c
+ createmask = createmask_c
+ tocmyk = tocmyk_c
+ end
+ end
+
+ if pngapplyfilter then
+ switch(false)
+ directives.register("graphics.png.purelua",switch)
+ else
+ switch(true)
+ end
+
+ local alwaysdecode = false -- trucky with palettes
+ local compresslevel = 3
+
+ directives.register("graphics.png.recompress", function(v)
+ alwaysdecode = v
+ end)
+
+ directives.register("graphics.png.compresslevel", function(v)
+ v = tonumber(v)
+ if compresslevel >= 0 or compresslevel <= 9 then
+ compresslevel = v
+ end
+ end)
+
+ function injectors.png(specification,method) -- todo: method in specification
+ if specification.error then
+ return
+ end
+ local filename = specification.filename
+ if not filename then
+ return
+ end
+ local colorspace = specification.colorspace
+ if not colorspace then
+ return
+ end
+ local interlace = specification.interlace or 0
+ if interlace == 1 then
+ interlace = true
+ elseif interlace == 0 then
+ interlace = false
+ else
+ report_png("unknown interlacing %i",interlace)
+ return
+ end
+ local tables = specification.tables
+ if not tables then
+ return
+ end
+ local idat = tables.idat
+ if not idat then
+ return
+ end
+ local pngfile = newcontent(filename,method)
+ if not pngfile then
+ return
+ end
+ local content = idat(pngfile,true)
+ tables.idat = false
+ --
+ -- if tables.gama then
+ -- report_png("ignoring gamma correction")
+ -- end
+ --
+ local xsize = specification.xsize
+ local ysize = specification.ysize
+ local colordepth = specification.colordepth or 8
+ local mask = false
+ local transparent = false
+ local palette = false
+ local enforcecmyk = specification.enforcecmyk
+ local colors = 1
+ if colorspace == 0 then -- gray | image b
+ colorspace = "DeviceGray"
+ transparent = true
+ elseif colorspace == 2 then -- rgb | image c
+ colorspace = "DeviceRGB"
+ colors = 3
+ transparent = true
+ elseif colorspace == 3 then -- palette | image c+i
+ colorspace = "DeviceRGB"
+ palette = true
+ transparent = true
+ elseif colorspace == 4 then -- gray | alpha | image b
+ colorspace = "DeviceGray"
+ mask = true
+ elseif colorspace == 6 then -- rgb | alpha | image c
+ colorspace = "DeviceRGB"
+ colors = 3
+ mask = true
+ else
+ report_png("unknown colorspace %i",colorspace)
+ return
+ end
+ --
+ if transparent then
+ local trns = tables.trns
+ if trns then
+ transparent = trns(pngfile,true)
+ if transparent == "" then
+ transparent = false
+ end
+ tables.trns = false
+ else
+ transparent = false
+ end
+ end
+ --
+ local decode = alwaysdecode -- tricky, might go away
+ local filter = pdfconstant("FlateDecode")
+ local major = pdfmajorversion()
+ local minor = pdfminorversion()
+ if major > 1 then
+ -- we're okay
+ elseif minor < 5 and colordepth == 16 then
+ report_png("16 bit colordepth not supported in pdf < 1.5")
+ return
+ elseif minor < 4 and (mask or transparent) then
+ report_png("alpha channels not supported in pdf < 1.4")
+ return
+ elseif minor < 2 then
+ report_png("you'd better use a version > 1.2")
+ return
+ -- decode = true
+ end
+ --
+ -- todo: compresslevel (or delegate)
+ --
+ if palette then
+ local plte = tables.plte
+ if plte then
+ palette = plte(pngfile,true)
+ if palette == "" then
+ palette = false
+ end
+ tables.plte = false
+ else
+ palette = false
+ end
+ end
+ --
+ if interlace then
+ local r, p = deinterlace(content,xsize,ysize,colordepth,colorspace,palette,mask)
+ if not r then
+ return
+ end
+ if p then
+ colordepth = p
+ end
+ if mask then
+ if not (colordepth == 8 or colordepth == 16) then
+ report_png("mask can't be split from the image")
+ return
+ end -- get rid of bpp:
+ content, mask = filtermask(r,xsize,ysize,colordepth,colorspace,false)
+ else
+ content = convert(r) -- can be in deinterlace if needed
+ end
+ if enforcecmyk then
+ content, colorspace = converttocmyk(content,colorspace,colordepth)
+ end
+ if compresslevel > 0 then
+ content = zlibcompress(content,compresslevel)
+ else
+ filter = nil
+ end
+ decode = true
+ elseif mask then
+ if not (colordepth == 8 or colordepth == 16) then
+ report_png("mask can't be split from the image")
+ return
+ end
+ content = zlibdecompress(content)
+ content, mask = decodemask(content,xsize,ysize,colordepth,colorspace)
+ if enforcecmyk and not palette then
+ content, colorspace = converttocmyk(content,colorspace,colordepth)
+ end
+ if compresslevel > 0 then
+ content = zlibcompress(content,compresslevel)
+ else
+ filter = nil
+ end
+ decode = true -- we don't copy the filter byte
+ elseif transparent then
+ -- in test suite
+ -- how about decode/recompress here
+ if palette then
+ mask = createmask(content,palette,transparent,xsize,ysize,colordepth,colorspace)
+ else
+ pallette = false
+ end
+ elseif decode or (enforcecmyk and not palette) then
+ -- this one needs checking
+ local bytes = analyze(colordepth,colorspace)
+ if bytes then
+ content = zlibdecompress(content)
+ content = decodestrip(openstring(content),xsize,ysize,bytes)
+ if enforcecmyk and not palette then
+ content, colorspace = converttocmyk(content,colorspace,colordepth)
+ end
+ if compresslevel > 0 then
+ content = zlibcompress(content,compresslevel)
+ else
+ filter = nil
+ end
+ else
+ return
+ end
+ decode = true -- due to enforcecmyk
+ else
+ -- print("PASS ON")
+ end
+ if palette then
+ local colorspace = "DeviceRGB"
+ local nofbytes = 3
+ if enforcecmyk then
+ palette = converttocmyk(palette,colorspace,8)
+ colorspace = "DeviceCMYK"
+ nofbytes = 4
+ end
+ palette = pdfarray {
+ pdfconstant("Indexed"),
+ pdfconstant(colorspace),
+ idiv(#palette,nofbytes),
+ pdfreference(pdfflushstreamobject(palette)),
+ }
+ end
+ pngfile:close()
+ local xobject = pdfdictionary {
+ Type = pdfconstant("XObject"),
+ Subtype = pdfconstant("Image"),
+ -- BBox = pdfarray { 0, 0, xsize, ysize },
+ Width = xsize,
+ Height = ysize,
+ BitsPerComponent = colordepth,
+ Filter = filter,
+ ColorSpace = palette or pdfconstant(colorspace),
+ Length = #content,
+ } + specification.attr
+ if mask then
+ local d = pdfdictionary {
+ Type = pdfconstant("XObject"),
+ Subtype = pdfconstant("Image"),
+ Width = xsize,
+ Height = ysize,
+ BitsPerComponent = palette and 8 or colordepth,
+ ColorSpace = pdfconstant("DeviceGray"),
+ }
+ xobject.SMask = pdfreference(pdfflushstreamobject(mask,d()))
+ end
+ if not decode then
+ xobject.DecodeParms = pdfdictionary {
+ Colors = colors,
+ Columns = xsize,
+ BitsPerComponent = colordepth,
+ Predictor = 15,
+ }
+ end
+ if trace then
+ report_png("%s: width %i, height %i, colordepth %i, size %i, palette %l, mask %l, transparent %l, decode %l",filename,xsize,ysize,colordepth,#content,palette,mask,transparent,decode)
+ end
+ if specification.colorref then
+ xobject.ColorSpace = pdfreference(specification.colorref)
+ end
+ local width = specification.width or xsize * 65536
+ local height = specification.height or ysize * 65536
+ return createimage {
+ bbox = { 0, 0, width/xsize, height/ysize }, -- mandate
+ transform = specification.transform,
+ nolength = true,
+ nobbox = true,
+ notype = true,
+ stream = content,
+ attr = xobject(),
+ }
+ end
+
+end
+
+do
+
+ local function pack(specification,what)
+ local t = { }
+ local n = 0
+ local s = specification.colorspace
+ local d = specification.data
+ local x = specification.xsize
+ local y = specification.ysize
+ if what == "mask" then
+ d = specification.mask
+ s = 1
+ elseif what == "indexed" then
+ s = 1
+ elseif what == "index" then
+ d = specification.index
+ s = - s
+ end
+ if s > 0 then
+ if s == 1 then
+ for i=1,y do
+ local r = d[i]
+ for j=1,x do
+ n = n + 1 ; t[n] = chars[r[j]]
+ end
+ end
+ elseif s == 2 then
+ for i=1,y do
+ local r = d[i]
+ for j=1,x do
+ local c = r[j]
+ n = n + 1 ; t[n] = chars[c[1]]
+ n = n + 1 ; t[n] = chars[c[2]]
+ n = n + 1 ; t[n] = chars[c[3]]
+ -- n = n + 1 ; t[n] = char(c[1],c[2],c[3]) -- test this
+ end
+ end
+ elseif s == 3 then
+ for i=1,y do
+ local r = d[i]
+ for j=1,x do
+ local c = r[j]
+ n = n + 1 ; t[n] = chars[c[1]]
+ n = n + 1 ; t[n] = chars[c[2]]
+ n = n + 1 ; t[n] = chars[c[3]]
+ n = n + 1 ; t[n] = chars[c[4]]
+ -- n = n + 1 ; t[n] = char(c[1],c[2],c[3],c[4]) -- test this
+ end
+ end
+ end
+ return concat(t)
+ else
+ local z = d[0] and 0 or 1
+ if s == -1 then
+ local f = formatters["%02X"]
+ for i=z,#d do
+ n = n + 1 ; t[n] = f(d[i])
+ end
+ elseif s == -2 then
+ local f = formatters["%02X%02X%02X"]
+ for i=z,#d do
+ local c = d[i]
+ n = n + 1 ; t[n] = f(c[1],c[2],c[3])
+ end
+ elseif s == -3 then
+ local f = formatters["%02X%02X%02X%02X"]
+ for i=z,#d do
+ local c = d[i]
+ n = n + 1 ; t[n] = f(c[1],c[2],c[3],c[4])
+ end
+ end
+ return "<" .. concat(t," ") .. ">"
+ end
+ return ""
+ end
+
+ function injectors.bitmap(specification)
+ local data = specification.data
+ if not data then
+ return
+ end
+ local xsize = specification.xsize or 0
+ local ysize = specification.ysize or 0
+ if xsize == 0 or ysize == 0 then
+ return
+ end
+ local colorspace = specification.colorspace or 1
+ if colorspace == 1 then
+ colorspace = "DeviceGray"
+ elseif colorspace == 2 then
+ colorspace = "DeviceRGB"
+ elseif colorspace == 3 then
+ colorspace = "DeviceCMYK"
+ end
+ local colordepth = (specification.colordepth or 2) == 16 or 8
+ local index = specification.index
+ local content = pack(specification,index and "indexed" or "data")
+ local mask = specification.mask
+ local colorspace = pdfconstant(colorspace)
+ if index then
+ colorspace = pdfarray {
+ pdfconstant("Indexed"),
+ colorspace,
+ #index + (index[0] and 0 or -1), -- upper index
+ pdfverbose(pack(specification,"index"))
+ }
+ end
+ local xobject = pdfdictionary {
+ Type = pdfconstant("XObject"),
+ Subtype = pdfconstant("Image"),
+ BBox = pdfarray { 0, 0, xsize, ysize },
+ Width = xsize,
+ Height = ysize,
+ BitsPerComponent = colordepth,
+ ColorSpace = colorspace,
+ Length = #content, -- specification.length
+ }
+ if mask then
+ local d = pdfdictionary {
+ Type = pdfconstant("XObject"),
+ Subtype = pdfconstant("Image"),
+ Width = xsize,
+ Height = ysize,
+ BitsPerComponent = colordepth,
+ ColorSpace = pdfconstant("DeviceGray"),
+ }
+ xobject.SMask = pdfreference(pdfflushstreamobject(pack(specification,"mask"),d()))
+ end
+ return createimage {
+ bbox = { 0, 0, specification.width/xsize, specification.height/ysize }, -- mandate
+ -- nolength = true,
+ nobbox = true,
+ notype = true,
+ stream = content,
+ attr = xobject(),
+ }
+ end
+
+ backends.pdf.codeinjections.bitmap = injectors.bitmap
+
+end
+
+-- local function validcompression(data)
+-- local d = utilities.streams.openstring(data)
+-- local b1 = utilities.streams.readbyte(d)
+-- local b2 = utilities.streams.readbyte(d)
+-- print(b1,b2)
+-- if (b1 * 256 + b2) % 31 ~= 0 then
+-- return false, "no zlib compressed file"
+-- end
+-- local method = band(b1,15)
+-- if method ~= 8 then
+-- return false, "method 8 expected"
+-- end
+-- local detail = band(rshift(b1,4),15)
+-- if detail > 7 then
+-- return false, "window 32 expected"
+-- end
+-- local preset = band(rshift(b2,5),1)
+-- if preset ~= 0 then
+-- return false, "unexpected preset dictionary"
+-- end
+-- return true
+-- end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-ini.lua
index ec837449f7e..2163e874852 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-ini.lua
@@ -12,12 +12,13 @@ local setmetatable, getmetatable, type, next, tostring, tonumber, rawset = setme
local char, byte, format, gsub, concat, match, sub, gmatch = string.char, string.byte, string.format, string.gsub, table.concat, string.match, string.sub, string.gmatch
local utfchar, utfbyte, utfvalues = utf.char, utf.byte, utf.values
local sind, cosd, max, min = math.sind, math.cosd, math.max, math.min
-local sort = table.sort
+local sort, sortedhash = table.sort, table.sortedhash
local P, C, R, S, Cc, Cs, V = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cc, lpeg.Cs, lpeg.V
local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
local formatters = string.formatters
local isboolean = string.is_boolean
local rshift = bit32.rshift
+local osdate, ostime = os.date, os.time
local report_objects = logs.reporter("backend","objects")
local report_finalizing = logs.reporter("backend","finalizing")
@@ -57,7 +58,7 @@ lpdf.flags = lpdf.flags or { } -- will be filled later
local trace_finalizers = false trackers.register("backend.finalizers", function(v) trace_finalizers = v end)
local trace_resources = false trackers.register("backend.resources", function(v) trace_resources = v end)
local trace_objects = false trackers.register("backend.objects", function(v) trace_objects = v end)
-local trace_detail = false trackers.register("backend.detail", function(v) trace_detail = v end)
+local trace_details = false trackers.register("backend.details", function(v) trace_details = v end)
do
@@ -169,23 +170,25 @@ end
local pdfgetpagereference
updaters.register("backend.update.lpdf",function()
- pdfreserveobject = pdf.reserveobj
- pdfimmediateobject = pdf.immediateobj
- pdfdeferredobject = pdf.obj
- pdfreferenceobject = pdf.refobj
+ pdfreserveobject = pdf.reserveobj
+ pdfimmediateobject = pdf.immediateobj
+ pdfdeferredobject = pdf.obj
+ pdfreferenceobject = pdf.refobj
- pdfgetpagereference = pdf.getpageref
+ pdfgetpagereference = pdf.getpageref
- pdfsetpageresources = pdf.setpageresources
- pdfsetpageattributes = pdf.setpageattributes
- pdfsetpagesattributes = pdf.setpagesattributes
+ pdfsetpageresources = pdf.setpageresources
+ pdfsetpageattributes = pdf.setpageattributes
+ pdfsetpagesattributes = pdf.setpagesattributes
end)
local jobpositions = job.positions
local getpos = jobpositions.getpos
+local getrpos = jobpositions.getrpos
jobpositions.registerhandlers {
getpos = pdf.getpos,
+ -- getrpos = pdf.getrpos,
gethpos = pdf.gethpos,
getvpos = pdf.getvpos,
}
@@ -204,8 +207,6 @@ do
return pdfprint(...)
end
- pdfbackend.codeinjections.print = lpdf.print -- will go
-
-- local function transform(llx,lly,urx,ury,rx,sx,sy,ry)
-- local x1 = llx * rx + lly * sy
-- local y1 = llx * sx + lly * ry
@@ -236,7 +237,7 @@ do
-- funny values for tx and ty
function lpdf.rectangle(width,height,depth,offset)
- local tx, ty = getpos()
+ local tx, ty = getpos() -- pdfgetpos, maybe some day use dir here
if offset then
tx = tx - offset
ty = ty + offset
@@ -866,18 +867,21 @@ end
local nofpages = 0
-function lpdf.pagereference(n)
+local texgetcount = tex.getcount
+
+function lpdf.pagereference(n,complete) -- true | false | nil | n [true,false]
if nofpages == 0 then
nofpages = structures.pages.nofpages
if nofpages == 0 then
nofpages = 1
end
end
- if n > nofpages then
- return pdfgetpagereference(nofpages) -- or 1, could be configureable
- else
- return pdfgetpagereference(n)
+ if n == true or not n then
+ complete = n
+ n = texgetcount("realpageno")
end
+ local r = n > nofpages and pdfgetpagereference(nofpages) or pdfgetpagereference(n)
+ return complete and pdfreference(r) or r
end
function lpdf.nofpages()
@@ -907,7 +911,7 @@ function lpdf.flushobject(name,data)
local named = names[name]
if named then
if not trace_objects then
- elseif trace_detail then
+ elseif trace_details then
report_objects("flushing data to reserved object with name %a, data: %S",name,data)
else
report_objects("flushing data to reserved object with name %a",name)
@@ -915,7 +919,7 @@ function lpdf.flushobject(name,data)
return pdfimmediateobject(named,tostring(data))
else
if not trace_objects then
- elseif trace_detail then
+ elseif trace_details then
report_objects("flushing data to reserved object with number %s, data: %S",name,data)
else
report_objects("flushing data to reserved object with number %s",name)
@@ -923,7 +927,7 @@ function lpdf.flushobject(name,data)
return pdfimmediateobject(name,tostring(data))
end
else
- if trace_objects and trace_detail then
+ if trace_objects and trace_details then
report_objects("flushing data: %S",name)
end
return pdfimmediateobject(tostring(name))
@@ -1249,32 +1253,47 @@ do
-- todo: share them
-- todo: force when not yet set
+ local f_font = formatters["%s%d"]
+
function lpdf.collectedresources(options)
local ExtGState = d_extgstates and next(d_extgstates ) and p_extgstates
local ColorSpace = d_colorspaces and next(d_colorspaces) and p_colorspaces
local Pattern = d_patterns and next(d_patterns ) and p_patterns
local Shading = d_shades and next(d_shades ) and p_shades
+ local Font
if options and options.patterns == false then
Pattern = nil
end
- if ExtGState or ColorSpace or Pattern or Shading then
+ local fonts = options and options.fonts
+ if fonts and next(fonts) then
+ local pdfgetfontobjnumber = lpdf.getfontobjnumber
+ if pdfgetfontobjnumber then
+ local prefix = options.fontprefix or "F"
+ Font = pdfdictionary { }
+ for k, v in sortedhash(fonts) do
+ Font[f_font(prefix,v)] = pdfreference(pdfgetfontobjnumber(k))
+ end
+ end
+ end
+ if ExtGState or ColorSpace or Pattern or Shading or Font then
local collected = pdfdictionary {
ExtGState = ExtGState,
ColorSpace = ColorSpace,
Pattern = Pattern,
Shading = Shading,
+ Font = Font,
}
if options and options.serialize == false then
return collected
else
return collected()
end
+ elseif options and options.notempty then
+ return nil
+ elseif options and options.serialize == false then
+ return pdfdictionary { }
else
- if options and options.serialize == false then
- return pdfdictionary { }
- else
- return ""
- end
+ return ""
end
end
@@ -1383,8 +1402,13 @@ do
lpdf.settime(tonumber(resolvers.variable("start_time")) or tonumber(resolvers.variable("SOURCE_DATE_EPOCH"))) -- bah
function lpdf.pdftimestamp(str)
- local Y, M, D, h, m, s, Zs, Zh, Zm = match(str,"^(%d%d%d%d)%-(%d%d)%-(%d%d)T(%d%d):(%d%d):(%d%d)([%+%-])(%d%d):(%d%d)$")
- return Y and format("D:%s%s%s%s%s%s%s%s'%s'",Y,M,D,h,m,s,Zs,Zh,Zm)
+ local t = type(str)
+ if t == "string" then
+ local Y, M, D, h, m, s, Zs, Zh, Zm = match(str,"^(%d%d%d%d)%-(%d%d)%-(%d%d)T(%d%d):(%d%d):(%d%d)([%+%-])(%d%d):(%d%d)$")
+ return Y and format("D:%s%s%s%s%s%s%s%s'%s'",Y,M,D,h,m,s,Zs,Zh,Zm)
+ else
+ return osdate("D:%Y%m%d%H%M%S",t == "number" and str or ostime()) -- maybe "!D..." : universal time
+ end
end
function lpdf.id(date)
@@ -1478,41 +1502,23 @@ end
do
- local f_actual_text_one = formatters["BT /Span << /ActualText <feff%04x> >> BDC %s EMC ET"]
- local f_actual_text_two = formatters["BT /Span << /ActualText <feff%04x%04x> >> BDC %s EMC ET"]
- local f_actual_text_one_b = formatters["BT /Span << /ActualText <feff%04x> >> BDC"]
- local f_actual_text_two_b = formatters["BT /Span << /ActualText <feff%04x%04x> >> BDC"]
- local f_actual_text_b = formatters["BT /Span << /ActualText <feff%s> >> BDC"]
- local s_actual_text_e = "EMC ET"
- local f_actual_text_b_not = formatters["/Span << /ActualText <feff%s> >> BDC"]
- local f_actual_text_one_b_not = formatters["/Span << /ActualText <feff%04x> >> BDC"]
- local f_actual_text_two_b_not = formatters["/Span << /ActualText <feff%04x%04x> >> BDC"]
- local s_actual_text_e_not = "EMC"
- local f_actual_text = formatters["/Span <</ActualText %s >> BDC"]
+ local f_actual_text_p = formatters["BT /Span << /ActualText <feff%s> >> BDC %s EMC ET"]
+ local f_actual_text_b = formatters["BT /Span << /ActualText <feff%s> >> BDC"]
+ local s_actual_text_e = "EMC ET"
+ local f_actual_text_b_not = formatters["/Span << /ActualText <feff%s> >> BDC"]
+ local s_actual_text_e_not = "EMC"
+ local f_actual_text = formatters["/Span <</ActualText %s >> BDC"]
local context = context
local pdfdirect = nodes.pool.directliteral -- we can use nuts.write deep down
-
- -- todo: use tounicode from the font mapper
-
- -- floor(unicode/1024) => rshift(unicode,10) -- better for 5.3
+ local tounicode = fonts.mappings.tounicode
function codeinjections.unicodetoactualtext(unicode,pdfcode)
- if unicode < 0x10000 then
- return f_actual_text_one(unicode,pdfcode)
- else
- return f_actual_text_two(rshift(unicode,10)+0xD800,unicode%1024+0xDC00,pdfcode)
- end
+ return f_actual_text_p(type(unicode) == "string" and unicode or tounicode(unicode),pdfcode)
end
function codeinjections.startunicodetoactualtext(unicode)
- if type(unicode) == "string" then
- return f_actual_text_b(unicode)
- elseif unicode < 0x10000 then
- return f_actual_text_one_b(unicode)
- else
- return f_actual_text_two_b(rshift(unicode,10)+0xD800,unicode%1024+0xDC00)
- end
+ return f_actual_text_b(type(unicode) == "string" and unicode or tounicode(unicode))
end
function codeinjections.stopunicodetoactualtext()
@@ -1520,13 +1526,7 @@ do
end
function codeinjections.startunicodetoactualtextdirect(unicode)
- if type(unicode) == "string" then
- return f_actual_text_b_not(unicode)
- elseif unicode < 0x10000 then
- return f_actual_text_one_b_not(unicode)
- else
- return f_actual_text_two_b_not(rshift(unicode,10)+0xD800,unicode%1024+0xDC00)
- end
+ return f_actual_text_b_not(type(unicode) == "string" and unicode or tounicode(unicode))
end
function codeinjections.stopunicodetoactualtextdirect()
@@ -1689,5 +1689,3 @@ end
if environment.arguments.nocompression then
lpdf.setcompression(0,0,true)
end
-
-
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-lmt.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-lmt.lua
new file mode 100644
index 00000000000..0ad0c4e5ec0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-lmt.lua
@@ -0,0 +1,2762 @@
+if not modules then modules = { } end modules ['lpdf-lmt'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- The code below was originally in back-lpd.lua but it makes more sense in
+-- this namespace. I will rename variables.
+--
+-- There is no way that a lua based backend can compete with the original one
+-- for relative simple text runs. And we're talking seconds here on say 500
+-- pages with paragraphs alternativng between three fonts and colors. But such
+-- documents are rare so in practice we are quite okay, especially because in
+-- ConTeXt we can gain quite a bit elsewhere. So, when we loose 30% on such
+-- simple documents, we break even on for instance the manual, and gain 30% on
+-- Thomas's turture test (also for other reasons). But .. who knows what magic
+-- I can cook up in due time.
+
+-- If you consider this complex, watch:
+--
+-- https://www.youtube.com/watch?v=6H-cAzfB2qo
+--
+-- or in distractionmode:
+--
+-- https://www.youtube.com/watch?v=TYuTE_1jvvE
+-- https://www.youtube.com/watch?v=nnicGKX3lvM
+--
+-- For the moment we have to support the built in backend as well as the alternative. So
+-- the next interface is suboptimal and will change at some time. At that moment I will
+-- also optimize and extend.
+
+local type, next, unpack, tonumber = type, next, unpack, tonumber
+local char, rep, find = string.char, string.rep, string.find
+local formatters, splitupstring = string.formatters, string.splitup
+local band, extract = bit32.band, bit32.extract
+local concat, sortedhash = table.concat, table.sortedhash
+local setmetatableindex = table.setmetatableindex
+local loaddata = io.loaddata
+
+local bpfactor <const> = number.dimenfactors.bp
+
+local md5HEX = md5.HEX
+local osuuid = os.uuid
+local zlibcompress = (xzip or zlib).compress
+
+local nuts = nodes.nuts
+local tonut = nodes.tonut
+
+local getdata = nuts.getdata
+local getsubtype = nuts.getsubtype
+local getwhd = nuts.getwhd
+local flushlist = nuts.flush_list
+
+local pdfincludeimage = lpdf.includeimage
+local pdfgetfontname = lpdf.getfontname
+local pdfgetfontobjnumber = lpdf.getfontobjnumber
+
+local pdfreserveobject = lpdf.reserveobject
+local pdfpagereference = lpdf.pagereference
+local pdfflushobject = lpdf.flushobject
+local pdfreference = lpdf.reference
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfconstant = lpdf.constant
+local pdfflushstreamobject = lpdf.flushstreamobject
+local pdfliteral = lpdf.literal -- not to be confused with a whatsit!
+
+local pdf_pages = pdfconstant("Pages")
+local pdf_page = pdfconstant("Page")
+local pdf_xobject = pdfconstant("XObject")
+local pdf_form = pdfconstant("Form")
+
+local fonthashes = fonts.hashes
+local characters = fonthashes.characters
+local descriptions = fonthashes.descriptions
+local parameters = fonthashes.parameters
+local properties = fonthashes.properties
+
+local report = logs.reporter("backend")
+
+-- used variables
+
+local pdf_h, pdf_v
+local need_tm, need_tf, cur_tmrx, cur_factor, cur_f, cur_e
+local need_width, need_mode, done_width, done_mode
+local mode
+local f_pdf_cur, f_pdf, fs_cur, fs, f_cur
+local tj_delta, cw
+local usedfonts, usedxforms, usedximages, usedxgroups
+local getxformname, getximagename
+local boundingbox, shippingmode, objectnumber
+local tmrx, tmry, tmsx, tmsy, tmtx, tmty
+local cmrx, cmry, cmsx, cmsy, cmtx, cmty
+
+local function usefont(t,k) -- a bit redundant hash
+ local v = pdfgetfontname(k)
+ t[k] = v
+ return v
+end
+
+local function reset_variables(specification)
+ pdf_h, pdf_v = 0, 0
+ cmrx, cmry = 1, 1
+ cmsx, cmsy = 0, 0
+ cmtx, cmty = 0, 0
+ tmrx, tmry = 1, 1
+ tmsx, tmsy = 0, 0
+ tmtx, tmty = 0, 0
+ need_tm = false
+ need_tf = false
+ need_width = 0
+ need_mode = 0
+ done_width = false
+ done_mode = false
+ mode = "page"
+ shippingmode = specification.shippingmode
+ objectnumber = specification.objectnumber
+ cur_tmrx = 0
+ f_cur = 0
+ f_pdf_cur = 0 -- nullfont
+ f_pdf = 0 -- nullfont
+ fs_cur = 0
+ fs = 0
+ tj_delta = 0
+ cur_factor = 0
+ cur_f = false
+ cur_e = false
+ cw = 0
+ usedfonts = setmetatableindex(usefont)
+ usedxforms = { }
+ usedximages = { }
+ -- usedxgroups = { }
+ boundingbox = specification.boundingbox
+end
+
+-- buffer
+
+local buffer = { }
+local b = 0
+
+local function reset_buffer()
+ b = 0
+end
+
+-- fonts
+
+local fontcharacters
+local fontdescriptions
+local fontparameters
+local fontproperties
+local usedcharacters = setmetatableindex("table")
+local pdfcharacters
+
+local horizontalmode = true
+----- widefontmode = true
+local scalefactor = 1
+local threshold = 655360
+local tjfactor <const> = 100 / 65536
+
+lpdf.usedcharacters = usedcharacters
+
+local function updatefontstate(font)
+ fontcharacters = characters[font]
+ fontdescriptions = descriptions[font]
+ fontparameters = parameters[font]
+ fontproperties = properties[font]
+ local size = fontparameters.size -- or bad news
+ local designsize = fontparameters.designsize or size
+ pdfcharacters = usedcharacters[font]
+ horizontalmode = fontparameters.writingmode ~= "vertical"
+ -- widefontmode = fontproperties.encodingbytes == 2
+ scalefactor = (designsize/size) * tjfactor
+ local fthreshold = fontproperties.threshold
+ threshold = (fthreshold and (size * fthreshold / 100)) or 655360
+end
+
+-- helpers
+
+local f_cm = formatters["%.6N %.6N %.6N %.6N %.6N %.6N cm"]
+local f_tm = formatters["%.6N %.6N %.6N %.6N %.6N %.6N Tm"]
+
+local saved_text_pos_v = 0
+local saved_text_pos_h = 0
+
+local function begin_text()
+ saved_text_pos_h = pdf_h
+ saved_text_pos_v = pdf_v
+ b = b + 1 ; buffer[b] = "BT"
+ need_tf = true
+ need_width = 0
+ need_mode = 0
+ mode = "text"
+end
+
+local function end_text()
+ if done_width then
+ b = b + 1 ; buffer[b] = "0 w"
+ done_width = false
+ end
+ if done_mode then
+ b = b + 1 ; buffer[b] = "0 Tr"
+ done_mode = false
+ end
+ b = b + 1 ; buffer[b] = "ET"
+ pdf_h = saved_text_pos_h
+ pdf_v = saved_text_pos_v
+ mode = "page"
+end
+
+local saved_chararray_pos_h
+local saved_chararray_pos_v
+
+local saved_b = 0
+
+local function begin_chararray()
+ saved_chararray_pos_h = pdf_h
+ saved_chararray_pos_v = pdf_v
+ cw = horizontalmode and saved_chararray_pos_h or - saved_chararray_pos_v
+ tj_delta = 0
+ saved_b = b
+ b = b + 1 ; buffer[b] = " ["
+ mode = "chararray"
+end
+
+local function end_chararray()
+ b = b + 1 ; buffer[b] = "] TJ"
+ buffer[saved_b] = concat(buffer,"",saved_b,b)
+ b = saved_b
+ pdf_h = saved_chararray_pos_h
+ pdf_v = saved_chararray_pos_v
+ mode = "text"
+end
+
+local function begin_charmode()
+ b = b + 1 ; buffer[b] = "<"
+ mode = "char"
+end
+
+local function end_charmode()
+ b = b + 1 ; buffer[b] = ">"
+ mode = "chararray"
+end
+
+local function calc_pdfpos(h,v)
+ -- mostly char
+ if mode == "page" then
+ cmtx = h - pdf_h
+ cmty = v - pdf_v
+ return h ~= pdf_h or v ~= pdf_v
+ elseif mode == "text" then
+ tmtx = h - saved_text_pos_h
+ tmty = v - saved_text_pos_v
+ return h ~= pdf_h or v ~= pdf_v
+ elseif horizontalmode then
+ tmty = v - saved_text_pos_v
+ tj_delta = cw - h
+ return tj_delta ~= 0 or v ~= pdf_v
+ else
+ tmtx = h - saved_text_pos_h
+ tj_delta = cw + v
+ return tj_delta ~= 0 or h ~= pdf_h
+ end
+end
+
+local function pdf_set_pos(h,v)
+ local move = calc_pdfpos(h,v)
+ if move then
+ b = b + 1 ; buffer[b] = f_cm(cmrx, cmsx, cmsy, cmry, cmtx*bpfactor, cmty*bpfactor)
+ pdf_h = pdf_h + cmtx
+ pdf_v = pdf_v + cmty
+ end
+end
+
+local function pdf_reset_pos()
+ if mode == "page" then
+ cmtx = - pdf_h
+ cmty = - pdf_v
+ if pdf_h == 0 and pdf_v == 0 then
+ return
+ end
+ elseif mode == "text" then
+ tmtx = - saved_text_pos_h
+ tmty = - saved_text_pos_v
+ if pdf_h == 0 and pdf_v == 0 then
+ return
+ end
+ elseif horizontalmode then
+ tmty = - saved_text_pos_v
+ tj_delta = cw
+ if tj_delta == 0 and pdf_v == 0 then
+ return
+ end
+ else
+ tmtx = - saved_text_pos_h
+ tj_delta = cw
+ if tj_delta == 0 and pdf_h == 0 then
+ return
+ end
+ end
+ b = b + 1 ; buffer[b] = f_cm(cmrx, cmsx, cmsy, cmry, cmtx*bpfactor, cmty*bpfactor)
+ pdf_h = pdf_h + cmtx
+ pdf_v = pdf_v + cmty
+end
+
+local function pdf_set_pos_temp(h,v)
+ local move = calc_pdfpos(h,v)
+ if move then
+ b = b + 1 ; buffer[b] = f_cm(cmrx, cmsx, cmsy, cmry, cmtx*bpfactor, cmty*bpfactor)
+ end
+end
+
+-- these dummy returns makes using them a bit faster
+
+local function pdf_end_string_nl()
+ if mode == "char" then
+ end_charmode()
+ return end_chararray()
+ elseif mode == "chararray" then
+ return end_chararray()
+ end
+end
+
+local function pdf_goto_textmode()
+ if mode == "page" then
+ pdf_reset_pos()
+ return begin_text()
+ elseif mode ~= "text" then
+ if mode == "char" then
+ end_charmode()
+ return end_chararray()
+ else -- if mode == "chararray" then
+ return end_chararray()
+ end
+ end
+end
+
+local function pdf_goto_pagemode()
+ if mode ~= "page" then
+ if mode == "char" then
+ end_charmode()
+ end_chararray()
+ return end_text()
+ elseif mode == "chararray" then
+ end_chararray()
+ return end_text()
+ elseif mode == "text" then
+ return end_text()
+ end
+ end
+end
+
+local function pdf_goto_fontmode()
+ if mode == "char" then
+ end_charmode()
+ end_chararray()
+ end_text()
+ elseif mode == "chararray" then
+ end_chararray()
+ end_text()
+ elseif mode == "text" then
+ end_text()
+ end
+ pdf_reset_pos()
+ mode = "page"
+end
+
+-- characters
+
+local flushcharacter do
+
+ local round = math.round
+
+ -- across pages ... todo: clean up because we don't need to pass the font
+ -- as fontparameters already has checked / set it we can also have a variable
+ -- for it so
+
+ local naturalwidth = nil
+
+ local naturalwidths = setmetatableindex(function(t,font)
+ local d = descriptions[font]
+ local c = characters[font]
+ local f = parameters[font].hfactor
+ local v = setmetatableindex(function(t,char)
+ local e = d and d[char]
+ local w = 0
+ if e then
+ w = e.width
+ if w then
+ w = w * f
+ end
+ end
+ e = c[char]
+ if e then
+ w = e.width or 0
+ end
+ t[char] = w
+ return w
+ end)
+ t[font] = v
+ return v
+ end)
+
+ local function setup_fontparameters(font,factor,f,e)
+ local slant = fontparameters.slantfactor or 0
+ local extend = fontparameters.extendfactor or 1
+ local squeeze = fontparameters.squeezefactor or 1
+ local expand = 1 + factor / 1000000
+ local format = fontproperties.format
+ if e then
+ extend = extend * e
+ end
+ tmrx = expand * extend
+ tmsy = slant
+ tmry = squeeze
+ need_width = fontparameters.width or 0
+ need_mode = fontparameters.mode or 0
+ f_cur = font
+ f_pdf = usedfonts[font] -- cache
+ cur_factor = factor
+ cur_f = f
+ cur_e = e
+ tj_delta = 0
+ fs = fontparameters.size * bpfactor
+ if f then
+ fs = fs * f
+ end
+ -- kind of special:
+ if format == "opentype" or format == "type1" then
+ fs = fs * 1000 / fontparameters.units -- can we avoid this ?
+ end
+ --
+ naturalwidth = naturalwidths[font]
+ end
+
+ -- This only saves a little on hz because there we switch a lot of
+ -- instances.
+
+ -- local lastslant, lastextend, lastsqueeze, lastformat, lastsize, lastwidth, lastmode, lastused, lastfont
+
+ -- local function setup_fontparameters(font,factor,f,e)
+ -- if font ~= lastfont then
+ -- lastslant = fontparameters.slantfactor or 0
+ -- lastextend = fontparameters.extendfactor or 1
+ -- lastsqueeze = fontparameters.squeezefactor or 1
+ -- lastformat = fontproperties.format
+ -- lastsize = fontparameters.size * bpfactor
+ -- if format == "opentype" or format == "type1" then
+ -- lastsize = lastsize * 1000 / fontparameters.units -- can we avoid this ?
+ -- end
+ -- lastwidth = fontparameters.width
+ -- lastmode = fontparameters.mode
+ -- lastused = usedfonts[font] -- cache
+ -- lastfont = font
+ -- end
+ -- local expand = 1 + factor / 1000000
+ -- if e then
+ -- tmrx = expand * lastextend * e
+ -- else
+ -- tmrx = expand * lastextend
+ -- end
+ -- tmsy = lastslant
+ -- tmry = lastsqueeze
+ -- need_width = lastwidth
+ -- need_mode = lastmode
+ -- f_cur = lastfont
+ -- f_pdf = lastused
+ -- cur_factor = factor
+ -- cur_f = f
+ -- cur_e = e
+ -- tj_delta = 0
+ -- if f then
+ -- fs = lastsize * f
+ -- else
+ -- fs = lastsize
+ -- end
+ -- end
+
+ local f_width = formatters["%.6N w"]
+ local f_mode = formatters["%i Tr"] -- can be hash
+ local f_font = formatters["/F%i %.6N Tf"] -- can be hash
+
+ local s_width <const> = "0 w"
+ local s_mode <const> = "0 Tr"
+
+ local function set_font()
+ -- if need_width and need_width ~= 0 then
+ if need_width ~= 0 then
+ b = b + 1 ; buffer[b] = f_width(bpfactor * need_width / 1000)
+ done_width = true
+ elseif done_width then
+ b = b + 1 ; buffer[b] = s_width
+ done_width = false
+ end
+ -- if need_mode and need_mode ~= 0 then
+ if need_mode ~= 0 then
+ b = b + 1 ; buffer[b] = f_mode(need_mode)
+ done_mode = true
+ elseif done_mode then
+ b = b + 1 ; buffer[b] = s_mode
+ done_mode = false
+ end
+ b = b + 1 ; buffer[b] = f_font(f_pdf,fs)
+ f_pdf_cur = f_pdf
+ fs_cur = fs
+ need_tf = false
+ need_tm = true
+ end
+
+ local function set_textmatrix(h,v)
+ local move = calc_pdfpos(h,v)
+ if need_tm or move then
+ b = b + 1 ; buffer[b] = f_tm(tmrx, tmsx, tmsy, tmry, tmtx*bpfactor, tmty*bpfactor)
+ pdf_h = saved_text_pos_h + tmtx
+ pdf_v = saved_text_pos_v + tmty
+ need_tm = false
+ end
+ cur_tmrx = tmrx
+ end
+
+ local f_hex_4 = formatters["%04X"]
+ local f_hex_2 = formatters["%02X"]
+
+ local h_hex_4 = setmetatableindex(function(t,k) -- we already have this somewhere
+ if k < 256 then -- maybe 512
+ -- not sparse in this range
+ for i=0,255 do
+ t[i] = f_hex_4(i)
+ end
+ return t[k]
+ else
+ local v = f_hex_4(k)
+ t[k] = v
+ return v
+ end
+ end)
+ local h_hex_2 = setmetatableindex(function(t,k) -- we already have this somewhere
+ local v = k < 256 and f_hex_2(k) or "00"
+ t[k] = v
+ return v
+ end)
+
+ local trace_threshold = false trackers.register("backends.pdf.threshold", function(v) trace_threshold = v end)
+
+ flushcharacter = function(current,pos_h,pos_v,pos_r,font,char,data,f,e,factor) -- ,naturalwidth,width)
+ if need_tf or font ~= f_cur or f_pdf ~= f_pdf_cur or fs ~= fs_cur or mode == "page" then
+ pdf_goto_textmode()
+ setup_fontparameters(font,factor,f,e)
+ set_font()
+ elseif cur_tmrx ~= tmrx or cur_factor ~= factor or cur_f ~= f or cur_e ~= e then
+ setup_fontparameters(font,factor,f,e)
+ need_tm = true
+ end
+ local move = calc_pdfpos(pos_h,pos_v)
+
+ -- if trace_threshold then
+ -- report(
+ -- "font %i, char %C, factor %i, naturalwidth %p, move %l, tm %l, hpos %p, delta %p, threshold %p, cw %p",
+ -- font,char,factor,naturalwidth[char],move,need_tm,pos_h,tj_delta,threshold,cw
+ -- )
+ -- end
+
+ if move or need_tm then
+ if not need_tm then
+ if horizontalmode then
+ if (saved_text_pos_v + tmty) ~= pdf_v then
+ need_tm = true
+ elseif tj_delta >= threshold or tj_delta <= -threshold then
+ need_tm = true
+ end
+ else
+ if (saved_text_pos_h + tmtx) ~= pdf_h then
+ need_tm = true
+ elseif tj_delta >= threshold or tj_delta <= -threshold then
+ need_tm = true
+ end
+ end
+ end
+ if need_tm then
+ pdf_goto_textmode()
+ set_textmatrix(pos_h,pos_v)
+ begin_chararray()
+ move = calc_pdfpos(pos_h,pos_v)
+ end
+ if move then
+ local d = tj_delta * scalefactor
+ if d <= -0.5 or d >= 0.5 then
+ if mode == "char" then
+ end_charmode()
+ end
+ b = b + 1 ; buffer[b] = round(d) -- or f_skip(d)
+ end
+ cw = cw - tj_delta
+ end
+ end
+
+ if mode == "chararray" then
+ begin_charmode()
+ end
+
+ -- cw = cw + naturalwidth
+ -- cw = cw + width
+ cw = cw + naturalwidth[char]
+
+ local index = data.index or char
+
+ b = b + 1 ; buffer[b] = font > 0 and h_hex_4[index] or h_hex_2[index]
+
+ if not pdfcharacters[index] then
+ pdfcharacters[index] = true
+ end
+
+ end
+
+ flushfontchar = function(font,char,data)
+ local dummy = usedfonts[font]
+ local index = data.index or char
+ if not pdfcharacters[index] then
+ pdfcharacters[index] = true
+ end
+ return dummy
+ end
+
+end
+
+-- literals
+
+local flushliteral do
+
+ local nodeproperties <const> = nodes.properties.data
+ local literalvalues <const> = nodes.literalvalues
+
+ local originliteral_code <const> = literalvalues.origin
+ local pageliteral_code <const> = literalvalues.page
+ local alwaysliteral_code <const> = literalvalues.always
+ local rawliteral_code <const> = literalvalues.raw
+ local textliteral_code <const> = literalvalues.text
+ local fontliteral_code <const> = literalvalues.font
+
+ flushliteral = function(current,pos_h,pos_v,mode,str)
+ if mode then
+ if not str then
+ mode, str = originliteral_code, mode
+ elseif mode == "mode" then
+ mode = literalvalues[str]
+ if mode == originliteral_code then
+ pdf_goto_pagemode()
+ pdf_set_pos(pos_h,pos_v)
+ elseif mode == pageliteral_code then
+ pdf_goto_pagemode()
+ elseif mode == textliteral_code then
+ pdf_goto_textmode()
+ elseif mode == fontliteral_code then
+ pdf_goto_fontmode()
+ elseif mode == alwaysliteral_code then
+ pdf_end_string_nl()
+ need_tm = true
+ elseif mode == rawliteral_code then
+ pdf_end_string_nl()
+ end
+ return
+ else
+ mode = literalvalues[mode]
+ end
+ else
+ local p = nodeproperties[current]
+ if p then
+ str = p.data
+ mode = p.mode
+ else
+ str, mode = getdata(current)
+ end
+ end
+ if str and str ~= "" then
+ if mode == originliteral_code then
+ pdf_goto_pagemode()
+ pdf_set_pos(pos_h,pos_v)
+ elseif mode == pageliteral_code then
+ pdf_goto_pagemode()
+ elseif mode == textliteral_code then
+ pdf_goto_textmode()
+ elseif mode == fontliteral_code then
+ pdf_goto_fontmode()
+ elseif mode == alwaysliteral_code then
+ pdf_end_string_nl()
+ need_tm = true
+ elseif mode == rawliteral_code then
+ pdf_end_string_nl()
+ else
+ report("check literal")
+ pdf_goto_pagemode()
+ pdf_set_pos(pos_h,pos_v)
+ end
+ b = b + 1 ; buffer[b] = str
+ end
+ end
+
+ updaters.register("backend.update.pdf",function()
+ function pdf.print(mode,str)
+ if str then
+ mode = literalvalues[mode]
+ else
+ mode, str = originliteral_code, mode
+ end
+ if str and str ~= "" then
+ if mode == originliteral_code then
+ pdf_goto_pagemode()
+ -- pdf_set_pos(pdf_h,pdf_v)
+ elseif mode == pageliteral_code then
+ pdf_goto_pagemode()
+ elseif mode == textliteral_code then
+ pdf_goto_textmode()
+ elseif mode == fontliteral_code then
+ pdf_goto_fontmode()
+ elseif mode == alwaysliteral_code then
+ pdf_end_string_nl()
+ need_tm = true
+ elseif mode == rawliteral_code then
+ pdf_end_string_nl()
+ else
+ pdf_goto_pagemode()
+ -- pdf_set_pos(pdf_h,pdf_v)
+ end
+ b = b + 1 ; buffer[b] = str
+ end
+ end
+ end)
+
+end
+
+-- grouping & orientation
+
+local flushsave, flushrestore, flushsetmatrix do
+
+ local matrices = { }
+ local positions = { }
+ local nofpositions = 0
+ local nofmatrices = 0
+
+ local f_matrix = formatters["%s 0 0 cm"]
+
+ flushsave = function(current,pos_h,pos_v)
+ nofpositions = nofpositions + 1
+ positions[nofpositions] = { pos_h, pos_v, nofmatrices }
+ pdf_goto_pagemode()
+ pdf_set_pos(pos_h,pos_v)
+ b = b + 1 ; buffer[b] = "q"
+ end
+
+ flushrestore = function(current,pos_h,pos_v)
+ if nofpositions < 1 then
+ return
+ end
+ local t = positions[nofpositions]
+ -- local h = pos_h - t[1]
+ -- local v = pos_v - t[2]
+ if shippingmode == "page" then
+ nofmatrices = t[3]
+ end
+ pdf_goto_pagemode()
+ pdf_set_pos(pos_h,pos_v)
+ b = b + 1 ; buffer[b] = "Q"
+ nofpositions = nofpositions - 1
+ end
+
+ local function pdf_set_matrix(str,pos_h,pos_v)
+ if shippingmode == "page" then
+ local rx, sx, sy, ry = splitupstring(str," ")
+ if rx and ry and sx and ry then
+ rx, sx, sy, ry = tonumber(rx), tonumber(sx), tonumber(sy), tonumber(ry)
+ local tx = pos_h * (1 - rx) - pos_v * sy
+ local ty = pos_v * (1 - ry) - pos_h * sx
+ if nofmatrices > 1 then
+ local t = matrices[nofmatrices]
+ local r_x, s_x, s_y, r_y, te, tf = t[1], t[2], t[3], t[4], t[5], t[6]
+ rx, sx = rx * r_x + sx * s_y, rx * s_x + sx * r_y
+ sy, ry = sy * r_x + ry * s_y, sy * s_x + ry * r_y
+ tx, ty = tx * r_x + ty * s_y, tx * s_x + ty * r_y
+ end
+ nofmatrices = nofmatrices + 1
+ matrices[nofmatrices] = { rx, sx, sy, ry, tx, ty }
+ end
+ end
+ end
+
+ local nodeproperties = nodes.properties.data
+
+ flushsetmatrix = function(current,pos_h,pos_v)
+ local str
+ if type(current) == "string" then
+ str = current
+ else
+ local p = nodeproperties[current]
+ if p then
+ str = p.matrix
+ else
+ str = getdata(current) -- for the moment
+ end
+ end
+ if str and str ~= "" then
+ pdf_set_matrix(str,pos_h,pos_v)
+ pdf_goto_pagemode()
+ pdf_set_pos(pos_h,pos_v)
+ b = b + 1 ; buffer[b] = f_matrix(str)
+ end
+ end
+
+ do
+
+ local function hasmatrix()
+ return nofmatrices > 0
+ end
+
+ local function getmatrix()
+ if nofmatrices > 0 then
+ return unpack(matrices[nofmatrices])
+ else
+ return 1, 0, 0, 1, 0, 0
+ end
+ end
+
+ updaters.register("backend.update.pdf",function()
+ pdf.hasmatrix = hasmatrix
+ pdf.getmatrix = getmatrix
+ end)
+
+ end
+
+ pushorientation = function(orientation,pos_h,pos_v,pos_r)
+ pdf_goto_pagemode()
+ pdf_set_pos(pos_h,pos_v)
+ b = b + 1 ; buffer[b] = "q"
+ if orientation == 1 then
+ b = b + 1 ; buffer[b] = "0 -1 1 0 0 0 cm" -- 90
+ elseif orientation == 2 then
+ b = b + 1 ; buffer[b] = "-1 0 0 -1 0 0 cm" -- 180
+ elseif orientation == 3 then
+ b = b + 1 ; buffer[b] = "0 1 -1 0 0 0 cm" -- 270
+ end
+ end
+
+ poporientation = function(orientation,pos_h,pos_v,pos_r)
+ pdf_goto_pagemode()
+ pdf_set_pos(pos_h,pos_v)
+ b = b + 1 ; buffer[b] = "Q"
+ end
+
+ -- pushorientation = function(orientation,pos_h,pos_v,pos_r)
+ -- flushsave(false,pos_h,pos_v)
+ -- if orientation == 1 then
+ -- flushsetmatrix("0 -1 1 0",pos_h,pos_v)
+ -- elseif orientation == 2 then
+ -- flushsetmatrix("-1 0 0 -1",pos_h,pos_v)
+ -- elseif orientation == 3 then
+ -- flushsetmatrix("0 1 -1 0",pos_h,pos_v)
+ -- end
+ -- end
+
+ -- poporientation = function(orientation,pos_h,pos_v,pos_r)
+ -- flushrestore(false,pos_h,pos_v)
+ -- end
+
+end
+
+-- rules
+
+local flushedxforms = { } -- actually box resources but can also be direct
+local localconverter = nil -- will be set
+
+local flushrule, flushsimplerule, flushimage, flushgroup do
+
+ local rulecodes = nodes.rulecodes
+ local newrule = nodes.pool.rule
+
+ local setprop = nuts.setprop
+ local getprop = nuts.getprop
+
+ local normalrule_code <const> = rulecodes.normal
+ local boxrule_code <const> = rulecodes.box
+ local imagerule_code <const> = rulecodes.image
+ local emptyrule_code <const> = rulecodes.empty
+ local userrule_code <const> = rulecodes.user
+ local overrule_code <const> = rulecodes.over
+ local underrule_code <const> = rulecodes.under
+ local fractionrule_code <const> = rulecodes.fraction
+ local radicalrule_code <const> = rulecodes.radical
+ local outlinerule_code <const> = rulecodes.outline
+
+ local rule_callback = callbacks.functions.process_rule
+
+ local f_fm = formatters["/Fm%d Do"]
+ local f_im = formatters["/Im%d Do"]
+ local f_gr = formatters["/Gp%d Do"]
+
+ local s_b <const> = "q"
+ local s_e <const> = "Q"
+
+ local f_v = formatters["[] 0 d 0 J %.6N w 0 0 m %.6N 0 l S"]
+ local f_h = formatters["[] 0 d 0 J %.6N w 0 0 m 0 %.6N l S"]
+
+ local f_f = formatters["0 0 %.6N %.6N re f"]
+ local f_o = formatters["[] 0 d 0 J 0 0 %.6N %.6N re S"]
+ local f_w = formatters["[] 0 d 0 J %.6N w 0 0 %.6N %.6N re S"]
+
+ -- Historically the index is an object which is kind of bad.
+
+ local boxresources, n = { }, 0
+
+ getxformname = function(index)
+ local l = boxresources[index]
+ if l then
+ return l.name
+ else
+ report("no box resource %S",index)
+ end
+ end
+
+ updaters.register("backend.update.pdf",function()
+ pdf.getxformname = getxformname
+ end)
+
+ local function saveboxresource(box,attributes,resources,immediate,kind,margin)
+ n = n + 1
+ local immediate = true
+ local margin = margin or 0 -- or dimension
+ local objnum = pdfreserveobject()
+ local list = tonut(type(box) == "number" and tex.takebox(box) or box)
+ --
+ local width, height, depth = getwhd(list)
+ --
+ local l = {
+ width = width,
+ height = height,
+ depth = depth,
+ margin = margin,
+ attributes = attributes,
+ resources = resources,
+ list = nil,
+ type = kind,
+ name = n,
+ index = objnum,
+ objnum = objnum,
+ }
+ boxresources[objnum] = l
+ if immediate then
+ localconverter(list,"xform",objnum,l)
+ flushedxforms[objnum] = { true , objnum }
+ flushlist(list)
+ else
+ l.list = list
+ end
+ return objnum
+ end
+
+ local function useboxresource(index,wd,ht,dp)
+ local l = boxresources[index]
+ if l then
+ if wd or ht or dp then
+ wd, ht, dp = wd or 0, ht or 0, dp or 0
+ else
+ wd, ht, dp = l.width, l.height, l.depth
+ end
+ local rule = newrule(wd,ht,dp) -- newboxrule
+ rule.subtype = boxrule_code
+ setprop(tonut(rule),"index",index)
+ return rule, wd, ht, dp
+ else
+ report("no box resource %S",index)
+ end
+ end
+
+ local function getboxresourcedimensions(index)
+ local l = boxresources[index]
+ if l then
+ return l.width, l.height, l.depth, l.margin
+ else
+ report("no box resource %S",index)
+ end
+ end
+
+ local function getboxresourcebox(index)
+ local l = boxresources[index]
+ if l then
+ return l.list
+ end
+ end
+
+ updaters.register("backend.update.tex",function()
+ tex.saveboxresource = saveboxresource
+ tex.useboxresource = useboxresource
+ tex.getboxresourcedimensions = getboxresourcedimensions
+ tex.getboxresourcebox = getboxresourcebox
+ end)
+
+ -- a bit of a mess: index is now objnum but that has to change to a proper index
+ -- ... an engine inheritance
+
+ local function flushpdfxform(current,pos_h,pos_v,pos_r,size_h,size_v)
+ -- object properties
+ local objnum = getprop(current,"index")
+ local name = getxformname(objnum)
+ local info = flushedxforms[objnum]
+ local r = boxresources[objnum]
+ if not info then
+ info = { false , objnum }
+ flushedxforms[objnum] = info
+ end
+ local wd, ht, dp = getboxresourcedimensions(objnum)
+ -- or: wd, ht, dp = r.width, r.height, r.depth
+ -- sanity check
+ local htdp = ht + dp
+ if wd == 0 or size_h == 0 or htdp == 0 or size_v == 0 then
+ return
+ end
+ -- calculate scale
+ local rx, ry = 1, 1
+ if wd ~= size_h or htdp ~= size_v then
+ rx = size_h / wd
+ ry = size_v / htdp
+ end
+ -- flush the reference
+ usedxforms[objnum] = true
+ pdf_goto_pagemode()
+ calc_pdfpos(pos_h,pos_v)
+ tx = cmtx * bpfactor
+ ty = cmty * bpfactor
+ b = b + 1 ; buffer[b] = s_b
+ b = b + 1 ; buffer[b] = f_cm(rx,0,0,ry,tx,ty)
+ b = b + 1 ; buffer[b] = f_fm(name)
+ b = b + 1 ; buffer[b] = s_e
+ end
+
+ -- place image also used in vf but we can use a different one if we need it
+
+ local imagetypes = images.types -- pdf png jpg jp2 jbig2 stream memstream
+ local img_none = imagetypes.none
+ local img_pdf = imagetypes.pdf
+ local img_stream = imagetypes.stream
+ local img_memstream = imagetypes.memstream
+
+ local one_bp <const> = 65536 * bpfactor
+
+ local imageresources, n = { }, 0
+
+ getximagename = function(index)
+ local l = imageresources[index]
+ if l then
+ return l.name
+ else
+ report("no image resource %S",index)
+ end
+ end
+
+ updaters.register("backend.update.pdf",function()
+ pdf.getximagename = getximagename
+ end)
+
+ -- Groups are flushed immediately but we can decide to make them into a
+ -- specific whatsit ... but not now. We could hash them if needed when
+ -- we use lot sof them in mp ... but not now.
+
+ usedxgroups = { }
+ local groups = 0
+ local group = nil
+
+ flushgroup = function(content,bbox)
+ if not group then
+ group = pdfdictionary {
+ Type = pdfconstant("Group"),
+ S = pdfconstant("Transparency"),
+ }
+ end
+ local wrapper = pdfdictionary {
+ Type = pdf_xobject,
+ Subtype = pdf_form,
+ FormType = 1,
+ Group = group,
+ BBox = pdfarray(bbox),
+ Resources = lpdf.collectedresources { serialize = false },
+ }
+ local objnum = pdfflushstreamobject(content,wrapper,false)
+ groups = groups + 1
+ usedxgroups[groups] = objnum
+ return f_gr(groups)
+ end
+
+ lpdf.flushgroup = flushgroup -- todo: access via driver in mlib-pps
+
+ -- end of experiment
+
+ local function flushpdfximage(current,pos_h,pos_v,pos_r,size_h,size_v)
+
+ local width,
+ height,
+ depth = getwhd(current)
+ local total = height + depth
+ local transform = getprop(current,"transform") or 0 -- we never set it ... so just use rotation then
+ local index = getprop(current,"index") or 0
+ local kind,
+ xorigin,
+ yorigin,
+ xsize,
+ ysize,
+ rotation, -- transform / orientation / rotation : it's a mess (i need to redo this)
+ objnum,
+ groupref = pdfincludeimage(index) -- needs to be sorted out, bad name (no longer mixed anyway)
+
+ if not kind then
+ report("invalid image %S",index)
+ return
+ end
+
+ local rx, sx, sy, ry, tx, ty = 1, 0, 0, 1, 0, 0
+
+ -- tricky: xsize and ysize swapped
+
+ if kind == img_pdf or kind == img_stream or kind == img_memstream then
+ rx, ry, tx, ty = 1/xsize, 1/ysize, xorigin/xsize, yorigin/ysize
+ else
+ -- if kind == img_png then
+ -- -- if groupref > 0 and img_page_group_val == 0 then
+ -- -- img_page_group_val = groupref
+ -- -- end
+ -- end
+ rx, ry = bpfactor, bpfactor
+ end
+
+ if band(transform,7) > 3 then
+ -- mirror
+ rx, tx = -rx, -tx
+ end
+ local t = band(transform + rotation,3)
+ if t == 0 then
+ -- nothing
+ elseif t == 1 then
+ -- rotation over 90 degrees (counterclockwise)
+ rx, sx, sy, ry, tx, ty = 0, rx, -ry, 0, -ty, tx
+ elseif t == 2 then
+ -- rotation over 180 degrees (counterclockwise)
+ rx, ry, tx, ty = -rx, -ry, -tx, -ty
+ elseif t == 3 then
+ -- rotation over 270 degrees (counterclockwise)
+ rx, sx, sy, ry, tx, ty = 0, -rx, ry, 0, ty, -tx
+ end
+
+ rx = rx * width
+ sx = sx * total
+ sy = sy * width
+ ry = ry * total
+ tx = pos_h - tx * width
+ ty = pos_v - ty * total
+
+ local t = transform + rotation
+
+ if band(transform,7) > 3 then
+ t = t + 1
+ end
+
+ t = band(t,3)
+
+ if t == 0 then
+ -- no transform
+ elseif t == 1 then
+ -- rotation over 90 degrees (counterclockwise)
+ tx = tx + width
+ elseif t == 2 then
+ -- rotation over 180 degrees (counterclockwise)
+ tx = tx + width
+ ty = ty + total
+ elseif t == 3 then
+ -- rotation over 270 degrees (counterclockwise)
+ ty = ty + total
+ end
+
+ -- a flaw in original, can go:
+ --
+ -- if img_page_group_val == 0 then
+ -- img_page_group_val = group_ref
+ -- end
+
+ usedximages[index] = objnum -- hm
+
+ pdf_goto_pagemode()
+
+ calc_pdfpos(tx,ty)
+
+ tx = cmtx * bpfactor
+ ty = cmty * bpfactor
+
+ b = b + 1 ; buffer[b] = s_b
+ b = b + 1 ; buffer[b] = f_cm(rx,sx,sy,ry,tx,ty)
+ b = b + 1 ; buffer[b] = f_im(index)
+ b = b + 1 ; buffer[b] = s_e
+ end
+
+ flushimage = function(index,width,height,depth,pos_h,pos_v)
+
+ -- used in vf characters
+
+ local total = height + depth
+ local kind,
+ xorigin, yorigin,
+ xsize, ysize,
+ rotation,
+ objnum,
+ groupref = pdfincludeimage(index)
+
+ local rx = width / xsize
+ local sx = 0
+ local sy = 0
+ local ry = total / ysize
+ local tx = pos_h
+ -- to be sorted out
+ -- local ty = pos_v - depth
+ local ty = pos_v -- we assume that depth is dealt with in the caller (for now)
+
+ usedximages[index] = objnum
+
+ pdf_goto_pagemode()
+
+ calc_pdfpos(tx,ty)
+
+ tx = cmtx * bpfactor
+ ty = cmty * bpfactor
+
+ b = b + 1 ; buffer[b] = s_b
+ b = b + 1 ; buffer[b] = f_cm(rx,sx,sy,ry,tx,ty)
+ b = b + 1 ; buffer[b] = f_im(index)
+ b = b + 1 ; buffer[b] = s_e
+ end
+
+ -- For the moment we need this hack because the engine checks the 'image'
+ -- command in virtual fonts (so we use lua instead).
+
+ flushrule = function(current,pos_h,pos_v,pos_r,size_h,size_v,subtype)
+
+ if subtype == emptyrule_code then
+ return
+ elseif subtype == boxrule_code then
+ return flushpdfxform(current,pos_h,pos_v,pos_r,size_h,size_v)
+ elseif subtype == imagerule_code then
+ return flushpdfximage(current,pos_h,pos_v,pos_r,size_h,size_v)
+ end
+ if subtype == userrule_code or subtype >= overrule_code and subtype <= radicalrule_code then
+ pdf_goto_pagemode()
+ b = b + 1 ; buffer[b] = s_b
+ pdf_set_pos_temp(pos_h,pos_v)
+ rule_callback(current,size_h,size_v,pos_r) -- so we pass direction
+ b = b + 1 ; buffer[b] = s_e
+ return
+ end
+
+ pdf_goto_pagemode()
+
+ -- local saved_b = b
+
+ b = b + 1 ; buffer[b] = s_b
+
+ local dim_h = size_h * bpfactor
+ local dim_v = size_v * bpfactor
+ local rule
+
+ if dim_v <= one_bp then
+ pdf_set_pos_temp(pos_h,pos_v + 0.5 * size_v)
+ rule = f_v(dim_v,dim_h)
+ elseif dim_h <= one_bp then
+ pdf_set_pos_temp(pos_h + 0.5 * size_h,pos_v)
+ rule = f_h(dim_h,dim_v)
+ else
+ pdf_set_pos_temp(pos_h,pos_v)
+ if subtype == outlinerule_code then
+ local linewidth = getdata(current)
+ if linewidth > 0 then
+ rule = f_w(linewidth * bpfactor,dim_h,dim_v)
+ else
+ rule = f_o(dim_h,dim_v)
+ end
+ else
+ rule = f_f(dim_h,dim_v)
+ end
+ end
+
+ b = b + 1 ; buffer[b] = rule
+ b = b + 1 ; buffer[b] = s_e
+
+ -- buffer[saved_b] = concat(buffer," ",saved_b,b)
+ -- b = saved_b
+
+ end
+
+ flushsimplerule = function(pos_h,pos_v,pos_r,size_h,size_v)
+ pdf_goto_pagemode()
+
+ b = b + 1 ; buffer[b] = s_b
+
+ local dim_h = size_h * bpfactor
+ local dim_v = size_v * bpfactor
+ local rule
+
+ if dim_v <= one_bp then
+ pdf_set_pos_temp(pos_h,pos_v + 0.5 * size_v)
+ rule = f_v(dim_v,dim_h)
+ elseif dim_h <= one_bp then
+ pdf_set_pos_temp(pos_h + 0.5 * size_h,pos_v)
+ rule = f_h(dim_h,dim_v)
+ else
+ pdf_set_pos_temp(pos_h,pos_v)
+ rule = f_f(dim_h,dim_v)
+ end
+
+ b = b + 1 ; buffer[b] = rule
+ b = b + 1 ; buffer[b] = s_e
+ end
+
+end
+
+--- basics
+
+local wrapup, registerpage do
+
+ local pages = { }
+ local maxkids = 10
+ local nofpages = 0
+ local pagetag = "unset"
+
+ registerpage = function(object)
+ nofpages = nofpages + 1
+ local objnum = pdfpagereference(nofpages)
+ pages[nofpages] = {
+ page = nofpages, -- original number, only for diagnostics
+ objnum = objnum,
+ object = object,
+ tag = pagetag,
+ }
+ end
+
+ function lpdf.setpagetag(tag)
+ pagetag = tag or "unset"
+ end
+
+ function lpdf.getnofpages()
+ return nofpages
+ end
+
+ function lpdf.getpagetags()
+ local list = { }
+ for i=1,nofpages do
+ list[i] = pages[i].tag
+ end
+ return list
+ end
+
+ function lpdf.setpageorder(mapping)
+ -- mapping can be a hash so:
+ local list = table.sortedkeys(mapping)
+ local n = #list
+ if n == nofpages then
+ local done = { }
+ local hash = { }
+ for i=1,n do
+ local order = mapping[list[i]]
+ if hash[order] then
+ report("invalid page order, duplicate entry %i",order)
+ return
+ elseif order < 1 or order > nofpages then
+ report("invalid page order, no page %i",order)
+ return
+ else
+ done[i] = pages[order]
+ hash[order] = true
+ end
+ end
+ pages = done
+ else
+ report("invalid page order, %i entries expected",nofpages)
+ end
+ end
+
+ -- We can have this, but then via codeinjections etc. Later.
+
+ -- function structures.pages.swapthem()
+ -- local n = lpdf.getnofpages()
+ -- local t = { }
+ -- for i=1,n do
+ -- t[i] = i
+ -- end
+ -- for i=2,math.odd(n) and n or (n-1),2 do
+ -- t[i] = i+1
+ -- t[i+1] = i
+ -- end
+ -- lpdf.setpageorder(t)
+ -- end
+
+ wrapup = function(driver)
+
+ -- hook (to reshuffle pages)
+ local pagetree = { }
+ local parent = nil
+ local minimum = 0
+ local maximum = 0
+ local current = 0
+ if #pages > 1.5 * maxkids then
+ repeat
+ local plist, pnode
+ if current == 0 then
+ plist, minimum = pages, 1
+ elseif current == 1 then
+ plist, minimum = pagetree, 1
+ else
+ plist, minimum = pagetree, maximum + 1
+ end
+ maximum = #plist
+ if maximum > minimum then
+ local kids
+ for i=minimum,maximum do
+ local p = plist[i]
+ if not pnode or #kids == maxkids then
+ kids = pdfarray()
+ parent = pdfreserveobject()
+ pnode = pdfdictionary {
+ objnum = parent,
+ Type = pdf_pages,
+ Kids = kids,
+ Count = 0,
+ }
+ pagetree[#pagetree+1] = pnode
+ end
+ kids[#kids+1] = pdfreference(p.objnum)
+ pnode.Count = pnode.Count + (p.Count or 1)
+ p.Parent = pdfreference(parent)
+ end
+ end
+ current = current + 1
+ until maximum == minimum
+ -- flush page tree
+ for i=1,#pagetree do
+ local entry = pagetree[i]
+ local objnum = entry.objnum
+ entry.objnum = nil
+ pdfflushobject(objnum,entry)
+ end
+ else
+ -- ugly
+ local kids = pdfarray()
+ local list = pdfdictionary {
+ Type = pdf_pages,
+ Kids = kids,
+ Count = nofpages,
+ }
+ parent = pdfreserveobject()
+ for i=1,nofpages do
+ local page = pages[i]
+ kids[#kids+1] = pdfreference(page.objnum)
+ page.Parent = pdfreference(parent)
+ end
+ pdfflushobject(parent,list)
+ end
+ for i=1,nofpages do
+ local page = pages[i]
+ local object = page.object
+ object.Parent = page.Parent
+ pdfflushobject(page.objnum,object)
+ end
+ lpdf.addtocatalog("Pages",pdfreference(parent))
+
+ end
+
+end
+
+pdf_h, pdf_v = 0, 0
+
+local function initialize(driver,details)
+ reset_variables(details)
+ reset_buffer()
+end
+
+-- This will all move and be merged and become less messy.
+
+-- todo: more clever resource management: a bit tricky as we can inject
+-- stuff in the page stream
+
+local compact = false
+
+do
+
+ -- This is more a convenience feature and it might even be not entirely robust.
+ -- It removes redundant color directives which makes the page stream look a bit
+ -- nicer (also when figuring out issues). I might add more here but there is
+ -- some additional overhead involved so runtime can be impacted.
+
+ local P, R, S, Cs, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.Cs, lpeg.match
+
+ local p_ds = (R("09") + S(" ."))^1
+ ----- p_nl = S("\n\r")^1
+ local p_nl = S("\n")^1
+ local p_eg = P("Q")
+
+ local p_cl = p_ds * (P("rg") + P("g") + P("k")) * p_ds * (P("RG") + P("G") + P("K"))
+ ----- p_cl = (p_ds * (P("rg") + P("g") + P("k") + P("RG") + P("G") + P("K")))^1
+ local p_tr = P("/Tr") * p_ds * P("gs")
+
+ local p_no_cl = (p_cl * p_nl) / ""
+ local p_no_tr = (p_tr * p_nl) / ""
+ local p_no_nl = 1 - p_nl
+
+ local p_do_cl = p_cl * p_nl
+ local p_do_tr = p_tr * p_nl
+
+ local p_do_eg = p_eg * p_nl
+
+ local pattern = Cs( (
+ (p_no_cl + p_no_tr)^0 * p_do_eg -- transparencies and colors before Q
+ + p_no_tr * p_no_cl * p_do_tr * p_do_cl -- transparencies and colors before others
+ + p_no_cl * p_do_cl -- successive colors
+ + p_no_tr * p_do_tr -- successive transparencies
+ + p_no_nl^1
+ + 1
+ )^1 )
+
+ local oldsize = 0
+ local newsize = 0
+
+ directives.register("pdf.compact", function(v)
+ compact = v and function(s)
+ oldsize = oldsize + #s
+ s = lpegmatch(pattern,s) or s
+ newsize = newsize + #s
+ return s
+ end
+ end)
+
+ statistics.register("pdf pagestream",function()
+ if oldsize ~= newsize then
+ return string.format("old size: %i, new size %i",oldsize,newsize)
+ end
+ end)
+
+
+end
+
+local flushdeferred -- defined later
+
+local level = 0
+
+local finalize do
+
+ local f_font = formatters["F%d"]
+
+ local f_form = formatters["Fm%d"]
+ local f_group = formatters["Gp%d"]
+ local f_image = formatters["Im%d"]
+
+ finalize = function(driver,details)
+
+ level = level + 1
+
+ pdf_goto_pagemode() -- for now
+
+ local objnum = details.objnum
+ local specification = details.specification
+
+ local content = concat(buffer,"\n",1,b)
+
+ if compact then
+ content = compact(content)
+ end
+
+ local fonts = nil
+ local xforms = nil
+
+ if next(usedfonts) then
+ fonts = pdfdictionary { }
+ for k, v in next, usedfonts do
+ fonts[f_font(v)] = pdfreference(pdfgetfontobjnumber(k)) -- we can overload for testing
+ end
+ end
+
+ -- messy: use real indexes for both ... so we need to change some in the
+ -- full luatex part
+
+ if next(usedxforms) or next(usedximages) or next(usedxgroups) then
+ xforms = pdfdictionary { }
+ for k in sortedhash(usedxforms) do
+ -- xforms[f_form(k)] = pdfreference(k)
+ xforms[f_form(getxformname(k))] = pdfreference(k)
+ end
+ for k, v in sortedhash(usedximages) do
+ xforms[f_image(k)] = pdfreference(v)
+ end
+ for k, v in sortedhash(usedxgroups) do
+ xforms[f_group(k)] = pdfreference(v)
+ end
+ end
+
+ reset_buffer()
+
+ -- finish_pdfpage_callback(shippingmode == "page")
+
+ if shippingmode == "page" then
+
+ local pageproperties = lpdf.getpageproperties()
+
+ local pageresources = pageproperties.pageresources
+ local pageattributes = pageproperties.pageattributes
+ local pagesattributes = pageproperties.pagesattributes
+
+ pageresources.Font = fonts
+ pageresources.XObject = xforms
+ pageresources.ProcSet = lpdf.procset()
+
+ local xorigin, yorigin, relocated = backends.codeinjections.getpageorigin() -- for now here
+
+ local bbox = pdfarray {
+ (boundingbox[1] + xorigin) * bpfactor,
+ (boundingbox[2] + yorigin) * bpfactor,
+ (boundingbox[3] + xorigin) * bpfactor,
+ (boundingbox[4] + yorigin) * bpfactor,
+ }
+
+ if relocated then
+ content = formatters["1 0 0 1 %.6N %.6N cm\n%s"](bbox[1],bbox[2],content)
+ end
+
+ local contentsobj = pdfflushstreamobject(content,false,false)
+
+ pageattributes.Type = pdf_page
+ pageattributes.Contents = pdfreference(contentsobj)
+ pageattributes.Resources = pageresources
+ -- pageattributes.Resources = pdfreference(pdfflushobject(pageresources))
+ pageattributes.MediaBox = bbox
+ pageattributes.Parent = nil -- precalculate
+ pageattributes.Group = nil -- todo
+
+ -- resources can be indirect
+
+ registerpage(pageattributes)
+
+ lpdf.finalizepage(true)
+
+ if relocated then
+ if pageattributes.TrimBox then pageattributes.TrimBox = box end
+ if pageattributes.CropBox then pageattributes.CropBox = box end
+ if pageattributes.BleedBox then pageattributes.BleedBox = box end
+ end
+
+ else
+
+ local xformtype = specification.type or 0
+ local margin = specification.margin or 0
+ local attributes = specification.attributes or ""
+ local resources = specification.resources or ""
+
+ local wrapper = nil
+
+ if xformtype == 0 then
+ wrapper = pdfdictionary {
+ Type = pdf_xobject,
+ Subtype = pdf_form,
+ FormType = 1,
+ BBox = nil,
+ Matrix = nil,
+ Resources = nil,
+ }
+ else
+ wrapper = pdfdictionary {
+ BBox = nil,
+ Matrix = nil,
+ Resources = nil,
+ }
+ end
+ if xformtype == 0 or xformtype == 1 or xformtype == 3 then
+ wrapper.BBox = pdfarray {
+ -margin * bpfactor,
+ -margin * bpfactor,
+ (boundingbox[3] + margin) * bpfactor,
+ (boundingbox[4] + margin) * bpfactor,
+ }
+ end
+ if xformtype == 0 or xformtype == 2 or xformtype == 3 then
+ wrapper.Matrix = pdfarray { 1, 0, 0, 1, 0, 0 }
+ end
+
+ -- todo: additional = resources
+
+ local boxresources = lpdf.collectedresources { serialize = false }
+ boxresources.Font = fonts
+ boxresources.XObject = xforms
+
+ -- todo: maybe share them
+ -- wrapper.Resources = pdfreference(pdfflushobject(boxresources))
+
+ if resources ~= "" then
+ boxresources = boxresources + resources
+ end
+ if attributes ~= "" then
+ wrapper = wrapper + attributes
+ end
+
+ wrapper.Resources = next(boxresources) and boxresources or nil
+ wrapper.ProcSet = lpdf.procset()
+
+ -- pdfflushstreamobject(content,wrapper,false,objectnumber)
+ pdfflushstreamobject(content,wrapper,false,specification.objnum)
+
+ end
+
+ for objnum in sortedhash(usedxforms) do
+ local f = flushedxforms[objnum]
+ if f[1] == false then
+ f[1] = true
+ local objnum = f[2] -- specification.objnum
+ local specification = boxresources[objnum]
+ local list = specification.list
+ localconverter(list,"xform",f[2],specification)
+ end
+ end
+
+ pdf_h, pdf_v = 0, 0
+
+ if level == 1 then
+ flushdeferred()
+ end
+ level = level - 1
+
+ end
+
+end
+
+updaters.register("backend.update.pdf",function()
+ job.positions.registerhandlers {
+ getpos = drivers.getpos,
+ getrpos = drivers.getrpos,
+ gethpos = drivers.gethpos,
+ getvpos = drivers.getvpos,
+ }
+end)
+
+updaters.register("backend.update",function()
+ local saveboxresource = tex.boxresources.save
+ --
+ -- also in lpdf-res .. brrr .. needs fixing
+ --
+ backends.codeinjections.registerboxresource = function(n,offset)
+ local r = saveboxresource(n,nil,nil,false,0,offset or 0)
+ return r
+ end
+end)
+
+-- now comes the pdf file handling
+
+local objects = { }
+local streams = { } -- maybe just parallel to objects (no holes)
+local nofobjects = 0
+local offset = 0
+local f = false
+local flush = false
+local threshold = 40 -- also #("/Filter /FlateDecode") (compression threshold)
+local objectstream = true
+local compress = true
+local cache = false
+local info = ""
+local catalog = ""
+local lastdeferred = false
+local majorversion = 1
+local minorversion = 7
+local trailerid = true
+
+directives.register("backend.pdf.threshold",function(v)
+ if v then
+ threshold = tonumber(v) or 40
+ else
+ threshold = -1000
+ end
+end)
+
+local f_object = formatters["%i 0 obj\010%s\010endobj\010"]
+local f_stream_n_u = formatters["%i 0 obj\010<< /Length %i >>\010stream\010%s\010endstream\010endobj\010"]
+local f_stream_n_c = formatters["%i 0 obj\010<< /Filter /FlateDecode /Length %i >>\010stream\010%s\010endstream\010endobj\010"]
+local f_stream_d_u = formatters["%i 0 obj\010<< %s /Length %i >>\010stream\010%s\010endstream\010endobj\010"]
+local f_stream_d_c = formatters["%i 0 obj\010<< %s /Filter /FlateDecode /Length %i >>\010stream\010%s\010endstream\010endobj\010"]
+local f_stream_d_r = formatters["%i 0 obj\010<< %s >>\010stream\010%s\010endstream\010endobj\010"]
+
+----- f_object_b = formatters["%i 0 obj\010"]
+local f_stream_b_n_u = formatters["%i 0 obj\010<< /Length %i >>\010stream\010"]
+local f_stream_b_n_c = formatters["%i 0 obj\010<< /Filter /FlateDecode /Length %i >>\010stream\010"]
+local f_stream_b_d_u = formatters["%i 0 obj\010<< %s /Length %i >>\010stream\010"]
+local f_stream_b_d_c = formatters["%i 0 obj\010<< %s /Filter /FlateDecode /Length %i >>\010stream\010"]
+local f_stream_b_d_r = formatters["%i 0 obj\010<< %s >>\010stream\010"]
+
+----- s_object_e <const> = "\010endobj\010"
+local s_stream_e <const> = "\010endstream\010endobj\010"
+
+do
+
+ local function setinfo() end -- we get it
+ local function setcatalog() end -- we get it
+
+ local function settrailerid(v)
+ trailerid = v or false
+ end
+
+ local function setmajorversion(v) majorversion = tonumber(v) or majorversion end
+ local function setminorversion(v) minorversion = tonumber(v) or minorversion end
+
+ local function getmajorversion(v) return majorversion end
+ local function getminorversion(v) return minorversion end
+
+ local function setcompresslevel (v) compress = v and v ~= 0 and true or false end
+ local function setobjcompresslevel(v) objectstream = v and v ~= 0 and true or false end
+
+ local function getcompresslevel (v) return compress and 3 or 0 end
+ local function getobjcompresslevel(v) return objectstream and 1 or 0 end
+
+ local function setpageresources () end -- needs to be sorted out
+ local function setpageattributes () end
+ local function setpagesattributes() end
+
+ updaters.register("backend.update.pdf",function()
+ pdf.setinfo = setinfo
+ pdf.setcatalog = setcatalog
+ pdf.settrailerid = settrailerid
+ pdf.setmajorversion = setmajorversion
+ pdf.setminorversion = setminorversion
+ pdf.getmajorversion = getmajorversion
+ pdf.getminorversion = getminorversion
+ pdf.setcompresslevel = setcompresslevel
+ pdf.setobjcompresslevel = setobjcompresslevel
+ pdf.getcompresslevel = getcompresslevel
+ pdf.getobjcompresslevel = getobjcompresslevel
+ pdf.setpageresources = setpageresources
+ pdf.setpageattributes = setpageattributes
+ pdf.setpagesattributes = setpagesattributes
+ end)
+
+end
+
+local addtocache, flushcache, cache do
+
+ local data, d = { }, 0
+ local list, l = { }, 0
+ local coffset = 0
+ local indices = { }
+
+ local maxsize <const> = 32 * 1024 -- uncompressed
+ local maxcount <const> = 0xFF
+
+ addtocache = function(n,str)
+ local size = #str
+ if size == 0 then
+ -- todo: message
+ return
+ end
+ if coffset + size > maxsize or d == maxcount then
+ flushcache()
+ end
+ if d == 0 then
+ nofobjects = nofobjects + 1
+ objects[nofobjects] = false
+ streams[nofobjects] = indices
+ cache = nofobjects
+ end
+ objects[n] = - cache
+ indices[n] = d
+ d = d + 1
+ -- can have a comment n 0 obj as in luatex
+ data[d] = str
+ l = l + 1 ; list[l] = n
+ l = l + 1 ; list[l] = coffset
+ coffset = coffset + size + 1
+ end
+
+ local p_ObjStm = pdfconstant("ObjStm")
+
+ flushcache = function() -- references cannot be stored
+ if l > 0 then
+ list = concat(list," ")
+ data[0] = list
+ data = concat(data,"\010",0,d)
+ local strobj = pdfdictionary {
+ Type = p_ObjStm,
+ N = d,
+ First = #list + 1,
+ }
+ objects[cache] = offset
+ local b = nil
+ local e = s_stream_e
+ if compress then
+ local comp = zlibcompress(data,3)
+ if comp and #comp < #data then
+ data = comp
+ b = f_stream_b_d_c(cache,strobj(),#data)
+ else
+ b = f_stream_b_d_u(cache,strobj(),#data)
+ end
+ else
+ b = f_stream_b_d_u(cache,strobj(),#data)
+ end
+ flush(f,b)
+ flush(f,data)
+ flush(f,e)
+ offset = offset + #b + #data + #e
+ data, d = { }, 0
+ list, l = { }, 0
+ coffset = 0
+ indices = { }
+ end
+ end
+
+end
+
+local function pdfreserveobj()
+ nofobjects = nofobjects + 1
+ objects[nofobjects] = false
+ return nofobjects
+end
+
+local pages = table.setmetatableindex(function(t,k)
+ local v = pdfreserveobj()
+ t[k] = v
+ return v
+end)
+
+local function getpageref(n)
+ return pages[n]
+end
+
+local function refobj()
+ -- not needed, as we have auto-delay
+end
+
+local function flushnormalobj(data,n)
+ if not n then
+ nofobjects = nofobjects + 1
+ n = nofobjects
+ end
+ data = f_object(n,data)
+ if level == 0 then
+ objects[n] = offset
+ offset = offset + #data
+ flush(f,data)
+ else
+ if not lastdeferred then
+ lastdeferred = n
+ elseif n < lastdeferred then
+ lastdeferred = n
+ end
+ objects[n] = data
+ end
+ return n
+end
+
+local function flushstreamobj(data,n,dict,comp,nolength)
+ if not data then
+ report("no data for %S",dict)
+ return
+ end
+ if not n then
+ nofobjects = nofobjects + 1
+ n = nofobjects
+ end
+ local size = #data
+ if level == 0 then
+ local b = nil
+ local e = s_stream_e
+ if nolength then
+ b = f_stream_b_d_r(n,dict)
+ elseif comp ~= false and compress and size > threshold then
+ local compdata = zlibcompress(data,3)
+ if compdata then
+ local compsize = #compdata
+ if compsize > size - threshold then
+ b = dict and f_stream_b_d_u(n,dict,size) or f_stream_b_n_u(n,size)
+ else
+ data = compdata
+ b = dict and f_stream_b_d_c(n,dict,compsize) or f_stream_b_n_c(n,compsize)
+ end
+ else
+ b = dict and f_stream_b_d_u(n,dict,size) or f_stream_b_n_u(n,size)
+ end
+ else
+ b = dict and f_stream_b_d_u(n,dict,size) or f_stream_b_n_u(n,size)
+ end
+ flush(f,b)
+ flush(f,data)
+ flush(f,e)
+ objects[n] = offset
+ offset = offset + #b + #data + #e
+ else
+ if nolength then
+ data = f_stream_d_r(n,dict,data)
+ elseif comp ~= false and compress and size > threshold then
+ local compdata = zlibcompress(data,3)
+ if compdata then
+ local compsize = #compdata
+ if compsize > size - threshold then
+ data = dict and f_stream_d_u(n,dict,size,data) or f_stream_n_u(n,size,data)
+ else
+ data = dict and f_stream_d_c(n,dict,compsize,compdata) or f_stream_n_c(n,compsize,compdata)
+ end
+ else
+ data = dict and f_stream_d_u(n,dict,size,data) or f_stream_n_u(n,size,data)
+ end
+ else
+ data = dict and f_stream_d_u(n,dict,size,data) or f_stream_n_u(n,size,data)
+ end
+ if not lastdeferred then
+ lastdeferred = n
+ elseif n < lastdeferred then
+ lastdeferred = n
+ end
+ objects[n] = data
+ end
+ return n
+end
+
+flushdeferred = function() -- was forward defined
+ if lastdeferred then
+ for n=lastdeferred,nofobjects do
+ local o = objects[n]
+ if type(o) == "string" then
+ objects[n] = offset
+ offset = offset + #o
+ flush(f,o)
+ end
+ end
+ lastdeferred = false
+ end
+end
+
+-- n = pdf.obj([n,] objtext)
+-- n = pdf.obj([n,] "file", filename)
+-- n = pdf.obj([n,] "stream", streamtext [, attrtext])
+-- n = pdf.obj([n,] "streamfile", filename [, attrtext])
+--
+-- n = pdf.obj {
+-- type = <string>, -- raw|stream
+-- immediate = <boolean>,
+-- objnum = <number>,
+-- attr = <string>,
+-- compresslevel = <number>,
+-- objcompression = <boolean>,
+-- file = <string>,
+-- string = <string>,
+-- nolength = <boolean>,
+-- }
+
+local function obj(a,b,c,d)
+ local kind --, immediate
+ local objnum, data, attr, filename
+ local compresslevel, objcompression, nolength
+ local argtype = type(a)
+ if argtype == "table" then
+ kind = a.type -- raw | stream
+ -- immediate = a.immediate
+ objnum = a.objnum
+ attr = a.attr
+ compresslevel = a.compresslevel
+ objcompression = a.objcompression
+ filename = a.file
+ data = a.string or a.stream or ""
+ nolength = a.nolength
+ if kind == "stream" then
+ if filename then
+ data = loaddata(filename) or ""
+ end
+ elseif kind == "raw"then
+ if filename then
+ data = loaddata(filename) or ""
+ end
+ elseif kind == "file"then
+ kind = "raw"
+ data = filename and loaddata(filename) or ""
+ elseif kind == "streamfile" then
+ kind = "stream"
+ data = filename and loaddata(filename) or ""
+ end
+ else
+ if argtype == "number" then
+ objnum = a
+ a, b, c = b, c, d
+ else
+ nofobjects = nofobjects + 1
+ objnum = nofobjects
+ end
+ if b then
+ if a == "stream" then
+ kind = "stream"
+ data = b
+ elseif a == "file" then
+ -- kind = "raw"
+ data = loaddata(b)
+ elseif a == "streamfile" then
+ kind = "stream"
+ data = loaddata(b)
+ else
+ data = "" -- invalid object
+ end
+ attr = c
+ else
+ -- kind = "raw"
+ data = a
+ end
+ end
+ if not objnum then
+ nofobjects = nofobjects + 1
+ objnum = nofobjects
+ end
+ -- todo: immediate
+ if kind == "stream" then
+ flushstreamobj(data,objnum,attr,compresslevel and compresslevel > 0 or nil,nolength)
+ elseif objectstream and objcompression ~= false then
+ addtocache(objnum,data)
+ else
+ flushnormalobj(data,objnum)
+ end
+ return objnum
+end
+
+updaters.register("backend.update.pdf",function()
+ pdf.reserveobj = pdfreserveobj
+ pdf.getpageref = getpageref
+ pdf.refobj = refobj
+ pdf.flushstreamobj = flushstreamobj
+ pdf.flushnormalobj = flushnormalobj
+ pdf.obj = obj
+ pdf.immediateobj = obj
+end)
+
+-- In lua 5.4 the methods are now moved one metalevel deeper so we need to get them
+-- from mt.__index instead. (I did get that at first.) It makes for a slightly (imo)
+-- nicer interface but no real gain in speed as we don't flush that often.
+
+local openfile, closefile do
+
+ -- I used to do <space><lf> but then figured out that when I open and save a file in a mode
+ -- that removes trailing spaces, the xref becomes invalid. The problem was then that a
+ -- reconstruction of the file by a viewer gives weird effects probably because percent symbols
+ -- gets interpreted then. Thanks to Ross Moore for noticing this side effect!
+
+ local f_used = formatters["%010i 00000 n\013\010"]
+ local f_link = formatters["%010i 00000 f\013\010"]
+ local f_first = formatters["%010i 65535 f\013\010"]
+
+ local f_pdf = formatters["%%PDF-%i.%i\010"]
+ local f_xref = formatters["xref\0100 %i\010"]
+ local f_trailer_id = formatters["trailer\010<< %s /ID [ <%s> <%s> ] >>\010startxref\010%i\010%%%%EOF"]
+ local f_trailer_no = formatters["trailer\010<< %s >>\010startxref\010%i\010%%%%EOF"]
+ local f_startxref = formatters["startxref\010%i\010%%%%EOF"]
+
+ local inmemory = false
+ local close = false
+
+ openfile = function(filename)
+ if inmemory then
+ local n = 0
+ f = { }
+ flush = function(f,s)
+ n = n + 1 f[n] = s
+ end
+ close = function(f)
+ f = concat(f)
+ io.savedata(filename,f)
+ f = false
+ end
+ -- local n = 0
+ -- f = {
+ -- write = function(self,s)
+ -- n = n + 1 f[n] = s
+ -- end,
+ -- close = function(self)
+ -- f = concat(f)
+ -- io.savedata(filename,f)
+ -- f = false
+ -- end,
+ -- }
+ else
+ f = io.open(filename,"wb")
+ if not f then
+ -- message
+ os.exit()
+ end
+ -- f:setvbuf("full",64*1024)
+ local m = getmetatable(f)
+ flush = m.write or m.__index.write
+ close = m.close or m.__index.close
+ end
+ local v = f_pdf(majorversion,minorversion)
+ -- local b = "%\xCC\xD5\xC1\xD4\xC5\xD8\xD0\xC4\xC6\010" -- LUATEXPDF (+128)
+ local b = "%\xC3\xCF\xCE\xD4\xC5\xD8\xD4\xD0\xC4\xC6\010" -- CONTEXTPDF (+128)
+ flush(f,v)
+ flush(f,b)
+ offset = #v + #b
+ end
+
+ closefile = function(abort)
+ if abort then
+ f:close()
+ f = io.open(abort,"wb")
+ if f then
+ local name = resolvers.findfile("context-lmtx-error.pdf")
+ if name then
+ local data = io.loaddata(name)
+ if data then
+ f:write(data)
+ f:close()
+ return
+ end
+ end
+ f:close()
+ removefile(abort)
+ end
+ else
+ local xrefoffset = offset
+ local lastfree = 0
+ local noffree = 0
+ local catalog = lpdf.getcatalog()
+ local info = lpdf.getinfo()
+ if trailerid == true then
+ trailerid = md5HEX(osuuid())
+ elseif trailerid and #trailerid > 32 then
+ trailerid = md5HEX(trailerid)
+ else
+ trailerid = false
+ end
+ if objectstream then
+ flushdeferred()
+ flushcache()
+ --
+ xrefoffset = offset
+ --
+ nofobjects = nofobjects + 1
+ objects[nofobjects] = offset -- + 1
+ --
+ -- combine these three in one doesn't really give less code so
+ -- we go for the efficient ones
+ --
+ local nofbytes = 4
+ local c1, c2, c3, c4
+ if offset <= 0xFFFF then
+ nofbytes = 2
+ for i=1,nofobjects do
+ local o = objects[i]
+ if not o then
+ noffree = noffree + 1
+ else
+ local strm = o < 0
+ if strm then
+ o = -o
+ end
+ c1 = extract(o,8,8)
+ c2 = extract(o,0,8)
+ if strm then
+ objects[i] = char(2,c1,c2,streams[o][i])
+ else
+ objects[i] = char(1,c1,c2,0)
+ end
+ end
+ end
+ if noffree > 0 then
+ for i=nofobjects,1,-1 do
+ local o = objects[i]
+ if not o then
+ local f1 = extract(lastfree,8,8)
+ local f2 = extract(lastfree,0,8)
+ objects[i] = char(0,f1,f2,0)
+ lastfree = i
+ end
+ end
+ end
+ elseif offset <= 0xFFFFFF then
+ nofbytes = 3
+ for i=1,nofobjects do
+ local o = objects[i]
+ if not o then
+ noffree = noffree + 1
+ else
+ local strm = o < 0
+ if strm then
+ o = -o
+ end
+ c1 = extract(o,16,8)
+ c2 = extract(o, 8,8)
+ c3 = extract(o, 0,8)
+ if strm then
+ objects[i] = char(2,c1,c2,c3,streams[o][i])
+ else
+ objects[i] = char(1,c1,c2,c3,0)
+ end
+ end
+ end
+ if noffree > 0 then
+ for i=nofobjects,1,-1 do
+ local o = objects[i]
+ if not o then
+ local f1 = extract(lastfree,16,8)
+ local f2 = extract(lastfree, 8,8)
+ local f3 = extract(lastfree, 0,8)
+ objects[i] = char(0,f1,f2,f3,0)
+ lastfree = i
+ end
+ end
+ end
+ else
+ nofbytes = 4
+ for i=1,nofobjects do
+ local o = objects[i]
+ if not o then
+ noffree = noffree + 1
+ else
+ local strm = o < 0
+ if strm then
+ o = -o
+ end
+ c1 = extract(o,24,8)
+ c2 = extract(o,16,8)
+ c3 = extract(o, 8,8)
+ c4 = extract(o, 0,8)
+ if strm then
+ objects[i] = char(2,c1,c2,c3,c4,streams[o][i])
+ else
+ objects[i] = char(1,c1,c2,c3,c4,0)
+ end
+ end
+ end
+ if noffree > 0 then
+ for i=nofobjects,1,-1 do
+ local o = objects[i]
+ if not o then
+ local f1 = extract(lastfree,24,8)
+ local f2 = extract(lastfree,16,8)
+ local f3 = extract(lastfree, 8,8)
+ local f4 = extract(lastfree, 0,8)
+ objects[i] = char(0,f1,f2,f3,f4,0)
+ lastfree = i
+ end
+ end
+ end
+ end
+ objects[0] = rep("\0",1+nofbytes+1)
+ local data = concat(objects,"",0,nofobjects)
+ local xref = pdfdictionary {
+ Type = pdfconstant("XRef"),
+ Size = nofobjects + 1,
+ W = pdfarray { 1, nofbytes, 1 },
+ Root = catalog,
+ Info = info,
+ ID = trailerid and pdfarray { pdfliteral(trailerid,true), pdfliteral(trailerid,true) } or nil,
+ }
+ if compress then
+ local comp = zlibcompress(data,3)
+ if comp then
+ data = comp
+ flush(f,f_stream_b_d_c(nofobjects,xref(),#data))
+ else
+ flush(f,f_stream_b_d_u(nofobjects,xref(),#data))
+ end
+ else
+ flush(f,f_stream_b_d_u(nofobjects,xref(),#data))
+ end
+ flush(f,data)
+ flush(f,s_stream_e)
+ flush(f,f_startxref(xrefoffset))
+ else
+ flushdeferred()
+ xrefoffset = offset
+ flush(f,f_xref(nofobjects+1))
+ local trailer = pdfdictionary {
+ Size = nofobjects+1,
+ Root = catalog,
+ Info = info,
+ }
+ for i=1,nofobjects do
+ local o = objects[i]
+ if o then
+ objects[i] = f_used(o)
+ end
+ end
+ for i=nofobjects,1,-1 do
+ local o = objects[i]
+ if not o then
+ objects[i] = f_link(lastfree)
+ lastfree = i
+ end
+ end
+ objects[0] = f_first(lastfree)
+ flush(f,concat(objects,"",0,nofobjects))
+ trailer.Size = nofobjects + 1
+ if trailerid then
+ flush(f,f_trailer_id(trailer(),trailerid,trailerid,xrefoffset))
+ else
+ flush(f,f_trailer_no(trailer(),xrefoffset))
+ end
+ end
+ f:close()
+ end
+ io.flush()
+ closefile = function() end
+ end
+
+end
+
+-- For the moment we overload it here, although back-fil.lua eventually will
+-- be merged with back-pdf as it's pdf specific, or maybe back-imp-pdf or so.
+
+updaters.register("backend.update.pdf",function()
+
+ -- We overload img but at some point it will even go away, so we just
+ -- reimplement what we need in context. This will change completely i.e.
+ -- we will drop the low level interface!
+
+ local codeinjections = backends.pdf.codeinjections
+
+ local imagetypes = images.types -- pdf png jpg jp2 jbig2 stream memstream
+ local img_none = imagetypes.none
+
+ local rulecodes = nodes.rulecodes
+
+ local setprop = nodes.nuts.setprop
+
+ local report_images = logs.reporter("backend","images")
+
+ local lastindex = 0
+ local indices = { }
+
+ local bpfactor <const> = number.dimenfactors.bp
+ local imagerule_code <const> = rulecodes.image
+
+ function codeinjections.newimage(specification)
+ return specification
+ end
+
+ function codeinjections.copyimage(original)
+ return setmetatableindex(original)
+ end
+
+ function codeinjections.scanimgage(specification)
+ return specification
+ end
+
+ local function embedimage(specification)
+ if specification then
+ lastindex = lastindex + 1
+ index = lastindex
+ specification.index = index
+ local xobject = pdfdictionary { }
+ if not specification.notype then
+ xobject.Type = pdf_xobject
+ xobject.Subtype = pdf_form
+ xobject.FormType = 1
+ end
+ local bbox = specification.bbox
+ if bbox and not specification.nobbox then
+ xobject.BBox = pdfarray {
+ bbox[1] * bpfactor,
+ bbox[2] * bpfactor,
+ bbox[3] * bpfactor,
+ bbox[4] * bpfactor,
+ }
+ end
+ xobject = xobject + specification.attr
+ if bbox and not specification.width then
+ specification.width = bbox[3]
+ end
+ if bbox and not specification.height then
+ specification.height = bbox[4]
+ end
+ local dict = xobject()
+ --
+ nofobjects = nofobjects + 1
+ local objnum = nofobjects
+ local nolength = specification.nolength
+ local stream = specification.stream or specification.string
+ --
+ -- We cannot set type in native img so we need this hack or
+ -- otherwise we need to patch too much. Better that i write
+ -- a wrapper then. Anyway, it has to be done better: a key that
+ -- tells either or not to scale by xsize/ysize when flushing.
+ --
+ if not specification.type then
+ local kind = specification.kind
+ if kind then
+ -- take that one
+ elseif attr and find(attr,"BBox") then
+ kind = img_stream
+ else
+ -- hack: a bitmap
+ kind = img_none
+ end
+ specification.type = kind
+ specification.kind = kind
+ end
+ local compress = compresslevel and compresslevel > 0 or nil
+ flushstreamobj(stream,objnum,dict,compress,nolength)
+ specification.objnum = objnum
+ specification.rotation = specification.rotation or 0
+ specification.orientation = specification.orientation or 0
+ specification.transform = specification.transform or 0
+ specification.stream = nil
+ specification.attr = nil
+ specification.type = specification.kind or specification.type or img_none
+ indices[index] = specification -- better create a real specification
+ return specification
+ end
+ end
+
+ codeinjections.embedimage = embedimage
+
+ function codeinjections.wrapimage(specification)
+ --
+ local index = specification.index
+ if not index then
+ embedimage(specification)
+ end
+ --
+ local width = specification.width or 0
+ local height = specification.height or 0
+ local depth = specification.depth or 0
+ -- newimagerule
+ local n = nodes.pool.rule(width,height,depth)
+ n.subtype = imagerule_code
+ setprop(tonut(n),"index",specification.index)
+ return n
+ end
+
+ function pdf.includeimage(index)
+ local specification = indices[index]
+ if specification then
+ local bbox = specification.bbox
+ local xorigin = bbox[1]
+ local yorigin = bbox[2]
+ local xsize = bbox[3] - xorigin -- we need the original ones, not the 'rotated' ones
+ local ysize = bbox[4] - yorigin -- we need the original ones, not the 'rotated' ones
+ local transform = specification.transform or 0
+ local objnum = specification.objnum or pdfreserveobj()
+ local groupref = nil
+ local kind = specification.kind or specification.type or img_none -- determines scaling type
+ return
+ kind,
+ xorigin, yorigin,
+ xsize, ysize,
+ transform,
+ objnum,
+ groupref
+ end
+ end
+
+end)
+
+updaters.register("backend.update.lpdf",function()
+
+ -- todo: an md5 or sha2 hash can save space
+ -- todo: make a type 3 font instead
+ -- todo: move to lpdf namespace
+
+ local pdfimage = lpdf.epdf.image
+ local newpdf = pdfimage.new
+ local openpdf = pdfimage.open
+ local closepdf = pdfimage.close
+ local copypage = pdfimage.copy
+
+ local embedimage = images.embed
+
+ local nofstreams = 0
+ local topdf = { }
+ local toidx = { }
+
+ local function storedata_s(pdf)
+ local idx = toidx[pdf]
+ if not idx then
+ nofstreams = nofstreams + 1
+ idx = nofstreams
+ toidx[pdf] = nofstreams
+ topdf[idx] = pdf
+ end
+ return idx
+ end
+
+ local function vfimage_s(id,wd,ht,dp,pos_h,pos_v)
+ local index = topdf[id]
+ if type(index) == "string" then
+ local pdfdoc = newpdf(index,#index)
+ local image = copypage(pdfdoc)
+ local bbox = image.bbox
+ image.width = bbox[3] - bbox[1]
+ image.height = bbox[4] - bbox[2]
+ embedimage(image)
+ index = image.index
+ topdf[id] = index
+ end
+ -- pdf.print or pdf.literal
+ flushimage(index,wd,ht,dp,pos_h,pos_v)
+ end
+
+ local function storedata_n(name,page)
+ local idx = toidx[pdf]
+ if not idx then
+ nofstreams = nofstreams + 1
+ idx = nofstreams
+ toidx[pdf] = nofstreams
+ topdf[idx] = pdf
+ end
+ return idx
+ end
+
+ -- We need to have a way to close such a pdf ... esp for fonts.
+
+ local pdfdocs = { }
+
+ local function vfimage_n(name,page,wd,ht,dp,pos_h,pos_v)
+ local d = pdfdocs[name]
+ if not d then
+ d = { doc = openpdf(name), pages = { } }
+ pdfdocs[name] = d
+ end
+ local index = d.pages[page]
+ if not index then
+ local image = copypage(d.doc,page)
+ local bbox = image.bbox
+ image.width = bbox[3] - bbox[1]
+ image.height = bbox[4] - bbox[2]
+ embedimage(image)
+ index = image.index
+ d.pages[page] = index
+ end
+ flushimage(index,wd,ht,dp,pos_h,pos_v)
+ end
+
+ local function pdfvfimage(wd,ht,dp,data,name)
+ if type(data) == "number" then
+ return { "lua", function(font,char,pos_h,pos_v)
+ vfimage_n(name,data,wd,ht,dp,pos_h,pos_v)
+ end }
+ else
+ return { "lua", function(font,char,pos_h,pos_v)
+ local id = storedata_s(data)
+ vfimage_s(id,wd,ht,dp,pos_h,pos_v)
+ end }
+ end
+ end
+
+ lpdf.vfimage = pdfvfimage
+
+end)
+
+-- The driver.
+
+do
+
+ local isfile = lfs.isfile
+ local removefile = os.remove
+ local renamefile = os.rename
+ -- local copyfile = file.copy
+ -- local addsuffix = file.addsuffix
+ local texgetbox = tex.getbox
+
+ local pdfname = nil
+ local converter = nil
+ local useddriver = nil -- a bit of a hack
+
+ local function outputfilename(driver)
+ return pdfname
+ end
+
+ -- todo: prevent twice
+
+ local function prepare(driver)
+ if not environment.initex then
+ -- install new functions in pdf namespace
+ updaters.apply("backend.update.pdf")
+ -- install new functions in lpdf namespace
+ updaters.apply("backend.update.lpdf")
+ -- adapt existing shortcuts to lpdf namespace
+ updaters.apply("backend.update.tex")
+ -- adapt existing shortcuts to tex namespace
+ updaters.apply("backend.update")
+ --
+ -- if rawget(pdf,"setforcefile") then
+ -- pdf.setforcefile(false) -- default anyway
+ -- end
+ --
+ pdfname = file.addsuffix(tex.jobname,"pdf")
+ openfile(pdfname)
+ --
+ luatex.registerstopactions(1,function()
+ if pdfname then
+ lpdf.finalizedocument()
+ closefile()
+ end
+ end)
+ --
+ luatex.registerpageactions(1,function()
+ if pdfname then
+ lpdf.finalizepage(true)
+ end
+ end)
+ -- --
+ lpdf.registerdocumentfinalizer(wrapup,nil,"wrapping up")
+ --
+ end
+ --
+ environment.lmtxmode = CONTEXTLMTXMODE
+ --
+ converter = drivers.converters.lmtx
+ useddriver = driver
+ end
+
+ local function wrapup(driver)
+ if pdfname then
+ closefile()
+ pdfname = nil
+ end
+ end
+
+ local function cleanup(driver)
+ if pdfname then
+ closefile(pdfname)
+ pdfname = nil
+ end
+ end
+
+ local function convert(driver,boxnumber)
+ converter(driver,texgetbox(boxnumber),"page")
+ end
+
+ localconverter = function(...)
+ converter(useddriver,...)
+ end
+
+ drivers.install {
+ name = "pdf",
+ flushers = {
+ character = flushcharacter,
+ fontchar = flushfontchar,
+ rule = flushrule,
+ simplerule = flushsimplerule,
+ pushorientation = pushorientation,
+ poporientation = poporientation,
+ --
+ literal = flushliteral,
+ setmatrix = flushsetmatrix,
+ save = flushsave,
+ restore = flushrestore,
+ image = flushimage,
+ group = flushgroup,
+ --
+ updatefontstate = updatefontstate,
+ },
+ actions = {
+ prepare = prepare,
+ wrapup = wrapup,
+ cleanup = cleanup,
+ --
+ initialize = initialize,
+ convert = convert,
+ finalize = finalize,
+ --
+ outputfilename = outputfilename,
+ },
+ }
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-mis.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-mis.lua
index 77f11918b46..7227f9dba8a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-mis.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-mis.lua
@@ -76,6 +76,7 @@ local v_layer = variables.layer
local v_lefttoright = variables.lefttoright
local v_righttoleft = variables.righttoleft
local v_title = variables.title
+local v_nomenubar = variables.nomenubar
local positive = register(pageliteral("/GSpositive gs"))
local negative = register(pageliteral("/GSnegative gs"))
@@ -195,6 +196,10 @@ function codeinjections.setupidentity(specification)
end
end
+function codeinjections.getidentityvariable(name)
+ return identity[name]
+end
+
local done = false -- using "setupidentity = function() end" fails as the meaning is frozen in register
local function setupidentity()
@@ -327,7 +332,10 @@ local plusspecs = {
direction = "L2R",
},
[v_righttoleft] ={
- direction = "R2R",
+ direction = "R2L",
+ },
+ [v_nomenubar] ={
+ nomenubar = true,
},
}
@@ -393,6 +401,11 @@ local pagespecs = {
duplex = "Simplex",
paper = true,
},
+ [v_nomenubar] = {
+ mode = "UseNone",
+ layout = "auto",
+ nomenubar = true,
+ },
}
local pagespec, topoffset, leftoffset, height, width, doublesided = "default", 0, 0, 0, 0, false
@@ -472,6 +485,7 @@ local function documentspecification()
local paper = spec.paper
local title = spec.title
local direction = spec.direction
+ local nomenubar = spec.nomenubar
if layout then
addtocatalog("PageLayout",pdfconstant(layout))
end
@@ -490,7 +504,7 @@ local function documentspecification()
prints = pdfarray(flattened(pages.toranges(marked)))
end
end
- if fit or fixed or duplex or copies or paper or prints or title or direction then
+ if fit or fixed or duplex or copies or paper or prints or title or direction or nomenubar then
addtocatalog("ViewerPreferences",pdfdictionary {
FitWindow = fit and true or nil,
PrintScaling = fixed and pdfconstant("None") or nil,
@@ -500,6 +514,7 @@ local function documentspecification()
PrintPageRange = prints or nil,
DisplayDocTitle = title and true or nil,
Direction = direction and pdfconstant(direction) or nil,
+ HideMenubar = nomenubar and true or nil,
})
end
addtoinfo ("Trapped", pdfconstant("False")) -- '/Trapped' in /Info, 'Trapped' in XMP
@@ -510,11 +525,7 @@ end
-- temp hack: the mediabox is not under our control and has a precision of 5 digits
local factor = number.dimenfactors.bp
-local f_value = formatters["%.6F"]
-
-directives.register("pdf.stripzeros",function()
- local f_value = formatters["%.6N"]
-end)
+local f_value = formatters["%.6N"]
local function boxvalue(n) -- we could share them
return pdfverbose(f_value(factor * n))
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-nod.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-nod.lua
index 8bcf18c62ae..fcb2d145732 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-nod.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-nod.lua
@@ -6,10 +6,6 @@ if not modules then modules = { } end modules ['lpdf-nod'] = {
license = "see context related readme files"
}
-if CONTEXTLMTXMODE > 1 then
- return
-end
-
local nodecodes = nodes.nodecodes
local whatsitcodes = nodes.whatsitcodes
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-pde.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-pde.lua
index c1680137da2..ec1064a0dfd 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-pde.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-pde.lua
@@ -41,7 +41,7 @@ if not modules then modules = { } end modules ['lpdf-epd'] = {
-- PPCRYPT_PASS -1 encryption present, need non-empty password
-- PPCRYPT_FAIL -2 invalid or unsupported encryption (eg. undocumented in pdf spec)
-local setmetatable, rawset, rawget, type, next = setmetatable, rawset, rawget, type, next
+local setmetatable, type, next = setmetatable, type, next
local tostring, tonumber, unpack = tostring, tonumber, unpack
local char, byte, find = string.char, string.byte, string.find
local abs = math.abs
@@ -60,29 +60,29 @@ if not (number and number.dimenfactors) then
require("util-dim")
end
-local epdf = pdfe
+local pdfe = pdfe
lpdf = lpdf or { }
local lpdf = lpdf
local lpdf_epdf = { }
-lpdf.epdf = lpdf_epdf
-
-local openPDF = epdf.open
-local newPDF = epdf.new
-local closePDF = epdf.close
-
-local getcatalog = epdf.getcatalog
-local getinfo = epdf.getinfo
-local gettrailer = epdf.gettrailer
-local getnofpages = epdf.getnofpages
-local getversion = epdf.getversion
-local getbox = epdf.getbox
-local getstatus = epdf.getstatus
-local unencrypt = epdf.unencrypt
-
-local dictionarytotable = epdf.dictionarytotable
-local arraytotable = epdf.arraytotable
-local pagestotable = epdf.pagestotable
-local readwholestream = epdf.readwholestream
+ lpdf.epdf = lpdf_epdf
+
+local pdfopen = pdfe.open
+local pdfnew = pdfe.new
+local pdfclose = pdfe.close
+
+local getcatalog = pdfe.getcatalog
+local getinfo = pdfe.getinfo
+local gettrailer = pdfe.gettrailer
+local getnofpages = pdfe.getnofpages
+local getversion = pdfe.getversion
+local getbox = pdfe.getbox
+local getstatus = pdfe.getstatus
+local unencrypt = pdfe.unencrypt
+
+local dictionarytotable = pdfe.dictionarytotable
+local arraytotable = pdfe.arraytotable
+local pagestotable = pdfe.pagestotable
+local readwholestream = pdfe.readwholestream
local getfromreference = pdfe.getfromreference
@@ -405,21 +405,25 @@ function resolvers.pages(document)
--
for pagenumber=1,nofpages do
local rawpagedata = rawpages[pagenumber]
- local pagereference = rawpagedata[3]
- local pageobject = rawpagedata[1]
- local pagedata = some_dictionary(pageobject,document)
- if pagedata and pageobject then
- pagedata.number = pagenumber
- pagedata.MediaBox = getbox(pageobject,"MediaBox")
- pagedata.CropBox = getbox(pageobject,"CropBox")
- pagedata.BleedBox = getbox(pageobject,"BleedBox")
- pagedata.ArtBox = getbox(pageobject,"ArtBox")
- pagedata.TrimBox = getbox(pageobject,"TrimBox")
- pages[pagenumber] = pagedata
- __xrefs__[pagedata] = pagereference
- __cache__[pagereference] = pagedata
+ if rawpagedata then
+ local pagereference = rawpagedata[3]
+ local pageobject = rawpagedata[1]
+ local pagedata = some_dictionary(pageobject,document)
+ if pagedata and pageobject then
+ pagedata.number = pagenumber
+ pagedata.MediaBox = getbox(pageobject,"MediaBox")
+ pagedata.CropBox = getbox(pageobject,"CropBox")
+ pagedata.BleedBox = getbox(pageobject,"BleedBox")
+ pagedata.ArtBox = getbox(pageobject,"ArtBox")
+ pagedata.TrimBox = getbox(pageobject,"TrimBox")
+ pages[pagenumber] = pagedata
+ __xrefs__[pagedata] = pagereference
+ __cache__[pagereference] = pagedata
+ else
+ report_epdf("missing pagedata for page %i, case %i",pagenumber,1)
+ end
else
- report_epdf("missing pagedata for page %i",i)
+ report_epdf("missing pagedata for page %i, case %i",pagenumber,2)
end
end
--
@@ -437,9 +441,9 @@ function lpdf_epdf.load(filename,userpassword,ownerpassword,fromstring)
statistics.starttiming(lpdf_epdf)
local __data__
if fromstring then
- __data__ = newPDF(filename,#filename)
+ __data__ = pdfnew(filename,#filename)
else
- __data__ = openPDF(filename)
+ __data__ = pdfopen(filename)
end
if __data__ then
if userpassword and getstatus(__data__) < 0 then
@@ -455,6 +459,8 @@ function lpdf_epdf.load(filename,userpassword,ownerpassword,fromstring)
if __data__ then
document = {
filename = filename,
+ nofcopied = 0,
+ copied = { },
__cache__ = { },
__xrefs__ = { },
__fonts__ = { },
@@ -481,6 +487,9 @@ function lpdf_epdf.load(filename,userpassword,ownerpassword,fromstring)
statistics.stoptiming(lpdf_epdf)
-- print(statistics.elapsedtime(lpdf_epdf))
end
+ if document then
+ nofloaded = nofloaded + 1
+ end
return document or nil
end
@@ -491,10 +500,9 @@ function lpdf_epdf.unload(filename)
if type(filename) == "string" then
local document = loaded[filename]
if document then
--- report_epdf("%04i closed: %s",nofloaded,filename)
--- nofloaded = nofloaded - 1
loaded[document] = nil
loaded[filename] = nil
+ pdfclose(document.__data__)
end
end
end
@@ -519,6 +527,7 @@ lpdf_epdf.expanded = expanded
local spaces = lpegpatterns.whitespace^1
local optspaces = lpegpatterns.whitespace^0
+local comment = P("%") * (1 - lpegpatterns.newline)^0
local numchar = P("\\")/"" * (R("09")^3/function(s) return char(tonumber(s,8)) end)
+ P("\\") * P(1)
local key = P("/") * C(R("AZ","az","09","__")^1)
@@ -527,7 +536,7 @@ local keyword = Ct(Cc("name") * key)
local operator = C((R("AZ","az")+P("*")+P("'")+P('"'))^1)
local grammar = P { "start",
- start = (keyword + number + V("dictionary") + V("array") + V("hexstring") + V("decstring") + spaces)^1,
+ start = (comment + keyword + number + V("dictionary") + V("array") + V("hexstring") + V("decstring") + spaces)^1,
keyvalue = key * optspaces * V("start"),
array = Ct(Cc("array") * P("[") * Ct(V("start")^1) * P("]")),
dictionary = Ct(Cc("dict") * P("<<") * Ct(V("keyvalue")^1) * P(">>")),
@@ -635,6 +644,8 @@ local function analyzefonts(document,resources) -- unfinished, see mtx-pdf for b
return fonts
end
+lpdf_epdf.analyzefonts = analyzefonts
+
local more = 0
local unic = nil -- cheaper than passing each time as Carg(1)
@@ -680,27 +691,34 @@ function lpdf_epdf.getpagecontent(document,pagenumber)
local size = #entry
local operator = entry[size]
if operator == "Tf" then
- font = fonts[entry[1]]
- unic = font.tounicode
- elseif operator == "TJ" then -- { array, TJ }
- local list = entry[1]
+ font = fonts[entry[1][2]]
+ unic = font and font.tounicode or { }
+ elseif operator == "TJ" then
+ local data = entry[1] -- { "array", { ... } }
+ local list = data[2] -- { { ... }, { ... } }
for i=1,#list do
local li = list[i]
- if type(li) == "table" then
- if li[1] == "hex" then
+-- if type(li) == "table" then
+ local kind = li[1]
+ if kind == "hex" then
list[i] = lpegmatch(p_hex_to_utf,li[2])
- else
+ elseif kind == "string" then
list[i] = lpegmatch(p_dec_to_utf,li[2])
+ else
+ list[i] = li[2] -- kern
end
- else
- -- kern
- end
+-- else
+-- -- kern
+-- end
end
- elseif operator == "Tj" or operator == "'" or operator == '"' then -- { string, Tj } { string, ' } { n, m, string, " }
- local list = entry[size-1]
- if list[1] == "hex" then
+ elseif operator == "Tj" or operator == "'" or operator == '"' then
+ -- { string, Tj } { string, ' } { n, m, string, " }
+ local data = entry[size-1]
+ local list = data[2]
+ local kind = list[1]
+ if kind == "hex" then
list[2] = lpegmatch(p_hex_to_utf,li[2])
- else
+ elseif kind == "string" then
list[2] = lpegmatch(p_dec_to_utf,li[2])
end
end
@@ -729,25 +747,32 @@ function lpdf_epdf.contenttotext(document,list) -- maybe signal fonts
local size = #entry
local operator = entry[size]
if operator == "Tf" then
- last_f = entry[2]
+ last_f = entry[2][2] -- size
elseif operator == "TJ" then
- local list = entry[1]
+ local data = entry[1] -- { "array", { ... } }
+ local list = data[2] -- { { ... }, { ... } }
for i=1,#list do
local li = list[i]
- if type(li) == "string" then
+ local kind = type(li)
+ if kind == "string" then
last = last + 1
text[last] = li
- elseif li < -50 then
+ elseif kind == "number" and li < -50 then
last = last + 1
text[last] = " "
end
end
- line = concat(list)
elseif operator == "Tj" then
last = last + 1
- text[last] = entry[size-1]
+ local li = entry[size-1]
+ local kind = type(li)
+ if kind == "string" then
+ last = last + 1
+ text[last] = li
+ end
elseif operator == "cm" or operator == "Tm" then
- local ty = entry[6]
+ local data = entry
+ local ty = entry[6][2]
local dy = abs(last_y - ty)
if dy > linefactor*last_f then
if last > 0 then
@@ -793,7 +818,7 @@ function lpdf_epdf.getstructure(document,list) -- just a test
end
end
-if img then do
+if images then do
-- This can be made a bit faster (just get raw data and pass it) but I will
-- do that later. In the end the benefit is probably neglectable.
@@ -887,6 +912,8 @@ if img then do
value = pdfnull()
elseif kind == reference_object_code then
value = deepcopyobject(xref,copied,entry)
+ elseif entry == nil then
+ value = pdfnull()
else
value = tostring(entry)
end
@@ -999,6 +1026,8 @@ if img then do
local openpdf = lpdf_epdf.load
local closepdf = lpdf_epdf.unload
+ -- todo: keep track of already open files
+
local function newpdf(str,userpassword,ownerpassword)
return openpdf(str,userpassword,ownerpassword,true)
end
@@ -1019,7 +1048,7 @@ if img then do
local root = pdfdoc.Catalog
local page = pdfdoc.pages[pagenumber]
if page then
- local sizetag = sizes[size or "crop"] or sizes.cro
+ local sizetag = sizes[size or "crop"] or sizes.crop
local mediabox = page.MediaBox or { 0, 0, 0, 0 }
local cropbox = page[sizetag] or mediabox
return {
@@ -1046,92 +1075,96 @@ if img then do
local page = pdfdoc.pages[pagenumber or 1]
local pageinfo = querypdf(pdfdoc,pagenumber)
local contents = page.Contents
- local xref = pdfdoc.__xrefs__
- local copied = pdfdoc.__copied__
- if compact and lpdf_epdf.plugin then
- plugins = lpdf_epdf.plugin(pdfdoc,xref,copied,page)
- end
- local xobject = pdfdictionary {
- Type = pdfconstant("XObject"),
- Subtype = pdfconstant("Form"),
- FormType = 1,
- Group = copyobject(xref,copied,page,"Group"),
- LastModified = copyobject(xref,copied,page,"LastModified"),
- Metadata = copyobject(xref,copied,page,"Metadata"),
- PieceInfo = copyobject(xref,copied,page,"PieceInfo"),
- Resources = copyresources(pdfdoc,xref,copied,page),
- SeparationInfo = copyobject(xref,copied,page,"SeparationInfo"),
- } + attr
- if attributes then
- for k, v in expanded(attributes) do
- page[k] = v -- maybe nested
+ if contents then
+ local xref = pdfdoc.__xrefs__
+ local copied = pdfdoc.__copied__
+ if compact and lpdf_epdf.plugin then
+ plugins = lpdf_epdf.plugin(pdfdoc,xref,copied,page)
end
- end
- local content = ""
- local nolength = nil
- local ctype = contents.__type__
- -- we always recompress because image object streams can not be
- -- influenced (yet)
- if ctype == stream_object_code then
- if stripmarked then
- content = contents() -- uncompressed
- local stripped = lpdf_epdf.stripcontent(content)
- if stripped ~= content then
- -- report("%i bytes stripped on page %i",#content-#stripped,pagenumber or 1)
- content = stripped
+ local xobject = pdfdictionary {
+ Type = pdfconstant("XObject"),
+ Subtype = pdfconstant("Form"),
+ FormType = 1,
+ Group = copyobject(xref,copied,page,"Group"),
+ LastModified = copyobject(xref,copied,page,"LastModified"),
+ Metadata = copyobject(xref,copied,page,"Metadata"),
+ PieceInfo = copyobject(xref,copied,page,"PieceInfo"),
+ Resources = copyresources(pdfdoc,xref,copied,page),
+ SeparationInfo = copyobject(xref,copied,page,"SeparationInfo"),
+ } + attr
+ if attributes then
+ for k, v in expanded(attributes) do
+ page[k] = v -- maybe nested
end
- elseif recompress then
- content = contents() -- uncompressed
- else
- local Filter = copyobject(xref,copied,contents,"Filter")
- local Length = copyobject(xref,copied,contents,"Length")
- if Length and Filter then
- nolength = true
- xobject.Length = Length
- xobject.Filter = Filter
- content = contents(false) -- uncompressed
- else
+ end
+ local content = ""
+ local nolength = nil
+ local ctype = contents.__type__
+ -- we always recompress because image object streams can not be
+ -- influenced (yet)
+ if ctype == stream_object_code then
+ if stripmarked then
+ content = contents() -- uncompressed
+ local stripped = lpdf_epdf.stripcontent(content)
+ if stripped ~= content then
+ -- report("%i bytes stripped on page %i",#content-#stripped,pagenumber or 1)
+ content = stripped
+ end
+ elseif recompress then
content = contents() -- uncompressed
+ else
+ local Filter = copyobject(xref,copied,contents,"Filter")
+ local Length = copyobject(xref,copied,contents,"Length")
+ if Length and Filter then
+ nolength = true
+ xobject.Length = Length
+ xobject.Filter = Filter
+ content = contents(false) -- uncompressed
+ else
+ content = contents() -- uncompressed
+ end
+ end
+ elseif ctype == array_object_code then
+ content = { }
+ for i=1,#contents do
+ content[i] = contents[i]() -- uncompressed
end
+ content = concat(content," ")
end
- elseif ctype == array_object_code then
- content = { }
- for i=1,#contents do
- content[i] = contents[i]() -- uncompressed
+ -- still not nice: we double wrap now
+ plugins = nil
+ local rotation = pageinfo.rotation
+ local boundingbox = pageinfo.boundingbox
+ local transform = nil
+ if rotation == 90 then
+ transform = 3
+ elseif rotation == 180 then
+ transform = 2
+ elseif rotation == 270 then
+ transform = 1
+ elseif rotation > 1 and rotation < 4 then
+ transform = rotation
end
- content = concat(content," ")
- end
- -- still not nice: we double wrap now
- plugins = nil
- local rotation = pageinfo.rotation
- local boundingbox = pageinfo.boundingbox
- local transform = nil
- if rotation == 90 then
- transform = 3
- elseif rotation == 180 then
- transform = 2
- elseif rotation == 270 then
- transform = 1
- elseif rotation > 1 and rotation < 4 then
- transform = rotation
+ xobject.BBox = pdfarray {
+ boundingbox[1] * bpfactor,
+ boundingbox[2] * bpfactor,
+ boundingbox[3] * bpfactor,
+ boundingbox[4] * bpfactor,
+ }
+ -- maybe like bitmaps
+ return createimage { -- beware: can be a img.new or a dummy
+ bbox = boundingbox,
+ transform = transform,
+ nolength = nolength,
+ nobbox = true,
+ notype = true,
+ stream = content, -- todo: no compress, pass directly also length, filter etc
+ attr = xobject(),
+ kind = images.types.stream,
+ }
+ else
+ -- maybe report an error
end
- xobject.BBox = pdfarray {
- boundingbox[1] * bpfactor,
- boundingbox[2] * bpfactor,
- boundingbox[3] * bpfactor,
- boundingbox[4] * bpfactor,
- }
- -- maybe like bitmaps
- return createimage { -- beware: can be a img.new or a dummy
- bbox = boundingbox,
- transform = transform,
- nolength = nolength,
- nobbox = true,
- notype = true,
- stream = content, -- todo: no compress, pass directly also length, filter etc
- attr = xobject(),
- kind = images.types.stream,
- }
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-swf.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-swf.lua
index 44e42dc5f8d..df59fc79cf1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-swf.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-swf.lua
@@ -41,11 +41,7 @@ local embedimage = images.embed
local basepoints = number.dimenfactors.bp
-local f_image = formatters["%.6F 0 0 %.6F 0 0 cm /%s Do"]
-
-directives.register("pdf.stripzeros",function()
- f_image = formatters["%.6N 0 0 %.6N 0 0 cm /%s Do"]
-end)
+local f_image = formatters["%.6N 0 0 %.6N 0 0 cm /%s Do"]
local function package(image) -- see lpdf-u3d **
local boundingbox = image.bbox
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-tag.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-tag.lua
index 0a2fe679ea8..11174c4db29 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-tag.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-tag.lua
@@ -6,11 +6,11 @@ if not modules then modules = { } end modules ['lpdf-tag'] = {
license = "see context related readme files"
}
-local next = next
-local format, match, concat = string.format, string.match, table.concat
+local next, type = next, type
+local format, match, gmatch = string.format, string.match, string.gmatch
+local concat, sortedhash = table.concat, table.sortedhash
local lpegmatch, P, S, C = lpeg.match, lpeg.P, lpeg.S, lpeg.C
local settings_to_hash = utilities.parsers.settings_to_hash
-local sortedhash = table.sortedhash
local formatters = string.formatters
local trace_tags = false trackers.register("structures.tags", function(v) trace_tags = v end)
@@ -26,6 +26,7 @@ local nodeinjections = backends.pdf.nodeinjections
local codeinjections = backends.pdf.codeinjections
local enableaction = nodes.tasks.enableaction
+local disableaction = nodes.tasks.disableaction
local pdfdictionary = lpdf.dictionary
local pdfarray = lpdf.array
@@ -36,6 +37,7 @@ local pdfunicode = lpdf.unicode
local pdfflushobject = lpdf.flushobject
local pdfreserveobject = lpdf.reserveobject
local pdfpagereference = lpdf.pagereference
+local pdfmakenametree = lpdf.makenametree
local addtocatalog = lpdf.addtocatalog
local addtopageattributes = lpdf.addtopageattributes
@@ -62,6 +64,7 @@ local getattr = nuts.getattr
local getprev = nuts.getprev
local getnext = nuts.getnext
local getlist = nuts.getlist
+local getchar = nuts.getchar
local setlink = nuts.setlink
local setlist = nuts.setlist
@@ -75,7 +78,7 @@ local structure_kids -- delayed
local structure_ref -- delayed
local parent_ref -- delayed
local root -- delayed
-local names -- delayed
+local names = { }
local tree = { }
local elements = { }
@@ -90,29 +93,49 @@ local usedmapping = { }
----- tagsplitter = structurestags.patterns.splitter
--- local embeddedtags = false -- true will id all, for tracing
--- local f_tagid = formatters["%s-%04i"]
--- local embeddedfilelist = pdfarray() -- /AF crap
---
--- directives.register("structures.tags.embedmath",function(v)
--- if not v then
--- -- only enable
--- elseif embeddedtags == true then
--- -- already all tagged
--- elseif embeddedtags then
--- embeddedtags.math = true
--- else
--- embeddedtags = { math = true }
--- end
--- end)
+local embeddedtags = false -- true will id all, for tracing, otherwise table
+local f_tagid = formatters["%s-%04i"]
+local embeddedfilelist = pdfarray() -- /AF crap
--- function codeinjections.maptag(original,target,kind)
--- mapping[original] = { target, kind or "inline" }
--- end
+-- for testing, not that it was ever used:
+
+directives.register("structures.tags.embed",function(v)
+ if type(v) == "string" then
+ if type(embeddedtags) ~= "table" then
+ embeddedtags = { }
+ end
+ for s in gmatch(v,"([^, ]+)") do
+ embeddedtags[s] = true
+ end
+ elseif v and not embeddedtags then
+ embeddedtags = true
+ end
+end)
+
+-- for old times sake, not that it was ever used:
+
+directives.register("structures.tags.embedmath",function(v)
+ if not v then
+ -- only enable
+ elseif embeddedtags == true then
+ -- already all tagged
+ elseif embeddedtags then
+ embeddedtags.math = true
+ else
+ embeddedtags = { math = true }
+ end
+end)
+
+function codeinjections.maptag(original,target,kind)
+ mapping[original] = { target, kind or "inline" }
+end
+
+-- mostly the same as the annotations tree
local function finishstructure()
if root and #structure_kids > 0 then
- local nums, n = pdfarray(), 0
+ local nums = pdfarray()
+ local n = 0
for i=1,#tree do
n = n + 1 ; nums[n] = i - 1
n = n + 1 ; nums[n] = pdfreference(pdfflushobject(tree[i]))
@@ -120,17 +143,7 @@ local function finishstructure()
local parenttree = pdfdictionary {
Nums = nums
}
- -- we need to split names into smaller parts (e.g. alphabetic or so)
- -- we already have code for that somewhere
- if #names > 0 then
- local kids = pdfdictionary {
- Limits = pdfarray { names[1], names[#names-1] },
- Names = names,
- }
- local idtree = pdfdictionary {
- Kids = pdfarray { pdfreference(pdfflushobject(kids)) },
- }
- end
+ local idtree = pdfmakenametree(names)
--
local rolemap = pdfdictionary()
for k, v in next, usedmapping do
@@ -142,7 +155,7 @@ local function finishstructure()
Type = pdfconstant("StructTreeRoot"),
K = pdfreference(pdfflushobject(structure_kids)),
ParentTree = pdfreference(pdfflushobject(parent_ref,parenttree)),
- IDTree = #names > 0 and pdfreference(pdfflushobject(idtree)) or nil,
+ IDTree = idtree,
RoleMap = rolemap, -- sorted ?
}
pdfflushobject(structure_ref,structuretree)
@@ -191,6 +204,9 @@ end
local pdf_userproperties = pdfconstant("UserProperties")
+-- /O /Table
+-- /Headers [ ]
+
local function makeattribute(t)
if t and next(t) then
local properties = pdfarray()
@@ -209,40 +225,65 @@ end
local function makeelement(fulltag,parent)
local specification = specifications[fulltag]
- local tag = specification.tagname
- if tag == "ignore" then
+ local tagname = specification.tagname
+ local tagnameused = tagname
+ local attributes = nil
+ if tagname == "ignore" then
return false
- elseif tag == "mstackertop" or tag == "mstackerbot" or tag == "mstackermid"then
+ elseif tagname == "mstackertop" or tagname == "mstackerbot" or tagname == "mstackermid"then
-- TODO
return true
+ elseif tagname == "tabulatecell" then
+ local d = structurestags.gettabulatecell(fulltag)
+ if d and d.kind == 1 then
+ tagnameused = "tabulateheadcell"
+ end
+ elseif tagname == "tablecell" then
+ -- will become a plugin model
+ local d = structurestags.gettablecell(fulltag)
+ if d then
+ if d.kind == 1 then
+ tagnameused = "tableheadcell"
+ end
+ local rows = d.rows or 1
+ local cols = d.columns or 1
+ if rows > 1 or cols > 1 then
+ attributes = pdfdictionary {
+ O = pdfconstant("Table"),
+ RowSpan = rows > 1 and rows or nil,
+ ColSpan = cols > 1 and cols or nil,
+ }
+ end
+
+ end
end
--
local detail = specification.detail
local userdata = specification.userdata
--
- usedmapping[tag] = true
+ usedmapping[tagname] = true
--
-- specification.attribute is unique
--
local id = nil
- -- local af = nil
- -- if embeddedtags then
- -- local tagname = specification.tagname
- -- local tagindex = specification.tagindex
- -- if embeddedtags == true or embeddedtags[tagname] then
- -- id = f_tagid(tagname,tagindex)
- -- af = job.fileobjreferences.collected[id]
- -- if af then
- -- local r = pdfreference(af)
- -- af = pdfarray { r }
- -- -- embeddedfilelist[#embeddedfilelist+1] = r
- -- end
- -- end
- -- end
+ local af = nil
+ if embeddedtags then
+ local tagindex = specification.tagindex
+ if embeddedtags == true or embeddedtags[tagname] then
+ id = f_tagid(tagname,tagindex)
+ af = job.fileobjreferences.collected[id]
+ if af then
+ local r = pdfreference(af)
+ af = pdfarray { r }
+ -- embeddedfilelist[#embeddedfilelist+1] = r
+ end
+ end
+ end
--
local k = pdfarray()
local r = pdfreserveobject()
- local t = usedlabels[tag] or tag
+ local t = usedlabels[tagnameused] or tagnameused
+ -- local a = nil
local d = pdfdictionary {
Type = pdf_struct_element,
S = pdfconstant(t),
@@ -251,16 +292,15 @@ local function makeelement(fulltag,parent)
P = parent.pref,
Pg = pageref,
K = pdfreference(r),
- A = a and makeattribute(a) or nil,
+ -- A = a and makeattribute(a) or nil,
+ A = attributes,
-- Alt = " Who cares ",
-- ActualText = " Hi Hans ",
AF = af,
}
local s = pdfreference(pdfflushobject(d))
if id and names then
- local size = #names
- names[size+1] = id
- names[size+2] = s
+ names[id] = s
end
local kids = parent.kids
kids[#kids+1] = s
@@ -341,6 +381,7 @@ function nodeinjections.addtags(head)
for n, id in nextnode, head do
if id == glyph_code then
-- maybe also disc
+if getchar(n) ~= 0 then
local at = getattr(n,a_tagged) or false -- false: pagebody or so, so artifact
-- if not at then
-- range = nil
@@ -352,6 +393,7 @@ function nodeinjections.addtags(head)
elseif range then
range[4] = n -- stop
end
+end
elseif id == hlist_code or id == vlist_code then
local at = getattr(n,a_image)
if at then
@@ -363,7 +405,10 @@ function nodeinjections.addtags(head)
-- end
last = nil
else
- collectranges(getlist(n),n)
+ local list = getlist(n)
+ if list then
+ collectranges(list,n)
+ end
end
end
end
@@ -390,7 +435,6 @@ function nodeinjections.addtags(head)
local top = nil
local noftop = 0
-
local function inject(start,stop,list,literal,left,right)
local prev = getprev(start)
if prev then
@@ -401,7 +445,7 @@ function nodeinjections.addtags(head)
else
setlink(literal,start)
end
- if list and getlist(list) == start then
+ if list and not prev then
setlist(list,literal)
end
local literal = copy_node(EMCliteral)
@@ -461,7 +505,6 @@ function nodeinjections.addtags(head)
prev = prv
end
end
-
if prev then
literal = pageliteral(makecontent(prev,id,specification))
elseif ignore then
@@ -655,13 +698,36 @@ end
-- this belongs elsewhere (export is not pdf related)
-function codeinjections.enabletags(tg,lb)
- structures.tags.handler = nodeinjections.addtags
- enableaction("shipouts","structures.tags.handler")
- enableaction("shipouts","nodes.handlers.accessibility")
- enableaction("math","noads.handlers.tags")
- -- maybe also textblock
- if trace_tags then
- report_tags("enabling structure tags")
+local permitted = true
+local enabled = false
+
+function codeinjections.settaggingsupport(option)
+ if option == false then
+ if enabled then
+ disableaction("shipouts","structures.tags.handler")
+ disableaction("shipouts","nodes.handlers.accessibility") -- maybe not this one
+ disableaction("math","noads.handlers.tags")
+ enabled = false
+ end
+ if permitted then
+ if trace_tags then
+ report_tags("blocking structure tags")
+ end
+ permitted = false
+ end
+ end
+end
+
+function codeinjections.enabletags()
+ if permitted and not enabled then
+ structures.tags.handler = nodeinjections.addtags
+ enableaction("shipouts","structures.tags.handler")
+ enableaction("shipouts","nodes.handlers.accessibility")
+ enableaction("math","noads.handlers.tags")
+ -- maybe also textblock
+ if trace_tags then
+ report_tags("enabling structure tags")
+ end
+ enabled = true
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-u3d.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-u3d.lua
index f6897e92d20..54dc8a22725 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-u3d.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-u3d.lua
@@ -348,11 +348,7 @@ end
local stored_js, stored_3d, stored_pr, streams = { }, { }, { }, { }
-local f_image = formatters["q /GS gs %.6F 0 0 %.6F 0 0 cm /IM Do Q"]
-
-directives.register("pdf.stripzeros",function()
- f_image = formatters["q /GS gs %.6N 0 0 %.6N 0 0 cm /IM Do Q"]
-end)
+local f_image = formatters["q /GS gs %.6N 0 0 %.6N 0 0 cm /IM Do Q"]
local function insert3d(spec) -- width, height, factor, display, controls, label, foundname
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lpdf-wid.lua b/Master/texmf-dist/tex/context/base/mkiv/lpdf-wid.lua
index a929ed2ceb9..106eb98cca3 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lpdf-wid.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lpdf-wid.lua
@@ -26,6 +26,8 @@ if not modules then modules = { } end modules ['lpdf-wid'] = {
local tonumber, next = tonumber, next
local gmatch, gsub, find, lower = string.gmatch, string.gsub, string.find, string.lower
+local filenameonly, basefilename, filesuffix, addfilesuffix = file.nameonly, file.basename, file.suffix, file.addsuffix
+local isfile, modificationtime = lfs.isfile, lfs.modification
local stripstring = string.strip
local settings_to_array = utilities.parsers.settings_to_array
local settings_to_hash = utilities.parsers.settings_to_hash
@@ -55,6 +57,7 @@ local v_max = variables.max
local v_yes = variables.yes
local pdfconstant = lpdf.constant
+local pdfnull = lpdf.null
local pdfdictionary = lpdf.dictionary
local pdfarray = lpdf.array
local pdfreference = lpdf.reference
@@ -222,6 +225,15 @@ local referenced = { }
local ignorereferenced = true -- fuzzy pdf spec .. twice in attachment list, can become an option
local tobesavedobjrefs = utilities.storage.allocate()
local collectedobjrefs = utilities.storage.allocate()
+local permitted = true
+local enabled = true
+
+function codeinjections.setattachmentsupport(option)
+ if option == false then
+ permitted = false
+ enabled = false
+ end
+end
local fileobjreferences = {
collected = collectedobjrefs,
@@ -238,192 +250,215 @@ end
job.register('job.fileobjreferences.collected', tobesavedobjrefs, initializer)
local function flushembeddedfiles()
- if next(filestreams) then
+ if enabled and next(filestreams) then
local e = pdfarray()
+ local f = pdfarray()
for tag, reference in sortedhash(filestreams) do
if not reference then
report_attachment("unreferenced file, tag %a",tag)
elseif referenced[tag] == "hidden" then
e[#e+1] = pdfstring(tag)
e[#e+1] = reference -- already a reference
+ f[#f+1] = reference -- collect all file description references
else
- -- -- messy spec ... when annot not in named else twice in menu list acrobat
+ -- messy spec ... when annot not in named else twice in menu list acrobat
+ f[#f+1] = reference
end
end
if #e > 0 then
lpdf.addtonames("EmbeddedFiles",pdfreference(pdfflushobject(pdfdictionary{ Names = e })))
end
+ if #f > 0 then -- PDF/A-2|3: all associated files must have a relationship to the PDF document (global or part)
+ lpdf.addtocatalog("AF", pdfreference(pdfflushobject(f))) -- global (Catalog)
+ end
end
end
lpdf.registerdocumentfinalizer(flushembeddedfiles,"embeddedfiles")
function codeinjections.embedfile(specification)
- local data = specification.data
- local filename = specification.file
- local name = specification.name or ""
- local title = specification.title or ""
- local hash = specification.hash or filename
- local keepdir = specification.keepdir -- can change
- local usedname = specification.usedname
- local filetype = specification.filetype
- local compress = specification.compress
- if filename == "" then
- filename = nil
- end
- if compress == nil then
- compress = true
- end
- if data then
- local r = filestreams[hash]
- if r == false then
- return nil
- elseif r then
- return r
- elseif not filename then
- filename = specification.tag
- if not filename or filename == "" then
- filename = specification.registered
- end
- if not filename or filename == "" then
- filename = hash
- end
+ if enabled then
+ local data = specification.data
+ local filename = specification.file
+ local name = specification.name or ""
+ local title = specification.title or ""
+ local hash = specification.hash or filename
+ local keepdir = specification.keepdir -- can change
+ local usedname = specification.usedname
+ local filetype = specification.filetype
+ local compress = specification.compress
+ local mimetype = specification.mimetype or specification.mime
+ if filename == "" then
+ filename = nil
end
- else
- if not filename then
- return nil
+ if compress == nil then
+ compress = true
end
- local r = filestreams[hash]
- if r == false then
- return nil
- elseif r then
- return r
+ if data then
+ local r = filestreams[hash]
+ if r == false then
+ return nil
+ elseif r then
+ return r
+ elseif not filename then
+ filename = specification.tag
+ if not filename or filename == "" then
+ filename = specification.registered
+ end
+ if not filename or filename == "" then
+ filename = hash
+ end
+ end
else
- local foundname = resolvers.findbinfile(filename) or ""
- if foundname == "" or not lfs.isfile(foundname) then
- filestreams[filename] = false
+ if not filename then
+ return nil
+ end
+ local r = filestreams[hash]
+ if r == false then
return nil
+ elseif r then
+ return r
else
- specification.foundname = foundname
+ local foundname = resolvers.findbinfile(filename) or ""
+ if foundname == "" or not isfile(foundname) then
+ filestreams[filename] = false
+ return nil
+ else
+ specification.foundname = foundname
+ end
end
end
- end
- -- needs to cleaned up:
- usedname = usedname ~= "" and usedname or filename or name
- local basename = keepdir == true and usedname or file.basename(usedname)
- local basename = gsub(basename,"%./","")
- local savename = name ~= "" and name or basename
- if not filetype or filetype == "" then
- filetype = name and (filename and file.suffix(filename)) or "txt"
- end
- savename = file.addsuffix(savename,filetype) -- type is mandate for proper working in viewer
- local mimetype = specification.mimetype
- local a = pdfdictionary {
- Type = pdfconstant("EmbeddedFile"),
- Subtype = mimetype and mimetype ~= "" and pdfconstant(mimetype) or nil,
- }
- local f
- if data then
- f = pdfflushstreamobject(data,a)
- specification.data = true -- signal that still data but already flushed
- else
+ -- needs to be cleaned up:
+ usedname = usedname ~= "" and usedname or filename or name
+ local basename = keepdir == true and usedname or basefilename(usedname)
+ local basename = gsub(basename,"%./","")
+ local savename = name ~= "" and name or basename
local foundname = specification.foundname or filename
- f = pdfflushstreamfileobject(foundname,a,compress)
+ if not filetype or filetype == "" then
+ filetype = name and (filename and filesuffix(filename)) or "txt"
+ end
+ savename = addfilesuffix(savename,filetype) -- type is mandate for proper working in viewer
+ local a = pdfdictionary {
+ Type = pdfconstant("EmbeddedFile"),
+ Subtype = mimetype and mimetype ~= "" and pdfconstant(mimetype) or nil,
+ }
+ local f
+ if data then
+ f = pdfflushstreamobject(data,a)
+ specification.data = true -- signal that still data but already flushed
+ else
+ local attributes = lfs.attributes(foundname)
+ local modification = modificationtime(foundname)
+ a.Params = {
+ Size = attributes.size,
+ ModDate = lpdf.pdftimestamp(modification),
+ }
+ f = pdfflushstreamfileobject(foundname,a,compress)
+ end
+ local d = pdfdictionary {
+ Type = pdfconstant("Filespec"),
+ F = pdfstring(savename),
+ -- UF = pdfstring(savename),
+ UF = pdfunicode(savename),
+ EF = pdfdictionary { F = pdfreference(f) },
+ Desc = title ~= "" and pdfunicode(title) or nil,
+ AFRelationship = pdfconstant("Unspecified"), -- Supplement, Data, Source, Alternative, Data
+ }
+ local r = pdfreference(pdfflushobject(d))
+ filestreams[hash] = r
+ return r
end
- local d = pdfdictionary {
- Type = pdfconstant("Filespec"),
- F = pdfstring(savename),
- -- UF = pdfstring(savename),
- UF = pdfunicode(savename),
- EF = pdfdictionary { F = pdfreference(f) },
- Desc = title ~= "" and pdfunicode(title) or nil,
- -- AFRelationship = pdfconstant("Source"), -- some day maybe, not mandate
- }
- local r = pdfreference(pdfflushobject(d))
- filestreams[hash] = r
- return r
end
function nodeinjections.attachfile(specification)
- local registered = specification.registered or "<unset>"
- local data = specification.data
- local hash
- local filename
- if data then
- hash = md5.HEX(data)
- else
- filename = specification.file
- if not filename or filename == "" then
- report_attachment("no file specified, using registered %a instead",registered)
- filename = registered
- specification.file = registered
+ if enabled then
+ local registered = specification.registered or "<unset>"
+ local data = specification.data
+ local hash
+ local filename
+ if data then
+ hash = md5.HEX(data)
+ else
+ filename = specification.file
+ if not filename or filename == "" then
+ report_attachment("no file specified, using registered %a instead",registered)
+ filename = registered
+ specification.file = registered
+ end
+ local foundname = resolvers.findbinfile(filename) or ""
+ if foundname == "" or not isfile(foundname) then
+ report_attachment("invalid filename %a, ignoring registered %a",filename,registered)
+ return nil
+ else
+ specification.foundname = foundname
+ end
+ hash = filename
+ end
+ specification.hash = hash
+ nofattachments = nofattachments + 1
+ local registered = specification.registered or ""
+ local title = specification.title or ""
+ local subtitle = specification.subtitle or ""
+ local author = specification.author or ""
+ local onlyname = filename and filenameonly(filename) or ""
+ if registered == "" then
+ registered = filename
end
- local foundname = resolvers.findbinfile(filename) or ""
- if foundname == "" or not lfs.isfile(foundname) then
- report_attachment("invalid filename %a, ignoring registered %a",filename,registered)
- return nil
+ if author == "" and title ~= "" then
+ author = title
+ title = onlyname or ""
+ end
+ if author == "" then
+ author = onlyname or "<unknown>"
+ end
+ if title == "" then
+ title = registered
+ end
+ if title == "" and filename then
+ title = onlyname
+ end
+ local aref = attachments[registered]
+ if not aref then
+ aref = codeinjections.embedfile(specification)
+ attachments[registered] = aref
+ end
+ local reference = specification.reference
+ if reference and aref then
+ tobesavedobjrefs[reference] = aref[1]
+ end
+ if not aref then
+ report_attachment("skipping attachment, registered %a",registered)
+ -- already reported
+ elseif specification.method == v_hidden then
+ referenced[hash] = "hidden"
else
- specification.foundname = foundname
+ referenced[hash] = "annotation"
+ local name, appearance = analyzesymbol(specification.symbol,attachment_symbols)
+ local flags = specification.flags or 0 -- to keep it expandable
+ local d = pdfdictionary {
+ Subtype = pdfconstant("FileAttachment"),
+ FS = aref,
+ Contents = pdfunicode(title),
+ Name = name,
+ NM = pdfstring("attachment:"..nofattachments),
+ T = author ~= "" and pdfunicode(author) or nil,
+ Subj = subtitle ~= "" and pdfunicode(subtitle) or nil,
+ C = analyzecolor(specification.colorvalue,specification.colormodel),
+ CA = analyzetransparency(specification.transparencyvalue),
+ AP = appearance,
+ OC = analyzelayer(specification.layer),
+ -- F = pdfnull(), -- another rediculous need to satisfy validation
+ F = bit32.band(bit32.bor(flags,4),(1023-1-2-32-256)), -- set 3, clear 1,2,6,9; PDF 32000-1, p385
+ }
+ local width = specification.width or 0
+ local height = specification.height or 0
+ local depth = specification.depth or 0
+ local box = hpack_node(nodeinjections.annotation(width,height,depth,d()))
+ box.width = width
+ box.height = height
+ box.depth = depth
+ return box
end
- hash = filename
- end
- specification.hash = hash
- nofattachments = nofattachments + 1
- local registered = specification.registered or ""
- local title = specification.title or ""
- local subtitle = specification.subtitle or ""
- local author = specification.author or ""
- if registered == "" then
- registered = filename
- end
- if author == "" and title ~= "" then
- author = title
- title = filename or ""
- end
- if author == "" then
- author = filename or "<unknown>"
- end
- if title == "" then
- title = registered
- end
- local aref = attachments[registered]
- if not aref then
- aref = codeinjections.embedfile(specification)
- attachments[registered] = aref
- end
- local reference = specification.reference
- if reference and aref then
- tobesavedobjrefs[reference] = aref[1]
- end
- if not aref then
- report_attachment("skipping attachment, registered %a",registered)
- -- already reported
- elseif specification.method == v_hidden then
- referenced[hash] = "hidden"
- else
- referenced[hash] = "annotation"
- local name, appearance = analyzesymbol(specification.symbol,attachment_symbols)
- local d = pdfdictionary {
- Subtype = pdfconstant("FileAttachment"),
- FS = aref,
- Contents = pdfunicode(title),
- Name = name,
- NM = pdfstring("attachment:"..nofattachments),
- T = author ~= "" and pdfunicode(author) or nil,
- Subj = subtitle ~= "" and pdfunicode(subtitle) or nil,
- C = analyzecolor(specification.colorvalue,specification.colormodel),
- CA = analyzetransparency(specification.transparencyvalue),
- AP = appearance,
- OC = analyzelayer(specification.layer),
- }
- local width = specification.width or 0
- local height = specification.height or 0
- local depth = specification.depth or 0
- local box = hpack_node(nodeinjections.annotation(width,height,depth,d()))
- box.width = width
- box.height = height
- box.depth = depth
- return box
end
end
@@ -431,6 +466,8 @@ function codeinjections.attachmentid(filename) -- not used in context
return filestreams[filename]
end
+-- Comments
+
local nofcomments = 0
local usepopupcomments = false
@@ -478,11 +515,7 @@ function nodeinjections.comment(specification) -- brrr: seems to be done twice
local subtitle = specification.subtitle or "" -- as author
local author = specification.author or ""
local option = settings_to_hash(specification.option or "")
- if author == "" then
- if title == "" then
- title = tag
- end
- else
+ if author ~= "" then
if subtitle == "" then
subtitle = title
elseif title ~= "" then
@@ -490,6 +523,9 @@ function nodeinjections.comment(specification) -- brrr: seems to be done twice
end
title = author
end
+ if title == "" then
+ title = tag
+ end
local content, richcontent = checkcontent(text,option)
local d = pdfdictionary {
Subtype = pdfconstant("Text"),
diff --git a/Master/texmf-dist/tex/context/base/mkiv/luat-bwc.lua b/Master/texmf-dist/tex/context/base/mkiv/luat-bwc.lua
index 993de7bf3f4..a86514fa85b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/luat-bwc.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/luat-bwc.lua
@@ -8,25 +8,25 @@ if not modules then modules = { } end modules ['luat-bwc'] = {
-- backward compatibility
-if not tex.wd then
-
- local box = tex.box
-
- local wd = { } setmetatable(wd, {
- __index = function(t,k) local bk = box[k] return bk and bk.width or 0 end,
- __newindex = function(t,k,v) local bk = box[k] if bk then bk.width = v end end,
- } )
-
- local ht = { } setmetatable(ht, {
- __index = function(t,k) local bk = box[k] return bk and bk.height or 0 end,
- __newindex = function(t,k,v) local bk = box[k] if bk then bk.height = v end end,
- } )
-
- local dp = { } setmetatable(dp, {
- __index = function(t,k) local bk = box[k] return bk and bk.depth or 0 end,
- __newindex = function(t,k,v) local bk = box[k] if bk then bk.depth = v end end,
- } )
-
- -- tex.wd, tex.ht, tex.dp = wd, ht, dp
-
-end
+-- if not tex.wd then
+--
+-- local box = tex.box
+--
+-- local wd = { } setmetatable(wd, {
+-- __index = function(t,k) local bk = box[k] return bk and bk.width or 0 end,
+-- __newindex = function(t,k,v) local bk = box[k] if bk then bk.width = v end end,
+-- } )
+--
+-- local ht = { } setmetatable(ht, {
+-- __index = function(t,k) local bk = box[k] return bk and bk.height or 0 end,
+-- __newindex = function(t,k,v) local bk = box[k] if bk then bk.height = v end end,
+-- } )
+--
+-- local dp = { } setmetatable(dp, {
+-- __index = function(t,k) local bk = box[k] return bk and bk.depth or 0 end,
+-- __newindex = function(t,k,v) local bk = box[k] if bk then bk.depth = v end end,
+-- } )
+--
+-- tex.wd, tex.ht, tex.dp = wd, ht, dp
+--
+-- end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/luat-cnf.lua b/Master/texmf-dist/tex/context/base/mkiv/luat-cnf.lua
index 5e3f026e95b..4939b05c39c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/luat-cnf.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/luat-cnf.lua
@@ -31,7 +31,8 @@ texconfig.param_size = 25000
texconfig.save_size = 100000
texconfig.stack_size = 10000
texconfig.function_size = 32768
-texconfig.properties_size = 65536
+texconfig.properties_size = 10000
+texconfig.fix_mem_init = 750000
local stub = [[
@@ -60,18 +61,37 @@ function texconfig.init()
libraries = { -- we set it here as we want libraries also 'indexed'
basiclua = {
- "string", "table", "coroutine", "debug", "file", "io", "lpeg", "math", "os", "package", "bit32",
+ -- always
+ "string", "table", "coroutine", "debug", "file", "io", "lpeg", "math", "os", "package",
+ -- bonus
+ "bit32", "utf8",
},
- basictex = { -- noad
- "callback", "font", "img", "lang", "lua", "node", "pdf", "status", "tex", "texconfig", "texio", "token",
+ basictex = {
+ -- always
+ "callback", "font", "lang", "lua", "node", "status", "tex", "texconfig", "texio", "token",
+ -- not in luametatex
+ "img", "pdf",
},
extralua = {
- "gzip", "zip", "zlib", "lfs", "ltn12", "mime", "socket", "md5", "fio", "unicode", "utf",
+ -- not in luametatex
+ "unicode", "utf", "gzip", "zip", "zlib",
+ -- in luametatex
+ "xzip", "xmath", "xcomplex", "basexx",
+ -- maybe some day in luametatex
+ "lz4", "lzo",
+ -- always (mime can go)
+ "lfs","socket", "mime", "md5", "sha2", "fio", "sio",
},
extratex = {
- "epdf", "kpse", "mplib", -- "fontloader",
+ -- not in luametatex
+ "kpse",
+ -- always
+ "pdfe", "mplib",
+ -- in luametatex
+ "pdfdecode", "pngdecode",
},
obsolete = {
+ "epdf",
"fontloader", -- can be filled by luat-log
"kpse",
},
@@ -102,7 +122,7 @@ function texconfig.init()
local tv = type(gv)
if tv == "table" then
for k, v in next, gv do
- keys[k] = tostring(v) -- true -- by tostring we cannot call overloades functions (security)
+ keys[k] = tostring(v) -- true -- by tostring we cannot call overloads functions (security)
end
end
lib[v] = keys
@@ -121,16 +141,29 @@ function texconfig.init()
-- shortcut and helper
- local setbytecode = lua.setbytecode
- local getbytecode = lua.getbytecode
+ local setbytecode = lua.setbytecode
+ local getbytecode = lua.getbytecode
+ local callbytecode = lua.callbytecode or function(i)
+ local b = getbytecode(i)
+ if type(b) == "function" then
+ b()
+ return true
+ else
+ return false
+ end
+ end
local function init(start)
local i = start
local t = os.clock()
while true do
- local b = getbytecode(i)
+ -- local b = callbytecode(i)
+ local e, b = pcall(callbytecode,i)
+ if not e then
+ print(string.format("\nfatal error : unable to load bytecode register %%i, maybe wipe the cache first\n",i))
+ os.exit()
+ end
if b then
- b() ;
setbytecode(i,nil) ;
i = i + 1
else
@@ -218,7 +251,9 @@ local function makestub()
t[#t+1] = format("texconfig.%s=%s",v,tv)
end
end
- io.savedata(name,format("%s\n\n%s",concat(t,"\n"),format(stub,firsttable,tostring(CONTEXTLMTXMODE) or 0)))
+ t[#t+1] = ""
+ t[#t+1] = format(stub,firsttable,tostring(CONTEXTLMTXMODE or 0))
+ io.savedata(name,concat(t,"\n"))
logs.newline()
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/luat-cod.lua b/Master/texmf-dist/tex/context/base/mkiv/luat-cod.lua
index c667f3eccb5..3125495b47b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/luat-cod.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/luat-cod.lua
@@ -31,11 +31,11 @@ texconfig.param_size = 25000
texconfig.save_size = 100000
texconfig.stack_size = 10000
texconfig.function_size = 32768
-texconfig.properties_size = 65536
+texconfig.properties_size = 10000
+texconfig.fix_mem_init = 750000
-- registering bytecode chunks
------ bytecode = lua.bytecode or { } -- we use functions
local bytedata = lua.bytedata or { }
local bytedone = lua.bytedone or { }
@@ -136,29 +136,23 @@ if LUATEXENGINE == nil then
or (find(status.banner,"LuajitTeX",1,true) and "luajittex" or "luatex")
end
-if LUATEXVERION == nil then
- LUATEXVERSION = status.luatex_revision
+if LUATEXVERSION == nil then
LUATEXVERSION = status.luatex_version/100
- -- + tonumber(LUATEXVERSION)/1000
- + (tonumber(LUATEXVERSION) or (string.byte(LUATEXVERSION)-string.byte("a")+10))/1000
+ + tonumber(status.luatex_revision)/10000
end
if CONTEXTLMTXMODE == nil then
- if status.obj_ptr == nil then
- CONTEXTLMTXMODE = 2
- else
- CONTEXTLMTXMODE = 0
- for i=1,#arg do if arg[i] == "--c:lmtx" then
- CONTEXTLMTXMODE, pdf, img = 1, nil, nil
- break
- end end
- end
+ CONTEXTLMTXMODE = LUATEXENGINE == "luametatex" and 1 or 0
end
if LUATEXFUNCTIONALITY == nil then
LUATEXFUNCTIONALITY = status.development_id or 6346
end
+if LUATEXFORMATID == nil then
+ LUATEXFORMATID = status.format_id or 0
+end
+
if JITSUPPORTED == nil then
JITSUPPORTED = LUATEXENGINE == "luajittex" or jit
end
@@ -263,6 +257,10 @@ local function find_write_file(id,name)
return target_file(name)
end
+local function find_log_file(name)
+ return target_file(name)
+end
+
local function open_read_file(name)
local f = io.open(name,'rb')
return {
@@ -281,6 +279,7 @@ local open_data_file = open_read_file
callback.register('find_read_file' , find_read_file )
callback.register('open_read_file' , open_read_file )
callback.register('find_write_file', find_write_file)
+callback.register('find_log_file', find_log_file)
callback.register('find_data_file' , find_data_file )
callback.register('open_data_file' , open_data_file )
diff --git a/Master/texmf-dist/tex/context/base/mkiv/luat-env.lua b/Master/texmf-dist/tex/context/base/mkiv/luat-env.lua
index e0c69d2079b..1620a26e521 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/luat-env.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/luat-env.lua
@@ -11,7 +11,7 @@
-- sense. Much of this evolved before bytecode arrays were available and so a lot of
-- code has disappeared already.
-local rawset, rawget, loadfile = rawset, rawget, loadfile
+local rawset, loadfile = rawset, loadfile
local gsub = string.gsub
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
@@ -71,6 +71,17 @@ function environment.texfile(filename)
end
function environment.luafile(filename) -- needs checking
+
+ if CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 and file.suffix(filename) == "lua" then
+ -- no "tex", as that's pretty slow when not found (suffixes get appended, shouldn't happen)
+ -- trackers.enable("resolvers.*")
+ local resolved = resolvers.findfile(file.replacesuffix(filename,"lmt")) or ""
+ -- trackers.disable("resolvers.*")
+ if resolved ~= "" then
+ return resolved
+ end
+ end
+
local resolved = resolvers.findfile(filename,'tex') or ""
if resolved ~= "" then
return resolved
diff --git a/Master/texmf-dist/tex/context/base/mkiv/luat-fio.lua b/Master/texmf-dist/tex/context/base/mkiv/luat-fio.lua
index 2996ae66ab0..26db46a88ab 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/luat-fio.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/luat-fio.lua
@@ -117,6 +117,8 @@ if not resolvers.initialized() then
-- register('read_cidmap_file' , function(file) return loadbinfile(file,"cidmap") end, true)
register('find_write_file' , function(id,name) return name end, true)
+
+ register('find_log_file' , function(name) return name end, true)
register('find_format_file' , function(name) return name end, true)
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/luat-fmt.lua b/Master/texmf-dist/tex/context/base/mkiv/luat-fmt.lua
index 586c5948e98..5502e1a1da2 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/luat-fmt.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/luat-fmt.lua
@@ -13,8 +13,10 @@ local luasuffixes = utilities.lua.suffixes
local report_format = logs.reporter("resolvers","formats")
-local function primaryflags()
- local arguments = environment.arguments
+-- this is a bit messy: we also handle flags in mtx-context so best we
+-- can combine this some day (all here)
+
+local function primaryflags(arguments)
local flags = { }
if arguments.silent then
flags[#flags+1] = "--interaction=batchmode"
@@ -25,8 +27,7 @@ local function primaryflags()
return concat(flags," ")
end
-local function secondaryflags()
- local arguments = environment.arguments
+local function secondaryflags(arguments)
local trackers = arguments.trackers
local directives = arguments.directives
local flags = { }
@@ -48,6 +49,9 @@ local function secondaryflags()
if arguments.ansi then
flags[#flags+1] = "--c:ansi"
end
+ if arguments.ansilog then
+ flags[#flags+1] = "--c:ansilog"
+ end
if arguments.strip then
flags[#flags+1] = "--c:strip"
end
@@ -63,12 +67,13 @@ end
local template = [[--ini %primaryflags% --lua=%luafile% %texfile% %secondaryflags% %dump% %redirect%]]
local checkers = {
- primaryflags = "string",
- secondaryflags = "string",
+ primaryflags = "verbose", -- "flags"
+ secondaryflags = "verbose", -- "flags"
luafile = "readable", -- "cache"
texfile = "readable", -- "cache"
redirect = "string",
dump = "string",
+ binarypath = "string",
}
local runners = {
@@ -95,50 +100,110 @@ local runners = {
},
}
-function environment.make_format(name,arguments)
- local engine = environment.ownmain or "luatex"
- local silent = environment.arguments.silent
- local errors = environment.arguments.errors
- -- change to format path (early as we need expanded paths)
- local olddir = dir.current()
- local path = caches.getwritablepath("formats",engine) or "" -- maybe platform
- if path ~= "" then
- lfs.chdir(path)
- end
- report_format("using format path %a",dir.current())
- -- check source file
- local texsourcename = file.addsuffix(name,"mkiv")
- local fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+local function validbinarypath()
+ -- if environment.arguments.addbinarypath then
+ if not environment.arguments.nobinarypath then
+ local path = environment.ownpath or file.dirname(environment.ownname)
+ if path and path ~= "" then
+ path = dir.expandname(path)
+ if path ~= "" and lfs.isdir(path) then
+ return path
+ end
+ end
+ end
+end
+
+function environment.make_format(formatname)
+ -- first we set up the engine and normally that information is provided
+ -- by the engine ... when we move to luametatex we could decide to simplfy
+ -- all the following
+ local arguments = environment.arguments
+ local engine = environment.ownmain or "luatex"
+ local silent = arguments.silent
+ local errors = arguments.errors
+ -- now we locate the to be used source files ... there are some variants that we
+ -- need to take care
+ local texsourcename = ""
+ local texsourcepath = ""
+ local fulltexsourcename = ""
+ if engine == "luametatex" then
+ texsourcename = file.addsuffix(formatname,"mkxl")
+ fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+ end
+ if fulltexsourcename == "" then
+ texsourcename = file.addsuffix(formatname,"mkiv")
+ fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+ end
if fulltexsourcename == "" then
- texsourcename = file.addsuffix(name,"tex")
+ texsourcename = file.addsuffix(formatname,"tex")
fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
end
if fulltexsourcename == "" then
- report_format("no tex source file with name %a (mkiv or tex)",name)
- lfs.chdir(olddir)
+ report_format("no tex source file with name %a (mkiv or tex)",formatname)
return
- else
- report_format("using tex source file %a",fulltexsourcename)
end
- local texsourcepath = dir.expandname(file.dirname(fulltexsourcename)) -- really needed
- -- check specification
- local specificationname = file.replacesuffix(fulltexsourcename,"lus")
- local fullspecificationname = resolvers.findfile(specificationname,"tex") or ""
- if fullspecificationname == "" then
- specificationname = file.join(texsourcepath,"context.lus")
- fullspecificationname = resolvers.findfile(specificationname,"tex") or ""
+ report_format("using tex source file %a",fulltexsourcename)
+ -- this is tricky: we normally have an expanded path but when we don't have one,
+ -- the current path gets appended
+ fulltexsourcename = dir.expandname(fulltexsourcename)
+ texsourcepath = file.dirname(fulltexsourcename)
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
end
+ -- we're getting there, that is: we have a file that specifies the context format;
+ -- in addition to that file we need a stub for setting up lua as we start rather
+ -- minimalistic
+ local specificationname = "context.lus"
+ local specificationpath = ""
+ local fullspecificationname = resolvers.findfile(specificationname) or ""
if fullspecificationname == "" then
- report_format("unknown stub specification %a",specificationname)
- lfs.chdir(olddir)
+ report_format("unable to locate specification file %a",specificationname)
+ return
+ end
+ report_format("using specification file %a",fullspecificationname)
+ -- let's expand the found name and so an extra check
+ fullspecificationname = dir.expandname(fullspecificationname)
+ specificationpath = file.dirname(fullspecificationname)
+ if texsourcepath ~= specificationpath then
+ report_format("tex source file and specification file are on different paths")
+ return
+ end
+ -- let's do an additional check here, if only because we then have a bit better
+ -- feedback on what goes wrong
+ if not lfs.isfile(fulltexsourcename) then
+ report_format("no accessible tex source file with name %a",fulltexsourcename)
+ return
+ end
+ if not lfs.isfile(fullspecificationname) then
+ report_format("no accessible specification file with name %a",fulltexsourcename)
+ return
+ end
+ -- we're still going strong
+ report_format("using tex source path %a",texsourcepath)
+ -- we will change tot the format path because some local files will be created
+ -- in the process and we don't want clutter
+ local validformatpath = caches.getwritablepath("formats",engine) or ""
+ local startupdir = dir.current()
+ if validformatpath == "" then
+ report_format("invalid format path, insufficient write access")
+ return
+ end
+ -- in case we have a qualified path, we need to do this before we change
+ -- because we can have half qualified paths (in lxc)
+ local binarypath = validbinarypath()
+ report_format("changing to format path %a",validformatpath)
+ lfs.chdir(validformatpath)
+ if dir.current() ~= validformatpath then
+ report_format("unable to change to format path %a",validformatpath)
return
end
- local specificationpath = file.dirname(fullspecificationname)
- -- load specification
+ -- we're now ready for making the format which we do on the first found
+ -- writable path
local usedluastub = nil
local usedlualibs = dofile(fullspecificationname)
if type(usedlualibs) == "string" then
- usedluastub = file.join(file.dirname(fullspecificationname),usedlualibs)
+ usedluastub = file.join(specificationpath,usedlualibs)
elseif type(usedlualibs) == "table" then
report_format("using stub specification %a",fullspecificationname)
local texbasename = file.basename(name)
@@ -157,56 +222,68 @@ function environment.make_format(name,arguments)
end
else
report_format("invalid stub specification %a",fullspecificationname)
- lfs.chdir(olddir)
+ lfs.chdir(startupdir)
return
end
- -- generate format
+ -- we're ready to go now but first we check if we actually do have a runner
+ -- for this engine ... we'd better have one
+ local runner = runners[engine]
+ if not runner then
+ report_format("the format %a cannot be generated, no runner available for engine %a",name,engine)
+ lfs.chdir(startupdir)
+ return
+ end
+ -- now we can generate the format, where we use a couple of flags,
+ -- split into two categories
+ local primaryflags = primaryflags(arguments)
+ local secondaryflags = secondaryflags(arguments)
local specification = {
- primaryflags = primaryflags(),
- secondaryflags = secondaryflags(),
+ binarypath = binarypath,
+ primaryflags = primaryflags,
+ secondaryflags = secondaryflags,
luafile = quoted(usedluastub),
texfile = quoted(fulltexsourcename),
dump = os.platform == "unix" and "\\\\dump" or "\\dump",
}
- local runner = runners[engine]
- if not runner then
- report_format("format %a cannot be generated, no runner available for engine %a",name,engine)
- elseif silent then
- statistics.starttiming()
+ if silent then
specification.redirect = "> temp.log"
- local result = runner(specification)
- local runtime = statistics.stoptiming()
- if result ~= 0 then
- print(format("%s silent make > fatal error when making format %q",engine,name)) -- we use a basic print
- else
- print(format("%s silent make > format %q made in %.3f seconds",engine,name,runtime)) -- we use a basic print
- end
+ end
+ statistics.starttiming()
+ local result = runner(specification)
+ local runtime = statistics.stoptiming()
+ if silent then
os.remove("temp.log")
- else
- runner(specification)
- end
- -- remove related mem files
- local pattern = file.removesuffix(file.basename(usedluastub)).."-*.mem"
- -- report_format("removing related mplib format with pattern %a", pattern)
- local mp = dir.glob(pattern)
- if mp then
- for i=1,#mp do
- local name = mp[i]
- report_format("removing related mplib format %a", file.basename(name))
- os.remove(name)
- end
end
- lfs.chdir(olddir)
+ -- some final report
+ report_format()
+ if binarypath and binarypath ~= "" then
+ report_format("binary path : %s",binarypath or "?")
+ end
+ report_format("format path : %s",validformatpath)
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",usedluastub)
+ if primaryflags ~= "" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags ~= "" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("context file : %s",fulltexsourcename)
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result == 0 and "okay" or "error")
+ report_format()
+ -- last we go back to the home base
+ lfs.chdir(startupdir)
end
-local template = [[%flags% --fmt=%fmtfile% --lua=%luafile% %texfile% %more%]]
+local template = [[%primaryflags% --fmt=%fmtfile% --lua=%luafile% %texfile% %secondaryflags%]]
local checkers = {
- flags = "string",
- more = "string",
- fmtfile = "readable", -- "cache"
- luafile = "readable", -- "cache"
- texfile = "readable", -- "cache"
+ primaryflags = "verbose",
+ secondaryflags = "verbose",
+ fmtfile = "readable", -- "cache"
+ luafile = "readable", -- "cache"
+ texfile = "readable", -- "cache"
}
local runners = {
@@ -217,6 +294,13 @@ local runners = {
checkers = checkers,
reporter = report_format,
},
+ luametatex = sandbox.registerrunner {
+ name = "run luametatex format",
+ program = "luametatex",
+ template = template,
+ checkers = checkers,
+ reporter = report_format,
+ },
luajittex = sandbox.registerrunner {
name = "run luajittex format",
program = "luajittex",
@@ -226,40 +310,67 @@ local runners = {
},
}
-function environment.run_format(name,data,more)
- if name and name ~= "" then
- local engine = environment.ownmain or "luatex"
- local barename = file.removesuffix(name)
- local fmtname = caches.getfirstreadablefile(file.addsuffix(barename,"fmt"),"formats",engine)
- if fmtname == "" then
- fmtname = resolvers.findfile(file.addsuffix(barename,"fmt")) or ""
- end
- fmtname = resolvers.cleanpath(fmtname)
- if fmtname == "" then
- report_format("no format with name %a",name)
- else
- local barename = file.removesuffix(name) -- expanded name
- local luaname = file.addsuffix(barename,"luc")
- if not lfs.isfile(luaname) then
- luaname = file.addsuffix(barename,"lua")
- end
- if not lfs.isfile(luaname) then
- report_format("using format name %a",fmtname)
- report_format("no luc/lua file with name %a",barename)
- else
- local runner = runners[engine]
- if not runner then
- report_format("format %a cannot be run, no runner available for engine %a",name,engine)
- else
- runner {
- flags = primaryflags(),
- fmtfile = quoted(barename),
- luafile = quoted(luaname),
- texfile = quoted(data),
- more = more,
- }
- end
- end
- end
+function environment.run_format(formatname,scriptname,filename,primaryflags,secondaryflags,verbose)
+ local engine = environment.ownmain or "luatex"
+ if not formatname or formatname == "" then
+ report_format("missing format name")
+ return
+ end
+ if not scriptname or scriptname == "" then
+ report_format("missing script name")
+ return
+ end
+ if not lfs.isfile(formatname) or not lfs.isfile(scriptname) then
+ formatname, scriptname = resolvers.locateformat(formatname)
+ end
+ if not formatname or formatname == "" then
+ report_format("invalid format name")
+ return
+ end
+ if not scriptname or scriptname == "" then
+ report_format("invalid script name")
+ return
+ end
+ local runner = runners[engine]
+ if not runner then
+ report_format("format %a cannot be run, no runner available for engine %a",file.nameonly(name),engine)
+ return
+ end
+ if not filename then
+ filename ""
+ end
+ local binarypath = validbinarypath()
+ local specification = {
+ binarypath = binarypath,
+ primaryflags = primaryflags or "",
+ secondaryflags = secondaryflags or "",
+ fmtfile = quoted(formatname),
+ luafile = quoted(scriptname),
+ texfile = filename ~= "" and quoted(filename) or "",
+ }
+ statistics.starttiming()
+ local result = runner(specification)
+ local runtime = statistics.stoptiming()
+ if verbose then
+ report_format()
+ if binarypath and binarypath ~= "" then
+ report_format("binary path : %s",binarypath)
+ end
+ report_format("luatex engine : %s",engine)
+ report_format("lua startup file : %s",scriptname)
+ report_format("tex format file : %s",formatname)
+ if filename ~= "" then
+ report_format("tex input file : %s",filename)
+ end
+ if primaryflags ~= "" then
+ report_format("primary flags : %s",primaryflags)
+ end
+ if secondaryflags ~= "" then
+ report_format("secondary flags : %s",secondaryflags)
+ end
+ report_format("run time : %.3f seconds",runtime)
+ report_format("return value : %s",result == 0 and "okay" or "error")
+ report_format()
end
+ return result
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/luat-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/luat-ini.lua
index ffd402c7752..cec0161e7b0 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/luat-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/luat-ini.lua
@@ -26,18 +26,20 @@ if not global then
end
LUATEXVERSION = status.luatex_version/100
- + tonumber(status.luatex_revision)/1000
+ + tonumber(status.luatex_revision)/10000
LUATEXENGINE = status.luatex_engine and string.lower(status.luatex_engine)
or (string.find(status.banner,"LuajitTeX",1,true) and "luajittex" or "luatex")
LUATEXFUNCTIONALITY = status.development_id or 6346
+LUATEXFORMATID = status.format_id or 0
+
JITSUPPORTED = LUATEXENGINE == "luajittex" or jit
INITEXMODE = status.ini_version
-CONTEXTLMTXMODE = CONTEXTLMTXMODE or (status.obj_ptr == nil and 2 or 1)
+CONTEXTLMTXMODE = CONTEXTLMTXMODE or (LUATEXENGINE == "luametatex" and 1) or 0
function os.setlocale()
-- no need for a message
diff --git a/Master/texmf-dist/tex/context/base/mkiv/luat-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/luat-ini.mkiv
index da5a3a3109f..d1d829be978 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/luat-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/luat-ini.mkiv
@@ -265,23 +265,23 @@
% \def\syst_helpers_checked_stripped_csname#1%
% {\if\noexpand#1\letterbackslash\else#1\fi}
-\ifdefined\normalluadef
+% \ifdefined\normalluadef
\normalprotected\def\installctxfunction#1#2% expandable
{\edef\m_syst_name{\csstring#1}%
- \global\expandafter\normalluadef\csname\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax}
+ \global\expandafter\normalluadef\csname\m_syst_name\endcsname\ctxcommand{ctxfunction(\!!bs#2\!!es,true)}\relax}
\normalprotected\def\installctxscanner#1#2% expandable
{\edef\m_syst_name{\csstring#1}%
- \global\expandafter\normalluadef\csname\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax}
+ \global\expandafter\normalluadef\csname\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name",\!!bs#2\!!es,true)}\relax}
\normalprotected\def\installprotectedctxfunction#1#2% protected
{\edef\m_syst_name{\csstring#1}%
- \global\normalprotected\expandafter\normalluadef\csname\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax}
+ \global\normalprotected\expandafter\normalluadef\csname\m_syst_name\endcsname\ctxcommand{ctxfunction(\!!bs#2\!!es,true)}\relax}
\normalprotected\def\installprotectedctxscanner#1#2% protected
{\edef\m_syst_name{\csstring#1}%
- \global\normalprotected\expandafter\normalluadef\csname\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax}
+ \global\normalprotected\expandafter\normalluadef\csname\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name",\!!bs#2\!!es,true)}\relax}
\normalprotected\def\resetctxscanner#1%
{\edef\m_syst_name{\csstring#1}%
@@ -292,57 +292,57 @@
% \let\installprotectedctxfunctioncall\installprotectedctxfunction
% \let\installprotectedctxscannercall \installprotectedctxscanner
-\else
-
- \ifdefined\luafunctioncall \else
- \normalprotected\def\luafunctioncall{\luafunction}
- \fi
-
- \normalprotected\def\installctxfunction#1#2% expandable
- {\edef\m_syst_name{\csstring#1}%
- \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax
- \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunction\csname\??luafunction\m_syst_name\endcsname}}
-
- \normalprotected\def\installctxscanner#1#2% expandable
- {\edef\m_syst_name{\csstring#1}%
- \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax
- \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunction\csname\??luafunction\m_syst_name\endcsname}}
-
- \normalprotected\def\installprotectedctxfunction#1#2% protected
- {\edef\m_syst_name{\csstring#1}%
- \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax
- \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}}
-
- \normalprotected\def\installprotectedctxscanner#1#2% protected
- {\edef\m_syst_name{\csstring#1}%
- \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax
- \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}}
-
- \normalprotected\def\resetctxscanner#1%
- {\edef\m_syst_name{\csstring#1}%
- \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\zerocount
- \expandafter\glet\csname\m_syst_name\endcsname\relax}
-
- % \normalprotected\def\installctxfunctioncall#1#2%
- % {\edef\m_syst_name{\csstring#1}%
- % \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax
- % \expandafter\xdef\csname\m_syst_name\endcsname{\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}}
- %
- % \normalprotected\def\installctxscannercall#1#2%
- % {\edef\m_syst_name{\csstring#1}%
- % \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax
- % \expandafter\xdef\csname\m_syst_name\endcsname{\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}}
- %
- % \normalprotected\def\installprotectedctxfunctioncall#1#2%
- % {\edef\m_syst_name{\csstring#1}%
- % \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax
- % \normalprotected\expandafter\xdef\csname\m_syst_name\endcsname{\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}}
- %
- % \normalprotected\def\installprotectedctxscannercall#1#2%
- % {\edef\m_syst_name{\csstring#1}%
- % \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax
- % \normalprotected\expandafter\xdef\csname\m_syst_name\endcsname{\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}}
-
-\fi
+% \else
+%
+% \ifdefined\luafunctioncall \else
+% \normalprotected\def\luafunctioncall{\luafunction}
+% \fi
+%
+% \normalprotected\def\installctxfunction#1#2% expandable
+% {\edef\m_syst_name{\csstring#1}%
+% \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax
+% \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunction\csname\??luafunction\m_syst_name\endcsname}}
+%
+% \normalprotected\def\installctxscanner#1#2% expandable
+% {\edef\m_syst_name{\csstring#1}%
+% \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax
+% \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunction\csname\??luafunction\m_syst_name\endcsname}}
+%
+% \normalprotected\def\installprotectedctxfunction#1#2% protected
+% {\edef\m_syst_name{\csstring#1}%
+% \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax
+% \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}}
+%
+% \normalprotected\def\installprotectedctxscanner#1#2% protected
+% {\edef\m_syst_name{\csstring#1}%
+% \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax
+% \expandafter\xdef\csname\m_syst_name\endcsname{\noexpand\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}}
+%
+% \normalprotected\def\resetctxscanner#1%
+% {\edef\m_syst_name{\csstring#1}%
+% \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\zerocount
+% \expandafter\glet\csname\m_syst_name\endcsname\relax}
+%
+% % \normalprotected\def\installctxfunctioncall#1#2%
+% % {\edef\m_syst_name{\csstring#1}%
+% % \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax
+% % \expandafter\xdef\csname\m_syst_name\endcsname{\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}}
+% %
+% % \normalprotected\def\installctxscannercall#1#2%
+% % {\edef\m_syst_name{\csstring#1}%
+% % \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax
+% % \expandafter\xdef\csname\m_syst_name\endcsname{\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}}
+% %
+% % \normalprotected\def\installprotectedctxfunctioncall#1#2%
+% % {\edef\m_syst_name{\csstring#1}%
+% % \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxfunction("#2",true)}\relax
+% % \normalprotected\expandafter\xdef\csname\m_syst_name\endcsname{\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}}
+% %
+% % \normalprotected\def\installprotectedctxscannercall#1#2%
+% % {\edef\m_syst_name{\csstring#1}%
+% % \global\expandafter\chardef\csname\??luafunction\m_syst_name\endcsname\ctxcommand{ctxscanner("\m_syst_name","#2",true)}\relax
+% % \normalprotected\expandafter\xdef\csname\m_syst_name\endcsname{\luafunctioncall\csname\??luafunction\m_syst_name\endcsname}}
+%
+% \fi
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/luat-lib.mkiv b/Master/texmf-dist/tex/context/base/mkiv/luat-lib.mkiv
index 6660323698b..0ffd1dd4076 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/luat-lib.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/luat-lib.mkiv
@@ -19,18 +19,13 @@
\registerctxluafile{util-sac}{optimize}
\registerctxluafile{util-sto}{} % could also be done in trac-deb.mkiv
\registerctxluafile{util-pck}{}
-% \registerctxluafile{util-seq}{}
-%registerctxluafile{util-mrg}{} % not needed in context itself, only mtxrun
-%registerctxluafile{util-lua}{} % moved
\registerctxluafile{util-prs}{}
\registerctxluafile{util-fmt}{}
\registerctxluafile{util-dim}{}
-%registerctxluafile{trac-inf}{}
\registerctxluafile{trac-set}{}
\registerctxluafile{trac-log}{}
\registerctxluafile{trac-inf}{}
-%registerctxluafile{trac-pro}{}
\registerctxluafile{util-lua}{}
\registerctxluafile{util-deb}{} % could also be done in trac-deb.mkiv
@@ -43,16 +38,12 @@
\registerctxluafile{util-soc-imp-reset} {}
\registerctxluafile{util-soc-imp-socket} {}
-%registerctxluafile{util-soc-imp-copas} {}
\registerctxluafile{util-soc-imp-ltn12} {}
-%registerctxluafile{util-soc-imp-mbox} {}
\registerctxluafile{util-soc-imp-mime} {}
\registerctxluafile{util-soc-imp-url} {}
\registerctxluafile{util-soc-imp-headers}{}
\registerctxluafile{util-soc-imp-http} {}
\registerctxluafile{util-soc-imp-tp} {}
-%registerctxluafile{util-soc-imp-ftp} {}
-%registerctxluafile{util-soc-imp-smtp} {}
\ifcase\contextlmtxmode\else
\registerctxluafile{util-zip}{}
@@ -66,12 +57,12 @@
\registerctxluafile{data-res}{}
\registerctxluafile{data-inp}{}
\registerctxluafile{data-out}{}
-\registerctxluafile{data-fil}{}
+\registerctxluafile{data-fil}{} % opener gets overloaded in data-tex
-\registerctxluafile{data-pre}{}
-\registerctxluafile{data-tex}{}
+\registerctxluafile{data-pre}{} % after data-res
+\registerctxluafile{data-bin}{} % before data-tex
+\registerctxluafile{data-tex}{} % after data-pre
\registerctxluafile{data-vir}{}
-\registerctxluafile{data-bin}{}
\registerctxluafile{data-zip}{}
%registerctxluafile{data-crl}{}
\registerctxluafile{data-sch}{}
@@ -82,7 +73,9 @@
\registerctxluafile{data-use}{}
\registerctxluafile{data-aux}{}
-\registerctxluafile{util-lib}{}
+% \ifcase\contextlmtxmode
+% \registerctxluafile{util-lib}{}
+% \fi
\registerctxluafile{luat-cbk}{}
\registerctxluafile{luat-run}{}
@@ -95,7 +88,7 @@
\registerctxluafile{luat-env}{}
\registerctxluafile{luat-exe}{} % simplified
\registerctxluafile{luat-iop}{} % simplified
-\registerctxluafile{luat-bwc}{}
+%registerctxluafile{luat-bwc}{}
\registerctxluafile{trac-lmx}{} % might become l-lmx or luat-lmx
\registerctxluafile{luat-mac}{}
%registerctxluafile{luat-prp}{} % for the moment of not much use
diff --git a/Master/texmf-dist/tex/context/base/mkiv/luat-mac.lua b/Master/texmf-dist/tex/context/base/mkiv/luat-mac.lua
index 44630b19427..e6789a2338a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/luat-mac.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/luat-mac.lua
@@ -22,6 +22,7 @@ local rep, sub = string.rep, string.sub
local setmetatable = setmetatable
local filesuffix = file.suffix
local convertlmxstring = lmx and lmx.convertstring
+local savedata = io.savedata
local pushtarget, poptarget = logs.pushtarget, logs.poptarget
@@ -195,35 +196,27 @@ local checker = P("%") * (1 - newline - P("macros"))^0
-- maybe namespace
-local macros = { } resolvers.macros = macros
+local resolvers = resolvers
+
+local macros = { }
+resolvers.macros = macros
+
+local loadtexfile = resolvers.loadtexfile
function macros.preprocessed(str,strip)
return lpegmatch(parser,str,1,strip)
end
function macros.convertfile(oldname,newname) -- beware, no testing on oldname == newname
- local data = resolvers.loadtexfile(oldname)
+ local data = loadtexfile(oldname)
data = interfaces.preprocessed(data) or "" -- interfaces not yet defined
- io.savedata(newname,data)
+ savedata(newname,data)
end
function macros.version(data)
return lpegmatch(checker,data)
end
--- function macros.processmkvi(str,filename)
--- if filename and filesuffix(filename) == "mkvi" or lpegmatch(checker,str) == "mkvi" then
--- local oldsize = #str
--- str = lpegmatch(parser,str,1,true) or str
--- pushtarget("logfile")
--- report_macros("processed mkvi file %a, delta %s",filename,oldsize-#str)
--- poptarget()
--- end
--- return str
--- end
---
--- utilities.sequencers.appendaction(resolvers.openers.helpers.textfileactions,"system","resolvers.macros.processmkvi")
-
-- the document variables hack is temporary
local processors = { }
@@ -268,6 +261,9 @@ function processors.mkxi(str,filename)
return str
end
+processors.mklx = processors.mkvi
+processors.mkxl = processors.mkiv
+
function macros.processmk(str,filename)
if filename then
local suffix = filesuffix(filename)
@@ -279,8 +275,18 @@ function macros.processmk(str,filename)
return str
end
+local function validvi(filename,str)
+ local suffix = filesuffix(filename)
+ if suffix == "mkvi" or suffix == "mklx" then
+ return true
+ else
+ local check = lpegmatch(checker,str)
+ return check == "mkvi" or check == "mklx"
+ end
+end
+
function macros.processmkvi(str,filename)
- if filename and filesuffix(filename) == "mkvi" or lpegmatch(checker,str) == "mkvi" then
+ if filename and filename ~= "" and validvi(filename,str) then
local oldsize = #str
str = lpegmatch(parser,str,1,true) or str
pushtarget("logfile")
@@ -290,39 +296,35 @@ function macros.processmkvi(str,filename)
return str
end
-local sequencers = utilities.sequencers
-
-if sequencers then
-
- sequencers.appendaction(resolvers.openers.helpers.textfileactions,"system","resolvers.macros.processmk")
- sequencers.appendaction(resolvers.openers.helpers.textfileactions,"system","resolvers.macros.processmkvi")
-
-end
+macros.processmklx = macros.processmkvi
-- bonus
-if resolvers.schemes then
+local schemes = resolvers.schemes
+
+if schemes then
local function handler(protocol,name,cachename)
local hashed = url.hashed(name)
local path = hashed.path
if path and path ~= "" then
- local str = resolvers.loadtexfile(path)
- if filesuffix(path) == "mkvi" or lpegmatch(checker,str) == "mkvi" then
+ local str = loadtexfile(path)
+ if validvi(path,str) then
-- already done automatically
- io.savedata(cachename,str)
+ savedata(cachename,str)
else
local result = lpegmatch(parser,str,1,true) or str
pushtarget("logfile")
report_macros("processed scheme %a, delta %s",filename,#str-#result)
poptarget()
- io.savedata(cachename,result)
+ savedata(cachename,result)
end
end
return cachename
end
- resolvers.schemes.install('mkvi',handler,1) -- this will cache !
+ schemes.install('mkvi',handler,1)
+ schemes.install('mklx',handler,1)
end
@@ -414,7 +416,7 @@ local encodepattern = Cs((encodecomment + 1)^0)
local decodecomment = P(commentsignal) / "%%%%" -- why doubles here?
local decodepattern = Cs((decodecomment + 1)^0)
-function resolvers.macros.encodecomment(str)
+function macros.encodecomment(str)
if txtcatcodes and tex.catcodetable == txtcatcodes then
return lpegmatch(encodepattern,str) or str
else
@@ -422,7 +424,7 @@ function resolvers.macros.encodecomment(str)
end
end
-function resolvers.macros.decodecomment(str) -- normally not needed
+function macros.decodecomment(str) -- normally not needed
return txtcatcodes and lpegmatch(decodepattern,str) or str
end
@@ -430,9 +432,22 @@ end
-- resolvers.macros.encodecommentpattern = encodepattern
-- resolvers.macros.decodecommentpattern = decodepattern
-function resolvers.macros.enablecomment(thecatcodes)
- if not txtcatcodes then
- txtcatcodes = thecatcodes or catcodes.numbers.txtcatcodes
- utilities.sequencers.appendaction(resolvers.openers.helpers.textlineactions,"system","resolvers.macros.encodecomment")
+local sequencers = utilities.sequencers
+local appendaction = sequencers and sequencers.appendaction
+
+if appendaction then
+
+ local textlineactions = resolvers.openers.helpers.textlineactions
+ local textfileactions = resolvers.openers.helpers.textfileactions
+
+ appendaction(textfileactions,"system","resolvers.macros.processmk")
+ appendaction(textfileactions,"system","resolvers.macros.processmkvi")
+
+ function macros.enablecomment(thecatcodes)
+ if not txtcatcodes then
+ txtcatcodes = thecatcodes or catcodes.numbers.txtcatcodes
+ appendaction(textlineactions,"system","resolvers.macros.encodecomment")
+ end
end
+
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/luat-run.lua b/Master/texmf-dist/tex/context/base/mkiv/luat-run.lua
index 00cc6507502..d29a463b88c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/luat-run.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/luat-run.lua
@@ -7,8 +7,9 @@ if not modules then modules = { } end modules ['luat-run'] = {
}
local next = next
-local format, find = string.format, string.find
+local find = string.find
local insert, remove = table.insert, table.remove
+local osexit = os.exit
-- trace_job_status is also controlled by statistics.enable that is set via the directive system.nostatistics
@@ -118,14 +119,18 @@ end
-- For Taco ...
-local sequencers = utilities.sequencers
-local appendgroup = sequencers.appendgroup
-local appendaction = sequencers.appendaction
-local wrapupactions = sequencers.new { }
+local sequencers = utilities.sequencers
+local appendgroup = sequencers.appendgroup
+local appendaction = sequencers.appendaction
+local wrapupactions = sequencers.new { }
+local cleanupactions = sequencers.new { }
appendgroup(wrapupactions,"system")
appendgroup(wrapupactions,"user")
+appendgroup(cleanupactions,"system")
+appendgroup(cleanupactions,"user")
+
local function wrapup_run()
local runner = wrapupactions.runner
if runner then
@@ -133,10 +138,26 @@ local function wrapup_run()
end
end
+local function cleanup_run()
+ local runner = cleanupactions.runner
+ if runner then
+ runner()
+ end
+end
+
function luatex.wrapup(action)
appendaction(wrapupactions,"user",action)
end
+function luatex.cleanup(action)
+ appendaction(cleanupactions,"user",action)
+end
+
+function luatex.abort()
+ cleanup_run()
+ osexit(1)
+end
+
appendaction(wrapupactions,"system",synctex.wrapup)
-- this can be done later
@@ -204,7 +225,8 @@ end
luatex.registerstopactions(luatex.cleanuptempfiles)
--- filenames
+-- Reporting filenames has been simplified since lmtx because we don't need the
+-- traditional () {} <> etc methods (read: that directive option was never chosen).
local report_open = logs.reporter("open source")
local report_close = logs.reporter("close source")
@@ -215,13 +237,20 @@ local register = callbacks.register
local level = 0
local total = 0
local stack = { }
-local all = false
function luatex.currentfile()
return stack[#stack] or tex.jobname
end
-local function report_start(name)
+local function report_start(name,rest)
+ if rest then
+ -- luatex
+ if name ~= 1 then
+ insert(stack,false)
+ return
+ end
+ name = rest
+ end
if find(name,"virtual://",1,true) then
insert(stack,false)
else
@@ -244,39 +273,6 @@ local function report_stop()
end
end
-if CONTEXTLMTXMODE < 2 then
-
- local types = {
- "data",
- "font map",
- "image",
- "font subset",
- "full font",
- }
-
- local do_report_start = report_start
- local do_report_stop = report_stop
-
- report_start = function(left,name)
- if not left then
- -- skip
- elseif left ~= 1 then
- if all then
- report_load("type %a, name %a",types[left],name or "?")
- end
- else
- do_report_start(name)
- end
- end
-
- report_stop = function(right)
- if level == 1 or not right or right == 1 then
- do_report_stop()
- end
- end
-
-end
-
local function report_none()
end
@@ -284,17 +280,9 @@ register("start_file",report_start)
register("stop_file", report_stop)
directives.register("system.reportfiles", function(v)
- if v == "noresources" then
- all = false
- register("start_file",report_start)
- register("stop_file", report_stop)
- elseif toboolean(v) or v == "all" then
- all = true
+ if v then
register("start_file",report_start)
register("stop_file", report_stop)
- elseif v == "traditional" then
- register("start_file",nil)
- register("stop_file", nil)
else
register("start_file",report_none)
register("stop_file", report_none)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/luat-sto.lua b/Master/texmf-dist/tex/context/base/mkiv/luat-sto.lua
index ce891765aa9..620de9a15b4 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/luat-sto.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/luat-sto.lua
@@ -72,7 +72,7 @@ if environment.initex then
end
local dumped = serialize(original,target)
if trace_storage then
- report_storage('saving %a in slot %a, size %s',message,max,#dumped)
+ report_storage("saving %a in slot %a, size %s",message,max,#dumped)
end
-- we don't need tracing in such tables
dumped = concat({ definition, comment, dumped },"\n")
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lxml-css.lua b/Master/texmf-dist/tex/context/base/mkiv/lxml-css.lua
index b0f5c9b72f6..96dc626f7db 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lxml-css.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lxml-css.lua
@@ -146,45 +146,116 @@ if context then
end
-local pattern = Cf( Ct("") * (
- Cg(
- Cc("style") * (
- C("italic")
- + C("oblique")
- + C("slanted") / "oblique"
- )
- + Cc("variant") * (
- (C("smallcaps") + C("caps")) / "small-caps"
- )
- + Cc("weight") *
- C("bold")
- + Cc("family") * (
- (C("mono") + C("type")) / "monospace" -- just ignore the "space(d)"
- + (C("sansserif") + C("sans")) / "sans-serif" -- match before serif
- + C("serif")
+
+do
+
+ local p_digit = lpegpatterns.digit
+ local p_unquoted = Cs(lpegpatterns.unquoted)
+ local p_size = (S("+-")^0 * (p_digit^0 * P(".") * p_digit^1 + p_digit^1 * P(".") + p_digit^1)) / tonumber
+ * C(P("p") * S("txc") + P("e") * S("xm") + S("mc") * P("m") + P("in") + P("%"))
+
+ local pattern = Cf( Ct("") * (
+ Cg(
+ Cc("style") * (
+ C("italic")
+ + C("oblique")
+ + C("slanted") / "oblique"
+ )
+ + Cc("variant") * (
+ (C("smallcaps") + C("caps")) / "small-caps"
+ )
+ + Cc("weight") * (
+ C("bold")
+ )
+ + Cc("family") * (
+ (C("mono") + C("type")) / "monospace" -- just ignore the "space(d)"
+ + (C("sansserif") + C("sans")) / "sans-serif" -- match before serif
+ + C("serif")
+ )
+ + Cc("size") * Ct(p_size)
)
- )
---+ P("\\") * (
--- P("bf") * ( Cg ( Cc("weight") * Cc("bold") ) )
--- + P("bi") * ( Cg ( Cc("weight") * Cc("bold") )
--- * Cg ( Cc("style") * Cc("italic") ) )
--- + P("bs") * ( Cg ( Cc("weight") * Cc("bold") )
--- * Cg ( Cc("style") * Cc("oblique") ) )
--- + P("it") * ( Cg ( Cc("style") * Cc("italic") ) )
--- + P("sl") * ( Cg ( Cc("style") * Cc("oblique") ) )
--- + P("sc") * ( Cg ( Cc("variant") * Cc("small-caps") ) )
--- + P("tt") * ( Cg ( Cc("family") * Cc("monospace") ) )
---)
- + P(1)
-)^0 , rawset)
-
-function css.fontspecification(str)
- return str and lpegmatch(pattern,lower(str))
-end
+ + P(1)
+ )^0 , rawset)
+
+ function css.fontspecification(str)
+ return str and lpegmatch(pattern,lower(str))
+ end
+
+ -- These map onto context!
+
+ function css.style(str)
+ if str and str ~= "" then
+ str = lower(str)
+ if str == "italic" then
+ return "italic"
+ elseif str == "slanted" or str == "oblique" then
+ return "slanted"
+ end
+ end
+ return "normal"
+ end
+
+ function css.variant(str) -- will change to a feature
+ if str and str ~= "" then
+ str = lower(str)
+ if str == "small-caps" or str == "caps" or str == "smallcaps" then
+ return "caps"
+ end
+ end
+ return "normal"
+ end
+
+ function css.weight(str)
+ if str and str ~= "" then
+ str = lower(str)
+ if str == "bold" then
+ return "bold"
+ end
+ end
+ return "normal"
+ end
+
+ function css.family(str)
+ if str and str ~= "" then
+ str = lower(str)
+ if str == "mono" or str == "type" or str == "monospace" then
+ return "mono"
+ elseif str == "sansserif" or str == "sans" then
+ return "sans"
+ elseif str == "serif" then
+ return "serif"
+ else
+ -- what if multiple ...
+ return lpegmatch(p_unquoted,str) or str
+ end
+ end
+ end
+
+ function css.size(str,factors)
+ local size, unit
+ if type(str) == "table" then
+ size, unit = str[1], str[2]
+ elseif str and str ~= "" then
+ size, unit = lpegmatch(p_size,lower(str))
+ end
+ if size and unit then
+ if factors then
+ return (factors[unit] or 1) * size
+ else
+ return size, unit
+ end
+ end
+ end
+
+ function css.colorspecification(str)
+ if str and str ~= "" then
+ local c = attributes.colors.values[tonumber(str)]
+ if c then
+ return format("rgb(%s%%,%s%%,%s%%)",c[3]*100,c[4]*100,c[5]*100)
+ end
+ end
+ end
-function css.colorspecification(str)
- local c = str and attributes.colors.values[tonumber(str)]
- return c and format("rgb(%s%%,%s%%,%s%%)",c[3]*100,c[4]*100,c[5]*100)
end
-- The following might be handy. It hooks into the normal parser as <selector>
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lxml-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/lxml-ini.lua
index b255477cb71..348ecbbe45c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lxml-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lxml-ini.lua
@@ -82,7 +82,7 @@ implement { name = "xmllast", actions = lxml.last, arg
implement { name = "xmllastatt", actions = lxml.lastatt }
implement { name = "xmllastmatch", actions = lxml.lastmatch }
implement { name = "xmllastpar", actions = lxml.lastpar }
-implement { name = "xmlload", actions = lxml.load, arguments = "3 strings" }
+implement { name = "xmlloadfile", actions = lxml.load, arguments = "3 strings" }
implement { name = "xmlloadbuffer", actions = lxml.loadbuffer, arguments = "3 strings" }
implement { name = "xmlloaddata", actions = lxml.loaddata, arguments = "3 strings" }
implement { name = "xmlloaddirectives", actions = lxml.directives.load, arguments = "string" }
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lxml-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/lxml-ini.mkiv
index 5cb4bb22d65..09358e11cba 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lxml-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/lxml-ini.mkiv
@@ -38,9 +38,14 @@
\def\xmlconcat #1#2#3{\clf_xmlconcat {#1}{#2}{\detokenize{#3}}}
\def\xmlconcatrange #1#2#3#4#5{\clf_xmlconcatrange{#1}{#2}{#3}{#4}{\detokenize{#5}}}
-\def\xmlload #1#2{\clf_xmlload {#1}{#2}{\directxmlparameter\c!compress}}
-\def\xmlloadbuffer #1#2{\clf_xmlloadbuffer {#1}{#2}{\directxmlparameter\c!compress}}
-\def\xmlloaddata #1#2{\clf_xmlloaddata {#1}{#2}{\directxmlparameter\c!compress}}
+
+%D Maybe I should add \type {\unexpanded} here:
+
+\def\xmlloadfile #1#2{\clf_xmlloadfile {#1}{#2}{\directxmlparameter\c!compress}}
+\def\xmlloadbuffer#1#2{\clf_xmlloadbuffer{#1}{#2}{\directxmlparameter\c!compress}}
+\def\xmlloaddata #1#2{\clf_xmlloaddata {#1}{#2}{\directxmlparameter\c!compress}}
+
+\let\xmlload\xmlloadfile
% aliased
@@ -317,6 +322,8 @@
\unexpanded\def\startxmldisplayverbatim
{\dosingleempty\lxml_start_display_verbatim}
+\let\stopxmldisplayverbatim\relax
+
\def\lxml_start_display_verbatim[#1]%
{\startpacked
\edef\currenttyping{#1}%
@@ -334,6 +341,8 @@
\unexpanded\def\startxmlinlineverbatim
{\dosingleempty\lxml_start_inline_verbatim}
+\let\stopxmlinlineverbatim\relax
+
\unexpanded\def\lxml_start_inline_verbatim[#1]%
{\begingroup
\edef\currenttype{#1}%
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lxml-lpt.lua b/Master/texmf-dist/tex/context/base/mkiv/lxml-lpt.lua
index 392c1a4014e..5bcdfbabcb0 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lxml-lpt.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lxml-lpt.lua
@@ -614,27 +614,6 @@ local lp_doequal = P("=") / "=="
local lp_or = P("|") / " or "
local lp_and = P("&") / " and "
--- local lp_builtin = (
--- P("text") / "(ll.dt[1] or '')" + -- fragile
--- P("content") / "ll.dt" +
--- P("name") / "((ll.ns~='' and ll.ns..':'..ll.tg) or ll.tg)" +
--- P("tag") / "ll.tg" +
--- P("position") / "l" + -- is element in finalizer
--- P("firstindex") / "1" +
--- P("lastindex") / "(#ll.__p__.dt or 1)" +
--- P("firstelement") / "1" +
--- P("lastelement") / "(ll.__p__.en or 1)" +
--- P("first") / "1" +
--- P("last") / "#list" +
--- P("rootposition") / "order" +
--- P("order") / "order" +
--- P("element") / "(ll.ei or 1)" +
--- P("index") / "(ll.ni or 1)" +
--- P("match") / "(ll.mi or 1)" +
--- P("namespace") / "ll.ns" +
--- P("ns") / "ll.ns"
--- ) * ((spaces * P("(") * spaces * P(")"))/"")
-
local builtin = {
text = "(ll.dt[1] or '')", -- fragile
content = "ll.dt",
@@ -647,6 +626,8 @@ local builtin = {
lastindex = "(#ll.__p__.dt or 1)",
lastelement = "(ll.__p__.en or 1)",
last = "#list",
+ list = "list",
+ self = "ll",
rootposition = "order",
order = "order",
element = "(ll.ei or 1)",
@@ -654,6 +635,7 @@ local builtin = {
match = "(ll.mi or 1)",
namespace = "ll.ns",
ns = "ll.ns",
+
}
local lp_builtin = lpeg.utfchartabletopattern(builtin)/builtin * ((spaces * P("(") * spaces * P(")"))/"")
@@ -806,7 +788,9 @@ end
local function register_expression(expression)
local converted = lpegmatch(converter,expression)
- local runner = load(format(template_e,converted))
+ local wrapped = format(template_e,converted)
+ local runner = load(wrapped)
+ -- print(wrapped)
runner = (runner and runner()) or function() errorrunner_e(expression,converted) end
return { kind = "expression", expression = expression, converted = converted, evaluator = runner }
end
@@ -1306,6 +1290,21 @@ expressions.count = function(e,pattern) -- what if pattern == empty or nil
return pattern and (collected and #collected) or 0
end
+expressions.attribute = function(e,name,value)
+ if type(e) == "table" and name then
+ local a = e.at
+ if a then
+ local v = a[name]
+ if value then
+ return v == value
+ else
+ return v
+ end
+ end
+ end
+ return nil
+end
+
-- external
-- expressions.oneof = function(s,...)
@@ -1371,7 +1370,7 @@ function expressions.contains(str,pattern)
return false
end
-function xml.expressions.idstring(str)
+function expressions.idstring(str)
return type(str) == "string" and gsub(str,"^#","") or ""
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lxml-tab.lua b/Master/texmf-dist/tex/context/base/mkiv/lxml-tab.lua
index 1ef83c47de7..8f6379f2f8b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lxml-tab.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lxml-tab.lua
@@ -920,6 +920,15 @@ local function handlenewline()
currentline = currentline + 1
end
+-- first = ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#x00F8-#x02FF] |
+-- [#x0370-#x037D] | [#x037F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] |
+-- [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
+-- [#x10000-#xEFFFF]
+-- rest = "-" | "." | [0-9] | #xB7 | [#x300-#x36F] | [#x203F-#x2040]
+-- name = first + (first + rest)^1
+--
+-- We assume utf and do no real checking!
+
local spacetab = S(' \t')
local space = S(' \r\n\t')
local newline = lpegpatterns.newline / handlenewline
@@ -933,7 +942,11 @@ local slash = P('/')
local colon = P(':')
local semicolon = P(';')
local ampersand = P('&')
-local valid = R('az', 'AZ', '09') + S('_-.')
+----- valid_0 = lpegpatterns.utf8two + lpegpatterns.utf8three + lpegpatterns.utf8four
+local valid_0 = R("\128\255") -- basically any encoding without checking (fast)
+local valid_1 = R('az', 'AZ') + S('_') + valid_0
+local valid_2 = valid_1 + R('09') + S('-.')
+local valid = valid_1 * valid_2^0
local name_yes = C(valid^1) * colon * C(valid^1)
local name_nop = C(P(true)) * C(valid^1)
local name = name_yes + name_nop
@@ -971,8 +984,9 @@ end
local function entityfile(pattern,k,v,n)
if n then
local okay, data
- if resolvers then
- okay, data = resolvers.loadbinfile(n)
+ local loadbinfile = resolvers and resolvers.loadbinfile
+ if loadbinfile then
+ okay, data = loadbinfile(n)
else
data = io.loaddata(n)
okay = data and data ~= ""
@@ -1146,13 +1160,15 @@ publicentityfile +
end
-grammar_parsed_text_one_nop ,
-grammar_parsed_text_two_nop ,
-grammar_unparsed_text_nop = install(space, spacing, anything)
+local
+ grammar_parsed_text_one_nop ,
+ grammar_parsed_text_two_nop ,
+ grammar_unparsed_text_nop = install(space, spacing, anything)
-grammar_parsed_text_one_yes ,
-grammar_parsed_text_two_yes ,
-grammar_unparsed_text_yes = install(space_nl, spacing_nl, anything_nl)
+local
+ grammar_parsed_text_one_yes ,
+ grammar_parsed_text_two_yes ,
+ grammar_unparsed_text_yes = install(space_nl, spacing_nl, anything_nl)
-- maybe we will add settings to result as well
diff --git a/Master/texmf-dist/tex/context/base/mkiv/lxml-tex.lua b/Master/texmf-dist/tex/context/base/mkiv/lxml-tex.lua
index ae3edba5613..9ab8cafc60a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/lxml-tex.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/lxml-tex.lua
@@ -92,7 +92,7 @@ local forceraw = false
local p_texescape = patterns.texescape
-local tokenizedcs = context.tokenizedcs
+local tokenizedxmlw = context.tokenizedcs and context.tokenizedcs.xmlw
directives.enable("xml.path.keeplastmatch")
@@ -337,7 +337,7 @@ do
noferrors = noferrors + 1
errors[filename] = errors[filename] + 1
end
- errorhandler(filename)
+ errorhandler(message) -- (filename)
end
logs.registerfinalactions(function()
@@ -501,15 +501,14 @@ function lxml.checkindex(name)
return root and root.index or 0
end
-if tokenizedcs then
+if tokenizedxmlw then
function lxml.withindex(name,n,command) -- will change as name is always there now
local i, p = lpegmatch(splitter,n)
- local w = tokenizedcs.xmlw
if p then
- contextsprint(ctxcatcodes,w,"{",command,"}{",n,"}")
+ contextsprint(ctxcatcodes,tokenizedxmlw,"{",command,"}{",n,"}")
else
- contextsprint(ctxcatcodes,w,"{",command,"}{",name,"::",n,"}")
+ contextsprint(ctxcatcodes,tokenizedxmlw,"{",command,"}{",name,"::",n,"}")
end
end
@@ -770,7 +769,7 @@ end)
local tex_element
-if tokenizedcs then
+if tokenizedxmlw then
tex_element = function(e,handlers)
if setfilename then
@@ -788,16 +787,15 @@ if tokenizedcs then
local tc = type(command)
if tc == "string" then
local rootname, ix = e.name, e.ix
- local w = tokenizedcs.xmlw
if rootname then
if not ix then
addindex(rootname,false,true)
ix = e.ix
end
- contextsprint(ctxcatcodes,w,"{",command,"}{",rootname,"::",ix,"}")
+ contextsprint(ctxcatcodes,tokenizedxmlw,"{",command,"}{",rootname,"::",ix,"}")
else
report_lxml("fatal error: no index for %a",command)
- contextsprint(ctxcatcodes,w,"{",command,"}{",ix or 0,"}")
+ contextsprint(ctxcatcodes,tokenizedxmlw,"{",command,"}{",ix or 0,"}")
end
elseif tc == "function" then
command(e)
@@ -1488,11 +1486,10 @@ end
local command
-if tokenizedcs then
+if tokenizedxmlw then
command = function(collected,cmd,otherwise)
local n = collected and #collected
- local w = tokenizedcs.xmlw
if n and n > 0 then
local wildcard = find(cmd,"*",1,true)
for c=1,n do -- maybe optimize for n=1
@@ -1506,13 +1503,13 @@ if tokenizedcs then
if not ix or not name then
report_lxml("no valid node index for element %a using command %s",name or "?",cmd)
elseif wildcard then
- contextsprint(ctxcatcodes,w,"{",(gsub(cmd,"%*",e.tg)),"}{",name,"::",ix,"}")
+ contextsprint(ctxcatcodes,tokenizedxmlw,"{",(gsub(cmd,"%*",e.tg)),"}{",name,"::",ix,"}")
else
- contextsprint(ctxcatcodes,w,"{",cmd,"}{",name,"::",ix,"}")
+ contextsprint(ctxcatcodes,tokenizedxmlw,"{",cmd,"}{",name,"::",ix,"}")
end
end
elseif otherwise then
- contextsprint(ctxcatcodes,w,"{",otherwise,"}{#1}")
+ contextsprint(ctxcatcodes,tokenizedxmlw,"{",otherwise,"}{#1}")
end
end
@@ -2215,16 +2212,15 @@ function lxml.direct(id)
end
end
-if tokenizedcs then
+if tokenizedxmlw then
function lxml.command(id,pattern,cmd)
local i, p = getid(id,true)
- local collected = xmlapplylpath(getid(i),pattern)
+ local collected = xmlapplylpath(getid(i),pattern) -- again getid?
if collected then
local nc = #collected
if nc > 0 then
local rootname = p or i.name
- local w = tokenizedcs.xmlw
for c=1,nc do
local e = collected[c]
local ix = e.ix
@@ -2232,7 +2228,7 @@ if tokenizedcs then
addindex(rootname,false,true)
ix = e.ix
end
- contextsprint(ctxcatcodes,w,"{",cmd,"}{",rootname,"::",ix,"}")
+ contextsprint(ctxcatcodes,tokenizedxmlw,"{",cmd,"}{",rootname,"::",ix,"}")
end
end
end
@@ -2242,7 +2238,7 @@ else
function lxml.command(id,pattern,cmd)
local i, p = getid(id,true)
- local collected = xmlapplylpath(getid(i),pattern)
+ local collected = xmlapplylpath(getid(i),pattern) -- again getid?
if collected then
local nc = #collected
if nc > 0 then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/m-fonts-plugins.mkiv b/Master/texmf-dist/tex/context/base/mkiv/m-fonts-plugins.mkiv
index 154e4780427..255a2ac7217 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/m-fonts-plugins.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/m-fonts-plugins.mkiv
@@ -193,6 +193,7 @@
[mode=plug,
features=harfbuzz,
% method=binary,
+% method=internal,
script=arab,language=dflt,
% ccmp=yes,
% init=yes,medi=yes,fina=yes,isol=yes,
diff --git a/Master/texmf-dist/tex/context/base/mkiv/m-gnuplot.mkxl b/Master/texmf-dist/tex/context/base/mkiv/m-gnuplot.mkxl
new file mode 100644
index 00000000000..2077b174182
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/m-gnuplot.mkxl
@@ -0,0 +1,97 @@
+%D \module
+%D [ file=m-gnuplot,
+%D version=2020.02.10,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Gnuplot,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is a variant on the \GNUPLOT\ terminal code. At some point (when there is a
+%D reason) I will make a proper environment that can be used for embedded code.
+
+\unexpanded\def\includegnuplotsvgfile[#1]%
+ {\hbox\bgroup
+ \ctxlua{metapost.startsvghashing()}%
+ \includesvgfile[#1]%
+ \ctxlua{metapost.stopsvghashing()}%
+ \egroup}
+
+\startluacode
+
+local modificationtime = lfs.modification
+local longtostring = string.longtostring
+local formatters = string.formatters
+local expandfilename = dir.expandname
+local isfile = lfs.isfile
+
+local runner = sandbox.registerrunner {
+ name = "gnuplot to svg",
+ program = "gnuplot",
+ template = longtostring [[
+ -e "set output '%newname%'; set terminal svg"
+ "%oldname%"
+ ]],
+ checkers = {
+ oldname = "readable",
+ newname = "writable",
+ },
+}
+
+figures.programs.gnuplot = {
+ runner = runner,
+}
+
+local function remap(specification)
+ local oldname = specification.fullname
+ if oldname then
+ local newname = file.replacesuffix(oldname,"svg")
+ local oldtime = modificationtime(oldname) or 0
+ local newtime = modificationtime(newname) or 0
+ if newtime == 0 or oldtime > newtime then
+ runner {
+ newname = expandfilename(newname),
+ oldname = expandfilename(oldname),
+ }
+ end
+ if isfile(newname) then
+ local only = file.nameonly(newname)
+ local name = formatters["svg-%s-inclusion"](only)
+ local code = formatters["\\includegnuplotsvgfile[%s]\\resetbuffer[%s]"](newname,name)
+ buffers.assign(name,code)
+ specification.format = "buffer"
+ specification.fullname = name
+ end
+ end
+ return specification
+end
+
+figures.remappers.gp = { svg = remap }
+
+\stopluacode
+
+\continueifinputfile{m-gnuplot.mkxl}
+
+\startluacode
+io.savedata("m-gnuplot-demo.gp", [[
+set format xy "$%g$"
+
+set title 'This is a plot of $y=\\sin(x)$'
+set xlabel 'This is the $x$ axis'
+set ylabel 'This is the $y$ axis'
+
+plot [0:6.28] [0:1] sin(x)
+]])
+\stopluacode
+
+\starttext
+
+ \externalfigure[m-gnuplot-demo.gp][conversion=svg,width=4cm]
+
+ \externalfigure[m-gnuplot-demo.gp][conversion=svg,width=8cm]
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/mkiv/math-act.lua b/Master/texmf-dist/tex/context/base/mkiv/math-act.lua
index 07ef32746a4..1f0140960fe 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/math-act.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/math-act.lua
@@ -441,7 +441,8 @@ mathematics.tweaks = tweaks
-- helpers
local setmetatableindex = table.setmetatableindex
-local family_font = node.family_font
+
+local getfontoffamily = tex.getfontoffamily
local fontcharacters = fonts.hashes.characters
local extensibles = utilities.storage.allocate()
@@ -512,7 +513,7 @@ setmetatableindex(extensibles,function(extensibles,font)
end)
local function extensiblecode(family,unicode)
- return extensibles[family_font(family or 0)][unicode][1]
+ return extensibles[getfontoffamily(family or 0)][unicode][1]
end
-- left : [head] ...
@@ -522,7 +523,7 @@ end
-- abs(right["start"] - right["end"]) | right.advance | characters[right.glyph].width
local function horizontalcode(family,unicode)
- local font = family_font(family or 0)
+ local font = getfontoffamily(family or 0)
local data = extensibles[font][unicode]
local kind = data[1]
local loffset = 0
diff --git a/Master/texmf-dist/tex/context/base/mkiv/math-ali.mkiv b/Master/texmf-dist/tex/context/base/mkiv/math-ali.mkiv
index ecfac68870f..400326d2691 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/math-ali.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/math-ali.mkiv
@@ -42,7 +42,8 @@
\unexpanded\def\math_eqalign_distance
{\relax
\ifdim\d_math_eqalign_distance>\zeropoint
- \hskip\d_math_eqalign_distance
+ % \hskip\d_math_eqalign_distance
+ \tabskip\d_math_eqalign_distance
\fi
\mathalignmentparameter\c!separator
\relax}
@@ -68,7 +69,7 @@
\def\math_build_eqalign
{\scratchtoks\emptytoks
- \d_math_eqalign_distance\mathalignmentparameter\c!distance
+ \d_math_eqalign_distance\mathalignmentparameter\c!distance\relax
\scratchcounterone\mathalignmentparameter\c!m
\scratchcountertwo\mathalignmentparameter\c!n
\etoksapp\scratchtoks{\the\t_math_align_a}%
@@ -712,6 +713,8 @@
\let\math_cases_NR\math_align_NR_generic
+\installmacrostack\math_cases_NC
+
\unexpanded\def\math_cases_start_indeed[#1]%
{\iffirstargument
\setupcurrentmathcases[#1]%
@@ -724,7 +727,7 @@
\fi
\mathcasesparameter\c!left
\vcenter\bgroup
- \pushmacro\math_cases_NC
+ \push_macro_math_cases_NC
\let\endmath\relax
\let\NC\math_cases_NC_zero
\let\MC\math_cases_MC_zero
@@ -743,7 +746,7 @@
\hfil
\aligntab
\hskip\mathcasesparameter\c!distance\relax
- \popmacro\math_cases_NC
+ \pop_macro_math_cases_NC
\math_cases_strut % looks better
\alignmark\alignmark
\hfil
@@ -968,9 +971,16 @@
{\c_math_eqalign_column\zerocount
\rawprocesscommacommand[\mathmatrixparameter\c!align]\math_matrix_set_columns_step}
+\newcount\c_math_eqalign_column_saved
+\newcount\c_math_eqalign_first_saved
+
+% \installglobalmacrostack\c_math_matrix_first
+
\unexpanded\def\math_matrix_start#1%
{\begingroup
- \globalpushmacro\c_math_matrix_first
+ \globalpushmacro\c_math_matrix_first % hm, does that work?
+ \c_math_eqalign_column_saved\c_math_eqalign_column
+ \c_math_eqalign_first_saved \c_math_eqalign_first
\edef\currentmathmatrix{#1}%
\dosingleempty\math_matrix_start_indeed}
@@ -985,6 +995,8 @@
\def\math_matrix_stop
{\math_matrix_stop_processing
+ \global\c_math_eqalign_first\c_math_eqalign_first_saved
+ \global\c_math_eqalign_column\c_math_eqalign_column_saved
\globalpopmacro\c_math_matrix_first
\endgroup}
@@ -1457,7 +1469,7 @@
\ifcase\mathraggedstatus\or\or\hfill\or\hfill\fi
\else
\ifconditional\c_strc_math_indent
- \ifdim\d_strc_math_indent=\zeropoint\else
+ \ifzeropt\d_strc_math_indent\else
\hangafter\plusone
\hangindent\d_strc_math_indent
\fi
@@ -1817,31 +1829,31 @@
\or
\bgroup \hsize\displaywidth
\fi
- \ifcase\mathnumberstatus
+ \ifcase\mathnumberstatus
+ \strc_math_flush_box
+ \or % status 1
+ \ifcase\c_strc_math_number_location
\strc_math_flush_box
- \or % status 1
- \ifcase\c_strc_math_number_location
- \strc_math_flush_box
- \or % number left
- \ifzeropt\wd\b_strc_formulas_number
- \strc_math_flush_number_no
- \else
- \strc_math_flush_number_left
- \fi
- \else % number right
- \ifzeropt\wd\b_strc_formulas_number
- \strc_math_flush_number_no
- \else
- \strc_math_flush_number_right
- \fi
+ \or % number left
+ \ifzeropt\wd\b_strc_formulas_number
+ \strc_math_flush_number_no
+ \else
+ \strc_math_flush_number_left
+ \fi
+ \else % number right
+ \ifzeropt\wd\b_strc_formulas_number
+ \strc_math_flush_number_no
+ \else
+ \strc_math_flush_number_right
\fi
- \or % status 2
- \hskip\d_math_number_correction % probably no longer used
- \strc_math_flush_box
- \hss
- \else
- \strc_math_flush_box
\fi
+ \or % status 2
+ \hskip\d_math_number_correction % probably no longer used
+ \strc_math_flush_box
+ \hss
+ \else
+ \strc_math_flush_box
+ \fi
\ifcase\c_strc_math_vertical
\or
\or
@@ -1864,22 +1876,22 @@
% 4=disable 6=only when no spaces
\mathsurroundskip\mathematicsparameter\c!textdistance\relax
\ifzeropt\mathsurroundskip
- \ifdim\gluestretch\mathsurroundskip=\zeropoint
- \ifdim\glueshrink\mathsurroundskip=\zeropoint
- \mathsurroundmode\plussix
+ \ifzeropt\gluestretch\mathsurroundskip
+ \ifzeropt\glueshrink\mathsurroundskip
+ \mathsurroundmode\plussix
\else
- \mathsurroundskip\zeropoint
- \mathsurroundmode\plusfour
+ \mathsurroundskip\zeropoint
+ \mathsurroundmode\plusfour
\fi
- \else
+ \else
\mathsurroundmode\plussix
- \fi
+ \fi
\else
- \mathsurroundmode\plussix
+ \mathsurroundmode\plussix
\fi
\else
- \mathsurroundmode\plusfour
- \mathsurroundskip\zeropoint
+ \mathsurroundmode\plusfour
+ \mathsurroundskip\zeropoint
\fi
\to \everymathematics
diff --git a/Master/texmf-dist/tex/context/base/mkiv/math-ext.lua b/Master/texmf-dist/tex/context/base/mkiv/math-ext.lua
index b923853f4a6..762f1f904ed 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/math-ext.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/math-ext.lua
@@ -6,7 +6,6 @@ if not modules then modules = { } end modules ['math-ext'] = {
license = "see context related readme files"
}
-local rawget = rawget
local basename = file.basename
local sortedhash = table.sortedhash
diff --git a/Master/texmf-dist/tex/context/base/mkiv/math-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/math-ini.lua
index 7a841970209..0af9a2121ba 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/math-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/math-ini.lua
@@ -319,7 +319,7 @@ function mathematics.define(family)
if mathclass then
local name = character.mathname
if name then
- report_math("fatal error, conlicting mathclass and mathspec for %C",unicode)
+ report_math("fatal error, conflicting mathclass and mathspec for %C",unicode)
os.exit()
else
local class = classes[mathclass] or mathclass -- no real checks needed
diff --git a/Master/texmf-dist/tex/context/base/mkiv/math-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/math-ini.mkiv
index 3c27bbf07f1..caddfca531d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/math-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/math-ini.mkiv
@@ -129,6 +129,10 @@
\mathflattenmode 31
+\ifdefined\ordlimits\else
+ \let\ordlimits\limits
+\fi
+
\appendtoks
\attribute\mathmodeattribute\plusone
\to \everydisplay
@@ -254,11 +258,25 @@
\def\math_m_yes_math[#1]#2%
{#2}
+% \def\math_m_yes_text[#1]%
+% {\begingroup
+% \doifassignmentelse{#1}%
+% {\setupcurrentmathematics[#1]}%
+% {\edef\currentmathematics{#1}}% check for valid
+% \edef\p_openup{\mathematicsparameter\c!openup}%
+% \ifx\p_openup\v!yes
+% \expandafter\math_m_yes_text_openedup
+% \else
+% \expandafter\math_m_yes_text_normal
+% \fi}
+
\def\math_m_yes_text[#1]%
{\begingroup
- \doifassignmentelse{#1}%
- {\setupcurrentmathematics[#1]}%
- {\edef\currentmathematics{#1}}% check for valid
+ \ifcondition\validassignment{#1}%
+ \setupcurrentmathematics[#1]%
+ \else
+ \edef\currentmathematics{#1}% check for valid
+ \fi
\edef\p_openup{\mathematicsparameter\c!openup}%
\ifx\p_openup\v!yes
\expandafter\math_m_yes_text_openedup
@@ -1474,7 +1492,7 @@
\to \everymathematics
\setupmathematics
- [\s!collapsing=3] % mathlist wins over specials
+ [\s!collapsing=\v!none] % was 3 : mathlist wins over specials
%D Math italics (experiment)
@@ -2768,7 +2786,7 @@
\def\checkeddisplaywidth % hsize if zero
{\dimexpr
- \ifdim\displaywidth=\zeropoint
+ \ifzeropt\displaywidth
\hsize
\else
\displaywidth
@@ -2777,7 +2795,7 @@
\def\maximizeddisplaywidth % larger than zero but within hsize
{\dimexpr
- \ifdim\displaywidth=\zeropoint
+ \ifzeropt\displaywidth
\hsize
\else\ifdim\displaywidth>\hsize
\hsize
diff --git a/Master/texmf-dist/tex/context/base/mkiv/math-noa.lua b/Master/texmf-dist/tex/context/base/mkiv/math-noa.lua
index 37676722740..f53410b18cd 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/math-noa.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/math-noa.lua
@@ -28,7 +28,7 @@ local utfchar, utfbyte = utf.char, utf.byte
local formatters, gmatch = string.formatters, string.gmatch
local sortedhash = table.sortedhash
local insert, remove = table.insert, table.remove
-local div = math.div
+local div, round = math.div, math.round
local bor, band = bit32.bor, bit32.band
local fonts = fonts
@@ -136,8 +136,6 @@ local set_visual = nuts.setvisual
local mlist_to_hlist = nuts.mlist_to_hlist
-local font_of_family = node.family_font
-
local new_kern = nodepool.kern
local new_submlist = nodepool.submlist
local new_noad = nodepool.noad
@@ -152,6 +150,7 @@ local fontitalics = fonthashes.italics
local variables = interfaces.variables
local texsetattribute = tex.setattribute
local texgetattribute = tex.getattribute
+local getfontoffamily = tex.getfontoffamily
local unsetvalue = attributes.unsetvalue
local implement = interfaces.implement
@@ -177,15 +176,19 @@ local noadcodes = nodes.noadcodes
local fencecodes = nodes.fencecodes
local ordnoad_code = noadcodes.ord
-local relnode_code = noadcodes.rel
+local opdisplaylimitsnoad_code = noadcodes.opdisplaylimits
+local oplimitsnoad_code = noadcodes.oplimits
+local opnolimitsnoad_code = noadcodes.opnolimits
local binnoad_code = noadcodes.bin
+local relnode_code = noadcodes.rel
local opennoad_code = noadcodes.open
local closenoad_code = noadcodes.close
local punctnoad_code = noadcodes.punct
-local opdisplaylimitsnoad_code = noadcodes.opdisplaylimits
-local oplimitsnoad_code = noadcodes.oplimits
-local opnolimitsnoad_code = noadcodes.opnolimits
local innernoad_code = noadcodes.inner
+local undernoad_code = noadcodes.under
+local overnoad_code = noadcodes.over
+local vcenternoad_code = noadcodes.vcenter
+local ordlimitsnoad_code = noadcodes.ordlimits or oplimitsnoad_code
local noad_code = nodecodes.noad -- attr nucleus sub sup
local accent_code = nodecodes.accent -- attr nucleus sub sup accent
@@ -197,6 +200,7 @@ local mathchar_code = nodecodes.mathchar -- attr fam char
local mathtextchar_code = nodecodes.mathtextchar -- attr fam char
local delim_code = nodecodes.delim -- attr small_fam small_char large_fam large_char
----- style_code = nodecodes.style -- attr style
+----- parameter_code = nodecodes.parameter -- attr style
local math_choice = nodecodes.choice -- attr display text script scriptscript
local fence_code = nodecodes.fence -- attr subtype
@@ -299,6 +303,8 @@ local function process(start,what,n,parent)
noad = getfield(start,"bot_accent") if noad then process(noad,what,n,start) end -- list
-- elseif id == style_code then
-- -- has a next
+ -- elseif id == parameter_code then
+ -- -- has a next
-- else
-- -- glue, penalty, etc
end
@@ -505,7 +511,7 @@ do
report_families("no bold replacement for %C, family %s with remap %s becomes %s with remap %s",char,a,familymap[a],newa,familymap[newa])
end
setfam(pointer,newa)
- elseif not fontcharacters[font_of_family(newa)][bold] then
+ elseif not fontcharacters[getfontoffamily(newa)][bold] then
if trace_families then
report_families("no bold character for %C, family %s with remap %s becomes %s with remap %s",char,a,familymap[a],newa,familymap[newa])
end
@@ -522,7 +528,7 @@ do
end
else
local char = getchar(pointer)
- if not fontcharacters[font_of_family(a)][char] then
+ if not fontcharacters[getfontoffamily(a)][char] then
if trace_families then
report_families("no bold replacement for %C",char)
end
@@ -546,14 +552,14 @@ do
a = a - 3
end
local char = getfield(pointer,"small_char")
- local okay = fontcharacters[font_of_family(a)][char]
+ local okay = fontcharacters[getfontoffamily(a)][char]
if okay then
setfield(pointer,"small_fam",a)
elseif a > 2 then
setfield(pointer,"small_fam",a-3)
end
local char = getfield(pointer,"large_char")
- local okay = fontcharacters[font_of_family(a)][char]
+ local okay = fontcharacters[getfontoffamily(a)][char]
if okay then
setfield(pointer,"large_fam",a)
elseif a > 2 then
@@ -578,7 +584,7 @@ do
-- a = a - 3
-- end
-- local char = getchar(pointer)
- -- local okay = fontcharacters[font_of_family(a)][char]
+ -- local okay = fontcharacters[getfontoffamily(a)][char]
-- if okay then
-- setfam(pointer,a)
-- elseif a > 2 then
@@ -785,7 +791,7 @@ do
local chr = getchar(delimiter)
if chr > 0 then
local fam = getfam(delimiter)
- local id = font_of_family(fam)
+ local id = getfontoffamily(fam)
if id > 0 then
local data = fontdata[id]
local char = mathematics.big(data,chr,size,method)
@@ -835,8 +841,8 @@ do
if chr == dummyfencechar then
chr = 0
end
- setfield(d,"small_char",chr)
- setfield(d,"small_fam",fam)
+ setchar(d,chr)
+ setfam(d,fam)
flush_node(sym)
end
setattrlist(d,char)
@@ -847,100 +853,102 @@ do
return f
end
- -- will become
-
- -- local function makefence(what,char)
- -- local d = new_delimiter() -- todo: attr
- -- local f = new_fence() -- todo: attr
- -- if char then
- -- local sym = getnucleus(char)
- -- local chr = getchar(sym)
- -- local fam = getfam(sym)
- -- if chr == dummyfencechar then
- -- chr = 0
- -- end
- -- setchar(d,chr)
- -- setfam(d,fam)
- -- flush_node(sym)
- -- end
- -- setsubtype(f,what)
- -- setfield(f,"delim",d)
- -- setfield(f,"class",-1) -- tex itself does this, so not fenceclasses[what]
- -- return f
- -- end
-
- local function makelist(noad,f_o,o_next,c_prev,f_c,middle)
+ local function show(where,pointer)
+ print("")
+ local i = 0
+ for n in nuts.traverse(pointer) do
+ i = i + 1
+ print(i,where,nuts.tonode(n))
+ end
+ print("")
+ end
+
+ local function makelist(middle,noad,f_o,o_next,c_prev,f_c)
+-- report_fences(
+-- "middle %s, noad %s, open %s, opennext %s, closeprev %s, close %s",
+-- middle or "?",
+-- noad or "?",
+-- f_o or "?",
+-- o_next or "?",
+-- c_prev or "?",
+-- f_c or "?"
+-- )
local list = new_submlist()
- setlist(list,f_o)
setsubtype(noad,innernoad_code)
setnucleus(noad,list)
- setlink(f_o,o_next)
- setlink(c_prev,f_c)
+ setlist(list,f_o)
+ setlink(f_o,o_next) -- prev of list is nil
+ setlink(c_prev,f_c) -- next of list is nil
+-- show("list",f_o)
if middle and next(middle) then
local prev = f_o
local current = o_next
while current ~= f_c do
- local m = middle[current]
- if m then
- local next = getnext(current)
+ local midl = middle[current]
+ local next = getnext(current)
+ if midl then
local fence = makefence(middlefence_code,current)
setnucleus(current)
flush_node(current)
middle[current] = nil
-- replace_node
setlink(prev,fence,next)
- prev = fence
- current = next
+ prev = fence
else
prev = current
- current = getnext(current)
end
+ current = next
end
end
+ return noad
end
+ -- relinking is now somewhat overdone
+
local function convert_both(open,close,middle)
- local o_prev, o_next = getboth(open)
- local c_prev, c_next = getboth(close)
+ local o_next = getnext(open)
if o_next == close then
return close
else
+ local c_prev, c_next = getboth(close)
local f_o = makefence(leftfence_code,open)
local f_c = makefence(rightfence_code,close)
- makelist(open,f_o,o_next,c_prev,f_c,middle)
+ makelist(middle,open,f_o,o_next,c_prev,f_c)
setnucleus(close)
flush_node(close)
- if c_next then
- setprev(c_next,open)
- end
- setnext(open,c_next)
+ -- open is now a list
+ setlink(open,c_next)
return open
end
end
- local function convert_open(open,last,middle)
+ local function convert_open(open,last,middle) -- last is really last (final case)
local f_o = makefence(leftfence_code,open)
local f_c = makefence(rightfence_code)
- local o_prev, o_next = getboth(open)
- local l_prev, l_next = getboth(last)
- makelist(open,f_o,o_next,last,f_c,middle)
- if l_next then
- setprev(l_next,open)
- end
- setnext(open,l_next)
+ local o_next = getnext(open)
+ makelist(middle,open,f_o,o_next,last,nil)
+ -- open is now a list
+ setlink(open,l_next)
return open
end
- local function convert_close(close,first,middle)
+ local function convert_close(first,close,middle)
local f_o = makefence(leftfence_code)
local f_c = makefence(rightfence_code,close)
local c_prev = getprev(close)
- makelist(close,f_o,first,c_prev,f_c,middle)
+ local f_next = getnext(first)
+ makelist(middle, close, f_o,f_next,c_prev,f_c)
+ -- close is now a list
+ if c_prev ~= first then
+ setlink(first,close)
+ end
return close
end
local stacks = setmetatableindex("table")
+ -- 1=open 2=close 3=middle 4=both
+
local function processfences(pointer,n,parent)
local current = pointer
local last = pointer
@@ -950,47 +958,75 @@ do
local stack = nil
local middle = nil -- todo: use properties
while current do
+-- show("before",pointer)
local id = getid(current)
if id == noad_code then
local a = getattr(current,a_autofence)
if a and a > 0 then
local stack = stacks[n]
- setattr(current,a_autofence,0)
- if a == 1 or (a == 4 and (not stack or #stack == 0)) then
+ setattr(current,a_autofence,0) -- hm, better use a property
+ local level = #stack
+ if a == 1 then
if trace_fences then
- report_fences("%2i: pushing open on stack",n)
+ report_fences("%2i: level %i, handling %s, action %s",n,level,"open","open")
end
insert(stack,current)
- elseif a == 2 or a == 4 then
+ elseif a == 2 then
local open = remove(stack)
if open then
if trace_fences then
- report_fences("%2i: handling %s, stack depth %i",n,"both",#stack+1)
+ report_fences("%2i: level %i, handling %s, action %s",n,level,"close","both")
end
current = convert_both(open,current,middle)
elseif current == start then
- -- skip
+ if trace_fences then
+ report_fences("%2i: level %i, handling %s, action %s",n,level,"close","skip")
+ end
else
if trace_fences then
- report_fences("%2i: handling %s, stack depth %i",n,"close",#stack+1)
+ report_fences("%2i: level %i, handling %s, action %s",n,level,"close","close")
end
- current = convert_close(current,initial,middle)
+ current = convert_close(initial,current,middle)
if not parent then
initial = current
end
end
- if trace_fences then
- report_fences("%2i: popping close from stack",n)
- end
elseif a == 3 then
if trace_fences then
- report_fences("%2i: registering middle",n)
+ report_fences("%2i: level %i, handling %s, action %s",n,level,"middle","middle")
end
if middle then
middle[current] = last
else
middle = { [current] = last }
end
+ elseif a == 4 then
+ if not stack or #stack == 0 then
+ if trace_fences then
+ report_fences("%2i: level %i, handling %s, action %s",n,level,"both","open")
+ end
+ insert(stack,current)
+ else
+ local open = remove(stack)
+ if open then
+ if trace_fences then
+ report_fences("%2i: level %i, handling %s, action %s",n,level,"both","both")
+ end
+ current = convert_both(open,current,middle)
+ elseif current == start then
+ if trace_fences then
+ report_fences("%2i: level %i, handling %s, action %s",n,level,"both","skip")
+ end
+ else
+ if trace_fences then
+ report_fences("%2i: level %i, handling %s, action %s",n,level,"both","close")
+ end
+ current = convert_close(initial,current,middle)
+ if not parent then
+ initial = current
+ end
+ end
+ end
end
done = true
else
@@ -1000,6 +1036,7 @@ do
-- next at current level
processstep(current,processfences,n,id)
end
+-- show("after",pointer)
last = current
current = getnext(current)
end
@@ -1007,16 +1044,14 @@ do
local stack = stacks[n]
local s = #stack
if s > 0 then
- if trace_fences then
- report_fences("%2i: handling %s stack levels",n,s)
- end
for i=1,s do
local open = remove(stack)
if trace_fences then
- report_fences("%2i: handling %s, stack depth %i",n,"open",#stack)
+ report_fences("%2i: level %i, handling %s, action %s",n,#stack,"flush","open")
end
last = convert_open(open,last,middle)
end
+-- show("done",pointer)
end
end
end
@@ -1326,7 +1361,7 @@ do
local fontresources = fonts.hashes.resources
local function getalternate(fam,tag,current)
- local resources = fontresources[font_of_family(fam)]
+ local resources = fontresources[getfontoffamily(fam)]
local attribute = unsetvalue
if resources then
local mathalternates = resources.mathalternates
@@ -1557,6 +1592,7 @@ do
else
correction = correction - 100
end
+ correction = round(correction)
setattr(pointer,a_mathitalics,correction)
setattr(parent,a_mathitalics,correction)
return -- so no reset later on
@@ -1714,14 +1750,19 @@ do
local mathlists = characters.mathlists
local validpair = {
[ordnoad_code] = true,
- [relnode_code] = true,
+ [opdisplaylimitsnoad_code] = true,
+ [oplimitsnoad_code] = true,
+ [opnolimitsnoad_code] = true,
[binnoad_code] = true, -- new
+ [relnode_code] = true,
[opennoad_code] = true, -- new
[closenoad_code] = true, -- new
[punctnoad_code] = true, -- new
- [opdisplaylimitsnoad_code] = true,
- [oplimitsnoad_code] = true,
- [opnolimitsnoad_code] = true,
+ [innernoad_code] = false,
+ [undernoad_code] = false,
+ [overnoad_code] = false,
+ [vcenternoad_code] = false,
+ [ordlimitsnoad_code] = true,
}
local reported = setmetatableindex("table")
@@ -2043,6 +2084,7 @@ do
-- [opdisplaylimitsnoad_code] = "",
-- [oplimitsnoad_code] = "",
-- [opnolimitsnoad_code] = "",
+ -- [ordlimitsnoad_code] = "",
-- [innernoad_code = "",
-- [undernoad_code] = "",
-- [overnoad_code] = "",
diff --git a/Master/texmf-dist/tex/context/base/mkiv/math-stc.mkvi b/Master/texmf-dist/tex/context/base/mkiv/math-stc.mkvi
index 92325d0afd0..8048bf92364 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/math-stc.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/math-stc.mkvi
@@ -86,11 +86,19 @@
\def\math_stackers_regular
{\mathstylehbox{\usemathstackerscolorparameter\c!color
- \Umathaccent\fam\zerocount\scratchunicode{\hskip\scratchwidth}}}
+ \hskip\d_math_stackers_offset_l
+ \Umathaccent\fam\zerocount\scratchunicode
+ {\hskip\dimexpr\scratchwidth-\d_math_stackers_offset_l-\d_math_stackers_offset_r}%
+ \hskip\d_math_stackers_offset_r
+ }}
\def\math_stackers_stretch % we don't have that one yet
{\mathstylehbox{\usemathstackerscolorparameter\c!color
- \Umathaccent\fam\zerocount\scratchunicode{\hskip\hsize}}}
+ \hskip\d_math_stackers_offset_l
+ \Umathaccent\fam\zerocount\scratchunicode
+ {\hskip\dimexpr\hsize-\d_math_stackers_offset_l-\d_math_stackers_offset_r}%
+ \hskip\d_math_stackers_offset_r
+ }}
% these delimiters are a unuseable as they don't center for small arguments:
%
@@ -499,7 +507,7 @@
\dostoptagged
\mathstackersparameter\c!right\relax
\endgroup}
- %\math_stackers_start_group}
+ %\math_stackers_stop_group}
\unexpanded\def\definemathextensible
{\dotripleempty\math_stackers_define_normal}
@@ -566,14 +574,33 @@
\edef\currentmathstackers{#category}%
\edef\p_limits{\mathstackersparameter\c!mathlimits}%
\ifx\p_limits\v!yes
- \def\math_stackers_stop_group{\egroup\endgroup\limits}%
+ \def\math_stackers_stop_group{\egroup\endgroup\ordlimits}%
\mathop\bgroup
\else
\let\math_stackers_stop_group\endgroup
\fi}
-\unexpanded\def\math_stackers_make_double#top#bottom#category#codepoint#codeextra#text%
+\newconstant\c_math_stackers_top
+\newconstant\c_math_stackers_bottom
+\newconstant\c_math_stackers_codepoint
+\newconstant\c_math_stackers_extracode
+\newdimen \d_math_stackers_offset_l
+\newdimen \d_math_stackers_offset_r
+
+\setupmathstackers[lt=\zeropoint,rt=\zeropoint,lb=\zeropoint,rb=\zeropoint]
+
+\unexpanded\def\math_stackers_make_double#top#bottom#category#codepoint#codeextra%
{\math_stackers_start_group{#category}%
+ \c_math_stackers_top #top\relax
+ \c_math_stackers_bottom #bottom\relax
+ \c_math_stackers_codepoint#codepoint\relax
+ \c_math_stackers_extracode#codeextra\relax
+ \dosingleempty\math_stackers_make_double_indeed}
+
+\unexpanded\def\math_stackers_make_double_indeed[#settings]#text%
+ {\iffirstargument
+ \setupcurrentmathstackers[#settings]%
+ \fi
\mathstackersparameter\c!left\relax
\dostarttagged\t!mathstacker\currentmathstackers
\ifmmode\math_class_by_parameter\mathstackersparameter\else\dontleavehmode\fi
@@ -587,7 +614,7 @@
\scratchleftoffset \zeropoint
\scratchrightoffset\zeropoint
%
- \math_stackers_check_unicode{#codepoint}%
+ \math_stackers_check_unicode\c_math_stackers_codepoint
%
\ifx\math_stackers_middle\empty
\setbox\scratchboxthree\emptyhbox
@@ -602,24 +629,37 @@
\fi
\advance\scratchwidth2\scratchhoffset
%
+ %\scratchunicode\c_math_stackers_codepoint
+ \ifcase\c_math_stackers_bottom
+ \d_math_stackers_offset_l\mathstackersparameter{lt}%
+ \d_math_stackers_offset_r\mathstackersparameter{rt}%
+ \else\ifcase\c_math_stackers_top
+ \d_math_stackers_offset_l\mathstackersparameter{lb}%
+ \d_math_stackers_offset_r\mathstackersparameter{rb}%
+ \else
+ \d_math_stackers_offset_l\mathstackersparameter{lt}%
+ \d_math_stackers_offset_r\mathstackersparameter{rt}%
+ \fi\fi
\setbox\scratchboxtwo\csname\??mathstackersalternative\p_alternative\endcsname
\setbox\scratchboxthree\hpack to \scratchwidth{\hss\box\scratchboxthree\hss}%
%
- \scratchunicode#codeextra\relax
- \ifcase\scratchunicode\else
+ \ifcase\c_math_stackers_extracode\else
+ \scratchunicode\c_math_stackers_extracode
+ \d_math_stackers_offset_l\mathstackersparameter{lb}%
+ \d_math_stackers_offset_r\mathstackersparameter{rb}%
\setbox\scratchboxone\csname\??mathstackersalternative\p_alternative\endcsname
\fi
%
\math_stackers_normalize_three
% analysis
- \ifcase#bottom\relax
- \ifcase#top\relax
+ \ifcase\c_math_stackers_bottom
+ \ifcase\c_math_stackers_top
\dosettagproperty\s!subtype\t!munderover
\else
\dosettagproperty\s!subtype\t!mover
\fi
\else
- \ifcase#top\relax
+ \ifcase\c_math_stackers_top
\dosettagproperty\s!subtype\t!munder
\else
% brrr
@@ -633,7 +673,7 @@
\math_stackers_stop_tagged
%
\ifdim\htdp\scratchboxtwo>\zeropoint
- \ifcase#bottom\else
+ \ifcase\c_math_stackers_bottom\else
\kern-\scratchwidth
% under
\math_stackers_start_tagged_bot
@@ -643,7 +683,7 @@
+\ht\scratchboxtwo
+\mathstackersparameter\c!distance % was \c!voffset
\relax
- \ifcase#top\relax
+ \ifcase\c_math_stackers_top
\box\scratchboxtwo
\else
\box\scratchboxone
@@ -651,7 +691,7 @@
\egroup
\math_stackers_stop_tagged
\fi
- \ifcase#top\else
+ \ifcase\c_math_stackers_top\else
\kern-\scratchwidth
% over
\math_stackers_start_tagged_top
@@ -665,7 +705,6 @@
\egroup
\math_stackers_stop_tagged
\fi
- %
\fi}%
\dostoptagged
\mathstackersparameter\c!right\relax
@@ -696,10 +735,6 @@
\setuevalue{#1}{\math_stackers_make_double\plusone \plusone\noexpand\currentmathstackers{\number#2}{\number#3}}%
\fi}
-\unexpanded\def\mathover {\begingroup\dosingleempty\math_stackers_handle_over }
-\unexpanded\def\mathunder {\begingroup\dosingleempty\math_stackers_handle_under }
-\unexpanded\def\mathdouble{\begingroup\dodoubleempty\math_stackers_handle_double}
-
\unexpanded\def\definemathover {\dotripleargument \math_stackers_define_over }
\unexpanded\def\definemathunder {\dotripleargument \math_stackers_define_under }
\unexpanded\def\definemathdouble{\doquadrupleargument\math_stackers_define_double}
@@ -713,29 +748,41 @@
\def\math_stackers_define_double[#category][#command][#topcode][#bottomcode]%
{\setuvalue{#command}{\math_stackers_handle_direct\plusone\plusone{#category}{#topcode}{#bottomcode}}}
-\unexpanded\def\mathover {\begingroup\dosingleempty\math_stackers_handle_over }
-\unexpanded\def\mathunder {\begingroup\dosingleempty\math_stackers_handle_under }
-\unexpanded\def\mathdouble{\begingroup\dosingleempty\math_stackers_handle_double}
+\unexpanded\def\mathover {\begingroup\dodoubleempty\math_stackers_handle_over }
+\unexpanded\def\mathunder {\begingroup\dodoubleempty\math_stackers_handle_under }
+\unexpanded\def\mathdouble{\begingroup\dodoubleempty\math_stackers_handle_double}
-\def\math_stackers_handle_over[#category]#topcode#text%
- {\math_stackers_make_double\plusone\zerocount
- {\iffirstargument#category\else\v!top\fi}%
+\def\math_stackers_handle_over[#category][#settings]#topcode#text%
+ {\edef\currentmathstackers{\iffirstargument#category\else\v!top\fi}%
+ \ifsecondargument
+ \setupcurrentmathstackers[#settings]%
+ \fi
+ \math_stackers_make_double\plusone\zerocount
+ {\currentmathstackers}%
{#topcode}%
{0}%
{#text}%
\endgroup}
-\def\math_stackers_handle_under[#category]#bottomcode#text%
- {\math_stackers_make_double\zerocount\plusone
- {\iffirstargument#category\else\v!bottom\fi}%
+\def\math_stackers_handle_under[#category][#settings]#bottomcode#text%
+ {\edef\currentmathstackers{\iffirstargument#category\else\v!bottom\fi}%
+ \ifsecondargument
+ \setupcurrentmathstackers[#settings]%
+ \fi
+ \math_stackers_make_double\zerocount\plusone
+ {\currentmathstackers}%
{#bottomcode}%
{0}%
{#text}%
\endgroup}
-\def\math_stackers_handle_double[#category]#topcode#bottomcode#text%
- {\math_stackers_make_double\plusone\plusone
- {\iffirstargument#category\else\v!both\fi}%
+\def\math_stackers_handle_double[#category][#settings]#topcode#bottomcode#text%
+ {\edef\currentmathstackers{\iffirstargument#category\else\v!both\fi}%
+ \ifsecondargument
+ \setupcurrentmathstackers[#settings]%
+ \fi
+ \math_stackers_make_double\plusone\plusone
+ {\currentmathstackers}%
{#topcode}%
{#bottomcode}%
{#text}%
@@ -1189,39 +1236,39 @@
% alternatively we can move the original to FE*
-\definemathoverextensible [vfenced] [overbar] ["FE33E] % ["203E]
-\definemathunderextensible [vfenced] [underbar] ["FE33F] % ["203E]
-\definemathdoubleextensible [vfenced] [doublebar] ["FE33E] ["FE33F]
+\definemathoverextensible [\v!vfenced] [overbar] ["FE33E] % ["203E]
+\definemathunderextensible [\v!vfenced] [underbar] ["FE33F] % ["203E]
+\definemathdoubleextensible [\v!vfenced] [doublebar] ["FE33E] ["FE33F]
-\definemathoverextensible [vfenced] [overbrace] ["FE3DE] % ["023DE]
-\definemathunderextensible [vfenced] [underbrace] ["FE3DF] % ["023DF]
-\definemathdoubleextensible [vfenced] [doublebrace] ["FE3DE] ["FE3DF]
+\definemathoverextensible [\v!vfenced] [overbrace] ["FE3DE] % ["023DE]
+\definemathunderextensible [\v!vfenced] [underbrace] ["FE3DF] % ["023DF]
+\definemathdoubleextensible [\v!vfenced] [doublebrace] ["FE3DE] ["FE3DF]
-\definemathoverextensible [vfenced] [overparent] ["FE3DC] % ["023DC]
-\definemathunderextensible [vfenced] [underparent] ["FE3DD] % ["023DD]
-\definemathdoubleextensible [vfenced] [doubleparent] ["FE3DC] ["FE3DD]
+\definemathoverextensible [\v!vfenced] [overparent] ["FE3DC] % ["023DC]
+\definemathunderextensible [\v!vfenced] [underparent] ["FE3DD] % ["023DD]
+\definemathdoubleextensible [\v!vfenced] [doubleparent] ["FE3DC] ["FE3DD]
-\definemathoverextensible [vfenced] [overbracket] ["FE3B4] % ["023B4]
-\definemathunderextensible [vfenced] [underbracket] ["FE3B5] % ["023B5]
-\definemathdoubleextensible [vfenced] [doublebracket] ["FE3B4] ["FE3B5]
+\definemathoverextensible [\v!vfenced] [overbracket] ["FE3B4] % ["023B4]
+\definemathunderextensible [\v!vfenced] [underbracket] ["FE3B5] % ["023B5]
+\definemathdoubleextensible [\v!vfenced] [doublebracket] ["FE3B4] ["FE3B5]
% \unexpanded\def\mathopwithlimits#1#2{\mathop{#1{#2}}\limits}
%D For mathml:
-\definemathdoubleextensible [both] [overbarunderbar] ["FE33E] ["FE33F]
-\definemathdoubleextensible [both] [overbraceunderbrace] ["FE3DE] ["FE3DF]
-\definemathdoubleextensible [both] [overparentunderparent] ["FE3DC] ["FE3DD]
-\definemathdoubleextensible [both] [overbracketunderbracket] ["FE3B4] ["FE3B5]
-
-\definemathovertextextensible [bothtext] [overbartext] ["FE33E]
-\definemathundertextextensible [bothtext] [underbartext] ["FE33F]
-\definemathovertextextensible [bothtext] [overbracetext] ["FE3DE]
-\definemathundertextextensible [bothtext] [underbracetext] ["FE3DF]
-\definemathovertextextensible [bothtext] [overparenttext] ["FE3DC]
-\definemathundertextextensible [bothtext] [underparenttext] ["FE3DD]
-\definemathovertextextensible [bothtext] [overbrackettext] ["FE3B4]
-\definemathundertextextensible [bothtext] [underbrackettext] ["FE3B5]
+\definemathdoubleextensible [\v!both] [overbarunderbar] ["FE33E] ["FE33F]
+\definemathdoubleextensible [\v!both] [overbraceunderbrace] ["FE3DE] ["FE3DF]
+\definemathdoubleextensible [\v!both] [overparentunderparent] ["FE3DC] ["FE3DD]
+\definemathdoubleextensible [\v!both] [overbracketunderbracket] ["FE3B4] ["FE3B5]
+
+\definemathovertextextensible [\v!bothtext] [overbartext] ["FE33E]
+\definemathundertextextensible [\v!bothtext] [underbartext] ["FE33F]
+\definemathovertextextensible [\v!bothtext] [overbracetext] ["FE3DE]
+\definemathundertextextensible [\v!bothtext] [underbracetext] ["FE3DF]
+\definemathovertextextensible [\v!bothtext] [overparenttext] ["FE3DC]
+\definemathundertextextensible [\v!bothtext] [underparenttext] ["FE3DD]
+\definemathovertextextensible [\v!bothtext] [overbrackettext] ["FE3B4]
+\definemathundertextextensible [\v!bothtext] [underbrackettext] ["FE3B5]
%D Some bonus ones (for the moment here):
diff --git a/Master/texmf-dist/tex/context/base/mkiv/math-tag.lua b/Master/texmf-dist/tex/context/base/mkiv/math-tag.lua
index 03f9e70bbbb..daa757f6a35 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/math-tag.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/math-tag.lua
@@ -58,11 +58,16 @@ local choice_code = nodecodes.choice -- attr display text script s
local fence_code = nodecodes.fence -- attr subtype
local accentcodes = nodes.accentcodes
+local fencecodes = nodes.fencecodes
local fixedtopaccent_code = accentcodes.fixedtop
local fixedbottomaccent_code = accentcodes.fixedbottom
local fixedbothaccent_code = accentcodes.fixedboth
+local leftfence_code = fencecodes.left
+local middlefence_code = fencecodes.middle
+local rightfence_code = fencecodes.right
+
local kerncodes = nodes.kerncodes
local fontkern_code = kerncodes.fontkern
@@ -116,10 +121,10 @@ local function processsubsup(start)
-- start_tagged("mrow")
process(nucleus)
-- stop_tagged()
- start_tagged("mrow")
+ start_tagged("mrow", { subscript = true })
process(sub)
stop_tagged()
- start_tagged("mrow")
+ start_tagged("mrow", { superscript = true })
process(sup)
stop_tagged()
stop_tagged()
@@ -158,7 +163,7 @@ local fencesstack = { }
-- local function getunicode(n) -- instead of getchar
-- local char = getchar(n)
--- -- local font = font_of_family(getfield(n,"fam")) -- font_of_family
+-- -- local font = getfontoffamily(getfield(n,"fam"))
-- local font = getfont(n)
-- local data = fontcharacters[font][char]
-- return data.unicode or char
@@ -204,7 +209,7 @@ process = function(start) -- we cannot use the processor as we have no finalizer
local mtexttag = nil
while start do
local id = getid(start)
- -- showtag(start,id,true)
+-- showtag(start,id,true)
if id == glyph_code or id == disc_code then
if not mtexttag then
mtexttag = start_tagged("mtext")
@@ -265,7 +270,7 @@ process = function(start) -- we cannot use the processor as we have no finalizer
elseif id == noad_code then
-- setattr(start,a_tagged,tags.current())
processsubsup(start)
- elseif id == dubbox_code or id == hlist_code or id == vlist_code then
+ elseif id == subbox_code or id == hlist_code or id == vlist_code then
-- keep an eye on subbox_code and see what ends up in there
local attr = getattr(start,a_tagged)
if not attr then
@@ -372,7 +377,7 @@ process = function(start) -- we cannot use the processor as we have no finalizer
end
end
end
- elseif id == submlistcode then -- normally a hbox
+ elseif id == submlist_code then -- normally a hbox
local list = getlist(start)
if list then
local attr = getattr(start,a_tagged)
@@ -450,16 +455,16 @@ process = function(start) -- we cannot use the processor as we have no finalizer
process(scriptscript)
end
elseif id == fence_code then
+ local subtype = getsubtype(start)
local delim = getfield(start,"delim")
- local subtype = getfield(start,"subtype")
- if subtype == 1 then
+ if subtype == leftfence_code then
-- left
local properties = { }
insert(fencesstack,properties)
setattr(start,a_tagged,start_tagged("mfenced",properties)) -- needs checking
if delim then
start_tagged("ignore")
- local chr = getfield(delim,"small_char")
+ local chr = getchar(delim)
if chr ~= 0 then
properties.left = chr
end
@@ -467,12 +472,12 @@ process = function(start) -- we cannot use the processor as we have no finalizer
stop_tagged()
end
start_tagged("mrow") -- begin of subsequence
- elseif subtype == 2 then
+ elseif subtype == middlefence_code then
-- middle
if delim then
start_tagged("ignore")
local top = fencesstack[#fencesstack]
- local chr = getfield(delim,"small_char")
+ local chr = getchar(delim)
if chr ~= 0 then
local mid = top.middle
if mid then
@@ -486,7 +491,7 @@ process = function(start) -- we cannot use the processor as we have no finalizer
end
stop_tagged() -- end of subsequence
start_tagged("mrow") -- begin of subsequence
- elseif subtype == 3 then
+ elseif subtype == rightfence_code then
local properties = remove(fencesstack)
if not properties then
report_tags("missing right fence")
@@ -494,7 +499,7 @@ process = function(start) -- we cannot use the processor as we have no finalizer
end
if delim then
start_tagged("ignore")
- local chr = getfield(delim,"small_char")
+ local chr = getchar(delim)
if chr ~= 0 then
properties.right = chr
end
@@ -525,9 +530,9 @@ process = function(start) -- we cannot use the processor as we have no finalizer
stop_tagged()
end
elseif id == accent_code then
+ local subtype = getsubtype(start)
local accent = getfield(start,"accent")
local bot_accent = getfield(start,"bot_accent")
- local subtype = getsubtype(start)
if bot_accent then
if accent then
setattr(start,a_tagged,start_tagged("munderover", {
@@ -582,9 +587,10 @@ end
function noads.handlers.tags(head,style,penalties)
start_tagged("math", { mode = (getattr(head,a_mathmode) == 1) and "display" or "inline" })
--- start_tagged("mrow")
setattr(head,a_tagged,start_tagged("mrow"))
+-- showtag(head,getid(head),true)
process(head)
+-- showtag(head,getid(head),false)
stop_tagged()
stop_tagged()
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/math-vfu.lua b/Master/texmf-dist/tex/context/base/mkiv/math-vfu.lua
index ed6f69f41d9..9090955e9c4 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/math-vfu.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/math-vfu.lua
@@ -1106,13 +1106,16 @@ function vfmath.define(specification,set,goodies)
end
end
--
+ main.mathparameters = mathparameters -- still traditional ones
+ -- This should change (some day) as it's the only place where we look forward,
+ -- so better is to also reserve the id already which then involves some more
+ -- management (so not now).
fontlist[#fontlist+1] = {
id = font.nextid(),
size = size,
}
- --
- main.mathparameters = mathparameters -- still traditional ones
vfmath.addmissing(main,#fontlist,size)
+ --
mathematics.addfallbacks(main)
--
main.properties.math_is_scaled = true -- signal
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-blb.lua b/Master/texmf-dist/tex/context/base/mkiv/meta-blb.lua
index e1c0de74f37..9ee57d80dd1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/meta-blb.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-blb.lua
@@ -142,11 +142,7 @@ end
local sxsy = metapost.sxsy
local cm = metapost.cm
-local f_f = formatters["%.6F"]
-
-directives.register("pdf.stripzeros",function()
- f_f = formatters["%.6N"]
-end)
+local f_f = formatters["%.6N"]
local function injectblob(object,blob)
local sx, rx, ry, sy, tx, ty = cm(object)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-fig.mkiv b/Master/texmf-dist/tex/context/base/mkiv/meta-fig.mkiv
index bf37aa7bfa7..e89cb14425d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/meta-fig.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-fig.mkiv
@@ -44,12 +44,17 @@
\definefittingpage
[MPpage]
[\c!align=,
- \c!command=\meta_process_graphic_instance{\fittingpageparameter\c!instance},
+ \c!command=\meta_process_graphic_command,
\c!instance=]
\unexpanded\def\setupMPpage
{\setupfittingpage[MPpage]}
+\unexpanded\def\meta_process_graphic_command
+ {\doif{\fittingpageparameter\c!alternative}\v!offset
+ {\def\meta_relocate_graphic{\clf_setpageorigin\MPllx\MPlly\relax}}%
+ \meta_process_graphic_instance{\fittingpageparameter\c!instance}}
+
%D \macros
%D {MPfigure}
%D
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-fnt.lua b/Master/texmf-dist/tex/context/base/mkiv/meta-fnt.lua
index 69212d08c79..92bbe071617 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/meta-fnt.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-fnt.lua
@@ -167,8 +167,8 @@ local function build(g,v)
local t = { }
for d=1,#data do
t = fonts.constructors.scale(data[d],-1000)
- local id = font.nextid()
- t.fonts = { { id = id } }
+ -- local id = font.nextid()
+ -- t.fonts = { { id = id } }
fontdata[id] = t
if v[5] then
vffonts.helpers.composecharacters(t)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-imp-dum.mkiv b/Master/texmf-dist/tex/context/base/mkiv/meta-imp-dum.mkiv
index 481afe82a54..74a2de8755e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/meta-imp-dum.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-imp-dum.mkiv
@@ -13,8 +13,7 @@
\unprotect
-%D This library overloads the normal external figure
-%D placeholder by a nicer one.
+%D This library overloads the normal external figure placeholder by a nicer one.
%D
%D \startbuffer
%D \useMPlibrary[dum]
@@ -30,69 +29,70 @@
%D
%D \typebuffer \getbuffer
-% currently preparempvariables is unable to resolve number
-% fractions like reduction
-
-% June 22, 2003, this definition was patched to adapt itself
-% to transparent colors, but ... in 2011 we no longer have
-% is_transparent so we revert.
-%
-% \startuseMPgraphic{placeholder}{width,height,reduction,color}
-% numeric w, h, d, r ; color c, b, cc ; path p ; boolean t ;
-% t := is_transparent(\MPvar{color}) ;
-% c := not_transparent(\MPvar{color}) ;
-% b := not_transparent(white) ;
-% w := \MPvar{width} ;
-% h := \MPvar{height} ;
-% r := \MPvar{reduction} ;
-% d := max(w,h) ;
-% p := unitsquare xyscaled (w,h) ;
-% cc := r[.5c,b] ;
-% fill p withcolor if t : transparent(1,.5,cc) else : cc fi ;
-% for i := 1 upto 60 :
-% cc := r[c randomized(.3,.9),b] ;
-% fill fullcircle
-% scaled (d/5 randomized (d/5))
-% shifted (center p randomized (d))
-% withcolor if t : transparent(1,.5,cc) else : cc fi ;
-% endfor ;
-% clip currentpicture to p ;
-% \stopuseMPgraphic
-
-\startuseMPgraphic{minifun::figure:placeholder}{width,height,reduction,color}
- begingroup ;
- save w, h, d, r, p, c, b ;
- numeric w, h, d, r ; path p ;
- if cmykcolor \MPvar{color} :
- cmykcolor c, b ; b := (0,0,0,0)
- else :
- color c, b ; ; b := (1,1,1)
- fi ;
- c := \MPvar{color} ;
- w := \MPvar{width} ;
- h := \MPvar{height} ;
- r := \MPvar{reduction} ;
- d := max(w,h) ;
- p := unitsquare xyscaled (w,h) ;
- fill p withcolor r[.5c,b] ;
- for i := 1 upto 60 :
- fill fullcircle
- scaled (d/5 randomized (d/5))
- shifted (center p randomized (d))
- withcolor r[c randomized(.3,.9),b] ;
- endfor ;
- clip currentpicture to p ;
- endgroup ;
-\stopuseMPgraphic
-
-\defineoverlay
- [figure:placeholder:graphic]
- [\useMPgraphic
- {minifun::figure:placeholder}%
- {width=\figurewidth,%
- height=\figureheight,%
- reduction=\externalfigureparameter\c!reduction,%
- color=placeholder:\the\c_grph_replacement_n}]
+\startmkivmode
+
+%D Currently preparempvariables is unable to resolve number fractions like
+%D reduction.
+
+ \startuseMPgraphic{minifun::figure:placeholder}{width,height,reduction,color}
+ begingroup ;
+ save w, h, d, r, p, c, b ;
+ numeric w, h, d, r ; path p ;
+ if cmykcolor \MPvar{color} :
+ cmykcolor c, b ; b := (0,0,0,0)
+ else :
+ color c, b ; b := (1,1,1)
+ fi ;
+ c := \MPvar{color} ;
+ w := \MPvar{width} ;
+ h := \MPvar{height} ;
+ r := \MPvar{reduction} ;
+ d := max(w,h) ;
+ p := unitsquare xyscaled (w,h) ;
+ fill p withcolor r[.5c,b] ;
+ for i := 1 upto 60 :
+ fill fullcircle
+ scaled (d/5 randomized (d/5))
+ shifted (center p randomized (d))
+ withcolor r[c randomized(.3,.9),b] ;
+ endfor ;
+ clip currentpicture to p ;
+ endgroup ;
+ \stopuseMPgraphic
+
+ \defineoverlay
+ [figure:placeholder:graphic]
+ [\useMPgraphic
+ {minifun::figure:placeholder}%
+ {width=\figurewidth,%
+ height=\figureheight,%
+ reduction=\externalfigureparameter\c!reduction,%
+ color=placeholder:\the\c_grph_replacement_n}] % weird, why do we need to prefix the palette
+
+\stopmkivmode
+
+\startlmtxmode
+
+ \defineMPparameterset
+ [placeholder]
+ [width=dimension,
+ height=dimension,
+ reduction=number,
+ color=string,
+ alternative=string]
+
+ \defineoverlay
+ [figure:placeholder:graphic]
+ [{\useMPmacro
+ [minifun]%
+ [placeholder]%
+ [width=\figurewidth,%
+ height=\figureheight,%
+ alternative=\externalfigureparameter\c!alternative,
+ reduction=\externalfigureparameter\c!reduction,%
+ color=placeholder:\the\c_grph_replacement_n]}]
+
+\stoplmtxmode
\definepalet
[placeholder]
@@ -108,6 +108,7 @@
\unexpanded\def\grph_include_replacement#1#2#3%
{\begingroup
+% \setuppalet[placeholder]%
\getpaletsize[placeholder]%
\ifnum\c_grph_replacement_n=\zerocount
\getrandomnumber \m_grph_replacement_n\plusone\paletsize
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-imp-gamesymbols.mkxl b/Master/texmf-dist/tex/context/base/mkiv/meta-imp-gamesymbols.mkxl
new file mode 100644
index 00000000000..d79e59f69f4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-imp-gamesymbols.mkxl
@@ -0,0 +1,349 @@
+%D \module
+%D [ file=meta-imp-gamesymbols,
+%D version=2019.10.10,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Game Symbols,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The \METAFUN\ code here is not optimal and efficient but as it serves as an
+%D example I decided to keep it simple. Also, performance is not really an issue
+%D here anyway. Inspired by the classic \quote {Concrete Mathematics} by Don Knuth
+%D we define dice and dominos, which happen to be \UNICODE\ characters now. We
+%D use this opportunity to demonstrate slightly different approached.
+
+%D Each dice gets it's own macro at the \METAPOST\ end. Watch how we use the \type
+%D {simplefun} instance in combination with a calculation wrapper. This will just
+%D execute the code and leave no traces in the text flow. The code itself is not
+%D that spectacular:
+
+\startMPcalculation{simplefun}
+
+ def DiceFrame =
+ pickup pencircle scaled 1/2 ;
+ draw unitsquare scaled 8 ;
+ pickup pencircle scaled 3/2 ;
+ enddef ;
+
+ vardef DiceOne =
+ DiceFrame ;
+ draw (4,4) ;
+ enddef ;
+ vardef DiceTwoA =
+ DiceFrame ;
+ draw (2,6) ; draw (6,2) ;
+ enddef ;
+ vardef DiceTwoB =
+ DiceFrame ;
+ draw (6,6) ; draw (2,2) ;
+ enddef ;
+ vardef DiceTwo =
+ if hasoption "mpsfont" "option" "reverse" :
+ DiceTwoB
+ else :
+ DiceTwoA
+ fi ;
+ enddef ;
+ vardef DiceThreeA =
+ DiceFrame ;
+ draw (2,6) ; draw (4,4) ; draw (6,2) ;
+ enddef ;
+ vardef DiceThreeB =
+ DiceFrame ;
+ draw (6,6) ; draw (4,4) ; draw (2,2) ;
+ enddef ;
+ vardef DiceThree =
+ if hasoption "mpsfont" "option" "reverse" :
+ DiceThreeB
+ else :
+ DiceThreeA
+ fi ;
+ enddef ;
+ vardef DiceFour =
+ DiceFrame ;
+ draw (2,6) ; draw (6,6) ; draw (2,2) ; draw (6,2) ;
+ enddef ;
+ vardef DiceFive =
+ DiceFrame ;
+ draw (2,6) ; draw (6,6) ; draw (4,4) ; draw (2,2) ; draw (6,2) ;
+ enddef ;
+ vardef DiceSix =
+ DiceFrame ;
+ draw (2,6) ; draw (6,6) ; draw (2,4) ; draw (6,4) ; draw (2,2) ; draw (6,2) ;
+ enddef ;
+
+ vardef DiceBad =
+ pickup pencircle scaled 1/2 ;
+ draw unitsquare scaled 8 ;
+ draw (1,7) -- (7,1) ; draw (1,1) -- (7,7) ;
+ enddef ;
+
+ lmt_registerglyphs [
+ name = "dice",
+ units = 12,
+ width = 8,
+ height = 8,
+ depth = 0,
+ usecolor = true,
+ ] ;
+
+ lmt_registerglyph [ category = "dice", unicode = "0x2680", code = "DiceOne;" ] ;
+ lmt_registerglyph [ category = "dice", unicode = "0x2681", code = "DiceTwo;" ] ;
+ lmt_registerglyph [ category = "dice", unicode = "0x2682", code = "DiceThree;" ] ;
+ lmt_registerglyph [ category = "dice", unicode = "0x2683", code = "DiceFour;" ] ;
+ lmt_registerglyph [ category = "dice", unicode = "0x2684", code = "DiceFive;" ] ;
+ lmt_registerglyph [ category = "dice", unicode = "0x2685", code = "DiceSix;" ] ;
+
+ lmt_registerglyph [ category = "dice", private = "invaliddice", code = "DiceBad;" ] ;
+
+\stopMPcalculation
+
+%D At the \TEX\ end we define three features. The reverse is just there for fun. The
+%D digits features will map digits onto dice.
+
+\definefontfeature
+ [dice:normal]
+ [default]
+ [metapost={category=dice}]
+
+\definefontfeature
+ [dice:reverse]
+ [default]
+ [metapost={category=dice,option=reverse}]
+
+\definefontfeature
+ [dice:digits]
+ [dice:digits=yes]
+
+%D The mapping to dice happens here:
+
+\startluacode
+
+ -- local invalid = fonts.helpers.privateslot("invaliddice")
+
+ fonts.handlers.otf.addfeature("dice:digits", {
+ type = "substitution",
+ order = { "dice:digits" },
+ nocheck = true,
+ data = {
+ [0x30] = "invaliddice",
+ [0x31] = 0x2680,
+ [0x32] = 0x2681,
+ [0x33] = 0x2682,
+ [0x34] = 0x2683,
+ [0x35] = 0x2684,
+ [0x36] = 0x2685,
+ [0x37] = "invaliddice",
+ [0x38] = "invaliddice",
+ [0x39] = "invaliddice",
+ },
+ } )
+
+\stopluacode
+
+%D An example is given at the the end of this file so we now move forward with
+%D the dominos.
+
+\startMPcalculation{simplefun}
+
+ %D Because there are so many dominos we predefine the shapes and then register
+ %D the lot in a loop.
+
+ picture Dominos[] ;
+
+ Dominos[0] := image() ;
+ Dominos[1] := image(draw(4,4);) ;
+ Dominos[2] := image(draw(2,6);draw(6,2););
+ Dominos[3] := image(draw(2,6);draw(4,4);draw(6,2););
+ Dominos[4] := image(draw(2,6);draw(6,6);draw(2,2);draw(6,2););
+ Dominos[5] := image(draw(2,6);draw(6,6);draw(4,4);draw(2,2);draw(6,2););
+ Dominos[6] := image(draw(2,6);draw(4,6);draw(6,6);draw(2,2);draw(4,2);draw(6,2););
+ % Dominos[7] := Dominos[0] ;
+ % Dominos[8] := Dominos[0] ;
+ % Dominos[9] := Dominos[0] ;
+
+ %D Defining the font properties is straightforward:
+
+ lmt_registerglyphs [
+ name = "dominos",
+ units = 12,
+ width = 16,
+ height = 8,
+ depth = 0,
+ usecolor = true,
+ ] ;
+
+ %D We have horizontal dominos:
+
+ def DrawDominoH(expr a, b) =
+ draw image (
+ pickup pencircle scaled 1/2 ;
+ if (getparameterdefault "mpsfont" "color" "") = "black" :
+ fillup unitsquare xyscaled (16,8) ;
+ draw (8,.5) -- (8,7.5) withcolor white ;
+ pickup pencircle scaled 3/2 ;
+ draw Dominos[a]
+ withpen currentpen
+ withcolor white ;
+ draw Dominos[b] shifted (8,0)
+ withpen currentpen
+ withcolor white ;
+ else :
+ draw unitsquare xyscaled (16,8) ;
+ draw (8,0) -- (8,8) ;
+ pickup pencircle scaled 3/2 ;
+ draw Dominos[a]
+ withpen currentpen ;
+ draw Dominos[b] shifted (8,0)
+ withpen currentpen ;
+ fi ;
+ ) ;
+ enddef ;
+
+ %D and vertical ones. We could use the above macro and rotate and shift and reflect
+ %D but why bother with it:
+
+ def DrawDominoV(expr a, b) = % is H rotated and shifted
+ draw image (
+ pickup pencircle scaled 1/2 ;
+ if (getparameterdefault "mpsfont" "color" "") = "black" :
+ fillup unitsquare xyscaled (8,16) ;
+ draw (.5,8) -- (7.5,8) withcolor white ;
+ pickup pencircle scaled 3/2 ;
+ draw Dominos[a] rotatedaround(center Dominos[a],90)
+ withpen currentpen
+ withcolor white ;
+ draw Dominos[b] rotatedaround(center Dominos[b],90) shifted (0,8)
+ withpen currentpen
+ withcolor white ;
+ else :
+ draw unitsquare xyscaled (8,16) ;
+ draw (0,8) -- (8,8) ;
+ pickup pencircle scaled 3/2 ;
+ draw Dominos[a] rotatedaround(center Dominos[a],90)
+ withpen currentpen ;
+ draw Dominos[b] rotatedaround(center Dominos[b],90) shifted (0,8)
+ withpen currentpen ;
+ fi ;
+ ) ;
+ enddef ;
+
+ %D We have two simple loops that define the horizontal range:
+
+ save unicode ; numeric unicode ; unicode := 127025 ; % 1F031
+
+ for i=0 upto 6 :
+ for j=0 upto 6 :
+ lmt_registerglyph [
+ category = "dominos",
+ unicode = unicode,
+ code = "DrawDominoH(" & decimal i & "," & decimal j & ");",
+ width = 16,
+ height = 8,
+ ] ;
+ unicode := unicode + 1 ;
+ endfor ;
+ endfor ;
+
+ %D and the vertical range:
+
+ save unicode ; numeric unicode ; unicode := 127075 ;
+
+ for i=0 upto 6 :
+ for j=0 upto 6 :
+ lmt_registerglyph [
+ category = "dominos",
+ unicode = unicode,
+ code = "DrawDominoV(" & decimal i & "," & decimal j & ");",
+ width = 8,
+ height = 16,
+ ] ;
+ unicode := unicode + 1 ;
+ endfor ;
+ endfor ;
+
+ %D Now we're done at the \METAFUN\ end.
+
+\stopMPcalculation
+
+%D We predefine two features:
+
+\definefontfeature
+ [dominos:white]
+ [default]
+ [metapost={category=dominos}]
+
+\definefontfeature
+ [dominos:black]
+ [default]
+ [metapost={category=dominos,color=black}]
+
+\definefontfeature
+ [dominos:digits]
+ [dominos:digits=yes]
+
+%D This last feature is yet to be defined. We could deal with the invalid
+%D dominos with some substitution trickery but let's keep it simple.
+
+\startluacode
+
+ local ligatures = { }
+ local unicode = 127025
+
+ for i=0x30,0x36 do
+ for j=0x30,0x36 do
+ ligatures[unicode] = { i, j }
+ unicode = unicode + 1 ;
+ end
+ end
+
+ fonts.handlers.otf.addfeature("dominos:digits", {
+ type = "ligature",
+ order = { "dominos:digits" },
+ nocheck = true,
+ data = ligatures,
+ } )
+
+\stopluacode
+
+\continueifinputfile{meta-imp-gamesymbols.mkxl}
+
+\starttext
+
+ \definefont[DominoW][Serif*dominos:white]
+ \definefont[DominoB][Serif*dominos:black]
+ \definefont[DominoD][Serif*dominos:white,dominos:digits]
+
+ \startTEXpage[offset=3pt]
+ \DominoW
+ \char"1F043\quad 🀱\quad
+ \char"1F052\quad 🀲\quad
+ \char"1F038\quad 🀳\quad
+ \darkgreen\char"1F049\quad \char"1F07B\quad
+ \DominoB
+ \char"1F087\quad
+ \char"1F088\quad
+ \char"1F089\quad
+ \DominoD
+ \darkred 12\quad56\quad64%
+ \stopTEXpage
+
+ \definefont[DiceN][Serif*dice:normal]
+ \definefont[DiceR][Serif*dice:reverse]
+ \definefont[DiceD][Serif*dice:normal,dice:digits]
+
+ \startTEXpage[offset=3pt]
+ \DiceN
+ \dostepwiserecurse{"2680}{"2685}{1}{\char#1\quad}%
+ \DiceN
+ \dostepwiserecurse{"2680}{"2685}{1}{\char#1\quad}%
+ \DiceD
+ \darkblue 2\quad5\quad3\quad0
+ \stopTEXpage
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-imp-symbols.mkxl b/Master/texmf-dist/tex/context/base/mkiv/meta-imp-symbols.mkxl
new file mode 100644
index 00000000000..f88fd6f8787
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-imp-symbols.mkxl
@@ -0,0 +1,99 @@
+%D \module
+%D [ file=meta-imp-symbols,
+%D version=2019.10.01,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Symbols,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is an (experimental) prelude to more.
+
+\startMPcalculation{simplefun}
+
+ pen SymbolPen ; SymbolPen := pencircle scaled 1/4 ;
+
+ vardef SymbolBullet = fill unitcircle scaled 3 shifted (1.5,1.5) withpen SymbolPen enddef ; % 0x2022 •
+ vardef SymbolDash = draw (origin--right) scaled 3 shifted (1.5,3.0) withpen SymbolPen scaled 2 enddef ; % 0x2013 –
+ vardef SymbolTriangle = draw unittriangle scaled 3 shifted (1.5,1.5) withpen SymbolPen enddef ; % 0x25B6 ⊳
+ vardef SymbolCircle = fill unitcircle scaled 3 shifted (1.5,1.5) withpen SymbolPen enddef ; % 0x2218 ∘
+ vardef SymbolSquare = draw unitsquare scaled (3-1/16) shifted (1.5,1.5) withpen SymbolPen enddef ; % 0x25A1 â–¡
+ vardef SymbolDiamond = draw unitdiamond scaled 3 shifted (1.5,1.5) withpen SymbolPen enddef ; % 0x22C4 â‹„
+ vardef SymbolBlackTriangle = fillup unittriangle scaled (3-1/16) shifted (1.5,1.5) withpen SymbolPen enddef ; % 0x25B6 â–¶
+ vardef SymbolBlackSquare = fillup unitsquare scaled (3-1/16) shifted (1.5,1.5) withpen SymbolPen enddef ; % 0x25A0 â– 
+ vardef SymbolBlackDiamond = fillup unitdiamond scaled (3-1/16) shifted (1.5,1.5) withpen SymbolPen enddef ; % 0x25C6 â—†
+
+ vardef SymbolNotDef =
+ draw center unitcircle
+ scaled 3
+ shifted (1.5,1.5)
+ withpen SymbolPen scaled 4
+ enddef ;
+
+ vardef SymbolStar = % 0x22C6 % ⋆
+ SymbolNotDef
+ enddef ;
+
+ vardef SymbolCheckmark = % 0x2713 ✓
+ SymbolNotDef
+ enddef ;
+
+ vardef SymbolAsterisk = % 0x2217 ∗
+ SymbolNotDef
+ enddef ;
+
+ % We could set code directly to the meaning of the macro.
+
+ lmt_registerglyphs [
+ name = "symbols",
+ units = 10,
+ usecolor = true,
+ width = 6,
+ height = 6,
+ depth = 0,
+ code = "SymbolNotDef ;",
+ ] ;
+
+ lmt_registerglyph [ category = "symbols", unicode = "0x2022", code = "SymbolBullet ;" ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x2013", code = "SymbolDash ;" ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x22C6" ] ; % , code = "SymbolStar ;" ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x22B3", code = "SymbolTriangle ;" ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x2218", code = "SymbolCircle ;" ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x25A1", code = "SymbolSquare ;" ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x22C4", code = "SymbolDiamond ;" ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x2713" ] ; % , code = "SymbolCheckmark ;" ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x2217" ] ; % , code = "SymbolAsterisk ;" ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x25B6", code = "SymbolBlackTriangle ;" ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x25A0", code = "SymbolBlackSquare ;" ] ;
+ lmt_registerglyph [ category = "symbols", unicode = "0x25C6", code = "SymbolBlackDiamond ;" ] ;
+
+\stopMPcalculation
+
+\continueifinputfile{meta-imp-symbols.mkxl}
+
+\usemodule[article-basic] \setupbodyfont[pagella]
+
+\starttext
+
+\definefontfeature[metasymbols][metapost=symbols]
+
+\definefont[MyFont] [Serif*default,metasymbols sa 1]
+
+Some metasymbols:
+
+\startitem {\MyFont • □ ◆}\quad Regular rendering. \stopitem
+\startitem {\MyFont\red • □ ◆}\quad Rendering with color. \stopitem
+\startitem {\MyFont\blue\showglyphs • □ ◆}\quad Idem but with boundingboxes shown. \stopitem
+
+And some more:
+
+\startlines
+ • – ⋆ ⊳ ∘ □ ⋄ ✓ ∗ ▶ ■ ◆
+ {\MyFont • – ⋆ ⊳ ∘ □ ⋄ ✓ ∗ ▶ ■ ◆}
+\stoplines
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-imp-tab.mkiv b/Master/texmf-dist/tex/context/base/mkiv/meta-imp-tab.mkiv
index a4affbea458..2604c3aa454 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/meta-imp-tab.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-imp-tab.mkiv
@@ -34,7 +34,7 @@
\unexpanded\def\tallynumeral#1%
{\dontleavehmode
- \lower.25\exheight\hbox{\useMPgraphic{TallyBar}{n=#1}}}
+ \lower.25\exheight\hpack{\useMPgraphic{TallyBar}{n=#1}}}
\unexpanded\def\tallynumerals#1%
{\dontleavehmode
@@ -42,11 +42,11 @@
\scratchcounter#1\relax
\doloop
{\ifnum\scratchcounter>\plusfive
- \lower.25\exheight\hbox{\useMPgraphic{TallyBar}{n=5}}%
+ \lower.25\exheight\hpack{\useMPgraphic{TallyBar}{n=5}}%
\advance\scratchcounter-\plusfive
\space
\else
- \lower.25\exheight\hbox{\useMPgraphic{TallyBar}{n=\the\scratchcounter}}%
+ \lower.25\exheight\hpack{\useMPgraphic{TallyBar}{n=\the\scratchcounter}}%
\exitloop
\fi}%
\endgroup}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-imp-threesix.mkxl b/Master/texmf-dist/tex/context/base/mkiv/meta-imp-threesix.mkxl
new file mode 100644
index 00000000000..277aa85f717
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-imp-threesix.mkxl
@@ -0,0 +1,253 @@
+% not yet a module
+
+\startluacode
+ local gsub, utfbyte = string.gsub, utf.byte
+
+ -- The font from DEK's facs9b.ps (I wish I was clever enough to understand all the good
+ -- stuff in there):
+
+ local font36 = {
+ ["0"] = [[00111100 01111110 11000011 11000011 11000011 11000011 01111110 00111100]],
+ ["1"] = [[00011100 11111100 11101100 00001100 00001100 00001100 11111111 11111111]],
+ ["2"] = [[00111110 01110011 01110011 00000011 00001110 00111000 11110001 11111111]],
+ ["3"] = [[01111110 01100110 00000110 00111100 00000110 11100111 11100111 01111110]],
+ ["4"] = [[00001110 00011110 00110110 01100110 11111111 11111111 00000110 00001110]],
+ ["5"] = [[01111110 01111110 01000000 01111100 01000111 00000011 11000111 11111110]],
+ ["6"] = [[01111110 01100110 11000000 11011100 11100110 11000011 01100011 01111110]],
+ ["7"] = [[11111111 11111111 10000111 10001110 00011100 00011100 00011100 00011100]],
+ ["8"] = [[01111110 01100110 01100110 00111100 11000011 11000011 11000011 01111110]],
+ ["9"] = [[01111110 11000110 11000011 01100111 00111011 00000011 01100110 01111110]],
+ ["A"] = [[000110000 000111000 001111100 001101100 011001110 011111110 010000110 111100111]],
+ ["B"] = [[1111100 1110110 0110110 0111100 0110011 0110011 1110011 1111100]],
+ ["C"] = [[01111101 11110011 11100001 11100001 11100000 11100000 11100001 01111110]],
+ ["D"] = [[11111100 11100010 01100011 01100011 01100011 01100011 11100010 11111100]],
+ ["E"] = [[1111111 1110001 0110101 0111100 0110100 0110001 1110001 1111111]],
+ ["F"] = [[11111111 11100001 01100101 01111100 01100100 01100000 11111000 11111000]],
+ ["G"] = [[01111010 11100110 11100010 11100000 11100111 11100010 11100010 01111100]],
+ ["H"] = [[11100111 11100111 01000010 01111110 01000010 01000010 11100111 11100111]],
+ ["I"] = [[1111111 1111111 0011000 0011000 0011000 0011000 1111111 1111111]],
+ ["J"] = [[01111111 01111111 00000110 00000110 11110110 01100110 01100110 00111100]],
+ ["K"] = [[11101110 11100100 01101000 01110000 01111000 01101100 11100110 11101111]],
+ ["L"] = [[111111000 111111000 011000000 011000000 011000000 011000011 111000011 111111111]],
+ ["M"] = [[1100000011 1110000111 0111111110 0100110010 0100110010 0100000010 1100000011 1100000011]],
+ ["N"] = [[11000011 11100011 01110010 01111010 01011110 01001110 11100110 11100010]],
+ ["O"] = [[01111110 11000011 11000011 11000011 11000011 11000011 11000011 01111110]],
+ ["P"] = [[11111110 11100011 01100011 01111110 01100000 01100000 11111000 11111000]],
+ ["Q"] = [[01111100 11000110 11000110 11000110 11000110 11001110 11000110 01111101]],
+ ["R"] = [[11111100 11100110 01100110 01111100 01101000 01100100 11100010 11100111]],
+ ["S"] = [[01111110 11100001 11100001 01111000 00011110 10000111 11000011 10111110]],
+ ["T"] = [[1111111111 1100110011 1100110011 0000110000 0000110000 0000110000 0001111000 0001111000]],
+ ["U"] = [[111101111 111101111 011000010 011000010 011000010 011000010 011000010 001111100]],
+ ["V"] = [[11111000111 11111000111 01110000010 00110000100 00111000100 00011001000 00001101000 00001110000]],
+ ["W"] = [[111000000111 111000000111 110000000010 011000000100 011001000100 001101101000 001101101000 000110110000]],
+ ["X"] = [[1111001110 1111000110 0001101000 0000110000 0000110000 0001011000 0110001111 0111001111]],
+ ["Y"] = [[111100011 111100011 011000010 001110100 000111000 000011000 001111110 001111110]],
+ ["Z"] = [[11111111 10000111 00001110 00011100 00111000 01110000 11100001 11111111]],
+ }
+
+ local f_code = string.formatters["ThreeSix(%s);"]
+ local replace = { ["0"] = "N;", ["1"] = "Y;", [" "] = "L;" }
+
+ local function remap(str)
+ -- permit abundant spacing (bonus)
+ str = gsub(str,"%s+", " ")
+ -- remap what we got to macro calls
+ str = gsub(str,".",replace)
+ -- return the result
+ return str
+ end
+
+ function MP.registerthreesix(name)
+ fonts.dropins.registerglyphs {
+ name = name,
+ units = 12,
+ usecolor = true,
+ preamble = "InitializeThreeSix;",
+ }
+ for u, v in table.sortedhash(font36) do
+ local ny = 8
+ local nx = (#v - ny + 1) // ny
+ local height = ny * 1.1 - 0.1
+ local width = nx * 1.1 - 0.1
+ fonts.dropins.registerglyph {
+ category = name,
+ unicode = utfbyte(u),
+ width = width,
+ height = height,
+ code = f_code(remap(v)),
+ }
+ end
+ end
+
+ MP.registerthreesix("fontthreesix")
+\stopluacode
+
+% \startMPcalculation{simplefun}
+% def InitializeThreeSix =
+% save Y, N, L, S ; save dx, dy, nx, ny ;
+% save shape, fillcolor, mypen, random, currentpen, spread, hoffset ;
+% string shape, fillcolor, mypen ; boolean random ; pen currentpen ;
+% dx := 11/10 ;
+% dy := - 11/10 ;
+% nx := - dx ;
+% ny := 0 ;
+% shape := getparameterdefault "mpsfont" "shape" "circle" ;
+% random := hasoption "mpsfont" "random" "true" ;
+% fillcolor := getparameterdefault "mpsfont" "color" "" ;
+% mypen := getparameterdefault "mpsfont" "pen" "" ;
+% spread := getparameterdefault "mpsfont" "spread" 0 ;
+% hoffset := 12 * spread / 2 ;
+% currentpen := pencircle
+% if mypen = "fancy" :
+% xscaled 1/20 yscaled 2/20 rotated 45
+% else :
+% scaled 1/20
+% fi ;
+% if shape == "square" :
+% def S =
+% unitsquare if random : randomized 1/10 fi
+% shifted (nx,ny)
+% enddef ;
+% elseif shape = "diamond" :
+% def S =
+% unitdiamond if random : randomized 1/10 fi
+% shifted (nx,ny)
+% enddef ;
+% else :
+% def S =
+% unitcircle if random : randomizedcontrols 1/20 fi
+% shifted (nx,ny)
+% enddef ;
+% fi ;
+% def N =
+% nx := nx + dx ;
+% draw S ;
+% enddef ;
+% if fillcolor = "random" :
+% def Y =
+% nx := nx + dx ;
+% fillup S withcolor white randomized (2/3,2/3,2/3) ;
+% enddef ;
+% elseif fillcolor = "" :
+% def Y =
+% nx := nx + dx ;
+% fillup S ;
+% enddef ;
+% else :
+% def Y =
+% nx := nx + dx ;
+% fillup S withcolor fillcolor ;
+% enddef ;
+% fi ;
+% def L =
+% nx := - dx ;
+% ny := ny + dy ;
+% enddef ;
+% enddef ;
+%
+% vardef ThreeSix (text code) =
+% InitializeThreeSix ;
+% draw image (code) shifted (hoffset,-ny) ;
+% enddef ;
+% \stopMPcalculation
+
+\startMPcalculation{simplefun}
+ def InitializeThreeSix =
+ save Y, N, L, S ;
+ % save dx, dy, nx, ny ;
+ save shape, fillcolor, mypen, random, threesixpen, spread, hoffset ;
+ string shape, fillcolor, mypen ; boolean random ; pen threesixpen ;
+ % dx := 11/10 ;
+ % dy := - 11/10 ;
+ % nx := - dx ;
+ % ny := 0 ;
+ shape := getparameterdefault "mpsfont" "shape" "circle" ;
+ random := hasoption "mpsfont" "random" "true" ;
+ fillcolor := getparameterdefault "mpsfont" "color" "" ;
+ mypen := getparameterdefault "mpsfont" "pen" "" ;
+ spread := getparameterdefault "mpsfont" "spread" 0 ;
+ hoffset := 12 * spread / 2 ;
+ threesixpen := pencircle
+ if mypen = "fancy" :
+ xscaled 1/20 yscaled 2/20 rotated 45
+ else :
+ scaled 1/20
+ fi ;
+ if shape == "square" :
+ def S =
+ unitsquare if random : randomized 1/10 fi
+ shifted (nx,ny)
+ enddef ;
+ elseif shape = "diamond" :
+ def S =
+ unitdiamond if random : randomized 1/10 fi
+ shifted (nx,ny)
+ enddef ;
+ else :
+ def S =
+ unitcircle if random : randomizedcontrols 1/20 fi
+ shifted (nx,ny)
+ enddef ;
+ fi ;
+ def N =
+ nx := nx + dx ;
+ draw S ;
+ enddef ;
+ if fillcolor = "random" :
+ def Y =
+ nx := nx + dx ;
+ fillup S withcolor white randomized (2/3,2/3,2/3) ;
+ enddef ;
+ elseif fillcolor = "" :
+ def Y =
+ nx := nx + dx ;
+ fillup S ;
+ enddef ;
+ else :
+ def Y =
+ nx := nx + dx ;
+ fillup S withcolor fillcolor ;
+ enddef ;
+ fi ;
+ def L =
+ nx := - dx ;
+ ny := ny + dy ;
+ enddef ;
+ enddef ;
+
+ vardef ThreeSix (text code) =
+ save dx, dy, nx, ny ;
+ dx := 11/10 ;
+ dy := - 11/10 ;
+ nx := - dx ;
+ ny := 0 ;
+ pickup threesixpen ;
+ draw image (code) shifted (hoffset,-ny) ;
+ enddef ;
+\stopMPcalculation
+
+\definefontfeature % black and white, with some spread
+ [fontthreesix]
+ [default]
+ [metapost=fontthreesix]
+
+\definefontfeature % color, with some spread
+ [fontthreesix-tweak]
+ [default]
+ [metapost={category=fontthreesix,spread=.1}]
+
+\definefontfeature % color, with some spread
+ [fontthreesix-color]
+ [default]
+ [metapost={category=fontthreesix,shape=diamond,color=random,pen=fancy,spread=.1}]
+
+\definefontfeature % color, tight
+ [fontthreesix-initial]
+ [metapost={category=fontthreesix,color=random,shape=circle}] % units?
+
+\definefont[DEKFontA][Serif*fontthreesix]
+\definefont[DEKFontB][Serif*fontthreesix-color]
+\definefont[DEKFontC][Serif*fontthreesix-initial]
+\definefont[DEKFontD][Serif*fontthreesix-tweak]
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-imp-txt.mkiv b/Master/texmf-dist/tex/context/base/mkiv/meta-imp-txt.mkiv
index d4329cd6ffd..e683c3766c9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/meta-imp-txt.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-imp-txt.mkiv
@@ -58,7 +58,7 @@
\scratchcounter\zerocount
\scratchtoks\emptytoks
\def\docommand##1%
- {\setbox\scratchbox\hbox{\useMPgraphic{##1}}%
+ {\setbox\scratchbox\hpack{\useMPgraphic{##1}}%
\global\parfirst\zerocount
\getMPdata
\setshapecharacteristics
@@ -389,7 +389,7 @@
%D \stoplinecorrection
\unexpanded\def\TightText#1#2#3#4%
- {\hbox % \ruledhbox
+ {\hpack
{\startMPcode
picture p ; p := image (graphictext "#1" withfillcolor red) ;
draw p xsized #2 ysized #3 withcolor \MPcolor{#4} ;
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/meta-ini.mkiv
index 89c7699deb5..97d2e1a7d19 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/meta-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-ini.mkiv
@@ -167,10 +167,10 @@
\appendtoks
\ifcsname\??mpdefinitions\currentMPinstance\endcsname \else
- \expandafter\newtoks\csname\??mpdefinitions\currentMPinstance\endcsname
+ \expandafter\newtoks\csname\??mpdefinitions\currentMPinstance\endcsname
\fi
\ifcsname\??mpinclusions\currentMPinstance\endcsname \else
- \expandafter\newtoks\csname\??mpinclusions\currentMPinstance\endcsname
+ \expandafter\newtoks\csname\??mpinclusions\currentMPinstance\endcsname
\fi
\t_meta_definitions\emptytoks % in case we redefine
\t_meta_inclusions \emptytoks % in case we redefine
@@ -243,7 +243,6 @@
{\ifconditional\c_meta_include_initializations
\the\t_meta_initializations
\fi}
- % \theMPrandomseed;}
\def\meta_flush_current_inclusions
{\the\t_meta_inclusions}
@@ -279,9 +278,12 @@
{\pushMPboundingbox
\setbox\b_meta_graphic\hpack\bgroup}
+\let\meta_relocate_graphic\relax % experimental hook
+
\def\meta_process_graphic_stop
{\egroup
\meta_place_graphic
+ \meta_relocate_graphic
\popMPboundingbox}
\unexpanded\def\meta_process_graphic_instance#1%
@@ -408,37 +410,42 @@
\let\stopMPclip\relax
-\unexpanded\def\meta_grab_clip_path#1#2#3#4% #4 is alternative (called in backend code)
+\unexpanded\def\meta_grab_clip_path#1#2#3%
{\begingroup
- \edef\width {#2}% \let\overlaywidth \width
- \edef\height{#3}% \let\overlayheight\height
- \d_overlay_width #2\onebasepoint
- \d_overlay_height#3\onebasepoint
+ \d_overlay_width #2\relax
+ \d_overlay_height#3\relax
+ \edef\width {\the\d_overlay_width \space}%
+ \edef\height{\the\d_overlay_height\space}%
\edef\currentMPclip{#1}%
\ifcsname\??mpclip\currentMPclip\endcsname
- \meta_grab_clip_path_indeed
- \ifx\MPclippath\empty
- \xdef\MPclippath{#4}%
- \fi
+ \meta_grab_clip_path_yes
\else
- \xdef\MPclippath{#4}%
+ \meta_grab_clip_path_nop
\fi
\endgroup}
-\def\meta_grab_clip_path_indeed
+\def\meta_grab_clip_path_yes
{\meta_start_current_graphic
\normalexpanded{\noexpand\clf_mpsetclippath
- instance {\currentMPinstance}%
- format {\currentMPformat}%
- data {\csname\??mpclip\currentMPclip\endcsname}%
- initializations {\meta_flush_current_initializations}%
- useextensions {\MPinstanceparameter\s!extensions}%
- inclusions {\meta_flush_current_inclusions}%
- method {\MPinstanceparameter\c!method}%
+ instance {\currentMPinstance}%
+ format {\currentMPformat}%
+ data {\csname\??mpclip\currentMPclip\endcsname}%
+ initializations {\meta_flush_current_initializations}%
+ useextensions {\MPinstanceparameter\s!extensions}%
+ inclusions {\meta_flush_current_inclusions}%
+ method {\MPinstanceparameter\c!method}%
+ width \d_overlay_width
+ height \d_overlay_height
\relax}%
\meta_stop_current_graphic}
-%D Since we want lables to follow the document settings, we also set the font
+\def\meta_grab_clip_path_nop
+ {\clf_mpsetclippath
+ width \d_overlay_width
+ height \d_overlay_height
+ \relax}
+
+%D Since we want labels to follow the document settings, we also set the font
%D related variables.
\unexpanded\def\MPfontsizehskip#1%
@@ -565,7 +572,7 @@
\def\meta_prepare_variable_nop
{\expandafter \let\csname\m_meta_current_variable_template\endcsname\meta_prepare_variable_default}
-\def\meta_prepare_variable_color
+\def\meta_prepare_variable_color % we use the attribute so we dont' go through namedcolor (why not)
{\expandafter\edef\csname\m_meta_current_variable_template\endcsname{\MPcolor\m_meta_current_variable}}
\def\meta_prepare_variable_number
@@ -604,7 +611,11 @@
%D \defineoverlay[example][\uniqueMPgraphic{test}]
%D
%D \startuniqueMPgraphic {test}
-%D draw unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D draw OverlayBox ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic {test}
+%D draw OverlayBox ;
%D \stopuniqueMPgraphic
%D \stoptyping
@@ -655,10 +666,10 @@
\kern\MPllx\raise\MPlly\box\b_meta_graphic
\egroup}
-\unexpanded\def\obeyMPboxdepth {\let\meta_relocate_box\meta_obey_box_depth }
+\unexpanded\def\obeyMPboxdepth {\let\meta_relocate_box\meta_obey_box_depth}
\unexpanded\def\ignoreMPboxdepth{\let\meta_relocate_box\meta_ignore_box_depth}
-\unexpanded\def\obeyMPboxorigin {\let\meta_relocate_box\meta_obey_box_origin }
-\unexpanded\def\normalMPboxdepth{\let\meta_relocate_box\relax }
+\unexpanded\def\obeyMPboxorigin {\let\meta_relocate_box\meta_obey_box_origin}
+\unexpanded\def\normalMPboxdepth{\let\meta_relocate_box\relax}
\let\meta_relocate_box\relax
@@ -691,20 +702,19 @@
\unexpanded\def\startuniqueMPgraphic
{\dodoublegroupempty\meta_start_unique_graphic}
+\let\stopuniqueMPgraphic\relax
+
\def\meta_start_unique_graphic#1%
{\normalexpanded{\meta_start_unique_graphic_indeed{#1}}}
\unexpanded\def\meta_start_unique_graphic_indeed#1#2#3\stopuniqueMPgraphic
{\setgvalue{\??mpgraphic#1}{\meta_handle_unique_graphic{#1}{#2}{#3}}}
-\let\stopuniqueMPgraphic\relax
-
\unexpanded\def\uniqueMPgraphic
{\dodoublegroupempty\meta_unique_graphic}
\def\meta_unique_graphic#1#2%
{\meta_begin_graphic_group{#1}%
-% \setupMPvariables[\currentMPgraphicname][#2]%
\setupMPvariables[#1][#2]%
\csname\??mpgraphic#1\endcsname\empty
\meta_end_graphic_group}
@@ -723,6 +733,8 @@
\unexpanded\def\startuseMPgraphic
{\dodoublegroupempty\meta_start_use_graphic}
+\let\stopuseMPgraphic\relax
+
% \def\meta_start_use_graphic#1#2#3\stopuseMPgraphic
% {\setgvalue{\??mpgraphic#1}{\meta_handle_use_graphic{#1}{#2}{#3}}}
%
@@ -741,13 +753,10 @@
\unexpanded\def\meta_start_use_graphic_indeed#1#2#3\stopuseMPgraphic
{\setgvalue{\??mpgraphic#1}{\meta_handle_use_graphic{#1}{#2}{#3}}}
-\let\stopuseMPgraphic\relax
-
\unexpanded\def\startusableMPgraphic % redundant but handy
{\dodoublegroupempty\meta_start_usable_graphic}
-% \def\meta_start_usable_graphic#1#2#3\stopusableMPgraphic
-% {\setgvalue{\??mpgraphic#1}{\meta_handle_use_graphic{#1}{#2}{#3}}}
+\let\stopusableMPgraphic\relax
\def\meta_start_usable_graphic#1%
{\normalexpanded{\meta_start_usable_graphic_indeed{#1}}}
@@ -755,8 +764,6 @@
\unexpanded\def\meta_start_usable_graphic_indeed#1#2#3\stopusableMPgraphic
{\setgvalue{\??mpgraphic#1}{\meta_handle_use_graphic{#1}{#2}{#3}}}
-\let\stopusableMPgraphic\relax
-
\def\meta_handle_reusable_graphic#1#2#3%
{\begingroup
\edef\currentmpvariableclass{#1}%
@@ -774,8 +781,7 @@
\unexpanded\def\startreusableMPgraphic
{\dodoublegroupempty\meta_start_reusable_graphic}
-% \def\meta_start_reusable_graphic#1#2#3\stopreusableMPgraphic
-% {\setgvalue{\??mpgraphic#1}{\meta_handle_reusable_graphic{#1}{#2}{#3}}}
+\let\stopreusableMPgraphic\relax
\def\meta_start_reusable_graphic#1%
{\normalexpanded{\meta_start_reusable_graphic_indeed{#1}}}
@@ -783,18 +789,9 @@
\unexpanded\def\meta_start_reusable_graphic_indeed#1#2#3\stopreusableMPgraphic
{\setgvalue{\??mpgraphic#1}{\meta_handle_reusable_graphic{#1}{#2}{#3}}}
-\let\stopreusableMPgraphic\relax
-
\unexpanded\def\useMPgraphic
{\dodoublegroupempty\meta_use_graphic}
-% \def\meta_use_graphic#1#2%
-% {\meta_begin_graphic_group{#1}%
-% %\doifsomething{#2}{\setupMPvariables[\currentMPgraphicname][#2]}%
-% \doifsomething{#2}{\setupMPvariables[#1][#2]}%
-% \csname\??mpgraphic#1\endcsname\empty
-% \meta_end_graphic_group}
-
\def\meta_use_graphic#1#2%
{\meta_begin_graphic_group{#1}%
\ifcsname\??mpgraphic#1\endcsname
@@ -822,9 +819,6 @@
\def\m_meta_page_prefix{\doifelseoddpage oe}
-% \def\overlaypagestamp
-% {\m_meta_page_prefix:\overlaywidth:\overlayheight:\overlaydepth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor}
-
\def\overlaypagestamp
{\m_meta_page_prefix :%
\the\d_overlay_width :%
@@ -838,9 +832,7 @@
\unexpanded\def\startuniqueMPpagegraphic
{\dodoublegroupempty\meta_start_unique_page_graphic}
-% \def\meta_start_unique_page_graphic#1#2#3\stopuniqueMPpagegraphic % inefficient, double storage
-% {\setgvalue{\??mpgraphic o:#1}{\meta_handle_unique_graphic{o:#1}{#2}{#3}}% % but these also keep the state
-% \setgvalue{\??mpgraphic e:#1}{\meta_handle_unique_graphic{e:#1}{#2}{#3}}} % and meaning will be redefined
+\let\stopuniqueMPpagegraphic\relax
\def\meta_start_unique_page_graphic#1%
{\normalexpanded{\meta_start_unique_page_graphic_indeed{#1}}}
@@ -849,15 +841,12 @@
{\setgvalue{\??mpgraphic o:#1}{\meta_handle_unique_graphic{o:#1}{#2}{#3}}% % but these also keep the state
\setgvalue{\??mpgraphic e:#1}{\meta_handle_unique_graphic{e:#1}{#2}{#3}}} % and meaning will be redefined
-\let\stopuniqueMPpagegraphic\relax
-
\unexpanded\def\uniqueMPpagegraphic
{\dodoublegroupempty\meta_unique_page_graphic}
\def\meta_unique_page_graphic#1#2%
{\meta_begin_graphic_group{#1}%
\let\overlaystamp\overlaypagestamp
-% \setupMPvariables[\m_meta_page_prefix:\currentMPgraphicname][#2]% prefix is new here
\setupMPvariables[\m_meta_page_prefix:#1][#2]% prefix is new here
\csname\??mpgraphic\m_meta_page_prefix:#1\endcsname\empty
\meta_end_graphic_group}
@@ -954,6 +943,8 @@
\unexpanded\def\startMPcode
{\dosinglegroupempty\meta_start_code}
+\let\stopMPcode\relax
+
\def\meta_start_code
{\iffirstargument
\expandafter\meta_start_code_instance
@@ -978,8 +969,6 @@
\meta_process_graphic{#2}%
\endgroup}
-\let\stopMPcode\relax
-
\unexpanded\def\MPcode
{\dodoublegroupempty\meta_code}
@@ -1425,6 +1414,8 @@
\setbox\nextbox\hpack\bgroup
\dosinglegroupempty\meta_start_calculation}
+\let\stopMPcalculation\relax
+
\def\meta_start_calculation
{\iffirstargument
\expandafter\meta_start_calculation_instance
@@ -1449,8 +1440,6 @@
\egroup
\endgroup}
-\let\stopMPcalculation\relax
-
%D \macros
%D {setupMPgraphics}
%D
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-ini.mkxl b/Master/texmf-dist/tex/context/base/mkiv/meta-ini.mkxl
new file mode 100644
index 00000000000..e08aa560a71
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-ini.mkxl
@@ -0,0 +1,1465 @@
+%D \module
+%D [ file=meta-ini,
+%D version=2008.03.25,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\ currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% initializations:
+%
+% - pass settings from tex to mp (delayed expansion)
+% - used by context core (and modules)
+% - cummulative definitions
+% - flushed each graphic
+% - can be disabled per instance
+% - managed at the tex end
+%
+% extensions:
+%
+% - add mp functionality (immediate expansion)
+% - cummulative
+% - all instances or subset of instances
+% - can be disabled per instance
+% - managed at the lua/mp end
+% - could be managed at the tex end but no real reason and also messy
+%
+% definitions:
+%
+% - add mp functionality (delayed expansion)
+% - cummulative
+% - per instance
+% - managed at the tex end
+%
+% inclusions:
+%
+% - add mp functionality (delayed expansion)
+% - cummulative only when [+]
+% - per instance
+% - managed at the tex end
+%
+% order of execution:
+%
+% definitions
+% extensions
+% inclusions
+% beginfig
+% initializations
+% graphic
+% endfig
+
+% The instance will be implemented stepwise ... I should redo some code in order to
+% make the macros look better than they do now.
+
+\writestatus{loading}{MetaPost Graphics / Initializations}
+
+\registerctxluafile{meta-ini}{}
+
+\unprotect
+
+\newtoks \everyMPgraphic % mp % public or not ?
+
+\appendtoks
+ \restoreendofline % see interferences-001.tex
+\to \everyMPgraphic
+
+\def\MPruntimefile {mprun}
+\def\currentMPformat {metafun}
+\def\defaultMPinstance{metafun}
+
+\installcorenamespace{mpinstance}
+\installcorenamespace{mpinclusions}
+\installcorenamespace{mpdefinitions}
+\installcorenamespace{mpgraphic}
+\installcorenamespace{mpstaticgraphic}
+\installcorenamespace{mpclip}
+
+\newtoks \t_meta_initializations % tex, each
+\def \t_meta_inclusions {\csname\??mpinclusions \currentMPinstance\endcsname} % token register
+\def \t_meta_definitions {\csname\??mpdefinitions\currentMPinstance\endcsname} % token register
+
+%D The next command is, of course, dedicated to Mojca, who needs it for gnuplot.
+%D Anyway, the whole multiple engine mechanism is to keep her gnuplot from
+%D interfering.
+
+\unexpanded\def\startMPdefinitions
+ {\dosinglegroupempty\meta_start_definitions}
+
+\def\meta_start_definitions#1#2\stopMPdefinitions
+ {\let\m_meta_saved_instance\currentMPinstance
+ \edef\currentMPinstance{#1}%
+ \ifx\currentMPinstance\empty
+ \let\currentMPinstance\defaultMPinstance
+ \fi
+ \gtoksapp\t_meta_definitions{#2}%
+ \let\currentMPinstance\m_meta_saved_instance}
+
+\let\stopMPdefinitions\relax
+
+\unexpanded\def\startMPextensions
+ {\dosinglegroupempty\meta_start_extensions}
+
+\def\meta_start_extensions#1#2\stopMPextensions % we could use buffers instead
+ {\clf_setmpextensions{#1}{#2}}
+
+\let\stopMPextensions\relax
+
+\unexpanded\def\startMPinitializations#1\stopMPinitializations % for all instances, when enabled
+ {\gtoksapp\t_meta_initializations{#1}}
+
+\let\stopMPinitializations\relax
+
+\unexpanded\def\startMPinclusions
+ {\dosingleempty\meta_start_inclusions}
+
+\unexpanded\def\meta_start_inclusions[#1]%
+ {\edef\m_meta_option{#1}%
+ \dosinglegroupempty\meta_start_inclusions_indeed}
+
+\def\meta_start_inclusions_indeed#1#2\stopMPinclusions
+ {\let\m_meta_saved_instance\currentMPinstance
+ \edef\currentMPinstance{#1}%
+ \ifx\currentMPinstance\empty
+ \let\currentMPinstance\defaultMPinstance
+ \fi
+ \ifx\m_meta_option\!!plustoken \else
+ \global\t_meta_inclusions\emptytoks
+ \fi
+ \gtoksapp\t_meta_inclusions{#2}%
+ \let\currentMPinstance\m_meta_saved_instance}
+
+\let\stopMPinclusions\relax
+
+\unexpanded\def\MPinclusions
+ {\dosingleempty\meta_inclusions}
+
+\def\meta_inclusions[#1]%
+ {\edef\m_meta_option{#1}%
+ \dosinglegroupempty\meta_inclusions_indeed}
+
+\def\meta_inclusions_indeed#1#2%
+ {\let\m_meta_saved_instance\currentMPinstance
+ \edef\currentMPinstance{#1}%
+ \ifx\currentMPinstance\empty
+ \let\currentMPinstance\defaultMPinstance
+ \fi
+ \ifx\m_meta_option\!!plustoken \else
+ \global\t_meta_inclusions\emptytoks
+ \fi
+ \gtoksapp\t_meta_inclusions{#2}%
+ \let\currentMPinstance\m_meta_saved_instance}
+
+\installcommandhandler \??mpinstance {MPinstance} \??mpinstance
+
+\setupMPinstance
+ [\s!format=metafun,
+ \s!extensions=\v!no,
+ \s!initializations=\v!no,
+ \c!method=\s!default,
+ \c!textstyle=,
+ \c!textcolor=]
+
+\appendtoks
+ \ifcsname\??mpdefinitions\currentMPinstance\endcsname \else
+ \expandafter\newtoks\csname\??mpdefinitions\currentMPinstance\endcsname
+ \fi
+ \ifcsname\??mpinclusions\currentMPinstance\endcsname \else
+ \expandafter\newtoks\csname\??mpinclusions\currentMPinstance\endcsname
+ \fi
+ \t_meta_definitions\emptytoks % in case we redefine
+ \t_meta_inclusions \emptytoks % in case we redefine
+\to \everydefineMPinstance
+
+\unexpanded\def\resetMPinstance[#1]%
+ {\writestatus\m!metapost{reset will be implemented when needed}}
+
+\def\meta_analyze_graphicname[#1]%
+ %{\normalexpanded{\meta_analyze_graphicname_indeed[#1::::]}}
+ {\normalexpanded{\meta_analyze_graphicname_indeed[#1}::::]}
+
+\def\meta_show_properties_indeed
+ {\writestatus{metapost}{name: \currentMPgraphicname, instance: \currentMPinstance, format: \currentMPformat}}
+
+\let\meta_show_properties\donothing
+
+\installtextracker
+ {metapost.properties}
+ {\let\meta_show_properties\meta_show_properties_indeed}
+ {\let\meta_show_properties\donothing}
+
+\unexpanded\def\meta_analyze_graphicname_indeed[#1::#2::#3]% instance ::
+ {\edef\currentMPgraphicname{#2}%
+ \ifx\currentMPgraphicname\empty
+ \edef\currentMPgraphicname{#1}%
+ \let\currentMPinstance\defaultMPinstance
+ \orelse\ifcsname\??mpdefinitions#1\endcsname
+ \edef\currentMPinstance{#1}%
+ \else
+ \let\currentMPinstance\defaultMPinstance
+ \fi
+ \edef\currentMPformat{\MPinstanceparameter\s!format}%
+ \meta_show_properties}
+
+\def\currentMPgraphicname{\s!unknown}
+\def\currentMPinstance {\defaultMPinstance}
+\def\currentMPformat {\currentMPinstance}
+
+\defineMPinstance[metafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
+\defineMPinstance[minifun] [\s!format=minifun,\s!extensions=\v!yes,\s!initializations=\v!yes]
+\defineMPinstance[extrafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
+\defineMPinstance[lessfun] [\s!format=metafun]
+\defineMPinstance[doublefun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!double]
+\defineMPinstance[binaryfun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!binary]
+\defineMPinstance[decimalfun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes,\c!method=\s!decimal]
+
+\defineMPinstance[mprun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
+
+\defineMPinstance[metapost] [\s!format=mpost]
+\defineMPinstance[nofun] [\s!format=mpost]
+\defineMPinstance[doublepost] [\s!format=mpost,\c!method=\s!double]
+\defineMPinstance[binarypost] [\s!format=mpost,\c!method=\s!binary]
+\defineMPinstance[decimalpost][\s!format=mpost,\c!method=\s!decimal]
+
+\defineMPinstance[simplefun] [\s!format=metafun,\c!method=\s!double] % maybe use minifun
+
+%defineMPinstance[megapost] [\s!format=mpost,\c!method=\s!decimal]
+
+\newconditional\c_meta_include_initializations
+
+\def\meta_begin_graphic_group#1%
+ {\begingroup
+ \meta_analyze_graphicname[#1]}
+
+\def\meta_end_graphic_group
+ {\endgroup}
+
+\def\MPaskedfigure{false}
+
+\def\meta_flush_current_initializations
+ {\ifconditional\c_meta_include_initializations
+ \the\t_meta_initializations
+ \fi}
+
+\def\meta_flush_current_inclusions
+ {\the\t_meta_inclusions}
+
+\def\meta_flush_current_definitions
+ {\the\t_meta_definitions}
+
+\def\meta_start_current_graphic
+ {\begingroup
+ \meta_enable_include
+ \the\everyMPgraphic
+ \edef\p_initializations{\MPinstanceparameter\s!initializations}%
+ \ifx\p_initializations\v!yes
+ \settrue \c_meta_include_initializations
+ \else
+ \setfalse\c_meta_include_initializations
+ \fi
+ \edef\p_setups{\MPinstanceparameter\c!setups}%
+ \ifx\p_setups\empty \else
+ \setups[\p_setups]%
+ \fi
+ \useMPinstancestyleparameter\c!textstyle}
+
+\def\meta_set_current_color
+ {\useMPinstancecolorparameter\c!textcolor}
+
+\def\meta_stop_current_graphic
+ {\global\t_meta_definitions\emptytoks
+ \global\t_meta_inclusions\emptytoks
+ \endgroup}
+
+\def\meta_process_graphic_start
+ {\pushMPboundingbox
+ \setbox\b_meta_graphic\hpack\bgroup}
+
+\let\meta_relocate_graphic\relax % experimental hook
+
+\def\meta_process_graphic_stop
+ {\egroup
+ \meta_place_graphic
+ \meta_relocate_graphic
+ \popMPboundingbox}
+
+\unexpanded\def\meta_process_graphic_instance#1%
+ {\edef\currentMPinstance{#1}%
+ \ifx\currentMPinstance\empty
+ \let\currentMPinstance\defaultMPinstance
+ \fi
+ \edef\currentMPformat{\MPinstanceparameter\s!format}%
+ \meta_process_graphic}
+
+\unexpanded\def\meta_process_graphic#1% todo: extensions and inclusions outside beginfig
+ {\meta_start_current_graphic
+ \forgetall
+ \edef\p_extensions{\MPinstanceparameter\s!extensions}%
+ \meta_process_graphic_start
+ \normalexpanded{\noexpand\clf_mpgraphic
+ instance {\currentMPinstance}%
+ format {\currentMPformat}%
+ data {#1;}%
+ initializations {\meta_flush_current_initializations}%
+ \ifx\p_extensions\v!yes
+ extensions {\clf_getmpextensions{\currentMPinstance}}% goes through tex again
+ \fi
+ inclusions {\meta_flush_current_inclusions}%
+ definitions {\meta_flush_current_definitions}%
+ figure {\MPaskedfigure}%
+ method {\MPinstanceparameter\c!method}%
+ namespace {\??graphicvariable\currentmpvariableclass:}%
+ \relax}%
+ \meta_process_graphic_stop
+ \meta_stop_current_graphic}
+
+\let\meta_process_graphic_figure_start\relax
+\let\meta_process_graphic_figure_stop \relax
+
+\unexpanded\def\processMPfigurefile#1% special case: obeys beginfig .. endfig and makes pages
+ {\begingroup
+ \let\normal_meta_process_graphic_start\meta_process_graphic_start
+ \let\normal_meta_process_graphic_stop \meta_process_graphic_stop
+ \let\meta_process_graphic_start\relax
+ \let\meta_process_graphic_stop \relax
+ \def\meta_process_graphic_figure_start{\startTEXpage[\c!offset=\v!overlay,\c!align=]\normal_meta_process_graphic_start}%
+ \def\meta_process_graphic_figure_stop {\normal_meta_process_graphic_stop\stopTEXpage}
+ \def\MPaskedfigure{all}%
+ \meta_process_graphic{input "#1" ;}%
+ \endgroup}
+
+%D Calling up previously defined graphics.
+
+% \def\includeMPgraphic#1% gets expanded !
+% {\ifcsname\??mpgraphic#1\endcsname
+% \csname\??mpgraphic#1\endcsname ; % ; is safeguard
+% \fi}
+%
+% \unexpanded\def\meta_enable_include % public
+% {\let\meta_handle_use_graphic \thirdofthreearguments
+% \let\meta_handle_reusable_graphic\thirdofthreearguments}
+%
+% but ... we want this too:
+%
+% \startuseMPgraphic{x}
+% draw textext("\externalfigure[foo.pdf]") ;
+% \stopuseMPgraphic
+%
+% \useMPgraphic{x}
+%
+% so we cannot overload unless we let back to the original meanings each graphic
+% ... a better solution is:
+
+\def\includeMPgraphic#1% gets expanded !
+ {\ifcsname\??mpgraphic#1\endcsname
+ \doubleexpandafter\fourthoffourarguments\lastnamedcs ; % ; is safeguard
+ \fi}
+
+\let\meta_enable_include\relax
+
+%D Drawings (stepwise built):
+
+\newif\ifMPdrawingdone \MPdrawingdonefalse
+
+\unexpanded\def\finalizeMPdrawing
+ {\MPdrawingdonetrue}
+
+\let\MPdrawingdata\empty
+
+\unexpanded\def\resetMPdrawing
+ {\glet\MPdrawingdata\empty
+ \global\MPdrawingdonefalse}
+
+\unexpanded\def\pushMPdrawing
+ {\globalpushmacro\MPdrawingdata
+ \glet\MPdrawingdata\empty}
+
+\unexpanded\def\popMPdrawing
+ {\globalpopmacro\MPdrawingdata}
+
+\unexpanded\def\getMPdrawing
+ {\ifMPdrawingdone
+ \expandafter\meta_process_graphic\expandafter{\MPdrawingdata}% is this expansion still needed?
+ \fi}
+
+\def\startMPdrawing
+ {\dosingleempty\meta_start_drawing}
+
+\def\meta_start_drawing[#1]#2\stopMPdrawing % to be redone, this ascii stuff
+ {\relax
+ \bgroup
+ \meta_enable_include
+ \doifelse{#1}{-}{\convertargument#2\to\asciia}{\def\asciia{#2}}%
+ \xdef\MPdrawingdata{\MPdrawingdata\asciia}%
+ \egroup}
+
+\let\stopMPdrawing\relax
+
+\def\MPdrawing#1%
+ {\relax
+ \bgroup
+ \meta_enable_include
+ \xdef\MPdrawingdata{\MPdrawingdata#1}%
+ \egroup}
+
+\unexpanded\def\startMPclip#1#2\stopMPclip % todo: store at the lua end or just store less
+ {\setgvalue{\??mpclip#1}{#2}}
+
+\let\stopMPclip\relax
+
+\unexpanded\def\meta_grab_clip_path#1#2#3%
+ {\begingroup
+ \d_overlay_width #2\relax
+ \d_overlay_height#3\relax
+ \edef\width {\the\d_overlay_width \space}%
+ \edef\height{\the\d_overlay_height\space}%
+ \edef\currentMPclip{#1}%
+ \ifcsname\??mpclip\currentMPclip\endcsname
+ \meta_grab_clip_path_yes
+ \else
+ \meta_grab_clip_path_nop
+ \fi
+ \endgroup}
+
+\def\meta_grab_clip_path_yes
+ {\meta_start_current_graphic
+ \normalexpanded{\noexpand\clf_mpsetclippath
+ instance {\currentMPinstance}%
+ format {\currentMPformat}%
+ data {\csname\??mpclip\currentMPclip\endcsname}%
+ initializations {\meta_flush_current_initializations}%
+ useextensions {\MPinstanceparameter\s!extensions}%
+ inclusions {\meta_flush_current_inclusions}%
+ method {\MPinstanceparameter\c!method}%
+ width \d_overlay_width
+ height \d_overlay_height
+ \relax}%
+ \meta_stop_current_graphic}
+
+\def\meta_grab_clip_path_nop
+ {\clf_mpsetclippath
+ width \d_overlay_width
+ height \d_overlay_height
+ \relax}
+
+%D Since we want labels to follow the document settings, we also set the font
+%D related variables.
+
+\unexpanded\def\MPfontsizehskip#1%
+ {\dontleavehmode
+ \begingroup
+ \definedfont[#1]%
+ \hskip\clf_currentdesignsize\scaledpoint\relax
+ \endgroup}
+
+\definefontsynonym[MetafunDefault][Regular*default]
+
+\startMPinitializations % scale is not yet ok
+ defaultfont:="\truefontname{MetafunDefault}";
+ % defaultscale:=\the\bodyfontsize/10pt; % only when hard coded 10pt
+ % defaultscale:=1;
+\stopMPinitializations
+
+%D A signal that we're in combined \CONTEXT||\METAFUN mode:
+
+\startMPextensions
+ string contextversion;contextversion:="\contextversion"; % expanded
+\stopMPextensions
+
+%D \macros
+%D {setupMPvariables}
+%D
+%D When we build collections of \METAPOST\ graphics, like background and buttons,
+%D the need for passing settings arises. By (mis|)|using the local prefix that
+%D belongs to \type {\framed}, we get a rather natural interface to backgrounds. To
+%D prevent conflicts, we will use the \type {-} in \METAPOST\ specific variables,
+%D like:
+%D
+%D \starttyping
+%D \setupMPvariables[meta:button][size=20pt]
+%D \stoptyping
+
+% \lineheight 2pt 2 \scratchcounter red 0.4 .5\bodyfontsize
+%
+% see cont-loc for test code
+
+%D Currently the inheritance of backgrounds does not work and we might drop it
+%D anyway (too messy)
+
+\newbox\b_meta_variable_box
+
+\let \currentmpvariableclass \empty
+\let \m_meta_current_variable \empty
+\let \m_meta_current_variable_template\empty
+
+\installcorenamespace{graphicvariable}
+
+\def\meta_prepare_variable_default{\MPcolor{black}} % just to be sure we use a color but ...
+
+\unexpanded\def\setupMPvariables
+ {\dodoubleempty\meta_setup_variables}
+
+\def\meta_setup_variables[#1][#2]%
+ {\ifsecondargument
+ \getrawparameters[\??graphicvariable#1:][#2]%
+ \else
+ \getrawparameters[\??graphicvariable:][#1]%
+ \fi}
+
+\unexpanded\def\presetMPvariable
+ {\dodoubleargument\meta_preset_variable}
+
+\def\meta_preset_variable[#1][#2=#3]%
+ {\ifcsname\??graphicvariable#1:#2\endcsname \else
+ \setvalue{\??graphicvariable#1:#2}{#3}%
+ \fi}
+
+\def\MPrawvar#1#2% no checking
+ {\begincsname\??graphicvariable#1:#2\endcsname}
+
+\def\MPvariable#1% todo: could be a framed chain
+ {\begincsname\??graphicvariable\currentmpvariableclass:#1\endcsname}
+
+\unexpanded\def\useMPvariables
+ {\dodoubleargument\meta_use_variables}
+
+\def\meta_use_variables[#1][#2]%
+ {\edef\currentmpvariableclass{#1}%
+ \meta_prepare_variables{#2}}
+
+\unexpanded\def\meta_prepare_variables#1%
+ {\processcommalist[#1]\meta_prepare_variable}
+
+\unexpanded\def\meta_prepare_variable#1%
+ {\edef\m_meta_current_variable_template
+ {\??graphicvariable\currentmpvariableclass:#1}%
+ \edef\m_meta_current_variable
+ {\begincsname\m_meta_current_variable_template\endcsname}%
+ \ifx\m_meta_current_variable\empty
+ \expandafter\meta_prepare_variable_nop
+ \else
+ \expandafter\meta_prepare_variable_yes
+ \fi}
+
+\unexpanded\def\meta_prepare_instance_variables
+ {\expandafter\processcommalist\expandafter[\m_meta_instance_variables]\meta_prepare_instance_variable}
+
+\unexpanded\def\meta_prepare_instance_variable#1%
+ {\edef\m_meta_current_variable_template
+ {\??graphicvariable\currentmpvariableclass:#1}%
+ \edef\m_meta_current_variable
+ {\ifcsname\m_meta_current_variable_template\endcsname
+ \lastnamedcs
+ \else
+ \begincsname\??graphicvariable\currentMPgraphicname:#1\endcsname
+ \fi}%
+ \ifx\m_meta_current_variable\empty
+ \expandafter\meta_prepare_variable_nop
+ \else
+ \expandafter\meta_prepare_variable_yes
+ \fi}
+
+\def\meta_prepare_variable_nop
+ {\expandafter \let\csname\m_meta_current_variable_template\endcsname\meta_prepare_variable_default}
+
+\def\meta_prepare_variable_color % we use the attribute so we dont' go through namedcolor (why not)
+ {\expandafter\edef\csname\m_meta_current_variable_template\endcsname{\MPcolor\m_meta_current_variable}}
+
+\def\meta_prepare_variable_number
+ {\expandafter\edef\csname\m_meta_current_variable_template\endcsname{\number\m_meta_current_variable}}% also accepts 0.number
+
+\def\meta_prepare_variable_dimension
+ {\expandafter\edef\csname\m_meta_current_variable_template\endcsname{\the\dimexpr\m_meta_current_variable}}
+
+\def\meta_prepare_variable_yes
+ {\ifchkdim\m_meta_current_variable\or
+ \meta_prepare_variable_dimension
+ \else\ifchknum\m_meta_current_variable\or
+ \meta_prepare_variable_number
+ \else
+ \doifelsecolor\m_meta_current_variable
+ \meta_prepare_variable_color
+ \meta_prepare_variable_dimension
+ \fi\fi}
+
+\let\MPvar \MPvariable
+\let\setMPvariables\setupMPvariables
+
+%D \macros
+%D {startuniqueMPgraphic, uniqueMPgraphic}
+%D
+%D This macros is probably of most use to myself, since I like to use graphics that
+%D adapt themselves. The next \METAPOST\ kind of graphic is both unique and reused
+%D when possible.
+%D
+%D \starttyping
+%D \defineoverlay[example][\uniqueMPgraphic{test}]
+%D
+%D \startuniqueMPgraphic {test}
+%D draw OverlayBox ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic {test}
+%D draw OverlayBox ;
+%D \stopuniqueMPgraphic
+%D \stoptyping
+
+\def\overlaystamp % watch the \MPcolor, since colors can be redefined
+ {\the\d_overlay_width :%
+ \the\d_overlay_height :%
+ \the\d_overlay_depth :%
+ \the\d_overlay_offset :%
+ \the\d_overlay_linewidth:%
+ \MPcolor\overlaycolor :% % todo, expand once \m_overlaycolor
+ \MPcolor\overlaylinecolor} % todo, expand once \m_overlaylinecolor
+
+%D A better approach is to let additional variables play a role in determining the
+%D uniqueness. In the next macro, the second, optional, argument is used to
+%D guarantee the uniqueness, as well as prepare variables for passing them to
+%D \METAPOST.
+%D
+%D \starttyping
+%D \startuniqueMPgraphic{meta:hash}{gap,angle,...}
+%D \stoptyping
+%D
+%D The calling macro also accepts a second argument. For convenient use in overlay
+%D definitions, we use \type {{}} instead of \type {[]}.
+%D
+%D \starttyping
+%D \uniqueMPgraphic{meta:hash}{gap=10pt,angle=30}
+%D \stoptyping
+
+\newcount\c_meta_object_counter
+\newbox \b_meta_graphic
+
+% hm, isn't this already done elsewhere?
+
+\unexpanded\def\meta_obey_box_depth
+ {\setbox\b_meta_graphic\hpack\bgroup
+ \raise\MPlly\box\b_meta_graphic
+ \egroup}
+
+\unexpanded\def\meta_ignore_box_depth
+ {\normalexpanded
+ {\meta_obey_box_depth % hence the \unexpanded
+ \wd\b_meta_graphic\the\wd\b_meta_graphic
+ \ht\b_meta_graphic\the\ht\b_meta_graphic
+ \dp\b_meta_graphic\the\dp\b_meta_graphic}}
+
+\unexpanded\def\meta_obey_box_origin
+ {\setbox\b_meta_graphic\hpack\bgroup
+ \kern\MPllx\raise\MPlly\box\b_meta_graphic
+ \egroup}
+
+\unexpanded\def\obeyMPboxdepth {\let\meta_relocate_box\meta_obey_box_depth}
+\unexpanded\def\ignoreMPboxdepth{\let\meta_relocate_box\meta_ignore_box_depth}
+\unexpanded\def\obeyMPboxorigin {\let\meta_relocate_box\meta_obey_box_origin}
+\unexpanded\def\normalMPboxdepth{\let\meta_relocate_box\relax}
+
+\let\meta_relocate_box\relax
+
+\unexpanded\def\meta_place_graphic % the converter also displaces so in fact we revert
+ {\meta_relocate_box
+ \box\b_meta_graphic}
+
+\unexpanded\def\meta_reuse_box#1#2#3#4#5% space delimiting would save some tokens
+ {\MPllx#2\MPlly#3\MPurx#4\MPury#5%
+ \hpack{\forcecolorhack\getobject{MP}{#1}}} % else no proper color intent
+
+\unexpanded\def\meta_use_box
+ {\setunreferencedobject{MP}}
+
+\def\meta_handle_unique_graphic#1#2#3% when there are too many, we can store data at the lua end, although,
+ {\begingroup % when there are that many they're probably not that unique anyway
+ \edef\currentmpvariableclass{#1}%
+ \extendMPoverlaystamp{#2}% incl prepare
+ \ifcsname\??mpgraphic\overlaystamp:#1\endcsname
+ \lastnamedcs
+ \else
+ \meta_enable_include % redundant
+ \global\advance\c_meta_object_counter\plusone
+ \meta_use_box{\number\c_meta_object_counter}\hpack{\meta_process_graphic{#3}}% was vbox, graphic must end up as hbox
+ \setxvalue{\??mpgraphic\overlaystamp:#1}{\meta_reuse_box{\number\c_meta_object_counter}{\the\MPllx}{\the\MPlly}{\the\MPurx}{\the\MPury}}%
+ \csname\??mpgraphic\overlaystamp:#1\endcsname\empty
+ \fi
+ \endgroup}
+
+\unexpanded\def\startuniqueMPgraphic
+ {\dodoublegroupempty\meta_start_unique_graphic}
+
+\let\stopuniqueMPgraphic\relax
+
+\def\meta_start_unique_graphic#1%
+ {\normalexpanded{\meta_start_unique_graphic_indeed{#1}}}
+
+\unexpanded\def\meta_start_unique_graphic_indeed#1#2#3\stopuniqueMPgraphic
+ {\setgvalue{\??mpgraphic#1}{\meta_handle_unique_graphic{#1}{#2}{#3}}}
+
+\unexpanded\def\uniqueMPgraphic
+ {\dodoublegroupempty\meta_unique_graphic}
+
+\def\meta_unique_graphic#1#2%
+ {\meta_begin_graphic_group{#1}%
+ \setupMPvariables[#1][#2]%
+ \begincsname\??mpgraphic#1\endcsname\empty
+ \meta_end_graphic_group}
+
+\def\meta_handle_use_graphic#1#2#3%
+ {\begingroup
+ \edef\currentmpvariableclass{#1}%
+ \edef\m_meta_instance_variables{#2}%
+ \ifx\m_meta_instance_variables\empty \else
+ \meta_prepare_instance_variables
+ \fi
+ \meta_enable_include % redundant
+ \meta_process_graphic{#3}%
+ \endgroup}
+
+\unexpanded\def\startuseMPgraphic
+ {\dodoublegroupempty\meta_start_use_graphic}
+
+\let\stopuseMPgraphic\relax
+
+\def\meta_start_use_graphic#1%
+ {\normalexpanded{\meta_start_use_graphic_indeed{#1}}}
+
+\unexpanded\def\meta_start_use_graphic_indeed#1#2#3\stopuseMPgraphic
+ {\setgvalue{\??mpgraphic#1}{\meta_handle_use_graphic{#1}{#2}{#3}}}
+
+\unexpanded\def\startusableMPgraphic % redundant but handy
+ {\dodoublegroupempty\meta_start_usable_graphic}
+
+\let\stopusableMPgraphic\relax
+
+\def\meta_start_usable_graphic#1%
+ {\normalexpanded{\meta_start_usable_graphic_indeed{#1}}}
+
+\unexpanded\def\meta_start_usable_graphic_indeed#1#2#3\stopusableMPgraphic
+ {\setgvalue{\??mpgraphic#1}{\meta_handle_use_graphic{#1}{#2}{#3}}}
+
+\def\meta_handle_reusable_graphic#1#2#3%
+ {\begingroup
+ \edef\currentmpvariableclass{#1}%
+ \edef\m_meta_instance_variables{#2}%
+ \ifx\m_meta_instance_variables\empty \else
+ \meta_prepare_instance_variables
+ \fi
+ \meta_enable_include % redundant
+ \global\advance\c_meta_object_counter\plusone
+ \meta_use_box{\number\c_meta_object_counter}\hpack{\meta_process_graphic{#3}}% was vbox, graphic must end up as hbox
+ \setxvalue{\??mpgraphic#1}{\meta_reuse_box{\number\c_meta_object_counter}{\the\MPllx}{\the\MPlly}{\the\MPurx}{\the\MPury}}%
+ \csname\??mpgraphic#1\endcsname\empty
+ \endgroup}
+
+\unexpanded\def\startreusableMPgraphic
+ {\dodoublegroupempty\meta_start_reusable_graphic}
+
+\let\stopreusableMPgraphic\relax
+
+\def\meta_start_reusable_graphic#1%
+ {\normalexpanded{\meta_start_reusable_graphic_indeed{#1}}}
+
+\unexpanded\def\meta_start_reusable_graphic_indeed#1#2#3\stopreusableMPgraphic
+ {\setgvalue{\??mpgraphic#1}{\meta_handle_reusable_graphic{#1}{#2}{#3}}}
+
+\unexpanded\def\useMPgraphic
+ {\dodoublegroupempty\meta_use_graphic}
+
+\def\meta_use_graphic#1#2%
+ {\meta_begin_graphic_group{#1}%
+ \ifcsname\??mpgraphic#1\endcsname
+ \edef\usedMPgraphicname{#1}%
+ \orelse\ifcsname\??mpgraphic\currentMPgraphicname\endcsname
+ \let\usedMPgraphicname\currentMPgraphicname
+ \else
+ \let\usedMPgraphicname\empty
+ \fi
+ \ifx\usedMPgraphicname\empty
+ % message
+ \else
+ \doifsomething{#2}{\setupMPvariables[\usedMPgraphicname][#2]}%
+ \csname\??mpgraphic\usedMPgraphicname\endcsname
+ \fi
+ \meta_end_graphic_group}
+
+\let\reuseMPgraphic \useMPgraphic % we can save a setup here if needed
+\let\reusableMPgraphic\reuseMPgraphic % we can save a setup here if needed
+
+%D \macros
+%D {startuniqueMPpagegraphic,uniqueMPpagegraphic}
+%D
+%D Experimental.
+
+\def\m_meta_page_prefix{\doifelseoddpage oe}
+
+\def\overlaypagestamp
+ {\m_meta_page_prefix :%
+ \the\d_overlay_width :%
+ \the\d_overlay_height :%
+ \the\d_overlay_depth :%
+ \the\d_overlay_offset :%
+ \the\d_overlay_linewidth:%
+ \MPcolor\overlaycolor :%
+ \MPcolor\overlaylinecolor}
+
+\unexpanded\def\startuniqueMPpagegraphic
+ {\dodoublegroupempty\meta_start_unique_page_graphic}
+
+\let\stopuniqueMPpagegraphic\relax
+
+\def\meta_start_unique_page_graphic#1%
+ {\normalexpanded{\meta_start_unique_page_graphic_indeed{#1}}}
+
+\unexpanded\def\meta_start_unique_page_graphic_indeed#1#2#3\stopuniqueMPpagegraphic % inefficient, double storage
+ {\setgvalue{\??mpgraphic o:#1}{\meta_handle_unique_graphic{o:#1}{#2}{#3}}% % but these also keep the state
+ \setgvalue{\??mpgraphic e:#1}{\meta_handle_unique_graphic{e:#1}{#2}{#3}}} % and meaning will be redefined
+
+\unexpanded\def\uniqueMPpagegraphic
+ {\dodoublegroupempty\meta_unique_page_graphic}
+
+\def\meta_unique_page_graphic#1#2%
+ {\meta_begin_graphic_group{#1}%
+ \let\overlaystamp\overlaypagestamp
+ \setupMPvariables[\m_meta_page_prefix:#1][#2]% prefix is new here
+ \csname\??mpgraphic\m_meta_page_prefix:#1\endcsname\empty
+ \meta_end_graphic_group}
+
+%D One way of defining a stamp is:
+%D
+%D \starttyping
+%D \def\extendMPoverlaystamp#1%
+%D {\def\docommand##1%
+%D {\edef\overlaystamp{\overlaystamp:\MPvariable{##1}}}%
+%D \processcommalist[#1]\docommand}
+%D \stoptyping
+%D
+%D Since we need to feed \METAPOST\ with expanded dimensions, we introduce a
+%D dedicated expansion engine. We redefine \type {\extendMPoverlaystamp} to
+
+\unexpanded\def\extendMPoverlaystamp#1%
+ {\processcommalist[#1]\meta_extend_overlay_stamp}
+
+\def\meta_extend_overlay_stamp#1%
+ {\meta_prepare_instance_variable{#1}%
+ \edef\overlaystamp{\overlaystamp:\MPvariable{#1}}}
+
+\unexpanded\def\getMPdata {\clf_getMPdata}
+ \let\rawMPdata \clf_getMPdata
+
+\unexpanded\def\getMPstored{\clf_getMPstored}
+ \let\rawMPstored \clf_getMPstored
+
+%D We need this trick because we need to make sure that the tex scanner sees
+%D newlines and does not quit. Also, we do need to flush the buffer under a normal
+%D catcode regime in order to expand embedded tex macros. As usual with buffers,
+%D \type {#1} can be a list.
+
+\unexpanded\def\processMPbuffer
+ {\dosingleempty\meta_process_buffer}
+
+\def\meta_process_buffer[#1]%
+ {\meta_begin_graphic_group{#1}%
+ \meta_process_graphic{\clf_feedback{\currentMPgraphicname}}%
+ \meta_end_graphic_group}
+
+\unexpanded\def\runMPbuffer
+ {\dosingleempty\meta_run_buffer}
+
+\def\meta_run_buffer[#1]% processing only
+ {\startnointerference\meta_process_buffer[#1]\stopnointerference}
+
+%D \macros
+%D {startMPenvironment, resetMPenvironment}
+%D
+%D In order to synchronize the main \TEX\ run and the runs local to \METAPOST,
+%D environments can be passed.
+
+\unexpanded\def\startMPenvironment
+ {\begingroup
+ \catcode\endoflineasciicode \ignorecatcode
+ \dosingleempty\meta_start_environment}
+
+\def\meta_start_environment[#1]#2\stopMPenvironment
+ {\endgroup
+ \edef\m_meta_option{#1}
+ \ifx\m_meta_option\s!reset
+ \resetMPenvironment % reset mp toks
+ \orelse\ifx\m_meta_option\v!global
+ #2% % use in main doc too
+ \orelse\ifx\m_meta_option\!!plustoken
+ #2% % use in main doc too
+ \fi
+ \clf_mptexset{\detokenize{#2}}}
+
+\let\stopMPenvironment\relax
+
+\unexpanded\def\resetMPenvironment
+ {\clf_mptexreset}
+
+\unexpanded\def\useMPenvironmentbuffer[#1]%
+ {\clf_mptexsetfrombuffer{#1}}
+
+%D This command takes \type {[reset]} as optional argument.
+%D
+%D \starttyping
+%D \startMPenvironment
+%D \setupbodyfont[pos,14.4pt]
+%D \stopMPenvironment
+%D
+%D \startMPcode
+%D draw btex \sl Hans Hagen etex scaled 5 ;
+%D \stopMPcode
+%D \stoptyping
+%D
+%D The most simple case:
+
+\unexpanded\def\startMPcode
+ {\dosinglegroupempty\meta_start_code}
+
+\let\stopMPcode\relax
+
+\def\meta_start_code
+ {\iffirstargument
+ \expandafter\meta_start_code_instance
+ \else
+ \expandafter\meta_start_code_standard
+ \fi}
+
+\def\meta_start_code_instance#1#2\stopMPcode
+ {\begingroup
+ \edef\currentMPinstance{#1}%
+ \let\currentMPgraphicname\empty
+ \edef\currentMPformat{\MPinstanceparameter\s!format}%
+ \meta_enable_include
+ \meta_process_graphic{#2}%
+ \endgroup}
+
+\def\meta_start_code_standard#1#2\stopMPcode
+ {\begingroup
+ \let\currentMPinstance\defaultMPinstance
+ \let\currentMPgraphicname\empty
+ \edef\currentMPformat{\MPinstanceparameter\s!format}%
+ \meta_process_graphic{#2}%
+ \endgroup}
+
+\unexpanded\def\MPcode
+ {\dodoublegroupempty\meta_code}
+
+\def\meta_code
+ {\ifsecondargument
+ \expandafter\meta_code_instance
+ \else
+ \expandafter\meta_code_standard
+ \fi}
+
+\def\meta_code_instance#1#2%
+ {\meta_begin_graphic_group{#1}%
+ \meta_enable_include
+ \meta_process_graphic{#2}%
+ \meta_end_graphic_group}
+
+\def\meta_code_standard#1#2%
+ {\let\currentMPinstance\defaultMPinstance
+ \meta_enable_include
+ \meta_process_graphic{#1}}
+
+% a bit nasty (also needed for compatibility:
+
+% \startMPrun input mp-www.mp ; \stopMPrun
+% \externalfigure[mprun.3][width=10cm,height=8cm]
+
+% \startMPrun{mprun} input mp-www.mp ; \stopMPrun % instance
+% \externalfigure[mprun.4][width=10cm,height=8cm]
+
+\let\MPruninstance\defaultMPinstance
+
+\unexpanded\def\useMPrun#1#2% name n
+ {\begingroup
+ \def\MPaskedfigure{#2}%
+ \doifelsenothing{#1}
+ {\useMPgraphic{mprun}}%
+ {\useMPgraphic{#1}}%
+ \endgroup}
+
+\unexpanded\def\startMPrun
+ {\dosinglegroupempty\meta_start_run}
+
+\def\meta_start_run#1#2\stopMPrun
+ {\iffirstargument
+ \startuseMPgraphic{#1}#2\stopuseMPgraphic
+ \else
+ \startuseMPgraphic{mprun}#2\stopuseMPgraphic
+ \fi}
+
+\let\stopMPrun\relax
+
+%D The \type {\resetMPenvironment} is a quick way to erase
+%D the token list.
+%D
+%D You should be aware of independencies. For instance, if you use a font
+%D in a graphic that is not used in the main document, you need to load the
+%D typescript at the outer level (either directly or by using the global
+%D option).
+%D
+%D \starttyping
+%D \usetypescript[palatino][texnansi]
+%D
+%D \startMPenvironment
+%D \usetypescript[palatino][texnansi]
+%D \enableregime[utf]
+%D \setupbodyfont[palatino]
+%D \stopMPenvironment
+%D
+%D \startMPpage
+%D draw btex aap‒noot coördinatie – één etex ;
+%D \stopMPpage
+%D \stoptyping
+
+%D Loading specific \METAPOST\ related definitions is
+%D accomplished by:
+
+\unexpanded\def\useMPlibrary[#1]{\clf_useMPlibrary{#1}}
+
+%D \macros
+%D {setMPtext, MPtext, MPstring, MPbetex}
+%D
+%D To be documented:
+%D
+%D \starttyping
+%D \setMPtext{identifier}{text}
+%D
+%D \MPtext {identifier}
+%D \MPstring{identifier}
+%D \MPbetex {identifier}
+%D \stoptyping
+
+\installcorenamespace{mptext}
+
+\unexpanded\def\setMPtext#1#2% todo : #1 must be made : safe
+ {\defconvertedargument\ascii{#2}%
+ \dodoglobal\letvalue{\??mptext#1}\ascii}
+
+\def\MPtext #1{\begincsname\??mptext#1\endcsname\empty}
+\def\MPstring#1{"\begincsname\??mptext#1\endcsname\empty"}
+\def\MPbetex #1{btex \begincsname\??mptext#1\endcsname\space etex}
+
+%D In order to communicate conveniently with the \TEX\ engine, we introduce some
+%D typesetting variables.
+
+% \setupcolors[state=stop,conversion=never] % quite tricky ... type mismatch
+
+% \startMPextensions
+% color OverlayColor,OverlayLineColor;
+% \stopMPextensions
+
+\startMPinitializations
+ CurrentLayout:="\currentlayout";
+\stopMPinitializations
+
+% \startMPinitializations
+% OverlayWidth:=\overlaywidth;
+% OverlayHeight:=\overlayheight;
+% OverlayDepth:=\overlaydepth;
+% OverlayLineWidth:=\overlaylinewidth;
+% OverlayOffset:=\overlayoffset;
+% \stopMPinitializations
+
+%D A dirty trick, ** in colo-ini.lua (mpcolor). We cannot use a vardef, because
+%D that fails with spot colors.
+
+\startMPinitializations
+ def OverlayLineColor=\ifx\overlaylinecolor\empty black \else\MPcolor{\overlaylinecolor} \fi enddef;
+ def OverlayColor =\ifx\overlaycolor \empty black \else\MPcolor{\overlaycolor} \fi enddef;
+\stopMPinitializations
+
+% \newcount\c_overlay_colormodel
+% \newcount\c_overlay_color
+% \newcount\c_overlay_transparency
+% \newcount\c_overlay_linecolor
+% \newcount\c_overlay_linetransparency
+
+% \appendtoks
+% \c_overlay_colormodel \attribute\colormodelattribute
+% \c_overlay_color \colo_helpers_inherited_current_ca\overlaycolor
+% \c_overlay_transparency \colo_helpers_inherited_current_ta\overlaycolor
+% \c_overlay_linecolor \colo_helpers_inherited_current_ca\overlaylinecolor
+% \c_overlay_linetransparency\colo_helpers_inherited_current_ta\overlaylinecolor
+% \to \everyMPgraphic
+
+% \startMPinitializations
+% BaseLineSkip:=\the\baselineskip;
+% LineHeight:=\the\baselineskip;
+% BodyFontSize:=\the\bodyfontsize;
+% %
+% TopSkip:=\the\topskip;
+% StrutHeight:=\strutheight;
+% StrutDepth:=\strutdepth;
+% %
+% CurrentWidth:=\the\hsize;
+% CurrentHeight:=\the\vsize;
+% HSize:=\the\hsize ;
+% VSize:=\the\vsize ;
+% %
+% EmWidth:=\the\emwidth;
+% ExHeight:=\the\exheight;
+% \stopMPinitializations
+
+\appendtoks
+ \disablediscretionaries
+ %\disablecompoundcharacters
+\to \everyMPgraphic
+
+% \appendtoks % before color, inefficient, replace by low level copy
+% \doregistercolor{currentcolor}\currentcolorname
+% \to \everyMPgraphic
+
+% \color[green]{abc \startMPcode
+% fill fullcircle scaled 3cm withoutcolor;
+% fill fullcircle scaled 2cm withcolor \MPcolor{currentcolor} ;
+% fill fullcircle scaled 1cm withcolor \MPcolor{red} ;
+% \stopMPcode def}
+
+\appendtoks
+ \baselineskip1\baselineskip
+ \lineheight 1\lineheight
+ \topskip 1\topskip
+\to \everyMPgraphic
+
+\appendtoks
+ \let \# \letterhash
+ \let \_ \letterunderscore
+ \let \& \letterampersand
+ \let \{ \letteropenbrace
+ \let \} \letterclosebrace
+\to \everyMPgraphic
+
+%D \macros
+%D {PDFMPformoffset}
+%D
+%D In \PDF, forms are clipped and therefore we have to take precautions to get this
+%D right. Since this is related to objects, we use the same offset as used there.
+
+\def\PDFMPformoffset{\objectoffset}
+
+\newtoks\everyinsertMPfile
+
+\startMPextensions
+ def initialize_form_numbers =
+ do_initialize_numbers;
+ enddef;
+\stopMPextensions
+
+\startMPextensions
+ vardef ForegroundBox =
+ unitsquare xysized(HSize,VSize)
+ enddef ;
+\stopMPextensions
+
+% \startMPextensions
+% PageFraction := 1 ;
+% \stopMPextensions
+
+% \startMPinitializations
+% PageFraction := if \lastpage>1: (\realfolio-1)/(\lastpage-1) else: 1 fi ;
+% \stopMPinitializations
+
+\startMPdefinitions {metapost}
+ if unknown context_bare : input mp-bare.mpiv ; fi ;
+\stopMPdefinitions
+\startMPdefinitions {binarypost}
+ if unknown context_bare : input mp-bare.mpiv ; fi ;
+\stopMPdefinitions
+\startMPdefinitions {decimalpost}
+ if unknown context_bare : input mp-bare.mpiv ; fi ;
+\stopMPdefinitions
+\startMPdefinitions {doublepost}
+ if unknown context_bare : input mp-bare.mpiv ; fi ;
+\stopMPdefinitions
+
+% \startMPdefinitions {nofun}
+% if unknown context_bare : input mp-bare.mpiv ; fi ;
+% \stopMPdefinitions
+
+%D And some more. These are not really needed since we don't use the normal figure
+%D inclusion macros any longer.
+
+\appendtoks
+ \externalfigurepostprocessors\emptytoks % safeguard
+\to \everyinsertMPfile
+
+%D We also take care of disabling fancy figure features, that can terribly interfere
+%D when dealing with symbols, background graphics and running (postponed) graphics.
+%D You won't believe me if I tell you what funny side effects can occur. One took me
+%D over a day to uncover when processing the screen version of the \METAFUN\ manual.
+
+\def\doifelseMPgraphic#1%
+ {\ifcsname\??mpgraphic #1\endcsname\expandafter\firstoftwoarguments \orelse
+ \ifcsname\??mpgraphic o:#1\endcsname\expandafter\firstoftwoarguments \orelse
+ \ifcsname\??mpgraphic e:#1\endcsname\expandafter\firstoftwoarguments \else
+ \expandafter\secondoftwoarguments\fi}
+
+\let\doifMPgraphicelse\doifelseMPgraphic
+
+%D New:
+
+\definelayerpreset % no dx,dy - else nasty non-mp placement
+ [mp]
+ [\c!y=-\MPury,
+ \c!x=\MPllx,
+ \c!method=\v!fit]
+
+\definelayer
+ [mp]
+ [\c!preset=mp]
+
+%D Usage:
+%D
+%D \starttyping
+%D \defineviewerlayer[one][state=start]
+%D \defineviewerlayer[two][state=stop]
+%D
+%D \startuseMPgraphic{step-1}
+%D fill fullcircle scaled 10cm withcolor red ;
+%D \stopuseMPgraphic
+%D
+%D \startuseMPgraphic{step-2}
+%D fill fullcircle scaled 5cm withcolor green ;
+%D \stopuseMPgraphic
+%D
+%D \setlayer[mp]{\viewerlayer[one]{\useMPgraphic{step-1}}}
+%D \setlayer[mp]{\viewerlayer[two]{\useMPgraphic{step-2}}}
+%D
+%D \ruledhbox{\flushlayer[mp]}
+%D \stoptyping
+%D
+%D Reusing graphics is also possible (now):
+%D
+%D \starttyping
+%D \startreusableMPgraphic{axis}
+%D tickstep := 1cm ; ticklength := 2mm ;
+%D drawticks unitsquare xscaled 4cm yscaled 3cm shifted (-1cm,-1cm) ;
+%D tickstep := tickstep/2 ; ticklength := ticklength/2 ;
+%D drawticks unitsquare xscaled 4cm yscaled 3cm shifted (-1cm,-1cm) ;
+%D \stopreusableMPgraphic
+%D
+%D \startuseMPgraphic{demo}
+%D drawpoint "1cm,1.5cm" ;
+%D \stopuseMPgraphic
+%D
+%D \definelayer[mp][preset=mp]
+%D \setlayer[mp]{\reuseMPgraphic{axis}}
+%D \setlayer[mp]{\useMPgraphic{demo}}
+%D \ruledhbox{\flushlayer[mp]}
+%D \stoptyping
+
+%D \macros
+%D {startstaticMPfigure,useMPstaticfigure}
+%D
+%D Static figures are processed only when there has been something changed. Here is
+%D Aditya Mahajan's testcase:
+%D
+%D \startbuffer
+%D \startstaticMPfigure{circle}
+%D fill fullcircle scaled 1cm withcolor blue;
+%D \stopstaticMPfigure
+%D
+%D \startstaticMPfigure{axis}
+%D drawarrow (0,0)--(2cm,0) ;
+%D drawarrow (0,0)--(0,2cm) ;
+%D label.llft(textext("(0,0)") ,origin) ;
+%D \stopstaticMPfigure
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\unexpanded\def\startstaticMPfigure#1#2\stopstaticMPfigure
+ {\startreusableMPgraphic{\??mpstaticgraphic#1}#2\stopreusableMPgraphic}
+
+\unexpanded\def\startstaticMPgraphic
+ {\dodoublegroupempty\meta_start_static_graphic}
+
+\def\meta_start_static_graphic#1#2#3\stopstaticMPgraphic
+ {\startreusableMPgraphic{\??mpstaticgraphic#1}{#2}#3\stopreusableMPgraphic}
+
+\let\stopstaticMPfigure \relax
+\let\stopstaticMPgraphic\relax
+
+\unexpanded\def\usestaticMPfigure
+ {\dodoubleempty\meta_use_static_figure}
+
+\def\meta_use_static_figure[#1][#2]%
+ {\ifsecondargument
+ \scale[#2]{\reuseMPgraphic{\??mpstaticgraphic#1}}%
+ \else
+ \reuseMPgraphic{\??mpstaticgraphic#1}%
+ \fi}
+
+%D Goody for preventing overflows:
+
+\def\MPdivten[#1]{\withoutpt\the\dimexpr#1pt/10\relax}
+
+%D There is no way to distinguish the black color that you get when you issue a
+%D \type {draw} without color specification from a color that has an explicit black
+%D specification unless you set the variable \type {defaultcolormodel} to 1.
+%D Hoewever, in that case you cannot distinguish that draw from one with a \type
+%D {withoutcolor} specification. This means that we have to provide multiple
+%D variants of inheritance.
+%D
+%D In any case we need to tell the converter what the inherited color is to start
+%D with. Case~3 is kind of unpredictable as it closely relates to the order in which
+%D paths are flushed. If you want to inherit automatically from the surrounding, you
+%D can best stick to variant 1. Variant 0 (an isolated graphic) is the default.
+%D
+%D \startbuffer
+%D \startuseMPgraphic{test}
+%D drawoptions(withpen pencircle scaled 1pt) ;
+%D def shift_cp = currentpicture := currentpicture shifted (-15pt,0) ; enddef ;
+%D draw fullcircle scaled 10pt withoutcolor ; shift_cp ;
+%D fill fullcircle scaled 10pt ; shift_cp ;
+%D draw fullcircle scaled 10pt withoutcolor ; shift_cp ;
+%D fill fullcircle scaled 10pt withcolor red ; shift_cp ;
+%D draw fullcircle scaled 10pt withoutcolor ; shift_cp ;
+%D fill fullcircle scaled 10pt ; shift_cp ;
+%D \stopuseMPgraphic
+%D
+%D \starttabulate
+%D \NC 0\quad \NC \MPcolormethod0 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
+%D \NC 1\quad \NC \MPcolormethod1 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
+%D \NC 2\quad \NC \MPcolormethod2 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
+%D \NC 3\quad \NC \MPcolormethod3 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\newconstant\MPcolormethod
+
+\appendtoks
+ \clf_mpsetoutercolor
+ \MPcolormethod\space
+ \attribute\colormodelattribute\space
+ \attribute\colorattribute\space
+ \dogetattribute{transparency}\relax
+\to \everyMPgraphic
+
+% \startMPinitializations
+% defaultcolormodel := \ifcase\MPcolormethod1\or1\or3\else3\fi;
+% \stopMPinitializations
+
+%D macros
+%D {mprunvar,mpruntab,mprunset}
+%D
+%D \starttyping
+%D \startMPcode
+%D passvariable("version","1.0") ;
+%D passvariable("number",123) ;
+%D passvariable("string","whatever") ;
+%D passvariable("point",(1.5,2.8)) ;
+%D passvariable("triplet",(1/1,1/2,1/3)) ;
+%D passvariable("quad",(1.1,2.2,3.3,4.4)) ;
+%D passvariable("boolean",false) ;
+%D passvariable("path",fullcircle scaled 1cm) ;
+%D draw fullcircle scaled 20pt ;
+%D \stopMPcode
+%D
+%D \ctxlua{inspect(metapost.variables)}
+%D
+%D \MPrunvar{version} \MPruntab{quad}{3} (\MPrunset{triplet}{,})
+%D
+%D $(x,y) = (\MPruntab{point}{1},\MPruntab{point}{2})$
+%D $(x,y) = (\MPrunset{point}{,})$
+%D \stoptyping
+
+\def\MPrunvar #1{\clf_mprunvar{#1}} \let\mprunvar\MPrunvar
+\def\MPruntab#1#2{\clf_mpruntab{#1}#2\relax} \let\mpruntab\MPruntab % #2 is number
+\def\MPrunset#1#2{\clf_mprunset{#1}{#2}} \let\mprunset\MPrunset
+
+\prependtoks \clf_mppushvariables \to \everybeforepagebody
+\appendtoks \clf_mppopvariables \to \everyafterpagebody
+
+\let\MPpushvariables\clf_mppushvariables
+\let\MPpopvariables \clf_mppopvariables
+
+%D We also provide an outputless run:
+
+\unexpanded\def\startMPcalculation
+ {\begingroup
+ \setbox\nextbox\hpack\bgroup
+ \dosinglegroupempty\meta_start_calculation}
+
+\let\stopMPcalculation\relax
+
+\def\meta_start_calculation
+ {\iffirstargument
+ \expandafter\meta_start_calculation_instance
+ \else
+ \expandafter\meta_start_calculation_standard
+ \fi}
+
+\def\meta_start_calculation_instance#1#2\stopMPcalculation
+ {\edef\currentMPinstance{#1}%
+ \let\currentMPgraphicname\empty
+ \edef\currentMPformat{\MPinstanceparameter\s!format}%
+ \meta_enable_include
+ \meta_process_graphic{#2;draw origin}%
+ \egroup
+ \endgroup}
+
+\def\meta_start_calculation_standard#1#2\stopMPcalculation
+ {\let\currentMPinstance\defaultMPinstance
+ \let\currentMPgraphicname\empty
+ \edef\currentMPformat{\MPinstanceparameter\s!format}%
+ \meta_process_graphic{#2;draw origin}%
+ \egroup
+ \endgroup}
+
+%D \macros
+%D {setupMPgraphics}
+%D
+%D Here is a generic setup command:
+
+\installcorenamespace{MPgraphics}
+
+\installsetuponlycommandhandler \??MPgraphics {MPgraphics}
+
+%D Here we hook in the outer color. When \type {color} is set to \type {global} we
+%D get the outer color automatically. If you change this setting, you should do it
+%D grouped in order not to make other graphics behave in unexpected ways.
+
+\appendtoks
+ \doifelse{\directMPgraphicsparameter\c!color}\v!global{\MPcolormethod\plusone}{\MPcolormethod\zerocount}%
+\to \everysetupMPgraphics
+
+\setupMPgraphics
+ [\c!color=\v!local]
+
+%D This can save some runtime: rename the mpy file from a first run (when stable) to
+%D another file and reuse it. One can also use the original filename, but a copy is
+%D often better.
+%D
+%D \starttyping
+%D \setupMPgraphics
+%D [mpy=\jobname.mpy]
+%D \stoptyping
+
+\appendtoks
+ \edef\p_mpy{\directMPgraphicsparameter{mpy}}%
+ \ifx\p_mpy\empty \else
+ \let\MPdataMPYfile\p_mpy
+ \clf_registermpyfile{\p_mpy}%
+ \fi
+\to \everysetupMPgraphics
+
+%D Some more helpers (see \type {meta-grd.mkiv} for an example of usage):
+
+\def\MPdpar#1#2{\the\dimexpr#1#2\relax\empty}
+\def\MPnpar#1#2{\the\numexpr#1#2\relax\empty}
+\def\MPspar#1#2{"#1#2"}
+
+%D Done.
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-mac.mkxl b/Master/texmf-dist/tex/context/base/mkiv/meta-mac.mkxl
new file mode 100644
index 00000000000..3bf38b4c826
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-mac.mkxl
@@ -0,0 +1,66 @@
+%D \module
+%D [ file=meta-scn,
+%D version=2019.07.19,
+%D title=\METAPOST\ Graphics,
+%D subtitle=LMTX support,
+%D author=Hans Hagen,
+%D date=\ currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\unexpanded\def\defineMPparameterset[#1]{\clf_lmt_parameters_define{#1}}
+\unexpanded\def\presetMPparameters [#1]{\clf_lmt_parameters_preset{#1}}
+\unexpanded\def\resetMPparameters [#1]{\clf_lmt_parameters_reset {#1}}
+
+% \unexpanded\def\useMPgraphic
+% {\doifnextoptionalelse\meta_use_MP_graphic_yes\meta_use_MP_graphic_nop}
+
+% \def\meta_use_MP_graphic_nop
+% {\dodoublegroupempty\meta_use_graphic}
+
+% \def\meta_use_MP_graphic_yes
+% {\dodoubleempty\meta_use_graphic_new}
+
+% \def\meta_use_graphic_new[#1][#2]%
+% {\begingroup
+% % If really needed weh can use grouplevel but normally these graphics are
+% % not nested.
+% \clf_lmt_parameters_preset{#1}[#2]%
+% \meta_use_graphic{#1}{}%
+% \clf_lmt_parameters_reset{#1}%
+% \endgroup}
+
+\unexpanded\def\useMPmacro
+ {\dotripleempty\meta_use_macro}
+
+\def\meta_use_macro[#1][#2][#3]%
+ {\ifthirdargument
+ \meta_begin_graphic_group{#1}%
+ \meta_enable_include
+ \clf_lmt_parameters_preset{#2}[#3]%
+ \meta_process_graphic{lmt_#2;}%
+ \clf_lmt_parameters_reset{#2}%
+ \meta_end_graphic_group
+ \else\ifsecondargument
+ \doifelseassignment{#2}
+ {\let\currentMPinstance\defaultMPinstance
+ \meta_enable_include
+ \clf_lmt_parameters_preset{#1}[#2]%
+ \meta_process_graphic{lmt_#1;}%
+ \clf_lmt_parameters_reset{#1}}%
+ {\meta_begin_graphic_group{#1}%
+ \meta_enable_include
+ \meta_process_graphic{lmt_#1;}%
+ \meta_end_graphic_group}%
+ \else
+ \let\currentMPinstance\defaultMPinstance
+ \meta_enable_include
+ \meta_process_graphic{lmt_#1;}%
+ \fi\fi}
+
+\protect
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-pag.mkiv b/Master/texmf-dist/tex/context/base/mkiv/meta-pag.mkiv
index 6b6abd21135..b147c0af4b1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/meta-pag.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-pag.mkiv
@@ -11,21 +11,19 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D These definitions used to be part of the old \type
-%D {core-mps} file, later changed into \type {meta-ini}, but
-%D keeping them separate is cleaner.
+%D These definitions used to be part of the old \type {core-mps} file, later changed
+%D into \type {meta-ini}, but keeping them separate is cleaner.
\writestatus{loading}{MetaPost Graphics / Page Data Management}
\unprotect
-%D The next few macros tell \METAPOST\ how the \CONTEXT\
-%D pagebody looks.
+%D The next few macros tell \METAPOST\ how the \CONTEXT\ pagebody looks.
-\startMPextensions
- boolean PageStateAvailable;
- PageStateAvailable:=true;
-\stopMPextensions
+% \startMPextensions
+% boolean PageStateAvailable;
+% PageStateAvailable:=true;
+% \stopMPextensions
% maybe always set as frozen anyway
@@ -87,24 +85,22 @@
% NOfColumns:=\number\nofcolumns;
% \stopMPinitializations
-\def\MPonrightpage{true}
-\def\MPonoddpage {true}
+% \def\MPonrightpage{true} % just in case they're used
+% \def\MPonoddpage {true} % just in case they're used
-\def\freezeMPpagelayout
- {\edef\MPonrightpage{\doifbothsides {tru}{tru}{fals}e}%
- \edef\MPonoddpage {\doifelseoddpage {tru}{fals}e}}
+% \def\freezeMPpagelayout
+% {\edef\MPonrightpage{\doifbothsides {tru}{tru}{fals}e}%
+% \edef\MPonoddpage {\doifelseoddpage {tru}{fals}e}}
-%D We need to freeze the pagelayout before the backgrounds
-%D are build, because the overlay will temporarily become
-%D zero (overlay).
+%D We need to freeze the pagelayout before the backgrounds are build, because the
+%D overlay will temporarily become zero (overlay).
-\appendtoks
- \freezeMPpagelayout
-\to \everybeforepagebody
+% \appendtoks
+% \freezeMPpagelayout
+% \to \everybeforepagebody
-%D By freezing these value every graphic, we can use layout
-%D variables that change halfways a page, whatever use that
-%D has.
+%D By freezing these value every graphic, we can use layout variables that change
+%D halfways a page, whatever use that has.
% obsolete (but keep the code)
%
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-pag.mkxl b/Master/texmf-dist/tex/context/base/mkiv/meta-pag.mkxl
new file mode 100644
index 00000000000..86de11eeb5c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-pag.mkxl
@@ -0,0 +1,26 @@
+%D \module
+%D [ file=meta-pag,
+%D version=1999.07.10,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D These definitions used to be part of the old \type {core-mps} file, later changed
+%D into \type {meta-ini}, but keeping them separate is cleaner. In the meantime not
+%D that much is left here.
+
+\writestatus{loading}{MetaPost Graphics / Page Data Management}
+
+\unprotect
+
+\prependtoks
+ \calculatereducedvsizes % bah, this is really needed
+\to \everyMPgraphic
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-pdf.lua b/Master/texmf-dist/tex/context/base/mkiv/meta-pdf.lua
index 5bcd161c02f..5bcbe418606 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/meta-pdf.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-pdf.lua
@@ -44,13 +44,8 @@ local mptopdf = metapost.mptopdf
mptopdf.nofconverted = 0
-local f_translate = formatters["1 0 0 0 1 %.6F %.6F cm"]
-local f_concat = formatters["%.6F %.6F %.6F %.6F %.6F %.6F cm"]
-
-directives.register("pdf.stripzeros",function()
- f_translate = formatters["1 0 0 0 1 %.6N %.6N cm"]
- f_concat = formatters["%.6N %.6N %.6N %.6N %.6N %.6N cm"]
-end)
+local f_translate = formatters["1 0 0 0 1 %.6N %.6N cm"]
+local f_concat = formatters["%.6N %.6N %.6N %.6N %.6N %.6N cm"]
local m_path, m_stack, m_texts, m_version, m_date, m_shortcuts = { }, { }, { }, 0, 0, false
diff --git a/Master/texmf-dist/tex/context/base/mkiv/meta-tex.mkiv b/Master/texmf-dist/tex/context/base/mkiv/meta-tex.mkiv
index 03ad5ee398c..c580596f797 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/meta-tex.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/meta-tex.mkiv
@@ -153,4 +153,90 @@
\clf_MPLIBconvertoutlinetext\numexpr#1\relax{#2}\scratchbox
\endgroup}
+%D For now here. We don't do the whole thing, because then one can as
+%D well just export to pdf. We assume consistent integration.
+
+\definefontsynonym[serif-normal-normal] [\s!Serif]
+\definefontsynonym[serif-normal-italic] [\s!SerifItalic]
+\definefontsynonym[serif-normal-oblique][\s!SerifSlanted]
+\definefontsynonym[serif-bold-normal] [\s!SerifBold]
+\definefontsynonym[serif-bold-italic] [\s!SerifBoldItalic]
+\definefontsynonym[serif-bold-oblique] [\s!SerifBoldSlanted]
+
+\definefontsynonym[sans-normal-normal] [\s!Sans]
+\definefontsynonym[sans-normal-italic] [\s!SansItalic]
+\definefontsynonym[sans-normal-oblique] [\s!SansSlanted]
+\definefontsynonym[sans-bold-normal] [\s!SansBold]
+\definefontsynonym[sans-bold-italic] [\s!SansBoldItalic]
+\definefontsynonym[sans-bold-oblique] [\s!SansBoldSlanted]
+
+\definefontsynonym[mono-normal-normal] [\s!Mono]
+\definefontsynonym[mono-normal-italic] [\s!MonoItalic]
+\definefontsynonym[mono-normal-oblique] [\s!MonoSlanted]
+\definefontsynonym[mono-bold-normal] [\s!MonoBold]
+\definefontsynonym[mono-bold-italic] [\s!MonoBoldItalic]
+\definefontsynonym[mono-bold-oblique] [\s!MonoBoldSlanted]
+
+\installcorenamespace {svgfamily}
+
+\setvalue{\??svgfamily }{serif}
+\setvalue{\??svgfamily serif}{serif}
+\setvalue{\??svgfamily sans}{sans}
+\setvalue{\??svgfamily mono}{mono}
+
+%D This can't change because otherwise \type {\scale[width=4cm]{graphic}} fails.
+
+\unexpanded\def\svgscaled#1%
+ {\fastsxsy{#1}{#1}\svgnormal}
+
+\unexpanded\def\svgnormal#1#2#3#4% family weight style text
+ {\bgroup
+ \edef\p_family{#1}%
+ \ifx\p_family\empty\else
+ \edef\p_font{\ifcsname\??svgfamily#1\endcsname\lastnamedcs\else#1\fi-#2-#3}%
+ \predefinedfont[\s!spec:\p_font*\s!default\space @ 10bp]%
+ \fi
+ #4%
+ \egroup}
+
+\unexpanded\def\svgcolored#1#2#3#4% r g b text
+ {\colored[r=#1,g=#2,b=#3]{#4}}
+
+\unexpanded\def\svgplaced#1#2#3#4% dx dy width text
+ {\doifelsenothing{#3}%
+ {\hpack}%
+ {\hpack to #3}%
+ {\raise#2\onebasepoint\hbox{\kern#1\onebasepoint\relax#4}}}
+
+\newdimen\grph_svg_scratchwidth % maybe \startsvgpos etc
+
+\unexpanded\def\svgposchar#1#2#3% dx dy char
+ {\setbox\scratchbox\hpack\bgroup
+ \raise#2\onebasepoint\hbox\bgroup
+ \kern\dimexpr#1\onebasepoint-\grph_svg_scratchwidth\relax
+ \char#3\relax
+ \egroup
+ \egroup
+ \advance\grph_svg_scratchwidth\wd\scratchbox
+ \box\scratchbox}
+
+\unexpanded\def\svgchar#1% char
+ {\char#1\relax}
+
+\definelayer[svgmps][\c!method=\v!fit]
+
+\unexpanded\def\svgstartlayer
+ {\resetlayer[svgmps]%
+ \setlayer[svgmps]\bgroup}
+
+\unexpanded\def\svgstoplayer
+ {\egroup
+ \flushlayer[svgmps]}
+
+\unexpanded\def\svgsetlayer#1#2%
+ {\setlayer[svgmps][\c!x=#1\onebasepoint,\c!y=#2\onebasepoint]} % {#3}
+
+\unexpanded\def\svghashed#1%
+ {\clf_svghashed#1\relax}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-cnt.lua b/Master/texmf-dist/tex/context/base/mkiv/mlib-cnt.lua
new file mode 100644
index 00000000000..761eac6551a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-cnt.lua
@@ -0,0 +1,2021 @@
+if not modules then modules = { } end modules ['mlib-cnt'] = {
+ version = 1.001,
+ comment = "companion to mlib-ctx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+-- The only useful reference that I could find about this topic is in wikipedia:
+--
+-- https://en.wikipedia.org/wiki/Marching_squares
+--
+-- I derived the edge code from:
+--
+-- https://physiology.arizona.edu/people/secomb/contours
+--
+-- and also here:
+--
+-- https://github.com/secomb/GreensV4
+--
+-- which has the banner:
+--
+-- TWS, November 1989. Converted to C September 2007. Revised February 2009.
+--
+-- and has a liberal licence. I optimized the code so that it runs a bit faster in Lua and
+-- there's probably more room for optimization (I tried several variants). For instance I
+-- don't use that many tables because access is costly. We don't have a compiler that does
+-- some optimizing (even then the c code can probably be made more efficient).
+--
+-- We often have the same node so it's cheaper to reuse the wsp tables and reconstruct
+-- the point in the path then to alias the original point. We can be more clever:
+-- straighten, but it's more work so maybe I will do that later; for now I only added
+-- a test for equality. There are some experiments in this file too and not all might
+-- work. It's a playground for me.
+--
+-- The code is meant for metafun so it is not general purpose. The bitmap variant is
+-- relatively fast and bitmaps compress well. When all is settled I might make a couple
+-- of helpers in C for this purpose but not now.
+--
+-- I removed optimization code (more aggressive flattening and such because it didn't really
+-- pay off now that we use combined paths with just line segments. I also moved some other
+-- code to a experimental copy. So we now only have the bare helpers needed here.
+
+-- Todo: look into zero case (lavel 1) for shapes ... omiting the background calculation
+-- speeds up quite a bit.
+
+local next, type, tostring = next, type, tostring
+local round, abs, min, max, floor = math.round, math.abs, math.min, math.max, math.floor
+local concat, move = table.concat, table.move
+
+local bor = bit32.bor -- it's really time to ditch support for luajit
+
+local starttiming = statistics.starttiming
+local stoptiming = statistics.stoptiming
+local elapsedtime = statistics.elapsedtime
+
+local formatters = string.formatters
+local setmetatableindex = table.setmetatableindex
+local sortedkeys = table.sortedkeys
+local sequenced = table.sequenced
+
+local metapost = metapost or { }
+local mp = mp or { }
+
+local getparameterset = metapost.getparameterset
+
+local mpflush = mp.flush
+local mpcolor = mp.color
+local mpstring = mp.string
+local mpdraw = mp.draw
+local mpfill = mp.fill
+local mpflatten = mp.flatten
+
+local report = logs.reporter("mfun contour")
+
+local version = 0.007
+
+-- we iterate using integers so that we get a better behaviour at zero
+
+local f_function_n = formatters [ [[
+ local math = math
+ local round = math.round
+ %s
+ return function(data,nx,ny,nxmin,nxmax,xstep,nymin,nymax,ystep)
+ local sx = nxmin
+ for mx=1,nx do
+ local dx = data[mx]
+ local x = sx * xstep
+ local sy = nymin
+ for my=1,ny do
+ local y = sy * ystep
+ dx[my] = %s
+ sy = sy + 1
+ end
+ sx = sx + 1
+ end
+ return 0
+ end
+]] ]
+
+local f_function_y = formatters [ [[
+ local math = math
+ local round = math.round
+ local nan = NaN
+ local inf = math.huge
+ %s
+ return function(data,nx,ny,nxmin,nxmax,xstep,nymin,nymax,ystep,dnan,dinf,report)
+ local sx = nxmin
+ local er = 0
+ for mx=nxmin,nxmax do
+ local dx = data[mx]
+ local x = sx * xstep
+ local sy = nymin
+ for my=nymin,nymax do
+ local y = sy * ystep
+ local n = %s
+ if n == nan then
+ er = er + 1
+ if er < 10 then
+ report("nan at (%s,%s)",x,y)
+ end
+ n = dnan
+ elseif n == inf then
+ er = er + 1
+ if er < 10 then
+ report("inf at (%s,%s)",x,y)
+ end
+ n = dinf
+ end
+ dx[my] = n
+ sy = sy + 1
+ end
+ sx = sx + 1
+ end
+ return er
+ end
+]] ]
+
+local f_color = formatters [ [[
+ local math = math
+ local min = math.min
+ local max = math.max
+ local n = %s
+ local minz = %s
+ local maxz = %s
+
+ local color_value = 0
+ local color_step = mp.lmt_color_functions.step
+ local color_shade = mp.lmt_color_functions.shade
+
+ local function step(...)
+ return color_step(color_value,n,...)
+ end
+ local function shade(...)
+ return color_shade(color_value,n,...)
+ end
+ local function lin(l)
+ return l/n
+ end
+ %s
+ return function(l)
+ color_value = l
+ return %s
+ end
+]] ]
+
+local inbetween = attributes and attributes.colors.helpers.inbetween
+
+mp.lmt_color_functions = {
+ step = function(l,n,r,g,b,s)
+ if not s then
+ s = 1
+ end
+ local f = l / n
+ local r = s * 1.5 - 4 * abs(f-r)
+ local g = s * 1.5 - 4 * abs(f-g)
+ local b = s * 1.5 - 4 * abs(f-b)
+ return min(max(r,0),1), min(max(g,0),1), min(max(b,0),1)
+ end,
+ shade = function(l,n,one,two)
+ local f = l / n
+ local r = inbetween(one,two,1,f)
+ local g = inbetween(one,two,2,f)
+ local b = inbetween(one,two,3,f)
+ return min(max(r,0),1), min(max(g,0),1), min(max(b,0),1)
+ end,
+}
+
+local f_box = formatters [ [[draw rawtexbox("contour",%s) xysized (%s,%s) ;]] ]
+
+local n_box = 0
+
+-- todo: remove old one, so we need to store old hashes
+
+local nofcontours = 0
+
+-- We don't want cosmetics like axis and labels to trigger a calculation,
+-- especially a slow one.
+
+local hashfields = {
+ "xmin", "xmax", "xstep", "ymin", "ymax", "ystep",
+ "levels", "colors", "level", "preamble", "function", "functions", "color", "values",
+ "background", "foreground", "linewidth", "backgroundcolor", "linecolor",
+}
+
+local function prepare(p)
+ local h = { }
+ for i=1,#hashfields do
+ local f = hashfields[i]
+ h[f] = p[f]
+ end
+ local hash = md5.HEX(sequenced(h))
+ local name = formatters["%s-m-c-%03i.lua"](tex.jobname,nofcontours)
+ return name, hash
+end
+
+local function getcache(p)
+ local cache = p.cache
+ if cache then
+ local name, hash = prepare(p)
+ local data = table.load(name)
+ if data and data.hash == hash and data.version == version then
+ p.result = data
+ return true
+ else
+ return false, hash, name
+ end
+ end
+ return false, nil, nil
+end
+
+local function setcache(p)
+ local result = p.result
+ local name = result.name
+ if name then
+ if result.bitmap then
+ result.bitmap = nil
+ else
+ result.data = nil
+ end
+ result.color = nil
+ result.action = nil
+ result.cached = nil
+ io.savedata(name, table.fastserialize(result))
+ else
+ os.remove((prepare(p)))
+ end
+end
+
+function mp.lmt_contours_start()
+
+ starttiming("lmt_contours")
+
+ nofcontours = nofcontours + 1
+
+ local p = getparameterset()
+
+ local xmin = p.xmin
+ local xmax = p.xmax
+ local ymin = p.ymin
+ local ymax = p.ymax
+ local xstep = p.xstep
+ local ystep = p.ystep
+ local levels = p.levels
+ local colors = p.colors
+ local nx = 0
+ local ny = 0
+ local means = setmetatableindex("number")
+ local values = setmetatableindex("number")
+ local data = setmetatableindex("table")
+ local minmean = false
+ local maxmean = false
+
+ local cached, hash, name = getcache(p)
+
+ local function setcolors(preamble,levels,minz,maxz,color,nofvalues)
+ if colors then
+ local function f(k)
+ return #colors[1] == 1 and 0 or { 0, 0, 0 }
+ end
+ setmetatableindex(colors, function(t,k)
+ local v = f(k)
+ t[k] = v
+ return v
+ end)
+ local c = { }
+ local n = 1
+ for i=1,nofvalues do
+ c[i] = colors[n]
+ n = n + 1
+ end
+ return c, f
+ else
+ local tcolor = f_color(levels,minz,maxz,preamble,color)
+ local colors = { }
+ local fcolor = load(tcolor)
+ if type(fcolor) ~= "function" then
+ report("error in color function, case %i: %s",1,color)
+ fcolor = false
+ else
+ fcolor = fcolor()
+ if type(fcolor) ~= "function" then
+ report("error in color function, case %i: %s",2,color)
+ fcolor = false
+ end
+ end
+ if not fcolor then
+ local color_step = mp.lmt_color_functions.step
+ fcolor = function(l)
+ return color_step(l,levels,0.25,0.50,0.75)
+ end
+ end
+ for i=1,nofvalues do
+ colors[i] = { fcolor(i) }
+ end
+ if attributes.colors.model == "cmyk" then
+ for i=1,#colors do
+ local c = colors[i]
+ colors[i] = { 1 - c[1], 1 - c[2], 1 - c[3], 0 }
+ end
+ end
+ return colors, fcolor
+ end
+ end
+
+ if cached then
+ local result = p.result
+ local colors, color = setcolors(
+ p.preamble,
+ p.levels,
+ result.minz,
+ result.maxz,
+ p.color,
+ result.nofvalues
+ )
+ result.color = color
+ result.colors = colors
+ result.cached = true
+ return
+ end
+
+ local functioncode = p["function"]
+ local functionrange = p.range
+ local functionlist = functionrange and p.functions
+ local preamble = p.preamble
+
+ if xstep == 0 then xstep = (xmax - xmin)/100 end
+ if ystep == 0 then ystep = (ymax - ymin)/100 end
+
+ local nxmin = round(xmin/xstep)
+ local nxmax = round(xmax/xstep)
+ local nymin = round(ymin/ystep)
+ local nymax = round(ymax/ystep)
+ local nx = nxmax - nxmin + 1
+ local ny = nymax - nymin + 1
+
+ local function executed(data,code)
+ local fcode = p.check and f_function_y or f_function_n
+ fcode = fcode(preamble,code)
+ fcode = load(fcode)
+ if type(fcode) == "function" then
+ fcode = fcode()
+ end
+ if type(fcode) == "function" then
+ local er = fcode(
+ data, nx, ny,
+ nxmin, nxmax, xstep,
+ nymin, nymax, ystep,
+ p.defaultnan, p.defaultinf, report
+ )
+ if er > 0 then
+ report("%i errors in: %s",er,code)
+ end
+ return true
+ else
+ return false -- fatal error
+ end
+ end
+
+ -- for i=1,nx do
+ -- data[i] = lua.newtable(ny,0)
+ -- end
+
+ if functionlist then
+
+ local datalist = { }
+ local minr = functionrange[1]
+ local maxr = functionrange[2] or minr
+ local size = #functionlist
+
+ for l=1,size do
+
+ local func = setmetatableindex("table")
+ if not executed(func,functionlist[l]) then
+ report("error in executing function %i from functionlist",l)
+ return
+ end
+
+ local bit = l -- + 1
+
+ if l == 1 then
+ for i=1,nx do
+ local di = data[i]
+ local fi = func[i]
+ for j=1,ny do
+ local f = fi[j]
+ if f >= minr and f <= maxr then
+ di[j] = bit
+ else
+ di[j] = 0
+ end
+ end
+ end
+ else
+ for i=1,nx do
+ local di = data[i]
+ local fi = func[i]
+ for j=1,ny do
+ local f = fi[j]
+ if f >= minr and f <= maxr then
+ di[j] = bor(di[j],bit)
+ end
+ end
+ end
+ end
+
+ end
+
+ -- we can simplify the value mess below
+
+ elseif functioncode then
+
+ if not executed(data,functioncode) then
+ report("error in executing function")
+ return -- fatal error
+ end
+
+ else
+
+ report("no valid function(s)")
+ return -- fatal error
+
+ end
+
+ minz = data[1][1]
+ maxz = minz
+
+ for i=1,nx do
+ local d = data[i]
+ for j=1,ny do
+ local v = d[j]
+ if v < minz then
+ minz = v
+ elseif v > maxz then
+ maxz = v
+ end
+ end
+ end
+
+ if functionlist then
+
+ for i=minz,maxz do
+ values[i] = i
+ end
+
+ levels = maxz
+
+ minmean = minz
+ maxmean = maxz
+
+ else
+
+ local snap = (maxz - minz + 1) / levels
+
+ for i=1,nx do
+ local d = data[i]
+ for j=1,ny do
+ local dj = d[j]
+ local v = round((dj - minz) / snap)
+ values[v] = values[v] + 1
+ means [v] = means [v] + dj
+ d[j] = v
+ end
+ end
+
+ local list = sortedkeys(values)
+ local count = values
+ local remap = { }
+
+ values = { }
+
+ for i=1,#list do
+ local v = list[i]
+ local m = means[v] / count[v]
+ remap [v] = i
+ values[i] = m
+ if not minmean then
+ minmean = m
+ maxmean = m
+ elseif m < minmean then
+ minmean = m
+ elseif m > maxmean then
+ maxmean = m
+ end
+ end
+
+ for i=1,nx do
+ local d = data[i]
+ for j=1,ny do
+ d[j] = remap[d[j]]
+ end
+ end
+
+ end
+
+ -- due to rounding we have values + 1 so we can have a floor, ceil, round
+ -- option as well as levels -1
+
+ local nofvalues = #values
+
+ local colors = setcolors(
+ p.preamble,levels,minz,maxz,p.color,nofvalues
+ )
+
+ p.result = {
+ version = version,
+ values = values,
+ nofvalues = nofvalues,
+ minz = minz,
+ maxz = maxz,
+ minmean = minmean,
+ maxmean = maxmean,
+ data = data,
+ color = color,
+ nx = nx,
+ ny = ny,
+ colors = colors,
+ name = name,
+ hash = hash,
+ islist = functionlist and true or false,
+ }
+
+ report("index %i, nx %i, ny %i, levels %i", nofcontours, nx, ny, nofvalues)
+end
+
+function mp.lmt_contours_stop()
+ local p = getparameterset()
+ local e = stoptiming("lmt_contours")
+ setcache(p)
+ p.result = nil
+ local f = p["function"]
+ local l = p.functions
+ report("index %i, %0.3f seconds for: %s",
+ nofcontours, e, "[ " .. concat(l or { f } ," ] [ ") .. " ]"
+ )
+end
+
+function mp.lmt_contours_bitmap_set()
+ local p = getparameterset()
+ local result = p.result
+
+ local values = result.values
+ local nofvalues = result.nofvalues
+ local rawdata = result.data
+ local nx = result.nx
+ local ny = result.ny
+ local colors = result.colors
+ local depth = #colors[1] -- == 3 and "rgb" or "gray"
+
+ -- i need to figure out this offset of + 1
+
+ local bitmap = graphics.bitmaps.new(
+ nx, ny,
+ (depth == 3 and "rgb") or (depth == 4 and "cmyk") or "gray",
+ 1, false, true
+ )
+
+ local palette = bitmap.index or { } -- has to start at 0
+ local data = bitmap.data
+ local p = 0
+
+ if depth == 3 or depth == 4 then
+ for i=1,nofvalues do
+ local c = colors[i]
+ local r = round((c[1] or 0) * 255)
+ local g = round((c[2] or 0) * 255)
+ local b = round((c[3] or 0) * 255)
+ local k = depth == 4 and round((c[4] or 0) * 255) or nil
+ palette[p] = {
+ (r > 255 and 255) or (r < 0 and 0) or r,
+ (g > 255 and 255) or (g < 0 and 0) or g,
+ (b > 255 and 255) or (b < 0 and 0) or b,
+ k
+ }
+ p = p + 1
+ end
+ else
+ for i=1,nofvalues do
+ local s = colors[i][1]
+ local s = round((s or 0) * 255)
+ palette[p] = (
+ (s > 255 and 255) or (s < 0 and 0) or s
+ )
+ p = p + 1
+ end
+ end
+
+ -- As (1,1) is the left top corner so we need to flip of we start in
+ -- the left bottom (we cannot loop reverse because we want a properly
+ -- indexed table.
+
+ local k = 0
+ for y=ny,1,-1 do
+ k = k + 1
+ local d = data[k]
+ for x=1,nx do
+ d[x] = rawdata[x][y] - 1
+ end
+ end
+
+ result.bitmap = bitmap
+end
+
+function mp.lmt_contours_bitmap_get()
+ local p = getparameterset()
+ local result = p.result
+ local bitmap = result.bitmap
+ local box = nodes.hpack(graphics.bitmaps.flush(bitmap))
+ n_box = n_box + 1
+ nodes.boxes.savenode("contour",tostring(n_box),box)
+ return f_box(n_box,bitmap.xsize,bitmap.ysize)
+end
+
+function mp.lmt_contours_cleanup()
+ nodes.boxes.reset("contour")
+ n_box = 0
+end
+
+function mp.lmt_contours_edge_set()
+ local p = getparameterset()
+ local result = p.result
+
+ if result.cached then return end
+
+ local values = result.values
+ local nofvalues = result.nofvalues
+ local data = result.data
+ local nx = result.nx
+ local ny = result.ny
+
+ local xmin = p.xmin
+ local xmax = p.xmax
+ local ymin = p.ymin
+ local ymax = p.ymax
+ local xstep = p.xstep
+ local ystep = p.ystep
+
+ local wsp = { }
+ local edges = { }
+
+ for value=1,nofvalues do
+
+ local iwsp = 0
+ local di = data[1]
+ local dc
+ local edge = { }
+ local e = 0
+ -- the next loop is fast
+ for i=1,nx do
+ local di1 = data[i+1]
+ local dij = di[1]
+ local d = dij - value
+ local dij1
+ for j=1,ny do
+ if j < ny then
+ dij1 = di[j+1]
+ dc = dij1 - value
+ if (d >= 0 and dc < 0) or (d < 0 and dc >= 0) then
+ iwsp = iwsp + 1
+ local y = (d * (j+1) - dc * j) / (d - dc)
+ if i == 1 then
+ wsp[iwsp] = { i, y, 0, (i + (j-1)*nx) }
+ elseif i == nx then
+ wsp[iwsp] = { i, y, (i - 1 + (j-1)*nx), 0 }
+ else
+ local jx = (i + (j-1)*nx)
+ wsp[iwsp] = { i, y, jx - 1, jx }
+ end
+ end
+ end
+ if i < nx then
+ local dc = di1[j] - value
+ if (d >= 0 and dc < 0) or (d < 0 and dc >= 0) then
+ iwsp = iwsp + 1
+ local x = (d * (i+1) - dc * i) / (d - dc)
+ if j == 1 then
+ wsp[iwsp] = { x, j, 0, (i + (j-1)*nx) }
+ elseif j == ny then
+ wsp[iwsp] = { x, j, (i + (j-2)*nx), 0 }
+ else
+ local jx = i + (j-1)*nx
+ wsp[iwsp] = { x, j, jx - nx, jx }
+ end
+ end
+ end
+ dij = dij1
+ d = dc
+ end
+ di = di1
+ end
+ -- the next loop takes time
+ for i=1,iwsp do
+ local wspi = wsp[i]
+ for isq=3,4 do
+ local nsq = wspi[isq]
+ if nsq ~= 0 then
+ local px = wspi[1]
+ local py = wspi[2]
+ local p = { px, py }
+ local pn = 2
+ wspi[isq] = 0
+ while true do
+ for ii=1,iwsp do
+ local w = wsp[ii]
+ local n1 = w[3]
+ local n2 = w[4]
+ if n1 == nsq then
+ local x = w[1]
+ local y = w[2]
+ if x ~= px or y ~= py then
+ pn = pn + 1
+ p[pn] = x
+ pn = pn + 1
+ p[pn] = y
+ px = x
+ py = y
+ end
+ nsq = n2
+ w[3] = 0
+ w[4] = 0
+ if nsq == 0 then
+ if pn == 1 then
+ pn = pn + 1
+ p[pn] = w
+ end
+ goto flush
+ end
+ elseif n2 == nsq then
+ local x = w[1]
+ local y = w[2]
+ if x ~= px or y ~= py then
+ pn = pn + 1
+ p[pn] = x
+ pn = pn + 1
+ p[pn] = y
+ px = x
+ py = y
+ end
+ nsq = n1
+ w[3] = 0
+ w[4] = 0
+ if nsq == 0 then
+ goto flush
+ end
+ end
+ end
+ end
+ ::flush::
+ e = e + 1
+ edge[e] = p
+ if mpflatten then
+ mpflatten(p)
+ end
+ end
+ end
+ end
+
+
+ edges[value] = edge
+
+ end
+
+ result.edges = edges
+
+end
+
+function mp.lmt_contours_shade_set(edgetoo)
+ local p = getparameterset()
+ local result = p.result
+
+ if result.cached then return end
+
+ local values = result.values
+ local nofvalues = result.nofvalues
+ local data = result.data
+ local nx = result.nx
+ local ny = result.ny
+ local color = result.color
+
+ local edges = setmetatableindex("table")
+ local shades = setmetatableindex("table")
+
+ local sqtype = setmetatableindex("table")
+
+ local xspoly = { 0, 0, 0, 0, 0, 0 }
+ local yspoly = { 0, 0, 0, 0, 0, 0 }
+ local xrpoly = { }
+ local yrpoly = { }
+
+ local xrpoly = { } -- lua.newtable(2000,0)
+ local yrpoly = { } -- lua.newtable(2000,0)
+
+ -- for i=1,2000 do
+ -- xrpoly[i] = 0
+ -- yrpoly[i] = 0
+ -- end
+
+ -- Unlike a c compiler lua will not optimize loops to run in parallel so we expand
+ -- some of the loops and make sure we don't calculate when not needed. Not that nice
+ -- but not that bad either. Maybe I should just write this from scratch.
+
+-- local i = 0
+-- local j = 0
+
+ -- Analyze each rectangle separately. Overwrite lower colors
+
+ -- Unrolling the loops and copying code and using constants is faster and doesn't
+ -- produce much more code in the end, also because we then can leave out the not
+ -- seen branches. One can argue about the foundit2* blobs but by stepwise optimizing
+ -- this is the result.
+
+ shades[1] = { { 0, 0, nx - 1, 0, nx - 1, ny - 1, 0, ny - 1 } }
+ edges [1] = { { } }
+
+ -- this is way too slow ... i must have messed up some loop .. what is this with value 1
+
+ for value=1,nofvalues do
+-- for value=2,nofvalues do
+
+ local edge = { }
+ local nofe = 0
+ local shade = { }
+ local nofs = 0
+
+ for i=1,nx-1 do
+ local s = sqtype[i]
+ for j=1,ny-1 do
+ s[j] = 0
+ end
+ end
+
+ local nrp = 0
+
+ local function addedge(a,b,c,d)
+ nofe = nofe + 1 edge[nofe] = a
+ nofe = nofe + 1 edge[nofe] = b
+ nofe = nofe + 1 edge[nofe] = c
+ nofe = nofe + 1 edge[nofe] = d
+ end
+ while true do
+ -- search for a square of type 0 with >= 1 corner above contour level
+ local i
+ local j
+ local d0 = data[1]
+ local d1 = data[2]
+ for ii=1,nx do
+ local s = sqtype[ii]
+ for jj=1,ny do
+ if s[jj] == 0 then
+ if d0[jj] > value then i = ii j = jj goto foundit end
+ if d1[jj] > value then i = ii j = jj goto foundit end
+ local j1 = jj + 1
+ if d1[j1] > value then i = ii j = jj goto foundit end
+ if d0[j1] > value then i = ii j = jj goto foundit end
+ end
+ end
+ d0 = d1
+ d1 = data[ii+1]
+ end
+ break
+ ::foundit::
+ -- initialize r-polygon (nrp seems to be 1 or 2)
+ nrp = nrp + 1
+
+ local first = true
+ local nrpoly = 0
+ local nspoly = 0
+ local nrpm = -nrp
+ -- this is the main loop
+ while true do
+ -- search for a square of type -nrp
+ if first then
+ first = false
+ if sqtype[i][j] == 0 then -- true anyway
+ goto foundit1
+ end
+ end
+ for ii=1,nx do
+ local s = sqtype[ii]
+ for jj=1,ny do
+ if s[jj] == nrpm then
+ i = ii
+ j = jj
+ goto foundit1
+ end
+ end
+ end
+ break
+ ::foundit1::
+ while true do
+
+ -- search current then neighboring squares for square type 0, with a corner in common with current square above contour level
+
+ -- top/bottom ... a bit cheating here
+
+ local i_l, i_c, i_r -- i left current right
+ local j_b, j_c, j_t -- j bottom current top
+
+ local i_n = i + 1 -- i next (right)
+ local j_n = j + 1 -- j next (top)
+
+ local i_p = i - 1 -- i previous (bottom)
+ local j_p = j - 1 -- j previous (right)
+
+ local d_c = data[i]
+ local d_r = data[i_n]
+
+ local sq
+
+ i_c = i ; j_c = j ; if i_c < nx and j_c < ny then sq = sqtype[i_c] if sq[j_c] == 0 then
+ if d_c[j_c] > value then i_l = i_p ; i_r = i_n ; j_b = j_p ; j_t = j_n ; goto foundit21 end
+ if d_c[j_n] > value then i_l = i_p ; i_r = i_n ; j_b = j_p ; j_t = j_n ; goto foundit22 end
+ if d_r[j_c] > value then i_l = i_p ; i_r = i_n ; j_b = j_p ; j_t = j_n ; goto foundit23 end
+ if d_r[j_n] > value then i_l = i_p ; i_r = i_n ; j_b = j_p ; j_t = j_n ; goto foundit24 end
+ end end
+
+ i_c = i_n ; j_c = j ; if i_c < nx and j_c < ny then sq = sqtype[i_c] if sq[j_c] == 0 then
+ if d_r[j_c] > value then i_l = i ; i_r = i_n + 1 ; j_b = j_p ; j_t = j_n ; d_c = d_r ; d_r = data[i_r] ; goto foundit21 end
+ if d_r[j_n] > value then i_l = i ; i_r = i_n + 1 ; j_b = j_p ; j_t = j_n ; d_c = d_r ; d_r = data[i_r] ; goto foundit22 end
+ end end
+
+ i_c = i ; j_c = j_n ; if i_c < nx and j_c < ny then sq = sqtype[i_c] if sq[j_c] == 0 then
+ if d_c[j_n] > value then i_l = i_p ; i_r = i_n ; j_b = j ; j_t = j_n + 1 ; goto foundit21 end
+ if d_r[j_n] > value then i_l = i_p ; i_r = i_n ; j_b = j ; j_t = j_n + 1 ; goto foundit23 end
+ end end
+
+ i_c = i_p ; j_c = j ; if i_c > 0 and j_c < ny then sq = sqtype[i_c] if sq[j_c] == 0 then
+ if d_c[j_c] > value then i_l = i_p - 1 ; i_r = i ; j_b = j_p ; j_t = j_n ; d_r = d_c ; d_c = data[i_p] ; goto foundit23 end
+ if d_c[j_n] > value then i_l = i_p - 1 ; i_r = i ; j_b = j_p ; j_t = j_n ; d_r = d_c ; d_c = data[i_p] ; goto foundit24 end
+ end end
+
+ i_c = i ; j_c = j_p ; if i < nx and j_c > 0 then sq = sqtype[i_c] if sq[j_c] == 0 then
+ if d_c[j] > value then i_l = i_p ; i_r = i_n ; j_b = j_p - 1 ; j_t = j ; goto foundit22 end
+ if d_r[j] > value then i_l = i_p ; i_r = i_n ; j_b = j_p - 1 ; j_t = j ; goto foundit24 end
+ end end
+
+ -- not found
+
+ sqtype[i][j] = nrp
+
+ break
+
+ -- define s-polygon for found square (i_c,j_c) - may have up to 6 sides
+
+ ::foundit21:: -- 1 2 3 4
+
+ sq[j_c] = nrpm
+
+ xspoly[1] = i_l ; yspoly[1] = j_b
+ xspoly[2] = i_c ; yspoly[2] = j_b
+ if d_r[j_c] > value then -- dd2
+ xspoly[3] = i_c ; yspoly[3] = j_c
+ if d_r[j_t] > value then -- dd3
+ xspoly[4] = i_l ; yspoly[4] = j_c
+ if d_c[j_t] > value then -- dd4
+ nspoly = 4
+ else
+ xspoly[5] = i_l ; yspoly[5] = j_c ; nspoly = 5
+ end
+ elseif d_c[j_t] > value then -- dd4
+ xspoly[4] = i_c ; yspoly[4] = j_c ;
+ xspoly[5] = i_l ; yspoly[5] = j_c ; nspoly = 5
+ else
+ xspoly[4] = i_l ; yspoly[4] = j_c ; nspoly = 4
+ if edgetoo then addedge(i_c, j_c, i_l, j_c) end
+ end
+ elseif d_r[j_t] > value then -- dd3
+ xspoly[3] = i_c ; yspoly[3] = j_b
+ xspoly[4] = i_c ; yspoly[4] = j_c
+ if d_c[j_t] > value then -- dd4
+ xspoly[5] = i_l ; yspoly[5] = j_c ; nspoly = 5
+ else
+ xspoly[5] = i_l ; yspoly[5] = j_c ;
+ xspoly[6] = i_l ; yspoly[6] = j_c ; nspoly = 6
+ end
+ elseif d_c[j_t] > value then -- dd4
+ if edgetoo then addedge(i_c, j_b, i_c, j_c) end
+ xspoly[3] = i_c ; yspoly[3] = j_c ;
+ xspoly[4] = i_l ; yspoly[4] = j_c ; nspoly = 4
+ else
+ if edgetoo then addedge(i_c, j_b, i_l, j_c) end
+ xspoly[3] = i_l ; yspoly[3] = j_c ; nspoly = 3
+ end
+ goto done
+
+ ::foundit22:: -- 4 1 2 3
+
+ sq[j_c] = nrpm
+
+ xspoly[1] = i_l ; yspoly[1] = j_c
+ xspoly[2] = i_l ; yspoly[2] = j_b
+ if d_c[j_c] > value then -- dd2
+ xspoly[3] = i_c ; yspoly[3] = j_b
+ if d_r[j_c] > value then -- dd3
+ xspoly[4] = i_c ; yspoly[4] = j_c
+ if d_r[j_t] > value then -- dd4
+ nspoly = 4
+ else
+ xspoly[5] = i_c ; yspoly[5] = j_c ; nspoly = 5 -- suspicious, the same
+ end
+ elseif d_r[j_t] > value then -- dd4
+ xspoly[4] = i_c ; yspoly[4] = j_b ;
+ xspoly[5] = i_c ; yspoly[5] = j_c ; nspoly = 5
+ else
+ if edgetoo then addedge(i_c, j_b, i_c, j_c) end
+ xspoly[4] = i_c ; yspoly[4] = j_c ; nspoly = 4
+ end
+ elseif d_r[j_c] > value then -- dd3
+ xspoly[3] = i_l ; yspoly[3] = j_b
+ xspoly[4] = i_c ; yspoly[4] = j_b
+ xspoly[5] = i_c ; yspoly[5] = j_c
+ if d_r[j_t] > value then -- dd4
+ nspoly = 5
+ else
+ xspoly[6] = i_c ; yspoly[6] = j_c ; nspoly = 6
+ end
+ elseif d_r[j_t] > value then -- dd4
+ if edgetoo then addedge(i_l, j_b, i_c, j_b) end
+ xspoly[3] = i_c ; yspoly[3] = j_b
+ xspoly[4] = i_c ; yspoly[4] = j_c ; nspoly = 4
+ else
+ if edgetoo then addedge(i_l, j_b, i_c, j_c) end
+ xspoly[3] = i_c ; yspoly[3] = j_c ; nspoly = 3
+ end
+ goto done
+
+ ::foundit23:: -- 2 3 4 1
+
+ sq[j_c] = nrpm
+
+ xspoly[1] = i_c ; yspoly[1] = j_b
+ xspoly[2] = i_c ; yspoly[2] = j_c
+ if d_r[j_t] > value then -- dd2
+ xspoly[3] = i_l ; yspoly[3] = j_c
+ if d_c[j_t] > value then -- dd3
+ xspoly[4] = i_l ; yspoly[4] = j_b
+ if d_c[j_c] > value then -- dd4
+ nspoly = 4
+ else
+ xspoly[5] = i_l ; yspoly[5] = j_b ; nspoly = 5
+ end
+ elseif d_c[j_c] > value then -- dd4
+ xspoly[4] = i_l ; yspoly[4] = j_c
+ xspoly[5] = i_l ; yspoly[5] = j_b ; nspoly = 5
+ else
+ if edgetoo then addedge(i_l, j_c, i_l, j_b) end
+ xspoly[4] = i_l ; yspoly[4] = j_b ; nspoly = 4
+ end
+ elseif d_c[j_t] > value then -- dd3
+ xspoly[3] = i_c ; yspoly[3] = j_c
+ xspoly[4] = i_l ; yspoly[4] = j_c
+ xspoly[5] = i_l ; yspoly[5] = j_b
+ if d_c[j_c] > value then -- dd4
+ nspoly = 5
+ else
+ xspoly[6] = i_l ; yspoly[6] = j_b ; nspoly = 6
+ end
+ elseif d_c[j_c] > value then -- dd4
+ if edgetoo then addedge(i_c, j_c, i_l, j_c) end
+ xspoly[3] = i_l ; yspoly[3] = j_c ;
+ xspoly[4] = i_l ; yspoly[4] = j_b ; nspoly = 4
+ else
+ if edgetoo then addedge(i_c, j_c, i_l, j_b) end
+ xspoly[3] = i_l ; yspoly[3] = j_b ; nspoly = 3
+ end
+ goto done
+
+ ::foundit24:: -- 3 4 1 2
+
+ sq[j_c] = nrpm
+
+ xspoly[1] = i_c ; yspoly[1] = j_c
+ xspoly[2] = i_l ; yspoly[2] = j_c
+ if d_c[j_t] > value then -- dd2
+ if d_c[j_c] > value then -- dd3
+ xspoly[3] = i_l ; yspoly[3] = j_b
+ xspoly[4] = i_c ; yspoly[4] = j_b
+ if d_r[j_c] > value then -- dd4
+ nspoly = 4
+ else
+ xspoly[5] = i_c ; yspoly[5] = j_b ; nspoly = 5
+ end
+ else
+ xspoly[3] = i_l ; yspoly[3] = j_b
+ if d_r[j_c] > value then -- dd4
+
+ local xv34 = (dd3*i_c-dd4*i_l)/(dd3 - dd4) -- probably i_l
+ print("4.4 : xv34",xv34,i_c,i_l)
+
+ -- if edgetoo then addedge(i_l, j_b, xv34, j_b) end
+ xspoly[4] = xv34 ; yspoly[4] = j_b ;
+ xspoly[5] = i_c ; yspoly[5] = j_b ; nspoly = 5
+ else
+ if edgetoo then addedge(i_l, j_b, i_c, j_b) end
+ xspoly[4] = i_c ; yspoly[4] = j_b ; nspoly = 4
+ end
+ end
+ elseif d_c[j_c] > value then -- dd3
+ xspoly[3] = i_l ; yspoly[3] = j_b
+ xspoly[4] = i_l ; yspoly[4] = j_b
+ xspoly[5] = i_c ; yspoly[5] = j_b
+ if d_r[j_c] > value then -- dd4
+ nspoly = 5
+ else
+ xspoly[6] = i_c ; yspoly[6] = j_b ; nspoly = 6
+ end
+ elseif d_r[j_c] > value then -- dd4
+ if edgetoo then addedge(i_l, j_c, i_l, j_b) end
+ xspoly[3] = i_l ; yspoly[3] = j_b
+ xspoly[4] = i_c ; yspoly[4] = j_b ; nspoly = 4
+ else
+ if edgetoo then addedge(i_l, j_c, i_c, j_b) end
+ xspoly[3] = i_c ; yspoly[3] = j_b ; nspoly = 3
+ end
+ -- goto done
+
+ ::done::
+ -- combine s-polygon with existing r-polygon, eliminating redundant segments
+
+ if nrpoly == 0 then
+ -- initiate r-polygon
+ for i=1,nspoly do
+ xrpoly[i] = xspoly[i]
+ yrpoly[i] = yspoly[i]
+ end
+ nrpoly = nspoly
+ else
+ -- search r-polygon and s-polygon for one side that matches
+ --
+ -- this is a bottleneck ... we keep this variant here but next go for a faster
+ -- alternative
+ --
+ -- local ispoly, irpoly
+ -- for r=nrpoly,1,-1 do
+ -- local r1
+ -- for s=1,nspoly do
+ -- local s1 = s % nspoly + 1
+ -- if xrpoly[r] == xspoly[s1] and yrpoly[r] == yspoly[s1] then
+ -- if not r1 then
+ -- r1 = r % nrpoly + 1
+ -- end
+ -- if xrpoly[r1] == xspoly[s] and yrpoly[r1] == yspoly[s] then
+ -- ispoly = s
+ -- irpoly = r
+ -- goto foundit3
+ -- end
+ -- end
+ -- end
+ -- end
+ --
+ -- local ispoly, irpoly
+ -- local xr1 = xrpoly[1]
+ -- local yr1 = yrpoly[1]
+ -- for r0=nrpoly,1,-1 do
+ -- for s0=1,nspoly do
+ -- if xr1 == xspoly[s0] and yr1 == yspoly[s0] then
+ -- if s0 == nspoly then
+ -- if xr0 == xspoly[1] and yr0 == yspoly[1] then
+ -- ispoly = s0
+ -- irpoly = r0
+ -- goto foundit3
+ -- end
+ -- else
+ -- local s1 = s0 + 1
+ -- if xr0 == xspoly[s1] and yr0 == yspoly[s1] then
+ -- ispoly = s0
+ -- irpoly = r0
+ -- goto foundit3
+ -- end
+ -- end
+ -- end
+ -- end
+ -- xr1 = xrpoly[r0]
+ -- yr1 = yrpoly[r0]
+ -- end
+ --
+ -- but ...
+ --
+ local minx = xspoly[1]
+ local miny = yspoly[1]
+ local maxx = xspoly[1]
+ local maxy = yspoly[1]
+ for i=1,nspoly do
+ local y = yspoly[i]
+ if y < miny then
+ miny = y
+ elseif y > maxy then
+ maxy = y
+ end
+ local x = xspoly[i]
+ if x < minx then
+ minx = y
+ elseif x > maxx then
+ maxx = x
+ end
+ end
+ -- we can delay accessing y ...
+ local ispoly, irpoly
+ local xr1 = xrpoly[1]
+ local yr1 = yrpoly[1]
+ for r0=nrpoly,1,-1 do
+ if xr1 >= minx and xr1 <= maxx and yr1 >= miny and yr1 <= maxy then
+ local xr0 = xrpoly[r0]
+ local yr0 = yrpoly[r0]
+ for s0=1,nspoly do
+ if xr1 == xspoly[s0] and yr1 == yspoly[s0] then
+ if s0 == nspoly then
+ if xr0 == xspoly[1] and yr0 == yspoly[1] then
+ ispoly = s0
+ irpoly = r0
+ goto foundit3
+ end
+ else
+ local s1 = s0 + 1
+ if xr0 == xspoly[s1] and yr0 == yspoly[s1] then
+ ispoly = s0
+ irpoly = r0
+ goto foundit3
+ end
+ end
+ end
+ end
+ xr1 = xr0
+ yr1 = yr0
+ else
+ xr1 = xrpoly[r0]
+ yr1 = yrpoly[r0]
+ end
+ end
+ --
+ goto nomatch3
+ ::foundit3::
+ local match1 = 0
+ local rpoly1 = irpoly + nrpoly
+ local spoly1 = ispoly - 1
+ for i=2,nspoly-1 do
+ -- search for further matches nearby
+ local ir = (rpoly1 - i) % nrpoly + 1
+ local is = (spoly1 + i) % nspoly + 1
+ if xrpoly[ir] == xspoly[is] and yrpoly[ir] == yspoly[is] then
+ match1 = match1 + 1
+ else
+ break -- goto nomatch1
+ end
+ end
+ ::nomatch1::
+ local match2 = 0
+ local rpoly2 = irpoly - 1
+ local spoly2 = ispoly + nspoly
+ for i=2,nspoly-1 do
+ -- search other way for further matches nearby
+ local ir = (rpoly2 + i) % nrpoly + 1
+ local is = (spoly2 - i) % nspoly + 1
+ if xrpoly[ir] == xspoly[is] and yrpoly[ir] == yspoly[is] then
+ match2 = match2 + 1
+ else
+ break -- goto nomatch2
+ end
+ end
+ ::nomatch2::
+ -- local dnrpoly = nspoly - 2 - 2*match1 - 2*match2
+ local dnrpoly = nspoly - 2*(match1 + match2 + 1)
+ local ispolystart = (ispoly + match1) % nspoly + 1 -- first node of s-polygon to include
+ local irpolyend = (rpoly1 - match1 - 1) % nrpoly + 1 -- last node of s-polygon to include
+ if dnrpoly ~= 0 then
+ local irpolystart = (irpoly + match2) % nrpoly + 1 -- first node of s-polygon to include
+ if irpolystart > irpolyend then
+ -- local ispolyend = (spoly1 - match2 + nspoly)%nspoly + 1 -- last node of s-polygon to include
+ if dnrpoly > 0 then
+ -- expand the arrays xrpoly and yrpoly
+ for i=nrpoly,irpolystart,-1 do
+ local k = i + dnrpoly
+ xrpoly[k] = xrpoly[i]
+ yrpoly[k] = yrpoly[i]
+ end
+ else -- if dnrpoly < 0 then
+ -- contract the arrays xrpoly and yrpoly
+ for i=irpolystart,nrpoly do
+ local k = i + dnrpoly
+ xrpoly[k] = xrpoly[i]
+ yrpoly[k] = yrpoly[i]
+ end
+ end
+ end
+ nrpoly = nrpoly + dnrpoly
+ end
+ if nrpoly < irpolyend then
+ for i=irpolyend,nrpoly+1,-1 do
+ -- otherwise these values get lost!
+ local k = i - nrpoly
+ xrpoly[k] = xrpoly[i]
+ yrpoly[k] = yrpoly[i]
+ end
+ end
+ local n = nspoly - 2 - match1 - match2
+ if n == 1 then
+ local irpoly1 = irpolyend % nrpoly + 1
+ local ispoly1 = ispolystart % nspoly + 1
+ xrpoly[irpoly1] = xspoly[ispoly1]
+ yrpoly[irpoly1] = yspoly[ispoly1]
+ elseif n > 0 then
+ -- often 2
+ for i=1,n do
+ local ii = i - 1
+ local ir = (irpolyend + ii) % nrpoly + 1
+ local is = (ispolystart + ii) % nspoly + 1
+ xrpoly[ir] = xspoly[is]
+ yrpoly[ir] = yspoly[is]
+ end
+ end
+ ::nomatch3::
+ end
+ end
+ end
+
+ if nrpoly > 0 then
+ local t = { }
+ local n = 0
+ for i=1,nrpoly do
+ n = n + 1 t[n] = xrpoly[i]
+ n = n + 1 t[n] = yrpoly[i]
+ end
+ if mpflatten then
+ mpflatten(t) -- maybe integrate
+ end
+ nofs = nofs + 1
+ shade[nofs] = t
+ -- print(value,nrpoly,#t,#t-nrpoly*2)
+ end
+
+ end
+
+ edges [value+1] = edge
+ shades[value+1] = shade
+-- edges [value] = edge
+-- shades[value] = shade
+ end
+
+ result.shades = shades
+ result.shapes = edges
+
+end
+
+-- accessors
+
+function mp.lmt_contours_nx (i) return getparameterset().result.nx end
+function mp.lmt_contours_ny (i) return getparameterset().result.ny end
+
+function mp.lmt_contours_nofvalues() return getparameterset().result.nofvalues end
+function mp.lmt_contours_value (i) return getparameterset().result.values[i] end
+
+function mp.lmt_contours_minz (i) return getparameterset().result.minz end
+function mp.lmt_contours_maxz (i) return getparameterset().result.maxz end
+
+function mp.lmt_contours_minmean (i) return getparameterset().result.minmean end
+function mp.lmt_contours_maxmean (i) return getparameterset().result.maxmean end
+
+function mp.lmt_contours_xrange () local p = getparameterset() mpstring(formatters["x = [%.3N,%.3N] ;"](p.xmin,p.xmax)) end
+function mp.lmt_contours_yrange () local p = getparameterset() mpstring(formatters["y = [%.3N,%.3N] ;"](p.ymin,p.ymax)) end
+
+function mp.lmt_contours_format()
+ local p = getparameterset()
+ return mpstring(p.result.islist and "@i" or p.zformat or p.format)
+end
+
+function mp.lmt_contours_function()
+ local p = getparameterset()
+ return mpstring(p.result.islist and concat(p["functions"], ", ") or p["function"])
+end
+
+function mp.lmt_contours_range()
+ local p = getparameterset()
+ local r = p.result.islist and p.range
+ if not r or #r == 0 then
+ return mpstring("")
+ elseif #r == 1 then
+ return mpstring(r[1])
+ else
+ return mpstring(formatters["z = [%s,%s]"](r[1],r[2]))
+ end
+end
+
+function mp.lmt_contours_edge_paths(value)
+ mpdraw(getparameterset().result.edges[value],true)
+ mpflush()
+end
+
+function mp.lmt_contours_shape_paths(value)
+ mpdraw(getparameterset().result.shapes[value],false)
+ mpflush()
+end
+
+function mp.lmt_contours_shade_paths(value)
+ mpfill(getparameterset().result.shades[value],true)
+ mpflush()
+end
+
+function mp.lmt_contours_color(value)
+ local p = getparameterset()
+ local color = p.result.colors[value]
+ if color then
+ mpcolor(color)
+ end
+end
+
+-- The next code is based on the wikipedia page. It was a bit tedius job to define the
+-- coordinates but hupefully I made no errors. I rendered all shapes independently and
+-- tripple checked bit one never knows ...
+
+-- maybe some day write from scatch, like this (axis are swapped):
+
+local d = 1/2
+
+local paths = {
+ { 0, d, d, 0 },
+ { 1, d, d, 0 },
+ { 0, d, 1, d },
+ { 1, d, d, 1 },
+ { 0, d, d, 1, d, 0, 1, d }, -- saddle
+ { d, 0, d, 1 },
+ { 0, d, d, 1 },
+ { 0, d, d, 1 },
+ { d, 0, d, 1 },
+ { 0, d, d, 0, 1, d, d, 1 }, -- saddle
+ { 1, d, d, 1 },
+ { 0, d, 1, d },
+ { d, 0, 1, d },
+ { d, 0, 0, d },
+}
+
+local function whatever(data,nx,ny,threshold)
+ local edges = { }
+ local e = 0
+ local d0 = data[1]
+ for j=1,ny-1 do
+ local d1 = data[j+1]
+ local k = j + 1
+ for i=1,nx-1 do
+ local v = 0
+ local l = i + 1
+ local c1 = d0[i]
+ if c1 < threshold then
+ v = v + 8
+ end
+ local c2 = d0[l]
+ if c2 < threshold then
+ v = v + 4
+ end
+ local c3 = d1[l]
+ if c3 < threshold then
+ v = v + 2
+ end
+ local c4 = d1[i]
+ if c4 < threshold then
+ v = v + 1
+ end
+ if v > 0 and v < 15 then
+ if v == 5 or v == 10 then
+ local a = (c1 + c2 + c3 + c4) / 4
+ if a < threshold then
+ v = v == 5 and 10 or 5
+ end
+ local p = paths[v]
+ e = e + 1 edges[e] = k - p[2]
+ e = e + 1 edges[e] = i + p[1]
+ e = e + 1 edges[e] = k - p[4]
+ e = e + 1 edges[e] = i + p[3]
+ e = e + 1 edges[e] = k - p[6]
+ e = e + 1 edges[e] = i + p[5]
+ e = e + 1 edges[e] = k - p[8]
+ e = e + 1 edges[e] = i + p[7]
+ else
+ local p = paths[v]
+ e = e + 1 edges[e] = k - p[2]
+ e = e + 1 edges[e] = i + p[1]
+ e = e + 1 edges[e] = k - p[4]
+ e = e + 1 edges[e] = i + p[3]
+ end
+ end
+ end
+ d0 = d1
+ end
+ return edges
+end
+
+-- todo: just fetch when needed, no need to cache
+
+function mp.lmt_contours_edge_set_by_cell()
+ local p = getparameterset()
+ local result = p.result
+
+ if result.cached then return end
+
+ local values = result.values
+ local nofvalues = result.nofvalues
+ local data = result.data
+ local nx = result.nx
+ local ny = result.ny
+ local lines = { }
+ result.lines = lines
+ for value=1,nofvalues do
+ lines[value] = whatever(data,ny,nx,value)
+ end
+end
+
+function mp.lmt_contours_edge_get_cell(value)
+ mpdraw(getparameterset().result.lines[value])
+ mpflush()
+end
+
+local singles = {
+ { d, 0, 0, 0, 0, d }, -- 1 0001
+ { d, 0, 0, d }, -- 2 0002
+ { 1, d, 1, 0, d, 0 }, -- 3 0010
+ { 1, d, 1, 0, 0, 0, 0, d }, -- 4 0011
+ { 1, d, 1, 0, d, 0, 0, d }, -- 5 0012
+ { 1, d, d, 0 }, -- 6 0020
+ { 1, d, d, 0, 0, 0, 0, d }, -- 7 0021
+ { 1, d, 0, d }, -- 8 0022
+ { d, 1, 1, 1, 1, d }, -- 9 0100
+ false, -- 10 0101
+ false, -- 11 0102
+ { d, 1, 1, 1, 1, 0, d, 0 }, -- 12 0110
+ { d, 1, 1, 1, 1, 0, 0, 0, 0, d }, -- 13 0111
+ { d, 1, 1, 1, 1, 0, d, 0, 0, d }, -- 14 0112
+ { d, 1, 1, 1, 1, d, d, 0 }, -- 15 0120
+ { d, 1, 1, 1, 1, d, d, 0, 0, 0, 0, d }, -- 16 0121
+ { d, 1, 1, 1, 1, d, 0, d }, -- 17 0122
+ { d, 1, 1, d }, -- 18 0200
+ false, -- 19 0201
+ false, -- 20 0202
+ { d, 1, 1, d, 1, 0, d, 0 }, -- 21 0210
+ { d, 1, 1, d, 1, 0, 0, 0, 0, d }, -- 22 0211
+ false, -- 23 0212
+ { d, 1, d, 0 }, -- 24 0220
+ { d, 1, d, 0, 0, 0, 0, d }, -- 25 0221
+ { d, 1, 0, d }, -- 26 0222
+ { 0, 1, d, 1, 0, d }, -- 27 1000
+ { 0, 1, d, 1, d, 0, 0, 0 }, -- 28 1001
+ { 0, 1, d, 1, d, 0, 0, d }, -- 29 1002
+ false, -- 30 1010
+ { 0, 1, d, 1, 1, d, 1, 0, 0, 0 }, -- 31 1011
+ { 0, 1, d, 1, 1, d, 1, 0, d, 0, 0, d }, -- 32 1012
+ false, -- 33 1020
+ { 0, 1, d, 1, 1, d, d, 0, 0, 0 }, -- 34 1021
+ { 0, 1, d, 1, 1, d, 0, d }, -- 35 1022
+ { 0, 1, 1, 1, 1, d, 0, d }, -- 36 1100
+ { 0, 1, 1, 1, 1, d, d, 0, 0, 0 }, -- 37 1101
+ { 0, 1, 1, 1, 1, d, d, 0, 0, d }, -- 38 1102
+ { 0, 1, 1, 1, 1, 0, d, 0, 0, d }, -- 39 1110
+ { 0, 1, 1, 1, 1, 0, 0, 0 }, -- 40 1111
+ { 0, 1, 1, 1, 1, 0, d, 0, 0, d }, -- 41 1112
+ { 0, 1, 1, 1, 1, d, d, 0, 0, d }, -- 42 1120
+ { 0, 1, 1, 1, 1, d, d, 0, 0, 0 }, -- 43 1121
+ { 0, 1, 1, 1, 1, d, 0, d }, -- 44 1122
+ { 0, 1, d, 1, 1, d, 0, d }, -- 45 1200
+ { 0, 1, d, 1, 1, d, d, 0, 0, 0 }, -- 46 1201
+ false, -- 47 1202
+ { 0, 1, d, 1, 1, d, 1, 0, d, 0, 0, d }, -- 48 1210
+ { 0, 1, d, 1, 1, d, 1, 0, 0, 0 }, -- 49 1211
+ false, -- 50 1212
+ { 0, 1, d, 1, d, 0, 0, d }, -- 51 1220
+ { 0, 1, d, 1, d, 0, 0, 0 }, -- 52 1221
+ { 0, 1, d, 1, 0, d }, -- 53 1222
+ { d, 1, 0, d }, -- 54 2000
+ { d, 1, d, 0, 0, 0, 0, d }, -- 55 2001
+ { d, 1, d, 0 }, -- 56 2002
+ false, -- 57 2010
+ { d, 1, 1, d, 1, 0, 0, 0, 0, d }, -- 58 2011
+ { d, 1, 1, d, 1, 0, d, 0 }, -- 59 2012
+ false, -- 60 2020
+ false, -- 61 2021
+ { d, 1, 1, d }, -- 62 2022
+ { d, 1, 1, 1, 1, d, 0, d }, -- 63 2100
+ { d, 1, 1, 1, 1, d, d, 0, 0, 0, 0, d }, -- 64 2101
+ { d, 1, 1, 1, 1, d, d, 0 }, -- 65 2102
+ { d, 1, 1, 1, 1, 0, d, 0, 0, d }, -- 66 2110
+ { d, 1, 1, 1, 1, 0, 0, 0, 0, d }, -- 67 2111
+ { d, 1, 1, 1, 1, 0, d, 0 }, -- 68 2112
+ false, -- 69 2120
+ false, -- 70 2121
+ { d, 1, 1, 1, 1, d }, -- 71 2122
+ { 1, d, 0, d }, -- 72 2200
+ { 1, d, d, 0, 0, 0, 0, d }, -- 73 2201
+ { 1, d, d, 0 }, -- 74 2202
+ { 1, d, 1, 0, d, 0, 0, d }, -- 75 2210
+ { 1, d, 1, 0, 0, 0, 0, d }, -- 76 2211
+ { 1, d, 1, 0, d, 0 }, -- 77 2212
+ { d, 0, 0, d }, -- 78 2220
+ { 0, d, 0, 0, d, 0 }, -- 79 2221
+}
+
+local sadles = {
+ false, false, false, false, false, false, false, false, false,
+ { { d, 1, 1, 1, 1, d }, { d, 0, 0, 0, 0, d }, { d, 1, 1, 1, 1, d, d, 0, 0, 0, 0, d }, false, false, false }, -- 10 0101
+ { { d, 1, 1, 1, 1, d }, { d, 0, 0, d }, { d, 1, 1, 1, 1, d, d, 0, 0, d }, false, false, false }, -- 11 0102
+ false, false, false, false, false, false, false,
+ { { d, 1, 1, d }, { d, 0, 0, 0, 0, d }, { d, 1, 1, d, d, 0, 0, 0, 0, d }, false, false, false }, -- 19 0201
+ { { d, 1, 1, d }, { d, 0, 0, d }, { d, 1, 1, d, d, 0, 0, d }, false, { d, 1, 0, d }, { 1, d, d, 0 } }, -- 20 0202
+ false, false,
+ { false, false, { d, 1, 1, d, 1, 0, d, 0, 0, d }, false, { d, 1, 0,d, }, { 1, d, 1, 0,d, 0 } }, -- 23 0212
+ false, false, false, false, false, false,
+ { { 0, 1, d, 1, 0, d }, { 1, d, 1, 0, d, 0 }, { 0, 1, d, 1, 1, d, 1, 0, d, 0, 0, d }, false, false, false }, -- 30 1010
+ false, false,
+ { { 1, 0, d, 0, 0, d, }, { 1, d, d, 0 }, { 0, 1, d, 1, 1, d, d, 0, 0, d }, false, false, false }, -- 33 1020
+ false, false, false, false, false, false, false, false, false, false, false, false, false,
+ { false, false, { 0,1, d, 1, 1, d, d, 0, 0, d }, false, { 0,1, d, 1, 0, d }, {1, d, d, 0 } }, -- 47 1202
+ false, false,
+ { false, false, { 0, 1, d, 1, 1, d, 1, 0, d, 0, 0, d }, false, { 0, 1, d, 1, 0, d }, { 1, d, 1, 0, d, 0 } }, -- 50 1212
+ false, false, false, false, false, false,
+ { { d, 1, 0, d }, { 1, d, 1, 0, 0, d }, { d, 1, 1, d, 1, 0, d, 0, 0, d }, false, false, false }, -- 57 2010
+ false, false,
+ { { d, 1, 0,d }, { 1, d, d, 0 }, { d, 1, 1, d, d, 0, 0, d }, false, { d, 1, 1, d }, { d, 0, 0, d } }, -- 60 2020
+ { false, false, { d, 1, 1, d, d, 0, 0, 0, 0, d }, false, { d, 1, 1, d }, { d, 0, 0, 0, 0, d } }, -- 61 2021
+ false, false, false, false, false, false, false,
+ { false, false, { d, 1, 1, 1, 1, d, d, 0, 0, d }, false, { d, 1, 1, 1, 1, d }, { d, 0,0,d } }, -- 69 2120
+ { false, false, { d, 1, 1, 1, 1, d, d, 0, 0, 0, 0, d }, false, { d, 1, 1, 1, 1, d }, { d, 0, 0, 0, 0, d } }, -- 70 2121
+}
+
+local function whatever(data,nx,ny,threshold,background)
+
+ if background then
+
+ local llx = 1/2
+ local lly = llx
+ local urx = ny + llx
+ local ury = nx + lly
+
+ return { { llx, lly, urx, 0, urx, ury, 0, ury } }
+
+ else
+
+ local bands = { }
+ local b = 0
+
+ local function band(s,n,x,y) -- simple. no closure so fast
+ if n == 6 then
+ return {
+ x - s[ 2], y + s[ 1], x - s[ 4], y + s[ 3], x - s[ 6], y + s[ 5],
+ }
+ elseif n == 8 then
+ return {
+ x - s[ 2], y + s[ 1], x - s[ 4], y + s[ 3], x - s[ 6], y + s[ 5],
+ x - s[ 8], y + s[ 7],
+ }
+ elseif n == 10 then
+ return {
+ x - s[ 2], y + s[ 1], x - s[ 4], y + s[ 3], x - s[ 6], y + s[ 5],
+ x - s[ 8], y + s[ 7], x - s[10], y + s[ 9],
+ }
+ elseif n == 4 then
+ return {
+ x - s[ 2], y + s[ 1], x - s[ 4], y + s[ 3],
+ }
+ else -- 12
+ return {
+ x - s[ 2], y + s[ 1], x - s[ 4], y + s[ 3], x - s[ 6], y + s[ 5],
+ x - s[ 8], y + s[ 7], x - s[10], y + s[ 9], x - s[12], y + s[11],
+ }
+ end
+ end
+
+ local pp = { }
+
+ local d0 = data[1]
+ for j=1,ny-1 do
+ local d1 = data[j+1]
+ local k = j + 1
+ local p = false
+ for i=1,nx-1 do
+ local v = 0
+ local l = i + 1
+ local c1 = d0[i]
+ if c1 == threshold then
+ v = v + 27
+ elseif c1 > threshold then
+ v = v + 54
+ end
+ local c2 = d0[l]
+ if c2 == threshold then
+ v = v + 9
+ elseif c2 > threshold then
+ v = v + 18
+ end
+ local c3 = d1[l]
+ if c3 == threshold then
+ v = v + 3
+ elseif c3 > threshold then
+ v = v + 6
+ end
+ local c4 = d1[i]
+ if c4 == threshold then
+ v = v + 1
+ elseif c4 > threshold then
+ v = v + 2
+ end
+ if v > 0 and v < 80 then
+ if v == 40 then
+ -- a little optimization: full areas appended horizontally
+ if p then
+ p[4] = l -- i + 1
+ p[6] = l -- i + 1
+ else
+ -- x-0 y+1 x-1 y+1 x-1 y+0 x-0 y+0
+ p = { j, i, j, l, k, l, k, i }
+ b = b + 1 ; bands[b] = p
+ end
+ else
+ local s = singles[v]
+ if s then
+ b = b + 1 ; bands[b] = band(s,#s,k,i)
+ else
+ local s = sadles[v]
+ if s then
+ local m = (c1 + c2 + c3 + c4) / 4
+ if m < threshold then
+ local s1 = s[1] if s1 then b = b + 1 ; bands[b] = band(s1,#s1,i,j) end
+ local s2 = s[2] if s2 then b = b + 1 ; bands[b] = band(s2,#s2,i,j) end
+ elseif m == threshold then
+ local s3 = s[3] if s3 then b = b + 1 ; bands[b] = band(s3,#s3,i,j) end
+ local s4 = s[4] if s4 then b = b + 1 ; bands[b] = band(s4,#s4,i,j) end
+ else
+ local s5 = s[5] if s5 then b = b + 1 ; bands[b] = band(s5,#s5,i,j) end
+ local s6 = s[6] if s6 then b = b + 1 ; bands[b] = band(s6,#s6,i,j) end
+ end
+ end
+ end
+ p = false
+ end
+ else
+ p = false
+ end
+ end
+ d0 = d1
+ end
+ return bands
+ end
+end
+
+function mp.lmt_contours_edge_set_by_band(value)
+ local p = getparameterset()
+ local result = p.result
+
+ if result.cached then return end
+
+ local values = result.values
+ local nofvalues = result.nofvalues
+ local data = result.data
+ local nx = result.nx
+ local ny = result.ny
+ local bands = { }
+ result.bands = bands
+ for value=1,nofvalues do
+ bands[value] = whatever(data,ny,nx,value,value == 1)
+ end
+end
+
+function mp.lmt_contours_edge_get_band(value)
+ mpfill(getparameterset().result.bands[value],true)
+ mpflush()
+end
+
+-- Because we share some code surface plots also end up here. When working on the
+-- contour macros by concidence I ran into a 3D plot in
+--
+-- https://staff.science.uva.nl/a.j.p.heck/Courses/mptut.pdf
+--
+-- The code is pure MetaPost and works quite well. With a bit of optimization
+-- performance is also ok, but in the end a Lua solution is twice as fast and also
+-- permits some more tweaking at no cost. So, below is an adaptation of an example
+-- in the mentioned link. It's one of these cases where access to pseudo arrays
+-- is slowing down MP.
+
+local sqrt, sin, cos = math.sqrt, math.sin, math.cos
+
+local f_fill_rgb = formatters["F (%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--C withcolor (%.3N,%.3N,%.3N) ;"]
+local f_draw_rgb = formatters["D (%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--C withcolor %.3F ;"]
+local f_mesh_rgb = formatters["U (%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--C withcolor (%.3N,%.3N,%.3N) ;"]
+local f_fill_cmy = formatters["F (%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--C withcolor (%.3N,%.3N,%.3N,0) ;"]
+local f_draw_cmy = formatters["D (%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--C withcolor %.3F ;"]
+local f_mesh_cmy = formatters["U (%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--(%.6N,%.6N)--C withcolor (%.3N,%.3N,%.3N,0) ;"]
+
+local f_function_n = formatters [ [[
+ local math = math
+ local round = math.round
+ %s
+ return function(x,y)
+ return %s
+ end
+]] ]
+
+local f_function_y = formatters [ [[
+ local math = math
+ local round = math.round
+ local nan = NaN
+ local inf = math.huge
+ local er = 0
+ %s
+ return function(x,y,dnan,dinf,report)
+ local n = %s
+ if n == nan then
+ er = er + 1
+ if er < 10 then
+ report("nan at (%s,%s)",x,y)
+ end
+ n = dnan
+ elseif n == inf then
+ er = er + 1
+ if er < 10 then
+ report("inf at (%s,%s)",x,y)
+ end
+ n = dinf
+ end
+ dx[my] = n
+ sy = sy + 1
+ end
+ return n, er
+end
+]] ]
+
+local f_color = formatters [ [[
+ local math = math
+ return function(f)
+ return %s
+ end
+]] ]
+
+function mp.lmt_surface_do(specification)
+ --
+ -- The projection and color brightness calculation have been inlined. We also store
+ -- differently.
+ --
+ -- todo: ignore weird paths
+ --
+ -- The prototype is now converted to use lmt parameter sets.
+ --
+ local p = getparameterset("surface")
+ --
+ local preamble = p.preamble or ""
+ local code = p.code or "return x + y"
+ local colorcode = p.color or "return f, f, f"
+ local linecolor = p.linecolor or 1
+ local xmin = p.xmin or -1
+ local xmax = p.xmax or 1
+ local ymin = p.ymin or -1
+ local ymax = p.ymax or 1
+ local xstep = p.xstep or .1
+ local ystep = p.ystep or .1
+ local bf = p.brightness or 100
+ local clip = p.clip or false
+ local lines = p.lines
+ local ha = p.snap or 0.01
+ local hb = 2 * ha
+ --
+ if lines == nil then lines = true end
+ --
+ if xstep == 0 then xstep = (xmax - xmin)/100 end
+ if ystep == 0 then ystep = (ymax - ymin)/100 end
+
+ local nxmin = round(xmin/xstep)
+ local nxmax = round(xmax/xstep)
+ local nymin = round(ymin/ystep)
+ local nymax = round(ymax/ystep)
+ local nx = nxmax - nxmin + 1
+ local ny = nymax - nymin + 1
+ --
+ local xvector = p.xvector or { -0.7, -0.7 }
+ local yvector = p.yvector or { 1, 0 }
+ local zvector = p.zvector or { 0, 1 }
+ local light = p.light or { 3, 3, 10 }
+ --
+ local xrx, xry = xvector[1], xvector[2]
+ local yrx, yry = yvector[1], yvector[2]
+ local zrx, zry = zvector[1], zvector[2]
+ local xp, yp, zp = light[1], light[2], light[3]
+ --
+ local data = setmetatableindex("table")
+ local dx = (xmax - xmin) / nx
+ local dy = (ymax - ymin) / ny
+ local xt = xmin
+ --
+ local minf, maxf
+ --
+ -- similar as contours but no data loop here
+ --
+ local fcode = load((p.check and f_function_y or f_function_n)(preamble,code))
+ local func = type(fcode) == "function" and fcode()
+ if type(func) ~= "function" then
+ return false -- fatal error
+ end
+ --
+ local ccode = load(f_color(colorcode))
+ local color = type(ccode) == "function" and ccode()
+ if type(color) ~= "function" then
+ return false -- fatal error
+ end
+ --
+ for i=0,nx do
+ local yt = ymin
+ for j=0,ny do
+ local zt = func(xt,yt)
+ -- projection from 3D to 2D coordinates
+ local x = xt * xrx + yt * yrx + zt * zrx
+ local y = xt * xry + yt * yry + zt * zry
+ local z = zt
+ -- numerical derivatives by central differences
+ local dfx = (func(xt+ha,yt) - func(xt-ha,yt)) / hb
+ local dfy = (func(xt,yt+ha) - func(xt,yt-ha)) / hb
+ -- compute brightness factor at a point
+ local ztp = zt - zp
+ local ytp = yt - yp
+ local xtp = xt - xp
+ local ztp = zt - zp
+ local ytp = yt - yp
+ local xtp = xt - xp
+ local ca = -ztp + dfy*ytp + dfx*xtp
+ local cb = sqrt(1+dfx*dfx+dfy*dfy)
+ local cc = sqrt(ztp*ztp + ytp*ytp + xtp*xtp)
+ local fac = bf*ca/(cb*cc*cc*cc)
+ -- addition: check range
+ if not minf then
+ minf = fac
+ maxf = fac
+ elseif fac < minf then
+ minf = fac
+ elseif fac > maxf then
+ maxf = fac
+ end
+ --
+ data[i][j] = { x, y, fac }
+ --
+ yt = yt + dy
+ end
+ xt = xt + dx
+ end
+ local result = { }
+ local r = 0
+ local range = maxf - minf
+ local cl = linecolor or 1
+ local enforce = attributes.colors.model == "cmyk"
+ for i=0,nx-1 do
+ for j=0,ny-1 do
+ -- points
+ local z1 = data[i] [j]
+ local z2 = data[i] [j+1]
+ local z3 = data[i+1][j+1]
+ local z4 = data[i+1][j]
+ -- color
+ local cf = z1[3]
+ if clip then
+ -- best clip here if needed
+ if cf < 0 then
+ cf = 0
+ elseif cf > 1 then
+ cf = 1
+ end
+ else
+ -- or remap when we want to
+ cf = (z1[3] - minf) / range
+ end
+ local z11 = z1[1]
+ local z12 = z1[2]
+ local z21 = z2[1]
+ local z22 = z2[2]
+ local z31 = z3[1]
+ local z32 = z3[2]
+ local z41 = z4[1]
+ local z42 = z4[2]
+ -- if lines then
+ -- -- fill first and draw then, previous shapes can be covered
+ -- else
+ -- -- fill and draw in one go to prevent artifacts
+ -- end
+ local cr, cg, cb = color(cf)
+ if not cr then cr = 0 end
+ if not cg then cg = 0 end
+ if not cb then cb = 0 end
+ if enforce then
+ cr, cg, cb = 1 - cr, 1 - cg, 1 - cb
+ r = r + 1
+ if lines then
+ result[r] = f_fill_cmy(z11,z12,z21,z22,z31,z32,z41,z42,cr,cg,cb)
+ r = r + 1
+ result[r] = f_draw_cmy(z11,z12,z21,z22,z31,z32,z41,z42,cl)
+ else
+ result[r] = f_mesh_cmy(z11,z12,z21,z22,z31,z32,z41,z42,cr,cg,cb)
+ end
+ else
+ r = r + 1
+ if lines then
+ result[r] = f_fill_rgb(z11,z12,z21,z22,z31,z32,z41,z42,cr,cg,cb)
+ r = r + 1
+ result[r] = f_draw_rgb(z11,z12,z21,z22,z31,z32,z41,z42,cl)
+ else
+ result[r] = f_mesh_rgb(z11,z12,z21,z22,z31,z32,z41,z42,cr,cg,cb)
+ end
+ end
+ end
+ end
+ mp.direct(concat(result))
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.lua b/Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.lua
index 89f2fa0eeb1..c913408cd05 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.lua
@@ -80,6 +80,7 @@ implement {
}
local patterns = {
+ CONTEXTLMTXMODE > 0 and "meta-imp-%s.mkxl" or "",
"meta-imp-%s.mkiv",
"meta-imp-%s.tex",
-- obsolete:
@@ -88,10 +89,8 @@ local patterns = {
}
local function action(name,foundname)
+ commands.loadlibrary(name,foundname,false)
status_metapost("library %a is loaded",name)
- context.startreadingfile()
- context.input(foundname)
- context.stopreadingfile()
end
local function failure(name)
@@ -245,6 +244,8 @@ implement {
arguments = "string",
}
+-- this has to become a codeinjection
+
function metapost.getclippath(specification) -- why not a special instance for this
local mpx = metapost.pushformat(specification)
local data = specification.data or ""
@@ -304,7 +305,14 @@ end
implement {
name = "mpsetclippath",
actions = function(specification)
- setmacro("MPclippath",metapost.theclippath(specification),"global")
+ local p = specification.data and metapost.theclippath(specification)
+ if not p or p == "" then
+ local b = number.dimenfactors.bp
+ local w = b * (specification.width or 0)
+ local h = b * (specification.height or 0)
+ p = formatters["0 0 m %.6N 0 l %.6N %.6N l 0 %.6N l"](w,w,h,h)
+ end
+ setmacro("MPclippath",p,"global")
end,
arguments = {
{
@@ -316,12 +324,14 @@ implement {
{ "inclusions" },
{ "method" },
{ "namespace" },
+ { "width", "dimension" },
+ { "height", "dimension" },
},
}
}
statistics.register("metapost", function()
- local n = metapost.n
+ local n = metapost.nofruns
if n and n > 0 then
local elapsedtime = statistics.elapsedtime
local elapsed = statistics.elapsed
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.mkiv b/Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.mkiv
index 1f05b6ef880..a1ed7efeb8c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.mkiv
@@ -11,73 +11,17 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D This file contains the \MPLIB\ variants of the by now ancient
-%D \MPTOPDF\ code.
-
\writestatus{loading}{MetaPost Library Graphics / Initializations}
\registerctxluafile{mlib-run}{}
\registerctxluafile{mlib-ctx}{}
\registerctxluafile{mlib-lua}{}
-\registerctxluafile{mlib-int}{} % here ?
+\registerctxluafile{mlib-lmp}{}
+\registerctxluafile{mlib-int}{}
+
+\doifelsefileexists{mlib-cnt.lua}{\registerctxluafile{mlib-cnt}{optimize}}{}
+\doifelsefileexists{mlib-svg.lua}{\registerctxluafile{mlib-svg}{optimize}}{}
\unprotect
\protect \endinput
-
-% local mpgraphic = [[
-% for i=1 upto 1000 :
-% beginfig(0);
-% draw halfcircle scaled 1cm withcolor green ;
-% picture p ; p := "oeps" infont defaultfont scaled .75 rotated 45 ;
-% p := p shifted - (xpart center p,0) ;
-% draw p ; draw boundingbox p ;
-% endfig ;
-% beginfig(0);
-% draw halfcircle scaled 1cm dashed evenly withcolor green ;
-% endfig ;
-% beginfig(0);
-% pickup pencircle xscaled .5mm yscaled .25mm rotated 45 ;
-% draw halfcircle scaled 1cm withcolor red ;
-% endfig ;
-% beginfig(0);
-% draw halfcircle scaled 1cm ;
-% endfig ;
-% beginfig(0);
-% pickup pencircle xscaled .5mm yscaled .25mm rotated 45 ;
-% for k:=1 upto 10 :
-% draw halfcircle scaled uniformdeviate(1cm) withcolor (red/(k/4)) ;
-% endfor ;
-% endfig ;
-% endfor ;
-% ]]
-% -- local mpx = metapost.format("metafun")
-% metapost.process(metapost.format("metafun"),mpgraphic)
-
-% \starttext
-% \setupcolors[state=start]
-% \definecolor[red] [r=1]
-% \definecolor[cyan][c=1]
-% \setbox\scratchbox\hbox{\startMPcode\stopMPcode} % first specials are forgotten
-% \definecolor[sss][t=.5,a=1,r=1]
-% \definespotcolor[oeps1][green][p=.5]
-% \definespotcolor[oeps2][green][p=.25]
-% \definespotcolor[oeps3][green][p=.25,t=.5,a=1]
-% \startMPpage
-% fill fullcircle scaled 10cm withcolor \MPcolor{red} ;
-% fill fullcircle scaled 8cm withcolor cmyk(1,0,0,0) ;
-% fill fullcircle scaled 6cm withcolor cmyk(0,1,0,0) ;
-% fill fullcircle scaled 4cm withcolor cmyk(0,0,1,0) ;
-% fill fullcircle scaled 2cm withcolor cmyk(0,0,0,1) ;
-% currentpicture := currentpicture shifted (-7.5cm,0) ;
-% fill fullcircle scaled 10cm withcolor transparent(1,0.75,cmyk(0,0,1,0)) ;
-% fill fullcircle scaled 8cm withcolor \MPcolor{sss} ;
-% fill fullcircle scaled 6cm withcolor \MPcolor{oeps1} ;
-% fill fullcircle scaled 4cm withcolor \MPcolor{oeps2} ;
-% currentpicture := currentpicture shifted (-7.5cm,0) ;
-% fill fullcircle scaled 10cm withcolor \MPcolor{oeps3} ;
-% circular_shade(fullcircle scaled 8cm, 1, red, blue) ;
-% circular_shade(fullcircle scaled 6cm, 1, (1,0,0,0), (0,1,0,0)) ;
-% circular_shade(fullcircle scaled 4cm, 1, cmyk(.5,.5,1,0), (0,1,0,0)) ;
-% \stopMPpage
-% \stoptext
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.mkxl b/Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.mkxl
new file mode 100644
index 00000000000..bb246062710
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-ctx.mkxl
@@ -0,0 +1,31 @@
+%D \module
+%D [ file=mlib-ctx,
+%D version=2008.03.25,
+%D title=\METAPOST\ Integrated Graphics,
+%D subtitle=Basics,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{MetaPost Library Graphics / Initializations}
+
+\registerctxluafile{mlib-run}{}
+\registerctxluafile{mlib-ctx}{}
+\registerctxluafile{mlib-lua}{}
+\registerctxluafile{mlib-scn}{}
+\registerctxluafile{mlib-mat}{}
+\registerctxluafile{mlib-lmp}{}
+\registerctxluafile{mlib-int}{}
+\registerctxluafile{mlib-lmt}{}
+
+\doifelsefileexists{mlib-cnt.lua}{\registerctxluafile{mlib-cnt}{}}{}
+\doifelsefileexists{mlib-svg.lua}{\registerctxluafile{mlib-svg}{}}{}
+
+\unprotect
+
+\protect \endinput
+
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-int.lua b/Master/texmf-dist/tex/context/base/mkiv/mlib-int.lua
index 63e7278dae7..6fca9530236 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mlib-int.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-int.lua
@@ -6,150 +6,261 @@ if not modules then modules = { } end modules ['mlib-int'] = {
license = "see context related readme files",
}
-local factor = number.dimenfactors.bp
------ mpprint = mp.print
-local mpnumeric = mp.numeric
-local mpboolean = mp.boolean
-local mpstring = mp.string
-local mpquoted = mp.quoted
-local getdimen = tex.getdimen
-local getcount = tex.getcount
-local getmacro = tokens.getters.macro
-local get = tex.get
-local mpcolor = attributes.colors.mpcolor
-local emwidths = fonts.hashes.emwidths
-local exheights = fonts.hashes.exheights
-
-local mpgetdimen = mp.getdimen
-
-function mp.PaperHeight () mpnumeric(getdimen("paperheight") *factor) end
-function mp.PaperWidth () mpnumeric(getdimen("paperwidth") *factor) end
-function mp.PrintPaperHeight () mpnumeric(getdimen("printpaperheight") *factor) end
-function mp.PrintPaperWidth () mpnumeric(getdimen("printpaperwidth") *factor) end
-function mp.TopSpace () mpnumeric(getdimen("topspace") *factor) end
-function mp.BottomSpace () mpnumeric(getdimen("bottomspace") *factor) end
-function mp.BackSpace () mpnumeric(getdimen("backspace") *factor) end
-function mp.CutSpace () mpnumeric(getdimen("cutspace") *factor) end
-function mp.MakeupHeight () mpnumeric(getdimen("makeupheight") *factor) end
-function mp.MakeupWidth () mpnumeric(getdimen("makeupwidth") *factor) end
-function mp.TopHeight () mpnumeric(getdimen("topheight") *factor) end
-function mp.TopDistance () mpnumeric(getdimen("topdistance") *factor) end
-function mp.HeaderHeight () mpnumeric(getdimen("headerheight") *factor) end
-function mp.HeaderDistance () mpnumeric(getdimen("headerdistance") *factor) end
-function mp.TextHeight () mpnumeric(getdimen("textheight") *factor) end
-function mp.FooterDistance () mpnumeric(getdimen("footerdistance") *factor) end
-function mp.FooterHeight () mpnumeric(getdimen("footerheight") *factor) end
-function mp.BottomDistance () mpnumeric(getdimen("bottomdistance") *factor) end
-function mp.BottomHeight () mpnumeric(getdimen("bottomheight") *factor) end
-function mp.LeftEdgeWidth () mpnumeric(getdimen("leftedgewidth") *factor) end
-function mp.LeftEdgeDistance () mpnumeric(getdimen("leftedgedistance") *factor) end
-function mp.LeftMarginWidth () mpnumeric(getdimen("leftmarginwidth") *factor) end
-function mp.LeftMarginDistance () mpnumeric(getdimen("leftmargindistance") *factor) end
-function mp.TextWidth () mpnumeric(getdimen("textwidth") *factor) end
-function mp.RightMarginDistance () mpnumeric(getdimen("rightmargindistance") *factor) end
-function mp.RightMarginWidth () mpnumeric(getdimen("rightmarginwidth") *factor) end
-function mp.RightEdgeDistance () mpnumeric(getdimen("rightedgedistance") *factor) end
-function mp.RightEdgeWidth () mpnumeric(getdimen("rightedgewidth") *factor) end
-function mp.InnerMarginDistance () mpnumeric(getdimen("innermargindistance") *factor) end
-function mp.InnerMarginWidth () mpnumeric(getdimen("innermarginwidth") *factor) end
-function mp.OuterMarginDistance () mpnumeric(getdimen("outermargindistance") *factor) end
-function mp.OuterMarginWidth () mpnumeric(getdimen("outermarginwidth") *factor) end
-function mp.InnerEdgeDistance () mpnumeric(getdimen("inneredgedistance") *factor) end
-function mp.InnerEdgeWidth () mpnumeric(getdimen("inneredgewidth") *factor) end
-function mp.OuterEdgeDistance () mpnumeric(getdimen("outeredgedistance") *factor) end
-function mp.OuterEdgeWidth () mpnumeric(getdimen("outeredgewidth") *factor) end
-function mp.PageOffset () mpnumeric(getdimen("pagebackgroundoffset")*factor) end
-function mp.PageDepth () mpnumeric(getdimen("pagebackgrounddepth") *factor) end
-function mp.LayoutColumns () mpnumeric(getcount("layoutcolumns")) end
-function mp.LayoutColumnDistance() mpnumeric(getdimen("layoutcolumndistance")*factor) end
-function mp.LayoutColumnWidth () mpnumeric(getdimen("layoutcolumnwidth") *factor) end
-function mp.SpineWidth () mpnumeric(getdimen("spinewidth") *factor) end
-function mp.PaperBleed () mpnumeric(getdimen("paperbleed") *factor) end
-
-function mp.RealPageNumber () mpnumeric(getcount("realpageno")) end
-function mp.LastPageNumber () mpnumeric(getcount("lastpageno")) end
-
-function mp.PageNumber () mpnumeric(getcount("pageno")) end
-function mp.NOfPages () mpnumeric(getcount("lastpageno")) end
-
-function mp.SubPageNumber () mpnumeric(getcount("subpageno")) end
-function mp.NOfSubPages () mpnumeric(getcount("lastsubpageno")) end
-
-function mp.CurrentColumn () mpnumeric(getcount("mofcolumns")) end
-function mp.NOfColumns () mpnumeric(getcount("nofcolumns")) end
-
-function mp.BaseLineSkip () mpnumeric(get ("baselineskip",true) *factor) end
-function mp.LineHeight () mpnumeric(getdimen("lineheight") *factor) end
-function mp.BodyFontSize () mpnumeric(getdimen("bodyfontsize") *factor) end
-
-function mp.TopSkip () mpnumeric(get ("topskip",true) *factor) end
-function mp.StrutHeight () mpnumeric(getdimen("strutht") *factor) end
-function mp.StrutDepth () mpnumeric(getdimen("strutdp") *factor) end
-
-function mp.PageNumber () mpnumeric(getcount("pageno")) end
-function mp.RealPageNumber () mpnumeric(getcount("realpageno")) end
-function mp.NOfPages () mpnumeric(getcount("lastpageno")) end
-
-function mp.CurrentWidth () mpnumeric(get ("hsize") *factor) end
-function mp.CurrentHeight () mpnumeric(get ("vsize") *factor) end
-
-function mp.EmWidth () mpnumeric(emwidths [false]*factor) end
-function mp.ExHeight () mpnumeric(exheights[false]*factor) end
-
-mp.HSize = mp.CurrentWidth
-mp.VSize = mp.CurrentHeight
-mp.LastPageNumber = mp.NOfPages
-
-function mp.PageFraction()
- local lastpage = getcount("lastpageno")
- if lastpage > 1 then
- mpnumeric((getcount("realpageno")-1)/(lastpage-1))
- else
- mpnumeric(1)
- end
+local factor = number.dimenfactors.bp
+----- mpprint = mp.print
+local mpnumeric = mp.numeric
+local mpboolean = mp.boolean
+local mpstring = mp.string
+local mpquoted = mp.quoted
+local getdimen = tex.getdimen
+local getcount = tex.getcount
+local getmacro = tokens.getters.macro
+local get = tex.get
+local mpcolor = attributes.colors.mpcolor
+local emwidths = fonts.hashes.emwidths
+local exheights = fonts.hashes.exheights
+
+local mpgetdimen = mp.getdimen
+
+local registerscript = metapost.registerscript
+
+local on_right_page = structures.pages.on_right
+local is_odd_page = structures.pages.is_odd
+local in_body_page = structures.pages.in_body
+local page_fraction = structures.pages.fraction
+
+local function defaultcolormodel() -- can be helper
+ local colormethod = getcount("MPcolormethod")
+ return (colormethod == 0 or colormethod == 1) and 1 or 3
end
--- locals
+if CONTEXTLMTXMODE > 0 then
-local on_right = structures.pages.on_right
-local is_odd = structures.pages.is_odd
-local in_body = structures.pages.in_body
+ local t = os.date("*t") -- maybe this should be a very early on global
-mp.OnRightPage = function() mpboolean(on_right()) end -- needs checking
-mp.OnOddPage = function() mpboolean(is_odd ()) end -- needs checking
-mp.InPageBody = function() mpboolean(in_body ()) end -- needs checking
+ registerscript("year", function() return t.year end)
+ registerscript("month", function() return t.month end)
+ registerscript("day", function() return t.day end)
+ registerscript("hour", function() return t.hour end)
+ registerscript("minute", function() return t.min end)
+ registerscript("second", function() return t.sec end)
--- mp.CurrentLayout : \currentlayout
+ registerscript("PaperHeight", function() return getdimen("paperheight") * factor end)
+ registerscript("PaperWidth", function() return getdimen("paperwidth") * factor end)
+ registerscript("PrintPaperHeight", function() return getdimen("printpaperheight") * factor end)
+ registerscript("PrintPaperWidth", function() return getdimen("printpaperwidth") * factor end)
+ registerscript("TopSpace", function() return getdimen("topspace") * factor end)
+ registerscript("BottomSpace", function() return getdimen("bottomspace") * factor end)
+ registerscript("BackSpace", function() return getdimen("backspace") * factor end)
+ registerscript("CutSpace", function() return getdimen("cutspace") * factor end)
+ registerscript("MakeupHeight", function() return getdimen("makeupheight") * factor end)
+ registerscript("MakeupWidth", function() return getdimen("makeupwidth") * factor end)
+ registerscript("TopHeight", function() return getdimen("topheight") * factor end)
+ registerscript("TopDistance", function() return getdimen("topdistance") * factor end)
+ registerscript("HeaderHeight", function() return getdimen("headerheight") * factor end)
+ registerscript("HeaderDistance", function() return getdimen("headerdistance") * factor end)
+ registerscript("TextHeight", function() return getdimen("textheight") * factor end)
+ registerscript("FooterDistance", function() return getdimen("footerdistance") * factor end)
+ registerscript("FooterHeight", function() return getdimen("footerheight") * factor end)
+ registerscript("BottomDistance", function() return getdimen("bottomdistance") * factor end)
+ registerscript("BottomHeight", function() return getdimen("bottomheight") * factor end)
+ registerscript("LeftEdgeWidth", function() return getdimen("leftedgewidth") * factor end)
+ registerscript("LeftEdgeDistance", function() return getdimen("leftedgedistance") * factor end)
+ registerscript("LeftMarginWidth", function() return getdimen("leftmarginwidth") * factor end)
+ registerscript("LeftMarginDistance", function() return getdimen("leftmargindistance") * factor end)
+ registerscript("TextWidth", function() return getdimen("textwidth") * factor end)
+ registerscript("RightMarginDistance", function() return getdimen("rightmargindistance") * factor end)
+ registerscript("RightMarginWidth", function() return getdimen("rightmarginwidth") * factor end)
+ registerscript("RightEdgeDistance", function() return getdimen("rightedgedistance") * factor end)
+ registerscript("RightEdgeWidth", function() return getdimen("rightedgewidth") * factor end)
+ registerscript("InnerMarginDistance", function() return getdimen("innermargindistance") * factor end)
+ registerscript("InnerMarginWidth", function() return getdimen("innermarginwidth") * factor end)
+ registerscript("OuterMarginDistance", function() return getdimen("outermargindistance") * factor end)
+ registerscript("OuterMarginWidth", function() return getdimen("outermarginwidth") * factor end)
+ registerscript("InnerEdgeDistance", function() return getdimen("inneredgedistance") * factor end)
+ registerscript("InnerEdgeWidth", function() return getdimen("inneredgewidth") * factor end)
+ registerscript("OuterEdgeDistance", function() return getdimen("outeredgedistance") * factor end)
+ registerscript("OuterEdgeWidth", function() return getdimen("outeredgewidth") * factor end)
+ registerscript("PageOffset", function() return getdimen("pagebackgroundoffset") * factor end)
+ registerscript("PageDepth", function() return getdimen("pagebackgrounddepth") * factor end)
+ registerscript("LayoutColumns", function() return getcount("layoutcolumns") end)
+ registerscript("LayoutColumnDistance", function() return getdimen("layoutcolumndistance") * factor end)
+ registerscript("LayoutColumnWidth", function() return getdimen("layoutcolumnwidth") * factor end)
+ registerscript("SpineWidth", function() return getdimen("spinewidth") * factor end)
+ registerscript("PaperBleed", function() return getdimen("paperbleed") * factor end)
-function mp.OverlayWidth () mpnumeric(getdimen("d_overlay_width") * factor) end
-function mp.OverlayHeight () mpnumeric(getdimen("d_overlay_height") * factor) end
-function mp.OverlayDepth () mpnumeric(getdimen("d_overlay_depth") * factor) end
-function mp.OverlayLineWidth() mpnumeric(getdimen("d_overlay_linewidth") * factor) end
-function mp.OverlayOffset () mpnumeric(getdimen("d_overlay_offset") * factor) end
-function mp.OverlayRegion () mpstring(getmacro("m_overlay_region")) end
+ registerscript("RealPageNumber", function() return getcount("realpageno") end)
+ registerscript("LastPageNumber", function() return getcount("lastpageno") end)
+
+ registerscript("PageNumber", function() return getcount("pageno") end)
+ registerscript("NOfPages", function() return getcount("lastpageno") end)
+
+ registerscript("SubPageNumber", function() return getcount("subpageno") end)
+ registerscript("NOfSubPages", function() return getcount("lastsubpageno") end)
+
+ registerscript("CurrentColumn", function() return getcount("mofcolumns") end)
+ registerscript("NOfColumns", function() return getcount("nofcolumns") end)
+
+ registerscript("BaseLineSkip", function() return get ("baselineskip",true) * factor end)
+ registerscript("LineHeight", function() return getdimen("lineheight") * factor end)
+ registerscript("BodyFontSize", function() return getdimen("bodyfontsize") * factor end)
+
+ registerscript("TopSkip", function() return get ("topskip",true) * factor end)
+ registerscript("StrutHeight", function() return getdimen("strutht") * factor end)
+ registerscript("StrutDepth", function() return getdimen("strutdp") * factor end)
+
+ registerscript("PageNumber", function() return getcount("pageno") end)
+ registerscript("RealPageNumber", function() return getcount("realpageno") end)
+ registerscript("NOfPages", function() return getcount("lastpageno") end)
+
+ registerscript("CurrentWidth", function() return get ("hsize") * factor end)
+ registerscript("CurrentHeight", function() return get ("vsize") * factor end)
+
+ registerscript("EmWidth", function() return emwidths [false] * factor end)
+ registerscript("ExHeight", function() return exheights[false] * factor end)
+
+ registerscript("HSize", function() return get ("hsize") * factor end)
+ registerscript("VSize", function() return get ("vsize") * factor end)
+ registerscript("LastPageNumber", function() return getcount("lastpageno") end)
+
+ registerscript("OverlayWidth", function() return getdimen("d_overlay_width") * factor end)
+ registerscript("OverlayHeight", function() return getdimen("d_overlay_height") * factor end)
+ registerscript("OverlayDepth", function() return getdimen("d_overlay_depth") * factor end)
+ registerscript("OverlayLineWidth", function() return getdimen("d_overlay_linewidth") * factor end)
+ registerscript("OverlayOffset", function() return getdimen("d_overlay_offset") * factor end)
+ registerscript("OverlayRegion", function() mpstring(getmacro("m_overlay_region")) end)
+ -- ("CurrentLayout", function() mpstring(getmacro("currentlayout")) end)
+
+ registerscript("PageFraction", page_fraction)
+ registerscript("OnRightPage", on_right_page)
+ registerscript("OnOddPage", is_odd_page )
+ registerscript("InPageBody", in_body_page )
+
+ registerscript("defaultcolormodel", defaultcolormodel)
+
+else
+
+ function mp.PaperHeight () mpnumeric(getdimen("paperheight") * factor) end
+ function mp.PaperWidth () mpnumeric(getdimen("paperwidth") * factor) end
+ function mp.PrintPaperHeight () mpnumeric(getdimen("printpaperheight") * factor) end
+ function mp.PrintPaperWidth () mpnumeric(getdimen("printpaperwidth") * factor) end
+ function mp.TopSpace () mpnumeric(getdimen("topspace") * factor) end
+ function mp.BottomSpace () mpnumeric(getdimen("bottomspace") * factor) end
+ function mp.BackSpace () mpnumeric(getdimen("backspace") * factor) end
+ function mp.CutSpace () mpnumeric(getdimen("cutspace") * factor) end
+ function mp.MakeupHeight () mpnumeric(getdimen("makeupheight") * factor) end
+ function mp.MakeupWidth () mpnumeric(getdimen("makeupwidth") * factor) end
+ function mp.TopHeight () mpnumeric(getdimen("topheight") * factor) end
+ function mp.TopDistance () mpnumeric(getdimen("topdistance") * factor) end
+ function mp.HeaderHeight () mpnumeric(getdimen("headerheight") * factor) end
+ function mp.HeaderDistance () mpnumeric(getdimen("headerdistance") * factor) end
+ function mp.TextHeight () mpnumeric(getdimen("textheight") * factor) end
+ function mp.FooterDistance () mpnumeric(getdimen("footerdistance") * factor) end
+ function mp.FooterHeight () mpnumeric(getdimen("footerheight") * factor) end
+ function mp.BottomDistance () mpnumeric(getdimen("bottomdistance") * factor) end
+ function mp.BottomHeight () mpnumeric(getdimen("bottomheight") * factor) end
+ function mp.LeftEdgeWidth () mpnumeric(getdimen("leftedgewidth") * factor) end
+ function mp.LeftEdgeDistance () mpnumeric(getdimen("leftedgedistance") * factor) end
+ function mp.LeftMarginWidth () mpnumeric(getdimen("leftmarginwidth") * factor) end
+ function mp.LeftMarginDistance () mpnumeric(getdimen("leftmargindistance") * factor) end
+ function mp.TextWidth () mpnumeric(getdimen("textwidth") * factor) end
+ function mp.RightMarginDistance () mpnumeric(getdimen("rightmargindistance") * factor) end
+ function mp.RightMarginWidth () mpnumeric(getdimen("rightmarginwidth") * factor) end
+ function mp.RightEdgeDistance () mpnumeric(getdimen("rightedgedistance") * factor) end
+ function mp.RightEdgeWidth () mpnumeric(getdimen("rightedgewidth") * factor) end
+ function mp.InnerMarginDistance () mpnumeric(getdimen("innermargindistance") * factor) end
+ function mp.InnerMarginWidth () mpnumeric(getdimen("innermarginwidth") * factor) end
+ function mp.OuterMarginDistance () mpnumeric(getdimen("outermargindistance") * factor) end
+ function mp.OuterMarginWidth () mpnumeric(getdimen("outermarginwidth") * factor) end
+ function mp.InnerEdgeDistance () mpnumeric(getdimen("inneredgedistance") * factor) end
+ function mp.InnerEdgeWidth () mpnumeric(getdimen("inneredgewidth") * factor) end
+ function mp.OuterEdgeDistance () mpnumeric(getdimen("outeredgedistance") * factor) end
+ function mp.OuterEdgeWidth () mpnumeric(getdimen("outeredgewidth") * factor) end
+ function mp.PageOffset () mpnumeric(getdimen("pagebackgroundoffset") * factor) end
+ function mp.PageDepth () mpnumeric(getdimen("pagebackgrounddepth") * factor) end
+ function mp.LayoutColumns () mpnumeric(getcount("layoutcolumns")) end
+ function mp.LayoutColumnDistance() mpnumeric(getdimen("layoutcolumndistance") * factor) end
+ function mp.LayoutColumnWidth () mpnumeric(getdimen("layoutcolumnwidth") * factor) end
+ function mp.SpineWidth () mpnumeric(getdimen("spinewidth") * factor) end
+ function mp.PaperBleed () mpnumeric(getdimen("paperbleed") * factor) end
+
+ function mp.RealPageNumber () mpnumeric(getcount("realpageno") ) end
+ function mp.LastPageNumber () mpnumeric(getcount("lastpageno") ) end
+
+ function mp.PageNumber () mpnumeric(getcount("pageno") ) end
+ function mp.NOfPages () mpnumeric(getcount("lastpageno") ) end
+
+ function mp.SubPageNumber () mpnumeric(getcount("subpageno") ) end
+ function mp.NOfSubPages () mpnumeric(getcount("lastsubpageno") ) end
+
+ function mp.CurrentColumn () mpnumeric(getcount("mofcolumns") ) end
+ function mp.NOfColumns () mpnumeric(getcount("nofcolumns") ) end
+
+ function mp.BaseLineSkip () mpnumeric(get ("baselineskip",true) * factor) end
+ function mp.LineHeight () mpnumeric(getdimen("lineheight") * factor) end
+ function mp.BodyFontSize () mpnumeric(getdimen("bodyfontsize") * factor) end
+
+ function mp.TopSkip () mpnumeric(get ("topskip",true) * factor) end
+ function mp.StrutHeight () mpnumeric(getdimen("strutht") * factor) end
+ function mp.StrutDepth () mpnumeric(getdimen("strutdp") * factor) end
+
+ function mp.PageNumber () mpnumeric(getcount("pageno") ) end
+ function mp.RealPageNumber () mpnumeric(getcount("realpageno") ) end
+ function mp.NOfPages () mpnumeric(getcount("lastpageno") ) end
+
+ function mp.CurrentWidth () mpnumeric(get ("hsize") * factor) end
+ function mp.CurrentHeight () mpnumeric(get ("vsize") * factor) end
+
+ function mp.EmWidth () mpnumeric(emwidths [false] * factor) end
+ function mp.ExHeight () mpnumeric(exheights[false] * factor) end
+
+ function mp.OverlayWidth () mpnumeric(getdimen("d_overlay_width") * factor) end
+ function mp.OverlayHeight () mpnumeric(getdimen("d_overlay_height") * factor) end
+ function mp.OverlayDepth () mpnumeric(getdimen("d_overlay_depth") * factor) end
+ function mp.OverlayLineWidth () mpnumeric(getdimen("d_overlay_linewidth") * factor) end
+ function mp.OverlayOffset () mpnumeric(getdimen("d_overlay_offset") * factor) end
+ function mp.OverlayRegion () mpstring (getmacro("m_overlay_region") ) end
+
+ function mp.PageFraction () mpnumeric(page_fraction() ) end
+ function mp.OnRightPage () mpboolean(on_right_page() ) end
+ function mp.OnOddPage () mpboolean(is_odd_page () ) end
+ function mp.InPageBody () mpboolean(in_body_page () ) end
+
+ function mp.OverlayWidth () mpnumeric(getdimen("d_overlay_width") * factor) end
+ function mp.OverlayHeight () mpnumeric(getdimen("d_overlay_height") * factor) end
+ function mp.OverlayDepth () mpnumeric(getdimen("d_overlay_depth") * factor) end
+ function mp.OverlayLineWidth () mpnumeric(getdimen("d_overlay_linewidth") * factor) end
+ function mp.OverlayOffset () mpnumeric(getdimen("d_overlay_offset") * factor) end
+ function mp.OverlayRegion () mpstring (getmacro("m_overlay_region") ) end
+ -- mp.CurrentLayout () mpstring (getmacro("currentlayout")) end
+
+ function mp.defaultcolormodel () mpnumeric(defaultcolormodel()) end
+
+ mp.HSize = mp.CurrentWidth
+ mp.VSize = mp.CurrentHeight
+ mp.LastPageNumber = mp.NOfPages
+
+ -- not much difference (10000 calls in a graphic neither as expansion seems to win
+ -- over defining the macro etc) so let's not waste counters then
+
+ -- function mp.OverlayColor()
+ -- local c = mpcolor(
+ -- getcount("c_overlay_colormodel"),
+ -- getcount("c_overlay_color"),
+ -- getcount("c_overlay_transparency")
+ -- )
+ -- mpquoted(c)
+ -- end
+ --
+ -- function mp.OverlayLineColor()
+ -- local c = mpcolor(
+ -- getcount("c_overlay_colormodel"),
+ -- getcount("c_overlay_linecolor"),
+ -- getcount("c_overlay_linetransparency")
+ -- )
+ -- mpquoted(c)
+ -- end
-function mp.mf_default_color_model()
- local colormethod = getcount("MPcolormethod")
- return mpnumeric((colormethod == 0 or colormethod == 1) and 1 or 3)
end
--- not much difference (10000 calls in a graphic neither as expansion seems to win
--- over defining the macro etc) so let's not waste counters then
-
--- function mp.OverlayColor()
--- local c = mpcolor(
--- getcount("c_overlay_colormodel"),
--- getcount("c_overlay_color"),
--- getcount("c_overlay_transparency")
--- )
--- mpquoted(c)
--- end
---
--- function mp.OverlayLineColor()
--- local c = mpcolor(
--- getcount("c_overlay_colormodel"),
--- getcount("c_overlay_linecolor"),
--- getcount("c_overlay_linetransparency")
--- )
--- mpquoted(c)
--- end
+
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-lmp.lua b/Master/texmf-dist/tex/context/base/mkiv/mlib-lmp.lua
new file mode 100644
index 00000000000..402c194fe34
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-lmp.lua
@@ -0,0 +1,215 @@
+if not modules then modules = { } end modules ['mlib-lmp'] = {
+ version = 1.001,
+ comment = "companion to mlib-ctx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+local type = type
+
+local aux = mp.aux
+local mpnumeric = aux.numeric
+local mppair = aux.pair
+local mpquoted = aux.quoted
+local mpdirect = aux.direct
+
+-- todo: use a stack?
+
+do
+
+ local p = nil
+ local n = 0
+
+ local function mf_path_reset()
+ p = nil
+ n = 0
+ end
+
+ if CONTEXTLMTXMODE > 0 then
+
+ local scan = mp.scan
+ local scannumber = scan.number
+ local scanpath = scan.path
+
+ local function mf_path_length()
+ p = scanpath()
+ n = p and #p or 1
+ mpnumeric(n)
+ end
+
+ local function mf_path_point()
+ local i = scannumber()
+ if i > 0 and i <= n then
+ local pi = p[i]
+ mppair(pi[1],pi[2])
+ end
+ end
+
+ local function mf_path_left()
+ local i = scannumber()
+ if i > 0 and i <= n then
+ local pi = p[i]
+ mppair(pi[5],pi[6])
+ end
+ end
+
+ local function mf_path_right()
+ local i = scannumber()
+ if i > 0 and i <= n then
+ local pn
+ if i == 1 then
+ pn = p[2] or p[1]
+ else
+ pn = p[i+1] or p[1]
+ end
+ mppair(pn[3],pn[4])
+ end
+ end
+
+ local registerscript = metapost.registerscript
+
+ registerscript("pathreset", mf_path_reset)
+ registerscript("pathlengthof", mf_path_length)
+ registerscript("pathpointof", mf_path_point)
+ registerscript("pathleftof", mf_path_left)
+ registerscript("pathrightof", mf_path_right)
+
+ else
+
+ local get = mp.get
+ local mpgetpath = get.path
+
+ local function mf_path_length(name)
+ p = mpgetpath(name)
+ n = p and #p or 0
+ mpnumeric(n)
+ end
+
+ local function mf_path_point(i)
+ if i > 0 and i <= n then
+ local pi = p[i]
+ mppair(pi[1],pi[2])
+ end
+ end
+
+ local function mf_path_left(i)
+ if i > 0 and i <= n then
+ local pi = p[i]
+ mppair(pi[5],pi[6])
+ end
+ end
+
+ local function mf_path_right(i)
+ if i > 0 and i <= n then
+ local pn
+ if i == 1 then
+ pn = p[2] or p[1]
+ else
+ pn = p[i+1] or p[1]
+ end
+ mppair(pn[3],pn[4])
+ end
+ end
+
+ mp.mf_path_length = mf_path_length mp.pathlength = mf_path_length
+ mp.mf_path_point = mf_path_point mp.pathpoint = mf_path_point
+ mp.mf_path_left = mf_path_left mp.pathleft = mf_path_left
+ mp.mf_path_right = mf_path_right mp.pathright = mf_path_right
+ mp.mf_path_reset = mf_path_reset mp.pathreset = mf_path_reset
+
+ end
+
+end
+
+do
+
+ -- if needed we can optimize the sub (cache last split)
+
+ local utflen, utfsub = utf.len, utf.sub
+
+ function mp.utflen(s)
+ mpnumeric(utflen(s))
+ end
+
+ function mp.utfsub(s,f,t)
+ mpquoted(utfsub(s,f,t or f))
+ end
+
+end
+
+if CONTEXTLMTXMODE > 0 then
+
+ function mp.lmt_svg_include()
+ local labelfile = metapost.getparameter { "labelfile" }
+ if labelfile then
+ local labels = table.load(labelfile) -- todo: same path as svg file
+ if type(labels) == "table" then
+ for i=1,#labels do
+ metapost.remaptext(labels[i])
+ end
+ end
+ end
+ local fontname = metapost.getparameter { "fontname" }
+ if fontname and fontname ~= "" then
+ local unicode = metapost.getparameter { "unicode" }
+ if unicode then
+ mpdirect (
+ metapost.svgglyphtomp(fontname,math.round(unicode))
+ )
+ end
+ return
+ end
+ local filename = metapost.getparameter { "filename" }
+ if filename and filename ~= "" then
+ mpdirect ( metapost.svgtomp {
+ data = io.loaddata(filename),
+ remap = true,
+ } )
+ return
+ end
+ local buffer = metapost.getparameter { "buffer" }
+ if buffer then
+ mpdirect ( metapost.svgtomp {
+ data = buffers.getcontent(buffer),
+ -- remap = true,
+ } )
+ return
+ end
+ local code = metapost.getparameter { "code" }
+ if code then
+ mpdirect ( metapost.svgtomp {
+ data = code,
+ } )
+ return
+ end
+ end
+
+end
+
+if CONTEXTLMTXMODE > 0 then
+
+ function mp.lmt_do_remaptext()
+ local parameters = metapost.scanparameters()
+ if parameters and parameters.label then
+ metapost.remaptext(parameters)
+ end
+ end
+
+end
+
+if CONTEXTLMTXMODE > 0 then
+
+ local dropins = fonts.dropins
+ local registerglyphs = dropins.registerglyphs
+ local registerglyph = dropins.registerglyph
+
+ function mp.lmt_register_glyph()
+ registerglyph(metapost.getparameterset("mpsglyph"))
+ end
+
+ function mp.lmt_register_glyphs()
+ registerglyphs(metapost.getparameterset("mpsglyphs"))
+ end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-lmt.lua b/Master/texmf-dist/tex/context/base/mkiv/mlib-lmt.lua
new file mode 100644
index 00000000000..9137861a58e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-lmt.lua
@@ -0,0 +1,63 @@
+if not modules then modules = { } end modules ['mlib-lmt'] = {
+ version = 1.001,
+ comment = "companion to mlib-ctx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+local mppath = mp.path
+
+local scannumeric = mp.scan.numeric
+local scanpath = mp.scan.path
+
+local getparameter = metapost.getparameter
+
+function mp.lmt_function_x(xmin,xmax,xstep,code,shape) -- experimental
+ local code = "return function(x) return " .. code .. " end"
+ local action = load(code)
+ local points = { }
+ local nofpoints = 0
+ if action then
+ action = action()
+ end
+ if shape == "steps" then
+ local halfx = xstep / 2
+ local lastx = xmin
+ local lasty = action(xmin)
+ for xi = xmin, xmax, xstep do
+ local yi = action(xi)
+ local xx = lastx + halfx
+ nofpoints = nofpoints + 1 ; points[nofpoints] = { xx, lasty }
+ nofpoints = nofpoints + 1 ; points[nofpoints] = { xx, yi }
+ lastx = xi
+ lasty = yi
+ end
+ if points[nofpoints][1] ~= xmax then
+ local yi = action(xmax)
+ local xx = lastx + halfx
+ nofpoints = nofpoints + 1 ; points[nofpoints] = { xx, lasty }
+ nofpoints = nofpoints + 1 ; points[nofpoints] = { xx, yi }
+ lastx = xi
+ lasty = yi
+ end
+ else
+ for xi = xmin, xmax, xstep do
+ nofpoints = nofpoints + 1 ; points[nofpoints] = { xi, action(xi) }
+ end
+ if points[nofpoints][1] ~= xmax then
+ nofpoints = nofpoints + 1 ; points[nofpoints] = { xmax, action(xmax) }
+ end
+ end
+ mppath(points,shape == "curve" and ".." or "--",false)
+end
+
+function mp.lmt_mesh_set()
+ local mesh = getparameter { "mesh", "paths" }
+ structures.references.currentset.mesh = mesh
+end
+
+function mp.lmt_mesh_update()
+ local mesh = getparameter { "paths" } or getparameter { "mesh", "paths" }
+ mesh[scannumeric()] = scanpath(true)
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-lua.lua b/Master/texmf-dist/tex/context/base/mkiv/mlib-lua.lua
index d7c2a0fc3f2..83ce152e201 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mlib-lua.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-lua.lua
@@ -21,19 +21,20 @@ local lpegpatterns = lpeg.patterns
local P, S, Ct, Cs, Cc, C = lpeg.P, lpeg.S, lpeg.Ct, lpeg.Cs, lpeg.Cc, lpeg.C
local report_luarun = logs.reporter("metapost","lua")
+local report_script = logs.reporter("metapost","script")
local report_message = logs.reporter("metapost")
local trace_luarun = false trackers.register("metapost.lua",function(v) trace_luarun = v end)
-local trace_enabled = true
local be_tolerant = true directives.register("metapost.lua.tolerant", function(v) be_tolerant = v end)
-local get, set, aux = { }, { }, { }
+local get, set, aux, scan = { }, { }, { }, { }
mp = mp or { -- system namespace
- set = set,
- get = get,
- aux = aux,
+ set = set,
+ get = get,
+ aux = aux,
+ scan = scan,
}
MP = MP or { -- user namespace
@@ -56,22 +57,60 @@ table.setmetatablecall(MP,function(t,k,...) return t[k](...) end)
do
- local currentmpx = nil
- local stack = { }
+ local currentmpx = nil
+ local stack = { }
+
+ if CONTEXTLMTXMODE > 0 then
+
+ local scan_next = mplib.scan_next
+ local scan_expression = mplib.scan_expression
+ local scan_token = mplib.scan_token
+ local scan_symbol = mplib.scan_symbol
+ local scan_numeric = mplib.scan_numeric
+ local scan_integer = mplib.scan_integer
+ local scan_boolean = mplib.scan_boolean
+ local scan_string = mplib.scan_string
+ local scan_pair = mplib.scan_pair
+ local scan_color = mplib.scan_color
+ local scan_cmykcolor = mplib.scan_cmykcolor
+ local scan_transform = mplib.scan_transform
+ local scan_path = mplib.scan_path
+ local scan_pen = mplib.scan_pen
+
+ scan.next = function(k) return scan_next (currentmpx,k) end
+ scan.expression = function(k) return scan_expression(currentmpx,k) end
+ scan.token = function(k) return scan_token (currentmpx,k) end
+ scan.symbol = function(k,e) return scan_symbol (currentmpx,k,e) end
+ scan.numeric = function() return scan_numeric (currentmpx) end
+ scan.number = function() return scan_numeric (currentmpx) end
+ scan.integer = function() return scan_integer (currentmpx) end
+ scan.boolean = function() return scan_boolean (currentmpx) end
+ scan.string = function() return scan_string (currentmpx) end
+ scan.pair = function(t) return scan_pair (currentmpx,t) end
+ scan.color = function(t) return scan_color (currentmpx,t) end
+ scan.cmykcolor = function(t) return scan_cmykcolor (currentmpx,t) end
+ scan.transform = function(t) return scan_transform (currentmpx,t) end
+ scan.path = function(t) return scan_path (currentmpx,t) end
+ scan.pen = function(t) return scan_pen (currentmpx,t) end
+
+ else
+
+ local get_numeric = mplib.get_numeric
+ local get_integer = mplib.get_integer
+ local get_string = mplib.get_string
+ local get_boolean = mplib.get_boolean
+ local get_path = mplib.get_path
+ local set_path = mplib.set_path
+
+ get.numeric = function(s) return get_numeric(currentmpx,s) end
+ get.number = function(s) return get_numeric(currentmpx,s) end
+ get.integer = function(s) return get_integer(currentmpx,s) end
+ get.string = function(s) return get_string (currentmpx,s) end
+ get.boolean = function(s) return get_boolean(currentmpx,s) end
+ get.path = function(s) return get_path (currentmpx,s) end
+ set.path = function(s,t) return set_path (currentmpx,s,t) end -- not working yet
- local get_numeric = mplib.get_numeric
- local get_string = mplib.get_string
- local get_boolean = mplib.get_boolean
- local get_path = mplib.get_path
- local set_path = mplib.set_path
-
- get.numeric = function(s) return get_numeric(currentmpx,s) end
- get.string = function(s) return get_string (currentmpx,s) end
- get.boolean = function(s) return get_boolean(currentmpx,s) end
- get.path = function(s) return get_path (currentmpx,s) end
- get.number = function(s) return get_numeric(currentmpx,s) end
-
- set.path = function(s,t) return set_path(currentmpx,s,t) end -- not working yet
+ end
function metapost.pushscriptrunner(mpx)
insert(stack,mpx)
@@ -82,55 +121,36 @@ do
currentmpx = remove(stack,mpx)
end
-end
-
-do
+ function metapost.currentmpx()
+ return currentmpx
+ end
- local buffer = { }
- local n = 0
- local max = 20 -- we reuse upto max
- local nesting = 0
- local runs = 0
+ local status = mplib.status
- local function _f_()
- if trace_enabled and trace_luarun then
- local result = concat(buffer," ",1,n)
- if n > max then
- buffer = { }
- end
- n = 0
- report_luarun("%i: data: %s",nesting,result)
- return result
- else
- if n == 0 then
- return ""
- end
- local result
- if n == 1 then
- result = buffer[1]
- else
- result = concat(buffer," ",1,n)
- end
- if n > max then
- buffer = { }
- end
- n = 0
- return result
- end
+ function metapost.currentmpxstatus()
+ return status and status(currentmpx) or 0
end
- mp._f_ = _f_ -- convenient to have it in a top module
- aux.flush = _f_
+end
+
+do
- ----- f_code = formatters["%s return mp._f_()"]
+ -- serializers
local f_integer = formatters["%i"]
+ local f_numeric = formatters["%F"]
- local f_numeric = formatters["%n"] -- maybe %N
- local f_pair = formatters["(%n,%n)"]
- local f_ctrl = formatters["(%n,%n) .. controls (%n,%n) and (%n,%n)"]
- local f_triplet = formatters["(%n,%n,%n)"]
- local f_quadruple = formatters["(%n,%n,%n,%n)"]
+ -- no %n as that can produce -e notation and that is not so nice for scaled butmaybe we
+ -- should then switch between ... i.e. make a push/pop for the formatters here ... not now.
+
+ local f_integer = formatters["%i"]
+ local f_numeric = formatters["%F"]
+ local f_pair = formatters["(%F,%F)"]
+ local f_ctrl = formatters["(%F,%F) .. controls (%F,%F) and (%F,%F)"]
+ local f_triplet = formatters["(%F,%F,%F)"]
+ local f_quadruple = formatters["(%F,%F,%F,%F)"]
+ local f_transform = formatters["totransform(%F,%F,%F,%F,%F,%F)"]
+ local f_pen = formatters["(pencircle transformed totransform(%F,%F,%F,%F,%F,%F))"]
local f_points = formatters["%p"]
local f_pair_pt = formatters["(%p,%p)"]
@@ -148,24 +168,183 @@ do
mp.cleaned = function(s) return lpegmatch(p,s) or s end
- -- local function mpprint(...) -- we can optimize for n=1
- -- for i=1,select("#",...) do
- -- local value = (select(i,...))
- -- if value ~= nil then
- -- n = n + 1
- -- local t = type(value)
- -- if t == "number" then
- -- buffer[n] = f_numeric(value)
- -- elseif t == "string" then
- -- buffer[n] = value
- -- elseif t == "table" then
- -- buffer[n] = "(" .. concat(value,",") .. ")"
- -- else -- boolean or whatever
- -- buffer[n] = tostring(value)
- -- end
- -- end
- -- end
- -- end
+ -- management
+
+ -- sometimes we gain (e.g. .5 sec on the sync test)
+
+ local cache = table.makeweak()
+
+ local runscripts = { }
+ local runnames = { }
+ local nofscripts = 0
+
+ function metapost.registerscript(name,f)
+ nofscripts = nofscripts + 1
+ if f then
+ runscripts[nofscripts] = f
+ runnames[name] = nofscripts
+ else
+ runscripts[nofscripts] = name
+ end
+ return nofscripts
+ end
+
+ function metapost.scriptindex(name)
+ return runnames[name] or 0
+ end
+
+ -- The gbuffer sharing and such is not really needed now but make a dent when
+ -- we have a high volume of simpel calls (loops) so we keep it around for a
+ -- while.
+
+ local nesting = 0
+ local runs = 0
+ local gbuffer = { }
+ local buffer = gbuffer
+ local n = 0
+
+ local function mpdirect1(a)
+ n = n + 1 buffer[n] = a
+ end
+ local function mpdirect2(a,b)
+ n = n + 1 buffer[n] = a
+ n = n + 1 buffer[n] = b
+ end
+ local function mpdirect3(a,b,c)
+ n = n + 1 buffer[n] = a
+ n = n + 1 buffer[n] = b
+ n = n + 1 buffer[n] = c
+ end
+ local function mpdirect4(a,b,c,d)
+ n = n + 1 buffer[n] = a
+ n = n + 1 buffer[n] = b
+ n = n + 1 buffer[n] = c
+ n = n + 1 buffer[n] = d
+ end
+ local function mpdirect5(a,b,c,d,e)
+ n = n + 1 buffer[n] = a
+ n = n + 1 buffer[n] = b
+ n = n + 1 buffer[n] = c
+ n = n + 1 buffer[n] = d
+ n = n + 1 buffer[n] = e
+ end
+
+ local function mpflush(separator)
+ buffer[1] = concat(buffer,separator or "",1,n)
+ n = 1
+ end
+
+ function metapost.runscript(code)
+ nesting = nesting + 1
+ runs = runs + 1
+
+ local index = type(code) == "number"
+ local f
+ local result
+
+ if index then
+ f = runscripts[code]
+ if not f then
+ report_luarun("%i: bad index: %s",nesting,code)
+ elseif trace_luarun then
+ report_luarun("%i: index: %i",nesting,code)
+ end
+ else
+ if trace_luarun then
+ report_luarun("%i: code: %s",nesting,code)
+ end
+ f = cache[code]
+ if not f then
+ f = loadstring("return " .. code)
+ if f then
+ cache[code] = f
+ elseif be_tolerant then
+ f = loadstring(code)
+ if f then
+ cache[code] = f
+ end
+ end
+ end
+ end
+
+ -- returning nil is more efficient and a signal not to scan in mp
+
+ if f then
+
+ local lbuffer, ln
+
+ if nesting == 1 then
+ buffer = gbuffer
+ n = 0
+ else
+ lbuffer = buffer
+ ln = n
+ buffer = { }
+ n = 0
+ end
+
+ result = f()
+
+ if result then
+ local t = type(result)
+ if t == "number" then
+ result = f_numeric(result)
+ elseif t == "table" then
+ result = concat(result) -- no spaces here
+ else
+ result = tostring(result)
+ end
+ if trace_luarun then
+ report_luarun("%i: %s result: %s",nesting,t,result)
+ end
+ elseif n == 0 then
+ result = ""
+ if trace_luarun then
+ report_luarun("%i: no buffered result",nesting)
+ end
+ elseif n == 1 then
+ result = buffer[1]
+ if trace_luarun then
+ report_luarun("%i: 1 buffered result: %s",nesting,result)
+ end
+ else
+ -- the space is why we sometimes have collectors
+ if nesting == 1 then
+ result = concat(buffer," ",1,n)
+ if n > 500 or #result > 10000 then
+ gbuffer = { } -- newtable(20,0)
+ lbuffer = gbuffer
+ end
+ else
+ result = concat(buffer," ")
+ end
+ if trace_luarun then
+ report_luarun("%i: %i buffered results: %s",nesting,n,result)
+ end
+ end
+
+ if nesting == 1 then
+ n = 0
+ else
+ buffer = lbuffer
+ n = ln
+ end
+
+ else
+ report_luarun("%i: no result, invalid code: %s",nesting,code)
+ result = ""
+ end
+
+ nesting = nesting - 1
+
+ return result
+ end
+
+ function metapost.nofscriptruns()
+ return runs
+ end
+
+ -- writers
local function mpp(value)
n = n + 1
@@ -175,7 +354,11 @@ do
elseif t == "string" then
buffer[n] = value
elseif t == "table" then
- buffer[n] = "(" .. concat(value,",") .. ")"
+ if #t == 6 then
+ buffer[n] = "totransform(" .. concat(value,",") .. ")"
+ else
+ buffer[n] = "(" .. concat(value,",") .. ")"
+ end
else -- boolean or whatever
buffer[n] = tostring(value)
end
@@ -317,6 +500,37 @@ do
end
end
+ local function mptransform(x,y,xx,xy,yx,yy)
+ n = n + 1
+ if type(x) == "table" then
+ buffer[n] = f_transform(x[1],x[2],x[3],x[4],x[5],x[6])
+ else
+ buffer[n] = f_transform(x,y,xx,xy,yx,yy)
+ end
+ end
+
+ local function mpcolor(c,m,y,k)
+ n = n + 1
+ if type(c) == "table" then
+ local l = #c
+ if l == 4 then
+ buffer[n] = f_quadruple(c[1],c[2],c[3],c[4])
+ elseif l == 3 then
+ buffer[n] = f_triplet(c[1],c[2],c[3])
+ else
+ buffer[n] = f_numeric(c[1])
+ end
+ else
+ if k then
+ buffer[n] = f_quadruple(c,m,y,k)
+ elseif y then
+ buffer[n] = f_triplet(c,m,y)
+ else
+ buffer[n] = f_numeric(c)
+ end
+ end
+ end
+
-- we have three kind of connectors:
--
-- .. ... -- (true)
@@ -326,7 +540,12 @@ do
local tn = #t
if tn == 1 then
local t1 = t[1]
- n = n + 1 ; buffer[n] = f2(t1[1],t1[2])
+ n = n + 1
+ if t.pen then
+ buffer[n] = f_pen(unpack(t1))
+ else
+ buffer[n] = f2(t1[1],t1[2])
+ end
elseif tn > 0 then
if connector == true or connector == nil then
connector = ".."
@@ -344,6 +563,8 @@ do
local a = t[1]
local b = t[2]
n = n + 1
+ buffer[n] = "("
+ n = n + 1
if six and #a == 6 and #b == 6 then
buffer[n] = f6(a[1],a[2],a[5],a[6],b[3],b[4])
controls = ".."
@@ -385,6 +606,8 @@ do
else
buffer[n] = f2(a[1],a[2])
end
+ n = n + 1
+ buffer[n] = ")"
end
end
end
@@ -429,6 +652,13 @@ do
end
end
+ aux.direct = mpdirect1
+ aux.direct1 = mpdirect1
+ aux.direct2 = mpdirect2
+ aux.direct3 = mpdirect3
+ aux.direct4 = mpdirect4
+ aux.flush = mpflush
+
aux.print = mpprint
aux.vprint = mpvprint
aux.boolean = mpboolean
@@ -448,72 +678,77 @@ do
aux.size = mpsize
aux.fprint = mpfprint
aux.quoted = mpquoted
+ aux.transform = mptransform
+ aux.color = mpcolor
- -- we need access to the variables
-
- function metapost.nofscriptruns()
- return runs
- end
-
- -- sometimes we gain (e.g. .5 sec on the sync test)
-
- local cache = table.makeweak()
+ -- for the moment
- function metapost.runscript(code)
- nesting = nesting + 1
- local trace = trace_enabled and trace_luarun
- if trace then
- report_luarun("%i: code: %s",nesting,code)
- end
- runs = runs + 1
- local f = cache[code]
- if not f then
- f = loadstring(code .. " return mp._f_()")
- if f then
- cache[code] = f
- elseif be_tolerant then
- f = loadstring(code)
- if f then
- cache[code] = f
+ local function mpdraw(lines,list) -- n * 4
+ if list then
+ local c = #lines
+ for i=1,c do
+ local ci = lines[i]
+ local ni = #ci
+ n = n + 1 buffer[n] = i < c and "d(" or "D("
+ for j=1,ni,2 do
+ local l = j + 1
+ n = n + 1 buffer[n] = ci[j]
+ n = n + 1 buffer[n] = ","
+ n = n + 1 buffer[n] = ci[l]
+ n = n + 1 buffer[n] = l < ni and ")--(" or ");"
end
end
+ else
+ local l = #lines
+ local m = l - 4
+ for i=1,l,4 do
+ n = n + 1 buffer[n] = i < m and "d(" or "D("
+ n = n + 1 buffer[n] = lines[i]
+ n = n + 1 buffer[n] = ","
+ n = n + 1 buffer[n] = lines[i+1]
+ n = n + 1 buffer[n] = ")--("
+ n = n + 1 buffer[n] = lines[i+2]
+ n = n + 1 buffer[n] = ","
+ n = n + 1 buffer[n] = lines[i+3]
+ n = n + 1 buffer[n] = ");"
+ end
end
- if f then
- local _buffer_ = buffer
- local _n_ = n
- buffer = { }
- n = 0
- local result = f()
- if result then
- local t = type(result)
- if t == "number" then
- result = f_numeric(result)
- elseif t ~= "string" then
- result = tostring(result)
- end
- if trace then
- if #result == 0 then
- report_luarun("%i: no result",nesting)
- else
- report_luarun("%i: result: %s",nesting,result)
- end
+ end
+
+ local function mpfill(lines,list)
+ if list then
+ local c = #lines
+ for i=1,c do
+ local ci = lines[i]
+ local ni = #ci
+ n = n + 1 buffer[n] = i < c and "f(" or "F("
+ for j=1,ni,2 do
+ local l = j + 1
+ n = n + 1 buffer[n] = ci[j]
+ n = n + 1 buffer[n] = ","
+ n = n + 1 buffer[n] = ci[l]
+ n = n + 1 buffer[n] = l < ni and ")--(" or ")--C;"
end
- buffer = _buffer_
- n = _n_
- nesting = nesting - 1
- return result
- elseif trace then
- report_luarun("%i: no result",nesting)
end
- buffer, n = _buffer_, _n_
else
- report_luarun("%i: no result, invalid code: %s",nesting,code)
+ local l = #lines
+ local m = l - 4
+ for i=1,l,4 do
+ n = n + 1 buffer[n] = i < m and "f(" or "F("
+ n = n + 1 buffer[n] = lines[i]
+ n = n + 1 buffer[n] = ","
+ n = n + 1 buffer[n] = lines[i+1]
+ n = n + 1 buffer[n] = ")--("
+ n = n + 1 buffer[n] = lines[i+2]
+ n = n + 1 buffer[n] = ","
+ n = n + 1 buffer[n] = lines[i+3]
+ n = n + 1 buffer[n] = ")--C;"
+ end
end
- nesting = nesting - 1
- return ""
end
- -- for the moment
+ aux.draw = mpdraw
+ aux.fill = mpfill
for k, v in next, aux do mp[k] = v end
@@ -521,13 +756,46 @@ end
do
+ -- Another experimental feature:
+
+ local mpnumeric = mp.numeric
+ local scanstring = scan.string
+ local scriptindex = metapost.scriptindex
+
+ function mp.mf_script_index(name)
+ local index = scriptindex(name)
+ -- report_script("method %i, name %a, index %i",1,name,index)
+ mpnumeric(index)
+ end
+
+ -- once bootstrapped ... (needs pushed mpx instances)
+
+ metapost.registerscript("scriptindex",function()
+ local name = scanstring()
+ local index = scriptindex(name)
+ -- report_script("method %i, name %a, index %i",2,name,index)
+ mpnumeric(index)
+ end)
+
+end
+
+-- the next will move to mlib-lmp.lua
+
+do
+
local mpnamedcolor = attributes.colors.mpnamedcolor
local mpprint = aux.print
+ local scanstring = scan.string
mp.mf_named_color = function(str)
mpprint(mpnamedcolor(str))
end
+ metapost.registerscript("namedcolor",function()
+ mpprint(mpnamedcolor(scanstring()))
+-- test: return mpnamedcolor(scanstring())
+ end)
+
end
function mp.n(t) -- used ?
@@ -773,15 +1041,16 @@ end
do
- local mprint = mp.print
- local fprint = mp.fprint
- local qprint = mp.quoted
- local getwhd = job.positions.whd
- local getxy = job.positions.xy
- local getposition = job.positions.position
- local getpage = job.positions.page
- local getregion = job.positions.region
- local getmacro = tokens.getters.macro
+ local mprint = mp.print
+ local fprint = mp.fprint
+ local qprint = mp.quoted
+ local jobpositions = job.positions
+ local getwhd = jobpositions.whd
+ local getxy = jobpositions.xy
+ local getposition = jobpositions.position
+ local getpage = jobpositions.page
+ local getregion = jobpositions.region
+ local getmacro = tokens.getters.macro
function mp.positionpath(name)
local w, h, d = getwhd(name)
@@ -820,12 +1089,7 @@ do
end
function mp.positionpage(name)
- local p = getpage(name)
- if p then
- fprint("%p",p)
- else
- mprint("0")
- end
+ fprint("%i",getpage(name) or 0)
end
function mp.positionregion(name)
@@ -961,6 +1225,8 @@ end
do
-- a bit overkill: just a find(str,"mf_object=") can be enough
+ --
+ -- todo : share with mlib-pps.lua metapost,isobject
local mpboolean = aux.boolean
@@ -974,56 +1240,71 @@ do
end
-do
-
- local mpnumeric = aux.numeric
- local mppair = aux.pair
- local mpgetpath = get.path
-
- local p = nil
- local n = 0
-
- local function mf_path_length(name)
- p = mpgetpath(name)
- n = p and #p or 0
- mpnumeric(n)
- end
-
- local function mf_path_point(i)
- if i > 0 and i <= n then
- local pi = p[i]
- mppair(pi[1],pi[2])
+function mp.flatten(t)
+ local tn = #t
+
+ local t1 = t[1]
+ local t2 = t[2]
+ local t3 = t[3]
+ local t4 = t[4]
+
+ for i=1,tn-5,2 do
+ local t5 = t[i+4]
+ local t6 = t[i+5]
+ if t1 == t3 and t3 == t5 and ((t2 <= t4 and t4 <= t6) or (t6 <= t4 and t4 <= t2)) then
+ t[i+3] = t2
+ t4 = t2
+ t[i] = false
+ t[i+1] = false
+ elseif t2 == t4 and t4 == t6 and ((t1 <= t3 and t3 <= t5) or (t5 <= t3 and t3 <= t1)) then
+ t[i+2] = t1
+ t3 = t1
+ t[i] = false
+ t[i+1] = false
end
+ t1 = t3
+ t2 = t4
+ t3 = t5
+ t4 = t6
end
- local function mf_path_left(i)
- if i > 0 and i <= n then
- local pi = p[i]
- mppair(pi[5],pi[6])
+ -- remove duplicates
+
+ local t1 = t[1]
+ local t2 = t[2]
+ for i=1,tn-2,2 do
+ local t3 = t[i+2]
+ local t4 = t[i+3]
+ if t1 == t3 and t2 == t4 then
+ t[i] = false
+ t[i+1] = false
end
+ t1 = t3
+ t2 = t4
end
- local function mf_path_right(i)
- if i > 0 and i <= n then
- local pn
- if i == 1 then
- pn = p[2] or p[1]
- else
- pn = p[i+1] or p[1]
- end
- mppair(pn[3],pn[4])
+ -- move coordinates
+
+ local m = 0
+ for i=1,tn,2 do
+ if t[i] then
+ m = m + 1 t[m] = t[i]
+ m = m + 1 t[m] = t[i+1]
end
end
- local function mf_path_reset()
- p = nil
- n = 0
+ -- prune the table (not gc'd)
+
+ for i=tn,m+1,-1 do
+ t[i] = nil
end
- mp.mf_path_length = mf_path_length mp.pathlength = mf_path_length
- mp.mf_path_point = mf_path_point mp.pathpoint = mf_path_point
- mp.mf_path_left = mf_path_left mp.pathleft = mf_path_left
- mp.mf_path_right = mf_path_right mp.pathright = mf_path_right
- mp.mf_path_reset = mf_path_reset mp.pathreset = mf_path_reset
+ -- safeguard so that we have at least one segment
+
+ if m == 2 then
+ t[3] = t[1]
+ t[4] = t[2]
+ end
end
+
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-mat.lua b/Master/texmf-dist/tex/context/base/mkiv/mlib-mat.lua
new file mode 100644
index 00000000000..6c82a4658b5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-mat.lua
@@ -0,0 +1,137 @@
+if not modules then modules = { } end modules ['mlib-mat'] = {
+ version = 1.001,
+ comment = "companion to mlib-ctx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+local scanners = mp.scan
+local registerscript = metapost.registerscript
+
+local scannumeric = scanners.numeric
+local scanpair = scanners.pair
+local scancolor = scanners.color
+
+local mppair = mp.pair
+
+local m = xmath
+local c = xcomplex
+
+local m_acos = m.acos registerscript("m_acos", function() return m_acos (scannumeric()) end)
+local m_acosh = m.acosh registerscript("m_acosh", function() return m_acosh (scannumeric()) end)
+local m_asin = m.asin registerscript("m_asin", function() return m_asin (scannumeric()) end)
+local m_asinh = m.asinh registerscript("m_asinh", function() return m_asinh (scannumeric()) end)
+local m_atan = m.atan registerscript("m_atan", function() return m_atan (scannumeric()) end)
+local m_atan2 = m.atan2 registerscript("m_atan2", function() return m_atan2 (scanpair ()) end)
+local m_atanh = m.atanh registerscript("m_atanh", function() return m_atanh (scannumeric()) end)
+local m_cbrt = m.cbrt registerscript("m_cbrt", function() return m_cbrt (scannumeric()) end)
+local m_ceil = m.ceil registerscript("m_ceil", function() return m_ceil (scannumeric()) end)
+local m_copysign = m.copysign registerscript("m_copysign", function() return m_copysign (scanpair ()) end)
+local m_cos = m.cos registerscript("m_cos", function() return m_cos (scannumeric()) end)
+local m_cosh = m.cosh registerscript("m_cosh", function() return m_cosh (scannumeric()) end)
+local m_deg = m.deg registerscript("m_deg", function() return m_deg (scannumeric()) end)
+local m_erf = m.erf registerscript("m_erf", function() return m_erf (scannumeric()) end)
+local m_erfc = m.erfc registerscript("m_erfc", function() return m_erfc (scannumeric()) end)
+local m_exp = m.exp registerscript("m_exp", function() return m_exp (scannumeric()) end)
+local m_exp2 = m.exp2 registerscript("m_exp2", function() return m_exp2 (scannumeric()) end)
+local m_expm1 = m.expm1 registerscript("m_expm1", function() return m_expm1 (scannumeric()) end)
+local m_fabs = m.fabs registerscript("m_fabs", function() return m_fabs (scannumeric()) end)
+local m_fdim = m.fdim registerscript("m_fdim", function() return m_fdim (scanpair ()) end)
+local m_floor = m.floor registerscript("m_floor", function() return m_floor (scannumeric()) end)
+local m_fma = m.fma registerscript("m_fma", function() return m_fma (scancolor ()) end)
+local m_fmax = m.fmax registerscript("m_fmax", function() return m_fmax (scannumeric()) end)
+local m_fmin = m.fmin registerscript("m_fmin", function() return m_fmin (scannumeric()) end)
+local m_fmod = m.fmod registerscript("m_fmod", function() return m_fmod (scanpair ()) end)
+local m_frexp = m.frexp registerscript("m_frexp", function() return m_frexp (scannumeric()) end)
+local m_gamma = m.gamma registerscript("m_gamma", function() return m_gamma (scannumeric()) end)
+local m_hypot = m.hypot registerscript("m_hypot", function() return m_hypot (scanpair ()) end)
+local m_isfinite = m.isfinite registerscript("m_isfinite", function() return m_isfinite (scannumeric()) end)
+local m_isinf = m.isinf registerscript("m_isinf", function() return m_isinf (scannumeric()) end)
+local m_isnan = m.isnan registerscript("m_isnan", function() return m_isnan (scannumeric()) end)
+local m_isnormal = m.isnormal registerscript("m_isnormal", function() return m_isnormal (scannumeric()) end)
+local m_j0 = m.j0 registerscript("m_j0", function() return m_j0 (scannumeric()) end)
+local m_j1 = m.j1 registerscript("m_j1", function() return m_j1 (scannumeric()) end)
+local m_jn = m.jn registerscript("m_jn", function() return m_jn (scanpair ()) end)
+local m_ldexp = m.ldexp registerscript("m_ldexp", function() return m_ldexp (scanpair ()) end)
+local m_lgamma = m.lgamma registerscript("m_lgamma", function() return m_lgamma (scannumeric()) end)
+local m_log = m.log registerscript("m_log", function() return m_log (scannumeric()) end)
+local m_log10 = m.log10 registerscript("m_log10", function() return m_log10 (scannumeric()) end)
+local m_log1p = m.log1p registerscript("m_log1p", function() return m_log1p (scannumeric()) end)
+local m_log2 = m.log2 registerscript("m_log2", function() return m_log2 (scannumeric()) end)
+local m_logb = m.logb registerscript("m_logb", function() return m_logb (scannumeric()) end)
+local m_modf = m.modf registerscript("m_modf", function() return m_modf (scannumeric()) end)
+local m_nearbyint = m.nearbyint registerscript("m_nearbyint", function() return m_nearbyint(scannumeric()) end)
+local m_nextafter = m.nextafter registerscript("m_nextafter", function() return m_nextafter(scanpair ()) end)
+local m_pow = m.pow registerscript("m_pow", function() return m_pow (scanpair ()) end)
+local m_rad = m.rad registerscript("m_rad", function() return m_rad (scannumeric()) end)
+local m_remainder = m.remainder registerscript("m_remainder", function() return m_remainder(scanpair ()) end)
+local m_remquo = m.remquo registerscript("m_remquo", function() return m_remquo (scannumeric()) end)
+local m_round = m.round registerscript("m_round", function() return m_round (scannumeric()) end)
+local m_scalbn = m.scalbn registerscript("m_scalbn", function() return m_scalbn (scanpair ()) end)
+local m_sin = m.sin registerscript("m_sin", function() return m_sin (scannumeric()) end)
+local m_sinh = m.sinh registerscript("m_sinh", function() return m_sinh (scannumeric()) end)
+local m_sqrt = m.sqrt registerscript("m_sqrt", function() return m_sqrt (scannumeric()) end)
+local m_tan = m.tan registerscript("m_tan", function() return m_tan (scannumeric()) end)
+local m_tanh = m.tanh registerscript("m_tanh", function() return m_tanh (scannumeric()) end)
+local m_tgamma = m.tgamma registerscript("m_tgamma", function() return m_tgamma (scannumeric()) end)
+local m_trunc = m.trunc registerscript("m_trunc", function() return m_trunc (scannumeric()) end)
+local m_y0 = m.y0 registerscript("m_y0", function() return m_y0 (scannumeric()) end)
+local m_y1 = m.y1 registerscript("m_y1", function() return m_y1 (scannumeric()) end)
+local m_yn = m.yn registerscript("m_yn", function() return m_yn (scanpair ()) end)
+
+if not (c and c.sin) then
+ return
+end
+
+local c_topair = c.topair
+local c_new = c.new
+
+local c_sin = c.sin registerscript("c_sin", function() return mppair(c_topair(c_sin (c_new(scanpair())))) end)
+local c_cos = c.cos registerscript("c_cos", function() return mppair(c_topair(c_cos (c_new(scanpair())))) end)
+local c_tan = c.tan registerscript("c_tan", function() return mppair(c_topair(c_tan (c_new(scanpair())))) end)
+local c_sinh = c.sinh registerscript("c_sinh", function() return mppair(c_topair(c_sinh (c_new(scanpair())))) end)
+local c_cosh = c.cosh registerscript("c_cosh", function() return mppair(c_topair(c_cosh (c_new(scanpair())))) end)
+local c_tanh = c.tanh registerscript("c_tanh", function() return mppair(c_topair(c_tanh (c_new(scanpair())))) end)
+
+local c_asin = c.asin registerscript("c_asin", function() return mppair(c_topair(c_sin (c_new(scanpair())))) end)
+local c_acos = c.acos registerscript("c_acos", function() return mppair(c_topair(c_cos (c_new(scanpair())))) end)
+local c_atan = c.atan registerscript("c_atan", function() return mppair(c_topair(c_tan (c_new(scanpair())))) end)
+local c_asinh = c.asinh registerscript("c_asinh", function() return mppair(c_topair(c_sinh (c_new(scanpair())))) end)
+local c_acosh = c.acosh registerscript("c_acosh", function() return mppair(c_topair(c_cosh (c_new(scanpair())))) end)
+local c_atanh = c.atanh registerscript("c_atanh", function() return mppair(c_topair(c_tanh (c_new(scanpair())))) end)
+
+local c_sqrt = c.sqrt registerscript("c_sqrt", function() return mppair(c_topair(c_sqrt (c_new(scanpair())))) end)
+local c_abs = c.abs registerscript("c_abs", function() return c_topair(c_abs (c_new(scanpair()))) end)
+local c_arg = c.arg registerscript("c_arg", function() return c_topair(c_arg (c_new(scanpair()))) end)
+local c_conj = c.conj registerscript("c_conj", function() return mppair(c_topair(c_conj (c_new(scanpair())))) end)
+local c_exp = c.exp registerscript("c_exp", function() return mppair(c_topair(c_exp (c_new(scanpair())))) end)
+local c_log = c.log registerscript("c_log", function() return mppair(c_topair(c_log (c_new(scanpair())))) end)
+local c_proj = c.proj registerscript("c_proj", function() return mppair(c_topair(c_proj (c_new(scanpair())))) end)
+
+local c_erf = c.erf registerscript("c_erf", function() return mppair(c_topair(c_erf (c_new(scanpair())))) end)
+local c_erfc = c.erfc registerscript("c_erfc", function() return mppair(c_topair(c_erfc (c_new(scanpair())))) end)
+local c_erfcx = c.erfcx registerscript("c_erfcx", function() return mppair(c_topair(c_erfcx (c_new(scanpair())))) end)
+local c_erfi = c.erfi registerscript("c_erfi", function() return mppair(c_topair(c_erfi (c_new(scanpair())))) end)
+local c_dawson = c.dawson registerscript("c_dawson", function() return mppair(c_topair(c_dawson(c_new(scanpair())))) end)
+
+local c_voigt = c.voigt
+local c_voigt_hwhm = c.voigt_hwhm
+
+registerscript("c_voigt", function()
+ return mppair(c_topair(c_voigt(c_new(scanpair()),c_new(scanpair()),c_new(scanpair()))))
+end)
+
+registerscript("c_voigt_hwhm", function()
+ return mppair(c_topair(c_voigt_hwhm(c_new(scanpair()),c_new(scanpair()))))
+end)
+
+local c_pow = c.pow registerscript("c_pow", function() return mppair(c_topair(c_pow(c_new(scanpair()),c_new(scanpair())))) end)
+local c_add = c.add registerscript("c_add", function() return mppair(c_topair(c_add(c_new(scanpair()),c_new(scanpair())))) end)
+local c_sub = c.sub registerscript("c_sub", function() return mppair(c_topair(c_sub(c_new(scanpair()),c_new(scanpair())))) end)
+local c_mul = c.mul registerscript("c_mul", function() return mppair(c_topair(c_mul(c_new(scanpair()),c_new(scanpair())))) end)
+local c_div = c.div registerscript("c_div", function() return mppair(c_topair(c_div(c_new(scanpair()),c_new(scanpair())))) end)
+
+local c_imag = c.imag registerscript("c_imag", function() return c_topair(c_imag(c_new(scanpair()))) end)
+local c_real = c.real registerscript("c_real", function() return c_topair(c_real(c_new(scanpair()))) end)
+local c_neg = c.neg registerscript("c_new", function() return c_topair(c_neg (c_new(scanpair()))) end)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.lua b/Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.lua
index 92fde5e1369..372a77f4181 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.lua
@@ -45,29 +45,16 @@ local experiment = true -- uses context(node) that already does delayed nod
local savedliterals = nil -- needs checking
local mpsliteral = nodes.pool.originliteral
-local f_f = formatters["%.6F"]
-local f_m = formatters["%.6F %.6F m"]
-local f_c = formatters["%.6F %.6F %.6F %.6F %.6F %.6F c"]
-local f_l = formatters["%.6F %.6F l"]
-local f_cm = formatters["%.6F %.6F %.6F %.6F %.6F %.6F cm"]
-local f_M = formatters["%.6F M"]
+local f_f = formatters["%.6N"]
+local f_m = formatters["%.6N %.6N m"]
+local f_c = formatters["%.6N %.6N %.6N %.6N %.6N %.6N c"]
+local f_l = formatters["%.6N %.6N l"]
+local f_cm = formatters["%.6N %.6N %.6N %.6N %.6N %.6N cm"]
+local f_M = formatters["%.6N M"]
local f_j = formatters["%i j"]
local f_J = formatters["%i J"]
-local f_d = formatters["[%s] %.6F d"]
-local f_w = formatters["%.3F w"]
-
-directives.register("metapost.stripzeros",function()
- f_f = formatters["%.6N"]
- f_m = formatters["%.6N %.6N m"]
- f_c = formatters["%.6N %.6N %.6N %.6N %.6N %.6N c"]
- f_l = formatters["%.6N %.6N l"]
- f_cm = formatters["%.6N %.6N %.6N %.6N %.6N %.6N cm"]
- f_M = formatters["%.6N M"]
- f_j = formatters["%i j"]
- f_J = formatters["%i J"]
- f_d = formatters["[%s] %.6N d"]
- f_w = formatters["%.3N w"]
-end)
+local f_d = formatters["[%s] %.6N d"]
+local f_w = formatters["%.6N w"]
directives.register("metapost.savetable",function(v)
if type(v) == "string" then
@@ -274,6 +261,34 @@ local function flushconcatpath(path, t, open)
return t
end
+local function toboundingbox(path)
+ local size = #path
+ if size == 4 then
+ local pth = path[1]
+ local x = pth.x_coord
+ local y = pth.y_coord
+ local llx, lly, urx, ury = x, y, x, y
+ for i=2,size do
+ pth = path[i]
+ x = pth.x_coord
+ y = pth.y_coord
+ if x < llx then
+ llx = x
+ elseif x > urx then
+ urx = x
+ end
+ if y < lly then
+ lly = y
+ elseif y > ury then
+ ury = y
+ end
+ end
+ return { llx, lly, urx, ury }
+ else
+ return { 0, 0, 0, 0 }
+ end
+end
+
metapost.flushnormalpath = flushnormalpath
-- The flusher is pdf based, if another backend is used, we need to overload the
@@ -283,8 +298,10 @@ metapost.flushnormalpath = flushnormalpath
-- We can avoid the before table but I like symmetry. There is of course a small
-- performance penalty, but so is passing extra arguments (result, flusher, after)
-- and returning stuff.
+--
+-- This variable stuff will change in lmtx.
-local ignore = function () end
+local ignore = function() end
local space = P(" ")
local equal = P("=")
@@ -380,10 +397,10 @@ function metapost.flush(specification,result)
local figures = result.fig
if figures then
flusher = flusher or pdfflusher
- local resetplugins = metapost.resetplugins or ignore -- before figure
- local processplugins = metapost.processplugins or ignore -- each object
+ local resetplugins = metapost.resetplugins or ignore -- before figure
+ local processplugins = metapost.processplugins or ignore -- each object
local synchronizeplugins = metapost.synchronizeplugins or ignore
- local pluginactions = metapost.pluginactions or ignore -- before / after
+ local pluginactions = metapost.pluginactions or ignore -- before / after
local startfigure = flusher.startfigure
local stopfigure = flusher.stopfigure
local flushfigure = flusher.flushfigure
@@ -400,6 +417,7 @@ function metapost.flush(specification,result)
local linecap = -1
local linejoin = -1
local dashed = false
+ local linewidth = false
local llx = properties.llx
local lly = properties.lly
local urx = properties.urx
@@ -412,6 +430,8 @@ function metapost.flush(specification,result)
-- we need to be indirect if we want the one-pass solution
+ local groupstack = { }
+
local function processfigure()
result[#result+1] = "q"
if objects then
@@ -443,6 +463,35 @@ function metapost.flush(specification,result)
miterlimit, linecap, linejoin, dashed = -1, -1, -1, "" -- was false
elseif objecttype == "start_bounds" or objecttype == "stop_bounds" then
-- skip
+ elseif objecttype == "start_group" then
+ if lpdf.flushgroup then
+ local before, after = processplugins(object)
+ if before then
+ result[#result+1] = "q"
+ result = pluginactions(before,result,flushfigure)
+ insert(groupstack, {
+ after = after,
+ result = result,
+ bbox = toboundingbox(object.path),
+ })
+ result = { }
+miterlimit, linecap, linejoin, dashed, linewidth = -1, -1, -1, "", false
+ else
+ insert(groupstack,false)
+ end
+ else
+ insert(groupstack,false)
+ end
+ elseif objecttype == "stop_group" then
+ local data = remove(groupstack)
+ if data then
+ local reference = lpdf.flushgroup(concat(result,"\r"),data.bbox)
+ result = data.result
+ result[#result+1] = reference
+ result = pluginactions(data.after,result,flushfigure)
+ result[#result+1] = "Q"
+miterlimit, linecap, linejoin, dashed, linewidth = -1, -1, -1, "", false
+ end
else
-- we use an indirect table as we want to overload
-- entries but this is not possible in userdata
@@ -450,7 +499,7 @@ function metapost.flush(specification,result)
-- can be optimized if no path
--
local original = object
- local object = { }
+ local object = { }
setmetatable(object, {
__index = original
})
@@ -459,12 +508,15 @@ function metapost.flush(specification,result)
local evenodd = false
local collect = false
local both = false
+ local flush = false
local postscript = object.postscript
if not object.istext then
if postscript == "evenodd" then
evenodd = true
elseif postscript == "collect" then
collect = true
+ elseif postscript == "flush" then
+ flush = true
elseif postscript == "both" then
both = true
elseif postscript == "eoboth" then
@@ -473,7 +525,9 @@ function metapost.flush(specification,result)
end
end
--
- if collect then
+ if flush and not savedpath then
+ -- forget about it
+ elseif collect then
if not savedpath then
savedpath = { object.path or false }
savedhtap = { object.htap or false }
@@ -527,7 +581,10 @@ function metapost.flush(specification,result)
if pen then
if pen.type == "elliptical" then
transformed, penwidth = pen_characteristics(original) -- boolean, value
- result[#result+1] = f_w(penwidth) -- todo: only if changed
+ if penwidth ~= linewidth then
+ result[#result+1] = f_w(penwidth)
+ linewidth = penwidth
+ end
if objecttype == "fill" then
objecttype = "both"
end
@@ -550,7 +607,9 @@ function metapost.flush(specification,result)
end
savedpath = nil
end
- if transformed then
+ if flush then
+ -- ignore this path
+ elseif transformed then
flushconcatpath(path,result,open)
else
flushnormalpath(path,result,open)
@@ -613,7 +672,7 @@ function metapost.flush(specification,result)
end
if object.grouped then
-- can be qQ'd so changes can end up in groups
- miterlimit, linecap, linejoin, dashed = -1, -1, -1, "" -- was false
+ miterlimit, linecap, linejoin, dashed, linewidth = -1, -1, -1, "", false
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.mkiv b/Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.mkiv
index 6dc73a15352..d251a5145a9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.mkiv
@@ -13,13 +13,12 @@
\unprotect
-% We use bit more code that needed because we want to limit the
-% amount of boxing.
+%D We use bit more code that needed because we want to limit the amount of boxing.
\registerctxluafile{mlib-pdf}{}
-%D Some code is shared between MPLIB and MPS. The following variables
-%D are also available for introspection and other purposes.
+%D Some code is shared between MPLIB and MPS. The following variables are also
+%D available for introspection and other purposes.
\ifdefined\MPwidth \else \newdimen\MPwidth \fi
\ifdefined\MPheight \else \newdimen\MPheight \fi
@@ -88,16 +87,6 @@
\wd\MPbox\MPwidth
\ht\MPbox\MPheight}
-% \unexpanded\def\MPtextext#1#2#3#4#5% beware: we use a different method now (see mlib-pps)
-% {\begingroup
-% \setbox\MPbox\hbox{\font\temp=#1\space at #2\onebasepoint \let\c\char \temp #3}% text
-% \MPllx-#4\onebasepoint
-% \MPlly-#5\onebasepoint
-% \repositionMPbox
-% \smashbox\MPbox
-% \box\MPbox
-% \endgroup}
-
% MPLIB specific:
\def\MPLIBtoPDF{\clf_mpflushliteral} % expanded
@@ -146,30 +135,6 @@
\unexpanded\def\directMPgraphic
{\dodoublegroupempty\mlib_direct_graphic}
-% \def\mlib_direct_graphic#1#2% makes pages (todo: make boxes)
-% {\meta_begin_graphic_group{#1}%
-% \let\startMPLIBtoPDF\directstartMPLIBtoPDF
-% \let\stopMPLIBtoPDF \directstopMPLIBtoPDF
-% \meta_start_current_graphic
-% \forgetall
-% \edef\p_extensions{\MPinstanceparameter\s!extensions}%
-% \normalexpanded{\noexpand\ctxlua{metapost.graphic {
-% instance = "\currentMPinstance",
-% format = "\currentMPformat",
-% data = \!!bs#2;\!!es,
-% initializations = \!!bs\meta_flush_current_initializations\!!es,
-% % useextensions = "\MPinstanceparameter\s!extensions",
-% \ifx\p_extensions\v!yes
-% extensions = \!!bs\clf_getmpextensions{\currentMPinstance}\!!es,
-% \fi
-% inclusions = \!!bs\meta_flush_current_inclusions\!!es,
-% definitions = \!!bs\meta_flush_current_definitions\!!es,
-% figure = "all",
-% method = "\MPinstanceparameter\c!method",
-% }}}%
-% \meta_stop_current_graphic
-% \meta_end_graphic_group}
-
\def\mlib_direct_graphic#1#2% makes pages (todo: make boxes)
{\meta_begin_graphic_group{#1}%
\let\startMPLIBtoPDF\directstartMPLIBtoPDF
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.mkxl b/Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.mkxl
new file mode 100644
index 00000000000..763e7ecdd46
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-pdf.mkxl
@@ -0,0 +1,171 @@
+%D \module
+%D [ file=mlib-pdf,
+%D version=2008.03.25,
+%D title=\METAPOST\ Integrated Graphics,
+%D subtitle=Conversion to PDF,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+%D We use bit more code that needed because we want to limit the amount of boxing.
+
+\registerctxluafile{mlib-pdf}{}
+
+%D Some code is shared between MPLIB and MPS. The following variables are also
+%D available for introspection and other purposes.
+
+\ifdefined\MPwidth \else \newdimen\MPwidth \fi
+\ifdefined\MPheight \else \newdimen\MPheight \fi
+
+\ifdefined\MPllx \else \newdimen\MPllx \fi
+\ifdefined\MPlly \else \newdimen\MPlly \fi
+\ifdefined\MPurx \else \newdimen\MPurx \fi
+\ifdefined\MPury \else \newdimen\MPury \fi
+
+\ifdefined\MPbox \else \newbox \MPbox \fi
+
+\unexpanded\def\setMPboundingbox#1#2#3#4% at some point we might pass them as base or scaled points
+ {\global\MPllx #1\onebasepoint
+ \global\MPlly #2\onebasepoint
+ \global\MPurx #3\onebasepoint
+ \global\MPury #4\onebasepoint
+ \global\MPwidth \dimexpr\MPurx-\MPllx\relax
+ \global\MPheight\dimexpr\MPury-\MPlly\relax}
+
+\unexpanded\def\resetMPboundingbox
+ {\global\MPwidth \zeropoint
+ \global\MPheight\zeropoint
+ \global\MPllx \zeropoint
+ \global\MPlly \zeropoint
+ \global\MPurx \zeropoint
+ \global\MPury \zeropoint}
+
+\let\popMPboundingbox\relax
+
+\unexpanded\def\pushMPboundingbox
+ {\edef\popMPboundingbox
+ {\global\MPwidth \the\MPwidth
+ \global\MPheight\the\MPheight
+ \global\MPllx \the\MPllx
+ \global\MPlly \the\MPlly
+ \global\MPurx \the\MPurx
+ \global\MPury \the\MPury
+ \relax}}
+
+% we need to combine these
+
+\unexpanded\def\repositionMPboxindeed
+ {\setbox\MPbox\hpack\bgroup
+ \kern-\MPllx
+ \raise-\MPlly
+ \box\MPbox
+ \egroup}
+
+\unexpanded\def\repositionMPbox
+ {\ifzeropt\MPllx
+ \ifzeropt\MPlly
+ % okay
+ \else
+ \repositionMPboxindeed
+ \fi
+ \else
+ \repositionMPboxindeed
+ \fi}
+
+\unexpanded\def\finalizeMPbox
+ {\repositionMPbox
+ \setbox\MPbox\vpack to \MPheight\bgroup
+ \vfill
+ \hsize\MPwidth
+ \smashbox\MPbox
+ \box\MPbox
+ \egroup
+ \wd\MPbox\MPwidth
+ \ht\MPbox\MPheight}
+
+% combined
+
+\unexpanded\def\finalizeMPbox
+ {\boxxoffset\MPbox-\MPllx\relax
+ \boxyoffset\MPbox\dimexpr\boxyoffset\MPbox-\MPheight-\MPlly\relax
+ \wd\MPbox\MPwidth
+ \ht\MPbox\MPheight}
+
+% MPLIB specific:
+
+\def\MPLIBtoPDF{\clf_mpflushliteral} % expanded
+
+\unexpanded\def\startMPLIBtoPDF#1#2#3#4%
+ {\meta_process_graphic_figure_start
+ \dostarttagged\t!mpgraphic\empty
+ \naturalhpack attr \imageattribute \plusone \bgroup
+ \dousecolorparameter\s!black\forcecolorhack
+ \setMPboundingbox{#1}{#2}{#3}{#4}%
+ \setbox\MPbox\vpack\bgroup
+ % \forgetall % already done elsewhere
+ \noindent} % forces the proper cm in the backend
+
+\unexpanded\def\stopMPLIBtoPDF
+ {\egroup
+ \finalizeMPbox
+ \box\MPbox
+ \egroup
+ \dostoptagged
+ \meta_process_graphic_figure_stop}
+
+\def\MPLIBflushreset % This can (will) move to the Lua end.
+ {\clf_mpflushreset}
+
+%D Kind of special:
+%
+% test.mp:
+%
+% beginfig(1) fill fullcircle scaled 10cm withcolor red ; endfig ;
+% beginfig(2) draw fullcircle scaled 5cm withcolor blue ; endfig ;
+% beginfig(3) draw textext("just some text") ; endfig ;
+%
+% standalone pages:
+%
+% \starttext
+% \directMPgraphic{input "test.mp" ;}
+% \stoptext
+
+\let\normalstartMPLIBtoPDF\startMPLIBtoPDF
+\let\normalstopMPLIBtoPDF \stopMPLIBtoPDF
+
+\unexpanded\def\directstartMPLIBtoPDF{\startTEXpage\normalstartMPLIBtoPDF}
+\unexpanded\def\directstopMPLIBtoPDF {\normalstopMPLIBtoPDF\stopTEXpage}
+
+\unexpanded\def\directMPgraphic
+ {\dodoublegroupempty\mlib_direct_graphic}
+
+\def\mlib_direct_graphic#1#2% makes pages (todo: make boxes)
+ {\meta_begin_graphic_group{#1}%
+ \let\startMPLIBtoPDF\directstartMPLIBtoPDF
+ \let\stopMPLIBtoPDF \directstopMPLIBtoPDF
+ \meta_start_current_graphic
+ \forgetall
+ \edef\p_extensions{\MPinstanceparameter\s!extensions}%
+ \normalexpanded{\noexpand\clf_mpgraphic
+ instance {\currentMPinstance}%
+ format {\currentMPformat}%
+ data {#2;}%
+ initializations {\meta_flush_current_initializations}%
+ \ifx\p_extensions\v!yes
+ extensions {\clf_getmpextensions{\currentMPinstance}}%
+ \fi
+ inclusions {\meta_flush_current_inclusions}%
+ definitions {\meta_flush_current_definitions}%
+ figure {all}%
+ method {\MPinstanceparameter\c!method}%
+ \relax}%
+ \meta_stop_current_graphic
+ \meta_end_graphic_group}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-pps.lua b/Master/texmf-dist/tex/context/base/mkiv/mlib-pps.lua
index 5708577fea6..0250df35c60 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mlib-pps.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-pps.lua
@@ -30,6 +30,8 @@ local flush_list = node.flush_list
local setmetatableindex = table.setmetatableindex
local sortedhash = table.sortedhash
+local new_hlist = nodes.pool.hlist
+
local starttiming = statistics.starttiming
local stoptiming = statistics.stoptiming
@@ -92,28 +94,18 @@ end
-- todo: get this from the lpdf module
-local f_f = formatters["%F"]
-local f_f3 = formatters["%.3F"]
-local f_gray = formatters["%.3F g %.3F G"]
-local f_rgb = formatters["%.3F %.3F %.3F rg %.3F %.3F %.3F RG"]
-local f_cmyk = formatters["%.3F %.3F %.3F %.3F k %.3F %.3F %.3F %.3F K"]
-local f_cm_b = formatters["q %.6F %.6F %.6F %.6F %.6F %.6F cm"]
-local f_scn = formatters["%.3F"]
+local f_f = formatters["%.6N"]
+local f_f3 = formatters["%.3N"]
+local f_gray = formatters["%.3N g %.3N G"]
+local f_rgb = formatters["%.3N %.3N %.3N rg %.3N %.3N %.3N RG"]
+local f_cmyk = formatters["%.3N %.3N %.3N %.3N k %.3N %.3N %.3N %.3N K"]
+local f_cm_b = formatters["q %.6N %.6N %.6N %.6N %.6N %.6N cm"]
+local f_scn = formatters["%.3N"]
local f_shade = formatters["MpSh%s"]
local f_spot = formatters["/%s cs /%s CS %s SCN %s scn"]
local s_cm_e = "Q"
-directives.register("metapost.stripzeros",function()
- f_f = formatters["%N"]
- f_f3 = formatters["%.3N"]
- f_gray = formatters["%.3N g %.3N G"]
- f_rgb = formatters["%.3N %.3N %.3N rg %.3N %.3N %.3N RG"]
- f_cmyk = formatters["%.3N %.3N %.3N %.3N k %.3N %.3N %.3N %.3N K"]
- f_cm_b = formatters["q %.6N %.6N %.6N %.6N %.6N %.6N cm"]
- f_scn = formatters["%.3N"]
-end)
-
local function checked_color_pair(color,...)
if not color then
return innercolor, outercolor
@@ -253,14 +245,18 @@ local function preset(t,k)
return v
end
-local function startjob(plugmode,kind)
+local function startjob(plugmode,kind,mpx)
insert(stack,top)
top = {
textexts = { }, -- all boxes, optionally with a different color
texstrings = { },
+ mapstrings = { },
+ mapindices = { },
+ mapmoves = { },
texlast = 0,
texdata = setmetatableindex({},preset), -- references to textexts in order or usage
plugmode = plugmode, -- some day we can then skip all pre/postscripts
+ extradata = mpx and metapost.getextradata(mpx),
}
if trace_runs then
report_metapost("starting %s run at level %i in %s mode",
@@ -441,7 +437,7 @@ function models.cmyk(cr)
local y = cr[3]
local k = cr[4]
if c == m and m == y and y == 0 then
- k = k - 1
+ k = 1 - k
return checked_color_pair(f_gray,k,k)
else
return checked_color_pair(f_cmyk,c,m,y,k,c,m,y,k)
@@ -456,7 +452,11 @@ function models.cmyk(cr)
local y = cr[3]
local k = cr[4]
if n == 3 then
- c, m, y, k = rgbtocmyk(c,m,y)
+ if c == m and m == y then
+ k, c, m, y = 1 - c, 0, 0, 0
+ else
+ c, m, y, k = rgbtocmyk(c,m,y)
+ end
end
return checked_color_pair(f_cmyk,c,m,y,k,c,m,y,k)
end
@@ -580,8 +580,8 @@ end
-- side effect of going single pass).
function metapost.graphic_base_pass(specification)
- local top = startjob(true,"base")
local mpx = specification.mpx -- mandate
+ local top = startjob(true,"base",mpx)
local data = specification.data or ""
local inclusions = specification.inclusions or ""
local initializations = specification.initializations or ""
@@ -629,7 +629,7 @@ function metapost.process(specification,...)
if type(specification) ~= "table" then
oldschool(specification,...)
else
- startjob(specification.incontext or specification.useplugins,"process")
+ startjob(specification.incontext or specification.useplugins,"process",false)
runmetapost(specification)
stopjob()
end
@@ -690,7 +690,7 @@ metapost.splitprescript = splitprescript
-- end
function metapost.pluginactions(what,t,flushfigure) -- before/after object, depending on what
- if top.plugmode then -- hm, what about other features
+ if top and top.plugmode then -- hm, what about other features
for i=1,#what do
local wi = what[i]
if type(wi) == "function" then
@@ -707,19 +707,19 @@ function metapost.pluginactions(what,t,flushfigure) -- before/after object, depe
end
function metapost.resetplugins(t) -- intialize plugins, before figure
- if top.plugmode then
+ if top and top.plugmode then
outercolormodel = colors.currentmodel() -- currently overloads the one set at the tex end
resetteractions.runner(t)
end
end
function metapost.processplugins(object) -- each object (second pass)
- if top.plugmode then
+ if top and top.plugmode then
local prescript = object.prescript -- specifications
if prescript and #prescript > 0 then
local before = { }
local after = { }
- processoractions.runner(object,splitprescript(prescript) or {},before,after)
+ processoractions.runner(object,splitprescript(prescript) or { },before,after)
return #before > 0 and before, #after > 0 and after
else
local c = object.color
@@ -791,21 +791,12 @@ local tx_reset, tx_process do
----- pat = tsplitat(":")
local pat = lpeg.tsplitter(":",tonumber) -- so that %F can do its work
- local f_gray_yes = formatters["s=%.3F,a=%i,t=%.3F"]
- local f_gray_nop = formatters["s=%.3F"]
- local f_rgb_yes = formatters["r=%.3F,g=%.3F,b=%.3F,a=%.3F,t=%.3F"]
- local f_rgb_nop = formatters["r=%.3F,g=%.3F,b=%.3F"]
- local f_cmyk_yes = formatters["c=%.3F,m=%.3F,y=%.3F,k=%.3F,a=%.3F,t=%.3F"]
- local f_cmyk_nop = formatters["c=%.3F,m=%.3F,y=%.3F,k=%.3F"]
-
- directives.register("metapost.stripzeros",function()
- f_gray_yes = formatters["s=%.3N,a=%i,t=%.3N"]
- f_gray_nop = formatters["s=%.3N"]
- f_rgb_yes = formatters["r=%.3N,g=%.3N,b=%.3N,a=%.3N,t=%.3N"]
- f_rgb_nop = formatters["r=%.3N,g=%.3N,b=%.3N"]
- f_cmyk_yes = formatters["c=%.3N,m=%.3N,y=%.3N,k=%.3N,a=%.3N,t=%.3N"]
- f_cmyk_nop = formatters["c=%.3N,m=%.3N,y=%.3N,k=%.3N"]
- end)
+ local f_gray_yes = formatters["s=%.3N,a=%i,t=%.3N"]
+ local f_gray_nop = formatters["s=%.3N"]
+ local f_rgb_yes = formatters["r=%.3N,g=%.3N,b=%.3N,a=%.3N,t=%.3N"]
+ local f_rgb_nop = formatters["r=%.3N,g=%.3N,b=%.3N"]
+ local f_cmyk_yes = formatters["c=%.3N,m=%.3N,y=%.3N,k=%.3N,a=%.3N,t=%.3N"]
+ local f_cmyk_nop = formatters["c=%.3N,m=%.3N,y=%.3N,k=%.3N"]
local ctx_MPLIBsetNtext = context.MPLIBsetNtextX
local ctx_MPLIBsetCtext = context.MPLIBsetCtextX
@@ -833,7 +824,7 @@ local tx_reset, tx_process do
end
elseif #mp_c == 3 then
if mp_a and mp_t then
- ctx_MPLIBsetCtext(mp_target,f_rgb_nop(mp_c[1],mp_c[2],mp_c[3],mp_a,mp_t),mp_text)
+ ctx_MPLIBsetCtext(mp_target,f_rgb_yes(mp_c[1],mp_c[2],mp_c[3],mp_a,mp_t),mp_text)
else
ctx_MPLIBsetCtext(mp_target,f_rgb_nop(mp_c[1],mp_c[2],mp_c[3]),mp_text)
end
@@ -849,6 +840,8 @@ local tx_reset, tx_process do
end
end
+ local madetext = nil
+
function mp.mf_some_text(index,str)
mp_target = index
mp_index = index
@@ -863,24 +856,132 @@ local tx_reset, tx_process do
madetext = nil
end
- local madetext = nil
-
function mp.mf_made_text(index)
mp.mf_some_text(index,madetext)
end
+ -- a label can be anything, also something mp doesn't like in strings
+ -- so we return an index instead
+
+ function metapost.processing()
+ return top and true or false
+ end
+
+ function metapost.remaptext(replacement)
+ if top then
+ local mapstrings = top.mapstrings
+ local mapindices = top.mapindices
+ local label = replacement.label
+ local index = 0
+ if label then
+ local found = mapstrings[label]
+ if found then
+ setmetatableindex(found,replacement)
+ index = found.index
+ else
+ index = #mapindices + 1
+ replacement.index = index
+ mapindices[index] = replacement
+ mapstrings[label] = replacement
+ end
+ end
+ return index
+ else
+ return 0
+ end
+ end
+
+ function metapost.remappedtext(what)
+ return top and (top.mapstrings[what] or top.mapindices[tonumber(what)])
+ end
+
+ function mp.mf_map_move(index)
+ mp.triplet(top.mapmoves[index])
+ end
+
+ function mp.mf_map_text(index,str)
+ local map = top.mapindices[tonumber(str)]
+ if type(map) == "table" then
+ local text = map.text
+ local overload = map.overload
+ local offset = 0
+ local width = 0
+ local where = nil
+ --
+ mp_index = index
+ -- the image text
+ if overload then
+ top.texstrings[mp_index] = map.template or map.label or "error"
+ tex.runtoks("mptexttoks")
+ local box = textakebox("mptextbox") or new_hlist()
+ width = bp * box.width
+ where = overload.where
+ end
+ -- the real text
+ top.texstrings[mp_index] = overload and overload.text or text or "error"
+ tex.runtoks("mptexttoks")
+ local box = textakebox("mptextbox") or new_hlist()
+ local twd = bp * box.width
+ local tht = bp * box.height
+ local tdp = bp * box.depth
+ -- the check
+ if where then
+ local scale = 1 -- / (map.scale or 1)
+ if where == "l" or where == "left" then
+ offset = scale * (twd - width)
+ elseif where == "m" or where == "middle" then
+ offset = scale * (twd - width) / 2
+ end
+ end
+ -- the result
+ top.textexts[mp_index] = box
+ top.mapmoves[mp_index] = { offset, map.dx or 0, map.dy or 0 }
+ --
+ mp.triplet(twd,tht,tdp)
+ madetext = nil
+ return
+ else
+ map = type(map) == "string" and map or str
+ return mp.mf_some_text(index,context.escape(map) or map)
+ end
+ end
+
+ -- This is a bit messy. In regular metapost it's a kind of immediate replacement
+ -- so embedded btex ... etex is not really working as one would expect. We now have
+ -- a mix: it's immediate when we are at the outer level (rawmadetext) and indirect
+ -- (with the danger of stuff that doesn't work well in strings) when we are for
+ -- instance in a macro definition (rawtextext (pass back string)) ... of course one
+ -- should use textext so this is just a catch. When not in lmtx it's never immediate.
+
+ local reported = false
+ local awayswrap = CONTEXTLMTXMODE <= 1
+
function metapost.maketext(s,mode)
+ if not reported then
+ reported = true
+ report_metapost("use 'textext(.....)' instead of 'btex ..... etex'")
+ end
if mode and mode == 1 then
if trace_btexetex then
report_metapost("ignoring verbatimtex: [[%s]]",s)
end
+ elseif alwayswrap then
+ if trace_btexetex then
+ report_metapost("rewrapping btex ... etex [[%s]]",s)
+ end
+ return 'rawtextext("' .. gsub(s,'"','"&ditto&"') .. '")' -- nullpicture
+ elseif metapost.currentmpxstatus() ~= 0 then
+ if trace_btexetex then
+ report_metapost("rewrapping btex ... etex at the outer level [[%s]]",s)
+ end
+ return 'rawtextext("' .. gsub(s,'"','"&ditto&"') .. '")' -- nullpicture
else
if trace_btexetex then
report_metapost("handling btex ... etex: [[%s]]",s)
end
-- madetext = utilities.strings.collapse(s)
madetext = s
- return "rawmadetext"
+ return "rawmadetext" -- is assuming immediate processing
end
end
@@ -910,7 +1011,7 @@ local tx_reset, tx_process do
end
tx_process = function(object,prescript,before,after)
- local data = top.texdata[metapost.properties.number]
+ local data = top.texdata[metapost.properties.number] -- the current figure number, messy
local index = tonumber(prescript.tx_index)
if index then
if trace_textexts then
@@ -932,19 +1033,45 @@ local tx_reset, tx_process do
top.texlast = mp_target
--
local mp_text = top.texstrings[mp_index]
+ local mp_hash = prescript.tx_cache
local box
- if prescript.tx_cache == "no" then
+ if mp_hash == "no" then
tex.runtoks("mptexttoks")
box = textakebox("mptextbox")
else
- local hash = fmt(mp_text,mp_a or "-",mp_t or "-",mp_c or "-")
- box = data.texhash[hash]
+ local cache = data.texhash
+ if mp_hash then
+ mp_hash = tonumber(mp_hash)
+ end
+ if mp_hash then
+ local extradata = top.extradata
+ if extradata then
+ cache = extradata.globalcache
+ if not cache then
+ cache = { }
+ extradata.globalcache = cache
+ end
+ if trace_runs then
+ if cache[mp_hash] then
+ report_textexts("reusing global entry %i",mp_hash)
+ else
+ report_textexts("storing global entry %i",mp_hash)
+ end
+ end
+ else
+ mp_hash = nil
+ end
+ end
+ if not mp_hash then
+ mp_hash = fmt(mp_text,mp_a or "-",mp_t or "-",mp_c or "-")
+ end
+ box = cache[mp_hash]
if box then
box = copy_list(box)
else
tex.runtoks("mptexttoks")
box = textakebox("mptextbox")
- data.texhash[hash] = box
+ cache[mp_hash] = box
end
end
top.textexts[mp_target] = box
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-run.lua b/Master/texmf-dist/tex/context/base/mkiv/mlib-run.lua
index 09872ef0fb7..07fa6a19198 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mlib-run.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-run.lua
@@ -6,8 +6,6 @@ if not modules then modules = { } end modules ['mlib-run'] = {
license = "see context related readme files",
}
--- todo mpx :execute -> mlib.execute(mpx,)
-
-- cmyk -> done, native
-- spot -> done, but needs reworking (simpler)
-- multitone ->
@@ -32,7 +30,7 @@ nears zero.</p>
--ldx]]--
local type, tostring, tonumber, next = type, tostring, tonumber, next
-local striplines = utilities.strings.striplines
+local find, striplines = string.find, utilities.strings.striplines
local concat, insert, remove = table.concat, table.insert, table.remove
local emptystring = string.is_empty
@@ -40,8 +38,10 @@ local P = lpeg.P
local trace_graphics = false trackers.register("metapost.graphics", function(v) trace_graphics = v end)
local trace_tracingall = false trackers.register("metapost.tracingall", function(v) trace_tracingall = v end)
+local trace_terminal = false trackers.register("metapost.terminal", function(v) trace_terminal = v end)
local report_metapost = logs.reporter("metapost")
+local report_terminal = logs.reporter("metapost","terminal")
local texerrormessage = logs.texerrormessage
local starttiming = statistics.starttiming
@@ -55,11 +55,55 @@ local metapost = metapost
metapost.showlog = false
metapost.lastlog = ""
-metapost.collapse = true -- currently mplib cannot deal with begingroup/endgroup mismatch in stepwise processing
metapost.texerrors = false
metapost.exectime = metapost.exectime or { } -- hack
+metapost.nofruns = 0
+
+local mpxformats = { }
+local mpxterminals = { }
+local nofformats = 0
+local mpxpreambles = { }
+local mpxextradata = { }
+
+-- The flatten hack is needed because the library currently barks on \n\n and the
+-- collapse because mp cannot handle snippets due to grouping issues.
+
+-- todo: pass tables to executempx instead of preparing beforehand,
+-- as it's more efficient for the terminal
+
+local function flatten(source,target)
+ for i=1,#source do
+ local d = source[i]
+ if type(d) == "table" then
+ flatten(d,target)
+ elseif d and d ~= "" then
+ target[#target+1] = d
+ end
+ end
+ return target
+end
+
+local function prepareddata(data)
+ if data and data ~= "" then
+ if type(data) == "table" then
+ data = flatten(data,{ })
+ data = #data > 1 and concat(data,"\n") or data[1]
+ end
+ return data
+ end
+end
--- metapost.collapse = false
+local function executempx(mpx,data)
+ local terminal = mpxterminals[mpx]
+ if terminal then
+ terminal.writer(data)
+ data = ""
+ elseif type(data) == "table" then
+ data = prepareddata(data,collapse)
+ end
+ metapost.nofruns = metapost.nofruns + 1
+ return mpx:execute(data)
+end
directives.register("mplib.texerrors", function(v) metapost.texerrors = v end)
trackers.register ("metapost.showlog", function(v) metapost.showlog = v end)
@@ -77,7 +121,7 @@ local mpbasepath = lpeg.instringchecker(P("/metapost/") * (P("context") + P("bas
-- for some reason mp sometimes calls this function twice which is inefficient
-- but we cannot catch this
-do
+local realtimelogging do
local finders = { }
mplib.finders = finders -- also used in meta-lua.lua
@@ -85,12 +129,10 @@ do
local new_instance = mplib.new
local function validftype(ftype)
- if ftype == "" then
- -- whatever
- elseif ftype == 0 then
- -- mplib bug
+ if ftype == "mp" then
+ return "mp"
else
- return ftype
+ return nil
end
end
@@ -98,6 +140,8 @@ do
return resolvers.findfile(name,validftype(ftype))
end
+ -- this will be redone in lmtx
+
local function i_finder(name,mode,ftype) -- fake message for mpost.map and metafun.mpvi
local specification = url.hashed(name)
local finder = finders[specification.scheme] or finders.file
@@ -115,9 +159,172 @@ do
return (mode == "w" and o_finder or i_finder)(name,mode,validftype(ftype))
end
- function mplib.new(specification)
- specification.find_file = finder -- so we block an overload
- return new_instance(specification)
+ local report_logger = logs.reporter("metapost log")
+ local report_error = logs.reporter("metapost error")
+
+ local l, nl, dl = { }, 0, false
+ local t, nt, dt = { }, 0, false
+ local e, ne, de = { }, 0, false
+
+ local function logger(target,str)
+ if target == 1 then
+ -- log
+ elseif target == 2 or target == 3 then
+ -- term
+ if str == "\n" then
+ realtimelogging = true
+ if nl > 0 then
+ report_logger(concat(l,"",1,nl))
+ nl, dl = 0, false
+ elseif not dl then
+ report_logger("")
+ dl = true
+ end
+ else
+ nl = nl + 1
+ l[nl] = str
+ end
+ elseif target == 4 then
+ report_error(str)
+ end
+ end
+
+ -- experiment, todo: per instance, just a push / pop ?
+
+ local findtexfile = resolvers.findtexfile
+ local opentexfile = resolvers.opentexfile
+ local splitlines = string.splitlines
+
+ local function writetoterminal(terminaldata,maxterm,d)
+ local t = type(d)
+ local n = 0
+ if t == "string" then
+ d = splitlines(d)
+ n = #d
+ for i=1,#d do
+ maxterm = maxterm + 1
+ terminaldata[maxterm] = d[i]
+ end
+ elseif t == "table" then
+ for i=1,#d do
+ local l = d[i]
+ if find(l,"[\n\r]") then
+ local s = splitlines(l)
+ local m = #s
+ for i=1,m do
+ maxterm = maxterm + 1
+ terminaldata[maxterm] = s[i]
+ end
+ n = n + m
+ else
+ maxterm = maxterm + 1
+ terminaldata[maxterm] = d[i]
+ n = 1
+ end
+ end
+ end
+ if trace_terminal then
+ report_metapost("writing %i lines, in cache %s",n,maxterm)
+ end
+ return maxterm
+ end
+
+ local function readfromterminal(terminaldata,maxterm,nowterm)
+ if nowterm >= maxterm then
+ terminaldata[nowterm] = false
+ maxterm = 0
+ nowterm = 0
+ if trace_terminal then
+ report_metapost("resetting, maxcache %i",#terminaldata)
+ end
+ return maxterm, nowterm, nil
+ else
+ if nowterm > 0 then
+ terminaldata[nowterm] = false
+ end
+ nowterm = nowterm + 1
+ local s = terminaldata[nowterm]
+ if trace_terminal then
+ report_metapost("reading line %i: %s",nowterm,s)
+ end
+ return maxterm, nowterm, s
+ end
+ end
+
+ local function fileopener()
+
+ -- these can go into the table itself
+
+ local terminaldata = { }
+ local maxterm = 0
+ local nowterm = 0
+
+ local terminal = {
+ name = "terminal",
+ close = function()
+ -- terminal = { }
+ -- maxterm = 0
+ -- nowterm = 0
+ end,
+ reader = function()
+ local line
+ maxterm, nowterm, line = readfromterminal(terminaldata,maxterm,nowterm)
+ return line
+ end,
+ writer = function(d)
+ maxterm = writetoterminal(terminaldata,maxterm,d)
+ end,
+ }
+
+ return function(name,mode,kind)
+ if name == "terminal" then
+ -- report_metapost("opening terminal")
+ return terminal
+ elseif mode == "w" then
+ local f = io.open(name,"wb")
+ if f then
+ -- report_metapost("opening file %a for writing",full)
+ return {
+ name = full,
+ writer = function(s) return f:write(s) end, -- io.write(f,s)
+ close = function() f:close() end,
+ }
+ end
+ else
+ local full = findtexfile(name,validftype(ftype))
+ if full then
+ -- report_metapost("opening file %a for reading",full)
+ return opentexfile(full)
+ end
+ end
+ end
+
+ end
+
+ -- end of experiment
+
+ if CONTEXTLMTXMODE > 0 then
+
+ function mplib.new(specification)
+ local openfile = fileopener()
+ specification.find_file = finder
+ specification.run_logger = logger
+ specification.open_file = openfile
+ specification.interaction = "silent"
+ specification.halt_on_error = true
+ local instance = new_instance(specification)
+ mpxterminals[instance] = openfile("terminal")
+ return instance
+ end
+
+ else
+
+ function mplib.new(specification)
+ specification.find_file = finder
+ specification.run_logger = logger
+ return new_instance(specification)
+ end
+
end
mplib.finder = finder
@@ -130,7 +337,12 @@ local find_file = mplib.finder
function metapost.reporterror(result)
if not result then
report_metapost("error: no result object returned")
- elseif result.status > 0 then
+ return true
+ elseif result.status == 0 then
+ return false
+ elseif realtimelogging then
+ return false -- we already reported
+ else
local t = result.term
local e = result.error
local l = result.log
@@ -150,10 +362,8 @@ function metapost.reporterror(result)
else
report_metapost("error: unknown, no error, terminal or log messages")
end
- else
- return false
+ return true
end
- return true
end
local f_preamble = formatters [ [[
@@ -173,7 +383,7 @@ local methods = {
}
function metapost.runscript(code)
- return code
+ return ""
end
function metapost.scripterror(str)
@@ -203,13 +413,17 @@ function metapost.load(name,method)
make_text = metapost.maketext,
extensions = 1,
-- random_seed = seed,
+ utf8_mode = true,
}
report_metapost("initializing number mode %a",method)
local result
if not mpx then
result = { status = 99, error = "out of memory"}
else
- result = mpx:execute(f_preamble(file.addsuffix(name,"mp"),seed)) -- addsuffix is redundant
+ -- pushing permits advanced features
+ metapost.pushscriptrunner(mpx)
+ result = executempx(mpx,f_preamble(file.addsuffix(name,"mp"),seed))
+ metapost.popscriptrunner()
end
stoptiming(mplib)
metapost.reporterror(result)
@@ -222,8 +436,11 @@ function metapost.checkformat(mpsinput,method)
if file.suffix(mpsinput) ~= "" then
foundfile = find_file(mpsinput) or ""
end
- if foundfile == "" then
- foundfile = find_file(file.replacesuffix(mpsinput,"mpvi")) or ""
+ -- if foundfile == "" then
+ -- foundfile = find_file(file.replacesuffix(mpsinput,"mpvi")) or ""
+ -- end
+ if CONTEXTLMTXMODE > 0 and foundfile == "" then
+ foundfile = find_file(file.replacesuffix(mpsinput,"mpxl")) or ""
end
if foundfile == "" then
foundfile = find_file(file.replacesuffix(mpsinput,"mpiv")) or ""
@@ -253,40 +470,13 @@ function metapost.unload(mpx)
stoptiming(mplib)
end
--- The flatten hack is needed because the library currently barks on \n\n and the
--- collapse because mp cannot handle snippets due to grouping issues.
-
-local function flatten(source,target)
- for i=1,#source do
- local d = source[i]
- if type(d) == "table" then
- flatten(d,target)
- elseif d and d ~= "" then
- target[#target+1] = d
- end
- end
- return target
-end
-
-local function prepareddata(data,collapse)
- if data and data ~= "" then
- if type(data) == "table" then
- data = flatten(data,{ })
- if collapse then
- data = #data > 1 and concat(data,"\n") or data[1]
- end
- end
- return data
- end
-end
-
metapost.defaultformat = "metafun"
metapost.defaultinstance = "metafun"
metapost.defaultmethod = "default"
-local mpxformats = { }
-local nofformats = 0
-local mpxpreambles = { }
+function metapost.getextradata(mpx)
+ return mpxextradata[mpx]
+end
function metapost.pushformat(specification,f,m) -- was: instance, name, method
if type(specification) ~= "table" then
@@ -326,29 +516,30 @@ function metapost.pushformat(specification,f,m) -- was: instance, name, method
end
nofformats = nofformats + 1
local usedinstance = instance .. ":" .. nofformats
- local mpx = mpxformats[usedinstance]
+ local mpx = mpxformats [usedinstance]
local mpp = mpxpreambles[instance] or ""
+ -- report_metapost("push instance %a (%S)",usedinstance,mpx)
if preamble then
- preamble = prepareddata(preamble,true)
+ preamble = prepareddata(preamble)
mpp = mpp .. "\n" .. preamble
mpxpreambles[instance] = mpp
end
if not mpx then
report_metapost("initializing instance %a using format %a and method %a",usedinstance,format,method)
mpx = metapost.checkformat(format,method)
- mpxformats[usedinstance] = mpx
+ mpxformats [usedinstance] = mpx
+ mpxextradata[mpx] = { }
if mpp ~= "" then
preamble = mpp
end
end
if preamble then
- mpx:execute(preamble)
+ executempx(mpx,preamble)
end
specification.mpx = mpx
return mpx
end
-
-- luatex.wrapup(function()
-- for k, mpx in next, mpxformats do
-- mpx:finish()
@@ -364,14 +555,19 @@ function metapost.reset(mpx)
-- nothing
elseif type(mpx) == "string" then
if mpxformats[mpx] then
- mpxformats[mpx]:finish()
- mpxformats[mpx] = nil
+ local instance = mpxformats[mpx]
+ instance:finish()
+ mpxterminals[instance] = nil
+ mpxextradata[mpx] = nil
+ mpxformats [mpx] = nil
end
else
for name, instance in next, mpxformats do
if instance == mpx then
mpx:finish()
- mpxformats[name] = nil
+ mpxextradata[mpx] = nil
+ mpxformats [mpx] = nil
+ mpxterminals[mpx] = nil
break
end
end
@@ -461,7 +657,7 @@ function metapost.run(specification)
end
if mpx and data then
local tra = nil
- starttiming(metapost)
+ starttiming(metapost) -- why not at the outer level ...
metapost.variables = { } -- todo also push / pop
metapost.pushscriptrunner(mpx)
if trace_graphics then
@@ -479,20 +675,25 @@ function metapost.run(specification)
tra.inp:write(banner)
tra.log:write(banner)
end
- local data = prepareddata(data,metapost.collapse)
local function process(d,i)
if d then
if trace_graphics then
if i then
tra.inp:write(formatters["\n%% begin snippet %s\n"](i))
end
- tra.inp:write(d)
+ if type(d) == "table" then
+ for i=1,#d do
+ tra.inp:write(d[i])
+ end
+ else
+ tra.inp:write(d)
+ end
if i then
tra.inp:write(formatters["\n%% end snippet %s\n"](i))
end
end
starttiming(metapost.exectime)
- result = mpx:execute(d)
+ result = executempx(mpx,d)
stoptiming(metapost.exectime)
if trace_graphics and result then
local str = result.log or result.error
@@ -502,6 +703,7 @@ function metapost.run(specification)
end
if not metapost.reporterror(result) then
if metapost.showlog then
+ -- make function and overload in lmtx
local str = result.term ~= "" and result.term or "no terminal output"
if not emptystring(str) then
metapost.lastlog = metapost.lastlog .. "\n" .. str
@@ -519,14 +721,16 @@ function metapost.run(specification)
end
end
+-- local data = prepareddata(data)
if type(data) == "table" then
if trace_tracingall then
- mpx:execute("tracingall;")
+ executempx(mpx,"tracingall;")
end
- for i=1,#data do
- process(data[i],i)
- end
- else
+ process(data)
+-- for i=1,#data do
+-- process(data[i],i)
+-- end
+ else
if trace_tracingall then
data = "tracingall;" .. data
end
@@ -554,125 +758,71 @@ if not metapost.convert then
end
--- handy
+-- This will be redone as we no longer output svg of ps!
-function metapost.directrun(formatname,filename,outputformat,astable,mpdata)
- local fullname = file.addsuffix(filename,"mp")
- local data = mpdata or io.loaddata(fullname)
- if outputformat ~= "svg" then
- outputformat = "mps"
- end
- if not data then
- report_metapost("unknown file %a",filename)
- else
- local mpx = metapost.checkformat(formatname)
- if not mpx then
- report_metapost("unknown format %a",formatname)
- else
- report_metapost("processing %a",(mpdata and (filename or "data")) or fullname)
- local result = mpx:execute(data)
- if not result then
- report_metapost("error: no result object returned")
- elseif result.status > 0 then
- report_metapost("error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error"))
- else
- if metapost.showlog then
- metapost.lastlog = metapost.lastlog .. "\n" .. result.term
- report_metapost("info: %s",result.term or "no-term")
- end
- local figures = result.fig
- if figures then
- local sorted = table.sortedkeys(figures)
- if astable then
- local result = { }
- report_metapost("storing %s figures in table",#sorted)
- for k=1,#sorted do
- local v = sorted[k]
- if outputformat == "mps" then
- result[v] = figures[v]:postscript()
- else
- result[v] = figures[v]:svg() -- (3) for prologues
- end
- end
- return result
- else
- local basename = file.removesuffix(file.basename(filename))
- for k=1,#sorted do
- local v = sorted[k]
- local output
- if outputformat == "mps" then
- output = figures[v]:postscript()
- else
- output = figures[v]:svg() -- (3) for prologues
- end
- local outname = formatters["%s-%s.%s"](basename,v,outputformat)
- report_metapost("saving %s bytes in %a",#output,outname)
- io.savedata(outname,output)
- end
- return #sorted
- end
- end
- end
- end
- end
-end
-
--- goodie
-
-function metapost.quickanddirty(mpxformat,data,incontext)
- if not data then
- mpxformat = "metafun"
- data = mpxformat
- end
- local code, bbox
- local flusher = {
- startfigure = function(n,llx,lly,urx,ury)
- code = { }
- bbox = { llx, lly, urx, ury }
- end,
- flushfigure = function(t)
- for i=1,#t do
- code[#code+1] = t[i]
- end
- end,
- stopfigure = function()
- end
- }
- local data = formatters["; beginfig(1) ;\n %s\n ; endfig ;"](data)
- metapost.process {
- mpx = mpxformat,
- flusher = flusher,
- askedfig = "all",
- useplugins = incontext,
- incontext = incontext,
- data = { data },
- }
- if code then
- return {
- bbox = bbox or { 0, 0, 0, 0 },
- code = code,
- data = data,
- }
- else
- report_metapost("invalid quick and dirty run")
- end
-end
+-- function metapost.directrun(formatname,filename,outputformat,astable,mpdata)
+-- local fullname = file.addsuffix(filename,"mp")
+-- local data = mpdata or io.loaddata(fullname)
+-- if outputformat ~= "svg" then
+-- outputformat = "mps"
+-- end
+-- if not data then
+-- report_metapost("unknown file %a",filename)
+-- else
+-- local mpx = metapost.checkformat(formatname)
+-- if not mpx then
+-- report_metapost("unknown format %a",formatname)
+-- else
+-- report_metapost("processing %a",(mpdata and (filename or "data")) or fullname)
+-- local result = executempx(mpx,data)
+-- if not result then
+-- report_metapost("error: no result object returned")
+-- elseif result.status > 0 then
+-- report_metapost("error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error"))
+-- else
+-- if metapost.showlog then
+-- metapost.lastlog = metapost.lastlog .. "\n" .. result.term
+-- report_metapost("info: %s",result.term or "no-term")
+-- end
+-- local figures = result.fig
+-- if figures then
+-- local sorted = table.sortedkeys(figures)
+-- if astable then
+-- local result = { }
+-- report_metapost("storing %s figures in table",#sorted)
+-- for k=1,#sorted do
+-- local v = sorted[k]
+-- if outputformat == "mps" then
+-- result[v] = figures[v]:postscript()
+-- else
+-- result[v] = figures[v]:svg() -- (3) for prologues
+-- end
+-- end
+-- return result
+-- else
+-- local basename = file.removesuffix(file.basename(filename))
+-- for k=1,#sorted do
+-- local v = sorted[k]
+-- local output
+-- if outputformat == "mps" then
+-- output = figures[v]:postscript()
+-- else
+-- output = figures[v]:svg() -- (3) for prologues
+-- end
+-- local outname = formatters["%s-%s.%s"](basename,v,outputformat)
+-- report_metapost("saving %s bytes in %a",#output,outname)
+-- io.savedata(outname,output)
+-- end
+-- return #sorted
+-- end
+-- end
+-- end
+-- end
+-- end
+-- end
-function metapost.getstatistics(memonly)
- if memonly then
- local n, m = 0, 0
- for name, mpx in next, mpxformats do
- n = n + 1
- m = m + mpx:statistics().memory
- end
- return n, m
- else
- local t = { }
- for name, mpx in next, mpxformats do
- t[name] = mpx:statistics()
- end
- return t
- end
+function metapost.directrun(formatname,filename,outputformat,astable,mpdata)
+ report_metapost("producing postscript and svg is no longer supported")
end
do
@@ -681,6 +831,7 @@ do
local width = 0
local height = 0
local depth = 0
+ local bbox = { 0, 0, 0, 0 }
local flusher = {
startfigure = function(n,llx,lly,urx,ury)
@@ -688,35 +839,62 @@ do
width = urx - llx
height = ury
depth = -lly
+ bbox = { llx, lly, urx, ury }
end,
flushfigure = function(t)
+ local r = #result
for i=1,#t do
- result[#result+1] = t[i]
+ r = r + 1
+ result[r] = t[i]
end
end,
stopfigure = function()
- end
+ end,
}
- function metapost.simple(format,code) -- even less than metapost.quickcanddirty
- local mpx = metapost.pushformat { } -- takes defaults
- -- metapost.setoutercolor(2)
+ -- make table variant:
+
+ function metapost.simple(instance,code,useextensions,dontwrap)
+ -- can we pickup the instance ?
+ local mpx = metapost.pushformat {
+ instance = instance or "simplefun",
+ format = "metafun", -- or: minifun
+ method = "double",
+ }
metapost.process {
mpx = mpx,
flusher = flusher,
askedfig = 1,
- useplugins = false,
+ useplugins = useextensions,
+ data = dontwrap and { code } or { "beginfig(1);", code, "endfig;" },
incontext = false,
- data = { "beginfig(1);", code, "endfig;" },
}
metapost.popformat()
if result then
local stream = concat(result," ")
- result = nil -- cleanup
- return stream, width, height, depth
+ result = { } -- nil -- cleanup .. weird, we can have a dangling q
+ return stream, width, height, depth, bbox
else
- return "", 0, 0, 0
+ return "", 0, 0, 0, { 0, 0, 0, 0 }
end
end
end
+
+function metapost.getstatistics(memonly)
+ if memonly then
+ local n, m = 0, 0
+ for name, mpx in next, mpxformats do
+ n = n + 1
+ m = m + mpx:statistics().memory
+ end
+ return n, m
+ else
+ local t = { }
+ for name, mpx in next, mpxformats do
+ t[name] = mpx:statistics()
+ end
+ return t
+ end
+end
+
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-scn.lua b/Master/texmf-dist/tex/context/base/mkiv/mlib-scn.lua
new file mode 100644
index 00000000000..709961543bf
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-scn.lua
@@ -0,0 +1,777 @@
+if not modules then modules = { } end modules ['mlib-scn'] = {
+ version = 1.001,
+ comment = "companion to mlib-ctx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+-- Very experimental, for Alan and me.
+
+-- for i = 1 upto 32000 : % 0.062
+-- ts := 5mm / 20;
+-- endfor ;
+--
+-- for i = 1 upto 32000 : % 0.219
+-- ts := (getparameter "axis" "sy") / 20;
+-- endfor ;
+--
+-- for i = 1 upto 32000 : % 0.266
+-- ts := (getparameterx "axis" "sy") / 20;
+-- endfor ;
+--
+-- pushparameters "axis";
+-- for i = 1 upto 32000 : % 0.250
+-- ts := (getparameterx "sy") / 20;
+-- endfor ;
+-- popparameters;
+
+local type, next, rawget, getmetatable = type, next, rawget, getmetatable
+local byte, gmatch = string.byte, string.gmatch
+local insert, remove = table.insert, table.remove
+
+local mplib = mplib
+local metapost = metapost
+
+local codes = mplib.codes()
+local types = mplib.types()
+
+table.hashed(codes)
+table.hashed(types)
+
+metapost.codes = codes
+metapost.types = types
+
+local setmetatableindex = table.setmetatableindex
+
+local scanners = mp.scan
+
+local scannext = scanners.next
+local scanexpression = scanners.expression
+local scantoken = scanners.token
+local scansymbol = scanners.symbol
+local scannumeric = scanners.numeric
+local scannumber = scanners.number
+local scaninteger = scanners.integer
+local scanboolean = scanners.boolean
+local scanstring = scanners.string
+local scanpair = scanners.pair
+local scancolor = scanners.color
+local scancmykcolor = scanners.cmykcolor
+local scantransform = scanners.transform
+local scanpath = scanners.path
+local scanpen = scanners.pen
+
+local mpprint = mp.print
+local mpnumeric = mp.numeric
+local mpstring = mp.string
+local mpquoted = mp.quoted
+local mpboolean = mp.boolean
+local mppair = mp.pair
+local mppath = mp.path
+local mptriplet = mp.triplet
+local mpquadruple = mp.quadruple
+local mptransform = mp.transform
+local mpvalue = mp.value
+
+local report = logs.reporter("metapost")
+
+local semicolon_code <const> = codes.semicolon
+local equals_code <const> = codes.equals
+local comma_code <const> = codes.comma
+local colon_code <const> = codes.colon
+local leftbrace_code <const> = codes.leftbrace
+local rightbrace_code <const> = codes.rightbrace
+local leftbracket_code <const> = codes.leftbracket
+local rightbracket_code <const> = codes.rightbracket
+local leftdelimiter_code <const> = codes.leftdelimiter
+local rightdelimiter_code <const> = codes.rightdelimiter
+local numeric_code <const> = codes.numeric
+local string_code <const> = codes.string
+local capsule_code <const> = codes.capsule
+local nullary_code <const> = codes.nullary
+local tag_code <const> = codes.tag
+local definedmacro_code <const> = codes.definedmacro
+
+local typescanners = nil
+local tokenscanners = nil
+local scanset = nil
+local scanparameters = nil
+
+scanset = function() -- can be optimized, we now read twice
+ scantoken()
+ if scantoken(true) == rightbrace_code then
+ scantoken()
+ return { }
+ else
+ local l = { }
+ local i = 0
+ while true do
+ i = i + 1
+ local s = scansymbol(true)
+ if s == "{" then
+ l[i] = scanset()
+ elseif s == "[" then
+ local d = { }
+ scansymbol()
+ while true do
+ local s = scansymbol()
+ if s == "]" then
+ break;
+ elseif s == "," then
+ -- continue
+ else
+ local t = scantoken(true)
+ if t == equals_code or t == colon_code then
+ scantoken()
+ end
+ d[s] = tokenscanners[scantoken(true)]()
+ end
+ end
+ l[i] = d
+ else
+ local e = scanexpression(true)
+ l[i] = (typescanners[e] or scanexpression)()
+ end
+ if scantoken() == rightbrace_code then
+ break
+ else
+ -- whatever
+ end
+ end
+ return l
+ end
+end
+
+local function scan_pair () return scanpair (true) end
+local function scan_color () return scancolor (true) end
+local function scan_cmykcolor() return scancmykcolor(true) end
+local function scan_transform() return scantransform(true) end
+
+tokenscanners = {
+ [leftbrace_code] = scanset,
+ [numeric_code] = scannumeric,
+ [string_code] = scanstring,
+ [nullary_code] = scanboolean, -- todo
+}
+
+typescanners = {
+ [types.known] = scannumeric,
+ [types.numeric] = scannumeric,
+ [types.string] = scanstring,
+ [types.boolean] = scanboolean,
+ [types.pair] = scan_pair,
+ [types.color] = scan_color,
+ [types.cmykcolor] = scan_cmykcolor,
+ [types.transform] = scan_transform,
+ [types.path] = scanpath,
+ [types.pen] = scanpen,
+}
+
+table.setmetatableindex(tokenscanners,function()
+ local e = scanexpression(true)
+ return typescanners[e] or scanexpression
+end)
+
+-- a key like 'color' has code 'declare'
+
+local function scanparameters(fenced)
+ local data = { }
+ local close = "]"
+ if not fenced then
+ close = ";"
+ elseif scansymbol(true) == "[" then
+ scansymbol()
+ else
+ return data
+ end
+ while true do
+ -- local s = scansymbol()
+ local s = scansymbol(false,false)
+ if s == close then
+ break;
+ elseif s == "," then
+ -- continue
+ else
+ local t = scantoken(true)
+ if t == equals_code or t == colon_code then
+ -- optional equal or :
+ scantoken()
+ end
+ local kind = scantoken(true)
+ if kind == leftdelimiter_code or kind == tag_code or kind == capsule_code then
+ kind = scanexpression(true)
+ data[s] = (typescanners[kind] or scanexpression)()
+ elseif kind == leftbracket_code then
+ data[s] = get_parameters(true)
+ else
+ data[s] = tokenscanners[kind]()
+ end
+ end
+ end
+ return data
+end
+
+local namespaces = { }
+local presets = { }
+local passed = { }
+
+local function get_parameters(nested)
+ local data = { }
+ if nested or scansymbol(true) == "[" then
+ scansymbol()
+ else
+ return data
+ end
+ while true do
+ local s = scansymbol(false,false)
+ if s == "]" then
+ break;
+ elseif s == "," then
+ -- continue
+ else
+ local t = scantoken(true)
+ if t == equals_code or t == colon_code then
+ -- optional equal or :
+ scantoken()
+ end
+ local kind = scantoken(true)
+ if kind == leftdelimiter_code or kind == tag_code or kind == capsule_code then
+ kind = scanexpression(true)
+ data[s] = (typescanners[kind] or scanexpression)()
+ elseif kind == leftbracket_code then
+ data[s] = get_parameters(true)
+ else
+ data[s] = tokenscanners[kind]()
+ end
+ end
+ end
+ return data
+end
+
+local function getparameters()
+ local namespace = scanstring()
+ -- same as below
+ local parameters = get_parameters()
+ local presets = presets[namespace]
+ local passed = passed[namespace]
+ if passed then
+ if presets then
+ setmetatableindex(passed,presets)
+ end
+ setmetatableindex(parameters,passed)
+ elseif presets then
+ setmetatableindex(parameters,presets)
+ end
+ namespaces[namespace] = parameters
+ --
+end
+
+local function applyparameters()
+ local saved = namespaces
+ local namespace = scanstring()
+ local action = scanstring() -- before we scan the parameters
+ -- same as above
+ local parameters = get_parameters()
+ local presets = presets[namespace]
+ local passed = passed[namespace]
+ if passed then
+ if presets then
+ setmetatableindex(passed,presets)
+ end
+ setmetatableindex(parameters,passed)
+ elseif presets then
+ setmetatableindex(parameters,presets)
+ end
+ namespaces[namespace] = parameters
+ -- till here
+ mpprint(action)
+ namespaces = saved
+end
+
+local function presetparameters()
+ local namespace = scanstring()
+ local parent = nil
+ local t = scantoken(true)
+ if t == string_code then
+ parent = presets[scanstring()]
+ end
+ local p = get_parameters()
+ if parent then
+ setmetatableindex(p,parent)
+ end
+ presets[namespace] = p
+end
+
+local function collectnames()
+ local l = { } -- can be reused but then we can't nest
+ local n = 0
+ while true do
+ local t = scantoken(true)
+ -- (1) not really needed
+ if t == numeric_code then
+ n = n + 1 l[n] = scaninteger(1)
+ elseif t == string_code then
+ n = n + 1 l[n] = scanstring(1)
+ elseif t == nullary_code then
+ n = n + 1 l[n] = scanboolean(1)
+ elseif t == leftdelimiter_code or t == tag_code or t == capsule_code then
+ t = scanexpression(true)
+ n = n + 1 l[n] = (typescanners[t] or scanexpression)()
+ else
+ break
+ end
+ end
+ return l, n
+end
+
+local function get(v)
+ local t = type(v)
+ if t == "number" then
+ return mpnumeric(v)
+ elseif t == "boolean" then
+ return mpboolean(v)
+ elseif t == "string" then
+ return mpquoted(v)
+ elseif t == "table" then
+ local n = #v
+ if type(v[1]) == "table" then
+ return mppath(v) -- cycle ?
+ elseif n == 2 then
+ return mppair(v)
+ elseif n == 3 then
+ return mptriplet(v)
+ elseif n == 4 then
+ return mpquadruple(v)
+ elseif n == 6 then
+ return mptransform(v)
+ end
+ end
+ return mpnumeric(0)
+end
+
+local stack = { }
+
+local function pushparameters()
+ local l, n = collectnames()
+ insert(stack,namespaces)
+ for i=1,n do
+ local n = namespaces[l[i]]
+ if type(n) == "table" then
+ namespaces = n
+ else
+ break
+ end
+ end
+end
+
+local function popparameters()
+ local n = remove(stack)
+ if n then
+ namespaces = n
+ else
+ report("stack error")
+ end
+end
+
+-- todo:
+
+local function getparameter()
+ local list, n = collectnames()
+ local v = namespaces
+ for i=1,n do
+ local l = list[i]
+ local vl = v[l]
+ if vl == nil then
+ if type(l) == "number" then
+ vl = v[1]
+ if vl == nil then
+ return mpnumeric(0)
+ end
+ else
+ return mpnumeric(0)
+ end
+ end
+ v = vl
+ end
+ if v == nil then
+ return mpnumeric(0)
+ else
+ return get(v)
+ end
+end
+
+local function hasparameter()
+ local list, n = collectnames()
+ local v = namespaces
+ for i=1,n do
+ local l = list[i]
+ local vl = rawget(v,l)
+ if vl == nil then
+ if type(l) == "number" then
+ vl = rawget(v,1)
+ if vl == nil then
+ return mpboolean(false)
+ end
+ else
+ return mpboolean(false)
+ end
+ end
+ v = vl
+ end
+ if v == nil then
+ return mpboolean(false)
+ else
+ return mpboolean(true)
+ end
+end
+
+local function hasoption()
+ local list, n = collectnames()
+ if n > 1 then
+ local v = namespaces
+ if n > 2 then
+ for i=1,n-1 do
+ local l = list[i]
+ local vl = v[l]
+ if vl == nil then
+ return mpboolean(false)
+ end
+ v = vl
+ end
+ else
+ v = v[list[1]]
+ end
+ if type(v) == "string" then
+ -- no caching .. slow anyway
+ local o = list[n]
+ if v == o then
+ return mpboolean(true)
+ end
+ for vv in gmatch(v,"[^%s,]+") do
+ for oo in gmatch(o,"[^%s,]+") do
+ if vv == oo then
+ return mpboolean(true)
+ end
+ end
+ end
+ end
+ end
+ return mpboolean(false)
+end
+
+local function getparameterdefault()
+ local list, n = collectnames()
+ local v = namespaces
+ if n == 1 then
+ local l = list[1]
+ local vl = v[l]
+ if vl == nil then
+ -- maybe backtrack
+ local top = stack[#stack]
+ if top then
+ vl = top[l]
+ end
+ end
+ if vl == nil then
+ return mpnumeric(0)
+ else
+ return get(vl)
+ end
+ else
+ for i=1,n-1 do
+ local l = list[i]
+ local vl = v[l]
+ if vl == nil then
+ if type(l) == "number" then
+ vl = v[1]
+ if vl == nil then
+ return get(list[n])
+ end
+ else
+ local last = list[n]
+ if last == "*" then
+ -- so, only when not pushed
+ local m = getmetatable(namespaces[list[1]])
+ if n then
+ m = m.__index -- can also be a _m_
+ end
+ if m then
+ local v = m
+ for i=2,n-1 do
+ local l = list[i]
+ local vl = v[l]
+ if vl == nil then
+ return mpnumeric(0)
+ end
+ v = vl
+ end
+ if v == nil then
+ return mpnumeric(0)
+ else
+ return get(v)
+ end
+ end
+ return mpnumeric(0)
+ else
+ return get(last)
+ end
+ end
+ end
+ v = vl
+ end
+ if v == nil then
+ return get(list[n])
+ else
+ return get(v)
+ end
+ end
+end
+
+local function getparametercount()
+ local list, n = collectnames()
+ local v = namespaces
+ for i=1,n do
+ v = v[list[i]]
+ if not v then
+ break
+ end
+ end
+ return mpnumeric(type(v) == "table" and #v or 0)
+end
+
+local function getmaxparametercount()
+ local list, n = collectnames()
+ local v = namespaces
+ for i=1,n do
+ v = v[list[i]]
+ if not v then
+ break
+ end
+ end
+ local n = 0
+ if type(v) == "table" then
+ local v1 = v[1]
+ if type(v1) == "table" then
+ n = #v1
+ for i=2,#v do
+ local vi = v[i]
+ if type(vi) == "table" then
+ local vn = #vi
+ if vn > n then
+ n = vn
+ end
+ else
+ break;
+ end
+ end
+ end
+
+ end
+ return mpnumeric(n)
+end
+
+local validconnectors = {
+ [".."] = true,
+ ["..."] = true,
+ ["--"] = true,
+}
+
+local function getparameterpath()
+ local list, n = collectnames()
+ local close = list[n]
+ if type(close) == "boolean" then
+ n = n - 1
+ else
+ close = false
+ end
+ local connector = list[n]
+ if type(connector) == "string" and validconnectors[connector] then
+ n = n - 1
+ else
+ connector = "--"
+ end
+ local v = namespaces
+ for i=1,n do
+ v = v[list[i]]
+ if not v then
+ break
+ end
+ end
+ if type(v) == "table" then
+ return mppath(v,connector,close)
+ else
+ return mppair(0,0)
+ end
+end
+
+local function getparameterpen()
+ local list, n = collectnames()
+ local v = namespaces
+ for i=1,n do
+ v = v[list[i]]
+ if not v then
+ break
+ end
+ end
+ if type(v) == "table" then
+ return mppath(v,"..",true)
+ else
+ return mppair(0,0)
+ end
+end
+
+local function getparametertext()
+ local list, n = collectnames()
+ local strut = list[n]
+ if type(strut) == "boolean" then
+ n = n - 1
+ else
+ strut = false
+ end
+ local v = namespaces
+ for i=1,n do
+ v = v[list[i]]
+ if not v then
+ break
+ end
+ end
+ if type(v) == "string" then
+ return mpquoted("\\strut " .. v)
+ else
+ return mpquoted("")
+ end
+end
+
+-- local function getparameteroption()
+-- local list, n = collectnames()
+-- local last = list[n]
+-- if type(last) == "string" then
+-- n = n - 1
+-- else
+-- return false
+-- end
+-- local v = namespaces
+-- for i=1,n do
+-- v = v[list[i]]
+-- if not v then
+-- break
+-- end
+-- end
+-- if type(v) == "string" and v ~= "" then
+-- for s in gmatch(v,"[^ ,]+") do
+-- if s == last then
+-- return true
+-- end
+-- end
+-- end
+-- return false
+-- end
+
+function metapost.scanparameters()
+-- scantoken() -- we scan the semicolon
+ return get_parameters()
+end
+
+metapost.registerscript("getparameters", getparameters)
+metapost.registerscript("applyparameters", applyparameters)
+metapost.registerscript("presetparameters", presetparameters)
+metapost.registerscript("hasparameter", hasparameter)
+metapost.registerscript("hasoption", hasoption)
+metapost.registerscript("getparameter", getparameter)
+metapost.registerscript("getparameterdefault", getparameterdefault)
+metapost.registerscript("getparametercount", getparametercount)
+metapost.registerscript("getmaxparametercount",getmaxparametercount)
+metapost.registerscript("getparameterpath", getparameterpath)
+metapost.registerscript("getparameterpen", getparameterpen)
+metapost.registerscript("getparametertext", getparametertext)
+--------.registerscript("getparameteroption", getparameteroption)
+metapost.registerscript("pushparameters", pushparameters)
+metapost.registerscript("popparameters", popparameters)
+
+function metapost.getparameter(list)
+ local n = #list
+ local v = namespaces
+ for i=1,n do
+ local l = list[i]
+ local vl = v[l]
+ if vl == nil then
+ return
+ end
+ v = vl
+ end
+ return v
+end
+
+function metapost.getparameterset(namespace)
+ return namespace and namespaces[namespace] or namespaces
+end
+
+function metapost.setparameterset(namespace,t)
+ namespaces[namespace] = t
+end
+
+-- goodies
+
+metapost.registerscript("definecolor", function()
+ scantoken() -- we scan the semicolon
+ local s = get_parameters()
+ attributes.colors.defineprocesscolordirect(s)
+end)
+
+-- tex scanners
+
+local scanners = tokens.scanners
+local scanhash = scanners.hash
+local scanstring = scanners.string
+local scanvalue = scanners.value
+local scaninteger = scanners.integer
+local scanboolean = scanners.boolean
+local scanfloat = scanners.float
+local scandimension = scanners.dimension
+
+local definitions = { }
+
+local bpfactor <const> = number.dimenfactors.bp
+local comma <const> = byte(",")
+local close <const> = byte("]")
+
+local scanrest = function() return scanvalue(comma,close) or "" end
+local scandimension = function() return scandimension() * bpfactor end
+
+local scanners = {
+ ["integer"] = scaninteger,
+ ["number"] = scanfloat,
+ ["numeric"] = scanfloat,
+ ["boolean"] = scanboolean,
+ ["string"] = scanrest,
+ ["dimension"] = scandimension,
+}
+
+interfaces.implement {
+ name = "lmt_parameters_define",
+ arguments = "string",
+ actions = function(namespace)
+ local d = scanhash()
+ for k, v in next, d do
+ d[k] = scanners[v] or scanrest
+ end
+ definitions[namespace] = d
+ end,
+}
+
+interfaces.implement {
+ name = "lmt_parameters_preset",
+ arguments = "string",
+ actions = function(namespace)
+ passed[namespace] = scanhash(definitions[namespace])
+ end,
+}
+
+interfaces.implement {
+ name = "lmt_parameters_reset",
+ arguments = "string",
+ actions = function(namespace)
+ passed[namespace] = nil
+ end,
+}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mlib-svg.lua b/Master/texmf-dist/tex/context/base/mkiv/mlib-svg.lua
new file mode 100644
index 00000000000..f4b3117a62f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/mlib-svg.lua
@@ -0,0 +1,3118 @@
+if not modules then modules = { } end modules ['mlib-svg'] = {
+ version = 1.001,
+ comment = "companion to mlib-ctx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+-- Just a few notes:
+--
+-- There is no real need to boost performance here .. we can always make a fast
+-- variant when really needed. I will also do some of the todo's when I run into
+-- proper fonts. I need to optimize this a bit but will do that once I'm satisfied
+-- with the outcome and don't need more hooks and plugs. At some point I will
+-- optimize the MetaPost part because now we probably have more image wrapping
+-- than needed.
+--
+-- As usual with these standards, things like a path can be very compact while the
+-- rest is very verbose which defeats the point. This is a first attempt. There will
+-- be a converter to MP as well as directly to PDF. This module was made for one of
+-- the dangerous curves talks at the 2019 CTX meeting. I will do the font when I
+-- need it (not that hard).
+--
+-- The fact that in the more recent versions of SVG the older text related elements
+-- are depricated and not even supposed to be supported, combined with the fact that
+-- the text element assumes css styling, demonstrates that there is not so much as a
+-- standard. It basically means that whatever technology dominates at some point
+-- (probably combined with some libraries that at that point exist) determine what
+-- is standard. Anyway, it probably also means that these formats are not that
+-- suitable for long term archival purposes. So don't take the next implementation
+-- too serious. So in the end we now have (1) attributes for properties (which is
+-- nice and clean and what attributes are for, (2) a style attribute that needs to
+-- be parsed, (3) classes that map to styles and (4) element related styles, plus a
+-- kind of inheritance (given the limited number of elements sticking to only <g> as
+-- wrapper would have made much sense. Anyway, we need to deal with it. With all
+-- these style things going on, one can wonder where it will end. Basically svg
+-- became just a html element that way and less clean too. The same is true for
+-- tspan, which means that text itself is nested xml.
+--
+-- We can do a direct conversion to PDF but then we also loose the abstraction which
+-- in the future will be used, and for fonts we need to spawn out to TeX anyway, so
+-- the little overhead of calling MetaPost is okay I guess. Also, we want to
+-- overload labels, share fonts with the main document, etc. and are not aiming at a
+-- general purpose SVG converter. For going to PDF one can just use InkScape.
+--
+-- Written with Anne Clark on speakers as distraction.
+--
+-- Todo when I run into an example (but ony when needed and reasonable):
+--
+-- var(color,color)
+-- --color<decimal>
+-- currentColor : when i run into an example
+-- a bit more shading
+-- clip = [ auto | rect(llx,lly,urx,ury) ] (in svg)
+-- xlink url ... whatever
+-- masks
+-- opacity per group (i need to add that to metafun first, inefficient pdf but
+-- maybe filldraw can help here)
+--
+-- Maybe in metafun:
+--
+-- penciled n -> withpen pencircle scaled n
+-- applied (...) -> transformed bymatrix (...)
+-- withopacity n -> withtransparency (1,n)
+
+-- When testing mbo files:
+--
+-- empty paths
+-- missing control points
+-- funny fontnames like abcdefverdana etc
+-- paths representing glyphs but also with style specs
+-- all kind of attributes
+-- very weird and inefficient shading
+
+-- One can run into pretty crazy images, like lines that are fills being clipped
+-- to some width. That's the danger of hiding yourself behind an interface I guess.
+
+local rawget, rawset, type, tonumber, tostring, next, setmetatable = rawget, rawset, type, tonumber, tostring, next, setmetatable
+
+local P, S, R, C, Ct, Cs, Cc, Cp, Cg, Cf, Carg = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Ct, lpeg.Cs, lpeg.Cc, lpeg.Cp, lpeg.Cg, lpeg.Cf, lpeg.Carg
+
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local sqrt = math.sqrt
+local concat, setmetatableindex, sortedhash = table.concat, table.setmetatableindex, table.sortedhash
+local gmatch, gsub, find, match, rep = string.gmatch, string.gsub, string.find, string.match, string.rep
+local formatters, fullstrip = string.formatters, string.fullstrip
+local utfsplit, utfbyte = utf.split, utf.byte
+
+local xmlconvert, xmlcollected, xmlcount, xmlfirst, xmlroot = xml.convert, xml.collected, xml.count, xml.first, xml.root
+local xmltext, xmltextonly = xml.text, xml.textonly
+local css = xml.css or { } -- testing
+
+local function xmlinheritattributes(c,pa)
+ local at = c.at
+ local dt = c.dt
+ if at and dt then
+ if pa then
+ setmetatableindex(at,pa)
+ end
+ for i=1,#dt do
+ local dti = dt[i]
+ if type(dti) == "table" then
+ xmlinheritattributes(dti,at)
+ end
+ end
+ else
+ -- comment of so
+ end
+end
+
+xml.inheritattributes = xmlinheritattributes
+
+-- Maybe some day helpers will move to the metapost.svg namespace!
+
+metapost = metapost or { }
+local metapost = metapost
+local context = context
+
+local report = logs.reporter("metapost","svg")
+
+local trace = false trackers.register("metapost.svg", function(v) trace = v end)
+local trace_text = false trackers.register("metapost.svg.text", function(v) trace_text = v end)
+local trace_path = false trackers.register("metapost.svg.path", function(v) trace_path = v end)
+local trace_result = false trackers.register("metapost.svg.result", function(v) trace_result = v end)
+
+local pathtracer = {
+ ["stroke"] = "darkred",
+ ["stroke-opacity"] = ".5",
+ ["stroke-width"] = ".5",
+ ["fill"] = "darkgray",
+ ["fill-opacity"] = ".75",
+}
+
+-- This is just an experiment. Todo: reset hash etc. Also implement
+-- an option handler.
+
+local svghash = false do
+
+ local svglast = 0
+ local svglist = false
+
+ local function checkhash(t,k)
+ local n = svglast + 1
+ svglast = n
+ svglist[n] = k
+ t[k] = n
+ return n
+ end
+
+ function metapost.startsvghashing()
+ svglast = 0
+ svglist = { }
+ svghash = setmetatableindex(checkhash)
+ end
+
+ function metapost.stopsvghashing()
+ svglast = 0
+ svglist = false
+ svghash = false
+ end
+
+ interfaces.implement {
+ name = "svghashed",
+ arguments = "integer",
+ actions = function(n)
+ local t = svglist and svglist[n]
+ if t then
+ context(t)
+ end
+ end
+ }
+
+end
+
+-- We have quite some closures because otherwise we run into the local variable
+-- limitations. It doesn't always look pretty now, sorry. I'll clean up this mess
+-- some day (the usual nth iteration of code).
+--
+-- Most of the conversion is rather trivial code till I ran into a file with arcs. A
+-- bit of searching lead to the a2c javascript function but it has some puzzling
+-- thingies (like sin and cos definitions that look like leftovers and possible
+-- division by zero). Anyway, we can if needed optimize it a bit more. Here does it
+-- come from:
+
+-- http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
+-- https://github.com/adobe-webplatform/Snap.svg/blob/b242f49e6798ac297a3dad0dfb03c0893e394464/src/path.js
+
+local a2c do
+
+ local pi, sin, cos, tan, asin, abs = math.pi, math.sin, math.cos, math.tan, math.asin, math.abs
+
+ local d120 = (pi * 120) / 180
+ local pi2 = 2 * pi
+
+ a2c = function(x1, y1, rx, ry, angle, large, sweep, x2, y2, f1, f2, cx, cy)
+
+ if (rx == 0 or ry == 0 ) or (x1 == x2 and y1 == y2) then
+ return { x1, y1, x2, y2, x2, y2 }
+ end
+
+ local recursive = f1
+ local rad = pi / 180 * angle
+ local res = nil
+ local cosrad = cos(-rad) -- local cosrad = cosd(angle)
+ local sinrad = sin(-rad) -- local sinrad = sind(angle)
+
+ if not recursive then
+
+ x1, y1 = x1 * cosrad - y1 * sinrad, x1 * sinrad + y1 * cosrad
+ x2, y2 = x2 * cosrad - y2 * sinrad, x2 * sinrad + y2 * cosrad
+
+ local x = (x1 - x2) / 2
+ local y = (y1 - y2) / 2
+ local xx = x * x
+ local yy = y * y
+ local h = xx / (rx * rx) + yy / (ry * ry)
+
+ if h > 1 then
+ h = sqrt(h)
+ rx = h * rx
+ ry = h * ry
+ end
+
+ local rx2 = rx * rx
+ local ry2 = ry * ry
+ local ry2xx = ry2 * xx
+ local rx2yy = rx2 * yy
+ local total = rx2yy + ry2xx -- otherwise overflow
+
+ local k = total == 0 and 0 or sqrt(abs((rx2 * ry2 - rx2yy - ry2xx) / total))
+
+ if large == sweep then
+ k = -k
+ end
+
+ cx = k * rx * y / ry + (x1 + x2) / 2
+ cy = k * -ry * x / rx + (y1 + y2) / 2
+
+ f1 = (y1 - cy) / ry -- otherwise crash on a tiny eps
+ f2 = (y2 - cy) / ry -- otherwise crash on a tiny eps
+
+ f1 = asin((f1 < -1.0 and -1.0) or (f1 > 1.0 and 1.0) or f1)
+ f2 = asin((f2 < -1.0 and -1.0) or (f2 > 1.0 and 1.0) or f2)
+
+ if x1 < cx then f1 = pi - f1 end
+ if x2 < cx then f2 = pi - f2 end
+
+ if f1 < 0 then f1 = pi2 + f1 end
+ if f2 < 0 then f2 = pi2 + f2 end
+
+ if sweep ~= 0 and f1 > f2 then f1 = f1 - pi2 end
+ if sweep == 0 and f2 > f1 then f2 = f2 - pi2 end
+
+ end
+
+ if abs(f2 - f1) > d120 then
+ local f2old = f2
+ local x2old = x2
+ local y2old = y2
+ f2 = f1 + d120 * ((sweep ~= 0 and f2 > f1) and 1 or -1)
+ x2 = cx + rx * cos(f2)
+ y2 = cy + ry * sin(f2)
+ res = a2c(x2, y2, rx, ry, angle, 0, sweep, x2old, y2old, f2, f2old, cx, cy)
+ end
+
+ local c1 = cos(f1)
+ local s1 = sin(f1)
+ local c2 = cos(f2)
+ local s2 = sin(f2)
+
+ local t = tan((f2 - f1) / 4)
+ local hx = 4 * rx * t / 3
+ local hy = 4 * ry * t / 3
+
+ local r = { x1 - hx * s1, y1 + hy * c1, x2 + hx * s2, y2 - hy * c2, x2, y2, unpack(res or { }) }
+
+ if not recursive then -- we can also check for sin/cos being 0/1
+ cosrad = cos(rad)
+ sinrad = sin(rad)
+ -- cosrad = cosd(angle)
+ -- sinrad = sind(angle)
+ for i0=1,#r,2 do
+ local i1 = i0 + 1
+ local x = r[i0]
+ local y = r[i1]
+ r[i0] = x * cosrad - y * sinrad
+ r[i1] = x * sinrad + y * cosrad
+ end
+ end
+
+ return r
+ end
+
+end
+
+-- We share some patterns.
+
+local p_digit = lpegpatterns.digit
+local p_hexdigit = lpegpatterns.hexdigit
+local p_space = lpegpatterns.whitespace
+
+local factors = {
+ ["pt"] = 1.25,
+ ["mm"] = 3.543307,
+ ["cm"] = 35.43307,
+ ["px"] = 1,
+ ["pc"] = 15,
+ ["in"] = 90,
+ ["em"] = 12 * 1.25,
+ ["ex"] = 8 * 1.25,
+}
+
+local percentage_r = 1/100
+local percentage_x = percentage_r
+local percentage_y = percentage_r
+
+-- incredible: we can find .123.456 => 0.123 0.456 ...
+
+local p_command_x = C(S("Hh"))
+local p_command_y = C(S("Vv"))
+local p_command_xy = C(S("CcLlMmQqSsTt"))
+local p_command_a = C(S("Aa"))
+local p_command = C(S("Zz"))
+
+local p_optseparator = S("\t\n\r ,")^0
+local p_separator = S("\t\n\r ,")^1
+local p_number = (S("+-")^0 * (p_digit^0 * P(".") * p_digit^1 + p_digit^1 * P(".") + p_digit^1))
+ * (P("e") * S("+-")^0 * p_digit^1)^-1
+
+local function convert (n) n = tonumber(n) return n end
+local function convert_r (n,u) n = tonumber(n) if u == true then return percentage_r * n elseif u then return u * n else return n end end
+local function convert_x (n,u) n = tonumber(n) if u == true then return percentage_x * n elseif u then return u * n else return n end end
+local function convert_y (n,u) n = tonumber(n) if u == true then return percentage_y * n elseif u then return u * n else return n end end
+local function convert_vx(n,u) n = tonumber(n) if u == true then return percentage_x * n elseif u then return u * n else return n end end
+local function convert_vy(n,u) n = - tonumber(n) if u == true then return percentage_y * n elseif u then return u * n else return n end end
+
+local p_unit = (P("p") * S("txc") + P("e") * S("xm") + S("mc") * P("m") + P("in")) / factors
+local p_percent = P("%") * Cc(true)
+
+local c_number_n = C(p_number)
+local c_number_u = C(p_number) * (p_unit + p_percent)^-1
+
+local p_number_n = c_number_n / convert
+local p_number_x = c_number_u / convert_x
+local p_number_vx = c_number_u / convert_vx
+local p_number_y = c_number_u / convert_y
+local p_number_vy = c_number_u / convert_vy
+local p_number_r = c_number_u / convert_r
+
+local function asnumber (s) return s and lpegmatch(p_number, s) or 0 end
+local function asnumber_r (s) return s and lpegmatch(p_number_r, s) or 0 end
+local function asnumber_x (s) return s and lpegmatch(p_number_x, s) or 0 end
+local function asnumber_y (s) return s and lpegmatch(p_number_y, s) or 0 end
+local function asnumber_vx(s) return s and lpegmatch(p_number_vx,s) or 0 end
+local function asnumber_vy(s) return s and lpegmatch(p_number_vy,s) or 0 end
+
+local p_number_vx_t = Ct { (p_number_vx + p_separator)^1 }
+local p_number_vy_t = Ct { (p_number_vy + p_separator)^1 }
+
+local zerotable = { 0 }
+
+local function asnumber_vx_t(s) return s and lpegmatch(p_number_vx_t,s) or zerotable end
+local function asnumber_vy_t(s) return s and lpegmatch(p_number_vy_t,s) or zerotable end
+
+local p_numbersep = p_number_n + p_separator
+local p_numbers = p_optseparator * P("(") * p_numbersep^0 * p_optseparator * P(")")
+local p_fournumbers = p_numbersep^4
+local p_path = Ct ( (
+ p_command_xy * (p_optseparator * p_number_vx *
+ p_optseparator * p_number_vy )^1
+ + p_command_x * (p_optseparator * p_number_vx )^1
+ + p_command_y * (p_optseparator * p_number_vy )^1
+ + p_command_a * (p_optseparator * p_number_vx *
+ p_optseparator * p_number_vy *
+ p_optseparator * p_number_r *
+ p_optseparator * p_number_n * -- flags
+ p_optseparator * p_number_n * -- flags
+ p_optseparator * p_number_vx *
+ p_optseparator * p_number_vy )^1
+ + p_command
+ + p_separator
+)^1 )
+
+-- We can actually use the svg color definitions from the tex end but maybe a user
+-- doesn't want those replace the normal definitions.
+--
+-- local hexhash = setmetatableindex(function(t,k) local v = lpegmatch(p_hexcolor, k) t[k] = v return v end) -- per file
+-- local hexhash3 = setmetatableindex(function(t,k) local v = lpegmatch(p_hexcolor3,k) t[k] = v return v end) -- per file
+--
+-- local function hexcolor (c) return hexhash [c] end -- directly do hexhash [c]
+-- local function hexcolor3(c) return hexhash3[c] end -- directly do hexhash3[c]
+
+local rgbcomponents, withcolor, thecolor do
+
+ local svgcolors = {
+ aliceblue = 0xF0F8FF, antiquewhite = 0xFAEBD7, aqua = 0x00FFFF, aquamarine = 0x7FFFD4,
+ azure = 0xF0FFFF, beige = 0xF5F5DC, bisque = 0xFFE4C4, black = 0x000000,
+ blanchedalmond = 0xFFEBCD, blue = 0x0000FF, blueviolet = 0x8A2BE2, brown = 0xA52A2A,
+ burlywood = 0xDEB887, cadetblue = 0x5F9EA0, hartreuse = 0x7FFF00, chocolate = 0xD2691E,
+ coral = 0xFF7F50, cornflowerblue = 0x6495ED, cornsilk = 0xFFF8DC, crimson = 0xDC143C,
+ cyan = 0x00FFFF, darkblue = 0x00008B, darkcyan = 0x008B8B, darkgoldenrod = 0xB8860B,
+ darkgray = 0xA9A9A9, darkgreen = 0x006400, darkgrey = 0xA9A9A9, darkkhaki = 0xBDB76B,
+ darkmagenta = 0x8B008B, darkolivegreen = 0x556B2F, darkorange = 0xFF8C00, darkorchid = 0x9932CC,
+ darkred = 0x8B0000, darksalmon = 0xE9967A, darkseagreen = 0x8FBC8F, darkslateblue = 0x483D8B,
+ darkslategray = 0x2F4F4F, darkslategrey = 0x2F4F4F, darkturquoise = 0x00CED1, darkviolet = 0x9400D3,
+ deeppink = 0xFF1493, deepskyblue = 0x00BFFF, dimgray = 0x696969, dimgrey = 0x696969,
+ dodgerblue = 0x1E90FF, firebrick = 0xB22222, floralwhite = 0xFFFAF0, forestgreen = 0x228B22,
+ fuchsia = 0xFF00FF, gainsboro = 0xDCDCDC, ghostwhite = 0xF8F8FF, gold = 0xFFD700,
+ goldenrod = 0xDAA520, gray = 0x808080, green = 0x008000, greenyellow = 0xADFF2F,
+ grey = 0x808080, honeydew = 0xF0FFF0, hotpink = 0xFF69B4, indianred = 0xCD5C5C,
+ indigo = 0x4B0082, ivory = 0xFFFFF0, khaki = 0xF0E68C, lavender = 0xE6E6FA,
+ lavenderblush = 0xFFF0F5, lawngreen = 0x7CFC00, lemonchiffon = 0xFFFACD, lightblue = 0xADD8E6,
+ lightcoral = 0xF08080, lightcyan = 0xE0FFFF, lightgoldenrodyellow = 0xFAFAD2, lightgray = 0xD3D3D3,
+ lightgreen = 0x90EE90, lightgrey = 0xD3D3D3, lightpink = 0xFFB6C1, lightsalmon = 0xFFA07A,
+ lightseagreen = 0x20B2AA, lightskyblue = 0x87CEFA, lightslategray = 0x778899, lightslategrey = 0x778899,
+ lightsteelblue = 0xB0C4DE, lightyellow = 0xFFFFE0, lime = 0x00FF00, limegreen = 0x32CD32,
+ linen = 0xFAF0E6, magenta = 0xFF00FF, maroon = 0x800000, mediumaquamarine = 0x66CDAA,
+ mediumblue = 0x0000CD, mediumorchid = 0xBA55D3, mediumpurple = 0x9370DB, mediumseagreen = 0x3CB371,
+ mediumslateblue = 0x7B68EE, mediumspringgreen = 0x00FA9A, mediumturquoise = 0x48D1CC, mediumvioletred = 0xC71585,
+ midnightblue = 0x191970, mintcream = 0xF5FFFA, mistyrose = 0xFFE4E1, moccasin = 0xFFE4B5,
+ navajowhite = 0xFFDEAD, navy = 0x000080, oldlace = 0xFDF5E6, olive = 0x808000,
+ olivedrab = 0x6B8E23, orange = 0xFFA500, orangered = 0xFF4500, orchid = 0xDA70D6,
+ palegoldenrod = 0xEEE8AA, palegreen = 0x98FB98, paleturquoise = 0xAFEEEE, palevioletred = 0xDB7093,
+ papayawhip = 0xFFEFD5, peachpuff = 0xFFDAB9, peru = 0xCD853F, pink = 0xFFC0CB,
+ plum = 0xDDA0DD, powderblue = 0xB0E0E6, purple = 0x800080, red = 0xFF0000,
+ rosybrown = 0xBC8F8F, royalblue = 0x4169E1, saddlebrown = 0x8B4513, salmon = 0xFA8072,
+ sandybrown = 0xF4A460, seagreen = 0x2E8B57, seashell = 0xFFF5EE, sienna = 0xA0522D,
+ silver = 0xC0C0C0, skyblue = 0x87CEEB, slateblue = 0x6A5ACD, slategray = 0x708090,
+ slategrey = 0x708090, snow = 0xFFFAFA, springgreen = 0x00FF7F, steelblue = 0x4682B4,
+ tan = 0xD2B48C, teal = 0x008080, thistle = 0xD8BFD8, tomato = 0xFF6347,
+ turquoise = 0x40E0D0, violet = 0xEE82EE, wheat = 0xF5DEB3, white = 0xFFFFFF,
+ whitesmoke = 0xF5F5F5, yellow = 0xFFFF00, yellowgreen = 0x9ACD32,
+ }
+
+ local f_rgb = formatters['withcolor svgcolor(%.3N,%.3N,%.3N)']
+ local f_gray = formatters['withcolor svggray(%.3N)']
+ local f_rgba = formatters['withcolor svgcolor(%.3N,%.3N,%.3N) withtransparency (1,%.3N)']
+ local f_graya = formatters['withcolor svggray(%.3N) withtransparency (1,%.3N)']
+ local f_name = formatters['withcolor "%s"']
+ local f_svgcolor = formatters['svgcolor(%.3N,%.3N,%.3N)']
+ local f_svggray = formatters['svggray(%.3N)']
+ local f_svgname = formatters['"%s"']
+
+ local extract = bit32.extract
+
+ local triplets = setmetatableindex(function(t,k)
+ -- we delay building all these strings
+ local v = svgcolors[k]
+ if v then
+ v = { extract(v,16,8)/255, extract(v,8,8)/255, extract(v,0,8)/255 }
+ else
+ v = false
+ end
+ t[k] = v
+ return v
+ end)
+
+ local p_fraction = C(p_number) * C("%")^-1 / function(a,b)
+ a = tonumber(a) return a / (b and 100 or 255)
+ end
+ local p_hexcolor = P("#") * C(p_hexdigit*p_hexdigit)^1 / function(r,g,b)
+ return r and tonumber(r,16)/255 or nil, g and tonumber(g,16)/255 or nil, b and tonumber(b,16)/255 or nil
+ end
+ local p_rgbacolor = P("rgb") * (P("a")^-1) * P("(") * (p_fraction + p_separator)^1 * P(")")
+
+ rgbcomponents = function(color)
+ local h = lpegmatch(p_hexcolor,color)
+ if h then
+ return h
+ end
+ local r, g, b, a = lpegmatch(p_rgbacolor,color)
+ if r then
+ return r, g or r, b or r
+ end
+ local t = triplets[color]
+ return t[1], t[2], t[3]
+
+ end
+
+ withcolor = function(color)
+ local r, g, b = lpegmatch(p_hexcolor,color)
+ if b and not (r == g and g == b) then
+ return f_rgb(r,g,b)
+ elseif r then
+ return f_gray(r)
+ end
+ local r, g, b, a = lpegmatch(p_rgbacolor,color)
+ if a then
+ if a == 1 then
+ if r == g and g == b then
+ return f_gray(r)
+ else
+ return f_rgb(r,g,b)
+ end
+ else
+ if r == g and g == b then
+ return f_graya(r,a)
+ else
+ return f_rgba(r,g,b,a)
+ end
+ end
+ end
+ if not r then
+ local t = triplets[color]
+ if t then
+ r, g, b = t[1], t[2], t[3]
+ end
+ end
+ if r then
+ if r == g and g == b then
+ return f_gray(r)
+ elseif g and b then
+ return f_rgb(r,g,b)
+ else
+ return f_gray(r)
+ end
+ end
+ return f_name(color)
+ end
+
+ thecolor = function(color)
+ local h = lpegmatch(p_hexcolor,color)
+ if h then
+ return h
+ end
+ local r, g, b, a = lpegmatch(p_rgbacolor,color)
+ if not r then
+ local t = triplets[color]
+ if t then
+ r, g, b = t[1], t[2], t[3]
+ end
+ end
+ if r then
+ if r == g and g == b then
+ return f_svggray(r)
+ elseif g and b then
+ return f_svgcolor(r,g,b)
+ else
+ return f_svggray(r)
+ end
+ end
+ return f_svgname(color)
+ end
+
+end
+
+-- actually we can loop faster because we can go to the last one
+
+local grabpath, grablist do
+
+ local f_moveto = formatters['(%N,%N)']
+ local f_curveto_z = formatters['controls(%N,%N)and(%N,%N)..(%N,%N)']
+ local f_curveto_n = formatters['..controls(%N,%N)and(%N,%N)..(%N,%N)']
+ local f_lineto_z = formatters['(%N,%N)']
+ local f_lineto_n = formatters['--(%N,%N)']
+
+ local m = { __index = function() return 0 end }
+
+ grabpath = function(str)
+ local p = lpegmatch(p_path,str) or { }
+ local np = #p
+ local all = { entries = np, closed = false, curve = false }
+ if np == 0 then
+ return all
+ end
+ setmetatable(p,m)
+ local t = { } -- no real saving here if we share
+ local n = 0
+ local a = 0
+ local i = 0
+ local last = "M"
+ local prev = last
+ local kind = "L"
+ local x, y = 0, 0
+ local x1, y1 = 0, 0
+ local x2, y2 = 0, 0
+ local rx, ry = 0, 0
+ local ar, al = 0, 0
+ local as, ac = 0, nil
+ local mx, my = 0, 0
+ while i < np do
+ i = i + 1
+ local pi = p[i]
+ if type(pi) ~= "number" then
+ last = pi
+ i = i + 1
+ pi = p[i]
+ end
+ -- most often
+ if last == "c" then
+ x1 = x + pi
+ i = i + 1 ; y1 = y + p[i]
+ i = i + 1 ; x2 = x + p[i]
+ i = i + 1 ; y2 = y + p[i]
+ i = i + 1 ; x = x + p[i]
+ i = i + 1 ; y = y + p[i]
+ goto curveto
+ elseif last == "l" then
+ x = x + pi
+ i = i + 1 ; y = y + p[i]
+ goto lineto
+ elseif last == "h" then
+ x = x + pi
+ goto lineto
+ elseif last == "v" then
+ y = y + pi
+ goto lineto
+ elseif last == "a" then
+ x1 = x
+ y1 = y
+ rx = pi
+ i = i + 1 ; ry = p[i]
+ i = i + 1 ; ar = p[i]
+ i = i + 1 ; al = p[i]
+ i = i + 1 ; as = p[i]
+ i = i + 1 ; x = x + p[i]
+ i = i + 1 ; y = y + p[i]
+ goto arc
+ elseif last == "s" then
+ if prev == "C" then
+ x1 = 2 * x - x2
+ y1 = 2 * y - y2
+ else
+ x1 = x
+ y1 = y
+ end
+ x2 = x + pi
+ i = i + 1 ; y2 = y + p[i]
+ i = i + 1 ; x = x + p[i]
+ i = i + 1 ; y = y + p[i]
+ goto curveto
+ elseif last == "m" then
+ if n > 0 then
+ a = a + 1 ; all[a] = concat(t,"",1,n) ; n = 0
+ end
+ x = x + pi
+ i = i + 1 ; y = y + p[i]
+ goto moveto
+ elseif last == "z" then
+ goto close
+ -- less frequent
+ elseif last == "C" then
+ x1 = pi
+ i = i + 1 ; y1 = p[i]
+ i = i + 1 ; x2 = p[i]
+ i = i + 1 ; y2 = p[i]
+ i = i + 1 ; x = p[i]
+ i = i + 1 ; y = p[i]
+ goto curveto
+ elseif last == "L" then
+ x = pi
+ i = i + 1 ; y = p[i]
+ goto lineto
+ elseif last == "H" then
+ x = pi
+ goto lineto
+ elseif last == "V" then
+ y = pi
+ goto lineto
+ elseif last == "A" then
+ x1 = x
+ y1 = y
+ rx = pi
+ i = i + 1 ; ry = p[i]
+ i = i + 1 ; ar = p[i]
+ i = i + 1 ; al = p[i]
+ i = i + 1 ; as = p[i]
+ i = i + 1 ; x = p[i]
+ i = i + 1 ; y = p[i]
+ goto arc
+ elseif last == "S" then
+ if prev == "C" then
+ x1 = 2 * x - x2
+ y1 = 2 * y - y2
+ else
+ x1 = x
+ y1 = y
+ end
+ x2 = pi
+ i = i + 1 ; y2 = p[i]
+ i = i + 1 ; x = p[i]
+ i = i + 1 ; y = p[i]
+ goto curveto
+ elseif last == "M" then
+ if n > 0 then
+ a = a + 1 ; all[a] = concat(t,"",1,n) ; n = 0
+ end
+ x = pi ;
+ i = i + 1 ; y = p[i]
+ goto moveto
+ elseif last == "Z" then
+ goto close
+ -- very seldom
+ elseif last == "q" then
+ x1 = x + pi
+ i = i + 1 ; y1 = y + p[i]
+ i = i + 1 ; x2 = x + p[i]
+ i = i + 1 ; y2 = y + p[i]
+ goto quadratic
+ elseif last == "t" then
+ if prev == "C" then
+ x1 = 2 * x - x1
+ y1 = 2 * y - y1
+ else
+ x1 = x
+ y1 = y
+ end
+ x2 = x + pi
+ i = i + 1 ; y2 = y + p[i]
+ goto quadratic
+ elseif last == "Q" then
+ x1 = pi
+ i = i + 1 ; y1 = p[i]
+ i = i + 1 ; x2 = p[i]
+ i = i + 1 ; y2 = p[i]
+ goto quadratic
+ elseif last == "T" then
+ if prev == "C" then
+ x1 = 2 * x - x1
+ y1 = 2 * y - y1
+ else
+ x1 = x
+ y1 = y
+ end
+ x2 = pi
+ i = i + 1 ; y2 = p[i]
+ goto quadratic
+ else
+ goto continue
+ end
+ ::moveto::
+ n = n + 1 ; t[n] = f_moveto(x,y)
+ last = last == "M" and "L" or "l"
+ prev = "M"
+ mx = x
+ my = y
+ goto continue
+ ::lineto::
+ n = n + 1 ; t[n] = (n > 0 and f_lineto_n or f_lineto_z)(x,y)
+ prev = "L"
+ goto continue
+ ::curveto::
+ n = n + 1 ; t[n] = (n > 0 and f_curveto_n or f_curveto_z)(x1,y1,x2,y2,x,y)
+ prev = "C"
+ goto continue
+ ::arc::
+ ac = a2c(x1,y1,rx,ry,ar,al,as,x,y)
+ for i=1,#ac,6 do
+ n = n + 1 ; t[n] = (n > 0 and f_curveto_n or f_curveto_z)(
+ ac[i],ac[i+1],ac[i+2],ac[i+3],ac[i+4],ac[i+5]
+ )
+ end
+ prev = "A"
+ goto continue
+ ::quadratic::
+ n = n + 1 ; t[n] = (n > 0 and f_curveto_n or f_curveto_z)(
+ x + 2/3 * (x1-x ), y + 2/3 * (y1-y ),
+ x2 + 2/3 * (x1-x2), y2 + 2/3 * (y1-y2),
+ x2, y2
+ )
+ x = x2
+ y = y2
+ prev = "C"
+ goto continue
+ ::close::
+ -- n = n + 1 ; t[n] = prev == "C" and "..cycle" or "--cycle"
+ n = n + 1 ; t[n] = "--cycle"
+ if n > 0 then
+ a = a + 1 ; all[a] = concat(t,"",1,n) ; n = 0
+ end
+ if i == np then
+ break
+ else
+ i = i - 1
+ end
+ kind = prev
+ prev = "Z"
+ -- this is kind of undocumented: a close also moves back
+ x = mx
+ y = my
+ ::continue::
+ end
+ if n > 0 then
+ a = a + 1 ; all[a] = concat(t,"",1,n) ; n = 0
+ end
+ if prev == "Z" then
+ all.closed = true
+ end
+ all.curve = (kind == "C" or kind == "A")
+ return all, p
+ end
+
+ -- this is a bit tricky as what are points for a mark ... the next can be simplified
+ -- a lot
+
+ grablist = function(p)
+ local np = #p
+ if np == 0 then
+ return nil
+ end
+ local t = { }
+ local n = 0
+ local a = 0
+ local i = 0
+ local last = "M"
+ local prev = last
+ local kind = "L"
+ local x, y = 0, 0
+ local x1, y1 = 0, 0
+ local x2, y2 = 0, 0
+ local rx, ry = 0, 0
+ local ar, al = 0, 0
+ local as, ac = 0, nil
+ local mx, my = 0, 0
+ while i < np do
+ i = i + 1
+ local pi = p[i]
+ if type(pi) ~= "number" then
+ last = pi
+ i = i + 1
+ pi = p[i]
+ end
+ -- most often
+ if last == "c" then
+ x1 = x + pi
+ i = i + 1 ; y1 = y + p[i]
+ i = i + 1 ; x2 = x + p[i]
+ i = i + 1 ; y2 = y + p[i]
+ i = i + 1 ; x = x + p[i]
+ i = i + 1 ; y = y + p[i]
+ goto curveto
+ elseif last == "l" then
+ x = x + pi
+ i = i + 1 ; y = y + p[i]
+ goto lineto
+ elseif last == "h" then
+ x = x + pi
+ goto lineto
+ elseif last == "v" then
+ y = y + pi
+ goto lineto
+ elseif last == "a" then
+ x1 = x
+ y1 = y
+ rx = pi
+ i = i + 1 ; ry = p[i]
+ i = i + 1 ; ar = p[i]
+ i = i + 1 ; al = p[i]
+ i = i + 1 ; as = p[i]
+ i = i + 1 ; x = x + p[i]
+ i = i + 1 ; y = y + p[i]
+ goto arc
+ elseif last == "s" then
+ if prev == "C" then
+ x1 = 2 * x - x2
+ y1 = 2 * y - y2
+ else
+ x1 = x
+ y1 = y
+ end
+ x2 = x + pi
+ i = i + 1 ; y2 = y + p[i]
+ i = i + 1 ; x = x + p[i]
+ i = i + 1 ; y = y + p[i]
+ goto curveto
+ elseif last == "m" then
+ x = x + pi
+ i = i + 1 ; y = y + p[i]
+ goto moveto
+ elseif last == "z" then
+ goto close
+ -- less frequent
+ elseif last == "C" then
+ x1 = pi
+ i = i + 1 ; y1 = p[i]
+ i = i + 1 ; x2 = p[i]
+ i = i + 1 ; y2 = p[i]
+ i = i + 1 ; x = p[i]
+ i = i + 1 ; y = p[i]
+ goto curveto
+ elseif last == "L" then
+ x = pi
+ i = i + 1 ; y = p[i]
+ goto lineto
+ elseif last == "H" then
+ x = pi
+ goto lineto
+ elseif last == "V" then
+ y = pi
+ goto lineto
+ elseif last == "A" then
+ x1 = x
+ y1 = y
+ rx = pi
+ i = i + 1 ; ry = p[i]
+ i = i + 1 ; ar = p[i]
+ i = i + 1 ; al = p[i]
+ i = i + 1 ; as = p[i]
+ i = i + 1 ; x = p[i]
+ i = i + 1 ; y = p[i]
+ goto arc
+ elseif last == "S" then
+ if prev == "C" then
+ x1 = 2 * x - x2
+ y1 = 2 * y - y2
+ else
+ x1 = x
+ y1 = y
+ end
+ x2 = pi
+ i = i + 1 ; y2 = p[i]
+ i = i + 1 ; x = p[i]
+ i = i + 1 ; y = p[i]
+ goto curveto
+ elseif last == "M" then
+ x = pi ;
+ i = i + 1 ; y = p[i]
+ goto moveto
+ elseif last == "Z" then
+ goto close
+ -- very seldom
+ elseif last == "q" then
+ x1 = x + pi
+ i = i + 1 ; y1 = y + p[i]
+ i = i + 1 ; x2 = x + p[i]
+ i = i + 1 ; y2 = y + p[i]
+ goto quadratic
+ elseif last == "t" then
+ if prev == "C" then
+ x1 = 2 * x - x1
+ y1 = 2 * y - y1
+ else
+ x1 = x
+ y1 = y
+ end
+ x2 = x + pi
+ i = i + 1 ; y2 = y + p[i]
+ goto quadratic
+ elseif last == "Q" then
+ x1 = pi
+ i = i + 1 ; y1 = p[i]
+ i = i + 1 ; x2 = p[i]
+ i = i + 1 ; y2 = p[i]
+ goto quadratic
+ elseif last == "T" then
+ if prev == "C" then
+ x1 = 2 * x - x1
+ y1 = 2 * y - y1
+ else
+ x1 = x
+ y1 = y
+ end
+ x2 = pi
+ i = i + 1 ; y2 = p[i]
+ goto quadratic
+ else
+ goto continue
+ end
+ ::moveto::
+ n = n + 1 ; t[n] = x
+ n = n + 1 ; t[n] = y
+ last = last == "M" and "L" or "l"
+ prev = "M"
+ mx = x
+ my = y
+ goto continue
+ ::lineto::
+ n = n + 1 ; t[n] = x
+ n = n + 1 ; t[n] = y
+ prev = "L"
+ goto continue
+ ::curveto::
+ n = n + 1 ; t[n] = x
+ n = n + 1 ; t[n] = y
+ prev = "C"
+ goto continue
+ ::arc::
+ ac = a2c(x1,y1,rx,ry,ar,al,as,x,y)
+ for i=1,#ac,6 do
+ n = n + 1 ; t[n] = ac[i+4]
+ n = n + 1 ; t[n] = ac[i+5]
+ end
+ prev = "A"
+ goto continue
+ ::quadratic::
+ n = n + 1 ; t[n] = x2
+ n = n + 1 ; t[n] = y2
+ x = x2
+ y = y2
+ prev = "C"
+ goto continue
+ ::close::
+ n = n + 1 ; t[n] = mx
+ n = n + 1 ; t[n] = my
+ if i == np then
+ break
+ end
+ kind = prev
+ prev = "Z"
+ x = mx
+ y = my
+ ::continue::
+ end
+ return t
+ end
+
+end
+
+-- todo: viewbox helper
+
+local s_wrapped_start = "draw image ("
+local f_wrapped_stop = formatters[") shifted (0,%N) scaled %N ;"]
+
+local handletransform, handleviewbox do
+
+ local sind = math.sind
+
+ --todo: better lpeg
+
+ local f_rotatedaround = formatters[" rotatedaround((%N,%N),%N)"]
+ local f_rotated = formatters[" rotated(%N)"]
+ local f_shifted = formatters[" shifted(%N,%N)"]
+ local f_slanted_x = formatters[" xslanted(%N)"]
+ local f_slanted_y = formatters[" yslanted(%N)"]
+ local f_scaled = formatters[" scaled(%N)"]
+ local f_xyscaled = formatters[" xyscaled(%N,%N)"]
+ local f_matrix = formatters[" transformed bymatrix(%N,%N,%N,%N,%N,%N)"]
+
+ local s_transform_start = "draw image ( "
+ local f_transform_stop = formatters[")%s ;"]
+
+ local function rotate(r,x,y)
+ if x then
+ return r and f_rotatedaround(x,-(y or x),-r)
+ elseif r then
+ return f_rotated(-r)
+ else
+ return ""
+ end
+ end
+
+ local function translate(x,y)
+ if y then
+ return f_shifted(x,-y)
+ elseif x then
+ return f_shifted(x,0)
+ else
+ return ""
+ end
+ end
+
+ local function scale(x,y)
+ if y then
+ return f_xyscaled(x,y)
+ elseif x then
+ return f_scaled(x)
+ else
+ return ""
+ end
+ end
+
+ local function skewx(x)
+ if x then
+ return f_slanted_x(sind(-x))
+ else
+ return ""
+ end
+ end
+
+ local function skewy(y)
+ if y then
+ return f_slanted_y(sind(-y))
+ else
+ return ""
+ end
+ end
+
+ local function matrix(rx,sx,sy,ry,tx,ty)
+ return f_matrix(rx or 1, sx or 0, sy or 0, ry or 1, tx or 0, - (ty or 0))
+ end
+
+ -- How to deal with units here? Anyway, order seems to matter.
+
+ local p_transform = Cf ( Ct("") * (
+ lpegpatterns.whitespace^0 * Cg(
+ C("translate") * (p_numbers / translate) -- maybe xy
+ + C("scale") * (p_numbers / scale)
+ + C("rotate") * (p_numbers / rotate)
+ + C("matrix") * (p_numbers / matrix)
+ + C("skewX") * (p_numbers / skewx)
+ + C("skewY") * (p_numbers / skewy)
+ )
+ )^1, rawset)
+
+ handletransform = function(at)
+ local t = at.transform
+ if t then
+ local e = lpegmatch(p_transform,t)
+ if e then
+ e = concat({
+ e.rotate or "",
+ e.skewX or "",
+ e.skewY or "",
+ e.scale or "",
+ e.translate or "",
+ e.matrix or "",
+ }, " ")
+ return s_transform_start, f_transform_stop(e), t
+ end
+ end
+ end
+
+ handleviewbox = function(v)
+ if v then
+ local x, y, w, h = lpegmatch(p_fournumbers,v)
+ if h then
+ return x, y, w, h
+ end
+ end
+ end
+
+end
+
+local dashed do
+
+ -- actually commas are mandate but we're tolerant
+
+ local f_dashed_n = formatters[" dashed dashpattern (%s ) "]
+ local f_dashed_y = formatters[" dashed dashpattern (%s ) shifted (%N,0) "]
+
+ local p_number = p_optseparator/"" * p_number_r
+ local p_on = Cc(" on ") * p_number
+ local p_off = Cc(" off ") * p_number
+ local p_dashed = Cs((p_on * p_off^-1)^1)
+
+ dashed = function(s,o)
+ if not find(s,",") then
+ -- a bit of a hack:
+ s = s .. " " .. s
+ end
+ return (o and f_dashed_y or f_dashed_n)(lpegmatch(p_dashed,s),o)
+ end
+
+end
+
+do
+
+ local handlers = { }
+ local process = false
+ local root = false
+ local result = false
+ local r = false
+ local definitions = false
+ local classstyles = false
+ local tagstyles = false
+
+ local tags = {
+ ["a"] = true,
+ -- ["altgGlyph"] = true,
+ -- ["altgGlyphDef"] = true,
+ -- ["altgGlyphItem"] = true,
+ -- ["animate"] = true,
+ -- ["animateColor"] = true,
+ -- ["animateMotion"] = true,
+ -- ["animateTransform"] = true,
+ ["circle"] = true,
+ ["clipPath"] = true,
+ -- ["color-profile"] = true,
+ -- ["cursor"] = true,
+ ["defs"] = true,
+ -- ["desc"] = true,
+ ["ellipse"] = true,
+ -- ["filter"] = true,
+ -- ["font"] = true,
+ -- ["font-face"] = true,
+ -- ["font-face-format"] = true,
+ -- ["font-face-name"] = true,
+ -- ["font-face-src"] = true,
+ -- ["font-face-uri"] = true,
+ -- ["foreignObject"] = true,
+ ["g"] = true,
+ -- ["glyph"] = true,
+ -- ["glyphRef"] = true,
+ -- ["hkern"] = true,
+ ["image"] = true,
+ ["line"] = true,
+ ["linearGradient"] = true,
+ ["marker"] = true,
+ -- ["mask"] = true,
+ -- ["metadata"] = true,
+ -- ["missing-glyph"] = true,
+ -- ["mpath"] = true,
+ ["path"] = true,
+ -- ["pattern"] = true,
+ ["polygon"] = true,
+ ["polyline"] = true,
+ ["radialGradient"] = true,
+ ["rect"] = true,
+ -- ["script"] = true,
+ -- ["set"] = true,
+ ["stop"] = true,
+ ["style"] = true,
+ ["svg"] = true,
+ -- ["switch"] = true,
+ ["symbol"] = true,
+ ["text"] = true,
+ -- ["textPath"] = true,
+ -- ["title"] = true,
+ ["tspan"] = true,
+ ["use"] = true,
+ -- ["view"] = true,
+ -- ["vkern"] = true,
+ }
+
+ local function handlechains(c)
+ if tags[c.tg] then
+ local at = c.at
+ local dt = c.dt
+ if at and dt then
+ -- at["inkscape:connector-curvature"] = nil -- cleare entry and might prevent table growth
+ local estyle = rawget(at,"style")
+ if estyle and estyle ~= "" then
+ for k, v in gmatch(estyle,"%s*([^:]+):%s*([^;]+);?") do
+ at[k] = v
+ end
+ end
+ local eclass = rawget(at,"class")
+ if eclass and eclass ~= "" then
+ for c in gmatch(eclass,"[^ ]+") do
+ local s = classstyles[c]
+ if s then
+ for k, v in next, s do
+ at[k] = v
+ end
+ end
+ end
+ end
+ local tstyle = tagstyles[tag]
+ if tstyle then
+ for k, v in next, tstyle do
+ at[k] = v
+ end
+ end
+ if trace_path and pathtracer then
+ for k, v in next, pathtracer do
+ at[k] = v
+ end
+ end
+ for i=1,#dt do
+ local dti = dt[i]
+ if type(dti) == "table" then
+ handlechains(dti)
+ end
+ end
+ end
+ end
+ end
+
+ local handlestyle do
+
+ -- It can also be CDATA but that is probably dealt with because we only
+ -- check for style entries and ignore the rest. But maybe we also need
+ -- to check a style at the outer level?
+
+ local p_key = C((R("az","AZ","09","__","--")^1))
+ local p_spec = P("{") * C((1-P("}"))^1) * P("}")
+ local p_valid = Carg(1) * P(".") * p_key + Carg(2) * p_key
+ local p_grab = ((p_valid * p_space^0 * p_spec / rawset) + p_space^1 + P(1))^1
+
+ local fontspecification = css.fontspecification
+
+ handlestyle = function(c)
+ local s = xmltext(c)
+ lpegmatch(p_grab,s,1,classstyles,tagstyles)
+ for k, v in next, classstyles do
+ local t = { }
+ for k, v in gmatch(v,"%s*([^:]+):%s*([^;]+);?") do
+ if k == "font" then
+ local s = fontspecification(v)
+ for k, v in next, s do
+ t["font-"..k] = v
+ end
+ else
+ t[k] = v
+ end
+ end
+ classstyles[k] = t
+ end
+ for k, v in next, tagstyles do
+ local t = { }
+ for k, v in gmatch(v,"%s*([^:]+):%s*([^;]+);?") do
+ if k == "font" then
+ local s = fontspecification(v)
+ for k, v in next, s do
+ t["font-"..k] = v
+ end
+ else
+ t[k] = v
+ end
+ end
+ tagstyles[k] = t
+ end
+ end
+
+ function handlers.style()
+ -- ignore
+ end
+
+ end
+
+ -- We can have root in definitions and then do a metatable lookup but use
+ -- is not used that often I guess.
+
+ local function locate(id)
+ local res = definitions[id]
+ if res then
+ return res
+ end
+ local ref = gsub(id,"^url%(#(.-)%)$","%1")
+ local ref = gsub(ref,"^#","")
+ -- we can make a fast id lookup
+ local res = xmlfirst(root,"**[@id='"..ref.."']")
+ if res then
+ definitions[id] = res
+ end
+ return res
+ end
+
+ -- also locate
+
+ local function handleclippath(at)
+ local clippath = at["clip-path"]
+
+ if not clippath then
+ return
+ end
+
+ local spec = definitions[clippath] or locate(clippath)
+
+ -- do we really need thsi crap
+ if not spec then
+ local index = match(clippath,"(%d+)")
+ if index then
+ spec = xmlfirst(root,"clipPath["..tostring(tonumber(index) or 0).."]")
+ end
+ end
+ -- so far for the crap
+
+ if not spec then
+ report("unknown clip %a",clippath)
+ return
+ elseif spec.tg ~= "clipPath" then
+ report("bad clip %a",clippath)
+ return
+ end
+
+ ::again::
+ for c in xmlcollected(spec,"/(path|use|g)") do
+ local tg = c.tg
+ if tg == "use" then
+ local ca = c.at
+ local id = ca["xlink:href"]
+ if id then
+ spec = locate(id)
+ if spec then
+ local sa = spec.at
+ setmetatableindex(sa,ca)
+ if spec.tg == "path" then
+ local d = sa.d
+ if d then
+ local p = grabpath(d)
+ p.evenodd = sa["clip-rule"] == "evenodd"
+ p.close = true
+ return p, clippath
+ else
+ return
+ end
+ else
+ goto again
+ end
+ end
+ end
+ -- break
+ elseif tg == "path" then
+ local ca = c.at
+ local d = ca.d
+ if d then
+ local p = grabpath(d)
+ p.evenodd = ca["clip-rule"] == "evenodd"
+ p.close = true
+ return p, clippath
+ else
+ return
+ end
+ else
+ -- inherit?
+ end
+ end
+ end
+
+ local s_shade_linear = ' withshademethod "linear" '
+ local s_shade_circular = ' withshademethod "circular" '
+ local f_shade_step = formatters['withshadestep ( withshadefraction %N withshadecolors(%s,%s) )']
+ local f_shade_one = formatters['withprescript "sh_center_a=%N %N"']
+ local f_shade_two = formatters['withprescript "sh_center_b=%N %N"']
+
+ local f_color = formatters['withcolor "%s"']
+ local f_opacity = formatters['withtransparency (1,%N)']
+ local f_pen = formatters['withpen pencircle scaled %N']
+
+ -- todo: gradient unfinished
+ -- todo: opacity but first we need groups in mp
+
+ local function gradient(id)
+ local spec = definitions[id] -- no locate !
+ if spec then
+ local kind = spec.tg
+ local shade = nil
+ local n = 1
+ local a = spec.at
+ if kind == "linearGradient" then
+ shade = { s_shade_linear }
+ --
+ local x1 = rawget(a,"x1")
+ local y1 = rawget(a,"y1")
+ local x2 = rawget(a,"x2")
+ local y2 = rawget(a,"y2")
+ if x1 and y1 then
+ n = n + 1 ; shade[n] = f_shade_one(asnumber_vx(x1),asnumber_vy(y1))
+ end
+ if x2 and y2 then
+ n = n + 1 ; shade[n] = f_shade_one(asnumber_vx(x2),asnumber_vy(y2))
+ end
+ --
+ elseif kind == "radialGradient" then
+ shade = { s_shade_circular }
+ --
+ local cx = rawget(a,"cx") -- x center
+ local cy = rawget(a,"cy") -- y center
+ local r = rawget(a,"r" ) -- radius
+ local fx = rawget(a,"fx") -- focal points
+ local fy = rawget(a,"fy") -- focal points
+ --
+ if cx and cy then
+ -- todo
+ end
+ if r then
+ -- todo
+ end
+ if fx and fy then
+ -- todo
+ end
+ else
+ report("unknown gradient %a",id)
+ return
+ end
+ -- local gu = a.gradientUnits
+ -- local gt = a.gradientTransform
+ -- local sm = a.spreadMethod
+ local colora, colorb
+ -- startcolor ?
+ for c in xmlcollected(spec,"/stop") do
+ local a = c.at
+ local offset = rawget(a,"offset")
+ local colorb = rawget(a,"stop-color")
+ local opacity = rawget(a,"stop-opacity")
+ if colorb then
+ colorb = thecolor(colorb)
+ end
+ if not colora then
+ colora = colorb
+ end
+ -- what if no percentage
+
+ local fraction = offset and asnumber_r(offset)
+ if not fraction then
+ -- offset = tonumber(offset)
+ -- for now
+ fraction = xmlcount(spec,"/stop")/100
+ end
+
+ if colora and colorb and color_a ~= "" and color_b ~= "" then
+ n = n + 1 ; shade[n] = f_shade_step(fraction,colora,colorb)
+ end
+
+ colora = colorb
+ end
+ return concat(shade," ")
+ end
+ end
+
+ local function drawproperties(stroke,at,opacity)
+ local p = at["stroke-width"]
+ if p then
+ p = f_pen(asnumber_r(p))
+ end
+ local d = at["stroke-dasharray"]
+ if d == "none" then
+ d = nil
+ elseif d then
+ local o = at["stroke-dashoffset"]
+ if o and o ~= "none" then
+ o = asnumber_r(o)
+ else
+ o = false
+ end
+ d = dashed(d,o)
+ end
+ local c = withcolor(stroke)
+ local o = at["stroke-opacity"] or (opacity and at["opacity"])
+ if o == "none" then
+ o = nil
+ elseif o then
+ o = asnumber_r(o)
+ if o and o ~= 1 then
+ o = f_opacity(o)
+ else
+ o = nil
+ end
+ end
+ return p, d, c, o
+ end
+
+ local s_opacity_start = "draw image ("
+ local f_opacity_stop = formatters["setgroup currentpicture to boundingbox currentpicture withtransparency (1,%N)) ;"]
+
+ local function sharedopacity(at)
+ local o = at["opacity"]
+ if o and o ~= "none" then
+ o = asnumber_r(o)
+ if o and o ~= 1 then
+ return s_opacity_start, f_opacity_stop(o)
+ end
+ end
+ end
+
+ local function fillproperties(fill,at,opacity)
+ local c = c ~= "none" and (gradient(fill) or withcolor(fill)) or nil
+ local o = at["fill-opacity"] or (opacity and at["opacity"])
+ if o and o ~= "none" then
+ o = asnumber_r(o)
+ if o == 1 then
+ return c
+ elseif o then
+ return c, f_opacity(o), o == 0
+ end
+ end
+ return c
+ end
+
+ -- todo: clip = [ auto | rect(llx,lly,urx,ury) ]
+
+ local s_offset_start = "draw image ( "
+ local f_offset_stop = formatters[") shifted (%N,%N) ;"]
+ local s_rotation_start = "draw image ( "
+ local f_rotation_stop = formatters[") rotatedaround((0,0),-angle((%N,%N))) ;"]
+ local f_rotation_angle = formatters[") rotatedaround((0,0),-%N) ;"]
+
+ local function offset(at)
+ local x = asnumber_vx(rawget(at,"x"))
+ local y = asnumber_vy(rawget(at,"y"))
+ if x ~= 0 or y ~= 0 then
+ return s_offset_start, f_offset_stop(x,y)
+ end
+ end
+
+ local s_viewport_start = "draw image ("
+ local s_viewport_stop = ") ;"
+ local f_viewport_shift = formatters["currentpicture := currentpicture shifted (%03N,%03N);"]
+ local f_viewport_scale = formatters["currentpicture := currentpicture xysized (%03N,%03N);"]
+ local f_viewport_clip = formatters["clip currentpicture to (unitsquare xyscaled (%03N,%03N));"]
+
+ local function viewport(x,y,w,h,noclip,scale)
+ r = r + 1 ; result[r] = s_viewport_start
+ return function()
+ local okay = w ~= 0 and h ~= 0
+ if okay and scale then
+ r = r + 1 ; result[r] = f_viewport_scale(w,h)
+ end
+ if x ~= 0 or y ~= 0 then
+ r = r + 1 ; result[r] = f_viewport_shift(-x,y)
+ end
+ if okay and not noclip then
+ r = r + 1 ; result[r] = f_viewport_clip(w,-h)
+ end
+
+ r = r + 1 ; result[r] = s_viewport_stop
+ end
+ end
+
+ -- maybe forget about defs and just always locate (and then backtrack
+ -- over <g> if needed)
+
+ function handlers.defs(c)
+ for c in xmlcollected(c,"/*") do
+ local a = c.at
+ if a then
+ local id = rawget(a,"id")
+ if id then
+ definitions["#" .. id ] = c
+ definitions["url(#" .. id .. ")"] = c
+ end
+ end
+ end
+ end
+
+ function handlers.symbol(c)
+ if uselevel == 0 then
+ local id = rawget(c.at,"id")
+ if id then
+ definitions["#" .. id ] = c
+ definitions["url(#" .. id .. ")"] = c
+ end
+ else
+ handlers.g(c)
+ end
+ end
+
+ local uselevel = 0
+
+ function handlers.use(c)
+ local at = c.at
+ local id = rawget(at,"href") or rawget(at,"xlink:href") -- better a rawget
+ local res = locate(id)
+ if res then
+ -- width height ?
+ uselevel = uselevel + 1
+ local boffset, eoffset = offset(at)
+ local btransform, etransform, transform = handletransform(at)
+
+ if boffset then
+ r = r + 1 result[r] = boffset
+ end
+
+ -- local clippath = at.clippath
+
+ if btransform then
+ r = r + 1 result[r] = btransform
+ end
+
+ local _transform = transform
+ local _clippath = clippath
+ at["transform"] = false
+ -- at["clip-path"] = false
+
+ process(res,"/*")
+
+ at["transform"] = _transform
+ -- at["clip-path"] = _clippath
+
+ if etransform then
+ r = r + 1 ; result[r] = etransform
+ end
+
+ if eoffset then
+ r = r + 1 result[r] = eoffset
+ end
+
+ uselevel = uselevel - 1
+ else
+ report("use: unknown definition %a",id)
+ end
+ end
+
+ local f_no_draw = formatters['nodraw (%s)']
+ local f_do_draw = formatters['draw (%s)']
+ local f_no_fill_c = formatters['nofill (%s..cycle)']
+ local f_do_fill_c = formatters['fill (%s..cycle)']
+ local f_eo_fill_c = formatters['eofill (%s..cycle)']
+ local f_no_fill_l = formatters['nofill (%s--cycle)']
+ local f_do_fill_l = formatters['fill (%s--cycle)']
+ local f_eo_fill_l = formatters['eofill (%s--cycle)']
+ local f_do_fill = f_do_fill_c
+ local f_eo_fill = f_eo_fill_c
+ local f_no_fill = f_no_fill_c
+ local s_clip_start = 'draw image ('
+ local f_clip_stop_c = formatters[') ; clip currentpicture to (%s..cycle) ;']
+ local f_clip_stop_l = formatters[') ; clip currentpicture to (%s--cycle) ;']
+ local f_clip_stop = f_clip_stop_c
+ local f_eoclip_stop_c = formatters[') ; eoclip currentpicture to (%s..cycle) ;']
+ local f_eoclip_stop_l = formatters[') ; eoclip currentpicture to (%s--cycle) ;']
+ local f_eoclip_stop = f_eoclip_stop_c
+
+ -- could be shared and then beginobject | endobject
+
+ local function flushobject(object,at,c,o)
+ local btransform, etransform = handletransform(at)
+ local cpath = handleclippath(at)
+
+ if cpath then
+ r = r + 1 ; result[r] = s_clip_start
+ end
+
+ if btransform then
+ r = r + 1 ; result[r] = btransform
+ end
+
+ r = r + 1 ; result[r] = f_do_draw(object)
+
+ if c then
+ r = r + 1 ; result[r] = c
+ end
+
+ if o then
+ r = r + 1 ; result[r] = o
+ end
+
+ if etransform then
+ r = r + 1 ; result[r] = etransform
+ end
+
+ r = r + 1 ; result[r] = ";"
+
+ if cpath then
+ local f_done = cpath.evenodd
+ if cpath.curve then
+ f_done = f_done and f_eoclip_stop_c or f_clip_stop_c
+ else
+ f_done = f_done and f_eoclip_stop_l or f_clip_stop_l
+ end
+ r = r + 1 ; result[r] = f_done(cpath[1])
+ end
+ end
+
+ do
+
+ local flush
+
+ local f_linecap = formatters["interim linecap := %s ;"]
+ local f_linejoin = formatters["interim linejoin := %s ;"]
+ local f_miterlimit = formatters["interim miterlimit := %s ;"]
+
+ local s_begingroup = "begingroup;"
+ local s_endgroup = "endgroup;"
+
+ local linecaps = { butt = "butt", square = "squared", round = "rounded" }
+ local linejoins = { miter = "mitered", bevel = "beveled", round = "rounded" }
+
+ local function startlineproperties(at)
+ local cap = at["stroke-linecap"]
+ local join = at["stroke-linejoin"]
+ local limit = at["stroke-miterlimit"]
+ cap = cap and linecaps [cap]
+ join = join and linejoins[join]
+ limit = limit and asnumber_r(limit)
+ if cap or join or limit then
+ r = r + 1 ; result[r] = s_begingroup
+ if cap then
+ r = r + 1 ; result[r] = f_linecap(cap)
+ end
+ if join then
+ r = r + 1 ; result[r] = f_linejoin(join)
+ end
+ if limit then
+ r = r + 1 ; result[r] = f_miterlimit(limit)
+ end
+ return function()
+ at["stroke-linecap"] = false
+ at["stroke-linejoin"] = false
+ at["stroke-miterlimit"] = false
+ r = r + 1 ; result[r] = s_endgroup
+ at["stroke-linecap"] = cap
+ at["stroke-linejoin"] = join
+ at["stroke-miterlimit"] = limit
+ end
+ end
+ end
+
+ -- markers are a quite rediculous thing .. let's assume simple usage for now
+
+ function handlers.marker()
+ -- todo: is just a def too
+ end
+
+ -- kind of local svg ... so make a generic one
+ --
+ -- todo: combine more (offset+scale+rotation)
+
+ local function makemarker(where,c,x1,y1,x2,y2,x3,y3)
+ local at = c.at
+ local refx = rawget(at,"refX")
+ local refy = rawget(at,"refY")
+ local width = rawget(at,"markerWidth")
+ local height = rawget(at,"markerHeight")
+ local view = rawget(at,"viewBox")
+ local orient = rawget(at,"orient")
+ -- local ratio = rawget(at,"preserveAspectRatio")
+ local units = at["markerUnits"]
+ local height = at["markerHeight"]
+ local angx = 0
+ local angy = 0
+ local angle = 0
+
+ if where == "beg" then
+ if orient == "auto" then -- unchecked
+ -- no angle
+ angx = x2 - x3
+ angy = y2 - y3
+ elseif orient == "auto-start-reverse" then -- checked
+ -- points to start
+ angx = x3 - x2
+ angy = y3 - y2
+ elseif orient then -- unchecked
+ angle = asnumber_r(orient)
+ end
+ elseif where == "end" then
+ if orient == "auto" then -- unchecked
+ -- no angle ?
+ angx = x1 - x2
+ angy = y1 - y2
+ elseif orient == "auto-start-reverse" then -- unchecked
+ -- points to end
+ angx = x2 - x1
+ angy = y2 - y1
+ elseif orient then -- unchecked
+ angle = asnumber_r(orient)
+ end
+ elseif orient then -- unchecked
+ angle = asnumber_r(orient)
+ end
+
+ -- what wins: viewbox or w/h
+
+ refx = asnumber_x(refx)
+ refy = asnumber_y(refy)
+
+ width = width and asnumber_x(width) or 3 -- defaults
+ height = height and asnumber_y(height) or 3 -- defaults
+
+ local x = 0
+ local y = 0
+ local w = width
+ local h = height
+
+ -- kind of like the main svg
+
+ r = r + 1 ; result[r] = s_offset_start
+
+ local wrapupviewport
+-- todo : better viewbox code
+ local xpct, ypct, rpct
+ if view then
+ x, y, w, h = handleviewbox(view)
+ end
+
+ if width ~= 0 then
+ w = width
+ end
+ if height ~= 0 then
+ h = height
+ end
+
+ if h then
+ xpct = percentage_x
+ ypct = percentage_y
+ rpct = percentage_r
+ percentage_x = w / 100
+ percentage_y = h / 100
+ percentage_r = (sqrt(w^2 + h^2) / sqrt(2)) / 100
+ wrapupviewport = viewport(x,y,w,h,true,true) -- no clip
+ end
+
+ -- we can combine a lot here:
+
+ local hasref = refx ~= 0 or refy ~= 0
+ local hasrot = angx ~= 0 or angy ~= 0 or angle ~= 0
+
+ local btransform, etransform, transform = handletransform(at)
+
+ if btransform then
+ r = r + 1 ; result[r] = btransform
+ end
+
+ if hasrot then
+ r = r + 1 ; result[r] = s_rotation_start
+ end
+
+ if hasref then
+ r = r + 1 ; result[r] = s_offset_start
+ end
+
+ local _transform = transform
+ at["transform"] = false
+
+ handlers.g(c)
+
+ at["transform"] = _transform
+
+ if hasref then
+ r = r + 1 ; result[r] = f_offset_stop(-refx,refy)
+ end
+
+ if hasrot then
+ if angle ~= 0 then
+ r = r + 1 ; result[r] = f_rotation_angle(angle)
+ else
+ r = r + 1 ; result[r] = f_rotation_stop(angx,angy)
+ end
+ end
+
+ if etransform then
+ r = r + 1 ; result[r] = etransform
+ end
+
+ if h then
+ percentage_x = xpct
+ percentage_y = ypct
+ percentage_r = rpct
+ if wrapupviewport then
+ wrapupviewport()
+ end
+ end
+ r = r + 1 ; result[r] = f_offset_stop(x2,y2)
+
+ end
+
+ local function addmarkers(list,begmarker,midmarker,endmarker)
+ local n = #list
+ if n > 3 then
+ if begmarker then
+ local m = locate(begmarker)
+ if m then
+ makemarker("beg",m,false,false,list[1],list[2],list[3],list[4])
+ end
+ end
+ if midmarker then
+ local m = locate(midmarker)
+ if m then
+ for i=3,n-2,2 do
+ makemarker("mid",m,list[i-2],list[i-1],list[i],list[i+1],list[i+2],list[i+3])
+ end
+ end
+ end
+ if endmarker then
+ local m = locate(endmarker)
+ if m then
+ makemarker("end",m,list[n-3],list[n-2],list[n-1],list[n],false,false)
+ end
+ end
+ else
+ -- no line
+ end
+ end
+
+ local function flush(shape,dofill,at,list,begmarker,midmarker,endmarker)
+
+ local fill = dofill and (at["fill"] or "black")
+ local stroke = at["stroke"] or "none"
+
+ local btransform, etransform = handletransform(at)
+ local cpath = handleclippath(at)
+
+ if cpath then
+ r = r + 1 ; result[r] = s_clip_start
+ end
+
+ local has_stroke = stroke and stroke ~= "none"
+ local has_fill = fill and fill ~= "none"
+
+ local bopacity, eopacity
+ if has_stroke and has_fill then
+ bopacity, eopacity = sharedopacity(at)
+ end
+
+ if bopacity then
+ r = r + 1 ; result[r] = bopacity
+ end
+
+ if has_fill then
+ local color, opacity = fillproperties(fill,at,not has_stroke)
+ local f_xx_fill = at["fill-rule"] == "evenodd" and f_eo_fill or f_do_fill
+ if btransform then
+ r = r + 1 ; result[r] = btransform
+ end
+ r = r + 1 result[r] = f_xx_fill(shape)
+ if color then
+ r = r + 1 ; result[r] = color
+ end
+ if opacity then
+ r = r + 1 ; result[r] = opacity
+ end
+ r = r + 1 ; result[r] = etransform or ";"
+ end
+
+ if has_stroke then
+ local wrapup = startlineproperties(at)
+ local pen, dashing, color, opacity = drawproperties(stroke,at,not has_fill)
+ if btransform then
+ r = r + 1 ; result[r] = btransform
+ end
+ r = r + 1 ; result[r] = f_do_draw(shape)
+ if pen then
+ r = r + 1 ; result[r] = pen
+ end
+ if dashing then
+ r = r + 1 ; result[r] = dashing
+ end
+ if color then
+ r = r + 1 ; result[r] = color
+ end
+ if opacity then
+ r = r + 1 ; result[r] = opacity
+ end
+ r = r + 1 ; result[r] = etransform or ";"
+ --
+ if list then
+ addmarkers(list,begmarker,midmarker,endmarker)
+ end
+ --
+ if wrapup then
+ wrapup()
+ end
+ end
+
+ if eopacity then
+ r = r + 1 ; result[r] = eopacity
+ end
+
+ if cpath then
+ r = r + 1 ; result[r] = (cpath.evenodd and f_eoclip_stop or f_clip_stop)(cpath[1])
+ end
+
+ end
+
+ local f_rectangle = formatters['unitsquare xyscaled (%N,%N) shifted (%N,%N)']
+ local f_rounded = formatters['roundedsquarexy(%N,%N,%N,%N) shifted (%N,%N)']
+ local f_line = formatters['((%N,%N)--(%N,%N))']
+ local f_ellipse = formatters['(fullcircle xyscaled (%N,%N) shifted (%N,%N))']
+ local f_circle = formatters['(fullcircle scaled %N shifted (%N,%N))']
+
+ function handlers.line(c)
+ local at = c.at
+ local x1 = rawget(at,"x1")
+ local y1 = rawget(at,"y1")
+ local x2 = rawget(at,"x2")
+ local y2 = rawget(at,"y2")
+
+ x1 = x1 and asnumber_vx(x1) or 0
+ y1 = y1 and asnumber_vy(y1) or 0
+ x2 = x2 and asnumber_vx(x2) or 0
+ y2 = y2 and asnumber_vy(y2) or 0
+
+ flush(f_line(x1,y1,x2,y2),false,at)
+ end
+
+ function handlers.rect(c)
+ local at = c.at
+ local width = rawget(at,"width")
+ local height = rawget(at,"height")
+ local x = rawget(at,"x")
+ local y = rawget(at,"y")
+ local rx = rawget(at,"rx")
+ local ry = rawget(at,"ry")
+
+ width = width and asnumber_x(width) or 0
+ height = height and asnumber_y(height) or 0
+ x = x and asnumber_vx(x) or 0
+ y = y and asnumber_vy(y) or 0
+
+ y = y - height
+
+ if rx then rx = asnumber(rx) end
+ if ry then ry = asnumber(ry) end
+
+ if rx or ry then
+ if not rx then rx = ry end
+ if not ry then ry = rx end
+ flush(f_rounded(width,height,rx,ry,x,y),true,at)
+ else
+ flush(f_rectangle(width,height,x,y),true,at)
+ end
+ end
+
+ function handlers.ellipse(c)
+ local at = c.at
+ local cx = rawget(at,"cx")
+ local cy = rawget(at,"cy")
+ local rx = rawget(at,"rx")
+ local ry = rawget(at,"ry")
+
+ cx = cx and asnumber_vx(cx) or 0
+ cy = cy and asnumber_vy(cy) or 0
+ rx = rx and asnumber_r (rx) or 0
+ ry = ry and asnumber_r (ry) or 0
+
+ flush(f_ellipse(2*rx,2*ry,cx,cy),true,at)
+ end
+
+ function handlers.circle(c)
+ local at = c.at
+ local cx = rawget(at,"cx")
+ local cy = rawget(at,"cy")
+ local r = rawget(at,"r")
+
+ cx = cx and asnumber_vx(cx) or 0
+ cy = cy and asnumber_vy(cy) or 0
+ r = r and asnumber_r (r) or 0
+
+ flush(f_circle(2*r,cx,cy),true,at)
+ end
+
+ local f_lineto_z = formatters['(%N,%N)']
+ local f_lineto_n = formatters['--(%N,%N)']
+
+ local p_pair = p_optseparator * p_number_vx * p_optseparator * p_number_vy
+ local p_open = Cc("(")
+ local p_close = Carg(1) * P(true) / function(s) return s end
+ local p_polyline = Cs(p_open * (p_pair / f_lineto_z) * (p_pair / f_lineto_n)^0 * p_close)
+ local p_polypair = Ct(p_pair^0)
+
+ local function poly(c,final)
+ local at = c.at
+ local points = rawget(at,"points")
+ if points then
+ local path = lpegmatch(p_polyline,points,1,final)
+ local list = nil
+ local begmarker = rawget(at,"marker-start")
+ local midmarker = rawget(at,"marker-mid")
+ local endmarker = rawget(at,"marker-end")
+ if begmarker or midmarker or endmarker then
+ list = lpegmatch(p_polypair,points)
+ end
+ flush(path,true,at,list,begmarker,midmarker,endmarker)
+ end
+ end
+
+ function handlers.polyline(c) poly(c, ")") end
+ function handlers.polygon (c) poly(c,"--cycle)") end
+
+ local s_image_start = "draw image ("
+ local s_image_stop = ") ;"
+
+ function handlers.path(c)
+ local at = c.at
+ local d = rawget(at,"d")
+ if d then
+ local shape, l = grabpath(d)
+ local fill = at["fill"] or "black"
+ local stroke = at["stroke"] or "none"
+ local n = #shape
+
+ local btransform, etransform = handletransform(at)
+ local cpath = handleclippath(at)
+
+ if cpath then
+ r = r + 1 ; result[r] = s_clip_start
+ end
+
+ -- todo: image (nicer for transform too)
+
+ if fill and fill ~= "none" then
+ local color, opacity = fillproperties(fill,at)
+ local f_xx_fill = at["fill-rule"] == "evenodd"
+ if shape.closed then
+ f_xx_fill = f_xx_fill and f_eo_fill or f_do_fill
+ elseif shape.curve then
+ f_xx_fill = f_xx_fill and f_eo_fill_c or f_do_fill_c
+ else
+ f_xx_fill = f_xx_fill and f_eo_fill_l or f_do_fill_l
+ end
+ if n == 1 then
+ if btransform then
+ r = r + 1 ; result[r] = btransform
+ end
+ r = r + 1 result[r] = f_xx_fill(shape[1])
+ if color then
+ r = r + 1 ; result[r] = color
+ end
+ if opacity then
+ r = r + 1 ; result[r] = opacity
+ end
+ r = r + 1 ; result[r] = etransform or ";"
+ else
+ r = r + 1 ; result[r] = btransform or s_image_start
+ for i=1,n do
+ if i == n then
+ r = r + 1 ; result[r] = f_xx_fill(shape[i])
+ if color then
+ r = r + 1 ; result[r] = color
+ end
+ if opacity then
+ r = r + 1 ; result[r] = opacity
+ end
+ else
+ r = r + 1 ; result[r] = f_no_fill(shape[i])
+ end
+ r = r + 1 ; result[r] = ";"
+ end
+ r = r + 1 ; result[r] = etransform or s_image_stop
+ end
+ end
+
+ if stroke and stroke ~= "none" then
+ local begmarker = rawget(at,"marker-start")
+ local midmarker = rawget(at,"marker-mid")
+ local endmarker = rawget(at,"marker-end")
+ if begmarker or midmarker or endmarker then
+ list = grablist(l)
+ end
+ local wrapup = startlineproperties(at)
+ local pen, dashing, color, opacity = drawproperties(stroke,at)
+ if n == 1 and not list then
+ if btransform then
+ r = r + 1 ; result[r] = btransform
+ end
+ r = r + 1 result[r] = f_do_draw(shape[1])
+ if pen then
+ r = r + 1 ; result[r] = pen
+ end
+ if dashing then
+ r = r + 1 ; result[r] = dashing
+ end
+ if color then
+ r = r + 1 ; result[r] = color
+ end
+ if opacity then
+ r = r + 1 ; result[r] = opacity
+ end
+ r = r + 1 result[r] = etransform or ";"
+ else
+ r = r + 1 result[r] = btransform or "draw image ("
+ for i=1,n do
+ r = r + 1 result[r] = f_do_draw(shape[i])
+ if pen then
+ r = r + 1 ; result[r] = pen
+ end
+ if dashing then
+ r = r + 1 ; result[r] = dashing
+ end
+ if color then
+ r = r + 1 ; result[r] = color
+ end
+ if opacity then
+ r = r + 1 ; result[r] = opacity
+ end
+ r = r + 1 ; result[r] = ";"
+ end
+ if list then
+ addmarkers(list,begmarker,midmarker,endmarker)
+ end
+ r = r + 1 ; result[r] = etransform or ") ;"
+ end
+ if wrapup then
+ wrapup()
+ end
+ end
+
+ if cpath then
+ r = r + 1 ; result[r] = f_clip_stop(cpath[1])
+ end
+
+ end
+ end
+
+ end
+
+ -- kind of special
+
+ do
+
+ -- some day:
+ --
+ -- specification = identifiers.jpg(data."string")
+ -- specification.data = data
+ -- inclusion takes from data
+ -- specification.data = false
+
+ local f_image = formatters[ [[figure("%s") xysized (%N,%N) shifted (%N,%N)]] ]
+
+ local nofimages = 0
+
+ function handlers.image(c)
+ local at = c.at
+ local im = rawget(at,"xlink:href")
+ if im then
+ local kind, data = match(im,"^data:image/([a-z]+);base64,(.*)$")
+ if kind == "png" then
+ -- ok
+ elseif kind == "jpeg" then
+ kind = "jpg"
+ else
+ kind = false
+ end
+ if kind and data then
+ local w = rawget(at,"width")
+ local h = rawget(at,"height")
+ local x = rawget(at,"x")
+ local y = rawget(at,"y")
+ w = w and asnumber_x(w)
+ h = h and asnumber_y(h)
+ x = x and asnumber_vx(x) or 0
+ y = y and asnumber_vy(y) or 0
+ nofimages = nofimages + 1
+ local name = "temp-svg-image-" .. nofimages .. "." .. kind
+ local data = mime.decode("base64")(data)
+ io.savedata(name,data)
+ if not w or not h then
+ local info = graphics.identifiers[kind](data,"string")
+ if info then
+ -- todo: keep aspect ratio attribute
+ local xsize = info.xsize
+ local ysize = info.ysize
+ if not w then
+ if not h then
+ w = xsize
+ h = ysize
+ else
+ w = (h / ysize) * xsize
+ end
+ else
+ h = (w / xsize) * ysize
+ end
+ end
+ end
+ -- safeguard:
+ if not w then w = h or 1 end
+ if not h then h = w or 1 end
+ luatex.registertempfile(name)
+ -- done:
+ flushobject(f_image(name,w,h,x,y - h),at)
+ else
+ -- nothing done
+ end
+ end
+ end
+
+ end
+
+ -- these transform: g a text svg symbol
+
+ do
+
+ function handlers.a(c)
+ process(c,"/*")
+ end
+
+ function handlers.g(c) -- much like flushobject so better split and share
+ local at = c.at
+
+ local btransform, etransform, transform = handletransform(at)
+ local cpath, clippath = handleclippath(at)
+
+ if cpath then
+ r = r + 1 ; result[r] = s_clip_start
+ end
+
+ if btransform then
+ r= r + 1 result[r] = btransform
+ end
+
+ local _transform = transform
+ local _clippath = clippath
+ at["transform"] = false
+ at["clip-path"] = false
+
+ process(c,"/*")
+
+ at["transform"] = _transform
+ at["clip-path"] = _clippath
+
+ if etransform then
+ r = r + 1 ; result[r] = etransform
+ end
+
+ if cpath then
+ local f_done = cpath.evenodd
+ if cpath.curve then
+ f_done = f_done and f_eoclip_stop_c or f_clip_stop_c
+ else
+ f_done = f_done and f_eoclip_stop_l or f_clip_stop_l
+ end
+ r = r + 1 ; result[r] = f_done(cpath[1])
+ end
+ end
+
+ -- this will never really work out
+ --
+ -- todo: register text in lua in mapping with id, then draw mapping unless overloaded
+ -- using lmt_svglabel with family,style,weight,size,id passed
+
+ -- nested tspans are messy: they can have displacements but in inkscape we also
+ -- see x and y (inner and outer element)
+
+ -- The size is a bit of an issue. I assume that the specified size relates to the
+ -- designsize but we want to be able to use other fonts.
+
+ do
+
+ local f_styled = formatters["\\svgstyled{%s}{%s}{%s}{%s}"]
+ local f_colored = formatters["\\svgcolored{%.3N}{%.3N}{%.3N}{"]
+ local f_placed = formatters["\\svgplaced{%.3N}{%.3N}{}{"]
+ local f_poschar = formatters["\\svgposchar{%.3N}{%.3N}{%s}"]
+ local f_char = formatters["\\svgchar{%s}"]
+
+ local f_scaled = formatters["\\svgscaled{%N}{%s}{%s}{%s}"]
+ local f_normal = formatters["\\svgnormal{%s}{%s}{%s}"]
+ local f_hashed = formatters["\\svghashed{%s}"]
+
+ -- We move to the outer (x,y) and when we have an inner offset we
+ -- (need to) compensate for that outer offset.
+
+ -- local f_text_scaled_svg = formatters['(svgtext("%s") scaled %N shifted (%N,%N))']
+ -- local f_text_normal_svg = formatters['(svgtext("%s") shifted (%N,%N))']
+ -- local f_text_simple_svg = formatters['svgtext("%s")']
+
+ local anchors = {
+ ["start"] = "drt",
+ ["end"] = "dflt",
+ ["middle"] = "d",
+ }
+
+ local f_text_normal_svg = formatters['(textext.%s("%s") shifted (%N,%N))']
+ local f_text_simple_svg = formatters['textext.%s("%s")']
+
+ -- or just maptext
+
+ local f_mapped_normal_svg = formatters['(svgtext("%s") shifted (%N,%N))']
+ local f_mapped_simple_svg = formatters['svgtext("%s")']
+
+ local cssfamily = css.family
+ local cssstyle = css.style
+ local cssweight = css.weight
+ local csssize = css.size
+
+ local usedfonts = setmetatableindex(function(t,k)
+ local v = setmetatableindex("table")
+ t[k] = v
+ return v
+ end)
+
+ local p_texescape = lpegpatterns.texescape
+
+ -- For now as I need it for my (some 1500) test files.
+
+ local function checkedfamily(name)
+ if find(name,"^.-verdana.-$") then
+ name = "verdana"
+ end
+ return name
+ end
+
+ -- todo: only escape some chars and handle space
+
+ local defaultsize = 10
+
+ local function collect(t,c,x,y,size,scale,family,tx,ty)
+ local at = c.at
+ local ax = rawget(at,"x")
+ local ay = rawget(at,"y")
+ local dx = rawget(at,"dx")
+ local dy = rawget(at,"dy")
+ local v_fill = at["fill"]
+ local v_family = at["font-family"]
+ local v_style = at["font-style"]
+ local v_weight = at["font-weight"]
+ local v_size = at["font-size"]
+ --
+ ax = ax and asnumber_vx(ax) or x
+ ay = ay and asnumber_vy(ay) or y
+ dx = dx and asnumber_vx(dx) or 0
+ dy = dy and asnumber_vy(dy) or 0
+ --
+ if v_family then v_family = cssfamily(v_family) end
+ if v_style then v_style = cssstyle (v_style) end
+ if v_weight then v_weight = cssweight(v_weight) end
+ if v_size then v_size = csssize (v_size,factors) end
+ --
+ ax = ax - x
+ ay = ay - y
+ --
+ local elayered = ax ~= 0 or ay ~= 0 or false
+ local eplaced = dx ~= 0 or dy ~= 0 or false
+
+ local usedsize, usedscaled
+
+ if elayered then
+ -- we're now at the outer level again so we need to scale
+ -- back to the outer level values
+ t[#t+1] = formatters["\\svgsetlayer{%0N}{%0N}{"](ax,-ay)
+ usedsize = v_size or defaultsize
+ usedscale = usedsize / defaultsize
+ else
+ -- we're nested so we can be scaled
+ usedsize = v_size or size
+ usedscale = (usedsize / defaultsize) / scale
+ end
+ --
+ -- print("element ",c.tg)
+ -- print(" layered ",elayered)
+ -- print(" font size ",v_size)
+ -- print(" parent size ",size)
+ -- print(" parent scale",scale)
+ -- print(" used size ",usedsize)
+ -- print(" used scale ",usedscale)
+ --
+ if eplaced then
+ t[#t+1] = f_placed(dx,dy)
+ end
+ --
+ if not v_family then v_family = family end
+ if not v_weight then v_weight = "normal" end
+ if not v_style then v_style = "normal" end
+ --
+ if v_family then
+ v_family = fonts.names.cleanname(v_family)
+ v_family = checkedfamily(v_family)
+ end
+ --
+ usedfonts[v_family][v_weight][v_style] = true
+ --
+-- if usedscale == 1 then
+-- t[#t+1] = f_normal( v_family,v_weight,v_style)
+-- else
+ t[#t+1] = f_scaled(usedscale,v_family,v_weight,v_style)
+-- end
+ t[#t+1] = "{"
+ --
+ local ecolored = v_fill and v_fill ~= "" or false
+ if ecolored then
+ -- todo
+ local r, g, b = rgbcomponents(v_fill)
+ if r and g and b then
+ t[#t+1] = f_colored(r,g,b)
+ else
+ ecolored = false
+ end
+ end
+ --
+ local dt = c.dt
+ local nt = #dt
+ for i=1,nt do
+ local di = dt[i]
+ if type(di) == "table" then
+ -- can be a tspan (should we pass dx too)
+ collect(t,di,x,y,usedsize,usedscale,v_family)
+ else
+ if i == 1 then
+ di = gsub(di,"^%s+","")
+ end
+ if i == nt then
+ di = gsub(di,"%s+$","")
+ end
+ local chars = utfsplit(di)
+ if svghash then
+ di = f_hashed(svghash[di])
+ elseif tx then
+ for i=1,#chars do
+ chars[i] = f_poschar(
+ (tx[i] or 0) - x,
+ (ty[i] or 0) - y,
+ utfbyte(chars[i])
+ )
+ end
+ di = "{" .. concat(chars) .. "}"
+ else
+ -- this needs to be texescaped ! and even quotes and newlines
+ -- or we could register it but that's a bit tricky as we nest
+ -- and don't know what we can expect here
+ -- di = lpegmatch(p_texescape,di) or di
+ for i=1,#chars do
+ chars[i] = f_char(utfbyte(chars[i]))
+ end
+ di = concat(chars)
+ end
+ t[#t+1] = di
+ end
+ end
+ --
+ if ecolored then
+ t[#t+1] = "}"
+ end
+ --
+ t[#t+1] = "}"
+ --
+ if eplaced then
+ t[#t+1] = "}"
+ end
+ if elayered then
+ t[#t+1] = "}"
+ end
+ --
+ return t
+ end
+
+ local s_startlayer = "\\svgstartlayer "
+ local s_stoplayer = "\\svgstoplayer "
+
+ function handlers.text(c)
+ local only = fullstrip(xmltextonly(c))
+ -- if metapost.processing() then
+ local at = c.at
+ local x = rawget(at,"x")
+ local y = rawget(at,"y")
+
+ local tx = asnumber_vx_t(x)
+ local ty = asnumber_vy_t(y)
+
+ x = tx[1] or 0 -- catch bad x/y spec
+ y = ty[1] or 0 -- catch bad x/y spec
+
+ local v_fill = at["fill"]
+ if not v_fill or v_fill == "none" then
+ v_fill = "black"
+ end
+ local color, opacity, invisible = fillproperties(v_fill,at)
+ local anchor = anchors[at["text-anchor"] or "start"] or "drt"
+ local r = metapost.remappedtext(only)
+ if r then
+ if x == 0 and y == 0 then
+ only = f_mapped_simple_svg(r.index)
+ else
+ only = f_mapped_normal_svg(r.index,x,y)
+ end
+ flushobject(only,at,color,opacity)
+ if trace_text then
+ report("text: %s",only)
+ end
+ elseif not invisible then -- can be an option
+ local scale = 1
+ local textid = 0
+ local result = { }
+ local nx = #tx
+ local ny = #ty
+ --
+ result[#result+1] = s_startlayer
+ if nx > 1 or ny > 1 then
+ concat(collect(result,c,x,y,defaultsize,1,"serif",tx,ty))
+ else
+ concat(collect(result,c,x,y,defaultsize,1,"serif"))
+ end
+ result[#result+1] = s_stoplayer
+ result = concat(result)
+ if x == 0 and y == 0 then
+ result = f_text_simple_svg(anchor,result)
+ else
+ result = f_text_normal_svg(anchor,result,x,y)
+ end
+ flushobject(result,at,color,opacity)
+ if trace_text then
+ report("text: %s",result)
+ end
+ elseif trace_text then
+ report("invisible text: %s",only)
+ end
+ -- elseif trace_text then
+ -- report("ignored text: %s",only)
+ -- end
+ end
+
+ function metapost.reportsvgfonts()
+ for family, weights in sortedhash(usedfonts) do
+ for weight, styles in sortedhash(weights) do
+ for style in sortedhash(styles) do
+ report("used font: %s-%s-%s",family,weight,style)
+ end
+ end
+ end
+ end
+
+ statistics.register("used svg fonts",function()
+ if next(usedfonts) then
+ -- also in log file
+ logs.startfilelogging(report,"used svg fonts")
+ local t = { }
+ for family, weights in sortedhash(usedfonts) do
+ for weight, styles in sortedhash(weights) do
+ for style in sortedhash(styles) do
+ report("%s-%s-%s",family,weight,style)
+ t[#t+1] = formatters["%s-%s-%s"](family,weight,style)
+ end
+ end
+ end
+ logs.stopfilelogging()
+ return concat(t," ")
+ end
+ end)
+
+ end
+
+ function handlers.svg(c,x,y,w,h,noclip,notransform,normalize,usetextindex)
+ local at = c.at
+
+ local wrapupviewport
+ local bhacked
+ local ehacked
+ local wd = w
+ -- local ex, em
+ local xpct, ypct, rpct
+
+ local btransform, etransform, transform = handletransform(at)
+
+ if trace then
+ report("view: %s, xpct %N, ypct %N","before",percentage_x,percentage_y)
+ end
+
+ local viewbox = at.viewBox
+
+ if viewbox then
+ x, y, w, h = handleviewbox(viewbox)
+ if trace then
+ report("viewbox: x %N, y %N, width %N, height %N",x,y,w,h)
+ end
+ end
+ if not w or not h or w == 0 or h == 0 then
+ noclip = true
+ end
+ if h then
+ --
+ -- em = factors["em"]
+ -- ex = factors["ex"]
+ -- factors["em"] = em
+ -- factors["ex"] = ex
+ --
+ xpct = percentage_x
+ ypct = percentage_y
+ rpct = percentage_r
+ percentage_x = w / 100
+ percentage_y = h / 100
+ percentage_r = (sqrt(w^2 + h^2) / sqrt(2)) / 100
+ if trace then
+ report("view: %s, xpct %N, ypct %N","inside",percentage_x,percentage_y)
+ end
+ wrapupviewport = viewport(x,y,w,h,noclip)
+ end
+ -- todo: combine transform and offset here
+
+ -- some fonts need this (bad transforms + viewbox)
+ if v and normalize and w and wd and w ~= wd and w > 0 and wd > 0 then
+ bhacked = s_wrapped_start
+ ehacked = f_wrapped_stop(y or 0,wd/w)
+ end
+ if btransform then
+ r = r + 1 ; result[r] = btransform
+ end
+ if bhacked then
+ r = r + 1 ; result[r] = bhacked
+ end
+ local boffset, eoffset = offset(at)
+ if boffset then
+ r = r + 1 result[r] = boffset
+ end
+ textindex = usetextindex and 0 or false
+
+ at["transform"] = false
+ at["viewBox"] = false
+
+ process(c,"/*")
+
+ at["transform"] = transform
+ at["viewBox"] = viewbox
+
+ if eoffset then
+ r = r + 1 result[r] = eoffset
+ end
+ if ehacked then
+ r = r + 1 ; result[r] = ehacked
+ end
+ if etransform then
+ r = r + 1 ; result[r] = etransform
+ end
+ if h then
+ --
+ -- factors["em"] = em
+ -- factors["ex"] = ex
+ --
+ percentage_x = xpct
+ percentage_y = ypct
+ percentage_r = rpct
+ if wrapupviewport then
+ wrapupviewport()
+ end
+ end
+ if trace then
+ report("view: %s, xpct %N, ypct %N","after",percentage_x,percentage_y)
+ end
+ end
+
+ end
+
+ process = function(x,p)
+ for c in xmlcollected(x,p) do
+ local tg = c.tg
+ local h = handlers[c.tg]
+ if h then
+ h(c)
+ end
+ end
+ end
+
+ -- For huge inefficient files there can be lots of garbage to collect so
+ -- maybe we should run the collector when a file is larger than say 50K.
+
+ function metapost.svgtomp(specification,pattern,notransform,normalize)
+ local mps = ""
+ local svg = specification.data
+ if type(svg) == "string" then
+ svg = xmlconvert(svg)
+ end
+ if svg then
+ local c = xmlfirst(svg,pattern or "/svg")
+ if c then
+ root = svg
+ result = { }
+ r = 0
+ definitions = { }
+ tagstyles = { }
+ classstyles = { }
+ for s in xmlcollected(c,"style") do -- can also be in a def, so let's play safe
+ handlestyle(c)
+ end
+ handlechains(c)
+ xmlinheritattributes(c) -- put this in handlechains
+ handlers.svg (
+ c,
+ specification.x,
+ specification.y,
+ specification.width,
+ specification.height,
+ specification.noclip,
+ notransform,
+ normalize,
+ specification.remap
+ )
+ if trace_result then
+ report("result graphic:\n %\n t",result)
+ end
+ mps = concat(result," ")
+ root, result, r, definitions, styles = false, false, false, false, false
+ else
+ report("missing svg root element")
+ end
+ else
+ report("bad svg blob")
+ end
+ return mps
+ end
+
+end
+
+-- These helpers might move to their own module .. some day ... also they will become
+-- a bit more efficient, because we now go to mp and back which is kind of redundant,
+-- but for now it will do.
+
+do
+
+ local bpfactor = number.dimenfactors.bp
+
+ function metapost.includesvgfile(filename,offset) -- offset in sp
+ if lfs.isfile(filename) then
+ context.startMPcode("doublefun")
+ context('draw lmt_svg [ filename = "%s", offset = %N ] ;',filename,(offset or 0)*bpfactor)
+ context.stopMPcode()
+ end
+ end
+
+ function metapost.includesvgbuffer(name,offset) -- offset in sp
+ context.startMPcode("doublefun")
+ context('draw lmt_svg [ buffer = "%s", offset = %N ] ;',name or "",(offset or 0)*bpfactor)
+ context.stopMPcode()
+ end
+
+ interfaces.implement {
+ name = "includesvgfile",
+ actions = metapost.includesvgfile,
+ arguments = { "string", "dimension" },
+ }
+
+ interfaces.implement {
+ name = "includesvgbuffer",
+ actions = metapost.includesvgbuffer,
+ arguments = { "string", "dimension" },
+ }
+
+ function metapost.showsvgpage(data)
+ local dd = data.data
+ if not dd then
+ local fn = data.filename
+ dd = fn and table.load(fn)
+ end
+ if type(dd) == "table" then
+ local comment = data.comment
+ local offset = data.pageoffset
+ local index = data.index
+ local first = math.max(index or 1,1)
+ local last = math.min(index or #dd,#dd)
+ for i=first,last do
+ local d = setmetatableindex( {
+ data = dd[i],
+ comment = comment and i or false,
+ pageoffset = offset or nil,
+ }, data)
+ metapost.showsvgpage(d)
+ end
+ elseif data.method == "code" then
+ context.startMPcode(doublefun)
+ context(metapost.svgtomp(data))
+ context.stopMPcode()
+ else
+ context.startMPpage { instance = "doublefun", offset = data.pageoffset or nil }
+ context(metapost.svgtomp(data))
+ local comment = data.comment
+ if comment then
+ context("draw boundingbox currentpicture withcolor .6red ;")
+ context('draw textext.bot("\\strut\\tttf %s") ysized (10pt) shifted center bottomboundary currentpicture ;',comment)
+ end
+ context.stopMPpage()
+ end
+ end
+
+ function metapost.typesvgpage(data)
+ local dd = data.data
+ if not dd then
+ local fn = data.filename
+ dd = fn and table.load(fn)
+ end
+ if type(dd) == "table" then
+ local index = data.index
+ if index and index > 0 and index <= #dd then
+ data = dd[index]
+ else
+ data = nil
+ end
+ end
+ if type(data) == "string" and data ~= "" then
+ buffers.assign("svgpage",data)
+ context.typebuffer ({ "svgpage" }, { option = "XML", strip = "yes" })
+ end
+ end
+
+ function metapost.svgtopdf(data,...)
+ local mps = metapost.svgtomp(data,...)
+ if mps then
+ -- todo: special instance, only basics needed
+ local pdf = metapost.simple("metafun",mps,true,false,"svg")
+ if pdf then
+ return pdf
+ else
+ -- message
+ end
+ else
+ -- message
+ end
+ end
+
+end
+
+do
+
+ local runner = sandbox.registerrunner {
+ name = "otfsvg2pdf",
+ program = "context",
+ template = "--batchmode --purgeall --runs=2 %filename%",
+ reporter = report_svg,
+ }
+
+ -- By using an independent pdf file instead of pdf streams we can use resources and still
+ -- cache. This is the old method updated. Maybe a future version will just do this runtime
+ -- but for now this is the most efficient method.
+
+ local decompress = gzip.decompress
+ local compress = gzip.compress
+
+ function metapost.svgshapestopdf(svgshapes,pdftarget,report_svg)
+ local texname = "temp-otf-svg-to-pdf.tex"
+ local pdfname = "temp-otf-svg-to-pdf.pdf"
+ local tucname = "temp-otf-svg-to-pdf.tuc"
+ local nofshapes = #svgshapes
+ local pdfpages = { filename = pdftarget }
+ local pdfpage = 0
+ local t = { }
+ local n = 0
+ --
+ os.remove(texname)
+ os.remove(pdfname)
+ os.remove(tucname)
+ --
+ if report_svg then
+ report_svg("processing %i svg containers",nofshapes)
+ statistics.starttiming(pdfpages)
+ end
+ --
+ -- can be option:
+ --
+ -- n = n + 1 ; t[n] = "\\nopdfcompression"
+ --
+ n = n + 1 ; t[n] = "\\starttext"
+ n = n + 1 ; t[n] = "\\setupMPpage[alternative=offset,instance=doublefun]"
+ --
+ for i=1,nofshapes do
+ local entry = svgshapes[i]
+ local data = entry.data
+ if decompress then
+ data = decompress(data) or data
+ end
+ local specification = {
+ data = xmlconvert(data),
+ x = 0,
+ y = 1000,
+ width = 1000,
+ height = 1000,
+ noclip = true,
+ }
+ for index=entry.first,entry.last do
+ if not pdfpages[index] then
+ pdfpage = pdfpage + 1
+ pdfpages[index] = pdfpage
+ local pattern = "/svg[@id='glyph" .. index .. "']"
+ n = n + 1 ; t[n] = "\\startMPpage"
+ n = n + 1 ; t[n] = metapost.svgtomp(specification,pattern,true,true) or ""
+ n = n + 1 ; t[n] = "\\stopMPpage"
+ end
+ end
+ end
+ n = n + 1 ; t[n] = "\\stoptext"
+ io.savedata(texname,concat(t,"\n"))
+ runner { filename = texname }
+ os.remove(pdftarget)
+ file.copy(pdfname,pdftarget)
+ if report_svg then
+ statistics.stoptiming(pdfpages)
+ report_svg("svg conversion time %s",statistics.elapsedseconds(pdfpages))
+ end
+ os.remove(texname)
+ os.remove(pdfname)
+ os.remove(tucname)
+ return pdfpages
+ end
+
+ function metapost.svgshapestomp(svgshapes,report_svg)
+ local nofshapes = #svgshapes
+ local mpshapes = { }
+ if report_svg then
+ report_svg("processing %i svg containers",nofshapes)
+ statistics.starttiming(mpshapes)
+ end
+ for i=1,nofshapes do
+ local entry = svgshapes[i]
+ local data = entry.data
+ if decompress then
+ data = decompress(data) or data
+ end
+ local specification = {
+ data = xmlconvert(data),
+ x = 0,
+ y = 1000,
+ width = 1000,
+ height = 1000,
+ noclip = true,
+ }
+ for index=entry.first,entry.last do
+ if not mpshapes[index] then
+ local pattern = "/svg[@id='glyph" .. index .. "']"
+ local mpcode = metapost.svgtomp(specification,pattern,true,true) or ""
+ if mpcode ~= "" and compress then
+ mpcode = compress(mpcode) or mpcode
+ end
+ mpshapes[index] = mpcode
+ end
+ end
+ end
+ if report_svg then
+ statistics.stoptiming(mpshapes)
+ report_svg("svg conversion time %s",statistics.elapsedseconds(mpshapes))
+ end
+ return mpshapes
+ end
+
+ function metapost.svgglyphtomp(fontname,unicode)
+ if fontname and unicode then
+ local id = fonts.definers.internal { name = fontname }
+ if id then
+ local tfmdata = fonts.hashes.identifiers[id]
+ if tfmdata then
+ local properties = tfmdata.properties
+ local svg = properties.svg
+ local hash = svg and svg.hash
+ local timestamp = svg and svg.timestamp
+ if hash then
+ local svgfile = containers.read(fonts.handlers.otf.svgcache,hash)
+ local svgshapes = svgfile and svgfile.svgshapes
+ if svgshapes then
+ if type(unicode) == "string" then
+ unicode = utfbyte(unicode)
+ end
+ local chardata = tfmdata.characters[unicode]
+ local index = chardata and chardata.index
+ if index then
+ for i=1,#svgshapes do
+ local entry = svgshapes[i]
+ if index >= entry.first and index <= entry.last then
+ local data = entry.data
+ if data then
+ local root = xml.convert(gzip.decompress(data) or data)
+ return metapost.svgtomp (
+ {
+ data = root,
+ x = 0,
+ y = 1000,
+ width = 1000,
+ height = 1000,
+ noclip = true,
+ },
+ "/svg[@id='glyph" .. index .. "']",
+ true,
+ true
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mtx-context-copy.tex b/Master/texmf-dist/tex/context/base/mkiv/mtx-context-copy.tex
index b798b3f8d16..d29f1d07ce2 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mtx-context-copy.tex
+++ b/Master/texmf-dist/tex/context/base/mkiv/mtx-context-copy.tex
@@ -56,11 +56,17 @@
\startluacode
+ local find = string.find
+
if #document.files == 0 then
context("no files given")
else
- for _, filename in ipairs(document.files) do
- if not string.find(filename,"^mtx%-context%-") then
+ if document.arguments.pattern then
+ document.files = dir.glob(document.arguments.pattern)
+ end
+ for i=1,#document.files do
+ local filename = document.files[i]
+ if not find(filename,"^mtx%-context%-") and not find(filename,"^context%-extra") then
logs.report("copy",filename)
context.getfiguredimensions
{ filename }
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mtx-context-listing.tex b/Master/texmf-dist/tex/context/base/mkiv/mtx-context-listing.tex
index 285113850e1..1053e80b9c3 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mtx-context-listing.tex
+++ b/Master/texmf-dist/tex/context/base/mkiv/mtx-context-listing.tex
@@ -116,10 +116,10 @@
-- forced
end
context.page()
--- context.setupfootertexts( -- return true: we need to keep this entry
--- { function() context.detokenize(pattern and filename or file.basename(filename)) return true end },
--- { function() context.pagenumber() return true end }
--- )
+ context.setupfootertexts( -- return true: we need to keep this entry
+ { function() context.detokenize(pattern and filename or file.basename(filename)) return true end },
+ { function() context.pagenumber() return true end }
+ )
if scite then
context.scitefile { filename } -- here { }
elseif pretty then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mtx-context-markdown.tex b/Master/texmf-dist/tex/context/base/mkiv/mtx-context-markdown.tex
deleted file mode 100644
index 1bd57945f21..00000000000
--- a/Master/texmf-dist/tex/context/base/mkiv/mtx-context-markdown.tex
+++ /dev/null
@@ -1,92 +0,0 @@
-%D \module
-%D [ file=mtx-context-markdown,
-%D version=2011.07.24,
-%D title=\CONTEXT\ Extra Trickry,
-%D subtitle=Rendering Markdown Files,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% begin help
-%
-% usage: context --extra=markdown [options] list-of-files
-%
-% --sort : sort filenames first
-% --paperoffset=dimension : left-top-offset
-% --duplex : doublesided (singlesided is default)
-% --backspace=dimension : extra left offset
-% --topspace=dimension : extra top offset
-% --bodyfont=specification : additional bodyfont specification
-% --contents : add table of contents
-%
-% end help
-
-\usemodule[markdown]
-
-\doifdocumentargument {paperoffset} {
- \definepapersize
- [offset=\getdocumentargument{paperoffset}]
-}
-
-\doifdocumentargument{duplex} {
- \setuppagenumbering
- [alternative=doublesided]
-} {
- \setuppagenumbering
- [alternative=singlesided]
-}
-
-\setdocumentargumentdefault {textwidth} {middle}
-\setdocumentargumentdefault {backspace} {2cm}
-\setdocumentargumentdefault {topspace} {2cm}
-\setdocumentargumentdefault {bodyfont} {}
-
-\setuptolerance
- [verytolerant,stretch]
-
-\setuplayout
- [width=middle,
- height=middle,
- backspace=\getdocumentargument{backspace},
- topspace=\getdocumentargument{topspace},
- footer=0pt]
-
-\setupbodyfont
- [dejavu,10pt,\getdocumentargument{bodyfont}]
-
-\setupwhitespace
- [big]
-
-% \enabletrackers[context.trace]
-
-\setuplist
- [chapter,section,subsection]
- [aligntitle=yes,
- width=4em]
-
-\starttext
-
-\doifdocumentargument{contents} {
- \starttitle[title={Table of contents}]
- \placelist[chapter,section,subsection] % todo: levels
- \stoptitle
-}
-
-
-\startluacode
- if #document.files > 0 then
- if document.arguments.sort then
- table.sort(document.files)
- end
- for i=1,#document.files do
- context.processmarkdownfile(document.files[i])
- context.page()
- end
- end
-\stopluacode
-
-\stoptext
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mult-aux.mkiv b/Master/texmf-dist/tex/context/base/mkiv/mult-aux.mkiv
index 5e7de227096..99d252c6b67 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mult-aux.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/mult-aux.mkiv
@@ -11,17 +11,9 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% todo: setupxxx and setupxxxs (so a plural for the root setup and
-% we can consider blocking the root)
-
-% todo (e.g for columnsets and registers): \definexxx[parent][1]
-%
-
-%D A generalization of \MKIV-like inheritance. Just something to play
-%D with (interface might change). The code here evolved in an email
-%D exchange between me and Wolgang Schuster.
-
-% todo: doifelse<whatever>
+%D A generalization of \MKIV-like inheritance. Just something to play with
+%D (interface might change). The code here evolved in an email exchange between me
+%D and Wolgang Schuster.
\writestatus{loading}{ConTeXt Multilingual Macros / Helpers}
@@ -29,9 +21,9 @@
\unprotect
-\edef\??empty{\Uchar25} \letvalue{\Uchar25}\empty % cancel: dec:24 hex:18
+\edef\??empty{\Uchar25} \letvalue{\Uchar25}\empty % hex 19
-%edef\s!parent{\Uchar29} \letvalue{\Uchar29}\empty % + inlining  is ugly, a tiny bit faster, but neglectable on a run
+% \edef\s!parent{\Uchar29} % inlining  is ugly, a tiny bit faster, but neglectable on a run
%D \starttyping
%D \unprotect
@@ -76,15 +68,15 @@
% todo: add (relaxed) postsetup and postdefine hooks, just after the everys
-% Start of experimental code: especially tables can have many assignments
-% and although most time is spent in the typesetting anyway, we can squeeze
-% out a little bit. Of course having 500 rows of 50 columns each with some
-% setting does not happen that often. One should keep in mind that in the
-% average document having some 500 assignments is no exception but there we're
-% talking of neglectable runtime for them. Of course in the definitions below
-% there is no real gain, only in the generated \setup* commands. Another
-% situation with many assignments is \XML\ where we can pass attributes
-% and normally don't do testing of them making sense.
+%D Start of experimental code: especially tables can have many assignments and
+%D although most time is spent in the typesetting anyway, we can squeeze out a
+%D little bit. Of course having 500 rows of 50 columns each with some setting does
+%D not happen that often. One should keep in mind that in the average document
+%D having some 500 assignments is no exception but there we're talking of
+%D neglectable runtime for them. Of course in the definitions below there is no real
+%D gain, only in the generated \setup* commands. Another situation with many
+%D assignments is \XML\ where we can pass attributes and normally don't do testing
+%D of them making sense.
%
% \testfeatureonce{100000}{\getparameters[bla][a=111,b=222,c=333]}% 1.669s
% \testfeatureonce{100000}{\mult_interfaces_get_parameters{bla} [a=111,b=222,c=333]}% 1.529s
@@ -101,7 +93,7 @@
\fi#2}
\def\mult_interfaces_get_parameters_indeed#1]% namespace already set
- {\mult_interfaces_get_parameters_item#1,],\_e_o_p_}
+ {\mult_interfaces_get_parameters_item#1,],^^^^0004}
\def\mult_interfaces_get_parameters_item#1,#2% #2 takes space before ,
{\if,#1,% dirty trick for testing #1=empty
@@ -109,7 +101,7 @@
\else\if]#1%
\doubleexpandafter\gobbleoneargument
\else
- \mult_interfaces_get_parameters_assign#1==\empty\_e_o_p_
+ \mult_interfaces_get_parameters_assign#1==\empty^^^^0004%
% \doubleexpandafter\mult_interfaces_get_parameters_item % saves skipping when at end
\fi\fi#2}
@@ -120,7 +112,7 @@
\def\mult_interfaces_get_parameters_error_indeed#1#2%
{\showassignerror{#2}{\the\inputlineno\space(#1)}}
-\def\mult_interfaces_get_parameters_assign#1=#2=#3#4\_e_o_p_
+\def\mult_interfaces_get_parameters_assign#1=#2=#3#4^^^^0004%
{\ifx\empty#1\empty
\expandafter\mult_interfaces_get_parameters_error
\else\ifx#3\empty
@@ -143,7 +135,7 @@
\def\mult_interfaces_get_parameters_error_two#1\csname#2#3\endcsname#4%
{\mult_interfaces_get_parameters_error_indeed{#2}{#3}}
- \def\mult_interfaces_get_parameters_assign#1=#2=#3#4\_e_o_p_
+ \def\mult_interfaces_get_parameters_assign#1=#2=#3#4^^^^0004%
{\ifx\empty#1\empty
\mult_interfaces_get_parameters_error_one
\else\ifx#3\empty
@@ -161,7 +153,7 @@
% \def\mult_interfaces_get_parameters_error_two#1\m_mult_interfaces_namespace#2\fi\fi%
% {\mult_interfaces_get_parameters_error_indeed\m_mult_interfaces_namespace{#2}\m_mult_interfaces_namespace\s!dummy\fi\fi}
%
- % \def\mult_interfaces_get_parameters_assign#1=#2=#3#4\_e_o_p_
+ % \def\mult_interfaces_get_parameters_assign#1=#2=#3#4^^^^0004%
% {\expandafter\def\csname
% \ifx\empty#1\empty
% \mult_interfaces_get_parameters_error_one
@@ -177,34 +169,45 @@
\newif\ifassignment
-\def\mult_check_for_assignment_indeed#1=#2#3\_end_
- {\if#2@\assignmentfalse\else\assignmenttrue\fi}
-
-\def\mult_check_for_assignment_indeed_begin_#1=#2#3\_end_
- {\if#2@}
+\def\mult_check_for_assignment_indeed#1=#2#3^^^^0004%
+ {\if#2^^^^0003\assignmentfalse\else\assignmenttrue\fi}
+\def\mult_check_for_assignment_indeed_begin_#1=#2#3^^^^0004%
+ {\if#2^^^^0003}
\def\mult_check_for_assignment#1%
- {\expandafter\mult_check_for_assignment_indeed\detokenize{#1}=@@\_end_}
+ {\expandafter\mult_check_for_assignment_indeed\detokenize{#1}=^^^^0003^^^^0003^^^^0004}
% End of experimental code.
-\unexpanded\def\mult_interfaces_let #1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-\unexpanded\def\mult_interfaces_lete#1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname\empty}
-\unexpanded\def\mult_interfaces_def #1#2{\expandafter\def \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-\unexpanded\def\mult_interfaces_edef#1#2{\expandafter\edef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-\unexpanded\def\mult_interfaces_gdef#1#2{\expandafter\gdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-\unexpanded\def\mult_interfaces_xdef#1#2{\expandafter\xdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+%D This can give wrong results when we pass e.g. \type{\c!format}, so either we need
+%D to use the \type {\k!} ones, but these are not defined in the english interface
+%D so from now on we assume that the low level ones are used with the symbolic names
+%D and that only the high level setup commands are used with language specific
+%D interfaces.
-\startinterface english
+% \unexpanded\def\mult_interfaces_let #1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_lete#1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname\empty}
+% \unexpanded\def\mult_interfaces_def #1#2{\expandafter\def \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_edef#1#2{\expandafter\edef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_gdef#1#2{\expandafter\gdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_xdef#1#2{\expandafter\xdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \startinterface english
\unexpanded\def\mult_interfaces_let #1#2{\expandafter \let\csname#1#2\endcsname}
\unexpanded\def\mult_interfaces_lete#1#2{\expandafter \let\csname#1#2\endcsname\empty}
\unexpanded\def\mult_interfaces_def #1#2{\expandafter \def\csname#1#2\endcsname}
\unexpanded\def\mult_interfaces_edef#1#2{\expandafter\edef\csname#1#2\endcsname}
\unexpanded\def\mult_interfaces_gdef#1#2{\expandafter\gdef\csname#1#2\endcsname}
\unexpanded\def\mult_interfaces_xdef#1#2{\expandafter\xdef\csname#1#2\endcsname}
+% \stopinterface
+
+%D Do, we only interface the assignment definition:
+
+\unexpanded\def\mult_interfaces_adef#1#2{\expandafter\def \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+\startinterface english
+ \unexpanded\def\mult_interfaces_adef#1#2{\expandafter \def\csname#1#2\endcsname}
\stopinterface
% the commented detokenized variant that backtracks ... needs testing usage first
@@ -217,21 +220,23 @@
% \def\currenttest{oeps} \edef\hans{\detokenizedtestparameter{reggab}}\meaning\hans\par
%
% slower: \def#3##1{\csname\ifcsname#1#2:##1\endcsname\expandafter\csstring\lastnamedcs\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}%
-%
-% pre-expansion can be a bit faster but handly any effect on a normal run so let's go for
-% saving some memory
+
+%D pre-expansion can be a bit faster but handly any effect on a normal run so let's
+%D go for saving some memory
\def\mult_interfaces_detokenize{\expandafter\expandafter\expandafter\detokenize\expandafter\expandafter\expandafter}
-\unexpanded\def\mult_interfaces_install_parameter_handler#1#2#3#4#5#6#7#8% inlining \csname*\endcsname is more efficient (#3 and #6 only)
- {\ifx#2\relax\let#2\empty\fi % it is hardly faster but produces less expansion tracing
+\unexpanded\def\mult_interfaces_install_parameter_handler#1#2#3#4#5#6#7#8#9% inlining \csname*\endcsname is more efficient (#3 and #6 only)
+ {\ifx#2\relax\let#2\empty\fi % it is hardly faster but produces less expansion tracing
\def#3##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}%
\def#4##1##2{\ifcsname##1:##2\endcsname##1:##2\else\expandafter#5\csname##1:\s!parent\endcsname{##2}\fi}%
%\def#5##1##2{\ifx##1\relax\??empty\else#4{##1}{##2}\fi}% is {} needed around ##1 ?
- \def#5##1##2{\ifx##1\relax\??empty\else#4##1{##2}\fi}% is {} needed around ##1 ?
+ %\def#5##1##2{\ifx##1\relax\??empty\else#4##1{##2}\fi}% is {} needed around ##1 ?
+ \def#5##1##2{\ifx##1\relax^^^^0019\else#4##1{##2}\fi}% is {} needed around ##1 ?
\def#6##1##2{\csname\ifcsname#1##1:##2\endcsname#1##1:##2\else\expandafter#5\csname#1##1:\s!parent\endcsname{##2}\fi\endcsname}%
\def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1#2:##1\endcsname}}% always root, no backtrack
- \def#8##1{\begincsname#1#2:##1\endcsname}}
+ \def#8##1{\begincsname#1#2:##1\endcsname}
+ \def#9##1##2{\expandafter\let\expandafter##1\csname\ifcsname#1#2:##2\endcsname#1#2:##2\else\expandafter#5\csname#1#2:\s!parent\endcsname{##2}\fi\endcsname}}
\unexpanded\def\installparameterhandler#1#2%
{\normalexpanded
@@ -243,7 +248,8 @@
\expandafter\noexpand\csname do#2parentparameter\endcsname % or : #2_parent_parameter
\expandafter\noexpand\csname named#2parameter\endcsname
\expandafter\noexpand\csname detokenized#2parameter\endcsname
- \expandafter\noexpand\csname direct#2parameter\endcsname}} % strict#2parameter is gone
+ \expandafter\noexpand\csname direct#2parameter\endcsname
+ \expandafter\noexpand\csname letfrom#2parameter\endcsname}} % strict#2parameter is gone
\unexpanded\def\mult_interfaces_install_root_parameter_handler#1#2#3%
{\def#2##1{\detokenize\expandafter\expandafter\expandafter{\csname#1:##1\endcsname}}% always root
@@ -281,28 +287,25 @@
\expandafter\noexpand\csname check#2parent\endcsname
\expandafter\noexpand\csname chaintocurrent#2\endcsname}}
-% In \MKIV\ we can probably use the english variant for all other
-% languages too.
+%D In \MKIV\ we can probably use the english variant for all other languages too.
% todo: inline the def/let
-\unexpanded\def\mult_interfaces_install_parameter_set_handler#1#2#3#4#5#6%
- {\ifx#2\relax\let#2\empty\fi
- \unexpanded\def#3{\mult_interfaces_def {#1#2:}}% ##1 {##2} (braces are mandate)
- \unexpanded\def#4{\mult_interfaces_edef{#1#2:}}% ##1 {##2} (braces are mandate)
- \unexpanded\def#5{\mult_interfaces_let {#1#2:}}% ##1 ##2
- \unexpanded\def#6{\mult_interfaces_lete{#1#2:}}}% ##1
-
-\startinterface english
-
+% \unexpanded\def\mult_interfaces_install_parameter_set_handler#1#2#3#4#5#6%
+% {\ifx#2\relax\let#2\empty\fi
+% \unexpanded\def#3{\mult_interfaces_def {#1#2:}}% ##1 {##2} (braces are mandate)
+% \unexpanded\def#4{\mult_interfaces_edef{#1#2:}}% ##1 {##2} (braces are mandate)
+% \unexpanded\def#5{\mult_interfaces_let {#1#2:}}% ##1 ##2
+% \unexpanded\def#6{\mult_interfaces_lete{#1#2:}}}% ##1
+%
+% \startinterface english
\unexpanded\def\mult_interfaces_install_parameter_set_handler#1#2#3#4#5#6%
{\ifx#2\relax\let#2\empty\fi
\unexpanded\def#3##1{\expandafter \def\csname#1#2:##1\endcsname}% ##1 {##2} (braces are mandate)
\unexpanded\def#4##1{\expandafter\edef\csname#1#2:##1\endcsname}% ##1 {##2} (braces are mandate)
\unexpanded\def#5##1{\expandafter \let\csname#1#2:##1\endcsname}% ##1 ##2
\unexpanded\def#6##1{\expandafter \let\csname#1#2:##1\endcsname\empty}}% ##1
-
-\stopinterface
+% \stopinterface
\unexpanded\def\installparametersethandler#1#2%
{\normalexpanded
@@ -357,44 +360,6 @@
\def\getparentchain #1#2{\begincsname#1#2:\s!chain\endcsname}
\def\getcurrentparentchain#1#2{\begincsname#1#2:\s!chain\endcsname}
-\unexpanded\def\mult_interfaces_install_define_handler#1#2#3#4#5#6#7#8#9% why is \expanded still needed in clones
- {\ifx#4\relax\let#4\empty\fi % see \defineregister
- \unexpanded\def#2{\dotripleempty#5}%
- \newtoks#6%
- \newtoks#7%
- \unexpanded\def#5[##1][##2][##3]% [child][parent][settings] | [child][settings] | [child][parent] | [child]
- {\let#9#4%
- \edef#4{##1}%
- \ifthirdargument
- \the#6% predefine
- \edef#8{##2}%
- \mult_check_for_parent{#1}{#3}#4#8%
- \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}%
- \expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}%
- \mult_interfaces_get_parameters{#1#4:}[##3]%
- \else\ifsecondargument
- \the#6% predefine
- \expandafter\mult_check_for_assignment_indeed\detokenize{##2}=@@\_end_
- \ifassignment
- \let#8\empty
- \expandafter\edef\csname#1#4:\s!chain\endcsname{##1}%
- \expandafter\edef\csname#1#4:\s!parent\endcsname{#3}%
- \mult_interfaces_get_parameters{#1#4:}[##2]%
- \else
- \edef#8{##2}%
- \mult_check_for_parent{#1}{#3}#4#8%
- \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}%
- \expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}%
- \fi
- \else
- \the#6% predefine
- \let#8\empty
- \expandafter\edef\csname#1#4:\s!chain\endcsname{##1}%
- \expandafter\edef\csname#1#4:\s!parent\endcsname{#3}%
- \fi\fi
- \the#7%
- \let#4#9}}
-
% \unexpanded\def\mult_interfaces_install_define_handler#1#2#3#4#5#6#7#8#9% why is \expanded still needed in clones
% {\ifx#4\relax\let#4\empty\fi % see \defineregister
% \unexpanded\def#2{\dotripleempty#5}%
@@ -412,16 +377,17 @@
% \mult_interfaces_get_parameters{#1#4:}[##3]%
% \else\ifsecondargument
% \the#6% predefine
-% \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##2}=@@\_end_
-% \edef#8{##2}%
-% \mult_check_for_parent{#1}{#3}#4#8%
-% \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}%
-% \expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}%
-% \else
+% \expandafter\mult_check_for_assignment_indeed\detokenize{##2}=^^^^0003^^^^0003^^^^0004%
+% \ifassignment
% \let#8\empty
% \expandafter\edef\csname#1#4:\s!chain\endcsname{##1}%
% \expandafter\edef\csname#1#4:\s!parent\endcsname{#3}%
% \mult_interfaces_get_parameters{#1#4:}[##2]%
+% \else
+% \edef#8{##2}%
+% \mult_check_for_parent{#1}{#3}#4#8%
+% \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}%
+% \expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}%
% \fi
% \else
% \the#6% predefine
@@ -432,6 +398,43 @@
% \the#7%
% \let#4#9}}
+\unexpanded\def\mult_interfaces_install_define_handler#1#2#3#4#5#6#7#8#9% why is \expanded still needed in clones
+ {\ifx#4\relax\let#4\empty\fi % see \defineregister
+ \unexpanded\def#2{\dotripleempty#5}%
+ \newtoks#6%
+ \newtoks#7%
+ \unexpanded\def#5[##1][##2][##3]% [child][parent][settings] | [child][settings] | [child][parent] | [child]
+ {\let#9#4%
+ \edef#4{##1}%
+ \ifthirdargument
+ \the#6% predefine
+ \edef#8{##2}%
+ \mult_check_for_parent{#1}{#3}#4#8%
+ \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}%
+ \expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}%
+ \mult_interfaces_get_parameters{#1#4:}[##3]%
+ \else\ifsecondargument
+ \the#6% predefine
+ \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##2}=^^^^0003^^^^0003^^^^0004%
+ \edef#8{##2}%
+ \mult_check_for_parent{#1}{#3}#4#8%
+ \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}%
+ \expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}%
+ \else
+ \let#8\empty
+ \expandafter\edef\csname#1#4:\s!chain\endcsname{##1}%
+ \expandafter\edef\csname#1#4:\s!parent\endcsname{#3}%
+ \mult_interfaces_get_parameters{#1#4:}[##2]%
+ \fi
+ \else
+ \the#6% predefine
+ \let#8\empty
+ \expandafter\edef\csname#1#4:\s!chain\endcsname{##1}%
+ \expandafter\edef\csname#1#4:\s!parent\endcsname{#3}%
+ \fi\fi
+ \the#7%
+ \let#4#9}}
+
\unexpanded\def\installdefinehandler#1#2#3%
{\normalexpanded
{\mult_interfaces_install_define_handler
@@ -490,55 +493,6 @@
\unexpanded\def#2{\dodoubleempty#4}%
\unexpanded\def#5{\mult_interfaces_get_parameters{#1#3:}}}
-\unexpanded\def\mult_interfaces_install_switch_setup_handler_b#1#2#3#4#5#6#7#8#9%
- {\newtoks#5%
- \newconstant#2%
- \newtoks#8%
- \newtoks#9%
- \ifx#6\relax\let#6\empty\fi
- \unexpanded\def#4[##1][##2]% maybe helper
- {\ifsecondargument % no commalist here
- % \setuplayout[whatever][key=value]
- \let#7#3%
- \let#6#3%
- \edef#3{##1}%
- #2\doingrootsetupnamed
- \mult_interfaces_get_parameters{#1#3:}[##2]%
- \the#5%
- \ifx#3#6\the#8\fi % only switchsetups if previous == current
- \let#3#7%
- \else\iffirstargument
- % \mult_check_for_assignment{##1}%
- \expandafter\mult_check_for_assignment_indeed\detokenize{##1}=@@\_end_
- \ifassignment
- % \setuplayout[key=value]
- \let#7#3%
- \let#6#3%
- \let#3\empty
- #2\doingrootsetuproot
- \mult_interfaces_get_parameters{#1:}[##1]%
- \the#5%
- \the#8% switchsetups
- \let#3#7%
- \else
- % \setuplayout[whatever]
- \let#6#3% % previous becomes current
- \edef#3{##1}% this will catch reset so one needs to test for it
- #2\doingrootsetnamed
- \the#5% % we can check for previous vs current
- \the#8% switchsetups
- \fi
- \else
- % \setuplayout
- \let#6#3% % previous becomes current
- \let#3\empty % current becomes empty
- #2\doingrootsetroot
- \the#5%
- \the#8% switchsetups
- \fi\fi
- #2\zerocount % mode is always zero at the end
- \the#9}}
-
% \unexpanded\def\mult_interfaces_install_switch_setup_handler_b#1#2#3#4#5#6#7#8#9%
% {\newtoks#5%
% \newconstant#2%
@@ -558,14 +512,8 @@
% \let#3#7%
% \else\iffirstargument
% % \mult_check_for_assignment{##1}%
-% \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##1}=@@\_end_
-% % \setuplayout[whatever]
-% \let#6#3% % previous becomes current
-% \edef#3{##1}% this will catch reset so one needs to test for it
-% #2\doingrootsetnamed
-% \the#5% % we can check for previous vs current
-% \the#8% switchsetups
-% \else
+% \expandafter\mult_check_for_assignment_indeed\detokenize{##1}=^^^^0003^^^^0003^^^^0004%
+% \ifassignment
% % \setuplayout[key=value]
% \let#7#3%
% \let#6#3%
@@ -575,6 +523,13 @@
% \the#5%
% \the#8% switchsetups
% \let#3#7%
+% \else
+% % \setuplayout[whatever]
+% \let#6#3% % previous becomes current
+% \edef#3{##1}% this will catch reset so one needs to test for it
+% #2\doingrootsetnamed
+% \the#5% % we can check for previous vs current
+% \the#8% switchsetups
% \fi
% \else
% % \setuplayout
@@ -587,6 +542,54 @@
% #2\zerocount % mode is always zero at the end
% \the#9}}
+\unexpanded\def\mult_interfaces_install_switch_setup_handler_b#1#2#3#4#5#6#7#8#9%
+ {\newtoks#5%
+ \newconstant#2%
+ \newtoks#8%
+ \newtoks#9%
+ \ifx#6\relax\let#6\empty\fi
+ \unexpanded\def#4[##1][##2]% maybe helper
+ {\ifsecondargument % no commalist here
+ % \setuplayout[whatever][key=value]
+ \let#7#3%
+ \let#6#3%
+ \edef#3{##1}%
+ #2\doingrootsetupnamed
+ \mult_interfaces_get_parameters{#1#3:}[##2]%
+ \the#5%
+ \ifx#3#6\the#8\fi % only switchsetups if previous == current
+ \let#3#7%
+ \else\iffirstargument
+ % \mult_check_for_assignment{##1}%
+ \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##1}=^^^^0003^^^^0003^^^^0004%
+ % \setuplayout[whatever]
+ \let#6#3% % previous becomes current
+ \edef#3{##1}% this will catch reset so one needs to test for it
+ #2\doingrootsetnamed
+ \the#5% % we can check for previous vs current
+ \the#8% switchsetups
+ \else
+ % \setuplayout[key=value]
+ \let#7#3%
+ \let#6#3%
+ \let#3\empty
+ #2\doingrootsetuproot
+ \mult_interfaces_get_parameters{#1:}[##1]%
+ \the#5%
+ \the#8% switchsetups
+ \let#3#7%
+ \fi
+ \else
+ % \setuplayout
+ \let#6#3% % previous becomes current
+ \let#3\empty % current becomes empty
+ #2\doingrootsetroot
+ \the#5%
+ \the#8% switchsetups
+ \fi\fi
+ #2\zerocount % mode is always zero at the end
+ \the#9}}
+
\unexpanded\def\installswitchsetuphandler#1#2%
{\normalexpanded
{\mult_interfaces_install_switch_setup_handler_a
@@ -685,14 +688,14 @@
\installsetuphandler {#1}{#2}%
\installstyleandcolorhandler {#1}{#2}}
-%D Many mechanisms have some kind of inheritance in place, and these are
-%D the speed||critical ones. Therefore there is no reason to stick to
-%D \type {\@@xxkey} for the sake of performance. For this reason we also
-%D provide a direct variant. This permits a more consistent treatment of
-%D namespaces. A \type {\whateverparameter} call is three times slower
-%D and a \type {\directwhateverparameter} call two times but for some
-%D 100K expansions we only loose some .1 second which is neglectable
-%D given the small amount of expansions in real runs.
+%D Many mechanisms have some kind of inheritance in place, and these are the
+%D speed||critical ones. Therefore there is no reason to stick to \type {\@@xxkey}
+%D for the sake of performance. For this reason we also provide a direct variant.
+%D This permits a more consistent treatment of namespaces. A \type
+%D {\whateverparameter} call is three times slower and a \type
+%D {\directwhateverparameter} call two times but for some 100K expansions we only
+%D loose some .1 second which is neglectable given the small amount of expansions in
+%D real runs.
%D We don't need colons for such simple cases.
@@ -727,21 +730,19 @@
\expandafter\noexpand\csname setupcurrent#2\endcsname % no \every (we use 'current' for consistency)
\expandafter\noexpand\csname everysetup#2\endcsname}}
-\unexpanded\def\mult_interfaces_install_direct_parameter_set_handler#1#2#3#4#5%
- {\unexpanded\def#2{\mult_interfaces_def #1}%
- \unexpanded\def#3{\mult_interfaces_edef#1}%
- \unexpanded\def#4{\mult_interfaces_let #1}%
- \unexpanded\def#5{\mult_interfaces_let #1\empty}}%
-
-\startinterface english
+% \unexpanded\def\mult_interfaces_install_direct_parameter_set_handler#1#2#3#4#5%
+% {\unexpanded\def#2{\mult_interfaces_def #1}%
+% \unexpanded\def#3{\mult_interfaces_edef#1}%
+% \unexpanded\def#4{\mult_interfaces_let #1}%
+% \unexpanded\def#5{\mult_interfaces_let #1\empty}}%
+% \startinterface english
\unexpanded\def\mult_interfaces_install_direct_parameter_set_handler#1#2#3#4#5%
{\unexpanded\def#2##1{\expandafter \def\csname#1##1\endcsname}%
\unexpanded\def#3##1{\expandafter\edef\csname#1##1\endcsname}%
\unexpanded\def#4##1{\expandafter \let\csname#1##1\endcsname}%
\unexpanded\def#5##1{\expandafter \let\csname#1##1\endcsname\empty}}%
-
-\stopinterface
+% \stopinterface
\unexpanded\def\installdirectparametersethandler#1#2%
{\normalexpanded
@@ -804,6 +805,24 @@
\expandafter\noexpand\csname setupcurrent#1\endcsname
\expandafter\noexpand\csname #1_action\endcsname}}
+% \unexpanded\def\mult_interfaces_install_action_handler#1#2#3#4%
+% {\unexpanded\expandafter\def\csname#1\endcsname{\dodoubleempty#4}%
+% \unexpanded\def#4[##1][##2]%
+% {\begingroup
+% \ifsecondargument
+% \edef#2{##1}%
+% #3[##2]%
+% \else\iffirstargument
+% \doifelseassignment{##1}
+% {\let#2\empty
+% #3[##1]}%
+% {\edef#2{##1}}%
+% \else
+% \let#2\empty
+% \fi\fi
+% \directsetup{handler:action:#1}%
+% \endgroup}}
+
\unexpanded\def\mult_interfaces_install_action_handler#1#2#3#4%
{\unexpanded\expandafter\def\csname#1\endcsname{\dodoubleempty#4}%
\unexpanded\def#4[##1][##2]%
@@ -812,10 +831,12 @@
\edef#2{##1}%
#3[##2]%
\else\iffirstargument
- \doifelseassignment{##1}
- {\let#2\empty
- #3[##1]}%
- {\edef#2{##1}}%
+ \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##1}=^^^^0003^^^^0003^^^^0004%
+ \edef#2{##1}%
+ \else
+ \let#2\empty
+ #3[##1]%
+ \fi
\else
\let#2\empty
\fi\fi
@@ -828,22 +849,21 @@
% \unexpanded\def\installnamespace#1{\setvalue{????#1}{@@@@#1}}
% \stoptyping
%
-% The following variant is nicer and in principle faster but that gets
-% unnoticed unless lots of expansion happens. Also, we can use long tags
-% but the internal expansion will be relatively small (and unlikely more
-% than 4 characters). For instance, \??xx used to expand to @@xx but now
-% becomes for instance 123::. This is one character more but in quite some
-% cases we had : after such a tag in the old situation. In the new situation
-% we create more namespaces and don't need that : any more, so we end up
-% with on the average the same amount of tokens and definitely less when
-% we consider cases like \??xx:\c!align: which now is just \??somealign and
-% therefore has length 5 now (instead of 4+1+5+1=10).
+% The following variant is nicer and in principle faster but that gets unnoticed
+% unless lots of expansion happens. Also, we can use long tags but the internal
+% expansion will be relatively small (and unlikely more than 4 characters). For
+% instance, \??xx used to expand to @@xx but now becomes for instance 123::. This
+% is one character more but in quite some cases we had : after such a tag in the
+% old situation. In the new situation we create more namespaces and don't need that
+% : any more, so we end up with on the average the same amount of tokens and
+% definitely less when we consider cases like \??xx:\c!align: which now is just
+% \??somealign and therefore has length 5 now (instead of 4+1+5+1=10).
%
-% Eventualy we will have a verbose \blablanamespace and the difference between
-% core and regular can go ... after all, \xxxparameter can already clash between
-% the two prefix groups .. if users use this mechanism a lot they should use
-% verbose names anyway (the old two character names were mostly an optimization
-% as they also expanded to these characters).
+% Eventualy we will have a verbose \blablanamespace and the difference between core
+% and regular can go ... after all, \xxxparameter can already clash between the two
+% prefix groups .. if users use this mechanism a lot they should use verbose names
+% anyway (the old two character names were mostly an optimization as they also
+% expanded to these characters).
% todo: register namespaces at lua end for logging and reverse resolve
% todo: move this to syst-ini so that we can use it real early
@@ -878,7 +898,7 @@
\fi}
\def\mult_interfaces_get_parameters_error_indeed#1#2%
- {\clf_showassignerror{#1}{#2}\inputlineno} % no longer \waitonfatalerror
+ {\clf_showassignerror{#1}{#2}\inputlineno}
% We install two core namespaces here, as we want nice error messages. Maybe
% we will reserve the first 9.
@@ -916,8 +936,8 @@
\usedummystyleparameter
\usedummycolorparameter
-% Maybe a \definecorenamespace[name][directparameter,directsetup][parent]
-% but we don't gain much. Actually we might just inline all definitions.
+% Maybe a \definecorenamespace[name][directparameter,directsetup][parent] but we
+% don't gain much. Actually we might just inline all definitions.
% \enabletrackers[interfaces.namespaces,context.flush]
%
@@ -1328,23 +1348,23 @@
\unexpanded\def\syst_helpers_install_macro_stack#1#2#3%
{\xdef\m_syst_helpers_push_macro{\csstring#1}%
- \expandafter\newcount\csname#3\m_syst_helpers_push_macro\endcsname
- \expandafter\edef\csname push_macro_\m_syst_helpers_push_macro\endcsname
- {\noexpand\expandafter\glet
- \noexpand\csname\m_syst_helpers_push_macro\noexpand\the\csname#3\m_syst_helpers_push_macro\endcsname\endcsname
- \noexpand#1%
- \global\advance\csname#3\m_syst_helpers_push_macro\endcsname\plusone}%
- \expandafter\edef\csname pop_macro_\m_syst_helpers_push_macro\endcsname
- {\global\advance\csname#3\m_syst_helpers_push_macro\endcsname\minusone
- \noexpand\expandafter#2%
- \noexpand\expandafter\noexpand#1%
- \noexpand\csname\m_syst_helpers_push_macro\noexpand\the\csname#3\m_syst_helpers_push_macro\endcsname\endcsname}}
+ \ifcsname#3\m_syst_helpers_push_macro\endcsname\else
+ \expandafter\newcount\csname#3\m_syst_helpers_push_macro\endcsname
+ \expandafter\edef\csname push_macro_\m_syst_helpers_push_macro\endcsname
+ {\noexpand\expandafter\glet
+ \noexpand\csname\m_syst_helpers_push_macro\noexpand\the\csname#3\m_syst_helpers_push_macro\endcsname\endcsname
+ \noexpand#1%
+ \global\advance\csname#3\m_syst_helpers_push_macro\endcsname\plusone}%
+ \expandafter\edef\csname pop_macro_\m_syst_helpers_push_macro\endcsname
+ {\global\advance\csname#3\m_syst_helpers_push_macro\endcsname\minusone
+ \noexpand\expandafter#2%
+ \noexpand\expandafter\noexpand#1%
+ \noexpand\csname\m_syst_helpers_push_macro\noexpand\the\csname#3\m_syst_helpers_push_macro\endcsname\endcsname}%
+ \fi}
\unexpanded\def\installmacrostack #1{\syst_helpers_install_macro_stack#1\let \??localpushedmacro }
\unexpanded\def\installglobalmacrostack#1{\syst_helpers_install_macro_stack#1\glet\??globalpushedmacro}
-\protect
-
% \unprotect
%
% \installcorenamespace {test} \installcommandhandler \??test {test} \??test
@@ -1366,87 +1386,94 @@
%
% \starttext
% \definetest[foo] \definetest[bar][foo] \setuptest[bar][before=indeed]
-% \resettimer \dorecurse{100000}{\TestMeA[bar]} A:\elapsedtime \par % 0.502
-% \resettimer \dorecurse{100000}{\TestMeB[bar]} B:\elapsedtime \par % 0.530
-% \resettimer \dorecurse{100000}{\TestMeC[bar]} C:\elapsedtime \par % 0.487
-% \resettimer \dorecurse{100000}{\TestMeD[bar]} D:\elapsedtime \par % 0.493
+% \testfeatureonce{100000}{\TestMeA[bar]} A:\elapsedtime \par % 0.502
+% \testfeatureonce{100000}{\TestMeB[bar]} B:\elapsedtime \par % 0.530
+% \testfeatureonce{100000}{\TestMeC[bar]} C:\elapsedtime \par % 0.487
+% \testfeatureonce{100000}{\TestMeD[bar]} D:\elapsedtime \par % 0.493
% \stoptext
-% There is no real demand for this ... even if this is twice as fast we only gain
-% a few milliseconds:
-%
-% \unexpanded\def\foo#1{[foo:#1]}
+% There is no real demand for this ... even if this is two to three times as fast we
+% only gain a few milliseconds:
%
-% \installcommalistprocessor {foo} \foo
-% \installcommalistprocessorcommand \processfoolist {foo} \foo
+% \starttyping
+% \unexpanded\def\foo#1{[foo:#1]}
%
-% \commalistprocessor{foo}[a,b,c,d]
-% \processfoolist [a, b, c, d]
+% \installcommalistprocessor {foo} \foo
+% \installcommalistprocessorcommand \processfoolist \foo
%
-% \testfeatureonce{30000}{} \elapsedtime\par % 0.01 -> 0.00
-% \testfeatureonce{30000}{\processfoolist [fixed,middle]} \elapsedtime\par % 0.07 -> 0.06
-% \testfeatureonce{30000}{\commalistprocessor{foo}[fixed,middle]} \elapsedtime\par % 0.09 -> 0.08
-% \testfeatureonce{30000}{\processcommalist [fixed,middle]\foo} \elapsedtime\par % 0.13 -> 0.12
+% \infofont
%
-% For instance the luatex manual only has some 3000 calls. But I keep this around as one
-% never knows when we might need it.
+% \commalistprocessor{foo}[a,b,c,{x,y,z},d]\par
+% \processfoolist[a, b, c, {x,y,z}, d]\par
+% \processcommalist[{x,y,z}]\foo\blank
%
-% \installcorenamespace{commalistprocessor}
-% \installcorenamespace{commalistprocessorcheck}
-% \installcorenamespace{commalistprocessorwrap}
-% \installcorenamespace{commalistprocessorfirst}
-% \installcorenamespace{commalistprocessorcheckspace}
-% \installcorenamespace{commalistprocessorcheckfinish}
-% \installcorenamespace{commalistprocessoraction}
-% \installcorenamespace{commalistprocessorgobblespace}
+% \commalistprocessor{foo}[{x,y,z},a]\par
+% \commalistprocessor{foo}[{x,y,z}]\par
+% \processfoolist[{x,y,z},a]\par
+% \processfoolist[{x,y,z}]\par
+% \processcommalist[{x,y,z}]\foo\blank
%
-% \unexpanded\def\installcommalistprocessor#1#2% 7 macro names overhead
-% {\let\nexttoken\relax
-% %
-% \unexpanded\expandafter\edef\csname\??commalistprocessor#1\endcsname[%
-% {\futurelet\nexttoken\csname\??commalistprocessorcheck#1\endcsname}%
-% %
-% \unexpanded\expandafter\edef\csname\??commalistprocessorcheck#1\endcsname
-% {\noexpand\ifx\nexttoken]%
-% \noexpand\expandafter\noexpand\gobblethreearguments
-% \noexpand\else
-% \noexpand\expandafter\csname\??commalistprocessorwrap#1\endcsname
-% \noexpand\fi
-% \relax}% this one preserved the next {}
-% %
-% \unexpanded\expandafter\edef\csname\??commalistprocessorwrap#1\endcsname##1]%
-% {\csname\??commalistprocessorfirst#1\endcsname##1,]\relax}%
-% %
-% \unexpanded\expandafter\edef\csname\??commalistprocessorfirst#1\endcsname##1% picks up \relax
-% {\csname\??commalistprocessorcheckspace#1\endcsname}%
-% %
-% \unexpanded\expandafter\edef\csname\??commalistprocessorcheckspace#1\endcsname
-% {\noexpand\ifx\nexttoken\noexpand\blankspace
-% \noexpand\expandafter\csname\??commalistprocessorgobblespace#1\endcsname
-% \noexpand\else
-% \noexpand\expandafter\csname\??commalistprocessorcheckfinish#1\endcsname
-% \noexpand\fi}%
-% %
-% \unexpanded\expandafter\edef\csname\??commalistprocessorcheckfinish#1\endcsname
-% {\noexpand\ifx\nexttoken]%
-% \noexpand\expandafter\noexpand\gobbleoneargument
-% \noexpand\else
-% \noexpand\expandafter\csname\??commalistprocessoraction#1\endcsname
-% \noexpand\fi}%
-% %
-% \unexpanded\expandafter\edef\csname\??commalistprocessoraction#1\endcsname##1,%
-% {\noexpand#2{##1}%
-% \futurelet\nexttoken\csname\??commalistprocessorcheckspace#1\endcsname}%
-% %
-% \let\next\:%
-% \unexpanded\edef \:{\csname\??commalistprocessorgobblespace#1\endcsname}%
-% \unexpanded\expandafter\edef\: {\futurelet\nexttoken\csname\??commalistprocessorcheckspace#1\endcsname}%
-% \let\:\next
-% %
-% }
+% \unexpanded\def\foo#1{}
%
-% \unexpanded\def\installcommalistprocessorcommand#1#2#3%
-% {\installcommalistprocessor{#2}{#3}%
-% \expandafter\let\expandafter#1\csname\??commalistprocessor#2\endcsname}
+% \testfeatureonce{400000}{\processfoolist [fixed,middle,bar]} \elapsedtime\quad
+%%\testfeatureonce{400000}{\commalistprocessor{foo}[fixed,middle,bar]} \elapsedtime\quad
+% \testfeatureonce{400000}{\processcommalist [fixed,middle,bar]\foo} \elapsedtime\quad
+% \stoptyping
%
-% \unexpanded\def\commalistprocessor#1{\csname\??commalistprocessor#1\endcsname}
+% For instance the luatex manual only has some 3000 calls. But I keep this around as one
+% never knows when we might need it.
+
+\installcorenamespace{commalistprocessor}
+\installcorenamespace{commalistprocessorwrap}
+\installcorenamespace{commalistprocessorfirst}
+\installcorenamespace{commalistprocessornext}
+\installcorenamespace{commalistprocessoraction}
+
+\installcorenamespace{commalistprocessorcheck}
+\installcorenamespace{commalistprocessorspace}
+\installcorenamespace{commalistprocessorpickup}
+\installcorenamespace{commalistprocessorfinish}
+
+\unexpanded\def\installcommalistprocessor#1#2% 8 macro names overhead
+ {\let\nexttoken\relax
+ \unexpanded\expandafter\edef\csname\??commalistprocessor#1\endcsname[%
+ {\futurelet\nexttoken\csname\??commalistprocessorcheck#1\endcsname}%
+ \unexpanded\expandafter\edef\csname\??commalistprocessorcheck#1\endcsname
+ {\noexpand\ifx\nexttoken]%
+ \noexpand\expandafter\noexpand\gobblethreearguments
+ \noexpand\else
+ \noexpand\expandafter\csname\??commalistprocessorwrap#1\endcsname
+ \noexpand\fi
+ \relax}% this one preserved the next {}
+ \unexpanded\expandafter\edef\csname\??commalistprocessorwrap#1\endcsname##1]%
+ {\csname\??commalistprocessorfirst#1\endcsname##1,]\relax}%
+ \unexpanded\expandafter\edef\csname\??commalistprocessorfirst#1\endcsname##1% picks up \relax
+ {\csname\??commalistprocessornext#1\endcsname}%
+ \unexpanded\expandafter\edef\csname\??commalistprocessornext#1\endcsname
+ {\noexpand\ifx\nexttoken\noexpand\blankspace
+ \noexpand\expandafter\csname\??commalistprocessorspace#1\endcsname
+ \noexpand\else
+ \noexpand\expandafter\csname\??commalistprocessorfinish#1\endcsname
+ \noexpand\fi}%
+ \unexpanded\expandafter\edef\csname\??commalistprocessorfinish#1\endcsname
+ {\noexpand\ifx\nexttoken]%
+ \noexpand\expandafter\noexpand\gobbleoneargument
+ \noexpand\else
+ \noexpand\expandafter\csname\??commalistprocessoraction#1\endcsname
+ \noexpand\fi}%
+ \unexpanded\expandafter\edef\csname\??commalistprocessoraction#1\endcsname##1,%
+ {\noexpand#2{##1}%
+ \futurelet\nexttoken\csname\??commalistprocessornext#1\endcsname}%
+ \let\next\:%
+ \unexpanded\edef \:{\csname\??commalistprocessorspace#1\endcsname}%
+ \unexpanded\expandafter\edef\: {\futurelet\nexttoken\csname\??commalistprocessornext#1\endcsname}%
+ \let\:\next}
+
+\unexpanded\def\installcommalistprocessorcommand#1#2% \processor \action
+ {\edef\p_name{\csstring#2}%
+ \installcommalistprocessor\p_name{#2}%
+ \expandafter\let\expandafter#1\csname\??commalistprocessor\p_name\endcsname}
+
+\unexpanded\def\commalistprocessor#1{\csname\??commalistprocessor#1\endcsname}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mult-aux.mkxl b/Master/texmf-dist/tex/context/base/mkiv/mult-aux.mkxl
new file mode 100644
index 00000000000..3fed8c26e68
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/mult-aux.mkxl
@@ -0,0 +1,1170 @@
+%D \module
+%D [ file=mult-aux,
+%D version=2010.08.2,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Helpers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D A generalization of \MKIV-like inheritance. Just something to play with
+%D (interface might change). The code here evolved in an email exchange between me
+%D and Wolgang Schuster.
+
+\writestatus{loading}{ConTeXt Multilingual Macros / Helpers}
+
+\registerctxluafile{mult-aux}{}
+
+\unprotect
+
+\edef\??empty{\Uchar25} \letvalue{\Uchar25}\empty % hex 19
+
+% \edef\s!parent{\Uchar29} % inlining  is ugly, a tiny bit faster, but neglectable on a run
+
+%D \starttyping
+%D \unprotect
+%D \def\????aa{@@@@aa}
+%D
+%D \installparameterhandler \????aa {whatever}
+%D \installsetuphandler \????aa {whatever}
+%D \installdefinehandler \????aa {whatever} \????aa % #3 == defaultroot
+%D \installfontandcolorhandler\????aa {whatever}
+%D
+%D % \installcommandhandler \????aa {whatever} \????aa
+%D \protect
+%D
+%D % \whateverparameter \c!test
+%D % \whateverparameterhash \c!test
+%D % \namedwhateverparameter \mycurrentwhatever \c!test
+%D % \usewhateverstyleandcolor \c!style \c!color
+%D % \everydefinewhatever (sets \currentwhatever)
+%D % \everypresetwhatever (can be used to reset parameters as we can redefine)
+%D % \everysetupwhatever (sets \currentwhatever)
+%D
+%D \starttext
+%D \definewhatever[first] \definewhatever[second][first]
+%D test: \def\currentwhatever{first} \whateverparameter{method} \par
+%D \setupwhatever [method=unset] test: \def\currentwhatever{first} \whateverparameter{method} \par
+%D \setupwhatever[first] [method=first] test: \def\currentwhatever{first} \whateverparameter{method} \par
+%D test: \def\currentwhatever{second} \whateverparameter{method} \par
+%D \setupwhatever[second][method=second] test: \def\currentwhatever{second} \whateverparameter{method} \par
+%D \stoptext
+%D \stoptyping
+
+% problem: every* could clash
+%
+% There can be less {} in the following definitions if we assume \??aa and \c!somecs
+%
+% todo: \def\detokenized...parameter#1{\detokenize\expandafter\expandafter\expandafter{\csname#1#2\endcsname}} % always root
+%
+% it might be more efficient to do this at the lua and
+%
+% watch the push/pop and predefinition of current .. this is needed for nested
+% definitions and overloaded defines using the predefined one
+
+% todo: add (relaxed) postsetup and postdefine hooks, just after the everys
+
+%D Start of experimental code: especially tables can have many assignments and
+%D although most time is spent in the typesetting anyway, we can squeeze out a
+%D little bit. Of course having 500 rows of 50 columns each with some setting does
+%D not happen that often. One should keep in mind that in the average document
+%D having some 500 assignments is no exception but there we're talking of
+%D neglectable runtime for them. Of course in the definitions below there is no real
+%D gain, only in the generated \setup* commands. Another situation with many
+%D assignments is \XML\ where we can pass attributes and normally don't do testing
+%D of them making sense.
+%
+% \testfeatureonce{100000}{\getparameters[bla][a=111,b=222,c=333]}% 1.669s
+% \testfeatureonce{100000}{\mult_interfaces_get_parameters{bla} [a=111,b=222,c=333]}% 1.529s
+% \testfeatureonce{100000}{\def\m_mult_interfaces_namespace{bla}\mult_interfaces_get_parameters_indeed[a=111,b=222,c=333]}% 1.466s
+
+\let\m_mult_interfaces_namespace\empty
+
+\def\mult_interfaces_get_parameters#1[#2%
+ {\if\noexpand#2]%
+ \expandafter\gobbleoneargument
+ \else
+ \def\m_mult_interfaces_namespace{#1}%
+ \expandafter\mult_interfaces_get_parameters_indeed
+ \fi#2}
+
+\def\mult_interfaces_get_parameters_indeed#1]% namespace already set
+ {\mult_interfaces_get_parameters_item#1,],^^^^0004}
+
+\def\mult_interfaces_get_parameters_item#1,#2% #2 takes space before ,
+ {\if,#1,% dirty trick for testing #1=empty
+ \expandafter\mult_interfaces_get_parameters_item
+ \orelse\if]#1%
+ \expandafter\gobbleoneargument
+ \else
+ \mult_interfaces_get_parameters_assign#1==\empty^^^^0004%
+ % \expandafter\mult_interfaces_get_parameters_item % saves skipping when at end
+ \fi#2}
+
+\def\mult_interfaces_get_parameters_error#1#2% #3%
+ {\mult_interfaces_get_parameters_error_indeed{#1}{#2}%
+ \gobbleoneargument}
+
+\def\mult_interfaces_get_parameters_error_indeed#1#2%
+ {\showassignerror{#2}{\the\inputlineno\space(#1)}}
+
+\def\mult_interfaces_get_parameters_assign#1=#2=#3#4^^^^0004%
+ {\ifx\empty#1\empty
+ \expandafter\mult_interfaces_get_parameters_error
+ \orelse\ifx#3\empty
+ \expandafter\mult_interfaces_get_parameters_error
+ \else
+ \expandafter\mult_interfaces_adef % assignment def
+ \fi
+ \m_mult_interfaces_namespace{#1}{#2}%
+ \doubleexpandafter\mult_interfaces_get_parameters_item}
+
+\startinterface english
+
+ % some 10% faster
+
+ \let\mult_interfaces_get_parameters_error\undefined
+
+ \def\mult_interfaces_get_parameters_error_one#1\csname#2#3\endcsname#4%
+ {\mult_interfaces_get_parameters_error_indeed{#2}{#3}\iftrue}
+
+ \def\mult_interfaces_get_parameters_error_two#1\csname#2#3\endcsname#4%
+ {\mult_interfaces_get_parameters_error_indeed{#2}{#3}}
+
+ \def\mult_interfaces_get_parameters_assign#1=#2=#3#4^^^^0004%
+ {\ifx\empty#1\empty
+ \mult_interfaces_get_parameters_error_one
+ \orelse\ifx#3\empty
+ \mult_interfaces_get_parameters_error_two
+ \else
+ \expandafter\def\csname\m_mult_interfaces_namespace#1\endcsname{#2}%
+ \fi
+ \doubleexpandafter\mult_interfaces_get_parameters_item}
+
+\stopinterface
+
+\newif\ifassignment
+
+\def\mult_check_for_assignment_indeed#1=#2#3^^^^0004%
+ {\if#2^^^^0003\assignmentfalse\else\assignmenttrue\fi}
+
+\def\mult_check_for_assignment_indeed_begin_#1=#2#3^^^^0004%
+ {\if#2^^^^0003}
+
+\def\mult_check_for_assignment#1%
+ {\expandafter\mult_check_for_assignment_indeed\detokenize{#1}=^^^^0003^^^^0003^^^^0004}
+
+% End of experimental code.
+
+%D This can give wrong results when we pass e.g. \type{\c!format}, so either we need
+%D to use the \type {\k!} ones, but these are not defined in the english interface
+%D so from now on we assume that the low level ones are used with the symbolic names
+%D and that only the high level setup commands are used with language specific
+%D interfaces.
+
+% \unexpanded\def\mult_interfaces_let #1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_lete#1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname\empty}
+% \unexpanded\def\mult_interfaces_def #1#2{\expandafter\def \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_edef#1#2{\expandafter\edef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_gdef#1#2{\expandafter\gdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_xdef#1#2{\expandafter\xdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+
+% \startinterface english
+ \unexpanded\def\mult_interfaces_let #1#2{\expandafter \let\csname#1#2\endcsname}
+ \unexpanded\def\mult_interfaces_lete#1#2{\expandafter \let\csname#1#2\endcsname\empty}
+ \unexpanded\def\mult_interfaces_def #1#2{\expandafter \def\csname#1#2\endcsname}
+ \unexpanded\def\mult_interfaces_edef#1#2{\expandafter\edef\csname#1#2\endcsname}
+ \unexpanded\def\mult_interfaces_gdef#1#2{\expandafter\gdef\csname#1#2\endcsname}
+ \unexpanded\def\mult_interfaces_xdef#1#2{\expandafter\xdef\csname#1#2\endcsname}
+% \stopinterface
+
+%D Do, we only interface the assignment definition:
+
+\unexpanded\def\mult_interfaces_adef#1#2{\expandafter\def \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+
+\startinterface english
+ \unexpanded\def\mult_interfaces_adef#1#2{\expandafter \def\csname#1#2\endcsname}
+\stopinterface
+
+% the commented detokenized variant that backtracks ... needs testing usage first
+%
+% \let\whatever\relax
+%
+% \definetest[oeps][bagger=\whatever]
+%
+% \def\currenttest{oeps} \edef\hans{\detokenizedtestparameter{bagger}}\meaning\hans\par
+% \def\currenttest{oeps} \edef\hans{\detokenizedtestparameter{reggab}}\meaning\hans\par
+%
+% slower: \def#3##1{\csname\ifcsname#1#2:##1\endcsname\expandafter\csstring\lastnamedcs\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}%
+
+%D pre-expansion can be a bit faster but handly any effect on a normal run so let's
+%D go for saving some memory
+
+\def\mult_interfaces_detokenize{\expandafter\expandafter\expandafter\detokenize\expandafter\expandafter\expandafter}
+
+\unexpanded\def\mult_interfaces_install_parameter_handler#1#2#3#4#5#6#7#8#9% inlining \csname*\endcsname is more efficient (#3 and #6 only)
+ {\ifx#2\relax\let#2\empty\fi % it is hardly faster but produces less expansion tracing
+ \def#3##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}%
+ \def#4##1##2{\ifcsname##1:##2\endcsname##1:##2\else\expandafter#5\csname##1:\s!parent\endcsname{##2}\fi}%
+ %\def#5##1##2{\ifx##1\relax\??empty\else#4{##1}{##2}\fi}% is {} needed around ##1 ?
+ %\def#5##1##2{\ifx##1\relax\??empty\else#4##1{##2}\fi}% is {} needed around ##1 ?
+ \def#5##1##2{\ifx##1\relax^^^^0019\else#4##1{##2}\fi}% is {} needed around ##1 ?
+ \def#6##1##2{\csname\ifcsname#1##1:##2\endcsname#1##1:##2\else\expandafter#5\csname#1##1:\s!parent\endcsname{##2}\fi\endcsname}%
+ \def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1#2:##1\endcsname}}% always root, no backtrack
+ \def#8##1{\begincsname#1#2:##1\endcsname}
+ \def#9##1##2{\expandafter\let\expandafter##1\csname\ifcsname#1#2:##2\endcsname#1#2:##2\else\expandafter#5\csname#1#2:\s!parent\endcsname{##2}\fi\endcsname}}
+
+\unexpanded\def\installparameterhandler#1#2%
+ {\normalexpanded
+ {\mult_interfaces_install_parameter_handler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname #2parameter\endcsname
+ \expandafter\noexpand\csname do#2parameter\endcsname % or : #2_parameter
+ \expandafter\noexpand\csname do#2parentparameter\endcsname % or : #2_parent_parameter
+ \expandafter\noexpand\csname named#2parameter\endcsname
+ \expandafter\noexpand\csname detokenized#2parameter\endcsname
+ \expandafter\noexpand\csname direct#2parameter\endcsname
+ \expandafter\noexpand\csname letfrom#2parameter\endcsname}} % strict#2parameter is gone
+
+\unexpanded\def\mult_interfaces_install_root_parameter_handler#1#2#3%
+ {\def#2##1{\detokenize\expandafter\expandafter\expandafter{\csname#1:##1\endcsname}}% always root
+ \def#3##1{\begincsname#1:##1\endcsname}}
+
+\unexpanded\def\installrootparameterhandler#1#2%
+ {\normalexpanded
+ {\mult_interfaces_install_root_parameter_handler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname detokenizedroot#2parameter\endcsname
+ \expandafter\noexpand\csname root#2parameter\endcsname}}
+
+\unexpanded\def\mult_interfaces_install_parameter_hash_handler#1#2#3#4#5#6#7#8#9%
+ {\ifx#2\relax\let#2\empty\fi
+ \def#3##1{#1#4{#1#2}{##1}:}% leading #1 was missing .. is this one used?
+ \def#4##1##2{\ifcsname##1:##2\endcsname##1\else\expandafter#5\csname##1:\s!parent\endcsname{##2}\fi}%
+ %\def#5##1##2{\ifx##1\relax\else#4{##1}{##2}\fi}%
+ \def#5##1##2{\ifx##1\relax\else#4##1{##2}\fi}%
+ \def#6{#1#2:}%
+ \def#7##1{#1##1:}%
+ \def#8{\ifx#2\empty\orelse\ifcsname#1#2:\s!parent\endcsname\else\expandafter\let\csname#1#2:\s!parent\endcsname#1\fi}%
+ \unexpanded\def#9##1{\expandafter\edef\csname#1##1:\s!parent\endcsname{#1#2}}}
+
+\unexpanded\def\installparameterhashhandler#1#2%
+ {\expandafter\let\csname#2namespace\endcsname#1%
+ \normalexpanded
+ {\mult_interfaces_install_parameter_hash_handler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname #2parameterhash\endcsname
+ \expandafter\noexpand\csname do#2parameterhash\endcsname % or : #2_parameter_hash
+ \expandafter\noexpand\csname do#2parentparameterhash\endcsname % or : #2_parent_parameter_hash
+ \expandafter\noexpand\csname current#2hash\endcsname
+ \expandafter\noexpand\csname named#2hash\endcsname
+ \expandafter\noexpand\csname check#2parent\endcsname
+ \expandafter\noexpand\csname chaintocurrent#2\endcsname}}
+
+%D In \MKIV\ we can probably use the english variant for all other languages too.
+
+% todo: inline the def/let
+
+% \unexpanded\def\mult_interfaces_install_parameter_set_handler#1#2#3#4#5#6%
+% {\ifx#2\relax\let#2\empty\fi
+% \unexpanded\def#3{\mult_interfaces_def {#1#2:}}% ##1 {##2} (braces are mandate)
+% \unexpanded\def#4{\mult_interfaces_edef{#1#2:}}% ##1 {##2} (braces are mandate)
+% \unexpanded\def#5{\mult_interfaces_let {#1#2:}}% ##1 ##2
+% \unexpanded\def#6{\mult_interfaces_lete{#1#2:}}}% ##1
+%
+% \startinterface english
+ \unexpanded\def\mult_interfaces_install_parameter_set_handler#1#2#3#4#5#6%
+ {\ifx#2\relax\let#2\empty\fi
+ \unexpanded\def#3##1{\expandafter \def\csname#1#2:##1\endcsname}% ##1 {##2} (braces are mandate)
+ \unexpanded\def#4##1{\expandafter\edef\csname#1#2:##1\endcsname}% ##1 {##2} (braces are mandate)
+ \unexpanded\def#5##1{\expandafter \let\csname#1#2:##1\endcsname}% ##1 ##2
+ \unexpanded\def#6##1{\expandafter \let\csname#1#2:##1\endcsname\empty}}% ##1
+% \stopinterface
+
+\unexpanded\def\installparametersethandler#1#2%
+ {\normalexpanded
+ {\mult_interfaces_install_parameter_set_handler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname set#2parameter\endcsname
+ \expandafter\noexpand\csname setexpanded#2parameter\endcsname
+ \expandafter\noexpand\csname let#2parameter\endcsname
+ \expandafter\noexpand\csname reset#2parameter\endcsname}}
+
+\let\dousecurrentstyleparameter\relax
+\let\dousecurrentcolorparameter\relax
+
+\let\currentstyleparameter\empty
+\let\currentcolorparameter\empty
+
+\unexpanded\def\mult_interfaces_install_style_and_color_handler#1#2#3#4%
+ {\unexpanded\def#2##1##2% style color
+ {\edef\currentstyleparameter{#1{##1}}% this name is public (can also set color e.g. in underline)
+ \ifx\currentstyleparameter\empty\else\dousecurrentstyleparameter\fi
+ \edef\currentcolorparameter{#1{##2}}% this name is public (so we do this after the style switch)
+ \ifx\currentcolorparameter\empty\else\dousecurrentcolorparameter\fi}%
+ \unexpanded\def#3##1% style
+ {\edef\currentstyleparameter{#1{##1}}% this name is public
+ \ifx\currentstyleparameter\empty\else\dousecurrentstyleparameter\fi}%
+ \unexpanded\def#4##1% color
+ {\edef\currentcolorparameter{#1{##1}}% this name is public
+ \ifx\currentcolorparameter\empty\else\dousecurrentcolorparameter\fi}}
+
+\unexpanded\def\installstyleandcolorhandler#1#2%
+ {\normalexpanded
+ {\mult_interfaces_install_style_and_color_handler
+ \expandafter\noexpand\csname #2parameter\endcsname
+ \expandafter\noexpand\csname use#2styleandcolor\endcsname % maybe an alias use#2styleandcolorparameters
+ \expandafter\noexpand\csname use#2styleparameter\endcsname
+ \expandafter\noexpand\csname use#2colorparameter\endcsname}}
+
+\let\definehandlerparent\empty
+
+% \def\mult_check_for_parent#1#2#3#4%
+% {\ifcsname#1#4:\s!parent\endcsname \else \ifx#4\empty \else
+% \writestatus\m!system{error: invalid parent #4 for #3, #4 defined too (best check it)}%
+% \expandafter\edef\csname#1#4:\s!parent\endcsname{#2}%
+% \fi \fi}
+
+\def\mult_check_for_parent#1#2#3#4%
+ {\ifcsname#1#4:\s!parent\endcsname\orelse\ifx#4\empty\else
+ \writestatus\m!system{error: invalid parent #4 for #3, #4 defined too (best check it)}%
+ \expandafter\edef\csname#1#4:\s!parent\endcsname{#2}%
+ \fi}
+
+%def\mult_interfaces_chain#1#2{\ifcsname#1#2:\s!chain\endcsname\csname#1#2:\s!chain\endcsname\space\fi}
+%def\getparentchain #1#2{\ifcsname#1#2:\s!chain\endcsname\csname#1#2:\s!chain\endcsname\fi}
+%def\getcurrentparentchain#1#2{\ifcsname#1#2:\s!chain\endcsname\csname#1#2:\s!chain\endcsname\fi}
+
+\def\mult_interfaces_chain#1#2{\ifcsname#1#2:\s!chain\endcsname\lastnamedcs\space\fi}
+\def\getparentchain #1#2{\begincsname#1#2:\s!chain\endcsname}
+\def\getcurrentparentchain#1#2{\begincsname#1#2:\s!chain\endcsname}
+
+\unexpanded\def\mult_interfaces_install_define_handler#1#2#3#4#5#6#7#8#9% why is \expanded still needed in clones
+ {\ifx#4\relax\let#4\empty\fi % see \defineregister
+ \unexpanded\def#2{\dotripleempty#5}%
+ \newtoks#6%
+ \newtoks#7%
+ \unexpanded\def#5[##1][##2][##3]% [child][parent][settings] | [child][settings] | [child][parent] | [child]
+ {\let#9#4%
+ \edef#4{##1}%
+ \ifthirdargument
+ \the#6% predefine
+ \edef#8{##2}%
+ \mult_check_for_parent{#1}{#3}#4#8%
+ \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}%
+ \expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}%
+ \mult_interfaces_get_parameters{#1#4:}[##3]%
+ \orelse\ifsecondargument
+ \the#6% predefine
+ \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##2}=^^^^0003^^^^0003^^^^0004%
+ \edef#8{##2}%
+ \mult_check_for_parent{#1}{#3}#4#8%
+ \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}%
+ \expandafter\edef\csname#1#4:\s!parent\endcsname{#1##2}%
+ \else
+ \let#8\empty
+ \expandafter\edef\csname#1#4:\s!chain\endcsname{##1}%
+ \expandafter\edef\csname#1#4:\s!parent\endcsname{#3}%
+ \mult_interfaces_get_parameters{#1#4:}[##2]%
+ \fi
+ \else
+ \the#6% predefine
+ \let#8\empty
+ \expandafter\edef\csname#1#4:\s!chain\endcsname{##1}%
+ \expandafter\edef\csname#1#4:\s!parent\endcsname{#3}%
+ \fi
+ \the#7%
+ \let#4#9}}
+
+\unexpanded\def\installdefinehandler#1#2#3%
+ {\normalexpanded
+ {\mult_interfaces_install_define_handler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname define#2\endcsname
+ {\noexpand#3}% root
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname define_#2\endcsname % semi-public
+ \expandafter\noexpand\csname everypreset#2\endcsname
+ \expandafter\noexpand\csname everydefine#2\endcsname
+ \expandafter\noexpand\csname current#2parent\endcsname
+ \expandafter\noexpand\csname saved_defined_#2\endcsname}}
+
+\unexpanded\def\mult_interfaces_install_setup_handler#1#2#3#4#5#6#7#8#9%
+ {\ifx#3\relax\let#3\empty\fi
+ \unexpanded\def#2{\dodoubleempty#4}%
+ \unexpanded\def#6{\mult_interfaces_get_parameters{#1#3:}}% no every ! don't change it
+ \newtoks#5%
+ \newtoks#8%
+ \unexpanded\def#4[##1][##2]% maybe helper
+ {\let#7#3%
+ \ifsecondargument
+ \def#9####1% we will have a simple one as well
+ {\edef#3{####1}%
+ \mult_interfaces_get_parameters{#1#3:}[##2]%
+ \the#5}%
+ \processcommalist[##1]#9%
+ \else
+ \let#3\empty
+ \mult_interfaces_get_parameters{#1:}[##1]%
+ \the#5%
+ \fi
+ \let#3#7%
+ \the#8}}
+
+\unexpanded\def\installsetuphandler#1#2%
+ {\normalexpanded
+ {\mult_interfaces_install_setup_handler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname setup#2\endcsname
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname setup_#2\endcsname % semi-public
+ \expandafter\noexpand\csname everysetup#2\endcsname
+ \expandafter\noexpand\csname setupcurrent#2\endcsname
+ \expandafter\noexpand\csname saved_setup_current#2\endcsname
+ \expandafter\noexpand\csname everysetup#2root\endcsname
+ \expandafter\noexpand\csname nested_setup_current#2\endcsname}}
+
+\let\doingrootsetupnamed\plusone % \setuplayout[name][key=value]
+\let\doingrootsetuproot \plustwo % \setuplayout [key=value]
+\let\doingrootsetnamed \plusthree % \setuplayout[name]
+\let\doingrootsetroot \plusfour % \setuplayout
+
+\unexpanded\def\mult_interfaces_install_switch_setup_handler_a#1#2#3#4#5%
+ {\ifx#3\relax\let#3\empty\fi
+ \unexpanded\def#2{\dodoubleempty#4}%
+ \unexpanded\def#5{\mult_interfaces_get_parameters{#1#3:}}}
+
+\unexpanded\def\mult_interfaces_install_switch_setup_handler_b#1#2#3#4#5#6#7#8#9%
+ {\newtoks#5%
+ \newconstant#2%
+ \newtoks#8%
+ \newtoks#9%
+ \ifx#6\relax\let#6\empty\fi
+ \unexpanded\def#4[##1][##2]% maybe helper
+ {\ifsecondargument % no commalist here
+ % \setuplayout[whatever][key=value]
+ \let#7#3%
+ \let#6#3%
+ \edef#3{##1}%
+ #2\doingrootsetupnamed
+ \mult_interfaces_get_parameters{#1#3:}[##2]%
+ \the#5%
+ \ifx#3#6\the#8\fi % only switchsetups if previous == current
+ \let#3#7%
+ \orelse\iffirstargument
+ % \mult_check_for_assignment{##1}%
+ \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##1}=^^^^0003^^^^0003^^^^0004%
+ % \setuplayout[whatever]
+ \let#6#3% % previous becomes current
+ \edef#3{##1}% this will catch reset so one needs to test for it
+ #2\doingrootsetnamed
+ \the#5% % we can check for previous vs current
+ \the#8% switchsetups
+ \else
+ % \setuplayout[key=value]
+ \let#7#3%
+ \let#6#3%
+ \let#3\empty
+ #2\doingrootsetuproot
+ \mult_interfaces_get_parameters{#1:}[##1]%
+ \the#5%
+ \the#8% switchsetups
+ \let#3#7%
+ \fi
+ \else
+ % \setuplayout
+ \let#6#3% % previous becomes current
+ \let#3\empty % current becomes empty
+ #2\doingrootsetroot
+ \the#5%
+ \the#8% switchsetups
+ \fi
+ #2\zerocount % mode is always zero at the end
+ \the#9}}
+
+\unexpanded\def\installswitchsetuphandler#1#2%
+ {\normalexpanded
+ {\mult_interfaces_install_switch_setup_handler_a
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname setup#2\endcsname
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname setup_#2\endcsname % semi-public
+ \expandafter\noexpand\csname setupcurrent#2\endcsname
+ \mult_interfaces_install_switch_setup_handler_b
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname #2setupmode\endcsname
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname setup_#2\endcsname % semi-public
+ \expandafter\noexpand\csname everysetup#2\endcsname
+ \expandafter\noexpand\csname previous#2\endcsname
+ \expandafter\noexpand\csname saved_setup_current#2\endcsname
+ \expandafter\noexpand\csname everyswitch#2\endcsname
+ \expandafter\noexpand\csname everysetup#2root\endcsname}}
+
+\unexpanded\def\mult_interfaces_install_auto_setup_handler#1#2#3#4#5#6#7#8#9%
+ {\ifx#3\relax\let#3\empty\fi
+ \unexpanded\def#2{\dotripleempty#4}%
+ \unexpanded\def#6{\mult_interfaces_get_parameters{#1#3:}}%
+ \newtoks#5%
+ \def#4[##1][##2][##3]%
+ {\let#8#3%
+ \ifthirdargument
+ \def#9####1%
+ {\edef#3{####1}%
+ \expandafter\def\csname#1#3:\s!parent\endcsname{#1##2}%
+ \mult_interfaces_get_parameters{#1#3:}[##3]% always sets parent
+ \the#5}%
+ \processcommalist[##1]#9%
+ \orelse\ifsecondargument
+ \def#9####1%
+ {\edef#3{####1}%
+ #7% checks parent and sets if needed
+ \mult_interfaces_get_parameters{#1#3:}[##2]%
+ \the#5}%
+ \processcommalist[##1]#9%
+ \else
+ \let#3\empty
+ \mult_interfaces_get_parameters{#1:}[##1]%
+ \the#5%
+ \fi
+ \let#3#8}}
+
+\unexpanded\def\installautosetuphandler#1#2%
+ {\normalexpanded
+ {\mult_interfaces_install_auto_setup_handler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname setup#2\endcsname
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname setup_#2\endcsname % semi-public
+ \expandafter\noexpand\csname everysetup#2\endcsname
+ \expandafter\noexpand\csname setupcurrent#2\endcsname
+ \expandafter\noexpand\csname check#2parent\endcsname
+ \expandafter\noexpand\csname saved_setup_current#2\endcsname
+ \expandafter\noexpand\csname nested_setup_current#2\endcsname}}
+
+\unexpanded\def\installbasicparameterhandler#1#2%
+ {\installparameterhandler {#1}{#2}%
+ \installparameterhashhandler{#1}{#2}%
+ \installparametersethandler {#1}{#2}%
+ \installrootparameterhandler{#1}{#2}}
+
+\unexpanded\def\installbasicautosetuphandler#1#2#3% \??self name \??parent (can be \??self)
+ {\installbasicparameterhandler{#1}{#2}%
+ \installautosetuphandler {#1}{#2}}
+
+\unexpanded\def\installstylisticautosetuphandler#1#2#3% \??self name \??parent (can be \??self)
+ {\installbasicparameterhandler{#1}{#2}%
+ \installautosetuphandler {#1}{#2}%
+ \installstyleandcolorhandler {#1}{#2}}
+
+\unexpanded\def\installcommandhandler#1#2#3% \??self name \??parent (can be \??self)
+ {\installbasicparameterhandler{#1}{#2}%
+ \installdefinehandler {#1}{#2}{#3}%
+ \installsetuphandler {#1}{#2}%
+ \installstyleandcolorhandler {#1}{#2}}
+
+\unexpanded\def\installswitchcommandhandler#1#2#3% \??self name \??parent (can be \??self)
+ {\installbasicparameterhandler{#1}{#2}%
+ \installdefinehandler {#1}{#2}{#3}%
+ \installswitchsetuphandler {#1}{#2}%
+ \installstyleandcolorhandler {#1}{#2}}
+
+\unexpanded\def\installautocommandhandler#1#2#3% automatically defined cloned setups
+ {\installbasicparameterhandler{#1}{#2}%
+ \installdefinehandler {#1}{#2}{#3}%
+ \installautosetuphandler {#1}{#2}%
+ \installstyleandcolorhandler {#1}{#2}}
+
+\unexpanded\def\installsimplecommandhandler#1#2#3% no define (experiment) - use \check*parent when defining
+ {\installbasicparameterhandler{#1}{#2}%
+ \installsetuphandler {#1}{#2}%
+ \installstyleandcolorhandler {#1}{#2}}
+
+%D Many mechanisms have some kind of inheritance in place, and these are the
+%D speed||critical ones. Therefore there is no reason to stick to \type {\@@xxkey}
+%D for the sake of performance. For this reason we also provide a direct variant.
+%D This permits a more consistent treatment of namespaces. A \type
+%D {\whateverparameter} call is three times slower and a \type
+%D {\directwhateverparameter} call two times but for some 100K expansions we only
+%D loose some .1 second which is neglectable given the small amount of expansions in
+%D real runs.
+
+%D We don't need colons for such simple cases.
+
+\unexpanded\def\mult_interfaces_install_direct_parameter_handler#1#2#3#4#5%
+%%{\def#3##1{\csname\ifcsname#1##1\endcsname#1##1\else\s!empty\fi\endcsname}%
+ {\def#3##1{\begincsname#1##1\endcsname}%
+ \def#4##1{\detokenize\expandafter\expandafter\expandafter{\csname#1##1\endcsname}}%
+ % \def#4##1{\mult_interfaces_detokenize{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}}%
+ \def#5##1{\begincsname#1##1\endcsname}}
+
+\unexpanded\def\installdirectparameterhandler#1#2%
+ {\normalexpanded
+ {\mult_interfaces_install_direct_parameter_handler
+ {\noexpand#1}%
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname #2parameter\endcsname
+ \expandafter\noexpand\csname detokenized#2parameter\endcsname
+ \expandafter\noexpand\csname direct#2parameter\endcsname}}
+
+\unexpanded\def\mult_interfaces_install_direct_setup_handler#1#2#3#4#5%
+ {\unexpanded\def#2{\dosingleempty#3}%
+ \newtoks#5%
+ \def#3[##1]{\mult_interfaces_get_parameters#1[##1]\the#5}%
+ \def#4{\mult_interfaces_get_parameters#1}}
+
+\unexpanded\def\installdirectsetuphandler#1#2%
+ {\normalexpanded
+ {\mult_interfaces_install_direct_setup_handler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname setup#2\endcsname
+ \expandafter\noexpand\csname setup_#2\endcsname % semi-public
+ \expandafter\noexpand\csname setupcurrent#2\endcsname % no \every (we use 'current' for consistency)
+ \expandafter\noexpand\csname everysetup#2\endcsname}}
+
+% \unexpanded\def\mult_interfaces_install_direct_parameter_set_handler#1#2#3#4#5%
+% {\unexpanded\def#2{\mult_interfaces_def #1}%
+% \unexpanded\def#3{\mult_interfaces_edef#1}%
+% \unexpanded\def#4{\mult_interfaces_let #1}%
+% \unexpanded\def#5{\mult_interfaces_let #1\empty}}%
+
+% \startinterface english
+ \unexpanded\def\mult_interfaces_install_direct_parameter_set_handler#1#2#3#4#5%
+ {\unexpanded\def#2##1{\expandafter \def\csname#1##1\endcsname}%
+ \unexpanded\def#3##1{\expandafter\edef\csname#1##1\endcsname}%
+ \unexpanded\def#4##1{\expandafter \let\csname#1##1\endcsname}%
+ \unexpanded\def#5##1{\expandafter \let\csname#1##1\endcsname\empty}}%
+% \stopinterface
+
+\unexpanded\def\installdirectparametersethandler#1#2%
+ {\normalexpanded
+ {\mult_interfaces_install_direct_parameter_set_handler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname set#2parameter\endcsname
+ \expandafter\noexpand\csname setexpanded#2parameter\endcsname
+ \expandafter\noexpand\csname let#2parameter\endcsname
+ \expandafter\noexpand\csname reset#2parameter\endcsname}}
+
+\let\installdirectstyleandcolorhandler\installstyleandcolorhandler
+
+\unexpanded\def\installdirectcommandhandler#1#2%
+ {\installdirectparameterhandler {#1}{#2}%
+ \installdirectsetuphandler {#1}{#2}%
+ \installdirectparametersethandler {#1}{#2}%
+ \installdirectstyleandcolorhandler{#1}{#2}}
+
+\unexpanded\def\installsetuponlycommandhandler#1#2%
+ {\installdirectparameterhandler{#1}{#2}%
+ \installdirectsetuphandler {#1}{#2}%
+ }% maybe \installdirectparametersethandler {#1}{#2}%
+
+% Experiment:
+
+% \installcorenamespace {one}
+% \installcorenamespace {two}
+%
+% \installcommandhandler \??one {one} \??one
+% \installcommandhandler \??two {two} \??two
+%
+% \defineone[test] \setupone[test][alpha=first]
+% \definetwo[test] \setuptwo[test][beta=second]
+%
+% \protect
+%
+% \def\currentone{test}
+% \def\currenttwo{test}
+%
+% \relateparameterhandlers {two} {test} {one} {test}
+%
+% yes:\oneparameter{alpha}\par
+% nop:\oneparameter{beta}\par
+% yes:\twoparameter{alpha}\par
+% yes:\twoparameter{beta}\par
+
+\unexpanded\def\relateparameterhandlers#1#2#3#4% {from} {instance} {to} {instance}
+ {\expandafter\edef\csname\csname#1namespace\endcsname#2:\s!parent\endcsname{\csname#3namespace\endcsname#4}}
+
+\unexpanded\def\relateparameterhandlersbyns#1#2#3#4% {from} {instance} {to} {instance}
+ {\expandafter\edef\csname#1#2:\s!parent\endcsname{#3#4}}
+
+%D Here is another experiment:
+
+\unexpanded\def\installactionhandler#1%
+ {\normalexpanded
+ {\mult_interfaces_install_action_handler
+ {#1}%
+ \expandafter\noexpand\csname current#1\endcsname
+ \expandafter\noexpand\csname setupcurrent#1\endcsname
+ \expandafter\noexpand\csname #1_action\endcsname}}
+
+% \unexpanded\def\mult_interfaces_install_action_handler#1#2#3#4%
+% {\unexpanded\expandafter\def\csname#1\endcsname{\dodoubleempty#4}%
+% \unexpanded\def#4[##1][##2]%
+% {\begingroup
+% \ifsecondargument
+% \edef#2{##1}%
+% #3[##2]%
+% \else\iffirstargument
+% \doifelseassignment{##1}
+% {\let#2\empty
+% #3[##1]}%
+% {\edef#2{##1}}%
+% \else
+% \let#2\empty
+% \fi\fi
+% \directsetup{handler:action:#1}%
+% \endgroup}}
+
+\unexpanded\def\mult_interfaces_install_action_handler#1#2#3#4%
+ {\unexpanded\expandafter\def\csname#1\endcsname{\dodoubleempty#4}%
+ \unexpanded\def#4[##1][##2]%
+ {\begingroup
+ \ifsecondargument
+ \edef#2{##1}%
+ #3[##2]%
+ \orelse\iffirstargument
+ \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##1}=^^^^0003^^^^0003^^^^0004%
+ \edef#2{##1}%
+ \else
+ \let#2\empty
+ #3[##1]%
+ \fi
+ \else
+ \let#2\empty
+ \fi
+ \directsetup{handler:action:#1}%
+ \endgroup}}
+
+% First we had, in tune with the regular system variables:
+%
+% \starttyping
+% \unexpanded\def\installnamespace#1{\setvalue{????#1}{@@@@#1}}
+% \stoptyping
+%
+% The following variant is nicer and in principle faster but that gets unnoticed
+% unless lots of expansion happens. Also, we can use long tags but the internal
+% expansion will be relatively small (and unlikely more than 4 characters). For
+% instance, \??xx used to expand to @@xx but now becomes for instance 123::. This
+% is one character more but in quite some cases we had : after such a tag in the
+% old situation. In the new situation we create more namespaces and don't need that
+% : any more, so we end up with on the average the same amount of tokens and
+% definitely less when we consider cases like \??xx:\c!align: which now is just
+% \??somealign and therefore has length 5 now (instead of 4+1+5+1=10).
+%
+% Eventualy we will have a verbose \blablanamespace and the difference between core
+% and regular can go ... after all, \xxxparameter can already clash between the two
+% prefix groups .. if users use this mechanism a lot they should use verbose names
+% anyway (the old two character names were mostly an optimization as they also
+% expanded to these characters).
+
+% todo: register namespaces at lua end for logging and reverse resolve
+% todo: move this to syst-ini so that we can use it real early
+
+\newcount\c_mult_interfaces_n_of_namespaces
+
+%def\v_interfaces_prefix_template{\number \c_mult_interfaces_n_of_namespaces>}
+%def\v_interfaces_prefix_template{\characters\c_mult_interfaces_n_of_namespaces>}
+
+%def\v_interfaces_prefix_template % consistently %03i>
+% {\ifnum\c_mult_interfaces_n_of_namespaces<\plusten00\else\ifnum\c_mult_interfaces_n_of_namespaces<\plushundred0\fi\fi
+% \number\c_mult_interfaces_n_of_namespaces>}
+
+\def\v_interfaces_prefix_template
+ {\number\c_mult_interfaces_n_of_namespaces>}
+
+\unexpanded\def\installnamespace#1% for modules and users
+ {\ifcsname ????#1\endcsname
+ \writestatus\m!system{duplicate user namespace '#1'}\wait
+ \else
+ \global\advance\c_mult_interfaces_n_of_namespaces\plusone
+ \expandafter\edef\csname ????#1\endcsname{\v_interfaces_prefix_template}%
+ \fi}
+
+\unexpanded\def\installcorenamespace#1%
+ {\ifcsname ??#1\endcsname
+ \writestatus\m!system{duplicate core namespace '#1'}\wait
+ \else
+ \global\advance\c_mult_interfaces_n_of_namespaces\plusone
+ \expandafter\edef\csname ??#1\endcsname{\v_interfaces_prefix_template}%
+ \clf_registernamespace\c_mult_interfaces_n_of_namespaces{#1}%
+ \fi}
+
+\def\mult_interfaces_get_parameters_error_indeed#1#2%
+ {\clf_showassignerror{#1}{#2}\inputlineno}
+
+% We install two core namespaces here, as we want nice error messages. Maybe
+% we will reserve the first 9.
+
+\installcorenamespace{fontinstanceready}
+\installcorenamespace{fontinstancebasic}
+\installcorenamespace{fontinstanceclass}
+
+%D The next one is handy for local assignments.
+
+\installcorenamespace{dummy}
+
+\letvalue\??dummy\empty
+
+ \def\dummyparameter #1{\begincsname\??dummy#1\endcsname}
+ \def\directdummyparameter #1{\begincsname\??dummy#1\endcsname}
+\unexpanded\def\setdummyparameter #1{\expandafter\def\csname\??dummy#1\endcsname}
+\unexpanded\def\setexpandeddummyparameter#1{\expandafter\edef\csname\??dummy#1\endcsname}
+\unexpanded\def\letdummyparameter #1{\expandafter\let\csname\??dummy#1\endcsname}
+
+% \unexpanded\def\getdummyparameters
+% {\mult_interfaces_get_parameters\??dummy}
+
+\unexpanded\def\getdummyparameters[#1%
+ {\if\noexpand#1]%
+ \expandafter\gobbleoneargument
+ \else
+ \let\m_mult_interfaces_namespace\??dummy
+ \expandafter\mult_interfaces_get_parameters_indeed
+ \fi#1}
+
+\mult_interfaces_install_style_and_color_handler
+ \directdummyparameter
+ \usedummystyleandcolor
+ \usedummystyleparameter
+ \usedummycolorparameter
+
+% Maybe a \definecorenamespace[name][directparameter,directsetup][parent] but we
+% don't gain much. Actually we might just inline all definitions.
+
+% \enabletrackers[interfaces.namespaces,context.flush]
+%
+% \definenamespace
+% [xy]
+% [type=module,
+% comment=test module,
+% version=1,
+% name=test,
+% style=yes,
+% command=yes,
+% setup=list,
+% set=yes,
+% parent=xy]
+%
+% \unprotect
+% \getparameters
+% [\????xy]
+% [text=]
+% \protect
+%
+% \definetest[one]
+%
+% \starttext
+%
+% “\testparameter{text}â€
+%
+% \setuptest[text=foo]
+%
+% “\testparameter{text}â€
+%
+% \setuptest[one][text=bar]
+%
+% “\testparameter{text}â€
+%
+% \stoptext
+%
+% This is a user (module) command:
+
+\unexpanded\def\definenamespace
+ {\dodoubleargument\mult_interfaces_define_name_space}
+
+\def\mult_interfaces_define_name_space[#1][#2]% namespace settings
+ {\clf_definenamespace{#1}{#2}}
+
+\def\listnamespaces
+ {\clf_listnamespaces}
+
+%D Helper:
+%D
+%D \starttyping
+%D \showparentchain{@@am}{left}
+%D \stoptyping
+
+\unexpanded\def\showparentchain#1#2%
+ {\writestatus\m!system{chain: [ \mult_interfaces_show_parent_chain{#1#2}]}}
+
+% \def\mult_interfaces_show_parent_chain#1%
+% {#1 => %
+% \ifcsname#1:\s!parent\endcsname
+% \expandafter\mult_interfaces_show_parent_chain\csname#1:\s!parent\endcsname
+% \fi}
+
+\def\mult_interfaces_show_parent_chain#1%
+ {#1 => %
+ \ifcsname#1:\s!parent\endcsname
+ %\expandafter\mult_interfaces_show_parent_chain\csname#1:\s!parent\endcsname
+ \expandafter\mult_interfaces_show_parent_chain\lastnamedcs
+ \fi}
+
+%D Another helper (needs to be applied):
+
+\unexpanded\def\doifelsecommandhandler#1#2% namespace name
+ {\ifcsname#1#2:\s!parent\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifcommandhandlerelse\doifelsecommandhandler
+
+\unexpanded\def\doifcommandhandler#1#2% namespace name
+ {\ifcsname#1#2:\s!parent\endcsname
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\unexpanded\def\doifnotcommandhandler#1#2% namespace name
+ {\ifcsname#1#2:\s!parent\endcsname
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\let\doifcommandhandlerelse\doifelsecommandhandler
+
+% another set of (fast) helpers (grep for usage):
+
+\def\expandnamespaceparameter#1#2#3% \??xx \getp \c!xx \v!yy
+ {\csname#1\ifcsname#1\expandafter\expandafter\expandafter\mult_aux_expand_namespace_parameter#2#3}
+
+\def\mult_aux_expand_namespace_parameter#1#2% \cs \v!yy
+ {#1\endcsname#1\else#2\fi\endcsname}
+
+\def\expandnamespacemacro#1#2#3% \??xx \some_edefed_cs \c!yy
+ {\csname#1\ifcsname#1#2\endcsname#2\else#3\fi\endcsname}
+
+\def\expandnamespacevalue#1#2% \??xx {...} \c!yy == optimized \expandcheckedcsname
+ {\csname#1\ifcsname#1\normalexpanded{\noexpand\syst_helpers_expand_checked_value{#2}}}
+
+\def\syst_helpers_expand_checked_value#1#2%
+ {#1\endcsname#1\else#2\fi\endcsname}
+
+%D Conventions:
+%D
+%D \starttyping
+%D \newcount \c_class_whatever
+%D \newconditional \c_class_whatever
+%D \newconstant \c_class_whatever
+%D \newdimen \d_class_whatever
+%D \newskip \s_class_whatever
+%D \newmuskip \s_class_whatever
+%D \newbox \b_class_whatever
+%D \newtoks \t_class_whatever
+%D
+%D \edef\p_class_whatever{\classparameter\c!whatever}
+%D \edef\m_class_whatever{whatever}
+%D \stoptyping
+
+% experiment: in principle this is faster but not that noticeable as we don't do that
+% many assignments and mechanism that do are also slow; the advantage is mostly nicer
+% in tracing
+
+\def\s!simple{simple}
+\def\s!single{single}
+\def\s!double{double}
+\def\s!triple{triple}
+
+\let\c_mult_set\relax
+
+\unexpanded\def\mult_interfaces_install_definition_set#1#2#3#4#5#6#7%
+ {\newcount#3%
+ \let#6\empty
+ \unexpanded\def#2%
+ {\expandafter\let\expandafter\c_mult_set\csname #1_t_#6\endcsname
+ \ifx\c_mult_set\relax
+ \expandafter\newtoks\c_mult_set
+ \expandafter\let\csname #1_t_#6\endcsname\c_mult_set
+ \fi}
+ \unexpanded\def#4##1%
+ {\pushmacro#6%
+ \advance#3\plusone
+ \edef#6{##1}%
+ \unprotect}%
+ \unexpanded\def#5%
+ {\protect
+ \advance#3\minusone
+ \popmacro#6}%
+ \unexpanded\def#7##1%
+ {\edef#6{##1}%
+ #2%
+ \the\c_mult_set\relax}}
+
+\unexpanded\def\installdefinitionset#1#2%
+ {\normalexpanded
+ {\mult_interfaces_install_definition_set
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname set_#2_toks\endcsname
+ \expandafter\noexpand\csname #2_nesting_depth\endcsname
+ \expandafter\noexpand\csname push#2\endcsname
+ \expandafter\noexpand\csname pop#2\endcsname
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname use#2\endcsname}}
+
+\unexpanded\def\mult_interfaces_install_definition_set_member#1#2#3#4#5#6#7#8#9% no everysetups etc
+ {\let#5#2%
+ \unexpanded\def#2%
+ {\ifcase#4\relax\expandafter#5\else\expandafter#6\fi}%
+ \unexpanded\def#6%
+ {\dodoubleempty#7}%
+ \unexpanded\def#7[##1][##2]%
+ {\ifsecondargument
+ %#3\c_mult_set\expandafter{\the\c_mult_set#9[##1][##2]}%
+ #3\toksapp\c_mult_set{#9[##1][##2]}%
+ \orelse\iffirstargument
+ %#3\c_mult_set\expandafter{\the\c_mult_set#8[##1]}%
+ #3\toksapp\c_mult_set{#8[##1]}%
+ \fi}}
+
+\unexpanded\def\installdefinitionsetmember#1#2#3#4%
+ {\normalexpanded
+ {\mult_interfaces_install_definition_set_member
+ {\noexpand#3}% \??aa
+ \expandafter\noexpand\csname setup#4\endcsname
+ \expandafter\noexpand\csname set_#2_toks\endcsname
+ \expandafter\noexpand\csname #2_nesting_depth\endcsname
+ \expandafter\noexpand\csname normal_setup_#4\endcsname
+ \expandafter\noexpand\csname delayed_setup_#4\endcsname
+ \expandafter\noexpand\csname do_delayed_setup_#4\endcsname
+ \expandafter\noexpand\csname setup#4_\s!single\endcsname
+ \expandafter\noexpand\csname setup#4_\s!double\endcsname}}
+
+%D Another experiment:
+
+\unexpanded\def\mult_interfaces_install_parent_injector#1#2#3#4%
+ {\unexpanded\def#4##1%
+ {\ifx#3\empty
+ \expandafter\def\csname#1#2:\s!parent\endcsname{#1##1}%
+ \fi}}
+
+\unexpanded\def\installparentinjector#1#2%
+ {\normalexpanded{\mult_interfaces_install_parent_injector
+ {\noexpand#1}%
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname current#2parent\endcsname
+ \expandafter\noexpand\csname inject#2parent\endcsname}}
+
+% Faster but not used that much to make a dent in performance. But, because it's
+% cleaner anyway and also gives less tracing, we apply it a few times.
+
+\unexpanded\def\syst_helpers_install_macro_stack#1#2#3%
+ {\xdef\m_syst_helpers_push_macro{\csstring#1}%
+ \ifcsname#3\m_syst_helpers_push_macro\endcsname\else
+ \expandafter\newcount\csname#3\m_syst_helpers_push_macro\endcsname
+ \expandafter\edef\csname push_macro_\m_syst_helpers_push_macro\endcsname
+ {\noexpand\expandafter\glet
+ \noexpand\csname\m_syst_helpers_push_macro\noexpand\the\csname#3\m_syst_helpers_push_macro\endcsname\endcsname
+ \noexpand#1%
+ \global\advance\csname#3\m_syst_helpers_push_macro\endcsname\plusone}%
+ \expandafter\edef\csname pop_macro_\m_syst_helpers_push_macro\endcsname
+ {\global\advance\csname#3\m_syst_helpers_push_macro\endcsname\minusone
+ \noexpand\expandafter#2%
+ \noexpand\expandafter\noexpand#1%
+ \noexpand\csname\m_syst_helpers_push_macro\noexpand\the\csname#3\m_syst_helpers_push_macro\endcsname\endcsname}%
+ \fi}
+
+\unexpanded\def\installmacrostack #1{\syst_helpers_install_macro_stack#1\let \??localpushedmacro }
+\unexpanded\def\installglobalmacrostack#1{\syst_helpers_install_macro_stack#1\glet\??globalpushedmacro}
+
+% \unprotect
+%
+% \installcorenamespace {test} \installcommandhandler \??test {test} \??test
+% \unexpanded\def\TestMeA[#1]%
+% {\edef\currenttest{#1}
+% \edef\p_before{\testparameter\c!before}%
+% \ifx\p_before\empty \relax \else \relax \fi}
+% \unexpanded\def\TestMeB[#1]%
+% {\edef\currenttest{#1}
+% \doifelsenothing{\testparameter\c!before}\relax\relax}
+% \unexpanded\def\TestMeC[#1]%
+% {\edef\currenttest{#1}
+% \expandafter\expandafter\expandafter\ifx\testparameter\c!before\empty \relax \else \relax \fi}
+% \unexpanded\def\TestMeD[#1]%
+% {\edef\currenttest{#1}
+% \doubleexpandafter\ifx\testparameter\c!before\empty \relax \else \relax \fi}
+%
+% \protect
+%
+% \starttext
+% \definetest[foo] \definetest[bar][foo] \setuptest[bar][before=indeed]
+% \testfeatureonce{100000}{\TestMeA[bar]} A:\elapsedtime \par % 0.502
+% \testfeatureonce{100000}{\TestMeB[bar]} B:\elapsedtime \par % 0.530
+% \testfeatureonce{100000}{\TestMeC[bar]} C:\elapsedtime \par % 0.487
+% \testfeatureonce{100000}{\TestMeD[bar]} D:\elapsedtime \par % 0.493
+% \stoptext
+
+% There is no real demand for this ... even if this is two to three times as fast we
+% only gain a few milliseconds:
+%
+% \starttyping
+% \unexpanded\def\foo#1{[foo:#1]}
+%
+% \installcommalistprocessor {foo} \foo
+% \installcommalistprocessorcommand \processfoolist \foo
+%
+% \infofont
+%
+% \commalistprocessor{foo}[a,b,c,{x,y,z},d]\par
+% \processfoolist[a, b, c, {x,y,z}, d]\par
+% \processcommalist[{x,y,z}]\foo\blank
+%
+% \commalistprocessor{foo}[{x,y,z},a]\par
+% \commalistprocessor{foo}[{x,y,z}]\par
+% \processfoolist[{x,y,z},a]\par
+% \processfoolist[{x,y,z}]\par
+% \processcommalist[{x,y,z}]\foo\blank
+%
+% \unexpanded\def\foo#1{}
+%
+% \testfeatureonce{400000}{\processfoolist [fixed,middle,bar]} \elapsedtime\quad
+%%\testfeatureonce{400000}{\commalistprocessor{foo}[fixed,middle,bar]} \elapsedtime\quad
+% \testfeatureonce{400000}{\processcommalist [fixed,middle,bar]\foo} \elapsedtime\quad
+% \stoptyping
+%
+% For instance the luatex manual only has some 3000 calls. But I keep this around as one
+% never knows when we might need it.
+
+\installcorenamespace{commalistprocessor}
+\installcorenamespace{commalistprocessorwrap}
+\installcorenamespace{commalistprocessorfirst}
+\installcorenamespace{commalistprocessornext}
+\installcorenamespace{commalistprocessoraction}
+
+\unexpanded\def\installcommalistprocessor#1#2% 5 macro names overhead
+ {\unexpanded\expandafter\edef\csname\??commalistprocessor#1\endcsname[%
+ % {\noexpand\futureexpandis]%
+ % \noexpand\gobbleoneargument
+ % \csname\??commalistprocessorpickup#1\endcsname}
+ %\unexpanded\expandafter\edef\csname\??commalistprocessorpickup#1\endcsname
+ {\csname\??commalistprocessorwrap#1\endcsname\relax}% \relax preserves {}
+ \unexpanded\expandafter\edef\csname\??commalistprocessorwrap#1\endcsname##1]%
+ {\csname\??commalistprocessorfirst#1\endcsname##1,]}
+ \unexpanded\expandafter\edef\csname\??commalistprocessorfirst#1\endcsname\relax
+ {\csname\??commalistprocessornext#1\endcsname}%
+ \unexpanded\expandafter\edef\csname\??commalistprocessornext#1\endcsname
+ {\noexpand\futureexpandis]%
+ \noexpand\gobbleoneargument
+ \csname\??commalistprocessoraction#1\endcsname}
+ \unexpanded\expandafter\edef\csname\??commalistprocessoraction#1\endcsname##1,%
+ {\noexpand#2{##1}%
+ \csname\??commalistprocessornext#1\endcsname}}
+
+\unexpanded\def\installcommalistprocessorcommand#1#2% \processor \action
+ {\edef\p_name{\csstring#2}%
+ \installcommalistprocessor\p_name{#2}%
+ \expandafter\let\expandafter#1\csname\??commalistprocessor\p_name\endcsname}
+
+\unexpanded\def\commalistprocessor#1{\csname\??commalistprocessor#1\endcsname}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mult-chk.mkiv b/Master/texmf-dist/tex/context/base/mkiv/mult-chk.mkiv
index b3005b012cf..83b82242e67 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mult-chk.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/mult-chk.mkiv
@@ -62,7 +62,7 @@
\def\mult_checkers_get_checked_parameters_nop_indeed#1#2]% needs checking with adapted syst-aux.mkiv
{\def\syst_helpers_get_parameters_assign{\syst_helpers_get_parameters_assign_indeed#1}% will change
- \syst_helpers_process_comma_item#2,],\_e_o_p_}
+ \syst_helpers_process_comma_item#2,],^^^^0004}
\unexpanded\def\disablecheckparameters{\let\getcheckedparameters\mult_checkers_get_checked_parameters_nop}
\unexpanded\def\enablecheckparameters {\let\getcheckedparameters\mult_checkers_get_checked_parameters_yes}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mult-def.lua b/Master/texmf-dist/tex/context/base/mkiv/mult-def.lua
index e03a82a765f..1e22aaa865c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mult-def.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/mult-def.lua
@@ -7337,6 +7337,15 @@ return {
["compressseparator"]={
["en"]="compressseparator",
},
+ ["compressdistance"]={
+ ["en"]="compressdistance",
+ },
+ ["compressmethod"]={
+ ["en"]="compressmethod",
+ },
+ ["compressstopper"]={
+ ["en"]="compressstopper",
+ },
["concerns"]={
["en"]="concerns",
["nl"]="betreft",
@@ -8312,6 +8321,16 @@ return {
["hidenumber"]={
["en"]="hidenumber",
},
+ ["horizontal"]={
+ ["cs"]="horizontalne",
+ ["de"]="horizontal",
+ ["en"]="horizontal",
+ ["fr"]="horizontale",
+ ["it"]="orizzontale",
+ ["nl"]="horizontaal",
+ ["pe"]="اÙÙ‚ÛŒ",
+ ["ro"]="orizontal",
+ },
["hoffset"]={
["cs"]="hoffset",
["de"]="hoffset",
@@ -9089,6 +9108,18 @@ return {
["en"]="middlecommand",
["nl"]="middencommando",
},
+ ["middlecolor"]={
+ ["en"]="middlecolor",
+ ["nl"]="middenkleur",
+ },
+ ["middlestyle"]={
+ ["en"]="middlestyle",
+ ["nl"]="middenletter",
+ },
+ ["middlewidth"]={
+ ["en"]="middlewidth",
+ ["nl"]="middenbreedte",
+ },
["middlespeech"]={
["cs"]="middlespeech",
["de"]="middlespeech",
@@ -9551,6 +9582,10 @@ return {
["en"]="order",
["nl"]="volgorde",
},
+ ["anchoring"]={
+ ["en"]="anchoring",
+ ["nl"]="verankering",
+ },
["orientation"]={
["cs"]="orientation",
["de"]="orientation",
@@ -9594,6 +9629,10 @@ return {
["pe"]="شماره‌خود",
["ro"]="numarpropriu",
},
+ ["packcriterium"]={
+ ["en"]="packcriterium",
+ ["nl"]="opelkaarcriterium",
+ },
["page"]={
["cs"]="stranka",
["de"]="seite",
@@ -9650,6 +9689,10 @@ return {
["pageleft"]={
["en"]="pageleft",
},
+ ["pagemethod"]={
+ ["en"]="pagemethod",
+ ["nl"]="paginamethode",
+ },
["pagenumber"]={
["cs"]="cislostranky",
["de"]="seitennummer",
@@ -11371,6 +11414,16 @@ return {
["en"]="vector",
["nl"]="vector",
},
+ ["vertical"]={
+ ["cs"]="vertikalne",
+ ["de"]="vertikal",
+ ["en"]="vertical",
+ ["fr"]="verticale",
+ ["it"]="verticale",
+ ["nl"]="vertikaal",
+ ["pe"]="عمودی",
+ ["ro"]="vertical",
+ },
["veroffset"]={
["cs"]="offsethlavicky",
["de"]="kopfoffset",
@@ -11476,6 +11529,10 @@ return {
["xmlsetup"]={
["en"]="xmlsetup",
},
+ ["xanchor"]={
+ ["en"]="xanchor",
+ ["nl"]="xanker",
+ },
["xoffset"]={
["cs"]="xoffset",
["de"]="xoffset",
@@ -11526,6 +11583,10 @@ return {
["pe"]="ymax",
["ro"]="ymax",
},
+ ["yanchor"]={
+ ["en"]="yanchor",
+ ["nl"]="yanker",
+ },
["yoffset"]={
["cs"]="yoffset",
["de"]="yoffset",
@@ -13119,6 +13180,9 @@ return {
["compressseparator"]={
["en"]="compressseparator",
},
+ ["compressstopper"]={
+ ["en"]="compressstopper",
+ },
["concept"]={
["cs"]="koncept",
["de"]="konzept",
@@ -13368,6 +13432,10 @@ return {
["pe"]="ته‌نوشت",
["ro"]="endnote",
},
+ ["textnote"]={
+ ["en"]="textnote",
+ ["nl"]="tekstnoot",
+ },
["enumeration"]={
["cs"]="vycet",
["de"]="nummerierung",
@@ -13902,6 +13970,10 @@ return {
["pe"]="آویزان",
["ro"]="suspendat",
},
+ ["hangingboth"]={
+ ["en"]="hangingboth",
+ ["nl"]="beidehangend",
+ },
["head"]={
["cs"]="hlavicka",
["de"]="kopf",
@@ -14276,6 +14348,10 @@ return {
["pe"]="درون‌متن",
["ro"]="intext",
},
+ ["headintext"]={
+ ["en"]="headintext",
+ ["nl"]="kopintekst",
+ },
["intro"]={
["cs"]="uvod",
["de"]="intro",
@@ -15154,6 +15230,10 @@ return {
["pe"]="بدون‌نشانه‌گذاری",
["ro"]="faramarcare",
},
+ ["nomenubar"]={
+ ["en"]="nomenubar",
+ ["nl"]="geenmenubalk",
+ },
["none"]={
["cs"]="zadny",
["de"]="kein",
@@ -16097,6 +16177,10 @@ return {
["selectfont"]={
["en"]="selectfont",
},
+ ["separator"]={
+ ["en"]="separator",
+ ["nl"]="scheider",
+ },
["september"]={
["cs"]="zari",
["de"]="september",
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mult-def.mkiv b/Master/texmf-dist/tex/context/base/mkiv/mult-def.mkiv
index d9404bc1625..78fcdf667dd 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mult-def.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/mult-def.mkiv
@@ -37,9 +37,9 @@
% some left-overs
-\def\c!HL {HL}
-\def\c!VL {VL}
-\def\c!NL {NL}
+\def\c!HL{HL}
+\def\c!VL{VL}
+\def\c!NL{NL}
% stop todo
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mult-fun.lua b/Master/texmf-dist/tex/context/base/mkiv/mult-fun.lua
index 0776f36b4b2..99700f47458 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mult-fun.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/mult-fun.lua
@@ -17,6 +17,26 @@ return {
"drawoptionsfactor",
"dq", "sq",
"crossingscale", "crossingoption",
+ "contextlmtxmode",
+ --
+ -- for the moment we put these here as they need to stand out
+ --
+ "getparameters",
+ "presetparameters",
+ "hasparameter",
+ "hasoption",
+ "getparameter",
+ "getparameterdefault",
+ "getparametercount",
+ "getmaxparametercount",
+ "getparameterpath",
+ "getparameterpen",
+ "getparametertext",
+ -- "getparameteroption",
+ "applyparameters",
+ "pushparameters",
+ "popparameters",
+ "definecolor",
},
commands = {
"loadfile", "loadimage", "loadmodule",
@@ -65,7 +85,7 @@ return {
"withmask", "bitmapimage",
"colordecimals", "ddecimal", "dddecimal", "ddddecimal", "colordecimalslist",
"textext", "thetextext", "rawtextext", "textextoffset", "texbox", "thetexbox", "rawtexbox", "istextext",
- "notcached",
+ "notcached", "keepcached",
"verbatim",
"thelabel", "label",
"autoalign",
@@ -136,7 +156,7 @@ return {
"passvariable", "passarrayvariable", "tostring", "topair", "format", "formatted", "quotation", "quote",
"startpassingvariable", "stoppassingvariable",
--
- "eofill", "eoclip", "nofill", "fillup", "eofillup",
+ "eofill", "eoclip", "nofill", "dofill", "fillup", "eofillup", "nodraw", "dodraw",
"area",
--
"addbackground",
@@ -165,6 +185,8 @@ return {
--
"inpath", "pointof", "leftof", "rightof",
--
+ "utflen", "utfsub",
+ --
"newhash", "disposehash", "inhash", "tohash",
--
"isarray", "prefix", "isobject",
@@ -172,5 +194,7 @@ return {
"comment", "report", "lua", "mp", "MP", "luacall",
--
"mirrored", "mirroredabout",
+ --
+ "scriptindex",
},
}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mult-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/mult-ini.mkiv
index 634e2c1d827..641c8a4f50e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mult-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/mult-ini.mkiv
@@ -124,6 +124,13 @@
\def\s!top {top}
\def\s!both {both}
+\def\s!reverse {reverse}
+\def\s!orientation{orientation}
+\def\s!xoffset {xoffset}
+\def\s!xmove {xmove}
+\def\s!yoffset {yoffset}
+\def\s!ymove {ymove}
+
%D \macros
%D {defineinterfaceconstant,
%D defineinterfacevariable,
@@ -356,12 +363,12 @@
{\ifcsname\m!prefix!#1\endcsname\else\setgvalue{\m!prefix!#1}{#1}\fi
\clf_setinterfacemessage{#1}{#2}{#3}}
-\unexpanded\def\setmessagetext #1#2{\edef\currentmessagetext{\clf_getmessage{#1}{#2}}}
-\unexpanded\def\getmessage #1#2{\clf_getmessage{#1}{#2}}
-\unexpanded\def\doifelsemessage #1#2{\clf_doifelsemessage{#1}{#2}}
-\unexpanded\def\showmessage #1#2#3{\clf_showmessage{#1}{#2}{#3}}
-\unexpanded\def\writestatus #1#2{\clf_writestatus{#1}{#2}}
-\unexpanded\def\message {\clf_message}
+\unexpanded\def\setmessagetext #1#2{\relax\edef\currentmessagetext{\clf_getmessage{#1}{#2}}}
+\unexpanded\def\getmessage #1#2{\relax\clf_getmessage{#1}{#2}}
+\unexpanded\def\doifelsemessage #1#2{\relax\clf_doifelsemessage{#1}{#2}}
+\unexpanded\def\showmessage #1#2#3{\relax\clf_showmessage{#1}{#2}{#3}}
+\unexpanded\def\writestatus #1#2{\relax\clf_writestatus{#1}{#2}}
+\unexpanded\def\message {\relax\clf_message}
\let\doifmessageelse\doifelsemessage
@@ -371,40 +378,9 @@
\let\getsetupstring\clf_getsetupstring
\let\rawsetupstring\clf_rawsetupstring
-%D \macros
-%D {ifshowwarnings, ifshowmessages}
-%D
-%D Sometimes displaying message can slow down processing considerably. We therefore
-%D introduce warnings. Users can turn of warnings and messages by saying:
-%D
-%D \starttyping
-%D \showwarningstrue
-%D \showmessagestrue
-%D \stoptyping
-%D
-%D Turning off messages also turns off warnings, which is quote logical because they
-%D are less important.
-
-% not yet mkiv
+%D For old times sake:
-\newif\ifshowwarnings \showwarningstrue
-\newif\ifshowmessages \showmessagestrue
-
-\let\normalshowmessage\showmessage
-
-\unexpanded\def\showwarning
- {\ifshowwarnings
- \expandafter\showmessage
- \else
- \expandafter\gobblethreearguments
- \fi}
-
-\unexpanded\def\showmessage
- {\ifshowmessages
- \expandafter\normalshowmessage
- \else
- \expandafter\gobblethreearguments
- \fi}
+\let\showwarning\showmessage
%D \macros
%D {dosetvalue,dosetevalue,dosetgvalue,dosetxvalue,docopyvalue,doresetvalue} % dogetvalue
@@ -452,9 +428,9 @@
%D We can now redefine some messages that will be introduced in the multi||lingual
%D system module.
-\unexpanded\def\showassignerror #1#2{\showmessage\m!check1{#1,#2}\waitonfatalerror}
-\unexpanded\def\showargumenterror#1#2{\showmessage\m!check2{#1,#2}\waitonfatalerror}
-\unexpanded\def\showdefinederror #1#2{\showmessage\m!check3{#1,#2}\waitonfatalerror}
+\unexpanded\def\showassignerror #1#2{\showmessage\m!check1{#1,#2}}
+\unexpanded\def\showargumenterror#1#2{\showmessage\m!check2{#1,#2}}
+\unexpanded\def\showdefinederror #1#2{\showmessage\m!check3{#1,#2}}
%D \CONTEXT\ is a parameter driven package. This means that users instruct the
%D system by means of variables, values and keywords. These instructions take the
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mult-low.lua b/Master/texmf-dist/tex/context/base/mkiv/mult-low.lua
index 75c048c92de..aa0329e48cf 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mult-low.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/mult-low.lua
@@ -141,6 +141,10 @@ return {
"Ux", "eUx", "Umathaccents",
--
"parfillleftskip", "parfillrightskip",
+ --
+ "startlmtxmode", "stoplmtxmode", "startmkivmode", "stopmkivmode",
+ --
+ "wildcardsymbol",
},
["helpers"] = {
--
@@ -240,7 +244,9 @@ return {
"nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs", "flushnextbox",
"boxisempty",
--
- "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", "scratchdistance",
+ "givenwidth", "givenheight", "givendepth", "scangivendimensions",
+ --
+ "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", "scratchdistance", "scratchtotal",
"scratchhsize", "scratchvsize",
"scratchxoffset", "scratchyoffset", "scratchhoffset", "scratchvoffset",
"scratchxposition", "scratchyposition",
@@ -263,6 +269,7 @@ return {
"doifinset", "doifnotinset",
"doifelseinset", "doifinsetelse",
"doifelsenextchar", "doifnextcharelse",
+ "doifelsenextcharcs", "doifnextcharcselse",
"doifelsenextoptional", "doifnextoptionalelse",
"doifelsenextoptionalcs", "doifnextoptionalcselse",
"doifelsefastoptionalcheck", "doiffastoptionalcheckelse",
@@ -284,8 +291,11 @@ return {
"doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon",
"doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse",
"doifelseassignment", "doifassignmentelse", "docheckassignment", "doifelseassignmentcs", "doifassignmentelsecs",
+ "validassignment", "novalidassignment",
"doiftext", "doifelsetext", "doiftextelse", "doifnottext",
--
+ "quitcondition", "truecondition", "falsecondition",
+ --
"tracingall", "tracingnone", "loggingall",
--
"removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to",
@@ -303,7 +313,11 @@ return {
--
"wait", "writestatus", "define", "defineexpandable", "redefine",
--
- "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", "measured",
+ "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure",
+ "measure", "measured", "directmeasure",
+ "setquantity", "setequantity", "setgquantity", "setxquantity", "definequantity", "freezequantity",
+ "quantity", "quantitied", "directquantity",
+ -- "quantified",
--
"installcorenamespace",
--
@@ -367,6 +381,8 @@ return {
"strut", "halfstrut", "quarterstrut", "depthstrut", "halflinestrut", "noheightstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "strutgap", "begstrut", "endstrut", "lineheight",
"leftboundary", "rightboundary", "signalcharacter",
--
+ "shiftbox", "vpackbox", "hpackbox", "vpackedbox", "hpackedbox",
+ --
"ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing",
"ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing",
--
@@ -458,5 +474,7 @@ return {
"compoundhyphenpenalty",
--
"start", "stop",
+ --
+ "unsupportedcs",
}
}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mult-mes.lua b/Master/texmf-dist/tex/context/base/mkiv/mult-mes.lua
index 1eb429763a0..299f1a404ae 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mult-mes.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/mult-mes.lua
@@ -1169,6 +1169,10 @@ return {
no = "leser inn symbolsett %a",
ro = "se incarca setul de simboluri %a",
},
+ ["symbols:2"] = {
+ en = "symbolset %a is unknown",
+ nl = "symboolset %a is onbekend",
+ },
["system:1"] = {
cs = "nacteni pomocneho souboru odlozeno (typemode)",
de = "Laden der Hilfsdatei aufgeschoben (Eingabe-Modus)",
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mult-mps.lua b/Master/texmf-dist/tex/context/base/mkiv/mult-mps.lua
index 1d7252c29e2..6385d3fe51f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mult-mps.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/mult-mps.lua
@@ -15,7 +15,7 @@ return {
"false", "nullpicture", "pencircle", "penspec", "true",
"and", "angle", "arclength", "arctime", "ASCII", "boolean", "bot",
"char", "color", "cosd", "cycle", "decimal", "directiontime", "floor", "fontsize",
- "hex", "infont", "intersectiontimes", "known", "length", "llcorner",
+ "hex", "infont", "intersectiontimes", "known", "void", "length", "llcorner",
"lrcorner", "makepath", "makepen", "mexp", "mlog", "normaldeviate", "not",
"numeric", "oct", "odd", "or", "path", "pair", "pen", "penoffset", "picture", "point",
"postcontrol", "precontrol", "reverse", "rotated", "scaled",
@@ -23,7 +23,7 @@ return {
"transform", "transformed", "ulcorner", "uniformdeviate", "unknown",
"urcorner", "xpart", "xscaled", "xxpart", "xypart", "ypart", "yscaled", "yxpart",
"yypart", "zscaled",
- "addto", "clip", "input", "interim", "let", "newinternal", "save", "setbounds",
+ "addto", "clip", "input", "interim", "let", "newinternal", "save", "setbounds", "setgroup",
"shipout", "show", "showdependencies", "showtoken", "showvariable",
"special",
"begingroup", "endgroup", "of", "curl", "tension", "and", "controls",
@@ -49,7 +49,7 @@ return {
"extra_beginfig", "extra_endfig", "mpxbreak",
"endinput",
"message", "delimiters", "turningnumber", "errmessage",
- "readstring", "scantokens", "end", "outer", "inner", "write", "to", "readfrom",
+ "scantokens", "end", "outer", "inner", "write", "to", "readfrom", "closefrom",
"withprescript", "withpostscript",
"top", "bot", "lft", "rt", "ulft", "urt", "llft", "lrt",
--
@@ -67,7 +67,7 @@ return {
"outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline",
"fontpart", "fontsize", "glyph", "restoreclipcolor", "troffmode",
--
- "runscript", "maketext",
+ "runscript", "maketext", "numbersystem",
},
commands = {
"upto", "downto",
@@ -117,7 +117,8 @@ return {
--
"mm", "pt", "dd", "bp", "cm", "pc", "cc", "in",
--
- "triplet", "quadruplet",
+ "triplet", "quadruplet", "totransform", "bymatrix",
+ --
},
internals = { -- we need to remove duplicates above
--
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mult-prm.lua b/Master/texmf-dist/tex/context/base/mkiv/mult-prm.lua
index 579750bc97d..279de60e2d6 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mult-prm.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/mult-prm.lua
@@ -15,10 +15,6 @@ return {
"detokenize",
"dimexpr",
"displaywidowpenalties",
- "eTeXVersion",
- "eTeXminorversion",
- "eTeXrevision",
- "eTeXversion",
"everyeof",
"firstmarks",
"fontchardp",
@@ -76,6 +72,7 @@ return {
"Udelimiterover",
"Udelimiterunder",
"Uhextensible",
+ "Uleft",
"Umathaccent",
"Umathaxis",
"Umathbinbinspacing",
@@ -199,10 +196,12 @@ return {
"Umathunderbarvgap",
"Umathunderdelimiterbgap",
"Umathunderdelimitervgap",
+ "Umiddle",
"Unosubscript",
"Unosuperscript",
"Uoverdelimiter",
"Uradical",
+ "Uright",
"Uroot",
"Uskewed",
"Uskewedwithdelims",
@@ -216,6 +215,10 @@ return {
"Uunderdelimiter",
"Uvextensible",
"adjustspacing",
+ "adjustspacingshrink",
+ "adjustspacingstep",
+ "adjustspacingstretch",
+ "aftergrouped",
"alignmark",
"aligntab",
"attribute",
@@ -224,66 +227,79 @@ return {
"automatichyphenmode",
"automatichyphenpenalty",
"begincsname",
- "bodydir",
- "bodydirection",
- "boxdir",
+ "beginlocalcontrol",
+ "boundary",
+ "boxattr",
"boxdirection",
+ "boxorientation",
+ "boxtotal",
+ "boxxmove",
+ "boxxoffset",
+ "boxymove",
+ "boxyoffset",
"breakafterdirmode",
"catcodetable",
"clearmarks",
"compoundhyphenmode",
- "copyfont",
"crampeddisplaystyle",
"crampedscriptscriptstyle",
"crampedscriptstyle",
"crampedtextstyle",
"csstring",
- "draftmode",
- "dviextension",
- "dvifeedback",
- "dvivariable",
"efcode",
"endlocalcontrol",
"etoksapp",
"etokspre",
"exceptionpenalty",
"expanded",
- "expandglyphsinfont",
"explicitdiscretionary",
"explicithyphenpenalty",
+ "firstvalidlanguage",
"fixupboxesmode",
"fontid",
"formatname",
+ "frozen",
+ "futureexpand",
+ "futureexpandis",
+ "futureexpandisap",
"gleaders",
+ "glet",
+ "glyphdatafield",
"gtoksapp",
"gtokspre",
"hjcode",
+ "hpack",
"hyphenationbounds",
"hyphenationmin",
"hyphenpenaltymode",
"ifabsdim",
"ifabsnum",
+ "ifchkdim",
+ "ifchknum",
+ "ifcmpdim",
+ "ifcmpnum",
"ifcondition",
+ "ifcstok",
+ "ifdimval",
+ "iffrozen",
"ifincsname",
- "ifprimitive",
- "ignoreligaturesinfont",
+ "ifnumval",
+ "ifprotected",
+ "iftok",
+ "ifusercmd",
+ "ignorepars",
"immediateassigned",
"immediateassignment",
"initcatcodetable",
"insertht",
+ "internalcodesmode",
"lastnamedcs",
- "lastsavedboxresourceindex",
- "lastsavedimageresourceindex",
- "lastsavedimageresourcepages",
- "lastxpos",
- "lastypos",
- "latelua",
- "lateluafunction",
+ "lastnodesubtype",
"leftghost",
"leftmarginkern",
"letcharcode",
- "letterspacefont",
- "linedir",
+ "letfrozen",
+ "letprotected",
"linedirection",
"localbrokenpenalty",
"localinterlinepenalty",
@@ -301,14 +317,13 @@ return {
"luatexrevision",
"luatexversion",
"mathdelimitersmode",
- "mathdir",
"mathdirection",
"mathdisplayskipmode",
"matheqnogapstep",
"mathflattenmode",
"mathitalicsmode",
"mathnolimitsmode",
- "mathoption",
+ "matholdmode",
"mathpenaltiesmode",
"mathrulesfam",
"mathrulesmode",
@@ -319,27 +334,14 @@ return {
"mathstyle",
"mathsurroundmode",
"mathsurroundskip",
+ "noboundary",
"nohrule",
"nokerns",
"noligs",
- "normaldeviate",
"nospaces",
"novrule",
"outputbox",
- "outputmode",
- "pagebottomoffset",
- "pagedir",
- "pagedirection",
- "pageheight",
- "pageleftoffset",
- "pagerightoffset",
- "pagetopoffset",
- "pagewidth",
- "pardir",
"pardirection",
- "pdfextension",
- "pdffeedback",
- "pdfvariable",
"postexhyphenchar",
"posthyphenchar",
"prebinoppenalty",
@@ -347,38 +349,26 @@ return {
"preexhyphenchar",
"prehyphenchar",
"prerelpenalty",
- "primitive",
"protrudechars",
+ "protrusionboundary",
"pxdimen",
"quitvmode",
- "randomseed",
"rightghost",
"rightmarginkern",
"rpcode",
- "saveboxresource",
"savecatcodetable",
- "saveimageresource",
- "savepos",
"scantextokens",
"setfontid",
- "setrandomseed",
"shapemode",
- "suppressfontnotfounderror",
- "suppressifcsnameerror",
- "suppresslongerror",
- "suppressmathparerror",
- "suppressoutererror",
- "suppressprimitiveerror",
- "synctex",
- "tagcode",
- "textdir",
"textdirection",
"toksapp",
"tokspre",
+ "tpack",
"tracingfonts",
- "uniformdeviate",
- "useboxresource",
- "useimageresource",
+ "unletfrozen",
+ "unletprotected",
+ "vpack",
+ "wordboundary",
"xtoksapp",
"xtokspre",
},
@@ -505,9 +495,6 @@ return {
" ",
"-",
"/",
- "Uleft",
- "Umiddle",
- "Uright",
"above",
"abovedisplayshortskip",
"abovedisplayskip",
@@ -527,7 +514,6 @@ return {
"belowdisplayskip",
"binoppenalty",
"botmark",
- "boundary",
"box",
"boxmaxdepth",
"brokenpenalty",
@@ -536,7 +522,6 @@ return {
"chardef",
"cleaders",
"closein",
- "closeout",
"clubpenalty",
"copy",
"count",
@@ -586,6 +571,7 @@ return {
"everyjob",
"everymath",
"everypar",
+ "everytab",
"everyvbox",
"exhyphenchar",
"exhyphenpenalty",
@@ -594,14 +580,12 @@ return {
"fi",
"finalhyphendemerits",
"firstmark",
- "firstvalidlanguage",
"floatingpenalty",
"font",
"fontdimen",
"fontname",
"futurelet",
"gdef",
- "glet",
"global",
"globaldefs",
"halign",
@@ -615,7 +599,6 @@ return {
"hfuzz",
"hoffset",
"holdinginserts",
- "hpack",
"hrule",
"hsize",
"hskip",
@@ -642,7 +625,6 @@ return {
"ifvoid",
"ifx",
"ignorespaces",
- "immediate",
"indent",
"input",
"inputlineno",
@@ -703,7 +685,6 @@ return {
"muskipdef",
"newlinechar",
"noalign",
- "noboundary",
"noexpand",
"noindent",
"nolimits",
@@ -714,8 +695,9 @@ return {
"number",
"omit",
"openin",
- "openout",
"or",
+ "ordlimits",
+ "orelse",
"outer",
"output",
"outputpenalty",
@@ -745,7 +727,6 @@ return {
"pretolerance",
"prevdepth",
"prevgraf",
- "protrusionboundary",
"radical",
"raise",
"read",
@@ -770,6 +751,7 @@ return {
"showboxbreadth",
"showboxdepth",
"showlists",
+ "shownodedetails",
"showthe",
"skewchar",
"skip",
@@ -777,7 +759,6 @@ return {
"spacefactor",
"spaceskip",
"span",
- "special",
"splitbotmark",
"splitfirstmark",
"splitmaxdepth",
@@ -795,7 +776,6 @@ return {
"tolerance",
"topmark",
"topskip",
- "tpack",
"tracingcommands",
"tracinglostchars",
"tracingmacros",
@@ -826,7 +806,6 @@ return {
"vfilneg",
"vfuzz",
"voffset",
- "vpack",
"vrule",
"vsize",
"vskip",
@@ -835,8 +814,6 @@ return {
"vtop",
"wd",
"widowpenalty",
- "wordboundary",
- "write",
"xdef",
"xleaders",
"xspaceskip",
diff --git a/Master/texmf-dist/tex/context/base/mkiv/mult-sys.mkiv b/Master/texmf-dist/tex/context/base/mkiv/mult-sys.mkiv
index ae0214bd60a..8f8794df71c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/mult-sys.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/mult-sys.mkiv
@@ -239,39 +239,41 @@
\definesystemconstant {xml}
\definesystemconstant {lua}
-\definesystemconstant {next}
-\definesystemconstant {pickup}
-\definesystemconstant {forget}
-\definesystemconstant {ascii}
-\definesystemconstant {default}
-\definesystemconstant {unknown}
\definesystemconstant {action}
+\definesystemconstant {ascii}
+\definesystemconstant {chain}
+\definesystemconstant {child}
+\definesystemconstant {class}
+\definesystemconstant {clone}
\definesystemconstant {compare}
-\definesystemconstant {do}
-\definesystemconstant {dodo}
\definesystemconstant {complex}
-\definesystemconstant {simple}
-\definesystemconstant {start}
-\definesystemconstant {stop}
-\definesystemconstant {dummy}
-\definesystemconstant {local}
-\definesystemconstant {global}
+\definesystemconstant {counter}
+\definesystemconstant {current}
+\definesystemconstant {default}
+\definesystemconstant {dodo}
\definesystemconstant {done}
+\definesystemconstant {do}
+\definesystemconstant {dummy}
\definesystemconstant {font}
+\definesystemconstant {forget}
+\definesystemconstant {global}
+\definesystemconstant {handler}
+\definesystemconstant {indeed}
+\definesystemconstant {internal}
\definesystemconstant {link}
+\definesystemconstant {local}
+\definesystemconstant {multi}
+\definesystemconstant {next}
\definesystemconstant {parent}
-\definesystemconstant {child}
-\definesystemconstant {clone}
+\definesystemconstant {pickup}
+\definesystemconstant {plural}
\definesystemconstant {section}
-\definesystemconstant {handler}
-\definesystemconstant {counter}
+\definesystemconstant {simple}
\definesystemconstant {single}
-\definesystemconstant {multi}
-\definesystemconstant {indeed}
-\definesystemconstant {internal}
-\definesystemconstant {current}
-\definesystemconstant {chain}
-\definesystemconstant {class}
+\definesystemconstant {singular}
+\definesystemconstant {start}
+\definesystemconstant {stop}
+\definesystemconstant {unknown}
% translating setups is asking for a mess so we keep them as-is:
@@ -365,6 +367,7 @@
\definesystemconstant {marker}
\definesystemconstant {kernpairs}
\definesystemconstant {mixedcolumn}
+\definesystemconstant {orientation}
\definesystemconstant {ampersand}
@@ -457,6 +460,10 @@
\definesystemconstant {xoffset}
\definesystemconstant {yoffset}
+\definesystemconstant {topfloat}
+\definesystemconstant {bottomfloat}
+\definesystemconstant {pagefloat}
+
%D As the name of their define command states, the next set of constants is used in
%D the message macro's.
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-aux.lua b/Master/texmf-dist/tex/context/base/mkiv/node-aux.lua
index d6a9950fe8c..2a747f3b53b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-aux.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-aux.lua
@@ -21,6 +21,7 @@ local glyph_code = nodecodes.glyph
local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
local attributelist_code = nodecodes.attributelist -- temporary
+local localpar_code = nodecodes.localpar
local nuts = nodes.nuts
local tonut = nuts.tonut
@@ -34,6 +35,7 @@ local getsubtype = nuts.getsubtype
local getlist = nuts.getlist
local getattr = nuts.getattr
local getboth = nuts.getboth
+local getprev = nuts.getprev
local getcomponents = nuts.getcomponents
local getwidth = nuts.getwidth
local setwidth = nuts.setwidth
@@ -49,17 +51,16 @@ local setprev = nuts.setprev
local setcomponents = nuts.setcomponents
local setattrlist = nuts.setattrlist
------ traverse_nodes = nuts.traverse
------ traverse_id = nuts.traverse_id
-local nextnode = nuts.traversers.node
-local nextglyph = nuts.traversers.glyph
+local traversers = nuts.traversers
+local nextnode = traversers.node
+local nextglyph = traversers.glyph
+
local flush_node = nuts.flush
local flush_list = nuts.flush_list
local hpack_nodes = nuts.hpack
local unset_attribute = nuts.unset_attribute
local first_glyph = nuts.first_glyph
local copy_node = nuts.copy
------ copy_node_list = nuts.copy_list
local find_tail = nuts.tail
local getbox = nuts.getbox
local count = nuts.count
@@ -380,25 +381,6 @@ function nodes.rehpack(n,...)
rehpack(tonut(n),...)
end
--- I have no use for this yet:
---
--- \skip0=10pt plus 2pt minus 2pt
--- \cldcontext{"\letterpercent p",tex.stretch_amount(tex.skip[0],1000)} -- 14.30887pt
---
--- local gluespec_code = nodes.nodecodes.gluespec
---
--- function tex.badness_to_ratio(badness)
--- return (badness/100)^(1/3)
--- end
---
--- function tex.stretch_amount(skip,badness) -- node no nut
--- if skip.id == gluespec_code then
--- return skip.width + (badness and (badness/100)^(1/3) or 1) * skip.stretch
--- else
--- return 0
--- end
--- end
-
-- nodemode helper: the next and prev pointers are untouched
function nuts.copy_no_components(g,copyinjection)
@@ -482,12 +464,336 @@ function nuts.use_components(head,current)
return head, first, last
end
--- function nuts.current_tail()
--- local whatever = texnest[texnest.ptr]
--- if whatever then
--- local tail = whatever.tail
--- if tail then
--- return tonut(tail)
--- end
--- end
--- end
+do
+
+ local localparcodes = nodes.localparcodes
+ local hmodepar_code = localparcodes.vmode_par
+ local vmodepar_code = localparcodes.hmode_par
+
+ local getnest = tex.getnest
+ local getsubtype = nuts.getsubtype
+
+ function nuts.setparproperty(action,...)
+ local tail = tonut(getnest().tail)
+ while tail do
+ if getid(tail) == localpar_code then
+ local s = getsubtype(tail)
+ if s == hmodepar_code or s == vmodepar_code then
+ return action(tail,...)
+ else
+ -- something is wrong here
+ end
+ end
+ tail = getprev(tail)
+ end
+ end
+
+ local getsubtype = nodes.getsubtype
+
+ function nodes.start_of_par(n)
+ local s = getsubtype(n)
+ return s == hmodepar_code or s == vmodepar_code
+ end
+
+end
+
+-- Currently only in luametatex ... experimental anyway .. if it doesn't end
+-- up in luatex I'll move this to a different module.
+
+do
+
+ local nextnode = traversers.glue
+ local findfail = nuts.tail
+
+ local getid = nuts.getid
+ local getsubtype = nuts.getsubtype
+ local getlist = nuts.getlist
+ local getwidth = nuts.getwidth
+
+ local direct = node.direct
+
+ local nodecodes = nodes.nodecodes
+ local skipcodes = nodes.skipcodes
+
+ local hlist_code = nodecodes.hlist
+ local line_code = nodecodes.line
+
+ local leftskip_code = skipcodes.leftskip
+ local rightskip_code = skipcodes.rightskip
+ local lefthangskip_code = skipcodes.lefthangskip
+ local righthangskip_code = skipcodes.righthangskip
+ local indentskip_code = skipcodes.indentskip
+ local parfillskip_code = skipcodes.parfillskip
+
+ local find_node = direct.find_node or function(h,t,s)
+ if h then
+ if s then
+ for node, subtype in traversers[t] do
+ if s == subtype then
+ return current
+ end
+ end
+ else
+ for node, subtype in traversers[t] do
+ return current, subtype
+ end
+ end
+ end
+ end
+
+ nuts.find_node = find_node
+
+ nodes.getnormalizeline = nodes.getnormalizeline or function() return 0 end
+ nodes.setnormalizeline = nodes.setnormalizeline or function() end
+
+ nuts.getnormalizedline = direct.getnormalizedline or function(h)
+ if getid(h) == hlist_code and getsubtype(h) == line_code then
+ local ls, rs = 0, 0
+ local lh, rh = 0, 0
+ local is, ps = 0, 0
+ local h = getlist(h)
+ local t = findtail(h)
+ for n, subtype in nextglue, h do
+ if subtype == leftskip_code then ls = getwidth(n)
+ elseif subtype == rightskip_code then rs = getwidth(n)
+ elseif subtype == lefthangskip_code then lh = getwidth(n)
+ elseif subtype == righthangskip_code then rh = getwidth(n)
+ elseif subtype == indentskip_code then is = getwidth(n)
+ elseif subtype == parfillskip_code then ps = getwidth(n)
+ end
+ end
+ return ls, rs, lh, rh, is, ps, h, t
+ end
+ end
+
+end
+
+if not nodes.count then
+
+ local type = type
+
+ local direct = node.direct
+ local todirect = direct.tovaliddirect
+ local tonode = direct.tonode
+
+ local count = direct.count
+ local length = direct.length
+ local slide = direct.slide
+
+ function node.count(id,first,last)
+ return count(id,first and todirect(first), last and todirect(last) or nil)
+ end
+
+ function node.length(first,last)
+ return length(first and todirect(first), last and todirect(last) or nil)
+ end
+
+ function node.slide(n)
+ if n then
+ n = slide(todirect(n))
+ if n then
+ return tonode(n)
+ end
+ end
+ return nil
+ end
+
+ local hyphenating = direct.hyphenating
+ local ligaturing = direct.ligaturing
+ local kerning = direct.kerning
+
+ -- kind of inconsistent
+
+ function node.hyphenating(first,last)
+ if first then
+ local h, t = hyphenating(todirect(first), last and todirect(last) or nil)
+ return h and tonode(h) or nil, t and tonode(t) or nil, true
+ else
+ return nil, false
+ end
+ end
+
+ function node.ligaturing(first,last)
+ if first then
+ local h, t = ligaturing(todirect(first), last and todirect(last) or nil)
+ return h and tonode(h) or nil, t and tonode(t) or nil, true
+ else
+ return nil, false
+ end
+ end
+
+ function node.kerning(first,last)
+ if first then
+ local h, t = kerning(todirect(first), last and todirect(last) or nil)
+ return h and tonode(h) or nil, t and tonode(t) or nil, true
+ else
+ return nil, false
+ end
+ end
+
+ local protect_glyph = direct.protect_glyph
+ local unprotect_glyph = direct.unprotect_glyph
+ local protect_glyphs = direct.protect_glyphs
+ local unprotect_glyphs = direct.unprotect_glyphs
+
+ function node.protect_glyphs(first,last)
+ protect_glyphs(todirect(first), last and todirect(last) or nil)
+ end
+
+ function node.unprotect_glyphs(first,last)
+ unprotect_glyphs(todirect(first), last and todirect(last) or nil)
+ end
+
+ function node.protect_glyph(first)
+ protect_glyph(todirect(first))
+ end
+
+ function node.unprotect_glyph(first)
+ unprotect_glyph(todirect(first))
+ end
+
+ local flatten_discretionaries = direct.flatten_discretionaries
+ local check_discretionaries = direct.check_discretionaries
+ local check_discretionary = direct.check_discretionary
+
+ function node.flatten_discretionaries(first)
+ local h, count = flatten_discretionaries(todirect(first))
+ return tonode(h), count
+ end
+
+ function node.check_discretionaries(n)
+ check_discretionaries(todirect(n))
+ end
+
+ function node.check_discretionary(n)
+ check_discretionary(todirect(n))
+ end
+
+ local hpack = direct.hpack
+ local vpack = direct.vpack
+ local list_to_hlist = direct.mlist_to_hlist
+
+ function node.hpack(head,...)
+ local h, badness = hpack(head and todirect(head) or nil,...)
+ return tonode(h), badness
+ end
+
+ function node.vpack(head,...)
+ local h, badness = vpack(head and todirect(head) or nil,...)
+ return tonode(h), badness
+ end
+
+ function node.mlist_to_hlist(head,...)
+ return tonode(mlist_to_hlist(head and todirect(head) or nil,...))
+ end
+
+ local end_of_math = direct.end_of_math
+ local find_attribute = direct.find_attribute
+ local first_glyph = direct.first_glyph
+
+ function node.end_of_math(n)
+ if n then
+ n = end_of_math(todirect(n))
+ if n then
+ return tonode(n)
+ end
+ end
+ return nil
+ end
+
+ function node.find_attribute(n,a)
+ if n then
+ local v, n = find_attribute(todirect(n),a)
+ if n then
+ return v, tonode(n)
+ end
+ end
+ return nil
+ end
+
+ function node.first_glyph(first,last)
+ local n = first_glyph(todirect(first), last and todirect(last) or nil)
+ return n and tonode(n) or nil
+ end
+
+ local dimensions = direct.dimensions
+ local rangedimensions = direct.rangedimensions
+ local effective_glue = direct.effective_glue
+
+ function node.dimensions(a,b,c,d,e)
+ if type(a) == "userdata" then
+ a = todirect(a)
+ if type(b) == "userdata" then
+ b = todirect(b)
+ end
+ return dimensions(a,b)
+ else
+ d = todirect(d)
+ if type(e) == "userdata" then
+ e = todirect(e)
+ end
+ return dimensions(a,b,c,d,e)
+ end
+ return 0, 0, 0
+ end
+
+ function node.rangedimensions(parent,first,last)
+ return rangedimenensions(todirect(parent),todirect(first),last and todirect(last))
+ end
+
+ function node.effective_glue(list,parent)
+ return effective_glue(list and todirect(list) or nil,parent and todirect(parent) or nil)
+ end
+
+ local uses_font = direct.uses_font
+ local has_glyph = direct.has_glyph
+ local protrusion_skippable = direct.protrusion_skippable
+ local prepend_prevdepth = direct.prepend_prevdepth
+ local make_extensible = direct.make_extensible
+
+ function node.uses_font(n,f)
+ return uses_font(todirect(n),f)
+ end
+
+ function node.has_glyph(n)
+ return has_glyph(todirect(n))
+ end
+
+ function node.protrusion_skippable(n)
+ return protrusion_skippable(todirect(n))
+ end
+
+ function node.prepend_prevdepth(n)
+ local n, d = prepend_prevdepth(todirect(n))
+ return tonode(n), d
+ end
+
+ function node.make_extensible(...)
+ local n = make_extensible(...)
+ return n and tonode(n) or nil
+ end
+
+ local last_node = direct.last_node
+
+ function node.last_node()
+ local n = last_node()
+ return n and tonode(n) or nil
+ end
+
+ local is_zero_glue = direct.is_zero_glue
+ local getglue = direct.getglue
+ local setglue = direct.setglue
+
+ function node.is_zero_glue(n)
+ return is_zero_glue(todirect(n))
+ end
+
+ function node.get_glue(n)
+ return get_glue(todirect(n))
+ end
+
+ function node.set_glue(n)
+ return set_glue(todirect(n))
+ end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-bck.lua b/Master/texmf-dist/tex/context/base/mkiv/node-bck.lua
index a19e5e969a7..53ace65e99e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-bck.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-bck.lua
@@ -170,7 +170,7 @@ end
local function add_backgrounds(head,id,list)
if list then
- for current, id, subtype, list in nextlist, list do
+ for current, id, subtype, list in nextlist, list do
if list then
if alignments and subtype == alignmentlist_code then
local l = add_alignbackgrounds(current,list)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-cmp.lua b/Master/texmf-dist/tex/context/base/mkiv/node-cmp.lua
new file mode 100644
index 00000000000..e13e93d1f14
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-cmp.lua
@@ -0,0 +1,232 @@
+if node.count then
+ return
+end
+
+local type = type
+
+local node = node
+local direct = node.direct
+local todirect = direct.tovaliddirect
+local tonode = direct.tonode
+
+local count = direct.count
+local length = direct.length
+local slide = direct.slide
+
+function node.count(id,first,last)
+ return count(id,first and todirect(first), last and todirect(last) or nil)
+end
+
+function node.length(first,last)
+ return length(first and todirect(first), last and todirect(last) or nil)
+end
+
+function node.slide(n)
+ if n then
+ n = slide(todirect(n))
+ if n then
+ return tonode(n)
+ end
+ end
+ return nil
+end
+
+local hyphenating = direct.hyphenating
+local ligaturing = direct.ligaturing
+local kerning = direct.kerning
+
+-- kind of inconsistent
+
+function node.hyphenating(first,last)
+ if first then
+ local h, t = hyphenating(todirect(first), last and todirect(last) or nil)
+ return h and tonode(h) or nil, t and tonode(t) or nil, true
+ else
+ return nil, false
+ end
+end
+
+function node.ligaturing(first,last)
+ if first then
+ local h, t = ligaturing(todirect(first), last and todirect(last) or nil)
+ return h and tonode(h) or nil, t and tonode(t) or nil, true
+ else
+ return nil, false
+ end
+end
+
+function node.kerning(first,last)
+ if first then
+ local h, t = kerning(todirect(first), last and todirect(last) or nil)
+ return h and tonode(h) or nil, t and tonode(t) or nil, true
+ else
+ return nil, false
+ end
+ end
+
+local protect_glyph = direct.protect_glyph
+local unprotect_glyph = direct.unprotect_glyph
+local protect_glyphs = direct.protect_glyphs
+local unprotect_glyphs = direct.unprotect_glyphs
+
+function node.protect_glyphs(first,last)
+ protect_glyphs(todirect(first), last and todirect(last) or nil)
+end
+
+function node.unprotect_glyphs(first,last)
+ unprotect_glyphs(todirect(first), last and todirect(last) or nil)
+end
+
+function node.protect_glyph(first)
+ protect_glyph(todirect(first))
+end
+
+function node.unprotect_glyph(first)
+ unprotect_glyph(todirect(first))
+end
+
+local flatten_discretionaries = direct.flatten_discretionaries
+local check_discretionaries = direct.check_discretionaries
+local check_discretionary = direct.check_discretionary
+
+function node.flatten_discretionaries(first)
+ local h, count = flatten_discretionaries(todirect(first))
+ return tonode(h), count
+end
+
+function node.check_discretionaries(n)
+ check_discretionaries(todirect(n))
+end
+
+function node.check_discretionary(n)
+ check_discretionary(todirect(n))
+end
+
+local hpack = direct.hpack
+local vpack = direct.vpack
+local list_to_hlist = direct.mlist_to_hlist
+
+function node.hpack(head,...)
+ local h, badness = hpack(head and todirect(head) or nil,...)
+ return tonode(h), badness
+end
+
+function node.vpack(head,...)
+ local h, badness = vpack(head and todirect(head) or nil,...)
+ return tonode(h), badness
+end
+
+function node.mlist_to_hlist(head,...)
+ return tonode(mlist_to_hlist(head and todirect(head) or nil,...))
+end
+
+local end_of_math = direct.end_of_math
+local find_attribute = direct.find_attribute
+local first_glyph = direct.first_glyph
+
+function node.end_of_math(n)
+ if n then
+ n = end_of_math(todirect(n))
+ if n then
+ return tonode(n)
+ end
+ end
+ return nil
+end
+
+function node.find_attribute(n,a)
+ if n then
+ local v, n = find_attribute(todirect(n),a)
+ if n then
+ return v, tonode(n)
+ end
+ end
+ return nil
+end
+
+function node.first_glyph(first,last)
+ local n = first_glyph(todirect(first), last and todirect(last) or nil)
+ return n and tonode(n) or nil
+end
+
+local dimensions = direct.dimensions
+local rangedimensions = direct.rangedimensions
+local effective_glue = direct.effective_glue
+
+function node.dimensions(a,b,c,d,e)
+ if type(a) == "userdata" then
+ a = todirect(a)
+ if type(b) == "userdata" then
+ b = todirect(b)
+ end
+ return dimensions(a,b)
+ else
+ d = todirect(d)
+ if type(e) == "userdata" then
+ e = todirect(e)
+ end
+ return dimensions(a,b,c,d,e)
+ end
+ return 0, 0, 0
+end
+
+function node.rangedimensions(parent,first,last)
+ return rangedimenensions(todirect(parent),todirect(first),last and todirect(last))
+end
+
+function node.effective_glue(list,parent)
+ return effective_glue(list and todirect(list) or nil,parent and todirect(parent) or nil)
+end
+
+local uses_font = direct.uses_font
+local has_glyph = direct.has_glyph
+local protrusion_skippable = direct.protrusion_skippable
+local prepend_prevdepth = direct.prepend_prevdepth
+local make_extensible = direct.make_extensible
+
+function node.uses_font(n,f)
+ return uses_font(todirect(n),f)
+end
+
+function node.has_glyph(n)
+ return has_glyph(todirect(n))
+end
+
+function node.protrusion_skippable(n)
+ return protrusion_skippable(todirect(n))
+end
+
+function node.prepend_prevdepth(n)
+ local n, d = prepend_prevdepth(todirect(n))
+ return tonode(n), d
+end
+
+function node.make_extensible(...)
+ local n = make_extensible(...)
+ return n and tonode(n) or nil
+end
+
+local last_node = direct.last_node
+
+function node.last_node()
+ local n = last_node()
+ return n and tonode(n) or nil
+end
+
+local is_zero_glue = direct.is_zero_glue
+local getglue = direct.getglue
+local setglue = direct.setglue
+
+function node.is_zero_glue(n)
+ return is_zero_glue(todirect(n))
+end
+
+function node.get_glue(n)
+ return get_glue(todirect(n))
+end
+
+function node.set_glue(n)
+ return set_glue(todirect(n))
+end
+
+node.family_font = tex.getfontoffamily
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-dir.lua b/Master/texmf-dist/tex/context/base/mkiv/node-dir.lua
index 3f0cba67e91..762f20739da 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-dir.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-dir.lua
@@ -1,66 +1,114 @@
if not modules then modules = { } end modules ['node-dir'] = {
version = 1.001,
comment = "companion to node-ini.mkiv",
- author = "Taco Hoekwater and Hans Hagen",
+ author = "Hans Hagen",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
--- This is experimental code, so when I change it I need to check other modules
--- too.
---
--- Local par nodes are somewhat special. They start a paragraph and then register
--- the par direction. But they can also show op mid paragraph in which case they
--- register boxes and penalties. In that case the direction should not be affected.
---
--- We can assume that when hpack and prelinebreak filters are called, a local par
--- still sits at the head, but after a linebreak pass this node can be after the
--- leftskip (when present).
+local nodes = nodes
+local nuts = nodes.nuts
-local nodes = nodes
-local nuts = nodes.nuts
+local normaldir_code = nodes.dircodes.normal
+local line_code = nodes.listcodes.line
+local lefttoright_code = nodes.dirvalues.lefttoright
-local nodecodes = nodes.nodecodes
-local localpar_code = nodecodes.localpar
+local getnext = nuts.getnext
+local getlist = nuts.getlist
+local getwhd = nuts.getwhd
+local getdirection = nuts.getdirection
-local getid = nuts.getid
-local getsubtype = nuts.getsubtype
-local getdirection = nuts.getdirection
+local setlist = nuts.setlist
-local dirvalues = nodes.dirvalues
-local lefttoright = dirvalues.lefttoright
-local righttoleft = dirvalues.righttoleft
+local nextdir = nuts.traversers.dir
+local nexthlist = nuts.traversers.hlist
-local localparnewgraf_code = 0
+local rangedimensions = nuts.rangedimensions
+local insert_before = nuts.insert_before
-local function newstack(head,direction)
- local stack = { }
- local top = 0
- if head and getid(head) == localpar_code and getsubtype(head) == localparnewgraf_code then
- direction = getdirection(head)
- end
- if not direction then
- direction = lefttoright
- elseif direction == "TLT" then
- direction = lefttoright
- elseif direction == "TRT" then
- direction = righttoleft
- end
- local function update(node)
- local dir, pop = getdirection(node)
- if not pop then
- top = top + 1
- stack[top] = dir
- return dir
- elseif top == 0 then
- return direction
- elseif top == 1 then
- top = 0
- return direction
+local new_rule = nuts.pool.rule
+local new_kern = nuts.pool.kern
+
+local setcolor = nodes.tracers.colors.set
+local settransparency = nodes.tracers.transparencies.set
+
+-- local function dirdimensions(parent,begindir) -- can be a helper
+-- local level = 1
+-- local enddir = begindir
+-- local width = 0
+-- for current, subtype in nextdir, getnext(begindir) do
+-- if subtype == normaldir_code then -- todo
+-- level = level + 1
+-- else
+-- level = level - 1
+-- end
+-- if level == 0 then -- does the type matter
+-- enddir = current
+-- width = rangedimensions(parent,begindir,enddir)
+-- return width, enddir
+-- end
+-- end
+-- if enddir == begindir then
+-- width = rangedimensions(parent,begindir)
+-- end
+-- return width, enddir
+-- end
+
+local function dirdimensions(parent,begindir) -- can be a helper
+ local level = 1
+ local lastdir = nil
+ local width = 0
+ for current, subtype in nextdir, getnext(begindir) do
+ if subtype == normaldir_code then -- todo
+ level = level + 1
else
- top = top - 1
- return stack[top]
+ level = level - 1
+ end
+ if level == 0 then -- does the type matter
+ return (rangedimensions(parent,begindir,current)), current
+ end
+ end
+ return (rangedimensions(parent,begindir)), begindir
+end
+
+nuts.dirdimensions = dirdimensions
+
+local function colorit(list,current,dir,w,h,d)
+ local rule = new_rule(w,h,d)
+ local kern = new_kern(-w)
+ local color = dir == lefttoright_code and "trace:s" or "trace:o"
+ setcolor(rule,color)
+ settransparency(rule,color)
+ list, current = insert_before(list,current,kern)
+ list, current = insert_before(list,current,rule)
+ return list, current
+end
+
+function nodes.tracers.directions(head)
+ for hlist, subtype in nexthlist, head do
+ if subtype == line_code then
+ local list = getlist(hlist)
+ local w, h, d = getwhd(hlist)
+ list = colorit(list,list,getdirection(hlist),w,h,d)
+ for current in nextdir, list do
+ local dir, cancel = getdirection(current)
+ if not cancel then
+ local width = dirdimensions(hlist,current)
+ list = colorit(list,current,dir,width,h,d)
+ end
+ end
+ setlist(hlist,list)
end
end
- return direction, update
+ return head
end
+
+local enabled = false
+
+trackers.register("nodes.directions", function(v)
+ if not enabled then
+ enabled = true
+ nodes.tasks.appendaction("finalizers","after","nodes.tracers.directions",nil,"nut","enabled")
+ end
+ nodes.tasks.setaction(v)
+end)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-fin.lua b/Master/texmf-dist/tex/context/base/mkiv/node-fin.lua
index dc681d16556..a848cef69da 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-fin.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-fin.lua
@@ -12,10 +12,12 @@ if not modules then modules = { } end modules ['node-fin'] = {
-- leaders are also triggers ... see colo-ext for an example (negate a box)
local next, type, format = next, type, string.format
+local setmetatableindex = table.setmetatableindex
local attributes, nodes, node = attributes, nodes, node
local nuts = nodes.nuts
+local tonut = nodes.tonut
local getnext = nuts.getnext
local getid = nuts.getid
@@ -25,6 +27,8 @@ local getattr = nuts.getattr
local getwidth = nuts.getwidth
local getwhd = nuts.getwhd
local getorientation = nuts.getorientation
+local has_dimensions = nuts.has_dimensions
+local getbox = nuts.getbox
local setlist = nuts.setlist
local setleader = nuts.setleader
@@ -38,16 +42,9 @@ local nextnode = nuts.traversers.node
local nodecodes = nodes.nodecodes
local rulecodes = nodes.rulecodes
------ normalrule_code = rulecodes.normal
local boxrule_code = rulecodes.box
local imagerule_code = rulecodes.image
local emptyrule_code = rulecodes.empty
------ userrule_code = rulecodes.user
------ overrule_code = rulecodes.over
------ underrule_code = rulecodes.under
------ fractionrule_code = rulecodes.fraction
------ radicalrule_code = rulecodes.radical
------ outlinerule_code = rulecodes.outline
local glyph_code = nodecodes.glyph
local disc_code = nodecodes.disc
@@ -56,6 +53,9 @@ local rule_code = nodecodes.rule
local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
+local texlists = tex.lists
+local texgetnest = tex.getnest
+
local states = attributes.states
local numbers = attributes.numbers
local a_trigger = attributes.private('trigger')
@@ -182,7 +182,7 @@ local function process(attribute,head,inheritance,default) -- one attribute
local leader = nil
for stack, id in nextnode, head do
if id == glyph_code or id == disc_code then
- check = true -- disc no longer needed as we flatten replace
+ check = true
elseif id == glue_code then
leader = getleader(stack)
if leader then
@@ -235,8 +235,7 @@ local function process(attribute,head,inheritance,default) -- one attribute
-- end nested --
end
elseif id == rule_code then
- local wd, ht, dp = getwhd(stack)
- check = wd ~= 0 or (ht+dp) ~= 0
+ check = has_dimensions(stack)
end
-- much faster this way than using a check() and nested() function
if check then
@@ -309,7 +308,7 @@ local function selective(attribute,head,inheritance,default) -- two attributes
local leader = nil
for stack, id, subtype in nextnode, head do
if id == glyph_code or id == disc_code then
- check = true -- disc no longer needed as we flatten replace
+ check = true
elseif id == glue_code then
leader = getleader(stack)
if leader then
@@ -374,8 +373,7 @@ local function selective(attribute,head,inheritance,default) -- two attributes
-- so no redundant color stuff (only here, layers for instance should obey)
check = false
else
- local wd, ht, dp = getwhd(stack)
- check = wd ~= 0 or (ht+dp) ~= 0
+ check = has_dimensions(stack)
end
end
if check then
@@ -485,8 +483,7 @@ local function stacked(attribute,head,default) -- no triggering, no inheritance,
end
end
elseif id == rule_code then
- local wd, ht, dp = getwhd(stack)
- check = wd ~= 0 or (ht+dp) ~= 0
+ check = has_dimensions(stack)
end
if check then
local a = getattr(stack,attribute)
@@ -559,20 +556,25 @@ local function stacker(attribute,head,default) -- no triggering, no inheritance,
if a and attrib ~= a and nslistwise[a] then -- viewerlayer
head = insert_node_before(head,current,copy_node(nsdata[a]))
list = stacker(attribute,content,a)
+ if list ~= content then
+ setlist(current,list)
+ end
head, current = insert_node_after(head,current,copy_node(nsnone))
else
list = stacker(attribute,content,attrib)
+ if list ~= content then
+ setlist(current,list)
+ end
end
else
list = stacker(attribute,content,default)
- end
- if list ~= content then
- setlist(current,list)
+ if list ~= content then
+ setlist(current,list)
+ end
end
end
elseif id == rule_code then
- local wd, ht, dp = getwhd(current)
- check = wd ~= 0 or (ht+dp) ~= 0
+ check = has_dimensions(current)
end
if check then
@@ -621,89 +623,6 @@ local function stacker(attribute,head,default) -- no triggering, no inheritance,
return head
end
--- local nextid = nodes.nuts.traversers.id
---
--- local function stacker(attribute,head,default) -- no triggering, no inheritance, but list-wise
---
--- -- nsbegin()
--- local stacked = false
---
--- local current = head
--- local previous = head
--- local attrib = default or unsetvalue
--- local check = false
--- local leader = false
---
--- local id = getid(current)
--- while current do
--- if id == glyph_code then
--- check = true
--- elseif id == glue_code then
--- leader = getleader(current)
--- if leader then
--- check = true
--- end
--- elseif id == hlist_code or id == vlist_code then
--- local content = getlist(current)
--- if content then
--- local list
--- if nslistwise then
--- local a = getattr(current,attribute)
--- if a and attrib ~= a and nslistwise[a] then -- viewerlayer
--- head = insert_node_before(head,current,copy_node(nsdata[a]))
--- list = stacker(attribute,content,a)
--- head, current = insert_node_after(head,current,copy_node(nsnone))
--- else
--- list = stacker(attribute,content,attrib)
--- end
--- else
--- list = stacker(attribute,content,default)
--- end
--- if list ~= content then
--- setlist(current,list)
--- end
--- end
--- elseif id == rule_code then
--- check = getwidth(current) ~= 0
--- end
---
--- if check then
--- local a = getattr(current,attribute) or unsetvalue
--- if a ~= attrib then
--- if not stacked then
--- stacked = true
--- nsbegin()
--- end
--- local n = nsstep(a)
--- if n then
--- head = insert_node_before(head,current,n) -- a
--- end
--- attrib = a
--- if leader then
--- -- tricky as a leader has to be a list so we cannot inject before
--- local list = stacker(attribute,leader,attrib)
--- leader = false
--- end
--- end
--- check = false
--- end
---
--- previous = current
---
--- current, id = nextid(current,current)
--- end
---
--- if stacked then
--- local n = nsend()
--- while n do
--- head = insert_node_after(head,previous,n)
--- n = nsend()
--- end
--- end
---
--- return head
--- end
-
states.stacker = function(namespace,attribute,head,default)
local head = stacker(attribute,head,default)
nsreset()
@@ -715,3 +634,100 @@ end
statistics.register("attribute processing time", function()
return statistics.elapsedseconds(attributes,"front- and backend")
end)
+
+-- -- --
+
+do
+
+ local cleaners = { }
+ local trace = true -- false
+
+ function attributes.cleanup()
+ if next(cleaners) then
+ local values = setmetatableindex("table")
+
+ if trace then
+ starttiming(values)
+ end
+
+ local function check(l)
+ for n, id in nextnode, l do
+ if id == hlist_code or id == vlist_code or id == glue_code then
+ local l = getlist(n)
+ if l then
+ check(l)
+ end
+ end
+ for a in next, cleaners do
+ local v = getattr(n,a)
+ if v then
+ -- values[a] = values[a] + 1
+ values[a][v] = true
+ end
+ end
+ end
+ end
+
+ local top = texgetnest("ptr")
+ for i=1,top do
+ local l = texgetnest(i)
+ if l then
+ check(tonut(l.head))
+ end
+ end
+
+ do local l
+ l = tonut(texlists.page_ins_head) if l then check(l) end
+ l = tonut(texlists.contrib_head) if l then check(l) end
+ l = tonut(texlists.page_discards_head) if l then check(l) end
+ l = tonut(texlists.split_discards_head) if l then check(l) end
+ l = tonut(texlists.page_head) if l then check(l) end
+ end
+
+ -- todo: traverseboxes
+
+ for i=0,65535 do
+ local b = getbox(i)
+ if b then
+ local l = getlist(b)
+ if l then
+ check(l)
+ end
+ end
+ end
+
+ for a, t in next, values do
+ cleaners[a](a,t)
+ end
+
+ if trace then
+ stoptiming(values)
+ local a = table.sortedkeys(values)
+ local t = statistics.elapsedtime(values)
+ local r = tex.getcount("realpageno")
+ if #a == 0 then
+ logs.report("attributes","cleaning up at page %i took %s seconds, no attributes",r,t)
+ else
+ logs.report("attributes","cleaning up at page %i took %s seconds, attributes: % t",r,t,a)
+ end
+ end
+ end
+ end
+
+ -- not yet used but when we do ... delay a call till we enable it (attr-ini.mkiv)
+
+ -- local function show(a,t) for k, v in next, t do print(a,k) end end
+ --
+ -- attributes.registercleaner( 1, show)
+ -- attributes.registercleaner( 2, show)
+
+ function attributes.registercleaner(a,f)
+ cleaners[a] = f
+ end
+
+ implement {
+ name = "cleanupattributes",
+ actions = attributes.cleanup,
+ }
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-fnt.lua b/Master/texmf-dist/tex/context/base/mkiv/node-fnt.lua
index 01d7e42e5d6..1b245639b78 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-fnt.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-fnt.lua
@@ -43,7 +43,6 @@ local handlers = nodes.handlers
local nuts = nodes.nuts
-local getattr = nuts.getattr
local getid = nuts.getid
local getsubtype = nuts.getsubtype
local getdisc = nuts.getdisc
@@ -51,7 +50,9 @@ local getnext = nuts.getnext
local getprev = nuts.getprev
local getboth = nuts.getboth
local getdata = nuts.getdata
+local getglyphdata = nuts.getglyphdata
----- getdisc = nuts.getdisc
+
local setchar = nuts.setchar
local setlink = nuts.setlink
local setnext = nuts.setnext
@@ -179,7 +180,7 @@ local function start_trace(head)
local char, id = isglyph(n)
if char then
local font = id
- local attr = getattr(n,0) or 0
+ local attr = getglyphdata(n) or 0
report_fonts("font %03i, dynamic %03i, glyph %C",font,attr,char)
elseif id == disc_code then
report_fonts("[disc] %s",nodes.listtoutf(n,true,false,n))
@@ -209,12 +210,12 @@ do
local usedfonts
local attrfonts
- local basefonts
+ local basefonts -- could be reused
local basefont
local prevfont
local prevattr
local variants
- local redundant
+ local redundant -- could be reused
local firstnone
local lastfont
local lastproc
@@ -316,8 +317,8 @@ do
-- metafun manual (with some 2500 single char lists) the difference is just noise.
for n, char, font in nextchar, head do
- -- local attr = (none and prevattr) or getattr(n,0) or 0 -- zero attribute is reserved for fonts in context
- local attr = getattr(n) or 0 -- zero attribute is reserved for fonts in context
+ -- local attr = (none and prevattr) or getglyphdata(n) or 0 -- zero attribute is reserved for fonts in context
+ local attr = getglyphdata(n) or 0 -- zero attribute is reserved for fonts in context
if font ~= prevfont or attr ~= prevattr then
prevfont = font
prevattr = attr
@@ -440,7 +441,7 @@ do
firstnone = nil
basefont = nil
for n, char, font in nextchar, r do
- local attr = getattr(n) or 0 -- zero attribute is reserved for fonts in context
+ local attr = getglyphdata(n) or 0 -- zero attribute is reserved for fonts in context
if font ~= prevfont or attr ~= prevattr then
prevfont = font
prevattr = attr
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/node-ini.lua
index f910c7e012f..806ac5658d7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-ini.lua
@@ -7,15 +7,13 @@ if not modules then modules = { } end modules ['node-ini'] = {
}
--[[ldx--
-<p>Most of the code that had accumulated here is now separated in
-modules.</p>
+<p>Most of the code that had accumulated here is now separated in modules.</p>
--ldx]]--
--- this module is being reconstructed
---
--- todo: datatype table per node type
-
--- todo: query names with new node.subtypes
+-- I need to clean up this module as it's a bit of a mess now. The latest luatex
+-- has most tables but we have a few more in luametatex. Also, some are different
+-- between these engines. We started out with hardcoded tables, that then ended
+-- up as comments and are now gone (as they differ per engine anyway).
local next, type, tostring = next, type, tostring
local gsub = string.gsub
@@ -23,36 +21,34 @@ local concat, remove = table.concat, table.remove
local sortedhash, sortedkeys, swapped = table.sortedhash, table.sortedkeys, table.swapped
--[[ldx--
-<p>Access to nodes is what gives <l n='luatex'/> its power. Here we
-implement a few helper functions. These functions are rather optimized.</p>
+<p>Access to nodes is what gives <l n='luatex'/> its power. Here we implement a
+few helper functions. These functions are rather optimized.</p>
--ldx]]--
--[[ldx--
-<p>When manipulating node lists in <l n='context'/>, we will remove
-nodes and insert new ones. While node access was implemented, we did
-quite some experiments in order to find out if manipulating nodes
-in <l n='lua'/> was feasible from the perspective of performance.</p>
-
-<p>First of all, we noticed that the bottleneck is more with excessive
-callbacks (some gets called very often) and the conversion from and to
-<l n='tex'/>'s datastructures. However, at the <l n='lua'/> end, we
-found that inserting and deleting nodes in a table could become a
-bottleneck.</p>
-
-<p>This resulted in two special situations in passing nodes back to
-<l n='tex'/>: a table entry with value <type>false</type> is ignored,
-and when instead of a table <type>true</type> is returned, the
-original table is used.</p>
-
-<p>Insertion is handled (at least in <l n='context'/> as follows. When
-we need to insert a node at a certain position, we change the node at
-that position by a dummy node, tagged <type>inline</type> which itself
-has_attribute the original node and one or more new nodes. Before we pass
-back the list we collapse the list. Of course collapsing could be built
-into the <l n='tex'/> engine, but this is a not so natural extension.</p>
-
-<p>When we collapse (something that we only do when really needed), we
-also ignore the empty nodes. [This is obsolete!]</p>
+<p>When manipulating node lists in <l n='context'/>, we will remove nodes and
+insert new ones. While node access was implemented, we did quite some experiments
+in order to find out if manipulating nodes in <l n='lua'/> was feasible from the
+perspective of performance.</p>
+
+<p>First of all, we noticed that the bottleneck is more with excessive callbacks
+(some gets called very often) and the conversion from and to <l n='tex'/>'s
+datastructures. However, at the <l n='lua'/> end, we found that inserting and
+deleting nodes in a table could become a bottleneck.</p>
+
+<p>This resulted in two special situations in passing nodes back to <l n='tex'/>:
+a table entry with value <type>false</type> is ignored, and when instead of a
+table <type>true</type> is returned, the original table is used.</p>
+
+<p>Insertion is handled (at least in <l n='context'/> as follows. When we need to
+insert a node at a certain position, we change the node at that position by a
+dummy node, tagged <type>inline</type> which itself has_attribute the original
+node and one or more new nodes. Before we pass back the list we collapse the
+list. Of course collapsing could be built into the <l n='tex'/> engine, but this
+is a not so natural extension.</p>
+
+<p>When we collapse (something that we only do when really needed), we also
+ignore the empty nodes. [This is obsolete!]</p>
--ldx]]--
-- local gf = node.direct.getfield
@@ -76,206 +72,25 @@ tex.magicconstants = { -- we use tex.constants for something else
trueinch = 4736286,
}
--- local listcodes = allocate {
--- [0] = "unknown",
--- [1] = "line",
--- [2] = "box",
--- [3] = "indent",
--- [4] = "alignment", -- row or column
--- [5] = "cell",
--- [6] = "equation",
--- [7] = "equationnumber",
--- }
-
-local listcodes = mark(getsubtypes("list"))
-
--- local rulecodes = allocate {
--- [0] = "normal",
--- [1] = "box",
--- [2] = "image",
--- [3] = "empty",
--- [4] = "user",
--- }
-
-local rulecodes = mark(getsubtypes("rule"))
-
-if not rulecodes[5] then
- rulecodes[5] = "over"
- rulecodes[6] = "under"
- rulecodes[7] = "fraction"
- rulecodes[8] = "radical"
-end
-
--- local dircodes = mark(getsubtypes("dir"))
-
-dircodes = allocate {
- [0] = "normal",
- [1] = "cancel",
-}
-
--- local glyphcodes = allocate {
--- [ 1] = "character",
--- [ 2] = "ligature",
--- [ 4] = "ghost",
--- [ 8] = "left",
--- [16] = "right",
--- }
-
-local glyphcodes = mark(getsubtypes("glyph"))
-
--- local disccodes = allocate {
--- [0] = "discretionary", -- \discretionary
--- [1] = "explicit", -- \-
--- [2] = "automatic", -- following a -
--- [3] = "regular", -- by hyphenator: simple
--- [4] = "first", -- by hyphenator: hard first item
--- [5] = "second", -- by hyphenator: hard second item
--- }
-
-local disccodes = mark(getsubtypes("disc"))
-
--- local gluecodes = allocate {
--- [ 0] = "userskip",
--- [ 1] = "lineskip",
--- [ 2] = "baselineskip",
--- [ 3] = "parskip",
--- [ 4] = "abovedisplayskip",
--- [ 5] = "belowdisplayskip",
--- [ 6] = "abovedisplayshortskip",
--- [ 7] = "belowdisplayshortskip",
--- [ 8] = "leftskip",
--- [ 9] = "rightskip",
--- [ 10] = "topskip",
--- [ 11] = "splittopskip",
--- [ 12] = "tabskip",
--- [ 13] = "spaceskip",
--- [ 14] = "xspaceskip",
--- [ 15] = "parfillskip",
--- [ 16] = "mathskip", -- experiment
--- [ 17] = "thinmuskip",
--- [ 18] = "medmuskip",
--- [ 19] = "thickmuskip",
--- [ 98] = "conditionalmathglue",
--- [ 99] = "muskip",
--- [100] = "leaders",
--- [101] = "cleaders",
--- [102] = "xleaders",
--- [103] = "gleaders",
--- }
-
-local gluecodes = mark(getsubtypes("glue"))
-
--- local leadercodes = allocate {
--- [100] = "leaders",
--- [101] = "cleaders",
--- [102] = "xleaders",
--- [103] = "gleaders",
--- }
-
-local leadercodes = mark(getsubtypes("leader"))
-
--- local fillcodes = allocate {
--- [0] = "stretch",
--- [1] = "fi",
--- [2] = "fil",
--- [3] = "fill",
--- [4] = "filll",
--- }
-
-local fillcodes = mark(getsubtypes("fill"))
-
--- for now:
-
-local boundarycodes = allocate {
- [0] = "cancel",
- [1] = "user",
- [2] = "protrusion",
- [3] = "word",
-}
-
--- local boundarycodes = mark(getsubtypes("boundary"))
-
--- local penaltycodes = allocate { -- unfortunately not used (yet)
--- [ 0] = "userpenalty",
--- }
-
-local penaltycodes = mark(getsubtypes("penalty"))
-
-table.setmetatableindex(penaltycodes,function(t,k) return "userpenalty" end) -- not used anyway
-
--- local kerncodes = allocate {
--- [0] = "fontkern",
--- [1] = "userkern",
--- [2] = "accentkern",
--- [3] = "italiccorrection",
--- }
-
-local kerncodes = mark(getsubtypes("kern"))
-
--- local margincodes = allocate {
--- [0] = "left",
--- [1] = "right",
--- }
-
-local margincodes = mark(getsubtypes("marginkern"))
-
--- local mathcodes = allocate {
--- [0] = "beginmath",
--- [1] = "endmath",
--- }
-
-local mathcodes = mark(getsubtypes("math"))
-
--- local noadcodes = allocate { -- simple nodes
--- [ 0] = "ord",
--- [ 1] = "opdisplaylimits",
--- [ 2] = "oplimits",
--- [ 3] = "opnolimits",
--- [ 4] = "bin",
--- [ 5] = "rel",
--- [ 6] = "open",
--- [ 7] = "close",
--- [ 8] = "punct",
--- [ 9] = "inner",
--- [10] = "under",
--- [11] = "over",
--- [12] = "vcenter",
--- }
-
-local noadcodes = mark(getsubtypes("noad"))
-
--- local radicalcodes = allocate {
--- [0] = "radical",
--- [1] = "uradical",
--- [2] = "uroot",
--- [3] = "uunderdelimiter",
--- [4] = "uoverdelimiter",
--- [5] = "udelimiterunder",
--- [6] = "udelimiterover",
--- }
-
-local radicalcodes = mark(getsubtypes("radical"))
-
--- local accentcodes = allocate {
--- [0] = "bothflexible",
--- [1] = "fixedtop",
--- [2] = "fixedbottom",
--- [3] = "fixedboth",
--- }
-
-local accentcodes = mark(getsubtypes("accent"))
-
--- local fencecodes = allocate {
--- [0] = "unset",
--- [1] = "left",
--- [2] = "middle",
--- [3] = "right",
--- [4] = "no",
--- }
-
-local fencecodes = mark(getsubtypes("fence"))
-
--- maybe we also need fractioncodes
+local listcodes = mark(getsubtypes("list"))
+local rulecodes = mark(getsubtypes("rule"))
+local dircodes = mark(getsubtypes("dir"))
+local glyphcodes = mark(getsubtypes("glyph"))
+local disccodes = mark(getsubtypes("disc"))
+local gluecodes = mark(getsubtypes("glue"))
+local leadercodes = mark(getsubtypes("leader"))
+local fillcodes = mark(getsubtypes("fill"))
+local boundarycodes = mark(getsubtypes("boundary"))
+local penaltycodes = mark(getsubtypes("penalty"))
+local kerncodes = mark(getsubtypes("kern"))
+local margincodes = mark(getsubtypes("marginkern"))
+local mathcodes = mark(getsubtypes("math"))
+local noadcodes = mark(getsubtypes("noad"))
+local radicalcodes = mark(getsubtypes("radical"))
+local accentcodes = mark(getsubtypes("accent"))
+local fencecodes = mark(getsubtypes("fence"))
+----- fractioncodes = mark(getsubtypes("fraction"))
+local localparcodes = allocate { [0] = "new_graf", "local_box", "hmode_par", "penalty", "math" } -- only in luametatex now
local function simplified(t)
local r = { }
@@ -356,6 +171,7 @@ margincodes = allocate(swapped(margincodes,margincodes))
disccodes = allocate(swapped(disccodes,disccodes))
accentcodes = allocate(swapped(accentcodes,accentcodes))
fencecodes = allocate(swapped(fencecodes,fencecodes))
+localparcodes = allocate(swapped(localparcodes,localparcodes))
rulecodes = allocate(swapped(rulecodes,rulecodes))
leadercodes = allocate(swapped(leadercodes,leadercodes))
usercodes = allocate(swapped(usercodes,usercodes))
@@ -364,7 +180,15 @@ dirvalues = allocate(swapped(dirvalues,dirvalues))
gluevalues = allocate(swapped(gluevalues,gluevalues))
literalvalues = allocate(swapped(literalvalues,literalvalues))
-if CONTEXTLMTXMODE > 1 then
+if not gluecodes.indentskip then
+ gluecodes.indentskip = gluecodes.userskip
+ gluecodes.lefthangskip = gluecodes.userskip
+ gluecodes.righthangskip = gluecodes.userskip
+ gluecodes.correctionskip = gluecodes.userskip
+ gluecodes.intermathskip = gluecodes.userskip
+end
+
+if CONTEXTLMTXMODE > 0 then
whatcodes.literal = 0x1 whatcodes[0x1] = "literal"
whatcodes.latelua = 0x2 whatcodes[0x2] = "latelua"
whatcodes.userdefined = 0x3 whatcodes[0x3] = "userdefined"
@@ -399,6 +223,7 @@ nodes.disccodes = disccodes
nodes.accentcodes = accentcodes
nodes.radicalcodes = radicalcodes
nodes.fencecodes = fencecodes
+nodes.localparcodes = localparcodes
nodes.rulecodes = rulecodes
nodes.leadercodes = leadercodes
nodes.usercodes = usercodes
@@ -420,12 +245,14 @@ nodes.subtypes = allocate {
[nodecodes.glyph] = glyphcodes,
[nodecodes.hlist] = listcodes,
[nodecodes.kern] = kerncodes,
+ [nodecodes.localpar] = localparcodes,
[nodecodes.marginkern] = margincodes,
[nodecodes.math] = mathcodes,
[nodecodes.noad] = noadcodes,
[nodecodes.penalty] = penaltycodes,
[nodecodes.radical] = radicalcodes,
[nodecodes.rule] = rulecodes,
+ -- [nodecodes.user] = usercodes,
[nodecodes.vlist] = listcodes,
[nodecodes.whatsit] = whatcodes,
}
@@ -447,6 +274,8 @@ nodes.literalvalues = literalvalues -- more friendly
glyphcodes.glyph = glyphcodes.character
+localparcodes.vmode_par = localparcodes.new_graf
+
listcodes.row = listcodes.alignment
listcodes.column = listcodes.alignment
@@ -512,14 +341,24 @@ end
trackers.register("system.showcodes", nodes.showcodes)
-if not nodecodes.dir then
- report_codes("use a newer version of luatex")
- os.exit()
-end
-
-- We don't need this sanitize-after-callback in ConTeXt and by disabling it we
-- also have a way to check if LuaTeX itself does the right thing.
if node.fix_node_lists then
node.fix_node_lists(false)
end
+
+-- We use the real node code numbers.
+
+if CONTEXTLMTXMODE > 0 then
+
+ local texchardef = tex.chardef
+
+ if texchardef then
+ for i=0,nodecodes.glyph do
+ texchardef(nodecodes[i] .. "nodecode",i)
+ end
+ tex.set("internalcodesmode",1)
+ end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/node-ini.mkiv
index 35013c4b801..5bf53cd2d01 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-ini.mkiv
@@ -17,18 +17,22 @@
\newcount\filterstate \filterstate\plusone % hm, public
+\ifcase\contextlmtxmode \else
+ \registerctxluafile{node-cmp}{}
+\fi
+
\registerctxluafile{node-ini}{}
\registerctxluafile{node-met}{}
\registerctxluafile{node-nut}{}
\registerctxluafile{node-res}{}
%registerctxluafile{node-ppt}{} % experimental, not used so probably useless
-\registerctxluafile{node-dir}{}
\registerctxluafile{node-aux}{}
\registerctxluafile{node-tst}{}
\registerctxluafile{node-tra}{} % we might split it off (module)
\registerctxluafile{node-snp}{}
\registerctxluafile{node-tsk}{}
\registerctxluafile{node-tex}{}
+\registerctxluafile{node-dir}{} % experimental, not yet (and maybe never) used
\registerctxluafile{node-pro}{}
\registerctxluafile{node-ser}{}
\registerctxluafile{node-ext}{}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-ltp.lua b/Master/texmf-dist/tex/context/base/mkiv/node-ltp.lua
index 0d501890b92..dd655f93d41 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-ltp.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-ltp.lua
@@ -8,23 +8,16 @@ if not modules then modules = { } end modules ['node-par'] = {
}
-- todo: remove nest_stack from linebreak.w
--- todo: use ex field as signal (index in ?)
--- todo: attr driven unknown/on/off
-- todo: permit global steps i.e. using an attribute that sets min/max/step and overloads the font parameters
-- todo: split the three passes into three functions
--- todo: simplify the direction stack, no copy needed
-- todo: see if we can do without delta nodes (needs thinking)
-- todo: add more mkiv like tracing
-- todo: add a couple of plugin hooks
--- todo: maybe split expansion code paths
-- todo: fix line numbers (cur_list.pg_field needed)
--- todo: check and improve protrusion
--- todo: arabic etc (we could use pretty large scales there) .. marks and cursive
--- todo: see: we need to check this with the latest patches to the tex kernel
--- todo: adapt math glue spacing to new model (left/right)
-
-- todo: optimize a bit more (less par.*)
+-- issue: ls / rs added when zero content and normalize
+
--[[
This code is derived from traditional TeX and has bits of pdfTeX, Aleph (Omega), and of course LuaTeX. So,
@@ -126,66 +119,23 @@ if not modules then modules = { } end modules ['node-par'] = {
retrofit the same approach into the core, the overhead of expansion can be sort of nilled.
In 2013 the expansion factor method became also used at the TeX end so then I could complete the code
- here, and indeed, expansions works quite well now (not compatible of course because we use floats at the
- Lua end. The Lua base variant is still slower but quite ok, especially if we go nuts.
-
- A next iteration will provide plug-ins and more control. I will also explore the possibility to avoid the
- redundant hpack calculations (easier now, although I've only done some quick and dirty experiments.)
-
-]]--
-
---[[--
-
-#define dir_TLT 0
-#define dir_TRT 1
-#define dir_LTL 2
-#define dir_RTT 3
-
-#define dir_TLT_or_TRT(A) (A < 2)
-#define dir_LTL_or_RTT(A) (A > 1)
-
-#define textdir_parallel(A,B) (\
-(dir_TLT_or_TRT(A) and dir_TLT_or_TRT(B)) or \
-(dir_LTL_or_RTT(A) and dir_LTL_or_RTT(B))\
-)
-
-#define pardir_parallel(A,B) (\
-(dir_TLT_or_TRT(A) and dir_TLT_or_TRT(B)) or \
-(dir_LTL_or_RTT(A) and dir_LTL_or_RTT(B))\
-)
+ here, and indeed, expansions works quite well now (not compatible of course because we use floats at
+ the Lua end. The Lua base variant is still slower but quite ok, especially if we go nuts.
-#define pardir_opposite(A,B) (\
-(A == dir_LTL and B == dir_RTT) or \
-(A == dir_RTT and B == dir_LTL)\
-)
+ A next iteration will provide plug-ins and more control. I will also explore the possibility to avoid
+ the redundant hpack calculations (easier now, although I've only done some quick and dirty experiments.)
-#define textdir_opposite(A,B) (\
-(A == dir_TLT and B == dir_TRT) or \
-(A == dir_TRT and B == dir_TLT)\
-)
+ The code has been adapted to the more reasonable and simplified direction model.
-#define glyphdir_opposite(A,B) 0
+ In case I forget when I added the normalization code: it was november 2019 and it took me way more time
+ than usual because I got distracted after discovering Alyona Yarushina on YT (in november 2019) which
+ blew some fuses in the musical aware part of my brain in a similar way as when I discovered Kate Bush,
+ so I had to watch a whole lot of her perfect covers (multiple times and for sure many more times). A
+ new benchmark.
-#define pardir_equal(A,B) (\
-(dir_TLT_or_TRT(A) and dir_TLT_or_TRT(B)) or \
-(A == dir_LTL and B == dir_LTL) or \
-(A == dir_RTT and B == dir_RTT)\
-)
-
-#define textdir_equal(A,B) (\
-(A == dir_TLT and B == dir_TLT) or \
-(A == dir_TRT and B == dir_TRT) or \
-(A == dir_LTL and dir_LTL_or_RTT(B)) or \
-(A == dir_RTT and dir_LTL_or_RTT(B))\
-)
-
---]]--
+]]--
-local tonumber = tonumber
-local utfchar = utf.char
-local write, write_nl = texio.write, texio.write_nl
-local sub, formatters = string.sub, string.formatters
-local insert, remove = table.insert, table.remove
+local unpack = unpack
-- local fonts, nodes, node = fonts, nodes, node -- too many locals
@@ -199,8 +149,10 @@ local report_parbuilders = logs.reporter("nodes","parbuilders")
----- report_hpackers = logs.reporter("nodes","hpackers")
local calculate_badness = tex.badness
-local texnest = tex.nest
local texlists = tex.lists
+local texget = tex.get
+local texset = tex.set
+local texgetglue = tex.getglue
-- (t == 0 and 0) or (s <= 0 and 10000) or calculate_badness(t,s)
@@ -226,228 +178,275 @@ local texlists = tex.lists
-- end
-- end
-local parbuilders = builders.paragraphs
-local constructors = parbuilders.constructors
-
-local setmetatableindex = table.setmetatableindex
-
-local fonthashes = fonts.hashes
-local chardata = fonthashes.characters
-local quaddata = fonthashes.quads
-local parameters = fonthashes.parameters
-
-local nuts = nodes.nuts
-local tonut = nuts.tonut
-
-local getfield = nuts.getfield
-local getid = nuts.getid
-local getsubtype = nuts.getsubtype
-local getnext = nuts.getnext
-local getprev = nuts.getprev
-local getboth = nuts.getboth
-local getlist = nuts.getlist
-local getdisc = nuts.getdisc
-local getattr = nuts.getattr
-local getdisc = nuts.getdisc
-local getglue = nuts.getglue
-local getwhd = nuts.getwhd
-local getkern = nuts.getkern
-local getpenalty = nuts.getpenalty
-local getdirection = nuts.getdirection
-local getshift = nuts.getshift
-local getwidth = nuts.getwidth
-local getheight = nuts.getheight
-local getdepth = nuts.getdepth
-local getdata = nuts.getdata
-local getwhd = nuts.getwhd
-
-local isglyph = nuts.isglyph
-
-local setfield = nuts.setfield
-local setlink = nuts.setlink
-local setlist = nuts.setlist
-local setboth = nuts.setboth
-local setnext = nuts.setnext
-local setprev = nuts.setprev
-local setdisc = nuts.setdisc
-local setsubtype = nuts.setsubtype
-local setglue = nuts.setglue
-local setwhd = nuts.setwhd
-local setkern = nuts.setkern
-local setdirection = nuts.setdirection
-local setshift = nuts.setshift
-local setwidth = nuts.setwidth
-local setexpansion = nuts.setexpansion
-
-local slide_node_list = nuts.slide -- get rid of this, probably ok > 78.2
-local find_tail = nuts.tail
-local copy_node = nuts.copy
-local flush_node = nuts.flush
-local flush_node_list = nuts.flush_list
------ hpack_nodes = nuts.hpack
-local xpack_nodes = nuts.hpack
-local replace_node = nuts.replace
-local insert_node_after = nuts.insert_after
-local insert_node_before = nuts.insert_before
-local is_zero_glue = nuts.is_zero_glue
-local is_skipable = nuts.protrusion_skippable
-
-local nodepool = nuts.pool
-
-local nodecodes = nodes.nodecodes
-local kerncodes = nodes.kerncodes
-local glyphcodes = nodes.glyphcodes
-local leadercodes = nodes.leadercodes
-local margincodes = nodes.margincodes
-local disccodes = nodes.disccodes
-local mathcodes = nodes.mathcodes
-local fillcodes = nodes.fillcodes
-local boundarycodes = nodes.boundarycodes
-
-local temp_code = nodecodes.temp
-local glyph_code = nodecodes.glyph
-local ins_code = nodecodes.ins
-local mark_code = nodecodes.mark
-local adjust_code = nodecodes.adjust
-local penalty_code = nodecodes.penalty
-local disc_code = nodecodes.disc
-local math_code = nodecodes.math
-local kern_code = nodecodes.kern
-local glue_code = nodecodes.glue
-local hlist_code = nodecodes.hlist
-local vlist_code = nodecodes.vlist
-local unset_code = nodecodes.unset
-local marginkern_code = nodecodes.marginkern
-local dir_code = nodecodes.dir
-local boundary_code = nodecodes.boundary
-
-local protrusionboundary_code = boundarycodes.protrusion
-
-local leaders_code = leadercodes.leaders
-
-local localpar_code = nodecodes.localpar
-
-local userkern_code = kerncodes.userkern
-local italickern_code = kerncodes.italiccorrection
-local fontkern_code = kerncodes.fontkern
-local accentkern_code = kerncodes.accentkern
-
-local ligatureglyph_code = glyphcodes.ligature
-
-local fillcodes = nodes.fillcodes
-
-local leftmargin_code = margincodes.left
------ rightmargin_code = margincodes.right
-
-local automaticdisc_code = disccodes.automatic
-local regulardisc_code = disccodes.regular
-local firstdisc_code = disccodes.first
-local seconddisc_code = disccodes.second
-
-local endmath_code = mathcodes.endmath
-
-local nosubtype_code = 0
-
-local unhyphenated_code = nodecodes.unhyphenated or 1
-local hyphenated_code = nodecodes.hyphenated or 2
-local delta_code = nodecodes.delta or 3
-local passive_code = nodecodes.passive or 4
-
-local maxdimen = number.maxdimen
-
-local max_halfword = 0x7FFFFFFF
-local infinite_penalty = 10000
-local eject_penalty = -10000
-local infinite_badness = 10000
-local awful_badness = 0x3FFFFFFF
-local ignore_depth = -65536000
-
-local fit_very_loose_class = 0 -- fitness for lines stretching more than their stretchability
-local fit_loose_class = 1 -- fitness for lines stretching 0.5 to 1.0 of their stretchability
-local fit_decent_class = 2 -- fitness for all other lines
-local fit_tight_class = 3 -- fitness for lines shrinking 0.5 to 1.0 of their shrinkability
-
-local new_penalty = nodepool.penalty
-local new_direction = nodepool.direction
-local new_leftmarginkern = nodepool.leftmarginkern
-local new_rightmarginkern = nodepool.rightmarginkern
-local new_leftskip = nodepool.leftskip
-local new_rightskip = nodepool.rightskip
-local new_lineskip = nodepool.lineskip
-local new_baselineskip = nodepool.baselineskip
-local new_temp = nodepool.temp
-local new_rule = nodepool.rule
-local new_hlist = nodepool.hlist
+local parbuilders = builders.paragraphs
+local constructors = parbuilders.constructors
+
+local setmetatableindex = table.setmetatableindex
+
+local fonthashes = fonts.hashes
+local chardata = fonthashes.characters
+local quaddata = fonthashes.quads
+local parameters = fonthashes.parameters
+
+local nuts = nodes.nuts
+local tonut = nuts.tonut
+
+local getfield = nuts.getfield
+local getid = nuts.getid
+local getsubtype = nuts.getsubtype
+local getnext = nuts.getnext
+local getprev = nuts.getprev
+local getboth = nuts.getboth
+local getlist = nuts.getlist
+local getdisc = nuts.getdisc
+local getattr = nuts.getattr
+local getdisc = nuts.getdisc
+local getglue = nuts.getglue
+local getwhd = nuts.getwhd
+local getkern = nuts.getkern
+local getpenalty = nuts.getpenalty
+local getdirection = nuts.getdirection
+local getshift = nuts.getshift
+local getwidth = nuts.getwidth
+local getheight = nuts.getheight
+local getdepth = nuts.getdepth
+local getdata = nuts.getdata
+local getreplace = nuts.getreplace
+local setreplace = nuts.setreplace
+local getpost = nuts.getpost
+local setpost = nuts.setpost
+local getpre = nuts.getpre
+local setpre = nuts.setpre
+
+local isglyph = nuts.isglyph
+local start_of_par = nuts.start_of_par
+
+local setfield = nuts.setfield
+local setlink = nuts.setlink
+local setlist = nuts.setlist
+local setboth = nuts.setboth
+local setnext = nuts.setnext
+local setprev = nuts.setprev
+local setdisc = nuts.setdisc
+local setsubtype = nuts.setsubtype
+local setglue = nuts.setglue
+local setwhd = nuts.setwhd
+local setkern = nuts.setkern
+local setdirection = nuts.setdirection
+local setshift = nuts.setshift
+local setwidth = nuts.setwidth
+local setexpansion = nuts.setexpansion
+
+local find_tail = nuts.tail
+local copy_node = nuts.copy
+local flush_node = nuts.flush
+local flush_node_list = nuts.flush_list
+----- hpack_nodes = nuts.hpack
+local xpack_nodes = nuts.hpack
+local replace_node = nuts.replace
+local remove_node = nuts.remove
+local insert_node_after = nuts.insert_after
+local insert_node_before = nuts.insert_before
+local is_zero_glue = nuts.is_zero_glue
+local is_skipable = nuts.protrusion_skippable
+local setattributelist = nuts.setattributelist
+local find_node = nuts.find_node
+
+local nextnode = nuts.traversers.node
+local nextglue = nuts.traversers.glue
+
+local nodepool = nuts.pool
+
+local nodecodes = nodes.nodecodes
+local kerncodes = nodes.kerncodes
+local margincodes = nodes.margincodes
+local disccodes = nodes.disccodes
+local mathcodes = nodes.mathcodes
+local fillcodes = nodes.fillcodes
+local gluecodes = nodes.gluecodes
+
+local temp_code = nodecodes.temp
+local glyph_code = nodecodes.glyph
+local ins_code = nodecodes.ins
+local mark_code = nodecodes.mark
+local adjust_code = nodecodes.adjust
+local penalty_code = nodecodes.penalty
+local disc_code = nodecodes.disc
+local math_code = nodecodes.math
+local kern_code = nodecodes.kern
+local glue_code = nodecodes.glue
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local unset_code = nodecodes.unset
+local marginkern_code = nodecodes.marginkern
+local dir_code = nodecodes.dir
+local boundary_code = nodecodes.boundary
+local localpar_code = nodecodes.localpar
+
+local protrusionboundary_code = nodes.boundarycodes.protrusion
+local leaders_code = nodes.leadercodes.leaders
+local indentlist_code = nodes.listcodes.indent
+local ligatureglyph_code = nodes.glyphcodes.ligature
+local cancel_code = nodes.dircodes.cancel
+
+local userkern_code = kerncodes.userkern
+local italickern_code = kerncodes.italiccorrection
+local fontkern_code = kerncodes.fontkern
+local accentkern_code = kerncodes.accentkern
+
+local leftmargin_code = margincodes.left
+----- rightmargin_code = margincodes.right
+
+local automaticdisc_code = disccodes.automatic
+local regulardisc_code = disccodes.regular
+local firstdisc_code = disccodes.first
+local seconddisc_code = disccodes.second
+
+local spaceskip_code = gluecodes.spaceskip
+local xspaceskip_code = gluecodes.xspaceskip
+local rightskip_code = gluecodes.rightskip
+
+local endmath_code = mathcodes.endmath
+
+local righttoleft_code = nodes.dirvalues.righttoleft
+
+local nosubtype_code = 0
+
+local unhyphenated_code = nodecodes.unhyphenated or 1
+local hyphenated_code = nodecodes.hyphenated or 2
+local delta_code = nodecodes.delta or 3
+local passive_code = nodecodes.passive or 4
+
+local maxdimen = number.maxdimen
+
+local max_halfword = 0x7FFFFFFF
+local infinite_penalty = 10000
+local eject_penalty = -10000
+local infinite_badness = 10000
+local awful_badness = 0x3FFFFFFF
+local ignore_depth = -65536000
+
+local fit_very_loose_class = 0 -- fitness for lines stretching more than their stretchability
+local fit_loose_class = 1 -- fitness for lines stretching 0.5 to 1.0 of their stretchability
+local fit_decent_class = 2 -- fitness for all other lines
+local fit_tight_class = 3 -- fitness for lines shrinking 0.5 to 1.0 of their shrinkability
+
+local new_penalty = nodepool.penalty
+local new_direction = nodepool.direction
+local new_leftmarginkern = nodepool.leftmarginkern
+local new_rightmarginkern = nodepool.rightmarginkern
+local new_leftskip = nodepool.leftskip
+local new_rightskip = nodepool.rightskip
+local new_lefthangskip = nodepool.lefthangskip
+local new_righthangskip = nodepool.righthangskip
+local new_indentskip = nodepool.indentskip
+local new_correctionskip = nodepool.correctionskip
+local new_lineskip = nodepool.lineskip
+local new_baselineskip = nodepool.baselineskip
+local new_temp = nodepool.temp
+local new_rule = nodepool.rule
+local new_hlist = nodepool.hlist
+
+local getnormalizeline = nuts.getnormalizeline
-- helpers --
-- It makes more sense to move the somewhat messy dir state tracking
-- out of the main functions. First we create a stack allocator.
-local function new_dir_stack(dir) -- also use elsewhere
- return { n = 0, dir }
-end
-
-- The next function checks a dir node and returns the new dir state. By
-- using a static table we are quite efficient. This function is used
-- in the parbuilder.
-local function checked_line_dir(stack,current)
+local function checked_line_dir(stack,current) -- can be inlined now
local direction, pop = getdirection(current)
+ local n = stack.n
if not pop then
- local n = stack.n + 1
+ n = n + 1
stack.n = n
- stack[n] = current
+ stack[n] = direction
return direction
elseif n > 0 then
- local n = stack.n
- local dirnode = stack[n]
- dirstack.n = n - 1
- direction = getdirection(dirnode) -- we could save it
- return direction
+ n = n - 1
+ stack.n = n
+ return stack[n]
else
report_parbuilders("warning: missing pop node (%a)",1) -- in line ...
end
end
--- The next function checks dir nodes in a list and appends the negations
--- that are currently needed (some day LuaTeX will be more tolerant). We use
--- the negations for the next line.
+-- The next function checks dir nodes in a list and injects dir nodes
+-- that are currently needed.
+
+local function inject_dirs_at_begin_of_line(stack,current)
+ local n = stack.n
+ if n > 0 then
+ local h = current
+ for i=1,n do
+ local d = new_direction(stack[i])
+ setattributelist(d,current)
+ h, current = insert_node_after(h,current,d)
+ end
+ stack.n = 0
+ return h
+ else
+ return current
+ end
+end
local function inject_dirs_at_end_of_line(stack,current,start,stop)
- local e = start
local n = stack.n
- local h = nil
- -- todo: traverse
while start and start ~= stop do
local id = getid(start)
if id == dir_code then
local direction, pop = getdirection(start)
if not pop then
n = n + 1
- stack[n] = start
+ stack[n] = direction
elseif n > 0 then
+if direction == stack[n] then
+ -- like in the engine
n = n - 1
+end
else
report_parbuilders("warning: missing pop node (%a)",2) -- in line ...
end
end
start = getnext(start)
end
- for i=n,1,-1 do
- h, current = insert_node_after(current,current,new_direction(getdirection(stack[i]),true))
+ if n > 0 then
+ -- from 1,n and before
+ local h = start
+ for i=n,1,-1 do
+ local d = new_direction(stack[i],true)
+ setattributelist(d,start)
+ h, current = insert_node_after(h,current,d)
+ end
end
stack.n = n
return current
end
-local function inject_dirs_at_begin_of_line(stack,current)
- local h = nil
- for i=stack.n,1,-1 do
- h, current = insert_node_after(current,current,new_direction(stack[i]))
+local ignore_math_skip = node.direct.ignore_math_skip or function(current)
+ local mode = texget("mathskipmode")
+ if mode == 6 or mode == 7 then
+ local b = true
+ local n = getsubtype(current) == endmath_code and getnext(current) or getprev(current)
+ if n and getid(n) == glue_code then
+ local s = getsubtype(n)
+ if s == spaceskip_code or s == xspaceskip_code then
+ b = false
+ end
+ end
+ if mode == 7 then
+ b = not b
+ end
+ if b then
+ setglue(current)
+ return true
+ end
end
- stack.n = 0
- return current
+ return false
end
-- diagnostics --
@@ -487,59 +486,117 @@ local function calculate_fraction(x,n,d,max_answer)
end
end
-local function check_shrinkage(par,n)
- -- called often, so maybe move inline -- use NORMAL
- if getfield(n,"shrink_order") ~= 0 and getfield(n,"shrink") ~= 0 then
- if par.no_shrink_error_yet then
- par.no_shrink_error_yet = false
- report_parbuilders("infinite glue shrinkage found in a paragraph and removed")
- end
- n = copy_node(n)
- setfield(n,"shrink_order",0)
+local function infinite_shrinkage_error(par)
+ if par.no_shrink_error_yet then
+ par.no_shrink_error_yet = false
+ report_parbuilders("infinite glue shrinkage found in a paragraph and removed")
end
- return n
end
-- It doesn't really speed up much but the additional memory usage is
-- rather small so it doesn't hurt too much.
local expansions = { }
-local nothing = { stretch = 0, shrink = 0 }
+local nothing = { stretch = 0, shrink = 0 } -- or just true or so
+
+-- setmetatableindex(expansions,function(t,font) -- we can store this in tfmdata if needed
+-- local expansion = parameters[font].expansion -- can be an extra hash
+-- if expansion and expansion.step ~= 0 then
+-- local stretch = expansion.stretch
+-- local shrink = expansion.shrink
+-- if shrink ~= 0 or stretch ~= 0 then
+-- local factors = { }
+-- local c = chardata[font]
+-- setmetatableindex(factors,function(t,char)
+-- local fc = c[char]
+-- local ef = fc.expansion_factor
+-- if ef and ef > 0 then
+-- if stretch ~= 0 or shrink ~= 0 then
+-- -- todo in lmtx: get rid of quad related scaling
+-- local factor = ef / 1000
+-- local ef_quad = factor * quaddata[font] / 1000
+-- local v = {
+-- glyphstretch = stretch * ef_quad,
+-- glyphshrink = shrink * ef_quad,
+-- factor = factor, -- do we need these, if not then we
+-- stretch = stretch, -- can as well use the chardata table
+-- shrink = shrink, -- to store the two above
+-- }
+-- t[char] = v
+-- return v
+-- end
+-- end
+-- t[char] = nothing
+-- return nothing
+-- end)
+-- t[font] = factors
+-- return factors
+-- end
+-- end
+-- t[font] = false
+-- return false
+-- end)
+
+-- local function kern_stretch_shrink(p,d)
+-- local left = getprev(p)
+-- if left then
+-- local char, font = isglyph(left)
+-- if char then
+-- local data = expansions[font]
+-- if data then
+-- data = data[char]
+-- if data then
+-- local stretch = data.stretch
+-- local shrink = data.shrink
+-- if stretch ~= 0 then
+-- stretch = data.factor * d * (stretch - 1)
+-- end
+-- if shrink ~= 0 then
+-- shrink = data.factor * d * (shrink - 1)
+-- end
+-- return stretch, shrink
+-- end
+-- end
+-- end
+-- end
+-- return 0, 0
+-- end
setmetatableindex(expansions,function(t,font) -- we can store this in tfmdata if needed
local expansion = parameters[font].expansion -- can be an extra hash
- if expansion and expansion.auto then
- local factors = { }
- local c = chardata[font]
- setmetatableindex(factors,function(t,char)
- local fc = c[char]
- local ef = fc.expansion_factor
- if ef and ef > 0 then
- local stretch = expansion.stretch
- local shrink = expansion.shrink
- if stretch ~= 0 or shrink ~= 0 then
+ if expansion and expansion.step ~= 0 then
+ local stretch = expansion.stretch
+ local shrink = expansion.shrink
+ if shrink ~= 0 or stretch ~= 0 then
+ local factors = {
+ stretch = stretch,
+ shrink = shrink,
+ }
+ local c = chardata[font]
+ setmetatableindex(factors,function(t,char)
+ local fc = c[char]
+ local ef = fc.expansion_factor
+ if ef and ef > 0 and stretch ~= 0 or shrink ~= 0 then
+ -- todo in lmtx: get rid of quad related scaling
local factor = ef / 1000
local ef_quad = factor * quaddata[font] / 1000
local v = {
glyphstretch = stretch * ef_quad,
glyphshrink = shrink * ef_quad,
factor = factor,
- stretch = stretch,
- shrink = shrink,
}
t[char] = v
return v
end
- end
- t[char] = nothing
- return nothing
- end)
- t[font] = factors
- return factors
- else
- t[font] = false
- return false
+ t[char] = nothing
+ return nothing
+ end)
+ t[font] = factors
+ return factors
+ end
end
+ t[font] = false
+ return false
end)
local function kern_stretch_shrink(p,d)
@@ -547,19 +604,21 @@ local function kern_stretch_shrink(p,d)
if left then
local char, font = isglyph(left)
if char then
- local data = expansions[font][char]
- if data then
- local stretch = data.stretch
- local shrink = data.shrink
- if stretch ~= 0 then
- -- stretch = data.factor * (d * stretch - d)
- stretch = data.factor * d * (stretch - 1)
- end
- if shrink ~= 0 then
- -- shrink = data.factor * (d * shrink - d)
- shrink = data.factor * d * (shrink - 1)
+ local fdata = expansions[font]
+ if fdata then
+ local cdata = fdata[char]
+ if cdata then
+ local stretch = fdata.stretch
+ local shrink = fdata.shrink
+ local factor = cdata.factor * d
+ if stretch ~= 0 then
+ stretch = factor * (stretch - 1)
+ end
+ if shrink ~= 0 then
+ shrink = factor * (shrink - 1)
+ end
+ return stretch, shrink
end
- return stretch, shrink
end
end
end
@@ -583,6 +642,9 @@ end)
-- state:
+-- the step criterium is no longer an issue, we can be way more tolerant in
+-- luatex as we act per glyph
+
local function check_expand_pars(checked_expansion,f)
local expansion = parameters[f].expansion
if not expansion then
@@ -670,7 +732,7 @@ local function find(head) -- do we really want to recurse into an hlist?
elseif id == boundary_code then
if getsubtype(head) == protrusionboundary_code then
local v = getdata(head)
- if v == 1 or v == 3 then
+ if v == 1 or v == 3 then -- brrr
head = getnext(head)
if head then
head = getnext(head)
@@ -754,7 +816,7 @@ local function left_pw(p)
if not prot or prot == 0 then
return 0
end
- return prot * quaddata[font] / 1000, p
+ return prot, p
end
local function right_pw(p)
@@ -763,7 +825,7 @@ local function right_pw(p)
if not prot or prot == 0 then
return 0
end
- return prot * quaddata[font] / 1000, p
+ return prot, p
end
-- par parameters
@@ -785,12 +847,7 @@ local function add_to_width(line_break_dir,checked_expansion,s) -- split into tw
while s do
local char, id = isglyph(s)
if char then
- local wd, ht, dp = getwhd(s)
- if is_rotated(line_break_dir) then
- size = size + ht + dp
- else
- size = size + wd
- end
+ size = size + getwidth(s)
if checked_expansion then
local data = checked_expansion[id] -- id == font
if data then
@@ -802,12 +859,7 @@ local function add_to_width(line_break_dir,checked_expansion,s) -- split into tw
end
end
elseif id == hlist_code or id == vlist_code then
- local wd, ht, dp = getwhd(s)
- if textdir_parallel(getdirection(s),line_break_dir) then
- size = size + wd
- else
- size = size + ht + dp
- end
+ size = size + getwidth(s)
elseif id == kern_code then
local kern = getkern(s)
if kern ~= 0 then
@@ -910,20 +962,21 @@ do
local function append_to_vlist(par, b)
local prev_depth = par.prev_depth
local head_field = par.head_field
- local tail_field = head_field and slide_node_list(head_field) -- todo: find_tail
+ local tail_field = head_field and find_tail(head_field)
local is_hlist = getid(b) == hlist_code
- -- if prev_depth > par.ignored_dimen then
if prev_depth > ignore_depth then
if is_hlist then
- local width, stretch, shrink, stretch_order, shrink_order = getglue(par.baseline_skip)
+ -- we can fetch the skips values earlier if needed
+ local width, stretch, shrink, stretch_order, shrink_order = unpack(par.baseline_skip)
local delta = width - prev_depth - getheight(b) -- deficiency of space between baselines
local skip = nil
if delta < par.line_skip_limit then
- width, stretch, shrink, stretch_order, shrink_order = getglue(par.lineskip)
+ width, stretch, shrink, stretch_order, shrink_order = unpack(par.lineskip)
skip = new_lineskip(width, stretch, shrink, stretch_order, shrink_order)
else
skip = new_baselineskip(delta, stretch, shrink, stretch_order, shrink_order)
end
+ setattributelist(skip,par.head)
if head_field then
setlink(tail_field,skip)
else
@@ -941,14 +994,14 @@ do
if is_hlist then
local pd = getdepth(b)
par.prev_depth = pd
- texnest[texnest.ptr].prevdepth = pd
+ texset("prevdepth",pd)
end
end
local function append_list(par, b)
local head_field = par.head_field
if head_field then
- local n = slide_node_list(head_field) -- todo: find_tail
+ local n = find_tail(head_field)
setlink(n,b)
else
par.head_field = b
@@ -961,18 +1014,18 @@ do
local function initialize_line_break(head,display)
- local hang_indent = tex.hangindent or 0
- local hsize = tex.hsize or 0
- local hang_after = tex.hangafter or 0
- local par_shape_ptr = tex.parshape
- local left_skip = tonut(tex.leftskip) -- nodes
- local right_skip = tonut(tex.rightskip) -- nodes
- local pretolerance = tex.pretolerance
- local tolerance = tex.tolerance
- local adjust_spacing = tex.adjustspacing
- local protrude_chars = tex.protrudechars
- local last_line_fit = tex.lastlinefit
- local par_dir = tex.pardirection
+ local hang_indent = texget("hangindent")
+ local hsize = texget("hsize")
+ local hang_after = texget("hangafter")
+ local par_shape_ptr = texget("parshape")
+ local left_skip = { texgetglue("leftskip") }
+ local right_skip = { texgetglue("rightskip") }
+ local pretolerance = texget("pretolerance")
+ local tolerance = texget("tolerance")
+ local adjust_spacing = texget("adjustspacing")
+ local protrude_chars = texget("protrudechars")
+ local last_line_fit = texget("lastlinefit")
+ local par_dir = texget("pardirection")
local newhead = new_temp()
setnext(newhead,head)
@@ -996,11 +1049,11 @@ do
pass_number = 0, -- the number of passive nodes allocated on this pass
auto_breaking = 0, -- make auto_breaking accessible out of line_break
- active_width = { size = 0, stretch = 0, fi = 0, fil = 0, fill = 0, filll = 0, shrink = 0, adjust_stretch = 0, adjust_shrink = 0 },
- break_width = { size = 0, stretch = 0, fi = 0, fil = 0, fill = 0, filll = 0, shrink = 0, adjust_stretch = 0, adjust_shrink = 0 },
- disc_width = { size = 0, adjust_stretch = 0, adjust_shrink = 0 },
- fill_width = { stretch = 0, fi = 0, fil = 0, fill = 0, filll = 0, shrink = 0 },
- background = { size = 0, stretch = 0, fi = 0, fil = 0, fill = 0, filll = 0, shrink = 0 },
+ active_width = { size = 0, normal = 0, fi = 0, fil = 0, fill = 0, filll = 0, shrink = 0, adjust_stretch = 0, adjust_shrink = 0 },
+ break_width = { size = 0, normal = 0, fi = 0, fil = 0, fill = 0, filll = 0, shrink = 0, adjust_stretch = 0, adjust_shrink = 0 },
+ disc_width = { size = 0, adjust_stretch = 0, adjust_shrink = 0 },
+ fill_width = { normal = 0, fi = 0, fil = 0, fill = 0, filll = 0, shrink = 0 },
+ background = { size = 0, normal = 0, fi = 0, fil = 0, fill = 0, filll = 0, shrink = 0 },
hang_indent = hang_indent,
hsize = hsize,
@@ -1017,39 +1070,29 @@ do
max_shrink_ratio = adjust_spacing_status,
cur_font_step = adjust_spacing_status,
checked_expansion = false,
- tracing_paragraphs = tex.tracingparagraphs > 0,
-
- emergency_stretch = tex.emergencystretch or 0,
- looseness = tex.looseness or 0,
- line_penalty = tex.linepenalty or 0,
- hyphen_penalty = tex.hyphenpenalty or 0,
- broken_penalty = tex.brokenpenalty or 0,
- inter_line_penalty = tex.interlinepenalty or 0,
- club_penalty = tex.clubpenalty or 0,
- widow_penalty = tex.widowpenalty or 0,
- display_widow_penalty = tex.displaywidowpenalty or 0,
- ex_hyphen_penalty = tex.exhyphenpenalty or 0,
+ tracing_paragraphs = texget("tracingparagraphs") > 0,
- adj_demerits = tex.adjdemerits or 0,
- double_hyphen_demerits = tex.doublehyphendemerits or 0,
- final_hyphen_demerits = tex.finalhyphendemerits or 0,
+ emergency_stretch = texget("emergencystretch") or 0,
+ looseness = texget("looseness") or 0,
+ line_penalty = texget("linepenalty") or 0,
+ broken_penalty = texget("brokenpenalty") or 0,
+ inter_line_penalty = texget("interlinepenalty") or 0,
+ club_penalty = texget("clubpenalty") or 0,
+ widow_penalty = texget("widowpenalty") or 0,
+ display_widow_penalty = texget("displaywidowpenalty") or 0,
- first_line = 0, -- texnest[texnest.ptr].modeline, -- 0, -- cur_list.pg_field
+ adj_demerits = texget("adjdemerits") or 0,
+ double_hyphen_demerits = texget("doublehyphendemerits") or 0,
+ final_hyphen_demerits = texget("finalhyphendemerits") or 0,
- -- each_line_height = tex.pdfeachlineheight or 0, -- this will go away
- -- each_line_depth = tex.pdfeachlinedepth or 0, -- this will go away
- -- first_line_height = tex.pdffirstlineheight or 0, -- this will go away
- -- last_line_depth = tex.pdflastlinedepth or 0, -- this will go away
+ first_line = texget("prevgraf"),
+ prev_depth = texget("prevdepth"),
- -- ignored_dimen = tex.pdfignoreddimen or 0,
+ baseline_skip = { texgetglue("baselineskip") },
+ lineskip = { texgetglue("lineskip") },
+ line_skip_limit = texget("lineskiplimit"),
- baseline_skip = tonut(tex.baselineskip),
- lineskip = tonut(tex.lineskip),
- line_skip_limit = tex.lineskiplimit,
-
- prev_depth = texnest[texnest.ptr].prevdepth,
-
- final_par_glue = slide_node_list(head), -- todo: we know tail already, slow
+ final_par_glue = find_tail(head),
par_break_dir = par_dir,
line_break_dir = par_dir,
@@ -1118,11 +1161,6 @@ do
}
- -- optimizers
-
- par.used_left_skip = used_skip(par.left_skip)
- par.used_right_skip = used_skip(par.right_skip)
-
-- so far
if adjust_spacing > 1 then
@@ -1138,7 +1176,7 @@ do
par.tolerance = hztolerance
end
- expand_kerns = expand_kerns_mode or (adjust_spacing == 2)
+ expand_kerns = expand_kerns_mode or (adjust_spacing == 2) -- why not > 1 ?
end
@@ -1146,11 +1184,17 @@ do
local background = par.background
- local l = check_shrinkage(par,left_skip)
- local r = check_shrinkage(par,right_skip)
+ local lwidth, lstretch, lshrink, lstretch_order, lshrink_order = unpack(left_skip)
+ local rwidth, rstretch, rshrink, rstretch_order, rshrink_order = unpack(right_skip)
- local lwidth, lstretch, lshrink, lstretch_order, lshrink_order = getglue(l)
- local rwidth, rstretch, rshrink, rstretch_order, rshrink_order = getglue(r)
+ if lshrink_order ~= 0 and lshrink ~= 0 then
+ infinite_shrinkage_error(par)
+ lshrink_order = 0
+ end
+ if rshrink_order ~= 0 and rshrink ~= 0 then
+ infinite_shrinkage_error(par)
+ rshrink_order = 0
+ end
local l_order = fillcodes[lstretch_order]
local r_order = fillcodes[rstretch_order]
@@ -1167,8 +1211,8 @@ do
par.second_width = hsize
par.second_indent = 0
else
- local abs_hang_after = hang_after >0 and hang_after or -hang_after
- local abs_hang_indent = hang_indent>0 and hang_indent or -hang_indent
+ local abs_hang_after = hang_after > 0 and hang_after or -hang_after
+ local abs_hang_indent = hang_indent > 0 and hang_indent or -hang_indent
par.last_special_line = abs_hang_after
if hang_after < 0 then
par.first_width = hsize - abs_hang_indent
@@ -1243,21 +1287,19 @@ do
local function post_line_break(par)
- local prevgraf = texnest[texnest.ptr].prevgraf
+ local prevgraf = par.first_line -- or texget("prevgraf")
local current_line = prevgraf + 1 -- the current line number being justified
-
local adjust_spacing = par.adjust_spacing
local protrude_chars = par.protrude_chars
local statistics = par.statistics
-
- local stack = new_dir_stack()
-
- local leftskip = par.used_left_skip -- used or normal ?
+ local leftskip = par.left_skip
local rightskip = par.right_skip
local parshape = par.par_shape_ptr
- ----- ignored_dimen = par.ignored_dimen
+ -- local adapt_width = par.adapt_width
+ local hsize = par.hsize
- local adapt_width = par.adapt_width
+ local dirstack = par.dirstack
+ local normalize = getnormalizeline()
-- reverse the links of the relevant passive nodes, goto first breakpoint
@@ -1273,11 +1315,15 @@ do
local head = par.head
- -- maybe : each_...
+ -- when we normalize and have no content still ls/rs gets appended while
+ -- the engine doesnt' do that so there is some test missing that prevents
+ -- entering here
while current_break do
- inject_dirs_at_begin_of_line(stack,head)
+ -- hm, here we have head == localpar and in the engine it's a temp node
+
+ head = inject_dirs_at_begin_of_line(dirstack,head)
local disc_break = false
local post_disc_break = false
@@ -1285,10 +1331,9 @@ do
local lineend = nil -- lineend : the last node of the line (and paragraph)
local lastnode = current_break.cur_break -- lastnode: the node after which the dir nodes should be closed
-
if not lastnode then
-- only at the end
- lastnode = slide_node_list(head) -- todo: find_tail
+ lastnode = find_tail(head)
if lastnode == par.final_par_glue then
lineend = lastnode
lastnode = getprev(lastnode)
@@ -1296,16 +1341,16 @@ do
else -- todo: use insert_list_after
local id = getid(lastnode)
if id == glue_code then
- -- lastnode is normal skip
- lastnode = replace_node(lastnode,new_rightskip(rightskip))
+ local r = new_rightskip(unpack(rightskip))
+ setattributelist(r,lastnode)
+ lastnode = replace_node(lastnode,r)
glue_break = true
lineend = lastnode
lastnode = getprev(lastnode)
elseif id == disc_code then
- local prevlast = getprev(lastnode)
- local nextlast = getnext(lastnode)
- local subtype = getsubtype(lastnode)
+ local prevlast, nextlast = getboth(lastnode)
local pre, post, replace, pretail, posttail, replacetail = getdisc(lastnode,true)
+ local subtype = getsubtype(lastnode)
if subtype == seconddisc_code then
if not (getid(prevlast) == disc_code and getsubtype(prevlast) == firstdisc_code) then
report_parbuilders('unsupported disc at location %a',3)
@@ -1337,8 +1382,8 @@ do
report_parbuilders('unsupported disc at location %a',4)
end
setsubtype(nextlast,regulardisc_code)
- setfield(nextlast,"replace",post)
- setfield(lastnode,"post") -- nil
+ setreplace(nextlast,post)
+ setpost(lastnode)
end
if replace then
flush_node_list(replace)
@@ -1356,13 +1401,16 @@ do
disc_break = true
elseif id == kern_code then
setkern(lastnode,0)
- elseif getid(lastnode) == math_code then
+ elseif id == math_code then
setkern(lastnode,0) -- surround
-- new in luatex
setglue(lastnode) -- zeros
end
end
- lastnode = inject_dirs_at_end_of_line(stack,lastnode,getnext(head),current_break.cur_break)
+ -- todo: clean up this mess which results from all kind of engine merges
+ -- (start/end nodes)
+ -- hm, head ?
+ lastnode = inject_dirs_at_end_of_line(dirstack,lastnode,getnext(head),current_break.cur_break)
local rightbox = current_break.passive_right_box
if rightbox then
lastnode = insert_node_after(lastnode,lastnode,copy_node(rightbox))
@@ -1371,50 +1419,186 @@ do
lineend = lastnode
end
if lineend and lineend ~= head and protrude_chars > 0 then
- local id = getid(lineend)
- local c = (disc_break and (id == glyph_code or id ~= disc_code) and lineend) or getprev(lineend)
- local p = find_protchar_right(getnext(head),c)
- if p and getid(p) == glyph_code then
- local w, last_rightmost_char = right_pw(p)
- if last_rightmost_char and w ~= 0 then
- -- so we inherit attributes, lineend is new pseudo head
- lineend, c = insert_node_after(lineend,c,new_rightmarginkern(copy_node(last_rightmost_char),-w))
+ if par.line_break_dir == righttoleft_code then
+ if protrude_chars > 2 then
+ local p = lineend
+ local l = nil
+ -- Backtrack over the last zero glues and dirs.
+ while p do
+ local id = getid(p)
+ if id == dir_code then
+ if getsubtype(p) ~= cancel_code then
+ break
+ end
+ p = getprev(p)
+ elseif id == glue_code then
+ if getwidth(p) == 0 then
+ p = getprev(p)
+ else
+ p = nil
+ break
+ end
+ elseif id == glyph_code then
+ break
+ else
+ p = nil
+ break
+ end
+ end
+ -- When |p| is non zero we have something.
+ while p do
+ local id = getid(p)
+ if id == glyph_code then
+ l = p
+ elseif id == glue_code then
+ if getwidth(p) == 0 then
+ -- No harm done.
+ else
+ l = nil
+ end
+ elseif id == dir_code then
+ if getdirection(p) ~= righttoleft_code then
+ p = nil
+ end
+ break
+ elseif id == localpar_code then
+ break
+ elseif id == temp_code then
+ -- Go on.
+ else
+ l = nil
+ end
+ p = getprev(p)
+ end
+ if l and p then
+ local w, last_rightmost_char = right_pw(l)
+ if last_rightmost_char and w ~= 0 then
+ local k = new_rightmarginkern(copy_node(last_rightmost_char),-w)
+ setattributelist(k,l)
+ setlink(p,k,l)
+ end
+ end
+ end
+ else
+ local id = getid(lineend)
+ local c = nil
+ if disc_break and (id == glyph_code or id ~= disc_code) then
+ c = lineend
+ else
+ c = getprev(lineend)
+ end
+ local p = find_protchar_right(getnext(head),c)
+ if p and getid(p) == glyph_code then
+ local w, last_rightmost_char = right_pw(p)
+ if last_rightmost_char and w ~= 0 then
+ -- so we inherit attributes, lineend is new pseudo head
+ local k = new_rightmarginkern(copy_node(last_rightmost_char),-w)
+ setattributelist(k,p)
+-- insert_node_after(c,c,k)
+ insert_node_after(p,p,k)
+-- if c == lineend then
+-- lineend = getnext(c)
+-- end
+ end
end
end
end
-- we finish the line
local r = getnext(lineend)
- setnext(lineend)
+ setnext(lineend) -- lineend moves on as pseudo head
+ local start = getnext(head)
+ setlink(head,r)
if not glue_break then
- if rightskip then
- insert_node_after(lineend,lineend,new_rightskip(right_skip)) -- lineend moves on as pseudo head
- end
+ local rs = new_rightskip(unpack(rightskip))
+ setattributelist(rs,lineend)
+ start, lineend = insert_node_after(start,lineend,rs)
end
- -- each time ?
- local q = getnext(head)
- setlink(head,r)
+ local rs = lineend
-- insert leftbox (if needed after parindent)
local leftbox = current_break.passive_left_box
if leftbox then
- local first = getnext(q)
+ local first = getnext(start)
if first and current_line == (par.first_line + 1) and getid(first) == hlist_code and not getlist(first) then
- insert_node_after(q,q,copy_node(leftbox))
+ insert_node_after(start,start,copy_node(leftbox))
else
- q = insert_node_before(q,q,copy_node(leftbox))
+ start = insert_node_before(start,start,copy_node(leftbox))
end
end
if protrude_chars > 0 then
- local p = find_protchar_left(q)
- if p and getid(p) == glyph_code then
- local w, last_leftmost_char = left_pw(p)
- if last_leftmost_char and w ~= 0 then
- -- so we inherit attributes, q is pseudo head and moves back
- q = insert_node_before(q,q,new_leftmarginkern(copy_node(last_leftmost_char),-w))
+ if par.line_break_dir == righttoleft_code then
+ if protrude_chars > 2 then
+ local p = find_protchar_left(start)
+ if p then
+ local w, last_leftmost_char = right_pw(p)
+ if last_leftmost_char and w ~= 0 then
+ local k = new_rightmarginkern(copy_node(last_leftmost_char),-w)
+ setattributelist(k,p)
+ start = insert_node_before(start,start,k)
+ end
+ end
+ end
+ else
+ local p = find_protchar_left(start)
+ if p and getid(p) == glyph_code then
+ local w, last_leftmost_char = left_pw(p)
+ if last_leftmost_char and w ~= 0 then
+ -- so we inherit attributes, start is pseudo head and moves back
+ local k = new_leftmarginkern(copy_node(last_leftmost_char),-w)
+ setattributelist(k,p)
+ start = insert_node_before(start,start,k)
+ end
end
end
end
- if leftskip then
- q = insert_node_before(q,q,new_leftskip(leftskip))
+ local ls
+ if leftskip or normalize > 0 then
+ -- we could check for non zero but we will normalize anyway
+ ls = new_leftskip(unpack(leftskip))
+ setattributelist(ls,start)
+ start = insert_node_before(start,start,ls)
+ end
+ if normalize > 0 then
+ local localpar = nil
+ local localdir = nil
+ local indent = nil
+ local localpars = nil
+ local notflocal = 0
+ for n, id, subtype in nextnode, start do
+ if id == hlist_code then
+ if normalize > 1 and subtype == indentlist_code then
+ indent = n
+ end
+ elseif id == localpar_code then
+ if start_of_par(n) then --- maybe subtype check instead
+ localpar = n
+ elseif noflocals then
+ noflocals = noflocals + 1
+ localpars[noflocals] = n
+ else
+ noflocals = 1
+ localpars = { n }
+ end
+ elseif id == dir_code then
+ if localpar and not localdir and subtype(n) == cancel_code then
+ localdir = n
+ end
+ end
+ end
+ if indent then
+ local i = new_indentskip(getwidth(indent))
+ setattributelist(i,start)
+ replace_node(indent,i)
+ end
+ if localdir then
+ local d = new_direction((getdirection(localpar)))
+ setattributelist(d,start)
+ replace_node(localpar,d)
+ end
+ if localpars then
+ for i=1,noflocals do
+ start = remove_node(start,localpars[i],true)
+ end
+ end
end
local cur_width, cur_indent
if current_line > par.last_special_line then
@@ -1428,20 +1612,48 @@ do
cur_indent = par.first_indent
cur_width = par.first_width
end
-
- if adapt_width then -- extension
- local l, r = adapt_width(par,current_line)
- cur_indent = cur_indent + l
- cur_width = cur_width - l - r
+ -- extension
+ -- if adapt_width then
+ -- local l, r = adapt_width(par,current_line)
+ -- cur_indent = cur_indent + l
+ -- cur_width = cur_width - l - r
+ -- end
+ --
+ if normalize > 2 then
+ local l = new_lefthangskip()
+ local r = new_righthangskip()
+ if cur_width ~= hsize then
+ cur_indent = hsize - cur_width
+ end
+ if cur_indent > 0 then
+ setwidth(l,cur_indent)
+ elseif cur_indent < 0 then
+ setwidth(r,-cur_indent)
+ end
+ setattributelist(l,start)
+ setattributelist(r,start)
+ if normalize > 3 then
+ -- makes most sense
+ start = insert_node_after(start,ls,l)
+ start = insert_node_before(start,rs,r)
+ else
+ start = insert_node_before(start,ls,l)
+ start = insert_node_after(start,rs,r)
+ end
+ cur_width = hsize
+ cur_indent = 0
end
-
+ --
statistics.noflines = statistics.noflines + 1
+ --
+ -- here we could cleanup: remove all if we have (zero) skips only
+ --
local finished_line = nil
if adjust_spacing > 0 then
statistics.nofadjustedlines = statistics.nofadjustedlines + 1
- finished_line = xpack_nodes(q,cur_width,"cal_expand_ratio",par.par_break_dir,par.first_line,current_line) -- ,current_break.analysis)
+ finished_line = xpack_nodes(start,cur_width,"cal_expand_ratio",par.par_break_dir,par.first_line,current_line) -- ,current_break.analysis)
else
- finished_line = xpack_nodes(q,cur_width,"exactly",par.par_break_dir,par.first_line,current_line) -- ,current_break.analysis)
+ finished_line = xpack_nodes(start,cur_width,"exactly",par.par_break_dir,par.first_line,current_line) -- ,current_break.analysis)
end
if protrude_chars > 0 then
statistics.nofprotrudedlines = statistics.nofprotrudedlines + 1
@@ -1451,22 +1663,7 @@ do
local pre_adjust_head = texlists.pre_adjust_head
--
setshift(finished_line,cur_indent)
- --
- -- -- this is gone:
- --
- -- if par.each_line_height ~= ignored_dimen then
- -- setheight(finished_line,par.each_line_height)
- -- end
- -- if par.each_line_depth ~= ignored_dimen then
- -- setdepth(finished_line,par.each_line_depth)
- -- end
- -- if par.first_line_height ~= ignored_dimen and (current_line == par.first_line + 1) then
- -- setheight(finished_line,par.first_line_height)
- -- end
- -- if par.last_line_depth ~= ignored_dimen and current_line + 1 == par.best_line then
- -- setdepth(finished_line,par.last_line_depth)
- -- end
- --
+ --
if texlists.pre_adjust_head ~= pre_adjust_head then
append_list(par, texlists.pre_adjust_head)
texlists.pre_adjust_head = pre_adjust_head
@@ -1502,7 +1699,9 @@ do
end
end
if pen ~= 0 then
- append_to_vlist(par,new_penalty(pen))
+ local p = new_penalty(pen)
+ setattributelist(p,par.head)
+ append_to_vlist(par,p)
end
end
current_line = current_line + 1
@@ -1544,16 +1743,29 @@ do
setlink(head,next)
end
end
+par.head = head
end
-- if current_line ~= par.best_line then
-- report_parbuilders("line breaking")
-- end
- par.head = nil -- needs checking
+ local h = par.head -- hm, head
+ if h then
+ if trace_basic then
+ if getnext(h) then
+ report_parbuilders("something is left over")
+ end
+ if getid(h) ~= localpar_code then
+ report_parbuilders("no local par node")
+ end
+ end
+ flush_node(h)
+ par.head = nil -- needs checking
+ end
current_line = current_line - 1
if trace_basic then
report_parbuilders("paragraph broken into %a lines",current_line)
end
- texnest[texnest.ptr].prevgraf = current_line
+ texset("prevgraf",current_line)
end
local function wrap_up(par)
@@ -1578,10 +1790,14 @@ do
end
end
end
- -- we have a bunch of glue and and temp nodes not freed
+ -- This differs from the engine, where the temp node is removed elsewhere.
local head = par.head
- if getid(head) == temp_code then
- par.head = getnext(head)
+ if head and getid(head) == temp_code then
+ local next = getnext(head)
+ par.head = next
+ if next then
+ setprev(next)
+ end
flush_node(head)
end
post_line_break(par)
@@ -1603,13 +1819,13 @@ do
if prev_r == active then
r = active.next
if r.id == delta_code then
- local aw = active_width.size + r.size active_width.size = aw cur_active_width.size = aw
- local aw = active_width.stretch + r.stretch active_width.stretch = aw cur_active_width.stretch = aw
- local aw = active_width.fi + r.fi active_width.fi = aw cur_active_width.fi = aw
- local aw = active_width.fil + r.fil active_width.fil = aw cur_active_width.fil = aw
- local aw = active_width.fill + r.fill active_width.fill = aw cur_active_width.fill = aw
- local aw = active_width.filll + r.filll active_width.filll = aw cur_active_width.filll = aw
- local aw = active_width.shrink + r.shrink active_width.shrink = aw cur_active_width.shrink = aw
+ local aw = active_width.size + r.size active_width.size = aw cur_active_width.size = aw
+ local aw = active_width.normal + r.normal active_width.normal = aw cur_active_width.normal = aw
+ local aw = active_width.fi + r.fi active_width.fi = aw cur_active_width.fi = aw
+ local aw = active_width.fil + r.fil active_width.fil = aw cur_active_width.fil = aw
+ local aw = active_width.fill + r.fill active_width.fill = aw cur_active_width.fill = aw
+ local aw = active_width.filll + r.filll active_width.filll = aw cur_active_width.filll = aw
+ local aw = active_width.shrink + r.shrink active_width.shrink = aw cur_active_width.shrink = aw
if checked_expansion then
local aw = active_width.adjust_stretch + r.adjust_stretch active_width.adjust_stretch = aw cur_active_width.adjust_stretch = aw
local aw = active_width.adjust_shrink + r.adjust_shrink active_width.adjust_shrink = aw cur_active_width.adjust_shrink = aw
@@ -1621,13 +1837,13 @@ do
elseif prev_r.id == delta_code then
r = prev_r.next
if r == active then
- cur_active_width.size = cur_active_width.size - prev_r.size
- cur_active_width.stretch = cur_active_width.stretch - prev_r.stretch
- cur_active_width.fi = cur_active_width.fi - prev_r.fi
- cur_active_width.fil = cur_active_width.fil - prev_r.fil
- cur_active_width.fill = cur_active_width.fill - prev_r.fill
- cur_active_width.filll = cur_active_width.filll - prev_r.filll
- cur_active_width.shrink = cur_active_width.shrink - prev_r.shrink
+ cur_active_width.size = cur_active_width.size - prev_r.size
+ cur_active_width.normal = cur_active_width.normal - prev_r.normal
+ cur_active_width.fi = cur_active_width.fi - prev_r.fi
+ cur_active_width.fil = cur_active_width.fil - prev_r.fil
+ cur_active_width.fill = cur_active_width.fill - prev_r.fill
+ cur_active_width.filll = cur_active_width.filll - prev_r.filll
+ cur_active_width.shrink = cur_active_width.shrink - prev_r.shrink
if checked_expansion then
cur_active_width.adjust_stretch = cur_active_width.adjust_stretch - prev_r.adjust_stretch
cur_active_width.adjust_shrink = cur_active_width.adjust_shrink - prev_r.adjust_shrink
@@ -1637,13 +1853,13 @@ do
-- prev_r = nil
prev_r = prev_prev_r
elseif r.id == delta_code then
- local rn = r.size cur_active_width.size = cur_active_width.size + rn prev_r.size = prev_r.size + rn
- local rn = r.stretch cur_active_width.stretch = cur_active_width.stretch + rn prev_r.stretch = prev_r.stretch + rn
- local rn = r.fi cur_active_width.fi = cur_active_width.fi + rn prev_r.fi = prev_r.fi + rn
- local rn = r.fil cur_active_width.fil = cur_active_width.fil + rn prev_r.fil = prev_r.fil + rn
- local rn = r.fill cur_active_width.fill = cur_active_width.fill + rn prev_r.fill = prev_r.fill + rn
- local rn = r.filll cur_active_width.filll = cur_active_width.filll + rn prev_r.filll = prev_r.fill + rn
- local rn = r.shrink cur_active_width.shrink = cur_active_width.shrink + rn prev_r.shrink = prev_r.shrink + rn
+ local rn = r.size cur_active_width.size = cur_active_width.size + rn prev_r.size = prev_r.size + rn
+ local rn = r.normal cur_active_width.normal = cur_active_width.normal + rn prev_r.normal = prev_r.normal + rn
+ local rn = r.fi cur_active_width.fi = cur_active_width.fi + rn prev_r.fi = prev_r.fi + rn
+ local rn = r.fil cur_active_width.fil = cur_active_width.fil + rn prev_r.fil = prev_r.fil + rn
+ local rn = r.fill cur_active_width.fill = cur_active_width.fill + rn prev_r.fill = prev_r.fill + rn
+ local rn = r.filll cur_active_width.filll = cur_active_width.filll + rn prev_r.filll = prev_r.fill + rn
+ local rn = r.shrink cur_active_width.shrink = cur_active_width.shrink + rn prev_r.shrink = prev_r.shrink + rn
if checked_expansion then
local rn = r.adjust_stretch cur_active_width.adjust_stretch = cur_active_width.adjust_stretch + rn prev_r.adjust_stretch = prev_r.adjust_stretch + rn
local rn = r.adjust_shrink cur_active_width.adjust_shrink = cur_active_width.adjust_shrink + rn prev_r.adjust_shrink = prev_r.adjust_shrink + rn
@@ -1663,7 +1879,7 @@ do
if cur_active_width.fi ~= fill_width.fi or cur_active_width.fil ~= fill_width.fil or cur_active_width.fill ~= fill_width.fill or cur_active_width.filll ~= fill_width.filll then
return false, 0, fit_decent_class, 0, 0
end
- local adjustment = active_short > 0 and cur_active_width.stretch or cur_active_width.shrink
+ local adjustment = active_short > 0 and cur_active_width.normal or cur_active_width.shrink
if adjustment <= 0 then
return false, 0, fit_decent_class, adjustment, 0
end
@@ -1673,7 +1889,7 @@ do
end
local fit_class = fit_decent_class
if adjustment > 0 then
- local stretch = cur_active_width.stretch
+ local stretch = cur_active_width.normal
if adjustment > shortfall then
adjustment = shortfall
end
@@ -1750,13 +1966,13 @@ do
local tracing_paragraphs = par.tracing_paragraphs
-- local par_active = par.active
- local adapt_width = par.adapt_width
+ -- local adapt_width = par.adapt_width
local parshape = par.par_shape_ptr
local cur_active_width = checked_expansion and { -- distance from current active node
size = active_width.size,
- stretch = active_width.stretch,
+ normal = active_width.normal,
fi = active_width.fi,
fil = active_width.fil,
fill = active_width.fill,
@@ -1766,7 +1982,7 @@ do
adjust_shrink = active_width.adjust_shrink,
} or {
size = active_width.size,
- stretch = active_width.stretch,
+ normal = active_width.normal,
fi = active_width.fi,
fil = active_width.fil,
fill = active_width.fill,
@@ -1777,13 +1993,13 @@ do
while true do
r = prev_r.next
if r.id == delta_code then
- cur_active_width.size = cur_active_width.size + r.size
- cur_active_width.stretch = cur_active_width.stretch + r.stretch
- cur_active_width.fi = cur_active_width.fi + r.fi
- cur_active_width.fil = cur_active_width.fil + r.fil
- cur_active_width.fill = cur_active_width.fill + r.fill
- cur_active_width.filll = cur_active_width.filll + r.filll
- cur_active_width.shrink = cur_active_width.shrink + r.shrink
+ cur_active_width.size = cur_active_width.size + r.size
+ cur_active_width.normal = cur_active_width.normal + r.normal
+ cur_active_width.fi = cur_active_width.fi + r.fi
+ cur_active_width.fil = cur_active_width.fil + r.fil
+ cur_active_width.fill = cur_active_width.fill + r.fill
+ cur_active_width.filll = cur_active_width.filll + r.filll
+ cur_active_width.shrink = cur_active_width.shrink + r.shrink
if checked_expansion then
cur_active_width.adjust_stretch = cur_active_width.adjust_stretch + r.adjust_stretch
cur_active_width.adjust_shrink = cur_active_width.adjust_shrink + r.adjust_shrink
@@ -1797,13 +2013,13 @@ do
if minimum_demerits < awful_badness and (old_line_number ~= par.easy_line or r == par.active) then
if no_break_yet then
no_break_yet = false
- break_width.size = background.size
- break_width.stretch = background.stretch
- break_width.fi = background.fi
- break_width.fil = background.fil
- break_width.fill = background.fill
- break_width.filll = background.filll
- break_width.shrink = background.shrink
+ break_width.size = background.size
+ break_width.normal = background.normal
+ break_width.fi = background.fi
+ break_width.fil = background.fil
+ break_width.fill = background.fill
+ break_width.filll = background.filll
+ break_width.shrink = background.shrink
if checked_expansion then
break_width.adjust_stretch = 0
break_width.adjust_shrink = 0
@@ -1813,25 +2029,25 @@ do
end
end
if prev_r.id == delta_code then
- prev_r.size = prev_r.size - cur_active_width.size + break_width.size
- prev_r.stretch = prev_r.stretch - cur_active_width.stretc + break_width.stretch
- prev_r.fi = prev_r.fi - cur_active_width.fi + break_width.fi
- prev_r.fil = prev_r.fil - cur_active_width.fil + break_width.fil
- prev_r.fill = prev_r.fill - cur_active_width.fill + break_width.fill
- prev_r.filll = prev_r.filll - cur_active_width.filll + break_width.filll
- prev_r.shrink = prev_r.shrink - cur_active_width.shrink + break_width.shrink
+ prev_r.size = prev_r.size - cur_active_width.size + break_width.size
+ prev_r.normal = prev_r.normal - cur_active_width.normal + break_width.normal
+ prev_r.fi = prev_r.fi - cur_active_width.fi + break_width.fi
+ prev_r.fil = prev_r.fil - cur_active_width.fil + break_width.fil
+ prev_r.fill = prev_r.fill - cur_active_width.fill + break_width.fill
+ prev_r.filll = prev_r.filll - cur_active_width.filll + break_width.filll
+ prev_r.shrink = prev_r.shrink - cur_active_width.shrink + break_width.shrink
if checked_expansion then
prev_r.adjust_stretch = prev_r.adjust_stretch - cur_active_width.adjust_stretch + break_width.adjust_stretch
prev_r.adjust_shrink = prev_r.adjust_shrink - cur_active_width.adjust_shrink + break_width.adjust_shrink
end
elseif prev_r == par.active then
- active_width.size = break_width.size
- active_width.stretch = break_width.stretch
- active_width.fi = break_width.fi
- active_width.fil = break_width.fil
- active_width.fill = break_width.fill
- active_width.filll = break_width.filll
- active_width.shrink = break_width.shrink
+ active_width.size = break_width.size
+ active_width.normal = break_width.normal
+ active_width.fi = break_width.fi
+ active_width.fil = break_width.fil
+ active_width.fill = break_width.fill
+ active_width.filll = break_width.filll
+ active_width.shrink = break_width.shrink
if checked_expansion then
active_width.adjust_stretch = break_width.adjust_stretch
active_width.adjust_shrink = break_width.adjust_shrink
@@ -1842,7 +2058,7 @@ do
subtype = nosubtype_code,
next = r,
size = break_width.size - cur_active_width.size,
- stretch = break_width.stretch - cur_active_width.stretch,
+ normal = break_width.normal - cur_active_width.normal,
fi = break_width.fi - cur_active_width.fi,
fil = break_width.fil - cur_active_width.fil,
fill = break_width.fill - cur_active_width.fill,
@@ -1851,16 +2067,16 @@ do
adjust_stretch = break_width.adjust_stretch - cur_active_width.adjust_stretch,
adjust_shrink = break_width.adjust_shrink - cur_active_width.adjust_shrink,
} or {
- id = delta_code,
- subtype = nosubtype_code,
- next = r,
- size = break_width.size - cur_active_width.size,
- stretch = break_width.stretch - cur_active_width.stretch,
- fi = break_width.fi - cur_active_width.fi,
- fil = break_width.fil - cur_active_width.fil,
- fill = break_width.fill - cur_active_width.fill,
- filll = break_width.filll - cur_active_width.filll,
- shrink = break_width.shrink - cur_active_width.shrink,
+ id = delta_code,
+ subtype = nosubtype_code,
+ next = r,
+ size = break_width.size - cur_active_width.size,
+ normal = break_width.normal - cur_active_width.normal,
+ fi = break_width.fi - cur_active_width.fi,
+ fil = break_width.fil - cur_active_width.fil,
+ fill = break_width.fill - cur_active_width.fill,
+ filll = break_width.filll - cur_active_width.filll,
+ shrink = break_width.shrink - cur_active_width.shrink,
}
prev_r.next = q
prev_prev_r = prev_r
@@ -1893,7 +2109,6 @@ do
passive_left_box_width = prev_break and prev_break.passive_last_left_box_width or par.init_internal_left_box_width,
passive_right_box = par.internal_right_box,
passive_right_box_width = par.internal_right_box_width,
- -- analysis = table.fastcopy(cur_active_width),
}
par.passive = passive
local q = {
@@ -1929,7 +2144,7 @@ do
subtype = nosubtype_code,
next = r,
size = cur_active_width.size - break_width.size,
- stretch = cur_active_width.stretch - break_width.stretch,
+ normal = cur_active_width.normal - break_width.normal,
fi = cur_active_width.fi - break_width.fi,
fil = cur_active_width.fil - break_width.fil,
fill = cur_active_width.fill - break_width.fill,
@@ -1938,16 +2153,16 @@ do
adjust_stretch = cur_active_width.adjust_stretch - break_width.adjust_stretch,
adjust_shrink = cur_active_width.adjust_shrink - break_width.adjust_shrink,
} or {
- id = delta_code,
- subtype = nosubtype_code,
- next = r,
- size = cur_active_width.size - break_width.size,
- stretch = cur_active_width.stretch - break_width.stretch,
- fi = cur_active_width.fi - break_width.fi,
- fil = cur_active_width.fil - break_width.fil,
- fill = cur_active_width.fill - break_width.fill,
- filll = cur_active_width.filll - break_width.filll,
- shrink = cur_active_width.shrink - break_width.shrink,
+ id = delta_code,
+ subtype = nosubtype_code,
+ next = r,
+ size = cur_active_width.size - break_width.size,
+ normal = cur_active_width.normal - break_width.normal,
+ fi = cur_active_width.fi - break_width.fi,
+ fil = cur_active_width.fil - break_width.fil,
+ fill = cur_active_width.fill - break_width.fill,
+ filll = cur_active_width.filll - break_width.filll,
+ shrink = cur_active_width.shrink - break_width.shrink,
}
-- q.next = r -- already done
prev_r.next = q
@@ -1971,10 +2186,10 @@ do
line_width = par.first_width
end
end
- if adapt_width then
- local l, r = adapt_width(par,line_number)
- line_width = line_width - l - r
- end
+ -- if adapt_width then
+ -- local l, r = adapt_width(par,line_number)
+ -- line_width = line_width - l - r
+ -- end
end
local artificial_demerits = false -- has d been forced to zero
local shortfall = line_width - cur_active_width.size - par.internal_right_box_width -- used in badness calculations
@@ -1983,69 +2198,53 @@ do
else
shortfall = shortfall - (r.break_node.passive_last_left_box_width or 0)
end
- local pw, lp, rp -- used later on
if protrude_chars > 1 then
- -- this is quite time consuming
- local b = r.break_node
- local l = b and b.cur_break or first_p
- local o = current and getprev(current)
- if current and getid(current) == disc_code then
- local pre, _, _, pretail = getdisc(current,true)
- if pre then
- o = pretail
+ if par.line_break_dir == righttoleft_code then
+ -- not now, we need to keep more track
+ else
+ -- this is quite time consuming
+ local b = r.break_node
+ local l = b and b.cur_break or first_p
+ local o = current and getprev(current)
+ if current and getid(current) == disc_code then
+ local pre, _, _, pretail = getdisc(current,true)
+ if pre then
+ o = pretail
+ else
+ o = find_protchar_right(l,o)
+ end
else
o = find_protchar_right(l,o)
end
- else
- o = find_protchar_right(l,o)
- end
- if o and getid(o) == glyph_code then
- pw, rp = right_pw(o)
- shortfall = shortfall + pw
- end
- local id = getid(l)
- if id == glyph_code then
- -- ok ?
- elseif id == disc_code and getfield(l,"post") then
- l = getfield(l,"post") -- TODO: first char could be a disc
- else
- l = find_protchar_left(l)
- end
- if l and getid(l) == glyph_code then
- pw, lp = left_pw(l)
- shortfall = shortfall + pw
+ if o and getid(o) == glyph_code then
+ shortfall = shortfall + right_pw(o)
+ end
+ local id = getid(l)
+ if id == glyph_code then
+ -- ok ?
+ elseif id == disc_code and getpost(l) then
+ l = getpost(l) -- TODO: first char could be a disc
+ else
+ l = find_protchar_left(l)
+ end
+ if l and getid(l) == glyph_code then
+ shortfall = shortfall + left_pw(l)
+ end
end
end
if checked_expansion and shortfall ~= 0 then
- local margin_kern_stretch = 0
- local margin_kern_shrink = 0
- if protrude_chars > 1 then
- if lp then
- local char, font = isglyph(lp)
- local data = expansions[font][char]
- if data then
- margin_kern_stretch, margin_kern_shrink = data.glyphstretch, data.glyphshrink
- end
- end
- if rp then
- local char, font = isglyph(rp)
- local data = expansions[font][char]
- if data then
- margin_kern_stretch = margin_kern_stretch + data.glyphstretch
- margin_kern_shrink = margin_kern_shrink + data.glyphshrink
+ if shortfall > 0 then
+ local total = cur_active_width.adjust_stretch
+ if total > 0 then
+ if total > shortfall then
+ shortfall = total / (par.max_stretch_ratio / par.cur_font_step) / 2
+ else
+ shortfall = shortfall - total
end
end
- end
- local total = cur_active_width.adjust_stretch + margin_kern_stretch
- if shortfall > 0 and total > 0 then
- if total > shortfall then
- shortfall = total / (par.max_stretch_ratio / par.cur_font_step) / 2
- else
- shortfall = shortfall - total
- end
- else
- total = cur_active_width.adjust_shrink + margin_kern_shrink
- if shortfall < 0 and total > 0 then
+ elseif shortfall < 0 then
+ local total = cur_active_width.adjust_shrink
+ if total > 0 then
if total > - shortfall then
shortfall = - total / (par.max_shrink_ratio / par.cur_font_step) / 2
else
@@ -2068,7 +2267,7 @@ do
shortfall = 0
end
else
- local stretch = cur_active_width.stretch
+ local stretch = cur_active_width.normal
if shortfall > 7230584 and stretch < 1663497 then
b = infinite_badness
fit_class = fit_very_loose_class
@@ -2101,7 +2300,7 @@ do
-- g = 0
shortfall = 0
elseif shortfall > 0 then
- g = cur_active_width.stretch
+ g = cur_active_width.normal
elseif shortfall < 0 then
g = cur_active_width.shrink
else
@@ -2192,7 +2391,6 @@ do
if trace_basic then
report_parbuilders("starting at %a",head)
end
-
local par = initialize_line_break(head,d)
local checked_expansion = par.checked_expansion
@@ -2200,8 +2398,9 @@ do
local disc_width = par.disc_width
local background = par.background
local tracing_paragraphs = par.tracing_paragraphs
+ local dirstack = { n = 0 }
- local dirstack = new_dir_stack()
+ par.dirstack = dirstack
if tracing_paragraphs then
diagnostics.start()
@@ -2225,13 +2424,13 @@ do
active_short = 0,
active_glue = 0,
}
- active_width.size = background.size
- active_width.stretch = background.stretch
- active_width.fi = background.fi
- active_width.fil = background.fil
- active_width.fill = background.fill
- active_width.filll = background.filll
- active_width.shrink = background.shrink
+ active_width.size = background.size
+ active_width.normal = background.normal
+ active_width.fi = background.fi
+ active_width.fil = background.fil
+ active_width.fill = background.fill
+ active_width.filll = background.filll
+ active_width.shrink = background.shrink
if checked_expansion then
active_width.adjust_stretch = 0
@@ -2241,13 +2440,12 @@ do
par.passive = nil -- = 0
par.printed_node = temp_head -- only when tracing, shared
par.pass_number = 0
- -- par.auto_breaking = true
+ -- par.auto_breaking = true
setnext(temp_head,head)
local current = head
local first_p = current
-
local auto_breaking = true
par.font_in_short_display = 0
@@ -2288,12 +2486,7 @@ do
while current and p_active ~= n_active do
local char, id = isglyph(current)
if char then
- local wd, ht, dp = getwhd(current)
- if is_rotated(par.line_break_dir) then
- active_width.size = active_width.size + ht + dp
- else
- active_width.size = active_width.size + wd
- end
+ active_width.size = active_width.size + getwidth(current)
if checked_expansion then
local font = id -- == font
local data = checked_expansion[font]
@@ -2312,44 +2505,15 @@ do
end
end
elseif id == hlist_code or id == vlist_code then
- local wd, ht, dp = getwhd(current)
- if textdir_parallel(getdirection(current),par.line_break_dir) then
- active_width.size = active_width.size + wd
- else
- active_width.size = active_width.size + ht + dp
- end
+ active_width.size = active_width.size + getwidth(current)
elseif id == glue_code then
- -- if par.auto_breaking then
- if auto_breaking then
- local prev_p = getprev(current)
- if prev_p and prev_p ~= temp_head then
- local id = getid(prev_p)
- -- we need to check this with the latest patches to the tex kernel
- if (id == glyph_code) or (id < math_code) then
- p_active, n_active = try_break(0, unhyphenated_code, par, first_p, current, checked_expansion)
- elseif id == kern_code then
- local s = getsubtype(prev_p)
- if s ~= userkern_code and s ~= italickern_code then
- p_active, n_active = try_break(0, unhyphenated_code, par, first_p, current, checked_expansion)
- end
- end
- end
- end
- check_shrinkage(par,current)
- local width, stretch, shrink, stretch_order = getglue(current)
- local order = fillcodes[stretch_order]
- active_width.size = active_width.size + width
- active_width[order] = active_width[order] + stretch
- active_width.shrink = active_width.shrink + shrink
+ goto glue
elseif id == disc_code then
local subtype = getsubtype(current)
if subtype ~= seconddisc_code then
local line_break_dir = par.line_break_dir
if second_pass or subtype <= automaticdisc_code then
- local actual_pen = subtype == automaticdisc_code and par.ex_hyphen_penalty or par.hyphen_penalty
- -- 0.81 :
- -- local actual_pen = getpenalty(current)
- --
+ local actual_pen = getpenalty(current)
local pre, post, replace = getdisc(current)
if not pre then -- trivial pre-break
disc_width.size = 0
@@ -2377,7 +2541,7 @@ do
if getid(cur_p_next) ~= disc_code or getsubtype(cur_p_next) ~= seconddisc_code then
report_parbuilders("unsupported disc at location %a",1)
else
- local pre = getfield(cur_p_next,"pre")
+ local pre = getpre(cur_p_next)
if pre then
local size, adjust_stretch, adjust_shrink = add_to_width(line_break_dir,checked_expansion,pre)
disc_width.size = disc_width.size + size
@@ -2386,16 +2550,7 @@ do
disc_width.adjust_shrink = disc_width.adjust_shrink + adjust_shrink
end
p_active, n_active = try_break(actual_pen, hyphenated_code, par, first_p, cur_p_next, checked_expansion)
- --
- -- I will look into this some day ... comment in linebreak.w says that this fails,
- -- maybe this is what Taco means with his comment in the luatex manual.
- --
- -- do_one_seven_eight(sub_disc_width_from_active_width);
- -- do_one_seven_eight(reset_disc_width);
- -- s = vlink_no_break(vlink(current));
- -- add_to_widths(s, line_break_dir, adjust_spacing,disc_width);
- -- ext_try_break(...,first_p,vlink(current));
- --
+ -- there is a comment about something messy here in the source
else
report_parbuilders("unsupported disc at location %a",2)
end
@@ -2420,49 +2575,46 @@ do
end
elseif id == kern_code then
local s = getsubtype(current)
+ local kern = getkern(current)
if s == userkern_code or s == italickern_code then
local v = getnext(current)
- -- if par.auto_breaking and getid(v) == glue_code then
if auto_breaking and getid(v) == glue_code then
p_active, n_active = try_break(0, unhyphenated_code, par, first_p, current, checked_expansion)
end
local active_width = par.active_width
- active_width.size = active_width.size + getkern(current)
- else
- local kern = getkern(current)
- if kern ~= 0 then
- active_width.size = active_width.size + kern
- if checked_expansion and expand_kerns and getsubtype(current) == fontkern_code then
- local stretch, shrink = kern_stretch_shrink(current,kern)
- if expand_kerns == "stretch" then
- active_width.adjust_stretch = active_width.adjust_stretch + stretch
- elseif expand_kerns == "shrink" then
- active_width.adjust_shrink = active_width.adjust_shrink + shrink
- else
- active_width.adjust_stretch = active_width.adjust_stretch + stretch
- active_width.adjust_shrink = active_width.adjust_shrink + shrink
- end
+ active_width.size = active_width.size + kern
+ elseif kern ~= 0 then
+ active_width.size = active_width.size + kern
+ if checked_expansion and expand_kerns and s == fontkern_code then
+ local stretch, shrink = kern_stretch_shrink(current,kern)
+ if expand_kerns == "stretch" then
+ active_width.adjust_stretch = active_width.adjust_stretch + stretch
+ elseif expand_kerns == "shrink" then
+ active_width.adjust_shrink = active_width.adjust_shrink + shrink
+ else
+ active_width.adjust_stretch = active_width.adjust_stretch + stretch
+ active_width.adjust_shrink = active_width.adjust_shrink + shrink
end
end
end
elseif id == math_code then
- -- par.auto_breaking = getsubtype(current) == endmath_code
auto_breaking = getsubtype(current) == endmath_code
- local v = getnext(current)
- -- if par.auto_breaking and getid(v) == glue_code then
- if auto_breaking and getid(v) == glue_code then
- p_active, n_active = try_break(0, unhyphenated_code, par, first_p, current, checked_expansion)
+ if is_zero_glue(current) or ignore_math_skip(current) then
+ local v = getnext(current)
+ if auto_breaking and getid(v) == glue_code then
+ p_active, n_active = try_break(0, unhyphenated_code, par, first_p, current, checked_expansion)
+ end
+ local active_width = par.active_width
+ active_width.size = active_width.size + getkern(current) + getwidth(current)
+ else
+ goto glue
end
- local active_width = par.active_width
- active_width.size = active_width.size + getkern(current) -- surround
- -- new in luatex
- + getwidth(current)
elseif id == rule_code then
active_width.size = active_width.size + getwidth(current)
elseif id == penalty_code then
p_active, n_active = try_break(getpenalty(current), unhyphenated_code, par, first_p, current, checked_expansion)
elseif id == dir_code then
- par.line_break_dir = checked_line_dir(dirstack) or par.line_break_dir
+ par.line_break_dir = checked_line_dir(dirstack,current) or par.line_break_dir
elseif id == localpar_code then
par.internal_pen_inter = getfield(current,"pen_inter")
par.internal_pen_broken = getfield(current,"pen_broken")
@@ -2477,6 +2629,35 @@ do
report_parbuilders("node of type %a found in paragraph",type(id))
end
end
+ goto done
+ ::glue::
+ do
+ if auto_breaking then
+ local prev_p = getprev(current)
+ if prev_p and prev_p ~= temp_head then
+ local id = getid(prev_p)
+ -- we need to check this with the latest patches to the tex kernel
+ if (id == glyph_code) or (id < math_code) then
+ p_active, n_active = try_break(0, unhyphenated_code, par, first_p, current, checked_expansion)
+ elseif id == kern_code then
+ local s = getsubtype(prev_p)
+ if s ~= userkern_code and s ~= italickern_code then
+ p_active, n_active = try_break(0, unhyphenated_code, par, first_p, current, checked_expansion)
+ end
+ end
+ end
+ end
+ local width, stretch, shrink, stretch_order, shrink_order = getglue(current)
+ if shrink_order ~= 0 and shrink ~= 0 then
+ infinite_shrinkage_error(par)
+ shrink_order = 0
+ end
+ local order = fillcodes[stretch_order]
+ active_width.size = active_width.size + width
+ active_width[order] = active_width[order] + stretch
+ active_width.shrink = active_width.shrink + shrink
+ end
+ ::done::
current = getnext(current)
end
if not current then
@@ -2533,8 +2714,8 @@ do
if tracing_paragraphs then
diagnostics.current_pass(par,"emergencypass")
end
- par.background.stretch = par.background.stretch + par.emergency_stretch
- par.final_pass = true
+ par.background.normal = par.background.normal + par.emergency_stretch
+ par.final_pass = true
end
end
return wrap_up(par)
@@ -2546,8 +2727,14 @@ end
do
+ local tonumber = tonumber
+ local utfchar = utf.char
+ local write = texio.write
+ local write_nl = texio.write_nl
+ local formatters = string.formatters
+
local function write_esc(cs)
- local esc = tex.escapechar
+ local esc = texget("escapechar")
if esc then
write("log",utfchar(esc),cs)
else
@@ -2623,13 +2810,13 @@ do
local passive = par.passive
local typ_ind = break_type == hyphenated_code and '-' or ""
if par.do_last_line_fit then
- local s = number.toscaled(q.active_short)
- local g = number.toscaled(q.active_glue)
+ local s = q.active_short
+ local g = q.active_glue
if current then
- write_nl("log",formatters["@@%d: line %d.%d%s t=%s s=%s g=%s"](
+ write_nl("log",formatters["@@%d: line %d.%d%s t=%s s=%p g=%p"](
passive.serial or 0,q.line_number-1,fit_class,typ_ind,q.total_demerits,s,g))
else
- write_nl("log",formatters["@@%d: line %d.%d%s t=%s s=%s a=%s"](
+ write_nl("log",formatters["@@%d: line %d.%d%s t=%s s=%p a=%p"](
passive.serial or 0,q.line_number-1,fit_class,typ_ind,q.total_demerits,s,g))
end
else
@@ -2716,7 +2903,7 @@ do
end
function diagnostics.overfull_hbox(hlist,line,d)
- common_message(hlist,line,formatters["Overfull \\hbox (%spt too wide)"](number.toscaled(d)))
+ common_message(hlist,line,formatters["Overfull \\hbox (%p too wide)"](d))
end
function diagnostics.bad_hbox(hlist,line,b)
@@ -2731,15 +2918,15 @@ do
common_message(hlist,line,formatters["Loose \\hbox (badness %i)"](b))
end
-end
+ -- reporting --
--- reporting --
+ statistics.register("alternative parbuilders", function()
+ if nofpars > 0 then
+ return formatters["%s paragraphs, %s lines (%s protruded, %s adjusted)"](nofpars,noflines,nofprotrudedlines,nofadjustedlines)
+ end
+ end)
-statistics.register("alternative parbuilders", function()
- if nofpars > 0 then
- return formatters["%s paragraphs, %s lines (%s protruded, %s adjusted)"](nofpars,noflines,nofprotrudedlines,nofadjustedlines)
- end
-end)
+end
do
@@ -2757,126 +2944,6 @@ do
local setnodecolor = nodes.tracers.colors.set
- -- local function xpack(head,width,method,direction,analysis)
- --
- -- -- inspect(analysis)
- --
- -- local expansion = method == "cal_expand_ratio"
- -- local natural = analysis.size
- -- local font_stretch = analysis.adjust_stretch
- -- local font_shrink = analysis.adjust_shrink
- -- local font_expand_ratio = 0
- -- local delta = width - natural
- --
- -- local hlist = new_hlist()
- --
- -- setlist(hlist,head)
- -- setdirection(hlist,direction or tex.textdirection)
- -- setwhd(hlist,width,height,depth)
- --
- -- if delta == 0 then
- --
- -- setfield(hlist,"glue_sign",0)
- -- setfield(hlist,"glue_order",0)
- -- setfield(hlist,"glue_set",0)
- --
- -- else
- --
- -- local order = analysis.filll ~= 0 and fillcodes.filll or
- -- analysis.fill ~= 0 and fillcodes.fill or
- -- analysis.fil ~= 0 and fillcodes.fil or
- -- analysis.fi ~= 0 and fillcodes.fi or 0
- --
- -- if delta > 0 then
- --
- -- if expansion and order == 0 and font_stretch > 0 then
- -- font_expand_ratio = (delta/font_stretch) * 1000
- -- else
- -- local stretch = analysis.stretch
- -- if stretch ~= 0 then
- -- setfield(hlist,"glue_sign",1) -- stretch
- -- setfield(hlist,"glue_order",order)
- -- setfield(hlist,"glue_set",delta/stretch)
- -- else
- -- setfield(hlist,"glue_sign",0) -- nothing
- -- setfield(hlist,"glue_order",order)
- -- setfield(hlist,"glue_set",0)
- -- end
- -- end
- --
- -- else
- --
- -- if expansion and order == 0 and font_shrink > 0 then
- -- font_expand_ratio = (delta/font_shrink) * 1000
- -- else
- -- local shrink = analysis.shrink
- -- if shrink ~= 0 then
- -- setfield(hlist,"glue_sign",2) -- shrink
- -- setfield(hlist,"glue_order",order)
- -- setfield(hlist,"glue_set",-delta/stretch)
- -- else
- -- setfield(hlist,"glue_sign",0) -- nothing
- -- setfield(hlist,"glue_order",order)
- -- setfield(hlist,"glue_set",0)
- -- end
- -- end
- --
- -- end
- --
- -- end
- --
- -- if not expansion or font_expand_ratio == 0 then
- -- -- nothing
- -- elseif font_expand_ratio > 0 then
- -- if font_expand_ratio > 1000 then
- -- font_expand_ratio = 1000
- -- end
- -- local current = head
- -- while current do
- -- local id = getid(current)
- -- if id == glyph_code then
- -- local stretch, shrink = char_stretch_shrink(current) -- get only one
- -- if stretch then
- -- if trace_expansion then
- -- setnodecolor(g,"hz:positive")
- -- end
- -- current.expansion_factor = font_expand_ratio * stretch
- -- end
- -- elseif id == kern_code then
- -- local kern = getkern(current)
- -- if kern ~= 0 and getsubtype(current) == fontkern_code then
- -- setkern(current,font_expand_ratio * kern)
- -- end
- -- end
- -- current = getnext(current)
- -- end
- -- elseif font_expand_ratio < 0 then
- -- if font_expand_ratio < -1000 then
- -- font_expand_ratio = -1000
- -- end
- -- local current = head
- -- while current do
- -- local id = getid(current)
- -- if id == glyph_code then
- -- local stretch, shrink = char_stretch_shrink(current) -- get only one
- -- if shrink then
- -- if trace_expansion then
- -- setnodecolor(g,"hz:negative")
- -- end
- -- current.expansion_factor = font_expand_ratio * shrink
- -- end
- -- elseif id == kern_code then
- -- local kern = getkern(current)
- -- if kern ~= 0 and getsubtype(current) == fontkern_code then
- -- setkern(current,font_expand_ratio * kern)
- -- end
- -- end
- -- current = getnext(current)
- -- end
- -- end
- -- return hlist, 0
- -- end
-
local function hpack(head,width,method,direction,firstline,line) -- fast version when head = nil
-- we can pass the adjust_width and adjust_height so that we don't need to recalculate them but
@@ -2885,6 +2952,7 @@ do
local hlist = new_hlist()
setdirection(hlist,direction)
+ setattributelist(hlist,head)
if head == nil then
setwidth(hlist,width)
@@ -2895,7 +2963,7 @@ do
local cal_expand_ratio = method == "cal_expand_ratio" or method == "subst_ex_font"
- direction = direction or tex.textdir
+ direction = direction or texget("textdir")
local line = 0
@@ -2915,10 +2983,8 @@ do
local adjust_head = texlists.adjust_head
local pre_adjust_head = texlists.pre_adjust_head
- local adjust_tail = adjust_head and slide_node_list(adjust_head) -- todo: find_tail
- local pre_adjust_tail = pre_adjust_head and slide_node_list(pre_adjust_head) -- todo: find_tail
-
- new_dir_stack(hpack_dir)
+ local adjust_tail = adjust_head and find_tail(adjust_head)
+ local pre_adjust_tail = pre_adjust_head and find_tail(pre_adjust_head)
local checked_expansion = false
@@ -2929,10 +2995,11 @@ do
-- this one also needs to check the font, so in the end indeed we might end up with two variants
+ -- we now have fast loops so maybe no longer a need for an expansion stack
+
local fontexps, lastfont
local function process(current) -- called nested in disc replace
-
while current do
local char, id = isglyph(current)
if char then
@@ -2952,20 +3019,19 @@ do
end
end
end
- -- use inline
local wd, ht, dp = getwhd(current)
- natural = natural + wd
if ht > height then
height = ht
end
if dp > depth then
depth = dp
end
+ natural = natural + wd
elseif id == kern_code then
local kern = getkern(current)
if kern == 0 then
-- no kern
- elseif getsubtype(current) == fontkern_code then -- check getkern(p)
+ elseif getsubtype(current) == fontkern_code then
if cal_expand_ratio then
local stretch, shrink = kern_stretch_shrink(current,kern)
font_stretch = font_stretch + stretch
@@ -2981,19 +3047,18 @@ do
local subtype = getsubtype(current)
if subtype ~= seconddisc_code then
-- todo : local stretch, shrink = char_stretch_shrink(s)
- local replace = getfield(current,"replace")
+ local replace = getreplace(current)
if replace then
process(replace)
end
end
elseif id == glue_code then
local wd, stretch, shrink, stretch_order, shrink_order = getglue(current)
- natural = natural + wd
total_stretch[stretch_order] = total_stretch[stretch_order] + stretch
total_shrink [shrink_order] = total_shrink[shrink_order] + shrink
if getsubtype(current) >= leaders_code then
+ local wd, ht, dp = getwhd(leader)
local leader = getleader(current)
- local wd, ht, dp = getwhd(leader) -- can become getwhd(current) after 1.003
if ht > height then
height = ht
end
@@ -3001,41 +3066,36 @@ do
depth = dp
end
end
+ natural = natural + wd
elseif id == hlist_code or id == vlist_code then
- local sh = getshift(current)
local wd, ht, dp = getwhd(current)
- local hs, ds = ht - sh, dp + sh
- natural = natural + wd
+ local sh = getshift(current)
+ local hs = ht - sh
+ local ds = dp + sh
if hs > height then
height = hs
end
if ds > depth then
depth = ds
end
- elseif id == rule_code then
- local wd, ht, dp = getwhd(current)
natural = natural + wd
+ elseif id == rule_code or id == unset_code then
+ local wd, ht, dp = getwhd(current)
if ht > height then
height = ht
end
if dp > depth then
depth = dp
end
- elseif id == math_code then
- natural = natural + getkern(current) -- surround
- -- new in luatex
- + getwidth(current)
- elseif id == unset_code then
- local wd, ht, dp = getwhd(current)
- local sh = getshift(current)
- local hs = ht - sh
- local ds = dp + sh
natural = natural + wd
- if hs > height then
- height = hs
- end
- if ds > depth then
- depth = ds
+ elseif id == math_code then
+ if is_zero_glue(current) or ignore_math_skip(current) then
+ natural = natural + getkern(current)
+ else
+ local wd, stretch, shrink, stretch_order, shrink_order = getglue(current)
+ total_stretch[stretch_order] = total_stretch[stretch_order] + stretch
+ total_shrink [shrink_order] = total_shrink[shrink_order] + shrink
+ natural = natural + wd
end
elseif id == ins_code or id == mark_code then
local prev, next = getboth(current)
@@ -3056,21 +3116,11 @@ do
else
adjust_head = list
end
- adjust_tail = slide_node_list(list) -- find_tail(list)
+ adjust_tail = find_tail(list)
elseif id == dir_code then
- hpack_dir = checked_line_dir(stack,current) or hpack_dir
+ -- no need to deal with directions here (as we only support two)
elseif id == marginkern_code then
- local width = getwidth(current)
- if cal_expand_ratio then
- -- is this ok?
- local glyph = getfield(current,"glyph")
- local char_pw = getsubtype(current) == leftmargin_code and left_pw or right_pw
- font_stretch = font_stretch - width - char_pw(glyph)
- font_shrink = font_shrink - width - char_pw(glyph)
- expansion_index = expansion_index + 1
- expansion_stack[expansion_index] = glyph
- end
- natural = natural + width
+ natural = natural + getwidth(current)
end
current = getnext(current)
end
@@ -3088,25 +3138,21 @@ do
if method == "additional" then
width = width + natural
end
-
setwhd(hlist,width,height,depth)
-
local delta = width - natural
if delta == 0 then
- setfield(hlist,"glue_sign",0)
- setfield(hlist,"glue_order",0)
- setfield(hlist,"glue_set",0)
+ setglue(hlist,0,0,0) -- set order sign
elseif delta > 0 then
-- natural width smaller than requested width
- local order = (total_stretch[4] ~= 0 and 4 or total_stretch[3] ~= 0 and 3) or
- (total_stretch[2] ~= 0 and 2 or total_stretch[1] ~= 0 and 1) or 0
+ local order = (total_stretch[4] ~= 0 and 4) or (total_stretch[3] ~= 0 and 3) or
+ (total_stretch[2] ~= 0 and 2) or (total_stretch[1] ~= 0 and 1) or 0
if cal_expand_ratio and order == 0 and font_stretch > 0 then -- check sign of font_stretch
font_expand_ratio = delta/font_stretch
-
if font_expand_ratio > 1 then
font_expand_ratio = 1
+ elseif font_expand_ratio < -1 then
+ font_expand_ratio = -1
end
-
local fontexps, lastfont
for i=1,expansion_index do
local g = expansion_stack[i]
@@ -3118,33 +3164,33 @@ do
lastfont = font
end
local data = fontexps[char]
- if trace_expansion then
- setnodecolor(g,"hz:positive")
+ if data then
+ if trace_expansion then
+ setnodecolor(g,"hz:positive")
+ end
+ e = font_expand_ratio * data.glyphstretch
end
- e = font_expand_ratio * data.glyphstretch / 1000
else
local kern = getkern(g)
local stretch, shrink = kern_stretch_shrink(g,kern)
- e = font_expand_ratio * stretch / 1000
+ e = font_expand_ratio * stretch
end
setexpansion(g,e)
end
+ font_stretch = font_expand_ratio * font_stretch
+ delta = delta - font_stretch
end
local tso = total_stretch[order]
if tso ~= 0 then
- setfield(hlist,"glue_sign",1)
- setfield(hlist,"glue_order",order)
- setfield(hlist,"glue_set",delta/tso)
+ setglue(hlist,delta/tso,order,1) -- set order sign
else
- setfield(hlist,"glue_sign",0)
- setfield(hlist,"glue_order",order)
- setfield(hlist,"glue_set",0)
+ setglue(hlist,0,order,0) -- set order sign
end
if font_expand_ratio ~= 0 then
-- todo
elseif order == 0 then -- and getlist(hlist) then
last_badness = calculate_badness(delta,total_stretch[0])
- if last_badness > tex.hbadness then
+ if last_badness > texget("hbadness") then
if last_badness > 100 then
diagnostics.underfull_hbox(hlist,line,last_badness)
else
@@ -3154,15 +3200,15 @@ do
end
else
-- natural width larger than requested width
- local order = total_shrink[4] ~= 0 and 4 or total_shrink[3] ~= 0 and 3
- or total_shrink[2] ~= 0 and 2 or total_shrink[1] ~= 0 and 1 or 0
+ local order = (total_shrink[4] ~= 0 and 4) or (total_shrink[3] ~= 0 and 3)
+ or (total_shrink[2] ~= 0 and 2) or (total_shrink[1] ~= 0 and 1) or 0
if cal_expand_ratio and order == 0 and font_shrink > 0 then -- check sign of font_shrink
font_expand_ratio = delta/font_shrink
-
- if font_expand_ratio < 1 then
+ if font_expand_ratio > 1 then
+ font_expand_ratio = 1
+ elseif font_expand_ratio < -1 then
font_expand_ratio = -1
end
-
local fontexps, lastfont
for i=1,expansion_index do
local g = expansion_stack[i]
@@ -3174,44 +3220,62 @@ do
lastfont = font
end
local data = fontexps[char]
- if trace_expansion then
- setnodecolor(g,"hz:negative")
+ if data then
+ if trace_expansion then
+ setnodecolor(g,"hz:negative")
+ end
+ e = font_expand_ratio * data.glyphshrink
end
- e = font_expand_ratio * data.glyphshrink / 1000
else
local kern = getkern(g)
local stretch, shrink = kern_stretch_shrink(g,kern)
- e = font_expand_ratio * shrink / 1000
+ e = font_expand_ratio * shrink
end
setexpansion(g,e)
end
+ font_shrink = font_expand_ratio * font_shrink
+ delta = delta - font_shrink
end
local tso = total_shrink[order]
if tso ~= 0 then
- setfield(hlist,"glue_sign",2)
- setfield(hlist,"glue_order",order)
- setfield(hlist,"glue_set",-delta/tso)
+ setglue(hlist,-delta/tso,order,2) -- set order sign
else
- setfield(hlist,"glue_sign",0)
- setfield(hlist,"glue_order",order)
- setfield(hlist,"glue_set",0)
+ setglue(hlist,0,order,0) -- set order sign
end
if font_expand_ratio ~= 0 then
-- todo
- elseif tso < -delta and order == 0 then -- and getlist(hlist) then
+ elseif tso < -delta and order == 0 then
last_badness = 1000000
setfield(hlist,"glue_set",1)
- local fuzz = - delta - total_shrink[0]
- local hfuzz = tex.hfuzz
- if fuzz > hfuzz or tex.hbadness < 100 then
- local overfullrule = tex.overfullrule
+ local fuzz = - delta - tso
+ local hfuzz = texget("hfuzz")
+ if fuzz > hfuzz or texget("hbadness") < 100 then
+ local overfullrule = texget("overfullrule")
if fuzz > hfuzz and overfullrule > 0 then
-- weird, is always called and no rules shows up
- setnext(slide_node_list(list),new_rule(overfullrule,nil,nil,getdirection(hlist))) -- todo: find_tail
+ setnext(find_tail(list),new_rule(overfullrule,nil,nil,getdirection(hlist)))
+ end
+ diagnostics.overfull_hbox(hlist,line,fuzz)
+ if head and getnormalizeline() > 4 then
+ -- we need to get rid of this one when we unpack a box but on the
+ -- other hand, we only do this when a specific width is set so
+ -- probably we have a fixed box then
+ local h = getnext(head)
+ if h then
+ local found = find_node(glue_code,rightskip_code)
+ if found then
+ local p = getprev(found)
+ local g = new_correctionskip(-fuzz)
+ setattributelist(g,found)
+ if p and getid(p) == marginkern_code then
+ found = p
+ end
+ insert_node_before(head,found,g)
+ end
+ end
end
- diagnostics.overfull_hbox(hlist,line,-delta)
end
- elseif order == 0 and getlist(hlist) and last_badness > tex.hbadness then
+ elseif order == 0 and getlist(hlist) and last_badness > texget("hbadness") then
diagnostics.bad_hbox(hlist,line,last_badness)
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-met.lua b/Master/texmf-dist/tex/context/base/mkiv/node-met.lua
index 574c71f60fd..db079c11628 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-met.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-met.lua
@@ -322,19 +322,6 @@ function nodes.concat(list) -- consider tail instead of slide
return head, tail
end
---[[
-<p>At some point we ran into a problem that the glue specification
-of the zeropoint dimension was overwritten when adapting a glue spec
-node. This is a side effect of glue specs being shared. After a
-couple of hours tracing and debugging Taco and I came to the
-conclusion that it made no sense to complicate the spec allocator
-and settled on a writable flag. This all is a side effect of the
-fact that some glues use reserved memory slots (with the zeropoint
-glue being a noticeable one). So, next we wrap this into a function
-and hide it for the user. And yes, LuaTeX now gives a warning as
-well.</p>
-]]--
-
function nodes.reference(n)
return n and tonut(n) or "<none>"
end
@@ -601,8 +588,7 @@ local keys = { whatsit = whatsitkeys }
local messyhack = table.tohash { -- temporary solution
nodecodes.attributelist,
nodecodes.attribute,
- nodecodes.gluespec,
- nodecodes.action,
+ nodecodes.action, -- hm
}
setmetatableindex(keys,function(t,k)
@@ -643,3 +629,233 @@ end
nodes.keys = keys -- [id][subtype]
nodes.fields = nodefields -- (n)
+
+if not nodes.count then
+
+ local type = type
+
+ local direct = node.direct
+ local todirect = direct.tovaliddirect
+ local tonode = direct.tonode
+
+ local count = direct.count
+ local length = direct.length
+ local slide = direct.slide
+
+ function node.count(id,first,last)
+ return count(id,first and todirect(first), last and todirect(last) or nil)
+ end
+
+ function node.length(first,last)
+ return length(first and todirect(first), last and todirect(last) or nil)
+ end
+
+ function node.slide(n)
+ if n then
+ n = slide(todirect(n))
+ if n then
+ return tonode(n)
+ end
+ end
+ return nil
+ end
+
+ local hyphenating = direct.hyphenating
+ local ligaturing = direct.ligaturing
+ local kerning = direct.kerning
+
+ -- kind of inconsistent
+
+ function node.hyphenating(first,last)
+ if first then
+ local h, t = hyphenating(todirect(first), last and todirect(last) or nil)
+ return h and tonode(h) or nil, t and tonode(t) or nil, true
+ else
+ return nil, false
+ end
+ end
+
+ function node.ligaturing(first,last)
+ if first then
+ local h, t = ligaturing(todirect(first), last and todirect(last) or nil)
+ return h and tonode(h) or nil, t and tonode(t) or nil, true
+ else
+ return nil, false
+ end
+ end
+
+ function node.kerning(first,last)
+ if first then
+ local h, t = kerning(todirect(first), last and todirect(last) or nil)
+ return h and tonode(h) or nil, t and tonode(t) or nil, true
+ else
+ return nil, false
+ end
+ end
+
+ local protect_glyph = direct.protect_glyph
+ local unprotect_glyph = direct.unprotect_glyph
+ local protect_glyphs = direct.protect_glyphs
+ local unprotect_glyphs = direct.unprotect_glyphs
+
+ function node.protect_glyphs(first,last)
+ protect_glyphs(todirect(first), last and todirect(last) or nil)
+ end
+
+ function node.unprotect_glyphs(first,last)
+ unprotect_glyphs(todirect(first), last and todirect(last) or nil)
+ end
+
+ function node.protect_glyph(first)
+ protect_glyph(todirect(first))
+ end
+
+ function node.unprotect_glyph(first)
+ unprotect_glyph(todirect(first))
+ end
+
+ local flatten_discretionaries = direct.flatten_discretionaries
+ local check_discretionaries = direct.check_discretionaries
+ local check_discretionary = direct.check_discretionary
+
+ function node.flatten_discretionaries(first)
+ local h, count = flatten_discretionaries(todirect(first))
+ return tonode(h), count
+ end
+
+ function node.check_discretionaries(n)
+ check_discretionaries(todirect(n))
+ end
+
+ function node.check_discretionary(n)
+ check_discretionary(todirect(n))
+ end
+
+ local hpack = direct.hpack
+ local vpack = direct.vpack
+ local list_to_hlist = direct.mlist_to_hlist
+
+ function node.hpack(head,...)
+ local h, badness = hpack(head and todirect(head) or nil,...)
+ return tonode(h), badness
+ end
+
+ function node.vpack(head,...)
+ local h, badness = vpack(head and todirect(head) or nil,...)
+ return tonode(h), badness
+ end
+
+ function node.mlist_to_hlist(head,...)
+ return tonode(mlist_to_hlist(head and todirect(head) or nil,...))
+ end
+
+ local end_of_math = direct.end_of_math
+ local find_attribute = direct.find_attribute
+ local first_glyph = direct.first_glyph
+
+ function node.end_of_math(n)
+ if n then
+ n = end_of_math(todirect(n))
+ if n then
+ return tonode(n)
+ end
+ end
+ return nil
+ end
+
+ function node.find_attribute(n,a)
+ if n then
+ local v, n = find_attribute(todirect(n),a)
+ if n then
+ return v, tonode(n)
+ end
+ end
+ return nil
+ end
+
+ function node.first_glyph(first,last)
+ local n = first_glyph(todirect(first), last and todirect(last) or nil)
+ return n and tonode(n) or nil
+ end
+
+ local dimensions = direct.dimensions
+ local rangedimensions = direct.rangedimensions
+ local effective_glue = direct.effective_glue
+
+ function node.dimensions(a,b,c,d,e)
+ if type(a) == "userdata" then
+ a = todirect(a)
+ if type(b) == "userdata" then
+ b = todirect(b)
+ end
+ return dimensions(a,b)
+ else
+ d = todirect(d)
+ if type(e) == "userdata" then
+ e = todirect(e)
+ end
+ return dimensions(a,b,c,d,e)
+ end
+ return 0, 0, 0
+ end
+
+ function node.rangedimensions(parent,first,last)
+ return rangedimenensions(todirect(parent),todirect(first),last and todirect(last))
+ end
+
+ function node.effective_glue(list,parent)
+ return effective_glue(list and todirect(list) or nil,parent and todirect(parent) or nil)
+ end
+
+ local uses_font = direct.uses_font
+ local has_glyph = direct.has_glyph
+ local protrusion_skippable = direct.protrusion_skippable
+ local prepend_prevdepth = direct.prepend_prevdepth
+ local make_extensible = direct.make_extensible
+
+ function node.uses_font(n,f)
+ return uses_font(todirect(n),f)
+ end
+
+ function node.has_glyph(n)
+ return has_glyph(todirect(n))
+ end
+
+ function node.protrusion_skippable(n)
+ return protrusion_skippable(todirect(n))
+ end
+
+ function node.prepend_prevdepth(n)
+ local n, d = prepend_prevdepth(todirect(n))
+ return tonode(n), d
+ end
+
+ function node.make_extensible(...)
+ local n = make_extensible(...)
+ return n and tonode(n) or nil
+ end
+
+ local last_node = direct.last_node
+
+ function node.last_node()
+ local n = last_node()
+ return n and tonode(n) or nil
+ end
+
+ local is_zero_glue = direct.is_zero_glue
+ local getglue = direct.getglue
+ local setglue = direct.setglue
+
+ function node.is_zero_glue(n)
+ return is_zero_glue(todirect(n))
+ end
+
+ function node.get_glue(n)
+ return get_glue(todirect(n))
+ end
+
+ function node.set_glue(n)
+ return set_glue(todirect(n))
+ end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-mig.lua b/Master/texmf-dist/tex/context/base/mkiv/node-mig.lua
index 32b09a1869c..6c10625eb64 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-mig.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-mig.lua
@@ -24,13 +24,16 @@ local tonut = nuts.tonut
local getnext = nuts.getnext
local getid = nuts.getid
local getlist = nuts.getlist
-local getattr = nuts.getattr
+----- getattr = nuts.getattr
+local getprop = nuts.getprop
-local setattr = nuts.setattr
+----- setattr = nuts.setattr
+local setprop = nuts.setprop
local setlink = nuts.setlink
local setlist = nuts.setlist
local setprev = nuts.setprev
local setnext = nuts.setnext
+local setboth = nuts.setboth
local remove_node = nuts.remove
@@ -60,11 +63,11 @@ local function locate(head,first,last,ni,nm)
elseif migrate_inserts and id == insert_code then
local insert
head, current, insert = remove_node(head,current)
- setnext(insert)
if first then
+ setnext(insert)
setlink(last,insert)
else
- setprev(insert)
+ setboth(insert)
first = insert
end
last = insert
@@ -72,11 +75,11 @@ local function locate(head,first,last,ni,nm)
elseif migrate_marks and id == mark_code then
local mark
head, current, mark = remove_node(head,current)
- setnext(mark)
if first then
+ setnext(mark)
setlink(last,mark)
else
- setprev(mark)
+ setboth(mark)
first = mark
end
last = mark
@@ -98,8 +101,13 @@ function nodes.handlers.migrate(head,where)
local id = getid(current)
-- inserts_too is a temp hack, we should only do them when it concerns
-- newly placed (flushed) inserts
- if id == vlist_code or id == hlist_code or (inserts_too and id == insert_code) and not getattr(current,a_migrated) then
- setattr(current,a_migrated,1)
+
+ -- todo: getprop / setprop
+
+ -- if id == vlist_code or id == hlist_code or (inserts_too and id == insert_code) and not getattr(current,a_migrated) then
+ if id == vlist_code or id == hlist_code or (inserts_too and id == insert_code) and not getprop(current,"migrated") then
+ -- setattr(current,a_migrated,1)
+ setprop(current,"migrated",true)
t_sweeps = t_sweeps + 1
local h = getlist(current)
local first, last, ni, nm
@@ -112,7 +120,7 @@ function nodes.handlers.migrate(head,where)
end
if first then
t_inserts = t_inserts + ni
- t_marks = t_marks + nm
+ t_marks = t_marks + nm
if trace_migrations and (ni > 0 or nm > 0) then
report_nodes("sweep %a, container %a, %s inserts and %s marks migrated outwards during %a",
t_sweeps,nodecodes[id],ni,nm,where)
@@ -126,7 +134,7 @@ function nodes.handlers.migrate(head,where)
current = last
end
end
- current = getnext(next)
+ current = getnext(current)
end
return head
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-nut.lua b/Master/texmf-dist/tex/context/base/mkiv/node-nut.lua
index 50e87e988b8..7174bd47565 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-nut.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-nut.lua
@@ -147,8 +147,9 @@ local nuts = nodes.nuts
nuts.check_discretionaries = direct.check_discretionaries
nuts.copy = direct.copy
-nuts.copy_list = direct.copy_list
nuts.copy_node = direct.copy
+nuts.copy_only = direct.copy_only or direct.copy
+nuts.copy_list = direct.copy_list
nuts.count = direct.count
nuts.current_attr = direct.current_attr
nuts.delete = direct.delete
@@ -202,6 +203,8 @@ nuts.vpack = direct.vpack
nuts.writable_spec = direct.writable_spec
nuts.write = direct.write
nuts.mlist_to_hlist = direct.mlist_to_hlist
+nuts.has_dimensions = direct.has_dimensions
+nuts.start_of_par = direct.start_of_par
if not nuts.mlist_to_hlist then
@@ -218,134 +221,174 @@ if not nuts.mlist_to_hlist then
end
-nuts.getfield = direct.getfield
-nuts.setfield = direct.setfield
-
-nuts.getnext = direct.getnext
-nuts.setnext = direct.setnext
-
-nuts.getid = direct.getid
-
-nuts.getprev = direct.getprev
-nuts.setprev = direct.setprev
-
-nuts.getattr = direct.get_attribute
-nuts.setattr = direct.set_attribute
-nuts.takeattr = direct.unset_attribute -- ?
-
-nuts.is_zero_glue = direct.is_zero_glue
-nuts.effective_glue = direct.effective_glue
-
-nuts.getglue = direct.getglue
-nuts.setglue = direct.setglue
-nuts.getboxglue = direct.getglue
-nuts.setboxglue = direct.setglue
-
-nuts.getdisc = direct.getdisc
-nuts.setdisc = direct.setdisc
-nuts.getdiscretionary = direct.getdisc
-nuts.setdiscretionary = direct.setdisc
-
-nuts.getdata = direct.getdata
-nuts.setdata = direct.setdata
-nuts.getvalue = direct.getdata
-nuts.setvalue = direct.setdata
-
-nuts.getexpansion = direct.getexpansion
-nuts.setexpansion = direct.setexpansion
-
-nuts.getwhd = direct.getwhd
-nuts.setwhd = direct.setwhd
-nuts.getwidth = direct.getwidth
-nuts.setwidth = direct.setwidth
-nuts.getheight = direct.getheight
-nuts.setheight = direct.setheight
-nuts.getdepth = direct.getdepth
-nuts.setdepth = direct.setdepth
-nuts.getshift = direct.getshift
-nuts.setshift = direct.setshift
-nuts.getorientation = direct.getorientation or function() end
-nuts.setorientation = direct.setorientation or function() end
-
-nuts.getnucleus = direct.getnucleus
-nuts.setnucleus = direct.setnucleus
-nuts.getsup = direct.getsup
-nuts.setsup = direct.setsup
-nuts.getsub = direct.getsub
-nuts.setsub = direct.setsub
-
-nuts.getchar = direct.getchar
-nuts.setchar = direct.setchar
-nuts.getfont = direct.getfont
-nuts.setfont = direct.setfont
-nuts.getfam = direct.getfam
-nuts.setfam = direct.setfam
-
-nuts.getboth = direct.getboth
-nuts.setboth = direct.setboth
-nuts.setlink = direct.setlink
-nuts.setsplit = direct.setsplit
-
-nuts.getlist = direct.getlist -- only hlist and vlist !
-nuts.setlist = direct.setlist
-nuts.getleader = direct.getleader
-nuts.setleader = direct.setleader
-nuts.getcomponents = direct.getcomponents
-nuts.setcomponents = direct.setcomponents
-
-nuts.getsubtype = direct.getsubtype
-nuts.setsubtype = direct.setsubtype
-
-nuts.getlang = direct.getlang
-nuts.setlang = direct.setlang
-nuts.getlanguage = direct.getlang
-nuts.setlanguage = direct.setlang
-
-nuts.getattrlist = direct.getattributelist
-nuts.setattrlist = direct.setattributelist
-nuts.getattributelist = direct.getattributelist
-nuts.setattributelist = direct.setattributelist
-
-nuts.getoffsets = direct.getoffsets
-nuts.setoffsets = direct.setoffsets
-
-nuts.getkern = direct.getkern
-nuts.setkern = direct.setkern
-
-nuts.getdir = direct.getdir
-nuts.setdir = direct.setdir
-
-nuts.getdirection = direct.getdirection
-nuts.setdirection = direct.setdirection
-
-nuts.getpenalty = direct.getpenalty
-nuts.setpenalty = direct.setpenalty
-
-nuts.getbox = direct.getbox
-nuts.setbox = direct.setbox
-
-nuts.is_char = direct.is_char
-nuts.ischar = direct.is_char
-nuts.is_glyph = direct.is_glyph
-nuts.isglyph = direct.is_glyph
-
-local d_remove_node = direct.remove
-local d_flush_node = direct.flush_node
-local d_getnext = direct.getnext
-local d_getprev = direct.getprev
-local d_getid = direct.getid
-local d_getlist = direct.getlist
-local d_find_tail = direct.tail
-local d_insert_after = direct.insert_after
-local d_insert_before = direct.insert_before
-local d_slide = direct.slide
------ d_copy_node = direct.copy
-local d_traverse = direct.traverse
-local d_setlink = direct.setlink
-local d_setboth = direct.setboth
-local d_getboth = direct.getboth
-
-local function remove(head,current,free_too)
+if not nuts.has_dimensions then
+
+ local getwhd = direct.getwhd
+
+ function nuts.has_dimensions(n)
+ local wd, ht, dp = getwhd(n)
+ return wd ~= 0 or (ht + dp) ~= 0
+ end
+
+end
+
+local getfield = direct.getfield
+local setfield = direct.setfield
+
+nuts.getfield = getfield
+nuts.setfield = setfield
+
+nuts.getnext = direct.getnext
+nuts.setnext = direct.setnext
+
+nuts.getid = direct.getid
+
+nuts.getprev = direct.getprev
+nuts.setprev = direct.setprev
+
+local get_attribute = direct.get_attribute
+local set_attribute = direct.set_attribute
+local unset_attribute = direct.unset_attribute
+
+nuts.getattr = get_attribute
+nuts.setattr = set_attribute
+nuts.takeattr = unset_attribute -- ?
+
+nuts.is_zero_glue = direct.is_zero_glue
+nuts.effective_glue = direct.effective_glue
+
+nuts.getglue = direct.getglue
+nuts.setglue = direct.setglue
+nuts.getboxglue = direct.getglue
+nuts.setboxglue = direct.setglue
+
+nuts.getdisc = direct.getdisc
+nuts.setdisc = direct.setdisc
+nuts.getdiscretionary = direct.getdisc
+nuts.setdiscretionary = direct.setdisc
+
+nuts.getpre = direct.getpre
+nuts.setpre = direct.setpre
+nuts.getpost = direct.getpost
+nuts.setpost = direct.setpost
+nuts.getreplace = direct.getreplace
+nuts.setreplace = direct.setreplace
+
+local getdata = direct.getdata
+local setdata = direct.setdata
+
+nuts.getdata = getdata
+nuts.setdata = setdata
+nuts.getvalue = getdata
+nuts.setvalue = setdata
+
+nuts.getexpansion = direct.getexpansion
+nuts.setexpansion = direct.setexpansion
+
+nuts.getwhd = direct.getwhd
+nuts.setwhd = direct.setwhd
+nuts.getwidth = direct.getwidth
+nuts.setwidth = direct.setwidth
+nuts.getheight = direct.getheight
+nuts.setheight = direct.setheight
+nuts.getdepth = direct.getdepth
+nuts.setdepth = direct.setdepth
+nuts.getshift = direct.getshift
+nuts.setshift = direct.setshift
+
+-- lmtx compatibility
+
+nuts.getorientation = direct.getorientation or function() end
+nuts.setorientation = direct.setorientation or function() end
+
+nuts.getglyphdata = direct.getglyphdata or get_attribute
+nuts.setglyphdata = direct.setglyphdata or function(n,d) set_attribute(n,0,d) end
+
+nuts.getruledata = direct.getglyphdata and getdata or function(n) return getfield(n,"transform") end
+nuts.setruledata = direct.setglyphdata and setdata or function(n,d) return setfield(n,"transform",d) end
+
+-- so far
+
+nuts.getnucleus = direct.getnucleus
+nuts.setnucleus = direct.setnucleus
+nuts.getsup = direct.getsup
+nuts.setsup = direct.setsup
+nuts.getsub = direct.getsub
+nuts.setsub = direct.setsub
+
+nuts.getchar = direct.getchar
+nuts.setchar = direct.setchar
+nuts.getfont = direct.getfont
+nuts.setfont = direct.setfont
+nuts.getfam = direct.getfam
+nuts.setfam = direct.setfam
+
+nuts.getboth = direct.getboth
+nuts.setboth = direct.setboth
+nuts.setlink = direct.setlink
+nuts.setsplit = direct.setsplit
+
+nuts.getlist = direct.getlist -- only hlist and vlist !
+nuts.setlist = direct.setlist
+nuts.getleader = direct.getleader
+nuts.setleader = direct.setleader
+nuts.getcomponents = direct.getcomponents
+nuts.setcomponents = direct.setcomponents
+
+nuts.getsubtype = direct.getsubtype
+nuts.setsubtype = direct.setsubtype
+
+nuts.getlang = direct.getlang
+nuts.setlang = direct.setlang
+nuts.getlanguage = direct.getlang
+nuts.setlanguage = direct.setlang
+
+nuts.getattrlist = direct.getattributelist
+nuts.setattrlist = direct.setattributelist
+nuts.getattributelist = direct.getattributelist
+nuts.setattributelist = direct.setattributelist
+
+nuts.getoffsets = direct.getoffsets
+nuts.setoffsets = direct.setoffsets
+
+nuts.getkern = direct.getkern
+nuts.setkern = direct.setkern
+
+nuts.getdir = direct.getdir
+nuts.setdir = direct.setdir
+
+nuts.getdirection = direct.getdirection
+nuts.setdirection = direct.setdirection
+
+nuts.getpenalty = direct.getpenalty
+nuts.setpenalty = direct.setpenalty
+
+nuts.getbox = direct.getbox
+nuts.setbox = direct.setbox
+
+nuts.ischar = direct.is_char
+nuts.isglyph = direct.is_glyph
+
+----.is_char = nuts.ischar
+----.is_glyph = nuts.isglyph
+
+local d_remove_node = direct.remove
+local d_flush_node = direct.flush_node
+local d_getnext = direct.getnext
+local d_getprev = direct.getprev
+local d_getid = direct.getid
+local d_getlist = direct.getlist
+local d_find_tail = direct.tail
+local d_insert_after = direct.insert_after
+local d_insert_before = direct.insert_before
+local d_slide = direct.slide
+----- d_copy_node = direct.copy
+local d_traverse = direct.traverse
+local d_setlink = direct.setlink
+local d_setboth = direct.setboth
+local d_getboth = direct.getboth
+
+local remove = CONTEXTLMTXMODE > 0 and d_remove_node or function(head,current,free_too)
if current then
local h, c = d_remove_node(head,current)
if free_too then
@@ -359,13 +402,45 @@ local function remove(head,current,free_too)
return head, current
end
+-- for now
+
+if not nuts.start_of_par then
+
+ local localparcodes = nodes.localparcodes
+ local hmodepar_code = localparcodes.vmode_par
+ local vmodepar_code = localparcodes.hmode_par
+
+ local getsubtype = nuts.getsubtype
+
+ function nuts.start_of_par(n)
+ local s = getsubtype(n)
+ return s == hmodepar_code or s == vmodepar_code
+ end
+
+end
+
+-- for now
+
+if not nuts.getpre then
+
+ local d_getdisc = direct.getdisc
+ local d_setfield = direct.setfield
+
+ function nuts.getpre (n) local h, _, _, t, _, _ = d_getdisc(n,true) return h, t end
+ function nuts.getpost (n) local _, h, _, _, t, _ = d_getdisc(n,true) return h, t end
+ function nuts.getreplace(n) local _, _, h, _, _, t = d_getdisc(n,true) return h, t end
+
+ function nuts.setpre (n,h) d_setfield(d,"pre", h) end
+ function nuts.setpost (n,h) d_setfield(d,"post", h) end
+ function nuts.setreplace(n,h) d_setfield(d,"replace",h) end
+
+end
+
-- alias
nuts.getsurround = nuts.getkern
nuts.setsurround = nuts.setkern
--- bad: we can have prev's being glue_spec
-
nuts.remove = remove
function nuts.delete(head,current)
@@ -717,14 +792,22 @@ end
nuts.getprop = function(n,k)
local p = propertydata[n]
if p then
- return p[k]
+ if k then
+ return p[k]
+ else
+ return p
+ end
end
end
nuts.rawprop = function(n,k)
local p = rawget(propertydata,n)
if p then
- return p[k]
+ if k then
+ return p[k]
+ else
+ return p
+ end
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-par.lua b/Master/texmf-dist/tex/context/base/mkiv/node-par.lua
index 8564c8764bd..d89edf6f4ca 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-par.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-par.lua
@@ -39,7 +39,7 @@ local function newgraf(mode,indented)
local runner = actions.runner
if runner then
starttiming(builders)
- indent = runner(mode,indented)
+ indented = runner(mode,indented)
stoptiming(builders)
end
return indented
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-pro.lua b/Master/texmf-dist/tex/context/base/mkiv/node-pro.lua
index 606d5b8d773..4d748af89bd 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-pro.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-pro.lua
@@ -176,7 +176,8 @@ end
do
- local texnest = tex.nest
+ ----- texnest = tex.nest
+ local getnest = tex.getnest
local getlist = nuts.getlist
local setlist = nuts.setlist
@@ -188,7 +189,7 @@ do
function processors.contribute_filter(groupcode)
if groupcode == "box" then -- "pre_box"
- local whatever = texnest[texnest.ptr]
+ local whatever = getnest()
if whatever then
local line = whatever.tail
if line then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-ref.lua b/Master/texmf-dist/tex/context/base/mkiv/node-ref.lua
index e12bd95bdd6..ac43a84a368 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-ref.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-ref.lua
@@ -77,6 +77,7 @@ local getdimensions = nuts.dimensions
local getrangedimensions = nuts.rangedimensions
local traverse = nuts.traverse
local find_node_tail = nuts.tail
+local start_of_par = nuts.start_of_par
local nodecodes = nodes.nodecodes
local gluecodes = nodes.gluecodes
@@ -166,33 +167,33 @@ local function dimensions(parent,start,stop) -- in principle we could move some
-- todo: if no prev and no next and parent
-- todo: we need a a list_dimensions for a vlist
if getid(parent) == vlist_code then
- if false then
- local l = getlist(parent)
- local c = l
- local ok = false
- while c do
- if c == start then
- ok = true
- end
- if ok and getid(c) == hlist_code then
- break
- else
- c = getnext(c)
- end
- end
- if ok and c then
- if trace_areas then
- report_area("dimensions taken of first line in vlist")
- end
- local w, h, d = getwhd(c)
- return w, h, d, c
- else
- if trace_areas then
- report_area("dimensions taken of vlist (probably wrong)")
- end
- return hlist_dimensions(start,stop,parent)
- end
- else
+ -- if false then
+ -- local l = getlist(parent)
+ -- local c = l
+ -- local ok = false
+ -- while c do
+ -- if c == start then
+ -- ok = true
+ -- end
+ -- if ok and getid(c) == hlist_code then
+ -- break
+ -- else
+ -- c = getnext(c)
+ -- end
+ -- end
+ -- if ok and c then
+ -- if trace_areas then
+ -- report_area("dimensions taken of first line in vlist")
+ -- end
+ -- local w, h, d = getwhd(c)
+ -- return w, h, d, c
+ -- else
+ -- if trace_areas then
+ -- report_area("dimensions taken of vlist (probably wrong)")
+ -- end
+ -- return hlist_dimensions(start,stop,parent)
+ -- end
+ -- else
--
-- we can as well calculate here because we only have kerns and glue
--
@@ -200,7 +201,7 @@ local function dimensions(parent,start,stop) -- in principle we could move some
local last = nil
local current = start
local noflines = 0
- while current do
+ while current do -- can be loop
local id = getid(current)
if id == hlist_code or id == vlist_code or id == rule_code then
if noflines == 0 then
@@ -239,7 +240,7 @@ local function dimensions(parent,start,stop) -- in principle we could move some
return hlist_dimensions(start,stop,parent)
end
end
- end
+ -- end
else
if trace_areas then
report_area("dimensions taken of range starting with %a using parent",nodecodes[id])
@@ -258,7 +259,7 @@ local function inject_range(head,first,last,reference,make,stack,parent,pardir,t
local width, height, depth, line = dimensions(parent,first,last)
if txtdir == righttoleft_code then
width = - width
- elseif textdir == lefttoright_code then
+ elseif txtdir == lefttoright_code then
-- go on
elseif pardir == righttoleft_code then
width = - width
@@ -374,6 +375,9 @@ end
-- where we can end up with a first and last spanning lines so maybe
-- we need to do vlists differently
+-- todo: no need for dir here if we inject in the right spot as then we can
+-- pick up the dir elsewhere (in lmtx)
+
local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,txtdir) -- main
local first, last, firstdir, reference
local current = head
@@ -383,9 +387,6 @@ local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,tx
local r = getattr(current,attribute)
-- test \goto{test}[page(2)] test \gotobox{test}[page(2)]
-- test \goto{\TeX}[page(2)] test \gotobox{\hbox {x} \hbox {x}}[page(2)]
- -- if r and (not skip or r >) skip then -- maybe no > test
- -- inject_list(id,current,r,make,stack,pardir,txtdir)
- -- end
if r then
if not reference then
reference, first, last, firstdir = r, current, current, txtdir
@@ -419,7 +420,7 @@ local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,tx
local direction, pop = getdirection(current)
txtdir = not pop and direction -- we might need a stack
elseif id == localpar_code then
- if getsubtype(current) == 0 then
+ if start_of_par(current) then
pardir = getdirection(current)
end
else
@@ -447,182 +448,6 @@ local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,tx
return head, pardir, txtdir
end
--- -- not faster either:
---
--- local findattr = node.direct.find_attribute
---
--- local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,txtdir) -- main
--- local first, last, firstdir, reference
--- local someatt = findattr(head,attribute)
--- if someatt then
--- local current = head
--- while current do
--- local id = getid(current)
--- if id == hlist_code or id == vlist_code then
--- local r = getattr(current,attribute)
--- -- test \goto{test}[page(2)] test \gotobox{test}[page(2)]
--- -- test \goto{\TeX}[page(2)] test \gotobox{\hbox {x} \hbox {x}}[page(2)]
--- -- if r and (not skip or r >) skip then -- maybe no > test
--- -- inject_list(id,current,r,make,stack,pardir,txtdir)
--- -- end
--- if r then
--- if not reference then
--- reference, first, last, firstdir = r, current, current, txtdir
--- elseif r == reference then
--- -- same link
--- last = current
--- elseif (done[reference] or 0) == 0 then
--- if not skip or r > skip then -- maybe no > test
--- head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir)
--- reference, first, last, firstdir = nil, nil, nil, nil
--- end
--- else
--- reference, first, last, firstdir = r, current, current, txtdir
--- end
--- done[r] = (done[r] or 0) + 1
--- end
--- local list = getlist(current)
--- if list then
--- local h
--- h, pardir, txtdir = inject_areas(list,attribute,make,stack,done,r or skip or 0,current,pardir,txtdir)
--- if h ~= current then
--- setlist(current,h)
--- end
--- end
--- if r then
--- done[r] = done[r] - 1
--- end
--- elseif id == dir_code then
--- local direction, pop = getdirection(current)
--- txtdir = not pop and direction -- we might need a stack
--- elseif id == localpar_code then -- only test at begin
--- pardir = getdirection(current)
--- elseif id == glue_code and getsubtype(current) == leftskip_code then -- any glue at the left?
--- --
--- else
--- local r = getattr(current,attribute)
--- if not r then
--- -- just go on, can be kerns
--- elseif not reference then
--- reference, first, last, firstdir = r, current, current, txtdir
--- elseif r == reference then
--- last = current
--- elseif (done[reference] or 0) == 0 then -- or id == glue_code and getsubtype(current) == right_skip_code
--- if not skip or r > skip then -- maybe no > test
--- head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir)
--- reference, first, last, firstdir = nil, nil, nil, nil
--- end
--- else
--- reference, first, last, firstdir = r, current, current, txtdir
--- end
--- end
--- current = getnext(current)
--- end
--- if reference and (done[reference] or 0) == 0 then
--- head = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir)
--- end
--- else
--- local current = head
--- while current do
--- local id = getid(current)
--- if id == hlist_code or id == vlist_code then
--- local list = getlist(current)
--- if list then
--- local h = inject_areas(list,attribute,make,stack,done,skip or 0,current,pardir,txtdir)
--- if h ~= current then
--- setlist(current,h)
--- end
--- end
--- elseif id == dir_code then
--- local direction, pop = getdirection(current)
--- txtdir = not pop and direction -- we might need a stack
--- elseif id == localpar_code then -- only test at begin
--- pardir = getdirection(current)
--- end
--- current = getnext(current)
--- end
--- end
--- return head, pardir, txtdir
--- end
-
--- -- maybe first check for glyphs and use a goto:
---
--- local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,txtdir) -- main
--- local first, last, firstdir, reference
--- local current = head
--- while current do
--- local id = getid(current)
--- local r -- else scope message due to goto
--- if id == glyph_code then
--- goto rest
--- elseif id == hlist_code or id == vlist_code then
--- r = getattr(current,attribute)
--- -- test \goto{test}[page(2)] test \gotobox{test}[page(2)]
--- -- test \goto{\TeX}[page(2)] test \gotobox{\hbox {x} \hbox {x}}[page(2)]
--- -- if r and (not skip or r >) skip then -- maybe no > test
--- -- inject_list(id,current,r,make,stack,pardir,txtdir)
--- -- end
--- if r then
--- if not reference then
--- reference, first, last, firstdir = r, current, current, txtdir
--- elseif r == reference then
--- -- same link
--- last = current
--- elseif (done[reference] or 0) == 0 then
--- if not skip or r > skip then -- maybe no > test
--- head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir)
--- reference, first, last, firstdir = nil, nil, nil, nil
--- end
--- else
--- reference, first, last, firstdir = r, current, current, txtdir
--- end
--- done[r] = (done[r] or 0) + 1
--- end
--- local list = getlist(current)
--- if list then
--- local h
--- h, pardir, txtdir = inject_areas(list,attribute,make,stack,done,r or skip or 0,current,pardir,txtdir)
--- if h ~= current then
--- setlist(current,h)
--- end
--- end
--- if r then
--- done[r] = done[r] - 1
--- end
--- elseif id == glue_code and getsubtype(current) == leftskip_code then -- any glue at the left?
--- --
--- elseif id == dir_code then
--- local direction, pop = getdirection(current)
--- txtdir = not pop and direction -- we might need a stack
--- elseif id == localpar_code then -- only test at begin
--- pardir = getdirection(current)
--- end
--- goto next
--- ::rest::
--- r = getattr(current,attribute)
--- if not r then
--- -- just go on, can be kerns
--- elseif not reference then
--- reference, first, last, firstdir = r, current, current, txtdir
--- elseif r == reference then
--- last = current
--- elseif (done[reference] or 0) == 0 then -- or id == glue_code and getsubtype(current) == right_skip_code
--- if not skip or r > skip then -- maybe no > test
--- head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir)
--- reference, first, last, firstdir = nil, nil, nil, nil
--- end
--- else
--- reference, first, last, firstdir = r, current, current, txtdir
--- end
--- ::next::
--- current = getnext(current)
--- end
--- if reference and (done[reference] or 0) == 0 then
--- head = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir)
--- end
--- return head, pardir, txtdir
--- end
-
-- tracing: todo: use predefined colors
local register_color = colors.register
@@ -766,7 +591,7 @@ local function makereference(width,height,depth,reference) -- height and depth a
if depth < dp then depth = dp end
end
-- logs.report("temp","used: ht=%p dp=%p",height,depth)
- local annot = nodeinjections.reference(width,height,depth,set)
+ local annot = nodeinjections.reference(width,height,depth,set,resolved.mesh)
if annot then
annot = tonut(annot) -- todo
nofreferences = nofreferences + 1
@@ -929,7 +754,6 @@ local function makedestination(width,height,depth,reference)
end
end
-
function nodes.destinations.handler(head)
if head and topofstack > 0 then
return (inject_areas(head,attribute,makedestination,stack,done))
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-res.lua b/Master/texmf-dist/tex/context/base/mkiv/node-res.lua
index 5b4961683ce..a27f5c4e5ff 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-res.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-res.lua
@@ -96,9 +96,10 @@ local setsubtype = nuts.setsubtype
local setleader = nuts.setleader
local setdata = nuts.setdata
+local setruledata = nuts.setruledata
local setvalue = nuts.setvalue
-local copy_nut = nuts.copy
+local copy_nut = nuts.copy_only or nuts.copy
local new_nut = nuts.new
local flush_nut = nuts.flush
@@ -161,8 +162,7 @@ local kern = register_nut(new_nut(kern_code,kerncodes.userkern))
local fontkern = register_nut(new_nut(kern_code,kerncodes.fontkern))
local italickern = register_nut(new_nut(kern_code,kerncodes.italiccorrection))
local penalty = register_nut(new_nut(nodecodes.penalty))
-local glue = register_nut(new_nut(glue_code)) -- glue.spec = nil
-local glue_spec = register_nut(new_nut(nodecodes.gluespec))
+local glue = register_nut(new_nut(glue_code))
local glyph = register_nut(new_nut(glyph_code,0))
local textdir = register_nut(new_nut(nodecodes.dir))
@@ -172,7 +172,7 @@ local savepos = register_nut(new_nut(whatsit_code,whatsitcodes.savepos
local user_node = new_nut(whatsit_code,whatsitcodes.userdefined)
-if CONTEXTLMTXMODE < 2 then
+if CONTEXTLMTXMODE == 0 then
setfield(user_node,"type",usercodes.number)
end
@@ -183,6 +183,10 @@ local lineskip = register_nut(new_nut(glue_code,gluecodes.lineskip))
local baselineskip = register_nut(new_nut(glue_code,gluecodes.baselineskip))
local leftskip = register_nut(new_nut(glue_code,gluecodes.leftskip))
local rightskip = register_nut(new_nut(glue_code,gluecodes.rightskip))
+local lefthangskip = register_nut(new_nut(glue_code,gluecodes.lefthangskip))
+local righthangskip = register_nut(new_nut(glue_code,gluecodes.righthangskip))
+local indentskip = register_nut(new_nut(glue_code,gluecodes.indentskip))
+local correctionskip = register_nut(new_nut(glue_code,gluecodes.correctionskip))
local temp = register_nut(new_nut(nodecodes.temp,0))
@@ -272,15 +276,6 @@ function nutpool.italickern(k)
return n
end
-function nutpool.gluespec(width,stretch,shrink,stretch_order,shrink_order)
- -- maybe setglue
- local s = copy_nut(glue_spec)
- if width or stretch or shrink or stretch_order or shrink_order then
- setglue(s,width,stretch,shrink,stretch_order,shrink_order)
- end
- return s
-end
-
local function someskip(skip,width,stretch,shrink,stretch_order,shrink_order)
-- maybe setglue
local n = copy_nut(skip)
@@ -328,6 +323,18 @@ function nutpool.rightskip(width,stretch,shrink,stretch_order,shrink_order)
return someskip(rightskip,width,stretch,shrink,stretch_order,shrink_order)
end
+function nutpool.lefthangskip(width,stretch,shrink,stretch_order,shrink_order)
+ return someskip(lefthangskip,width,stretch,shrink,stretch_order,shrink_order)
+end
+
+function nutpool.righthangskip(width,stretch,shrink,stretch_order,shrink_order)
+ return someskip(righthangskip,width,stretch,shrink,stretch_order,shrink_order)
+end
+
+function nutpool.indentskip(width,stretch,shrink,stretch_order,shrink_order)
+ return someskip(indentskip,width,stretch,shrink,stretch_order,shrink_order)
+end
+
function nutpool.lineskip(width,stretch,shrink,stretch_order,shrink_order)
return someskip(lineskip,width,stretch,shrink,stretch_order,shrink_order)
end
@@ -344,14 +351,6 @@ function nutpool.disc(pre,post,replace)
return d
end
-function nutpool.textdir(dir) -- obsolete !
- local t = copy_nut(textdir)
- if dir then
- setdir(t,dir)
- end
- return t
-end
-
function nutpool.direction(dir,swap)
local t = copy_nut(textdir)
if not dir then
@@ -394,7 +393,7 @@ function nutpool.outlinerule(width,height,depth,line) -- w/h/d == nil will let t
setwhd(n,width,height,depth)
end
if line then
- if CONTEXTLMTXMODE > 1 then setdata(n,line) else setfield(n,"transform",line) end
+ setruledata(n,line)
end
return n
end
@@ -414,11 +413,16 @@ function nutpool.savepos()
return copy_nut(savepos)
end
-if CONTEXTLMTXMODE > 1 then
+if CONTEXTLMTXMODE == 0 then
function nutpool.latelua(code)
local n = copy_nut(latelua)
- nodeproperties[n] = { data = code }
+ if type(code) == "table" then
+ local action = code.action
+ local specification = code.specification or code
+ code = function() action(specification) end
+ end
+ setdata(n,code)
return n
end
@@ -426,12 +430,7 @@ else
function nutpool.latelua(code)
local n = copy_nut(latelua)
- if type(code) == "table" then
- local action = code.action
- local specification = code.specification or code
- code = function() action(specification) end
- end
- setdata(n,code)
+ nodeproperties[n] = { data = code }
return n
end
@@ -560,8 +559,7 @@ local function cleanup(nofboxes) -- todo
return nr, nl, nofboxes -- can be nil
end
-
-local function usage()
+local usage = CONTEXTLMTXMODE > 0 and node.inuse or function()
local t = { }
for n, tag in gmatch(status.node_mem_usage,"(%d+) ([a-z_]+)") do
t[tag] = tonumber(n) or 0
@@ -582,9 +580,13 @@ statistics.register("cleaned up reserved nodes", function()
end) -- \topofboxstack
statistics.register("node memory usage", function() -- comes after cleanup !
- local usage = status.node_mem_usage
- if usage ~= "" then
- return usage
+ local used = usage()
+ if next(used) then
+ local t, n = { }, 0
+ for k, v in table.sortedhash(used) do
+ n = n + 1 ; t[n] = format("%s %s",v,k)
+ end
+ return table.concat(t,", ")
end
end)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-rul.lua b/Master/texmf-dist/tex/context/base/mkiv/node-rul.lua
index 1df5bf32ae7..b904e54d616 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-rul.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-rul.lua
@@ -22,7 +22,7 @@ local tonumber = tonumber
local context = context
local attributes = attributes
local nodes = nodes
-local properties = nodes.properties
+local properties = nodes.properties.data
local enableaction = nodes.tasks.enableaction
@@ -30,7 +30,6 @@ local nuts = nodes.nuts
local tonode = nuts.tonode
local tonut = nuts.tonut
-local getfield = nuts.getfield
local setnext = nuts.setnext
local setprev = nuts.setprev
local setlink = nuts.setlink
@@ -50,7 +49,10 @@ local getwidth = nuts.getwidth
local setwidth = nuts.setwidth
local setoffsets = nuts.setoffsets
local setfield = nuts.setfield
-local getdata = nuts.getdata
+
+----- getfield = nuts.getfield
+----- getdata = nuts.getdata
+local getruledata = nuts.getruledata
local isglyph = nuts.isglyph
@@ -122,6 +124,9 @@ local dimenfactor = fonts.helpers.dimenfactor
local splitdimen = number.splitdimen
local setmetatableindex = table.setmetatableindex
+local magicconstants = tex.magicconstants
+local running = magicconstants.running
+
--
local striprange = nuts.striprange
@@ -166,7 +171,7 @@ rules .ruleactions = ruleactions
nutrules.ruleactions = ruleactions -- convenient
local function mathaction(n,h,v,what)
- local font = CONTEXTLMTXMODE > 1 and getdata(n) or getfield(n,"transform")
+ local font = getruledata(n)
local actions = fontresources[font].mathruleactions
if actions then
local action = actions[what]
@@ -184,6 +189,8 @@ local function mathrule(n,h,v)
mathaction(n,h,v,"hruleaction")
end
+local x
+
local function useraction(n,h,v)
local p = properties[n]
if p then
@@ -222,7 +229,7 @@ local trace_ruled = false trackers.register("nodes.rules", function(v) trace_
local report_ruled = logs.reporter("nodes","rules")
function rules.define(settings)
- local nofdata = #data+1
+ local nofdata = #data + 1
data[nofdata] = settings
local text = settings.text
if text then
@@ -234,7 +241,7 @@ function rules.define(settings)
settings.text = nil
end
end
- context(nofdata)
+ return nofdata
end
local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but acceptable for this purpose
@@ -263,7 +270,7 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a
if not f then
return head
end
- local w, ht, dp = getrangedimensions(parent,f,getnext(l))
+ local wd, ht, dp = getrangedimensions(parent,f,getnext(l))
local method = d.method
local empty = d.empty == v_yes
local offset = d.offset
@@ -304,7 +311,7 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a
m = 0
end
- local function inject(r,w,ht,dp)
+ local function inject(r,wd,ht,dp)
if layer then
setattr(r,a_viewerlayer,layer)
end
@@ -315,7 +322,7 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a
setnext(l)
flushlist(f)
else
- local k = new_kern(-w)
+ local k = new_kern(-wd)
if foreground then
insert_node_after(head,l,k)
insert_node_after(head,k,r)
@@ -327,12 +334,12 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a
end
if trace_ruled then
report_ruled("level %a, width %p, height %p, depth %p, nodes %a, text %a",
- level,w,ht,dp,n_tostring(f,l),n_tosequence(f,l,true))
+ level,wd,ht,dp,n_tostring(f,l),n_tosequence(f,l,true))
end
end
if mp and mp ~= "" then
local r = usernutrule {
- width = w,
+ width = wd,
height = ht,
depth = dp,
type = "mp",
@@ -344,22 +351,26 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a
ca = color,
ta = transparency,
}
- inject(r,w,ht,dp)
+ inject(r,wd,ht,dp)
else
local tx = d.text
if tx then
local l = copy_list(tx)
if d["repeat"] == v_yes then
- l = new_leader(w,l)
+ l = new_leader(wd,l)
setattrlist(l,tx)
end
- l = hpack_nodes(l,w,"exactly")
- inject(l,w,ht,dp)
+ l = hpack_nodes(l,wd,"exactly")
+ inject(l,wd,ht,dp)
else
for i=1,level do
- local ht = (offset+(i-1)*dy)*e + rulethickness - m
- local dp = -(offset+(i-1)*dy)*e + rulethickness + m
- local r = new_rule(w,ht,dp)
+ local hd = (offset+(i-1)*dy)*e - m
+-- local ht = hd + rulethickness - m
+-- local dp = -hd + rulethickness + m
+ local ht = hd + rulethickness
+ local dp = -hd + rulethickness
+ local r = new_rule(wd,ht,dp)
+ -- can be done more efficient
if color then
setattr(r,a_colormodel,colorspace)
setattr(r,a_color,color)
@@ -367,7 +378,7 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a
if transparency then
setattr(r,a_transparency,transparency)
end
- inject(r,w,ht,dp)
+ inject(r,wd,ht,dp)
end
end
end
@@ -388,16 +399,18 @@ local report_shifted = logs.reporter("nodes","shifting")
local a_shifted = attributes.private('shifted')
-nodes.shifts = nodes.shifts or { }
-nodes.shifts.data = nodes.shifts.data or { }
+local shifts = nodes.shifts or { }
+nodes.shifts = shifts
+shifts.data = shifts.data or { }
-storage.register("nodes/shifts/data", nodes.shifts.data, "nodes.shifts.data")
+storage.register("nodes/shifts/data", shifts.data, "nodes.shifts.data")
-local data = nodes.shifts.data
+local data = shifts.data
-function nodes.shifts.define(settings)
- data[#data+1] = settings
- context(#data)
+function shifts.define(settings)
+ local nofdata = #data + 1
+ data[nofdata] = settings
+ return nofdata
end
local function flush_shifted(head,first,last,data,level,parent,strip) -- not that fast but acceptable for this purpose
@@ -428,26 +441,28 @@ local function flush_shifted(head,first,last,data,level,parent,strip) -- not tha
return head
end
-nodes.shifts.handler = function(head)
+shifts.handler = function(head)
return processwords(a_shifted,data,flush_shifted,head)
end
-function nodes.shifts.enable()
+function shifts.enable()
enableaction("shipouts","nodes.shifts.handler")
end
-- linefillers
-nodes.linefillers = nodes.linefillers or { }
-nodes.linefillers.data = nodes.linefillers.data or { }
+local linefillers = nodes.linefillers or { }
+nodes.linefillers = linefillers
+linefillers.data = linefillers.data or { }
-storage.register("nodes/linefillers/data", nodes.linefillers.data, "nodes.linefillers.data")
+storage.register("nodes/linefillers/data", linefillers.data, "nodes.linefillers.data")
-local data = nodes.linefillers.data
+local data = linefillers.data
-function nodes.linefillers.define(settings)
- data[#data+1] = settings
- context(#data)
+function linefillers.define(settings)
+ local nofdata = #data + 1
+ data[nofdata] = settings
+ return nofdata
end
local function linefiller(current,data,width,location)
@@ -484,7 +499,7 @@ local function linefiller(current,data,width,location)
end
end
-function nodes.linefillers.filler(current,data,width,height,depth)
+function linefillers.filler(current,data,width,height,depth)
if width and width > 0 then
local height = height or data.height or 0
local depth = depth or data.depth or 0
@@ -532,9 +547,9 @@ local function find_attr(head,attr)
end
end
-function nodes.linefillers.handler(head)
- for current, subtype, list in nexthlist, head do
- if list and subtype == linelist_code then
+function linefillers.handler(head)
+ for current, subtype in nexthlist, head do
+ if current and subtype == linelist_code then
-- why doesn't leftskip take the attributes
-- or list[linefiller] or maybe first match (maybe we need a fast helper for that)
local a = getattr(current,a_linefiller)
@@ -558,6 +573,8 @@ function nodes.linefillers.handler(head)
rightlocal = true
end
--
+ local list = getlist(current)
+ --
if location == v_left or location == v_both then
local lskip = nil -- leftskip
local iskip = nil -- indentation
@@ -656,7 +673,7 @@ end
local enable = false
-function nodes.linefillers.enable()
+function linefillers.enable()
if not enable then
-- we could now nil it
enableaction("finalizers","nodes.linefillers.handler")
@@ -698,7 +715,7 @@ implement {
implement {
name = "defineshift",
- actions = { nodes.shifts.define, context },
+ actions = { shifts.define, context },
arguments = {
{
{ "continue" },
@@ -712,12 +729,12 @@ implement {
implement {
name = "enableshifts",
onlyonce = true,
- actions = nodes.shifts.enable
+ actions = shifts.enable
}
implement {
name = "definelinefiller",
- actions = { nodes.linefillers.define, context },
+ actions = { linefillers.define, context },
arguments = {
{
{ "method", "integer" },
@@ -739,7 +756,7 @@ implement {
implement {
name = "enablelinefillers",
onlyonce = true,
- actions = nodes.linefillers.enable
+ actions = linefillers.enable
}
-- We add a bonus feature here (experiment):
@@ -759,9 +776,9 @@ interfaces.implement {
},
actions = function(t)
local n = new_rule(
- t.width,
- t.height,
- t.depth
+ t.width or running,
+ t.height or running,
+ t.depth or running
)
setattrlist(n,true)
setoffsets(n,t.xoffset,t.yoffset) -- ,t.left, t.right
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-rul.mkiv b/Master/texmf-dist/tex/context/base/mkiv/node-rul.mkiv
index 19f398eb900..7f2093bf2c3 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-rul.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-rul.mkiv
@@ -146,6 +146,12 @@
{\node_rules_set{#1}\barparameter\c!left}%
{\relax\barparameter\c!right}}
+\unexpanded\def\inlinebar[#1]%
+ {\node_rules_direct{#1}}
+
+% \unexpanded\def\inlinecurrentbar
+% {\node_rules_direct{\currentbar}}
+
% store in properties
\unexpanded\def\node_rules_set#1% maybe reverse the 1000 (also maybe use more attributes instead of settings)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-scn.lua b/Master/texmf-dist/tex/context/base/mkiv/node-scn.lua
index a40a5271a9e..055f5e20def 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-scn.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-scn.lua
@@ -124,7 +124,7 @@ local function processwords(attribute,data,flush,head,parent,skip) -- we have hl
local continue, leaders, done, strip, level = false, false, false, true, -1
while n do
local id = getid(n)
- if id == glyph_code or id == rule_code or (id == hlist_code and getattr(n,a_runningtext) == 1) then
+ if id == glyph_code or id == rule_code or (id == hlist_code and getattr(n,a_runningtext)) then
local aa = getattr(n,attribute)
if aa and aa ~= skip then
if aa == a then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-syn.lua b/Master/texmf-dist/tex/context/base/mkiv/node-syn.lua
index a00dc65ec53..68a05234e90 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-syn.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-syn.lua
@@ -89,7 +89,6 @@ if not modules then modules = { } end modules ['node-syn'] = {
-- h2,5:4661756,12973165:22918783,655360,327680
-- h2,6:27884864,12973165:4746833,655360,327680
-- h2,6:4661756,13922231:18320732,655360,327680
--- )
-- ]
-- !533
-- }1
@@ -106,7 +105,6 @@ if not modules then modules = { } end modules ['node-syn'] = {
-- h3,4:8459505,11075033:19885281,655360,327680
-- h3,5:28571312,11075033:4060385,655360,327680
-- h3,5:4661756,12024099:15344870,655360,327680
--- )
-- ]
-- !441
-- }2
@@ -156,8 +154,11 @@ local kern_code = nodecodes.kern
----- rule_code = nodecodes.rule
local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
+local dir_code = nodecodes.dir
local fontkern_code = kerncodes.fontkern
+local cancel_code = nodes.dircodes.cancel
+
local insert_before = nuts.insert_before
local insert_after = nuts.insert_after
@@ -170,7 +171,7 @@ local getdimensions = nuts.dimensions
local getrangedimensions = nuts.rangedimensions
local get_synctex_fields = nuts.get_synctex_fields
-local set_synctex_fields = nuts.set_synctex_fields
+----- set_synctex_fields = nuts.set_synctex_fields
local set_synctex_line = tex.set_synctex_line
local set_synctex_tag = tex.set_synctex_tag
local force_synctex_tag = tex.force_synctex_tag
@@ -227,6 +228,8 @@ local blockedsuffixes = {
mkii = true,
mkiv = true,
mkvi = true,
+ mkxl = true,
+ mklx = true,
mkix = true,
mkxi = true,
-- lfg = true,
@@ -641,6 +644,19 @@ local function collect_max(head,parent)
current = getnext(current)
if current then
id = getid(current)
+
+-- while id == dir_code do
+-- current = getnext(current)
+-- if current then
+-- id = getid(current)
+-- else
+-- if tag > 0 then
+-- head = inject(parent,head,first,last,tag,line)
+-- end
+-- return head
+-- end
+-- end
+
else
if tag > 0 then
head = inject(parent,head,first,last,tag,line)
@@ -649,12 +665,12 @@ local function collect_max(head,parent)
end
end
end
- -- pick up(as id can have changed)
+ -- pick up (as id can have changed)
if id == hlist_code or id == vlist_code then
local list = getlist(current)
if list then
local l = collect(list,current)
- if l ~= list then
+ if l and l ~= list then
setlist(current,l)
end
end
@@ -692,7 +708,8 @@ end
function synctex.stop()
if enabled then
- filehandle:write(s_vlist,s_hlist)
+ -- filehandle:write(s_vlist,s_hlist)
+ filehandle:write(s_hlist)
writeanchor()
filehandle:write("}",nofsheets,eol)
nofobjects = nofobjects + 2
diff --git a/Master/texmf-dist/tex/context/base/mkiv/node-tra.lua b/Master/texmf-dist/tex/context/base/mkiv/node-tra.lua
index e1b6927fbce..c7556aba6d0 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/node-tra.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/node-tra.lua
@@ -83,6 +83,8 @@ local whatsit_code = nodecodes.whatsit
local dimenfactors = number.dimenfactors
local formatters = string.formatters
+local start_of_par = nuts.start_of_par
+
-- this will be reorganized:
function nodes.showlist(head, message)
@@ -165,7 +167,7 @@ local function tosequence(start,stop,compact)
elseif id == dir_code then
local d, p = getdirection(start)
n = n + 1 ; t[n] = "[<" .. (p and "-" or "+") .. d .. ">]" -- todo l2r etc
- elseif id == localpar_code and getsubtype(start) == 0 then
+ elseif id == localpar_code and start_of_par(current) then
n = n + 1 ; t[n] = "[<" .. getdirection(start) .. ">]" -- todo l2r etc
elseif compact then
n = n + 1 ; t[n] = "[]"
@@ -355,7 +357,9 @@ local function listtoutf(h,joiner,textonly,last,nodisc)
n = n + 1 ; w[n] = " "
end
elseif id == hlist_code or id == vlist_code then
- n = n + 1 ; w[n] = "[]"
+ n = n + 1 ; w[n] = "["
+ n = n + 1 ; w[n] = listtoutf(getlist(h),joiner,textonly,last,nodisc)
+ n = n + 1 ; w[n] = "]"
end
else
n = n + 1 ; w[n] = "[-]"
diff --git a/Master/texmf-dist/tex/context/base/mkiv/pack-bck.mkvi b/Master/texmf-dist/tex/context/base/mkiv/pack-bck.mkvi
index 9f9d843cef7..6cbe281d975 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/pack-bck.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/pack-bck.mkvi
@@ -105,6 +105,11 @@
\strut
\vskip-2\lineheight
\strut
+ % safeguard added
+ \ifdim\dimexpr\pagetotal+2\lineheight\relax>\pagegoal
+ \page
+ \fi
+ % till here
\egroup
\dimen2\leftskip % new **
\forgetall
@@ -120,7 +125,7 @@
\splitmaxdepth\boxmaxdepth
\splittopskip\topskip
\doloop
- {\ifdim\pagetotal=\zeropoint % empty page
+ {\ifzeropt\pagetotal % empty page
\scratchdimen\textheight
\backgroundsplitmode\plusone % split to max height
\else
diff --git a/Master/texmf-dist/tex/context/base/mkiv/pack-box.mkiv b/Master/texmf-dist/tex/context/base/mkiv/pack-box.mkiv
index bf6d4662dac..422f090f0b9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/pack-box.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/pack-box.mkiv
@@ -913,15 +913,15 @@
\scratchtopoffset \offsetboxparameter\c!topoffset
\scratchbottomoffset\offsetboxparameter\c!bottomoffset
\relax % really needed
- \ifdim\scratchleftoffset =\zeropoint\else\donetrue\fi
- \ifdim\scratchrightoffset =\zeropoint\else\donetrue\fi
- \ifdim\scratchtopoffset =\zeropoint\else\donetrue\fi
- \ifdim\scratchbottomoffset=\zeropoint\else\donetrue\fi
+ \ifzeropt\scratchleftoffset \else\donetrue\fi
+ \ifzeropt\scratchrightoffset \else\donetrue\fi
+ \ifzeropt\scratchtopoffset \else\donetrue\fi
+ \ifzeropt\scratchbottomoffset\else\donetrue\fi
\ifdone
\edef\p_method{\offsetboxparameter\c!method}%
\ifx\p_method\v!fixed % new
- \ifdim\scratchleftoffset=\zeropoint
- \ifdim\scratchrightoffset=\zeropoint \else
+ \ifzeropt\scratchleftoffset
+ \ifzeropt\scratchrightoffset \else
\scratchxposition-\scratchrightoffset
\scratchrightoffset\zeropoint
\fi
@@ -929,8 +929,8 @@
\scratchxposition\scratchleftoffset
\scratchleftoffset\zeropoint
\fi
- \ifdim\scratchtopoffset=\zeropoint
- \ifdim\scratchbottomoffset=\zeropoint \else
+ \ifzeropt\scratchtopoffset
+ \ifzeropt\scratchbottomoffset \else
\scratchyposition-\scratchbottomoffset
\scratchbottomoffset\zeropoint
\fi
diff --git a/Master/texmf-dist/tex/context/base/mkiv/pack-com.mkiv b/Master/texmf-dist/tex/context/base/mkiv/pack-com.mkiv
index 1c6f2de7361..fe622509a10 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/pack-com.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/pack-com.mkiv
@@ -227,26 +227,74 @@
\newtoks\everycombination
+% \def\pack_combinations_start[#1][#2]% needs a cleanup, also nx ny (pretty old, this one)
+% {\edef\currentcombination{#1}%
+% \edef\currentcombinationspec{#2}%
+% \ifx\currentcombinationspec\empty
+% \doifelseassignment{#1}%
+% {\let\currentcombination\empty
+% \setupcurrentcombination[#1]%
+% \edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}}
+% {\doifelseinstring{*}\currentcombination
+% {\edef\currentcombinationspec{\currentcombination*\plusone*}%
+% \let\currentcombination\empty}
+% {\doifelsenumber\currentcombination
+% {\edef\currentcombinationspec{\currentcombination*\plusone*}%
+% \let\currentcombination\empty}
+% {\edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}}}}%
+% \else
+% \doifelseassignment{#2}%
+% {\setupcurrentcombination[#2]%
+% \edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}}
+% {\edef\currentcombinationspec{\currentcombinationspec*\plusone*}}%
+% \fi
+% %
+% \forgetall
+% %
+% \the\everycombination
+% %
+% \let\startcontent\pack_common_content_start
+% \let\stopcontent \pack_common_content_stop
+% \let\startcaption\pack_common_caption_start
+% \let\stopcaption \pack_common_caption_stop
+% %
+% \edef\p_height {\combinationparameter\c!height}%
+% \edef\p_width {\combinationparameter\c!width}%
+% \edef\p_location{\combinationparameter\c!location}%
+% \edef\p_distance{\combinationparameter\c!distance}%
+% %
+% \pack_combinations_location_reset
+% \rawprocesscommacommand[\p_location]\pack_combinations_location_step
+% %
+% \dostarttaggedchained\t!combination\currentcombination\??combination
+% \vbox \ifx\p_height\v!fit\else to \p_height \fi \bgroup
+% \let\combination\empty % permits \combination{}{} handy for cld
+% \normalexpanded{\pack_combinations_start_indeed[\currentcombinationspec]}}
+
\def\pack_combinations_start[#1][#2]% needs a cleanup, also nx ny (pretty old, this one)
{\edef\currentcombination{#1}%
\edef\currentcombinationspec{#2}%
\ifx\currentcombinationspec\empty
- \doifelseassignment{#1}%
- {\let\currentcombination\empty
- \setupcurrentcombination[#1]%
- \edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}}
- {\doifelseinstring{*}\currentcombination
- {\edef\currentcombinationspec{\currentcombination*\plusone*}%
- \let\currentcombination\empty}
- {\doifelsenumber\currentcombination
- {\edef\currentcombinationspec{\currentcombination*\plusone*}%
- \let\currentcombination\empty}
- {\edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}}}}%
+ \ifcondition\validassignment{#1}%
+ \let\currentcombination\empty
+ \setupcurrentcombination[#1]%
+ \edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}%
+ \else
+ \doifelseinstring{*}\currentcombination
+ {\edef\currentcombinationspec{\currentcombination*\plusone*}%
+ \let\currentcombination\empty}
+ {\doifelsenumber\currentcombination
+ {\edef\currentcombinationspec{\currentcombination*\plusone*}%
+ \let\currentcombination\empty}
+ {\edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}}}%
+ \fi
\else
- \doifelseassignment{#2}%
- {\setupcurrentcombination[#2]%
- \edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}}
- {\edef\currentcombinationspec{\currentcombinationspec*\plusone*}}%
+ \ifcondition\validassignment{#2}%
+ \setupcurrentcombination[#2]%
+ \edef\currentcombinationspec{\combinationparameter\c!nx*\combinationparameter\c!ny*}%
+ \else
+ \edef\currentcombinationspec{\currentcombinationspec*\plusone*}%
+ \fi
\fi
%
\forgetall
@@ -521,10 +569,8 @@
{\pack_combinations_float_hack_a{\recurselevel}}%
{\pack_combinations_float_hack_b{\recurselevel}}%
\to\scratchtoks}% brrr
- \let\pack_combinations_check_x_y\pack_combinations_float_check_x_y
- \doifassignmentelse{#1}
- {\expanded{\startcombination[#1]\the\scratchtoks}\stopcombination}%
- {\expanded{\startcombination[#1]\the\scratchtoks}\stopcombination}%
+ \let\pack_combinations_check_x_y\pack_combinations_float_check_x_y
+ \expanded{\startcombination[#1]\the\scratchtoks}\stopcombination
\resetlocalfloats
\egroup}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/pack-lyr.mkiv b/Master/texmf-dist/tex/context/base/mkiv/pack-lyr.mkiv
index e7070cfdec1..e952a73b98f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/pack-lyr.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/pack-lyr.mkiv
@@ -19,18 +19,16 @@
\unprotect
-% When being backgrounds layers get the background offset
-% displacement. Should be an option, on by default
-% (compatibility).
+% When being backgrounds layers get the background offset displacement. Should be
+% an option, on by default (compatibility).
-%D The layering mechanism implemented here is independent of
-%D the output routine, but future extensions may depend on a
-%D more close cooperation.
-
-%D First we overload a macro from \type {pack-rul}. From now on
-%D we accept a (optional) argument: the specific layer it
-%D will go in. This means that we can move an overlay from one
-%D background to the other using the dimensions of the parent.
+%D The layering mechanism implemented here is independent of the output routine, but
+%D future extensions may depend on a more close cooperation.
+%D
+%D First we overload a macro from \type {pack-rul}. From now on we accept a
+%D (optional) argument: the specific layer it will go in. This means that we can
+%D move an overlay from one background to the other using the dimensions of the
+%D parent.
\ifdefined\defineoverlay \else \message{loaded to early} \wait \fi
@@ -46,13 +44,12 @@
\fi
\processcommalist[#1]\pack_framed_define_overlay_indeed}
-%D We use the command handler code. The previous, more direct parameter
-%D handling was 25\% faster when no parameters were passed when adding
-%D content to a layer. However, when we pass for instance a preset, the
-%D new methos is some 10\% faster and it happens that in most cases we
-%D do pass some parameters. It would be interesting to see if we can push
-%D the preset in between the regular chain but it could also lead to
-%D unwanted side effects when nesting layer placement.
+%D We use the command handler code. The previous, more direct parameter handling was
+%D 25\% faster when no parameters were passed when adding content to a layer.
+%D However, when we pass for instance a preset, the new methos is some 10\% faster
+%D and it happens that in most cases we do pass some parameters. It would be
+%D interesting to see if we can push the preset in between the regular chain but it
+%D could also lead to unwanted side effects when nesting layer placement.
\installcorenamespace{layer}
\installcorenamespace{layerbox}
@@ -62,13 +59,11 @@
%D \macros
%D {definelayer,setuplayer}
%D
-%D Each layer gets its own (global) box. This also means that
-%D the data that goes into a layer, is typeset immediately.
-%D Each layer automatically gets an associated overlay,
-%D which can be used in any background assignment.
+%D Each layer gets its own (global) box. This also means that the data that goes
+%D into a layer, is typeset immediately. Each layer automatically gets an associated
+%D overlay, which can be used in any background assignment.
%D
-%D After a layer is defined, you can change its
-%D characteristics.
+%D After a layer is defined, you can change its characteristics.
\installcommandhandler \??layer {layer} \??layer
@@ -175,8 +170,7 @@
%D \macros
%D {resetlayer}
%D
-%D This macro hardly needs an explanation (but is seldom
-%D needed anyway).
+%D This macro hardly needs an explanation (but is seldom needed anyway).
\def\pack_layers_reset_box#1%
{\ifcsname\??layerbox#1\endcsname
@@ -193,10 +187,9 @@
%D \macros
%D {setlayer}
%D
-%D Data is moved into a layer with the following macro. When
-%D \type {position} is set, relative positioning is used, with
-%D the current point as reference point. Otherwise the topleft
-%D corner is used as reference point.
+%D Data is moved into a layer with the following macro. When \type {position} is
+%D set, relative positioning is used, with the current point as reference point.
+%D Otherwise the topleft corner is used as reference point.
%D
%D \starttyping
%D \setlayer [identifier] [optional parameters] {data}
@@ -474,11 +467,10 @@
{\ifdim\d_pack_layers_x_size>\zeropoint \advance\d_pack_layers_x_position.5\d_pack_layers_x_size \fi
\ifdim\d_pack_layers_y_size>\zeropoint \advance\d_pack_layers_y_position.5\d_pack_layers_y_size \fi}
-%D Given the task to be accomplished, the previous macro is
-%D not even that complicated. It mainly comes down to skipping
-%D to the right place and placing a box on top of or below the
-%D existing content. In the case of position tracking, another
-%D reference point is chosen.
+%D Given the task to be accomplished, the previous macro is not even that
+%D complicated. It mainly comes down to skipping to the right place and placing a
+%D box on top of or below the existing content. In the case of position tracking,
+%D another reference point is chosen.
%D \macros
%D {doifelselayerdata}
@@ -500,10 +492,9 @@
%D \macros
%D {flushlayer}
%D
-%D When we flush a layer, we flush both the main one and the
-%D page dependent one (when defined). This feature is more
-%D efficient in \ETEX\ since there testing for an undefined
-%D macro does not takes hash space.
+%D When we flush a layer, we flush both the main one and the page dependent one
+%D (when defined). This feature is more efficient in \ETEX\ since there testing for
+%D an undefined macro does not takes hash space.
% todo: setups before flush, handy hook
@@ -593,22 +584,22 @@
\def\pack_layers_flush_double#1%
{\startoverlay
{\ifcsname\??layerbox\currentlayer\endcsname
- \ifvoid\lastnamedcss\else \chardef\b_layer_two\lastnamedcs
+ \ifvoid\lastnamedcs\else \chardef\b_layer_two\lastnamedcs
\pack_layers_flush_indeed\plusone\currentlayer\b_layer_two
\fi
\fi}%
{\ifcsname\??layerbox\currentlayer:\the\realpageno\endcsname
- \ifvoid\lastnamedcss\else \chardef\b_layer_two\lastnamedcs
+ \ifvoid\lastnamedcs\else \chardef\b_layer_two\lastnamedcs
\pack_layers_flush_indeed\zerocount{\currentlayer:\the\realpageno}\b_layer_two
\fi
\fi}%
{\ifcsname\??layerbox#1\currentlayer\endcsname
- \ifvoid\lastnamedcss\else \chardef\b_layer_two\lastnamedcs
+ \ifvoid\lastnamedcs\else \chardef\b_layer_two\lastnamedcs
\pack_layers_flush_indeed\plusone{#1\currentlayer}\b_layer_two
\fi
\fi}%
{\ifcsname\??layerbox#1\currentlayer:\the\realpageno\endcsname
- \ifvoid\lastnamedcss\else \chardef\b_layer_two\lastnamedcs
+ \ifvoid\lastnamedcs\else \chardef\b_layer_two\lastnamedcs
\pack_layers_flush_indeed\zerocount{#1\currentlayer:\the\realpageno}\b_layer_two
\fi
\fi}%
@@ -709,9 +700,8 @@
%D \macros
%D {composedlayer,placelayer,tightlayer}
%D
-%D This is a handy shortcut, which saves a couple of braces
-%D when we use it as parameter. This name also suits better
-%D to other layering commands.
+%D This is a handy shortcut, which saves a couple of braces when we use it as
+%D parameter. This name also suits better to other layering commands.
\unexpanded\def\composedlayer#1{\flushlayer[#1]}
@@ -736,8 +726,7 @@
%D \macros
%D {setMPlayer}
%D
-%D The following layer macro uses the positions that are
-%D registered by \METAPOST.
+%D The following layer macro uses the positions that are registered by \METAPOST.
%D
%D \starttyping
%D \definelayer[test]
diff --git a/Master/texmf-dist/tex/context/base/mkiv/pack-lyr.mkxl b/Master/texmf-dist/tex/context/base/mkiv/pack-lyr.mkxl
new file mode 100644
index 00000000000..43460092e7e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/pack-lyr.mkxl
@@ -0,0 +1,794 @@
+%D \module
+%D [ file=pack-lyr,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Layers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Layers}
+
+% todo : first / last / next / +... => page key
+% test on left/right box when no doublesided option given
+% use \ifcsname instead of doifvalue
+
+\unprotect
+
+% When being backgrounds layers get the background offset displacement. Should be
+% an option, on by default (compatibility).
+
+%D The layering mechanism implemented here is independent of the output routine, but
+%D future extensions may depend on a more close cooperation.
+%D
+%D First we overload a macro from \type {pack-rul}. From now on we accept a
+%D (optional) argument: the specific layer it will go in. This means that we can
+%D move an overlay from one background to the other using the dimensions of the
+%D parent.
+
+\ifdefined\defineoverlay \else \message{loaded to early} \wait \fi
+
+\unexpanded\def\defineoverlay
+ {\dotripleempty\pack_framed_define_overlay}
+
+\def\pack_framed_define_overlay[#1][#2][#3]% overlay [layer] content
+ {\ifthirdargument
+ %\writestatus{BEWARE}{This (overlay definition) has changed!}% temp
+ \def\pack_framed_define_overlay_indeed##1{\setvalue{\??overlay##1}{\setlayer[#2]{\executedefinedoverlay{##1}{#3}}}}%
+ \else
+ \def\pack_framed_define_overlay_indeed##1{\setvalue{\??overlay##1}{\executedefinedoverlay{##1}{#2}}}%
+ \fi
+ \processcommalist[#1]\pack_framed_define_overlay_indeed}
+
+%D We use the command handler code. The previous, more direct parameter handling was
+%D 25\% faster when no parameters were passed when adding content to a layer.
+%D However, when we pass for instance a preset, the new methos is some 10\% faster
+%D and it happens that in most cases we do pass some parameters. It would be
+%D interesting to see if we can push the preset in between the regular chain but it
+%D could also lead to unwanted side effects when nesting layer placement.
+
+\installcorenamespace{layer}
+\installcorenamespace{layerbox}
+\installcorenamespace{layerpreset}
+\installcorenamespace{layerposition} % brr, unreadable
+
+%D \macros
+%D {definelayer,setuplayer}
+%D
+%D Each layer gets its own (global) box. This also means that the data that goes
+%D into a layer, is typeset immediately. Each layer automatically gets an associated
+%D overlay, which can be used in any background assignment.
+%D
+%D After a layer is defined, you can change its characteristics.
+
+\installcommandhandler \??layer {layer} \??layer
+
+\setuplayer
+ [\c!state=\v!start,
+ %\c!doublesided=,
+ %\c!preset=,
+ %\c!option=,
+ %\c!corner=,
+ %\c!page=,
+ %\c!rotation=, % geen 0 !
+ \c!direction=\v!normal,
+ \c!position=\v!no,
+ \c!method=\v!overlay,
+ \c!x=\zeropoint,
+ \c!y=\zeropoint,
+ \c!line=0,
+ \c!column=0,
+ \c!width=\wd\nextbox, % don't change this globally
+ \c!height=\ht\nextbox, % don't change this globally
+ \c!offset=\zeropoint,
+ \c!hoffset=\zeropoint,
+ \c!voffset=\zeropoint,
+ \c!dx=\zeropoint,
+ \c!dy=\zeropoint,
+ \c!location=rb,
+ \c!sx=1,
+ \c!sy=1,
+ \c!region=\layeranchor]
+
+\def\layeranchor{\currentlayer:\the\realpageno}
+
+\let\p_pack_layers_doublesided\empty
+\let\p_pack_layers_state \empty
+\let\p_pack_layers_option \empty
+\let\p_pack_layers_method \empty
+\let\p_pack_layers_preset \empty
+\let\p_pack_layers_rotation \empty
+\let\p_pack_layers_position \empty
+\let\p_pack_layers_hoffset \empty
+\let\p_pack_layers_voffset \empty
+\let\p_pack_layers_offset \empty
+\let\p_pack_layers_dx \empty
+\let\p_pack_layers_dy \empty
+\let\p_pack_layers_sx \empty
+\let\p_pack_layers_sy \empty
+\let\p_pack_layers_x \empty
+\let\p_pack_layers_y \empty
+\let\p_pack_layers_corner \empty
+\let\p_pack_layers_location \empty
+\let\p_pack_layers_line \empty
+\let\p_pack_layers_column \empty
+\let\p_pack_layers_width \empty
+\let\p_pack_layers_height \empty
+\let\p_pack_layers_direction \empty
+\let\p_pack_layers_region \empty
+
+\let\m_pack_layers_page \empty
+\let\m_pack_layers_target \empty
+\let\m_pack_layers_region \empty
+\let\m_pack_layers_anchor \empty
+
+\newconditional\c_pack_layers_repeated
+\newconditional\c_pack_layers_trace
+\newcount \c_pack_layers_current_data
+
+\newbox\b_layers
+
+\newdimen\d_pack_layers_x_size
+\newdimen\d_pack_layers_y_size
+\newdimen\d_pack_layers_x_offset
+\newdimen\d_pack_layers_y_offset
+\newdimen\d_pack_layers_x_position
+\newdimen\d_pack_layers_y_position
+
+\newdimen\layerwidth
+\newdimen\layerheight
+
+\let\lastlayerxpos\!!zeropoint
+\let\lastlayerypos\!!zeropoint
+\let\lastlayerwd \!!zeropoint
+\let\lastlayerht \!!zeropoint
+\let\lastlayerdp \!!zeropoint
+
+\appendtoks
+ \edef\p_pack_layers_doublesided{\layerparameter\c!doublesided}%
+ \ifx\p_pack_layers_doublesided\v!yes
+ \relateparameterhandlers{layer}{\v!left \currentlayer}{layer}\currentlayer % permits left*
+ \relateparameterhandlers{layer}{\v!right\currentlayer}{layer}\currentlayer % permits right*
+ \pack_layers_preset_box{\v!left \currentlayer}%
+ \pack_layers_preset_box{\v!right\currentlayer}%
+ \fi
+ \pack_layers_preset_box\currentlayer
+ \normalexpanded{\defineoverlay[\currentlayer][\noexpand\composedlayer{\currentlayer}]}%
+\to \everydefinelayer
+
+\def\pack_layers_preset_box#1%
+ {\ifcsname\??layerbox#1\endcsname
+ \resetlayer[#1]%
+ \else
+ \expandafter\newbox\csname\??layerbox#1\endcsname
+ \fi}
+
+%D \macros
+%D {resetlayer}
+%D
+%D This macro hardly needs an explanation (but is seldom needed anyway).
+
+\def\pack_layers_reset_box#1%
+ {\ifcsname\??layerbox#1\endcsname
+ %\global\setbox\csname\??layerbox#1\endcsname\emptybox
+ \global\setbox\lastnamedcs\emptybox
+ \fi}
+
+\def\resetlayer[#1]%
+ {\pack_layers_reset_box{#1}%
+ \pack_layers_reset_box{\v!left #1}%
+ \pack_layers_reset_box{\v!right#1}%
+ \pack_layers_reset_box{#1:\the\realpageno}}
+
+%D \macros
+%D {setlayer}
+%D
+%D Data is moved into a layer with the following macro. When \type {position} is
+%D set, relative positioning is used, with the current point as reference point.
+%D Otherwise the topleft corner is used as reference point.
+%D
+%D \starttyping
+%D \setlayer [identifier] [optional parameters] {data}
+%D \stoptyping
+
+\def\setcurrentlayerdimensions
+ {\dodoubleempty\pack_layers_set_current_dimensions}
+
+\def\pack_layers_set_current_dimensions[#1][#2]% name left|right
+ {\edef\currentlayerwidth {\thelayerwidth {#2#1}}%
+ \edef\currentlayerheight{\thelayerheight{#2#1}}}
+
+\def\thelayerwidth #1{\the\ifcsname\??layerbox#1\endcsname\wd\lastnamedcs\else\zeropoint\fi}
+\def\thelayerheight#1{\the\ifcsname\??layerbox#1\endcsname\ht\lastnamedcs\else\zeropoint\fi}
+
+\unexpanded\def\setlayer
+ {\dotripleempty\pack_layers_set}
+
+\def\pack_layers_set[#1][#2][#3]% #4 == box do \fi is ok
+ {\bgroup
+ \checkpositionoverlays % otherwise funny regions
+ \edef\currentlayer{#1}%
+ \edef\p_pack_layers_state{\layerparameter\c!state}%
+ \ifx\p_pack_layers_state\v!stop
+ \dowithnextboxcs\egroup\hbox % no pack ?
+ \orelse\ifthirdargument
+ \pack_layers_set_indeed[#1][#2][#3]%
+ \else
+ \ifcondition\validassignment{#2}%
+ \pack_layers_set_indeed[#1][][#2]%
+ \else
+ \pack_layers_set_indeed[#1][#2][]%
+ \fi
+ \fi}
+
+\def\pack_layers_set_indeed[#1][#2][#3]% #2 = links/rechts
+ {\page_backgrounds_recalculate % brrr
+ \global\advance\c_pack_layers_current_data\plusone
+ \forgetall
+ \dontcomplain
+ \edef\p_pack_layers_option{\layerparameter\c!option}%
+ \ifx\p_pack_layers_option\v!test
+ \settrue\c_pack_layers_trace
+ \traceboxplacementtrue
+ \fi
+ \edef\m_pack_layers_target{#2}%
+ \dowithnextbox{\pack_layers_set_finish{#3}}\hbox}
+
+\def\pack_layers_set_finish#1%
+ {\ifcsname\??layerbox\currentlayer\endcsname % can move up
+ \ifx\m_pack_layers_target\v!even
+ \ifodd\realpageno
+ % discard nextbox
+ \else
+ \let\m_pack_layers_target\v!left
+ \pack_layers_set_content{#1}%
+ \fi
+ \orelse\ifx\m_pack_layers_target\v!odd
+ \ifodd\realpageno
+ \let\m_pack_layers_target\v!right
+ \pack_layers_set_content{#1}%
+ \else
+ % discard nextbox
+ \fi
+ \else
+ \pack_layers_set_content{#1}%
+ \fi
+ \else
+ \writestatus{layer}{unknown layer \currentlayer}%
+ \fi
+ \egroup}
+
+% todo: left/right
+% todo: get position data in one go
+
+\def\pack_layers_set_last_position_yes % target: left|right
+ {% this will become one call
+ \edef\m_pack_layers_anchor{\??layerposition\the\c_pack_layers_current_data}%
+ \edef\m_pack_layers_page {\MPp\m_pack_layers_anchor}%
+ %edef\m_pack_layers_region{\MPr\m_pack_layers_anchor}% wrong one
+ \edef\m_pack_layers_region{\layerparameter\c!region}%
+ \d_pack_layers_x_position \dimexpr-\MPx\m_pack_layers_region+\MPx\m_pack_layers_anchor\relax
+ \d_pack_layers_y_position \dimexpr \MPy\m_pack_layers_region-\MPy\m_pack_layers_anchor+\MPh\m_pack_layers_region\relax
+ \xdef\lastlayerxpos{\the\d_pack_layers_x_position}%
+ \xdef\lastlayerypos{\the\d_pack_layers_y_position}%
+ % \writestatus{layering}{region: \m_pack_layers_region=>\MPxywhd\m_pack_layers_region}%
+ % \writestatus {}{anchor: \m_pack_layers_anchor=>\MPxywhd\m_pack_layers_anchor}%
+ % \writestatus {}{offset: \c!dx,\c!dy =>\lastlayerxpos,\lastlayerypos}%
+ \global\letlayerparameter\c!state\v!start % needed ?
+ \setbox\b_layers\vpack to \d_pack_layers_y_size
+ {\hpack to \d_pack_layers_x_size
+ {\xypos\m_pack_layers_anchor\hss}%
+ \vss}}
+
+\def\pack_layers_set_last_position_nop
+ {\setbox\b_layers\emptybox
+ \d_pack_layers_x_position\p_pack_layers_sx\dimexpr\p_pack_layers_x\relax
+ \d_pack_layers_y_position\p_pack_layers_sy\dimexpr\p_pack_layers_y\relax
+ \glet\lastlayerxpos\!!zeropoint
+ \glet\lastlayerypos\!!zeropoint
+ \doifinset\v!bottom\p_pack_layers_corner\pack_layers_set_bottom_positions
+ \doifinset\v!right \p_pack_layers_corner\pack_layers_set_right_positions
+ \doifinset\v!middle\p_pack_layers_corner\pack_layers_set_middle_positions
+ \edef\m_pack_layers_page{\layerparameter\c!page}}
+
+\unexpanded\def\definelayerpreset
+ {\dodoubleargument\pack_layers_define_preset}
+
+\def\pack_layers_define_preset[#1][#2]%
+ {\doifelseassignment{#2}
+ {\setvalue{\??layerpreset#1}{\setupcurrentlayer[#2]}}
+ {\setvalue{\??layerpreset#1}{\csname\??layerpreset#2\endcsname}}}
+
+\def\pack_layers_set_content#1%
+ {\layerwidth \layerparameter\c!width % global (local later)
+ \layerheight\layerparameter\c!height % global (local later)
+ \d_pack_layers_x_size\layerwidth
+ \d_pack_layers_y_size\layerheight
+ %
+ \setupcurrentlayer[#1]% preroll
+ %
+ \edef\p_pack_layers_preset {\layerparameter\c!preset }%
+ %
+ \ifcsname\??layerpreset\p_pack_layers_preset\endcsname
+ \lastnamedcs
+ \setupcurrentlayer[#1]% postroll
+ \fi
+ %
+ \edef\p_pack_layers_rotation {\layerparameter\c!rotation }%
+ \edef\p_pack_layers_position {\layerparameter\c!position }%
+ \edef\p_pack_layers_hoffset {\layerparameter\c!hoffset }%
+ \edef\p_pack_layers_voffset {\layerparameter\c!voffset }%
+ \edef\p_pack_layers_offset {\layerparameter\c!offset }%
+ \edef\p_pack_layers_dx {\layerparameter\c!dx }%
+ \edef\p_pack_layers_dy {\layerparameter\c!dy }%
+ \edef\p_pack_layers_sx {\layerparameter\c!sx }%
+ \edef\p_pack_layers_sy {\layerparameter\c!sy }%
+ \edef\p_pack_layers_x {\layerparameter\c!x }%
+ \edef\p_pack_layers_y {\layerparameter\c!y }%
+ \edef\p_pack_layers_corner {\layerparameter\c!corner }%
+ \edef\p_pack_layers_location {\layerparameter\c!location }%
+ \edef\p_pack_layers_line {\layerparameter\c!line }%
+ \edef\p_pack_layers_column {\layerparameter\c!column }%
+ \edef\p_pack_layers_width {\layerparameter\c!width }% local ones
+ \edef\p_pack_layers_height {\layerparameter\c!height }% local ones
+ \edef\p_pack_layers_direction{\layerparameter\c!direction}%
+ %
+ \ifx\p_pack_layers_position\v!overlay
+ \let\p_pack_layers_width \zeropoint
+ \let\p_pack_layers_height \zeropoint
+ \let\p_pack_layers_position\v!yes
+ \fi
+ \ifx\p_pack_layers_rotation\empty \else
+ % use direct call
+ \setbox\nextbox\hpack
+ {\rotate[\c!location=\v!high,\c!rotation=\layerparameter\c!rotation]{\box\nextbox}}%
+ \fi
+ \d_pack_layers_x_offset\p_pack_layers_sx\dimexpr
+ \ifx\p_pack_layers_hoffset\v!max\d_pack_layers_x_size\else\p_pack_layers_hoffset\fi+\p_pack_layers_offset+\p_pack_layers_dx
+ \relax
+ \d_pack_layers_y_offset\p_pack_layers_sy\dimexpr
+ \ifx\p_pack_layers_voffset\v!max\d_pack_layers_y_size\else\p_pack_layers_voffset\fi+\p_pack_layers_offset+\p_pack_layers_dy
+ \relax
+ \ifx\p_pack_layers_position\v!yes
+ \pack_layers_set_last_position_yes
+ \else
+ \pack_layers_set_last_position_nop
+ \fi
+ %
+ \ifx\m_pack_layers_page\empty \else % is expanded
+ \edef\m_pack_layers_page{:\m_pack_layers_page}%
+ \ifcsname\??layerbox\m_pack_layers_target\currentlayer\m_pack_layers_page\endcsname \else
+ \expandafter\newbox\csname\??layerbox\m_pack_layers_target\currentlayer\m_pack_layers_page\endcsname
+ \fi
+ \fi
+ \chardef\layerpagebox\csname\??layerbox\m_pack_layers_target\currentlayer\m_pack_layers_page\endcsname
+ \ifvoid\layerpagebox
+ \gsetboxllx\layerpagebox\zeropoint
+ \gsetboxlly\layerpagebox\zeropoint
+ \fi
+ \global\setbox\layerpagebox\vpack %to \layerparameter\c!height % new, otherwise no negative y possible
+ {\offinterlineskip
+ \ifvoid\layerpagebox
+ \let\lastlayerwidth \zeropoint
+ \let\lastlayerheight\zeropoint
+ \else
+ \edef\lastlayerwidth {\the\wd\layerpagebox}%
+ \edef\lastlayerheight{\the\ht\layerpagebox}%
+ \ht\layerpagebox\zeropoint
+ \dp\layerpagebox\zeropoint
+ \wd\layerpagebox\zeropoint
+ \ifx\p_pack_layers_direction\v!reverse\else
+ \box\layerpagebox
+ \fi
+ \fi
+ % don't move
+ \xdef\lastlayerwd{\the\wd\nextbox}%
+ \xdef\lastlayerht{\the\ht\nextbox}% % not entirely ok when grid !
+ \xdef\lastlayerdp{\the\dp\nextbox}% % not entirely ok when grid !
+ % this code
+ \ifx\p_pack_layers_location\v!grid
+ \ht\nextbox\strutheight
+ \dp\nextbox\strutdepth
+ \else
+ \setbox\nextbox\hpack
+ {\alignedbox[\p_pack_layers_location]\vpack{\box\nextbox}}%
+ \fi
+ \ifnum\p_pack_layers_line=\zerocount\else % no \ifcase, can be negative
+ \advance\d_pack_layers_y_position\dimexpr\p_pack_layers_line\lineheight+\topskip-\lineheight-\ht\nextbox\relax
+ \fi
+ \ifnum\p_pack_layers_column=\zerocount\else % no \ifcase, can be negative
+ \advance\d_pack_layers_x_position\layoutcolumnoffset\p_pack_layers_column\relax
+ \fi
+ \ifx\p_pack_layers_location\v!grid
+ \setbox\nextbox\hpack
+ {\alignedbox[rb]\vpack{\box\nextbox}}%
+ \fi
+ % ll registration
+ \scratchdimen\dimexpr\d_pack_layers_x_position+\d_pack_layers_x_offset\relax
+ \ifdim\scratchdimen<\getboxllx\layerpagebox
+ \gsetboxllx\layerpagebox\scratchdimen
+ \fi
+ \advance\scratchdimen\wd\nextbox
+ \wd\nextbox\ifdim\scratchdimen>\lastlayerwidth \scratchdimen \else \lastlayerwidth \fi
+ \scratchdimen\dimexpr\d_pack_layers_y_position+\d_pack_layers_y_offset\relax
+ \ifdim\scratchdimen<\getboxlly\layerpagebox
+ \gsetboxlly\layerpagebox\scratchdimen
+ \fi
+ % ll compensation
+ \advance\scratchdimen\dimexpr\ht\nextbox+\dp\nextbox\relax
+ \ht\nextbox\ifdim\scratchdimen>\lastlayerheight \scratchdimen \else \lastlayerheight \fi
+ \dp\nextbox\zeropoint
+ % placement
+ \hsize\p_pack_layers_width
+ \vpack to \p_pack_layers_height \bgroup
+ \smashbox\nextbox
+ \vskip\dimexpr\d_pack_layers_y_position+\d_pack_layers_y_offset\relax
+ \hskip\dimexpr\d_pack_layers_x_position+\d_pack_layers_x_offset\relax
+ % or maybe instead of the \vskip
+ % \raise-\dimexpr\d_pack_layers_y_position+\d_pack_layers_y_offset\relax
+ \box\nextbox
+ \ifvoid\layerpagebox
+ % already flushed
+ \else
+ % the reverse case % check !
+ \vskip-\dimexpr\d_pack_layers_y_position+\d_pack_layers_y_offset\relax
+ \box\layerpagebox
+ \fi
+ \egroup}%
+ % when position is true, the layerbox holds the compensation and needs
+ % to be placed; never change this !
+ \ifvoid\b_layers \else
+ \box\b_layers
+ \fi}
+
+\def\pack_layers_set_bottom_positions
+ {\ifnum\p_pack_layers_line=\zerocount\else % can be < 0
+ \edef\p_pack_layers_line{\the\numexpr-\p_pack_layers_line+\layoutlines+\plusone\relax}% use counter instead ?
+ \fi
+ \ifdim\d_pack_layers_y_size>\zeropoint
+ \advance\d_pack_layers_y_position-\d_pack_layers_y_size
+ \d_pack_layers_y_position-\d_pack_layers_y_position
+ \d_pack_layers_y_offset-\d_pack_layers_y_offset
+ \fi}
+
+\def\pack_layers_set_right_positions
+ {\ifnum\p_pack_layers_column=\zerocount\else % can be < 0
+ \edef\p_pack_layers_column{\the\numexpr-\layerparameter\c!column+\layoutcolumns+\plusone\relax}% use counter instead ?
+ \fi
+ \ifdim\d_pack_layers_x_size>\zeropoint
+ \advance\d_pack_layers_x_position-\d_pack_layers_x_size
+ \d_pack_layers_x_position-\d_pack_layers_x_position
+ \d_pack_layers_x_offset-\d_pack_layers_x_offset
+ \fi}
+
+\def\pack_layers_set_middle_positions
+ {\ifdim\d_pack_layers_x_size>\zeropoint \advance\d_pack_layers_x_position.5\d_pack_layers_x_size \fi
+ \ifdim\d_pack_layers_y_size>\zeropoint \advance\d_pack_layers_y_position.5\d_pack_layers_y_size \fi}
+
+%D Given the task to be accomplished, the previous macro is not even that
+%D complicated. It mainly comes down to skipping to the right place and placing a
+%D box on top of or below the existing content. In the case of position tracking,
+%D another reference point is chosen.
+
+%D \macros
+%D {doifelselayerdata}
+
+\def\doifelselayerdata#1%
+ {\ifcsname\??layerbox#1\endcsname
+ %\ifvoid\csname\??layerbox#1\endcsname
+ \ifvoid\lastnamedcs
+ \doubleexpandafter\secondoftwoarguments
+ \else
+ \doubleexpandafter\firstoftwoarguments
+ \fi
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doiflayerdataelse\doifelselayerdata
+
+%D \macros
+%D {flushlayer}
+%D
+%D When we flush a layer, we flush both the main one and the page dependent one
+%D (when defined). This feature is more efficient in \ETEX\ since there testing for
+%D an undefined macro does not takes hash space.
+
+% todo: setups before flush, handy hook
+
+\unexpanded\def\flushlayer[#1]% quite core, so optimized (todo: check for void)
+ {\begingroup
+ \forgetall
+ \edef\currentlayer{#1}%
+ \edef\p_pack_layers_state{\layerparameter\c!state}%
+ \ifx\p_pack_layers_state\v!stop
+ % nothing
+ \orelse\ifx\p_pack_layers_state\v!next
+ \global\letlayerparameter\c!state\v!start % dangerous, stack-built-up
+ \orelse\ifx\p_pack_layers_state\v!continue
+ \global\letlayerparameter\c!state\v!repeat % dangerous, stack-built-up
+ \else
+ \edef\p_pack_layers_doublesided{\layerparameter\c!doublesided}%
+ \ifx\p_pack_layers_doublesided\v!yes
+ \ifcsname\??layerbox#1\endcsname
+ % we can make a dedicated one for this
+ \doifbothsidesoverruled
+ {\pack_layers_flush_double\v!left }%
+ {\pack_layers_flush_double\v!right}%
+ {\pack_layers_flush_double\v!left }%
+ \else
+ \pack_layers_flush_single
+ \fi
+ \else
+ \pack_layers_flush_single
+ \fi
+ \fi
+ \endgroup}
+
+% \def\pack_layers_flush_single
+% {\startoverlay
+% {\ifcsname\??layerbox \currentlayer \endcsname\pack_layers_flush_indeed\plusone \currentlayer \fi}%
+% {\ifcsname\??layerbox \currentlayer:\the\realpageno\endcsname\pack_layers_flush_indeed\zerocount{\currentlayer:\the\realpageno}\fi}%
+% \stopoverlay}
+%
+% \def\pack_layers_flush_double#1%
+% {\startoverlay
+% {\ifcsname\??layerbox \currentlayer \endcsname\pack_layers_flush_indeed\plusone \currentlayer \fi}%
+% {\ifcsname\??layerbox \currentlayer:\the\realpageno\endcsname\pack_layers_flush_indeed\zerocount {\currentlayer:\the\realpageno}\fi}%
+% {\ifcsname\??layerbox#1\currentlayer \endcsname\pack_layers_flush_indeed\plusone {#1\currentlayer }\fi}%
+% {\ifcsname\??layerbox#1\currentlayer:\the\realpageno\endcsname\pack_layers_flush_indeed\zerocount{#1\currentlayer:\the\realpageno}\fi}%
+% \stopoverlay}
+
+% optimized:
+
+\def\pack_layers_flush_single
+ {\ifcsname\??layerbox\currentlayer\endcsname
+ \ifvoid\lastnamedcs
+ \ifcsname\??layerbox\currentlayer:\the\realpageno\endcsname
+ \ifvoid\lastnamedcs\else
+ \chardef\b_layer_two\lastnamedcs
+ \pack_layers_flush_indeed\zerocount{\currentlayer:\the\realpageno}\b_layer_two
+ \fi
+ \fi
+ \else
+ \chardef\b_layer_one\lastnamedcs
+ \ifcsname\??layerbox\currentlayer:\the\realpageno\endcsname
+ \ifvoid\lastnamedcs\else
+ \chardef\b_layer_two\lastnamedcs
+ \startoverlay
+ {\pack_layers_flush_indeed\plusone \currentlayer \b_layer_one}%
+ {\pack_layers_flush_indeed\zerocount{\currentlayer:\the\realpageno}\b_layer_two}%
+ \stopoverlay
+ \fi
+ \else
+ \pack_layers_flush_indeed\plusone\currentlayer\b_layer_one
+ \fi
+ \fi
+ \orelse\ifcsname\??layerbox\currentlayer:\the\realpageno\endcsname
+ \ifvoid\lastnamedcs
+ % nothing
+ \else
+ \chardef\b_layer_two\lastnamedcs
+ \pack_layers_flush_indeed\zerocount{\currentlayer:\the\realpageno}\b_layer_two
+ \fi
+ \fi}
+
+% less optimized:
+
+\def\pack_layers_flush_double#1%
+ {\startoverlay
+ {\ifcsname\??layerbox\currentlayer\endcsname
+ \ifvoid\lastnamedcs\else \chardef\b_layer_two\lastnamedcs
+ \pack_layers_flush_indeed\plusone\currentlayer\b_layer_two
+ \fi
+ \fi}%
+ {\ifcsname\??layerbox\currentlayer:\the\realpageno\endcsname
+ \ifvoid\lastnamedcs\else \chardef\b_layer_two\lastnamedcs
+ \pack_layers_flush_indeed\zerocount{\currentlayer:\the\realpageno}\b_layer_two
+ \fi
+ \fi}%
+ {\ifcsname\??layerbox#1\currentlayer\endcsname
+ \ifvoid\lastnamedcs\else \chardef\b_layer_two\lastnamedcs
+ \pack_layers_flush_indeed\plusone{#1\currentlayer}\b_layer_two
+ \fi
+ \fi}%
+ {\ifcsname\??layerbox#1\currentlayer:\the\realpageno\endcsname
+ \ifvoid\lastnamedcs\else \chardef\b_layer_two\lastnamedcs
+ \pack_layers_flush_indeed\zerocount{#1\currentlayer:\the\realpageno}\b_layer_two
+ \fi
+ \fi}%
+ \stopoverlay}
+
+\let\pack_layers_top_fill \relax
+\let\pack_layers_bottom_fill\vss
+
+%def\pack_layers_flush_indeed#1#2%
+\def\pack_layers_flush_indeed#1#2#3%
+ {\begingroup % already grouped
+ \offinterlineskip
+ \edef\p_pack_layers_preset{\layerparameter\c!preset}%
+ \ifcsname\??layerpreset\p_pack_layers_preset\endcsname
+ \lastnamedcs
+ \fi
+ \edef\p_pack_layers_method{\layerparameter\c!method}%
+ \edef\p_pack_layers_option{\layerparameter\c!option}%
+ \ifx\p_pack_layers_option\v!test
+ \settrue\c_pack_layers_trace
+ \traceboxplacementtrue
+ \fi
+ \ifcase#1\relax
+ \setfalse\c_pack_layers_repeated
+ \else
+ \edef\p_pack_layers_position{\layerparameter\c!position}%
+ \ifx\p_pack_layers_position\v!yes
+ \setfalse\c_pack_layers_repeated
+ \else
+ \edef\p_pack_layers_repeat{\layerparameter\c!repeat}%
+ \ifx\p_pack_layers_repeat\v!yes
+ \settrue\c_pack_layers_repeated
+ \orelse\ifx\p_pack_layers_state\v!repeat
+ \settrue\c_pack_layers_repeated
+ \else
+ \setfalse\c_pack_layers_repeated
+ \fi
+ \fi
+ \fi
+ %chardef\b_layers\csname\??layerbox#2\endcsname % trick
+ \let\b_layers#3%
+ % we need to copy in order to retain the negative offsets for a next
+ % stage of additions, i.e. llx/lly accumulate in repeat mode and the
+ % compensation may differ each flush depending on added content
+ \setbox\nextbox
+ \ifx\p_pack_layers_method\v!fit
+ \pack_layers_positioned_box_yes
+ \else
+ \pack_layers_positioned_box_nop
+ \fi
+ % todo: method=offset => overlayoffset right/down (handy for backgrounds with offset)
+ \doifelseoverlay{#2}%
+ {\setlayoutcomponentattribute{\v!layer:#2}}%
+ \resetlayoutcomponentattribute
+ % we have conflicting demands: some mechanisms want ll anchoring .. I need to figure this out
+ % and maybe we will have 'origin=bottom' or so
+ \setbox\nextbox
+ \ifx\p_pack_layers_option\v!test \ruledvbox \else \vpack \fi \ifx\p_pack_layers_method\v!overlay to \d_overlay_height \fi \layoutcomponentboxattribute
+ {\pack_layers_top_fill
+%
+% \hpack \ifx\p_pack_layers_method\v!overlay to \d_overlay_width \fi
+% {\box\nextbox
+% \hss}%
+%
+ \ifx\p_pack_layers_method\v!overlay \wd\nextbox\d_overlay_width\fi
+ \box\nextbox
+%
+ \pack_layers_bottom_fill}%
+ % \edef\currentlayer{#2}% :\the\realpageno}% local .. check \anchor
+ % \edef\p_pack_layers_position{\layerparameter\c!position}% local
+ \ifx\p_pack_layers_position\v!yes
+ \edef\p_pack_layers_region{\layerparameter\c!region}%
+ \ifx\p_pack_layers_region\empty
+ \else
+ \anch_mark_tagged_box\nextbox\p_pack_layers_region % was \layeranchor
+ \fi
+ \fi
+ \box\nextbox
+ %
+ \ifconditional\c_pack_layers_repeated\else
+ \gsetboxllx\b_layers\zeropoint
+ \gsetboxlly\b_layers\zeropoint
+ \fi
+ \endgroup}
+
+\def\pack_layers_positioned_box_yes
+ {\vpack
+ {\vskip-\getboxlly\b_layers
+ \hskip-\getboxllx\b_layers
+ \hsize-\dimexpr\getboxllx\b_layers-\wd\b_layers\relax
+ \ifconditional\c_pack_layers_repeated\copy\else\box\fi\b_layers}}
+
+\def\pack_layers_positioned_box_nop
+ {\ifconditional\c_pack_layers_repeated\copy\else\box\fi\b_layers}
+
+% \definelayer[test][method=fit] \setupcolors[state=start,option=test]
+%
+% \framed[framecolor=red,offset=overlay]{\setlayer[test]{aa}\setlayer[test][x=10pt]{g}\flushlayer[test]}
+% \framed[framecolor=red,offset=overlay]{\setlayer[test]{aa}\setlayer[test][x=-10pt]{bb}\flushlayer[test]}
+% \framed[framecolor=red,offset=overlay]{\setlayer[test][x=-20pt]{cccccc}\flushlayer[test]}
+% \framed[framecolor=red,offset=overlay]{\setlayer[test]{dd}\setlayer[test][x=-20pt,y=-3pt]{eeeeee}\flushlayer[test]}
+
+%D \macros
+%D {composedlayer,placelayer,tightlayer}
+%D
+%D This is a handy shortcut, which saves a couple of braces when we use it as
+%D parameter. This name also suits better to other layering commands.
+
+\unexpanded\def\composedlayer#1{\flushlayer[#1]}
+
+\unexpanded\def\tightlayer[#1]%
+ {\hpack
+ {\def\currentlayer{#1}% todo: left/right
+ \setbox\nextbox\emptybox
+ \d_overlay_width \layerparameter\c!width
+ \d_overlay_height\layerparameter\c!height
+ \composedlayer{#1}}}
+
+\let\placelayer\flushlayer
+
+%D \macros
+%D {setMPlayer}
+%D
+%D The following layer macro uses the positions that are registered by \METAPOST.
+%D
+%D \starttyping
+%D \definelayer[test]
+%D
+%D \setMPlayer [test] [somepos-1] {Whatever we want here!}
+%D \setMPlayer [test] [somepos-2] {Whatever we need there!}
+%D \setMPlayer [test] [somepos-3] {\externalfigure[cow.mps][width=2cm]}
+%D
+%D \startuseMPgraphic{oeps}
+%D draw fullcircle scaled 10cm withcolor red ;
+%D register ("somepos-1",2cm,3cm,center currentpicture) ;
+%D register ("somepos-2",8cm,5cm,(-1cm,-2cm)) ;
+%D register ("somepos-3",0cm,0cm,(-2cm,2cm)) ;
+%D \stopuseMPgraphic
+%D
+%D \getMPlayer[test]{\useMPgraphic{oeps}}
+%D \stoptyping
+%D
+%D The last line is equivalent to
+%D
+%D \starttyping
+%D \framed
+%D [background={foreground,test},offset=overlay]
+%D {\useMPgraphic{oeps}}
+%D \stoptyping
+
+\unexpanded\def\setMPlayer
+ {\dotripleempty\pack_layers_set_MP}
+
+\def\MPlayerwidth {\hsize}
+\def\MPlayerheight{\vsize}
+
+\def\pack_layers_set_MP[#1][#2][#3]%
+ {\edef\MPlayerwidth {\MPw{#2}}%
+ \edef\MPlayerheight{\MPh{#2}}%
+ \setlayer[#1][\c!x=\MPx{#2},\c!y=\MPy{#2},\c!position=\v!no,#3]}
+
+\unexpanded\def\getMPlayer
+ {\dodoubleempty\pack_layers_get_MP}
+
+\def\pack_layers_get_MP[#1][#2]%
+ {\framed[\c!background={\v!foreground,#1},\c!frame=\v!off,\c!offset=\v!overlay,#2]} % takes argument
+
+%D Watch out, a redefinition:
+
+\ifdefined\settextpagecontent \else
+ \writestatus\m!system{error in page-lyr.tex} \wait
+\fi
+
+\definelayer
+ [OTRTEXT]
+
+\setuplayer
+ [OTRTEXT]
+ [\c!width=\innermakeupwidth,
+ \c!height=\textheight]
+
+\let\normalsettextpagecontent\settextpagecontent % will be overloaded in page-spr
+
+\unexpanded\def\settextpagecontent#1#2#3% #2 and #3 will disappear
+ {\doifelselayerdata{OTRTEXT}
+ {\setbox#1\hpack to \makeupwidth
+ {\startoverlay
+ {\tightlayer[OTRTEXT]} % first, otherwise problems with toc
+ {\normalsettextpagecontent{#1}{#2}{#3}\box#1}
+ \stopoverlay}%
+ \dp#1\zeropoint}%
+ {\normalsettextpagecontent{#1}{#2}{#3}}}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/pack-mrl.mkiv b/Master/texmf-dist/tex/context/base/mkiv/pack-mrl.mkiv
index 665d245b346..e5d19d3b3de 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/pack-mrl.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/pack-mrl.mkiv
@@ -145,14 +145,16 @@
\setvalue{\??blackruletype mp}%
{\frule
type {mp}%
- data {\includeMPgraphic{\directblackrulesparameter\c!mp}}}
+ data {\includeMPgraphic{\directblackrulesparameter\c!mp}}
+ line \dimexpr\directblackrulesparameter\c!rulethickness\relax
+ }
\letvalue{\??blackruletype\s!no }\novrule
%letvalue{\??blackruletype\s!yes}\vrule
-
\setupblackrules
[\c!n=3,
+ \c!rulethickness=\linewidth,
\c!alternative=\c!a,
\c!distance=.25\emwidth,
\c!color=]
@@ -279,7 +281,7 @@
\edef\p_background{\directthinrulesparameter\c!background}%
\edef\p_frame {\directthinrulesparameter\c!frame}%
\linewidth\dimexpr\directthinrulesparameter\c!rulethickness/\plustwo\relax
- \ifdim\linewidth=\zeropoint
+ \ifzeropt\linewidth
\c_pack_thinrules_type\zerocount
\else\ifx\p_frame\v!on
\c_pack_thinrules_type\expandnamespaceparameter\??thinrulealternatives\directthinrulesparameter\c!alternative\v!b\relax
@@ -642,7 +644,7 @@
\pack_textrule_correct_depth_yes
\pack_textrule_correct_depth_nop
\nointerlineskip
- \noindent\vpack % was \dontleavehmode
+ \noindent\naturalvpack % was \dontleavehmode
{\color[\directtextrulesparameter\c!rulecolor]
{\hrule
\s!depth \directtextrulesparameter\c!rulethickness
@@ -841,32 +843,32 @@
\unexpanded\def\fillinline
{\dosingleempty\pack_fillinline}
-\ifdefined\endpar % experiment with \endpar
-
- \def\pack_fillinline[#1]%
- {% \endpar % no, as it interferes with \definedescription cum suis
- \begingroup
- \setupcurrentfillinlines[#1]%
- \directfillinlinesparameter\c!before
- \begingroup
- \advance\rightskip \directfillinlinesparameter\c!margin\relax
- \parfillskip\zeropoint
- \pushmacro\endpar
- \def\endpar
- {\popmacro\endpar
- \ifhmode\unskip\hfill\fi
- \scratchwidth\dimexpr\directfillinlinesparameter\c!width-\directfillinlinesparameter\c!distance\relax
- \ifdim\scratchwidth>\directfillinlinesparameter\c!margin\else\expandafter\rlap\fi
- {\kern\directfillinlinesparameter\c!distance
- \scratchheight\dimexpr\directfillinlinesparameter\c!rulethickness/\plustwo\relax
- \color[\directfillinlinesparameter\c!color]{\vrule\s!width\scratchwidth\s!height\scratchheight\s!depth\scratchheight}}%
- \endpar
- \endgroup
- \endpar
- \directfillinlinesparameter\c!after
- \endgroup}} % carryover ?
-
-\else
+% \ifdefined\endpar % experiment with \endpar
+%
+% \def\pack_fillinline[#1]%
+% {% \endpar % no, as it interferes with \definedescription cum suis
+% \begingroup
+% \setupcurrentfillinlines[#1]%
+% \directfillinlinesparameter\c!before
+% \begingroup
+% \advance\rightskip \directfillinlinesparameter\c!margin\relax
+% \parfillskip\zeropoint
+% \pushmacro\endpar
+% \def\endpar
+% {\popmacro\endpar
+% \ifhmode\unskip\hfill\fi
+% \scratchwidth\dimexpr\directfillinlinesparameter\c!width-\directfillinlinesparameter\c!distance\relax
+% \ifdim\scratchwidth>\directfillinlinesparameter\c!margin\else\expandafter\rlap\fi
+% {\kern\directfillinlinesparameter\c!distance
+% \scratchheight\dimexpr\directfillinlinesparameter\c!rulethickness/\plustwo\relax
+% \color[\directfillinlinesparameter\c!color]{\vrule\s!width\scratchwidth\s!height\scratchheight\s!depth\scratchheight}}%
+% \endpar
+% \endgroup
+% \endpar
+% \directfillinlinesparameter\c!after
+% \endgroup}} % carryover ?
+%
+% \else
\def\pack_fillinline[#1]%
{%\endgraf % no, as it interferes with \definedescription cum suis
@@ -890,6 +892,6 @@
\directfillinlinesparameter\c!after
\endgroup}} % carryover ?
-\fi
+% \fi
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/pack-obj.mkiv b/Master/texmf-dist/tex/context/base/mkiv/pack-obj.mkiv
index d08c664944f..4b3b6c2f0fa 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/pack-obj.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/pack-obj.mkiv
@@ -20,24 +20,22 @@
%D \macros
%D {setobject,getobject,ifinobject}
%D
-%D Boxes can be considered reuable objects. Traditionally once passed
-%D to the \DVI\ file, such objects cannot be reused. In \PDF\ however,
-%D reusing is possible and sometimes even a necessity. Therefore,
-%D \CONTEXT\ supports reusable objects and \LUATEX\ has native support
-%D for so called box resources.
+%D Boxes can be considered reuable objects. Traditionally once passed to the \DVI\
+%D file, such objects cannot be reused. In \PDF\ however, reusing is possible and
+%D sometimes even a necessity. Therefore, \CONTEXT\ supports reusable objects and
+%D \LUATEX\ has native support for so called box resources.
%D
-%D The first application of objects in \CONTEXT\ concerned \METAPOST\
-%D graphics and fill||in form fields. Reusing resources can save lots
-%D of bytes and sometimes also runtime.
+%D The first application of objects in \CONTEXT\ concerned \METAPOST\ graphics and
+%D fill||in form fields. Reusing resources can save lots of bytes and sometimes also
+%D runtime.
%D
%D \starttyping
%D \setobject{class}{name}\somebox{}
%D \getobject{class}{name}
%D \stoptyping
%D
-%D Here \type {\somebox} can be whatever box specification suits \TEX.
-%D Although the implementation in \MKIV\ is somewhat different the
-%D principles have not changed.
+%D Here \type {\somebox} can be whatever box specification suits \TEX. Although the
+%D implementation in \MKIV\ is somewhat different the principles have not changed.
\installcorenamespace {objects}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/pack-ori.lua b/Master/texmf-dist/tex/context/base/mkiv/pack-ori.lua
new file mode 100644
index 00000000000..a786b19ef13
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/pack-ori.lua
@@ -0,0 +1,70 @@
+if not modules then modules = { } end modules ['pack-ori'] = {
+ version = 1.001,
+ comment = "companion to supp-box.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local context = context
+local implement = interfaces.implement
+local variables = interfaces.variables
+
+local settings_to_array = utilities.parsers.settings_to_array
+
+local orientation = {
+ [variables.up] = 0x000,
+ [variables.left] = 0x001,
+ [variables.down] = 0x002,
+ [variables.right] = 0x003,
+ [variables.top] = 0x004,
+ [variables.bottom] = 0x005,
+}
+local vertical = {
+ [variables.line] = 0x000,
+ [variables.top] = 0x010,
+ [variables.bottom] = 0x020,
+ [variables.middle] = 0x030,
+}
+local horizontal = {
+ [variables.middle] = 0x000,
+ [variables.flushleft] = 0x100,
+ [variables.flushright] = 0x200,
+ [variables.left] = 0x300,
+ [variables.right] = 0x400,
+}
+
+implement {
+ name = "toorientation",
+ public = true,
+ arguments = {
+ {
+ { "horizontal", "string" },
+ { "vertical", "string" },
+ { "orientation", "string" },
+ }
+ },
+ actions = function(t)
+ local n = 0
+ local m = t.horizontal if m then n = n | (horizontal [m] or 0) end
+ local m = t.vertical if m then n = n | (vertical [m] or 0) end
+ local m = t.orientation if m then n = n | (orientation[m] or 0) end
+ -- logs.report("orientation","0x%03X : %s",n,table.sequenced(t))
+ context(n)
+ end,
+}
+
+implement {
+ name = "stringtoorientation",
+ public = true,
+ arguments = "string",
+ actions = function(s)
+ local n = 0
+ local t = settings_to_array(s)
+ local m = t[1] if m then n = n | (horizontal [m] or 0) end
+ local m = t[2] if m then n = n | (vertical [m] or 0) end
+ local m = t[3] if m then n = n | (orientation[m] or 0) end
+ -- logs.report("orientation","0x%03X : %s",n,s)
+ context(n)
+ end,
+}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/pack-ori.mkxl b/Master/texmf-dist/tex/context/base/mkiv/pack-ori.mkxl
new file mode 100644
index 00000000000..061768f94f9
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/pack-ori.mkxl
@@ -0,0 +1,88 @@
+%D \module
+%D [ file=pack-ori, % was experimental
+%D version=2019.07.30,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Anchoring,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Anchoring}
+
+\registerctxluafile{pack-ori}{}
+
+\unprotect
+
+%D Possible options are:
+%D
+%D \starttabulate[|T|T|]
+%D \NC orientation \NC up left down right top bottom
+%D \NC vertical \NC line top bottom middle
+%D \NC horizontal \NC middle flushleft flushright left right
+%D \stoptabulate
+
+\installcorenamespace{orientation}
+\installcorenamespace{orientations}
+
+\installcommandhandler \??orientation {orientation} \??orientation
+
+\setuporientation
+ [\c!orientation=\v!normal,
+ \c!horizontal=\v!normal,
+ \c!vertical=\v!normal]
+
+\appendtoks
+ \expandafter\chardef\csname\??orientations\currentorientation\endcsname\toorientation
+ orientation {\orientationparameter\c!orientation}
+ horizontal {\orientationparameter\c!horizontal}
+ vertical {\orientationparameter\c!vertical}
+ \relax\relax
+\to \everydefineorientation
+
+\defineorientation[\v!normal]
+
+\defineorientation[\v!up] [\c!orientation=\v!up]
+\defineorientation[\v!down] [\c!orientation=\v!down]
+\defineorientation[\v!left] [\c!orientation=\v!left]
+\defineorientation[\v!right] [\c!orientation=\v!right]
+\defineorientation[\v!top] [\c!orientation=\v!top]
+\defineorientation[\v!bottom][\c!orientation=\v!bottom]
+
+%D There will be some more helpers here.
+
+\def\theorientation#1%
+ {\numexpr
+ \ifcsname\??orientations#1\endcsname
+ \lastnamedcs
+ \else
+ \zerocount
+ \fi
+ \relax}
+
+\def\autoorientation#1%
+ {\numexpr
+ \ifcsname\??orientations#1\endcsname
+ \lastnamedcs
+ \else
+ \auto_orientation{#1}%
+ \fi
+ \relax}
+
+\def\auto_orientation#1%
+ {\immediateassignment\global\expandafter\chardef\csname\??orientations#1\endcsname\stringtoorientation{#1}%
+ \csname\??orientations#1\endcsname}
+
+\unexpanded\def\doifelseorientation#1%
+ {\ifcsname\??orientations#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+% \def\iforientationcsname#1{\ifcsname\??orientations}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/pack-rul.lua b/Master/texmf-dist/tex/context/base/mkiv/pack-rul.lua
index 455d0bff832..ef8d8136f48 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/pack-rul.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/pack-rul.lua
@@ -123,6 +123,8 @@ local function doreshapeframedbox(n)
for h, id, subtype, list in nextlist, list do
if list and id == hlist_code then
if subtype == boxlist_code or subtype == linelist_code then
+ -- getdirection is irrelevant here so it will go
+ -- somehow a parfillskip also can get influenced
local p = hpack(list,maxwidth,'exactly',getdirection(h)) -- multiple return value
local set, order, sign = getboxglue(p)
setboxglue(h,set,order,sign)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/pack-rul.mkiv b/Master/texmf-dist/tex/context/base/mkiv/pack-rul.mkiv
index 3d03942aab2..8732c7e6b7c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/pack-rul.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/pack-rul.mkiv
@@ -43,24 +43,6 @@
\def\pack_framed_setup_line_width[#1]%
{\assigndimension{#1}\linewidth{.2\points}{.4\points}{.6\points}}
-% %D \macros
-% %D {setupscreens}
-% %D
-% %D Sort of obsolete:
-% %D
-% %D \showsetup{setupscreens}
-%
-% \installcorenamespace{screens}
-%
-% \installsetuponlycommandhandler \??screens {screens}
-%
-% \appendtoks
-% \edef\defaultbackgroundscreen{\directscreensparameter\c!screen}
-% \to \everysetupscreens
-%
-% \setupscreens
-% [\c!screen=.90] % was .95 but that's hardly visible
-
%D The parameter handler:
\installcorenamespace{framed}
@@ -105,6 +87,7 @@
\unexpanded\def\doinstallinheritedframed#1#2#3#4#5#6#7#8#9%
{\def#5##1##2{\ifx##1\relax#6{##2}\else#4{##1}{##2}\fi}%
%\def#6##1{\ifcsname\??framed:##1\endcsname\??framed:##1\else\s!empty\fi}% root
+ %\def#6##1{\ifcsname\??framed:##1\endcsname\??framed:##1\else\??empty\fi}% root
\def#6##1{\ifcsname\??framed:##1\endcsname\??framed:##1\else\??empty\fi}% root
\unexpanded\def#8%
{\bgroup
@@ -272,10 +255,15 @@
\fi}
\def\pack_framed_filled_box_round
- {\back_ovalbox
- \d_framed_target_wd \d_framed_target_ht \d_framed_target_dp
- \d_framed_linewidth \p_framed_backgroundradius
- \zerocount \plusone {\ifx\p_framed_backgroundcorner\v!round0\else\number\p_framed_backgroundcorner\fi}}
+ {\raise\d_framed_target_dp\hpack{\frule
+ type fill
+ width \d_framed_target_wd
+ height \d_framed_target_ht
+ depth \d_framed_target_dp
+ line \d_framed_linewidth
+ radius \p_framed_backgroundradius\space
+ corner {\p_framed_backgroundcorner}
+ \relax}}
\def\pack_framed_stroked_box
{\edef\p_framed_framecorner{\framedparameter\c!framecorner}%
@@ -296,10 +284,14 @@
% \pack_framed_stroked_box_normal % later
\def\pack_framed_stroked_box_round
- {\back_ovalbox
- \d_framed_target_wd \d_framed_target_ht \d_framed_target_dp
- \d_framed_linewidth \p_framed_frameradius
- \plusone \zerocount {\ifx\p_framed_framecorner\v!round0\else\number\p_framed_framecorner\fi}}
+ {\raise\d_framed_target_dp\hpack{\frule
+ width \d_framed_target_wd
+ height \d_framed_target_ht
+ depth \d_framed_target_dp
+ line \d_framed_linewidth
+ radius \p_framed_frameradius\space
+ corner {\p_framed_framecorner}
+ \relax}}
% a lot of weird corners
%
@@ -347,18 +339,6 @@
% \quad}
% \stopTEXpage
-%D The oval box is drawn using a special macro, depending on
-%D the driver in use.
-
-% \def\pack_framed_background_box_gray % avoid black rules when no gray
-% {\edef\p_framed_backgroundscreen{\framedparameter\c!backgroundscreen}%
-% \ifx\p_framed_backgroundscreen\empty \else
-% \pack_framed_background_box_gray_indeed
-% \fi}
-%
-% \def\pack_framed_background_box_gray_indeed % can be more direct but who cares, just compatibility
-% {\colored[s=\p_framed_backgroundscreen]{\pack_framed_filled_box}}
-
%D It won't be a surprise that we not only provide gray boxes, but also colored
%D ones. Here it is:
@@ -568,21 +548,6 @@
\box\b_framed_extra
\egroup}
-% \def\pack_framed_process_background_indeed_external#1%
-% {\pack_framed_overlay_initialize
-% \bgroup
-% \setbox\b_framed_extra\hpack\bgroup
-% \ifzeropt\framedbackgroundoffset\else
-% \kern-\framedbackgroundoffset
-% \fi
-% \hbox\bgroup#1\egroup
-% \egroup
-% \wd\b_framed_extra\zeropoint
-% \ht\b_framed_extra\framedbackgroundheight
-% \dp\b_framed_extra\framedbackgrounddepth
-% \box\b_framed_extra
-% \egroup}
-
\def\pack_framed_process_background_indeed_external
{\pack_framed_overlay_initialize
\pack_framed_process_background_indeed_internal}
@@ -610,13 +575,6 @@
\edef\m_overlay_region{\reservedautoregiontag}%
\fi}
-% \def\pack_framed_add_region % experiment
-% {\ifx\m_overlay_region\v!yes
-% \anch_mark_region_box\b_framed_normal
-% \else
-% \anch_mark_tagged_box\b_framed_normal\m_overlay_region
-% \fi}
-
\def\pack_framed_add_region % experiment
{\anch_mark_tagged_box\b_framed_normal\m_overlay_region}
@@ -645,18 +603,6 @@
\hss
\egroup}}
-% \def\pack_framed_overlay_initialize_indeed
-% {\edef\overlaywidth {\the\d_framed_target_wd\space}%
-% \edef\overlayheight {\the\dimexpr\d_framed_target_ht+\d_framed_target_dp\relax\space}%
-% \edef\overlaydepth {\the\d_framed_target_dp\space}%
-% \edef\overlaycolor {\framedparameter\c!backgroundcolor}% let ?
-% \edef\overlaylinecolor{\framedparameter\c!framecolor}% only needed for layers
-% \edef\overlaylinewidth{\the\d_framed_linewidth\space}%
-% %\edef\overlaycorner {\framedparameter\c!backgroundcorner}%
-% %\edef\overlayradius {\framedparameter\c!backgroundradius}%
-% \edef\overlayoffset {\the\framedbackgroundoffset\space}% \backgroundoffset % we steal this one
-% \let\pack_framed_overlay_initialize\relax}
-
\def\pack_framed_overlay_initialize_indeed
{\d_overlay_width \d_framed_target_wd
\d_overlay_height \dimexpr\d_framed_target_ht+\d_framed_target_dp\relax
@@ -710,27 +656,6 @@
\box\b_framed_normal
\box\b_framed_extra}}
-% \def\pack_framed_stroked_box_normal
-% {\setbox\scratchbox\emptyhbox
-% \wd\scratchbox\d_framed_target_wd
-% \ht\scratchbox\d_framed_target_ht
-% \dp\scratchbox\d_framed_target_dp
-% \setbox\scratchbox\vpack \bgroup
-% \csname \??framedtop\p_framed_frame\framedparameter\c!topframe \endcsname
-% \nointerlineskip % new (needed for fences)
-% \hbox \bgroup
-% \csname \??framedleft\p_framed_frame\framedparameter\c!leftframe \endcsname
-% \box\scratchbox
-% \csname \??framedright\p_framed_frame\framedparameter\c!rightframe \endcsname
-% \egroup
-% \nointerlineskip % new (needed for fences)
-% \csname \??framedbottom\p_framed_frame\framedparameter\c!bottomframe\endcsname
-% \egroup
-% \wd\scratchbox\d_framed_target_wd
-% \ht\scratchbox\d_framed_target_ht
-% \dp\scratchbox\d_framed_target_dp
-% \box\scratchbox}
-
\def\pack_framed_stroked_box_normal_opened
{\setbox\scratchbox\vpack \bgroup
\csname\??framedtop\p_framed_frame\framedparameter\c!topframe\endcsname
@@ -876,35 +801,6 @@
\newcount\c_pack_framed_nesting
-% to be tested (slightly more efficient):
-%
-% \unexpanded\def\pack_frame_common % #1 #2
-% {\bgroup
-% \advance\c_pack_framed_nesting\plusone
-% \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed
-% \edef\currentframed{>\the\c_pack_framed_nesting}%
-% \pack_framed_initialize
-% \bgroup
-% \doifnextoptionalcselse} % #1 #2
-%
-% \unexpanded\def\framed {\pack_frame_common\pack_framed_process_framed_pickup\pack_framed_process_indeed}
-% \unexpanded\def\startframed{\pack_frame_common\pack_framed_start_framed_pickup \pack_framed_start_indeed }
-%
-% \def\pack_framed_process_framed_pickup[#1]%
-% {\setupcurrentframed[#1]%
-% \pack_framed_process_indeed}
-%
-% \def\pack_framed_start_framed_pickup[#1]%
-% {\setupcurrentframed[#1]% here !
-% \secondargumenttrue % dirty trick
-% \pack_framed_start_framed_indeed}
-%
-% \def\pack_framed_start_framed_indeed
-% {\pack_framed_process_indeed
-% \bgroup}
-%
-% no longer .. we also accept \startframed[tag]
-
\unexpanded\def\pack_framed_process_framed[#1]%
{\bgroup
\iffirstargument % faster
@@ -920,24 +816,6 @@
\pack_framed_initialize
\dosingleempty\pack_framed_process_framed}
-% \unexpanded\def\startframed
-% {\dosingleempty\pack_framed_start_framed}
-%
-% \def\pack_framed_start_framed[#1]%
-% {\bgroup
-% \advance\c_pack_framed_nesting\plusone
-% \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed
-% \edef\currentframed{>\the\c_pack_framed_nesting}%
-% \pack_framed_initialize
-% \bgroup
-% \iffirstargument
-% \secondargumenttrue % dirty trick
-% \setupcurrentframed[#1]% here !
-% \fi
-% \pack_framed_process_indeed
-% \bgroup
-% \ignorespaces}
-
\unexpanded\def\startframed
{\dosingleempty\pack_framed_start_framed}
@@ -1723,8 +1601,8 @@
{\setvalue{\??framedlocatorbefore#1}{#2}%
\setvalue{\??framedlocatorafter #1}{#3}}
-\def\pack_framed_locator_before#1{\csname\??framedlocatorbefore#1\endcsname}
-\def\pack_framed_locator_after #1{\csname\??framedlocatorafter #1\endcsname}
+\def\pack_framed_locator_before#1{\begincsname\??framedlocatorbefore#1\endcsname}
+\def\pack_framed_locator_after #1{\begincsname\??framedlocatorafter #1\endcsname}
\newdimen\d_framed_locator_ht
\newdimen\d_framed_locator_dp
@@ -1827,14 +1705,14 @@
\setbox\b_framed_normal\hpack{\lower\d_framed_locator_dp\box\b_framed_normal}%
\ht\b_framed_normal\strutht
\dp\b_framed_normal\strutdp
- \hpack{\box\b_framed_normal}} % why pack
+ \hpack{\box\b_framed_normal}} % why do we pack .. dange of loosing?
\installframedlocator \v!line
{}
{\setbox\b_framed_normal\hpack{\lower.5\ht\b_framed_normal\box\b_framed_normal}%
\ht\b_framed_normal.5\lineheight
\dp\b_framed_normal.5\lineheight
- \hpack{\box\b_framed_normal}}
+ \hpack{\box\b_framed_normal}} % why do we pack .. dange of loosing?
\installframedlocator \v!low
{}
@@ -1850,7 +1728,7 @@
\setbox\b_framed_normal\hpack{\lower\d_framed_locator_dp\box\b_framed_normal}%
\ht\b_framed_normal\d_framed_locator_ht
\dp\b_framed_normal\d_framed_locator_dp
- \hpack{\box\b_framed_normal}}
+ \hpack{\box\b_framed_normal}} % why do we pack .. dange of loosing?
\installframedlocator \v!middle
{}
@@ -1858,7 +1736,7 @@
\setbox\b_framed_normal\hpack{\lower\scratchdimen\box\b_framed_normal}%
\ht\b_framed_normal\scratchdimen
\dp\b_framed_normal\scratchdimen
- \hpack{\box\b_framed_normal}}
+ \hpack{\box\b_framed_normal}} % why do we pack .. dange of loosing?
\installframedlocator \v!lohi % maybe also \v!center
{\pack_framed_locator_before\v!middle}
@@ -1870,7 +1748,7 @@
\setbox\b_framed_normal\hpack{\lower\d_framed_locator_ht\box\b_framed_normal}%
\ht\b_framed_normal\d_framed_locator_dp
\dp\b_framed_normal\d_framed_locator_ht
- \hpack{\box\b_framed_normal}}
+ \hpack{\box\b_framed_normal}} % why do we pack .. dange of loosing?
\installframedlocator \v!keep % retains height/depth
{\pack_framed_remove_depth}
@@ -1884,7 +1762,7 @@
\setbox\b_framed_normal\hpack{\lower\d_framed_locator_dp\box\b_framed_normal}%
\ht\b_framed_normal\d_framed_locator_ht
\dp\b_framed_normal\d_framed_locator_dp
- \hpack{\box\b_framed_normal}}
+ \hpack{\box\b_framed_normal}} % why do we pack .. dange of loosing?
% also used in fastlocalframed
@@ -1919,30 +1797,6 @@
% \framed[width=12cm,height=3cm,orientation=-180]{\input ward\relax}
% \framed[width=12cm,height=3cm,orientation=-270]{\input ward\relax}
-% \def\pack_framed_start_orientation
-% {\ifcase\p_framed_orientation
-% \let\pack_framed_stop_orientation\relax
-% \else
-% \scratchcounter\p_framed_orientation % weird .. why
-% \divide\scratchcounter\plustwo
-% \ifodd\scratchcounter
-% \let\pack_framed_stop_orientation\pack_framed_stop_orientation_odd
-% \else
-% \let\pack_framed_stop_orientation\pack_framed_stop_orientation_even
-% \fi
-% \fi}
-%
-% \def\pack_framed_stop_orientation_odd
-% {\swapmacros\framedwidth\framedheight
-% \swapmacros\localwidth\localheight
-% \swapdimens\d_framed_height\d_framed_width
-% \pack_framed_stop_orientation_even}
-%
-% \def\pack_framed_stop_orientation_even
-% {\setbox\b_framed_normal\hbox{\dorotatebox\p_framed_orientation\hbox{\box\b_framed_normal}}%
-% \d_framed_height\ht\b_framed_normal
-% \d_framed_width \wd\b_framed_normal}
-
\def\pack_framed_start_orientation
{\ifcase\p_framed_orientation
\let\pack_framed_stop_orientation\relax
@@ -2033,15 +1887,6 @@
\edef\currentmathframed{#1}%
\dosingleempty\pack_framed_mathframed_indeed}
-% \def\pack_framed_mathframed_indeed[#1]#2% no fancy nesting supported here
-% {\iffirstargument
-% \setupcurrentmathframed[#1]%
-% \fi
-% \c_framed_mstyle\mathstyle
-% \doifnot{\mathframedparameter\c!location}\v!low{\let\normalstrut\pack_framed_math_strut}%
-% \inheritedmathframedframed{\Ustartmath\triggermathstyle\c_framed_mstyle#2\Ustopmath}%
-% \endgroup}
-
\newcount\c_pack_framed_mathframed
\newtoks \t_pack_framed_mathframed
diff --git a/Master/texmf-dist/tex/context/base/mkiv/pack-rul.mkxl b/Master/texmf-dist/tex/context/base/mkiv/pack-rul.mkxl
new file mode 100644
index 00000000000..8fd23fbb1b7
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/pack-rul.mkxl
@@ -0,0 +1,3089 @@
+%D \module
+%D [ file=pack-rul, % was core-rul,
+%D version=1998.10.16,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Ruled Content,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Ruled Content}
+
+%D The code here is expanded lots of time as framed is used in many places. This is
+%D why the code here is (and gets) optimized as much as possible. Also, by avoiding
+%D packaging and expansion we also keep tracing reasonable. For instance, multiple
+%D stacked backgrounds can slow down a run if not optimized this way.
+
+\registerctxluafile{pack-rul}{optimize}
+
+\unprotect
+
+% \definesystemvariable {ol} % OmLijnd -> check scrn-fld too
+
+%D \macros
+%D {linewidth, setuplinewidth}
+%D
+%D This module deals with rules (lines) in several ways. First we introduce two
+%D macros that can be used to set some common characteristics.
+%D
+%D \showsetup{setuplinewidth}
+%D
+%D The linewidth is available in \type{\linewidth}. The preset value of .4pt equals
+%D the default hard coded \TEX\ rule width.
+
+\newdimen\linewidth
+
+\unexpanded\def\setuplinewidth
+ {\dosingleargument\pack_framed_setup_line_width}
+
+\def\pack_framed_setup_line_width[#1]%
+ {\assigndimension{#1}\linewidth{.2\points}{.4\points}{.6\points}}
+
+%D The parameter handler:
+
+\installcorenamespace{framed}
+\installcorenamespace{framedtop}
+\installcorenamespace{framedbottom}
+\installcorenamespace{framedleft}
+\installcorenamespace{framedright}
+
+\installcorenamespace{regularframed}
+\installcorenamespace{simplifiedframed}
+
+\installcommandhandler \??framed {framed} \??framed
+
+\let\pack_framed_framedparameter \framedparameter
+\let\pack_framed_framedparameterhash\framedparameterhash
+\let\pack_framed_setupcurrentframed \setupcurrentframed
+
+\def\pack_framed_initialize
+ {\let\framedparameter \pack_framed_framedparameter
+ \let\framedparameterhash\pack_framed_framedparameterhash
+ \let\setupcurrentframed \pack_framed_setupcurrentframed
+ \inframedtrue}
+
+%D A helper:
+
+\def\frameddimension#1{\the\dimexpr\framedparameter{#1}\relax}
+
+%D Inheritance:
+
+\def\installinheritedframed#1%
+ {\normalexpanded{\doinstallinheritedframed
+ \expandafter\noexpand\csname current#1\endcsname
+ \expandafter\noexpand\csname #1parameter\endcsname
+ \expandafter\noexpand\csname #1parameterhash\endcsname
+ \expandafter\noexpand\csname do#1parameter\endcsname
+ \expandafter\noexpand\csname do#1parentparameter\endcsname
+ \expandafter\noexpand\csname do#1rootparameter\endcsname
+ \expandafter\noexpand\csname setupcurrent#1\endcsname
+ \expandafter\noexpand\csname inherited#1framed\endcsname
+ \expandafter\noexpand\csname inherited#1framedbox\endcsname}} % new
+
+\unexpanded\def\doinstallinheritedframed#1#2#3#4#5#6#7#8#9%
+ {\def#5##1##2{\ifx##1\relax#6{##2}\else#4{##1}{##2}\fi}%
+ %\def#6##1{\ifcsname\??framed:##1\endcsname\??framed:##1\else\s!empty\fi}% root
+ \def#6##1{\ifcsname\??framed:##1\endcsname\??framed:##1\else\??empty\fi}% root
+ \unexpanded\def#8%
+ {\bgroup
+ \bgroup
+ \inframedtrue
+ \let\currentframed #1%
+ \let\framedparameter #2%
+ \let\framedparameterhash#3%
+ \let\setupcurrentframed #7%
+ \pack_framed_process_indeed}%
+ \unexpanded\def#9%
+ {\bgroup
+ \inframedtrue
+ \let\currentframed #1%
+ \let\framedparameter #2%
+ \let\framedparameterhash#3%
+ \let\setupcurrentframed #7%
+ \pack_framed_process_box_indeed}}
+
+\unexpanded\def\installframedcommandhandler#1#2#3%
+ {\installcommandhandler{#1}{#2}{#3}%
+ \installinheritedframed{#2}}
+
+\unexpanded\def\installframedautocommandhandler#1#2#3%
+ {\installautocommandhandler{#1}{#2}{#3}%
+ \installinheritedframed{#2}}
+
+\unexpanded\def\installsimpleframedcommandhandler#1#2#3%
+ {\installsimplecommandhandler{#1}{#2}{#3}%
+ \installinheritedframed{#2}}
+
+% for regular framed
+
+\setupframed
+ [\c!width=\v!fit,
+ \c!height=\v!broad,
+ %\c!minheight=\zeropoint,
+ %\c!lines=,
+ \c!offset=.25\exheight, % \defaultframeoffset
+ \c!empty=\v!no,
+ \c!frame=\v!on,
+ %\c!topframe=,
+ %\c!bottomframe=,
+ %\c!leftframe=,
+ %\c!rightframe=,
+ \c!radius=.5\bodyfontsize,
+ \c!rulethickness=\linewidth,
+ \c!corner=\v!rectangular,
+ \c!depth=\zeropoint,
+ %\c!foregroundcolor=,
+ %\c!foregroundstyle=,
+ %\c!background=,
+ %\c!backgroundcolor=,
+ \c!backgroundoffset=\zeropoint,
+ %\c!framecolor=,
+ \c!frameoffset=\zeropoint,
+ \c!backgroundcorner=\framedparameter\c!corner, % use \p_ here
+ \c!backgroundradius=\framedparameter\c!radius,
+ \c!backgrounddepth=\framedparameter\c!depth,
+ \c!framecorner=\framedparameter\c!corner,
+ \c!frameradius=\framedparameter\c!radius,
+ \c!framedepth=\framedparameter\c!depth,
+ %\c!component=,
+ %\c!region=,
+ %\c!align=,
+ \c!bottom=\vss,
+ %\c!top=,
+ \c!strut=\v!yes,
+ \c!autostrut=\v!yes,
+ \c!location=\v!normal,
+ %\c!orientation=,
+ %\c!anchoring=,
+ \c!autowidth=\v!yes,
+ %\c!setups=,
+ \c!loffset=\zeropoint,
+ \c!roffset=\zeropoint,
+ \c!toffset=\zeropoint,
+ \c!boffset=\zeropoint]
+
+%D For backgrounds and such:
+
+\defineframed
+ [\??simplifiedframed]
+ [\c!frame=\v!off,
+ \c!depth=\zeropoint,
+ \c!offset=\v!overlay,
+ \c!component=,
+ \c!region=,
+ \c!radius=.5\bodyfontsize,
+ \c!rulethickness=\linewidth,
+ \c!corner=\v!rectangular,
+ \c!backgroundoffset=\zeropoint,
+ \c!frameoffset=\zeropoint,
+ \c!backgroundcorner=\framedparameter\c!corner, % use \p_ here
+ \c!backgroundradius=\framedparameter\c!radius,
+ \c!backgrounddepth=\framedparameter\c!depth,
+ \c!framecorner=\framedparameter\c!corner,
+ \c!frameradius=\framedparameter\c!radius,
+ \c!framedepth=\framedparameter\c!depth,
+ \c!location=\v!normal,
+ \c!loffset=\zeropoint,
+ \c!roffset=\zeropoint,
+ \c!toffset=\zeropoint,
+ \c!boffset=\zeropoint]
+
+\unexpanded\def\definesimplifiedframed[#1]% no settings
+ {\defineframed[#1][\??simplifiedframed]%
+ \expandafter\let\csname#1\endcsname\undefined}
+
+\expandafter\let\csname\??simplifiedframed\endcsname\undefined
+
+%D We will communicate through module specific variables, current framed
+%D parameters and some reserved dimension registers.
+
+\newdimen\d_framed_target_wd
+\newdimen\d_framed_target_ht
+\newdimen\d_framed_target_dp
+\newdimen\d_framed_linewidth \let\ruledlinewidth\d_framed_linewidth % needed at lua end
+
+\let\p_framed_frame \empty % \framedparameter\c!frame
+\let\p_framed_backgroundoffset\empty
+\let\p_framed_foregroundstyle \empty
+\let\p_framed_autostrut \empty
+\let\p_framed_location \empty
+\let\p_framed_orientation \empty
+\let\p_framed_anchoring \empty
+\let\p_framed_autowidth \empty
+\let\p_framed_franalyze \empty
+\let\p_framed_backgroundcorner\empty
+\let\p_framed_backgroundradius\empty
+\let\p_framed_framecorner \empty
+\let\p_framed_frameradius \empty
+\let\p_framed_lines \empty
+\let\p_framed_empty \empty
+\let\p_framed_backgroundcolor \empty
+\let\p_framed_framecolor \empty
+\let\p_framed_component \empty
+\let\p_framed_background \empty
+\let\p_framed_rulethickness \empty
+\let\p_framed_foregroundcolor \empty
+\let\p_framed_setups \empty
+
+%D We don't have to stick to a \TEX\ drawn rule, but also can use rounded
+%D or even fancier shapes, as we will see later on.
+
+\def\pack_framed_filled_box
+ {\edef\p_framed_backgroundcorner{\framedparameter\c!backgroundcorner}%
+ \ifx\p_framed_backgroundcorner\v!rectangular
+ \pack_framed_filled_box_normal
+ \else
+ \pack_framed_filled_box_radius
+ \fi}
+
+\def\pack_framed_filled_box_normal
+ {\vrule
+ \s!width \d_framed_target_wd
+ \s!height\d_framed_target_ht
+ \s!depth \d_framed_target_dp
+ \relax}
+
+\def\pack_framed_filled_box_radius
+ {\edef\p_framed_backgroundradius{\framedparameter\c!backgroundradius}%
+ \ifzeropt\dimexpr\p_framed_backgroundradius\relax % just in case of .x\bodyfontsize
+ \pack_framed_filled_box_normal
+ \else
+ \pack_framed_filled_box_round
+ \fi}
+
+\def\pack_framed_filled_box_round
+ {\raise\d_framed_target_dp\hpack{\frule
+ type fill
+ width \d_framed_target_wd
+ height \d_framed_target_ht
+ depth \d_framed_target_dp
+ line \d_framed_linewidth
+ radius \p_framed_backgroundradius\space
+ corner {\p_framed_backgroundcorner}
+ \relax}}
+
+\def\pack_framed_stroked_box
+ {\edef\p_framed_framecorner{\framedparameter\c!framecorner}%
+ \ifx\p_framed_framecorner\v!rectangular
+ \pack_framed_stroked_box_normal
+ \else
+ \pack_framed_stroked_box_radius
+ \fi}
+
+\def\pack_framed_stroked_box_radius
+ {\edef\p_framed_frameradius{\framedparameter\c!frameradius}%
+ \ifzeropt\dimexpr\p_framed_frameradius\relax % just in case of .x\bodyfontsize
+ \pack_framed_stroked_box_normal
+ \orelse\ifx\p_framed_frame\v!on
+ \pack_framed_stroked_box_round
+ \fi}
+
+% \pack_framed_stroked_box_normal % later
+
+\def\pack_framed_stroked_box_round
+ {\raise\d_framed_target_dp\hpack{\frule
+ width \d_framed_target_wd
+ height \d_framed_target_ht
+ depth \d_framed_target_dp
+ line \d_framed_linewidth
+ radius \p_framed_frameradius\space
+ corner {\p_framed_framecorner}
+ \relax}}
+
+% a lot of weird corners
+%
+% \startTEXpage
+% \dontleavehmode\framed
+% [corner=0,frame=on,framecolor=green,
+% background=color,backgroundcolor=yellow]{\tttf TEST \twodigits\recurselevel}%
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {1} {4}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green,
+% background=color,backgroundcolor=yellow]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {5} {8}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green,
+% background=color,backgroundcolor=yellow]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {1} {4}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {5} {8}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {9}{12}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse{13}{16}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse{17}{20}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse{21}{24}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse{25}{28}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \stopTEXpage
+
+%D It won't be a surprise that we not only provide gray boxes, but also colored
+%D ones. Here it is:
+
+\def\pack_framed_background_box_color
+ {\edef\p_framed_backgroundcolor{\framedparameter\c!backgroundcolor}%
+ \ifx\p_framed_backgroundcolor\empty \else
+ \doifcolor\p_framed_backgroundcolor\pack_framed_background_box_color_indeed
+ \fi}
+
+\def\pack_framed_background_box_color_indeed
+ {\hpack{\dousecolorparameter\p_framed_backgroundcolor\pack_framed_filled_box}}
+
+%D \macros
+%D {defineoverlay, doifoverlayelse, overlayoffset,
+%D overlaywidth, overlayheight, overlaydepth,
+%D overlaycolor, overlaylinecolor, overlaylinewidth}
+%D
+%D Before we define the macro that actually takes card of the backgrounds, we
+%D introduce overlays. An overlay is something that contrary to its name lays {\em
+%D under} the text. An example of an overlay definition is:
+%D
+%D \startbuffer[tmp-1]
+%D \defineoverlay
+%D [fancy]
+%D [{\externalfigure
+%D [mp-cont.502]
+%D [width=\overlaywidth,
+%D height=\overlayheight]}]
+%D \stopbuffer
+%D
+%D \typebuffer[tmp-1]
+%D
+%D That for instance can be uses in:
+%D
+%D \startbuffer[tmp-2]
+%D \framed[backgroundachtergrond=fancy]{How Fancy!}
+%D \framed[backgroundachtergrond=fancy,frame=off]{Even More Fancy!}
+%D \stopbuffer
+%D
+%D and looks like:
+%D
+%D \startlinecorrection
+%D \vbox{\baselineskip24pt\getbuffer[tmp-1]\getbuffer[tmp-2]}
+%D \stoplinecorrection
+%D
+%D The formal definition is:
+%D
+%D \showsetup{defineoverlay}
+%D
+%D This macro's definition is a bit obscure, due the many non||used arguments and
+%D the two step call that enable the setting of the width, height and depth
+%D variables. Multiple backgrounds are possible and are specified as:
+%D
+%D \starttyping
+%D \framed[background={one,two,three}]{Three backgrounds!}
+%D \stoptyping
+%D
+%D Most drawing packages only know width and height. Therefore the dimensions have a
+%D slightly different meaning here:
+%D
+%D \startitemize[packed]
+%D \item \type{\overlaywidth }: width of the overlay
+%D \item \type{\overlayheight}: height plus depth of the overlay
+%D \item \type{\overlaydepth }: depth of the overlay
+%D \stopitemize
+%D
+%D The resulting box is lowered to the right depth.
+
+%def\overlaywidth {\the\hsize\space} % We preset the variables
+%def\overlayheight {\the\vsize\space} % to some reasonable default
+%def\overlaydepth {0pt } % values. The attributes
+%let\overlayoffset \overlaydepth % of the frame can be (are)
+%let\overlaylinewidth \overlaydepth % set somewhere else.
+\let\overlaycolor \empty
+\let\overlaylinecolor \empty
+
+\def\overlayradius{\framedparameter\c!frameradius}
+
+\newdimen\d_overlay_width
+\newdimen\d_overlay_height
+\newdimen\d_overlay_depth
+\newdimen\d_overlay_offset
+\newdimen\d_overlay_linewidth
+
+\let\m_overlay_region\empty
+
+% expandable ... in a future version the space will go (in mp one can use Overlay*)
+
+\def\overlaywidth {\the\d_overlay_width \space} % We preset the variables
+\def\overlayheight {\the\d_overlay_height \space} % to some reasonable default
+\def\overlaydepth {\the\d_overlay_depth \space} % values.
+\def\overlayoffset {\the\d_overlay_offset \space} % of the frame can be (are)
+\def\overlaylinewidth {\the\d_overlay_linewidth\space} % set somewhere else.
+\def\overlayregion {\m_overlay_region}
+
+% public but kind of protected
+
+\def\usedoverlaywidth {\dimexpr\d_overlay_width \relax}
+\def\usedoverlayheight {\dimexpr\d_overlay_height \relax}
+\def\usedoverlaydepth {\dimexpr\d_overlay_depth \relax}
+\def\usedoverlayoffset {\dimexpr\d_overlay_offset \relax}
+\def\usedoverlaylinewidth{\dimexpr\d_overlay_linewidth\relax}
+
+%D The next register is used to initialize overlays.
+
+\newtoks\everyoverlay
+
+%D An example of an initialization is the following (overlays can contain text
+%D and be executed under an regime where interlineskip is off).
+
+\installcorenamespace{overlay}
+\installcorenamespace{overlaybuiltin}
+
+\appendtoks
+ \oninterlineskip
+\to \everyoverlay
+
+\prependtoks
+ \hsize\d_overlay_width
+ \vsize\d_overlay_height
+\to \everyoverlay
+
+\unexpanded\def\defineoverlay
+ {\dodoubleargument\pack_framed_define_overlay}
+
+\def\pack_framed_define_overlay[#1][#2]%
+ {\def\pack_framed_define_overlay_indeed##1{\setvalue{\??overlay##1}{\executedefinedoverlay{##1}{#2}}}%
+ \processcommalist[#1]\pack_framed_define_overlay_indeed}
+
+% \unexpanded\def\executedefinedoverlay#1#2% we can share the definitions
+% {\bgroup % redundant grouping
+% \setbox\scratchbox\hbox\bgroup
+% \ifzeropt\d_framed_target_dp
+% \the\everyoverlay#2% saves wrapping (and lua call)
+% \else
+% \lower\d_framed_target_dp
+% \hbox{\the\everyoverlay#2}%
+% \fi
+% \egroup
+% \setlayoutcomponentattribute{\v!overlay:#1}%
+% \setbox\scratchbox\hpack \layoutcomponentboxattribute
+% {\kern -.5\dimexpr\wd\scratchbox-\d_framed_target_wd\relax % was \d_overlay_width
+% \raise-.5\dimexpr\ht\scratchbox-\d_framed_target_ht\relax % not \d_overlay_height !
+% \box\scratchbox}%
+% \wd\scratchbox\d_framed_target_wd
+% \ht\scratchbox\d_framed_target_ht
+% \dp\scratchbox\d_framed_target_dp
+% \box\scratchbox
+% \egroup}
+
+% 20191231: moved from cont-exp:
+
+\unexpanded\def\executedefinedoverlay#1#2% we can share the definitions
+ {\bgroup % redundant grouping
+ \setlayoutcomponentattribute{\v!overlay:#1}%
+ \setbox\scratchbox\hbox \layoutcomponentboxattribute{\the\everyoverlay#2}%
+ \boxxoffset\scratchbox-.5\dimexpr\wd\scratchbox-\d_framed_target_wd\relax % was \d_overlay_width
+ \boxyoffset\scratchbox-.5\dimexpr\ht\scratchbox-\d_framed_target_ht+\d_framed_target_dp\relax % not \d_overlay_height !
+ \wd\scratchbox\d_framed_target_wd
+ \ht\scratchbox\d_framed_target_ht
+ \dp\scratchbox\d_framed_target_dp
+ \box\scratchbox
+ \egroup}
+
+%D \macros
+%D {overlayfakebox}
+
+% \unexpanded\def\overlayfakebox
+% {\hpack
+% {\setbox\scratchbox\emptyhbox
+% \wd\scratchbox\d_overlay_width
+% \ht\scratchbox\d_overlay_height
+% \box\scratchbox}}
+
+\unexpanded\def\overlayfakebox
+ {\hpack % redundant but needs testing
+ {\novrule
+ \s!width \d_overlay_width
+ \s!height\d_overlay_height
+ \s!depth \zeropoint}}
+
+%D For testing we provide:
+
+\def\doifelseoverlay#1% only tests external overlays
+ {\ifcsname\??overlay#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifoverlayelse\doifelseoverlay
+
+%D The content of the box will be (temporary) saved in a box. We also have an
+%D extra box for backgrounds.
+
+\newbox\b_framed_normal
+\newbox\b_framed_extra
+
+\newtoks\everybackgroundbox
+
+\let\m_framed_background\empty % we might need a public name
+
+\def\pack_framed_process_background
+ {\ifcsname\??overlaybuiltin\m_framed_background\endcsname
+ \expandafter\pack_framed_process_background_indeed_internal\lastnamedcs
+ \orelse\ifcsname\??overlay\m_framed_background\endcsname
+ \expandafter\pack_framed_process_background_indeed_external\lastnamedcs
+ \fi}
+
+\def\pack_framed_process_background_indeed_internal#1% % : in name
+ {\bgroup
+ \setbox\b_framed_extra\hpack\bgroup
+ \ifzeropt\framedbackgroundoffset\else
+ \kern-\framedbackgroundoffset
+ \fi
+ \hbox\bgroup#1\egroup
+ \egroup
+ \wd\b_framed_extra\zeropoint
+ \ht\b_framed_extra\framedbackgroundheight
+ \dp\b_framed_extra\framedbackgrounddepth
+ \box\b_framed_extra
+ \egroup}
+
+\def\pack_framed_process_background_indeed_external
+ {\pack_framed_overlay_initialize
+ \pack_framed_process_background_indeed_internal}
+
+\def\pack_framed_process_backgrounds#1,#2% #2 gobbles spaces (we could avoid one catch if we have nextbackground)
+ {\edef\m_framed_background{#1}%
+ \ifx\m_framed_background\s!unknown\else
+ \pack_framed_process_background
+ \expandafter\pack_framed_process_backgrounds
+ \fi#2}
+
+%D Beware, a backgroundbox can be empty which is another reason why we set the
+%D width to zero instead of back-skipping.
+
+\newdimen\framedbackgroundwidth
+\newdimen\framedbackgroundheight
+\newdimen\framedbackgrounddepth
+\newdimen\framedbackgroundoffset
+
+\def\pack_framed_background_box_content% fuzzy but needed hack, this \vss, otherwise
+ {\vpack to \framedbackgroundheight{\vss\box\b_framed_normal\vss}} % vertical shift \backgroundheight
+
+\def\pack_framed_set_region % experiment
+ {\ifx\m_overlay_region\v!yes
+ \edef\m_overlay_region{\reservedautoregiontag}%
+ \fi}
+
+\def\pack_framed_add_region % experiment
+ {\anch_mark_tagged_box\b_framed_normal\m_overlay_region}
+
+\def\pack_framed_add_background
+ {\setbox\b_framed_normal\hpack % was vbox % see also *1*
+ {%\pack_framed_forgetall % can be relaxed
+ \boxmaxdepth\maxdimen
+ \framedbackgroundoffset\d_framed_backgroundoffset
+ \framedbackgroundwidth \wd\b_framed_normal
+ \framedbackgroundheight\ht\b_framed_normal
+ \framedbackgrounddepth \dp\b_framed_normal
+ \d_framed_target_wd\dimexpr\framedbackgroundwidth +2\framedbackgroundoffset\relax
+ \d_framed_target_ht\dimexpr\framedbackgroundheight+ \framedbackgroundoffset\relax
+ \d_framed_target_dp\dimexpr\framedbackgrounddepth + \framedbackgroundoffset+\framedparameter\c!backgrounddepth\relax
+ \let\pack_framed_overlay_initialize\pack_framed_overlay_initialize_indeed
+ \ifx\p_framed_component\empty
+ \resetlayoutcomponentattribute
+ \else
+ \setlayoutcomponentattribute{\v!background:\p_framed_component}%
+ \fi
+ \let\foregroundbox\pack_framed_background_box_content
+ \hpack \layoutcomponentboxattribute to \framedbackgroundwidth\bgroup % width in case 'foreground' is used as overlay
+ \the\everybackgroundbox % moved
+ \expandafter\pack_framed_process_backgrounds\p_framed_background,\s!unknown,\relax % hm, messy .. look into it
+ \box\b_framed_normal
+ \hss
+ \egroup}}
+
+\def\pack_framed_overlay_initialize_indeed
+ {\d_overlay_width \d_framed_target_wd
+ \d_overlay_height \dimexpr\d_framed_target_ht+\d_framed_target_dp\relax
+ \d_overlay_depth \d_framed_target_dp
+ \d_overlay_linewidth \d_framed_linewidth
+ \d_overlay_offset \framedbackgroundoffset\relax
+ \edef\overlaycolor {\framedparameter\c!backgroundcolor}% let ?
+ \edef\overlaylinecolor{\framedparameter\c!framecolor}% only needed for layers
+ %\edef\overlaycorner {\framedparameter\c!backgroundcorner}%
+ %\edef\overlayradius {\framedparameter\c!backgroundradius}%
+ \let\pack_framed_overlay_initialize\relax}
+
+%D One can explictly insert the foreground box. For that purpose we introduce the
+%D overlay \type {foreground}.
+%D
+%D We predefine two already familiar backgrounds:
+
+%letvalue{\??overlaybuiltin\v!screen }\pack_framed_background_box_gray
+\letvalue{\??overlaybuiltin\v!color }\pack_framed_background_box_color
+\letvalue{\??overlaybuiltin\v!foreground}\pack_framed_background_box_content % replaces: \defineoverlay[\v!foreground][\foregroundbox]
+
+%D We can specify overlays as a comma separated list of overlays, a sometimes
+%D handy feature.
+%D
+%D Besides backgrounds (overlays) we also need some macros to draw outlines (ruled
+%D borders). Again we have to deal with square and round corners. The first category
+%D can be handled by \TEX\ itself, the latter one depends on the driver. This macro
+%D also support a negative offset.
+
+\def\pack_framed_add_outline
+ {\setbox\b_framed_normal\hpack % rules on top of box
+ {\d_framed_target_wd\dimexpr\wd\b_framed_normal+2\d_framed_frameoffset\relax
+ \d_framed_target_ht\dimexpr\ht\b_framed_normal+ \d_framed_frameoffset\relax
+ \d_framed_target_dp\dimexpr\dp\b_framed_normal+ \d_framed_frameoffset+\framedparameter\c!framedepth\relax
+ \ifdim\d_framed_target_dp<\zeropoint
+ \advance\d_framed_target_ht \d_framed_target_dp
+ \scratchdimen-\d_framed_target_dp
+ \d_framed_target_dp\zeropoint
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \edef\overlaylinecolor{\framedparameter\c!framecolor}% twice, also in background
+ \setbox\b_framed_extra\hpack
+ {\kern-\d_framed_frameoffset
+ \raise\scratchdimen
+ \hpack{\ifx\overlaylinecolor\empty\else\dousecolorparameter\overlaylinecolor\fi\pack_framed_stroked_box}}%
+ \wd\b_framed_extra\wd\b_framed_normal
+ \ht\b_framed_extra\ht\b_framed_normal
+ \dp\b_framed_extra\dp\b_framed_normal
+ \wd\b_framed_normal\zeropoint
+ \box\b_framed_normal
+ \box\b_framed_extra}}
+
+\def\pack_framed_stroked_box_normal_opened
+ {\setbox\scratchbox\vpack \bgroup
+ \csname\??framedtop\p_framed_frame\framedparameter\c!topframe\endcsname
+ \nointerlineskip % new (needed for fences)
+ \hpack \bgroup
+ \csname\??framedleft\p_framed_frame\framedparameter\c!leftframe\endcsname
+ \novrule
+ \s!width \d_framed_target_wd
+ \s!height\d_framed_target_ht
+ \s!depth \d_framed_target_dp
+ \csname\??framedright\p_framed_frame\framedparameter\c!rightframe\endcsname
+ \egroup
+ \nointerlineskip % new (needed for fences)
+ \csname\??framedbottom\p_framed_frame\framedparameter\c!bottomframe\endcsname
+ \egroup
+ \wd\scratchbox\d_framed_target_wd
+ \ht\scratchbox\d_framed_target_ht
+ \dp\scratchbox\d_framed_target_dp
+ \box\scratchbox}
+
+\def\pack_framed_stroked_box_normal_closed
+ {\hpack\bgroup
+ \scratchdimen.5\d_framed_linewidth
+ \hskip\scratchdimen
+ \clf_framedoutline
+ \dimexpr\d_framed_target_wd-\d_framed_linewidth\relax
+ \dimexpr\d_framed_target_ht-\scratchdimen\relax
+ \dimexpr\d_framed_target_dp-\scratchdimen\relax
+ \d_framed_linewidth
+ \relax
+ \egroup}
+
+\def\pack_framed_stroked_box_normal
+ {\ifx\p_framed_frame\v!closed
+ \pack_framed_stroked_box_normal_closed
+ \else
+ \pack_framed_stroked_box_normal_opened
+ \fi}
+
+\def\pack_framed_t_rule{\hrule\s!height\d_framed_linewidth\kern-\d_framed_linewidth}
+\def\pack_framed_b_rule{\kern-\d_framed_linewidth\hrule\s!height\d_framed_linewidth}
+\def\pack_framed_r_rule{\kern-\d_framed_linewidth\vrule\s!width\d_framed_linewidth}
+\def\pack_framed_l_rule{\vrule\s!width\d_framed_linewidth\kern-\d_framed_linewidth}
+
+\letvalue{\??framedtop \v!on \v!on}\pack_framed_t_rule
+\letvalue{\??framedtop \v!off\v!on}\pack_framed_t_rule
+\letvalue{\??framedtop \v!on }\pack_framed_t_rule
+
+\letvalue{\??framedbottom\v!on \v!on}\pack_framed_b_rule
+\letvalue{\??framedbottom\v!off\v!on}\pack_framed_b_rule
+\letvalue{\??framedbottom\v!on }\pack_framed_b_rule
+
+\letvalue{\??framedleft \v!on \v!on}\pack_framed_l_rule
+\letvalue{\??framedleft \v!off\v!on}\pack_framed_l_rule
+\letvalue{\??framedleft \v!on }\pack_framed_l_rule
+
+\letvalue{\??framedright \v!on \v!on}\pack_framed_r_rule
+\letvalue{\??framedright \v!off\v!on}\pack_framed_r_rule
+\letvalue{\??framedright \v!on }\pack_framed_r_rule
+
+% no overlapping rules
+
+\def\pack_framed_t_rules{\hpack{\kern\d_framed_linewidth\vrule\s!width\dimexpr\d_framed_target_wd-2\d_framed_linewidth\relax\s!height\d_framed_linewidth}\nointerlineskip\kern-\d_framed_linewidth}
+\def\pack_framed_b_rules{\kern-\d_framed_linewidth\nointerlineskip\hpack{\kern\d_framed_linewidth\vrule\s!width\dimexpr\d_framed_target_wd-2\d_framed_linewidth\relax\s!height\d_framed_linewidth}}
+\def\pack_framed_r_rules{\kern-\d_framed_linewidth\vrule\s!height\dimexpr\d_framed_target_ht-\d_framed_linewidth\relax\s!depth-\d_framed_linewidth\s!width\d_framed_linewidth}
+\def\pack_framed_l_rules{\vrule\s!height\dimexpr\d_framed_target_ht-\d_framed_linewidth\relax\s!depth-\d_framed_linewidth\s!width\d_framed_linewidth\kern-\d_framed_linewidth}
+
+\letvalue{\??framedtop \v!small\v!small}\pack_framed_t_rules
+\letvalue{\??framedtop \v!off \v!small}\pack_framed_t_rules
+\letvalue{\??framedtop \v!small }\pack_framed_t_rules
+
+\letvalue{\??framedbottom\v!small\v!small}\pack_framed_b_rules
+\letvalue{\??framedbottom\v!off \v!small}\pack_framed_b_rules
+\letvalue{\??framedbottom\v!small }\pack_framed_b_rules
+
+\letvalue{\??framedleft \v!small\v!small}\pack_framed_l_rules
+\letvalue{\??framedleft \v!off \v!small}\pack_framed_l_rules
+\letvalue{\??framedleft \v!small }\pack_framed_l_rules
+
+\letvalue{\??framedright \v!small\v!small}\pack_framed_r_rules
+\letvalue{\??framedright \v!off \v!small}\pack_framed_r_rules
+\letvalue{\??framedright \v!small }\pack_framed_r_rules
+
+% \framed
+% [width=4cm,height=3cm,rulethickness=3mm,
+% frame=off,rightframe=on,leftframe=on,topframe=on,bottomframe=on]
+% {}
+% \framed
+% [width=4cm,height=3cm,rulethickness=3mm,
+% frame=off,rightframe=small,leftframe=small,topframe=small,bottomframe=small]
+% {}
+% \framed
+% [width=4cm,height=3cm,rulethickness=3mm,
+% frame=off,rightframe=small,leftframe=small,topframe=small,bottomframe=on]
+% {}
+
+%D The next few macros are probably the most misused ones in \CONTEXT. They deal
+%D with putting rules around boxes, provide backgrounds, offer alignment features,
+%D and some more. We start with defining some booleans. These give an impression of
+%D what we are going to take into account.
+
+% todo : \c_framed_hasoffset
+% faster : \let\c_framed_hasoffset\falseconditional
+
+\newconditional\c_framed_has_offset
+\newconditional\c_framed_has_width
+\newconditional\c_framed_has_height
+\newconditional\c_framed_has_format
+\newconditional\c_framed_is_overlaid
+\newconditional\c_framed_has_frame
+\newconditional\c_framed_has_extra_offset
+\newconditional\c_framed_text_location_none
+
+\newconstant \c_framed_has_strut % 0=relaxes 1=pseudostruts 2=realstruts
+
+%D \macros
+%D {framed, setupframed}
+%D
+%D Ruled boxes are typeset using \type{\framed}. This command is quite versatile
+%D and, although some users will probably seldom use it, one cannot overlook its
+%D features.
+%D
+%D \showsetup{setupframed}
+%D \showsetup{framed}
+%D
+%D This general macro is a special version of an even more general case, that can
+%D easily be linked into other macros that need some kind of framing. The local
+%D version is called with an extra parameter: the variable identifier. The reason
+%D for passing this identifier between brackets lays in the mere fact that this way
+%D we can use the optional argument grabbers.
+
+\def\defaultframeoffset{.25\exheight}
+
+\installcorenamespace{regularframedlevel}
+
+\unexpanded\def\installregularframed#1%
+ {\defineframed[#1]}
+
+\unexpanded\def\presetlocalframed[#1]%
+ {\defineframed[#1]}
+
+% \presetlocalframed[\??framed]
+
+\newcount\c_pack_framed_nesting
+
+\unexpanded\def\pack_framed_process_framed[#1]%
+ {\bgroup
+ \iffirstargument % faster
+ \setupcurrentframed[#1]% here !
+ \fi
+ \pack_framed_process_indeed}
+
+\unexpanded\def\framed
+ {\bgroup
+ \advance\c_pack_framed_nesting\plusone
+ \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed
+ \edef\currentframed{>\the\c_pack_framed_nesting}%
+ \pack_framed_initialize
+ \dosingleempty\pack_framed_process_framed}
+
+\unexpanded\def\startframed
+ {\dosingleempty\pack_framed_start_framed}
+
+\def\pack_framed_start_framed[#1]%
+ {\bgroup
+ \doifelseassignment{#1}\pack_framed_start_framed_yes\pack_framed_start_framed_nop{#1}}
+
+\def\pack_framed_start_framed_yes#1%
+ {\advance\c_pack_framed_nesting\plusone
+ \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed
+ \iffirstargument\secondargumenttrue\fi % dirty trick
+ \edef\currentframed{>\the\c_pack_framed_nesting}%
+ \pack_framed_initialize
+ \bgroup
+ \iffirstargument
+ \secondargumenttrue % dirty trick
+ \setupcurrentframed[#1]% here !
+ \fi
+ \pack_framed_process_indeed
+ \bgroup
+ \ignorespaces}
+
+\def\pack_framed_start_framed_nop#1%
+ {\edef\currentframed{#1}%
+ \dosingleempty\pack_framed_start_framed_nop_indeed}
+
+\def\pack_framed_start_framed_nop_indeed[#1]%
+ {\pack_framed_initialize
+ \bgroup
+ \iffirstargument
+ \setupcurrentframed[#1]% here !
+ \fi
+ \pack_framed_process_indeed
+ \bgroup
+ \ignorespaces}
+
+% till here
+
+\unexpanded\def\stopframed
+ {\removeunwantedspaces
+ \egroup}
+
+\unexpanded\def\normalframedwithsettings[#1]%
+ {\bgroup
+ \advance\c_pack_framed_nesting\plusone
+ \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed
+ \bgroup
+ \edef\currentframed{>\the\c_pack_framed_nesting}%
+ \pack_framed_initialize
+ \setupcurrentframed[#1]%
+ \pack_framed_process_indeed}
+
+%D \startbuffer
+%D \setupframed [framecolor=yellow] \framed{A}
+%D \defineframed[myframed] [framecolor=blue] \myframed{B}
+%D \setupframed [myframed] [framecolor=red] \myframed{C}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \presetlocalframed[myframed]
+%D \localframed[myframed][framecolor=green]{oeps}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {ifinframed}
+%D
+%D The normal case first presets all parameters and next starts looking for the user
+%D supplied ones. The first step is omitted in the local case, because these are
+%D preset at declaration time and keep their values unless explictly changed. By
+%D presetting the variables everytime the normal command is called, we can use this
+%D command nested, without the unwanted side effect of inheritance. The boolean is
+%D used to speed up the color stack.
+
+\newif\ifinframed
+
+%D The next one is faster on multiple backgrounds per page. No
+%D dimensions can be set, only frames and backgrounds.
+
+\unexpanded\def\fastlocalframed[#1]#2[#3]#4% 3-4
+ {\bgroup
+ \edef\currentframed{#1}%
+ \pack_framed_initialize
+ \setbox\b_framed_normal\hbox{#4}%
+ \iftrialtypesetting \else
+ \edef\m_overlay_region{\framedparameter\c!region}%
+ \ifx\m_overlay_region\empty\else
+ \pack_framed_set_region
+ \fi
+ \fi
+ \setupcurrentframed[#3]%
+ \edef\p_framed_rulethickness{\framedparameter\c!rulethickness}% also used in backgrounds
+ \d_framed_frameoffset\framedparameter\c!frameoffset\relax % also used in backgrounds
+ \edef\p_framed_frame{\framedparameter\c!frame}%
+ \edef\p_framed_background{\framedparameter\c!background}%
+ % not here, in calling macro: setups
+ \pack_framed_remove_depth
+ \ifx\p_framed_frame\v!overlay \orelse \ifx\p_framed_frame\v!none \else
+ \ifx\p_framed_rulethickness\empty\else
+ \d_framed_linewidth\p_framed_rulethickness\relax
+ \fi
+ \pack_framed_add_outline % real or invisible frame
+ \fi
+ \ifx\p_framed_background\empty \else
+ \edef\p_framed_backgroundoffset{\framedparameter\c!backgroundoffset}%
+ \d_framed_backgroundoffset
+ \ifx\p_framed_backgroundoffset\v!frame
+ \d_framed_frameoffset
+ \else
+ \p_framed_backgroundoffset
+ \fi
+ \edef\p_framed_component{\framedparameter\c!component}%
+ \pack_framed_add_background
+ \fi
+ \pack_framed_restore_depth
+ \iftrialtypesetting\orelse\ifx\m_overlay_region\empty\else
+ \pack_framed_add_region
+ \fi
+ \box\b_framed_normal
+ \egroup}
+
+%D The next macro uses a box and takes its natural width and height so these
+%D can better be correct.
+
+\unexpanded\def\pack_framed_process_box_indeed#1#2% component box (assumes parameters set and grouped usage)
+ {\setbox\b_framed_normal\box#2% could actually be \let\b_framed_normal#2
+ \edef\m_overlay_region{\framedparameter\c!region}%
+ \ifx\m_overlay_region\empty\else
+ \pack_framed_set_region
+ \fi
+ \edef\p_framed_rulethickness{\framedparameter\c!rulethickness}% also used in backgrounds
+ \d_framed_frameoffset\framedparameter\c!frameoffset\relax % also used in backgrounds
+ \edef\p_framed_frame{\framedparameter\c!frame}%
+ \edef\p_framed_background{\framedparameter\c!background}%
+ \ifx\p_framed_frame\v!overlay \orelse \ifx\p_framed_frame\v!none \else
+ \ifx\p_framed_rulethickness\empty \else
+ \d_framed_linewidth\p_framed_rulethickness\relax
+ \fi
+ \pack_framed_add_outline % real or invisible frame
+ \fi
+ \ifx\p_framed_background\empty \else
+ \edef\p_framed_backgroundoffset{\framedparameter\c!backgroundoffset}%
+ \d_framed_backgroundoffset
+ \ifx\p_framed_backgroundoffset\v!frame
+ \d_framed_frameoffset
+ \else
+ \p_framed_backgroundoffset
+ \fi
+ \edef\p_framed_component{#1}%
+ \pack_framed_add_background
+ \fi
+ \ifx\m_overlay_region\empty\else
+ \pack_framed_add_region
+ \fi
+ \box\b_framed_normal
+ \egroup}
+
+\unexpanded\def\localbackgroundframed#1% namespace component box
+ {\bgroup
+ \edef\currentframed{#1}%
+ \pack_framed_initialize
+ \pack_framed_process_box_indeed} % group ends here
+
+\let\postprocessframebox\relax
+
+%D A nice example by Aditya:
+%D
+%D \starttyping
+%D \setupframed
+%D [loffset=\framedparameter{hoffset},
+%D roffset=\framedparameter{hoffset},
+%D hoffset=\zeropoint]
+%D
+%D \defineframed[test][hoffset=1cm]
+%D \stoptyping
+
+\newdimen\d_framed_width
+\newdimen\d_framed_height
+\newdimen\d_framed_frameoffset
+\newdimen\d_framed_backgroundoffset
+\newdimen\d_framed_local_offset
+
+% todo: protect local \framednames
+
+\unexpanded\def\localframed
+ {\bgroup
+ \dodoubleempty\pack_framed_local}
+
+\unexpanded\def\pack_framed_local[#1][#2]%
+ {\bgroup
+ \edef\currentframed{#1}%
+ \pack_framed_initialize
+ \ifsecondargument % faster
+ \setupcurrentframed[#2]% here !
+ \fi
+ \pack_framed_process_indeed}
+
+\unexpanded\def\directlocalframed[#1]% no optional
+ {\bgroup
+ \bgroup
+ \edef\currentframed{#1}%
+ \pack_framed_initialize
+ \pack_framed_process_indeed}
+
+\unexpanded\def\localframedwithsettings[#1][#2]% no checking (so no spaces between)
+ {\bgroup
+ \bgroup
+ \edef\currentframed{#1}%
+ \pack_framed_initialize
+ \setupcurrentframed[#2]% here !
+ \pack_framed_process_indeed}
+
+% done
+
+\def\c!fr!analyze{fr:analyze} % private option
+
+\let\delayedbegstrut\relax
+\let\delayedendstrut\relax
+\let\delayedstrut \relax
+
+\let\localoffset\empty
+\let\localwidth \empty
+\let\localheight\empty
+\let\localformat\empty
+\let\localstrut \empty
+
+\unexpanded\def\pack_framed_process_indeed
+ {\d_framed_frameoffset\framedparameter\c!frameoffset
+ \edef\p_framed_backgroundoffset{\framedparameter\c!backgroundoffset}%
+ \d_framed_backgroundoffset
+ \ifx\p_framed_backgroundoffset\v!frame
+ \d_framed_frameoffset
+ \else
+ \p_framed_backgroundoffset
+ \fi
+ % new, experimental dirty hook
+ \framedparameter\c!extras
+ % to get the right spacing
+ \edef\p_framed_foregroundstyle{\framedparameter\c!foregroundstyle}%
+ \ifx\p_framed_foregroundstyle\empty\else\dousestyleparameter\p_framed_foregroundstyle\fi
+ % beware, both the frame and background offset can be overruled
+ %
+ \edef\p_framed_setups{\framedparameter\c!setups}%
+ % the next macros are visible
+ \edef\localoffset{\framedparameter\c!offset}%
+ \edef\localwidth {\framedparameter\c!width}%
+ \edef\localheight{\framedparameter\c!height}%
+ \edef\localformat{\framedparameter\c!align}%
+ \edef\localstrut {\framedparameter\c!strut}%
+ % these are not
+ \edef\p_framed_autostrut {\framedparameter\c!autostrut}%
+ \edef\p_framed_frame {\framedparameter\c!frame}%
+ \edef\p_framed_location {\framedparameter\c!location}%
+ \edef\p_framed_orientation{\framedparameter\c!orientation}%
+ \edef\p_framed_anchoring {\framedparameter\c!anchoring}%
+ %
+ \edef\p_framed_autowidth {\framedparameter\c!autowidth}%
+ \edef\p_framed_franalyze {\framedparameter\c!fr!analyze}% experimental option
+ %
+ \ifx\p_framed_frame\v!overlay % no frame, no offset, no framewidth
+ \setfalse\c_framed_has_frame
+ \let\localoffset\v!overlay
+ \orelse\ifx\p_framed_frame\v!none % no frame, no framewidth
+ \setfalse\c_framed_has_frame
+ \else
+ \settrue\c_framed_has_frame
+ \fi
+ \ifconditional\c_framed_has_frame
+ \edef\p_framed_rulethickness{\framedparameter\c!rulethickness}%
+ \ifx\p_framed_rulethickness\empty\else
+ \d_framed_linewidth\p_framed_rulethickness\relax
+ \fi
+ \else
+ \d_framed_linewidth\zeropoint
+ \fi
+ % 2013/03/12: a change of order (sizes before align
+ \ifx\localwidth\v!local
+ \setlocalhsize
+ \fi
+ %
+ \forgetall % should happen after \localwidth but before align
+ %
+ \ifx\localformat\empty
+ \setfalse\c_framed_has_format
+ \else
+ \settrue\c_framed_has_format
+ \dosetraggedcommand\localformat % not that fast
+ \fi
+ %
+ \ifcsname\??framedoffsetalternative\localoffset\endcsname
+ \lastnamedcs
+ \else
+ \framed_offset_alternative_unknown
+ \fi
+ \ifcsname\??framedwidthalternative\localwidth\endcsname
+ \lastnamedcs
+ \else
+ \framed_width_alternative_unknown
+ \fi
+ \ifcsname\??framedheightalternative\localheight\endcsname
+ \lastnamedcs
+ \else
+ \framed_height_alternative_unknown
+ \fi
+ % the next check could move to heightalternative
+ \ifconditional\c_framed_has_height
+ % obey user set height, also downward compatible
+ \else
+ \edef\p_framed_lines{\framedparameter\c!lines}%
+ \ifx\p_framed_lines\empty
+ \orelse\ifcase\p_framed_lines
+ \else
+ \d_framed_height\p_framed_lines\lineheight
+ \edef\localheight{\the\d_framed_height}%
+ \settrue\c_framed_has_height
+ \fi
+ \fi
+ % this is now an option: width=local
+ %
+ % \ifdim\d_framed_width=\hsize
+ % \parindent\zeropoint
+ % \setlocalhsize
+ % \d_framed_width\localhsize
+ % \fi
+ % i.e. disable (colsetbackgroundproblemintechniek)
+ \advance\d_framed_width -2\d_framed_local_offset
+ \advance\d_framed_height -2\d_framed_local_offset
+ \ifcsname\??framedstrutalternative\localstrut\endcsname
+ \lastnamedcs
+ \else
+ \framed_offset_alternative_unknown
+ \fi
+ % the next check could move to strutalternative
+ \ifcase\c_framed_has_strut % none (not even noindent)
+ \let\localbegstrut\relax
+ \let\localendstrut\relax
+ \let\localstrut \relax
+ \or % no / overlay
+ \let\localbegstrut\pseudobegstrut
+ \let\localendstrut\pseudoendstrut
+ \let\localstrut \pseudostrut
+ \else
+ \let\localbegstrut\begstrut
+ \let\localendstrut\endstrut
+ \let\localstrut \strut
+ \fi
+ \ifx\p_framed_autostrut\v!yes
+ \let\delayedbegstrut\relax
+ \let\delayedendstrut\relax
+ \let\delayedstrut \relax
+ \else
+ \let\delayedbegstrut\localbegstrut
+ \let\delayedendstrut\localendstrut
+ \let\delayedstrut \localstrut
+ \let\localbegstrut \relax
+ \let\localendstrut \relax
+ \let\localstrut \relax
+ \fi
+ \ifconditional\c_framed_has_height
+ \let\\\pack_framed_vboxed_newline
+ \ifconditional\c_framed_has_width
+ \let\hairline\pack_framed_vboxed_hairline
+ \ifconditional\c_framed_has_format
+ \let\next\pack_framed_format_format_yes
+ \else
+ \let\next\pack_framed_format_format_nop
+ \fi
+ \else
+ \let\hairline\pack_framed_hboxed_hairline
+ \ifconditional\c_framed_has_format
+ \let\next\pack_framed_format_format_height
+ \else
+ \let\next\pack_framed_format_format_vsize
+ \fi
+ \fi
+ \orelse\ifconditional\c_framed_has_width
+ \ifconditional\c_framed_has_format
+ \let\hairline\pack_framed_vboxed_hairline
+ \let\\\pack_framed_vboxed_newline
+ \let\next\pack_framed_format_format_width
+ \else
+ \let\hairline\pack_framed_hboxed_hairline
+ \let\\\pack_framed_hboxed_newline
+ \let\next\pack_framed_format_format_hsize
+ \fi
+ \else
+ \let\hairline\pack_framed_hboxed_hairline
+ \let\\\pack_framed_hboxed_newline
+ \let\next\pack_framed_format_format_no_size
+ \fi
+ \pack_framed_check_extra_offsets
+ \edef\p_framed_background{\framedparameter\c!background}%
+% \ifx\p_framed_background\empty
+% \let\pack_framed_forgetall\forgetall
+% \else
+% \let\pack_framed_forgetall\relax
+% \forgetall
+% \fi
+ \edef\framedwidth {\the\ifdim\d_framed_width >\zeropoint \d_framed_width \else\zeropoint\fi}% public
+ \edef\framedheight{\the\ifdim\d_framed_height>\zeropoint \d_framed_height\else\zeropoint\fi}% public
+ \edef\framedoffset{\the\dimexpr\ifconditional\c_framed_has_offset\localoffset \else\zeropoint\fi}% public
+ \ifx\p_framed_orientation\empty
+ \let\pack_framed_stop_orientation\relax
+ \else
+ \pack_framed_start_orientation
+ \fi
+ \afterassignment\pack_framed_restart
+ \setbox\b_framed_normal\next}
+
+% alternatives for width, height, strut and offset
+
+\installcorenamespace{framedwidthalternative}
+\installcorenamespace{framedheightalternative}
+\installcorenamespace{framedstrutalternative}
+\installcorenamespace{framedoffsetalternative}
+
+% widths
+
+\setvalue{\??framedwidthalternative\empty}%
+ {\ifconditional\c_framed_has_format
+ \settrue\c_framed_has_width
+ \d_framed_width\hsize
+ \else
+ \setfalse\c_framed_has_width
+ \d_framed_width\zeropoint
+ \fi}
+
+\setvalue{\??framedwidthalternative\v!fit}%
+ {\ifconditional\c_framed_has_format
+ \settrue\c_framed_has_width
+ \d_framed_width\hsize
+ \else
+ \setfalse\c_framed_has_width
+ \d_framed_width\zeropoint
+ \fi}
+
+\setvalue{\??framedwidthalternative\v!fixed}% equals \v!fit but no shapebox
+ {\ifconditional\c_framed_has_format
+ \settrue\c_framed_has_width
+ \d_framed_width\hsize
+ \else
+ \setfalse\c_framed_has_width
+ \d_framed_width\zeropoint
+ \fi}
+
+\setvalue{\??framedwidthalternative\v!broad}%
+ {\settrue\c_framed_has_width
+ \d_framed_width\hsize}
+
+\setvalue{\??framedwidthalternative\v!max}% idem broad
+ {\settrue\c_framed_has_width
+ \d_framed_width\hsize}
+
+\setvalue{\??framedwidthalternative\v!local}%
+ {\settrue\c_framed_has_width
+ %\setlocalhsize
+ \d_framed_width\localhsize}
+
+\setvalue{\??framedwidthalternative\s!unknown}%
+ {\settrue\c_framed_has_width
+ \d_framed_width\localwidth}
+
+\def\framed_width_alternative_unknown
+ {\settrue\c_framed_has_width
+ \d_framed_width\localwidth}
+
+% heights
+
+\setvalue{\??framedheightalternative\empty}%
+ {\setfalse\c_framed_has_height
+ \d_framed_height\zeropoint}
+
+\setvalue{\??framedheightalternative\v!fit}%
+ {\setfalse\c_framed_has_height
+ \d_framed_height\zeropoint}
+
+\setvalue{\??framedheightalternative\v!broad}%
+ {\setfalse\c_framed_has_height
+ \d_framed_height\zeropoint}
+
+\setvalue{\??framedheightalternative\v!max}%
+ {\settrue\c_framed_has_height
+ \d_framed_height\vsize}
+
+\setvalue{\??framedheightalternative\s!unknown}%
+ {\settrue\c_framed_has_height
+ \d_framed_height\localheight}
+
+\def\framed_height_alternative_unknown
+ {\settrue\c_framed_has_height
+ \d_framed_height\localheight}
+
+% struts (use let instead?)
+
+\setvalue{\??framedstrutalternative\v!no}%
+ {\c_framed_has_strut\plusone}
+
+\setvalue{\??framedstrutalternative\v!global}%
+ {\setstrut}
+
+\setvalue{\??framedstrutalternative\v!local}%
+ {\setfontstrut}
+
+\setvalue{\??framedstrutalternative\v!yes}%
+ {\setstrut}
+
+\setvalue{\??framedstrutalternative\s!unknown}%
+ {\setstrut}
+
+\def\framed_strut_alternative_unknown
+ {\setstrut}
+
+\setvalue{\??framedstrutalternative\v!none}% not even pseudo struts
+ {\c_framed_has_strut\zerocount}
+
+% offsets
+
+\setvalue{\??framedoffsetalternative\v!none}%
+ {\setfalse\c_framed_has_offset
+ \c_framed_has_strut\plusone
+ \setfalse\c_framed_is_overlaid
+ \d_framed_local_offset\d_framed_linewidth}
+
+\setvalue{\??framedoffsetalternative\v!overlay}%
+ {% \ifx\p_framed_frame\v!no \setfalse\c_framed_has_frame \fi % test first
+ \setfalse\c_framed_has_offset
+ \c_framed_has_strut\plusone
+ \settrue\c_framed_is_overlaid
+ \d_framed_local_offset\zeropoint}
+
+% \setvalue{\??framedoffsetalternative\v!strut}%
+% {\setfalse\c_framed_has_offset
+% \c_framed_has_strut\plustwo
+% \settrue\c_framed_is_overlaid
+% \d_framed_local_offset\zeropoint}
+
+\setvalue{\??framedoffsetalternative\v!default}% new per 2-6-2000
+ {\settrue \c_framed_has_offset
+ \c_framed_has_strut\plustwo
+ \setfalse\c_framed_is_overlaid
+ \let\localoffset\defaultframeoffset
+ \letframedparameter\c!offset\defaultframeoffset % brrr
+ \d_framed_local_offset\dimexpr\localoffset+\d_framed_linewidth\relax}
+
+\def\framed_offset_alternative_unknown
+ {\settrue \c_framed_has_offset
+ \c_framed_has_strut\plustwo
+ \setfalse\c_framed_is_overlaid
+ \let\defaultframeoffset\localoffset
+ \d_framed_local_offset\dimexpr\localoffset+\d_framed_linewidth\relax}
+
+\letvalue{\??framedoffsetalternative\s!unknown}\framed_offset_alternative_unknown
+
+% so far for alternatives
+
+\let\pack_framed_stop_orientation\relax
+
+\def\pack_framed_restart
+ {\aftergroup\pack_framed_finish}
+
+\def\pack_framed_do_top
+ {\raggedtopcommand
+ \framedparameter\c!top
+ \edef\p_blank{\framedparameter\c!blank}%
+ \ifx\p_blank\v!yes\else % auto or no
+ \doinhibitblank
+ \fi}
+
+\def\pack_framed_do_bottom
+ {\framedparameter\c!bottom
+ \raggedbottomcommand}
+
+%D Careful analysis of this macro will learn us that not all branches in the last
+%D conditionals can be encountered, that is, some assignments to \type{\next} will
+%D never occur. Nevertheless we implement the whole scheme, if not for future
+%D extensions.
+
+%D \macros
+%D {doassigncheckedframeoffset}
+%D
+%D Offset helper (see menus):
+
+\def\doassigncheckedframeoffset#1#2% could be a fast \csname .. \endcsname
+ {\edef\checkedframeoffset{#2}%
+ #1%
+ \ifx\checkedframeoffset\empty \zeropoint\orelse
+ \ifx\checkedframeoffset\v!overlay\zeropoint\orelse
+ \ifx\checkedframeoffset\v!none \zeropoint\orelse
+ \ifx\checkedframeoffset\v!frame \zeropoint\orelse
+ \ifx\checkedframeoffset\v!default\zeropoint\else
+ #2%
+ \fi
+ \relax}
+
+%D \macros
+%D {ifreshapeframebox}
+%D
+%D The last few lines tell what to do after the content of the box is collected and
+%D passed to the next macro. In the case of a fixed width and centered alignment,
+%D the content is evaluated and used to determine the most natural width. The rest
+%D of the code deals with backgrounds and frames.
+
+\newif\ifreshapeframebox \reshapeframeboxtrue
+
+%D Beware: setting \type {top} and \type {bottom} to nothing, may
+%D result in a frame that is larger that the given height! try:
+%D
+%D \starttyping
+%D \framed
+%D [height=3cm,top=,bottom=,offset=overlay]
+%D {\strut test \shapefill \strut test}
+%D \stoptyping
+%D
+%D This is intended behaviour and not a bug! One can always set
+%D
+%D \starttyping
+%D ...,bottom=\kern0pt,...
+%D \stoptyping
+
+% experiment ... \p_framed_franalyze -> we could support 'first' as location key
+% option but then we will always do an analysis and reimplement the location
+% options (btw, beware of location settings of derived functionality that bleed
+% into this
+
+\def\pack_framed_finish_a
+ {\ifreshapeframebox
+ \pack_framed_reshape_process
+ \orelse\ifx\p_framed_franalyze\v!yes
+ \pack_framed_reshape_analyze
+ \else
+ \pack_framed_reshape_reset
+ \fi
+ \setfalse\c_framed_has_width}
+
+\def\pack_framed_finish_b
+ {\ifx\p_framed_franalyze\v!yes
+ \pack_framed_reshape_analyze
+ \else
+ \pack_framed_reshape_reset
+ \fi
+ \setfalse\c_framed_has_width}
+
+\def\pack_framed_finish_c
+ {\ifx\p_framed_franalyze\v!yes
+ \pack_framed_reshape_analyze
+ \else
+ \pack_framed_reshape_reset
+ \fi}
+
+\def\pack_framed_profile_box
+ {\profilegivenbox\p_profile\b_framed_normal
+ \setbox\b_framed_normal\vpack{\unvbox\b_framed_normal}}
+
+\unexpanded\def\pack_framed_finish
+ {%\pack_framed_stop_orientation % hm, wrong place ! should rotate the result (after reshape) .. moved down
+ \pack_framed_locator_before\p_framed_location
+ \ifconditional\c_framed_has_format
+ %\ifconditional\c_framed_has_height \else
+ % \edef\p_profile{\framedparameter\c!profile}%
+ % \ifx\p_profile\empty\else
+ % \pack_framed_profile_box
+ % \fi
+ %\fi
+ \ifx\p_framed_autowidth\v!force
+ \pack_framed_finish_a
+ \orelse\ifx\localwidth\v!fit
+ \ifx\p_framed_autowidth\v!yes
+ \pack_framed_finish_a
+ \else
+ \pack_framed_finish_b
+ \fi
+ \orelse\ifx\localwidth\v!fixed
+ \pack_framed_finish_b
+ \else
+ \pack_framed_finish_c
+ \fi
+ \ifconditional\c_framed_has_height \else
+ \edef\p_profile{\framedparameter\c!profile}%
+ \ifx\p_profile\empty\else
+ \pack_framed_profile_box
+ \fi
+ \fi
+ \ifconditional\page_postprocessors_needed_box
+ % quite late
+ \page_postprocessors_linenumbers_box\b_framed_normal
+ \fi
+ \else
+ \pack_framed_finish_c
+ \fi
+ \ifconditional\c_framed_has_width
+ \wd\b_framed_normal\d_framed_width
+ \fi
+ \ifconditional\c_framed_has_height
+ \ht\b_framed_normal\d_framed_height
+ \else
+ \edef\p_framed_minheight{\framedparameter\c!minheight}%
+ \ifx\p_framed_minheight\empty \else
+ \ifdim\ht\b_framed_normal<\p_framed_minheight
+ \ht\b_framed_normal\p_framed_minheight
+ \fi
+ \fi
+ \fi
+ \edef\p_framed_empty{\framedparameter\c!empty}%
+ \ifx\p_framed_empty\v!yes
+ \pack_framed_fake_box
+ \fi
+ \ifx\p_framed_anchoring\empty\else
+ \pack_framed_handle_anchoring
+ \fi
+ \pack_framed_stop_orientation % moved here at 2014-05-25
+ \iftrialtypesetting \else
+ \edef\m_overlay_region{\framedparameter\c!region}%
+ \ifx\m_overlay_region\empty\else
+ \pack_framed_set_region
+ \fi
+ \fi
+ \d_framed_applied_offset
+ \ifconditional\c_framed_is_overlaid
+ \zeropoint
+ \else
+ \d_framed_linewidth
+ \fi
+ \ifconditional\c_framed_has_offset
+ \advance\d_framed_applied_offset\localoffset
+ \fi
+ \ifconditional\c_framed_has_extra_offset
+ \pack_framed_apply_extra_offsets % includes \d_framed_applied_offset
+ \else
+ \ifzeropt\d_framed_applied_offset
+ \else
+ \pack_framed_widen_box
+ \fi
+ \fi
+ %
+ \ifx\postprocessframebox\relax \else
+ \let\next\postprocessframebox
+ \let\postprocessframebox\relax % prevent nesting
+ \next\b_framed_normal
+ \fi
+ \iftrialtypesetting
+ % new
+ \else
+ \ifconditional\c_framed_has_frame % real or invisible frame
+ \pack_framed_add_outline
+ \fi
+ \ifx\p_framed_background\empty \else
+ \edef\p_framed_component{\framedparameter\c!component}%
+ \pack_framed_add_background
+ \fi
+ \fi
+ \pack_framed_locator_after\p_framed_location
+ \iftrialtypesetting \else
+ \ifx\m_overlay_region\empty\else
+ \pack_framed_add_region
+ \fi
+ \fi
+ \box\b_framed_normal
+ \global\frameddimensionstate % global so to be used directly afterwards !
+ \ifconditional\c_framed_has_width
+ \ifconditional\c_framed_has_height \plusthree \else \plusone \fi
+ \else
+ \ifconditional\c_framed_has_height \plustwo \else \zerocount \fi
+ \fi
+ \egroup
+ \egroup}
+
+%D Anchoring is experimental and was prototyped around the ctx meeting in 2018 but
+%D never mede it into the core yet. It operates independent of the orientation
+%D mechanism already present. It's a rather efficient feature. Best is to use
+%D predefined orientations, like:
+%D
+%D \starttyping
+%D \defineorientation[leftflushleft] [orientation=left,horizontal=flushleft]
+%D
+%D \framed [anchoring={leftflushleft}] {anchoring}
+%D \stoptyping
+%D
+%D But this also works:
+%D
+%D \starttyping
+%D \framed [anchoring={flushleft,top,up}] {anchoring}
+%D \stoptyping
+%D
+%D When an anchoring is given (use \type {normal} for the default) you can also
+%D use the \type {xanchor} and \type {yanchor} offsets.
+
+% because we mess with the width later on, we need double wrapping:
+
+\def\pack_framed_handle_anchoring
+ {\scratchcounter\autoorientation\p_framed_anchoring\relax
+ \edef\p_xanchor{\framedparameter\c!xanchor}%
+ \edef\p_yanchor{\framedparameter\c!yanchor}%
+ \setbox\b_framed_normal\hpack{\hpack % here
+ % using the keyword approachs works ok, don't mess with orientation
+ % directly here using \boxorientation ... it doesn't work that well
+ \s!orientation\scratchcounter
+ \ifx\p_xanchor\empty\else \s!xoffset \p_xanchor\fi
+ \ifx\p_yanchor\empty\else \s!yoffset \p_yanchor\fi
+ {\box\b_framed_normal}}}
+
+\installcorenamespace{framedlocatorbefore}
+\installcorenamespace{framedlocatorafter}
+
+\newconstant\frameddimensionstate % global state: 0=unknown 1=width 2=height 3=both
+
+\def\pack_framed_fake_box
+ {\setbox\scratchbox\emptyhbox
+ \wd\scratchbox\wd\b_framed_normal
+ \ht\scratchbox\ht\b_framed_normal
+ \dp\scratchbox\dp\b_framed_normal
+ \setbox\b_framed_normal\box\scratchbox}
+
+\def\installframedlocator#1#2#3%
+ {\setvalue{\??framedlocatorbefore#1}{#2}%
+ \setvalue{\??framedlocatorafter #1}{#3}}
+
+\def\pack_framed_locator_before#1{\begincsname\??framedlocatorbefore#1\endcsname}
+\def\pack_framed_locator_after #1{\begincsname\??framedlocatorafter #1\endcsname}
+
+\newdimen\d_framed_locator_ht
+\newdimen\d_framed_locator_dp
+\newdimen\d_framed_locator_lo
+\newdimen\d_framed_locator_ro
+
+\def\pack_framed_locator_set#1%
+ {\d_framed_locator_ht\dimexpr
+ #1+\d_framed_linewidth
+ \ifconditional\c_framed_has_offset
+ +\framedparameter\c!offset
+ \fi
+ +\framedparameter\c!toffset
+ \relax
+ \d_framed_locator_dp\dimexpr\ht\b_framed_normal-\d_framed_locator_ht\relax}
+
+\def\pack_framed_locator_set_lo
+ {\global\d_framed_locator_lo\dimexpr
+ \d_framed_linewidth
+ \ifconditional\c_framed_has_offset
+ +\framedparameter\c!offset
+ \fi
+ +\framedparameter\c!loffset
+ \relax}
+
+\def\pack_framed_locator_set_ro
+ {\global\d_framed_locator_ro\dimexpr
+ \d_framed_linewidth
+ \ifconditional\c_framed_has_offset
+ +\framedparameter\c!offset
+ \fi
+ +\framedparameter\c!roffset
+ \relax}
+
+% \ruledhbox
+% {A
+% \framed[width=2cm,align=middle,location=hanging]{location\\equals\\hanging}
+% \framed[width=2cm,align=middle,location=depth] {location\\equals\\depth}
+% \framed[width=2cm,align=middle,location=height] {location\\equals\\height}
+% B}
+% \vskip2cm
+% \ruledhbox
+% {A
+% \framed[width=2cm,align=middle,location=low] {location\\equals\\low}
+% \framed[width=2cm,align=middle,location=line] {location\\equals\\line}
+% \framed[width=2cm,align=middle,location=high] {location\\equals\\high}
+% B}
+% \vskip2cm
+% \ruledhbox
+% {A
+% \framed[width=2cm,align=middle,location=top] {location\\equals\\top}
+% \framed[width=2cm,align=middle,location=bottom] {location\\equals\\bottom}
+% \framed[width=2cm,align=middle,location=lohi] {location\\equals\\lohi}
+% \framed[width=2cm,align=middle,location=middle] {location\\equals\\middle}
+% B}
+
+% \installframedlocator \v!hanging % best with strut=no
+% {}
+% {\dp\b_framed_normal\ht\b_framed_normal
+% \ht\b_framed_normal\zeropoint}
+%
+% \installframedlocator \v!depth
+% {}
+% {\ht\b_framed_normal\dimexpr\ht\b_framed_normal-\strutdp\relax
+% \dp\b_framed_normal\strutdp
+% \box\b_framed_normal}
+%
+% \installframedlocator \v!height
+% {}
+% {\dp\b_framed_normal\dimexpr\ht\b_framed_normal-\strutht\relax
+% \ht\b_framed_normal\strutht
+% \box\b_framed_normal}
+
+\installframedlocator \v!hanging % best with strut=no *1* / see mail to list by SB
+ {}
+ {\scratchdimen\ht\b_framed_normal
+ \setbox\b_framed_normal\hpack{\lower\scratchdimen\box\b_framed_normal}%
+ \dp\b_framed_normal\scratchdimen
+ \ht\b_framed_normal\zeropoint
+ \box\b_framed_normal}
+
+\installframedlocator \v!depth % *1*
+ {}
+ {\setbox\b_framed_normal\hpack{\lower\strutdp\box\b_framed_normal}%
+ \ht\b_framed_normal\dimexpr\ht\b_framed_normal-\strutdp\relax
+ \dp\b_framed_normal\strutdp
+ \box\b_framed_normal}
+
+\installframedlocator \v!height % *1*
+ {}
+ {\scratchdimen\dimexpr \ht\b_framed_normal - \strutht \relax
+ \setbox\b_framed_normal\hpack{\lower\scratchdimen\box\b_framed_normal}%
+ \dp\b_framed_normal\dimexpr\ht\b_framed_normal-\strutht\relax
+ \ht\b_framed_normal\strutht
+ \box\b_framed_normal}
+
+\installframedlocator \v!high
+ {}
+ {\pack_framed_locator_set\strutht
+ \setbox\b_framed_normal\hpack{\lower\d_framed_locator_dp\box\b_framed_normal}%
+ \ht\b_framed_normal\strutht
+ \dp\b_framed_normal\strutdp
+ \hpack{\box\b_framed_normal}} % why do we pack .. dange of loosing?
+
+\installframedlocator \v!line
+ {}
+ {\setbox\b_framed_normal\hpack{\lower.5\ht\b_framed_normal\box\b_framed_normal}%
+ \ht\b_framed_normal.5\lineheight
+ \dp\b_framed_normal.5\lineheight
+ \hpack{\box\b_framed_normal}} % why do we pack .. dange of loosing?
+
+\installframedlocator \v!low
+ {}
+ {\pack_framed_locator_set\strutdp
+ \setbox\b_framed_normal\hpack{\lower\d_framed_locator_ht\box\b_framed_normal}%
+ \ht\b_framed_normal\strutht
+ \dp\b_framed_normal\strutdp
+ \box\b_framed_normal}
+
+\installframedlocator \v!top
+ {}
+ {\pack_framed_locator_set\strutht
+ \setbox\b_framed_normal\hpack{\lower\d_framed_locator_dp\box\b_framed_normal}%
+ \ht\b_framed_normal\d_framed_locator_ht
+ \dp\b_framed_normal\d_framed_locator_dp
+ \hpack{\box\b_framed_normal}} % why do we pack .. dange of loosing?
+
+\installframedlocator \v!middle
+ {}
+ {\scratchdimen.5\ht\b_framed_normal
+ \setbox\b_framed_normal\hpack{\lower\scratchdimen\box\b_framed_normal}%
+ \ht\b_framed_normal\scratchdimen
+ \dp\b_framed_normal\scratchdimen
+ \hpack{\box\b_framed_normal}} % why do we pack .. dange of loosing?
+
+\installframedlocator \v!lohi % maybe also \v!center
+ {\pack_framed_locator_before\v!middle}
+ {\pack_framed_locator_after \v!middle}
+
+\installframedlocator \v!bottom
+ {}
+ {\pack_framed_locator_set\strutdp
+ \setbox\b_framed_normal\hpack{\lower\d_framed_locator_ht\box\b_framed_normal}%
+ \ht\b_framed_normal\d_framed_locator_dp
+ \dp\b_framed_normal\d_framed_locator_ht
+ \hpack{\box\b_framed_normal}} % why do we pack .. dange of loosing?
+
+\installframedlocator \v!keep % retains height/depth
+ {\pack_framed_remove_depth}
+ {\pack_framed_restore_depth}
+
+\newdimen\d_framed_formula
+
+\installframedlocator \v!formula % private, will become a more generic name
+ {}
+ {\pack_framed_locator_set\d_framed_formula
+ \setbox\b_framed_normal\hpack{\lower\d_framed_locator_dp\box\b_framed_normal}%
+ \ht\b_framed_normal\d_framed_locator_ht
+ \dp\b_framed_normal\d_framed_locator_dp
+ \hpack{\box\b_framed_normal}} % why do we pack .. danger of loosing?
+
+% also used in fastlocalframed
+
+\newdimen\d_framed_original_wd
+\newdimen\d_framed_original_ht
+\newdimen\d_framed_original_dp
+
+\def\pack_framed_remove_depth
+ {\d_framed_original_wd\wd\b_framed_normal
+ \d_framed_original_ht\ht\b_framed_normal
+ \d_framed_original_dp\dp\b_framed_normal
+ \ifzeropt\d_framed_original_dp\else
+ \setbox\b_framed_normal\hpack{\raise\d_framed_original_dp\box\b_framed_normal}%
+ \fi
+ \wd\b_framed_normal\d_framed_original_wd
+ \ht\b_framed_normal\dimexpr\d_framed_original_ht+\d_framed_original_dp\relax
+ \dp\b_framed_normal\zeropoint}
+
+\def\pack_framed_restore_depth
+ {\ifzeropt\d_framed_original_dp \else
+ \setbox\b_framed_normal\hpack{\lower\d_framed_original_dp\box\b_framed_normal}%
+ \fi
+ \wd\b_framed_normal\d_framed_original_wd
+ \ht\b_framed_normal\d_framed_original_ht
+ \dp\b_framed_normal\d_framed_original_dp}
+
+% \framed[width=12cm,height=3cm,orientation=0]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=90]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=180]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=270]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=-90]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=-180]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=-270]{\input ward\relax}
+
+\def\pack_framed_start_orientation
+ {\ifcase\p_framed_orientation
+ \let\pack_framed_stop_orientation\relax
+ \else
+ \let\pack_framed_stop_orientation\pack_framed_stop_orientation_indeed
+ \fi}
+
+\def\pack_framed_stop_orientation_indeed
+ {\setbox\b_framed_normal\hpack{\dorotatebox\p_framed_orientation\hpack{\box\b_framed_normal}}%
+ \d_framed_height\ht\b_framed_normal
+ \d_framed_width \wd\b_framed_normal}
+
+%D The last conditional takes care of the special situation of in||line \inframed
+%D [height=3cm] {framed} boxes. Such boxes have to be \inframed {aligned} with the
+%D running text.
+
+\unexpanded\def\inframed
+ {\dosingleempty\pack_framed_inline}
+
+% \def\pack_framed_inline[#1]%
+% {\framed[\c!location=\v!low,#1]}
+%
+% or:
+
+\def\pack_framed_inline[%
+ {\framed[\c!location=\v!low,}
+
+%D When we set \type{empty} to \type{yes}, we get ourselves a frame and/or background,
+%D but no content, so actually we have a sort of phantom framed box.
+
+%D \macros
+%D {mframed, minframed}
+%D
+%D When Tobias asked how to frame mathematical elements in formulas, Taco's posted the
+%D next macro:
+%D
+%D \starttyping
+%D \def\mframed#1%
+%D {\relax
+%D \ifmmode
+%D \vcenter{\hbox{\framed{$\ifinner\else\displaystyle\fi#1$}}}%
+%D \else
+%D \framed{$#1$}%
+%D \fi}
+%D \stoptyping
+%D
+%D Because \type {\ifinner} does not (always) reports what one would expect, we move the
+%D test to the outer level. We also want to pass arguments,
+%D
+%D \starttyping
+%D \def\mframed%
+%D {\dosingleempty\domframed}
+%D
+%D \def\domframed[#1]#2% % tzt \dowithnextmathbox ?
+%D {\relax
+%D \ifmmode
+%D \ifinner
+%D \inframed[#1]{$#2$}%
+%D \else
+%D \vcenter{\hbox{\framed[#1]{$\displaystyle#2$}}}%
+%D \fi
+%D \else
+%D \inframed[#1]{$#2$}%
+%D \fi}
+%D \stoptyping
+%D
+%D Still better is the next alternative, if only because it takes care of setting the super-
+%D and subscripts styles
+
+\newcount\c_framed_mstyle
+
+\unexpanded\def\pack_framed_math_strut
+ {\Ustartmath
+ \triggermathstyle\c_framed_mstyle
+ \vphantom{(}%
+ \Ustopmath}
+
+\installcorenamespace{mathframed}
+
+\installframedcommandhandler \??mathframed {mathframed} \??mathframed
+
+\appendtoks
+ \setuevalue{\currentmathframed}{\pack_framed_mathframed{\currentmathframed}}%
+\to \everydefinemathframed
+
+\unexpanded\def\pack_framed_mathframed#1%
+ {\begingroup
+ \edef\currentmathframed{#1}%
+ \dosingleempty\pack_framed_mathframed_indeed}
+
+\newcount\c_pack_framed_mathframed
+\newtoks \t_pack_framed_mathframed
+
+\def\pack_framed_math_pos
+ {\global\advance\c_pack_framed_mathframed\plusone
+ \xdef\pack_framed_mc_one{mcf:1:\number\c_pack_framed_mathframed}%
+ \xdef\pack_framed_mc_two{mcf:2:\number\c_pack_framed_mathframed}%
+ \xypos\pack_framed_mc_two}
+
+\def\pack_framed_mathframed_indeed[#1]#2% no fancy nesting supported here
+ {\iffirstargument
+ \setupcurrentmathframed[#1]%
+ \fi
+ \c_framed_mstyle\mathstyle
+ \edef\m_framed_location{\mathframedparameter\c!location}%
+ \ifx\m_framed_location\v!mathematics
+ \let\normalstrut\pack_framed_math_pos
+ \orelse\ifx\m_framed_location\v!low\else
+ \let\normalstrut\pack_framed_math_strut
+ \fi
+ \inheritedmathframedframed\bgroup
+ \Ustartmath
+ \triggermathstyle\c_framed_mstyle
+ \the\t_pack_framed_mathframed
+ #2%
+ \Ustopmath
+ \egroup
+ \endgroup}
+
+\appendtoks
+ \mathraggedstatus\plustwo % makes \startalign work
+ \eqalignmode \zerocount % makes \startalign fit
+\to \t_pack_framed_mathframed
+
+\installframedlocator \v!mathematics
+ {}
+ {\lower\dimexpr\MPy\pack_framed_mc_two-\MPy\pack_framed_mc_one\relax
+ \hpack{\xypos\pack_framed_mc_one\box\b_framed_normal}}
+
+\definemathframed[mframed]
+\definemathframed[inmframed][\c!location=\v!low]
+\definemathframed[mcframed] [\c!location=\v!mathematics]
+
+%D So instead of the rather versatile \type {\framed}, we use \type {\mframed}:
+%D
+%D \startbuffer
+%D \startformula
+%D x \times \mframed{y} \times y^{z_z}
+%D x \times \inmframed{y} \times y^{z_z}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D And:
+%D
+%D \startbuffer
+%D \startformula
+%D x \times \mframed{y} \times y^{\mframed{z}_{\mframed{z}}}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D As usual, one can specify in what way the text should be framed. One should be
+%D aware of the fact that, inorder to preserve the proper spacing, the \type
+%D {offset} is set to \type {overlay} and \type {frameoffset} is used used instead.
+%D
+%D \startbuffer
+%D \startformula
+%D x \times y^{\mframed[framecolor=red]{z}_{z}}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D For inline use, we also provide the \type {\inmframed} alternative: we want $x
+%D \times \inmframed{y}$ in inline math, right?
+
+%D This previous framing macros needs a lot of alternatives for putting rules around
+%D boxes, inserting offsets and aligning text. Each step is handled by separate macros.
+
+\newdimen\d_framed_applied_offset
+\newdimen\d_framed_loffset
+\newdimen\d_framed_roffset
+\newdimen\d_framed_toffset
+\newdimen\d_framed_boffset
+
+\def\pack_framed_check_extra_offsets % we could check h and v indepently
+ {\setfalse\c_framed_has_extra_offset
+ \d_framed_loffset\framedparameter\c!loffset\relax
+ \d_framed_roffset\framedparameter\c!roffset\relax
+ \d_framed_toffset\framedparameter\c!toffset\relax
+ \d_framed_boffset\framedparameter\c!boffset\relax
+ \ifzeropt\d_framed_loffset\else \advance\d_framed_width -\d_framed_loffset \settrue\c_framed_has_extra_offset \fi
+ \ifzeropt\d_framed_roffset\else \advance\d_framed_width -\d_framed_roffset \settrue\c_framed_has_extra_offset \fi
+ \ifzeropt\d_framed_toffset\else \advance\d_framed_height-\d_framed_toffset \settrue\c_framed_has_extra_offset \fi
+ \ifzeropt\d_framed_boffset\else \advance\d_framed_height-\d_framed_boffset \settrue\c_framed_has_extra_offset \fi}
+
+\def\pack_framed_apply_extra_offsets
+ {\setbox\b_framed_normal\vpack\bgroup
+ \advance\d_framed_toffset\d_framed_applied_offset
+ \advance\d_framed_boffset\d_framed_applied_offset
+ \advance\d_framed_loffset\d_framed_applied_offset
+ \advance\d_framed_roffset\d_framed_applied_offset
+ \kern\d_framed_toffset
+ \hpack\bgroup
+ \kern\d_framed_loffset
+ \box\b_framed_normal
+ \kern\d_framed_roffset
+ \egroup
+ \kern\d_framed_boffset
+ \egroup}
+
+\def\pack_framed_widen_box
+ {\setbox\b_framed_normal\vpack
+ {\kern\d_framed_applied_offset
+ \hpack{\kern\d_framed_applied_offset\box\b_framed_normal\kern\d_framed_applied_offset}%
+ \kern\d_framed_applied_offset}}
+
+%D Let's hope that the next few examples show us enough of what needs to be
+%D done by the auxiliary macros.
+%D
+%D \startbuffer
+%D \framed[height=1cm,offset=.5cm] {rule based learning}
+%D \framed[height=1cm,offset=0cm] {rule based learning}
+%D \framed[height=1cm,offset=none] {rule based learning}
+%D \framed[height=1cm,offset=overlay]{rule based learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D \startbuffer
+%D \framed[offset=.5cm] {rule based learning}
+%D \framed[offset=0cm] {rule based learning}
+%D \framed[offset=none] {rule based learning}
+%D \framed[offset=overlay]{rule based learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D \startbuffer
+%D \framed[strut=no,offset=.5cm] {rule based learning}
+%D \framed[strut=no,offset=0cm] {rule based learning}
+%D \framed[strut=no,offset=none] {rule based learning}
+%D \framed[strut=no,offset=overlay]{rule based learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D \startbuffer
+%D \framed[width=3cm,align=left] {rule\\based\\learning}
+%D \framed[width=3cm,align=middle] {rule\\based\\learning}
+%D \framed[width=3cm,align=right] {rule\\based\\learning}
+%D \framed[width=fit,align=middle] {rule\\based\\learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\dontcomplain\getbuffer}
+%D \stoplinecorrection
+%D
+%D So now we're ready for the complicated stuff. We distinguish between borders with
+%D straight lines and those with round corners. When using the first alternative it
+%D is possible to turn off one or more lines. More fancy shapes are also possible by
+%D specifying dedicated backgrounds. Turning lines on and off is implemented as
+%D efficient as possible and as a result is interface language dependant. This next
+%D implementation evolved from simpler ones. It puts for instance the rules on top
+%D of the content and provides additional offset capabilities. The lot of calls to
+%D other macros makes this mechanism not that easy to comprehend.
+%D
+%D We handle left, right or middle alignment as well as fixed or free widths and
+%D heights. Each combination gets its own macro.
+%D
+%D The following code handles one-liners: \type {align={line,flushright}}. Beware,
+%D since we entered a group and either or not grab the next bgroup token, we need to
+%D finish the group in the oneliner mode.
+
+\ifdefined\raggedonelinerstate \else \newconditional\raggedonelinerstate \fi
+
+\def\doformatonelinerbox % beware: assumes explicit preceding bgroup
+ {\ifconditional\raggedonelinerstate
+ \expandafter\dodoformatonelinerbox
+ \else
+ \expandafter\nodoformatonelinerbox
+ \fi}
+
+\def\dodoformatonelinerbox
+ {\afterassignment\redoformatonelinerbox
+ \setbox\nextbox\hbox} % maybe \hpack
+
+\def\redoformatonelinerbox
+ {\aftergroup\dododoformatonelinerbox
+ \ignorespaces}
+
+\def\dododoformatonelinerbox
+ {\hpack to \hsize % was \hbox
+ {\ifcase\raggedstatus\or\hss\or\hss \fi
+ \unhbox\nextbox \removeunwantedspaces
+ \ifcase\raggedstatus\or \or\hss\or\hss\fi}%
+ \egroup}
+
+\def\nodoformatonelinerbox % grabs {
+ {\let\next=}
+
+%D The handlers:
+
+% Beware, we have a \noindent so an empty line is indeed an empty line and
+% the \synchronizeinlinedirection triggers a vbox instead of a line.
+%
+% \startTEXpage[offset=0.5ex,align={lohi,middle}]
+%
+% \vbox{\hbox{x}}
+% \stopTEXpage
+%
+% \startTEXpage[offset=0.5ex,align={lohi,middle}]
+% \vbox{\hbox{x}}
+% \stopTEXpage
+
+% \def\pack_framed_forgetall{\forgetall}
+
+\def\pack_framed_set_foregroundcolor
+ {\edef\p_framed_foregroundcolor{\framedparameter\c!foregroundcolor}%
+ \ifx\p_framed_foregroundcolor\empty\else\dousecolorparameter\p_framed_foregroundcolor\fi}
+
+\def\pack_framed_do_setups
+ {\ifx\p_framed_setups\empty \else
+ \setups[\p_framed_setups]% \texsetup (or only one!)
+ % \fastsetup\p_framed_setup % singular would have been better
+ \fi}
+
+\def\pack_framed_format_format_yes
+ {\vbox to \d_framed_height
+ \bgroup
+ \let\postprocessframebox\relax
+ % \pack_framed_forgetall
+ \iftrialtypesetting \else
+ \pack_framed_set_foregroundcolor
+ \fi
+ \oninterlineskip
+ \hsize\d_framed_width
+ \vsize\d_framed_height
+ \pack_framed_do_setups
+ \raggedcommand
+ \pack_framed_do_top
+ \bgroup
+ \synchronizeinlinedirection
+ \localbegstrut
+ \aftergroup\localendstrut
+ \aftergroup\pack_framed_do_bottom
+ \aftergroup\egroup
+ \doformatonelinerbox}
+
+\def\pack_framed_format_format_nop
+ {\vbox to \d_framed_height
+ \bgroup
+ \let\postprocessframebox\relax
+ % \pack_framed_forgetall
+ \iftrialtypesetting \else
+ \pack_framed_set_foregroundcolor
+ \fi
+ \oninterlineskip
+ \hsize\d_framed_width
+ \vsize\d_framed_height
+ \pack_framed_do_setups
+ \raggedcenter
+ \vss
+ \bgroup
+ \synchronizeinlinedirection
+ \localbegstrut
+ \aftergroup\localendstrut
+ \aftergroup\vss
+ \aftergroup\egroup
+ \doformatonelinerbox}
+
+\def\pack_framed_format_format_height
+ {\vbox to \d_framed_height
+ \bgroup
+ \let\postprocessframebox\relax
+ % \pack_framed_forgetall
+ \iftrialtypesetting \else
+ \pack_framed_set_foregroundcolor
+ \fi
+ \oninterlineskip
+ \pack_framed_do_setups
+ \raggedcommand
+ \vss
+ \bgroup
+ \aftergroup\localendstrut
+ \aftergroup\vss
+ \aftergroup\egroup
+ \synchronizeinlinedirection
+ \localbegstrut
+ \doformatonelinerbox}
+
+\def\pack_framed_format_format_width
+ {\vbox
+ \bgroup
+ \let\postprocessframebox\relax
+ % \pack_framed_forgetall
+ \iftrialtypesetting \else
+ \pack_framed_set_foregroundcolor
+ \fi
+ \oninterlineskip
+ \hsize\d_framed_width
+ \pack_framed_do_setups
+ \raggedcommand
+ \pack_framed_do_top
+ \bgroup
+ \synchronizeinlinedirection
+ \localbegstrut
+ \aftergroup\localendstrut
+ \aftergroup\pack_framed_do_bottom
+ \aftergroup\egroup
+ \doformatonelinerbox}
+
+\def\pack_framed_format_format_vsize
+ {\vbox to \d_framed_height % no vpack .. maybe grid
+ \bgroup
+ \let\postprocessframebox\relax
+ % \pack_framed_forgetall
+ \iftrialtypesetting \else
+ \pack_framed_set_foregroundcolor
+ \fi
+ \vsize\d_framed_height
+ \pack_framed_do_setups
+ \vss
+ \bgroup
+ \aftergroup\vss
+ \aftergroup\egroup
+ \hbox
+ \bgroup
+ \aftergroup\egroup
+ \synchronizeinlinedirection
+ \localstrut
+ \doformatonelinerbox}
+
+\def\pack_framed_format_format_hsize
+ {\hbox to \d_framed_width
+ \bgroup
+ \let\postprocessframebox\relax
+ % \pack_framed_forgetall
+ \iftrialtypesetting \else
+ \pack_framed_set_foregroundcolor
+ \fi
+ \pack_framed_do_setups
+ \hss
+ \synchronizeinlinedirection
+ \localstrut
+ \bgroup
+ \aftergroup\hss
+ \aftergroup\egroup
+ \doformatonelinerbox}
+
+\def\pack_framed_format_format_no_size
+ {\hbox
+ \bgroup
+ \iftrialtypesetting \else
+ \pack_framed_set_foregroundcolor
+ \fi
+ \let\postprocessframebox\relax
+ \pack_framed_do_setups
+ \synchronizeinlinedirection
+ \localstrut
+ \doformatonelinerbox}
+
+%D On the next page we show some examples of how these macros come into action. The
+%D examples show us how \type {fit}, \type {broad} dimensions influence the
+%D formatting. Watch the visualized struts. \footnote {Here we used \type
+%D {\showstruts}.}
+%D
+%D \startpostponing
+%D \bgroup
+%D \showstruts
+%D \dontcomplain
+%D \starttabulate[|c|c|c|c|c|c|]
+%D % \HL
+%D \NC \framed[width=.2\hsize, height=.2\hsize, align=] {a\endgraf b\endgraf c}
+%D \NC \framed[width=.2\hsize, height=broad, align=] {a\endgraf b\endgraf c}
+%D \NC \framed[width=.2\hsize, height=fit, align=] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=.2\hsize, align=] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=broad, align=] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=fit, align=] {a\endgraf b\endgraf c}
+%D \NC \NR
+%D % \HL
+%D \NC \framed[width=.2\hsize, height=.2\hsize, align=yes] {a\endgraf b\endgraf c}
+%D \NC \framed[width=.2\hsize, height=broad, align=yes] {a\endgraf b\endgraf c}
+%D \NC \framed[width=.2\hsize, height=fit, align=yes] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=.2\hsize, align=yes] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=broad, align=yes] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=fit, align=yes] {a\endgraf b\endgraf c}
+%D \NC \NR
+%D % \HL
+%D \NC \framed[width=.2\hsize, height=.2\hsize, align=right] {a\endgraf b\endgraf c}
+%D \NC \framed[width=.2\hsize, height=broad, align=right] {a\endgraf b\endgraf c}
+%D \NC \framed[width=.2\hsize, height=fit, align=right] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=.2\hsize, align=right] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=broad, align=right] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=fit, align=right] {a\endgraf b\endgraf c}
+%D \NC \NR
+%D % \HL
+%D \NC \framed[width=.2\hsize, height=.2\hsize, align=left] {a\endgraf b\endgraf c}
+%D \NC \framed[width=.2\hsize, height=broad, align=left] {a\endgraf b\endgraf c}
+%D \NC \framed[width=.2\hsize, height=fit, align=left] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=.2\hsize, align=left] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=broad, align=left] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=fit, align=left] {a\endgraf b\endgraf c}
+%D \NC \NR
+%D % \HL
+%D \NC \framed[width=.2\hsize, height=.2\hsize, align=middle] {a\endgraf b\endgraf c}
+%D \NC \framed[width=.2\hsize, height=broad, align=middle] {a\endgraf b\endgraf c}
+%D \NC \framed[width=.2\hsize, height=fit, align=middle] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=.2\hsize, align=middle] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=broad, align=middle] {a\endgraf b\endgraf c}
+%D \NC \framed[width=fit, height=fit, align=middle] {a\endgraf b\endgraf c}
+%D \NC \NR
+%D % \HL
+%D \stoptabulate
+%D \egroup
+%D \stoppostponing
+
+%D \macros
+%D {framednoflines, framedlastlength}
+%D
+%D It is possible to let the frame macro calculate the width of a centered box
+%D automatically (\type {fit}). When doing so, we need to reshape the box:
+
+\newcount\framednoflines
+\newdimen\framedfirstheight
+\newdimen\framedlastdepth
+\newdimen\framedminwidth
+\newdimen\framedmaxwidth
+\newdimen\framedaveragewidth
+
+\def\pack_framed_reshape_reset
+ {\framednoflines \zerocount
+ \framedfirstheight \zeropoint
+ \framedlastdepth \zeropoint
+ \framedminwidth \zeropoint
+ \framedmaxwidth \zeropoint
+ \framedaveragewidth\zeropoint}
+
+\def\pack_framed_reshape_process{\ifvbox\b_framed_normal\clf_doreshapeframedbox\b_framed_normal\relax\fi}
+\def\pack_framed_reshape_analyze{\ifvbox\b_framed_normal\clf_doanalyzeframedbox\b_framed_normal\relax\fi}
+
+% torture test / strange case (much depth) / method 2 needed
+%
+% \startTEXpage[frame=on]
+% \startformula \startalign \NC A \NC B \NR \intertext{test} \NC C \NC D \NR \stopalign \stopformula
+% test outside formula
+% \startformula \startalign \NC A \NC B \NR \intertext{test} \NC C \NC D \NR \stopalign \stopformula
+% \blank[big]
+% \startformula \startalign \NC \int_01 \NC B \NR \intertext{test} \NC \int_01 \NC D \NR \stopalign \stopformula
+% test outside formula
+% \startformula \startalign \NC \int_01 \NC B \NR \intertext{test} \NC \int_01 \NC D \NR \stopalign \stopformula
+% \stopTEXpage
+
+%D The examples on the next page show how one can give the frame as well as the
+%D background an additional offset and even a bit more depth. The blue outline is
+%D the frame, the red box is the background and the small black outline is the
+%D visualization of the resulting box, that is, we applied \type {\ruledhbox} to
+%D the result.
+%D
+%D \startpostponing
+%D \bgroup
+%D \unprotect
+%D \dontcomplain
+%D
+%D \startbuffer
+%D \unprotect
+%D \vbox to \vsize
+%D \bgroup
+%D \startalignment[middle]
+%D \vss
+%D \dontleavehmode\vbox to .8\vsize
+%D \bgroup
+%D \hsize=300pt
+%D \setupframed
+%D [background=color,
+%D backgroundcolorachtergrondkleur=darkred,
+%D width=300pt,
+%D height=60pt,
+%D framecolorkaderkleur=DemoBlue,
+%D rulethickness=2pt]
+%D \def\status%
+%D {backgroundoffset=\the\dimexpr\framedparameter\c!backgroundoffset\relax\\
+%D frameoffset=\the\dimexpr\framedparameter\c!frameoffset\relax\\
+%D depth=\the\dimexpr\framedparameter\c!depth\relax}
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=0pt,frameoffset=0pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=5pt,frameoffset=0pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=0pt,frameoffset=5pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=2pt,frameoffset=5pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=5pt,frameoffset=2pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=5pt,frameoffset=5pt]{\status}}
+%D \egroup
+%D \vss
+%D \stopalignment
+%D \egroup
+%D \protect
+%D \stopbuffer
+%D
+%D \getbuffer \page
+%D
+%D {\setupframed[depth=4pt]\getbuffer} \page
+%D
+%D \protect
+%D \egroup
+%D \stoppostponing
+
+%D We can draw lines from left to right and top to bottom by using the normal \type
+%D {\hairline} command. Both directions need a different treatment.
+%D
+%D \startbuffer
+%D \framed[width=4cm] {alfa\hairline beta\hairline gamma}
+%D \framed[height=2cm] {alfa\hairline beta\hairline gamma}
+%D \framed[width=4cm,height=2cm]{alfa\hairline beta\hairline gamma}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D These macros try to adapt their behaviour as good as possible to the circumstances
+%D and act as natural as possible.
+
+\unexpanded\def\pack_framed_vboxed_hairline % nasty overlay mess .. needed for autowidth
+ {\begingroup
+ \scratchoffset\ifconditional\c_framed_has_offset \localoffset \else \zeropoint \fi
+ \scratchwidth \dimexpr\scratchoffset+\d_framed_linewidth\relax
+ \par
+ \nointerlineskip
+ \kern\scratchoffset
+ \dontleavehmode
+ \hrule\s!height\d_framed_linewidth\s!depth\zeropoint
+ \par
+ \kern-\d_framed_linewidth
+ \dontleavehmode
+ \hpack to \zeropoint{\hss\vrule\s!height\d_framed_linewidth\s!depth\zeropoint\s!width\scratchwidth}%
+ \hfill
+ \hpack to \zeropoint{\vrule\s!height\d_framed_linewidth\s!depth\zeropoint\s!width\scratchwidth\hss}%
+ \par
+ \nointerlineskip
+ \kern\scratchoffset
+ \nointerlineskip
+ \endgraf
+ \nointerlineskip
+ \localbegstrut
+ \endgroup}
+
+\unexpanded\def\pack_framed_hboxed_hairline % use framed dimen
+ {\bgroup
+ \scratchoffset\ifconditional\c_framed_has_offset \localoffset \else \zeropoint \fi
+ \ifconditional\c_framed_has_height
+ \dimen\scratchheight\dimexpr\localheight/\plustwo+\strutdp-\plustwo\d_framed_linewidth\relax
+ \dimen\scratchdepth \dimexpr\localheight/\plustwo-\strutdp+\plustwo\d_framed_linewidth\relax
+ \else
+ \dimen\scratchheight\dimexpr\strutht+\scratchoffset\relax
+ \dimen\scratchdepth \dimexpr\strutdp+\scratchoffset\relax
+ \fi
+ \unskip
+ \setbox\scratchbox\hpack
+ {\kern\scratchoffset
+ \vrule\s!height\dimen\scratchheight\s!depth\dimen\scratchdepth\s!width\d_framed_linewidth
+ \kern\scratchoffset}%
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \box\scratchbox
+ \ignorespaces
+ \egroup}
+
+%D The argument of the frame command accepts \type{\\} as a sort of newline signal. In
+%D horizontal boxes it expands to a space.
+
+\unexpanded\def\pack_framed_vboxed_newline
+ {\endgraf\ignorespaces}
+
+\unexpanded\def\pack_framed_hboxed_newline
+ {\unskip\normalspace\ignorespaces}
+
+%D We can set each rule on or off. The default setting is inherited from
+%D \type {frame}. An earlier implementation use a bit different approach, but the new
+%D one seems more natural:
+%D
+%D \bgroup
+%D \setuptyping[margin=0pt]
+%D \startlinecorrection
+%D \startbuffer
+%D \framed[offset=overlay,frame=on]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=on,bottomframe=off]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=on,bottomframe=on]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=off]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=off,bottomframe=off]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=off,bottomframe=on]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D \stoplinecorrection
+%D \egroup
+
+%D \macros
+%D {startframedtext, setupframedtexts, defineframedtext}
+%D
+%D The general framing command we discussed previously, is not entirely suited for
+%D what we call framed texts, as for instance used in intermezzo's. The next
+%D examples show what we have in mind.
+%D
+%D \startbuffer[framed-0]
+%D \setupframedtexts
+%D [frame=off,
+%D width=\hsize,
+%D background=screen]
+%D
+%D \startframedtext
+%D By default the framed text is centered \dots
+%D \stopframedtext
+%D
+%D \startframedtext[right]
+%D \dots\ but we can also align left, middle and right.
+%D \stopframedtext
+%D \stopbuffer
+%D
+%D \startbuffer[framed-1]
+%D \defineframedtext
+%D [Example]
+%D [width=6cm,
+%D height=5cm]
+%D
+%D \startExample
+%D \typebuffer[framed-1]
+%D \stopExample
+%D \stopbuffer
+%D
+%D \startbuffer[framed-2]
+%D \defineframedtext
+%D [Example]
+%D [width=6cm]
+%D
+%D \startExample
+%D \typebuffer[framed-2]
+%D \stopExample
+%D \stopbuffer
+%D
+%D \startbuffer[framed-3]
+%D \defineframedtext
+%D [Example]
+%D [height=5cm]
+%D
+%D \startExample
+%D \typebuffer[framed-3]
+%D \stopExample
+%D \stopbuffer
+%D
+%D \startbuffer[framed-4]
+%D \defineframedtext
+%D [Example]
+%D [width=fit,height=broad]
+%D
+%D \Example{a very exciting example}
+%D \stopbuffer
+%D
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-0] \egroup
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-1] \egroup
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-2] \egroup
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-3] \egroup
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-4] \egroup
+%D
+%D Here we can see that we have a predefined framed text class as well as the
+%D tools for defining our own. So we have:
+%D
+%D \showsetup{setupframedtexts}
+%D
+%D as well as the definition command:
+%D
+%D \showsetup{defineframedtext}
+%D
+%D that generates two commands:
+%D
+%D \showsetup{start<<framedtext>>}
+%D \showsetup{<<framedtext>>}
+%D
+%D The next definition shows the defaults.
+
+\installcorenamespace{framedtext}
+\installcorenamespace{framedtextlocation}
+
+\installframedcommandhandler \??framedtext {framedtext} \??framedtext
+
+\let\setupframedtexts\setupframedtext
+
+\setupframedtext
+ [\c!width=.75\hsize,
+ \c!height=\v!fit,
+ \c!align=\v!yes,
+ %\c!top=,
+ \c!bottom=\vfill,
+ \c!offset=1em,
+ %\c!bodyfont=,
+ %\c!style=,
+ %\c!color=,
+ %\c!left=,
+ \c!right=\hfill,
+ \c!before=\blank,
+ \c!after=\blank,
+ %\c!inner=,
+ \c!frame=\v!on,
+ %\c!topframe=,
+ %\c!bottomframe=,
+ %\c!leftframe=,
+ %\c!rightframe=,
+ \c!radius=.5\bodyfontsize,
+ \c!corner=\v!rectangular,
+ %\c!orientation=,
+ %\c!indenting=,
+ %\c!foregroundcolor=,
+ %\c!foregroundstyle=,
+ %\c!background=,
+ %\c!backgroundcolor=,
+ \c!linecorrection=\v!on,
+ \c!depthcorrection=\v!on,
+ \c!margin=\v!standard]
+
+\appendtoks
+ \setuevalue{\e!start\currentframedtext}{\pack_framed_text_start {\currentframedtext}}%
+ \setuevalue{\e!stop \currentframedtext}{\pack_framed_text_stop }%
+ \setuevalue {\currentframedtext}{\pack_framed_text_direct{\currentframedtext}}%
+\to \everydefineframedtext
+
+\setvalue{\??framedtextlocation\v!left }{\letframedtextparameter\c!left \relax
+ \letframedtextparameter\c!right\hfill}
+
+\setvalue{\??framedtextlocation\v!right }{\letframedtextparameter\c!left \hfill
+ \letframedtextparameter\c!right\relax}
+
+\setvalue{\??framedtextlocation\v!middle}{\letframedtextparameter\c!left \hfill
+ \letframedtextparameter\c!right\hfill}
+
+\setvalue{\??framedtextlocation\v!none }{\letframedtextparameter\c!left \relax
+ \letframedtextparameter\c!right\relax
+ \settrue\c_framed_text_location_none}
+
+\unexpanded\def\pack_framed_text_start#1%
+ {\bgroup
+ \edef\currentframedtext{#1}%
+ \dodoubleempty\pack_framed_text_start_indeed}
+
+\def\pack_framed_text_start_indeed[#1][#2]%
+ {\doifelseassignment{#1}
+ {\pack_framed_text_start_continue\empty{#1}}
+ {\pack_framed_text_start_continue{#1}{#2}}}
+
+% todo: sort out first/lastline ht/dp
+
+\def\pack_framed_text_start_continue#1#2%
+ {\setupframedtexts[\currentframedtext][#2]%
+ \doifsomething{#1}{\setframedtextparameter\c!location{#1}}% does not listen to #3
+ \setfalse\c_framed_text_location_none
+ \csname\??framedtextlocation\framedtextparameter\c!location\endcsname
+ \resetframedtextparameter\c!location
+ \pack_framed_text_check
+ \setbox\b_framed_normal\vbox % \vpack
+ \startboxedcontent
+ \hsize\localhsize
+ % \insidefloattrue % ? better
+ \usebodyfontparameter\framedtextparameter
+ % \edef\p_framed_text_strut{\letframedtextparameter\c!strut}% to be used
+ \letframedtextparameter\c!strut\v!no
+ \inheritedframedtextframed\bgroup
+ \let\\=\endgraf
+ \edef\p_framed_text_depthcorrection{\framedtextparameter\c!depthcorrection}%
+ \ifx\p_framed_text_depthcorrection\v!on
+ \pack_framed_text_start_depth_correction
+ \else
+ \bgroup
+ \fi
+ \vskip-\strutdp % brrr why is this needed ... needs to be sorted out, see testcase 1
+ \doinhibitblank
+ \useindentingparameter\framedtextparameter
+ \useframedtextstyleandcolor\c!style\c!color
+ \framedtextparameter\c!inner
+ \ignorespaces}
+
+% testcase 1:
+%
+% \showstruts
+% \startframedtext[align={normal,tolerant},offset=0pt] \input tufte \stopframedtext
+% \startframedtext[align={normal,tolerant},offset=0pt,depthcorrection=off] \input tufte \stopframedtext
+% \startframedtext[align={normal,tolerant},offset=0pt,depthcorrection=off] \inframed{x} \stopframedtext
+% \framed[align={normal,tolerant},offset=0pt]{\input tufte }
+
+%D The \type {none} option is handy for nested usage, as in the presentation
+%D styles, where we don't want interference.
+
+\defineplacement[\??framedtext][\s!parent=\??framedtext\currentframedtext]
+
+\unexpanded\def\pack_framed_text_stop % no \baselinecorrection, see faq docs
+ {\endgraf
+ \removelastskip
+ \ifx\p_framed_text_depthcorrection\v!on
+ \pack_framed_text_stop_depth_correction
+ \else
+ \egroup
+ \fi
+ \stopboxedcontent
+ \ifconditional\c_framed_text_location_none
+ \egroup
+ \box\b_framed_normal
+ \orelse\ifinsidefloat
+ \egroup
+ \box\b_framed_normal
+ \else
+ \egroup
+ \placement[\??framedtext][\c!depthcorrection=\v!off]{\box\b_framed_normal}%
+ \fi
+ \egroup}
+
+%D We define the general (and original) case by just saying:
+
+\def\pack_framed_text_check % messy dependency
+ {\localhsize\hsize
+ \ifinsidefloat \orelse \ifdim\d_page_sides_vsize>\zeropoint % also possible: \c_page_sides_checks_done>\zeropoint
+ % \strut % rather clean way to invoke the sidefloat OTR
+ % \setbox0=\lastbox % and get the widths set, so from now on we
+ % \setlocalhsize % can have framed texts alongside sidefloats
+ \checksidefloat
+ \setlocalhsize
+ \fi}
+
+\def\pack_framed_text_start_depth_correction
+ {\bgroup
+ \ifhmode
+ \par
+ \fi
+ \ifvmode
+ \verticalstrut
+ % we need \nowhitespace in case of setups setting whitespace
+ % nb, not safe, text vs \vbox as next
+ \vskip-\struttotal
+ \nowhitespace
+ \fi} % na vskip ! new 20/05/2004, fails with next content being box (\scale{..})
+
+\def\pack_framed_text_stop_depth_correction
+ {\ifhmode
+ \par
+ \fi
+ \ifvmode
+ \forgetall
+ \vskip-\struttotal
+ \verticalstrut
+ \egroup
+ \forgetall % brrr too often
+ \vskip-\lineheight
+ \verticalstrut
+ \else
+ \egroup
+ \fi}
+
+%D Placement can be ignored:
+%D
+%D \starttyping
+%D \hbox to \hsize \bgroup
+%D \startframedtext[none][width=.5\textwidth] \input tufte \stopframedtext
+%D \startframedtext[none][width=.5\textwidth] \input zapf \stopframedtext
+%D \egroup
+%D
+%D \hbox to \hsize \bgroup
+%D \setupframedtexts[location=none]%
+%D \startframedtext[width=.5\textwidth] \input zapf \stopframedtext
+%D \startframedtext[width=.5\textwidth] \input tufte \stopframedtext
+%D \egroup
+%D \stoptyping
+
+%D The simple brace (or group) delimited case is typeset slightly different
+%D and is not aligned.
+
+\unexpanded\def\pack_framed_text_direct#1%
+ {\bgroup
+ \edef\currentframedtext{#1}%
+ \dosingleempty\pack_framed_text_start_direct}
+
+\def\pack_framed_text_start_direct[#1]%
+ {\usebodyfontparameter\framedtextparameter
+ \iffirstargument
+ \setupcurrentframedtext[#1]%
+ \fi
+ \edef\p_framed_text_strut{\framedtextparameter\c!strut}%
+ \letframedtextparameter\c!strut\v!no
+ \inheritedframedtextframed\bgroup
+ \blank[\v!disable]%
+ \let\\=\endgraf
+ \useframedtextstyleandcolor\c!style\c!color
+ \vskip-\strutdp % brrr why is this needed ... needs to be sorted out, see testcase 1
+ \framedtextparameter\c!inner
+ \ifx\p_framed_text_strut\v!no
+ \let\pack_framed_strut\relax
+ \else
+ \let\pack_framed_strut\strut
+ \fi
+ \bgroup
+ \aftergroup\pack_framed_text_stop_direct
+ \afterassignment\ignorespaces
+ \afterassignment\pack_framed_strut
+ \let\next=}
+
+\def\pack_framed_text_stop_direct
+ {\removelastskip
+ \egroup
+ \egroup}
+
+\defineframedtext
+ [\v!framedtext]
+
+%D \macros
+%D {defineframed}
+%D
+%D One can also define simple framed texts, using:
+%D
+%D \showsetup{defineframed}
+%D
+%D As suggested by Wolfgang we can now use the new \MKIV\ inheritance model instead
+%D of passing a combination of arguments. This also also simplified the \type
+%D {\setupframed} command. There are certainly more places where such improvements
+%D can be made.
+
+\appendtoks
+ \ifcsname\??regularframedlevel\currentframed\endcsname
+ % already defined, keeps settings
+ \else
+ \expandafter\newcount\csname\??regularframedlevel\currentframed\endcsname
+ \fi
+\to \everypresetframed
+
+\appendtoks
+ \setuevalue\currentframed{\pack_framed_defined_process[\currentframed]}%
+\to \everydefineframed
+
+\newcount\c_temp_framed_crap
+
+\unexpanded\def\pack_framed_defined_process[#1]% official (not much checking, todo: parent)
+ {\bgroup
+ \ifcsname\??regularframedlevel#1\endcsname
+ %\expandafter\let\expandafter\c_pack_framed_temp\csname\??regularframedlevel#1\endcsname
+ \expandafter\let\expandafter\c_pack_framed_temp\lastnamedcs
+ \else
+ \let\c_pack_framed_temp\c_temp_framed_crap
+ \fi
+ \advance\c_pack_framed_temp\plusone
+ \expandafter\def\csname\??framed#1>\the\c_pack_framed_temp:\s!parent\endcsname{\??framed#1}% \inheritlocalframed
+ \bgroup
+ \edef\currentframed{#1>\the\c_pack_framed_temp}%
+ \pack_framed_initialize
+ \dosingleempty\pack_framed_defined_process_indeed}
+
+\def\pack_framed_defined_process_indeed[#1]%
+ {\iffirstargument % faster
+ \setupcurrentframed[#1]% here !
+ \fi
+ \pack_framed_process_indeed}
+
+\let\placeframed\pack_framed_defined_process % new per 2012/04/23
+
+%D We can do:
+%D
+%D \starttyping
+%D \defineframed[\v!framed]
+%D \stoptyping
+%D
+%D but the existing one is ok as well (less csname messy too).
+
+%D New, for the moment private; let's see when GB finds out about this one and its
+%D obscure usage. It's used in:
+%D
+%D \startbuffer
+%D \defineframedtext
+%D [tabulateframe]
+%D [offset=overlay,
+%D backgroundoffset=3pt,
+%D background=color,
+%D backgroundcolor=green]
+%D
+%D \setuptabulate
+%D [tabulate]
+%D [frame=tabulateframe]
+%D
+%D \setuptables
+%D [frame=tabulateframe]
+%D
+%D \input tufte
+%D
+%D \starttabulate[|l|l|]
+%D \NC test \NC test \NC \NR \NC test \NC test \NC \NR
+%D \NC test \NC test \NC \NR \NC test \NC test \NC \NR
+%D \stoptabulate
+%D
+%D \input tufte
+%D
+%D \starttable[|l|l|]
+%D \NC test \NC test \NC \AR \NC test \NC test \NC \AR
+%D \NC test \NC test \NC \AR \NC test \NC test \NC \AR
+%D \stoptable
+%D \stopbuffer
+%D
+%D \typebuffer
+
+\installcorenamespace{framedcontent}
+
+\installframedcommandhandler \??framedcontent {framedcontent} \??framedcontent
+
+\setupframedcontent
+ [\c!leftoffset=\zeropoint,
+ %\c!rightoffset=\framedcontentparameter\c!leftoffset,
+ \c!rightoffset=\scratchleftoffset,
+ \c!topoffset=\zeropoint,
+ %\c!bottomoffset=\framedcontentparameter\c!topoffset,
+ \c!bottomoffset=\scratchtopoffset,
+ \c!strut=\v!no,
+ %\c!linecorrection=\v!no,
+ %\c!left=,
+ %\c!right=,
+ %\c!width=\v!fit,
+ \c!offset=\v!overlay]
+
+\unexpanded\def\startframedcontent
+ {\dosingleempty\pack_framed_start_content}
+
+\def\pack_framed_start_content[#1]%
+ {\bgroup
+ \edef\currentframedcontent{#1}%
+ \ifx\currentframedcontent\v!off
+ \let\stopframedcontent\egroup
+ \else
+ \checkframedcontentparent
+ \let\stopframedcontent\pack_framed_stop_content_indeed
+ \expandafter\pack_framed_start_content_indeed
+ \fi}
+
+\def\pack_framed_start_content_indeed
+ {\setbox\b_framed_normal\hpack\bgroup
+ \setlocalhsize
+ \hsize\localhsize
+ \scratchleftoffset \framedcontentparameter\c!leftoffset \relax
+ \scratchrightoffset \framedcontentparameter\c!rightoffset \relax
+ \scratchtopoffset \framedcontentparameter\c!topoffset \relax
+ \scratchbottomoffset\framedcontentparameter\c!bottomoffset\relax
+ \advance\hsize\dimexpr-\scratchleftoffset-\scratchrightoffset \relax
+ \advance\vsize\dimexpr-\scratchtopoffset -\scratchbottomoffset\relax
+ \kern\scratchleftoffset
+ \vpack\bgroup
+ \vskip\scratchtopoffset
+ \vbox\bgroup
+ \forgetall
+ \blank[\v!disable]}
+
+\def\pack_framed_stop_content_indeed
+ {\removelastskip
+ \egroup
+ \vskip\scratchbottomoffset
+ \egroup
+ \kern\scratchrightoffset
+ \egroup
+ \doif{\framedcontentparameter\c!width}\v!fit
+ {\letframedcontentparameter\c!width\v!fixed}% no shapebox
+ \ifinsidefloat
+ \donefalse
+ \else
+ \doifelse{\framedcontentparameter\c!linecorrection}\v!yes\donetrue\donefalse
+ \fi
+ % plaats ?
+ \ifdone\startlinecorrection\fi
+ \framedcontentparameter\c!left % new
+ \inheritedframedcontentframed{\box\b_framed_normal}% hm
+ \framedcontentparameter\c!right % new
+ \ifdone\stoplinecorrection\fi
+ \egroup}
+
+% A shared setting.
+
+\setuplinewidth
+ [\v!medium]
+
+%D A Goodie:
+
+\def\v!unframed{unframed}
+
+\defineframed
+ [\v!unframed]
+ [\c!frame=\v!off,
+ \c!rulethickness=\zeropoint,
+ \c!foregroundstyle=\framedparameter\c!style,
+ \c!foregroundcolor=\framedparameter\c!color]
+
+%D Bonus (as defined in \type {pack-rul.lua}):
+%D
+%D \starttyping
+%D \setbox\scratchbox\vbox{a\par aa\par aaa\par}
+%D \the\dimexpr\themaxboxwidth\scratchbox\relax
+%D \stoptyping
+
+\let\themaxboxwidth\clf_themaxboxwidth
+
+%D New: slow but ok for most cases:
+
+\unexpanded\def\doifelseframed#1%
+ {\ifcase\numexpr\zerocount
+ \immediateassignment\edef\tempstring{#1\c!frame }\ifx\tempstring\v!on +\plusone\fi
+ \immediateassignment\edef\tempstring{#1\c!topframe }\ifx\tempstring\v!on +\plusone\fi
+ \immediateassignment\edef\tempstring{#1\c!bottomframe}\ifx\tempstring\v!on +\plusone\fi
+ \immediateassignment\edef\tempstring{#1\c!leftframe }\ifx\tempstring\v!on +\plusone\fi
+ \immediateassignment\edef\tempstring{#1\c!rightframe }\ifx\tempstring\v!on +\plusone\fi
+ \immediateassignment\edef\tempstring{#1\c!background }\ifx\tempstring\empty\else+\plusone\fi
+ \relax\expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments\fi}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-box.mkvi b/Master/texmf-dist/tex/context/base/mkiv/page-box.mkvi
index 10d5916319f..4804e83706a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-box.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-box.mkvi
@@ -63,8 +63,8 @@
\v_page_target_bottom}}
\def\page_boxes_apply_offset % #box
- {\ifdim\topoffset=\zeropoint
- \ifdim\backoffset=\zeropoint
+ {\ifzeropt\topoffset
+ \ifzeropt\backoffset
\doubleexpandafter\gobbleoneargument
\else
\doubleexpandafter\page_boxes_apply_offset_indeed
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-col.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-col.mkiv
index 14b5124210f..272ffe18168 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-col.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-col.mkiv
@@ -30,6 +30,9 @@
\setnewconstant\maxnofcolumns 50
\setnewconstant\allocatednofcolumns 0
+\newdimen\columnwidth
+\newdimen\columndistance
+
%D During initialization the temporary boxes are allocated. This enables us to
%D use as much columns as we want, without exhausting the pool of boxes too
%D fast. We could have packed them in one box, but we've got enough boxes.
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-cst.lua b/Master/texmf-dist/tex/context/base/mkiv/page-cst.lua
index 1c2f5fc0b48..a6315ff05f9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-cst.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-cst.lua
@@ -8,20 +8,20 @@ if not modules then modules = { } end modules ["page-cst"] = {
-- todo: check what is used
-local next, type, tonumber = next, type, tonumber
+local next, type, tonumber, rawget = next, type, tonumber, rawget
local ceil, odd, round = math.ceil, math.odd, math.round
local lower = string.lower
local copy = table.copy
-local trace_state = false trackers.register("columnsets.trace", function(v) trace_state = v end)
-local trace_detail = false trackers.register("columnsets.detail", function(v) trace_detail = v end)
-local trace_cells = false trackers.register("columnsets.cells", function(v) trace_cells = v end)
+local trace_state = false trackers.register("columnsets.trace", function(v) trace_state = v end)
+local trace_details = false trackers.register("columnsets.details", function(v) trace_details = v end)
+local trace_cells = false trackers.register("columnsets.cells", function(v) trace_cells = v end)
local report = logs.reporter("column sets")
local setmetatableindex = table.setmetatableindex
-local properties = nodes.properties
+local properties = nodes.properties.data
local nodecodes = nodes.nodecodes
@@ -36,7 +36,6 @@ local nuts = nodes.nuts
local tonode = nuts.tonode
local tonut = nuts.tonut
-local hpack = nuts.hpack
local vpack = nuts.vpack
local flushlist = nuts.flush_list
----- removenode = nuts.remove
@@ -442,11 +441,13 @@ local function here(c,r,nr,nofcolumns,nofrows,cells,width,spans)
return c, r, nc
end
+-- we use c/r as range limiters
+
local methods = {
[v_here] = here,
[v_fixed] = here,
tblr = function(c,r,nr,nofcolumns,nofrows,cells,width,spans)
- for j=1,nofrows-nr+1 do
+ for j=r,nofrows-nr+1 do
for i=c,nofcolumns do
if not cells[i][j] then
local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans)
@@ -459,7 +460,7 @@ local methods = {
end,
lrtb = function(c,r,nr,nofcolumns,nofrows,cells,width,spans)
for i=c,nofcolumns do
- for j=1,nofrows-nr+1 do
+ for j=r,nofrows-nr+1 do
if not cells[i][j] then
local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans)
if c then
@@ -470,7 +471,7 @@ local methods = {
end
end,
tbrl = function(c,r,nr,nofcolumns,nofrows,cells,width,spans)
- for j=1,nofrows-nr+1 do
+ for j=r,nofrows-nr+1 do
for i=nofcolumns,c,-1 do
if not cells[i][j] then
local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans)
@@ -483,7 +484,7 @@ local methods = {
end,
rltb = function(c,r,nr,nofcolumns,nofrows,cells,width,spans)
for i=nofcolumns,c,-1 do
- for j=1,nofrows-nr+1 do
+ for j=r,nofrows-nr+1 do
if not cells[i][j] then
local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans)
if c then
@@ -494,7 +495,8 @@ local methods = {
end
end,
btlr = function(c,r,nr,nofcolumns,nofrows,cells,width,spans)
- for j=nofrows-nr+1,1,-1 do
+ -- for j=nofrows-nr+1,1,-1 do
+ for j=nofrows-nr+1-r+1,1,-1 do
for i=c,nofcolumns do
if not cells[i][j] then
local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans)
@@ -507,7 +509,8 @@ local methods = {
end,
lrbt = function(c,r,nr,nofcolumns,nofrows,cells,width,spans)
for i=c,nofcolumns do
- for j=nofrows-nr+1,1,-1 do
+ -- for j=nofrows-nr+1,1,-1 do
+ for j=nofrows-nr+1-r+1,1,-1 do
if not cells[i][j] then
local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans)
if c then
@@ -518,7 +521,8 @@ local methods = {
end
end,
btrl = function(c,r,nr,nofcolumns,nofrows,cells,width,spans)
- for j=nofrows-nr+1,1,-1 do
+ -- for j=nofrows-nr+1,1,-1 do
+ for j=nofrows-nr+1-r+1,1,-1 do
for i=nofcolumns,c,-1 do
if not cells[i][j] then
local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans)
@@ -531,7 +535,8 @@ local methods = {
end,
rlbt = function(c,r,nr,nofcolumns,nofrows,cells,width,spans)
for i=nofcolumns,c,-1 do
- for j=nofrows-nr+1,1,-1 do
+ -- for j=nofrows-nr+1,1,-1 do
+ for j=nofrows-nr+1-r+1,1,-1 do
if not cells[i][j] then
local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans)
if c then
@@ -921,7 +926,7 @@ local function findslice(dataset,head,available,column,row)
local used = getheight(done)
local rest = takebox("scratchbox")
if used > (usedsize+slack) then
- if trace_detail then
+ if trace_details then
report("at (%i,%i) available %p, used %p, overflow %p",column,row,usedsize,used,used-usedsize)
end
-- flush copy
@@ -1318,6 +1323,7 @@ interfaces.implement {
{ "r", "integer" },
{ "nc", "integer" },
{ "nr", "integer" },
+ { "method", "string" },
{ "box", "integer" },
} }
}
@@ -1330,6 +1336,7 @@ interfaces.implement {
{ "method", "string" },
{ "c", "integer" },
{ "r", "integer" },
+ { "method", "string" },
{ "box", "integer" },
{ "width", "dimension" },
{ "height", "dimension" },
@@ -1344,6 +1351,7 @@ interfaces.implement {
{ "name", "string" },
{ "c", "integer" },
{ "r", "integer" },
+ { "method", "string" },
{ "box", "integer" },
} }
}
@@ -1415,6 +1423,7 @@ interfaces.implement {
{ "name", "string" },
{ "c", "integer" },
{ "r", "integer" },
+ { "method", "string" },
{ "box", "integer" },
} }
}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-cst.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-cst.mkiv
index 37df4e8b17c..6ce10a8822e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-cst.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-cst.mkiv
@@ -181,6 +181,12 @@
\setupoutputroutine[\s!pagegrid]%
\page_grd_command_set_hsize
\page_grd_command_set_vsize
+ %
+ \columnwidth \d_page_grd_column_width
+ \columndistance\d_page_grd_distance
+ \nofcolumns \c_page_grd_n_of_left % not always ok
+ \textwidth \d_page_grd_column_width % kind of redundant but we had it so ...
+ %
}%\begingroup}
\unexpanded\def\stoppagegrid
@@ -221,6 +227,7 @@
{\begingroup
\letdummyparameter\c!c\zerocount
\letdummyparameter\c!r\zerocount
+ \letdummyparameter\c!method\v!here
\letdummyparameter\c!option\v!none
\getdummyparameters[#1]%
\dowithnextboxcs\page_grd_set_indeed\hbox}
@@ -231,6 +238,7 @@
c \dummyparameter\c!c
r \dummyparameter\c!r
box \nextbox
+ method {\dummyparameter\c!method}
option {\dummyparameter\c!option}
}%
\ifcase\c_page_grd_reserved_state
@@ -250,6 +258,7 @@
\fi
\endgroup}
+
\unexpanded\def\page_grd_command_set_vsize
{\clf_setvsizecolumnset{\currentpagegrid}%
\ifdim\d_page_grd_gap_height<\lineheight
@@ -293,9 +302,9 @@
% todo line numbers and marks
\unexpanded\def\page_grd_command_flush_page_column#1%
- {\privatescratchcounter#1\relax
+ {\privatescratchcounter#1\relax % or just currentcolumn as in page-col.mkiv
\clf_flushcolumnsetcolumn{\currentpagegrid}\privatescratchcounter
- \anch_mark_column_box\b_page_grd_column
+ \anch_mark_column_box\b_page_grd_column\privatescratchcounter
\page_marks_synchronize_column\c_page_grd_first_column\c_page_grd_last_column\privatescratchcounter\b_page_grd_column
\ifnum\privatescratchcounter>\c_page_grd_n_of_left
\advance\privatescratchcounter-\c_page_grd_n_of_left
@@ -398,11 +407,13 @@
\global\setfalse\c_page_floats_flushing}
\def\page_grd_command_flush_floats_indeed % much in common with OTRSET
- {\wait\ifconditional\c_page_floats_some_waiting
- \ifconditional\c_page_floats_pack_flushed
- \page_floats_collect\s!text\hsize\emwidth
+ {\ifconditional\c_page_floats_some_waiting
+ \ifconditional\c_page_floats_compress_flushed
+ \page_floats_collect\s!text\hsize\d_page_floats_compress_distance
\ifcase\nofcollectedfloats
\page_floats_get
+ % \or
+ % \page_floats_get
\else
\setfalse\c_page_floats_center_box % not needed as we do call directly
\global\setbox\floatbox\hbox to \hsize
@@ -640,11 +651,12 @@
\edef\currentpagegridspan{#1}%
\clf_sethsizecolumnspan{\currentpagegrid}\pagegridspanparameter\c!n\relax
\setbox\scratchbox\hbox\bgroup\inheritedpagegridspanframed\bgroup
+ \def\page_grd_span_stop{\page_grd_span_stop_indeed{#2}}%
\usepagegridspanstyleandcolor\c!style\c!color
\pagegridspanparameter\c!before
\ignorespaces}
-\unexpanded\def\stoppagegridspan
+\unexpanded\def\page_grd_span_stop_indeed#1%
{\removeunwantedspaces
\par
\verticalstrut
@@ -653,11 +665,14 @@
\endgraf
\pagegridspanparameter\c!after
\egroup\egroup
- \setpagegrid{\box\scratchbox}%
+ \setpagegrid[#1]{\box\scratchbox}%
% todo: push into slot
\egroup
\endgraf}
+\unexpanded\def\stoppagegridspan % indirectness permits aliasing
+ {\page_grd_span_stop}
+
\def\pagegridspanwidth#1% assumes equal distances
{\the\dimexpr
#1\d_page_grd_column_width
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-ffl.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-ffl.mkiv
index 414cae4ac11..176c4a185e7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-ffl.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-ffl.mkiv
@@ -65,7 +65,7 @@
\c!inbetween={\blank[\v!big]},
%\c!style,
%\c!color,
- \c!page=\v!yes]
+ \c!page=\v!left]
\appendtoks
\ifx\currentfacingfloatparent\empty
@@ -74,8 +74,8 @@
\fi
\to \everydefinefacingfloat
-\newcount\c_strc_floats_saved
-\newcount\c_strc_floats_flushed
+\newcount\c_strc_floats_facing_saved
+\newcount\c_strc_floats_facing_flushed
\newbox\b_strc_floats_facing_l
\newbox\b_strc_floats_facing_r
@@ -83,12 +83,24 @@
\let\m_strc_floats_state\relax
\def\strc_floats_facing_flush
- {\ifnum\c_strc_floats_flushed<\c_strc_floats_saved
- \strc_floats_facing_flush_indeed % less tracing
+ {\ifnum\c_strc_floats_facing_flushed<\c_strc_floats_facing_saved
+ \ifodd\c_strc_floats_facing_flushed
+ \ifodd\realpageno
+ \strc_floats_facing_flush_indeed
+ \doifelsependingpagecontent\relax{\null\page}%
+ \else
+ \fi
+ \else
+ \ifodd\realpageno
+ \else
+ \strc_floats_facing_flush_indeed
+ \doifelsependingpagecontent\relax{\null\page}%
+ \fi
+ \fi
\fi}
\def\strc_floats_facing_flush_indeed
- {\global\advance\c_strc_floats_flushed\plusone
+ {\global\advance\c_strc_floats_facing_flushed\plusone
\floatingpenalty\zerocount
\insert\namedinsertionnumber\s!topfloat\bgroup
\forgetall
@@ -100,12 +112,12 @@
\prevdepth\maxdimen
\fi
\fi
- \directboxfromcache{\currentfacingfloat}{\number\c_strc_floats_flushed}%
+ \directboxfromcache{\currentfacingfloat}{\number\c_strc_floats_facing_flushed}%
\vkern\s_page_one_between_top_insert
\egroup
- \ifnum\c_strc_floats_saved=\c_strc_floats_flushed
- \global\c_strc_floats_saved \zerocount
- \global\c_strc_floats_flushed\zerocount
+ \ifnum\c_strc_floats_facing_saved=\c_strc_floats_facing_flushed
+ \global\c_strc_floats_facing_saved \zerocount
+ \global\c_strc_floats_facing_flushed\zerocount
\resetboxesincache{\currentfacingfloat}%
\fi}
@@ -145,34 +157,34 @@
\fi\fi}
\unexpanded\def\strc_floats_facing_handle
- {\strc_floats_facing_collect
- \doifnextbgroupelse
+ {\doifnextbgroupelse
\strc_floats_facing_handle_indeed
- \strc_floats_wrap_up}
+ \strc_floats_facing_wrap_up}
\unexpanded\def\strc_floats_facing_handle_indeed
{\dowithnextboxcontent
\strc_floats_facing_setup
- \strc_floats_facing_handle
+ {\strc_floats_facing_collect\strc_floats_facing_handle}
\vbox}
\unexpanded\def\startfacingfloat[#1]%
{\begingroup
% todo: \usepageparameter
- \edef\p_page{\facingfloatparameter\c!page}%
- \ifx\p_page\empty
- \page[\p_page]%
- \fi
+% \edef\p_page{\facingfloatparameter\c!page}%
+% \ifx\p_page\empty\else
+% \page[\p_page]%
+% \fi
%
\let\startcontent\bgroup
\let\stopcontent\egroup
\def\currentfacingfloat{#1}%
+ \let\m_strc_floats_state\v!left
\strc_floats_facing_handle}
\unexpanded\def\stopfacingfloat
{\endgroup}
-\unexpanded\def\strc_floats_wrap_up
+\unexpanded\def\strc_floats_facing_wrap_up
{\edef\p_spaceinbetween{\facingfloatparameter\c!spaceinbetween}%
\ifx\p_spaceinbetween\empty
\scratchdimen\zeropoint
@@ -180,6 +192,12 @@
\setbox\scratchbox\vbox{\directvspacing\p_spaceinbetween}%
\scratchdimen\htdp\scratchbox
\fi
+ \ifvoid\b_strc_floats_facing_l\else
+ \page_postprocessors_linenumbers_box\b_strc_floats_facing_l
+ \fi
+ \ifvoid\b_strc_floats_facing_r\else
+ \page_postprocessors_linenumbers_box\b_strc_floats_facing_r
+ \fi
\doloop{%
\strc_floats_facing_flush_wrap\b_strc_floats_facing_l\v!left
\strc_floats_facing_flush_wrap\b_strc_floats_facing_r\v!right
@@ -202,13 +220,9 @@
\else
\setbox\scratchbox\vbox to \textheight{\box\scratchbox\vss}%
\fi
- \global\advance\c_strc_floats_saved\plusone
- \putboxincache{\currentfacingfloat}{\number\c_strc_floats_saved}\scratchbox
+ \global\advance\c_strc_floats_facing_saved\plusone
+ \putboxincache{\currentfacingfloat}{\number\c_strc_floats_facing_saved}\scratchbox
\endgroup
\fi}
-\appendtoks
- \strc_floats_facing_flush
-\to \everyafteroutput
-
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-flt.lua b/Master/texmf-dist/tex/context/base/mkiv/page-flt.lua
index 41a35d47b8b..b1f729f7a6d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-flt.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-flt.lua
@@ -87,22 +87,32 @@ end
local function setdimensions(t,b)
local bw, bh, bd = 0, 0, 0
local nw, nh, nd = 0, 0, 0
+ local cw, ch, cd = 0, 0, 0
if b then
bw = b.width
bh = b.height
bd = b.depth
+ cw = b.cwidth
+ ch = b.cheight
+ cd = b.cdepth
end
if t then
- nw = t.width or bw
- nh = t.height or bh
- nd = t.depth or bd
+ nw = t.width or bw
+ nh = t.height or bh
+ nd = t.depth or bd
+ cw = t.cwidth or cw
+ ch = t.cheight or ch
+ cd = t.cdepth or cd
end
setdimen("global","floatwidth", bw)
setdimen("global","floatheight", bh+bd)
setdimen("global","naturalfloatwd", nw)
setdimen("global","naturalfloatht", nh)
setdimen("global","naturalfloatdp", nd)
- return bw, bh, bd, nw, nh, dp
+ setdimen("global","floatcaptionwd", cw)
+ setdimen("global","floatcaptionht", ch)
+ setdimen("global","floatcaptiondp", cd)
+ return bw, bh, bd, nw, nh, dp, cw, xh, xp
end
local function get(stack,n,bylabel)
@@ -125,19 +135,22 @@ local function get(stack,n,bylabel)
end
end
-function floats.save(which,data)
+function floats.save(which,data) -- todo: just pass
which = which or default
local b = textakebox("floatbox")
if b then
local stack = stacks[which]
noffloats = noffloats + 1
local t = {
- n = noffloats,
- data = data or { },
- width = getdimen("naturalfloatwd"),
- height = getdimen("naturalfloatht"),
- depth = getdimen("naturalfloatdp"),
- box = b,
+ n = noffloats,
+ data = data or { },
+ width = getdimen("naturalfloatwd"),
+ height = getdimen("naturalfloatht"),
+ depth = getdimen("naturalfloatdp"),
+ cwidth = getdimen("floatcaptionwd"),
+ cheight = getdimen("floatcaptionht"),
+ cdepth = getdimen("floatcaptiondp"),
+ box = b,
}
insert(stack,t)
-- inspect(stacks)
@@ -240,11 +253,15 @@ function floats.collect(which,maxwidth,distance)
for i=1,stacksize do
local t, b, n = get(stack,i)
if t then
- local w, h, d, nw = setdimensions(t,b)
+ local w, h, d, nw, nh, nd, cw, ch, cd = setdimensions(t,b)
-- we use the real width
- w = nw
+ if cw > nw then
+ w = cw
+ else
+ w = nw
+ end
-- which could be an option
- local rest = maxwidth - w - (1 == 1 and 0 or distance)
+ local rest = maxwidth - w - distance
local fits = rest > -10
if trace_collecting then
report_collecting("%s, category %a, number %a, slot %a width %p, rest %p, fit %a","collecting",
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-flt.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-flt.mkiv
index 83e2b49547a..01ee8b689e8 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-flt.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-flt.mkiv
@@ -20,10 +20,6 @@
\unprotect
-\ifdefined\s!topfloat \else \def\s!topfloat {topfloat} \fi
-\ifdefined\s!bottomfloat \else \def\s!bottomfloat{bottomfloat} \fi
-\ifdefined\s!pagefloat \else \def\s!pagefloat {pagefloat} \fi
-
\defineinsertion[\s!topfloat]
\defineinsertion[\s!bottomfloat]
\defineinsertion[\s!pagefloat]
@@ -63,7 +59,9 @@
\newconditional\c_page_floats_center_box \settrue\c_page_floats_center_box
\newconditional\c_page_floats_center_box_local
\newconditional\c_page_floats_center_box_global
-\newconditional\c_page_floats_pack_flushed \settrue\c_page_floats_pack_flushed
+\newconditional\c_page_floats_compress_flushed \settrue\c_page_floats_compress_flushed
+
+\newdimen \d_page_floats_compress_distance
%D For the moment we keep this but they will become private too.
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-imp.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-imp.mkiv
index 838ad742188..a7ef6ca38f7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-imp.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-imp.mkiv
@@ -136,7 +136,7 @@
{\begingroup
\writestatus\m!system
{\ifarrangingpages arranged \fi page
- \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace
+ \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace
not flushed}%
% \setbox\scratchbox\hpack
% {#1}% no finalize
@@ -162,11 +162,15 @@
\box\scratchbox
\endgroup}
-\ifdefined \page_shipout_box \else
+%D Also in normal \MKIV\ we nos use the indirect way so that we benefit from timing and
+%D tracing.
- \def\page_shipout_box#1{\normalshipout\box#1\relax} % takes a number
+% \def\page_shipout_box#1{\normalshipout\box#1\relax} % takes a number
-\fi
+\unexpanded\def\page_shipout_box#1%
+ {\clf_shipoutpage#1\relax
+ \global\setbox#1\emptybox
+ \global\deadcycles\zerocount}
\def\page_shipouts_normal#1%
{\global\advance\shippedoutpages\plusone
@@ -206,6 +210,10 @@
\page_shipouts_ignore{#1}%
\fi}
+\newconditional\c_page_shipouts_use_objects \settrue\c_page_shipouts_use_objects
+
+\installcorenamespace {arrangedpage}
+
\def\page_shipouts_arrange#1%
{\begingroup
\setbox\shipoutscratchbox\hpack
@@ -214,6 +222,12 @@
{\page_otr_flush_every_stuff
\page_otr_flush_special_content
\box\shipoutscratchbox}%
+ %
+ \ifconditional\c_page_shipouts_use_objects
+ \setobject\??arrangedpage{\the\realpageno}\hpack{\box\shipoutscratchbox}%
+ \setbox\shipoutscratchbox\hpack{\getobject\??arrangedpage{\the\realpageno}}%
+ \fi
+ %
\pusharrangedpage\shipoutscratchbox
\deadcycles\zerocount
\endgroup}
@@ -313,8 +327,10 @@
\fi
\setuppapersize
\ifarrangingpages
- \clf_disablejobsave
- %\disabledirective[job.save]%
+ \ifconditional\c_page_shipouts_use_objects\else
+ \clf_disablejobsave
+ %\disabledirective[job.save]%
+ \fi
\fi
\fi}
@@ -417,6 +433,7 @@
\def\outputarrangedbox#1%
{\begingroup
\forgetall % somehow we're back and need to redo this
+ \dontcomplain
\gotonextarrangepage
\ifnum\arrangedrotationO\arrangedrotationE>\zerocount
\setbox#1\vpack
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/page-ini.lua
index 3d553412815..17f4c44dadd 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-ini.lua
@@ -16,6 +16,8 @@ local texgetcount = tex.getcount
local context = context
local ctx_doifelse = commands.doifelse
+local implement = interfaces.implement
+
local data = table.setmetatableindex("table")
local last = 0
local pages = structures.pages
@@ -177,19 +179,19 @@ luatex.registerpageactions(function()
end
end)
-interfaces.implement {
+implement {
name = "markpage",
arguments = "2 strings",
actions = pages.mark
}
-interfaces.implement {
+implement {
name = "doifelsemarkedpage",
arguments = "string",
actions = { marked, ctx_doifelse }
}
-interfaces.implement {
+implement {
name = "markedpages",
arguments = "string",
actions = function(name)
@@ -200,7 +202,7 @@ interfaces.implement {
end
}
-interfaces.implement {
+implement {
name = "startmarkpages",
arguments = "string",
actions = function(name)
@@ -208,7 +210,7 @@ interfaces.implement {
end
}
-interfaces.implement {
+implement {
name = "stopmarkpages",
arguments = "string",
actions = function(name)
@@ -217,3 +219,23 @@ interfaces.implement {
end
end
}
+
+local tonut = nodes.tonut
+local nextlist = nodes.nuts.traversers.list
+local texlists = tex.lists
+
+implement {
+ name = "doifelsependingpagecontent",
+ actions = function()
+ local h = texlists.contrib_head
+ -- local t = texlists.contrib_tail
+ local p = false
+ if h then
+ for n in nextlist, tonut(h) do
+ p = true
+ break
+ end
+ end
+ ctx_doifelse(p)
+ end,
+}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-ini.mkiv
index 38477dc2747..e56c3ac0404 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-ini.mkiv
@@ -58,9 +58,27 @@
\newbox\pagebox
-\ifdefined\page_postprocessors_column \else \let\page_postprocessors_column\gobbleoneargument \fi
-\ifdefined\page_postprocessors_page \else \let\page_postprocessors_page \gobbleoneargument \fi
-\ifdefined\page_postprocessors_box \else \let\page_postprocessors_box \gobbleoneargument \fi
+% \ifdefined\page_postprocessors_column \else \let\page_postprocessors_column\gobbleoneargument \fi
+% \ifdefined\page_postprocessors_page \else \let\page_postprocessors_page \gobbleoneargument \fi
+% \ifdefined\page_postprocessors_box \else \let\page_postprocessors_box \gobbleoneargument \fi
+
+\newtoks\t_page_postprocessors_box
+\newtoks\t_page_postprocessors_page
+\newtoks\t_page_postprocessors_column
+
+\newconstant\b_page_postprocessor
+
+\def\page_apply_postprocessors_box#1%
+ {\b_page_postprocessor#1\relax
+ \the\t_page_postprocessors_box}
+
+\def\page_apply_postprocessors_page#1%
+ {\b_page_postprocessor#1\relax
+ \the\t_page_postprocessors_page}
+
+\def\page_apply_postprocessors_column#1%
+ {\b_page_postprocessor#1\relax
+ \the\t_page_postprocessors_column}
%D Floats.
@@ -144,6 +162,7 @@
\strc_pagenumbers_increment_counters % should hook into an every
\page_adapts_synchronize
\page_otr_check_for_pending_inserts
+ \page_otr_command_flush_facing_floats
\page_floats_flush_page_floats % before postponed blocks
\page_spread_flush % defined later
\ifnum#3=\plusone
@@ -344,6 +363,10 @@
{\clf_forcestrutdepth\normalpagebox\strutdp\c_page_force_strut_depth_trace_mode
\unvbox\normalpagebox}
+\installoutputroutine\forcestrutdepthplus % experimental
+ {\clf_forcestrutdepthplus\normalpagebox\strutdp\c_page_force_strut_depth_trace_mode
+ \unvbox\normalpagebox}
+
% maybe better:
%
% \installoutputroutine\doforcestrutdepth
@@ -353,4 +376,8 @@
% \unexpanded\def\forcestrutdepth
% {\par\ifvmode\ifinner\else\doforcestrutdepth\fi\fi}
+% Also experimental:
+
+\unexpanded\def\doifelsependingpagecontent{\clf_doifelsependingpagecontent}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-inj.mkvi b/Master/texmf-dist/tex/context/base/mkiv/page-inj.mkvi
index 5f48ffd13dd..b1a2913cf6f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-inj.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-inj.mkvi
@@ -93,7 +93,7 @@
\def\page_injections_direct_indeed_yes#parameters%
{\clf_savepageinjections
- name {\currentpageinjection}%
+ name {\currentpageinjection}%
state {\p_page_injections_state}%
userdata {\normalunexpanded{#parameters}}%
\relax
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-lay.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-lay.mkiv
index 02cc5aa17f2..d115b588d6f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-lay.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-lay.mkiv
@@ -166,6 +166,8 @@
\def\layoutdistance#1#2{\ifdim\zeropoint<#1#2\else\zeropoint\fi}
+% \newconditional\reverselayout
+
\def\page_layouts_set_dimensions
{\global\naturalmarginwidth \layoutparameter\c!margin
\global\naturaledgewidth \layoutparameter\c!edge
@@ -194,8 +196,7 @@
\global\headerdistance \layoutdistance\headerheight \naturalheaderdistance
\global\textdistance \naturaltextdistance
\global\footerdistance \layoutdistance\footerheight \naturalfooterdistance
- \global\bottomdistance \layoutdistance\bottomheight \naturalbottomdistance
- }
+ \global\bottomdistance \layoutdistance\bottomheight \naturalbottomdistance}
\def\page_layouts_set_distances % local in \setreducedvsize
{\headerdistance\layoutdistance\headerheight\naturalheaderdistance
@@ -367,16 +368,16 @@
{\edef\currentlayouttarget{#1}%
\ifx\currentlayouttarget\empty
% invalid target
+ \else\ifcondition\validassignment{#2}%
+ \definelayouttarget[#1][#2]%
\else
- \doifelseassignment{#2}
- {\definelayouttarget[#1][#2]}
- {\setevalue{\??layoutpaper#1}{#2}%
- \ifthirdargument
- \setevalue{\??layoutprint#1}{#3}%
- \else
- \setevalue{\??layoutprint#1}{#2}%
- \fi}%
- \fi}
+ \setevalue{\??layoutpaper#1}{#2}%
+ \ifthirdargument
+ \setevalue{\??layoutprint#1}{#3}%
+ \else
+ \setevalue{\??layoutprint#1}{#2}%
+ \fi
+ \fi\fi}
\appendtoks
\letvalue{\??layoutcurrent\currentlayouttarget}\relax
@@ -400,11 +401,13 @@
\unexpanded\def\page_paper_setup_size[#1][#2]%
{\iffirstargument
- \doifelseassignment{#1}
- {\page_paper_setup_size_settings[#1]}
- {\doifelseassignment{#2}
- {\page_paper_setup_size_settings_by_name[#1][#2]}
- {\page_paper_setup_size_change_size[#1][#2]}}%
+ \ifcondition\validassignment{#1}%
+ \page_paper_setup_size_settings[#1]%
+ \else\ifcondition\validassignment{#2}%
+ \page_paper_setup_size_settings_by_name[#1][#2]%
+ \else
+ \page_paper_setup_size_change_size[#1][#2]%
+ \fi\fi
\else
\page_paper_restore
\fi}
@@ -612,10 +615,6 @@
\fi
-\ifdefined\setups \else
- \unexpanded\def\setups[#1]{\setdefaultpenalties} % still needed?
-\fi
-
\ifdefined\synchronizegridsnapping \else
\let\synchronizegridsnapping\relax
\fi
@@ -644,12 +643,12 @@
\global\cutspace\layoutparameter\c!cutspace\relax
\edef\p_page_layouts_width{\layoutparameter\c!width}%
\ifx\p_page_layouts_width\v!middle
- \ifdim\cutspace=\zeropoint
+ \ifzeropt\cutspace
\global\cutspace\backspace
\fi
\global\makeupwidth\dimexpr\paperwidth-\backspace-\cutspace\relax
\else\ifx\p_page_layouts_width\v!fit
- \ifdim\cutspace=\zeropoint
+ \ifzeropt\cutspace
\global\cutspace\backspace
\fi
\global\makeupwidth\dimexpr\paperwidth-\cutspace\relax
@@ -665,7 +664,7 @@
-\scratchdimen\relax
\else
\global\makeupwidth\p_page_layouts_width\relax
- \ifdim\cutspace=\zeropoint
+ \ifzeropt\cutspace
\global\cutspace\dimexpr\paperwidth-\makeupwidth-\backspace\relax
% \else
% A kind of inconsistent specification, but used
@@ -675,7 +674,7 @@
\fi
\fi\fi
\scratchdimen\layoutparameter\c!bottomspace\relax
- %\ifdim\scratchdimen=\zeropoint
+ %\ifzeropt\scratchdimen
% \scratchdimen\topspace
%\fi
\global\bottomspace\layoutparameter\c!bottomspace\relax
@@ -683,12 +682,12 @@
\ifcase\layoutlines
\edef\p_page_layouts_height{\layoutparameter\c!height}%
\ifx\p_page_layouts_height\v!middle
- \ifdim\bottomspace=\zeropoint
+ \ifzeropt\bottomspace
\global\bottomspace\topspace
\fi
\global\makeupheight\dimexpr\paperheight-\topspace-\bottomspace\relax
\else\ifx\p_page_layouts_height\v!fit
- \ifdim\bottomspace=\zeropoint
+ \ifzeropt\bottomspace
\global\bottomspace\topspace
\fi
\global\makeupheight\dimexpr\paperheight-\bottomspace\relax
@@ -699,7 +698,7 @@
\global\advance\makeupheight\dimexpr-\bottomdistance-\bottomheight-\scratchdimen\relax
\else
\global\makeupheight\layoutparameter\c!height\relax
- \ifdim\bottomspace=\zeropoint
+ \ifzeropt\bottomspace
\global\bottomspace\dimexpr\paperheight-\makeupheight-\topspace\relax
% \else
% inconsistent specification
@@ -731,6 +730,7 @@
+\rightedgetotal
\relax
% \page_layouts_check_next % here ?
+ \page_layouts_check_direction
\page_layouts_calculate_extras
\page_target_check_centering
\calculatehsizes
@@ -738,6 +738,21 @@
\page_layouts_check_pseudo_columns
\page_backgrounds_recalculate}
+\def\page_layouts_check_direction
+ {\edef\p_direction{\layoutparameter\c!direction}%
+ \ifx\p_direction\v!reverse
+ \globalswapdimens\naturalleftedgedistance \naturalrightedgedistance
+ \globalswapdimens\naturalleftmargindistance\naturalrightmargindistance
+ \globalswapdimens\leftedgedistance \rightedgedistance
+ \globalswapdimens\leftmargindistance \rightmargindistance
+ \globalswapdimens\leftmarginwidth \rightmarginwidth
+ \globalswapdimens\leftedgewidth \rightedgewidth
+ \globalswapdimens\backspace \cutspace
+ \expandafter\setsystemmode
+ \else
+ \expandafter\resetsystemmode
+ \fi{reverselayout}}
+
\def\page_layouts_check_pseudo_columns
{\global\layoutcolumns\layoutparameter\c!columns
\global\layoutcolumndistance\layoutparameter\c!columndistance
@@ -1340,6 +1355,7 @@
%D \showsetup{showsetups}
%D %showsetup{showmargins}
%D %showsetup{showgrid}
+%D %showsetup{showusage}
\fetchruntimecommand \showprint \f!page_run
\fetchruntimecommand \showframe \f!page_run
@@ -1347,6 +1363,7 @@
\fetchruntimecommand \showsetups \f!page_run
\fetchruntimecommand \showmargins \f!page_run
\fetchruntimecommand \showgrid \f!page_run
+\fetchruntimecommand \showusage \f!page_run
\glet\page_grids_add_to_box\gobbleoneargument
\glet\page_grids_add_to_one\gobbleoneargument
@@ -1408,6 +1425,7 @@
\c!dx=\zeropoint,
\c!dy=\zeropoint,
\c!grid=\v!no,
+ \c!direction=\v!normal,
\c!preset=,
\c!setups=\systemsetupsprefix\s!default,
\c!clipoffset=\zeropoint,
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-lin.lua b/Master/texmf-dist/tex/context/base/mkiv/page-lin.lua
index 3689c7f8d1d..5ad660460c1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-lin.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-lin.lua
@@ -40,7 +40,7 @@ local v_next = variables.next
local v_page = variables.page
local v_no = variables.no
-local properties = nodes.properties
+local properties = nodes.properties.data
local nodecodes = nodes.nodecodes
local listcodes = nodes.listcodes
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-lin.mkvi b/Master/texmf-dist/tex/context/base/mkiv/page-lin.mkvi
index a27ba5736c5..6a03d12e45b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-lin.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-lin.mkvi
@@ -72,10 +72,22 @@
\newconditional\page_postprocessors_needed_box
-\unexpanded\def\page_postprocessors_linenumbers_page #tag{\page_lines_add_numbers_to_box{#tag}\plusone \plusone \zerocount}
-\unexpanded\def\page_postprocessors_linenumbers_box #tag{\page_lines_add_numbers_to_box{#tag}\plusone \plusone \zerocount}
-\unexpanded\def\page_postprocessors_linenumbers_deepbox#tag{\page_lines_add_numbers_to_box{#tag}\plusone \plusone \plusone }
-\unexpanded\def\page_postprocessors_linenumbers_column #tag{\page_lines_add_numbers_to_box{#tag}\currentcolumn\nofcolumns\zerocount}
+\unexpanded\def\page_postprocessors_linenumbers_page_indeed #tag{\page_lines_add_numbers_to_box{#tag}\plusone \plusone \zerocount}
+\unexpanded\def\page_postprocessors_linenumbers_box_indeed #tag{\page_lines_add_numbers_to_box{#tag}\plusone \plusone \zerocount}
+\unexpanded\def\page_postprocessors_linenumbers_deepbox_indeed#tag{\page_lines_add_numbers_to_box{#tag}\plusone \plusone \plusone }
+\unexpanded\def\page_postprocessors_linenumbers_column_indeed #tag{\page_lines_add_numbers_to_box{#tag}\currentcolumn\nofcolumns\zerocount}
+
+\let\page_postprocessors_linenumbers_page \gobbleoneargument
+\let\page_postprocessors_linenumbers_box \gobbleoneargument
+\let\page_postprocessors_linenumbers_deepbox\gobbleoneargument
+\let\page_postprocessors_linenumbers_column \gobbleoneargument
+
+\unexpanded\def\page_postprocessors_linenumbers_check
+ {\glet\page_postprocessors_linenumbers_check \relax
+ \glet\page_postprocessors_linenumbers_page \page_postprocessors_linenumbers_page_indeed
+ \glet\page_postprocessors_linenumbers_box \page_postprocessors_linenumbers_box_indeed
+ \glet\page_postprocessors_linenumbers_deepbox\page_postprocessors_linenumbers_deepbox_indeed
+ \glet\page_postprocessors_linenumbers_column \page_postprocessors_linenumbers_column_indeed}
\def\page_lines_start_define
{\setxvalue{\??linenumberinginstance\currentlinenumbering}%
@@ -179,6 +191,7 @@
\unexpanded\def\startlinenumbering
{\begingroup
+ \page_postprocessors_linenumbers_check
\dodoubleempty\page_lines_start}
\newcount\c_pages_lines_nesting
@@ -255,6 +268,19 @@
\page_lines_start_followup}
\newconditional\c_page_lines_auto_narrow
+%\newconditional\c_page_lines_enabled
+
+\appendtoks
+ \ifconditional\page_postprocessors_needed_box
+ \page_postprocessors_linenumbers_page\b_page_postprocessor
+ \fi
+\to \t_page_postprocessors_page
+
+\appendtoks
+ \ifconditional\page_postprocessors_needed_box
+ \page_postprocessors_linenumbers_column\b_page_postprocessor
+ \fi
+\to \t_page_postprocessors_column
\def\page_lines_start_followup
{\numberinglinestrue
@@ -279,8 +305,7 @@
\fi\fi\fi
\fi
\the\beforeeverylinenumbering
- \glet\page_postprocessors_page \page_postprocessors_linenumbers_page
- \glet\page_postprocessors_column\page_postprocessors_linenumbers_column
+ %\global\settrue\c_page_lines_enabled %
\global\settrue\page_postprocessors_needed_box % see core-rul.mkiv
\ifcase\c_page_lines_mode\relax
\page_lines_start_update % continue
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-mix.lua b/Master/texmf-dist/tex/context/base/mkiv/page-mix.lua
index 192b8a30aa6..dacc829d7e6 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-mix.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-mix.lua
@@ -19,8 +19,8 @@ local next, type = next, type
local concat = table.concat
local ceil = math.ceil
-local trace_state = false trackers.register("mixedcolumns.trace", function(v) trace_state = v end)
-local trace_detail = false trackers.register("mixedcolumns.detail", function(v) trace_detail = v end)
+local trace_state = false trackers.register("mixedcolumns.trace", function(v) trace_state = v end)
+local trace_details = false trackers.register("mixedcolumns.details", function(v) trace_details = v end)
local report_state = logs.reporter("mixed columns")
@@ -41,7 +41,6 @@ local nuts = nodes.nuts
local tonode = nuts.tonode
local listtoutf = nodes.listtoutf
-local hpack = nuts.hpack
local vpack = nuts.vpack
local flushnode = nuts.flush
local concatnodes = nuts.concat
@@ -124,7 +123,7 @@ local function collectinserts(result,nxt,nxtid)
inserttotal = inserttotal + getheight(nxt) -- height includes depth (hm, still? needs checking)
local s = getsubtype(nxt)
local c = inserts[s]
- if trace_detail then
+ if trace_details then
report_state("insert of class %s found",s)
end
if not c then
@@ -138,7 +137,7 @@ local function collectinserts(result,nxt,nxtid)
end
c[#c+1] = nxt
elseif nxtid == mark_code then
- if trace_detail then
+ if trace_details then
report_state("mark found")
end
else
@@ -326,20 +325,24 @@ local function preparesplit(specification) -- a rather large function
report_state("setting collector to column %s",column)
end
- local function unlock(penalty)
+ local function unlock(case,penalty)
if lastlocked then
if trace_state then
- report_state("penalty %s, unlocking in column %s",penalty or "-",column)
+ report_state("penalty %s, unlocking in column %s, case %i",penalty or "-",column,case)
end
lastlocked = nil
+ else
+ if trace_state then
+ report_state("penalty %s, ignoring in column %s, case %i",penalty or "-",column,case)
+ end
end
lastcurrent = nil
lastcontent = nil
end
- local function lock(penalty,current)
+ local function lock(case,penalty,current)
if trace_state then
- report_state("penalty %s, locking in column %s",penalty,column)
+ report_state("penalty %s, locking in column %s, case %i",penalty,column,case)
end
lastlocked = penalty
lastcurrent = current or lastcurrent
@@ -353,12 +356,12 @@ local function preparesplit(specification) -- a rather large function
local id = getid(current)
if id == glue_code then
if trace_state then
- report_state("backtracking over %s in column %s","glue",column)
+ report_state("backtracking over %s in column %s, value %p","glue",column,getwidth(current))
end
current = getprev(current)
elseif id == penalty_code then
if trace_state then
- report_state("backtracking over %s in column %s","penalty",column)
+ report_state("backtracking over %s in column %s, value %i","penalty",column,getpenalty(current))
end
current = getprev(current)
else
@@ -370,12 +373,12 @@ local function preparesplit(specification) -- a rather large function
local id = getid(current)
if id == glue_code then
if trace_state then
- report_state("quitting at %s in column %s","glue",column)
+ report_state("quitting at %s in column %s, value %p","glue",column,getwidth(current))
end
break
elseif id == penalty_code then
if trace_state then
- report_state("quitting at %s in column %s","penalty",column)
+ report_state("quitting at %s in column %s, value %i","penalty",column,getpenalty(current))
end
break
else
@@ -398,7 +401,11 @@ local function preparesplit(specification) -- a rather large function
report_state("backtracking to preferred break in column %s",column)
end
-- todo: also remember height/depth
- current = backtrack(lastcurrent)
+ if true then -- todo: option to disable this
+ current = backtrack(lastcurrent) -- not ok yet
+ else
+ current = lastcurrent
+ end
backtracked = true
end
lastcurrent = nil
@@ -441,7 +448,7 @@ local function preparesplit(specification) -- a rather large function
report_state("setting collector to column %s",column)
end
current, skipped = discardtopglue(current,discarded)
- if trace_detail and skipped ~= 0 then
+ if trace_details and skipped ~= 0 then
report_state("check > column 1, discarded %p",skipped)
end
head = current
@@ -465,7 +472,7 @@ local function preparesplit(specification) -- a rather large function
state = "quit"
end
end
- if trace_detail then
+ if trace_details then
report_state("%-8s > column %s, delta %p, threshold %p, advance %p, total %p, target %p => %a (height %p, depth %p, skip %p)",
where,curcol,delta,threshold,advance,total,target,state,height,depth,skip)
end
@@ -473,7 +480,7 @@ local function preparesplit(specification) -- a rather large function
end
current, skipped = discardtopglue(current,discarded)
- if trace_detail and skipped ~= 0 then
+ if trace_details and skipped ~= 0 then
report_state("check > column 1, discarded %p",skipped)
end
@@ -483,6 +490,8 @@ local function preparesplit(specification) -- a rather large function
--
-- ok, we could use vsplit but we don't have that one opened up yet .. maybe i should look into the c-code
-- .. something that i try to avoid so let's experiment more before we entry dirty trick mode
+ --
+ -- what if we can do a preroll in lua, get head and tail and then slice of a bit and push that ahead
head = current
@@ -517,7 +526,7 @@ local function preparesplit(specification) -- a rather large function
-- what else? ignore? treat as valid as usual?
end
if lastcontent then
- unlock()
+ unlock(1)
end
end
@@ -578,7 +587,7 @@ local function preparesplit(specification) -- a rather large function
local function process_penalty(current,nxt)
local penalty = getpenalty(current)
if penalty == 0 then
- unlock(penalty)
+ unlock(2,penalty)
elseif penalty == forcedbreak then
local needed = getattribute(current,a_checkedbreak)
local proceed = not needed or needed == 0
@@ -590,7 +599,7 @@ local function preparesplit(specification) -- a rather large function
end
end
if proceed then
- unlock(penalty)
+ unlock(3,penalty)
local okay, skipped = gotonext()
if okay then
if trace_state then
@@ -611,15 +620,17 @@ local function preparesplit(specification) -- a rather large function
end
elseif penalty < 0 then
-- we don't care too much
- unlock(penalty)
+ unlock(4,penalty)
elseif penalty >= 10000 then
if not lastcurrent then
- lock(penalty,current)
+ lock(1,penalty,current)
elseif penalty > lastlocked then
- lock(penalty)
+ lock(2,penalty)
+ elseif trace_state then
+ report_state("penalty %s, ignoring in column %s, case %i",penalty,column,3)
end
else
- unlock(penalty)
+ unlock(5,penalty)
end
end
@@ -687,6 +698,10 @@ local function preparesplit(specification) -- a rather large function
local id = getid(current)
local nxt = getnext(current)
+ if trace_state then
+ report_state("%-8s > column %s, height %p, depth %p, id %s","node",column,height,depth,nodecodes[id])
+ end
+
backtracked = false
if id == hlist_code or id == vlist_code then
@@ -788,7 +803,7 @@ local function finalize(result)
local t = { }
for i=1,#list do
local l = list[i]
- local h = new_hlist()
+ local h = new_vlist() -- was hlist but that's wrong
local g = getlist(l)
t[i] = h
setlist(h,g)
@@ -869,12 +884,12 @@ end
local function getsplit(result,n)
if not result then
- report_state("flush, column %s, no result",n)
+ report_state("flush, column %s, %s",n,"no result")
return
end
local r = result.results[n]
if not r then
- report_state("flush, column %s, empty",n)
+ report_state("flush, column %s, %s",n,"empty")
end
local h = r.head
if not h then
@@ -970,9 +985,8 @@ local function getsplit(result,n)
for i=1,#list-1 do
setdepth(list[i],0)
end
- local b = vpack(l) -- multiple arguments, todo: fastvpack
- -- setbox("global",c,b)
- setbox(c,b)
+ local b = vpack(l) -- multiple arguments, todo: fastvpack
+ setbox("global",c,b) -- when we wrap in a box
r.inserts[c] = nil
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-mix.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-mix.mkiv
index 436c4a1dcf6..f54b8ec71d4 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-mix.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-mix.mkiv
@@ -242,7 +242,8 @@
\page_one_command_routine
\fi
\global\setbox\b_page_mix_preceding\vbox % pack ?
- {\page_otr_command_flush_top_insertions
+ {\forgetall
+ \page_otr_command_flush_top_insertions
\ifdim\htdp\b_page_mix_preceding=\zeropoint \else
\writestatus\m!columns{preceding error}%
\unvbox\b_page_mix_preceding
@@ -261,7 +262,7 @@
\unexpanded\def\page_mix_command_set_hsize
{\hsize\d_page_mix_column_width
- \textwidth\d_page_mix_column_width}
+ \columnwidth\d_page_mix_column_width}
%D When setting the vsize we make sure that we collect a few more lines than needed
%D so that we have enough to split over the columns. Collecting too much is somewhat
@@ -566,6 +567,11 @@
%
\d_page_mix_column_width\dimexpr(\d_page_mix_max_width-\d_page_mix_distance*\numexpr(\c_page_mix_n_of_columns-\plusone)\relax)/\c_page_mix_n_of_columns\relax
%
+ \columnwidth \d_page_mix_column_width
+ \columndistance\d_page_mix_distance
+ \nofcolumns \c_page_mix_n_of_columns
+ \textwidth \d_page_mix_column_width % kind of redundant but we had it so ...
+ %
\usemixedcolumnscolorparameter\c!color
%
\insidecolumnstrue % new
@@ -704,7 +710,7 @@
\page_lines_add_numbers_to_box\scratchbox\recurselevel\c_page_mix_n_of_columns\plusone % new
\page_marks_synchronize_column\plusone\c_page_mix_n_of_columns\recurselevel\scratchbox
% backgrounds
- \anch_mark_column_box\scratchbox
+ \anch_mark_column_box\scratchbox\recurselevel
% for the moment a quick and dirty patch .. we need to go into the box (hence the \plusone) .. a slowdowner
% moved to start: \page_lines_add_numbers_to_box\scratchbox\recurselevel\c_page_mix_n_of_columns\plusone
% the framed needs a reset of strut, align, setups etc
@@ -773,6 +779,23 @@
\hss
\egroup}
+% \unexpanded\def\page_mix_command_package_column
+% {\page_mix_hbox to \d_page_mix_column_width \bgroup
+% % maybe intercept empty
+% \ruledhpack\bgroup
+% \clf_mixgetsplit\recurselevel\relax
+% \egroup
+% \hskip-\d_page_mix_column_width
+% \ruledhpack \bgroup
+% \hsize\d_page_mix_column_width
+% \ifconditional\c_page_mix_process_notes
+% \placenoteinserts
+% \fi
+% \egroup
+% \hss
+% \egroup}
+
+
\unexpanded\def\page_mix_routine_continue
{\bgroup
\forgetall
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-mul.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-mul.mkiv
index 957981703e4..f1d68827ab7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-mul.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-mul.mkiv
@@ -461,7 +461,7 @@
\setfalse\c_page_mul_preceding_present % will be set elsewhere
\else
\settrue\c_page_mul_preceding_present
- \page_postprocessors_box\b_page_mul_preceding
+ \page_apply_postprocessors_box\b_page_mul_preceding
\fi
\forgetall
\page_mul_initialize_variables
@@ -487,7 +487,7 @@
{\setbox\scratchbox\hpack
{\ifx\finishcolumnbox\relax\else\strut\fi
\box\currentcolumnbox}% hm, why strut
- \anch_mark_column_box\scratchbox
+ \anch_mark_column_box\scratchbox\currentcolumn
\box\scratchbox}%
\hfil}%
\unskip
@@ -612,18 +612,21 @@
%D This feature is implemented using the reshape macros presented
%D in \type{supp-box}.
-\ifdefined\page_postprocessors_column\else\let\page_postprocessors_column\relax\fi % operates on passed box
+%ifdefined\page_postprocessors_column\else\let\page_postprocessors_column\relax\fi % operates on passed box
\ifdefined\postprocesscolumnline \else\let\postprocesscolumnline \relax\fi % operates on passed box
\ifdefined\postprocesscolumnbox \else\let\postprocesscolumnbox \relax\fi % operates on passed box
\ifdefined\postprocesscolumnpagebox \else\let\postprocesscolumnpagebox \relax\fi % operates on passed box
-\def\page_mul_postprocess_linenumbers{\ifx\page_postprocessors_column\relax\else\page_mul_postprocess_linenumbers_indeed\fi}
+%def\page_mul_postprocess_linenumbers{\ifx\page_postprocessors_column\relax\else\page_mul_postprocess_linenumbers_indeed\fi}
\def\page_mul_postprocess_lines {\ifx\postprocesscolumnline \relax\else\page_mul_postprocess_lines_indeed \fi}
\def\page_mul_postprocess_columns {\ifx\postprocesscolumnbox \relax\else\page_mul_postprocess_columns_indeed \fi}
\def\page_mul_postprocess_page {\ifx\postprocesscolumnpagebox \relax\else\page_mul_postprocess_page_indeed \fi}
-\def\page_mul_postprocess_linenumbers_indeed
- {\dohandleallcolumns{\page_postprocessors_column\currentcolumnbox}}
+% \def\page_mul_postprocess_linenumbers_indeed
+% {\dohandleallcolumns{\page_apply_postprocessors_column\currentcolumnbox}}
+
+\def\page_mul_postprocess_linenumbers
+ {\dohandleallcolumns{\page_apply_postprocessors_column\currentcolumnbox}}
\def\page_mul_postprocess_lines_indeed
{\dohandleallcolumnscs\page_mul_postprocess_lines_step}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-not.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-not.mkiv
index d7602bd2658..d6f63846f6e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-not.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-not.mkiv
@@ -22,20 +22,20 @@
\unprotect
-\def\checkbegincolumnfootnotes % should happen inside otr
- {\ifcase\c_strc_notes_page_location
- \erasenotebackup
- \else
- \flushnotes
- \savenotecontent
- \fi
- \savenotedata}
+% \def\checkbegincolumnfootnotes % should happen inside otr
+% {\ifcase\c_strc_notes_page_location
+% \erasenotebackup
+% \else
+% \flushnotes
+% \savenotecontent
+% \fi
+% \savenotedata}
-\def\checkendcolumnfootnotes
- {\restorenotedata
- \ifcase\c_strc_notes_page_location\else
- \restorenotecontent
- \fi}
+% \def\checkendcolumnfootnotes
+% {\restorenotedata
+% \ifcase\c_strc_notes_page_location\else
+% \restorenotecontent
+% \fi}
\let\checksinglecolumnfootnotes\relax
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-one.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-one.mkiv
index 64c4a713498..85ed76da180 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-one.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-one.mkiv
@@ -29,7 +29,8 @@
{\page_otr_eject_page_and_flush_inserts}
\unexpanded\def\page_one_command_set_hsize
- {\global\hsize\textwidth}
+ {\global\hsize\textwidth
+ \columnwidth\textwidth} % bonus so that it's not zero
\unexpanded\def\page_one_command_set_float_hsize
{\global\hsize\textwidth}
@@ -76,7 +77,7 @@
\global\advance\vsize\d_page_adapts_delta
% alternatively we could set it in builders.buildpage_filter
% \ifdim\pagegoal<\maxdimen .. \fi
- \global\pagegoal\dimexpr\vsize-\d_page_floats_inserted_top-\d_page_floats_inserted_bottom\relax}
+ \pagegoal\dimexpr\vsize-\d_page_floats_inserted_top-\d_page_floats_inserted_bottom\relax}
% 1 = partial page, 2 = whole page, 3 = partial page
@@ -146,14 +147,18 @@
\page_one_registered_text_area_a#1#2% \unvbox <box>
%
\ifgridsnapping
+ \unskip % new per 2019-06-18, otherwise weird bottom floats
\vkern\dimexpr\openstrutdepth-\d_page_one_natural_depth\relax
\prevdepth\openstrutdepth
\page_otr_command_flush_bottom_insertions
\vfil
\else\ifcase\bottomraggednessmode
% ragged (default)
+ \unskip % new per 2019-06-18, otherwise weird bottom floats
\vkern\dimexpr\openstrutdepth-\d_page_one_natural_depth\relax
\prevdepth\openstrutdepth
+ % these have whitespace before but we can have some more options
+ % like a \vfill or so
\page_otr_command_flush_bottom_insertions
\vfil
\or
@@ -161,6 +166,7 @@
\page_otr_command_flush_bottom_insertions
\or
% baseline
+ \unskip % new per 2019-06-18, otherwise weird bottom floats
\vkern\dimexpr\maxdepth-\d_page_one_natural_depth\relax
\page_otr_command_flush_bottom_insertions
\fi\fi
@@ -373,35 +379,37 @@
\fi \fi
\snaptogrid\hpack{\box\floatbox}} % was copy
-\def\page_one_command_flush_floats_indeed % much in common with OTRSET
+\def\page_one_command_floats_get_compressed
+ {\setfalse\c_page_floats_center_box % not needed as we do call directly
+ %% no longer (interferes with footnotes):
+ %%
+ %% \page_one_command_set_vsize % test 2011.06.24.001
+ %%
+ \global\setbox\floatbox\hbox to \hsize
+ {\hfil
+ \dorecurse\nofcollectedfloats
+ {\ifcase\columndirection % nog document wide
+ \page_floats_flush\s!text\plusone
+ \else
+ \page_floats_flush\s!text{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}%
+ \fi
+ \hpack to \ifdim\naturalfloatwd>\makeupwidth\makeupwidth\else\naturalfloatwd\fi
+ {\hss\box\floatbox\hss}%
+ \ifnum\recurselevel<\nofcollectedfloats
+ \hfil
+ \fi}%
+ \hfil}}
+
+\def\page_one_command_flush_floats_indeed
{\ifconditional\c_page_floats_some_waiting
\ifconditional\c_page_floats_pack_flushed
- \page_floats_collect\s!text\hsize\emwidth
+ \page_floats_collect\s!text\hsize\d_page_floats_compress_distance
\ifcase\nofcollectedfloats
\page_floats_get
+ \or
+ \page_floats_get
\else
- \setfalse\c_page_floats_center_box % not needed as we do call directly
- %% no longer (interferes with footnotes):
- %%
- %% \page_one_command_set_vsize % test 2011.06.24.001
- %%
- \global\setbox\floatbox\hbox to \hsize
- {\hfil
- \dorecurse\nofcollectedfloats
- {\ifcase\columndirection % nog document wide
- \page_floats_flush\s!text\plusone
- \else
- \page_floats_flush\s!text{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}%
- \fi
- \ifdim\wd\floatbox>\makeupwidth % \hsize
- \hpack to \makeupwidth{\hss\box\floatbox\hss}%
- \else
- \box\floatbox
- \fi
- \ifnum\recurselevel<\nofcollectedfloats
- \hfil
- \fi}%
- \hfil}%
+ \page_one_command_floats_get_compressed
\fi
\else
\page_floats_get
@@ -438,7 +446,13 @@
\fi
% should be an option
\endgroup
- \scratchdimenone\dimexpr\pagetotal+\floatheight+\d_strc_floats_top-\pageshrink\relax
+ \scratchdimenone\dimexpr
+ \pagetotal
+ +\floatheight
+ +\d_strc_floats_top
+ +\d_strc_floats_overflow
+ -\pageshrink
+ \relax
\scratchdimentwo\pagegoal
\relax % needed
\ifcase\c_page_one_float_method
@@ -666,6 +680,9 @@
\endgroup
\fi}
+\unexpanded\def\page_one_command_flush_facing_floats
+ {\strc_floats_facing_flush}
+
\defineoutputroutine
[\s!singlecolumn]
[\s!page_otr_command_routine =\page_one_command_routine,
@@ -689,8 +706,9 @@
\s!page_otr_command_flush_saved_floats =\page_one_command_flush_saved_floats,
\s!page_otr_command_flush_all_floats =\page_one_command_flush_all_floats,
\s!page_otr_command_flush_margin_blocks =\page_one_command_flush_margin_blocks,
- \s!page_otr_command_test_column =\page_one_command_test_page
- ]
+ \s!page_otr_command_test_column =\page_one_command_test_page,
+ \s!page_otr_command_flush_facing_floats =\page_one_command_flush_facing_floats
+]
% \setupoutputroutine
% [\s!singlecolumn]
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-otr.mkvi b/Master/texmf-dist/tex/context/base/mkiv/page-otr.mkvi
index 909f5cd4d1e..6feb15a9d61 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-otr.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-otr.mkvi
@@ -285,6 +285,7 @@
\definesystemconstant{page_otr_command_flush_all_floats}
\definesystemconstant{page_otr_command_flush_margin_blocks}
\definesystemconstant{page_otr_command_test_column}
+\definesystemconstant{page_otr_command_flush_facing_floats}
\definesystemconstant{singlecolumn}
\definesystemconstant{multicolumn} % will move
@@ -313,7 +314,8 @@
\s!page_otr_command_flush_saved_floats,
\s!page_otr_command_flush_all_floats,
\s!page_otr_command_flush_margin_blocks,
- \s!page_otr_command_test_column]
+ \s!page_otr_command_test_column,
+ \s!page_otr_command_flush_facing_floats]
\appendtoks
\setupoutputroutine[\s!singlecolumn]%
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-pcl.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-pcl.mkiv
index 140444fc27b..09368c53746 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-pcl.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-pcl.mkiv
@@ -94,7 +94,9 @@
\else
\numexpr\c_page_col_n_of_columns-\plusone\relax
\dimexpr\d_page_col_column_width+\d_page_col_distance\relax
- \fi}
+ \fi
+ % consistent with mixed:
+ \textwidth\d_page_col_column_width}
%D \unknown
@@ -112,13 +114,19 @@
%D \unknown
+\def\page_col_registered_text_area_b#1%
+ {\begingroup
+ \makeupwidth\d_page_col_column_width
+ \page_one_registered_text_area_b{#1}%
+ \endgroup}
+
\unexpanded\def\page_col_command_package_contents#1#2% \box<n> \unvbox<n> % this one will be redone (checked)
{\bgroup
\setbox\b_page_one_contents\vbox to \textheight
{\page_one_registered_text_area_a#1#2}%
\page_one_command_package_show_state
\ht\b_page_one_contents\textheight
- \page_one_registered_text_area_b
+ \page_col_registered_text_area_b
{\box\b_page_one_contents}%
\egroup}
@@ -174,13 +182,13 @@
\ht\b_page_one_bottom_notes\zeropoint
\wd\b_page_one_bottom_notes\zeropoint
\wd\b_page_one_bottom_notes\d_page_col_column_width
- \page_one_registered_text_area_b
+ \page_col_registered_text_area_b
{\vpack to \textheight
- {\hbox{\box\b_page_one_contents\box\b_page_one_bottom_notes}}}%
+ {\hpack{\box\b_page_one_contents\box\b_page_one_bottom_notes}}}%
\else
\ht\b_page_one_contents\textheight
\wd\b_page_one_contents\d_page_col_column_width
- \page_one_registered_text_area_b
+ \page_col_registered_text_area_b
{\box\b_page_one_contents}%
\fi
\egroup}
@@ -238,7 +246,7 @@
\page_lines_add_numbers_to_box\scratchbox\recurselevel\c_page_col_n_of_columns\plusone % new
\page_marks_synchronize_column\plusone\c_page_col_n_of_columns\recurselevel\scratchbox
% backgrounds
- \anch_mark_column_box\scratchbox
+ \anch_mark_column_box\scratchbox\recurselevel
\mixedcolumnseparatorheight\ht\scratchbox
\mixedcolumnseparatordepth \dp\scratchbox
\inheritedpagecolumnsframedbox\recurselevel\scratchbox}
@@ -392,10 +400,9 @@
\def\page_col_command_flush_floats_indeed % much in common with OTRSET
{\ifconditional\c_page_floats_some_waiting
- \ifconditional\c_page_floats_pack_flushed
+ \ifconditional\c_page_floats_compress_flushed
\setfalse\c_page_floats_center_box % not needed as we do call directly
- %
- \page_floats_collect\s!text\hsize\emwidth
+ \page_floats_collect\s!text\hsize\d_page_floats_compress_distance
%
\ifnum\nofcollectedfloats=\plusone
\ifdim\naturalfloatwd>\hsize
@@ -415,7 +422,7 @@
% this could happen at the lua end instead
\scratchdimen\dimexpr\wd\floatbox-\naturalfloatwd\relax
\ifdim\scratchdimen<\zeropoint
- \global\setbox\floatbox\hpack spread -\scratchdimen{\hss\box\floatbox\hss}%
+ \global\setbox\floatbox\hpack spread -\scratchdimen{\hss\box\floatbox\hss}%
\fi
%
\ifdim\wd\floatbox>\textwidth % \hsize
@@ -724,9 +731,6 @@
\setuevalue{\e!stop \currentpagecolumns}{\stoppagecolumns}%
\to \everydefinepagecolumns
-\ifdefined \columnwidth \else \newdimen\columnwidth \fi
-\ifdefined \columndistance \else \newdimen\columndistance \fi
-
\def\page_col_pickup_preceding
{\begingroup
\setupoutputroutine[\s!mixedcolumn]%
@@ -795,6 +799,8 @@
%
\columnwidth \d_page_col_column_width
\columndistance \d_page_col_distance
+ \nofcolumns \c_page_col_n_of_columns
+ \textwidth \columnwidth % kind of redundant
%
\nopenalties
%
@@ -830,8 +836,6 @@
\page_col_command_set_vsize
\page_col_command_set_hsize
%
- \nofcolumns\c_page_mix_n_of_columns
- %
\unexpanded\def\page_col_start[##1]%
{\page_col_start_nop}%
%
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-run.lua b/Master/texmf-dist/tex/context/base/mkiv/page-run.lua
index c0a2022b24f..cb8cf03117f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-run.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-run.lua
@@ -186,3 +186,38 @@ function commands.showlayout(options)
end
+local report = logs.reporter("usage")
+
+function commands.showusage()
+ report("")
+ report("status after shipping out page %s",tex.getcount("realpageno"))
+ report("")
+ report(" filename : %s", status.filename)
+ report(" inputid : %s", status.inputid)
+ report(" linenumber : %s", status.linenumber)
+ report(" input pointer : %s", status.input_ptr)
+ report("")
+ report(" string pointer : %s of %s", status.str_ptr, status.max_strings + status.init_str_ptr)
+ report(" pool size : %s", status.pool_size)
+ report("")
+ report(" node memory usage : %s of %s", status.var_used, status.var_mem_max)
+ report(" token memory usage : %s of %s", status.dyn_used, status.fix_mem_max)
+ report("")
+ report(" cs count : %s of %s", status.cs_count, status.hash_size + status.hash_extra)
+ report("")
+ report(" stack size : %s of %s", status.max_in_stack, status.stack_size)
+ report(" nest size : %s of %s", status.max_nest_stack, status.nest_size)
+ report(" parameter size : %s of %s", status.max_param_stack, status.param_size)
+ report(" buffer size : %s of %s", status.max_buf_stack, status.buf_size)
+ report(" save size : %s of %s", status.max_save_stack, status.save_size)
+ report("")
+ report(" luabytecode bytes : %s in %s registers", status.luabytecode_bytes, status.luabytecodes)
+ report(" luastate bytes : %s of %s", status.luastate_bytes, status.luastate_bytes_max or "unknown")
+ report("")
+ report(" callbacks : %s", status.callbacks)
+ report(" indirect callbacks : %s", status.indirect_callbacks)
+ report(" saved callbacks : %s", status.saved_callbacks)
+ report(" direct callbacks : %s", status.direct_callbacks)
+ report(" function callbacks : %s", status.function_callbacks)
+ report("")
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-run.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-run.mkiv
index 85da8d9e5fb..d3efe169816 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-run.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-run.mkiv
@@ -206,13 +206,19 @@
\gdef\page_grids_add_to_one_indeed#1%
{\begingroup
\resetvisualizers
- \global\setbox#1\vpack{\backgroundline[layout:one]{\box#1}}%
+ \global\setbox#1\vpack{\noindent\backgroundline[layout:one]{\box#1}}%
\endgroup}
\gdef\page_grids_add_to_mix_indeed#1%
{\begingroup
\resetvisualizers
- \global\setbox#1\vpack{\backgroundline[layout:mix]{\box#1}}%
+ \global\setbox#1\vpack{\noindent\backgroundline[layout:mix]{\box#1}}%
\endgroup}
+%D The next command shows some statistics (we might add more in due time):
+
+\unexpanded\gdef\showusage
+ {\gtoksapp\everyaftershipout{\ctxcommand{showusage()}}%
+ \glet\showusage\relax}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-sid.mkiv b/Master/texmf-dist/tex/context/base/mkiv/page-sid.mkiv
index 8033812447b..e6c1be985d7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-sid.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-sid.mkiv
@@ -84,6 +84,8 @@
\newcount \c_page_sides_m_of_lines
\newconditional \c_page_sides_delayed
+\newconditional \c_page_sides_check_same_page
+
\newif \iftracesidefloats % public (might change)
%D Defaults:
@@ -399,10 +401,18 @@
{\iftracesidefloats
\begingroup
\c_page_force_strut_depth_trace_mode\plusone
- \forcestrutdepth
+ \ifconditional\c_page_sides_check_same_page
+ \forcestrutdepthplus
+ \else
+ \forcestrutdepth
+ \fi
\endgroup
\else
- \forcestrutdepth
+ \ifconditional\c_page_sides_check_same_page
+ \forcestrutdepthplus
+ \else
+ \forcestrutdepth
+ \fi
\fi
\page_otr_command_set_vsize} % new
@@ -712,7 +722,7 @@
\advance\d_page_sides_progress-\pagetotal
\fi}
-\def\page_sides_analyse_space
+\def\page_sides_analyse_space_stage_one
{\global\settrue\c_page_sides_flag
% \ifdim\pagegoal=\maxdimen
% \pagegoal\textheight % maybe
@@ -751,8 +761,10 @@
% \advance\scratchdimenone -\onepoint (maybe)
\else
\advance\scratchdimentwo -\strutdp
- \fi
- % how about \pagedepth
+ \fi}
+
+\def\page_sides_analyse_space_stage_two
+ {% how about \pagedepth
\ifdim\scratchdimenone>\scratchdimentwo
\global\setfalse\c_page_floats_room
\else
@@ -767,6 +779,22 @@
\global\settrue\c_page_floats_room
\fi}
+\def\page_sides_analyse_space
+ {\page_sides_analyse_space_stage_one
+ \ifconditional\c_page_sides_check_same_page
+ \ifdim\d_spac_prevcontent>\zeropoint
+ \ifdim\dimexpr\scratchdimenone+\d_spac_prevcontent>\scratchdimentwo
+ \clf_pushatsame
+ \setbox\scratchbox\vpack{\clf_popatsame}%
+ \page
+ \box\scratchbox
+ \vskip-\lineskip
+ \page_sides_analyse_space_stage_one
+ \fi
+ \fi
+ \fi
+ \page_sides_analyse_space_stage_two}
+
%D As we have no clear end of one or more paragraphs we only have pre float
%D skips.
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-str.lua b/Master/texmf-dist/tex/context/base/mkiv/page-str.lua
index ebb49a918c2..73f1782d0b6 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-str.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-str.lua
@@ -177,19 +177,21 @@ function streams.synchronize(list) -- this is an experiment !
for i=1,#list do
local name = list[i]
local dana = data[name]
- local slot = dana[m]
- if slot then
- local vbox = vpack_node_list(slot)
- local wd, ht, dp = getwhd(vbox)
- if ht > height then
- height = ht
- end
- if dp > depth then
- depth = dp
- end
- dana[m] = vbox
- if trace_flushing then
- report_streams("slot %s of %a is packed to height %p and depth %p",m,name,ht,dp)
+ if dana then
+ local slot = dana[m]
+ if slot then
+ local vbox = vpack_node_list(slot)
+ local wd, ht, dp = getwhd(vbox)
+ if ht > height then
+ height = ht
+ end
+ if dp > depth then
+ depth = dp
+ end
+ dana[m] = vbox
+ if trace_flushing then
+ report_streams("slot %s of %a is packed to height %p and depth %p",m,name,ht,dp)
+ end
end
end
end
@@ -202,41 +204,43 @@ function streams.synchronize(list) -- this is an experiment !
for i=1,#list do
local name = list[i]
local dana = data[name]
- local vbox = dana[m]
- if vbox then
- local wd, ht, dp = getwhd(vbox)
- local delta_height = height - ht
- local delta_depth = depth - dp
- if delta_height > 0 or delta_depth > 0 then
- if false then
- -- actually we need to add glue and repack
- setwhd(vbox,false,height,depth)
- if trace_flushing then
- report_streams("slot %s of %a with delta (%p,%p) is compensated",m,i,delta_height,delta_depth)
- end
- else
- -- this is not yet ok as we also need to keep an eye on vertical spacing
- -- so we might need to do some splitting or whatever
- local list = getlist(vbox)
- local tail = list and slide_node_list(list)
- local n = 0
- local delta = delta_height -- for tracing
- while delta > 0 do
- -- we need to add some interline penalties
- local line = copy_node_list(getbox("strutbox"))
- setwhd(line,false,strutht,strutdp)
- if tail then
- setlink(tail,line)
+ if dana then
+ local vbox = dana[m]
+ if vbox then
+ local wd, ht, dp = getwhd(vbox)
+ local delta_height = height - ht
+ local delta_depth = depth - dp
+ if delta_height > 0 or delta_depth > 0 then
+ if false then
+ -- actually we need to add glue and repack
+ setwhd(vbox,false,height,depth)
+ if trace_flushing then
+ report_streams("slot %s of %a with delta (%p,%p) is compensated",m,i,delta_height,delta_depth)
+ end
+ else
+ -- this is not yet ok as we also need to keep an eye on vertical spacing
+ -- so we might need to do some splitting or whatever
+ local list = getlist(vbox)
+ local tail = list and slide_node_list(list)
+ local n = 0
+ local delta = delta_height -- for tracing
+ while delta > 0 do
+ -- we need to add some interline penalties
+ local line = copy_node_list(getbox("strutbox"))
+ setwhd(line,false,strutht,strutdp)
+ if tail then
+ setlink(tail,line)
+ end
+ tail = line
+ n = n + 1
+ delta = delta - struthtdp
+ end
+ dana[m] = vpack_node_list(getlist(vbox))
+ setlist(vbox)
+ flush_node(vbox)
+ if trace_flushing then
+ report_streams("slot %s:%s with delta (%p,%p) is compensated by %s lines",m,i,delta_height,delta_depth,n)
end
- tail = line
- n = n + 1
- delta = delta - struthtdp
- end
- dana[m] = vpack_node_list(getlist(vbox))
- setlist(vbox)
- flush_node(vbox)
- if trace_flushing then
- report_streams("slot %s:%s with delta (%p,%p) is compensated by %s lines",m,i,delta_height,delta_depth,n)
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-txt.mklx b/Master/texmf-dist/tex/context/base/mkiv/page-txt.mklx
new file mode 100644
index 00000000000..b8184e44367
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-txt.mklx
@@ -0,0 +1,969 @@
+% macros=mkvi
+
+%D \module
+%D [ file=page-txt, % copied from main-001,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Texts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Texts}
+
+\unprotect
+
+\newtoks\toptextcontent \newtoks\leftedgetextcontent
+\newtoks\headertextcontent \newtoks\leftmargintextcontent
+\newtoks\footertextcontent \newtoks\rightmargintextcontent
+\newtoks\bottomtextcontent \newtoks\rightedgetextcontent
+
+\newtoks\texttextcontent
+
+%D \macros
+%D {setuptop, setupheader, setuptext,setupfooter, setupbottom}
+%D
+%D The macros in this module sometimes look a bit more complicated than needed,
+%D which is a direct result of the fact that their ancestors are quite old and
+%D upward compatibility is a must.
+%D
+%D \showsetup{setuptop}
+%D \showsetup{setupheader}
+%D \showsetup{setuptext}
+%D \showsetup{setupfooter}
+%D \showsetup{setupbottom}
+
+\installcorenamespace{layouttexts}
+\installcorenamespace{layouttextsline}
+\installcorenamespace{layouttextsreset}
+\installcorenamespace{layouttextssynchronize}
+\installcorenamespace{layouttextstrut}
+\installcorenamespace{layouttextspecial}
+\installcorenamespace{layouttextcontent}
+
+\installcommandhandler \??layouttexts {layoutelement} \??layouttexts
+
+% \appendtoks
+% \resetlayoutelementparameter\c!lefttext % resolves better
+% \resetlayoutelementparameter\c!middletext
+% \resetlayoutelementparameter\c!righttext
+% \to \everydefinelayoutelement
+
+\definelayoutelement[\v!top ]
+\definelayoutelement[\v!header]
+\definelayoutelement[\v!text ]
+\definelayoutelement[\v!footer]
+\definelayoutelement[\v!bottom]
+
+\definelayoutelement[\v!top :\v!text] [\v!top ][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!header:\v!text] [\v!header][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!text :\v!text] [\v!text ][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!footer:\v!text] [\v!footer][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!bottom:\v!text] [\v!bottom][\c!lefttext=,\c!middletext=,\c!righttext=]
+
+\definelayoutelement[\v!top :\v!margin][\v!top ][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!header:\v!margin][\v!header][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!text :\v!margin][\v!text ][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!footer:\v!margin][\v!footer][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!bottom:\v!margin][\v!bottom][\c!lefttext=,\c!middletext=,\c!righttext=]
+
+\definelayoutelement[\v!top :\v!edge] [\v!top ][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!header:\v!edge] [\v!header][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!text :\v!edge] [\v!text ][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!footer:\v!edge] [\v!footer][\c!lefttext=,\c!middletext=,\c!righttext=]
+\definelayoutelement[\v!bottom:\v!edge] [\v!bottom][\c!lefttext=,\c!middletext=,\c!righttext=]
+
+\unexpanded\def\setuplayouttext
+ {\dotripleempty\page_layouts_setup_text}
+
+\def\page_layouts_setup_text[#vertical][#horizontal][#settings]%
+ {\ifthirdargument
+ \setuplayoutelement[#vertical:#horizontal][#settings]%
+ \else
+ \setuplayoutelement[#vertical][#horizontal]%
+ \fi}
+
+\appendtoks
+ \ifx\currentlayoutelement\empty\else
+ \page_layouts_synchronize_element\currentlayoutelement % brr, can be vertical:horizontal
+ \fi
+\to \everysetuplayoutelement
+
+\def\page_layouts_reset_element_status#vertical%
+ {\expandafter\normalgdef\csname\??layouttextsreset#vertical\endcsname{\page_layouts_set_element_status_normal#vertical}}
+
+\def\page_layouts_set_element_status_normal#vertical%
+ {\expandafter\glet\csname\namedlayoutelementhash#vertical\c!state\endcsname\v!normal
+ \expandafter\glet\csname\??layouttextsreset#vertical\endcsname\relax
+ \page_layouts_synchronize_element{#vertical}}
+
+\def\page_layouts_synchronize_element#vertical%
+ {\xdef\previoustextstate{\csname\??layouttextssynchronize#vertical\endcsname}% can be a let
+ \edef\currenttextstate {\namedlayoutelementparameter{#vertical}\c!state}%
+ %\writestatus{>>}{[#vertical:\currenttextstate/\previoustextstate]}%
+ \ifx\currenttextstate\previoustextstate \else
+ \page_layouts_synchronize_element_indeed{#vertical}%
+ \fi}
+
+\def\page_layouts_synchronize_element_indeed#vertical%
+ {\ifx\currenttextstate \v!high \calculatevsizes\page_backgrounds_recalculate \orelse
+ \ifx\previoustextstate\v!high \calculatevsizes\page_backgrounds_recalculate \orelse
+ \ifx\currenttextstate \v!none \calculatevsizes\page_backgrounds_recalculate \orelse
+ \ifx\previoustextstate\v!none \calculatevsizes\page_backgrounds_recalculate \fi
+ \letgvalue{\??layouttextssynchronize#vertical}\currenttextstate}
+
+\unexpanded\def\setuptop {\dotripleempty\page_layouts_setup_text[\v!top ]}
+\unexpanded\def\setupheader{\dotripleempty\page_layouts_setup_text[\v!header]}
+\unexpanded\def\setuptext {\dotripleempty\page_layouts_setup_text[\v!text ]}
+\unexpanded\def\setupfooter{\dotripleempty\page_layouts_setup_text[\v!footer]}
+\unexpanded\def\setupbottom{\dotripleempty\page_layouts_setup_text[\v!bottom]}
+
+%D We inherit some settings:
+
+\setuplayoutelement
+ [ \c!leftstyle=\layoutelementparameter\c!style,
+ \c!middlestyle=\layoutelementparameter\c!style,
+ \c!rightstyle=\layoutelementparameter\c!style,
+ \c!leftcolor=\layoutelementparameter\c!color,
+ \c!middlecolor=\layoutelementparameter\c!color,
+ \c!rightcolor=\layoutelementparameter\c!color,
+ \c!leftwidth=\layoutelementparameter\c!width,
+ \c!middlewidth=\layoutelementparameter\c!width,
+ \c!rightwidth=\layoutelementparameter\c!width]
+
+%D \macros
+%D {noheaderandfooterlines,notopandbottomlines}
+%D
+%D Although not really needed, the following shortcuts sometimes come in handy.
+%D
+%D \showsetup{noheaderandfooterlines}
+%D \showsetup{notopandbottomlines}
+
+\unexpanded\def\noheaderandfooterlines
+ {\setuplayoutelement[\v!header][\c!state=\v!empty]%
+ \setuplayoutelement[\v!footer][\c!state=\v!empty]}
+
+\unexpanded\def\notopandbottomlines
+ {\setuplayoutelement[\v!top ][\c!state=\v!empty]%
+ \setuplayoutelement[\v!bottom][\c!state=\v!empty]}
+
+%D \macros
+%D {setuptoptexts,setupheadertexts,setuptexttexts,setupfootertexts,setupbottomtexts}
+%D
+%D The next macros take one or more arguments. The exact setup depends on the number
+%D of arguments. Although not that intuitive, the current scheme evolved out of the
+%D original. When margin and edge texts as well as middle texts showed up, the
+%D current odd|/|even scheme surfaced.
+%D
+%D \showsetup{setuptoptexts}
+%D \showsetup{setupheadertexts}
+%D \showsetup{setuptexttexts}
+%D \showsetup{setupfootertexts}
+%D \showsetup{setupbottomtexts}
+%D
+%D Only the following have checking for pagenumber, date and mark built in, so when
+%D someone uses the key|/|value interface these things have to be set explicitly as
+%D part of the text.
+
+\unexpanded\def\setuptoptexts {\dosixtupleempty\page_layouts_setup_texts[\v!top ]}
+\unexpanded\def\setupheadertexts{\dosixtupleempty\page_layouts_setup_texts[\v!header]}
+\unexpanded\def\setuptexttexts {\dosixtupleempty\page_layouts_setup_texts[\v!text ]}
+\unexpanded\def\setupfootertexts{\dosixtupleempty\page_layouts_setup_texts[\v!footer]}
+\unexpanded\def\setupbottomtexts{\dosixtupleempty\page_layouts_setup_texts[\v!bottom]}
+
+\unexpanded\def\page_layouts_setup_text_six[#vertical][#horizontal][#a][#b][#c][#d]%
+ {\edef\currentlayoutelement{#vertical:#horizontal}%
+ \setlayoutelementparameter\c!lefttext {\page_layouts_process_element_double{#a}{#d}}%
+ \setlayoutelementparameter\c!righttext{\page_layouts_process_element_double{#b}{#c}}}
+
+\unexpanded\def\page_layouts_setup_text_five[#vertical][#horizontal][#a][#b][#c][#d]%
+ {\edef\currentlayoutelement{#vertical:\v!text}%
+ \setlayoutelementparameter\c!lefttext {\page_layouts_process_element_double{#horizontal}{#c}}%
+ \setlayoutelementparameter\c!righttext{\page_layouts_process_element_double{#a}{#b}}}
+
+\unexpanded\def\page_layouts_setup_text_four[#vertical][#horizontal][#a][#b][#c][#d]%
+ {\edef\currentlayoutelement{#vertical:#horizontal}%
+ \setlayoutelementparameter\c!lefttext {\page_layouts_process_element_single{#a}}%
+ \setlayoutelementparameter\c!righttext{\page_layouts_process_element_single{#b}}}
+
+\unexpanded\def\page_layouts_setup_text_three[#vertical][#horizontal][#a][#b][#c][#d]%
+ {\edef\currentlayoutelement{#vertical:\v!text}%
+ \setlayoutelementparameter\c!lefttext {\page_layouts_process_element_single{#horizontal}}%
+ \setlayoutelementparameter\c!righttext{\page_layouts_process_element_single{#a}}}
+
+\unexpanded\def\page_layouts_setup_text_two[#vertical][#horizontal][#a][#b][#c][#d]%
+ {\edef\currentlayoutelement{#vertical:\v!text}%
+ \resetlayoutelementparameter\c!lefttext
+ \resetlayoutelementparameter\c!righttext
+ \setlayoutelementparameter \c!middletext{\page_layouts_process_element_single{#horizontal}}}
+
+\unexpanded\def\page_layouts_setup_text_one[#vertical][#horizontal][#a][#b][#c][#d]%
+ {\edef\currentlayoutelement{#vertical:\v!text}%
+ \resetlayoutelementparameter\c!lefttext
+ \resetlayoutelementparameter\c!righttext
+ \resetlayoutelementparameter\c!middletext
+ \edef\currentlayoutelement{#vertical:\v!margin}%
+ \resetlayoutelementparameter\c!lefttext
+ \resetlayoutelementparameter\c!righttext
+ \resetlayoutelementparameter\c!middletext
+ \edef\currentlayoutelement{#vertical:\v!edge}%
+ \resetlayoutelementparameter\c!lefttext
+ \resetlayoutelementparameter\c!righttext
+ \resetlayoutelementparameter\c!middletext}
+
+\unexpanded\def\page_layouts_setup_texts
+ {\ifsixthargument \expandafter\page_layouts_setup_text_six \orelse
+ \iffifthargument \expandafter\page_layouts_setup_text_five \orelse
+ \iffourthargument\expandafter\page_layouts_setup_text_four \orelse
+ \ifthirdargument \expandafter\page_layouts_setup_text_three\orelse
+ \ifsecondargument\expandafter\page_layouts_setup_text_two \else
+ \expandafter\page_layouts_setup_text_one \fi}
+
+%D Left and right texts are swapped on odd and even pages, but only when double
+%D sided typesetting is enabled.
+
+\setvalue{\??layouttextstrut\v!yes}{\setstrut\strut} % maybe more variants
+
+\let\m_page_layouts_element_content\empty
+
+\unexpanded\def\page_layouts_process_element_single#content%
+ {\edef\m_page_layouts_element_content{\detokenize{#content}}% so no \v!xxx
+ \ifcsname\??layouttextspecial\m_page_layouts_element_content\endcsname
+ \lastnamedcs
+ \else
+ \doifelsemarking\m_page_layouts_element_content
+ {\getmarking[\m_page_layouts_element_content][\v!first]}%
+ {#content}%
+ \fi}
+
+\unexpanded\def\page_layouts_process_element_double#first#second%
+ {\doifelseoddpage
+ {\page_layouts_process_element_single{#first}}
+ {\page_layouts_process_element_single{#second}}}
+
+\unexpanded\def\page_layouts_process_element_indeed#style#color#width%
+ {\begingroup
+ \uselayoutelementstyleandcolor#style#color%
+ \begincsname\??layouttextstrut\layoutelementparameter\c!strut\endcsname
+ \ignorecrlf
+ \edef\currentlayoutelementwidth{\layoutelementparameter#width}%
+ \ifx\currentlayoutelementwidth\empty\else
+ \expandafter\page_layouts_process_element_limited
+ \fi\p_text
+ \endgroup}
+
+\def\page_layouts_process_element_limited#content% are the {}{}{} still needed?
+% {\limitatetext{#content{}{}{}}\currentlayoutelementwidth\unknown}
+ {\limitated
+ left \currentlayoutelementwidth
+ text {#content}
+ sentinel {\unknown}
+ \relax}
+
+\setvalue{\??layouttextspecial\v!pagenumber}{\page_layouts_place_page_number}
+\setvalue{\??layouttextspecial\v!date }{\currentdate}
+
+%D When specified, the texts are automatically limited in length.
+
+\appendtoks \page_layouts_place_text_line\v!top \topheight \to \toptextcontent
+\appendtoks \page_layouts_place_text_line\v!header\headerheight \to \headertextcontent
+\appendtoks \page_layouts_place_text_line\v!text \textheight \to \texttextcontent
+\appendtoks \page_layouts_place_text_line\v!footer\footerheight \to \footertextcontent
+\appendtoks \page_layouts_place_text_line\v!bottom\bottomheight \to \bottomtextcontent
+
+%D Texts can be disabled, moved up and ignored, depending in the \type {status}
+%D variable. This is handled by the next couple of macros.
+
+\newcount\c_page_layouts_element_state_n
+
+\def\page_layouts_set_element_status#vertical%
+ {\c_page_layouts_element_state_n=0\namedlayoutelementparameter#vertical\c!n\relax
+ \ifcase\c_page_layouts_element_state_n
+ \edef\textlinestatus{\namedlayoutelementparameter#vertical\c!state}%
+ \else
+ \setxvalue{\namedlayoutelementhash#vertical\c!n}{\the\numexpr\c_page_layouts_element_state_n+\minusone}%
+ \let\textlinestatus\v!stop
+ \fi}
+
+\appendtoks
+ \doifinset\v!header\floatspecification{\setxvalue{\namedlayoutelementhash\v!header\c!n}{1}}%
+ \doifinset\v!footer\floatspecification{\setxvalue{\namedlayoutelementhash\v!footer\c!n}{1}}%
+\to \everybeforeflushedpagefloat
+
+\unexpanded\def\page_layouts_place_text_line#vertical%
+ {\page_layouts_set_element_status#vertical\relax
+ \ifcsname\??layouttextsline\textlinestatus\endcsname
+ \expandafter\lastnamedcs
+ \else
+ \expandafter\page_layouts_place_text_line_unknown
+ \fi#vertical}
+
+\unexpanded\def\doifelselayouttextline#vertical% shown or not
+ {\edef\currentlayoutelementstate{\namedlayoutelementparameter{#vertical}\c!state}%
+ \ifx\currentlayoutelementstate\v!normal
+ \expandafter\firstoftwoarguments
+ \orelse\ifx\currentlayoutelementstate\v!start
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\unexpanded\def\doifelselayoutsomeline#vertical% present or not
+ {\edef\currentlayoutelementstate{\namedlayoutelementparameter{#vertical}\c!state}%
+ \ifx\currentlayoutelementstate\v!none
+ \expandafter\secondoftwoarguments
+ \orelse\ifx\currentlayoutelementstate\v!high
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\let\doiflayouttextlineelse\doifelselayouttextline
+\let\doiflayoutsomelineelse\doifelselayoutsomeline
+
+\newconditional\resyncaftertextline
+
+\setvalue{\??layouttextsline\v!normal}{\page_layouts_place_text_line_indeed}
+\setvalue{\??layouttextsline\empty }{\page_layouts_place_text_line_indeed}
+
+\letvalue{\??layouttextsline\v!none}\gobbletwoarguments
+\letvalue{\??layouttextsline\v!stop}\gobbletwoarguments
+
+\setvalue{\??layouttextsline\v!high}#vertical#height%
+ {\global\settrue\resyncaftertextline
+ \page_layouts_reset_element_status#vertical}
+
+\setvalue{\??layouttextsline\v!empty}#vertical#height%
+ {\page_layouts_reset_element_status#vertical}
+
+\setvalue{\??layouttextsline\v!start}#vertical#height%
+ {\page_layouts_reset_element_status#vertical%
+ \page_layouts_place_text_line_indeed#vertical#height}
+
+\setvalue{\??layouttextsline\v!nomarking}#vertical#height%
+ {\bgroup
+ \page_layouts_reset_element_status#vertical%
+ \settrue\inhibitgetmarking
+ \page_layouts_place_text_line_indeed#vertical#height%
+ \egroup}
+
+% \setupheadertexts [11]
+% \definetext [title] [header] [aa]
+% \setupheadertexts [11] [22]
+% \definetext [title] [header] [aa] [bb]
+% \setupheadertexts [text] [11] [22]
+% \definetext [title] [header] [text] [aa] [bb]
+% \setupheadertexts [11] [22] [33] [44]
+% \definetext [title] [header] [aa] [bb] [cc] [dd]
+% \setupheadertexts [text] [11] [22] [33] [44]
+% \definetext [title] [header] [text] [aa] [bb] [cc] [dd]
+
+\def\page_layouts_place_text_line_unknown#vertical#height%
+ {\global\settrue\resyncaftertextline
+ \begingroup % new
+ \page_layouts_reset_element_status#vertical%
+ \begincsname\namedlayoutelementhash{#vertical}\textlinestatus\endcsname
+ \begincsname\namedlayoutelementhash{#vertical:\v!text}\textlinestatus\endcsname
+ \begincsname\namedlayoutelementhash{#vertical:\v!margin}\textlinestatus\endcsname
+ \begincsname\namedlayoutelementhash{#vertical:\v!edge}\textlinestatus\endcsname
+ \page_layouts_place_text_line_indeed#vertical#height%
+ \endgroup}
+
+\letvalue{\??layouttextsline\s!unknown}\page_layouts_place_text_line_unknown
+
+%D The following macro has to be called after a page is flushed.
+
+\unexpanded\def\resetlayouttextlines % public
+ {\begincsname\??layouttextsreset\v!top \endcsname
+ \begincsname\??layouttextsreset\v!header\endcsname
+ \begincsname\??layouttextsreset\v!text \endcsname
+ \begincsname\??layouttextsreset\v!footer\endcsname
+ \begincsname\??layouttextsreset\v!bottom\endcsname
+ \ifconditional\resyncaftertextline
+ \calculateglobalvsizes
+ \page_backgrounds_recalculate
+ \global\setfalse\resyncaftertextline
+ \fi}
+
+\def\getspecificlayouttext#vertical#horizontal#what%
+ {\begincsname\namedlayoutelementhash{#vertical:#horizontal}#what\endcsname}
+
+% \settext[header][text][middle][xxx][yyy]
+
+\unexpanded\def\settextcontent
+ {\doquintupleempty\page_layouts_set_text_content}
+
+\def\page_layouts_set_text_content[#vertical][#horizontal][#one][#two][#three]% header text middle text/text
+ {\iffifthargument
+ \setvalue{\namedlayoutelementhash{#vertical:#horizontal}\begincsname\??layouttextcontent\v!text:#one\endcsname\c!middletext}%
+ {\page_layouts_process_element_double{#two}{#three}}%
+ \orelse\iffourthargument
+ \setvalue{\namedlayoutelementhash{#vertical:#horizontal}\begincsname\??layouttextcontent\v!text:#one\endcsname\c!middletext}%
+ {\page_layouts_process_element_double{#two}{#two}}%
+ \orelse\ifthirdargument
+ \setvalue{\namedlayoutelementhash{#vertical:#horizontal}\c!middletext}%
+ {\page_layouts_process_element_double{#one}{#one}}%
+ \fi}
+
+\let\currentlayoutelement\relax
+
+\unexpanded\def\resettextcontent
+ {\dotripleempty\page_layouts_reset_text_content}
+
+\def\page_layouts_reset_text_content[#vertical][#horizontal][#tag]% header text middle
+ {\edef\currentlayoutelement{#vertical:#horizontal}%
+ \ifthirdargument
+ \letvalueempty{\layoutelementhash\begincsname\??layouttextcontent\v!text:#tag\endcsname\c!middletext}%
+ \orelse\ifsecondargument
+ \resetlayoutelementparameter\c!lefttext
+ \resetlayoutelementparameter\c!middletext
+ \resetlayoutelementparameter\c!righttext
+ \fi}
+
+\letvalue{\??layouttextcontent\v!text:\c!middle}\c!middletext
+\letvalue{\??layouttextcontent\v!text:\c!left }\c!lefttext
+\letvalue{\??layouttextcontent\v!text:\c!right }\c!righttext
+
+%D The placement of a whole line is handled by the next two macros. These are hooked
+%D into the general purpose token list registers mentioned before.
+
+\let\currentlayouttextline\relax
+
+\def\page_layouts_place_text_line_indeed#vertical#height%
+ {\let\currentlayouttextline#vertical%
+ \ifdim#height>\zeropoint\relax % prevents pagenumbers when zero height
+ \page_layouts_place_text_line_left_or_right{#height}%
+ \fi}
+
+\def\page_layouts_place_text_line_left_or_right#height%
+ {\goleftonpage
+ \setbox\b_page_layouts_element\vbox to #height
+ {\vsize#height\relax
+ %\hsize\zeropoint % hack so that e.g. after=\hairline gives predictable results
+ \hsize\totaltextwidth
+ \normalbaselines
+ \let\\\ignoredlinebreak
+ \let\crlf\ignoredlinebreak
+ \namedlayoutelementparameter\currentlayouttextline\c!before
+ \doifbothsidesoverruled
+ \page_layouts_place_text_line_right
+ \page_layouts_place_text_line_right
+ \page_layouts_place_text_line_left
+ \namedlayoutelementparameter\currentlayouttextline\c!after
+ \vkern\zeropoint}% keep the \dp, beware of \vtops, never change this!
+ \dp\b_page_layouts_element\zeropoint
+ \box\b_page_layouts_element
+ \vkern-#height\relax}
+
+\let\page_layouts_place_extra_text_left \empty % historic
+\let\page_layouts_place_extra_text_right\empty % historic
+
+\def\page_layouts_place_text_line_right
+ {\hpack
+ {\ifdim\leftedgewidth>\zeropoint
+ \page_layouts_left_edge_element\c!lefttext\c!leftstyle\c!leftcolor\c!leftwidth
+ \fi
+ \ifdim\leftmarginwidth>\zeropoint
+ \page_layouts_left_margin_element\c!lefttext\c!leftstyle\c!leftcolor\c!leftwidth\zerocount
+ \fi
+ \ifdim\makeupwidth>\zeropoint
+ \page_layouts_text_body_element_l_m_r_e
+ \fi
+ \ifdim\rightmarginwidth>\zeropoint
+ \page_layouts_right_margin_element\c!righttext\c!rightstyle\c!rightcolor\c!rightwidth\plusone
+ \fi
+ \ifdim\rightedgewidth>\zeropoint
+ \page_layouts_right_edge_element\c!righttext\c!rightstyle\c!rightcolor\c!rightwidth
+ \fi}}
+
+\def\page_layouts_place_text_line_left
+ {\hpack
+ {\ifdim\leftedgewidth>\zeropoint
+ \page_layouts_left_edge_element\c!righttext\c!rightstyle\c!rightcolor\c!rightwidth
+ \fi
+ \ifdim\leftmarginwidth>\zeropoint
+ \page_layouts_left_margin_element\c!righttext\c!rightstyle\c!rightcolor\c!rightwidth\zerocount
+ \fi
+ \ifdim\makeupwidth>\zeropoint
+ \page_layouts_text_body_element_e_r_m_l
+ \fi
+ \ifdim\rightmarginwidth>\zeropoint
+ \page_layouts_right_margin_element\c!lefttext\c!leftstyle\c!leftcolor\c!leftwidth\plusone
+ \fi
+ \ifdim\rightedgewidth>\zeropoint
+ \page_layouts_right_edge_element\c!lefttext\c!leftstyle\c!leftcolor\c!leftwidth
+ \fi}}
+
+\def\page_layouts_left_edge_element_indeed#text#style#color#width%
+ {\letfromlayoutelementparameter\p_text#text%
+ \ifx\p_text\empty
+ \kern\leftedgewidth
+ \else
+ \hbox to \leftedgewidth\bgroup
+ \hss
+ \page_layouts_process_element_indeed#style#color#width%
+ \egroup
+ \fi}
+
+\def\page_layouts_left_edge_element#text#style#color#width%
+ {\edef\currentlayoutelement{\currentlayouttextline:\v!edge}%
+ \page_layouts_place_element_indeed\leftedgewidth
+ {\page_layouts_left_edge_element_indeed#text#style#color#width}%
+ \kern\leftedgedistance}
+
+\def\page_layouts_right_edge_element_indeed#text#style#color#width%
+ {\letfromlayoutelementparameter\p_text#text%
+ \ifx\p_text\empty
+ \kern\rightedgewidth
+ \else
+ \hbox to \rightedgewidth\bgroup
+ \page_layouts_process_element_indeed#style#color#width%
+ \hss
+ \egroup
+ \fi}
+
+\def\page_layouts_right_edge_element#text#style#color#width%
+ {\edef\currentlayoutelement{\currentlayouttextline:\v!edge}%
+ \kern\rightedgedistance
+ \page_layouts_place_element_indeed\rightedgewidth
+ {\page_layouts_right_edge_element_indeed#text#style#color#width}}
+
+% margin needs checking!
+
+\def\page_layouts_left_margin_element_indeed#text#style#color#width#margintoo%
+ {\letfromlayoutelementparameter\p_text#text%
+ \ifx\p_text\empty
+ \kern\leftmarginwidth
+ \else
+ \hbox to \leftmarginwidth\bgroup
+ \hss
+ \page_layouts_process_element_indeed#style#color#width%
+ \egroup
+ \fi
+ \ifcase#margintoo\or
+ \letfromlayoutelementparameter\p_text\c!margintext
+ \ifx\p_text\empty\else
+ \kern-\leftmarginwidth
+ \hbox to \leftmarginwidth\bgroup
+ \hss
+ \p_text % styling ?
+ \egroup
+ \fi
+ \fi}
+
+\def\page_layouts_left_margin_element#text#style#color#width#margintoo%
+ {\edef\currentlayoutelement{\currentlayouttextline:\v!margin}%
+ \page_layouts_place_element_indeed\leftmarginwidth
+ {\page_layouts_left_margin_element_indeed#text#style#color#width#margintoo}%
+ \kern\leftmargindistance}
+
+\def\page_layouts_right_margin_element_indeed#text#style#color#width#margintoo%
+ {\letfromlayoutelementparameter\p_text#text%
+ \ifx\p_text\empty
+ \kern\rightmarginwidth
+ \else
+ \hbox to \rightmarginwidth\bgroup
+ \page_layouts_process_element_indeed#style#color#width%
+ \hss
+ \egroup
+ \fi
+ \ifcase#margintoo\or
+ \letfromlayoutelementparameter\p_text\c!margintext
+ \ifx\p_text\empty\else
+ \kern-\rightmarginwidth
+ \hbox to \rightmarginwidth\bgroup
+ \p_text % ? styling
+ \hss
+ \egroup
+ \fi
+ \fi}
+
+\def\page_layouts_right_margin_element#text#style#color#width#margintoo%
+ {\edef\currentlayoutelement{\currentlayouttextline:\v!margin}%
+ \kern\rightmargindistance
+ \page_layouts_place_element_indeed\rightmarginwidth
+ {\page_layouts_right_margin_element_indeed#text#style#color#width#margintoo}}
+
+\def\page_layouts_text_body_element_indeed_l_m_r_e
+ {\letfromlayoutelementparameter\p_text\c!lefttext
+ \ifx\p_text\empty
+ \ifx\page_layouts_place_extra_text_left\empty\else
+ \hbox to \makeupwidth\bgroup
+ \page_layouts_place_extra_text_left
+ \hss
+ \egroup
+ \kern-\makeupwidth
+ \fi
+ \else
+ \hbox to \makeupwidth\bgroup
+ \page_layouts_place_extra_text_left
+ \page_layouts_process_element_indeed\c!leftstyle\c!leftcolor\c!leftwidth
+ \hss
+ \egroup
+ \kern-\makeupwidth
+ \fi
+ \letfromlayoutelementparameter\p_text\c!middletext
+ \ifx\p_text\empty\else
+ \hbox to \makeupwidth\bgroup
+ \hss
+ \page_layouts_process_element_indeed\c!middlestyle\c!middlecolor\c!middlewidth
+ \hss
+ \egroup
+ \kern-\makeupwidth
+ \fi
+ \letfromlayoutelementparameter\p_text\c!righttext
+ \ifx\p_text\empty
+ \kern\makeupwidth
+ \else
+ \hbox to \makeupwidth\bgroup
+ \hss
+ \page_layouts_process_element_indeed\c!rightstyle\c!rightcolor\c!rightwidth
+ \egroup
+ \fi}
+
+\def\page_layouts_text_body_element_indeed_e_r_m_l
+ {\letfromlayoutelementparameter\p_text\c!righttext
+ \ifx\p_text\empty\else
+ \hbox to \makeupwidth\bgroup
+ \page_layouts_process_element_indeed\c!rightstyle\c!rightcolor\c!rightwidth
+ \hss
+ \egroup
+ \kern-\makeupwidth
+ \fi
+ \letfromlayoutelementparameter\p_text\c!middletext
+ \ifx\p_text\empty\else
+ \hbox to \makeupwidth\bgroup
+ \hss
+ \page_layouts_process_element_indeed\c!middlestyle\c!middlecolor\c!middlewidth
+ \hss
+ \egroup
+ \kern-\makeupwidth
+ \fi
+ \letfromlayoutelementparameter\p_text\c!lefttext
+ \ifx\p_text\empty
+ \ifx\page_layouts_place_extra_text_right\empty
+ \kern\makeupwidth
+ \else
+ \hbox to \makeupwidth\bgroup
+ \hss
+ \page_layouts_place_extra_text_right
+ \egroup
+ \fi
+ \else
+ \hbox to \makeupwidth\bgroup
+ \hss
+ \page_layouts_process_element_indeed\c!leftstyle\c!leftcolor\c!leftwidth
+ \page_layouts_place_extra_text_right
+ \egroup
+ \fi}
+
+\def\page_layouts_text_body_element_l_m_r_e
+ {\edef\currentlayoutelement{\currentlayouttextline:\v!text}%
+ \page_layouts_place_element_indeed\makeupwidth\page_layouts_text_body_element_indeed_l_m_r_e}
+
+\def\page_layouts_text_body_element_e_r_m_l
+ {\edef\currentlayoutelement{\currentlayouttextline:\v!text}%
+ \page_layouts_place_element_indeed\makeupwidth\page_layouts_text_body_element_indeed_e_r_m_l}
+
+\def\page_layouts_place_element_indeed#width#content%
+ {\vbox % to \vsize
+ {\hsize#width\relax
+ \layoutelementparameter\c!before
+ \setlayoutcomponentattribute\currentlayoutelement
+ \hbox \layoutcomponentboxattribute to #width{#content}%
+ \layoutelementparameter\c!after}}
+
+%D Although it is far better to use backgrounds for this purpose, one can add a rule
+%D in the following way. This method makes the rules disappear in case of an empty
+%D text line. Consider this a feature.
+%D
+%D \starttyping
+%D \setupheadertexts[left][right]
+%D
+%D \setupheader[text][after=\hrule,style=bold]
+%D
+%D \starttext
+%D \input tufte \page
+%D \setupheader[state=empty]
+%D \input tufte \page
+%D \stoptext
+%D \stoptyping
+
+%D This code will move to \type {page-flt.tex}.
+
+\appendtoks \placerightmarginblock \kern-\rightmarginwidth \to \rightmargintextcontent
+\appendtoks \placeleftmarginblock \kern-\leftmarginwidth \to \leftmargintextcontent
+
+%D \macros
+%D {definetext}
+%D
+%D Some macros ago, we implemented the \type {status} option \type {unknown}. This
+%D one is used to take care of symbolic texts handlers.
+%D
+%D \showsetup{definetext}
+%D
+%D The next example demonstrates how we can use this mechanism to provide page
+%D (event) dependent text lines.
+%D
+%D \starttyping
+%D \definetext[chapter][footer][pagenumber]
+%D \setuphead[chapter][header=high,footer=chapter]
+%D \setupheadertexts[pagenumber]
+%D \setupfootertexts[left][right]
+%D \chapter{eerste} \dorecurse{20}{\input tufte \relax}
+%D \chapter{tweede} \dorecurse{20}{\input tufte \relax}
+%D \stoptyping
+
+\unexpanded\def\definetext
+ {\doseventupleempty\page_layouts_define_text}
+
+\def\page_layouts_define_text[#tag][#vertical][#horizontal][#a][#b][#c][#d]%
+ {\ifseventhargument
+ \setvalue{\namedlayoutelementhash{#vertical:#horizontal}#tag}{\page_layouts_setup_text_six [#vertical][#horizontal][#a][#b][#c][#d]}%
+ \orelse\ifsixthargument
+ \setvalue{\namedlayoutelementhash {#vertical}#tag}{\page_layouts_setup_text_five [#vertical][#horizontal][#a][#b][#c][]}%
+ \orelse\iffifthargument
+ \setvalue{\namedlayoutelementhash{#vertical:#horizontal}#tag}{\page_layouts_setup_text_four [#vertical][#horizontal][#a][#b][][]}%
+ \orelse\iffourthargument
+ \setvalue{\namedlayoutelementhash {#vertical}#tag}{\page_layouts_setup_text_three[#vertical][#horizontal][#a][][][]}%
+ \else
+ \setvalue{\namedlayoutelementhash {#vertical}#tag}{\page_layouts_setup_text_two [#vertical][#horizontal][][][][]}%
+ \fi}
+
+%D A few more page breakers:
+
+\installpagebreakmethod \v!empty
+ {\page_otr_flush_all_floats
+ \page_otr_command_next_page
+ \doifnot{\namedlayoutelementparameter\v!header\c!state}\v!stop{\setuplayoutelement[\v!header][\c!state=\v!empty]}%
+ \doifnot{\namedlayoutelementparameter\v!footer\c!state}\v!stop{\setuplayoutelement[\v!footer][\c!state=\v!empty]}%
+ \page_otr_insert_dummy_page}
+
+\installpagebreakmethod \v!header
+ {\doifnot{\namedlayoutelementparameter\v!header\c!state}\v!stop{\setuplayoutelement[\v!header][\c!state=\v!empty]}}
+
+\installpagebreakmethod \v!footer
+ {\doifnot{\namedlayoutelementparameter\v!footer\c!state}\v!stop{\setuplayoutelement[\v!footer][\c!state=\v!empty]}}
+
+%D While the header and footer lines are moved away from the main text, the top and
+%D bottom lines are centered.
+
+\setuplayoutelement[\v!top ][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=]
+\setuplayoutelement[\v!header][\c!state=\v!normal,\c!n=0,\c!before=, \c!after=\vss,\c!strut=\v!yes]
+\setuplayoutelement[\v!text ][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=]
+\setuplayoutelement[\v!footer][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=, \c!strut=\v!yes]
+\setuplayoutelement[\v!bottom][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=]
+
+%D Moved here from strc-pag:
+%D
+%D We reset a previous location but only when it has a pagenumber associated. This
+%D is a rather messy test but better than the MkII way where we use states and keep
+%D settings.
+
+\let\m_page_layouts_page_number_location \relax
+\let\m_page_layouts_page_number_location_v\relax
+\let\m_page_layouts_page_number_location_h\relax
+\let\m_page_layouts_page_number_location_x\relax
+
+\def\page_layouts_place_page_number % also elsewhere .. beware, not \unexpanded else
+ {\strc_pagenumbers_place_location} % test below fails
+
+\def\page_layouts_reset_page_number_location
+ {\ifx\m_page_layouts_page_number_location_v\relax\else
+ \edef\currentlayoutelement{\m_page_layouts_page_number_location_v:\m_page_layouts_page_number_location_h}%
+ \edef\page_layouts_previous_page_number_locator{\detokenizedlayoutelementparameter\m_page_layouts_page_number_location_x}%
+ \doif{\meaning\page_layouts_previous_page_number_locator}{\meaning\page_layouts_place_page_number}
+ {\resetlayoutelementparameter\m_page_layouts_page_number_location_x}%
+ \fi}
+
+\def\page_layouts_set_page_number_location
+ {\edef\currentlayoutelement{\m_page_layouts_page_number_location_v:\m_page_layouts_page_number_location_h}%
+ \letlayoutelementparameter\m_page_layouts_page_number_location_x\page_layouts_place_page_number
+ \ifx\m_page_layouts_page_number_location_x\c!marginedgetext
+ \let\page_layouts_place_extra_text_left \page_layouts_place_page_number_left
+ \let\page_layouts_place_extra_text_right\page_layouts_place_page_number_right
+ \else
+ \let\page_layouts_place_extra_text_left \empty
+ \let\page_layouts_place_extra_text_right\empty
+ \fi}
+
+\def\page_layouts_identify_page_number_location
+ {\let\m_page_layouts_page_number_location_v\v!footer
+ \let\m_page_layouts_page_number_location_h\v!text
+ \let\m_page_layouts_page_number_location_x\c!middletext
+ \processallactionsinset[\directpagenumberingparameter\c!location]
+ [ \v!header=>\let\m_page_layouts_page_number_location_v\v!header,
+ \v!footer=>\let\m_page_layouts_page_number_location_v\v!footer,
+ \v!middle=>\let\m_page_layouts_page_number_location_h\v!text
+ \let\m_page_layouts_page_number_location_x\c!middletext,
+ \v!left=>\let\m_page_layouts_page_number_location_h\v!text
+ \let\m_page_layouts_page_number_location_x\c!lefttext,
+ \v!right=>\let\m_page_layouts_page_number_location_h\v!text
+ \let\m_page_layouts_page_number_location_x\c!righttext,
+ \v!inleft=>\let\m_page_layouts_page_number_location_h\v!margin
+ \let\m_page_layouts_page_number_location_x\c!lefttext,
+ \v!inright=>\let\m_page_layouts_page_number_location_h\v!margin
+ \let\m_page_layouts_page_number_location_x\c!righttext,
+ \v!inmargin=>\let\m_page_layouts_page_number_location_h\v!margin
+ \def\m_page_layouts_page_number_location_x{\ifdoublesided\c!margintext\else\c!righttext\fi},
+ \v!margin=>\let\m_page_layouts_page_number_location_h\v!margin
+ \def\m_page_layouts_page_number_location_x{\ifdoublesided\c!margintext\else\c!righttext\fi},
+ \v!atmargin=>\let\m_page_layouts_page_number_location_h\v!text
+ \let\m_page_layouts_page_number_location_x\c!marginedgetext,
+ \v!marginedge=>\let\m_page_layouts_page_number_location_h\v!text
+ \let\m_page_layouts_page_number_location_x\c!marginedgetext]}
+
+\unexpanded\def\strc_pagenumbers_set_location
+ {\edef\p_strc_pagenumbers_location{\directpagenumberingparameter\c!location}%
+ \ifx\p_strc_pagenumbers_location\m_page_layouts_page_number_location
+ % unchanged
+ \else
+ \let\m_page_layouts_page_number_location\p_strc_pagenumbers_location
+ \page_layouts_reset_page_number_location
+ \ifx\p_strc_pagenumbers_location\empty
+ % set otherwise
+ \orelse\ifx\p_strc_pagenumbers_location\v!none
+ % set otherwise
+ \else
+ \page_layouts_identify_page_number_location
+ \page_layouts_set_page_number_location
+ \fi
+ \fi}
+
+\def\page_layouts_place_page_number_left % historic
+ {\begingroup
+ \setbox\scratchbox\hbox{\ignorespaces\layoutelementparameter\c!marginedgetext\removeunwantedspaces}%
+ \ifzeropt\wd\scratchbox\else
+ \edef\p_strc_pagenumbers_width{\directpagenumberingparameter\c!width}%
+ \ifx\p_strc_pagenumbers_width\empty
+ \box\scratchbox\tfskip
+ \else
+ \hpack to \p_strc_pagenumbers_width{\box\scratchbox\hss}%
+ \fi
+ \fi
+ \endgroup}
+
+\def\page_layouts_place_page_number_right % historic
+ {\begingroup
+ \setbox\scratchbox\hbox{\ignorespaces\layoutelementparameter\c!marginedgetext\removeunwantedspaces}%
+ \ifzeropt\wd\scratchbox\else
+ \edef\p_strc_pagenumbers_width{\directpagenumberingparameter\c!width}%
+ \ifx\p_strc_pagenumbers_width\empty
+ \tfskip\box\scratchbox
+ \else
+ \hpack to \p_strc_pagenumbers_width{\hss\box\scratchbox}%
+ \fi
+ \fi
+ \endgroup}
+
+\strc_pagenumbers_set_location % initializes
+
+\newbox\b_page_layouts_element
+
+\def\page_layouts_insert_elements
+ {\ifcase\pageornamentstate
+ \page_layouts_place_elements_indeed % we could have a special flag for always ignored
+ \fi}
+
+\def\page_layouts_place_elements_indeed
+ {\setbox\b_page_layouts_element\vpack
+ {\dontcomplain
+ \calculatereducedvsizes
+ \swapmargins
+ \offinterlineskip
+ \vkern\dimexpr-\topheight-\topdistance\relax
+ \the\toptextcontent
+ \vkern\dimexpr\topheight+\topdistance\relax
+ \the\headertextcontent
+ \vkern\dimexpr\headerheight+\headerdistance+\textdistance\relax
+ \anch_positions_place_anchors
+ \vkern\dimexpr-\textdistance-\textheight\relax
+ \the\texttextcontent
+ \vkern\textheight
+ \the\everyendoftextbody
+ \vkern\footerdistance
+ \the\footertextcontent
+ \vkern\dimexpr\footerheight+\bottomdistance\relax
+ \the\bottomtextcontent
+ \vkern\bottomheight
+ \vfilll}%
+ \smashbox\b_page_layouts_element
+ \box\b_page_layouts_element}
+
+% \ifdefined\page_prepare_backgrounds\else
+% \let\page_prepare_backgrounds\gobbleoneargument
+% \fi
+
+% only for very special controlled cases or experiments:
+
+\let\page_scale_text_box\gobbleoneargument
+
+\def\page_insert_body#1#2%
+ {\setbox\b_page_layouts_element\vpack
+ {\offinterlineskip
+ \calculatereducedvsizes
+ \calculatehsizes
+ \swapmargins
+ \vkern\dimexpr\headerheight+\headerdistance+\textdistance\relax
+ \dontleavehmode
+ %\page_prepare_backgrounds{#2}%
+ \hpack to \makeupwidth
+ {\begingroup
+ \swapmargins
+ \goleftonpage
+ \ifdim\leftedgewidth>\zeropoint
+ \the\leftedgetextcontent
+ \kern\dimexpr\leftedgewidth+\leftedgedistance\relax
+ \fi
+ \ifdim\leftmarginwidth>\zeropoint
+ \the\leftmargintextcontent
+ \kern\dimexpr\leftmarginwidth+\leftmargindistance\relax
+ \fi
+ \endgroup
+ \page_apply_postprocessors_page{#2}%
+ \settextpagecontent\b_page_layouts_element{#1}{#2}%
+ \page_backgrounds_add_to_text\b_page_layouts_element
+ \page_grids_add_to_box\b_page_layouts_element
+ \page_scale_text_box\b_page_layouts_element
+ \box\b_page_layouts_element
+ \begingroup
+ \ifdim\rightmarginwidth>\zeropoint
+ \kern\rightmargindistance
+ \the\rightmargintextcontent
+ \kern\rightmarginwidth
+ \fi
+ \ifdim\rightedgewidth>\zeropoint
+ \kern\rightedgedistance
+ \the\rightedgetextcontent
+ \kern\rightedgewidth
+ \fi
+ \endgroup
+ \hss}}%
+ \smashbox\b_page_layouts_element
+ \box\b_page_layouts_element}
+
+%D The main text area has to be combined with some additional (tracing) information.
+%D
+%D This will be stored as normal and overloaded in page-lyr and later in page-spr we
+%D overload the the stored version .. evenatually i will clear up the experimental
+%D mess.
+
+\def\settextpagecontent#1#2#3% #2 and #3 will disappear / is overloaded
+ {\setbox#1\hpack to \makeupwidth
+ {\hss % so don't change this
+ \setlayoutcomponentattribute{\v!page:\v!text}%
+ \vpack \layoutcomponentboxattribute to \textheight
+ {\offinterlineskip
+ \freezetextwidth
+ \hsize\textwidth % local variant of \sethsize <<< in columns?
+ \boxmaxdepth\maxdepth
+ \noindent % content can be < \hsize
+ \page_otr_command_package_contents#2#3}% this will vbox
+ \hss}%
+ \dp#1\zeropoint}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-txt.mkvi b/Master/texmf-dist/tex/context/base/mkiv/page-txt.mkvi
index 97668c14377..8b021acca5d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/page-txt.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/page-txt.mkvi
@@ -25,12 +25,11 @@
\newtoks\texttextcontent
%D \macros
-%D {setuptop, setupheader, setuptext,
-%D setupfooter, setupbottom}
+%D {setuptop, setupheader, setuptext,setupfooter, setupbottom}
%D
-%D The macros in this module sometimes look a bit more complicated than
-%D needed, which is a direct result of the fact that their ancestors are
-%D quite old and upward compatibility is a must.
+%D The macros in this module sometimes look a bit more complicated than needed,
+%D which is a direct result of the fact that their ancestors are quite old and
+%D upward compatibility is a must.
%D
%D \showsetup{setuptop}
%D \showsetup{setupheader}
@@ -136,8 +135,7 @@
%D \macros
%D {noheaderandfooterlines,notopandbottomlines}
%D
-%D Although not really needed, the following shortcuts
-%D sometimes come in handy.
+%D Although not really needed, the following shortcuts sometimes come in handy.
%D
%D \showsetup{noheaderandfooterlines}
%D \showsetup{notopandbottomlines}
@@ -151,8 +149,7 @@
\setuplayoutelement[\v!bottom][\c!state=\v!empty]}
%D \macros
-%D {setuptoptexts, setupheadertexts, setuptexttexts,
-%D setupfootertexts, setupbottomtexts}
+%D {setuptoptexts,setupheadertexts,setuptexttexts,setupfootertexts,setupbottomtexts}
%D
%D The next macros take one or more arguments. The exact setup depends on the number
%D of arguments. Although not that intuitive, the current scheme evolved out of the
@@ -171,11 +168,6 @@
\unexpanded\def\setupfootertexts{\dosixtupleempty\page_layouts_setup_texts[\v!footer ]}
\unexpanded\def\setupbottomtexts{\dosixtupleempty\page_layouts_setup_texts[\v!bottom ]}
-% todo: \setuplayoutelementtext
-
-%D An alternative approach is to have more variables but that does not make the code
-%D less complex (probably more).
-
\unexpanded\def\page_layouts_setup_text_six#vertical#horizontal#a#b#c#d%
{\edef\currentlayoutelement{#vertical:#horizontal}%
\setlayoutelementparameter\c!lefttext
@@ -320,22 +312,6 @@
%D When specified, the texts are automatically limited in length.
-% % where used ?
-%
-% \def\page_layouts_limitate_element_text#width%
-% {\edef\currentlayoutelementwidth{\layoutelementparameter#width}%
-% \ifx\currentlayoutelementwidth\empty
-% \expandafter\firstofoneargument
-% \else
-% \expandafter\page_layouts_limitate_element_text_indeed
-% \fi}
-%
-% \def\page_layouts_limitate_element_text_indeed#content%
-% {\limitatetext{#content}\currentlayoutelementwidth\unknown}
-
-%D The placement of text is hooked into the token lists
-%D associated to the area at hand.
-
\appendtoks \page_layouts_place_text_line\v!top \topheight \to \toptextcontent
\appendtoks \page_layouts_place_text_line\v!header\headerheight \to \headertextcontent
\appendtoks \page_layouts_place_text_line\v!text \textheight \to \texttextcontent
@@ -445,11 +421,11 @@
%D The following macro has to be called after a page is flushed.
\unexpanded\def\resetlayouttextlines % public
- {\csname\??layouttextsreset\v!top \endcsname
- \csname\??layouttextsreset\v!header\endcsname
- \csname\??layouttextsreset\v!text \endcsname
- \csname\??layouttextsreset\v!footer\endcsname
- \csname\??layouttextsreset\v!bottom\endcsname
+ {\begincsname\??layouttextsreset\v!top \endcsname
+ \begincsname\??layouttextsreset\v!header\endcsname
+ \begincsname\??layouttextsreset\v!text \endcsname
+ \begincsname\??layouttextsreset\v!footer\endcsname
+ \begincsname\??layouttextsreset\v!bottom\endcsname
\ifconditional\resyncaftertextline
\calculateglobalvsizes
\page_backgrounds_recalculate
@@ -814,10 +790,6 @@
\strc_pagenumbers_set_location % initializes
-% will go to page-box.mkiv
-
-% the next macros will be redone (less boxing)
-
\newbox\b_page_layouts_element
\def\page_layouts_insert_elements
@@ -880,7 +852,7 @@
\kern\dimexpr\leftmarginwidth+\leftmargindistance\relax
\fi
\endgroup
- \page_postprocessors_page{#2}%
+ \page_apply_postprocessors_page{#2}%
\settextpagecontent\b_page_layouts_element{#1}{#2}%
\page_backgrounds_add_to_text\b_page_layouts_element
\page_grids_add_to_box\b_page_layouts_element
diff --git a/Master/texmf-dist/tex/context/base/mkiv/phys-dim.mkiv b/Master/texmf-dist/tex/context/base/mkiv/phys-dim.mkiv
index 3ea042b0570..1eb1f37f76b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/phys-dim.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/phys-dim.mkiv
@@ -441,6 +441,7 @@
\appendtoks
\disablemathpunctuation
+ \nocharacteralign
\to \everyunits
\appendtoks
@@ -449,6 +450,7 @@
\unexpanded\def\phys_units_direct#1%
{\begingroup
+ \the\everyunits
\ifdim\lastskip>\zeropoint
\settrue\c_phys_units_dospace
\removelastskip
@@ -459,7 +461,7 @@
\edef\unitlanguage{\unitparameter\s!language}%
\let\prefixlanguage\unitlanguage
\let\operatorlanguage\unitlanguage
- \the\everyunits
+% \the\everyunits
%\removeunwantedspaces % not ok yet
\useunitstyleandcolor\c!style\c!color
\edef\currentunitsalternative{\unitparameter\c!alternative}%
diff --git a/Master/texmf-dist/tex/context/base/mkiv/publ-imp-apa.mkvi b/Master/texmf-dist/tex/context/base/mkiv/publ-imp-apa.mkvi
index 36e4882d25a..5603b79a5f1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/publ-imp-apa.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/publ-imp-apa.mkvi
@@ -703,20 +703,20 @@
apa:edition={Utgåva},
apa:Editor=Redaktör,
apa:Editors=Redaktörer,
- apa:Volume=Band,
+ apa:Volume=Band,
apa:Volumes=Band,
apa:nd={u.å.}, % utan årtal
apa:supplement=Bilaga, % Supplement
apa:MotionPicture=Spelfilm, % ?
apa:Writer={Manusförfattare}, % Assuming for a movie
- apa:Writers={Manusförfattare}, %
+ apa:Writers={Manusförfattare}, %
apa:Producer=Producent, % Assuming for a movie
- apa:Producers=Producenter, %
+ apa:Producers=Producenter, %
apa:Director={Regissör}, % Assuming for a movie
- apa:Directors={Regissörer}, %
+ apa:Directors={Regissörer}, %
apa:Recordedby={Inspelad av}, % Assuming for a movie
apa:Author={Författare},
- apa:Translator={Översättare},
+ apa:Translator={Översättare},
apa:Advanced={Avancerad onlinepublikation}, % ?
apa:Retrieved={Hämtad från}]
diff --git a/Master/texmf-dist/tex/context/base/mkiv/publ-imp-aps.mkvi b/Master/texmf-dist/tex/context/base/mkiv/publ-imp-aps.mkvi
index 4e12fbfc7b3..d085b96eb63 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/publ-imp-aps.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/publ-imp-aps.mkvi
@@ -665,8 +665,10 @@
\stoptexdefinition
\starttexdefinition unexpanded btx:aps:author
- \btxflush{author}
- \btxcomma
+ \btxdoif {author} {
+ \btxflush{author}
+ \btxcomma
+ }
\stoptexdefinition
\starttexdefinition unexpanded btx:aps:organization-if-not-author
diff --git a/Master/texmf-dist/tex/context/base/mkiv/publ-imp-chicago.lua b/Master/texmf-dist/tex/context/base/mkiv/publ-imp-chicago.lua
new file mode 100644
index 00000000000..cda76f52a39
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/publ-imp-chicago.lua
@@ -0,0 +1,560 @@
+local specification = {
+ --
+ -- metadata
+ --
+ name = "chicago",
+ version = "1.00",
+ comment = "Chicago Manual of Style specification",
+ author = "Alan Braslau and Hans Hagen",
+ copyright = "ConTeXt development team",
+ --
+ -- derived (combinations of) fields (all share the same default set)
+ --
+ virtual = {
+ "authoryear",
+ "authoryears",
+ "authornum",
+ "num",
+ "suffix",
+ },
+ --
+ -- special datatypes
+ --
+ types = {
+ --
+ -- list of fields that are interpreted as names: "NAME [and NAME]" where
+ -- NAME is one of the following:
+ --
+ -- First vons Last
+ -- vons Last, First
+ -- vons Last, Jrs, First
+ -- Vons, Last, Jrs, First
+ --
+ author = "author", -- interpreted as name(s)
+ withauthor = "author",
+ editor = "author",
+ translator = "author",
+ artist = "author",
+ composer = "author",
+ producer = "author",
+ director = "author",
+ doi = "url", -- an external link
+ url = "url",
+ page = "pagenumber", -- number or range: f--t
+ pages = "pagenumber",
+ volume = "range",
+ number = "range",
+ keywords = "keyword", -- comma|-|separated list
+ year = "number",
+ },
+ --
+ -- categories with their specific fields
+ --
+ categories = {
+ --
+ -- categories are added below
+ --
+ },
+}
+
+local generic = {
+ --
+ -- A set returns the first field (in order of position below) that is found
+ -- present in an entry. A set having the same name as a field conditionally
+ -- allows the substitution of an alternate field.
+ --
+ -- note that anything can get assigned a doi or be available online.
+ doi = { "doi", "url" },
+ editionset = { "edition", "volume", "number", "pages" },
+}
+
+-- Definition of recognized categories and the fields that they contain.
+-- Required fields should be present; optional fields may also be rendered;
+-- all other fields will be ignored.
+
+-- Sets contain either/or in order of precedence.
+--
+-- For a category *not* defined here yet present in the dataset, *all* fields
+-- are taken as optional. This allows for flexibility in the addition of new
+-- categories.
+
+local categories = specification.categories
+
+-- an article from a journal
+
+categories.article = {
+ sets = {
+ author = { "author", "organization", "editor", "title" },
+ doi = generic.doi,
+ },
+ required = {
+ "author", -- a set
+ },
+ optional = {
+ "withauthor", "translator",
+ "year",
+ "subtitle", "type", "file",
+ "journal", "volume", "number", "pages",
+ "doi", "note",
+ -- APA ignores this:
+ --
+ -- "month",
+ --
+ -- fields defined in jabref but presently ignored:
+ --
+ -- "issn",
+ },
+}
+
+-- an article from a magazine
+
+categories.magazine = {
+ sets = categories.article.sets,
+ required = {
+ "author",
+ "year",
+ "journal",
+ },
+ optional = {
+ "withauthor", "translator",
+ "subtitle", "type", "file",
+ "number",
+ "month", "day",
+ "doi", "note",
+ },
+}
+
+categories.newspaper = categories.magazine
+
+-- (from jabref) to be identified and setup ...
+
+categories.periodical = {
+ sets = {
+ author = { "editor", "publisher", "organization", },
+ doi = generic.doi,
+ },
+ required = {
+ "title",
+ "year",
+ },
+ optional = {
+ "author", "withauthor", "translator",
+ "subtitle", "file",
+ "series", "volume", "number", "month",
+ "organization",
+ "doi", "note",
+ },
+}
+
+-- (from jabref) to be identified and setup ...
+
+categories.standard = {
+ sets = {
+ author = { "author", "institution", "organization" },
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "year",
+ "title", "subtitle",
+ "doi", "note",
+ },
+ optional = {
+ "withauthor", "translator",
+ },
+}
+
+-- a book with an explicit publisher.
+
+categories.book = {
+ sets = {
+ author = { "author", "editor", "publisher", "title" },
+ ineditor = { "editor" },
+ editionset = generic.editionset,
+ doi = generic.doi,
+ },
+ required = { "author" },
+ optional = {
+ "ineditor",
+ "withauthor", "translator",
+ "year", "month", "day",
+ "subtitle", "type", "file",
+ "editionset", "series",
+ "address",
+ "doi", "note",
+ "abstract",
+ },
+}
+
+-- a part of a book, which may be a chapter (or section or whatever) and/or a range of pages.
+
+categories.inbook = {
+ sets = {
+ author = { "author", "organization", "editor", "publisher", "title", },
+ ineditor = { "editor" },
+ editionset = generic.editionset,
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "year" ,
+ },
+ optional = {
+ "ineditor",
+ "withauthor", "translator",
+ "subtitle", "type", "file",
+ "booktitle", "subbooktitle",
+ -- APA ignores this: "chapter",
+ "editionset", "series",
+ "month",
+ "address",
+ "doi", "note",
+ },
+}
+
+-- a book having its own title as part of a collection.
+-- (like inbook, but we here make booktitle required)
+
+categories.incollection = {
+ sets = {
+ author = { "author", "editor", "publisher", "title", },
+ ineditor = { "editor" },
+ editionset = generic.editionset,
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "booktitle",
+ "year",
+ },
+ optional = {
+ "ineditor",
+ "withauthor", "translator",
+ "subtitle", "type", "file",
+ "subbooktitle",
+ "editionset", "series",
+ -- APA ignores this: "chapter",
+ "month",
+ "address",
+ "doi", "note",
+ },
+}
+
+-- a work that is printed and bound, but without a named publisher or sponsoring institution.
+
+categories.booklet = {
+ sets = {
+ author = { "author", "title", },
+ publisher = { "howpublished" }, -- no "publisher"!
+ doi = generic.doi,
+ },
+ required = {
+ "author"
+ },
+ optional = {
+ "withauthor", "translator",
+ "publisher",
+ "year", "month",
+ "subtitle", "type", "file",
+ "address",
+ "doi", "note",
+ },
+}
+
+-- the proceedings of a conference.
+
+categories.proceedings = {
+ sets = {
+ author = { "editor", "organization", "publisher", "title" }, -- no "author"!
+ publisher = { "publisher", "organization" },
+ editionset = generic.editionset,
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "year"
+ },
+ optional = {
+ "withauthor", "translator",
+ "publisher",
+ "subtitle", "file",
+ "editionset", "series",
+ "month",
+ "address",
+ "doi", "note",
+ },
+}
+
+-- an article in a conference proceedings.
+
+categories.inproceedings = {
+ sets = categories.incollection.sets,
+ required = categories.incollection.required,
+ optional = {
+ "withauthor", "translator",
+ "subtitle", "type", "file",
+ "month",
+ "edition", "series",
+ "address", "organization",
+ "doi", "note",
+ },
+}
+
+categories.conference = categories.inproceedings
+
+-- a thesis (of course).
+
+categories.thesis = {
+ sets = {
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "title",
+ "school",
+ "year",
+ "type"
+ },
+ optional = {
+ "withauthor", "translator",
+ "subtitle", "file",
+ "month",
+ "address",
+ "doi", "note",
+ },
+}
+
+categories.mastersthesis = {
+ sets = categories.thesis.sets,
+ required = {
+ "author",
+ "title",
+ "school",
+ "year"
+ },
+ optional = {
+ "withauthor", "translator",
+ "type",
+ "subtitle", "file",
+ "month",
+ "address",
+ "doi", "note",
+ },
+}
+categories.phdthesis = categories.mastersthesis
+
+-- a report published by a school or other institution, usually numbered within a series.
+
+categories.techreport = {
+ sets = {
+ author = { "author", "institution", "publisher", "title" },
+ publisher = { "publisher", "institution", },
+ editionset = { "type", "volume", "number", "pages" }, -- no "edition"!
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "title",
+ "institution",
+ "year"
+ },
+ optional = {
+ "withauthor", "translator",
+ "publisher",
+ "address",
+ "subtitle", "file",
+ "editionset",
+ "month",
+ "doi", "note",
+ },
+}
+
+-- technical documentation.
+
+categories.manual = {
+ sets = {
+ author = { "author", "organization", "publisher", "title" },
+ publisher = { "publisher", "organization", },
+ editionset = generic.editionset,
+ doi = generic.doi,
+ },
+ required = {
+ "title"
+ },
+ optional = {
+ "author", "publisher",
+ "withauthor", "translator",
+ "address",
+ "subtitle", "file",
+ "editionset", "month", "year",
+ "doi", "note",
+-- "abstract",
+ },
+}
+
+-- a patent (of course).
+
+categories.patent = {
+ sets = {
+ author = { "author", "assignee", },
+ publisher = { "publisher", "assignee", },
+ year = { "year", "yearfiled", },
+ month = { "month", "monthfiled", },
+ day = { "day", "dayfiled", },
+ doi = generic.doi,
+ },
+ required = {
+ "nationality",
+ "number",
+ "year",
+ },
+ optional = {
+ "type",
+ --check this: "language",
+ "author", "publisher",
+ "withauthor", "translator",
+ "title", "subtitle", "file",
+ "address",
+ "day", "month",
+ "doi", "note"
+ },
+}
+
+-- a document having an author and title, but not formally published.
+
+categories.unpublished = {
+ sets = {
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "title",
+ "note"
+ },
+ optional = {
+ "withauthor", "translator",
+ "subtitle", "file",
+ "year", "month",
+ "doi"
+ },
+}
+
+-- like misc below but includes organization.
+
+categories.electronic = {
+ sets = {
+ doi = generic.doi,
+ author = { "author", "organization", },
+ },
+ required = {
+ "title"
+ },
+ optional = {
+ "subtitle", "type", "file",
+ "year", "month",
+ "author", "withauthor", "translator",
+ "address",
+ "organization",
+ "howpublished",
+ "doi", "note"
+ },
+}
+
+-- not bibtex categories...
+
+categories.film = {
+ sets = {
+ doi = generic.doi,
+ author = { "author", "producer", "director", },
+ },
+ required = {
+ "author",
+ "title",
+ "year",
+ "address", "publisher", -- aka studio
+ },
+ optional = {
+ "withauthor", "translator",
+ "type",
+ "note",
+ "doi",
+ },
+}
+
+categories.music = {
+ sets = {
+ doi = generic.doi,
+ author = { "composer", "artist", "title", "album" },
+ title = { "title", "album", },
+ },
+ required = {
+ "author",
+ "title",
+ "year",
+ "address", "publisher", -- aka label
+ },
+ optional = {
+ "withauthor", "translator",
+ "type",
+ "note",
+ "doi",
+ },
+}
+
+-- use this type when nothing else fits.
+
+categories.misc = {
+ sets = {
+ doi = generic.doi,
+ },
+ required = {
+ -- nothing is really important here
+ },
+ optional = {
+ "author", "withauthor", "translator",
+ "title", "subtitle", "file",
+ "year", "month",
+ "howpublished",
+ "doi", "note",
+ },
+}
+
+-- other (whatever jabref does not know!)
+
+categories.other = {
+ sets = {
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "title",
+ "year"
+ },
+ optional = {
+ "withauthor", "translator",
+ "subtitle", "file",
+ "doi", "note",
+ },
+}
+
+-- if all else fails to match:
+
+categories.literal = {
+ sets = {
+ author = { "key" },
+ doi = generic.doi,
+ },
+ required = {
+ "author",
+ "text"
+ },
+ optional = {
+ "withauthor", "translator",
+ "doi", "note"
+ },
+ virtual = false,
+}
+
+-- done
+
+return specification
diff --git a/Master/texmf-dist/tex/context/base/mkiv/publ-imp-chicago.mkvi b/Master/texmf-dist/tex/context/base/mkiv/publ-imp-chicago.mkvi
new file mode 100644
index 00000000000..867535ca6be
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/publ-imp-chicago.mkvi
@@ -0,0 +1,1686 @@
+%D \module
+%D [ file=publ-imp-chicago,
+%D version=2019.05.20,
+%D title=Chicago bibliography style,
+%D subtitle=Publications,
+%D author=Alan Braslau and Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is therefore copyrighted
+%D by \PRAGMA. See mreadme.pdf for details.
+
+\startbtxrenderingdefinitions[chicago]
+
+\ifdefined\c!translate \else \def\c!translate{translate} \fi
+
+%D Reference:
+%D \startTEX
+%D @Book{Chicago2010,
+%D title ={The Chicago Manual of Style},
+%D subtitle ={The Essential Guide for Writers, Editors, and Publishers},
+%D year ={2010},
+%D edition ={Sixteenth},
+%D address ={Chicago and London},
+%D publisher={The University of Chicago Press},
+%D Xpages ={1026},
+%D url ={https://www.chicagomanualofstyle.org/},
+%D }
+%D \stopTEX
+
+% set ALL specific Chicago compliant values
+
+\definebtx
+ [chicago]
+ [\c!default=default,
+ \c!specification=chicago,
+ \c!otherstext={\btxspace\btxlabeltext{others}},
+ %\c!journalconversion=\v!normal,
+ \c!monthconversion=\v!month,
+ \c!stopper:initials={. }, % with a (breakable) space
+ \c!separator:names:2={\btxcomma}, % aka namesep - in this namespace
+ \c!separator:names:3={\btxcomma\btxlabeltext{and}\space}, % comma separated list
+ \c!separator:names:4={\btxspace\btxlabeltext{and}\space}] % last of two, no comma!
+
+% First, define list and rendering parameters
+
+% The Chicago style sorts the unnumbered rendered list by authoryear
+
+\definebtxrendering
+ [chicago]
+ [\c!specification=chicago,
+ \c!sorttype=authoryear,
+ \c!numbering=\v!no]
+
+\setupbtxlist
+ [chicago]
+ [\c!alternative=\v!paragraph,
+ \c!align={normal,verytolerant,stretch},
+ %\c!width=\v!fit,
+ %\c!distance=.5\emwidth,
+ \c!margin=3.5\emwidth]
+
+\definebtx
+ [chicago:\s!list]
+ [chicago]
+ %[\c!otherstext={\btxcomma\btxnobreakspace\textellipsis\space},
+ % \c!etallimit=7,
+ % \c!etaldisplay=6,
+ % \c!etaloption=last,
+ [\c!authorconversion=inverted]
+
+% First, we define a namespace for a few special fields
+
+\definebtx
+ [chicago:\s!list:author]
+ [chicago:\s!list]
+
+\definebtx
+ [chicago:\s!list:withauthor]
+ [chicago:\s!list:author]
+
+\definebtx
+ [chicago:\s!list:editor]
+ [chicago:\s!list:author]
+
+\definebtx
+ [chicago:\s!list:ineditor]
+ [chicago:\s!list:editor]
+ [\c!authorconversion=normalshort]
+
+\definebtx
+ [chicago:\s!list:translator]
+ [chicago:\s!list:author]
+ [\c!authorconversion=normalshort]
+
+\definebtx
+ [chicago:\s!list:director]
+ [chicago:\s!list:author]
+
+\definebtx
+ [chicago:\s!list:producer]
+ [chicago:\s!list:author]
+
+\definebtx
+ [chicago:\s!list:suffix]
+ [chicago:\s!list]
+
+\definebtx
+ [chicago:\s!list:url]
+ [chicago:\s!list]
+
+\definebtx
+ [chicago:\s!list:doi]
+ [chicago:\s!list]
+
+\definebtx
+ [chicago:\s!list:\s!page]
+ [chicago:\s!list]
+ %[\c!separator:2={\btxcomma},
+ % \c!separator:3={\btxcomma\btxlabeltext{and}\space},
+ % \c!separator:4={\btxspace\btxlabeltext{and}\space},
+ [\c!left={\btxleftparenthesis},
+ \c!right={\btxrightparenthesis},
+ \c!command={\wordright}]
+
+\definebtx
+ [chicago:\s!list:numbering]
+ [chicago:\s!list]
+ [\c!right={\btxspace}]
+
+\definebtx
+ [chicago:\s!list:numbering:default]
+ [chicago:\s!list:numbering]
+
+\definebtx
+ [chicago:\s!list:numbering:num]
+ [chicago:\s!list:numbering]
+ [\c!stopper={.}]
+
+\definebtx
+ [chicago:\s!list:numbering:short]
+ [chicago:\s!list:numbering]
+
+\definebtx
+ [chicago:\s!list:numbering:tag]
+ [chicago:\s!list:numbering]
+
+\definebtx
+ [chicago:\s!list:numbering:index]
+ [chicago:\s!list:numbering]
+
+% Next, we define a namespace for each category
+
+%D In order to be able to get journals expanded (or normalized or abbreviated) you need
+%D to load a list:
+%D
+%D \starttyping
+%D \btxloadjournallist[journals.txt] % the jabref list
+%D \stoptyping
+
+\definebtx
+ [chicago:\s!list:journal]
+ [chicago:\s!list]
+ [\c!style=\v!italic]
+ %command=\btxexpandedjournal] % btxabbreviatedjournal
+
+\definebtx
+ [chicago:\s!list:volume]
+ [chicago:\s!list]
+ [\c!style=\v!italic]
+
+\definebtx
+ [chicago:\s!list:title]
+ [chicago:\s!list]
+ [\c!style=\v!italic,
+ \c!command=\Word,
+ \c!translate=\v!yes]
+
+\definebtx
+ [chicago:\s!list:title:article]
+ [chicago:\s!list:title]
+ [\c!style=] % journal is set in italics
+
+\definebtx
+ [chicago:\s!list:title:magazine]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:newspaper]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:periodical]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:standard]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:book]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:booktitle:inbook]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:inbook]
+ [chicago:\s!list:title]
+ [\c!style=] % booktitle is set in italics
+
+\definebtx
+ [chicago:\s!list:booktitle:incollection]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:incollection]
+ [chicago:\s!list:title]
+ [\c!style=] % booktitle is set in italics
+
+\definebtx
+ [chicago:\s!list:title:proceedings]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:booktitle:inproceedings]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:inproceedings]
+ [chicago:\s!list:title]
+ [\c!style=] % booktitle is set in italics
+
+\definebtx
+ [chicago:\s!list:booktitle:conference]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:conference]
+ [chicago:\s!list:title]
+ [\c!style=] % booktitle is set in italics
+
+\definebtx
+ [chicago:\s!list:title:thesis]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:phdthesis]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:mastersthesis]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:booklet]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:manual]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:techreport]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:unpublished]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:patent]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:electronic]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:music]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:film]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:other]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:misc]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:title:literal]
+ [chicago:\s!list:title]
+
+\definebtx
+ [chicago:\s!list:type]
+ [\c!command=\Word]
+
+% Then define and set cite parameters.
+
+\definebtx
+ [chicago:\s!cite]
+ [chicago]
+ [\c!alternative=authoryear,
+ \c!otherstext={\btxcomma\btxlabeltext{others}},
+ \c!etallimit=1,
+ \c!etaldisplay=1,
+ \c!authorconversion=\v!name,
+ \c!sorttype=normal, % \v!normal ?
+ \c!style=,
+ \c!compress=\v!yes] % note that cite sorts only work with compress=yes.
+
+\definebtx
+ [chicago:\s!cite:name]
+ [chicago:\s!cite]
+ [\c!authorconversion=\v!name]
+
+\definebtx
+ [chicago:\s!cite:inverted]
+ [chicago:\s!cite]
+ [\c!authorconversion=\v!invertedshort]
+
+\definebtx
+ [chicago:\s!cite:invertedshort]
+ [chicago:\s!cite]
+ [\c!authorconversion=\v!invertedshort]
+
+\definebtx
+ [chicago:\s!cite:normalshort]
+ [chicago:\s!cite]
+ [\c!authorconversion=\v!normalshort]
+
+\definebtx
+ [chicago:\s!cite:normal]
+ [chicago:\s!cite]
+ [\c!authorconversion=\v!normal]
+
+\definebtx
+ [chicago:\s!cite:author]
+ [chicago:\s!cite]
+
+\definebtx
+ [chicago:\s!cite:editor]
+ [chicago:\s!cite:author]
+
+\definebtx
+ [chicago:\s!cite:translator]
+ [chicago:\s!cite:author]
+
+\definebtx
+ [chicago:\s!cite:organization]
+ [chicago:\s!cite]
+
+\definebtx
+ [chicago:\s!cite:authoryear]
+ [chicago:\s!cite:author]
+ [\c!left={(},
+ \c!right={)},
+ \c!inbetween={\btxspace}]
+
+\definebtx
+ [chicago:\s!cite:default]
+ [chicago:\s!cite:authoryear]
+
+\definebtx
+ [chicago:\s!cite:authoryears]
+ [chicago:\s!cite:author]
+ [\c!left=, % these two settings are perhaps redundant?
+ \c!right=,
+ \c!inbetween={\btxspace}]
+
+\definebtx
+ [chicago:\s!cite:authornum]
+ [chicago:\s!cite:author]
+ [\c!left={(},
+ \c!right={)}]
+
+\definebtx
+ [chicago:\s!cite:author:num] % todo
+ [chicago:\s!cite:authornum]
+ [\c!left={\btxspace[},
+ \c!right={]}]
+
+\definebtx
+ [chicago:\s!cite:author:year] % todo
+ [chicago:\s!cite]
+
+\definebtx
+ [chicago:\s!cite:author:years] % todo
+ [chicago:\s!cite:authoryears]
+ [\c!inbetween=,
+ \c!left={\btxspace(},
+ \c!right={)}]
+
+\definebtx
+ [chicago:\s!cite:lefttext]
+ [chicago:\s!cite]
+ [\c!left=,
+ \c!right={\btxspace}]
+
+\definebtx
+ [chicago:\s!cite:righttext]
+ [chicago:\s!cite]
+ [\c!left={\btxcomma},
+ \c!right=]
+
+\definebtx
+ [chicago:\s!cite:year]
+ [chicago:\s!cite]
+ [\c!separator:2={\btxcomma}, % :0 and :1 - between items of a list
+ \c!separator:3={\btxcomma\btxlabeltext{and}\space},
+ \c!separator:4={\btxspace\btxlabeltext{and}\space}]
+
+\definebtx
+ [chicago:\s!cite:title]
+ [chicago:\s!cite]
+ [\c!separator:2={\btxcomma}, % :0 and :1 - between items of a list
+ \c!separator:3={\btxcomma\btxlabeltext{and}\space},
+ \c!separator:4={\btxspace\btxlabeltext{and}\space},
+ \c!command={\language[\currentbtxlanguage]}, % BAH
+ \c!sorttype=none,
+ \c!style=\v!italic]
+
+\definebtx
+ [chicago:\s!cite:subtitle]
+ [chicago:\s!cite:title]
+
+\definebtx
+ [chicago:\s!cite:booktitle]
+ [chicago:\s!cite:title]
+
+\definebtx
+ [chicago:\s!cite:subbooktitle]
+ [chicago:\s!cite:booktitle]
+
+% Will these get used?
+
+\definebtx
+ [chicago:\s!cite:title:inbook]
+ [chicago:\s!cite:title]
+ [\c!style=] % not italic
+
+\definebtx
+ [chicago:\s!cite:title:incollection]
+ [chicago:\s!cite:title:inbook]
+
+\definebtx
+ [chicago:\s!cite:title:inproceedings]
+ [chicago:\s!cite:title:inbook]
+
+\definebtx
+ [chicago:\s!cite:subtitle:inbook]
+ [chicago:\s!cite:title:inbook]
+
+\definebtx
+ [chicago:\s!cite:subtitle:incollection]
+ [chicago:\s!cite:title:incollection]
+
+\definebtx
+ [chicago:\s!cite:subtitle:inproceedings]
+ [chicago:\s!cite:title:inproceedings]
+
+
+\definebtx
+ [chicago:\s!cite:tag]
+ [chicago:\s!cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [chicago:\s!cite:index]
+ [chicago:\s!cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [chicago:\s!cite:page]
+ [chicago:\s!cite]
+ [\c!left=,
+ \c!right=,
+ \c!separator:2={\btxcomma}, % :0 and :1 - between items of a list
+ \c!separator:3={\btxcomma\btxlabeltext{and}\space},
+ \c!separator:4={\btxspace\btxlabeltext{and}\space}]
+
+\definebtx
+ [chicago:\s!cite:pages]
+ [chicago:\s!cite:page]
+
+\definebtx
+ [chicago:\s!cite:keywords]
+ [chicago:\s!cite]
+
+\definebtx
+ [chicago:\s!cite:short]
+ [chicago:\s!cite]
+ [\c!left={[},
+ \c!right={]}]
+
+\definebtx
+ [chicago:\s!cite:category]
+ [chicago:\s!cite]
+
+\definebtx
+ [chicago:\s!cite:url]
+ [chicago:\s!cite]
+ [\c!left={(},
+ \c!right={)}]
+
+\definebtx
+ [chicago:\s!cite:doi]
+ [chicago:\s!cite:url]
+
+\definebtx
+ [chicago:\s!cite:num]
+ [chicago:\s!cite]
+ [\c!left={[},
+ \c!right={]},
+ \c!separator:2={,}, % no space
+ \c!separator:3=\btxparameter{\c!separator:2},
+ \c!separator:4=\btxparameter{\c!separator:2}]
+
+\definebtx
+ [chicago:\s!cite:textnum]
+ [chicago:\s!cite:num]
+ [\c!left={Ref.\nbsp},
+ \c!right=,
+ \c!separator:2={\btxcomma},
+ \c!separator:3={\btxspace\btxlabeltext{and}\space},
+ \c!separator:4={\btxspace\btxlabeltext{and}\space}]
+
+\definebtx
+ [chicago:\s!cite:entry]
+ [chicago:\s!cite]
+ [\c!left=,
+ \c!right=,
+ \c!inbetween={\btxspace},
+ \c!separator:2={\btxsemicolon},
+ \c!separator:3=\btxparameter{\c!separator:2},
+ \c!separator:4=\btxparameter{\c!separator:2}]
+
+\definebtx
+ [chicago:\s!cite:footnote]
+ [chicago:\s!cite:entry]
+
+% Now we setup for the details of the renderings
+
+%D Sometimes we have verbose injections in an entry and these can be language
+%D dependent, so we use labels.
+%D
+%D Because we want to mix rendering (in the manual) we need a namespace in label
+%D texts:
+
+\setupbtxlabeltext
+ [en]
+ [chicago:number={No.},
+ chicago:edition={ed.},
+ chicago:Editor={Ed.},
+ chicago:Editors={Eds.},
+ chicago:Volume={Vol.},
+ chicago:Volumes={Vols.},
+ chicago:nd={n.d.}, % no date
+ chicago:supplement={Suppl.}, % Supplement (not used?)
+ chicago:MotionPicture={Motion picture},
+ chicago:Writer=Writer,
+ chicago:Writers=Writers,
+ chicago:Producer=Producer,
+ chicago:Producers=Producers,
+ chicago:Director=Director,
+ chicago:Directors=Directors,
+ chicago:Recordedby={Recorded by},
+ chicago:Author=Author,
+ chicago:Translator={Trans.}, % Translator(s)
+ chicago:Advanced={Advanced online publication},
+ chicago:Retrieved={Retrieved from}] % {Available from}]
+
+\setupbtxlabeltext
+ [nl]
+ [chicago:number={Nr.},
+ chicago:edition={ed.}, % editie
+ chicago:Editor=Editor, % Ed./Eds.
+ chicago:Editors=Editors,
+ chicago:Volume={Vol.},
+ chicago:Volumes={Vols.},
+ chicago:nd={g.d.} % geen datum
+ chicago:supplement=Supplement,
+ chicago:MotionPicture=Film, % ?
+ chicago:Writer=Scenarioschrijver, % ?
+ chicago:Writers=Schrijvers, % ?
+ chicago:Producer=Producent, % ?
+ chicago:Producers=Producents, % ?
+ chicago:Director=Directeur,
+ chicago:Directors=Directeurs,
+ chicago:Recordedby={Opgenomen door}, % ?
+ chicago:Author=Auteur,
+ chicago:Translator=Vertaler,
+ chicago:Advanced={Geavanceerde online publicatie},
+ chicago:Retrieved={Ontvangen van}] % {Beschikbaar vanaf}]
+
+\setupbtxlabeltext
+ [fr]
+ [chicago:number={N\high{o}},
+ chicago:edition={édition},
+ chicago:Editor=Éditeur,
+ chicago:Editors=Éditeurs,
+ chicago:Volume=Volume,
+ chicago:Volumes=Volumes,
+ chicago:nd={s.d.}, % sans date
+ chicago:supplement=Supplément,
+ chicago:MotionPicture={Film cinématographique},
+ chicago:Writer=Scénariste,
+ chicago:Writers=Scénaristes,
+ chicago:Producer=Producteur,
+ chicago:Producers=Producteurs,
+ chicago:Director=Réalisateur,
+ chicago:Directors=Réalisateurs,
+ chicago:Recordedby={Enregistré par},
+ chicago:Author=Auteur,
+ chicago:Translator=Traducteur,
+ chicago:Advanced={Publication en ligne anticipée},
+ chicago:Retrieved={Téléchargé de}] % {Disponible à}]
+
+\setupbtxlabeltext
+ [de]
+ [chicago:number={Nr.},
+ chicago:edition=Auf\/lage,
+ chicago:Editor=Herausgeber, % Hrsg./Hg.
+ chicago:Editors=Herausgeber,
+ chicago:Volume=Band, % Bd.
+ chicago:Volumes={Bände},
+ chicago:nd={o.D.}, % ohne Datum (mostly: o.J. / ohne Jahr)
+ chicago:supplement={Beilage}, % Supplement
+ chicago:MotionPicture=Kinofilm, % ?
+ chicago:Writer=Drehbuchautor, % ?
+ chicago:Writers=Schriftsteller, % ?
+ chicago:Producer=Producer, % ?
+ chicago:Producers=Produzenten, % ?
+ chicago:Director=Director, % ?
+ chicago:Directors=Directors, % ?
+ chicago:Recordedby={per Einschreiben}, % ?
+ chicago:Author=Autor,
+ chicago:Translator={Ãœbersetzer}, % Ãœbers.
+ chicago:Advanced={Erweiterte Online-Publikation},
+ chicago:Retrieved={heruntergeladen von}]
+
+% thanks: Andrea Valle
+
+\setupbtxlabeltext
+ [it]
+ [chicago:number={Nº},
+ chicago:edition={ed.}, % edizione
+ chicago:Editor={A cura di},
+ chicago:Editors={A cura di},
+ chicago:Volume={Vol.}, % Volume
+ chicago:Volumes={Vol.}, % Volumi
+ chicago:nd={s.d.}, % senza data
+ chicago:supplement={Supplemento},
+ chicago:MotionPicture=Film, % ?
+ chicago:Writer=Sceneggiatore, % ?
+ chicago:Writers=Scrittori, % ?
+ chicago:Producer=Produttore,
+ chicago:Producers=Produttori,
+ chicago:Director=Direttore,
+ chicago:Directors=Direttori,
+ chicago:Recordedby={Registrato da},
+ chicago:Author=Autore,
+ chicago:Translator={Trad.}, % Translator(s)
+ chicago:Advanced={Pre-pubblicazione on line},
+ chicago:Retrieved={Accessible online}]
+
+\setupbtxlabeltext
+ [es]
+ [chicago:number={Nº},
+ chicago:edition={ed.}, % edicioÌn
+ chicago:Editor=Editor, % Ed./Eds.
+ chicago:Editors=Editores,
+ chicago:Volume={Vol.}, % Volumen
+ chicago:Volumes={Vols.}, % Volúmenes
+ chicago:nd={s.f.}, % sin fecha
+ chicago:supplement=Suplemento,
+ chicago:MotionPicture=Cinematográfica,
+ chicago:Writer=Guionista, % ?
+ chicago:Writers=Escritores, % ?
+ chicago:Producer=Productor,
+ chicago:Producers=Productores,
+ chicago:Director=Director,
+ chicago:Directors=Directores,
+ chicago:Recordedby={Grabada por},
+ chicago:Author=Autor,
+ chicago:Translator=Traductor,
+ chicago:Advanced={Publicación en línea avanzada},
+ chicago:Retrieved={Obtenido de}] % {Disponible desde}]
+
+
+\setupbtxlabeltext
+ [sv]
+ [chicago:number={nr.},
+ chicago:edition={Utgåva},
+ chicago:Editor=Redaktör,
+ chicago:Editors=Redaktörer,
+ chicago:Volume=Band,
+ chicago:Volumes=Band,
+ chicago:nd={u.å.}, % utan årtal
+ chicago:supplement=Bilaga, % Supplement
+ chicago:MotionPicture=Spelfilm, % ?
+ chicago:Writer={Manusförfattare}, % Assuming for a movie
+ chicago:Writers={Manusförfattare}, %
+ chicago:Producer=Producent, % Assuming for a movie
+ chicago:Producers=Producenter, %
+ chicago:Director={Regissör}, % Assuming for a movie
+ chicago:Directors={Regissörer}, %
+ chicago:Recordedby={Inspelad av}, % Assuming for a movie
+ chicago:Author={Författare},
+ chicago:Translator={Översättare},
+ chicago:Advanced={Avancerad onlinepublikation}, % ?
+ chicago:Retrieved={Hämtad från}]
+
+% cite setups
+
+% The following differs from the default returning n.d. if year is empty
+
+\startsetups btx:chicago:cite:author:year
+ \ifx\currentbtxfirst\empty
+ \def\currentbtxfirst{\fastsetup{\s!btx:chicago:nd}}
+ \fi
+ \fastsetup{\s!btx:\s!cite:author:year}
+\stopsetups
+
+\startsetups btx:chicago:cite:author:years
+ \ifx\currentbtxfirst\empty
+ \def\currentbtxfirst{\fastsetup{\s!btx:chicago:nd}}
+ \fi
+ \fastsetup{\s!btx:\s!cite:author:years}
+\stopsetups
+
+% these setups need to be explicitly defined in order to get cite rendering
+
+\startsetups \s!btx:chicago:\s!cite:organization
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+
+\startsetups \s!btx:chicago:\s!cite:subtitle
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+
+\startsetups \s!btx:chicago:\s!cite:booktitle
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+
+\startsetups \s!btx:chicago:\s!cite:subbooktitle
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+
+% are these needed?
+
+\startsetups \s!btx:chicago:\s!cite:title:inbook
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+
+\startsetups \s!btx:chicago:\s!cite:title:incollection
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+
+\startsetups \s!btx:chicago:\s!cite:title:inproceedings
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+
+\startsetups \s!btx:chicago:\s!cite:subtitle:inbook
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+
+\startsetups \s!btx:chicago:\s!cite:subtitle:incollection
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+
+\startsetups \s!btx:chicago:\s!cite:subtitle:inproceedings
+ \fastsetup{\s!btx:\s!cite:normal}
+\stopsetups
+
+% used in publ-imp-page.mkvi
+
+\startsetups btx:chicago:list:page-or-pages
+ \ifx\currentbtxlastpage\empty
+ \btxlabeltext{p}
+ \else
+ \btxlabeltext{pp}
+ \fi
+ \btxnbsp
+\stopsetups
+
+% The sameauthor feature may not be Chicago compliant
+% (there is nothing in the manual cited above).
+% It can be removed using the command:
+% \resetsetups [chicago:list:sameauthor]
+
+% :rule, :empty or :ditto ...
+
+\startsetups chicago:list:sameauthor
+ \fastsetup{chicago:list:sameauthor:rule}
+\stopsetups
+
+\startsetups chicago:list:sameauthor:rule
+ \blackrule
+ [\c!width=3em,
+ \c!height=1.5\linewidth]% \linewidth is just too thin with respect to font strokes...
+\stopsetups
+
+\startsetups [chicago:list:sameauthor:\v!empty]
+ \kern\dimexpr\listparameter\c!margin-\interwordspace\relax
+\stopsetups
+
+% horrible !
+
+\startsetups chicago:list:sameauthor:ditto
+ \inframed
+ [\c!width=\dimexpr\listparameter\c!margin-\interwordspace\relax,
+ \c!frame=\v!off,
+ \c!align=\v!middle]
+ {\doubleprime}
+\stopsetups
+
+%D Instead of texdefinitions without arguments, we could have used setups but in my
+%D editor (hh, scite) the commands stand out better. It also saves an additional
+%D component in the name (e.g. common:) because commands and setups have a different
+%D namespace, so similar calls don't clash. Performance of definitions is somewhat
+%D better.
+
+%D We use "texdefinitions" (with eventual arguments) for helpers that are used
+%D in the rendering "setups" defined for each category below.
+
+%D Note that \btxdoif... and \btxflush rely on the definitions in
+%D publ-imp-chicago.lua: fields that are not listed as required nor optional are
+%D IGNORED. We also make heavy use of the notion of sets - comma-separated lists
+%D of alternative fields to be used in hierarchal order. For example:
+%D author = { "author", "editor", "publisher", "title" }, will return the
+%D author field if it exists; if not, the editor field will be returned, if it
+%D exists; if not, the publisher field will be returned, if it exists; if not,
+%D the title field will be returned, it it exists; if not, nothing will be
+%D returned. In lua syntax, it can be understood as
+%D author or editor or publisher or title or ""
+
+% #title can be title or booktitle
+
+\starttexdefinition unexpanded btx:chicago:translated-title #title
+ \ifx\currentbtxlanguage\empty
+ % no need for an extra
+ \else\ifx\mainbtxlanguage\currentbtxlanguage
+ % no need for an extra
+ \else
+ \btxdoif {#title:\mainbtxlanguage} {
+ \begingroup
+ \language[\mainbtxlanguage]
+ \btxleftbracket
+ \btxusecommand [chicago:\s!list:#title:\currentbtxcategory] {
+ \btxflush{#title:\mainbtxlanguage}
+ }
+ \btxrightbracket
+ \endgroup
+ }
+ \fi\fi
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:composed-title #title
+ \btxstartstyleandcolor[chicago:\s!list:#title:\currentbtxcategory]
+ \begingroup
+ \language[\currentbtxlanguage]
+ \btxusecommand [chicago:\s!list:#title:\currentbtxcategory] {
+ \btxflush{#title}
+ \btxdoif {sub#title} {
+ \btxcolon
+ \btxflush{sub#title}
+ }
+ }
+ \endgroup
+ % which namespace?
+ %\doif{\btxparameter{translate}}\v!yes {
+ \texdefinition{btx:chicago:translated-title}{#title}
+ %}
+ \btxstopstyleandcolor
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:title
+ \setmode{btx:chicago:title-placed}
+ % we make the title active, opening "file"
+ \btxdoifelse {file} {
+ \texdefinition{btx:format:inject}
+ {url(file:\btxflush{file})}
+ {
+ \texdefinition{btx:chicago:composed-title}{title}
+ }
+ } {
+ \texdefinition{btx:chicago:composed-title}{title}
+ }
+ \btxdoif {title} {
+ % A book might have an editor AND an author
+ \doif {\currentbtxcategory} {book} {
+ \doifnot {\btxfoundname{author}} {editor} {
+ \btxdoif {ineditor} { % ineditor specific authorconversion
+ \btxleftparenthesis
+ \btxflush{ineditor}
+ \btxcomma
+ \btxsingularorplural {ineditor} {
+ \btxlabeltext{chicago:Editor}
+ } {
+ \btxlabeltext{chicago:Editors}
+ }
+ \btxrightparenthesis
+ }
+ }
+ }
+ \btxdoif {translator} {
+ \btxleftparenthesis
+ \btxflush{translator}
+ \btxcomma
+ \btxlabeltext{chicago:Translator}
+ \btxrightparenthesis
+ }
+ \btxperiod
+ % TODO: this period may NOT be wanted, as in: Title (2nd ed.).
+ }
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:title-if-not-placed
+ \doifelsemode {btx:chicago:title-placed} {
+ \resetmode{btx:chicago:title-placed}
+ } {
+ \btxdoif {title} {
+ \btxspace
+ \texdefinition {btx:chicago:title}
+ }
+ }
+\stoptexdefinition
+
+\startsetups btx:chicago:nd
+ \btxlabeltext{chicago:nd}
+\stopsetups
+
+\starttexdefinition unexpanded btx:chicago:suffixedyear
+ \btxdoifelse {year} {
+ \btxflush{year}
+ \btxflushsuffix
+ \btxdoif {month} { % month and day optional in publ-imp-chicago.lua
+ \btxcomma
+ \btxflush{month}
+ \btxdoif {day} {
+ \btxspace
+ \btxflush{day}
+ }
+ }
+ } {
+ \fastsetup{btx:chicago:nd}
+ % Hans: the following won't work but should.
+ \btxdoif {suffix} {
+ \btxspace
+ \btxflushsuffix
+ % Hans: similarly, why can't \btxflush{suffix} be made to work?
+ }
+ }
+\stoptexdefinition
+
+% #author may be author(set) or editor
+
+\starttexdefinition unexpanded btx:chicago:author-or-editor #author
+ \btxdoifelse {#author} {
+ \btxstartstyleandcolor[chicago:\s!list:#author]
+ \btxusecommand[chicago:\s!list:#author]{
+ \btxflush{#author}
+ }
+ \btxstopstyleandcolor
+ % use \processaction [] [] here?
+ \doifelse {\btxfoundname{#author}} {editor} {
+ \btxleftparenthesis
+ \btxsingularorplural {editor} {
+ \btxlabeltext{chicago:Editor}
+ } {
+ \btxlabeltext{chicago:Editors}
+ }
+ \btxrightparenthesis
+ } {\doif {\btxfoundname{#author}} {ineditor} {
+ \btxleftparenthesis
+ \btxsingularorplural {ineditor} {
+ \btxlabeltext{chicago:Editor}
+ } {
+ \btxlabeltext{chicago:Editors}
+ }
+ \btxrightparenthesis
+ } }
+ \doif {\currentbtxcategory} {film} {
+ \btxleftparenthesis
+ \doifelse {\btxfoundname{#author}} {director} {
+ \btxsingularorplural {director} {
+ \btxlabeltext{chicago:Director}
+ } {
+ \btxlabeltext{chicago:Directors}
+ }
+ } {
+ \doif {\btxfoundname{#author}} {author} {
+ \btxsingularorplural {author} {
+ \btxlabeltext{chicago:Writer}
+ } {
+ \btxlabeltext{chicago:Writers}
+ }
+ }
+ \doif {\btxfoundname{#author}} {producer} {
+ \btxsingularorplural {producer} {
+ \btxlabeltext{chicago:Producer}
+ } {
+ \btxlabeltext{chicago:Producers}
+ }
+ }
+ \btxdoif {director} {
+ \btxrightparenthesis
+ \removeunwantedspaces
+ \btxparameter{\c!separator:names:3}
+ \btxstartstyleandcolor[chicago:\s!list:director]
+ \btxusecommand[chicago:\s!list:director]{
+ \btxflush{director}
+ }
+ \btxstopstyleandcolor
+ \btxleftparenthesis
+ \btxsingularorplural {director} {
+ \btxlabeltext{chicago:Director}
+ } {
+ \btxlabeltext{chicago:Directors}
+ }
+ }
+ }
+ \btxrightparenthesis
+ }
+ \btxdoif {withauthor} {
+ \btxleftparenthesis
+ \btxlabeltext{with}
+ \btxspace
+ \btxstartstyleandcolor[chicago:\s!list:withauthor]
+ \btxusecommand[chicago:\s!list:withauthor]{
+ \btxflush{withauthor}
+ }
+ \btxstopstyleandcolor
+ \btxrightparenthesis
+ }
+ } {
+ \texdefinition{btx:chicago:title}
+ }
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:authoryear
+ % we make the authoryear active, pointing to the citation
+ \texdefinition{btx:format:inject}
+ {internal(\currentbtxinternal)}
+ {
+ \doifelsesetups{chicago:list:sameauthor} {
+ \btxdoifelsesameasprevious {author} {
+ \fastsetup{chicago:list:sameauthor}
+ } {
+ \texdefinition{btx:chicago:author-or-editor} {author}
+ }
+ } {
+ \texdefinition{btx:chicago:author-or-editor} {author}
+ }
+ \texdefinition{btx:chicago:suffixedyear}
+ }
+ % outside of interaction
+ \btxperiod
+ \doif {\btxfoundname{author}} {title} {
+ \setmode{btx:chicago:title-placed}
+ }
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:editor-in
+ \btxdoif {booktitle} {
+ \btxlabeltext{In}
+ \btxspace
+ \doifnot {\btxfoundname{author}} {editor} {
+ \texdefinition{btx:chicago:author-or-editor} {ineditor}
+ \btxcomma
+ }
+ \texdefinition{btx:chicago:composed-title}{booktitle}
+ \btxperiod
+ }
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:organization-if-not-author
+ \btxdoif {organization} {
+ \doifnot {\btxfoundname{author}} {organization} {
+ \btxspace
+ \btxflush{organization}
+ \btxcomma
+ }
+ }
+\stoptexdefinition
+
+% TODO: The title is terminated with period. However,
+% we probably don't want this before the parenthesis.
+
+\starttexdefinition unexpanded btx:chicago:leftparenthesis-or-comma
+ \doifelsemode {btx:chicago:editionset-is-empty} {
+ \btxleftparenthesis
+ \resetmode{btx:chicago:editionset-is-empty}
+ } {
+ \btxcomma
+ }
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:editionset
+ \setmode{btx:chicago:editionset-is-empty}
+ \doif {\currentbtxcategory} {techreport} {
+ \texdefinition{btx:chicago:leftparenthesis-or-comma}
+ \btxdoifelse {type} {
+ \btxusecommand [chicago:\s!list:type] {
+ \btxflush{type}
+ }
+ } {
+ \btxlabeltext{technicalreport}
+ }
+ }
+ \btxdoif {volume} {
+ \texdefinition{btx:chicago:leftparenthesis-or-comma}
+ \btxoneorrange {volume} {
+ \btxlabeltext{chicago:Volume}
+ } {
+ \btxlabeltext{chicago:Volumes}
+ }
+ \btxspace
+ \btxflush{volume}
+ }
+ \btxdoif {number} {
+ \texdefinition{btx:chicago:leftparenthesis-or-comma}
+ \btxlabeltext{chicago:number}
+ \btxspace
+ \btxflush{number}
+ }
+ \btxdoif {edition} {
+ \texdefinition{btx:chicago:leftparenthesis-or-comma}
+ \btxflush{edition}
+ \btxspace
+ \btxlabeltext{chicago:edition}
+ }
+ \btxdoif {pages} {
+ \texdefinition{btx:chicago:leftparenthesis-or-comma}
+ \btxoneorrange {pages} {
+ \btxlabeltext{p}
+ } {
+ \btxlabeltext{pp}
+ }
+ \btxnbsp
+ \btxflush{pages}
+ }
+ \doifnotmode {btx:chicago:editionset-is-empty} {
+ \btxrightparenthesisperiod
+ }
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:journal
+ \btxstartstyleandcolor[chicago:\s!list:journal]
+ \btxusecommand [chicago:\s!list:journal] {
+ \btxflush{journal}
+ }
+ \btxstopstyleandcolor
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:volume
+ \btxstartstyleandcolor[chicago:\s!list:volume]
+ \btxflush{volume}
+ \btxstopstyleandcolor
+\stoptexdefinition
+
+ % this could be simplified!
+
+\starttexdefinition unexpanded btx:chicago:journal-volume-number-pages
+ \btxdoif {journal} {
+ \btxspace
+ \texdefinition{btx:chicago:journal}
+ \btxdoifelse {volume} {
+ \btxcomma
+ \texdefinition{btx:chicago:volume}
+ \btxdoif {number} {
+ %\btxleftparenthesis
+ (\btxflush{number}
+ \btxrightparenthesis
+ }
+ } {
+ \btxdoif {number} {
+ \btxcomma
+ \btxleftparenthesis
+ \btxflush{number}
+ \btxrightparenthesis
+ }
+ }
+ \btxdoif {pages} {
+ \btxcomma
+ \doif {\currentbtxcategory} {newspaper} {
+ \btxoneorrange {pages} {
+ \btxlabeltext{p}
+ } {
+ \btxlabeltext{pp}
+ }
+ \btxnbsp
+ }
+ \btxflush{pages}
+ }
+ \btxperiod
+ \doifnot {\currentbtxcategory} {newspaper} {
+ \btxdoifnot {volume} {
+ \btxdoifnot {number} {
+ \btxdoifnot {pages} {
+ \btxdoif {doi} {%set: doi or url
+ \btxspace
+ \btxlabeltext{chicago:Advanced}
+ \btxperiod
+ }
+ }
+ }
+ }
+ }
+ }
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:wherefrom-publisher
+ \btxdoifelse {address} {
+ \btxflush{address}
+ \btxdoif {country} {
+ \btxcomma
+ \btxflush{country}
+ }
+ \btxcolon
+ } {
+ \btxdoif {country} {
+ \btxflush{country}
+ \btxcolon
+ }
+ }
+ \doifelse {\btxfoundname{author}} {\btxfoundname{publisher}} {
+ \btxlabeltext{chicago:Author}
+ } {
+ \btxdoifelse {publisher} {
+ \btxflush{publisher}
+ } {
+ \btxlabeltext{chicago:Author}
+ }
+ }
+ \btxperiod
+\stoptexdefinition
+
+\definebreakpoints[doi]
+\definebreakpoint [doi][:][nleft=3,type=1]
+\definebreakpoint [doi][/][nleft=3,type=1]
+\definebreakpoint [doi][-][nleft=3,type=1]
+\definebreakpoint [doi][.][nleft=3,type=1]
+
+% use \btxentry here?
+
+\starttexdefinition unexpanded btx:chicago:url
+ \begingroup
+ \setbreakpoints[doi]
+ \ifconditional\btxinteractive
+ \goto {
+ \hyphenatedurl{\btxflush{url}}
+ } [
+ url(\btxflush{url})
+ ]
+ \else
+ \hyphenatedurl{\btxflush{url}}
+ \fi
+ \endgroup
+\stoptexdefinition
+
+% use \btxentry here?
+
+\starttexdefinition unexpanded btx:chicago:doi
+ \begingroup
+ \setbreakpoints[doi]
+ \ifconditional\btxinteractive
+ \goto {
+ \hyphenatedurl{doi:\btxflush{doi}}
+ } [
+ url(http://dx.doi.org/\btxflush{doi})
+ ]
+ \else
+ \hyphenatedurl{doi:\btxflush{doi}}
+ \fi
+ \endgroup
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:note
+ \btxdoif {note} {
+ \btxleftparenthesis
+ \btxflush{note}
+ \btxrightparenthesis
+ }
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:url-doi-note
+ \doif {\btxfoundname{doi}} {url} {
+ \btxspace
+ \btxlabeltext{chicago:Retrieved}
+ \btxspace
+ \texdefinition{btx:chicago:url}
+ }
+ \doif {\btxfoundname{doi}} {doi} {
+ \btxspace
+ \texdefinition{btx:chicago:doi}
+ }
+ \texdefinition{btx:chicago:note}
+ \removeunwantedspaces
+\stoptexdefinition
+
+\starttexdefinition unexpanded btx:chicago:type
+ \btxdoif {type} {
+ \btxleftbracket
+ \btxflush{type}
+ \btxrightbracketperiod
+ }
+\stoptexdefinition
+
+% Then setups, by category
+
+% An article from a journal
+% Required fields: author or organization or editor or title, journal, (year).
+% Optional fields: volume, number, pages, type, doi, url, note.
+% Note that bibtex (and tools) do not include editor (e.g. special issue or section)
+
+\startsetups btx:chicago:list:article
+ \texdefinition{btx:chicago:authoryear}
+ \texdefinition{btx:chicago:title-if-not-placed}
+ \texdefinition{btx:chicago:type}
+ \texdefinition{btx:chicago:journal-volume-number-pages}
+ \texdefinition{btx:chicago:url-doi-note}
+\stopsetups
+
+% An article from a magazine.
+% Required fields: author or title, journal, (year).
+% Optional fields: number, pages, type, month, day, doi, url, note.
+
+\startsetups btx:chicago:list:magazine
+ \fastsetup{btx:chicago:list:article}
+\stopsetups
+
+% An article from a newspaper.
+% Required fields: author or title, journal, (year).
+% Optional fields: volume, number, pages, type, month, day, doi, url, note.
+
+\startsetups btx:chicago:list:newspaper
+ \fastsetup{btx:chicago:list:article}
+\stopsetups
+
+% A complete issue of a periodical, such as a special issue of a journal.
+% Required fields: title, year
+% Optional fields: editor, publisher, subtitle, series, volume, number, month, organization, doi, url, issn, note
+
+% needs to be tuned...
+
+\startsetups btx:chicago:list:periodical
+ \fastsetup{btx:chicago:list:article}
+\stopsetups
+
+% National and international standards issued by a standards body
+% Required fields: author, institution, or organization, year, title
+% Optional fields: subtitle, doi, url, note
+
+\startsetups btx:chicago:list:standard
+ \texdefinition{btx:chicago:authoryear}
+ \texdefinition{btx:chicago:title-if-not-placed}
+ \texdefinition{btx:chicago:url-doi-note}
+\stopsetups
+
+% A book with an explicit publisher.
+% Required fields: author or editor or publisher, title, (year).
+% Optional fields: volume or number, series, address, edition, month, day, note.
+% Chicago ignores: month, day
+
+% todo: series?
+
+\startsetups btx:chicago:list:book
+ \texdefinition{btx:chicago:authoryear}
+ \texdefinition{btx:chicago:title-if-not-placed}
+ \texdefinition{btx:chicago:type}
+ \texdefinition{btx:chicago:editionset}
+ \texdefinition{btx:chicago:wherefrom-publisher}
+ \texdefinition{btx:chicago:url-doi-note}
+\stopsetups
+
+% There is some debate about how inbook should differ from incollection
+
+% A part of a book, which may be a chapter (or section or whatever) and/or a range of pages.
+% (note that inbook is handled differently by bibtex and biblatex)
+% Required fields: author or editor, title, chapter and/or pages, publisher, year.
+% Optional fields: volume or number, series, type, address, edition, month, note.
+% We add optional: booktitle.
+% Chicago ignores: chapter, month
+
+\startsetups btx:chicago:list:inbook
+ \texdefinition{btx:chicago:authoryear}
+ \texdefinition{btx:chicago:title-if-not-placed}
+ \texdefinition{btx:chicago:type}
+ \texdefinition{btx:chicago:editor-in}
+ \texdefinition{btx:chicago:editionset}
+ \texdefinition{btx:chicago:wherefrom-publisher}
+ \texdefinition{btx:chicago:url-doi-note}
+\stopsetups
+
+% A part of a book having its own title.
+% Required fields: author, title, booktitle, publisher, year.
+% Optional fields: editor, volume or number, series, type, chapter, pages, address, edition, month, note.
+% Chicago ignores: chapter, month
+
+\startsetups btx:chicago:list:incollection
+ \fastsetup{btx:chicago:list:inbook}
+\stopsetups
+
+% The proceedings of a conference.
+% Required fields: title, year.
+% Optional fields: editor, volume or number, series, address, month, organization, publisher, note.
+% todo: series?
+
+\startsetups btx:chicago:list:proceedings
+ \fastsetup{btx:chicago:list:book}
+\stopsetups
+
+% An article in a conference proceedings.
+% Required fields: author, title, booktitle, year.
+% Optional fields: editor, volume or number, series, pages, address, month, organization, publisher, note.
+
+\startsetups btx:chicago:list:inproceedings
+ \texdefinition{btx:chicago:authoryear}
+ \texdefinition{btx:chicago:title-if-not-placed}
+ \texdefinition{btx:chicago:editor-in}
+ \texdefinition{btx:chicago:editionset}
+ \texdefinition{btx:chicago:organization-if-not-author}
+ \texdefinition{btx:chicago:wherefrom-publisher}
+ \texdefinition{btx:chicago:url-doi-note}
+\stopsetups
+
+\startsetups btx:chicago:list:conference
+ \fastsetup{btx:chicago:list:inproceedings}
+\stopsetups
+
+% A thesis.
+% Required fields: author, title, school, year.
+% Optional fields: type, address, month, note.
+
+\startsetups btx:chicago:list:thesis
+ \texdefinition{btx:chicago:authoryear}
+ \texdefinition{btx:chicago:title-if-not-placed}
+ \btxleftparenthesis
+ \btxdoifelse {type} {
+ \btxusecommand [chicago:\s!list:type] {
+ \btxflush{type}
+ }
+ } {
+ \btxlabeltext{\currentbtxcategory}
+ }
+ \btxrightparenthesis
+ \btxdoif {school} {
+ \btxperiod
+ \btxflush{school}
+ }
+ \btxdoif {address} {
+ \btxdoifelse {school} {
+ \btxcomma
+ } {
+ \btxperiod
+ }
+ \btxflush{address}
+ \btxdoif {country} {
+ \btxcomma
+ \btxflush{country}
+ }
+ }
+ \btxperiod
+ \texdefinition{btx:chicago:url-doi-note}
+\stopsetups
+
+\startsetups btx:chicago:list:phdthesis
+ \fastsetup{btx:chicago:list:thesis}
+\stopsetups
+
+\startsetups btx:chicago:list:mastersthesis
+ \fastsetup{btx:chicago:list:thesis}
+\stopsetups
+
+% A work that is printed and bound, but without a named publisher or sponsoring institution.
+% Required field: title.
+% Optional fields: author, howpublished, address, month, year, note.
+
+\startsetups btx:chicago:list:booklet
+ \fastsetup{btx:chicago:list:book}
+\stopsetups
+
+% Technical documentation.
+% Required field: title.
+% Optional fields: author, organization, address, edition, month, year, note.
+
+\startsetups btx:chicago:list:manual
+ \fastsetup{btx:chicago:list:book}
+\stopsetups
+
+% A report published by a school or other institution, usually numbered within a series.
+% Required fields: author, title, institution, year.
+% Optional fields: type, number, address, month, note.
+
+\startsetups btx:chicago:list:techreport
+ \fastsetup{btx:chicago:list:book}
+\stopsetups
+
+% A document having an author and title, but not formally published.
+% Required fields: author, title, note.
+% Optional fields: month, year.
+
+\startsetups btx:chicago:list:unpublished
+ \fastsetup{btx:chicago:list:book}
+\stopsetups
+
+% A patent. Note that this category was not defined with BIBTEX. Below from JabRef:
+% Required fields: nationality, number, year, yearfiled
+% Optional fields: author, title, assignee, address, type, number, day, dayfiled, month, monthfiled, note, url
+% Also optional: publisher
+
+% todo: yearfiled, monthfiled, dayfiled
+
+\startsetups btx:chicago:list:patent
+ \texdefinition{btx:chicago:authoryear}
+ \texdefinition{btx:chicago:title-if-not-placed}
+ \begingroup
+ \it
+ \btxdoif {nationality} {
+ \btxspace
+ \btxflush{nationality}
+ }
+ \btxspace
+ \btxdoifelse{type}{
+ \btxflush{type}
+ }{
+ \btxlabeltext{patent}
+ }
+ \btxdoif {number} {
+ \btxspace
+ \btxlabeltext{chicago:number}
+ \btxspace
+ \btxflush{number}
+ }
+ \btxperiod
+ \italiccorrection
+ \endgroup
+ \texdefinition{btx:chicago:wherefrom-publisher}
+ \texdefinition{btx:chicago:url}
+ \texdefinition{btx:chicago:note}
+\stopsetups
+
+% Electronic. Note that this category was not defined with BIBTEX. Below from JabRef:
+% Required fields: title
+% Optional fields: address, author, howpublished, month, note, organization, url, year, doi
+% Also optional: type
+
+% Like Misc below but includes organization.
+
+\startsetups btx:chicago:list:electronic
+ \texdefinition{btx:chicago:authoryear}
+ \texdefinition{btx:chicago:title-if-not-placed}
+ \texdefinition{btx:chicago:type}
+ \texdefinition{btx:chicago:organization-if-not-author}
+ \btxdoif {howpublished} {
+ \btxspace
+ \btxflush{howpublished}
+ \btxperiod
+ }
+ \texdefinition{btx:chicago:url-doi-note}
+\stopsetups
+
+% Film. Note that this category was not defined with BIBTEX.
+% Required fields: producer, director, title, year, address, publisher
+% Optional fields: subtitle, type, note, url, doi
+
+\startsetups btx:chicago:list:film
+ \texdefinition{btx:chicago:authoryear}
+ \texdefinition {btx:chicago:title}
+ \btxleftbracket
+ \btxdoifelse {type} {
+ \btxflush{type}
+ } {
+ \btxlabeltext{chicago:MotionPicture}
+ }
+ \btxrightbracketperiod
+ \texdefinition{btx:chicago:wherefrom-publisher}
+ \texdefinition{btx:chicago:url-doi-note}
+\stopsetups
+
+% Music. Note that this category was not defined with BIBTEX.
+% Required fields: composer, artist, title, album, year, address, publisher
+% Optional fields: subtitle, type, note, url, doi
+
+\startsetups btx:chicago:list:music
+ \texdefinition{btx:chicago:authoryear}
+ \texdefinition{btx:chicago:title-if-not-placed}
+ \doifnot {\btxfoundname{author}} {artist} {
+ \btxdoif {artist} {
+ \btxleftbracket
+ \btxlabeltext{chicago:Recordedby}
+ \btxspace
+ \btxflush{artist}
+ \btxrightbracketperiod
+ }
+ }
+ \doifnot {\btxfoundname{title}} {album} {
+ \btxdoif {album} {
+ \btxlabeltext{In}
+ \btxspace
+ \btxflush{album}
+ \btxperiod
+ }
+ }
+ \texdefinition{btx:chicago:type}
+ \texdefinition{btx:chicago:wherefrom-publisher}
+ \texdefinition{btx:chicago:url-doi-note}
+\stopsetups
+
+% Other. Note that this category was not defined with BIBTEX. Below from JabRef:
+% Required fields: author or title, year
+% Optional fields: note, doi, url
+
+\startsetups btx:chicago:list:other
+ \fastsetup{btx:chicago:list:book}
+\stopsetups
+
+% Use this category when nothing else fits.
+% Required fields: none.
+% Optional fields: author, title, howpublished, month, year, note.
+
+\startsetups btx:chicago:list:misc
+ \texdefinition{btx:chicago:authoryear}
+ \texdefinition{btx:chicago:title-if-not-placed}
+ \btxdoif {howpublished} {
+ \btxspace
+ \btxflush{howpublished}
+ \btxperiod
+ }
+ \texdefinition{btx:chicago:url-doi-note}
+\stopsetups
+
+% If all else fails to match:
+
+\startsetups btx:chicago:list:literal
+ %\btxleftparenthesis
+ \removeunwantedspaces(
+ \btxflush{tag}
+ \btxrightparenthesis
+ \btxdoif {text} {
+ \btxflush{text}
+ }
+\stopsetups
+
+% HH: an example of setting up translations using a sub rendering. Keep it here
+% till we find another spot as otherwise I forget about it and I don't want to
+% waste hours reinventing a wheel when something like this is needed.
+%
+% \definebtx
+% [chicago:cite:title:translated]
+% [chicago:cite:title]
+% [left=\btxleftbracket,
+% right=\btxrightbracket,
+% style=\v!bolditalic]
+%
+% \startsetups btx:chicago:cite:title
+% % need to add concat, etc.
+% \btxcitereference
+% \currentbtxfirst
+% \doifmode {btx:chicago:translatedtitles} {
+% \ifx\currentbtxlanguage\empty
+% % no need for an extra
+% \else\ifx\mainbtxlanguage\currentbtxlanguage
+% % no need for an extra
+% \else
+% \btxdoif {title:\mainbtxlanguage} {
+% \btxstartciterendering[title:translated]
+% \language[\mainbtxlanguage]
+% \btxflush{title:\mainbtxlanguage}
+% \btxstopciterendering
+% }
+% \fi\fi
+% }
+% \stopsetups
+
+\stopbtxrenderingdefinitions
diff --git a/Master/texmf-dist/tex/context/base/mkiv/publ-imp-cite.mkvi b/Master/texmf-dist/tex/context/base/mkiv/publ-imp-cite.mkvi
index 56af83a1b15..3a01b219a65 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/publ-imp-cite.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/publ-imp-cite.mkvi
@@ -168,6 +168,12 @@
\fastsetup{\s!btx:\s!cite:righttext}
\stopsetups
+\startsetups \s!btx:\s!cite:footnote
+ \startfootnote
+ \fastsetup{btx:cite:entry}
+ \stopfootnote
+\stopsetups
+
% these three are goodies to get something but are not set up as it makes no
% sense to have something root for combinations like this (esp not because one
% gets default anyway
diff --git a/Master/texmf-dist/tex/context/base/mkiv/publ-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/publ-ini.lua
index f62352f07f0..da6c74b2e46 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/publ-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/publ-ini.lua
@@ -43,7 +43,7 @@ local trace = false trackers.register("publications",
local trace_cite = false trackers.register("publications.cite", function(v) trace_cite = v end)
local trace_missing = false trackers.register("publications.cite.missing", function(v) trace_missing = v end)
local trace_references = false trackers.register("publications.cite.references", function(v) trace_references = v end)
-local trace_detail = false trackers.register("publications.detail", function(v) trace_detail = v end)
+local trace_details = false trackers.register("publications.details", function(v) trace_details = v end)
local trace_suffixes = false trackers.register("publications.suffixes", function(v) trace_suffixes = v end)
publications = publications or { }
@@ -456,7 +456,7 @@ do
end
end
end
- if trace_detail then
+ if trace_details then
report("%s unique references, %s reused entries",nofunique,nofreused)
end
initialize = nil
@@ -502,13 +502,18 @@ local findallused do
local luadata = current.luadata
local details = current.details
local ordered = current.ordered
- if allused then
+ if allused then -- always true
local registered = { }
local function register(tag)
local entry = forcethem and luadata[tag]
if entry then
if registered[tag] then
+ if trace_cite then
+ report_cite("dataset: %s, tag: %s, state: %s",dataset,tag,"already cited (1)")
+ end
return
+ elseif trace_cite then
+ report_cite("dataset: %s, tag: %s, state: %s",dataset,tag,"okay")
end
okay[#okay+1] = entry
-- todo[tag] = true
@@ -516,6 +521,9 @@ local findallused do
return tag
end
entry = allused[tag]
+ if trace_cite then
+ report_cite("dataset: %s, tag: %s, used: % t",dataset,tag,table.sortedkeys(allused))
+ end
if not entry then
local parent = details[tag].parent
if parent then
@@ -524,9 +532,16 @@ local findallused do
if entry then
report("using reference of parent %a for %a",parent,tag)
tag = parent
+ elseif trace_cite then
+ report_cite("dataset: %s, tag: %s, state: %s",dataset,tag,"not used")
end
+ elseif trace_cite then
+ report_cite("dataset: %s, tag: %s, state: %s",dataset,tag,"used")
end
if registered[tag] then
+ if trace_cite then
+ report_cite("dataset: %s, tag: %s, state: %s",dataset,tag,"already cited (2)")
+ end
return
end
if entry then
@@ -564,7 +579,17 @@ local findallused do
entry = entry[1]
end
end
+ if not entry then
+ report_cite("dataset: %s, tag: %s, state: %s",dataset,tag,"no entry (1)")
+ elseif trace_cite then
+ report_cite("dataset: %s, tag: %s, state: %s",dataset,tag,"new entry")
+ end
okay[#okay+1] = entry
+ elseif not entry then
+ if trace_cite then
+ report_cite("dataset: %s, tag: %s, state: %s",dataset,tag,"no entry (2)")
+ end
+ -- okay[#okay+1] = luadata[tag]
end
todo[tag] = true
registered[tag] = true
@@ -670,7 +695,7 @@ end
local function unknowncite(reference)
ctx_btxsettag(reference)
- if trace_detail then
+ if trace_details then
report("expanding %a cite setup %a","unknown","unknown")
end
ctx_btxcitesetup("unknown")
@@ -693,7 +718,7 @@ local function marknocite(dataset,tag,nofcitations,setup)
ctx_btxsetdataset(dataset)
ctx_btxsettag(tag)
ctx_btxsetbacklink(nofcitations)
- if trace_detail then
+ if trace_details then
report("expanding cite setup %a",setup)
end
ctx_btxcitesetup(setup)
@@ -1453,10 +1478,10 @@ do
local name, value = found(dataset,tag,field,valid,fields)
if value then
typesetters[currentspecification.types[name]](field,value,manipulator)
- elseif trace_detail then
+ elseif trace_details then
report("%s %s %a in category %a for tag %a in dataset %a","unknown","entry",field,category,tag,name)
end
- elseif trace_detail then
+ elseif trace_details then
report("%s %s %a in category %a for tag %a in dataset %a","invalid","entry",field,category,tag,name)
end
else
@@ -1478,10 +1503,10 @@ do
local value = fields[field]
if value then
typesetters[currentspecification.types[field]](field,value,manipulator)
- elseif trace_detail then
+ elseif trace_details then
report("%s %s %a in category %a for tag %a in dataset %a","unknown","field",field,category,tag,name)
end
- elseif trace_detail then
+ elseif trace_details then
report("%s %s %a in category %a for tag %a in dataset %a","invalid","field",field,category,tag,name)
end
else
@@ -1505,10 +1530,10 @@ do
local value = details[field]
if value then
typesetters[currentspecification.types[field]](field,value,manipulator)
- elseif trace_detail then
+ elseif trace_details then
report("%s %s %a in category %a for tag %a in dataset %a","unknown","detail",field,category,tag,name)
end
- elseif trace_detail then
+ elseif trace_details then
report("%s %s %a in category %a for tag %a in dataset %a","invalid","detail",field,category,tag,name)
end
else
@@ -1531,7 +1556,7 @@ do
local value = fields[field]
if value then
context(typesetters.default(field,value,manipulator))
- elseif trace_detail then
+ elseif trace_details then
report("field %a of tag %a in dataset %a has no value",field,tag,name)
end
else
@@ -1590,6 +1615,8 @@ end
do
local patterns = {
+ CONTEXTLMTXMODE > 0 and "symb-imp-%s.mklx" or "",
+ CONTEXTLMTXMODE > 0 and "symb-imp-%s.mkxl" or "",
"publ-imp-%s.mkvi",
"publ-imp-%s.mkiv",
"publ-imp-%s.tex",
@@ -1600,7 +1627,7 @@ do
end
local function action(name,foundname)
- context.input(foundname)
+ context.loadfoundpublicationfile(name,foundname)
end
function publications.loaddefinitionfile(name) -- a more specific name
@@ -1712,7 +1739,6 @@ do
end
end
-
-- tag | listindex | reference | userdata | dataindex
local methods = { }
@@ -1794,7 +1820,7 @@ do
if traced then
local l = traced[tag]
if l then
- l[#l+1] = u.btxint
+ l[#l+1] = u.btxint -- tonumber ?
else
local data = luadata[tag]
local l = { tag, listindex, 0, u, data and data.index or 0 }
@@ -2034,7 +2060,7 @@ do
ctx_btxsetlastinternal(last[2].internal)
ctx_btxsetlastpage(last[1])
end
- if trace_detail then
+ if trace_details then
report("expanding page setup")
end
ctx_btxpagesetup("") -- nothing yet
@@ -2100,12 +2126,12 @@ do
local prealpage = plist.references.realpage
if crealpage ~= prealpage then
if method == v_always or not conditionals.layoutisdoublesided then
- if trace_detail then
+ if trace_details then
report("previous %a, current %a, different page",previous,current)
end
return false
elseif crealpage % 2 == 0 then
- if trace_detail then
+ if trace_details then
report("previous %a, current %a, different page",previous,current)
end
return false
@@ -2125,7 +2151,7 @@ do
sameentry = identical(c_casted,p_casted)
end
end
- if trace_detail then
+ if trace_details then
if sameentry then
report("previous %a, current %a, same entry",previous,current)
else
@@ -2736,7 +2762,7 @@ do
ctx_btxsetfirst("") -- (f_missing(tag))
end
ctx_btxsetconcat(concatstate(i,n))
- if trace_detail then
+ if trace_details then
report("expanding cite setup %a",setup)
end
ctx_btxcitesetup(setup)
@@ -3193,7 +3219,7 @@ do
end
end
ctx_btxsetconcat(concatstate(i,nofcollected))
- if trace_detail then
+ if trace_details then
report("expanding %a cite setup %a","multiple author",setup)
end
ctx_btxsubcitesetup(setup)
@@ -3212,7 +3238,7 @@ do
if suffix then
ctx_btxsetsuffix(entry.suffix)
end
- if trace_detail then
+ if trace_details then
report("expanding %a cite setup %a","single author",setup)
end
ctx_btxcitesetup(setup)
@@ -3384,7 +3410,7 @@ do
function listvariants.default(dataset,block,tag,variant)
ctx_btxsetfirst("?")
- if trace_detail then
+ if trace_details then
report("expanding %a list setup %a","default",variant)
end
ctx_btxnumberingsetup("default")
@@ -3392,7 +3418,7 @@ do
function listvariants.num(dataset,block,tag,variant,listindex)
ctx_btxsetfirst(listindex)
- if trace_detail then
+ if trace_details then
report("expanding %a list setup %a","num",variant)
end
ctx_btxnumberingsetup(variant or "num")
@@ -3403,7 +3429,7 @@ do
function listvariants.index(dataset,block,tag,variant,listindex)
local index = getdetail(dataset,tag,"index")
ctx_btxsetfirst(index or "?")
- if trace_detail then
+ if trace_details then
report("expanding %a list setup %a","index",variant)
end
ctx_btxnumberingsetup(variant or "index")
@@ -3411,7 +3437,7 @@ do
function listvariants.tag(dataset,block,tag,variant,listindex)
ctx_btxsetfirst(tag)
- if trace_detail then
+ if trace_details then
report("expanding %a list setup %a","tag",variant)
end
ctx_btxnumberingsetup(variant or "tag")
@@ -3426,7 +3452,7 @@ do
if suffix then
ctx_btxsetsuffix(suffix)
end
- if trace_detail then
+ if trace_details then
report("expanding %a list setup %a","short",variant)
end
ctx_btxnumberingsetup(variant or "short")
diff --git a/Master/texmf-dist/tex/context/base/mkiv/publ-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/publ-ini.mkiv
index ead46929d44..996b6d3cab7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/publ-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/publ-ini.mkiv
@@ -122,6 +122,9 @@
{\pop_macro_currentbtxspecification
\protect}
+\unexpanded\def\loadfoundpublicationfile#1#2% name foundname / not a user command
+ {\input{#2}}
+
\unexpanded\def\loadbtxdefinitionfile [#1]{\clf_btxloaddefinitionfile {#1}}
\unexpanded\def\loadbtxreplacementfile[#1]{\clf_btxloadreplacementfile{#1}}
@@ -1080,7 +1083,7 @@
\relax}
\unexpanded\def\btx_reference_checked
- {\dontleavehmode\hbox\bgroup
+ {\dontleavehmode\hbox\bgroup % \hpack
\btx_reference_indeed
\egroup}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/publ-tra.lua b/Master/texmf-dist/tex/context/base/mkiv/publ-tra.lua
index 81bbc2fd375..80dd143d0bf 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/publ-tra.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/publ-tra.lua
@@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['publ-tra'] = {
-- todo: use context.tt .. more efficient, less code
-local next, type = next, type
+local next, type, rawget = next, type, rawget
local sortedhash = table.sortedhash
local sortedkeys = table.sortedkeys
diff --git a/Master/texmf-dist/tex/context/base/mkiv/regi-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/regi-ini.lua
index 7691e876510..8d4f2bfd5a1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/regi-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/regi-ini.lua
@@ -16,9 +16,11 @@ runtime.</p>
local commands, context = commands, context
+
+local tostring = tostring
local utfchar = utf.char
local P, Cs, Cc, lpegmatch = lpeg.P, lpeg.Cs, lpeg.Cc, lpeg.match
-local char, gsub, format, gmatch, byte, match = string.char, string.gsub, string.format, string.gmatch, string.byte, string.match
+local char, gsub, format, gmatch, byte, match, lower = string.char, string.gsub, string.format, string.gmatch, string.byte, string.match, string.lower
local next = next
local insert, remove, fastcopy = table.insert, table.remove, table.fastcopy
local concat = table.concat
@@ -103,11 +105,14 @@ local synonyms = { -- backward compatibility list
["pdf"] = "pdfdoc",
+ ["437"] = "ibm",
}
local currentregime = "utf"
local function loadregime(mapping,regime)
+ regime = lower(tostring(regime))
+ regime = synonyms[regime] or synonyms["windows-"..regime] or regime
local name = resolvers.findfile(format("regi-%s.lua",regime)) or ""
local data = name ~= "" and dofile(name)
if data then
@@ -126,8 +131,11 @@ end
local function loadreverse(t,k)
local t = { }
- for k, v in next, mapping[k] do
- t[v] = k
+ local m = mapping[k]
+ if m then
+ for k, v in next, m do
+ t[v] = k
+ end
end
backmapping[k] = t
return t
@@ -141,7 +149,8 @@ regimes.backmapping = backmapping
local function fromregime(regime,line)
if line and #line > 0 then
- local map = mapping[regime and synonyms[regime] or regime or currentregime]
+-- local map = mapping[regime and synonyms[regime] or regime or currentregime]
+ local map = mapping[regime or currentregime]
if map then
line = gsub(line,".",map)
end
@@ -459,3 +468,21 @@ if interfaces then
}
end
+
+-- Actually we can have a function returned from the lookup but we don't
+-- really use this code so I'm in no hurry.
+
+-- if os.getcodepage then
+-- local cod, acp, map
+-- function os.tocodepage(name)
+-- if map == nil then
+-- cod, acp = os.getcodepage()
+-- map = cod and cod ~= 65001 and regimes.toregime
+-- end
+-- return map and map(cod,name) or name
+-- end
+-- else
+-- function os.tocodepage(name)
+-- return name
+-- end
+-- end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/regi-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/regi-ini.mkiv
index 532a4db0bfc..0cd9cf89d44 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/regi-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/regi-ini.mkiv
@@ -30,4 +30,8 @@
\unexpanded\def\startregime [#1]{\clf_startregime{#1}}
\unexpanded\def\stopregime {\clf_stopregime}
+% only for diagnostics:
+
+% \def\codepagename#1{\cldcontext{os.tocodepage("#1")}}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/scrn-bar.mkvi b/Master/texmf-dist/tex/context/base/mkiv/scrn-bar.mkvi
index 0c320cd03bf..c089eb94576 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/scrn-bar.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/scrn-bar.mkvi
@@ -129,7 +129,7 @@
\setupcurrentinteractionbar[#settings]%
\d_scrn_bar_width \interactionbarparameter\c!width\relax
\d_scrn_bar_distance\interactionbarparameter\c!distance\relax
- \ifdim\d_scrn_bar_width=\zeropoint
+ \ifzeropt\d_scrn_bar_width
\d_scrn_bar_width1.5\emwidth
\fi
\doifnothing{\interactionbarparameter\c!height}{\letinteractionbarparameter\c!height\v!broad}%
@@ -145,7 +145,7 @@
[ \v!page=>\advance\scratchcounterone\plusfour,
\v!subpage=>\advance\scratchcounterone\plusfour,
\s!unknown=>\advance\scratchcounterone\plusone]%
- \ifdim\d_scrn_bar_width=\zeropoint
+ \ifzeropt\d_scrn_bar_width
\scratchdimenone\dimexpr2\emwidth+\d_scrn_bar_distance\relax
\scratchdimentwo\dimexpr\scratchcounterone\scratchdimenone-\d_scrn_bar_distance\relax
\else
diff --git a/Master/texmf-dist/tex/context/base/mkiv/scrn-but.mkvi b/Master/texmf-dist/tex/context/base/mkiv/scrn-but.mkvi
index 87af29cfb9d..0c9b4cfb51b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/scrn-but.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/scrn-but.mkvi
@@ -455,10 +455,10 @@
\dp\b_scrn_menu\zeropoint}
\def\scrn_menu_apply_used
- {\ifdim\d_scrn_menu_offset_left=\zeropoint \else
+ {\ifzeropt\d_scrn_menu_offset_left \else
\setbox\b_scrn_menu\hbox{\hskip-\d_scrn_menu_offset_left \box\b_scrn_menu}%
\fi
- \ifdim\d_scrn_menu_offset_bottom=\zeropoint \else
+ \ifzeropt\d_scrn_menu_offset_bottom \else
\setbox\b_scrn_menu\hbox{\lower \d_scrn_menu_offset_bottom \box\b_scrn_menu}%
\fi
\wd\b_scrn_menu\d_scrn_menu_asked_width
diff --git a/Master/texmf-dist/tex/context/base/mkiv/scrn-wid.lua b/Master/texmf-dist/tex/context/base/mkiv/scrn-wid.lua
index 5b70bec7556..17c9ebddc4a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/scrn-wid.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/scrn-wid.lua
@@ -143,6 +143,7 @@ implement {
{ "file" },
{ "name" },
{ "buffer" },
+ { "mimetype" },
}
}
}
@@ -172,6 +173,7 @@ implement {
{ "file" },
{ "name" },
{ "buffer" },
+ { "mimetype" },
}
}
}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/scrn-wid.mkvi b/Master/texmf-dist/tex/context/base/mkiv/scrn-wid.mkvi
index d1571ca656d..6808bd0b3e4 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/scrn-wid.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/scrn-wid.mkvi
@@ -25,6 +25,8 @@
%D As usual in \CONTEXT\ we separate the general definition (frontend)
%D and the rendering (backend).
+% hack: x\footnote{x\inleftmargin[scope=local]{\attachment[location=high,file=i-context.pdf]}}x
+
% old but stil valid method:
%
% \useattachment[test.tex]
@@ -109,6 +111,7 @@
file {\attachmentparameter\c!file}%
name {\attachmentparameter\c!name}%
buffer {\attachmentparameter\c!buffer}%
+ mimetype {\attachmentparameter\c!type}%
\relax
\endgroup
\else
@@ -211,6 +214,7 @@
file {\attachmentparameter\c!file}%
name {\attachmentparameter\c!name}%
buffer {\attachmentparameter\c!buffer}%
+ mimetype {\attachmentparameter\c!type}%
\relax
\wd\b_scrn_attachment_link\currentattachmentwidth
\ht\b_scrn_attachment_link\currentattachmentheight
@@ -228,6 +232,7 @@
file {\attachmentparameter\c!file}%
name {\attachmentparameter\c!name}%
buffer {\attachmentparameter\c!buffer}%
+ mimetype {\attachmentparameter\c!type}%
\relax}
\unexpanded\def\scrn_attachment_flush_traced
diff --git a/Master/texmf-dist/tex/context/base/mkiv/scrp-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/scrp-ini.lua
index e6aa5f0720c..3d3aa44066e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/scrp-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/scrp-ini.lua
@@ -11,10 +11,10 @@ if not modules then modules = { } end modules ['scrp-ini'] = {
local tonumber, next = tonumber, next
-local trace_analyzing = false trackers.register("scripts.analyzing", function(v) trace_analyzing = v end)
-local trace_injections = false trackers.register("scripts.injections", function(v) trace_injections = v end)
-local trace_splitting = false trackers.register("scripts.splitting", function(v) trace_splitting = v end)
-local trace_splitdetail = false trackers.register("scripts.splitting.detail", function(v) trace_splitdetail = v end)
+local trace_analyzing = false trackers.register("scripts.analyzing", function(v) trace_analyzing = v end)
+local trace_injections = false trackers.register("scripts.injections", function(v) trace_injections = v end)
+local trace_splitting = false trackers.register("scripts.splitting", function(v) trace_splitting = v end)
+local trace_splitdetails = false trackers.register("scripts.splitting.details", function(v) trace_splitdetails = v end)
local report_preprocessing = logs.reporter("scripts","preprocessing")
local report_splitting = logs.reporter("scripts","splitting")
@@ -57,8 +57,11 @@ local getnext = nuts.getnext
local getchar = nuts.getchar
local getfont = nuts.getfont
local getid = nuts.getid
+local getglyphdata = nuts.getglyphdata
+
local getattr = nuts.getattr
local setattr = nuts.setattr
+
local isglyph = nuts.isglyph
local insert_node_after = nuts.insert_after
@@ -767,7 +770,7 @@ function splitters.handler(head) -- todo: also first_glyph test
if not nextchar then
-- we're done
elseif tree[nextchar] then
- if trace_splitdetail then
+ if trace_splitdetails then
if type(final) == "string" then
report_splitting("advance %s processing between <%s> and <%c>","with",final,nextchar)
else
@@ -776,7 +779,7 @@ function splitters.handler(head) -- todo: also first_glyph test
end
head, current = proc(handler,head,current,last,1)
else
- if trace_splitdetail then
+ if trace_splitdetails then
-- could be punctuation
if type(final) == "string" then
report_splitting("advance %s processing between <%s> and <%c>","without",final,nextchar)
@@ -894,7 +897,7 @@ function autofontfeature.handler(head)
-- else
local script = otfscripts[char]
if script then
- local dynamic = getattr(n,0) or 0
+ local dynamic = getglyphdata(n) or 0
if dynamic > 0 then
local slot = cache_yes[font]
local attr = slot[script]
diff --git a/Master/texmf-dist/tex/context/base/mkiv/spac-ali.lua b/Master/texmf-dist/tex/context/base/mkiv/spac-ali.lua
index b58040ac72a..c30a4fa942d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/spac-ali.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/spac-ali.lua
@@ -24,11 +24,14 @@ local getid = nuts.getid
local getlist = nuts.getlist
local setlist = nuts.setlist
local setlink = nuts.setlink
+local getdirection = nuts.getdirection
local takeattr = nuts.takeattr
local getsubtype = nuts.getsubtype
local getwidth = nuts.getwidth
local findtail = nuts.tail
+local righttoleft_code = nodes.dirvalues.righttoleft
+
local hpack_nodes = nuts.hpack
local unsetvalue = attributes.unsetvalue
@@ -85,17 +88,28 @@ local function handler(head,leftpage,realpageno) -- traverse_list
elseif align == 2 then -- flushleft
action = leftpage and 2 or 1
end
+ -- WS: watch this
+ local direction = getdirection(current)
+ -- or should this happen at the tex end:
+ if direction == righttoleft_code then
+ if action == 1 then
+ action = 2
+ elseif action == 2 then
+ action = 1
+ end
+ end
+ --
if action == 1 then
local head = getlist(current)
setlink(findtail(head),new_stretch(3)) -- append
- setlist(current,hpack_nodes(head,getwidth(current),"exactly"))
+ setlist(current,hpack_nodes(head,getwidth(current),"exactly",direction))
if trace_realign then
report_realign("flushing left, align %a, page %a, realpage %a",align,pageno,realpageno)
end
elseif action == 2 then
local list = getlist(current)
local head = setlink(new_stretch(3),list) -- prepend
- setlist(current,hpack_nodes(head,getwidth(current),"exactly"))
+ setlist(current,hpack_nodes(head,getwidth(current),"exactly",direction))
if trace_realign then
report_realign("flushing right. align %a, page %a, realpage %a",align,pageno,realpageno)
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/spac-ali.mkiv b/Master/texmf-dist/tex/context/base/mkiv/spac-ali.mkiv
index 4362ff25002..8451e2494f9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/spac-ali.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/spac-ali.mkiv
@@ -203,7 +203,7 @@
% oeps, hsize can be 0pt in which case we get a strange division
% was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{}
-\def\spac_align_set_raggedness_middle{\ifdim\hsize=\zeropoint\plussix\bodyfontsize\else.5\hsize\fi}
+\def\spac_align_set_raggedness_middle{\ifzeropt\hsize\plussix\bodyfontsize\else.5\hsize\fi}
\unexpanded\def\setraggedness#1% tricky .. we keep the global tolerance otherwise ... to be reconsidered
{\ifnum\tolerance<\c_spac_tolerance_minimum
@@ -691,8 +691,8 @@
\c_spac_align_state_horizontal\zerocount}
\setvalue{\??aligncommand\v!inner }{\c_spac_align_state_horizontal\plusfour }
\setvalue{\??aligncommand\v!outer }{\c_spac_align_state_horizontal\plusfive }
-\setvalue{\??aligncommand\v!flushinner }{\c_spac_align_state_horizontal\plusfive }
-\setvalue{\??aligncommand\v!flushouter }{\c_spac_align_state_horizontal\plusfour }
+\setvalue{\??aligncommand\v!flushinner }{\c_spac_align_state_horizontal\plusfour }
+\setvalue{\??aligncommand\v!flushouter }{\c_spac_align_state_horizontal\plusfive }
\setvalue{\??aligncommand\v!right }{\c_spac_align_state_horizontal\plustwo }
\setvalue{\??aligncommand\v!left }{\c_spac_align_state_horizontal\plusthree}
\setvalue{\??aligncommand\v!center }{\c_spac_align_state_horizontal\plusone
@@ -702,7 +702,6 @@
\setvalue{\??aligncommand\v!end }{\c_spac_align_state_horizontal\pluseight}
\setvalue{\??aligncommand\v!paragraph }{\c_spac_align_state_horizontal\plusnine}
-
\setvalue{\??aligncommand\v!lefttoright }{\c_spac_align_state_direction \plusone }
\setvalue{\??aligncommand\v!righttoleft }{\c_spac_align_state_direction \plustwo }
\setvalue{\??aligncommand l2r}{\c_spac_align_state_direction \plusone }
@@ -716,6 +715,7 @@
\setvalue{\??aligncommand\v!morehyphenation}{\toksapp\t_spac_align_collected{\morehyphens}}
\setvalue{\??aligncommand\v!hanging }{\toksapp\t_spac_align_collected{\font_protruding_enable }}
+\setvalue{\??aligncommand\v!hangingboth }{\toksapp\t_spac_align_collected{\font_protruding_enable_b}}
\setvalue{\??aligncommand\v!nothanging }{\toksapp\t_spac_align_collected{\font_protruding_disable}}
\setvalue{\??aligncommand\v!hz }{\toksapp\t_spac_align_collected{\font_expansion_enable }}
\setvalue{\??aligncommand\v!fullhz }{\toksapp\t_spac_align_collected{\font_expansion_enable_k}}
@@ -1153,26 +1153,6 @@
\letvalue{\??alignsimplereverse\v!flushright}\spac_align_simple_left
\letvalue{\??alignsimplereverse\v!middle }\spac_align_simple_middle
-% \unexpanded\def\simplealignedbox#1#2%
-% {\hbox \ifdim#1>\zeropoint to #1
-% \csname\??alignsimple\ifcsname\??alignsimple#2\endcsname#2\else\v!right\fi\expandafter\endcsname
-% \fi}
-
-% \unexpanded\def\simplealignedboxplus#1#2#3%
-% {\hbox #3 \ifdim#1>\zeropoint to #1
-% \csname\??alignsimple\ifcsname\??alignsimple#2\endcsname#2\else\v!right\fi\expandafter\endcsname
-% \fi}
-
-% \unexpanded\def\simplealignedbox#1#2%
-% {\hbox \ifdim#1>\zeropoint to #1
-% \csname\??alignsimple\ifcsname\??alignsimple#2\endcsname#2\else\v!right\fi\expandafter\endcsname
-% \fi}
-%
-% \unexpanded\def\simplealignedboxplus#1#2#3%
-% {\hbox #3 \ifdim#1>\zeropoint to #1
-% \csname\??alignsimple\ifcsname\??alignsimple#2\endcsname#2\else\v!right\fi\expandafter\endcsname
-% \fi}
-
\unexpanded\def\simplealignedbox#1#2%
{\hbox \ifdim#1>\zeropoint to #1
\ifcsname\??alignsimple#2\endcsname
@@ -1202,16 +1182,6 @@
\newconditional\alignsimplelefttoright \settrue\alignsimplelefttoright
-% \unexpanded\def\simplereversealignedbox#1#2%
-% {\hbox \ifdim#1>\zeropoint to #1
-% \csname\??alignsimplereverse\ifcsname\??alignsimplereverse#2\endcsname#2\else\v!left\fi\expandafter\endcsname
-% \fi}
-%
-% \unexpanded\def\simplereversealignedboxplus#1#2#3%
-% {\hbox #3 \ifdim#1>\zeropoint to #1
-% \csname\??alignsimplereverse\ifcsname\??alignsimplereverse#2\endcsname#2\else\v!left\fi\expandafter\endcsname
-% \fi}
-
\unexpanded\def\simplereversealignedbox#1#2%
{\hbox \ifdim#1>\zeropoint to #1
\ifcsname\??alignsimplereverse#2\endcsname
@@ -1253,5 +1223,17 @@
\def\spac_align_definehbox[#1][#2]%
{\setvalue{hbox#1}##1{\hbox to #2{\begstrut##1\endstrut\hss}}}
+%D Some direction related helpers:
+
+\installcorenamespace {reverse}
+
+\setvalue{\??reverse\v!normal }{\ifconditional\inlinelefttoright\else\s!reverse\fi}
+\setvalue{\??reverse\v!reverse}{\ifconditional\inlinelefttoright \s!reverse\fi}
+
+\ifcase\contextlmtxmode
+ \let\usedirectionparameterreverse\gobbleoneargument
+\else
+ \def\usedirectionparameterreverse#1{\begincsname\??reverse#1\c!direction\endcsname}
+\fi
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/spac-chr.lua b/Master/texmf-dist/tex/context/base/mkiv/spac-chr.lua
index 23cf9741b14..9b8453ca690 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/spac-chr.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/spac-chr.lua
@@ -27,6 +27,7 @@ local nodes, node = nodes, node
local nuts = nodes.nuts
+local getboth = nuts.getboth
local getnext = nuts.getnext
local getprev = nuts.getprev
local getattr = nuts.getattr
@@ -131,11 +132,10 @@ local function nbsp(head,current)
local para = fontparameters[getfont(current)]
if getattr(current,a_alignstate) == 1 then -- flushright
head, current = inject_nobreak_space(0x00A0,head,current,para.space,0,0)
- setsubtype(current,spaceskip_code)
else
head, current = inject_nobreak_space(0x00A0,head,current,para.space,para.spacestretch,para.spaceshrink)
- setsubtype(current,spaceskip_code)
end
+ setsubtype(current,spaceskip_code)
return head, current
end
@@ -199,7 +199,7 @@ local methods = {
end,
[0x00A0] = function(head,current) -- nbsp
- local next = getnext(current)
+ local prev, next = getboth(current)
if next then
local char = isglyph(current)
if not char then
@@ -216,7 +216,6 @@ local methods = {
return false
end
end
- local prev = getprev(current)
if prev then
local char = isglyph(prev)
if char and nbsphash[char] then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/spac-flr.mkiv b/Master/texmf-dist/tex/context/base/mkiv/spac-flr.mkiv
index bd50bfea68b..4c3c0c0421f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/spac-flr.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/spac-flr.mkiv
@@ -47,14 +47,14 @@
\edef\currentfiller{#1}%
\usefillerstyleandcolor\c!style\c!color
\scratchdimen\fillerparameter\c!leftmargin\relax
- \ifdim\scratchdimen=\zeropoint\else
+ \ifzeropt\scratchdimen\else
\hskip\scratchdimen
\fi
\fillerparameter\c!left\relax
\expandnamespaceparameter\??filleralternative\fillerparameter\c!alternative\s!unknown\relax
\fillerparameter\c!right\relax
\scratchdimen\fillerparameter\c!rightmargin\relax
- \ifdim\scratchdimen=\zeropoint\else
+ \ifzeropt\scratchdimen\else
\hskip\scratchdimen
\fi
\endgroup
@@ -80,7 +80,7 @@
\begingroup
\edef\currentfiller{#1}%
\scratchdimen\dimexpr\fillerparameter\c!rightmargindistance\relax
- \ifdim\scratchdimen=\zeropoint\else
+ \ifzeropt\scratchdimen\else
\parfillskip \scratchdimen\s!plus \plusone\s!fil\relax
\fi
\spac_fillers_indeed[#1]%
diff --git a/Master/texmf-dist/tex/context/base/mkiv/spac-hor.mkiv b/Master/texmf-dist/tex/context/base/mkiv/spac-hor.mkiv
index 24c7c789341..0f65eea3310 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/spac-hor.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/spac-hor.mkiv
@@ -38,8 +38,14 @@
\unexpanded\def\setupindenting
{\doifelsenextoptionalcs\spac_indentation_setup_options\spac_indentation_setup_size}
+% \unexpanded\def\spac_indentation_setup_size
+% {\assigndimension\v_spac_indentation_current\d_spac_indentation_par{1\emwidth}{1.5\emwidth}{2\emwidth}}
+
\unexpanded\def\spac_indentation_setup_size
- {\assigndimension\v_spac_indentation_current\d_spac_indentation_par{1\emwidth}{1.5\emwidth}{2\emwidth}}
+ {\assigndimension\v_spac_indentation_current\d_spac_indentation_par{1\emwidth}{1.5\emwidth}{2\emwidth}%
+ \ifzeropt\parindent\else
+ \parindent\d_spac_indentation_par\relax % new per 2019-04-12 : just in case it has been set beforehand
+ \fi}
\let\synchronizeindenting\spac_indentation_setup_size
@@ -60,7 +66,9 @@
\ifzeropt\parindent\else
\doifemptytoks\everypar\spac_indentation_set_everypar
\fi
- \ifconditional\c_spac_indentation_indent_first\else
+ \ifconditional\c_spac_indentation_indent_first
+ \spac_indentation_variant_yes % better than: \let\checkindentation\relax
+ \else
\spac_indentation_variant_no
\fi
\spac_indentation_check_toggle}
@@ -191,7 +199,7 @@
\parindent\zeropoint
\c_spac_indentation_toggle_state\zerocount}
-\installindentingmethod \v!toggle{\parindent\ifdim\parindent=\zeropoint
+\installindentingmethod \v!toggle{\parindent\ifzeropt\parindent
\d_spac_indentation_par
\else
\zeropoint
@@ -210,7 +218,7 @@
\installmacrostack\ifindentation
\def\spac_indentation_remove
- {\ifdim\parindent=\zeropoint \else
+ {\ifzeropt\parindent \else
\begingroup
\setbox\scratchbox\lastbox
\endgroup
@@ -267,7 +275,7 @@
\fi}
\def\spac_indentation_variant_force
- {\ifvmode \ifdim\parindent=\zeropoint \else
+ {\ifvmode \ifzeropt\parindent \else
% was : \hskip\parindent
% can be: \indent
% but we test:
@@ -839,7 +847,7 @@
\letvalue{\??skipadaptionright\v!no }\zeropoint
\letvalue{\??skipadaptionright\empty }\zeropoint
-% \setvalue{\??skipadaptionleft \v!standard}{\ifdim\d_spac_indentation_par=\zeropoint\narrowerparameter\c!left\else\d_spac_indentation_par\fi}
+% \setvalue{\??skipadaptionleft \v!standard}{\ifzeropt\d_spac_indentation_par\narrowerparameter\c!left\else\d_spac_indentation_par\fi}
% \setvalue{\??skipadaptionright\v!standard}{\narrowerparameter\c!right}
\letcsnamecsname\csname\??skipadaptionleft \v!standard\endcsname\csname\??skipadaptionleft \v!yes\endcsname
@@ -1253,7 +1261,7 @@
\advance\c_spac_ignore_spaces\minusone}
\def\spac_ignore_spaces_body
- {\ifdim\lastskip=\zeropoint
+ {\ifzeropt\lastskip
\exitloop
\else\ifdim\lastskip=\s_spac_ignore_spaces
\unskip
@@ -1267,4 +1275,13 @@
\def\obeyfollowingtoken{{}} % end \cs scanning
+%D Something new:
+
+\unexpanded\def\interwordspacebefore{\wordboundary\zwnj\hskip\interwordspace\relax}
+\unexpanded\def\interwordspaceafter {\hskip\interwordspace\relax\zwnj\wordboundary}
+
+\unexpanded\def\interwordspacesbefore#1{\dofastloopcs{#1}\interwordspacebefore}
+\unexpanded\def\interwordspacesafter #1{\dofastloopcs{#1}\interwordspaceafter}
+\unexpanded\def\interwordspaces #1{\wordboundary\zwnj\dofastloopcs{\numexpr#1+\minusone}\interwordspaceafter}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/spac-par.mkiv b/Master/texmf-dist/tex/context/base/mkiv/spac-par.mkiv
index 0932b735989..7678cc34bdd 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/spac-par.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/spac-par.mkiv
@@ -218,7 +218,7 @@
{\begingroup
\the\everyflushatnextpar
\glet\flushpostponednodedata\spac_postponed_data_flush
- \dowithnextboxcs\spac_postponed_data_finish\hbox}
+ \dowithnextboxcs\spac_postponed_data_finish\hpack}
\def\spac_postponed_data_finish
{\global\setbox\b_spac_postponed_data\hpack % to\zeropoint
diff --git a/Master/texmf-dist/tex/context/base/mkiv/spac-prf.lua b/Master/texmf-dist/tex/context/base/mkiv/spac-prf.lua
index 32582c56fc5..049e62ac569 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/spac-prf.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/spac-prf.lua
@@ -45,7 +45,7 @@ local nuts = nodes.nuts
local tonut = nodes.tonut
local tonode = nuts.tonode
-local getfield = nuts.getfield
+local getreplace = nuts.getreplace
local getattr = nuts.getattr
local getid = nuts.getid
local getnext = nuts.getnext
@@ -185,7 +185,7 @@ local function getprofile(line,step)
dp = 0
progress()
elseif id == disc_code then
- local replace = getfield(current,"replace")
+ local replace = getreplace(current)
if replace then
process(replace)
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/spac-ver.lua b/Master/texmf-dist/tex/context/base/mkiv/spac-ver.lua
index b55f1ca7cae..33b81e5c7e8 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/spac-ver.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/spac-ver.lua
@@ -153,6 +153,7 @@ local remove_node = nuts.remove
local count_nodes = nuts.countall
local hpack_node = nuts.hpack
local vpack_node = nuts.vpack
+local start_of_par = nuts.start_of_par
local nextnode = nuts.traversers.node
local nexthlist = nuts.traversers.hlist
@@ -168,6 +169,7 @@ local nodepool = nuts.pool
local new_penalty = nodepool.penalty
local new_kern = nodepool.kern
+local new_glue = nodepool.glue
local new_rule = nodepool.rule
local nodecodes = nodes.nodecodes
@@ -290,7 +292,7 @@ end
local function validvbox(parentid,list)
if parentid == hlist_code then
local id = getid(list)
- if id == localpar_code and getsubtype(list) == 0 then
+ if id == localpar_code and start_of_par(list) then
list = getnext(list)
if not next then
return nil
@@ -326,7 +328,7 @@ local function already_done(parentid,list,a_snapmethod) -- todo: done when only
-- problem: any snapped vbox ends up in a line
if list and parentid == hlist_code then
local id = getid(list)
- if id == localpar_code and getsubtype(list) == 0 then
+ if id == localpar_code and start_of_par(list) then
list = getnext(list)
if not list then
return false
@@ -2062,6 +2064,7 @@ end
do
local outer = texnest[0]
+
local enabled = true
local trace = false
local report = logs.reporter("vspacing")
@@ -2157,27 +2160,105 @@ do
trackers.register("vspacing.forcestrutdepth",function(v) trace = v end)
- function vspacing.forcestrutdepth(n,depth,trace_mode)
+ local last = nil
+
+ -- function vspacing.forcestrutdepth(n,depth,trace_mode,plus)
+ -- local box = texgetbox(n)
+ -- if box then
+ -- box = tonut(box)
+ -- local head = getlist(box)
+ -- if head then
+ -- local tail = find_node_tail(head)
+ -- if tail and getid(tail) == hlist_code then
+ -- local dp = getdepth(tail)
+ -- if dp < depth then
+ -- setdepth(tail,depth)
+ -- outer.prevdepth = depth
+ -- if trace or trace_mode > 0 then
+ -- nuts.setvisual(tail,"depth")
+ -- end
+ -- end
+ -- end
+ -- end
+ -- end
+ -- end
+
+ function vspacing.forcestrutdepth(n,depth,trace_mode,plus)
local box = texgetbox(n)
if box then
box = tonut(box)
local head = getlist(box)
if head then
local tail = find_node_tail(head)
- if tail and getid(tail) == hlist_code then
- local dp = getdepth(tail)
- if dp < depth then
- setdepth(tail,depth)
- outer.prevdepth = depth
- if trace or trace_mode > 0 then
- nuts.setvisual(tail,"depth")
+ if tail then
+ if getid(tail) == hlist_code then
+ local dp = getdepth(tail)
+ if dp < depth then
+ setdepth(tail,depth)
+ outer.prevdepth = depth
+ if trace or trace_mode > 0 then
+ nuts.setvisual(tail,"depth")
+ end
+ end
+ end
+ last = nil
+ if plus then
+ -- penalty / skip ...
+ local height = 0
+ local sofar = 0
+ local same = false
+ local seen = false
+ local list = { }
+ last = nil
+ while tail do
+ local id = getid(tail)
+ if id == hlist_code or id == vlist_code then
+ local w, h, d = getwhd(tail)
+ height = height + h + d + sofar
+ sofar = 0
+ last = tail
+ elseif id == kern_code then
+ sofar = sofar + getkern(tail)
+ elseif id == glue_code then
+ if seen then
+ sofar = sofar + getwidth(tail)
+ seen = false
+ else
+ break
+ end
+ elseif id == penalty_code then
+ local p = getpenalty(tail)
+ if p >= 10000 then
+ same = true
+ seen = true
+ else
+ break
+ end
+ else
+ break
+ end
+ tail = getprev(tail)
end
+ texsetdimen("global","d_spac_prevcontent",same and height or 0)
end
end
end
end
end
+ function vspacing.pushatsame()
+ -- needs better checking !
+ if last then -- setsplit
+ nuts.setnext(getprev(last))
+ nuts.setprev(last)
+ end
+ end
+
+ function vspacing.popatsame()
+ -- needs better checking !
+ nuts.write(last)
+ end
+
end
-- interface
@@ -2205,6 +2286,25 @@ do
}
implement {
+ name = "forcestrutdepthplus",
+ arguments = { "integer", "dimension", "integer", true },
+ actions = vspacing.forcestrutdepth,
+ scope = "private"
+ }
+
+ implement {
+ name = "pushatsame",
+ actions = vspacing.pushatsame,
+ scope = "private"
+ }
+
+ implement {
+ name = "popatsame",
+ actions = vspacing.popatsame,
+ scope = "private"
+ }
+
+ implement {
name = "vspacingsetamount",
actions = vspacing.setskip,
scope = "private",
diff --git a/Master/texmf-dist/tex/context/base/mkiv/spac-ver.mkiv b/Master/texmf-dist/tex/context/base/mkiv/spac-ver.mkiv
index 7b36f9a5b52..6ed1847c577 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/spac-ver.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/spac-ver.mkiv
@@ -27,8 +27,8 @@
%
% There might be more namespace protection.
-%D There are two ways to influence the interline spacing. The
-%D most general and often most consistent way is using
+%D There are two ways to influence the interline spacing. The most general and often
+%D most consistent way is using
%D
%D \showsetup{setupinterlinespace}
%D
@@ -38,23 +38,21 @@
%D \setupinterlinespace[line=2.8ex]
%D \stoptyping
%D
-%D This setting adapts itself to the bodyfontsize, while for
-%D instance saying
+%D This setting adapts itself to the bodyfontsize, while for instance saying
%D
%D \starttyping
%D \setupinterlinespace[line=12pt]
%D \stoptyping
%D
-%D sets things fixed for all sizes, which is definitely not
-%D what we want. Therefore one can also say:
+%D sets things fixed for all sizes, which is definitely not what we want. Therefore
+%D one can also say:
%D
%D \starttyping
%D \definebodyfontenvironment[9pt][interlinespace=11pt]
%D \stoptyping
%D
-%D One can still use \type{\setupinterlinespace} (without
-%D arguments) to set the interline space according to the
-%D current font, e.g. a \type{\bfa}.
+%D One can still use \type {\setupinterlinespace} (without arguments) to set the
+%D interline space according to the current font, e.g. a \type {\bfa}.
% will be cleaned up but it will stay messy because we accept so
% many variants
@@ -244,9 +242,10 @@
\newskip \s_spac_lastskip
\newdimen\d_spac_prevdepth
\newcount\c_spac_spacefactor
+\newdimen\d_spac_prevcontent % set by lua
\unexpanded\def\removelastskip
- {\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi}
+ {\ifvmode\ifzeropt\lastskip\else\vskip-\lastskip\fi\fi}
\def\doifoutervmode
{\ifvmode
@@ -264,7 +263,7 @@
{\s_spac_lastskip\lastskip
\removelastskip
#1\relax
- \ifdim\s_spac_lastskip=\zeropoint
+ \ifzeropt\s_spac_lastskip
% avoid interference with footnotes
\else
\vskip\s_spac_lastskip
@@ -628,46 +627,35 @@
\unexpanded\def\verticalstrut {\vpack{\hsize\zeropoint\forgetall\strut}}
\unexpanded\def\horizontalstrut{\hpack {\strut}}
-% Hieronder volgen enkele instellingen en macro's ten behoeve
-% van de interlinie en \strut. De waarden 2.8, 0.07, 0.72 en
-% 0.28 zijn ooit eens ontleend aan INRS-TEX en moeten wellicht
-% nog eens instelbaar worden.
-%
-% \lineheight : de hoogte van een regel
-% \spacing{getal} : instellen interlinie
-% \normalbaselines : instellen regelafstend
-%
-% \setstrut : instellen \strut
-% \setnostrut : resetten \strut, \endstrut, \begstrut
-% \setnonestrut : resetten \strut (fast one)
-%
-% \setteststrut : instellen zichtbare struts
-% \resetteststrut : instellen onzichtbare struts
-%
-% \setfontparameters : instellen na fontset
-%
-% De hoogte van een regel (\lineheight) is gelijk aan de
-% som van de hoogte (\ht) en diepte (\dp) van \strutbox.
-%
-% \strut : denkbeeldig blokje met hoogte en diepte
-%
-% Een \hbox kan als deze aan het begin van een regel staat
-% een breedte \hsize krijgen. Dit is soms te voorkomen met het
-% commando \leavevmode. Binnen een \vbox geeft dit echter
-% niet altijd het gewenste resultaat, vandaar het commando
-%
-% \dontleavehmode
-
-% Pas op: niet zomaar \topskip en \baselineskip aanpassen
-% en zeker niet \widowpenalty. Dit kan ernstige gevolgen
-% hebben voor kolommen.
-%
-% Enige glue kan op zich geen kwaad, echter als blanko=vast,
-% dan moet ook de rek 0 zijn. Binnen kolommen is rek ook
-% niet bepaald mooi. Een hele kleine waarde (0.025) voldoet,
-% omdat een positieve glue eindeloos rekbaar is.
-
-% more of the next will become private:
+%D Here follow some presets related to interline spacing and therefore also struts.
+%D The values 2.8, 0.07, 0.72 and 0.28 originate in \INRSTEX, a package that we used
+%D a while after we decided that \LATEX\ was not flexible enough. After that
+%D \CONTEXT\ evolved, from some wrapper code around (old) \LATEX\ (on a floppy
+%D disk), to using modules from \INRSTEX\ (which also fit on a floppy) and finally
+%D all written from scratch. I simply didn't understand all that \TEX\ code at that
+%D time, and it was easier to figure it out myself. But \unknown\ some settings
+%D stayed, as the height|/|depth ratios, and they never proved to be bad ones! The
+%D same is true for the font size relations.
+
+%D \starttabulate
+%D \NC \type {\lineheight} \NC the height of a line \NC \NR
+%D \NC \type {\spacing{number}} \NC adapting the interline space \NC \NR
+%D \NC \type {\normalbaselines} \NC initialize the interline spacing \NC \NR
+%D \NC \type {\setstrut} \NC initialize \type {\strut} \NC \NR
+%D \NC \type {\setnostrut} \NC disable the \type {\strut}, \type {\endstrut}, \type {\begstrut} \NC \NR
+%D \NC \type {\setteststrut} \NC initialize the visual \type {\strut} \NC \NR
+%D \NC \type {\resetteststrut} \NC disable the visual \type {\strut} \NC \NR
+%D \NC \type {\setfontparameters} \NC synchronize parameters with foints \NC \NR
+%D \stoptabulate
+%D
+%D \unknown\ and many more (this is a decades old list).
+%D
+%D The lineheight is the sum of the height and depth of \type {strut}, which is
+%D an invisible blob that can be used to enforce the proper dimensions.
+%D
+%D Such a blob, when placed at the beginning of a paragraph can have side effects
+%D that can be prevented with \type {\dontleavehmode}. Never use \type
+%D {\leavevmode}!
\newdimen\strutdimen
\newdimen\lineheight
@@ -836,13 +824,19 @@
\noexpand\def\noexpand\normallineheight{\the\dimexpr\normallineheight}%
\noexpand\normalbaselines}}
-% plain definition:
-%
-% \def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
-%
-% could be:
-%
-% \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
+%D This is the plain definition:
+%D
+%D \starttyping
+%D \def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+%D \stoptyping
+%D
+%D which could be:
+%D
+%D \starttyping
+%D \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
+%D \stoptyping
+%D
+%D But we do things differently.
\newbox\strutbox
@@ -856,8 +850,7 @@
\let\normalstrut\strut
-% The double \hbox construction enables us to \backtrack
-% boxes.
+%D The double \type {\hbox} construction enables us to backtrack boxes.
\let\strutht\undefined \newdimen\strutht
\let\strutdp\undefined \newdimen\strutdp
@@ -928,10 +921,10 @@
\vrule\s!width\zeropoint\s!depth\strutdp\s!height\zeropoint
\endgroup}
-% because of all the callbacks in mkiv, we avoid unnecessary boxes ...
-% maybe use an attribute so that we can tag boxes that don't need a
-% treatment; tests with using an attribute so far have shown that
-% it's slower because testing the attribute takes time too
+%D Because of all the callbacks in mkiv, we avoid unnecessary boxes ... maybe use an
+%D attribute so that we can tag boxes that don't need a treatment; tests with using
+%D an attribute so far have shown that it's slower because testing the attribute
+%D takes time too.
\unexpanded\def\dosetstrut
{\let\strut\normalstrut
@@ -1004,11 +997,9 @@
\let\spac_struts_vide_hbox\hbox % overloaded in trac-vis.mkiv
-%D The dimen \type {\struttotal} holds the exact size of the
-%D strut; occasionally a one scaled point difference can show
-%D up with the lineheight.
-
-% This is more efficient (less callbacks):
+%D The dimen \type {\struttotal} holds the exact size of the strut; occasionally a
+%D one scaled point difference can show up with the lineheight. This is more
+%D efficient (less callbacks):
\newbox\b_spac_struts_empty \setbox\b_spac_struts_empty\emptyhbox
@@ -1084,7 +1075,7 @@
%D \NC A B \unknown \NC a character strut (e.g. A) \NC {\showstruts\setupstrut[A]\strut} \NC \NR
%D \NC \NC a normal strut \NC {\showstruts\setupstrut\strut} \NC \NR
%D \stoptabulate
-
+%D
%D Beware: using an unknown value results in char struts.
\installcorenamespace{struts}
@@ -1165,10 +1156,8 @@
\let\begstrut\empty
\to \everysetnostrut
-% when enabled, sigstruts will remove themselves if nothing
-% goes inbetween
-
-%D For practical reasons we define some boundary characters here.
+%D When enabled, sigstruts will remove themselves if nothing goes inbetween. For
+%D practical reasons we define some boundary characters here.
\unexpanded\def\leftboundary {\protrusionboundary\plusone}
\unexpanded\def\rightboundary {\protrusionboundary\plustwo}
@@ -1197,11 +1186,6 @@
\hskip-\strutsignal
\hskip\strutsignal}
-% \def\spac_struts_beg_normal
-% {\strut
-% \penalty\plustenthousand
-% \hskip\zeropoint}
-
\def\spac_struts_beg_normal
{\boundary\plusone
\strut
@@ -1238,12 +1222,6 @@
\strut
\fi}
-% \def\spac_struts_end_normal
-% {\removeunwantedspaces
-% \penalty\plustenthousand
-% \hskip\zeropoint
-% \strut}
-
\def\spac_struts_end_normal
{\removeunwantedspaces
\penalty\plustenthousand
@@ -1298,10 +1276,9 @@
\def\baselinedistance{\the\lineheight}
-%D We need \type{\normaloffinterlineskip} because the new
-%D definition contains an assignment, and |<|don't ask me
-%D why|>| this assignment gives troubles in for instance the
-%D visual debugger.
+%D We need \type {\normaloffinterlineskip} because the new definition contains an
+%D assignment, and |<|don't ask me why|>| this assignment gives troubles in for
+%D instance the visual debugger.
\unexpanded\def\offinterlineskip
{\baselineskip-\thousandpoint
@@ -1322,8 +1299,8 @@
%D So, here we kick in a checker but it has to happen after the output group and it
%D only has to be done once (output can trigger itself!).
%D
-%D However, prevgraf is somehow bound to hangindent so we can get very
-%D nasty side effects. So, in tne end we use our own variable!
+%D However, prevgraf is somehow bound to hangindent so we can get very nasty side
+%D effects. So, in tne end we use our own variable!
\ifdefined\getnofpreviouslines
% defined public at the lua end
@@ -1445,7 +1422,7 @@
\resetpenalties\interlinepenalties
\stopsetups
-% we use \directsetup because it's faster and we know there is no csl
+%D We use \directsetup because it's faster and we know there is no csl:
\startsetups [\systemsetupsprefix\s!default]
@@ -1475,7 +1452,7 @@
\stopsetups
-% as an illustration:
+%D As an illustration:
\startsetups [\systemsetupsprefix\v!strict]
@@ -2191,13 +2168,16 @@
\doubleexpandafter\gobbleoneargument
\fi\fi}
-\unexpanded\def\useblankparameter#1% faster local variant
- {\edef\m_spac_blank_asked{#1\c!blank}%
+\unexpanded\def\usespecificblankparameter#1#2% faster local variant
+ {\edef\m_spac_blank_asked{#1#2}%
\ifx\m_spac_blank_asked\empty\else
\directvspacing\m_spac_blank_asked
\fi}
-% handy (and faster):
+\unexpanded\def\useblankparameter#1% faster local variant
+ {\usespecificblankparameter#1\c!blank}
+
+%D Handy (and faster):
\unexpanded\def\directvpenalty#1%
{\begingroup
@@ -2215,7 +2195,7 @@
\vskip#1\relax
\endgroup}
-% these depend on bigskipamount cum suis so we'd better sync them
+%D These depend on bigskipamount cum suis so we'd better sync them:
\unexpanded\def\setupvspacing
{\doifelsenextoptionalcs\setupvspacing_yes\setupvspacing_nop}
@@ -2238,9 +2218,7 @@
\let\synchronizevspacing\setupvspacing_nop
-% category:4 is default
-
-% this interface might change (into an \install, but we will then keep this one hidden)
+%D The \type {category:4} is default.
\definevspacingamount[\v!none] [\zeropoint] [\zeropoint]
\definevspacingamount[\v!big] [\bigskipamount] [\bodyfontlineheight]
@@ -2258,7 +2236,7 @@
\def\bodyfontwhitespace
{\dimexpr
- \ifdim\parskip=\zeropoint
+ \ifzeropt\parskip
\zeropoint
\else\ifgridsnapping
\bodyfontlineheight
@@ -2267,7 +2245,7 @@
\fi\fi
\relax}
-% used in itemize ... always test this
+%D used in itemize \unknown\ always test this:
\newdimen\d_spac_overlay
@@ -2316,21 +2294,33 @@
\newcount\c_spac_vspacing_special_base \c_spac_vspacing_special_base = 32250 % 4000
\newcount\c_spac_vspacing_special_step \c_spac_vspacing_special_step = 10 % 250
+\newcount\c_spac_vspacing_special_done
+
+% 2019-05-31 : upgraded a bit to more distinctive samepage-[level]-[0|1|2] names
+
+\unexpanded\def\spac_vspacing_define_same_step#1#2% alternatively we could have samepage-n-m
+ {\begingroup
+ \scratchcounterone\numexpr\plusthree*#1+#2\relax
+ \scratchcountertwo\numexpr\c_spac_vspacing_special_base+\c_spac_vspacing_special_step*\scratchcounterone\relax
+ %\writestatus{defined}{\v!samepage-\number#1-\number#2\space=>\space penalty:\the\scratchcountertwo}%
+ \normalexpanded{\definevspacing[\v!samepage-\number#1-\number#2][penalty:\the\scratchcountertwo]}%
+ \endgroup}
\unexpanded\def\spac_vspacing_define_same_page#1%
- {\normalexpanded{\definevspacing
- [\v!samepage-#1]%
- [penalty:\the\numexpr\c_spac_vspacing_special_base+\c_spac_vspacing_special_step*#1\relax]}}
+ {\dostepwiserecurse\c_spac_vspacing_special_done{#1}\plusone
+ {\spac_vspacing_define_same_step\recurselevel\zerocount % before
+ \spac_vspacing_define_same_step\recurselevel\plusone % after
+ \spac_vspacing_define_same_step\recurselevel\plustwo}% % whatever
+ \global\c_spac_vspacing_special_done#1\relax}
-\dorecurse{20}{\spac_vspacing_define_same_page{#1}}
+\spac_vspacing_define_same_page{12} % 12 levels should be more than enough as a start
-\ifdefined\everydefinesection
- \appendtoks
- \spac_vspacing_define_same_page\maxstructuredepth
- \to \everydefinesection
-\else
- % the order has changed so this code has to move to strf-def.mkiv then
-\fi
+\def\spac_vspacing_same_page#1#2% level offset (starts at 0)
+ {\ifnum#1>\c_spac_vspacing_special_done
+ \spac_vspacing_define_same_page{#1}%
+ \fi
+ %\writestatus{used}{\v!samepage-\number#1-\number#2}%
+ \vspacing[\v!samepage-\number#1-\number#2]}
\definevspacing[\v!default] [\v!big] % todo: needs to adapt to \setupblank
\definevspacing[\v!before] [\v!default] % but we need to avoid circular references
@@ -2340,9 +2330,8 @@
\setupvspacing
[\v!big] % alternatively [\v!standard]
-%D Maybe at some point we will differ between \type {\vspacing} and
-%D \type {\blank} (we needed the first one while playing with the
-%D new code).
+%D Maybe at some point we will differ between \type {\vspacing} and \type {\blank}
+%D (we needed the first one while playing with the new code).
% We keep this one as reference
%
@@ -2367,9 +2356,8 @@
\let\synchronizeblank \synchronizevspacing
\let\defineblankmethod\definevspacingamount
-%D The following command is for Wolfgang. It has to be used with
-%D care as it does {\em not} work in tandem with the other spacing
-%D commands.
+%D The following command is for Wolfgang. It has to be used with care as it does
+%D {\em not} work in tandem with the other spacing commands.
\installcorenamespace{vspace}
@@ -2451,8 +2439,7 @@
\relax
\fi}
-%D Some preliminary code: a simple and fast hanger, for usage in
-%D macros (moved from cont-new).
+%D Some preliminary code: a simple and fast hanger, for usage in macros.
\installcorenamespace {hanging}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/spac-ver.mkxl b/Master/texmf-dist/tex/context/base/mkiv/spac-ver.mkxl
new file mode 100644
index 00000000000..c56352077f3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/spac-ver.mkxl
@@ -0,0 +1,2605 @@
+%D \module
+%D [ file=spac-ver,
+%D version=2009.10.16, % 1997.03.31, was core-spa.tex
+%D title=\CONTEXT\ Spacing Macros,
+%D subtitle=Vertical,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Spacing Macros / Vertical}
+
+\unprotect
+
+\registerctxluafile{spac-ver}{optimize}
+
+% todo: use usernodes ?
+
+% todo: itemize : intro ... only when there is one or two lines preceding and then
+% keep these together i.e. \blank[intro]
+
+% Isn't it about time to get rid of topskip i.e. make it equivalent to
+% \openstrutheight so that we can remove delta code.
+%
+% There might be more namespace protection.
+
+%D There are two ways to influence the interline spacing. The most general and often
+%D most consistent way is using
+%D
+%D \showsetup{setupinterlinespace}
+%D
+%D For instance
+%D
+%D \starttyping
+%D \setupinterlinespace[line=2.8ex]
+%D \stoptyping
+%D
+%D This setting adapts itself to the bodyfontsize, while for instance saying
+%D
+%D \starttyping
+%D \setupinterlinespace[line=12pt]
+%D \stoptyping
+%D
+%D sets things fixed for all sizes, which is definitely not what we want. Therefore
+%D one can also say:
+%D
+%D \starttyping
+%D \definebodyfontenvironment[9pt][interlinespace=11pt]
+%D \stoptyping
+%D
+%D One can still use \type {\setupinterlinespace} (without arguments) to set the
+%D interline space according to the current font, e.g. a \type {\bfa}.
+
+% will be cleaned up but it will stay messy because we accept so
+% many variants
+
+\newif\iflocalinterlinespace
+
+\newskip \s_spac_vspacing_temp \s_spac_vspacing_temp\bigskipamount
+
+\def\skipfactor {.75}
+\def\skipgluefactor{.25}
+
+% \def\normalskipamount
+% {\openlineheight
+% \ifgridsnapping \else \ifblankflexible
+% \s!plus \skipgluefactor\openlineheight
+% \s!minus\skipgluefactor\openlineheight
+% \fi \fi
+% \relax}
+
+\def\normalskipamount
+ {\openlineheight
+ \ifgridsnapping \orelse \ifblankflexible
+ \s!plus \skipgluefactor\openlineheight
+ \s!minus\skipgluefactor\openlineheight
+ \fi
+ \relax}
+
+\ifdefined\bodyfontinterlinespace \else
+ \let\bodyfontinterlinespace\empty
+\fi
+
+\unexpanded\def\presetnormallineheight % each bodyfont
+ {\edef\normallineheight{\interlinespaceparameter\c!line}%
+ \iflocalinterlinespace \else
+ \edef\m_spac_normallineheight{\bodyfontinterlinespace}%
+ \ifx\m_spac_normallineheight\empty \else
+ \let\normallineheight\m_spac_normallineheight
+ \fi
+ \fi}
+
+\unexpanded\def\setupspecifiedinterlinespace[#1]%
+ {\setupcurrentinterlinespace[#1]%
+ \spac_linespacing_setup_specified_interline_space}
+
+\def\spac_linespacing_setup_specified_interline_space
+ {\edef\strutheightfactor {\interlinespaceparameter\c!height }%
+ \edef\strutdepthfactor {\interlinespaceparameter\c!depth }%
+ \edef\minimumstrutheight {\interlinespaceparameter\c!minheight}%
+ \edef\minimumstrutdepth {\interlinespaceparameter\c!mindepth }%
+ \edef\minimumlinedistance {\interlinespaceparameter\c!distance }%
+ \edef\normallineheight {\interlinespaceparameter\c!line }%
+ \edef\topskipfactor {\interlinespaceparameter\c!top }%
+ \edef\maxdepthfactor {\interlinespaceparameter\c!bottom }%
+ \edef\m_spac_vertical_baseline_stretch_factor{\interlinespaceparameter\c!stretch }%
+ \edef\m_spac_vertical_baseline_shrink_factor {\interlinespaceparameter\c!shrink }%
+ % often topskip does more bad than good, so:
+ \ifx\topskipfactor\v!height
+ \let\topskipfactor\strutheightfactor
+ \fi
+ \setfontparameters % redundant, can be \setstrut, test first
+ \updateraggedskips} % yes indeed
+
+\installcorenamespace{interlinespacerelative}
+
+\let\setrelativeinterlinespace \relax % used elsewhere
+\let\currentrelativeinterlinespace\empty
+
+\setvalue{\??interlinespacerelative\v!on }{\oninterlineskip}
+\setvalue{\??interlinespacerelative\v!off }{\offinterlineskip}
+\setvalue{\??interlinespacerelative\v!reset}{\let\currentrelativeinterlinespace\empty
+ \let\setrelativeinterlinespace\relax
+ \setfontparameters}
+\setvalue{\??interlinespacerelative\v!auto }{\let\setrelativeinterlinespace\spac_linespacing_set_relative_interlinespace}
+
+\def\spac_linespacing_set_specified_relative_interlinespace#1% fragile?
+ {\doifelsedimenstring{#1}
+ {\setupspecifiedinterlinespace[\c!line=#1]}
+ {\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
+ \spacing\currentrelativeinterlinespace}}
+
+\unexpanded\def\setuprelativeinterlinespace[#1]%
+ {\processcommalist[#1]\spac_linespacing_setup_relative_interlinespace}
+
+\def\spac_linespacing_setup_relative_interlinespace#1%
+ {\ifcsname\??interlinespacerelative#1\endcsname
+ \lastnamedcs
+ \else
+ \spac_linespacing_set_specified_relative_interlinespace{#1}%
+ \fi}
+
+\def\spac_linespacing_set_relative_interlinespace
+ {\ifx\currentrelativeinterlinespace\empty\else
+ \spacing\currentrelativeinterlinespace
+ \fi}
+
+\unexpanded\def\spac_linespacing_setup_use
+ {\ifcsname\namedinterlinespacehash\m_spac_interlinespace\s!parent\endcsname
+ \let\currentinterlinespace\m_spac_interlinespace
+ \spac_linespacing_setup_specified_interline_space
+ % \else
+ % we only support named interlinespaces
+ \fi}
+
+\unexpanded\def\useinterlinespaceparameter#1% see footnotes
+ {\edef\m_spac_interlinespace{#1\c!interlinespace}%
+ \ifx\m_spac_interlinespace\empty \else
+ \spac_linespacing_setup_use
+ \fi}
+
+\newtoks\everysetupglobalinterlinespace
+\newtoks\everysetuplocalinterlinespace
+
+\newconditional\interlinespaceisset
+
+\installcorenamespace{interlinespace}
+
+\installcommandhandler \??interlinespace {interlinespace} \??interlinespace
+
+\installmacrostack\currentinterlinespace
+
+\unexpanded\def\setupinterlinespace
+ {\dodoubleempty\spac_linespacing_setup}
+
+\ifdefined\setupinterlinespace_double \else
+ \let\setupinterlinespace_double\setup_interlinespace % for a while
+\fi
+
+\def\spac_linespacing_setup[#1][#2]%
+ {\settrue\interlinespaceisset % reset has to be done when needed
+ \ifsecondargument
+ \setupinterlinespace_double[#1][#2]%
+ \orelse\iffirstargument
+ \ifcsname\namedinterlinespacehash{#1}\s!parent\endcsname
+ \edef\currentinterlinespace{#1}%
+ \spac_linespacing_setup_specified_interline_space
+ %\dosetupspecifiedinterlinespaceindeed
+ \else
+ \spac_linespacing_setup_specified_or_relative[#1]%
+ \fi
+ \else
+ \let\currentinterlinespace\empty
+ \spac_linespacing_synchronize_local
+ \fi}
+
+\def\spac_linespacing_setup_specified_or_relative[#1]%
+ {\doifelseassignment{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]%
+ \the\iflocalinterlinespace\everysetuplocalinterlinespace\else\everysetupglobalinterlinespace\fi}
+
+\def\spac_linespacing_synchronize_local % adapts to the font
+ {\localinterlinespacetrue
+ \setfontparameters
+ \updateraggedskips % funny one here
+ \the\everysetuplocalinterlinespace
+ \localinterlinespacefalse}
+
+\unexpanded\def\dosetupcheckedinterlinespace#1% often a chain
+ {\edef\p_spac_checked_interlinespace{#1}%
+ \ifx\p_spac_checked_interlinespace\empty
+ \spac_linespacing_synchronize_local
+ \orelse\ifcsname\namedinterlinespacehash\p_spac_checked_interlinespace\s!parent\endcsname % we could have a \s!check
+ \push_macro_currentinterlinespace
+ \let\currentinterlinespace\p_spac_checked_interlinespace
+ \spac_linespacing_setup_specified_interline_space % \dosetupspecifiedinterlinespaceindeed
+ \iflocalinterlinespace
+ \the\everysetuplocalinterlinespace
+ \else
+ \localinterlinespacetrue
+ \the\everysetuplocalinterlinespace
+ \localinterlinespacefalse
+ \fi
+ \pop_macro_currentinterlinespace
+ \else
+ \normalexpanded{\noexpand\doifelseassignment{\p_spac_checked_interlinespace}%
+ \setupspecifiedinterlinespace\setuprelativeinterlinespace[\p_spac_checked_interlinespace]}%
+ \iflocalinterlinespace
+ \the\everysetuplocalinterlinespace
+ \else
+ \localinterlinespacetrue
+ \the\everysetuplocalinterlinespace
+ \localinterlinespacefalse
+ \fi
+ \fi}
+
+\unexpanded\def\setuplocalinterlinespace[#1]%
+ {\localinterlinespacetrue
+ \push_macro_currentinterlinespace
+ \setupinterlinespace[#1]%
+ \pop_macro_currentinterlinespace
+ \localinterlinespacefalse}
+
+\let\switchtointerlinespace\setuplocalinterlinespace
+
+%D Helpers
+
+\newskip \s_spac_lastskip
+\newdimen\d_spac_prevdepth
+\newcount\c_spac_spacefactor
+\newdimen\d_spac_prevcontent % set by lua
+
+\unexpanded\def\removelastskip
+ {\ifvmode\ifzeropt\lastskip\else\vskip-\lastskip\fi\fi}
+
+\def\doifoutervmode
+ {\ifvmode
+ \ifinner
+ \doubleexpandafter\gobbleoneargument
+ \else
+ \doubleexpandafter\firstofoneargument
+ \fi
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\unexpanded\def\dosomebreak#1%
+ {\doifoutervmode
+ {\s_spac_lastskip\lastskip
+ \removelastskip
+ #1\relax
+ \ifzeropt\s_spac_lastskip
+ % avoid interference with footnotes
+ \else
+ \vskip\s_spac_lastskip
+ \fi}}
+
+\unexpanded\def\packed
+ {\nointerlineskip}
+
+\unexpanded\def\godown[#1]%
+ {\relax
+ \ifhmode\endgraf\fi
+ \ifvmode\nointerlineskip\vskip#1\relax\fi}
+
+\unexpanded\def\smallskip{\vskip\smallskipamount}
+\unexpanded\def\medskip {\vskip\medskipamount}
+\unexpanded\def\bigskip {\vskip\bigskipamount}
+
+\unexpanded\def\smallbreak
+ {\par
+ \ifvmode\ifdim\lastskip<\smallskipamount
+ \removelastskip
+ \penalty-\plusfifty
+ \smallskip
+ \fi\fi}
+
+\unexpanded\def\medbreak
+ {\par
+ \ifvmode\ifdim\lastskip<\medskipamount
+ \removelastskip
+ \penalty-\plusonehundred
+ \medskip
+ \fi\fi}
+
+\unexpanded\def\bigbreak
+ {\par
+ \ifvmode\ifdim\lastskip<\bigskipamount
+ \removelastskip
+ \penalty-\plustwohundred
+ \bigskip
+ \fi\fi}
+
+\unexpanded\def\break {\penalty-\plustenthousand} % can be hmode or vmode
+\unexpanded\def\nobreak {\penalty \plustenthousand} % can be hmode or vmode
+\unexpanded\def\allowbreak{\penalty \zerocount} % can be hmode or vmode
+
+\unexpanded\def\goodbreak {\par\ifvmode\penalty-\plusfivehundred\relax\fi} % forces vmode
+\unexpanded\def\filbreak {\par\ifvmode\vfil\penalty-\plustwohundred\vfilneg\fi} % forces vmode
+
+%D Made slightly more readable:
+
+\unexpanded\def\vglue {\afterassignment\spac_helpers_vglue_indeed\s_spac_lastskip=}
+\unexpanded\def\hglue {\afterassignment\spac_helpers_hglue_indeed\s_spac_lastskip=}
+\unexpanded\def\topglue{\par\ifvmode\nointerlineskip\vglue-\topskip\vglue\fi}
+
+\def\spac_helpers_vglue_indeed
+ {\par
+ \ifvmode
+ \d_spac_prevdepth\prevdepth
+ \hrule\s!height\zeropoint
+ \nobreak
+ \vskip\s_spac_lastskip
+ \prevdepth\d_spac_prevdepth
+ \fi}
+
+\def\spac_helpers_hglue_indeed
+ {\dontleavehmode
+ \c_spac_spacefactor\spacefactor
+ \vrule\s!width\zeropoint
+ \nobreak
+ \hskip\s_spac_lastskip
+ \spacefactor\c_spac_spacefactor}
+
+%D We adapt plain's \type {\removelastskip} a bit:
+
+\unexpanded\def\removelastskip % also in supp-box
+ {\ifvmode\ifzeropt\lastskip\else\vskip-\lastskip\fi\fi}
+
+% The whitespace handler. We could cache settings but normally there are not
+% that many in a set.
+
+\installcorenamespace{whitespacemethod}
+
+\newskip \s_spac_whitespace_parskip \s_spac_whitespace_parskip\zeropoint
+\newconditional\c_spac_whitespace_flexible \settrue\c_spac_whitespace_flexible
+\newconstant \c_spac_whitespace_grid_mode % option in layout / 1=permit_half_lines
+
+%def\v_spac_whitespace_current{\zeropoint}
+\let\v_spac_whitespace_current\v!none
+
+\unexpanded\def\setupwhitespace
+ {\doifelsenextoptionalcs\spac_whitespace_setup_yes\spac_whitespace_setup_nop}
+
+\def\spac_whitespace_setup_nop
+ {\ifx\v_spac_whitespace_current\v!none\else
+ \spac_whitespace_setup
+ \fi}
+
+\let\synchronizewhitespace\spac_whitespace_setup_nop
+
+\def\spac_whitespace_setup_yes[#1]%
+ {\edef\m_spac_whitespace_asked{#1}%
+ \ifx\m_spac_whitespace_asked\empty
+ \spac_whitespace_setup_nop
+ \else
+ \let\v_spac_whitespace_current\m_spac_whitespace_asked
+ \spac_whitespace_setup
+ \fi}
+
+\def\spac_whitespace_setup % quick test for no list
+ {\ifcsname\??whitespacemethod\v_spac_whitespace_current\endcsname
+ \lastnamedcs
+ \else
+ \expandafter\processcommalist\expandafter[\v_spac_whitespace_current]\spac_whitespace_setup_method % can be raw
+ \fi\relax
+ \ifgridsnapping
+ \spac_whitespace_setup_grid
+ \else
+ \spac_whitespace_setup_normal
+ \fi
+ \parskip\s_spac_whitespace_parskip}
+
+\def\spac_whitespace_setup_normal
+ {\ifconditional\c_spac_whitespace_flexible \else
+ \s_spac_whitespace_parskip\plusone\s_spac_whitespace_parskip
+ \fi}
+
+\def\spac_whitespace_setup_grid
+ {\setfalse\c_spac_whitespace_flexible
+ \ifdim\s_spac_whitespace_parskip>\zeropoint
+ \s_spac_whitespace_parskip
+ \ifcase\c_spac_whitespace_grid_mode
+ \baselineskip
+ \or
+ \ifdim\scratchdimen=\baselineskip % maybe range
+ \baselineskip
+ \else
+ \numexpr\s_spac_whitespace_parskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax
+ \fi
+ \else
+ \baselineskip
+ \fi
+ \fi}
+
+\unexpanded\def\installwhitespacemethod#1#2%
+ {\setvalue{\??whitespacemethod#1}{#2}}
+
+\installwhitespacemethod \v!fix {}
+\installwhitespacemethod \v!fixed {\setfalse\c_spac_whitespace_flexible}
+\installwhitespacemethod \v!flexible {\settrue \c_spac_whitespace_flexible}
+
+\installwhitespacemethod \v!line {\s_spac_whitespace_parskip \baselineskip}
+\installwhitespacemethod \v!halfline {\s_spac_whitespace_parskip .5\baselineskip}
+\installwhitespacemethod \v!quarterline {\s_spac_whitespace_parskip.25\baselineskip}
+\installwhitespacemethod \v!none {\s_spac_whitespace_parskip \zeropoint}
+\installwhitespacemethod \v!big {\s_spac_whitespace_parskip \bigskipamount}
+\installwhitespacemethod \v!medium {\s_spac_whitespace_parskip \medskipamount}
+\installwhitespacemethod \v!small {\s_spac_whitespace_parskip \smallskipamount}
+
+\installwhitespacemethod \s!default {\spac_whitespace_setup_nop} % also covers none
+
+\def\spac_whitespace_setup_method#1%
+ {\ifcsname\??whitespacemethod#1\endcsname
+ \lastnamedcs
+ \else
+ \s_spac_whitespace_parskip#1\fi
+ \relax}
+
+\unexpanded\def\forgetparskip
+ {\s_spac_whitespace_parskip\zeropoint
+ \parskip\zeropoint
+ \let\v_spac_whitespace_current\v!none}
+
+\appendtoks
+ \forgetparskip
+\to \everyforgetall
+
+% \installwhitespacemethod \s!unknown {\s_spac_whitespace_parskip\commalistelement\relax}
+%
+% \def\spac_whitespace_setup_method#1%
+% {\csname\??whitespacemethod\ifcsname\??whitespacemethod#1\endcsname#1\else\s!unknown\endcsname\relax}
+
+\unexpanded\def\nowhitespace{\directcheckedvspacing\v!nowhite} % {\vspacing[\v!nowhite]}
+\unexpanded\def\whitespace {\directcheckedvspacing\v!white} % {\vspacing[\v!white]}
+
+\setupwhitespace
+ [\v!none]
+
+% Packed:
+
+% todo: when packed blocks blank, we need to enable forced
+
+\newconditional\c_spac_packed_blank \settrue\c_spac_packed_blank
+\newcount \c_spac_packed_level
+
+\unexpanded\def\startpacked
+ {\dosingleempty\spac_packed_start}
+
+\def\spac_packed_start[#1]% nesting afvangen
+ {\global\advance\c_spac_packed_level\plusone
+ \par
+ \ifnum\c_spac_packed_level=\plusone \ifvmode
+ \begingroup
+ \whitespace % not combined
+ \directcheckedvspacing\v!disable % \blank[\v!disable]% or \inhibitblank
+ \doifelse{#1}\v!blank\settrue\setfalse\c_spac_packed_blank
+ \setupwhitespace[\v!none]% or \forgetparskip
+ \fi \fi}
+
+\unexpanded\def\stoppacked
+ {\par
+ \ifnum\c_spac_packed_level=\plusone \ifvmode
+ \endgroup
+ \fi \fi
+ \global\advance\c_spac_packed_level\minusone}
+
+\unexpanded\def\startunpacked
+ {\directdefaultvspacing % \blank
+ \begingroup}
+
+\unexpanded\def\stopunpacked
+ {\endgroup
+ \directdefaultvspacing}% \blank}
+
+% \prevdepth crosses pageboundaries!
+%
+% todo: a version that works ok inside a box
+
+% global : outer hsize + keep skips
+% local : inner hsize + reset skips
+
+\installcorenamespace{linesaround}
+
+\let\spac_lines_vbox\vbox
+
+\installtextracker
+ {linecorrection.boxes}
+ {\let\spac_lines_vbox\ruledvbox}
+ {\let\spac_lines_vbox\vbox}
+
+\let\v_spac_lines_around_action_set\relax
+\let\m_spac_lines_around \empty
+
+\newconstant\c_spac_lines_correction_mode
+
+\setvalue{\??linesaround\v!blank }{\blank}
+\letvalue{\??linesaround\empty }\relax
+\setvalue{\??linesaround\s!unknown}{\directcheckedvspacing\m_spac_lines_around} % \blank[\m_spac_lines_around]}
+
+\def\spac_lines_action_around % we used to let this one but it's cleaner this way
+ {\csname\??linesaround % i.e. do it twice
+ \ifcsname\??linesaround\m_spac_lines_around\endcsname\m_spac_lines_around\else\s!unknown\fi
+ \endcsname}
+
+\unexpanded\def\startlinecorrection
+ {\endgraf
+ \begingroup
+ \setconstant\c_spac_lines_correction_mode\plusone
+ \dosingleempty\spac_lines_start_correction}
+
+\unexpanded\def\startlocallinecorrection
+ {\endgraf
+ \begingroup
+ \setconstant\c_spac_lines_correction_mode\plustwo
+ \dosingleempty\spac_lines_start_correction}
+
+\unexpanded\def\spac_lines_start_correction[#1]%
+ {\edef\m_spac_lines_around{#1}%
+ \spac_lines_action_around
+ \d_spac_prevdepth\prevdepth
+ \spac_lines_initialize_corrections
+ \offbaselinecorrection % ???
+ \setbox\scratchbox\spac_lines_vbox\bgroup
+ \ifcase\c_spac_lines_correction_mode
+ % nothing
+ \or
+ % global
+ \or
+ % local
+ \setlocalhsize
+ \hsize\localhsize
+ \forgetbothskips
+ \fi
+ \ignorespaces}
+
+\unexpanded\def\spac_lines_stop_correction
+ {\removeunwantedspaces
+ \egroup
+ \ifgridsnapping
+ \spac_lines_stop_correction_ongrid
+ \else
+ \spac_lines_stop_correction_normal
+ \fi
+ \endgroup}
+
+\unexpanded\def\spac_lines_stop_correction_ongrid
+ {\directcheckedvspacing\v!white % \blank[\v!white]%
+ \spac_lines_action_around
+ \snaptogrid\hpack{\box\scratchbox}%
+ \directcheckedvspacing\v!white
+ \spac_lines_action_around}
+
+\unexpanded\def\spac_lines_stop_correction_normal
+ {\directcheckedvspacing\v!nowhite % \blank[\v!nowhite]%
+ \ifdim\parskip>\zeropoint
+ % too fuzzy otherwise
+ \else
+ % doesn't like whitespace
+ \ifdim\d_spac_prevdepth<\maxdimen
+ \unless\ifdim\d_spac_prevdepth<\zeropoint
+ \ifdim\d_spac_prevdepth<\strutdp \relax
+ \pushlastnode
+ \ifdim\d_spac_prevdepth>\zeropoint
+ \kern-\d_spac_prevdepth
+ \fi
+ \kern\strutdp
+ \prevdepth\strutdp
+ \poplastnode
+ \fi
+ \fi
+ \fi
+ \fi
+ \ifdim\pagegoal<\maxdimen
+ % \blank[\v!white,\the\d_spac_lines_correction_before]% \blank[\v!white]\dotopbaselinecorrection
+ \directcheckedvspacing{\v!white,\the\d_spac_lines_correction_before}% \blank[\v!white]\dotopbaselinecorrection
+ \fi
+ \nointerlineskip % new
+ \noindent % not \dontleavehmode !
+ \ifcase\c_spac_lines_correction_mode
+ % nothing
+ \or
+ % global
+ \hskip-\leftskip % more tricky would be hangindent so we ignore that one
+ \or
+ % local
+ \fi
+ \box\scratchbox
+ \endgraf
+ %
+ % eventually i'll get it right ... (i also need to check all whitespace code elsewhere)
+ %
+ % \blank[\the\d_spac_lines_correction_after]% \dobotbaselinecorrection
+ % \directcheckedvspacing{\the\d_spac_lines_correction_after}% \dobotbaselinecorrection
+ \directcheckedvspacing{\v!white,\the\d_spac_lines_correction_after}% \dobotbaselinecorrection
+ % \allowbreak % new, otherwise problems when many in a row
+ \prevdepth\strutdp
+ \spac_lines_action_around}
+
+\let\stoplinecorrection \spac_lines_stop_correction
+\let\stoplocallinecorrection\spac_lines_stop_correction
+
+% todo:
+
+\unexpanded\def\correctwhitespace
+ {\dowithnextboxcs\correctwhitespacefinish\vbox}
+
+\unexpanded\def\correctwhitespacefinish
+ {\startbaselinecorrection
+ \flushnextbox
+ \stopbaselinecorrection}
+
+\unexpanded\def\verticalstrut {\vpack{\hsize\zeropoint\forgetall\strut}}
+\unexpanded\def\horizontalstrut{\hpack {\strut}}
+
+%D Here follow some presets related to interline spacing and therefore also struts.
+%D The values 2.8, 0.07, 0.72 and 0.28 originate in \INRSTEX, a package that we used
+%D a while after we decided that \LATEX\ was not flexible enough. After that
+%D \CONTEXT\ evolved, from some wrapper code around (old) \LATEX\ (on a floppy
+%D disk), to using modules from \INRSTEX\ (which also fit on a floppy) and finally
+%D all written from scratch. I simply didn't understand all that \TEX\ code at that
+%D time, and it was easier to figure it out myself. But \unknown\ some settings
+%D stayed, as the height|/|depth ratios, and they never proved to be bad ones! The
+%D same is true for the font size relations.
+
+%D \starttabulate
+%D \NC \type {\lineheight} \NC the height of a line \NC \NR
+%D \NC \type {\spacing{number}} \NC adapting the interline space \NC \NR
+%D \NC \type {\normalbaselines} \NC initialize the interline spacing \NC \NR
+%D \NC \type {\setstrut} \NC initialize \type {\strut} \NC \NR
+%D \NC \type {\setnostrut} \NC disable the \type {\strut}, \type {\endstrut}, \type {\begstrut} \NC \NR
+%D \NC \type {\setteststrut} \NC initialize the visual \type {\strut} \NC \NR
+%D \NC \type {\resetteststrut} \NC disable the visual \type {\strut} \NC \NR
+%D \NC \type {\setfontparameters} \NC synchronize parameters with foints \NC \NR
+%D \stoptabulate
+%D
+%D \unknown\ and many more (this is a decades old list).
+%D
+%D The lineheight is the sum of the height and depth of \type {strut}, which is
+%D an invisible blob that can be used to enforce the proper dimensions.
+%D
+%D Such a blob, when placed at the beginning of a paragraph can have side effects
+%D that can be prevented with \type {\dontleavehmode}. Never use \type
+%D {\leavevmode}!
+
+\newdimen\strutdimen
+\newdimen\lineheight
+\newdimen\openlineheight
+\newdimen\openstrutheight
+\newdimen\openstrutdepth
+\newdimen\topskipgap
+\newdimen\struttotal
+
+\def\strutheightfactor {.72}
+\def\strutdepthfactor {.28}
+
+\def\baselinefactor {2.8}
+
+\let\m_spac_vertical_baseline_stretch_factor \zerocount
+\let\m_spac_vertical_baseline_shrink_factor \zerocount
+
+\def\minimumstrutheight {\zeropoint}
+\def\minimumstrutdepth {\zeropoint}
+
+\def\normallineheight {\baselinefactor\exheight}
+\def\minimumlinedistance {\lineskip}
+
+\def\strutheight {\zeropoint}
+\def\strutdepth {\zeropoint}
+\def\strutwidth {\zeropoint}
+
+\let\spacingfactor \plusone
+
+\def\topskipfactor {1.0}
+\def\maxdepthfactor {0.5}
+
+\def\systemtopskipfactor {\topskipfactor}
+\def\systemmaxdepthfactor {\maxdepthfactor}
+
+\ifdefined\globalbodyfontsize \else
+ \newdimen\globalbodyfontsize
+ \globalbodyfontsize=12pt
+\fi
+
+\ifdefined\normalizedbodyfontsize \else
+ \def\normalizedbodyfontsize{12pt}
+\fi
+
+\unexpanded\def\topskipcorrection
+ {\simpletopskipcorrection
+ \vskip-\struttotal
+ \verticalstrut}
+
+\unexpanded\def\simpletopskipcorrection
+ {\ifdim\topskip>\openstrutheight
+ % == \vskip\topskipgap
+ \vskip\topskip
+ \vskip-\openstrutheight
+ \fi}
+
+\unexpanded\def\settopskip % the extra test is needed for the lbr family
+ {\topskip
+ \ifgridsnapping
+ \zeropoint
+ \else
+ \systemtopskipfactor\globalbodyfontsize
+ \ifcase\bottomraggednessmode % ragged bottom
+ \s!plus5\globalbodyfontsize
+ \fi
+ \fi
+ %\relax
+ \topskipgap\topskip
+ \advance\topskipgap -\openstrutheight\relax
+ \ifdim\minimumstrutheight>\zeropoint
+ \ifdim\topskip<\minimumstrutheight
+ \topskip\minimumstrutheight\relax
+ \fi
+ \else
+ \ifdim\topskip<\strutheightfactor\openlineheight
+ \topskip\strutheightfactor\openlineheight\relax
+ \fi
+ \fi}
+
+\unexpanded\def\setmaxdepth
+ {\maxdepth\systemmaxdepthfactor\globalbodyfontsize}
+
+\let\normalbaselineskip \relax \newskip \normalbaselineskip % these got lost in the transition to mkiv due
+\let\normallineskip \relax \newskip \normallineskip % to auto-\normal* definitions and registers
+\let\normallineskiplimit\relax \newdimen\normallineskiplimit % being protected
+
+\unexpanded\def\normalbaselines
+ {\baselineskip \normalbaselineskip
+ \lineskip \normallineskip
+ \lineskiplimit\normallineskiplimit}
+
+\unexpanded\def\flexiblebaselines
+ {\baselineskip \normalbaselineskip
+ \lineskip 1\normallineskip \s!plus 1\s!fill
+ \lineskiplimit\normallineskiplimit}
+
+\unexpanded\def\setnormalbaselines
+ {\ifdim\normallineheight>\zeropoint
+ \lineheight\normallineheight
+ \fi
+ \openlineheight\spacingfactor\lineheight
+ \openstrutheight \ifdim\minimumstrutheight>\zeropoint
+ \minimumstrutheight % new
+ \else
+ \strutheightfactor\openlineheight
+ \fi
+ \openstrutdepth \ifdim\minimumstrutdepth>\zeropoint
+ \minimumstrutdepth % new
+ \else
+ \strutdepthfactor \openlineheight
+ \fi
+ \ifdim\dimexpr\minimumstrutdepth+\minimumstrutheight\relax>\zeropoint
+ \openlineheight\dimexpr\openstrutheight+\openstrutdepth\relax % new
+ \fi
+ \normalbaselineskip\openlineheight
+ \ifgridsnapping\else
+ \s!plus \m_spac_vertical_baseline_stretch_factor\openlineheight
+ \s!minus\m_spac_vertical_baseline_shrink_factor \openlineheight
+ \fi
+ \normallineskip\minimumlinedistance\relax % \onepoint\relax
+ \normallineskiplimit\zeropoint\relax
+ \normalbaselines}
+
+\unexpanded\def\spacing#1% vertical
+ {\ifgridsnapping
+ \let\spacingfactor\plusone
+ \else
+ \edef\spacingfactor{#1}%
+ \fi
+ \edef\systemtopskipfactor {\withoutpt\the\dimexpr#1\dimexpr\topskipfactor \points}%
+ \edef\systemmaxdepthfactor{\withoutpt\the\dimexpr#1\dimexpr\maxdepthfactor\points}%
+ \setnormalbaselines
+ \setstrut}
+
+% \unexpanded\def\forgetverticalstretch % \forgetspacing
+% {\spacing\plusone}
+
+\unexpanded\def\forgetverticalstretch
+ {\let\spacingfactor \plusone
+ \let\systemtopskipfactor \topskipfactor
+ \let\systemmaxdepthfactor\maxdepthfactor
+ \setnormalbaselines
+ \setstrut}
+
+\appendtoks
+ \forgetverticalstretch
+\to \everyforgetall % needed in otr
+
+%D Sometimes one needs to freeze the interlinespacing
+%D
+%D \starttyping
+%D \rm \saveinterlinespace .... {\ss \restoreinterlinespace .... \endgraf}
+%D \stoptyping
+
+\let\restoreinterlinespace\relax
+
+\unexpanded\def\saveinterlinespace
+ {\unexpanded\edef\restoreinterlinespace
+ {\lineheight \the\lineheight
+ \openstrutheight \the\openstrutheight
+ \openstrutdepth \the\openstrutdepth
+ \openlineheight \the\openlineheight
+ \normalbaselineskip \the\normalbaselineskip
+ \normallineskip \the\normallineskip
+ \normallineskiplimit\the\normallineskiplimit
+ \noexpand\def\noexpand\normallineheight{\the\dimexpr\normallineheight}%
+ \noexpand\normalbaselines}}
+
+%D This is the plain definition:
+%D
+%D \starttyping
+%D \def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+%D \stoptyping
+%D
+%D which could be:
+%D
+%D \starttyping
+%D \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
+%D \stoptyping
+%D
+%D But we do things differently.
+
+\newbox\strutbox
+
+\setbox\strutbox\hpack{\vrule\s!height8.5pt\s!depth3.5pt\s!width\zeropoint} % just a start
+
+\def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
+
+% \unexpanded\def\strut
+% {\relax
+% \ifmmode\copy\else\dontleavehmode\unhcopy\fi\strutbox}
+
+\let\normalstrut\strut
+
+%D The double \type {\hbox} construction enables us to backtrack boxes.
+
+\let\strutht\undefined \newdimen\strutht
+\let\strutdp\undefined \newdimen\strutdp
+
+\unexpanded\def\setstrut
+ {\ifgridsnapping
+ \setstrutgridyes
+ \else
+ \setstrutgridnop
+ \fi}
+
+\unexpanded\def\setstrutgridyes
+ {\strutht\spacingfactor\dimexpr
+ \ifdim\minimumstrutheight>\zeropoint
+ \minimumstrutheight
+ \else
+ \strutheightfactor\dimexpr\normallineheight
+ \fi
+ \strutdp\dimexpr
+ \ifdim\minimumstrutdepth>\zeropoint
+ \minimumstrutdepth
+ \else
+ \normallineheight-\strutht
+ \fi
+ \dosetstrut}
+
+\unexpanded\def\setstrutgridnop
+ {\strutht\spacingfactor\dimexpr
+ \ifdim\minimumstrutheight>\zeropoint
+ \minimumstrutheight
+ \else
+ \strutheightfactor\dimexpr\normallineheight
+ \fi
+ \strutdp\spacingfactor\dimexpr
+ \ifdim\minimumstrutdepth>\zeropoint
+ \minimumstrutdepth
+ \else
+ \strutdepthfactor\dimexpr\normallineheight
+ \fi
+ \dosetstrut}
+
+\unexpanded\def\setcharstrut#1%
+ {\setbox\strutbox\hbox{#1}% no \hpack, in case we have smallcaps
+ \strutht\ht\strutbox
+ \strutdp\dp\strutbox
+ \dosetstrut}
+
+\unexpanded\def\settightstrut
+ {\setcharstrut{(}}
+
+\unexpanded\def\setfontstrut
+ {\setcharstrut{(gplQT}}
+
+\unexpanded\def\setcapstrut% could be M, but Q has descender
+ {\setcharstrut{Q}}
+
+%D Handy for math (used in mathml):
+
+\unexpanded\def\charhtstrut
+ {\begingroup
+ \setcharstrut{GJY}%
+ \vrule\s!width\zeropoint\s!depth\zeropoint\s!height\strutht
+ \endgroup}
+
+\unexpanded\def\chardpstrut
+ {\begingroup
+ \setcharstrut{gjy}%
+ \vrule\s!width\zeropoint\s!depth\strutdp\s!height\zeropoint
+ \endgroup}
+
+%D Because of all the callbacks in mkiv, we avoid unnecessary boxes ... maybe use an
+%D attribute so that we can tag boxes that don't need a treatment; tests with using
+%D an attribute so far have shown that it's slower because testing the attribute
+%D takes time too.
+
+\unexpanded\def\dosetstrut
+ {\let\strut\normalstrut
+ \ifabsnum\dimexpr\strutht+\strutdp-\lineheight\relax<\plustwo
+ % compensate rounding error /- 1sp to avoid too many
+ % 1sp baselineskips in for instance verbatim
+ % \strutht\dimexpr\lineheight-\strutdp\relax
+ % better:
+ \strutdp\dimexpr\lineheight-\strutht\relax
+ \struttotal\lineheight
+ \else
+ \struttotal\dimexpr\strutht+\strutdp\relax
+ \fi
+ \edef\strutheight{\the\strutht}%
+ \edef\strutdepth {\the\strutdp}%
+ \ifdim\strutwidth=\zeropoint
+ \spac_struts_set_hide
+ \else
+ \spac_struts_set_vide
+ \fi}
+
+\def\spac_struts_set_hide
+ {\setbox\strutbox\hpack
+ {\vrule
+ \s!width \zeropoint
+ \s!height\strutht
+ \s!depth \strutdp}}
+
+\newconstant\c_strut_visual_mode
+
+\def\spac_struts_set_vide
+ {\setbox\strutbox\hpack % at some time this extra wrapping was needed
+ {\spac_struts_vide_hbox to \zeropoint
+ {\ifcase\c_strut_visual_mode
+ \spac_struts_black
+ \or
+ \spac_struts_color
+ \else
+ \spac_struts_black
+ \fi}}}
+
+\def\spac_struts_black
+ {\vrule
+ \s!width \strutwidth
+ \s!height\strutht
+ \s!depth \strutdp
+ \hss}
+
+\def\spac_struts_color
+ {\hss % new, will be option
+ \scratchwidth.1\struthtdp
+ \begingroup
+ \directcolor[f:b:t]%
+ \vrule
+ \s!width \scratchwidth
+ \s!height\strutht
+ \s!depth \strutdp
+ \kern-\scratchwidth
+ \vrule
+ \s!width \scratchwidth
+ \s!height\zeropoint
+ \s!depth \strutdp
+ \endgroup
+ \kern-.625\scratchwidth
+ \vrule
+ \s!width .25\scratchwidth
+ \s!height\strutht
+ \s!depth \strutdp
+ \hss}
+
+\let\spac_struts_vide_hbox\hbox % overloaded in trac-vis.mkiv
+
+%D The dimen \type {\struttotal} holds the exact size of the strut; occasionally a
+%D one scaled point difference can show up with the lineheight. This is more
+%D efficient (less callbacks):
+
+\newbox\b_spac_struts_empty \setbox\b_spac_struts_empty\emptyhbox
+
+\def\spac_struts_set_hide
+ {\setbox\strutbox\copy\b_spac_struts_empty
+ \ht\strutbox\strutht
+ \dp\strutbox\strutdp}
+
+\unexpanded\def\strut % still callbacks for \hbox{\strut}
+ {\relax
+ \dontleavehmode
+ \copy\strutbox}
+
+% \unexpanded\def\strut % slightly faster
+% {\relax
+% \ifmmode\copy\else\dontleavehmode\unhcopy\fi\strutbox}
+
+\let\normalstrut\strut
+
+\unexpanded\def\halfstrut
+ {\relax
+ \dontleavehmode
+ \begingroup
+ \setbox\scratchbox\copy\strutbox
+ \ht\scratchbox\dimexpr\strutht/\plustwo\relax
+ \dp\scratchbox\dimexpr\strutdp/\plustwo\relax
+ \box\scratchbox
+ \endgroup}
+
+\unexpanded\def\quarterstrut
+ {\relax
+ \dontleavehmode
+ \begingroup
+ \setbox\scratchbox\copy\strutbox
+ \ht\scratchbox\dimexpr\strutht/\plusfour\relax
+ \dp\scratchbox\dimexpr\strutdp/\plusfour\relax
+ \box\scratchbox
+ \endgroup}
+
+\unexpanded\def\depthstrut
+ {\relax
+ \dontleavehmode
+ \begingroup
+ \setbox\scratchbox\copy\strutbox
+ \ht\scratchbox\dimexpr\strutht-\struthtdp/\plustwo\relax % assumes that ht > lineheight/2
+ \box\scratchbox
+ \endgroup}
+
+\unexpanded\def\halflinestrut
+ {\relax
+ \dontleavehmode
+ \begingroup
+ \setbox\scratchbox\copy\strutbox
+ \ht\scratchbox\dimexpr\strutht-.5\strutht-.5\strutdp\relax
+ \box\scratchbox
+ \endgroup}
+
+\unexpanded\def\noheightstrut
+ {\relax
+ \dontleavehmode
+ \begingroup
+ \setbox\scratchbox\copy\strutbox
+ \ht\scratchbox\zeropoint
+ \box\scratchbox
+ \endgroup}
+
+%D Sometimes a capstrut comes in handy
+%D
+%D \starttabulate[|Tl|l|l|]
+%D \NC yes \NC normal strut \NC {\showstruts\setupstrut[yes]\strut} \NC \NR
+%D \NC no \NC no strut \NC {\showstruts\setupstrut[no]\strut} \NC \NR
+%D \NC kap \NC a capital strut (i.e. Q) \NC {\showstruts\setupstrut[cap]\strut} \NC \NR
+%D \NC A B \unknown \NC a character strut (e.g. A) \NC {\showstruts\setupstrut[A]\strut} \NC \NR
+%D \NC \NC a normal strut \NC {\showstruts\setupstrut\strut} \NC \NR
+%D \stoptabulate
+%D
+%D Beware: using an unknown value results in char struts.
+
+\installcorenamespace{struts}
+
+\unexpanded\def\setupstrut
+ {\dosingleempty\spac_struts_setup}
+
+\def\spac_struts_setup[#1]%
+ {\edef\m_strut{#1}%
+ \ifcsname\??struts\m_strut\endcsname
+ \lastnamedcs
+ \else
+ \setcharstrut\m_strut
+ \fi}
+
+\unexpanded\def\synchronizestrut#1% no [] parsing, faster for internal
+ {\edef\m_strut{#1}%
+ \ifcsname\??struts\m_strut\endcsname
+ \lastnamedcs
+ \else
+ \setcharstrut\m_strut
+ \fi}
+
+\unexpanded\def\dosynchronizestrut#1% no [] parsing, faster for internal
+ {\ifcsname\??struts#1\endcsname
+ \lastnamedcs
+ \else
+ \setcharstrut{#1}%
+ \fi}
+
+\unexpanded\def\showstruts % adapts .. is wrong
+ {\c_strut_visual_mode\zerocount
+ \setteststrut
+ \settestcrlf}
+
+\unexpanded\def\showcolorstruts % adapts .. is wrong
+ {\c_strut_visual_mode\plusone
+ \setteststrut
+ \settestcrlf}
+
+\unexpanded\def\setteststrut
+ {\def\strutwidth{.8pt}%
+ \setstrut}
+
+\unexpanded\def\dontshowstruts
+ {\unsetteststrut
+ \settestcrlf}
+
+\unexpanded\def\unsetteststrut
+ {\let\strutwidth\zeropoint
+ \setstrut}
+
+\def\autostrutfactor{1.1}
+
+\unexpanded\def\setautostrut
+ {\begingroup
+ \setbox\scratchbox\copy\strutbox
+ \setstrut
+ \ifdim\strutht>\autostrutfactor\ht\scratchbox
+ \endgroup \setstrut
+ \orelse\ifdim\strutdp>\autostrutfactor\dp\scratchbox
+ \endgroup \setstrut
+ \else
+ \endgroup
+ \fi}
+
+\newbox\nostrutbox \setbox\nostrutbox\emptyhbox
+
+\newtoks\everysetnostrut
+
+\unexpanded\def\setnostrut
+ {\the\everysetnostrut}
+
+\appendtoks
+ \setbox\strutbox\copy\nostrutbox
+ \let\strut\empty
+ \let\endstrut\empty
+ \let\begstrut\empty
+\to \everysetnostrut
+
+%D When enabled, sigstruts will remove themselves if nothing goes inbetween. For
+%D practical reasons we define some boundary characters here.
+
+\unexpanded\def\leftboundary {\protrusionboundary\plusone}
+\unexpanded\def\rightboundary {\protrusionboundary\plustwo}
+\unexpanded\def\signalcharacter{\boundary\plusone\char\zerocount\boundary\plustwo} % not the same as strut signals
+
+\newsignal\strutsignal \setfalse\sigstruts
+
+\unexpanded\def\begstrut
+ {\relax\ifcase\strutht
+ % \ignorespaces % maybe
+ \else
+ \spac_struts_beg
+ \fi}
+
+\def\spac_struts_beg
+ {\ifconditional\sigstruts
+ \spac_struts_beg_signal
+ \else
+ \spac_struts_beg_normal
+ \fi
+ \ignorespaces}
+
+\def\spac_struts_beg_signal
+ {\noindent\horizontalstrut
+ \penalty\plustenthousand
+ \hskip-\strutsignal
+ \hskip\strutsignal}
+
+\def\spac_struts_beg_normal
+ {\boundary\plusone
+ \strut
+ %\boundary\plusone
+ \penalty\plustenthousand
+ %\boundary\plusone
+ \hskip\zeropoint}
+
+\unexpanded\def\endstrut
+ {\relax\ifhmode
+ \ifcase\strutht
+ % \removeunwantedspaces % maybe
+ \else
+ \spac_struts_end
+ \fi
+ \fi}
+
+\def\spac_struts_end
+ {\ifconditional\sigstruts
+ \spac_struts_end_signal
+ \else
+ \spac_struts_end_normal
+ \fi}
+
+\def\spac_struts_end_signal
+ {\ifdim\lastskip=\strutsignal
+ \unskip
+ \unskip
+ \unpenalty
+ \setbox\scratchbox\lastbox
+ \else
+ \penalty\plustenthousand
+ \hskip\zeropoint
+ \strut
+ \fi}
+
+\def\spac_struts_end_normal
+ {\removeunwantedspaces
+ \penalty\plustenthousand
+ %\boundary\plustwo
+ \hskip\zeropoint
+ %\boundary\plustwo
+ \strut
+ \boundary\plustwo}
+
+% unsave:
+%
+% \def\pseudostrut
+% {\bgroup
+% \setnostrut
+% \normalstrut
+% \egroup}
+%
+% try:
+%
+% \startchemie
+% \chemie[ONE,Z0,SB15,MOV1,SB15,Z0][C,C]
+% \stopchemie
+%
+% so:
+
+\unexpanded\def\pseudostrut
+ {\noindent} % better: \dontleavehmode
+
+\let\pseudobegstrut\pseudostrut
+\let\pseudoendstrut\removeunwantedspaces
+
+\unexpanded\def\resetteststrut
+ {\def\strutwidth{\zeropoint}% no let
+ \setstrut}
+
+\ifdefined\setfontparameters \else
+ \def\setfontparameters{\the\everybodyfont}
+\fi
+
+%D Keyword based strutting:
+
+\letvalue{\??struts\v!yes }\setstrut
+\letvalue{\??struts\v!auto }\setautostrut
+\letvalue{\??struts\v!no }\setnostrut
+\letvalue{\??struts\v!cap }\setcapstrut
+\letvalue{\??struts\v!fit }\setfontstrut
+\letvalue{\??struts\v!line }\setstrut
+\letvalue{\??struts\s!default}\setstrut
+\letvalue{\??struts\empty }\setstrut
+
+%D Handy:
+
+\def\baselinedistance{\the\lineheight}
+
+%D We need \type {\normaloffinterlineskip} because the new definition contains an
+%D assignment, and |<|don't ask me why|>| this assignment gives troubles in for
+%D instance the visual debugger.
+
+\unexpanded\def\offinterlineskip
+ {\baselineskip-\thousandpoint
+ \lineskip \zeropoint
+ \lineskiplimit\maxdimen
+ % We also need this here now; thanks to taco for figuring that out!
+ \def\minimumlinedistance{\zeropoint}}
+
+\unexpanded\def\nointerlineskip
+ {\prevdepth-\thousandpoint}
+
+\let\normaloffinterlineskip\offinterlineskip % knuth's original
+
+%D This is tricky. The prevdepth value is still set to the last one even if there is
+%D nothing on the page. The same is true for prevgraf, which doesn't resemble the
+%D value on the current page.
+%D
+%D So, here we kick in a checker but it has to happen after the output group and it
+%D only has to be done once (output can trigger itself!).
+%D
+%D However, prevgraf is somehow bound to hangindent so we can get very nasty side
+%D effects. So, in tne end we use our own variable!
+
+\ifdefined\getnofpreviouslines
+ % defined public at the lua end
+\else
+ \let\getnofpreviouslines\!!zerocount
+\fi
+
+\unexpanded\def\page_otr_synchronize_page_yes
+ {\aftergroup\page_otr_synchronize_page_indeed
+ \glet\page_otr_synchronize_page\relax}
+
+% \unexpanded\def\page_otr_synchronize_page_indeed
+% {\clf_synchronizepage
+% \glet\page_otr_synchronize_page\page_otr_synchronize_page_yes}
+%
+% This has to become an otr method: \s!page_otr_command_synchonize_page
+
+\unexpanded\def\page_otr_synchronize_page_indeed
+ {\ifx\currentoutputroutine\s!multicolumn\else\clf_synchronizepage\fi
+ \glet\page_otr_synchronize_page\page_otr_synchronize_page_yes}
+
+\let\page_otr_synchronize_page\page_otr_synchronize_page_yes
+
+\appendtoks
+ \page_otr_synchronize_page
+\to \everyaftershipout
+
+%D My own one:
+
+\unexpanded\def\spac_helpers_push_interlineskip_yes
+ {\edef\oninterlineskip
+ {\baselineskip \the\baselineskip
+ \lineskip \the\lineskip
+ \lineskiplimit\the\lineskiplimit
+ \noexpand\edef\noexpand\minimumlinedistance{\the\dimexpr\minimumlinedistance}%
+ \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}} % \noexpand not needed
+
+\unexpanded\def\spac_helpers_push_interlineskip_nop
+ {\let\oninterlineskip\setnormalbaselines}
+
+\unexpanded\def\offinterlineskip
+ {\ifdim\baselineskip>\zeropoint
+ \spac_helpers_push_interlineskip_yes
+ \else
+ \spac_helpers_push_interlineskip_nop
+ \fi
+ \normaloffinterlineskip}
+
+\let\oninterlineskip\relax
+
+\unexpanded\def\leaveoutervmode
+ {\ifvmode\ifinner\else
+ \leavevmode
+ \fi\fi}
+
+\unexpanded\def\resetpenalties#1%
+ {\ifdefined#1%
+ #1\minusone
+ \fi}
+
+\unexpanded\def\setpenalties#1#2#3%
+ {\ifdefined#1% space before #3 prevents lookahead problems, needed when #3=text
+ #1\numexpr#2+\plusone\relax\space\doexpandedrecurse{\the\numexpr#2\relax}{ #3}\zerocount\relax
+ \fi}
+
+%D \macros
+%D {keeplinestogether}
+%D
+%D Dirty hack, needed in margin content that can run of a page.
+
+% just before margintexts ... will eventually be done differently in mkiv using
+% attributes
+
+\newcount\c_spac_keep_lines_together
+\let\restoreinterlinepenalty\relax
+
+\unexpanded\def\spac_penalties_restore
+ {\glet\restoreinterlinepenalty\relax
+ \global\resetpenalties\interlinepenalties
+ \global\c_spac_keep_lines_together\zerocount}
+
+\unexpanded\def\keeplinestogether#1%
+ {\ifnum#1>\c_spac_keep_lines_together
+ \global\c_spac_keep_lines_together#1%
+ \global\setpenalties\interlinepenalties\c_spac_keep_lines_together\plustenthousand
+ \glet\restoreinterlinepenalty\spac_penalties_restore
+ \fi}
+
+\def\defaultdisplaywidowpenalty {50}
+\def\defaultwidowpenalty {2000} % was: 1000
+\def\defaultclubpenalty {2000} % was: 800
+\def\defaultbrokenpenalty {100}
+\def\defaultdoublehyphendemerits {10000}
+\def\defaultfinalhyphendemerits {5000}
+\def\defaultadjdemerits {10000}
+
+\def\defaultgriddisplaywidowpenalty {0}
+\def\defaultgridwidowpenalty {0}
+\def\defaultgridclubpenalty {0}
+\def\defaultgridbrokenpenalty {0}
+\def\defaultgriddoublehyphendemerits{10000} % always was so
+\def\defaultgridfinalhyphendemerits {5000} % always was so
+\def\defaultgridadjdemerits {10000} % always was so
+
+\unexpanded\def\nopenalties
+ {\widowpenalty \zerocount
+ \clubpenalty \zerocount
+ \brokenpenalty \zerocount
+ \doublehyphendemerits\zerocount
+ \finalhyphendemerits \zerocount
+ \adjdemerits \zerocount}
+
+\unexpanded\def\setdefaultpenalties
+ {\directsetup{\systemsetupsprefix\s!default}}
+
+\startsetups [\systemsetupsprefix\s!reset]
+ \resetpenalties\widowpenalties
+ \resetpenalties\clubpenalties
+ \resetpenalties\interlinepenalties
+\stopsetups
+
+%D We use \directsetup because it's faster and we know there is no csl:
+
+\startsetups [\systemsetupsprefix\s!default]
+
+ \directsetup{\systemsetupsprefix\s!reset}
+
+ \widowpenalty \defaultwidowpenalty
+ \clubpenalty \defaultclubpenalty
+ \displaywidowpenalty \defaultdisplaywidowpenalty
+ \brokenpenalty \defaultbrokenpenalty
+ \doublehyphendemerits\defaultdoublehyphendemerits
+ \finalhyphendemerits \defaultfinalhyphendemerits
+ \adjdemerits \defaultadjdemerits
+
+\stopsetups
+
+\startsetups [\v!grid] [\systemsetupsprefix\s!default]
+
+ \directsetup{\systemsetupsprefix\s!reset}
+
+ \widowpenalty \defaultgridwidowpenalty
+ \clubpenalty \defaultgridclubpenalty
+ \displaywidowpenalty \defaultgriddisplaywidowpenalty
+ \brokenpenalty \defaultgridbrokenpenalty
+ \doublehyphendemerits\defaultgriddoublehyphendemerits
+ \finalhyphendemerits \defaultgridfinalhyphendemerits
+ \adjdemerits \defaultgridadjdemerits
+
+\stopsetups
+
+%D As an illustration:
+
+\startsetups [\systemsetupsprefix\v!strict]
+
+ \directsetup{\systemsetupsprefix\s!reset}
+
+ \setpenalties \widowpenalties \plustwo \maxdimen
+ \setpenalties \clubpenalties \plustwo \maxdimen
+ \brokenpenalty \maxdimen
+ \doublehyphendemerits \defaultdoublehyphendemerits
+ \finalhyphendemerits \defaultfinalhyphendemerits
+ \adjdemerits \defaultadjdemerits
+
+\stopsetups
+
+\setdefaultpenalties % will happen later in \setuplayout
+
+%D To be checked:
+
+\newbox\b_spac_struts_saved
+
+\unexpanded\def\savestrut {\setbox\b_spac_struts_saved\copy\strutbox}
+\unexpanded\def\savedstrut{\copy \b_spac_struts_saved}
+
+%D Good old blank redone:
+
+%definesystemattribute[kernchars] [public]
+\definesystemattribute[skipcategory] [public]
+\definesystemattribute[skippenalty] [public]
+\definesystemattribute[skiporder] [public]
+\definesystemattribute[snapmethod] [public]
+\definesystemattribute[snapvbox] [public]
+%definesystemattribute[snapcategory] [public]
+
+% TODO: NAMED SNAPPERS
+
+\installcorenamespace{gridsnappers}
+\installcorenamespace{gridsnapperattributes}
+\installcorenamespace{gridsnappersets}
+
+\newskip \bodyfontlineheight
+\newdimen \bodyfontstrutheight
+\newdimen \bodyfontstrutdepth
+
+\newskip \globalbodyfontlineheight % why a skip
+\newdimen \globalbodyfontstrutheight
+\newdimen \globalbodyfontstrutdepth
+
+\def\snappedvboxattribute{\ifgridsnapping attr \snapvboxattribute \attribute\snapmethodattribute\fi}
+\def\setlocalgridsnapping{\ifgridsnapping \attribute \snapvboxattribute \attribute\snapmethodattribute\fi}
+
+\def\spac_grids_set_local_snapping#1%
+ {\ifgridsnapping
+ \doifsomething{#1}%
+ {\spac_grids_snap_value_set{#1}%
+ \attribute \snapvboxattribute \attribute\snapmethodattribute}%
+ \fi}
+
+\def\spac_grids_expand_snapper#1%
+ {\edef\m_spac_snapper
+ {\ifx\m_spac_snapper\empty\else\m_spac_snapper,\fi
+ \ifcsname\??gridsnappersets#1\endcsname
+ \lastnamedcs\else#1%
+ \fi}}
+
+\unexpanded\def\installsnapvalues#1#2%
+ {\let\m_spac_snapper\empty
+ \rawprocesscommacommand[#2]\spac_grids_expand_snapper
+ \edef\currentsnapper{#1:\m_spac_snapper}%
+ \ifcsname\??gridsnapperattributes\currentsnapper\endcsname
+ \scratchcounter\lastnamedcs % already defined
+ \else
+ \scratchcounter\clf_definesnapmethod{#1}{\m_spac_snapper}%
+ \setevalue{\??gridsnapperattributes\currentsnapper}{\the\scratchcounter}%
+ \fi
+ \setevalue{\??gridsnappers#1}{\attribute\snapmethodattribute\the\scratchcounter\relax}%
+ \letvalue{\??gridsnappersets#1}\m_spac_snapper}
+
+\def\theexpandedsnapperset#1{\begincsname\??gridsnappersets#1\endcsname} % only for manuals
+
+\unexpanded\def\usegridparameter#1% no checking here
+ {\edef\m_spac_grid_asked{#1\c!grid}%
+ \ifx\m_spac_grid_asked\empty
+ \attribute \snapvboxattribute\attributeunsetvalue
+ \else
+ \spac_grids_snap_value_set\m_spac_grid_asked
+ \attribute \snapvboxattribute\attribute\snapmethodattribute
+ \fi}
+
+\unexpanded\def\definegridsnapping
+ {\dodoubleargument\spac_grids_define}
+
+\def\spac_grids_define[#1][#2]%
+ {\installsnapvalues{#1}{#2}}
+
+\edef\spac_grids_snap_value_reset
+ {%\gridsnappingfalse
+ \attribute\snapmethodattribute\attributeunsetvalue}
+
+\def\spac_grids_snap_value_set#1%
+ {%\gridsnappingtrue
+ \begincsname\??gridsnappers#1\endcsname}
+
+% maybe:
+%
+% \def\spac_grids_snap_value_set#1%
+% {%\gridsnappingtrue
+% \ifcsname\??gridsnappers#1\endcsname
+% \lastnamedcs
+% \else
+% \definegridsnapping[#1][#1]%
+% \begincsname\??gridsnappers#1\endcsname
+% \fi}
+
+\def\spac_grids_snap_value_auto#1%
+ {\ifcsname\??gridsnappers#1\endcsname
+ \lastnamedcs
+ \else
+ \installsnapvalues\s!dummy{#1}%
+ \csname\??gridsnappers\s!dummy\endcsname
+ \fi}
+
+% \installsnapvalues{loose} {\v!maxdepth:0.8,\v!maxheight:0.8,\v!strut}
+% \installsnapvalues{normal}{\v!maxdepth:1.0,\v!maxheight:1.0,\v!strut}
+% \installsnapvalues{tight} {\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut}
+
+% none don't enlarge
+% halfline enlarge by halfline/halfline
+% line enlarge by line/line
+% strut enlarge by ht/dp (default)
+% first align to top line
+% last align to bottom line
+% mindepth round depth down
+% maxdepth round depth up
+% minheight round height down
+% maxheight round height up
+% local use local interline space
+% offset:-3tp vertical shift within box
+% bottom:lines
+% top:lines
+% box centers a box rounded upwards (box:.5 -> tolerance)
+% min centers a box rounded downwards
+% max centers a box rounded upwards
+
+%D We're not downward compatible with \MKII ! Not yet in interface file:
+
+\definegridsnapping[\v!normal] [\v!maxheight,\v!maxdepth,\v!strut]
+\definegridsnapping[\v!standard] [\v!maxheight,\v!maxdepth,\v!strut]
+\definegridsnapping[\v!yes] [\v!maxheight,\v!maxdepth,\v!strut]
+
+\definegridsnapping[\v!strict] [\v!maxdepth:0.8,\v!maxheight:0.8,\v!strut]
+\definegridsnapping[\v!tolerant] [\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut]
+\definegridsnapping[\v!verytolerant] [\v!maxdepth:1.4,\v!maxheight:1.4,\v!strut]
+
+\definegridsnapping[\v!tolerant:10] [\v!maxdepth:1.1,\v!maxheight:1.1,\v!strut] % 10 pct tolerance
+\definegridsnapping[\v!tolerant:20] [\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut] % 20 pct tolerance
+\definegridsnapping[\v!tolerant:30] [\v!maxdepth:1.3,\v!maxheight:1.3,\v!strut] % 30 pct tolerance
+\definegridsnapping[\v!tolerant:40] [\v!maxdepth:1.4,\v!maxheight:1.4,\v!strut] % 40 pct tolerance
+
+\definegridsnapping[\v!top] [\v!minheight,\v!maxdepth,\v!strut]
+\definegridsnapping[\v!bottom] [\v!maxheight,\v!mindepth,\v!strut]
+\definegridsnapping[\v!both] [\v!minheight,\v!mindepth,\v!strut]
+
+\definegridsnapping[\v!broad] [\v!maxheight,\v!maxdepth,\v!strut,0.8] % maybe 0.85
+\definegridsnapping[\v!fit] [\v!maxheight,\v!maxdepth,\v!strut,1.2] % tight 0.15
+
+\definegridsnapping[\v!first] [\v!first]
+\definegridsnapping[\v!last] [\v!last]
+\definegridsnapping[\v!high] [\v!minheight,\v!maxdepth,\v!none]
+\definegridsnapping[\v!one] [\v!minheight,\v!mindepth]
+\definegridsnapping[\v!low] [\v!maxheight,\v!mindepth,\v!none]
+\definegridsnapping[\v!none] [\v!none]
+\definegridsnapping[\v!line] [\v!line]
+\definegridsnapping[\v!strut] [\v!strut]
+\definegridsnapping[\v!box] [\v!box]
+\definegridsnapping[\v!min] [\v!min]
+\definegridsnapping[\v!max] [\v!max]
+
+\definegridsnapping[\v!middle] [\v!maxheight,\v!maxdepth] % used in placement
+
+\definegridsnapping[\v!math] [\v!maxdepth:1.05,\v!maxheight:1.05,\v!strut] % experimental, maybe 1.1
+\definegridsnapping[\v!math:\v!line] [\v!math,\v!line,\v!split]
+\definegridsnapping[\v!math:\v!halfline] [\v!math,\v!halfline,\v!split]
+\definegridsnapping[\v!math:-\v!line] [\v!math,-\v!line,\v!split]
+\definegridsnapping[\v!math:-\v!halfline][\v!math,-\v!halfline,\v!split]
+
+\unexpanded\def\synchronizelocallinespecs
+ {\bodyfontlineheight \normallineheight
+ \bodyfontstrutheight\strutht
+ \bodyfontstrutdepth \strutdp}
+
+\unexpanded\def\synchronizegloballinespecs
+ {\global\globalbodyfontlineheight \normallineheight
+ \global\globalbodyfontstrutheight\strutht
+ \global\globalbodyfontstrutdepth \strutdp}
+
+\appendtoks
+ \synchronizegloballinespecs
+ \synchronizelocallinespecs
+\to \everysetupglobalinterlinespace
+
+\appendtoks
+ \synchronizelocallinespecs
+\to \everysetuplocalinterlinespace
+
+%D We still have to synchronize these:
+
+\unexpanded\def\synchronizeskipamounts
+ {\bigskipamount
+ \skipfactor\baselineskip
+ \s!plus\skipgluefactor\baselineskip
+ \s!minus\skipgluefactor\baselineskip
+ \relax
+ \medskipamount \bigskipamount \divide\medskipamount \plustwo
+ \smallskipamount\bigskipamount \divide\smallskipamount\plusfour}
+
+%D Snapping.
+
+\newif\ifgridsnapping
+
+%unexpanded\def\moveongrid {\dosingleempty\spac_grids_move_on}
+\unexpanded\def\snaptogrid {\dosingleempty\spac_grids_snap_to}
+\unexpanded\def\placeongrid{\dosingleempty\spac_grids_place_on}
+
+\unexpanded\def\startgridsnapping
+ {\dosingleempty\spac_grids_start_snapping}
+
+\unexpanded\def\spac_grids_start_snapping[#1]%
+ {\snaptogrid[#1]\vbox\bgroup}
+
+\unexpanded\def\stopgridsnapping
+ {\egroup}
+
+% \def\spac_grids_move_on[#1]%
+% {[obsolete]} % gone, unless we set an attribute
+
+\def\spac_grids_place_on[#1]%
+ {\snaptogrid[#1]\vbox} % mark as done
+
+\def\spac_grids_snap_to[#1]% list or predefined
+ {\ifgridsnapping
+ \expandafter\spac_grids_snap_to_indeed
+ \else
+ \expandafter\gobbleoneargument
+ \fi{#1}}
+
+\def\spac_grids_snap_to_indeed#1%
+ {\bgroup
+ \spac_grids_snap_value_reset
+ \dowithnextbox{\spac_grids_snap_to_finish{#1}}}
+
+% eventually there will always be a line snap
+
+\def\spac_grids_snap_to_finish#1%
+ {\ifvbox\nextbox % this will go away
+ \clf_vspacingcollapse\nextbox\relax % isn't that already done?
+ \fi
+ \doifelsenothing{#1}{\spac_grids_snap_value_set\v!normal}{\spac_grids_snap_value_set{#1}}%
+ \clf_vspacingsnap\nextbox\attribute\snapmethodattribute\relax
+ \ifvbox\nextbox\vbox\else\hbox\fi attr \snapmethodattribute \zerocount {\box\nextbox}% no pack (?), we snap
+ \egroup}
+
+\def\spac_grids_check_nop
+ {\gridsnappingfalse
+ \resetsystemmode\v!grid
+ \spac_grids_snap_value_reset}
+
+\def\spac_grids_check_yes
+ {\gridsnappingtrue
+ \setsystemmode\v!grid
+ \spac_grids_snap_value_set\askedgridmode}
+
+\unexpanded\def\synchronizegridsnapping
+ {\edef\askedgridmode{\layoutparameter\c!grid}%
+ \ifx\askedgridmode\v!no % official
+ \spac_grids_check_nop
+ \orelse\ifx\askedgridmode\v!off % for taco and luigi
+ \spac_grids_check_nop
+ \orelse\ifx\askedgridmode\empty % to be sure
+ \spac_grids_check_nop
+ \else
+ \spac_grids_check_yes
+ \fi}
+
+\unexpanded\def\setupgridsnapping[#1]% less overhead than setuplayout (needs testing)
+ {\setlayoutparameter\c!grid{#1}\synchronizegridsnapping}
+
+\unexpanded\def\checkgridmethod#1%
+ {\edef\p_grid{#1}%
+ \ifx\p_grid\empty
+ \let\checkedgridmethod\empty
+ \let\checkedgridscope \v!local
+ \else
+ \splitatcolon\p_grid\checkedgridscope\checkedgridmethod
+ \ifx\checkedgridmethod\empty
+ \ifx\checkedgridscope\v!local\orelse\ifx\checkedgridscope\v!global\else
+ \let\checkedgridmethod\checkedgridscope
+ \let\checkedgridscope \v!local
+ \fi
+ \fi
+ \fi}
+
+\unexpanded\def\applygridmethod#1#2#3% content localsettings (used in head rendering)
+ {\checkgridmethod{#1}%
+ \ifx\checkedgridscope\v!global
+ \ifx\checkedgridmethod\empty \else
+ % we assume that the call is grouped because grouping here has the side
+ % effect that the eventually constructed line will get the value outside
+ % the group
+ %
+ % overkill: \setupgridsnapping[\checkedgridmethod]%
+ % maybe : \spac_grids_snap_value_auto\checkedgridmethod
+ \spac_grids_snap_value_set\checkedgridmethod
+ \fi
+ \hbox{#3}%
+ \else
+ % the extra hbox will trigger the global snapper on top of the local and
+ % we really need that in this case (compatibility etc etc) so here we don't
+ % het an already done hit (otherwise we would not snap)
+ \hbox\bgroup
+ \ifx\checkedgridmethod\empty\orelse\ifconditional\headisdisplay
+ #2%
+ \fi
+ \snaptogrid[\checkedgridmethod]\hbox{#3}%
+ \egroup
+ \fi}
+
+\unexpanded\gdef\page_layouts_calculate_overshoot
+ {\ifgridsnapping\ifcase\layoutlines
+ \getnoflines\textheight
+ \textovershoot\dimexpr\noflines\globalbodyfontlineheight-\textheight\relax
+ \fi\fi}
+
+\unexpanded\def\page_layouts_report_overshoot
+ {\page_layouts_calculate_overshoot
+ \ifdim\textovershoot>\zeropoint
+ \writestatus\m!layouts{gridmode,\space
+ noflines: \the\noflines,\space
+ textheight: \the\textheight,\space
+ textovershoot: \the\textovershoot\space
+ (maybe set number of lines instead)%
+ }%
+ \fi
+ \glet\page_layouts_report_overshoot\page_layouts_calculate_overshoot}
+
+\appendtoks
+ \page_layouts_report_overshoot
+\to \everybeforepagebody
+
+%D Visualization:
+
+\definepalet
+ [grid]
+ [ one=red,
+ two=green,
+ three=blue,
+ four=gray]
+
+\unexpanded\def\setgridtracebox#1[#2]% % maybe reverse the order
+ {\setbox\nextbox#1%
+ {\hbox
+ {\hbox to \zeropoint
+ {\setlayoutcomponentattribute{\v!grid:\v!test}%
+ \color[grid:#2]{\ruledhbox \layoutcomponentboxattribute {\fakebox\nextbox}}%
+ \hss}%
+ \flushnextbox}}}
+
+\setnewconstant\gridboxlinenomode\plusone % 0:nothing 1:all 2:lines 3:frame 4:l/r
+\setnewconstant\gridboxlinemode \plusone
+
+\unexpanded\def\gridboxvbox
+ {\ifcase\gridboxlinemode
+ \vpack
+ \or
+ \ruledvpack
+ \or
+ \vpack
+ \or
+ \ruledvpack
+ \else
+ \ruledvpack
+ \fi}
+
+\def\gridboxwidth{\ifcase\gridboxlinemode0\or.5\or.5\or0\else.5\fi\linewidth}
+
+\unexpanded\def\setgridbox#1#2#3% maybe ifgridsnapping at outer level
+ {\setbox#1\gridboxvbox to #3 % given size
+ {\forgetall
+ \resetvisualizers
+ \resetteststrut
+ \offinterlineskip
+ \hsize#2%
+ \ifcase\gridboxlinenomode\or\or\or
+ \gridboxlinenomode\doifoddpageelse\plusone\plustwo % 3: outer
+ \or
+ \gridboxlinenomode\doifoddpageelse\plustwo\plusone % 4: inner
+ \fi
+ \topskipcorrection
+ \gridboxvbox % calculated size
+ {\getrawnoflines{#3}% \getnoflines{#3}%
+ \scratchdimen\dimexpr#2+\lineheight\relax
+ \dorecurse\noflines
+ {\strut
+ \hskip-.5\lineheight\relax
+ \ifcase\gridboxlinenomode\or
+ \rlap
+ {\hskip\dimexpr.2\bodyfontsize+\scratchdimen\relax
+ \infofont\hbox to \emwidth{\hss\recurselevel}}%
+ \or
+ \llap
+ {\infofont\hbox to \emwidth{\hss\recurselevel}%
+ \hskip.2\bodyfontsize}%
+ \fi
+ \vrule
+ \s!height \gridboxwidth
+ \s!depth \gridboxwidth
+ \s!width \scratchdimen
+ \par}}
+ \vfill}}
+
+%D This has become obsolete:
+
+\def\fuzzysnappedbox#1#2% \box<n> \unvbox<n>
+ {#1#2}
+
+\def\moveboxontogrid#1#2#3% will become obsolete, but it needs checking
+ {}
+
+%D Helper:
+
+\unexpanded\def\spac_helpers_assign_skip#1#2% ook nog \v!halfline+fuzzysnap
+ {\doifelse{#2}\v!line
+ {#1\ifgridsnapping
+ \bodyfontlineheight
+ \else
+ \openlineheight
+ \fi}
+ {\ifgridsnapping
+ \assigndimension{#2}{#1}{.25\bodyfontlineheight}{.5\bodyfontlineheight}\bodyfontlineheight
+ \else
+ \assigndimension{#2}{#1}\smallskipamount\medskipamount\bigskipamount
+ \fi}%
+ \relax}
+
+% \start \dosetstretch{.25em} \setuptolerance[tolerant,stretch] \input tufte \endgraf \stop
+% \start \dosetstretch{.5em} effe flink doorfietsen \stop
+
+% experimental code, not yet interfaced:
+
+% category:
+%
+% 0 == discard discard
+% 1 == only if larger largest
+% 2 == force even if smaller force
+% 3 == only take penalty component penalty
+% 4 == add to existing skip add
+% 5 == disable (ignore following) disable
+% 6 == kill whitespace nowhite
+% 7 == discard previous back
+% 10 == no topskip
+%
+% penalty: larger wins
+% order: larger wins
+% category:2,order:5,penalty:10000,skip:value|kw
+%
+% \defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi}
+
+% todo, in grid mode: builders.vspacing.fixed = false
+%
+% \ifgridsnapping will go
+
+\installcorenamespace{vspacingamount}
+
+\unexpanded\def\definevspacingamount
+ {\dotripleempty\spac_vspacing_define_amount}
+
+\def\spac_vspacing_define_amount[#1][#2][#3]% can be combined
+ {\ifthirdargument
+ \setvalue{\??vspacingamount#1}{\ifgridsnapping#3\else#2\fi}%
+ \orelse\ifsecondargument
+ \setvalue{\??vspacingamount#1}{\ifgridsnapping\lineheight\else#2\fi}%
+ \else
+ \setvalue{\??vspacingamount#1}{\lineheight}%
+ \fi
+ \clf_vspacingsetamount{#1}}
+
+\def\spac_vspacing_no_topskip % use grouped
+ {\attribute\skipcategoryattribute\plusten}
+
+% \installcorenamespace{vspacingamountnormal}
+% \installcorenamespace{vspacingamountgrid}
+
+% \def\spac_vspacing_define_amount[#1][#2][#3]% can be combined
+% {\ifcsname n>#1\endcsname\else
+% \expandafter\newtoks\csname n>#1\endcsname
+% \expandafter\newtoks\csname g>#1\endcsname
+% \fi
+% \csname n>#1\endcsname{#2}%
+% \csname g>#1\endcsname{#3}%
+% \clf_vspacingsetamount{#1}}
+
+\unexpanded\def\definevspacing
+ {\dodoubleempty\spac_vspacing_define}
+
+\def\spac_vspacing_define[#1][#2]%
+ {\clf_vspacingdefine{#1}{#2}}
+
+%D The injector code (generated at the \LUA\ end):
+
+\newtoks\everybeforeblankhandling
+\newtoks\everyafterblankhandling
+
+\newconditional\c_space_vspacing_done
+\newconditional\c_space_vspacing_fixed
+\newconditional\c_space_ignore_parskip
+
+\appendtoks
+ \s_spac_vspacing_temp\zeropoint
+ \attribute\skipcategoryattribute\plusone
+ \attribute\skippenaltyattribute \attributeunsetvalue
+ \attribute\skiporderattribute \attributeunsetvalue
+ \ifgridsnapping
+ \settrue\c_space_vspacing_fixed
+ \else
+ \setfalse\c_space_vspacing_fixed
+ \fi
+\to \everybeforeblankhandling
+
+\appendtoks
+ \s_spac_vspacing_temp\plusone\s_spac_vspacing_temp
+ \ifconditional\c_space_vspacing_fixed \else
+ \s!plus \skipgluefactor\s_spac_vspacing_temp
+ \s!minus\skipgluefactor\s_spac_vspacing_temp
+ \fi
+ \relax
+\to \everyafterblankhandling
+
+\unexpanded\def\setblankpacked
+ {\settrue\c_space_ignore_parskip}
+
+\unexpanded\def\setblankcategory#1%
+ {\settrue\c_space_vspacing_done
+ \attribute\skipcategoryattribute#1\relax}
+
+\unexpanded\def\setblankorder#1%
+ {\attribute\skiporderattribute#1\relax}
+
+\unexpanded\def\fixedblankskip
+ {\settrue\c_space_vspacing_fixed}
+
+\unexpanded\def\flexibleblankskip
+ {\setfalse\c_space_vspacing_fixed}
+
+% \unexpanded\def\addblankskip#1#2#3%
+% {\settrue\c_space_vspacing_done
+% \advance\s_spac_vspacing_temp#1\dimexpr\ifgridsnapping#3\else#2\fi\relax\relax}
+
+\unexpanded\def\setblankpenalty#1%
+ {\flushblankhandling
+ \settrue\c_space_vspacing_done
+ \attribute\skipcategoryattribute \plusthree
+ \attribute\skippenaltyattribute #1\relax
+ \flushblankhandling}
+
+\unexpanded\def\startblankhandling % move this to \vspacing
+ {\par
+ \ifvmode
+ \expandafter\dostartblankhandling
+ \else
+ \expandafter\nostartblankhandling
+ \fi}
+
+\unexpanded\def\nostartblankhandling#1\stopblankhandling
+ {}
+
+\def\dostartblankhandling
+ {\begingroup
+ \setfalse\c_space_vspacing_done
+ \setfalse\c_space_ignore_parskip
+ \the\everybeforeblankhandling}
+
+\unexpanded\def\stopblankhandling
+ {\the\everyafterblankhandling
+ \ifconditional\c_space_vspacing_done
+ \vskip\s_spac_vspacing_temp
+ \fi
+ \ifconditional\c_space_ignore_parskip
+ \endgroup\ignoreparskip
+ \else
+ \endgroup
+ \fi}
+
+\unexpanded\def\flushblankhandling
+ {\the\everyafterblankhandling
+ \ifconditional\c_space_vspacing_done
+ \vskip\s_spac_vspacing_temp
+ \fi
+ \setfalse\c_space_vspacing_done
+ \the\everybeforeblankhandling}
+
+\unexpanded\def\addpredefinedblankskip#1#2%
+ {\settrue\c_space_vspacing_done
+ \advance\s_spac_vspacing_temp#1\dimexpr\csname\??vspacingamount#2\endcsname\relax}
+
+% \unexpanded\def\addpredefinedblankskip#1#2%
+% {\settrue\c_space_vspacing_done
+% \advance\s_spac_vspacing_temp#1\dimexpr\the\csname\ifgridsnapping g\else n\fi>#2\endcsname\relax}
+
+\unexpanded\def\addaskedblankskip#1#2%
+ {\settrue\c_space_vspacing_done
+ \advance\s_spac_vspacing_temp#1\dimexpr#2\relax}
+
+% The main spacer:
+
+\unexpanded\def\vspacing
+ {\doifelsenextoptionalcs\spac_vspacing_yes\spac_vspacing_nop}
+
+\def\spac_vspacing_yes
+ {\ifinpagebody % somewhat weird
+ \expandafter\spac_vspacing_yes_indeed
+ \orelse\ifconditional\c_spac_packed_blank
+ \expandafter\spac_vspacing_yes_indeed
+ \else
+ \expandafter\spac_vspacing_yes_ignore
+ \fi}
+
+\def\spac_vspacing_nop
+ {\ifinpagebody % somewhat weird
+ \expandafter\spac_vspacing_nop_indeed
+ \orelse\ifconditional\c_spac_packed_blank
+ \expandafter\spac_vspacing_nop_indeed
+ \else
+ \expandafter\spac_vspacing_nop_ignore
+ \fi}
+
+\def\spac_vspacing_yes_indeed[#1]%
+ {\ifmmode\else\par\clf_vspacing{#1}\fi}
+
+\def\spac_vspacing_yes_ignore[#1]%
+ {\ifmmode\else\par\fi}
+
+\def\spac_vspacing_nop_indeed
+ {\ifmmode\else\par\clf_vspacing{\currentvspacing}\fi}
+
+\def\spac_vspacing_nop_ignore
+ {\ifmmode\else\par\fi}
+
+\installcorenamespace{vspacing}
+
+\unexpanded\def\directvspacing#1%
+ {\par
+ \ifchkdim#1\or
+ \spac_vspacing_dim_preset{\the\dimexpr#1}%
+ \orelse\ifcsname\??vspacing#1\endcsname
+ \lastnamedcs
+ \else
+ \spac_vspacing_yes_preset{#1}%
+ \fi}
+
+\def\spac_vspacing_dim_preset#1%
+ {\ifcsname\??vspacing#1\endcsname
+ \lastnamedcs
+ \else
+ \spac_vspacing_yes_preset{#1}%
+ \fi}
+
+\def\spac_vspacing_yes_preset#1%
+ {\setxvalue{\??vspacing#1}{\clf_vspacing{#1}}%
+ %\writestatus{}{}%
+ %\writestatus{#1}{\expandafter\meaning\csname\??vspacing#1\endcsname}%
+ %\writestatus{}{}%
+ \csname\??vspacing#1\endcsname}
+
+\def\spac_vspacing_yes_indeed[#1]%
+ {\ifmmode\else
+ \directvspacing{#1}%
+ \fi}
+
+\def\spac_vspacing_nop_indeed
+ {\ifmmode\else
+ \directvspacing\currentvspacing
+ \fi}
+
+\def\directdefaultvspacing
+ {\ifinpagebody % somewhat weird
+ \directvspacing\currentvspacing
+ \orelse\ifconditional\c_spac_packed_blank
+ \directvspacing\currentvspacing
+ \fi}
+
+\def\directcheckedvspacing
+ {\ifinpagebody % somewhat weird
+ \expandafter\directvspacing
+ \orelse\ifconditional\c_spac_packed_blank
+ \expandafter\directvspacing
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\unexpanded\def\useblankparameter#1% faster local variant
+ {\edef\m_spac_blank_asked{#1\c!blank}%
+ \ifx\m_spac_blank_asked\empty\else
+ \directvspacing\m_spac_blank_asked
+ \fi}
+
+%D Handy (and faster):
+
+\unexpanded\def\directvpenalty#1%
+ {\begingroup
+ \attribute\skipcategoryattribute \plusthree
+ \attribute\skippenaltyattribute #1\relax
+ \attribute\skiporderattribute \attributeunsetvalue
+ \vskip\zeropoint
+ \endgroup}
+
+\unexpanded\def\directvskip#1%
+ {\begingroup
+ \attribute\skipcategoryattribute \plusone
+ \attribute\skippenaltyattribute \attributeunsetvalue
+ \attribute\skiporderattribute \attributeunsetvalue
+ \vskip#1\relax
+ \endgroup}
+
+%D These depend on bigskipamount cum suis so we'd better sync them:
+
+\unexpanded\def\setupvspacing
+ {\doifelsenextoptionalcs\setupvspacing_yes\setupvspacing_nop}
+
+\let\currentvspacing\s!default % hm, default, standard ...
+
+\def\setupvspacing_yes[#1]%
+ {\edef\currentvspacing{#1}%
+ \spac_whitespace_setup_nop % yes or no, was forgotten
+ }
+
+\def\setupvspacing_nop
+ {\ifx\empty\currentvspacing % mistakenly had an \else
+ \let\currentvspacing\s!default
+ \fi
+ \spac_whitespace_setup_nop}
+
+\unexpanded\def\restorestandardblank % or default ?
+ {\let\currentvspacing\v!standard}
+
+\let\synchronizevspacing\setupvspacing_nop
+
+%D The \type {category:4} is default.
+
+\definevspacingamount[\v!none] [\zeropoint] [\zeropoint]
+\definevspacingamount[\v!big] [\bigskipamount] [\bodyfontlineheight]
+\definevspacingamount[\v!medium] [\medskipamount] [.5\bodyfontlineheight]
+\definevspacingamount[\v!small] [\smallskipamount] [.25\bodyfontlineheight]
+\definevspacingamount[\v!line] [\openlineheight] [\bodyfontlineheight]
+\definevspacingamount[\v!halfline] [.5\openlineheight] [.5\bodyfontlineheight]
+\definevspacingamount[\v!quarterline] [.25\openlineheight] [.25\bodyfontlineheight]
+\definevspacingamount[\v!formula] [\medskipamount] [.5\bodyfontlineheight]
+\definevspacingamount[\v!white] [\parskip] [\bodyfontwhitespace]
+\definevspacingamount[\v!height] [\strutht] [\bodyfontstrutheight]
+\definevspacingamount[\v!depth] [\strutdp] [\bodyfontstrutdepth]
+
+\definevspacingamount[\v!standard] [.75\openlineheight] [.75\openlineheight] % mkii compatible
+
+\def\bodyfontwhitespace
+ {\dimexpr
+ \ifzeropt\parskip
+ \zeropoint
+ \orelse\ifgridsnapping
+ \bodyfontlineheight
+ \else
+ \parskip
+ \fi
+ \relax}
+
+%D used in itemize \unknown\ always test this:
+
+\newdimen\d_spac_overlay
+
+\def\spac_overlay_lines
+ {\directcheckedvspacing{\v!back,\v!overlay}% \blank[\v!back,\v!overlay]%
+ \nointerlineskip}
+
+% \startitemize[n]
+% \item \input zapf
+% \item \startitemize[a]
+% \item \input knuth
+% \stopitemize
+% \stopitemize
+%
+% \strut \hfill first line \blank[overlay] second line \hfill \strut
+%
+% \ruledvbox {
+% \strut \hfill line 1 \blank[overlay]
+% line 2 \hfill \strut \blank[overlay]
+% \strut \hfill line 3 \hfill \strut
+% }
+%
+% \dorecurse{50}
+% {\startitemize[n] \startitem \startitemize[a] \item #1 \stopitemize \stopitem \stopitemize}
+
+\definevspacing[\v!preference][penalty:-500] % goodbreak
+\definevspacing[\v!samepage] [penalty:10000] % nobreak
+
+\definevspacing[\v!always] [category:0] % hm, internally it's discard
+\definevspacing[\v!max] [category:1]
+\definevspacing[\v!force] [category:2]
+\definevspacing[\v!disable] [category:5]
+\definevspacing[\v!nowhite] [category:6]
+\definevspacing[\v!back] [category:7]
+\definevspacing[\v!packed] [category:8] % noparskip (kind of special)
+\definevspacing[\v!overlay] [category:9]
+\definevspacing[\v!enable] [category:10]
+
+%definevspacing[\v!noparskip] [category:8]
+%definevspacing[\v!notopskip] [category:11]
+
+\definevspacing[\v!weak] [order:0]
+\definevspacing[\v!strong] [order:100]
+
+\definevspacing[\s!default] [\v!white] % was big for a while
+
+\newcount\c_spac_vspacing_special_base \c_spac_vspacing_special_base = 32250 % 4000
+\newcount\c_spac_vspacing_special_step \c_spac_vspacing_special_step = 10 % 250
+\newcount\c_spac_vspacing_special_done
+
+% 2019-05-31 : upgraded a bit to more distinctive samepage-[level]-[0|1|2] names
+
+\unexpanded\def\spac_vspacing_define_same_step#1#2% alternatively we could have samepage-n-m
+ {\begingroup
+ \scratchcounterone\numexpr\plusthree*#1+#2\relax
+ \scratchcountertwo\numexpr\c_spac_vspacing_special_base+\c_spac_vspacing_special_step*\scratchcounterone\relax
+ %\writestatus{defined}{\v!samepage-\number#1-\number#2\space=>\space penalty:\the\scratchcountertwo}%
+ \normalexpanded{\definevspacing[\v!samepage-\number#1-\number#2][penalty:\the\scratchcountertwo]}%
+ \endgroup}
+
+\unexpanded\def\spac_vspacing_define_same_page#1%
+ {\dostepwiserecurse\c_spac_vspacing_special_done{#1}\plusone
+ {\spac_vspacing_define_same_step\recurselevel\zerocount % before
+ \spac_vspacing_define_same_step\recurselevel\plusone % after
+ \spac_vspacing_define_same_step\recurselevel\plustwo}% % whatever
+ \global\c_spac_vspacing_special_done#1\relax}
+
+\spac_vspacing_define_same_page{12} % 12 levels should be more than enough as a start
+
+\def\spac_vspacing_same_page#1#2% level offset (starts at 0)
+ {\ifnum#1>\c_spac_vspacing_special_done
+ \spac_vspacing_define_same_page{#1}%
+ \fi
+ %\writestatus{used}{\v!samepage-\number#1-\number#2}%
+ \vspacing[\v!samepage-\number#1-\number#2]}
+
+\definevspacing[\v!default] [\v!big] % todo: needs to adapt to \setupblank
+\definevspacing[\v!before] [\v!default] % but we need to avoid circular references
+\definevspacing[\v!inbetween][\v!default] % then
+\definevspacing[\v!after] [\v!before]
+
+\setupvspacing
+ [\v!big] % alternatively [\v!standard]
+
+%D Maybe at some point we will differ between \type {\vspacing} and \type {\blank}
+%D (we needed the first one while playing with the new code).
+
+% We keep this one as reference
+%
+% \unexpanded\def\inhibitblank
+% {\vspacing[\v!disable]}
+%
+% but use the following more efficient variant instead:
+
+\unexpanded\def\inhibitblank
+ {\ifvmode
+ \begingroup
+ \attribute\skipcategoryattribute\plusfive
+ \vskip\zeropoint
+ \endgroup
+ \fi}
+
+\let\doinhibitblank\inhibitblank % keep this command, used in styles
+
+\let\defineblank \definevspacing
+\let\setupblank \setupvspacing
+\let\blank \vspacing
+\let\synchronizeblank \synchronizevspacing
+\let\defineblankmethod\definevspacingamount
+
+%D The following command is for Wolfgang. It has to be used with care as it does
+%D {\em not} work in tandem with the other spacing commands.
+
+\installcorenamespace{vspace}
+
+\unexpanded\def\definevspace
+ {\dotripleempty\spac_vspace_define}
+
+\def\spac_vspace_define[#1][#2][#3]%
+ {\ifthirdargument
+ \setvalue{\??vspace#1:#2}{#3}%
+ \else
+ \setvalue{\??vspace:#1}{#2}%
+ \fi}
+
+\letvalue{\??vspace:\s!unknown}\zeropoint
+
+\unexpanded\def\vspace
+ {\dodoubleempty\spac_vspace_inject}
+
+\def\spac_vspace_unknown
+ {\csname\??vspace:\s!unknown\endcsname}
+
+\def\spac_vspace_inject[#1][#2]% use \lastnamedcs
+ {\par
+ \ifvmode
+ \removelastskip
+ \vskip
+ \ifsecondargument
+ \ifcsname\??vspace#1:#2\endcsname
+ \lastnamedcs
+ \orelse\ifcsname\??vspace:#2\endcsname
+ \lastnamedcs
+ \else
+ \spac_vspace_unknown
+ \fi
+ \orelse\iffirstargument
+ \ifcsname\??vspace:#1\endcsname
+ \lastnamedcs
+ \else
+ \spac_vspace_unknown
+ \fi
+ \else
+ \ifcsname\??vspace:\s!default\endcsname
+ \lastnamedcs
+ \else
+ \spac_vspace_unknown
+ \fi
+ \fi
+ \relax
+ \fi}
+
+%D Some preliminary code: a simple and fast hanger, for usage in macros.
+
+\installcorenamespace {hanging}
+
+\installdirectcommandhandler \??hanging {hanging}
+
+\setuphanging
+ [\c!distance=.5\emwidth,
+ \c!location=\v!left,
+ \c!n=\zerocount]
+
+\unexpanded\def\starthanging
+ {\dontleavehmode\bgroup
+ \dosingleempty\spac_hanging_start}
+
+\unexpanded\def\stophanging
+ {\endgraf
+ \egroup}
+
+\let\m_spac_hanging_location\empty
+
+\def\spac_hanging_start[#1]%
+ {\doifelseassignment{#1}
+ {\let\m_spac_hanging_location\empty
+ \setupcurrenthanging[#1]}%
+ {\edef\m_spac_hanging_location{#1}}%
+ \ifx\m_spac_hanging_location\empty
+ \edef\m_spac_hanging_location{\directhangingparameter\c!location}%
+ \fi
+ \dowithnextboxcs\spac_hanging_finish\hbox}
+
+\def\spac_hanging_finish
+ {\scratchdistance\directhangingparameter\c!distance\relax
+ \ifdim\ht\nextbox>\strutht
+ \setbox\nextbox\tbox{\box\nextbox}%
+ \fi
+ \scratchcounter\directhangingparameter\c!n\relax
+ \ifnum\scratchcounter>\zerocount
+ \hangafter-\scratchcounter
+ \else
+ \getboxheight\scratchdimen\of\box\nextbox
+ \getnoflines\scratchdimen
+ \hangafter-\noflines
+ \fi
+ \ht\nextbox\strutht
+ \dp\nextbox\strutdp
+ \scratchwidth\dimexpr\wd\nextbox+\scratchdistance\relax
+ \ifx\m_spac_hanging_location\v!right
+ \hangindent\ifconditional\displaylefttoright-\fi\scratchwidth
+ \rlap{\hskip\dimexpr\hsize-\leftskip-\wd\nextbox\relax\box\nextbox}% \leftskip is new
+ \else
+ \hangindent\ifconditional\displaylefttoright\else-\fi\scratchwidth
+ \llap{\box\nextbox\hskip\scratchdistance}%
+ \fi
+ \ignorespaces}
+
+
+%D \macros
+%D {startfixed}
+%D
+%D \starttyping
+%D \startitemize
+%D \startitem \externalfigure[cow][height=1cm] \stopitem
+%D \startitem \externalfigure[cow][height=1cm] \stopitem
+%D
+%D \startitem \startfixed \externalfigure[cow][height=1cm]\stopfixed \stopitem
+%D \startitem \startfixed[high]\externalfigure[cow][height=1cm]\stopfixed \stopitem
+%D \startitem \startfixed[low] \externalfigure[cow][height=1cm]\stopfixed \stopitem
+%D \startitem \startfixed[lohi]\externalfigure[cow][height=1cm]\stopfixed \stopitem
+%D
+%D \startitem test \par \startfixed \externalfigure[koe][height=1cm]\stopfixed \stopitem
+%D \startitem test \par \startfixed[high]\externalfigure[koe][height=1cm]\stopfixed \stopitem
+%D \startitem test \par \startfixed[low] \externalfigure[koe][height=1cm]\stopfixed \stopitem
+%D \startitem test \par \startfixed[lohi]\externalfigure[koe][height=1cm]\stopfixed \stopitem
+%D \stopitemize
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\installcorenamespace{fixedalternatives}
+
+\unexpanded\def\startfixed
+ {\bgroup
+ \dosingleempty\typo_fixed_start}
+
+\def\typo_fixed_start
+ {\ifhmode
+ \expandafter\typo_fixed_start_h
+ \else
+ \expandafter\typo_fixed_start_v
+ \fi}
+
+\def\typo_fixed_start_h[#1]%
+ {\let\stopfixed\typo_fixed_stop_h
+ \dowithnextbox{\typo_fixed_finish{#1}}%
+ \vbox\bgroup
+ %ignorespaces
+ \setlocalhsize}
+
+\unexpanded\def\typo_fixed_stop_h
+ {%removeunwantedspaces
+ \egroup
+ \egroup}
+
+\def\typo_fixed_start_v[#1]%
+ {\let\stopfixed\typo_fixed_stop_v
+ \startbaselinecorrection}
+
+\unexpanded\def\typo_fixed_stop_v
+ {\stopbaselinecorrection
+ \egroup}
+
+\letvalue{\??fixedalternatives \v!high}\bbox
+\letvalue{\??fixedalternatives \v!low}\tbox
+\letvalue{\??fixedalternatives \v!middle}\vcenter
+\letvalue{\??fixedalternatives \v!lohi}\vcenter
+\letvalue{\??fixedalternatives\s!unknown}\tbox
+\letvalue{\??fixedalternatives\s!default}\tbox
+
+\unexpanded\def\typo_fixed_finish#1%
+ {\expandnamespacevalue\??fixedalternatives{#1}\s!default{\box\nextbox}}
+
+% %D Forgotten already:
+%
+% \def\shapefill{\vskip\zeropoint\s!plus\lineheight\s!minus\lineheight\relax}
+
+%D Nasty:
+
+% \writestatus{1}{\the\prevdepth} \blank[force,5*big] { \writestatus{1}{\the\prevdepth} \baselineskip1cm xxxxxxxxx \par } \page
+% \writestatus{2}{\the\prevdepth} \blank[force,5*big] { \writestatus{2}{\the\prevdepth} \baselineskip1cm xxxxxxxxx \par } \page
+% \writestatus{3}{\the\prevdepth} \blank[force,5*big] { \writestatus{3}{\the\prevdepth} \baselineskip5cm xxxxxxxxx \par } \page
+% \writestatus{4}{\the\prevdepth} \input tufte \page
+% \writestatus{5}{\the\prevdepth} \input tufte \page
+% \writestatus{6}{\the\prevdepth} \blank[force,5*big] { \writestatus{6}{\the\prevdepth} \baselineskip1cm xxxxxxxxx \par } \page
+
+% \writestatus{1}{\the\prevdepth} \null\vskip4cm { \writestatus{1}{\the\prevdepth} \baselineskip1cm xxxxxxxxx \par } \page
+% \writestatus{2}{\the\prevdepth} \null\vskip4cm { \writestatus{2}{\the\prevdepth} \baselineskip1cm xxxxxxxxx \par } \page
+% \writestatus{3}{\the\prevdepth} \null\vskip4cm { \writestatus{3}{\the\prevdepth} \baselineskip5cm xxxxxxxxx \par } \page
+% \writestatus{4}{\the\prevdepth} \input tufte \page
+% \writestatus{5}{\the\prevdepth} \input tufte \page
+% \writestatus{6}{\the\prevdepth} \null\vskip4cm { \writestatus{6}{\the\prevdepth} \baselineskip1cm xxxxxxxxx \par } \page
+
+\appendtoks
+ \ifvmode\prevdepth\zeropoint\fi % consistent, else first page -1000pt .. needed for fixed,3*big first/successive pages consistency
+\to \everystarttext
+
+\prevdepth\zeropoint
+
+%D Helper:
+
+\unexpanded\def\checkedblank[#1]%
+ {\edef\p_blank{#1}%
+ \ifx\p_blank\empty
+ % ignore
+ \orelse\ifx\p_blank\v!none
+ % ignore
+ \else
+ \blank[\p_blank]%
+ \fi}
+
+% \setupwhitespace[line]
+% \prerollblank[2*line] \the\prerolledblank
+% \prerollblank[-2*line] \the\prerolledblank
+
+\newskip\prerolledblank
+
+\unexpanded\def\prerollblank[#1]%
+ {\begingroup
+ \edef\p_blank{#1}%
+ \ifx\p_blank\empty
+ \global\prerolledblank\zeropoint
+ \orelse\ifx\p_blank\v!none
+ \global\prerolledblank\zeropoint
+ \else
+ % don't mess with \arskip here!
+ \scratchskip\plusten\lineheight
+ \setbox\scratchbox\vbox
+ {\vskip\scratchskip
+ \kern\zeropoint
+ \blank[\p_blank]}%
+ % \dimexpr doesn't work well with skips
+ \advance\scratchskip-\ht\scratchbox
+ \global\prerolledblank-\scratchskip
+ \fi
+ \endgroup}
+
+\newcount\c_spac_vspacing_ignore_parskip
+
+% \setupwhitespace[line]
+% \setuphead[subject][after={\blank[packed]},style=\bfb]
+% \subject{foo}
+% test \par
+% test \par
+% \blank[packed] % \ignoreparskip
+% test \par
+% test \par
+% \ignoreparskip
+% test \par
+% test \par
+% \setuphead[subject][after={\blank[nowhite]},style=\bfb]
+% \subject{foo}
+% test \par
+% test \par
+
+\unexpanded\def\ignoreparskip{\c_spac_vspacing_ignore_parskip\plusone}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/status-files.pdf b/Master/texmf-dist/tex/context/base/mkiv/status-files.pdf
index 211e6773fae..baed04d322d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/status-files.pdf
+++ b/Master/texmf-dist/tex/context/base/mkiv/status-files.pdf
Binary files differ
diff --git a/Master/texmf-dist/tex/context/base/mkiv/status-lua.pdf b/Master/texmf-dist/tex/context/base/mkiv/status-lua.pdf
index a9c4cb67312..9e63b48f6bd 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/status-lua.pdf
+++ b/Master/texmf-dist/tex/context/base/mkiv/status-lua.pdf
Binary files differ
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-bkm.lua b/Master/texmf-dist/tex/context/base/mkiv/strc-bkm.lua
index ee9233a9ae6..41a12833305 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-bkm.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-bkm.lua
@@ -42,6 +42,19 @@ local opened = { }
local forced = { }
local numbered = { }
+function bookmarks.setopened(key,value)
+ if value == nil then
+ value = true
+ end
+ if type(key) == "table" then
+ for i=1,#key do
+ opened[key[i]] = value
+ end
+ else
+ opened[key] = value
+ end
+end
+
function bookmarks.register(settings)
local force = settings.force == variables.yes
local number = settings.number == variables.yes
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-blk.lua b/Master/texmf-dist/tex/context/base/mkiv/strc-blk.lua
index 89df440c966..6717c37773a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-blk.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-blk.lua
@@ -118,10 +118,12 @@ function blocks.select(state,name,tag,criterium)
printblock(ri.index,name,ri.data,hide)
else
local mtags = metadata.tags
- for tag, sta in next, tags do
- if mtags[tag] then
- printblock(ri.index,name,ri.data,hide)
- break
+ if mtags then
+ for tag, sta in next, tags do
+ if mtags[tag] then
+ printblock(ri.index,name,ri.data,hide)
+ break
+ end
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-con.mkvi b/Master/texmf-dist/tex/context/base/mkiv/strc-con.mkvi
index d67307ba73b..8c75eb6df5e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-con.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-con.mkvi
@@ -737,7 +737,7 @@
\stopsetups
\startsetups[\??constructionrenderings:\v!top]
- \strc_sectioning_prevent_page_break\plusone
+ % \strc_sectioning_prevent_page_break % commented per 31/5/2019
\let\\=\space
\noindent
\copy\constructionheadbox % why copy ?
@@ -746,6 +746,7 @@
\edef\p_strc_constructions_inbetween{\constructionparameter\c!inbetween}%
\ifx\p_strc_constructions_inbetween\empty \else
\p_strc_constructions_inbetween
+ % shouldn't this move to after the fi?
\directcheckedvspacing\v!samepage
\fi
\useconstructionstyleandcolor\c!style\c!color
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-def.mkiv b/Master/texmf-dist/tex/context/base/mkiv/strc-def.mkiv
index 941f561c8ef..52b3b3ad972 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-def.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-def.mkiv
@@ -90,13 +90,18 @@
% \definesection (could become \definehead with one parameter)
-\definesection[\s!section-1] % part
-\definesection[\s!section-2] % chapter
-\definesection[\s!section-3] % section
-\definesection[\s!section-4] % subsection
-\definesection[\s!section-5] % subsubsection
-\definesection[\s!section-6] % subsubsubsection
-\definesection[\s!section-7] % subsubsubsubsection
+\definesection[\s!section-1] % part
+\definesection[\s!section-2] % chapter
+\definesection[\s!section-3] % section
+\definesection[\s!section-4] % subsection
+\definesection[\s!section-5] % subsubsection
+\definesection[\s!section-6] % subsubsubsection
+\definesection[\s!section-7] % subsubsubsubsection
+\definesection[\s!section-8] % subsubsubsubsubsection
+\definesection[\s!section-9] % subsubsubsubsubsubsection
+\definesection[\s!section-10] % subsubsubsubsubsubsubsection
+\definesection[\s!section-11] % subsubsubsubsubsubsubsubsection
+\definesection[\s!section-12] % subsubsubsubsubsubsubsubsubsection
% \definehead
@@ -133,6 +138,31 @@
\c!default=\v!subsubsubsection]
\definehead
+ [\v!subsubsubsubsubsection]
+ [\c!section=\s!section-8,
+ \c!default=\v!subsubsubsubsection]
+
+\definehead
+ [\v!subsubsubsubsubsubsection]
+ [\c!section=\s!section-9,
+ \c!default=\v!subsubsubsubsubsection]
+
+\definehead
+ [\v!subsubsubsubsubsubsubsection]
+ [\c!section=\s!section-10,
+ \c!default=\v!subsubsubsubsubsubsection]
+
+\definehead
+ [\v!subsubsubsubsubsubsubsubsection]
+ [\c!section=\s!section-11,
+ \c!default=\v!subsubsubsubsubsubsubsection]
+
+\definehead
+ [\v!subsubsubsubsubsubsubsubsubsection]
+ [\c!section=\s!section-12,
+ \c!default=\v!subsubsubsubsubsubsubsubsection]
+
+\definehead
[\v!title]
[\c!coupling=\v!chapter,
\c!default=\v!chapter,
@@ -168,63 +198,6 @@
\c!default=\v!subsubsubsubsection,
\c!incrementnumber=\v!no]
-\setuphead
- [\v!part]
- [\c!placehead=\v!no]
-
-\setuphead
- [\v!chapter]
- [\v!appendix\c!label=\v!appendix,
- \v!bodypart\c!label=\v!chapter] % bijlageconversie=\Character
-
-\setuphead
- [\v!section]
- [\v!appendix\c!label=\v!section,
- \v!bodypart\c!label=\v!section] % bijlageconversie=\Character
-
-\setuphead
- [\v!subsection]
- [\v!appendix\c!label=\v!subsection,
- \v!bodypart\c!label=\v!subsection] % bijlageconversie=\Character
-
-\setuphead
- [\v!subsubsection]
- [\v!appendix\c!label=\v!subsubsection,
- \v!bodypart\c!label=\v!subsubsection] % bijlageconversie=\Character
-
-% extras
-
-\definesection[\s!section-8] % subsubsubsubsubsection
-\definesection[\s!section-9] % subsubsubsubsubsubsection
-\definesection[\s!section-10] % subsubsubsubsubsubsubsection
-\definesection[\s!section-11] % subsubsubsubsubsubsubsubsection
-\definesection[\s!section-12] % subsubsubsubsubsubsubsubsubsection
-
-\definehead
- [\v!subsubsubsubsubsection]
- [\c!section=\s!section-8,
- \c!default=\v!subsubsubsubsection]
-
-\definehead
- [\v!subsubsubsubsubsubsection]
- [\c!section=\s!section-9,
- \c!default=\v!subsubsubsubsubsection]
-
-\definehead
- [\v!subsubsubsubsubsubsubsection]
- [\c!section=\s!section-10,
- \c!default=\v!subsubsubsubsubsubsection]
-
-\definehead
- [\v!subsubsubsubsubsubsubsubsection]
- [\c!section=\s!section-11,
- \c!default=\v!subsubsubsubsubsubsubsection]
-
-\definehead
- [\v!subsubsubsubsubsubsubsubsubsection]
- [\c!section=\s!section-12,
- \c!default=\v!subsubsubsubsubsubsubsubsection]
-
\definehead
[\v!subsubsubsubsubsubject]
[\c!coupling=\v!subsubsubsubsubsection,
@@ -255,6 +228,34 @@
\c!default=\v!subsubsubsubsubsubsubsubsubsection,
\c!incrementnumber=\v!no]
+% setups
+
+\setuphead
+ [\v!part]
+ [\c!placehead=\v!no]
+
+\setuphead
+ [\v!chapter]
+ [\v!appendix\c!label=\v!appendix,
+ \v!bodypart\c!label=\v!chapter] % bijlageconversie=\Character
+
+\setuphead
+ [\v!section]
+ [\v!appendix\c!label=\v!section,
+ \v!bodypart\c!label=\v!section] % bijlageconversie=\Character
+
+\setuphead
+ [\v!subsection]
+ [\v!appendix\c!label=\v!subsection,
+ \v!bodypart\c!label=\v!subsection] % bijlageconversie=\Character
+
+\setuphead
+ [\v!subsubsection]
+ [\v!appendix\c!label=\v!subsubsection,
+ \v!bodypart\c!label=\v!subsubsection] % bijlageconversie=\Character
+
+% prefixes
+
\defineprefixset
[\v!all]
[section-1,section-2,section-3,section-4,section-5,section-6,section-7,%
@@ -321,12 +322,17 @@
[\c!before={\blank[\v!preference,\v!big]}, % sort of mkii compatible, watch columns
\c!after=]
-\setuplist [\v!part] [\c!width=0\emwidth]
-\setuplist [\v!chapter] [\c!width=2\emwidth]
-\setuplist [\v!section] [\c!width=3\emwidth]
-\setuplist [\v!subsection] [\c!width=4\emwidth]
-\setuplist [\v!subsubsection] [\c!width=5\emwidth]
-\setuplist [\v!subsubsubsection] [\c!width=6\emwidth]
+\setuplist [\v!part] [\c!width=0\emwidth]
+\setuplist [\v!chapter] [\c!width=2\emwidth]
+\setuplist [\v!section] [\c!width=3\emwidth]
+\setuplist [\v!subsection] [\c!width=4\emwidth]
+\setuplist [\v!subsubsection] [\c!width=5\emwidth]
+\setuplist [\v!subsubsubsection] [\c!width=6\emwidth]
\setuplist [\v!subsubsubsubsection] [\c!width=7\emwidth]
+\setuplist [\v!subsubsubsubsubsection] [\c!width=8\emwidth]
+\setuplist [\v!subsubsubsubsubsubsection] [\c!width=9\emwidth]
+\setuplist [\v!subsubsubsubsubsubsubsection] [\c!width=10\emwidth]
+\setuplist [\v!subsubsubsubsubsubsubsubsection] [\c!width=11\emwidth]
+\setuplist [\v!subsubsubsubsubsubsubsubsubsection] [\c!width=12\emwidth]
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-doc.lua b/Master/texmf-dist/tex/context/base/mkiv/strc-doc.lua
index 4b2ac04b7f3..9877a0f9c0e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-doc.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-doc.lua
@@ -41,7 +41,7 @@ local v_positive = variables.positive
local v_current = variables.current
local trace_sectioning = false trackers.register("structures.sectioning", function(v) trace_sectioning = v end)
-local trace_detail = false trackers.register("structures.detail", function(v) trace_detail = v end)
+local trace_details = false trackers.register("structures.details", function(v) trace_details = v end)
local report_structure = logs.reporter("structure","sectioning")
local report_used = logs.reporter("structure")
@@ -335,7 +335,7 @@ function sections.setentry(given)
-- a trick to permit userdata to overload title, ownnumber and reference
-- normally these are passed as argument but nowadays we provide several
-- interfaces (we need this because we want to be compatible)
- if trace_detail then
+ if trace_details then
report_structure("name %a, mapped level %a, old depth %a, new depth %a, reset set %a",
givenname,mappedlevel,olddepth,newdepth,resetset)
end
@@ -354,7 +354,7 @@ function sections.setentry(given)
if newdepth > olddepth then
for i=olddepth+1,newdepth do
local s = tonumber(sets.get("structure:resets",data.block,saveset and saveset[i] or resetset,i))
- if trace_detail then
+ if trace_details then
report_structure("new depth %s, old depth %s, reset set %a, reset value %a, current %a",olddepth,newdepth,resetset,s,numbers[i])
end
if not s or s == 0 then
@@ -369,7 +369,7 @@ function sections.setentry(given)
elseif newdepth < olddepth then
for i=olddepth,newdepth+1,-1 do
local s = tonumber(sets.get("structure:resets",data.block,saveset and saveset[i] or resetset,i))
- if trace_detail then
+ if trace_details then
report_structure("new depth %s, old depth %s, reset set %a, reset value %a, current %a",olddepth,newdepth,resetset,s,numbers[i])
end
if not s or s == 0 then
@@ -402,12 +402,12 @@ function sections.setentry(given)
newn = 1 -- maybe zero is nicer
end
forced[newdepth] = nil
- if trace_detail then
+ if trace_details then
report_structure("old depth %a, new depth %a, old n %a, new n %a, forced %t",olddepth,newdepth,oldn,newn,fd)
end
else
newn = oldn + 1
- if trace_detail then
+ if trace_details then
report_structure("old depth %a, new depth %a, old n %a, new n %a, increment",olddepth,newdepth,oldn,newn)
end
end
@@ -426,7 +426,7 @@ function sections.setentry(given)
if #ownnumbers > 0 then
numberdata.ownnumbers = fastcopy(ownnumbers) -- { unpack(ownnumbers) }
end
- if trace_detail then
+ if trace_details then
report_structure("name %a, numbers % a, own numbers % a",givenname,numberdata.numbers,numberdata.ownnumbers)
end
if not references.block then
@@ -672,8 +672,15 @@ local function process(index,numbers,ownnumbers,criterium,separatorset,conversio
end
end
-function sections.typesetnumber(entry,kind,...) -- kind='section','number','prefix'
- if entry and entry.hidenumber ~= true then -- can be nil
+-- kind : section number prefix
+
+function sections.typesetnumber(entry,kind,...)
+ --
+ -- Maybe the hiding becomes an option .. after all this test was there
+ -- for a reason, but for now we have this:
+ --
+ -- if entry and entry.hidenumber ~= true then
+ if entry then
local separatorset = ""
local conversionset = ""
local conversion = ""
@@ -878,7 +885,7 @@ function sections.findnumber(depth,what) -- needs checking (looks wrong and slow
if sectiondata and sectiondata.hidenumber ~= true then -- can be nil
local quit = what == v_previous or what == v_next
if what == v_first or what == v_previous then
- for i=index,1,-1 do
+ for i=index-1,1,-1 do
local s = collected[i]
if s then
local n = s.numbers
@@ -893,7 +900,7 @@ function sections.findnumber(depth,what) -- needs checking (looks wrong and slow
end
end
elseif what == v_last or what == v_next then
- for i=index,#collected do
+ for i=index+1,#collected do
local s = collected[i]
if s then
local n = s.numbers
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-flt.mkvi b/Master/texmf-dist/tex/context/base/mkiv/strc-flt.mkvi
index 02f6fd75343..d6a6723d7be 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-flt.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-flt.mkvi
@@ -173,13 +173,26 @@
%\c!bottomafter=,
%\c!default=, % default location
\c!sidethreshold=.5\strutdp, % set to "old" to check with old method
- \c!numbering=\v!yes]
+ \c!numbering=\v!yes,
+ \c!compress=\v!yes, % when possible pack floats when flushing
+ \c!compressdistance=\emwidth]
\setupfloatframed
[\c!frame=\v!off,
\c!offset=\v!overlay,
\c!strut=\v!no]
+\appendtoks
+ \doifelse{\floatparameter\c!compress}\v!yes\settrue\setfalse\c_page_floats_pack_flushed
+ \d_page_floats_compress_distance\floatparameter\c!compressdistance\relax
+\to \everysetupfloat
+
+%D We need to do it again here:
+
+\setupfloat
+ [\c!compress=\v!yes, % when possible pack floats when flushing
+ \c!compressdistance=\emwidth]
+
%D Individial settings:
\installcounterassociation{floatcaption}
@@ -312,30 +325,86 @@
\let\floatcaptionsuffix\empty % an optional suffix
\let\floatcaptionnumber\empty % a logical counter
-% the split is needed when for instance the float goes into
-% a multi page field and the list of figs becomes larger than
-% one page: cycle between 'only flush when object ref ok'
-% and 'one/many page fig list'; see "uguide finometer"
+% For a while these were placeholders:
%
-% potential sync bug with sectionblocks, see uguide.tex
-
-% begin of todo
-
-\unexpanded\def\placefloatcaption{\dodoubleempty\strc_floats_place_caption}
-\unexpanded\def\setfloatcaption {\dodoubleempty\strc_floats_set_caption}
-
-\def\strc_floats_place_caption[#tag][#reference]#caption{[not supported]}
-\def\strc_floats_set_caption [#tag][#reference]#caption{[not supported]}
-
-\unexpanded\def\placefloatcaptiontext [#tag]{[not suported yet]}
-\unexpanded\def\placefloatcaptionnumber [#tag]{[not suported yet]}
-\unexpanded\def\placefloatcaptionreference[#tag]{[not suported yet]}
-
-\let\placefloatlabel \placefloatcaption
-\let\placefloatlabeltext \placefloatcaptiontext
-\let\placefloatlabelreference\placefloatcaptionreference
-
-% end of todo
+%D \starttyping
+%D \unexpanded\def\placefloatcaption{\dodoubleempty\strc_floats_place_caption}
+%D \unexpanded\def\setfloatcaption {\dodoubleempty\strc_floats_set_caption}
+%D
+%D \def\strc_floats_place_caption[#tag][#reference]#caption{[not supported]}
+%D \def\strc_floats_set_caption [#tag][#reference]#caption{[not supported]}
+%D
+%D \unexpanded\def\placefloatcaptiontext [#tag]{[not suported yet]}
+%D \unexpanded\def\placefloatcaptionnumber [#tag]{[not suported yet]}
+%D \unexpanded\def\placefloatcaptionreference[#tag]{[not suported yet]}
+%D \stoptyping
+%D
+%D because in \MKII\ we had:
+%D
+%D \starttyping
+%D \let\placefloatlabel \placefloatcaption
+%D \let\placefloatlabeltext \placefloatcaptiontext
+%D \let\placefloatlabelreference\placefloatcaptionreference
+%D \stoptyping
+%D
+%D But as it was never advertised we don't provide it in \MKIV. However, at some
+%D point HvdM wanted this:
+%D
+%D \starttyping
+%D \placefigure {labeltext-1} {\externalfigure[figure-1]}
+%D \placefloatcaption[figure][title={labeltext-2}] \externalfigure[figure-2]
+%D \placefigure {labeltext-3} {\externalfigure[figure-3]}
+%D \stoptyping
+%D
+%D So there you have it:
+
+\unexpanded\def\placefloatcaption
+ {\dotripleempty\strc_floats_place_caption}
+
+\def\strc_floats_place_caption[#category][#settings][#userdata]%
+ {\ifsecondargument
+ % we need at least a category and title
+ \dontleavehmode
+ \bgroup
+ \edef\currentfloat{#category}%
+ \let\currentfloatcaption\currentfloat
+ \resetfloatcaptionparameter\c!reference
+ \resetfloatcaptionparameter\c!title
+ \resetfloatcaptionparameter\c!marking
+ \resetfloatcaptionparameter\c!list
+ \resetfloatcaptionparameter\c!bookmark
+ \setupcurrentfloatcaption[#settings]%
+ \edef\currentfloatcounter{\namedcounterparameter\currentfloat\s!name}%
+ \iftrialtypesetting\strc_counters_save\currentfloatcounter\fi
+ \strc_counters_increment\currentfloatcounter
+ \strc_counters_register_component
+ \s!float
+ \setupcurrentfloatcaption
+ \floatcaptionparameter
+ \detokenizedfloatcaptionparameter
+ \relax
+ \relax
+ \relax
+ [\s!name=\currentfloat,
+ \s!counter=\currentfloatcounter,%
+ \s!hascaption=\v!yes,%
+ \s!hasnumber=\v!yes,%
+ \s!hastitle=\v!yes]%
+ [#userdata]%
+ \glet\previousfloatnumber \m_strc_counters_last_registered_index
+ \glet\currentfloatnumber \m_strc_counters_last_registered_index
+ \glet\currentfloatattribute \m_strc_counters_last_registered_attribute
+ \glet\currentfloatsynchronize\m_strc_counters_last_registered_synchronize
+ %
+ % \iflocation
+ % \attribute\destinationattribute\currentfloatattribute\relax
+ % \fi
+ \currentfloatsynchronize
+ \strc_floats_make_complete_caption
+ %
+ \iftrialtypesetting\strc_counters_restore\currentfloatcounter\fi
+ \egroup
+ \fi}
\newbox \b_strc_floats_caption
\newbox \b_strc_floats_content
@@ -349,25 +418,34 @@
\noindent
\gdef\lastcaptiontag{\strut\thecurrentfloatnumber}% was xdef ... needs checking
\begingroup
- \usefloatcaptionstyleandcolor\c!style\c!color
- \clf_doifelselisthastitle{\currentfloat}\numexpr\currentfloatnumber\relax
- \donothing
- \emptyfloatcaptiontrue
- \ifnofloatnumber
- \else
- \hbox{\usefloatcaptionstyleandcolor\c!headstyle\c!headcolor\thecurrentfloatnumber}%
- \ifnofloatcaption \else \ifemptyfloatcaption \else
- \doifelsenothing{\floatcaptionparameter\c!spaceinbetween}
- {\floatcaptionparameter\c!headseparator\relax
- \scratchskip\floatcaptionparameter\c!distance\relax
- \dotfskip\scratchskip\emergencystretch.5\scratchskip}
- {\blank[\floatcaptionparameter\c!spaceinbetween]}%
- \fi \fi
- \fi
\ifnofloatcaption
\global\d_strc_floats_caption_height\zeropoint
\global\d_strc_floats_caption_depth \zeropoint
\else
+ \usefloatcaptionstyleandcolor\c!style\c!color
+ \clf_doifelselisthastitle{\currentfloat}\numexpr\currentfloatnumber\relax
+ \donothing
+ \emptyfloatcaptiontrue
+ \ifnofloatnumber \else \ifnofloatcaption \else
+ \ifemptyfloatcaption
+ \hbox{\usefloatcaptionstyleandcolor\c!headstyle\c!headcolor\thecurrentfloatnumber}%
+ \else
+ \doifelsenothing{\floatcaptionparameter\c!spaceinbetween}
+ {\scratchskip\floatcaptionparameter\c!distance\relax
+ \setbox\scratchbox\hbox
+ {\usefloatcaptionstyleandcolor\c!headstyle\c!headcolor
+ \thecurrentfloatnumber
+ \floatcaptionparameter\c!headseparator
+ \dotfskip\scratchskip}%
+ \doifelse{\floatcaptionparameter\c!hang}\v!yes
+ {\leftskip\wd\scratchbox
+ \llap{\box\scratchbox}}
+ {\unhbox\scratchbox}%
+ \emergencystretch.5\scratchskip}
+ {\hbox{\usefloatcaptionstyleandcolor\c!headstyle\c!headcolor\thecurrentfloatnumber}%
+ \blank[\floatcaptionparameter\c!spaceinbetween]}%
+ \fi
+ \fi \fi
\usefloatcaptionstyleandcolor\c!textstyle\c!textcolor
\global\d_strc_floats_caption_height\strutheight
\global\d_strc_floats_caption_depth \strutdepth
@@ -429,7 +507,7 @@
% new, \placefigure{\xmlfirst{#1}{somecaption}}{} passes earlier empty check
% so here we misuse the scratch box; actually this means that the previous
% test can go away (some day, when i redo this module)
- \ifdim\wd\b_strc_floats_caption=\zeropoint
+ \ifzeropt\wd\b_strc_floats_caption
\global\emptyfloatcaptiontrue
\ifnofloatnumber
\global\nofloatcaptiontrue
@@ -770,11 +848,47 @@
\strc_floats_finish_placement}
\vbox}
+%D \starttyping
+%D \definefloat
+%D [one] [figure]
+%D [default=right,
+%D rightmargindistance=-20cm,
+%D criterium=129pt,
+%D fallback=rightmargin]
+%D
+%D \definefloat
+%D [two] [figure]
+%D [default=right,
+%D rightmargindistance=-20cm,
+%D criterium=129pt,
+%D fallback=three]
+%D
+%D \definefloat
+%D [three] [figure]
+%D [default=rightmargin,
+%D rightmargindistance=0cm]
+%D
+%D \placefloat[one]{}{\blackrule[width=30pt]} \samplefile{tufte}
+%D \placefloat[one]{}{\blackrule[width=60pt]} \samplefile{tufte}
+%D \placefloat[one]{}{\blackrule[width=90pt]} \samplefile{tufte}
+%D \placefloat[one]{}{\blackrule[width=130pt]} \samplefile{tufte}
+%D \placefloat[two]{}{\blackrule[width=130pt]} \samplefile{tufte}
+%D \stoptyping
+
\def\strc_floats_finish_placement
{\doifsomething{\floatparameter\c!criterium}
{\ifdim\wd\nextbox>\floatparameter\c!criterium\relax
\edef\forcedfloatmethod{\floatparameter\c!fallback}%
- \ifx\forcedfloatmethod\empty\let\forcedfloatmethod\v!here\fi
+ \ifx\forcedfloatmethod\empty \else
+ \doifelsecommandhandler\??float\forcedfloatmethod
+ {\let\currentfloat\forcedfloatmethod
+ \edef\floatlocation{\floatparameter\c!default}%
+ \let\forcedfloatmethod\floatlocation}
+ \donothing
+ \fi
+ \ifx\forcedfloatmethod\empty
+ \let\forcedfloatmethod\v!here
+ \fi
\fi}%
\strc_floats_check_extra_actions
\strc_floats_analyze_variables_two
@@ -794,6 +908,7 @@
\newdimen\d_strc_floats_top
\newdimen\d_strc_floats_bottom
+\newdimen\d_strc_floats_overflow
% \def\strc_floats_calculate_skip#target#skip%
% {\begingroup
@@ -842,6 +957,7 @@
\global\c_page_one_float_method \floatparameter\c!textmethod
\global\c_page_floats_n_of_top \rootfloatparameter\c!ntop
\global\c_page_floats_n_of_bottom\rootfloatparameter\c!nbottom
+ \global\d_strc_floats_overflow \zeropoint
\ifconditional\c_strc_floats_par_float
\global\d_strc_floats_top \zeropoint
\global\d_strc_floats_bottom \zeropoint
@@ -922,15 +1038,28 @@
\def\naturalfloatwidth {\the\naturalfloatht}
\def\naturalfloatdepth {\the\naturalfloatdp}
+\def\floatcaptionheight{\the\floatcaptionwd}
+\def\floatcaptionwidth {\the\floatcaptionht}
+\def\floatcaptiondepth {\the\floatcaptiondp}
+
\newdimen\naturalfloatwd
\newdimen\naturalfloatht
\newdimen\naturalfloatdp
+\newdimen\floatcaptionwd
+\newdimen\floatcaptionht
+\newdimen\floatcaptiondp
+
\def\strc_floats_set_natural_dimensions#box%
{\global\naturalfloatwd\wd#box\relax
\global\naturalfloatht\ht#box\relax
\global\naturalfloatdp\dp#box\relax}
+\def\strc_floats_set_caption_dimensions#box%
+ {\global\floatcaptionwd\wd#box\relax
+ \global\floatcaptionht\ht#box\relax
+ \global\floatcaptiondp\dp#box\relax}
+
\def\doifelsemainfloatbody
{\ifinsidesplitfloat
\ifconditional\splitfloatfirstdone
@@ -950,8 +1079,9 @@
\def\floatcaptionattribute
{\iflocation
- %\ifnofloatnumber
- %\else
+ \ifx\currentfloatattribute\empty
+ % safeguard, can be samepage too
+ \else
\ifnofloatcaption
\else
\ifinsidesplitfloat
@@ -963,7 +1093,7 @@
attr \destinationattribute \currentfloatattribute
\fi
\fi
- %\fi
+ \fi
\fi}
\newconditional\usesamefloatnumber
@@ -1026,12 +1156,12 @@
\glet\currentfloatsynchronize\m_strc_counters_last_registered_synchronize
\fi
%
- \global\setfalse\usesamefloatnumber % one shot
+ \iftrialtypesetting\else\global\setfalse\usesamefloatnumber\fi % one shot
% check float box
\strc_floats_set_natural_dimensions\nextbox
\global\setbox\floatbox\vbox{\floatparameter\c!command{\box\nextbox}}% can be anything so no pack
\strc_floats_set_natural_dimensions\floatbox
- \ifdim\htdp\floatbox=\zeropoint
+ \ifzeropt\htdp\floatbox
\showmessage\m!floatblocks{11}\empty
\global\setbox\floatbox\vpack
{\dostarttagged\t!floatcontent\empty
@@ -1052,6 +1182,7 @@
\strc_floats_get_box
\global\insidefloatfalse}
+
\newdimen\availablefloatwidth
\newdimen\availablefloatheight
@@ -1209,7 +1340,7 @@
\def\strc_floats_set_local_dimensions
{\global\d_page_sides_shift \zeropoint % duplicate
\global\d_page_sides_maximum\zeropoint\relax % duplicate
- \ifdim\d_page_sides_downshift=\zeropoint\else
+ \ifzeropt\d_page_sides_downshift\else
\global\setbox\floatbox\vpack
{\vskip\d_page_sides_downshift
\nointerlineskip
@@ -1481,8 +1612,9 @@
% nothing
\or
% automatic
- \ifnofloatcaption
+ \ifnofloatcaption
\strc_floats_prepare_no_caption
+ \strc_floats_set_caption_dimensions\voidbox
%\page_backgrounds_add_local_to_box\floatbox % was \doglobal but not needed
\else
% todo: installable maken, variant/method=auto vs macro
@@ -1490,6 +1622,7 @@
%\page_backgrounds_add_local_to_box\b_strc_floats_content
\setbox\b_strc_floats_caption\hbox % text
{\floatcaptionparameter\c!command{\box\b_strc_floats_caption}}%
+ \strc_floats_set_caption_dimensions\b_strc_floats_caption
\moveboxontogrid\b_strc_floats_caption{\floatcaptionparameter\c!grid}\d_strc_floats_caption_height
%\page_backgrounds_add_local_to_box\b_strc_floats_caption
\strc_floats_build_box
@@ -1520,7 +1653,6 @@
\fi\fi
\strc_floats_align_content{\copy\b_strc_floats_content}}}
-
\def\strc_floats_prepare_page_caption
{\edef\p_strc_floats_caption_width {\floatcaptionparameter\c!width}%
\edef\p_strc_floats_caption_minwidth{\floatcaptionparameter\c!minwidth}%
@@ -1697,7 +1829,7 @@
{\strc_floats_align_content{\box\b_strc_floats_content}}
\def\strc_floats_build_box_next_right#1%
- {\ifconditional\c_strc_floats_par_float \hbox \else \expandafter \strc_floats_align_content \fi % skip, no pack
+ {\ifconditional\c_strc_floats_par_float \hpack \else \expandafter \strc_floats_align_content \fi % skip, no pack
{\d_strc_float_temp_height\ht\b_strc_floats_content
\box\b_strc_floats_content
\doifnotinset\v!hang\floatcaptionlocation
@@ -1705,7 +1837,7 @@
\vbox to\d_strc_float_temp_height{#1}}}
\def\strc_floats_build_box_next_left#1%
- {\ifconditional\c_strc_floats_par_float \hbox \else \expandafter \strc_floats_align_content \fi % skip, no pack
+ {\ifconditional\c_strc_floats_par_float \hpack \else \expandafter \strc_floats_align_content \fi % skip, no pack
{\d_strc_float_temp_height\ht\b_strc_floats_content
\vbox to\d_strc_float_temp_height{#1}%
\doifnotinset\v!hang\floatcaptionlocation
@@ -1730,6 +1862,36 @@
\vbox to\d_strc_float_temp_height{#1}%
\box\b_strc_floats_content}}
+% \def\strc_floats_build_box_next_right_margin_indeed#1#2%
+% {\ifconditional\c_strc_floats_par_float
+% \hpack\bgroup
+% \d_strc_float_temp_height\ht\b_strc_floats_content
+% \box\b_strc_floats_content
+% \hsmash{\hskip#1\vbox to\d_strc_float_temp_height{#2}}%
+% \egroup
+% \else
+% \begingroup
+% \d_strc_float_temp_height\ht\b_strc_floats_content
+% \everyrightofalignedline{\hsmash{\hskip#1\vbox to\d_strc_float_temp_height{#2}}}%
+% \strc_floats_align_content{\box\b_strc_floats_content}%
+% \endgroup
+% \fi}
+%
+% \def\strc_floats_build_box_next_left_margin_indeed#1#2%
+% {\ifconditional\c_strc_floats_par_float
+% \hpack\bgroup
+% \d_strc_float_temp_height\ht\b_strc_floats_content
+% \hsmash{\hskip-\dimexpr#1+\wd\b_strc_floats_caption\relax\vbox to\d_strc_float_temp_height{#2}}%
+% \box\b_strc_floats_content
+% \egroup
+% \else
+% \begingroup
+% \d_strc_float_temp_height\ht\b_strc_floats_content
+% \everyleftofalignedline{\hsmash{\hskip-\dimexpr#1+\wd\b_strc_floats_caption\relax\vbox to\d_strc_float_temp_height{#2}}}%
+% \strc_floats_align_content{\box\b_strc_floats_content}%
+% \endgroup
+% \fi}
+
\def\strc_floats_build_box_next_right_margin_indeed#1#2%
{\ifconditional\c_strc_floats_par_float
\hpack\bgroup
@@ -1740,7 +1902,12 @@
\else
\begingroup
\d_strc_float_temp_height\ht\b_strc_floats_content
- \everyrightofalignedline{\hsmash{\hskip#1\vbox to\d_strc_float_temp_height{#2}}}%
+ \setbox\scratchboxone\vbox{#2}%
+ \ifdim\htdp\scratchboxone>\htdp\b_strc_floats_content
+ \global\d_strc_floats_overflow\dimexpr\htdp\scratchboxone-\htdp\b_strc_floats_content\relax
+ \fi
+ \ht\scratchboxone\d_strc_float_temp_height
+ \everyrightofalignedline{\hsmash{\hskip#1\box\scratchboxone}}%
\strc_floats_align_content{\box\b_strc_floats_content}%
\endgroup
\fi}
@@ -1755,7 +1922,12 @@
\else
\begingroup
\d_strc_float_temp_height\ht\b_strc_floats_content
- \everyleftofalignedline{\hsmash{\hskip-\dimexpr#1+\wd\b_strc_floats_caption\relax\vbox to\d_strc_float_temp_height{#2}}}%
+ \setbox\scratchboxone\vbox{#2}%
+ \ifdim\htdp\scratchboxone>\htdp\b_strc_floats_content
+ \global\d_strc_floats_overflow\dimexpr\htdp\scratchboxone-\htdp\b_strc_floats_content\relax
+ \fi
+ \ht\scratchboxone\d_strc_float_temp_height
+ \everyleftofalignedline{\hsmash{\hskip-\dimexpr#1+\wd\scratchboxone\relax\box\scratchboxone}}%
\strc_floats_align_content{\box\b_strc_floats_content}%
\endgroup
\fi}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-itm.lua b/Master/texmf-dist/tex/context/base/mkiv/strc-itm.lua
index adec591c1c1..e2fbdc96055 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-itm.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-itm.lua
@@ -36,8 +36,8 @@ local function analyzeitemgroup(name,level)
local stamp = f_stamp(name,n)
local n = getvariable(stamp,level,1,0)
local w = getvariable(stamp,level,2,0)
- texsetcount("local","c_strc_itemgroups_max_items",n)
- texsetdimen("local","d_strc_itemgroups_max_width",w)
+ texsetcount("c_strc_itemgroups_max_items",n)
+ texsetdimen("d_strc_itemgroups_max_width",w)
end
local function registeritemgroup(name,level,nofitems,maxwidth)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-itm.mklx b/Master/texmf-dist/tex/context/base/mkiv/strc-itm.mklx
new file mode 100644
index 00000000000..60fe3ee746a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-itm.mklx
@@ -0,0 +1,1882 @@
+%D \module
+%D [ file=strc-itm,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Itemgroups,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Itemgroups}
+
+\registerctxluafile{strc-itm}{}
+
+%D As we analyze/register widths and such we could as well push and pop the numbers
+%D at the \LUA\ end (which saves a few calls).
+%D
+%D Cleaning up this module happened around the time when Kate Bush came up with the
+%D nicest numbered list of words: 50 Words For Snow. It's therefore no surprise that
+%D I had that cd running several times when updating this code. One of the
+%D highlights of 2011.
+%D
+%D This module needs to be rewritten but that is tricky with respect to
+%D compatibilitity. Basically each major variant (regular, text, columns,
+%D horizontal, etc) needs to be on its own.
+
+% todo: check breaks
+% todo: check grouping
+% todo: fixedconversion
+
+% \startitemize[n,packed]
+% \item test \item test \item test
+% \stopitemize
+%
+% \startitemize[n,packed,reverse]
+% \item test \item test \item test
+% \stopitemize
+%
+% \startitemize[n,packed,reverse] \item test \item test \stopitemize
+% \startitemize[continue]
+% \item test \startitemize[n,packed] \item test \item test \stopitemize
+% \item test
+% \item test
+% \stopitemize
+% \startitemize[continue] \item test \stopitemize
+%
+% \startitemize[n,packed] \item test \item test \stopitemize
+% \startitemize[continue] \item test \stopitemize
+% \startitemize[continue] \item test \stopitemize
+%
+% \setupwhitespace[big]
+% \starttext
+% test \startitemize[joinedup] \item test \item test \stopitemize test \par
+% test \startitemize[joinedup,nowhite] \item test \item test \stopitemize test \par
+% test \startitemize[joinedup,nowhite,before] \item test \item test \stopitemize test \par
+% test \startitemize[joinedup,nowhite,after] \item test \item test \stopitemize test \par
+% \stoptext
+%
+% test / example
+%
+% \startnarrower[left] \startcolumns[n=3] \startitemize
+% \item \input ward \item \input ward \item \input ward
+% \stopitemize \stopcolumns\stopnarrower \blank
+%
+% \startnarrower[left] \startitemize[columns,three]
+% \item \input ward \item \input ward \item \input ward
+% \stopitemize \stopnarrower \blank
+%
+% \setupitemize[leftmargin=1.5em] \startitemize[columns,three]
+% \item \input ward \item \input ward \item \input ward
+% \stopitemize \blank
+%
+% beware, we don't group (yet) as we want to keep the left/right skip
+%
+% \startitemize
+% \startitem \stopitem
+% some intermediate text that will properly indent
+% \startitem \stopitem
+% \stopitem
+%
+% so we need to keep that property
+%
+% \startitemize
+% \starthead {xx} test \stophead
+% \startitem test \stopitem
+% \startitem test \stopitem
+% \stopitemize
+%
+% Sometimes the user demands get pretty weird:
+%
+% \startitemize
+% \item test
+% \item test
+% \headsym{xx} test \par test
+% \stopitemize
+%
+% aligned items
+%
+% \startitemize[n,fit,broad][itemalign=flushright]
+% \dorecurse{100}{\item The first item.}
+% \stopitemize
+%
+% \setupitemgroup[itemize][each][fit]
+% \setupitemgroup[itemize][each][distance=.5em,factor=1,itemalign=flushright]
+%
+% \startitemize[n]
+% \dorecurse{100}{\item The first item.}
+% \stopitemize
+%
+% \defineitemgroup[gbitemize]
+% \setupitemgroup[gbitemize][each][headstyle=bold]
+%
+% \startgbitemize
+% \txt{italian} some italians like this kind of cross||breed between
+% an itemize and a description
+% \txt{sicilians} i wonder how many sicilian mathematicians do a thesis
+% on the math involved in predicting the next big bang of the vulcano
+% \stopgbitemize
+%
+% \startitemize[n,repeat]
+% \noitem \startitemize[a] \item Item 1.a. \item Item 1.b. \stopitemize
+% \noitem \startitemize[a] \item Item 2.a. \item Item 2.b. \stopitemize
+% \stopitemize
+%
+% \startitemize[n,repeat][width=0pt]
+% \noitem \startitemize[a][width=2em] \item Item 1.a. \item Item 1.b. \stopitemize
+% \noitem \startitemize[a][width=2em] \item Item 2.a. \item Item 2.b. \stopitemize
+% \stopitemize
+%
+% \startbuffer
+% \item
+% \startitemize[n]
+% \item item 1.1
+% \item item 1.2
+% \startitemize[n] \item item 1.2.1 \item item 1.2.2 \stopitemize
+% \item item 1.3
+% \stopitemize
+% \item
+% \startitemize[n] \item item 2.1 \item item 2.2 \stopitemize
+% \item item 3
+% \startitemize[n] \item item 3.1 \item item 3.2 \stopitemize
+% \item
+% \startitemize[n] \item item 4.1 \item item 4.2 \stopitemize
+% \stopbuffer
+%
+% \startitemize[n,repeat,6*broad,packed] \getbuffer \stopitemize \blank[3*big]
+% \startitemize[n,repeat,packed] \getbuffer \stopitemize \blank[3*big]
+% \setupitemize[each][atmargin][width=3em]
+% \startitemize[n,repeat,packed] \getbuffer \stopitemize
+%
+% todo: assume startitem ... stopitem and do an autostopitem .. cleaner for
+% elements
+%
+% \startitemize[text][space=medium]
+% \item one \item two \item three
+% \stopitemize
+%
+% For Giuseppe "Oblomov" Bilotta, inspired on a suggestion by Taco
+% Hoekwater.
+%
+% \def\MyItemCommand#1{{\bf#1}\quad}
+% \setupitemgroup[itemize][command=\MyItemCommand]
+%
+% \startitemize
+% \item {test} is this okay?
+% \item {test} is this okay?
+% \item {test} is this okay?
+% \stopitemize
+
+\unprotect
+
+\newconditional\c_strc_itemgroups_sub
+\newconditional\c_strc_itemgroups_head
+\newconditional\c_strc_itemgroups_intro
+\newconditional\c_strc_itemgroups_randomize
+\newconditional\c_strc_itemgroups_horizontal
+\newconditional\c_strc_itemgroups_collecting
+\newconditional\c_strc_itemgroups_auto_intro
+\newconditional\c_strc_itemgroups_pack
+\newconditional\c_strc_itemgroups_paragraph
+\newconditional\c_strc_itemgroups_text
+\newconditional\c_strc_itemgroups_text_saved
+\newconditional\c_strc_itemgroups_first
+\newconditional\c_strc_itemgroups_before
+\newconditional\c_strc_itemgroups_after
+\newconditional\c_strc_itemgroups_nowhite
+\newconditional\c_strc_itemgroups_joined
+\newconditional\c_strc_itemgroups_reverse
+\newconditional\c_strc_itemgroups_continue
+\newconditional\c_strc_itemgroups_fitting
+\newconditional\c_strc_itemgroups_indented_first
+\newconditional\c_strc_itemgroups_inline
+\newconditional\c_strc_itemgroups_columns
+\newconditional\c_strc_itemgroups_concat
+\newconditional\c_strc_itemgroups_txt
+\newconditional\c_strc_itemgroups_extra
+\newconditional\c_strc_itemgroups_repeat
+\newconditional\c_strc_itemgroups_inline_head
+
+% 0 = before/after
+% 1 = between unless before
+% 2 = between
+
+\newconstant \c_strc_itemgroups_spacing_mode \c_strc_itemgroups_spacing_mode\plustwo
+\newconditional\c_strc_itemgroups_optimize \settrue\c_strc_itemgroups_optimize
+\newconditional\c_strc_itemgroups_auto_concat \settrue\c_strc_itemgroups_auto_concat
+
+\newsignal \d_strc_itemgroups_signal
+
+\newbox \b_strc_itemgroups
+
+\newdimen \d_strc_itemgroups_list_width
+\newdimen \d_strc_itemgroups_asked_width
+
+\newdimen \d_strc_itemgroups_max_width % multipass
+\newcount \c_strc_itemgroups_max_items % multipass
+
+\newcount \c_strc_itemgroups_n_of_items
+\newcount \c_strc_itemgroups_nesting
+\newcount \c_strc_itemgroups_column_depth
+
+\def \v_strc_itemgroups_counter {itemgroup:\currentparentitemgroup}
+\let \m_strc_itemgroups_repeat_start \empty
+\def \v_strc_itemgroups_unknown_symbol {?}
+\let \m_strc_itemgroups_indenting \empty
+\let \m_strc_itemgroups_destination \empty
+
+\let \currentitemlevel \!!zerocount % public
+\def \currentnofitems {\the\c_strc_itemgroups_max_items}
+\def \currentitemnumber {\strc_counters_raw_sub\v_strc_itemgroups_counter\currentitemlevel} % public
+
+\newtoks \itemgroupcommands % maybe public
+
+\def \currentitemgroupsymbol {n} % here we cannot use a _ in the name
+\let \currentitemgroupconversionset \empty % here we cannot use a _ in the name
+\let \currentitemgroupsegments \empty
+
+\def\strc_itemgroups_register_status
+ {\clf_registeritemgroup{\currentparentitemgroup}\c_strc_itemgroups_nesting\c_strc_itemgroups_n_of_items\dimexpr\itemgroupparameter\c!maxwidth\relax}
+
+\def\strc_itemgroups_check_n_of_items % we could do this at the lua end and save a call (i.e. will be dimen and counter)
+ {\clf_analyzeitemgroup{\currentparentitemgroup}\c_strc_itemgroups_nesting\relax
+ \edef\currentnofitems{\the\c_strc_itemgroups_max_items}}
+
+% todo: \dodosetreference -> \strc_counters_register_component (to be checked)
+
+\def\strc_itemgroups_insert_reference % we will make a decent number helper
+ {\iftrialtypesetting \orelse \ifx\currentitemreference \empty \else
+ \strc_itemgroups_insert_reference_indeed
+ \fi}
+
+\def\strc_itemgroups_insert_extra_reference
+ {\iftrialtypesetting \orelse \ifx\currentitemreference \empty \else
+ \normalexpanded{\textreference[\currentitemreference]{\strc_itemgroups_extra_symbol}}%
+ \fi}
+
+\def\strc_itemgroups_insert_reference_indeed % maybe we need a 'frozen counter' numberdata blob / quick hack .. .mive this to strc-ref
+ {% needs testing, gave problems:
+ \setnextinternalreference
+ % no need to collect nodes in \b_strc_destination_nodes here ... maybe at some point
+ \strc_references_start_destination_nodes
+ % this is somewhat over the top ... we should use the counter's reference
+ \clf_setdestinationattribute
+ {%
+ metadata {%
+ kind {item}% was item, why?
+ \ifx\currentreferencecoding\s!xml
+ xmlroot {\xmldocument}% only useful when text
+ \fi
+ catcodes \catcodetable
+ }%
+ references {%
+ internal \locationcount % no: this spoils references
+ % block {\currentsectionblock}%
+ view {\interactionparameter\c!focus}%
+ prefix {\referenceprefix}%
+ reference {\currentitemreference}%
+ }%
+ prefixdata {%
+ prefix {\namedcounterparameter\v_strc_itemgroups_counter\c!prefix}%
+ separatorset {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixseparatorset}%
+ conversion {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversion}%
+ conversionset {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversionset}%
+ set {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixset}%
+ segments {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixsegments}%
+ % segments {\askedprefixsegments}%
+ connector {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconnector}%
+ }%
+ numberdata {%
+ numbers {\v_strc_itemgroups_counter}%
+ separatorset {\namedcounterparameter\v_strc_itemgroups_counter\c!numberseparatorset}%
+ % conversion {\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversion}%
+ % conversionset {\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversionset}%
+ % fixedconversion {\currentitemgroupconversionset}%
+ conversionset {fixed::\currentitemgroupconversionset}% temp hack
+ %
+ % for the moment no stopper, we need to make references configurable first
+ % stopper {\namedcounterparameter\v_strc_itemgroups_counter\c!numberstopper}%
+ segments {\namedcounterparameter\v_strc_itemgroups_counter\c!numbersegments}%
+ }%
+ }%
+ \relax
+ \strc_references_stop_destination_nodes
+ \xdef\currentdestinationattribute{\number\lastdestinationattribute}%
+ % will become an option:
+ \ifnum\lastdestinationattribute>\zerocount
+ \dontleavehmode\hbox attr \destinationattribute\lastdestinationattribute\bgroup
+ \strc_references_flush_destination_nodes
+ \egroup
+ \fi}
+
+%D Defining and setup:
+
+\installcorenamespace{itemgroup}
+\installcorenamespace{itemgroupoption}
+\installcorenamespace{itemgroupsetting}
+\installcorenamespace{itemgroupkeyword}
+\installcorenamespace{itemgroupalign}
+\installcorenamespace{itemgrouplocal}
+\installcorenamespace{itemgroupglobal}
+\installcorenamespace{itemgroupdistance}
+\installcorenamespace{itemgroupstack}
+\installcorenamespace{itemgroupfirst}
+\installcorenamespace{itemgroupstart}
+
+\installcommandhandler \??itemgroup {itemgroup} \??itemgroup
+
+\let\setupitemgroups\setupitemgroup
+
+\appendtoks
+ \setuevalue{\e!start\currentitemgroup}{\startitemgroup[\currentitemgroup]}%
+ \setuevalue{\e!stop \currentitemgroup}{\stopitemgroup}%
+ \setuevalue{\e!setup\currentitemgroup\e!endsetup}{\setupitemgroup[\currentitemgroup]}% obsolete
+ \let\currentparentitemgroup\currentitemgroup
+ \definecounter[\v_strc_itemgroups_counter]%
+ % beware ... we cannot use _ as the conversion set is not expanded
+ % \defineconversionset[\v_strc_itemgroups_counter][\currentitemgroupconversionset][\currentitemgroupsymbol]%
+\to \everydefineitemgroup
+
+%D Global states
+
+\def\strc_itemgroups_store_continue_state#options#settings%
+ {\setxvalue{\??itemgroupoption \currentitemgroup}{\strc_itemgroups_process_options{#options}}%
+ \setgvalue{\??itemgroupsetting\currentitemgroup}{\setupcurrentitemgroup[#settings]}}
+
+\def\strc_itemgroups_fetch_continue_state
+ {\csname\??itemgroupoption \currentitemgroup\endcsname
+ \csname\??itemgroupsetting\currentitemgroup\endcsname}
+
+\def\strc_itemgroups_reset_continue_state
+ {\expandafter\glet\csname\??itemgroupoption \currentitemgroup\endcsname\relax
+ \expandafter\glet\csname\??itemgroupsetting\currentitemgroup\endcsname\relax}
+
+% These will become keywords. We will also add a feature to keep the while set
+% together.
+
+\definevspacing[\v!item @0] [penalty:0] % allow
+\definevspacing[\v!item @10000] [penalty:10000] % no
+\definevspacing[\v!item @-5] [penalty:-5]
+\definevspacing[\v!item @5] [penalty:5]
+\definevspacing[\v!item @500] [penalty:500] % discourage .. too low, 5000 is better
+
+\def\strc_itemgroups_insert_break_when_needed#break%
+ {\ifconditional\c_strc_itemgroups_optimize
+ \ifconditional\c_strc_itemgroups_text \else
+ #break\relax
+ \fi
+ \fi}
+
+\def\strc_itemgroups_insert_breakallow {\strc_itemgroups_insert_break_when_needed\strc_itemgroups_insert_breakallow_indeed}
+\def\strc_itemgroups_insert_breakno {\strc_itemgroups_insert_break_when_needed\strc_itemgroups_insert_breakno_indeed }
+\def\strc_itemgroups_insert_break {\strc_itemgroups_insert_break_when_needed\strc_itemgroups_insert_break_indeed }
+\def\strc_itemgroups_insert_nobreak {\strc_itemgroups_insert_break_when_needed\strc_itemgroups_insert_nobreak_indeed }
+
+\def\strc_itemgroups_insert_breakallow_indeed{\vspacing[\v!item @0]}
+\def\strc_itemgroups_insert_breakno_indeed {\vspacing[\v!item @10000]}
+\def\strc_itemgroups_insert_break_indeed {\flushnotes
+ \vspacing[\v!item @-5]}
+\def\strc_itemgroups_insert_nobreak_indeed {\flushnotes
+ \ifinsidecolumns % todo
+ \vspacing[\v!item @5]%
+ \else
+ \vspacing[\v!item @500]%
+ \fi}
+
+\unexpanded\def\strc_itemgroups_process_options#options%
+ {\processcommacommand[#options]\strc_itemgroups_process_option} % expansion of options is handy for xml
+
+% \installcommalistprocessorcommand \strc_itemgroups_process_option_list \strc_itemgroups_process_option
+%
+% \unexpanded\def\strc_itemgroups_process_options#options%
+% {\normalexpanded{\strc_itemgroups_process_option_list[#options]}} % expansion of options is handy for xml
+
+\def\strc_itemgroups_process_option#option%
+ {\edef\itemgroupconstantvalue{#option}%
+ \ifx\itemgroupconstantvalue\empty\else
+ \splitatasterisk\itemgroupconstantvalue\itemgroupfirst\itemgroupsecond
+ \ifx\itemgroupsecond\empty
+ \let\itemgroupsecond\itemgroupfirst
+ \let\itemgroupfirst\!!plusone
+ \fi
+ \ifcsname\??itemgroupkeyword\itemgroupsecond\endcsname
+ \lastnamedcs
+ \else
+ \strc_itemgroups_set_symbol\itemgroupconstantvalue
+ \fi
+ \fi}
+
+\def\strc_itemgroups_process_set_option_pack
+ {\ifcase\c_strc_itemgroups_nesting \else
+ \settrue\c_strc_itemgroups_pack
+ \fi}
+
+\def\strc_itemgroups_process_set_option_unpack
+ {\ifcase\c_strc_itemgroups_nesting\else
+ \setfalse\c_strc_itemgroups_pack
+ \fi}
+
+\setvalue{\??itemgroupkeyword\!!zerocount }{} % ignore 0
+\setvalue{\??itemgroupkeyword\v!packed }{\strc_itemgroups_process_set_option_pack}
+\setvalue{\??itemgroupkeyword\v!unpacked }{\strc_itemgroups_process_set_option_unpack}
+\setvalue{\??itemgroupkeyword\v!intro }{\settrue\c_strc_itemgroups_intro} % here? not set to false
+\setvalue{\??itemgroupkeyword\v!autointro }{\settrue\c_strc_itemgroups_auto_intro}
+\setvalue{\??itemgroupkeyword\v!broad }{\ifx\itemgroupfirst\empty
+ \let\itemgroupfirst\!!plusone
+ \fi
+ \letitemgroupparameter\c!factor\itemgroupfirst}
+\setvalue{\??itemgroupkeyword\v!text }{\settrue\c_strc_itemgroups_text
+ \settrue\c_strc_itemgroups_inline
+ \settrue\c_strc_itemgroups_joined
+ \strc_itemgroups_process_set_option_pack}
+\setvalue{\??itemgroupkeyword\v!before }{\settrue\c_strc_itemgroups_before}
+\setvalue{\??itemgroupkeyword\v!after }{\settrue\c_strc_itemgroups_after}
+\setvalue{\??itemgroupkeyword\v!nowhite }{\settrue\c_strc_itemgroups_nowhite}
+\setvalue{\??itemgroupkeyword\v!margin }{\setitemgroupparameter\c!width{-2em}} % signal
+\setvalue{\??itemgroupkeyword\v!inmargin }{\setitemgroupparameter\c!width{-2em}} % signal
+\setvalue{\??itemgroupkeyword\v!atmargin }{\ifnum\c_strc_itemgroups_nesting>\plusone
+ \setitemgroupparameter\c!width{0em}%
+ \fi} % signal
+\setvalue{\??itemgroupkeyword\v!intext }{\settrue\c_strc_itemgroups_inline}
+\setvalue{\??itemgroupkeyword\v!headintext }{\settrue\c_strc_itemgroups_inline_head}
+\setvalue{\??itemgroupkeyword\v!loose }{\setfalse\c_strc_itemgroups_optimize}
+\setvalue{\??itemgroupkeyword\v!fit }{\settrue\c_strc_itemgroups_fitting}
+\setvalue{\??itemgroupkeyword\v!nofit }{\setfalse\c_strc_itemgroups_fitting}
+\setvalue{\??itemgroupkeyword\v!paragraph }{\settrue\c_strc_itemgroups_paragraph
+ \strc_itemgroups_process_set_option_pack}
+\setvalue{\??itemgroupkeyword\v!joinedup }{\settrue\c_strc_itemgroups_joined
+ \strc_itemgroups_process_set_option_pack}
+\setvalue{\??itemgroupkeyword\v!notjoinedup}{\setfalse\c_strc_itemgroups_joined}
+\setvalue{\??itemgroupkeyword\v!serried }{\edef\itemgroupfirst{-\ifx\itemgroupfirst\empty1\else\itemgroupfirst\fi}%
+ \letitemgroupparameter\c!factor\itemgroupfirst}
+\setvalue{\??itemgroupkeyword\v!stopper }{\letitemgroupparameter\c!placestopper\v!yes} % keep {}
+\setvalue{\??itemgroupkeyword\v!nostopper }{\letitemgroupparameter\c!placestopper\v!no} % keep {}
+\setvalue{\??itemgroupkeyword\v!repeat }{\settrue\c_strc_itemgroups_repeat}
+\setvalue{\??itemgroupkeyword\v!norepeat }{\setfalse\c_strc_itemgroups_repeat}
+\setvalue{\??itemgroupkeyword\v!reverse }{\settrue\c_strc_itemgroups_reverse}
+\setvalue{\??itemgroupkeyword\v!columns }{\settrue\c_strc_itemgroups_columns}
+\setvalue{\??itemgroupkeyword\v!one }{\letitemgroupparameter\c!n\plusone}
+\setvalue{\??itemgroupkeyword\v!two }{\letitemgroupparameter\c!n\plustwo}
+\setvalue{\??itemgroupkeyword\v!three }{\letitemgroupparameter\c!n\plusthree}
+\setvalue{\??itemgroupkeyword\v!four }{\letitemgroupparameter\c!n\plusfour}
+\setvalue{\??itemgroupkeyword\v!five }{\letitemgroupparameter\c!n\plusfive}
+\setvalue{\??itemgroupkeyword\v!six }{\letitemgroupparameter\c!n\plussix}
+\setvalue{\??itemgroupkeyword\v!seven }{\letitemgroupparameter\c!n\plusseven}
+\setvalue{\??itemgroupkeyword\v!eight }{\letitemgroupparameter\c!n\pluseight}
+\setvalue{\??itemgroupkeyword\v!nine }{\letitemgroupparameter\c!n\plusnine}
+\setvalue{\??itemgroupkeyword\v!standard }{\setitemgroupparameter\c!width {1.5\emwidth}%
+ \setitemgroupparameter\c!distance {.5\emwidth}%
+ %\letitemgroupparameter\c!factor \!!zerocount
+ \letitemgroupparameter\c!factor {\zerocount}%
+ \setitemgroupparameter\c!packcriterium{\zerocount}%
+ \letitemgroupparameter\c!inner \empty
+ \letitemgroupparameter\c!beforehead \empty
+ \letitemgroupparameter\c!afterhead \blank
+ \letitemgroupparameter\c!before \blank
+ \letitemgroupparameter\c!inbetween \blank
+ \letitemgroupparameter\c!after \blank}
+
+\def\strc_itemgroups_initialize_local
+ {\setfalse\c_strc_itemgroups_inline
+ \setfalse\c_strc_itemgroups_concat
+ \setfalse\c_strc_itemgroups_txt
+ %
+ \setfalse\c_strc_itemgroups_reverse
+ \setfalse\c_strc_itemgroups_intro
+ \setfalse\c_strc_itemgroups_auto_intro
+ \setfalse\c_strc_itemgroups_before
+ \setfalse\c_strc_itemgroups_after
+ \setfalse\c_strc_itemgroups_nowhite
+ \setfalse\c_strc_itemgroups_randomize
+ \setfalse\c_strc_itemgroups_horizontal
+ \setfalse\c_strc_itemgroups_collecting
+ \setfalse\c_strc_itemgroups_intro
+ \setfalse\c_strc_itemgroups_continue
+ % this will be a constant
+ \setfalse\c_strc_itemgroups_head
+ \setfalse\c_strc_itemgroups_sub
+ \setfalse\c_strc_itemgroups_symbol
+ \setfalse\c_strc_itemgroups_columns
+ % to be checked
+ \let\m_strc_itemgroups_destination\empty
+ \let\strc_itemgroups_used_symbol \empty % ** start value
+ \let\strc_itemgroups_margin_symbol\empty
+ \let\strc_itemgroups_extra_symbol \empty
+ %
+ \global\letitemgroupparameter\c!maxwidth\!!zeropoint
+ }
+
+\setvalue{\??itemgroupfirst\v!intro }{\settrue\c_strc_itemgroups_intro}
+\setvalue{\??itemgroupfirst\v!continue }{\settrue\c_strc_itemgroups_continue}
+\setvalue{\??itemgroupfirst\v!random }{\settrue\c_strc_itemgroups_randomize
+ \settrue\c_strc_itemgroups_collecting}
+\setvalue{\??itemgroupkeyword\v!horizontal}{\settrue\c_strc_itemgroups_horizontal
+ \settrue\c_strc_itemgroups_collecting
+ \settrue\c_strc_itemgroups_inline
+ \settrue\c_strc_itemgroups_joined
+ \strc_itemgroups_process_set_option_pack}
+
+\def\strc_itemgroups_preset_stage_one#options%
+ {\processcommacommand[#options]\strc_itemgroups_preset_stage_one_indeed}
+
+% \installcommalistprocessorcommand \strc_itemgroups_preset_stage_one_list \strc_itemgroups_preset_stage_one_indeed
+%
+% \def\strc_itemgroups_preset_stage_one#options%
+% {\normalexpanded{\strc_itemgroups_preset_stage_one_list[#options]}}
+
+\def\strc_itemgroups_preset_stage_one_indeed#option%
+ {\ifcsname\??itemgroupfirst#option\endcsname
+ \lastnamedcs
+ \fi}
+
+\ifdefined\dotagsetitemgroup \else \let\dotagsetitemgroup\relax \fi
+\ifdefined\dotagsetitem \else \let\dotagsetitem \gobbleoneargument \fi
+
+\def\strc_itemgroups_tag_start_group
+ {\dostarttaggedchained\t!itemgroup\currentparentitemgroup\??itemgroup
+ \dotagsetitemgroup}
+
+\def\strc_itemgroups_tag_stop_group
+ {\dostoptagged}
+
+\def\strc_itemgroups_before_command
+ {\ifconditional\c_strc_itemgroups_nowhite
+ \ifconditional\c_strc_itemgroups_before
+ \ifcase\c_strc_itemgroups_nesting\or\itemgroupparameter\c!before\fi
+ \else
+ \nowhitespace
+ \fi
+ \orelse\ifconditional\c_strc_itemgroups_joined
+ % \empty
+ \else
+ \itemgroupparameter\c!before
+ \fi}
+
+\def\strc_itemgroups_after_command
+ {\ifconditional\c_strc_itemgroups_nowhite
+ \ifconditional\c_strc_itemgroups_after
+ \ifcase\c_strc_itemgroups_nesting\or\itemgroupparameter\c!after\fi
+ \else
+ \nowhitespace
+ \fi
+ \orelse\ifconditional\c_strc_itemgroups_joined
+ % \empty
+ \else
+ \itemgroupparameter\c!after
+ \fi}
+
+\def\strc_itemgroups_between_command
+ {\ifconditional\c_strc_itemgroups_nowhite
+ \nowhitespace
+ \orelse\ifconditional\c_strc_itemgroups_joined
+ % \empty
+ \else
+ \itemgroupparameter\c!inbetween
+ \fi}
+
+\def\strc_itemgroups_before_head_command
+ {\ifconditional\c_strc_itemgroups_nowhite
+ \nowhitespace
+ \orelse\ifconditional\c_strc_itemgroups_joined
+ % \empty
+ \else
+ \itemgroupparameter\c!beforehead
+ \fi}
+
+\def\strc_itemgroups_after_head_command
+ {\ifconditional\c_strc_itemgroups_nowhite
+ \nowhitespace
+ \orelse\ifconditional\c_strc_itemgroups_joined
+ % \empty
+ \else
+ \itemgroupparameter\c!afterhead
+ \fi}
+
+% compatible setup command:
+
+\let\strc_itemgroups_normal_setup\setupitemgroup
+
+\unexpanded\def\setupitemgroup
+ {\doquadrupleempty\strc_itemgroups_setup}
+
+\def\strc_itemgroups_setup[#category][#levels][#options][#settings]% category level|each options|settings settings|options
+ {\edef\strc_itemgroups_setup_what{#levels}%
+ \iffourthargument
+ \ifx\strc_itemgroups_setup_what\v!each
+ \strc_itemgroups_setup_each{#category}{#options}%
+ \strc_itemgroups_setup_each{#category}{#settings}%
+ \else
+ \strc_itemgroups_setup_list{#levels}{#category}{#options}%
+ \strc_itemgroups_setup_list{#levels}{#category}{#settings}%
+ \fi
+ \orelse\ifthirdargument
+ \ifx\strc_itemgroups_setup_what\v!each
+ \strc_itemgroups_setup_each{#category}{#options}%
+ \else
+ \strc_itemgroups_setup_list{#levels}{#category}{#options}%
+ \fi
+ \orelse\ifsecondargument
+ \strc_itemgroups_setup_each{#category}{#levels}%
+ \else
+ \strc_itemgroups_normal_setup[#category]% == settings
+ \fi}
+
+% can be made a bit faster
+
+% \def\strc_itemgroups_setup_each#category#whatever%
+% {\doifelseassignment{#whatever}
+% {\strc_itemgroups_normal_setup[#category][#whatever]}
+% {\strc_itemgroups_normal_setup[#category][\c!option={#whatever}]}}
+
+\def\strc_itemgroups_setup_each#category#whatever%
+ {\ifcondition\validassignment{#whatever}%
+ \strc_itemgroups_normal_setup[#category][#whatever]%
+ \else
+ \strc_itemgroups_normal_setup[#category][\c!option={#whatever}]%
+ \fi}
+
+\def\strc_itemgroups_setup_list_level_a#category#whatever#level%
+ {\strc_itemgroups_normal_setup[#category:#level][#whatever]}
+
+\def\strc_itemgroups_setup_list_level_b#category#whatever#level%
+ {\strc_itemgroups_normal_setup[#category:#level][\c!option={#whatever}]}
+
+% \def\strc_itemgroups_setup_list#subcategories#category#whatever%
+% {\doifelseassignment{#whatever}
+% {\processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_a{#category}{#whatever}}}
+% {\processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_b{#category}{#whatever}}}}
+
+\def\strc_itemgroups_setup_list#subcategories#category#whatever%
+ {\ifcondition\validassignment{#whatever}%
+ \processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_a{#category}{#whatever}}%
+ \else
+ \processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_b{#category}{#whatever}}%
+ \fi}
+
+\def\strc_itemgroups_increment_item_counter
+ {\ifconditional\c_strc_itemgroups_sub \else
+ \ifconditional\c_strc_itemgroups_symbol \else % \ifx\strc_itemgroups_extra_symbol\empty
+ \strc_counters_increment_sub\v_strc_itemgroups_counter\currentitemlevel
+ \fi
+ \fi}
+
+\unexpanded\def\strc_itemgroups_insert_item_counter
+ {\ifconditional\c_strc_itemgroups_repeat
+ \ifcase\c_strc_itemgroups_nesting
+ % skip
+ \or
+ \strc_itemgroups_insert_item_counter_indeed % this could become an option
+ \else
+ \strc_itemgroups_insert_item_counter_indeed
+ \fi
+ \else
+ \strc_itemgroups_insert_item_counter_indeed
+ \fi}
+
+\def\strc_itemgroups_insert_item_counter_indeed % quite slow ... every time this setup .. but it
+ {\begingroup % can be optimized ... best move some to strc-num
+ \setupcounter
+ [\v_strc_itemgroups_counter]%
+ [\c!prefix=\itemgroupparameter\c!prefix,
+ \c!prefixstopper=\itemgroupparameter\c!prefixstopper,
+ \c!prefixseparatorset=\itemgroupparameter\c!prefixseparatorset,
+ \c!prefixconversion=\itemgroupparameter\c!prefixconversion,
+ \c!prefixconversionset=\itemgroupparameter\c!prefixseparatorset,
+ \c!prefixset=\itemgroupparameter\c!prefixset,
+ \c!prefixsegments=\itemgroupparameter\c!prefixsegments,
+ \c!prefixconnector=\itemgroupparameter\c!prefixconnector,
+ \c!criterium=\itemgroupparameter\c!criterium,
+ \c!numberorder=\ifconditional\c_strc_itemgroups_reverse\v!reverse\else\v!normal\fi,
+ \c!numberstopper=\expdoif{\itemgroupparameter\c!placestopper}\v!yes{\itemgroupparameter\c!stopper},
+ \c!numberconversionset=\v_strc_itemgroups_counter,
+ \c!numbersegments=\currentitemgroupsegments]%
+ % there will be a fixedconversion key
+ %\normalexpanded{\defineconversionset[\v_strc_itemgroups_counter][\currentitemgroupconversionset][\currentitemgroupsymbol]}%
+ \normalexpanded{\strc_sets_define_conversion_set[\v_strc_itemgroups_counter][\currentitemgroupconversionset][\currentitemgroupsymbol]}%
+ %
+ \convertedcounter[\v_strc_itemgroups_counter]% [\number\currentitemlevel]%
+ \strc_itemgroups_insert_reference
+ \endgroup}
+
+% needs testing (maybe it need to happen later)
+%
+% \appendtoks
+% \setupcounter
+% [\v_strc_itemgroups_counter]%
+% [\c!prefix=\itemgroupparameter\c!prefix,
+% \c!prefixstopper=\itemgroupparameter\c!prefixstopper,
+% \c!prefixseparatorset=\itemgroupparameter\c!prefixseparatorset,
+% \c!prefixconversion=\itemgroupparameter\c!prefixconversion,
+% \c!prefixconversionset=\itemgroupparameter\c!prefixseparatorset,
+% \c!prefixset=\itemgroupparameter\c!prefixset,
+% \c!prefixsegments=\itemgroupparameter\c!prefixsegments,
+% \c!prefixconnector=\itemgroupparameter\c!prefixconnector,
+% \c!criterium=\itemgroupparameter\c!criterium,
+% \c!numberorder=\ifconditional\c_strc_itemgroups_reverse\v!reverse\else\v!normal\fi,
+% \c!numberstopper=\expdoif{\itemgroupparameter\c!placestopper}\v!yes{\itemgroupparameter\c!stopper},
+% \c!numberconversionset=\v_strc_itemgroups_counter,
+% \c!numbersegments=\currentitemgroupsegments]%
+% \to\itemgroupcommands
+%
+% \def\strc_itemgroups_insert_item_counter_indeed % quite slow ... every time this setup .. but it
+% {\begingroup % can be optimized ... best move some to strc-num
+% % there will be a fixedconversion key
+% %\normalexpanded{\defineconversionset[\v_strc_itemgroups_counter][\currentitemgroupconversionset][\currentitemgroupsymbol]}%
+% \normalexpanded{\strc_sets_define_conversion_set[\v_strc_itemgroups_counter][\currentitemgroupconversionset][\currentitemgroupsymbol]}%
+% %
+% \convertedcounter[\v_strc_itemgroups_counter]% [\number\currentitemlevel]%
+% \strc_itemgroups_insert_reference
+% \endgroup}
+
+\def\strc_itemgroups_set_symbol#symbol%
+ {\edef\strc_itemgroups_tmp_symbol{#symbol}%
+ \ifx\strc_itemgroups_tmp_symbol\empty \else
+ \doifelsesymboldefined\strc_itemgroups_tmp_symbol
+ \strc_itemgroups_set_symbol_symbol
+ {\doifelseconversiondefined\strc_itemgroups_tmp_symbol
+ \strc_itemgroups_set_symbol_conversion
+ \donothing}%
+ \fi}
+
+\def\strc_itemgroups_set_symbol_symbol
+ {\let\currentitemgroupsymbol\strc_itemgroups_tmp_symbol
+ \strc_itemgroups_store_global_symbol\currentitemgroupsymbol
+ \strc_itemgroups_store_local_symbol\v_strc_itemgroups_unknown_symbol
+ \let\strc_itemgroups_used_symbol\strc_itemgroups_set_symbol_symbol_item
+ \let\strc_itemgroups_asked_symbol\empty}
+
+\def\strc_itemgroups_set_symbol_conversion
+ {\let\currentitemgroupsymbol\strc_itemgroups_tmp_symbol
+ \strc_itemgroups_store_global_symbol\currentitemgroupsymbol
+ \strc_itemgroups_store_local_symbol\strc_itemgroups_insert_item_counter
+ \let\strc_itemgroups_used_symbol\strc_itemgroups_set_symbol_conversion_item
+ \let\strc_itemgroups_asked_symbol\empty}
+
+\def\strc_itemgroups_set_symbol_symbol_item
+ {\symbol[\currentitemgroupsymbol]}
+
+\def\strc_itemgroups_set_symbol_conversion_item
+ {\ifconditional\c_strc_itemgroups_text
+ % maybe block stopper here, but one can as well clone an itemgroup then
+ \itemgroupparameter\c!lefttext
+ \strc_itemgroups_fetch_local_symbol
+ \itemgroupparameter\c!righttext
+ \else
+ \itemgroupparameter\c!left
+ \strc_itemgroups_fetch_local_symbol
+ \itemgroupparameter\c!right
+ \fi}
+
+\def\strc_itemgroups_calculate_list_width#level%
+ {\let\savedcurrentitemgroup\currentitemgroup
+ \edef\currentitemgroup{\currentparentitemgroup:\number#level}%
+ \ifdim\d_strc_itemgroups_max_width>\zeropoint
+ \d_strc_itemgroups_list_width\d_strc_itemgroups_max_width
+ \orelse\ifnum\itemgroupparameter\c!factor>\zerocount
+ \d_strc_itemgroups_list_width\itemgroupparameter\c!step\relax
+ \ifzeropt\d_strc_itemgroups_list_width \d_strc_itemgroups_list_width=.5em\fi
+ \multiply\d_strc_itemgroups_list_width \itemgroupparameter\c!factor
+ \advance\d_strc_itemgroups_list_width\itemgroupparameter\c!width\relax
+ \else
+ \d_strc_itemgroups_list_width\itemgroupparameter\c!width\relax
+ \fi
+ \advance\d_strc_itemgroups_list_width\itemgroupparameter\c!distance\relax
+ \let\currentitemgroup\savedcurrentitemgroup}
+
+\unexpanded\def\startitemgroup
+ {\dotripleempty\strc_itemgroups_start}
+
+\def\strc_itemgroups_start[#category][#options][#settings]%
+ {\begingroup % (1)
+ \def\currentitemgroup{#category}% no nested mixing of itemgroups
+ \let\currentparentitemgroup\currentitemgroup
+ \global\advance\c_strc_itemgroups_nesting\plusone
+ \def\currentitemlevel{\number\c_strc_itemgroups_nesting}%
+ \normalexpanded{\chaintocurrentitemgroup{\currentparentitemgroup:\currentitemlevel}}%
+ \edef\currentitemgroup{\currentparentitemgroup:\currentitemlevel}%
+ %
+ \ifthirdargument
+ \strc_itemgroups_start_indeed[#options][#settings]%
+ \orelse\ifsecondargument
+ \ifcondition\validassignment{#options}%
+ \strc_itemgroups_start_indeed[][#options]%
+ \else
+ \strc_itemgroups_start_indeed[#options][]%
+ \fi
+ \else
+ \strc_itemgroups_start_indeed[][]%
+ \fi}
+
+\def\strc_itemgroups_start_indeed[#options][#settings]%
+ {\edef\itemgroupoptions{\itemgroupparameter\c!option}%
+ \edef\itemgroupextraoptions{#options}%
+ \ifx\itemgroupoptions\empty
+ \let\itemgroupoptions\itemgroupextraoptions
+ \orelse\ifx\itemgroupextraoptions\empty
+ % ok
+ \else
+ \edef\itemgroupoptions{\itemgroupoptions,\itemgroupextraoptions}%
+ \fi
+ \begingroup % (2)
+ \the\itemgroupcommands
+ \let\c_strc_itemgroups_text_saved\c_strc_itemgroups_text
+ \strc_itemgroups_initialize_local
+ \strc_itemgroups_preset_stage_one\itemgroupoptions
+%
+% \ifhmode
+% \ifconditional\c_strc_itemgroups_auto_concat
+% \ifdim\lastskip=\d_strc_itemgroups_signal
+% \settrue\c_strc_itemgroups_concat
+% \fi
+% \fi
+% \ifconditional\c_strc_itemgroups_text_saved \else
+% \ifconditional\c_strc_itemgroups_text \else
+% \par
+% \fi
+% \fi
+% \fi
+%
+ \iftrialtypesetting
+ \strc_counters_save\v_strc_itemgroups_counter
+ \fi
+ \c_strc_itemgroups_n_of_items\zerocount
+ \strc_itemgroups_check_n_of_items
+ \ifx\itemgroupoptions\empty
+ \strc_itemgroups_setup_symbol_default
+ \strc_itemgroups_reset_continue_state
+ \setupcurrentitemgroup[#settings]%
+ \else
+ \strc_itemgroups_process_options\itemgroupoptions
+ \setupcurrentitemgroup[#settings]%
+ \ifconditional\c_strc_itemgroups_continue
+ \strc_itemgroups_setup_symbol_continue
+ \strc_itemgroups_fetch_continue_state
+ \else
+ \strc_itemgroups_setup_symbol_asked
+ \strc_itemgroups_store_continue_state\itemgroupoptions{#settings}%
+ \fi
+ \fi
+ %
+ \ifhmode
+ \ifconditional\c_strc_itemgroups_auto_concat
+ \ifdim\lastskip=\d_strc_itemgroups_signal
+ \settrue\c_strc_itemgroups_concat
+ \fi
+ \fi
+ \ifconditional\c_strc_itemgroups_text_saved \else
+ \ifconditional\c_strc_itemgroups_text \else
+ \par
+ \fi
+ \fi
+ \fi
+ %
+ \ifconditional\c_strc_itemgroups_pack
+ \ifnum\currentnofitems>\itemgroupparameter\c!packcriterium\relax\else
+ \setfalse\c_strc_itemgroups_pack
+ \fi
+ \fi
+ %
+ \ifnum\c_strc_itemgroups_nesting=\plusone % NIEUW
+ \doadaptleftskip {\itemgroupparameter\c!margin}%
+ \doadaptleftskip {\itemgroupparameter\c!leftmargin}%
+ \doadaptrightskip{\itemgroupparameter\c!rightmargin}%
+ \fi
+ %
+ \doadaptleftskip {\itemgroupparameter\c!leftmargindistance}%
+ \doadaptrightskip{\itemgroupparameter\c!rightmargindistance}%
+ %
+ \usealignparameter\itemgroupparameter
+ \edef\m_strc_itemgroups_indenting{\itemgroupparameter\c!indenting}%
+ \ifnum\c_strc_itemgroups_nesting>\zerocount
+ \settrue\c_strc_itemgroups_first
+ \ifconditional\c_strc_itemgroups_continue \else
+ \strc_counters_restart_sub\v_strc_itemgroups_counter\currentitemlevel{\numexpr\itemgroupparameter\c!start-\plusone\relax}%
+ \fi
+ \fi
+ \ifx\strc_itemgroups_used_symbol\empty
+ \strc_itemgroups_set_symbol\strc_itemgroups_asked_symbol % ** default value
+ \ifx\strc_itemgroups_used_symbol\empty
+ \let\currentitemgroupsymbol\currentitemlevel % ** fall back
+ \fi
+ \fi
+ \ifconditional\c_strc_itemgroups_auto_intro\ifnum\prevgraf<\plusthree
+ \settrue\c_strc_itemgroups_intro
+ \fi\fi
+ \ifconditional\c_strc_itemgroups_paragraph
+ \ifnum\c_strc_itemgroups_nesting>\plusone
+ \letitemgroupparameter\c!inbetween\empty
+ \fi
+ \fi
+ \ifconditional\c_strc_itemgroups_pack
+ \letitemgroupparameter\c!inbetween\empty
+ \fi
+ \ifconditional\c_strc_itemgroups_columns
+ \ifinsidecolumns\else\ifcase\c_strc_itemgroups_column_depth
+ \global\c_strc_itemgroups_column_depth\c_strc_itemgroups_nesting % global ?
+ \strc_itemgroups_before_command
+ \strc_itemgroups_tag_start_group
+ \strc_itemgroups_start_columns
+ \fi\fi
+ \fi
+ \ifconditional\c_strc_itemgroups_fitting
+ \ifdim\d_strc_itemgroups_max_width>\zeropoint
+ \letitemgroupparameter\c!width\d_strc_itemgroups_max_width
+ \fi
+ \fi
+ \strc_itemgroups_calculate_list_width\c_strc_itemgroups_nesting
+ \ifdim\d_strc_itemgroups_list_width>\zeropoint\relax
+ \ifconditional\c_strc_itemgroups_inline\else
+ \advance\leftskip\d_strc_itemgroups_list_width\relax
+ \fi
+ \fi
+ \ifx\m_strc_itemgroups_repeat_start\empty
+ \let\currentitemgroupconversionset \currentitemgroupsymbol
+ \edef\currentitemgroupsegments {\currentitemlevel}%
+ \else
+ \edef\currentitemgroupconversionset{\currentitemgroupconversionset,\currentitemgroupsymbol}%
+ \edef\currentitemgroupsegments {\m_strc_itemgroups_repeat_start:\currentitemlevel}%
+ \fi
+ \d_strc_itemgroups_asked_width\itemgroupparameter\c!width\relax
+ \startcollectitems}
+
+\let\startcollectitems\relax
+\let\stopcollectitems \relax
+
+\letvalue{\??itemgroupalign\v!flushleft }\relax
+\letvalue{\??itemgroupalign\v!right }\relax
+\letvalue{\??itemgroupalign\v!flushright}\hfill
+\letvalue{\??itemgroupalign\v!left }\hfill
+\letvalue{\??itemgroupalign\v!middle }\hfil
+\letvalue{\??itemgroupalign\v!center }\hfil
+
+\def\strc_itemgroups_left_sym_filler
+ {\csname\??itemgroupalign\itemgroupparameter\c!symalign\endcsname}
+
+% symbols + states
+
+\def\strc_itemgroups_store_global_symbol#symbol%
+ {\letgvalue{\??itemgroupglobal\currentitemgroup:\currentitemlevel}#symbol}
+
+\def\strc_itemgroups_store_local_symbol#symbol%
+ {\letgvalue{\??itemgrouplocal\currentitemgroup:\currentitemlevel}#symbol}
+
+\def\strc_itemgroups_fetch_global_symbol
+ {\csname\??itemgroupglobal\currentitemgroup:\currentitemlevel\endcsname}
+
+\def\strc_itemgroups_fetch_local_symbol
+ {\csname\??itemgrouplocal\currentitemgroup:\currentitemlevel\endcsname}
+
+\def\strc_itemgroups_setup_symbol_default
+ {\edef\strc_itemgroups_asked_symbol{\itemgroupparameter\c!symbol}%
+ \strc_itemgroups_store_global_symbol\empty}
+
+\def\strc_itemgroups_setup_symbol_continue
+ {\ifcsname\??itemgroupglobal\currentitemgroup:\currentitemlevel\endcsname
+ \let\strc_itemgroups_asked_symbol\strc_itemgroups_fetch_global_symbol
+ \else
+ \let\strc_itemgroups_asked_symbol\currentitemlevel
+ \fi}
+
+\def\strc_itemgroups_setup_symbol_asked
+ {\edef\strc_itemgroups_asked_symbol{\itemgroupparameter\c!symbol}}
+
+\ifdefined\strc_itemgroups_start_columns
+
+ % already defined in page-mix
+
+\else
+
+ % will be redefined in page-mix
+
+ \ifdefined\startcolumns \else
+ \unexpanded\def\startcolumns[#settings]{}
+ \unexpanded\def\stopcolumns {}
+ \fi
+
+ \def\strc_itemgroups_start_columns
+ {\startcolumns
+ [\c!n=\itemgroupparameter\c!n,
+ \c!height=,
+ \c!rule=\v!off,
+ \c!balance=\v!yes,
+ \c!align=\v!no]}
+
+ \def\strc_itemgroups_stop_columns
+ {\stopcolumns}
+
+\fi
+
+\unexpanded\def\stopitemgroup
+ {\stopcollectitems
+ \ifconditional\c_strc_itemgroups_text
+ \removeunwantedspaces
+ \space
+ \ignorespaces
+ \else
+ \par
+ \fi
+ \strc_itemgroups_register_status
+ \ifconditional\c_strc_itemgroups_first \else
+ \dostoptagged
+ \dostoptagged
+ % \endgroup % (3)
+ \fi
+ \ifnum\c_strc_itemgroups_column_depth=\c_strc_itemgroups_nesting\relax
+ \strc_itemgroups_stop_columns
+ \global\c_strc_itemgroups_column_depth\zerocount % global ?
+ \strc_itemgroups_tag_stop_group
+ \strc_itemgroups_after_command
+ \dontrechecknextindentation
+ \orelse\ifnum\c_strc_itemgroups_nesting=\plusone
+ \strc_itemgroups_insert_breakallow
+ \strc_itemgroups_tag_stop_group
+ \strc_itemgroups_after_command
+ \useindentnextparameter\itemgroupparameter
+ \else
+ % nieuw, not yet nobreak handling
+ \strc_itemgroups_tag_stop_group
+ \ifcase\c_strc_itemgroups_spacing_mode
+ \strc_itemgroups_after_command
+ \or
+ \strc_itemgroups_after_command
+ \fi
+ \dontrechecknextindentation
+ \fi
+ % new test, needed in sidefloats (surfaced in volker's proceedings)
+ \iftrialtypesetting
+ \strc_counters_restore\v_strc_itemgroups_counter % could happen in LUA
+ \fi
+ \global\advance\c_strc_itemgroups_nesting\minusone
+ \xdef\currentitemlevel{\number\c_strc_itemgroups_nesting}%
+ %\ifconditional\c_strc_itemgroups_text
+ \endgroup % (2)
+ \endgroup % (1)
+ %\else
+ % \endgroup % (2)
+ % \endgroup % (1)
+ % \par % hm, already done, and dangerous as \c_strc_itemgroups_text is already forgotten
+ %\fi
+ \dorechecknextindentation}
+
+% The items.
+
+\unexpanded\def\startitemgroupitem
+ {\dosingleempty\strc_itemgroups_start_item}
+
+\def\strc_itemgroups_start_item_first
+ {\setfalse\c_strc_itemgroups_first
+ % \begingroup % (3)
+ \ifcase\c_strc_itemgroups_nesting
+ % 0
+ \or
+ \strc_itemgroups_start_item_first_one % 1
+ \else
+ \strc_itemgroups_start_item_first_two % 2+
+ \fi}
+
+\def\strc_itemgroups_start_item_first_one
+ {\ifcase\c_strc_itemgroups_column_depth
+ \ifconditional\c_strc_itemgroups_intro\strc_itemgroups_insert_breakno\fi
+ \strc_itemgroups_before_command
+ \strc_itemgroups_tag_start_group
+ \ifconditional\c_strc_itemgroups_intro\strc_itemgroups_insert_breakno\fi
+ \fi}
+
+\def\strc_itemgroups_start_item_first_two
+ {\ifconditional\c_strc_itemgroups_paragraph\else
+ \edef\previtemlevel{\the\numexpr\c_strc_itemgroups_nesting-\plusone}%
+ \ifcase\c_strc_itemgroups_spacing_mode
+ \strc_itemgroups_before_command
+ \or
+ \doifelsenothing\strc_itemgroups_before_command % should possibly expand to empty
+ {\nameditemgroupparameter{\currentparentitemgroup:\previtemlevel}\c!inbetween}%
+ \strc_itemgroups_before_command
+ \else
+ \nameditemgroupparameter{\currentparentitemgroup:\previtemlevel}\c!inbetween
+ \fi
+ \strc_itemgroups_tag_start_group
+ \fi}
+
+\def\strc_itemgroups_start_item_next
+ {\dostoptagged % ok? what do we stop here?
+ \dostoptagged % ok? what do we stop here?
+ \ifconditional\c_strc_itemgroups_text
+ \ifhmode
+ % WS: make the distance between items customizable, think about better default values -> see itemize-1.tex
+ \strc_itemgroups_set_text_item_distance% HH: moved out and made configurable (sort of)
+ \removeunwantedspaces
+ \hskip\m_strc_itemgroups_text_distance\relax
+ \fi
+ \else
+ \strc_itemgroups_between_command
+ \fi}
+
+% c_strc_itemgroups_concat:
+%
+% the problem is that we use leftskip so concat cannot reliable take the height into
+% account; it's .. rather tricky when white space in there anyway (due to \par) .. so
+% we rely on a special blank method
+%
+% \startitemize[n]
+% \item bla
+% \item \startitemize[a]
+% \item bla $\displaystyle\int^{x^{y^4}}$ \item bla
+% \stopitemize
+% \stopitemize
+
+\unexpanded\def\strc_itemgroups_start_item[#reference]% we can reuse more
+ {\def\currentitemreference{#reference}%
+ \ifconditional\c_strc_itemgroups_text
+ % begin of item
+ \else
+ \par
+ \fi
+ \ifconditional\c_strc_itemgroups_concat
+ \strc_itemgroups_insert_breakno
+ \fi
+ \strc_itemgroups_increment_item_counter
+ \ifconditional\c_strc_itemgroups_first
+ \strc_itemgroups_start_item_first
+ \else
+ \strc_itemgroups_start_item_next
+ \fi
+ \ifconditional\c_strc_itemgroups_concat
+ \spac_overlay_lines % see spac-ver.mkvi ... a typical potential problem
+ \setfalse\c_strc_itemgroups_concat
+ \fi
+ \dostarttagged\t!item\empty
+ % \dotagsetitem\empty
+ \dostarttagged\t!itemtag\empty
+ \strc_itemgroups_insert_item
+ \dostoptagged
+ \ifconditional\c_strc_itemgroups_pack
+ \setupwhitespace[\v!none]%
+ \fi
+ \itemgroupparameter\c!inner % will become obsolete (better use setups)
+ \strc_itemgroups_margin_symbol
+ \let\strc_itemgroups_margin_symbol\relax
+ \dostarttagged\t!itemcontent\empty
+ \begstrut % \strut
+ \nobreak % else problems with intext items
+ \seteffectivehsize % NEW !
+ \hskip\d_strc_itemgroups_signal % concat
+ \itemgroupparameter\c!command}
+
+\unexpanded\def\stopitemgroupitem
+ {\ifhmode
+ \endstrut % new per 2017-12-15
+ \fi
+ \ifconditional\c_strc_itemgroups_text
+ % nothing
+ \else
+ \endgraf
+ \fi}
+\unexpanded\def\startitemgrouphead
+ {\dosingleempty\strc_itemgroups_start_head}
+
+\unexpanded\def\strc_itemgroups_start_head[#reference]%
+ {\ifconditional\c_strc_itemgroups_first \else
+ \strc_itemgroups_insert_breakallow
+ \fi
+ \ifconditional\c_strc_itemgroups_pack \else
+ \strc_itemgroups_before_head_command
+ \fi
+ \ifconditional\c_strc_itemgroups_first
+ \ifconditional\c_strc_itemgroups_intro \else
+ \ifcase\c_strc_itemgroups_nesting
+ \strc_itemgroups_insert_breakallow
+ \fi
+ \fi
+ \fi
+ \strc_itemgroups_start_item[#reference]%
+ \pickupgroupedcommand
+ \strc_itemgroups_start_head_indeed
+ \strc_itemgroups_stop_head_indeed
+ \strc_itemgroups_head_body_indeed}
+
+\unexpanded\def\stopitemgrouphead
+ {\dostoptagged
+ \stopitemgroupitem}
+
+\unexpanded\def\strc_itemgroups_start_head_indeed
+ {\settrue\c_strc_itemgroups_head
+ \dotagsetitem\s!head% % weird place
+ \dostarttagged\t!itemhead\empty
+ \useitemgroupstyleandcolor\c!headstyle\c!headcolor\ignorespaces}
+
+\unexpanded\def\strc_itemgroups_stop_head_indeed
+ {\removeunwantedspaces
+ \dostoptagged
+ \ifconditional\c_strc_itemgroups_inline_head
+ \space
+ \ignorespaces
+ \else
+ \ifconditional\c_strc_itemgroups_text
+ \space
+ \ignorespaces
+ \else
+ \par
+ \fi
+ \strc_itemgroups_insert_breakno
+ \ifconditional\c_strc_itemgroups_pack\else\strc_itemgroups_after_head_command\fi
+ \strc_itemgroups_insert_breakno
+ \fi}
+
+\unexpanded\def\strc_itemgroups_head_body_indeed
+ {\dostarttagged\t!itembody\empty
+ \noindentation
+ \ignorespaces}
+
+% Simple commands.
+
+\unexpanded\def\strc_itemgroups_start_do_item
+ {\startitemgroupitem}
+
+\unexpanded\def\strc_itemgroups_start_no_item
+ {\let\currentitemreference\empty
+ \strc_itemgroups_increment_item_counter
+ %\advance\c_strc_itemgroups_n_of_items\plusone
+ \setbox\b_strc_itemgroups\emptyhbox
+ \strc_itemgroups_check_for_repeated
+ \ignorespaces}
+
+\unexpanded\def\strc_itemgroups_start_button[#destination]%
+ {\edef\m_strc_itemgroups_destination{#destination}%
+ \startitemgroupitem}
+
+\unexpanded\def\strc_itemgroups_start_symbol#text%
+ {\def\strc_itemgroups_extra_symbol{#text}%
+ \settrue\c_strc_itemgroups_symbol
+ \startitemgroupitem
+ \dotagsetitem\s!symbol}
+
+\unexpanded\def\strc_itemgroups_start_dummy
+ {\strc_itemgroups_start_symbol
+ %\strut\strut} % two ?
+ \begstrut}
+
+\unexpanded\def\strc_itemgroups_start_subitem
+ {\settrue\c_strc_itemgroups_sub
+ \startitemgroupitem
+ \dotagsetitem\s!sub}
+
+\unexpanded\def\strc_itemgroups_start_edge#text%
+ {\strc_itemgroups_start_symbol
+ {\strc_itemgroups_calculate_list_width\c_strc_itemgroups_nesting
+ \dostarttagged\t!ignore\empty % for the moment, maybe an attribute
+ \hbox to \d_strc_itemgroups_list_width
+ {#text\hskip\itemgroupparameter\c!distance}%
+ \dostoptagged}}
+
+\unexpanded\def\strc_itemgroups_start_margin#text%
+ {\def\strc_itemgroups_margin_symbol % brrr
+ {\dostarttagged\t!ignore\empty % for the moment, maybe an attribute
+ \llap
+ {\begingroup
+ \useitemgroupstyleandcolor\c!marstyle\c!marcolor
+ #text% keep em/ex local
+ \endgroup
+ \hskip\dimexpr\leftskip+\leftmargindistance\relax}%
+ \dostoptagged}%
+ \startitemgroupitem
+ \dotagsetitem\s!margin}
+
+\unexpanded\def\strc_itemgroups_start_text#text%
+ {\def\strc_itemgroups_extra_symbol{#text}%
+ \settrue\c_strc_itemgroups_symbol
+ \settrue\c_strc_itemgroups_txt
+ \startitemgroupitem}
+
+% \unexpanded\def\strc_itemgroups_start_head
+% {\settrue\c_strc_itemgroups_head
+% \startitemgrouphead}
+
+\unexpanded\def\strc_itemgroups_start_items
+ {\dosingleempty\strc_itemgroups_start_items_indeed}
+
+\unexpanded\def\strc_itemgroups_start_items_indeed[#whatever]% something got lost
+ {\strc_itemgroups_start_edge
+ {\dorecurse{0\itemgroupparameter\c!items}{\strc_itemgroups_used_symbol\hss}%
+ \unskip}}
+
+% \unexpanded\def\startspecialitemgroupitem[#name]%
+% {\csname\??itemgroupstart\ifcsname\??itemgroupstart#name\endcsname#name\else\v!item\fi\endcsname}
+
+\unexpanded\def\startspecialitemgroupitem[#name]%
+ {\ifcsname\??itemgroupstart#name\endcsname
+ \expandafter\lastnamedcs
+ \else
+ \expandafter\strc_itemgroups_start_do_item
+ \fi}
+
+\unexpanded\def\stopspecialitemgroupitem
+ {\stopitemgroupitem}
+
+\letvalue{\??itemgroupstart\v!item}\strc_itemgroups_start_do_item
+\letvalue{\??itemgroupstart\v!sub }\strc_itemgroups_start_subitem
+\letvalue{\??itemgroupstart\v!sym }\strc_itemgroups_start_symbol
+\letvalue{\??itemgroupstart\v!ran }\strc_itemgroups_start_edge
+\letvalue{\??itemgroupstart\v!its }\strc_itemgroups_start_items
+\letvalue{\??itemgroupstart\v!mar }\strc_itemgroups_start_margin
+
+\def\optimizelistitemsbreak
+ {\ifcase\c_strc_itemgroups_column_depth
+ \ifconditional\c_strc_itemgroups_optimize
+ \ifcase\c_strc_itemgroups_max_items
+ \orelse\ifnum\c_strc_itemgroups_max_items=\plusthree
+ \ifnum\c_strc_itemgroups_n_of_items>\plusone
+ \strc_itemgroups_insert_nobreak
+ \fi
+ \orelse\ifnum\c_strc_itemgroups_max_items>\plusthree
+ \ifnum\c_strc_itemgroups_n_of_items=\plustwo
+ \ifconditional\c_strc_itemgroups_intro
+ \strc_itemgroups_insert_breakno
+ \else
+ \strc_itemgroups_insert_nobreak
+ \fi
+ \orelse\ifnum\c_strc_itemgroups_max_items=\c_strc_itemgroups_n_of_items\relax
+ \strc_itemgroups_insert_nobreak
+ \orelse\ifnum\c_strc_itemgroups_n_of_items>\plustwo
+ \strc_itemgroups_insert_break
+ \else
+ \ifconditional\c_strc_itemgroups_intro\else\strc_itemgroups_insert_break\fi
+ \fi
+ \fi
+ \fi
+ \fi}
+
+\def\strc_itemgroups_handle_text_item
+ {\scratchdimen\wd\b_strc_itemgroups
+ \advance \scratchdimen \itemgroupparameter\c!distance\relax
+ \ifdim\scratchdimen>\d_strc_itemgroups_list_width
+ \advance\scratchdimen -\d_strc_itemgroups_list_width
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \llap{\hbox to \d_strc_itemgroups_list_width{\ifconditional\c_strc_itemgroups_sub\llap{+\enspace}\fi\box\b_strc_itemgroups\hss}}% was: \hfill
+ \hskip\scratchdimen}
+
+\def\strc_itemgroups_handle_lapped_item_positive
+ {\llap
+ {\dontcomplain
+ \hbox to \d_strc_itemgroups_list_width
+ {\ifconditional\c_strc_itemgroups_sub
+ \dostarttagged\t!ignore\empty
+ \llap{+\enspace}%
+ \dostoptagged
+ \fi
+ \strc_itemgroups_left_sym_filler
+ \box\b_strc_itemgroups % can already have a forced widt, only factor handled here
+ \hfil
+ \hskip\itemgroupparameter\c!distance}}}
+
+\def\strc_itemgroups_handle_lapped_item_negative
+ {\llap
+ {\ifconditional\c_strc_itemgroups_sub
+ \dostarttagged\t!ignore\empty
+ \llap{+\enspace}%
+ \dostoptagged
+ \fi
+ \box\b_strc_itemgroups
+ \hskip\leftmargindistance}}
+
+\def\strc_itemgroups_handle_groups_text_item
+ {\hbox
+ {\ifconditional\c_strc_itemgroups_sub
+ \dostarttagged\t!ignore\empty
+ +\enspace
+ \dostoptagged
+ \fi
+ \box\b_strc_itemgroups
+ \hskip\interwordspace}%
+ \nobreak}
+
+\def\strc_itemgroups_handle_groups_inline_item
+ {\hbox to \d_strc_itemgroups_list_width
+ {\ifconditional\c_strc_itemgroups_sub
+ \dostarttagged\t!ignore\empty
+ \llap{+\enspace}%
+ \dostoptagged
+ \fi
+ \box\b_strc_itemgroups
+ \hss}} % was: \hfill
+
+\unexpanded\def\strc_itemgroups_start_head_sym#text%
+ {\def\strc_itemgroups_extra_symbol{#text}%
+ \settrue\c_strc_itemgroups_symbol
+ \settrue\c_strc_itemgroups_head
+ \strc_itemgroups_start_head}
+
+\def\strc_itemgroups_make_symbol_box
+ {\setbox\b_strc_itemgroups\autodirhbox
+ {\ifconditional\c_strc_itemgroups_head
+ \ifconditional\c_strc_itemgroups_symbol
+ \strc_itemgroups_insert_extra_reference
+ \useitemgroupstyleandcolor\c!symstyle\c!symcolor
+ \strc_itemgroups_extra_symbol
+ \else
+ \useitemgroupstyleandcolor\c!headstyle\c!headcolor
+ \strc_itemgroups_used_symbol
+ \fi
+ \else
+ \ifconditional\c_strc_itemgroups_symbol
+ \strc_itemgroups_insert_extra_reference
+ \useitemgroupstyleandcolor\c!symstyle\c!symcolor
+ \strc_itemgroups_extra_symbol
+ \else
+ \useitemgroupstyleandcolor\c!style\c!color
+ \strc_itemgroups_used_symbol
+ \fi
+ \fi}%
+ \let\strc_itemgroups_extra_symbol\empty
+ \setfalse\c_strc_itemgroups_symbol}
+
+\def\strc_itemgroups_make_fitting_box
+ {\ifdim\wd\b_strc_itemgroups>\itemgroupparameter\c!maxwidth\relax
+ \normalexpanded{\global\setitemgroupparameter{\c!maxwidth}{\the\wd\b_strc_itemgroups}}%
+ \fi
+ \ifdim\d_strc_itemgroups_max_width>\zeropoint
+ \setbox\b_strc_itemgroups\simplealignedbox
+ {\dimexpr\d_strc_itemgroups_max_width+\itemgroupparameter\c!distance\relax}
+ {\itemgroupparameter\c!itemalign}
+ {\box\b_strc_itemgroups\hskip\itemgroupparameter\c!distance}%
+ \fi}
+
+\def\strc_itemgroups_make_aligned_box
+ {\doifsomething{\itemgroupparameter\c!itemalign}
+ {\setbox\b_strc_itemgroups\simplealignedbox
+ {\dimexpr\d_strc_itemgroups_asked_width+\itemgroupparameter\c!distance\relax}
+ {\itemgroupparameter\c!itemalign}
+ {\box\b_strc_itemgroups\hskip\itemgroupparameter\c!distance}}}
+
+\def\strc_itemgroups_make_destination_box
+ {\iftrialtypesetting \orelse \ifx\m_strc_itemgroups_destination\empty \else
+ \setbox\b_strc_itemgroups\hbox{\directgotobox{\box\b_strc_itemgroups}[\m_strc_itemgroups_destination]}%
+ \fi}
+
+\def\strc_itemgroups_check_indenting
+ {\setfalse\c_strc_itemgroups_indented_first
+ \ifx\m_strc_itemgroups_indenting\empty \else
+ \normalexpanded{\setupindenting[\v!reset,\v!yes,\m_strc_itemgroups_indenting]}%
+ \ifconditional\c_spac_indentation_indent_first % better is to have a mode
+ \doifnot{\itemgroupparameter\c!alignsymbol}\v!yes
+ {\settrue\c_strc_itemgroups_indented_first}%
+ \fi
+ \fi}
+
+\def\strc_itemgroups_check_for_repeated
+ {\ifconditional\c_strc_itemgroups_repeat
+ \ifx\m_strc_itemgroups_repeat_start\empty
+ \edef\m_strc_itemgroups_repeat_start{\currentitemlevel}%
+ \fi
+ \else
+ \let\m_strc_itemgroups_repeat_start\empty
+ \fi}
+
+\def\strc_itemgroups_insert_item
+ {\ifconditional\c_strc_itemgroups_text % again?
+ % begin of item
+ \else
+ \par % done twice?
+ \fi
+ \advance\c_strc_itemgroups_n_of_items\plusone
+ \optimizelistitemsbreak
+ \strc_itemgroups_check_indenting
+ \dontleavehmode
+ \ifconditional\c_strc_itemgroups_indented_first
+ \hskip-\parindent
+ \fi
+ \strc_itemgroups_make_symbol_box
+ \strc_itemgroups_make_destination_box
+ \ifconditional\c_strc_itemgroups_fitting
+ \strc_itemgroups_make_fitting_box
+ \else\ifdim\d_strc_itemgroups_asked_width>\zeropoint
+ \strc_itemgroups_make_aligned_box
+ \fi\fi
+ \let\m_strc_itemgroups_destination\empty
+ \ht\b_strc_itemgroups\strutheight % just in case a symbols is not yet available in
+ \dp\b_strc_itemgroups\strutdepth % the current run (more a mkii mp side artifact)
+ \strc_itemgroups_check_for_repeated
+ \ifdim\d_strc_itemgroups_asked_width<\zeropoint\relax
+ \strc_itemgroups_handle_lapped_item_negative
+ \else
+ \ifzeropt\d_strc_itemgroups_asked_width
+ \strc_itemgroups_calculate_list_width\plusone
+ \else
+ \strc_itemgroups_calculate_list_width\c_strc_itemgroups_nesting
+ \fi
+ \ifconditional\c_strc_itemgroups_text
+ \strc_itemgroups_handle_groups_text_item
+ \orelse\ifconditional\c_strc_itemgroups_inline
+ \strc_itemgroups_handle_groups_inline_item
+ \orelse\ifconditional\c_strc_itemgroups_txt
+ \strc_itemgroups_handle_text_item
+ \else
+ \strc_itemgroups_handle_lapped_item_positive
+ \fi
+ \fi
+ \setfalse\c_strc_itemgroups_head
+ \setfalse\c_strc_itemgroups_sub
+ \ifconditional\c_strc_itemgroups_indented_first
+ \hskip\parindent
+ \fi
+ \ignorespaces}
+
+\def\strc_itemgroups_start_item_nop
+ {\let\currentitemreference\empty
+ \strc_itemgroups_increment_item_counter
+ \advance\c_strc_itemgroups_n_of_items\plusone
+ \setbox\b_strc_itemgroups\hbox
+ {\useitemgroupstyleandcolor\c!style\c!color
+ \strc_itemgroups_used_symbol}%
+ \strc_itemgroups_check_for_repeated
+ \ignorespaces}
+
+\setvalue{\??itemgroupdistance\v!none}%
+ {\let\m_strc_itemgroups_text_distance\zeropoint}
+
+\setvalue{\??itemgroupdistance\v!space}%
+ {\def\m_strc_itemgroups_text_distance{\interwordspace\!!plus\interwordstretch\!!minus\interwordshrink}}
+
+\setvalue\??itemgroupdistance % catches empty value
+ {\let\m_strc_itemgroups_text_distance\zeropoint}
+
+\unexpanded\def\strc_itemgroups_set_text_item_distance
+ {\edef\m_strc_itemgroups_text_distance{\itemgroupparameter\c!textdistance}%
+ \ifx\m_strc_itemgroups_text_distance\empty
+ %
+ \orelse\ifcsname\??itemgroupdistance\m_strc_itemgroups_text_distance\endcsname
+ \lastnamedcs
+ \else
+ \strc_itemgroups_set_text_item_distance_indeed
+ \fi}
+
+\def\strc_itemgroups_set_text_item_distance_indeed
+ {\assignvalue
+ \m_strc_itemgroups_text_distance
+ \m_strc_itemgroups_text_distance
+ {.5\interwordspace\!!plus.5\emwidth}%
+ {\interwordspace \!!plus \emwidth}%
+ {\emwidth \!!plus \interwordstretch\!!minus\interwordshrink}}
+
+% \unexpanded\def\strc_itemgroups_default_command
+% {\EveryPar{\ignorespaces}% needed ?
+% \ignorespaces}
+
+\unexpanded\def\strc_itemgroups_default_command
+ {\ignorespaces}
+
+%D Special case:
+
+\unexpanded\def\strc_itemgroups_head#text\par
+ {\startitemgrouphead{#text}}
+
+%D The local commands:
+
+\appendtoks
+ \let\item \strc_itemgroups_start_do_item
+ \let\noitem \strc_itemgroups_start_no_item
+ \let\itm \strc_itemgroups_start_do_item
+ \let\but \strc_itemgroups_start_button
+ \let\nop \strc_itemgroups_start_dummy
+ \let\txt \strc_itemgroups_start_text
+ \let\head \strc_itemgroups_head
+ \let\headsym \strc_itemgroups_start_head_sym
+ \let\startitem \startitemgroupitem
+ \let\stopitem \stopitemgroupitem
+ \let\starthead \startitemgrouphead
+ \let\stophead \stopitemgroupitemhead
+ \let\startspecialitem\startspecialitemgroupitem
+ \let\stopspecialitem \stopspecialitemgroupitem
+\to \itemgroupcommands
+
+\ifx\currentinterface \v!english \else
+
+ \appendtoks
+ \expandafter\let\csname\v!item \endcsname\strc_itemgroups_start_do_item
+ \expandafter\let\csname\v!sub \endcsname\strc_itemgroups_start_subitem
+ \expandafter\let\csname\v!sym \endcsname\strc_itemgroups_start_symbol
+ \expandafter\let\csname\v!ran \endcsname\strc_itemgroups_start_edge
+ \expandafter\let\csname\v!head \endcsname\strc_itemgroups_head
+ \expandafter\let\csname\v!its \endcsname\strc_itemgroups_start_items
+ \expandafter\let\csname\v!mar \endcsname\strc_itemgroups_start_margin
+ \expandafter\let\csname\v!txt \endcsname\strc_itemgroups_start_text
+ \expandafter\let\csname\e!start\v!item\endcsname\startitemgroupitem
+ \expandafter\let\csname\e!stop \v!item\endcsname\stopitemgroupitem
+ \expandafter\let\csname\e!start\v!head\endcsname\startitemgrouphead
+ \expandafter\let\csname\e!stop \v!head\endcsname\stopitemgrouphead
+ \to \itemgroupcommands
+
+\fi
+
+\relaxvalueifundefined \v!item
+\relaxvalueifundefined \v!sub
+\relaxvalueifundefined \v!sym
+\relaxvalueifundefined \v!ran
+\relaxvalueifundefined \v!head
+\relaxvalueifundefined \v!its
+\relaxvalueifundefined \v!mar
+\relaxvalueifundefined \v!txt
+\relaxvalueifundefined {\e!start\v!item}
+\relaxvalueifundefined {\e!stop \v!item}
+\relaxvalueifundefined {\e!start\v!head}
+\relaxvalueifundefined {\e!stop \v!head}
+
+%D A nice example of a plugin:
+%D
+%D \startbuffer
+%D \startitemize[a,random,packed]
+%D \startitem first \stopitem \startitem second \stopitem
+%D \startitem third \stopitem \startitem fourth \stopitem
+%D \stopitemize
+%D
+%D \startitemize[a,random,packed]
+%D \startitem first \stopitem \startitem second \stopitem
+%D \startitem third \stopitem \startitem fourth \stopitem
+%D \stopitemize
+%D
+%D \startitemize[a,packed]
+%D \startitem first \stopitem \startitem second \stopitem
+%D \startitem third \stopitem \startitem fourth \stopitem
+%D \stopitemize
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+% better collectitems als conditional and a real plugin mechanism (some day)
+
+\newcount\c_strc_itemgroups_collected_stored
+\newcount\c_strc_itemgroups_collected_done
+\newcount\c_strc_itemgroups_collected_current
+
+% \expandafter\def\expandafter\strc_itemgroups_collected_store\expandafter#\expandafter1\csname\e!stop\v!item\endcsname % use grabuntil
+% {\advance\c_strc_itemgroups_collected_stored\plusone
+% \setvalue{\??itemgroupstack\number\c_strc_itemgroups_collected_stored}{\startitemgroupitem#1\stopitemgroupitem}}
+
+\let\strc_itemgroups_collected_store\relax
+
+\normalexpanded{\def\strc_itemgroups_collected_store#1\csname\e!stop\v!item\endcsname}%
+ {\advance\c_strc_itemgroups_collected_stored\plusone
+ \setvalue{\??itemgroupstack\number\c_strc_itemgroups_collected_stored}{\startitemgroupitem#1\stopitemgroupitem}}
+
+\def\strc_itemgroups_collected_flush_randomize
+ {\collecteditemgroupitem}
+
+\def\strc_itemgroups_collected_flush_horizontal
+ {\begingroup
+ \scratchcounter\itemgroupparameter\c!n\relax
+ \ifnum\c_strc_itemgroups_collected_done>\plusone
+ \ifcase\modulonumber\scratchcounter\c_strc_itemgroups_collected_done\relax
+ % compensate for rounding errors
+ \hfill % \hskip\zeropoint plus \scaledpoint minus \scaledpoint
+ \allowbreak
+ \fi
+ \fi
+ \noindent % no \dontleavehmode
+ \hbox to \dimexpr\availablehsize/\scratchcounter\relax{\collecteditemgroupitem\hss}%
+ \endgroup}
+
+% \def\strc_itemgroups_collected_flush_indeed
+% {\collecteditemgroupitem
+% \iftrialtypesetting
+% \undefinevalue{\??itemgroupstack\number\c_strc_itemgroups_collected_current}%
+% \fi}
+
+\def\strc_itemgroups_collected_flush_indeed
+ {\collecteditemgroupitem
+ \undefinevalue{\??itemgroupstack\number\c_strc_itemgroups_collected_current}}
+
+\def\strc_itemgroups_collected_flush
+ {\ifconditional\c_strc_itemgroups_randomize
+ \getrandomcount\c_strc_itemgroups_collected_current\plusone\c_strc_itemgroups_collected_stored
+ \else
+ \advance\c_strc_itemgroups_collected_current\plusone
+ \fi
+ \ifcsname\??itemgroupstack\number\c_strc_itemgroups_collected_current\endcsname
+ \edef\collecteditemgroupitem{\lastnamedcs}%
+ \ifconditional\c_strc_itemgroups_horizontal
+ \strc_itemgroups_collected_flush_horizontal
+ \else
+ \strc_itemgroups_collected_flush_indeed
+ \fi
+ \advance\c_strc_itemgroups_collected_done\plusone
+ \fi
+ \ifnum\c_strc_itemgroups_collected_done<\c_strc_itemgroups_collected_stored
+ \expandafter\strc_itemgroups_collected_flush
+ \fi}
+
+\unexpanded\def\stopcollectitems
+ {\ifconditional\c_strc_itemgroups_collecting
+ \c_strc_itemgroups_collected_done \zerocount
+ \c_strc_itemgroups_collected_current\zerocount
+ \ifnum\c_strc_itemgroups_collected_stored>\zerocount
+ \ifconditional\c_strc_itemgroups_horizontal
+ \strc_itemgroups_before_command
+ \setfalse\c_strc_itemgroups_first
+ \strc_itemgroups_collected_flush
+ %\strc_itemgroups_after_command % triggered elsewhere
+ \else
+ \strc_itemgroups_collected_flush
+ \fi
+ \fi
+ \fi}
+
+\unexpanded\def\startcollectitems
+ {\ifconditional\c_strc_itemgroups_collecting
+ \c_strc_itemgroups_collected_stored\zerocount
+ \letvalue{\e!start\v!item}\strc_itemgroups_collected_store
+ \fi}
+
+%D Left-overs:
+
+\unexpanded\def\item
+ {\strc_itemgroups_item_alone}
+
+\def\strc_itemgroups_item_alone[#category]#text\par
+ {\doifelsesomething{#category}{\startitemgroup[#category]}{\startitemgroup[\v!itemize]}%
+ \startitem#text\stopitem
+ \stopitemgroup}
+
+\unexpanded\def\head
+ {\strc_itemgroups_head_alone}
+
+\def\strc_itemgroups_head_alone[#category]#head\par#body\par
+ {\doifelsesomething{#category}{\startitemgroup[#category]}{\startitemgroup[\v!itemize]}%
+ \starthead{#head}#body\stophead
+ \stopitemgroup}
+
+\setuvalue{\e!start\v!item}%
+ {\startitemgroup[\v!itemize]%
+ \startitemgroupitem
+ \setuvalue{\e!stop\v!item}{\stopitemgroupitem\stopitemgroup}}
+
+% \def\sym#text%
+% {\noindent
+% \begingroup
+% \setbox\scratchbox\hbox{\settrialtypesetting#text}%
+% \setbox\scratchbox\hbox\ifdim\wd\scratchbox<1em to 1.5\else spread 1\fi em{#text\hfil}%
+% \normalexpanded{\box\scratchbox\endgroup\hangindent\the\wd\scratchbox}%
+% \ignorespaces}
+
+%D End of plugin.
+
+%D Something for tables:
+
+\unexpanded\def\itemtag
+ {\dosingleempty\strc_itemgroups_item_tag}
+
+\unexpanded\def\strc_itemgroups_item_tag[#reference]% we can reuse more
+ {\def\currentitemreference{#reference}%
+ \iftrialtypesetting
+ \strc_counters_save\v_strc_itemgroups_counter
+ \strc_itemgroups_increment_item_counter
+ \strc_itemgroups_insert_item_tag_indeed
+ \strc_counters_restore\v_strc_itemgroups_counter
+ \else
+ \strc_itemgroups_increment_item_counter
+ \strc_itemgroups_insert_item_tag_indeed
+ \fi}
+
+\def\strc_itemgroups_insert_item_tag_indeed
+ {\letitemgroupparameter\c!distance\zeropoint
+ %letitemgroupparameter\c!width\zeropoint
+ \strc_itemgroups_make_symbol_box
+ \strc_itemgroups_make_destination_box
+ \let\m_strc_itemgroups_destination\empty
+ \ht\b_strc_itemgroups\strutheight
+ \dp\b_strc_itemgroups\strutdepth
+ \box\b_strc_itemgroups
+ \ignorespaces}
+
+%D Done again.
+
+\setupitemgroup
+ [\c!margin=\zeropoint,
+ \c!leftmargin=\zeropoint,
+ \c!rightmargin=\zeropoint,
+ \c!leftmargindistance=\zeropoint,
+ \c!rightmargindistance=\zeropoint,
+ \c!indentnext=\v!yes,
+ \c!width=1.5\emwidth,
+ \c!factor=0,
+ %\c!distance=.5em, % is now:
+ \c!step=.5\emwidth, % deals with broad
+ \c!distance=\zeropoint,
+ %\c!align=\v!normal, % definitely not \v!normal !
+ %\c!symalign=,
+ %\c!color=,
+ %\c!indenting=, % untouched if empty
+ %\c!style=,
+ \c!marstyle=\v!type,
+ %\c!symstyle=,
+ %\c!headstyle=,
+ %\c!marcolor=,
+ %\c!symcolor=,
+ %\c!headcolor=,
+ %\c!beforehead=,
+ \c!symcolor=\itemgroupparameter\c!color, % new per 2012.01.17
+ \c!symstyle=\itemgroupparameter\c!style, % new per 2012.01.17
+ \c!afterhead=\blank,
+ \c!before=\blank,
+ \c!inbetween=\blank,
+ \c!after=\blank,
+ %\c!stopper=.,
+ \c!placestopper=\v!yes,
+ \c!stopper=.,
+ %\c!inner=,
+ \c!n=2,
+ \c!items=4,
+ \c!levels=10,
+ \c!lefttext=(,
+ \c!righttext=),
+ \c!start=1,
+ \c!packcriterium=\zerocount,
+ \c!criterium=\v!all, % permits 0 and negative numbers
+ %\c!option=,
+ \c!textdistance=\v!space, % none big medium small <dimension>
+ \c!command=\strc_itemgroups_default_command,
+ \c!indenting=\v!next,
+ %\c!alignsymbol=v!no,
+ \c!symbol=\currentitemlevel,
+ \c!prefix=\v!no,
+ %\c!prefixstopper=.,
+ %\c!prefixseparatorset=,
+ %\c!prefixconversion=,
+ %\c!prefixconversionset=,
+ %\c!prefixset=,
+ %\c!prefixsegments=1:100,
+ \c!prefixconnector=.,
+ \c!numberseparatorset=,
+ \c!numberconversionset=,
+ \c!numberstopper=.,
+ \c!numbersegments=1]
+
+\defineitemgroup
+ [\v!itemize]
+
+%D This is really ugly I should get rid of the global mess, whuch is a side
+%D effect of the simple \type {\item} interface that we're stuck with for
+%D compatibility reasons. See footnotes for usage. It's probablynot robust
+%D for mixed itemgroups so in the end I need to get rid of the globals. One
+%D problem is that counters are set.
+
+\defineitemgroup
+ [\v!itemize:\v!note]
+
+\def\strc_itemgroups_push
+ {\edef\strc_itemgroups_pop
+ {\xdef\noexpand\currentitemlevel{\currentitemlevel}%
+ \global\c_strc_itemgroups_nesting \the\c_strc_itemgroups_nesting \relax
+ \global\c_strc_itemgroups_column_depth\the\c_strc_itemgroups_column_depth\relax}%
+ \global\c_strc_itemgroups_column_depth\zerocount
+ \global\c_strc_itemgroups_nesting \zerocount
+ \glet\currentitemlevel\!!zerocount
+ \unexpanded\def\startitemize{\startitemgroup[\v!itemize:\v!note]}%
+ \unexpanded\def\stopitemize {\stopitemgroup}}
+
+\let\strc_itemgroups_pop\relax
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-itm.mkvi b/Master/texmf-dist/tex/context/base/mkiv/strc-itm.mkvi
index 0fc20432081..cbbefd5dbcc 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-itm.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-itm.mkvi
@@ -15,14 +15,14 @@
\registerctxluafile{strc-itm}{}
-%D As we analyze/register widths and such we could as well push and pop the
-%D numbers at the \LUA\ end (which saves a few calls).
-
-%D Cleaning up this module happened around the time when Kate Bush came up
-%D with the nicest numbered list of words: 50 Words For Snow. It's therefore
-%D no surprise that I had that cd running several times when updating this
-%D code. One of the highlights of 2011.
-
+%D As we analyze/register widths and such we could as well push and pop the numbers
+%D at the \LUA\ end (which saves a few calls).
+%D
+%D Cleaning up this module happened around the time when Kate Bush came up with the
+%D nicest numbered list of words: 50 Words For Snow. It's therefore no surprise that
+%D I had that cd running several times when updating this code. One of the
+%D highlights of 2011.
+%D
%D This module needs to be rewritten but that is tricky with respect to
%D compatibilitity. Basically each major variant (regular, text, columns,
%D horizontal, etc) needs to be on its own.
@@ -198,14 +198,15 @@
\newconditional\c_strc_itemgroups_txt
\newconditional\c_strc_itemgroups_extra
\newconditional\c_strc_itemgroups_repeat
+\newconditional\c_strc_itemgroups_inline_head
% 0 = before/after
% 1 = between unless before
% 2 = between
-\newconstant \c_strc_itemgroups_spacing_mode \c_strc_itemgroups_spacing_mode\plustwo
-\newconditional\c_strc_itemgroups_optimize \settrue\c_strc_itemgroups_optimize
-\newconditional\c_strc_itemgroups_auto_concat \settrue\c_strc_itemgroups_auto_concat
+\newconstant \c_strc_itemgroups_spacing_mode \c_strc_itemgroups_spacing_mode\plustwo
+\newconditional\c_strc_itemgroups_optimize \settrue\c_strc_itemgroups_optimize
+\newconditional\c_strc_itemgroups_auto_concat \settrue\c_strc_itemgroups_auto_concat
\newsignal \d_strc_itemgroups_signal
@@ -214,30 +215,28 @@
\newdimen \d_strc_itemgroups_list_width
\newdimen \d_strc_itemgroups_asked_width
-\newdimen \d_strc_itemgroups_max_width % multipass
-\newcount \c_strc_itemgroups_max_items % multipass
+\newdimen \d_strc_itemgroups_max_width % multipass
+\newcount \c_strc_itemgroups_max_items % multipass
\newcount \c_strc_itemgroups_n_of_items
\newcount \c_strc_itemgroups_nesting
\newcount \c_strc_itemgroups_column_depth
-\def \v_strc_itemgroups_counter {itemgroup:\currentparentitemgroup}
-
-\let \m_strc_itemgroups_repeat_start \empty
-\def \v_strc_itemgroups_unknown_symbol {?}
+\def \v_strc_itemgroups_counter {itemgroup:\currentparentitemgroup}
+\let \m_strc_itemgroups_repeat_start \empty
+\def \v_strc_itemgroups_unknown_symbol {?}
+\let \m_strc_itemgroups_indenting \empty
+\let \m_strc_itemgroups_destination \empty
-\let \m_strc_itemgroups_indenting \empty
-\let \m_strc_itemgroups_destination \empty
+\let \currentitemlevel \!!zerocount % public
+\def \currentnofitems {\the\c_strc_itemgroups_max_items}
+\def \currentitemnumber {\strc_counters_raw_sub\v_strc_itemgroups_counter\currentitemlevel} % public
-\let \currentitemlevel \!!zerocount % public
-\def \currentnofitems {\the\c_strc_itemgroups_max_items}
-\def \currentitemnumber {\strc_counters_raw_sub\v_strc_itemgroups_counter\currentitemlevel} % public
+\newtoks \itemgroupcommands % maybe public
-\newtoks \itemgroupcommands % maybe public
-
-\def \currentitemgroupsymbol {n} % here we cannot use a _ in the name
-\let \currentitemgroupconversionset \empty % here we cannot use a _ in the name
-\let \currentitemgroupsegments \empty
+\def \currentitemgroupsymbol {n} % here we cannot use a _ in the name
+\let \currentitemgroupconversionset \empty % here we cannot use a _ in the name
+\let \currentitemgroupsegments \empty
\def\strc_itemgroups_register_status
{\clf_registeritemgroup{\currentparentitemgroup}\c_strc_itemgroups_nesting\c_strc_itemgroups_n_of_items\dimexpr\itemgroupparameter\c!maxwidth\relax}
@@ -390,6 +389,11 @@
\unexpanded\def\strc_itemgroups_process_options#options%
{\processcommacommand[#options]\strc_itemgroups_process_option} % expansion of options is handy for xml
+% \installcommalistprocessorcommand \strc_itemgroups_process_option_list \strc_itemgroups_process_option
+%
+% \unexpanded\def\strc_itemgroups_process_options#options%
+% {\normalexpanded{\strc_itemgroups_process_option_list[#options]}} % expansion of options is handy for xml
+
\def\strc_itemgroups_process_option#option%
{\edef\itemgroupconstantvalue{#option}%
\ifx\itemgroupconstantvalue\empty\else
@@ -437,6 +441,7 @@
\setitemgroupparameter\c!width{0em}%
\fi} % signal
\setvalue{\??itemgroupkeyword\v!intext }{\settrue\c_strc_itemgroups_inline}
+\setvalue{\??itemgroupkeyword\v!headintext }{\settrue\c_strc_itemgroups_inline_head}
\setvalue{\??itemgroupkeyword\v!loose }{\setfalse\c_strc_itemgroups_optimize}
\setvalue{\??itemgroupkeyword\v!fit }{\settrue\c_strc_itemgroups_fitting}
\setvalue{\??itemgroupkeyword\v!nofit }{\setfalse\c_strc_itemgroups_fitting}
@@ -462,26 +467,17 @@
\setvalue{\??itemgroupkeyword\v!seven }{\letitemgroupparameter\c!n\plusseven}
\setvalue{\??itemgroupkeyword\v!eight }{\letitemgroupparameter\c!n\pluseight}
\setvalue{\??itemgroupkeyword\v!nine }{\letitemgroupparameter\c!n\plusnine}
-%setvalue{\??itemgroupkeyword\v!standard }{\setupcurrentitemgroup
-% [\c!width =1.5\emwidth,%
-% \c!distance =.5\emwidth,%
-% \c!factor =0,%
-% \c!inner =,%
-% \c!beforehead=,%
-% \c!afterhead =\blank,%
-% \c!before =\blank,%
-% \c!inbetween =\blank,%
-% \c!after =\blank]}
-\setvalue{\??itemgroupkeyword\v!standard }{\setitemgroupparameter\c!width {1.5\emwidth}%
- \setitemgroupparameter\c!distance {.5\emwidth}%
- \letitemgroupparameter\c!factor \!!zerocount
- \letitemgroupparameter\c!inner \empty
- \letitemgroupparameter\c!beforehead\empty
- \letitemgroupparameter\c!afterhead \blank
- \letitemgroupparameter\c!before \blank
- \letitemgroupparameter\c!inbetween \blank
- \letitemgroupparameter\c!after \blank}
-
+\setvalue{\??itemgroupkeyword\v!standard }{\setitemgroupparameter\c!width {1.5\emwidth}%
+ \setitemgroupparameter\c!distance {.5\emwidth}%
+ %\letitemgroupparameter\c!factor \!!zerocount
+ \letitemgroupparameter\c!factor {\zerocount}%
+ \setitemgroupparameter\c!packcriterium{\zerocount}%
+ \letitemgroupparameter\c!inner \empty
+ \letitemgroupparameter\c!beforehead \empty
+ \letitemgroupparameter\c!afterhead \blank
+ \letitemgroupparameter\c!before \blank
+ \letitemgroupparameter\c!inbetween \blank
+ \letitemgroupparameter\c!after \blank}
\def\strc_itemgroups_initialize_local
{\setfalse\c_strc_itemgroups_inline
@@ -506,9 +502,9 @@
\setfalse\c_strc_itemgroups_columns
% to be checked
\let\m_strc_itemgroups_destination\empty
- \let\strc_itemgroups_used_symbol\empty % ** start value
+ \let\strc_itemgroups_used_symbol \empty % ** start value
\let\strc_itemgroups_margin_symbol\empty
- \let\strc_itemgroups_extra_symbol\empty
+ \let\strc_itemgroups_extra_symbol \empty
%
\global\letitemgroupparameter\c!maxwidth\!!zeropoint
}
@@ -526,6 +522,11 @@
\def\strc_itemgroups_preset_stage_one#options%
{\processcommacommand[#options]\strc_itemgroups_preset_stage_one_indeed}
+% \installcommalistprocessorcommand \strc_itemgroups_preset_stage_one_list \strc_itemgroups_preset_stage_one_indeed
+%
+% \def\strc_itemgroups_preset_stage_one#options%
+% {\normalexpanded{\strc_itemgroups_preset_stage_one_list[#options]}}
+
\def\strc_itemgroups_preset_stage_one_indeed#option%
{\ifcsname\??itemgroupfirst#option\endcsname
\lastnamedcs
@@ -625,10 +626,17 @@
% can be made a bit faster
+% \def\strc_itemgroups_setup_each#category#whatever%
+% {\doifelseassignment{#whatever}
+% {\strc_itemgroups_normal_setup[#category][#whatever]}
+% {\strc_itemgroups_normal_setup[#category][\c!option={#whatever}]}}
+
\def\strc_itemgroups_setup_each#category#whatever%
- {\doifelseassignment{#whatever}
- {\strc_itemgroups_normal_setup[#category][#whatever]}
- {\strc_itemgroups_normal_setup[#category][\c!option={#whatever}]}}
+ {\ifcondition\validassignment{#whatever}%
+ \strc_itemgroups_normal_setup[#category][#whatever]%
+ \else
+ \strc_itemgroups_normal_setup[#category][\c!option={#whatever}]%
+ \fi}
\def\strc_itemgroups_setup_list_level_a#category#whatever#level%
{\strc_itemgroups_normal_setup[#category:#level][#whatever]}
@@ -636,10 +644,17 @@
\def\strc_itemgroups_setup_list_level_b#category#whatever#level%
{\strc_itemgroups_normal_setup[#category:#level][\c!option={#whatever}]}
+% \def\strc_itemgroups_setup_list#subcategories#category#whatever%
+% {\doifelseassignment{#whatever}
+% {\processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_a{#category}{#whatever}}}
+% {\processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_b{#category}{#whatever}}}}
+
\def\strc_itemgroups_setup_list#subcategories#category#whatever%
- {\doifelseassignment{#whatever}
- {\processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_a{#category}{#whatever}}}
- {\processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_b{#category}{#whatever}}}}
+ {\ifcondition\validassignment{#whatever}%
+ \processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_a{#category}{#whatever}}%
+ \else
+ \processcommalist[#subcategories]{\strc_itemgroups_setup_list_level_b{#category}{#whatever}}%
+ \fi}
\def\strc_itemgroups_increment_item_counter
{\ifconditional\c_strc_itemgroups_sub \else
@@ -762,7 +777,7 @@
\d_strc_itemgroups_list_width\d_strc_itemgroups_max_width
\else\ifnum\itemgroupparameter\c!factor>\zerocount
\d_strc_itemgroups_list_width\itemgroupparameter\c!step\relax
- \ifdim\d_strc_itemgroups_list_width=\zeropoint \d_strc_itemgroups_list_width=.5em\fi
+ \ifzeropt\d_strc_itemgroups_list_width \d_strc_itemgroups_list_width=.5em\fi
\multiply\d_strc_itemgroups_list_width \itemgroupparameter\c!factor
\advance\d_strc_itemgroups_list_width\itemgroupparameter\c!width\relax
\else
@@ -786,9 +801,11 @@
\ifthirdargument
\strc_itemgroups_start_indeed[#options][#settings]%
\else\ifsecondargument
- \doifelseassignment{#options}
- {\strc_itemgroups_start_indeed[][#options]}
- {\strc_itemgroups_start_indeed[#options][]}%
+ \ifcondition\validassignment{#options}%
+ \strc_itemgroups_start_indeed[][#options]%
+ \else
+ \strc_itemgroups_start_indeed[#options][]%
+ \fi
\else
\strc_itemgroups_start_indeed[][]%
\fi\fi}
@@ -856,11 +873,21 @@
\fi
\fi
%
+ \ifconditional\c_strc_itemgroups_pack
+ \ifnum\currentnofitems>\itemgroupparameter\c!packcriterium\relax\else
+ \setfalse\c_strc_itemgroups_pack
+ \fi
+ \fi
+ %
\ifnum\c_strc_itemgroups_nesting=\plusone % NIEUW
\doadaptleftskip {\itemgroupparameter\c!margin}%
\doadaptleftskip {\itemgroupparameter\c!leftmargin}%
\doadaptrightskip{\itemgroupparameter\c!rightmargin}%
\fi
+ %
+ \doadaptleftskip {\itemgroupparameter\c!leftmargindistance}%
+ \doadaptrightskip{\itemgroupparameter\c!rightmargindistance}%
+ %
\usealignparameter\itemgroupparameter
\edef\m_strc_itemgroups_indenting{\itemgroupparameter\c!indenting}%
\ifnum\c_strc_itemgroups_nesting>\zerocount
@@ -1183,19 +1210,25 @@
\unexpanded\def\strc_itemgroups_stop_head_indeed
{\removeunwantedspaces
\dostoptagged
- \ifconditional\c_strc_itemgroups_text
- \space
- \ignorespaces
+ \ifconditional\c_strc_itemgroups_inline_head
+ \space
+ \ignorespaces
\else
- \par
- \fi
- \strc_itemgroups_insert_breakno
- \ifconditional\c_strc_itemgroups_pack\else\strc_itemgroups_after_head_command\fi
- \strc_itemgroups_insert_breakno}
+ \ifconditional\c_strc_itemgroups_text
+ \space
+ \ignorespaces
+ \else
+ \par
+ \fi
+ \strc_itemgroups_insert_breakno
+ \ifconditional\c_strc_itemgroups_pack\else\strc_itemgroups_after_head_command\fi
+ \strc_itemgroups_insert_breakno
+ \fi}
\unexpanded\def\strc_itemgroups_head_body_indeed
{\dostarttagged\t!itembody\empty
- \noindentation}
+ \noindentation
+ \ignorespaces}
% Simple commands.
@@ -1469,7 +1502,7 @@
\ifdim\d_strc_itemgroups_asked_width<\zeropoint\relax
\strc_itemgroups_handle_lapped_item_negative
\else
- \ifdim\d_strc_itemgroups_asked_width=\zeropoint\relax
+ \ifzeropt\d_strc_itemgroups_asked_width
\strc_itemgroups_calculate_list_width\plusone
\else
\strc_itemgroups_calculate_list_width\c_strc_itemgroups_nesting
@@ -1763,6 +1796,8 @@
[\c!margin=\zeropoint,
\c!leftmargin=\zeropoint,
\c!rightmargin=\zeropoint,
+ \c!leftmargindistance=\zeropoint,
+ \c!rightmargindistance=\zeropoint,
\c!indentnext=\v!yes,
\c!width=1.5\emwidth,
\c!factor=0,
@@ -1797,6 +1832,7 @@
\c!lefttext=(,
\c!righttext=),
\c!start=1,
+ \c!packcriterium=\zerocount,
\c!criterium=\v!all, % permits 0 and negative numbers
%\c!option=,
\c!textdistance=\v!space, % none big medium small <dimension>
@@ -1820,4 +1856,26 @@
\defineitemgroup
[\v!itemize]
+%D This is really ugly I should get rid of the global mess, whuch is a side
+%D effect of the simple \type {\item} interface that we're stuck with for
+%D compatibility reasons. See footnotes for usage. It's probablynot robust
+%D for mixed itemgroups so in the end I need to get rid of the globals. One
+%D problem is that counters are set.
+
+\defineitemgroup
+ [\v!itemize:\v!note]
+
+\def\strc_itemgroups_push
+ {\edef\strc_itemgroups_pop
+ {\xdef\noexpand\currentitemlevel{\currentitemlevel}%
+ \global\c_strc_itemgroups_nesting \the\c_strc_itemgroups_nesting \relax
+ \global\c_strc_itemgroups_column_depth\the\c_strc_itemgroups_column_depth\relax}%
+ \global\c_strc_itemgroups_column_depth\zerocount
+ \global\c_strc_itemgroups_nesting \zerocount
+ \glet\currentitemlevel\!!zerocount
+ \unexpanded\def\startitemize{\startitemgroup[\v!itemize:\v!note]}%
+ \unexpanded\def\stopitemize {\stopitemgroup}}
+
+\let\strc_itemgroups_pop\relax
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-lnt.mkvi b/Master/texmf-dist/tex/context/base/mkiv/strc-lnt.mkvi
index 4a6f142458e..ad8c80d93e6 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-lnt.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-lnt.mkvi
@@ -160,13 +160,6 @@
% compress=yes|no
% compressmethod=separator|stopper
-\def\c!compressdistance{compressdistance}
-\def\c!compressmethod {compressmethod}
-\def\c!compressstopper {compressstopper} % c
-\def\v!compressstopper {compressstopper} % v
-
-\def\v!separator {separator} % v
-
\setvalue{\??linenotescompressmethod\v!separator}%
{\edef\p_compressseparator{\noteparameter\c!compressseparator}%
\scratchskip\noteparameter\c!compressdistance\relax
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-lst.mkvi b/Master/texmf-dist/tex/context/base/mkiv/strc-lst.mkvi
index 7bc859b670b..d29b1f6fdae 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-lst.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-lst.mkvi
@@ -1117,7 +1117,7 @@
\hangindent\dimexpr\wd\b_strc_lists_number+\scratchdistance\relax
\hangafter\ifx\p_hang\v!no\zerocount\else\plusone\fi
\scratchdimen\listalternativeparameter\c!distance\relax
- \ifdim\wd\b_strc_lists_page=\zeropoint \else\ifdim\scratchdimen>\zeropoint\relax
+ \ifzeropt\wd\b_strc_lists_page \else \ifdim\scratchdimen>\zeropoint\relax
\rightskip\scratchdimen\!!plus\listalternativeparameter\c!stretch\relax
\parfillskip-\rightskip
\fi \fi
@@ -1144,7 +1144,7 @@
\strc_lists_limitated_text\currentlistentrytitle
\endstrut
\endgroup
- \ifdim\wd\b_strc_lists_page=\zeropoint\else
+ \ifzeropt\wd\b_strc_lists_page\else
\nobreak
\currentlistfiller
\box\b_strc_lists_page
@@ -1381,7 +1381,7 @@
\leftskip\scratchoffset
\else
\scratchwidth\p_width
- \ifdim\scratchoffset=\zeropoint
+ \ifzeropt\scratchoffset
\leftskip\dimexpr\scratchwidth+\scratchdistance\relax
\else
\leftskip\scratchoffset
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-mar.lua b/Master/texmf-dist/tex/context/base/mkiv/strc-mar.lua
index 0221b9b8f19..b5fd2667b1a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-mar.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-mar.lua
@@ -45,9 +45,9 @@ local texsetattribute = tex.setattribute
local a_marks = attributes.private("structure","marks")
-local trace_marks_set = false trackers.register("marks.set", function(v) trace_marks_set = v end)
-local trace_marks_get = false trackers.register("marks.get", function(v) trace_marks_get = v end)
-local trace_marks_all = false trackers.register("marks.detail", function(v) trace_marks_all = v end)
+local trace_set = false trackers.register("marks.set", function(v) trace_set = v end)
+local trace_get = false trackers.register("marks.get", function(v) trace_get = v end)
+local trace_details = false trackers.register("marks.details", function(v) trace_details = v end)
local report_marks = logs.reporter("structure","marks")
@@ -100,7 +100,7 @@ local ranges = {
local function resolve(t,k)
if k then
- if trace_marks_set or trace_marks_get then
+ if trace_set or trace_get then
report_marks("undefined mark, name %a",k)
end
local crap = { autodefined = true } -- maybe set = 0 and reset = 0
@@ -162,7 +162,7 @@ function marks.synchronize(class,n,option)
if box then
local first, last = sweep(getlist(box),0,0)
if option == v_keep and first == 0 and last == 0 then
- if trace_marks_get or trace_marks_set then
+ if trace_get or trace_set then
report_marks("action %a, class %a, box %a","retain at synchronize",class,n)
end
-- todo: check if still valid firts/last in range
@@ -184,12 +184,12 @@ function marks.synchronize(class,n,option)
}
ranges[class] = range
end
- if trace_marks_get or trace_marks_set then
+ if trace_get or trace_set then
report_marks("action %a, class %a, first %a, last %a","synchronize",class,range.first,range.last)
end
end
end
- elseif trace_marks_get or trace_marks_set then
+ elseif trace_get or trace_set then
report_marks("action %s, class %a, box %a","synchronize without content",class,n)
end
end
@@ -262,7 +262,7 @@ function marks.relate(name,chain)
end
children[#children+1] = name
end
- elseif trace_marks_set then
+ elseif trace_set then
report_marks("error: invalid relation, name %a, chain %a",name,chain)
end
end
@@ -276,7 +276,7 @@ local function resetchildren(new,name)
for i=1,#children do
local ci = children[i]
new[ci] = false
- if trace_marks_set then
+ if trace_set then
report_marks("action %a, parent %a, child %a","reset",name,ci)
end
resetchildren(new,ci)
@@ -316,7 +316,7 @@ function marks.set(name,value)
new[name] = value
topofstack = topofstack + 1
stack[topofstack] = new
- if trace_marks_set then
+ if trace_set then
if name == child then
report_marks("action %a, name %a, index %a, value %a","set",name,topofstack,value)
else
@@ -329,7 +329,7 @@ end
local function reset(name)
if v_all then
- if trace_marks_set then
+ if trace_set then
report_marks("action %a","reset all")
end
stack = { }
@@ -348,7 +348,7 @@ local function reset(name)
name = parent
dn = data[name]
end
- if trace_marks_set then
+ if trace_set then
report_marks("action %a, name %a, index %a","reset",name,topofstack)
end
dn.reset = topofstack
@@ -404,24 +404,24 @@ local function resolve(name,first,last,strict,quitonfalse,notrace)
else
step, method = 1, "top-down"
end
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("action %a, strategy %a, name %a, parent %a, strict %a","request",method,child,parent,strict or false)
end
- if trace_marks_all and not notrace then
+ if trace_details and not notrace then
marks.show(first,last)
end
local r = dn.reset
local s = dn.set
if first <= last and first <= r then
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("action %a, name %a, first %a, last %a, reset %a, index %a","reset first",name,first,last,r,first)
end
elseif first >= last and last <= r then
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("action %a, name %a, first %a, last %a, reset %a, index %a","reset last",name,first,last,r,last)
end
elseif not stack[first] or not stack[last] then
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
-- a previous or next method can give an out of range, which is valid
report_marks("error: out of range, name %a, reset %a, index %a",name,r,first)
end
@@ -429,12 +429,12 @@ local function resolve(name,first,last,strict,quitonfalse,notrace)
local top = stack[first]
local fullchain = dn.fullchain
if not fullchain or #fullchain == 0 then
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("warning: no full chain, trying again, name %a, first %a, last %a",name,first,last)
end
return resolve(name,first,last)
else
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("found chain [ % => T ]",fullchain)
end
local chaindata = { }
@@ -444,7 +444,7 @@ local function resolve(name,first,last,strict,quitonfalse,notrace)
if data[cname].set > 0 then
local value = resolve(cname,first,last,false,false,true)
if value == "" then
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("quitting chain, name %a, reset %a, start %a",name,r,first)
end
return ""
@@ -453,28 +453,28 @@ local function resolve(name,first,last,strict,quitonfalse,notrace)
end
end
end
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("using chain [ % => T ]",chaindata)
end
local value, index, found = resolve(name,first,last,false,false,true)
if value ~= "" then
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("following chain [ % => T ]",chaindata)
end
for i=1,chainlength do
local cname = fullchain[i]
if data[cname].set > 0 and chaindata[i] ~= found[cname] then
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("quiting chain, name %a, reset %a, index %a",name,r,first)
end
return ""
end
end
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("found in chain, name %a, reset %a, start %a, index %a, value %a",name,r,first,index,value)
end
return value, index, found
- elseif trace_marks_get and not notrace then
+ elseif trace_get and not notrace then
report_marks("not found, name %a, reset %a",name,r)
end
end
@@ -489,18 +489,18 @@ local function resolve(name,first,last,strict,quitonfalse,notrace)
return ""
end
elseif value == true then
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("quitting steps, name %a, reset %a, start %a, index %a",name,r,first,i)
end
return ""
elseif value ~= "" then
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("found in steps, name %a, reset %a, start %a, index %a, value %a",name,r,first,i,value)
end
return value, i, current
end
end
- if trace_marks_get and not notrace then
+ if trace_get and not notrace then
report_marks("not found in steps, name %a, reset %a",name,r)
end
end
@@ -516,7 +516,7 @@ local function doresolve(name,rangename,swap,df,dl,strict)
local range = ranges[rangename] or ranges[v_page]
local first = range.first
local last = range.last
- if trace_marks_get then
+ if trace_get then
report_marks("action %a, name %a, range %a, swap %a, first %a, last %a, df %a, dl %a, strict %a",
"resolving",name,rangename,swap or false,first,last,df,dl,strict or false)
end
@@ -550,12 +550,12 @@ methods[v_bottom_nocheck] = function(name,range) return doresolve(name,range,t
methods[v_next_nocheck] = function(name,range) return doresolve(name,range,true , 0,1,false) end
local function do_first(name,range,check)
- if trace_marks_get then
+ if trace_get then
report_marks("action %a, name %a, range %a","resolving first",name,range)
end
local f_value, f_index, f_found = doresolve(name,range,false,0,0,check)
if f_found then
- if trace_marks_get then
+ if trace_get then
report_marks("action %a, name %a, range %a","resolving last",name,range)
end
local l_value, l_index, l_found = doresolve(name,range,true ,0,0,check)
@@ -565,7 +565,7 @@ local function do_first(name,range,check)
local si = stack[i]
local sn = si[name]
if sn and sn ~= false and sn ~= true and sn ~= "" and sn ~= f_value then
- if trace_marks_get then
+ if trace_get then
report_marks("action %a, name %a, range %a, index %a, value %a","resolving",name,range,i,sn)
end
return sn, i, si
@@ -573,19 +573,19 @@ local function do_first(name,range,check)
end
end
end
- if trace_marks_get then
+ if trace_get then
report_marks("resolved, name %a, range %a, using first",name,range)
end
return f_value, f_index, f_found
end
local function do_last(name,range,check)
- if trace_marks_get then
+ if trace_get then
report_marks("action %a, name %a, range %a","resolving last",name,range)
end
local l_value, l_index, l_found = doresolve(name,range,true ,0,0,check)
if l_found then
- if trace_marks_get then
+ if trace_get then
report_marks("action %a, name %a, range %a","resolving first",name,range)
end
local f_value, f_index, f_found = doresolve(name,range,false,0,0,check)
@@ -595,7 +595,7 @@ local function do_last(name,range,check)
local si = stack[i]
local sn = si[name]
if sn and sn ~= false and sn ~= true and sn ~= "" and sn ~= l_value then
- if trace_marks_get then
+ if trace_get then
report_marks("action %a, name %a, range %a, index %a, value %a","resolving",name,range,i,sn)
end
return sn, i, si
@@ -603,7 +603,7 @@ local function do_last(name,range,check)
end
end
end
- if trace_marks_get then
+ if trace_get then
report_marks("resolved, name %a, range %a, using first",name,range)
end
return l_value, l_index, l_found
@@ -621,7 +621,7 @@ end
local function fetched(name,range,method)
local value = (methods[method] or methods[v_first])(name,range) or ""
- if not trace_marks_get then
+ if not trace_get then
-- no report
elseif value == "" then
report_marks("nothing fetched, name %a, range %a, method %a",name,range,method)
@@ -701,7 +701,7 @@ end
end
function marks.fetch(name,range,method) -- chapter page first | chapter column:1 first
- if trace_marks_get then
+ if trace_get then
report_marks("marking requested, name %a, range %a, method %a",name,range,method)
end
if method == "" or method == v_default then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-not.mkvi b/Master/texmf-dist/tex/context/base/mkiv/strc-not.mkvi
index 3ce01ef3454..05aa1eb6bbe 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-not.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-not.mkvi
@@ -120,7 +120,7 @@
\c!state=\v!start,
\c!levels=3]
-%D The code here is mostly the same as enumersations but we want to keep them
+%D The code here is mostly the same as enumerations but we want to keep them
%D isolated and at some point we might differentiate.
% \installcorenamespace{noteclass}
@@ -943,11 +943,22 @@
\letvalue{\??notepenalty\v!verystrict}\notepenaltyverystrict
\letvalue{\??notepenalty }\notepenaltytolerant
+% \def\strc_notes_set_width
+% {\edef\p_width{\noteparameter\c!width}%
+% \ifx\p_width\empty
+% \setnoteparameter\c!width{\hsize}%
+% \fi}
+
+\setupnotes
+ [\c!width=\v!auto]
+
\def\strc_notes_set_width
{\edef\p_width{\noteparameter\c!width}%
- \ifx\p_width\empty
+ \ifx\p_width\v!auto
+ \setnoteparameter\c!width{\ifdim\hsize<\makeupwidth\hsize\else\makeupwidth\fi}%
+ \else\ifx\p_width\empty
\setnoteparameter\c!width{\hsize}%
- \fi}
+ \fi\fi}
\appendtoks
\strc_notes_set_width
@@ -1388,6 +1399,11 @@
\pickupattributes
\to \everyinsidenoteinsert
+%D Nasty, the might be more:
+
+\appendtoks \strc_itemgroups_push \to \everybeforenoteinsert
+\appendtoks \strc_itemgroups_pop \to \everyafternoteinsert
+
% maybe but better use [scope=local] here
%
% \appendtoks
@@ -1458,7 +1474,7 @@
\c!strut=\v!no,
\c!offset=\v!overlay]%
\inheritednoteframed
- {\ifdim\dp\scratchbox=\zeropoint % this hack is needed because \vadjust
+ {\ifzeropt\dp\scratchbox % this hack is needed because \vadjust
\hpack{\lower\strutdp\box\scratchbox}% % in margin number placement
\else % hides the (always) present depth
\box\scratchbox
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-pag.lua b/Master/texmf-dist/tex/context/base/mkiv/strc-pag.lua
index ee1b245b99b..9b3a77e741f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-pag.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-pag.lua
@@ -45,10 +45,21 @@ pages.collected = collected
pages.tobesaved = tobesaved
pages.nofpages = 0
+-- utilitydata.structures.counters.collected.realpage[1]
+
local function initializer()
collected = pages.collected
tobesaved = pages.tobesaved
- pages.nofpages = #collected
+ -- tricky, with pageinjection we can have holes
+ -- pages.nofpages = #collected
+ -- pages.nofpages = table.count(collected) -- could be a helper
+ local n = 0
+ for k in next, collected do
+ if k > n then
+ n = k
+ end
+ end
+ pages.nofpages = n
end
job.register('structures.pages.collected', tobesaved, initializer)
@@ -172,18 +183,18 @@ function pages.analyze(entry,pagespecification)
if not sectiondata then
return pagedata, false, "no sectiondata"
end
- local no = variables.no
+ local v_no = variables.no
-- local preferences
- if pagespecification and pagespecification.prefix == no then
+ if pagespecification and pagespecification.prefix == v_no then
return pagedata, false, "current spec blocks prefix"
end
-- stored preferences
- -- if entry.prefix == no then
+ -- if entry.prefix == v_no then
-- return pagedata, false, "entry blocks prefix"
-- end
-- stored page state
pagespecification = pagedata.prefixdata
- if pagespecification and pagespecification.prefix == no then
+ if pagespecification and pagespecification.prefix == v_no then
return pagedata, false, "pagedata blocks prefix"
end
-- final verdict
@@ -258,11 +269,18 @@ function helpers.analyze(entry,specification)
return entry, sectiondata, "okay"
end
-function helpers.prefix(data,prefixspec)
+function helpers.prefix(data,prefixspec,nosuffix)
if data then
local _, prefixdata, status = helpers.analyze(data,prefixspec)
if prefixdata then
- sections.typesetnumber(prefixdata,"prefix",prefixspec or false,data.prefixdata or false,prefixdata or false)
+ if nosuffix and prefixspec then
+ local connector = prefixspec.connector
+ prefixspec.connector = nil
+ sections.typesetnumber(prefixdata,"prefix",prefixspec or false,data.prefixdata or false,prefixdata or false)
+ prefixspec.connector = connector
+ else
+ sections.typesetnumber(prefixdata,"prefix",prefixspec or false,data.prefixdata or false,prefixdata or false)
+ end
end
end
end
@@ -305,6 +323,11 @@ function pages.in_body(n)
return texgetcount("pagebodymode") > 0
end
+function pages.fraction(n)
+ local lastpage = texgetcount("lastpageno") -- can be cached
+ return lastpage > 1 and (texgetcount("realpageno")-1)/(lastpage-1) or 1
+end
+
-- move to strc-pag.lua
function counters.analyze(name,counterspecification)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-ref.lua b/Master/texmf-dist/tex/context/base/mkiv/strc-ref.lua
index e01bacaac32..c85b3338a32 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-ref.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-ref.lua
@@ -427,7 +427,7 @@ end
local function synchronizepage(reference) -- non public helper
reference.realpage = texgetcount("realpageno")
- if jobpositions.used then
+ if jobpositions.used() then
reference.x, reference.y = getpos()
end
end
@@ -2603,15 +2603,52 @@ implement {
arguments = { "string", "boolean", "boolean" }
}
-local function referencerealpage()
+-- local function referencerealpage()
+-- local actions = references.currentset
+-- return not actions and 0 or actions.realpage or setreferencerealpage(actions)
+-- end
+--
+-- implement {
+-- name = "referencerealpage",
+-- actions = { referencerealpage, context },
+-- -- arguments = "string" -- hm, weird
+-- }
+
+implement {
+ name = "referencerealpage",
+ actions = function()
+ local actions = references.currentset
+ context(not actions and 0 or actions.realpage or setreferencerealpage(actions))
+ end
+}
+
+local function referencepos(key)
local actions = references.currentset
- return not actions and 0 or actions.realpage or setreferencerealpage(actions)
+ local i = actions[1].i -- brrr
+ local v = 0
+ if i then
+ local a = i.references
+ if a then
+ v = a[key] or 0
+ end
+ end
+ return v
end
+implement { name = "referenceposx", actions = function() context("%p",referencepos("x")) end }
+implement { name = "referenceposy", actions = function() context("%p",referencepos("y")) end }
+
+
implement {
- name = "referencerealpage",
- actions = { referencerealpage, context },
- arguments = "string"
+ name = "referencecolumn",
+ actions = function()
+ local actions = references.currentset
+ local column = 1
+ if actions then
+ column = jobpositions.columnofpos(actions.realpage or setreferencerealpage(actions),referencepos("x"))
+ end
+ context(column or 1)
+ end
}
local plist, nofrealpages
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-ref.mkvi b/Master/texmf-dist/tex/context/base/mkiv/strc-ref.mkvi
index c7f20481592..e774117fa50 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-ref.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-ref.mkvi
@@ -1053,7 +1053,7 @@
\relax}
\def\referencepagedetail
- {\numexpr\clf_referencepagestate
+ {\numexpr\clf_referencepagedetail
{rst::\number\nofreferencestates}%
true %
\ifconditional\pagestatespread false\ifdoublesided true\else false\fi\fi
@@ -1062,6 +1062,24 @@
\def\referencerealpage
{\clf_referencerealpage}
+\def\referencecolumnnumber
+ {\clf_referencecolumn}
+
+% So we need : instead of \ but that's only lmtx:
+%
+% \def\referencecolumnnumber
+% {\numexpr\dimexpr\clf_referenceposx-\cutspace\relax:\dimexpr\makeupwidth/\nofcolumns\relax+\plusone\relax}
+%
+% Tacos patch of the older one, kept here as illustration
+%
+% \def\referencecolumnnumber
+% {\numexpr
+% \dimexpr\clf_referenceposx-\cutspace-\makeupwidth/(2*\nofcolumns)\relax
+% /\dimexpr \makeupwidth/ \nofcolumns \relax
+% +\plusone
+% \relax}
+
+
\unexpanded\def\tracedpagestate
{{\blue\tttf(\ifcase\referencepagedetail unknown\or same\or previous\or next\or above\or below\else unknown\fi)}}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-reg.lua b/Master/texmf-dist/tex/context/base/mkiv/strc-reg.lua
index 47ba1c5338b..6873f89eb72 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-reg.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-reg.lua
@@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['strc-reg'] = {
license = "see context related readme files"
}
-local next, type, tonumber = next, type, tonumber
+local next, type, tonumber, rawget = next, type, tonumber, rawget
local char, format, gmatch = string.char, string.format, string.gmatch
local equal, concat, remove = table.are_equal, table.concat, table.remove
local lpegmatch, P, C, Ct = lpeg.match, lpeg.P, lpeg.C, lpeg.Ct
@@ -46,6 +46,7 @@ local v_previous = variables.previous
local v_first = variables.first
local v_last = variables.last
local v_text = variables.text
+local v_section = variables.section
local context = context
local ctx_latelua = context.latelua
@@ -69,6 +70,7 @@ local absmaxlevel = 5 -- \c_strc_registers_maxlevel
local h_prefixpage = helpers.prefixpage
local h_prefixlastpage = helpers.prefixlastpage
local h_title = helpers.title
+local h_prefix = helpers.prefix
local ctx_startregisteroutput = context.startregisteroutput
local ctx_stopregisteroutput = context.stopregisteroutput
@@ -87,7 +89,7 @@ local ctx_registerentry = context.registerentry
local ctx_registerseeword = context.registerseeword
local ctx_registerpagerange = context.registerpagerange
local ctx_registeronepage = context.registeronepage
-
+local ctx_registersection = context.registersection
local ctx_registerpacked = context.registerpacked
-- possible export, but ugly code (overloads)
@@ -719,14 +721,30 @@ function registers.compare(a,b)
local ka = a.metadata.kind
local kb = b.metadata.kind
if ka == kb then
- local page_a = a.references.realpage
- local page_b = b.references.realpage
- if not page_a or not page_b then
+ local ra = a.references
+ local rb = b.references
+ local pa = ra.realpage
+ local pb = rb.realpage
+ if not pa or not pb then
return 0
- elseif page_a < page_b then
+ elseif pa < pb then
return -1
- elseif page_a > page_b then
+ elseif pa > pb then
return 1
+ else
+ -- new, we need to pick the right one of multiple and
+ -- we want to prevent oscillation in the tuc file so:
+ local ia = ra.internal
+ local ib = rb.internal
+ if not ia or not ib then
+ return 0
+ elseif ia < ib then
+ return -1
+ elseif ia > ib then
+ return 1
+ else
+ return 0
+ end
end
elseif ka == "see" then
return 1
@@ -745,6 +763,8 @@ local seeindex = 0
-- meerdere loops, seewords, dan words, anders seewords
+-- todo: split seeword
+
local function crosslinkseewords(result,check) -- all words
-- collect all seewords
local seewords = { }
@@ -762,23 +782,68 @@ local function crosslinkseewords(result,check) -- all words
end
end
end
+
-- mark seeparents
+
+ -- local seeparents = { }
+ -- for i=1,#result do
+ -- local data = result[i]
+ -- local word = data.list[1]
+ -- local okay = word and word[1]
+ -- if okay then
+ -- local seeindex = seewords[okay]
+ -- if seeindex then
+ -- seeparents[okay] = data
+ -- data.references.seeparent = seeindex
+ -- if trace_registers then
+ -- report_registers("see parent %03i: %s",seeindex,okay)
+ -- end
+ -- end
+ -- end
+ -- end
+
+ local entries = { }
+ local keywords = { }
local seeparents = { }
for i=1,#result do
local data = result[i]
- local word = data.list[1]
- word = word and word[1]
- if word then
- local seeindex = seewords[word]
+ local word = data.list
+ local size = #word
+ if data.seeword then
+ -- beware: a seeword has an extra entry for sorting purposes
+ size = size - 1
+ end
+ for i=1,size do
+ local w = word[i]
+ local e = w[1]
+ local k = w[2] or e
+ entries [i] = e
+ keywords[i] = k
+ end
+ -- first try the keys
+ local okay, seeindex
+ for n=size,1,-1 do
+ okay = concat(keywords,"+",1,n)
+ seeindex = seewords[okay]
+ -- first try the entries
if seeindex then
- seeparents[word] = data
- data.references.seeparent = seeindex
- if trace_registers then
- report_registers("see parent %03i: %s",seeindex,word)
- end
+ break
+ end
+ okay = concat(entries,"+",1,n)
+ seeindex = seewords[okay]
+ if seeindex then
+ break
+ end
+ end
+ if seeindex then
+ seeparents[okay] = data
+ data.references.seeparent = seeindex
+ if trace_registers then
+ report_registers("see parent %03i: %s",seeindex,okay)
end
end
end
+
-- mark seewords and extend sort list
for i=1,#result do
local data = result[i]
@@ -869,6 +934,7 @@ function registers.unique(data,options)
local nofresult = 0
local prev = nil
local dataresult = data.result
+ local bysection = options.pagemethod == v_section -- normally page
for k=1,#dataresult do
local v = dataresult[k]
if prev then
@@ -876,6 +942,9 @@ function registers.unique(data,options)
local pr = prev.references
if not equal(prev.list,v.list) then
-- ok
+ elseif bysection and vr.section == pr.section then
+ v = nil
+ -- ok
elseif pr.realpage ~= vr.realpage then
-- ok
else
@@ -1139,6 +1208,7 @@ function registers.flush(data,options,prefixspec,pagespec)
local collapse_ranges = compress == v_all
local collapse_packed = compress == v_packed
local show_page_number = options.pagenumber ~= false -- true or false
+ local bysection = options.pagemethod == v_section
local result = data.result
local maxlevel = 0
--
@@ -1389,14 +1459,61 @@ function registers.flush(data,options,prefixspec,pagespec)
local seetext = seeword.text or ""
local processor = seeword.processor or (entry.processors and entry.processors[1]) or ""
local seeindex = entry.references.seeindex or ""
- ctx_registerseeword(metadata.name or "",i,nt,processor,0,seeindex,function() h_title(seetext,metadata) end)
+ ctx_registerseeword(
+ metadata.name or "",
+ i,
+ nt,
+ processor,
+ 0,
+ seeindex,
+ function() h_title(seetext,metadata) end
+ )
+ end
+ end
+
+ local function case_5()
+ local first = d
+ while true do
+ if d == #data then
+ break
+ else
+ d = d + 1
+ local next = data[d]
+ if next.metadata.kind == "see" or not equal(entry.list,next.list) then
+ d = d - 1
+ break
+ else
+ entry = next
+ end
+ end
+ end
+ local last = d
+ local n = last - first + 1
+ local i = 0
+ local name = metadata.name or ""
+ local processor = entry.processors and entry.processors[1] or ""
+ for e=first,last do
+ local d = data[e]
+ local sectionindex = d.references.internal or 0
+ i = i + 1
+ ctx_registersection(
+ name,
+ i,
+ n,
+ processor,
+ 0,
+ sectionindex,
+ function() h_prefix(d,prefixspec,true) end
+ )
end
end
if kind == "entry" then
if show_page_number then
ctx_startregisterpages()
- if collapse_singles or collapse_ranges then
+ if bysection then
+ case_5()
+ elseif collapse_singles or collapse_ranges then
case_1()
elseif collapse_packed then
case_2()
@@ -1454,6 +1571,7 @@ implement {
{ "compress" },
{ "criterium" },
{ "check" },
+ { "pagemethod" },
{ "pagenumber", "boolean" },
},
{
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-reg.mkiv b/Master/texmf-dist/tex/context/base/mkiv/strc-reg.mkiv
index 559e1bd4231..e955c700ba7 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-reg.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-reg.mkiv
@@ -425,7 +425,12 @@
\def\strc_registers_finish_entry_indeed#1#2#3% register data userdata
{\begingroup
\edef\currentregister{#1}%
- \setupcurrentregister[\c!entries=,\c!label=,\c!keys=,\c!alternative=,#2]% todo: fast setter
+ %\setupcurrentregister[\c!entries=,\c!label=,\c!keys=,\c!alternative=,#2]% todo: fast setter
+ \resetregisterparameter\c!entries
+ \resetregisterparameter\c!label
+ \resetregisterparameter\c!keys
+ \resetregisterparameter\c!alternative
+ \setupcurrentregister[#2]%
\edef\currentregisterlabel {\registerparameter\c!label}%
\edef\currentregisterexpansion{\registerparameter\c!expansion}%
\edef\currentregisterownnumber{\registerparameter\c!ownnumber}%
@@ -628,13 +633,14 @@
\clf_processregister
{#1}%
{%
- language {\registerparameter\s!language}%
- method {\registerparameter\c!method}%
- numberorder {\registerparameter\c!numberorder}%
- check {\registerparameter\c!check}%
- compress {\registerparameter\c!compress}%
- criterium {\registerparameter\c!criterium}%
- pagenumber \ifx\registerpageseparatorsymbol\empty false\else true\fi
+ language {\registerparameter\s!language}%
+ method {\registerparameter\c!method}%
+ numberorder {\registerparameter\c!numberorder}%
+ check {\registerparameter\c!check}%
+ compress {\registerparameter\c!compress}%
+ criterium {\registerparameter\c!criterium}%
+ pagemethod {\registerparameter\c!pagemethod}%
+ pagenumber \ifx\registerpageseparatorsymbol\empty false\else true\fi
}{%
separatorset {\registerparameter\c!pageprefixseparatorset}%
conversionset {\registerparameter\c!pageprefixconversionset}%
@@ -939,6 +945,18 @@
\fi
\popcurrentregister}
+\newconditional\c_strc_registers_following
+
+\appendtoks
+ \edef\p_compress{\registerparameter\c!compress}%
+ \ifx\p_compress\v!text
+ \settrue\c_strc_registers_following
+ \letregisterparameter\c!compress\v!yes
+ \else
+ \setfalse\c_strc_registers_following
+ \fi
+\to \everyplaceregister
+
\unexpanded\def\registerpagerange#1#2#3#4#5#6#7#8% #1:class #2:processor content, content todo: -- configurable
{\pushcurrentregister{#1}%
\edef\p_pagenumber{\registerparameter\c!pagenumber}%
@@ -949,9 +967,17 @@
\dostarttagged\t!registerfrompage\empty
\withregisterpagecommand{#2}{#3}{#4}{#5}%
\dostoptagged
- \registeronepagerangeseparator
- \dostarttagged\t!registertopage\empty
- \withregisterpagecommand{#2}{#6}{#7}{#8}%
+ \ifconditional\c_strc_registers_following
+ \ifnum#3=\numexpr#6-1\relax
+ \labeltext{following:\s!singular}%
+ \else
+ \labeltext{following:\s!plural}%
+ \fi
+ \else
+ \registeronepagerangeseparator
+ \dostarttagged\t!registertopage\empty
+ \withregisterpagecommand{#2}{#6}{#7}{#8}%
+ \fi
\dostoptagged
\dostoptagged
\fi
@@ -1015,10 +1041,66 @@
\dostoptagged
\popcurrentregister}
+\unexpanded\def\doapplyregistersectioncommand#1#2%
+ {\ifx\currentregistersectionindex\empty
+ \applyprocessor{#1}{#2}%
+ \else\iflocation
+ \strc_references_goto_internal{\applyprocessor{#1}{#2}}[sectionindex:\currentregistersectionindex]%
+ \else
+ \applyprocessor{#1}{#2}%
+ \fi\fi}
+
+\unexpanded\def\defaultregistersection#1#2#3#4#5#6#7% class i n #4:processor #5:internal #6:sectionindex #7:word
+ {\pushcurrentregister{#1}%
+ \ifnum#2=\plusone
+ \registerpageseparator
+ \fi
+ \global\setconstant\c_strc_registers_page_state\plustwo
+ \def\currentregisterpageindex{#5}%
+ \dostarttagged\t!registersection\empty
+ \settrue\c_strc_registers_page_done
+ \iflocation
+ \def\currentregistersectionindex{#6}%
+ \else
+ \let\currentregistersectionindex\empty
+ \fi
+ \ifnum#2=\plusone\else
+ ,\space
+ \fi
+ \doapplyregistersectioncommand{#4}{#7}%
+ \dostoptagged
+ \popcurrentregister}
+
+\let\registersection \defaultregistersection
\let\registerseeword \defaultregisterseeword
\let\registerentry \defaultregisterentry
\let\registercharacter\defaultregistercharacter
+%D Experimental:
+%D
+%D \starttyping
+%D \setupregister
+%D [index]
+%D [pagesegments=1:4,
+%D pagemethod=section]
+%D
+%D \starttext
+%D
+%D \chapter {one} \section {alpha}
+%D
+%D x\index {whatever 1}x\index {whatever 2}x\index {whatever 2}x \page
+%D x\index {whatever 1}x\index {whatever 2}x\index {whatever 2}x \page
+%D
+%D \chapter {one} \section {alpha}
+%D
+%D x\index {whatever 1}x\index {whatever 2}x\index {whatever 2}x \page
+%D x\index {whatever 1}x\index {whatever 2}x\index {whatever 2}x \page
+%D
+%D \placeindex[n=1]
+%D
+%D \stoptext
+%D \stoptyping
+
%D A few specific rendering variants:
% \def\doregisterpagelocation#1#2%
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-ren.mkiv b/Master/texmf-dist/tex/context/base/mkiv/strc-ren.mkiv
index 5cdf5f4a711..59f3a9256ee 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-ren.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-ren.mkiv
@@ -261,7 +261,7 @@
\d_strc_rendering_hang_height\htdp\b_strc_rendering_head
\getnoflines\d_strc_rendering_hang_height
\normalexpanded{\endgroup\n_strc_rendering_hang_lines\the\numexpr\noflines-\plusone\relax}% brrr
- \setbox\b_strc_rendering_head\hbox{\lower\n_strc_rendering_hang_lines\d_strc_rendering_hang_height\box\b_strc_rendering_head}%
+ \setbox\b_strc_rendering_head\hpack{\lower\n_strc_rendering_hang_lines\d_strc_rendering_hang_height\box\b_strc_rendering_head}%
\d_strc_rendering_hang_height\dimexpr\htdp\b_strc_rendering_head-\d_strc_rendering_local_height+\strutdp\relax
\ht\b_strc_rendering_head\strutht
\dp\b_strc_rendering_head\strutdp
@@ -599,24 +599,24 @@
\vbox {
\headsetupspacing
\ifconditional\headshownumber
- \ifdim\headwidth=\zeropoint \else
- \ifdim\headnumberwidth=\zeropoint
- \ifdim\headtextwidth=\zeropoint \else
+ \ifzeropt\headwidth \else
+ \ifzeropt\headnumberwidth
+ \ifzeropt\headtextwidth \else
\headnumberwidth\dimexpr\headwidth-\headtextwidth\relax
\fi
\else
- \ifdim\headtextwidth=\zeropoint
+ \ifzeropt\headtextwidth
\headtextwidth\dimexpr\headwidth-\headnumberwidth\relax
\fi
\fi
\hsize\headwidth
\fi
- \ifdim\headnumberwidth=\zeropoint\else
+ \ifzeropt\headnumberwidth \else
\headnumberdistance\zeropoint
\fi
- \setbox\scratchbox\hbox \ifdim\headnumberwidth=\zeropoint\else to \headnumberwidth\fi{\headnumbercontent}
+ \setbox\scratchbox\hbox \ifzeropt\headnumberwidth\else to \headnumberwidth\fi{\headnumbercontent}
\scratchdimen\dimexpr\wd\scratchbox+\headnumberdistance\relax
- \ifdim\headtextwidth=\zeropoint\else
+ \ifzeropt\headtextwidth \else
\hsize\dimexpr\scratchdimen+\headtextwidth\relax
\fi
\hangindent\scratchdimen
@@ -625,8 +625,8 @@
\box\scratchbox
\hskip\headnumberdistance
\else
- \ifdim\headtextwidth=\zeropoint
- \ifdim\headwidth=\zeropoint \else
+ \ifzeropt\headtextwidth
+ \ifzeropt\headwidth \else
\hsize\headwidth
\fi
\else
@@ -795,7 +795,7 @@
\advance\hsize-\wd\scratchboxone\relax
\headtextcontent
}
- \hbox {
+ \hpack {
\box\scratchboxone
\hskip\headnumberdistance
\box\scratchboxtwo
@@ -824,7 +824,7 @@
\advance\hsize-\wd\scratchboxone\relax
\headtextcontent
}
- \hbox {
+ \hpack {
\box\scratchboxone
\hskip\headnumberdistance
\box\scratchboxtwo
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-sec.mkiv b/Master/texmf-dist/tex/context/base/mkiv/strc-sec.mkiv
index 4066a1f38c8..0e30d92fa03 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-sec.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-sec.mkiv
@@ -430,6 +430,9 @@
}%
\doifelselist\currenthead\donothing
{\definelist[\currenthead][\c!prefix=\v!no]}%
+ % we can't do this now for backward compatibility reasons
+ % \doifelselist\currenthead\donothing
+ % {\normalexpanded{\definelist[\currenthead][\currentheadparent][\c!prefix=\v!no]}}%
\else
\normalexpanded {%
\setheadparameter{\c!label}{\currenthead}%
@@ -637,10 +640,20 @@
\triggerautostructurelevel
\strc_sectioning_handle{#1}{\c!reference={#2},\c!ownnumber={#3},\c!title={#4}}{}} % name ref nr title --
+% \unexpanded\def\strc_sectioning_handle_nop_indeed[#1][#2]% for taco: [key=value] variant
+% {\setfalse\currentstructureown
+% \triggerautostructurelevel
+% \doifelseassignment{#2}\strc_sectioning_handle_nop_indeed_yes\strc_sectioning_handle_nop_indeed_nop{#1}{#2}}
+
\unexpanded\def\strc_sectioning_handle_nop_indeed[#1][#2]% for taco: [key=value] variant
{\setfalse\currentstructureown
\triggerautostructurelevel
- \doifelseassignment{#2}\strc_sectioning_handle_nop_indeed_yes\strc_sectioning_handle_nop_indeed_nop{#1}{#2}}
+ \ifcondition\validassignment{#2}%
+ \expandafter\strc_sectioning_handle_nop_indeed_yes
+ \else
+ \expandafter\strc_sectioning_handle_nop_indeed_nop
+ \fi
+ {#1}{#2}}
\unexpanded\def\strc_sectioning_handle_nop_indeed_yes#1#2%
{\strc_sectioning_handle{#1}{#2}{}}
@@ -1143,16 +1156,6 @@
\prevdepth\strutdepth
\fi}
-\def\strc_sectioning_after_yes
- {\ifconditional\headisdisplay
- \ifconditional\c_strc_sectioning_auto_break
- % \vspacing[\v!samepage-\currentheadlevel]%
- \vspacing[\v!samepage]%
- \fi
- \strc_sectioning_empty_correction
- \headparameter\c!after
- \fi}
-
\def\strc_sectioning_after_nop
{}
@@ -1215,6 +1218,47 @@
\fi
\glet\previoushead\currenthead}
+% \def\strc_sectioning_handle_page_yes
+% {\ifconditional\c_strc_sectioning_ignore_page
+% \setfalse\c_strc_sectioning_ignore_page
+% \else
+% % beware, these numbers are not yet know here
+% \strc_sectioning_handle_page_nop
+% \edef\p_aligntitle{\headparameter\c!aligntitle}%
+% \ifx\p_aligntitle\v!float
+% \ifconditional\c_strc_sectioning_auto_break
+% \vspacing[\v!samepage-\currentheadlevel]%
+% \fi
+% \headparameter\c!before\relax
+% \indent
+% \else
+% \page_otr_command_flush_side_floats
+% \ifconditional\c_strc_sectioning_auto_break
+% \vspacing[\v!samepage-\currentheadlevel]%
+% \fi
+% \headparameter\c!before\relax
+% \fi
+% \global\c_strc_sectioning_preceding_level\currentheadlevel
+% \fi
+% \glet\previoushead\currenthead}
+%
+% \unexpanded\def\strc_sectioning_prevent_page_break% see strc-con
+% {\ifconditional\c_strc_sectioning_auto_break
+% \vspacing[\v!samepage-\the\numexpr\currentheadlevel+\plusone\relax]%
+% \fi}
+%
+% \def\strc_sectioning_after_yes
+% {\ifconditional\headisdisplay
+% \ifconditional\c_strc_sectioning_auto_break
+% % \vspacing[\v!samepage-\currentheadlevel]%
+% \vspacing[\v!samepage]%
+% \fi
+% \strc_sectioning_empty_correction
+% \headparameter\c!after
+% \fi}
+
+% This works better in columns ... but also elsewhere?
+
\def\strc_sectioning_handle_page_yes
{\ifconditional\c_strc_sectioning_ignore_page
\setfalse\c_strc_sectioning_ignore_page
@@ -1224,14 +1268,14 @@
\edef\p_aligntitle{\headparameter\c!aligntitle}%
\ifx\p_aligntitle\v!float
\ifconditional\c_strc_sectioning_auto_break
- \vspacing[\v!samepage-\currentheadlevel]%
+ \spac_vspacing_same_page\currentheadlevel\zerocount
\fi
\headparameter\c!before\relax
\indent
\else
\page_otr_command_flush_side_floats
\ifconditional\c_strc_sectioning_auto_break
- \vspacing[\v!samepage-\currentheadlevel]%
+ \spac_vspacing_same_page\currentheadlevel\zerocount
\fi
\headparameter\c!before\relax
\fi
@@ -1239,11 +1283,21 @@
\fi
\glet\previoushead\currenthead}
-\unexpanded\def\strc_sectioning_prevent_page_break#1% see strc-con
+\def\strc_sectioning_after_yes
+ {\ifconditional\headisdisplay
+ \ifconditional\c_strc_sectioning_auto_break
+ \spac_vspacing_same_page\currentheadlevel\plusone
+ \fi
+ \strc_sectioning_empty_correction
+ \headparameter\c!after
+ \fi}
+
+\unexpanded\def\strc_sectioning_prevent_page_break % see strc-con
{\ifconditional\c_strc_sectioning_auto_break
- \vspacing[\v!samepage-\the\numexpr\currentheadlevel+\ifx#1\empty\plusone\else#1\fi\relax]%
+ \spac_vspacing_same_page\currentheadlevel\plustwo
\fi}
+
% We do support negative numbers but it can have side effects that we won't catch:
%
% \chapter{some} \setupheadnumber[chapter][3] \chapter{more}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-tag.lua b/Master/texmf-dist/tex/context/base/mkiv/strc-tag.lua
index 0453640ca00..88e0f108dc9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-tag.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-tag.lua
@@ -124,10 +124,18 @@ local properties = allocate { -- todo: more "record = true" to improve forma
table = { pdf = "Table", nature = "display" },
tablerow = { pdf = "TR", nature = "display" },
tablecell = { pdf = "TD", nature = "mixed" },
+ tableheadcell = { pdf = "TH", nature = "mixed" },
+ tablehead = { pdf = "THEAD", nature = "display" },
+ tablebody = { pdf = "TBODY", nature = "display" },
+ tablefoot = { pdf = "TFOOT", nature = "display" },
tabulate = { pdf = "Table", nature = "display" },
tabulaterow = { pdf = "TR", nature = "display" },
tabulatecell = { pdf = "TD", nature = "mixed" },
+ tabulateheadcell = { pdf = "TH", nature = "mixed" },
+ tabulatehead = { pdf = "THEAD", nature = "display" },
+ tabulatebody = { pdf = "TBODY", nature = "display" },
+ tabulatefoot = { pdf = "TFOOT", nature = "display" },
list = { pdf = "TOC", nature = "display" },
listitem = { pdf = "TOCI", nature = "display" },
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-tag.mkiv b/Master/texmf-dist/tex/context/base/mkiv/strc-tag.mkiv
index 84e11a63235..83ee030902a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/strc-tag.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-tag.mkiv
@@ -73,6 +73,7 @@
\def\t!registerentry {registerentry} % Span
\def\t!registercontent {registercontent} % Span
\def\t!registersee {registersee} % Span
+\def\t!registersection {registersection} % Span
\def\t!registerpages {registerpages} % Span
\def\t!registerpage {registerpage} % Span
\def\t!registerpagerange {registerpagerange} % Span
@@ -83,9 +84,19 @@
\def\t!table {table} % Table
\def\t!tablerow {tablerow} % TR
\def\t!tablecell {tablecell} % TD
+\def\t!tableheadcell {tableheadcell} % TH
+\def\t!tablehead {tablehead} % THEAD
+\def\t!tablebody {tablebody} % TBODY
+\def\t!tablefoot {tablefoot} % TFOOT
+
+
\def\t!tabulate {tabulate} % Table
\def\t!tabulaterow {tabulaterow} % TR
\def\t!tabulatecell {tabulatecell} % TD
+\def\t!tabulateheadcell {tabulateheadcell} % TH
+\def\t!tabulatehead {tabulatehead} % THEAD
+\def\t!tabulatebody {tabulatebody} % TBODY
+\def\t!tabulatefoot {tabulatefoot} % TFOOT
\def\t!math {math} % math
\def\t!mathtable {mtable} % Table
@@ -463,11 +474,14 @@
{\let\currentparagraph\empty
\paragraph_start_indeed}
+\ifdefined\dotagparagraph \else \let\dotagparagraph \gobbleoneargument \fi
+
\def\paragraph_start_indeed
{\useparagraphstyleandcolor\c!style\c!color
\usealignparameter\paragraphparameter
\usesetupsparameter\paragraphparameter
- \dostarttagged\t!paragraph\currentparagraph}
+ \dostarttagged\t!paragraph\currentparagraph
+ \dotagparagraph{\paragraphparameter\c!align}}
\unexpanded\def\stopparagraph
{\dostoptagged
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-tnt.mkiv b/Master/texmf-dist/tex/context/base/mkiv/strc-tnt.mkiv
new file mode 100644
index 00000000000..0b092b35fcc
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/strc-tnt.mkiv
@@ -0,0 +1,120 @@
+%D \module
+%D [ file=strc-tnt,
+%D version=2019.05.30, % based on older code
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Text Notes,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+%D \macros
+%D {definetextnote,setuptextnote}
+%D
+%D \startbuffer
+%D \definetextnote
+%D [textnote]
+%D
+%D \startbuffer
+%D Test test test \textnote [n=5] {alpha}. test test test test tets test test
+%D \textnote [n=10] {beta}. Test test test test tets test test \textnote [n=12]
+%D {gamma}. Test test test test tets test test \textnote [n=24] {delta}. Test test
+%D test test test test \textnote {epsilon} test test \textnote [n=*] {zeta}.
+%D \stopbuffer
+%D
+%D \blank {\setuptextnote[empty=yes] \getbuffer\par} \blank
+%D \blank {\setuptextnote[empty=number] \getbuffer\par} \blank
+%D \blank {\setuptextnote[empty=none] \getbuffer\par} \blank
+%D \blank { \getbuffer\par} \blank
+%D
+%D \blank[2*big]
+%D
+%D \placenotes[textnote:note][criterium=text]
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\installcorenamespace{textnote}
+
+\installcommandhandler \??textnote {textnote} \??textnote
+
+\definebar
+ [\v!textnote:\v!underbar]
+ [\v!underbar]
+
+\definenote
+ [\v!textnote:\v!note]
+
+\setuptextnote
+ [\c!rule=\v!textnote:\v!underbar,
+ \c!note=\v!textnote:\v!note,
+ \c!n=10] % * will use the real space
+
+\appendtoks
+ \setuevalue{\currenttextnote}{\educ_textnote{\currenttextnote}}%
+\to \everydefinetextnote
+
+\unexpanded\def\educ_textnote#1%
+ {\dontleavehmode
+ \begingroup
+ \def\currenttextnote{#1}%
+ \dosingleempty\educ_textnote_indeed}
+
+\def\educ_textnote_indeed[#1]#2% we could use setups but it's overkill
+ {\iffirstargument\setupcurrenttextnote[#1]\fi
+ \edef\p_n{\textnoteparameter\c!n}%
+ \edef\p_empty{\textnoteparameter\c!empty}%
+ \edef\currentbar{\textnoteparameter\c!rule}%
+ \edef\currentnote{\textnoteparameter\c!note}%
+ \ifx\p_n\wildcardsymbol
+ \donefalse
+ \ifx\p_empty\v!yes
+ \donetrue
+ \else\ifx\p_empty\v!number
+ \donetrue
+ \else\ifx\p_empty\v!none
+ \donetrue
+ \fi\fi\fi
+ \ifdone
+ \setupbar[\currentbar][\c!empty=\v!yes]%
+ \fi
+ \inlinebar[\currentbar]\bgroup
+ \wordboundary#2%
+ \ifx\p_empty\v!yes
+ \setnotetext[\currentnote]{#2}%
+ \else\ifx\p_empty\v!number
+ \runninghbox{\resetbar\setnote[\currentnote]{#2}}%
+ \else\ifx\p_empty\v!none
+ \setupnote[\currentnote][\c!location=\v!none]%
+ \runninghbox{\resetbar\setnote[\currentnote]{#2}}%
+ \fi\fi\fi
+ \egroup
+ \else
+ \inlinebar[\currentbar]\bgroup
+ \scratchcounter\numexpr\p_n/\plustwo\relax
+ \ifx\p_empty\v!yes
+ \interwordspacesbefore\scratchcounter
+ \setnotetext[\currentnote]{#2}%
+ \interwordspacesafter\scratchcounter
+ \else\ifx\p_empty\v!number
+ \interwordspacesbefore\scratchcounter
+ \zwnj\runninghbox{\resetbar\setnote[\currentnote]{#2}}\zwnj
+ \interwordspacesafter\scratchcounter
+ \else\ifx\p_empty\v!none
+ \setupnote[\currentnote][\c!location=\v!none]%
+ \interwordspacesbefore\scratchcounter
+ \zwnj\runninghbox{\resetbar\setnote[\currentnote]{#2}}\zwnj
+ \interwordspacesafter\scratchcounter
+ \else
+ #2%
+ \fi\fi\fi
+ \egroup
+ \fi
+ \endgroup}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/supp-box.lua b/Master/texmf-dist/tex/context/base/mkiv/supp-box.lua
index 1f31f768130..e547c8710d6 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/supp-box.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/supp-box.lua
@@ -12,13 +12,13 @@ local report_hyphenation = logs.reporter("languages","hyphenation")
local tonumber, next, type = tonumber, next, type
-local lpegmatch = lpeg.match
+local lpegmatch = lpeg.match
-local tex = tex
-local context = context
-local nodes = nodes
+local tex = tex
+local context = context
+local nodes = nodes
-local implement = interfaces.implement
+local implement = interfaces.implement
local nodecodes = nodes.nodecodes
@@ -26,6 +26,7 @@ local disc_code = nodecodes.disc
local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
local glue_code = nodecodes.glue
+local penalty_code = nodecodes.penalty
local glyph_code = nodecodes.glyph
local nuts = nodes.nuts
@@ -49,6 +50,7 @@ local takebox = nuts.takebox
local setlink = nuts.setlink
local setboth = nuts.setboth
local setnext = nuts.setnext
+local setprev = nuts.setprev
local setbox = nuts.setbox
local setlist = nuts.setlist
local setdisc = nuts.setdisc
@@ -56,6 +58,8 @@ local setwidth = nuts.setwidth
local setheight = nuts.setheight
local setdepth = nuts.setdepth
local setshift = nuts.setshift
+local setsplit = nuts.setsplit
+local setattrlist = nuts.setattrlist
local flush_node = nuts.flush_node
local flush_list = nuts.flush_list
@@ -64,6 +68,10 @@ local copy_list = nuts.copy_list
local find_tail = nuts.tail
local getdimensions = nuts.dimensions
local hpack = nuts.hpack
+local vpack = nuts.vpack
+local traverse_id = nuts.traverse_id
+local free = nuts.free
+local findtail = nuts.tail
local nextdisc = nuts.traversers.disc
local nextdir = nuts.traversers.dir
@@ -378,13 +386,13 @@ local function getnaturaldimensions(n)
return w, h, d
end
-interfaces.implement {
+implement {
name = "getnaturaldimensions",
arguments = "integer",
actions = getnaturaldimensions
}
-interfaces.implement {
+implement {
name = "naturalwd",
arguments = "integer",
actions = function(n)
@@ -393,7 +401,7 @@ interfaces.implement {
end
}
-interfaces.implement {
+implement {
name = "getnaturalwd",
arguments = "integer",
actions = function(n)
@@ -416,7 +424,7 @@ local function setboxtonaturalwd(n)
setbox(n,new)
end
-interfaces.implement {
+implement {
name = "setnaturalwd",
arguments = "integer",
actions = setboxtonaturalwd
@@ -450,7 +458,7 @@ do
nodes.firstdirinbox = firstdirinbox
- interfaces.implement {
+ implement {
name = "doifelserighttoleftinbox",
arguments = "integer",
actions = function(n)
@@ -481,15 +489,23 @@ do
trackers.register("nodes.boxes",function(v) trace = v end)
- function boxes.save(category,name,box)
+ function boxes.save(category,name,b)
name = tonumber(name) or name
- local b = takebox(box)
+ local b = takebox(b)
if trace then
report("category %a, name %a, %s (%s)",category,name,"save",b and "content" or "empty")
end
cache[category][name] = b or false
end
+ function boxes.savenode(category,name,n)
+ name = tonumber(name) or name
+ if trace then
+ report("category %a, name %a, %s (%s)",category,name,"save",n and "content" or "empty")
+ end
+ cache[category][name] = tonut(n) or false
+ end
+
function boxes.found(category,name)
name = tonumber(name) or name
return cache[category][name] and true or false
@@ -625,8 +641,187 @@ implement {
end
}
-interfaces.implement {
+implement {
name = "shiftbox",
arguments = { "integer", "dimension" },
- actions = function(n,d) setshift(getbox(n),d) end,
+ actions = function(n,d)
+ setshift(getbox(n),d)
+ end,
+}
+
+implement { name = "vpackbox", arguments = "integer", actions = function(n) setbox(n,(vpack(takebox(n)))) end }
+implement { name = "hpackbox", arguments = "integer", actions = function(n) setbox(n,(hpack(takebox(n)))) end }
+
+implement { name = "vpackedbox", arguments = "integer", actions = function(n) context(vpack(takebox(n))) end }
+implement { name = "hpackedbox", arguments = "integer", actions = function(n) context(hpack(takebox(n))) end }
+
+implement {
+ name = "scangivendimensions",
+ public = true,
+ protected = true,
+ arguments = {
+ {
+ { "width", "dimension" },
+ { "height", "dimension" },
+ { "depth", "dimension" },
+ },
+ },
+ actions = function(t)
+ texsetdimen("givenwidth", t.width or 0)
+ texsetdimen("givenheight",t.height or 0)
+ texsetdimen("givendepth", t.depth or 0)
+ end,
+}
+
+local function stripglue(list)
+ local done = false
+ local first = list
+ while first do
+ local id = getid(first)
+ if id == glue_code or id == penalty_code then
+ first = getnext(first)
+ else
+ break
+ end
+ end
+ if first and first ~= list then
+ -- we have discardables
+ setsplit(getprev(first),first)
+ flush_list(list)
+ list = first
+ done = true
+ end
+ if list then
+ local tail = findtail(list)
+ local last = tail
+ while last do
+ local id = getid(last)
+ if id == glue_code or id == penalty_code then
+ last = getprev(last)
+ else
+ break
+ end
+ end
+ if last ~= tail then
+ -- we have discardables
+ flush_list(getnext(last))
+ setnext(last)
+ done = true
+ end
+ end
+ return list, done
+end
+
+local function limitate(t) -- don't pack the result !
+ local text = t.text
+ if text then
+ text = tonut(text)
+ else
+ return
+ end
+ local sentinel = t.sentinel
+ if sentinel then
+ sentinel = tonut(sentinel)
+ local s = getlist(sentinel)
+ setlist(sentinel)
+ free(sentinel)
+ sentinel = s
+ else
+ return tonode(text)
+ end
+ local width = getwidth(text)
+ local list = getlist(text)
+ local done = false
+ if t.strip then
+ list, done = stripglue(list)
+ if not list then
+ setlist(text)
+ setwidth(text,0)
+ return text
+ elseif done then
+ width = getdimensions(list)
+ setlist(text,list)
+ end
+ end
+ local left = t.left or 0
+ local right = t.right or 0
+ if left + right < width then
+ local last = nil
+ local first = nil
+ local maxleft = left
+ local maxright = right
+ local swidth = getwidth(sentinel)
+ if maxright > 0 then
+ maxleft = maxleft - swidth/2
+ maxright = maxright - swidth/2
+ else
+ maxleft = maxleft - swidth
+ end
+ for n in traverse_id(glue_code,list) do
+ local width = getdimensions(list,n)
+ if width > maxleft then
+ if not last then
+ last = n
+ end
+ break
+ else
+ last = n
+ end
+ end
+ if last and maxright > 0 then
+ for n in traverse_id(glue_code,last) do
+ local width = getdimensions(n)
+ if width < maxright then
+ first = n
+ break
+ else
+ first = n
+ end
+ end
+ end
+ if last then
+ local rest = getnext(last)
+ if rest then
+ local tail = findtail(sentinel)
+ if first and getid(first) == glue_code and getid(tail) == glue_code then
+ setwidth(first,0)
+ end
+ if last and getid(last) == glue_code and getid(sentinel) == glue_code then
+ setwidth(last,0)
+ end
+ if first and first ~= last then
+ local prev = getprev(first)
+ if prev then
+ setnext(prev)
+ end
+ setlink(tail,first)
+ end
+ setlink(last,sentinel)
+ setprev(rest)
+ flush_list(rest)
+ end
+ end
+ end
+ setlist(text)
+ free(text)
+ return tonode(list)
+end
+
+implement {
+ name = "limitated",
+ public = true,
+ protected = true,
+ arguments = {
+ {
+ { "left", "dimension" },
+ { "right", "dimension" },
+ { "text", "hbox" },
+ { "sentinel", "hbox" },
+ { "strip", "boolean" },
+ }
+ },
+ actions = function(t)
+ context.dontleavehmode()
+ context(limitate(t))
+ end,
}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/supp-box.mkiv b/Master/texmf-dist/tex/context/base/mkiv/supp-box.mkiv
index 59e7105207b..d43459c631b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/supp-box.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/supp-box.mkiv
@@ -23,6 +23,12 @@
\fixupboxesmode\plusone
+%D And some dimensions:
+
+\newdimen\givenwidth
+\newdimen\givenheight
+\newdimen\givendepth
+
% handy to have
%
% \hbox to \hsize
@@ -57,8 +63,8 @@
%D \macros
%D {dontcomplain}
%D
-%D The next macro suppresses over- and underfull messages which
-%D often makes sense when we deal with boxes.
+%D The next macro suppresses over- and underfull messages which often makes sense
+%D when we deal with boxes.
\unexpanded\def\dontcomplain
{\hbadness\plustenthousand
@@ -66,18 +72,15 @@
\hfuzz \maxdimen
\vfuzz \maxdimen}
-%D This module implements some box manipulation macros. Some
-%D are quite simple, some are more advanced and when understood
-%D well, all can be of use.
+%D This module implements some box manipulation macros. Some are quite simple, some
+%D are more advanced and when understood well, all can be of use.
%D
%D \macros
%D {strutdp,strutht,strutwd}
%D
-%D The next shortcuts save memory and keying. The width is
-%D normally zero points (if not, you're in trouble). These
-%D shortcuts can be used like a dimension, opposite to the
-%D core macros \type {\strutdepth} and alike, which are
-%D values.
+%D The next shortcuts save memory and keying. The width is normally zero points (if
+%D not, you're in trouble). These shortcuts can be used like a dimension, opposite
+%D to the core macros \type {\strutdepth} and alike, which are values.
\def\strutdp {\dp\strutbox}
\def\strutht {\ht\strutbox}
@@ -88,8 +91,8 @@
%D \macros
%D {voidbox,nextbox}
%D
-%D Let's start with an easy one. The next macro hides the
-%D ugly \type {@} in \type {\voidb@x}.
+%D Let's start with an easy one. The next macro hides the ugly \type {@} in \type
+%D {\voidb@x}.
\ifdefined\voidbox \else \newbox\voidbox \fi
\ifdefined\nextbox \else \newbox\nextbox \fi
@@ -97,19 +100,17 @@
%D \macros
%D {nextdepth}
%D
-%D Let's start with a rather simple declaration. Sometimes we
-%D need to save the \TEX\ \DIMENSION\ \type{\prevdepth} and
-%D append it later on. The name \type{\nextdepth} suits
-%D this purpose well.
+%D Let's start with a rather simple declaration. Sometimes we need to save the \TEX\
+%D \DIMENSION\ \type{\prevdepth} and append it later on. The name \type {\nextdepth}
+%D suits this purpose well.
\newdimen\nextdepth
%D \macros
%D {smashbox, smashedbox}
%D
-%D Smashing is introduced in \PLAIN\ \TEX, and stands for
-%D reducing the dimensions of a box to zero. The most resolute
-%D one is presented first.
+%D Smashing is introduced in \PLAIN\ \TEX, and stands for reducing the dimensions of
+%D a box to zero. The most resolute one is presented first.
\unexpanded\def\smashbox#1%
{\wd#1\zeropoint
@@ -125,8 +126,8 @@
%D \macros
%D {hsmashbox,vsmashbox}
%D
-%D Smashing can be used for overlaying boxes. Depending on
-%D the mode, horizontal or vertical, one can use:
+%D Smashing can be used for overlaying boxes. Depending on the mode, horizontal or
+%D vertical, one can use:
\unexpanded\def\hsmashbox#1%
{\wd#1\zeropoint}
@@ -135,8 +136,7 @@
{\ht#1\zeropoint
\dp#1\zeropoint}
-%D The next implementation is less sensitive for spurious
-%D spaces.
+%D The next implementation is less sensitive for spurious spaces.
\newcount\c_boxes_register
@@ -174,10 +174,9 @@
%D {hsmash,vsmash,
%D hsmashed,vsmashed}
%D
-%D While the previous macros expected a \BOX, the next act on a
-%D content. They are some subtle differences betreen the smash
-%D and smashed alternatives. The later ones reduce all
-%D dimensions to zero.
+%D While the previous macros expected a \BOX, the next act on a content. They are
+%D some subtle differences betreen the smash and smashed alternatives. The later
+%D ones reduce all dimensions to zero.
\unexpanded\def\hsmash {\bgroup\dowithnextboxcs\syst_boxes_hsmashed_nextbox\hbox}
\unexpanded\def\vsmash {\bgroup\dowithnextboxcs\syst_boxes_vsmashed_nextbox\vbox}
@@ -227,10 +226,9 @@
%D \macros
%D {smash}
%D
-%D This smash alternative takes an optional arg [whdtb] as
-%D well as is potentially catcode safer. It is needed by the
-%D math module (although the \type {\leavevmode} is not added
-%D here).
+%D This smash alternative takes an optional arg [whdtb] as well as is potentially
+%D catcode safer. It is needed by the math module (although the \type {\leavevmode}
+%D is not added here).
\unexpanded\def\smash
{\begingroup
@@ -304,12 +302,12 @@
%D \macros
%D {phantom, hphantom, vphantom, mathstrut}
%D
-%D The next implementation of \type {\phantom} cum suis does
-%D not grab an argument in the non||math case, which is better.
+%D The next implementation of \type {\phantom} cum suis does not grab an argument in
+%D the non||math case, which is better.
%D
-%D Due to a complicated call to \type {\mathpallete} and
-%D thereby \type {\mathchoice}, the next macro looks ugly.
-%D We also take care of non||braced arguments.
+%D Due to a complicated call to \type {\mathpallete} and thereby \type
+%D {\mathchoice}, the next macro looks ugly. We also take care of non||braced
+%D arguments.
\unexpanded\def\phantom {\begingroup\futurelet\nexttoken\syst_boxes_phantom_indeed }
\unexpanded\def\vphantom{\begingroup\futurelet\nexttoken\syst_boxes_phantom_indeed_v}
@@ -382,8 +380,7 @@
%D \macros
%D {getboxheight}
%D
-%D Although often needed, \TEX\ does not support arithmics
-%D like:
+%D Although often needed, \TEX\ does not support arithmics like:
%D
%D \starttyping
%D \dimen0 = \ht0 + \dp0
@@ -409,33 +406,29 @@
%D {#1\ht#3\advance#1\dp#3\relax}
%D \stoptyping
%D
-%D The next alternative is slightly more clever, since
-%D it accepts \type {{12}} as well as \type {12} as box
-%D number.
+%D The next alternative is slightly more clever, since it accepts \type {{12}} as
+%D well as \type {12} as box number.
\unexpanded\def\getboxheight#1\of#2\box#3%
{\def\next{#1\dimexpr\ht\c_boxes_register+\dp\c_boxes_register\relax}%
\afterassignment\next\c_boxes_register=#3}
-%D For a long time the following three macros were part of
-%D the grid snapping core module, but it makes more sense to
-%D have them here so that users can see them.
+%D For a long time the following three macros were part of the grid snapping core
+%D module, but it makes more sense to have them here so that users can see them.
%D
%D \macros
%D {getnoflines, getroundednoflines, getrawnoflines}
%D
-%D Het commando \type{\getnoflines} converteert een hoogte
-%D (dimensie) in een aantal regels en kent dit toe aan
-%D \type{\noflines}.
+%D Het commando \type {\getnoflines} converteert een hoogte (dimensie) in een aantal
+%D regels en kent dit toe aan \type {\noflines}.
%D
%D \starttyping
%D \getnoflines{dimensie}
%D \stoptyping
%D
-%D Er wordt gedeeld door \type{\openlineheight} en een hoogte
-%D van~0pt komt overeen met 0~regels. The raw alternative
-%D does not round.
-
+%D Er wordt gedeeld door \type {\openlineheight} en een hoogte van~0pt komt overeen
+%D met 0~regels. The raw alternative does not round.
+%D
%D For a long time we had:
%D
%D \starttyping
@@ -444,7 +437,7 @@
%D
%D \def\dogetnoflines#1#2%
%D {\noflinesheight#2\relax
-%D \ifzeropt\noflinesheight % \ifdim\noflinesheight=\zeropoint
+%D \ifzeropt\noflinesheight
%D \noflines\zerocount
%D \else
%D \divide\noflinesheight \openlineheight
@@ -538,9 +531,9 @@
%D \macros
%D {determinenoflines}
%D
-%D The next macro determines the number of lines and
-%D returns it it \type {\noflines}. The macro works
-%D reasonable well as long as the content can be unboxed.
+%D The next macro determines the number of lines and returns it it \type
+%D {\noflines}. The macro works reasonable well as long as the content can be
+%D unboxed.
%D
%D \starttyping
%D \determinenoflines{test\\test}
@@ -548,30 +541,26 @@
%D \determinenoflines{\definedfont[Sans at 40pt]test\\test}
%D \stoptyping
-\def\dodeterminenoflines % can be mkiv'd
+\def\syst_boxes_determine_noflines % can be mkiv'd
{\beginofshapebox
\unvbox\nextbox
\endofshapebox
- % \global\count1\zerocount
- % \reshapebox{\global\advance\count1\plusone}%
- % \egroup\noflines\count1 }%
- \scratchcounter\zerocount
- \reshapebox{\global\advance\scratchcounter\plusone}%
- \expandafter\egroup\expandafter\noflines\the\scratchcounter\relax}
+ \globalscratchcounter\zerocount
+ \reshapebox{\global\advance\globalscratchcounter\plusone}%
+ \expandafter\egroup\expandafter\noflines\the\globalscratchcounter\relax}
\unexpanded\def\determinenoflines
{\bgroup
\forgetall
\let\crlf\endgraf
\let\\\endgraf
- \dowithnextboxcs\dodeterminenoflines\vbox}
+ \dowithnextboxcs\syst_boxes_determine_noflines\vbox}
%D \macros
%D {doiftextelse, doiftext}
%D
-%D When \type {\doifelse} cum suis hopelessly fail, for
-%D instance because we pass data, we can fall back on the next
-%D macro:
+%D When \type {\doifelse} cum suis hopelessly fail, for instance because we pass
+%D data, we can fall back on the next macro:
%D
%D \starttyping
%D \doiftextelse {data} {then branch} {else branch}
@@ -580,7 +569,7 @@
\unexpanded\def\doifelsetext#1%
{\begingroup
- \setbox\scratchbox\hpack
+ \setbox\scratchbox\hbox % no \hpack because we can have fallbacks
{\settrialtypesetting
\ignorespaces#1\removeunwantedspaces}%
\ifzeropt\wd\scratchbox
@@ -593,7 +582,7 @@
\unexpanded\def\doiftext#1%
{\begingroup
- \setbox\scratchbox\hpack
+ \setbox\scratchbox\hbox % no \hpack because we can have fallbacks
{\settrialtypesetting
\ignorespaces#1\removeunwantedspaces}%
\ifzeropt\wd\scratchbox
@@ -605,23 +594,19 @@
%D \macros
%D {dowithnextbox,nextbox}
%D
-%D Sometimes we want a macro to grab a box and do something
-%D on the content. One could pass an argument to a box, but
-%D this can violate the specific \CATCODES\ of its content and
-%D leads to unexpected results. The next macro treats the
-%D following braced text as the content of a box and
-%D manipulates it afterwards in a predefined way.
+%D Sometimes we want a macro to grab a box and do something on the content. One
+%D could pass an argument to a box, but this can violate the specific \CATCODES\ of
+%D its content and leads to unexpected results. The next macro treats the following
+%D braced text as the content of a box and manipulates it afterwards in a predefined
+%D way.
%D
-%D The first argument specifies what to do with the content.
-%D This content is available in \type{\nextbox}. The second
-%D argument is one of \type{\hbox}, \type{\vbox} or
-%D \type{\vtop}. The third argument must be grouped with
-%D \type{\bgroup} and \type{\egroup}, \type{{...}} or can be
-%D a \type{\box} specification.
+%D The first argument specifies what to do with the content. This content is
+%D available in \type {\nextbox}. The second argument is one of \type {\hbox}, \type
+%D {\vbox} or \type {\vtop}. The third argument must be grouped with \type {\bgroup}
+%D and \type {\egroup}, \type {{...}} or can be a \type {\box} specification.
%D
-%D In \CONTEXT\ this macro is used for picking up a box and
-%D treating it according to earlier specifications. We use for
-%D instance something like:
+%D In \CONTEXT\ this macro is used for picking up a box and treating it according to
+%D earlier specifications. We use for instance something like:
%D
%D \starttyping
%D \def\getfloat%
@@ -636,9 +621,8 @@
%D {...#1...}
%D \stoptyping
%D
-%D In this implementation the \type{\aftergroup} construction
-%D is needed because \type{\afterassignment} is executed inside
-%D the box.
+%D In this implementation the \type {\aftergroup} construction is needed because
+%D \type {\afterassignment} is executed inside the box.
\unexpanded\def\dowithnextbox#1%
{\def\syst_boxes_with_next_box{#1}%
@@ -684,28 +668,27 @@
%D \setbox\nextbox#2}
%D \stoptyping
%D
-%D This alternative also accepts \type{\box0} and alike, but
-%D we don't really need this functionality now.
+%D This alternative also accepts \type {\box0} and alike, but we don't really need
+%D this functionality now.
%D \macros
%D {nextboxht,nextboxwd,nextboxdp,flushnextbox}
%D
-%D The next couple of shortcuts saves us memory as well as
-%D \type {{}}'s in passing parameters.
+%D The next couple of shortcuts saves us memory as well as \type {{}}'s in passing
+%D parameters.
-\def\nextboxht {\ht\nextbox}
-\def\nextboxwd {\wd\nextbox}
-\def\nextboxdp {\dp\nextbox}
-\def\nextboxhtdp {\dimexpr\ht\nextbox+\dp\nextbox\relax}
+\def\nextboxht {\ht\nextbox}
+\def\nextboxwd {\wd\nextbox}
+\def\nextboxdp {\dp\nextbox}
+\def\nextboxhtdp{\dimexpr\ht\nextbox+\dp\nextbox\relax}
\unexpanded\def\flushnextbox{\box\nextbox}
%D \macros
%D {dowithnextboxcontent}
%D
-%D But, occasionally we do need to pass some local settings
-%D without wanting to use additional grouping. Therefore we
-%D provide:
+%D But, occasionally we do need to pass some local settings without wanting to use
+%D additional grouping. Therefore we provide:
%D
%D \starttyping
%D \dowithnextboxcontent{inside}{after}{box content}
@@ -731,8 +714,8 @@
%D \macros
%D {llap, rlap, tlap, blap, clap}
%D
-%D Some well known friends, but we implement them our own
-%D way. We want the macros to work in both math and text mode.
+%D Some well known friends, but we implement them our own way. We want the macros to
+%D work in both math and text mode.
\def\dodorlap{\hpack to \zeropoint{\box\nextbox\hss}\endgroup}
\def\dodollap{\hpack to \zeropoint{\hss\box\nextbox}\endgroup}
@@ -764,16 +747,14 @@
%D shapebox,
%D ifreshapingbox}
%D
-%D The next utility macro originates from some linenumbering
-%D mechanism. Due to \TEX's advanced way of typesetting
-%D paragraphs, it's not easy to do things on a line||by||line
-%D basis. This macro is able to reprocess a given box and can
-%D act upon its vertical boxed components, such as lines. The
-%D unwinding sequence in this macro is inspired by a \NTG\
-%D workshop of David Salomon in June 1992.
+%D The next utility macro originates from some linenumbering mechanism. Due to
+%D \TEX's advanced way of typesetting paragraphs, it's not easy to do things on a
+%D line||by||line basis. This macro is able to reprocess a given box and can act
+%D upon its vertical boxed components, such as lines. The unwinding sequence in this
+%D macro is inspired by a \NTG\ workshop of David Salomon in June 1992.
%D
-%D First we have to grab the piece of text we want to act
-%D upon. This is done by means of the duo macros:
+%D First we have to grab the piece of text we want to act upon. This is done by
+%D means of the duo macros:
%D
%D \starttyping
%D \beginofshapebox
@@ -781,16 +762,14 @@
%D \endofshapebox
%D \stoptyping
%D
-%D When all texts is collected, we can call \type{\reshapebox}
-%D and do something with it's vertical components. We can make
-%D as much passes as needed. When we're done, the box can be
-%D unloaded with \type{\flushshapebox}. The only condition in
-%D this scheme is that \type{\reshapebox} must somehow unload
-%D the \BOX\ \type{\shapebox}.
+%D When all texts is collected, we can call \type {\reshapebox} and do something
+%D with it's vertical components. We can make as much passes as needed. When we're
+%D done, the box can be unloaded with \type {\flushshapebox}. The only condition in
+%D this scheme is that \type {\reshapebox} must somehow unload the \BOX\ \type
+%D {\shapebox}.
%D
-%D An important aspect is that the content is unrolled
-%D bottom||up. The next example illustrates this maybe
-%D unexpected characteristic.
+%D An important aspect is that the content is unrolled bottom||up. The next example
+%D illustrates this maybe unexpected characteristic.
%D
%D \startbuffer
%D \beginofshapebox
@@ -810,8 +789,7 @@
%D
%D \getbuffer
%D
-%D As we can see, when some kind of numbering is done, we have
-%D to add a second pass.
+%D As we can see, when some kind of numbering is done, we have to add a second pass.
%D
%D \startbuffer
%D \newcounter\LineNumber
@@ -835,9 +813,9 @@
%D
%D \getbuffer
%D
-%D This example shows that the content of the box is still
-%D available after flushing. Another feature is that only the
-%D last reshaping counts. Multiple reshaping can be done by:
+%D This example shows that the content of the box is still available after flushing.
+%D Another feature is that only the last reshaping counts. Multiple reshaping can be
+%D done by:
%D
%D \startbuffer
%D \beginofshapebox
@@ -856,29 +834,27 @@
%D
%D \getbuffer
%D
-%D The macros are surprisingly easy to follow and in fact
-%D introduce no new concepts. Nearly all books on \TEX\ show
-%D similar solutions for unwinding \BOXES.
+%D The macros are surprisingly easy to follow and in fact introduce no new concepts.
+%D Nearly all books on \TEX\ show similar solutions for unwinding \BOXES.
%D
-%D Some macros, like footnote ones, can be sensitive for
-%D reshaping, which can result in an endless loop. We
-%D therefore offer:
+%D Some macros, like footnote ones, can be sensitive for reshaping, which can result
+%D in an endless loop. We therefore offer:
%D
%D \starttyping
%D \ifreshapingbox
%D \stoptyping
%D
-%D Some \CONTEXT\ commands are protected this way. Anyhow,
-%D reshaping is aborted after 100 dead cycles.
+%D Some \CONTEXT\ commands are protected this way. Anyhow, reshaping is aborted
+%D after 100 dead cycles.
%D
-%D By the way, changing the height and depth of \BOX\
-%D \type{\shapebox} results in bad spacing. This means that
-%D for instance linenumbers etc. should be given zero height
-%D and depth before being lapped into the margin. The
-%D previous examples ignore this side effect, but beware!
+%D By the way, changing the height and depth of \BOX\ \type {\shapebox} results in
+%D bad spacing. This means that for instance linenumbers etc. should be given zero
+%D height and depth before being lapped into the margin. The previous examples
+%D ignore this side effect, but beware!
\newif \ifsomeshapeleft
\newif \ifreshapingbox
+\newif \ifreshapingfailed % may save redundant runs
\newbox \shapebox
\newcount \shapepenalty
@@ -887,6 +863,7 @@
\newbox \newshapebox
\newbox \oldshapebox
+\newbox \tmpshapebox
\newcount \shapecounter
@@ -901,13 +878,9 @@
{\kern \shapekern }%
{\vskip \shapeskip }}
-\newbox\tmpshapebox
-
-\newif\ifreshapingfailed % may save redundant runs
-
\def\doreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
{\global\reshapingfailedfalse
- \ifzeropt\ht\oldshapebox % \ifdim\ht\oldshapebox=\zeropoint
+ \ifzeropt\ht\oldshapebox
\setbox\newshapebox\emptyvbox
\else
\setbox\newshapebox\vbox % can be \vpack
@@ -979,7 +952,7 @@
\unexpanded\def\flushshapebox
{\bgroup
- \ifzeropt\ht\newshapebox % \ifdim\ht\newshapebox=\zeropoint
+ \ifzeropt\ht\newshapebox
\else
% make \prevdepth legal
% \par before the next \vskip gives far worse results
@@ -1034,9 +1007,8 @@
% \kern-\dp\newshapebox\relax
\fi}
-%D For absolute control, one can use \type{\doreshapebox}
-%D directly. This macro takes four arguments, that take care
-%D of:
+%D For absolute control, one can use \type {\doreshapebox} directly. This macro
+%D takes four arguments, that take care of:
%D
%D \startitemize[n,packed]
%D \item \type{\shapebox}
@@ -1048,17 +1020,16 @@
%D \macros
%D {shapedhbox}
%D
-%D When constructing a new box, using the content of \type
-%D {\shapebox}, one can best use \type {\shapedhbox} instead
-%D of \type {\hbox}, since it manages the height and depth of
-%D the line.
+%D When constructing a new box, using the content of \type {\shapebox}, one can best
+%D use \type {\shapedhbox} instead of \type {\hbox}, since it manages the height and
+%D depth of the line.
\unexpanded\def\shapedhbox % lines with non strutted dimensions have
{\expanded{\dowithnextbox % interlineskip so if we want the original
- {\dp\nextbox\the\ht\shapebox % spacing, we need to preserve the original
+ {\ht\nextbox\the\ht\shapebox % spacing, we need to preserve the original
\dp\nextbox\the\dp\shapebox % height and depth which is definitely
\box\nextbox}} % needed if we apply struts to the 'new'
- \hbox} % box or do something that changed ist size
+ \hbox} % box or do something that changed ist size
%D \macros
%D {hyphenatedword,
@@ -1066,8 +1037,8 @@
%D hyphenatedfile,
%D dohyphenateword}
%D
-%D We no longer use the pure \TEX\ variant. In due time we will
-%D report some more advanced statistics.
+%D We no longer use the pure \TEX\ variant. In due time we will report some more
+%D advanced statistics.
%D
%D \starttyping
%D \showhyphens{dohyphenatedword}
@@ -1104,11 +1075,10 @@
%D \macros
%D {processtokens}
%D
-%D We fully agree with (most) typographers that inter||letter
-%D spacing is only permitted in fancy titles, we provide a
-%D macro that can be used to do so. Because this is
-%D (definitely and fortunately) no feature of \TEX, we have to
-%D step through the token list ourselves.
+%D We fully agree with (most) typographers that inter||letter spacing is only
+%D permitted in fancy titles, we provide a macro that can be used to do so. Because
+%D this is (definitely and fortunately) no feature of \TEX, we have to step through
+%D the token list ourselves.
%D
%D \starttyping
%D \processtokens {before} {between} {after} {space} {tokens}
@@ -1126,12 +1096,12 @@
%D
%D \getbuffer
%D
-%D The list of tokens may contain spaces, while \type{\\},
-%D \type{{}} and \type{\ } are handled as space too.
+%D The list of tokens may contain spaces, while \type {\\}, \type {{}} and \type {\
+%D } are handled as space too.
\unexpanded\def\processtokens#1#2#3#4#5%
{\begingroup
- \def\lastcharacter{\lastcharacter}%
+ \def\lastcharacter{\lastcharacter}% hm, recursive ?
\def\space{ }%
\let\\=\space
\def\before {#1}%
@@ -1171,20 +1141,18 @@
%D \macros
%D {doboundtext}
%D
-%D Sometimes there is not enough room to show the complete
-%D (line of) text. In such a situation we can strip of some
-%D characters by using \type{\doboundtext}. When the text is
-%D wider than the given width, it's split and the third
-%D argument is appended. When the text to be checked is packed
-%D in a command, we'll have to use \type{\expandafter}.
+%D Sometimes there is not enough room to show the complete (line of) text. In such a
+%D situation we can strip of some characters by using \type {\doboundtext}. When the
+%D text is wider than the given width, it's split and the third argument is
+%D appended. When the text to be checked is packed in a command, we'll have to use
+%D \type {\expandafter}.
%D
%D \starttyping
%D \doboundtext{a very, probably to long, text}{3cm}{...}
%D \stoptyping
%D
-%D When calculating the room needed, we take the width of the
-%D third argument into account, which leads to a bit more
-%D complex macro than needed at first sight.
+%D When calculating the room needed, we take the width of the third argument into
+%D account, which leads to a bit more complex macro than needed at first sight.
\def\dodoboundtext#1%
{\setbox\scratchboxone\hbox{#1}%
@@ -1205,18 +1173,17 @@
%D \macros
%D {limitatetext}
%D
-%D A bit more beautiful alternative for the previous command is
-%D the next one. This command is more robust because we let
-%D \TEX\ do most of the job. The previous command works better
-%D on text that cannot be hyphenated.
+%D A bit more beautiful alternative for the previous command is the next one. This
+%D command is more robust because we let \TEX\ do most of the job. The previous
+%D command works better on text that cannot be hyphenated.
%D
%D \starttyping
%D \limitatetext {text} {width} {sentinel}
%D \limitatetext {text} {-width} {prelude}
%D \stoptyping
%D
-%D When no width is given, the whole text comes available. The
-%D sentinel is optional. This is about the third version.
+%D When no width is given, the whole text comes available. The sentinel is optional.
+%D This is about the third version.
\ifdefined\fakecompoundhyphen\else \let\fakecompoundhyphen\relax \fi
\ifdefined\veryraggedright \else \def\veryraggedright{\raggedright} \fi
@@ -1310,6 +1277,7 @@
\let\speciallimitatetext\firstoffourarguments
\setbox\scratchboxone\hbox
{\nohyphens
+ \dontcomplain
\normallimitatetext{#1}{+#2}{}#4%
\normallimitatetext{#1}{-#3}{}}%
\setbox\scratchboxtwo\hbox
@@ -1477,10 +1445,9 @@
%D \macros
%D {sbox}
%D
-%D This is a rather strange command. It grabs some box content
-%D and and limits the size to the height and depth of a
-%D \type{\strut}. The resulting bottom||alligned box can be used
-%D aside other ones, without disturbing the normal baseline
+%D This is a rather strange command. It grabs some box content and and limits the
+%D size to the height and depth of a \type {\strut}. The resulting bottom||alligned
+%D box can be used aside other ones, without disturbing the normal baseline
%D distance.
%D
%D \startbuffer
@@ -1496,26 +1463,29 @@
%D \getbuffer
%D \stopexample
%D
-%D Before displaying the result we added some skip, otherwise
-%D the first two lines would have ended up in the text. This
-%D macro can be useful when building complicated menus, headers
-%D and footers and|/|or margin material.
+%D Before displaying the result we added some skip, otherwise the first two lines
+%D would have ended up in the text. This macro can be useful when building
+%D complicated menus, headers and footers and|/|or margin material.
\unexpanded\def\sbox
- {\vbox\bgroup
+ {\vpack\bgroup
\dowithnextboxcs\syst_boxes_sbox_finish\vbox}
\unexpanded\def\syst_boxes_sbox_finish
{\setbox\nextbox\hpack
- {\strut
- \dp\nextbox\zeropoint
+ {\strut % not needed
+ \dp\nextbox\zeropoint % not needed
\lower\strutdp\box\nextbox}%
- \dp\nextbox\strutdp
- \ht\nextbox\strutht
- \box\nextbox
- \egroup}
+ \dp\nextbox\strutdp
+ \ht\nextbox\strutht
+ \box\nextbox
+ \egroup}
%D A variant on this:
+%D
+%D \starttyping
+%D xx \ruledhbox{\inlinedbox{\tfd test}} xx
+%D \stoptyping
\unexpanded\def\inlinedbox
{\bgroup
@@ -1533,8 +1503,7 @@
%D \macros
%D {struttedbox}
%D
-%D This boxing macro limits the height and depth to those of
-%D a strut.
+%D This boxing macro limits the height and depth to those of a strut.
\unexpanded\def\struttedbox
{\hpack\bgroup
@@ -1549,9 +1518,8 @@
%D \macros
%D {topskippedbox}
%D
-%D This macro compensates the difference between the topskip
-%D and strutheight. Watch how we preserve the depth when it
-%D equals strutdepth.
+%D This macro compensates the difference between the topskip and strutheight. Watch
+%D how we preserve the depth when it equals strutdepth.
\unexpanded\def\topskippedbox
{\hpack\bgroup\dowithnextboxcs\syst_boxes_topskippedbox_finish\hbox}
@@ -1565,13 +1533,12 @@
%D \macros
%D {centeredbox, centerednextbox}
%D
-%D Here is another strange one. This one offers a sort of overlay
-%D with positive or negative offsets. This command can be used
-%D in well defined areas where no offset options are available.
-%D We first used it when building a button inside the margin
-%D footer, where the button should have a horizontal offset and
-%D should be centered with respect to the surrounding box. The
-%D last of the three examples we show below says:
+%D Here is another strange one. This one offers a sort of overlay with positive or
+%D negative offsets. This command can be used in well defined areas where no offset
+%D options are available. We first used it when building a button inside the margin
+%D footer, where the button should have a horizontal offset and should be centered
+%D with respect to the surrounding box. The last of the three examples we show below
+%D says:
%D
%D \starttyping
%D \vsize=3cm
@@ -1581,8 +1548,8 @@
%D {\vrule width \hsize height \vsize}}}
%D \stoptyping
%D
-%D Here the \type{\ruledvbox} just shows the surrounding box
-%D and \type{\vrule} is used to show the centered box.
+%D Here the \type {\ruledvbox} just shows the surrounding box and \type {\vrule} is
+%D used to show the centered box.
%D
%D \def\AnExample#1#2%
%D {\vsize=3cm
@@ -1599,14 +1566,12 @@
%D \stopcombination
%D \stoplinecorrection
%D
-%D This command takes two optional arguments: \type{width} and
-%D \type{height}. Observing readers can see that we use \TEX's
-%D own scanner for grabbing these arguments: \type{#1#} reads
-%D everyting till the next brace and passes it to both rules.
-%D The setting of the box dimensions at the end is needed for
-%D special cases. The dimensions of the surrounding box are kept
-%D intact. This commands handles positive and negative
-%D dimensions (which is why we need two boxes with rules).
+%D This command takes two optional arguments: \type {width} and \type {height}.
+%D Observing readers can see that we use \TEX's own scanner for grabbing these
+%D arguments: \type {#1#} reads everyting till the next brace and passes it to both
+%D rules. The setting of the box dimensions at the end is needed for special cases.
+%D The dimensions of the surrounding box are kept intact. This commands handles
+%D positive and negative dimensions (which is why we need two boxes with rules).
\unexpanded\def\centeredbox#1#% height +/-dimen width +/-dimen
{\bgroup
@@ -1666,8 +1631,8 @@
%D \centerbox <optional specs> {content}
%D \stoptyping
%D
-%D When omitted, the current \type {\hsize} and \type
-%D {\vsize} are used. Local dimensions are supported.
+%D When omitted, the current \type {\hsize} and \type {\vsize} are used. Local
+%D dimensions are supported.
\unexpanded\def\centerbox#1#% optional height +/-dimen width +/-dimen
{\bgroup
@@ -1684,27 +1649,21 @@
%D \macros
%D {setrigidcolumnhsize,rigidcolumnbalance,rigidcolumnlines}
%D
-%D These macros are copied from the \TEX book, page~397, and
-%D extended by a macro that sets the \type{\hsize}.
+%D These macros are copied from the \TEX book, page~397, and extended by a macro
+%D that sets the \type {\hsize}.
%D
%D \starttyping
%D \setrigidcolumnhsize {total width} {distance} {n}
%D \rigidcolumnbalance {box}
%D \stoptyping
%D
-%D Both these macros are for instance used in typesetting
-%D footnotes.
-%D
-%D Men kan het proces van breken enigzins beinvloeden met de
-%D volgende twee switches:
+%D Both these macros are for instance used in typesetting footnotes. The following
+%D flags influence the process.
\newif\ifalignrigidcolumns
\newif\ifstretchrigidcolumns
\newif\iftightrigidcolumns % if true: just a vbox, no depth/noflines/gridsnap corrrections
-%D De eerste switch bepaald het uitlijnen, de tweede rekt de
-%D individuele kolommen op naar \type{\vsize}.
-
\unexpanded\def\setrigidcolumnhsize#1#2#3% todo: \dimexpr
{\xdef\savedrigidhsize{\the\hsize}%
\hsize#1\relax
@@ -1791,9 +1750,8 @@
%D \macros
%D {startvboxtohbox,stopvboxtohbox,convertvboxtohbox}
%D
-%D Here is another of Knuth's dirty tricks, as presented on
-%D pages 398 and 399 of the \TEX book. These macros can be used
-%D like:
+%D Here is another of Knuth's dirty tricks, as presented on pages 398 and 399 of the
+%D \TEX book. These macros can be used like:
%D
%D \starttyping
%D \vbox
@@ -1809,14 +1767,14 @@
%D \egroup
%D \stoptyping
%D
-%D These macros are used in reformatting footnotes, so they do
-%D what they're meant for.
+%D These macros are used in reformatting footnotes, so they do what they're meant
+%D for.
\newdimen\vboxtohboxslack
\newdimen\hboxestohboxslack
-% Create line and fake height of paragraph by messign with heights:
-% a nice hack by DEK himself.
+%D Create line and fake height of paragraph by messign with heights: a nice hack by
+%D DEK himself.
%\unexpanded\def\setvboxtohbox
% {\bgroup
@@ -1933,8 +1891,8 @@
%D \macros
%D {unhhbox}
%D
-%D The next macro is used in typesetting inline headings.
-%D Let's first look at the macro and then show an example.
+%D The next macro is used in typesetting inline headings. Let's first look at the
+%D macro and then show an example.
\newbox \unhhedbox
\newbox \hhbox
@@ -1954,7 +1912,7 @@
\fi
\ht\hhbox\strutht
\dp\hhbox\strutdp
- \ifzeropt\hhboxindent\else % \ifdim\hhboxindent=\zeropoint\else
+ \ifzeropt\hhboxindent\else
\setbox\hhbox\hpack{\kern-\hhboxindent\box\hhbox}%
\hhboxindent\zeropoint
\fi
@@ -1977,10 +1935,9 @@
\afterassignment\dohboxofvbox
\scratchcounter=}
-%D This macro can be used to break a paragraph apart and treat
-%D each line seperately, for instance, making it clickable. The
-%D main complication is that we want to be able to continue the
-%D paragraph, something that's needed in the in line section
+%D This macro can be used to break a paragraph apart and treat each line seperately,
+%D for instance, making it clickable. The main complication is that we want to be
+%D able to continue the paragraph, something that's needed in the in line section
%D headers.
%D
%D \startbuffer
@@ -1999,23 +1956,22 @@
%D
%D \typebuffer
%D
-%D Not that nice a definition, but effective. Note the stretch
-%D we've build in the line that connects the two paragraphs.
+%D Not that nice a definition, but effective. Note the stretch we've build in the
+%D line that connects the two paragraphs.
%D \macros
%D {doifcontent}
%D
-%D When processing depends on the availability of content, one
-%D can give the next macro a try.
+%D When processing depends on the availability of content, one can give the next
+%D macro a try.
%D
%D \starttyping
%D \doifcontent{pre content}{post content}{no content}\somebox
%D \stoptyping
%D
-%D Where \type{\somebox} is either a \type{\hbox} or
-%D \type{\vbox}. If the dimension of this box suggest some
-%D content, the resulting box is unboxed and surrounded by the
-%D first two arguments, else the third arguments is executed.
+%D Where \type {\somebox} is either a \type {\hbox} or \type {\vbox}. If the
+%D dimension of this box suggest some content, the resulting box is unboxed and
+%D surrounded by the first two arguments, else the third arguments is executed.
\unexpanded\def\doifcontent#1#2#3%
{\dowithnextbox
@@ -2049,17 +2005,17 @@
%D
%D \getbuffer
%D
-%D Where the last call of course does not show up in this
-%D document, but definitely generates a confusing message.
+%D Where the last call of course does not show up in this document, but definitely
+%D generates a confusing message.
%D \macros
%D {processboxes}
%D
-%D The next macro gobble boxes and is for instance used for
-%D overlays. First we show the general handler.
+%D The next macro gobble boxes and is for instance used for overlays. First we show
+%D the general handler.
-% we cannot use \futurelet here as we want to skip spaces between
-% boxes (see startoverlay for an example usage)
+% We cannot use \futurelet here as we want to skip spaces between boxes (see
+% startoverlay for an example usage)
% \newbox\processbox % public : this is the one where \nextbox's end up in
%
@@ -2184,8 +2140,7 @@
%D \hbox{\fakebox0}
%D \stoptyping
%D
-%D returns an empty box with the dimensions of the box
-%D specified, here being zero.
+%D returns an empty box with the dimensions of the box specified, here being zero.
\unexpanded\def\fakebox
{\bgroup
@@ -2210,10 +2165,9 @@
%D \rbox{text ...}
%D \stoptyping
%D
-%D Are similar to \type {\vbox}, which means that they also
-%D accept something like \type{to 3cm}, but align to the left,
-%D middle and right. These box types can be used to typeset
-%D paragraphs.
+%D Are similar to \type {\vbox}, which means that they also accept something like
+%D \type {to 3cm}, but align to the left, middle and right. These box types can be
+%D used to typeset paragraphs.
\def\syst_boxes_lrc_process#1{\bgroup\forgetall\let\\\endgraf#1\let\next}
@@ -2225,8 +2179,8 @@
\unexpanded\def\ctop#1#{\vtop#1\syst_boxes_lrc_process\raggedcenter}
\unexpanded\def\rtop#1#{\vtop#1\syst_boxes_lrc_process\raggedright }
-%D The alternatives \type {\tbox} and \type {\bbox} can be used
-%D to properly align boxes, like in:
+%D The alternatives \type {\tbox} and \type {\bbox} can be used to properly align
+%D boxes, like in:
%D
%D \setupexternalfigures[directory={../sample}]
%D \startbuffer
@@ -2288,16 +2242,15 @@
%D \macros
%D {boxofsize}
%D
-%D Sometimes we need to construct a box with a height or
-%D width made up of several dimensions. Instead of cumbersome
-%D additions, we can use:
+%D Sometimes we need to construct a box with a height or width made up of several
+%D dimensions. Instead of cumbersome additions, we can use:
%D
%D \starttyping
%D \boxofsize \vbox 10cm 3cm -5cm {the text to be typeset}
%D \stoptyping
%D
-%D This example demonstrates that one can use positive and
-%D negative values. Dimension registers are also accepted.
+%D This example demonstrates that one can use positive and negative values.
+%D Dimension registers are also accepted.
\newdimen\sizeofbox
@@ -2325,11 +2278,11 @@
\unexpanded\def\limitatelines#1#2% size sentinel
{\dowithnextbox
- {\dimen0=#1\hsize
- \ifdim\wd\nextbox>\dimen0
+ {\scratchdimen#1\hsize
+ \ifdim\wd\nextbox>\scratchdimen
\setbox\nextbox\hbox
- {\advance\dimen0 -.1\hsize
- \limitatetext{\unhbox\nextbox}{\dimen0}{\nobreak#2}}%
+ {\advance\scratchdimen -.1\hsize
+ \limitatetext{\unhbox\nextbox}{\scratchdimen}{\nobreak#2}}%
\fi
\unhbox\nextbox}
\hbox}
@@ -2338,14 +2291,14 @@
{\dowithnextbox
{\bgroup
\par
- \dimen0\ht\nextbox
+ \scratchdimen\ht\nextbox
\ht\nextbox\strutht
\dp\nextbox\strutdp
\hpack{\box\nextbox}
\prevdepth\strutdp
\doloop
- {\advance\dimen0 -\lineheight
- \ifdim\dimen0<\zeropoint
+ {\advance\scratchdimen -\lineheight
+ \ifdim\scratchdimen<\zeropoint
\exitloop
\else
\nobreak
@@ -2527,8 +2480,8 @@
%D \macros
%D {initializeboxstack,savebox,foundbox}
%D
-%D At the cost of some memory, but saving box registers, we
-%D have implemented a box repository.
+%D At the cost of some memory, but saving box registers, we have implemented a box
+%D repository.
%D
%D \starttyping
%D \initializeboxstack{one}
@@ -2665,9 +2618,8 @@
%D \macros
%D {removedepth, obeydepth}
%D
-%D While \type {\removedepth} removes the preceding depth,
-%D \type {\obeydepth} makes sure we have depth. Both macros
-%D leave the \type {\prevdepth} untouched.
+%D While \type {\removedepth} removes the preceding depth, \type {\obeydepth} makes
+%D sure we have depth. Both macros leave the \type {\prevdepth} untouched.
\unexpanded\def\removedepth
{\ifvmode
@@ -2700,8 +2652,8 @@
%D \macros
%D {makestrutofbox}
%D
-%D This macro sets the dimensions of a box to those of a strut. Sort of obsolete
-%D so it will go away.
+%D This macro sets the dimensions of a box to those of a strut. Sort of obsolete so
+%D it will go away.
\unexpanded\def\makestrutofbox % not used
{\afterassignment\syst_boxes_makestrutofbox\c_boxes_register}
@@ -2714,9 +2666,8 @@
%D \macros
%D {raisebox,lowerbox}
%D
-%D Some more box stuff, related to positioning (under
-%D construction). Nice stuff for a tips and tricks maps
-%D article.
+%D Some more box stuff, related to positioning (under construction). Nice stuff for
+%D a tips and tricks maps article.
%D
%D \starttyping
%D \raisebox{100pt}\hbox{test}
@@ -2895,12 +2846,6 @@
%D A bit dirty:
-% \unexpanded\def\nodestostring#1% \cs {content}
-% {\dowithnextbox{\edef#1{\syst_boxes_nodestostring}}\hbox}
-%
-% \def\syst_boxes_nodestostring
-% {\clf_boxtostring\nextbox}
-
\unexpanded\def\nodestostring#1#2% more tolerant for #2=\cs
{\begingroup
\setbox\nextbox\hbox{#2}%
@@ -2995,7 +2940,11 @@
%D This one keeps dimensions and sets the shift field (and so it's more for testing
%D than for real usage):
-\unexpanded\def\shiftbox{\clf_shiftbox}
+\unexpanded\def\shiftbox {\clf_shiftbox}
+\unexpanded\def\vpackbox {\clf_vpackbox}
+\unexpanded\def\hpackbox {\clf_hpackbox}
+\unexpanded\def\vpackedbox{\clf_vpackedbox}
+\unexpanded\def\hpackedbox{\clf_hpackedbox}
%D This one has been moved from a 2 decade old file. It makes something boxed
%D sit on the baseline.
diff --git a/Master/texmf-dist/tex/context/base/mkiv/supp-box.mkxl b/Master/texmf-dist/tex/context/base/mkiv/supp-box.mkxl
new file mode 100644
index 00000000000..e6ab96e8929
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/supp-box.mkxl
@@ -0,0 +1,2952 @@
+%D \module
+%D [ file=supp-box,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Boxes,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Support Macros / Boxes}
+
+\unprotect
+
+\registerctxluafile{supp-box}{optimize}
+
+% This file is partially cleaned up.
+
+%D First some defaults:
+
+\fixupboxesmode\plusone
+
+%D And some dimensions:
+
+\newdimen\givenwidth
+\newdimen\givenheight
+\newdimen\givendepth
+
+%D \macros
+%D {dontcomplain}
+%D
+%D The next macro suppresses over- and underfull messages which often makes sense
+%D when we deal with boxes.
+
+\unexpanded\def\dontcomplain
+ {\hbadness\plustenthousand
+ \vbadness\plustenthousand
+ \hfuzz \maxdimen
+ \vfuzz \maxdimen}
+
+%D This module implements some box manipulation macros. Some are quite simple, some
+%D are more advanced and when understood well, all can be of use.
+%D
+%D \macros
+%D {strutdp,strutht,strutwd}
+%D
+%D The next shortcuts save memory and keying. The width is normally zero points (if
+%D not, you're in trouble). These shortcuts can be used like a dimension, opposite
+%D to the core macros \type {\strutdepth} and alike, which are values.
+
+\def\strutdp {\dp\strutbox}
+\def\strutht {\ht\strutbox}
+\def\strutwd {\wd\strutbox}
+\def\struthtdp{\htdp\strutbox}
+\def\strutgap {\dimexpr\ht\strutbox-\dp\strutbox\relax}
+
+%D \macros
+%D {voidbox,nextbox}
+%D
+%D Let's start with an easy one. The next macro hides the ugly \type {@} in \type
+%D {\voidb@x}.
+
+\ifdefined\voidbox \else \newbox\voidbox \fi
+\ifdefined\nextbox \else \newbox\nextbox \fi
+
+%D \macros
+%D {nextdepth}
+%D
+%D Let's start with a rather simple declaration. Sometimes we need to save the \TEX\
+%D \DIMENSION\ \type{\prevdepth} and append it later on. The name \type {\nextdepth}
+%D suits this purpose well.
+
+\newdimen\nextdepth
+
+%D \macros
+%D {smashbox, smashedbox}
+%D
+%D Smashing is introduced in \PLAIN\ \TEX, and stands for reducing the dimensions of
+%D a box to zero. The most resolute one is presented first.
+
+\unexpanded\def\smashbox#1%
+ {\wd#1\zeropoint
+ \ht#1\zeropoint
+ \dp#1\zeropoint}
+
+\unexpanded\def\smashboxed#1%
+ {\wd#1\zeropoint
+ \ht#1\zeropoint
+ \dp#1\zeropoint
+ \box#1\relax}
+
+%D \macros
+%D {hsmashbox,vsmashbox}
+%D
+%D Smashing can be used for overlaying boxes. Depending on the mode, horizontal or
+%D vertical, one can use:
+
+\unexpanded\def\hsmashbox#1%
+ {\wd#1\zeropoint}
+
+\unexpanded\def\vsmashbox#1%
+ {\ht#1\zeropoint
+ \dp#1\zeropoint}
+
+%D The next implementation is less sensitive for spurious spaces.
+
+\newcount\c_boxes_register
+
+\unexpanded\def\smashbox
+ {\afterassignment\syst_boxes_smash_boxes_register\c_boxes_register}
+
+\def\syst_boxes_smash_boxes_register
+ {\wd\c_boxes_register\zeropoint
+ \ht\c_boxes_register\zeropoint
+ \dp\c_boxes_register\zeropoint}
+
+\unexpanded\def\hsmashbox
+ {\afterassignment\syst_boxes_hsmashed_boxes_register\c_boxes_register}
+
+\def\syst_boxes_hsmashed_boxes_register
+ {\wd\c_boxes_register\zeropoint}
+
+\unexpanded\def\vsmashbox
+ {\afterassignment\syst_boxes_vsmashed_boxes_register\c_boxes_register}
+
+\def\syst_boxes_vsmashed_boxes_register
+ {\ht\c_boxes_register\zeropoint
+ \dp\c_boxes_register\zeropoint}
+
+\unexpanded\def\smashedbox
+ {\afterassignment\syst_boxes_smashed_boxes_register\c_boxes_register}
+
+\unexpanded\def\syst_boxes_smashed_boxes_register
+ {\wd\c_boxes_register\zeropoint
+ \ht\c_boxes_register\zeropoint
+ \dp\c_boxes_register\zeropoint
+ \box\c_boxes_register}
+
+%D \macros
+%D {hsmash,vsmash,
+%D hsmashed,vsmashed}
+%D
+%D While the previous macros expected a \BOX, the next act on a content. They are
+%D some subtle differences betreen the smash and smashed alternatives. The later
+%D ones reduce all dimensions to zero.
+
+\unexpanded\def\hsmash {\bgroup\dowithnextboxcs\syst_boxes_hsmashed_nextbox\hbox}
+\unexpanded\def\vsmash {\bgroup\dowithnextboxcs\syst_boxes_vsmashed_nextbox\vbox}
+\unexpanded\def\hsmashed{\bgroup\dowithnextboxcs\syst_boxes_smashed_nextbox \hbox}
+\unexpanded\def\vsmashed{\bgroup\dowithnextboxcs\syst_boxes_smashed_nextbox \vbox}
+
+\unexpanded\def\syst_boxes_hsmashed_nextbox
+ {\wd\nextbox\zeropoint
+ \box\nextbox
+ \egroup}
+
+\unexpanded\def\syst_boxes_vsmashed_nextbox
+ {\ht\nextbox\zeropoint
+ \dp\nextbox\zeropoint
+ \box\nextbox
+ \egroup}
+
+\unexpanded\def\syst_boxes_smashed_nextbox
+ {\ht\nextbox\zeropoint
+ \dp\nextbox\zeropoint
+ \wd\nextbox\zeropoint
+ \box\nextbox
+ \egroup}
+
+%D \macros
+%D {smashedhbox,smashedvbox}
+%D
+%D Also handy (all dimensions zeroed):
+%D
+%D \starttyping
+%D \smashedhbox to ... {...}
+%D \smashedvbox to ... {...}
+%D \stoptyping
+
+\unexpanded\def\smashedhbox{\hpack\bgroup\dowithnextboxcs\syst_boxes_smashed_nextbox\hbox}
+\unexpanded\def\smashedvbox{\vpack\bgroup\dowithnextboxcs\syst_boxes_smashed_nextbox\vbox}
+
+%D First we define a helper. We use a \LUATEX\ feature in order to avoid
+%D mathpalettes.
+
+\newcount\c_boxes_math_style
+
+\unexpanded\def\syst_boxes_math_set_nextbox#1%
+ {\c_boxes_math_style\mathstyle
+ \setbox\nextbox\hbox{\normalstartimath\mathsurround\zeropoint\triggermathstyle\c_boxes_math_style{#1}\normalstopimath}}
+
+%D \macros
+%D {smash}
+%D
+%D This smash alternative takes an optional arg [whdtb] as well as is potentially
+%D catcode safer. It is needed by the math module (although the \type {\leavevmode}
+%D is not added here).
+
+\unexpanded\def\smash
+ {\begingroup
+ \futureexpandis[\syst_boxes_smash_yes\syst_boxes_smash_nop}
+
+\def\syst_boxes_smash_nop
+ {\edef\m_boxes_smash_options{hd}%
+ \futurelet\nexttoken\syst_boxes_smash_indeed}
+
+\def\syst_boxes_smash_yes[#1]%
+ {\edef\m_boxes_smash_options{#1}%
+ \futurelet\nexttoken\syst_boxes_smash_indeed}
+
+\def\syst_boxes_smash_indeed
+ {\ifmmode
+ \expandafter\syst_boxes_smash_math
+ \orelse\ifx\nexttoken\bgroup
+ \expandafter\syst_boxes_smash_hbox
+ \else
+ \expandafter\syst_boxes_smash_text
+ \fi}
+
+\def\syst_boxes_smash_math#1%
+ {\syst_boxes_math_set_nextbox{#1}%
+ \syst_boxes_smash_process}
+
+\def\syst_boxes_smash_hbox
+ {\dowithnextboxcs\syst_boxes_smash_process\hbox}
+
+\def\syst_boxes_smash_text#1%
+ {\setbox\nextbox\hbox{#1}%
+ \syst_boxes_smash_process}
+
+\def\syst_boxes_smash_process
+ {\expandafter\syst_boxes_smash_process_option\m_boxes_smash_options\relax
+ \box\nextbox
+ \endgroup}
+
+\installcorenamespace {smashoptions}
+
+\setvalue{\??smashoptions w}{\wd\nextbox\zeropoint}
+\setvalue{\??smashoptions h}{\ht\nextbox\zeropoint}
+\setvalue{\??smashoptions d}{\dp\nextbox\zeropoint}
+\setvalue{\??smashoptions t}{\ht\nextbox\zeropoint}
+\setvalue{\??smashoptions b}{\dp\nextbox\zeropoint}
+
+\def\syst_boxes_smash_process_option#1%
+ {\ifx#1\relax\else
+ \begincsname\??smashoptions#1\endcsname
+ \expandafter\syst_boxes_smash_process_option
+ \fi}
+
+\def\syst_boxes_lower_nextbox_dp
+ {\setbox\nextbox\hpack{\lower\dp\nextbox\box\nextbox}}
+
+%D \starttabulate[|l|l|]
+%D \NC w \NC \ruledhbox{\smash [w]{This is some great smashing, isn't it?}} \NC \NR
+%D \NC h \NC \ruledhbox{\smash [h]{This is some great smashing, isn't it?}} \NC \NR
+%D \NC d \NC \ruledhbox{\smash [d]{This is some great smashing, isn't it?}} \NC \NR
+%D \NC tb \NC \ruledhbox{\smash [tb]{This is some great smashing, isn't it?}} \NC \NR
+%D \NC whd \NC \ruledhbox{\smash[whd]{This is some great smashing, isn't it?}} \NC \NR
+%D \stoptabulate
+
+%D \macros
+%D {phantom, hphantom, vphantom, mathstrut}
+%D
+%D The next implementation of \type {\phantom} cum suis does not grab an argument in
+%D the non||math case, which is better.
+%D
+%D Due to a complicated call to \type {\mathpallete} and thereby \type
+%D {\mathchoice}, the next macro looks ugly. We also take care of non||braced
+%D arguments.
+
+\unexpanded\def\phantom {\begingroup\futurelet\nexttoken\syst_boxes_phantom_indeed }
+\unexpanded\def\vphantom{\begingroup\futurelet\nexttoken\syst_boxes_phantom_indeed_v}
+\unexpanded\def\hphantom{\begingroup\futurelet\nexttoken\syst_boxes_phantom_indeed_h}
+
+\def\syst_boxes_phantom_math #1{\syst_boxes_math_set_nextbox{#1}\syst_boxes_phantom_make }
+\def\syst_boxes_phantom_math_v#1{\syst_boxes_math_set_nextbox{#1}\syst_boxes_phantom_make_v}
+\def\syst_boxes_phantom_math_h#1{\syst_boxes_math_set_nextbox{#1}\syst_boxes_phantom_make_h}
+
+\def\syst_boxes_phantom_hbox {\dowithnextboxcs\syst_boxes_phantom_make \hbox} % always hbox
+\def\syst_boxes_phantom_hbox_v{\dowithnextboxcs\syst_boxes_phantom_make_v\hbox} % always hbox
+\def\syst_boxes_phantom_hbox_h{\dowithnextboxcs\syst_boxes_phantom_make_h\hbox} % always hbox
+
+\def\syst_boxes_phantom_text #1{\setbox\nextbox\hbox{#1}\syst_boxes_phantom_make } % always hbox
+\def\syst_boxes_phantom_text_v#1{\setbox\nextbox\hbox{#1}\syst_boxes_phantom_make_v} % always hbox
+\def\syst_boxes_phantom_text_h#1{\setbox\nextbox\hbox{#1}\syst_boxes_phantom_make_h} % always hbox
+
+\def\syst_boxes_phantom_indeed
+ {\ifmmode
+ \expandafter\syst_boxes_phantom_math
+ \orelse\ifx\nexttoken\bgroup
+ \expandafter\syst_boxes_phantom_hbox
+ \else
+ \expandafter\syst_boxes_phantom_text
+ \fi}
+
+\def\syst_boxes_phantom_indeed_v
+ {\ifmmode
+ \expandafter\syst_boxes_phantom_math_v
+ \orelse\ifx\nexttoken\bgroup
+ \expandafter\syst_boxes_phantom_hbox_v
+ \else
+ \expandafter\syst_boxes_phantom_text_v
+ \fi}
+
+\def\syst_boxes_phantom_indeed_h
+ {\ifmmode
+ \expandafter\syst_boxes_phantom_math_h
+ \orelse\ifx\nexttoken\bgroup
+ \expandafter\syst_boxes_phantom_hbox_h
+ \else
+ \expandafter\syst_boxes_phantom_text_h
+ \fi}
+
+\def\syst_boxes_phantom_make
+ {\setbox\scratchbox\emptyhbox
+ \ht\scratchbox\ht\nextbox
+ \dp\scratchbox\dp\nextbox
+ \wd\scratchbox\wd\nextbox
+ \box\scratchbox
+ \endgroup}
+
+\def\syst_boxes_phantom_make_v
+ {\setbox\scratchbox\emptyhbox
+ \ht\scratchbox\ht\nextbox
+ \dp\scratchbox\dp\nextbox
+ \box\scratchbox
+ \endgroup}
+
+\def\syst_boxes_phantom_make_h
+ {\setbox\scratchbox\emptyhbox
+ \wd\scratchbox\wd\nextbox
+ \box\scratchbox
+ \endgroup}
+
+%D We also define plain's \type {\mathstrut}.
+
+\unexpanded\def\mathstrut{\vphantom(} % can be made faster by inlining
+
+%D \macros
+%D {getboxheight}
+%D
+%D Although often needed, \TEX\ does not support arithmics like:
+%D
+%D \starttyping
+%D \dimen0 = \ht0 + \dp0
+%D \stoptyping
+%D
+%D so we implemented:
+%D
+%D \starttyping
+%D \getboxheight ... \of \box...
+%D \stoptyping
+%D
+%D For instance,
+%D
+%D \starttyping
+%D \getboxheight \dimen0 \of \box0
+%D \getboxheight \someheight \of \box \tempbox
+%D \stoptyping
+%D
+%D The implementation is rather stupid:
+%D
+%D \starttyping
+%D \def\getboxheight#1\of#2\box#3%
+%D {#1\ht#3\advance#1\dp#3\relax}
+%D \stoptyping
+%D
+%D The next alternative is slightly more clever, since it accepts \type {{12}} as
+%D well as \type {12} as box number.
+
+\unexpanded\def\getboxheight#1\of#2\box#3%
+ {\def\next{#1\htdp\c_boxes_register}%
+ \afterassignment\next\c_boxes_register=#3}
+
+%D For a long time the following three macros were part of the grid snapping core
+%D module, but it makes more sense to have them here so that users can see them.
+%D
+%D \macros
+%D {getnoflines, getroundednoflines, getrawnoflines}
+%D
+%D Het commando \type {\getnoflines} converteert een hoogte (dimensie) in een aantal
+%D regels en kent dit toe aan \type {\noflines}.
+%D
+%D \starttyping
+%D \getnoflines{dimensie}
+%D \stoptyping
+%D
+%D Er wordt gedeeld door \type {\openlineheight} en een hoogte van~0pt komt overeen
+%D met 0~regels. The raw alternative does not round.
+%D
+%D For a long time we had:
+%D
+%D \starttyping
+%D \newcount\noflines
+%D \newdimen\noflinesheight
+%D
+%D \def\dogetnoflines#1#2%
+%D {\noflinesheight#2\relax
+%D \ifzeropt\noflinesheight
+%D \noflines\zerocount
+%D \else
+%D \divide\noflinesheight \openlineheight
+%D \noflines\noflinesheight
+%D #1\ifdim\noflines\openlineheight=#2\relax \else
+%D \advance\noflines\ifdim#2>\zeropoint\plusone\else\minusone\fi
+%D \fi\fi
+%D \fi}
+%D
+%D \def\getnoflines {\dogetnoflines\iftrue } % compensated
+%D \def\getrawnoflines{\dogetnoflines\iffalse} % no compensation
+%D \stoptyping
+%D
+%D A more recent variant is:
+
+\ifx\roundingeps\undefined \newdimen\roundingeps \roundingeps=10sp \fi
+
+\newcount\noflines
+\newdimen\noflinesheight
+
+\unexpanded\def\getnoflines#1%
+ {\noflinesheight#1\relax
+ \ifzeropt\noflinesheight
+ \noflines\zerocount
+ \orelse\ifdim\noflinesheight>\zeropoint
+ \advance\noflinesheight-\roundingeps
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \advance\noflines\plusone
+ \else
+ \advance\noflinesheight\roundingeps
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \advance\noflines\minusone
+ \fi}
+
+\unexpanded\def\getroundednoflines#1%
+ {\noflinesheight#1\relax
+ \ifzeropt\noflinesheight
+ \noflines\zerocount
+ \orelse\ifdim\noflinesheight>\zeropoint
+ \advance\noflinesheight\roundingeps
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \else
+ \advance\noflinesheight-\roundingeps
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \fi}
+
+\unexpanded\def\getrawnoflines#1%
+ {\noflinesheight#1\relax
+ \ifzeropt\noflinesheight
+ \noflines\zerocount
+ \orelse\ifdim\noflinesheight>\zeropoint
+ \advance\noflinesheight\roundingeps
+ \advance\noflinesheight.5\openlineheight
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \else
+ \advance\noflinesheight-\roundingeps
+ \advance\noflinesheight-.5\openlineheight
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \fi}
+
+%D Let's proof that it works:
+%D
+%D \startbuffer
+%D \scratchdimen\dimexpr(3pt) \getnoflines\scratchdimen 1=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight) \getnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.1\lineheight) \getnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.5\lineheight) \getnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.9\lineheight) \getnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight+3pt) \getnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight+3sp) \getnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight-3sp) \getnoflines\scratchdimen 10=\the\noflines \endgraf
+%D
+%D \scratchdimen\dimexpr(3pt) \getrawnoflines\scratchdimen 0=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.1\lineheight) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.5\lineheight) \getrawnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.9\lineheight) \getrawnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight+3pt) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight+3sp) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight-3sp) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {determinenoflines}
+%D
+%D The next macro determines the number of lines and returns it it \type
+%D {\noflines}. The macro works reasonable well as long as the content can be
+%D unboxed.
+%D
+%D \starttyping
+%D \determinenoflines{test\\test}
+%D \determinenoflines{\bfd test\\test}
+%D \determinenoflines{\definedfont[Sans at 40pt]test\\test}
+%D \stoptyping
+
+\def\syst_boxes_determine_noflines % can be mkiv'd
+ {\beginofshapebox
+ \unvbox\nextbox
+ \endofshapebox
+ \globalscratchcounter\zerocount
+ \reshapebox{\global\advance\globalscratchcounter\plusone}%
+ \expandafter\egroup\expandafter\noflines\the\globalscratchcounter\relax}
+
+\unexpanded\def\determinenoflines
+ {\bgroup
+ \forgetall
+ \let\crlf\endgraf
+ \let\\\endgraf
+ \dowithnextboxcs\syst_boxes_determine_noflines\vbox}
+
+%D \macros
+%D {doiftextelse, doiftext}
+%D
+%D When \type {\doifelse} cum suis hopelessly fail, for instance because we pass
+%D data, we can fall back on the next macro:
+%D
+%D \starttyping
+%D \doiftextelse {data} {then branch} {else branch}
+%D \doiftext {data} {then branch}
+%D \stoptyping
+
+\unexpanded\def\doifelsetext#1%
+ {\begingroup
+ \setbox\scratchbox\hbox % no \hpack because we can have fallbacks
+ {\settrialtypesetting
+ \ignorespaces#1\removeunwantedspaces}%
+ \ifzeropt\wd\scratchbox
+ \endgroup\expandafter\secondoftwoarguments
+ \else
+ \endgroup\expandafter\firstoftwoarguments
+ \fi}
+
+\unexpanded\def\doiftext#1%
+ {\begingroup
+ \setbox\scratchbox\hbox % no \hpack because we can have fallbacks
+ {\settrialtypesetting
+ \ignorespaces#1\removeunwantedspaces}%
+ \ifzeropt\wd\scratchbox
+ \endgroup\expandafter\gobbleoneargument
+ \else
+ \endgroup\expandafter\firstofoneargument
+ \fi}
+
+% more efficient but maybe fragile:
+%
+% \nospacing#1}%
+
+\let\doiftextelse\doifelsetext
+
+%D \macros
+%D {dowithnextbox,nextbox}
+%D
+%D Sometimes we want a macro to grab a box and do something on the content. One
+%D could pass an argument to a box, but this can violate the specific \CATCODES\ of
+%D its content and leads to unexpected results. The next macro treats the following
+%D braced text as the content of a box and manipulates it afterwards in a predefined
+%D way.
+%D
+%D The first argument specifies what to do with the content. This content is
+%D available in \type {\nextbox}. The second argument is one of \type {\hbox}, \type
+%D {\vbox} or \type {\vtop}. The third argument must be grouped with \type {\bgroup}
+%D and \type {\egroup}, \type {{...}} or can be a \type {\box} specification.
+%D
+%D In \CONTEXT\ this macro is used for picking up a box and treating it according to
+%D earlier specifications. We use for instance something like:
+%D
+%D \starttyping
+%D \def\getfloat%
+%D {\def\handlefloat{...\box\nextbox...}
+%D \dowithnextboxcs\handlefloat\vbox}
+%D \stoptyping
+%D
+%D instead of:
+%D
+%D \starttyping
+%D \def\getfloat#1%
+%D {...#1...}
+%D \stoptyping
+%D
+%D In this implementation the \type {\aftergroup} construction is needed because
+%D \type {\afterassignment} is executed inside the box.
+
+\unexpanded\def\dowithnextbox#1%
+ {\def\syst_boxes_with_next_box{#1}%
+ \afterassignment\syst_boxes_with_next_box_indeed
+ \setbox\nextbox}
+
+\def\syst_boxes_with_next_box_indeed
+ {\aftergroup\syst_boxes_with_next_box}
+
+\unexpanded\def\dowithnextboxcs#1%
+ {\let\syst_boxes_with_next_box#1%
+ \afterassignment\syst_boxes_with_next_box_indeed
+ \setbox\nextbox}
+
+%D So in fact we get:
+%D
+%D \starttyping
+%D \setbox\nextbox { \aftergroup\syst_boxes_with_next_box ... }
+%D \stoptyping
+%D
+%D or
+%D
+%D \starttyping
+%D \setbox\nextbox { ... } \syst_boxes_with_next_box
+%D \stoptyping
+%D
+%D A slower but more versatile implementation is:
+%D
+%D \starttyping
+%D \unexpanded\def\dowithnextbox#1#2%
+%D {\def\syst_boxes_with_next_box{#1}%
+%D \ifx#2\hbox
+%D \afterassignment\syst_boxes_with_next_box_indeed
+%D \else\ifx#2\vbox
+%D \afterassignment\syst_boxes_with_next_box_indeed
+%D \else\ifx#2\vtop
+%D \afterassignment\syst_boxes_with_next_box_indeed
+%D \else\ifx#2\normalvcenter
+%D \afterassignment\syst_boxes_with_next_box_indeed
+%D \else
+%D \afterassignment\syst_boxes_with_next_box
+%D \fi\fi\fi\fi
+%D \setbox\nextbox#2}
+%D \stoptyping
+%D
+%D This alternative also accepts \type {\box0} and alike, but we don't really need
+%D this functionality now.
+
+%D \macros
+%D {nextboxht,nextboxwd,nextboxdp,flushnextbox}
+%D
+%D The next couple of shortcuts saves us memory as well as \type {{}}'s in passing
+%D parameters.
+
+\def\nextboxht {\ht\nextbox}
+\def\nextboxwd {\wd\nextbox}
+\def\nextboxdp {\dp\nextbox}
+\def\nextboxhtdp{\htdp\nextbox}
+
+\unexpanded\def\flushnextbox{\box\nextbox}
+
+%D \macros
+%D {dowithnextboxcontent}
+%D
+%D But, occasionally we do need to pass some local settings without wanting to use
+%D additional grouping. Therefore we provide:
+%D
+%D \starttyping
+%D \dowithnextboxcontent{inside}{after}{box content}
+%D \stoptyping
+%D
+%D {\em todo: Search source for potential usage!}
+
+\unexpanded\def\dowithnextboxcontent#1#2% inside, after
+ {\def\syst_boxes_with_next_box_one{#2}%
+ \def\syst_boxes_with_next_box_two{#1}%
+ \afterassignment\syst_boxes_with_next_box_content_indeed
+ \setbox\nextbox}
+
+\unexpanded\def\dowithnextboxcontentcs#1#2% inside, after
+ {\let\syst_boxes_with_next_box_one#2%
+ \let\syst_boxes_with_next_box_two#1%
+ \afterassignment\syst_boxes_with_next_box_content_indeed
+ \setbox\nextbox}
+
+\def\syst_boxes_with_next_box_content_indeed
+ {\syst_boxes_with_next_box_two\aftergroup\syst_boxes_with_next_box_one}
+
+%D \macros
+%D {llap, rlap, tlap, blap, clap}
+%D
+%D Some well known friends, but we implement them our own way. We want the macros to
+%D work in both math and text mode.
+
+\def\dodorlap{\hpack to \zeropoint{\box\nextbox\hss}\endgroup}
+\def\dodollap{\hpack to \zeropoint{\hss\box\nextbox}\endgroup}
+\def\dodoclap{\hpack to \zeropoint{\hss\box\nextbox\hss}\endgroup}
+
+\def\dorlap{\begingroup\dowithnextboxcs\dodorlap\hbox}
+\def\dollap{\begingroup\dowithnextboxcs\dodollap\hbox}
+\def\doclap{\begingroup\dowithnextboxcs\dodoclap\hbox}
+
+\def\domathclap{\mathpalette\dodomathclap} \def\dodomathclap#1#2{\doclap{\normalstartimath\mathsurround\zeropoint#1#2\normalstopimath}}
+\def\domathllap{\mathpalette\dodomathllap} \def\dodomathllap#1#2{\dollap{\normalstartimath\mathsurround\zeropoint#1#2\normalstopimath}}
+\def\domathrlap{\mathpalette\dodomathrlap} \def\dodomathrlap#1#2{\dorlap{\normalstartimath\mathsurround\zeropoint#1#2\normalstopimath}}
+
+\unexpanded\def\rlap{\mathortext\domathrlap\dorlap}
+\unexpanded\def\llap{\mathortext\domathllap\dollap}
+\unexpanded\def\clap{\mathortext\domathclap\doclap}
+
+\def\dodotlap{\vpack to \zeropoint{\vss\box\nextbox}\endgroup}
+\def\dodoblap{\vpack to \zeropoint{\box\nextbox\vss}\endgroup}
+
+\unexpanded\def\tlap{\begingroup\dowithnextboxcs\dodotlap\vbox}
+\unexpanded\def\blap{\begingroup\dowithnextboxcs\dodoblap\vbox}
+
+%D \macros
+%D {beginofshapebox,
+%D reshapebox, doreshapebox,
+%D flushshapebox,
+%D innerflushshapebox,
+%D shapebox,
+%D ifreshapingbox}
+%D
+%D The next utility macro originates from some linenumbering mechanism. Due to
+%D \TEX's advanced way of typesetting paragraphs, it's not easy to do things on a
+%D line||by||line basis. This macro is able to reprocess a given box and can act
+%D upon its vertical boxed components, such as lines. The unwinding sequence in this
+%D macro is inspired by a \NTG\ workshop of David Salomon in June 1992.
+%D
+%D First we have to grab the piece of text we want to act upon. This is done by
+%D means of the duo macros:
+%D
+%D \starttyping
+%D \beginofshapebox
+%D a piece of text
+%D \endofshapebox
+%D \stoptyping
+%D
+%D When all texts is collected, we can call \type {\reshapebox} and do something
+%D with it's vertical components. We can make as much passes as needed. When we're
+%D done, the box can be unloaded with \type {\flushshapebox}. The only condition in
+%D this scheme is that \type {\reshapebox} must somehow unload the \BOX\ \type
+%D {\shapebox}.
+%D
+%D An important aspect is that the content is unrolled bottom||up. The next example
+%D illustrates this maybe unexpected characteristic.
+%D
+%D \startbuffer
+%D \beginofshapebox
+%D \em \input tufte
+%D \endofshapebox
+%D
+%D \newcounter\LineNumber
+%D
+%D \reshapebox
+%D {\doglobal\increment\LineNumber
+%D \hbox{\llap{\LineNumber\hskip2em}\box\shapebox}}
+%D
+%D \flushshapebox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D As we can see, when some kind of numbering is done, we have to add a second pass.
+%D
+%D \startbuffer
+%D \newcounter\LineNumber
+%D \newcounter\NumberOfLines
+%D
+%D \reshapebox
+%D {\doglobal\increment\NumberOfLines
+%D \box\shapebox}
+%D
+%D \reshapebox
+%D {\doglobal\increment\LineNumber
+%D \hbox
+%D {\llap{\LineNumber\ (\NumberOfLines)\hskip2em}%
+%D \box\shapebox}%
+%D \doglobal\decrement\NumberOfLines}
+%D
+%D \flushshapebox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D This example shows that the content of the box is still available after flushing.
+%D Another feature is that only the last reshaping counts. Multiple reshaping can be
+%D done by:
+%D
+%D \startbuffer
+%D \beginofshapebox
+%D \flushshapebox
+%D \endofshapebox
+%D
+%D \reshapebox
+%D {\doglobal\increment\LineNumber
+%D \hbox{\llap{$\star$\hskip1em}\box\shapebox}%
+%D \doglobal\decrement\NumberOfLines}
+%D
+%D \flushshapebox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D The macros are surprisingly easy to follow and in fact introduce no new concepts.
+%D Nearly all books on \TEX\ show similar solutions for unwinding \BOXES.
+%D
+%D Some macros, like footnote ones, can be sensitive for reshaping, which can result
+%D in an endless loop. We therefore offer:
+%D
+%D \starttyping
+%D \ifreshapingbox
+%D \stoptyping
+%D
+%D Some \CONTEXT\ commands are protected this way. Anyhow, reshaping is aborted
+%D after 100 dead cycles.
+%D
+%D By the way, changing the height and depth of \BOX\ \type {\shapebox} results in
+%D bad spacing. This means that for instance linenumbers etc. should be given zero
+%D height and depth before being lapped into the margin. The previous examples
+%D ignore this side effect, but beware!
+
+\newif \ifsomeshapeleft
+\newif \ifreshapingbox
+\newif \ifreshapingfailed % may save redundant runs
+
+\newbox \shapebox
+\newcount \shapepenalty
+\newdimen \shapekern
+\newskip \shapeskip
+
+\newbox \newshapebox
+\newbox \oldshapebox
+\newbox \tmpshapebox
+
+\newcount \shapecounter
+
+\newevery \everyshapebox \relax
+
+\def\shapesignal{.12345678pt} % or 12345sp
+
+\unexpanded\def\reshapebox#1%
+ {\doreshapebox
+ {#1}%
+ {\penalty\shapepenalty}%
+ {\kern \shapekern }%
+ {\vskip \shapeskip }}
+
+\def\doreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
+ {\global\reshapingfailedfalse
+ \ifzeropt\ht\oldshapebox
+ \setbox\newshapebox\emptyvbox
+ \else
+ \setbox\newshapebox\vbox % can be \vpack
+ {\unvcopy\oldshapebox
+ \setbox\newshapebox\emptybox
+ \shapecounter\zerocount
+ \doloop{\dodoreshapebox{#1}{#2}{#3}{#4}}}%
+ \setbox\newshapebox\box\tmpshapebox
+ \fi}
+
+\ifx\originalshapebox\undefined \let\originalshapebox\oldshapebox \fi
+
+% We will turn this into a \MKIV\ variant (we can use \type {\vpack} too).
+
+\unexpanded\def\insertshapesignal
+ {\hpack to \shapesignal{\strut\hss}% plus \strut
+ \prevdepth\strutdp} % never \nointerlineskip
+
+\unexpanded\def\restoreshapebox % compensates for the signal
+ {\global\setbox\tmpshapebox\vbox{\vskip-\lineheight\unvcopy\oldshapebox}}
+
+\def\dodoreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
+ {\ifnum\lastnodetype=\gluenodecode
+ \shapeskip\lastskip
+ \global\setbox\tmpshapebox\vbox{#4\unvbox\tmpshapebox}%
+ \unskip
+ \orelse\ifnum\lastnodetype=\kernnodecode
+ \shapekern\lastkern
+ \global\setbox\tmpshapebox\vbox{#3\unvbox\tmpshapebox}%
+ \unkern
+ \orelse\ifnum\lastnodetype=\penaltynodecode
+ \shapepenalty\lastpenalty
+ \global\setbox\tmpshapebox\vbox{#2\unvbox\tmpshapebox}%
+ \unpenalty
+ \orelse\ifnum\lastnodetype<\zeropoint
+ \exitloop
+ \else
+ \setbox\shapebox\lastbox
+ \ifvoid\shapebox
+ \orelse\ifdim\wd\shapebox=\shapesignal\relax
+ \exitloop
+ \else
+ \shapecounter\zerocount
+ \global\setbox\tmpshapebox\vbox{#1\unvbox\tmpshapebox}%
+ \fi
+ \fi
+ \ifnum\shapecounter>100 % can be less
+ \global\reshapingfailedtrue
+ \message{!!forced exit from shapebox \the\lastnodetype !!}%
+ \restoreshapebox
+ \exitloop
+ \else
+ \advance\shapecounter \plusone
+ \fi}
+
+\unexpanded\def\beginofshapebox
+ {\setbox\oldshapebox\vbox
+ \bgroup
+ \reshapingboxtrue
+ \the\everyshapebox
+ \insertshapesignal}
+
+\unexpanded\def\endofshapebox
+ {\endgraf
+ \egroup}
+
+\let\beginshapebox\beginofshapebox
+\let\endshapebox \endofshapebox
+
+\unexpanded\def\flushshapebox
+ {\bgroup
+ \ifzeropt\ht\newshapebox
+ \else
+ % make \prevdepth legal
+ % \par before the next \vskip gives far worse results
+ \ifdim\parskip>\zeropoint\vskip\parskip\else\par\fi
+ % and take a look
+ \ifdim\prevdepth=-\thousandpoint
+ \prevdepth\zeropoint
+ \fi
+ \ifdim\prevdepth<\zeropoint\relax
+ % something like a line or a signal or ...
+ \donetrue
+ \orelse\ifinner
+ % not watertight and not ok
+ \donefalse
+ \orelse\ifdim\pagegoal=\maxdimen
+ \donetrue
+ \else
+ % give the previous line a normal depth
+ \donetrue
+ {\forgeteverypar\verticalstrut}\nobreak
+ \kern-\struttotal % geen \vskip
+ \kern-\parskip
+ % \vskip-\strutdp
+ \fi
+ \scratchdimen\dp\newshapebox
+ \unvbox\newshapebox
+ % \prevdepth=0pt and \dp\newshapebox depend on last line
+ \kern-\scratchdimen % ??
+ % now \prevdepth=0pt
+ \ifdone
+ \kern\strutdp
+ \prevdepth\strutdp
+ \fi
+ \fi
+ \egroup}
+
+%D In real inner situations we can use:
+%D
+%D \starttyping
+%D \flushinnershapebox
+%D \stoptyping
+%D
+%D This one is used in \type{\framed}.
+
+% The kern fails on for instance:
+%
+% \omlijnd[offset=0pt,hoogte=8mm,uitlijnen={rechts,laho}]{\bfa test}
+
+\unexpanded\def\innerflushshapebox
+ {\ifzeropt\ht\newshapebox \else
+ \unvcopy\newshapebox\relax % unvcopy ! else spacing problem
+ % \kern-\dp\newshapebox\relax
+ \fi}
+
+%D For absolute control, one can use \type {\doreshapebox} directly. This macro
+%D takes four arguments, that take care of:
+%D
+%D \startitemize[n,packed]
+%D \item \type{\shapebox}
+%D \item \type{\shapepenalty}
+%D \item \type{\shapekern}
+%D \item \type{\shapeskip}
+%D \stopitemize
+
+%D \macros
+%D {shapedhbox}
+%D
+%D When constructing a new box, using the content of \type {\shapebox}, one can best
+%D use \type {\shapedhbox} instead of \type {\hbox}, since it manages the height and
+%D depth of the line.
+
+\unexpanded\def\shapedhbox % lines with non strutted dimensions have
+ {\expanded{\dowithnextbox % interlineskip so if we want the original
+ {\ht\nextbox\the\ht\shapebox % spacing, we need to preserve the original
+ \dp\nextbox\the\dp\shapebox % height and depth which is definitely
+ \box\nextbox}} % needed if we apply struts to the 'new'
+ \hbox} % box or do something that changed ist size
+
+%D \macros
+%D {hyphenatedword,
+%D hyphenatedpar,
+%D hyphenatedfile,
+%D dohyphenateword}
+%D
+%D We no longer use the pure \TEX\ variant. In due time we will report some more
+%D advanced statistics.
+%D
+%D \starttyping
+%D \showhyphens{dohyphenatedword}
+%D \stoptyping
+
+\unexpanded\def\doshowhyphenatednextbox
+ {\clf_showhyphenatedinlist\nextbox}
+
+\unexpanded\def\showhyphens % hpack: so no processing (we hyphenate in lua)
+ {\dowithnextboxcs\doshowhyphenatednextbox\hpack}
+
+%D The following macros are seldom used but handy for tracing.
+%D
+%D \starttyping
+%D \hyphenatedword{dohyphenatedword}
+%D \hyphenatedpar {\dorecurse{10}{dohyphenatedword }}
+%D \hyphenatedfile{tufte}
+%D \stoptyping
+
+\unexpanded\def\dohyphenatednextbox
+ {\clf_hyphenatedlist\nextbox false\relax
+ \unhbox\nextbox}
+
+\unexpanded\def\hyphenatedword {\dowithnextboxcs\dohyphenatednextbox\hbox}
+\unexpanded\def\hyphenatedpar {\dowithnextboxcs\dohyphenatednextbox\hbox}
+\unexpanded\def\hyphenatedfile#1{\dowithnextboxcs\dohyphenatednextbox\hbox{\readfile{#1}\donothing\donothing}}
+
+\unexpanded\def\dohyphenatednextboxcolor
+ {\clf_hyphenatedlist\nextbox true\relax
+ \unhbox\nextbox}
+
+\unexpanded\def\hyphenatedcoloredword{\dowithnextboxcs\dohyphenatednextboxcolor\hbox}
+
+%D \macros
+%D {processtokens}
+%D
+%D We fully agree with (most) typographers that inter||letter spacing is only
+%D permitted in fancy titles, we provide a macro that can be used to do so. Because
+%D this is (definitely and fortunately) no feature of \TEX, we have to step through
+%D the token list ourselves.
+%D
+%D \starttyping
+%D \processtokens {before} {between} {after} {space} {tokens}
+%D \stoptyping
+%D
+%D An example of a call is:
+%D
+%D \startbuffer
+%D \processtokens {[} {+} {]} {\space} {hello world}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This results in:
+%D
+%D \getbuffer
+%D
+%D The list of tokens may contain spaces, while \type {\\}, \type {{}} and \type {\
+%D } are handled as space too.
+
+\unexpanded\def\processtokens#1#2#3#4#5%
+ {\begingroup
+ \def\lastcharacter{\lastcharacter}% hm, recursive ?
+ \def\space{ }%
+ \let\\=\space
+ \def\before {#1}%
+ \def\between{#2}%
+ \def\after {#3}%
+ \def\white {#4}%
+ \let\savedbefore\before
+ \doprocesstokens#5\lastcharacter
+ \endgroup}
+
+\def\doprocesstokens% the space after = is essential
+ {\afterassignment\dodoprocesstokens\let\nextprocessedtoken= }
+
+\def\redoprocessedtoken
+ {\dowithnextbox
+ {\before{\copy\nextbox}% \before can use nextbox several times
+ \let\before\between
+ \doprocesstokens}
+ \hbox\bgroup}
+
+\def\dodoprocesstokens
+ {\ifx\nextprocessedtoken\lastcharacter
+ \after
+ \orelse\ifx\nextprocessedtoken\bgroup
+ \expandafter\redoprocessedtoken
+ \else
+ \expandafter\if\space\nextprocessedtoken
+ \after\white
+ \let\before\savedbefore
+ \else
+ \before\nextprocessedtoken
+ \let\before\between
+ \fi
+ \expandafter\doprocesstokens
+ \fi}
+
+%D \macros
+%D {doboundtext}
+%D
+%D Sometimes there is not enough room to show the complete (line of) text. In such a
+%D situation we can strip of some characters by using \type {\doboundtext}. When the
+%D text is wider than the given width, it's split and the third argument is
+%D appended. When the text to be checked is packed in a command, we'll have to use
+%D \type {\expandafter}.
+%D
+%D \starttyping
+%D \doboundtext{a very, probably to long, text}{3cm}{...}
+%D \stoptyping
+%D
+%D When calculating the room needed, we take the width of the third argument into
+%D account, which leads to a bit more complex macro than needed at first sight.
+
+\def\dodoboundtext#1%
+ {\setbox\scratchboxone\hbox{#1}%
+ \advance\scratchdimen -\wd\scratchboxone
+ \ifdim\scratchdimen>\zeropoint\relax#1\fi}
+
+\def\doboundtext#1#2#3% still used?
+ {\hbox
+ {\setbox\scratchbox\hbox{#1}%
+ \scratchdimen#2\relax
+ \ifdim\wd\scratchbox>\scratchdimen
+ \setbox\scratchbox\hbox{#3}%
+ \advance\scratchdimen -\wd\scratchbox
+ \handletokens#1\with\dodoboundtext
+ \fi
+ \box\scratchbox}}
+
+%D \macros
+%D {limitatetext}
+%D
+%D A bit more beautiful alternative for the previous command is the next one. This
+%D command is more robust because we let \TEX\ do most of the job. The previous
+%D command works better on text that cannot be hyphenated.
+%D
+%D \starttyping
+%D \limitatetext {text} {width} {sentinel}
+%D \limitatetext {text} {-width} {prelude}
+%D \stoptyping
+%D
+%D When no width is given, the whole text comes available. The sentinel is optional.
+%D This is about the third version.
+
+\ifdefined\fakecompoundhyphen\else \let\fakecompoundhyphen\relax \fi
+\ifdefined\veryraggedright \else \def\veryraggedright{\raggedright} \fi
+
+% \unexpanded\def\limitatetext
+% {\bgroup % evt \setstrut
+% \forgetall % otherwise indentation and so
+% \let\limitatetext\firstofthreearguments
+% \fakecompoundhyphen % dangerous ! ! ! ! ! ! ! ! !
+% \dowithnextboxcs\syst_boxes_limitate_text\hbox}
+%
+% \def\syst_boxes_limitate_text#1% #2
+% {\doifelsenothing{#1}\syst_boxes_limitate_text_nop\syst_boxes_limitate_text_yes{#1}} % {#2}
+%
+% \def\syst_boxes_limitate_text_nop#1#2%
+% {\unhbox\nextbox
+% \egroup}
+%
+% \def\syst_boxes_limitate_text_yes#1#2%
+% {\nopenalties
+% \scratchdimen#1\relax
+% \ifdim\scratchdimen<\zeropoint\relax % we'll take the last line
+% \donefalse
+% \scratchdimen-\scratchdimen
+% \else
+% \donetrue
+% \fi
+% \ifdim\wd\nextbox>\scratchdimen
+% \setbox\scratchbox\hbox{\ifdone\space#2\else#2\space\fi}%
+% \advance\scratchdimen -\wd\scratchbox
+% \setbox\scratchboxone\box\nextbox
+% \setbox\nextbox\vbox
+% {\hsize\scratchdimen
+% \hfuzz\maxdimen
+% \veryraggedright
+% \strut
+% \ifdone \else
+% \parfillskip\zeropoint
+% \rightskip\zeropoint
+% \hskip\zeropoint \s!plus 1\s!fill % \hsize
+% \fi
+% \unhcopy\scratchboxone}%
+% \ifdim\ht\nextbox>\strutht
+% \setbox\nextbox\vbox % if omitted: missing brace reported
+% {\splittopskip\openstrutheight
+% \ifdone
+% \setbox\nextbox\vsplit\nextbox to \strutht
+% \else
+% \doloop
+% {\setbox\scratchboxone\vsplit\nextbox to \strutht
+% \ifdim\ht\nextbox>\strutht \else \exitloop \fi}%
+% \fi
+% \unvbox\nextbox
+% \setbox\nextbox\lastbox
+% \global\setbox1\hpack
+% {\ifdone
+% \unhbox\nextbox\unskip\kern\zeropoint\box\scratchbox
+% \else
+% \box\scratchbox\unhbox\nextbox
+% \fi
+% \unskip}}%
+% \unhbox1
+% \else
+% \unhbox0%
+% \fi
+% \else
+% \unhbox\nextbox
+% \fi
+% \egroup}
+%
+% %D We can also limit a text with more control:
+% %D
+% %D \startbuffer
+% %D \limitatetext {\input tufte } {2cm,5mm} {\unknown}
+% %D \limitatetext {ton en hans} {2cm,5mm} {\unknown}
+% %D \limitatetext {ton en hans zijn eikels} {2cm,5mm} {\unknown}
+% %D \limitatetext {ton} {2cm,5mm} {\unknown}
+% %D \stopbuffer
+% %D
+% %D \typebuffer \getbuffer
+% %D
+% %D We build this feature on top of the previous macro.
+%
+% % we could move the text argument to the end
+%
+% \let\normallimitatetext\limitatetext
+%
+% \def\speciallimitatetext#1#2#3#4% text left right placeholder
+% {%\dontleavehmode
+% \bgroup
+% \let\speciallimitatetext\firstoffourarguments
+% \setbox\scratchboxone\hbox
+% {\nohyphens
+% \normallimitatetext{#1}{+#2}{}#4%
+% \normallimitatetext{#1}{-#3}{}}%
+% \setbox\scratchboxtwo\hbox
+% {#1}%
+% \ifdim\wd\scratchboxtwo<\wd\scratchboxone #1\else\unhbox\scratchboxone\fi
+% \egroup}
+%
+% \unexpanded\def\limitatetext#1#2#3% \expanded added 2003/01/16
+% {\splitatcomma{#2}\leftlimit\rightlimit
+% \ifx\rightlimit\empty
+% \normallimitatetext {#1}\leftlimit {#3}%
+% \else
+% \speciallimitatetext{#1}\leftlimit\rightlimit{#3}%
+% \fi}
+
+\unexpanded\def\limitatetext#1#2#3% \expanded added 2003/01/16
+ {\splitatcomma{#2}\leftlimit\rightlimit
+ \limitated
+ left \leftlimit
+ \ifx\rightlimit\empty\else
+ right \rightlimit
+ \fi
+ strip true
+ sentinel {#3}
+ text {#1}
+ \relax}
+
+%D Undocumented bonus (see wiki):
+%D
+%D \starttyping
+%D \limitatefirstline{\input tufte\relax}{10cm}{\unknown}
+%D \stoptyping
+
+\unexpanded\def\limitatefirstline#1#2#3%
+ {\hbox\bgroup\strut % \hpack
+ \setbox\scratchbox\hbox{\begstrut#1\endstrut}%
+ \ifdim\wd\scratchbox>#2\relax
+ \setbox\scratchbox\hbox{#3}%
+ \hsize#2\relax
+ \advance\hsize-\wd\scratchbox
+ \setbox\scratchbox\vbox{\forgetall\veryraggedright#1}%
+ \setbox\scratchbox\vsplit\scratchbox to \lineheight
+ \vbox
+ {\unvbox\scratchbox
+ \global\setbox\plusone\lastbox
+ \global\setbox\plusone\hbox{\strut\unhbox\plusone}%
+ \hbox % to #2 % \hpack
+ {\ifx\clip\undefined
+ \box\plusone
+ \orelse\ifdim\wd\plusone>\hsize
+ \lower\strutdepth\hpack{\clip[\c!width=\hsize,\c!height=\lineheight]{\hpack{\raise\strutdepth\box\plusone}}}%
+ \else
+ \box\plusone
+ \fi
+ \removeunwantedspaces#3}}% \removeunwantedspaces\hss#3}}%
+ \else
+ #1%
+ \fi
+ \egroup}
+
+%D \macros
+%D {processisolatedwords,processisolatedchars}
+%D
+%D \startbuffer
+%D \processisolatedchars{some more words} \ruledhbox \par
+%D \processisolatedchars{and some $x + y = z$ math} \ruledhbox \par
+%D \processisolatedchars{and a \hbox{$x + y = z$}} \ruledhbox \par
+%D \processisolatedwords{some more words} \ruledhbox \par
+%D \processisolatedwords{and some $x + y = z$ math} \ruledhbox \par
+%D \processisolatedwords{and a \hbox{$x + y = z$}} \ruledhbox \par
+%D \stopbuffer
+%D
+%D \typebuffer \blank \getbuffer \blank
+
+% todo: provide variant with #1 picked up as box
+
+\unexpanded\def\processisolatedchars#1#2%
+ {\dontleavehmode
+ \begingroup
+ \setbox\scratchbox\hbox{\settrialtypesetting#2{\savecurrentattributes{pic}}}%
+ \setbox\scratchbox\hbox{\restorecurrentattributes{pic}#1}%
+ \clf_applytobox
+ method {char}%
+ box \scratchbox
+ command {\csstring#2}%
+ nested true%
+ \relax
+ \endgroup}
+
+\unexpanded\def\processisolatedwords#1#2%
+ {\dontleavehmode
+ \begingroup
+ \setbox\scratchbox\hbox{\settrialtypesetting#2{\savecurrentattributes{pic}}}%
+ \setbox\scratchbox\hbox{\restorecurrentattributes{pic}#1}%
+ \clf_applytobox
+ method {word}%
+ box \scratchbox
+ command {\csstring#2}%
+ nested true%
+ \relax
+ \endgroup}
+
+%D A variant:
+
+\unexpanded\def\applytocharacters#1%
+ {\dontleavehmode
+ \dowithnextbox{\clf_applytobox
+ method {char}%
+ box \nextbox
+ command {\csstring#1}%
+ nested true%
+ \relax}%
+ \hbox}
+
+\unexpanded\def\applytowords#1%
+ {\dontleavehmode
+ \dowithnextbox{\clf_applytobox
+ method {word}%
+ box \nextbox
+ command {\csstring#1}%
+ nested true%
+ \relax}%
+ \hbox}
+
+%D The old call:
+
+\unexpanded\def\processwords#1%
+ {\processisolatedwords{#1}\processword}
+
+\let\processword\relax
+
+\unexpanded\def\applytosplitstringchar#1#2%
+ {\dontleavehmode\clf_processsplit
+ data {#2}%
+ command {\csstring#1}%
+ method {char}%
+ \relax}
+
+\unexpanded\def\applytosplitstringword#1#2%
+ {\dontleavehmode\clf_processsplit
+ data {#2}%
+ command {\csstring#1}%
+ method {word}%
+ \relax}
+
+\unexpanded\def\applytosplitstringline#1#2%
+ {\dontleavehmode\clf_processsplit
+ data {#2}%
+ command {\csstring#1}%
+ method {line}%
+ \relax}
+
+\unexpanded\def\applytosplitstringcharspaced#1#2%
+ {\dontleavehmode\clf_processsplit
+ data {#2}%
+ command {\csstring#1}%
+ method {char}%
+ spaced true%
+ \relax}
+
+\unexpanded\def\applytosplitstringwordspaced#1#2%
+ {\dontleavehmode\clf_processsplit
+ data {#2}%
+ command {\csstring#1}%
+ method {word}%
+ spaced true%
+ \relax}
+
+\unexpanded\def\applytosplitstringlinespaced#1#2%
+ {\dontleavehmode\clf_processsplit
+ data {#2}%
+ command {\csstring#1}%
+ method {line}%
+ spaced true%
+ \relax}
+
+%D \macros
+%D {sbox}
+%D
+%D This is a rather strange command. It grabs some box content and and limits the
+%D size to the height and depth of a \type {\strut}. The resulting bottom||alligned
+%D box can be used aside other ones, without disturbing the normal baseline
+%D distance.
+%D
+%D \startbuffer
+%D \ruledhbox to .5\hsize{\sbox{eerste\par tweede \par derde}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Shows up as:
+%D
+%D \startexample
+%D \vskip3\baselineskip
+%D \getbuffer
+%D \stopexample
+%D
+%D Before displaying the result we added some skip, otherwise the first two lines
+%D would have ended up in the text. This macro can be useful when building
+%D complicated menus, headers and footers and|/|or margin material.
+
+\unexpanded\def\sbox
+ {\vpack\bgroup
+ \dowithnextboxcs\syst_boxes_sbox_finish\vbox}
+
+\unexpanded\def\syst_boxes_sbox_finish
+ {\boxyoffset\nextbox-\strutdp
+ \dp\nextbox\strutdp
+ \ht\nextbox\strutht
+ \box\nextbox
+ \egroup}
+
+%D A variant on this:
+%D
+%D \starttyping
+%D xx \ruledhbox{\inlinedbox{\tfd test}} xx
+%D \stoptyping
+
+\unexpanded\def\inlinedbox
+ {\bgroup
+ \dowithnextboxcs\syst_boxes_inlined_finish\hbox}
+
+\unexpanded\def\syst_boxes_inlined_finish
+ {\boxyoffset\nextbox-\dimexpr(\htdp\nextbox-\lineheight)/\plustwo+\strutdp\relax
+ \ht\nextbox\strutht
+ \dp\nextbox\strutdp
+ \box\nextbox
+ \egroup}
+
+%D \macros
+%D {struttedbox}
+%D
+%D This boxing macro limits the height and depth to those of a strut.
+
+\unexpanded\def\struttedbox
+ {\hpack\bgroup
+ \dowithnextboxcs\syst_boxes_struttedbox_finish\hbox}
+
+\def\syst_boxes_struttedbox_finish
+ {\dp\nextbox\strutdepth
+ \ht\nextbox\strutheight
+ \box\nextbox
+ \egroup}
+
+%D \macros
+%D {topskippedbox}
+%D
+%D This macro compensates the difference between the topskip and strutheight. Watch
+%D how we preserve the depth when it equals strutdepth.
+
+\unexpanded\def\topskippedbox
+ {\hpack\bgroup\dowithnextboxcs\syst_boxes_topskippedbox_finish\hbox}
+
+\def\syst_boxes_topskippedbox_finish
+ {\edef\m_boxes_tmp{\ifdim\strutdepth=\dp\nextbox\dp\nextbox\the\dp\nextbox\fi}%
+ \lower\topskip\hpack{\raise\strutheight\box\nextbox}%
+ \m_boxes_tmp
+ \egroup}
+
+%D \macros
+%D {centeredbox, centerednextbox}
+%D
+%D Here is another strange one. This one offers a sort of overlay with positive or
+%D negative offsets. This command can be used in well defined areas where no offset
+%D options are available. We first used it when building a button inside the margin
+%D footer, where the button should have a horizontal offset and should be centered
+%D with respect to the surrounding box. The last of the three examples we show below
+%D says:
+%D
+%D \starttyping
+%D \vsize=3cm
+%D \hsize=3cm
+%D \ruledvbox to \vsize
+%D {\centeredbox height .5cm width -1cm
+%D {\vrule width \hsize height \vsize}}}
+%D \stoptyping
+%D
+%D Here the \type {\ruledvbox} just shows the surrounding box and \type {\vrule} is
+%D used to show the centered box.
+%D
+%D \def\AnExample#1#2%
+%D {\vsize=3cm
+%D \hsize=3cm
+%D \ruledvbox to \vsize
+%D {\centeredbox height #1 width #2
+%D {\color[green]{\vrule width \hsize height \vsize}}}}
+%D
+%D \startlinecorrection
+%D \startcombination[3*1]
+%D {\AnExample {-1cm} {.5cm}} {}
+%D {\AnExample {.5cm} {-1cm}} {}
+%D {\AnExample {-1cm} {-.5cm}} {}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D This command takes two optional arguments: \type {width} and \type {height}.
+%D Observing readers can see that we use \TEX's own scanner for grabbing these
+%D arguments: \type {#1#} reads everyting till the next brace and passes it to both
+%D rules. The setting of the box dimensions at the end is needed for special cases.
+%D The dimensions of the surrounding box are kept intact. This commands handles
+%D positive and negative dimensions (which is why we need two boxes with rules).
+
+\unexpanded\def\centeredbox#1#% height +/-dimen width +/-dimen
+ {\bgroup
+ \dontcomplain
+ \forgetall
+ \scangivendimensions#1\relax
+ \advance\vsize\givenheight
+ \advance\hsize\givenwidth
+ \dowithnextboxcs\syst_boxes_centered_finish
+ \hbox}
+
+\def\syst_boxes_centered_finish
+ {\boxxoffset\nextbox.5\dimexpr
+ \hsize
+ -\wd\nextbox
+ -\givenwidth
+ \relax
+ \boxyoffset\nextbox.5\dimexpr
+ \vsize
+ -\ht\nextbox
+ +\dp\nextbox
+ -\givenheight
+ \relax
+ \wd\nextbox\dimexpr\hsize-\givenwidth \relax
+ \ht\nextbox\dimexpr\vsize-\givenheight\relax
+ \dp\nextbox\zeropoint
+ \box\nextbox
+ \egroup}
+
+%D For those who don't want to deal with \type {\hsize} and \type {\vsize}, we have:
+%D
+%D \starttyping
+%D \centerednextbox width 2bp height 2bp
+%D {\framed[width=100bp,height=100bp]{}}
+%D \stoptyping
+%D
+%D Do you see why we call this one \type {next}?
+
+\unexpanded\def\centerednextbox#1#%
+ {\bgroup
+ \dowithnextbox
+ {\hsize\wd\nextbox
+ \vsize\ht\nextbox
+ \centeredbox#1{\box\nextbox}%
+ \egroup}
+ \hbox}
+
+%D \macros
+%D {centerbox}
+%D
+%D Centering on the available space is done by:
+%D
+%D \starttyping
+%D \centerbox <optional specs> {content}
+%D \stoptyping
+%D
+%D When omitted, the current \type {\hsize} and \type {\vsize} are used. Local
+%D dimensions are supported.
+
+\unexpanded\def\centerbox#1#% optional height +/-dimen width +/-dimen
+ {\bgroup
+ \dowithnextbox
+ {\setlocalhsize
+ \setbox\scratchbox\hpack{\vrule\s!width \zeropoint#1}%
+ \ifzeropt\wd\scratchbox\else\hsize\wd\scratchbox\fi
+ \setbox\scratchbox\vpack{\hrule\s!height\zeropoint#1}%
+ \ifzeropt\ht\scratchbox\else\vsize\ht\scratchbox\fi
+ \vpack to \vsize{\vss\hpack to \hsize{\hss\box\nextbox\hss}\vss}%
+ \egroup}%
+ \hbox}
+
+%D \macros
+%D {setrigidcolumnhsize,rigidcolumnbalance,rigidcolumnlines}
+%D
+%D These macros are copied from the \TEX book, page~397, and extended by a macro
+%D that sets the \type {\hsize}.
+%D
+%D \starttyping
+%D \setrigidcolumnhsize {total width} {distance} {n}
+%D \rigidcolumnbalance {box}
+%D \stoptyping
+%D
+%D Both these macros are for instance used in typesetting footnotes. The following
+%D flags influence the process.
+
+\newif\ifalignrigidcolumns
+\newif\ifstretchrigidcolumns
+\newif\iftightrigidcolumns % if true: just a vbox, no depth/noflines/gridsnap corrrections
+
+\unexpanded\def\setrigidcolumnhsize#1#2#3% todo: \dimexpr
+ {\xdef\savedrigidhsize{\the\hsize}%
+ \hsize#1\relax
+ \global\chardef\rigidcolumns#3\relax
+ \scratchdimen -#2\relax
+ \multiply\scratchdimen #3\relax
+ \advance\scratchdimen #2\relax
+ \advance\hsize \scratchdimen
+ \divide\hsize #3\relax}
+
+% ==
+%
+% \def\setrigidcolumnhsize#1#2#3%
+% {\xdef\savedrigidhsize{\the\hsize}%
+% \global\chardef\rigidcolumns#3\relax
+% \hsize=\dimexpr(#1-\numexpr#3-1\relax\dimexpr#2\relax)/#3\relax}
+
+\newbox\rigidcolumnbox
+
+\let\rigidcolumnlines\!!zerocount
+
+\unexpanded\def\rigidcolumnbalance#1%
+ {\ifnum\rigidcolumns=1 % tzt ook h/d correctie
+ \ifinner\ifhmode\box\else\unvbox\fi\else\unvbox\fi#1\relax
+ \else
+ \vbox % \vpack
+ {\forgetall
+ \nopenalties
+ \dontcomplain
+ \setbox\rigidcolumnbox\vbox
+ {\line{}\goodbreak\unvbox#1\removebottomthings}%
+ \splittopskip\openstrutheight
+ \setbox\scratchbox\vsplit\rigidcolumnbox to \zeropoint
+ \ifcase\rigidcolumnlines\relax
+ % \iffalse
+ % % maybe some day an option
+ % \scratchskip\ht\rigidcolumnbox
+ % \advance\scratchskip\dp\rigidcolumnbox
+ % \getnoflines\scratchskip
+ % \ifodd\noflines
+ % \advance\noflines\plusone
+ % \fi
+ % \divide\noflines\rigidcolumns
+ %\else
+ \scratchdimen\ht\rigidcolumnbox
+ \divide\scratchdimen \rigidcolumns
+ \getnoflines\scratchdimen
+ %\fi
+ \else
+ \noflines\rigidcolumnlines % to be sure
+ \fi
+ \scratchdimen\noflines\lineheight
+ % new: we now loop so that we don't loose content
+ % since in practice we also use this macro for
+ % funny lineheights and border cases
+ \setbox0=\box\rigidcolumnbox
+ \doloop
+ {\setbox\rigidcolumnbox=\copy0
+ \setbox\scratchbox\hpack to \savedrigidhsize
+ {\dorecurse\rigidcolumns
+ {\setbox\scratchbox\vsplit\rigidcolumnbox to \scratchdimen
+ \dp\scratchbox\openstrutdepth
+ \setbox\scratchbox\vtop
+ \ifalignrigidcolumns to
+ \ifstretchrigidcolumns\vsize\else\scratchdimen\fi
+ \fi
+ {\unvbox\scratchbox}%
+ \wd\scratchbox\hsize
+ \box\scratchbox
+ \hfill}%
+ \hfillneg}%
+ \ifvoid\rigidcolumnbox\exitloop\else\advance\scratchdimen\lineheight\fi}%
+ \iftightrigidcolumns
+ \setbox\scratchbox\hpack{\raise\dp\scratchbox\box\scratchbox}%
+ \else
+ \advance\scratchdimen -\openstrutdepth
+ \setbox\scratchbox\hpack{\raise\scratchdimen\box\scratchbox}%
+ \dp\scratchbox\openstrutdepth
+ \ht\scratchbox\scratchdimen
+ \fi
+ \box\scratchbox}%
+ \fi}
+
+%D \macros
+%D {startvboxtohbox,stopvboxtohbox,convertvboxtohbox}
+%D
+%D Here is another of Knuth's dirty tricks, as presented on pages 398 and 399 of the
+%D \TEX book. These macros can be used like:
+%D
+%D \starttyping
+%D \vbox
+%D \bgroup
+%D \startvboxtohbox ... \stopvboxtohbox
+%D \startvboxtohbox ... \stopvboxtohbox
+%D \startvboxtohbox ... \stopvboxtohbox
+%D \egroup
+%D
+%D \vbox
+%D \bgroup
+%D \convertvboxtohbox
+%D \egroup
+%D \stoptyping
+%D
+%D These macros are used in reformatting footnotes, so they do what they're meant
+%D for.
+
+\newdimen\vboxtohboxslack
+\newdimen\hboxestohboxslack
+
+%D Create line and fake height of paragraph by messign with heights: a nice hack by
+%D DEK himself.
+
+%\unexpanded\def\setvboxtohbox
+% {\bgroup
+% \ifdim\baselineskip<16pt \relax
+% \scratchdimen\baselineskip
+% \multiply\scratchdimen 1024
+% \else
+% \message{cropping \baselineskip to 16pt}%
+% \scratchdimen\maxdimen
+% \fi
+% \divide\scratchdimen \hsize
+% \multiply\scratchdimen 64
+% \xdef\vboxtohboxfactor{\withoutpt\the\scratchdimen}%
+% \egroup}
+%
+% \unexpanded\def\startvboxtohbox
+% {\bgroup
+% \setvboxtohbox
+% \setbox\scratchbox\hbox\bgroup}
+%
+% \unexpanded\def\stopvboxtohbox
+% {\ifcase\vboxtohboxslack\else\hskip\zeropoint\!!minus\vboxtohboxslack\fi
+% \egroup
+% \dp\scratchbox\zeropoint
+% \ht\scratchbox\vboxtohboxfactor\wd\scratchbox
+% \box\scratchbox
+% \egroup}
+
+% More modern:
+
+% \definesystemattribute[vboxtohboxseparator][public]
+
+%newbox\d_syst_boxes_vboxtohbox
+\newbox\d_syst_boxes_separator
+
+\unexpanded\def\startvboxtohboxseparator
+ {\setbox\d_syst_boxes_separator\hbox attr \vboxtohboxseparatorattribute\plusone\bgroup}
+
+\unexpanded\def\stopvboxtohboxseparator
+ {\egroup}
+
+\unexpanded\def\startvboxtohbox
+ {\begingroup
+ \setbox\scratchbox\hbox\bgroup}
+
+\unexpanded\def\stopvboxtohbox
+ {\ifvoid\d_syst_boxes_separator
+ \hskip\zeropoint\ifcase\vboxtohboxslack\else\s!minus\vboxtohboxslack\fi % we really need a skip
+ \else
+ \box\d_syst_boxes_separator
+ \fi
+ \egroup
+ \clf_hboxtovbox\scratchbox
+ \box\scratchbox
+ \endgroup}
+
+% A possible reconstruction:
+
+\unexpanded\def\convertvboxtohbox
+ {\makehboxofhboxes
+ \setbox\scratchboxone\hpack{\unhbox\scratchboxone\removehboxes}% \hpack
+ \noindent\unhbox\scratchboxone\par}
+
+\unexpanded\def\makehboxofhboxes
+ {\setbox\scratchboxone\emptyhbox
+ \loop % \doloop { .. \exitloop .. }
+ \setbox\scratchboxtwo\lastbox
+ \ifhbox\scratchboxtwo
+ \setbox\scratchboxone\hpack{\box\scratchboxtwo\unhbox\scratchboxone}%
+ \repeat}
+
+\unexpanded\def\removehboxes
+ {\setbox\scratchboxone\lastbox
+ \ifhbox\scratchboxone
+ {\removehboxes}\unhbox\scratchboxone
+ \fi}
+
+% And one special for notes:
+
+\unexpanded\def\starthboxestohbox
+ {\bgroup
+ \setbox\scratchbox\vbox\bgroup}
+
+\unexpanded\def\stophboxestohbox
+ {\egroup
+ \clf_vboxlisttohbox\scratchbox\nextbox\dimexpr\hboxestohboxslack\relax
+ \dontleavehmode
+ \unhbox\nextbox
+ \removeunwantedspaces
+ \par
+ \egroup}
+
+%D \macros
+%D {unhhbox}
+%D
+%D The next macro is used in typesetting inline headings. Let's first look at the
+%D macro and then show an example.
+
+\newbox \unhhedbox
+\newbox \hhbox
+\newdimen \lasthhboxwidth
+\newskip \hhboxindent
+
+\unexpanded\def\unhhbox#1\with#2%
+ {\bgroup
+ \nopenalties
+ \dontcomplain
+ \forgetall
+ \setbox\unhhedbox\vbox{\hskip\hhboxindent\strut\unhbox#1}% => \hsize
+ \doloop
+ {\setbox\hhbox\vsplit\unhhedbox to \lineheight
+ \ifvoid\unhhedbox
+ \setbox\hhbox\hbox{\strut\hboxofvbox\hhbox}% \hpack
+ \fi
+ \ht\hhbox\strutht
+ \dp\hhbox\strutdp
+ \ifzeropt\hhboxindent\else
+ \setbox\hhbox\hpack{\kern-\hhboxindent\box\hhbox}%
+ \hhboxindent\zeropoint
+ \fi
+ \global\lasthhboxwidth\wd\hhbox
+ #2\relax
+ \ifvoid\unhhedbox
+ \exitloop
+ \else
+ \hskip\zeropoint \s!plus \zeropoint
+ \fi}%
+ \egroup}
+
+\def\dohboxofvbox
+ {\setbox0\vpack{\unvbox\scratchcounter\global\setbox1\lastbox}%
+ \unhbox1
+ \egroup}
+
+\unexpanded\def\hboxofvbox
+ {\bgroup
+ \afterassignment\dohboxofvbox
+ \scratchcounter=}
+
+%D This macro can be used to break a paragraph apart and treat each line seperately,
+%D for instance, making it clickable. The main complication is that we want to be
+%D able to continue the paragraph, something that's needed in the in line section
+%D headers.
+%D
+%D \startbuffer
+%D \setbox0=\hbox{\input tufte \relax}
+%D \setbox2=\hbox{\input knuth \relax}
+%D \unhhbox0\with{\ruledhbox{\box\hhbox}}
+%D \hskip1em plus 1em minus 1em
+%D \hhboxindent=\lasthhboxwidth
+%D \advance\hhboxindent by \lastskip
+%D \unhhbox2\with{\ruledhbox{\box\hhbox}}
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D This piece of text was typeset by saying:
+%D
+%D \typebuffer
+%D
+%D Not that nice a definition, but effective. Note the stretch we've build in the
+%D line that connects the two paragraphs.
+
+%D \macros
+%D {doifcontent}
+%D
+%D When processing depends on the availability of content, one can give the next
+%D macro a try.
+%D
+%D \starttyping
+%D \doifcontent{pre content}{post content}{no content}\somebox
+%D \stoptyping
+%D
+%D Where \type {\somebox} is either a \type {\hbox} or \type {\vbox}. If the
+%D dimension of this box suggest some content, the resulting box is unboxed and
+%D surrounded by the first two arguments, else the third arguments is executed.
+
+\unexpanded\def\doifcontent#1#2#3%
+ {\dowithnextbox
+ {\ifhbox\nextbox
+ \ifdim\wd\nextbox>\zeropoint
+ #1\unhbox\nextbox#2\relax
+ \else
+ #3\relax
+ \fi
+ \else
+ \ifdim\ht\nextbox>\zeropoint
+ #1\unvbox\nextbox#2\relax
+ \else
+ #3\relax
+ \fi
+ \fi}}
+
+%D So when we say:
+%D
+%D \startbuffer
+%D \doifcontent{[}{]}{}\hbox{content sensitive typesetting}
+%D
+%D \doifcontent{}{\page}{}\vbox{content sensitive typesetting}
+%D
+%D \doifcontent{}{}{\message{Didn't you forget something?}}\hbox{}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D We get:
+%D
+%D \getbuffer
+%D
+%D Where the last call of course does not show up in this document, but definitely
+%D generates a confusing message.
+
+%D \macros
+%D {processboxes}
+%D
+%D The next macro gobble boxes and is for instance used for overlays. First we show
+%D the general handler.
+
+\newbox\processbox % public : this is the one where \nextbox's end up in
+
+\unexpanded\def\processboxes#1%
+ {\bgroup
+ \def\syst_boxes_process_indeed{#1}% #1 can be redefined halfway
+ \setbox\processbox\emptybox
+ \doifelsenextbgroup\syst_boxes_process_yes\syst_boxes_process_nop}
+
+\def\syst_boxes_process_yes
+ {\dowithnextboxcs\syst_boxes_process_content\hbox}
+
+\def\syst_boxes_process_content
+ {\removeunwantedspaces
+ \syst_boxes_process_indeed % takes \nextbox makes \processbox
+ \doifelsenextbgroup\syst_boxes_process_yes\syst_boxes_process_nop}
+
+\unexpanded\def\syst_boxes_process_nop
+ {\removeunwantedspaces
+ \box\processbox
+ \egroup}
+
+%D \macros
+%D {startoverlay}
+%D
+%D We can overlay boxes by saying:
+%D
+%D \startbuffer
+%D \startoverlay
+%D {\framed{hans}}
+%D {\framed[width=3cm]{ton}}
+%D {\framed[height=2cm]{oeps}}
+%D \stopoverlay
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D shows up as:
+%D
+%D \leavevmode\getbuffer
+
+\def\boxisempty#1%
+ {\ifdim\wd#1=\zeropoint
+ \ifdim\ht#1=\zeropoint
+ \ifdim\dp#1=\zeropoint
+ \zerocount
+ \else
+ \plusone
+ \fi
+ \else
+ \plusone
+ \fi
+ \else
+ \plusone
+ \fi}
+
+\def\syst_boxes_overlay_process
+ {\ifcase\boxisempty\nextbox\else
+ \syst_boxes_overlay_process_indeed
+ \fi}
+
+\def\syst_boxes_overlay_process_indeed
+ {%\removeunwantedspaces % already done
+ \scratchdepth\dp\ifdim\dp\nextbox>\dp\processbox\nextbox\else\processbox\fi
+ \ifdim\ht\nextbox>\ht\processbox
+ \setbox\processbox\vpack to \ht\nextbox {\dp\processbox\zeropoint\vss\box\processbox\vss}%
+ \else
+ \setbox\nextbox \vpack to \ht\processbox{\dp\nextbox \zeropoint\vss\box\nextbox \vss}%
+ \fi
+ \dp\nextbox \scratchdepth
+ \dp\processbox\scratchdepth
+ \scratchwidth\wd\ifdim\wd\nextbox>\wd\processbox\nextbox\else\processbox\fi
+ \setbox\processbox\hpack to \scratchwidth
+ {\hpack to \scratchwidth{\hss\box\processbox\hss}%
+ \kern-\scratchwidth
+ \hpack to \scratchwidth{\hss\box\nextbox \hss}}}
+
+\unexpanded\def\startoverlay
+ {\bgroup
+ \let\stopoverlay\egroup
+ \processboxes\syst_boxes_overlay_process}
+
+\let\stopoverlay\relax
+
+%D \macros
+%D {fakebox}
+%D
+%D The next macro is a rather silly one, but saves space.
+%D
+%D \starttyping
+%D \hbox{\fakebox0}
+%D \stoptyping
+%D
+%D returns an empty box with the dimensions of the box specified, here being zero.
+
+\unexpanded\def\fakebox
+ {\bgroup
+ \afterassignment\syst_boxes_fakebox_finish\scratchcounter}
+
+\def\syst_boxes_fakebox_finish
+ {\setbox\scratchbox\ifhbox\scratchcounter\emptyhbox\else\emptyvbox\fi
+ \wd\scratchbox\wd\scratchcounter
+ \ht\scratchbox\ht\scratchcounter
+ \dp\scratchbox\dp\scratchcounter
+ \box\scratchbox
+ \egroup}
+
+%D \macros
+%D {lbox,rbox,cbox,tbox,bbox}
+%D
+%D Here are some convenient alternative box types:
+%D
+%D \starttyping
+%D \lbox{text ...}
+%D \cbox{text ...}
+%D \rbox{text ...}
+%D \stoptyping
+%D
+%D Are similar to \type {\vbox}, which means that they also accept something like
+%D \type {to 3cm}, but align to the left, middle and right. These box types can be
+%D used to typeset paragraphs.
+
+\def\syst_boxes_lrc_process#1{\bgroup\forgetall\let\\\endgraf#1\let\next}
+
+\unexpanded\def\lbox#1#{\vbox#1\syst_boxes_lrc_process\raggedleft }
+\unexpanded\def\cbox#1#{\vbox#1\syst_boxes_lrc_process\raggedcenter}
+\unexpanded\def\rbox#1#{\vbox#1\syst_boxes_lrc_process\raggedright }
+
+\unexpanded\def\ltop#1#{\vtop#1\syst_boxes_lrc_process\raggedleft }
+\unexpanded\def\ctop#1#{\vtop#1\syst_boxes_lrc_process\raggedcenter}
+\unexpanded\def\rtop#1#{\vtop#1\syst_boxes_lrc_process\raggedright }
+
+%D The alternatives \type {\tbox} and \type {\bbox} can be used to properly align
+%D boxes, like in:
+%D
+%D \setupexternalfigures[directory={../sample}]
+%D \startbuffer
+%D \starttable[|||]
+%D \HL
+%D \VL \tbox{\externalfigure[cow][height=3cm,frame=on]} \VL top aligned \VL\SR
+%D \HL
+%D \VL \bbox{\externalfigure[cow][height=3cm,frame=on]} \VL bottom aligned \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D The positioning depends on the strut settings:
+%D
+%D \getbuffer
+
+\unexpanded\def\tbox{\hpack\bgroup\dowithnextboxcs\syst_boxes_tbox_finish\hbox}
+\unexpanded\def\bbox{\hpack\bgroup\dowithnextboxcs\syst_boxes_bbox_finish\hbox}
+
+\def\syst_boxes_tbox_finish
+ {\scratchheight\ht\strutbox
+ \scratchdepth\dimexpr\htdp\nextbox-\scratchheight\relax
+ \ht\nextbox\scratchheight
+ \dp\nextbox\scratchdepth
+ \boxyoffset\nextbox-\scratchdepth
+ \box\nextbox
+ \egroup}
+
+\def\syst_boxes_bbox_finish
+ {\scratchdepth\dp\strutbox
+ \scratchheight\dimexpr\htdp\nextbox-\scratchdepth\relax
+ \dp\nextbox\scratchdepth
+ \ht\nextbox\scratchheight
+ \boxyoffset\nextbox-\scratchdepth
+ \box\nextbox
+ \egroup}
+
+%D \macros
+%D {lhbox,mhbox,rhbox}
+%D
+%D A few more boxes.
+
+\def\dodolhbox{\hpack to \hsize{\box\nextbox\hss }}
+\def\dodomhbox{\hpack to \hsize{\hss\box\nextbox\hss}}
+\def\dodorhbox{\hpack to \hsize{\hss\box\nextbox }}
+
+\unexpanded\def\lhbox{\dowithnextboxcs\dodolhbox\hbox}
+\unexpanded\def\mhbox{\dowithnextboxcs\dodomhbox\hbox}
+\unexpanded\def\rhbox{\dowithnextboxcs\dodorhbox\hbox}
+
+\let\lefthbox \lhbox
+\let\midhbox \mhbox
+\let\righthbox\rhbox
+
+%D \macros
+%D {boxofsize}
+%D
+%D Sometimes we need to construct a box with a height or width made up of several
+%D dimensions. Instead of cumbersome additions, we can use:
+%D
+%D \starttyping
+%D \boxofsize \vbox 10cm 3cm -5cm {the text to be typeset}
+%D \stoptyping
+%D
+%D This example demonstrates that one can use positive and negative values.
+%D Dimension registers are also accepted.
+
+\newdimen\sizeofbox
+
+\unexpanded\def\boxofsize#1%
+ {\bgroup
+ \sizeofbox\zeropoint
+ \scratchdimen\zeropoint
+ \def\docommand
+ {\advance\sizeofbox\scratchdimen
+ \futurelet\next\dodocommand}%
+ \def\dodocommand
+ {\ifx\next\bgroup
+ \expanded{\egroup#1 to \the\sizeofbox}%
+ \else
+ \expandafter\afterassignment\expandafter\docommand\expandafter\scratchdimen
+ \fi}%
+ \docommand}
+
+%D Some new, still undocumented features:
+
+% limitatetext -> beter {text} als laatste !!
+%
+% \limitvbox
+% \limithbox
+
+\unexpanded\def\limitatelines#1#2% size sentinel
+ {\dowithnextbox
+ {\scratchdimen#1\hsize
+ \ifdim\wd\nextbox>\scratchdimen
+ \setbox\nextbox\hbox
+ {\advance\scratchdimen -.1\hsize
+ \limitatetext{\unhbox\nextbox}{\scratchdimen}{\nobreak#2}}%
+ \fi
+ \unhbox\nextbox}
+ \hbox}
+
+\unexpanded\def\fittoptobaselinegrid % weg hier
+ {\dowithnextbox
+ {\bgroup
+ \par
+ \scratchdimen\ht\nextbox
+ \ht\nextbox\strutht
+ \dp\nextbox\strutdp
+ \hpack{\box\nextbox}
+ \prevdepth\strutdp
+ \doloop
+ {\advance\scratchdimen -\lineheight
+ \ifdim\scratchdimen<\zeropoint
+ \exitloop
+ \else
+ \nobreak
+ \hpack{\strut}
+ \fi}
+ \egroup}
+ \vbox}
+
+%D Some more undocumented macros (used in m-chart).
+
+\newif\iftraceboxplacement % \traceboxplacementtrue
+
+\newbox\fakedboxcursor
+
+\setbox\fakedboxcursor\hpack
+ {\vrule\s!width\zeropoint\s!height\zeropoint\s!depth\zeropoint}
+
+\unexpanded\def\boxcursor % overloaded in core-vis
+ {\iftraceboxplacement
+ \bgroup
+ \scratchdimen2\onepoint
+ \setbox\scratchbox\hpack to \zeropoint
+ {\hss
+ \vrule
+ \s!width \scratchdimen
+ \s!height\scratchdimen
+ \s!depth \scratchdimen
+ \hss}%
+ \smashedbox\scratchbox
+ \egroup
+ \else
+ \copy\fakedboxcursor
+ \fi}
+
+\unexpanded\def\placedbox
+ {\iftraceboxplacement\ruledhbox\else\hbox\fi}
+
+\newdimen\boxoffset
+\newdimen\boxhdisplacement
+\newdimen\boxvdisplacement
+
+\unexpanded\def\rightbox {\hpack\bgroup\dowithnextboxcs\syst_boxes_rightbox_finish \placedbox}
+\unexpanded\def\leftbox {\hpack\bgroup\dowithnextboxcs\syst_boxes_leftbox_finish \placedbox}
+\unexpanded\def\topbox {\hpack\bgroup\dowithnextboxcs\syst_boxes_topbox_finish \placedbox}
+\unexpanded\def\bottombox {\hpack\bgroup\dowithnextboxcs\syst_boxes_bottombox_finish \placedbox}
+\unexpanded\def\lefttopbox {\hpack\bgroup\dowithnextboxcs\syst_boxes_lefttopbox_finish \placedbox}
+\unexpanded\def\righttopbox {\hpack\bgroup\dowithnextboxcs\syst_boxes_righttopbox_finish \placedbox}
+\unexpanded\def\leftbottombox {\hpack\bgroup\dowithnextboxcs\syst_boxes_leftbottombox_finish \placedbox}
+\unexpanded\def\rightbottombox{\hpack\bgroup\dowithnextboxcs\syst_boxes_rightbottombox_finish\placedbox}
+
+\let\topleftbox \lefttopbox
+\let\toprightbox \righttopbox
+\let\bottomleftbox \leftbottombox
+\let\bottomrightbox\rightbottombox
+
+\def\syst_boxes_rightbox_finish
+ {\global\boxhdisplacement\boxoffset
+ \global\boxvdisplacement.5\dimexpr\ht\nextbox-\dp\nextbox\relax
+ \boxcursor
+ \boxxmove\nextbox \boxhdisplacement
+ \boxymove\nextbox-\boxvdisplacement
+ \box\nextbox
+ \egroup}
+
+\def\syst_boxes_leftbox_finish
+ {\global\boxhdisplacement\dimexpr-\wd\nextbox-\boxoffset\relax
+ \global\boxvdisplacement.5\dimexpr\ht\nextbox-\dp\nextbox\relax
+ \boxcursor
+ \boxxmove\nextbox \boxhdisplacement
+ \boxymove\nextbox-\boxvdisplacement
+ \box\nextbox
+ \egroup}
+
+\def\syst_boxes_topbox_finish
+ {\global\boxhdisplacement-.5\wd\nextbox
+ \global\boxvdisplacement\dimexpr-\dp\nextbox-\boxoffset\relax
+ \boxcursor
+ \boxxmove\nextbox \boxhdisplacement
+ \boxymove\nextbox-\boxvdisplacement
+ \box\nextbox
+ \egroup}
+
+\def\syst_boxes_bottombox_finish
+ {\global\boxhdisplacement-.5\wd\nextbox
+ \global\boxvdisplacement\dimexpr\ht\nextbox+\boxoffset\relax
+ \boxcursor
+ \boxxmove\nextbox \boxhdisplacement
+ \boxymove\nextbox-\boxvdisplacement
+ \box\nextbox
+ \egroup}
+
+\def\syst_boxes_lefttopbox_finish
+ {\global\boxhdisplacement\dimexpr-\wd\nextbox-\boxoffset\relax
+ \global\boxvdisplacement\dimexpr-\dp\nextbox-\boxoffset\relax
+ \boxcursor
+ \boxxmove\nextbox \boxhdisplacement
+ \boxymove\nextbox-\boxvdisplacement
+ \box\nextbox
+ \egroup}
+
+\def\syst_boxes_righttopbox_finish
+ {\global\boxhdisplacement\boxoffset
+ \global\boxvdisplacement\dimexpr-\dp\nextbox-\boxoffset\relax
+ \boxcursor
+ \boxxmove\nextbox \boxhdisplacement
+ \boxymove\nextbox-\boxvdisplacement
+ \box\nextbox
+ \egroup}
+
+\def\syst_boxes_leftbottombox_finish
+ {\global\boxhdisplacement\dimexpr-\wd\nextbox-\boxoffset\relax
+ \global\boxvdisplacement\dimexpr\ht\nextbox+\boxoffset\relax
+ \boxcursor
+ \boxxmove\nextbox \boxhdisplacement
+ \boxymove\nextbox-\boxvdisplacement
+ \box\nextbox
+ \egroup}
+
+\def\syst_boxes_rightbottombox_finish
+ {\global\boxhdisplacement\boxoffset
+ \global\boxvdisplacement\dimexpr\ht\nextbox+\boxoffset\relax
+ \boxcursor
+ \boxxmove\nextbox \boxhdisplacement
+ \boxymove\nextbox-\boxvdisplacement
+ \box\nextbox
+ \egroup}
+
+\unexpanded\def\middlebox {\hpack\bgroup\dowithnextboxcs\syst_boxes_middlebox_finish \placedbox}
+\unexpanded\def\baselinemiddlebox{\hpack\bgroup\dowithnextboxcs\syst_boxes_baselinemiddlebox_finish\placedbox}
+\unexpanded\def\baselineleftbox {\hpack\bgroup\dowithnextboxcs\syst_boxes_baselineleftbox_finish \placedbox}
+\unexpanded\def\baselinerightbox {\hpack\bgroup\dowithnextboxcs\syst_boxes_baselinerightbox_finish \placedbox}
+
+\def\syst_boxes_middlebox_finish
+ {\global\boxhdisplacement-.5\wd\nextbox
+ \global\boxvdisplacement.5\dimexpr\ht\nextbox-\dp\nextbox\relax
+ \boxcursor
+ \boxxmove\nextbox \boxhdisplacement
+ \boxymove\nextbox-\boxvdisplacement
+ \box\nextbox
+ \egroup}
+
+\def\syst_boxes_baselinemiddlebox_finish
+ {\global\boxhdisplacement\dimexpr-.5\wd\nextbox-\boxoffset\relax
+ \global\boxvdisplacement-\boxoffset
+ \boxcursor
+ \boxxmove\nextbox \boxhdisplacement
+ \boxymove\nextbox-\boxvdisplacement
+ \box\nextbox
+ \egroup}
+
+\def\syst_boxes_baselineleftbox_finish
+ {\global\boxhdisplacement\dimexpr-\wd\nextbox-\boxoffset\relax
+ \global\boxvdisplacement-\boxoffset
+ \boxcursor
+ \boxxmove\nextbox \boxhdisplacement
+ \boxymove\nextbox-\boxvdisplacement
+ \box\nextbox
+ \egroup}
+
+\def\syst_boxes_baselinerightbox_finish
+ {\global\boxhdisplacement\boxoffset
+ \global\boxvdisplacement-\boxoffset
+ \boxcursor
+ \boxxmove\nextbox \boxhdisplacement
+ \boxymove\nextbox-\boxvdisplacement
+ \box\nextbox
+ \egroup}
+
+%D \macros
+%D {obox}
+%D
+%D Experimental, not yet frozen:
+
+\unexpanded\def\lrtbbox#1#2#3#4% l r t b
+ {\bgroup
+ \dowithnextboxcontent
+ {\advance\hsize-#1\advance\hsize-#2\relax
+ \advance\vsize-#3\advance\vsize-#4\relax}
+ {\forgetall\vpack to \vsize{\vskip#3\hpack to \hsize{\hskip#1\box\nextbox\hss}\vss}\egroup}
+ \vbox}
+
+%D \macros
+%D {toplinebox}
+%D
+%D See core-tbl.tex for an example of its usage:
+
+\unexpanded\def\toplinebox
+ {\dowithnextboxcs\syst_boxes_toplinebox_finish\tbox}
+
+\def\syst_boxes_toplinebox_finish
+ {\ifdim\dp\nextbox>\strutdepth
+ \scratchdimen\dp\nextbox
+ \advance\scratchdimen-\strutdepth
+ \getnoflines\scratchdimen
+ \struttedbox{\box\nextbox}%
+ \dorecurse\noflines\verticalstrut
+ \else
+ \box\nextbox
+ \fi}
+
+%D \macros
+%D {initializeboxstack,savebox,foundbox}
+%D
+%D At the cost of some memory, but saving box registers, we have implemented a box
+%D repository.
+%D
+%D \starttyping
+%D \initializeboxstack{one}
+%D
+%D \savebox{one}{a}{test a}
+%D \savebox{one}{p}{test p}
+%D \savebox{one}{q}{test q}
+%D
+%D \hbox{a:\foundbox{one}{a}} \par
+%D \hbox{q:\foundbox{one}{q}} \par
+%D \hbox{p:\foundbox{one}{p}} \par
+%D \hbox{x:\foundbox{one}{x}} \par
+%D \hbox{y:\foundbox{two}{a}} \par
+%D \stoptyping
+
+%D Kind of obsolete:
+
+\installcorenamespace {stackbox}
+\installcorenamespace {stacklst}
+
+\unexpanded\def\setstackbox#1#2%
+ {\ifcsname\??stackbox#1:#2\endcsname\else
+ \expandafter\newbox\csname\??stackbox#1:#2\endcsname
+ \fi
+ \global\setbox\csname\??stackbox#1:#2\endcsname\vbox}
+
+\unexpanded\def\initializeboxstack#1%
+ {\def\docommand##1{\setstackbox{#1}{##1}{}}%
+ \ifcsname\??stacklst#1\endcsname
+ \expandafter\processcommacommand\expandafter[\lastnamedcs]\docommand
+ \fi
+ \letgvalueempty{\??stacklst#1}}
+
+\unexpanded\def\savebox#1#2% stack name
+ {% beware, \setxvalue defines the cs beforehand so we cannot use the
+ % test inside the { }
+ \ifcsname\??stacklst#1\endcsname
+ %\setxvalue{\??stacklst#1}{\csname\??stacklst#1\endcsname,#2}%
+ \expandafter\xdef\csname\??stacklst#1\expandafter\endcsname\expandafter{\lastnamedcs,#2}%
+ \else
+ \expandafter\xdef\csname\??stacklst#1\endcsname{#2}%
+ \fi
+ \setstackbox{#1}{#2}}
+
+\unexpanded\def\flushbox#1#2% unwrapped
+ {\ifcsname\??stackbox#1:#2\endcsname
+ \box\lastnamedcs
+ \else
+ \emptybox
+ \fi}
+
+\unexpanded\def\restorebox#1#2% unwrapped
+ {\ifcsname\??stackbox#1:#2\endcsname
+ \copy\lastnamedcs
+ \else
+ \emptybox
+ \fi}
+
+\unexpanded\def\foundbox#1#2% wrapped
+ {\vpack
+ {\ifcsname\??stackbox#1:#2\endcsname
+ \copy\lastnamedcs
+ \fi}}
+
+\unexpanded\def\doifelsebox#1#2%
+ {\ifcsname\??stackbox#1:#2\endcsname
+ \ifvoid\lastnamedcs
+ \doubleexpandafter\secondoftwoarguments
+ \else
+ \doubleexpandafter\firstoftwoarguments
+ \fi
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifboxelse\doifelsebox
+
+%D This one is cheaper (the above is no longer used that much):
+
+\installcorenamespace {boxstack}
+
+\newcount\c_syst_boxes_stack
+\let \b_syst_boxes_stack\relax
+
+\unexpanded\def\syst_boxes_stack_allocate
+ {\newbox\b_syst_boxes_stack
+ \expandafter\let\csname\??boxstack\number\c_syst_boxes_stack\endcsname\b_syst_boxes_stack}
+
+\unexpanded\def\syst_boxes_push#1#2%
+ {\global\advance\c_syst_boxes_stack\plusone
+ \expandafter\let\expandafter\b_syst_boxes_stack\csname\??boxstack\number\c_syst_boxes_stack\endcsname
+ \ifx\b_syst_boxes_stack\relax % cheaper then csname check as in most cases it's defined
+ \syst_boxes_stack_allocate
+ \fi
+ #1\setbox\b_syst_boxes_stack\box#2\relax}
+
+\unexpanded\def\syst_boxes_pop#1#2%
+ {#1\setbox#2\box\csname\??boxstack\number\c_syst_boxes_stack\endcsname
+ \global\advance\c_syst_boxes_stack\minusone}
+
+\unexpanded\def\localpushbox {\syst_boxes_push\relax}
+\unexpanded\def\localpopbox {\syst_boxes_pop \relax}
+
+\unexpanded\def\globalpushbox{\syst_boxes_push\global}
+\unexpanded\def\globalpopbox {\syst_boxes_pop \global}
+
+%D And here is a more modern one (not yet in i-*):
+%D
+%D \starttyping
+%D \dorecurse {100} {
+%D \setbox\zerocount\hbox{test \recurselevel}
+%D \putboxincache{foo}{\recurselevel}\zerocount
+%D \copyboxfromcache{foo}{\recurselevel}\zerocount
+%D \iftrue
+%D \setbox\zerocount\hbox{\directboxfromcache{foo}{\recurselevel}}%
+%D \else
+%D \getboxfromcache{foo}{\recurselevel}\zerocount
+%D \fi
+%D }
+%D \resetboxesincache{foo}
+%D \stoptyping
+
+\unexpanded\def\putboxincache #1#2#3{\clf_putboxincache {#1}{#2}#3\relax}
+\unexpanded\def\getboxfromcache #1#2#3{\clf_getboxfromcache {#1}{#2}#3\relax}
+\unexpanded\def\doifelseboxincache #1#2{\clf_doifelseboxincache {#1}{#2}}
+\unexpanded\def\copyboxfromcache #1#2#3{\clf_copyboxfromcache {#1}{#2}#3\relax}
+\unexpanded\def\directboxfromcache #1#2{\clf_directboxfromcache {#1}{#2}}
+\unexpanded\def\directcopyboxfromcache#1#2{\clf_directcopyboxfromcache{#1}{#2}}
+\unexpanded\def\resetboxesincache #1{\clf_resetboxesincache {#1}}
+
+\unexpanded\def\putnextboxincache#1#2%
+ {\dowithnextbox{\putboxincache{#1}{#2}\nextbox}}
+
+%D \macros
+%D {removedepth, obeydepth}
+%D
+%D While \type {\removedepth} removes the preceding depth, \type {\obeydepth} makes
+%D sure we have depth. Both macros leave the \type {\prevdepth} untouched.
+
+\unexpanded\def\removedepth
+ {\ifvmode
+ \ifdim\prevdepth>\zeropoint
+ \kern-\prevdepth
+ \fi
+ \fi}
+
+\unexpanded\def\obeydepth
+ {\par % watch out for changes in math formulas
+ \ifvmode\ifdim\prevdepth<\zeropoint\orelse\ifdim\prevdepth<\strutdp
+ \kern\dimexpr\strutdp-\prevdepth\relax
+ \prevdepth\strutdp
+ \fi\fi}
+
+\unexpanded\def\undepthed
+ {\dowithnextbox{\dp\nextbox\zeropoint\box\nextbox}\hbox}
+
+%D \macros
+%D {removebottomthings, removelastskip}
+%D
+%D A funny (but rather stupid) one, plus a redefinition.
+
+\unexpanded\def\removebottomthings
+ {\dorecurse\plusfive{\unskip\unkern\unpenalty}}
+
+\unexpanded\def\removelastskip % \ifvmode the plain tex one \fi
+ {\ifvmode\ifzeropt\lastskip\else\vskip-\lastskip\fi\fi}
+
+%D \macros
+%D {makestrutofbox}
+%D
+%D This macro sets the dimensions of a box to those of a strut. Sort of obsolete so
+%D it will go away.
+
+\unexpanded\def\makestrutofbox % not used
+ {\afterassignment\syst_boxes_makestrutofbox\c_boxes_register}
+
+\def\syst_boxes_makestrutofbox
+ {\ht\c_boxes_register\strutht
+ \dp\c_boxes_register\strutdp
+ \wd\c_boxes_register\zeropoint}
+
+%D \macros
+%D {raisebox,lowerbox}
+%D
+%D Some more box stuff, related to positioning (under construction). Nice stuff for
+%D a tips and tricks maps article.
+%D
+%D \starttyping
+%D \raisebox{100pt}\hbox{test}
+%D \hsmash{\raisebox{100pt}\hbox{test}}
+%D \stoptyping
+
+\unexpanded\def\raisebox#1{\bgroup\afterassignment\syst_boxes_raise_indeed\scratchdimen#1} % so both 10pt and {10pt} is accepted
+\unexpanded\def\lowerbox#1{\bgroup\afterassignment\syst_boxes_lower_indeed\scratchdimen#1} % so both 10pt and {10pt} is accepted
+
+\def\syst_boxes_raise_indeed{\dowithnextboxcs\syst_boxes_raise_finish}
+\def\syst_boxes_lower_indeed{\dowithnextboxcs\syst_boxes_lower_finish}
+
+\def\syst_boxes_raise_finish
+ {\boxyoffset\nextbox\scratchdimen
+ \ht\nextbox\strutht
+ \dp\nextbox\strutdp
+ \box\nextbox
+ \egroup}
+
+\def\syst_boxes_lower_finish
+ {\boxyoffset\nextbox-\scratchdimen
+ \ht\nextbox\strutht
+ \dp\nextbox\strutdp
+ \box\nextbox
+ \egroup}
+
+% vcenter in text, we kunnen vcenter overloaden
+
+\unexpanded\def\halfwaybox
+ {\hpack\bgroup
+ \dowithnextboxcs\syst_boxes_halfwaybox_finish\hbox}
+
+\def\syst_boxes_halfwaybox_finish
+ {\dp\nextbox\zeropoint
+ \lower.5\ht\nextbox\box\nextbox
+ \egroup}
+
+\unexpanded\def\depthonlybox
+ {\tpack\bgroup
+ \dowithnextboxcs\syst_boxes_depthonlybox_finish\vbox}
+
+\def\syst_boxes_depthonlybox_finish
+ {\hsize\wd\nextbox
+ \kern\zeropoint\box\nextbox
+ \egroup}
+
+%D New:
+
+\def\setdimentoatleast#1#2{\ifdim#1>\zeropoint\else#1=#2\fi}
+\def\setdimentoatmost #1#2{\ifdim#1>#2\relax \else#1=#2\fi}
+
+%D And even rawer:
+
+\let\naturalvcenter\normalvtop % will go away
+
+%D \macros
+%D {vcenter}
+%D
+%D Also new: tex mode \type {\vcenter}.
+
+\unexpanded\def\vcenter
+ {\vbox\bgroup
+ \dowithnextboxcs\syst_boxes_vcenter_finish\vbox}
+
+\def\syst_boxes_vcenter_finish
+ {\hpack{\normalstartimath\vcenter{\box\nextbox}\normalstopimath}%
+ \egroup}
+
+% could be \everymathematics
+
+\prependtoks \let\vcenter\normalvcenter \to \everymath
+\prependtoks \let\vcenter\normalvcenter \to \everydisplay
+
+% \appendtoks \let\vcenter\normalvcenter \to \everymathematics
+
+%D \macros
+%D {frozenhbox}
+%D
+%D A not so well unhboxable box can be made with:
+
+\unexpanded\def\frozenhbox
+ {\hpack\bgroup
+ \dowithnextboxcs\syst_boxes_frozenhbox_finish\hbox}
+
+\def\syst_boxes_frozenhbox_finish
+ {\hpack{\hpack{\box\nextbox}}%
+ \egroup}
+
+%D \macros
+%D {setboxllx,setboxlly,gsetboxllx,gsetboxlly,getboxllx,getboxlly}
+%D
+%D A prelude to an extended \TEX\ feature:
+
+\installcorenamespace {box_x}
+\installcorenamespace {box_y}
+
+\unexpanded\def\setboxllx #1#2{\expandafter\edef\csname\??box_x\number#1\endcsname{\the\dimexpr#2\relax}}
+\unexpanded\def\setboxlly #1#2{\expandafter\edef\csname\??box_y\number#1\endcsname{\the\dimexpr#2\relax}}
+
+\unexpanded\def\gsetboxllx#1#2{\expandafter\xdef\csname\??box_x\number#1\endcsname{\the\dimexpr#2\relax}}
+\unexpanded\def\gsetboxlly#1#2{\expandafter\xdef\csname\??box_y\number#1\endcsname{\the\dimexpr#2\relax}}
+
+%def\getboxllx#1{\ifcsname\??box_x\number#1\endcsname\csname\??box_x\number#1\endcsname\else\zeropoint\fi}
+%def\getboxlly#1{\ifcsname\??box_y\number#1\endcsname\csname\??box_y\number#1\endcsname\else\zeropoint\fi}
+\def\getboxllx#1{\ifcsname\??box_x\number#1\endcsname\lastnamedcs\else\zeropoint\fi}
+\def\getboxlly#1{\ifcsname\??box_y\number#1\endcsname\lastnamedcs\else\zeropoint\fi}
+
+\def\directgetboxllx#1{\csname\??box_x\number#1\endcsname} % use when sure existence
+\def\directgetboxlly#1{\csname\??box_y\number#1\endcsname} % use when sure existence
+
+%D \macros
+%D {shownextbox}
+%D
+%D Handy for tracing
+%D
+%D \starttyping
+%D \shownextbox\vbox{test}
+%D \shownextbox\vbox{test\endgraf}
+%D \shownextbox\vbox{test\endgraf\strut\endgraf}
+%D \shownextbox\vbox{test\endgraf\thinrule}
+%D \shownextbox\vbox{\setupwhitespace[big]test\endgraf\thinrule}
+%D \stoptyping
+
+\unexpanded\def\shownextbox % seldom used
+ {\dowithnextbox
+ {\bgroup
+ \showboxbreadth\maxdimen
+ \showboxdepth \maxdimen
+ \scratchcounter\interactionmode
+ \batchmode
+ \showbox\nextbox
+ \box\nextbox
+ \interactionmode\scratchcounter
+ \egroup}}
+
+\unexpanded\def\spreadhbox#1% rebuilds \hbox{<box><hss><box><hss><box>}
+ {\bgroup
+ \ifhbox#1\relax
+ \setbox\scratchboxtwo\emptybox
+ \unhbox#1%
+ \doloop
+ {\unpenalty\unskip\unpenalty\unskip\unpenalty\unskip
+ \setbox\scratchboxone\lastbox
+ \ifvoid\scratchboxone
+ \exitloop
+ \else
+ \setbox\scratchboxtwo\hbox
+ {\ifhbox\scratchboxone \spreadhbox\scratchboxone\else\box\scratchboxone\fi
+ \ifvoid\scratchboxtwo \else\hss\unhbox\scratchboxtwo\fi}%
+ \fi}%
+ \ifvoid\scratchboxtwo\else\unhbox\scratchboxtwo\fi
+ \else
+ \box#1%
+ \fi
+ \egroup}
+
+% makes sense but too much log for overfull boxes:
+%
+% \showboxbreadth\maxdimen
+% \showboxdepth \maxdimen
+
+%D Moved from cont-new:
+%D
+%D \starttyping
+%D \minimalhbox 100pt {test}
+%D \stoptyping
+
+\unexpanded\def\minimalhbox#1#%
+ {\dowithnextbox
+ {\bgroup
+ \setbox\scratchbox\hpack#1{\hss}%
+ \ifdim\wd\nextbox<\wd\scratchbox\wd\nextbox\wd\scratchbox\fi
+ \box\nextbox
+ \egroup}
+ \hbox}
+
+%D A bit dirty:
+
+\unexpanded\def\nodestostring#1#2% more tolerant for #2=\cs
+ {\begingroup
+ \setbox\nextbox\hbox{#2}%
+ \normalexpanded{\endgroup\edef\noexpand#1{\clf_boxtostring\nextbox}}}
+
+%D Even more dirty:
+
+\let\hyphenatedhbox\hbox
+
+%D We can do this:
+%D
+%D \starttyping
+%D \setbox0\hbox to 10cm{foo} \setbox2\hbox{\unhbox0} \the\wd2
+%D \stoptyping
+%D
+%D But this saves a copy (and hpack pass):
+%D
+%D \starttyping
+%D \setbox0\hbox to 10cm{foo} \the\naturalwd0
+%D \stoptyping
+
+\newdimen\lastnaturalboxwd
+\newdimen\lastnaturalboxht
+\newdimen\lastnaturalboxdp
+
+\let\getnaturaldimensions\clf_getnaturaldimensions % sets three dimensions
+\let\naturalwd \clf_naturalwd % calculates and returns wd
+
+\let\getnaturalwd\clf_getnaturalwd % no intermediate
+\let\setnaturalwd\clf_setnaturalwd % no intermediate
+
+\unexpanded\def\doifelserighttoleftinbox{\clf_doifelserighttoleftinbox}
+
+\let\doifrighttoleftinboxelse\doifelserighttoleftinbox
+
+%D New, used in high/low:
+
+\definesystemattribute [runningtext] [public]
+
+%unexpanded\def\runninghbox{\hbox attr \runningtextattribute \plusone} % not yet in i-*
+\unexpanded\def\runninghbox{\hbox attr \runningtextattribute \fontid\font} % not yet in i-*
+
+%D To complement lua (yet undocumented):
+
+\unexpanded\def\beginhbox{\hbox\bgroup} \let\endhbox\egroup
+\unexpanded\def\beginvbox{\vbox\bgroup} \let\endvbox\egroup
+\unexpanded\def\beginvtop{\vtop\bgroup} \let\endvtop\egroup
+
+\unexpanded\def\sethboxregister#1{\setbox#1\hbox}
+\unexpanded\def\setvboxregister#1{\setbox#1\vbox}
+\unexpanded\def\setvtopregister#1{\setbox#1\vtop}
+
+\unexpanded\def\flushboxregister#1{\box\numexpr#1\relax}
+
+\unexpanded\def\starthboxregister#1{\setbox#1\hbox\bgroup} \let\stophboxregister\egroup
+\unexpanded\def\startvboxregister#1{\setbox#1\vbox\bgroup} \let\stopvboxregister\egroup
+\unexpanded\def\startvtopregister#1{\setbox#1\vtop\bgroup} \let\stopvtopregister\egroup
+
+%D For whatever third party package needs it:
+%D
+%D \starttyping
+%D \newlocalbox\BoxOne
+%D \newlocalbox\BoxTwo
+%D
+%D \setbox\BoxOne\hbox{Box One}
+%D \setbox\BoxTwo\hbox{Box Two}
+%D
+%D [\box\BoxTwo] [\box\BoxOne]
+%D \stoptyping
+
+\installcorenamespace{localbox}
+
+\unexpanded\def\newlocalbox#1%
+ {\expandafter\let\expandafter#1\csname\??localbox\string#1\endcsname
+ \ifx#1\relax
+ \syst_aux_new_localbox#1%
+ \fi}
+
+\def\syst_aux_new_localbox#1%
+ {\expandafter\newbox\csname\??localbox\string#1\endcsname
+ \newlocalbox#1}
+
+%D Who knows when this comes in handy:
+
+\unexpanded\def\lastlinewidth{\dimexpr\clf_lastlinewidth\scaledpoint\relax}
+
+%D Keep as reference:
+
+% \unexpanded\def\tightvbox{\dowithnextbox{\dp\nextbox\zeropoint\box\nextbox}\vbox}
+% \unexpanded\def\tightvtop{\dowithnextbox{\ht\nextbox\zeropoint\box\nextbox}\vtop}
+
+%D This one keeps dimensions and sets the shift field (and so it's more for testing
+%D than for real usage):
+
+\unexpanded\def\shiftbox {\clf_shiftbox}
+\unexpanded\def\vpackbox {\clf_vpackbox}
+\unexpanded\def\hpackbox {\clf_hpackbox}
+\unexpanded\def\vpackedbox{\clf_vpackedbox}
+\unexpanded\def\hpackedbox{\clf_hpackedbox}
+
+%D This one has been moved from a 2 decade old file. It makes something boxed
+%D sit on the baseline.
+
+\unexpanded\def\linebox
+ {\hpack\bgroup\dowithnextbox
+ {\scratchdimen\dimexpr\dimexpr\htdp\nextbox-\lineheight\relax/2+\dp\strutbox\relax
+ \setbox\nextbox\hpack{\lower\scratchdimen\box\nextbox}%
+ \ht\nextbox\ht\strutbox
+ \dp\nextbox\dp\strutbox
+ \box\nextbox
+ \egroup}
+ \hbox}
+
+\protect \endinput
+
+% a bit of test code:
+
+% \hbox \bgroup
+% \ruledvbox {\hbox{\strut gans}}
+% \ruledvbox to \lineheight {\hbox{\strut gans}}
+% \ruledvbox to \lineheight {\hbox {gans}}
+% \ruledvbox to \strutheight{\hbox {gans}}
+% \ruledvbox to \strutheight{\hbox{\strut gans}}
+% \ruledvbox to \strutheight{\vss\hbox{gans}}
+% \egroup
+
+% to be considered
+
+% \startluacode
+%
+% local spacer = lpeg.patterns.spacer
+%
+% function commands.withwords(command,str)
+% if str then
+% command = command or "ruledhbox"
+% local done = false
+% local function apply(s)
+% if done then
+% context.space()
+% done = true
+% else
+% context.dontleavehmode()
+% end
+% context[command](s)
+% end
+% lpeg.match(lpeg.splitter(spacer,apply),str)
+% end
+%
+% end
+%
+% \stopluacode
+%
+% \unprotect
+%
+% \unexpanded\def\withwordsinstring#1#2% command str
+% {\ctxcommand{withwords(\!!bs#1\!!es,\!!bs#2\!!es)}}
+%
+% \unexpanded\def\withwordsinfile#1#2% command name
+% {\ctxcommand{withwords(\!!bs#1\!!es,io.loaddata(resolvers.findfile("#2")))}}
+%
+% \protect
+%
+% \starttext
+%
+% \defineframed[colored][foregroundcolor=red,foregroundstyle=\bfc\underbar,location=low]
+%
+% \withwordsinstring{colored}{bla bla}
+% \withwordsinfile{colored}{ward.tex}
+%
+% \stoptext
diff --git a/Master/texmf-dist/tex/context/base/mkiv/supp-mat.mkiv b/Master/texmf-dist/tex/context/base/mkiv/supp-mat.mkiv
index f72a0ff89dc..f3b94f73522 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/supp-mat.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/supp-mat.mkiv
@@ -160,8 +160,8 @@
\unexpanded\def\dimension#1%
{\pushmacro\dodimensionsignal
\gdef\dodimensionsignal{\kern\dimensionsignal}%
- \ifdim\lastskip=\zeropoint\relax
- \ifdim\lastkern=\zeropoint\relax
+ \ifzeropt\lastskip
+ \ifzeropt\lastkern
\ifmmode
\mathematics{\dimensionhalfspace\dimensionhalfspace\dimensiontypeface#1}%
\else
diff --git a/Master/texmf-dist/tex/context/base/mkiv/supp-ran.lua b/Master/texmf-dist/tex/context/base/mkiv/supp-ran.lua
index 1ad9293ee44..1a2d10bea72 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/supp-ran.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/supp-ran.lua
@@ -10,8 +10,8 @@ if not modules then modules = { } end modules ['supp-ran'] = {
local report_system = logs.reporter("system","randomizer")
-local trace_random = false trackers.register("system.randomizer", function(v) trace_random = v end)
-local trace_detail = false trackers.register("system.randomizer.detail",function(v) trace_detail = v end)
+local trace_random = false trackers.register("system.randomizer", function(v) trace_random = v end)
+local trace_details = false trackers.register("system.randomizer.details", function(v) trace_details = v end)
local insert, remove = table.insert, table.remove
@@ -28,7 +28,7 @@ local maxcount = 0x3FFFFFFF -- 2^30-1
math.random = function(...)
local n = random(...)
- if trace_detail then
+ if trace_details then
report_system("math %s",n)
end
return n
@@ -43,7 +43,7 @@ local function setrandomseedi(n)
n = round(n)
randomseed(n)
last = random(0,maxcount) -- we need an initial value
- if trace_detail then
+ if trace_details then
report_system("seed %s from %s",last,n)
elseif trace_random then
report_system("setting seed %s",n)
@@ -54,7 +54,7 @@ math.setrandomseedi = setrandomseedi
local function getrandomnumber(min,max)
last = random(min,max)
- if trace_detail then
+ if trace_details then
report_system("number %s",last)
end
return last
@@ -71,7 +71,7 @@ end
-- local function getmprandomnumber()
-- last = random(0,4095)
--- if trace_detail then
+-- if trace_details then
-- report_system("mp number %s",last)
-- end
-- return last
@@ -81,7 +81,7 @@ end
local function pushrandomseed()
insert(stack,last)
- if trace_random or trace_detail then
+ if trace_random or trace_details then
report_system("pushing seed %s",last)
end
end
@@ -89,7 +89,7 @@ end
local function reuserandomseed(n)
local seed = stack[#stack]
if seed then
- if trace_random or trace_detail then
+ if trace_random or trace_details then
report_system("reusing seed %s",last)
end
randomseed(seed)
@@ -99,7 +99,7 @@ end
local function poprandomseed()
local seed = remove(stack)
if seed then
- if trace_random or trace_detail then
+ if trace_random or trace_details then
report_system("popping seed %s",seed)
end
randomseed(seed)
@@ -109,13 +109,13 @@ end
local function getrandom(where,...)
if type(where) == "string" then
local n = random(...)
- if trace_detail then
+ if trace_details then
report_system("%s %s",where,n)
end
return n
else
local n = random(where,...)
- if trace_detail then
+ if trace_details then
report_system("utilities %s",n)
end
return n
diff --git a/Master/texmf-dist/tex/context/base/mkiv/symb-emj.lua b/Master/texmf-dist/tex/context/base/mkiv/symb-emj.lua
index d6e2aebea6f..4d16bbb7311 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/symb-emj.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/symb-emj.lua
@@ -24,6 +24,7 @@ local tonode = nuts.tonode
local tonut = nuts.tonut
local remove_node = nuts.remove
local isglyph = nuts.isglyph
+local getnext = nuts.getnext
local function removemodifiers(head)
local head = tonut(head)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/symb-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/symb-ini.lua
index 6a4a1882529..588e5d2ab5c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/symb-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/symb-ini.lua
@@ -21,6 +21,7 @@ local report_symbols = logs.reporter ("fonts","symbols")
local status_symbols = logs.messenger("fonts","symbols")
local patterns = {
+ CONTEXTLMTXMODE > 0 and "symb-imp-%s.mkxl" or "",
"symb-imp-%s.mkiv",
"symb-imp-%s.tex",
-- obsolete:
@@ -29,12 +30,8 @@ local patterns = {
}
local function action(name,foundname)
- -- context.startnointerference()
- context.startreadingfile()
- context.input(foundname)
+ commands.loadlibrary(name,foundname,false)
status_symbols("library %a loaded",name)
- context.stopreadingfile()
- -- context.stopnointerference()
end
local function failure(name)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/syst-aux.lua b/Master/texmf-dist/tex/context/base/mkiv/syst-aux.lua
index 9b0ca82c430..46bb8e3f748 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/syst-aux.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/syst-aux.lua
@@ -390,6 +390,13 @@ implement {
}
implement {
+ name = "benchmarktimer",
+ actions = function()
+ statistics.benchmarktimer("whatever")
+ end
+}
+
+implement {
name = "elapsedtime",
actions = function()
statistics.stoptiming("whatever")
@@ -423,6 +430,9 @@ context.secondoftwoarguments = ctx_secondoftwoarguments
context.firstofoneargument = ctx_firstofoneargument
context.gobbleoneargument = ctx_gobbleoneargument
+local ctx_iftrue = context.iftrue
+local ctx_iffalse = context.iffalse
+
local hash = utilities.parsers.hashes.settings_to_set
local function doifelsecommon(a,b)
@@ -554,6 +564,45 @@ local function doifnotcommon(a,b)
ctx_firstofoneargument()
end
+-- local function hascommonargumentcondition(a,b)
+-- if a == b then
+-- setmacro("commalistelement",a)
+-- if a == "" then
+-- ctx_iffalse()
+-- else
+-- ctx_iftrue()
+-- end
+-- return
+-- end
+-- local ba = find(a,",",1,true)
+-- local bb = find(b,",",1,true)
+-- if ba and bb then
+-- local ha = hash[a]
+-- local hb = hash[b]
+-- for k in next, ha do
+-- if hb[k] then
+-- setmacro("commalistelement",k)
+-- ctx_iftrue()
+-- return
+-- end
+-- end
+-- elseif ba then
+-- if hash[a][b] then
+-- setmacro("commalistelement",b)
+-- ctx_iftrue()
+-- return
+-- end
+-- elseif bb then
+-- if hash[b][a] then
+-- setmacro("commalistelement",a)
+-- ctx_iftrue()
+-- return
+-- end
+-- end
+-- setmacro("commalistelement","")
+-- ctx_iffalse()
+-- end
+
local function doifelseinset(a,b)
if a == b then
setmacro("commalistelement",a)
@@ -641,10 +690,18 @@ implement {
arguments = "2 strings",
}
+-- implement {
+-- name = "hascommonargumentcondition",
+-- actions = hascommonargumentcondition,
+-- arguments = "2 strings",
+-- arguments = { "argument", "argument" },
+-- }
+
implement {
name = "doifelseinset",
actions = doifelseinset,
arguments = "2 strings",
+-- arguments = { "argument", "argument" },
}
implement {
diff --git a/Master/texmf-dist/tex/context/base/mkiv/syst-aux.mkiv b/Master/texmf-dist/tex/context/base/mkiv/syst-aux.mkiv
index 3004c08b805..255f0746c39 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/syst-aux.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/syst-aux.mkiv
@@ -11,11 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D There are some references to \LUA\ variants here but these concern (often old)
-%D experiments, moved from local test modules to here, cleaned up, but not really
-%D used. After all it's not that urgent and replacing helpers is a delicate process.
-%D Don't depend on it.
-
\registerctxluafile{syst-aux}{}
% A dedicated primitive \ifvoidmacro\cs == \ifx\cs\empty is some 10% faster but
@@ -60,19 +55,21 @@
\let\unexpanded\normalprotected
-% %D \macros
-% %D {expunded}
-% %D
-% %D \unexpanded\edef\TestA{zzz}
-% %D \edef\TestB{zzz}
-% %D
-% %D \doifelse {\TestA} {\TestB} {WRONG} {OKAY} \par
-% %D \doifelse {\TestA} {\expunded\TestB} {WRONG} {OKAY} \par
-% %D \doifelse {\expunded\TestA} {\TestB} {OKAY} {WRONG} \par
-% %D \doifelse {\expunded\TestA} {\expunded\TestB} {OKAY} {WRONG} \par
+\ifcase\contextlmtxmode
-% %def\expunded#1{\normalexpanded\expandafter{#1}}
-% \def\expunded#1{\expandafter\empty#1} % used within an edef anyway
+ \def\startlmtxmode#1\stoplmtxmode{}
+ \let\stoplmtxmode \relax
+ \let\startmkivmode\relax
+ \let\stopmkivmode \relax
+
+\else
+
+ \let\startlmtxmode\relax
+ \let\stoplmtxmode \relax
+ \def\startmkivmode#1\stopmkivmode{}
+ \let\stopmkivmode \relax
+
+\fi
%D As we don't have namespace definers yet, we use a special one:
@@ -212,8 +209,7 @@
%D Recent \TEX\ engines have a primitive \type {\expanded} and we will use that when
%D possible. After all, we can make not expandable macros now.
-% We cannot use the next variant as first we need to adapt \type {##}'s
-% in callers:
+% We cannot use the next variant as first we need to adapt \type {##}'s in callers:
%
% \def\expanded#1%
% {\normalexpanded{\noexpand#1}}
@@ -274,9 +270,8 @@
%D \doifnextcharelse {karakter} {then ...} {else ...}
%D \stoptyping
%D
-%D This macro differs from the original in the use of \type
-%D {\localnext} because we don't want clashes with \type
-%D {\next}.
+%D This macro differs from the original in the use of \type {\localnext} because we
+%D don't want clashes with \type {\next}.
\let\next \relax
\let\nextnext \relax
@@ -287,14 +282,6 @@
\let\m_syst_action_yes\relax
\let\m_syst_action_nop\relax
-\unexpanded\def\doifelsenextchar#1#2#3% #1 should not be {} !
- {\let\charactertoken=#1% = needed here
- \def\m_syst_action_yes{#2}%
- \def\m_syst_action_nop{#3}%
- \futurelet\nexttoken\syst_helpers_inspect_next_character}
-
-\let\doifnextcharelse\doifelsenextchar
-
\def\syst_helpers_inspect_next_character
{\ifx\nexttoken\blankspace
\expandafter\syst_helpers_reinspect_next_character
@@ -309,14 +296,29 @@
\expandafter\m_syst_action_nop
\fi}
+\unexpanded\def\doifelsenextchar#1#2#3% #1 should not be {} !
+ {\let\charactertoken=#1% = needed here
+ \def\m_syst_action_yes{#2}%
+ \def\m_syst_action_nop{#3}%
+ \futurelet\nexttoken\syst_helpers_inspect_next_character}
+
+\unexpanded\def\doifelsenextcharcs#1#2#3% #1 should not be {} !
+ {\let\charactertoken=#1% = needed here
+ \let\m_syst_action_yes#2%
+ \let\m_syst_action_nop#3%
+ \futurelet\nexttoken\syst_helpers_inspect_next_character}
+
+\let\doifnextcharelse \doifelsenextchar
+\let\doifnextcharcselse\doifelsenextcharcs
+
%D Because we will mostly use this macro for testing if the next character is \type
%D {[}, we also make a slightly faster variant as it is not uncommon to have tens of
%D thousands of calls to this test in a run. Of course it also is more convenient to
%D read a trace then.
-% We could make variants without the \if_next_blank_space_token but the overhead is
-% only .1 sec on 3.5 for 10^6 tests and often that branch is not entered anyway. The
-% fast variants with less checking do make a difference however:
+%D We could make variants without the \if_next_blank_space_token but the overhead is
+%D only .1 sec on 3.5 for 10^6 tests and often that branch is not entered anyway. The
+%D fast variants with less checking do make a difference however:
% \testfeature{1000000}{\doifnextoptionalelse \gobbleoneargument\gobbleoneargument[} % 2.902s
% \testfeature{1000000}{\doifnextoptionalcselse \gobbleoneargument\gobbleoneargument[} % 2.590s
@@ -327,6 +329,20 @@
\let\syst_helpers_next_optional_character_token=[
+\def\syst_helpers_inspect_next_optional_character
+ {\ifx\nexttoken\blankspace
+ \expandafter\syst_helpers_reinspect_next_optional_character
+ \else
+ \expandafter\syst_helpers_inspect_next_optional_character_indeed
+ \fi}
+
+\def\syst_helpers_inspect_next_optional_character_indeed
+ {\ifx\nexttoken\syst_helpers_next_optional_character_token
+ \expandafter\m_syst_action_yes
+ \else
+ \expandafter\m_syst_action_nop
+ \fi}
+
\unexpanded\def\doifelsenextoptional#1#2%
{\def\m_syst_action_yes{#1}%
\def\m_syst_action_nop{#2}%
@@ -354,22 +370,22 @@
% \def\doifelsenextoptionalcs_n_n{\let\if_next_blank_space_token\iffalse
% \futurelet\nexttoken\syst_helpers_inspect_next_optional_character}
-\def\syst_helpers_inspect_next_optional_character
+\let\syst_helpers_next_bgroup_character_token\bgroup
+
+\def\syst_helpers_inspect_next_bgroup_character
{\ifx\nexttoken\blankspace
- \expandafter\syst_helpers_reinspect_next_optional_character
+ \expandafter\syst_helpers_reinspect_next_bgroup_character
\else
- \expandafter\syst_helpers_inspect_next_optional_character_indeed
+ \expandafter\syst_helpers_inspect_next_bgroup_character_indeed
\fi}
-\def\syst_helpers_inspect_next_optional_character_indeed
- {\ifx\nexttoken\syst_helpers_next_optional_character_token
+\def\syst_helpers_inspect_next_bgroup_character_indeed
+ {\ifx\nexttoken\syst_helpers_next_bgroup_character_token
\expandafter\m_syst_action_yes
\else
\expandafter\m_syst_action_nop
\fi}
-\let\syst_helpers_next_bgroup_character_token\bgroup
-
\unexpanded\def\doifelsenextbgroup#1#2%
{\def\m_syst_action_yes{#1}%
\def\m_syst_action_nop{#2}%
@@ -385,22 +401,22 @@
\let\doifnextbgroupelse \doifelsenextbgroup
\let\doifnextbgroupcselse\doifelsenextbgroupcs
-\def\syst_helpers_inspect_next_bgroup_character
+\let\syst_helpers_next_parenthesis_character_token(
+
+\def\syst_helpers_inspect_next_parenthesis_character
{\ifx\nexttoken\blankspace
- \expandafter\syst_helpers_reinspect_next_bgroup_character
+ \expandafter\syst_helpers_reinspect_next_parenthesis_character
\else
- \expandafter\syst_helpers_inspect_next_bgroup_character_indeed
+ \expandafter\syst_helpers_inspect_next_parenthesis_character_indeed
\fi}
-\def\syst_helpers_inspect_next_bgroup_character_indeed
- {\ifx\nexttoken\syst_helpers_next_bgroup_character_token
+\def\syst_helpers_inspect_next_parenthesis_character_indeed
+ {\ifx\nexttoken\syst_helpers_next_parenthesis_character_token
\expandafter\m_syst_action_yes
\else
\expandafter\m_syst_action_nop
\fi}
-\let\syst_helpers_next_parenthesis_character_token(
-
\unexpanded\def\doifelsenextparenthesis#1#2%
{\def\m_syst_action_yes{#1}%
\def\m_syst_action_nop{#2}%
@@ -409,22 +425,15 @@
\let\doifnextparenthesiselse\doifelsenextparenthesis
-\def\syst_helpers_inspect_next_parenthesis_character
- {\ifx\nexttoken\blankspace
- \expandafter\syst_helpers_reinspect_next_parenthesis_character
- \else
- \expandafter\syst_helpers_inspect_next_parenthesis_character_indeed
- \fi}
+%D The next one is handy in predictable situations:
-\def\syst_helpers_inspect_next_parenthesis_character_indeed
- {\ifx\nexttoken\syst_helpers_next_parenthesis_character_token
+\def\syst_helpers_do_if_fast_optional_check_else
+ {\ifx\nexttoken\syst_helpers_next_optional_character_token
\expandafter\m_syst_action_yes
\else
\expandafter\m_syst_action_nop
\fi}
-%D The next one is handy in predictable situations:
-
\unexpanded\def\doifelsefastoptionalcheck#1#2%
{\def\m_syst_action_yes{#1}%
\def\m_syst_action_nop{#2}%
@@ -438,13 +447,6 @@
\let\doiffastoptionalcheckelse \doifelsefastoptionalcheck
\let\doiffastoptionalcheckcselse\doifelsefastoptionalcheckcs
-\def\syst_helpers_do_if_fast_optional_check_else
- {\ifx\nexttoken\syst_helpers_next_optional_character_token
- \expandafter\m_syst_action_yes
- \else
- \expandafter\m_syst_action_nop
- \fi}
-
%D Here's one for skipping spaces and pars, handy for:
%D
%D \starttyping
@@ -474,7 +476,7 @@
% \def\syst_helpers_ignore_par_partoken
% {\afterassignment\m_syst_action\let\nexttoken}
-\unexpanded\def\assumelongusagecs#1% can be relaxed when we have long support in \hbox etc
+\unexpanded\def\assumelongusagecs#1%
{\let\m_syst_action#1%
\futurelet\nexttoken\syst_helpers_ignore_spacing}
@@ -500,26 +502,34 @@
%D \type {\def} comes into action. This way the space after \type {\:} becomes a
%D delimiter of the longer named \type {\reinspectnextcharacter}.
-\let\next\:
+% \ifcase\contextlmtxmode
+
+ \let\next\:
-\def\:{\let\blankspace= } \:
+ \def\:{\let\blankspace= } \:
-\def\:{\syst_helpers_reinspect_next_character}
-\expandafter\def\: {\let\if_next_blank_space_token\iftrue\futurelet\nexttoken\syst_helpers_inspect_next_character}
+ \def\:{\syst_helpers_reinspect_next_character}
+ \expandafter\def\: {\let\if_next_blank_space_token\iftrue\futurelet\nexttoken\syst_helpers_inspect_next_character}
-\def\:{\syst_helpers_reinspect_next_optional_character}
-\expandafter\def\: {\let\if_next_blank_space_token\iftrue\futurelet\nexttoken\syst_helpers_inspect_next_optional_character}
+ \def\:{\syst_helpers_reinspect_next_optional_character}
+ \expandafter\def\: {\let\if_next_blank_space_token\iftrue\futurelet\nexttoken\syst_helpers_inspect_next_optional_character}
-\def\:{\syst_helpers_reinspect_next_bgroup_character}
-\expandafter\def\: {\let\if_next_blank_space_token\iftrue\futurelet\nexttoken\syst_helpers_inspect_next_bgroup_character}
+ \def\:{\syst_helpers_reinspect_next_bgroup_character}
+ \expandafter\def\: {\let\if_next_blank_space_token\iftrue\futurelet\nexttoken\syst_helpers_inspect_next_bgroup_character}
-\def\:{\syst_helpers_reinspect_next_parenthesis_character}
-\expandafter\def\: {\let\if_next_blank_space_token\iftrue\futurelet\nexttoken\syst_helpers_inspect_next_parenthesis_character}
+ \def\:{\syst_helpers_reinspect_next_parenthesis_character}
+ \expandafter\def\: {\let\if_next_blank_space_token\iftrue\futurelet\nexttoken\syst_helpers_inspect_next_parenthesis_character}
-\def\:{\syst_helpers_ignore_spacing_blankspace}
-\expandafter\def\: {\futurelet\nexttoken\syst_helpers_ignore_spacing}
+ \def\:{\syst_helpers_ignore_spacing_blankspace}
+ \expandafter\def\: {\futurelet\nexttoken\syst_helpers_ignore_spacing}
-\let\:\next
+ \let\:\next
+
+% \else
+%
+% % nothing here
+%
+% \fi
%D This is much nicer and works too:
@@ -590,9 +600,9 @@
%D \macros
%D {globallet,glet}
%D
-%D In \CONTEXT\ of May 2000 using \type {\globallet} instead of the two
-%D tokens will save us some $300\times4=1200$ bytes of format file on a 32~bit
-%D system. Not that it matters much today. This shortcut is already defined:
+%D In \CONTEXT\ of May 2000 using \type {\globallet} instead of the two tokens will
+%D save us some $300\times4=1200$ bytes of format file on a 32~bit system. Not that
+%D it matters much today. This shortcut is already defined:
\let\globallet\glet
@@ -660,13 +670,13 @@
%D {\undefined}! In \ETEX\ we have \type {\ifcsname} and that way of testing on
%D existance is not the same as the one described here. Therefore we introduce:
-\def\letbeundefined#1% potential stack buildup when used \global
+\unexpanded\def\letbeundefined#1% potential stack buildup when used \global
{\expandafter\let\csname#1\endcsname\undefined} % or use \undefinevalue to match \setvalue
-\def\localundefine#1% conditional
+\unexpanded\def\localundefine#1% conditional
{\ifcsname#1\endcsname\expandafter\let\csname#1\endcsname\undefined\fi}
-\def\globalundefine#1% conditional
+\unexpanded\def\globalundefine#1% conditional
{\ifcsname#1\endcsname\expandafter\glet\csname#1\endcsname\undefined\fi}
%D Beware, being \type {\undefined} in \ETEX\ means that the macro {\em is} defined!
@@ -737,23 +747,6 @@
\expandafter\secondoftwoarguments
\fi}
-%D Slightly faster on longer arguments (0.179 downto 0.141):
-%D
-%D \testfeatureonce{100000}{\doifelse{aaaaaaaaaaaaaaa}{bbbbbbbbbbbbbbb}\relax\relax}
-
-% \unexpanded\def\doifelse
-% {\afterassignment\doifelse_n\edef\m_syst_string_one}
-%
-% \unexpanded\def\doifelse_n
-% {\afterassignment\doifelse_n_n\edef\m_syst_string_two}
-%
-% \unexpanded\def\doifelse_n_n
-% {\ifx\m_syst_string_one\m_syst_string_two
-% \expandafter\firstoftwoarguments
-% \else
-% \expandafter\secondoftwoarguments
-% \fi}
-
%D \macros
%D {doifempty,doifemptyelse,doifnotempty}
%D
@@ -1100,22 +1093,31 @@
\def\syst_helpers_do_do_do_process_comma_item
{\csname\??nextcommalevel\the\commalevel\endcsname}
-\def\syst_helpers_do_do_process_comma_item
- {\ifx\nexttoken\blankspace
- \expandafter\syst_helpers_re_do_process_comma_item
- \else
- \expandafter\syst_helpers_do_do_process_comma_item_indeed
- \fi}
+% \ifcase\contextlmtxmode
-\def\syst_helpers_do_do_process_comma_item_indeed
- {\ifx\nexttoken]%
- \expandafter\gobbleoneargument
- \else
- \expandafter\syst_helpers_do_do_do_process_comma_item
- \fi}
+ \def\syst_helpers_do_process_comma_item
+ {\futurelet\nexttoken\syst_helpers_do_do_process_comma_item}
+
+ \def\syst_helpers_do_do_process_comma_item
+ {\ifx\nexttoken\blankspace
+ \expandafter\syst_helpers_re_do_process_comma_item
+ \else
+ \expandafter\syst_helpers_do_do_process_comma_item_indeed
+ \fi}
+
+ \def\syst_helpers_do_do_process_comma_item_indeed
+ {\ifx\nexttoken]%
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\syst_helpers_do_do_do_process_comma_item
+ \fi}
-\def\syst_helpers_do_process_comma_item
- {\futurelet\nexttoken\syst_helpers_do_do_process_comma_item}
+% \else
+%
+% \def\syst_helpers_do_process_comma_item
+% {\futureexpandis]\gobbleoneargument\syst_helpers_do_do_do_process_comma_item}
+%
+% \fi
%D Empty arguments are not processed. Empty items (\type {,,}) however are
%D treated. We have to check for the special case \type {[{a,b,c}]}.
@@ -1164,13 +1166,17 @@
%D The hack we used for checking the next character \type {\doifnextcharelse}
%D is also used here.
-\let\next\:
+% \ifcase\contextlmtxmode
+
+ \let\next\:
-\def\:{\syst_helpers_re_do_process_comma_item} % \:not saved ?
+ \def\:{\syst_helpers_re_do_process_comma_item} % \:not saved ?
-\expandafter\def\: {\futurelet\nexttoken\syst_helpers_do_do_process_comma_item}
+ \expandafter\def\: {\futurelet\nexttoken\syst_helpers_do_do_process_comma_item}
-\let\:\next
+ \let\:\next
+
+% \fi
%D The previous examples lead to:
%D
@@ -1199,14 +1205,14 @@
%D \processcommacommand[\first,between,\second]\message
%D \stoptyping
%D
-%D Commands that are part of the list are expanded, so the use of
-%D this macro has its limits.
+%D Commands that are part of the list are expanded, so the use of this macro has its
+%D limits.
\unexpanded\def\processcommacommand[#1]%
{\normalexpanded{\processcommalist[#1]}}
-%D The argument to \type{\command} is not delimited. Because we often
-%D use \type{[]} as delimiters, we also have:
+%D The argument to \type{\command} is not delimited. Because we often use \type {[]}
+%D as delimiters, we also have:
%D
%D \starttyping
%D \processcommalistwithparameters[string,string,...]\command
@@ -1245,10 +1251,9 @@
%D processfirstactioninset,
%D processallactionsinset}
%D
-%D \CONTEXT\ makes extensive use of a sort of case or switch
-%D command. Depending of the presence of one or more provided
-%D items, some actions is taken. These macros can be nested
-%D without problems.
+%D \CONTEXT\ makes extensive use of a sort of case or switch command. Depending of
+%D the presence of one or more provided items, some actions is taken. These macros
+%D can be nested without problems.
%D
%D \starttyping
%D \processaction [x] [a=>\a,b=>\b,c=>\c]
@@ -1256,8 +1261,8 @@
%D \processallactionsinset [x,y,z] [a=>\a,b=>\b,c=>\c]
%D \stoptyping
%D
-%D We can supply both a \type{default} action and an action
-%D to be undertaken when an \type{unknown} value is met:
+%D We can supply both a \type {default} action and an action to be undertaken when
+%D an \type {unknown} value is met:
%D
%D \starttyping
%D \processallactionsinset
@@ -1269,16 +1274,14 @@
%D unknown=>\unknown{... \commalistelement ...}]
%D \stoptyping
%D
-%D When \type{#1} is empty, this macro scans list \type{#2} for
-%D the keyword \type{default} and executed the related action
-%D if present. When \type{#1} is non empty and not in the list,
-%D the action related to \type{unknown} is executed. Both
-%D keywords must be at the end of list \type{#2}. Afterwards,
-%D the actually found keyword is available in
-%D \type{\commalistelement}. An advanced example of the use of
-%D this macro can be found in \PPCHTEX, where we completely
-%D rely on \TEX\ for interpreting user supplied keywords like
-%D \type{SB}, \type{SB1..6}, \type{SB125} etc.
+%D When \type {#1} is empty, this macro scans list \type {#2} for the keyword \type
+%D {default} and executed the related action if present. When \type {#1} is non
+%D empty and not in the list, the action related to \type {unknown} is executed.
+%D Both keywords must be at the end of list \type{#2}. Afterwards, the actually
+%D found keyword is available in \type {\commalistelement}. An advanced example of
+%D the use of this macro can be found in \PPCHTEX, where we completely rely on \TEX\
+%D for interpreting user supplied keywords like \type {SB}, \type {SB1..6}, \type
+%D {SB125} etc.
\newcount\processlevel
@@ -1396,17 +1399,15 @@
%D \macros
%D {getfirstcharacter, firstcharacter, remainingcharacters, doiffirstcharacter}
%D
-%D Sometimes the action to be undertaken depends on the
-%D next character. This macro get this character and puts it in
-%D \type {\firstcharacter}.
+%D Sometimes the action to be undertaken depends on the next character. This macro
+%D get this character and puts it in \type {\firstcharacter}.
%D
%D \starttyping
%D \getfirstcharacter {string}
%D \stoptyping
%D
-%D A two step expansion is used to prevent problems with
-%D complicated arguments, for instance arguments that
-%D consist of two or more expandable tokens.
+%D A two step expansion is used to prevent problems with complicated arguments, for
+%D instance arguments that consist of two or more expandable tokens.
\let\firstcharacter \empty
\let\remainingcharacters\empty
@@ -1421,8 +1422,7 @@
%D \macros
%D {doifinstringelse, doifincsnameelse}
%D
-%D We can check for the presence of a substring in a given
-%D sequence of characters.
+%D We can check for the presence of a substring in a given sequence of characters.
%D
%D \starttyping
%D \doifinsetelse {substring} {string} {then ...} {else ...}
@@ -1481,26 +1481,24 @@
\unexpanded\def\syst_helpers_do_if_in_string_else#1#2% ##2 can be {abc}
{\expandafter\def\expandafter\syst_helpers_do_do_if_in_string_else
- \expandafter##\expandafter1#1##2##3\_e_o_s_{\unless\if##2@}% expand #1 here
- \expandafter\syst_helpers_do_do_if_in_string_else\normalexpanded{#2#1}@@\_e_o_s_} % expand #2 here
+ \expandafter##\expandafter1#1##2##3^^^^0004{\unless\if##2@}% expand #1 here
+ \expandafter\syst_helpers_do_do_if_in_string_else\normalexpanded{#2#1}@@^^^^0004} % expand #2 here
-%D The next alternative proved to be upto twice as fast on
-%D tasks like checking reserved words in pretty verbatim
-%D typesetting! This is mainly due to the fact that passing
-%D (expanded) strings is much slower that passing a macro.
+%D The next alternative proved to be upto twice as fast on tasks like checking
+%D reserved words in pretty verbatim typesetting! This is mainly due to the fact
+%D that passing (expanded) strings is much slower that passing a macro.
%D
%D \starttyping
%D \doifincsnameelse {substring} {\string} {then ...} {else ...}
%D \stoptyping
%D
-%D Where \type{\doifinstringelse} does as much expansion as
-%D possible, the latter alternative does minimal (one level)
-%D expansion.
+%D Where \type {\doifinstringelse} does as much expansion as possible, the latter
+%D alternative does minimal (one level) expansion.
\unexpanded\def\syst_helpers_do_if_in_csname_else#1#2%
- {\def\syst_helpers_do_do_if_in_csname_else##1#1##2##3\_e_o_s_
+ {\def\syst_helpers_do_do_if_in_csname_else##1#1##2##3^^^^0004%
{\unless\if##2@}%
- \expandafter\syst_helpers_do_do_if_in_csname_else#2#1@@\_e_o_s_}
+ \expandafter\syst_helpers_do_do_if_in_csname_else#2#1@@^^^^0004}
\unexpanded\def\doifelseincsname#1#2%
{\normalexpanded{\syst_helpers_do_if_in_csname_else{#1}}{#2}%
@@ -1514,17 +1512,16 @@
%D \macros
%D {doifnumberelse,doifnumber,doifnotnumber}
%D
-%D The next macro executes a command depending of the outcome of a test on
-%D numerals. This is probably one of the fastest test possible, exept from
-%D a less robust 10||step \type {\if}||ladder or some tricky \type {\lcode}
-%D checking.
+%D The next macro executes a command depending of the outcome of a test on numerals.
+%D This is probably one of the fastest test possible, exept from a less robust
+%D 10||step \type {\if}||ladder or some tricky \type {\lcode} checking.
%D
%D \starttyping
%D \doifnumberelse {string} {then ...} {else ...}
%D \stoptyping
%D
-%D The macro accepts \type {123}, \type {abc}, \type {{}}, \type {\getal} and
-%D \type {\the\count...}. This macro is a rather dirty one.
+%D The macro accepts \type {123}, \type {abc}, \type {{}}, \type {\getal} and \type
+%D {\the\count...}. This macro is a rather dirty one.
\def\doifelsenumber#1% does not accept counters (fully expandable)
{\ifcase0\ifcase1#1\or\or\or\or\or\or\or\or\or\else1\fi\space
@@ -1533,8 +1530,6 @@
\expandafter\firstoftwoarguments
\fi}
-\let\doifnumberelse\doifelsenumber
-
\def\doifnumber#1%
{\ifcase0\ifcase1#1\or\or\or\or\or\or\or\or\or\else1\fi\space
\expandafter\firstofoneargument
@@ -1549,6 +1544,8 @@
\expandafter\firstofoneargument
\fi}
+\let\doifnumberelse\doifelsenumber
+
%D \macros
%D {setpercentdimen}
%D
@@ -1570,14 +1567,12 @@
%D rawprocesscommalist,
%D rawprocessaction}
%D
-%D Some of the commands mentioned earlier are effective but
-%D slow. When one is desperately in need of faster alternatives
-%D and when the conditions are predictable safe, the \type{\raw}
-%D alternatives come into focus. A major drawback is that
-%D they do not take \type{\c!constants} into account, simply
-%D because no expansion is done. This is no problem with
-%D \type{\rawprocesscommalist}, because this macro does not
-%D compare anything. Expandable macros are permitted as search
+%D Some of the commands mentioned earlier are effective but slow. When one is
+%D desperately in need of faster alternatives and when the conditions are
+%D predictable safe, the \type {\raw} alternatives come into focus. A major drawback
+%D is that they do not take \type {\c!constants} into account, simply because no
+%D expansion is done. This is no problem with \type {\rawprocesscommalist}, because
+%D this macro does not compare anything. Expandable macros are permitted as search
%D string.
%D
%D \starttyping
@@ -1587,10 +1582,9 @@
%D \rawprocessaction[x][a=>\a,b=>\b,c=>\c]
%D \stoptyping
%D
-%D Spaces embedded in the list, for instance after commas,
-%D spoil the search process. The gain in speed depends on the
-%D length of the argument (the longer the argument, the less
-%D we gain).
+%D Spaces embedded in the list, for instance after commas, spoil the search process.
+%D The gain in speed depends on the length of the argument (the longer the argument,
+%D the less we gain).
\unexpanded\def\makerawcommalist[#1]#2% use \processnext ... here
{\def\syst_helpers_do_make_raw_comma_list##1% we don't expand ##1
@@ -1617,6 +1611,22 @@
\unexpanded\def\rawprocesscommacommand[#1]% not really needed
{\normalexpanded{\rawprocesscommalist[#1]}}
+%D Here is one without nesting:
+
+\unexpanded\def\syst_helpers_fast_process_comma_item#1,#2% #2 eats up preceding space
+ {\if]#1\else
+ \syst_helpers_fast_process_comma_command{#1}%
+ \expandafter\syst_helpers_fast_process_comma_item
+ \fi#2}
+
+\unexpanded\def\fastprocesscommalist[#1]#2% accepteert ook [\cs]
+ {\let\syst_helpers_fast_process_comma_command#2%
+ \expandafter\syst_helpers_fast_process_comma_item#1,],}% \relax
+
+\unexpanded\def\fastprocesscommacommand[#1]#2% accepteert ook [\cs]
+ {\let\syst_helpers_fast_process_comma_command#2%
+ \normalexpanded{\syst_helpers_fast_process_comma_item#1},],}% \relax
+
% \def\rawdoifelseinset#1#2{\doifinstringelse{,#1,}{,#2,}}
% \def\rawdoifinset #1#2{\doifinstring {,#1,}{,#2,}}
@@ -1657,11 +1667,11 @@
%D Some more raw material:
\def\syst_helpers_do_raw_process_action[#1][#2]%
- {\def\syst_helpers_do_do_raw_process_action##1,#1=>##2,##3\_e_o_s_
+ {\def\syst_helpers_do_do_raw_process_action##1,#1=>##2,##3^^^^0004%
{\if##3@\else
\def\m_syst_helpers_process_action{##2}%
\fi}%
- \syst_helpers_do_do_raw_process_action,#2,#1=>,@\_e_o_s_}
+ \syst_helpers_do_do_raw_process_action,#2,#1=>,@^^^^0004}
\unexpanded\def\rawprocessaction[#1]#2[#3]%
{\edef\m_syst_string_one{#1}%
@@ -1680,11 +1690,11 @@
\m_syst_helpers_process_action
\fi}
-%D When we process the list \type{a,b,c,d,e}, the raw routine takes over 30\% less
+%D When we process the list \type {a,b,c,d,e}, the raw routine takes over 30\% less
%D time, when we feed $20+$ character strings we gain about 20\%. Alternatives which
-%D use \type{\futurelet} perform worse. Part of the speedup is due to the
-%D \type{\let} and \type{\expandafter} in the test.
-
+%D use \type {\futurelet} perform worse. Part of the speedup is due to the \type
+%D {\let} and \type {\expandafter} in the test.
+%D
%D \macros
%D {dosetvalue,dosetevalue,dosetgvalue,docopyvalue,doresetvalue,
%D dogetvalue}
@@ -1753,14 +1763,8 @@
%D will redefine this macro later on, when a more advanced message mechanism is
%D implemented.
-\newif\iferrorisfatal
-
-\unexpanded\def\waitonfatalerror
- {\iferrorisfatal\wait\fi}
-
\unexpanded\def\showassignerror#1#2%
- {\writestatus{setup}{missing or ungrouped '=' after '#1' in line #2}%
- \waitonfatalerror}
+ {\writestatus{setup}{missing or ungrouped '=' after '#1' in line #2}}
\unexpanded\def\doassignempty[#1][#2=#3]%
{\ifcsname#1#2\endcsname\else\dosetvalue{#1}{#2}{#3}\fi}
@@ -1850,7 +1854,7 @@
\fi#4}
\def\syst_helpers_get_parameters#1]%
- {\xprocesscommaitem#1,],\_e_o_p_}
+ {\xprocesscommaitem#1,],^^^^0004}
\def\syst_helpers_process_comma_item#1,#2% #2 takes space before ,
{\if,#1,% dirty trick for testing #1=empty
@@ -1858,14 +1862,14 @@
\else\if]#1%
\doubleexpandafter\gobbleoneargument
\else
- \syst_helpers_get_parameters_assign\_e_o_p_#1==\empty\_e_o_p_
+ \syst_helpers_get_parameters_assign^^^^0004#1==\empty^^^^0004%
\doubleexpandafter\syst_helpers_process_comma_item
\fi\fi#2}
\def\syst_helpers_assign_error#1#2#3%
{\showassignerror{#2}{\the\inputlineno\space(#1)}}
-\def\syst_helpers_get_parameters_assign_normal#1\_e_o_p_#2=#3=#4#5\_e_o_p_
+\def\syst_helpers_get_parameters_assign_normal#1^^^^0004#2=#3=#4#5^^^^0004%
{\ifx\empty#2\empty
\expandafter\syst_helpers_assign_error
\else\ifx#4\empty
@@ -1875,7 +1879,7 @@
\fi\fi
{#1}{#2}{#3}}
-\def\syst_helpers_get_parameters_assign_error#1\_e_o_p_#2=#3=#4#5\_e_o_p_
+\def\syst_helpers_get_parameters_assign_error#1^^^^0004#2=#3=#4#5^^^^0004%
{\ifx\empty#2\empty
\expandafter\syst_helpers_assign_error
\else\ifx#4\empty
@@ -1892,9 +1896,9 @@
\let\syst_helpers_get_parameters_assign_indeed\syst_helpers_get_parameters_assign_normal
-\unexpanded\def\doassign [#1][#2]{\let\setsomevalue\dosetvalue \syst_helpers_get_parameters_assign_indeed#1\_e_o_p_#2==\empty\_e_o_p_}
-\unexpanded\def\doeassign [#1][#2]{\let\setsomevalue\dosetevalue \syst_helpers_get_parameters_assign_indeed#1\_e_o_p_#2==\empty\_e_o_p_}
-\unexpanded\def\undoassign[#1][#2]{\let\setsomevalue\doresetvalue\syst_helpers_get_parameters_assign_indeed#1\_e_o_p_#2==\empty\_e_o_p_}
+\unexpanded\def\doassign [#1][#2]{\let\setsomevalue\dosetvalue \syst_helpers_get_parameters_assign_indeed#1^^^^0004#2==\empty^^^^0004}
+\unexpanded\def\doeassign [#1][#2]{\let\setsomevalue\dosetevalue \syst_helpers_get_parameters_assign_indeed#1^^^^0004#2==\empty^^^^0004}
+\unexpanded\def\undoassign[#1][#2]{\let\setsomevalue\doresetvalue\syst_helpers_get_parameters_assign_indeed#1^^^^0004#2==\empty^^^^0004}
%D \macros
%D {processassignmentlist,processassignmentcommand,
@@ -1907,8 +1911,8 @@
%D \processassignmentlist[a=1,b=2]\showpair
%D \stoptyping
%D
-%D We can optimize this one if needed but it's not a core macro so hardly
-%D worth the trouble and tokens.
+%D We can optimize this one if needed but it's not a core macro so hardly worth the
+%D trouble and tokens.
\unexpanded\def\processassignmentlist[#1]#2% #2 == \command{key}{value]
{\def\syst_helpers_process_assignment_entry##1{#2}% {##2}{##3} % namespace is ignored
@@ -1960,14 +1964,14 @@
%D Here we hook in the code (beware, this is the optimized get **):
\def\syst_helpers_get_parameters_normal#1]%
- {\syst_helpers_process_comma_item#1,],\_e_o_p_}
+ {\syst_helpers_process_comma_item#1,],^^^^0004}
\def\syst_helpers_get_parameters_expanded#1]%
{\let\dosetnvalue\setsomevalue
\let\setsomevalue\dosetevalue
\let\syst_helpers_get_parameters_assign_indeed\syst_helpers_get_parameters_assign_error
\let\setsomevalue\dosetevalue
- \syst_helpers_process_comma_item#1,],\_e_o_p_
+ \syst_helpers_process_comma_item#1,],^^^^0004%
\let\syst_helpers_get_parameters_assign_indeed\syst_helpers_get_parameters_assign_normal
\let\setsomevalue\dosetnvalue
\let\syst_helpers_get_parameters\syst_helpers_get_parameters_normal
@@ -1981,8 +1985,8 @@
%D \macros
%D {getemptyparameters}
%D
-%D Sometimes we explicitly want variables to default to an
-%D empty string, so we welcome:
+%D Sometimes we explicitly want variables to default to an empty string, so we
+%D welcome:
%D
%D \starttyping
%D \getemptyparameters [label] [...=...,...=...]
@@ -1995,11 +1999,9 @@
%D \macros
%D {copyparameters}
%D
-%D Some \CONTEXT\ commands take their default setups from
-%D others. All commands that are able to provide backgounds
-%D or rules around some content, for instance default to the
-%D standard command for ruled boxes. Is situations like this
-%D we can use:
+%D Some \CONTEXT\ commands take their default setups from others. All commands that
+%D are able to provide backgounds or rules around some content, for instance default
+%D to the standard command for ruled boxes. Is situations like this we can use:
%D
%D \starttyping
%D \copyparameters [to-label] [from-label] [name1,name2,...]
@@ -2020,8 +2022,8 @@
%D \def\internalbeta {\externalbeta}
%D \stoptyping
%D
-%D By using \type{\docopyvalue} we've prepared this command
-%D for use in a multi||lingual environment.
+%D By using \type {\docopyvalue} we've prepared this command for use in a
+%D multi||lingual environment.
\unexpanded\def\copyparameters[#1]#2[#3]#4[#5]%
{\doifnot{#1}{#3}
@@ -2031,12 +2033,11 @@
%D \macros
%D {ifparameters,checkparameters}
%D
-%D A slightly different one is \type{\checkparameters}, which
-%D also checks on the presence of a~\type{=}.
+%D A slightly different one is \type {\checkparameters}, which also checks on the
+%D presence of a~\type {=}.
%D
-%D The boolean \type{\ifparameters} can be used afterwards.
-%D Combining both in one \type{\if}||macro would lead to
-%D problems with nested \type{\if}'s.
+%D The boolean \type {\ifparameters} can be used afterwards. Combining both in one
+%D \type {\if}||macro would lead to problems with nested \type {\if}'s.
%D
%D \starttyping
%D \checkparameters[argument]
@@ -2044,11 +2045,11 @@
\newif\ifparameters
-\def\syst_helpers_check_parameters#1=#2#3\_e_o_s_
- {\if#2@\parametersfalse\else\parameterstrue\fi}
+\def\syst_helpers_check_parameters#1=#2#3^^^^0004%
+ {\if#2^^^^0003\parametersfalse\else\parameterstrue\fi}
\unexpanded\def\checkparameters[#1]%
- {\syst_helpers_check_parameters#1=@@\_e_o_s_}
+ {\syst_helpers_check_parameters#1=^^^^0003^^^^0003^^^^0004}
%D \macros
%D {getfromcommalist,getfromcommacommand,
@@ -2112,9 +2113,8 @@
\unexpanded\def\getfromcommacommand[#1]%
{\normalexpanded{\getfromcommalist[#1]}}
-%D Watertight (and efficient) solutions are hard to find, due
-%D to the handling of braces during parameters passing and
-%D scanning. Nevertheless:
+%D Watertight (and efficient) solutions are hard to find, due to the handling of
+%D braces during parameters passing and scanning. Nevertheless:
%D
%D \startbuffer
%D \def\dosomething#1{(#1=\commalistsize) }
@@ -2138,8 +2138,8 @@
%D \macros
%D {dogetcommalistelement,dogetcommacommandelement}
%D
-%D For low level (fast) purposes, we can also use the next
-%D alternative, which can handle 8~elements at most.
+%D For low level (fast) purposes, we can also use the next alternative, which can
+%D handle 8~elements at most.
%D
%D \starttyping
%D \dogetcommalistelement1\from a,b,c\to\commalistelement
@@ -2156,9 +2156,8 @@
%D doquadrupleargument,doquintupleargument,dosixtupleargument,
%D doseventupleargument}
%D
-%D When working with delimited arguments, spaces and
-%D lineendings can interfere. The next set of macros uses
-%D \TEX' internal scanner for grabbing everything between
+%D When working with delimited arguments, spaces and lineendings can interfere. The
+%D next set of macros uses \TEX' internal scanner for grabbing everything between
%D arguments. Forgive me the funny names.
%D
%D \starttyping
@@ -2195,17 +2194,15 @@
%D \dodoquintupleargument}
%D \stoptyping
%D
-%D Because \TEX\ accepts 9~arguments at most, we have to use
-%D two||step solution when getting five or more arguments.
+%D Because \TEX\ accepts 9~arguments at most, we have to use two||step solution when
+%D getting five or more arguments.
%D
-%D When developing more and more of the real \CONTEXT, we
-%D started using some alternatives that provided empty
-%D arguments (in fact optional ones) whenever the user failed
-%D to supply them. Because this more complicated macros enable
-%D us to do some checking, we reimplemented the non||empty
-%D ones.
+%D When developing more and more of the real \CONTEXT, we started using some
+%D alternatives that provided empty arguments (in fact optional ones) whenever the
+%D user failed to supply them. Because this more complicated macros enable us to do
+%D some checking, we reimplemented the non||empty ones.
-% no longer a mesage:
+% no longer a message:
%
% \unexpanded\def\dosingleargument {\let\expectedarguments\plusone \dosingleempty }
% \unexpanded\def\dodoubleargument {\let\expectedarguments\plustwo \dodoubleempty }
@@ -2220,8 +2217,8 @@
%D iffourthargument,iffifthargument,ifsixthargument,
%D ifseventhargument}
%D
-%D We use some signals for telling the calling macros if all
-%D wanted arguments are indeed supplied by the user.
+%D We use some signals for telling the calling macros if all wanted arguments are
+%D indeed supplied by the user.
\newif\iffirstargument
\newif\ifsecondargument
@@ -2256,24 +2253,23 @@
%D \command[][]
%D \stoptyping
%D
-%D Depending of the generousity of the user. Afterwards one can
-%D use the \type{\if...argument} boolean. For novice: watch
-%D the stepwise doubling of \type{#}'s
-
-\setnewconstant\noexpectedarguments\zerocount
-\setnewconstant\expectedarguments \zerocount
-
-\unexpanded\def\showargumenterror#1#2%
- {\writestatus{system}{\number#1 argument(s) expected in line #2}}
-
-\unexpanded\def\syst_helpers_argument_error
- {\ifnum\expectedarguments>\noexpectedarguments
- \showargumenterror{\number\expectedarguments}{\number\inputlineno}%
- \fi
- \syst_helpers_argument_reset}
+%D Depending of the generousity of the user. Afterwards one can use the \type
+%D {\if...argument} boolean. For novice: watch the stepwise doubling of \type {#}'s.
-\unexpanded\def\syst_helpers_argument_reset
- {\let\expectedarguments\noexpectedarguments}
+% \setnewconstant\noexpectedarguments\zerocount
+% \setnewconstant\expectedarguments \zerocount
+%
+% \unexpanded\def\showargumenterror#1#2%
+% {\writestatus{system}{\number#1 argument(s) expected in line #2}}
+%
+% \unexpanded\def\syst_helpers_argument_error
+% {\ifnum\expectedarguments>\noexpectedarguments
+% \showargumenterror{\number\expectedarguments}{\number\inputlineno}%
+% \fi
+% \syst_helpers_argument_reset}
+%
+% \unexpanded\def\syst_helpers_argument_reset
+% {\let\expectedarguments\noexpectedarguments}
% \def\test[#1]{(#1)}
%
@@ -2372,7 +2368,7 @@
% #1[]}
\unexpanded\def\dosingleempty#1%
- {\syst_helpers_argument_reset
+ {%syst_helpers_argument_reset
\t_syst_aux{#1}%
\let\m_syst_action_yes\syst_helpers_single_empty_one_yes
\let\m_syst_action_nop\syst_helpers_single_empty_one_nop
@@ -2414,7 +2410,7 @@
% \def\syst_helpers_double_empty_one_normal#1#2{#1[{#2}][]}
\unexpanded\def\dodoubleempty#1%
- {\syst_helpers_argument_reset
+ {%syst_helpers_argument_reset
\t_syst_aux{#1}%
\let\m_syst_action_yes\syst_helpers_double_empty_one_yes
\let\m_syst_action_nop\syst_helpers_double_empty_one_nop
@@ -2491,7 +2487,7 @@
% \def\syst_helpers_triple_empty_three_normal#1#2#3{#1[{#2}][{#3}][]}
\unexpanded\def\dotripleempty#1%
- {\syst_helpers_argument_reset
+ {%syst_helpers_argument_reset
\t_syst_aux{#1}%
\let\m_syst_action_yes\syst_helpers_triple_empty_one_yes
\let\m_syst_action_nop\syst_helpers_triple_empty_one_nop
@@ -2605,7 +2601,7 @@
% \def\syst_helpers_quadruple_empty_four_normal #1#2#3#4{#1[{#2}][{#3}][{#4}][]}
\unexpanded\def\doquadrupleempty#1%
- {\syst_helpers_argument_reset
+ {%syst_helpers_argument_reset
\t_syst_aux{#1}%
\let\m_syst_action_yes\syst_helpers_quadruple_empty_one_yes
\let\m_syst_action_nop\syst_helpers_quadruple_empty_one_nop
@@ -2758,7 +2754,7 @@
% \def\syst_helpers_quintuple_empty_five_normal #1#2#3#4#5{#1[{#2}][{#3}][{#4}][{#5}][]}
\unexpanded\def\doquintupleempty#1%
- {\syst_helpers_argument_reset
+ {%syst_helpers_argument_reset
\t_syst_aux{#1}%
\let\m_syst_action_yes\syst_helpers_quintuple_empty_one_yes
\let\m_syst_action_nop\syst_helpers_quintuple_empty_one_nop
@@ -2952,7 +2948,7 @@
% \def\syst_helpers_sixtuple_empty_six_normal #1#2#3#4#5#6{#1[{#2}][{#3}][{#4}][{#5}][{#6}][]}
\unexpanded\def\dosixtupleempty#1%
- {\syst_helpers_argument_reset
+ {%syst_helpers_argument_reset
\t_syst_aux{#1}%
\let\m_syst_action_yes\syst_helpers_sixtuple_empty_one_yes
\let\m_syst_action_nop\syst_helpers_sixtuple_empty_one_nop
@@ -3189,7 +3185,7 @@
% \def\syst_helpers_seventuple_empty_seven_normal#1#2#3#4#5#6#7{#1[{#2}][{#3}][{#4}][{#5}][{#6}][{#7}][]}
\unexpanded\def\doseventupleempty#1%
- {\syst_helpers_argument_reset
+ {%syst_helpers_argument_reset
\t_syst_aux{#1}%
\let\m_syst_action_yes\syst_helpers_seventuple_empty_one_yes
\let\m_syst_action_nop\syst_helpers_seventuple_empty_one_nop
@@ -3330,8 +3326,7 @@
%D \macros
%D {strippedcsname}
%D
-%D The next macro can be very useful when using \type{\csname}
-%D like in:
+%D The next macro can be very useful when using \type{\csname} like in:
%D
%D \starttyping
%D \csname if\strippedcsname\something\endcsname
@@ -3347,9 +3342,9 @@
%D \macros
%D {complexorsimple,complexorsimpleempty}
%D
-%D Setups can be optional. A command expecting a setup is
-%D prefixed by \type{\complex}, a command without one gets the
-%D prefix \type{\simple}. Commands like this can be defined by:
+%D Setups can be optional. A command expecting a setup is prefixed by \type
+%D {\complex}, a command without one gets the prefix \type {\simple}. Commands like
+%D this can be defined by:
%D
%D \starttyping
%D \complexorsimple\command
@@ -3373,17 +3368,15 @@
%D \complexorsimpleempty {command}
%D \stoptyping
%D
-%D Depending on the presence of \type{[setup]}, this one
-%D leads to one of:
+%D Depending on the presence of \type{[setup]}, this one leads to one of:
%D
%D \starttyping
%D \complexcommando [setup]
%D \complexcommando []
%D \stoptyping
%D
-%D Many \CONTEXT\ commands started as complex or simple ones,
-%D but changed into more versatile (more object oriented) ones
-%D using the \type{\get..argument} commands.
+%D Many \CONTEXT\ commands started as complex or simple ones, but changed into more
+%D versatile (more object oriented) ones using the \type {\get..argument} commands.
\unexpanded\def\complexorsimple#1%
{% \relax % prevents lookahead, brrr
@@ -3400,9 +3393,8 @@
%D \macros
%D {definecomplexorsimple,definecomplexorsimpleempty}
%D
-%D The previous commands are used that often that we found it
-%D worthwile to offer two more alternatives. Watch the build
-%D in protection.
+%D The previous commands are used that often that we found it worthwile to offer two
+%D more alternatives. Watch the build in protection.
\unexpanded\def\syst_helpers_complex_or_simple#1#2%
{\doifelsenextoptional{\firstargumenttrue#1}{\firstargumentfalse#2}}
@@ -3449,9 +3441,8 @@
%D \doquadruplegroupempty \ineedFOURarguments
%D \doquintuplegroupempty \ineedFIVEarguments
%D \stoptyping
-
-%D We can add additional definitions later when we have defined
-%D \type {\appendtoks}.
+%D
+%D We can add additional definitions later when we have defined \type {\appendtoks}.
\newconditional\c_syst_helpers_permit_spaces_between_groups
@@ -3460,10 +3451,10 @@
\dontpermitspacesbetweengroups
-%D We can avoid the nasty if handling in \type {syst-gen} by splitting
-%D the lot in pieces so that we have no nested \type {\nextarguments}
-%D potentially being an \type {conditional} token. Okay, these macros
-%D are not called that often but it saves crap when tracing.
+%D We can avoid the nasty if handling in \type {syst-gen} by splitting the lot in
+%D pieces so that we have no nested \type {\nextarguments} potentially being an
+%D \type {conditional} token. Okay, these macros are not called that often but it
+%D saves crap when tracing.
\unexpanded\def\syst_helpers_get_grouped_argument#1#2%
{\let\syst_helpers_get_grouped_argument_yes#1%
@@ -3478,7 +3469,7 @@
\fi}
\def\syst_helpers_get_grouped_argument_a
- {\syst_helpers_argument_reset
+ {%syst_helpers_argument_reset
\syst_helpers_get_grouped_argument_yes\syst_helpers_get_grouped_argument_nested}
\def\syst_helpers_get_grouped_argument_b
@@ -3489,7 +3480,7 @@
\fi}
\def\syst_helpers_get_grouped_argument_d
- {\syst_helpers_argument_error
+ {%syst_helpers_argument_error
\syst_helpers_get_grouped_argument_nop\syst_helpers_get_grouped_argument_nested{}}
\begingroup
@@ -3504,13 +3495,13 @@
\expandafter\syst_helpers_get_grouped_argument_d % h
\fi}
-\def\dosinglegroupempty#1%
+\unexpanded\def\dosinglegroupempty#1%
{\def\syst_helpers_get_grouped_argument_nested
{\dontpermitspacesbetweengroups
#1}%
\syst_helpers_get_grouped_argument\firstargumenttrue\firstargumentfalse}
-\def\dodoublegroupempty#1%
+\unexpanded\def\dodoublegroupempty#1%
{\def\syst_helpers_get_grouped_argument_nested##1%
{\def\syst_helpers_get_grouped_argument_nested
{\dontpermitspacesbetweengroups
@@ -3518,7 +3509,7 @@
\syst_helpers_get_grouped_argument\secondargumenttrue\secondargumentfalse}%
\syst_helpers_get_grouped_argument\firstargumenttrue\firstargumentfalse}
-\def\dotriplegroupempty#1%
+\unexpanded\def\dotriplegroupempty#1%
{\def\syst_helpers_get_grouped_argument_nested##1%
{\def\syst_helpers_get_grouped_argument_nested####1%
{\def\syst_helpers_get_grouped_argument_nested
@@ -3528,7 +3519,7 @@
\syst_helpers_get_grouped_argument\secondargumenttrue\secondargumentfalse}%
\syst_helpers_get_grouped_argument\firstargumenttrue\firstargumentfalse}
-\def\doquadruplegroupempty#1%
+\unexpanded\def\doquadruplegroupempty#1%
{\def\syst_helpers_get_grouped_argument_nested##1%
{\def\syst_helpers_get_grouped_argument_nested####1%
{\def\syst_helpers_get_grouped_argument_nested########1%
@@ -3540,7 +3531,7 @@
\syst_helpers_get_grouped_argument\secondargumenttrue\secondargumentfalse}%
\syst_helpers_get_grouped_argument\firstargumenttrue\firstargumentfalse}
-\def\doquintuplegroupempty#1%
+\unexpanded\def\doquintuplegroupempty#1%
{\def\syst_helpers_get_grouped_argument_nested##1%
{\def\syst_helpers_get_grouped_argument_nested####1%
{\def\syst_helpers_get_grouped_argument_nested########1%
@@ -3554,8 +3545,8 @@
\syst_helpers_get_grouped_argument\secondargumenttrue\secondargumentfalse}%
\syst_helpers_get_grouped_argument\firstargumenttrue\firstargumentfalse}
-%D These macros can explictly take care of spaces, which means
-%D that the next definition and calls are valid:
+%D These macros can explictly take care of spaces, which means that the next
+%D definition and calls are valid:
%D
%D \starttyping
%D \def\test#1#2#3{[#1#2#3]}
@@ -3578,9 +3569,8 @@
%D secondoftwoarguments, secondofthreearguments,
%D thirdofthreearguments}
%D
-%D The next six macros (dedicated to Taco) can conveniently
-%D used to select arguments. Their names explain their
-%D functionality.
+%D The next six macros (dedicated to Taco) can conveniently used to select
+%D arguments. Their names explain their functionality.
\def\firstofoneargument #1{#1}
@@ -3641,9 +3631,8 @@
%D \macros
%D {wait}
%D
-%D The next macro hardly needs explanation. Because no
-%D nesting is to be expected, we can reuse \type{\wait} within
-%D \type{\wait} itself.
+%D The next macro hardly needs explanation. Because no nesting is to be expected, we
+%D can reuse \type {\wait} within \type {\wait} itself.
\unexpanded\def\wait
{\begingroup
@@ -3654,10 +3643,9 @@
%D {writestring,writeline,
%D writestatus,statuswidth,normalwritestatus}
%D
-%D Maybe one didn't notice, but we've already introduced a
-%D macro for showing messages. In the multi||lingual modules,
-%D we will also introduce a mechanism for message passing. For
-%D the moment we stick to the core macros:
+%D Maybe one didn't notice, but we've already introduced a macro for showing
+%D messages. In the multi||lingual modules, we will also introduce a mechanism for
+%D message passing. For the moment we stick to the core macros:
%D
%D \starttyping
%D \writestring {string}
@@ -3665,9 +3653,8 @@
%D \writestatus {category} {message}
%D \stoptyping
%D
-%D Messages are formatted. One can provide the maximum with
-%D of the identification string with the macro \type
-%D {\statuswidth}.
+%D Messages are formatted. One can provide the maximum with of the identification
+%D string with the macro \type {\statuswidth}.
\setnewconstant\statuswidth 15
\setnewconstant\statuswrite 128 % \pluscxxviii
@@ -3703,8 +3690,7 @@
%D \macros
%D {rawgetparameters}
%D
-%D A raw and dirty alternative for \type {\getparameters}; no
-%D checking is done!
+%D A raw and dirty alternative for \type {\getparameters}; no checking is done!
\unexpanded\def\rawsetparameter#1=#2,%
{\if]#1\else
@@ -3727,13 +3713,11 @@
%D {doglobal,
%D redoglobal,dodoglobal,resetglobal}
%D
-%D The two macros \type {\redoglobal} and \type{\dodoglobal} are
-%D used in this and some other modules to enforce a user
-%D specified \type {\doglobal} action. The last and often only
-%D global assignment in a macro is done with
-%D \type {\dodoglobal}, but all preceding ones with
-%D \type {\redoglobal}. When using only alternatives, one can
-%D reset this mechanism with \type {\resetglobal}.
+%D The two macros \type {\redoglobal} and \type{\dodoglobal} are used in this and
+%D some other modules to enforce a user specified \type {\doglobal} action. The last
+%D and often only global assignment in a macro is done with \type {\dodoglobal}, but
+%D all preceding ones with \type {\redoglobal}. When using only alternatives, one
+%D can reset this mechanism with \type {\resetglobal}.
\unexpanded\def\resetglobal
{\let\redoglobal\relax
@@ -3758,9 +3742,8 @@
{\let\redoglobal\syst_helpers_redo_global
\let\dodoglobal\syst_helpers_dodo_global}
-%D A very useful application of this macro is \type {\newif},
-%D \TEX's fake boolean type. Not being a primitive,
-%D \type {\global} hopelessly fails here. But a slight
+%D A very useful application of this macro is \type {\newif}, \TEX's fake boolean
+%D type. Not being a primitive, \type {\global} hopelessly fails here. But a slight
%D adaption of Knuth's original macro permits:
%D
%D \starttyping
@@ -3774,8 +3757,7 @@
%D \global\testfalse
%D \stoptyping
%D
-%D Apart from the prefixes, a few more \type{\expandafters}
-%D are needed:
+%D Apart from the prefixes, a few more \type {\expandafters} are needed:
% \unexpanded\def\newif#1% uses the original plain \@if
% {\privatescratchcounter\escapechar
@@ -3953,9 +3935,9 @@
%D {newcounter,
%D increment,decrement}
%D
-%D Unfortunately the number of \COUNTERS\ in \TEX\ is limited,
-%D but fortunately we can store numbers in a macro. We can
-%D increment such pseudo \COUNTERS\ with \type{\increment}.
+%D Unfortunately the number of \COUNTERS\ in \TEX\ is limited, but fortunately we
+%D can store numbers in a macro. We can increment such pseudo \COUNTERS\ with \type
+%D {\increment}.
%D
%D \starttyping
%D \increment(\counter,20)
@@ -3964,9 +3946,8 @@
%D \increment\counter
%D \stoptyping
%D
-%D After this sequence of commands, the value of
-%D \type{\counter} is 20, 16, 17 and~18. Of course there is
-%D also the complementary command \type{\decrement}.
+%D After this sequence of commands, the value of \type {\counter} is 20, 16, 17
+%D and~18. Of course there is also the complementary command \type {\decrement}.
%D
%D Global assignments are possible too, using \type{\doglobal}:
%D
@@ -3974,44 +3955,39 @@
%D \doglobal\increment\counter
%D \stoptyping
%D
-%D When \type{\counter} is undefined, it's value is initialized
-%D at~0. It is nevertheless better to define a \COUNTER\
-%D explicitly. One reason could be that the \COUNTER\ can be
-%D part of a test with \type{\ifnum} and this conditional does
-%D not accept undefined macro's. The \COUNTER\ in our example
-%D can for instance be defined with:
+%D When \type {\counter} is undefined, it's value is initialized at~0. It is
+%D nevertheless better to define a \COUNTER\ explicitly. One reason could be that
+%D the \COUNTER\ can be part of a test with \type {\ifnum} and this conditional does
+%D not accept undefined macro's. The \COUNTER\ in our example can for instance be
+%D defined with:
%D
%D \starttyping
%D \newcounter\counter
%D \stoptyping
%D
-%D The command \type{\newcounter} must not be confused with
-%D \type{\newcount}! Of course this mechanism is much slower
-%D than using \TEX's \COUNTERS\ directly. In practice
-%D \COUNTERS\ (and therefore our pseudo counters too) are
-%D seldom the bottleneck in the processing of a text. Apart
-%D from some other incompatilities we want to mention a pitfal
-%D when using \type{\ifnum}.
+%D The command \type {\newcounter} must not be confused with \type {\newcount}! Of
+%D course this mechanism is much slower than using \TEX's \COUNTERS\ directly. In
+%D practice \COUNTERS\ (and therefore our pseudo counters too) are seldom the
+%D bottleneck in the processing of a text. Apart from some other incompatilities we
+%D want to mention a pitfal when using \type {\ifnum}.
%D
%D \starttyping
%D \ifnum\normalcounter=\pseudocounter \doif \else \doelse \fi
%D \ifnum\pseudocounter=\normalcounter \doif \else \doelse \fi
%D \stoptyping
%D
-%D In the first test, \TEX\ continues it's search for the
-%D second number after reading \type{\pseudocounter}, while
-%D in the second test, it stops reading after having
-%D encountered a real one. Tests like the first one therefore
-%D can give unexpected results, for instance execution
-%D of \type{\doif} even if both numbers are unequal.
+%D In the first test, \TEX\ continues it's search for the second number after
+%D reading \type {\pseudocounter}, while in the second test, it stops reading after
+%D having encountered a real one. Tests like the first one therefore can give
+%D unexpected results, for instance execution of \type {\doif} even if both numbers
+%D are unequal.
\def\zerocountervalue{0}
\unexpanded\def\newcounter#1%
{\dodoglobal\let#1\zerocountervalue}
-%D Nowadays we don't mind a few more tokens if we can gain a
-%D bit of speed.
+%D Nowadays we don't mind a few more tokens if we can gain a bit of speed.
\def\syst_helpers_do_increment#1{\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi+\plusone \relax}}
\def\syst_helpers_do_decrement#1{\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi+\minusone\relax}}
@@ -4019,34 +3995,39 @@
\def\syst_helpers_do_do_do_increment#1,#2){\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi+#2\relax}}
\def\syst_helpers_do_do_do_decrement#1,#2){\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi-#2\relax}}
-\def\syst_helpers_do_do_increment(#1{\doifelsenextchar,{\syst_helpers_do_do_do_increment#1}{\syst_helpers_do_do_do_increment#1,\plusone}}
-\def\syst_helpers_do_do_decrement(#1{\doifelsenextchar,{\syst_helpers_do_do_do_decrement#1}{\syst_helpers_do_do_do_decrement#1,\plusone}}
+\def\syst_helpers_do_do_increment(#1%
+ {\def\m_syst_action_yes{\syst_helpers_do_do_do_increment#1}%
+ \def\m_syst_action_nop{\syst_helpers_do_do_do_increment#1,\plusone}%
+ \doifelsenextcharcs,\m_syst_action_yes\m_syst_action_nop}
+
+\def\syst_helpers_do_do_decrement(#1%
+ {\def\m_syst_action_yes{\syst_helpers_do_do_do_decrement#1}%
+ \def\m_syst_action_nop{\syst_helpers_do_do_do_decrement#1,\plusone}%
+ \doifelsenextcharcs,\m_syst_action_yes\m_syst_action_nop}
+
+\unexpanded\def\increment{\doifelsenextcharcs(\syst_helpers_do_do_increment\syst_helpers_do_increment}
+\unexpanded\def\decrement{\doifelsenextcharcs(\syst_helpers_do_do_decrement\syst_helpers_do_decrement}
\unexpanded\def\fastincrement#1{\dodoglobal\edef#1{\the\numexpr#1+\plusone \relax}}
\unexpanded\def\fastdecrement#1{\dodoglobal\edef#1{\the\numexpr#1+\minusone\relax}}
-\unexpanded\def\increment{\doifelsenextchar(\syst_helpers_do_do_increment\syst_helpers_do_increment}
-\unexpanded\def\decrement{\doifelsenextchar(\syst_helpers_do_do_decrement\syst_helpers_do_decrement}
-
\unexpanded\def\incrementvalue#1{\expandafter\increment\csname#1\endcsname}
\unexpanded\def\decrementvalue#1{\expandafter\decrement\csname#1\endcsname}
%D \macros
%D {newsignal}
%D
-%D When writing advanced macros, we cannot do without
-%D signaling. A signal is a small (invisible) kern or penalty
-%D that signals the next macro that something just happened.
-%D This macro can take any action depending on the previous
-%D signal. Signals must be unique and the next macro takes care
-%D of that.
+%D When writing advanced macros, we cannot do without signaling. A signal is a small
+%D (invisible) kern or penalty that signals the next macro that something just
+%D happened. This macro can take any action depending on the previous signal.
+%D Signals must be unique and the next macro takes care of that.
%D
%D \starttyping
%D \newsignal\somesignal
%D \stoptyping
%D
-%D Signals old dimensions and can be used in skips, kerns and
-%D tests like \type{\ifdim}.
+%D Signals old dimensions and can be used in skips, kerns and tests like \type
+%D {\ifdim}.
\newdimen\maximumsignal % step is about 0.00025pt
@@ -4059,8 +4040,7 @@
%D \macros
%D {strippedcsname}
%D
-%D The next macro can be very useful when using \type{\csname}
-%D like in:
+%D The next macro can be very useful when using \type {\csname} like in:
%D
%D \starttyping
%D \csname if\strippedcsname\something\endcsname
@@ -4089,21 +4069,18 @@
%D {dorecurse,recurselevel,recursedepth,
%D dostepwiserecurse}
%D
-%D \TEX\ does not offer us powerfull for||loop mechanisms. On
-%D the other hand its recursion engine is quite unique. We
-%D therefore identify the for||looping macros by this method.
-%D The most simple alternative is the one that only needs a
-%D number.
+%D \TEX\ does not offer us powerfull for||loop mechanisms. On the other hand its
+%D recursion engine is quite unique. We therefore identify the for||looping macros
+%D by this method. The most simple alternative is the one that only needs a number.
%D
%D \starttyping
%D \dorecurse {n} {whatever we want}
%D \stoptyping
%D
-%D This macro can be nested without problems and therefore be
-%D used in situations where \PLAIN\ \TEX's \type{\loop} macro
-%D ungracefully fails. The current value of the counter is
-%D available in \type{\recurselevel}, before as well as after
-%D the \typ{whatever we wat} stuff.
+%D This macro can be nested without problems and therefore be used in situations
+%D where \PLAIN\ \TEX's \type {\loop} macro ungracefully fails. The current value of
+%D the counter is available in \type {\recurselevel}, before as well as after the
+%D \typ {whatever we wat} stuff.
%D
%D \starttyping
%D \dorecurse % inner loop
@@ -4118,14 +4095,12 @@
%D \endgraf}
%D \stoptyping
%D
-%D In this example the first, second and fourth
-%D \type{\recurselevel} concern the outer loop, while the third
-%D and fifth one concern the inner loop. The depth of the
-%D nesting is available for inspection in \type{\recursedepth}.
+%D In this example the first, second and fourth \type {\recurselevel} concern the
+%D outer loop, while the third and fifth one concern the inner loop. The depth of
+%D the nesting is available for inspection in \type {\recursedepth}.
%D
-%D Both \type{\recurselevel} and \type{\recursedepth} are
-%D macros. The real \COUNTERS\ are hidden from the user because
-%D we don't want any interference.
+%D Both \type {\recurselevel} and \type {\recursedepth} are macros. The real
+%D \COUNTERS\ are hidden from the user because we don't want any interference.
\newcount\outerrecurse
\newcount\innerrecurse
@@ -4208,24 +4183,22 @@
#2\expandafter\doexpandedrecurse\expandafter{\the\numexpr#1-\plusone\relax}{#2}%
\fi}
-%D As we can see here, the simple command \type{\dorecurse} is
-%D a special case of the more general:
+%D As we can see here, the simple command \type{\dorecurse} is a special case of the
+%D more general:
%D
%D \starttyping
%D \dostepwiserecurse {from} {to} {step} {action}
%D \stoptyping
%D
-%D This commands accepts positive and negative steps. Illegal
-%D values are handles as good as possible and the macro accepts
-%D numbers and \COUNTERS.
+%D This commands accepts positive and negative steps. Illegal values are handles as
+%D good as possible and the macro accepts numbers and \COUNTERS.
%D
%D \starttyping
%D \dostepwiserecurse {1} {10} {2} {...}
%D \dostepwiserecurse {10} {1} {-2} {...}
%D \stoptyping
%D
-%D Because the simple case is used often, we implement it
-%D more efficiently:
+%D Because the simple case is used often, we implement it more efficiently:
\unexpanded\def\dorecurse#1%
{\ifcase#1\relax
@@ -4291,11 +4264,10 @@
%D \macros
%D {doloop,exitloop}
%D
-%D Sometimes loops are not determined by counters, but by
-%D (a combinations of) conditions. We therefore implement a
-%D straightforward loop, which can only be left when we
-%D explictly exit it. Nesting is supported. First we present
-%D a more extensive alternative.
+%D Sometimes loops are not determined by counters, but by (a combinations of)
+%D conditions. We therefore implement a straightforward loop, which can only be left
+%D when we explictly exit it. Nesting is supported. First we present a more
+%D extensive alternative.
%D
%D \starttyping
%D \doloop
@@ -4303,8 +4275,7 @@
%D \ifnum\pageno>100 \exitloop \fi}
%D \stoptyping
%D
-%D When needed, one can call for \type{\looplevel} and
-%D \type{\loopdepth}.
+%D When needed, one can call for \type {\looplevel} and \type {\loopdepth}.
\let\endofloop\donothing % maybe \syst_helpers_loop_end
@@ -4341,8 +4312,8 @@
%D \doloop {\exitloop some commands}
%D \stoptyping
%D
-%D It's just a matter of putting the text into the \type{\if}
-%D statement that should be there anyway, like in:
+%D It's just a matter of putting the text into the \type {\if} statement that should
+%D be there anyway, like in:
%D
%D \starttyping
%D \doloop {\ifwhatever \exitloop \else some commands\fi}
@@ -4352,10 +4323,9 @@
%D {\exitloopnow} instead. Beware, this is more sensitive
%D for conditional errors.
-%D Krzysztof Leszczynski suggested to provide access to the level by
-%D means of a \type {#1}. I decided to pass the more frequently used
-%D level as \type {#1} and the less favoured depth as \type {#2}. The
-%D intended usage is:
+%D Krzysztof Leszczynski suggested to provide access to the level by means of a
+%D \type {#1}. I decided to pass the more frequently used level as \type {#1} and
+%D the less favoured depth as \type {#2}. The intended usage is:
%D
%D \starttyping
%D \dorecurse{3}{\definesymbol[test-#1][xx-#1]}
@@ -4365,8 +4335,7 @@
%D \symbol[test-1]\quad\symbol[test-2]\quad\symbol[test-3]
%D \stoptyping
%D
-%D Since the hashed arguments are expanded, we don't need tricky
-%D expansion here.
+%D Since the hashed arguments are expanded, we don't need tricky expansion here.
%D
%D \starttyping
%D \dorecurse{3}{\expanded{\definesymbol[test-\recurselevel][xx-\recurselevel]}}
@@ -4494,19 +4463,26 @@
\let\m_syst_helpers_fast_loop_cs\relax
-\unexpanded\def\dofastloopcs#1#2%
- {\let\m_syst_helpers_fast_loop_cs#2%
+\unexpanded\def\dofastloopcs#1%
+ {\fastloopfinal#1\relax
+ \ifcase\fastloopfinal
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\syst_helpers_fast_loop_cs
+ \fi}
+
+\unexpanded\def\syst_helpers_fast_loop_cs#1%
+ {\let\m_syst_helpers_fast_loop_cs#1%
\fastloopindex\plusone
- \fastloopfinal#1\relax
- \syst_helpers_fast_loop_cs}
+ \syst_helpers_fast_loop_cs_step}
-\unexpanded\def\syst_helpers_fast_loop_cs
+\unexpanded\def\syst_helpers_fast_loop_cs_step
{\ifnum\fastloopindex>\fastloopfinal
\let\m_syst_helpers_fast_loop_cs\relax
\else
\m_syst_helpers_fast_loop_cs
\advance\fastloopindex\plusone
- \expandafter\syst_helpers_fast_loop_cs
+ \expandafter\syst_helpers_fast_loop_cs_step
\fi}
% Helper:
@@ -4621,52 +4597,46 @@
\unexpanded\def\forgeteverypar
{\everypar{\the\neverypar}}
-%D Which we're going to use indeed! When the second argument
-%D equals \type {\relax}, the first token list is created
-%D unless it is already defined.
-
-%D Technically spoken we could have used the method we are
-%D going to present in the visual debugger. First we save
-%D the primitive \type{\everypar}:
+%D Which we're going to use indeed! When the second argument equals \type {\relax},
+%D the first token list is created unless it is already defined.
+%D
+%D Technically spoken we could have used the method we are going to present in the
+%D visual debugger. First we save the primitive \type{\everypar}:
%D
%D \starttyping
%D \let\normaleverypar=\everypar
%D \stoptyping
%D
-%D Next we allocate a \TOKENLIST\ named \type{\everypar},
-%D which means that \type{\everypar} is no longer a primitive
-%D but something like \type{\toks44}.
+%D Next we allocate a \TOKENLIST\ named \type{\everypar}, which means that
+%D \type{\everypar} is no longer a primitive but something like \type{\toks44}.
%D
%D \starttyping
%D \newtoks\everypar
%D \stoptyping
%D
-%D Because \TEX\ now executes \type{\normaleverypar} instead
-%D of \type{\everypar}, we are ready to assign some tokens to
-%D this internally known and used \TOKENLIST.
+%D Because \TEX\ now executes \type{\normaleverypar} instead of \type{\everypar}, we
+%D are ready to assign some tokens to this internally known and used \TOKENLIST.
%D
%D \starttyping
%D \normaleverypar={all the things the system wants to do \the\everypar}
%D \stoptyping
%D
-%D Where the user can provide his own tokens to be expanded
-%D every time he expects them to expand.
+%D Where the user can provide his own tokens to be expanded every time he expects
+%D them to expand.
%D
%D \starttyping
%D \everypar={something the user wants to do}
%D \stoptyping
%D
-%D We don't use this method because it undoubtly leads to
-%D confusing situations, especially when other packages are
-%D used, but it's this kind of tricks that make \TEX\ so
-%D powerful.
+%D We don't use this method because it undoubtly leads to confusing situations,
+%D especially when other packages are used, but it's this kind of tricks that make
+%D \TEX\ so powerful.
%D \macros
%D {convertargument,convertcommand,convertvalue}
%D
-%D Some persistent experimenting led us to the next macro. This
-%D macro converts a parameter or an expanded macro to it's
-%D textual meaning.
+%D Some persistent experimenting led us to the next macro. This macro converts a
+%D parameter or an expanded macro to it's textual meaning.
%D
%D \starttyping
%D \convertargument ... \to \command
@@ -4678,9 +4648,9 @@
%D \convertargument{one \two \three{four}}\to\ascii
%D \stoptyping
%D
-%D The resulting macro \type{\ascii} can be written to a file
-%D or the terminal without problems. In \CONTEXT\ we use this
-%D macro for generating registers and tables of contents.
+%D The resulting macro \type{\ascii} can be written to a file or the terminal
+%D without problems. In \CONTEXT\ we use this macro for generating registers and
+%D tables of contents.
%D
%D The second conversion alternative accepts a command:
%D
@@ -4688,8 +4658,7 @@
%D \convertcommand\command\to\ascii
%D \stoptyping
%D
-%D Both commands accept the prefix \type{\doglobal} for global
-%D assignments.
+%D Both commands accept the prefix \type{\doglobal} for global assignments.
\unexpanded\def\convertvalue#1\to
{\expandafter\convertcommand\csname#1\endcsname\to}
@@ -4700,8 +4669,7 @@
%D \macros
%D {doifassignmentelse}
%D
-%D A lot of \CONTEXT\ commands take optional arguments, for
-%D instance:
+%D A lot of \CONTEXT\ commands take optional arguments, for instance:
%D
%D \starttyping
%D \dothisorthat[alfa,beta]
@@ -4709,25 +4677,25 @@
%D \dothisorthat[alfa,beta][first=foo,second=bar]
%D \stoptyping
%D
-%D Although a combined solution is possible, we prefer a
-%D seperation. The next command takes care of propper
-%D handling of such multi||faced commands.
+%D Although a combined solution is possible, we prefer a seperation. The next
+%D command takes care of propper handling of such multi||faced commands.
%D
%D \starttyping
%D \doifassignmentelse {...} {then ...} {else ...}
%D \stoptyping
-\def\syst_helpers_check_if_assignment_else#1=#2#3\_e_o_p_{\if#2@}%
+\def\syst_helpers_check_if_assignment_else#1=#2#3^^^^0004{\if#2^^^^0003}%
+\def\syst_helpers_check_else_assignment_if#1=#2#3^^^^0004{\unless\if#2^^^^0003}%
\unexpanded\def\doifelseassignment#1%
- {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=@@\_e_o_p_
+ {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=^^^^0003^^^^0003^^^^0004%
\expandafter\secondoftwoarguments
\else
\expandafter\firstoftwoarguments
\fi}
\unexpanded\def\doifelseassignmentcs#1#2#3%
- {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=@@\_e_o_p_
+ {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=^^^^0003^^^^0003^^^^0004%
\expandafter#3%
\else
\expandafter#2%
@@ -4739,18 +4707,24 @@
\newif\ifassignment
\unexpanded\def\docheckassignment#1%
- {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=@@\_e_o_p_
+ {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=^^^^0003^^^^0003^^^^0004%
\assignmentfalse
\else
\assignmenttrue
\fi}
-%D In \ETEX\ we can use \type {\detokenize} and gain some
-%D speed, but in general far less that 1\% for \type
-%D {\convertargument} and nil for \type {\convertcommand}.
-%D This macro is more robust than the pure \TEX\ one,
-%D something I found out when primitives like \type
-%D {\jobname} were fed (or something undefined).
+%D These can be used for cases where we want less tracing noise.
+
+\unexpanded\def\validassignment#1%
+ {\expandafter\syst_helpers_check_else_assignment_if\detokenize{#1}=^^^^0003^^^^0003^^^^0004}
+
+\unexpanded\def\novalidassignment#1%
+ {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=^^^^0003^^^^0003^^^^0004}
+
+%D In \ETEX\ we can use \type {\detokenize} and gain some speed, but in general far
+%D less that 1\% for \type {\convertargument} and nil for \type {\convertcommand}.
+%D This macro is more robust than the pure \TEX\ one, something I found out when
+%D primitives like \type {\jobname} were fed (or something undefined).
\unexpanded\def\convertargument#1\to#2{\dodoglobal\edef#2{\detokenize{#1}}}
\unexpanded\def\convertcommand #1\to#2{\dodoglobal\edef#2{\expandafter\detokenize\expandafter{#1}}} % hm, only second is also ok
@@ -4764,23 +4738,21 @@
\unexpanded\def\xdefconvertedargument#1#2{\xdef#1{#2}%
\xdef#1{\detokenize\expandafter{#1}}}
-%D When you try to convert a primitive command, you'll find
-%D out that the \ETEX\ method fails on for instance \type
-%D {\jobname} in the sense that it returns the filename
-%D instead of just \type {\jobname}. So far this does not
-%D give real problems.
+%D When you try to convert a primitive command, you'll find out that the \ETEX\
+%D method fails on for instance \type {\jobname} in the sense that it returns the
+%D filename instead of just \type {\jobname}. So far this does not give real
+%D problems.
-%D This is typically a macro that one comes to after reading
-%D the \TEX book carefully. Even then, the definite solution
-%D was found after rereading the \TEX book. The first
-%D implementation was:
+%D This is typically a macro that one comes to after reading the \TEX book
+%D carefully. Even then, the definite solution was found after rereading the \TEX
+%D book. The first implementation was:
%D
%D \starttyping
%D \def\doconvertargument#1->#2\\\\{#2}
%D \stoptyping
%D
-%D The \type{-}, the delimiter \type{\\\\} and the the second
-%D argument are completely redundant.
+%D The \type {-}, the delimiter \type {\\\\} and the the second argument are
+%D completely redundant.
%D \macros
%D {showvalue}
@@ -4797,10 +4769,9 @@
%D \macros
%D {doifmeaningelse}
%D
-%D We can use both commands in testing, but alas, not all
-%D meanings expand to something \type {->}. This is no problem
-%D in the \ETEX\ implementation, but since we want
-%D compatibility, we need:
+%D We can use both commands in testing, but alas, not all meanings expand to
+%D something \type {->}. This is no problem in the \ETEX\ implementation, but since
+%D we want compatibility, we need:
%D
%D \starttyping
%D \doifmeaningelse {\next} {\something} {true} {false}
@@ -4823,9 +4794,9 @@
%D \macros
%D {doifsamestringselse,doifsamestring,doifnotsamestring}
%D
-%D The next comparison macro converts the arguments into
-%D expanded strings. This command can be used to compare for
-%D instance \type {\jobname} with a name stored in a macro.
+%D The next comparison macro converts the arguments into expanded strings. This
+%D command can be used to compare for instance \type {\jobname} with a name stored
+%D in a macro.
%D
%D \starttyping
%D \doifelse {\jobname}{oeps}{YES}{NO}
@@ -4846,18 +4817,17 @@
%D \macros
%D {ConvertToConstant,ConvertConstantAfter}
%D
-%D When comparing arguments with a constant, we can get into
-%D trouble when this argument consists of tricky expandable
-%D commands. One solution for this is converting the
-%D argument to a string of unexpandable characters. To make
-%D comparison possible, we have to convert the constant too
+%D When comparing arguments with a constant, we can get into trouble when this
+%D argument consists of tricky expandable commands. One solution for this is
+%D converting the argument to a string of unexpandable characters. To make
+%D comparison possible, we have to convert the constant too.
%D
%D \starttyping
%D \ConvertToConstant\doifelse {...} {...} {then ...} {else ...}
%D \stoptyping
%D
-%D This construction is only needed when the first argument
-%D can give troubles. Misuse can slow down processing.
+%D This construction is only needed when the first argument can give troubles.
+%D Misuse can slow down processing.
%D
%D \starttyping
%D \ConvertToConstant\doifelse{\c!alfa} {\c!alfa}{...}{...}
@@ -4866,16 +4836,14 @@
%D \ConvertToConstant\doifelse{alfa \alfa test}{\c!alfa}{...}{...}
%D \stoptyping
%D
-%D In examples~2 and~3 both arguments equal, in~1 and~4
-%D they differ.
+%D In examples~2 and~3 both arguments equal, in~1 and~4 they differ.
\unexpanded\def\ConvertToConstant#1#2#3%
{\edef\m_syst_string_one{\expandafter\detokenize\expandafter{#2}}%
\edef\m_syst_string_two{\expandafter\detokenize\expandafter{#3}}%
#1{\m_syst_string_one}{\m_syst_string_two}}
-%D When the argument \type{#1} consists of commands, we had
-%D better use
+%D When the argument \type{#1} consists of commands, we had better use
%D
%D \starttyping
%D \ConvertConstantAfter\processaction[#1][...]
@@ -4890,8 +4858,7 @@
%D \hbox to \hsize{\rubish}
%D \stoptyping
%D
-%D As we will see in the core modules, this macro permits
-%D constructions like:
+%D As we will see in the core modules, this macro permits constructions like:
%D
%D \starttyping
%D \setupfootertexts[...][...]
@@ -4899,7 +4866,7 @@
%D \setupfootertexts[\v!margin][...][...]
%D \stoptyping
%D
-%D where \type{...} can be anything legally \TEX.
+%D where \type {...} can be anything legally \TEX.
\unexpanded\def\CheckConstantAfter#1#2%
{\expandafter\convertargument\v!prefix!\to\ascii
@@ -4931,33 +4898,28 @@
%D {gobbleuntil,grabuntil,gobbleuntilrelax,
%D processbetween,processuntil}
%D
-%D In \TEX\ gobbling usually stand for skipping arguments, so
-%D here are our gobbling macros.
-%D
-%D In \CONTEXT\ we use a lot of \type{\start}||\type{\stop}
-%D like constructions. Sometimes, the \type{\stop} is used as a
-%D hard coded delimiter like in:
+%D In \TEX\ gobbling usually stand for skipping arguments, so here are our gobbling
+%D macros.
%D
+%D In \CONTEXT\ we use a lot of \type {\start}||\type {\stop} like constructions.
+%D Sometimes, the \type {\stop} is used as a hard coded delimiter like in: %D
%D \starttyping
%D \unexpanded\def\startcommand#1\stopcommand%
%D {... #1 ...}
%D \stoptyping
%D
-%D In many cases the \type{\start}||\type{\stop} pair is
-%D defined at format generation time or during a job. This
-%D means that we cannot hardcode the \type{\stop} criterium.
-%D Only after completely understanding \type{\csname} and
-%D \type{\expandafter} I was able to to implement a solution,
-%D starting with:
+%D In many cases the \type {\start}||\type {\stop} pair is defined at format
+%D generation time or during a job. This means that we cannot hardcode the \type
+%D {\stop} criterium. Only after completely understanding \type {\csname} and \type
+%D {\expandafter} I was able to to implement a solution, starting with:
%D
%D \starttyping
%D \grabuntil{stop}\command
%D \stoptyping
%D
-%D This commands executes, after having encountered
-%D \type {\stop} the command \type {\command}. This command
-%D receives as argument the text preceding the \type {\stop}.
-%D This means that:
+%D This commands executes, after having encountered \type {\stop} the command \type
+%D {\command}. This command receives as argument the text preceding the \type
+%D {\stop}. This means that:
%D
%D \starttyping
%D \unexpanded\def\starthello%
@@ -5288,7 +5250,7 @@
\unexpanded\def\pickupgroupedcommand#1#2#3%
{\def\m_syst_helpers_handle_group_b{#1}%
\def\m_syst_helpers_handle_group_a{#2}%
- \def\m_syst_helpers_handle_group_p{#2}%
+ \def\m_syst_helpers_handle_group_p{#3}%
\doifelsenextbgroupcs\syst_helpers_handle_group_pickup\syst_helpers_handle_group_nop}
\unexpanded\def\triggergroupedcommand#1%
@@ -5312,19 +5274,17 @@
%D \macros
%D {checkdefined}
%D
-%D The bigger the system, the greater the change that
-%D user defined commands collide with those that are part of
-%D the system. The next macro gives a warning when a command is
-%D already defined. We considered blocking the definition, but
-%D this is not always what we want.
+%D The bigger the system, the greater the change that user defined commands collide
+%D with those that are part of the system. The next macro gives a warning when a
+%D command is already defined. We considered blocking the definition, but this is
+%D not always what we want.
%D
%D \starttyping
%D \checkdefined {category} {class} {command}
%D \stoptyping
%D
-%D The user is warned with the suggestion to use
-%D \type{CAPITALS}. This suggestion is feasible, because
-%D \CONTEXT only defines lowcased macros.
+%D The user is warned with the suggestion to use \type {CAPITALS}. This suggestion
+%D is feasible, because \CONTEXT only defines lowcased macros.
\unexpanded\def\showdefinederror#1#2%
{\writestatus\m!system{#1 #2 replaces a macro, use CAPITALS!}}
@@ -5335,10 +5295,9 @@
%D \macros
%D {GotoPar,GetPar}
%D
-%D Typesetting a paragraph in a special way can be done by
-%D first grabbing the contents of the paragraph and processing
-%D this contents grouped. The next macro for instance typesets
-%D a paragraph in boldface.
+%D Typesetting a paragraph in a special way can be done by first grabbing the
+%D contents of the paragraph and processing this contents grouped. The next macro
+%D for instance typesets a paragraph in boldface.
%D
%D \starttyping
%D \def\remark#1\par%
@@ -5351,13 +5310,12 @@
%D \remark some text ... ending with \par
%D \stoptyping
%D
-%D Instead of \type{\par} we can of course use an empty line.
-%D When we started typesetting with \TEX, we already had
-%D produced lots of text in plain \ASCII. In producing such
-%D simple formatted texts, we adopted an open layout, and when
-%D switching to \TEX, we continued this open habit. Although
-%D \TEX\ permits a cramped and badly formatted source, it adds
-%D to confusion and sometimes introduces errors. So we prefer:
+%D Instead of \type {\par} we can of course use an empty line. When we started
+%D typesetting with \TEX, we already had produced lots of text in plain \ASCII. In
+%D producing such simple formatted texts, we adopted an open layout, and when
+%D switching to \TEX, we continued this open habit. Although \TEX\ permits a cramped
+%D and badly formatted source, it adds to confusion and sometimes introduces errors.
+%D So we prefer:
%D
%D \starttyping
%D \remark
@@ -5365,9 +5323,8 @@
%D some text ... ending with an empty line
%D \stoptyping
%D
-%D We are going to implement a mechanism that allows such open
-%D specifications. The definition of the macro handling
-%D \type{\remark} becomes:
+%D We are going to implement a mechanism that allows such open specifications. The
+%D definition of the macro handling \type {\remark} becomes:
%D
%D \starttyping
%D \def\remark%
@@ -5376,15 +5333,13 @@
%D \GetPar}
%D \stoptyping
%D
-%D A macro like \type{\GetPar} can be defined in several
-%D ways. The recent version, the fourth one in a row,
-%D originally was far more complicated, but some functionality
-%D has been moved to other macros.
+%D A macro like \type {\GetPar} can be defined in several ways. The recent version,
+%D the fourth one in a row, originally was far more complicated, but some
+%D functionality has been moved to other macros.
%D
-%D We start with the more simple but in some cases more
-%D appropriate alternative is \type{\GotoPar}. This one leaves
-%D \type{\par} unchanged and is therefore more robust. On the
-%D other hand, \type{\AfterPar} is not supported.
+%D We start with the more simple but in some cases more appropriate alternative is
+%D \type {\GotoPar}. This one leaves \type {\par} unchanged and is therefore more
+%D robust. On the other hand, \type {\AfterPar} is not supported.
\newtoks\BeforePar
\newtoks\AfterPar
@@ -5425,12 +5380,10 @@
%D \macros
%D {dowithpargument,dowithwargument}
%D
-%D The next macros are a variation on \type{\GetPar}. When
-%D macros expect an argument, it interprets a grouped sequence
-%D of characters a one token. While this adds to robustness and
-%D less ambiguous situations, we sometimes want to be a bit
-%D more flexible, or at least want to be a bit more tolerant
-%D to user input.
+%D The next macros are a variation on \type {\GetPar}. When macros expect an
+%D argument, it interprets a grouped sequence of characters a one token. While this
+%D adds to robustness and less ambiguous situations, we sometimes want to be a bit
+%D more flexible, or at least want to be a bit more tolerant to user input.
%D
%D We start with a commands that acts on paragraphs. This
%D command is called as:
@@ -5440,11 +5393,10 @@
%D \dowithpargument{\command ... }
%D \stoptyping
%D
-%D In \CONTEXT\ we use this one to read in the titles of
-%D chapters, sections etc. The commands responsible for these
-%D activities accept several alternative ways of argument
-%D passing. In these examples, the \type{\par} can be omitted
-%D when an empty line is present.
+%D In \CONTEXT\ we use this one to read in the titles of chapters, sections etc. The
+%D commands responsible for these activities accept several alternative ways of
+%D argument passing. In these examples, the \type {\par} can be omitted when an
+%D empty line is present.
%D
%D \starttyping
%D \command{...}
@@ -5463,18 +5415,16 @@
\def\syst_helpers_next_arg##1{#1{##1}}%
\doifelsenextbgroup\syst_helpers_next_arg{\doifelsenextchar\par{#1{}}\syst_helpers_next_par}}
-%D The \type{p} in the previous command stands for paragraph.
-%D When we want to act upon words we can use the \type{w}
-%D alternative.
+%D The \type {p} in the previous command stands for paragraph. When we want to act
+%D upon words we can use the \type{w} alternative.
%D
%D \starttyping
%D \dowithwargument\command
%D \dowithwargument{... \command ...}
%D \stoptyping
%D
-%D The main difference bwteen two alternatives is in the
-%D handling of \type{\par}'s. This time the space token acts
-%D as a delimiter.
+%D The main difference bwteen two alternatives is in the handling of \type {\par}'s.
+%D This time the space token acts as a delimiter.
%D
%D \starttyping
%D \command{...}
@@ -5496,9 +5446,8 @@
%D \macros
%D {dorepeat,dorepeatwithcommand}
%D
-%D When doing repetitive tasks, we stromgly advice to use
-%D \type{\dorecurse}. The next alternative however, suits
-%D better some of the \CONTEXT\ interface commands.
+%D When doing repetitive tasks, we stromgly advice to use \type {\dorecurse}. The
+%D next alternative however, suits better some of the \CONTEXT\ interface commands.
%D
%D \starttyping
%D \dorepeat[n*\command]
@@ -5519,9 +5468,9 @@
%D \dorepeatwithcommand[3*{Hello}]\message
%D \stoptyping
%D
-%D we get ourselves three \type{\message{Hello}} messages in
-%D a row. In both commands, the \type{n*} is optional. When this
-%D specification is missing, the command executes once.
+%D we get ourselves three \type {\message{Hello}} messages in a row. In both
+%D commands, the \type {n*} is optional. When this specification is missing, the
+%D command executes once.
\unexpanded\def\dorepeatwithcommand[#1]%
{\syst_helpers_repeat_with_command#1*\empty*\relax}
@@ -5565,8 +5514,8 @@
%D \macros
%D {doifstringinstringelse}
%D
-%D The next macro is meant for situations where both strings
-%D are macros. This save some unneeded expansion.
+%D The next macro is meant for situations where both strings are macros. This save
+%D some unneeded expansion.
%D
%D \starttyping
%D \def\doifstringinstringelse#1#2%
@@ -5587,9 +5536,9 @@
\fi}
\def\doifelsestringinstring#1#2%
- {\expandafter\def\expandafter\syst_helpers_if_instring_else\expandafter##\expandafter1#1##2##3\_e_o_s_
+ {\expandafter\def\expandafter\syst_helpers_if_instring_else\expandafter##\expandafter1#1##2##3^^^^0004%
{\syst_helpers_if_instring_else_indeed##2}%
- \expandafter\expandafter\expandafter\syst_helpers_if_instring_else\expandafter#2#1@@\_e_o_s_}
+ \expandafter\expandafter\expandafter\syst_helpers_if_instring_else\expandafter#2#1@@^^^^0004}
\let\doifstringinstringelse\doifelsestringinstring
@@ -5597,9 +5546,8 @@
%D {appendtoks,prependtoks,appendtoksonce,prependtoksonce,
%D doifintokselse,flushtoks,dotoks}
%D
-%D We use \TOKENLISTS\ sparsely within \CONTEXT, because the
-%D comma separated lists are more suitable for the user
-%D interface. Nevertheless we have:
+%D We use tokenlists sparsely within \CONTEXT, because the comma separated lists are
+%D more suitable for the user interface. Nevertheless we have:
%D
%D \starttyping
%D (\doglobal) \appendtoks ... \to\tokenlist
@@ -5608,8 +5556,7 @@
%D \dotoks\tokenlist
%D \stoptyping
%D
-%D These macros are clones of the ones implemented in page~378 of
-%D Knuth's \TeX book.
+%D These macros are clones of the ones implemented in page~378 of Knuth's \TEX book.
\newtoks\t_syst_helpers_scratch
\let \m_syst_helpers_scratch\empty
@@ -5651,29 +5598,61 @@
% \donothing
% \syst_helpers_prepend_toks_indeed}
+% \unexpanded\def\appendtoks#1\to#2%
+% {\toksapp#2{#1}%
+% \ifx\dodoglobal\relax\else
+% \dodoglobal#2#2%
+% \fi}
+%
+% \unexpanded\def\prependtoks#1\to#2%
+% {\tokspre#2{#1}%
+% \ifx\dodoglobal\relax\else
+% \dodoglobal#2#2%
+% \fi}
+%
+% \def\syst_helpers_append_toks_indeed
+% {\toksapp\m_syst_helpers_scratch\t_syst_helpers_scratch
+% \ifx\dodoglobal\relax\else
+% \dodoglobal\m_syst_helpers_scratch\m_syst_helpers_scratch
+% \fi}
+%
+% \def\syst_helpers_prepend_toks_indeed
+% {\tokspre\m_syst_helpers_scratch\t_syst_helpers_scratch
+% \ifx\dodoglobal\relax\else
+% \dodoglobal\m_syst_helpers_scratch\m_syst_helpers_scratch
+% \fi}
+
\unexpanded\def\appendtoks#1\to#2%
- {\toksapp#2{#1}%
- \ifx\dodoglobal\relax\else
- \global#2#2%
- \fi}
+ {\ifx\dodoglobal\relax
+ \expandafter\toksapp
+ \else
+ \resetglobal
+ \expandafter\gtoksapp
+ \fi#2{#1}}
\unexpanded\def\prependtoks#1\to#2%
- {\tokspre#2{#1}%
- \ifx\dodoglobal\relax\else
- \global#2#2%
- \fi}
+ {\ifx\dodoglobal\relax
+ \expandafter\tokspre
+ \else
+ \resetglobal
+ \expandafter\gtokspre
+ \fi#2{#1}}
\def\syst_helpers_append_toks_indeed
- {\toksapp\m_syst_helpers_scratch\t_syst_helpers_scratch
- \ifx\dodoglobal\relax\else
- \global\m_syst_helpers_scratch\m_syst_helpers_scratch
- \fi}
+ {\ifx\dodoglobal\relax
+ \expandafter\toksapp
+ \else
+ \resetglobal
+ \expandafter\gtoksapp
+ \fi\m_syst_helpers_scratch\t_syst_helpers_scratch}
\def\syst_helpers_prepend_toks_indeed
- {\tokspre\m_syst_helpers_scratch\t_syst_helpers_scratch
- \ifx\dodoglobal\relax\else
- \global\m_syst_helpers_scratch\m_syst_helpers_scratch
- \fi}
+ {\ifx\dodoglobal\relax
+ \expandafter\tokspre
+ \else
+ \resetglobal
+ \expandafter\gtokspre
+ \fi\m_syst_helpers_scratch\t_syst_helpers_scratch}
\unexpanded\def\appendtoksonce#1\to#2%
{\let\m_syst_helpers_scratch#2%
@@ -5698,9 +5677,9 @@
\let\doifintokselse\doifelseintoks
-%D Moved from \type{lxml-ini.tex} to here. This one is for generators that
-%D collect stuff piecewise, which is sometimes hard on mechanisms that
-%D grab content using delimiters:
+%D Moved from \type {lxml-ini.tex} to here. This one is for generators that collect
+%D stuff piecewise, which is sometimes hard on mechanisms that grab content using
+%D delimiters:
%D
%D \starttyping
%D \startcollecting
@@ -5737,27 +5716,43 @@
% {\scratchtoks{a\relax b} \removetoks \relax\from\scratchtoks [\showthe\scratchtoks]}
\unexpanded\def\removetoks#1\from#2%
- {\def\syst_helpers_remove_toks##1#1##2\empty\empty\empty##3\_e_o_t_
+ {\def\syst_helpers_remove_toks##1#1##2\empty\empty\empty##3^^^^0004%
{\def\m_syst_string_one{##3}%
\ifx\m_syst_string_one\empty#2{##1}\else#2{##1##2}\fi}%
- \expandafter\syst_helpers_remove_toks\the#2\empty\empty\empty#1\empty\empty\empty\_e_o_t_}
+ \expandafter\syst_helpers_remove_toks\the#2\empty\empty\empty#1\empty\empty\empty^^^^0004}
%D Also:
% \unexpanded\def\appendetoks #1\to{\normalexpanded{\appendtoks #1}\to}
% \unexpanded\def\prependetoks#1\to{\normalexpanded{\prependtoks#1}\to}
+% \unexpanded\def\appendetoks#1\to#2%
+% {\etoksapp#2{#1}%
+% \ifx\dodoglobal\relax\else
+% \global#2#2%
+% \fi}
+%
+% \unexpanded\def\prependetoks#1\to#2%
+% {\etokspre#2{#1}%
+% \ifx\dodoglobal\relax\else
+% \global#2#2%
+% \fi}
+
\unexpanded\def\appendetoks#1\to#2%
- {\etoksapp#2{#1}%
- \ifx\dodoglobal\relax\else
- \global#2#2%
- \fi}
+ {\ifx\dodoglobal\relax
+ \expandafter\etoksapp
+ \else
+ \resetglobal
+ \expandafter\xtoksapp
+ \fi#2{#1}}
\unexpanded\def\prependetoks#1\to#2%
- {\etokspre#2{#1}%
- \ifx\dodoglobal\relax\else
- \global#2#2%
- \fi}
+ {\ifx\dodoglobal\relax
+ \expandafter\etokspre
+ \else
+ \resetglobal
+ \expandafter\xtokspre
+ \fi#2{#1}}
%D Hm.
@@ -5781,11 +5776,10 @@
%D \aftersplitstring test.tex\at.\to\extension
%D \stoptyping
%D
-%D The first routine looks (and is indeed) a bit simpler than
-%D the second one. The alternative looking more or less like
-%D the first one did not always give the results we needed.
-%D Both implementations show some insight in the manipulation
-%D of arguments.
+%D The first routine looks (and is indeed) a bit simpler than the second one. The
+%D alternative looking more or less like the first one did not always give the
+%D results we needed. Both implementations show some insight in the manipulation of
+%D arguments.
\let\syst_helpers_split_string\relax
@@ -5890,10 +5884,9 @@
%D {appendtocommalist,prependtocommalist,
%D addtocommalist,removefromcommalist}
%D
-%D When working with comma separated lists, one sooner or
-%D later want the tools to append or remove items from such a
-%D list. When we add an item, we first check if it's already
-%D there. This means that every item in the list is unique.
+%D When working with comma separated lists, one sooner or later want the tools to
+%D append or remove items from such a list. When we add an item, we first check if
+%D it's already there. This means that every item in the list is unique.
%D
%D \starttyping
%D \addtocommalist {alfa} \name
@@ -5902,22 +5895,18 @@
%D \removefromcommalist {beta} \name
%D \stoptyping
%D
-%D These commands can be prefixed with \type{\doglobal}. The
-%D implementation of the second command is more complecated,
-%D because we have to take leading spaces into account. Keep in
-%D mind that users may provide lists with spaces after the
-%D commas. When one item is left, we also have to get rid of
-%D trailing spaces.
+%D These commands can be prefixed with \type {\doglobal}. The implementation of the
+%D second command is more complecated, because we have to take leading spaces into
+%D account. Keep in mind that users may provide lists with spaces after the commas.
+%D When one item is left, we also have to get rid of trailing spaces.
%D
%D \starttyping
%D \def\words{alfa, beta, gamma, delta}
%D \def\words{alfa,beta,gamma,delta}
%D \stoptyping
%D
-%D Removing an item takes more time than adding one.
-%D
-%D A fast appending alternative, without any testing, is
-%D also provided:
+%D Removing an item takes more time than adding one. A fast appending alternative,
+%D without any testing, is also provided:
%D
%D \starttyping
%D \appendtocommalist {something} \name
@@ -6003,8 +5992,7 @@
%D \macros
%D {substituteincommalist}
%D
-%D Slow but seldom used, so for the moment we stick to this
-%D implementation.
+%D Slow but seldom used, so for the moment we stick to this implementation.
%D
%D \starttyping
%D \substituteincommalist{old}{new}{list}
@@ -6094,10 +6082,9 @@
%D \macros
%D {globalprocesscommalist}
%D
-%D The commalist processing commands are characterized by the
-%D fact that the way they handle expansion as well as the fact
-%D that they can be nested. This makes them kind of useless for
-%D handling comma lists in alignments. In these situations the
+%D The commalist processing commands are characterized by the fact that the way they
+%D handle expansion as well as the fact that they can be nested. This makes them
+%D kind of useless for handling comma lists in alignments. In these situations the
%D next macro can be of use.
\let\m_syst_helpers_comma_list_command_global\empty
@@ -6130,13 +6117,11 @@
\def\withoutpt#1%
{\expandafter\WITHOUTPT#1}
-%D The capitals are needed because \type{p} and \type{t} have
-%D \CATCODE~12, while macronames only permit tokens with the
-%D \CATCODE~11. As a result we cannot use the \type{.group}
-%D primitives. Those who want to know more about this kind of
-%D manipulations, we advice to study the \TEX book in detail.
-%D Because this macro does not do any assignment, we can use it
-%D in the following way too.
+%D The capitals are needed because \type {p} and \type {t} have catcode~12, while
+%D macronames only permit tokens with the catcode~11. As a result we cannot use the
+%D \type {.group} primitives. Those who want to know more about this kind of
+%D manipulations, we advice to study the \TEX book in detail. Because this macro
+%D does not do any assignment, we can use it in the following way too.
\def\PtToCm#1%
{\withoutpt\the\dimexpr0.0351459804\dimexpr#1\relax\relax cm}
@@ -6160,8 +6145,8 @@
%D {swapdimens,swapcounts,swapmacros,
%D globalswapdimens,globalswapcounts,globalswapmacros}
%D
-%D Simple but effective are the next two macros. There name
-%D exactly states their purpose.
+%D Simple but effective are the next two macros. There name exactly states their
+%D purpose.
\newdimen\d_syst_helpers_swapped
\newcount\c_syst_helpers_swapped
@@ -6273,10 +6258,9 @@
%D \macros
%D {setlocalhsize,distributedhsize}
%D
-%D Sometimes we need to work with the \type{\hsize} that is
-%D corrected for indentation and left and right skips. The
-%D corrected value is available in \type{\localhsize}, which
-%D needs to be calculated with \type{\setlocalhsize} first.
+%D Sometimes we need to work with the \type{ \hsize} that is corrected for
+%D indentation and left and right skips. The corrected value is available in \type
+%D {\localhsize}, which needs to be calculated with \type {\setlocalhsize} first. %D
%D
%D \starttyping
%D \setlocalhsize \hbox to \localhsize{...}
@@ -6284,8 +6268,8 @@
%D \setlocalhsize[.5ex] \hbox to \localhsize{...}
%D \stoptyping
%D
-%D These examples show us that an optional can be used. The
-%D value provided is added to \type{\localhsize}.
+%D These examples show us that an optional can be used. The value provided is added
+%D to \type {\localhsize}.
\newdimen\localhsize
@@ -6320,11 +6304,10 @@
%D doifnothing,doifsomething,doifelsenothing,
%D doifvaluenothing,doifvaluesomething,doifelsevaluenothing}
%D
-%D These long named \type{\if} commands can be used to access
-%D macros (or variables) that are normally accessed by using
-%D \type{\getvalue}. Using these alternatives safes us three
-%D tokens per call. Anyone familiar with the not||values
-%D ones, can derive their meaning from the definitions.
+%D These \type {\if} commands can be used to access macros (or variables) that are
+%D normally accessed by using \type {\getvalue}. Using these alternatives safes us
+%D three tokens per call. Anyone familiar with the not||values ones, can derive
+%D their meaning from the definitions.
\unexpanded\def\doifvalue#1#2%
{\edef\m_syst_string_one{\csname#1\endcsname}%
@@ -6445,9 +6428,8 @@
%D \macros
%D {doifallcommonelse}
%D
-%D A complete match of two sets can be tested with
-%D \type {\doifallcommonelse}, where the first two
-%D arguments are sets.
+%D A complete match of two sets can be tested with \type {\doifallcommonelse}, where
+%D the first two arguments are sets.
\def\syst_helpers_do_if_all_common_else#1#2#3#4% slow
{\def\syst_helpers_do_common_check_all##1%
@@ -6466,10 +6448,9 @@
%D \macros
%D {DOIF,DOIFELSE,DOIFNOT}
%D
-%D \TEX\ is case sensitive. When comparing arguments, this
-%D feature sometimes is less desirable, for instance when we
-%D compare filenames. The next three alternatives upcase their
-%D arguments before comparing them.
+%D \TEX\ is case sensitive. When comparing arguments, this feature sometimes is less
+%D desirable, for instance when we compare filenames. The next three alternatives
+%D upcase their arguments before comparing them.
%D
%D \starttyping
%D \DOIF {string1} {string2} {...}
@@ -6521,8 +6502,7 @@
%D dodoubleargumentwithset,dodoubleemptywithset,
%D dotripleargumentwithset,dotripleemptywithset}
%D
-%D These maybe too mysterious macros enable us to handle more
-%D than one setup at once.
+%D These maybe too mysterious macros enable us to handle more than one setup at once.
%D
%D \starttyping
%D \dosingleargumentwithset \command[#1]
@@ -6532,10 +6512,9 @@
%D \dotripleemptywithset \command[#1][#2][#3]
%D \stoptyping
%D
-%D The first macro calls \type{\command[##1]} for each string
-%D in the set~\type{#1}. The second one calls for
-%D \type{\commando[##1][#2]} and the third, well one may guess.
-%D These commands support constructions like:
+%D The first macro calls \type {\command[##1]} for each string in the set~\type
+%D {#1}. The second one calls for \typ {\command [##1][#2]} and the third, well one
+%D may guess. These commands support constructions like:
%D
%D \starttyping
%D \def\dodefinesomething[#1][#2]%
@@ -6555,12 +6534,12 @@
\let\syst_helpers_with_set_step \relax
\def\syst_helpers_with_set_double[#1][#2]%
- {\doifsomething{#1}
+ {\doifsomething{#1}%
{\def\syst_helpers_with_set_step##1{\m_syst_helpers_with_set_command[##1][#2]}%
\processcommalist[#1]\syst_helpers_with_set_step}}
\def\syst_helpers_with_set_triple[#1][#2][#3]%
- {\doifsomething{#1}
+ {\doifsomething{#1}%
{\def\syst_helpers_with_set_step##1{\m_syst_helpers_with_set_command[##1][#2][#3]}%
\processcommalist[#1]\syst_helpers_with_set_step}}
@@ -6573,13 +6552,11 @@
%D \macros
%D {stripcharacters,stripspaces}
%D
-%D The next command was needed first when we implemented
-%D the \CONTEXT\ interactivity macros. When we use labeled
-%D destinations, we often cannot use all the characters we
-%D want. We therefore strip some of the troublemakers, like
-%D spaces, from the labels before we write them to the
-%D \DVI||file, which passes them to for instance a PostScript
-%D file.
+%D The next command was needed first when we implemented the \CONTEXT\ interactivity
+%D macros. When we use labeled destinations, we often cannot use all the characters
+%D we want. We therefore strip some of the troublemakers, like spaces, from the
+%D labels before we write them to the \DVI||file, which passes them to for instance
+%D a \POSTSCRIPT\ file.
%D
%D \starttyping
%D \stripspaces\from\one\to\two
@@ -6592,8 +6569,8 @@
%D \stripcharacter\char\from\one\to\two
%D \stoptyping
%D
-%D As we can see below, spaces following a control sequence are
-%D to enclosed in \type{{}}.
+%D As we can see below, spaces following a control sequence are to enclosed in \type
+%D {{}}.
\let\m_syst_helpers_strip_character\empty
@@ -6612,8 +6589,8 @@
%D \macros
%D {unspacestring}
%D
-%D The next macro does the same but is more compatible with other macros,
-%D like \type {\convert...}.
+%D The next macro does the same but is more compatible with other macros, like \type
+%D {\convert...}.
\unexpanded\def\unspacestring#1\to#2%
{\stripcharacter{ }\from#1\to#2}
@@ -6621,22 +6598,19 @@
%D \macros
%D {executeifdefined}
%D
-%D \CONTEXT\ uses one auxiliary file for all data concerning
-%D tables of contents, references, two||pass optimizations,
-%D sorted lists etc. This file is loaded as many times as
-%D needed. During such a pass we skip the commands thate are of
-%D no use at that moment. Because we don't want to come into
-%D trouble with undefined auxiliary commands, we call the
-%D macros in a way similar to \type{\getvalue}. The next macro
-%D take care of such executions and when not defined, gobbles
-%D the unwanted arguments.
+%D \CONTEXT\ uses one auxiliary file for all data concerning tables of contents,
+%D references, two||pass optimizations, sorted lists etc. This file is loaded as
+%D many times as needed. During such a pass we skip the commands thate are of no use
+%D at that moment. Because we don't want to come into trouble with undefined
+%D auxiliary commands, we call the macros in a way similar to \type {\getvalue}. The
+%D next macro take care of such executions and when not defined, gobbles the
+%D unwanted arguments.
%D
%D \starttyping
%D \executeifdefined{name}\gobbleoneargument
%D \stoptyping
%D
-%D We can of course gobble more arguments using the
-%D appropriate gobbling command.
+%D We can of course gobble more arguments using the appropriate gobbling command.
\def\executeifdefined#1% #2 / never change this one again
{\ifcsname#1\endcsname
@@ -6646,29 +6620,28 @@
\expandafter\firstofoneargument
\fi}
-%D This one also has the advantage that it is fully
-%D expandable and that it can be used after an assignment.
+%D This one also has the advantage that it is fully expandable and that it can be
+%D used after an assignment.
%D \macros
%D {doifsomespaceelse}
%D
-%D The next command checks a string on the presence of a space
-%D and executed a command accordingly.
+%D The next command checks a string on the presence of a space and executed a
+%D command accordingly.
%D
%D \starttyping
%D \doifsomespaceelse {tekst} {then ...} {else ...}
%D \stoptyping
%D
-%D We use this command in \CONTEXT\ for determing if an
-%D argument must be broken into words when made interactive.
-%D Watch the use of \type{\noexpand}.
+%D We use this command in \CONTEXT\ for determing if an argument must be broken into
+%D words when made interactive. Watch the use of \type {\noexpand}.
%D Is this one still needed?
-\def\syst_helpers_if_some_space_else#1 #2#3\_e_o_s_{\if\noexpand#2@}
+\def\syst_helpers_if_some_space_else#1 #2#3^^^^0004{\if\noexpand#2@}
\def\doifelsesomespace#1% % #2#3%
- {\syst_helpers_if_some_space_else#1 @ @\_e_o_s_ % #3\else#2\fi}
+ {\syst_helpers_if_some_space_else#1 @ @^^^^0004% #3\else#2\fi}
\expandafter\secondoftwoarguments
\else
\expandafter\firstoftwoarguments
@@ -6679,9 +6652,9 @@
%D \macros
%D {processseparatedlist}
%D
-%D Maybe a bit late, but here is a more general version of the
-%D \type{\processcommalist} command. This time we don't handle
-%D nesting but accept arbitrary seperators.
+%D Maybe a bit late, but here is a more general version of the \type
+%D {\processcommalist} command. This time we don't handle nesting but accept
+%D arbitrary seperators.
%D
%D \starttyping
%D \processseparatedlist[list][separator]\command
@@ -6704,8 +6677,8 @@
%D
%D \typebuffer \getbuffer
%D
-%D Therefore we smuggle a \type {\relax} in front of the
-%D argument, which we remove afterwards.
+%D Therefore we smuggle a \type {\relax} in front of the argument, which we remove
+%D afterwards.
\let\syst_helpers_process_separated_list_step\relax
@@ -6736,8 +6709,8 @@
%D \processlist{beginsym}{endsym}{separator}\docommand list
%D \stoptyping
%D
-%D This one supports arbitrary open and close symbols as well as user
-%D defined separators.
+%D This one supports arbitrary open and close symbols as well as user defined
+%D separators.
%D
%D \starttyping
%D \processlist(){=>}\docommand(a=>b=>c=>d)
@@ -6766,16 +6739,15 @@
%D \macros
%D {processassignlist}
%D
-%D Is possible to combine an assignment list with one
-%D containing keywords. Assignments are treated accordingly,
-%D keywords are treated by \type{\command}.
+%D Is possible to combine an assignment list with one containing keywords.
+%D Assignments are treated accordingly, keywords are treated by \type {\command}.
%D
%D \starttyping
%D \processassignlist[...=...,...=...,...]\commando
%D \stoptyping
%D
-%D This command can be integrated in \type{\getparameters}, but
-%D we decided best not to do so.
+%D This command can be integrated in \type {\getparameters}, but we decided best not
+%D to do so.
\unexpanded\def\processassignlist#1[#2]#3%
{\def\syst_helpers_process_assign_list_assign[##1=##2=##3]%
@@ -6788,16 +6760,15 @@
%D {untextargument
%D untexcommand}
%D
-%D When manipulating data(bases) and for instance generating
-%D index entries, the next three macros can be of help:
+%D When manipulating data(bases) and for instance generating index entries, the next
+%D three macros can be of help:
%D
%D \starttyping
%D \untextargument{...}\to\name
%D \untexcommand {...}\to\name
%D \stoptyping
%D
-%D They remove braces and backslashes and give us something to
-%D sort.
+%D They remove braces and backslashes and give us something to sort.
\let\m_syst_helpers_untexed\empty
@@ -6828,7 +6799,6 @@
%D \ScaledPointsToWholeBigPoints {number} \target
%D \stoptyping
%D
-
%D In pure \TEX:
% \unexpanded\def\PointsToBigPoints#1#2%
@@ -6870,16 +6840,15 @@
%D \macros
%D {dontleavehmode}
%D
-%D Sometimes when we enter a paragraph with some command, the
-%D first token gets the whole first line. We can prevent this
-%D by saying:
+%D Sometimes when we enter a paragraph with some command, the first token gets the
+%D whole first line. We can prevent this by saying:
%D
%D \starttyping
%D \dontleavehmode
%D \stoptyping
%D
-%D This command is used in for instance the language module
-%D \type{lang-ini}. The first version was:
+%D This command is used in for instance the language module \type {lang-ini}. The
+%D first version was:
%D
%D \starttyping
%D \def\dontleavehmode{\ifhmode\else\ifmmode\else$ $\fi\fi}
@@ -6894,8 +6863,8 @@
%D \fi \fi}
%D \stoptyping
%D
-%D And finaly we got the following alternative, one that avoids
-%D interfering grouping at the cost of a box.
+%D And finaly we got the following alternative, one that avoids interfering grouping
+%D at the cost of a box.
%D
%D \starttyping
%D \newbox\b_syst_helpers_dlh
@@ -6928,8 +6897,8 @@
% \unexpanded\def\lowercasestring#1\to#2%
% {\lowercase\expandafter{\expandafter\dodoglobal\expandafter\edef\expandafter#2\expandafter{\normalexpanded{#1}}}}
-%D These macros are sort of obsolete as we never use uppercase this
-%D way. But nevertheless we provide them:
+%D These macros are sort of obsolete as we never use uppercase this way. But
+%D nevertheless we provide them:
\def\utfupper#1{\clf_upper{#1}} % expandable
\def\utflower#1{\clf_lower{#1}} % expandable
@@ -6940,8 +6909,8 @@
%D \macros
%D {handletokens}
%D
-%D With the next macro we enter a critical area of macro
-%D expansion. What we want is a macro that looks like:
+%D With the next macro we enter a critical area of macro expansion. What we want is
+%D a macro that looks like:
%D
%D \starttyping
%D \handletokens some tokens\with \somemacro
@@ -6960,17 +6929,16 @@
%D \macros
%D {counttoken,counttokens}
%D
-%D For the few occasions that we want to know the number of
-%D specific tokens in a string, we can use:
+%D For the few occasions that we want to know the number of specific tokens in a
+%D string, we can use:
%D
%D \starttyping
%D \counttoken token\in string\to \somecount
%D \counttokens string\to \somecount
%D \stoptyping
%D
-%D This macro, that for instance is used in \type{cont-tab},
-%D takes a real counter. The macro can be preceded by \type
-%D {\doglobal}.
+%D This macro, that for instance is used in \type {cont-tab}, takes a real counter.
+%D The macro can be preceded by \type {\doglobal}.
\def\syst_helpers_count_token#1% obeys {}
{\def\m_syst_string_three{#1}%
@@ -6997,9 +6965,8 @@
%D \macros
%D {splitofftokens}
%D
-%D Running this one not always gives the expected results.
-%D Consider for instance the macro for which I originally
-%D wrote this token handler.
+%D Running this one not always gives the expected results. Consider for instance the
+%D macro for which I originally wrote this token handler.
\unexpanded\def\splitofftokens#1\from#2\to#3% slow but hardly used
{\ifnum#1>\zerocount
@@ -7022,10 +6989,9 @@
%D \splitofftokens10\from01234567 890123456789\to\test [\test]
%D \stopbuffer
%D
-%D However, the characters that we expect to find in
-%D \type{\test} just don't show up there. The reason for this
-%D is not that logical but follows from \TEX's sometimes
-%D mysterious way of expanding. Look at this:
+%D up there. The reason for this is not that logical but follows from \TEX's
+%D However, the characters that we expect to find in \type {\test} just don't show
+%D sometimes mysterious way of expanding. Look at this:
%D
%D \startbuffer[next]
%D \def\next{a} \edef\test{\next} [\test]
@@ -7037,16 +7003,14 @@
%D
%D \typebuffer[next]
%D
-%D Careful reading shows that inside an \type{\edef} macro's
-%D that are \type{\let} are not expanded!
+%D Careful reading shows that inside an \type {\edef} macro's that are \type {\let}
+%D are not expanded!
%D
%D \unprotect\getbuffer[next]\protect
%D
-%D That's why we finally end up with a macro that looks
-%D ahead by using an assignment, this time by using \type
-%D {\futurelet}, and grabbing an argument as well. That
-%D way we can handle the sentinal, a blank space and grouped
-%D tokens.
+%D That's why we finally end up with a macro that looks ahead by using an
+%D assignment, this time by using \type {\futurelet}, and grabbing an argument as
+%D well. That way we can handle the sentinal, a blank space and grouped tokens.
\unexpanded\def\syst_helpers_handle_tokens % \nexthandledtoken is part of interface
{\futurelet\nexthandledtoken\syst_helpers_handle_tokens_indeed}
@@ -7089,12 +7053,11 @@
%D \macros
%D {iftrialtypesetting, ifvisible}
%D
-%D The next boolean is at first sight a strange one. Sometimes
-%D one does a trial typesetting run, for instance to determine
-%D dimensions. Some mechanisms, like object inclusion, can fail
-%D on such trials. Temporary setting the next boolean to true,
-%D helps a lot. The second boolena can be used to inhibit
-%D processing completely.
+%D The next boolean is at first sight a strange one. Sometimes one does a trial
+%D typesetting run, for instance to determine dimensions. Some mechanisms, like
+%D object inclusion, can fail on such trials. Temporary setting the next boolean to
+%D true, helps a lot. The second boolena can be used to inhibit processing
+%D completely.
\newif\ifvisible \visibletrue
@@ -7112,10 +7075,9 @@
%D \macros
%D {twodigitrounding}
%D
-%D When using \type {\special}s or \type {\pdfliteral}s, it
-%D sometimes makes sense to limit the precission. The next
-%D macro rounds a real number to two digits. It takes one
-%D argument and only works in \ETEX.
+%D When using \type {\special}s or \type {\pdfliteral}s, it sometimes makes sense to
+%D limit the precission. The next macro rounds a real number to two digits. It takes
+%D one argument and only works in \ETEX.
% \def\dointegerrounding #1.#2\relax {#1}
% \def\doonedigitrounding #1.#2#3\relax {\ifx#2*#1\else#1.#2\fi}
@@ -7168,18 +7130,17 @@
\let\gobblesingleempty\dogobblesingleempty % also used
\let\gobbledoubleempty\dogobbledoubleempty % also used
-%D \macros
-%D {@True, @False, @Not, @And}
-%D
-%D Some predicate logic functions, used in for instance the
-%D math module.
-
-% These have rather ugly names ... will change:
-
-\def\@True {00}
-\def\@False {01}
-\def\@Not #1{0\ifcase#11 \or\expandafter 1\else \expandafter 0\fi}
-\def\@And #1#2{0\ifcase#1#2 \expandafter 0\else \expandafter 1\fi}
+% %D \macros
+% %D {@True, @False, @Not, @And}
+% %D
+% %D Some predicate logic functions, used in for instance the math module.
+%
+% % These have rather ugly names ... will change:
+%
+% \def\@True {00}
+% \def\@False {01}
+% \def\@Not #1{0\ifcase#11 \or\expandafter 1\else \expandafter 0\fi}
+% \def\@And #1#2{0\ifcase#1#2 \expandafter 0\else \expandafter 1\fi}
%D \macros
%D {setdimensionwithunit, freezedimensionwithunit}
@@ -7194,9 +7155,8 @@
%D \freezedimensionwithunit\SomeDepth{\dp\strutbox}
%D \stoptyping
%D
-%D As an alternative for the next macro we can use a global
-%D assignment inside a box. The \type{\empty}'s permits
-%D gobbling while preventing spurious \type{\relax}'s.
+%D As an alternative for the next macro we can use a global assignment inside a box.
+%D The \type {\empty}'s permits gobbling while preventing spurious \type {\relax}'s.
\unexpanded\def\setdimensionwithunit#1#2#3% number unit dimension / nice trick
{\afterassignment\gobblefourarguments#1=#2#3pt\relax\empty\empty\empty\empty}
@@ -7207,8 +7167,7 @@
%D \macros
%D {doifsometokselse, doifsometoks}
%D
-%D Not that fast I guess, but here's a way to test for token
-%D registers being empty.
+%D Not that fast I guess, but here's a way to test for token registers being empty.
\unexpanded\def\doifelsesometoks#1%
{\edef\m_syst_string_one{\the#1}% one level expansion so quite ok
@@ -7218,8 +7177,6 @@
\expandafter\firstoftwoarguments
\fi}
-\let\doifsometokselse\doifelsesometoks
-
\unexpanded\def\doifsometoks#1%
{\edef\m_syst_string_one{\the#1}% one level expansion so quite ok
\ifx\m_syst_string_one\empty
@@ -7236,31 +7193,26 @@
\expandafter\gobbleoneargument
\fi}
+\let\doifsometokselse\doifelsesometoks
+
%D \macros
%D {startstrictinspectnextcharacter}
%D
-%D This one if for Taco's bibliography module:
+%D This one is for the bibliography module (still?):
-\let\syst_helpers_normal_inspect_next_character\syst_helpers_inspect_next_character
+\let\syst_helpers_strict_inspect_next_character[
\def\syst_helpers_strict_inspect_next_character% no user macro !
- {\ifx\nexttoken\charactertoken
+ {\ifx\nexttoken[%
\expandafter\m_syst_action_yes
\else
\expandafter\m_syst_action_nop
\fi}
-% better: push/pop
-
-\unexpanded\def\startstrictinspectnextcharacter
- {\let\syst_helpers_inspect_next_character\syst_helpers_strict_inspect_next_character}
-
-\unexpanded\def\stopstrictinspectnextcharacter
- {\let\syst_helpers_inspect_next_character\syst_helpers_normal_inspect_next_character}
-
\unexpanded\def\strictdoifelsenextoptional#1#2%
- {\startstrictinspectnextcharacter
- \doifelsenextchar[{\stopstrictinspectnextcharacter#1}{\stopstrictinspectnextcharacter#2}}
+ {\def\m_syst_action_yes{#1}%
+ \def\m_syst_action_nop{#2}%
+ \futurelet\nexttoken\syst_helpers_strict_inspect_next_character}
\let\strictdoifnextoptionalelse\strictdoifelsenextoptional
@@ -7278,8 +7230,7 @@
%D \macros
%D {verbatimargument}
%D
-%D As the name says, this macro converts its argument to a
-%D (rather safe) string.
+%D As the name says, this macro converts its argument to a (rather safe) string.
\let\verbatimstring\detokenize
@@ -7314,18 +7265,16 @@
%D \macros
%D {purenumber}
%D
-%D Sometimes we need control over when \TEX\ stops reading a
-%D number, especially in full expandable macros where using
-%D \type {\relax} would lead to disasters.
+%D Sometimes we need control over when \TEX\ stops reading a number, especially in
+%D full expandable macros where using \type {\relax} would lead to disasters.
%D
%D \starttyping
%D \ifodd\purenumber{...}\space ... \else ... \fi
%D \stoptyping
%D
-%D Here we use a space as number delimiter in combination
-%D with a space- and relax-less \type {\purenumber}. This
-%D macro works ok with \type {\the}, \type {\number} as well
-%D as \ETEX's \type {\numexpr}.
+%D Here we use a space as number delimiter in combination with a space- and
+%D relax-less \type {\purenumber}. This macro works ok with \type {\the}, \type
+%D {\number} as well as \ETEX's \type {\numexpr}.
\def\purenumber#1{\expandafter\firstofoneargument\expandafter{\number#1}}
@@ -7350,8 +7299,7 @@
%D \filterfromvalues{3}{xx}{1}
%D \stoptyping
%D
-%D I'll implement this when I'm in \quotation {writing dirty
-%D macros mood}.
+%D I'll implement this when I'm in \quotation {writing dirty macros mood}.
\def\dofilterfromstr#1#2% max n % no need to be fast
{\expandafter \expandafter \expandafter \csstring
@@ -7429,6 +7377,9 @@
%{\dimexpr\ifcsname\??measure#1\endcsname\csname\??measure#1\endcsname\else\zeropoint\fi\relax}
{\dimexpr\ifcsname\??measure#1\endcsname\lastnamedcs\else\zeropoint\fi\relax}
+\def\directmeasure#1%
+ {\the\dimexpr#1\relax}
+
% #2 could be omitted, but we want to support spaces
%
% \setmeasure {x} {1cm}
@@ -7436,6 +7387,41 @@
% \setmeasure {xxx}{1cm}
%D \macros
+%D {definequantity}
+%D
+%D These do the same but for numbers.
+
+\installsystemnamespace{quantity}
+
+\unexpanded\def\definequantity
+ {\dodoubleargument\syst_helpers_define_quantity}
+
+\def\syst_helpers_define_quantity[#1][#2]%
+ {\expandafter\def\csname\??quantity#1\endcsname{#2}}
+
+\unexpanded\def\freezequantity
+ {\dodoubleargument\syst_helpers_freeze_quantity}
+
+\def\syst_helpers_freeze_quantity[#1][#2]%
+ {\expandafter\edef\csname\??quantity#1\endcsname{\the\numexpr#2}}
+
+\unexpanded\def\setquantity #1#2{\expandafter\def \csname\??quantity#1\endcsname{#2}} % quick way
+\unexpanded\def\setgquantity#1#2{\expandafter\gdef\csname\??quantity#1\endcsname{#2}} % quick way
+\unexpanded\def\setequantity#1#2{\expandafter\edef\csname\??quantity#1\endcsname{\the\numexpr#2}} % quick way
+\unexpanded\def\setxquantity#1#2{\expandafter\xdef\csname\??quantity#1\endcsname{\the\numexpr#2}} % quick way
+
+\def\quantity
+ {\the\quantitied}
+
+\def\quantitied#1%
+ {\numexpr\ifcsname\??quantity#1\endcsname\lastnamedcs\else\zeropoint\fi\relax}
+
+\def\directquantity#1%
+ {\the\numexpr#1\relax}
+
+% let\quantified\quantitied
+
+%D \macros
%D {dividedsize}
%D
%D This one can be used inside a measure (used in m4all):
@@ -7459,7 +7445,8 @@
\def\doifelsedimension#1%
{\afterassignment\syst_helpers_if_dimension_else\privatescratchdimen#1pt\relax}
-\let\doifdimensionelse\doifelsedimension
+% \def\doifelsedimension#1%
+% {\expandafter\syst_helpers_if_dimension_else\immediateassignment\privatescratchdimen#1pt\relax}
\def\syst_helpers_if_dimension_else#1%
{\ifx#1\relax
@@ -7468,6 +7455,8 @@
\expandafter\thirdoffourarguments
\fi}
+\let\doifdimensionelse\doifelsedimension
+
%D Ok, here's another one, slower but seldom used. This one scans the text.
%D
%D \starttabulate[|Tc|Tc|]
@@ -7491,8 +7480,6 @@
\def\doifelsedimenstring#1{\normalexpanded{\noexpand\dodimenteststageone#1}\empty\empty]}
-\let\doifdimenstringelse\doifelsedimenstring
-
\def\dodimenteststageone #1#2{\csname \??dimenchecka\ifcsname \??dimenchecka#2\endcsname#2\else x\fi\endcsname#2}
\def\dodimenteststagetwo #1#2{\csname \??dimencheckb\ifcsname \??dimencheckb#2\endcsname#2\else x\fi\endcsname#2}
\def\dodimenteststagethree #1]{\csname \??dimencheckc\ifcsname \??dimencheckc#1\endcsname#1\else x\fi\endcsname}
@@ -7539,6 +7526,8 @@
\expandafter\let\csname \??dimencheckc nd\endcsname\firstoftwoarguments
\expandafter\let\csname \??dimencheckc nc\endcsname\firstoftwoarguments
+\let\doifdimenstringelse\doifelsedimenstring
+
%D \macros
%D {comparedimension,comparedimensioneps}
%D
@@ -7569,8 +7558,6 @@
\plustwo
\fi\fi\fi}
-% % % % % % % % % % % % % % % % % % % % % %
-
% pretty ugly but fast
% \copycsname xxx\endcsname\csname ..\endcsname
@@ -7675,6 +7662,8 @@
\expandafter\secondoftwoarguments
\fi}
+% used ?
+
\def\doifelsenonzeropositive#1%
{\begingroup\afterassignment\syst_helpers_if_non_zero_positive_else\privatescratchcounter=0#1\relax\empty\end}
@@ -7720,26 +7709,34 @@
\let\elapsedseconds \elapsedtime
\newcount\c_syst_helpers_test_feature_n
-\chardef \c_syst_helpers_test_feature_m\zerocount
+\newcount\c_syst_helpers_test_feature_m
\def\currentfeaturetest{\number\c_syst_helpers_test_feature_n}
\unexpanded\def\testfeature#1#2%
- {\chardef\c_syst_helpers_test_feature_m#1\relax
- \def\syst_helpers_test_feature_step
+ {\c_syst_helpers_test_feature_m#1\relax
+ \def\syst_helpers_test_feature_yes
{\advance\c_syst_helpers_test_feature_n\plusone
\ifnum\c_syst_helpers_test_feature_n>\c_syst_helpers_test_feature_m\else
- #2\expandafter\syst_helpers_test_feature_step
+ #2\expandafter\syst_helpers_test_feature_yes
+ \fi}%
+ \def\syst_helpers_test_feature_nop
+ {\advance\c_syst_helpers_test_feature_n\plusone
+ \ifnum\c_syst_helpers_test_feature_n>\c_syst_helpers_test_feature_m\else
+ \expandafter\syst_helpers_test_feature_nop
\fi}%
\retestfeature}
\unexpanded\def\retestfeature % timer support is new per 10/5/2005
{\bgroup
\ifcase\interactionmode\let\wait\relax\fi
+ \clf_resettimer
+ \c_syst_helpers_test_feature_n\zerocount
+ \syst_helpers_test_feature_nop
+ \clf_benchmarktimer
\writestatus\m!system{starting feature test (n=\number\c_syst_helpers_test_feature_m)}\wait
- \resettimer
\c_syst_helpers_test_feature_n\zerocount
- \syst_helpers_test_feature_step
+ \syst_helpers_test_feature_yes
\writestatus\m!system{\number\c_syst_helpers_test_feature_m\space feature tests done (\elapsedseconds s)}%
\wait
\egroup}
@@ -7765,8 +7762,8 @@
\unexpanded\def\freezedimenmacro#1%
{\edef#1{\the\dimexpr#1}}
-%D The next macro negates a macro (dimension or number, or actually, whatever.
-%D It's a typical example of \type {\if} usage:
+%D The next macro negates a macro (dimension or number, or actually, whatever. It's
+%D a typical example of \type {\if} usage:
%D
%D \starttyping
%D \if-\whatever \else-\whatever\fi => else => -whatever
@@ -7795,8 +7792,8 @@
%D \macros
%D {dowithrange}
%D
-%D This one is for Mojca Miklavec, who made me aware of the fact that
-%D \type {page-imp.tex} was not the best place to hide it.
+%D This one is for Mojca Miklavec, who made me aware of the fact that \type
+%D {page-imp.tex} was not the best place to hide it.
%D
%D \startbuffer
%D \def\DoSomething#1{ [item #1] }
@@ -7878,8 +7875,8 @@
\def\syst_helpers_expand_checked_csname#1#2#3%
{\csname#1\ifcsname#1#2\endcsname#2\else#3\fi\endcsname}
-%D Signal. Some fonts have a char0 rendering so we need to make sure that it
-%D is not set in the font! (THis will be overloaded)
+%D Signal. Some fonts have a char0 rendering so we need to make sure that it is not
+%D set in the font! (This will be overloaded)
\unexpanded\def\signalcharacter{\char\zerocount} % \zwj
@@ -8103,6 +8100,21 @@
%
% \def\additemtolist#1#2{\normalexpanded{\noexpand\clf_additemtolist{#1}{#2}}}
+%D Experiment (sometimes looks nicer in code):
+
+\unexpanded\def\sameargumentscondition#1#2%
+ {\edef\m_syst_string_one{#1}%
+ \edef\m_syst_string_two{#2}%
+ \ifx\m_syst_string_one\m_syst_string_two}
+
+\unexpanded\def\emptyargumentcondition#1%
+ {\edef\m_syst_string_one{#1}%
+ \ifx\m_syst_string_one\empty}
+
+% \unexpanded\def\hascommonargumentcondition#1#2{\clf_hascommonargumentcondition{#1}{#2}}
+% \let\hascommonargumentcondition \clf_hascommonargumentcondition
+% \unexpanded\def\hascommonargumentcondition{\clf_hascommonargumentcondition}
+
\protect \endinput
% \edef\choicetokenyes{+}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/syst-aux.mkxl b/Master/texmf-dist/tex/context/base/mkiv/syst-aux.mkxl
new file mode 100644
index 00000000000..7ade250d970
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/syst-aux.mkxl
@@ -0,0 +1,6587 @@
+%D \module
+%D [ file=syst-aux, % merge of syst-gen cum suis
+%D version=1996.03.20,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=General,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{syst-aux}{}
+
+%D This fils is a follow up in \type {syst-aux.mkii} and \type {syst-aux.mkiv}
+%D where you can find some more pure \TEX\ or \LUATEX| variants.
+
+\unprotect
+
+%D \macros
+%D {unexpanded}
+%D
+%D Because we use this module only in \MKIV, we have removed the old protection
+%D code.
+%D
+%D \starttyping
+%D \unexpanded\def\somecommand{... ... ...}
+%D \stoptyping
+%D
+%D This overloads the \ETEX\ primitive but as we already had an \MKII\ solution we
+%D keep the same name for a similar mechanism.
+
+\let\unexpanded\normalprotected
+
+\ifcase\contextlmtxmode
+
+ \def\startlmtxmode#1\stoplmtxmode{}
+ \let\stoplmtxmode \relax
+ \let\startmkivmode\relax
+ \let\stopmkivmode \relax
+
+\else
+
+ \let\startlmtxmode\relax
+ \let\stoplmtxmode \relax
+ \def\startmkivmode#1\stopmkivmode{}
+ \let\stopmkivmode \relax
+
+\fi
+
+%D As we don't have namespace definers yet, we use a special one:
+
+\ifdefined\c_syst_helpers_n_of_namespaces
+
+ % lets plug in a better error message
+
+\else
+
+ \newcount\c_syst_helpers_n_of_namespaces \c_syst_helpers_n_of_namespaces\pluseight % 1-8 reserved for catcodes
+
+ \def\v_interfaces_prefix_template_system{\number \c_syst_helpers_n_of_namespaces>>}
+ %def\v_interfaces_prefix_template_system{\characters\c_syst_helpers_n_of_namespaces>>} % no \characters yet
+
+\fi
+
+\unexpanded\def\installsystemnamespace#1% maybe move this to syst-ini
+ {\ifcsname ??#1\endcsname
+ \writestatus\m!system{duplicate system namespace '#1'}\wait
+ \else
+ \global\advance\c_syst_helpers_n_of_namespaces\plusone
+ \expandafter\edef\csname ??#1\endcsname{\v_interfaces_prefix_template_system}%
+ \fi}
+
+%D \macros
+%D {normalspace}
+%D
+%D There is already \type{\space} but just to be sure we also provide:
+
+\def\normalspace{ }
+
+%D \macros
+%D {!!count, !!toks, !!dimen, !!box,
+%D !!width, !!height, !!depth, !!string, !!done}
+%D
+%D We define some more \COUNTERS\ and \DIMENSIONS. We also define some shortcuts to
+%D the local scatchregisters~0, 2, 4, 6 and~8.
+
+\newcount\!!counta \newtoks\!!toksa \newdimen\!!dimena \newbox\!!boxa
+\newcount\!!countb \newtoks\!!toksb \newdimen\!!dimenb \newbox\!!boxb
+\newcount\!!countc \newtoks\!!toksc \newdimen\!!dimenc \newbox\!!boxc
+\newcount\!!countd \newtoks\!!toksd \newdimen\!!dimend \newbox\!!boxd
+\newcount\!!counte \newtoks\!!tokse \newdimen\!!dimene \newbox\!!boxe
+\newcount\!!countf \newtoks\!!toksf \newdimen\!!dimenf \newbox\!!boxf
+ \newdimen\!!dimeng
+ \newdimen\!!dimenh
+ \newdimen\!!dimeni
+ \newdimen\!!dimenj
+ \newdimen\!!dimenk
+
+\let\!!stringa\empty \let\!!stringb\empty \let\!!stringc\empty
+\let\!!stringd\empty \let\!!stringe\empty \let\!!stringf\empty
+
+\newdimen\!!widtha \newdimen\!!heighta \newdimen\!!deptha
+\newdimen\!!widthb \newdimen\!!heightb \newdimen\!!depthb
+\newdimen\!!widthc \newdimen\!!heightc \newdimen\!!depthc
+\newdimen\!!widthd \newdimen\!!heightd \newdimen\!!depthd
+
+\newif\if!!donea \newif\if!!doneb \newif\if!!donec
+\newif\if!!doned \newif\if!!donee \newif\if!!donef
+
+\def\!!zerocount {0} % alongside \zerocount
+\def\!!minusone {-1} % ...
+\def\!!plusone {1} % ...
+\def\!!plustwo {2} % ...
+\def\!!plusthree {3} % ...
+\def\!!plusfour {4} % ...
+\def\!!plusfive {5} % ...
+\def\!!plussix {6} % ...
+\def\!!plusseven {7} % ...
+\def\!!pluseight {8} % ...
+\def\!!plusnine {9} % alongside \plusnine
+
+\setnewconstant \uprotationangle 0
+\setnewconstant\rightrotationangle 90
+\setnewconstant \downrotationangle 180
+\setnewconstant \leftrotationangle 270
+
+\ifdefined\data \else \let\data \relax \fi % dep checker
+
+%D \macros
+%D {s!,c!,e!,p!,v!,@@,??}
+%D
+%D To save memory, we use constants (sometimes called variables). Redefining these
+%D constants can have disastrous results.
+
+\def\v!prefix! {v!}
+\def\c!prefix! {c!}
+\def\s!prefix! {s!}
+
+\def\s!next {next}
+\def\s!default {default}
+\def\s!dummy {dummy}
+\def\s!unknown {unknown}
+
+\def\s!do {do}
+\def\s!dodo {dodo}
+
+\def\s!complex {complex}
+\def\s!start {start}
+\def\s!simple {simple}
+\def\s!stop {stop}
+
+\def\s!empty {empty}
+
+%D Sometimes we pass macros as arguments to commands that don't expand them
+%D before interpretation. Such commands can be enclosed with \type {\expanded},
+%D like:
+%D
+%D \starttyping
+%D \expanded{\setupsomething[\alfa]}
+%D \stoptyping
+%D
+%D Such situations occur for instance when \type{\alfa} is a commalist or when data
+%D stored in macros is fed to index of list commands. If needed, one should use
+%D \type{\noexpand} inside the argument. Later on we will meet some more clever
+%D alternatives to this command. Beware, only the simple one has \type {\noexpand}
+%D before its argument.
+
+\let\m_syst_helpers_expanded\empty
+
+\unexpanded\def\expanded#1%
+ {\xdef\m_syst_helpers_expanded{\noexpand#1}\m_syst_helpers_expanded}
+
+\unexpanded\def\startexpanded#1\stopexpanded
+ {\xdef\m_syst_helpers_expanded{#1}\m_syst_helpers_expanded}
+
+\let\stopexpanded\relax
+
+%D Recent \TEX\ engines have a primitive \type {\expanded} and we will use that when
+%D possible. After all, we can make not expandable macros now.
+
+% We cannot use the next variant as first we need to adapt \type {##}'s in callers:
+%
+% \def\expanded#1%
+% {\normalexpanded{\noexpand#1}}
+%
+% \def\startexpanded#1\stopexpanded
+% {\normalexpanded{#1}}
+
+%D \macros
+%D {gobbleoneargument,gobble...arguments}
+%D
+%D The next set of macros just do nothing, except that they get rid of a number of
+%D arguments.
+
+\def\gobbleoneargument #1{}
+\def\gobbletwoarguments #1#2{}
+\def\gobblethreearguments#1#2#3{}
+\def\gobblefourarguments #1#2#3#4{}
+\def\gobblefivearguments #1#2#3#4#5{}
+\def\gobblesixarguments #1#2#3#4#5#6{}
+\def\gobblesevenarguments#1#2#3#4#5#6#7{}
+\def\gobbleeightarguments#1#2#3#4#5#6#7#8{}
+\def\gobbleninearguments #1#2#3#4#5#6#7#8#9{}
+\def\gobbletenarguments #1{\gobbleninearguments}
+
+\def\gobbleoneoptional [#1]{}
+\def\gobbletwooptionals [#1][#2]{}
+\def\gobblethreeoptionals[#1][#2][#3]{}
+\def\gobblefouroptionals [#1][#2][#3][#4]{}
+\def\gobblefiveoptionals [#1][#2][#3][#4][#5]{}
+
+%D Reserved macros for tests:
+
+\let\donothing\empty
+
+\let\m_syst_string_one \empty
+\let\m_syst_string_two \empty
+\let\m_syst_string_three\empty
+\let\m_syst_string_four \empty
+
+\let\m_syst_action_yes \empty
+\let\m_syst_action_nop \empty
+
+%D \macros
+%D {doifnextcharelse}
+%D
+%D When we started using \TEX\ in the late eighties, our first experiences with
+%D programming concerned a simple shell around \LATEX. The commands probably use
+%D most at \PRAGMA, are the itemizing ones. One of those few shell commands took
+%D care of an optional argument, that enabled us to specify what kind of item symbol
+%D we wanted. Without understanding anything we were able to locate a \LATEX\ macro
+%D that could be used to inspect the next character.
+%D
+%D It's this macro that the ancester of the next one presented here. It executes one
+%D of two actions, dependant of the next character. Disturbing spaces and line
+%D endings, which are normally interpreted as spaces too, are skipped.
+%D
+%D \starttyping
+%D \doifnextcharelse {karakter} {then ...} {else ...}
+%D \stoptyping
+%D
+%D This macro differs from the original in the use of \type {\localnext} because we
+%D don't want clashes with \type {\next}.
+
+\let\next \relax
+\let\nextnext \relax
+\let\nextnextnext \relax
+\let\nexttoken \relax
+\let\charactertoken\relax
+
+\let\m_syst_action_yes\relax
+\let\m_syst_action_nop\relax
+
+% \def\syst_helpers_inspect_next_character
+% {\ifx\nexttoken\blankspace
+% \expandafter\syst_helpers_reinspect_next_character
+% \else
+% \expandafter\syst_helpers_inspect_next_character_indeed
+% \fi}
+%
+% \def\syst_helpers_inspect_next_character_indeed
+% {\ifx\nexttoken\charactertoken
+% \expandafter\m_syst_action_yes
+% \else
+% \expandafter\m_syst_action_nop
+% \fi}
+
+\unexpanded\def\doifelsenextchar#1#2#3% #1 should not be {} !
+ {\def\m_syst_action_yes{#2}%
+ \def\m_syst_action_nop{#3}%
+ \futureexpandis#1\m_syst_action_yes\m_syst_action_nop}
+
+\unexpanded\def\doifelsenextcharcs % #1#2#3% #1 should not be {} !
+ {\futureexpandis}
+
+\let\doifnextcharelse \doifelsenextchar
+\let\doifnextcharcselse\doifelsenextcharcs
+
+%D Because we will mostly use this macro for testing if the next character is \type
+%D {[}, we also make a slightly faster variant as it is not uncommon to have tens of
+%D thousands of calls to this test in a run. Of course it also is more convenient to
+%D read a trace then.
+
+% \newif\if_next_blank_space_token
+
+% \let\syst_helpers_next_optional_character_token=[
+%
+% \def\syst_helpers_inspect_next_optional_character
+% {\ifx\nexttoken\blankspace
+% \expandafter\syst_helpers_reinspect_next_optional_character
+% \else
+% \expandafter\syst_helpers_inspect_next_optional_character_indeed
+% \fi}
+%
+% \def\syst_helpers_inspect_next_optional_character_indeed
+% {\ifx\nexttoken\syst_helpers_next_optional_character_token
+% \expandafter\m_syst_action_yes
+% \else
+% \expandafter\m_syst_action_nop
+% \fi}
+
+\unexpanded\def\doifelsenextoptional#1#2%
+ {\def\m_syst_action_yes{#1}%
+ \def\m_syst_action_nop{#2}%
+ \futureexpandis[\m_syst_action_yes\m_syst_action_nop}
+
+\unexpanded\def\doifelsenextoptionalcs
+ {\futureexpandis[}
+
+\let\doifnextoptionalelse \doifelsenextoptional
+\let\doifnextoptionalcselse\doifelsenextoptionalcs
+
+% \let\syst_helpers_next_bgroup_character_token\bgroup
+%
+% \def\syst_helpers_inspect_next_bgroup_character
+% {\ifx\nexttoken\blankspace
+% \expandafter\syst_helpers_reinspect_next_bgroup_character
+% \else
+% \expandafter\syst_helpers_inspect_next_bgroup_character_indeed
+% \fi}
+%
+% \def\syst_helpers_inspect_next_bgroup_character_indeed
+% {\ifx\nexttoken\syst_helpers_next_bgroup_character_token
+% \expandafter\m_syst_action_yes
+% \else
+% \expandafter\m_syst_action_nop
+% \fi}
+
+\unexpanded\def\doifelsenextbgroup#1#2%
+ {\def\m_syst_action_yes{#1}%
+ \def\m_syst_action_nop{#2}%
+ \futureexpandis\bgroup\m_syst_action_yes\m_syst_action_nop}
+
+\unexpanded\def\doifelsenextbgroupcs % #1#2
+ {\futureexpandis\bgroup}
+
+\let\doifnextbgroupelse \doifelsenextbgroup
+\let\doifnextbgroupcselse\doifelsenextbgroupcs
+
+% \let\syst_helpers_next_parenthesis_character_token(
+%
+% \def\syst_helpers_inspect_next_parenthesis_character
+% {\ifx\nexttoken\blankspace
+% \expandafter\syst_helpers_reinspect_next_parenthesis_character
+% \else
+% \expandafter\syst_helpers_inspect_next_parenthesis_character_indeed
+% \fi}
+%
+% \def\syst_helpers_inspect_next_parenthesis_character_indeed
+% {\ifx\nexttoken\syst_helpers_next_parenthesis_character_token
+% \expandafter\m_syst_action_yes
+% \else
+% \expandafter\m_syst_action_nop
+% \fi}
+
+\unexpanded\def\doifelsenextparenthesis#1#2%
+ {\def\m_syst_action_yes{#1}%
+ \def\m_syst_action_nop{#2}%
+ \futureexpandis(\m_syst_action_yes\m_syst_action_nop}
+
+\let\doifnextparenthesiselse\doifelsenextparenthesis
+
+%D The next one is handy in predictable situations:
+
+\def\syst_helpers_do_if_fast_optional_check_else
+ {\ifx\nexttoken\syst_helpers_next_optional_character_token
+ \expandafter\m_syst_action_yes
+ \else
+ \expandafter\m_syst_action_nop
+ \fi}
+
+\unexpanded\def\doifelsefastoptionalcheck#1#2%
+ {\def\m_syst_action_yes{#1}%
+ \def\m_syst_action_nop{#2}%
+ \futureexpandis[\m_syst_action_yes\m_syst_action_nop}
+
+\unexpanded\def\doifelsefastoptionalcheckcs
+ {\futureexpandis[}
+
+\let\doiffastoptionalcheckelse \doifelsefastoptionalcheck
+\let\doiffastoptionalcheckcselse\doifelsefastoptionalcheckcs
+
+%D Here's one for skipping spaces and pars, handy for:
+%D
+%D \starttyping
+%D \hbox
+%D
+%D {a few lines later}
+%D \stoptyping
+%D
+%D like:
+%D
+%D \starttyping
+%D \def\somecommand{\dowithnextbox{\box\nextbox}\ruledhbox}
+%D
+%D \assumelongusagecs\somecommand
+%D
+%D \bgroup
+%D oeps
+%D \egroup
+%D \stoptyping
+
+%D The cumbersome original:
+
+% \unexpanded\def\assumelongusagecs#1%
+% {\let\m_syst_action#1%
+% \futurelet\nexttoken\syst_helpers_ignore_spacing}
+%
+% \def\syst_helpers_ignore_spacing
+% {\ifx\nexttoken\blankspace
+% \expandafter\syst_helpers_ignore_spacing_blankspace
+% \orelse\ifx\nexttoken\par
+% \expandafter\syst_helpers_ignore_spacing_partoken
+% \else
+% \expandafter\m_syst_action
+% \fi}
+%
+% \def\syst_helpers_ignore_spacing_partoken\par
+% {\futurelet\nexttoken\syst_helpers_ignore_spacing}
+
+%D A bit less tracing noise:
+
+% \def\assume_long_usage_cs
+% {\futureexpandis\par\assume_long_usage_par\m_syst_action}
+%
+% \def\assume_long_usage_par\par%
+% {\assume_long_usage_cs}
+%
+% \unexpanded\def\assumelongusagecs#1{\let\m_syst_action#1\assume_long_usage_cs}
+
+%D Ok, using \type {\futureexpandisap} is maybe feature creep but I'd like to experiment
+%D with more tolerant user input. It might go away in which case we use the above.
+
+\unexpanded\def\assumelongusagecs#1%
+ {\futureexpandisap\relax#1#1}
+
+% D These macros use some auxiliary macros. Although we were able to program quite
+% D complicated things, I only understood these after rereading the \TEX book. The
+% D trick is in using a command with a one character name. Such commands differ from
+% D the longer ones in the fact that trailing spaces are {\em not} skipped. This
+% D enables us to indirectly define a long named macro that gobbles a space. In the
+% D first line we define \type {\blankspace}. Next we make \type {\:} equivalent to
+% D \type {\reinspect...}. This one||character command is expanded before the next
+% D \type {\def} comes into action. This way the space after \type {\:} becomes a
+% D delimiter of the longer named \type {\reinspectnextcharacter}.
+
+\let\next\:
+
+\def\:{\let\blankspace= } \:
+
+% \def\:{\syst_helpers_reinspect_next_character}
+% \expandafter\def\: {\let\if_next_blank_space_token\iftrue\futurelet\nexttoken\syst_helpers_inspect_next_character}
+%
+% \def\:{\syst_helpers_reinspect_next_optional_character}
+% \expandafter\def\: {\let\if_next_blank_space_token\iftrue\futurelet\nexttoken\syst_helpers_inspect_next_optional_character}
+%
+% \def\:{\syst_helpers_reinspect_next_bgroup_character}
+% \expandafter\def\: {\let\if_next_blank_space_token\iftrue\futurelet\nexttoken\syst_helpers_inspect_next_bgroup_character}
+%
+% \def\:{\syst_helpers_reinspect_next_parenthesis_character}
+% \expandafter\def\: {\let\if_next_blank_space_token\iftrue\futurelet\nexttoken\syst_helpers_inspect_next_parenthesis_character}
+%
+% \def\:{\syst_helpers_ignore_spacing_blankspace}
+% \expandafter\def\: {\futurelet\nexttoken\syst_helpers_ignore_spacing}
+
+\let\:\next
+
+%D \macros
+%D {setvalue,setgvalue,setevalue,setxvalue,
+%D letvalue,letgvalue,getvalue,resetvalue,
+%D undefinevalue,ignorevalue}
+%D
+%D \TEX's primitive \type {\csname} can be used to construct all kind of commands
+%D that cannot be defined with \type {\def} and \type {\let}. Every macro programmer
+%D sooner or later wants macros like these.
+%D
+%D \starttyping
+%D \setvalue {name}{...} = \def\name{...}
+%D \setgvalue {name}{...} = \gdef\name{...}
+%D \setevalue {name}{...} = \edef\name{...}
+%D \setxvalue {name}{...} = \xdef\name{...}
+%D \letvalue {name}=\... = \let\name=\...
+%D \letgvalue {name}=\... = \glet\name=\...
+%D \getvalue {name} = \name
+%D \resetvalue {name} = \def\name{}
+%D \stoptyping
+%D
+%D As we will see, \CONTEXT\ uses these commands many times, which is mainly due to
+%D its object oriented and parameter driven character.
+
+\def\setvalue #1{\expandafter\def \csname#1\endcsname}
+\def\setgvalue #1{\expandafter\gdef\csname#1\endcsname}
+\def\setevalue #1{\expandafter\edef\csname#1\endcsname}
+\def\setxvalue #1{\expandafter\xdef\csname#1\endcsname}
+\def\getvalue #1{\csname#1\endcsname} % maybe: \begincsname#1\endcsname
+\def\letvalue #1{\expandafter\let \csname#1\endcsname}
+\def\letgvalue #1{\expandafter\glet\csname#1\endcsname}
+\def\resetvalue #1{\expandafter\let \csname#1\endcsname\empty}
+\def\undefinevalue#1{\expandafter\let \csname#1\endcsname\undefined}
+\def\ignorevalue#1#2{\expandafter\let \csname#1\endcsname\empty}
+
+\def\setuvalue #1{\normalprotected\expandafter \def\csname#1\endcsname}
+\def\setuevalue #1{\normalprotected\expandafter\edef\csname#1\endcsname}
+\def\setugvalue #1{\normalprotected\expandafter\gdef\csname#1\endcsname}
+\def\setuxvalue #1{\normalprotected\expandafter\xdef\csname#1\endcsname}
+
+\unexpanded\def\getuvalue#1{\csname#1\endcsname}
+
+%D \macros
+%D {globallet,glet}
+%D
+%D In \CONTEXT\ of May 2000 using \type {\globallet} instead of the two tokens will
+%D save us some $300\times4=1200$ bytes of format file on a 32~bit system. Not that
+%D it matters much today. This shortcut is already defined:
+
+\let\globallet\glet
+
+%D \macros
+%D {doifundefined,doifdefined,
+%D doifundefinedelse,doifdefinedelse,
+%D doifalldefinedelse}
+%D
+%D The standard way of testing if a macro is defined is comparing its meaning with
+%D another undefined one, usually \type{\undefined}. To garantee correct working of
+%D the next set of macros, \type{\undefined} may never be defined!
+%D
+%D \starttyping
+%D \doifundefined {string} {...}
+%D \doifdefined {string} {...}
+%D \doifundefinedelse {string} {then ...} {else ...}
+%D \doifdefinedelse {string} {then ...} {else ...}
+%D \doifalldefinedelse {commalist} {then ...} {else ...}
+%D \stoptyping
+%D
+%D Every macroname that \TEX\ builds gets an entry in the hash table, which is of
+%D limited size. It is expected that \ETEX\ will offer a less memory||consuming
+%D alternative.
+
+%D Although it will probably never be a big problem, it is good to be aware of the
+%D difference between testing on a macro name to be build by using \type{\csname} and
+%D \type{\endcsname} and testing the \type{\name} directly.
+%D
+%D \starttyping
+%D \expandafter\ifx\csname NameA\endcsname\relax ... \else ... \fi
+%D
+%D \ifundefined\NameB ... \else ... \fi
+%D \stoptyping
+
+% \suppressifcsnameerror\plusone % already set
+
+\def\doifelseundefined#1%
+ {\ifcsname#1\endcsname
+ \expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments
+ \fi}
+
+\def\doifelsedefined#1%
+ {\ifcsname#1\endcsname
+ \expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifundefined#1%
+ {\ifcsname#1\endcsname
+ \expandafter\gobbleoneargument\else\expandafter\firstofoneargument
+ \fi}
+
+\def\doifdefined#1%
+ {\ifcsname#1\endcsname
+ \expandafter\firstofoneargument\else\expandafter\gobbleoneargument
+ \fi}
+
+\let\doifundefinedelse\doifelseundefined
+\let\doifdefinedelse \doifelsedefined
+
+%D \macros
+%D {letbeundefined}
+%D
+%D Testing for being undefined comes down to testing on \type {\relax} when we use
+%D \type {\csname}, but when using \type {\ifx}, we test on being \type
+%D {\undefined}! In \ETEX\ we have \type {\ifcsname} and that way of testing on
+%D existance is not the same as the one described here. Therefore we introduce:
+
+\unexpanded\def\letbeundefined#1% potential stack buildup when used \global
+ {\expandafter\let\csname#1\endcsname\undefined} % or use \undefinevalue to match \setvalue
+
+\unexpanded\def\localundefine#1% conditional
+ {\ifcsname#1\endcsname\expandafter\let\csname#1\endcsname\undefined\fi}
+
+\unexpanded\def\globalundefine#1% conditional
+ {\ifcsname#1\endcsname\expandafter\glet\csname#1\endcsname\undefined\fi}
+
+%D Beware, being \type {\undefined} in \ETEX\ means that the macro {\em is} defined!
+%D
+%D When we were developing the scientific units module, we encountered different
+%D behavior in text and math mode, which was due to this grouping subtilities. We
+%D therefore decided to use \type{\begingroup} instead of \type{\bgroup}.
+
+\unexpanded\def\doifelsealldefined#1%
+ {\begingroup
+ \donetrue % we could use a reserved one and avoid the group
+ \processcommalist[#1]\syst_helpers_do_if_all_defined_else
+ \ifdone
+ \endgroup\expandafter\firstoftwoarguments
+ \else
+ \endgroup\expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifalldefinedelse\doifelsealldefined
+
+\def\syst_helpers_do_if_all_defined_else#1%
+ {\ifcsname#1\endcsname\else
+ \donefalse
+ \expandafter\quitcommalist % added
+ \fi}
+
+%D \macros
+%D {doif,doifelse,doifnot}
+%D
+%D Programming in \TEX\ differs from programming in procedural languages like
+%D \MODULA. This means that one --- well, let me speek for myself --- tries to do
+%D the things in the well known way. Therefore the next set of \type{\ifthenelse}
+%D commands were between the first ones we needed. A few years later, the opposite
+%D became true: when programming in \MODULA, I sometimes miss handy things like
+%D grouping, runtime redefinition, expansion etc. While \MODULA\ taught me to
+%D structure, \TEX\ taught me to think recursive.
+%D
+%D \starttyping
+%D \doif {string1} {string2} {...}
+%D \doifnot {string1} {string2} {...}
+%D \doifelse {string1} {string2} {then ...}{else ...}
+%D \stoptyping
+
+\unexpanded\def\doifelse#1#2%
+ {\iftok{#1}{#2}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\unexpanded\def\doif#1#2%
+ {\iftok{#1}{#2}%
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\unexpanded\def\doifnot#1#2%
+ {\iftok{#1}{#2}%
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+%D \macros
+%D {doifempty,doifemptyelse,doifnotempty}
+%D
+%D We complete our set of conditionals with:
+%D
+%D \starttyping
+%D \doifempty {string} {...}
+%D \doifnotempty {string} {...}
+%D \doifemptyelse {string} {then ...} {else ...}
+%D \stoptyping
+%D
+%D This time, the string is not expanded.
+
+\unexpanded\def\doifelseempty#1%
+ {\def\m_syst_string_one{#1}%
+ \ifx\m_syst_string_one\empty
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifemptyelse\doifelseempty
+
+\unexpanded\def\doifempty#1%
+ {\def\m_syst_string_one{#1}%
+ \ifx\m_syst_string_one\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\unexpanded\def\doifnotempty#1%
+ {\def\m_syst_string_one{#1}%
+ \ifx\m_syst_string_one\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+%D \macros
+%D {doifinset,doifnotinset,doifinsetelse}
+%D
+%D We can check if a string is present in a comma separated set of strings.
+%D Depending on the result, some action is taken.
+%D
+%D \starttyping
+%D \doifinset {string} {string,...} {...}
+%D \doifnotinset {string} {string,...} {...}
+%D \doifinsetelse {string} {string,...} {then ...} {else ...}
+%D \stoptyping
+
+% !0nop=\doifinsetelse{ccc}{,}{yes}{nop}
+% !0nop=\doifinsetelse{ccc}{,,}{yes}{nop}
+% !0nop=\doifinsetelse{ccc}{,,,}{yes}{nop}
+
+% !1nop=\doifinsetelse{}{}{yes}{nop}
+% !2yes=\doifinsetelse{aaa}{bbb,ccc,ddd,aaa,eee}{yes}{nop}
+% !3nop=\doifinsetelse{aaa}{bbb}{yes}{nop}
+% !4yes=\doifinsetelse{aaa}{aaa}{yes}{nop}
+% !5nop=\doifinsetelse{aaaa}{bbb,ccc,ddd,aaa,eee}{yes}{nop}
+% !6nop=\doifinsetelse{}{}{yes}{nop}
+% !7nop=\doifinsetelse{}{aaa}{yes}{nop}
+% !8nop=\doifinsetelse{aaa}{}{yes}{nop}
+
+% !1=\doifinset{}{}{yes}
+% !2yes=\doifinset{aaa}{bbb,ccc,ddd,aaa,eee}{yes}
+% !3=\doifinset{aaa}{bbb}{yes}
+% !4yes=\doifinset{aaa}{aaa}{yes}
+% !5=\doifinset{}{}{yes}
+% !6=\doifinset{aaa}{}{yes}
+
+% !1yes=\doifnotinset{}{}{yes}
+% !2=\doifnotinset{aaa}{bbb,ccc,ddd,aaa,eee}{yes}
+% !3yes=\doifnotinset{aaa}{bbb}{yes}
+% !4=\doifnotinset{aaa}{aaa}{yes}
+% !5yes=\doifnotinset{}{}{yes}
+% !6yes=\doifnotinset{aaa}{}{yes}
+
+\unexpanded\def\doifelseinset#1#2{\clf_doifelseinset{#1}{#2}}
+\unexpanded\def\doifinset #1#2{\clf_doifinset {#1}{#2}}
+\unexpanded\def\doifnotinset #1#2{\clf_doifnotinset {#1}{#2}}
+ % \let\firstinset \clf_firstinset
+
+\let\doifinsetelse\doifelseinset
+
+%D \macros
+%D {doifcommon,doifnotcommon,doifcommonelse}
+%D
+%D Probably the most time consuming tests are those that test for overlap in sets
+%D of strings.
+%D
+%D \starttyping
+%D \doifcommon {string,...} {string,...} {...}
+%D \doifnotcommon {string,...} {string,...} {...}
+%D \doifcommonelse {string,...} {string,...} {then ...} {else ...}
+%D \stoptyping
+
+% !1yes=\doifcommonelse{aaa,bbb,ccc}{aaa,bbb,ccc}{yes}{nop}
+% !2nop=\doifcommonelse{aaa,bbb,ccc}{ddd,eee,fff}{yes}{nop}
+% !3nop=\doifcommonelse{aaa}{ddd,eee,fff}{yes}{nop}
+% !4yes=\doifcommonelse{aaa}{aaa}{yes}{nop}
+% !5nop=\doifcommonelse{bbb}{aaa}{yes}{nop}
+% !6nop=\doifcommonelse{}{aaa,bbb,ccc}{yes}{nop}
+% !7nop=\doifcommonelse{aaa,bbb,ccc}{}{yes}{nop}
+% !8nop=\doifcommonelse{}{}{yes}{nop}
+
+% !9nop=\doifcommonelse{,,}{,,}{yes}{nop}
+% !9yes=\doifcommonelse{,a,}{,a,}{yes}{nop}
+% !9yes=\doifcommonelse{,,a,}{,a,}{yes}{nop}
+% !9yes=\doifcommonelse{,a,}{,,a,}{yes}{nop}
+% !9yes=\doifcommonelse{,a,}{,,,a,}{yes}{nop}
+% !9yes=\doifcommonelse{,,a,}{,,,a,}{yes}{nop}
+
+\unexpanded\def\doifelsecommon#1#2{\clf_doifelsecommon{#1}{#2}}
+\unexpanded\def\doifcommon #1#2{\clf_doifcommon {#1}{#2}}
+\unexpanded\def\doifnotcommon #1#2{\clf_doifnotcommon {#1}{#2}}
+
+\let\doifcommonelse\doifelsecommon
+
+%D \macros
+%D {processcommalist,processcommacommand,quitcommalist,
+%D processcommalistwithparameters}
+%D
+%D We've already seen some macros that take care of comma separated lists. Such
+%D list can be processed with
+%D
+%D \starttyping
+%D \processcommalist[string,string,...]\commando
+%D \stoptyping
+%D
+%D The user supplied command \type{\commando} receives one argument: the string.
+%D This command permits nesting and spaces after commas are skipped. Empty sets
+%D are no problem.
+%D
+%D \startbuffer
+%D \def\dosomething#1{(#1)}
+%D
+%D 1: \processcommalist [\hbox{$a,b,c,d,e,f$}] \dosomething \par
+%D 2: \processcommalist [{a,b,c,d,e,f}] \dosomething \par
+%D 3: \processcommalist [{a,b,c},d,e,f] \dosomething \par
+%D 4: \processcommalist [a,b,{c,d,e},f] \dosomething \par
+%D 5: \processcommalist [a{b,c},d,e,f] \dosomething \par
+%D 6: \processcommalist [{a,b}c,d,e,f] \dosomething \par
+%D 7: \processcommalist [] \dosomething \par
+%D 8: \processcommalist [{[}] \dosomething \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Before we show the result, we present the macro's:
+
+\newcount\commalevel
+
+\installsystemnamespace{nextcommalevel}
+
+\def\syst_helpers_do_do_do_process_comma_item
+ {\csname\??nextcommalevel\the\commalevel\endcsname}
+
+% \ifcase\contextlmtxmode
+
+ \def\syst_helpers_do_process_comma_item
+ {\futurelet\nexttoken\syst_helpers_do_do_process_comma_item}
+
+ \def\syst_helpers_do_do_process_comma_item
+ {\ifx\nexttoken\blankspace
+ \expandafter\syst_helpers_re_do_process_comma_item
+ \else
+ \expandafter\syst_helpers_do_do_process_comma_item_indeed
+ \fi}
+
+ \def\syst_helpers_do_do_process_comma_item_indeed
+ {\ifx\nexttoken]%
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\syst_helpers_do_do_do_process_comma_item
+ \fi}
+
+% \else
+%
+% \def\syst_helpers_do_process_comma_item
+% {\futureexpandis]\gobbleoneargument\syst_helpers_do_do_do_process_comma_item}
+%
+% \fi
+
+%D Empty arguments are not processed. Empty items (\type {,,}) however are
+%D treated. We have to check for the special case \type {[{a,b,c}]}.
+
+\unexpanded\def\processcommalist[%
+ {\futurelet\nexttoken\syst_helpers_do_check_comma_item}
+
+\def\syst_helpers_do_check_comma_item
+ {\ifx\nexttoken]%
+ \expandafter\gobblethreearguments
+ \else
+ \expandafter\syst_helpers_do_process_comma_list
+ \fi
+ \relax} % this one preserved the next {}
+
+\def\syst_helpers_do_process_comma_list#1]#2%
+ {\global\advance\commalevel \plusone
+ \expandafter\def\csname\??nextcommalevel\the\commalevel\endcsname##1,%
+ {#2{##1}\syst_helpers_do_process_comma_item}%
+ \syst_helpers_do_do_process_comma_item_gobble#1,]\relax
+ \global\advance\commalevel \minusone }
+
+\def\syst_helpers_do_do_process_comma_item_gobble#1{\syst_helpers_do_do_process_comma_item}
+
+%D One way of quitting a commalist halfway is:
+
+\unexpanded\def\quitcommalist
+ {\begingroup\let\syst_helpers_do_process_comma_item\syst_helpers_do_quit_comma_list}
+
+\def\syst_helpers_do_quit_comma_list#1]%
+ {\endgroup}
+
+\unexpanded\def\quitprevcommalist
+ {\begingroup\let\syst_helpers_do_process_comma_item\syst_helpers_do_quit_prev_comma_list}
+
+\def\syst_helpers_do_quit_prev_comma_list#1]%
+ {\let\syst_helpers_do_process_comma_item\syst_helpers_do_quit_comma_list}
+
+%D The hack we used for checking the next character \type {\doifnextcharelse}
+%D is also used here.
+
+% \ifcase\contextlmtxmode
+
+ \let\next\:
+
+ \def\:{\syst_helpers_re_do_process_comma_item} % \:not saved ?
+
+ \expandafter\def\: {\futurelet\nexttoken\syst_helpers_do_do_process_comma_item}
+
+ \let\:\next
+
+% \fi
+
+%D The previous examples lead to:
+%D
+%D \getbuffer
+
+%D When a list is saved in a macro, we can use a construction like:
+%D
+%D \starttyping
+%D \expandafter\processcommalist\expandafter[\list]\command
+%D \stoptyping
+%D
+%D Such solutions suit most situations, but we wanted a bit more.
+%D
+%D \starttyping
+%D \processcommacommand[string,\stringset,string]\commando
+%D \stoptyping
+%D
+%D where \type{\stringset} is a predefined set, like:
+%D
+%D \starttyping
+%D \def\first{aap,noot,mies}
+%D \def\second{laatste}
+%D
+%D \processcommacommand[\first]\message
+%D \processcommacommand[\first,second,third]\message
+%D \processcommacommand[\first,between,\second]\message
+%D \stoptyping
+%D
+%D Commands that are part of the list are expanded, so the use of this macro has its
+%D limits.
+
+\unexpanded\def\processcommacommand[#1]%
+ {\normalexpanded{\processcommalist[#1]}}
+
+%D The argument to \type{\command} is not delimited. Because we often use \type {[]}
+%D as delimiters, we also have:
+%D
+%D \starttyping
+%D \processcommalistwithparameters[string,string,...]\command
+%D \stoptyping
+%D
+%D where \type{\command} looks like:
+%D
+%D \starttyping
+%D \def\command[#1]{... #1 ...}
+%D \stoptyping
+
+\unexpanded\def\processcommalistwithparameters[#1]#2%
+ {\def\syst_helpers_do_process_comma_list_with_parameters##1{#2[##1]}%
+ \processcommalist[#1]\syst_helpers_do_process_comma_list_with_parameters}
+
+%D \macros
+%D {startprocesscommalist,startprocesscommacommand}
+%D
+%D Two more:
+
+\let\syst_helpers_comma_list_step\relax
+
+\unexpanded\def\startprocesscommalist[#1]#2\stopprocesscommalist
+ {\def\syst_helpers_comma_list_step##1{\def\currentcommalistitem{##1}#2}%
+ \processcommalist[#1]\syst_helpers_comma_list_step}
+
+\unexpanded\def\startprocesscommacommand[#1]#2\stopprocesscommacommand
+ {\def\syst_helpers_comma_list_step##1{\def\currentcommalistitem{##1}#2}%
+ \normalexpanded{\processcommalist[#1]}\syst_helpers_comma_list_step}
+
+\let\stopprocesscommalist \relax
+\let\stopprocesscommacommand\relax
+
+%D \macros
+%D {processaction,
+%D processfirstactioninset,
+%D processallactionsinset}
+%D
+%D \CONTEXT\ makes extensive use of a sort of case or switch command. Depending of
+%D the presence of one or more provided items, some actions is taken. These macros
+%D can be nested without problems.
+%D
+%D \starttyping
+%D \processaction [x] [a=>\a,b=>\b,c=>\c]
+%D \processfirstactioninset [x,y,z] [a=>\a,b=>\b,c=>\c]
+%D \processallactionsinset [x,y,z] [a=>\a,b=>\b,c=>\c]
+%D \stoptyping
+%D
+%D We can supply both a \type {default} action and an action to be undertaken when
+%D an \type {unknown} value is met:
+%D
+%D \starttyping
+%D \processallactionsinset
+%D [x,y,z]
+%D [ a=>\a,
+%D b=>\b,
+%D c=>\c,
+%D default=>\default,
+%D unknown=>\unknown{... \commalistelement ...}]
+%D \stoptyping
+%D
+%D When \type {#1} is empty, this macro scans list \type {#2} for the keyword \type
+%D {default} and executed the related action if present. When \type {#1} is non
+%D empty and not in the list, the action related to \type {unknown} is executed.
+%D Both keywords must be at the end of list \type{#2}. Afterwards, the actually
+%D found keyword is available in \type {\commalistelement}. An advanced example of
+%D the use of this macro can be found in \PPCHTEX, where we completely rely on \TEX\
+%D for interpreting user supplied keywords like \type {SB}, \type {SB1..6}, \type
+%D {SB125} etc.
+
+\newcount\processlevel
+
+\unexpanded\def\syst_helpers_do_compare_process_action_a[#1=>#2][#3]%
+ {\edef\m_syst_string_two{#1}%
+ \ifx\m_syst_string_two\s!default
+ \let\commalistelement\empty
+ #2%
+ \fi}
+
+% met \quitcommalist tot meer dan 25\% sneller
+
+\unexpanded\def\syst_helpers_do_compare_process_action_b[#1=>#2][#3]%
+ {\edef\m_syst_string_two{#1}%
+ \ifx\m_syst_string_one\m_syst_string_two
+ \def\commalistelement{#3}%
+ #2%
+ \expandafter\quitcommalist
+ \orelse\ifx\m_syst_string_two\s!unknown
+ \def\commalistelement{#3}% beware of loops
+ #2%
+ \fi}
+
+\unexpanded\def\processaction[#1]#2[%
+ {\edef\m_syst_string_one{#1}%
+ \ifx\m_syst_string_one\empty
+ \let\syst_helpers_do_compare_process_action\syst_helpers_do_compare_process_action_a
+ \else
+ \let\syst_helpers_do_compare_process_action\syst_helpers_do_compare_process_action_b
+ \fi
+ \edef\syst_helpers_do_process_action##1{\syst_helpers_do_compare_process_action[##1][#1]}% expands #1
+ \processnextcommalist\relax\relax\syst_helpers_do_process_action[}
+
+\unexpanded\def\syst_helpers_do_compare_process_action_c[#1=>#2][#3]%
+ {\edef\m_syst_string_one{#1}%
+ \edef\m_syst_string_two{#3}%
+ \ifx\m_syst_string_one\m_syst_string_two
+ \def\commalistelement{#3}%
+ #2%
+ \expandafter\quitprevcommalist
+ \else
+ \edef\m_syst_string_one{#1}%
+ \ifx\m_syst_string_one\s!unknown
+ \def\commalistelement{#3}%
+ #2%
+ \fi
+ \fi}
+
+\unexpanded\def\processfirstactioninset[#1]%
+ {\edef\m_syst_string_one{#1}%
+ \ifx\m_syst_string_one\empty
+ \expandafter\processaction
+ \else
+ \expandafter\syst_helpers_process_first_action_in_set_indeed
+ \fi
+ [#1]}
+
+\unexpanded\def\syst_helpers_process_first_action_in_set_indeed[#1]#2[#3]%
+ {\def\syst_helpers_do_process_action##1%
+ {\def\syst_helpers_do_do_process_action####1{\syst_helpers_do_compare_process_action_c[####1][##1]}%
+ \processcommalist[#3]\syst_helpers_do_do_process_action}%
+ \normalexpanded{\processcommalist[#1]}\syst_helpers_do_process_action}
+
+\unexpanded\def\syst_helpers_do_compare_process_action_d[#1=>#2][#3]%
+ {\edef\m_syst_string_one{#1}%
+ \edef\m_syst_string_two{#3}%
+ \ifx\m_syst_string_one\m_syst_string_two
+ \def\commalistelement{#3}%
+ #2%
+ \expandafter\quitcommalist
+ \else
+ \edef\m_syst_string_one{#1}%
+ \ifx\m_syst_string_one\s!unknown
+ \def\commalistelement{#3}%
+ #2%
+ \fi
+ \fi}
+
+\installsystemnamespace{nextactionlevel}
+
+\unexpanded\def\syst_helpers_do_process_all_actions_in_set
+ {\csname\??nextactionlevel\the\processlevel\endcsname}
+
+\unexpanded\def\processallactionsinset[#1]%
+ {\edef\m_syst_string_one{#1}%
+ \ifx\m_syst_string_one\empty
+ \expandafter\processaction
+ \else
+ \expandafter\syst_helpers_process_all_actions_in_set_indeed
+ \fi
+ [#1]}
+
+\unexpanded\def\syst_helpers_process_all_actions_in_set_indeed[#1]#2[#3]%
+ {\advance\processlevel \plusone
+ \expandafter\def\csname\??nextactionlevel\the\processlevel\endcsname##1%
+ {\def\syst_helpers_do_do_process_action####1{\syst_helpers_do_compare_process_action_d[####1][##1]}%
+ \processcommalist[#3]\syst_helpers_do_do_process_action}%
+ \normalexpanded{\processcommalist[#1]}\syst_helpers_do_process_all_actions_in_set
+ \advance\processlevel\minusone}
+
+%D These macros use:
+
+\unexpanded\def\processnextcommalist#1#2#3[#4#5]%
+ {#1%
+ \let\nexttoken#4%
+ \global\advance\commalevel \plusone
+ \expandafter\def\csname\??nextcommalevel\the\commalevel\endcsname##1,%
+ {#3{##1}\syst_helpers_do_process_comma_item}%
+ \syst_helpers_do_do_process_comma_item#4#5,]\relax
+ \global\advance\commalevel\minusone
+ #2}
+
+%D \macros
+%D {getfirstcharacter, firstcharacter, remainingcharacters, doiffirstcharacter}
+%D
+%D Sometimes the action to be undertaken depends on the next character. This macro
+%D get this character and puts it in \type {\firstcharacter}.
+%D
+%D \starttyping
+%D \getfirstcharacter {string}
+%D \stoptyping
+%D
+%D A two step expansion is used to prevent problems with complicated arguments, for
+%D instance arguments that consist of two or more expandable tokens.
+
+\let\firstcharacter \empty
+\let\remainingcharacters\empty
+
+\unexpanded\def\getfirstcharacter #1{\clf_getfirstcharacter{#1}}
+\unexpanded\def\doifelsefirstchar #1#2{\clf_doifelsefirstchar{#1}{#2}}
+\unexpanded\def\thefirstcharacter #1{\clf_thefirstcharacter{#1}}
+\unexpanded\def\theremainingcharacters#1{\clf_theremainingcharacters{#1}}
+
+\let\doiffirstcharelse\doifelsefirstchar
+
+%D \macros
+%D {doifinstringelse, doifincsnameelse}
+%D
+%D We can check for the presence of a substring in a given sequence of characters.
+%D
+%D \starttyping
+%D \doifinsetelse {substring} {string} {then ...} {else ...}
+%D \stoptyping
+
+\let\m_syst_sub_string\empty
+
+\unexpanded\def\doifelseinstring#1%
+ {\edef\m_syst_sub_string{#1}% expand #1 here
+ \ifx\m_syst_sub_string\empty
+ \expandafter\thirdofthreearguments
+ \else
+ \expandafter\syst_helpers_do_if_in_string_else_indeed
+ \fi}
+
+\let\doifinstringelse\doifelseinstring
+
+\unexpanded\def\syst_helpers_do_if_in_string_else_indeed#1%
+ {\syst_helpers_do_if_in_string_else\m_syst_sub_string{#1}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\unexpanded\def\doifinstring#1%%
+ {\edef\m_syst_sub_string{#1}% expand #1 here
+ \ifx\m_syst_sub_string\empty
+ \expandafter\gobbletwoarguments
+ \else
+ \expandafter\syst_helpers_do_if_in_string_indeed
+ \fi}
+
+\unexpanded\def\syst_helpers_do_if_in_string_indeed#1%
+ {\syst_helpers_do_if_in_string_else\m_syst_sub_string{#1}%
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\unexpanded\def\doifnotinstring#1%%
+ {\edef\m_syst_sub_string{#1}% expand #1 here
+ \ifx\m_syst_sub_string\empty
+ \expandafter\gobbletwoarguments
+ \else
+ \expandafter\syst_helpers_do_if_not_in_string_indeed
+ \fi}
+
+\unexpanded\def\syst_helpers_do_if_not_in_string_indeed#1%
+ {\syst_helpers_do_if_in_string_else\m_syst_sub_string{#1}%
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+% replaces prev
+
+\unexpanded\def\syst_helpers_do_if_in_string_else#1#2% ##2 can be {abc}
+ {\expandafter\def\expandafter\syst_helpers_do_do_if_in_string_else
+ \expandafter##\expandafter1#1##2##3^^^^0004{\unless\if##2@}% expand #1 here
+ \expandafter\syst_helpers_do_do_if_in_string_else\normalexpanded{#2#1}@@^^^^0004} % expand #2 here
+
+%D The next alternative proved to be upto twice as fast on tasks like checking
+%D reserved words in pretty verbatim typesetting! This is mainly due to the fact
+%D that passing (expanded) strings is much slower that passing a macro.
+%D
+%D \starttyping
+%D \doifincsnameelse {substring} {\string} {then ...} {else ...}
+%D \stoptyping
+%D
+%D Where \type {\doifinstringelse} does as much expansion as possible, the latter
+%D alternative does minimal (one level) expansion.
+
+\unexpanded\def\syst_helpers_do_if_in_csname_else#1#2%
+ {\def\syst_helpers_do_do_if_in_csname_else##1#1##2##3^^^^0004%
+ {\unless\if##2@}%
+ \expandafter\syst_helpers_do_do_if_in_csname_else#2#1@@^^^^0004}
+
+\unexpanded\def\doifelseincsname#1#2%
+ {\normalexpanded{\syst_helpers_do_if_in_csname_else{#1}}{#2}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifincsnameelse\doifelseincsname
+
+%D \macros
+%D {doifnumberelse,doifnumber,doifnotnumber}
+%D
+%D The next macro executes a command depending of the outcome of a test on numerals.
+%D This is probably one of the fastest test possible, exept from a less robust
+%D 10||step \type {\if}||ladder or some tricky \type {\lcode} checking.
+%D
+%D \starttyping
+%D \doifnumberelse {string} {then ...} {else ...}
+%D \stoptyping
+%D
+%D The macro accepts \type {123}, \type {abc}, \type {{}}, \type {\getal} and \type
+%D {\the\count...}. This macro is a rather dirty one.
+
+\def\doifelsenumber#1%
+ {\ifchknum#1\or
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifnumber#1%
+ {\ifchknum#1\or
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\doifnotnumber#1%
+ {\ifchknum#1\or
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\let\doifnumberelse\doifelsenumber
+
+%D \macros
+%D {setpercentdimen}
+%D
+%D \starttyping
+%D \scratchdimen=100pt \setpercentdimen\scratchdimen{10\letterpercent}
+%D \scratchdimen=100pt \setpercentdimen\scratchdimen{5pt}
+%D \scratchdimen \percentdimen \hsize {10\letterpercent}
+%D \stoptyping
+
+\def\percentdimen#1#2% dimen percentage (with %)
+ {\dimexpr\clf_percentageof{#2}\dimexpr#1\relax}
+
+\unexpanded\def\setpercentdimen#1#2% dimen percentage (with %)
+ {#1=\clf_percentageof{#2}\dimexpr#1\relax}
+
+%D \macros
+%D {makerawcommalist,
+%D rawdoinsetelse,
+%D rawprocesscommalist,
+%D rawprocessaction}
+%D
+%D Some of the commands mentioned earlier are effective but slow. When one is
+%D desperately in need of faster alternatives and when the conditions are
+%D predictable safe, the \type {\raw} alternatives come into focus. A major drawback
+%D is that they do not take \type {\c!constants} into account, simply because no
+%D expansion is done. This is no problem with \type {\rawprocesscommalist}, because
+%D this macro does not compare anything. Expandable macros are permitted as search
+%D string.
+%D
+%D \starttyping
+%D \makerawcommalist[string,string,...]\stringlist
+%D \rawdoifelseinset{string}{string,...}{...}{...}
+%D \rawprocesscommalist[string,string,...]\commando
+%D \rawprocessaction[x][a=>\a,b=>\b,c=>\c]
+%D \stoptyping
+%D
+%D Spaces embedded in the list, for instance after commas, spoil the search process.
+%D The gain in speed depends on the length of the argument (the longer the argument,
+%D the less we gain).
+
+\unexpanded\def\makerawcommalist[#1]#2% use \processnext ... here
+ {\def\syst_helpers_do_make_raw_comma_list##1% we don't expand ##1
+ {\ifx#2\empty
+ \def#2{##1}%
+ \else
+ \expandafter\def\expandafter#2\expandafter{#2,##1}%
+ \fi}%
+ \let#2\empty
+ \processcommalist[#1]\syst_helpers_do_make_raw_comma_list}
+
+\def\syst_helpers_raw_process_comma_item#1,#2% #2 eats up preceding space
+ {\if]#1\else
+ \csname\??nextcommalevel\the\commalevel\endcsname{#1}%
+ \expandafter\syst_helpers_raw_process_comma_item
+ \fi#2}
+
+\unexpanded\def\rawprocesscommalist[#1]#2% accepteert ook [\cs]
+ {\global\advance\commalevel \plusone
+ \expandafter\let\csname\??nextcommalevel\the\commalevel\endcsname#2%
+ \expandafter\syst_helpers_raw_process_comma_item#1,],% \relax
+ \global\advance\commalevel \minusone }
+
+\unexpanded\def\rawprocesscommacommand[#1]% not really needed
+ {\normalexpanded{\rawprocesscommalist[#1]}}
+
+%D Here is one without nesting:
+
+\unexpanded\def\syst_helpers_fast_process_comma_item#1,#2% #2 eats up preceding space
+ {\if]#1\else
+ \syst_helpers_fast_process_comma_command{#1}%
+ \expandafter\syst_helpers_fast_process_comma_item
+ \fi#2}
+
+\unexpanded\def\fastprocesscommalist[#1]#2% accepteert ook [\cs]
+ {\let\syst_helpers_fast_process_comma_command#2%
+ \expandafter\syst_helpers_fast_process_comma_item#1,],}% \relax
+
+\unexpanded\def\fastprocesscommacommand[#1]#2% accepteert ook [\cs]
+ {\let\syst_helpers_fast_process_comma_command#2%
+ \normalexpanded{\syst_helpers_fast_process_comma_item#1},],}% \relax
+
+% \def\rawdoifelseinset#1#2{\doifinstringelse{,#1,}{,#2,}}
+% \def\rawdoifinset #1#2{\doifinstring {,#1,}{,#2,}}
+
+\def\m_syst_two_commas{,,}
+
+\unexpanded\def\rawdoifelseinset#1%
+ {\edef\m_syst_sub_string{,#1,}% expand #1 here
+ \ifx\m_syst_sub_string\m_syst_two_commas
+ \expandafter\thirdofthreearguments
+ \else
+ \expandafter\syst_helpers_raw_do_if_in_set_else
+ \fi}
+
+\let\rawdoifinsetelse\rawdoifinsetelse
+
+\unexpanded\def\syst_helpers_raw_do_if_in_set_else#1%
+ {\syst_helpers_do_if_in_string_else\m_syst_sub_string{,#1,}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\unexpanded\def\rawdoifinset#1%
+ {\edef\m_syst_sub_string{,#1,}% expand #1 here
+ \ifx\m_syst_sub_string\m_syst_two_commas
+ \expandafter\gobbletwoarguments
+ \else
+ \expandafter\syst_helpers_raw_do_if_in_set
+ \fi}
+
+\unexpanded\def\syst_helpers_raw_do_if_in_set#1%%
+ {\syst_helpers_do_if_in_string_else\m_syst_sub_string{,#1,}%
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+%D Some more raw material:
+
+\def\syst_helpers_do_raw_process_action[#1][#2]%
+ {\def\syst_helpers_do_do_raw_process_action##1,#1=>##2,##3^^^^0004%
+ {\if##3@\else
+ \def\m_syst_helpers_process_action{##2}%
+ \fi}%
+ \syst_helpers_do_do_raw_process_action,#2,#1=>,@^^^^0004}
+
+\unexpanded\def\rawprocessaction[#1]#2[#3]%
+ {\edef\m_syst_string_one{#1}%
+ \edef\m_syst_string_two{undefined}% better \!!undefined
+ \let\m_syst_helpers_process_action\m_syst_string_two
+ \ifx\m_syst_string_one\empty
+ \expandafter\syst_helpers_do_raw_process_action\expandafter[\s!default][#3]%
+ \else
+ \expandafter\syst_helpers_do_raw_process_action\expandafter[\m_syst_string_one][#3]%
+ \ifx\m_syst_helpers_process_action\m_syst_string_two
+ \expandafter\syst_helpers_do_raw_process_action\expandafter[\s!unknown][#3]%
+ \fi
+ \fi
+ \ifx\m_syst_helpers_process_action\m_syst_string_two
+ \else
+ \m_syst_helpers_process_action
+ \fi}
+
+%D When we process the list \type {a,b,c,d,e}, the raw routine takes over 30\% less
+%D time, when we feed $20+$ character strings we gain about 20\%. Alternatives which
+%D use \type {\futurelet} perform worse. Part of the speedup is due to the \type
+%D {\let} and \type {\expandafter} in the test.
+%D
+%D \macros
+%D {dosetvalue,dosetevalue,dosetgvalue,docopyvalue,doresetvalue,
+%D dogetvalue}
+%D
+%D When we are going to do assignments, we have to take multi||linguality into account.
+%D For the moment we keep things simple and single||lingual.
+%D
+%D \starttyping
+%D \dosetvalue {label} {variable} {value}
+%D \dosetevalue {label} {variable} {value}
+%D \dosetgvalue {label} {variable} {value}
+%D \docopyvalue {to label} {from label} {variable}
+%D \doresetvalue {label} {variable}
+%D \stoptyping
+%D
+%D These macros are in fact auxiliary ones and are not meant for use outside the
+%D assignment macros.
+
+\def\dosetvalue#1#2% #3
+ {\expandafter\def\csname#1#2\endcsname} % {#3}}
+
+\def\dosetevalue#1#2% #3
+ {\expandafter\edef\csname#1#2\endcsname} % {#3}}
+
+\def\dosetgvalue#1#2% #3
+ {\expandafter\gdef\csname#1#2\endcsname} % {#3}}
+
+\def\doresetvalue#1#2%
+ {\expandafter\let\csname#1#2\endcsname\empty}
+
+\def\doignorevalue#1#2#3%
+ {\expandafter\let\csname#1#2\endcsname\empty}
+
+\def\docopyvalue#1#2#3%
+ {\expandafter\def\csname#1#3\endcsname{\csname#2#3\endcsname}}
+
+%D \macros
+%D {doassign,undoassign,doassignempty}
+%D
+%D Assignments are the backbone of \CONTEXT. Abhorred by the concept of style file
+%D hacking, we took a considerable effort in building a parameterized system.
+%D Unfortunately there is a price to pay in terms of speed. Compared to other
+%D packages and taking the functionality of \CONTEXT\ into account, the total size
+%D of the format file is still very acceptable. Now how are these assignments done.
+%D
+%D Assignments can be realized with:
+%D
+%D \starttyping
+%D \doassign[label][variable=value]
+%D \undoassign[label][variable=value]
+%D \stoptyping
+%D
+%D and:
+%D
+%D \starttyping
+%D \doassignempty[label][variable=value]
+%D \stoptyping
+%D
+%D Assignments like \type{\doassign} are compatible with:
+%D
+%D \starttyping
+%D \def\labelvariable{value}
+%D \stoptyping
+%D
+%D We do check for the presence of an \type{=} and loudly complain of it's missed. We
+%D will redefine this macro later on, when a more advanced message mechanism is
+%D implemented.
+
+\unexpanded\def\showassignerror#1#2%
+ {\writestatus{setup}{missing or ungrouped '=' after '#1' in line #2}}
+
+\unexpanded\def\doassignempty[#1][#2=#3]%
+ {\ifcsname#1#2\endcsname\else\dosetvalue{#1}{#2}{#3}\fi}
+
+%D \macros
+%D {getparameters,geteparameters,getgparameters,
+%D forgetparameters}
+%D
+%D Using the assignment commands directly is not our ideal of user friendly interfacing,
+%D so we take some further steps.
+%D
+%D \starttyping
+%D \getparameters [label] [...=...,...=...]
+%D \forgetparameters [label] [...=...,...=...]
+%D \stoptyping
+%D
+%D Again, the label identifies the category a variable belongs to. The second argument
+%D can be a comma separated list of assignments.
+%D
+%D \starttyping
+%D \getparameters
+%D [demo]
+%D [alfa=1,
+%D beta=2]
+%D \stoptyping
+%D
+%D is equivalent to
+%D
+%D \starttyping
+%D \def\demoalfa{1}
+%D \def\demobeta{2}
+%D \stoptyping
+%D
+%D
+%D In the pre||multi||lingual stadium \CONTEXT\ took the next approach. With
+%D
+%D \starttyping
+%D \def\??demo {@@demo}
+%D \def\!!alfa {alfa}
+%D \def\!!beta {beta}
+%D \stoptyping
+%D
+%D calling
+%D
+%D \starttyping
+%D \getparameters
+%D [\??demo]
+%D [\!!alfa=1,
+%D \!!beta=2]
+%D \stoptyping
+%D
+%D lead to:
+%D
+%D \starttyping
+%D \def\@@demoalfa{1}
+%D \def\@@demobeta{2}
+%D \stoptyping
+%D
+%D Because we want to be able to distinguish the \type{!!} pre||tagged user supplied
+%D variables from internal counterparts, we will introduce a slightly different tag
+%D in the multi||lingual modules. There we will use \type{c!} or \type{v!},
+%D depending on the context.
+%D
+%D By calling \type{doassign} directly, we save ourselves some argument passing
+%D and gain some speed. Whatever optimizations we do, this command will always be
+%D one of the bigger bottlenecks. The alternative \type{\geteparameters} --- it's
+%D funny to see that this alternative saw the light so lately --- can be used to do
+%D expanded assigments.
+
+\let\currentvalue\empty
+
+\unexpanded\def\getparameters {\dogetparameters\dosetvalue}
+\unexpanded\def\geteparameters {\dogetparameters\dosetevalue}
+\unexpanded\def\getgparameters {\dogetparameters\dosetgvalue}
+\unexpanded\def\getxparameters {\dogetparameters\dosetxvalue}
+\unexpanded\def\forgetparameters{\dogetparameters\doignorevalue}
+
+\let\getexpandedparameters\geteparameters
+
+\unexpanded\def\dogetparameters#1[#2]#3[#4%
+ {\if\noexpand#4]%
+ \expandafter\gobbleoneargument
+ \else
+ \let\setsomevalue#1%
+ \def\syst_helpers_get_parameters_assign{\syst_helpers_get_parameters_assign_indeed#2}%
+ \expandafter\syst_helpers_get_parameters
+ \fi#4}
+
+\def\syst_helpers_get_parameters#1]%
+ {\xprocesscommaitem#1,],^^^^0004}
+
+\def\syst_helpers_process_comma_item#1,#2% #2 takes space before ,
+ {\if,#1,% dirty trick for testing #1=empty
+ \expandafter\syst_helpers_process_comma_item
+ \orelse\if]#1%
+ \expandafter\gobbleoneargument
+ \else
+ \syst_helpers_get_parameters_assign^^^^0004#1==\empty^^^^0004%
+ \expandafter\syst_helpers_process_comma_item
+ \fi#2}
+
+\def\syst_helpers_assign_error#1#2#3%
+ {\showassignerror{#2}{\the\inputlineno\space(#1)}}
+
+\def\syst_helpers_get_parameters_assign_normal#1^^^^0004#2=#3=#4#5^^^^0004%
+ {\ifx\empty#2\empty
+ \expandafter\syst_helpers_assign_error
+ \orelse\ifx#4\empty
+ \expandafter\syst_helpers_assign_error
+ \else
+ \expandafter\setsomevalue
+ \fi
+ {#1}{#2}{#3}}
+
+\def\syst_helpers_get_parameters_assign_error#1^^^^0004#2=#3=#4#5^^^^0004%
+ {\ifx\empty#2\empty
+ \expandafter\syst_helpers_assign_error
+ \orelse\ifx#4\empty
+ \expandafter\syst_helpers_assign_error
+ \orelse\ifcsname#1#2\endcsname
+ \expandafter\let\expandafter\currentvalue\csname#1#2\endcsname
+ \expandafter\setsomevalue
+ \else
+ \let\currentvalue\empty
+ \expandafter\setsomevalue
+ \fi
+ {#1}{#2}{#3}}
+
+\let\syst_helpers_get_parameters_assign_indeed\syst_helpers_get_parameters_assign_normal
+
+\unexpanded\def\doassign [#1][#2]{\let\setsomevalue\dosetvalue \syst_helpers_get_parameters_assign_indeed#1^^^^0004#2==\empty^^^^0004}
+\unexpanded\def\doeassign [#1][#2]{\let\setsomevalue\dosetevalue \syst_helpers_get_parameters_assign_indeed#1^^^^0004#2==\empty^^^^0004}
+\unexpanded\def\undoassign[#1][#2]{\let\setsomevalue\doresetvalue\syst_helpers_get_parameters_assign_indeed#1^^^^0004#2==\empty^^^^0004}
+
+%D \macros
+%D {processassignmentlist,processassignmentcommand,
+%D startprocessassignmentlist,startprocessassignmentcommand}
+%D
+%D For Wolfgang:
+%D
+%D \starttyping
+%D \def\showpair#1#2{key:#1, value:#2\par}
+%D \processassignmentlist[a=1,b=2]\showpair
+%D \stoptyping
+%D
+%D We can optimize this one if needed but it's not a core macro so hardly worth the
+%D trouble and tokens.
+
+\unexpanded\def\processassignmentlist[#1]#2% #2 == \command{key}{value]
+ {\def\syst_helpers_process_assignment_entry##1{#2}% {##2}{##3} % namespace is ignored
+ \dogetparameters\syst_helpers_process_assignment_entry[][#1]}
+
+\unexpanded\def\processassignmentcommand[#1]%
+ {\normalexpanded{\processassignmentlist[#1]}}
+
+\unexpanded\def\startprocessassignmentlist[#1]#2\stopprocessassignmentlist
+ {\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}%
+ \processassignmentlist[#1]\currentassignmentlistcommand}
+
+\unexpanded\def\startprocessassignmentcommand[#1]#2\stopprocessassignmentcommand
+ {\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}%
+ \normalexpanded{\processassignmentlist[#1]}\currentassignmentlistcommand}
+
+%D \macros{currentvalue}
+%D
+%D Just in case a \type{\getparameter} argument itself ends up inside a \type
+%D {\write} or other expandable location, our new macro needs a default value.
+%D
+%D \starttyping
+%D \getparameters[xxx][aaa=bbb]\par
+%D \getparameters[xxx][=bbb]\par
+%D \getparameters[xxx][aaa=]\par
+%D \getparameters[xxx][=]\par
+%D \getparameters[xxx][aaa]\par
+%D \stoptyping
+
+%D \macros
+%D {expandparameters}
+%D
+%D Example usage:
+%D
+%D \startbuffer
+%D \getparameters[taco][name=taco]
+%D \convertcommand\taconame\to\ascii \ascii
+%D \expandparameters \getparameters[taco][name=\currentvalue\space hoekwater]
+%D \convertcommand\taconame\to\ascii \ascii
+%D \getparameters[taco][name=\currentvalue\space hoekwater]
+%D \convertcommand\taconame\to\ascii \ascii
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D
+%D Here we hook in the code (beware, this is the optimized get **):
+
+\def\syst_helpers_get_parameters_normal#1]%
+ {\syst_helpers_process_comma_item#1,],^^^^0004}
+
+\def\syst_helpers_get_parameters_expanded#1]%
+ {\let\dosetnvalue\setsomevalue
+ \let\setsomevalue\dosetevalue
+ \let\syst_helpers_get_parameters_assign_indeed\syst_helpers_get_parameters_assign_error
+ \let\setsomevalue\dosetevalue
+ \syst_helpers_process_comma_item#1,],^^^^0004%
+ \let\syst_helpers_get_parameters_assign_indeed\syst_helpers_get_parameters_assign_normal
+ \let\setsomevalue\dosetnvalue
+ \let\syst_helpers_get_parameters\syst_helpers_get_parameters_normal
+ \let\currentvalue\empty}
+
+\let\syst_helpers_get_parameters\syst_helpers_get_parameters_normal % **
+
+\unexpanded\def\expandparameters
+ {\let\syst_helpers_get_parameters\syst_helpers_get_parameters_expanded}
+
+%D \macros
+%D {getemptyparameters}
+%D
+%D Sometimes we explicitly want variables to default to an empty string, so we
+%D welcome:
+%D
+%D \starttyping
+%D \getemptyparameters [label] [...=...,...=...]
+%D \stoptyping
+
+\unexpanded\def\getemptyparameters[#1]#2[#3]%
+ {\def\syst_helpers_get_empty_parameters##1{\doassignempty[#1][##1]}%
+ \processcommalist[#3]\syst_helpers_get_empty_parameters}
+
+%D \macros
+%D {copyparameters}
+%D
+%D Some \CONTEXT\ commands take their default setups from others. All commands that
+%D are able to provide backgounds or rules around some content, for instance default
+%D to the standard command for ruled boxes. Is situations like this we can use:
+%D
+%D \starttyping
+%D \copyparameters [to-label] [from-label] [name1,name2,...]
+%D \stoptyping
+%D
+%D For instance
+%D
+%D \starttyping
+%D \copyparameters
+%D [internal][external]
+%D [alfa,beta]
+%D \stoptyping
+%D
+%D Leads to:
+%D
+%D \starttyping
+%D \def\internalalfa {\externalalfa}
+%D \def\internalbeta {\externalbeta}
+%D \stoptyping
+%D
+%D By using \type {\docopyvalue} we've prepared this command for use in a
+%D multi||lingual environment.
+
+\unexpanded\def\copyparameters[#1]#2[#3]#4[#5]%
+ {\doifnot{#1}{#3}
+ {\def\syst_helpers_copy_parameter{\docopyvalue{#1}{#3}}% ##1
+ \processcommalist[#5]\syst_helpers_copy_parameter}}
+
+%D \macros
+%D {ifparameters,checkparameters}
+%D
+%D A slightly different one is \type {\checkparameters}, which also checks on the
+%D presence of a~\type {=}.
+%D
+%D The boolean \type {\ifparameters} can be used afterwards. Combining both in one
+%D \type {\if}||macro would lead to problems with nested \type {\if}'s.
+%D
+%D \starttyping
+%D \checkparameters[argument]
+%D \stoptyping
+
+\newif\ifparameters
+
+\def\syst_helpers_check_parameters#1=#2#3^^^^0004%
+ {\if#2^^^^0003\parametersfalse\else\parameterstrue\fi}
+
+\unexpanded\def\checkparameters[#1]%
+ {\syst_helpers_check_parameters#1=^^^^0003^^^^0003^^^^0004}
+
+%D \macros
+%D {getfromcommalist,getfromcommacommand,
+%D commalistelement,
+%D getcommalistsize,getcommacommandsize}
+%D
+%D It's possible to get an element from a commalist or a command representing
+%D a commalist.
+%D
+%D \starttyping
+%D \getfromcommalist [string] [n]
+%D \getfromcommacommand [string,\strings,string,...] [n]
+%D \stoptyping
+%D
+%D The difference betwee the two of them is the same as the difference between
+%D \type {\processcomma...}. The found string is stored in \type
+%D {\commalistelement}.
+%D
+%D We can calculate the size of a comma separated list by using:
+%D
+%D \starttyping
+%D \getcommalistsize [string,string,...]
+%D \getcommacommandsize [string,\strings,string,...]
+%D \stoptyping
+%D
+%D Afterwards, the length is available in the macro \type {\commalistsize}
+%D (not a \COUNTER).
+
+\newcount\commalistcounter
+
+\def\commalistsize{0}
+
+\def\syst_helpers_get_comma_list_size#1%
+ {\advance\commalistcounter\plusone}
+
+\unexpanded\def\getcommalistsize#1]% don't loose [{#1}]
+ {\commalistcounter\zerocount
+ \processcommalist#1]\syst_helpers_get_comma_list_size % was [{#1}]
+ \edef\commalistsize{\the\commalistcounter}}
+
+% \def\getcommacommandsize[#1]%
+% {\edef\commacommand{#1}%
+% \scratchtoks\expandafter{\expandafter[\commacommand]}%
+% \expandafter\getcommalistsize\the\scratchtoks }
+
+\unexpanded\def\getcommacommandsize[#1]%
+ {\normalexpanded{\getcommalistsize[#1]}}
+
+\def\syst_helpers_get_from_comma_list#1%
+ {\advance\commalistcounter \minusone
+ \ifcase\commalistcounter
+ \def\commalistelement{#1}%
+ \expandafter\quitcommalist
+ \fi}
+
+\unexpanded\def\getfromcommalist[#1]#2[#3]%
+ {\let\commalistelement\empty
+ \commalistcounter#3\relax
+ \processcommalist[#1]\syst_helpers_get_from_comma_list}
+
+\unexpanded\def\getfromcommacommand[#1]%
+ {\normalexpanded{\getfromcommalist[#1]}}
+
+%D Watertight (and efficient) solutions are hard to find, due to the handling of
+%D braces during parameters passing and scanning. Nevertheless:
+%D
+%D \startbuffer
+%D \def\dosomething#1{(#1=\commalistsize) }
+%D
+%D \getcommalistsize [\hbox{$a,b,c,d,e,f$}] \dosomething 1
+%D \getcommalistsize [{a,b,c,d,e,f}] \dosomething 1
+%D \getcommalistsize [{a,b,c},d,e,f] \dosomething 4
+%D \getcommalistsize [a,b,{c,d,e},f] \dosomething 4
+%D \getcommalistsize [a{b,c},d,e,f] \dosomething 4
+%D \getcommalistsize [{a,b}c,d,e,f] \dosomething 4
+%D \getcommalistsize [] \dosomething 0
+%D \getcommalistsize [{[}] \dosomething 1
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D reports:
+%D
+%D \getbuffer
+
+%D \macros
+%D {dogetcommalistelement,dogetcommacommandelement}
+%D
+%D For low level (fast) purposes, we can also use the next alternative, which can
+%D handle 8~elements at most.
+%D
+%D \starttyping
+%D \dogetcommalistelement1\from a,b,c\to\commalistelement
+%D \stoptyping
+
+\def\syst_helpers_get_comma_list_element#1\from#2,#3,#4,#5,#6,#7,#8\to#9%
+ {\edef#9{\ifcase#1\relax\or#2\or#3\or#4\or#5\or#6\or#7\or#8\fi}}
+
+\def\dogetcommacommandelement#1\from#2\to%
+ {\expandafter\syst_helpers_get_comma_list_element\expandafter#1\expandafter\from#2,,,,,,\to}
+
+%D \macros
+%D {dosingleargument,dodoubleargument,dotripleargument,
+%D doquadrupleargument,doquintupleargument,dosixtupleargument,
+%D doseventupleargument}
+%D
+%D When working with delimited arguments, spaces and lineendings can interfere. The
+%D next set of macros uses \TEX' internal scanner for grabbing everything between
+%D arguments. Forgive me the funny names.
+%D
+%D \starttyping
+%D \dosingleargument\commando = \commando[#1]
+%D \dodoubleargument\commando = \commando[#1][#2]
+%D \dotripleargument\commando = \commando[#1][#2][#3]
+%D \doquadrupleargument\commando = \commando[#1][#2][#3][#4]
+%D \doquintupleargument\commando = \commando[#1][#2][#3][#4][#5]
+%D \dosixtupleargument\commando = \commando[#1][#2][#3][#4][#5][#6]
+%D \doseventupleargument\command = \commando[#1][#2][#3][#4][#5][#6][#7]
+%D \stoptyping
+%D
+%D These macros are used in the following way:
+%D
+%D \starttyping
+%D \def\dosetupsomething[#1][#2]%
+%D {... #1 ... #2 ...}
+%D
+%D \unexpanded\def\setupsomething
+%D {\dodoubleargument\dosetupsomething}
+%D \stoptyping
+%D
+%D The implementation can be surprisingly simple and needs no
+%D further explanation, like:
+%D
+%D \starttyping
+%D \def\dosingleargument#1[#2]%
+%D {#1[#2]}
+%D \def\dotripleargument#1[#2]#3[#4]#5[#6]%
+%D {#1[#2][#4][#6]}
+%D \def\doquintupleargument#1%
+%D {\def\dodoquintupleargument[##1]##2[##3]##4[##5]##6[##7]##8[##9]%
+%D {#1[##1][##3][##5][##7][##9]}%
+%D \dodoquintupleargument}
+%D \stoptyping
+%D
+%D Because \TEX\ accepts 9~arguments at most, we have to use two||step solution when
+%D getting five or more arguments.
+%D
+%D When developing more and more of the real \CONTEXT, we started using some
+%D alternatives that provided empty arguments (in fact optional ones) whenever the
+%D user failed to supply them. Because this more complicated macros enable us to do
+%D some checking, we reimplemented the non||empty ones.
+
+%D \macros
+%D {iffirstagument,ifsecondargument,ifthirdargument,
+%D iffourthargument,iffifthargument,ifsixthargument,
+%D ifseventhargument}
+%D
+%D We use some signals for telling the calling macros if all wanted arguments are
+%D indeed supplied by the user.
+
+\newif\iffirstargument
+\newif\ifsecondargument
+\newif\ifthirdargument
+\newif\iffourthargument
+\newif\iffifthargument
+\newif\ifsixthargument
+\newif\ifseventhargument
+
+%D \macros
+%D {dosingleempty,dodoubleempty,dotripleempty,
+%D doquadrupleempty,doquintupleempty,dosixtupeempty,
+%D doseventupleempty}
+%D
+%D The empty argument supplying macros mentioned before, look like:
+%D
+%D \starttyping
+%D \dosingleempty \command
+%D \dodoubleempty \command
+%D \dotripleempty \command
+%D \doquadrupleempty \command
+%D \doquintupleempty \command
+%D \dosixtuple_empty \command
+%D \doseventupleempty\command
+%D \stoptyping
+%D
+%D So \type{\dodoubleempty} leads to:
+%D
+%D \starttyping
+%D \command[#1][#2]
+%D \command[#1][]
+%D \command[][]
+%D \stoptyping
+%D
+%D Depending of the generousity of the user. Afterwards one can use the \type
+%D {\if...argument} boolean. For novice: watch the stepwise doubling of \type {#}'s.
+
+%D Common:
+
+\newtoks\t_syst_aux
+
+\def\syst_helpers_single_empty_one_yes {\firstargumenttrue \the\t_syst_aux}
+\def\syst_helpers_double_empty_two_yes {\secondargumenttrue \the\t_syst_aux}
+\def\syst_helpers_triple_empty_three_yes {\thirdargumenttrue \the\t_syst_aux}
+\def\syst_helpers_quadruple_empty_four_yes {\fourthargumenttrue \the\t_syst_aux}
+\def\syst_helpers_quintuple_empty_five_yes {\fifthargumenttrue \the\t_syst_aux}
+\def\syst_helpers_sixtuple_empty_six_yes {\sixthargumenttrue \the\t_syst_aux}
+\def\syst_helpers_seventuple_empty_seven_yes{\seventhargumenttrue\the\t_syst_aux}
+
+%D Single:
+
+\unexpanded\def\dosingleempty#1%
+ {%syst_helpers_argument_reset
+ \t_syst_aux{#1}%
+ \futureexpand[\syst_helpers_single_empty_one_yes\syst_helpers_single_empty_one_nop}
+
+\def\syst_helpers_single_empty_one_nop
+ {\firstargumentfalse
+ \the\t_syst_aux[]}
+
+%D Double
+
+\unexpanded\def\dodoubleempty#1%
+ {%syst_helpers_argument_reset
+ \t_syst_aux{#1}%
+ \futureexpand[\syst_helpers_double_empty_one_yes\syst_helpers_double_empty_one_nop}
+
+\def\syst_helpers_double_empty_one_yes[#1]%
+ {\firstargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_double_empty_two_yes\syst_helpers_double_empty_two_nop}
+
+\def\syst_helpers_double_empty_one_nop
+ {\firstargumentfalse
+ \secondargumentfalse
+ \the\t_syst_aux[][]}
+
+\def\syst_helpers_double_empty_two_nop
+ {\secondargumentfalse
+ \the\t_syst_aux[]}
+
+% Triple
+
+\unexpanded\def\dotripleempty#1%
+ {%syst_helpers_argument_reset
+ \t_syst_aux{#1}%
+ \futureexpand[\syst_helpers_triple_empty_one_yes\syst_helpers_triple_empty_one_nop}
+
+\def\syst_helpers_triple_empty_one_yes[#1]%
+ {\firstargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_triple_empty_two_yes\syst_helpers_triple_empty_two_nop}
+
+\def\syst_helpers_triple_empty_two_yes[#1]%
+ {\secondargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_triple_empty_three_yes\syst_helpers_triple_empty_three_nop}
+
+\def\syst_helpers_triple_empty_one_nop
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ \the\t_syst_aux[][][]}
+
+\def\syst_helpers_triple_empty_two_nop
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \the\t_syst_aux[][]}
+
+\def\syst_helpers_triple_empty_three_nop
+ {\thirdargumentfalse
+ \the\t_syst_aux[]}
+
+%D Quadruple:
+
+\unexpanded\def\doquadrupleempty#1%
+ {%syst_helpers_argument_reset
+ \t_syst_aux{#1}%
+ \futureexpand[\syst_helpers_quadruple_empty_one_yes\syst_helpers_quadruple_empty_one_nop}
+
+\def\syst_helpers_quadruple_empty_one_yes[#1]%
+ {\firstargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_quadruple_empty_two_yes\syst_helpers_quadruple_empty_two_nop}
+
+\def\syst_helpers_quadruple_empty_two_yes[#1]%
+ {\secondargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_quadruple_empty_three_yes\syst_helpers_quadruple_empty_three_nop}
+
+\def\syst_helpers_quadruple_empty_three_yes[#1]%
+ {\thirdargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_quadruple_empty_four_yes\syst_helpers_quadruple_empty_four_nop}
+
+\def\syst_helpers_quadruple_empty_one_nop
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \the\t_syst_aux[][][][]}
+
+\def\syst_helpers_quadruple_empty_two_nop
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \the\t_syst_aux[][][]}
+
+\def\syst_helpers_quadruple_empty_three_nop
+ {\thirdargumentfalse
+ \fourthargumentfalse
+ \the\t_syst_aux[][]}
+
+\def\syst_helpers_quadruple_empty_four_nop
+ {\fourthargumentfalse
+ \the\t_syst_aux[]}
+
+%D Quintuple:
+
+\unexpanded\def\doquintupleempty#1%
+ {%syst_helpers_argument_reset
+ \t_syst_aux{#1}%
+ \futureexpand[\syst_helpers_quintuple_empty_one_yes\syst_helpers_quintuple_empty_one_nop}
+
+\def\syst_helpers_quintuple_empty_one_yes[#1]%
+ {\firstargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_quintuple_empty_two_yes\syst_helpers_quintuple_empty_two_nop}
+
+\def\syst_helpers_quintuple_empty_two_yes[#1]%
+ {\secondargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_quintuple_empty_three_yes\syst_helpers_quintuple_empty_three_nop}
+
+\def\syst_helpers_quintuple_empty_three_yes[#1]%
+ {\thirdargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_quintuple_empty_four_yes\syst_helpers_quintuple_empty_four_nop}
+
+\def\syst_helpers_quintuple_empty_four_yes[#1]%
+ {\fourthargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_quintuple_empty_five_yes\syst_helpers_quintuple_empty_five_nop}
+
+\def\syst_helpers_quintuple_empty_one_nop
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \the\t_syst_aux[][][][][]}
+
+\def\syst_helpers_quintuple_empty_two_nop
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \the\t_syst_aux[][][][]}
+
+\def\syst_helpers_quintuple_empty_three_nop
+ {\thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \the\t_syst_aux[][][]}
+
+\def\syst_helpers_quintuple_empty_four_nop
+ {\fourthargumentfalse
+ \fifthargumentfalse
+ \the\t_syst_aux[][]}
+
+\def\syst_helpers_quintuple_empty_five_nop
+ {\fifthargumentfalse
+ \the\t_syst_aux[]}
+
+%D Sixtuple:
+
+\unexpanded\def\dosixtupleempty#1%
+ {%syst_helpers_argument_reset
+ \t_syst_aux{#1}%
+ \futureexpand[\syst_helpers_sixtuple_empty_one_yes\syst_helpers_sixtuple_empty_one_nop}
+
+\def\syst_helpers_sixtuple_empty_one_yes[#1]%
+ {\firstargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_sixtuple_empty_two_yes\syst_helpers_sixtuple_empty_two_nop}
+
+\def\syst_helpers_sixtuple_empty_two_yes[#1]%
+ {\secondargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_sixtuple_empty_three_yes\syst_helpers_sixtuple_empty_three_nop}
+
+\def\syst_helpers_sixtuple_empty_three_yes[#1]%
+ {\thirdargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_sixtuple_empty_four_yes\syst_helpers_sixtuple_empty_four_nop}
+
+\def\syst_helpers_sixtuple_empty_four_yes[#1]%
+ {\fourthargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_sixtuple_empty_five_yes\syst_helpers_sixtuple_empty_five_nop}
+
+\def\syst_helpers_sixtuple_empty_five_yes[#1]%
+ {\fifthargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_sixtuple_empty_six_yes\syst_helpers_sixtuple_empty_six_nop}
+
+\def\syst_helpers_sixtuple_empty_one_nop
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \the\t_syst_aux[][][][][][]}
+
+\def\syst_helpers_sixtuple_empty_two_nop
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \the\t_syst_aux[][][][][]}
+
+\def\syst_helpers_sixtuple_empty_three_nop
+ {\thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \the\t_syst_aux[][][][]}
+
+\def\syst_helpers_sixtuple_empty_four_nop
+ {\fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \the\t_syst_aux[][][]}
+
+\def\syst_helpers_sixtuple_empty_five_nop
+ {\fifthargumentfalse
+ \sixthargumentfalse
+ \the\t_syst_aux[][]}
+
+\def\syst_helpers_sixtuple_empty_six_nop
+ {\sixthargumentfalse
+ \the\t_syst_aux[]}
+
+%D Seventuple:
+
+\unexpanded\def\doseventupleempty#1%
+ {%syst_helpers_argument_reset
+ \t_syst_aux{#1}%
+ \futureexpand[\syst_helpers_seventuple_empty_one_yes\syst_helpers_seventuple_empty_one_nop}
+
+\def\syst_helpers_seventuple_empty_one_yes[#1]%
+ {\firstargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_seventuple_empty_two_yes\syst_helpers_seventuple_empty_two_nop}
+
+\def\syst_helpers_seventuple_empty_two_yes[#1]%
+ {\secondargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_seventuple_empty_three_yes\syst_helpers_seventuple_empty_three_nop}
+
+\def\syst_helpers_seventuple_empty_three_yes[#1]%
+ {\thirdargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_seventuple_empty_four_yes\syst_helpers_seventuple_empty_four_nop}
+
+\def\syst_helpers_seventuple_empty_four_yes[#1]%
+ {\fourthargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_seventuple_empty_five_yes\syst_helpers_seventuple_empty_five_nop}
+
+\def\syst_helpers_seventuple_empty_five_yes[#1]%
+ {\fifthargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_seventuple_empty_six_yes\syst_helpers_seventuple_empty_six_nop}
+
+\def\syst_helpers_seventuple_empty_six_yes[#1]%
+ {\sixthargumenttrue
+ \toksapp\t_syst_aux{[{#1}]}%
+ \futureexpand[\syst_helpers_seventuple_empty_seven_yes\syst_helpers_seventuple_empty_seven_nop}
+
+\def\syst_helpers_seventuple_empty_one_nop
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \seventhargumentfalse
+ \the\t_syst_aux[][][][][][][]}
+
+\def\syst_helpers_seventuple_empty_two_nop
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \seventhargumentfalse
+ \the\t_syst_aux[][][][][][]}
+
+\def\syst_helpers_seventuple_empty_three_nop
+ {\thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \seventhargumentfalse
+ \the\t_syst_aux[][][][][]}
+
+\def\syst_helpers_seventuple_empty_four_nop
+ {\fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \seventhargumentfalse
+ \the\t_syst_aux[][][][]}
+
+\def\syst_helpers_seventuple_empty_five_nop
+ {\fifthargumentfalse
+ \sixthargumentfalse
+ \seventhargumentfalse
+ \the\t_syst_aux[][][]}
+
+\def\syst_helpers_seventuple_empty_six_nop
+ {\sixthargumentfalse
+ \seventhargumentfalse
+ \the\t_syst_aux[][]}
+
+\def\syst_helpers_seventuple_empty_seven_nop
+ {\seventhargumentfalse
+ \the\t_syst_aux[]}
+
+%D Aliases:
+
+\let\dosingleargument \dosingleempty
+\let\dodoubleargument \dodoubleempty
+\let\dotripleargument \dotripleempty
+\let\doquadrupleargument \doquadrupleempty
+\let\doquintupleargument \doquintupleempty
+\let\dosixtupleargument \dosixtupleempty
+\let\doseventupleargument\doseventupleempty
+
+%D \macros
+%D {strippedcsname}
+%D
+%D The next macro can be very useful when using \type{\csname} like in:
+%D
+%D \starttyping
+%D \csname if\strippedcsname\something\endcsname
+%D \stoptyping
+%D
+%D This expands to \type{\ifsomething}.
+
+% \def\strippedcsname
+% {\expandafter\gobbleoneargument\string}
+
+\let\strippedcsname\csstring
+
+%D \macros
+%D {complexorsimple,complexorsimpleempty}
+%D
+%D Setups can be optional. A command expecting a setup is prefixed by \type
+%D {\complex}, a command without one gets the prefix \type {\simple}. Commands like
+%D this can be defined by:
+%D
+%D \starttyping
+%D \complexorsimple\command
+%D \stoptyping
+%D
+%D When \type{\command} is followed by a \type{[setup]}, then
+%D
+%D \starttyping
+%D \complexcommand [setup]
+%D \stoptyping
+%D
+%D executes, else we get
+%D
+%D \starttyping
+%D \simplecommand
+%D \stoptyping
+%D
+%D An alternative for \type{\complexorsimple} is:
+%D
+%D \starttyping
+%D \complexorsimpleempty {command}
+%D \stoptyping
+%D
+%D Depending on the presence of \type{[setup]}, this one leads to one of:
+%D
+%D \starttyping
+%D \complexcommando [setup]
+%D \complexcommando []
+%D \stoptyping
+%D
+%D Many \CONTEXT\ commands started as complex or simple ones, but changed into more
+%D versatile (more object oriented) ones using the \type {\get..argument} commands.
+
+\unexpanded\def\complexorsimple#1%
+ {% \relax % prevents lookahead, brrr
+ \doifelsenextoptional
+ {\firstargumenttrue \csname\s!complex\csstring#1\endcsname}
+ {\firstargumentfalse\csname\s!simple \csstring#1\endcsname}}
+
+\unexpanded\def\complexorsimpleempty#1%
+ {% \relax % prevents lookahead, brrr
+ \doifelsenextoptional
+ {\firstargumenttrue \csname\s!complex\csstring#1\endcsname}
+ {\firstargumentfalse\csname\s!complex\csstring#1\endcsname[]}}
+
+%D \macros
+%D {definecomplexorsimple,definecomplexorsimpleempty}
+%D
+%D The previous commands are used that often that we found it worthwile to offer two
+%D more alternatives. Watch the build in protection.
+
+\unexpanded\def\syst_helpers_complex_or_simple#1#2%
+ {\doifelsenextoptional{\firstargumenttrue#1}{\firstargumentfalse#2}}
+
+\unexpanded\def\syst_helpers_complex_or_simple_empty#1%
+ {\doifelsenextoptional{\firstargumenttrue#1}{\firstargumentfalse#1[]}}
+
+\unexpanded\def\definecomplexorsimple#1%
+ {\unexpanded\edef#1{\syst_helpers_complex_or_simple
+ \expandafter\noexpand\csname\s!complex\csstring#1\endcsname
+ \expandafter\noexpand\csname\s!simple \csstring#1\endcsname}}
+
+\unexpanded\def\definecomplexorsimpleempty#1%
+ {\unexpanded\edef#1{\syst_helpers_complex_or_simple_empty
+ \expandafter\noexpand\csname\s!complex\csstring#1\endcsname}}
+
+%D These commands are called as:
+%D
+%D \starttyping
+%D \definecomplexorsimple\command
+%D \stoptyping
+%D
+%D Of course, we must have available
+%D
+%D \starttyping
+%D \def\complexcommand[#1]{...}
+%D \def\simplecommand {...}
+%D \stoptyping
+%D
+%D Using this construction saves a few string now and then.
+
+%D \macros
+%D {dosinglegroupempty,dodoublegroupempty,dotriplegroupempty,
+%D doquadruplegroupempty, doquintuplegroupempty}
+%D
+%D We've already seen some commands that take care of
+%D optional arguments between \type{[]}. The next two commands
+%D handle the ones with \type{{}}. They are called as:
+%D
+%D \starttyping
+%D \dosinglegroupempty \ineedONEargument
+%D \dodoublegroupempty \ineedTWOarguments
+%D \dotriplegroupempty \ineedTHREEarguments
+%D \doquadruplegroupempty \ineedFOURarguments
+%D \doquintuplegroupempty \ineedFIVEarguments
+%D \stoptyping
+%D
+%D We can add additional definitions later when we have defined \type {\appendtoks}.
+
+\newconditional\c_syst_helpers_permit_spaces_between_groups
+
+\unexpanded\def \permitspacesbetweengroups{\settrue \c_syst_helpers_permit_spaces_between_groups}
+\unexpanded\def\dontpermitspacesbetweengroups{\setfalse\c_syst_helpers_permit_spaces_between_groups}
+
+\dontpermitspacesbetweengroups
+
+%D We can avoid the nasty if handling in \type {syst-gen} by splitting the lot in
+%D pieces so that we have no nested \type {\nextarguments} potentially being an
+%D \type {conditional} token. Okay, these macros are not called that often but it
+%D saves crap when tracing.
+
+\unexpanded\def\dosinglegroupempty#1%
+ {\t_syst_aux{#1}%
+ \futureexpand\bgroup\syst_helpers_single_empty_one_yes\syst_helpers_single_group_empty_one_nop}
+
+\def\syst_helpers_single_group_empty_one_nop
+ {\firstargumentfalse
+ \the\t_syst_aux{}}
+
+\unexpanded\def\dodoublegroupempty#1%
+ {\t_syst_aux{#1}%
+ \futureexpand\bgroup\syst_helpers_group_double_empty_one_yes\syst_helpers_group_double_empty_one_nop}
+
+\def\syst_helpers_group_double_empty_one_yes#1%
+ {\firstargumenttrue
+ \toksapp\t_syst_aux{{#1}}%
+ \futureexpand\bgroup\syst_helpers_double_empty_two_yes\syst_helpers_group_double_empty_two_nop}
+
+\def\syst_helpers_group_double_empty_one_nop
+ {\firstargumentfalse
+ \secondargumentfalse
+ \the\t_syst_aux{}{}}
+
+\def\syst_helpers_group_double_empty_two_nop
+ {\secondargumentfalse
+ \the\t_syst_aux{}}
+
+\unexpanded\def\dotriplegroupempty#1%
+ {\t_syst_aux{#1}%
+ \futureexpand\bgroup\syst_helpers_group_triple_empty_one_yes\syst_helpers_group_triple_empty_one_nop}
+
+\def\syst_helpers_group_triple_empty_one_yes#1%
+ {\firstargumenttrue
+ \toksapp\t_syst_aux{{#1}}%
+ \futureexpand\bgroup\syst_helpers_group_triple_empty_two_yes\syst_helpers_group_triple_empty_two_nop}
+
+\def\syst_helpers_group_triple_empty_two_yes#1%
+ {\secondargumenttrue
+ \toksapp\t_syst_aux{{#1}}%
+ \futureexpand\bgroup\syst_helpers_triple_empty_three_yes\syst_helpers_group_triple_empty_three_nop}
+
+\def\syst_helpers_group_triple_empty_one_nop
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ \the\t_syst_aux{}{}{}}
+
+\def\syst_helpers_group_triple_empty_two_nop
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \the\t_syst_aux{}{}}
+
+\def\syst_helpers_group_triple_empty_three_nop
+ {\thirdargumentfalse
+ \the\t_syst_aux{}}
+
+\unexpanded\def\doquadruplegroupempty#1%
+ {\t_syst_aux{#1}%
+ \futureexpand\bgroup\syst_helpers_group_quadruple_empty_one_yes\syst_helpers_group_quadruple_empty_one_nop}
+
+\def\syst_helpers_group_quadruple_empty_one_yes#1%
+ {\firstargumenttrue
+ \toksapp\t_syst_aux{{#1}}%
+ \futureexpand\bgroup\syst_helpers_group_quadruple_empty_two_yes\syst_helpers_group_quadruple_empty_two_nop}
+
+\def\syst_helpers_group_quadruple_empty_two_yes#1%
+ {\secondargumenttrue
+ \toksapp\t_syst_aux{{#1}}%
+ \futureexpand\bgroup\syst_helpers_group_quadruple_empty_three_yes\syst_helpers_group_quadruple_empty_three_nop}
+
+\def\syst_helpers_group_quadruple_empty_three_yes#1%
+ {\thirdargumenttrue
+ \toksapp\t_syst_aux{{#1}}%
+ \futureexpand\bgroup\syst_helpers_quadruple_empty_four_yes\syst_helpers_group_quadruple_empty_four_nop}
+
+\def\syst_helpers_group_quadruple_empty_one_nop
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \the\t_syst_aux{}{}{}{}}
+
+\def\syst_helpers_group_quadruple_empty_two_nop
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \the\t_syst_aux{}{}{}}
+
+\def\syst_helpers_group_quadruple_empty_three_nop
+ {\thirdargumentfalse
+ \fourthargumentfalse
+ \the\t_syst_aux{}{}}
+
+\def\syst_helpers_group_quadruple_empty_four_nop
+ {\fourthargumentfalse
+ \the\t_syst_aux{}}
+
+\unexpanded\def\doquintuplegroupempty#1%
+ {\t_syst_aux{#1}%
+ \futureexpand\bgroup\syst_helpers_group_quintuple_empty_one_yes\syst_helpers_group_quintuple_empty_one_nop}
+
+\def\syst_helpers_group_quintuple_empty_one_yes#1%
+ {\firstargumenttrue
+ \toksapp\t_syst_aux{{#1}}%
+ \futureexpand\bgroup\syst_helpers_group_quintuple_empty_two_yes\syst_helpers_group_quintuple_empty_two_nop}
+
+\def\syst_helpers_group_quintuple_empty_two_yes#1%
+ {\secondargumenttrue
+ \toksapp\t_syst_aux{{#1}}%
+ \futureexpand\bgroup\syst_helpers_group_quintuple_empty_three_yes\syst_helpers_group_quintuple_empty_three_nop}
+
+\def\syst_helpers_group_quintuple_empty_three_yes#1%
+ {\thirdargumenttrue
+ \toksapp\t_syst_aux{{#1}}%
+ \futureexpand\bgroup\syst_helpers_group_quintuple_empty_four_yes\syst_helpers_group_quintuple_empty_four_nop}
+
+\def\syst_helpers_group_quintuple_empty_four_yes#1%
+ {\fourthargumenttrue
+ \toksapp\t_syst_aux{{#1}}%
+ \futureexpand\bgroup\syst_helpers_quintuple_empty_five_yes\syst_helpers_group_quintuple_empty_five_nop}
+
+\def\syst_helpers_group_quintuple_empty_one_nop
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \the\t_syst_aux{}{}{}{}{}}
+
+\def\syst_helpers_group_quintuple_empty_two_nop
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \the\t_syst_aux{}{}{}{}}
+
+\def\syst_helpers_group_quintuple_empty_three_nop
+ {\thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \the\t_syst_aux{}{}{}}
+
+\def\syst_helpers_group_quintuple_empty_four_nop
+ {\fourthargumentfalse
+ \fifthargumentfalse
+ \the\t_syst_aux{}{}}
+
+\def\syst_helpers_group_quintuple_empty_five_nop
+ {\fifthargumentfalse
+ \the\t_syst_aux{}}
+
+%D These macros can explictly take care of spaces, which means that the next
+%D definition and calls are valid:
+%D
+%D \starttyping
+%D \def\test#1#2#3{[#1#2#3]}
+%D
+%D \dotriplegroupempty\test {a}{b}{c}
+%D \dotriplegroupempty\test {a}{b}
+%D \dotriplegroupempty\test {a}
+%D \dotriplegroupempty\test
+%D \dotriplegroupempty\test {a} {b} {c}
+%D \dotriplegroupempty\test {a} {b}
+%D \dotriplegroupempty\test
+%D {a}
+%D {b}
+%D \stoptyping
+%D
+%D And alike.
+
+%D \macros
+%D {firstofoneargument, firstoftwoarguments, firstofthreearguments
+%D secondoftwoarguments, secondofthreearguments,
+%D thirdofthreearguments}
+%D
+%D The next six macros (dedicated to Taco) can conveniently used to select
+%D arguments. Their names explain their functionality.
+
+\def\firstofoneargument #1{#1}
+
+\def\firstoftwoarguments #1#2{#1}
+\def\secondoftwoarguments #1#2{#2}
+
+\def\firstofthreearguments #1#2#3{#1}
+\def\secondofthreearguments #1#2#3{#2}
+\def\thirdofthreearguments #1#2#3{#3}
+
+\def\firstoffourarguments #1#2#3#4{#1}
+\def\secondoffourarguments #1#2#3#4{#2}
+\def\thirdoffourarguments #1#2#3#4{#3}
+\def\fourthoffourarguments #1#2#3#4{#4}
+
+\def\firstoffivearguments #1#2#3#4#5{#1}
+\def\secondoffivearguments #1#2#3#4#5{#2}
+\def\thirdoffivearguments #1#2#3#4#5{#3}
+\def\fourthoffivearguments #1#2#3#4#5{#4}
+\def\fifthoffivearguments #1#2#3#4#5{#5}
+
+\def\firstofsixarguments #1#2#3#4#5#6{#1}
+\def\secondofsixarguments#1#2#3#4#5#6{#2}
+\def\thirdofsixarguments #1#2#3#4#5#6{#3}
+\def\fourthofsixarguments#1#2#3#4#5#6{#4}
+\def\fifthofsixarguments #1#2#3#4#5#6{#5}
+\def\sixthofsixarguments #1#2#3#4#5#6{#6}
+
+\unexpanded\def\firstofoneunexpanded #1{#1}
+
+\unexpanded\def\firstoftwounexpanded #1#2{#1}
+\unexpanded\def\secondoftwounexpanded #1#2{#2}
+
+\unexpanded\def\firstofthreeunexpanded #1#2#3{#1}
+\unexpanded\def\secondofthreeunexpanded#1#2#3{#2}
+\unexpanded\def\thirdofthreeunexpanded #1#2#3{#3}
+
+%D \macros
+%D {globalletempty,letempty,
+%D letvalueempty,letgvalueempty,
+%D letvaluerelax,letgvaluerelax}
+%D
+%D Trivial:
+
+\unexpanded\def\letempty #1{\let #1\empty}
+\unexpanded\def\globalletempty#1{\glet#1\empty}
+
+\unexpanded\def\letvalueempty #1{\expandafter\let \csname#1\endcsname\empty}
+\unexpanded\def\letgvalueempty#1{\expandafter\glet\csname#1\endcsname\empty}
+\unexpanded\def\letvaluerelax #1{\expandafter\let \csname#1\endcsname\relax}
+\unexpanded\def\letgvalurelax #1{\expandafter\glet\csname#1\endcsname\relax}
+
+\unexpanded\def\relaxvalueifundefined#1%
+ {\ifcsname#1\endcsname \else
+ \expandafter\let\csname#1\endcsname\relax
+ \fi}
+
+%D \macros
+%D {wait}
+%D
+%D The next macro hardly needs explanation. Because no nesting is to be expected, we
+%D can reuse \type {\wait} within \type {\wait} itself.
+
+\unexpanded\def\wait
+ {\begingroup
+ \read16 to \wait
+ \endgroup}
+
+%D \macros
+%D {writestring,writeline,
+%D writestatus,statuswidth,normalwritestatus}
+%D
+%D Maybe one didn't notice, but we've already introduced a macro for showing
+%D messages. In the multi||lingual modules, we will also introduce a mechanism for
+%D message passing. For the moment we stick to the core macros:
+%D
+%D \starttyping
+%D \writestring {string}
+%D \writeline
+%D \writestatus {category} {message}
+%D \stoptyping
+%D
+%D Messages are formatted. One can provide the maximum with of the identification
+%D string with the macro \type {\statuswidth}.
+
+\setnewconstant\statuswidth 15
+\setnewconstant\statuswrite 128 % \pluscxxviii
+
+\ifdefined\writestring \else
+
+ \unexpanded\def\writestring{\immediate\write\statuswrite}
+ \unexpanded\def\writeline {\writestring{}}
+
+\fi
+
+\unexpanded\def\normalwritestatus#1#2%
+ {\writestring{\expandafter\syst_helpers_split_status_yes\expandafter\statuswidth#1%
+ \space\space\space\space\space\space\space
+ \space\space\space\space\space\space\space
+ \space\space\space\space\space\space\end
+ \space:\space#2}}
+
+\def\syst_helpers_split_status_yes#1#2%
+ {\ifcase#1 \expandafter\syst_helpers_split_status_nop\fi#2%
+ \expandafter\syst_helpers_split_status_yes\expandafter{\the\numexpr#1+\minusone\relax}}
+
+\def\syst_helpers_split_status_nop#1\end
+ {}
+
+%D \macros
+%D {immediatemessage}
+%D
+%D A fully expandable message:
+
+\let\immediatemessage\clf_immediatemessage % {} mandate
+
+%D \macros
+%D {rawgetparameters}
+%D
+%D A raw and dirty alternative for \type {\getparameters}; no checking is done!
+
+\unexpanded\def\rawsetparameter#1=#2,%
+ {\if]#1\else
+ \expandafter\def\csname\rawparameterprefix#1\endcsname{#2}%
+ \expandafter\rawsetparameter
+ \fi}
+
+\unexpanded\def\rawgetparameters[#1][#2% some 5-10% faster
+ {\ifx#2]% test is needed, else bomb on [#1][]
+ \expandafter\gobbleoneargument
+ \else
+ \def\rawparameterprefix{#1}%
+ \expandafter\dorawgetparameters
+ \fi#2}
+
+\def\dorawgetparameters#1]%
+ {\expandafter\rawsetparameter#1,]=,}
+
+%D \macros
+%D {doglobal,
+%D redoglobal,dodoglobal,resetglobal}
+%D
+%D The two macros \type {\redoglobal} and \type{\dodoglobal} are used in this and
+%D some other modules to enforce a user specified \type {\doglobal} action. The last
+%D and often only global assignment in a macro is done with \type {\dodoglobal}, but
+%D all preceding ones with \type {\redoglobal}. When using only alternatives, one
+%D can reset this mechanism with \type {\resetglobal}.
+
+\unexpanded\def\resetglobal
+ {\let\redoglobal\relax
+ \let\dodoglobal\relax}
+
+\resetglobal
+
+\unexpanded\def\doglobal
+ {\ifx\redoglobal\relax
+ \let\redoglobal\global
+ \let\dodoglobal\syst_helpers_dodo_global
+ \fi}
+
+\def\syst_helpers_dodo_global
+ {\resetglobal\global}
+
+\def\saveglobal
+ {\let\syst_helpers_dodo_global\dodoglobal
+ \let\syst_helpers_redo_global\redoglobal}
+
+\def\restoreglobal
+ {\let\redoglobal\syst_helpers_redo_global
+ \let\dodoglobal\syst_helpers_dodo_global}
+
+%D A very useful application of this macro is \type {\newif}, \TEX's fake boolean
+%D type. Not being a primitive, \type {\global} hopelessly fails here. But a slight
+%D adaption of Knuth's original macro permits:
+%D
+%D \starttyping
+%D \doglobal\newif\iftest
+%D \stoptyping
+%D
+%D Of course one can still say:
+%D
+%D \starttyping
+%D \global\testtrue
+%D \global\testfalse
+%D \stoptyping
+%D
+%D Apart from the prefixes, a few more \type {\expandafters} are needed:
+
+% \unexpanded\def\newif#1% uses the original plain \@if
+% {\privatescratchcounter\escapechar
+% \escapechar\minusone
+% \expandafter\expandafter\expandafter
+% \redoglobal\expandafter\expandafter\expandafter
+% \edef\@if#1{true}{\let\noexpand#1\noexpand\iftrue}%
+% \expandafter\expandafter\expandafter
+% \redoglobal\expandafter\expandafter\expandafter
+% \edef\@if#1{false}{\let\noexpand#1\noexpand\iffalse}%
+% \dodoglobal\@if#1{false}%
+% \escapechar\privatescratchcounter}
+
+\normalprotected\def\newif#1% see syst-ini.mkiv
+ {\let\new_if_saved\newif
+ \let\newif\new_if_check
+ \expandafter\redoglobal\expandafter\def\csname\expandafter\newif\csstring#1true\endcsname {\let#1\iftrue }%
+ \expandafter\redoglobal\expandafter\def\csname\expandafter\newif\csstring#1false\endcsname{\let#1\iffalse}%
+ \dodoglobal\csname\expandafter\newif\csstring#1false\endcsname
+ \let\newif\new_if_saved}
+
+%D Also new:
+
+\unexpanded\def\define#1%
+ {\ifdefined#1%
+ \message{[\noexpand#1is already defined]}%
+ \unexpanded\expandafter\def\expandafter\gobbleddefinition
+ \else
+ \unexpanded\expandafter\def
+ \fi#1}
+
+\unexpanded\def\redefine#1%
+ {\ifdefined#1%
+ \message{[\noexpand#1is redefined]}%
+ \fi
+ \unexpanded\def#1}
+
+\unexpanded\def\definemacro#1%
+ {\ifdefined#1%
+ \message{[\noexpand#1is already defined]}%
+ \unexpanded\expandafter\def\expandafter\gobbleddefinition
+ \else
+ \unexpanded\expandafter\def
+ \fi#1}
+
+% \define\hans{hans}
+% \redefine\hans{hans}
+% \define\hans#1[]#2#3{hans}
+
+%D The next variant fits nicely in the setups syntax:
+%D
+%D \starttyping
+%D \starttexdefinition bagger [#1] #2
+%D oeps
+%D #1
+%D oeps
+%D \stoptexdefinition
+%D
+%D \bagger [a] {b}
+%D \stoptyping
+
+% \starttexdefinition test
+% oeps
+% \stoptexdefinition
+%
+% [\test]
+
+\def\s!unexpanded{unexpanded}
+
+\bgroup \obeylines
+
+\glet\stoptexdefinition\relax
+
+\unexpanded\gdef\starttexdefinition%
+ {\bgroup%
+ \obeylines%
+ \syst_helpers_start_tex_definition}
+
+\gdef\syst_helpers_start_tex_definition#1
+ {\catcode\endoflineasciicode\ignorecatcode%
+ \clf_texdefinition_one{#1}}
+
+\gdef\dostarttexdefinition#1\stoptexdefinition%
+ {\egroup%
+ \clf_texdefinition_two{#1}}
+
+\egroup
+
+% \unexpanded\def\texdefinition#1{\csname\ifcsname#1\endcsname#1\else donothing\fi\endcsname} % todo: a nop cs: char 0 or some corenamespace
+
+\unexpanded\def\texdefinition#1{\begincsname#1\endcsname}
+
+% This is a first variant, more might be added:
+
+\unexpanded\def\starttexcode{\unprotect}
+\unexpanded\def\stoptexcode {\protect}
+
+%D \macros
+%D {newcounter,
+%D increment,decrement}
+%D
+%D Unfortunately the number of \COUNTERS\ in \TEX\ is limited, but fortunately we
+%D can store numbers in a macro. We can increment such pseudo \COUNTERS\ with \type
+%D {\increment}.
+%D
+%D \starttyping
+%D \increment(\counter,20)
+%D \increment(\counter,-4)
+%D \increment(\counter)
+%D \increment\counter
+%D \stoptyping
+%D
+%D After this sequence of commands, the value of \type {\counter} is 20, 16, 17
+%D and~18. Of course there is also the complementary command \type {\decrement}.
+%D
+%D Global assignments are possible too, using \type{\doglobal}:
+%D
+%D \starttyping
+%D \doglobal\increment\counter
+%D \stoptyping
+%D
+%D When \type {\counter} is undefined, it's value is initialized at~0. It is
+%D nevertheless better to define a \COUNTER\ explicitly. One reason could be that
+%D the \COUNTER\ can be part of a test with \type {\ifnum} and this conditional does
+%D not accept undefined macro's. The \COUNTER\ in our example can for instance be
+%D defined with:
+%D
+%D \starttyping
+%D \newcounter\counter
+%D \stoptyping
+%D
+%D The command \type {\newcounter} must not be confused with \type {\newcount}! Of
+%D course this mechanism is much slower than using \TEX's \COUNTERS\ directly. In
+%D practice \COUNTERS\ (and therefore our pseudo counters too) are seldom the
+%D bottleneck in the processing of a text. Apart from some other incompatilities we
+%D want to mention a pitfal when using \type {\ifnum}.
+%D
+%D \starttyping
+%D \ifnum\normalcounter=\pseudocounter \doif \else \doelse \fi
+%D \ifnum\pseudocounter=\normalcounter \doif \else \doelse \fi
+%D \stoptyping
+%D
+%D In the first test, \TEX\ continues it's search for the second number after
+%D reading \type {\pseudocounter}, while in the second test, it stops reading after
+%D having encountered a real one. Tests like the first one therefore can give
+%D unexpected results, for instance execution of \type {\doif} even if both numbers
+%D are unequal.
+
+\def\zerocountervalue{0}
+
+\unexpanded\def\newcounter#1%
+ {\dodoglobal\let#1\zerocountervalue}
+
+%D Nowadays we don't mind a few more tokens if we can gain a bit of speed.
+
+\def\syst_helpers_do_increment#1{\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi+\plusone \relax}}
+\def\syst_helpers_do_decrement#1{\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi+\minusone\relax}}
+
+\def\syst_helpers_do_do_do_increment#1,#2){\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi+#2\relax}}
+\def\syst_helpers_do_do_do_decrement#1,#2){\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi-#2\relax}}
+
+\def\syst_helpers_do_do_increment(#1%
+ {\def\m_syst_action_yes{\syst_helpers_do_do_do_increment#1}%
+ \def\m_syst_action_nop{\syst_helpers_do_do_do_increment#1,\plusone}%
+ \doifelsenextcharcs,\m_syst_action_yes\m_syst_action_nop}
+
+\def\syst_helpers_do_do_decrement(#1%
+ {\def\m_syst_action_yes{\syst_helpers_do_do_do_decrement#1}%
+ \def\m_syst_action_nop{\syst_helpers_do_do_do_decrement#1,\plusone}%
+ \doifelsenextcharcs,\m_syst_action_yes\m_syst_action_nop}
+
+\unexpanded\def\increment{\doifelsenextcharcs(\syst_helpers_do_do_increment\syst_helpers_do_increment}
+\unexpanded\def\decrement{\doifelsenextcharcs(\syst_helpers_do_do_decrement\syst_helpers_do_decrement}
+
+\unexpanded\def\fastincrement#1{\dodoglobal\edef#1{\the\numexpr#1+\plusone \relax}}
+\unexpanded\def\fastdecrement#1{\dodoglobal\edef#1{\the\numexpr#1+\minusone\relax}}
+
+\unexpanded\def\incrementvalue#1{\expandafter\increment\csname#1\endcsname}
+\unexpanded\def\decrementvalue#1{\expandafter\decrement\csname#1\endcsname}
+
+%D \macros
+%D {newsignal}
+%D
+%D When writing advanced macros, we cannot do without signaling. A signal is a small
+%D (invisible) kern or penalty that signals the next macro that something just
+%D happened. This macro can take any action depending on the previous signal.
+%D Signals must be unique and the next macro takes care of that.
+%D
+%D \starttyping
+%D \newsignal\somesignal
+%D \stoptyping
+%D
+%D Signals old dimensions and can be used in skips, kerns and tests like \type
+%D {\ifdim}.
+
+\newdimen\maximumsignal % step is about 0.00025pt
+
+\unexpanded\def\newsignal#1%
+ {\ifdefined#1\else
+ \advance\maximumsignal 2\scaledpoint % to be save in rounding
+ \edef#1{\the\maximumsignal}%
+ \fi}
+
+%D \macros
+%D {strippedcsname}
+%D
+%D The next macro can be very useful when using \type {\csname} like in:
+%D
+%D \starttyping
+%D \csname if\strippedcsname\something\endcsname
+%D \stoptyping
+
+\let\checkedstrippedcsname\csstring
+
+%D \macros
+%D {savenormalmeaning}
+%D
+%D We will use this one in:
+
+\unexpanded\def\savenormalmeaning#1%
+ {\ifcsname normal\csstring#1\endcsname \else
+ \expandafter\let\csname normal\csstring#1\endcsname#1%
+ \fi}
+
+%D \macros
+%D {dorecurse,recurselevel,recursedepth,
+%D dostepwiserecurse}
+%D
+%D \TEX\ does not offer us powerfull for||loop mechanisms. On the other hand its
+%D recursion engine is quite unique. We therefore identify the for||looping macros
+%D by this method. The most simple alternative is the one that only needs a number.
+%D
+%D \starttyping
+%D \dorecurse {n} {whatever we want}
+%D \stoptyping
+%D
+%D This macro can be nested without problems and therefore be used in situations
+%D where \PLAIN\ \TEX's \type {\loop} macro ungracefully fails. The current value of
+%D the counter is available in \type {\recurselevel}, before as well as after the
+%D \typ {whatever we wat} stuff.
+%D
+%D \starttyping
+%D \dorecurse % inner loop
+%D {10}
+%D {\recurselevel: % outer value
+%D \dorecurse % inner loop
+%D {\recurselevel} % outer value
+%D {\recurselevel} % inner value
+%D \dorecurse % inner loop
+%D {\recurselevel} % outer value
+%D {\recurselevel} % inner value
+%D \endgraf}
+%D \stoptyping
+%D
+%D In this example the first, second and fourth \type {\recurselevel} concern the
+%D outer loop, while the third and fifth one concern the inner loop. The depth of
+%D the nesting is available for inspection in \type {\recursedepth}.
+%D
+%D Both \type {\recurselevel} and \type {\recursedepth} are macros. The real
+%D \COUNTERS\ are hidden from the user because we don't want any interference.
+
+\newcount\outerrecurse
+\newcount\innerrecurse
+
+\def\recursedepth{\the\outerrecurse}
+\def\recurselevel{0}
+
+\let\syst_helpers_stepwise_next\relax
+
+\installsystemnamespace{recurseindex}
+\installsystemnamespace{recurseaction}
+
+\unexpanded\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
+ {\global\advance\outerrecurse \plusone
+ \expandafter\gdef\csname\??recurseaction\the\outerrecurse\endcsname{#4}%
+ \expandafter\glet\csname\??recurseindex \the\outerrecurse\endcsname\recurselevel
+ \ifnum#3>\zerocount\relax
+ \ifnum#2<#1\relax
+ \let\syst_helpers_stepwise_next\syst_helpers_stepwise_exit
+ \else
+ \let\syst_helpers_stepwise_next\syst_helpers_stepwise_recurse
+ \fi
+ \orelse\ifnum#3<\zerocount\relax
+ \ifnum#1<#2\relax
+ \let\syst_helpers_stepwise_next\syst_helpers_stepwise_exit
+ \else
+ \let\syst_helpers_stepwise_next\syst_helpers_stepwise_reverse
+ \fi
+ \else
+ \let\syst_helpers_stepwise_next\syst_helpers_stepwise_exit
+ \fi\normalexpanded{\syst_helpers_stepwise_next{\number#1}{\number#2}{\number#3}}}
+
+\unexpanded\def\syst_helpers_stepwise_recurse#1#2#3% from to step
+ {\ifnum#1>#2\relax
+ \expandafter\syst_helpers_stepwise_recurse_nop
+ \else
+ \def\recurselevel{#1}%
+ \doubleexpandafter\syst_helpers_stepwise_recurse_yes\expandafter
+ \fi\expandafter{\the\numexpr\recurselevel+#3\relax}{#2}{#3}}
+
+\unexpanded\def\syst_helpers_recurse_content
+ {\csname\??recurseaction\the\outerrecurse\endcsname}
+
+\unexpanded\def\syst_helpers_stepwise_recurse_yes
+ {\syst_helpers_recurse_content
+ \syst_helpers_stepwise_recurse}
+
+\unexpanded\def\syst_helpers_stepwise_reverse#1#2#3% from to step
+ {\ifnum#1<#2\relax
+ \expandafter\syst_helpers_stepwise_recurse_nop
+ \else
+ \def\recurselevel{#1}%
+ \innerrecurse#1\relax
+ \advance\innerrecurse#3\relax
+ \doubleexpandafter\syst_helpers_stepwise_reverse_yes\expandafter
+ \fi\expandafter{\the\innerrecurse}{#2}{#3}}
+
+\unexpanded\def\syst_helpers_stepwise_reverse_yes
+ {\syst_helpers_recurse_content
+ \syst_helpers_stepwise_reverse}
+
+\unexpanded\def\syst_helpers_stepwise_exit
+ {\syst_helpers_stepwise_recurse_nop\relax}
+
+\unexpanded\def\syst_helpers_stepwise_recurse_nop#1#2#3#4%
+ {\expandafter\let\expandafter\recurselevel\csname\??recurseindex\the\outerrecurse\endcsname
+ \global\advance\outerrecurse\minusone}
+
+\unexpanded\def\dorecurse#1%
+ {\dostepwiserecurse\plusone{#1}\plusone}
+
+\def\doexpandedrecurse#1#2% user macro (also was \doxprecurse)
+ {\ifnum#1>\zerocount
+ #2\expandafter\doexpandedrecurse\expandafter{\the\numexpr#1-\plusone\relax}{#2}%
+ \fi}
+
+%D As we can see here, the simple command \type{\dorecurse} is a special case of the
+%D more general:
+%D
+%D \starttyping
+%D \dostepwiserecurse {from} {to} {step} {action}
+%D \stoptyping
+%D
+%D This commands accepts positive and negative steps. Illegal values are handles as
+%D good as possible and the macro accepts numbers and \COUNTERS.
+%D
+%D \starttyping
+%D \dostepwiserecurse {1} {10} {2} {...}
+%D \dostepwiserecurse {10} {1} {-2} {...}
+%D \stoptyping
+%D
+%D Because the simple case is used often, we implement it more efficiently:
+
+\unexpanded\def\dorecurse#1%
+ {\ifcase#1\relax
+ \expandafter\gobbletwoarguments
+ \or
+ \expandafter\syst_helpers_recurse_y
+ \else
+ \expandafter\syst_helpers_recurse_x
+ \fi{#1}}
+
+\unexpanded\def\syst_helpers_recurse_x#1#2%
+ {\global\advance\outerrecurse \plusone
+ \expandafter\gdef\csname\??recurseaction\the\outerrecurse\endcsname{#2}%
+ \expandafter\glet\csname\??recurseindex \the\outerrecurse\endcsname\recurselevel
+ \expandafter\syst_helpers_recurse_indeed\expandafter1\expandafter{\number#1}}
+
+\unexpanded\def\syst_helpers_recurse_y#1#2%
+ {\global\advance\outerrecurse \plusone
+ \expandafter\glet\csname\??recurseindex\the\outerrecurse\endcsname\recurselevel
+ \let\recurselevel\!!plusone
+ #2%
+ \expandafter\let\expandafter\recurselevel\csname\??recurseindex\the\outerrecurse\endcsname
+ \global\advance\outerrecurse \minusone}
+
+\unexpanded\def\syst_helpers_recurse_indeed#1#2% from to
+ {\ifnum#1>#2\relax
+ \expandafter\syst_helpers_recurse_indeed_nop
+ \else
+ \def\recurselevel{#1}%
+ \doubleexpandafter\syst_helpers_recurse_indeed_yes
+ \fi\expandafter{\the\numexpr\recurselevel+\plusone\relax}{#2}}
+
+\unexpanded\def\syst_helpers_recurse_indeed#1#2% from to
+ {\ifnum#1>#2\relax
+ \expandafter\syst_helpers_recurse_indeed_nop
+ \else
+ \def\recurselevel{#1}%
+ \innerrecurse#1\advance\innerrecurse\plusone
+ \doubleexpandafter\syst_helpers_recurse_indeed_yes
+ \fi\expandafter{\the\innerrecurse}{#2}}
+
+\unexpanded\def\syst_helpers_recurse_indeed_yes
+ {\syst_helpers_recurse_content
+ \syst_helpers_recurse_indeed}
+
+\unexpanded\def\syst_helpers_recurse_indeed_nop#1#2#3%
+ {\expandafter\let\expandafter\recurselevel\csname\??recurseindex\the\outerrecurse\endcsname
+ \global\advance\outerrecurse \minusone }
+
+%D \macros
+%D {dowith}
+%D
+%D Here's a loop over whatever is in a list:
+%D
+%D \starttyping
+%D \dowith{a,b,c}{[#1]}
+%D \stoptyping
+
+\unexpanded\def\dowith#1#2%
+ {\def\syst_helpers_with##1{#2}%
+ \normalexpanded{\processcommalist[#1]}\syst_helpers_with}
+
+%D \macros
+%D {doloop,exitloop}
+%D
+%D Sometimes loops are not determined by counters, but by (a combinations of)
+%D conditions. We therefore implement a straightforward loop, which can only be left
+%D when we explictly exit it. Nesting is supported. First we present a more
+%D extensive alternative.
+%D
+%D \starttyping
+%D \doloop
+%D {Some kind of typesetting punishment \par
+%D \ifnum\pageno>100 \exitloop \fi}
+%D \stoptyping
+%D
+%D When needed, one can call for \type {\looplevel} and \type {\loopdepth}.
+
+\let\endofloop\donothing % maybe \syst_helpers_loop_end
+
+\unexpanded\def\doloop#1%
+ {\global\advance\outerrecurse \plusone
+ \expandafter\gdef\csname\??recurseaction\the\outerrecurse\endcsname{#1}%
+ \expandafter\glet\csname\??recurseindex \the\outerrecurse\endcsname\recurselevel
+ \let\endofloop\syst_helpers_loop
+ \syst_helpers_loop1} % no \plusone else \recurselevel wrong
+
+\unexpanded\def\syst_helpers_loop#1%
+ {\def\recurselevel{#1}%
+ \expandafter\syst_helpers_loop_yes\expandafter{\the\numexpr\recurselevel+\plusone\relax}}
+
+\unexpanded\def\syst_helpers_loop_yes
+ {\syst_helpers_recurse_content
+ \endofloop}
+
+\unexpanded\def\syst_helpers_loop_nop#1%
+ {\let\endofloop\syst_helpers_loop % new, permits nested \doloop's
+ \expandafter\let\expandafter\recurselevel\csname\??recurseindex\the\outerrecurse\endcsname
+ \global\advance\outerrecurse\minusone}
+
+\unexpanded\def\exitloop % \exitloop quits at end
+ {\let\endofloop\syst_helpers_loop_nop}
+
+\unexpanded\def\exitloopnow#1\endofloop % \exitloopnow quits directly
+ {\syst_helpers_loop_nop}
+
+%D The loop is executed at least once, so beware of situations
+%D like:
+%D
+%D \starttyping
+%D \doloop {\exitloop some commands}
+%D \stoptyping
+%D
+%D It's just a matter of putting the text into the \type {\if} statement that should
+%D be there anyway, like in:
+%D
+%D \starttyping
+%D \doloop {\ifwhatever \exitloop \else some commands\fi}
+%D \stoptyping
+%D
+%D You can also quit a loop immediately, by using \type
+%D {\exitloopnow} instead. Beware, this is more sensitive
+%D for conditional errors.
+
+%D Krzysztof Leszczynski suggested to provide access to the level by means of a
+%D \type {#1}. I decided to pass the more frequently used level as \type {#1} and
+%D the less favoured depth as \type {#2}. The intended usage is:
+%D
+%D \starttyping
+%D \dorecurse{3}{\definesymbol[test-#1][xx-#1]}
+%D
+%D \def\test{\dorecurse{3}{\definesymbol[test-##1][xx-##1]}} \test
+%D
+%D \symbol[test-1]\quad\symbol[test-2]\quad\symbol[test-3]
+%D \stoptyping
+%D
+%D Since the hashed arguments are expanded, we don't need tricky expansion here.
+%D
+%D \starttyping
+%D \dorecurse{3}{\expanded{\definesymbol[test-\recurselevel][xx-\recurselevel]}}
+%D \stoptyping
+
+\def\syst_helpers_recurse_content
+ {\csname\??recurseaction\the\outerrecurse\expandafter\expandafter\expandafter\endcsname
+ \expandafter\expandafter\expandafter{\expandafter\recurselevel\expandafter}\expandafter{\the\outerrecurse}}
+
+\unexpanded\def\syst_helpers_recurse_x#1#2%
+ {\global\advance\outerrecurse \plusone
+ \expandafter\gdef\csname\??recurseaction\the\outerrecurse\endcsname##1##2{#2}%
+ \expandafter\glet\csname\??recurseindex \the\outerrecurse\endcsname\recurselevel
+ \expandafter\syst_helpers_recurse_indeed\expandafter1\expandafter{\number#1}}
+
+\unexpanded\def\syst_helpers_recurse_y#1#2%
+ {\global\advance\outerrecurse \plusone
+ \expandafter\glet\csname\??recurseindex \the\outerrecurse\endcsname\recurselevel
+ \let\recurselevel\!!plusone
+ \expandafter\gdef\csname\??recurseaction\the\outerrecurse\endcsname##1##2{#2}%
+ \syst_helpers_recurse_content
+ \expandafter\let\expandafter\recurselevel\csname\??recurseindex\the\outerrecurse\endcsname
+ \global\advance\outerrecurse \minusone}
+
+\unexpanded\def\doloop#1%
+ {\global\advance\outerrecurse \plusone
+ \expandafter\gdef\csname\??recurseaction\the\outerrecurse\endcsname##1##2{#1}%
+ \expandafter\glet\csname\??recurseindex \the\outerrecurse\endcsname\recurselevel
+ \let\endofloop\syst_helpers_loop
+ \syst_helpers_loop1} % no \plusone else \recurselevel wrong
+
+\installsystemnamespace{recursestepwise}
+
+\unexpanded\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
+ {\global\advance\outerrecurse \plusone
+ \expandafter\gdef\csname\??recurseaction\the\outerrecurse\endcsname##1##2{#4}%
+ \expandafter\glet\csname\??recurseindex \the\outerrecurse\endcsname\recurselevel
+ \csname\??recursestepwise
+ % we need the x in order to avoid the \relax that tex adds
+ \ifnum#3>\zerocount
+ \ifnum#2<#1x\else d\fi
+ \orelse\ifnum#3<\zerocount
+ \ifnum#1<#2x\else r\fi
+ \fi
+ \expandafter\endcsname\normalexpanded{{\number#1}{\number#2}{\number#3}}}
+ % \expandafter\endcsname\expandafter{\number#1\expandafter}\expandafter{\number#2\expandafter}\expandafter{\number#3}}
+
+\letvalue{\??recursestepwise x}\syst_helpers_stepwise_exit
+\letvalue{\??recursestepwise d}\syst_helpers_stepwise_recurse
+\letvalue{\??recursestepwise r}\syst_helpers_stepwise_reverse
+
+\newcount\fastloopindex
+\newcount\fastloopfinal
+
+\let\m_syst_helpers_fast_loop_cs\relax
+
+\unexpanded\def\dofastloopcs#1%
+ {\fastloopfinal#1\relax
+ \ifcase\fastloopfinal
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\syst_helpers_fast_loop_cs
+ \fi}
+
+\unexpanded\def\syst_helpers_fast_loop_cs#1%
+ {\let\m_syst_helpers_fast_loop_cs#1%
+ \fastloopindex\plusone
+ \syst_helpers_fast_loop_cs_step}
+
+\unexpanded\def\syst_helpers_fast_loop_cs_step
+ {\ifnum\fastloopindex>\fastloopfinal
+ \let\m_syst_helpers_fast_loop_cs\relax
+ \else
+ \m_syst_helpers_fast_loop_cs
+ \advance\fastloopindex\plusone
+ \expandafter\syst_helpers_fast_loop_cs_step
+ \fi}
+
+% Helper:
+
+\unexpanded\def\resetrecurselevel{\let\recurselevel\!!zerocount}
+
+\let\recurselevel\!!zerocount
+
+% \appendtoks \resetrecurselevel \to \everydump
+
+%D \macros
+%D {doloopoverlist}
+%D
+%D \starttyping
+%D \doloopoverlist {red,green,blue} {
+%D \setuppalet[\recursestring]
+%D \doloopoverlist {light,normal,dark} {
+%D \blackrule[color=\recursestring,width=20cm,height=2cm,depth=0cm]\par
+%D }
+%D }
+%D \stoptyping
+%D
+%D or:
+%D
+%D \starttyping
+%D \doloopoverlist {red,green,blue} {
+%D \setuppalet[#1]
+%D \doloopoverlist {light,normal,dark} {
+%D \blackrule[color=##1,width=20cm,height=2cm,depth=0cm]\par
+%D }
+%D }
+%D \stoptyping
+
+\unexpanded\def\doloopoverlist#1#2%
+ {\global\advance\outerrecurse\plusone
+ \expandafter\gdef\csname\??recurseaction\the\outerrecurse\endcsname##1{\edef\recursestring{##1}#2}%
+ \expandafter\glet\csname\??recurseindex \the\outerrecurse\endcsname\recursestring
+ \normalexpanded{\processcommalist[#1]{\expandafter\noexpand\csname\??recurseaction\the\outerrecurse\endcsname}}%
+ \expandafter\let\expandafter\recursestring\csname\??recurseindex\the\outerrecurse\endcsname
+ \global\advance\outerrecurse\minusone}
+
+%D \macros
+%D {newevery,everyline,EveryLine,EveryPar}
+%D
+%D Lets skip to something quite different. It's common use to use \type {\everypar}
+%D for special purposes. In \CONTEXT\ we use this primitive for locating sidefloats.
+%D This means that when user assignments to \type {\everypar} can interfere with
+%D those of the package. We therefore introduce \type {\EveryPar}.
+%D
+%D The same goes for \type {\EveryLine}. Because \TEX\ offers no \type {\everyline}
+%D primitive, we have to call for \type {\everyline} when we are working on a line
+%D by line basis. Just by calling \type {\EveryPar{}} and \type {\EveryLine{}} we
+%D restore the old situation.
+
+% \dorecurse{2}{
+% \expanded{\everypar{before \recurselevel\space}}
+% \EveryPar{x } [before \recurselevel\space x] \par
+% \EveryPar{y } [before \recurselevel\space y] \par
+% \EveryPar{} [before \recurselevel] \par
+% \EveryPar{x } \EveryPar{y } \EveryPar{} [before \recurselevel] \par
+% \EveryPar{y } \everypar{before } [before] \par
+% }
+
+\installsystemnamespace{extraevery}
+
+\unexpanded\def\newevery#1#2%
+ {\ifx#1\everypar\else\newtoks#1\fi% we test for redefinition elsewhere
+ \ifx#2\relax\orelse\ifdefined#2\else
+ \expandafter\newtoks\csname\??extraevery\csstring#1\endcsname
+ \edef#2{\syst_helpers_every#1\csname\??extraevery\csstring#1\endcsname}%
+ \fi}
+
+\unexpanded\def\syst_helpers_every#1#2%
+ {\removetoks\the#2\from#1%
+ \appendtoks\the#2\to #1%
+ #2}
+
+%D This one permits definitions like:
+
+\newevery \everypar \EveryPar % we get a warning which is ok
+\newevery \everyline \EveryLine
+
+%D and how about:
+
+\newtoks \neverypar
+
+\unexpanded\def\forgeteverypar
+ {\everypar{\the\neverypar}}
+
+%D Which we're going to use indeed! When the second argument equals \type {\relax},
+%D the first token list is created unless it is already defined.
+%D
+%D Technically spoken we could have used the method we are going to present in the
+%D visual debugger. First we save the primitive \type{\everypar}:
+%D
+%D \starttyping
+%D \let\normaleverypar=\everypar
+%D \stoptyping
+%D
+%D Next we allocate a \TOKENLIST\ named \type{\everypar}, which means that
+%D \type{\everypar} is no longer a primitive but something like \type{\toks44}.
+%D
+%D \starttyping
+%D \newtoks\everypar
+%D \stoptyping
+%D
+%D Because \TEX\ now executes \type{\normaleverypar} instead of \type{\everypar}, we
+%D are ready to assign some tokens to this internally known and used \TOKENLIST.
+%D
+%D \starttyping
+%D \normaleverypar={all the things the system wants to do \the\everypar}
+%D \stoptyping
+%D
+%D Where the user can provide his own tokens to be expanded every time he expects
+%D them to expand.
+%D
+%D \starttyping
+%D \everypar={something the user wants to do}
+%D \stoptyping
+%D
+%D We don't use this method because it undoubtly leads to confusing situations,
+%D especially when other packages are used, but it's this kind of tricks that make
+%D \TEX\ so powerful.
+
+%D \macros
+%D {convertargument,convertcommand,convertvalue}
+%D
+%D Some persistent experimenting led us to the next macro. This macro converts a
+%D parameter or an expanded macro to it's textual meaning.
+%D
+%D \starttyping
+%D \convertargument ... \to \command
+%D \stoptyping
+%D
+%D For example,
+%D
+%D \starttyping
+%D \convertargument{one \two \three{four}}\to\ascii
+%D \stoptyping
+%D
+%D The resulting macro \type{\ascii} can be written to a file or the terminal
+%D without problems. In \CONTEXT\ we use this macro for generating registers and
+%D tables of contents.
+%D
+%D The second conversion alternative accepts a command:
+%D
+%D \starttyping
+%D \convertcommand\command\to\ascii
+%D \stoptyping
+%D
+%D Both commands accept the prefix \type{\doglobal} for global assignments.
+
+\unexpanded\def\convertvalue#1\to
+ {\expandafter\convertcommand\csname#1\endcsname\to}
+
+\unexpanded\def\defconvertedvalue#1#2% less sensitive for \to
+ {\expandafter\defconvertedcommand\expandafter#1\csname#2\endcsname}
+
+%D \macros
+%D {doifassignmentelse}
+%D
+%D A lot of \CONTEXT\ commands take optional arguments, for instance:
+%D
+%D \starttyping
+%D \dothisorthat[alfa,beta]
+%D \dothisorthat[first=foo,second=bar]
+%D \dothisorthat[alfa,beta][first=foo,second=bar]
+%D \stoptyping
+%D
+%D Although a combined solution is possible, we prefer a seperation. The next
+%D command takes care of propper handling of such multi||faced commands.
+%D
+%D \starttyping
+%D \doifassignmentelse {...} {then ...} {else ...}
+%D \stoptyping
+
+\def\syst_helpers_check_if_assignment_else#1=#2#3^^^^0004{\if#2^^^^0003}%
+\def\syst_helpers_check_else_assignment_if#1=#2#3^^^^0004{\unless\if#2^^^^0003}%
+
+\unexpanded\def\doifelseassignment#1%
+ {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=^^^^0003^^^^0003^^^^0004%
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\unexpanded\def\doifelseassignmentcs#1#2#3%
+ {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=^^^^0003^^^^0003^^^^0004%
+ \expandafter#3%
+ \else
+ \expandafter#2%
+ \fi}
+
+\let\doifassignmentelse \doifelseassignment
+\let\doifassignmentelsecs\doifelseassignmentcs
+
+\newif\ifassignment
+
+\unexpanded\def\docheckassignment#1%
+ {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=^^^^0003^^^^0003^^^^0004%
+ \assignmentfalse
+ \else
+ \assignmenttrue
+ \fi}
+
+%D These can be used for cases where we want less tracing noise.
+
+\unexpanded\def\validassignment#1%
+ {\expandafter\syst_helpers_check_else_assignment_if\detokenize{#1}=^^^^0003^^^^0003^^^^0004}
+
+\unexpanded\def\novalidassignment#1%
+ {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=^^^^0003^^^^0003^^^^0004}
+
+%D In \ETEX\ we can use \type {\detokenize} and gain some speed, but in general far
+%D less that 1\% for \type {\convertargument} and nil for \type {\convertcommand}.
+%D This macro is more robust than the pure \TEX\ one, something I found out when
+%D primitives like \type {\jobname} were fed (or something undefined).
+
+\unexpanded\def\convertargument#1\to#2{\dodoglobal\edef#2{\detokenize{#1}}}
+\unexpanded\def\convertcommand #1\to#2{\dodoglobal\edef#2{\expandafter\detokenize\expandafter{#1}}} % hm, only second is also ok
+
+\unexpanded\def\defconvertedargument #1#2{\edef#1{\detokenize{#2}}}
+\unexpanded\def\defconvertedcommand #1#2{\edef#1{\detokenize\expandafter{#2}}}
+\unexpanded\def\edefconvertedargument#1#2{\edef#1{#2}%
+ \edef#1{\detokenize\expandafter{#1}}}
+\unexpanded\def\gdefconvertedargument#1#2{\xdef#1{\detokenize{#2}}}
+\unexpanded\def\gdefconvertedcommand #1#2{\xdef#1{\detokenize\expandafter{#2}}}
+\unexpanded\def\xdefconvertedargument#1#2{\xdef#1{#2}%
+ \xdef#1{\detokenize\expandafter{#1}}}
+
+%D When you try to convert a primitive command, you'll find out that the \ETEX\
+%D method fails on for instance \type {\jobname} in the sense that it returns the
+%D filename instead of just \type {\jobname}. So far this does not give real
+%D problems.
+
+%D This is typically a macro that one comes to after reading the \TEX book
+%D carefully. Even then, the definite solution was found after rereading the \TEX
+%D book. The first implementation was:
+%D
+%D \starttyping
+%D \def\doconvertargument#1->#2\\\\{#2}
+%D \stoptyping
+%D
+%D The \type {-}, the delimiter \type {\\\\} and the the second argument are
+%D completely redundant.
+
+%D \macros
+%D {showvalue}
+%D
+%D Ahandy macro, for testing purposes only:
+
+\unexpanded\def\showvalue#1%
+ {\ifcsname#1\endcsname
+ \expandafter\show\csname#1\endcsname
+ \else
+ \show\undefined
+ \fi}
+
+%D \macros
+%D {doifmeaningelse}
+%D
+%D We can use both commands in testing, but alas, not all meanings expand to
+%D something \type {->}. This is no problem in the \ETEX\ implementation, but since
+%D we want compatibility, we need:
+%D
+%D \starttyping
+%D \doifmeaningelse {\next} {\something} {true} {false}
+%D \stoptyping
+%D
+%D Watch the one level expansion of the second argument.
+
+\unexpanded\def\doifelsemeaning#1#2%
+ {\edef\m_syst_string_one{\normalmeaning#1}%
+ \def \m_syst_string_two{#2}%
+ \edef\m_syst_string_two{\normalmeaning\m_syst_string_two}%
+ \ifx\m_syst_string_one\m_syst_string_two
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifmeaningelse\doifelsemeaning
+
+%D \macros
+%D {doifsamestringselse,doifsamestring,doifnotsamestring}
+%D
+%D The next comparison macro converts the arguments into expanded strings. This
+%D command can be used to compare for instance \type {\jobname} with a name stored
+%D in a macro.
+%D
+%D \starttyping
+%D \doifelse {\jobname}{oeps}{YES}{NO}
+%D \doifsamestringelse{\jobname}{oeps}{YES}{NO}
+%D \stoptyping
+
+\def\syst_helpers_if_samestring_else#1#2#3#4%
+ {\edef\m_syst_string_one{\detokenize\expandafter{\normalexpanded{#3}}}%
+ \edef\m_syst_string_two{\detokenize\expandafter{\normalexpanded{#4}}}%
+ \ifx\m_syst_string_one\m_syst_string_two\expandafter#1\else\expandafter#2\fi}
+
+\unexpanded\def\doifelsesamestring{\syst_helpers_if_samestring_else\firstoftwoarguments\secondoftwoarguments}
+\unexpanded\def\doifsamestring {\syst_helpers_if_samestring_else\firstofoneargument \gobbleoneargument }
+\unexpanded\def\doifnotsamestring {\syst_helpers_if_samestring_else\gobbleoneargument \firstofoneargument }
+
+\let\doifsamestringelse\doifelsesamestring
+
+%D \macros
+%D {ConvertToConstant,ConvertConstantAfter}
+%D
+%D When comparing arguments with a constant, we can get into trouble when this
+%D argument consists of tricky expandable commands. One solution for this is
+%D converting the argument to a string of unexpandable characters. To make
+%D comparison possible, we have to convert the constant too.
+%D
+%D \starttyping
+%D \ConvertToConstant\doifelse {...} {...} {then ...} {else ...}
+%D \stoptyping
+%D
+%D This construction is only needed when the first argument can give troubles.
+%D Misuse can slow down processing.
+%D
+%D \starttyping
+%D \ConvertToConstant\doifelse{\c!alfa} {\c!alfa}{...}{...}
+%D \ConvertToConstant\doifelse{alfa} {\c!alfa}{...}{...}
+%D \ConvertToConstant\doifelse{alfa} {alfa} {...}{...}
+%D \ConvertToConstant\doifelse{alfa \alfa test}{\c!alfa}{...}{...}
+%D \stoptyping
+%D
+%D In examples~2 and~3 both arguments equal, in~1 and~4 they differ.
+
+\unexpanded\def\ConvertToConstant#1#2#3%
+ {\edef\m_syst_string_one{\expandafter\detokenize\expandafter{#2}}%
+ \edef\m_syst_string_two{\expandafter\detokenize\expandafter{#3}}%
+ #1{\m_syst_string_one}{\m_syst_string_two}}
+
+%D When the argument \type{#1} consists of commands, we had better use
+%D
+%D \starttyping
+%D \ConvertConstantAfter\processaction[#1][...]
+%D \ConvertConstantAfter\doifelse{#1}{\v!something}{}{}
+%D \stoptyping
+%D
+%D This commands accepts things like:
+%D
+%D \starttyping
+%D \v!constant
+%D constant
+%D \hbox to \hsize{\rubish}
+%D \stoptyping
+%D
+%D As we will see in the core modules, this macro permits constructions like:
+%D
+%D \starttyping
+%D \setupfootertexts[...][...]
+%D \setupfootertexts[margin][...][...]
+%D \setupfootertexts[\v!margin][...][...]
+%D \stoptyping
+%D
+%D where \type {...} can be anything legally \TEX.
+
+\unexpanded\def\CheckConstantAfter#1#2%
+ {\expandafter\convertargument\v!prefix!\to\ascii
+ \convertargument#1\to#2\relax
+ \doifelseinstring\ascii{#2}
+ {\expandafter\convertargument#1\to#2}
+ {}}
+
+\unexpanded\def\ConvertConstantAfter#1#2#3%
+ {\CheckConstantAfter{#2}\asciia
+ \CheckConstantAfter{#3}\asciib
+ #1{\asciia}{\asciib}}
+
+%D \macros
+%D {assignifempty}
+%D
+%D We can assign a default value to an empty macro using:
+%D
+%D \starttyping
+%D \assignifempty \macros {default value}
+%D \stoptyping
+%D
+%D We don't explicitly test if the macro is defined.
+
+\unexpanded\def\assignifempty#1#2% can be sped up
+ {\doifsomething{#1}{\def#1{#2}}} % {\doifnot{#1}{}{\def#1{#2}}}
+
+%D \macros
+%D {gobbleuntil,grabuntil,gobbleuntilrelax,
+%D processbetween,processuntil}
+%D
+%D In \TEX\ gobbling usually stand for skipping arguments, so here are our gobbling
+%D macros.
+%D
+%D In \CONTEXT\ we use a lot of \type {\start}||\type {\stop} like constructions.
+%D Sometimes, the \type {\stop} is used as a hard coded delimiter like in: %D
+%D \starttyping
+%D \unexpanded\def\startcommand#1\stopcommand%
+%D {... #1 ...}
+%D \stoptyping
+%D
+%D In many cases the \type {\start}||\type {\stop} pair is defined at format
+%D generation time or during a job. This means that we cannot hardcode the \type
+%D {\stop} criterium. Only after completely understanding \type {\csname} and \type
+%D {\expandafter} I was able to to implement a solution, starting with:
+%D
+%D \starttyping
+%D \grabuntil{stop}\command
+%D \stoptyping
+%D
+%D This commands executes, after having encountered \type {\stop} the command \type
+%D {\command}. This command receives as argument the text preceding the \type
+%D {\stop}. This means that:
+%D
+%D \starttyping
+%D \unexpanded\def\starthello%
+%D {\grabuntil{stophello}\message}
+%D
+%D \starthello Hello world!\stophello
+%D \stoptyping
+%D
+%D results in: \type{\message{Hello world!}}.
+
+\let\syst_helpers_grab_indeed\relax
+
+\unexpanded\def\syst_helpers_grab#1#2%
+ {\def\syst_helpers_grab_indeed##1#1{#2{##1}}\syst_helpers_grab_indeed}
+
+\unexpanded\def\grabuntil#1%
+ {\expandafter\syst_helpers_grab\expandafter{\csname#1\endcsname}}
+
+%D The next command build on this mechanism:
+%D
+%D \starttyping
+%D \processbetween{string}\command
+%D \stoptyping
+%D
+%D Here:
+%D
+%D \starttyping
+%D \processbetween{hello}\message
+%D \starthello Hello again!\stophello
+%D \stoptyping
+%D
+%D leads to: \type{\message{Hello again!}}. The command
+%D
+%D \starttyping
+%D \gobbleuntil{sequence}
+%D \stoptyping
+%D
+%D is related to these commands. This one simply throws away
+%D everything preceding \type{\command}.
+
+\let\syst_helpers_gobble_indeed\relax
+
+\unexpanded\def\processbetween#1#2%
+ {\setvalue{\s!start#1}{\grabuntil{\s!stop#1}{#2}}}
+
+\unexpanded\def\gobbleuntil#1%
+ {\def\syst_helpers_gobble_indeed##1#1{}\syst_helpers_gobble_indeed}
+
+\unexpanded\def\gobbleuntilrelax#1\relax
+ {}
+
+%D The next one simply expands the pickup up tokens.
+%D
+%D \starttyping
+%D \processuntil{sequence}
+%D \stoptyping
+
+\let\syst_helpers_until_indeed\relax
+
+\unexpanded\def\processuntil#1%
+ {\def\syst_helpers_until_indeed##1#1{##1}\syst_helpers_until_indeed}
+
+%D \macros
+%D {groupedcommand}
+%D
+%D Commands often manipulate argument as in:
+%D
+%D \starttyping
+%D \def\doezomaarwat#1{....#1....}
+%D \stoptyping
+%D
+%D A disadvantage of this approach is that the tokens that form \type{#1} are fixed
+%D the the moment the argument is read in. Normally this is no problem, but for
+%D instance verbatim environments adapt the \CATCODES\ of characters and therefore
+%D are not always happy with already fixed tokens.
+%D
+%D Another problem arises when the argument is grouped not by \type {{}} but by
+%D \type {\bgroup} and \type {\egroup}. Such an argument fails, because the \type
+%D {\bgroup} is een as the argument (which is quite normal).
+%D
+%D The next macro offers a solution for both unwanted situations:
+%D
+%D \starttyping
+%D \groupedcommand {before} {after}
+%D \stoptyping
+%D
+%D Which can be used like:
+%D
+%D \starttyping
+%D \def\cite%
+%D {\groupedcommand{\rightquote\rightquote}{\leftquote\leftquote}}
+%D \stoptyping
+%D
+%D This command is equivalent to, but more 'robust' than:
+%D
+%D \starttyping
+%D \def\cite#1%
+%D {\rightquote\rightquote#1\leftquote\leftquote}
+%D \stoptyping
+%D
+%D \starttyping
+%D \def\rightword%
+%D {\groupedcommand{\hfill\hbox}{\parfillskip\zeropoint}}
+%D
+%D .......... \rightword{the right way}
+%D \stoptyping
+%D
+%D Here \TEX\ typesets \type {\bf the right way} unbreakable at the end of the line.
+%D The solution mentioned before does not work here. We also handle
+%D
+%D \starttyping
+%D to be \bold{bold} or not, that's the question
+%D \stoptyping
+%D
+%D and
+%D
+%D \starttyping
+%D to be {\bold bold} or not, that's the question
+%D \stoptyping
+%D
+%D This alternative checks for a \type {\bgroup} token first. The internal
+%D alternative does not accept the box handling mentioned before, but further
+%D nesting works all right. The extra \type {\bgroup}||\type {\egroup} is needed to
+%D keep \type {\m_syst_helpers_handle_group_after} both into sight and local.
+
+\let\m_syst_helpers_handle_group_after \relax
+\let\m_syst_helpers_handle_group_before\relax
+
+\unexpanded\def\syst_helpers_handle_group_nop
+ {\ifnum\currentgrouptype=\semisimplegroupcode
+ \expandafter\syst_helpers_handle_group_nop_a
+ \else
+ \expandafter\syst_helpers_handle_group_nop_b
+ \fi}
+
+\def\syst_helpers_handle_group_nop_a
+ {\begingroup
+ \aftergroup\m_syst_helpers_handle_group_a
+ \aftergroup\endgroup
+ \m_syst_helpers_handle_group_b}
+
+\def\syst_helpers_handle_group_nop_b
+ {\bgroup
+ \aftergroup\m_syst_helpers_handle_group_a
+ \aftergroup\egroup
+ \m_syst_helpers_handle_group_b}
+
+\unexpanded\def\syst_helpers_handle_group_normal
+ {\bgroup
+ \afterassignment\m_syst_helpers_handle_group_normal_before
+ \let\next=}
+
+\def\m_syst_helpers_handle_group_normal_before
+ {\bgroup
+ \m_syst_helpers_handle_group_b
+ \bgroup
+ \aftergroup\m_syst_helpers_handle_group_a
+ \aftergroup\egroup
+ \aftergroup\egroup}
+
+\unexpanded\def\syst_helpers_handle_group_simple% no inner group (so no kerning interference)
+ {\bgroup
+ \afterassignment\m_syst_helpers_handle_group_simple_before
+ \let\next=}
+
+\def\m_syst_helpers_handle_group_simple_before
+ {\bgroup
+ \aftergroup\m_syst_helpers_handle_group_simple_after
+ \m_syst_helpers_handle_group_b}
+
+\def\m_syst_helpers_handle_group_simple_after
+ {\m_syst_helpers_handle_group_a
+ \egroup}%
+
+\unexpanded\def\syst_helpers_handle_group_pickup% no inner group (so no kerning interference)
+ {\bgroup
+ \afterassignment\m_syst_helpers_handle_group_pickup_before
+ \let\next=}
+
+\def\m_syst_helpers_handle_group_pickup_before
+ {\bgroup
+ \aftergroup\m_syst_helpers_handle_group_a
+ \aftergroup\egroup
+ \aftergroup\m_syst_helpers_handle_group_p
+ \m_syst_helpers_handle_group_b}
+
+\unexpanded\def\syst_helpers_handle_group_nop_x
+ {\ifnum\currentgrouptype=\semisimplegroupcode
+ \begingroup
+ \aftergroup\endgroup
+ \else
+ \bgroup
+ \aftergroup\egroup
+ \fi
+ \m_syst_helpers_handle_group_b}
+
+\unexpanded\def\syst_helpers_handle_group_normal_x
+ {\bgroup
+ \afterassignment\m_syst_helpers_handle_group_normal_before_x
+ \let\next=}
+
+\def\m_syst_helpers_handle_group_normal_before_x
+ {\bgroup
+ \m_syst_helpers_handle_group_b
+ \bgroup
+ \aftergroup\egroup
+ \aftergroup\egroup}
+
+%D I considered it a nuisance that
+%D
+%D \starttyping
+%D \color[green]
+%D {as grass}
+%D \stoptyping
+%D
+%D was not interpreted as one would expect. This is due to the fact that \type
+%D {\futurelet} obeys blank spaces, and a line||ending token is treated as a blank
+%D space. So the final implementation became:
+
+\unexpanded\def\groupedcommand#1#2%
+ {\def\m_syst_helpers_handle_group_b{#1}%
+ \def\m_syst_helpers_handle_group_a{#2}%
+ \futureexpandis\bgroup\syst_helpers_handle_group_normal\syst_helpers_handle_group_nop}
+
+\unexpanded\def\groupedcommandcs#1#2%
+ {\let\m_syst_helpers_handle_group_b#1%
+ \let\m_syst_helpers_handle_group_a#2%
+ \futureexpandis\bgroup\syst_helpers_handle_group_normal\syst_helpers_handle_group_nop}
+
+\unexpanded\def\simplegroupedcommand#1#2%
+ {\def\m_syst_helpers_handle_group_b{#1}%
+ \def\m_syst_helpers_handle_group_a{#2}%
+ \futureexpandis\bgroup\syst_helpers_handle_group_simple\syst_helpers_handle_group_nop}
+
+\unexpanded\def\pickupgroupedcommand#1#2#3%
+ {\def\m_syst_helpers_handle_group_b{#1}%
+ \def\m_syst_helpers_handle_group_a{#2}%
+ \def\m_syst_helpers_handle_group_p{#3}%
+ \futureexpandis\bgroup\syst_helpers_handle_group_pickup\syst_helpers_handle_group_nop}
+
+\unexpanded\def\triggergroupedcommand#1%
+ {\def\m_syst_helpers_handle_group_b{#1}%
+ \futureexpandis\bgroup\syst_helpers_handle_group_normal_x\syst_helpers_handle_group_nop_x}
+
+\unexpanded\def\triggergroupedcommandcs#1%
+ {\let\m_syst_helpers_handle_group_b#1%
+ \futureexpandis\bgroup\syst_helpers_handle_group_normal_x\syst_helpers_handle_group_nop_x}
+
+%D Users should be aware of the fact that grouping can interfere with ones paragraph
+%D settings that are executed after the paragraph is closed. One should therefore
+%D explictly close the paragraph with \type {\par}, else the settings will be
+%D forgotten and not applied. So it's:
+%D
+%D \starttyping
+%D \def\BoldRaggedCenter%
+%D {\groupedcommand{\raggedcenter\bf}{\par}}
+%D \stoptyping
+
+%D \macros
+%D {checkdefined}
+%D
+%D The bigger the system, the greater the change that user defined commands collide
+%D with those that are part of the system. The next macro gives a warning when a
+%D command is already defined. We considered blocking the definition, but this is
+%D not always what we want.
+%D
+%D \starttyping
+%D \checkdefined {category} {class} {command}
+%D \stoptyping
+%D
+%D The user is warned with the suggestion to use \type {CAPITALS}. This suggestion
+%D is feasible, because \CONTEXT only defines lowcased macros.
+
+\unexpanded\def\showdefinederror#1#2%
+ {\writestatus\m!system{#1 #2 replaces a macro, use CAPITALS!}}
+
+\unexpanded\def\checkdefined#1#2#3%
+ {\doifdefined{#3}{\showdefinederror{#2}{#3}}}
+
+%D \macros
+%D {GotoPar,GetPar}
+%D
+%D Typesetting a paragraph in a special way can be done by first grabbing the
+%D contents of the paragraph and processing this contents grouped. The next macro
+%D for instance typesets a paragraph in boldface.
+%D
+%D \starttyping
+%D \def\remark#1\par%
+%D {\bgroup\bf#1\egroup}
+%D \stoptyping
+%D
+%D This macro has to be called like
+%D
+%D \starttyping
+%D \remark some text ... ending with \par
+%D \stoptyping
+%D
+%D Instead of \type {\par} we can of course use an empty line. When we started
+%D typesetting with \TEX, we already had produced lots of text in plain \ASCII. In
+%D producing such simple formatted texts, we adopted an open layout, and when
+%D switching to \TEX, we continued this open habit. Although \TEX\ permits a cramped
+%D and badly formatted source, it adds to confusion and sometimes introduces errors.
+%D So we prefer:
+%D
+%D \starttyping
+%D \remark
+%D
+%D some text ... ending with an empty line
+%D \stoptyping
+%D
+%D We are going to implement a mechanism that allows such open specifications. The
+%D definition of the macro handling \type {\remark} becomes:
+%D
+%D \starttyping
+%D \def\remark%
+%D {\BeforePar{\bgroup\bf}%
+%D \AfterPar{\egroup}%
+%D \GetPar}
+%D \stoptyping
+%D
+%D A macro like \type {\GetPar} can be defined in several ways. The recent version,
+%D the fourth one in a row, originally was far more complicated, but some
+%D functionality has been moved to other macros.
+%D
+%D We start with the more simple but in some cases more appropriate alternative is
+%D \type {\GotoPar}. This one leaves \type {\par} unchanged and is therefore more
+%D robust. On the other hand, \type {\AfterPar} is not supported.
+
+\newtoks\BeforePar
+\newtoks\AfterPar
+
+\def\redowithpar\par
+ {\doifelsenextchar\par\redowithpar\dodowithpar}%
+
+\def\dowithpar#1#2%
+ {\def\dodowithpar##1\par{#1##1#2}%
+ \redowithpar\par}
+
+\def\redogotopar\par
+ {\doifelsenextchar\par\redogotopar\dodogotopar}%
+
+\def\dogotopar#1%
+ {\def\dodogotopar{#1}%
+ \redogotopar\par}
+
+\def\dogotoparcs#1%
+ {\let\dodogotopar#1%
+ \redogotopar\par}
+
+\unexpanded\def\GetPar
+ {\expanded
+ {\dowithpar
+ {\the\BeforePar
+ \BeforePar\emptytoks}
+ {\the\AfterPar
+ \BeforePar\emptytoks
+ \AfterPar\emptytoks}}}
+
+\unexpanded\def\GotoPar
+ {\expanded
+ {\dogotopar
+ {\the\BeforePar
+ \BeforePar\emptytoks}}}
+
+%D \macros
+%D {dowithpargument,dowithwargument}
+%D
+%D The next macros are a variation on \type {\GetPar}. When macros expect an
+%D argument, it interprets a grouped sequence of characters a one token. While this
+%D adds to robustness and less ambiguous situations, we sometimes want to be a bit
+%D more flexible, or at least want to be a bit more tolerant to user input.
+%D
+%D We start with a commands that acts on paragraphs. This
+%D command is called as:
+%D
+%D \starttyping
+%D \dowithpargument\command
+%D \dowithpargument{\command ... }
+%D \stoptyping
+%D
+%D In \CONTEXT\ we use this one to read in the titles of chapters, sections etc. The
+%D commands responsible for these activities accept several alternative ways of
+%D argument passing. In these examples, the \type {\par} can be omitted when an
+%D empty line is present.
+%D
+%D \starttyping
+%D \command{...}
+%D \command ... \par
+%D \command
+%D {...}
+%D \command
+%D ... \par
+%D \stoptyping
+
+\let\syst_helpers_next_par\relax
+\let\syst_helpers_next_arg\relax
+
+\unexpanded\def\dowithpargument#1%
+ {\def\syst_helpers_next_par##1 \par{#1{##1}}%
+ \def\syst_helpers_next_arg##1{#1{##1}}%
+ \doifelsenextbgroup\syst_helpers_next_arg{\doifelsenextchar\par{#1{}}\syst_helpers_next_par}}
+
+%D The \type {p} in the previous command stands for paragraph. When we want to act
+%D upon words we can use the \type{w} alternative.
+%D
+%D \starttyping
+%D \dowithwargument\command
+%D \dowithwargument{... \command ...}
+%D \stoptyping
+%D
+%D The main difference bwteen two alternatives is in the handling of \type {\par}'s.
+%D This time the space token acts as a delimiter.
+%D
+%D \starttyping
+%D \command{...}
+%D \command ...
+%D \command
+%D {...}
+%D \command
+%D ...
+%D \stoptyping
+
+\let\syst_helpers_next_war\relax
+\let\syst_helpers_next_arg\relax
+
+\unexpanded\def\dowithwargument#1%
+ {\def\syst_helpers_next_war##1 {#1{##1}}%
+ \def\syst_helpers_next_arg##1{#1{##1}}%
+ \doifelsenextbgroup\syst_helpers_next_arg\syst_helpers_next_war}
+
+%D \macros
+%D {dorepeat,dorepeatwithcommand}
+%D
+%D When doing repetitive tasks, we stromgly advice to use \type {\dorecurse}. The
+%D next alternative however, suits better some of the \CONTEXT\ interface commands.
+%D
+%D \starttyping
+%D \dorepeat[n*\command]
+%D \stoptyping
+%D
+%D The value of the used \COUNTER\ can be called within
+%D \type{\command} by \type{\repeater}.
+%D
+%D A slightly different alternative is:
+%D
+%D \starttyping
+%D \dorepeatwithcommand[n*{...}]\command
+%D \stoptyping
+%D
+%D When we call for something like:
+%D
+%D \starttyping
+%D \dorepeatwithcommand[3*{Hello}]\message
+%D \stoptyping
+%D
+%D we get ourselves three \type {\message{Hello}} messages in a row. In both
+%D commands, the \type {n*} is optional. When this specification is missing, the
+%D command executes once.
+
+\unexpanded\def\dorepeatwithcommand[#1]%
+ {\syst_helpers_repeat_with_command#1*\empty*\relax}
+
+\def\syst_helpers_repeat_with_command#1*#2#3*#4\relax#5%
+ {\ifx#2\empty\syst_helpers_repeat_with_command_again[#1]#5\else\syst_helpers_repeat_with_command_indeed{#1}{#2}{#3}#5\fi}
+
+\def\syst_helpers_repeat_with_command_indeed#1#2#3#4%
+ {\ifx#2\empty % redundant but gives cleaner extensions
+ #4{#1}%
+ \orelse\ifnum#1<\zerocount
+ %\normalexpanded{\dorecurse{\number-\number#1}}{#4{-#2#3}}%
+ \dorecurse{-#1}{#4{-#2#3}}%
+ \orelse\ifx#2+%
+ \dorecurse{#1}{#4{#3}}%
+ \else
+ \dorecurse{#1}{#4{#2#3}}%
+ \fi}
+
+\def\syst_helpers_repeat_with_command_again[#1]#2%
+ {#2{#1}}
+
+%D The extension hook permits something like:
+%D
+%D \starttyping
+%D \bgroup
+%D
+%D \catcode`\*=\superscriptcatcode
+%D
+%D \gdef\syst_helpers_repeat_with_command_again[#1]%
+%D {\redodorepeatwithcommand#1*\empty*\relax}
+%D
+%D \gdef\redodorepeatwithcommand#1*#2#3*#4\relax#5%
+%D {\syst_helpers_repeat_with_command_indeed{#1}{#2}{#3}#5}
+%D
+%D \egroup
+%D \stoptyping
+%D
+%D although one may wonder if changing the catcode of \type {*} is wise.
+
+%D \macros
+%D {doifstringinstringelse}
+%D
+%D The next macro is meant for situations where both strings are macros. This save
+%D some unneeded expansion.
+%D
+%D \starttyping
+%D \def\doifstringinstringelse#1#2%
+%D {\syst_helpers_do_if_in_string_else#1#2%
+%D \expandafter\firstoftwoarguments
+%D \else
+%D \expandafter\secondoftwoarguments
+%D \fi}
+%D \stoptyping
+%D
+%D A bit faster is:
+
+\def\syst_helpers_if_instring_else_indeed#1%
+ {\if#1@%
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\def\doifelsestringinstring#1#2%
+ {\expandafter\def\expandafter\syst_helpers_if_instring_else\expandafter##\expandafter1#1##2##3^^^^0004%
+ {\syst_helpers_if_instring_else_indeed##2}%
+ \expandafter\expandafter\expandafter\syst_helpers_if_instring_else\expandafter#2#1@@^^^^0004}
+
+\let\doifstringinstringelse\doifelsestringinstring
+
+%D \macros
+%D {appendtoks,prependtoks,appendtoksonce,prependtoksonce,
+%D doifintokselse,flushtoks,dotoks}
+%D
+%D We use tokenlists sparsely within \CONTEXT, because the comma separated lists are
+%D more suitable for the user interface. Nevertheless we have:
+%D
+%D \starttyping
+%D (\doglobal) \appendtoks ... \to\tokenlist
+%D (\doglobal) \prependtoks ... \to\tokenlist
+%D (\doglobal) \flushtoks\tokenlist
+%D \dotoks\tokenlist
+%D \stoptyping
+%D
+%D These macros are clones of the ones implemented in page~378 of Knuth's \TEX book.
+
+\newtoks\t_syst_helpers_scratch
+\let \m_syst_helpers_scratch\empty
+
+\unexpanded\def\appendtoks#1\to#2%
+ {\ifx\dodoglobal\relax
+ \expandafter\toksapp
+ \else
+ \resetglobal
+ \expandafter\gtoksapp
+ \fi#2{#1}}
+
+\unexpanded\def\prependtoks#1\to#2%
+ {\ifx\dodoglobal\relax
+ \expandafter\tokspre
+ \else
+ \resetglobal
+ \expandafter\gtokspre
+ \fi#2{#1}}
+
+\def\syst_helpers_append_toks_indeed
+ {\ifx\dodoglobal\relax
+ \expandafter\toksapp
+ \else
+ \resetglobal
+ \expandafter\gtoksapp
+ \fi\m_syst_helpers_scratch\t_syst_helpers_scratch}
+
+\def\syst_helpers_prepend_toks_indeed
+ {\ifx\dodoglobal\relax
+ \expandafter\tokspre
+ \else
+ \resetglobal
+ \expandafter\gtokspre
+ \fi\m_syst_helpers_scratch\t_syst_helpers_scratch}
+
+\unexpanded\def\appendtoksonce#1\to#2%
+ {\let\m_syst_helpers_scratch#2%
+ \t_syst_helpers_scratch{#1}%
+ \doifelseintoks\t_syst_helpers_scratch\m_syst_helpers_scratch
+ \donothing
+ \syst_helpers_append_toks_indeed}
+
+\unexpanded\def\prependtoksonce#1\to#2%
+ {\let\m_syst_helpers_scratch#2%
+ \t_syst_helpers_scratch{#1}%
+ \doifelseintoks\t_syst_helpers_scratch\m_syst_helpers_scratch
+ \donothing
+ \syst_helpers_prepend_toks_indeed}
+
+%D The test macro:
+
+\unexpanded\def\doifelseintoks#1#2% #1 en #2 zijn toks
+ {\edef\asciia{\detokenize\expandafter{\the#1}}%
+ \edef\asciib{\detokenize\expandafter{\the#2}}%
+ \doifelsestringinstring\asciia\asciib}
+
+\let\doifintokselse\doifelseintoks
+
+%D Moved from \type {lxml-ini.tex} to here. This one is for generators that collect
+%D stuff piecewise, which is sometimes hard on mechanisms that grab content using
+%D delimiters:
+%D
+%D \starttyping
+%D \startcollecting
+%D \startcollect \bTABLE \stopcollect
+%D \startcollect \bTR \stopcollect
+%D \startcollect \bTD \stopcollect
+%D \startcollect foo\stopcollect
+%D \startcollect \eTD \stopcollect
+%D \startcollect \bTD \stopcollect
+%D \startcollect bar\stopcollect
+%D \startcollect \eTD \stopcollect
+%D \startcollect \eTR \stopcollect
+%D \startcollect \eTABLE \stopcollect
+%D \stopcollecting
+%D \stoptyping
+
+\newtoks \collectingtoks
+
+\unexpanded\def\startcollect #1\stopcollect {\toksapp \collectingtoks{#1}}
+\unexpanded\def\startexpandedcollect#1\stopexpandedcollect{\etoksapp\collectingtoks{#1}}
+
+\unexpanded\def\startcollecting{\collectingtoks\emptytoks}
+\unexpanded\def\stopcollecting {\the\collectingtoks}
+
+\unexpanded\def\collect {\toksapp \collectingtoks}
+\unexpanded\def\collectexpanded{\etoksapp\collectingtoks}
+
+%D A nice one too:
+
+% {\scratchtoks{abc} \removetoks b\from\scratchtoks [\the\scratchtoks]}
+% {\scratchtoks{abc} \removetoks x\from\scratchtoks [\the\scratchtoks]}
+% {\scratchtoks{} \removetoks x\from\scratchtoks [\the\scratchtoks]}
+% {\scratchtoks{xaa} \removetoks x\from\scratchtoks [\the\scratchtoks]}
+% {\scratchtoks{a\relax b} \removetoks \relax\from\scratchtoks [\showthe\scratchtoks]}
+
+\unexpanded\def\removetoks#1\from#2%
+ {\def\syst_helpers_remove_toks##1#1##2\empty\empty\empty##3^^^^0004%
+ {\def\m_syst_string_one{##3}%
+ \ifx\m_syst_string_one\empty#2{##1}\else#2{##1##2}\fi}%
+ \expandafter\syst_helpers_remove_toks\the#2\empty\empty\empty#1\empty\empty\empty^^^^0004}
+
+%D Also:
+
+\unexpanded\def\appendetoks#1\to#2%
+ {\ifx\dodoglobal\relax
+ \expandafter\etoksapp
+ \else
+ \resetglobal
+ \expandafter\xtoksapp
+ \fi#2{#1}}
+
+\unexpanded\def\prependetoks#1\to#2%
+ {\ifx\dodoglobal\relax
+ \expandafter\etokspre
+ \else
+ \resetglobal
+ \expandafter\xtokspre
+ \fi#2{#1}}
+
+%D Hm.
+
+\unexpanded\def\flushtoks#1% nb: can reassign to #1 again, hence the indirectness
+ {\t_syst_helpers_scratch#1\relax
+ \dodoglobal#1\emptytoks
+ \the\t_syst_helpers_scratch\relax}
+
+\let\dotoks\the
+
+%D \macros
+%D {beforesplitstring,aftersplitstring}
+%D
+%D These both commands split a string at a given point in two
+%D parts, so \type{x.y} becomes \type{x} or \type{y}.
+%D
+%D \starttyping
+%D \beforesplitstring test.tex\at.\to\filename
+%D \aftersplitstring test.tex\at.\to\extension
+%D \stoptyping
+%D
+%D The first routine looks (and is indeed) a bit simpler than the second one. The
+%D alternative looking more or less like the first one did not always give the
+%D results we needed. Both implementations show some insight in the manipulation of
+%D arguments.
+
+\let\syst_helpers_split_string\relax
+
+\unexpanded\def\beforesplitstring#1\at#2\to#3%
+ {\def\syst_helpers_split_string##1#2##2#2##3\\%
+ {\def#3{##1}}%
+ \expandafter\syst_helpers_split_string#1#2#2\\}
+
+\unexpanded\def\aftersplitstring#1\at#2\to#3%
+ {\def\syst_helpers_split_string##1#2##2@@@##3\\%
+ {\def#3{##2}}%
+ \expandafter\syst_helpers_split_string#1@@@#2@@@\\}
+
+%D \macros
+%D {splitstring,greedysplitstring}
+%D
+%D A bonus macro.
+
+\unexpanded\def\splitstring#1\at#2\to#3\and#4%
+ {\def\syst_helpers_split_string##1#2##2\empty\empty\empty##3\\%
+ {\def#3{##1}%
+ \def\syst_helpers_split_string{##3}%
+ \ifx\syst_helpers_split_string\empty
+ \let#4\empty
+ \else
+ \def#4{##2}%
+ \fi}%
+ \expandafter\syst_helpers_split_string#1\empty\empty\empty#2\empty\empty\empty\\}
+
+\unexpanded\def\greedysplitstring#1\at#2\to#3\and#4%
+ {\edef\asciib{#1}%
+ \let\asciic\asciib
+ \let#3\empty
+ \let#4\empty
+ \doloop
+ {\expandafter\splitstring\asciib\at#2\to\asciia\and\asciib
+ \ifx\asciib\empty
+ \exitloop
+ \else
+ % not \edef#3{\ifx#3\empty\else#3#2\fi\asciia} else
+ % /root/path fails because then #3==empty
+ \edef#3{\ifcase\recurselevel\or\else#3#2\fi\asciia}%
+ \let#4\asciib
+ \fi}%
+ \ifx#3\empty\let#3\asciic\fi}
+
+%D \macros
+%D {beforetestandsplitstring,
+%D aftertestandsplitstring,
+%D testandsplitstring}
+
+\unexpanded\def\beforetestandsplitstring#1\at#2\to#3%
+ {\def\syst_helpers_split_string##1#2##2#2##3##4\\%
+ {\ifx##3\empty\let#3\empty\else\def#3{##1}\fi}%
+ \expandafter\syst_helpers_split_string#1#2#2\empty\\}
+
+\unexpanded\def\aftertestandsplitstring#1\at#2\to#3%
+ {\def\syst_helpers_split_string ##1#2##2@@@##3##4\\%
+ {\ifx##3\empty\let#3\empty\else\def#3{##2}\fi}%
+ \expandafter\syst_helpers_split_string #1@@@#2@@@\empty\\}
+
+\def\testandsplitstring#1\at#2\to#3\and#4%
+ {\def\syst_helpers_split_string##1#2##2#2##3##4\\%
+ {\ifx##3\empty\let#3\empty\let#4\empty\else\def#3{##1}\def#4{##2}\fi}%
+ \expandafter\syst_helpers_split_string#1#2#2\empty\\}
+
+%D \macros
+%D {splitatperiod,
+%D {splitatcomma,
+%D splitatasterisk,
+%D splitatcolon,
+%D splitatcolons}
+
+\unexpanded\def\splitatperiod #1{\normalexpanded{\syst_helpers_splitatperiod #1}..\relax}
+\unexpanded\def\splitatcomma #1{\normalexpanded{\syst_helpers_splitatcomma #1},,\relax} % not at ", "
+\unexpanded\def\splitatasterisk#1{\normalexpanded{\syst_helpers_splitatasterisk#1}**\relax}
+\unexpanded\def\splitatcolon #1{\normalexpanded{\syst_helpers_splitatcolon #1}::\relax}
+\unexpanded\def\splitatcolons #1{\normalexpanded{\syst_helpers_splitatcolons #1}::::\relax}
+
+\unexpanded\def\syst_helpers_splitatperiod #1.#2.#3\relax#4#5{\def#4{#1}\def#5{#2}}
+\unexpanded\def\syst_helpers_splitatcomma #1,#2,#3\relax#4#5{\def#4{#1}\def#5{#2}}
+\unexpanded\def\syst_helpers_splitatasterisk #1*#2*#3\relax#4#5{\def#4{#1}\def#5{#2}}
+\unexpanded\def\syst_helpers_splitatcolon #1:#2:#3\relax#4#5{\def#4{#1}\def#5{#2}}
+\unexpanded\def\syst_helpers_splitatcolons #1::#2::#3\relax#4#5{\edef#4{#1}\edef#5{#2}}
+
+%D \macros
+%D {removesubstring}
+%D
+%D A first application of the two routines defined above is:
+%D
+%D \starttyping
+%D \removesubstring-\from first-last\to\nothyphenated
+%D \stoptyping
+%D
+%D Which in terms of \TEX\ looks like:
+
+\unexpanded\def\removesubstring#1\from#2\to#3%
+ {\splitstring#2\to\m_syst_string_one\and\m_syst_string_two
+ \dodoglobal#3{\m_syst_string_one\m_syst_string_two}}
+
+%D \macros
+%D {appendtocommalist,prependtocommalist,
+%D addtocommalist,removefromcommalist}
+%D
+%D When working with comma separated lists, one sooner or later want the tools to
+%D append or remove items from such a list. When we add an item, we first check if
+%D it's already there. This means that every item in the list is unique.
+%D
+%D \starttyping
+%D \addtocommalist {alfa} \name
+%D \addtocommalist {beta} \name
+%D \addtocommalist {gamma} \name
+%D \removefromcommalist {beta} \name
+%D \stoptyping
+%D
+%D These commands can be prefixed with \type {\doglobal}. The implementation of the
+%D second command is more complecated, because we have to take leading spaces into
+%D account. Keep in mind that users may provide lists with spaces after the commas.
+%D When one item is left, we also have to get rid of trailing spaces.
+%D
+%D \starttyping
+%D \def\words{alfa, beta, gamma, delta}
+%D \def\words{alfa,beta,gamma,delta}
+%D \stoptyping
+%D
+%D Removing an item takes more time than adding one. A fast appending alternative,
+%D without any testing, is also provided:
+%D
+%D \starttyping
+%D \appendtocommalist {something} \name
+%D \prependtocommalist {something} \name
+%D \stoptyping
+%D
+%D This can be implemented as follows:
+%D
+%D \starttyping
+%D \def\appendtocommalist#1#2%
+%D {\ifx#2\empty
+%D \dodoglobal\edef#2{#1}%
+%D \else % no test on empty
+%D \dodoglobal\edef#2{#2,#1}%
+%D \fi}
+%D
+%D \def\prependtocommalist#1#2%
+%D {\ifx#2\empty
+%D \dodoglobal\edef#2{#1}%
+%D \else % no test on empty
+%D \dodoglobal\edef#2{#1,#2}%
+%D \fi}
+%D \stoptyping
+%D
+%D The faster alternatives are:
+
+\unexpanded\def\appendtocommalist#1#2%
+ {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}
+
+\unexpanded\def\prependtocommalist#1#2%
+ {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}
+
+\unexpanded\def\addtocommalist#1#2% {item} \cs
+ {\rawdoifelseinset{#1}#2\resetglobal
+ {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}}
+
+\unexpanded\def\pretocommalist#1#2% {item} \cs
+ {\rawdoifelseinset{#1}#2\resetglobal
+ {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}}
+
+\unexpanded\def\robustdoifelseinset#1#2%
+ {\edef\m_syst_string_one{\detokenize\expandafter{\normalexpanded{#1}}}%
+ \edef\m_syst_string_two{\detokenize\expandafter{\normalexpanded{#2}}}%
+ \rawdoifelseinset\m_syst_string_one\m_syst_string_two}
+
+\let\robustdoifinsetelse\robustdoifelseinset
+
+\unexpanded\def\robustaddtocommalist#1#2% {item} \cs
+ {\robustdoifelseinset{#1}#2\resetglobal
+ {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}}
+
+\unexpanded\def\robustpretocommalist#1#2% {item} \cs
+ {\robustdoifelseinset{#1}#2\resetglobal
+ {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}}
+
+\unexpanded\def\xsplitstring#1#2% \cs {str}
+ {\def\syst_helpers_split_string##1,#2,##2,#2,##3\\%
+ {\edef\m_syst_string_one{\bcleanedupcommalist##1\empty\empty\relax}%
+ \edef\m_syst_string_two{\acleanedupcommalist##2,,\relax}}%
+ \expandafter\syst_helpers_split_string\expandafter,#1,,#2,,#2,\\}
+
+\def\bcleanedupcommalist#1#2#3\relax{\if#1,\else#1\fi\if#2,\else#2\fi#3}
+\def\bcleanedupcommalist#1#2\relax{\if#1,\else#1\fi#2}
+\def\acleanedupcommalist#1,,#2\relax{#1}
+
+\unexpanded\def\removefromcommalist#1#2% to be sped up
+ {\rawdoifelseinset{#1}#2%
+ {\normalexpanded{\xsplitstring\noexpand#2{#1}}%
+ \dodoglobal\edef#2%
+ {\ifx\m_syst_string_one\empty
+ \m_syst_string_two
+ \else
+ \m_syst_string_one\ifx\m_syst_string_two\empty\else,\m_syst_string_two\fi
+ \fi}}
+ \resetglobal}
+
+%D \macros
+%D {substituteincommalist}
+%D
+%D Slow but seldom used, so for the moment we stick to this implementation.
+%D
+%D \starttyping
+%D \substituteincommalist{old}{new}{list}
+%D \stoptyping
+
+\def\syst_helpers_substitute_in_comma_list_step#1%
+ {\edef\m_syst_string_three{#1}%
+ \ifx\m_syst_string_one\m_syst_string_three
+ \ifx\m_syst_string_two\empty \else
+ \edef\m_syst_string_four{\ifx\m_syst_string_four\empty\else\m_syst_string_four,\fi\m_syst_string_two}%
+ \fi
+ \else
+ \edef\m_syst_string_four{\ifx\m_syst_string_four\empty\else\m_syst_string_four,\fi#1}%
+ \fi}
+
+\unexpanded\def\substituteincommalist#1#2#3% old, new, list (slooow)
+ {\edef\m_syst_string_one{#1}%
+ \edef\m_syst_string_two{#2}%
+ \let\m_syst_string_four\empty
+ \normalexpanded{\rawprocesscommacommand[#3]}\syst_helpers_substitute_in_comma_list_step
+ \let#3\m_syst_string_four}
+
+%D \macros
+%D {replaceincommalist}
+%D
+%D The next macro can be used to replace an indexed element in a commalist:
+%D
+%D \starttyping
+%D \replaceincommalist\MyList{2}
+%D \stoptyping
+%D
+%D Element~2 will be replaced by the current meaning of the macro \type
+%D {\newcommalistelement}. The old meaning is saved in \type {\commalistelement}.
+%D The replacement honors grouped items, like in:
+%D
+%D \starttyping
+%D \def\MyList{a,b,c,d,e,f} \replaceincommalist\MyList{3}
+%D \def\MyList{a,b,c,d,e,f} \replaceincommalist\MyList{3}
+%D \def\MyList{a,{b,c},d,e,f} \replaceincommalist\MyList{3}
+%D \def\MyList{a,b,c,{d,e,f}} \replaceincommalist\MyList{3}
+%D \stoptyping
+%D
+%D This macro was used in the bibtex code (and is probably no longer needed).
+
+\newcount\c_syst_helpers_comma_list_index
+\let \m_syst_helpers_comma_list_target\empty
+
+\let\newcommalistelement\empty
+
+\def\syst_helpers_replace_in_comma_list_step#1%
+ {\ifnum\commalistcounter=\c_syst_helpers_comma_list_index\relax
+ \ifx\newcommalistelement\empty\else
+ \ifx\m_syst_helpers_comma_list_target\empty
+ \let\m_syst_helpers_comma_list_target\newcommalistelement
+ \else
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter
+ \m_syst_helpers_comma_list_target\expandafter\expandafter\expandafter
+ {\expandafter\m_syst_helpers_comma_list_target\expandafter,\newcommalistelement}%
+ \fi
+ \fi
+ \def\commalistelement{#1}%
+ \else
+ \ifx\m_syst_helpers_comma_list_target\empty
+ \ifx\nexttoken\bgroup % is known -)
+ \def\m_syst_helpers_comma_list_target{{#1}}%
+ \else
+ \def\m_syst_helpers_comma_list_target{#1}%
+ \fi
+ \else
+ \ifx\nexttoken\bgroup % is known -)
+ \expandafter\def\expandafter\m_syst_helpers_comma_list_target\expandafter{\m_syst_helpers_comma_list_target,{#1}}%
+ \else
+ \expandafter\def\expandafter\m_syst_helpers_comma_list_target\expandafter{\m_syst_helpers_comma_list_target,#1}%
+ \fi
+ \fi
+ \fi
+ \advance\commalistcounter\plusone}
+
+\unexpanded\def\replaceincommalist#1#2% #1 = commalistelement #2 = position starts at 1
+ {\c_syst_helpers_comma_list_index#2\relax
+ \let\m_syst_helpers_comma_list_target\empty
+ \let\commalistelement\empty
+ \commalistcounter\plusone
+ \expandafter\processcommalist\expandafter[#1]\syst_helpers_replace_in_comma_list_step
+ \dodoglobal\let#1\m_syst_helpers_comma_list_target}
+
+%D \macros
+%D {globalprocesscommalist}
+%D
+%D The commalist processing commands are characterized by the fact that the way they
+%D handle expansion as well as the fact that they can be nested. This makes them
+%D kind of useless for handling comma lists in alignments. In these situations the
+%D next macro can be of use.
+
+\let\m_syst_helpers_comma_list_command_global\empty
+
+\def\syst_helpers_comma_list_command_global_step#1,%
+ {\if]#1\else
+ \m_syst_helpers_comma_list_command_global{#1}%
+ \expandafter\syst_helpers_comma_list_command_global_step
+ \fi}
+
+\unexpanded\def\globalprocesscommalist[#1]#2%
+ {\glet\m_syst_helpers_comma_list_command_global#2%
+ \expandafter\syst_helpers_comma_list_command_global_step#1,],}
+
+%D \macros
+%D {withoutpt,PtToCm,
+%D numberofpoints,dimensiontocount}
+%D
+%D We can convert point into centimeters with:
+%D
+%D \starttyping
+%D \PtToCm{dimension}
+%D \stoptyping
+
+{\catcode`\.=\othercatcode
+ \catcode`\p=\othercatcode
+ \catcode`\t=\othercatcode
+ \gdef\WITHOUTPT#1pt{#1}}
+
+\def\withoutpt#1%
+ {\expandafter\WITHOUTPT#1}
+
+%D The capitals are needed because \type {p} and \type {t} have catcode~12, while
+%D macronames only permit tokens with the catcode~11. As a result we cannot use the
+%D \type {.group} primitives. Those who want to know more about this kind of
+%D manipulations, we advice to study the \TEX book in detail. Because this macro
+%D does not do any assignment, we can use it in the following way too.
+
+\def\PtToCm#1%
+ {\withoutpt\the\dimexpr0.0351459804\dimexpr#1\relax\relax cm}
+
+%D We also support:
+%D
+%D \starttyping
+%D \numberofpoints {dimension}
+%D \dimensiontocount {dimension} {\count}
+%D \stoptyping
+%D
+%D Both macros return a rounded number.
+
+% \dimensiontocount{10.49pt}\scratchcounter \the\scratchcounter / \numberofpoints{10.49pt}
+% \dimensiontocount{10.51pt}\scratchcounter \the\scratchcounter / \numberofpoints{10.51pt}
+
+\def\dimensiontocount#1#2{#2\numexpr\dimexpr#1\relax/\maxcard\relax}
+\def\numberofpoints #1{\the\numexpr\dimexpr#1\relax/\maxcard\relax}
+
+%D \macros
+%D {swapdimens,swapcounts,swapmacros,
+%D globalswapdimens,globalswapcounts,globalswapmacros}
+%D
+%D Simple but effective are the next two macros. There name exactly states their
+%D purpose.
+
+\newdimen\d_syst_helpers_swapped
+\newcount\c_syst_helpers_swapped
+\let \m_syst_helpers_swapped\relax
+
+\unexpanded\def\swapdimens#1#2{\d_syst_helpers_swapped#1#1#2#2\d_syst_helpers_swapped}
+\unexpanded\def\swapcounts#1#2{\c_syst_helpers_swapped#1#1#2#2\c_syst_helpers_swapped}
+\unexpanded\def\swapmacros#1#2{\let\m_syst_helpers_swapped#1\let#1#2\let#2\m_syst_helpers_swapped}
+
+\unexpanded\def\globalswapdimens#1#2{\d_syst_helpers_swapped#1\global#1#2\global#2\d_syst_helpers_swapped}
+\unexpanded\def\globalswapcounts#1#2{\c_syst_helpers_swapped#1\global#1#2\global#2\c_syst_helpers_swapped}
+\unexpanded\def\globalswapmacros#1#2{\let\m_syst_helpers_swapped#1\glet#1#2\glet#2\m_syst_helpers_swapped}
+
+%D \macros
+%D {pushmacro,popmacro}
+%D
+%D Premature and a bit of beta, we offer:
+%D
+%D \starttyping
+%D \pushmacro\macro
+%D \popmacro\macro
+%D \stoptyping
+%D
+%D Beware: global!
+
+\installsystemnamespace{localpushedmacro}
+\installsystemnamespace{globalpushedmacro}
+
+\let\m_syst_helpers_push_macro\empty
+
+\newcount\c_syst_helpers_pop_count
+
+\def\syst_helpers_push_macro_new_global
+ {\expandafter\newcount\csname\??globalpushedmacro\m_syst_helpers_push_macro\endcsname
+ \global\advance\csname\??globalpushedmacro\m_syst_helpers_push_macro\endcsname\plusone}
+
+\def\syst_helpers_push_macro_new_local
+ {\expandafter\newcount\csname\??localpushedmacro\m_syst_helpers_push_macro\endcsname
+ \global\advance\csname\??localpushedmacro\m_syst_helpers_push_macro\endcsname\plusone}
+
+\unexpanded\def\globalpushmacro#1%
+ {\xdef\m_syst_helpers_push_macro{\csstring#1}%
+ \ifcsname\??globalpushedmacro\m_syst_helpers_push_macro\endcsname
+ \global\advance\lastnamedcs\plusone
+ \else
+ \syst_helpers_push_macro_new_global
+ \fi
+ \expandafter\glet\csname\the\lastnamedcs\m_syst_helpers_push_macro\endcsname#1}
+
+\unexpanded\def\localpushmacro#1% this one can be used to push a value over an \egroup
+ {\xdef\m_syst_helpers_push_macro{\csstring#1}%
+ \ifcsname\??localpushedmacro\m_syst_helpers_push_macro\endcsname
+ \global\advance\lastnamedcs\plusone
+ \else
+ \syst_helpers_push_macro_new_local
+ \fi
+ \expandafter\glet\csname\the\lastnamedcs\m_syst_helpers_push_macro\endcsname#1}
+
+\unexpanded\def\globalpopmacro#1%
+ {\xdef\m_syst_helpers_push_macro{\csstring#1}%
+ \c_syst_helpers_pop_count\csname\??globalpushedmacro\m_syst_helpers_push_macro\endcsname
+ \global\advance\lastnamedcs \minusone
+ \expandafter\glet\expandafter#1\csname\the\c_syst_helpers_pop_count\m_syst_helpers_push_macro\endcsname}
+
+\unexpanded\def\localpopmacro#1%
+ {\xdef\m_syst_helpers_push_macro{\csstring#1}%
+ \c_syst_helpers_pop_count\csname\??localpushedmacro\m_syst_helpers_push_macro\endcsname
+ \global\advance\lastnamedcs \minusone
+ \expandafter\let\expandafter#1\csname\the\c_syst_helpers_pop_count\m_syst_helpers_push_macro\endcsname}
+
+\let\pushmacro\localpushmacro
+\let\popmacro \localpopmacro
+
+%D \macros
+%D {setlocalhsize,distributedhsize}
+%D
+%D Sometimes we need to work with the \type{ \hsize} that is corrected for
+%D indentation and left and right skips. The corrected value is available in \type
+%D {\localhsize}, which needs to be calculated with \type {\setlocalhsize} first. %D
+%D
+%D \starttyping
+%D \setlocalhsize \hbox to \localhsize{...}
+%D \setlocalhsize[-1em] \hbox to \localhsize{...}
+%D \setlocalhsize[.5ex] \hbox to \localhsize{...}
+%D \stoptyping
+%D
+%D These examples show us that an optional can be used. The value provided is added
+%D to \type {\localhsize}.
+
+\newdimen\localhsize
+
+\unexpanded\def\setlocalhsize % don't change !
+ {\doifelsenextoptional
+ \syst_helpers_set_local_hsize_yes
+ \syst_helpers_set_local_hsize_nop}
+
+\def\syst_helpers_set_local_hsize_nop
+ {\localhsize\availablehsize}
+
+\def\syst_helpers_set_local_hsize_yes[#1]%
+ {\syst_helpers_set_local_hsize_nop
+ \advance\localhsize#1\relax}
+
+\def\availablehsize
+ {\dimexpr
+ \hsize-\leftskip-\rightskip
+ \ifnum\hangafter<\zerocount
+ \ifdim\hangindent>\zeropoint-\else+\fi\hangindent
+ \fi
+ \relax}
+
+\def\distributedhsize#1#2#3%
+ {\dimexpr(#1-\numexpr#3-1\relax\dimexpr#2\relax)/#3\relax}
+
+\def\hsizefraction#1#2%
+ {\dimexpr#1/#2\relax}
+
+%D \macros
+%D {doifvalue,doifnotvalue,doifelsevalue,
+%D doifnothing,doifsomething,doifelsenothing,
+%D doifvaluenothing,doifvaluesomething,doifelsevaluenothing}
+%D
+%D These \type {\if} commands can be used to access macros (or variables) that are
+%D normally accessed by using \type {\getvalue}. Using these alternatives safes us
+%D three tokens per call. Anyone familiar with the not||values ones, can derive
+%D their meaning from the definitions.
+
+\unexpanded\def\doifvalue#1#2%
+ {\iftok{\csname#1\endcsname}{#2}%
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\unexpanded\def\doifnotvalue#1#2%
+ {\iftok{\csname#1\endcsname}{#2}%
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\unexpanded\def\doifelsevalue#1#2%
+ {\iftok{\csname#1\endcsname}{#2}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\unexpanded\def\doifnothing#1%
+ {\iftok{#1}\emptytoks
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\unexpanded\def\doifsomething#1%
+ {\iftok{#1}\emptytoks
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\unexpanded\def\doifelsenothing#1%
+ {\iftok{#1}\emptytoks
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\unexpanded\def\doifelsesomething#1%
+ {\iftok{#1}\emptytoks
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\unexpanded\def\doifvaluenothing#1%
+ {\iftok{\csname#1\endcsname}\emptytoks
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\unexpanded\def\doifvaluesomething#1%
+ {\iftok{\csname#1\endcsname}\emptytoks
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\unexpanded\def\doifelsevaluenothing#1%
+ {\iftok{\csname#1\endcsname}\emptytoks
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifvalueelse \doifelsevalue
+\let\doifnothingelse \doifelsenothing
+\let\doifsomethingelse \doifelsesomething
+\let\doifvaluenothingelse\doifelsevaluenothing
+
+%D \macros
+%D {doifemptyelsevalue, doifemptyvalue, doifnotemptyvalue}
+%D
+%D Also handy:
+
+\def\doifelseemptyvalue#1%
+ {\expandafter\ifx\csname#1\endcsname\empty
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifemptyvalueelse\doifelseemptyvalue
+
+\def\doifemptyvalue#1%
+ {\expandafter\ifx\csname#1\endcsname\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\doifnotemptyvalue#1%
+ {\expandafter\ifx\csname#1\endcsname\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+%D \macros
+%D {doifallcommonelse}
+%D
+%D A complete match of two sets can be tested with \type {\doifallcommonelse}, where
+%D the first two arguments are sets.
+
+\def\syst_helpers_do_if_all_common_else#1#2#3#4% slow
+ {\def\syst_helpers_do_common_check_all##1%
+ {\doifnotinset{##1}{#4}\donefalse
+ \ifdone\else\expandafter\quitcommalist\fi}%
+ \donetrue
+ \processcommalist[#3]\syst_helpers_do_common_check_all
+ \ifdone\expandafter#1\else\expandafter#2\fi}
+
+\unexpanded\def\doifelseallcommon{\syst_helpers_do_if_all_common_else\firstoftwoarguments\secondoftwoarguments}
+\unexpanded\def\doifallcommon {\syst_helpers_do_if_all_common_else\firstofonearguments\gobbleoneargument }
+\unexpanded\def\doifnotallcommon {\syst_helpers_do_if_all_common_else\gobbleoneargument \firstofonearguments }
+
+\let\doifallcommonelse\doifelseallcommon
+
+%D \macros
+%D {DOIF,DOIFELSE,DOIFNOT}
+%D
+%D \TEX\ is case sensitive. When comparing arguments, this feature sometimes is less
+%D desirable, for instance when we compare filenames. The next three alternatives
+%D upcase their arguments before comparing them.
+%D
+%D \starttyping
+%D \DOIF {string1} {string2} {...}
+%D \DOIFNOT {string1} {string2} {...}
+%D \DOIFELSE {string1} {string2} {then ...}{else ...}
+%D \stoptyping
+%D
+%D We have to use a two||step implementation, because the
+%D expansion has to take place outside \type{\uppercase}.
+%D
+%D These might end up as \LUA based helpers (i.e. consider these
+%D obsolete:
+
+\unexpanded\def\syst_helpers_do_IF#1#2%
+ {\uppercase{\syst_helpers_do_if_in_string_else{$#1$}{$#2$}}%
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\unexpanded\def\syst_helpers_do_IF_NOT#1#2%
+ {\uppercase{\syst_helpers_do_if_in_string_else{$#1$}{$#2$}}%
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\unexpanded\def\syst_helpers_do_IF_ELSE#1#2%
+ {\uppercase{\syst_helpers_do_if_in_string_else{$#1$}{$#2$}}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\unexpanded\def\syst_helpers_do_IF_INSTRING_ELSE#1#2%
+ {\uppercase{\syst_helpers_do_if_in_string_else{$#1$}{$#2$}}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\unexpanded\def\DOIF #1#2{\normalexpanded{\syst_helpers_do_IF {#1}{#2}}}% will become obsolete
+\unexpanded\def\DOIFNOT #1#2{\normalexpanded{\syst_helpers_do_IF_NOT {#1}{#2}}}% will become obsolete
+\unexpanded\def\DOIFELSE #1#2{\normalexpanded{\syst_helpers_do_IF_ELSE {#1}{#2}}}% will become obsolete
+\unexpanded\def\DOIFINSTRINGELSE #1#2{\normalexpanded{\syst_helpers_do_IF_INSTRING_ELSE{#1}{#2}}}% will become obsolete
+
+%D \macros
+%D {dosingleargumentwithset,
+%D dodoubleargumentwithset,dodoubleemptywithset,
+%D dotripleargumentwithset,dotripleemptywithset}
+%D
+%D These maybe too mysterious macros enable us to handle more than one setup at once.
+%D
+%D \starttyping
+%D \dosingleargumentwithset \command[#1]
+%D \dodoubleargumentwithset \command[#1][#2]
+%D \dotripleargumentwithset \command[#1][#2][#3]
+%D \dodoubleemptywithset \command[#1][#2]
+%D \dotripleemptywithset \command[#1][#2][#3]
+%D \stoptyping
+%D
+%D The first macro calls \type {\command[##1]} for each string in the set~\type
+%D {#1}. The second one calls for \typ {\command [##1][#2]} and the third, well one
+%D may guess. These commands support constructions like:
+%D
+%D \starttyping
+%D \def\dodefinesomething[#1][#2]%
+%D {\getparameters[\??xx#1][#2]}
+%D
+%D \unexpanded\def\definesomething%
+%D {\dodoubleargumentwithset\dodefinesomething}
+%D \stoptyping
+%D
+%D Which accepts calls like:
+%D
+%D \starttyping
+%D \definesomething[alfa,beta,...][variable=...,...]
+%D \stoptyping
+
+\let\m_syst_helpers_with_set_command\empty
+\let\syst_helpers_with_set_step \relax
+
+\def\syst_helpers_with_set_double[#1][#2]%
+ {\doifsomething{#1}%
+ {\def\syst_helpers_with_set_step##1{\m_syst_helpers_with_set_command[##1][#2]}%
+ \processcommalist[#1]\syst_helpers_with_set_step}}
+
+\def\syst_helpers_with_set_triple[#1][#2][#3]%
+ {\doifsomething{#1}%
+ {\def\syst_helpers_with_set_step##1{\m_syst_helpers_with_set_command[##1][#2][#3]}%
+ \processcommalist[#1]\syst_helpers_with_set_step}}
+
+\def\dodoubleemptywithset #1{\let\m_syst_helpers_with_set_command#1\dodoubleempty \syst_helpers_with_set_double} % \command
+\def\dodoubleargumentwithset#1{\let\m_syst_helpers_with_set_command#1\dodoubleargument\syst_helpers_with_set_double} % \command
+
+\def\dotripleemptywithset #1{\let\m_syst_helpers_with_set_command#1\dotripleempty \syst_helpers_with_set_triple} % \command
+\def\dotripleargumentwithset#1{\let\m_syst_helpers_with_set_command#1\dotripleargument\syst_helpers_with_set_triple} % \command
+
+%D \macros
+%D {stripcharacters,stripspaces}
+%D
+%D The next command was needed first when we implemented the \CONTEXT\ interactivity
+%D macros. When we use labeled destinations, we often cannot use all the characters
+%D we want. We therefore strip some of the troublemakers, like spaces, from the
+%D labels before we write them to the \DVI||file, which passes them to for instance
+%D a \POSTSCRIPT\ file.
+%D
+%D \starttyping
+%D \stripspaces\from\one\to\two
+%D \stoptyping
+%D
+%D Both the old string \type{\one} and the new one \type{\two}
+%D are expanded. This command is a special case of:
+%D
+%D \starttyping
+%D \stripcharacter\char\from\one\to\two
+%D \stoptyping
+%D
+%D As we can see below, spaces following a control sequence are to enclosed in \type
+%D {{}}.
+
+\let\m_syst_helpers_strip_character\empty
+
+\unexpanded\def\stripcharacter#1\from#2\to#3%
+ {\def\syst_helpers_strip_character##1#1##2\end
+ {\edef\m_syst_helpers_strip_character{\m_syst_helpers_strip_character##1}%
+ \doifnotempty{##2}{\syst_helpers_strip_character##2\end}}%
+ \let\m_syst_helpers_strip_character\empty
+ \edef\m_syst_string_one{#2}%
+ \expandafter\syst_helpers_strip_character\m_syst_string_one#1\end
+ \dodoglobal\let#3\m_syst_helpers_strip_character}
+
+\unexpanded\def\stripspaces\from#1\to#2% will become \unspacestring#1\from#2
+ {\stripcharacter{ }\from#1\to#2}
+
+%D \macros
+%D {unspacestring}
+%D
+%D The next macro does the same but is more compatible with other macros, like \type
+%D {\convert...}.
+
+\unexpanded\def\unspacestring#1\to#2%
+ {\stripcharacter{ }\from#1\to#2}
+
+%D \macros
+%D {executeifdefined}
+%D
+%D \CONTEXT\ uses one auxiliary file for all data concerning tables of contents,
+%D references, two||pass optimizations, sorted lists etc. This file is loaded as
+%D many times as needed. During such a pass we skip the commands thate are of no use
+%D at that moment. Because we don't want to come into trouble with undefined
+%D auxiliary commands, we call the macros in a way similar to \type {\getvalue}. The
+%D next macro take care of such executions and when not defined, gobbles the
+%D unwanted arguments.
+%D
+%D \starttyping
+%D \executeifdefined{name}\gobbleoneargument
+%D \stoptyping
+%D
+%D We can of course gobble more arguments using the appropriate gobbling command.
+
+\def\executeifdefined#1% #2 / never change this one again
+ {\ifcsname#1\endcsname
+ % \csname#1\expandafter\expandafter\expandafter\endcsname\expandafter\gobbleoneargument
+ \expandafter\expandafter\expandafter\lastnamedcs\expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+%D This one also has the advantage that it is fully expandable and that it can be
+%D used after an assignment.
+
+%D \macros
+%D {doifsomespaceelse}
+%D
+%D The next command checks a string on the presence of a space and executed a
+%D command accordingly.
+%D
+%D \starttyping
+%D \doifsomespaceelse {tekst} {then ...} {else ...}
+%D \stoptyping
+%D
+%D We use this command in \CONTEXT\ for determing if an argument must be broken into
+%D words when made interactive. Watch the use of \type {\noexpand}.
+
+%D Is this one still needed?
+
+\def\syst_helpers_if_some_space_else#1 #2#3^^^^0004{\if\noexpand#2@}
+
+\def\doifelsesomespace#1% % #2#3%
+ {\syst_helpers_if_some_space_else#1 @ @^^^^0004% #3\else#2\fi}
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\let\doifsomespaceelse\doifelsesomespace
+
+%D \macros
+%D {processseparatedlist}
+%D
+%D Maybe a bit late, but here is a more general version of the \type
+%D {\processcommalist} command. This time we don't handle nesting but accept
+%D arbitrary seperators.
+%D
+%D \starttyping
+%D \processseparatedlist[list][separator]\command
+%D \stoptyping
+%D
+%D One can think of things like:
+%D
+%D \starttyping
+%D \processseparatedlist[alfa+beta+gamma][+]\message
+%D \stoptyping
+%D
+%D We want to handle all situations, like:
+%D
+%D \startbuffer
+%D \processseparatedlist[{aap noot}] [ ]{\def\xxx} \convertcommand\xxx\to\ascii {\tttf\ascii}
+%D \processseparatedlist[{aap} {noot}][ ]{\def\xxx} \convertcommand\xxx\to\ascii {\tttf\ascii}
+%D \processseparatedlist[aap {noot}] [ ]{\def\xxx} \convertcommand\xxx\to\ascii {\tttf\ascii}
+%D \processseparatedlist[aap noot] [ ]{\def\xxx} \convertcommand\xxx\to\ascii {\tttf\ascii}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D Therefore we smuggle a \type {\relax} in front of the argument, which we remove
+%D afterwards.
+
+\let\syst_helpers_process_separated_list_step\relax
+
+\def\syst_helpers_process_separated_list#1]#2[#3]#4%
+ {\def\syst_helpers_process_separated_list_step##1##2#3%
+ {\def\m_syst_string_one{##2}% suggested by VZ
+ \if]##1%
+ \let\syst_helpers_process_separated_list_step\relax
+ \orelse\ifx\blankspace\m_syst_string_one
+ #4{##1}%
+ \orelse\if]##2%
+ \let\syst_helpers_process_separated_list_step\relax
+ \else
+ #4{##1##2}%
+ \fi
+ \syst_helpers_process_separated_list_step}%
+ \expandafter\syst_helpers_process_separated_list_step\gobbleoneargument#1#3]#3}
+
+\unexpanded\def\processseparatedlist[%
+ {\syst_helpers_process_separated_list\relax}
+
+%D \macros
+%D {processlist}
+%D
+%D An even more general list processing macro is the following one:
+%D
+%D \starttyping
+%D \processlist{beginsym}{endsym}{separator}\docommand list
+%D \stoptyping
+%D
+%D This one supports arbitrary open and close symbols as well as user defined
+%D separators.
+%D
+%D \starttyping
+%D \processlist(){=>}\docommand(a=>b=>c=>d)
+%D \stoptyping
+
+\let\syst_helpers_process_any_list \relax
+\let\syst_helpers_process_any_list_indeed\relax
+\let\syst_helpers_process_any_list_step \relax
+
+\unexpanded\def\processlist#1#2#3#4% no blank skipping !
+ {\def\syst_helpers_process_any_list_indeed##1#2%
+ {\def\syst_helpers_process_any_list_step####1####2#3%
+ {\ifx#2####1%
+ \let\syst_helpers_process_any_list_step\relax
+ \orelse\ifx#2####2%
+ \let\syst_helpers_process_any_list_step\relax
+ \else
+ #4{####1####2}%
+ \fi
+ \syst_helpers_process_any_list_step}%
+ \expandafter\syst_helpers_process_any_list_step\gobbleoneargument##1#3#2#3}%
+ \def\syst_helpers_process_any_list#1%
+ {\syst_helpers_process_any_list_indeed\relax}%
+ \syst_helpers_process_any_list}
+
+%D \macros
+%D {processassignlist}
+%D
+%D Is possible to combine an assignment list with one containing keywords.
+%D Assignments are treated accordingly, keywords are treated by \type {\command}.
+%D
+%D \starttyping
+%D \processassignlist[...=...,...=...,...]\commando
+%D \stoptyping
+%D
+%D This command can be integrated in \type {\getparameters}, but we decided best not
+%D to do so.
+
+\unexpanded\def\processassignlist#1[#2]#3%
+ {\def\syst_helpers_process_assign_list_assign[##1=##2=##3]%
+ {\doif{##3}\relax{#3{##1}}}%
+ \def\syst_helpers_process_assign_list_step##1%
+ {\syst_helpers_process_assign_list_assign[##1==\relax]}%
+ \processcommalist[#2]\syst_helpers_process_assign_list_step}
+
+%D \macros
+%D {untextargument
+%D untexcommand}
+%D
+%D When manipulating data(bases) and for instance generating index entries, the next
+%D three macros can be of help:
+%D
+%D \starttyping
+%D \untextargument{...}\to\name
+%D \untexcommand {...}\to\name
+%D \stoptyping
+%D
+%D They remove braces and backslashes and give us something to sort.
+
+\let\m_syst_helpers_untexed\empty
+
+\unexpanded\def\untexsomething
+ {\begingroup
+ \catcode\leftbraceasciicode \ignorecatcode
+ \catcode\rightbraceasciicode\ignorecatcode
+ \escapechar\minusone
+ \syst_helpers_untex_something}
+
+\def\syst_helpers_untex_something#1#2\to#3%
+ {\doglobal#1#2\to\m_syst_helpers_untexed
+ \endgroup
+ \let#3\m_syst_helpers_untexed}
+
+\unexpanded\def\untexargument{\untexsomething\convertargument}
+\unexpanded\def\untexcommand {\untexsomething\convertcommand}
+
+%D \macros
+%D {ScaledPointsToBigPoints,ScaledPointsToWholeBigPoints}
+%D
+%D One characteristic of \POSTSCRIPT\ and \PDF\ is that both used big points (\TEX's
+%D bp). The next macros convert points and scaled points into big points. The magic
+%D factor $72/72.27$ can be found in most \TEX\ related books.
+%D
+%D \starttyping
+%D \ScaledPointsToBigPoints {number} \target
+%D \ScaledPointsToWholeBigPoints {number} \target
+%D \stoptyping
+
+\let\tobigpoints \clf_tobigpoints
+\let\towholebigpoints\clf_towholebigpoints
+
+\unexpanded\def\PointsToBigPoints #1#2{\edef#2{\tobigpoints #1}} % can be avoided
+\unexpanded\def\PointsToWholeBigPoints #1#2{\edef#2{\towholebigpoints#1}} % can be avoided
+\unexpanded\def\ScaledPointsToBigPoints #1#2{\edef#2{\tobigpoints #1\scaledpoint}} % obsolete
+\unexpanded\def\ScaledPointsToWholeBigPoints#1#2{\edef#2{\towholebigpoints#1\scaledpoint}} % obsolete
+
+%D \macros
+%D {PointsToReal}
+%D
+%D Points can be stripped from their suffix by using \type {\withoutpt}. The next
+%D macro enveloppes this macro.
+%D
+%D \starttyping
+%D \PointsToReal {dimension} \target
+%D \stoptyping
+
+\unexpanded\def\PointsToReal#1#2%
+ {\edef#2{\withoutpt\the\dimexpr#1}}
+
+%D \macros
+%D {dontleavehmode}
+%D
+%D Sometimes when we enter a paragraph with some command, the first token gets the
+%D whole first line. We can prevent this by saying:
+%D
+%D \starttyping
+%D \dontleavehmode
+%D \stoptyping
+%D
+%D This command is used in for instance the language module \type {lang-ini}. The
+%D first version was:
+%D
+%D \starttyping
+%D \def\dontleavehmode{\ifhmode\else\ifmmode\else$ $\fi\fi}
+%D \stoptyping
+%D
+%D Next, Taco came with a better alternative (using mathsurround):
+%D
+%D \starttyping
+%D \def\dontleavehmode
+%D {\ifhmode\else \ifmmode\else
+%D {\mathsurround\zeropoint\everymath\emptytoks$ $}%
+%D \fi \fi}
+%D \stoptyping
+%D
+%D And finaly we got the following alternative, one that avoids interfering grouping
+%D at the cost of a box.
+%D
+%D \starttyping
+%D \newbox\b_syst_helpers_dlh
+%D
+%D \unexpanded\def\dontleavehmode
+%D {\ifhmode\else \ifmmode\else
+%D \setbox\b_syst_helpers_dlh\hbox{\mathsurround\zeropoint\everymath\emptytoks$ $}\unhbox\b_syst_helpers_dlh
+%D \fi \fi}
+%D \stoptyping
+%D
+%D But, as we run a recent version of \TEX, we can use the new primitive:
+
+\ifdefined\normalquitvmode \let\dontleavehmode\normalquitvmode \fi
+
+%D \macros
+%D {utfupper, utflower, uppercasestring, lowercasestring}
+%D
+%D The names tell what they do:
+%D
+%D \starttyping
+%D \uppercasestring somestring\to\somestring
+%D \lowercasestring somestring\to\somestring
+%D \stoptyping
+%D
+%D The first argument may be a \type{\macro}.
+%D
+%D These macros are sort of obsolete as we never use uppercase this way. But
+%D nevertheless we provide them:
+
+\def\utfupper#1{\clf_upper{#1}} % expandable
+\def\utflower#1{\clf_lower{#1}} % expandable
+
+\unexpanded\def\uppercasestring#1\to#2{\dodoglobal\edef#2{\clf_upper{#1}}}
+\unexpanded\def\lowercasestring#1\to#2{\dodoglobal\edef#2{\clf_lower{#1}}}
+
+%D \macros
+%D {handletokens}
+%D
+%D With the next macro we enter a critical area of macro expansion. What we want is
+%D a macro that looks like:
+%D
+%D \starttyping
+%D \handletokens some tokens\with \somemacro
+%D \stoptyping
+%D
+%D A bonus example:
+%D
+%D \starttyping
+%D \hbox{\handletokens tekst en meer tekst\with\ruledhbox}
+%D
+%D \def\weetikveel#1{\if#1\blankspace\space\else\ruledhbox{#1}\fi}
+%D
+%D \hbox{\handletokens tekst en meer tekst\with\weetikveel}
+%D \stoptyping
+
+%D \macros
+%D {counttoken,counttokens}
+%D
+%D For the few occasions that we want to know the number of specific tokens in a
+%D string, we can use:
+%D
+%D \starttyping
+%D \counttoken token\in string\to \somecount
+%D \counttokens string\to \somecount
+%D \stoptyping
+%D
+%D This macro, that for instance is used in \type {cont-tab}, takes a real counter.
+%D The macro can be preceded by \type {\doglobal}.
+
+\def\syst_helpers_count_token#1% obeys {}
+ {\def\m_syst_string_three{#1}%
+ \ifx\m_syst_string_two\m_syst_string_three \else
+ \ifx\m_syst_string_one\m_syst_string_three
+ \advance\privatescratchcounter\plusone
+ \fi
+ \expandafter\syst_helpers_count_token
+ \fi}
+
+\unexpanded\def\counttoken#1\in#2\to#3%
+ {\privatescratchcounter\zerocount
+ \def\m_syst_string_one{#1}%
+ \def\m_syst_string_two{\end}%
+ \syst_helpers_count_token#2\end
+ \dodoglobal#3\privatescratchcounter}
+
+\unexpanded\def\counttokens#1\to#2%
+ {\privatescratchcounter\zerocount
+ \def\syst_helpers_count_token##1{\advance\privatescratchcounter\plusone}%
+ \handletokens#1\with\syst_helpers_count_token
+ \dodoglobal#2\privatescratchcounter}
+
+%D \macros
+%D {splitofftokens}
+%D
+%D Running this one not always gives the expected results. Consider for instance the
+%D macro for which I originally wrote this token handler.
+
+\unexpanded\def\splitofftokens#1\from#2\to#3% slow but hardly used
+ {\ifnum#1>\zerocount
+ \privatescratchcounter#1\relax
+ \def\syst_helpers_split_off_tokens##1%
+ {\ifnum\privatescratchcounter>\zerocount
+ \advance\privatescratchcounter \minusone
+ \edef#3{#3##1}%
+ \fi}%
+ % \let#3\empty % #3 can be #2, so:
+ \expandafter\let\expandafter#3\expandafter\empty
+ \expandafter\handletokens#2\with\syst_helpers_split_off_tokens
+ \else
+ \edef#3{#2}%
+ \fi}
+
+%D This macro can be called like:
+%D
+%D \startbuffer[example]
+%D \splitofftokens10\from01234567 890123456789\to\test [\test]
+%D \stopbuffer
+%D
+%D up there. The reason for this is not that logical but follows from \TEX's
+%D However, the characters that we expect to find in \type {\test} just don't show
+%D sometimes mysterious way of expanding. Look at this:
+%D
+%D \startbuffer[next]
+%D \def\next{a} \edef\test{\next} [\test]
+%D \let\next=b \edef\test{\test\next} [\test]
+%D \let\next=c \edef\test{\next} [\test]
+%D \let\next=d \edef\test{\test\next} [\test]
+%D \let\next=e \expandafter\edef\expandafter\test\expandafter{\test\next} [\test]
+%D \stopbuffer
+%D
+%D \typebuffer[next]
+%D
+%D Careful reading shows that inside an \type {\edef} macro's that are \type {\let}
+%D are not expanded!
+%D
+%D \unprotect\getbuffer[next]\protect
+%D
+%D That's why we finally end up with a macro that looks ahead by using an
+%D assignment, this time by using \type {\futurelet}, and grabbing an argument as
+%D well. That way we can handle the sentinal, a blank space and grouped tokens.
+
+\unexpanded\def\syst_helpers_handle_tokens % \nexthandledtoken is part of interface
+ {\futurelet\nexthandledtoken\syst_helpers_handle_tokens_indeed}
+
+\def\handletokens#1\with#2%
+ {\gdef\syst_helpers_handle_tokens_command{#2}% permits more complex #2's
+ \syst_helpers_handle_tokens#1\end}
+
+\def\syst_helpers_handle_tokens_indeed
+ {\ifx\nexthandledtoken\blankspace
+ \expandafter\syst_helpers_handle_tokens_indeed_one
+ \orelse\ifx\nexthandledtoken\end
+ \expandafter\gobbletwoarguments % also gobble the \end
+ \else
+ \expandafter\syst_helpers_handle_tokens_indeed_two
+ \fi *}
+
+\def\syst_helpers_handle_tokens_indeed_one * %
+ {\syst_helpers_handle_tokens_command{ }\syst_helpers_handle_tokens}
+
+\def\syst_helpers_handle_tokens_indeed_two *#1%
+ {\syst_helpers_handle_tokens_command{#1}\syst_helpers_handle_tokens}
+
+%D This macro is tested on:
+%D
+%D \def\xxx#1{[#1]}
+%D
+%D \startlines
+%D \handletokens abc\with\xxx
+%D \handletokens a b c\with\xxx
+%D \handletokens a b c\with\xxx
+%D \handletokens a{bc}d\with\xxx
+%D \handletokens a\space bc \with\xxx
+%D \stoplines
+%D
+%D And our previous example shows up as:
+%D
+%D \getbuffer[example]
+
+%D \macros
+%D {iftrialtypesetting, ifvisible}
+%D
+%D The next boolean is at first sight a strange one. Sometimes one does a trial
+%D typesetting run, for instance to determine dimensions. Some mechanisms, like
+%D object inclusion, can fail on such trials. Temporary setting the next boolean to
+%D true, helps a lot. The second boolena can be used to inhibit processing
+%D completely.
+
+\newif\ifvisible \visibletrue
+
+\newtoks\everysettrialtypesetting
+\newtoks\everyresettrialtypesetting
+
+\unexpanded\def\settrialtypesetting {\the\everysettrialtypesetting } % obeys grouping so
+\unexpanded\def\resettrialtypesetting{\the\everyresettrialtypesetting} % this one is seldom needed
+
+\let\iftrialtypesetting\iffalse % so we have no \trialtypesettingtrue|false in mkiv !
+
+\appendtoks \let\iftrialtypesetting\iftrue \to \everysettrialtypesetting
+\appendtoks \let\iftrialtypesetting\iffalse \to \everyresettrialtypesetting
+
+%D \macros
+%D {twodigitrounding}
+%D
+%D When using \type {\special}s or \type {\pdfliteral}s, it sometimes makes sense to
+%D limit the precission. The next macro rounds a real number to two digits. It takes
+%D one argument and only works in \ETEX.
+
+\def\integerrounding #1{\clf_rounded\zerocount\numexpr#1\relax}
+\def\onedigitrounding #1{\clf_rounded\plusone \numexpr#1\relax}
+\def\twodigitrounding #1{\clf_rounded\plustwo \numexpr#1\relax}
+\def\threedigitrounding#1{\clf_rounded\plusthree\numexpr#1\relax}
+
+%D \macros
+%D {processcontent}
+%D
+%D This macro is first used in the tabulation macros.
+%D
+%D \starttyping
+%D \unexpanded\def\starthans%
+%D {\processcontent{stophans}\test{\message{\test}\wait}}
+%D \stoptyping
+
+\unexpanded\def\processcontent#1%
+ {\begingroup\expandafter\syst_helpers_process_content\csname#1\endcsname}
+
+\unexpanded\def\syst_helpers_process_content#1#2#3%
+ {\unexpanded\def\syst_helpers_process_content##1#1%
+ {\endgroup\def#2{##1}#3}%
+ \syst_helpers_process_content}
+
+%D \macros
+%D {dogobblesingleempty, dogobbledoubleempty}
+%D
+%D These two macros savely grab and dispose two arguments.
+
+\def\dogobblesingleempty{\dosingleempty\syst_helpers_gobble_single_empty}
+\def\dogobbledoubleempty{\dodoubleempty\syst_helpers_gobble_double_empty}
+
+\def\syst_helpers_gobble_single_empty [#1]{}
+\def\syst_helpers_gobble_double_empty[#1][#2]{}
+
+\let\gobblesingleempty\dogobblesingleempty % also used
+\let\gobbledoubleempty\dogobbledoubleempty % also used
+
+%D \macros
+%D {setdimensionwithunit, freezedimensionwithunit}
+%D
+%D The next assignments are all valid:
+%D
+%D \starttyping
+%D \setdimensionwithunit\scratchdimen{10} {cm}
+%D \setdimensionwithunit\scratchdimen{10cm}{cm}
+%D \setdimensionwithunit\scratchdimen{10cm}{}
+%D \freezedimensionwithunit\SomeWidth{\textwidth}
+%D \freezedimensionwithunit\SomeDepth{\dp\strutbox}
+%D \stoptyping
+%D
+%D As an alternative for the next macro we can use a global assignment inside a box.
+%D The \type {\empty}'s permits gobbling while preventing spurious \type {\relax}'s.
+
+\unexpanded\def\setdimensionwithunit#1#2#3% number unit dimension / nice trick
+ {\afterassignment\gobblefourarguments#1=#2#3pt\relax\empty\empty\empty\empty}
+
+\unexpanded\def\freezedimensionwithunit#1#2%
+ {\setdimensionwithunit\privatescratchdimen#1{#2}\edef#1{\the\privatescratchdimen}}
+
+%D \macros
+%D {doifsometokselse, doifsometoks}
+%D
+%D Not that fast I guess, but here's a way to test for token registers being empty.
+
+\unexpanded\def\doifelsesometoks#1%
+ {\iftok#1\emptytoks
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\unexpanded\def\doifsometoks#1%
+ {\iftok#1\emptytoks
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\unexpanded\def\doifemptytoks#1%
+ {\iftok#1\emptytoks
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\let\doifsometokselse\doifelsesometoks
+
+%D \macros
+%D {startstrictinspectnextcharacter}
+%D
+%D This one is for the bibliography module (still?):
+
+\let\syst_helpers_strict_inspect_next_character[
+
+\def\syst_helpers_strict_inspect_next_character% no user macro !
+ {\ifx\nexttoken[%
+ \expandafter\m_syst_action_yes
+ \else
+ \expandafter\m_syst_action_nop
+ \fi}
+
+\unexpanded\def\strictdoifelsenextoptional#1#2%
+ {\def\m_syst_action_yes{#1}%
+ \def\m_syst_action_nop{#2}%
+ \futurelet\nexttoken\syst_helpers_strict_inspect_next_character}
+
+\let\strictdoifnextoptionalelse\strictdoifelsenextoptional
+
+%D \macros
+%D {gobblespacetokens}
+%D
+%D This macro needs a speed-up!
+
+%\def\gobblespacetokens
+% {\doifnextcharelse\empty\donothing\donothing} % no {}\do\do !
+
+\def\gobblespacetokens
+ {\afterassignment\nexttoken\let\nexttoken=}
+
+%D \macros
+%D {verbatimargument}
+%D
+%D As the name says, this macro converts its argument to a (rather safe) string.
+
+\let\verbatimstring\detokenize
+
+%D These are needed in ordinal number conversions:
+
+\def\lastdigit#1%
+ {\expandafter\thelastdigit\number#1\relax}
+
+\def\thelastdigit#1#2%
+ {\ifx#2\relax#1\else\expandafter\thelastdigit\expandafter#2\fi}
+
+\def\lasttwodigits#1%
+ {\expandafter\thelasttwodigits\expandafter0\number#1\relax}
+
+\def\thelasttwodigits#1#2#3% 0 dig ... \relax
+ {\ifx#3\relax#1#2\else\expandafter\thelasttwodigits\expandafter#2\expandafter#3\fi}
+
+%D \macros
+%D {serializecommalist}
+%D
+%D Concatenate commalists:
+
+\let\syst_helpers_serialize_comma_list_step\relax
+
+\def\syst_helpers_serialize_comma_list_step#1%
+ {\edef\serializedcommalist{\serializedcommalist#1}}
+
+\unexpanded\def\serializecommalist[#1]%
+ {\let\serializedcommalist\empty
+ \processcommacommand[#1]\syst_helpers_serialize_comma_list_step}
+
+%D \macros
+%D {purenumber}
+%D
+%D Sometimes we need control over when \TEX\ stops reading a number, especially in
+%D full expandable macros where using \type {\relax} would lead to disasters.
+%D
+%D \starttyping
+%D \ifodd\purenumber{...}\space ... \else ... \fi
+%D \stoptyping
+%D
+%D Here we use a space as number delimiter in combination with a space- and
+%D relax-less \type {\purenumber}. This macro works ok with \type {\the}, \type
+%D {\number} as well as \ETEX's \type {\numexpr}.
+
+\def\purenumber#1{\expandafter\firstofoneargument\expandafter{\number#1}}
+
+%D \macros
+%D {filterfromvalue}
+%D
+%D \starttyping
+%D \setvalue{xx}{{A}{B}{C}}
+%D
+%D \filterfromvalue{xx}{3}{3}
+%D \filterfromvalue{xx}{3}{2}
+%D \filterfromvalue{xx}{3}{1}
+%D \stoptyping
+%D
+%D An alternative is to store 'max' in the list, say:
+%D
+%D \starttyping
+%D \setvalue{xx}{3{A}{B}{C}}
+%D
+%D \filterfromvalues{3}{xx}{3}
+%D \filterfromvalues{3}{xx}{2}
+%D \filterfromvalues{3}{xx}{1}
+%D \stoptyping
+%D
+%D I'll implement this when I'm in \quotation {writing dirty macros mood}.
+
+\def\dofilterfromstr#1#2% max n % no need to be fast
+ {\expandafter \expandafter \expandafter \csstring
+ \ifcase#1\or \ifcase#2\or
+ \firstofoneargument \else
+ \gobbleoneargument \fi
+ \or \ifcase#2\or
+ \firstoftwoarguments \or
+ \secondoftwoarguments \else
+ \gobbletwoarguments \fi
+ \or \ifcase#2\or
+ \firstofthreearguments \or
+ \secondofthreearguments \or
+ \thirdofthreearguments \else
+ \gobblethreearguments \fi
+ \or \ifcase#2\or
+ \firstoffourarguments \or
+ \secondoffourarguments \or
+ \thirdoffourarguments \or
+ \fourthoffourarguments \else
+ \gobblefourarguments \fi
+ \or \ifcase#2\or
+ \firstoffivearguments \or
+ \secondoffivearguments \or
+ \thirdoffivearguments \or
+ \fourthoffivearguments \or
+ \fifthoffivearguments \else
+ \gobblefivearguments \fi
+ \fi}
+
+\def\filterfromvalue#1#2#3% value max n
+ {\expandafter\doubleexpandafter\csname % we use the fact that an
+ \expandafter\ifx\csname#1\endcsname\relax % undefined cs has become \relax
+ \csstring\gobbleoneargument % which we then gobble here
+ \else
+ \dofilterfromstr{#2}{#3}%
+ \fi
+ \endcsname\csname#1\endcsname}
+
+\def\filterfromnext#1#2% max n {..}{..}{..}{..}
+ {\csname\dofilterfromstr{#1}{#2}\endcsname}
+
+%D \macros
+%D {definemeasure}
+%D
+%D \starttyping
+%D \definemeasure[mywidth][\dimexpr(\textwidth-1cm)]
+%D
+%D ... \measure{mywidth} ...
+%D \stoptyping
+
+\installsystemnamespace{measure}
+
+\unexpanded\def\definemeasure
+ {\dodoubleargument\syst_helpers_define_measure}
+
+\def\syst_helpers_define_measure[#1][#2]%
+ {\expandafter\def\csname\??measure#1\endcsname{#2}}
+
+\unexpanded\def\freezemeasure
+ {\dodoubleargument\syst_helpers_freeze_measure}
+
+\def\syst_helpers_freeze_measure[#1][#2]%
+ {\expandafter\edef\csname\??measure#1\endcsname{\the\dimexpr#2}}
+
+\unexpanded\def\setmeasure #1#2{\expandafter\def \csname\??measure#1\endcsname{#2}} % quick way
+\unexpanded\def\setgmeasure#1#2{\expandafter\gdef\csname\??measure#1\endcsname{#2}} % quick way
+\unexpanded\def\setemeasure#1#2{\expandafter\edef\csname\??measure#1\endcsname{\the\dimexpr#2}} % quick way
+\unexpanded\def\setxmeasure#1#2{\expandafter\xdef\csname\??measure#1\endcsname{\the\dimexpr#2}} % quick way
+
+\def\measure
+ {\the\measured}
+
+\def\measured#1%
+ %{\dimexpr\ifcsname\??measure#1\endcsname\csname\??measure#1\endcsname\else\zeropoint\fi\relax}
+ {\dimexpr\ifcsname\??measure#1\endcsname\lastnamedcs\else\zeropoint\fi\relax}
+
+% #2 could be omitted, but we want to support spaces
+%
+% \setmeasure {x} {1cm}
+% \setmeasure {xx} {1cm}
+% \setmeasure {xxx}{1cm}
+
+%D \macros
+%D {definequantity}
+%D
+%D These do the same but for numbers.
+
+\installsystemnamespace{quantity}
+
+\unexpanded\def\definequantity
+ {\dodoubleargument\syst_helpers_define_quantity}
+
+\def\syst_helpers_define_quantity[#1][#2]%
+ {\expandafter\def\csname\??quantity#1\endcsname{#2}}
+
+\unexpanded\def\freezequantity
+ {\dodoubleargument\syst_helpers_freeze_quantity}
+
+\def\syst_helpers_freeze_quantity[#1][#2]%
+ {\expandafter\edef\csname\??quantity#1\endcsname{\the\numexpr#2}}
+
+\unexpanded\def\setquantity #1#2{\expandafter\def \csname\??quantity#1\endcsname{#2}} % quick way
+\unexpanded\def\setgquantity#1#2{\expandafter\gdef\csname\??quantity#1\endcsname{#2}} % quick way
+\unexpanded\def\setequantity#1#2{\expandafter\edef\csname\??quantity#1\endcsname{\the\numexpr#2}} % quick way
+\unexpanded\def\setxquantity#1#2{\expandafter\xdef\csname\??quantity#1\endcsname{\the\numexpr#2}} % quick way
+
+\def\quantity
+ {\the\quantitied}
+
+\def\quantitied#1%
+ {\numexpr\ifcsname\??quantity#1\endcsname\lastnamedcs\else\zeropoint\fi\relax}
+
+\def\directquantity#1%
+ {\the\numexpr#1\relax}
+
+% let\quantified\quantitied
+
+%D \macros
+%D {dividedsize}
+%D
+%D This one can be used inside a measure (used in m4all):
+%D
+%D \starttyping
+%D \definemeasure[columnwidth][\dividedsize\textwidth{1em}{3}]
+%D \stoptyping
+
+\def\dividedsize#1#2#3% size gap n
+ {\dimexpr
+ \ifnum\dimexpr#1\relax>\plusone
+ (\dimexpr#1\relax-\numexpr#3-\plusone\relax\dimexpr#2\relax)/#3\else#1%
+ \fi
+ \relax}
+
+%D \macros
+%D {doifdimensionelse}
+%D
+%D This is a dirty one: we simply append a unit and discard it when needed.
+
+\def\doifelsedimension#1%
+ {\ifchkdim#1\or
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifdimensionelse\doifelsedimension
+
+%D Ok, here's another one, slower but seldom used. This one scans the text.
+%D
+%D \starttabulate[|Tc|Tc|]
+%D \NC pt \NC \doifdimenstringelse {pt}{yes}{no} \NC \NR
+%D \NC 12pt \NC \doifdimenstringelse {-12pt}{yes}{no} \NC \NR
+%D \NC 1pt \NC \doifdimenstringelse {1pt}{yes}{no} \NC \NR
+%D \NC 12pt \NC \doifdimenstringelse {12pt}{yes}{no} \NC \NR
+%D \NC 12.0pt \NC \doifdimenstringelse {12.0pt}{yes}{no} \NC \NR
+%D \NC -.12pt \NC \doifdimenstringelse {-.12pt}{yes}{no} \NC \NR
+%D \NC .12pt \NC \doifdimenstringelse {.12pt}{yes}{no} \NC \NR
+%D \NC -12pt \NC \doifdimenstringelse {-12pt}{yes}{no} \NC \NR
+%D \NC -12.0pt \NC \doifdimenstringelse{-12.0pt}{yes}{no} \NC \NR
+%D \NC big \NC \doifdimenstringelse {big}{yes}{no} \NC \NR
+%D \NC 10 \NC \doifdimenstringelse {10}{yes}{no} \NC \NR
+%D \NC 1 \NC \doifdimenstringelse {1}{yes}{no} \NC \NR
+%D \stoptabulate
+
+\let\doifelsedimenstring\doifelsedimension
+\let\doifdimenstringelse\doifelsedimenstring
+
+%D \macros
+%D {comparedimension,comparedimensioneps}
+%D
+%D This is a dirty one: we simply append a unit and discard it when needed.
+
+\newdimen \roundingeps \roundingeps=10sp
+\newconstant\compresult
+
+\def\comparedimension#1#2%
+ {\compresult
+ \ifdim#1<#2%
+ \zerocount
+ \orelse\ifdim#1<#2%
+ \plusone
+ \else
+ \plustwo
+ \fi}
+
+\def\comparedimensioneps#1#2% todo: use eps feature
+ {\compresult
+ \ifdim\dimexpr#1-#2\relax<\roudingeps
+ \zerocount
+ \orelse\ifdim\dimexpr#2-#1\relax<\roudingeps
+ \zerocount
+ \orelse\ifdim#1<#2%
+ \plusone
+ \else
+ \plustwo
+ \fi}
+
+% pretty ugly but fast
+
+% \copycsname xxx\endcsname\csname ..\endcsname
+
+\unexpanded\def\copycsname{\expandafter\expandafter\expandafter\let\expandafter\expandafter\csname}
+
+% \letcscsname \crap \csname ..\endcsname
+% \letcsnamecs \csname ..\endcsname\crap
+% \letcsnamecsname\csname ..\endcsname\csname ..\endcsname
+
+\unexpanded\def\letcscsname {\expandafter\let\expandafter}
+\unexpanded\def\letcsnamecs {\expandafter\let}
+\unexpanded\def\letcsnamecsname{\expandafter\expandafter\expandafter\let\expandafter\expandafter}
+
+% another one, add an item to a commalist
+
+\unexpanded\def\addvalue#1#2% cs item
+ {\ifcsname#1\endcsname\else\expandafter\let\csname#1\endcsname\empty\fi
+ \normalexpanded{\noexpand\addtocommalist{#2}\expandafter\noexpand\csname#1\endcsname}}
+
+\def\unspaced#1%
+ {\syst_helpers_unspaced#1\end}
+
+\def\syst_helpers_unspaced#1%
+ {\ifx#1\end
+ \expandafter\gobbleoneargument
+ \orelse\ifx#1\blankspace
+ % go on
+ \else
+ #1%
+ \fi
+ \syst_helpers_unspaced}
+
+\unexpanded\def\unspaceargument#1\to#2%
+ {\privatescratchcounter\catcode\spaceasciicode
+ \catcode\spaceasciicode\ignorecatcode
+ \scantextokens{\edef#2{#1}}%
+ \catcode\spaceasciicode\privatescratchcounter}
+
+\unexpanded\def\unspaceafter#1#2%
+ {\unspaceargument#2\to\ascii
+ \expandafter#1\expandafter{\ascii}}
+
+% sometimes handy:
+
+\unexpanded\def\doifelsehasspace#1%
+ {\edef\m_syst_string_one{#1}%
+ \normalexpanded{\syst_helpers_if_has_space_else#1\space}\empty\relax}
+
+\let\doifhasspaceelse\doifelsehasspace
+
+\unexpanded\def\syst_helpers_if_has_space_else#1 #2#3\relax % \space\empty\relax
+ {\ifx\m_syst_string_one\space
+ \expandafter\firstoftwoarguments
+ \orelse\ifx#2\empty
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+% this will replace loadfile once and alike !!! todo
+
+\installsystemnamespace{flag}
+
+\unexpanded\def\setflag #1{\expandafter\dodoglobal\expandafter\let\csname\??flag#1\endcsname\zerocount}
+\unexpanded\def\resetflag#1{\expandafter\dodoglobal\expandafter\let\csname\??flag#1\endcsname\plusone}
+
+\def\flag#1{\csname\??flag#1\endcsname}
+
+\def\doifelseflagged#1%
+ {\expandafter\ifx\csname\??flag#1\endcsname\relax
+ \expandafter\secondoftwoarguments
+ \orelse\ifcase\csname\??flag#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\let\doifflaggedelse\doifelseflagged
+
+\def\doifnotflagged#1%
+ {\expandafter\ifx\csname\??flag#1\endcsname\relax
+ \expandafter\firstofoneargument
+ \orelse\ifcase\csname\??flag#1\endcsname
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\unexpanded\def\inheritparameter[#1]#2[#3]#4[#5]% tag tokey fromkey
+ {\expandafter\def\csname#1#3\expandafter\endcsname\expandafter{\csname#1#5\endcsname}}
+
+\def\syst_helpers_if_non_zero_positive_else#1#2\end % #3#4%
+ {\ifx#1\relax
+ \ifcase\privatescratchcounter
+ \endgroup
+ \doubleexpandafter\secondoftwoarguments
+ \else
+ \endgroup
+ \doubleexpandafter\firstoftwoarguments
+ \fi
+ \else
+ \endgroup
+ \expandafter\secondoftwoarguments
+ \fi}
+
+% used ?
+
+\def\doifelsenonzeropositive#1%
+ {\begingroup\afterassignment\syst_helpers_if_non_zero_positive_else\privatescratchcounter=0#1\relax\empty\end}
+
+\let\doifnonzeropositiveelse\doifelsenonzeropositive
+
+% here ?
+
+\unexpanded\def\dosetrawvalue #1#2#3{\expandafter \def\csname#1#2\endcsname{#3}}
+\unexpanded\def\dosetrawevalue#1#2#3{\expandafter\edef\csname#1#2\endcsname{#3}}
+\unexpanded\def\dosetrawgvalue#1#2#3{\expandafter\gdef\csname#1#2\endcsname{#3}}
+\unexpanded\def\dosetrawxvalue#1#2#3{\expandafter\xdef\csname#1#2\endcsname{#3}}
+
+\unexpanded\def\getrawparameters {\dogetparameters\dosetrawvalue }
+\unexpanded\def\getraweparameters {\dogetparameters\dosetrawevalue}
+\unexpanded\def\getrawgparameters {\dogetparameters\dosetrawgvalue}
+\unexpanded\def\getrawxparameters {\dogetparameters\dosetrawxvalue}
+
+\unexpanded\def\globalgetrawparameters{\dogetparameters\dosetrawgvalue} % obsolete
+
+%D Sort of obsolete:
+
+\newcount\c_syst_helpers_mod
+
+\unexpanded\def\dosetmodulo#1#2#3%
+ {\c_syst_helpers_mod#1\divide\c_syst_helpers_mod#2\multiply\c_syst_helpers_mod#2%
+ #3#1\advance#3-\c_syst_helpers_mod}
+
+\unexpanded\def\dosetdivision#1#2#3%
+ {#3#1\divide#3 #2\relax}
+
+\unexpanded\def\DoMod#1by#2to#3{\dosetmodulo {#1}{#2}{#3}}
+\unexpanded\def\DoDiv#1by#2to#3{\dosetdivision{#1}{#2}{#3}}
+
+\def\syst_helpers_unprotected#1\par
+ {#1\protect}
+
+\unexpanded\def\unprotected
+ {\unprotect
+ \syst_helpers_unprotected}
+
+\let\resettimer \clf_resettimer
+\let\elapsedtime \clf_elapsedtime
+\let\elapsedseconds \elapsedtime
+
+\newcount\c_syst_helpers_test_feature_n
+\newcount\c_syst_helpers_test_feature_m
+
+\def\currentfeaturetest{\number\c_syst_helpers_test_feature_n}
+
+\unexpanded\def\testfeature#1#2%
+ {\c_syst_helpers_test_feature_m#1\relax
+ \def\syst_helpers_test_feature_yes
+ {\advance\c_syst_helpers_test_feature_n\plusone
+ \ifnum\c_syst_helpers_test_feature_n>\c_syst_helpers_test_feature_m\else
+ #2\expandafter\syst_helpers_test_feature_yes
+ \fi}%
+ \def\syst_helpers_test_feature_nop
+ {\advance\c_syst_helpers_test_feature_n\plusone
+ \ifnum\c_syst_helpers_test_feature_n>\c_syst_helpers_test_feature_m\else
+ \expandafter\syst_helpers_test_feature_nop
+ \fi}%
+ \retestfeature}
+
+\unexpanded\def\retestfeature % timer support is new per 10/5/2005
+ {\bgroup
+ \ifcase\interactionmode\let\wait\relax\fi
+ \clf_resettimer
+ \c_syst_helpers_test_feature_n\zerocount
+ \syst_helpers_test_feature_nop
+ \clf_benchmarktimer
+ \writestatus\m!system{starting feature test (n=\number\c_syst_helpers_test_feature_m)}\wait
+ \c_syst_helpers_test_feature_n\zerocount
+ \syst_helpers_test_feature_yes
+ \writestatus\m!system{\number\c_syst_helpers_test_feature_m\space feature tests done (\elapsedseconds s)}%
+ \wait
+ \egroup}
+
+\unexpanded\def\showtimer#1%
+ {\writestatus{runtime}{\elapsedseconds\space s / #1}}
+
+\unexpanded\def\testfeatureonce#1#2%
+ {\begingroup
+ \let\wait\relax
+ \testfeature{#1}{#2}%
+ \endgroup}
+
+%D \macros
+%D {freezedimenmacro}
+%D
+%D This macro is use as:
+%D
+%D \starttyping
+%D \freezedimenmacro\leftmargindistance
+%D \stoptyping
+
+\unexpanded\def\freezedimenmacro#1%
+ {\edef#1{\the\dimexpr#1}}
+
+%D The next macro negates a macro (dimension or number, or actually, whatever. It's
+%D a typical example of \type {\if} usage:
+%D
+%D \starttyping
+%D \if-\whatever \else-\whatever\fi => else => -whatever
+%D \if--\whatever\else-\whatever\fi => then => whatever
+%D \stoptyping
+
+\def\negated#1{\if-#1\else-#1\fi} % does only work in macros or text
+
+\def\gobbleassigndimen#1\\{}
+
+\def\assigndimen#1#2%
+ {\afterassignment\gobbleassigndimen#1=#2\zeropoint\\}
+
+\unexpanded\def\appended#1#2#3{\expandafter#1\expandafter#2\expandafter{#2#3}}
+\unexpanded\def\appendvalue #1{\expandafter\appended\expandafter \def\csname#1\endcsname}
+\unexpanded\def\appendgvalue#1{\expandafter\appended\expandafter\gdef\csname#1\endcsname}
+
+\unexpanded\def\prepended#1#2#3%
+ {\t_syst_helpers_scratch{#3}%
+ \expandafter\expandafter\expandafter#1\expandafter\expandafter\expandafter#2\expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter\t_syst_helpers_scratch#2}}
+
+\unexpanded\def\prependvalue #1{\expandafter\prepended\expandafter \def\csname#1\endcsname}
+\unexpanded\def\prependgvalue#1{\expandafter\prepended\expandafter\gdef\csname#1\endcsname}
+
+%D \macros
+%D {dowithrange}
+%D
+%D This one is for Mojca Miklavec, who made me aware of the fact that \type
+%D {page-imp.tex} was not the best place to hide it.
+%D
+%D \startbuffer
+%D \def\DoSomething#1{ [item #1] }
+%D
+%D \processranges[1,4:5]\DoSomething \par
+%D \dowithrange {1,4:5}\DoSomething \par
+%D \stopbuffer
+%D
+%D \typebuffer \blank \getbuffer \blank
+
+\def\syst_helpers_with_range#1%
+ {\splitstring#1\at:\to\m_syst_helpers_range_from\and\m_syst_helpers_range_to
+ \ifx\m_syst_helpers_range_to\empty\let\m_syst_helpers_range_to\m_syst_helpers_range_from\fi
+ \dostepwiserecurse\m_syst_helpers_range_from\m_syst_helpers_range_to\plusone{\m_helpers_range_action{##1}}}%
+
+\unexpanded\def\processranges[#1]#2% #1= n:m,p,q:r
+ {\def\m_helpers_range_action{#2}%
+ \processcommacommand[#1]\syst_helpers_with_range}
+
+\unexpanded\def\dowithrange#1#2%
+ {\def\m_helpers_range_action{#2}%
+ \processcommacommand[#1]\syst_helpers_with_range}
+
+% \def\DoSomething#1{ [item #1] }
+% \dowithrange[1,4:5]\DoSomething
+
+%D \macros
+%D {ignoreimplicitspaces}
+%D
+%D \startbuffer
+%D \def\whatever[#1]{\expanded{\definedfont[#1 at 12pt]}\ignorespaces}
+%D {a\whatever[Serif]b a\whatever[Serif] b a\whatever[Serif]\space b}
+%D \def\whatever[#1]{\expanded{\definedfont[#1 at 12pt]}\ignoreimplicitspaces}
+%D {a\whatever[Serif]b a\whatever[Serif] b a\whatever[Serif]\space b}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\unexpanded\def\ignoreimplicitspaces
+ {\doifelsenextchar\relax\relax\relax}
+
+%D \macros
+%D {processwords}
+%D
+%D Not that sophisticated but sometimes users (like in metafun).
+
+\def\syst_helpers_process_word#1 #2\_e_o_w_
+ {\doifsomething{#1}{\processword{#1} \syst_helpers_process_word#2 \_e_o_w_}}
+
+\def\processwords#1%
+ {\syst_helpers_process_word#1 \_e_o_w_}% no \unskip
+
+\let\processword\relax
+
+%D \macros
+%D {startnointerference}
+%D
+%D \starttyping
+%D \startnointerference
+%D all kind of code
+%D \stopnointerference
+%D \stoptyping
+
+\newbox\b_syst_helpers_no_interference
+
+\unexpanded\def\startnointerference % not even grouped !
+ {\setbox\b_syst_helpers_no_interference\vbox
+ \bgroup}
+
+\unexpanded\def\stopnointerference
+ {\egroup
+ \setbox\b_syst_helpers_no_interference\emptybox}
+
+%D A variant for \type {\executeifdefined}:
+
+\def\expandcheckedcsname#1#2% #2 is often a \xxxparameter so let's expand it once
+ {\normalexpanded{\noexpand\syst_helpers_expand_checked_csname{#1}{#2}}}
+
+\def\syst_helpers_expand_checked_csname#1#2#3%
+ {\csname#1\ifcsname#1#2\endcsname#2\else#3\fi\endcsname}
+
+%D Signal. Some fonts have a char0 rendering so we need to make sure that it is not
+%D set in the font! (This will be overloaded)
+
+\unexpanded\def\signalcharacter{\char\zerocount} % \zwj
+
+%D A few secial variants of commands defined here. Some more will be moved here (e.g.
+%D from table modules.
+
+\def\dodirectdoubleempty#1#2% used in math (lookahead issues)
+ {\ifx#2[%
+ \expandafter\syst_helpers_direct_double_empty_one_yes
+ \else
+ \expandafter\syst_helpers_direct_double_empty_one_nop
+ \fi#1#2}
+
+\def\syst_helpers_direct_double_empty_one_yes#1[#2]#3%
+ {\ifx#3[\else\expandafter\syst_helpers_direct_double_empty_two_nop\fi#1[#2]#3}
+
+\def\syst_helpers_direct_double_empty_one_nop#1{#1[][]}
+\def\syst_helpers_direct_double_empty_two_nop#1[#2]{#1[#2][]}
+
+%D Used in math definitions (in an \type {\edef}):
+
+%D \startbuffer
+%D [\docheckedpair{}]
+%D [\docheckedpair{a}]
+%D [\docheckedpair{a,b}]
+%D [\docheckedpair{a,b,c}]
+%D \stopbuffer
+%D
+%D \typebuffer \startlines \getbuffer \stoplines
+
+\def\docheckedpair#1%
+ {\syst_helpers_checked_pair#1,,\_o_e_p_}
+
+\def\syst_helpers_checked_pair#1,#2,#3\_o_e_p_
+ {#1,#2}
+
+%D Here are some nasty helpers. They can be used to fill often expanded token
+%D lists efficiently (see tabulate for an example).
+
+\def\constantnumber#1%
+ {\ifcase#1\zerocount
+ \or \plusone
+ \or \plustwo
+ \or \plusthree
+ \or \plusfour
+ \or \plusfive
+ \or \plussix
+ \or \plusseven
+ \or \pluseight
+ \or \plusnine
+ \or \plusten
+ \else \number#1\relax\fi}
+
+\def\constantnumberargument#1%
+ {\ifcase#1\zerocount
+ \or \plusone
+ \or \plustwo
+ \or \plusthree
+ \or \plusfour
+ \or \plusfive
+ \or \plussix
+ \or \plusseven
+ \or \pluseight
+ \or \plusnine
+ \or \plusten
+ \else {\number#1}\fi}
+
+\def\constantdimen#1%
+ {\ifdim#1=\zeropoint
+ \zeropoint
+ \else
+ \the#1\relax
+ \fi}
+
+\def\constantdimenargument#1%
+ {\ifdim#1=\zeropoint
+ \zeropoint
+ \else
+ {\the#1}%
+ \fi}
+
+\def\constantemptyargument#1%
+ {\ifx#1\empty
+ \noexpand\empty
+ \else
+ {#1}%
+ \fi}
+
+%D \macros
+%D {getsubstring}
+%D \startbuffer
+%D
+%D \getsubstring{4}{}{Who Wants This}
+%D \getsubstring{4}{9}{Who Wants This}
+%D \getsubstring{9}{-2}{Who Wants This}
+%D \getsubstring{1}{5}{Who Wants This}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+% expandable:
+
+\def\getsubstring#1#2#3{\clf_getsubstring{#3}{#1}{#2}}
+
+%D Other dimensions than pt (used in mb-mp)
+
+\def\converteddimen#1#2{\clf_converteddimen\dimexpr#1\relax{#2}}
+
+%D Maybe (looks ugly):
+%D
+%D \starttyping
+%D \doifcase {foo}
+%D {bar} {BAR}
+%D {foo} {FOO}
+%D {default} {DEFAULT}
+%D
+%D \doifcase {foo}
+%D {bar} {BAR}
+%D {foo} {\doifcase {bar}
+%D {bar} {BAR}
+%D {foo} {FOO}
+%D {default} {DEFAULT}
+%D }
+%D {default} {DEFAULT}
+%D \stoptyping
+
+% \doifcase {\btxfoundname{author}}
+% {author} {\btxflush{author}}
+% {editor} {\texdefinition{btx:apa:editor-or-editors}}
+% {title} {\texdefinition{btx:apa:title-subtitle-type}}
+% {default} {\btxflush{author}}
+
+% \unexpanded\def\doifcase#1%
+% {\edef\m_case_asked{#1}%
+% \syst_aux_case}
+%
+% \def\syst_aux_case#1%
+% {\edef\m_case_temp{#1}%
+% \ifx\m_case_temp\m_case_asked
+% \expandafter\syst_aux_case_yes
+% \orelse\ifx\m_case_temp\s!default
+% \expandafter\firstofoneargument
+% \else
+% \expandafter\syst_aux_case_nop
+% \fi}
+%
+% \def\syst_aux_skip#1#2%
+% {\edef\m_case_temp{#1}%
+% \ifx\m_case_temp\s!default
+% \expandafter\syst_aux_done
+% \else
+% \expandafter\syst_aux_skip
+% \fi}
+%
+% \def\syst_aux_case_yes#1%
+% {\def\syst_aux_done{#1}%
+% \syst_aux_skip}
+%
+% \def\syst_aux_case_nop#1%
+% {\syst_aux_case}
+
+%D \macros
+%D {ntimes}
+%D
+%D some repetition:
+%D
+%D \startbuffer
+%D \ntimes{*}{20}
+%D \stopbuffer
+%D
+%D \typebuffer \blank gives: \getbuffer \blank
+%D
+%D This is not real fast but quite okay:
+
+%def\ntimes#1#2{\ifnum#2>\zerocount#1\ntimes{#1}{\numexpr#2-\plusone\relax}\fi} % 1.72
+\def\ntimes#1#2{\clf_ntimes{#1}\numexpr#2\relax} % 0.33
+
+%D Experiment (sometimes looks nicer in code):
+
+\unexpanded\def\sameargumentscondition#1#2%
+ {\edef\m_syst_string_one{#1}%
+ \edef\m_syst_string_two{#2}%
+ \ifx\m_syst_string_one\m_syst_string_two}
+
+\unexpanded\def\emptyargumentcondition#1%
+ {\edef\m_syst_string_one{#1}%
+ \ifx\m_syst_string_one\empty}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/syst-con.lua b/Master/texmf-dist/tex/context/base/mkiv/syst-con.lua
index 0fa685b2dab..1af2d9a5d5e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/syst-con.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/syst-con.lua
@@ -66,3 +66,11 @@ implement { name = "tand", actions = { math.tand, nicenumber, context }, argumen
-- only as commands
function commands.format(fmt,...) context((gsub(fmt,"@","%%")),...) end
+
+implement {
+ name = "formatone",
+ public = true,
+ protected = true,
+ arguments = "2 strings",
+ actions = function(f,s) context((gsub(f,"@","%%")),s) end,
+}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/syst-con.mkiv b/Master/texmf-dist/tex/context/base/mkiv/syst-con.mkiv
index afbdf8605b2..56155460a90 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/syst-con.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/syst-con.mkiv
@@ -15,36 +15,10 @@
\unprotect
-%D When the number of conversions grew, it did no longer make
-%D sense to spread them over multiple files. So, instead of
-%D defining these in \type {font-ini}, we now have a dedicated
-%D module.
-
-%D \macros
-%D {lchexnumber,uchexnumber,lchexnumbers,uchexnumbers}
-%D
-%D In addition to the uppercase hex conversion, as needed in
-%D math families, we occasionally need a lowercase one, for
-%D instance when we want to compose gbsong fontnames.
-%D
-%D The ugly indirectness is needed to get rid of \TEX\
-%D induced spaces and \type {\relax}'s.
+%D \macros{lchexnumber,uchexnumber,lchexnumbers,uchexnumbers}
%D
-%D \starttyping
-%D [\uchexnumber{0}]
-%D [\uchexnumber\scratchcounter]
-%D [\uchexnumber\zerocount]
-%D [\uchexnumber{\number0}]
-%D [\uchexnumber{\number\scratchcounter}]
-%D [\uchexnumber{\number\zerocount}]
-%D [\uchexnumber{\the\scratchcounter}]
-%D [\uchexnumber{\the\zerocount}]
-%D [\expandafter\uchexnumber\expandafter{\number0}]
-%D [\expandafter\uchexnumber\expandafter{\number\scratchcounter}]
-%D [\expandafter\uchexnumber\expandafter{\number\zerocount}]
-%D [\expandafter\uchexnumber\expandafter{\the\scratchcounter}]
-%D [\expandafter\uchexnumber\expandafter{\the\zerocount}]
-%D \stoptyping
+%D In addition to the uppercase hex conversion, as needed in math families, we
+%D occasionally need a lowercase one.
\def\lchexnumber #1{\clf_lchexnumber \numexpr#1\relax}
\def\uchexnumber #1{\clf_uchexnumber \numexpr#1\relax}
@@ -53,33 +27,28 @@
\let\hexnumber\uchexnumber
-%D \macros
-%D {octnumber}
+%D \macros{octnumber}
%D
-%D For unicode remapping purposes, we need octal numbers.
+%D For \UNICODE\ remapping purposes, we need octal numbers.
\def\octnumber#1{\clf_octnumber\numexpr#1\relax}
-%D \macros
-%D {hexstringtonumber,octstringtonumber}
+%D \macros{hexstringtonumber,octstringtonumber}
%D
-%D This macro converts a two character hexadecimal number into
-%D a decimal number, thereby taking care of lowercase characters
-%D as well.
+%D This macro converts a two character hexadecimal number into a decimal number,
+%D thereby taking care of lowercase characters as well.
\def\hexstringtonumber#1{\clf_hexstringtonumber\numexpr#1\relax}
\def\octstringtonumber#1{\clf_octstringtonumber\numexpr#1\relax}
-%D \macros
-%D {rawcharacter}
+%D \macros{rawcharacter}
%D
-%D This macro can be used to produce proper 8 bit characters
-%D that we sometimes need in backends and round||trips.
+%D This macro can be used to produce proper 8 bit characters that we sometimes need
+%D in backends and round||trips.
\def\rawcharacter#1{\clf_rawcharacter\numexpr#1\relax}
-%D \macros
-%D {twodigits, threedigits}
+%D \macros{twodigits, threedigits}
%D
%D These macros provides two or three digits always:
@@ -88,50 +57,42 @@
%D \macros{modulonumber}
%D
-%D In the conversion macros described in \type {core-con} we
-%D need a wrap||around method. The following solution is
-%D provided by Taco.
+%D In the conversion macros described in \type {core-con} we need a wrap||around
+%D method. The following solution is provided by Taco.
%D
-%D The \type {modulonumber} macro expands to the mathematical
-%D modulo of a positive integer. It is crucial for it's
-%D application that this macro is fully exandable.
+%D The \type {modulonumber} macro expands to the mathematical modulo of a positive
+%D integer. It is crucial for it's application that this macro is fully exandable.
%D
-%D The expression inside the \type {\numexpr} itself is
-%D somewhat bizarre because \ETEX\ uses a rounding
-%D division instead of truncation. If \ETEX's division
-%D would have behaved like \TEX's normal\type{\divide}, then
-%D the expression could have been somewhat simpler, like
-%D \type {#2-(#2/#1)*#1}. This works just as well, but a bit
-%D more complex.
+%D The expression inside the \type {\numexpr} itself is somewhat bizarre because
+%D \ETEX\ uses a rounding division instead of truncation. If \ETEX's division would
+%D have behaved like \TEX's normal\type {\divide}, then the expression could have
+%D been somewhat simpler, like \type {#2-(#2/#1)*#1}. This works just as well, but a
+%D bit more complex.
-\def\modulonumber#1#2%
- {\the\numexpr#2-((((#2+(#1/2))/#1)-1)*#1)\relax}
+\def\modulonumber#1#2{\the\numexpr#2-((((#2+(#1/2))/#1)-1)*#1)\relax}
%D \macros{modulatednumber}
%D
-%D Modulo numbers run from zero to one less than the limit,
-%D but for conversion sets, we need a value between 1 and the
-%D limit. The \type{\modulatednumber} arranges that. This
-%D macro also needs to be fully expandable, resulting in
-%D two \type{\numexpr}s.
+%D Modulo numbers run from zero to one less than the limit, but for conversion sets,
+%D we need a value between 1 and the limit. The \type {\modulatednumber} arranges
+%D that. This macro also needs to be fully expandable, resulting in two \type
+%D {\numexpr}s.
\def\modulatednumber#1#2%
{\ifnum\the\numexpr\modulonumber{#1}{#2}\relax=0 #1%
\else \the\numexpr\modulonumber{#1}{#2}\relax \fi}
-%D \macros
-%D {realnumber} % used?
+%D \macros{setcalculatedsin,setcalculatedcos,setcalculatedtan}
-\def\realnumber#1{\withoutpt\the\dimexpr#1\s!pt\relax} % brrr
+\unexpanded\def\setcalculatedsin#1#2{\edef#1{\clf_sind#2}}
+\unexpanded\def\setcalculatedcos#1#2{\edef#1{\clf_cosd#2}}
+\unexpanded\def\setcalculatedtan#1#2{\edef#1{\clf_tand#2}}
-%D \macros
-%D {setcalculatedsin,setcalculatedcos,setcalculatedtan}
-
-\def\setcalculatedsin#1#2{\edef#1{\clf_sind#2}}
-\def\setcalculatedcos#1#2{\edef#1{\clf_cosd#2}}
-\def\setcalculatedtan#1#2{\edef#1{\clf_tand#2}}
+%D \macros{formatted,format}
\def\formatted#1{\ctxcommand{format(#1)}} % not clf
\unexpanded\def\format #1{\ctxcommand{format(#1)}} % not clf
+%D The \type {\modulatednumber} and \type {\realnumber} macros have been removed.
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/syst-con.mkxl b/Master/texmf-dist/tex/context/base/mkiv/syst-con.mkxl
new file mode 100644
index 00000000000..c3293b221f8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/syst-con.mkxl
@@ -0,0 +1,93 @@
+%D \module
+%D [ file=syst-con,
+%D version=2006.09.16, % real old stuff ... 2000.12.10
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Conversions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{syst-con}{}
+
+\unprotect
+
+%D \macros{lchexnumber,uchexnumber,lchexnumbers,uchexnumbers}
+%D
+%D In addition to the uppercase hex conversion, as needed in math families, we
+%D occasionally need a lowercase one.
+
+\def\lchexnumber #1{\clf_lchexnumber \numexpr#1\relax}
+\def\uchexnumber #1{\clf_uchexnumber \numexpr#1\relax}
+\def\lchexnumbers#1{\clf_lchexnumbers\numexpr#1\relax}
+\def\uchexnumbers#1{\clf_uchexnumbers\numexpr#1\relax}
+
+\let\hexnumber\uchexnumber
+
+%D \macros{octnumber}
+%D
+%D For \UNICODE\ remapping purposes, we need octal numbers.
+
+\def\octnumber#1{\clf_octnumber\numexpr#1\relax}
+
+%D \macros{hexstringtonumber,octstringtonumber}
+%D
+%D This macro converts a two character hexadecimal number into a decimal number,
+%D thereby taking care of lowercase characters as well.
+
+\def\hexstringtonumber#1{\clf_hexstringtonumber\numexpr#1\relax}
+\def\octstringtonumber#1{\clf_octstringtonumber\numexpr#1\relax}
+
+%D \macros{rawcharacter}
+%D
+%D This macro can be used to produce proper 8 bit characters that we sometimes need
+%D in backends and round||trips.
+
+\def\rawcharacter#1{\clf_rawcharacter\numexpr#1\relax}
+
+%D \macros{twodigits, threedigits}
+%D
+%D These macros provides two or three digits always:
+
+\def\twodigits #1{\ifnum #1<10 0\fi\number#1}
+\def\threedigits#1{\ifnum#1<100 \ifnum#1<10 0\fi0\fi\number#1}
+
+%D \macros{modulonumber}
+%D
+%D In the conversion macros described in \type {core-con} we need a wrap||around
+%D method. The following solution is provided by Taco.
+%D
+%D The \type {modulonumber} macro expands to the mathematical modulo of a positive
+%D integer. It is crucial for it's application that this macro is fully exandable.
+%D
+%D The expression inside the \type {\numexpr} itself is somewhat bizarre because
+%D \ETEX\ uses a rounding division instead of truncation. If \ETEX's division would
+%D have behaved like \TEX's normal\type {\divide}, then the expression could have
+%D been somewhat simpler, like \type {#2-(#2/#1)*#1}. This works just as well, but a
+%D bit more complex.
+%D
+%D \starttyping
+%D \def\modulonumber#1#2{\the\numexpr#2-((((#2+(#1/2))/#1)-1)*#1)\relax}
+%D \stoptyping
+%D
+%D But \unknown\ now we can also do this:
+
+\def\modulonumber#1#2{\the\numexpr#2-(#2:#1)*#1\relax}
+
+%D \macros{setcalculatedsin,setcalculatedcos,setcalculatedtan}
+
+\unexpanded\def\setcalculatedsin#1#2{\edef#1{\clf_sind#2}}
+\unexpanded\def\setcalculatedcos#1#2{\edef#1{\clf_cosd#2}}
+\unexpanded\def\setcalculatedtan#1#2{\edef#1{\clf_tand#2}}
+
+%D \macros{formatted,format}
+
+ \def\formatted#1{\ctxcommand{format(#1)}} % not clf
+\unexpanded\def\format #1{\ctxcommand{format(#1)}} % not clf
+
+%D The \type {\modulatednumber} and \type {\realnumber} macros have been removed.
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/syst-ini.mkiv b/Master/texmf-dist/tex/context/base/mkiv/syst-ini.mkiv
index 7ce48c79f66..0dd1fe29cf6 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/syst-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/syst-ini.mkiv
@@ -97,13 +97,12 @@
%D Initialization of primitives.
\directlua {
- local baseprimitives = tex.extraprimitives("core","tex")
- local moreprimitives = tex.extraprimitives("etex","luatex")
+ local primitives = tex.extraprimitives("core","tex","etex","luatex")
- tex.enableprimitives("",moreprimitives)
+ % table.sort(primitives)
- tex.enableprimitives("normal",baseprimitives)
- tex.enableprimitives("normal",moreprimitives)
+ tex.enableprimitives("", primitives)
+ tex.enableprimitives("normal",primitives)
function tex.enableprimitives() end
}
@@ -370,6 +369,7 @@
\newdimen\scratchwidth
\newdimen\scratchheight
\newdimen\scratchdepth
+\newdimen\scratchtotal
\newdimen\scratchoffset
\newdimen\scratchleftoffset
@@ -412,7 +412,7 @@
\newdimen \zeropoint \zeropoint 0pt
\newdimen \onepoint \onepoint 1pt
\newdimen \halfapoint \halfapoint 0.5pt
-\newdimen \maxdimen \maxdimen 16383.99999pt
+\newdimen \maxdimen \maxdimen 16383.99999pt % 1073741823sp
\newcount \maxcount \maxcount 2147483647
\newdimen \onebasepoint \onebasepoint 1bp
\newdimen \scaledpoint \scaledpoint 1sp
@@ -570,9 +570,7 @@
\newif\ifdone
\newif\iffound
-%D Potential primitive in \LUATEX:
-
-\ifdefined\htdp \else \def\htdp#1{\dimexpr\ht#1+\dp#1\relax} \fi
+\def\htdp#1{\dimexpr\ht#1+\dp#1\relax}
%D A few shortcuts:
@@ -619,48 +617,64 @@
%D have number 0 (used to be char node) and ligature nodes are mapped to 7. That way
%D macro packages can use the same symbolic names as in traditional \ETEX. Keep in
%D mind that the internal node numbers are different and that there are more node
-%D types that 15.
-
-\chardef\charnodecode = 0
-\chardef\hlistnodecode = 1
-\chardef\vlistnodecode = 2
-\chardef\rulenodecode = 3
-\chardef\insertnodecode = 4
-\chardef\marknodecode = 5
-\chardef\adjustnodecode = 6
-\chardef\ligaturenodecode = 7
-\chardef\discretionarynodecode = 8
-\chardef\whatsitnodecode = 9
-\chardef\mathnodecode = 10
-\chardef\gluenodecode = 11
-\chardef\kernnodecode = 12
-\chardef\penaltynodecode = 13
-\chardef\unsetnodecode = 14
-\chardef\mathsnodecode = 15
+%D types that 15. The mode parameter forces \LUAMETATEX\ to use the real node
+%D numbers.
+
+\ifdefined\internalcodesmode
+
+ \internalcodesmode\plusone
+
+ % \chardef\gluenodecode = 12
+ % \chardef\kernnodecode = 13
+ % \chardef\penaltynodecode = 14
+
+\else
+
+ % \chardef\charnodecode = 0
+ % \chardef\hlistnodecode = 1
+ % \chardef\vlistnodecode = 2
+ % \chardef\rulenodecode = 3
+ % \chardef\insertnodecode = 4
+ % \chardef\marknodecode = 5
+ % \chardef\adjustnodecode = 6
+ % \chardef\ligaturenodecode = 7
+ % \chardef\discretionarynodecode = 8
+ % \chardef\whatsitnodecode = 9
+ % \chardef\mathnodecode = 10
+ \chardef\gluenodecode = 11
+ \chardef\kernnodecode = 12
+ \chardef\penaltynodecode = 13
+ % \chardef\unsetnodecode = 14
+ % \chardef\mathsnodecode = 15
+
+\fi
%D Constants to be used with \type {\currentiftype}. I wonder if we will ever
-%D use these in \CONTEXT.
-
-\chardef\charifcode = 1
-\chardef\catifcode = 2
-\chardef\numifcode = 3
-\chardef\dimifcode = 4
-\chardef\oddifcode = 5
-\chardef\vmodeifcode = 6
-\chardef\hmodeifcode = 7
-\chardef\mmodeifcode = 8
-\chardef\innerifcode = 9
-\chardef\voidifcode = 10
-\chardef\hboxifcode = 11
-\chardef\vboxifcode = 12
-\chardef\xifcode = 13
-\chardef\eofifcode = 14
-\chardef\trueifcode = 15
-\chardef\falseifcode = 16
-\chardef\caseifcode = 17
-\chardef\definedifcode = 18
-\chardef\csnameifcode = 19
-\chardef\fontcharifcode = 20
+%D use these in \CONTEXT. We have a few more anyway and in \LUAMETATEX\ we
+%D have different numbers. So for now let's just not define them. The
+%D previously mentioned mode parameters enables the real numbers (we have
+%D some more and they are therefore ordered differently).
+
+% \chardef\charifcode = 1
+% \chardef\catifcode = 2
+% \chardef\numifcode = 3
+% \chardef\dimifcode = 4
+% \chardef\oddifcode = 5
+% \chardef\vmodeifcode = 6
+% \chardef\hmodeifcode = 7
+% \chardef\mmodeifcode = 8
+% \chardef\innerifcode = 9
+% \chardef\voidifcode = 10
+% \chardef\hboxifcode = 11
+% \chardef\vboxifcode = 12
+% \chardef\xifcode = 13
+% \chardef\eofifcode = 14
+% \chardef\trueifcode = 15
+% \chardef\falseifcode = 16
+% \chardef\caseifcode = 17
+% \chardef\definedifcode = 18
+% \chardef\csnameifcode = 19
+% \chardef\fontcharifcode = 20
%D Of course we want even bigger log files, so we copied this from the \ETEX\
%D source files.
@@ -695,7 +709,7 @@
\tracinggroups \plusone
\tracingifs \plusone
\tracingscantokens\plusone
- \tracingnesting \plusone
+ \tracingnesting \plustwo
\tracingassigns \plustwo}
\normalprotected\def\loggingall
@@ -720,6 +734,11 @@
\tracingcommands \zerocount
\tracingonline \zerocount}
+%D When we want to see a box we can as well show all of it.
+
+\showboxdepth \maxdimen
+\showboxbreadth\maxdimen
+
%D Just for tracing purposes we set:
\tracingstats\plusone
@@ -801,6 +820,9 @@
\let\then\relax % so that we can say: \ifnum1>2\then -)
+\def\truecondition {\iftrue}
+\def\falsecondition{\iffalse}
+
%D \macros
%D {newmacro,setnewmacro,newfraction}
%D
@@ -1002,7 +1024,7 @@
\spanomit \advance\mscount\minusone
\repeat}
-%D Backend:
+%D For the \LUATEX\ backend (overloaded anyway):
\ifdefined\pdfvariable
@@ -1093,21 +1115,27 @@
\let\pagebottomoffset\voffset \let\normalpagebottomoffset\voffset
\fi
-%D Handy.
+%D Handy (this will change, again).
-\suppresslongerror \plusone
-\suppressoutererror \plusone
-\suppressmathparerror \plusone
-\suppressifcsnameerror\plusone
+\ifdefined\suppresslongerror \suppresslongerror \plusone \fi
+\ifdefined\suppressoutererror \suppressoutererror \plusone \fi
+\ifdefined\suppressmathparerror \suppressmathparerror \plusone \fi
+\ifdefined\suppressifcsnameerror \suppressifcsnameerror \plusone \fi
+\ifdefined\suppressfontnotfounderror\suppressfontnotfounderror\zerocount\fi
-\let \suppresslongerror \relax
-\newcount\suppresslongerror \let\normalsuppresslongerror \suppresslongerror
-\let \suppressoutererror \suppresslongerror \let\normalsuppressoutererror \suppresslongerror
-\let \suppressmathparerror \suppresslongerror \let\normalsuppressmathparerror \suppresslongerror
-\let \suppressifcsnameerror\suppresslongerror \let\normalsuppressifcsnameerror\suppresslongerror
+\let \suppresslongerror \relax
+\newcount\suppresslongerror \let\normalsuppresslongerror \suppresslongerror
+\let \suppressoutererror \suppresslongerror \let\normalsuppressoutererror \suppresslongerror
+\let \suppressmathparerror \suppresslongerror \let\normalsuppressmathparerror \suppresslongerror
+\let \suppressifcsnameerror \suppresslongerror \let\normalsuppressifcsnameerror \suppresslongerror
+\let \suppressfontnotfounderror\suppresslongerror \let\normalsuppressfontnotfounderror\suppresslongerror
\matheqnogapstep\zerocount % for now
+%D Experiment:
+
+\ifdefined\frozen \else \def\frozen{} \let\normalfrozen\frozen \fi
+
%D Now we define a few helpers that we need in a very early stage. We have no
%D message system yet but redundant definitions are fatal anyway.
@@ -1136,4 +1164,14 @@
\let\normalstartdmath \Ustartdisplaymath
\let\normalstopdmath \Ustopdisplaymath
+%D Also better here:
+
+\def\wildcardsymbol{*}
+
+%D Get rid of this, we don't need it. If we ever need to check the order we will
+%D use proper symbolic constants.
+
+\let\eTeXglueshrinkorder \undefined
+\let\eTeXgluestretchorder\undefined
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/syst-ini.mkxl b/Master/texmf-dist/tex/context/base/mkiv/syst-ini.mkxl
new file mode 100644
index 00000000000..baca0bb5c1a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/syst-ini.mkxl
@@ -0,0 +1,1111 @@
+%D \module
+%D [ file=syst-ini,
+%D version=2008.11.04, % 2001.11.16, % 1999.03.17, % an oldie: 1995.10.10
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Bootstrapping \TEX,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D We used to load plain \TEX\ in a special way, but redefining a couple of
+%D primitives so that for instance font loading was ignored. For those interested,
+%D this loader is found in \type {syst-tex.tex}. Some of the comment's are Don
+%D Knuths and more of it can be found in the plain \TEX\ format.
+%D
+%D Characters can have special states, that can be triggered by setting their
+%D category coded. Some are preset, others are to be set as soon as possible,
+%D otherwise we cannot define any useful macros.
+%D
+%D First we define a bunch of constants. Normally we would \type {\setconstant}
+%D but we're prestine and have no macros defined yet. Abstraction also makes it
+%D possible to avoid the \type {^^} in the input.
+
+\chardef\escapecatcode 0
+\chardef\begingroupcatcode 1
+\chardef\endgroupcatcode 2
+\chardef\mathshiftcatcode 3
+\chardef\alignmentcatcode 4
+\chardef\endoflinecatcode 5
+\chardef\parametercatcode 6
+\chardef\superscriptcatcode 7
+\chardef\subscriptcatcode 8
+\chardef\ignorecatcode 9
+\chardef\spacecatcode 10
+\chardef\lettercatcode 11
+\chardef\othercatcode 12 % finally obsolete: \let\other \othercatcode
+\chardef\activecatcode 13 % finally obsolete: \let\active\activecatcode
+\chardef\commentcatcode 14
+\chardef\invalidcatcode 15
+
+%chardef\zeroasciicode 0
+\chardef\tabasciicode 9
+\chardef\newlineasciicode 10 % don't confuse this one with \endoflineasciicode
+\chardef\formfeedasciicode 12
+\chardef\endoflineasciicode 13 % somewhat messy but this can be the active \par
+\chardef\endoffileasciicode 26
+\chardef\spaceasciicode 32
+\chardef\exclamationmarkasciicode 33 % ! used in namespace protection
+\chardef\doublequoteasciicode 34 % "
+\chardef\hashasciicode 35
+\chardef\dollarasciicode 36
+\chardef\commentasciicode 37
+\chardef\ampersandasciicode 38
+\chardef\singlequoteasciicode 39 % '
+\chardef\primeasciicode 39 % '
+\chardef\leftparentasciicode 40
+\chardef\rightparentasciicode 41
+\chardef\hyphenasciicode 45
+\chardef\forwardslashasciicode 47 % /
+\chardef\colonasciicode 58
+\chardef\lessthanasciicode 60 % < used as alternative verbatim {
+\chardef\morethanasciicode 62 % > used as alternative verbatim }
+\chardef\questionmarkasciicode 63 % ? used in namespace protection
+\chardef\atsignasciicode 64 % @ used in namespace protection
+\chardef\backslashasciicode 92 % `\\
+\chardef\circumflexasciicode 94
+\chardef\underscoreasciicode 95
+\chardef\leftbraceasciicode 123 % `\{
+\chardef\barasciicode 124 % `\|
+\chardef\rightbraceasciicode 125 % `\}
+\chardef\tildeasciicode 126 % `\~
+\chardef\delasciicode 127
+
+%catcode\zeroasciicode \ignorecatcode % `\^^@ ascii null is ignored
+\catcode\tabasciicode \spacecatcode % `\^^I ascii tab is a blank space
+\catcode\formfeedasciicode \activecatcode % `\^^L ascii form-feed (active, set later)
+%catcode\endoflineasciicode \endoflinecatcode % `\^^M ascii return is end-line
+\catcode\endoffileasciicode \ignorecatcode % `\^^Z endoffile (ignored in ConTeXt)
+%catcode\spaceasciicode \spacecatcode % `\ ascii space is blank space
+\catcode\hashasciicode \parametercatcode % `\# hash mark is macro parameter character
+\catcode\dollarasciicode \mathshiftcatcode % `\$ dollar sign is math shift
+%catcode\commentasciicode \commentcatcode % `\% percent sign is comment character
+\catcode\ampersandasciicode \alignmentcatcode % `\& ampersand is alignment tab
+%catcode\backslashasciicode \escapecatcode % `\\ backslash is TeX escape character
+\catcode\circumflexasciicode \superscriptcatcode % `\^ circumflex and uparrow are for superscripts
+\catcode\underscoreasciicode \subscriptcatcode % `\_ underline and downarrow are for subscripts
+\catcode\leftbraceasciicode \begingroupcatcode % `\{ left brace is begin-group character
+\catcode\rightbraceasciicode \endgroupcatcode % `\} right brace is end-group character
+\catcode\tildeasciicode \activecatcode % `\~ tilde is active
+%catcode\delasciicode \invalidcatcode % `\^^? ascii delete is invalid
+
+\chardef\statuswrite 128
+
+%D First we need to initialization the primitives. Because \CONTEXT\ is already a
+%D pretty old macro package, we have a couple of issues with respect to primitives.
+%D The \ETEX\ engine added a few as did \PDFTEX. The \LUATEX\ engine added even
+%D more. This means that there can be a potential clash between primitives and
+%D existing macros. The most noticeable ones are:
+%D
+%D \starttyping
+%D \protected
+%D \expanded
+%D \unexpanded
+%D \stoptyping
+%D
+%D Because we had macros like that before the primitives showed up. The protection
+%D related macros were there before we even knew about extensions to the engine.
+%D When the expansion related ones were introduced, we originally came up with
+%D different names but due to requests we used the current names, somethng that in
+%D retrospect was a bad idea: they should have gotten different names in \LUATEX, if
+%D only because at that time only \CONTEXT\ was using them in rolling releases.
+%D Anyway, we're now stuck with this situation, and it means that one should use the
+%D \type {\normal...} variants in low level code:
+%D
+%D \starttyping
+%D \normalexpanded
+%D \normalprotected
+%D \normalunexpanded
+%D \stoptyping
+%D
+%D In the end not using different names in \LUATEX\ for these kind of backfires. It
+%D makes not much sense to fix this in \LUAMETATEX\ because we're now to long on the
+%D road. It is actually the reason why we have the option in \LUATEX\ to alias all
+%D primitives in one go using a prefix. Actually this trick could be used to recover
+%D a primitive meaning: just enable it with some prefix and \type {\let} the
+%D original to that. But \unknown\ we prevent that trick below.
+%D
+%D The code below differs from \LUATEX: in \LUAMETATEX\ all primitives are already
+%D available; it cannot limit itself to being \TEX\ or \ETEX. It could not do that
+%D anyway because there are differences (no backend, to mention one).
+
+\directlua {
+ local primitives = tex.extraprimitives() % "core","tex","etex","luatex"
+ tex.enableprimitives("normal",primitives) % could default to everything
+ function tex.enableprimitives() end % so we kind of protect what's there
+}
+
+\def\space{ }
+\def\empty{}
+
+\letcharcode \formfeedasciicode \par % \def ^^L{\par} formfeed
+\letcharcode \tildeasciicode \ % tilde
+\letcharcode \spaceasciicode \space % space
+
+\expandafter\def\csname\Uchar\tabasciicode \endcsname {\ } % \def\^^I{\ } tab
+\expandafter\def\csname\Uchar\formfeedasciicode \endcsname {\par} % \def\^^L{\par} formfeed
+\expandafter\def\csname\Uchar\endoflineasciicode\endcsname {\ } % \def\^^M{\ } return
+
+%D For now:
+
+\def\gobbleoneargument#1{} % will be defined later on anyway
+
+%D First we define a simplified version of the \CONTEXT\ protection mechanism.
+%D Later we will implement a better variant.
+
+\def\unprotect
+ {\edef\protect
+ {\catcode\atsignasciicode \the\catcode\atsignasciicode \relax
+ \catcode\exclamationmarkasciicode\the\catcode\exclamationmarkasciicode\relax
+ \catcode\questionmarkasciicode \the\catcode\questionmarkasciicode \relax
+ \catcode\underscoreasciicode \the\catcode\underscoreasciicode \relax
+ \let\protect\relax}%
+ \catcode\atsignasciicode \lettercatcode
+ \catcode\exclamationmarkasciicode\lettercatcode
+ \catcode\questionmarkasciicode \lettercatcode
+ \catcode\underscoreasciicode \lettercatcode}
+
+\let\protect\relax
+
+\unprotect
+
+%D Some pretty important definitions:
+
+\let\bgroup={
+\let\egroup=}
+
+%D \macros
+%D {normalbgroup,normalgroup}
+%D
+%D No comment.
+
+%D Allocation of registers is done slightly different than in plain \TEX. First of
+%D all we use different reserved counters. We also don't implement a family handler
+%D because users are not supposed to implement their own math. We reserve the lowest
+%D 31 registers for scratch purposes. Keep in mind that in the core engine some
+%D registers are reserved: counters 0 upto 9, and counter 255.
+%D
+%D As with plain \TEX\ we recommend that macro designers always use \type {\global}
+%D assignments with respect to registers numbered 1, 3, 5 \unknown\ 31, and always
+%D non||\type {\global} assignments with respect to registers 0, 2, 4, \unknown\ 30.
+%D This will prevent \quote {save stack buildup} that might otherwise occur.
+%D
+%D We reserve some registers for special (management) purposes:
+
+% 0 - 20 : scratch
+% 21 - 127 : internal
+% 128 - 254 : inserts
+% 255 : page
+% 256 - : user
+
+\countdef \c_syst_min_allocated_register = 52 \c_syst_min_allocated_register = 256 % can change
+\countdef \c_syst_max_allocated_register = 53 \c_syst_max_allocated_register = 32767
+\countdef \c_syst_min_allocated_read = 54 \c_syst_min_allocated_read = -1
+\countdef \c_syst_max_allocated_read = 55 \c_syst_max_allocated_read = 16
+\countdef \c_syst_min_allocated_language = 56 \c_syst_min_allocated_language = 0
+\countdef \c_syst_max_allocated_language = 57 \c_syst_max_allocated_language = 255
+\countdef \c_syst_min_allocated_insert = 58 \c_syst_min_allocated_insert = 128
+\countdef \c_syst_max_allocated_insert = 59 \c_syst_max_allocated_insert = 254
+\countdef \c_syst_min_allocated_family = 60 \c_syst_min_allocated_family = 128
+\countdef \c_syst_max_allocated_family = 61 \c_syst_max_allocated_family = 255
+\countdef \c_syst_min_allocated_attribute = 62 \c_syst_min_allocated_attribute = 1024 % 0-1023 : private
+\countdef \c_syst_min_allocated_write = 63 \c_syst_min_allocated_write = 0
+\countdef \c_syst_max_allocated_write = 64 \c_syst_max_allocated_write = 127
+
+\countdef \c_syst_last_allocated_count = 32 \c_syst_last_allocated_count = \c_syst_min_allocated_register
+\countdef \c_syst_last_allocated_dimen = 33 \c_syst_last_allocated_dimen = \c_syst_min_allocated_register
+\countdef \c_syst_last_allocated_skip = 34 \c_syst_last_allocated_skip = \c_syst_min_allocated_register
+\countdef \c_syst_last_allocated_muskip = 35 \c_syst_last_allocated_muskip = \c_syst_min_allocated_register
+\countdef \c_syst_last_allocated_box = 36 \c_syst_last_allocated_box = \c_syst_min_allocated_register
+\countdef \c_syst_last_allocated_toks = 37 \c_syst_last_allocated_toks = \c_syst_min_allocated_register
+\countdef \c_syst_last_allocated_read = 38 \c_syst_last_allocated_read = \c_syst_min_allocated_read
+\countdef \c_syst_last_allocated_write = 39 \c_syst_last_allocated_write = \c_syst_min_allocated_write
+\countdef \c_syst_last_allocated_marks = 40 \c_syst_last_allocated_marks = \c_syst_min_allocated_register
+\countdef \c_syst_last_allocated_language = 41 \c_syst_last_allocated_language = \c_syst_min_allocated_language % not used in context
+\countdef \c_syst_last_allocated_insertion = 42 \c_syst_last_allocated_insertion = \c_syst_min_allocated_insert
+\countdef \c_syst_last_allocated_family = 43 \c_syst_last_allocated_family = \c_syst_min_allocated_family % not used in context
+\countdef \c_syst_last_allocated_attribute = 44 \c_syst_last_allocated_attribute = \c_syst_min_allocated_attribute % not used in context
+
+\countdef \c_syst_min_counter_value = 125 \c_syst_min_counter_value = -"7FFFFFFF % beware, we use index 125 at the lua end
+\countdef \c_syst_max_counter_value = 126 \c_syst_max_counter_value = "7FFFFFFF % beware, we use index 126 at the lua end
+
+\countdef \zerocount = 120 \zerocount = 0
+\countdef \plusone = 121 \plusone = 1
+\countdef \minusone = 122 \minusone = -1
+
+\countdef \normalpagebox = 127 \normalpagebox = 255 % hardcoded in pdftex/xetex
+
+% Only to be used by developers in very special cases!
+
+% \def\lastallocatedcount {\the\c_syst_last_allocated_count}
+% \def\lastallocateddimen {\the\c_syst_last_allocated_dimen}
+% \def\lastallocatedskip {\the\c_syst_last_allocated_skip}
+% \def\lastallocatedmuskip {\the\c_syst_last_allocated_muskip}
+% \def\lastallocatedbox {\the\c_syst_last_allocated_dimen}
+% \def\lastallocatedtoks {\the\c_syst_last_allocated_toks}
+% \def\lastallocatedattribute{\the\c_syst_last_allocated_attribute}
+
+% A few traditional allocations (these might go):
+
+\countdef \count@ 255 % hm, used in \newif .. todo: replace it there
+\dimendef \dimen@ 0
+\dimendef \dimen@i 1 % global only
+\dimendef \dimen@ii 2
+
+%D So, effectively we start allocating from 256 and upwards. The inserts sit in the
+%D range 128 upto 254. Page numbers use the counters 0 upto 9 and the pagebox is
+%D 255. Users can use the scratch registers upto 31 without problem but all others
+%D are reserved.
+
+\let\wlog\gobbleoneargument % Let's get rid of this one.
+
+%D The allocators share a common helper macro.
+
+\normalprotected\def\newcount {\syst_basics_allocate\c_syst_last_allocated_count \count \countdef \c_syst_max_allocated_register}
+\normalprotected\def\newdimen {\syst_basics_allocate\c_syst_last_allocated_dimen \dimen \dimendef \c_syst_max_allocated_register}
+\normalprotected\def\newskip {\syst_basics_allocate\c_syst_last_allocated_skip \skip \skipdef \c_syst_max_allocated_register}
+\normalprotected\def\newmuskip {\syst_basics_allocate\c_syst_last_allocated_muskip \muskip \muskipdef \c_syst_max_allocated_register}
+\normalprotected\def\newbox {\syst_basics_allocate\c_syst_last_allocated_box \box \mathchardef\c_syst_max_allocated_register}
+\normalprotected\def\newtoks {\syst_basics_allocate\c_syst_last_allocated_toks \toks \toksdef \c_syst_max_allocated_register}
+\normalprotected\def\newread {\syst_basics_allocate\c_syst_last_allocated_read \read \chardef \c_syst_max_allocated_read}
+\normalprotected\def\newwrite {\syst_basics_allocate\c_syst_last_allocated_write \write \chardef \c_syst_max_allocated_write}
+\normalprotected\def\newmarks {\syst_basics_allocate\c_syst_last_allocated_marks \marks \mathchardef\c_syst_max_allocated_register}
+\normalprotected\def\newinsert {\syst_basics_allocate\c_syst_last_allocated_insertion\insert \chardef \c_syst_max_allocated_insert}
+
+%D We don't need these in \CONTEXT:
+
+\normalprotected\def\newlanguage{\syst_basics_allocate\c_syst_last_allocated_language \language\chardef \c_syst_max_allocated_language}
+\normalprotected\def\newfamily {\syst_basics_allocate\c_syst_last_allocated_family \fam \chardef \c_syst_max_allocated_family}
+
+\let\newfam\newfamily
+
+\firstvalidlanguage\plusone
+
+% Watch out, for the moment we disable the check for already being defined
+% later we will revert this but first all chardefs must be replaced.
+
+\normalprotected\def\newconstant #1{\ifdefined#1\let#1\undefined\fi\newcount#1}
+\normalprotected\def\setnewconstant #1{\ifdefined#1\let#1\undefined\fi\newcount#1#1} % just a number
+\normalprotected\def\setconstant {} % dummy, no checking, so it warns
+\normalprotected\def\setconstantvalue#1#2{\csname#1\endcsname\numexpr#2\relax}
+
+% maybe setconstant with check
+
+% %D The next definitions are really needed (in \CONTEXT):
+
+\newlinechar\newlineasciicode \edef\outputnewlinechar{\Uchar\newlineasciicode} % {^^J}
+
+%D One reason to start high with allocation is that it permits us to allocate
+%D consecutive ranges more easily, for instance if for \MPLIB\ we want to allocate a
+%D continuous range of boxes. It also permits us to do a proper upward allocation
+%D for inserts. The current code evolved from code that dealt with older engines but
+%D as all engines now provide many registers we removed all traces.
+
+\ifdefined\writestatus \else
+ %\normalprotected\def\writestatus#1#2{\immediate\write\statuswrite{#1: #2}}
+ \normalprotected\def\writestatus#1#2{\message{#1: #2}}
+\fi
+
+\def\syst_basics_allocate_yes#1#2#3#4#5% last class method max name
+ {\ifnum#1<#4\relax
+ \global\advance#1\plusone
+ \global#3#5=#1\relax
+ \else
+ \writestatus{warning}{no room for \string#2\space \string#5\space (max: \number#4)}%
+ \fi}
+
+\def\syst_basics_allocate_nop#1#2#3#4#5% last class method max name
+ {\writestatus{warning}{\string#2 \string#5 is already defined (\string\relax\space it first)}}
+
+\def\syst_basics_allocate#1#2#3#4#5% last class method max name
+ {\ifx#5\undefined
+ \expandafter\syst_basics_allocate_yes
+ \else\ifx#5\relax
+ \expandafter\expandafter\expandafter\syst_basics_allocate_yes
+ \else
+ \expandafter\expandafter\expandafter\syst_basics_allocate_nop
+ \fi\fi
+ #1#2#3#4#5}
+
+%D Since the number of chars exceed 256 now, we can use \type {\chardef} instead of
+%D the more limited \type {\mathchardef}.
+
+\normalprotected\def\newbox {\syst_basics_allocate\c_syst_last_allocated_box \box \chardef\c_syst_max_allocated_register}
+\normalprotected\def\newmarks{\syst_basics_allocate\c_syst_last_allocated_marks\marks\chardef\c_syst_max_allocated_register}
+
+%D Attributes are something very \LUATEX. In \CONTEXT\ you are not supposed to use
+%D the attributes directly but always allocate then first. For instance attribute~0
+%D is reserved for special purposes (this might change). Attributes in the range
+%D 128-1023 are private and should not be touched.
+
+\let\attributeunsetvalue\c_syst_min_counter_value % used to be \minusone
+
+\normalprotected\def\newattribute{\syst_basics_allocate\c_syst_last_allocated_attribute\attribute\attributedef\c_syst_max_allocated_register}
+
+%D Not used by \CONTEXT\ but for instance \PICTEX\ needs it. It's a trick to force
+%D strings instead of tokens that take more memory. It's a trick to trick to force
+%D strings. This macro is never used in \CONTEXT.
+
+%normalprotected\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
+\normalprotected\def\newhelp#1#2{\newtoks#1#1\expandafter{\detokenize{#2}}}
+
+%D \macros
+%D {scratchcounter,
+%D scratchdimen,scratchskip,scratchmuskip,
+%D scratchbox,
+%D scratchtoks}
+%D
+%D We now define a few scratch registers, so that successive loads at least have
+%D some available. The private ones are used in cases where we don't want to
+%D intrude on normal scratch ones.
+
+\newcount \scratchcounter \newcount \globalscratchcounter \newcount \privatescratchcounter
+\newdimen \scratchdimen \newdimen \globalscratchdimen \newdimen \privatescratchdimen
+\newskip \scratchskip \newskip \globalscratchskip \newskip \privatescratchskip
+\newmuskip\scratchmuskip \newmuskip\globalscratchmuskip \newmuskip\privatescratchmuskip
+\newtoks \scratchtoks \newtoks \globalscratchtoks \newtoks \privatescratchtoks
+\newbox \scratchbox \newbox \globalscratchbox \newbox \privatescratchbox
+
+\newcount\scratchcounterone \newcount\scratchcountertwo \newcount\scratchcounterthree
+\newdimen \scratchdimenone \newdimen \scratchdimentwo \newdimen \scratchdimenthree
+\newskip \scratchskipone \newskip \scratchskiptwo \newskip \scratchskipthree
+\newmuskip\scratchmuskipone \newmuskip\scratchmuskiptwo \newmuskip\scratchmuskipthree
+\newtoks \scratchtoksone \newtoks \scratchtokstwo \newtoks \scratchtoksthree
+\newbox \scratchboxone \newbox \scratchboxtwo \newbox \scratchboxthree
+
+\newcount\scratchcounterfour \newcount\scratchcounterfive \newcount\scratchcountersix
+\newdimen \scratchdimenfour \newdimen \scratchdimenfive \newdimen \scratchdimensix
+\newskip \scratchskipfour \newskip \scratchskipfive \newskip \scratchskipsix
+\newmuskip\scratchmuskipfour \newmuskip\scratchmuskipfive \newmuskip\scratchmuskipsix
+\newtoks \scratchtoksfour \newtoks \scratchtoksfive \newtoks \scratchtokssix
+\newbox \scratchboxfour \newbox \scratchboxfive \newbox \scratchboxsix
+
+\newcount\globalscratchcounterone
+\newcount\globalscratchcountertwo
+\newcount\globalscratchcounterthree
+
+%D \macros
+%D {tempstring}
+
+\let\tempstring\empty
+
+%D \macros
+%D {scratchwidth, scratchheight, scratchdepth, scratchoffset, scratchdistance}
+%D
+%D A few more scratch dimensions:
+
+\newdimen\scratchwidth
+\newdimen\scratchheight
+\newdimen\scratchdepth
+\newdimen\scratchtotal
+
+\newdimen\scratchoffset
+\newdimen\scratchleftoffset
+\newdimen\scratchrightoffset
+\newdimen\scratchtopoffset
+\newdimen\scratchbottomoffset
+
+\newdimen\scratchdistance
+
+\newdimen\scratchhsize
+\newdimen\scratchvsize
+
+\newdimen\scratchxoffset
+\newdimen\scratchyoffset
+\newdimen\scratchhoffset
+\newdimen\scratchvoffset
+
+\newdimen\scratchxposition
+\newdimen\scratchyposition
+
+\newcount\scratchnx
+\newcount\scratchny
+
+\newcount\scratchmx
+\newcount\scratchmy
+
+\newcount\scratchmin
+\newcount\scratchmax
+
+\newcount\scratchunicode
+
+\newdimen\scratchleftskip
+\newdimen\scratchrightskip
+\newdimen\scratchtopskip
+\newdimen\scratchbottomskip
+
+%D More allocations:
+
+\newskip \zeroskip \zeroskip 0pt plus 0pt minus 0pt
+\newdimen \zeropoint \zeropoint 0pt
+\newdimen \onepoint \onepoint 1pt
+\newdimen \halfapoint \halfapoint 0.5pt
+\newdimen \maxdimen \maxdimen 16383.99999pt % 1073741823sp
+\newcount \maxcount \maxcount 2147483647
+\newdimen \onebasepoint \onebasepoint 1bp
+\newdimen \scaledpoint \scaledpoint 1sp
+\newdimen \thousandpoint \thousandpoint 1000pt
+\newmuskip\zeromuskip \zeromuskip 0mu
+\newmuskip\onemuskip \onemuskip 1mu
+
+\newmuskip\muquad \muquad 18mu
+
+\let\points \onepoint
+\let\halfpoint\halfapoint
+
+\newtoks \emptytoks
+
+%D And even more: (todo: countdefs 60+)
+
+%newcount\minusone \minusone -1
+\newcount\minustwo \minustwo -2
+%chardef \zerocount 0
+%chardef \plusone 1
+\chardef \plustwo 2
+\chardef \plusthree 3
+\chardef \plusfour 4
+\chardef \plusfive 5
+\chardef \plussix 6
+\chardef \plusseven 7
+\chardef \pluseight 8
+\chardef \plusnine 9
+\chardef \plusten 10
+\chardef \plussixteen 16
+\chardef \plusfifty 50
+\chardef \plushundred 100
+\chardef \plusonehundred 100
+\chardef \plustwohundred 200
+\chardef \plusfivehundred 500
+\chardef \pluscxxvii 127
+\chardef \pluscxxviii 128
+\chardef \pluscclv 255
+\chardef \pluscclvi 256
+\chardef \plusthousand 1000
+\chardef \plustenthousand 10000
+\chardef \plustwentythousand 20000
+\chardef \medcard 32768
+\chardef \maxcard 65536 % pdftex has less mathchars
+\chardef \maxcardminusone 65535
+
+%D \macros
+%D {doubleexpandafter,tripleexpandafter,expanded,startexpanded}
+%D
+%D A few handy shortcuts
+
+\let\singleexpandafter \expandafter
+\def\doubleexpandafter{\expandafter\expandafter\expandafter}
+\def\tripleexpandafter{\expandafter\doubleexpandafter\expandafter}
+
+%D We prefer the more readable variant than in plain \TEX. User should only
+%D use \type {\emptybox}:
+
+\newbox\voidbox % public
+
+\let\normalhbox\hbox
+\let\normalvbox\vbox
+
+\def\unvoidbox{\unhbox\voidbox}
+\def\emptybox {\box \voidbox} % used in initializations so no attributes
+\def\emptyvbox{\normalvpack{}} % no copy as we need to set attributes
+\def\emptyhbox{\normalhpack{}} % no copy as we need to set attributes
+
+\let\leavevmode\unvoidbox % we prefer to use \dontleavehmode
+
+%D \macros
+%D {dontcomplain}
+%D
+%D We need this one soon:
+
+\normalprotected\def\dontcomplain
+ {\hbadness\plustenthousand
+ \vbadness\plustenthousand
+ \hfuzz \maxdimen
+ \vfuzz \maxdimen}
+
+%D Some expected plain variants follow. We don't reuse registers because we
+%D don't want clashes.
+
+\let \p@ \onepoint
+\let \m@ne \minusone
+\let \z@ \zeropoint
+\let \@ne \plusone
+\let \tw@ \plustwo
+\let \thr@@ \plusthree
+\let \sixt@@n \plussixteen
+\let \@cclv \pluscclv
+\let \@cclvi \pluscclvi
+\let \voidb@x \voidbox
+\newtoks \toks@ % \scratchtoks
+
+%D We define \type {\newif} a la plain \TEX, but will redefine it later. As
+%D Knuth says:
+%D
+%D \startnarrower
+%D And here's a different sort of allocation: for example,
+%D
+%D \starttyping
+%D \newif\iffoo
+%D \stoptyping
+%D
+%D creates \type {\footrue}, \type {\foofalse} to go with \type {\iffoo}.
+%D \stopnarrower
+
+% \normalprotected\def\newif#1%
+% {\count@\escapechar
+% \escapechar\minusone
+% \expandafter\expandafter\expandafter\def\new_if #1{true}{\let#1\iftrue }%
+% \expandafter\expandafter\expandafter\def\new_if#1{false}{\let#1\iffalse}%
+% \new_if#1{false}% the condition starts out false
+% \escapechar\count@}
+%
+% \def\new_if#1#2%
+% {\csname\expandafter\if@\string#1#2\endcsname}
+%
+% \bgroup % `if' is required
+% \uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}
+% \egroup
+
+% We use \csstring so there is no need to push/pop escapechar.
+% We use different names so that we get a better error message.
+%
+% \normalprotected\def\newif#1%
+% {\let\new_if_saved\newif
+% \let\newif\new_if_check
+% \expandafter\expandafter\expandafter\def\new_if_cs #1{true}{\let#1\iftrue }%
+% \expandafter\expandafter\expandafter\def\new_if_cs#1{false}{\let#1\iffalse}%
+% \new_if_cs#1{false}%
+% \let\newif\new_if_saved}
+%
+% \normalprotected\def\new_if_cs#1#2%
+% {\csname\expandafter\newif\csstring#1#2\endcsname}
+%
+% We wrap all into one macro:
+
+\normalprotected\def\newif#1%
+ {\let\new_if_saved\newif
+ \let\newif\new_if_check
+ \expandafter\def\csname\expandafter\newif\csstring#1true\endcsname {\let#1\iftrue }%
+ \expandafter\def\csname\expandafter\newif\csstring#1false\endcsname{\let#1\iffalse}%
+ \csname\expandafter\newif\csstring#1false\endcsname
+ \let\newif\new_if_saved}
+
+\bgroup
+ \normalexpanded{\gdef\noexpand\new_if_check\string i\string f{}}
+\egroup
+
+%D Let's test this one:
+
+\newif\ifdone
+\newif\iffound
+
+\let\htdp\boxtotal
+
+%D A few shortcuts:
+
+\normalprotected\def\udef {\normalprotected\def }
+\normalprotected\def\ugdef{\normalprotected\gdef}
+\normalprotected\def\uedef{\normalprotected\edef}
+\normalprotected\def\uxdef{\normalprotected\xdef}
+
+%D For a while we keep the following, as systems like tikz need it. Best
+%D not use that one \CONTEXT.
+
+\let\active\activecatcode
+
+%D Constants to be used with \type {\currentgrouptype}.
+
+\chardef\bottomlevelgroupcode = 0
+\chardef\simplegroupcode = 1
+\chardef\hboxgroupcode = 2
+\chardef\adjustedhboxgroupcode = 3
+\chardef\vboxgroupcode = 4
+\chardef\vtopgroupcode = 5
+\chardef\aligngroupcode = 6
+\chardef\noaligngroupcode = 7
+\chardef\outputgroupcode = 8
+\chardef\mathgroupcode = 9
+\chardef\discretionarygroupcode = 10
+\chardef\insertgroupcode = 11
+\chardef\vcentergroupcode = 12
+\chardef\mathchoicegroupcode = 13
+\chardef\semisimplegroupcode = 14
+\chardef\mathshiftgroupcode = 15
+\chardef\mathleftgroupcode = 16
+\chardef\vadjustgroupcode = \insertgroupcode
+
+%D Constants to be used with \type {\interactionmode}.
+
+\chardef\batchmodecode \zerocount
+\chardef\nonstopmodecode \plusone
+\chardef\scrollmodecode \plustwo
+\chardef\errorstopmodecode \plusthree
+
+%D Constants to be used with \type {\lastnodetype}. The \type {\lastnodetype}
+%D primitive is \ETEX\ compliant. The valid range is still -1 .. 15 and glyph nodes
+%D have number 0 (used to be char node) and ligature nodes are mapped to 7. That way
+%D macro packages can use the same symbolic names as in traditional \ETEX. Keep in
+%D mind that the internal node numbers are different and that there are more node
+%D types that 15. The mode parameter forces \LUAMETATEX\ to use the real node
+%D numbers.
+
+\internalcodesmode\plusone
+
+%D Constants to be used with \type {\currentiftype}. I wonder if we will ever
+%D use these in \CONTEXT. We have a few more anyway and in \LUAMETATEX\ we
+%D have different numbers. So for now let's just not define them. The
+%D previously mentioned mode parameters enables the real numbers (we have
+%D some more and they are therefore ordered differently).
+
+% \chardef\charifcode = 1
+% \chardef\catifcode = 2
+% \chardef\numifcode = 3
+% \chardef\dimifcode = 4
+% \chardef\oddifcode = 5
+% \chardef\vmodeifcode = 6
+% \chardef\hmodeifcode = 7
+% \chardef\mmodeifcode = 8
+% \chardef\innerifcode = 9
+% \chardef\voidifcode = 10
+% \chardef\hboxifcode = 11
+% \chardef\vboxifcode = 12
+% \chardef\xifcode = 13
+% \chardef\eofifcode = 14
+% \chardef\trueifcode = 15
+% \chardef\falseifcode = 16
+% \chardef\caseifcode = 17
+% \chardef\definedifcode = 18
+% \chardef\csnameifcode = 19
+% \chardef\fontcharifcode = 20
+%
+% % there are some more in luametatex
+
+%D Of course we want even bigger log files, so we copied this from the \ETEX\
+%D source files.
+%D
+%D When watching such logs, beware of nasty side effects of \type {\scantokens},
+%D as in:
+%D
+%D \starttyping
+%D \bgroup
+%D \lccode`a=12\lowercase{\xdef\whatever{a}}\egroup
+%D \def\whatever{test \whatever test}
+%D \scantokens\expandafter{\whatever}
+%D \egroup
+%D \stoptyping
+%D
+%D In \LUATEX\ we have ways around this.
+
+% no longer \errorstopmode cf. plain tex 3.141592653
+
+\normalprotected\def\tracingall
+ {\tracingonline \plusone
+ \tracingcommands \plusthree
+ \tracingstats \plustwo
+ \tracingpages \plusone
+ \tracingoutput \plusone
+ \tracinglostchars \plustwo
+ \tracingmacros \plustwo
+ \tracingparagraphs\plusone
+ \tracingrestores \plusone
+ \showboxbreadth \maxdimen
+ \showboxdepth \maxdimen
+ \tracinggroups \plusone
+ \tracingifs \plusone
+ \tracingscantokens\plusone
+ \tracingnesting \plustwo
+ \tracingassigns \plustwo}
+
+\normalprotected\def\loggingall
+ {\tracingall
+ \tracingonline \zerocount}
+
+\normalprotected\def\tracingnone
+ {\tracingassigns \zerocount
+ \tracingnesting \zerocount
+ \tracingscantokens\zerocount
+ \tracingifs \zerocount
+ \tracinggroups \zerocount
+ \showboxdepth \plusthree
+ \showboxbreadth \plusfive
+ \tracingrestores \zerocount
+ \tracingparagraphs\zerocount
+ \tracingmacros \zerocount
+ \tracinglostchars \plusone
+ \tracingoutput \zerocount
+ \tracingpages \zerocount
+ \tracingstats \zerocount
+ \tracingcommands \zerocount
+ \tracingonline \zerocount}
+
+%D When we want to see a box we can as well show all of it.
+
+\showboxdepth \maxdimen
+\showboxbreadth\maxdimen
+
+%D Just for tracing purposes we set:
+
+\tracingstats\plusone
+
+%D Here we also save \type {\input}, more will be saved later.
+
+\ifdefined\normalinput \else \let\normalinput\input \fi
+
+%D We don't like outer commands, and we always want access to the original
+%D \type {\input} primitive.
+
+\let\normalouter\outer \def\outer{} % no longer \relax
+
+%D To circumvent dependencies, we can postpone certain initializations to
+%D dumping time, by appending them to the \type {\everydump} token register.
+
+\ifdefined\normaldump \else \let\normaldump\dump \fi
+
+\newtoks\everydump
+
+\def\dump{\the\everydump\normaldump}
+
+%D The same applies for the startup actions.
+
+\ifdefined\normaleveryjob \else \let\normaleveryjob\everyjob \fi
+
+\let\everyjob\relax \newtoks\everyjob
+
+\normaleveryjob{\the\everyjob}
+
+%D \macros
+%D {newconditional,
+%D settrue, setfalse,
+%D ifconditional,then}
+%D
+%D \TEX's lacks boolean variables, although the \PLAIN\ format implements \type
+%D {\newif}. The main disadvantage of this scheme is that it takes three hash table
+%D entries. A more memory saving alternative is presented here. A conditional is
+%D defined by:
+%D
+%D \starttyping
+%D \newconditional\doublesided
+%D \setfalse
+%D \stoptyping
+%D Setting a conditional is done by \type{\settrue} and
+%D \type{\setfalse}:
+%D
+%D \starttyping
+%D \settrue\doublesided
+%D \setfalse
+%D \stoptyping
+%D while testing is accomplished by:
+%D
+%D \starttyping
+%D \ifconditional\doublesided ... \else ... \fi
+%D \setfalse
+%D \stoptyping
+%D We cannot use the simple scheme:
+%D
+%D \starttyping
+%D \def\settrue #1{\let#1=\iftrue}
+%D \def\setfalse#1{\let#1=\iffalse}
+%D \stoptyping
+%D
+%D Such an implementation gives problems with nested conditionals. The next
+%D implementation is about as fast and just as straightforward:
+
+\let\conditionalfalse\plusone % maybe we will have a dedicated count/chardef
+\let\conditionaltrue \zerocount % maybe we will have a dedicated count/chardef
+
+\normalprotected\def\settrue #1{\let#1\conditionaltrue }
+\normalprotected\def\setfalse#1{\let#1\conditionalfalse}
+
+\normalprotected\def\settruevalue #1{\expandafter\let\csname#1\endcsname\conditionaltrue }
+\normalprotected\def\setfalsevalue#1{\expandafter\let\csname#1\endcsname\conditionalfalse}
+
+\let\newconditional\setfalse
+\let\ifconditional \ifcase
+
+\let\then\relax % so that we can say: \ifnum1>2\then -)
+
+\def\truecondition {\iftrue}
+\def\falsecondition{\iffalse}
+
+% This one has to be unprotected otherwise we get a files-ends-to-soon but it's ok
+% as conditions expand anyway.
+
+\def\quitcondition{\orelse\iffalse}
+
+%D \macros
+%D {newmacro,setnewmacro,newfraction}
+%D
+%D Let's be complete and also introduce some definers. These are not mandate
+%D but handy for grepping.
+
+\normalprotected\def\newmacro #1{\let#1\empty}
+\normalprotected\def\setnewmacro#1{\let#1}
+
+\def\!!zerocount{0}
+\def\!!plusone {1}
+
+\normalprotected\def\newfraction#1{\let#1\!!plusone}
+
+%D It would be handy to have a primitive \type {\unless\ifcase} because then we
+%D could use nicer values. Anyhow, this conditional code used to be in the \type
+%D {syst-aux} module but is now promoted to here.
+
+%D \macros
+%D {ifzeropt}
+%D
+%D The next macro is both cosmetic and byte saving. It is pretty \type
+%D {\if}||safe too. It can be used in cases like:
+%D
+%D \starttyping
+%D \ifzeropt \somedimen ... \else ... \fi
+%D \stoptyping
+
+\let\ifzeropt\ifcase
+
+% these token list helpers might move to syst-aux.mkiv
+%
+% we assume a \cs. not toks0 or so
+%
+% \normalprotected\def\appendtotoks #1#{\def\temp{#1}\afterassignment\doappendtotoks \scratchtoks=}
+% \normalprotected\def\prependtotoks#1#{\def\temp{#1}\afterassignment\doprependtotoks\scratchtoks=}
+
+\newtoks\t_syst_toks_temp \let\m_syst_toks_temp\t_syst_toks_temp
+
+\normalprotected\def\appendtotoks #1{\let\m_syst_toks_temp#1\afterassignment\syst_toks_append_l \t_syst_toks_temp=}
+\normalprotected\def\prependtotoks#1{\let\m_syst_toks_temp#1\afterassignment\syst_toks_prepend_l\t_syst_toks_temp=}
+
+% \def\syst_toks_append {\m_syst_toks_temp\expandafter\expandafter\expandafter{\expandafter\the\expandafter\m_syst_toks_temp\the\t_syst_toks_temp}}}
+% \def\syst_toks_prepend{\m_syst_toks_temp\expandafter\expandafter\expandafter{\expandafter\the\expandafter\t_syst_toks_temp\the\m_syst_toks_temp}}}
+
+\normalprotected\def\globalappendtotoks #1{\let\m_syst_toks_temp#1\afterassignment\syst_toks_append_g \t_syst_toks_temp=}
+\normalprotected\def\globalprependtotoks#1{\let\m_syst_toks_temp#1\afterassignment\syst_toks_prepend_g\t_syst_toks_temp=}
+
+\def\syst_toks_append_l {\normalexpanded{\m_syst_toks_temp{\the\m_syst_toks_temp\the\t_syst_toks_temp}}}
+\def\syst_toks_prepend_l{\normalexpanded{\m_syst_toks_temp{\the\t_syst_toks_temp\the\m_syst_toks_temp}}}
+
+\def\syst_toks_append_g {\global\syst_toks_append_l }
+\def\syst_toks_prepend_g{\global\syst_toks_prepend_l}
+
+\normalprotected\def\addtotoks #1{\let\m_syst_toks_temp#1\afterassignment\syst_toks_add_l\let\next}
+\normalprotected\def\globaladdtotoks#1{\let\m_syst_toks_temp#1\afterassignment\syst_toks_add_g\let\next}
+
+\def\syst_toks_add_l{\m_syst_toks_temp\expandafter\bgroup\the\m_syst_toks_temp}
+\def\syst_toks_add_g{\global\syst_toks_add_l}
+
+\normalprotected\def\addtotokscs #1#2{#1{\the#1#2}} % saves a few bytes
+\normalprotected\def\globaladdtotokscs#1#2{\global#1{\the#1#2}} % saves a few bytes
+
+%D \macros
+%D {begcsname}
+%D
+%D Handy for \ETEX-only usage (avoids making \type {\relax}'s:
+
+% \def\begcsname#1\endcsname{\ifcsname#1\endcsname\csname#1\endcsname\fi}
+
+\let\begcsname\begincsname
+
+%D Now come a few macros that might be needed in successive loading. We redefine the
+%D \type {\par} primitive pretty soon so that we get the equivalents right.
+
+% too tricky: \par is use more often than a par starts so we have too much change
+% that we get assymetrical behaviour
+%
+% \newtoks\everyendpar
+%
+% \normalprotected\def\endpar{\the\everyendpar\normalpar}
+% \normalprotected\def\par {\endpar}
+%
+% \normalprotected\def\reseteverypar
+% {\everypar \emptytoks
+% \everyendpar\emptytoks}
+
+\normalprotected\def\reseteverypar
+ {\everypar\emptytoks}
+
+\let\endgraf\par
+\let\endline\cr
+
+\normalprotected\def\null{\hpack{}}
+
+%D The following two might be overloaded later on but some modules need then
+%D earlier. These functionality is reflected in the name and will not change.
+
+% \bgroup
+% \catcode`\^^M=\activecatcode%
+% \gdef\obeylines{\catcode`\^^M\activecatcode \let^^M\par}%
+% \glet^^M\par%
+% \egroup
+%
+% \bgroup
+% \gdef\obeyspaces{\catcode`\ \activecatcode}%
+% \obeyspaces\glet =\space%
+% \egroup
+
+\def\obeylines {\catcode\endoflineasciicode\activecatcode\letcharcode\endoflineasciicode\par}
+\def\obeyspaces{\catcode\spaceasciicode \activecatcode\letcharcode\spaceasciicode \space}
+
+% %D A constant:
+%
+% \let\endoflinetoken=^^M
+
+%D Also needed might be a simple loop structure and we borrow plain \TEX's one
+%D as it is often expected to be present and it is about the fastest you can
+%D get. Beware: this macro does not support nested loops. We use a namespace
+%D prefix \type {@@pln}.
+
+\def\loop#1\repeat{\def\@@plnbody{#1}\@@plniterate} % might go
+
+%D The following makes \type {\loop} \unknown\ \type {\if} \unknown\ \type
+%D {\repeat} skippable (clever trick):
+
+\let\repeat\fi % so both \loop and \repeat are reserved words!
+
+%D The original (no \type {@@pln} there):
+%D
+%D \starttyping
+%D \def\@@plniterate{\@@plnbody\let\next\@@plniterate\else\let\next\relax\fi\next}
+%D \stoptyping
+%D
+%D A more efficient alternative:
+%D
+%D \starttyping
+%D \def\@@plniterate{\@@plnbody\expandafter\@@plniterate\else\expandafter\relax\fi}
+%D \stoptyping
+%D
+%D An even more efficient one:
+
+\def\@@plniterate{\@@plnbody\expandafter\@@plniterate\else\fi}
+
+%D We don't define a real output routine yet but at least get rid of pages:
+
+\output{\shipout\box\normalpagebox}
+
+%D Although we don't add pagenumbers yet we alias the default register used
+%D for counting pages:
+
+\countdef\pageno\zerocount \pageno\plusone % first page is number 1
+
+%D Beside the raw counter \type {\pageno} the \type {\folio} macro provides
+%D the value.
+
+\def\folio{\the\pageno} % kind of expected and therefore reserved
+
+%D The following registers are kind of standard and (for the moment) we define
+%D them here. This might change.
+
+\newskip \bigskipamount \bigskipamount = 12pt plus 4pt minus 4pt
+\newskip \medskipamount \medskipamount = 6pt plus 2pt minus 2pt
+\newskip \smallskipamount \smallskipamount = 3pt plus 1pt minus 1pt
+
+\baselineskip = 12pt
+\lineskip = 1pt
+\lineskiplimit = 0pt
+
+%D Sometimes kerns make more sense than glue but we need to be in the
+%D right mode:
+
+\normalprotected\def\vkern{\ifhmode\par \fi\kern}
+\normalprotected\def\hkern{\ifvmode\dontleavehmode\fi\kern}
+
+%D Again a few kind-of-extensions the core. These come from plain \TEX\ but
+%D are probably not used in \CONTEXT.
+
+\newskip \hideskip \hideskip = -1000pt plus 1fill
+\newskip \centering \centering = 0pt plus 1000pt minus 1000pt
+
+\def\hidewidth % for alignment entries that can stick out
+ {\hskip\hideskip}
+
+\def\ialign % initialized \halign
+ {\everycr\emptytoks
+ \tabskip\zeroskip
+ \halign}
+
+\newcount \mscount
+
+\def\spanomit{\span\omit} % bypass error message
+
+\def\multispan#1%
+ {\omit
+ \mscount#1\relax
+ \loop
+ \ifnum\mscount>\plusone
+ \spanomit \advance\mscount\minusone
+ \repeat}
+
+\let\nopdfcompression \relax
+\let\onlypdfobjectcompression\relax
+\let\maximumpdfcompression \relax
+\let\normalpdfcompression \relax
+
+%D Basic status stuff.
+
+\newif\ifproductionrun
+
+%D For those who expect this \unknown
+
+\ifx\fmtname \undefined \def\fmtname {ConTeXt Initial TeX} \fi
+\ifx\fmtversion\undefined \def\fmtversion{3.1415926} \fi
+
+%D A few bonus macros:
+
+\def\modulonumber#1#2{\the\numexpr#2-((((#2+(#1/2))/#1)-1)*#1)\relax}
+\def\dividenumber#1#2{\the\numexpr(#2-(#1/2))/#1\relax}
+
+%D These could be set at the \LUA\ end instead:
+
+\edef\texenginename {\directlua{tex.print(LUATEXENGINE)}}
+\edef\texengineversion {\directlua{tex.print(LUATEXVERSION)}}
+\edef\texenginefunctionality{\directlua{tex.print(LUATEXFUNCTIONALITY)}}
+
+%D We have no reason not to enable this:
+
+\savingvdiscards\plusone
+
+%D We only can set this one via directives (system.synctex) and we only support
+%D the context variant. This will go away completely.
+
+\newcount\synctex \let\normalsynctex\synctex
+
+%D We get rid of the funny \TEX\ offset defaults of one inch by setting them to zero.
+
+\voffset\zeropoint \let\voffset\relax \newdimen\voffset \let\normalvoffset\voffset
+\hoffset\zeropoint \let\hoffset\relax \newdimen\hoffset \let\normalhoffset\hoffset
+
+\matheqnogapstep\zerocount % for now
+
+%D Now we define a few helpers that we need in a very early stage. We have no
+%D message system yet but redundant definitions are fatal anyway.
+
+\newcount\c_syst_helpers_n_of_namespaces \c_syst_helpers_n_of_namespaces\pluseight % 1-8 reserved for catcodes
+
+\def\v_interfaces_prefix_template_system{\number \c_syst_helpers_n_of_namespaces>>}
+%def\v_interfaces_prefix_template_system{\characters\c_syst_helpers_n_of_namespaces>>} % no \characters yet
+
+\normalprotected\def\installsystemnamespace#1%
+ {\ifcsname ??#1\endcsname
+ \immediate\write\statuswrite{fatal error: duplicate system namespace '#1'}%
+ \expandafter\normalend
+ \else
+ \global\advance\c_syst_helpers_n_of_namespaces\plusone
+ \expandafter\edef\csname ??#1\endcsname{\v_interfaces_prefix_template_system}%
+ \fi}
+
+%D It makes more sense to have these here:
+
+\let\normalsuperscript \Usuperscript
+\let\normalsubscript \Usubscript
+\let\normalnosuperscript\Unosuperscript
+\let\normalnosubscript \Unosubscript
+\let\normalstartimath \Ustartmath
+\let\normalstopimath \Ustopmath
+\let\normalstartdmath \Ustartdisplaymath
+\let\normalstopdmath \Ustopdisplaymath
+
+%D Also better here:
+
+\def\wildcardsymbol{*}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/syst-lua.lua b/Master/texmf-dist/tex/context/base/mkiv/syst-lua.lua
index a63c49e8faf..5911d7f0059 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/syst-lua.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/syst-lua.lua
@@ -156,3 +156,245 @@ implement {
end
end
}
+
+-- This is a bit of a joke as I never really needed floating point expressions (okay,
+-- maybe only with scaling because there one can get numbers that are too large for
+-- dimensions to deal with). Of course one can write a parser in \TEX\ speak but then
+-- one also needs to implement a bunch of functions. It doesn't pay of so we just
+-- stick to the next gimmick. It looks inefficient but performance is actually quite
+-- efficient.
+
+local concat = table.concat
+local utfchar = utf.char
+local load, type, tonumber = load, type, tonumber
+
+local xmath = xmath or math
+local xcomplex = xcomplex or { }
+
+local cmd = tokens.commands
+
+local get_next = token.get_next
+local get_command = token.get_command
+local get_mode = token.get_mode
+local get_index = token.get_index
+local get_csname = token.get_csname
+local get_macro = token.get_macro
+
+local put_next = token.put_next
+
+local scan_token = token.scan_token
+
+local getdimen = tex.getdimen
+local getglue = tex.getglue
+local getcount = tex.getcount
+local gettoks = tex.gettoks
+local gettex = tex.get
+
+local context = context
+local dimenfactors = number.dimenfactors
+
+local result = { "return " }
+local word = { }
+local r = 1
+local w = 0
+
+local report = logs.reporter("system","expression")
+
+local function unexpected(c)
+ report("unexpected token %a",c)
+end
+
+local function expression()
+ local w = 0
+ local r = 1
+ while true do
+ local t = get_next()
+ local n = get_command(t)
+ local c = cmd[n]
+ -- todo, helper: returns number
+ if c == "letter" then
+ w = w + 1 ; word[w] = utfchar(get_mode(t))
+ else
+ if w > 0 then
+ local s = concat(word,"",1,w)
+ local d = dimenfactors[s]
+ if d then
+ r = r + 1 ; result[r] = "*"
+ r = r + 1 ; result[r] = 1/d
+ else
+ if xmath[s] then
+ r = r + 1 ; result[r] = "xmath."
+ elseif xcomplex[s] then
+ r = r + 1 ; result[r] = "xcomplex."
+ end
+ r = r + 1 ; result[r] = s
+ end
+ w = 0
+ end
+ if c == "other_char" then
+ r = r + 1 ; result[r] = utfchar(get_mode(t))
+ elseif c == "spacer" then
+ -- r = r + 1 ; result[r] = " "
+ elseif c == "relax" then
+ break
+ elseif c == "assign_int" then
+ r = r + 1 ; result[r] = getcount(get_index(t))
+ elseif c == "assign_dimen" then
+ r = r + 1 ; result[r] = getdimen(get_index(t))
+ elseif c == "assign_glue" then
+ r = r + 1 ; result[r] = getglue(get_index(t))
+ elseif c == "assign_toks" then
+ r = r + 1 ; result[r] = gettoks(get_index(t))
+ elseif c == "char_given" or c == "math_given" or c == "xmath_given" then
+ r = r + 1 ; result[r] = get_mode(t)
+ elseif c == "last_item" then
+ local n = get_csname(t)
+ if n then
+ local s = gettex(n)
+ if s then
+ r = r + 1 ; result[r] = s
+ else
+ unexpected(c)
+ end
+ else
+ unexpected(c)
+ end
+ elseif c == "call" then
+ local n = get_csname(t)
+ if n then
+ local s = get_macro(n)
+ if s then
+ r = r + 1 ; result[r] = s
+ else
+ unexpected(c)
+ end
+ else
+ unexpected(c)
+ end
+ elseif c == "the" or c == "convert" or c == "lua_expandable_call" then
+ put_next(t)
+ scan_token() -- expands
+ else
+ unexpected(c)
+ end
+ end
+ end
+ local code = concat(result,"",1,r)
+ local func = load(code)
+ if type(func) == "function" then
+ context(func())
+ else
+ report("invalid lua %a",code)
+ end
+end
+
+-- local letter_code <const> = cmd.letter
+-- local other_char_code <const> = cmd.other_char
+-- local spacer_code <const> = cmd.spacer
+-- local other_char_code <const> = cmd.other_char
+-- local relax_code <const> = cmd.relax
+-- local assign_int_code <const> = cmd.assign_int
+-- local assign_dimen_code <const> = cmd.assign_dimen
+-- local assign_glue_code <const> = cmd.assign_glue
+-- local assign_toks_code <const> = cmd.assign_toks
+-- local char_given_code <const> = cmd.char_given
+-- local math_given_code <const> = cmd.math_given
+-- local xmath_given_code <const> = cmd.xmath_given
+-- local last_item_code <const> = cmd.last_item
+-- local call_code <const> = cmd.call
+-- local the_code <const> = cmd.the
+-- local convert_code <const> = cmd.convert
+-- local lua_expandable_call_code <const> = cmd.lua_expandable_call
+--
+-- local function unexpected(c)
+-- report("unexpected token %a",c)
+-- end
+--
+-- local function expression()
+-- local w = 0
+-- local r = 1
+-- while true do
+-- local t = get_next()
+-- local n = get_command(t)
+-- if n == letter_code then
+-- w = w + 1 ; word[w] = utfchar(get_mode(t))
+-- else
+-- if w > 0 then
+-- -- we could use a metatable for all math, complex and factors
+-- local s = concat(word,"",1,w)
+-- local d = dimenfactors[s]
+-- if d then
+-- r = r + 1 ; result[r] = "*"
+-- r = r + 1 ; result[r] = 1/d
+-- else
+-- if xmath[s] then
+-- r = r + 1 ; result[r] = "xmath."
+-- elseif xcomplex[s] then
+-- r = r + 1 ; result[r] = "xcomplex."
+-- end
+-- r = r + 1 ; result[r] = s
+-- end
+-- w = 0
+-- end
+-- if n == other_char_code then
+-- r = r + 1 ; result[r] = utfchar(get_mode(t))
+-- elseif n == spacer_code then
+-- -- r = r + 1 ; result[r] = " "
+-- elseif n == relax_code then
+-- break
+-- elseif n == assign_int_code then
+-- r = r + 1 ; result[r] = getcount(get_index(t))
+-- elseif n == assign_dimen_code then
+-- r = r + 1 ; result[r] = getdimen(get_index(t))
+-- elseif n == assign_glue_code then
+-- r = r + 1 ; result[r] = getglue(get_index(t))
+-- elseif n == assign_toks_code then
+-- r = r + 1 ; result[r] = gettoks(get_index(t))
+-- elseif n == char_given_code or n == math_given_code or n == xmath_given_code then
+-- r = r + 1 ; result[r] = get_mode(t)
+-- elseif n == last_item_code then
+-- local n = get_csname(t)
+-- if n then
+-- local s = gettex(n)
+-- if s then
+-- r = r + 1 ; result[r] = s
+-- else
+-- unexpected(c)
+-- end
+-- else
+-- unexpected(c)
+-- end
+-- elseif n == call_code then
+-- local n = get_csname(t)
+-- if n then
+-- local s = get_macro(n)
+-- if s then
+-- r = r + 1 ; result[r] = s
+-- else
+-- unexpected(c)
+-- end
+-- else
+-- unexpected(c)
+-- end
+-- elseif n == the_code or n == convert_code or n == lua_expandable_call_code then
+-- put_next(t)
+-- scan_token() -- expands
+-- else
+-- unexpected(c)
+-- end
+-- end
+-- end
+-- local code = concat(result,"",1,r)
+-- local func = load(code)
+-- if type(func) == "function" then
+-- context(func())
+-- else
+-- report("invalid lua %a",code)
+-- end
+-- end
+
+implement {
+ public = true,
+ name = "expression",
+ actions = expression,
+}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/syst-lua.mkiv b/Master/texmf-dist/tex/context/base/mkiv/syst-lua.mkiv
index 3600dac3460..d275acd7dd1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/syst-lua.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/syst-lua.mkiv
@@ -24,36 +24,32 @@
%D {\expanded} primitive were mentioned in talks.} trip. For now I don't really see
%D other useful applications.
-\ifdefined\immediateassignment
-
- \def\expandeddoif#1#2%
- {\immediateassignment\edef\m_syst_string_one{#1}%
- \immediateassignment\edef\m_syst_string_two{#2}%
- \ifx\m_syst_string_one\m_syst_string_two
- \expandafter\firstofoneargument
- \else
- \expandafter\gobbleoneargument
- \fi}
-
- \def\expandeddoifnot#1#2%
- {\immediateassignment\edef\m_syst_string_one{#1}%
- \immediateassignment\edef\m_syst_string_two{#2}%
- \ifx\m_syst_string_one\m_syst_string_two
- \expandafter\gobbleoneargument
- \else
- \expandafter\firstofoneargument
- \fi}
-
- \def\expandeddoifelse#1#2%
- {\immediateassignment\edef\m_syst_string_one{#1}%
- \immediateassignment\edef\m_syst_string_two{#2}%
- \ifx\m_syst_string_one\m_syst_string_two
- \expandafter\firstoftwoarguments
- \else
- \expandafter\secondoftwoarguments
- \fi}
-
-\fi
+\def\expandeddoifelse#1#2%
+ {\immediateassignment\edef\m_syst_string_one{#1}%
+ \immediateassignment\edef\m_syst_string_two{#2}%
+ \ifx\m_syst_string_one\m_syst_string_two
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\expandeddoif#1#2%
+ {\immediateassignment\edef\m_syst_string_one{#1}%
+ \immediateassignment\edef\m_syst_string_two{#2}%
+ \ifx\m_syst_string_one\m_syst_string_two
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\expandeddoifnot#1#2%
+ {\immediateassignment\edef\m_syst_string_one{#1}%
+ \immediateassignment\edef\m_syst_string_two{#2}%
+ \ifx\m_syst_string_one\m_syst_string_two
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
% \testfeatureonce{100000}{\doifelse{hello world}{here i am}{}} % 0.3
% \testfeatureonce{100000}{\expandabledoifelse{hello world}{here i am}{}} % 1.5
@@ -64,36 +60,64 @@
\def\expdoifcommonelse\expdoifelsecommon
\def\expdoifinsetelse \expdoifelseinset
-% we define these here, just in case ...
+%D We define these here, just in case. This permits \typefile {self} otherwise
+%D nested b|/|e sep problems.
-\def\luastringsep{===} % this permits \typefile{self} otherwise nested b/e sep problems
+\def\luastringsep{===}
\edef\!!bs{[\luastringsep[}
\edef\!!es{]\luastringsep]}
\unexpanded\def\writestatus#1#2{\clf_writestatus{#1}{#2}}
-% A handy helper:
-
-% \def\luaexpr#1{\ctxlua{context(tostring(#1))}} % more efficient:
-
-% We can omit the tex.ctxcatcodes here as nowadays we seldom
-% change the regime at the \TEX\ end:
+%D We can omit the tex.ctxcatcodes here as nowadays we seldom change the regime at
+%D the \TEX\ end:
+%def\luaexpr#1{\ctxlua{context (tostring(#1))}} % more efficient:
\def\luaexpr#1{\ctxlua{tex.print(tostring(#1))}} % no use is shortcutting has to be compiled
-% helpers:
-
-\def\ui_fo #1{#1}
-\def\ui_go #1{}
-\def\ui_ft#1#2{#1}
-\def\ui_st#1#2{#2}
-
-
-%D But as we only use write 16 we could as well do all in \LUA\
-%D and ignore the rest. Okay, we still can do writes here but only
-%D when not blocked.
+%D But as we only use write 16 we could as well do all in \LUA\ and ignore the rest.
+%D Okay, we still can do writes here but only when not blocked.
\let\syst_write_execute\clf_execute % always {...}
+%D There is a probably rather useless \type {\expression} command that can mix \LUA\ numeric
+%D expressions with \TEX\ commands (for as far that makes sense) that works like this:
+%D
+%D \starttyping
+%D \mathchardef\foooo 1234
+%D \def \mymacro {123.45}
+%D \scratchdimen 123pt
+%D \scratchskip 123pt
+%D \scratchtoks {34}
+%D
+%D \testfeatureonce{10000}{\edef\foo{\expression
+%D round(
+%D 12.3 * \scratchdimen
+%D - (12.3 * \scratchskip) / 2
+%D + 2 ^ 3
+%D * (
+%D - sqrt(12)
+%D - 10pt
+%D - \foooo
+%D + \luatexversion
+%D - \mymacro
+%D + \scratchtoks
+%D + \the\scratchcounter
+%D + \number\scratchcounter
+%D )
+%D )
+%D \relax}}
+%D
+%D \expression string.format("\letterpercent f",\elapsedtime/50000) \relax
+%D \stoptyping
+%D
+%D The final \type {\relax} is mandate because we also accept spaces. Of course we
+%D could have avoided it by using outer parenthesis but this is cleaner anyway.
+%D
+%D The \MKIV\ version is a bit more limited than the \LMTX\ version because it only
+%D supports the standard math functions.
+
+% maybe: \let\texexpr\expression
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/syst-lua.mkxl b/Master/texmf-dist/tex/context/base/mkiv/syst-lua.mkxl
new file mode 100644
index 00000000000..cf20c3341f8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/syst-lua.mkxl
@@ -0,0 +1,100 @@
+%D \module
+%D [ file=syst-lua,
+%D version=2008.01.25,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Helper macros based on \LUA,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{syst-lua}{}
+
+\unprotect
+
+\def\expdoifelse#1#2{\clf_doifelsesame{#1}{#2}}
+\def\expdoif #1#2{\clf_doifsame {#1}{#2}}
+\def\expdoifnot #1#2{\clf_doifnotsame {#1}{#2}}
+
+%D Here is variant using a brainwave of the 12\high{+} hour \quotation {Long Road
+%D Out of Eden}\footnote {Eden being Backo\TeX\ 2018, where the virtues of the \type
+%D {\expanded} primitive were mentioned in talks.} trip. For now I don't really see
+%D other useful applications.
+
+\def\expandeddoifelse#1#2{\iftok{#1}{#2}\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
+\def\expandeddoif #1#2{\iftok{#1}{#2}\expandafter\firstofoneargument \else\expandafter\gobbleoneargument \fi}
+\def\expandeddoifnot #1#2{\iftok{#1}{#2}\expandafter\gobbleoneargument \else\expandafter\firstofoneargument \fi}
+
+% \testfeatureonce{100000}{\doifelse{hello world}{here i am}{}} % 0.3
+% \testfeatureonce{100000}{\expandabledoifelse{hello world}{here i am}{}} % 1.5
+
+\def\expdoifelsecommon#1#2{\clf_doifelsecommon{#1}{#2}}
+\def\expdoifelseinset #1#2{\clf_doifelseinset {#1}{#2}}
+
+\def\expdoifcommonelse\expdoifelsecommon
+\def\expdoifinsetelse \expdoifelseinset
+
+%D We define these here, just in case. This permits \typefile {self} otherwise
+%D nested b|/|e sep problems.
+
+\def\luastringsep{===}
+
+\edef\!!bs{[\luastringsep[}
+\edef\!!es{]\luastringsep]}
+
+\unexpanded\def\writestatus#1#2{\clf_writestatus{#1}{#2}}
+
+%D We can omit the tex.ctxcatcodes here as nowadays we seldom change the regime at
+%D the \TEX\ end:
+
+%def\luaexpr#1{\ctxlua{context (tostring(#1))}} % more efficient:
+\def\luaexpr#1{\ctxlua{tex.print(tostring(#1))}} % no use is shortcutting has to be compiled
+
+%D But as we only use write 16 we could as well do all in \LUA\ and ignore the rest.
+%D Okay, we still can do writes here but only when not blocked.
+
+\let\syst_write_execute\clf_execute % always {...}
+
+%D There is a probably rather useless \type {\expression} command that can mix \LUA\ numeric
+%D expressions with \TEX\ commands (for as far that makes sense) that works like this:
+%D
+%D \starttyping
+%D \mathchardef\foooo 1234
+%D \def \mymacro {123.45}
+%D \scratchdimen 123pt
+%D \scratchskip 123pt
+%D \scratchtoks {34}
+%D
+%D \testfeatureonce{10000}{\edef\foo{\expression
+%D round(
+%D 12.3 * \scratchdimen
+%D - (12.3 * \scratchskip) / 2
+%D + 2 ^ 3
+%D * (
+%D - sqrt(12)
+%D - 10pt
+%D - \foooo
+%D + \luatexversion
+%D - \mymacro
+%D + \scratchtoks
+%D + \the\scratchcounter
+%D + \number\scratchcounter
+%D )
+%D )
+%D \relax}}
+%D
+%D \expression string.format("\letterpercent f",\elapsedtime/50000) \relax
+%D \stoptyping
+%D
+%D The final \type {\relax} is mandate because we also accept spaces. Of course we
+%D could have avoided it by using outer parenthesis but this is cleaner anyway.
+%D
+%D The \LMTX\ version supports te \type {xmath} and \type {xcomplex} functions and
+%D therefore one can have expressions that don't work in \MKIV.
+
+% maybe: \let\texexpr\expression
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/syst-mes.mkiv b/Master/texmf-dist/tex/context/base/mkiv/syst-mes.mkiv
index 3b16d7f974d..4ed2697f15a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/syst-mes.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/syst-mes.mkiv
@@ -11,8 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\def\writestring {\immediate\write\statuswrite}
-\def\writeline {\writestring{}}
-\let\message \normalmessage
+\normalprotected\def\writestring {\immediate\write\statuswrite}
+\normalprotected\def\writeline {\writestring{}}
+ \let\message \normalmessage
\endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/tabl-frm.mkiv b/Master/texmf-dist/tex/context/base/mkiv/tabl-frm.mkiv
index c0f4b7cd16c..14f3506b9e3 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/tabl-frm.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/tabl-frm.mkiv
@@ -134,54 +134,6 @@
{\framedparameter\c!after
\endgroup}
-% \unexpanded\def\startframedrow
-% {\advance\c_tabl_framed_r\plusone
-% \c_tabl_framed_c\zerocount
-% \d_tabl_framed_h\zeropoint
-% \bgroup
-% \edef\currentframed{\number\c_tabl_framed_r}%
-% \edef\currentframed
-% {\??framedtablerow\currentframedtable
-% \ifcsname\??framedtablerow\currentframedtable:\currentframed\endcsname
-% :\currentframed
-% \else\ifcsname\??framedtablerow\currentframedtable:\v!each\endcsname
-% :\v!each
-% \fi\fi}%
-% \dosingleempty\pack_framed_start_framed_nop_indeed}
-%
-% \unexpanded\def\stopframedrow
-% {\dofastloopcs\c_tabl_framed_c\tabl_framed_flush_row
-% \stopframed
-% \nointerlineskip
-% \vskip\zeropoint\relax
-% \framedparameter\c!inbetween}
-%
-% \unexpanded\def\tabl_framed_flush_row
-% {\vpack to \d_tabl_framed_h{\flushbox\??framedtable{\number\fastloopindex}\vfill}%
-% \ifdim\d_tabl_framed_d=\zeropoint\else\kern\d_tabl_framed_d\fi}
-%
-% \unexpanded\def\startframedcell
-% {\advance\c_tabl_framed_c\plusone
-% \setbox\b_tabl_framed\hpack\bgroup
-% %\bgroup
-% \edef\currentframed{\number\c_tabl_framed_c}%
-% \edef\currentframed
-% {\??framedtablecolumn\currentframedtable
-% \ifcsname\??framedtablecolumn\currentframedtable:\currentframed\endcsname
-% :\currentframed
-% \else\ifcsname\??framedtablecolumn\currentframedtable:\v!each\endcsname
-% :\v!each
-% \fi\fi}%
-% \dosingleempty\pack_framed_start_framed_nop_indeed}
-%
-% \unexpanded\def\stopframedcell
-% {\stopframed
-% %\egroup
-% \ifdim\ht\b_tabl_framed>\d_tabl_framed_h
-% \d_tabl_framed_h\ht\b_tabl_framed
-% \fi
-% \savebox\??framedtable{\number\c_tabl_framed_c}{\box\b_tabl_framed}}
-
% a two pass variant that deals with the height .. so no catcode changes here
\unexpanded\def\startframedrow
@@ -208,7 +160,7 @@
\unexpanded\def\tabl_framed_flush_row
{\vpack to \d_tabl_framed_h{\flushbox\??framedtable{\number\fastloopindex}\vfill}%
- \ifdim\d_tabl_framed_d=\zeropoint\else\kern\d_tabl_framed_d\fi}
+ \ifzeropt\d_tabl_framed_d\else\kern\d_tabl_framed_d\fi}
\newcount\c_tabl_framed_pass
@@ -253,7 +205,7 @@
\unexpanded\def\tabl_framed_flush_row_two
{\vpack to \d_tabl_framed_h{\flushbox\??framedtable{\number\fastloopindex}\vfill}%
- \ifdim\d_tabl_framed_d=\zeropoint\else\kern\d_tabl_framed_d\fi}
+ \ifzeropt\d_tabl_framed_d\else\kern\d_tabl_framed_d\fi}
\unexpanded\def\startframedcell
diff --git a/Master/texmf-dist/tex/context/base/mkiv/tabl-ltb.mkiv b/Master/texmf-dist/tex/context/base/mkiv/tabl-ltb.mkiv
index 20ae8bf5a2b..de90d658528 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/tabl-ltb.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/tabl-ltb.mkiv
@@ -125,7 +125,8 @@
\c!width=5\emwidth,
\c!height=\v!fit, % \v!line = faster
\c!background=,
- \c!backgroundcolor=]
+ \c!backgroundcolor=,
+ \c!rulethickness=\linewidth]
\def\linetableparameter#1%
{\begincsname\??linetable#1\endcsname}
@@ -290,30 +291,70 @@
\box\scratchbox
\fi}
+% \startuseMPgraphic{one}
+% path p, q ;
+% numeric r ;
+% r := RuleThickness ;
+% p := unitsquare xysized(RuleWidth,RuleHeight+RuleDepth) ;
+% q := p topenlarged -r bottomenlarged -r ;
+% draw q ;
+% setbounds currentpicture to p;
+% \stopuseMPgraphic
+%
+% \setuplinetable[r][odd] [type=mp,mp=one,backgroundcolor=gray,rulethickness=1pt]
+% \setuplinetable[r][even][type=mp,mp=one,backgroundcolor=green,rulethickness=1pt]
+%
+% \startlinetable
+% \dorecurse{10}{\NC aaa \NC bb \NC c \NC ddddd \NC eeee \NC ff \NC \NR}
+% \stoplinetable
+
\def\tabl_lines_wrap_up_auto
{\edef\p_height{\linetablerparameter{x\c!height}}%
\edef\p_depth {\linetablerparameter{x\c!depth }}%
- \hbox
+ \hpack
{\blackrule
[ \c!color=\linetablecparameter\c!backgroundcolor,
+ \c!type=\linetablecparameter\c!type,
+ \c!mp=\linetablecparameter\c!mp,
+ \c!rulethickness=\linetablecparameter\c!rulethickness,
\c!height=\ifx\p_height\empty\ht\scratchbox\else\p_height\fi,
\c!depth=\ifx\p_depth \empty\dp\scratchbox\else\p_depth \fi,
\c!width=\wd\scratchbox]%
\hskip-\wd\scratchbox\box\scratchbox}}
+\def\tabl_lines_wrap_up_auto_r
+ {\hpack
+ {\blackrule
+ [ \c!color=\linetablerparameter\c!backgroundcolor,
+ \c!type=\linetablerparameter\c!type,
+ \c!mp=\linetablerparameter\c!mp,
+ \c!rulethickness=\linetablerparameter\c!rulethickness,
+ \c!height=\ht\scratchbox,
+ \c!depth=\dp\scratchbox,
+ \c!width=\wd\scratchbox]%
+ \hskip-\wd\scratchbox\box\scratchbox}}
+
\def\tabl_lines_wrap_up_line
{\backgroundline[\linetablecparameter\c!backgroundcolor]{\box\scratchbox}}
\def\tabl_lines_save_part
{\global\setbox\tablebox\c_tabl_lines_part
- \ifnum\c_tabl_lines_part=\zerocount
+ \ifcase\c_tabl_lines_part\relax
\box\scratchbox % just storing
\else
\vbox
{\ifvoid\tablebox\c_tabl_lines_part\else\unvbox\tablebox\c_tabl_lines_part\fi
- \doif{\linetablerparameter\c!background}\v!color
- {\backgroundline[\linetablerparameter\c!backgroundcolor]}%
- {\box\scratchbox}% is also arg to \backgroundline
+ \edef\p_background{\linetablerparameter\c!background}%
+ \ifx\p_background\v!color
+ \backgroundline[\linetablerparameter\c!backgroundcolor]{\box\scratchbox}%
+ \else
+ \edef\p_type{\linetablerparameter\c!type}%
+ \ifx\p_type\empty
+ \box\scratchbox
+ \else
+ \tabl_lines_wrap_up_auto_r
+ \fi
+ \fi
\endgraf
\linetablerparameter\c!after}%
\fi}
@@ -340,7 +381,7 @@
\nointerlineskip % fix topskip
\fi
\noindent\strut
- \hbox to \hsize{\box\tablebox\c_tabl_lines_part\hss}%
+ \hpack to \hsize{\box\tablebox\c_tabl_lines_part\hss}%
\endgraf
\ifnum\c_tabl_lines_part<\c_tabl_lines_n_of_parts\relax
\linetableparameter\c!inbetween
@@ -756,8 +797,6 @@
\showframe \showstruts
-\setupcolors[state=start]
-
\setuppagenumbering[alternative=doublesided]\page[left]
\startlinetable
diff --git a/Master/texmf-dist/tex/context/base/mkiv/tabl-ntb.mkiv b/Master/texmf-dist/tex/context/base/mkiv/tabl-ntb.mkiv
index ca3d78800ac..8ff02330a9a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/tabl-ntb.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/tabl-ntb.mkiv
@@ -11,13 +11,12 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D This module has a more modern variant in xtables but as we follow a bit
-%D different approach with settings there, this mechanism will stay. In fact
-%D each of them has its advantages. This module could be sped up a bit and made
-%D more efficient by delegating some housekeeping to \LUA\ but it's not worth
-%D the effort. The code could me made more readable but again, there is no
-%D real purpose in it. If needed I can squeeze out a few more percentages
-%D runtime.
+%D This module has a more modern variant in xtables but as we follow a bit different
+%D approach with settings there, this mechanism will stay. In fact each of them has
+%D its advantages. This module could be sped up a bit and made more efficient by
+%D delegating some housekeeping to \LUA\ but it's not worth the effort. The code
+%D could me made more readable but again, there is no real purpose in it. If needed
+%D I can squeeze out a few more percentages runtime.
% columndistance 'optimized' ... needs checking
%
@@ -27,8 +26,8 @@
% sometimes this helps (with nc going wild): \setupTABLE[maxwidth=100cm]
%
-% bug: width 3cm is not honored and column becomes too wide
-% as given width is added to distributed width
+% bug: width 3cm is not honored and column becomes too wide as given width is added
+% to distributed width
%
% \bTABLE
% \bTR
@@ -61,16 +60,14 @@
% \stopcelltable
% \stoptext
-%D As always, this is the n\high{th} version. Much time went in
-%D trying to speed up the many cell calculations, some
-%D optimizations were rejected in order not to complicate this
-%D module too much (and in order to prevail extensibility). In the
+%D As always, this is the n\high{th} version. Much time went in trying to speed up
+%D the many cell calculations, some optimizations were rejected in order not to
+%D complicate this module too much (and in order to prevail extensibility). In the
%D meantime we've sacrified some speed for readability.
\unprotect
-%D The next alternative also takes care of preceding and following
-%D white space.
+%D The next alternative also takes care of preceding and following white space.
%D
%D \startbuffer
%D \bTABLE[left={(},right={)},top=\startnarrower,bottom=\stopnarrower]
@@ -203,25 +200,35 @@
\newbox\b_tabl_ntb_final
-%D We have already prepared the previous macros for nesting,
-%D so we only have to pop in the right ones:
+%D For tagging and export:
+
+\newconstant \c_tabl_ntb_head
+\newconstant \c_tabl_ntb_body
+\newconstant \c_tabl_ntb_foot
+\newconditional \c_tabl_ntb_okay
+
+%D We have already prepared the previous macros for nesting, so we only have to pop
+%D in the right ones:
\newcount\c_tabl_level
+\installglobalmacrostack\m_tabl_ntb_saved_row
+\installglobalmacrostack\m_tabl_ntb_saved_col
+
\unexpanded\def\tabl_ntb_table_push
{\ifnum\m_tabl_tbl_level>\plusone
\tabl_ntb_parameters_reset
% we need a proper count push/pop
- \xdef\m_tabl_ntb_saved_row{\the\c_tabl_ntb_row}\globalpushmacro\m_tabl_ntb_saved_row
- \xdef\m_tabl_ntb_saved_col{\the\c_tabl_ntb_col}\globalpushmacro\m_tabl_ntb_saved_col
+ \xdef\m_tabl_ntb_saved_row{\the\c_tabl_ntb_row}\push_macro_m_tabl_ntb_saved_row
+ \xdef\m_tabl_ntb_saved_col{\the\c_tabl_ntb_col}\push_macro_m_tabl_ntb_saved_col
\else
\global\intabletrue
\fi}
\unexpanded\def\tabl_ntb_table_pop
{\ifnum\m_tabl_tbl_level>\plusone
- \globalpopmacro\m_tabl_ntb_saved_row\global\c_tabl_ntb_row\m_tabl_ntb_saved_row
- \globalpopmacro\m_tabl_ntb_saved_col\global\c_tabl_ntb_col\m_tabl_ntb_saved_col
+ \pop_macro_m_tabl_ntb_saved_row\global\c_tabl_ntb_row\m_tabl_ntb_saved_row
+ \pop_macro_m_tabl_ntb_saved_col\global\c_tabl_ntb_col\m_tabl_ntb_saved_col
\else
\global\intablefalse
\fi}
@@ -858,8 +865,8 @@
\def\tabl_ntb_tn[#1]#2\eTN
{\tabl_ntb_td[#1]\digits#2\relax\eTD}
-%D Vit Zyka needed the option to create a distance between columns, so I
-%D added support for individual column distances.
+%D Vit Zyka needed the option to create a distance between columns, so I added
+%D support for individual column distances.
%D
%D \startbuffer
%D % \setupTABLE[c][each][distance=2em]
@@ -881,9 +888,8 @@
%D
%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection
%D
-%D and he provided patches for the global left and right margin distances
-%D as well as the columndistance (although i changed the names -). Here
-%D is his testcase:
+%D and he provided patches for the global left and right margin distances as well as
+%D the columndistance (although i changed the names -). Here is his testcase:
%D
%D \startbuffer
%D \framed[offset=overlay]\bgroup
@@ -992,6 +998,8 @@
\let\nofTABLErows \!!zerocount
\let\nofTABLEcolumns \!!zerocount
+% there is no gain in a \doifelsenextoptionalcs variant
+
\unexpanded\def\dobTR{\dosingleempty\tabl_ntb_tr} % also used in tabl-nte
\unexpanded\def\dobTD{\dosingleempty\tabl_ntb_td} % also used in tabl-nte
\unexpanded\def\dobTH{\dosingleempty\tabl_ntb_th} % also used in tabl-nte
@@ -1006,19 +1014,30 @@
\unexpanded\def\eTABLE % beware, we need to get rid of spurious spaces when in hmode
{% tricky and dirty order -)
+ \setfalse\c_tabl_ntb_okay
+ % head
\doifelsesometoks\t_tabl_ntb_head % slow, better a flag
- {\the\t_tabl_ntb_head
+ {\c_tabl_ntb_head\numexpr\c_tabl_ntb_maximum_row+\plusone\relax
+ \the\t_tabl_ntb_head
\c_tabl_ntb_n_of_head_lines\c_tabl_ntb_maximum_row\relax
\doifelsesometoks\t_tabl_ntb_next
{\the\t_tabl_ntb_next
\c_tabl_ntb_n_of_next_lines\numexpr\c_tabl_ntb_maximum_row-\c_tabl_ntb_n_of_head_lines\relax}%
{\c_tabl_ntb_n_of_next_lines\zerocount}% was 1
\c_tabl_ntb_n_of_hdnx_lines\c_tabl_ntb_maximum_row}
- {\c_tabl_ntb_n_of_head_lines\zerocount % was 1
+ {\c_tabl_ntb_head\zerocount
+ \c_tabl_ntb_n_of_head_lines\zerocount % was 1
\c_tabl_ntb_n_of_next_lines\zerocount
\c_tabl_ntb_n_of_hdnx_lines\zerocount}%
+ % body
+ \c_tabl_ntb_body\numexpr\c_tabl_ntb_maximum_row+\plusone\relax
\the\t_tabl_ntb_body
- \the\t_tabl_ntb_foot
+ % foot
+ \doifelsesometoks\t_tabl_ntb_foot
+ {\c_tabl_ntb_foot\numexpr\c_tabl_ntb_maximum_row+\plusone\relax
+ \the\t_tabl_ntb_foot}%
+ {\c_tabl_ntb_foot\zerocount}%
+ % done
\removeunwantedspaces % only if hmode
% finish cells
\tabl_ntb_loop_one
@@ -1228,25 +1247,76 @@
\def\tabl_ntb_prelocate_okay
{\expandafter\let\expandafter\t_tabl_ntb_row\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname\t_tabl_ntb_row\emptytoks}
-% We use aligments to handle the empty (skipped) columns, so
-% that we don't have to (re|)|calculate these.
+%D We use aligments to handle the empty (skipped) columns, so that we don't have to
+%D (re|)|calculate these.
\let\m_tabl_ntb_saved_row\!!zerocount
\let\m_tabl_ntb_saved_col\!!zerocount
+\def\tabl_ntb_start_tagged
+ {\scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax
+ \ifnum\scratchcounter=\c_tabl_ntb_head
+ \ifconditional\c_tabl_ntb_okay
+ \dostoptagged
+ \else
+ \settrue\c_tabl_ntb_okay
+ \fi
+ \dostarttagged\t!tablehead\empty
+ \else\ifnum\scratchcounter=\c_tabl_ntb_body
+ \ifconditional\c_tabl_ntb_okay
+ \dostoptagged
+ \else
+ \settrue\c_tabl_ntb_okay
+ \fi
+ \dostarttagged\t!tablebody\empty
+ \else\ifnum\scratchcounter=\c_tabl_ntb_foot
+ \ifconditional\c_tabl_ntb_okay
+ \dostoptagged
+ \else
+ \settrue\c_tabl_ntb_okay
+ \fi
+ \dostarttagged\t!tablefoot\empty
+ \fi\fi\fi
+ \dostarttagged\t!tablerow\empty}
+
+\def\tabl_ntb_stop_tagged
+ {\dostoptagged
+ \ifconditional\c_tabl_ntb_okay
+ \scratchcounter\numexpr\c_tabl_ntb_row+\plustwo\relax
+ \ifnum\scratchcounter=\c_tabl_ntb_body
+ \dostoptagged
+ \setfalse\c_tabl_ntb_okay
+ \else\ifnum\scratchcounter=\c_tabl_ntb_foot
+ \dostoptagged
+ \setfalse\c_tabl_ntb_okay
+ \else\ifnum\scratchcounter>\c_tabl_ntb_maximum_row
+ \dostoptagged
+ \setfalse\c_tabl_ntb_okay
+ \fi\fi\fi
+ \fi}
+
\unexpanded\def\tabl_ntb_row_align_start
{\global\advance\c_tabl_ntb_row\plusone
\global\c_tabl_ntb_col\plusone
\global\c_tabl_ntb_spn\zerocount
\tabl_ntb_row_align_start_inject
- \dostarttagged\t!tablerow\empty
- \hbox\bgroup
- \kern\dimexpr\d_tabl_ntb_leftmargindistance\relax}
+ \ifconditional\c_strc_tags_enabled
+ \tabl_ntb_start_tagged
+ \fi
+ % we are in sync but just to be sure:
+ \synchronizedisplaydirection
+ \synchronizeinlinedirection
+ \hbox
+ \usedirectionparameterreverse\naturaltablelocalparameter
+ \bgroup
+ \kern\dimexpr\d_tabl_ntb_leftmargindistance\relax}
\unexpanded\def\tabl_ntb_row_align_stop
{\kern\dimexpr\d_tabl_ntb_rightmargindistance-\d_tabl_ntb_columndistance\relax
\egroup
- \dostoptagged
+ \ifconditional\c_strc_tags_enabled
+ \tabl_ntb_stop_tagged
+ \fi
\tabl_ntb_row_align_stop_inject}
\unexpanded\def\tabl_ntb_before_page
@@ -1723,12 +1793,14 @@
\tabl_ntb_set_aut\recurselevel{\the\scratchdimen}%
\fi
\else
- \ifdim\scratchdimen=\zeropoint % auto set width
+ \ifzeropt\scratchdimen % auto set width
\tabl_ntb_set_wid\recurselevel{\the\!!dimena}%
\fi
\fi}%
\ifconditional\c_tabl_ntb_trace_widths\tabl_ntb_show_widths E#1\fi}
+% todo: use scratchcounters, not !! ones
+
\def\tabl_ntb_check_heights_one_indeed
{\!!countb\tabl_ntb_get_row\c_tabl_ntb_current_row_three\c_tabl_ntb_current_col_three\relax
% check row span
@@ -1810,19 +1882,6 @@
{\writestatus\m!TABLE{\space\space\recurselevel: \the\dimexpr\tabl_ntb_get_wid\recurselevel}}%
\endgroup}
-% \def\tabl_ntb_char_align
-% {\doifelse{\naturaltablelocalparameter\c!aligncharacter}\v!yes
-% \tabl_ntb_char_align_indeed\gobbletwoarguments}
-
-% \def\tabl_ntb_char_align_indeed#1#2#3% row column data
-% {\edef\alignmentclass{#2}%
-% \edef\alignmentcharacter{\naturaltablelocalparameter\c!alignmentcharacter}%
-% \ifcase\c_tabl_tbl_pass\or
-% \setfirstpasscharacteralign\checkalignment{#3}% {\strut#2\unskip}%
-% \fi % force hsize, so always a second
-% \setsecondpasscharacteralign \checkalignment{#3}% {\strut#2\unskip}%
-% \ignorespaces}
-
\def\tabl_ntb_char_align % called often
{\edef\p_characteralign{\naturaltablelocalparameter\c!aligncharacter}%
\ifx\p_characteralign\v!yes
@@ -1852,25 +1911,12 @@
\unexpanded\def\tabl_ntb_cell_process_x#1#2[#3]#4%
{}
-% problem: when span doesn't break we can have a span that is the sum of
-% cells but still to small .. chicken egg problem ... for that we should
-% also have a smallest width run
+% problem: when span doesn't break we can have a span that is the sum of cells but
+% still to small .. chicken egg problem ... for that we should also have a smallest
+% width run
%
% nilling the background makes a run upto 25% faster
-% \def\tabl_ntb_cell_process_a_check_span_one
-% {\ifautosqueezeTBLspan
-% \edef\p_width{\naturaltablelocalparameter\c!width}%
-% \csname\??naturaltablesqueeze\ifcsname\??naturaltablesqueeze\p_width\endcsname\p_width\fi\endcsname
-% \else
-% \donetrue
-% \fi
-% \ifdone % brr, 0
-% \ifnum\scratchcounter>\plusone
-% \tabl_ntb_set_spn\c_tabl_ntb_col
-% \fi
-% \fi}
-
\def\tabl_ntb_cell_process_a_check_span_one
{\ifautosqueezeTBLspan
\edef\p_width{\naturaltablelocalparameter\c!width}%
@@ -1884,47 +1930,6 @@
\fi
\fi}
-% \def\tabl_ntb_cell_process_a_check_span_two_yes
-% {\iftightTBLcolspan
-% \donefalse
-% \else
-% \ifnum\scratchcounter>\plusone
-% \begingroup
-% \edef\p_width{\naturaltablelocalparameter\c!width}%
-% \csname\??naturaltablesqueeze\ifcsname\??naturaltablesqueeze\p_width\endcsname\p_width\fi\endcsname
-% \ifdone
-% \endgroup
-% \edef\p_option{\naturaltablelocalparameter\c!option}%
-% \ifx\p_option\v!tight\donefalse\else\donetrue\fi
-% \else
-% % a dimension
-% \endgroup
-% \donefalse
-% \fi
-% \else
-% \edef\p_option{\naturaltablelocalparameter\c!option}%
-% \ifx\p_option\v!tight\donefalse\else\donetrue\fi
-% \fi
-% \fi
-% \ifdone
-% \ifdim\tabl_ntb_get_wid\c_tabl_ntb_col<\wd\scratchbox
-% \tabl_ntb_set_wid\c_tabl_ntb_col{\the\wd\scratchbox}%
-% \fi
-% \fi}
-
-% \def\tabl_ntb_cell_process_a_check_span_two_nop
-% {\ifnum\scratchcounter>\plusone
-% \edef\p_width{\naturaltablelocalparameter\c!width}%
-% \csname\??naturaltablesqueeze\ifcsname\??naturaltablesqueeze\p_width\endcsname\p_width\fi\endcsname
-% \else
-% \donetrue
-% \fi
-% \ifdone
-% \ifdim\tabl_ntb_get_wid\c_tabl_ntb_col<\wd\scratchbox
-% \tabl_ntb_set_wid\c_tabl_ntb_col{\the\wd\scratchbox}%
-% \fi
-% \fi}
-
\let\tabl_ntb_cell_process_a_check_span_two_yes\relax
\def\tabl_ntb_cell_process_a_check_span_two_nop
@@ -1948,9 +1953,9 @@
\anch_backgrounds_text_level_start
\inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop\tabl_ntb_cell_finalize}%
\anch_backgrounds_text_level_stop
-\ifcase\c_anch_backgrounds_text_count\else
- \tabl_ntb_let_bck{#1}{#2}\c_anch_backgrounds_text_state
-\fi
+ \ifcase\c_anch_backgrounds_text_count\else
+ \tabl_ntb_let_bck{#1}{#2}\c_anch_backgrounds_text_state
+ \fi
}%
\scratchdimen\tabl_ntb_get_wid\c_tabl_ntb_col\relax
\ifdim\wd\scratchbox>\scratchdimen
@@ -1972,7 +1977,7 @@
\ifdim\wd\scratchbox<.75\hsize % fuzzy guess
\ifdim\ht\scratchbox>2\openlineheight % honor width since this
\scratchdimen\tabl_ntb_get_aut\c_tabl_ntb_col\relax % can be a figure or so
- \ifdim\scratchdimen=\zeropoint
+ \ifzeropt\scratchdimen
% side effect: when width is set to 0pt,
% we can force a span that fits the sum of spans widths
\tabl_ntb_set_aut\c_tabl_ntb_col{\the\scratchdimen}%
@@ -2050,16 +2055,16 @@
[\naturaltablelocalparameter\c!color] % as well as permits local colors to take precedence
{\letnaturaltablelocalparameter\c!color\empty
\setnaturaltablelocalparameter\c!width{\d_tabl_ntb_width}%
- \ifdim\d_tabl_ntb_height=\zeropoint\relax % case: nc=maxcolumns
+ \ifzeropt\d_tabl_ntb_height % case: nc=maxcolumns
\else
\setnaturaltablelocalparameter\c!height{\d_tabl_ntb_height}%
\fi
-\ifcase\c_anch_backgrounds_text_count\else
- \edef\p_region{\naturaltablelocalparameter\c!region}%
- \ifx\p_region\empty\ifnum\tabl_ntb_get_bck{#1}{#2}>\zerocount
- \letnaturaltablelocalparameter\c!region\v!yes
- \fi\fi
-\fi
+ \ifcase\c_anch_backgrounds_text_count\else
+ \edef\p_region{\naturaltablelocalparameter\c!region}%
+ \ifx\p_region\empty\ifnum\tabl_ntb_get_bck{#1}{#2}>\zerocount
+ \letnaturaltablelocalparameter\c!region\v!yes
+ \fi\fi
+ \fi
\inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop}}%
\hskip\tabl_ntb_get_dis{#2}}
@@ -2193,12 +2198,6 @@
\let\eTDs\relax
\let\eTRs\relax
-% \unexpanded\def\bTDs[#1]#2\eTDs
-% {\normalexpanded{\bTD[\ifcsname\??naturaltablesetup#1\endcsname\csname\??naturaltablesetup#1\endcsname\fi]}#2\eTD}
-%
-% \unexpanded\def\bTRs[#1]#2\eTRs
-% {\normalexpanded{\bTR[\ifcsname\??naturaltablesetup#1\endcsname\csname\??naturaltablesetup#1\endcsname\fi]}#2\eTR}
-
\unexpanded\def\bTDs[#1]#2\eTDs
{\normalexpanded{\bTD[\begincsname\??naturaltablesetup#1\endcsname]}#2\eTD}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/tabl-ntb.mkxl b/Master/texmf-dist/tex/context/base/mkiv/tabl-ntb.mkxl
new file mode 100644
index 00000000000..6b84411b2a9
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/tabl-ntb.mkxl
@@ -0,0 +1,2202 @@
+%D \module
+%D [ file=tabl-ntb,
+%D version=2000.04.18,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Natural Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module has a more modern variant in xtables but as we follow a bit different
+%D approach with settings there, this mechanism will stay. In fact each of them has
+%D its advantages. This module could be sped up a bit and made more efficient by
+%D delegating some housekeeping to \LUA\ but it's not worth the effort. The code
+%D could me made more readable but again, there is no real purpose in it. If needed
+%D I can squeeze out a few more percentages runtime.
+
+% columndistance 'optimized' ... needs checking
+%
+% we don't need the alignment mechanism .. we can just pack the row in a box
+
+\writestatus{loading}{ConTeXt Table Macros / Natural Tables}
+
+% sometimes this helps (with nc going wild): \setupTABLE[maxwidth=100cm]
+%
+% bug: width 3cm is not honored and column becomes too wide as given width is added
+% to distributed width
+%
+% \bTABLE
+% \bTR
+% \bTD test \eTD
+% \bTD \framed[height=3cm]{test} \eTD
+% \bTD[width=3cm] \dorecurse{30}{a } \eTD
+% \bTD \input ward \eTD
+% \eTR
+% \bTR
+% \bTD test \eTD
+% \bTD \framed[height=3cm]{test} \eTD
+% \bTD \dorecurse{30}{a } \eTD
+% \bTD \input ward \eTD
+% \eTR
+% \eTABLE
+
+% \unexpanded\def\startrow {\bTR}
+% \unexpanded\def\stoprow {\eTR}
+% \unexpanded\def\startcell#1\stopcell{\bTD#1\eTD}
+% \let\stopcell \relax
+% \let\startcelltable \bTABLE
+% \let\stopcelltable \eTABLE
+
+% \starttext
+% \startcelltable
+% \startrow \startcell a \stopcell \stoprow
+% \startrow \startcell a \stopcell \stoprow
+% \startrow \startcell a \stopcell \stoprow
+% \startrow \startcell a \stopcell \stoprow
+% \stopcelltable
+% \stoptext
+
+%D As always, this is the n\high{th} version. Much time went in trying to speed up
+%D the many cell calculations, some optimizations were rejected in order not to
+%D complicate this module too much (and in order to prevail extensibility). In the
+%D meantime we've sacrified some speed for readability.
+
+\unprotect
+
+%D The next alternative also takes care of preceding and following white space.
+%D
+%D \startbuffer
+%D \bTABLE[left={(},right={)},top=\startnarrower,bottom=\stopnarrower]
+%D \bTR \bTD something \eTD \eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\ifdefined\dotagTABLEcell \else \let\dotagTABLEcell \relax \fi % todo: namespace
+\ifdefined\dotagTABLEsignal \else \let\dotagTABLEsignal\relax \fi % todo: namespace
+
+\let\tabl_ntb_next_level\relax
+
+\newtoks\t_tabl_ntb_cell_start
+\newtoks\t_tabl_ntb_cell_stop
+
+\appendtoks
+ \naturaltablelocalparameter\c!left
+ \delayedbegstrut
+\to \t_tabl_ntb_cell_start
+
+\appendtoks
+ \delayedendstrut
+ \naturaltablelocalparameter\c!right
+\to \t_tabl_ntb_cell_stop
+
+\appendtoks
+ \flushpostponednodedata
+ % maybe: \the\neverypar
+\to \t_tabl_ntb_cell_start
+
+\unexpanded\def\tabl_ntb_cell_start
+ {% \inhibitblank
+ \dotagTABLEcell
+ %\tabl_ntb_next_level
+ \font_styles_math_reset
+ \usenaturaltablelocalstyleandcolor\c!style\c!color
+ \everypar\t_tabl_ntb_cell_start
+ \font_styles_math_start}
+
+\unexpanded\def\tabl_ntb_cell_stop
+ {\font_styles_math_stop
+ \ifhmode
+ \the\t_tabl_ntb_cell_stop
+ \par % added 13/4/2006
+ \orelse\ifdim\prevdepth<\zeropoint % =-1000pt ?
+ % not sure yet:\naturaltablelocalparameter\c!right
+ \vskip-\strutdp
+ \else
+ \removebottomthings
+ \fi}
+
+% maybe:
+%
+% \unexpanded\def\tabl_ntb_cell_stop
+% {\ifhmode
+% \the\t_tabl_ntb_cell_stop
+% \par % added 13/4/2006
+% \else
+% % not sure yet:\naturaltablelocalparameter\c!right
+% \par
+% \ifhmode
+% % \removeunwantedspaces
+% \else\ifdim\prevdepth<\zeropoint % =-1000pt ?
+% \vskip-\strutdp
+% \else
+% \removebottomthings
+% \fi\fi
+% \fi}
+
+\newcount\c_tabl_ntb_row
+\newcount\c_tabl_ntb_col
+\newcount\c_tabl_ntb_spn
+
+\newcount\c_tabl_ntb_nx
+\newcount\c_tabl_ntb_ny
+
+\setnewconstant\c_tabl_ntb_cell \plusone
+\setnewconstant\c_tabl_ntb_none \plustwo
+
+\newcount\c_tabl_ntb_current_row
+\newcount\c_tabl_ntb_current_col
+\newcount\c_tabl_ntb_current_row_one
+\newcount\c_tabl_ntb_current_col_one
+\newcount\c_tabl_ntb_current_row_two
+\newcount\c_tabl_ntb_current_col_two
+\newcount\c_tabl_ntb_current_row_three
+\newcount\c_tabl_ntb_current_col_three
+\newcount\c_tabl_ntb_current_row_four
+\newcount\c_tabl_ntb_current_col_four
+
+\newcount\c_tabl_ntb_running_col
+\newcount\c_tabl_ntb_maximum_row
+\newcount\c_tabl_ntb_maximum_col
+\newcount\c_tabl_ntb_maximum_row_span
+\newcount\c_tabl_ntb_maximum_col_span
+
+\newcount\c_tabl_ntb_encountered_col
+\newcount\c_tabl_ntb_encountered_max
+
+\newtoks\t_tabl_ntb
+\newtoks\t_tabl_ntb_row
+
+\newconstant\c_tabl_tbl_pass
+
+\newtoks\t_tabl_ntb_head
+\newtoks\t_tabl_ntb_next
+\newtoks\t_tabl_ntb_body
+\newtoks\t_tabl_ntb_foot
+
+\newcount\c_tabl_ntb_n_of_head_lines
+\newcount\c_tabl_ntb_n_of_next_lines
+\newcount\c_tabl_ntb_n_of_hdnx_lines
+
+\newdimen\d_tabl_ntb_height
+\newdimen\d_tabl_ntb_width
+
+\newdimen\d_tabl_ntb_leftmargindistance
+\newdimen\d_tabl_ntb_rightmargindistance
+\newdimen\d_tabl_ntb_columndistance
+\newdimen\d_tabl_ntb_maxwidth
+
+\newtoks\everyTABLEpass % public
+
+\newcount\tablecellrows % public (needs checking)
+\newcount\tablecellcolumns % public (needs checking)
+
+\newbox\b_tabl_ntb_final
+
+%D For tagging and export:
+
+\newconstant \c_tabl_ntb_head
+\newconstant \c_tabl_ntb_body
+\newconstant \c_tabl_ntb_foot
+\newconditional \c_tabl_ntb_okay
+
+%D We have already prepared the previous macros for nesting, so we only have to pop
+%D in the right ones:
+
+\newcount\c_tabl_level
+
+\installglobalmacrostack\m_tabl_ntb_saved_row
+\installglobalmacrostack\m_tabl_ntb_saved_col
+
+\unexpanded\def\tabl_ntb_table_push
+ {\ifnum\m_tabl_tbl_level>\plusone
+ \tabl_ntb_parameters_reset
+ % we need a proper count push/pop
+ \xdef\m_tabl_ntb_saved_row{\the\c_tabl_ntb_row}\push_macro_m_tabl_ntb_saved_row
+ \xdef\m_tabl_ntb_saved_col{\the\c_tabl_ntb_col}\push_macro_m_tabl_ntb_saved_col
+ \else
+ \global\intabletrue
+ \fi}
+
+\unexpanded\def\tabl_ntb_table_pop
+ {\ifnum\m_tabl_tbl_level>\plusone
+ \pop_macro_m_tabl_ntb_saved_row\global\c_tabl_ntb_row\m_tabl_ntb_saved_row
+ \pop_macro_m_tabl_ntb_saved_col\global\c_tabl_ntb_col\m_tabl_ntb_saved_col
+ \else
+ \global\intablefalse
+ \fi}
+
+\unexpanded\def\tabl_ntb_next_level
+ {\advance\c_tabl_level\plusone
+ \edef\m_tabl_tbl_level{\the\c_tabl_level}}
+
+\unexpanded\def\tabl_ntb_prev_level
+ {\advance\c_tabl_level\minusone
+ \edef\m_tabl_tbl_level{\the\c_tabl_level}}
+
+\tabl_ntb_next_level % go to level 1
+
+\installcorenamespace{naturaltable} % was tbl
+\installcorenamespace{naturaltablelocal} % was tbltbl
+
+\installdirectcommandhandler \??naturaltable {naturaltable} % \??naturaltable
+\installsimpleframedcommandhandler \??naturaltablelocal {naturaltablelocal} \??naturaltablelocal
+
+\installcorenamespace{naturaltabletal}
+\installcorenamespace{naturaltablegal}
+\installcorenamespace{naturaltablenob}
+\installcorenamespace{naturaltabletag}
+\installcorenamespace{naturaltablecol}
+\installcorenamespace{naturaltablerow}
+\installcorenamespace{naturaltablewd}
+\installcorenamespace{naturaltableht}
+\installcorenamespace{naturaltabledp}
+\installcorenamespace{naturaltablewid}
+\installcorenamespace{naturaltablehei}
+\installcorenamespace{naturaltabledis}
+\installcorenamespace{naturaltableaut}
+\installcorenamespace{naturaltablebck}
+%installcorenamespace{naturaltablefwd} % forcedwidth
+\installcorenamespace{naturaltabletxt}
+\installcorenamespace{naturaltablespn}
+\installcorenamespace{naturaltableref}
+\installcorenamespace{naturaltableset}
+\installcorenamespace{naturaltablecell}
+\installcorenamespace{naturaltablesqueeze}
+\installcorenamespace{naturaltabletok}
+
+\letvalue{\??naturaltablesqueeze }\donefalse
+\letvalue{\??naturaltablesqueeze\v!fit }\donetrue
+\letvalue{\??naturaltablesqueeze\v!fixed}\donetrue
+\letvalue{\??naturaltablesqueeze\v!broad}\donetrue
+\letvalue{\??naturaltablesqueeze\v!local}\donetrue
+
+\def\tabl_ntb_let_gal{\expandafter\glet\csname\??naturaltablegal\m_tabl_tbl_level\endcsname}
+\def\tabl_ntb_get_gal{\csname\??naturaltablegal\m_tabl_tbl_level\endcsname}
+
+\def\tabl_ntb_let_tal#1{\expandafter\glet\csname\??naturaltabletal\m_tabl_tbl_level:\number#1\endcsname}
+\def\tabl_ntb_get_tal#1{\csname\??naturaltabletal\m_tabl_tbl_level:\number#1\endcsname}
+
+\def\tabl_ntb_set_nob#1{\expandafter\let\csname\??naturaltablenob\m_tabl_tbl_level:\number#1\endcsname\plusone}
+\def\tabl_ntb_get_nob#1{\ifcsname\??naturaltablenob\m_tabl_tbl_level:\number#1\endcsname\plusone\else\zerocount\fi}
+
+%def\tabl_ntb_set_tag#1#2{\expandafter\edef\csname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+\def\tabl_ntb_set_col#1#2{\expandafter\edef\csname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+\def\tabl_ntb_set_row#1#2{\expandafter\edef\csname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+
+\def\tabl_ntb_let_tag#1#2{\expandafter\let\csname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+\def\tabl_ntb_let_col#1#2{\expandafter\let\csname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+\def\tabl_ntb_let_row#1#2{\expandafter\let\csname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+
+%def\tabl_ntb_set_wd#1#2{\expandafter\xdef\csname\??naturaltablewd\m_tabl_tbl_level:\number#1:\number#2\endcsname} % global !
+\def\tabl_ntb_set_ht#1#2{\expandafter\xdef\csname\??naturaltableht\m_tabl_tbl_level:\number#1:\number#2\endcsname} % global !
+
+%def\tabl_ntb_let_wd#1#2{\expandafter\glet\csname\??naturaltablewd\m_tabl_tbl_level:\number#1:\number#2\endcsname} % global !
+\def\tabl_ntb_let_ht#1#2{\expandafter\glet\csname\??naturaltableht\m_tabl_tbl_level:\number#1:\number#2\endcsname} % global !
+
+\def\tabl_ntb_get_tag#1#2{\csname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+\def\tabl_ntb_get_col#1#2{\csname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+\def\tabl_ntb_get_row#1#2{\csname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+
+%def\tabl_ntb_get_wd#1#2{\csname\??naturaltablewd\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+\def\tabl_ntb_get_ht#1#2{\csname\??naturaltableht\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+
+\def\tabl_ntb_set_wid#1{\expandafter\xdef\csname\??naturaltablewid\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
+\def\tabl_ntb_set_hei#1{\expandafter\xdef\csname\??naturaltablehei\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
+\def\tabl_ntb_set_dis#1{\expandafter\xdef\csname\??naturaltabledis\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
+\def\tabl_ntb_set_aut#1{\expandafter\xdef\csname\??naturaltableaut\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
+
+\def\tabl_ntb_let_wid#1{\expandafter\glet\csname\??naturaltablewid\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
+\def\tabl_ntb_let_hei#1{\expandafter\glet\csname\??naturaltablehei\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
+\def\tabl_ntb_let_dis#1{\expandafter\glet\csname\??naturaltabledis\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
+\def\tabl_ntb_let_aut#1{\expandafter\glet\csname\??naturaltableaut\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
+
+\def\tabl_ntb_get_wid#1{\ifcsname\??naturaltablewid\m_tabl_tbl_level:\number#1\endcsname\lastnamedcs\else\zeropoint\fi}
+\def\tabl_ntb_get_hei#1{\ifcsname\??naturaltablehei\m_tabl_tbl_level:\number#1\endcsname\lastnamedcs\else\zeropoint\fi}
+\def\tabl_ntb_get_dis#1{\ifcsname\??naturaltabledis\m_tabl_tbl_level:\number#1\endcsname\lastnamedcs\else\zeropoint\fi}
+\def\tabl_ntb_get_aut#1{\csname \??naturaltableaut\m_tabl_tbl_level:\number#1\endcsname}
+
+\def\tabl_ntb_let_bck#1#2{\global\expandafter\chardef\csname\??naturaltablebck\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+
+\def\tabl_ntb_get_bck#1#2{\csname\??naturaltablebck\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+
+\def\tabl_ntb_tag_pattern#1#2{\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2}
+\def\tabl_ntb_row_pattern#1#2{\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2}
+\def\tabl_ntb_col_pattern#1#2{\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2}
+
+\def\tabl_ntb_tag_doif #1#2{\ifcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\firstofoneargument \else\expandafter\gobbleoneargument \fi}
+\def\tabl_ntb_tag_doifnot #1#2{\ifcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\gobbleoneargument \else\expandafter\firstofoneargument \fi}
+\def\tabl_ntb_tag_doifelse#1#2{\ifcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
+\def\tabl_ntb_row_doif #1#2{\ifcsname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\firstofoneargument \else\expandafter\gobbleoneargument \fi}
+\def\tabl_ntb_col_doif #1#2{\ifcsname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\firstofoneargument \else\expandafter\gobbleoneargument \fi}
+\def\tabl_ntb_col_doifnot #1#2{\ifcsname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\gobbleoneargument \else\expandafter\firstofoneargument \fi}
+
+%D If we ever run into memory issues we can do:
+%
+% \def\tabl_ntb_let_tag#1#2#3%
+% {\ifx#3\c_tabl_ntb_none\else
+% \expandafter\let\csname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname#3%
+% \fi}
+%
+% \def\tabl_ntb_get_tag#1#2%
+% {\ifcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname
+% \lastnamedcs
+% \else
+% \c_tabl_ntb_none
+% \fi}
+
+% not used
+%
+% \def\tabl_ntb_tag_state#1#2{\ifcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname\zerocount\else\plusone\fi}
+% \def\tabl_ntb_row_state#1#2{\ifcsname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname\zerocount\else\plusone\fi}
+% \def\tabl_ntb_col_state#1#2{\ifcsname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname\zerocount\else\plusone\fi}
+
+%def\tabl_ntb_set_spn #1{\expandafter\let\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname \!!plusone}
+%def\tabl_ntb_spn_doifelse#1{\doifelse {\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname}\!!plusone}
+
+%def\tabl_ntb_set_spn #1{\setvalue {\??naturaltablespn\m_tabl_tbl_level:\number#1}{1}}
+%def\tabl_ntb_spn_doifelse#1{\doifelsevalue{\??naturaltablespn\m_tabl_tbl_level:\number#1}{1}}
+
+\def\tabl_ntb_let_ref #1#2{\expandafter\glet\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+\def\tabl_ntb_set_ref #1#2{\expandafter\xdef\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+%def\tabl_ntb_get_ref #1#2{\ifcsname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname\fi}
+\def\tabl_ntb_get_ref #1#2{\begincsname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+
+\def\tabl_ntb_set_spn #1{\expandafter\let\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname \!!plusone}
+\def\tabl_ntb_spn_doifelse#1{\ifcase0\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname\relax % could be inlined
+ \expandafter\secondoftwoarguments % unset
+ \else
+ \expandafter\firstoftwoarguments % a span
+ \fi}
+
+% keep for a while:
+%
+% \unexpanded\def\tabl_ntb_set_txt_process#1#2#3#4#5#6% nasty: we restore the level
+% {\expandafter\def\csname\??naturaltabletxt\m_tabl_tbl_level:\number#1:\number#2\expandafter\endcsname\expandafter
+% {\expandafter\def\expandafter\m_tabl_tbl_level\expandafter{\m_tabl_tbl_level}\tabl_ntb_cell_process{#3}{#4}[#5]{#6}}}
+
+\unexpanded\def\tabl_ntb_set_txt_process#1#2#3#4#5#6%
+ {\expandafter\def\csname\??naturaltabletxt\m_tabl_tbl_level:\number#1:\number#2\endcsname
+ {\tabl_ntb_cell_process{#3}{#4}[#5]{\tabl_ntb_next_level#6\tabl_ntb_prev_level}}}
+
+\def\tabl_ntb_get_txt#1#2%
+ {\csname\??naturaltabletxt\m_tabl_tbl_level:\number#1:\number#2\endcsname}
+
+% to be changed:
+
+\newif\ifsqueezeTBLspan \squeezeTBLspantrue % spans one column cell over multi column par cells
+\newif\ifautosqueezeTBLspan \autosqueezeTBLspantrue % unless explicit widths are given
+\newif\ifautoTBLspread \autoTBLspreadfalse
+\newif\ifautoTBLhsize \autoTBLhsizetrue
+\newif\ifautoTBLrowspan \autoTBLrowspantrue
+\newif\ifautoTBLemptycell \autoTBLemptycelltrue
+\newif\ifautoTBLcheckwidth \autoTBLcheckwidthtrue
+\newif\ifappendTBLsetups \appendTBLsetupstrue
+\newif\ifenableTBLbreak \enableTBLbreakfalse
+\newif\ifmultipleTBLheads \multipleTBLheadsfalse
+\newif\iftightTBLrowspan \tightTBLrowspantrue
+\newif\iftightTBLcolspan \tightTBLcolspanfalse
+
+\newconditional \c_tabl_ntb_trace_widths
+
+\installtextracker
+ {tables.natural.widths}
+ {\settrue \c_tabl_ntb_trace_widths}
+ {\setfalse\c_tabl_ntb_trace_widths}
+
+% so far
+
+\unexpanded\def\tabl_ntb_cell_process#1#2[#3]{}
+
+\unexpanded\def\bTC#1\eTC{\bTD#1\eTD} \let\eTC\relax
+\unexpanded\def\bTX#1\eTX{\bTD#1\eTD} \let\eTX\relax
+\unexpanded\def\bTY#1\eTY{\bTR#1\eTR} \let\eTY\relax
+
+\unexpanded\def\setupTABLE
+ {\dotripleempty\tabl_ntb_setup}
+
+\let\tabl_ntb_parameters_get\setupcurrentnaturaltablelocal
+
+\def\tabl_ntb_setup
+ {\ifthirdargument
+ \expandafter\tabl_ntb_setup_three
+ \orelse\ifsecondargument
+ \doubleexpandafter\tabl_ntb_setup_two
+ \else
+ \doubleexpandafter\tabl_ntb_setup_one
+ \fi}
+
+\def\tabl_ntb_setup_one[#1][#2][#3]%
+ {\setupcurrentnaturaltablelocal[#1]}
+
+\def\tabl_ntb_setup_xy[#1][#2][#3]%
+ {\def\tabl_ntb_setup_step##1{\tabl_ntb_parameters_set[#1##1][#3]}%
+ \processcommalist[#2]\tabl_ntb_setup_step}
+
+\def\tabl_ntb_setup_un[#1][#2][#3]%
+ {\def\tabl_ntb_setup_step##1%
+ {\def\tabl_ntb_setup_step_step####1{\tabl_ntb_parameters_set[\c!x##1\c!y####1][#3]}%
+ \processcommalist[#2]\tabl_ntb_setup_step_step}%
+ \processcommalist[#1]\tabl_ntb_setup_step}
+
+\def\tabl_ntb_setup_each[#1][#2][#3]% ignores #3
+ {\tabl_ntb_parameters_set[#1\v!each][#2]}
+
+\def\tabl_ntb_setup_ux[#1][#2][#3]% ignores #3
+ {\def\tabl_ntb_setup_step##1{\tabl_ntb_parameters_set[\c!x##1][#2]}%
+ \processcommalist[#1]\tabl_ntb_setup_step}
+
+\installcorenamespace{naturaltablesetupthree}
+\installcorenamespace{naturaltablesetuptwo}
+
+%def\tabl_ntb_setup_three[#1]{\csname\??naturaltablesetupthree\ifcsname\??naturaltablesetupthree#1\endcsname#1\else\s!unknown\fi\endcsname[#1]}
+%def\tabl_ntb_setup_two [#1]{\csname\??naturaltablesetuptwo \ifcsname\??naturaltablesetuptwo #1\endcsname#1\else\s!unknown\fi\endcsname[#1]}
+
+\def\tabl_ntb_setup_three[#1]{\ifcsname\??naturaltablesetupthree#1\endcsname\expandafter\lastnamedcs\else\expandafter\tabl_ntb_setup_un\fi[#1]}
+\def\tabl_ntb_setup_two [#1]{\ifcsname\??naturaltablesetuptwo #1\endcsname\expandafter\lastnamedcs\else\expandafter\tabl_ntb_setup_ux\fi[#1]}
+
+\setvalue{\??naturaltablesetupthree \v!row}[#1]{\tabl_ntb_setup_xy [\c!y]}
+\setvalue{\??naturaltablesetupthree \v!column}[#1]{\tabl_ntb_setup_xy [\c!x]}
+\setvalue{\??naturaltablesetupthree \v!start}[#1]{\tabl_ntb_setup_xy [\v!start]}
+\setvalue{\??naturaltablesetupthree \v!header}[#1]{\tabl_ntb_setup_xy [\v!header]}
+
+\setvalue{\??naturaltablesetuptwo \v!row}[#1]{\tabl_ntb_setup_each[\c!y]}
+\setvalue{\??naturaltablesetuptwo \v!column}[#1]{\tabl_ntb_setup_each[\c!x]}
+\setvalue{\??naturaltablesetuptwo \v!start}[#1]{\tabl_ntb_setup_each[\v!start]}
+\setvalue{\??naturaltablesetuptwo \v!header}[#1]{\tabl_ntb_setup_each[\v!header]}
+
+\letvalue{\??naturaltablesetupthree\s!unknown}\tabl_ntb_setup_un
+\letvalue{\??naturaltablesetuptwo \s!unknown}\tabl_ntb_setup_ux
+
+\letcsnamecsname\csname\??naturaltablesetupthree r\endcsname\csname\??naturaltablesetupthree \v!row\endcsname
+\letcsnamecsname\csname\??naturaltablesetupthree c\endcsname\csname\??naturaltablesetupthree\v!column\endcsname
+\letcsnamecsname\csname\??naturaltablesetupthree y\endcsname\csname\??naturaltablesetupthree \v!row\endcsname
+\letcsnamecsname\csname\??naturaltablesetupthree x\endcsname\csname\??naturaltablesetupthree\v!column\endcsname
+
+\letcsnamecsname\csname\??naturaltablesetuptwo r\endcsname\csname\??naturaltablesetuptwo \v!row\endcsname
+\letcsnamecsname\csname\??naturaltablesetuptwo c\endcsname\csname\??naturaltablesetuptwo \v!column\endcsname
+\letcsnamecsname\csname\??naturaltablesetuptwo y\endcsname\csname\??naturaltablesetuptwo \v!row\endcsname
+\letcsnamecsname\csname\??naturaltablesetuptwo x\endcsname\csname\??naturaltablesetuptwo \v!column\endcsname
+
+\def\tabl_ntb_parameters_set[#1][#2]%
+ {\ifappendTBLsetups
+ \ifcsname\??naturaltableset\m_tabl_tbl_level:#1\endcsname
+ \def\tabl_ntb_parameters_get[##1]%
+ {\setvalue{\??naturaltableset\m_tabl_tbl_level:#1}{\tabl_ntb_parameters_get[##1,#2]}}%
+ \csname\??naturaltableset\m_tabl_tbl_level:#1\endcsname
+ \let\tabl_ntb_parameters_get\setupcurrentnaturaltablelocal
+ \else
+ \setvalue{\??naturaltableset\m_tabl_tbl_level:#1}{\tabl_ntb_parameters_get[#2]}%
+ \fi
+ \else
+ \setvalue{\??naturaltableset\m_tabl_tbl_level:#1}{\tabl_ntb_parameters_get[#2]}%
+ \fi}
+
+% % \setupTABLE [y] [first][background=color,backgroundcolor=blue,frame=off,bottomframe=on,topframe=on,framecolor=white]
+% \setupTABLE [first][first][backgroundcorner=2,corner=10,frame=on]
+% \setupTABLE [last] [first][backgroundcorner=4,corner=12,frame=on]
+%
+% \setupTABLE [row] [each] [background=color,backgroundcolor=blue,frame=on,framecolor=white]
+% \setupTABLE [first][2] [corner=8]
+% \setupTABLE [last] [2] [corner=5]
+% \setupTABLE [first][last] [corner=7]
+% \setupTABLE [last] [last] [corner=6]
+%
+% \startTEXpage
+% \bTABLE[frame=off,align=middle]
+% \bTR \bTD one \eTD \bTD two \eTD \bTD three \eTD \eTR
+% \bTR \bTD first \eTD \bTD second \eTD \bTD third \eTD \eTR
+% \bTR \bTD alpha \eTD \bTD beta \eTD \bTD gamma \eTD \eTR
+% \eTABLE
+% \stopTEXpage
+%
+% \setupTABLE [first] [two][corner=2] % special case
+% \setupTABLE [last] [two][corner=4] % special case
+%
+% % % \setupTABLE [one] [first] ... special case of span
+%
+% \startTEXpage
+% \bTABLE[frame=off,align=middle]
+% \bTR \bTD one \eTD \bTD two \eTD \bTD three \eTD \eTR
+% \bTR \bTD first \eTD \bTD second \eTD \bTD third \eTD \eTR
+% \eTABLE
+% \stopTEXpage
+
+%D By default rowspans are tight but you can change that:
+%D
+%D \startbuffer
+%D \bTABLE
+%D \bTR[height=20pt] \bTH 1. col \eTH \bTH 2. col \eTH \eTR
+%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \bTD[nr=2] 2 rows in 2. col \eTD \eTR
+%D \bTR[height=20pt] \bTD[nr=2] 2 rows in 1. col\eTD \eTR
+%D \bTR[height=20pt] \bTD[nr=3] 3 rows in 2. col \eTD \eTR
+%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \eTR
+%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \eTR
+%D \eTABLE
+%D
+%D \bTABLE
+%D \bTR[height=20pt] \bTH 2. col \eTH \bTH 1. col \eTH \eTR
+%D \bTR[height=20pt] \bTD[nr=2] 2 rows in 2. col \eTD \bTD 1 row in 1. col \eTD \eTR
+%D \bTR[height=20pt] \bTD[nr=2] 2 rows in 1. col\eTD \eTR
+%D \bTR[height=20pt] \bTD[nr=3] 3 rows in 2. col \eTD \eTR
+%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \eTR
+%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D With \type {\tightTBLrowspanfalse} we get:
+%D
+%D \start \tightTBLrowspanfalse \getbuffer \stop
+
+\let\tabl_ntb_setup_section\relax
+
+\unexpanded\def\tabl_ntb_setup_cell#1#2% cell over col over row
+ {\tabl_ntb_setup_section % already forgotten
+ \edef\m_tabl_ntb_positive_row{\number#1}%
+ \edef\m_tabl_ntb_positive_col{\number#2}%
+ \edef\m_tabl_ntb_negative_row{\the\numexpr-\c_tabl_ntb_maximum_row+#1+\minusone\relax}%
+ \edef\m_tabl_ntb_negative_col{\the\numexpr-\c_tabl_ntb_maximum_col+#2+\minusone\relax}%
+ % saves tokens (no speed gain)
+ \edef\m_tabl_ntb_prefix{\??naturaltableset\m_tabl_tbl_level:}%
+ % each each
+ \begincsname\m_tabl_ntb_prefix\c!x\v!each\c!y\v!each\endcsname
+ \begincsname\m_tabl_ntb_prefix\c!y\v!each\endcsname
+ \begincsname\m_tabl_ntb_prefix\c!x\v!each\endcsname
+ % odd even
+ \begincsname\m_tabl_ntb_prefix\c!y\v!oddeven\m_tabl_ntb_positive_row\endcsname
+ \begincsname\m_tabl_ntb_prefix\c!x\v!oddeven\m_tabl_ntb_positive_col\endcsname
+ \begincsname\m_tabl_ntb_prefix\c!x\v!oddeven\m_tabl_ntb_positive_col\c!y\v!oddeven\m_tabl_ntb_positive_row\endcsname
+ % row/col number combinations
+ \begincsname\m_tabl_ntb_prefix\c!y\m_tabl_ntb_positive_row\endcsname
+ \begincsname\m_tabl_ntb_prefix\c!y\m_tabl_ntb_negative_row\endcsname
+ \naturaltablelocalparameter\c!extras
+ \letnaturaltablelocalparameter\c!extras\relax % new, see x-fo
+ \begincsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\endcsname
+ \begincsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_negative_col\endcsname
+ \naturaltablelocalparameter\c!extras
+ \letnaturaltablelocalparameter\c!extras\relax % new, see x-fo
+ % first/last combinations
+ \ifnum\m_tabl_ntb_positive_row=\plusone
+ \begincsname\m_tabl_ntb_prefix\c!y\v!first\endcsname
+ \begincsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\c!y\v!first\endcsname
+ \fi
+ \ifnum\m_tabl_ntb_positive_col=\plusone
+ \begincsname\m_tabl_ntb_prefix\c!x\v!first\endcsname
+ \begincsname\m_tabl_ntb_prefix\c!x\v!first\c!y\m_tabl_ntb_positive_row\endcsname
+ \fi
+ \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax
+ \begincsname\m_tabl_ntb_prefix\c!y\v!last\endcsname
+ \begincsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\c!y\v!last\endcsname
+ \fi
+ \ifnum\m_tabl_ntb_positive_col=\c_tabl_ntb_maximum_col\relax
+ \begincsname\m_tabl_ntb_prefix\c!x\v!last\endcsname
+ \begincsname\m_tabl_ntb_prefix\c!x\v!last\c!y\m_tabl_ntb_positive_row\endcsname
+ \fi
+ \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax \ifnum\m_tabl_ntb_positive_col=\c_tabl_ntb_maximum_col\relax
+ \begincsname\m_tabl_ntb_prefix\c!x\v!last\c!y\v!last\endcsname
+ \fi\fi
+ \ifnum\m_tabl_ntb_positive_row=\plusone \ifnum\m_tabl_ntb_positive_col=\plusone
+ \begincsname\m_tabl_ntb_prefix\c!x\v!first\c!y\v!first\endcsname
+ \fi\fi
+ \ifnum\m_tabl_ntb_positive_row=\plusone \ifnum\m_tabl_ntb_positive_col=\c_tabl_ntb_maximum_col\relax
+ \begincsname\m_tabl_ntb_prefix\c!x\v!last\c!y\v!first\endcsname
+ \fi\fi
+ \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax \ifnum\m_tabl_ntb_positive_col=\plusone
+ \begincsname\m_tabl_ntb_prefix\c!x\v!first\c!y\v!last\endcsname
+ \fi\fi
+ % special case: two rows and last row : two&first and two&last (round corners)
+ \ifnum\c_tabl_ntb_maximum_row=\plustwo\relax
+ \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax \ifnum\m_tabl_ntb_positive_col=\plusone
+ \begincsname\m_tabl_ntb_prefix\c!x\v!first\c!y\v!two\endcsname
+ \fi\fi
+ \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax \ifnum\m_tabl_ntb_positive_col=\c_tabl_ntb_maximum_col\relax
+ \begincsname\m_tabl_ntb_prefix\c!x\v!last\c!y\v!two\endcsname
+ \fi\fi
+ \fi
+ \ifnum\tabl_ntb_get_col\m_tabl_ntb_positive_row\m_tabl_ntb_positive_col=\c_tabl_ntb_maximum_col\relax % top span over whole width
+ \ifnum\m_tabl_ntb_positive_row=\plusone
+ \begincsname\m_tabl_ntb_prefix\c!x\v!one\c!y\v!first\endcsname
+ \fi
+ \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax
+ \begincsname\m_tabl_ntb_prefix\c!x\v!one\c!y\v!last\endcsname
+ \fi
+ \fi
+ % header things
+ \ifnum#1>\c_tabl_ntb_n_of_hdnx_lines\else
+ \begincsname\m_tabl_ntb_prefix\v!header\v!each\endcsname
+ \begincsname\m_tabl_ntb_prefix\v!header\m_tabl_ntb_positive_col\endcsname
+ \fi
+ % explicit cells
+ \begincsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\c!y\m_tabl_ntb_positive_row\endcsname
+ \begincsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_negative_col\c!y\m_tabl_ntb_negative_row\endcsname
+ % local
+ \begincsname\m_tabl_ntb_prefix\c!y++\m_tabl_ntb_positive_row\endcsname
+ % done
+ \relax}
+
+% we cannot use +n (checking on number/last/first would slow down too much)
+%
+% \setupTABLE[r] [2][color=red]
+% \setupTABLE[r] [-2][color=red]
+% \setupTABLE[c] [2][color=green]
+% \setupTABLE[c] [-2][color=green]
+% \setupTABLE[4] [4][color=blue]
+% \setupTABLE[-4][-4][color=blue]
+%
+% \bTABLE
+% \dorecurse{10}{\bTR \dorecurse{6}{\bTD xxx \eTD} \eTR}
+% \eTABLE
+
+\let\m_tabl_ntb_before_split\empty
+\let\m_tabl_ntb_after_split \empty
+\let\m_tabl_ntb_same_page \empty
+
+% split + page:
+%
+% \bTABLE[split=yes]
+% \bTR \bTD left \eTD\bTD right \eTD\eTR
+% \bTR[after=\page] \bTD left \eTD\bTD right \eTD\eTR
+% \bTR \bTD left \eTD\bTD right \eTD\eTR
+% \eTABLE
+
+\unexpanded\def\tabl_ntb_tr
+ {\c_tabl_ntb_running_col\zerocount
+ \c_tabl_ntb_encountered_col\zerocount
+ \advance\c_tabl_ntb_maximum_row\plusone
+ \iffirstargument
+ \expandafter\tabl_ntb_tr_yes
+ \else
+ \expandafter\gobbleoneoptional
+ \fi}
+
+\def\tabl_ntb_tr_yes[#1]%
+ {\setvalue{\??naturaltableset\m_tabl_tbl_level:\c!y++\the\c_tabl_ntb_maximum_row}{\setupcurrentnaturaltablelocal[#1]}}
+
+\def\m_tabl_ntb_default_nr{\naturaltableparameter\c!nr}
+\def\m_tabl_ntb_default_nc{\naturaltableparameter\c!nc}
+
+\unexpanded\def\tabl_ntb_td
+ {\advance\c_tabl_ntb_encountered_col\plusone
+ \iffirstargument
+ \expandafter\tabl_ntb_td_yes
+ \else
+ \expandafter\tabl_ntb_td_nop
+ \fi}
+
+\def\tabl_ntb_td_yes[#1]#2\eTD
+ {\letnaturaltableparameter\c!ny \m_tabl_ntb_default_nr
+ \letnaturaltableparameter\c!nx \m_tabl_ntb_default_nc
+ \letnaturaltableparameter\c!nc \plusone
+ \letnaturaltableparameter\c!nr \plusone
+ \letnaturaltableparameter\c!n \c_tabl_ntb_running_col
+ \letnaturaltableparameter\c!m \empty
+ \letnaturaltableparameter\c!action\empty % not that important
+ \setupcurrentnaturaltable[#1]%
+ %
+ \c_tabl_ntb_nx\naturaltableparameter\c!nx\relax
+ \c_tabl_ntb_ny\naturaltableparameter\c!ny\relax
+ % goto first cell n/m=cellnumber
+ \edef\m_tabl_ntb_n{\naturaltableparameter\c!n}%
+ \edef\m_tabl_ntb_m{\naturaltableparameter\c!m}%
+ %
+ \ifx\m_tabl_ntb_n\empty
+ \global\advance\c_tabl_ntb_spn\c_tabl_ntb_nx\relax
+ \orelse\ifnum\m_tabl_ntb_n=\c_tabl_ntb_running_col\else
+ \tabl_ntb_td_pass_n{#1}%
+ \fi
+ \ifx\m_tabl_ntb_m\empty \else
+ \ifnum\m_tabl_ntb_m=\c_tabl_ntb_running_col\else
+ \tabl_ntb_td_pass_m{#1}%
+ \fi
+ \fi
+ \doloop % skip over columns that result from earlier span
+ {\advance\c_tabl_ntb_running_col\plusone
+ \ifcsname\tabl_ntb_tag_pattern\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col\endcsname \else
+ \exitloop
+ \fi}%
+ % fill r*c cells and set span
+ \c_tabl_ntb_nx\naturaltableparameter\c!nx\relax
+ \c_tabl_ntb_ny\naturaltableparameter\c!ny\relax
+ \ifnum\c_tabl_ntb_nx=\plusone
+ \ifnum\c_tabl_ntb_ny=\plusone
+ \ifnum\c_tabl_ntb_running_col>\c_tabl_ntb_maximum_col\relax
+ \c_tabl_ntb_maximum_col\c_tabl_ntb_running_col
+ \fi
+ \else
+ \tabl_ntb_cell_preset
+ \fi
+ \else
+ \tabl_ntb_cell_preset
+ \fi
+ % set values
+ \tabl_ntb_let_tag\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col\c_tabl_ntb_cell
+ \tabl_ntb_set_col\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_nx}%
+ \tabl_ntb_set_row\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_ny}%
+ % the action key will change!
+ \tabl_ntb_set_ref\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\naturaltableparameter\c!action}%
+ % save text
+ \normalexpanded
+ {\tabl_ntb_set_txt_process\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_maximum_row}{\the\c_tabl_ntb_running_col}}%
+ {#1}{#2}%
+ \ifnum\c_tabl_ntb_encountered_col>\c_tabl_ntb_encountered_max
+ \c_tabl_ntb_encountered_max\c_tabl_ntb_encountered_col
+ \fi}
+
+\def\tabl_ntb_td_nop[#1]#2\eTD
+ {\global\advance\c_tabl_ntb_spn\plusone\relax
+ \doloop
+ {\advance\c_tabl_ntb_running_col\plusone
+ \ifcsname\tabl_ntb_tag_pattern\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col\endcsname \else
+ \exitloop
+ \fi}%
+ \c_tabl_ntb_nx\plusone
+ \c_tabl_ntb_ny\plusone
+ \ifnum\c_tabl_ntb_running_col>\c_tabl_ntb_maximum_col\relax
+ \c_tabl_ntb_maximum_col\c_tabl_ntb_running_col
+ \fi
+ \tabl_ntb_let_tag\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col\c_tabl_ntb_cell
+ \tabl_ntb_set_col\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_nx}%
+ \tabl_ntb_set_row\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_ny}%
+ \tabl_ntb_let_ref\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col\empty
+ \normalexpanded
+ {\tabl_ntb_set_txt_process\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_maximum_row}{\the\c_tabl_ntb_running_col}}%
+ {#1}{#2}%
+ \ifnum\c_tabl_ntb_encountered_col>\c_tabl_ntb_encountered_max
+ \c_tabl_ntb_encountered_max\c_tabl_ntb_encountered_col
+ \fi}
+
+\def\tabl_ntb_td_pass_n#1%
+ {\scratchcounter\numexpr\m_tabl_ntb_n-\c_tabl_ntb_running_col+\minusone-\c_tabl_ntb_spn\relax
+ \ifnum\scratchcounter>\zerocount
+ \normalexpanded{\tabl_ntb_td[\c!nx=\the\scratchcounter,\c!n=,\c!m=,*sq=\v!no]}\eTD
+ \fi
+ \letnaturaltableparameter\c!ny\m_tabl_ntb_default_nr
+ \letnaturaltableparameter\c!nx\m_tabl_ntb_default_nc
+ \letnaturaltableparameter\c!nc\plusone
+ \letnaturaltableparameter\c!nr\plusone
+ \setupcurrentnaturaltable[#1]%
+ \letnaturaltableparameter\c!n \empty
+ \letnaturaltableparameter\c!m \empty}
+
+\def\tabl_ntb_td_pass_m#1%
+ {\scratchcounter\numexpr\m_tabl_ntb_m-\c_tabl_ntb_running_col+\minusone-\c_tabl_ntb_spn\relax
+ \dorecurse\scratchcounter{\normalexpanded{\tabl_ntb_td[\c!n=,\c!m=]}\eTD}%
+ % can be sped up
+ \letnaturaltableparameter\c!ny\m_tabl_ntb_default_nr
+ \letnaturaltableparameter\c!nx\m_tabl_ntb_default_nc
+ \letnaturaltableparameter\c!nc\plusone
+ \letnaturaltableparameter\c!nr\plusone
+ \setupcurrentnaturaltable[#1]%
+ \letnaturaltableparameter\c!n \empty
+ \letnaturaltableparameter\c!m \empty}
+
+\def\tabl_ntb_cell_preset
+ {\c_tabl_ntb_current_row\c_tabl_ntb_maximum_row
+ \c_tabl_ntb_current_col\c_tabl_ntb_running_col
+ \dorecurse\c_tabl_ntb_ny\tabl_ntb_cell_preset_rows
+ % check max column
+ \advance\c_tabl_ntb_current_col\minusone
+ \ifnum\c_tabl_ntb_current_col>\c_tabl_ntb_maximum_col\relax
+ \c_tabl_ntb_maximum_col\c_tabl_ntb_current_col
+ \fi}
+
+\def\tabl_ntb_cell_preset_rows
+ {\c_tabl_ntb_current_col\c_tabl_ntb_running_col
+ \tabl_ntb_set_col\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\c_tabl_ntb_nx}%
+ \ifnum\c_tabl_ntb_nx>\c_tabl_ntb_maximum_row_span\relax
+ \c_tabl_ntb_maximum_row_span\c_tabl_ntb_nx
+ \fi
+ \dorecurse\c_tabl_ntb_nx\tabl_ntb_cell_preset_cells
+ \advance\c_tabl_ntb_current_row\plusone}
+
+\def\tabl_ntb_cell_preset_cells
+ {\tabl_ntb_let_tag\c_tabl_ntb_current_row\c_tabl_ntb_current_col\c_tabl_ntb_none
+ \advance\c_tabl_ntb_current_col\plusone}
+
+%D The usage of n and m:
+%D
+%D \startbuffer
+%D \bTABLE[width=3em]
+%D \bTR\bTD d1 \eTD\bTD[n=2] d2 \eTD\bTD[n=5] d5 \eTD\bTD[n=7] d7 \eTD\eTR
+%D \bTR\bTD f1 \eTD\bTD[n=4] f4 \eTD\bTD[n=5] f5 \eTD\bTD[n=7] f7 \eTD\eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \bTABLE[width=3em]
+%D \bTR\bTD d1 \eTD\bTD[m=2] d2 \eTD\bTD[m=5] d5 \eTD\bTD[m=7] d7 \eTD\eTR
+%D \bTR\bTD f1 \eTD\bTD[m=4] f4 \eTD\bTD[m=5] f5 \eTD\bTD[m=7] f7 \eTD\eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \bTABLE[frame=on]
+%D \bTR \bTH[nc=3] One \eTH \bTH[m=4] Four \eTH\eTR
+%D \bTR \bTD a \eTD\bTD b \eTD\bTD c \eTD\bTD d \eTD\eTR
+%D \eTABLE
+%D
+%D \bTABLE[frame=on]
+%D \bTR \bTH[nr=2] One \eTH \bTH[m=3] Three \eTH\eTR
+%D \bTR \bTD[m=3] a \eTD\bTD b \eTD\bTD c \eTD\bTD d \eTD\eTR
+%D \bTR \bTD[m=3] a \eTD\bTD b \eTD\bTD c \eTD\bTD d \eTD\eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\tabl_ntb_th[#1]#2\eTH
+ {\tabl_ntb_td[#1,\c!color=\naturaltablelocalparameter\c!headcolor,\c!style=\naturaltablelocalparameter\c!headstyle,\c!aligncharacter=\v!no]#2\eTD}
+
+\def\tabl_ntb_tn[#1]#2\eTN
+ {\tabl_ntb_td[#1]\digits#2\relax\eTD}
+
+%D Vit Zyka needed the option to create a distance between columns, so I added
+%D support for individual column distances.
+%D
+%D \startbuffer
+%D % \setupTABLE[c][each][distance=2em]
+%D \setupTABLE[c][1][distance=2em]
+%D \setupTABLE[c][2][distance=3em]
+%D
+%D \bTABLE
+%D \bTR \bTD test \eTD \bTD test \eTD \bTD test \eTD \eTR
+%D \bTR \bTD[nx=2] test \eTD \bTD test \eTD \eTR
+%D \bTR \bTD test \eTD \bTD[nx=2] test \eTD \eTR
+%D \eTABLE
+%D
+%D \bTABLE[option=stretch]
+%D \bTR \bTD test \eTD \bTD test \eTD \bTD test \eTD \eTR
+%D \bTR \bTD[nx=2] test \eTD \bTD test \eTD \eTR
+%D \bTR \bTD test \eTD \bTD[nx=2] test \eTD \eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection
+%D
+%D and he provided patches for the global left and right margin distances as well as
+%D the columndistance (although i changed the names -). Here is his testcase:
+%D
+%D \startbuffer
+%D \framed[offset=overlay]\bgroup
+%D \setupTABLE[column][2][align=left]%
+%D \setupTABLE[column][3][align=right]%
+%D \bTABLE[columndistance=2cm,leftmargindistance=.3cm,rightmargindistance=.5cm]
+%D \bTR \bTH[nc=3] Table head\eTH \eTR
+%D \bTR \bTD[nc=2] AB\eTD \bTD C\eTD \eTR
+%D \bTR \bTD[nc=2,align=left] AB\eTD \bTD C\eTD \eTR
+%D \bTR \bTD[nc=2,align=middle] AB\eTD \bTD C\eTD \eTR
+%D \bTR \bTD A\eTD \bTD B\eTD \bTD C\eTD \eTR
+%D \bTR \bTD Aa\eTD \bTD Bb\eTD \bTD Cccc\eTD \eTR
+%D \bTR \bTD[nc=3,align=middle] ABC\eTD \eTR
+%D \eTABLE
+%D \egroup
+%D \stopbuffer
+%D
+%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection
+
+% to be done: head <raw> foot, dus state var
+
+\unexpanded\def\bTABLEhead{\dosingleempty\tabl_ntb_head} \let\eTABLEhead\relax
+\unexpanded\def\bTABLEnext{\dosingleempty\tabl_ntb_next} \let\eTABLEnext\relax
+\unexpanded\def\bTABLEbody{\dosingleempty\tabl_ntb_body} \let\eTABLEbody\relax
+\unexpanded\def\bTABLEfoot{\dosingleempty\tabl_ntb_foot} \let\eTABLEfoot\relax
+
+\def\tabl_ntb_head[#1]#2\eTABLEhead{\appendtoks\tabl_ntb_section[#1]{#2}\to\t_tabl_ntb_head}
+\def\tabl_ntb_next[#1]#2\eTABLEnext{\appendtoks\tabl_ntb_section[#1]{#2}\to\t_tabl_ntb_next}
+\def\tabl_ntb_body[#1]#2\eTABLEbody{\appendtoks\tabl_ntb_section[#1]{#2}\to\t_tabl_ntb_body}
+\def\tabl_ntb_foot[#1]#2\eTABLEfoot{\appendtoks\tabl_ntb_section[#1]{#2}\to\t_tabl_ntb_foot}
+
+\def\tabl_ntb_section[#1]#2% also used in tabl-nte
+ {\unexpanded\def\tabl_ntb_setup_section{\setupcurrentnaturaltablelocal[#1]}%
+ #2%
+ \let\tabl_ntb_setup_section\relax}
+
+\def\tabl_ntb_preset_parameters% each odd|even level / can be sped up but only once per table
+ {\begincsname\??naturaltableset\m_tabl_tbl_level:\v!start\v!each\endcsname
+ \begincsname\??naturaltableset\m_tabl_tbl_level:\v!start\v!oddeven\m_tabl_tbl_level\endcsname
+ \begincsname\??naturaltableset\m_tabl_tbl_level:\v!start\m_tabl_tbl_level\endcsname}
+
+\unexpanded\def\bTABLE
+ {\dosingleempty\tabl_ntb_table}
+
+\def\tabl_ntb_table[#1]%
+ {\tabl_ntb_table_push
+ % box not here
+ \bgroup
+ \pushpostponednodedata
+ \t_tabl_ntb_head\emptytoks
+ \t_tabl_ntb_next\emptytoks
+ \t_tabl_ntb_body\emptytoks
+ \t_tabl_ntb_foot\emptytoks
+ \ifhmode\kern\zeropoint\fi % blocks \removeunwantedspaces: check this on icare handelingsschema
+ \resetcharacteralign % new
+ \setupcurrentnaturaltablelocal[\c!align={\v!right,\v!broad,\v!high},#1]%
+ %
+ \d_tabl_ntb_leftmargindistance \naturaltablelocalparameter\c!leftmargindistance\relax
+ \d_tabl_ntb_rightmargindistance\naturaltablelocalparameter\c!rightmargindistance\relax
+ \d_tabl_ntb_columndistance \naturaltablelocalparameter\c!columndistance\relax
+ \d_tabl_ntb_maxwidth \naturaltablelocalparameter\c!maxwidth\relax
+ %
+ \usesetupsparameter\naturaltablelocalparameter
+ \doifelse{\naturaltablelocalparameter\c!textwidth}\v!local
+ {\hsize\availablehsize}
+ {\hsize\naturaltablelocalparameter\c!textwidth}%
+ \enableTBLbreakfalse
+ \multipleTBLheadsfalse
+ \autoTBLspreadfalse
+ \tightTBLcolspanfalse
+ \processaction
+ [\naturaltablelocalparameter\c!split]
+ [ \v!yes=>\enableTBLbreaktrue,
+ \v!repeat=>\enableTBLbreaktrue\multipleTBLheadstrue,
+ \v!auto=>\ifinsidesplitfloat\enableTBLbreaktrue\fi]
+ \processaction
+ [\naturaltablelocalparameter\c!header]
+ [\v!repeat=>\multipleTBLheadstrue]%
+ \tabl_ntb_preset_parameters
+ \processallactionsinset
+ [\naturaltablelocalparameter\c!option]
+ [\v!stretch=>\autoTBLspreadtrue,%
+ \v!tight=>\tightTBLcolspantrue]%
+ \linewidth\naturaltablelocalparameter\c!rulethickness % needs to be frozen
+ \dontcomplain
+ \c_tabl_ntb_running_col \zerocount
+ \c_tabl_ntb_maximum_col \zerocount
+ \c_tabl_ntb_maximum_row \zerocount
+ \c_tabl_ntb_maximum_row_span\plusone
+ \let\currentTABLErow \tabl_ntb_current_row
+ \let\currentTABLEcolumn\tabl_ntb_current_column
+ \let\nofTABLErows \tabl_ntb_n_of_rows
+ \let\nofTABLEcolumns \tabl_ntb_n_of_columns
+ \let\bTR\dobTR
+ \let\bTD\dobTD
+ \let\bTH\dobTH
+ \let\bTN\dobTN}
+
+\def\tabl_ntb_current_row {\m_tabl_ntb_positive_row}
+\def\tabl_ntb_current_column{\m_tabl_ntb_positive_col}
+\def\tabl_ntb_n_of_rows {\number\c_tabl_ntb_maximum_row}
+\def\tabl_ntb_n_of_columns {\number\c_tabl_ntb_maximum_col}
+
+\let\currentTABLErow \!!zerocount
+\let\currentTABLEcolumn\!!zerocount
+\let\nofTABLErows \!!zerocount
+\let\nofTABLEcolumns \!!zerocount
+
+% there is no gain in a \doifelsenextoptionalcs variant
+
+\unexpanded\def\dobTR{\dosingleempty\tabl_ntb_tr} % also used in tabl-nte
+\unexpanded\def\dobTD{\dosingleempty\tabl_ntb_td} % also used in tabl-nte
+\unexpanded\def\dobTH{\dosingleempty\tabl_ntb_th} % also used in tabl-nte
+\unexpanded\def\dobTN{\dosingleempty\tabl_ntb_tn} % also used in tabl-nte
+
+% permits \expanded{\bTD ... \eTD}
+
+\let\bTR\relax \unexpanded\def\eTR{\ignorespaces} % handy in case we use a macro to generate rows
+\let\bTD\relax \unexpanded\def\eTD{\ignorespaces}
+\let\bTH\relax \unexpanded\def\eTH{\ignorespaces}
+\let\bTN\relax \unexpanded\def\eTN{\ignorespaces}
+
+\unexpanded\def\eTABLE % beware, we need to get rid of spurious spaces when in hmode
+ {% tricky and dirty order -)
+ \setfalse\c_tabl_ntb_okay
+ % head
+ \doifelsesometoks\t_tabl_ntb_head % slow, better a flag
+ {\c_tabl_ntb_head\numexpr\c_tabl_ntb_maximum_row+\plusone\relax
+ \the\t_tabl_ntb_head
+ \c_tabl_ntb_n_of_head_lines\c_tabl_ntb_maximum_row\relax
+ \doifelsesometoks\t_tabl_ntb_next
+ {\the\t_tabl_ntb_next
+ \c_tabl_ntb_n_of_next_lines\numexpr\c_tabl_ntb_maximum_row-\c_tabl_ntb_n_of_head_lines\relax}%
+ {\c_tabl_ntb_n_of_next_lines\zerocount}% was 1
+ \c_tabl_ntb_n_of_hdnx_lines\c_tabl_ntb_maximum_row}
+ {\c_tabl_ntb_head\zerocount
+ \c_tabl_ntb_n_of_head_lines\zerocount % was 1
+ \c_tabl_ntb_n_of_next_lines\zerocount
+ \c_tabl_ntb_n_of_hdnx_lines\zerocount}%
+ % body
+ \c_tabl_ntb_body\numexpr\c_tabl_ntb_maximum_row+\plusone\relax
+ \the\t_tabl_ntb_body
+ % foot
+ \doifelsesometoks\t_tabl_ntb_foot
+ {\c_tabl_ntb_foot\numexpr\c_tabl_ntb_maximum_row+\plusone\relax
+ \the\t_tabl_ntb_foot}%
+ {\c_tabl_ntb_foot\zerocount}%
+ % done
+ \removeunwantedspaces % only if hmode
+ % finish cells
+ \tabl_ntb_loop_one
+ % to be sure
+ \tabl_ntb_loop_two
+ % check and do
+ \ifcase\c_tabl_ntb_maximum_col\else
+ \startTBLprocessing
+ \tabl_ntb_table_start
+ \dorecurse\c_tabl_ntb_maximum_row
+ {\tabl_ntb_row_start
+ \c_tabl_ntb_current_row\recurselevel\relax
+ \dorecurse\c_tabl_ntb_maximum_col
+ {\c_tabl_ntb_current_col\recurselevel\relax
+ \normalexpanded{\tabl_ntb_cell{\the\c_tabl_ntb_current_row}{\the\c_tabl_ntb_current_col}}}%
+ \tabl_ntb_row_stop}%
+ \removeunwantedspaces % only if hmode
+ \tabl_ntb_table_stop
+ \stopTBLprocessing
+ % wrong ! ! ! better to have an auto-offset-overlay
+ % \ifnum\m_tabl_tbl_level>1
+ % \vskip-\strutdp
+ % \fi
+ \fi
+ % tracing
+ % \iftrue
+ % \blank \tttf
+ % \dorecurse\c_tabl_ntb_maximum_row
+ % {\c_tabl_ntb_current_row\recurselevel\relax
+ % \dorecurse\c_tabl_ntb_maximum_col
+ % {\c_tabl_ntb_current_col\recurselevel\relax
+ % [r=\the\c_tabl_ntb_current_row,c=\the\c_tabl_ntb_current_col,h=\the\dimexpr\tabl_ntb_get_ht\c_tabl_ntb_current_row\c_tabl_ntb_current_col,w=\the\dimexpr\tabl_ntb_get_wd\c_tabl_ntb_current_row\c_tabl_ntb_current_col]}%
+ % \par}%
+ % \blank
+ % \fi
+ \poppostponednodedata
+ \egroup
+ \tabl_ntb_table_pop}
+
+\def\tabl_ntb_loop_one
+ {\dorecurse\c_tabl_ntb_maximum_row{\tabl_ntb_loop_one_rows}}
+
+\def\tabl_ntb_loop_one_rows
+ {\c_tabl_ntb_current_row\recurselevel\relax
+ \dorecurse\c_tabl_ntb_maximum_col\tabl_ntb_loop_one_cells}
+
+\def\tabl_ntb_loop_one_cells
+ {\c_tabl_ntb_current_col\recurselevel\relax
+ \ifcsname\tabl_ntb_tag_pattern\c_tabl_ntb_current_row\c_tabl_ntb_current_col\endcsname \else
+ \tabl_ntb_loop_one_cells_indeed
+ \fi}
+
+\def\tabl_ntb_loop_one_cells_indeed
+ {\c_tabl_ntb_current_col_two\c_tabl_ntb_current_col
+ \c_tabl_ntb_current_row_two\c_tabl_ntb_current_row
+ \c_tabl_ntb_current_row_one\c_tabl_ntb_current_row
+ \doloop
+ {\c_tabl_ntb_current_col_one\c_tabl_ntb_current_col
+ \doloop
+ {\ifcsname\tabl_ntb_tag_pattern\c_tabl_ntb_current_row_one\c_tabl_ntb_current_col_one\endcsname
+ \exitloop
+ \else
+ \advance\c_tabl_ntb_current_col_one\plusone
+ \ifnum\c_tabl_ntb_current_col_one>\c_tabl_ntb_maximum_col\relax
+ \exitloop
+ \fi
+ \fi}%
+ \ifcsname\tabl_ntb_tag_pattern\c_tabl_ntb_current_row_one\c_tabl_ntb_current_col_one\endcsname
+ \exitloop
+ \else
+ \c_tabl_ntb_current_row_two\c_tabl_ntb_current_row_one
+ \c_tabl_ntb_current_col_two\c_tabl_ntb_current_col_one
+ \advance\c_tabl_ntb_current_row_one\plusone
+ \ifnum\c_tabl_ntb_current_row_one>\c_tabl_ntb_maximum_row
+ \exitloop
+ \fi
+ \fi}%
+ \ifnum\c_tabl_ntb_current_row_two>\c_tabl_ntb_maximum_row\c_tabl_ntb_current_row_two\c_tabl_ntb_maximum_row\fi
+ \ifnum\c_tabl_ntb_current_col_two>\c_tabl_ntb_maximum_col\c_tabl_ntb_current_col_two\c_tabl_ntb_maximum_col\fi
+ \c_tabl_ntb_current_row_two\numexpr\c_tabl_ntb_current_row_two-\c_tabl_ntb_current_row+\plusone\relax
+ \c_tabl_ntb_current_col_two\numexpr\c_tabl_ntb_current_col_two-\c_tabl_ntb_current_col+\plusone\relax
+ \c_tabl_ntb_current_row_one\c_tabl_ntb_current_row
+ \dorecurse\c_tabl_ntb_current_row_two
+ {\c_tabl_ntb_current_col_one\c_tabl_ntb_current_col
+ \tabl_ntb_set_col\c_tabl_ntb_current_row_one\c_tabl_ntb_current_col_one{\the\c_tabl_ntb_current_col_two}%
+ \dorecurse\c_tabl_ntb_current_col_two
+ {\tabl_ntb_let_tag\c_tabl_ntb_current_row_one\c_tabl_ntb_current_col_one\c_tabl_ntb_none
+ \advance\c_tabl_ntb_current_col_one\plusone}%
+ \advance\c_tabl_ntb_current_row_one\plusone}%
+ \tabl_ntb_let_tag\c_tabl_ntb_current_row\c_tabl_ntb_current_col\c_tabl_ntb_cell
+ \tabl_ntb_set_col\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\c_tabl_ntb_current_col_two}%
+ \tabl_ntb_set_row\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\c_tabl_ntb_current_row_two}%
+ \ifautoTBLemptycell
+ \normalexpanded
+ {\tabl_ntb_set_txt_process\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\c_tabl_ntb_current_row}{\the\c_tabl_ntb_current_col}}%
+ {\c!option=\v!tight}{\strut\kern\scaledpoint}% the kern forces the tight
+ \fi}
+
+\def\tabl_ntb_loop_two
+ {\dorecurse\c_tabl_ntb_maximum_row\tabl_ntb_loop_two_rows}
+
+\def\tabl_ntb_loop_two_rows
+ {\c_tabl_ntb_current_row\recurselevel\relax
+ \dorecurse\c_tabl_ntb_maximum_col\tabl_ntb_loop_two_cells}
+
+\def\tabl_ntb_loop_two_cells
+ {\c_tabl_ntb_current_col\recurselevel\relax
+ \ifcsname\tabl_ntb_row_pattern\c_tabl_ntb_current_row\c_tabl_ntb_current_col\endcsname
+ \scratchcounter\numexpr\c_tabl_ntb_maximum_row-\c_tabl_ntb_current_row+\plusone\relax
+ \ifnum\tabl_ntb_get_row\c_tabl_ntb_current_row\c_tabl_ntb_current_col>\scratchcounter
+ \tabl_ntb_set_row\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\scratchcounter}%
+ \fi
+ \fi
+ \tabl_ntb_let_ht\c_tabl_ntb_current_row\c_tabl_ntb_current_col\zeropoint
+ %tabl_ntb_let_wd\c_tabl_ntb_current_row\c_tabl_ntb_current_col\zeropoint
+ \ifcsname\tabl_ntb_col_pattern\c_tabl_ntb_current_row\c_tabl_ntb_current_col\endcsname \else
+ \tabl_ntb_let_col\c_tabl_ntb_current_row\c_tabl_ntb_current_col\zerocount
+ \fi
+ \ifcsname\tabl_ntb_tag_pattern\c_tabl_ntb_current_row\c_tabl_ntb_current_col\endcsname \else
+ \tabl_ntb_let_tag\c_tabl_ntb_current_row\c_tabl_ntb_current_col\c_tabl_ntb_none
+ \fi}
+
+\let\startTBLprocessing\relax % public
+\let\stopTBLprocessing \relax % public
+
+\newcount\c_tabl_prelocated_rows % \prelocateTBLrows{1000} may speed up large tables
+
+% \def\tabl_ntb_row_start{\t_tabl_ntb_row\emptytoks}
+% \def\tabl_ntb_row_stop {\normalexpanded{\t_tabl_ntb{\the\t_tabl_ntb\noexpand\tabl_ntb_row_align_start\the\t_tabl_ntb_row\tabl_ntb_row_align_stop}}}
+
+\def\tabl_ntb_row_start
+ {\t_tabl_ntb_row\emptytoks}
+
+\def\tabl_ntb_row_stop
+ {\ifenableTBLbreak
+ \tabl_ntb_row_stop_split
+ \else
+ \tabl_ntb_row_stop_boxed
+ \fi}
+
+\def\tabl_ntb_row_stop_boxed
+ {% \noindent % no, else double leftskip in narrower
+ \etoksapp\t_tabl_ntb
+ {% no need for init
+ \tabl_ntb_row_align_start
+ \the\t_tabl_ntb_row
+ \tabl_ntb_row_align_stop}}
+
+\def\tabl_ntb_row_stop_split
+ {\ifcsname\??naturaltableset\m_tabl_tbl_level:\c!y++\the\c_tabl_ntb_current_row\endcsname
+ \tabl_ntb_row_stop_split_yes
+ \else
+ \tabl_ntb_row_stop_split_nop
+ \fi}
+
+\def\tabl_ntb_row_stop_split_nop
+ {\etoksapp\t_tabl_ntb
+ {\tabl_ntb_row_align_reset
+ \tabl_ntb_row_align_start
+ \the\t_tabl_ntb_row
+ \tabl_ntb_row_align_stop}}
+
+\def\tabl_ntb_row_stop_split_yes
+ {\begingroup
+ \csname\??naturaltableset\m_tabl_tbl_level:\c!y++\the\c_tabl_ntb_current_row\endcsname
+ \xdef\m_tabl_ntb_before_split{\naturaltablelocalparameter\c!before}% to be checked
+ \xdef\m_tabl_ntb_after_split {\naturaltablelocalparameter\c!after}% to be checked
+ \xdef\m_tabl_ntb_same_page {\naturaltablelocalparameter\c!samepage}%
+ \endgroup
+ \etoksapp\t_tabl_ntb
+ {\tabl_ntb_row_align_set{\m_tabl_ntb_before_split}{\m_tabl_ntb_after_split}{\m_tabl_ntb_same_page}%
+ \tabl_ntb_row_align_start
+ \the\t_tabl_ntb_row
+ \tabl_ntb_row_align_stop}}
+
+\unexpanded\def\tabl_ntb_row_align_set#1#2#3%
+ {\xdef\m_tabl_ntb_before_split{#1}%
+ \xdef\m_tabl_ntb_after_split {#2}%
+ \xdef\m_tabl_ntb_same_page {#3}}
+
+\unexpanded\def\tabl_ntb_row_align_reset
+ {\glet\m_tabl_ntb_before_split\empty
+ \glet\m_tabl_ntb_after_split \empty
+ \glet\m_tabl_ntb_same_page \empty}
+
+\def\tabl_ntb_prelocate_error
+ {\writestatus\m!TABLE{fatal error: use \string\prelocateTBLrows\space to increase table memory (now: \the\c_tabl_prelocated_rows)}}
+
+% \prelocateTBLrows{1000} % may speed up large tables
+
+\def\prelocateTBLrows#1% we start at zero so we have one to much, better play safe anyway
+ {\dostepwiserecurse\c_tabl_prelocated_rows{#1}\plusone
+ {\expandafter\newtoks\csname\??naturaltabletok\recurselevel\endcsname}%
+ \def\tabl_ntb_row_start
+ {\ifnum\c_tabl_ntb_row<\c_tabl_prelocated_rows\relax
+ \tabl_ntb_prelocate_okay
+ \else
+ \tabl_ntb_prelocate_error
+ \fi}%
+ \def\tabl_ntb_row_stop
+ {\etoksapp\t_tabl_ntb
+ {\tabl_ntb_row_align_start
+ \the\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname
+ \tabl_ntb_row_align_stop}}%
+ \global\c_tabl_prelocated_rows#1\relax}
+
+\def\tabl_ntb_prelocate_okay
+ {\expandafter\let\expandafter\t_tabl_ntb_row\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname\t_tabl_ntb_row\emptytoks}
+
+%D We use aligments to handle the empty (skipped) columns, so that we don't have to
+%D (re|)|calculate these.
+
+\let\m_tabl_ntb_saved_row\!!zerocount
+\let\m_tabl_ntb_saved_col\!!zerocount
+
+\def\tabl_ntb_start_tagged
+ {\scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax
+ \ifnum\scratchcounter=\c_tabl_ntb_head
+ \ifconditional\c_tabl_ntb_okay
+ \dostoptagged
+ \else
+ \settrue\c_tabl_ntb_okay
+ \fi
+ \dostarttagged\t!tablehead\empty
+ \orelse\ifnum\scratchcounter=\c_tabl_ntb_body
+ \ifconditional\c_tabl_ntb_okay
+ \dostoptagged
+ \else
+ \settrue\c_tabl_ntb_okay
+ \fi
+ \dostarttagged\t!tablebody\empty
+ \orelse\ifnum\scratchcounter=\c_tabl_ntb_foot
+ \ifconditional\c_tabl_ntb_okay
+ \dostoptagged
+ \else
+ \settrue\c_tabl_ntb_okay
+ \fi
+ \dostarttagged\t!tablefoot\empty
+ \fi
+ \dostarttagged\t!tablerow\empty}
+
+\def\tabl_ntb_stop_tagged
+ {\dostoptagged
+ \ifconditional\c_tabl_ntb_okay
+ \scratchcounter\numexpr\c_tabl_ntb_row+\plustwo\relax
+ \ifnum\scratchcounter=\c_tabl_ntb_body
+ \dostoptagged
+ \setfalse\c_tabl_ntb_okay
+ \orelse\ifnum\scratchcounter=\c_tabl_ntb_foot
+ \dostoptagged
+ \setfalse\c_tabl_ntb_okay
+ \orelse\ifnum\scratchcounter>\c_tabl_ntb_maximum_row
+ \dostoptagged
+ \setfalse\c_tabl_ntb_okay
+ \fi
+ \fi}
+
+\unexpanded\def\tabl_ntb_row_align_start
+ {\global\advance\c_tabl_ntb_row\plusone
+ \global\c_tabl_ntb_col\plusone
+ \global\c_tabl_ntb_spn\zerocount
+ \tabl_ntb_row_align_start_inject
+ \ifconditional\c_strc_tags_enabled
+ \tabl_ntb_start_tagged
+ \fi
+ \hbox\bgroup
+ \kern\dimexpr\d_tabl_ntb_leftmargindistance\relax}
+
+\unexpanded\def\tabl_ntb_row_align_stop
+ {\kern\dimexpr\d_tabl_ntb_rightmargindistance-\d_tabl_ntb_columndistance\relax
+ \egroup
+ \ifconditional\c_strc_tags_enabled
+ \tabl_ntb_stop_tagged
+ \fi
+ \tabl_ntb_row_align_stop_inject}
+
+\unexpanded\def\tabl_ntb_before_page
+ {\ifx\m_tabl_ntb_same_page\v!before
+ % \blank[\v!samepage,\v!strong]%
+ \unpenalty
+ \nobreak
+ \orelse\ifx\m_tabl_ntb_same_page\v!both
+ % \blank[\v!samepage,\v!strong]%
+ \unpenalty
+ \nobreak
+ \fi}
+
+\unexpanded\def\tabl_ntb_after_page
+ {\ifnum\c_tabl_ntb_row>\c_tabl_ntb_n_of_head_lines
+ \ifnum\tabl_ntb_get_nob\c_tabl_ntb_row=\zerocount
+ \unpenalty
+ \ifx\m_tabl_ntb_same_page\v!after
+ % \blank[\v!samepage,\v!strong]%
+ \nobreak
+ \orelse\ifx\m_tabl_ntb_same_page\v!both
+ % \blank[\v!samepage,\v!strong]%
+ \nobreak
+ \else
+ % \blank[\v!preference,\v!weak]%
+ \allowbreak
+ \fi
+ \fi
+ \else
+ % \blank[\v!preference,\v!weak]%
+ \allowbreak % else no proper head split off
+ \fi}
+
+\unexpanded\def\tabl_ntb_inbetween
+ {\scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax
+ \ifnum\scratchcounter>\c_tabl_ntb_n_of_hdnx_lines\relax
+ \ifnum\scratchcounter<\c_tabl_ntb_maximum_row\relax
+ \edef\p_spaceinbetween{\naturaltablelocalparameter\c!spaceinbetween}%
+ \ifx\p_spaceinbetween\empty\else
+ \blank[\p_spaceinbetween]%
+ \fi
+ \fi
+ \fi}
+
+\unexpanded\def\tabl_ntb_row_align_start_inject
+ {\bgroup % protect local vars
+ \m_tabl_ntb_before_split
+ \egroup
+ \ifenableTBLbreak
+ \tabl_ntb_before_page
+ \fi}
+
+\unexpanded\def\tabl_ntb_row_align_stop_inject
+ {\par
+ \nointerlineskip
+ \ifenableTBLbreak
+ \tabl_ntb_after_page
+ \fi
+ \bgroup % protect local vars
+ \m_tabl_ntb_after_split
+ \egroup
+ \bgroup % protect local vars
+ \tabl_ntb_inbetween
+ \egroup}
+
+\def\tabl_ntb_flush_content
+ {\the\everyTABLEpass
+ \global\c_tabl_ntb_spn\zerocount
+ \global\c_tabl_ntb_col\zerocount
+ \global\c_tabl_ntb_row\zerocount
+ \global\advance\c_tabl_ntb_row\minusone
+ \dostarttaggedchained\t!table\empty\??naturaltable
+ %\registerparoptions % (*) triggers max hsize
+ \the\t_tabl_ntb
+ \dostoptagged}
+
+\unexpanded\def\tabl_ntb_span#1%
+ {\hskip\tabl_ntb_get_dis\c_tabl_ntb_col
+ \dorecurse{#1}
+ {\hskip\tabl_ntb_get_wid\c_tabl_ntb_col\relax
+ \global\advance\c_tabl_ntb_col\plusone}}
+
+\unexpanded\def\tabl_ntb_skip#1%
+ {\global\advance\c_tabl_ntb_col#1\relax}
+
+\unexpanded\def\tabl_ntb_plus
+ {\global\advance\c_tabl_ntb_col\plusone
+ \kern\d_tabl_ntb_columndistance}
+
+\setvalue{\??naturaltablecell\the\c_tabl_ntb_none}#1#2%
+ {\scratchcounter\tabl_ntb_get_col{#1}{#2}\relax
+ \ifnum\scratchcounter>\zerocount
+ \etoksapp\t_tabl_ntb_row
+ {\tabl_ntb_span{\the\scratchcounter}}%
+ \fi}
+
+\setvalue{\??naturaltablecell\the\c_tabl_ntb_cell}#1#2%
+ {\toksapp\t_tabl_ntb_row{\tabl_ntb_pass #1 #2 }% space delimited -> less tokens
+ \scratchcounter\tabl_ntb_get_col{#1}{#2}\relax
+ \ifnum\scratchcounter>\zerocount
+ \etoksapp\t_tabl_ntb_row
+ {\ifnum\scratchcounter=\plusone
+ \tabl_ntb_plus
+ \else
+ \tabl_ntb_skip{\the\scratchcounter}%
+ \fi}%
+ \fi}
+
+\unexpanded\def\tabl_ntb_cell#1#2%
+ {\csname\??naturaltablecell\the\tabl_ntb_get_tag{#1}{#2}\endcsname{#1}{#2}}
+
+\unexpanded\def\tabl_ntb_table_start
+ {\global\c_tabl_ntb_spn\zerocount
+ \global\c_tabl_ntb_row\zerocount
+ \global\c_tabl_ntb_col\zerocount
+ \c_tabl_tbl_pass\zerocount
+ \t_tabl_ntb\emptytoks}
+
+\def\tabl_ntb_pass_one#1 #2 %
+ {\tabl_ntb_get_txt{#1}{#2}}%
+
+\def\tabl_ntb_pass_two#1 #2 % meer in cellD
+ {\d_tabl_ntb_width\zeropoint
+ \scratchcounter\c_tabl_ntb_col
+ \!!counta\tabl_ntb_get_col{#1}{#2}\relax
+ \ifcase\!!counta\or
+ \advance\d_tabl_ntb_width\dimexpr
+ \tabl_ntb_get_wid\scratchcounter
+ \relax
+ \advance\scratchcounter\plusone
+ \else
+ \dorecurse\!!counta
+ {\advance\d_tabl_ntb_width\dimexpr
+ \tabl_ntb_get_wid\scratchcounter
+ \ifnum\recurselevel<\!!counta
+ +\d_tabl_ntb_columndistance
+ +\tabl_ntb_get_dis\scratchcounter
+ \fi
+ \relax
+ \advance\scratchcounter\plusone}%
+ \fi
+ \setbox\scratchbox\hbox{\tabl_ntb_get_txt{#1}{#2}}%
+ \tabl_ntb_set_ht{#1}{#2}{\the\ht\scratchbox}%
+ %tabl_ntb_set_wd{#1}{#2}{\the\wd\scratchbox}%
+ \ifdim\ht\scratchbox>\tabl_ntb_get_hei{#1}\relax
+ \tabl_ntb_set_hei{#1}{\the\ht\scratchbox}%
+ \fi}%
+
+\def\tabl_ntb_pass_three#1 #2 %
+ {% height
+ \dostarttagged\t!tablecell\empty
+ \!!counta \tabl_ntb_get_col{#1}{#2}\relax
+ \!!countb \tabl_ntb_get_row{#1}{#2}\relax
+ \!!heighta\tabl_ntb_get_ht {#1}{#2}\relax
+ \tablecellcolumns\!!counta % used later so don't adapt these
+ \tablecellrows \!!countb % used later so don't adapt these
+ \d_tabl_ntb_height\zeropoint
+ \ifnum\!!counta=\c_tabl_ntb_maximum_col\relax
+ % case: nc=maxcolumns
+ \else
+ \scratchcounter#1\relax
+ \dorecurse\!!countb
+ {\advance\d_tabl_ntb_height\tabl_ntb_get_hei\scratchcounter
+ \advance\scratchcounter\plusone}%
+ \ifdim\d_tabl_ntb_height<\!!heighta\relax
+ \d_tabl_ntb_height\!!heighta
+ \fi
+ \fi
+ % width
+ \d_tabl_ntb_width\zeropoint
+ \scratchcounter\c_tabl_ntb_col
+ \ifcase\!!counta\or
+ \advance\d_tabl_ntb_width\dimexpr
+ \tabl_ntb_get_wid\scratchcounter
+ \relax
+ \advance\scratchcounter\plusone
+ \else
+ \dorecurse\!!counta
+ {\advance\d_tabl_ntb_width\dimexpr
+ \tabl_ntb_get_wid\scratchcounter
+ \ifnum\recurselevel<\!!counta
+ +\d_tabl_ntb_columndistance
+ +\tabl_ntb_get_dis\scratchcounter
+ \fi
+ \relax
+ \advance\scratchcounter\plusone}%
+ \fi
+ % cell
+ \setbox\scratchbox\hbox attr \taggedattribute \attribute\taggedattribute \bgroup
+ \dotagTABLEsignal % maybe we need to add some packaging in this case
+ \tabl_ntb_get_txt{#1}{#2}%
+ \egroup
+ \ifnum\!!counta=\c_tabl_ntb_maximum_col\relax
+ % case: nc=maxcolumns
+ \else
+ \scratchdimen\tabl_ntb_get_hei{#1}%
+ \setbox\scratchbox\hpack
+ {\lower\ht\scratchbox\hpack{\raise\scratchdimen\box\scratchbox}}%
+ \ht\scratchbox\scratchdimen
+ \fi
+ \dp\scratchbox\zeropoint
+ \edef\!!stringa{\tabl_ntb_get_ref{#1}{#2}}%
+ \ifx\!!stringa\empty
+ \box\scratchbox
+ \else
+ \normalexpanded{\noexpand\directgotobox{\box\scratchbox}[\!!stringa]}% to be checked
+ \fi
+ \dostoptagged} % right spot
+
+% \def\tabl_ntb_cell_finalize
+% {\doifnotinset\localwidth{\v!fit,\v!broad}% user set
+% {\scratchdimen\tabl_ntb_get_aut\c_tabl_ntb_col\relax
+% \ifdim\localwidth>\scratchdimen
+% \tabl_ntb_set_aut\c_tabl_ntb_col{\the\dimexpr\localwidth}%
+% \fi}}
+
+\def\tabl_ntb_cell_finalize
+ {\ifx\localwidth\v!fit
+ % nothing
+ \orelse\ifx\localwidth\v!broad
+ % nothing
+ \orelse\ifx\localwidth\empty
+ % nothing (safeguard)
+ \else
+ \tabl_ntb_cell_finalize_indeed
+ \fi}
+
+\def\tabl_ntb_cell_finalize_indeed
+ {\scratchdimen\tabl_ntb_get_aut\c_tabl_ntb_col\relax
+ \ifdim\localwidth>\scratchdimen
+ \tabl_ntb_set_aut\c_tabl_ntb_col{\the\dimexpr\localwidth}%
+ \fi}
+
+\let\tabl_ntb_preroll\relax
+
+\def\tabl_ntb_table_get_max_width
+ {\scratchdimen\wd\scratchbox\relax}
+
+% enable dper 2018-02-22
+
+\def\tabl_ntb_table_get_max_width_step
+ {\advance\scratchdimen\tabl_ntb_get_wid\fastloopindex
+ \advance\scratchdimen\tabl_ntb_get_dis\fastloopindex}
+
+\def\tabl_ntb_table_get_max_width
+ {\scratchdimen\zeropoint
+ \dofastloopcs\c_tabl_ntb_maximum_col\tabl_ntb_table_get_max_width_step
+ \ifdim\scratchdimen<\wd\scratchbox\relax
+ \scratchdimen\wd\scratchbox\relax
+ \fi}
+
+\def\tabl_ntb_table_stop
+ {\forgetall % new, here see narrower-004.tex
+ %\setbox\scratchbox\hbox
+ % {\letnaturaltablelocalparameter\c!frame\v!off
+ % \letnaturaltablelocalparameter\c!background\empty
+ % \letnaturaltablelocalparameter\c!align\v!no
+ % \inheritednaturaltablelocalframed{\strut}}%
+ %\edef\minimalcellheight{\the\ht\scratchbox}% not used
+ \dorecurse\c_tabl_ntb_maximum_col
+ {\tabl_ntb_let_aut\recurselevel\zeropoint
+ % new
+ \c_tabl_ntb_current_col_one\recurselevel\relax
+ \dorecurse\c_tabl_ntb_maximum_row
+ {%tabl_ntb_let_wd\recurselevel\c_tabl_ntb_current_col_one\zeropoint
+ \tabl_ntb_let_ht\recurselevel\c_tabl_ntb_current_col_one\zeropoint}%
+ % till here
+ \tabl_ntb_let_tal\recurselevel\zerocount
+ \tabl_ntb_let_wid\recurselevel\zeropoint
+ \tabl_ntb_let_dis\recurselevel\zeropoint}%
+ \dorecurse\c_tabl_ntb_maximum_row
+ {\tabl_ntb_let_hei\recurselevel\maxdimen}%
+ \tabl_ntb_let_gal\zerocount
+ \tabl_ntb_preroll\relax
+ \c_tabl_tbl_pass\plusone
+ \let\tabl_ntb_pass\tabl_ntb_pass_one
+ \let\tabl_ntb_cell_process\tabl_ntb_cell_process_a
+ \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
+ \ifcase\tabl_ntb_get_gal\or
+ % \c_tabl_tbl_pass\plusone
+ % \let\tabl_ntb_pass\tabl_ntb_pass_one
+ \let\tabl_ntb_cell_process\tabl_ntb_cell_process_a_extra
+ \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
+ \fi
+ \tabl_ntb_let_dis\c_tabl_ntb_maximum_col\zeropoint
+ %
+ \tabl_ntb_table_get_max_width % \scratchdimen\scratchbox
+ %
+ \ifautoTBLspread
+ % experimental, stretch non fixed cells to \hsize
+ \tabl_ntb_check_widths_one % trial run
+ \tabl_ntb_check_widths_two % real run
+ \tabl_ntb_stretch_widths
+ \let\tabl_ntb_cell_process\tabl_ntb_cell_process_b
+ \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
+ % \orelse\ifdim\wd\scratchbox>\hsize
+ \orelse\ifdim\scratchdimen>\hsize
+ \ifautoTBLhsize
+ \tabl_ntb_check_widths_one % trial run
+ \tabl_ntb_check_widths_two % real run
+ \let\tabl_ntb_cell_process\tabl_ntb_cell_process_b
+ \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
+ \fi
+ \orelse\ifautoTBLrowspan
+ \ifnum\c_tabl_ntb_maximum_row_span>\plusone % max ?
+ % added jan 2002 because nx=* did no longer work
+ \ifnum\c_tabl_ntb_encountered_max<\c_tabl_ntb_maximum_col
+ % added jun 2014 because someone had less columns than nx .. sigh / see *nx*
+ \writestatus\m!TABLE{missing\space\number\numexpr\c_tabl_ntb_maximum_col-\c_tabl_ntb_encountered_max\relax\space column(s), guessing widths}%
+ \fi
+ \edef\savedhsize{\the\hsize}%
+ % \hsize\wd\scratchbox\relax % new per 17/04/2006
+ \hsize\scratchdimen\relax % new per 17/04/2006
+ \tabl_ntb_check_widths_one % trial run
+ \tabl_ntb_check_widths_two % real run
+ \hsize\savedhsize
+ \let\tabl_ntb_cell_process\tabl_ntb_cell_process_c
+ \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
+ \fi
+ \fi
+ \let\tabl_ntb_cell_process\tabl_ntb_cell_process_d
+ \c_tabl_tbl_pass\plustwo
+ \let\tabl_ntb_pass\tabl_ntb_pass_two
+ \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
+ \tabl_ntb_check_heights_one
+ \tabl_ntb_check_heights_two
+ \let\tabl_ntb_cell_process\tabl_ntb_cell_process_e
+ \c_tabl_tbl_pass\plusthree
+ \let\tabl_ntb_pass\tabl_ntb_pass_three
+ \ifnum\m_tabl_tbl_level>\plusone
+ \tabl_tbl_split_nop
+ \orelse\ifenableTBLbreak
+ \tabl_tbl_split_yes
+ \else
+ \tabl_tbl_split_nop
+ \fi}
+
+\def\tabl_ntb_stretch_widths % more variants, e.g. a max to \dimend
+ {\ifcase\c_tabl_ntb_maximum_col\else % else division by zero
+ \!!dimend\zeropoint
+ \!!dimene\dimexpr
+ \hsize
+ -\d_tabl_ntb_leftmargindistance
+ -\d_tabl_ntb_rightmargindistance
+ +\d_tabl_ntb_columndistance
+ \relax
+ \dorecurse\c_tabl_ntb_maximum_col
+ {\advance\!!dimend\dimexpr
+ \tabl_ntb_get_wid\recurselevel
+ \relax
+ \advance\!!dimene\dimexpr
+ -\tabl_ntb_get_dis\recurselevel
+ -\d_tabl_ntb_columndistance
+ \relax}%
+ \relax
+ % distribute width (stretch)
+ \ifdim\!!dimend<\!!dimene
+ \advance\!!dimend-\!!dimene
+ \divide\!!dimend\c_tabl_ntb_maximum_col
+ \dorecurse\c_tabl_ntb_maximum_col
+ {\tabl_ntb_set_wid\recurselevel{\the\dimexpr\tabl_ntb_get_wid\recurselevel-\!!dimend\relax}}%
+ \fi
+ \fi}
+
+\def\tabl_tbl_split_nop
+ {\setbox\b_tabl_ntb_final\vbox{\tabl_ntb_flush_content}%
+ \postprocessTABLEbox\b_tabl_ntb_final
+ \beforeTABLEbox
+ % packaging prevents max hsized box
+ % \hbox{\registerparoptions\box\b_tabl_ntb_final}% (*) better here
+ % better :
+ \ifinsidefloat
+ % no \dontleavehmode else too wide, otherwise we get a \hsized box
+ \else
+ \registerparoptions % (*) better here (also does a \dontleavehmode)
+ \ifhmode\else\dontleavehmode\fi
+ \fi
+ \box\b_tabl_ntb_final
+ \afterTABLEbox}
+
+\def\tabl_tbl_split_yes
+ {\ifinsidesplitfloat
+ \donetrue
+ \orelse\ifinsidefloat
+ \donefalse
+ \else
+ \donetrue
+ \fi
+ \ifdone
+ \expandafter\tabl_ntb_split_box
+ \else
+ \expandafter\tabl_tbl_split_nop
+ \fi}
+
+\newbox\TABLEsplitbox % public, don't change
+
+\let\extratblsplitheight\zeropoint % additional space taken by before/afterTABLEsplitbox
+
+\def\tabl_ntb_split_box
+ {\resettsplit
+ \def\tsplitminimumfreelines{2}%
+ \def\tsplitminimumfreespace{\dimexpr\extratblsplitheight+\naturaltablelocalparameter\c!splitoffset\relax}%
+ \def\tsplitbeforeresult {\beforeTABLEsplitbox}%
+ \def\tsplitafterresult {\afterTABLEsplitbox}%
+ \def\tsplitafter {\m_tabl_ntb_after_split}%
+ \def\tsplitbefore {\m_tabl_ntb_before_split}% supported ?
+ \setbox\tsplitcontent\vbox{\tabl_ntb_flush_content}%
+ \ifmultipleTBLheads
+ \dorecurse\c_tabl_ntb_n_of_head_lines
+ {\setbox\scratchbox\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplithead\vbox{\unvcopy\tsplithead\unvcopy\scratchbox}}% \vpack ?
+ \dorecurse\c_tabl_ntb_n_of_next_lines
+ {\setbox\scratchbox\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplitnext\vbox{\unvcopy\tsplitnext\unvcopy\scratchbox}}% \vpack ?
+ \fi
+ \edef\p_spaceinbetween{\naturaltablelocalparameter\c!spaceinbetween}%
+ \ifx\p_spaceinbetween\empty\else
+ \blank[\p_spaceinbetween]%
+ \fi
+ \def\postprocesstsplit{\postprocessTABLEsplitbox{\box\tsplitresult}}%
+ \handletsplit}
+
+% ! ! ! ! TODO: naast \postprocessTABLEsplitbox ook evt \postprocessTABLEbox voor niet split
+
+\let\postprocessTABLEsplitbox\gobbleoneargument
+\let\postprocessTABLEbox \gobbleoneargument
+
+\let\beforeTABLEsplitbox\relax
+\let\afterTABLEsplitbox \relax
+\let\beforeTABLEbox \relax
+\let\afterTABLEbox \relax
+
+\def\tabl_ntb_check_widths_one{\tabl_ntb_check_widths_indeed\zerocount} % 0 = trial run
+\def\tabl_ntb_check_widths_two{\tabl_ntb_check_widths_indeed\plusone } % 1 = real run
+
+\def\tabl_ntb_check_widths_indeed#1%
+ {\ifconditional\c_tabl_ntb_trace_widths\tabl_ntb_show_widths B#1\fi
+ \!!counta\zerocount
+ \!!dimena\dimexpr
+ \hsize
+ -\d_tabl_ntb_leftmargindistance
+ -\d_tabl_ntb_rightmargindistance
+ -\d_tabl_ntb_columndistance
+ \relax
+ \dorecurse\c_tabl_ntb_maximum_col
+ {\scratchdimen\tabl_ntb_get_aut\recurselevel\relax
+ \advance\!!dimena\dimexpr
+ -\tabl_ntb_get_dis\recurselevel
+ -\d_tabl_ntb_columndistance
+ \relax
+ \ifdim\scratchdimen>\zeropoint\relax
+ \advance\!!dimena -\scratchdimen
+ \else
+ \scratchdimen\tabl_ntb_get_wid\recurselevel\relax
+ \ifdim\scratchdimen>\d_tabl_ntb_maxwidth\relax
+ \ifcase#1\else\tabl_ntb_let_wid\recurselevel\zeropoint\fi
+ \advance\!!counta \plusone
+ \orelse\ifdim\scratchdimen>\zeropoint\relax
+ \advance\!!dimena -\scratchdimen
+ \else
+ % eigenlijk moet dit alleen als de kolom wordt overspannen door een
+ % vorige, maw extra dubbele loop en status var
+ \ifnum\c_tabl_ntb_encountered_max=\c_tabl_ntb_maximum_col % *nx* bah
+ \advance\!!counta \plusone % setting maxwidth to a large value also works
+ \fi
+ \fi
+ \fi}%
+ \ifconditional\c_tabl_ntb_trace_widths\tabl_ntb_show_widths M#1\fi
+ \ifcase\!!counta \else \divide\!!dimena \!!counta \fi
+ \dorecurse\c_tabl_ntb_maximum_col
+ {\scratchdimen\tabl_ntb_get_wid\recurselevel\relax
+ \ifcase#1\relax
+ \ifdim\scratchdimen<\!!dimena % take natural width
+ \tabl_ntb_set_aut\recurselevel{\the\scratchdimen}%
+ \fi
+ \else
+ \ifzeropt\scratchdimen % auto set width
+ \tabl_ntb_set_wid\recurselevel{\the\!!dimena}%
+ \fi
+ \fi}%
+ \ifconditional\c_tabl_ntb_trace_widths\tabl_ntb_show_widths E#1\fi}
+
+% todo: use scratchcounters, not !! ones
+
+\def\tabl_ntb_check_heights_one_indeed
+ {\!!countb\tabl_ntb_get_row\c_tabl_ntb_current_row_three\c_tabl_ntb_current_col_three\relax
+ % check row span
+ \ifnum\!!countb>\plusone
+ % current height in row
+ \dimen0=\tabl_ntb_get_ht\c_tabl_ntb_current_row_three\c_tabl_ntb_current_col_three
+ % find nearest height in row
+ \dimen2=\zeropoint
+ \dorecurse\c_tabl_ntb_maximum_col
+ {\ifnum\recurselevel=\c_tabl_ntb_current_col_three\else
+ \ifcsname\tabl_ntb_row_pattern\c_tabl_ntb_current_row_three\recurselevel\endcsname
+ \!!countc=\tabl_ntb_get_row\c_tabl_ntb_current_row_three\recurselevel\relax
+ \ifnum\!!countc=\plusone
+ \dimen4=\tabl_ntb_get_ht\c_tabl_ntb_current_row_three\recurselevel\relax
+ \ifdim\dimen2<\dimen4
+ \dimen2=\dimen4
+ \fi
+ \fi
+ \fi
+ \fi}%
+ \c_tabl_ntb_current_row_four\c_tabl_ntb_current_row_three
+ % calculate cummulative height
+ \dimen4=\dimen2
+ \!!countc\c_tabl_ntb_current_row_three
+ \advance\!!countc\minusone
+ \dorecurse\!!countb
+ {\ifnum\c_tabl_ntb_current_row_four=\c_tabl_ntb_current_row_three\else
+ \advance\dimen4 \tabl_ntb_get_hei\c_tabl_ntb_current_row_four
+ \fi
+ \ifnum\recurselevel=\!!countb\else
+ \tabl_ntb_set_nob\!!countc
+ \advance\!!countc\plusone
+ \fi
+ \advance\c_tabl_ntb_current_row_four\plusone}%
+ % distribute overshoot equally
+ \ifdim\dimen2>\zeropoint % new: test on natural-003
+ \ifdim\dimen4<\dimen0
+ \advance\dimen0 -\dimen4
+ \divide\dimen0 \!!countb
+ \c_tabl_ntb_current_row_four\c_tabl_ntb_current_row_three
+ \tabl_ntb_set_hei\c_tabl_ntb_current_row_three{\the\dimen2}%
+ \dorecurse\!!countb
+ {\dorecurse\c_tabl_ntb_maximum_col
+ {\ifnum\recurselevel=\c_tabl_ntb_current_col_three\else
+ \scratchdimen\dimexpr\tabl_ntb_get_ht\c_tabl_ntb_current_row_four\recurselevel+\dimen0\relax
+ \tabl_ntb_set_ht\c_tabl_ntb_current_row_four\recurselevel{\the\scratchdimen}%
+ \ifdim\tabl_ntb_get_hei\c_tabl_ntb_current_row_four<\scratchdimen
+ \tabl_ntb_set_hei\c_tabl_ntb_current_row_four{\the\scratchdimen}%
+ \fi
+ \fi}%
+ \advance\c_tabl_ntb_current_row_four\plusone}%
+ \orelse\ifdim\dimen4>\dimen0
+ \iftightTBLrowspan
+ \tabl_ntb_set_hei\c_tabl_ntb_current_row_three{\the\dimen2}%
+ \fi
+ \fi
+ \fi
+ \fi}
+
+\def\tabl_ntb_check_heights_one
+ {\dorecurse\c_tabl_ntb_maximum_row
+ {\c_tabl_ntb_current_row_three\recurselevel\relax
+ \dorecurse\c_tabl_ntb_maximum_col
+ {\c_tabl_ntb_current_col_three\recurselevel\relax
+ \ifcsname\tabl_ntb_row_pattern\c_tabl_ntb_current_row_three\c_tabl_ntb_current_col_three\endcsname
+ \tabl_ntb_check_heights_one_indeed
+ \fi}}}
+
+\def\tabl_ntb_check_heights_two
+ {}
+
+\def\tabl_ntb_show_widths#1#2%
+ {\begingroup
+ \scratchdimen\zeropoint
+ \dorecurse\c_tabl_ntb_maximum_col
+ {\advance\scratchdimen\tabl_ntb_get_wid\recurselevel\relax}%
+ \writestatus\m!TABLE{#1 \ifcase#2trial\else real\fi: hsize: \the\hsize, total: \the\scratchdimen}%
+ \dorecurse\c_tabl_ntb_maximum_col
+ {\writestatus\m!TABLE{\space\space\recurselevel: \the\dimexpr\tabl_ntb_get_wid\recurselevel}}%
+ \endgroup}
+
+\def\tabl_ntb_char_align % called often
+ {\edef\p_characteralign{\naturaltablelocalparameter\c!aligncharacter}%
+ \ifx\p_characteralign\v!yes
+ \ifcase\c_tabl_tbl_pass\or
+ \tabl_ntb_let_tal\currentTABLEcolumn\plusone
+ \tabl_ntb_let_gal\plusone
+ \fi
+ \expandafter\tabl_ntb_char_align_indeed
+ \else
+ \expandafter\gobbletwoarguments
+ \fi}
+
+\def\tabl_ntb_char_align_indeed#1#2% row column
+ {\ifcase\c_tabl_tbl_pass \or
+ \setcharacteralign{#2}{\naturaltablelocalparameter\c!alignmentcharacter}% we could store the character in tal
+ \fi
+ \typo_charalign_adapt_font
+ \signalcharacteralign{#2}{#1}}
+
+\unexpanded\def\tabl_ntb_cell_process_a_extra#1#2%
+ {\ifcase\tabl_ntb_get_tal{#2}\relax
+ \expandafter\tabl_ntb_cell_process_x
+ \else
+ \expandafter\tabl_ntb_cell_process_a
+ \fi{#1}{#2}}
+
+\unexpanded\def\tabl_ntb_cell_process_x#1#2[#3]#4%
+ {}
+
+% problem: when span doesn't break we can have a span that is the sum of cells but
+% still to small .. chicken egg problem ... for that we should also have a smallest
+% width run
+%
+% nilling the background makes a run upto 25% faster
+
+\def\tabl_ntb_cell_process_a_check_span_one
+ {\ifautosqueezeTBLspan
+ \edef\p_width{\naturaltablelocalparameter\c!width}%
+ \ifcsname\??naturaltablesqueeze\p_width\endcsname\lastnamedcs\else\donefalse\fi
+ \else
+ \donetrue
+ \fi
+ \ifdone % brr, 0
+ \ifnum\scratchcounter>\plusone
+ \tabl_ntb_set_spn\c_tabl_ntb_col
+ \fi
+ \fi}
+
+\let\tabl_ntb_cell_process_a_check_span_two_yes\relax
+
+\def\tabl_ntb_cell_process_a_check_span_two_nop
+ {\ifdim\tabl_ntb_get_wid\c_tabl_ntb_col<\wd\scratchbox
+ \tabl_ntb_set_wid\c_tabl_ntb_col{\the\wd\scratchbox}%
+ \fi}
+
+\unexpanded\def\tabl_ntb_cell_process_a#1#2[#3]#4% grouping added ! ! !
+ {\bgroup
+ \letnaturaltablelocalparameter\c!option\empty
+ \tabl_ntb_setup_cell{#1}{#2}%
+ \setupcurrentnaturaltablelocal[#3]%
+ \letnaturaltablelocalparameter\c!background\empty
+ \letnaturaltablelocalparameter\c!frame\v!off
+ \scratchcounter\tabl_ntb_get_col{#1}{#2}\relax
+ \setbox\scratchbox\hbox
+ {\scratchdimen\naturaltablelocalparameter\c!distance\relax
+ \ifdim\scratchdimen>\tabl_ntb_get_dis{#2}\relax
+ \tabl_ntb_set_dis{#2}{\the\scratchdimen}%
+ \fi
+ \anch_backgrounds_text_level_start
+ \inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop\tabl_ntb_cell_finalize}%
+ \anch_backgrounds_text_level_stop
+ \ifcase\c_anch_backgrounds_text_count\else
+ \tabl_ntb_let_bck{#1}{#2}\c_anch_backgrounds_text_state
+ \fi
+ }%
+ \scratchdimen\tabl_ntb_get_wid\c_tabl_ntb_col\relax
+ \ifdim\wd\scratchbox>\scratchdimen
+ \ifsqueezeTBLspan
+ \tabl_ntb_cell_process_a_check_span_one
+ \fi
+ \tabl_ntb_spn_doifelse\c_tabl_ntb_col
+ \tabl_ntb_cell_process_a_check_span_two_yes
+ \tabl_ntb_cell_process_a_check_span_two_nop
+ \fi
+ \scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax
+ \scratchdimen\tabl_ntb_get_hei\scratchcounter\relax
+ \ifdim\ht\scratchbox<\scratchdimen
+ \tabl_ntb_set_hei\scratchcounter{\the\ht\scratchbox}% auto set
+ \fi
+ \tabl_ntb_set_ht{#1}{#2}{\the\ht\scratchbox}%
+ %tabl_ntb_set_wd{#1}{#2}{\the\wd\scratchbox}%
+ \ifautoTBLcheckwidth
+ \ifdim\wd\scratchbox<.75\hsize % fuzzy guess
+ \ifdim\ht\scratchbox>2\openlineheight % honor width since this
+ \scratchdimen\tabl_ntb_get_aut\c_tabl_ntb_col\relax % can be a figure or so
+ \ifzeropt\scratchdimen
+ % side effect: when width is set to 0pt,
+ % we can force a span that fits the sum of spans widths
+ \tabl_ntb_set_aut\c_tabl_ntb_col{\the\scratchdimen}%
+ \orelse\ifdim\wd\scratchbox>\scratchdimen
+ % unless span
+ \tabl_ntb_set_aut\c_tabl_ntb_col{\the\wd\scratchbox}%
+ % to be translated
+ \writestatus\m!TABLE{no auto width in (\number#1,\number#2)\space\the\wd\scratchbox/\the\hsize}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \setbox\scratchboxone\emptyhbox
+ \wd\scratchboxone\wd\scratchbox
+ \ht\scratchboxone\ht\scratchbox
+ \dp\scratchboxone\dp\scratchbox
+ \box\scratchboxone
+ \egroup}
+
+\unexpanded\def\tabl_ntb_cell_process_b_c#1#2#3[#4]#5%
+ {\setbox\scratchbox\hbox
+ {\tabl_ntb_setup_cell{#2}{#3}%
+ \setupcurrentnaturaltablelocal[#4,#1]%
+ \letnaturaltablelocalparameter\c!background\empty
+ \letnaturaltablelocalparameter\c!frame\v!off
+ \inheritednaturaltablelocalframed{\tabl_ntb_cell_start#5\tabl_ntb_cell_stop}}%
+ \setbox2\emptyhbox % todo: \scratchboxtwo
+ \wd2\wd\scratchbox
+ \ht2\ht\scratchbox
+ \dp2\dp\scratchbox
+ \ifautoTBLrowspan
+ \scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax
+ \ifcsname\tabl_ntb_row_pattern\scratchcounter\c_tabl_ntb_col\endcsname
+ \scratchdimen\tabl_ntb_get_hei\scratchcounter\relax
+ \ifnum\tabl_ntb_get_row\scratchcounter\c_tabl_ntb_col>\plusone
+ \ifdim\ht\scratchbox>\scratchdimen
+ \ht2\dimexpr-\scratchdimen-\ht\scratchbox\relax
+ \fi
+ \fi
+ \fi
+ \fi
+ \box2 }
+
+\unexpanded\def\tabl_ntb_cell_process_b#1#2[#3]#4%
+ {\scratchdimen\tabl_ntb_get_aut\c_tabl_ntb_col\relax
+ \ifdim\scratchdimen>\zeropoint\relax
+ \else
+ \scratchdimen\tabl_ntb_get_wid\c_tabl_ntb_col\relax
+ \ifdim\scratchdimen>\zeropoint\relax
+ \ifnum\tabl_ntb_get_col{#1}{#2}=\c_tabl_ntb_maximum_col\relax
+ \scratchdimen\hsize
+ \fi
+ \fi
+ \fi
+ \normalexpanded{\tabl_ntb_cell_process_b_c{\ifdim\scratchdimen>\zeropoint \c!width=\the\scratchdimen\fi}}%
+ {#1}{#2}[#3]{\tabl_ntb_char_align{#1}{#2}#4}}
+
+\unexpanded\def\tabl_ntb_cell_process_c
+ {\tabl_ntb_cell_process_b_c{}}
+
+\unexpanded\def\tabl_ntb_cell_process_d#1#2[#3]#4%
+ {\tabl_ntb_setup_cell{#1}{#2}%
+ \bgroup
+ \setupcurrentnaturaltablelocal[#3]%
+ \letnaturaltablelocalparameter\c!background\empty
+ \letnaturaltablelocalparameter\c!frame\v!off
+ \setnaturaltablelocalparameter\c!width{\d_tabl_ntb_width}%
+ \inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop}%
+ \egroup}
+
+\unexpanded\def\tabl_ntb_cell_process_e#1#2[#3]#4%
+ {\tabl_ntb_setup_cell{#1}{#2}%
+ \setupcurrentnaturaltablelocal[#3]% to get the color right, the way we
+ \color % handle color here prevents interference due to whatsit nodes
+ [\naturaltablelocalparameter\c!color] % as well as permits local colors to take precedence
+ {\letnaturaltablelocalparameter\c!color\empty
+ \setnaturaltablelocalparameter\c!width{\d_tabl_ntb_width}%
+ \ifzeropt\d_tabl_ntb_height % case: nc=maxcolumns
+ \else
+ \setnaturaltablelocalparameter\c!height{\d_tabl_ntb_height}%
+ \fi
+ \ifcase\c_anch_backgrounds_text_count\else
+ \edef\p_region{\naturaltablelocalparameter\c!region}%
+ \ifx\p_region\empty\ifnum\tabl_ntb_get_bck{#1}{#2}>\zerocount
+ \letnaturaltablelocalparameter\c!region\v!yes
+ \fi\fi
+ \fi
+ \inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop}}%
+ \hskip\tabl_ntb_get_dis{#2}}
+
+\newtoks\everyresetTABLEyes
+\newtoks\everyresetTABLEnop
+
+\appendtoks
+ \setupTABLE [%
+ %
+ % framed defaults
+ %
+ \c!width=\v!fit,%
+ \c!height=\v!fit,%
+ \c!lines=,%
+ \c!offset=.25\exheight,%
+ \c!empty=\v!no,%
+ \c!frame=\v!on,%
+ \c!topframe=,%
+ \c!bottomframe=,%
+ \c!leftframe=,%
+ \c!rightframe=,%
+ \c!radius=.5\bodyfontsize,%
+ \c!rulethickness=\linewidth,%
+ \c!corner=\v!rectangular,%
+ \c!depth=\zeropoint,%
+ \c!foregroundcolor=,%
+ \c!foregroundstyle=,%
+ \c!background=,%
+ \c!backgroundcolor=,%
+ \c!backgroundoffset=\v!frame,%
+ \c!framecolor=,%
+ \c!frameoffset=.5\linewidth,%
+ % \c!backgroundcorner=\framedparameter\c!corner,%
+ % \c!backgrounddepth=\framedparameter\c!depth,%
+ % \c!backgroundradius=\framedparameter\c!radius,%
+ % \c!framecorner=\framedparameter\c!corner,%
+ % \c!framedepth=\framedparameter\c!depth,%
+ % \c!frameradius=\framedparameter\c!radius,%
+ \c!component=,%
+ \c!region=,%
+ \c!align=,%
+ \c!bottom=\vss,%
+ \c!top=,%
+ \c!strut=\v!yes,%
+ \c!autostrut=\v!no,%
+ \c!location=\v!normal,%
+ \c!orientation=,%
+ \c!autowidth=\v!yes,%
+ \c!setups=,%
+ \c!loffset=\zeropoint,%
+ \c!roffset=\zeropoint,%
+ \c!toffset=\zeropoint,%
+ \c!boffset=\zeropoint,%
+ %
+ % table specific
+ %
+ \c!aligncharacter=\v!no,%
+ \c!alignmentcharacter={,},%
+ \c!color=,%
+ \c!columndistance=\zeropoint,% each column (whole table)
+ \c!distance=\zeropoint,% individual column
+ \c!headcolor=,%
+ \c!header=,%
+ \c!headstyle=\v!bold,%
+ \c!left=,%
+ \c!leftmargindistance=\zeropoint,% whole table
+ \c!maxwidth=8\emwidth,%
+ \c!option=,% \v!stretch
+ \c!right=,%
+ \c!rightmargindistance=\zeropoint,% whole table
+ \c!spaceinbetween=,%
+ \c!split=\v!auto,%
+ \c!splitoffset=\zeropoint,%
+ \c!style=,%
+ \c!textwidth=\v!local,% was \hsize
+ ]%
+\to \everyresetTABLEyes
+
+\appendtoks
+ \setupTABLE [%
+ \c!width=\v!fit,%
+ \c!height=\v!fit%
+ ]%
+\to \everyresetTABLEnop
+
+\the\everyresetTABLEyes
+
+% \bgroup
+% \setupTABLE[column][1][aligncharacter=yes, alignmentcharacter={,}]
+% \bTABLE
+% \bTR \bTD 1,2 \eTD \bTD 2 \eTD \eTR
+% \bTR \bTD 11,2 \eTD \bTD
+% {\setupTABLE[column][1][aligncharacter=yes, alignmentcharacter={,}]
+% \bTABLE
+% \bTR \bTD 1,2 \eTD \bTD 2 \eTD \eTR
+% \bTR \bTD 11,22 \eTD \bTD 2 \eTD \eTR
+% \bTR \bTD 11,2 \eTD \bTD 2 \eTD \eTR \eTABLE} \eTD \eTR
+% \bTR \bTD 11,22 \eTD \bTD 2 \eTD \eTR
+% \eTABLE
+% \egroup
+
+\newconditional\resetTABLEmode \settrue\resetTABLEmode
+
+\def\tabl_ntb_parameters_reset % we can use setters instead
+ {\ifnum\m_tabl_tbl_level>\plusone % in ieder geval
+ \ifconditional\resetTABLEmode
+ \the\everyresetTABLEyes
+ \else
+ \the\everyresetTABLEnop
+ \fi
+ \fi}
+
+% new (for Olivier Turlier)
+%
+% \defineTABLEsetup [xx] [foregroundcolor=red]
+%
+% \bTABLE
+% \bTR \bTD oeps \eTD \bTD oeps \eTD \eTR
+% \bTR \bTDs[xx] oeps \eTDs \bTD oeps \eTD \eTR
+% \bTRs[xx] \bTD oeps \eTD \bTD oeps \eTD \eTRs
+% \eTABLE
+
+\installcorenamespace{naturaltablesetup}
+
+\unexpanded\def\defineTABLEsetup
+ {\dodoubleargument\tabl_ntb_define_setup}
+
+\def\tabl_ntb_define_setup[#1][#2]%
+ {\setvalue{\??naturaltablesetup#1}{#2}}
+
+\let\eTDs\relax
+\let\eTRs\relax
+
+\unexpanded\def\bTDs[#1]#2\eTDs
+ {\normalexpanded{\bTD[\begincsname\??naturaltablesetup#1\endcsname]}#2\eTD}
+
+\unexpanded\def\bTRs[#1]#2\eTRs
+ {\normalexpanded{\bTR[\begincsname\??naturaltablesetup#1\endcsname]}#2\eTR}
+
+\protect \endinput
+
+% todo: mode: first|next (of niets)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/tabl-tab.mkiv b/Master/texmf-dist/tex/context/base/mkiv/tabl-tab.mkiv
index 631f29bc084..3799964c9f8 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/tabl-tab.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/tabl-tab.mkiv
@@ -666,7 +666,7 @@
\ifx\tempstring\empty
\!taDimenC\zeropoint
\else
- \setbox\scratchbox=\hbox{\mathsurround\zeropoint #1.#3#1}%
+ \setbox\scratchbox\hbox{\mathsurround\zeropoint #1.#3#1}%
\!taDimenC\wd\scratchbox
\fi
\setbox\scratchbox\hbox{\mathsurround\zeropoint #1#2#1}%
@@ -864,8 +864,13 @@
\lineskip \zeropoint
\tabskip \zeropoint
\edef\p_tabl_table_textwidth{\directtablesparameter\c!textwidth}%
- \halign \ifx\p_tabl_table_textwidth\empty \else to \ifx\p_tabl_table_textwidth\v!max \hsize \else \p_tabl_table_textwidth \fi\fi
-% \the\!taTableSpread
+ % we are not in sync so:
+ \synchronizedisplaydirection
+ \synchronizeinlinedirection
+ \halign
+ \usedirectionparameterreverse\directtablesparameter
+ \ifx\p_tabl_table_textwidth\empty \else to \ifx\p_tabl_table_textwidth\v!max \hsize \else \p_tabl_table_textwidth \fi\fi
+ %\the\!taTableSpread
\bgroup
\span
\the\!taPreamble
diff --git a/Master/texmf-dist/tex/context/base/mkiv/tabl-tbl.mkiv b/Master/texmf-dist/tex/context/base/mkiv/tabl-tbl.mkiv
index f3c2e2e105a..6e87d186383 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/tabl-tbl.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/tabl-tbl.mkiv
@@ -17,17 +17,15 @@
\registerctxluafile{tabl-tbl}{} % experiment
-%D I can probably reimplement this using a \LUATEX\ combination
-%D but it does not pay of in development time. If I need something
-%D else I will write it from scratch anyway. This module looks
-%D a bit complex which is a consequence of it dealing with paragraphs
-%D being split over pages and that there are several passes over the
-%D data set. We can probably do some cleanup (combine/split).
+%D I can probably reimplement this using a \LUATEX\ combination but it does not pay
+%D of in development time. If I need something else I will write it from scratch
+%D anyway. This module looks a bit complex which is a consequence of it dealing with
+%D paragraphs being split over pages and that there are several passes over the data
+%D set. We can probably do some cleanup (combine/split).
%D
-%D Caching the preamble does not save much (compared to other
-%D bits and pieces of \CONTEXT). There are not that many ways to
-%D deal with preambles and this is just one of them. The keys are
-%D somewhat similar to those of the \TABLE\ package.
+%D Caching the preamble does not save much (compared to other bits and pieces of
+%D \CONTEXT). There are not that many ways to deal with preambles and this is just
+%D one of them. The keys are somewhat similar to those of the \TABLE\ package.
% |p2|p3| 2:3 -> spanning (maybe)
%
@@ -579,15 +577,17 @@
\installtabulatepreambleoption{ }{\tabl_tabulate_set_preamble}
\installtabulatepreambleoption{A}{\tabl_tabulate_set_alignment}
-% We no longer deal with '~' here but map it onto 'd' instead. Of course
-% we could prefix a key with \type {\meaning} instead, which works ok (and
-% is needed in order to pseudo expand \type {\next}, but is ugly at the
-% same time. The 'd' stands for digitspace.
-%
-% \installtabulatepreambleoption{~}{...} % see 'd'
-%
-% Also, as there is always a key, we no longer do some after assigment or
-% future let but just pick up the key.
+%D We no longer deal with \type {~} here but map it onto \type {d} instead. Of
+%D course we could prefix a key with \type {\meaning} instead, which works ok (and
+%D is needed in order to pseudo expand \type {\next}, but is ugly at the same time.
+%D The type {d} stands for digitspace.
+
+%D \starttyping
+%D \installtabulatepreambleoption{~}{...} % see 'd'
+%D \stoptyping
+%D
+%D Also, as there is always a key, we no longer do some after assigment or future
+%D let but just pick up the key.
% \installtabulatepreambleoption \s!unknown %
% {\writestatus{tabulate}{unknown preamble key [\normalmeaning\next]}%
@@ -909,7 +909,7 @@
\let\tabl_tabulate_hook\tabl_tabulate_hook_nop
-\def\tabl_tabulate_hook_yes{\csname\??tabulatehook\the\c_tabl_tabulate_column\endcsname}
+\def\tabl_tabulate_hook_yes{\begincsname\??tabulatehook\the\c_tabl_tabulate_column\endcsname}
\def\tabl_tabulate_pheight_reset
{\global\c_tabl_tabulate_plines_min\plusone
@@ -976,9 +976,8 @@
%D
%D \typebuffer {\tracetabulatetrue\getbuffer}
-%D As we want to be compatible we use an indirect way to
-%D implement the definers. The next examples demonstrate
-%D the difference:
+%D Because we want to be compatible we use an indirect way to implement the
+%D definers. The next examples demonstrate the difference:
%D
%D \starttyping
%D \definetabulate[test][|l|c|r|]
@@ -1090,12 +1089,12 @@
\def\tabl_tabulate_insert_head_content
{\tabulatenoalign{\global\settrue\c_tabl_tabulate_someamble}%
- \csname\??tabulatehead\currenttabulation\endcsname
+ \begincsname\??tabulatehead\currenttabulation\endcsname
\tabulatenoalign{\global\setfalse\c_tabl_tabulate_someamble}}%
\def\tabl_tabulate_insert_foot_content
{\tabulatenoalign{\global\settrue\c_tabl_tabulate_someamble}%
- \csname\??tabulatefoot\currenttabulation\endcsname
+ \begincsname\??tabulatefoot\currenttabulation\endcsname
\tabulatenoalign{\global\setfalse\c_tabl_tabulate_someamble}}%
\def\tabl_tabulate_check_full_content % - needed, else confusion with \c!header
@@ -1151,15 +1150,6 @@
\def\tabl_tabulate_start_head_nop{\tabl_tabulate_start_head_yes[\v!tabulate]}
\def\tabl_tabulate_start_foot_nop{\tabl_tabulate_start_foot_yes[\v!tabulate]}
-% \def\tabl_tabulate_start_head_nop{\tabl_tabulate_start_head_yes[]}
-% \def\tabl_tabulate_start_foot_nop{\tabl_tabulate_start_foot_yes[]}
-
-% \unexpanded\def\tabl_start_defined[#1]%
-% {\bgroup
-% \edef\currenttabulationparent{#1}%
-% \let\currenttabulation\currenttabulationparent
-% \dodoubleargument\tabl_start_defined_indeed}
-
\unexpanded\def\tabl_start_defined[#1]%
{\bgroup
\edef\currenttabulationparent{#1}%
@@ -1185,9 +1175,11 @@
\fi}
\def\tabl_start_defined_one[#1][#2]%
- {\doifelseassignment{#1}
- {\setuptabulation[\currenttabulation][#1]}%
- {\edef\currenttabulation{\currenttabulation:#1}}%
+ {\ifcondition\validassignment{#1}%
+ \setuptabulation[\currenttabulation][#1]%
+ \else
+ \edef\currenttabulation{\currenttabulation:#1}%
+ \fi
\tabl_tabulate_start_building}
\def\tabl_start_defined_two[#1][#2]%
@@ -1216,14 +1208,16 @@
\def\tabl_default_format{|l|p|}
\def\tabl_start_regular_one[#1][#2]%
- {\doifelseassignment{#1}
- {\lettabulationparameter\c!format\tabl_default_format
- \setupcurrenttabulation[#1]}
- {\def\p_format{#1}%
- \ifx\p_format\empty
- \def\p_format{|l|p|}%
- \fi
- \lettabulationparameter\c!format\p_format}%
+ {\ifcondition\validassignment{#1}%
+ \lettabulationparameter\c!format\tabl_default_format
+ \setupcurrenttabulation[#1]%
+ \else
+ \def\p_format{#1}%
+ \ifx\p_format\empty
+ \def\p_format{|l|p|}%
+ \fi
+ \lettabulationparameter\c!format\p_format
+ \fi
\tabl_tabulate_start_building}
\def\tabl_start_regular_two[#1][#2]%
@@ -1364,7 +1358,7 @@
\fi
%
\settrue\c_tabl_tabulate_split
- \csname\??tabulatesplit\tabulationparameter\c!split\endcsname
+ \begincsname\??tabulatesplit\tabulationparameter\c!split\endcsname
%
\let\m_tabl_tabulate_blank_default\p_blank
%
@@ -1479,15 +1473,6 @@
% normal columns:
-% \def\tabl_tabulate_column_normal#1#2%
-% {\unskip
-% \aligntab
-% \ifconditional\c_tabl_tabulate_equal\tabulateequalpos\else\tabulatenormalpos\fi
-% \aligntab
-% \global\c_tabl_tabulate_kind#1%
-% \global\c_tabl_tabulate_type#2%
-% \aligntab}
-
\def\tabl_tabulate_column_normal#1#2%
{\unskip
\aligntab
@@ -1834,9 +1819,8 @@
\def\tabl_tabulate_digits{\digits}
-%D Beware, we cannot use \type {\unexpanded} on \type {\HL}
-%D cum suis, since \TEX's hard coded noalign lookahead fails
-%D on it! I mistakenly added this for a while.
+%D Beware, we cannot use \type {\unexpanded} on \type {\HL} cum suis, since \TEX's
+%D hard coded noalign lookahead fails on it! I mistakenly added this for a while.
\setvalue{\??tabulatealigning\v!normal}{0}
\setvalue{\??tabulatealigning\v!right }{1}
@@ -1877,27 +1861,6 @@
\installcorenamespace{tabulatenobreak}
-% \def\tabl_tabulate_break_state_set
-% {%\writestatus{SET}{\the\c_tabl_tabulate_noflines}%
-% \expandafter\glet\csname\??tabulatenobreak\the\c_tabl_tabulate_noflines\endcsname\conditionaltrue}
-%
-% \def\tabl_tabulate_break_state_reset
-% {\ifcsname\??tabulatenobreak\the\c_tabl_tabulate_noflines\endcsname
-% %\writestatus{RESET}{\the\c_tabl_tabulate_noflines}%
-% \expandafter\glet\csname\??tabulatenobreak\the\c_tabl_tabulate_noflines\endcsname\undefined
-% \fi}
-%
-% \def\tabl_tabulate_break_state_allowbreak
-% {\ifcsname\??tabulatenobreak\the\c_tabl_tabulate_noflines\endcsname
-% %\writestatus{TRUE}{\the\c_tabl_tabulate_noflines}%
-% \else
-% %\writestatus{FALSE}{\the\c_tabl_tabulate_noflines}%
-% \tabl_tabulate_break_allow % needed with pbreak prevention
-% \fi}
-%
-% \let\tabl_tabulate_break_allow\allowbreak
-% \let\tabl_tabulate_break_no \nobreak
-
\def\tabl_tabulate_break_allow{\directvpenalty\zerocount}
\def\tabl_tabulate_break_maybe{\directvpenalty\zerocount}
\def\tabl_tabulate_break_no {\directvpenalty\plustenthousand} % ,order:2}}
@@ -1916,11 +1879,6 @@
\unexpanded\def\tabl_tabulate_RQ_first{\tabl_tabulate_column_equal \zerocount\plusone}
\unexpanded\def\tabl_tabulate_HQ_first{\tabl_tabulate_column_equal \zerocount\plustwo}
-%unexpanded\def\tabl_tabulate_NG_first{\NC\tabl_tabulate_charalign}
-%unexpanded\def\tabl_tabulate_NG_first{\NC}
-%unexpanded\def\tabl_tabulate_NN_first{\NC\tabl_tabulate_digits} % new, undocumented, test first
-%unexpanded\def\tabl_tabulate_ND_first{\NC\tabl_tabulate_digits} % same, for old times sake
-
\unexpanded\def\tabl_tabulate_NG_first{\tabl_tabulate_column_normal\zerocount\zerocount}
\unexpanded\def\tabl_tabulate_NN_first{\tabl_tabulate_column_normal\zerocount\zerocount\tabl_tabulate_digits} % new, undocumented, test first
\unexpanded\def\tabl_tabulate_ND_first{\tabl_tabulate_column_normal\zerocount\zerocount\tabl_tabulate_digits} % same, for old times sake
@@ -1967,8 +1925,6 @@
%D The following shortcut is handy for tables where one needs bold headers:
-%unexpanded\def\tabl_tabulate_BC_first{\NC\let\fontstyle\globalfontstyle\bf}
-
\unexpanded\def\tabl_tabulate_BC_first
{\tabl_tabulate_column_normal\plusone\zerocount
\let\fontstyle\globalfontstyle
@@ -2155,15 +2111,6 @@
\tabl_tabulate_nobreak_inject
\stoptabulatenoalign}
-% \unexpanded\def\tabl_tabulate_ML_second_indeed
-% {\tabl_tabulate_column_rule_separator_inject
-% \tabl_tabulate_hrule_inject
-% \vskip-\p_rulethickness\relax
-% \tabl_tabulate_hrule_inject
-% \tabl_tabulate_break_no
-% \tabl_tabulate_column_rule_separator_inject
-% \stoptabulatenoalign}
-
\def\spac_vspacing_no_topskip % use grouped
{\attribute\skipcategoryattribute\plusten}
@@ -2286,13 +2233,12 @@
\def\tabulateautorule{\HR}%
\def\tabulateautoline{\HL} % no longer different (to be looked into)
-% When support for vertical rules we needed a way to pick up the
-% specification for the final rule and a \type {|{}} interface was
-% chosen. As a result parsing had to become more complex and I was
-% not in the mood for messing up the code too much. Therefore from
-% now on the preamble is split by \LUA. There are definitely more
-% places where we can use \LUA\ code (for instance in alignment of
-% numbers. The repeat parser is replace at the \LUA\ end as well.
+%D When support for vertical rules we needed a way to pick up the specification for
+%D the final rule and a \type {|{}} interface was chosen. As a result parsing had to
+%D become more complex and I was not in the mood for messing up the code too much.
+%D Therefore from now on the preamble is split by \LUA. There are definitely more
+%D places where we can use \LUA\ code (for instance in alignment of numbers. The
+%D repeat parser is replace at the \LUA\ end as well.
\let\tabl_tabulate_flush_collected \empty
\let\tabl_tabulate_flush_collected_indeed\empty
@@ -2314,7 +2260,7 @@
\def\tabl_tabulate_process
{\c_tabl_tabulate_pass\plusone
\tabl_tabulate_check_full_content
- \edef\v_tabl_tabulate_align{\executeifdefined{\??tabulatealigning\p_align}0}%
+ \edef\v_tabl_tabulate_align{\ifcsname\??tabulatealigning\p_align\endcsname\lastnamedcs\else0\fi}%
\s_tabl_tabulate_first.5\d_tabl_tabulate_unit
\s_tabl_tabulate_last\s_tabl_tabulate_first
\s_tabl_tabulate_pre\zeropoint
@@ -2336,11 +2282,16 @@
\else
\donetrue
\fi\fi
- \ifdone
- \global\c_tabl_tabulate_repeathead\executeifdefined{\??tabulateheader\tabulationparameter\c!header}\zerocount
- \else
- \global\c_tabl_tabulate_repeathead\zerocount
- \fi
+ \global\c_tabl_tabulate_repeathead
+ \ifdone
+ \ifcsname\??tabulateheader\tabulationparameter\c!header\endcsname
+ \lastnamedcs
+ \else
+ \zerocount
+ \fi
+ \else
+ \zerocount
+ \fi
%
\the\t_tabl_tabulate_initializers_first % collect more here
%
@@ -2349,7 +2300,6 @@
\t_tabl_tabulate_preamble
{\aligntab
\tabl_tabulate_flush_indent
-% \global\advance\c_tabl_tabulate_noflines\plusone
\strut
\alignmark\alignmark
\tabskip\d_tabl_tabulate_margin
@@ -2361,7 +2311,6 @@
\t_tabl_tabulate_preamble
{\aligntab
\tabl_tabulate_flush_indent
-% \global\advance\c_tabl_tabulate_noflines\plusone
\strut
\alignmark\alignmark
\aligntab
@@ -2375,7 +2324,6 @@
\c_tabl_tabulate_has_rule_spec_last \zerocount
\clf_presettabulate{\detokenizedtabulationparameter\c!format}%
%
- % \edef\totaltabulatecolumns{\the\numexpr3*\c_tabl_tabulate_columns+\plusfour}%
\d_tabl_tabulate_width\zeropoint
\tabl_tabulate_initialize_boxes\c_tabl_tabulate_columns
\toksapp\t_tabl_tabulate_preamble{%
@@ -2404,12 +2352,12 @@
{\notesenabledfalse
\d_tabl_tabulate_indent\zeropoint
\settrialtypesetting % very important
-\anch_backgrounds_text_level_start
+ \anch_backgrounds_text_level_start
\expandafter\halign\expandafter{\the\t_tabl_tabulate_preamble\crcr\tabl_tabulate_insert_content\crcr}}%
-\anch_backgrounds_text_level_stop
-\ifcase\c_anch_backgrounds_text_state\else
- \global\settrue\tablehaspositions
-\fi
+ \anch_backgrounds_text_level_stop
+ \ifcase\c_anch_backgrounds_text_state\else
+ \global\settrue\tablehaspositions
+ \fi
\ifnum\c_tabl_tabulate_nofauto>\zerocount
% so, even if the natural size is larger, in the final run, we force the calculated width
\d_tabl_tabulate_width\dimexpr\hsize-\wd\scratchbox-\d_tabl_tabulate_width_p-\d_tabl_tabulate_width_w\relax
@@ -2449,12 +2397,20 @@
\dostarttaggedchained\t!tabulate\empty\??tabulation
\dostarttagged\t!tabulaterow\empty
\setfalse\inhibitmargindata % new per 2012.06.13 ... really needed
- % \everycr\expandafter{\the\everycr\noalign{\the\t_tabl_tabulate_every_real_row}\dostoptagged\dostarttagged\t!tabulaterow\empty}%
- \toksapp\everycr{\noalign{\the\t_tabl_tabulate_every_real_row}\dostoptagged\dostarttagged\t!tabulaterow\empty}%
- \expandafter\halign\expandafter{\the\t_tabl_tabulate_preamble\crcr\tabl_tabulate_insert_content\crcr}%
+ \toksapp\everycr{%
+ \noalign{\the\t_tabl_tabulate_every_real_row}%
+ \dostoptagged
+ \dostarttagged\t!tabulaterow\empty
+ }%
+ % we are in sync but just to be sure:
+ \synchronizedisplaydirection
+ \synchronizeinlinedirection
+ \halign
+ \usedirectionparameterreverse\tabulateparameter
+ \expandafter{\the\t_tabl_tabulate_preamble\crcr\tabl_tabulate_insert_content\crcr}%
\dostoptagged
\dostoptagged
- \ifhmode\par\prevdepth\strutdp\fi % nog eens beter, temporary hack
+ \ifhmode\par\prevdepth\strutdp\fi % temporary hack
\ifx\p_distance\v!grid
\vskip-\strutdp % experimental tm-prikkels
\fi
@@ -2731,9 +2687,9 @@
%D \stopwhatever
%D \stoptyping
-%D This is needed because we sometimes use the english command in
-%D tracing macros. In fact, most detailed tracing macros that
-%D are done with \LUA\ only work in the english interface anyway.
+%D This is needed because we sometimes use the english command in tracing macros. In
+%D fact, most detailed tracing macros that are done with \LUA\ only work in the
+%D english interface anyway.
% \definetabulate[tabulate] \setuptabulate[tabulate][\c!format=\v!none] % so no \v! here
@@ -3043,16 +2999,16 @@
\ignorespaces}
\appendtoks
- \let\NL\tabl_tabulate_NL_first % NC with Line
- \let\ND\tabl_tabulate_ND_first % NC with Default Line
- \let\LB\tabl_tabulate_LB_first % BC with Line
- \let\DB\tabl_tabulate_DB_first % BC with Default Line
- \let\NF\tabl_tabulate_NF_first % NC with Filler
- \let\NP\tabl_tabulate_NP_first % NC with Predefined Filler
- \let\FB\tabl_tabulate_FB_first % BC with Filler
- \let\PB\tabl_tabulate_PB_first % BC with Predefined Filler
- \let\NA\tabl_tabulate_NA_first % NC with Auto Line
- \let\BA\tabl_tabulate_BA_first % NC with Auto Line
+ \let\NL\tabl_tabulate_NL_first % NC with Line
+ \let\ND\tabl_tabulate_ND_first % NC with Default Line
+ \let\LB\tabl_tabulate_LB_first % BC with Line
+ \let\DB\tabl_tabulate_DB_first % BC with Default Line
+ \let\NF\tabl_tabulate_NF_first % NC with Filler
+ \let\NP\tabl_tabulate_NP_first % NC with Predefined Filler
+ \let\FB\tabl_tabulate_FB_first % BC with Filler
+ \let\PB\tabl_tabulate_PB_first % BC with Predefined Filler
+ \let\NA\tabl_tabulate_NA_first % NC with Auto Line
+ \let\BA\tabl_tabulate_BA_first % NC with Auto Line
\to \t_tabl_tabulate_initializers_first
\appendtoks
diff --git a/Master/texmf-dist/tex/context/base/mkiv/tabl-tbl.mkxl b/Master/texmf-dist/tex/context/base/mkiv/tabl-tbl.mkxl
new file mode 100644
index 00000000000..dc8ae0214c4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/tabl-tbl.mkxl
@@ -0,0 +1,3022 @@
+%D \module
+%D [ file=core-tbl,
+%D version=1998.11.03,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Text Flow Tabulation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Table Macros / Tabulation}
+
+\unprotect
+
+\registerctxluafile{tabl-tbl}{} % experiment
+
+%D I can probably reimplement this using a \LUATEX\ combination but it does not pay
+%D of in development time. If I need something else I will write it from scratch
+%D anyway. This module looks a bit complex which is a consequence of it dealing with
+%D paragraphs being split over pages and that there are several passes over the data
+%D set. We can probably do some cleanup (combine/split).
+%D
+%D Caching the preamble does not save much (compared to other bits and pieces of
+%D \CONTEXT). There are not that many ways to deal with preambles and this is just
+%D one of them. The keys are somewhat similar to those of the \TABLE\ package.
+
+% |p2|p3| 2:3 -> spanning (maybe)
+%
+% In-text tabbing environment
+%
+% \starttabulate[| separated template] % eg [|l|p|] or [|l|p|p|]
+% \NC ... \NC ... \NC\NR
+% \stoptabulate
+%
+% with: two pass auto width calculation when no p-width
+% specified, even with multiple p's, see examples.
+%
+% TaBlE compatible specifications:
+%
+% l align column/paragraph left
+% r align column/paragraph right
+% c align column/paragraph center
+% p p(dimen) of automatisch als alleen p
+% w column width
+% f font#1
+% A {alignmentoptions}
+% B bold
+% I italic
+% S slanted
+% T type
+% R roman
+% m math
+% M display math
+% h hook (inner level or par lines)
+% b before (may be command#1)
+% a after
+% i i<n> skip left of column
+% j i<n> skip right of column
+% k i<n> skip around column
+% d digits (~)
+%
+% C [LMRT] {color} % T is text color
+%
+% | {color,n}
+%
+% s setups
+%
+% g g{char} align at char
+% . align at .
+% , align at ,
+%
+% Still to be done
+%
+% N math numbers (best hook into existing digits mechanism)
+% n numbers (best hook into existing digits mechanism)
+% Q math numbers (best hook into existing digits mechanism)
+% q numbers (best hook into existing digits mechanism)
+% ~ \hskip.5em
+% | check
+%
+% nesting
+%
+% 10 evt auto stack; dan wel andere signal dan void nodig
+%
+% present but not yet 100% ok
+%
+% \TL [width,color] bottom hrule
+% \FL [width,color] first hrule
+% \ML [width,color] mid hrule (with auto split)
+% \LL [width,color] bottom hrule
+% \BL [width,color] last hrule
+%
+% \HL [width,color] top rule
+% \VL [width,color]
+%
+% \CC \CL \CM \CR color
+%
+% \EQ \RQ \HQ equal (raw, hook)
+% \NC \RC \HC normal (raw, hook)
+%
+% \NR checked break
+% \NB no break
+%
+% \HR : rule with lineheight
+%
+% \autotabulaterule : with lineheight, not first/last
+% \autotabulateline : spaced, not first/last
+% \tabulaterule : with lineheight
+% \tabulateline : spaced
+%
+% tricky: align scans ahead, over # and expands ones before
+% while doing
+%
+% new:
+%
+% \starttabulate[|cg{.}|cg{,}|cg{,}|]
+% \NC period \NC comma \NC comma \NC\NR
+% \NG 100.000,00 \NG 100.000,00 \NG 100,00 \NC\NR
+% \NG 10.000,00 \NG 10.000,00 \NG 1000,00 \NC\NR
+% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR
+% \NG 10 \NG 10 \NG 0,00 \NC\NR
+% \stoptabulate
+%
+% \starttabulate[|c.|c,|c,|]
+% \NC period \NC comma \NC comma \NC\NR
+% \NG 100.000,00 \NG 100.000,00 \NG 100,00 \NC\NR
+% \NG 10.000,00 \NG 10.000,00 \NG 1000,00 \NC\NR
+% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR
+% \NG 10 \NG 10 \NG 0,00 \NC\NR
+% \stoptabulate
+
+% nice demo (for BG)
+%
+% \starttabulate[|r|b{$\star$}|ra{\percent}|b{=}|r|]
+% \NC 500 \NC \NC 60 \NC \NC 300 \NC \NR
+% \NC 500 \NC \NC 55 \NC \NC 275 \NC \NR
+% \NC 500 \NC \NC 50 \NC \NC 250 \NC \NR
+% \NC 500 \NC \NC 45 \NC \NC 225 \NC \NR
+% \NC 500 \NC \NC 40 \NC \NC 200 \NC \NR
+% \NC 500 \NC \NC 35 \NC \NC 175 \NC \NR
+% \NC 500 \NC \NC 30 \NC \NC 150 \NC \NR
+% \NC 500 \NC \NC 25 \NC \NC 125 \NC \NR
+% \NC 500 \NC \NC 20 \NC \NC 100 \NC \NR
+% \stoptabulate
+
+\newtoks \t_tabl_tabulate_preamble
+\newtoks \t_tabl_tabulate_before
+\newtoks \t_tabl_tabulate_after
+\newtoks \t_tabl_tabulate_bmath
+\newtoks \t_tabl_tabulate_emath
+\newtoks \t_tabl_tabulate_font
+\newtoks \t_tabl_tabulate_settings
+\newtoks \t_tabl_tabulate_dummy
+\newtoks \t_tabl_tabulate_every_row
+\newtoks \t_tabl_tabulate_every_after_row
+\newtoks \t_tabl_tabulate_every_real_row
+
+\newtoks \t_tabl_tabulate_initializers_first
+\newtoks \t_tabl_tabulate_initializers_second
+
+\newcount \c_tabl_tabulate_nofauto
+\newcount \c_tabl_tabulate_columns
+\newcount \c_tabl_tabulate_column
+\newcount \c_tabl_tabulate_plines_min
+\newcount \c_tabl_tabulate_plines_max
+\newcount \c_tabl_tabulate_max_colorcolumn
+\newcount \c_tabl_tabulate_max_vrulecolumn
+\newcount \c_tabl_tabulate_repeathead
+\newcount \c_tabl_tabulate_noflines
+\newcount \c_tabl_tabulate_totalnoflines
+\newcount \c_tabl_tabulate_minusnoflines
+\newcount \c_tabl_tabulate_align
+\newcount \c_tabl_tabulate_nofrealrows
+\newcount \c_tabl_tabulate_autocolor
+
+\newcount \c_tabl_tabulate_nofcolumns % set at the lua end by parser
+\newcount \c_tabl_tabulate_has_rule_spec_first % set at the lua end by parser (for the moment a count)
+\newcount \c_tabl_tabulate_has_rule_spec_last % set at the lua end by parser (for the moment a count)
+
+\newconditional \c_tabl_tabulate_nopbreak
+\newconditional \c_tabl_tabulate_firstflushed
+\newconditional \c_tabl_tabulate_equal
+\newconditional \c_tabl_tabulate_split \settrue\c_tabl_tabulate_split
+\newconditional \c_tabl_tabulate_automode
+\newconditional \c_tabl_tabulate_handlepbreak \settrue\c_tabl_tabulate_handlepbreak
+\newconditional \c_tabl_tabulate_autorulespacing \settrue\c_tabl_tabulate_autorulespacing
+\newconditional \c_tabl_tabulate_someamble
+\newconditional \c_tabl_tabulate_tolerant_break
+\newconditional \c_tabl_tabulate_splitoff_whitespace
+\newconditional \c_tabl_tabulate_pwidth_set
+\newconditional \c_tabl_tabulate_reshape
+
+\newdimen \d_tabl_tabulate_width_p
+\newdimen \d_tabl_tabulate_width_w
+\newdimen \d_tabl_tabulate_width
+\newdimen \d_tabl_tabulate_unit
+\newdimen \d_tabl_tabulate_height_p_max
+\newdimen \d_tabl_tabulate_vrulethickness_default
+\newdimen \d_tabl_tabulate_hrulethickness_default
+\newdimen \d_tabl_tabulate_vrulethickness
+\newdimen \d_tabl_tabulate_hrulethickness % not used
+\newdimen \d_tabl_tabulate_vrulethickness_local
+\newdimen \d_tabl_tabulate_hrulethickness_local
+\newdimen \d_tabl_tabulate_indent
+\newdimen \d_tabl_tabulate_splitoff_betweenskip
+\newdimen \d_tabl_tabulate_margin
+
+\newskip \s_tabl_tabulate_pre
+\newskip \s_tabl_tabulate_post
+\newskip \s_tabl_tabulate_first
+\newskip \s_tabl_tabulate_last
+\newskip \s_tabl_tabulate_separator
+
+\newbox \b_tabl_tabulate
+
+\newconstant \c_tabl_tabulate_pass
+\newconstant \c_tabl_tabulate_type
+\newconstant \c_tabl_tabulate_kind % 1=strong 2=equals
+\newconstant \c_tabl_tabulate_splitlinemode \c_tabl_tabulate_splitlinemode\plusone
+\newconstant \c_tabl_tabulate_colorspan
+\newconstant \c_tabl_tabulate_localcolorspan
+\newconstant \c_tabl_tabulate_modus
+
+\let\tabulatesplitlinemode\c_tabl_tabulate_splitlinemode % temp hack, we need an interface
+
+\let \m_tabl_tabulate_separator_factor \empty % fraction
+
+\newtoks \everytabulatepar % where used ?
+\newtoks \everytabulate % public ?
+
+\unexpanded\def\tolerantTABLEbreaktrue {\settrue \c_tabl_tabulate_tolerant_break} % used in styles !
+\unexpanded\def\handletabulatepbreakfalse{\setfalse\c_tabl_tabulate_handlepbreak } % depricated
+
+\def\noftabulaterows{\number\c_tabl_tabulate_noflines} % handy for testing if a table is empty
+
+\installcorenamespace{tabulatebox}
+\installcorenamespace{tabulatesetup}
+\installcorenamespace{tabulatehook}
+\installcorenamespace{tabulatesplit}
+\installcorenamespace{tabulateseparator}
+\installcorenamespace{tabulatecolor}
+\installcorenamespace{tabulateheader}
+\installcorenamespace{tabulatealigning}
+\installcorenamespace{tabulatepreamble}
+\installcorenamespace{tabulatevrule}
+
+\installcorenamespace{tabulatehead}
+\installcorenamespace{tabulatefoot}
+\installcorenamespace{tabulatenext}
+
+\prependtoks
+ \global\c_tabl_tabulate_nofrealrows\zerocount
+\to \t_tabl_tabulate_initializers_first
+
+\prependtoks
+ \global\c_tabl_tabulate_nofrealrows\zerocount
+\to \t_tabl_tabulate_initializers_second
+
+\prependtoks
+ \global\advance\c_tabl_tabulate_nofrealrows\plusone
+\to \t_tabl_tabulate_every_real_row
+
+\def\b_tabl_tabulate_current#1%
+ {\csname\??tabulatebox\number#1\endcsname} % beware, a synonym
+
+\def\tabl_tabulate_initialize_boxes#1%
+ {\scratchcounter#1\relax
+ \tabl_tabulate_initialize_boxes_step}
+
+\def\tabl_tabulate_initialize_boxes_step
+ {\ifnum\scratchcounter>\zerocount
+ \tabl_tabulate_initialize_box\scratchcounter
+ \advance\scratchcounter\minusone
+ \expandafter\tabl_tabulate_initialize_boxes_step
+ \fi}
+
+\def\tabl_tabulate_initialize_box#1% also used elsewhere
+ {\ifcsname\??tabulatebox\number#1\endcsname
+ \tabl_tabulate_initialize_box_yes
+ \else
+ \tabl_tabulate_initialize_box_nop#1%
+ \fi}
+
+\def\tabl_tabulate_initialize_box_yes {\global \setbox\lastnamedcs\emptybox}
+\def\tabl_tabulate_initialize_box_nop#1{\expandafter\newbox\csname\??tabulatebox\number#1\endcsname}
+
+\tabl_tabulate_initialize_boxes{16} % not really needed
+
+\let\initializetablebox \tabl_tabulate_initialize_box % used elsewhere, will change
+\let\initializetableboxes\tabl_tabulate_initialize_boxes % used elsewhere, will change
+\let\tablebox \b_tabl_tabulate_current
+
+% 0 = NC column next EQ equal column
+% 1 = RC column raw RQ equal column raw
+% 2 = HC column hook HQ equal column hook
+
+% handy helper
+
+\def\tabulatenoalign % public ?
+ {\noalign
+ \bgroup
+ \let\noalign\relax
+ \let\tabulatenoalign\relax
+ \let\next=}
+
+\def\starttabulatenoalign % public ?
+ {\tabulatenoalign\bgroup}
+
+\let\stoptabulatenoalign\egroup
+
+% [|lg{.}|] => \NG 12.34 \NC
+
+\def\tabl_tabulate_nobreak_inject_tracer
+ {\red % maybe use the fast color switcher here
+ \hrule\s!height.5\linewidth\s!depth.5\linewidth
+ \par
+ \kern-\linewidth
+ \tabl_tabulate_break_no}
+
+\installtextracker
+ {tables.tabulate.breaks}
+ {\let\tabl_tabulate_break_no_tracer\tabl_tabulate_nobreak_inject_tracer}
+ {\let\tabl_tabulate_break_no_tracer\donothing}
+
+\let\tabl_tabulate_break_no_tracer\donothing
+
+\def\tabl_tabulate_nobreak_inject_indeed
+ {\tabl_tabulate_break_no
+ \tabl_tabulate_break_no_tracer}
+
+\def\tabl_tabulate_nobreak_inject
+ {\tabulatenoalign{\tabl_tabulate_nobreak_inject_indeed}}
+
+\unexpanded\def\tabl_tabulate_hook_check
+ {\ifnum\c_tabl_tabulate_type<\plustwo
+ \glet\tabl_tabulate_hook\tabl_tabulate_hook_nop
+ \else
+ \glet\tabl_tabulate_hook\tabl_tabulate_hook_yes
+ \fi}
+
+\unexpanded\def\tabl_tabulate_setups_check
+ {\begincsname\??tabulatesetup\the\c_tabl_tabulate_column\endcsname}
+
+\unexpanded\def\tabl_tabulate_entry_before{\ignorespaces\tabl_tabulate_hook}
+\unexpanded\def\tabl_tabulate_entry_after {\unskip\unskip\ifmmode\else\endgraf\fi}
+
+\unexpanded\def\tabl_tabulate_shaped_par_begin
+ {\dowithnextboxcs\tabl_tabulate_shaped_par_finish\vbox\bgroup}
+
+\def\tabl_tabulate_shaped_par_finish
+ {\clf_doreshapeframedbox\nextbox\relax
+ \ifvmode\unvbox\else\box\fi\nextbox}
+
+\let\tabl_tabulate_shaped_par_end\egroup
+
+\ifdefined\dotagtabulatecell \else \let\dotagtabulatecell \relax \fi
+\ifdefined\dotagtabulatesignal \else \let\dotagtabulatesignal\relax \fi
+
+\unexpanded\def\tabl_tabulate_check_local_color_first#1#2%
+ {\relax}
+
+\unexpanded\def\tabl_tabulate_check_local_color_second#1#2%
+ {\relax
+ \ifx\m_tabl_tabulate_color_local\empty
+ \xdef\m_tabl_tabulate_color{#1}%
+ \else
+ \glet\m_tabl_tabulate_color\m_tabl_tabulate_color_local
+ \glet\m_tabl_tabulate_color_local\empty
+ \fi
+ \ifcase\c_tabl_tabulate_localcolorspan
+ \global\c_tabl_tabulate_colorspan#2\relax
+ \else
+ \global\c_tabl_tabulate_colorspan\c_tabl_tabulate_localcolorspan
+ \global\c_tabl_tabulate_localcolorspan\zerocount
+ \fi}
+
+\unexpanded\def\tabl_tabulate_check_local_vrule_thickness#1%
+ {\relax
+ \ifcase\d_tabl_tabulate_vrulethickness_local
+ \global\d_tabl_tabulate_vrulethickness#1\relax
+ \else
+ \global\d_tabl_tabulate_vrulethickness\d_tabl_tabulate_vrulethickness_local
+ \global\d_tabl_tabulate_vrulethickness_local\zeropoint
+ \fi}
+
+\unexpanded\def\tabl_tabulate_check_local_vrule_color_first#1%
+ {\relax}
+
+\unexpanded\def\tabl_tabulate_check_local_vrule_color_second#1%
+ {\relax
+ \ifx\m_tabl_tabulate_vrule_color_local\empty
+ \xdef\m_tabl_tabulate_vrule_color{#1}%
+ \else
+ \glet\m_tabl_tabulate_vrule_color\m_tabl_tabulate_vrule_color_local
+ \glet\m_tabl_tabulate_vrule_color_local\empty
+ \fi}
+
+\let\tabl_tabulate_check_local_color \gobbletwoarguments
+\let\tabl_tabulate_check_local_vrule_color\gobbleoneargument
+
+\appendtoks
+ \let\tabl_tabulate_check_local_color \tabl_tabulate_check_local_color_first
+ \let\tabl_tabulate_check_local_vrule_color\tabl_tabulate_check_local_vrule_color_first
+\to \t_tabl_tabulate_initializers_first
+
+\appendtoks
+ \let\tabl_tabulate_check_local_color \tabl_tabulate_check_local_color_second
+ \let\tabl_tabulate_check_local_vrule_color\tabl_tabulate_check_local_vrule_color_second
+\to \t_tabl_tabulate_initializers_second
+
+% \unexpanded % we can expand this one
+\def\tabl_tabulate_inject_pre_skip#1%
+ {\ifdim#1>\zeropoint
+ \kern#1\relax % was \hskip
+ \orelse\ifnum\c_tabl_tabulate_column=\zerocount
+ \ifconditional\c_tabl_tabulate_autorulespacing
+ \ifcase\c_tabl_tabulate_has_rule_spec_first\else
+ \kern\s_tabl_tabulate_first\relax % was \hskip
+ \fi
+ \fi
+ \fi}
+
+% \unexpanded % we can expand this one
+\def\tabl_tabulate_inject_post_skip#1%
+ {\ifdim#1>\zeropoint
+ \kern#1\relax % was \hskip
+ \orelse\ifnum\c_tabl_tabulate_columns=\c_tabl_tabulate_nofcolumns
+ \ifconditional\c_tabl_tabulate_autorulespacing
+ \ifcase\c_tabl_tabulate_has_rule_spec_last\else
+ \kern\s_tabl_tabulate_last\relax % was \hskip
+ \fi
+ \fi
+ \fi}
+
+\let\tabl_tabulate_hook_b\donothing
+\let\tabl_tabulate_hook_e\donothing
+
+\let\tabl_tabulate_hook_g\donothing
+
+\def\tabl_tabulate_set_preamble_step#1#2% only makes sense for many tabulates
+ {\etoksapp\t_tabl_tabulate_preamble{%
+ \tabl_tabulate_check_local_vrule_thickness\constantdimenargument\d_tabl_tabulate_vrulethickness
+ \tabl_tabulate_check_local_vrule_color\constantemptyargument\m_tabl_tabulate_vrule_color
+ \tabl_tabulate_check_local_color\constantemptyargument\m_tabl_tabulate_color\constantnumberargument\c_tabl_tabulate_colorspan
+ \tabl_tabulate_color_side_right
+ \aligntab
+ \tabl_tabulate_column_vrule_inject
+ \tabl_tabulate_color_side_left
+ \tabl_tabulate_inject_pre_skip{\the\dimexpr\s_tabl_tabulate_pre}% get rid of plus
+ \alignmark\alignmark
+ \aligntab
+ \tabl_tabulate_color_side_both
+ \global\c_tabl_tabulate_colorspan\zerocount
+ \global\c_tabl_tabulate_column\constantnumber\c_tabl_tabulate_columns
+ \tabl_tabulate_hook_g
+ \tabl_tabulate_setups_check % unexpandable
+ \tabl_tabulate_hook_check % unexpandable
+ \ifzeropt\d_tabl_tabulate_width
+ \ifcase\c_tabl_tabulate_modus\else
+ \settrue\c_tabl_tabulate_automode
+ \fi
+ \else
+ \ifcase\c_tabl_tabulate_modus
+ \hbox to
+ \else
+ \hsize
+ \fi
+ \the\d_tabl_tabulate_width
+ \fi
+ \bgroup
+ \tabl_tabulate_bbskip
+ \bgroup % we cannot combine the if because a cell may have only one ##
+ \tabl_tabulate_hook_b
+ \c_tabl_tabulate_align\constantnumber\c_tabl_tabulate_align % needed in tag passing
+ \ifx\m_tabl_tabulate_alignment\empty \else
+ \spac_align_use_now{\m_tabl_tabulate_alignment}%
+ \fi
+ \noexpand\dostarttagged\noexpand\t!tabulatecell\noexpand\empty
+ \noexpand\dotagtabulatecell
+ \noexpand#1%
+ \ifconditional\c_tabl_tabulate_reshape
+ \tabl_tabulate_shaped_par_begin
+ \fi
+ \dotagtabulatesignal % empty cells .. todo (can be removed as soon as build)
+ \noexpand\ifnum\noexpand\c_tabl_tabulate_type=\plusone\noexpand\else
+ \the\t_tabl_tabulate_bmath % maybe later? can interfere with char 0
+ \the\t_tabl_tabulate_font
+ \the\t_tabl_tabulate_settings
+ \the\t_tabl_tabulate_before
+ \ifx\m_tabl_tabulate_text_color\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\dofastcoloractivation
+ \fi\m_tabl_tabulate_text_color
+ \noexpand\fi
+ % grouping needs to be outside macros (or expandable), nice test
+ % example \NC \string \aligntab \NC which will fail otherwise (mk)
+ \bgroup
+ \tabl_tabulate_entry_before
+ \alignmark\alignmark
+ \tabl_tabulate_entry_after
+ \egroup
+ \noexpand\ifnum\noexpand\c_tabl_tabulate_type=\plusone\noexpand\else
+ \the\t_tabl_tabulate_after
+ \the\t_tabl_tabulate_emath
+ \noexpand\fi
+ \ifconditional\c_tabl_tabulate_reshape
+ \tabl_tabulate_shaped_par_end
+ \fi
+ \noexpand#2%
+ \tabl_tabulate_hook_e
+ \egroup
+ \egroup
+ \aligntab
+ \noexpand\dostoptagged
+ \tabl_tabulate_inject_post_skip{\the\dimexpr\s_tabl_tabulate_post}% get rid of plus
+ \alignmark\alignmark
+ }%
+ \toksapp\t_tabl_tabulate_dummy{\NC}%
+ \s_tabl_tabulate_pre.5\d_tabl_tabulate_unit\relax
+ \ifnum\c_tabl_tabulate_columns<\numexpr\c_tabl_tabulate_nofcolumns-\plusone\relax
+ \s_tabl_tabulate_post\s_tabl_tabulate_pre
+ \else
+ \s_tabl_tabulate_post\zeropoint
+ \fi
+ %\let\gettabulateexit\dogettabulateexit % still needed ?
+ \d_tabl_tabulate_width\zeropoint}
+
+\unexpanded\def\installtabulatepreambleoption#1#2%
+ {\setvalue{\??tabulatepreamble\string#1}{#2}}%
+
+\installtabulatepreambleoption{x}{\c_tabl_tabulate_align\zerocount
+ \tabl_tabulate_set_preamble} % internal
+\installtabulatepreambleoption{l}{\c_tabl_tabulate_align\plusone
+ \tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{r}{\c_tabl_tabulate_align\plustwo
+ \tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{c}{\c_tabl_tabulate_align\plusthree
+ \tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{p}{\tabl_tabulate_set_paragraph}
+\installtabulatepreambleoption{s}{\tabl_tabulate_set_setups}
+\installtabulatepreambleoption{w}{\tabl_tabulate_set_width}
+\installtabulatepreambleoption{f}{\tabl_tabulate_set_font}
+\installtabulatepreambleoption{B}{\t_tabl_tabulate_font{\bf}%
+ \tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{I}{\t_tabl_tabulate_font{\it}%
+ \tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{S}{\t_tabl_tabulate_font{\sl}%
+ \tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{T}{\t_tabl_tabulate_font{\tt}%
+ \tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{R}{\t_tabl_tabulate_font{\rm}%
+ \tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{m}{\t_tabl_tabulate_bmath{\normalstartimath}%
+ \t_tabl_tabulate_emath{\normalstopimath}%
+ \tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{M}{\t_tabl_tabulate_bmath{\normalstartimath\displaystyle}%
+ \t_tabl_tabulate_emath{\normalstopimath}%
+ \tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{h}{\tabl_tabulate_set_hook}
+\installtabulatepreambleoption{b}{\tabl_tabulate_set_before}
+\installtabulatepreambleoption{a}{\tabl_tabulate_set_after}
+\installtabulatepreambleoption{i}{\tabl_tabulate_set_preskip}
+\installtabulatepreambleoption{j}{\tabl_tabulate_set_posskip}
+\installtabulatepreambleoption{k}{\tabl_tabulate_set_preposskip}
+\installtabulatepreambleoption{e}{\toksapp\t_tabl_tabulate_settings{\global\settrue\c_tabl_tabulate_equal}%
+ \tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{g}{\tabl_tabulate_set_align}
+\installtabulatepreambleoption{.}{\tabl_tabulate_set_align.}
+\installtabulatepreambleoption{,}{\tabl_tabulate_set_align,}
+\installtabulatepreambleoption{C}{\tabl_tabulate_set_color_span}
+\installtabulatepreambleoption{d}{\toksapp\t_tabl_tabulate_settings{\fixedspaces}%
+ \tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{ }{\tabl_tabulate_set_preamble}
+\installtabulatepreambleoption{A}{\tabl_tabulate_set_alignment}
+
+%D We no longer deal with \type {~} here but map it onto \type {d} instead. Of
+%D course we could prefix a key with \type {\meaning} instead, which works ok (and
+%D is needed in order to pseudo expand \type {\next}, but is ugly at the same time.
+%D The type {d} stands for digitspace.
+
+%D \starttyping
+%D \installtabulatepreambleoption{~}{...} % see 'd'
+%D \stoptyping
+%D
+%D Also, as there is always a key, we no longer do some after assigment or future
+%D let but just pick up the key.
+
+% \installtabulatepreambleoption \s!unknown %
+% {\writestatus{tabulate}{unknown preamble key [\normalmeaning\next]}%
+% \tabl_tabulate_set_preamble}
+%
+% \def\tabl_tabulate_set_preamble
+% {\afterassignment\dosettabulatepreamble\let\next=}
+%
+% \def\dosettabulatepreamble
+% {\ifx\next\relax \else
+% \csname\??tabulatepreamble
+% \ifcsname\??tabulatepreamble\next\endcsname\next\else\s!unknown\fi
+% \expandafter\endcsname
+% \fi}
+
+\installtabulatepreambleoption\relax
+ {} % finished
+
+\def\tabl_tabulate_set_preamble#1%
+ {\ifcsname\??tabulatepreamble\string#1\endcsname
+ %\expandafter\tabl_tabulate_set_preamble_yes
+ \expandafter\expandafter\expandafter\lastnamedcs\expandafter\gobbleoneargument
+ \else
+ \expandafter\tabl_tabulate_set_preamble_nop
+ \fi{#1}}
+
+\def\tabl_tabulate_set_preamble_yes#1%
+ {\csname\??tabulatepreamble\string#1\expandafter\endcsname}
+
+\def\tabl_tabulate_set_preamble_nop#1%
+ {\writestatus{tabulate}{unknown preamble key: #1}%
+ \tabl_tabulate_set_preamble}
+
+\def\tabl_tabulate_set_preskip#1%
+ {\doifelsenumber{#1}%
+ {\s_tabl_tabulate_pre#1\d_tabl_tabulate_unit\tabl_tabulate_set_preamble }%
+ {\s_tabl_tabulate_pre.5\d_tabl_tabulate_unit\tabl_tabulate_set_preamble#1}}
+
+\def\tabl_tabulate_set_posskip#1%
+ {\doifelsenumber{#1}%
+ {\s_tabl_tabulate_post#1\d_tabl_tabulate_unit\tabl_tabulate_set_preamble }%
+ {\s_tabl_tabulate_post.5\d_tabl_tabulate_unit\tabl_tabulate_set_preamble#1}}
+
+\def\tabl_tabulate_set_preposskip#1%
+ {\doifelsenumber{#1}%
+ {\s_tabl_tabulate_pre#1\d_tabl_tabulate_unit\s_tabl_tabulate_post\s_tabl_tabulate_pre\tabl_tabulate_set_preamble }%
+ {\s_tabl_tabulate_pre.5\d_tabl_tabulate_unit\s_tabl_tabulate_post\s_tabl_tabulate_pre\tabl_tabulate_set_preamble#1}}
+
+\def\tabl_tabulate_set_setups#1%
+ {\setvalue{\??tabulatesetup\the\c_tabl_tabulate_columns}{\setups[#1]}%
+ \tabl_tabulate_set_preamble}
+
+\def\tabl_tabulate_set_hook#1%
+ {\setvalue{\??tabulatehook\the\c_tabl_tabulate_columns}{#1}%
+ \tabl_tabulate_set_preamble}
+
+% begin of character align plugin
+
+\newconditional\c_tabl_auto_align_mode % reset later
+
+\def\tabl_tabulate_hook_g % partly expanded
+ {\ifconditional\c_tabl_auto_align_mode
+ \signalcharacteralign\c_tabl_tabulate_column{\c_tabl_tabulate_noflines+\plusone}%
+ \typo_charalign_adapt_font
+ \fi}
+
+\def\tabl_tabulate_set_align#1%
+ {\global\settrue\c_tabl_auto_align_mode
+ \setcharacteralign\c_tabl_tabulate_columns{#1}%
+ \tabl_tabulate_set_preamble}
+
+% end of character align plugin
+
+\def\tabl_tabulate_set_before#1%
+ {\t_tabl_tabulate_before{#1}%
+ \tabl_tabulate_set_preamble}
+
+\def\tabl_tabulate_set_after#1%
+ {\t_tabl_tabulate_after{#1}%
+ \tabl_tabulate_set_preamble}
+
+\def\tabl_tabulate_set_font#1%
+ {\t_tabl_tabulate_font{#1}%
+ \tabl_tabulate_set_preamble}
+
+\def\tabl_tabulate_pickup_width
+ {\doifelsenextparenthesis\tabl_tabulate_set_width_indeed\tabl_tabulate_set_preamble}
+
+\def\tabl_tabulate_set_width
+ {\setfalse\c_tabl_tabulate_pwidth_set
+ \c_tabl_tabulate_modus\zerocount
+ \tabl_tabulate_pickup_width}
+
+\def\tabl_tabulate_set_alignment#1%
+ {\edef\m_tabl_tabulate_alignment{#1}%
+ \spac_align_use_later\m_tabl_tabulate_alignment
+ \tabl_tabulate_set_preamble}
+
+\def\tabl_tabulate_set_paragraph
+ {\doifelsenextparenthesis
+ {\c_tabl_tabulate_modus\plusone
+ \settrue\c_tabl_tabulate_pwidth_set
+ \tabl_tabulate_pickup_width}
+ {\c_tabl_tabulate_modus\plustwo
+ \setfalse\c_tabl_tabulate_pwidth_set
+ \tabl_tabulate_set_preamble}}
+
+% \startbuffer
+% \toplinebox{\framed[width=3cm,height=2cm]{tufte}}
+% \stopbuffer
+% \starttabulate[|p(fixed)|p|]
+% \dorecurse{100}{\NC \getbuffer \NC test \par test \par \NC \NR}
+% \stoptabulate
+% \starttabulate[|p(fit)|p|]
+% \dorecurse{100}{\NC \getbuffer \NC test \par test \par \NC \NR}
+% \stoptabulate
+
+\def\tabl_tabulate_set_width_indeed(#1)%
+ {\processallactionsinset % can be made faster
+ [#1]%
+ [ \v!fit=>\c_tabl_tabulate_modus\plusthree,
+ \v!fixed=>\c_tabl_tabulate_modus\plusthree
+ \settrue\c_tabl_tabulate_nopbreak,
+ \v!auto=>\c_tabl_tabulate_modus\plusthree
+ \settrue\c_tabl_tabulate_reshape,
+ \s!unknown=>\d_tabl_tabulate_width#1\relax]%
+ \ifconditional\c_tabl_tabulate_pwidth_set
+ \global\advance\d_tabl_tabulate_width_p\d_tabl_tabulate_width % accumulated parwidth
+ \fi
+ \tabl_tabulate_set_preamble}
+
+% faster but seldom used
+%
+% \installcorenamespace{tabulatewidth}
+%
+% \setvalue{\??tabulatewidth\v!fit }{\c_tabl_tabulate_modus\plusthree}
+% \setvalue{\??tabulatewidth\v!fixed}{\c_tabl_tabulate_modus\plusthree\settrue\c_tabl_tabulate_nopbreak}
+% \setvalue{\??tabulatewidth\v!auto }{\c_tabl_tabulate_modus\plusthree\settrue\c_tabl_tabulate_reshape}
+%
+% \def\tabl_tabulate_set_width_step#1%
+% {\ifcsname\??tabulatewidth#1\endcsname
+% \lastnamedcs
+% \else
+% \d_tabl_tabulate_width#1\relax
+% \fi}
+%
+% \def\tabl_tabulate_set_width_indeed(#1)%
+% {\rawprocesscommacommand[#1]\tabl_tabulate_set_width_step
+% \ifconditional\c_tabl_tabulate_pwidth_set
+% \global\advance\d_tabl_tabulate_width_p\d_tabl_tabulate_width % accumulated parwidth
+% \fi
+% \tabl_tabulate_set_preamble}
+%
+\def\tabl_tabulate_set_raggedright {\ifnum\c_tabl_tabulate_type=\plusone \else\raggedright \fi}
+\def\tabl_tabulate_set_raggedcenter{\ifnum\c_tabl_tabulate_type=\plusone \else\raggedcenter\fi}
+\def\tabl_tabulate_set_raggedleft {\ifnum\c_tabl_tabulate_type=\plusone \else\raggedleft \fi}
+\def\tabl_tabulate_set_notragged {\ifnum\c_tabl_tabulate_type=\plusone \else\notragged \fi}
+\def\tabl_tabulate_set_hss {\ifnum\c_tabl_tabulate_type=\plusone \else\hss \fi} % never change this to a fill
+
+\def\tabl_tabulate_bskip_raggedright {\tabl_tabulate_bskip\tabl_tabulate_set_raggedright }
+\def\tabl_tabulate_bskip_raggedleft {\tabl_tabulate_bskip\tabl_tabulate_set_raggedleft }
+\def\tabl_tabulate_bskip_raggedcenter{\tabl_tabulate_bskip\tabl_tabulate_set_raggedcenter}
+
+\def\tabl_tabulate_set_width_normal
+ {\ifcase\c_tabl_tabulate_align\relax
+ \tabl_tabulate_set_preamble_step\empty \tabl_tabulate_set_hss \or
+ \tabl_tabulate_set_preamble_step\empty \tabl_tabulate_set_hss \or
+ \tabl_tabulate_set_preamble_step\tabl_tabulate_set_hss\empty \or
+ \tabl_tabulate_set_preamble_step\tabl_tabulate_set_hss\tabl_tabulate_set_hss \fi}
+
+\def\tabl_tabulate_set_width_fixed
+ {\ifcase\c_tabl_tabulate_align\relax
+ \tabl_tabulate_set_preamble_step\tabl_tabulate_bskip \tabl_tabulate_eskip \or
+ \tabl_tabulate_set_preamble_step\tabl_tabulate_bskip_raggedright \tabl_tabulate_eskip \or
+ \tabl_tabulate_set_preamble_step\tabl_tabulate_bskip_raggedleft \tabl_tabulate_eskip \or
+ \tabl_tabulate_set_preamble_step\tabl_tabulate_bskip_raggedcenter\tabl_tabulate_eskip \fi}
+
+\def\tabl_tabulate_set_width_auto
+ {\global\advance\c_tabl_tabulate_nofauto\plusone
+ \ifcase\c_tabl_tabulate_align\relax
+ \tabl_tabulate_set_preamble_step\tabl_tabulate_bskip \tabl_tabulate_eskip \or
+ \tabl_tabulate_set_preamble_step\tabl_tabulate_bskip_raggedright \tabl_tabulate_eskip \or
+ \tabl_tabulate_set_preamble_step\tabl_tabulate_bskip_raggedleft \tabl_tabulate_eskip \or
+ \tabl_tabulate_set_preamble_step\tabl_tabulate_bskip_raggedcenter\tabl_tabulate_eskip \fi}
+
+\def\tabl_tabulate_set_width_simple
+ {\tabl_tabulate_set_preamble_step\tabl_tabulate_xbskip\tabl_tabulate_xeskip}
+
+% \def\tabl_tabulate_set_color_span#1#2%
+% {\xdef\m_tabl_tabulate_color{#2}%
+% \global\c_tabl_tabulate_colorspan\if#1L\plusone\else\if#1M\plustwo\else\if#1R\plusthree\else\zerocount\fi\fi\fi\relax
+% \tabl_tabulate_set_preamble}
+
+\installcorenamespace{tabulatecolorspec}
+
+\setvalue{\??tabulatecolorspec C}#1{\xdef\m_tabl_tabulate_color {#1}\global\c_tabl_tabulate_colorspan\zerocount}
+\setvalue{\??tabulatecolorspec L}#1{\xdef\m_tabl_tabulate_color {#1}\global\c_tabl_tabulate_colorspan\plusone }
+\setvalue{\??tabulatecolorspec M}#1{\xdef\m_tabl_tabulate_color {#1}\global\c_tabl_tabulate_colorspan\plustwo }
+\setvalue{\??tabulatecolorspec R}#1{\xdef\m_tabl_tabulate_color {#1}\global\c_tabl_tabulate_colorspan\plusthree}
+\setvalue{\??tabulatecolorspec T}#1{\xdef\m_tabl_tabulate_text_color{#1}}
+
+\def\tabl_tabulate_set_color_span#1#2%
+ {\csname\??tabulatecolorspec#1\endcsname{#2}%
+ \tabl_tabulate_set_preamble}
+
+\def\tabl_tabulate_set_vrule_command#1%
+ {\doifelsenumber{#1}
+ {\global\d_tabl_tabulate_vrulethickness#1\d_tabl_tabulate_vrulethickness_default}
+ {\xdef\m_tabl_tabulate_vrule_color{#1}}}
+
+\def\tabl_tabulate_set_entry#1#2% rulespec template
+ {\c_tabl_tabulate_align\v_tabl_tabulate_align
+ \c_tabl_tabulate_modus\zerocount
+ \setfalse\c_tabl_tabulate_pwidth_set
+ \setfalse\c_tabl_tabulate_reshape
+ \t_tabl_tabulate_before\emptytoks
+ \t_tabl_tabulate_after\emptytoks
+ \t_tabl_tabulate_bmath\emptytoks
+ \t_tabl_tabulate_emath\emptytoks
+ \t_tabl_tabulate_font\emptytoks
+ \t_tabl_tabulate_settings\emptytoks
+ \glet\m_tabl_tabulate_alignment\empty
+ \glet\m_tabl_tabulate_color\empty
+ \glet\m_tabl_tabulate_text_color\empty
+ \glet\m_tabl_tabulate_vrule_color\empty
+ \global\c_tabl_tabulate_colorspan\zerocount
+ \global\setfalse\c_tabl_auto_align_mode
+ \global\advance\c_tabl_tabulate_columns\plusone
+ \expandafter\let\csname\??tabulatesetup\the\c_tabl_tabulate_columns\endcsname\donothing % here ?
+ \edef\currenttabulationtrulespec{#1}%
+ \ifx\currenttabulationtrulespec\empty
+ \global\d_tabl_tabulate_vrulethickness\zeropoint
+ \else
+ \global\d_tabl_tabulate_vrulethickness\d_tabl_tabulate_vrulethickness_default
+ \rawprocesscommalist[#1]\tabl_tabulate_set_vrule_command
+ \fi
+ \tabl_tabulate_set_preamble#2\relax\relax % permits i without n
+ \ifcase\c_tabl_tabulate_modus\relax
+ \tabl_tabulate_set_width_normal
+ \or % fixed width
+ \tabl_tabulate_set_width_fixed
+ \or % auto width
+ \tabl_tabulate_set_width_auto
+ \or % simple
+ \tabl_tabulate_set_width_simple
+ \fi}
+
+\def\tabl_tabulate_set_last_entry#1% rulespec
+ {\glet\m_tabl_tabulate_color\empty
+ \glet\m_tabl_tabulate_vrule_color\empty
+ \edef\currenttabulationtrulespec{#1}%
+ \ifx\currenttabulationtrulespec\empty
+ \global\d_tabl_tabulate_vrulethickness\zeropoint
+ \else
+ \global\d_tabl_tabulate_vrulethickness\d_tabl_tabulate_vrulethickness_default
+ \rawprocesscommalist[#1]\tabl_tabulate_set_vrule_command
+ \fi
+ \etoksapp\t_tabl_tabulate_preamble{%
+ \tabl_tabulate_check_local_vrule_thickness\constantdimenargument\d_tabl_tabulate_vrulethickness
+ \tabl_tabulate_check_local_vrule_color\constantemptyargument\m_tabl_tabulate_vrule_color
+ \tabl_tabulate_column_vrule_inject}}
+
+\let\settabulateentry \tabl_tabulate_set_entry % used at the lua end
+\let\settabulatelastentry\tabl_tabulate_set_last_entry % used at the lua end
+
+\def\tabl_tabulate_normalize_splitline
+ {\ifcase\c_tabl_tabulate_splitlinemode
+ % nothing
+ \or
+ \ht\b_tabl_tabulate\strutht
+ \dp\b_tabl_tabulate\strutdp
+ \or
+ \ifdim\ht\b_tabl_tabulate<\strutht
+ \ht\b_tabl_tabulate\strutht
+ \fi
+ \ifdim\dp\b_tabl_tabulate<\strutdp
+ \dp\b_tabl_tabulate\strutdp
+ \fi
+ \fi}
+
+\def\tabl_tabulate_whitespace
+ {\ifdim\d_tabl_tabulate_splitoff_betweenskip>\zeropoint
+ \vskip\d_tabl_tabulate_splitoff_betweenskip
+ \global\d_tabl_tabulate_splitoff_betweenskip\zeropoint
+ \fi}
+
+\def\tabl_tabulate_check_whitespace
+ {\setbox\scratchbox\vpack
+ {\splitdiscards
+ \unskip
+ \ifdim\lastskip>\d_tabl_tabulate_splitoff_betweenskip
+ \global\d_tabl_tabulate_splitoff_betweenskip\lastskip
+ \fi}}
+
+\installtexdirective
+ {tabulate.linenumbers}
+ {\def\tabl_tabulate_check_linenumbers{\page_postprocessors_linenumbers_deepbox\b_tabl_tabulate}}
+ {\let\tabl_tabulate_check_linenumbers\relax}
+
+\let\tabl_tabulate_check_linenumbers\relax
+
+\def\tabl_tabulate_splitoff_box
+ {\dontcomplain
+ \global\setbox\b_tabl_tabulate\vsplit\b_tabl_tabulate_current\c_tabl_tabulate_column to \lineheight % % % global ? % % %
+ \setbox\b_tabl_tabulate\vbox
+ {\unvbox\b_tabl_tabulate}%
+ \ifconditional\c_tabl_tabulate_splitoff_whitespace
+ \tabl_tabulate_check_whitespace
+ \fi
+ \tabl_tabulate_color_repeat % needs to end up in a cell
+ \setbox\b_tabl_tabulate\hpack to \wd\b_tabl_tabulate
+ {\hss\tabl_tabulate_hook_yes{\box\b_tabl_tabulate}\hss}%
+ \tabl_tabulate_normalize_splitline
+ \tabl_tabulate_check_linenumbers
+ \box\b_tabl_tabulate}
+
+\unexpanded\def\tabl_tabulate_hook_nop
+ {}
+
+\let\tabl_tabulate_hook\tabl_tabulate_hook_nop
+
+\def\tabl_tabulate_hook_yes{\begincsname\??tabulatehook\the\c_tabl_tabulate_column\endcsname}
+
+\def\tabl_tabulate_pheight_reset
+ {\global\c_tabl_tabulate_plines_min\plusone
+ \ifdim\d_tabl_tabulate_height_p_max>\zeropoint
+ \getnoflines\d_tabl_tabulate_height_p_max
+ \global\c_tabl_tabulate_plines_max\noflines
+ \else
+ \global\c_tabl_tabulate_plines_max\zerocount
+ \fi
+ \global\d_tabl_tabulate_height_p_max\zeropoint}
+
+\def\tabl_tabulate_pheight_set
+ {\scratchdimen\ht\b_tabl_tabulate_current\c_tabl_tabulate_column\relax
+ \ifdim\scratchdimen>\d_tabl_tabulate_height_p_max
+ \global\d_tabl_tabulate_height_p_max\scratchdimen
+ \fi}
+
+\def\tabl_tabulate_pbreak_inject
+ {\ifconditional\c_tabl_tabulate_handlepbreak
+ \ifconditional\c_tabl_tabulate_nopbreak
+ \tabl_tabulate_nobreak_inject
+ \orelse\ifnum\c_tabl_tabulate_plines_max>\plusone
+ \ifnum\c_tabl_tabulate_plines_min=\plusone
+ \tabl_tabulate_nobreak_inject
+ \fi
+ \global\advance\c_tabl_tabulate_plines_min\plusone
+ \ifnum\c_tabl_tabulate_plines_min=\c_tabl_tabulate_plines_max\relax
+ \tabl_tabulate_nobreak_inject
+ \fi
+ \fi
+ \fi}
+
+\def\tabl_tabulate_pbreak_check
+ {\starttabulatenoalign
+ \tabl_tabulate_pbreak_inject
+ \ifconditional\c_tabl_tabulate_splitoff_whitespace
+ \tabl_tabulate_whitespace
+ \fi
+ \stoptabulatenoalign}
+
+%D \startbuffer
+%D \starttabulate[|c|p|p|]
+%D \NC \bf Alpha \NC \bf Beta \NC \bf Gamma \NC\NR
+%D \NC 1 \NC right indeed \NC definitely wrong \NC\NR
+%D \NC 2 \NC \thinrules[n=3] \NC \thinrules[n=3] \NC\NR
+%D \NC 3 \NC oh yes \NC simply no \NC\NR
+%D \NC 4 \NC very true \NC as false as can be \NC\NR
+%D \NC 5 \NC \thinrules[n=5] \NC \thinrules[n=5] \NC\NR
+%D \NC 6 \NC \thinrules[n=3] \NC \thinrules[n=4] \NC\NR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer {\tracetabulatetrue\getbuffer}
+%D
+%D \startbuffer
+%D \starttabulate[|c|p|p|]
+%D \NC \bf Alpha \NC \bf Beta \NC \bf Gamma \NC\NR
+%D \NC 1 \NC right indeed \NC definitely wrong \NC\NR
+%D \NC 2 \NC oh yes \NC simply no \NC\NR
+%D \NC 3 \NC very true \NC as false as can be \NC\NR
+%D \NC 4 \NC the whole truth \NC but the truth \NC\NR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer {\tracetabulatetrue\getbuffer}
+
+%D Because we want to be compatible we use an indirect way to implement the
+%D definers. The next examples demonstrate the difference:
+%D
+%D \starttyping
+%D \definetabulate[test][|l|c|r|]
+%D \definetabulate[test][two][|r|c|l|]
+%D
+%D \definetabulation[more][format={|l|c|r|}]
+%D \definetabulation[more:two][format={|r|c|l|}]
+%D
+%D \starttest
+%D \NC t \NC t \NC t \NC \NR
+%D \NC te \NC te \NC te \NC \NR
+%D \NC tes \NC tes \NC tes \NC \NR
+%D \NC test \NC test \NC test \NC \NR
+%D \stoptest
+%D
+%D \starttest[two]
+%D \NC t \NC t \NC t \NC \NR
+%D \NC te \NC te \NC te \NC \NR
+%D \NC tes \NC tes \NC tes \NC \NR
+%D \NC test \NC test \NC test \NC \NR
+%D \stoptest
+%D \startmore
+%D \NC t \NC t \NC t \NC \NR
+%D \NC te \NC te \NC te \NC \NR
+%D \NC tes \NC tes \NC tes \NC \NR
+%D \NC test \NC test \NC test \NC \NR
+%D \stopmore
+%D
+%D \startmore[two]
+%D \NC t \NC t \NC t \NC \NR
+%D \NC te \NC te \NC te \NC \NR
+%D \NC tes \NC tes \NC tes \NC \NR
+%D \NC test \NC test \NC test \NC \NR
+%D \stopmore
+%D \stoptyping
+
+\installcorenamespace {tabulation}
+
+\installcommandhandler \??tabulation {tabulation} \??tabulation
+
+\setuptabulation
+ [\c!unit=1em,
+ EQ={:},
+ \c!format={|l|p|},
+ \c!frame=\v!off,
+ %\c!bodyfont=,
+ \c!rule=\v!normal,
+ %\c!rulecolor=,
+ \c!rulethickness=\linewidth,
+ %\c!inner=,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!distance={\v!depth,\v!medium},
+ \c!align=\v!normal,
+ \c!margin=\!!zeropoint,
+ \c!split=\v!auto,
+ \c!header=\v!yes,
+ %\c!title=,
+ \c!indenting=\v!no]
+
+\unexpanded\def\definetabulate
+ {\dotripleempty\tabl_tabulate_define}
+
+\def\tabl_tabulate_define[#1][#2][#3]%
+ {\ifthirdargument
+ % [tag] [sub] [template]
+ \ifcsname\namedtabulationhash{#1}\s!check\endcsname \else
+ \definetabulation[#1][\c!format={#3},\s!check=]%
+ \fi
+ \definetabulation[#1:#2][#1][\c!format={#3},\s!check=]%
+ \orelse\ifsecondargument
+ % [tag] [template]
+ \definetabulation[#1][\c!format={#2},\s!check=]%
+ \else
+ % [tag]
+ \definetabulation[#1][\c!format={|l|p|},\s!check=]%
+ \fi}
+
+\unexpanded\def\setuptabulate
+ {\dotripleempty\tabl_tabulate_setup}
+
+\def\tabl_tabulate_setup[#1][#2][#3]%
+ {\ifthirdargument
+ % [tag] [sub] [settings]
+ \setuptabulation[#1:#2][#3]%
+ \orelse\ifsecondargument
+ % [tag] [settings]
+ \setuptabulation[#1][#2]%
+ \else
+ % [tag]
+ \setuptabulation[#1]%
+ \fi}
+
+\appendtoks
+ \setuevalue{\e!start\currenttabulation}{\tabl_start_defined[\currenttabulation]}%
+ \letvalue{\e!stop\currenttabulation}\relax
+ \letvalue{\??tabulatehead\currenttabulation}\empty
+ \letvalue{\??tabulatefoot\currenttabulation}\empty
+\to \everydefinetabulation
+
+\let\tabulateparameter\tabulationparameter % will stay for a while
+\def\currenttabulate {\currenttabulation} % will stay for a while
+
+% Here begins the implementation.
+
+\let\tabl_tabulate_insert_head\empty
+\let\tabl_tabulate_insert_body\empty
+\let\tabl_tabulate_insert_foot\empty
+
+\def\tabl_tabulate_insert_head_content
+ {\tabulatenoalign{\global\settrue\c_tabl_tabulate_someamble}%
+ \begincsname\??tabulatehead\currenttabulation\endcsname
+ \tabulatenoalign{\global\setfalse\c_tabl_tabulate_someamble}}%
+
+\def\tabl_tabulate_insert_foot_content
+ {\tabulatenoalign{\global\settrue\c_tabl_tabulate_someamble}%
+ \begincsname\??tabulatefoot\currenttabulation\endcsname
+ \tabulatenoalign{\global\setfalse\c_tabl_tabulate_someamble}}%
+
+\def\tabl_tabulate_check_full_content % - needed, else confusion with \c!header
+ {\ifcsname\??tabulatehead\currenttabulation\endcsname
+ %\expandafter\ifx\csname\??tabulatehead\currenttabulation\endcsname\empty
+ \expandafter\ifx\lastnamedcs\empty
+ \let\tabl_tabulate_insert_head\empty
+ \else
+ \let\tabl_tabulate_insert_head\tabl_tabulate_insert_head_content
+ \fi
+ \else
+ \let\tabl_tabulate_insert_head\empty
+ \fi
+ \ifcsname\??tabulatefoot\currenttabulation\endcsname
+ \expandafter\ifx\csname\??tabulatefoot\currenttabulation\endcsname\empty
+ %\expandafter\ifx\lastnamedcs\empty
+ \let\tabl_tabulate_insert_foot\empty
+ \else
+ \let\tabl_tabulate_insert_foot\tabl_tabulate_insert_foot_content
+ \fi
+ \else
+ \let\tabl_tabulate_insert_foot\empty
+ \fi}
+
+\def\tabl_tabulate_insert_content
+ {\tabl_tabulate_insert_head
+ \ifcase\c_tabl_tabulate_repeathead \else
+ \tabulatenoalign{\penalty\zerocount}% added 7/5/2014 WS mail
+ \fi
+ \tabl_tabulate_insert_body
+ \tabl_tabulate_insert_foot
+ \tabl_tabulate_remove_funny_line}
+
+\def\tabl_tabulate_remove_funny_line
+ {\ifhmode
+ \strut\crcr
+ \tabulatenoalign{\kern-\lineheight}%
+ \fi}
+
+% todo: make footer synonym to tail
+
+\setuvalue{\e!start\v!tabulatehead}{\doifelsenextoptionalcs\tabl_tabulate_start_head_yes\tabl_tabulate_start_head_nop}
+\setuvalue{\e!start\v!tabulatetail}{\doifelsenextoptionalcs\tabl_tabulate_start_foot_yes\tabl_tabulate_start_foot_nop}
+
+\let\m_tabl_tabulate_data\empty
+
+\def\tabl_tabulate_start_head_yes[#1]%
+ {\processcontent{\e!stop\v!tabulatehead}\m_tabl_tabulate_data{\letvalue{\??tabulatehead#1}\m_tabl_tabulate_data}}
+
+\def\tabl_tabulate_start_foot_yes[#1]%
+ {\processcontent{\e!stop\v!tabulatetail}\m_tabl_tabulate_data{\letvalue{\??tabulatefoot#1}\m_tabl_tabulate_data}}
+
+\def\tabl_tabulate_start_head_nop{\tabl_tabulate_start_head_yes[\v!tabulate]}
+\def\tabl_tabulate_start_foot_nop{\tabl_tabulate_start_foot_yes[\v!tabulate]}
+
+\unexpanded\def\tabl_start_defined[#1]%
+ {\bgroup
+ \edef\currenttabulationparent{#1}%
+ \let\currenttabulation\currenttabulationparent
+ \edef\p_format{\tabulationparameter\c!format}%
+ \ifx\p_format\v!none
+ % this is special case: we need to define the generic english
+ % \starttabulate in other interfaces as well
+ \expandafter\dodoubleempty \expandafter\tabl_start_regular
+ \else
+ \expandafter\dodoubleargument\expandafter\tabl_start_defined_indeed
+ \fi}
+
+\def\tabl_start_defined_indeed
+ {\iffirstargument
+ \ifsecondargument
+ \doubleexpandafter\tabl_start_defined_two
+ \else
+ \doubleexpandafter\tabl_start_defined_one
+ \fi
+ \else
+ \singleexpandafter\tabl_start_defined_zero
+ \fi}
+
+\def\tabl_start_defined_one[#1][#2]%
+ {\ifcondition\validassignment{#1}%
+ \setuptabulation[\currenttabulation][#1]%
+ \else
+ \edef\currenttabulation{\currenttabulation:#1}%
+ \fi
+ \tabl_tabulate_start_building}
+
+\def\tabl_start_defined_two[#1][#2]%
+ {\edef\currenttabulation{\currenttabulation:#1}%
+ \setuptabulation[\currenttabulation][#2]%
+ \tabl_tabulate_start_building}
+
+\def\tabl_start_defined_zero[#1][#2]%
+ {\tabl_tabulate_start_building}
+
+% \definetabulate[\v!tabulate][|l|p|] % we need to get rid of this one
+
+\unexpanded\setuvalue{\e!start\v!tabulate}%
+ {\bgroup % whole thing
+ \let\currenttabulationparent\empty
+ \dodoubleempty\tabl_start_regular}
+
+\def\tabl_start_regular
+ {\let\currenttabulation\currenttabulationparent
+ \ifsecondargument
+ \expandafter\tabl_start_regular_two
+ \else
+ \expandafter\tabl_start_regular_one
+ \fi}
+
+\def\tabl_default_format{|l|p|}
+
+\def\tabl_start_regular_one[#1][#2]%
+ {\ifcondition\validassignment{#1}%
+ \lettabulationparameter\c!format\tabl_default_format
+ \setupcurrenttabulation[#1]%
+ \else
+ \def\p_format{#1}%
+ \ifx\p_format\empty
+ \def\p_format{|l|p|}%
+ \fi
+ \lettabulationparameter\c!format\p_format
+ \fi
+ \tabl_tabulate_start_building}
+
+\def\tabl_start_regular_two[#1][#2]%
+ {\def\p_format{#1}%
+ \ifx\p_format\empty
+ \let\p_format\tabl_default_format
+ \fi
+ \lettabulationparameter\c!format\p_format
+ \setupcurrenttabulation[#2]%
+ \tabl_tabulate_start_building}
+
+\letvalue{\e!stop\v!tabulate }\relax
+\letvalue{\e!stop\v!tabulatehead}\relax
+\letvalue{\e!stop\v!tabulatetail}\relax
+
+\unexpanded\def\tabl_tabulate_start_ignore
+ {\em Nested tabulate is not (yet) supported.\relax
+ \expandafter\gobbleuntil\csname\ifconditional\c_tabl_generic stoptabulate\else\e!stop\v!tabulate\fi\endcsname}
+
+\appendtoks
+ \letvalue{\e!start\v!tabulate}\tabl_tabulate_start_ignore % only the main one
+\to \everytabulate
+
+\setvalue{\??tabulatesplit\v!yes }{\settrue\c_tabl_tabulate_split}
+\setvalue{\??tabulatesplit\v!repeat}{\settrue\c_tabl_tabulate_split}
+\setvalue{\??tabulatesplit\v!no }{\setfalse\c_tabl_tabulate_split}
+\setvalue{\??tabulatesplit\v!auto }{\ifinsidefloat\ifinsidesplitfloat\else\setfalse\c_tabl_tabulate_split\fi\fi}
+
+% todo: spacing around tabulate when bodyfont is set
+
+% \let\tabl_tabulate_inside_before \relax
+% \let\tabl_tabulate_inside_after \relax
+% \let\tabl_tabulate_inside_inbetween\relax
+%
+% \def\tabl_tabulate_outside_before
+% {\whitespace
+% \tabulationparameter\c!before}
+%
+% \def\tabl_tabulate_outside_after
+% {\tabulationparameter\c!after}
+
+% \showboxes
+%
+% \startcombination
+% {\insidefloattrue \starttabulate[|||] \NC test \NC test \NC \NR \stoptabulate} {}
+% {\insidefloattrue \starttabulate[|||] \NC test \NC test \NC \NR \stoptabulate} {}
+% \stopcombination
+%
+% \startcombination
+% {\vbox{\starttabulate[|||] \NC test \NC test \NC \NR \stoptabulate}} {}
+% {\vbox{\starttabulate[|||] \NC test \NC test \NC \NR \stoptabulate}} {}
+% \stopcombination
+%
+% \startcombination
+% {\starttabulate[|||] \NC test \NC test \NC \NR \stoptabulate} {}
+% {\starttabulate[|||] \NC test \NC test \NC \NR \stoptabulate} {}
+% \stopcombination
+
+\let\tabl_tabulate_inside_after \relax
+\let\tabl_tabulate_outside_after \relax
+\let\tabl_tabulate_inside_inbetween \relax
+\let\tabl_tabulate_outside_inbetween\relax
+
+\unexpanded\def\tabl_tabulate_inside_before
+ {\ifhmode\par\fi
+ \ifhmode
+ \ifinsidesplitfloat
+ \let\tabl_tabulate_inside_after\relax
+ \else
+ \vbox\bgroup
+ \let\tabl_tabulate_inside_after\egroup
+ \fi
+ \else
+ \let\tabl_tabulate_inside_after\relax
+ \fi}
+
+\unexpanded\def\tabl_tabulate_outside_before
+ {\ifhmode\par\fi
+ \ifhmode
+ \vbox\bgroup
+ \let\tabl_tabulate_outside_after \egroup
+ \let\tabl_tabulate_outside_inbetween\relax
+ \orelse\ifinner
+ \let\tabl_tabulate_outside_after \relax
+ \let\tabl_tabulate_outside_inbetween\relax
+ \else
+ \whitespace
+ \tabulationparameter\c!before
+ \relax
+ \let\tabl_tabulate_outside_after \tabl_tabulate_outside_after_indeed
+ \let\tabl_tabulate_outside_inbetween\tabl_tabulate_outside_inbetween_indeed
+ \fi}
+
+\def\tabl_tabulate_outside_after_indeed
+ {\tabulationparameter\c!after}
+
+\def\tabl_tabulate_outside_inbetween_indeed
+ {\doifempty{\tabulationparameter\c!after}
+ {\vskip\strutdp
+ \verticalstrut
+ \vskip-\struttotal}}
+
+\def\tabl_tabulate_inside_inbetween % needs checking
+ {\doifempty{\tabulationparameter\c!after}
+ {\vskip\strutdp
+ \verticalstrut
+ \vskip-\struttotal}}
+
+\unexpanded\def\tabl_tabulate_start_building
+ {\ifinsidefloat
+ \tabl_tabulate_inside_before
+ \else
+ \tabl_tabulate_outside_before
+ \fi
+ \bgroup % settings
+ %
+ \t_tabl_tabulate_preamble\emptytoks
+ \t_tabl_tabulate_dummy \emptytoks
+ %
+ \resetcharacteralign
+ %
+ \edef\p_distance {\tabulationparameter\c!distance}%
+ \edef\p_align {\tabulationparameter\c!align}%
+ \edef\p_line {\tabulationparameter\c!rule}%
+ \edef\p_rulecolor {\tabulationparameter\c!rulecolor}%
+ \edef\p_rulethickness{\tabulationparameter\c!rulethickness}%
+ \edef\p_bodyfont {\tabulationparameter\c!bodyfont}
+ \edef\p_indenting {\tabulationparameter\c!indenting}%
+ \edef\p_keeptogether {\tabulationparameter\c!keeptogether}%
+ \edef\p_blank {\tabulationparameter\c!blank}%
+ %
+ \ifx\p_keeptogether\v!no
+ \settrue \c_tabl_tabulate_tolerant_break
+ %\setfalse\c_tabl_tabulate_handlepbreak
+ \else
+ \setfalse\c_tabl_tabulate_tolerant_break
+ %\settrue \c_tabl_tabulate_handlepbreak
+ \fi
+ %
+ \settrue\c_tabl_tabulate_split
+ \begincsname\??tabulatesplit\tabulationparameter\c!split\endcsname
+ %
+ \let\m_tabl_tabulate_blank_default\p_blank
+ %
+ \d_tabl_tabulate_unit\tabulationparameter\c!unit
+ \d_tabl_tabulate_margin\tabulationparameter\c!margin
+ \let\m_tabl_tabulate_vrule_color_default\p_rulecolor
+ \let\m_tabl_tabulate_hrule_color_default\p_rulecolor
+ \d_tabl_tabulate_vrulethickness_default\p_rulethickness
+ \d_tabl_tabulate_hrulethickness_default\p_rulethickness
+ \ifx\p_bodyfont\empty\else
+ \switchtobodyfont[\p_bodyfont]%
+ \fi
+ \postponenotes % new, to be tested / will be configurable
+ \widowpenalty\zerocount % otherwise lines are not broken
+ \clubpenalty \zerocount % but overlap in funny ways
+ \the\everytabulate
+ \tabulationparameter\c!inner
+ \d_tabl_tabulate_indent\dimexpr\leftskip+\hangindent\ifx\p_indenting\v!yes+\parindent\fi\relax
+ \global\c_tabl_tabulate_column\zerocount
+ \processcontent
+ {\ifconditional\c_tabl_generic stoptabulate\else\e!stop\ifx\currenttabulationparent\empty\v!tabulate\else\currenttabulationparent\fi\fi}
+ \tabl_tabulate_insert_body
+ \tabl_tabulate_process}
+
+\def\tabulateEQ
+ {\ifconditional\c_tabl_tabulate_firstflushed\else
+ \dostarttaggedchained\t!ignore\empty\empty
+ \dostarttagged\t!ignore\empty
+ \tabulationparameter{EQ}%
+ \dostoptagged
+ \dostoptagged
+ \fi
+ \global\setfalse\c_tabl_tabulate_equal}
+
+% The next ones will be token registers
+
+\let\tabulatenormalpos\relax % hooks, todo
+\let\tabulateequalpos \relax % hooks, todo
+
+% color columns
+
+\let\m_tabl_tabulate_color_previous \empty
+\let\m_tabl_tabulate_color \empty
+\let\m_tabl_tabulate_text_color \empty
+\let\m_tabl_tabulate_color_local \empty
+\let\m_tabl_tabulate_vrule_color \empty
+\let\m_tabl_tabulate_vrule_color_local \empty
+\let\m_tabl_tabulate_vrule_color_default\empty % used local
+\let\m_tabl_tabulate_hrule_color_default\empty % used local
+\let\m_tabl_tabulate_blank_default \empty
+
+\appendtoks
+ \glet\m_tabl_tabulate_color_previous \empty
+ \glet\m_tabl_tabulate_color \empty
+ \glet\m_tabl_tabulate_text_color \empty
+ \glet\m_tabl_tabulate_color_local \empty
+ \glet\m_tabl_tabulate_vrule_color \empty
+ \glet\m_tabl_tabulate_vrule_color_local \empty
+ \global \d_tabl_tabulate_vrulethickness_local\zeropoint
+\to \t_tabl_tabulate_every_row
+
+\unexpanded\def\tabl_tabulate_color_side_right_second
+ {\ifx\m_tabl_tabulate_color_previous\empty \else
+ \tabl_tabulate_color_set\m_tabl_tabulate_color_previous
+ \glet\m_tabl_tabulate_color_previous\empty
+ \fi}
+
+\unexpanded\def\tabl_tabulate_color_side_left_second
+ {\ifx\m_tabl_tabulate_color\empty \else
+ \ifcase\c_tabl_tabulate_colorspan
+ \or
+ \tabl_tabulate_color_set\m_tabl_tabulate_color
+ \or
+ \tabl_tabulate_color_set\m_tabl_tabulate_color
+ \fi
+ \fi}
+
+\unexpanded\def\tabl_tabulate_color_side_both_second
+ {\ifx\m_tabl_tabulate_color\empty \else
+ \tabl_tabulate_color_set\m_tabl_tabulate_color
+ \ifcase\c_tabl_tabulate_colorspan
+ %\glet\m_tabl_tabulate_color_previous\empty
+ \or
+ \glet\m_tabl_tabulate_color_previous\empty
+ \or
+ \glet\m_tabl_tabulate_color_previous\m_tabl_tabulate_color
+ \or
+ \glet\m_tabl_tabulate_color_previous\m_tabl_tabulate_color
+ \fi
+ \fi}
+
+\let\tabl_tabulate_color_side_right \relax
+\let\tabl_tabulate_color_side_left \relax
+\let\tabl_tabulate_color_side_both \relax
+
+\appendtoks
+ \let\tabl_tabulate_color_side_right\tabl_tabulate_color_side_right_second
+ \let\tabl_tabulate_color_side_left \tabl_tabulate_color_side_left_second
+ \let\tabl_tabulate_color_side_both \tabl_tabulate_color_side_both_second
+\to \t_tabl_tabulate_initializers_second
+
+\def\tabl_tabulate_set_color_column#1% overloaded
+ {\unskip
+ \doifelsefastoptionalcheck{\tabl_tabulate_set_color_column_yes#1}{\tabl_tabulate_set_color_column_nop#1}}
+
+\def\tabl_tabulate_set_color_column_nop
+ {\tabl_tabulate_column_normal\zerocount}
+
+\def\tabl_tabulate_set_color_column_yes#1[#2]%
+ {\xdef\m_tabl_tabulate_color_local{#2}%
+ \tabl_tabulate_column_normal\zerocount#1}
+
+% normal columns:
+
+\def\tabl_tabulate_column_normal#1#2%
+ {\unskip
+ \aligntab
+ \ifconditional\c_tabl_tabulate_equal\tabulateequalpos\else\tabulatenormalpos\fi
+ \ifnum\c_tabl_tabulate_column>\c_tabl_tabulate_max_vrulecolumn\else
+ \tabl_tabulate_column_vrule_setup
+ \fi
+ \aligntab
+ \global\c_tabl_tabulate_kind#1%
+ \global\c_tabl_tabulate_type#2%
+ \aligntab}
+
+% equal columns
+
+\def\tabl_tabulate_column_equal#1#2%
+ {\unskip
+ \aligntab
+ \tabulateequalpos
+ \aligntab
+ \global\c_tabl_tabulate_kind#1%
+ \global\c_tabl_tabulate_type#2%
+ \aligntab}
+
+% ruled columns
+
+\def\tabl_tabulate_column_vruled_preset
+ {\glet\m_tabl_tabulate_vrule_color_local\m_tabl_tabulate_vrule_color_default
+ \global\d_tabl_tabulate_vrulethickness_local\d_tabl_tabulate_vrulethickness_default}
+
+\def\tabl_tabulate_column_vruled#1#2%
+ {\unskip % 0-n
+ %\ifnum\c_tabl_tabulate_column=\plusone
+ % \global\c_tabl_tabulate_has_rule_spec_first\plusone
+ %\orelse\ifnum\c_tabl_tabulate_column=\c_tabl_tabulate_nofcolumns
+ % \global\c_tabl_tabulate_has_rule_spec_last\plusone
+ %\fi
+ \ifnum\c_tabl_tabulate_column>\c_tabl_tabulate_max_vrulecolumn
+ \global\c_tabl_tabulate_max_vrulecolumn\c_tabl_tabulate_column
+ \fi
+ \doifelsefastoptionalcheck{\tabl_tabulate_column_vruled_yes#1#2}{\tabl_tabulate_column_vruled_nop#1#2}}
+
+\def\tabl_tabulate_column_vrule_setup
+ {\begincsname\??tabulatevrule\the\c_tabl_tabulate_column\endcsname}
+
+\def\tabl_tabulate_column_vruled_nop
+ {\expandafter\glet\csname\??tabulatevrule\the\c_tabl_tabulate_column\endcsname\tabl_tabulate_column_vruled_preset
+ \tabl_tabulate_column_normal}
+
+\def\tabl_tabulate_column_vruled_step#1%
+ {\doifelsenumber{#1}
+ {\global\d_tabl_tabulate_vrulethickness_local#1\d_tabl_tabulate_vrulethickness_default}
+ {\xdef\m_tabl_tabulate_vrule_color_local{#1}}}
+
+\def\tabl_tabulate_column_vruled_yes#1#2[#3]%
+ {\expandafter\gdef\csname\??tabulatevrule\the\c_tabl_tabulate_column\endcsname
+ {\tabl_tabulate_column_vruled_preset
+ \rawprocesscommalist[#3]\tabl_tabulate_column_vruled_step}%
+ \tabl_tabulate_column_normal#1#2}
+
+\def\tabl_tabulate_vrule_reset
+ {\ifcase\c_tabl_tabulate_max_vrulecolumn\else
+ \tabl_tabulate_vrule_reset_indeed
+ \fi}
+
+\def\tabl_tabulate_vrule_reset_indeed
+ {\dofastloopcs\c_tabl_tabulate_max_vrulecolumn\tabl_tabulate_vrule_reset_step
+ \global\c_tabl_tabulate_max_vrulecolumn\zerocount}
+
+\def\tabl_tabulate_vrule_reset_step % undefined or relax
+ {\expandafter\glet\csname\??tabulatevrule\the\fastloopindex\endcsname\undefined}
+
+\appendtoks
+ \tabl_tabulate_vrule_reset
+\to \t_tabl_tabulate_every_after_row
+
+% sometimes more efficient:
+%
+% \def\tabl_tabulate_column_vruled_yes#1#2[#3]%
+% {\rawprocesscommalist[#3]\tabl_tabulate_column_vruled_step
+% \expandafter\xdef\csname\??tabulatevrule\the\c_tabl_tabulate_column\endcsname
+% {\global\d_tabl_tabulate_vrulethickness_local\the\d_tabl_tabulate_vrulethickness_default
+% \noexpand\xdef\noexpand\m_tabl_tabulate_vrule_color_local{\m_tabl_tabulate_vrule_color_local}}%
+% \tabl_tabulate_column_normal#1#2}
+
+\def\tabl_tabulate_column_vruled_normal
+ {\vrule\s!width\d_tabl_tabulate_vrulethickness\relax}
+
+\def\tabl_tabulate_column_vruled_colored
+ {\dousecolorparameter\m_tabl_tabulate_vrule_color
+ \vrule\s!width\d_tabl_tabulate_vrulethickness\relax}
+
+\unexpanded\def\tabl_tabulate_column_vrule_inject_first
+ {\ifcase\d_tabl_tabulate_vrulethickness\else
+ \tabl_tabulate_column_vruled_normal % could be a skip instead
+ \fi
+ \global\d_tabl_tabulate_vrulethickness\zeropoint} % nils second one
+
+\unexpanded\def\tabl_tabulate_column_vrule_inject_second
+ {\ifcase\d_tabl_tabulate_vrulethickness\else
+ \ifx\m_tabl_tabulate_vrule_color\empty
+ \tabl_tabulate_column_vruled_normal
+ \else
+ \tabl_tabulate_column_vruled_colored
+ \fi
+ \fi
+ \global\d_tabl_tabulate_vrulethickness\zeropoint} % nils second one
+
+\let\tabl_tabulate_column_vrule_inject\relax
+
+\appendtoks
+ \let\tabl_tabulate_column_vrule_inject\tabl_tabulate_column_vrule_inject_first
+\to \t_tabl_tabulate_initializers_first
+
+\appendtoks
+ \let\tabl_tabulate_column_vrule_inject\tabl_tabulate_column_vrule_inject_second
+\to \t_tabl_tabulate_initializers_second
+
+% auto columns
+
+\def\tabl_tabulate_column_inject_auto
+ {\tabl_tabulate_column_normal\zerocount\zerocount
+ \ifnum\c_tabl_tabulate_column>\c_tabl_tabulate_columns\relax
+ \expandafter\NR
+ \else
+ \expandafter\ignorespaces % interferes with the more tricky hooks
+ \fi}
+
+\unexpanded\def\setquicktabulate#1% see \startlegend \startgiven (for the moment still public)
+ {\let#1\tabl_tabulate_column_inject_auto
+ \let\\\tabl_tabulate_column_inject_auto} % brrr, will go
+
+\setvalue{\??tabulateseparator\v!blank }{\s_tabl_tabulate_separator\bigskipamount}
+\setvalue{\??tabulateseparator\v!depth }{\s_tabl_tabulate_separator\strutdp}
+\setvalue{\??tabulateseparator\v!small }{\def\m_tabl_tabulate_separator_factor{.25}}
+\setvalue{\??tabulateseparator\v!medium}{\def\m_tabl_tabulate_separator_factor{.5}}
+\setvalue{\??tabulateseparator\v!big }{}
+\setvalue{\??tabulateseparator\v!none }{\s_tabl_tabulate_separator\zeropoint\let\m_tabl_tabulate_separator_factor\zerocount}
+\setvalue{\??tabulateseparator\v!grid }{\s_tabl_tabulate_separator\zeropoint\let\m_tabl_tabulate_separator_factor\zerocount}
+
+\def\tabl_tabulate_column_rule_separator_step#1%
+ {\ifcsname\??tabulateseparator#1\endcsname
+ \lastnamedcs
+ \else
+ \s_tabl_tabulate_separator#1\relax
+ \fi}
+
+\def\tabl_tabulate_column_rule_separator_inject % can be sped up (will do when used frequently)
+ {\bgroup
+ \s_tabl_tabulate_separator\strutdp
+ \ifx\p_distance\empty\else
+ \let\m_tabl_tabulate_separator_factor\plusone
+ \processcommacommand[\p_distance]\tabl_tabulate_column_rule_separator_step
+ \s_tabl_tabulate_separator\m_tabl_tabulate_separator_factor\s_tabl_tabulate_separator
+ \fi
+ % someamble: footer or header: unfortunately a skip can trigger a page break (weird
+ % as we have lots of nobreaks)
+ % \ifconditional\c_tabl_tabulate_someamble\kern\else\vskip\fi\s_tabl_tabulate_separator % new
+ % \directvspacing{\the\s_tabl_tabulate_separator}% new
+ \directvskip\s_tabl_tabulate_separator
+ \egroup}
+
+\def\tabl_tabulate_hrule_spec_ignore#1%
+ {%\glet\currenttabulationlocalhrulecolor\empty
+ %\global\d_tabl_tabulate_hrulethickness_local\d_tabl_tabulate_hrulethickness_default
+ \doifelsefastoptionalcheck#1#1}
+
+\def\tabl_tabulate_hrule_spec_pickup#1%
+ {\glet\currenttabulationlocalhrulecolor\m_tabl_tabulate_hrule_color_default
+ \global\d_tabl_tabulate_hrulethickness_local\d_tabl_tabulate_hrulethickness_default
+ \doifelsefastoptionalcheck{\tabl_tabulate_hrule_preset#1}#1}
+
+\def\tabl_tabulate_hrule_preset_step#1%
+ {\doifelsenumber{#1}
+ {\global\d_tabl_tabulate_hrulethickness_local#1\d_tabl_tabulate_hrulethickness_default}
+ {\xdef\currenttabulationlocalhrulecolor{#1}}}
+
+\def\tabl_tabulate_hrule_preset#1[#2]%
+ {\rawprocesscommalist[#2]\tabl_tabulate_hrule_preset_step
+ #1}
+
+\def\tabl_tabulate_hrule_inject_normal
+ {\autorule
+ \s!height.5\d_tabl_tabulate_hrulethickness_local
+ \s!depth .5\d_tabl_tabulate_hrulethickness_local
+ \s!left \d_tabl_tabulate_indent
+ \relax}
+
+\def\tabl_tabulate_hrule_inject_colored
+ {\dousecolorparameter\currenttabulationlocalhrulecolor
+ \tabl_tabulate_hrule_inject_normal}
+
+\unexpanded\def\tabl_tabulate_hrule_inject_first
+ {\ifcase\d_tabl_tabulate_hrulethickness_local\else
+ \tabl_tabulate_hrule_inject_normal
+ \fi}
+
+\unexpanded\def\tabl_tabulate_hrule_inject_second
+ {\ifcase\d_tabl_tabulate_hrulethickness_local\else
+ \ifx\currenttabulationlocalhrulecolor\empty
+ \tabl_tabulate_hrule_inject_normal
+ \else
+ \tabl_tabulate_hrule_inject_colored
+ \fi
+ \fi}
+
+\let\tabl_tabulate_hrule_inject\relax
+
+\appendtoks
+ \let\tabl_tabulate_hrule_inject\tabl_tabulate_hrule_inject_first
+\to \t_tabl_tabulate_initializers_first
+
+\appendtoks
+ \let\tabl_tabulate_hrule_inject\tabl_tabulate_hrule_inject_second
+\to \t_tabl_tabulate_initializers_second
+
+%D Color:
+
+% \starttabulate[||p||]
+% \NC test \NC test \NC test \NC \NR
+% \NC test \CC[green] \input tufte \CC[yellow] test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \CC[blue] test \CC[red] test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \CC[gray] test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \CC[blue] test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \CC[magenta] test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \CC[cyan] \dorecurse{10}{\input ward }\NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \CC[yellow] test \NC test \NC \NR
+% \stoptabulate
+
+\unexpanded\def\tabl_tabulate_color_set#1% we could store the attributes at the cost of a lua call
+ {\begingroup
+ \clf_enablebackgroundalign % was \node_backgrounds_align_initialize
+ \glet\tabl_tabulate_color_repeat\tabl_tabulate_color_repeat_second
+ \global\settrue\c_tabl_tabulate_has_colors
+ \ifnum\c_tabl_tabulate_column>\c_tabl_tabulate_max_colorcolumn
+ \global\c_tabl_tabulate_max_colorcolumn\c_tabl_tabulate_column
+ \fi
+ \expandafter\xdef\csname\??tabulatecolor\the\c_tabl_tabulate_column\endcsname{#1}%
+ \hpack \thealignbackgroundcolorattr{#1}{}% pack ?
+ \endgroup}
+
+\def\tabl_tabulate_color_repeat_second % for split off lines
+ {\begingroup
+ \scratchcounter\numexpr\c_tabl_tabulate_column-\plusone\relax % ugly !
+ \ifcsname\??tabulatecolor\the\scratchcounter\endcsname
+ % \hbox \thealignbackgroundcolorattr{\csname\??tabulatecolor\the\scratchcounter\endcsname}{}% pack ?
+ \hpack \expandafter\thealignbackgroundcolorattr\expandafter{\lastnamedcs}{}% pack ?
+ \fi
+ \endgroup}
+
+\let\tabl_tabulate_color_repeat\relax
+
+\appendtoks
+ \let\tabl_tabulate_color_repeat\relax
+\to \everytabulate
+
+\def\tabl_tabulate_color_reset
+ {\ifcase\c_tabl_tabulate_max_colorcolumn\else
+ \tabl_tabulate_color_reset_indeed
+ \fi}
+
+% \def\tabl_tabulate_color_reset_indeed
+% {\dorecurse\c_tabl_tabulate_max_colorcolumn{\letgvalue{\??tabulatecolor\recurselevel}\undefined}} % slow
+
+\def\tabl_tabulate_color_reset_indeed
+ {\dofastloopcs\c_tabl_tabulate_max_colorcolumn\tabl_tabulate_color_reset_step}
+
+\def\tabl_tabulate_color_reset_step % undefined or empty?
+ {\expandafter\glet\csname\??tabulatecolor\number\fastloopindex\endcsname\undefined}
+
+\appendtoks
+ \tabl_tabulate_color_reset
+\to \t_tabl_tabulate_every_after_row
+
+% \def\tabl_tabulate_register_par_options_indeed
+% {\iftrialtypesetting \else
+% \registerparoptions
+% \ifinsidefloat
+% % that is, an unbreakable one
+% \glet\tabl_tabulate_register_par_options\empty
+% \else
+% % unsafe in crossing pages, at each b...
+% % \glet\tabl_tabulate_register_par_options\empty
+% \fi
+% \fi}
+%
+% \appendtoks
+% \glet\tabl_tabulate_register_par_options\tabl_tabulate_register_par_options_indeed
+% \to \everytabulate
+
+\def\tabl_tabulate_register_par_options_first % maybe track here if needed
+ {}
+
+\def\tabl_tabulate_register_par_options_second
+ {\registerparoptions
+ \ifinsidefloat
+ % that is, an unbreakable one
+ \glet\tabl_tabulate_register_par_options\empty
+ \else
+ % unsafe in crossing pages, at each b...
+ % \glet\tabl_tabulate_register_par_options\empty
+ \fi}
+
+\let\tabl_tabulate_register_par_options\relax
+
+\appendtoks
+ \let\tabl_tabulate_register_par_options\tabl_tabulate_register_par_options_first
+\to \t_tabl_tabulate_initializers_first
+
+\appendtoks
+ \let\tabl_tabulate_register_par_options\tabl_tabulate_register_par_options_second
+\to \t_tabl_tabulate_initializers_second
+
+\appendtoks
+ \tabl_tabulate_register_par_options
+\to \t_tabl_tabulate_every_row
+
+\def\tabl_tabulate_flush_indent_indeed
+ {\hbox to \d_tabl_tabulate_indent % pack ?
+ {% we now have a local hsize, and since we want to
+ % register positional info (i.e. real hsizes) we
+ % need to reconstitute the original hsize
+ \advance\hsize\d_tabl_tabulate_indent
+ % this is indeed rather messy and took a few hours
+ % to dis/uncover
+ \the\t_tabl_tabulate_every_row
+ \hss}}
+
+\def\tabl_tabulate_flush_indent
+ {\ifnum\c_tabl_tabulate_column=\zerocount
+ \tabl_tabulate_flush_indent_indeed
+ \fi}
+
+\def\tabl_tabulate_digits{\digits}
+
+%D Beware, we cannot use \type {\unexpanded} on \type {\HL} cum suis, since \TEX's
+%D hard coded noalign lookahead fails on it! I mistakenly added this for a while.
+
+\setvalue{\??tabulatealigning\v!normal}{0}
+\setvalue{\??tabulatealigning\v!right }{1}
+\setvalue{\??tabulatealigning\v!left }{2}
+\setvalue{\??tabulatealigning\v!middle}{3}
+
+\setvalue{\??tabulateheader\v!repeat}{\plusone}
+\setvalue{\??tabulateheader\v!text }{\plustwo}
+
+\unexpanded\def\tabl_tabulate_bskip_first {\setbox\b_tabl_tabulate\vbox\bgroup\glet\tabl_tabulate_hook\tabl_tabulate_hook_nop}
+\unexpanded\def\tabl_tabulate_eskip_first {\par\egroup\glet\tabl_tabulate_hook\tabl_tabulate_hook_yes}
+\unexpanded\def\tabl_tabulate_xbskip_first{\hpack\bgroup\vbox\bgroup\glet\tabl_tabulate_hook\tabl_tabulate_hook_nop}
+\unexpanded\def\tabl_tabulate_xeskip_first{\par\egroup\egroup\glet\tabl_tabulate_hook\tabl_tabulate_hook_yes}
+
+\let\tabl_tabulate_bbskip\relax
+\let\tabl_tabulate_eeskip\relax
+\let\tabl_tabulate_bskip \relax
+\let\tabl_tabulate_eskip \relax
+\let\tabl_tabulate_xbskip\relax
+\let\tabl_tabulate_xeskip\relax
+
+\appendtoks
+ \let\tabl_tabulate_bbskip\relax
+ %\let\tabl_tabulate_eeskip\relax % adapted by bskip
+ \let\tabl_tabulate_bskip \tabl_tabulate_bskip_first
+ \let\tabl_tabulate_eskip \tabl_tabulate_eskip_first
+ \let\tabl_tabulate_xbskip\tabl_tabulate_xbskip_first
+ \let\tabl_tabulate_xeskip\tabl_tabulate_xeskip_first
+\to \t_tabl_tabulate_initializers_first
+
+\def\tabl_tabulate_baselinecorrection % keep an eye on this one
+ {\def\dobaselinecorrection{\vskip\dimexpr-\prevdepth+\strutdp+\strutdp\relax}% todo: mkiv
+ \baselinecorrection}
+
+% some hack to prevent an allowbreak ... actually we could set up a system then
+% that is dealt with atthe lua end in the skip handler: turn penalties with attributes
+% values into other penalties that get removed
+
+\installcorenamespace{tabulatenobreak}
+
+\def\tabl_tabulate_break_allow{\directvpenalty\zerocount}
+\def\tabl_tabulate_break_maybe{\directvpenalty\zerocount}
+\def\tabl_tabulate_break_no {\directvpenalty\plustenthousand} % ,order:2}}
+
+\let\tabl_tabulate_break_state_set \relax
+\let\tabl_tabulate_break_state_reset \relax
+\let\tabl_tabulate_break_state_allowbreak\tabl_tabulate_break_maybe
+
+% so far
+
+\unexpanded\def\tabl_tabulate_VL_first{\tabl_tabulate_column_vruled\zerocount\zerocount}
+\unexpanded\def\tabl_tabulate_NC_first{\tabl_tabulate_column_normal\zerocount\zerocount}
+\unexpanded\def\tabl_tabulate_RC_first{\tabl_tabulate_column_normal\zerocount\plusone}
+\unexpanded\def\tabl_tabulate_HC_first{\tabl_tabulate_column_normal\zerocount\plustwo}
+\unexpanded\def\tabl_tabulate_EQ_first{\tabl_tabulate_column_equal \plustwo \zerocount}
+\unexpanded\def\tabl_tabulate_RQ_first{\tabl_tabulate_column_equal \zerocount\plusone}
+\unexpanded\def\tabl_tabulate_HQ_first{\tabl_tabulate_column_equal \zerocount\plustwo}
+
+\unexpanded\def\tabl_tabulate_NG_first{\tabl_tabulate_column_normal\zerocount\zerocount}
+\unexpanded\def\tabl_tabulate_NN_first{\tabl_tabulate_column_normal\zerocount\zerocount\tabl_tabulate_digits} % new, undocumented, test first
+\unexpanded\def\tabl_tabulate_ND_first{\tabl_tabulate_column_normal\zerocount\zerocount\tabl_tabulate_digits} % same, for old times sake
+
+\unexpanded\def\tabl_tabulate_NR_first {\tabl_tabulate_NR_common\conditionaltrue \tabl_tabulate_check_penalties} % next row
+\unexpanded\def\tabl_tabulate_NB_first {\tabl_tabulate_NR_common\conditionaltrue \tabl_tabulate_nobreak_inject } % next row no break
+
+\unexpanded\def\tabl_tabulate_NR_second{\tabl_tabulate_NR_common\conditionalfalse\tabl_tabulate_check_penalties} % next row
+\unexpanded\def\tabl_tabulate_NB_second{\tabl_tabulate_NR_common\conditionalfalse\tabl_tabulate_nobreak_inject } % next row no break
+
+\unexpanded\def\tabl_tabulate_CC_first{\global\c_tabl_tabulate_localcolorspan\zerocount\tabl_tabulate_set_color_column\zerocount}
+\unexpanded\def\tabl_tabulate_CL_first{\global\c_tabl_tabulate_localcolorspan\plusone \tabl_tabulate_set_color_column\zerocount}
+\unexpanded\def\tabl_tabulate_CM_first{\global\c_tabl_tabulate_localcolorspan\plustwo \tabl_tabulate_set_color_column\zerocount}
+\unexpanded\def\tabl_tabulate_CR_first{\global\c_tabl_tabulate_localcolorspan\plusthree\tabl_tabulate_set_color_column\zerocount}
+
+%D Sort of special:
+%D
+%D \startbuffer
+%D \startitemize[n]
+%D \starttabulate[|||||]
+%D \NC p \NC \itemtag \NC q \NC r \NC \NR
+%D \NC p \NC \itemtag \NC q \NC r \NC \NR
+%D \NC p \NC \itemtag \NC q \NC r \NC \NR
+%D \NC p \NC \itemtag \NC q \NC r \NC \NR
+%D \stoptabulate
+%D \stopitemize
+%D
+%D \startitemize[n]
+%D \starttabulate[|||||]
+%D \NI b \NC c \NC d \NC \NR
+%D \NC a \NI c \NC d \NC \NR
+%D \NC a \NC b \NI d \NC \NR
+%D \NC a \NC b \NC c \NI \NR
+%D \stoptabulate
+%D \stopitemize
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\unexpanded\def\tabl_tabulate_NI_first{\doifelsefastoptionalcheck\tabl_tbl_NI_yes\tabl_tbl_NI_nop}
+
+\def\tabl_tbl_NI_yes[#1]{\NC \itemtag[#1]\NC}
+\def\tabl_tbl_NI_nop {\NC \itemtag \NC}
+
+%D The following shortcut is handy for tables where one needs bold headers:
+
+\unexpanded\def\tabl_tabulate_BC_first
+ {\tabl_tabulate_column_normal\plusone\zerocount
+ \let\fontstyle\globalfontstyle
+ \bf}
+
+\appendtoks
+ \let\VL\tabl_tabulate_VL_first
+ \let\NC\tabl_tabulate_NC_first
+ \let\BC\tabl_tabulate_BC_first
+ \let\RC\tabl_tabulate_RC_first
+ \let\HC\tabl_tabulate_HC_first
+ \let\EQ\tabl_tabulate_EQ_first
+ \let\RQ\tabl_tabulate_RQ_first
+ \let\HQ\tabl_tabulate_HQ_first
+ \let\NG\tabl_tabulate_NG_first
+ \let\NN\tabl_tabulate_NN_first
+ \let\ND\tabl_tabulate_ND_first
+ \let\NR\tabl_tabulate_NR_first
+ \let\NB\tabl_tabulate_NB_first
+ \let\CC\tabl_tabulate_CC_first
+ \let\CL\tabl_tabulate_CL_first
+ \let\CM\tabl_tabulate_CM_first
+ \let\CR\tabl_tabulate_CR_first
+ \let\NI\tabl_tabulate_NI_first
+\to \t_tabl_tabulate_initializers_first
+
+\appendtoks
+ \let\NR\tabl_tabulate_NR_second
+ \let\NB\tabl_tabulate_NB_second
+\to \t_tabl_tabulate_initializers_second
+
+\appendtoks
+ \let\SR\NR
+ \let\FR\NR
+ \let\MR\NR
+ \let\LR\NR
+ \let\AR\NR
+\to \t_tabl_tabulate_initializers_first
+
+\unexpanded\def\tabl_tabulate_NR_common#1#2%
+ {\global\advance\c_tabl_tabulate_noflines\plusone
+ \global\setfalse\c_tabl_tabulate_firstflushed
+ \global\setfalse\c_tabl_tabulate_equal
+ \global\c_tabl_tabulate_column\zerocount
+ \ifconditional#1\relax
+ \tabl_tabulate_break_state_reset
+ \fi
+ \tabl_tabulate_pheight_reset
+ \unskip\unskip\crcr\tabl_tabulate_flush_collected
+ % can we omit the next one in the first run? probably
+ \starttabulatenoalign
+ \the\t_tabl_tabulate_every_after_row
+ #2%
+ \stoptabulatenoalign}
+
+\def\tabl_tabulate_check_penalties
+ {\ifconditional\c_tabl_tabulate_tolerant_break\else
+ \ifnum\c_tabl_tabulate_totalnoflines=\plusone
+ % \tabl_tabulate_break_allow
+ \else
+ \ifconditional\c_tabl_tabulate_someamble \ifcase\c_tabl_tabulate_repeathead \else
+ \tabl_tabulate_break_allow
+ \fi \fi
+ \ifnum\c_tabl_tabulate_noflines=\plusone
+ \tabl_tabulate_nobreak_inject
+ \orelse\ifnum\c_tabl_tabulate_noflines=\c_tabl_tabulate_minusnoflines
+ \ifnum\c_tabl_tabulate_plines_max<\plustwo
+ \tabl_tabulate_nobreak_inject
+ \else
+ \tabl_tabulate_break_allow % needed with pbreak prevention
+ \fi
+ \else
+ \tabl_tabulate_break_state_allowbreak
+ \fi
+ \fi
+ \fi
+ \global\setfalse\c_tabl_tabulate_firstflushed}
+
+\unexpanded\def\tabl_tabulate_bbskip_second_split_yes
+ {\ifvoid\b_tabl_tabulate_current\c_tabl_tabulate_column
+ \ifx\tabl_tabulate_flush_collected_indeed\empty\else
+ \setbox0\hbox
+ \fi
+ \fi}
+
+\unexpanded\def\tabl_tabulate_eskip_second
+ {\par\egroup
+ \tabl_tabulate_pheight_set
+ \glet\tabl_tabulate_hook\tabl_tabulate_hook_yes
+ \tabl_tabulate_splitoff_box}
+
+\unexpanded\def\tabl_tabulate_bskip_second_split_yes
+ {\ifvoid\b_tabl_tabulate_current\c_tabl_tabulate_column
+ % first line
+ \global\setbox\b_tabl_tabulate_current\c_tabl_tabulate_column\vbox
+ \bgroup
+ \glet\tabl_tabulate_hook\tabl_tabulate_hook_nop
+ \ifconditional\c_tabl_tabulate_automode\hsize\d_tabl_tabulate_width\fi
+ % \begstrut % interferes with pre-\pars
+ % evt: \appendtoks\begstrut\to\everypar
+ \ignorespaces
+ \let\tabl_tabulate_eskip\tabl_tabulate_eskip_second
+ \else
+ % successive lines
+ \let\tabl_tabulate_eskip\empty
+ \dontcomplain
+ \glet\tabl_tabulate_hook\tabl_tabulate_hook_yes
+ \expandafter\tabl_tabulate_splitoff_box
+ \fi}
+
+\unexpanded\def\tabl_tabulate_xbskip_second{\tabl_tabulate_bskip}
+\unexpanded\def\tabl_tabulate_xeskip_second{\tabl_tabulate_eskip}
+
+\unexpanded\def\tabl_tabulate_flush_second_indeed
+ {\glet\tabl_tabulate_flush_collected_indeed\empty
+ \global\c_tabl_tabulate_column\zerocount
+ \tabl_tabulate_pbreak_check
+ \dofastloopcs\c_tabl_tabulate_columns\tabl_tabulate_flush_second_step
+ \global\settrue\c_tabl_tabulate_firstflushed}
+
+\unexpanded\def\tabl_tabulate_flush_second_step
+ {\ifvoid\b_tabl_tabulate_current\fastloopindex\else
+ \gdef\tabl_tabulate_flush_collected_indeed{\the\t_tabl_tabulate_dummy}%
+ \fi}
+
+\def\tabl_tabulate_flush_second
+ {\tabulatenoalign{\tabl_tabulate_flush_second_indeed}%
+ \tabl_tabulate_flush_collected_indeed}
+
+\unexpanded\def\tabl_tabulate_bskip_second_split_nop
+ {\vtop\bgroup
+ \ifconditional\c_tabl_tabulate_automode\hsize\d_tabl_tabulate_width\fi
+ % \begstrut % interferes with pre-\pars
+ % evt: \appendtoks\begstrut\to\everypar
+ \ignorespaces}
+
+\unexpanded\def\tabl_tabulate_eskip_second_split_nop % vertical strut added august 2003
+ {\par\verticalstrut
+ \vskip-\struttotal
+ \egroup}
+
+% \let\tabl_tabulate_eskip \relax % adapted by bskip
+% \let\tabl_tabulate_eeskip\relax % adapted by bskip
+
+\appendtoks
+ \let\tabl_tabulate_xbskip\tabl_tabulate_xbskip_second
+ \let\tabl_tabulate_xeskip\tabl_tabulate_xeskip_second
+ \ifconditional\c_tabl_tabulate_split
+ \let\tabl_tabulate_bskip \tabl_tabulate_bskip_second_split_yes
+ \let\tabl_tabulate_bbskip\tabl_tabulate_bbskip_second_split_yes
+ \else
+ \let\tabl_tabulate_bskip \tabl_tabulate_bskip_second_split_nop
+ \let\tabl_tabulate_eskip \tabl_tabulate_eskip_second_split_nop
+ \fi
+\to \t_tabl_tabulate_initializers_second
+
+% see ***
+%
+% \enabletrackers[nodes.page_vspacing]
+% \starttext
+% \starttabulate[||] \dorecurse{100}{\NC Eins \NC \NR \HL} \stoptabulate
+% \stoptext
+
+\def\tabl_tabulate_XX_none
+ {\starttabulatenoalign
+ \tabl_tabulate_break_state_set
+ \tabl_tabulate_hrule_spec_ignore
+ \stoptabulatenoalign}
+
+\def\tabl_tabulate_FL_second{\starttabulatenoalign\tabl_tabulate_hrule_spec_pickup\tabl_tabulate_FL_second_indeed}
+\def\tabl_tabulate_ML_second{\starttabulatenoalign\tabl_tabulate_hrule_spec_pickup\tabl_tabulate_ML_second_indeed}
+\def\tabl_tabulate_LL_second{\starttabulatenoalign\tabl_tabulate_hrule_spec_pickup\tabl_tabulate_LL_second_indeed}
+\def\tabl_tabulate_TL_second{\starttabulatenoalign\tabl_tabulate_hrule_spec_pickup\tabl_tabulate_TL_second_indeed}
+\def\tabl_tabulate_BL_second{\starttabulatenoalign\tabl_tabulate_hrule_spec_pickup\tabl_tabulate_BL_second_indeed}
+
+\unexpanded\def\tabl_tabulate_FL_second_indeed
+ {\ifinsidefloat\else
+ \doifempty{\tabulationparameter\c!before}\tabl_tabulate_baselinecorrection % no expansion
+ \fi
+ \tabl_tabulate_hrule_inject
+ \tabl_tabulate_nobreak_inject
+ \tabl_tabulate_column_rule_separator_inject
+ \prevdepth\strutdp
+ \tabl_tabulate_nobreak_inject
+ \stoptabulatenoalign}
+
+\def\spac_vspacing_no_topskip % use grouped
+ {\attribute\skipcategoryattribute\plusten}
+
+\unexpanded\def\tabl_tabulate_ML_second_indeed
+ {\tabl_tabulate_break_no
+ \tabl_tabulate_column_rule_separator_inject
+ \tabl_tabulate_break_no
+ \tabl_tabulate_hrule_inject
+ \vskip-\p_rulethickness\relax
+ \begingroup
+ \spac_vspacing_no_topskip
+ \tabl_tabulate_hrule_inject
+ \endgroup
+ \tabl_tabulate_break_no
+ \tabl_tabulate_column_rule_separator_inject
+ \stoptabulatenoalign}
+
+\unexpanded\def\tabl_tabulate_LL_second_indeed
+ {\tabl_tabulate_nobreak_inject
+ \tabl_tabulate_column_rule_separator_inject
+ \tabl_tabulate_nobreak_inject
+ \tabl_tabulate_hrule_inject
+ \ifinsidefloat
+ \tabl_tabulate_inside_inbetween
+ \else
+ \tabl_tabulate_outside_inbetween
+ \fi
+ \stoptabulatenoalign}
+
+\unexpanded\def\tabl_tabulate_TL_second_indeed
+ {\tabl_tabulate_nobreak_inject
+ \tabl_tabulate_column_rule_separator_inject
+ \tabl_tabulate_nobreak_inject
+ \tabl_tabulate_hrule_inject
+ \tabl_tabulate_nobreak_inject
+ \tabl_tabulate_column_rule_separator_inject
+ %\prevdepth\strutdp % todo, might differ between TL and BL
+ \tabl_tabulate_nobreak_inject
+ \stoptabulatenoalign}
+
+\let\tabl_tabulate_BL_second_indeed\tabl_tabulate_TL_second_indeed
+
+\def\tabl_tabulate_HL_second
+ {\csname
+ \ifnum\c_tabl_tabulate_noflines=\zerocount F\orelse
+ \ifnum\c_tabl_tabulate_noflines=\c_tabl_tabulate_totalnoflines L\else
+ M\fi
+ L\endcsname}
+
+\appendtoks
+ \let\FL\tabl_tabulate_XX_none
+ \let\ML\tabl_tabulate_XX_none
+ \let\LL\tabl_tabulate_XX_none
+ \let\TL\tabl_tabulate_XX_none
+ \let\BL\tabl_tabulate_XX_none
+ \let\HL\tabl_tabulate_XX_none
+ \let\HR\tabl_tabulate_XX_none
+\to \t_tabl_tabulate_initializers_first
+
+\appendtoks
+ \let\FL\tabl_tabulate_FL_second
+ \let\ML\tabl_tabulate_ML_second
+ \let\LL\tabl_tabulate_LL_second
+ \let\TL\tabl_tabulate_TL_second
+ \let\BL\tabl_tabulate_BL_second
+ \let\HL\tabl_tabulate_HL_second
+ \let\HR\tabl_tabulate_HL_second
+\to \t_tabl_tabulate_initializers_second
+
+% \def\tabulatedoHRfive % horizontal rule line (break untested)
+% {\starttabulatenoalign
+% \glet\dotabulateautoline\dotabulatelinerule
+% %\ifcase#1\or % todo: check what this does
+% \ifnum\noftabulatelines=\zerocount
+% \glet\dotabulateautoline\donothing
+% \else\ifnum\noftabulatelines=\totalnoftabulatelines
+% \glet\dotabulateautoline\donothing
+% \fi\fi
+% %\fi
+% \dotabulatenobreak
+% \stoptabulatenoalign
+% \dotabulateautoline
+% \starttabulatenoalign
+% \tabl_tabulate_break_no
+% \ifx\dotabulateautoline\dotabulatelinerule\kern-\lineheight\fi
+% \ifnum\noftabulatelines=\totalnoftabulatelines
+% \expandafter\dotabulatenobreak
+% \else
+% \expandafter\tabl_tabulate_break_allow
+% \fi
+% \stoptabulatenoalign
+% \dotabulateautoline
+% \starttabulatenoalign
+% \dotabulatenobreak
+% \stoptabulatenoalign}
+
+% \dorecurse{10}{
+% \starttabulate[|l|]
+% \FL
+% \NC first line, bound to next rule \NC \NR
+% \TL
+% \NC bound to previous rule \NC \NR
+% \NC some line \NC \NR
+% \NC some line \NC \NR
+% \NC some line \NC \NR
+% \NC bound to next rule \NC \NR
+% \ML
+% \NC bound to previous rule \NC \NR
+% \NC bound to next rule \NC \NR
+% \BL
+% \NC last line, bound to previous rule \NC \NR
+% \LL
+% \stoptabulate
+% }
+
+% This needs checking:
+
+\def\tabulaterule {\HR} % a rule with lineheight
+\def\tabulateline {\HL} % just a spaced rule
+\def\tabulateautorule{\HR}%
+\def\tabulateautoline{\HL} % no longer different (to be looked into)
+
+%D When support for vertical rules we needed a way to pick up the specification for
+%D the final rule and a \type {|{}} interface was chosen. As a result parsing had to
+%D become more complex and I was not in the mood for messing up the code too much.
+%D Therefore from now on the preamble is split by \LUA. There are definitely more
+%D places where we can use \LUA\ code (for instance in alignment of numbers. The
+%D repeat parser is replace at the \LUA\ end as well.
+
+\let\tabl_tabulate_flush_collected \empty
+\let\tabl_tabulate_flush_collected_indeed\empty
+
+\let\v_tabl_tabulate_align\!!zerocount
+
+\def\tabl_tabulate_check_side_float % new per 29-07-2016
+ {\ifdefined\page_sides_check_floats_indeed
+ \page_sides_check_floats_indeed
+ \ifdim\hangindent>\zeropoint
+ \advance\d_tabl_tabulate_indent\hangindent
+ \fi
+ \fi}
+
+\def\tabl_tabulate_set_local_hsize
+ {\setlocalhsize
+ \hsize\localhsize}
+
+\def\tabl_tabulate_process
+ {\c_tabl_tabulate_pass\plusone
+ \tabl_tabulate_check_full_content
+ \edef\v_tabl_tabulate_align{\ifcsname\??tabulatealigning\p_align\endcsname\lastnamedcs\else0\fi}%
+ \s_tabl_tabulate_first.5\d_tabl_tabulate_unit
+ \s_tabl_tabulate_last\s_tabl_tabulate_first
+ \s_tabl_tabulate_pre\zeropoint
+ \s_tabl_tabulate_post\s_tabl_tabulate_first % was: \zeropoint
+ \global\c_tabl_tabulate_columns\zerocount
+ \global\c_tabl_tabulate_nofauto\zerocount
+ \global\c_tabl_tabulate_noflines\zerocount
+ \c_tabl_tabulate_totalnoflines\zerocount
+ \c_tabl_tabulate_minusnoflines\zerocount
+ \global\d_tabl_tabulate_width_p\zeropoint
+ \global\d_tabl_tabulate_width_w\zeropoint
+ \global\setfalse\c_tabl_tabulate_equal
+ \tabl_tabulate_pheight_reset
+ \tabskip\zeropoint
+ \ifinsidesplitfloat
+ \donetrue
+ \orelse\ifinsidefloat
+ \donefalse
+ \else
+ \donetrue
+ \fi
+ \global\c_tabl_tabulate_repeathead
+ \ifdone
+ \ifcsname\??tabulateheader\tabulationparameter\c!header\endcsname
+ \lastnamedcs
+ \else
+ \zerocount
+ \fi
+ \else
+ \zerocount
+ \fi
+ %
+ \the\t_tabl_tabulate_initializers_first % collect more here
+ %
+ \glet\tabl_tabulate_flush_collected\empty
+ \ifdim\d_tabl_tabulate_margin>\zeropoint
+ \t_tabl_tabulate_preamble
+ {\aligntab
+ \tabl_tabulate_flush_indent
+% \global\advance\c_tabl_tabulate_noflines\plusone
+ \strut
+ \alignmark\alignmark
+ \tabskip\d_tabl_tabulate_margin
+ \strut
+ \aligntab
+ \alignmark\alignmark
+ \tabskip\zeropoint}%
+ \else
+ \t_tabl_tabulate_preamble
+ {\aligntab
+ \tabl_tabulate_flush_indent
+% \global\advance\c_tabl_tabulate_noflines\plusone
+ \strut
+ \alignmark\alignmark
+ \aligntab
+ \alignmark\alignmark
+ \tabskip\zeropoint}%
+ \fi
+ \d_tabl_tabulate_width\zeropoint
+ % these counters are set at the lua end
+ \c_tabl_tabulate_nofcolumns \zerocount
+ \c_tabl_tabulate_has_rule_spec_first\zerocount
+ \c_tabl_tabulate_has_rule_spec_last \zerocount
+ \clf_presettabulate{\detokenizedtabulationparameter\c!format}%
+ %
+ % \edef\totaltabulatecolumns{\the\numexpr3*\c_tabl_tabulate_columns+\plusfour}%
+ \d_tabl_tabulate_width\zeropoint
+ \tabl_tabulate_initialize_boxes\c_tabl_tabulate_columns
+ \toksapp\t_tabl_tabulate_preamble{%
+ \aligntab\alignmark\alignmark
+ \global\advance\c_tabl_tabulate_column\plusone % maybe just set it already
+ }%
+ \toksapp\t_tabl_tabulate_dummy{%
+ \NC\unskip\unskip\crcr\tabl_tabulate_flush_collected % no count
+ }%
+ \global\c_tabl_tabulate_column\zerocount
+ \tabl_tabulate_pheight_reset
+ \glet\tabl_tabulate_hook\tabl_tabulate_hook_yes
+ \ifx\p_indenting\v!no
+ \forgetparindent
+ \fi
+ \ifinsidefloat
+ \d_tabl_tabulate_indent\zeropoint
+ \else
+ \tabl_tabulate_check_side_float
+ \tabl_tabulate_set_local_hsize
+ \fi
+ \dontcomplain
+ \forgetall % hm, interference with preceding \forgetparindent probably bug, to be solved
+ \everypar\everytabulatepar
+ \setbox\scratchbox\vbox % outside \if because of line counting
+ {\notesenabledfalse
+ \d_tabl_tabulate_indent\zeropoint
+ \settrialtypesetting % very important
+ \anch_backgrounds_text_level_start
+ \expandafter\halign\expandafter{\the\t_tabl_tabulate_preamble\crcr\tabl_tabulate_insert_content\crcr}}%
+ \anch_backgrounds_text_level_stop
+ \ifcase\c_anch_backgrounds_text_state\else
+ \global\settrue\tablehaspositions
+ \fi
+ \ifnum\c_tabl_tabulate_nofauto>\zerocount
+ % so, even if the natural size is larger, in the final run, we force the calculated width
+ \d_tabl_tabulate_width\dimexpr\hsize-\wd\scratchbox-\d_tabl_tabulate_width_p-\d_tabl_tabulate_width_w\relax
+ \ifnum\c_tabl_tabulate_nofauto>\zerocount
+ \divide\d_tabl_tabulate_width \c_tabl_tabulate_nofauto\relax
+ \fi
+ \fi
+ \setbox\scratchbox\emptybox % free memory
+ \ifconditional\c_tabl_tabulate_split
+ \splittopskip\strutht
+ \glet\tabl_tabulate_flush_collected_indeed\empty
+ \glet\tabl_tabulate_flush_collected\tabl_tabulate_flush_second
+ \fi
+ \c_tabl_tabulate_totalnoflines\c_tabl_tabulate_noflines
+ \c_tabl_tabulate_minusnoflines\numexpr\c_tabl_tabulate_noflines+\minusone\relax
+ \global\c_tabl_tabulate_noflines\zerocount
+ %
+ \c_tabl_tabulate_pass\plustwo % final pass
+ \the\t_tabl_tabulate_initializers_second % collect more here
+ %
+ \ifx\p_line\v!line
+ \let\HL\HR
+ \let\tabulateautoline\tabulateautorule
+ \let\tabulateline\tabulaterule
+ \fi
+ %
+ \ifcase\c_tabl_tabulate_repeathead
+ \ifinsidesplitfloat
+ \global\setbox\b_tabl_tabulate\vbox \bgroup
+ \else
+ \startframedcontent[\tabulationparameter\c!frame]%
+ \fi
+ \else
+ \global\setbox\b_tabl_tabulate\vbox \bgroup
+ \fi
+ %
+ \dostarttaggedchained\t!tabulate\empty\??tabulation
+ \dostarttagged\t!tabulaterow\empty
+ \setfalse\inhibitmargindata % new per 2012.06.13 ... really needed
+ % \everycr\expandafter{\the\everycr\noalign{\the\t_tabl_tabulate_every_real_row}\dostoptagged\dostarttagged\t!tabulaterow\empty}%
+ \toksapp\everycr{\noalign{\the\t_tabl_tabulate_every_real_row}\dostoptagged\dostarttagged\t!tabulaterow\empty}%
+ \expandafter\halign\expandafter{\the\t_tabl_tabulate_preamble\crcr\tabl_tabulate_insert_content\crcr}%
+ \dostoptagged
+ \dostoptagged
+ \ifhmode\par\prevdepth\strutdp\fi % nog eens beter, temporary hack
+ \ifx\p_distance\v!grid
+ \vskip-\strutdp % experimental tm-prikkels
+ \fi
+ %
+ \ifcase\c_tabl_tabulate_repeathead
+ \ifinsidesplitfloat
+ \egroup % box
+ \egroup % settings
+ \tabl_split_box\b_tabl_tabulate
+ \else
+ \stopframedcontent
+ \egroup
+ \fi
+ \else
+ \egroup % box
+ \egroup % settings
+ \tabl_split_box\b_tabl_tabulate
+ \fi
+ %
+ \ifinsidefloat
+ \tabl_tabulate_inside_after
+ \else
+ \tabl_tabulate_outside_after
+ \fi
+ \egroup} % whole thing
+
+% \egroup
+
+% \setuptabulate[split=yes,header=text,title=Vervolg van Tabel]
+%
+% % \starttabulatehead
+% % \NC test \NC hans\NC \NR
+% % \stoptabulatehead
+%
+% \starttabulate
+% \NC test \NC \input tufte \relax \NC \NR
+% \NC test \NC \input knuth \relax \NC \NR
+% \NC test \NC \input knuth \relax \NC \NR
+% \NC test \NC \input tufte \relax \NC \NR
+% \NC test \NC \input tufte \relax \NC \NR
+% \NC test \NC \input tufte \relax \NC \NR
+% \stoptabulate
+
+\def\tabl_split_box#1% #1 <> 0/2 / derived from the one in core-ntb.tex
+ {\ifinsidesplitfloat
+ \tabl_split_box_indeed#1%
+ \orelse\ifinsidefloat
+ \unvbox#1%
+ \else
+ \tabl_split_box_indeed#1%
+ \fi}
+
+\def\tabl_split_box_indeed#1%
+ {\resettsplit
+ \def\tsplitminimumfreelines{2}%
+ \def\tsplitminimumfreespace{0pt}%
+ \setbox\tsplitcontent\box#1%
+ \ifcase\c_tabl_tabulate_repeathead\or
+ \setbox\tsplithead\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplithead\vbox{\unvbox\tsplithead}%
+ \or
+ \setbox\tsplithead\vbox{\hbox{\strut\tabulationparameter\c!title}}%
+ \fi
+ \handletsplit}
+
+%D \starttyping
+%D \setuptabulate[split=no,rule=line]
+%D
+%D \starttabulate
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \stoptabulate
+%D \stoptyping
+
+%D Spacing:
+%
+% \starttabulate
+% \NC text \NC text \NC \NR
+% \TB[small]
+% \NC text \NC text \NC \NR
+% \TB[4*big]
+% \NC text \NC text \NC \NR
+% \stoptabulate
+
+\def\tabl_tabulate_TB
+ {\starttabulatenoalign
+ \dosingleempty\tabl_tabulate_TB_indeed}
+
+\def\tabl_tabulate_TB_indeed[#1]%
+ {\iffirstargument
+ \blank[#1]
+ \orelse\ifx\m_tabl_tabulate_blank_default\empty
+ \blank
+ \else
+ \blank[\m_tabl_tabulate_blank_default]%
+ \fi
+ \stoptabulatenoalign}
+
+% to be tested:
+%
+% \def\tabl_tabulate_TB
+% {\starttabulatenoalign
+% \doiffastoptionalcheckelse\tabl_tabulate_TB_yes\tabl_tabulate_TB_nop}
+%
+% \def\tabl_tabulate_TB_yes[#1]%
+% {\blank[#1]
+% \stoptabulatenoalign}
+%
+% \def\tabl_tabulate_TB_nop[#1]%
+% {\blank
+% \stoptabulatenoalign}
+
+\appendtoks
+ \let\TB\tabl_tabulate_TB
+\to \everytabulate
+
+% %D Between alignment lines certain rules apply, and even a simple test can mess
+% %D up a table, which is why we have a special test facilityL
+% %D
+% %D \startbuffer
+% %D \starttabulate[|l|p|]
+% %D \NC 1test \NC test \NC \NR
+% %D \tableifelse{\doifelse{a}{a}}{\NC Xtest \NC test \NC \NR}{}%
+% %D \stoptabulate
+% %D \stopbuffer
+% %D
+% %D \typebuffer \getbuffer
+%
+% \def\tableifelse#1% should be tabulatenoalign then
+% {\tablenoalign
+% {#1%
+% {\aftergroup \firstoftwoarguments}%
+% {\aftergroup\secondoftwoarguments}}}
+%
+% \def\tableiftextelse#1{\tableifelse{\doiftextelse{#1}}}
+
+%D Some new trickery:
+%D
+%D \startbuffer
+%D \settrue\c_tabl_tabulate_splitoff_whitespace
+%D
+%D \starttabulate[|p(2cm)|p(2cm)|p(2cm)|]
+%D \NC test 1a \NC test 2a \NC test 3a
+%D \par
+%D test 3b \NC \NR
+%D \NC test 1a \NC test 2a \NC test 3a
+%D \blank[line]
+%D test 3b \NC \NR
+%D \NC test 1a \NC test 2a \NC test 3a
+%D \blank[halfline]
+%D test 3b
+%D \blank[halfline]
+%D test 3c \NC \NR
+%D \NC \blank \NC \blank \NC \blank \NC \NR
+%D \NC test 1a \NC test 2a \NC test 3a
+%D \blank[halfline]
+%D test 3b
+%D \blank[halfline]
+%D test 3c \NC \NR
+%D \NC \blank \NC \blank \NC \NC \NR
+%D \NC test 1a
+%D \par
+%D test 1b
+%D \par
+%D test 1b \NC test 2a
+%D \par
+%D test 2b
+%D \par
+%D test 2b \NC test 3a \NC \NR
+%D \NC test 1a
+%D \blank
+%D test 1b
+%D \par
+%D test 1b \NC test 2a
+%D \par
+%D test 2b
+%D \blank
+%D test 2b \NC test 3a \NC \NR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer \start \getbuffer \stop
+
+% \starttabulatie[|mc|]
+% \NC \digits{100.000,00} \NC\NR
+% \NC \digits{@10.000,00} \NC\NR
+% \NC \digits{@@@.100,00} \NC\NR
+% \NC \digits{@@@.@10,@@} \NC\NR
+% \NC \digits{@@@.@@1,@@} \NC\NR
+% \stoptabulatie
+%
+% \starttabulatie[|mc|]
+% \ND 100.000,00 \NC\NR
+% \ND @10.000,00 \NC\NR
+% \ND @@@.100,00 \NC\NR
+% \ND @@@.@10,@@ \NC\NR
+% \ND @@@.@@1,@@ \NC\NR
+% \stoptabulatie
+%
+% \starttabulatie[|c|]
+% \ND $100.000,00$ \NC\NR
+% \ND $@10.000,00$ \NC\NR
+% \ND $@@@.100,00$ \NC\NR
+% \ND $@@@.@10,@@$ \NC\NR
+% \ND $@@@.@@1,@@$ \NC\NR
+% \stoptabulatie
+%
+% \starttabulatie[|c|]
+% \NC $\digits 100.000,00 $ \NC\NR
+% \NC $\digits @10.000,00 $ \NC\NR
+% \NC $\digits @@@.100,00 $ \NC\NR
+% \NC $\digits @@@.@10,@@ $ \NC\NR
+% \NC $\digits @@@.@@1,@@ $ \NC\NR
+% \stoptabulatie
+%
+% \starttabulatie[|c|]
+% \NC \digits $100.000,00$ \NC\NR
+% \NC \digits $@10.000,00$ \NC\NR
+% \NC \digits $@@@.100,00$ \NC\NR
+% \NC \digits $@@@.@10,@@$ \NC\NR
+% \NC \digits $@@@.@@1,@@$ \NC\NR
+% \stoptabulatie
+
+%D Predefined categories (moved from core-mis):
+
+\definetabulate
+ [\v!legend]
+ [|emj1|i1|mR|]
+
+\setuptabulate
+ [\v!legend]
+ [\c!unit=.75em,\c!inner=\setquicktabulate\leg,EQ={=}]
+
+\definetabulate
+ [\v!legend][\v!two]
+ [|emj1|emk1|i1|mR|]
+
+\definetabulate
+ [\v!fact]
+ [|R|ecmj1|i1mR|]
+
+\setuptabulate
+ [\v!fact]
+ [\c!unit=.75em,\c!inner=\setquicktabulate\fact,EQ={=}]
+
+%D Another example:
+%D
+%D \starttyping
+%D \definetabulate
+%D [whatever]
+%D [|l|r|]
+%D
+%D \definetabulate
+%D [whatever][else]
+%D [|l|c|r|]
+%D
+%D \startwhatever
+%D \NC l \NC r \NC \NR
+%D \NC left \NC right \NC \NR
+%D \stopwhatever
+%D
+%D \startwhatever[else]
+%D \NC l \NC m \NC r \NC \NR
+%D \NC left \NC middle \NC right \NC \NR
+%D \stopwhatever
+%D
+%D \startwhatever[else][format={|c|c|c|c|}]
+%D \NC l \NC m \NC m \NC r \NC \NR
+%D \NC left \NC middle \NC middle \NC right \NC \NR
+%D \stopwhatever
+%D \stoptyping
+
+%D This is needed because we sometimes use the english command in tracing macros. In
+%D fact, most detailed tracing macros that are done with \LUA\ only work in the
+%D english interface anyway.
+
+% \definetabulate[tabulate] \setuptabulate[tabulate][\c!format=\v!none] % so no \v! here
+
+\newconditional\c_tabl_generic
+
+\unexpanded\setuvalue{starttabulate}%
+ {\bgroup % whole thing
+ \settrue\c_tabl_generic
+ \let\currenttabulationparent\empty
+ \dodoubleempty\tabl_start_regular}
+
+\letvalue{stoptabulate}\relax
+
+%D The following helpers are just there because we also have them at the \LUA\ end:
+%D
+%D \startbuffer
+%D \starttabulate[|l|c|r|]
+%D \tabulaterow {a,b,c}
+%D \tabulaterowbold{aa,bb,cc}
+%D \tabulaterowtype{aaa,bbb,ccc}
+%D \tabulaterowtyp {aaaa,bbbb,cccc}
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\tabl_tabulate_compact_row#1#2%
+ {\NC\tabl_tabulate_compact_step#1#2,\end,}
+
+\def\tabl_tabulate_compact_step#1#2#3,%
+ {\ifx#2\end
+ \NR
+ \expandafter\gobbleoneargument
+ \else
+ #1{#2#3}\NC
+ \expandafter\tabl_tabulate_compact_step
+ \fi#1}
+
+\unexpanded\def\tabulaterow {\tabl_tabulate_compact_row\relax}
+\unexpanded\def\tabulaterowbold{\tabl_tabulate_compact_row\bold}
+\unexpanded\def\tabulaterowtype{\tabl_tabulate_compact_row\type}
+\unexpanded\def\tabulaterowtyp {\tabl_tabulate_compact_row\typ}
+
+%D Here we plug in a row background feature. As we only have support for
+%D \type {frame=name} we can use these variables.
+%D
+%D \starttyping
+%D \startuseMPgraphic{foo}
+%D fill unitsquare
+%D xyscaled (RuleWidth,RuleHeight+RuleDepth) enlarged (ExHeight/4,ExHeight/8)
+%D randomized ExHeight
+%D shifted (-ExHeight/8,ExHeight/16)
+%D withcolor RuleColor ;
+%D \stopuseMPgraphic
+%D
+%D \setuptabulate % wel only have frame=name so we can use these:
+%D [background=foo,
+%D backgroundcolor=darkred,
+%D foregroundcolor=white]
+%D
+%D \definelinefiller[foo][mp=foo,color=darkgreen]
+%D \definelinefiller[bar][mp=foo,color=darkred]
+%D
+%D \starttabulate[|||]
+%D \DB foo \BC bar \BC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \stoptabulate
+%D
+%D \starttabulate[|||]
+%D \PB foo \BC bar \BC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \stoptabulate
+%D
+%D \starttabulate[|||]
+%D \FB[bar] foo \BC bar \BC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \stoptabulate
+%D
+%D \startnarrower
+%D \starttabulate[|||]
+%D \DB foo \DB bar \BC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \stoptabulate
+%D \stopnarrower
+%D
+%D \starttabulate[|||]
+%D \BC foo \BC bar \BC \NR
+%D \NL[magenta] foo \NC bar \NC \NR
+%D \NL[yellow] foo \NC bar \NC \NR
+%D \NL[cyan] foo \NC bar \NC \NR
+%D \NL[gray] foo \NC bar \NC \NR
+%D \stoptabulate
+%D
+%D \starttabulate
+%D \NL[red] foo \NC bar \NC \NR
+%D \NL[green] foo \NL[red] bar \NC \NR
+%D \NC foo \NC bar \NC \NR
+%D \NL[blue] foo \NC \input tufte \NC \NR
+%D \NL[gray] foo \NC bar \NC \NR
+%D \NL[yellow] foo \NC bar \NC \NR
+%D \stoptabulate
+%D \stoptyping
+
+% \setuptabulate
+% [\c!background=,
+% \c!backgroundcolor=,
+% \c!foregroundcolor=,
+% \c!foregroundstyle=]
+
+\let\m_table_current_row_background \empty
+\let\m_table_current_row_background_default \empty
+\let\m_table_current_row_background_filler \empty
+\let\m_table_current_row_background_defaultfiller\empty
+\let\m_table_current_row_background_auto \empty
+
+\unexpanded\def\tabl_register_row_background#1%
+ {\xdef\m_table_current_row_background{#1}}
+
+\unexpanded\def\tabl_register_row_background_filler#1%
+ {\xdef\m_table_current_row_background_filler{#1}}
+
+\unexpanded\def\tabl_synchronize_row_background
+ {\iftrialtypesetting\else
+ \ifx\m_table_current_row_background_filler\empty
+ \ifx\m_table_current_row_background\empty
+ % nothing
+ \tabl_synchronize_row_background_dummy
+ \else
+ \tabl_synchronize_row_background_indeed\m_table_current_row_background
+ \fi
+ \else
+ \tabl_synchronize_row_background_filler_indeed\m_table_current_row_background_filler
+ \fi
+ \fi}
+
+\unexpanded\def\tabl_synchronize_row_background_dummy
+ {\iftrialtypesetting\else
+ \begingroup
+ %\clf_setbackgroundrowdata\numexpr\c_tabl_tabulate_nofrealrows+\minusone\relax\zerocount\zeropoint
+ \clf_setbackgroundrowdata\c_tabl_tabulate_nofrealrows\zerocount\zeropoint
+ \endgroup
+ \fi}
+
+\unexpanded\def\tabl_synchronize_row_background_indeed#1%
+ {\iftrialtypesetting\else
+ \begingroup
+ \clf_enablebackgroundalign % can be moved into \clf_setbackgroundrowdata
+ \dousecolorparameter{#1}%
+ \setbox\scratchbox\hpack{}%
+ %\clf_setbackgroundrowdata\numexpr\c_tabl_tabulate_nofrealrows+\minusone\relax\scratchbox\d_tabl_tabulate_indent
+ \clf_setbackgroundrowdata\c_tabl_tabulate_nofrealrows\scratchbox\d_tabl_tabulate_indent
+ \endgroup
+ \fi}
+
+\unexpanded\def\tabl_synchronize_row_background_filler_indeed#1%
+ {\iftrialtypesetting\else
+ \begingroup
+ \clf_enablebackgroundalign % can be moved into \clf_setbackgroundrowdata
+ \node_linefiller_set{#1}%
+ \setbox\scratchbox\hpack{}%
+ %\clf_setbackgroundrowdata\numexpr\c_tabl_tabulate_nofrealrows+\minusone\relax\scratchbox\d_tabl_tabulate_indent
+ \clf_setbackgroundrowdata\c_tabl_tabulate_nofrealrows\scratchbox\d_tabl_tabulate_indent
+ \endgroup
+ \fi}
+
+\appendtoks
+ \glet\m_table_current_row_background\empty
+ \glet\m_table_current_row_background_filler\empty
+ \global\c_tabl_tabulate_nofrealrows\zerocount
+ \global\c_tabl_tabulate_autocolor\zerocount
+ \clf_resetbackgroundrowdata
+\to \t_tabl_tabulate_initializers_first
+
+\appendtoks
+ \glet\m_table_current_row_background\empty
+ \glet\m_table_current_row_background_filler\empty
+ \global\c_tabl_tabulate_nofrealrows\zerocount
+ \global\c_tabl_tabulate_autocolor\zerocount
+ \clf_resetbackgroundrowdata
+\to \t_tabl_tabulate_initializers_second
+
+\appendtoks
+ \tabl_synchronize_row_background
+\to \t_tabl_tabulate_every_real_row
+
+\appendtoks
+ \glet\m_table_current_row_background\empty
+ \glet\m_table_current_row_background_filler\empty
+\to \t_tabl_tabulate_every_after_row
+
+\unexpanded\def\tabl_tabulate_NL_first[#1]%
+ {\tabl_tabulate_column_normal\zerocount\zerocount\relax
+ \ifcase\c_tabl_tabulate_column\or
+ \tabl_register_row_background{#1}%
+ \fi
+ \ignorespaces}
+
+\unexpanded\def\tabl_tabulate_ND_first
+ {\tabl_tabulate_column_normal\zerocount\zerocount\relax
+ \ifcase\c_tabl_tabulate_column\or
+ \tabl_register_row_background\m_table_current_row_background_default
+ \fi
+ \ignorespaces}
+
+\unexpanded\def\tabl_tabulate_LB_first[#1]%
+ {\tabl_tabulate_column_normal\plusone\zerocount\relax
+ \ifcase\c_tabl_tabulate_column\or
+ \tabl_register_row_background{#1}%
+ \fi
+ \usetabulationstyleandcolor\c!foregroundstyle\c!foregroundcolor
+ \ignorespaces}
+
+\unexpanded\def\tabl_tabulate_DB_first
+ {\tabl_tabulate_column_normal\plusone\zerocount\relax
+ \ifcase\c_tabl_tabulate_column\or
+ \tabl_register_row_background\m_table_current_row_background_default
+ \fi
+ \let\fontstyle\globalfontstyle
+ \usetabulationstyleandcolor\c!foregroundstyle\c!foregroundcolor
+ \ignorespaces}
+
+\unexpanded\def\tabl_tabulate_NF_first[#1]%
+ {\tabl_tabulate_column_normal\zerocount\zerocount\relax
+ \ifcase\c_tabl_tabulate_column\or
+ \tabl_register_row_background_filler{#1}%
+ \fi
+ \ignorespaces}
+
+\unexpanded\def\tabl_tabulate_NP_first
+ {\tabl_tabulate_column_normal\zerocount\zerocount\relax
+ \ifcase\c_tabl_tabulate_column\or
+ \tabl_register_row_background_filler\m_table_current_row_background_default_filler
+ \fi
+ \ignorespaces}
+
+\unexpanded\def\tabl_tabulate_FB_first[#1]%
+ {\tabl_tabulate_column_normal\plusone\zerocount\relax
+ \ifcase\c_tabl_tabulate_column\or
+ \tabl_register_row_background_filler{#1}%
+ \fi
+ \usetabulationstyleandcolor\c!foregroundstyle\c!foregroundcolor
+ \ignorespaces}
+
+\unexpanded\def\tabl_tabulate_PB_first
+ {\tabl_tabulate_column_normal\plusone\zerocount\relax
+ \ifcase\c_tabl_tabulate_column\or
+ \tabl_register_row_background_filler\m_table_current_row_background_default_filler
+ \fi
+ \let\fontstyle\globalfontstyle
+ \usetabulationstyleandcolor\c!foregroundstyle\c!foregroundcolor
+ \ignorespaces}
+
+\unexpanded\def\tabl_tabulate_BC_first % overloaded
+ {\tabl_tabulate_column_normal\plusone\zerocount
+ \let\fontstyle\globalfontstyle
+ \ifx\m_table_current_row_background\empty
+ \ifx\m_table_current_row_background_filler\empty
+ \usetabulationstyleandcolor\c!headstyle\c!headcolor
+ \else
+ \usetabulationstyleandcolor\c!foregroundstyle\c!foregroundcolor
+ \fi
+ \else
+ \usetabulationstyleandcolor\c!foregroundstyle\c!foregroundcolor
+ \fi}
+
+\unexpanded\def\tabl_tabulate_A_first
+ {\global\advance\c_tabl_tabulate_autocolor\plusone
+ \edef\m_table_current_row_background_auto{\tabulateparameter{\c!backgroundcolor:\number\c_tabl_tabulate_autocolor}}%
+ \ifx\m_table_current_row_background_auto\empty
+ \global\c_tabl_tabulate_autocolor\plusone
+ \edef\m_table_current_row_background_auto{\tabulateparameter{\c!backgroundcolor:\number\c_tabl_tabulate_autocolor}}%
+ \fi
+ \ifx\m_table_current_row_background_auto\empty
+ \let\m_table_current_row_background_auto\empty % \m_table_current_row_background_default
+ \fi
+ \tabl_register_row_background{\m_table_current_row_background_auto}}
+
+\unexpanded\def\tabl_tabulate_NA_first
+ {\tabl_tabulate_column_normal\zerocount\zerocount\relax
+ \iftrialtypesetting\else
+ \ifcase\c_tabl_tabulate_column\or
+ \tabl_tabulate_A_first
+ \fi
+ \fi
+ \ignorespaces}
+
+\unexpanded\def\tabl_tabulate_BA_first
+ {\tabl_tabulate_column_normal\plusone\zerocount\relax
+ \iftrialtypesetting\else
+ \ifcase\c_tabl_tabulate_column\or
+ \tabl_tabulate_A_first
+ \fi
+ \fi
+ \usetabulationstyleandcolor\c!foregroundstyle\c!foregroundcolor
+ \ignorespaces}
+
+\appendtoks
+ \let\NL\tabl_tabulate_NL_first % NC with Line
+ \let\ND\tabl_tabulate_ND_first % NC with Default Line
+ \let\LB\tabl_tabulate_LB_first % BC with Line
+ \let\DB\tabl_tabulate_DB_first % BC with Default Line
+ \let\NF\tabl_tabulate_NF_first % NC with Filler
+ \let\NP\tabl_tabulate_NP_first % NC with Predefined Filler
+ \let\FB\tabl_tabulate_FB_first % BC with Filler
+ \let\PB\tabl_tabulate_PB_first % BC with Predefined Filler
+ \let\NA\tabl_tabulate_NA_first % NC with Auto Line
+ \let\BA\tabl_tabulate_BA_first % NC with Auto Line
+\to \t_tabl_tabulate_initializers_first
+
+\appendtoks
+ \edef\m_table_current_row_background_default {\tabulateparameter\c!backgroundcolor}%
+ \edef\m_table_current_row_background_default_filler{\tabulateparameter\c!background}%
+ \let \m_table_current_row_background_auto \empty
+\to \everytabulate
+
+\setuptabulate
+ [\c!headcolor=,
+ \c!headstyle=\bf,
+ \c!backgroundcolor=\tabulationparameter\c!rulecolor,
+ \c!foregroundcolor=,
+ \c!foregroundstyle=\tabulationparameter\c!headstyle]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/tabl-tsp.mkiv b/Master/texmf-dist/tex/context/base/mkiv/tabl-tsp.mkiv
index e0ddce38a58..c5858fec109 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/tabl-tsp.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/tabl-tsp.mkiv
@@ -187,7 +187,11 @@
\bgroup
\forcelocalfloats
\setuplocalfloats[\c!before=,\c!after=,\c!inbetween=]%
+ % This controls samepage resetting too but it also messes up the numbering
+ % so I need another fix.
+% \settrialtypesetting
\splitfloatcommand{\hbox to #1{\strut}}% dummy line
+% \resettrialtypesetting
\setbox\scratchbox\vbox{\flushlocalfloats}% \vpack ?
\getnoflines{\ht\scratchbox}%
\resetlocalfloats
diff --git a/Master/texmf-dist/tex/context/base/mkiv/tabl-xtb.lua b/Master/texmf-dist/tex/context/base/mkiv/tabl-xtb.lua
index c9d50638e67..2ff87e21abe 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/tabl-xtb.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/tabl-xtb.lua
@@ -26,7 +26,7 @@ this mechamism will be improved so that it can replace its older cousin.
-- todo: use linked list instead of r/c array
-- todo: we can use the sum of previously forced widths for column spans
-local tonumber, next, rawget = tonumber, next, rawget
+local tonumber, next = tonumber, next
local commands = commands
local context = context
@@ -478,36 +478,50 @@ end
function xtables.initialize_construct()
local r = data.currentrow
local c = data.currentcolumn + 1
+ local settings = data.settings
local rows = data.rows
local row = rows[r]
while row[c].span do -- can also be previous row ones
c = c + 1
end
data.currentcolumn = c
- local widths = data.widths
- local heights = data.heights
- local depths = data.depths
+ local widths = data.widths
+ local heights = data.heights
+ local depths = data.depths
+ local distances = data.distances
--
local drc = row[c]
local wd = drc.wd
local ht = drc.ht
local dp = drc.dp
+ local nx = drc.nx - 1
+ local ny = drc.ny - 1
--
local width = widths[c]
local height = heights[r]
local depth = depths[r] -- problem: can be the depth of a one liner
--
- for x=1,drc.nx-1 do
- width = width + widths[c+x]
+ local total = height + depth
+ --
+ if nx > 0 then
+ for x=1,nx do
+ width = width + widths[c+x] + distances[c+x-1]
+ end
+ local distance = settings.columndistance
+ if distance ~= 0 then
+ width = width + nx * distance
+ end
end
--
- local total = height + depth
- local ny = drc.ny
- if ny > 1 then
- for y=1,ny-1 do
+ if ny > 0 then
+ for y=1,ny do
local nxt = r + y
total = total + heights[nxt] + depths[nxt]
end
+ local distance = settings.rowdistance
+ if distance ~= 0 then
+ total = total + ny * distance
+ end
end
--
texsetdimen("d_tabl_x_width",width)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/tabl-xtb.mkvi b/Master/texmf-dist/tex/context/base/mkiv/tabl-xtb.mkvi
index 1483043316d..e8279589276 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/tabl-xtb.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/tabl-xtb.mkvi
@@ -498,9 +498,16 @@
\unexpanded\def\stopxcell
{\tabl_x_stop_cell}
+% \unexpanded\def\dummyxcell
+% {\tabl_x_start_cell_nop
+% \tabl_x_stop_cell}
+
\unexpanded\def\dummyxcell
- {\tabl_x_start_cell_nop
- \tabl_x_stop_cell}
+ {\begingroup
+ \let\inheritedxtableframed\relax
+ \tabl_x_start_cell_nop
+ \tabl_x_stop_cell
+ \endgroup}
% \unexpanded\def\tabl_x_begin_of_cell
% {%\inhibitblank % already in framed
diff --git a/Master/texmf-dist/tex/context/base/mkiv/toks-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/toks-ini.lua
index 2c85a575477..eef26574e0e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/toks-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/toks-ini.lua
@@ -36,18 +36,27 @@ local scan_argument = token.scan_argument
local scan_tokenlist = token.scan_tokenlist
local scan_int = token.scan_int
local scan_code = token.scan_code
+local scan_token_code = token.scan_token_code
local scan_dimen = token.scan_dimen
local scan_glue = token.scan_glue
local scan_keyword = token.scan_keyword
local scan_keyword_cs = token.scan_keyword_cs or scan_keyword
local scan_token = token.scan_token
+local scan_box = token.scan_box
local scan_word = token.scan_word
+local scan_key = token.scan_key
+local scan_value = token.scan_value
+local scan_char = token.scan_char
local scan_number = token.scan_number
local scan_csname = token.scan_csname
local scan_real = token.scan_real
local scan_float = token.scan_float
local get_next = token.get_next
+local get_next_token = token.get_next_token
+local skip_next = token.skip_next
+local peek_next_char = token.peek_next_char
+local is_next_char = token.is_next_char
local set_macro = token.set_macro
local get_macro = token.get_macro
@@ -61,14 +70,6 @@ local new_token = token.new
local is_defined = token.is_defined
local is_token = token.is_token
-if not is_defined then
-
- is_defined = function(name)
- return get_cmdname(create_token(name)) ~= "undefined_cs"
- end
-
-end
-
tokens.new = new_token
tokens.create = create_token
tokens.istoken = is_token
@@ -104,14 +105,10 @@ local bits = {
tokens.bits = bits
-local space_bits = bits.space
-
-- words are space or \relax terminated and the trailing space is gobbled; a word
--- can contain any non-space letter/other
-
-local t = { } -- small optimization, a shared variable that is not reset
+-- can contain any non-space letter/other (see archive for implementation in lua)
-if scan_word then
+if not scan_number then
scan_number = function(base)
local s = scan_word()
@@ -124,70 +121,8 @@ if scan_word then
end
end
-else
-
- scan_word = function()
- local n = 0
- while true do
- local c = scan_code()
- if c then
- n = n + 1
- t[n] = utfchar(c)
- elseif scan_code(space_bits) then
- if n > 0 then
- break
- end
- elseif n > 0 then
- break
- else
- return
- end
- end
- return concat(t,"",1,n)
- end
-
- -- so we gobble the space (like scan_int) (number has to be space or non-char terminated
- -- as we accept 0xabcd and such so there is no clear separator for a keyword
-
- scan_number = function(base)
- local n = 0
- while true do
- local c = scan_code()
- if c then
- n = n + 1
- t[n] = char(c)
- elseif scan_code(space_bits) then
- if n > 0 then
- break
- end
- elseif n > 0 then
- break
- else
- return
- end
- end
- local s = concat(t,"",1,n)
- if base then
- return tonumber(s,base)
- else
- return tonumber(s)
- end
- end
-
end
--- -- the next one cannot handle \iftrue true\else false\fi
---
--- local function scan_boolean()
--- if scan_keyword("true") then
--- return true
--- elseif scan_keyword("false") then
--- return false
--- else
--- return nil
--- end
--- end
-
local function scan_boolean()
local kw = scan_word()
if kw == "true" then
@@ -199,24 +134,33 @@ local function scan_boolean()
end
end
-if not scan_csname then
+local function scan_verbatim()
+ return scan_argument(false)
+end
+
+if not scan_box then
+
+ local scan_list = token.scan_list
+ local put_next = token.put_next
- scan_csname = function()
- local t = get_next()
- local n = t.csname
- return n ~= "" and n or nil
+ scan_box = function(s)
+ if s == "hbox" or s == "vbox" or s == "vtop" then
+ put_next(create_token(s))
+ end
end
-end
+ token.scan_box = scan_box
-local function scan_verbatim()
- return scan_argument(false)
end
tokens.scanners = { -- these expand
token = scan_token,
toks = scan_toks,
tokens = scan_toks,
+ box = scan_box,
+ hbox = function() return scan_box("hbox") end,
+ vbox = function() return scan_box("vbox") end,
+ vtop = function() return scan_box("vtop") end,
dimen = scan_dimen,
dimension = scan_dimen,
glue = scan_glue,
@@ -230,12 +174,19 @@ tokens.scanners = { -- these expand
tokenlist = scan_tokenlist,
verbatim = scan_verbatim,
code = scan_code,
+ tokencode = scan_token_code,
word = scan_word,
+ key = scan_key,
+ value = scan_value,
+ char = scan_char,
number = scan_number,
boolean = scan_boolean,
keyword = scan_keyword,
keywordcs = scan_keyword_cs,
csname = scan_csname,
+ peek = peek_next_char,
+ skip = skip_next,
+ ischar = is_next_char,
}
tokens.getters = { -- these don't expand
@@ -307,6 +258,7 @@ if setinspector then
active = t.active,
expandable = t.expandable,
protected = t.protected,
+ frozen = t.frozen,
mode = t.mode,
index = t.index,
cmdname = cmdname,
diff --git a/Master/texmf-dist/tex/context/base/mkiv/toks-scn.lua b/Master/texmf-dist/tex/context/base/mkiv/toks-scn.lua
index 297ef71212a..2d20d5a8b31 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/toks-scn.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/toks-scn.lua
@@ -29,6 +29,7 @@ local scannumber = scanners.number
local scankeyword = scanners.keyword
local scankeywordcs = scanners.keywordcs
local scanword = scanners.word
+local scankey = scanners.key
local scancode = scanners.code
local scanboolean = scanners.boolean
local scandimen = scanners.dimen
@@ -144,6 +145,26 @@ scanners.list = scanlist
scanners.table = scantable
scanners.conditional = scanconditional
+function scanners.whd()
+ local width, height, depth
+ while true do
+ if scankeyword("width") then
+ width = scandimen()
+ elseif scankeyword("height") then
+ height = scandimen()
+ elseif scankeyword("depth") then
+ depth = scandimen()
+ else
+ break
+ end
+ end
+ if width or height or depth then
+ return width or 0, height or 0, depth or 0
+ else
+ -- we inherit
+ end
+end
+
local shortcuts = {
tokens = tokens,
bits = tokenbits,
@@ -160,10 +181,15 @@ local shortcuts = {
scankeyword = scankeyword,
scankeywordcs = scankeywordcs,
scanword = scanword,
+ -- scankey = scankey,
scancode = scancode,
scanboolean = scanboolean,
scandimen = scandimen,
scandimension = scandimen,
+ scanbox = scanners.box,
+ scanhbox = scanners.hbox,
+ scanvbox = scanners.vbox,
+ scanvtop = scanners.vtop,
scanconditional = scanconditional,
scanopen = scanopen,
scanclose = scanclose,
diff --git a/Master/texmf-dist/tex/context/base/mkiv/trac-ctx.lua b/Master/texmf-dist/tex/context/base/mkiv/trac-ctx.lua
index 33637fd66d9..6681be51c5f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/trac-ctx.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/trac-ctx.lua
@@ -70,3 +70,17 @@ implement {
install(texdirectives,directives.register,tag,enable,disable)
end,
}
+
+-- this one might move
+
+interfaces.implement {
+ name = "unsupportedcs",
+ public = true,
+ actions = function()
+ logs.newline()
+ logs.report("fatal error","unsupported cs \\%s",tokens.scanners.csname())
+ logs.newline()
+ luatex.abort()
+ end
+}
+
diff --git a/Master/texmf-dist/tex/context/base/mkiv/trac-deb.lua b/Master/texmf-dist/tex/context/base/mkiv/trac-deb.lua
index 95f3052fe6f..71055eafac9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/trac-deb.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/trac-deb.lua
@@ -6,11 +6,14 @@ if not modules then modules = { } end modules ['trac-deb'] = {
license = "see context related readme files"
}
-local lpeg, status = lpeg, status
+-- This is an old mechanism, a result of some experiments in the early days of
+-- luatex and mkiv, but still nice anyway.
-local lpegmatch = lpeg.match
+local status = status
+
+local tonumber, tostring, type = tonumber, tostring, type
local format, concat, match, find, gsub = string.format, table.concat, string.match, string.find, string.gsub
-local tonumber, tostring = tonumber, tostring
+local lpegmatch = lpeg.match
-- maybe tracers -> tracers.tex (and tracers.lua for current debugger)
@@ -31,11 +34,33 @@ local strings = tracers.strings
local texgetdimen = tex.getdimen
local texgettoks = tex.gettoks
local texgetcount = tex.getcount
+local texgethelp = tex.gethelptext or function() end
+local fatalerror = tex.fatalerror
local implement = interfaces.implement
+-- this is used in lmx files but needs to be redone
+
strings.undefined = "undefined"
+function tracers.dimen(name)
+ local d = texgetdimen(name)
+ return d and number.topoints(d) or strings.undefined
+end
+
+function tracers.count(name)
+ return texgetcount(name) or strings.undefined
+end
+
+function tracers.toks(name,limit)
+ local t = texgettoks(name)
+ return t and string.limit(t,tonumber(limit) or 40) or strings.undefined
+end
+
+function tracers.primitive(name)
+ return tex[name] or strings.undefined
+end
+
lists.scratch = {
0, 2, 4, 6, 8
}
@@ -58,15 +83,15 @@ local types = {
}
local splitboth = lpeg.splitat(":")
-local splittype = lpeg.firstofsplit(":")
-local splitname = lpeg.secondofsplit(":")
function tracers.type(csname)
- return lpegmatch(splittype,csname)
+ local tag, name = lpegmatch(splitboth,csname)
+ return tag or ""
end
function tracers.name(csname)
- return lpegmatch(splitname,csname) or csname
+ local tag, name = lpegmatch(splitboth,csname)
+ return name or csname
end
function tracers.cs(csname)
@@ -78,30 +103,14 @@ function tracers.cs(csname)
end
end
-function tracers.dimen(name)
- local d = texgetdimen(name)
- return d and number.topoints(d) or strings.undefined
-end
-
-function tracers.count(name)
- return texgetcount(name) or strings.undefined
-end
-
-function tracers.toks(name,limit)
- local t = texgettoks(name)
- return t and string.limit(t,tonumber(limit) or 40) or strings.undefined
-end
-
-function tracers.primitive(name)
- return tex[name] or strings.undefined
-end
-
function tracers.knownlist(name)
local l = lists[name]
return l and #l > 0
end
local savedluaerror = nil
+local usescitelexer = nil
+local quitonerror = true
local function errorreporter(luaerror)
local category = luaerror and "lua error" or "tex error"
@@ -121,41 +130,46 @@ function tracers.showlines(filename,linenumber,offset,luaerrorline)
end
end
end
- local lines = data and string.splitlines(data)
- if lines and #lines > 0 then
- if luaerrorline and luaerrorline > 0 then
- -- lua error: linenumber points to last line
- local start = "\\startluacode"
- local stop = "\\stopluacode"
- local n = linenumber
- for i=n,1,-1 do
- local line = lines[i]
- if not line then
- break
- elseif find(line,start) then
- n = i + luaerrorline - 1
- if n <= linenumber then
- linenumber = n
+ local scite = usescitelexer and require("util-sci")
+ if scite then
+ return utilities.scite.tohtml(data,"tex",linenumber or true,false)
+ else
+ local lines = data and string.splitlines(data)
+ if lines and #lines > 0 then
+ if luaerrorline and luaerrorline > 0 then
+ -- lua error: linenumber points to last line
+ local start = "\\startluacode"
+ local stop = "\\stopluacode"
+ local n = linenumber
+ for i=n,1,-1 do
+ local line = lines[i]
+ if not line then
+ break
+ elseif find(line,start) then
+ n = i + luaerrorline - 1
+ if n <= linenumber then
+ linenumber = n
+ end
+ break
end
- break
end
end
- end
- offset = tonumber(offset) or 10
- linenumber = tonumber(linenumber) or 10
- local start = math.max(linenumber - offset,1)
- local stop = math.min(linenumber + offset,#lines)
- if stop > #lines then
- return "<linenumber past end of file>"
- else
- local result, fmt = { }, "%" .. #tostring(stop) .. "d %s %s"
- for n=start,stop do
- result[#result+1] = format(fmt,n,n == linenumber and ">>" or " ",lines[n])
+ offset = tonumber(offset) or 10
+ linenumber = tonumber(linenumber) or 10
+ local start = math.max(linenumber - offset,1)
+ local stop = math.min(linenumber + offset,#lines)
+ if stop > #lines then
+ return "<linenumber past end of file>"
+ else
+ local result, fmt = { }, "%" .. #tostring(stop) .. "d %s %s"
+ for n=start,stop do
+ result[#result+1] = format(fmt,n,n == linenumber and ">>" or " ",lines[n])
+ end
+ return concat(result,"\n")
end
- return concat(result,"\n")
+ else
+ return "<empty file>"
end
- else
- return "<empty file>"
end
end
@@ -169,7 +183,7 @@ end
-- todo: \starttext bla \blank[foo] bla \stoptext
local nop = function() end
-local resetmessages = status.resetmessages() or nop
+local resetmessages = status.resetmessages or nop
local function processerror(offset)
-- print("[[ last tex error: " .. tostring(status.lasterrorstring or "<unset>") .. " ]]")
@@ -178,12 +192,11 @@ local function processerror(offset)
-- print("[[ last location : " .. tostring(status.lastwarninglocation or "<unset>") .. " ]]")
-- print("[[ last context : " .. tostring(status.lasterrorcontext or "<unset>") .. " ]]")
- local inputstack = resolvers.inputstack
- local filename = inputstack[#inputstack] or status.filename
+ local filename = status.filename
local linenumber = tonumber(status.linenumber) or 0
local lastcontext = status.lasterrorcontext
local lasttexerror = status.lasterrorstring or "?"
- local lastluaerror = status.lastluaerrorstring or lasttexerror
+ local lastluaerror = status.lastluaerrorstring or "?" -- lasttexerror
local luaerrorline = match(lastluaerror,[[lua%]?:.-(%d+)]]) or (lastluaerror and find(lastluaerror,"?:0:",1,true) and 0)
local lastmpserror = match(lasttexerror,[[^.-mp%serror:%s*(.*)$]])
resetmessages()
@@ -194,69 +207,108 @@ local function processerror(offset)
offset = tonumber(offset) or 10,
lasttexerror = lasttexerror,
lastmpserror = lastmpserror,
- lastluaerror = lastluaerror,
+ lastluaerror = lastluaerror, -- can be the same as lasttexerror
luaerrorline = luaerrorline,
lastcontext = lastcontext,
+ lasttexhelp = tex.gethelptext and tex.gethelptext() or nil,
}
end
-- so one can overload the printer if (really) needed
+if fatalerror then
+ callback.register("terminal_input",function(what)
+ if what == "*" then
+ fatalerror("some kind of input expected, file ends too soon, quitting now")
+ else
+ fatalerror("bad input, quitting now")
+ end
+ end)
+else
+ -- tex.print("\\nonstopmode")
+end
+
+directives.register("system.quitonerror",function(v)
+ quitonerror = toboolean(v)
+ -- tex.print("\\errorstopmode")
+end)
+
+directives.register("system.usescitelexer",function(v)
+ usescitelexer = toboolean(v)
+end)
+
+local busy = false
+
function tracers.printerror(specification)
- local filename = specification.filename
- local linenumber = specification.linenumber
- local lasttexerror = specification.lasttexerror
- local lastmpserror = specification.lastmpserror
- local lastluaerror = specification.lastluaerror
- local lastcontext = specification.lasterrorcontext
- local luaerrorline = specification.luaerrorline
- local errortype = specification.errortype
- local offset = specification.offset
- local report = errorreporter(luaerrorline)
- if not filename then
- report("error not related to input file: %s ...",lasttexerror)
- elseif type(filename) == "number" then
- report("error on line %s of filehandle %s: %s ...",linenumber,lasttexerror)
- else
- report_nl()
- if luaerrorline then
- if linenumber == 0 or not filename or filename == "" then
- print("\nfatal lua error:\n\n",lastluaerror,"\n")
- os.exit(1)
- return
+ if not busy then
+ busy = true
+ local filename = specification.filename
+ local linenumber = specification.linenumber
+ local lasttexerror = specification.lasttexerror
+ local lastmpserror = specification.lastmpserror
+ local lastluaerror = specification.lastluaerror
+ local lastcontext = specification.lasterrorcontext
+ local luaerrorline = specification.luaerrorline
+ local errortype = specification.errortype
+ local offset = specification.offset
+ local report = errorreporter(luaerrorline)
+ if not filename then
+ report("error not related to input file:")
+ report(" tex: %s",lasttexerror or "-")
+ report(" lua: %s",lastluaerror or "-")
+ report(" mps: %s",lastmpserror or "-")
+ elseif type(filename) == "number" then
+ report("error on line %s of filehandle %s: %s ...",linenumber,lasttexerror)
+ else
+ report_nl()
+ if luaerrorline then
+ if linenumber == 0 or not filename or filename == "" then
+ print("\nfatal lua error:\n\n",lastluaerror,"\n")
+ luatex.abort()
+ return
+ else
+ report("lua error on line %s in file %s:\n\n%s",linenumber,filename,lastluaerror)
+ end
+ elseif lastmpserror then
+ report("mp error on line %s in file %s:\n\n%s",linenumber,filename,lastmpserror)
else
- report("lua error on line %s in file %s:\n\n%s",linenumber,filename,lastluaerror)
+ report("tex error on line %s in file %s: %s",linenumber,filename,lasttexerror)
+ if lastcontext then
+ report_nl()
+ report_str(lastcontext)
+ report_nl()
+ elseif tex.show_context then
+ report_nl()
+ tex.show_context()
+ end
end
- elseif lastmpserror then
- report("mp error on line %s in file %s:\n\n%s",linenumber,filename,lastmpserror)
- else
- report("tex error on line %s in file %s: %s",linenumber,filename,lasttexerror)
- if lastcontext then
+ report_nl()
+ report_str(tracers.showlines(filename,linenumber,offset,tonumber(luaerrorline)))
+ report_nl()
+ end
+ local errname = file.addsuffix(tex.jobname .. "-error","log")
+ if quitonerror then
+ table.save(errname,specification)
+ local help = specification.lasttexhelp
+ if help and #help > 0 then
report_nl()
- report_str(lastcontext)
+ report_str(help)
report_nl()
- elseif tex.show_context then
report_nl()
- tex.show_context()
end
+ luatex.abort()
end
- report_nl()
- report_str(tracers.showlines(filename,linenumber,offset,tonumber(luaerrorline)))
- report_nl()
+ busy = false
end
end
+luatex.wrapup(function() os.remove(file.addsuffix(tex.jobname .. "-error","log")) end)
+
local function processwarning(offset)
- -- local inputstack = resolvers.inputstack
- -- local filename = inputstack[#inputstack] or status.filename
- -- local linenumber = tonumber(status.linenumber) or 0
local lastwarning = status.lastwarningstring or "?"
local lastlocation = status.lastwarningtag or "?"
resetmessages()
tracers.printwarning {
- -- filename = filename,
- -- linenumber = linenumber,
- -- offset = tonumber(offset) or 10,
lastwarning = lastwarning ,
lastlocation = lastlocation,
}
@@ -272,7 +324,7 @@ directives.register("system.errorcontext", function(v)
register('show_error_message', nop)
register('show_warning_message',function() processwarning(v) end)
register('show_error_hook', function() processerror(v) end)
- register('show_lua_error_hook', nop)
+ register('show_lua_error_hook', function() processerror(v) end)
else
register('show_error_message', nil)
register('show_error_hook', nil)
@@ -288,20 +340,27 @@ lmx = lmx or { }
lmx.htmfile = function(name) return environment.jobname .. "-status.html" end
lmx.lmxfile = function(name) return resolvers.findfile(name,'tex') end
+local function reportback(lmxname,default,variables)
+ if lmxname == false then
+ return variables
+ else
+ local name = lmx.show(type(lmxname) == "string" and lmxname or default,variables)
+ if name then
+ logs.report("context report","file: %s",name)
+ end
+ end
+end
+
function lmx.showdebuginfo(lmxname)
local variables = {
['title'] = 'ConTeXt Debug Information',
['color-background-one'] = lmx.get('color-background-green'),
['color-background-two'] = lmx.get('color-background-blue'),
}
- if lmxname == false then
- return variables
- else
- lmx.show(lmxname or 'context-debug.lmx',variables)
- end
+ reportback(lmxname,"context-debug.lmx",variables)
end
-function lmx.showerror(lmxname)
+local function showerror(lmxname)
local filename, linenumber, errorcontext = status.filename, tonumber(status.linenumber) or 0, ""
if not filename then
filename, errorcontext = 'unknown', 'error in filename'
@@ -319,15 +378,18 @@ function lmx.showerror(lmxname)
['filename'] = filename,
['errorcontext'] = errorcontext,
}
- if lmxname == false then
- return variables
- else
- lmx.show(lmxname or 'context-error.lmx',variables)
- end
+ reportback(lmxname,"context-error.lmx",variables)
+ luatex.abort()
end
-function lmx.overloaderror()
- callback.register('show_error_hook', function() lmx.showerror() end) -- prevents arguments being passed
+lmx.showerror = showerror
+
+function lmx.overloaderror(v)
+ if v == "scite" then
+ usescitelexer = true
+ end
+ callback.register('show_error_hook', function() showerror() end) -- prevents arguments being passed
+ callback.register('show_lua_error_hook', function() showerror() end) -- prevents arguments being passed
end
directives.register("system.showerror", lmx.overloaderror)
@@ -367,6 +429,8 @@ directives.register("system.showerror", lmx.overloaderror)
-- end
-- end)
+local implement = interfaces.implement
+
implement { name = "showtrackers", actions = trackers.show }
implement { name = "enabletrackers", actions = trackers.enable, arguments = "string" }
implement { name = "disabletrackers", actions = trackers.disable, arguments = "string" }
diff --git a/Master/texmf-dist/tex/context/base/mkiv/trac-exp.lua b/Master/texmf-dist/tex/context/base/mkiv/trac-exp.lua
index 5879f1b7bad..e25110999f2 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/trac-exp.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/trac-exp.lua
@@ -64,7 +64,7 @@ function exporters.man(specification,...)
end
--
result[#result+1] = formatters['.TH "%s" "1" "%s" "version %s" "%s"'](name,os.date("01-01-%Y"),version,detail)
- result[#result+1] = formatters[".SH NAME\n.B %s"](name)
+ result[#result+1] = formatters[".SH NAME\n %s - %s"](name,detail) -- KB/TL wants 'detail' in this line too
result[#result+1] = formatters[".SH SYNOPSIS\n.B %s [\n.I OPTIONS ...\n.B ] [\n.I FILENAMES\n.B ]"](runner)
result[#result+1] = formatters[".SH DESCRIPTION\n.B %s"](detail)
--
diff --git a/Master/texmf-dist/tex/context/base/mkiv/trac-inf.lua b/Master/texmf-dist/tex/context/base/mkiv/trac-inf.lua
index a7823c251b5..40dfe854e15 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/trac-inf.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/trac-inf.lua
@@ -29,7 +29,7 @@ statistics.threshold = 0.01
local statusinfo, n, registered, timers = { }, 0, { }, { }
setmetatableindex(timers,function(t,k)
- local v = { timing = 0, loadtime = 0 }
+ local v = { timing = 0, loadtime = 0, offset = 0 }
t[k] = v
return v
end)
@@ -39,48 +39,58 @@ local function hastiming(instance)
end
local function resettiming(instance)
- timers[instance or "notimer"] = { timing = 0, loadtime = 0 }
+ timers[instance or "notimer"] = { timing = 0, loadtime = 0, offset = 0 }
end
local ticks = clock
local seconds = function(n) return n or 0 end
--- if FFISUPPORTED and ffi and os.type == "windows" then
---
--- local okay, kernel = pcall(ffi.load,"kernel32")
---
--- if kernel then
---
--- local tonumber = ffi.number or tonumber
---
--- ffi.cdef[[
--- int QueryPerformanceFrequency(int64_t *lpFrequency);
--- int QueryPerformanceCounter(int64_t *lpPerformanceCount);
--- ]]
---
--- local target = ffi.new("__int64[1]")
---
--- ticks = function()
--- if kernel.QueryPerformanceCounter(target) == 1 then
--- return tonumber(target[0])
--- else
--- return 0
--- end
--- end
---
--- local target = ffi.new("__int64[1]")
---
--- seconds = function(ticks)
--- if kernel.QueryPerformanceFrequency(target) == 1 then
--- return ticks / tonumber(target[0])
--- else
--- return 0
--- end
--- end
---
--- end
---
--- end
+if lua.getpreciseticks then
+
+ ticks = lua.getpreciseticks
+ seconds = lua.getpreciseseconds
+
+elseif FFISUPPORTED and ffi and os.type == "windows" then
+
+ local okay, kernel = pcall(ffi.load,"kernel32")
+
+ if kernel then
+
+ local tonumber = ffi.number or tonumber
+
+ ffi.cdef[[
+ int QueryPerformanceFrequency(int64_t *lpFrequency);
+ int QueryPerformanceCounter(int64_t *lpPerformanceCount);
+ ]]
+
+ local target = ffi.new("__int64[1]")
+
+ ticks = function()
+ if kernel.QueryPerformanceCounter(target) == 1 then
+ return tonumber(target[0])
+ else
+ return 0
+ end
+ end
+
+ local target = ffi.new("__int64[1]")
+
+ seconds = function(ticks)
+ if kernel.QueryPerformanceFrequency(target) == 1 then
+ return ticks / tonumber(target[0])
+ else
+ return 0
+ end
+ end
+
+ end
+
+else
+
+ -- excessive timing costs some 1-2 percent runtime
+
+end
+
local function starttiming(instance,reset)
local timer = timers[instance or "notimer"]
@@ -118,12 +128,27 @@ local function stoptiming(instance)
return 0
end
+local function benchmarktimer(instance)
+ local timer = timers[instance or "notimer"]
+ local it = timer.timing
+ if it > 1 then
+ timer.timing = it - 1
+ else
+ local starttime = timer.starttime
+ if starttime and starttime > 0 then
+ timer.offset = ticks() - starttime
+ else
+ timer.offset = 0
+ end
+ end
+end
+
local function elapsed(instance)
if type(instance) == "number" then
return instance
else
local timer = timers[instance or "notimer"]
- return timer and seconds(timer.loadtime) or 0
+ return timer and seconds(timer.loadtime - 2*(timer.offset or 0)) or 0
end
end
@@ -138,7 +163,7 @@ local function currenttime(instance)
else
local starttime = timer.starttime
if starttime and starttime > 0 then
- return seconds(timer.loadtime + ticks() - starttime)
+ return seconds(timer.loadtime + ticks() - starttime - 2*(timer.offset or 0))
end
end
return 0
@@ -168,6 +193,7 @@ statistics.elapsed = elapsed
statistics.elapsedtime = elapsedtime
statistics.elapsedindeed = elapsedindeed
statistics.elapsedseconds = elapsedseconds
+statistics.benchmarktimer = benchmarktimer
-- general function .. we might split this module
@@ -193,10 +219,17 @@ function statistics.show()
-- register("luatex banner", function()
-- return lower(status.banner)
-- end)
- register("used engine", function()
- return format("%s version %s with functionality level %s, banner: %s",
- LUATEXENGINE, LUATEXVERSION, LUATEXFUNCTIONALITY, lower(status.banner))
- end)
+ if LUATEXENGINE == "luametatex" then
+ register("used engine", function()
+ return format("%s version %s, functionality level %s, format id %s",
+ LUATEXENGINE, LUATEXVERSION, LUATEXFUNCTIONALITY, LUATEXFORMATID)
+ end)
+ else
+ register("used engine", function()
+ return format("%s version %s with functionality level %s, banner: %s",
+ LUATEXENGINE, LUATEXVERSION, LUATEXFUNCTIONALITY, lower(status.banner))
+ end)
+ end
register("control sequences", function()
return format("%s of %s + %s", status.cs_count, status.hash_size,status.hash_extra)
end)
@@ -239,7 +272,11 @@ end
function statistics.memused() -- no math.round yet -)
local round = math.round or math.floor
- return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
+ return format("%s MB, ctx: %s MB, max: %s MB)",
+ round(collectgarbage("count")/1000),
+ round(status.luastate_bytes/1000000),
+ status.luastate_bytes_max and round(status.luastate_bytes_max/1000000) or "unknown"
+ )
end
starttiming(statistics)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/trac-lmx.lua b/Master/texmf-dist/tex/context/base/mkiv/trac-lmx.lua
index c7f94961878..a531a76d671 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/trac-lmx.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/trac-lmx.lua
@@ -684,8 +684,9 @@ end
lmx.make = lmxmake
function lmx.show(name,variables)
+ -- todo: pcall
local htmfile = lmxmake(name,variables)
- lmx.popupfile(htmfile)
+ -- lmx.popupfile(htmfile)
return htmfile
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/trac-log.lua b/Master/texmf-dist/tex/context/base/mkiv/trac-log.lua
index e76c9f6849e..bb154067f70 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/trac-log.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/trac-log.lua
@@ -114,17 +114,34 @@ local direct, subdirect, writer, pushtarget, poptarget, setlogfile, settimedlog,
-- we don't want this overhead for single messages (not that there are that
-- many; we could have a special weak table)
+local function ansisupported(specification)
+ if specification ~= "ansi" and specification ~= "ansilog" then
+ return false
+ elseif os and os.enableansi then
+ return os.enableansi()
+ else
+ return false
+ end
+end
+
if runningtex and texio then
if texio.setescape then
texio.setescape(0) -- or (false)
end
- if arg then
+ if arg and ansisupported then
-- we're don't have environment.arguments yet
for k, v in next, arg do -- k can be negative !
if v == "--ansi" or v == "--c:ansi" then
- variant = "ansi"
+ if ansisupported("ansi") then
+ variant = "ansi"
+ end
+ break
+ elseif v == "--ansilog" or v == "--c:ansilog" then
+ if ansisupported("ansilog") then
+ variant = "ansilog"
+ end
break
end
end
@@ -246,6 +263,11 @@ if runningtex and texio then
}
}
+ variants.ansilog = {
+ formats = variants.ansi.formats,
+ targets = variants.default.targets,
+ }
+
logs.flush = io.flush
writer = function(...)
@@ -368,6 +390,9 @@ if runningtex and texio then
t = specification.targets
f = specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification = "default"
+ end
local v = variants[specification]
if v then
t = v.targets
@@ -394,8 +419,8 @@ if runningtex and texio then
subdirect_nop = f.subdirect_nop
status_yes = f.status_yes
status_nop = f.status_nop
- if variant == "ansi" then
- useluawrites() -- because tex escapes ^^
+ if variant == "ansi" or variant == "ansilog" then
+ useluawrites() -- because tex escapes ^^, not needed in lmtx
end
settarget(whereto)
end
@@ -511,6 +536,9 @@ else
if type(specification) == "table" then
f = specification.formats or specification
else
+ if not ansisupported(specification) then
+ specification = "default"
+ end
local v = variants[specification]
if v then
f = v.formats
@@ -817,38 +845,6 @@ local nesting = 0
local verbose = false
local hasscheme = url.hasscheme
-function logs.show_open(name)
- -- if hasscheme(name) ~= "virtual" then
- -- if verbose then
- -- nesting = nesting + 1
- -- report_files("level %s, opening %s",nesting,name)
- -- else
- -- write(formatters["(%s"](name)) -- tex adds a space
- -- end
- -- end
-end
-
-function logs.show_close(name)
- -- if hasscheme(name) ~= "virtual" then
- -- if verbose then
- -- report_files("level %s, closing %s",nesting,name)
- -- nesting = nesting - 1
- -- else
- -- write(")") -- tex adds a space
- -- end
- -- end
-end
-
-function logs.show_load(name)
- -- if hasscheme(name) ~= "virtual" then
- -- if verbose then
- -- report_files("level %s, loading %s",nesting+1,name)
- -- else
- -- write(formatters["(%s)"](name))
- -- end
- -- end
-end
-
-- there may be scripts out there using this:
local simple = logs.reporter("comment")
@@ -946,6 +942,15 @@ logs.reporters = reporters
logs.exporters = exporters
function logs.application(t)
+ --
+ local arguments = environment and environment.arguments
+ if arguments then
+ local ansi = arguments.ansi or arguments.ansilog
+ if ansi then
+ logs.setformatters(arguments.ansi and "ansi" or "ansilog")
+ end
+ end
+ --
t.name = t.name or "unknown"
t.banner = t.banner
t.moreinfo = moreinfo
@@ -1039,8 +1044,8 @@ end
-- this is somewhat slower but prevents out-of-order messages when print is mixed
-- with texio.write
-io.stdout:setvbuf('no')
-io.stderr:setvbuf('no')
+-- io.stdout:setvbuf('no')
+-- io.stderr:setvbuf('no')
-- windows: > nul 2>&1
-- unix : > null 2>&1
diff --git a/Master/texmf-dist/tex/context/base/mkiv/trac-set.lua b/Master/texmf-dist/tex/context/base/mkiv/trac-set.lua
index 6311d638296..960c4ef84a6 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/trac-set.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/trac-set.lua
@@ -9,8 +9,9 @@ if not modules then modules = { } end modules ['trac-set'] = { -- might become u
-- maybe this should be util-set.lua
local type, next, tostring, tonumber = type, next, tostring, tonumber
+local print = print
local concat, sortedhash = table.concat, table.sortedhash
-local format, find, lower, gsub, topattern = string.format, string.find, string.lower, string.gsub, string.topattern
+local formatters, find, lower, gsub, topattern = string.formatters, string.find, string.lower, string.gsub, string.topattern
local is_boolean = string.is_boolean
local settings_to_hash = utilities.parsers.settings_to_hash
local allocate = utilities.storage.allocate
@@ -30,11 +31,11 @@ local data = { }
-- The sorting is needed to get a predictable setters in case of *.
local trace_initialize = false -- only for testing during development
+local frozen = true -- this needs checking
function setters.initialize(filename,name,values) -- filename only for diagnostics
local setter = data[name]
if setter then
- frozen = true -- don't permitoverload
-- trace_initialize = true
local data = setter.data
if data then
@@ -254,8 +255,8 @@ end
local enable, disable, register, list, show = setters.enable, setters.disable, setters.register, setters.list, setters.show
-function setters.report(setter,...)
- print(format("%-15s : %s\n",setter.name,format(...)))
+function setters.report(setter,fmt,...)
+ print(formatters["%-15s : %s\n"](setter.name,formatters[fmt](...)))
end
local function default(setter,name)
@@ -278,7 +279,7 @@ function setters.new(name) -- we could use foo:bar syntax (but not used that oft
disable = function(...) disable (setter,...) end,
reset = function(...) reset (setter,...) end, -- can be dangerous
register = function(...) register(setter,...) end,
- list = function(...) list (setter,...) end,
+ list = function(...) return list (setter,...) end,
show = function(...) show (setter,...) end,
default = function(...) return default (setter,...) end,
value = function(...) return value (setter,...) end,
diff --git a/Master/texmf-dist/tex/context/base/mkiv/trac-tex.mkiv b/Master/texmf-dist/tex/context/base/mkiv/trac-tex.mkiv
index 4c2db68f327..c69f3febb93 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/trac-tex.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/trac-tex.mkiv
@@ -32,11 +32,38 @@
\unexpanded\def\enabletextracers [#1]{\processcommalist[#1]\syst_textracers_enable }
\unexpanded\def\disabletextracers[#1]{\processcommalist[#1]\syst_textracers_disable}
-\def\syst_textracers_enable #1{\csname enabletracer#1\endcsname}
-\def\syst_textracers_disable#1{\csname disabletracer#1\endcsname}
+\def\syst_textracers_enable #1{\begincsname enabletracer#1\endcsname}
+\def\syst_textracers_disable#1{\begincsname disabletracer#1\endcsname}
% The next one is for Taco, although we can use directives as well:
\unexpanded\def\nomkivstatistics{\enabledirectives[system.nostatistics]}
+%D This is not really a tracker but for decades it lived in my \type {cont-loc}
+%D file. I moved it here because I wanted someone else to use it. This macro is not
+%D really useful for users. I kept the \LUA\ variant in \type {cont-loc.mkiv}.
+
+\installcorenamespace{profilemacrocount}
+\installcorenamespace{profilemacromacro}
+
+\newtoks\t_syst_profile
+
+\appendtoks
+ \the\t_syst_profile
+\to \everystoptext
+
+\unexpanded\def\profilemacro#1% an oldie, but modernized a bit
+ {\edef\p_name{\csstring#1}%
+ \ifcsname\??profilemacrocount\p_name\endcsname \else
+ \expandafter\newcount\csname\??profilemacrocount\p_name\endcsname
+ \expandafter\let\csname\??profilemacromacro\p_name\endcsname#1%
+ \xtoksapp\t_syst_profile
+ {\writestatus
+ {profile}%
+ {\string#1: \noexpand\the\csname\??profilemacrocount\p_name\endcsname}}%
+ \unexpanded\xdef#1%
+ {\global\advance\csname\??profilemacrocount\p_name\endcsname\plusone
+ \expandafter\noexpand\csname\??profilemacromacro\p_name\endcsname}%
+ \fi}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/trac-vis.lua b/Master/texmf-dist/tex/context/base/mkiv/trac-vis.lua
index 4dc3bd03b02..e592b7d0c98 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/trac-vis.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/trac-vis.lua
@@ -7,10 +7,10 @@ if not modules then modules = { } end modules ['trac-vis'] = {
}
local node, nodes, attributes, fonts, tex = node, nodes, attributes, fonts, tex
-local type, tonumber, next = type, tonumber, next
+local type, tonumber, next, rawget = type, tonumber, next, rawget
local gmatch = string.gmatch
local formatters = string.formatters
-local compactfloat = number.compactfloat
+local round = math.round
-- This module started out in the early days of mkiv and luatex with visualizing
-- kerns related to fonts. In the process of cleaning up the visual debugger code it
@@ -388,11 +388,12 @@ local c_skip_b = "trace:m"
local c_glyph = "trace:o"
local c_ligature = "trace:s"
local c_white = "trace:w"
-local c_math = "trace:r"
+local c_math = "trace:s"
local c_origin = "trace:o"
local c_discretionary = "trace:d"
local c_expansion = "trace:o"
local c_depth = "trace:o"
+local c_indent = "trace:s"
local c_positive_d = "trace:db"
local c_negative_d = "trace:dr"
@@ -510,11 +511,11 @@ local glyphexpansion do
glyphexpansion = function(head,current)
local extra = getexpansion(current)
- if extra ~= 0 then
+ if extra and extra ~= 0 then
extra = extra / 1000
local info = f_cache[extra]
if not info then
- local text = hpack_string(compactfloat(extra,"%.1f"),usedfont)
+ local text = hpack_string(round(extra),usedfont)
local rule = new_rule(emwidth/fraction,exheight,2*exheight)
local list = getlist(text)
if extra > 0 then
@@ -548,7 +549,7 @@ local kernexpansion do
extra = extra / 1000
local info = f_cache[extra]
if not info then
- local text = hpack_string(compactfloat(extra,"%.1f"),usedfont)
+ local text = hpack_string(round(extra),usedfont)
local rule = new_rule(emwidth/fraction,exheight,4*exheight)
local list = getlist(text)
if extra > 0 then
@@ -779,12 +780,7 @@ local ruledbox do
setlink(info,next)
end
if prev and prev > 0 then
- -- if getid(prev) == gluespec_code then
- -- report_visualize("ignoring invalid prev")
- -- -- weird, how can this happen, an inline glue-spec, probably math
- -- else
- setlink(prev,info)
- -- end
+ setlink(prev,info)
end
if head == current then
return info, info
@@ -863,22 +859,25 @@ end
local ruledglue do
- local gluecodes = nodes.gluecodes
- local leadercodes = nodes.gluecodes
+ local gluecodes = nodes.gluecodes
+ local leadercodes = nodes.gluecodes
- local userskip_code = gluecodes.userskip
- local spaceskip_code = gluecodes.spaceskip
- local xspaceskip_code = gluecodes.xspaceskip
- local leftskip_code = gluecodes.leftskip
- local rightskip_code = gluecodes.rightskip
+ local userskip_code = gluecodes.userskip
+ local spaceskip_code = gluecodes.spaceskip
+ local xspaceskip_code = gluecodes.xspaceskip
+ local leftskip_code = gluecodes.leftskip
+ local rightskip_code = gluecodes.rightskip
+ local parfillskip_code = gluecodes.parfillskip
+ local indentskip_code = gluecodes.indentskip
+ local correctionskip_code = gluecodes.correctionskip
- local cleaders_code = leadercodes.cleaders
+ local cleaders_code = leadercodes.cleaders
local g_cache_v = caches["vglue"]
local g_cache_h = caches["hglue"]
local tags = {
- -- [gluecodes.userskip] = "US",
+ -- [userskip_code] = "US",
[gluecodes.lineskip] = "LS",
[gluecodes.baselineskip] = "BS",
[gluecodes.parskip] = "PS",
@@ -886,23 +885,29 @@ local ruledglue do
[gluecodes.belowdisplayskip] = "DB",
[gluecodes.abovedisplayshortskip] = "SA",
[gluecodes.belowdisplayshortskip] = "SB",
- [gluecodes.leftskip] = "LS",
- [gluecodes.rightskip] = "RS",
[gluecodes.topskip] = "TS",
[gluecodes.splittopskip] = "ST",
[gluecodes.tabskip] = "AS",
- [gluecodes.spaceskip] = "SP",
- [gluecodes.xspaceskip] = "XS",
- [gluecodes.parfillskip] = "PF",
+ [gluecodes.lefthangskip] = "LH",
+ [gluecodes.righthangskip] = "RH",
[gluecodes.thinmuskip] = "MS",
[gluecodes.medmuskip] = "MM",
[gluecodes.thickmuskip] = "ML",
+ [gluecodes.intermathskip] = "IM",
+ [gluecodes.mathskip] = "MT",
[leadercodes.leaders] = "NL",
[leadercodes.cleaders] = "CL",
[leadercodes.xleaders] = "XL",
[leadercodes.gleaders] = "GL",
-- true = "VS",
-- false = "HS",
+ [leftskip_code] = "LS",
+ [rightskip_code] = "RS",
+ [spaceskip_code] = "SP",
+ [xspaceskip_code] = "XS",
+ [parfillskip_code] = "PF",
+ [indentskip_code] = "IN",
+ [correctionskip_code] = "CS",
}
-- we sometimes pass previous as we can have issues in math (not watertight for all)
@@ -919,6 +924,8 @@ local ruledglue do
info = sometext(amount,l_glue,c_space)
elseif subtype == leftskip_code or subtype == rightskip_code then
info = sometext(amount,l_glue,c_skip_a)
+ elseif subtype == parfillskip_code or subtype == indentskip_code or subtype == correctionskip_code then
+ info = sometext(amount,l_glue,c_indent)
elseif subtype == userskip_code then
if width > 0 then
info = sometext(amount,l_glue,c_positive)
@@ -996,12 +1003,12 @@ local ruledkern do
local k_cache_v = caches["vkern"]
local k_cache_h = caches["hkern"]
- ruledkern = function(head,current,vertical)
+ ruledkern = function(head,current,vertical,mk)
local kern = getkern(current)
local cache = vertical and k_cache_v or k_cache_h
local info = cache[kern]
if not info then
- local amount = formatters["%s:%0.3f"](vertical and "VK" or "HK",kern*pt_factor)
+ local amount = formatters["%s:%0.3f"](vertical and "VK" or (mk and "MK") or "HK",kern*pt_factor)
if kern > 0 then
info = sometext(amount,l_kern,c_positive)
elseif kern < 0 then
@@ -1113,6 +1120,7 @@ do
local math_code = nodecodes.math
local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
+ local marginkern_code = nodecodes.marginkern
local kerncodes = nodes.kerncodes
local fontkern_code = kerncodes.fontkern
@@ -1330,6 +1338,10 @@ do
if trace_math then
head, current = math(head,current)
end
+ elseif id == marginkern_code then
+ if trace_kern then
+ head, current = ruledkern(head,current,vertical,true)
+ end
end
goto next
::list::
diff --git a/Master/texmf-dist/tex/context/base/mkiv/type-ini.lua b/Master/texmf-dist/tex/context/base/mkiv/type-ini.lua
index cd5b32d3e6c..a2e19725ed0 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/type-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/type-ini.lua
@@ -25,14 +25,7 @@ local p_strip = Cs((P("type-") * (P("imp-")^0))^0/"" * P(1)^0)
local report = logs.reporter("fonts","typescripts")
local function action(name,foundname)
- -- context.startreadingfile()
- -- context.unprotect()
- -- context.pushendofline()
- -- context.input(foundname)
- -- context.popendofline()
- -- context.protect()
- -- context.stopreadingfile()
- context.loadfoundtypescriptfile(foundname)
+ context.loadfoundtypescriptfile(name,foundname)
end
local patterns = {
@@ -81,7 +74,7 @@ local patterns = {
-- elseif name_two == name then
-- report("unknown library %a",name_one)
-- else
--- commands.uselibrary {
+-- resolvers.uselibrary {
-- name = name_two,
-- patterns = patterns,
-- action = action,
diff --git a/Master/texmf-dist/tex/context/base/mkiv/type-ini.mklx b/Master/texmf-dist/tex/context/base/mkiv/type-ini.mklx
new file mode 100644
index 00000000000..5470c9016ce
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/type-ini.mklx
@@ -0,0 +1,618 @@
+%D \module
+%D [ file=type-ini,
+%D version=2001.03.05,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Typescript Macros / Initialization}
+
+\registerctxluafile{type-ini}{}
+
+%D The default fontclass is empty. We could demand always using fontclasses, and
+%D then make the calling macros simplier (always assume fontclass) but apart from
+%D downward compatibility issues, it would make global, class spanning definitions a
+%D pain. Some day we will introduce a default class.
+%D
+%D The \type {type-ini} and \type {font-ini} modules come as a pair and have mutual
+%D dependencies.
+%D
+%D At some point we will only store in memory so some code can go away.
+
+\unprotect
+
+\definesystemvariable {ts} % TypeScript / for the moment we keep this one
+
+\newcount \c_font_typescripts_n_of_preloaded
+\newconditional\c_font_typescripts_quit
+\newtoks \c_font_typescripts_document
+\newconditional\c_font_typescripts_preload
+\newconditional\c_font_typescripts_first_pass \settrue\c_font_typescripts_first_pass
+
+\newif \iftypescriptfound % will become a mode
+\newif \iftracetypescripts
+
+\newtoks \everybeforedefinetypeface
+\newtoks \everyafterdefinetypeface
+
+\let\typescriptfiles \empty
+\let\currenttypescripts\empty
+\let\currenttypefile \empty
+
+\installmacrostack\currenttypefile
+
+\let\typescriptone \empty % public, used in typescripts
+\let\typescripttwo \empty % public, used in typescripts
+\let\typescriptthree\empty % public, used in typescripts
+
+\installmacrostack\typescriptone
+\installmacrostack\typescripttwo
+\installmacrostack\typescriptthree
+
+\let\fontclassstyle \empty
+
+\installmacrostack\fontclassstyle
+
+\let\m_font_typescripts_one \empty
+\let\m_font_typescripts_two \empty
+\let\m_font_typescripts_three\empty
+\let\m_font_typescripts_check\empty
+\let\m_font_typescripts_match\empty
+
+\installmacrostack\m_font_typescripts_one
+\installmacrostack\m_font_typescripts_two
+\installmacrostack\m_font_typescripts_three
+
+\let\t_font_typescripts\relax % uses as synonym
+
+\installcorenamespace{typescriptcache}
+\installcorenamespace{typescriptfiles}
+\installcorenamespace{typescriptonce}
+\installcorenamespace{typescriptsynonyms}
+\installcorenamespace{typescriptprefix}
+\installcorenamespace{typescriptinheritances}
+\installcorenamespace{typescriptdefaultstyles}
+\installcorenamespace{typescriptrelatives}
+
+\definesystemvariable{ts} % TypeScript
+
+% tricky ... here we push/pop ... so \let
+
+\let\typescriptmethod\plusone % 1: empty==all==true 2: empty==false
+\let\typescriptstate \plustwo % 1: process 2: store
+
+\installmacrostack\typescriptmethod
+\installmacrostack\typescriptstate
+
+\unexpanded\def\starttypescriptcollection
+ {\dosingleempty\font_typescripts_collection_start}
+
+\def\font_typescripts_collection_start[#tag]%
+ {}
+
+\let\stoptypescriptcollection\relax
+
+\unexpanded\def\usetypescriptfile[#filename]%
+ {\doifelse{#filename}\v!reset
+ {\let\typescriptfiles\empty}
+ {\splitfilename{#filename}%
+ \addtocommalist\splitoffbase\typescriptfiles}}
+
+\unexpanded\def\usetypescript {\dotripleempty\font_typescripts_use_one}
+\unexpanded\def\usetypescriptexact{\dotripleempty\font_typescripts_use_two}
+
+\def\font_typescripts_use_one{\let\typescriptmethod\plusone\font_typescripts_use}
+\def\font_typescripts_use_two{\let\typescriptmethod\plustwo\font_typescripts_use}
+
+\installmacrostack\stoptypescript
+
+\unexpanded\def\font_typescripts_use[#one][#two][#three]%
+ {\push_macro_m_font_typescripts_one
+ \push_macro_m_font_typescripts_two
+ \push_macro_m_font_typescripts_three
+ \edef\m_font_typescripts_one {\truetypescript{#one}}%
+ \edef\m_font_typescripts_two {\truetypescript{#two}}%
+ \edef\m_font_typescripts_three{\truetypescript{#three}}%
+ \push_macro_typescriptone
+ \push_macro_typescripttwo
+ \push_macro_typescriptthree
+ \push_macro_typescriptmethod
+ \push_macro_typescriptstate
+ \push_macro_stoptypescript
+ \typescriptfoundfalse
+ \let\typescriptstate\plusone % why
+ \iftracetypescripts
+ \writestatus\m!fonts{request: [\m_font_typescripts_one] [\m_font_typescripts_two] [\m_font_typescripts_three]}%
+ \fi
+ \ifhmode
+ \font_typescripts_use_inline
+ \else
+ \font_typescripts_use_display
+ \fi
+ \setfalse\c_font_typescripts_first_pass
+ \pop_macro_stoptypescript
+ \pop_macro_typescriptstate
+ \pop_macro_typescriptmethod
+ \pop_macro_typescriptthree
+ \pop_macro_typescripttwo
+ \pop_macro_typescriptone
+ \pop_macro_m_font_typescripts_three
+ \pop_macro_m_font_typescripts_two
+ \pop_macro_m_font_typescripts_one}
+
+\def\font_typescripts_use_display
+ {\processcommacommand[\typescriptfiles]\font_typescripts_load_file
+ \the\c_font_typescripts_document}
+
+\let\font_typescripts_use_inline\font_typescripts_use_display
+
+\unexpanded\def\preloadtypescripts
+ {\ifproductionrun\settrue\c_font_typescripts_preload\fi}
+
+\prependtoks
+ \preloadtypescripts
+\to \everyjob
+
+\unexpanded\def\loadtypescriptfile[#1]%
+ {\push_macro_typescriptstate
+ \let\typescriptstate\plustwo % assumes 2 at the outer level
+ \clf_loadtypescriptfile{#1}%
+ \pop_macro_typescriptstate}
+
+\unexpanded\def\loadfoundtypescriptfile#1#2% name foundname / not a user command
+ {\startreadingfile
+ \unprotect
+ \pushendofline
+ \input{#2}%
+ \popendofline
+ \protect
+ \stopreadingfile}
+
+\unexpanded\def\quittypescriptscanning
+ {\settrue\c_font_typescripts_quit} % public
+
+\def\font_typescripts_start_store#definitions\stoptypescript
+ {\global\advance\c_font_typescripts_n_of_preloaded\plusone
+ \expandafter\normalgdef\csname\??typescriptcache\the\c_font_typescripts_n_of_preloaded\endcsname
+ {\starttypescript#definitions\stoptypescript}%
+ \gtoksapp\t_font_typescripts\expandafter
+ {\csname\??typescriptcache\the\c_font_typescripts_n_of_preloaded\endcsname}}
+
+\def\font_typescripts_collection_start_store#definitions\stoptypescriptcollection
+ {\global\advance\c_font_typescripts_n_of_preloaded\plusone
+ \expandafter\normalgdef\csname\??typescriptcache\the\c_font_typescripts_n_of_preloaded\endcsname
+ {\starttypescriptcollection#definitions\stoptypescriptcollection}%
+ \gtoksapp\t_font_typescripts\expandafter
+ {\csname\??typescriptcache\the\c_font_typescripts_n_of_preloaded\endcsname}}
+
+\def\font_typescripts_load_file#filename%
+ {\setfalse\c_font_typescripts_quit
+ \push_macro_currenttypefile
+ \def\currenttypefile{#filename}%
+ \ifconditional\c_font_typescripts_preload
+ \font_typescript_process_typescript_file_and_store
+ \else
+ \font_typescript_process_typescript_file
+ \fi
+ \pop_macro_currenttypefile
+ \ifconditional\c_font_typescripts_quit
+ \quitcommalist
+ \setfalse\c_font_typescripts_quit
+ \fi}
+
+\def\font_typescript_process_typescript_file_and_store
+ {\expandafter\let\expandafter\t_font_typescripts\csname\??typescriptfiles\currenttypefile\endcsname
+ \ifx\t_font_typescripts\relax
+ \font_typescript_process_typescript_store_indeed
+ \fi
+ \the\t_font_typescripts}
+
+\def\font_typescript_process_typescript_store_indeed
+ {\newtoks\t_font_typescripts % is \relaxed elsewhere
+ \begingroup
+ \let\starttypescript \font_typescripts_start_store
+ \let\starttypescriptcollection\font_typescripts_collection_start_store
+ \font_typescript_process_typescript_file
+ \endgroup
+ \expandafter\let\csname\??typescriptfiles\currenttypefile\endcsname\t_font_typescripts}
+
+\def\font_typescript_process_typescript_file
+ {\clf_doprocesstypescriptfile{\currenttypefile}}
+
+\unexpanded\def\usetypescriptonce
+ {\dotripleempty\font_typescripts_use_once}
+
+\def\font_typescripts_use_once[#one][#two][#three]%
+ {\ifcsname\??typescriptonce#one:#two:#three\endcsname
+ \writestatus\m!fonts{once (#one) (#two) (#three)}%
+ \else
+ \expandafter\let\csname\??typescriptonce#one:#two:#three\endcsname\relax
+ \font_typescripts_use[#one][#two][#three]%
+ \fi}
+
+% \definetypescriptsynonym[lbr][cmr]
+
+\unexpanded\def\definetypescriptsynonym
+ {\dodoubleempty\font_typescripts_synonym_define}
+
+\def\font_typescripts_synonym_define[#name][#synonym]%
+ {\ifsecondargument\setevalue{\??typescriptsynonyms#name}{#synonym}\fi}
+
+\def\truetypescript#name% recursive so no \lastnamedcs
+ {\ifcsname\??typescriptsynonyms#name\endcsname
+ %\expandafter\truetypescript\csname\??typescriptsynonyms#name\endcsname
+ \expandafter\truetypescript\lastnamedcs
+ \else
+ #name%
+ \fi}
+
+% script [serif] [default] [size]
+% script [serif] [computer-modern] [size]
+% script [serif] [computer-modern] [ec]
+% script [serif] [computer-modern] [name]
+% script [serif] [computer-modern] [special]
+
+\prependtoks
+ \settrue\c_font_typescripts_first_pass
+\to \everyjob
+
+\unexpanded\def\starttypescript
+ {\ifcase\typescriptstate
+ % 0 = skip
+ \expandafter\font_typescripts_start_gobble
+ \or
+ % 1 = process
+ \expandafter\font_typescripts_start_process
+ \or
+ % 2 = store
+ \expandafter\font_typescripts_start_document
+ \else
+ % ? = skip
+ \expandafter\font_typescripts_start_gobble
+ \fi}
+
+\def\font_typescripts_start_gobble#definitions\stoptypescript{}
+
+\def\font_typescripts_start_document#definitions\stoptypescript
+ {\toksapp\c_font_typescripts_document{\starttypescript#definitions\stoptypescript}}
+
+\def\font_typescripts_start_process % could be a faster \doifelsenextoptionalif needed
+ {\let\typescriptone \m_font_typescripts_one
+ \let\typescripttwo \m_font_typescripts_two
+ \let\typescriptthree\m_font_typescripts_three
+ \let\m_font_typescripts_match\empty
+ \doifelsenextoptionalcs\font_typescripts_start_process_one\font_typescripts_start_process_all}
+
+\def\font_typescripts_start_process_all % could be a \let
+ {\ifconditional\c_font_typescripts_first_pass
+ \expandafter\font_typescripts_start_process_indeed
+ \else
+ % skip this since it may do unwanted resets, like
+ % setting symbolic font names to unknown, especially
+ % in run time user type scripts
+ \expandafter\font_typescripts_start_gobble
+ \fi}
+
+\def\font_typescripts_show_match
+ {\writestatus\m!fonts{match:\ifx\currenttypefile\relax\space *\fi \m_font_typescripts_match}}
+
+\def\font_typescripts_start_process_yes
+ {\ifdone
+ \typescriptfoundtrue
+ \iftracetypescripts\font_typescripts_show_match\fi
+ \expandafter\font_typescripts_start_process_indeed
+ \else
+ \expandafter\font_typescripts_start_gobble
+ \fi}
+
+\def\font_typescripts_start_process_one
+ {\font_typescripts_check\m_font_typescripts_one\typescriptone\font_typescripts_start_process_again_one}
+
+\def\font_typescripts_start_process_two
+ {\font_typescripts_check\m_font_typescripts_two\typescripttwo\font_typescripts_start_process_again_two}
+
+\def\font_typescripts_start_process_three
+ {\font_typescripts_check\m_font_typescripts_three\typescriptthree\font_typescripts_start_process_again_three}
+
+\def\font_typescripts_start_process_again_one
+ {\doifelsenextoptionalcs\font_typescripts_start_process_two\font_typescripts_start_process_yes}
+
+\def\font_typescripts_start_process_again_two
+ {\doifelsenextoptionalcs\font_typescripts_start_process_three\font_typescripts_start_process_yes}
+
+\let\font_typescripts_start_process_again_three\font_typescripts_start_process_yes
+
+\def\font_typescripts_start_process_indeed
+ {\push_macro_fontclass}
+
+\unexpanded\def\stoptypescript
+ {\pop_macro_fontclass}
+
+\def\font_typescripts_check#asked#target#followup[#value]% script use value next
+ {\donefalse
+ \edef\m_font_typescripts_check{#value}%
+ \ifx\m_font_typescripts_check\empty % no longer needed / met
+ \ifcase\typescriptmethod\or\donetrue\fi
+ \orelse\ifx#asked\s!all
+ \donetrue
+ \orelse\ifx\m_font_typescripts_check\s!all
+ \donetrue
+ \orelse\ifx#asked\m_font_typescripts_check % saves 10% trace so probably faster too
+ \donetrue
+ \let#target\m_font_typescripts_check
+ \else
+ \doifelsecommon\m_font_typescripts_check#asked\donetrue\donefalse
+ \ifdone
+ \let#target\commalistelement
+ \fi
+ \fi
+ \ifdone
+ \iftracetypescripts\extendtypescriptmatch\fi
+ \expandafter#followup%
+ \else
+ \expandafter\font_typescripts_start_gobble
+ \fi}
+
+\def\extendtypescriptmatch
+ {\edef\m_font_typescripts_match{\m_font_typescripts_match\space[\m_font_typescripts_check]}}
+
+%D Map files will go away in \LUATEX, but till that happens we use stripped down
+%D support for loading them.
+
+\unexpanded\def\loadmapfile{\dosingleempty\font_map_load_file}
+\unexpanded\def\loadmapline{\dodoubleempty\font_map_load_line}
+
+\def\font_map_load_file[#filename]%
+ {\clf_loadmapfile{#filename}}
+
+\def\font_map_load_line[#kind][#data]%
+ {\clf_loadmapline{#kind}{#data}}
+
+\unexpanded\def\forgetmapfiles
+ {\clf_resetmapfiles}
+
+% \prependtoks
+% \loadmapfile[mkiv-base.map]% can't we preload this one?
+% \to \everystarttext
+
+%D A handy shortcut:
+
+% \definetypescriptprefix[serif][Serif]
+% \definetypescriptprefix[sans] [Sans]
+% \definetypescriptprefix[mono] [Mono]
+%
+% \starttypescript [serif,sans,mono] [handling,hanging,hz] [pure,normal,hz,quality]
+% \setupfontsynonym [\typescriptprefix\typescriptone] [handling=\typescriptthree]
+% \stoptypescript
+
+\unexpanded\def\definetypescriptprefix
+ {\dodoubleargument\font_typescripts_define_prefix}
+
+\def\font_typescripts_define_prefix[#name][#prefix]%
+ {\setgvalue{\??typescriptprefix#name}{#prefix}} % made global
+
+\def\typescriptprefix#name%
+ %{\ifcsname\??typescriptprefix#name\endcsname\csname\??typescriptprefix#name\endcsname\else#name\fi}
+ {\ifcsname\??typescriptprefix#name\endcsname\lastnamedcs\else#name\fi}
+
+% defining typefaces:
+%
+% \definetypeface [joke] [rm]
+% \definetypeface [joke] [rm] [settings]
+% \definetypeface [joke] [rm] [serif] [lucida]
+% \definetypeface [joke] [rm] [serif] [lucida] [size]
+% \definetypeface [joke] [rm] [serif] [lucida] [size] [settings]
+% \definetypeface [joke] [specification]
+
+\unexpanded\def\definetypeface
+ {\dosixtupleargument\font_typefaces_define}
+
+\appendtoks
+ \font_helpers_reset_fontclass_math_families\fontclass
+\to \everybeforedefinetypeface
+
+%D This hooks into the font switcher:
+
+\settrue\autotypescripts
+
+\unexpanded\def\trycurrentfontclass#typeface%
+ {\ifconditional\autotypescripts
+ \usetypescript[#typeface]%
+ \ifcsname\??fontclassyes#typeface\endcsname
+ \edef\fontclass{#typeface}%
+ \else
+ \iftracetypescripts\writestatus\m!fonts{auto load typescript file 1: [#typeface]}\fi
+ \usetypescriptfile[#typeface]%
+ \usetypescript[#typeface]%
+ \ifcsname\??fontclassyes#typeface\endcsname
+ \edef\fontclass{#typeface}%
+ \else
+ % todo: message
+ \letvalueempty{\??fontclassnop#typeface}%
+ \fi
+ \fi
+ \else
+ % todo: message
+ \letvalueempty{\??fontclassnop#typeface}%
+ \fi}
+
+%D Now we define:
+
+\def\font_typefaces_define
+ {\iffifthargument
+ \expandafter\font_typefaces_define_a
+ \orelse\iffourthargument
+ \expandafter\font_typefaces_define_b
+ \orelse\ifthirdargument
+ \expandafter\font_typefaces_define_c
+ \else
+ \expandafter\font_typefaces_define_d
+ \fi}
+
+\def\font_typefaces_define_a[#name][#style][#fontshape][#fontname][#fontsize][#settings]%
+ {\iftracetypescripts\writestatus\m!fonts{define: [#name] [#style] [#fontshape] [#fontname]}\fi
+ \font_typefaces_define_indeed[#name][#style]%
+ \font_typefaces_defining_start{#name}{#style}{#settings}%
+ \font_typescripts_use_one[#fontshape][#fontname][\s!name]% [\s!name,\s!default]%
+ \iftypescriptfound
+ % we're okay
+ \orelse\ifconditional\autotypescripts
+ \iftracetypescripts\writestatus\m!fonts{auto load typescript file 2: [#fontname]}\fi
+ \usetypescriptfile[#fontname]%
+ \font_typescripts_use_one[#fontshape][#fontname][\s!name]% [\s!name,\s!default]%
+ \fi
+ \font_typescripts_use_one[#fontshape][#fontsize][\s!size]%
+ \font_typefaces_defining_stop}
+
+\def\font_typefaces_define_b[#name][#style][#fontshape][#fontname][#dummya][#dummyb]%
+ {\font_typefaces_define_a[#name][#style][#fontshape][#fontname][\s!default][#dummyb]}
+
+\def\font_typefaces_define_c[#name][#style][#dummya][#dummyb][#dummyc][#dummyd]%
+ {\font_typefaces_define_indeed[#name][#style]}
+
+\def\font_typefaces_define_d[#name][#specification][#dummya][#dummyb][#dummyc][#dummyd]% use definitions in lfg file
+ {\clf_definetypeface{#name}{#specification}}
+
+\def\font_typefaces_define_indeed[#name][#style]% saveguard against redefinition
+ {\doifsomething{#name}
+ {\ifcsname\??typescriptdefaultstyles#name\endcsname \else
+ \registerfontclass{#name}%
+ \setxvalue{\??typescriptdefaultstyles#name}{#style}%
+ \fi
+ \ifcsname#name\endcsname \else
+ \setugvalue{#name}{\switchtotypeface[#name][#style]}%
+ \fi}}
+
+\def\font_typefaces_defining_start#name#style#settings%
+ {\let\@@tsrscale \!!plusone % as we push/pop
+ \let\@@tsfeatures \empty
+ \let\@@tsfallbacks \empty
+ \let\@@tsgoodies \empty
+ \let\@@tsdirection \empty
+ \let\@@tsdesignsize\empty
+ \geteparameters[\??ts][#settings]% todo raw
+ \push_macro_fontclass
+ \push_macro_fontclassstyle
+ \setcurrentfontclass{#name}%
+ \savefontclassparameters{#style}\@@tsrscale\@@tsfeatures\@@tsfallbacks\@@tsgoodies\@@tsdesignsize\@@tsdirection
+ \the\everybeforedefinetypeface}
+
+\def\tsvar#key#default% undocumented and unofficial
+ {\expandafter\ifx\csname\??ts#key\endcsname\empty
+ #default%
+ \else
+ \csname\??ts#key\endcsname
+ \fi}
+
+\def\font_typefaces_defining_stop
+ {\the\everyafterdefinetypeface
+ \pop_macro_fontclassstyle
+ \pop_macro_fontclass}
+
+\def\dofastdefinetypeface#name#style#fontshape#fontsize#settings% called from the lua end (via case d)
+ {\font_typefaces_define_indeed[#name][#style]%
+ \font_typefaces_defining_start{#name}{#style}{#settings}%
+ \font_typescripts_use_one[#fontshape][#fontsize][\s!size]%
+ \font_typefaces_defining_stop}
+
+\unexpanded\def\setuptypeface% [class] [settings]
+ {\dodoubleempty\font_typefaces_setup}
+
+\unexpanded\def\switchtotypeface% [class] [settings]
+ {\dodoubleempty\font_typefaces_switch}
+
+\def\font_typefaces_setup[#class][#settings]%
+ {\setcurrentfontclass{#class}%
+ \let\globalfontclass\fontclass
+ \ifsecondargument
+ \setupbodyfont[#settings]%
+ \orelse\ifx\fontclass\empty
+ \setupbodyfont[\s!rm]%
+ \orelse\ifcsname\??typescriptdefaultstyles\fontclass\endcsname
+ %\setupbodyfont[\csname\??typescriptdefaultstyles\fontclass\endcsname]%
+ \expandafter\setupbodyfont\expandafter[\lastnamedcs]%
+ \else
+ \setupbodyfont[\s!rm]%
+ \fi
+ \ifmmode\mr\else\tf\fi} % needed ?
+
+\def\font_typefaces_switch[#class][#settings]%
+ {\setcurrentfontclass{#class}%
+ \let\globalfontclass\globalfontclass
+ \ifsecondargument
+ \switchtobodyfont[#settings]%
+ \orelse\ifx\fontclass\empty
+ \switchtobodyfont[\s!rm]%
+ \orelse\ifcsname\??typescriptdefaultstyles\fontclass\endcsname
+ %\switchtobodyfont[\csname\??typescriptdefaultstyles\fontclass\endcsname]%
+ \expandafter\switchtobodyfont\expandafter[\lastnamedcs]%
+ \else
+ \switchtobodyfont[\s!rm]%
+ \fi
+ \ifmmode\mr\else\tf\fi} % needed ?
+
+%D For Taco:
+%D
+%D \starttyping
+%D \inherittypeface[palatino][rm][postscript]
+%D \inherittypeface[palatino][rm][\fontclass]
+%D \inherittypeface[palatino][rm] % == \fontclass
+%D \inherittypeface[palatino] % == [rm,ss,tt,mm]
+%D \stoptyping
+
+\unexpanded\def\inherittypeface
+ {\dotripleempty\font_typescripts_inherit_indeed}
+
+\def\font_typescripts_inherit_indeed[#name][#styles][#parentclass]%
+ {\doifelsenothing{#styles}
+ {\font_typescripts_inherit_indeed[#name][\s!rm,\s!ss,\s!tt,\s!mm][\fontclass]}
+ {\doifnot{#name}{#parentclass}
+ {\glet\font_typescripts_inherit_check\font_typescripts_inherit_check_indeed
+ \def\font_typescripts_inherit_check_step#style{\setevalue{\??typescriptinheritances#name:#style}{#parentclass}}%
+ \processcommalist[#styles]\font_typescripts_inherit_check_step}}}
+
+\let\font_typescripts_inherit_check_step\relax
+
+%D This hooks into the font mechanism with:
+
+\def\font_typescripts_inherit_check_indeed#name% called often
+ {\ifcsname\??typescriptinheritances\fontclass:#name\endcsname
+ %\expandafter\let\expandafter\fontclass\csname\??typescriptinheritances\fontclass:#name\endcsname
+ \expandafter\let\expandafter\fontclass\lastnamedcs
+ \fi}
+
+\let\font_typescripts_inherit_check\gobbleoneargument
+
+% not yet:
+%
+% \def\font_helpers_check_relative_font_id
+% {\ifcsname\??typescriptrelatives\fontclass\endcsname
+% \expandafter\let\expandafter\relativefontid\csname\??typescriptrelatives\fontclass\endcsname
+% \else
+% \expandafter\normalxdef\csname\??typescriptrelatives\fontclass\endcsname{\the\lastfontid}%
+% \let\relativefontid\minusone
+% \fi}
+
+\def\v_font_string_d % default fontstyle (expands to \s!Serif in font-ini)
+ {\expandafter\ifx\csname\??typescriptdefaultstyles\fontclass\endcsname\s!rm \s!Serif \else
+ \expandafter\ifx\csname\??typescriptdefaultstyles\fontclass\endcsname\s!ss \s!Sans \else
+ \expandafter\ifx\csname\??typescriptdefaultstyles\fontclass\endcsname\s!tt \s!Mono \else
+ \s!Serif \fi\fi\fi}
+
+\unexpanded\def\font_helpers_set_fontstyle_of_fontclass
+ {\ifx\fontclass\empty
+ \let\fontstyle\s!rm
+ \orelse\ifcsname\??typescriptdefaultstyles\fontclass\endcsname
+ %\edef\fontstyle{\csname\??typescriptdefaultstyles\fontclass\endcsname}%
+ \edef\fontstyle{\lastnamedcs}%
+ \else
+ \let\fontstyle\s!rm
+ \fi}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/type-ini.mkvi b/Master/texmf-dist/tex/context/base/mkiv/type-ini.mkvi
index ac5f6af2f95..ff89c7a8fe4 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/type-ini.mkvi
+++ b/Master/texmf-dist/tex/context/base/mkiv/type-ini.mkvi
@@ -15,13 +15,13 @@
\registerctxluafile{type-ini}{}
-%D The default fontclass is empty. We could demand always using fontclasses,
-%D and then make the calling macros simplier (always assume fontclass) but
-%D apart from downward compatibility issues, it would make global, class
-%D spanning definitions a pain. Some day we will introduce a default class.
+%D The default fontclass is empty. We could demand always using fontclasses, and
+%D then make the calling macros simplier (always assume fontclass) but apart from
+%D downward compatibility issues, it would make global, class spanning definitions a
+%D pain. Some day we will introduce a default class.
%D
-%D The \type {type-ini} and \type {font-ini} modules come as a pair and have
-%D mutual dependencies.
+%D The \type {type-ini} and \type {font-ini} modules come as a pair and have mutual
+%D dependencies.
%D
%D At some point we will only store in memory so some code can go away.
@@ -183,8 +183,8 @@
\preloadtypescripts
\to \everyjob
-% The next will change .. we can load a file inside a typescript but as the state is
-% 1 then, it doesn't get stored without doing that explicitly
+%D The next will change .. we can load a file inside a typescript but as the state is
+%D 1 then, it doesn't get stored without doing that explicitly
\unexpanded\def\loadtypescriptfile[#1]%
{\push_macro_typescriptstate
@@ -192,11 +192,11 @@
\clf_loadtypescriptfile{#1}%
\pop_macro_typescriptstate}
-\unexpanded\def\loadfoundtypescriptfile#1%
+\unexpanded\def\loadfoundtypescriptfile#1#2% name foundname / not a user command
{\startreadingfile
\unprotect
\pushendofline
- \input{#1}%
+ \input{#2}%
\popendofline
\protect
\stopreadingfile}
@@ -386,11 +386,34 @@
\expandafter\font_typescripts_start_gobble
\fi}
+% \def\font_typescripts_check#asked#target#followup[#value]% script use value next
+% {\donefalse
+% \edef\m_font_typescripts_check{#value}%
+% \ifx\m_font_typescripts_check\empty % no longer needed / met
+% \ifcase\typescriptmethod\or\donetrue\fi
+% \else\ifx#asked\s!all
+% \donetrue
+% \else\ifx\m_font_typescripts_check\s!all
+% \donetrue
+% \else\ifx#asked\m_font_typescripts_check % saves 10% trace so probably faster too
+% \donetrue
+% \let#target\m_font_typescripts_check
+% \else\ifcondition\hascommonargumentcondition\m_font_typescripts_check#asked%
+% \donetrue
+% \let#target\commalistelement
+% \fi\fi\fi\fi\fi
+% \ifdone
+% \iftracetypescripts\extendtypescriptmatch\fi
+% \expandafter#followup%
+% \else
+% \expandafter\font_typescripts_start_gobble
+% \fi}
+
\def\extendtypescriptmatch
{\edef\m_font_typescripts_match{\m_font_typescripts_match\space[\m_font_typescripts_check]}}
-%D Map files will go away in \LUATEX, but till that happens we
-%D use stripped down support for loading them.
+%D Map files will go away in \LUATEX, but till that happens we use stripped down
+%D support for loading them.
\unexpanded\def\loadmapfile{\dosingleempty\font_map_load_file}
\unexpanded\def\loadmapline{\dodoubleempty\font_map_load_line}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/type-set.mkiv b/Master/texmf-dist/tex/context/base/mkiv/type-set.mkiv
index c6b0c8841fc..68cd939d769 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/type-set.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/type-set.mkiv
@@ -25,11 +25,13 @@
% but ... let's make sure that newlines are gone
- \loadfoundtypescriptfile{type-def.mkiv}
- \loadfoundtypescriptfile{type-lua.mkiv}
- \loadfoundtypescriptfile{type-siz.mkiv}
- \loadfoundtypescriptfile{type-fbk.mkiv}
- \loadfoundtypescriptfile{type-imp-latinmodern.mkiv}
+ % beware: these are low level calls, so not user commands !
+
+ \loadfoundtypescriptfile\empty{type-def.mkiv}
+ \loadfoundtypescriptfile\empty{type-lua.mkiv}
+ \loadfoundtypescriptfile\empty{type-siz.mkiv}
+ \loadfoundtypescriptfile\empty{type-fbk.mkiv}
+ \loadfoundtypescriptfile\empty{type-imp-latinmodern.mkiv}
% and not:
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-bld.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-bld.lua
index 55d74281f50..6874d385a9b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-bld.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-bld.lua
@@ -36,6 +36,11 @@ local texsetattribute = tex.setattribute
local texnest = tex.nest
local texlists = tex.lists
+local texget = tex.get
+local texset = tex.set
+
+local texgetdimen = tex.getdimen
+
local nodes = nodes
local nodeidstostring = nodes.idstostring
local nodepool = nodes.pool
@@ -43,7 +48,12 @@ local new_baselineskip = nodepool.baselineskip
local new_lineskip = nodepool.lineskip
local insert_node_before = nodes.insert_before
local hpack_node = nodes.hpack
-local count_nodes = nodes.countall
+
+local nuts = nodes.nuts
+local tonode = nodes.tonode
+local tonut = nodes.tonut
+local count_nodes = nuts.countall
+local getattr = nuts.getattr
local starttiming = statistics.starttiming
local stoptiming = statistics.stoptiming
@@ -114,7 +124,7 @@ function constructors.handler(head,followed_by_display)
if type(head) == "boolean" then
return head
else
- local attribute = head[a_parbuilder] -- or mainconstructor
+ local attribute = getattr(head,a_parbuilder) -- or mainconstructor
if attribute then
local method = names[attribute]
if method then
@@ -143,11 +153,11 @@ function parbuilders.constructors.methods.oneline(head,followed_by_display)
-- when needed we will turn this into a helper
local t = texnest[texnest.ptr]
local h = hpack_node(head)
- local d = tex.baselineskip.width - t.prevdepth - h.height
+ local d = texget("baselineskip",false) - t.prevdepth - h.height
t.prevdepth = h.depth
t.prevgraf = 1
- if d < tex.lineskiplimit then
- return insert_node_before(h,h,new_lineskip(tex.lineskip))
+ if d < texget("lineskiplimit") then
+ return insert_node_before(h,h,new_lineskip(texget("lineskip",false))) -- no stretch etc
else
return insert_node_before(h,h,new_baselineskip(d))
end
@@ -167,7 +177,9 @@ local function processor(head,followed_by_display)
-- todo: not again in otr so we need to flag
if enabled then
starttiming(parbuilders)
- local head = actions(head,followed_by_display)
+ head = tonut(head)
+ head = actions(head,followed_by_display)
+ head = tonode(head)
stoptiming(parbuilders)
return head
else
@@ -195,6 +207,7 @@ function builders.vpack_filter(head,groupcode,size,packtype,maxdepth,direction)
local done = false
if head then
starttiming(builders)
+ head = tonut(head)
if trace_vbox_builder then
local before = count_nodes(head)
head, done = vboxactions(head,groupcode,size,packtype,maxdepth,direction)
@@ -203,6 +216,7 @@ function builders.vpack_filter(head,groupcode,size,packtype,maxdepth,direction)
else
head, done = vboxactions(head,groupcode)
end
+ head = tonode(head)
stoptiming(builders)
end
return head, done
@@ -216,14 +230,12 @@ local pageactions = nodes.tasks.actions("mvlbuilders")
local function report(groupcode,head)
report_page_builder("trigger: %s",groupcode)
- report_page_builder(" vsize : %p",tex.vsize)
- report_page_builder(" pagegoal : %p",tex.pagegoal)
- report_page_builder(" pagetotal: %p",tex.pagetotal)
+ report_page_builder(" vsize : %p",texget("vsize"))
+ report_page_builder(" pagegoal : %p",texget("pagegoal"))
+ report_page_builder(" pagetotal: %p",texget("pagetotal"))
report_page_builder(" list : %s",head and nodeidstostring(head) or "<empty>")
end
--- use tex.[sg]etlist
-
-- check why box is called before after_linebreak .. maybe make categories and
-- call 'm less
@@ -243,7 +255,7 @@ function builders.buildpage_filter(groupcode)
head, done = pageactions(head,groupcode)
stoptiming(builders)
-- -- doesn't work here (not passed on?)
- -- tex.pagegoal = tex.vsize - tex.dimen.d_page_floats_inserted_top - tex.dimen.d_page_floats_inserted_bottom
+ -- texset("pagegoal,texget("vsize") - texgetdimen("d_page_floats_inserted_top") - texgetdimen("d_page_floats_inserted_bottom")
texlists.contrib_head = head or nil -- needs checking
-- tex.setlist("contrib_head",head,head and nodes.tail(head))
return done and head or true -- no return value needed
@@ -365,34 +377,3 @@ trackers.register("builders.hpack.overflow",function(v)
show = v
registercallback("hpack_quality",(report or show) and hpack_quality or nil,"check hpack quality")
end)
-
--- local ignoredepth = - 65536000
---
--- registercallback(
--- "append_to_vlist_filter",
--- function(box,location,prevdepth,mirrored),
--- if prevdepth > ignoredepth then
--- local b = tex.baselineskip
--- local d = b.width - prevdepth
--- local g = nil
--- if mirrored then
--- d = d - box.depth
--- else
--- d = d - box.height
--- end
--- if d < tex.lineskiplimit then
--- g = nodes.pool.glue()
--- g.spec = tex.lineskip
--- else
--- g = nodes.pool.baselineskip(d)
--- end
--- g.next = box
--- box.prev = g
--- return g, mirrored and box.height or box.depth
--- else
--- return box, mirrored and box.height or box.depth
--- end
--- end,
--- "experimental prevdepth checking"
--- )
-
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-brk.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-brk.lua
index 76e50ce1859..d670c53196f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-brk.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-brk.lua
@@ -265,7 +265,7 @@ function breakpoints.handler(head)
-- for now we collect but when found ok we can move the handler here
-- although it saves nothing in terms of performance
local lang = getlang(current)
- local smap = lang and lang >= 0 and lang < 0x7FFF and (cmap[numbers[lang]] or cmap[""])
+ local smap = lang and lang >= 0 and lang < 0x7FFF and (cmap[languages.numbers[lang]] or cmap[""])
if smap then
local skip = smap.skip
local start = current
@@ -314,17 +314,17 @@ function breakpoints.handler(head)
return head
end
-- we have hits
- local numbers = languages.numbers
+ -- local numbers = languages.numbers
for i=1,#done do
local data = done[i]
local start = data[1]
local stop = data[2]
local cmap = data[3]
local smap = data[4]
--- -- we do a sanity check for language
--- local lang = getlang(start)
--- local smap = lang and lang >= 0 and lang < 0x7FFF and (cmap[numbers[lang]] or cmap[""])
--- if smap then
+ -- we do a sanity check for language
+ -- local lang = getlang(start)
+ -- local smap = lang and lang >= 0 and lang < 0x7FFF and (cmap[numbers[lang]] or cmap[""])
+ -- if smap then
local nleft = smap.nleft
local cleft = 0
local prev = getprev(start)
@@ -392,7 +392,7 @@ function breakpoints.handler(head)
head, start = method(head,start,stop,smap,kern)
end
end
--- end
+ -- end
end
end
return head
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-cap.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-cap.lua
index 7e8003c620f..c1666a9f119 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-cap.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-cap.lua
@@ -315,6 +315,9 @@ register(variables.camel, camel) -- 10
register(variables.cap, variables.capital) -- clone
register(variables.Cap, variables.Capital) -- clone
+-- This can be more clever: when we unset we can actually use the same attr ref if
+-- needed. Using properties to block further usage is not faster.
+
function cases.handler(head) -- not real fast but also not used on much data
local start = head
local lastfont = { }
@@ -341,9 +344,10 @@ function cases.handler(head) -- not real fast but also not used on much data
end
local action = actions[n] -- map back to low number
if action then
- start = action(start,attr,lastfont,n,count)
+ local quit
+ start, quit = action(start,attr,lastfont,n,count)
if trace_casing then
- report_casing("case trigger %a, instance %a, fontid %a, result %a",n,m,id,ok)
+ report_casing("case trigger %a, instance %a, fontid %a, result %a",n,m,id,quit and "-" or "+")
end
elseif trace_casing then
report_casing("unknown case trigger %a",n)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-chr.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-chr.lua
index 15d14c8601b..7a0f1fd7521 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-chr.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-chr.lua
@@ -99,8 +99,8 @@ local wordboundary_code = boundarycodes.word
local texgetnest = tex.getnest -- to be used
local texsetcount = tex.setcount
-local flush_node = node.flush_node
-local flush_list = node.flush_list
+local flush_node = nodes.flush_node
+local flush_list = nodes.flush_list
local settexattribute = tex.setattribute
local punctuation = characters.is_punctuation
@@ -175,7 +175,7 @@ local function pickup(head,tail,str)
while true do
local prev = first.prev
if prev and prev[a_marked] == attr then
- if prev.id == localpar_code then -- and prev.subtype == 0
+ if prev.id == localpar_code then -- and start_of_par(prev)
break
else
first = prev
@@ -188,6 +188,14 @@ local function pickup(head,tail,str)
end
end
+local function found(str)
+ local list = texgetnest()
+ if list then
+ local tail = list.tail
+ return tail and tail[a_marked] == marked[str]
+ end
+end
+
local actions = {
remove = function(specification)
local list = texgetnest()
@@ -254,6 +262,12 @@ interfaces.implement {
arguments = "string",
}
+interfaces.implement {
+ name = "doifelsemarkedcontent",
+ actions = function(str) ctx_doifelse(found(str)) end,
+ arguments = "string",
+}
+
-- We just put these here.
interfaces.implement {
@@ -284,6 +298,8 @@ interfaces.implement {
-- end,
-- }
+-- not needed in lmtx ...
+
interfaces.implement {
name = "lastnodeid",
actions = function()
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-chr.mkiv b/Master/texmf-dist/tex/context/base/mkiv/typo-chr.mkiv
index 365c79e5154..a648d4588c6 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-chr.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-chr.mkiv
@@ -1,4 +1,3 @@
-
%D \module
%D [ file=typo-chr,
%D version=2015.01.01, % or about that time
@@ -79,6 +78,9 @@
\def\typo_marked_remove[#1]%
{\clf_pickupmarkedcontent action{remove}mark{#1}\relax}
+\unexpanded\def\doifelsemarkedcontent#1%
+ {\clf_doifelsemarkedcontent{#1}}
+
%D A few helpers (put here for convenience):
%D
%D \starttyping
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-del.mkiv b/Master/texmf-dist/tex/context/base/mkiv/typo-del.mkiv
index 2ce98841e19..9320c37ee6f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-del.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-del.mkiv
@@ -674,22 +674,29 @@
\dostoptagged}
\def\typo_delimited_nextleft_symbol#1%
- {\localleftbox\bgroup
+ {\let\typo_delimited_reset_next_symbol\typo_delimited_reset_next_symbol_indeed
+ \localleftbox\bgroup
\swapmacros\leftboundarycharacter\rightboundarycharacter
\boundarycharactermode\plusone
\typo_delimited_left_symbol#1%
\egroup}
\def\typo_delimited_nextright_symbol#1%
- {\localrightbox\bgroup
+ {\let\typo_delimited_reset_next_symbol\typo_delimited_reset_next_symbol_indeed
+ \localrightbox\bgroup
\swapmacros\leftboundarycharacter\rightboundarycharacter
\boundarycharactermode\plusone
\typo_delimited_right_symbol#1%
\egroup}
+\unexpanded\def\typo_delimited_reset_next_symbol_indeed
+ {\localleftbox {}%
+ \localrightbox{}}%
+
+\let\typo_delimited_reset_next_symbol\relax
+
\appendtoks
- \localleftbox {}%
- \localrightbox{}%
+ \typo_delimited_reset_next_symbol
\to \everyforgetall
% \starttext
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-dha.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-dha.lua
index c0bbdc39668..9a6e39f42a2 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-dha.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-dha.lua
@@ -65,6 +65,7 @@ local insert_node_before = nuts.insert_before
local insert_node_after = nuts.insert_after
local remove_node = nuts.remove
local end_of_math = nuts.end_of_math
+local start_of_par = nuts.start_of_par
local nodepool = nuts.pool
@@ -331,7 +332,7 @@ local function process(start)
end
textdir = autodir
setprop(current,"direction",true)
- elseif id == localpar_code and getsubtype(current) == 0 then
+ elseif id == localpar_code and start_of_par(current) then
local direction = getdirection(current)
if direction == righttoleft_code then
autodir = -1
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-drp.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-drp.lua
index 9a59891e103..50eb765f221 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-drp.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-drp.lua
@@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['typo-drp'] = {
license = "see context related readme files"
}
--- This ons is sensitive for order (e.g. when combined with first line
+-- This one is sensitive for order (e.g. when combined with first line
-- processing.
-- todo: use isglyph
@@ -28,6 +28,7 @@ local enableaction = tasks.enableaction
local disableaction = tasks.disableaction
local nuts = nodes.nuts
+local tonut = nodes.tonut
local getnext = nuts.getnext
local getprev = nuts.getprev
@@ -36,6 +37,9 @@ local getid = nuts.getid
local getattr = nuts.getattr
local getwhd = nuts.getwhd
+local getprop = nuts.getprop
+local setprop = nuts.setprop
+
local setattr = nuts.setattr
local setlink = nuts.setlink
local setprev = nuts.setprev
@@ -45,6 +49,8 @@ local setchar = nuts.setchar
local setwhd = nuts.setwhd
local setkern = nuts.setkern
local setoffsets = nuts.setoffsets
+local setglyphdata = nuts.setglyphdata
+local setattr = nuts.setattr
local hpack_nodes = nuts.hpack
@@ -56,6 +62,7 @@ local new_kern = nodepool.kern
local insert_before = nuts.insert_before
local insert_after = nuts.insert_after
local remove_node = nuts.remove
+local start_of_par = nuts.start_of_par
local nextnode = nuts.traversers.node
local nextglyph = nuts.traversers.glyph
@@ -69,7 +76,6 @@ local v_last = variables.last
local texget = tex.get
local texset = tex.set
-local texsetattribute = tex.setattribute
local unsetvalue = attributes.unsetvalue
local glyph_code = nodecodes.glyph
@@ -88,16 +94,16 @@ local a_colormodel = attributes.private('colormodel')
local category = characters.category
-local settings = nil
-
-function initials.set(specification)
- settings = specification or { }
- settings.enabled = true
+local function set(par,specification)
enableaction("processors","typesetters.initials.handler")
if trace_initials then
report_initials("enabling initials")
end
- texsetattribute(a_initial,1)
+ setprop(par,a_initial,specification)
+end
+
+function initials.set(specification)
+ nuts.setparproperty(set,specification)
end
interfaces.implement {
@@ -122,256 +128,224 @@ interfaces.implement {
}
}
--- dropped caps experiment (will be done properly when luatex
--- stores the state in the local par node) .. btw, search still
--- works with dropped caps, as does an export
-
--- we need a 'par' attribute and in fact for dropped caps we don't need
--- need an attribute ... dropit will become s state counter (or end up
--- in the localpar user data
-
--- for the moment, each paragraph gets a number as id (attribute) ..problem
--- with nesting .. or anyhow, needed for tagging anyway
-
-- todo: prevent linebreak .. but normally a initial ends up at the top of
-- a page so this has a low priority
actions[v_default] = function(head,setting)
- local id = getid(head)
- if id == localpar_code then -- and getsubtype(head) == 0
- -- begin of par
- local first = getnext(head)
- local indent = false
- -- parbox .. needs to be set at 0
- if first and getid(first) == hlist_code then
- first = getnext(first)
- indent = true
- end
- -- we need to skip over kerns and glues (signals)
- while first and getid(first) ~= glyph_code do
- first = getnext(first)
- end
- if first and getid(first) == glyph_code then
- local ma = setting.ma or 0
- local ca = setting.ca
- local ta = setting.ta
- local last = first
- local distance = setting.distance or 0
- local voffset = setting.voffset or 0
- local hoffset = setting.hoffset or 0
- local parindent = texget("parindent")
- local baseline = texget("baselineskip",false)
- local lines = tonumber(setting.n) or 0
- local dynamic = setting.dynamic
- local font = setting.font
- local method = settings_to_hash(setting.method)
- local length = tonumber(setting.m) or 1
- --
- -- 1 char | n chars | skip first quote | ignore punct | keep punct
- --
- if getattr(first,a_initial) then
- for current in nextnode, getnext(first) do
- if getattr(current,a_initial) then
- last = current
- else
- break
- end
- end
- elseif method[v_auto] then
- local char = getchar(first)
- local kind = category(char)
- if kind == "po" or kind == "pi" then
- if method[v_first] then
- -- remove quote etc before initial
- local next = getnext(first)
- if not next then
- -- don't start with a quote or so
- return head
- end
- last = nil
- for current in nextglyph, next do
- head, first = remove_node(head,first,true)
- first = current
- last = first
- break
- end
- if not last then
- -- no following glyph or so
- return head
- end
- else
- -- keep quote etc with initial
- local next = getnext(first)
- if not next then
- -- don't start with a quote or so
- return head
- end
- for current in nextglyph, next do
- last = current
- break
- end
- if last == first then
- return head
- end
- end
- elseif kind == "pf" then
- -- error: final quote
+ -- begin of par
+ local first = getnext(head)
+ local indent = false
+ -- parbox .. needs to be set at 0
+ if first and getid(first) == hlist_code then
+ first = getnext(first)
+ indent = true
+ end
+ -- we need to skip over kerns and glues (signals)
+ while first and getid(first) ~= glyph_code do
+ first = getnext(first)
+ end
+ if first and getid(first) == glyph_code then
+ local ma = setting.ma or 0
+ local ca = setting.ca
+ local ta = setting.ta
+ local last = first
+ local distance = setting.distance or 0
+ local voffset = setting.voffset or 0
+ local hoffset = setting.hoffset or 0
+ local parindent = texget("parindent")
+ local baseline = texget("baselineskip",false)
+ local lines = tonumber(setting.n) or 0
+ local dynamic = setting.dynamic
+ local font = setting.font
+ local method = settings_to_hash(setting.method)
+ local length = tonumber(setting.m) or 1
+ --
+ -- 1 char | n chars | skip first quote | ignore punct | keep punct
+ --
+ if getattr(first,a_initial) then
+ for current in nextnode, getnext(first) do
+ if getattr(current,a_initial) then
+ last = current
else
- -- okay
+ break
end
- -- maybe also: get all A. B. etc
- local next = getnext(first)
- if next then
- for current, char in nextglyph, next do
- local kind = category(char)
- if kind == "po" then
- if method[v_last] then
- -- remove period etc after initial
- remove_node(head,current,true)
- else
- -- keep period etc with initial
- last = current
- end
- end
- break
+ end
+ elseif method[v_auto] then
+ local char = getchar(first)
+ local kind = category(char)
+ if kind == "po" or kind == "pi" then
+ if method[v_first] then
+ -- remove quote etc before initial
+ local next = getnext(first)
+ if not next then
+ -- don't start with a quote or so
+ return head
end
- end
- else
- for current in nextglyph, first do
- last = current
- if length <= 1 then
+ last = nil
+ for current in nextglyph, next do
+ head, first = remove_node(head,first,true)
+ first = current
+ last = first
break
- else
- length = length - 1
end
- end
- end
- local current = first
- while true do
- local id = getid(current)
- if id == kern_code then
- setkern(current,0)
- elseif id == glyph_code then
- local next = getnext(current)
- if font then
- setfont(current,font)
+ if not last then
+ -- no following glyph or so
+ return head
end
- if dynamic > 0 then
- setattr(current,0,dynamic)
+ else
+ -- keep quote etc with initial
+ local next = getnext(first)
+ if not next then
+ -- don't start with a quote or so
+ return head
end
--- apply font
-
--- local g = nuts.copy(current)
--- g.subtype = 0
--- nodes.handlers.characters(g)
--- nodes.handlers.protectglyphs(g)
--- setchar(current,g.char)
--- nuts.flush_node(g)
-
- -- can be a helper
- if ca and ca > 0 then
- setattr(current,a_colormodel,ma == 0 and 1 or ma)
- setattr(current,a_color,ca)
+ for current in nextglyph, next do
+ last = current
+ break
end
- if ta and ta > 0 then
- setattr(current,a_transparency,ta)
+ if last == first then
+ return head
end
- --
- end
- if current == last then
- break
- else
- current = getnext(current)
end
+ elseif kind == "pf" then
+ -- error: final quote
+ else
+ -- okay
end
- -- We pack so that successive handling cannot touch the dropped cap. Packaging
- -- in a hlist is also needed because we cannot locally adapt e.g. parindent (not
- -- yet stored in with localpar).
- local prev = getprev(first)
- local next = getnext(last)
- --
- setprev(first)
- setnext(last)
- local dropper = hpack_nodes(first)
- local width, height, depth = getwhd(dropper)
- setwhd(dropper,0,0,0)
- --
- setlink(prev,dropper)
- setlink(dropper,next)
- --
+ -- maybe also: get all A. B. etc
+ local next = getnext(first)
if next then
- local current = next
- while current do
- local id = getid(current)
- if id == glue_code or id == kern_code then
- local next = getnext(current)
- -- remove_node(current,current,true) -- created an invalid next link and dangling remains
- remove_node(head,current,true)
- current = next
- else
- break
+ for current, char in nextglyph, next do
+ local kind = category(char)
+ if kind == "po" then
+ if method[v_last] then
+ -- remove period etc after initial
+ remove_node(head,current,true)
+ else
+ -- keep period etc with initial
+ last = current
+ end
end
+ break
end
end
- --
- local hoffset = width + hoffset + distance + (indent and parindent or 0)
+ else
for current in nextglyph, first do
- setoffsets(current,-hoffset,-voffset) -- no longer - height here
- if current == last then
+ last = current
+ if length <= 1 then
break
+ else
+ length = length - 1
end
end
- --
- first = dropper
- --
- if setting.location == v_margin then
- -- okay
- else
- if lines == 0 then -- safeguard, not too precise
- lines = ceil((height+voffset) / baseline)
+ end
+ local current = first
+ while true do
+ local id = getid(current)
+ if id == kern_code then
+ setkern(current,0)
+ elseif id == glyph_code then
+ local next = getnext(current)
+ if font then
+ setfont(current,font)
end
- -- We cannot set parshape yet ... when we can I'll add a slope
- -- option (positive and negative, in emwidth).
- local hangafter = - lines
- local hangindent = width + distance
- if trace_initials then
- report_initials("setting hangafter to %i and hangindent to %p",hangafter,hangindent)
+ if dynamic > 0 then
+ setglyphdata(current,dynamic)
end
- texset("hangafter",hangafter)
- texset("hangindent",hangindent)
+ -- can be a helper
+ if ca and ca > 0 then
+ setattr(current,a_colormodel,ma == 0 and 1 or ma)
+ setattr(current,a_color,ca)
+ end
+ if ta and ta > 0 then
+ setattr(current,a_transparency,ta)
+ end
+ --
end
- if indent then
- insert_after(first,first,new_kern(-parindent))
+ if current == last then
+ break
+ else
+ current = getnext(current)
end
end
+ -- We pack so that successive handling cannot touch the dropped cap. Packaging
+ -- in a hlist is also needed because we cannot locally adapt e.g. parindent (not
+ -- yet stored in with localpar).
+ local prev = getprev(first)
+ local next = getnext(last)
+ --
+ setprev(first)
+ setnext(last)
+ local dropper = hpack_nodes(first)
+ local width, height, depth = getwhd(dropper)
+ setwhd(dropper,0,0,0)
+ --
+ setlink(prev,dropper)
+ setlink(dropper,next)
+ --
+ if next then
+ local current = next
+ while current do
+ local id = getid(current)
+ if id == glue_code or id == kern_code then
+ local next = getnext(current)
+ -- remove_node(current,current,true) -- created an invalid next link and dangling remains
+ remove_node(head,current,true)
+ current = next
+ else
+ break
+ end
+ end
+ end
+ --
+ local hoffset = width + hoffset + distance + (indent and parindent or 0)
+ for current in nextglyph, first do
+ setoffsets(current,-hoffset,-voffset) -- no longer - height here
+ if current == last then
+ break
+ end
+ end
+ --
+ first = dropper
+ --
+ if setting.location == v_margin then
+ -- okay
+ else
+ if lines == 0 then -- safeguard, not too precise
+ lines = ceil((height+voffset) / baseline)
+ end
+ -- We cannot set parshape yet ... when we can I'll add a slope
+ -- option (positive and negative, in emwidth).
+ local hangafter = - lines
+ local hangindent = width + distance
+ if trace_initials then
+ report_initials("setting hangafter to %i and hangindent to %p",hangafter,hangindent)
+ end
+ texset("hangafter",hangafter)
+ texset("hangindent",hangindent)
+ end
+ if indent then
+ insert_after(first,first,new_kern(-parindent))
+ end
end
return head
end
+-- we can count ... when all done, we can disable ...
+
function initials.handler(head)
- local start = head
- local attr = nil
- while start do
- attr = getattr(start,a_initial)
- if attr then
- break
- elseif getid(start) == glyph then
- break
- else
- start = getnext(start)
- end
- end
- if attr then
- -- here as we can process nested boxes first so we need to keep state
- disableaction("processors","typesetters.initials.handler")
- -- texsetattribute(attribute,unsetvalue)
- local alternative = settings.alternative or v_default
- local action = actions[alternative] or actions[v_default]
- if action then
- if trace_initials then
- report_initials("processing initials, alternative %a",alternative)
+ if getid(head) == localpar_code and start_of_par(head) then
+ local settings = getprop(head,a_initial)
+ if settings then
+ disableaction("processors","typesetters.initials.handler")
+ local alternative = settings.alternative or v_default
+ local action = actions[alternative] or actions[v_default]
+ if action then
+ if trace_initials then
+ report_initials("processing initials, alternative %a",alternative)
+ end
+ return action(head,settings)
end
- return action(head,settings)
end
end
return head
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-drp.mkiv b/Master/texmf-dist/tex/context/base/mkiv/typo-drp.mkiv
index 18392510803..25b006b2f0f 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-drp.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-drp.mkiv
@@ -88,35 +88,31 @@
\begingroup
\edef\currentinitial{#1}%
\setupcurrentinitial[#2]%
- \scratchcounter \initialparameter\c!n\relax
- \scratchdistance\initialparameter\c!distance\relax
- \scratchhoffset \initialparameter\c!hoffset \relax
- \edef\p_voffset{\initialparameter\c!voffset}%
- \scratchvoffset\dimexpr\ifx\p_voffset\v!line\scratchcounter\lineheight-\lineheight\else\p_voffset\fi\relax
\resetfontfeature % might be needed in more places
\doifelsenothing{\initialparameter\c!style}
{\definedfont[\initialparameter\s!font]}
{\useinitialstyleparameter\c!style}%
\useinitialcolorparameter\c!color
- \edef\p_text{\initialparameter\c!text}% optional
+ \edef\p_voffset{\initialparameter\c!voffset}%
+ \scratchcounter \initialparameter\c!n\relax
+ \scratchvoffset\dimexpr\ifx\p_voffset\v!line\scratchcounter\lineheight-\lineheight\else\p_voffset\fi\relax
\clf_setinitial
location {\initialparameter\c!location}%
enabled true\space
n \scratchcounter
m \numexpr\initialparameter\c!m\relax
method {\initialparameter\c!method}%
- distance \scratchdistance
- hoffset \scratchhoffset
+ distance \dimexpr\initialparameter\c!distance\relax
+ hoffset \dimexpr\initialparameter\c!hoffset\relax
voffset \scratchvoffset
ma \attribute\colormodelattribute
ca \attribute\colorattribute
ta \attribute\transparencyattribute
font \fontid\font
- dynamic \attribute\zerocount % it's a bit over the top to support this here
+ dynamic \font_dynamic_value % it's a bit over the top to support this here
\relax
- \stopluacode
- \kern\zeropoint % we need a node
- \p_text
+ \attribute\initialattribute\plusone
+ \initialparameter\c!text
\endgroup
\glet\typo_initial_handle\relax}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-dua.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-dua.lua
index 3db5f510ac1..0cec0e08e1e 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-dua.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-dua.lua
@@ -85,6 +85,7 @@ local setdirection = nuts.setdirection
local remove_node = nuts.remove
local insert_node_after = nuts.insert_after
local insert_node_before = nuts.insert_before
+local start_of_par = nuts.start_of_par
local nodepool = nuts.pool
local new_direction = nodepool.direction
@@ -336,7 +337,7 @@ local function get_baselevel(head,list,size,direction)
-- This is an adapted version:
if direction == lefttoright_code or direction == righttoleft_code then
return direction, true
- elseif getid(head) == localpar_code and getsubtype(head) == 0 then
+ elseif getid(head) == localpar_code and start_of_par(head) then
direction = getdirection(head)
if direction == lefttoright_code or direction == righttoleft_code then
return direction, true
@@ -774,7 +775,7 @@ local function apply_to_list(list,size,head,pardir)
enddir = false
end
elseif begindir then
- if id == localpar_code and getsubtype(current) == 0 then
+ if id == localpar_code and start_of_par(current) then
-- localpar should always be the 1st node
local d = new_direction(begindir)
-- setprop(d,"directions",true)
@@ -816,7 +817,7 @@ local function apply_to_list(list,size,head,pardir)
end
local function process(head,direction,only_one,where)
- -- This is an adapted version:
+ -- This is an adapted version:
local list, size = build_list(head)
local baselevel, dirfound = get_baselevel(head,list,size,direction)
if not dirfound and trace_details then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-dub.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-dub.lua
index f27e4047660..f1bd38fcc5d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-dub.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-dub.lua
@@ -73,6 +73,7 @@ local setattrlist = nuts.setattrlist
local remove_node = nuts.remove
local insert_node_after = nuts.insert_after
local insert_node_before = nuts.insert_before
+local start_of_par = nuts.start_of_par
local nodepool = nuts.pool
local new_direction = nodepool.direction
@@ -397,7 +398,7 @@ end
local function get_baselevel(head,list,size,direction)
if direction == lefttoright_code or direction == righttoleft_code then
return direction, true
- elseif getid(head) == localpar_code and getsubtype(head) == 0 then
+ elseif getid(head) == localpar_code and start_of_par(head) then
direction = getdirection(head)
if direction == lefttoright_code or direction == righttoleft_code then
return direction, true
@@ -907,7 +908,7 @@ local function apply_to_list(list,size,head,pardir)
enddir = false
end
elseif begindir then
- if id == localpar_code and getsubtype(current) == 0 then
+ if id == localpar_code and start_of_par(current) then
-- localpar should always be the 1st node
local d = new_direction(begindir)
-- setprop(d,"directions",true)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-duc.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-duc.lua
index f91fc4d647d..d4c56e3008d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-duc.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-duc.lua
@@ -77,6 +77,7 @@ local properties = nodes.properties.data
local remove_node = nuts.remove
local insert_node_after = nuts.insert_after
local insert_node_before = nuts.insert_before
+local start_of_par = nuts.start_of_par
local nodepool = nuts.pool
local new_direction = nodepool.direction
@@ -412,7 +413,7 @@ end
local function get_baselevel(head,list,size,direction)
if direction == lefttoright_code or direction == righttoleft_code then
return direction, true
- elseif getid(head) == localpar_code and getsubtype(head) == 0 then
+ elseif getid(head) == localpar_code and start_of_par(head) then
direction = getdirection(head)
if direction == lefttoright_code or direction == righttoleft_code then
return direction, true
@@ -954,7 +955,7 @@ local function apply_to_list(list,size,head,pardir)
enddir = false
end
elseif begindir then
- if id == localpar_code and getsubtype(current) == 0 then
+ if id == localpar_code and start_of_par(current) then
-- localpar should always be the 1st node
head, current = insert_node_after(head,current,new_direction(begindir))
begindir = nil
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-fln.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-fln.lua
index 0489807327c..6cca9248049 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-fln.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-fln.lua
@@ -47,12 +47,16 @@ local getdisc = nuts.getdisc
local setdisc = nuts.setdisc
local setlink = nuts.setlink
local setfont = nuts.setfont
+local setglyphdata = nuts.setglyphdata
+local getprop = nuts.getprop
+local setprop = nuts.setprop
local nodecodes = nodes.nodecodes
local glyph_code = nodecodes.glyph
local disc_code = nodecodes.disc
local kern_code = nodecodes.kern
local glue_code = nodecodes.glue
+local localpar_code = nodecodes.localpar
local spaceskip_code = nodes.gluecodes.spaceskip
@@ -67,6 +71,7 @@ local insert_node_after = nuts.insert_after
local remove_node = nuts.remove
local getdimensions = nuts.dimensions
local hpack_node_list = nuts.hpack
+local start_of_par = nuts.start_of_par
local nodepool = nuts.pool
local newpenalty = nodepool.penalty
@@ -81,26 +86,23 @@ local a_color = attributes.private('color')
local a_transparency = attributes.private('transparency')
local a_colormodel = attributes.private('colormodel')
-local texsetattribute = tex.setattribute
-local unsetvalue = attributes.unsetvalue
+local texget = tex.get
local variables = interfaces.variables
local v_default = variables.default
local v_line = variables.line
local v_word = variables.word
------ is_letter = characters.is_letter
------ categories = characters.categories
-
-local settings = nil
-
-function firstlines.set(specification)
- settings = specification or { }
+local function set(par,specification)
enableaction("processors","typesetters.firstlines.handler")
if trace_firstlines then
report_firstlines("enabling firstlines")
end
- texsetattribute(a_firstline,1)
+ setprop(par,a_firstline,specification)
+end
+
+function firstlines.set(specification)
+ nuts.setparproperty(set,specification)
end
implement {
@@ -120,25 +122,24 @@ implement {
}
actions[v_line] = function(head,setting)
- -- local attribute = fonts.specifiers.contextnumber(setting.feature) -- was experimental
local dynamic = setting.dynamic
local font = setting.font
local noflines = setting.n or 1
local ma = setting.ma or 0
local ca = setting.ca
local ta = setting.ta
- local hangafter = tex.hangafter
- local hangindent = tex.hangindent
- local parindent = tex.parindent
+ local hangafter = texget("hangafter")
+ local hangindent = texget("hangindent")
+ local parindent = texget("parindent")
local nofchars = 0
local n = 0
local temp = copy_node_list(head)
local linebreaks = { }
- local function set(head)
+ set = function(head)
for g in nextglyph, head do
if dynamic > 0 then
- setattr(g,0,dynamic)
+ setglyphdata(g,dynamic)
end
setfont(g,font)
end
@@ -163,7 +164,7 @@ actions[v_line] = function(head,setting)
local list = temp
local prev = temp
for i=1,noflines do
- local hsize = tex.hsize - tex.leftskip.width - tex.rightskip.width
+ local hsize = texget("hsize") - texget("leftskip",false) - texget("rightskip",false)
if i == 1 then
hsize = hsize - parindent
end
@@ -234,7 +235,7 @@ actions[v_line] = function(head,setting)
local function update(start)
if dynamic > 0 then
- setattr(start,0,dynamic)
+ setglyphdata(start,dynamic)
end
setfont(start,font)
if ca and ca > 0 then
@@ -348,7 +349,7 @@ actions[v_word] = function(head,setting)
setattr(start,a_transparency,ta)
end
if dynamic > 0 then
- setattr(start,0,dynamic)
+ setglyphdata(start,dynamic)
end
setfont(start,font)
elseif id == disc_code then
@@ -369,29 +370,18 @@ end
actions[v_default] = actions[v_line]
function firstlines.handler(head)
- local start = head
- local attr = nil
- while start do
- attr = getattr(start,a_firstline)
- if attr then
- break
- elseif getid(start) == glyph_code then
- break
- else
- start = getnext(start)
- end
- end
- if attr then
- -- here as we can process nested boxes first so we need to keep state
- disableaction("processors","typesetters.firstlines.handler")
- -- texsetattribute(attribute,unsetvalue)
- local alternative = settings.alternative or v_default
- local action = actions[alternative] or actions[v_default]
- if action then
- if trace_firstlines then
- report_firstlines("processing firstlines, alternative %a",alternative)
+ if getid(head) == localpar_code and start_of_par(head) then
+ local settings = getprop(head,a_firstline)
+ if settings then
+ disableaction("processors","typesetters.firstlines.handler")
+ local alternative = settings.alternative or v_default
+ local action = actions[alternative] or actions[v_default]
+ if action then
+ if trace_firstlines then
+ report_firstlines("processing firstlines, alternative %a",alternative)
+ end
+ return action(head,settings)
end
- return action(head,settings)
end
end
return head
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-fln.mkiv b/Master/texmf-dist/tex/context/base/mkiv/typo-fln.mkiv
index 533c197cd10..6cca39f91c2 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-fln.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-fln.mkiv
@@ -86,9 +86,9 @@
ta \attribute\transparencyattribute
n \numexpr\firstlineparameter\c!n\relax
font \fontid\font
- dynamic \attribute\zerocount
+ dynamic \font_dynamic_value
\relax
- \kern\zeropoint % we need a node
+% \kern\zeropoint % we need a node
% \hskip\zeropoint\s!plus\emwidth\relax % can be an option
\endgroup
\glet\typo_firstline_handle\relax}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-inj.mkiv b/Master/texmf-dist/tex/context/base/mkiv/typo-inj.mkiv
index 3b77379b352..633d430e437 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-inj.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-inj.mkiv
@@ -73,8 +73,8 @@
\setuxvalue{typo_injectors_check_#1}{\noexpand\clf_checkinjector{#1}}}
\unexpanded\def\dotestinjector#1% only for testing outside unprotect
- {\csname typo_injectors_check_#1\endcsname
- \csname typo_injectors_mark_#1\endcsname}
+ {\begincsname typo_injectors_check_#1\endcsname
+ \begincsname typo_injectors_mark_#1\endcsname}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-itc.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-itc.lua
index 2683eecc3e1..64701abcc6c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-itc.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-itc.lua
@@ -383,6 +383,8 @@ local function texthandler(head)
postinserted = nil
postitalic = 0
updated = false
+ replacefont = nil
+ postfont = nil
pre, post, replace, pretail, posttail, replacetail = getdisc(current,true)
if replace then
local current = replacetail
@@ -390,29 +392,32 @@ local function texthandler(head)
local char, id = isglyph(current)
if char then
local font = id
- local data = italicsdata[font]
- if data then
- local attr = forcedvariant or getattr(current,a_italics)
- if attr and attr > 0 then
- local cd = data[char]
- if not cd then
- -- this really can happen
- replaceitalic = 0
- else
- replaceitalic = cd.italic
- if not replaceitalic then
- replaceitalic = setitalicinfont(font,char) -- calculated once
- -- replaceitalic = 0
- end
- if replaceitalic ~= 0 then
- lastfont = font
- lastattr = attr
- replacechar = char
- replacehead = replace
- updated = true
+ if font ~= lastfont then
+ local data = italicsdata[font]
+ if data then
+ local attr = forcedvariant or getattr(current,a_italics)
+ if attr and attr > 0 then
+ local cd = data[char]
+ if not cd then
+ -- this really can happen
+ replaceitalic = 0
+ else
+ replaceitalic = cd.italic
+ if not replaceitalic then
+ replaceitalic = setitalicinfont(font,char) -- calculated once
+ -- replaceitalic = 0
+ end
+ if replaceitalic ~= 0 then
+ lastfont = font
+ lastattr = attr
+ replacechar = char
+ replacehead = replace
+ updated = true
+ end
end
end
end
+ replacefont = font
end
break
else
@@ -426,29 +431,32 @@ local function texthandler(head)
local char, id = isglyph(current)
if char then
local font = id
- local data = italicsdata[font]
- if data then
- local attr = forcedvariant or getattr(current,a_italics)
- if attr and attr > 0 then
- local cd = data[char]
- if not cd then
- -- this really can happen
- -- postitalic = 0
- else
- postitalic = cd.italic
- if not postitalic then
- postitalic = setitalicinfont(font,char) -- calculated once
- -- postitalic = 0
- end
- if postitalic ~= 0 then
- lastfont = font
- lastattr = attr
- postchar = char
- posthead = post
- updated = true
+ if font ~= lastfont then
+ local data = italicsdata[font]
+ if data then
+ local attr = forcedvariant or getattr(current,a_italics)
+ if attr and attr > 0 then
+ local cd = data[char]
+ if not cd then
+ -- this really can happen
+ -- postitalic = 0
+ else
+ postitalic = cd.italic
+ if not postitalic then
+ postitalic = setitalicinfont(font,char) -- calculated once
+ -- postitalic = 0
+ end
+ if postitalic ~= 0 then
+ lastfont = font
+ lastattr = attr
+ postchar = char
+ posthead = post
+ updated = true
+ end
end
end
end
+ postfont = font
end
break
else
@@ -456,6 +464,9 @@ local function texthandler(head)
end
end
end
+ if replacefont or postfont then
+ lastfont = replacefont or postfont
+ end
if updated then
setdisc(current,pre,post,replace)
end
@@ -520,7 +531,7 @@ local function texthandler(head)
else
if replaceitalic ~= 0 then
if trace_italics then
- report_italics("inserting %p between %s italic %C and whatever",replaceritalic,"replace",replacechar)
+ report_italics("inserting %p between %s italic %C and whatever",replaceitalic,"replace",replacechar)
end
insert_node_after(replacehead,replace,correction_kern(replaceitalic,current))
previnserted = nil
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-krn.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-krn.lua
index c26004a49df..f4f1215e1c4 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-krn.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-krn.lua
@@ -40,8 +40,9 @@ local getchar = nuts.getchar
local getdisc = nuts.getdisc
local getglue = nuts.getglue
local getkern = nuts.getkern
+local getglyphdata = nuts.getglyphdata
+
local isglyph = nuts.isglyph
-local setchar = nuts.setchar
local setfield = nuts.setfield
local getattr = nuts.getattr
@@ -51,12 +52,12 @@ local setlink = nuts.setlink
local setdisc = nuts.setdisc
local setglue = nuts.setglue
local setkern = nuts.setkern
+local setchar = nuts.setchar
+local setglue = nuts.setglue -- todo
local texsetattribute = tex.setattribute
local unsetvalue = attributes.unsetvalue
-local setglue = nuts.setglue -- todo
-
local new_kern = nodepool.kern
local new_glue = nodepool.glue
@@ -109,8 +110,8 @@ local kerns = typesetters.kerns or { }
typesetters.kerns = kerns
local report = logs.reporter("kerns")
-local trace_ligatures = false trackers.register("typesetters.kerns.ligatures", function(v) trace_ligatures = v end)
-local trace_ligatures_d = false trackers.register("typesetters.kerns.ligatures.detail",function(v) trace_ligatures_d = v end)
+local trace_ligatures = false trackers.register("typesetters.kerns.ligatures", function(v) trace_ligatures = v end)
+local trace_ligatures_d = false trackers.register("typesetters.kerns.ligatures.details", function(v) trace_ligatures_d = v end)
kerns.mapping = kerns.mapping or { }
kerns.factors = kerns.factors or { }
@@ -139,7 +140,7 @@ local gluefactor = 4 -- assumes quad = .5 enspace
function kerns.keepligature(n) -- might become default
local f = getfont(n)
- local a = getattr(n,0) or 0
+ local a = getglyphdata(n) or 0
if trace_ligatures then
local c = getchar(n)
local d = fontdescriptions[f][c].name
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-lin.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-lin.lua
index 8393ea65b34..15e543c52e5 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-lin.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-lin.lua
@@ -129,6 +129,8 @@ local noflines = 0
-- This is the third version, a mix between immediate (prestice lines) and delayed
-- as we don't want anchors that are not used.
+-- I will make a better variant once lmtx is stable i.e. less clutter.
+
local function finalize(prop,key) -- delayed calculations
local line = prop.line
local hsize = prop.hsize
@@ -410,14 +412,13 @@ end
local latelua = nodepool.latelua
local setposition = jobpositions.setspec
-local t_anchor = { x = true, c = true } -- needs checking
local function setanchor(h_anchor)
return latelua {
action = setposition,
name = "md:h",
index = h_anchor,
- value = t_anchor, -- really shared ?
+ value = { x = true, c = true },
}
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-mar.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-mar.lua
index ce8375eeaf7..7e69162a900 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-mar.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-mar.lua
@@ -59,8 +59,6 @@ local v_paragraph = variables.paragraph
local v_line = variables.line
local nuts = nodes.nuts
-local nodepool = nuts.pool
-
local tonode = nuts.tonode
local hpack_nodes = nuts.hpack
@@ -82,7 +80,6 @@ local setshift = nuts.setshift
local getwidth = nuts.getwidth
local setwidth = nuts.setwidth
local getheight = nuts.getheight
-local getprop = nuts.getprop
local setattrlist = nuts.setattrlist
@@ -103,9 +100,8 @@ local userdefined_code = whatsitcodes.userdefined
local nodepool = nuts.pool
-local new_usernode = nodepool.usernode
local new_hlist = nodepool.hlist
-
+local new_usernode = nodepool.usernode
local latelua = nodepool.latelua
local texgetdimen = tex.getdimen
@@ -459,7 +455,8 @@ local function sa(specification) -- maybe l/r keys ipv left/right keys
end
p.p = true
p.y = true
- setposition('md:v',tag,p)
+ -- maybe settobesaved first
+ setposition("md:v",tag,p)
cache[tag] = nil -- do this later, per page a cleanup
end
end
@@ -592,7 +589,7 @@ local function inject(parent,head,candidate)
elseif previous == current then
firstonstack = false
elseif ap and ac and ap.p == ac.p then
- local distance = ap.y - ac.y
+ local distance = (ap.y or 0) - (ac.y or 0)
if trace_margindata then
report_margindata("distance %p",distance)
end
@@ -683,7 +680,7 @@ local function inject(parent,head,candidate)
setwidth(box,0) -- not needed when wrapped
--
if isstacked then
- setlink(box,addtoanchor(v_anchor,nofinjected))
+ setlink(box,addtoanchor(v_anchors,nofinjected))
box = new_hlist(box)
-- set height / depth ?
end
@@ -736,7 +733,7 @@ local function flushinline(parent,head)
-- for now we also check for inline+yes/continue, maybe someday no such check
-- will happen; we can assume most inlines are one line heigh; also this
-- together feature can become optional
- registertogether(tonode(parent),room) -- !! tonode
+ registertogether(parent,room)
end
end
end
@@ -771,7 +768,7 @@ local function flushed(scope,parent) -- current is hlist
continue = continue or con
nofstored = nofstored - 1
if room then
- registertogether(tonode(parent),room) -- !! tonode
+ registertogether(parent,room)
end
else
break
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-ovl.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-ovl.lua
index 09cf5e12955..25b1a0178f1 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-ovl.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-ovl.lua
@@ -12,7 +12,7 @@ if not modules then modules = { } end modules ['typo-ovl'] = {
-- we have hardly any private code. For convenience I hooked it into the existing
-- replacement module (as it used the same code anyway). I did some cleanup.
-local next = next
+local next, type = next, type
local context = context
@@ -34,6 +34,8 @@ local setattrlist = nuts.setattrlist
local getfield = nuts.getfield
local setfont = nuts.setfont
+local nextnode = nuts.traversers.node
+
local unsetvalue = attributes.unsetvalue
local prvattribute = attributes.private
@@ -90,9 +92,9 @@ end
attributes.tooverloads = tooverloads
function attributes.applyoverloads(specification,start,stop)
- local current = tonut(start)
+ local start = tonut(start)
local processor = specification.processor
- local overloads = specification.processor or getattr(current,a_overloads)
+ local overloads = specification.processor or getattr(start,a_overloads)
if overloads and overloads ~= unsetvalue then
overloads = t_overloads[overloads]
if not overloads then
@@ -107,14 +109,18 @@ function attributes.applyoverloads(specification,start,stop)
local newlist = nil
local newfont = overloads.font
- local function apply()
+ local function apply(current)
local a = getattrlist(current)
if a == oldlist then
setattrlist(current,newlist)
else
oldlist = getattrlist(current)
for k, v in next, overloads do
- setattr(current,k,v)
+ if type(v) == "number" then
+ setattr(current,k,v)
+ else
+ -- can be: ["font"] = number
+ end
end
newlist = current -- getattrlist(current)
end
@@ -123,12 +129,11 @@ function attributes.applyoverloads(specification,start,stop)
end
end
- while current do
- local id = getid(current)
+ for current, id in nextnode, start do
if id == glyph_code then
- apply()
+ apply(current)
elseif id == disc_code then
- apply()
+ apply(current)
if pre then
while pre do
if getid(pre) == glyph_code then
@@ -157,7 +162,6 @@ function attributes.applyoverloads(specification,start,stop)
if current == last then
break
end
- current = getnext(current)
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-pag.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-pag.lua
index 05513e20c39..ea4b1574caf 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-pag.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-pag.lua
@@ -108,93 +108,94 @@ function parbuilders.registertogether(line,specification) -- might change
end
end
-local function keeptogether(start,a)
- if start then
- local specification = cache[a]
- if a then
- local current = getnext(start)
- local previous = start
- local total = getdepth(previous)
- local slack = specification.slack
- local threshold = specification.depth - slack
+local function keeptogether(start,a,specification)
+ local current = getnext(start)
+ local previous = start
+ local total = getdepth(previous)
+ local slack = specification.slack
+ local threshold = specification.depth - slack
+ if trace_keeptogether then
+ report_keeptogether("%s, index %s, total %p, threshold %p, slack %p","list",a,total,threshold,slack)
+ end
+ while current do
+ local id = getid(current)
+ if id == vlist_code or id == hlist_code then
+ local wd, ht, dp = getwhd(current)
+ total = total + ht + dp
+ if trace_keeptogether then
+ report_keeptogether("%s, index %s, total %p, threshold %p","list",a,total,threshold)
+ end
+ if total <= threshold then
+ if getid(previous) == penalty_code then
+ setpenalty(previous,10000)
+ else
+ insert_node_after(head,previous,new_penalty(10000))
+ end
+ else
+ break
+ end
+ elseif id == glue_code then
+ -- hm, breakpoint, maybe turn this into kern
+ total = total + getwidth(current)
if trace_keeptogether then
- report_keeptogether("%s, index %s, total %p, threshold %p, slack %p","list",a,total,threshold,slack)
+ report_keeptogether("%s, index %s, total %p, threshold %p","glue",a,total,threshold)
end
- while current do
- local id = getid(current)
- if id == vlist_code or id == hlist_code then
- local wd, ht, dp = getwhd(current)
- total = total + ht + dp
- if trace_keeptogether then
- report_keeptogether("%s, index %s, total %p, threshold %p","list",a,total,threshold)
- end
- if total <= threshold then
- if getid(previous) == penalty_code then
- setpenalty(previous,10000)
- else
- insert_node_after(head,previous,new_penalty(10000))
- end
- else
- break
- end
- elseif id == glue_code then
- -- hm, breakpoint, maybe turn this into kern
- total = total + getwidth(current)
- if trace_keeptogether then
- report_keeptogether("%s, index %s, total %p, threshold %p","glue",a,total,threshold)
- end
- if total <= threshold then
- if getid(previous) == penalty_code then
- setpenalty(previous,10000)
- else
- insert_node_after(head,previous,new_penalty(10000))
- end
- else
- break
- end
- elseif id == kern_code then
- total = total + getkern(current)
- if trace_keeptogether then
- report_keeptogether("%s, index %s, total %s, threshold %s","kern",a,total,threshold)
- end
- if total <= threshold then
- if getid(previous) == penalty_code then
- setpenalty(previous,10000)
- else
- insert_node_after(head,previous,new_penalty(10000))
- end
- else
- break
- end
- elseif id == penalty_code then
- if total <= threshold then
- if getid(previous) == penalty_code then
- setpenalty(previous,10000)
- end
- setpenalty(current,10000)
- else
- break
- end
+ if total <= threshold then
+ if getid(previous) == penalty_code then
+ setpenalty(previous,10000)
+ else
+ insert_node_after(head,previous,new_penalty(10000))
end
- previous = current
- current = getnext(current)
+ else
+ break
+ end
+ elseif id == kern_code then
+ total = total + getkern(current)
+ if trace_keeptogether then
+ report_keeptogether("%s, index %s, total %s, threshold %s","kern",a,total,threshold)
+ end
+ if total <= threshold then
+ if getid(previous) == penalty_code then
+ setpenalty(previous,10000)
+ else
+ insert_node_after(head,previous,new_penalty(10000))
+ end
+ else
+ break
+ end
+ elseif id == penalty_code then
+ if total <= threshold then
+ if getid(previous) == penalty_code then
+ setpenalty(previous,10000)
+ end
+ setpenalty(current,10000)
+ else
+ break
end
end
+ previous = current
+ current = getnext(current)
end
end
-- also look at first non glue/kern node e.g for a dropped caps
function parbuilders.keeptogether(head)
- local done = false
+ local done = false -- can go
local current = head
while current do
if getid(current) == hlist_code then
local a = takeattr(current,a_keeptogether)
if a and a > 0 then
- keeptogether(current,a)
- cache[a] = nil
- done = true
+ local specification = cache[a]
+ if specification then
+ keeptogether(current,a,specification)
+ -- this is tricky ... we need a better resetter, maybe some
+ -- injected latelua or a gc method on a property (interesting
+ -- experiment)
+ cache[a] = nil
+ done = true
+ end
end
end
current = getnext(current)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-par.mkiv b/Master/texmf-dist/tex/context/base/mkiv/typo-par.mkiv
index 066dc6a6973..fae07b235c9 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-par.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-par.mkiv
@@ -23,7 +23,8 @@
\unprotect
-\registerctxluafile{node-ltp}{optimize}
+% \registerctxluafile{node-ltp}{optimize}
+\registerctxluafile{node-ltp}{}
\registerctxluafile{trac-par}{}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-scr.mkiv b/Master/texmf-dist/tex/context/base/mkiv/typo-scr.mkiv
index 0dfd111ae33..f2b4b0d041d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-scr.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-scr.mkiv
@@ -138,18 +138,21 @@
{\dontleavehmode
\runninghbox\bgroup
\edef\currentlowhigh{#1}%
- \dosingleempty} % #2
+ \dosingleempty} % #2
\unexpanded\def\typo_scripts_lowhigh_indeed[#1]#2#3% todo: align .. [#1] is compatible hack
{\dostarttagged\t!subsup\currentlowhigh
+ \scratchdimen\lowhighparameter\c!distance\relax
\setbox\plusfour\hpack{\typo_scripts_lowhigh_low_high\lower\c!down\t!sub{#2}}%
\setbox\plussix \hpack{\typo_scripts_lowhigh_low_high\raise\c!up \t!sup{#3}}%
- \doif{#1}{\v!left}
- {\ifdim\wd\plusfour<\wd\plussix
- \setbox\plusfour\hpack to \wd\plussix {\hss\box\plusfour}%
- \else
- \setbox\plussix \hpack to \wd\plusfour{\hss\box\plussix }%
- \fi}%
+ \edef\p_align{#1}%
+ \ifx\p_align\v!left
+ \ifdim\wd\plusfour<\wd\plussix
+ \setbox\plusfour\hpack to \wd\plussix {\hss\box\plusfour}%
+ \else
+ \setbox\plussix \hpack to \wd\plusfour{\hss\box\plussix }%
+ \fi
+ \fi
\ifdim\wd\plusfour<\wd\plussix
\wd\plusfour\zeropoint
\box\plusfour
@@ -163,9 +166,7 @@
\egroup}
\def\typo_scripts_lowhigh_low_high#1#2#3#4%
- {\dontleavehmode
- \begingroup
- \kern\lowhighparameter\c!distance\relax
+ {\kern\scratchdimen
\setbox\scratchbox\hpack\bgroup
#1\lowhighparameter#2\hbox\bgroup
\ifx\fontsize\empty
@@ -184,8 +185,7 @@
\egroup
\ht\scratchbox\strutht
\dp\scratchbox\strutdp
- \box\scratchbox
- \endgroup}
+ \box\scratchbox}
\unexpanded\def\typo_scripts_highlow_indeed[#1]#2#3%
{\typo_scripts_lowhigh_indeed[#1]{#3}{#2}}
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-sus.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-sus.lua
index 6c02b929167..bb5b03912ce 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-sus.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-sus.lua
@@ -72,6 +72,7 @@ local a_characters = attributes.private("characters")
local a_suspecting = attributes.private('suspecting')
local a_suspect = attributes.private('suspect')
local texsetattribute = tex.setattribute
+local unsetvalue = attributes.unsetvalue
local enabled = false
local enableaction = nodes.tasks.enableaction
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-tal.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-tal.lua
index 8cf29832971..ff10fb12103 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-tal.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-tal.lua
@@ -205,6 +205,24 @@ function characteralign.handler(head,where)
local method = dataset.method
-- we can think of constraints
if method == v_number then
+
+ local function bothdigit(current) -- this could become a helper
+ local prev, next = getboth(current)
+ if next and prev and getid(next) == glyph_code and getid(prev) == glyph_code then
+ local pchar = getchar(prev)
+ local nchar = getchar(next)
+ local pdata = fontcharacters[getfont(prev)][pchar]
+ local ndata = fontcharacters[getfont(next)][nchar]
+ local punicode = pdata and pdata.unicode or pchar -- we ignore tables
+ local nunicode = ndata and ndata.unicode or nchar -- we ignore tables
+ if punicode and nunicode and categories[punicode] == "nd" and categories[nunicode] == "nd" then
+ return true
+ else
+ return false
+ end
+ end
+ end
+
while current do
local char, id = isglyph(current)
if char then
@@ -266,10 +284,9 @@ function characteralign.handler(head,where)
elseif (b_start or a_start) and id == glue_code then
-- maybe only in number mode
-- somewhat inefficient
- local prev, next = getboth(current)
- if next and prev and getid(next) == glyph_code and getid(prev) == glyph_code then -- too much checking
+ if bothdigit(current) then
local width = fontcharacters[getfont(b_start or a_start)][separator or period].width
- setglue(current,width)
+ setglue(current,width,0,0)
setattr(current,a_character,punctuationspace)
if a_start then
a_stop = current
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-tal.mkiv b/Master/texmf-dist/tex/context/base/mkiv/typo-tal.mkiv
index 7170578d17d..33e071e7537 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-tal.mkiv
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-tal.mkiv
@@ -269,4 +269,38 @@
\typo_charalign_adapt_font_indeed
\fi}
+%D Another example:
+%D
+%D \starttyping
+%D \setupTABLE[c][2][alignmentcharacter={number->,},aligncharacter=yes,align={flushleft}]
+%D \bTABLE
+%D \bTR \bTD 1 \eTD \bTD 125 cm \eTD \eTR
+%D \bTR \bTD 2 \eTD \bTD 1 125,80 cm \eTD \eTR
+%D \bTR \bTD 6 \eTD \bTD 1 125,80 $\pi^2$ \eTD \eTR
+%D \bTR \bTD 7 \eTD \bTD 129,3 \unit{square centimeter} \eTD \eTR
+%D \eTABLE
+%D
+%D \setupTABLE[c][2][alignmentcharacter={number->,},aligncharacter=yes,align={flushleft}]
+%D \bTABLE
+%D \bTR \bTD 1 \eTD \bTD 125 cm \eTD \eTR
+%D \bTR \bTD 2 \eTD \bTD 1 125,80 cm \eTD \eTR
+%D \bTR \bTD 6 \eTD \bTD 1 125,80 $\pi^2$ \eTD \eTR
+%D \bTR \bTD 7 \eTD \bTD 129,3 \unit{square centimeter} \eTD \eTR
+%D \eTABLE
+%D
+%D \setupTABLE[c][2][alignmentcharacter={number->,},aligncharacter=yes,align={middle}]
+%D \bTABLE
+%D \bTR \bTD 1 \eTD \bTD 125 \eTD \eTR
+%D \bTR \bTD 6 \eTD \bTD 1 125,80 \eTD \eTR
+%D \bTR \bTD 7 \eTD \bTD 129,3 \eTD \eTR
+%D \eTABLE
+%D
+%D \setupTABLE[c][2][alignmentcharacter={text->,},aligncharacter=yes,align={middle}]
+%D \bTABLE
+%D \bTR \bTD 1 \eTD \bTD 125 \eTD \eTR
+%D \bTR \bTD 6 \eTD \bTD 1 125,80 \eTD \eTR
+%D \bTR \bTD 7 \eTD \bTD 129,3 \eTD \eTR
+%D \eTABLE
+%D \stoptyping
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mkiv/typo-wrp.lua b/Master/texmf-dist/tex/context/base/mkiv/typo-wrp.lua
index 9fb5441526c..f2ca43b56ef 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/typo-wrp.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/typo-wrp.lua
@@ -32,7 +32,7 @@ local getprev = nuts.getprev
local getid = nuts.getid
local getsubtype = nuts.getsubtype
local getpenalty = nuts.getpenalty
-local remove = nuts.remove
+local remove_node = nuts.remove
local enableaction = nodes.tasks.enableaction
@@ -66,7 +66,7 @@ local function remove_dangling_crlf(head,tail)
if trace_wrappers then
report("removing a probably unwanted end-of-par break in line %s (guess)",tex.inputlineno)
end
- remove(head,tail,true)
+ remove_node(head,tail,true)
return head, tail
end
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-deb.lua b/Master/texmf-dist/tex/context/base/mkiv/util-deb.lua
index 6932e8804d3..bd94b6d01ed 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-deb.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-deb.lua
@@ -30,7 +30,15 @@ local names = { }
local initialize = false
-if not (FFISUPPORTED and ffi) then
+if lua.getpreciseticks then
+
+ initialize = function()
+ ticks = lua.getpreciseticks
+ seconds = lua.getpreciseseconds
+ initialize = false
+ end
+
+elseif not (FFISUPPORTED and ffi) then
-- we have no precise timer
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-dim.lua b/Master/texmf-dist/tex/context/base/mkiv/util-dim.lua
index fd9351a28fb..76b5fd20bb3 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-dim.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-dim.lua
@@ -397,18 +397,22 @@ function dimen(a)
end
function string.todimen(str) -- maybe use tex.sp when available
- if type(str) == "number" then
+ local t = type(str)
+ if t == "number" then
return str
else
local k = known[str]
if not k then
- local value, unit = lpegmatch(dimenpair,str)
- if value and unit then
- k = value/unit -- to be considered: round
+ if t == "string" then
+ local value, unit = lpegmatch(dimenpair,str)
+ if value and unit then
+ k = value/unit -- to be considered: round
+ else
+ k = 0
+ end
else
k = 0
end
- -- print(str,value,unit)
known[str] = k
end
return k
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-jsn.lua b/Master/texmf-dist/tex/context/base/mkiv/util-jsn.lua
index acbf160904d..8da35189793 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-jsn.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-jsn.lua
@@ -20,155 +20,412 @@ if not modules then modules = { } end modules ['util-jsn'] = {
local P, V, R, S, C, Cc, Cs, Ct, Cf, Cg = lpeg.P, lpeg.V, lpeg.R, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cf, lpeg.Cg
local lpegmatch = lpeg.match
local format, gsub = string.format, string.gsub
+local formatters = string.formatters
local utfchar = utf.char
-local concat = table.concat
+local concat, sortedkeys = table.concat, table.sortedkeys
local tonumber, tostring, rawset, type, next = tonumber, tostring, rawset, type, next
local json = utilities.json or { }
utilities.json = json
--- \\ \/ \b \f \n \r \t \uHHHH
-
-local lbrace = P("{")
-local rbrace = P("}")
-local lparent = P("[")
-local rparent = P("]")
-local comma = P(",")
-local colon = P(":")
-local dquote = P('"')
-
-local whitespace = lpeg.patterns.whitespace
-local optionalws = whitespace^0
-
-local escapes = {
- ["b"] = "\010",
- ["f"] = "\014",
- ["n"] = "\n",
- ["r"] = "\r",
- ["t"] = "\t",
-}
+do
--- todo: also handle larger utf16
+ -- \\ \/ \b \f \n \r \t \uHHHH
-local escape_un = P("\\u")/"" * (C(R("09","AF","af")^-4) / function(s)
- return utfchar(tonumber(s,16))
-end)
+ local lbrace = P("{")
+ local rbrace = P("}")
+ local lparent = P("[")
+ local rparent = P("]")
+ local comma = P(",")
+ local colon = P(":")
+ local dquote = P('"')
-local escape_bs = P([[\]]) / "" * (P(1) / escapes) -- if not found then P(1) is returned i.e. the to be escaped char
+ local whitespace = lpeg.patterns.whitespace
+ local optionalws = whitespace^0
-local jstring = dquote * Cs((escape_un + escape_bs + (1-dquote))^0) * dquote
-local jtrue = P("true") * Cc(true)
-local jfalse = P("false") * Cc(false)
-local jnull = P("null") * Cc(nil)
-local jnumber = (1-whitespace-rparent-rbrace-comma)^1 / tonumber
+ local escapes = {
+ ["b"] = "\010",
+ ["f"] = "\014",
+ ["n"] = "\n",
+ ["r"] = "\r",
+ ["t"] = "\t",
+ }
-local key = jstring
+ -- todo: also handle larger utf16
-local jsonconverter = { "value",
- hash = lbrace * Cf(Ct("") * (V("pair") * (comma * V("pair"))^0 + optionalws),rawset) * rbrace,
- pair = Cg(optionalws * key * optionalws * colon * V("value")),
- array = Ct(lparent * (V("value") * (comma * V("value"))^0 + optionalws) * rparent),
--- value = optionalws * (jstring + V("hash") + V("array") + jtrue + jfalse + jnull + jnumber + #rparent) * optionalws,
- value = optionalws * (jstring + V("hash") + V("array") + jtrue + jfalse + jnull + jnumber) * optionalws,
-}
+ local escape_un = P("\\u")/"" * (C(R("09","AF","af")^-4) / function(s)
+ return utfchar(tonumber(s,16))
+ end)
+
+ local escape_bs = P([[\]]) / "" * (P(1) / escapes) -- if not found then P(1) is returned i.e. the to be escaped char
+
+ local jstring = dquote * Cs((escape_un + escape_bs + (1-dquote))^0) * dquote
+ local jtrue = P("true") * Cc(true)
+ local jfalse = P("false") * Cc(false)
+ local jnull = P("null") * Cc(nil)
+ local jnumber = (1-whitespace-rparent-rbrace-comma)^1 / tonumber
+
+ local key = jstring
+
+ local jsonconverter = { "value",
+ hash = lbrace * Cf(Ct("") * (V("pair") * (comma * V("pair"))^0 + optionalws),rawset) * rbrace,
+ pair = Cg(optionalws * key * optionalws * colon * V("value")),
+ array = Ct(lparent * (V("value") * (comma * V("value"))^0 + optionalws) * rparent),
+ -- value = optionalws * (jstring + V("hash") + V("array") + jtrue + jfalse + jnull + jnumber + #rparent) * optionalws,
+ value = optionalws * (jstring + V("hash") + V("array") + jtrue + jfalse + jnull + jnumber) * optionalws,
+ }
+
+ -- local jsonconverter = { "value",
+ -- hash = lbrace * Cf(Ct("") * (V("pair") * (comma * V("pair"))^0 + optionalws),rawset) * rbrace,
+ -- pair = Cg(optionalws * V("string") * optionalws * colon * V("value")),
+ -- array = Ct(lparent * (V("value") * (comma * V("value"))^0 + optionalws) * rparent),
+ -- string = jstring,
+ -- value = optionalws * (V("string") + V("hash") + V("array") + jtrue + jfalse + jnull + jnumber) * optionalws,
+ -- }
+
+ -- lpeg.print(jsonconverter) -- size 181
--- local jsonconverter = { "value",
--- hash = lbrace * Cf(Ct("") * (V("pair") * (comma * V("pair"))^0 + optionalws),rawset) * rbrace,
--- pair = Cg(optionalws * V("string") * optionalws * colon * V("value")),
--- array = Ct(lparent * (V("value") * (comma * V("value"))^0 + optionalws) * rparent),
--- string = jstring,
--- value = optionalws * (V("string") + V("hash") + V("array") + jtrue + jfalse + jnull + jnumber) * optionalws,
--- }
+ function json.tolua(str)
+ return lpegmatch(jsonconverter,str)
+ end
--- lpeg.print(jsonconverter) -- size 181
+ function json.load(filename)
+ local data = io.loaddata(filename)
+ if data then
+ return lpegmatch(jsonconverter,data)
+ end
+ end
-function json.tolua(str)
- return lpegmatch(jsonconverter,str)
end
-local escaper
+do
-local function tojson(value,t,n) -- we could optimize #t
- local kind = type(value)
- if kind == "table" then
- local done = false
- local size = #value
- if size == 0 then
- for k, v in next, value do
- if done then
- n = n + 1 ; t[n] = ","
+ -- It's pretty bad that JSON doesn't allow the trailing comma ... it's a
+ -- typical example of a spec that then forces all generators to check for
+ -- this. It's a way to make sure programmers keep jobs.
+
+ local escaper
+
+ local f_start_hash = formatters[ '%w{' ]
+ local f_start_array = formatters[ '%w[' ]
+ local f_start_hash_new = formatters[ "\n" .. '%w{' ]
+ local f_start_array_new = formatters[ "\n" .. '%w[' ]
+ local f_start_hash_key = formatters[ "\n" .. '%w"%s" : {' ]
+ local f_start_array_key = formatters[ "\n" .. '%w"%s" : [' ]
+
+ local f_stop_hash = formatters[ "\n" .. '%w}' ]
+ local f_stop_array = formatters[ "\n" .. '%w]' ]
+
+ local f_key_val_seq = formatters[ "\n" .. '%w"%s" : %s' ]
+ local f_key_val_str = formatters[ "\n" .. '%w"%s" : "%s"' ]
+ local f_key_val_num = f_key_val_seq
+ local f_key_val_yes = formatters[ "\n" .. '%w"%s" : true' ]
+ local f_key_val_nop = formatters[ "\n" .. '%w"%s" : false' ]
+ local f_key_val_null = formatters[ "\n" .. '%w"%s" : null' ]
+
+ local f_val_num = formatters[ "\n" .. '%w%s' ]
+ local f_val_str = formatters[ "\n" .. '%w"%s"' ]
+ local f_val_yes = formatters[ "\n" .. '%wtrue' ]
+ local f_val_nop = formatters[ "\n" .. '%wfalse' ]
+ local f_val_null = formatters[ "\n" .. '%wnull' ]
+ local f_val_empty = formatters[ "\n" .. '%w{ }' ]
+ local f_val_seq = f_val_num
+
+ -- no empty tables because unknown if table or hash
+
+ local t = { }
+ local n = 0
+
+ local function is_simple_table(tt) -- also used in util-tab so maybe public
+ local l = #tt
+ if l > 0 then
+ for i=1,l do
+ if type(tt[i]) == "table" then
+ return false
+ end
+ end
+ local nn = n
+ n = n + 1 t[n] = "[ "
+ for i=1,l do
+ if i > 1 then
+ n = n + 1 t[n] = ", "
+ end
+ local v = tt[i]
+ local tv = type(v)
+ if tv == "number" then
+ n = n + 1 t[n] = v
+ elseif tv == "string" then
+ n = n + 1 t[n] = '"'
+ n = n + 1 t[n] = lpegmatch(escaper,v) or v
+ n = n + 1 t[n] = '"'
+ elseif tv == "boolean" then
+ n = n + 1 t[n] = v and "true" or "false"
+ elseif v then
+ n = n + 1 t[n] = tostring(v)
+ else
+ n = n + 1 t[n] = "null"
+ end
+ end
+ n = n + 1 t[n] = " ]"
+ local s = concat(t,"",nn+1,n)
+ n = nn
+ return s
+ end
+ return false
+ end
+
+ local function tojsonpp(root,name,depth,level,size)
+ if root then
+ local indexed = size > 0
+ n = n + 1
+ if level == 0 then
+ if indexed then
+ t[n] = f_start_array(depth)
+ else
+ t[n] = f_start_hash(depth)
+ end
+ elseif name then
+ if tn == "string" then
+ name = lpegmatch(escaper,name) or name
+ elseif tn ~= "number" then
+ name = tostring(name)
+ end
+ if indexed then
+ t[n] = f_start_array_key(depth,name)
+ else
+ t[n] = f_start_hash_key(depth,name)
+ end
+ else
+ if indexed then
+ t[n] = f_start_array_new(depth)
else
- n = n + 1 ; t[n] = "{"
- done = true
+ t[n] = f_start_hash_new(depth)
end
- n = n + 1 ; t[n] = format("%q:",k)
- t, n = tojson(v,t,n)
end
- if done then
- n = n + 1 ; t[n] = "}"
+ depth = depth + 1
+ if indexed then -- indexed
+ for i=1,size do
+ if i > 1 then
+ n = n + 1 t[n] = ","
+ end
+ local v = root[i]
+ local tv = type(v)
+ if tv == "number" then
+ n = n + 1 t[n] = f_val_num(depth,v)
+ elseif tv == "string" then
+ v = lpegmatch(escaper,v) or v
+ n = n + 1 t[n] = f_val_str(depth,v)
+ elseif tv == "table" then
+ if next(v) then
+ local st = is_simple_table(v)
+ if st then
+ n = n + 1 t[n] = f_val_seq(depth,st)
+ else
+ tojsonpp(v,nil,depth,level+1,#v)
+ end
+ else
+ n = n + 1
+ t[n] = f_val_empty(depth)
+ end
+ elseif tv == "boolean" then
+ n = n + 1
+ if v then
+ t[n] = f_val_yes(depth,v)
+ else
+ t[n] = f_val_nop(depth,v)
+ end
+ else
+ n = n + 1
+ t[n] = f_val_null(depth)
+ end
+ end
+ elseif next(root) then
+ local sk = sortedkeys(root)
+ for i=1,#sk do
+ if i > 1 then
+ n = n + 1 t[n] = ","
+ end
+ local k = sk[i]
+ local v = root[k]
+ local tv = type(v)
+ local tk = type(k)
+ if tv == "number" then
+ if tk == "number" then
+ n = n + 1 t[n] = f_key_val_num(depth,k,v)
+ elseif tk == "string" then
+ k = lpegmatch(escaper,k) or k
+ n = n + 1 t[n] = f_key_val_num(depth,k,v)
+ end
+ elseif tv == "string" then
+ if tk == "number" then
+ v = lpegmatch(escaper,v) or v
+ n = n + 1 t[n] = f_key_val_str(depth,k,v)
+ elseif tk == "string" then
+ k = lpegmatch(escaper,k) or k
+ v = lpegmatch(escaper,v) or v
+ n = n + 1 t[n] = f_key_val_str(depth,k,v)
+ end
+ elseif tv == "table" then
+ local l = #v
+ if l > 0 then
+ local st = is_simple_table(v)
+ if not st then
+ tojsonpp(v,k,depth,level+1,l)
+ elseif tk == "number" then
+ n = n + 1 t[n] = f_key_val_seq(depth,k,st)
+ elseif tk == "string" then
+ k = lpegmatch(escaper,k) or k
+ n = n + 1 t[n] = f_key_val_seq(depth,k,st)
+ end
+ elseif next(v) then
+ tojsonpp(v,k,depth,level+1,0)
+ end
+ elseif tv == "boolean" then
+ if tk == "number" then
+ n = n + 1
+ if v then
+ t[n] = f_key_val_yes(depth,k)
+ else
+ t[n] = f_key_val_nop(depth,k)
+ end
+ elseif tk == "string" then
+ k = lpegmatch(escaper,k) or k
+ n = n + 1
+ if v then
+ t[n] = f_key_val_yes(depth,k)
+ else
+ t[n] = f_key_val_nop(depth,k)
+ end
+ end
+ else
+ if tk == "number" then
+ n = n + 1
+ t[n] = f_key_val_null(depth,k)
+ elseif tk == "string" then
+ k = lpegmatch(escaper,k) or k
+ n = n + 1
+ t[n] = f_key_val_null(depth,k)
+ end
+ end
+ end
+ end
+ n = n + 1
+ if indexed then
+ t[n] = f_stop_array(depth-1)
else
- n = n + 1 ; t[n] = "{}"
+ t[n] = f_stop_hash(depth-1)
end
- elseif size == 1 then
- -- we can optimize for non tables
- n = n + 1 ; t[n] = "["
- t, n = tojson(value[1],t,n)
- n = n + 1 ; t[n] = "]"
- else
- for i=1,size do
+ end
+ end
+
+ local function tojson(value,n)
+ local kind = type(value)
+ if kind == "table" then
+ local done = false
+ local size = #value
+ if size == 0 then
+ for k, v in next, value do
+ if done then
+ -- n = n + 1 ; t[n] = ","
+ n = n + 1 ; t[n] = ',"'
+ else
+ -- n = n + 1 ; t[n] = "{"
+ n = n + 1 ; t[n] = '{"'
+ done = true
+ end
+ n = n + 1 ; t[n] = lpegmatch(escaper,k) or k
+ n = n + 1 ; t[n] = '":'
+ t, n = tojson(v,n)
+ end
if done then
- n = n + 1 ; t[n] = ","
+ n = n + 1 ; t[n] = "}"
else
- n = n + 1 ; t[n] = "["
- done = true
+ n = n + 1 ; t[n] = "{}"
end
- t, n = tojson(value[i],t,n)
+ elseif size == 1 then
+ -- we can optimize for non tables
+ n = n + 1 ; t[n] = "["
+ t, n = tojson(value[1],n)
+ n = n + 1 ; t[n] = "]"
+ else
+ for i=1,size do
+ if done then
+ n = n + 1 ; t[n] = ","
+ else
+ n = n + 1 ; t[n] = "["
+ done = true
+ end
+ t, n = tojson(value[i],n)
+ end
+ n = n + 1 ; t[n] = "]"
end
- n = n + 1 ; t[n] = "]"
+ elseif kind == "string" then
+ n = n + 1 ; t[n] = '"'
+ n = n + 1 ; t[n] = lpegmatch(escaper,value) or value
+ n = n + 1 ; t[n] = '"'
+ elseif kind == "number" then
+ n = n + 1 ; t[n] = value
+ elseif kind == "boolean" then
+ n = n + 1 ; t[n] = tostring(value)
+ else
+ n = n + 1 ; t[n] = "null"
end
- elseif kind == "string" then
- n = n + 1 ; t[n] = '"'
- n = n + 1 ; t[n] = lpegmatch(escaper,value) or value
- n = n + 1 ; t[n] = '"'
- elseif kind == "number" then
- n = n + 1 ; t[n] = value
- elseif kind == "boolean" then
- n = n + 1 ; t[n] = tostring(value)
+ return t, n
end
- return t, n
-end
-function json.tostring(value)
- -- todo optimize for non table
- local kind = type(value)
- if kind == "table" then
- if not escaper then
- local escapes = {
- ["\\"] = "\\u005C",
- ["\""] = "\\u0022",
- }
- for i=0,0x20 do
- escapes[utfchar(i)] = format("\\u%04X",i)
- end
- escaper = Cs( (
- (R('\0\x20') + S('\"\\')) / escapes
- + P(1)
- )^1 )
+ -- escaping keys can become an option
+
+ local function jsontostring(value,pretty)
+ -- todo optimize for non table
+ local kind = type(value)
+ if kind == "table" then
+ if not escaper then
+ local escapes = {
+ ["\\"] = "\\u005C",
+ ["\""] = "\\u0022",
+ }
+ for i=0,0x1F do
+ escapes[utfchar(i)] = format("\\u%04X",i)
+ end
+ escaper = Cs( (
+ (R('\0\x20') + S('\"\\')) / escapes
+ + P(1)
+ )^1 )
+ end
+ -- local to the closure (saves wrapping and local functions)
+ t = { }
+ n = 0
+ if pretty then
+ tojsonpp(value,name,0,0,#value)
+ value = concat(t,"",1,n)
+ else
+ t, n = tojson(value,0)
+ value = concat(t,"",1,n)
+ end
+ t = nil
+ n = 0
+ return value
+ elseif kind == "string" or kind == "number" then
+ return lpegmatch(escaper,value) or value
+ else
+ return tostring(value)
end
- return concat((tojson(value,{},0)))
- elseif kind == "string" or kind == "number" then
- return lpegmatch(escaper,value) or value
- else
- return tostring(value)
end
+
+ json.tostring = jsontostring
+
+ function json.tojson(value)
+ return jsontostring(value,true)
+ end
+
end
--- local tmp = [[ { "t" : "foobar", "a" : true, "b" : [ 123 , 456E-10, { "a" : true, "b" : [ 123 , 456 ] } ] } ]]
+-- local tmp = [[ { "t\nt t" : "foo bar", "a" : true, "b" : [ 123 , 456E-10, { "a" : true, "b" : [ 123 , 456 ] } ] } ]]
-- tmp = json.tolua(tmp)
-- inspect(tmp)
--- tmp = json.tostring(tmp)
+-- tmp = json.tostring(tmp,true)
-- inspect(tmp)
-- tmp = json.tolua(tmp)
-- inspect(tmp)
@@ -176,13 +433,6 @@ end
-- inspect(tmp)
-- inspect(json.tostring(true))
-function json.load(filename)
- local data = io.loaddata(filename)
- if data then
- return lpegmatch(jsonconverter,data)
- end
-end
-
-- local s = [[\foo"bar"]]
-- local j = json.tostring { s = s }
-- local l = json.tolua(j)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-lib.lua b/Master/texmf-dist/tex/context/base/mkiv/util-lib.lua
index fb65a566e24..a49507c6060 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-lib.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-lib.lua
@@ -120,7 +120,8 @@ local function locate(required,version,trace,report,action)
-- initialize a few variables
local required_name = required_base .. "." .. os.libsuffix
local version = type(version) == "string" and version ~= "" and version or false
- local engine = "luatex" -- environment.ownmain or false
+-- local engine = "luatex" -- environment.ownmain or false
+ local engine = environment.ownmain or false
--
if trace and not done then
local list = expandpaths("lib") -- fresh, no reuse
@@ -240,6 +241,8 @@ local function locate(required,version,trace,report,action)
return library or nil
end
+resolvers.locatelib = locate -- for now
+
do
local report_swiglib = logs.reporter("swiglib")
@@ -458,3 +461,53 @@ ffilib("libmysql","5.6.14")
-- Watch out, the last one is less explicit and lacks the swiglib prefix.
]]--
+
+do
+
+ local isfile = lfs.isfile
+ local report = logs.reporter("resolvers","lib")
+ local trace = false
+
+ trackers.register("resolvers.lib", function(v) trace = v end)
+
+ local function action(filename)
+ return isfile(filename) and filename or false
+ end
+
+ function resolvers.findlib(required) -- todo: cache
+ local list = directives.value("system.librarynames" )
+ local only = nameonly(required)
+ if type(list) == "table" then
+ list = list[only]
+ if type(list) == "table" then
+ if trace then
+ report("using lookup list for library %a: % | t",only,list)
+ end
+ else
+ list = { only }
+ end
+ else
+ list = { only }
+ end
+ for i=1,#list do
+ local name = list[i]
+ local found = locate(name,false,trace,report,action)
+ if found then
+ return found
+ end
+ end
+ local getpaths = resolvers.expandedpathlistfromvariable
+ if getpaths then
+ local list = getpaths("PATH")
+ local base = addsuffix(only,os.libsuffix)
+ for i=1,#list do
+ local full = joinfile(list[i],base)
+ local found = locate(full,false,trace,report,action)
+ if found then
+ return found
+ end
+ end
+ end
+ end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-lua.lua b/Master/texmf-dist/tex/context/base/mkiv/util-lua.lua
index 1199301f42f..fb4088e7b66 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-lua.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-lua.lua
@@ -28,16 +28,24 @@ luautilities.nofstrippedbytes = 0
local strippedchunks = { } -- allocate()
luautilities.strippedchunks = strippedchunks
+if not LUATEXENGINE then
+ --- probably mtxrun ...
+ LUATEXENGINE = status.luatex_engine and string.lower(status.luatex_engine)
+ JITSUPPORTED = LUATEXENGINE == "luajittex" or jit
+ CONTEXTLMTXMODE = CONTEXTLMTXMODE or (LUATEXENGINE == "luametatex" and 1) or 0
+end
+
luautilities.suffixes = {
tma = "tma",
- tmc = jit and "tmb" or "tmc",
+ tmc = (CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 and "tmd") or (jit and "tmb") or "tmc",
lua = "lua",
- luc = jit and "lub" or "luc",
+ luc = (CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 and "lud") or (jit and "lub") or "luc",
lui = "lui",
luv = "luv",
luj = "luj",
tua = "tua",
- tuc = "tuc",
+ -- tuc = "tuc",
+ tuc = (CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 and "tud") or (jit and "tub") or "tuc",
}
-- environment.loadpreprocessedfile can be set to a preprocessor
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-pck.lua b/Master/texmf-dist/tex/context/base/mkiv/util-pck.lua
index 83b85cd9486..6af53f9eba2 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-pck.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-pck.lua
@@ -10,6 +10,7 @@ if not modules then modules = { } end modules ['util-pck'] = {
local next, tostring, type = next, tostring, type
local sort, concat = table.sort, table.concat
+local format = string.format
local sortedhashkeys, sortedkeys, tohash = table.sortedhashkeys, table.sortedkeys, table.tohash
utilities = utilities or { }
@@ -17,14 +18,17 @@ utilities.packers = utilities.packers or { }
local packers = utilities.packers
packers.version = 1.01
+local fmt_kv = JITSUPPORTED and "%s=%s" or "%s=%q"
+local fmt_kt = JITSUPPORTED and "%s={%s}" or "%s={%q}"
+
local function hashed(t)
local s, ns = { }, 0
for k, v in next, t do
ns = ns + 1
if type(v) == "table" then
- s[ns] = k .. "={" .. hashed(v) .. "}"
+ s[ns] = format(fmt_kt,k,hashed(v))
else
- s[ns] = k .. "=" .. tostring(v)
+ s[ns] = format(fmt_kv,k,v)
end
end
sort(s)
@@ -35,7 +39,7 @@ local function simplehashed(t)
local s, ns = { }, 0
for k, v in next, t do
ns = ns + 1
- s[ns] = k .. "=" .. v
+ s[ns] = format(fmt_kv,k,v)
end
sort(s)
return concat(s,",")
@@ -55,7 +59,6 @@ local function pack(t,keys,skip,hash,index)
local k = sk[i]
if not skip or not skip[k] then
local v = t[k]
- --
if type(v) == "table" then
pack(v,keys,skip,hash,index)
if keys[k] then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-sac.lua b/Master/texmf-dist/tex/context/base/mkiv/util-sac.lua
index 976989a77ab..47c753ab18b 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-sac.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-sac.lua
@@ -43,6 +43,8 @@ function streams.size(f)
return f and f[3] or 0
end
+streams.getsize = streams.size
+
function streams.setposition(f,i)
if f[4] then
-- zerobased
@@ -261,9 +263,9 @@ function streams.readfixed2(f)
f[2] = j + 1
local a, b = byte(f[1],i,j)
if a >= 0x80 then
- tonumber((a - 0x100) .. "." .. b)
+ return tonumber((a - 0x100) .. "." .. b) or 0
else
- tonumber((a ) .. "." .. b)
+ return tonumber((a ) .. "." .. b) or 0
end
end
@@ -273,9 +275,9 @@ function streams.readfixed4(f)
f[2] = j + 1
local a, b, c, d = byte(f[1],i,j)
if a >= 0x80 then
- tonumber((0x100 * a + b - 0x10000) .. "." .. (0x100 * c + d))
+ return tonumber((0x100 * a + b - 0x10000) .. "." .. (0x100 * c + d)) or 0
else
- tonumber((0x100 * a + b ) .. "." .. (0x100 * c + d))
+ return tonumber((0x100 * a + b ) .. "." .. (0x100 * c + d)) or 0
end
end
@@ -364,16 +366,16 @@ if sio and sio.readcardinal2 then
f[2] = i + 4
return readinteger4(f[1],i)
end
- -- function streams.readfixed2(f) -- needs recent luatex
- -- local i = f[2]
- -- f[2] = i + 2
- -- return readfixed2(f[1],i)
- -- end
- -- function streams.readfixed4(f) -- needs recent luatex
- -- local i = f[2]
- -- f[2] = i + 4
- -- return readfixed4(f[1],i)
- -- end
+ function streams.readfixed2(f) -- needs recent luatex
+ local i = f[2]
+ f[2] = i + 2
+ return readfixed2(f[1],i)
+ end
+ function streams.readfixed4(f) -- needs recent luatex
+ local i = f[2]
+ f[2] = i + 4
+ return readfixed4(f[1],i)
+ end
function streams.read2dot4(f)
local i = f[2]
f[2] = i + 2
@@ -485,3 +487,58 @@ else
end
end
+
+-- For practical reasons we put this here. It's less efficient but ok when we don't
+-- have much access.
+
+do
+
+ local files = utilities.files
+
+ if files then
+
+ local openfile = files.open
+ local openstream = streams.open
+ local openstring = streams.openstring
+
+ local setmetatable = setmetatable
+
+ function io.newreader(str,method)
+ local f, m
+ if method == "string" then
+ f = openstring(str)
+ m = streams
+ elseif method == "stream" then
+ f = openstream(str)
+ m = streams
+ else
+ f = openfile(str,"rb")
+ m = files
+ end
+ if f then
+ local t = { }
+ setmetatable(t, {
+ __index = function(t,k)
+ local r = m[k]
+ if k == "close" then
+ if f then
+ m.close(f)
+ f = nil
+ end
+ return function() end
+ elseif r then
+ local v = function(_,a,b) return r(f,a,b) end
+ t[k] = v
+ return v
+ else
+ print("unknown key",k)
+ end
+ end
+ } )
+ return t
+ end
+ end
+
+ end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-sbx.lua b/Master/texmf-dist/tex/context/base/mkiv/util-sbx.lua
index 57c57687067..cd282009e0a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-sbx.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-sbx.lua
@@ -241,6 +241,10 @@ table.setmetatableindex(validators,function(t,k)
return readable
end)
+-- function validators.verbose(s)
+-- return s
+-- end
+
function validators.string(s,finalized)
-- can be used to prevent filename checking (todo: only when registered)
if finalized and suspicious(s) then
@@ -307,8 +311,8 @@ end
-- runners can be strings or tables
--
-- os.execute : string
--- os.exec : string or table with program in [0|1]
--- os.spawn : string or table with program in [0|1]
+-- os.exec : string or table with program in [0|1] -- no longer there
+-- os.spawn : string or table with program in [0|1] -- no longer there
--
-- our execute: registered program with specification
@@ -318,39 +322,56 @@ local reported = { }
local function validcommand(name,program,template,checkers,defaults,variables,reporter,strict)
if validbinaries ~= false and (validbinaries == true or validbinaries[program]) then
+ local binpath = nil
if variables then
for variable, value in next, variables do
- local checker = validators[checkers[variable]]
- if checker then
- value = checker(unquoted(value),strict)
- if value then
- variables[variable] = optionalquoted(value)
+ local chktype = checkers[variable]
+ if chktype == "verbose" then
+ -- for now, we will have a "flags" checker
+ else
+ local checker = validators[chktype]
+ if checker then
+ value = checker(unquoted(value),strict)
+ if value then
+ variables[variable] = optionalquoted(value)
+ else
+ report("variable %a with value %a fails the check",variable,value)
+ return
+ end
else
- report("variable %a with value %a fails the check",variable,value)
+ report("variable %a has no checker",variable)
return
end
- else
- report("variable %a has no checker",variable)
- return
end
end
for variable, default in next, defaults do
local value = variables[variable]
if not value or value == "" then
- local checker = validators[checkers[variable]]
- if checker then
- default = checker(unquoted(default),strict)
- if default then
- variables[variable] = optionalquoted(default)
- else
- report("variable %a with default %a fails the check",variable,default)
- return
+ local chktype = checkers[variable]
+ if chktype == "verbose" then
+ -- for now, we will have a "flags" checker
+ else
+ local checker = validators[chktype]
+ if checker then
+ default = checker(unquoted(default),strict)
+ if default then
+ variables[variable] = optionalquoted(default)
+ else
+ report("variable %a with default %a fails the check",variable,default)
+ return
+ end
end
end
end
end
+ binpath = variables.binarypath
+ end
+ if type(binpath) == "string" and binpath ~= "" then
+ -- this works on the console but not from e.g. scite
+ -- program = '"' .. binpath .. "/" .. program .. '"'
+ program = binpath .. "/" .. program
end
- local command = program .. " " .. replace(template,variables)
+ local command = program .. " " .. replace(template,variables)
if reporter then
reporter("executing runner %a: %s",name,command)
elseif trace then
@@ -387,7 +408,8 @@ local runners = {
if trace then
report("execute: %s",command)
end
- return osexecute(command)
+ local okay = osexecute(command)
+ return okay
end
end,
pipeto = function(...)
@@ -422,7 +444,7 @@ function sandbox.registerrunner(specification)
return
end
if validrunners[name] then
- report("invalid name, runner %a already defined")
+ report("invalid name, runner %a already defined",name)
return
end
local program = specification.program
@@ -609,8 +631,8 @@ end
if os then
overload(os.execute, binaryrunner, "os.execute")
- overload(os.spawn, dummyrunner, "os.spawn")
- overload(os.exec, dummyrunner, "os.exec")
+ overload(os.spawn, dummyrunner, "os.spawn") -- no longer there
+ overload(os.exec, dummyrunner, "os.exec") -- no longer there
overload(os.resultof, binaryrunner, "os.resultof")
overload(os.pipeto, binaryrunner, "os.pipeto")
overload(os.rename, filehandlertwo,"os.rename")
@@ -637,16 +659,7 @@ end
-- these are used later on
if zip then
- zip.open = register(zip.open, filehandlerone,"zip.open")
-end
-
-if fontloader then
- fontloader.open = register(fontloader.open,filehandlerone,"fontloader.open")
- fontloader.info = register(fontloader.info,filehandlerone,"fontloader.info")
-end
-
-if epdf then
- epdf.open = register(epdf.open, filehandlerone,"epdf.open")
+ zip.open = register(zip.open, filehandlerone,"zip.open")
end
sandbox.registerroot = registerroot
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-sci.lua b/Master/texmf-dist/tex/context/base/mkiv/util-sci.lua
index fe28635a386..778991ea69d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-sci.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-sci.lua
@@ -18,10 +18,10 @@ utilities.scite = scite
local report = logs.reporter("scite")
do
- local lexerroot = "c:/data/system/scite/wscite/context/lexers"
- if not lexerroot then
- lexerroot = file.dirname(resolvers.find_file("scite-context-lexer.lua"))
- end
+-- local lexerroot = "c:/data/system/scite/wscite/context/lexers"
+-- if not lexerroot then
+ lexerroot = file.dirname(resolvers.findfile("scite-context-lexer.lua"))
+-- end
if lfs.isdir(lexerroot) then
package.extraluapath(lexerroot)
package.extraluapath(lexerroot.."/themes")
@@ -33,14 +33,28 @@ do
end
local knownlexers = {
- tex = "tex", mkiv = "tex", mkvi = "tex", mkxi = "tex", mkix = "tex", mkii = "tex", cld = "tex",
- lua = "lua", lfg = "lua", lus = "lua",
- mp = "mps", mpiv = "mps", mpii = "mps",
- w = "web", ww = "web",
- c = "cpp", h = "cpp", cpp = "cpp", hpp = "cpp", cxx = "cpp", hxx = "cpp",
- xml = "xml", lmx = "xml", ctx = "xml", xsl = "xml", xsd = "xml", rlx = "xml", css = "xml", dtd = "xml",
- bib = "bibtex",
- rme = "txt",
+ tex = "tex",
+ mkiv = "tex", mkvi = "tex",
+ mkxl = "tex", mklx = "tex",
+ mkxi = "tex", mkix = "tex",
+ mkii = "tex",
+ bib = "bibtex",
+ cld = "tex",
+ lua = "lua", lmt = "lua",
+ lfg = "lua", lus = "lua", luv = "lua",
+ mp = "mps",
+ mpiv = "mps",
+ mpxl = "mps",
+ mpii = "mps",
+ w = "web", ww = "web",
+ c = "cpp", h = "cpp",
+ cpp = "cpp", hpp = "cpp",
+ cxx = "cpp", hxx = "cpp",
+ xml = "xml", xsl = "xml", xsd = "xml", dtd = "xml",
+ lmx = "xml", ctx = "xml", rlx = "xml",
+ css = "xml",
+ rme = "txt",
+ txt = "txt",
-- todo: pat/hyp ori
}
@@ -70,13 +84,15 @@ scite.loadedlexers = loadedlexers
scite.knownlexers = knownlexers
scite.loadscitelexer = loadscitelexer
-local f_fore_bold = formatters['.%s { display: inline ; font-weight: bold ; color: #%02X%02X%02X ; }']
-local f_fore_none = formatters['.%s { display: inline ; font-weight: normal ; color: #%02X%02X%02X ; }']
-local f_none_bold = formatters['.%s { display: inline ; font-weight: bold ; }']
-local f_none_none = formatters['.%s { display: inline ; font-weight: normal ; }']
+local f_fore_bold = formatters['.%s { display:inline; font-weight:bold; color:#%02X%02X%02X; }']
+local f_fore_none = formatters['.%s { display:inline; font-weight:normal; color:#%02X%02X%02X; }']
+local f_none_bold = formatters['.%s { display:inline; font-weight:bold; }']
+local f_none_none = formatters['.%s { display:inline; font-weight:normal; }']
local f_div_class = formatters['<div class="%s">%s</div>']
local f_linenumber = formatters['<div class="linenumber">%s</div>\n']
-local f_div_number = formatters['.linenumber { display: inline-block ; font-weight: normal ; width: %sem ; margin-right: 2em ; padding-right: .25em ; text-align: right ; background-color: #C7C7C7 ; }']
+local f_lineerror = formatters['<div class="linenumber lineerror">%s</div>\n']
+local f_div_number = formatters['.linenumber { display:inline-block; font-weight:normal; width:%sem; margin-right:2em; padding-right:.25em; text-align:right; color:#000000; }'] -- background-color:#C7C7C7;
+local s_div_error = '.lineerror { font-weight:bold; color:#FFFFFF; background-color:#000000; }'
local replacer_regular = lpeg.replacer {
["<"] = "&lt;",
@@ -85,6 +101,7 @@ local replacer_regular = lpeg.replacer {
}
local linenumber = 0
+local lineerror = 0
local linenumbers = { }
local replacer_numbered = lpeg.replacer {
@@ -93,7 +110,7 @@ local replacer_numbered = lpeg.replacer {
["&"] = "&amp;",
[lpeg.patterns.newline] = function()
linenumber = linenumber + 1
- linenumbers[linenumber] = f_linenumber(linenumber)
+ linenumbers[linenumber] = (linenumber == lineerror and f_lineerror or f_linenumber)(linenumber)
return "\n"
end,
}
@@ -139,6 +156,7 @@ local function exportstyled(lexer,text,numbered)
local b = 0
linenumber = 0
linenumbers = { }
+ lineerror = tonumber(numbered) or 0
local replacer = numbered and replacer_numbered or replacer_regular
local n = #result
for i=1,n,2 do
@@ -155,12 +173,11 @@ local function exportstyled(lexer,text,numbered)
end
start = position
end
- buffer = concat(buffer)
- return buffer, concat(linenumbers)
+ return concat(buffer), concat(linenumbers)
end
local function exportcsslinenumber()
- return f_div_number(#tostring(linenumber)/2+1)
+ return f_div_number(#tostring(linenumber)/2+1) .. "\n" .. s_div_error
end
local htmlfile = utilities.templates.replacer([[
@@ -174,7 +191,7 @@ local htmlfile = utilities.templates.replacer([[
%numberstyles%
--></style>
<body>
- <table style="padding:0; margin:0;">
+ <table style="padding:0; margin:0; background-color:#FFFFFF;">
<tr>
<td><pre>%linenumbers%</pre></td>
<td><pre>%lexedcontent%</pre></td>
@@ -184,15 +201,30 @@ local htmlfile = utilities.templates.replacer([[
</html>
]])
+local htmlblob = utilities.templates.replacer([[
+<style type="text/css"><!--
+%lexingstyles%
+%numberstyles%
+--></style>
+<table style="padding:0; margin:0; background-color:#FFFFFF;">
+ <tr>
+ <td><pre>%linenumbers%</pre></td>
+ <td><pre>%lexedcontent%</pre></td>
+ </tr>
+</table>
+]])
+
function scite.tohtml(data,lexname,numbered,title)
local source, lines = exportstyled(loadedlexers[lexname],data or "",numbered)
- return htmlfile {
- lexedcontent = source, -- before numberstyles
- lexingstyles = exportcsslexing(),
- numberstyles = exportcsslinenumber(),
- title = title or "context source file",
- linenumbers = lines,
- }
+ if source then
+ return (title == false and htmlblob or htmlfile) {
+ lexedcontent = source, -- before numberstyles
+ lexingstyles = exportcsslexing(),
+ numberstyles = exportcsslinenumber(),
+ title = title or "context source file",
+ linenumbers = lines,
+ }
+ end
end
local function maketargetname(name)
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-seq.lua b/Master/texmf-dist/tex/context/base/mkiv/util-seq.lua
index e7a503fafcd..35839f2302c 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-seq.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-seq.lua
@@ -29,13 +29,13 @@ local formatters = string.formatters
local replacer = utilities.templates.replacer
local trace_used = false
-local trace_detail = false
+local trace_details = false
local report = logs.reporter("sequencer")
local usedcount = 0
local usednames = { }
-trackers.register("sequencers.used", function(v) trace_used = true end)
-trackers.register("sequencers.detail",function(v) trace_detail = true end)
+trackers.register("sequencers.used", function(v) trace_used = v end)
+trackers.register("sequencers.details", function(v) trace_details = v end)
local sequencers = { }
utilities.sequencers = sequencers
@@ -369,7 +369,7 @@ function sequencers.nodeprocessor(t,nofarguments)
local steps = 0
usedcount = usedcount + 1
--
- if trace_detail then
+ if trace_details then
naliases = naliases + 1
aliases[naliases] = formatters["local report = logs.reporter('sequencer',%q)"](name)
ncalls = ncalls + 1
@@ -383,12 +383,12 @@ function sequencers.nodeprocessor(t,nofarguments)
local action = actions[i]
if not askip[action] then
steps = steps + 1
- if trace_used or trace_detail then
+ if trace_used or trace_details then
local action = tostring(action)
report("%02i: category %a, group %a, action %a",usedcount,name,group,action)
usednames[action] = true
end
- if trace_detail then
+ if trace_details then
ncalls = ncalls + 1
calls[ncalls] = formatters[ [[report(" step %a, action %a")]] ](steps,tostring(action))
end
@@ -407,7 +407,7 @@ function sequencers.nodeprocessor(t,nofarguments)
if steps == 0 then
processor = templates.default or construct { }
else
- if trace_detail then
+ if trace_details then
ncalls = ncalls + 1
calls[ncalls] = [[report("stop")]]
end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-sha.lua b/Master/texmf-dist/tex/context/base/mkiv/util-sha.lua
index d84e46975fa..ea722073318 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-sha.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-sha.lua
@@ -38,9 +38,12 @@ end
--
-- On short strings 256 seems faster than 512 while on a megabyte blob 512 wins
-- from 256 (64 bit internals).
+--
+-- Using the stream reader we can probably speed up the following code a bit
+-- because it's faster than unpack.
-local packstring, unpackstring = string.pack, string.unpack
-local unpack, setmetatable = unpack, setmetatable
+local packstring, unpackstring, formatstring = string.pack, string.unpack, string.format
+local repstring = string.rep
local constants256 = {
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
@@ -72,31 +75,6 @@ local constants512 = {
0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817,
}
--- Not really needed, but more in tune with md5. In fact, as we use the mtxlib
--- helpers I might as well assume more.
-
-local tohex, toHEX
-
-if lpeg then local lpegpatterns = lpeg.patterns if lpegpatterns then
-
- local lpegmatch = lpeg.match
- local bytestohex = lpegpatterns.bytestohex
- local bytestoHEX = lpegpatterns.bytestoHEX
-
- tohex = function(s) return lpegmatch(bytestohex,s) end
- toHEX = function(s) return lpegmatch(bytestoHEX,s) end
-
-end end
-
-if not tohex then
-
- local format, byte, gsub = string.format, string.byte, string.gsub
-
- tohex = function(s) return (gsub(s,".",function(c) return format("%02X",byte(c)) end)) end
- toHEX = function(s) return (gsub(s,".",function(c) return format("%02X",byte(c)) end)) end
-
-end
-
local prepare = { }
if utilities and utilities.strings then
@@ -112,13 +90,11 @@ if utilities and utilities.strings then
else
- local rep = string.rep
-
prepare[256] = function(str,len)
- return str .. "\128" .. rep("\0",-(1 + 8 + len) % 64) .. packstring(">I8", 8 * len)
+ return str .. "\128" .. repstring("\0",-(1 + 8 + len) % 64) .. packstring(">I8", 8 * len)
end
prepare[512] = function(str,len)
- return str .. "\128" .. rep("\0",-(1 + 16 + len) % 128) .. packstring(">I16", 8 * len)
+ return str .. "\128" .. repstring("\0",-(1 + 16 + len) % 128) .. packstring(">I16", 8 * len)
end
end
@@ -162,9 +138,10 @@ local list = { } -- some 5% faster
digest[256] = function(str,i,hash)
- for i=1,#str,64 do
+ local hash1, hash2, hash3, hash4 = hash[1], hash[2], hash[3], hash[4]
+ local hash5, hash6, hash7, hash8 = hash[5], hash[6], hash[7], hash[8]
- -- local w = { unpackstring(">I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4",str,i) }
+ for i=1,#str,64 do
list[ 1], list[ 2], list[ 3], list[ 4], list[ 5], list[ 6], list[ 7], list[ 8],
list[ 9], list[10], list[11], list[12], list[13], list[14], list[15], list[16] =
@@ -183,7 +160,7 @@ digest[256] = function(str,i,hash)
& 0xffffffff
end
- local a, b, c, d, e, f, g, h = -- unpack(hash)
+ local a, b, c, d, e, f, g, h =
hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7], hash[8]
for i=1,64 do
@@ -208,23 +185,27 @@ digest[256] = function(str,i,hash)
a = (t1 + t2) & 0xffffffff
end
- hash[1] = (hash[1] + a) & 0xffffffff
- hash[2] = (hash[2] + b) & 0xffffffff
- hash[3] = (hash[3] + c) & 0xffffffff
- hash[4] = (hash[4] + d) & 0xffffffff
- hash[5] = (hash[5] + e) & 0xffffffff
- hash[6] = (hash[6] + f) & 0xffffffff
- hash[7] = (hash[7] + g) & 0xffffffff
- hash[8] = (hash[8] + h) & 0xffffffff
+ hash1 = (hash1 + a) & 0xffffffff
+ hash2 = (hash2 + b) & 0xffffffff
+ hash3 = (hash3 + c) & 0xffffffff
+ hash4 = (hash4 + d) & 0xffffffff
+ hash5 = (hash5 + e) & 0xffffffff
+ hash6 = (hash6 + f) & 0xffffffff
+ hash7 = (hash7 + g) & 0xffffffff
+ hash8 = (hash8 + h) & 0xffffffff
end
+
+ return hash1, hash2, hash3, hash4, hash5, hash6, hash7, hash8
+
end
digest[512] = function(str,i,hash)
- for i=1,#str,128 do
+ local hash1, hash2, hash3, hash4 = hash[1], hash[2], hash[3], hash[4]
+ local hash5, hash6, hash7, hash8 = hash[5], hash[6], hash[7], hash[8]
- -- local w = { unpackstring(">I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4",str,i) }
+ for i=1,#str,128 do
list[ 1], list[ 2], list[ 3], list[ 4], list[ 5], list[ 6], list[ 7], list[ 8],
list[ 9], list[10], list[11], list[12], list[13], list[14], list[15], list[16] =
@@ -243,7 +224,7 @@ digest[512] = function(str,i,hash)
-- & 0xffffffffffffffff
end
- local a, b, c, d, e, f, g, h = -- unpack(hash)
+ local a, b, c, d, e, f, g, h =
hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7], hash[8]
for i=1,80 do
@@ -268,70 +249,159 @@ digest[512] = function(str,i,hash)
a = (t1 + t2) -- & 0xffffffffffffffff
end
- hash[1] = (hash[1] + a) -- & 0xffffffffffffffff
- hash[2] = (hash[2] + b) -- & 0xffffffffffffffff
- hash[3] = (hash[3] + c) -- & 0xffffffffffffffff
- hash[4] = (hash[4] + d) -- & 0xffffffffffffffff
- hash[5] = (hash[5] + e) -- & 0xffffffffffffffff
- hash[6] = (hash[6] + f) -- & 0xffffffffffffffff
- hash[7] = (hash[7] + g) -- & 0xffffffffffffffff
- hash[8] = (hash[8] + h) -- & 0xffffffffffffffff
+ hash1 = (hash1 + a) -- & 0xffffffffffffffff
+ hash2 = (hash2 + b) -- & 0xffffffffffffffff
+ hash3 = (hash3 + c) -- & 0xffffffffffffffff
+ hash4 = (hash4 + d) -- & 0xffffffffffffffff
+ hash5 = (hash5 + e) -- & 0xffffffffffffffff
+ hash6 = (hash6 + f) -- & 0xffffffffffffffff
+ hash7 = (hash7 + g) -- & 0xffffffffffffffff
+ hash8 = (hash8 + h) -- & 0xffffffffffffffff
end
+
+ return hash1, hash2, hash3, hash4, hash5, hash6, hash7, hash8
+
end
digest[224] = digest[256]
digest[384] = digest[512]
-local finalize = {
- [224] = function(hash,tohex) local s = packstring(">I4I4I4I4I4I4I4", unpack(hash)) return tohex and tohex(s) or s end, -- # 56
- [256] = function(hash,tohex) local s = packstring(">I4I4I4I4I4I4I4I4",unpack(hash)) return tohex and tohex(s) or s end, -- # 64
- [384] = function(hash,tohex) local s = packstring(">I8I8I8I8I8I8", unpack(hash)) return tohex and tohex(s) or s end, -- # 96
- [512] = function(hash,tohex) local s = packstring(">I8I8I8I8I8I8I8I8",unpack(hash)) return tohex and tohex(s) or s end, -- # 128
-}
-
local hash = { }
-local function hashed(str,method,tohex)
+local function hashed(str,method,convert,pattern)
local s = prepare[method](str,#str)
local h = initialize[method](hash)
- digest[method](s,i,h)
- return finalize[method](h,tohex)
+ return convert(pattern,digest[method](s,i,h))
end
local sha2 = {
- digest224 = function(str) return hashed(str,224) end,
- digest256 = function(str) return hashed(str,256) end,
- digest384 = function(str) return hashed(str,384) end,
- digest512 = function(str) return hashed(str,512) end,
- hash224 = function(str) return hashed(str,224,tohex) end,
- hash256 = function(str) return hashed(str,256,tohex) end,
- hash384 = function(str) return hashed(str,384,tohex) end,
- hash512 = function(str) return hashed(str,512,tohex) end,
- HASH224 = function(str) return hashed(str,224,toHEX) end,
- HASH256 = function(str) return hashed(str,256,toHEX) end,
- HASH384 = function(str) return hashed(str,384,toHEX) end,
- HASH512 = function(str) return hashed(str,512,toHEX) end,
+ digest224 = function(str) return hashed(str,224,packstring,">I4I4I4I4I4I4I4") end,
+ digest256 = function(str) return hashed(str,256,packstring,">I4I4I4I4I4I4I4I4") end,
+ digest384 = function(str) return hashed(str,384,packstring,">I8I8I8I8I8I8") end,
+ digest512 = function(str) return hashed(str,512,packstring,">I8I8I8I8I8I8I8I8") end,
+ hash224 = function(str) return hashed(str,224,formatstring,"%0x04%0x04%0x04%0x04%0x04%0x04%0x04") end,
+ hash256 = function(str) return hashed(str,256,formatstring,"%0x04%0x04%0x04%0x04%0x04%0x04%0x04%0x04") end,
+ hash384 = function(str) return hashed(str,384,formatstring,"%0x08%0x08%0x08%0x08%0x08%0x08") end,
+ hash512 = function(str) return hashed(str,512,formatstring,"%0x08%0x08%0x08%0x08%0x08%0x08%0x08%0x08") end,
+ HASH224 = function(str) return hashed(str,224,formatstring,"%0X04%0X04%0X04%0X04%0X04%0X04%0X04") end,
+ HASH256 = function(str) return hashed(str,256,formatstring,"%0X04%0X04%0X04%0X04%0X04%0X04%0X04%0X04") end,
+ HASH384 = function(str) return hashed(str,384,formatstring,"%0X08%0X08%0X08%0X08%0X08%0X08") end,
+ HASH512 = function(str) return hashed(str,512,formatstring,"%0X08%0X08%0X08%0X08%0X08%0X08%0X08%0X08") end,
}
--- local setmetatableindex = table.setmetatableindex
+-- The wikipedia provides the code:
+--
+-- https://en.wikipedia.org/wiki/SHA-1
+--
+-- and (nor being in th emood to writ it myself) a bit of googling gave a decent
+-- starting point:
+--
+-- https://github.com/gdyr/LuaSHA1/blob/master/sha1.lua
--
--- if setmetatableindex then
--- sha2.hashed = setmetatableindex(function(t,k)
--- local v = digest[k] and function(str) return hashed(str,k,tohex) end or false
--- t[k] = v
--- return v
--- end)
--- sha2.HASHED = setmetatableindex(function(t,k)
--- local v = digest[k] and function(str) return hashed(str,k,toHEX) end or false
--- t[k] = v
--- return v
--- end)
--- end
+-- and after that it was just a matter of optimizing the code a bit. I just put
+-- it here as reference as we probably don't use it. We could use a repeater as
+-- we do with sha2.
+
+local function digest(str)
+
+ local h1 = 0x67452301
+ local h2 = 0xEFCDAB89
+ local h3 = 0x98BADCFE
+ local h4 = 0x10325476
+ local h5 = 0xC3D2E1F0
+
+ local len = #str
+ local list = { } -- we can even move this outside the function
+
+ str = str .. "\128" .. repstring("\0", (120 - ((len + 1) % 64)) % 64) .. packstring(">I8", 8 * len)
+
+ for i=1,#str,64 do
+
+ list[ 1], list[ 2], list[ 3], list[ 4], list[ 5], list[ 6], list[ 7], list[ 8],
+ list[ 9], list[10], list[11], list[12], list[13], list[14], list[15], list[16] =
+ unpackstring(">I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4",str,i)
+
+ for i=17,80 do
+ local v = list[i-3] ~ list[i-8] ~ list[i-14] ~ list[i-16]
+ list[i] = ((v << 1) | (v >> 31)) & 0xFFFFFFFF
+ end
+
+ local a, b, c, d, e = h1, h2, h3, h4, h5
+
+ for i=1,20 do
+ local f = (b & c) | ((~b) & d)
+ local r = (a << 5) | (a >> 27)
+ local s = (f + r + e + 0x5A827999 + list[i]) & 0xFFFFFFFF
+ e = d
+ d = c
+ c = (b << 30) | (b >> 2)
+ b = a
+ a = s
+ end
+
+ for i=21,40 do
+ local f = b ~ c ~ d
+ local r = (a << 5) | (a >> 27)
+ local s = (f + r + e + 0x6ED9EBA1 + list[i]) & 0xFFFFFFFF
+ e = d
+ d = c
+ c = (b << 30) | (b >> 2)
+ b = a
+ a = s
+ end
+
+ for i=41,60 do
+ local f = (b & c) | (b & d) | (c & d)
+ local r = (a << 5) | (a >> 27)
+ local s = (f + r + e + 0x8F1BBCDC + list[i]) & 0xFFFFFFFF
+ e = d
+ d = c
+ c = (b << 30) | (b >> 2)
+ b = a
+ a = s
+ end
+
+ for i=61,80 do
+ local f = b ~ c ~ d
+ local r = (a << 5) | (a >> 27)
+ local s = (f + r + e + 0xCA62C1D6 + list[i]) & 0xFFFFFFFF
+ e = d
+ d = c
+ c = (b << 30) | (b >> (32 - 30))
+ b = a
+ a = s
+ end
+
+ h1 = (h1 + a) & 0xFFFFFFFF
+ h2 = (h2 + b) & 0xFFFFFFFF
+ h3 = (h3 + c) & 0xFFFFFFFF
+ h4 = (h4 + d) & 0xFFFFFFFF
+ h5 = (h5 + e) & 0xFFFFFFFF
+
+ end
+
+ return h1, h2, h3, h4, h5
+
+end
+
+-- A similar wrapper as we use for sha2:
+
+local sha1 = {
+ digest = function(str)
+ return packstring(">I4I4I4I4I4",digest(str))
+ end,
+ hash = function(str)
+ return formatstring("%08x%08x%08x%08x%08x",digest(str))
+ end,
+ HASH = function(str)
+ return formatstring("%08X%08X%08X%08X%08X",digest(str))
+ end,
+}
if utilities then
utilities.sha2 = sha2
+ utilities.sha1 = sha1
end
return sha2
-
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-soc-imp-copas.lua b/Master/texmf-dist/tex/context/base/mkiv/util-soc-imp-copas.lua
index 3e66e588838..1268613d122 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-soc-imp-copas.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-soc-imp-copas.lua
@@ -50,6 +50,8 @@ local copas = {
report = report,
+ trace = false,
+
}
local function statushandler(status, ...)
@@ -60,7 +62,9 @@ local function statushandler(status, ...)
if type(err) == "table" then
err = err[1]
end
- report("error: %s",tostring(err))
+ if copas.trace then
+ report("error: %s",tostring(err))
+ end
return nil, err
end
@@ -76,7 +80,9 @@ function socket.newtry(finalizer)
if not status then
local detail = select(2,...)
pcall(finalizer,detail)
- report("error: %s",tostring(detail))
+ if copas.trace then
+ report("error: %s",tostring(detail))
+ end
return
end
return ...
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-sql-imp-ffi.lua b/Master/texmf-dist/tex/context/base/mkiv/util-sql-imp-ffi.lua
index 3731933f1e1..f440695023d 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-sql-imp-ffi.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-sql-imp-ffi.lua
@@ -66,9 +66,6 @@ ffi.cdef [[
void *extension;
} MYSQL_field;
- void free(void*ptr);
- void * malloc(size_t size);
-
MYSQL_instance * mysql_init (
MYSQL_instance *mysql
);
@@ -153,7 +150,7 @@ ffi.cdef [[
); */
]]
-
+-- trackers.enable("*lib*")
local sql = utilities.sql
----- mysql = ffi.load(os.name == "windows" and "libmysql" or "libmysqlclient")
----- mysql = ffilib(os.name == "windows" and "libmysql" or "libmysqlclient")
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-sql-imp-sqlite.lua b/Master/texmf-dist/tex/context/base/mkiv/util-sql-imp-sqlite.lua
index cf4a3a8b04d..a88035f683a 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-sql-imp-sqlite.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-sql-imp-sqlite.lua
@@ -66,6 +66,7 @@ ffi.cdef [[
const char *sqlite3_errmsg (
sqlite3*
);
+
]]
local ffi_tostring = ffi.string
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-sql.lua b/Master/texmf-dist/tex/context/base/mkiv/util-sql.lua
index d01a2267cf6..36f3eab1935 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-sql.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-sql.lua
@@ -60,7 +60,7 @@ if not modules then modules = { } end modules ['util-sql'] = {
local format, match = string.format, string.match
local random = math.random
-local rawset, setmetatable, getmetatable, load, type = rawset, setmetatable, getmetatable, load, type
+local rawset, rawget, setmetatable, getmetatable, load, type = rawset, rawget, setmetatable, getmetatable, load, type
local P, S, V, C, Cs, Ct, Cc, Cg, Cf, patterns, lpegmatch = lpeg.P, lpeg.S, lpeg.V, lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.Cc, lpeg.Cg, lpeg.Cf, lpeg.patterns, lpeg.match
local concat = table.concat
@@ -109,16 +109,43 @@ local defaults = { __index =
},
}
-setmetatableindex(sql.methods,function(t,k)
- if type(k) == "string" then
- report_state("start loading method %a",k)
- require("util-sql-imp-"..k)
- report_state("loading method %a done",k)
- return rawget(t,k)
- else
- report_state("invalid method %a",tostring(k))
- end
-end)
+if optional then
+
+ local methods = {
+ ffi = "mysql",
+ library = "mysql",
+ swiglib = "mysql",
+ postgress = "postgress",
+ sqlite = "sqlite",
+ sqlite3 = "sqlite",
+ }
+
+ setmetatableindex(sql.methods,function(t,k)
+ local m = methods[k]
+ if m then
+ report_state("start loading method %a as %a",k,m)
+ require("libs-imp-" .. m)
+ report_state("loading method %a done",k)
+ return rawget(t,m)
+ else
+ report_state("invalid method %a",tostring(k))
+ end
+ end)
+
+else
+
+ setmetatableindex(sql.methods,function(t,k)
+ if type(k) == "string" then
+ report_state("start loading method %a",k)
+ require("util-sql-imp-" .. k)
+ report_state("loading method %a done",k)
+ return rawget(t,k)
+ else
+ report_state("invalid method %a",tostring(k))
+ end
+ end)
+
+end
-- converters
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-sta.lua b/Master/texmf-dist/tex/context/base/mkiv/util-sta.lua
index 7819395f69c..9ca1c67e9ad 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-sta.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-sta.lua
@@ -81,6 +81,8 @@ end
function stacker.new(name)
+ -- to be sped up, mmaybe foo:bar syntax here but then quite some access
+
local report = logs.reporter("stacker",name or nil)
local s
@@ -93,6 +95,7 @@ function stacker.new(name)
local hashing = true
local function push(...)
+ -- todo check if more than 1 argument
for i=1,select("#",...) do
insert(stack,(select(i,...))) -- watch the ()
end
@@ -153,8 +156,12 @@ function stacker.new(name)
local function resolve_step(ti) -- keep track of changes outside function !
-- todo: optimize for n=1 etc
+ if not top then
+ -- report("messed op stacker %a",name)
+ return
+ end
local result = nil
- local noftop = top and #top or 0
+ local noftop = #top
if ti > 0 then
local current = list[ti]
if current then
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-str.lua b/Master/texmf-dist/tex/context/base/mkiv/util-str.lua
index a04b2083586..4d23f88b7e8 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-str.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-str.lua
@@ -584,6 +584,26 @@ local template = [[
return function(%s) return %s end
]]
+-- this might move
+
+local pattern = Cs(Cc('"') * (
+ (1-S('"\\\n\r'))^1
+ + P('"') / '\\"'
+ + P('\\') / '\\\\'
+ + P('\n') / '\\n'
+ + P('\r') / '\\r'
+)^0 * Cc('"'))
+
+patterns.escapedquotes = pattern
+
+function string.escapedquotes(s)
+ return lpegmatch(pattern,s)
+end
+
+-- print(string.escapedquotes('1\\23\n"'))
+
+-- but for now here
+
local preamble = ""
local environment = {
@@ -609,10 +629,11 @@ local environment = {
formattednumber = number.formatted,
sparseexponent = number.sparseexponent,
formattedfloat = number.formattedfloat,
- stripzero = lpeg.patterns.stripzero,
- stripzeros = lpeg.patterns.stripzeros,
+ stripzero = patterns.stripzero,
+ stripzeros = patterns.stripzeros,
+ escapedquotes = string.escapedquotes,
- FORMAT = string.f9,
+ FORMAT = string.f6,
}
-- -- --
@@ -680,16 +701,22 @@ local format_left = function(f)
end
end
-local format_q = function()
+local format_q = JITSUPPORTED and function()
n = n + 1
-- lua 5.3 has a different q than lua 5.2 (which does a tostring on numbers)
-- return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n)
return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n)
+ -- return format("(a%s ~= nil and escapedquotes(tostring(a%s)) or '')",n,n)
+end or function()
+ n = n + 1
+ return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n)
end
-local format_Q = function() -- can be optimized
+
+local format_Q = function() -- fast escaping
n = n + 1
- return format("format('%%q',tostring(a%s))",n)
+-- return format("format('%%q',tostring(a%s))",n)
+ return format("escapedquotes(tostring(a%s))",n)
end
local format_i = function(f)
@@ -885,7 +912,7 @@ local format_L = function()
return format("(a%s and 'TRUE' or 'FALSE')",n)
end
-local format_n = function() -- strips leading and trailing zeros and removes .0
+local format_n = function() -- strips leading and trailing zeros and removes .0, beware: can produce e notation
n = n + 1
return format("((a%s %% 1 == 0) and format('%%i',a%s) or tostring(a%s))",n,n,n)
end
@@ -915,13 +942,30 @@ end
-- end
-- end
-local format_N = function(f) -- strips leading and trailing zeros
- n = n + 1
- -- stripzero (singular) as we only have a number
- if not f or f == "" then
- f = ".9"
- end -- always a leading number !
- return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+local format_N if environment.FORMAT then
+
+ format_N = function(f)
+ n = n + 1
+ if not f or f == "" then
+ return format("FORMAT(a%s,'%%.9f')",n)
+ elseif f == ".6" or f == "0.6" then
+ return format("FORMAT(a%s)",n)
+ else
+ return format("FORMAT(a%s,'%%%sf')",n,f)
+ end
+ end
+
+else
+
+ format_N = function(f) -- strips leading and trailing zeros
+ n = n + 1
+ -- stripzero (singular) as we only have a number
+ if not f or f == "" then
+ f = ".9"
+ end -- always a leading number !
+ return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+ end
+
end
local format_a = function(f)
@@ -1328,9 +1372,9 @@ patterns.luaquoted = Cs(Cc('"') * ((1-S('"\n'))^1 + P('"')/'\\"' + P('\n')/'\\n"
-- escaping by lpeg is faster for strings without quotes, slower on a string with quotes, but
-- faster again when other q-escapables are found (the ones we don't need to escape)
-add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape = lpeg.patterns.xmlescape })
-add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape = lpeg.patterns.texescape })
-add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape = lpeg.patterns.luaescape })
+add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape = patterns.xmlescape })
+add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape = patterns.texescape })
+add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape = patterns.luaescape })
-- -- yes or no:
--
@@ -1408,3 +1452,31 @@ local f_16_16 = formatters["%0.5N"]
function number.to16dot16(n)
return f_16_16(n/65536.0)
end
+
+--
+
+if not string.explode then
+
+ local tsplitat = lpeg.tsplitat
+
+ local p_utf = patterns.utf8character
+ local p_check = C(p_utf) * (P("+") * Cc(true))^0
+ local p_split = Ct(C(p_utf)^0)
+ local p_space = Ct((C(1-P(" ")^1) + P(" ")^1)^0)
+
+ function string.explode(str,symbol)
+ if symbol == "" then
+ return lpegmatch(p_split,str)
+ elseif symbol then
+ local a, b = lpegmatch(p_check,symbol)
+ if b then
+ return lpegmatch(tsplitat(P(a)^1),str)
+ else
+ return lpegmatch(tsplitat(a),str)
+ end
+ else
+ return lpegmatch(p_space,str)
+ end
+ end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-tab.lua b/Master/texmf-dist/tex/context/base/mkiv/util-tab.lua
index 2f425cca384..4dafb2acd65 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-tab.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-tab.lua
@@ -314,86 +314,177 @@ end
-- best keep [%q] keys (as we have some in older applications i.e. saving user data (otherwise
-- we also need to check for reserved words)
-local f_hashed_string = formatters["[%q]=%q,"]
-local f_hashed_number = formatters["[%q]=%s,"]
-local f_hashed_boolean = formatters["[%q]=%l,"]
-local f_hashed_table = formatters["[%q]="]
-
-local f_indexed_string = formatters["[%s]=%q,"]
-local f_indexed_number = formatters["[%s]=%s,"]
-local f_indexed_boolean = formatters["[%s]=%l,"]
-local f_indexed_table = formatters["[%s]="]
-
-local f_ordered_string = formatters["%q,"]
-local f_ordered_number = formatters["%s,"]
-local f_ordered_boolean = formatters["%l,"]
-
-function table.fastserialize(t,prefix)
-
- -- prefix should contain the =
- -- not sorted
- -- only number and string indices (currently)
-
- local r = { type(prefix) == "string" and prefix or "return" }
- local m = 1
- local function fastserialize(t,outer) -- no mixes
- local n = #t
- m = m + 1
- r[m] = "{"
- if n > 0 then
- for i=0,n do
- local v = t[i]
- local tv = type(v)
- if tv == "string" then
- m = m + 1 r[m] = f_ordered_string(v)
- elseif tv == "number" then
- m = m + 1 r[m] = f_ordered_number(v)
- elseif tv == "table" then
- fastserialize(v)
- elseif tv == "boolean" then
- m = m + 1 r[m] = f_ordered_boolean(v)
+if JITSUPPORTED then
+
+ local f_hashed_string = formatters["[%Q]=%Q,"]
+ local f_hashed_number = formatters["[%Q]=%s,"]
+ local f_hashed_boolean = formatters["[%Q]=%l,"]
+ local f_hashed_table = formatters["[%Q]="]
+
+ local f_indexed_string = formatters["[%s]=%Q,"]
+ local f_indexed_number = formatters["[%s]=%s,"]
+ local f_indexed_boolean = formatters["[%s]=%l,"]
+ local f_indexed_table = formatters["[%s]="]
+
+ local f_ordered_string = formatters["%Q,"]
+ local f_ordered_number = formatters["%s,"]
+ local f_ordered_boolean = formatters["%l,"]
+
+ function table.fastserialize(t,prefix) -- todo, move local function out
+
+ -- prefix should contain the =
+ -- not sorted
+ -- only number and string indices (currently)
+
+ local r = { type(prefix) == "string" and prefix or "return" }
+ local m = 1
+ local function fastserialize(t,outer) -- no mixes
+ local n = #t
+ m = m + 1
+ r[m] = "{"
+ if n > 0 then
+ local v = t[0]
+ if v then
+ local tv = type(v)
+ if tv == "string" then
+ m = m + 1 r[m] = f_indexed_string(0,v)
+ elseif tv == "number" then
+ m = m + 1 r[m] = f_indexed_number(0,v)
+ elseif tv == "table" then
+ m = m + 1 r[m] = f_indexed_table(0)
+ fastserialize(v)
+ m = m + 1 r[m] = f_indexed_table(0)
+ elseif tv == "boolean" then
+ m = m + 1 r[m] = f_indexed_boolean(0,v)
+ end
+ end
+ for i=1,n do
+ local v = t[i]
+ local tv = type(v)
+ if tv == "string" then
+ m = m + 1 r[m] = f_ordered_string(v)
+ elseif tv == "number" then
+ m = m + 1 r[m] = f_ordered_number(v)
+ elseif tv == "table" then
+ fastserialize(v)
+ elseif tv == "boolean" then
+ m = m + 1 r[m] = f_ordered_boolean(v)
+ end
end
end
- end
- for k, v in next, t do
- local tk = type(k)
- if tk == "number" then
- if k > n or k < 0 then
+ -- hm, can't we avoid this ... lua should have a way to check if there
+ -- is a hash part
+ for k, v in next, t do
+ local tk = type(k)
+ if tk == "number" then
+ if k > n or k < 0 then
+ local tv = type(v)
+ if tv == "string" then
+ m = m + 1 r[m] = f_indexed_string(k,v)
+ elseif tv == "number" then
+ m = m + 1 r[m] = f_indexed_number(k,v)
+ elseif tv == "table" then
+ m = m + 1 r[m] = f_indexed_table(k)
+ fastserialize(v)
+ elseif tv == "boolean" then
+ m = m + 1 r[m] = f_indexed_boolean(k,v)
+ end
+ end
+ else
local tv = type(v)
if tv == "string" then
- m = m + 1 r[m] = f_indexed_string(k,v)
+ m = m + 1 r[m] = f_hashed_string(k,v)
elseif tv == "number" then
- m = m + 1 r[m] = f_indexed_number(k,v)
+ m = m + 1 r[m] = f_hashed_number(k,v)
elseif tv == "table" then
- m = m + 1 r[m] = f_indexed_table(k)
+ m = m + 1 r[m] = f_hashed_table(k)
fastserialize(v)
elseif tv == "boolean" then
- m = m + 1 r[m] = f_indexed_boolean(k,v)
+ m = m + 1 r[m] = f_hashed_boolean(k,v)
end
end
+ end
+ m = m + 1
+ if outer then
+ r[m] = "}"
else
- local tv = type(v)
- if tv == "string" then
- m = m + 1 r[m] = f_hashed_string(k,v)
- elseif tv == "number" then
- m = m + 1 r[m] = f_hashed_number(k,v)
- elseif tv == "table" then
- m = m + 1 r[m] = f_hashed_table(k)
- fastserialize(v)
- elseif tv == "boolean" then
- m = m + 1 r[m] = f_hashed_boolean(k,v)
- end
+ r[m] = "},"
end
+ return r
end
- m = m + 1
- if outer then
- r[m] = "}"
- else
- r[m] = "},"
+ return concat(fastserialize(t,true))
+ end
+
+else
+
+ local f_v = formatters["[%q]=%q,"]
+ local f_t = formatters["[%q]="]
+ local f_q = formatters["%q,"]
+
+ function table.fastserialize(t,prefix) -- todo, move local function out
+ local r = { type(prefix) == "string" and prefix or "return" }
+ local m = 1
+ local function fastserialize(t,outer) -- no mixes
+ local n = #t
+ m = m + 1
+ r[m] = "{"
+ if n > 0 then
+ local v = t[0]
+ if v then
+ m = m + 1
+ r[m] = "[0]='"
+ if type(v) == "table" then
+ fastserialize(v)
+ else
+ r[m] = format("%q,",v)
+ end
+ end
+ for i=1,n do
+ local v = t[i]
+ m = m + 1
+ if type(v) == "table" then
+ r[m] = format("[%i]=",i)
+ fastserialize(v)
+ else
+ r[m] = format("[%i]=%q,",i,v)
+ end
+ end
+ end
+ -- hm, can't we avoid this ... lua should have a way to check if there
+ -- is a hash part
+ for k, v in next, t do
+ local tk = type(k)
+ if tk == "number" then
+ if k > n or k < 0 then
+ m = m + 1
+ if type(v) == "table" then
+ r[m] = format("[%i]=",k)
+ fastserialize(v)
+ else
+ r[m] = format("[%i]=%q,",k,v)
+ end
+ end
+ else
+ m = m + 1
+ if type(v) == "table" then
+ r[m] = format("[%q]=",k)
+ fastserialize(v)
+ else
+ r[m] = format("[%q]=%q,",k,v)
+ end
+ end
+ end
+ m = m + 1
+ if outer then
+ r[m] = "}"
+ else
+ r[m] = "},"
+ end
+ return r
end
- return r
+ return concat(fastserialize(t,true))
end
- return concat(fastserialize(t,true))
+
end
function table.deserialize(str)
@@ -411,7 +502,7 @@ function table.deserialize(str)
return code
end
--- inspect(table.fastserialize { a = 1, b = { 4, { 5, 6 } }, c = { d = 7, e = 'f"g\nh' } })
+-- inspect(table.fastserialize { a = 1, b = { [0]=4, { 5, 6 } }, c = { d = 7, e = 'f"g\nh' } })
function table.load(filename,loader)
if filename then
@@ -517,35 +608,35 @@ end
-- husayni.tma : 0.28 -> 0.19
local f_start_key_idx = formatters["%w{"]
-local f_start_key_num = formatters["%w[%s]={"]
+local f_start_key_num = JITSUPPORTED and formatters["%w[%s]={"] or formatters["%w[%q]={"]
local f_start_key_str = formatters["%w[%q]={"]
local f_start_key_boo = formatters["%w[%l]={"]
local f_start_key_nop = formatters["%w{"]
local f_stop = formatters["%w},"]
-local f_key_num_value_num = formatters["%w[%s]=%s,"]
-local f_key_str_value_num = formatters["%w[%q]=%s,"]
-local f_key_boo_value_num = formatters["%w[%l]=%s,"]
+local f_key_num_value_num = JITSUPPORTED and formatters["%w[%s]=%s,"] or formatters["%w[%s]=%q,"]
+local f_key_str_value_num = JITSUPPORTED and formatters["%w[%Q]=%s,"] or formatters["%w[%Q]=%q,"]
+local f_key_boo_value_num = JITSUPPORTED and formatters["%w[%l]=%s,"] or formatters["%w[%l]=%q,"]
-local f_key_num_value_str = formatters["%w[%s]=%q,"]
-local f_key_str_value_str = formatters["%w[%q]=%q,"]
-local f_key_boo_value_str = formatters["%w[%l]=%q,"]
+local f_key_num_value_str = JITSUPPORTED and formatters["%w[%s]=%Q,"] or formatters["%w[%q]=%Q,"]
+local f_key_str_value_str = formatters["%w[%Q]=%Q,"]
+local f_key_boo_value_str = formatters["%w[%l]=%Q,"]
-local f_key_num_value_boo = formatters["%w[%s]=%l,"]
-local f_key_str_value_boo = formatters["%w[%q]=%l,"]
+local f_key_num_value_boo = JITSUPPORTED and formatters["%w[%s]=%l,"] or formatters["%w[%q]=%l,"]
+local f_key_str_value_boo = formatters["%w[%Q]=%l,"]
local f_key_boo_value_boo = formatters["%w[%l]=%l,"]
-local f_key_num_value_not = formatters["%w[%s]={},"]
-local f_key_str_value_not = formatters["%w[%q]={},"]
+local f_key_num_value_not = JITSUPPORTED and formatters["%w[%s]={},"] or formatters["%w[%q]={},"]
+local f_key_str_value_not = formatters["%w[%Q]={},"]
local f_key_boo_value_not = formatters["%w[%l]={},"]
-local f_key_num_value_seq = formatters["%w[%s]={ %, t },"]
-local f_key_str_value_seq = formatters["%w[%q]={ %, t },"]
+local f_key_num_value_seq = JITSUPPORTED and formatters["%w[%s]={ %, t },"] or formatters["%w[%q]={ %, t },"]
+local f_key_str_value_seq = formatters["%w[%Q]={ %, t },"]
local f_key_boo_value_seq = formatters["%w[%l]={ %, t },"]
-local f_val_num = formatters["%w%s,"]
-local f_val_str = formatters["%w%q,"]
+local f_val_num = JITSUPPORTED and formatters["%w%s,"] or formatters["%w%q,"]
+local f_val_str = formatters["%w%Q,"]
local f_val_boo = formatters["%w%l,"]
local f_val_not = formatters["%w{},"]
local f_val_seq = formatters["%w{ %, t },"]
@@ -554,11 +645,9 @@ local f_fin_seq = formatters[" %, t }"]
local f_table_return = formatters["return {"]
local f_table_name = formatters["%s={"]
local f_table_direct = formatters["{"]
-local f_table_entry = formatters["[%q]={"]
+local f_table_entry = formatters["[%Q]={"]
local f_table_finish = formatters["}"]
------ f_string = formatters["%q"]
-
local spaces = utilities.strings.newrepeater(" ")
local original_serialize = table.serialize -- the extensive one, the one we started with
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-tpl.lua b/Master/texmf-dist/tex/context/base/mkiv/util-tpl.lua
index 5e75a151b92..318f2efc3b0 100644
--- a/Master/texmf-dist/tex/context/base/mkiv/util-tpl.lua
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-tpl.lua
@@ -20,6 +20,8 @@ local tostring, next = tostring, next
local format, sub, byte = string.format, string.sub, string.byte
local P, C, R, Cs, Cc, Carg, lpegmatch, lpegpatterns = lpeg.P, lpeg.C, lpeg.R, lpeg.Cs, lpeg.Cc, lpeg.Carg, lpeg.match, lpeg.patterns
+local formatters = string.formatters
+
-- todo: make installable template.new
local replacer
@@ -133,34 +135,42 @@ local function replaceoptional(l,m,r,t,how,recurse)
return v and v ~= "" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
-local single = P("%") -- test %test% test : resolves test
-local double = P("%%") -- test 10%% test : %% becomes %
-local lquoted = P("%[") -- test '%[test]%' test : resolves to test with escaped "'s
-local rquoted = P("]%") --
-local lquotedq = P("%(") -- test %(test)% test : resolves to 'test' with escaped "'s
-local rquotedq = P(")%") --
-
-local escape = double / '%%'
-local nosingle = single / ''
-local nodouble = double / ''
-local nolquoted = lquoted / ''
-local norquoted = rquoted / ''
-local nolquotedq = lquotedq / ''
-local norquotedq = rquotedq / ''
-
-local noloptional = P("%?") / ''
-local noroptional = P("?%") / ''
-local nomoptional = P(":") / ''
-
-
-local args = Carg(1) * Carg(2) * Carg(3)
-local key = nosingle * ((C((1-nosingle )^1) * args) / replacekey ) * nosingle
-local quoted = nolquotedq * ((C((1-norquotedq )^1) * args) / replacekeyquoted ) * norquotedq
-local unquoted = nolquoted * ((C((1-norquoted )^1) * args) / replacekeyunquoted) * norquoted
-local optional = noloptional * ((C((1-nomoptional)^1) * nomoptional * C((1-noroptional)^1) * args) / replaceoptional) * noroptional
-local any = P(1)
+local function replaceformatted(l,m,r,t,how,recurse)
+ local v = t[r]
+ return v and formatters[l](v)
+end
- replacer = Cs((unquoted + quoted + escape + optional + key + any)^0)
+local single = P("%") -- test %test% test : resolves test
+local double = P("%%") -- test 10%% test : %% becomes %
+local lquoted = P("%[") -- test '%[test]%' test : resolves to test with escaped "'s
+local rquoted = P("]%") --
+local lquotedq = P("%(") -- test %(test)% test : resolves to 'test' with escaped "'s
+local rquotedq = P(")%") --
+
+local escape = double / '%%'
+local nosingle = single / ''
+local nodouble = double / ''
+local nolquoted = lquoted / ''
+local norquoted = rquoted / ''
+local nolquotedq = lquotedq / ''
+local norquotedq = rquotedq / ''
+
+local nolformatted = P(":") / "%%"
+local norformatted = P(":") / ""
+
+local noloptional = P("%?") / ''
+local noroptional = P("?%") / ''
+local nomoptional = P(":") / ''
+
+local args = Carg(1) * Carg(2) * Carg(3)
+local key = nosingle * ((C((1-nosingle)^1) * args) / replacekey) * nosingle
+local quoted = nolquotedq * ((C((1-norquotedq)^1) * args) / replacekeyquoted) * norquotedq
+local unquoted = nolquoted * ((C((1-norquoted)^1) * args) / replacekeyunquoted) * norquoted
+local optional = noloptional * ((C((1-nomoptional)^1) * nomoptional * C((1-noroptional)^1) * args) / replaceoptional) * noroptional
+local formatted = nosingle * ((Cs(nolformatted * (1-norformatted )^1) * norformatted * C((1-nosingle)^1) * args) / replaceformatted) * nosingle
+local any = P(1)
+
+ replacer = Cs((unquoted + quoted + formatted + escape + optional + key + any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
@@ -171,12 +181,16 @@ local function replace(str,mapping,how,recurse)
end
-- print(replace("test '%[x]%' test",{ x = [[a 'x'  a]] }))
+-- print(replace("test '%x%' test",{ x = [[a "x"  a]] }))
+-- print(replace([[test "%[x]%" test]],{ x = [[a "x"  a]] }))
-- print(replace("test '%[x]%' test",{ x = true }))
-- print(replace("test '%[x]%' test",{ x = [[a 'x'  a]], y = "oeps" },'sql'))
-- print(replace("test '%[x]%' test",{ x = [[a '%y%'  a]], y = "oeps" },'sql',true))
-- print(replace([[test %[x]% test]],{ x = [[a "x"  a]]}))
-- print(replace([[test %(x)% test]],{ x = [[a "x"  a]]}))
-- print(replace([[convert %?x: -x "%x%" ?% %?y: -y "%y%" ?%]],{ x = "yes" }))
+-- print(replace("test %:0.3N:x% test",{ x = 123.45 }))
+-- print(replace("test %:0.3N:x% test",{ x = 12345 }))
templates.replace = replace
diff --git a/Master/texmf-dist/tex/context/base/mkiv/util-zip.lua b/Master/texmf-dist/tex/context/base/mkiv/util-zip.lua
new file mode 100644
index 00000000000..f87e391a181
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mkiv/util-zip.lua
@@ -0,0 +1,563 @@
+if not modules then modules = { } end modules ['util-zip'] = {
+ version = 1.001,
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This module is mostly meant for relative simple zip and unzip tasks. We can read
+-- and write zip files but with limitations. Performance is quite good and it makes
+-- us independent of zip tools, which (for some reason) are not always installed.
+--
+-- This is an lmtx module and at some point will be lmtx only but for a while we
+-- keep some hybrid functionality.
+
+local type, tostring, tonumber = type, tostring, tonumber
+local sort = table.sort
+
+local find, format, sub, gsub = string.find, string.format, string.sub, string.gsub
+local osdate, ostime, osclock = os.date, os.time, os.clock
+local ioopen = io.open
+local loaddata, savedata = io.loaddata, io.savedata
+local filejoin, isdir, dirname, mkdirs = file.join, lfs.isdir, file.dirname, dir.mkdirs
+
+local files = utilities.files
+local openfile = files.open
+local closefile = files.close
+local readstring = files.readstring
+local readcardinal2 = files.readcardinal2le
+local readcardinal4 = files.readcardinal4le
+local setposition = files.setposition
+local getposition = files.getposition
+
+local band = bit32.band
+local rshift = bit32.rshift
+local lshift = bit32.lshift
+
+local decompress, expandsize, calculatecrc
+
+-- if flate then
+--
+-- decompress = flate.flate_decompress
+-- calculatecrc = flate.update_crc32
+--
+-- else
+
+ local zlibdecompress = zlib.decompress
+ local zlibexpandsize = zlib.expandsize
+ local zlibchecksum = zlib.crc32
+
+ decompress = function(source)
+ return zlibdecompress(source,-15) -- auto
+ end
+
+ expandsize = zlibexpandsize and function(source,targetsize)
+ return zlibexpandsize(source,targetsize,-15) -- auto
+ end or decompress
+
+ calculatecrc = function(buffer,initial)
+ return zlibchecksum(initial or 0,buffer)
+ end
+
+-- end
+
+local zipfiles = { }
+utilities.zipfiles = zipfiles
+
+local openzipfile, closezipfile, unzipfile, foundzipfile, getziphash, getziplist do
+
+ function openzipfile(name)
+ return {
+ name = name,
+ handle = openfile(name,0),
+ }
+ end
+
+ local function collect(z)
+ if not z.list then
+ local list = { }
+ local hash = { }
+ local position = 0
+ local index = 0
+ local handle = z.handle
+ while true do
+ setposition(handle,position)
+ local signature = readstring(handle,4)
+ if signature == "PK\3\4" then
+ -- [local file header 1]
+ -- [encryption header 1]
+ -- [file data 1]
+ -- [data descriptor 1]
+ local version = readcardinal2(handle)
+ local flag = readcardinal2(handle)
+ local method = readcardinal2(handle)
+ local filetime = readcardinal2(handle)
+ local filedate = readcardinal2(handle)
+ local crc32 = readcardinal4(handle)
+ local compressed = readcardinal4(handle)
+ local uncompressed = readcardinal4(handle)
+ local namelength = readcardinal2(handle)
+ local extralength = readcardinal2(handle)
+ local filename = readstring(handle,namelength)
+ local descriptor = band(flag,8) ~= 0
+ local encrypted = band(flag,1) ~= 0
+ local acceptable = method == 0 or method == 8
+ -- 30 bytes of header including the signature
+ local skipped = 0
+ local size = 0
+ if encrypted then
+ size = readcardinal2(handle)
+ skipbytes(size)
+ skipped = skipped + size + 2
+ skipbytes(8)
+ skipped = skipped + 8
+ size = readcardinal2(handle)
+ skipbytes(size)
+ skipped = skipped + size + 2
+ size = readcardinal4(handle)
+ skipbytes(size)
+ skipped = skipped + size + 4
+ size = readcardinal2(handle)
+ skipbytes(size)
+ skipped = skipped + size + 2
+ end
+ position = position + 30 + namelength + extralength + skipped
+ if descriptor then
+ setposition(handle,position + compressed)
+ crc32 = readcardinal4(handle)
+ compressed = readcardinal4(handle)
+ uncompressed = readcardinal4(handle)
+ end
+ if acceptable then
+ index = index + 1
+ local data = {
+ filename = filename,
+ index = index,
+ position = position,
+ method = method,
+ compressed = compressed,
+ uncompressed = uncompressed,
+ crc32 = crc32,
+ encrypted = encrypted,
+ }
+ hash[filename] = data
+ list[index] = data
+ else
+ -- maybe a warning when encrypted
+ end
+ position = position + compressed
+ else
+ break
+ end
+ z.list = list
+ z.hash = hash
+ end
+ end
+ end
+
+ function getziplist(z)
+ local list = z.list
+ if not list then
+ collect(z)
+ end
+ return z.list
+ end
+
+ function getziphash(z)
+ local hash = z.hash
+ if not hash then
+ collect(z)
+ end
+ return z.hash
+ end
+
+ function foundzipfile(z,name)
+ return getziphash(z)[name]
+ end
+
+ function closezipfile(z)
+ local f = z.handle
+ if f then
+ closefile(f)
+ z.handle = nil
+ end
+ end
+
+ function unzipfile(z,filename,check)
+ local hash = z.hash
+ if not hash then
+ hash = zipfiles.hash(z)
+ end
+ local data = hash[filename] -- normalize
+ if not data then
+ -- lower and cleanup
+ -- only name
+ end
+ if data then
+ local handle = z.handle
+ local position = data.position
+ local compressed = data.compressed
+ if compressed > 0 then
+ setposition(handle,position)
+ local result = readstring(handle,compressed)
+ if data.method == 8 then
+ if expandsize then
+ result = expandsize(result,data.uncompressed)
+ else
+ result = decompress(result)
+ end
+ end
+ if check and data.crc32 ~= calculatecrc(result) then
+ print("checksum mismatch")
+ return ""
+ end
+ return result
+ else
+ return ""
+ end
+ end
+ end
+
+ zipfiles.open = openzipfile
+ zipfiles.close = closezipfile
+ zipfiles.unzip = unzipfile
+ zipfiles.hash = getziphash
+ zipfiles.list = getziplist
+ zipfiles.found = foundzipfile
+
+end
+
+if xzip then -- flate then do
+
+ local writecardinal1 = files.writebyte
+ local writecardinal2 = files.writecardinal2le
+ local writecardinal4 = files.writecardinal4le
+
+ local logwriter = logs.writer
+
+ local globpattern = dir.globpattern
+-- local compress = flate.flate_compress
+-- local checksum = flate.update_crc32
+ local compress = xzip.compress
+ local checksum = xzip.crc32
+
+ -- local function fromdostime(dostime,dosdate)
+ -- return ostime {
+ -- year = (dosdate >> 9) + 1980, -- 25 .. 31
+ -- month = (dosdate >> 5) & 0x0F, -- 21 .. 24
+ -- day = (dosdate ) & 0x1F, -- 16 .. 20
+ -- hour = (dostime >> 11) , -- 11 .. 15
+ -- min = (dostime >> 5) & 0x3F, -- 5 .. 10
+ -- sec = (dostime ) & 0x1F, -- 0 .. 4
+ -- }
+ -- end
+ --
+ -- local function todostime(time)
+ -- local t = osdate("*t",time)
+ -- return
+ -- ((t.year - 1980) << 9) + (t.month << 5) + t.day,
+ -- (t.hour << 11) + (t.min << 5) + (t.sec >> 1)
+ -- end
+
+ local function fromdostime(dostime,dosdate)
+ return ostime {
+ year = rshift(dosdate, 9) + 1980, -- 25 .. 31
+ month = band(rshift(dosdate, 5), 0x0F), -- 21 .. 24
+ day = band( (dosdate ), 0x1F), -- 16 .. 20
+ hour = band(rshift(dostime,11) ), -- 11 .. 15
+ min = band(rshift(dostime, 5), 0x3F), -- 5 .. 10
+ sec = band( (dostime ), 0x1F), -- 0 .. 4
+ }
+ end
+
+ local function todostime(time)
+ local t = osdate("*t",time)
+ return
+ lshift(t.year - 1980, 9) + lshift(t.month,5) + t.day,
+ lshift(t.hour ,11) + lshift(t.min ,5) + rshift(t.sec,1)
+ end
+
+ local function openzip(filename,level,comment,verbose)
+ local f = ioopen(filename,"wb")
+ if f then
+ return {
+ filename = filename,
+ handle = f,
+ list = { },
+ level = tonumber(level) or 3,
+ comment = tostring(comment),
+ verbose = verbose,
+ uncompressed = 0,
+ compressed = 0,
+ }
+ end
+ end
+
+ local function writezip(z,name,data,level,time)
+ local f = z.handle
+ local list = z.list
+ local level = tonumber(level) or z.level or 3
+ local method = 8
+ local zipped = compress(data,level)
+ local checksum = checksum(data)
+ local verbose = z.verbose
+ --
+ if not zipped then
+ method = 0
+ zipped = data
+ end
+ --
+ local start = f:seek()
+ local compressed = #zipped
+ local uncompressed = #data
+ --
+ z.compressed = z.compressed + compressed
+ z.uncompressed = z.uncompressed + uncompressed
+ --
+ if verbose then
+ local pct = 100 * compressed/uncompressed
+ if pct >= 100 then
+ logwriter(format("%10i %s",uncompressed,name))
+ else
+ logwriter(format("%10i %02.1f %s",uncompressed,pct,name))
+ end
+ end
+ --
+ f:write("\x50\x4b\x03\x04") -- PK.. 0x04034b50
+ --
+ writecardinal2(f,0) -- minimum version
+ writecardinal2(f,0) -- flag
+ writecardinal2(f,method) -- method
+ writecardinal2(f,0) -- time
+ writecardinal2(f,0) -- date
+ writecardinal4(f,checksum) -- crc32
+ writecardinal4(f,compressed) -- compressed
+ writecardinal4(f,uncompressed) -- uncompressed
+ writecardinal2(f,#name) -- namelength
+ writecardinal2(f,0) -- extralength
+ --
+ f:write(name) -- name
+ f:write(zipped)
+ --
+ list[#list+1] = { #zipped, #data, name, checksum, start, time or 0 }
+ end
+
+ local function closezip(z)
+ local f = z.handle
+ local list = z.list
+ local comment = z.comment
+ local verbose = z.verbose
+ local count = #list
+ local start = f:seek()
+ --
+ for i=1,count do
+ local l = list[i]
+ local compressed = l[1]
+ local uncompressed = l[2]
+ local name = l[3]
+ local checksum = l[4]
+ local start = l[5]
+ local time = l[6]
+ local date, time = todostime(time)
+ f:write('\x50\x4b\x01\x02')
+ writecardinal2(f,0) -- version made by
+ writecardinal2(f,0) -- version needed to extract
+ writecardinal2(f,0) -- flags
+ writecardinal2(f,8) -- method
+ writecardinal2(f,time) -- time
+ writecardinal2(f,date) -- date
+ writecardinal4(f,checksum) -- crc32
+ writecardinal4(f,compressed) -- compressed
+ writecardinal4(f,uncompressed) -- uncompressed
+ writecardinal2(f,#name) -- namelength
+ writecardinal2(f,0) -- extralength
+ writecardinal2(f,0) -- commentlength
+ writecardinal2(f,0) -- nofdisks -- ?
+ writecardinal2(f,0) -- internal attr (type)
+ writecardinal4(f,0) -- external attr (mode)
+ writecardinal4(f,start) -- local offset
+ f:write(name) -- name
+ end
+ --
+ local stop = f:seek()
+ local size = stop - start
+ --
+ f:write('\x50\x4b\x05\x06')
+ writecardinal2(f,0) -- disk
+ writecardinal2(f,0) -- disks
+ writecardinal2(f,count) -- entries
+ writecardinal2(f,count) -- entries
+ writecardinal4(f,size) -- dir size
+ writecardinal4(f,start) -- dir offset
+ if type(comment) == "string" and comment ~= "" then
+ writecardinal2(f,#comment) -- comment length
+ f:write(comment) -- comemnt
+ else
+ writecardinal2(f,0)
+ end
+ --
+ if verbose then
+ local compressed = z.compressed
+ local uncompressed = z.uncompressed
+ local filename = z.filename
+ --
+ local pct = 100 * compressed/uncompressed
+ logwriter("")
+ if pct >= 100 then
+ logwriter(format("%10i %s",uncompressed,filename))
+ else
+ logwriter(format("%10i %02.1f %s",uncompressed,pct,filename))
+ end
+ end
+ --
+ f:close()
+ end
+
+ local function zipdir(zipname,path,level,verbose)
+ if type(zipname) == "table" then
+ verbose = zipname.verbose
+ level = zipname.level
+ path = zipname.path
+ zipname = zipname.zipname
+ end
+ if not zipname or zipname == "" then
+ return
+ end
+ if not path or path == "" then
+ path = "."
+ end
+ if not isdir(path) then
+ return
+ end
+ path = gsub(path,"\\+","/")
+ path = gsub(path,"/+","/")
+ local list = { }
+ local count = 0
+ globpattern(path,"",true,function(name,size,time)
+ count = count + 1
+ list[count] = { name, time }
+ end)
+ sort(list,function(a,b)
+ return a[1] < b[1]
+ end)
+ local zipf = openzip(zipname,level,comment,verbose)
+ if zipf then
+ local p = #path + 2
+ for i=1,count do
+ local li = list[i]
+ local name = li[1]
+ local time = li[2]
+ local data = loaddata(name)
+ local name = sub(name,p,#name)
+ writezip(zipf,name,data,level,time,verbose)
+ end
+ closezip(zipf)
+ end
+ end
+
+ local function unzipdir(zipname,path,verbose)
+ if type(zipname) == "table" then
+ verbose = zipname.verbose
+ path = zipname.path
+ zipname = zipname.zipname
+ end
+ if not zipname or zipname == "" then
+ return
+ end
+ if not path or path == "" then
+ path = "."
+ end
+ local z = openzipfile(zipname)
+ if z then
+ local list = getziplist(z)
+ if list then
+ local total = 0
+ local count = #list
+ local step = number.idiv(count,10)
+ local done = 0
+ local steps = verbose == "steps"
+ local time = steps and osclock()
+ for i=1,count do
+ local l = list[i]
+ local n = l.filename
+ local d = unzipfile(z,n) -- true for check
+ if d then
+ local p = filejoin(path,n)
+ if mkdirs(dirname(p)) then
+ if steps then
+ total = total + #d
+ done = done + 1
+ if done >= step then
+ done = 0
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",i,count,total,osclock()-time))
+ end
+ elseif verbose then
+ logwriter(n)
+ end
+ savedata(p,d)
+ end
+ else
+ logwriter(format("problem with file %s",n))
+ end
+ end
+ if steps then
+ logwriter(format("%4i files of %4i done, %10i bytes, %0.3f seconds",count,count,total,osclock()-time))
+ end
+ closezipfile(z)
+ return true
+ else
+ closezipfile(z)
+ end
+ end
+ end
+
+ zipfiles.zipdir = zipdir
+ zipfiles.unzipdir = unzipdir
+
+end
+
+zipfiles.gunzipfile = gzip.load
+
+-- if flate then
+--
+-- local streams = utilities.streams
+-- local openfile = streams.open
+-- local closestream = streams.close
+-- local setposition = streams.setposition
+-- local getsize = streams.size
+-- local readcardinal4 = streams.readcardinal4le
+-- local getstring = streams.getstring
+-- local decompress = flate.gz_decompress
+--
+-- -- id1=1 id2=1 method=1 flags=1 mtime=4(le) extra=1 os=1
+-- -- flags:8 comment=...<nul> flags:4 name=...<nul> flags:2 extra=...<nul> flags:1 crc=2
+-- -- data:?
+-- -- crc=4 size=4
+--
+-- function zipfiles.gunzipfile(filename)
+-- local strm = openfile(filename)
+-- if strm then
+-- setposition(strm,getsize(strm) - 4 + 1)
+-- local size = readcardinal4(strm)
+-- local data = decompress(getstring(strm),size)
+-- closestream(strm)
+-- return data
+-- end
+-- end
+--
+-- elseif gzip then
+--
+-- local openfile = gzip.open
+--
+-- function zipfiles.gunzipfile(filename)
+-- local g = openfile(filename,"rb")
+-- if g then
+-- local d = g:read("*a")
+-- d:close()
+-- return d
+-- end
+-- end
+--
+-- end
+
+return zipfiles
diff --git a/Master/texmf-dist/tex/context/filenames.pdf b/Master/texmf-dist/tex/context/filenames.pdf
new file mode 100644
index 00000000000..6e1f07bf021
--- /dev/null
+++ b/Master/texmf-dist/tex/context/filenames.pdf
Binary files differ
diff --git a/Master/texmf-dist/tex/context/filenames.tex b/Master/texmf-dist/tex/context/filenames.tex
new file mode 100644
index 00000000000..bf40b64453e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/filenames.tex
@@ -0,0 +1,119 @@
+% language=uk
+
+\usemodule[article-basic]
+\usemodule[abbreviations-logos]
+
+\setupheader[state=high]
+
+\starttext
+
+\starttitle[title=Filenames]
+
+The \CONTEXT\ distribution follows a rather strict organisation. Originally
+all files that implemented macros had names using the pattern:
+
+\starttabulate[|Tw(10em)||]
+\FL
+\NC xxxx-xxx.tex \NC \TEX\ file \NC \NR
+\NC mp-xxxx.mp \NC \METAPOST\ file \NC \NR
+\LL
+\stoptabulate
+
+You can still find files that conform to these patterns but the organization
+evolved. The \type {tex} suffix is now normally used just for documents.
+
+Styles and modules can have names of any length, and can be recognized by their
+prefix:
+
+\starttabulate[|Tw(10em)||]
+\FL
+\NC s-aaaa.tex \NC style (rendering related) \NC \NR
+\NC m-aaaaaa.tex \NC module (functionality related) \NC \NR
+\NC x-aaaaa.tex \NC xml module (functionality related) \NC \NR
+\LL
+\stoptabulate
+
+\CONTEXT\ \MKII, the frozen version for \PDFTEX\ and \XETEX, uses names like:
+
+\starttabulate[|Tw(10em)||]
+\FL
+\NC context.mkii \NC the main \TEX\ file \NC \NR
+\NC cont-xx.mkii \NC an interface specific \TEX\ file \NC \NR
+\NC xxxx-xxx.mkii \NC \TEX\ file \NC \NR
+\ML
+\NC mp-xxxx.mpii \NC \METAPOST\ file \NC \NR
+\NC metafun.mpii \NC the main \METAFUN\ file \NC \NR
+\LL
+\stoptabulate
+
+\CONTEXT\ \MKIV, the current version, has files with names like:
+
+\starttabulate[|Tw(10em)||]
+\FL
+\NC context.mkiv \NC the main \TEX\ file \NC \NR
+\NC cont-xx.mkiv \NC an interface specific \TEX\ file \NC \NR
+\NC xxxx-xxx.mkiv \NC \TEX\ file \NC \NR
+\NC xxxx-xxx.mkvi \NC \TEX\ file with named parameters \NC \NR
+\NC xxxx-xxx.mkix \NC file with \LMX\ template \NC \NR
+\NC xxxx-xxx.mkxi \NC file with \LMX\ template with named parameters \NC \NR
+\NC xxxx-xxx.lua \NC a file with \LUA\ code \NC \NR
+\NC xxxx-xxx.lfg \NC so called font goodie \LUA\ files \NC \NR
+\ML
+\NC metafun.mpiv \NC the main \METAFUN\ file \NC \NR
+\NC minifun.mpiv \NC a subset of \METAFUN\ \NC \NR
+\NC mp-xxxx.mpiv \NC \METAPOST\ file \NC \NR
+\LL
+\stoptabulate
+
+There are more suffixes used, like \type {tua} and \type {tuc} for multipass
+jobdata, and \type {log} for log files. In the cache tree you can run into \type
+{luv}, \type {lui}, \type {luj} and \type {lum} for startup data,
+\type {tma} for \LUA\ cache files, \type {tmb} for \LUAJITTEX\ bytecode, \type
+{tmc} for \LUATEX {bytecode} and \type {tmd} for \LUAMETATEX\ bytecode, but you
+can forget about them.
+
+There can be files with \type {-imp-} in the name: these relate to other files with
+a similar name.
+
+The follow up on \MKIV\ is called \LMTX\ (or MkXL?) and is compatible with \MKIV: it uses,
+at least now, mostly the same code. But, as it depends on \LUAMETATEX\ it also
+has some different internals. Therefore you will find some additional files:
+
+\starttabulate[|Tw(10em)||]
+\FL
+\NC context.mkxl \NC the main \TEX\ file \NC \NR
+\NC cont-xx.mkxl \NC an interface specific \TEX\ file \NC \NR
+\NC xxxx-xxx.mkxl \NC \TEX\ file \NC \NR
+\NC xxxx-xxx.mklx \NC \TEX\ file with named parameters \NC \NR
+\ML
+\NC metafun.mpxl \NC the main \METAFUN\ file \NC \NR
+\NC minifun.mpxl \NC a subset of \METAFUN\ \NC \NR
+\NC mp-xxxx.mpxl \NC \METAPOST\ file \NC \NR
+\LL
+\stoptabulate
+
+This means that a file \type {xxxx-xxx} can be present with any of the \type
+{mk..} suffixes. In the standard distribution the \MKII\ and \MKIV\ files have
+their own path (directory), and \LMTX\ only ships what it needs.
+
+This somewhat complicated setup is needed in order to support both \LUATEX\ and
+\LUAMETATEX\ system. The more \LUAMETATEX\ diverges from \LUATEX, the more the
+codebase will be split so eventually we might end up with \MKII, \MKIV\ and \LMTX\
+as more or less independent versions. We try to share the \LUA\ code as much as
+possible, also because some components are generic.
+
+The name pattern \type {xxxx-} groups the files in categories. These are also
+referred to from the interface definitions. Examples of categories are \type
+{syst} for system modules that define various low level support macros and
+mechanisms. The user interface is handled by modules in the \type {mult}
+namespace. The \type {supp} modules layer on top of that and provide more
+helpers. The \type {font} and \type {type} modules deal with fonts, \type {lang}
+handles language support. The \type {strc} modules implement structural
+components, \type {tabl} does tables and \type {page} handles the layout.
+Specialized categories like \type {mlib}, \type {meta} and \type {grph} are for
+graphics, and \type {publ} is used for the publication (bibliography) subsystem.
+Just to give you an idea.
+
+\stoptitle
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-cambria.mkiv b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-cambria.mkiv
index 06781a8d040..0ccb4409e3a 100644
--- a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-cambria.mkiv
+++ b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-cambria.mkiv
@@ -39,7 +39,7 @@
\stoptypescript
% We load a goodies file that will apply a patch to the font. As a demonstration
- % we apply the patch when caching as as when scaling which is why we also specify
+ % we apply the patch when caching and when scaling which is why we also specify
% the goodies file with the name.
\starttypescript [\s!math] [cambria,cambria-m,cambria-a] [\s!name]
diff --git a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-cow.mkiv b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-cow.mkiv
index f93e36428c0..5194c70d94e 100644
--- a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-cow.mkiv
+++ b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-cow.mkiv
@@ -45,8 +45,10 @@
\stoptypescript
\starttypescript [all] [cow,sheep]
- \definefontsynonym [Cows] [koeielett]
- \definefontsynonym [CowsContour] [koeielett-contour]
+ \definefontsynonym [Cows] [koeielett]% tfm
+ % \definefontsynonym [Cows] [koeieletters]% afm
+ \definefontsynonym [CowsContour] [koeielett-contour]% tfm
+ % \definefontsynonym [CowsContour] [koeieletters-contour]% afm
\definefontsynonym [CowsLogo] [koeielogos]
\definefontsynonym [CowsLogoContour] [koeielogos-contour]
\definefontsynonym [CowsMathRoman] [koeielett]
@@ -56,7 +58,7 @@
\stoptypescript
\starttypescript [all] [sheep]
- \definefontsynonym [Sheep] [koeielett]
+ \definefontsynonym [Sheep] [koeielettters]
\definefontsynonym [SheepContour] [koeielett-contour]
\definefontsynonym [SheepLogo] [koeielogos]
\definefontsynonym [SheepLogoContour] [koeielogos-contour]
diff --git a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-dejavu.mkiv b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-dejavu.mkiv
index 3af9d2d1768..ee1e9f3831e 100644
--- a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-dejavu.mkiv
+++ b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-dejavu.mkiv
@@ -43,8 +43,8 @@
\starttypescript [\s!math][dejavu][\s!name]
\loadfontgoodies[dejavu-math]
- \definefontsynonym[\s!MathRoman] [file:texgyredejavu-math][\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=dejavu-math]
- \definefontsynonym[\s!MathRomanBold][file:texgyredejavu-math][\s!features={\s!math\mathsizesuffix,dejavu-math-bold,mathextra},\s!goodies=schola-math]
+ \definefontsynonym[\s!MathRoman] [\s!file:texgyredejavu-math][\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=dejavu-math]
+ \definefontsynonym[\s!MathRomanBold][\s!file:texgyredejavu-math][\s!features={\s!math\mathsizesuffix,dejavu-math-bold,mathextra},\s!goodies=dejavu-math]
\stoptypescript
\starttypescript[dejavu]
diff --git a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-ebgaramond.mkiv b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-ebgaramond.mkiv
index bba07f41d13..5cafe503f1e 100644
--- a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-ebgaramond.mkiv
+++ b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-ebgaramond.mkiv
@@ -13,6 +13,19 @@
% Why so many features ... dead slow too
+% renewed:
+%
+% Regular
+% Italic
+% Medium
+% MediumItalic
+% SemiBold
+% SemiBoldItalic
+% Bold
+% BoldItalic
+% ExtraBold
+% ExtraBoldItalic
+
\definefontfeature
[eb-garamond-normal]
[default]
@@ -29,17 +42,32 @@
\starttypescriptcollection[ebgaramond]
+ % \starttypescript [serif] [ebgaramond]
+ % \loadfontgoodies[ebgaramond]
+ % \setups[font:fallback:serif]
+ % \definefontsynonym [Serif] [file:ebgaramond-regular] [features=eb-garamond-normal]
+ % \definefontsynonym [SerifItalic] [file:ebgaramond-italic] [features=eb-garamond-normal]
+ % \definefontsynonym [SerifBold] [file:ebgaramond-regular] [features=eb-garamond-normal] % there is no bold
+ % \definefontsynonym [SerifCaps] [Serif] [features=eb-garamond-smallcaps]
+ % \stoptypescript
+
+ % \starttypescript[ebgaramond]
+ % \definetypeface [ebgaramond] [rm] [serif] [ebgaramond] [default] [designsize=auto]
+ % \definetypeface [ebgaramond] [tt] [mono] [dejavu] [default] [rscale=0.8] % rather arbitrary but seldom mixed anyway
+ % \definetypeface [ebgaramond] [mm] [math] [bonum] [default] [rscale=0.8] % rather arbitrary but seldom mixed anyway
+ % \stoptypescript
+
\starttypescript [serif] [ebgaramond]
- \loadfontgoodies[ebgaramond]
\setups[font:fallback:serif]
- \definefontsynonym [Serif] [file:ebgaramond-regular] [features=eb-garamond-normal]
- \definefontsynonym [SerifItalic] [file:ebgaramond-italic] [features=eb-garamond-normal]
- \definefontsynonym [SerifBold] [file:ebgaramond-regular] [features=eb-garamond-normal] % there is no bold
- \definefontsynonym [SerifCaps] [Serif] [features=eb-garamond-smallcaps]
+ \definefontsynonym [Serif] [file:ebgaramond-regular] [features=eb-garamond-normal]
+ \definefontsynonym [SerifItalic] [file:ebgaramond-italic] [features=eb-garamond-normal]
+ \definefontsynonym [SerifBold] [file:ebgaramond-bold] [features=eb-garamond-normal]
+ \definefontsynonym [SerifBoldItalic][file:ebgaramond-bolditalic][features=eb-garamond-normal]
+ \definefontsynonym [SerifCaps] [Serif] [features=eb-garamond-smallcaps]
\stoptypescript
\starttypescript[ebgaramond]
- \definetypeface [ebgaramond] [rm] [serif] [ebgaramond] [default] [designsize=auto]
+ \definetypeface [ebgaramond] [rm] [serif] [ebgaramond] [default]
\definetypeface [ebgaramond] [tt] [mono] [dejavu] [default] [rscale=0.8] % rather arbitrary but seldom mixed anyway
\definetypeface [ebgaramond] [mm] [math] [bonum] [default] [rscale=0.8] % rather arbitrary but seldom mixed anyway
\stoptypescript
diff --git a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-libertinus.mkiv b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-libertinus.mkiv
index 1ceda873784..dc9c23fe2a3 100644
--- a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-libertinus.mkiv
+++ b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-libertinus.mkiv
@@ -12,7 +12,12 @@
%C details.
%D This typescript (submitted by by Henri Menke) is a follow up on libertine
-%D which is no longer maintained cq.\ developed further.
+%D which is no longer maintained cq.\ developed further. We probably need to
+%D come up with some goodie file to fix a couple of things in the math font.
+
+% \definefontfeature[math-text] [collapseitalics=yes]
+% \definefontfeature[math-script] [collapseitalics=yes]
+% \definefontfeature[math-scriptscript][collapseitalics=yes]
\starttypescriptcollection[libertinus]
diff --git a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-opendyslexic.mkiv b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-opendyslexic.mkiv
index c3b8a3ef2b5..bdae0e2614f 100644
--- a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-opendyslexic.mkiv
+++ b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-opendyslexic.mkiv
@@ -11,8 +11,38 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D It's kind of funny that the term \quote {dyslexic} itself is hard to read and I
+%D (not being dyslexic) need to double check it.
+%D
+%D As often a sans is adviced: I personally think that Optima Nova is a quite good
+%D choice but it doesn't come for free.
+
+% \enabledirectives[fonts.features.combine]
+%
+% \usetypescriptfile[opendyslexic]
+%
+% \starttypescript[opendyslexic-new]
+% \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [features=opendyslexic-new]
+% \definetypeface [\typescriptone] [ss] [serif] [\typescriptone] [default] [features=opendyslexic-new]
+% \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default]
+% \definetypeface [\typescriptone] [mm] [math] [xits] [default]
+% \stoptypescript
+%
+% \setupbodyfont
+% [opendyslexic-new,10pt]
+%
+% \starttext
+% \input tufte
+% \stoptext
+
+% \setupinterlinespace[line=1.535\bodyfontsize] % older fonts have a weird exheight
+
\starttypescriptcollection[opendyslexic]
+ \definefontfeature
+ [opendyslexic-new]
+ [spacing={0.4+0.2-0.1}]
+
\starttypescript [\s!serif] [opendyslexic] [\s!name]
\setups[\s!font:\s!fallback:\s!serif]
\definefontsynonym [\s!Serif] [\s!file:opendyslexic-regular.otf] [\s!features=\s!default]
@@ -21,7 +51,13 @@
\definefontsynonym [\s!SerifBoldItalic] [\s!file:opendyslexic-bolditalic.otf] [\s!features=\s!default]
\stoptypescript
- \starttypescript [\s!sans] [opendyslexic] [\s!name]
+ \starttypescript [\s!serif] [opendyslexic-new] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [\s!file:opendyslexic3-regular.ttf] [\s!features={opendyslexic-new,\s!default}]
+ \definefontsynonym [\s!SerifBold] [\s!file:opendyslexic3-bold.ttf] [\s!features={opendyslexic-new,\s!default}]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [opendyslexic,opendyslexic-new] [\s!name]
\setups[\s!font:\s!fallback:\s!sans]
\definefontsynonym [\s!Sans] [\s!file:opendyslexicalta-regular.otf] [\s!features=\s!default]
\definefontsynonym [\s!SansBold] [\s!file:opendyslexicalta-bold.otf] [\s!features=\s!default]
@@ -29,16 +65,19 @@
\definefontsynonym [\s!SansBoldItalic] [\s!file:opendyslexicalta-bolditalic.otf] [\s!features=\s!default]
\stoptypescript
- \starttypescript [\s!mono] [opendyslexic] [\s!name]
+ \starttypescript [\s!mono] [opendyslexic,opendyslexic-new] [\s!name]
\setups[\s!font:\s!fallback:\s!mono]
- \definefontsynonym [\s!Mono] [\s!file:opendyslexicmono-regular.otf] [\s!features=\s!none]
+ \definefontsynonym [\s!Mono] [\s!file:opendyslexicmono-regular.otf] [\s!features=\s!none]
\stoptypescript
- \starttypescript[opendyslexic]
- \definetypeface [opendyslexic] [\s!rm] [\s!serif] [opendyslexic] [\s!default]
- \definetypeface [opendyslexic] [\s!ss] [\s!sans] [opendyslexic] [\s!default]
- \definetypeface [opendyslexic] [\s!tt] [\s!mono] [opendyslexic] [\s!default]% [rscale=1.065]
- \definetypeface [opendyslexic] [\s!mm] [\s!math] [xits] [\s!default]% [rscale=1.020]
+ % We now have more gyre fonts so maybe we should test with a less times look
+ % alike instead.
+
+ \starttypescript[opendyslexic,opendyslexic-new]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [\typescriptone] [\s!default]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [\typescriptone] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [\typescriptone] [\s!default]% [rscale=1.065]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [xits] [\s!default]% [rscale=1.020]
\stoptypescript
\stoptypescriptcollection
diff --git a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-plex.mkiv b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-plex.mkiv
index 02de4502223..4087cd64df5 100644
--- a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-plex.mkiv
+++ b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-plex.mkiv
@@ -132,14 +132,15 @@
% Here's Taco's variant as used in the ConTeXt Group Journal.
- \definefontfeature[plexwidened][extend=\luaexpr{1/0.85}] % An odd floating point number to correct monospace.
+ \definefontfeature[plexwidened] [extend=\luaexpr{1/0.85}] % An odd floating point number to correct monospace.
+ \definefontfeature[plexwideneddefault][default][extend=\luaexpr{1/0.85}] % An odd floating point number to correct monospace.
- \definetypescriptprefix [f:scplexserif] [\s!default,plexwidened]
- \definetypescriptprefix [f:scplexsans] [\s!default,plexwidened]
+ \definetypescriptprefix [f:scplexserif] [plexwideneddefault]
+ \definetypescriptprefix [f:scplexsans] [plexwideneddefault]
\definetypescriptprefix [f:scplexmono] [plexwidened]
- \definetypescriptprefix [f:scnarrowplexserif] [\s!default,plexwidened]
- \definetypescriptprefix [f:scnarrowplexsans] [\s!default,plexwidened]
+ \definetypescriptprefix [f:scnarrowplexserif] [plexwideneddefault]
+ \definetypescriptprefix [f:scnarrowplexsans] [plexwideneddefault]
\definetypescriptprefix [f:scnarrowplexmono] [plexwidened]
\starttypescript [\s!sans,\s!serif,\s!mono] [ibmplex-thin] [\s!name]
@@ -149,7 +150,7 @@
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!Bold] [\s!file:\typescriptprefix{n:plex\typescriptone}-text] [\s!features=\typescriptprefix{f:plex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!BoldItalic] [\s!file:\typescriptprefix{n:plex\typescriptone}-textitalic] [\s!features=\typescriptprefix{f:plex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Widened] [\s!file:\typescriptprefix{n:plex\typescriptone}-thin] [\s!features=\typescriptprefix{f:scplex\typescriptone}]
- \edefinefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
+ \definefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Caps] [\s!file:\typescriptprefix{n:plex\typescriptone}-thin] [\s!fallbacks=Fake\typescriptprefix{\typescriptone}Caps]
\stoptypescript
@@ -160,7 +161,7 @@
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!Bold] [\s!file:\typescriptprefix{n:plex\typescriptone}-medium] [\s!features=\typescriptprefix{f:plex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!BoldItalic] [\s!file:\typescriptprefix{n:plex\typescriptone}-mediumitalic] [\s!features=\typescriptprefix{f:plex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Widened] [\s!file:\typescriptprefix{n:plex\typescriptone}-extralight] [\s!features=\typescriptprefix{f:scplex\typescriptone}]
- \edefinefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
+ \definefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Caps] [\s!file:\typescriptprefix{n:plex\typescriptone}-extralight] [\s!fallbacks=Fake\typescriptprefix{\typescriptone}Caps]
\stoptypescript
@@ -171,7 +172,7 @@
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!Bold] [\s!file:\typescriptprefix{n:plex\typescriptone}-semibold] [\s!features=\typescriptprefix{f:plex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!BoldItalic] [\s!file:\typescriptprefix{n:plex\typescriptone}-semibolditalic] [\s!features=\typescriptprefix{f:plex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Widened] [\s!file:\typescriptprefix{n:plex\typescriptone}-light] [\s!features=\typescriptprefix{f:scplex\typescriptone}]
- \edefinefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
+ \definefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Caps] [\s!file:\typescriptprefix{n:plex\typescriptone}-light] [\s!fallbacks=Fake\typescriptprefix{\typescriptone}Caps]
\stoptypescript
@@ -182,7 +183,7 @@
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!Bold] [\s!file:\typescriptprefix{n:plex\typescriptone}-bold] [\s!features=\typescriptprefix{f:plex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!BoldItalic] [\s!file:\typescriptprefix{n:plex\typescriptone}-bolditalic] [\s!features=\typescriptprefix{f:plex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Widened] [\s!file:\typescriptprefix{n:plex\typescriptone}-regular] [\s!features=\typescriptprefix{f:scplex\typescriptone}]
- \edefinefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
+ \definefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Caps] [\s!file:\typescriptprefix{n:plex\typescriptone}-regular] [\s!fallbacks=Fake\typescriptprefix{\typescriptone}Caps]
\stoptypescript
@@ -195,7 +196,7 @@
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!Bold] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-text] [\s!features=\typescriptprefix{f:narrowplex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!BoldItalic] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-textitalic] [\s!features=\typescriptprefix{f:narrowplex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Widened] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-thin] [\s!features=\typescriptprefix{f:scnarrowplex\typescriptone}]
- \edefinefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
+ \definefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Caps] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-thin] [\s!fallbacks=Fake\typescriptprefix{\typescriptone}Caps]
\stoptypescript
@@ -206,7 +207,7 @@
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!Bold] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-medium] [\s!features=\typescriptprefix{f:narrowplex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!BoldItalic] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-mediumitalic] [\s!features=\typescriptprefix{f:narrowplex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Widened] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-extralight] [\s!features=\typescriptprefix{f:scnarrowplex\typescriptone}]
- \edefinefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
+ \definefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Caps] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-extralight] [\s!fallbacks=Fake\typescriptprefix{\typescriptone}Caps]
\stoptypescript
@@ -217,7 +218,7 @@
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!Bold] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-semibold] [\s!features=\typescriptprefix{f:narrowplex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!BoldItalic] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-semibolditalic] [\s!features=\typescriptprefix{f:narrowplex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Widened] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-light] [\s!features=\typescriptprefix{f:scnarrowplex\typescriptone}]
- \edefinefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
+ \definefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Caps] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-light] [\s!fallbacks=Fake\typescriptprefix{\typescriptone}Caps]
\stoptypescript
@@ -228,7 +229,7 @@
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!Bold] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-bold] [\s!features=\typescriptprefix{f:narrowplex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}\s!BoldItalic] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-bolditalic] [\s!features=\typescriptprefix{f:narrowplex\typescriptone}]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Widened] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-regular] [\s!features=\typescriptprefix{f:scnarrowplex\typescriptone}]
- \edefinefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
+ \definefontfallback[Fake\typescriptprefix{\typescriptone}Caps] [\typescriptprefix{\typescriptone}Widened] [0x0000-0xFFFF] [\s!rscale=0.85,method=uppercase]
\edefinefontsynonym [\typescriptprefix{\typescriptone}Caps] [\s!file:\typescriptprefix{n:narrowplex\typescriptone}-regular] [\s!fallbacks=Fake\typescriptprefix{\typescriptone}Caps]
\stoptypescript
diff --git a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-texgyre.mkiv b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-texgyre.mkiv
index 583da77c1a7..72d3b358844 100644
--- a/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-texgyre.mkiv
+++ b/Master/texmf-dist/tex/context/fonts/mkiv/type-imp-texgyre.mkiv
@@ -248,7 +248,7 @@
% \loadfontgoodies[texgyre]
% \definefontsynonym[\s!MathRoman][file:texgyre-termes-math-regular.otf][\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=texgyre]
\definefontsynonym[\s!MathRoman] [file:texgyretermes-math.otf][\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=termes-math]
- \definefontsynonym[\s!MathRomanBold][file:texgyretermes-math.otf][\s!features={\s!math\mathsizesuffix,termes-math-bold,mathextra},\s!goodies=schola-math]
+ \definefontsynonym[\s!MathRomanBold][file:texgyretermes-math.otf][\s!features={\s!math\mathsizesuffix,termes-math-bold,mathextra},\s!goodies=termes-math]
\stoptypescript
\stoptypescriptcollection
@@ -277,7 +277,7 @@
% \loadfontgoodies[texgyre]
% \definefontsynonym[\s!MathRoman][file:texgyre-pagella-math-regular.otf][\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=texgyre]
\definefontsynonym[\s!MathRoman] [file:texgyrepagella-math.otf][\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=pagella-math]
- \definefontsynonym[\s!MathRomanBold][file:texgyrepagella-math.otf][\s!features={\s!math\mathsizesuffix,pagella-math-bold,mathextra},\s!goodies=schola-math]
+ \definefontsynonym[\s!MathRomanBold][file:texgyrepagella-math.otf][\s!features={\s!math\mathsizesuffix,pagella-math-bold,mathextra},\s!goodies=pagella-math]
\stoptypescript
\stoptypescriptcollection
@@ -290,7 +290,7 @@
% \loadfontgoodies[texgyre]
% \definefontsynonym[\s!MathRoman][file:texgyre-bonum-math-regular.otf][\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=texgyre]
\definefontsynonym[\s!MathRoman] [file:texgyrebonum-math.otf][\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=bonum-math]
- \definefontsynonym[\s!MathRomanBold][file:texgyrebonum-math.otf][\s!features={\s!math\mathsizesuffix,bonum-math-bold,mathextra},\s!goodies=schola-math]
+ \definefontsynonym[\s!MathRomanBold][file:texgyrebonum-math.otf][\s!features={\s!math\mathsizesuffix,bonum-math-bold,mathextra},\s!goodies=bonum-math]
\stoptypescript
\stoptypescriptcollection
@@ -305,5 +305,3 @@
\stoptypescript
\stoptypescriptcollection
-
-
diff --git a/Master/texmf-dist/tex/context/interface/mkii/keys-cs.xml b/Master/texmf-dist/tex/context/interface/mkii/keys-cs.xml
index f4e65c527f7..3014b72d1f0 100644
--- a/Master/texmf-dist/tex/context/interface/mkii/keys-cs.xml
+++ b/Master/texmf-dist/tex/context/interface/mkii/keys-cs.xml
@@ -150,6 +150,7 @@
<cd:variable name='comment' value='komentar'/>
<cd:variable name='component' value='komponenta'/>
<cd:variable name='compressseparator' value='compressseparator'/>
+ <cd:variable name='compressstopper' value='compressstopper'/>
<cd:variable name='concept' value='koncept'/>
<cd:variable name='construction' value='construction'/>
<cd:variable name='content' value='obsah'/>
@@ -234,8 +235,10 @@
<cd:variable name='handwritten' value='rukopisne'/>
<cd:variable name='hang' value='zaveseni'/>
<cd:variable name='hanging' value='visici'/>
+ <cd:variable name='hangingboth' value='hangingboth'/>
<cd:variable name='head' value='hlavicka'/>
<cd:variable name='header' value='zahlavi'/>
+ <cd:variable name='headintext' value='headintext'/>
<cd:variable name='height' value='vyska'/>
<cd:variable name='helptext' value='textnapovedy'/>
<cd:variable name='hencefore' value='vyse'/>
@@ -376,6 +379,7 @@
<cd:variable name='nohz' value='nohz'/>
<cd:variable name='noline' value='noline'/>
<cd:variable name='nomarking' value='zadneznaceni'/>
+ <cd:variable name='nomenubar' value='nomenubar'/>
<cd:variable name='none' value='zadny'/>
<cd:variable name='nonumber' value='nonumber'/>
<cd:variable name='norepeat' value='norepeat'/>
@@ -479,6 +483,7 @@
<cd:variable name='sectionnumber' value='cislooddilu'/>
<cd:variable name='see' value='viz'/>
<cd:variable name='selectfont' value='selectfont'/>
+ <cd:variable name='separator' value='separator'/>
<cd:variable name='september' value='zari'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serifbold' value='serifbold'/>
@@ -572,6 +577,7 @@
<cd:variable name='temporary' value='docasne'/>
<cd:variable name='test' value='test'/>
<cd:variable name='text' value='text'/>
+ <cd:variable name='textnote' value='textnote'/>
<cd:variable name='three' value='tri'/>
<cd:variable name='thursday' value='ctvrtek'/>
<cd:variable name='tight' value='tight'/>
@@ -639,6 +645,7 @@
<cd:constant name='aligntitle' value='zarovnejtitul'/>
<cd:constant name='alternative' value='alternativa'/>
<cd:constant name='anchor' value='anchor'/>
+ <cd:constant name='anchoring' value='anchoring'/>
<cd:constant name='andtext' value='andtext'/>
<cd:constant name='apa' value='apa'/>
<cd:constant name='arguments' value='arguments'/>
@@ -735,7 +742,10 @@
<cd:constant name='component' value='component'/>
<cd:constant name='compoundhyphen' value='compoundhyphen'/>
<cd:constant name='compress' value='compress'/>
+ <cd:constant name='compressdistance' value='compressdistance'/>
+ <cd:constant name='compressmethod' value='compressmethod'/>
<cd:constant name='compressseparator' value='compressseparator'/>
+ <cd:constant name='compressstopper' value='compressstopper'/>
<cd:constant name='concerns' value='concerns'/>
<cd:constant name='connector' value='connector'/>
<cd:constant name='continue' value='pokracovat'/>
@@ -865,6 +875,7 @@
<cd:constant name='hfil' value='hfil'/>
<cd:constant name='hidenumber' value='hidenumber'/>
<cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horizontal' value='horizontalne'/>
<cd:constant name='horoffset' value='horoffset'/>
<cd:constant name='hyphen' value='hyphen'/>
<cd:constant name='hyphens' value='hyphens'/>
@@ -965,9 +976,12 @@
<cd:constant name='menu' value='menu'/>
<cd:constant name='method' value='metoda'/>
<cd:constant name='middle' value='stredni'/>
+ <cd:constant name='middlecolor' value='middlecolor'/>
<cd:constant name='middlecommand' value='middlecommand'/>
<cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middlestyle' value='middlestyle'/>
<cd:constant name='middletext' value='strednitext'/>
+ <cd:constant name='middlewidth' value='middlewidth'/>
<cd:constant name='midsentence' value='midsentence'/>
<cd:constant name='min' value='min'/>
<cd:constant name='mindepth' value='mindepth'/>
@@ -1037,6 +1051,7 @@
<cd:constant name='overprint' value='overprint'/>
<cd:constant name='ownerpassword' value='ownerpassword'/>
<cd:constant name='ownnumber' value='vlastnicislo'/>
+ <cd:constant name='packcriterium' value='packcriterium'/>
<cd:constant name='page' value='stranka'/>
<cd:constant name='pageboundaries' value='hranicestranky'/>
<cd:constant name='pagecolor' value='barvastranky'/>
@@ -1046,6 +1061,7 @@
<cd:constant name='pageconversion' value='pageconversion'/>
<cd:constant name='pageconversionset' value='pageconversionset'/>
<cd:constant name='pageleft' value='pageleft'/>
+ <cd:constant name='pagemethod' value='pagemethod'/>
<cd:constant name='pagenumber' value='cislostranky'/>
<cd:constant name='pageprefix' value='pageprefix'/>
<cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
@@ -1285,6 +1301,7 @@
<cd:constant name='vcompact' value='vcompact'/>
<cd:constant name='vector' value='vector'/>
<cd:constant name='veroffset' value='offsethlavicky'/>
+ <cd:constant name='vertical' value='vertikalne'/>
<cd:constant name='vfactor' value='vfaktor'/>
<cd:constant name='vfil' value='vfil'/>
<cd:constant name='viewerprefix' value='viewerprefix'/>
@@ -1295,6 +1312,7 @@
<cd:constant name='white' value='bily'/>
<cd:constant name='width' value='sirka'/>
<cd:constant name='words' value='words'/>
+ <cd:constant name='xanchor' value='xanchor'/>
<cd:constant name='xfactor' value='xfaktor'/>
<cd:constant name='xhtml' value='xhtml'/>
<cd:constant name='xmax' value='xmax'/>
@@ -1302,6 +1320,7 @@
<cd:constant name='xoffset' value='xoffset'/>
<cd:constant name='xscale' value='xmeritko'/>
<cd:constant name='xstep' value='xkrok'/>
+ <cd:constant name='yanchor' value='yanchor'/>
<cd:constant name='yfactor' value='yfaktor'/>
<cd:constant name='ymax' value='ymax'/>
<cd:constant name='yoffset' value='yoffset'/>
diff --git a/Master/texmf-dist/tex/context/interface/mkii/keys-de.xml b/Master/texmf-dist/tex/context/interface/mkii/keys-de.xml
index 701dc246b2b..42d6425447f 100644
--- a/Master/texmf-dist/tex/context/interface/mkii/keys-de.xml
+++ b/Master/texmf-dist/tex/context/interface/mkii/keys-de.xml
@@ -150,6 +150,7 @@
<cd:variable name='comment' value='kommentar'/>
<cd:variable name='component' value='komponente'/>
<cd:variable name='compressseparator' value='compressseparator'/>
+ <cd:variable name='compressstopper' value='compressstopper'/>
<cd:variable name='concept' value='konzept'/>
<cd:variable name='construction' value='construction'/>
<cd:variable name='content' value='inhalt'/>
@@ -234,8 +235,10 @@
<cd:variable name='handwritten' value='handschrift'/>
<cd:variable name='hang' value='haengend'/>
<cd:variable name='hanging' value='haengend'/>
+ <cd:variable name='hangingboth' value='hangingboth'/>
<cd:variable name='head' value='kopf'/>
<cd:variable name='header' value='kopfzeile'/>
+ <cd:variable name='headintext' value='headintext'/>
<cd:variable name='height' value='hoehe'/>
<cd:variable name='helptext' value='hilfetext'/>
<cd:variable name='hencefore' value='vorher'/>
@@ -376,6 +379,7 @@
<cd:variable name='nohz' value='nohz'/>
<cd:variable name='noline' value='noline'/>
<cd:variable name='nomarking' value='keinebeschriftung'/>
+ <cd:variable name='nomenubar' value='nomenubar'/>
<cd:variable name='none' value='kein'/>
<cd:variable name='nonumber' value='nonumber'/>
<cd:variable name='norepeat' value='norepeat'/>
@@ -479,6 +483,7 @@
<cd:variable name='sectionnumber' value='abschnittsnummer'/>
<cd:variable name='see' value='sieh'/>
<cd:variable name='selectfont' value='selectfont'/>
+ <cd:variable name='separator' value='separator'/>
<cd:variable name='september' value='september'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serifbold' value='serifbold'/>
@@ -572,6 +577,7 @@
<cd:variable name='temporary' value='temporaer'/>
<cd:variable name='test' value='test'/>
<cd:variable name='text' value='text'/>
+ <cd:variable name='textnote' value='textnote'/>
<cd:variable name='three' value='drei'/>
<cd:variable name='thursday' value='donnerstag'/>
<cd:variable name='tight' value='tight'/>
@@ -639,6 +645,7 @@
<cd:constant name='aligntitle' value='titelausrichten'/>
<cd:constant name='alternative' value='alternative'/>
<cd:constant name='anchor' value='anchor'/>
+ <cd:constant name='anchoring' value='anchoring'/>
<cd:constant name='andtext' value='andtext'/>
<cd:constant name='apa' value='apa'/>
<cd:constant name='arguments' value='arguments'/>
@@ -735,7 +742,10 @@
<cd:constant name='component' value='component'/>
<cd:constant name='compoundhyphen' value='compoundhyphen'/>
<cd:constant name='compress' value='compress'/>
+ <cd:constant name='compressdistance' value='compressdistance'/>
+ <cd:constant name='compressmethod' value='compressmethod'/>
<cd:constant name='compressseparator' value='compressseparator'/>
+ <cd:constant name='compressstopper' value='compressstopper'/>
<cd:constant name='concerns' value='concerns'/>
<cd:constant name='connector' value='connector'/>
<cd:constant name='continue' value='fortsetzen'/>
@@ -865,6 +875,7 @@
<cd:constant name='hfil' value='hfil'/>
<cd:constant name='hidenumber' value='hidenumber'/>
<cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horizontal' value='horizontal'/>
<cd:constant name='horoffset' value='rumpfabstand'/>
<cd:constant name='hyphen' value='hyphen'/>
<cd:constant name='hyphens' value='hyphens'/>
@@ -965,9 +976,12 @@
<cd:constant name='menu' value='menue'/>
<cd:constant name='method' value='methode'/>
<cd:constant name='middle' value='mittig'/>
+ <cd:constant name='middlecolor' value='middlecolor'/>
<cd:constant name='middlecommand' value='middlecommand'/>
<cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middlestyle' value='middlestyle'/>
<cd:constant name='middletext' value='mittigertext'/>
+ <cd:constant name='middlewidth' value='middlewidth'/>
<cd:constant name='midsentence' value='midsentence'/>
<cd:constant name='min' value='min'/>
<cd:constant name='mindepth' value='mindepth'/>
@@ -1037,6 +1051,7 @@
<cd:constant name='overprint' value='overprint'/>
<cd:constant name='ownerpassword' value='ownerpassword'/>
<cd:constant name='ownnumber' value='eigenenummer'/>
+ <cd:constant name='packcriterium' value='packcriterium'/>
<cd:constant name='page' value='seite'/>
<cd:constant name='pageboundaries' value='seitenbegrenzung'/>
<cd:constant name='pagecolor' value='seitenfarbe'/>
@@ -1046,6 +1061,7 @@
<cd:constant name='pageconversion' value='pageconversion'/>
<cd:constant name='pageconversionset' value='pageconversionset'/>
<cd:constant name='pageleft' value='pageleft'/>
+ <cd:constant name='pagemethod' value='pagemethod'/>
<cd:constant name='pagenumber' value='seitennummer'/>
<cd:constant name='pageprefix' value='pageprefix'/>
<cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
@@ -1285,6 +1301,7 @@
<cd:constant name='vcompact' value='vcompact'/>
<cd:constant name='vector' value='vector'/>
<cd:constant name='veroffset' value='kopfoffset'/>
+ <cd:constant name='vertical' value='vertikal'/>
<cd:constant name='vfactor' value='vfaktor'/>
<cd:constant name='vfil' value='vfil'/>
<cd:constant name='viewerprefix' value='viewerprefix'/>
@@ -1295,6 +1312,7 @@
<cd:constant name='white' value='weiss'/>
<cd:constant name='width' value='breite'/>
<cd:constant name='words' value='words'/>
+ <cd:constant name='xanchor' value='xanchor'/>
<cd:constant name='xfactor' value='xfaktor'/>
<cd:constant name='xhtml' value='xhtml'/>
<cd:constant name='xmax' value='xmax'/>
@@ -1302,6 +1320,7 @@
<cd:constant name='xoffset' value='xoffset'/>
<cd:constant name='xscale' value='xformat'/>
<cd:constant name='xstep' value='xschritt'/>
+ <cd:constant name='yanchor' value='yanchor'/>
<cd:constant name='yfactor' value='yfaktor'/>
<cd:constant name='ymax' value='ymax'/>
<cd:constant name='yoffset' value='yoffset'/>
diff --git a/Master/texmf-dist/tex/context/interface/mkii/keys-en.xml b/Master/texmf-dist/tex/context/interface/mkii/keys-en.xml
index 686a4dc063c..d8c5c9c8154 100644
--- a/Master/texmf-dist/tex/context/interface/mkii/keys-en.xml
+++ b/Master/texmf-dist/tex/context/interface/mkii/keys-en.xml
@@ -150,6 +150,7 @@
<cd:variable name='comment' value='comment'/>
<cd:variable name='component' value='component'/>
<cd:variable name='compressseparator' value='compressseparator'/>
+ <cd:variable name='compressstopper' value='compressstopper'/>
<cd:variable name='concept' value='concept'/>
<cd:variable name='construction' value='construction'/>
<cd:variable name='content' value='content'/>
@@ -234,8 +235,10 @@
<cd:variable name='handwritten' value='handwritten'/>
<cd:variable name='hang' value='hang'/>
<cd:variable name='hanging' value='hanging'/>
+ <cd:variable name='hangingboth' value='hangingboth'/>
<cd:variable name='head' value='head'/>
<cd:variable name='header' value='header'/>
+ <cd:variable name='headintext' value='headintext'/>
<cd:variable name='height' value='height'/>
<cd:variable name='helptext' value='helptext'/>
<cd:variable name='hencefore' value='hencefore'/>
@@ -376,6 +379,7 @@
<cd:variable name='nohz' value='nohz'/>
<cd:variable name='noline' value='noline'/>
<cd:variable name='nomarking' value='nomarking'/>
+ <cd:variable name='nomenubar' value='nomenubar'/>
<cd:variable name='none' value='none'/>
<cd:variable name='nonumber' value='nonumber'/>
<cd:variable name='norepeat' value='norepeat'/>
@@ -479,6 +483,7 @@
<cd:variable name='sectionnumber' value='sectionnumber'/>
<cd:variable name='see' value='see'/>
<cd:variable name='selectfont' value='selectfont'/>
+ <cd:variable name='separator' value='separator'/>
<cd:variable name='september' value='september'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serifbold' value='serifbold'/>
@@ -572,6 +577,7 @@
<cd:variable name='temporary' value='temporary'/>
<cd:variable name='test' value='test'/>
<cd:variable name='text' value='text'/>
+ <cd:variable name='textnote' value='textnote'/>
<cd:variable name='three' value='three'/>
<cd:variable name='thursday' value='thursday'/>
<cd:variable name='tight' value='tight'/>
@@ -639,6 +645,7 @@
<cd:constant name='aligntitle' value='aligntitle'/>
<cd:constant name='alternative' value='alternative'/>
<cd:constant name='anchor' value='anchor'/>
+ <cd:constant name='anchoring' value='anchoring'/>
<cd:constant name='andtext' value='andtext'/>
<cd:constant name='apa' value='apa'/>
<cd:constant name='arguments' value='arguments'/>
@@ -735,7 +742,10 @@
<cd:constant name='component' value='component'/>
<cd:constant name='compoundhyphen' value='compoundhyphen'/>
<cd:constant name='compress' value='compress'/>
+ <cd:constant name='compressdistance' value='compressdistance'/>
+ <cd:constant name='compressmethod' value='compressmethod'/>
<cd:constant name='compressseparator' value='compressseparator'/>
+ <cd:constant name='compressstopper' value='compressstopper'/>
<cd:constant name='concerns' value='concerns'/>
<cd:constant name='connector' value='connector'/>
<cd:constant name='continue' value='continue'/>
@@ -865,6 +875,7 @@
<cd:constant name='hfil' value='hfil'/>
<cd:constant name='hidenumber' value='hidenumber'/>
<cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horizontal' value='horizontal'/>
<cd:constant name='horoffset' value='horoffset'/>
<cd:constant name='hyphen' value='hyphen'/>
<cd:constant name='hyphens' value='hyphens'/>
@@ -965,9 +976,12 @@
<cd:constant name='menu' value='menu'/>
<cd:constant name='method' value='method'/>
<cd:constant name='middle' value='middle'/>
+ <cd:constant name='middlecolor' value='middlecolor'/>
<cd:constant name='middlecommand' value='middlecommand'/>
<cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middlestyle' value='middlestyle'/>
<cd:constant name='middletext' value='middletext'/>
+ <cd:constant name='middlewidth' value='middlewidth'/>
<cd:constant name='midsentence' value='midsentence'/>
<cd:constant name='min' value='min'/>
<cd:constant name='mindepth' value='mindepth'/>
@@ -1037,6 +1051,7 @@
<cd:constant name='overprint' value='overprint'/>
<cd:constant name='ownerpassword' value='ownerpassword'/>
<cd:constant name='ownnumber' value='ownnumber'/>
+ <cd:constant name='packcriterium' value='packcriterium'/>
<cd:constant name='page' value='page'/>
<cd:constant name='pageboundaries' value='pageboundaries'/>
<cd:constant name='pagecolor' value='pagecolor'/>
@@ -1046,6 +1061,7 @@
<cd:constant name='pageconversion' value='pageconversion'/>
<cd:constant name='pageconversionset' value='pageconversionset'/>
<cd:constant name='pageleft' value='pageleft'/>
+ <cd:constant name='pagemethod' value='pagemethod'/>
<cd:constant name='pagenumber' value='pagenumber'/>
<cd:constant name='pageprefix' value='pageprefix'/>
<cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
@@ -1285,6 +1301,7 @@
<cd:constant name='vcompact' value='vcompact'/>
<cd:constant name='vector' value='vector'/>
<cd:constant name='veroffset' value='veroffset'/>
+ <cd:constant name='vertical' value='vertical'/>
<cd:constant name='vfactor' value='vfactor'/>
<cd:constant name='vfil' value='vfil'/>
<cd:constant name='viewerprefix' value='viewerprefix'/>
@@ -1295,6 +1312,7 @@
<cd:constant name='white' value='white'/>
<cd:constant name='width' value='width'/>
<cd:constant name='words' value='words'/>
+ <cd:constant name='xanchor' value='xanchor'/>
<cd:constant name='xfactor' value='xfactor'/>
<cd:constant name='xhtml' value='xhtml'/>
<cd:constant name='xmax' value='xmax'/>
@@ -1302,6 +1320,7 @@
<cd:constant name='xoffset' value='xoffset'/>
<cd:constant name='xscale' value='xscale'/>
<cd:constant name='xstep' value='xstep'/>
+ <cd:constant name='yanchor' value='yanchor'/>
<cd:constant name='yfactor' value='yfactor'/>
<cd:constant name='ymax' value='ymax'/>
<cd:constant name='yoffset' value='yoffset'/>
diff --git a/Master/texmf-dist/tex/context/interface/mkii/keys-fr.xml b/Master/texmf-dist/tex/context/interface/mkii/keys-fr.xml
index 452f3316a40..8ba741a608d 100644
--- a/Master/texmf-dist/tex/context/interface/mkii/keys-fr.xml
+++ b/Master/texmf-dist/tex/context/interface/mkii/keys-fr.xml
@@ -150,6 +150,7 @@
<cd:variable name='comment' value='commentaire'/>
<cd:variable name='component' value='composant'/>
<cd:variable name='compressseparator' value='compressseparator'/>
+ <cd:variable name='compressstopper' value='compressstopper'/>
<cd:variable name='concept' value='concept'/>
<cd:variable name='construction' value='construction'/>
<cd:variable name='content' value='contenu'/>
@@ -234,8 +235,10 @@
<cd:variable name='handwritten' value='manuscript'/>
<cd:variable name='hang' value='suspend'/>
<cd:variable name='hanging' value='suspend'/>
+ <cd:variable name='hangingboth' value='hangingboth'/>
<cd:variable name='head' value='tete'/>
<cd:variable name='header' value='entete'/>
+ <cd:variable name='headintext' value='headintext'/>
<cd:variable name='height' value='hauteur'/>
<cd:variable name='helptext' value='texteaide'/>
<cd:variable name='hencefore' value='precedent'/>
@@ -376,6 +379,7 @@
<cd:variable name='nohz' value='nohz'/>
<cd:variable name='noline' value='noline'/>
<cd:variable name='nomarking' value='sansmarquage'/>
+ <cd:variable name='nomenubar' value='nomenubar'/>
<cd:variable name='none' value='rien'/>
<cd:variable name='nonumber' value='sansnumero'/>
<cd:variable name='norepeat' value='norepeat'/>
@@ -479,6 +483,7 @@
<cd:variable name='sectionnumber' value='numerosection'/>
<cd:variable name='see' value='voit'/>
<cd:variable name='selectfont' value='selectfont'/>
+ <cd:variable name='separator' value='separator'/>
<cd:variable name='september' value='septembre'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serifbold' value='serifbold'/>
@@ -572,6 +577,7 @@
<cd:variable name='temporary' value='temporaire'/>
<cd:variable name='test' value='test'/>
<cd:variable name='text' value='texte'/>
+ <cd:variable name='textnote' value='textnote'/>
<cd:variable name='three' value='trois'/>
<cd:variable name='thursday' value='jeudi'/>
<cd:variable name='tight' value='tight'/>
@@ -590,6 +596,7 @@
<cd:variable name='understrike' value='understrike'/>
<cd:variable name='understrikes' value='understrikes'/>
<cd:variable name='unframed' value='unframed'/>
+ <cd:variable name='unicode' value='unicode'/>
<cd:variable name='unit' value='unite'/>
<cd:variable name='units' value='unites'/>
<cd:variable name='unknown' value='inconnu'/>
@@ -638,6 +645,7 @@
<cd:constant name='aligntitle' value='alignementtitre'/>
<cd:constant name='alternative' value='alternative'/>
<cd:constant name='anchor' value='anchor'/>
+ <cd:constant name='anchoring' value='anchoring'/>
<cd:constant name='andtext' value='andtext'/>
<cd:constant name='apa' value='apa'/>
<cd:constant name='arguments' value='arguments'/>
@@ -734,7 +742,10 @@
<cd:constant name='component' value='composant'/>
<cd:constant name='compoundhyphen' value='compoundhyphen'/>
<cd:constant name='compress' value='compress'/>
+ <cd:constant name='compressdistance' value='compressdistance'/>
+ <cd:constant name='compressmethod' value='compressmethod'/>
<cd:constant name='compressseparator' value='compressseparator'/>
+ <cd:constant name='compressstopper' value='compressstopper'/>
<cd:constant name='concerns' value='concerns'/>
<cd:constant name='connector' value='connector'/>
<cd:constant name='continue' value='continue'/>
@@ -864,6 +875,7 @@
<cd:constant name='hfil' value='hfil'/>
<cd:constant name='hidenumber' value='hidenumber'/>
<cd:constant name='hoffset' value='decalagehauteur'/>
+ <cd:constant name='horizontal' value='horizontale'/>
<cd:constant name='horoffset' value='horoffset'/>
<cd:constant name='hyphen' value='hyphen'/>
<cd:constant name='hyphens' value='hyphens'/>
@@ -964,9 +976,12 @@
<cd:constant name='menu' value='menu'/>
<cd:constant name='method' value='methode'/>
<cd:constant name='middle' value='milieu'/>
+ <cd:constant name='middlecolor' value='middlecolor'/>
<cd:constant name='middlecommand' value='middlecommand'/>
<cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middlestyle' value='middlestyle'/>
<cd:constant name='middletext' value='textecentre'/>
+ <cd:constant name='middlewidth' value='middlewidth'/>
<cd:constant name='midsentence' value='midsentence'/>
<cd:constant name='min' value='min'/>
<cd:constant name='mindepth' value='profondeurmin'/>
@@ -1036,6 +1051,7 @@
<cd:constant name='overprint' value='overprint'/>
<cd:constant name='ownerpassword' value='ownerpassword'/>
<cd:constant name='ownnumber' value='numeroproprio'/>
+ <cd:constant name='packcriterium' value='packcriterium'/>
<cd:constant name='page' value='page'/>
<cd:constant name='pageboundaries' value='limitespage'/>
<cd:constant name='pagecolor' value='couleurpage'/>
@@ -1045,6 +1061,7 @@
<cd:constant name='pageconversion' value='pageconversion'/>
<cd:constant name='pageconversionset' value='pageconversionset'/>
<cd:constant name='pageleft' value='pageleft'/>
+ <cd:constant name='pagemethod' value='pagemethod'/>
<cd:constant name='pagenumber' value='numeropage'/>
<cd:constant name='pageprefix' value='pageprefix'/>
<cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
@@ -1284,6 +1301,7 @@
<cd:constant name='vcompact' value='vcompact'/>
<cd:constant name='vector' value='vector'/>
<cd:constant name='veroffset' value='veroffset'/>
+ <cd:constant name='vertical' value='verticale'/>
<cd:constant name='vfactor' value='vfactor'/>
<cd:constant name='vfil' value='vfil'/>
<cd:constant name='viewerprefix' value='viewerprefix'/>
@@ -1294,6 +1312,7 @@
<cd:constant name='white' value='blanc'/>
<cd:constant name='width' value='largeur'/>
<cd:constant name='words' value='words'/>
+ <cd:constant name='xanchor' value='xanchor'/>
<cd:constant name='xfactor' value='xfactor'/>
<cd:constant name='xhtml' value='xhtml'/>
<cd:constant name='xmax' value='xmax'/>
@@ -1301,6 +1320,7 @@
<cd:constant name='xoffset' value='xoffset'/>
<cd:constant name='xscale' value='xscale'/>
<cd:constant name='xstep' value='xstep'/>
+ <cd:constant name='yanchor' value='yanchor'/>
<cd:constant name='yfactor' value='yfactor'/>
<cd:constant name='ymax' value='ymax'/>
<cd:constant name='yoffset' value='yoffset'/>
diff --git a/Master/texmf-dist/tex/context/interface/mkii/keys-it.xml b/Master/texmf-dist/tex/context/interface/mkii/keys-it.xml
index 2ebcb4a9d99..7ae291cf07d 100644
--- a/Master/texmf-dist/tex/context/interface/mkii/keys-it.xml
+++ b/Master/texmf-dist/tex/context/interface/mkii/keys-it.xml
@@ -150,6 +150,7 @@
<cd:variable name='comment' value='commento'/>
<cd:variable name='component' value='componente'/>
<cd:variable name='compressseparator' value='compressseparator'/>
+ <cd:variable name='compressstopper' value='compressstopper'/>
<cd:variable name='concept' value='concetto'/>
<cd:variable name='construction' value='construction'/>
<cd:variable name='content' value='indice'/>
@@ -234,8 +235,10 @@
<cd:variable name='handwritten' value='grafiamanuale'/>
<cd:variable name='hang' value='sospendi'/>
<cd:variable name='hanging' value='sospeso'/>
+ <cd:variable name='hangingboth' value='hangingboth'/>
<cd:variable name='head' value='testa'/>
<cd:variable name='header' value='intestazione'/>
+ <cd:variable name='headintext' value='headintext'/>
<cd:variable name='height' value='altezza'/>
<cd:variable name='helptext' value='testoaiuto'/>
<cd:variable name='hencefore' value='precedente'/>
@@ -376,6 +379,7 @@
<cd:variable name='nohz' value='nohz'/>
<cd:variable name='noline' value='noline'/>
<cd:variable name='nomarking' value='nomarcature'/>
+ <cd:variable name='nomenubar' value='nomenubar'/>
<cd:variable name='none' value='nessuno'/>
<cd:variable name='nonumber' value='nonumber'/>
<cd:variable name='norepeat' value='norepeat'/>
@@ -479,6 +483,7 @@
<cd:variable name='sectionnumber' value='numerosezione'/>
<cd:variable name='see' value='vedi'/>
<cd:variable name='selectfont' value='selectfont'/>
+ <cd:variable name='separator' value='separator'/>
<cd:variable name='september' value='settembre'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serifbold' value='serifbold'/>
@@ -572,6 +577,7 @@
<cd:variable name='temporary' value='temporaneo'/>
<cd:variable name='test' value='test'/>
<cd:variable name='text' value='testo'/>
+ <cd:variable name='textnote' value='textnote'/>
<cd:variable name='three' value='tre'/>
<cd:variable name='thursday' value='giovedi'/>
<cd:variable name='tight' value='tight'/>
@@ -639,6 +645,7 @@
<cd:constant name='aligntitle' value='allineatitolo'/>
<cd:constant name='alternative' value='alternativa'/>
<cd:constant name='anchor' value='anchor'/>
+ <cd:constant name='anchoring' value='anchoring'/>
<cd:constant name='andtext' value='andtext'/>
<cd:constant name='apa' value='apa'/>
<cd:constant name='arguments' value='arguments'/>
@@ -735,7 +742,10 @@
<cd:constant name='component' value='component'/>
<cd:constant name='compoundhyphen' value='compoundhyphen'/>
<cd:constant name='compress' value='compress'/>
+ <cd:constant name='compressdistance' value='compressdistance'/>
+ <cd:constant name='compressmethod' value='compressmethod'/>
<cd:constant name='compressseparator' value='compressseparator'/>
+ <cd:constant name='compressstopper' value='compressstopper'/>
<cd:constant name='concerns' value='concerns'/>
<cd:constant name='connector' value='connector'/>
<cd:constant name='continue' value='continua'/>
@@ -865,6 +875,7 @@
<cd:constant name='hfil' value='hfil'/>
<cd:constant name='hidenumber' value='hidenumber'/>
<cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horizontal' value='orizzontale'/>
<cd:constant name='horoffset' value='horoffset'/>
<cd:constant name='hyphen' value='hyphen'/>
<cd:constant name='hyphens' value='hyphens'/>
@@ -965,9 +976,12 @@
<cd:constant name='menu' value='menu'/>
<cd:constant name='method' value='metodo'/>
<cd:constant name='middle' value='centro'/>
+ <cd:constant name='middlecolor' value='middlecolor'/>
<cd:constant name='middlecommand' value='middlecommand'/>
<cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middlestyle' value='middlestyle'/>
<cd:constant name='middletext' value='testocentro'/>
+ <cd:constant name='middlewidth' value='middlewidth'/>
<cd:constant name='midsentence' value='midsentence'/>
<cd:constant name='min' value='min'/>
<cd:constant name='mindepth' value='mindepth'/>
@@ -1037,6 +1051,7 @@
<cd:constant name='overprint' value='overprint'/>
<cd:constant name='ownerpassword' value='ownerpassword'/>
<cd:constant name='ownnumber' value='numeroproprio'/>
+ <cd:constant name='packcriterium' value='packcriterium'/>
<cd:constant name='page' value='pagina'/>
<cd:constant name='pageboundaries' value='limitipagina'/>
<cd:constant name='pagecolor' value='colorepagina'/>
@@ -1046,6 +1061,7 @@
<cd:constant name='pageconversion' value='pageconversion'/>
<cd:constant name='pageconversionset' value='pageconversionset'/>
<cd:constant name='pageleft' value='pageleft'/>
+ <cd:constant name='pagemethod' value='pagemethod'/>
<cd:constant name='pagenumber' value='numeropagina'/>
<cd:constant name='pageprefix' value='pageprefix'/>
<cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
@@ -1285,6 +1301,7 @@
<cd:constant name='vcompact' value='vcompact'/>
<cd:constant name='vector' value='vector'/>
<cd:constant name='veroffset' value='veroffset'/>
+ <cd:constant name='vertical' value='verticale'/>
<cd:constant name='vfactor' value='vfactor'/>
<cd:constant name='vfil' value='vfil'/>
<cd:constant name='viewerprefix' value='viewerprefix'/>
@@ -1295,6 +1312,7 @@
<cd:constant name='white' value='bianco'/>
<cd:constant name='width' value='ampiezza'/>
<cd:constant name='words' value='words'/>
+ <cd:constant name='xanchor' value='xanchor'/>
<cd:constant name='xfactor' value='xfactor'/>
<cd:constant name='xhtml' value='xhtml'/>
<cd:constant name='xmax' value='xmax'/>
@@ -1302,6 +1320,7 @@
<cd:constant name='xoffset' value='xoffset'/>
<cd:constant name='xscale' value='xscale'/>
<cd:constant name='xstep' value='xstep'/>
+ <cd:constant name='yanchor' value='yanchor'/>
<cd:constant name='yfactor' value='yfactor'/>
<cd:constant name='ymax' value='ymax'/>
<cd:constant name='yoffset' value='yoffset'/>
diff --git a/Master/texmf-dist/tex/context/interface/mkii/keys-nl.xml b/Master/texmf-dist/tex/context/interface/mkii/keys-nl.xml
index 06df09bc539..344a874f0cc 100644
--- a/Master/texmf-dist/tex/context/interface/mkii/keys-nl.xml
+++ b/Master/texmf-dist/tex/context/interface/mkii/keys-nl.xml
@@ -150,6 +150,7 @@
<cd:variable name='comment' value='commentaar'/>
<cd:variable name='component' value='onderdeel'/>
<cd:variable name='compressseparator' value='compressseparator'/>
+ <cd:variable name='compressstopper' value='compressstopper'/>
<cd:variable name='concept' value='concept'/>
<cd:variable name='construction' value='construction'/>
<cd:variable name='content' value='inhoud'/>
@@ -234,8 +235,10 @@
<cd:variable name='handwritten' value='handschrift'/>
<cd:variable name='hang' value='hang'/>
<cd:variable name='hanging' value='hangend'/>
+ <cd:variable name='hangingboth' value='beidehangend'/>
<cd:variable name='head' value='kop'/>
<cd:variable name='header' value='hoofd'/>
+ <cd:variable name='headintext' value='kopintekst'/>
<cd:variable name='height' value='hoogte'/>
<cd:variable name='helptext' value='helptekst'/>
<cd:variable name='hencefore' value='hierboven'/>
@@ -376,6 +379,7 @@
<cd:variable name='nohz' value='geenhz'/>
<cd:variable name='noline' value='noline'/>
<cd:variable name='nomarking' value='geenmarkering'/>
+ <cd:variable name='nomenubar' value='geenmenubalk'/>
<cd:variable name='none' value='geen'/>
<cd:variable name='nonumber' value='geennummer'/>
<cd:variable name='norepeat' value='norepeat'/>
@@ -479,6 +483,7 @@
<cd:variable name='sectionnumber' value='sectienummer'/>
<cd:variable name='see' value='zie'/>
<cd:variable name='selectfont' value='selectfont'/>
+ <cd:variable name='separator' value='scheider'/>
<cd:variable name='september' value='september'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serifbold' value='serifbold'/>
@@ -572,6 +577,7 @@
<cd:variable name='temporary' value='voorlopig'/>
<cd:variable name='test' value='test'/>
<cd:variable name='text' value='tekst'/>
+ <cd:variable name='textnote' value='tekstnoot'/>
<cd:variable name='three' value='drie'/>
<cd:variable name='thursday' value='donderdag'/>
<cd:variable name='tight' value='krap'/>
@@ -639,6 +645,7 @@
<cd:constant name='aligntitle' value='titeluitlijnen'/>
<cd:constant name='alternative' value='variant'/>
<cd:constant name='anchor' value='anker'/>
+ <cd:constant name='anchoring' value='verankering'/>
<cd:constant name='andtext' value='andtext'/>
<cd:constant name='apa' value='apa'/>
<cd:constant name='arguments' value='argumenten'/>
@@ -735,7 +742,10 @@
<cd:constant name='component' value='component'/>
<cd:constant name='compoundhyphen' value='koppelteken'/>
<cd:constant name='compress' value='comprimeren'/>
+ <cd:constant name='compressdistance' value='compressdistance'/>
+ <cd:constant name='compressmethod' value='compressmethod'/>
<cd:constant name='compressseparator' value='compressseparator'/>
+ <cd:constant name='compressstopper' value='compressstopper'/>
<cd:constant name='concerns' value='betreft'/>
<cd:constant name='connector' value='connector'/>
<cd:constant name='continue' value='doorgaan'/>
@@ -865,6 +875,7 @@
<cd:constant name='hfil' value='hfil'/>
<cd:constant name='hidenumber' value='hidenumber'/>
<cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horizontal' value='horizontaal'/>
<cd:constant name='horoffset' value='rugoffset'/>
<cd:constant name='hyphen' value='hyphen'/>
<cd:constant name='hyphens' value='hyphens'/>
@@ -965,9 +976,12 @@
<cd:constant name='menu' value='menu'/>
<cd:constant name='method' value='methode'/>
<cd:constant name='middle' value='midden'/>
+ <cd:constant name='middlecolor' value='middenkleur'/>
<cd:constant name='middlecommand' value='middencommando'/>
<cd:constant name='middlespeech' value='middenuitspraak'/>
+ <cd:constant name='middlestyle' value='middenletter'/>
<cd:constant name='middletext' value='middentekst'/>
+ <cd:constant name='middlewidth' value='middenbreedte'/>
<cd:constant name='midsentence' value='middenzin'/>
<cd:constant name='min' value='min'/>
<cd:constant name='mindepth' value='mindiepte'/>
@@ -1037,6 +1051,7 @@
<cd:constant name='overprint' value='overprint'/>
<cd:constant name='ownerpassword' value='ownerpassword'/>
<cd:constant name='ownnumber' value='eigennummer'/>
+ <cd:constant name='packcriterium' value='opelkaarcriterium'/>
<cd:constant name='page' value='pagina'/>
<cd:constant name='pageboundaries' value='paginaovergangen'/>
<cd:constant name='pagecolor' value='paginakleur'/>
@@ -1046,6 +1061,7 @@
<cd:constant name='pageconversion' value='pageconversion'/>
<cd:constant name='pageconversionset' value='pageconversionset'/>
<cd:constant name='pageleft' value='pageleft'/>
+ <cd:constant name='pagemethod' value='paginamethode'/>
<cd:constant name='pagenumber' value='paginanummer'/>
<cd:constant name='pageprefix' value='pageprefix'/>
<cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
@@ -1285,6 +1301,7 @@
<cd:constant name='vcompact' value='vcomprimeer'/>
<cd:constant name='vector' value='vector'/>
<cd:constant name='veroffset' value='kopoffset'/>
+ <cd:constant name='vertical' value='vertikaal'/>
<cd:constant name='vfactor' value='vfactor'/>
<cd:constant name='vfil' value='vfil'/>
<cd:constant name='viewerprefix' value='viewerprefix'/>
@@ -1295,6 +1312,7 @@
<cd:constant name='white' value='wit'/>
<cd:constant name='width' value='breedte'/>
<cd:constant name='words' value='words'/>
+ <cd:constant name='xanchor' value='xanker'/>
<cd:constant name='xfactor' value='xfactor'/>
<cd:constant name='xhtml' value='xhtml'/>
<cd:constant name='xmax' value='xmax'/>
@@ -1302,6 +1320,7 @@
<cd:constant name='xoffset' value='xoffset'/>
<cd:constant name='xscale' value='xschaal'/>
<cd:constant name='xstep' value='xstap'/>
+ <cd:constant name='yanchor' value='yanker'/>
<cd:constant name='yfactor' value='yfactor'/>
<cd:constant name='ymax' value='ymax'/>
<cd:constant name='yoffset' value='yoffset'/>
diff --git a/Master/texmf-dist/tex/context/interface/mkii/keys-pe.xml b/Master/texmf-dist/tex/context/interface/mkii/keys-pe.xml
index bd42a83ddc4..9f18d633dcf 100644
--- a/Master/texmf-dist/tex/context/interface/mkii/keys-pe.xml
+++ b/Master/texmf-dist/tex/context/interface/mkii/keys-pe.xml
@@ -150,6 +150,7 @@
<cd:variable name='comment' value='توضیح'/>
<cd:variable name='component' value='مولÙÙ‡'/>
<cd:variable name='compressseparator' value='compressseparator'/>
+ <cd:variable name='compressstopper' value='compressstopper'/>
<cd:variable name='concept' value='Ù…Ùهوم'/>
<cd:variable name='construction' value='construction'/>
<cd:variable name='content' value='محتوا'/>
@@ -234,8 +235,10 @@
<cd:variable name='handwritten' value='دست‌نوشته'/>
<cd:variable name='hang' value='بیاویز'/>
<cd:variable name='hanging' value='آویزان'/>
+ <cd:variable name='hangingboth' value='hangingboth'/>
<cd:variable name='head' value='سر'/>
<cd:variable name='header' value='سربرگ'/>
+ <cd:variable name='headintext' value='headintext'/>
<cd:variable name='height' value='ارتÙاع'/>
<cd:variable name='helptext' value='متن‌کمکی'/>
<cd:variable name='hencefore' value='hencefore'/>
@@ -376,6 +379,7 @@
<cd:variable name='nohz' value='nohz'/>
<cd:variable name='noline' value='noline'/>
<cd:variable name='nomarking' value='بدون‌نشانه‌گذاری'/>
+ <cd:variable name='nomenubar' value='nomenubar'/>
<cd:variable name='none' value='هیچکدام'/>
<cd:variable name='nonumber' value='بدون‌شماره'/>
<cd:variable name='norepeat' value='norepeat'/>
@@ -479,6 +483,7 @@
<cd:variable name='sectionnumber' value='شماره‌بخش'/>
<cd:variable name='see' value='ببینید'/>
<cd:variable name='selectfont' value='selectfont'/>
+ <cd:variable name='separator' value='separator'/>
<cd:variable name='september' value='سپتامبر'/>
<cd:variable name='serif' value='سریÙ'/>
<cd:variable name='serifbold' value='serifbold'/>
@@ -572,6 +577,7 @@
<cd:variable name='temporary' value='موقتی'/>
<cd:variable name='test' value='تست'/>
<cd:variable name='text' value='متن'/>
+ <cd:variable name='textnote' value='textnote'/>
<cd:variable name='three' value='سه'/>
<cd:variable name='thursday' value='پنج‌شنبه'/>
<cd:variable name='tight' value='tight'/>
@@ -590,6 +596,7 @@
<cd:variable name='understrike' value='understrike'/>
<cd:variable name='understrikes' value='understrikes'/>
<cd:variable name='unframed' value='unframed'/>
+ <cd:variable name='unicode' value='unicode'/>
<cd:variable name='unit' value='واحد'/>
<cd:variable name='units' value='واحدها'/>
<cd:variable name='unknown' value='ناشناس'/>
@@ -638,6 +645,7 @@
<cd:constant name='aligntitle' value='عنوان‌تنظیم'/>
<cd:constant name='alternative' value='جایگزین'/>
<cd:constant name='anchor' value='anchor'/>
+ <cd:constant name='anchoring' value='anchoring'/>
<cd:constant name='andtext' value='andtext'/>
<cd:constant name='apa' value='apa'/>
<cd:constant name='arguments' value='arguments'/>
@@ -734,7 +742,10 @@
<cd:constant name='component' value='مولÙÙ‡'/>
<cd:constant name='compoundhyphen' value='compoundhyphen'/>
<cd:constant name='compress' value='Ùشردن'/>
+ <cd:constant name='compressdistance' value='compressdistance'/>
+ <cd:constant name='compressmethod' value='compressmethod'/>
<cd:constant name='compressseparator' value='compressseparator'/>
+ <cd:constant name='compressstopper' value='compressstopper'/>
<cd:constant name='concerns' value='concerns'/>
<cd:constant name='connector' value='connector'/>
<cd:constant name='continue' value='ادامه'/>
@@ -864,6 +875,7 @@
<cd:constant name='hfil' value='پرکردن‌ارتÙاع'/>
<cd:constant name='hidenumber' value='hidenumber'/>
<cd:constant name='hoffset' value='Ø¢Ùست‌ا'/>
+ <cd:constant name='horizontal' value='اÙÙ‚ÛŒ'/>
<cd:constant name='horoffset' value='Ø¢Ùست‌اÙÙ‚'/>
<cd:constant name='hyphen' value='شکستن'/>
<cd:constant name='hyphens' value='hyphens'/>
@@ -964,9 +976,12 @@
<cd:constant name='menu' value='منو'/>
<cd:constant name='method' value='روش'/>
<cd:constant name='middle' value='میان'/>
+ <cd:constant name='middlecolor' value='middlecolor'/>
<cd:constant name='middlecommand' value='middlecommand'/>
<cd:constant name='middlespeech' value='سخنرانی‌میانی'/>
+ <cd:constant name='middlestyle' value='middlestyle'/>
<cd:constant name='middletext' value='متن‌میانی'/>
+ <cd:constant name='middlewidth' value='middlewidth'/>
<cd:constant name='midsentence' value='جمله‌میانی'/>
<cd:constant name='min' value='کمترین'/>
<cd:constant name='mindepth' value='کمترین‌عمق'/>
@@ -1036,6 +1051,7 @@
<cd:constant name='overprint' value='overprint'/>
<cd:constant name='ownerpassword' value='ownerpassword'/>
<cd:constant name='ownnumber' value='شماره‌خود'/>
+ <cd:constant name='packcriterium' value='packcriterium'/>
<cd:constant name='page' value='صÙحه'/>
<cd:constant name='pageboundaries' value='مرزهای‌صÙحه'/>
<cd:constant name='pagecolor' value='رنگ‌صÙحه'/>
@@ -1045,6 +1061,7 @@
<cd:constant name='pageconversion' value='pageconversion'/>
<cd:constant name='pageconversionset' value='pageconversionset'/>
<cd:constant name='pageleft' value='pageleft'/>
+ <cd:constant name='pagemethod' value='pagemethod'/>
<cd:constant name='pagenumber' value='شماره‌صÙحه'/>
<cd:constant name='pageprefix' value='pageprefix'/>
<cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
@@ -1284,6 +1301,7 @@
<cd:constant name='vcompact' value='vcompact'/>
<cd:constant name='vector' value='vector'/>
<cd:constant name='veroffset' value='Ø¢Ùست‌عم'/>
+ <cd:constant name='vertical' value='عمودی'/>
<cd:constant name='vfactor' value='vfactor'/>
<cd:constant name='vfil' value='vfil'/>
<cd:constant name='viewerprefix' value='viewerprefix'/>
@@ -1294,6 +1312,7 @@
<cd:constant name='white' value='سÙید'/>
<cd:constant name='width' value='عرض'/>
<cd:constant name='words' value='words'/>
+ <cd:constant name='xanchor' value='xanchor'/>
<cd:constant name='xfactor' value='Ùاکتورایکس'/>
<cd:constant name='xhtml' value='xhtml'/>
<cd:constant name='xmax' value='xmax'/>
@@ -1301,6 +1320,7 @@
<cd:constant name='xoffset' value='Ø¢Ùست‌ایکس'/>
<cd:constant name='xscale' value='مقیاس‌ایکس'/>
<cd:constant name='xstep' value='گام‌ایکس'/>
+ <cd:constant name='yanchor' value='yanchor'/>
<cd:constant name='yfactor' value='Ùاکتوروای'/>
<cd:constant name='ymax' value='ymax'/>
<cd:constant name='yoffset' value='Ø¢Ùست‌وای'/>
diff --git a/Master/texmf-dist/tex/context/interface/mkii/keys-ro.xml b/Master/texmf-dist/tex/context/interface/mkii/keys-ro.xml
index 5f165f88be4..0bde14e868c 100644
--- a/Master/texmf-dist/tex/context/interface/mkii/keys-ro.xml
+++ b/Master/texmf-dist/tex/context/interface/mkii/keys-ro.xml
@@ -150,6 +150,7 @@
<cd:variable name='comment' value='comentariu'/>
<cd:variable name='component' value='componenta'/>
<cd:variable name='compressseparator' value='compressseparator'/>
+ <cd:variable name='compressstopper' value='compressstopper'/>
<cd:variable name='concept' value='concept'/>
<cd:variable name='construction' value='construction'/>
<cd:variable name='content' value='cuprins'/>
@@ -234,8 +235,10 @@
<cd:variable name='handwritten' value='scrismanual'/>
<cd:variable name='hang' value='suspenda'/>
<cd:variable name='hanging' value='suspendat'/>
+ <cd:variable name='hangingboth' value='hangingboth'/>
<cd:variable name='head' value='antet'/>
<cd:variable name='header' value='antet'/>
+ <cd:variable name='headintext' value='headintext'/>
<cd:variable name='height' value='inaltime'/>
<cd:variable name='helptext' value='textajutator'/>
<cd:variable name='hencefore' value='precedent'/>
@@ -376,6 +379,7 @@
<cd:variable name='nohz' value='nohz'/>
<cd:variable name='noline' value='noline'/>
<cd:variable name='nomarking' value='faramarcare'/>
+ <cd:variable name='nomenubar' value='nomenubar'/>
<cd:variable name='none' value='niciunul'/>
<cd:variable name='nonumber' value='nonumber'/>
<cd:variable name='norepeat' value='norepeat'/>
@@ -479,6 +483,7 @@
<cd:variable name='sectionnumber' value='numarsetiune'/>
<cd:variable name='see' value='vezi'/>
<cd:variable name='selectfont' value='selectfont'/>
+ <cd:variable name='separator' value='separator'/>
<cd:variable name='september' value='septembrie'/>
<cd:variable name='serif' value='serif'/>
<cd:variable name='serifbold' value='serifbold'/>
@@ -572,6 +577,7 @@
<cd:variable name='temporary' value='temporar'/>
<cd:variable name='test' value='test'/>
<cd:variable name='text' value='text'/>
+ <cd:variable name='textnote' value='textnote'/>
<cd:variable name='three' value='trei'/>
<cd:variable name='thursday' value='joi'/>
<cd:variable name='tight' value='tight'/>
@@ -639,6 +645,7 @@
<cd:constant name='aligntitle' value='alinieretitlu'/>
<cd:constant name='alternative' value='alternativ'/>
<cd:constant name='anchor' value='anchor'/>
+ <cd:constant name='anchoring' value='anchoring'/>
<cd:constant name='andtext' value='andtext'/>
<cd:constant name='apa' value='apa'/>
<cd:constant name='arguments' value='arguments'/>
@@ -735,7 +742,10 @@
<cd:constant name='component' value='component'/>
<cd:constant name='compoundhyphen' value='compoundhyphen'/>
<cd:constant name='compress' value='compress'/>
+ <cd:constant name='compressdistance' value='compressdistance'/>
+ <cd:constant name='compressmethod' value='compressmethod'/>
<cd:constant name='compressseparator' value='compressseparator'/>
+ <cd:constant name='compressstopper' value='compressstopper'/>
<cd:constant name='concerns' value='concerns'/>
<cd:constant name='connector' value='connector'/>
<cd:constant name='continue' value='continua'/>
@@ -865,6 +875,7 @@
<cd:constant name='hfil' value='hfil'/>
<cd:constant name='hidenumber' value='hidenumber'/>
<cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horizontal' value='orizontal'/>
<cd:constant name='horoffset' value='offsetoriz'/>
<cd:constant name='hyphen' value='hyphen'/>
<cd:constant name='hyphens' value='hyphens'/>
@@ -965,9 +976,12 @@
<cd:constant name='menu' value='meniu'/>
<cd:constant name='method' value='metoda'/>
<cd:constant name='middle' value='mijloc'/>
+ <cd:constant name='middlecolor' value='middlecolor'/>
<cd:constant name='middlecommand' value='middlecommand'/>
<cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middlestyle' value='middlestyle'/>
<cd:constant name='middletext' value='textmijloc'/>
+ <cd:constant name='middlewidth' value='middlewidth'/>
<cd:constant name='midsentence' value='midsentence'/>
<cd:constant name='min' value='min'/>
<cd:constant name='mindepth' value='mindepth'/>
@@ -1037,6 +1051,7 @@
<cd:constant name='overprint' value='overprint'/>
<cd:constant name='ownerpassword' value='ownerpassword'/>
<cd:constant name='ownnumber' value='numarpropriu'/>
+ <cd:constant name='packcriterium' value='packcriterium'/>
<cd:constant name='page' value='pagina'/>
<cd:constant name='pageboundaries' value='marginipagina'/>
<cd:constant name='pagecolor' value='culoarepagina'/>
@@ -1046,6 +1061,7 @@
<cd:constant name='pageconversion' value='pageconversion'/>
<cd:constant name='pageconversionset' value='pageconversionset'/>
<cd:constant name='pageleft' value='pageleft'/>
+ <cd:constant name='pagemethod' value='pagemethod'/>
<cd:constant name='pagenumber' value='numarpagina'/>
<cd:constant name='pageprefix' value='pageprefix'/>
<cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
@@ -1285,6 +1301,7 @@
<cd:constant name='vcompact' value='vcompact'/>
<cd:constant name='vector' value='vector'/>
<cd:constant name='veroffset' value='veroffset'/>
+ <cd:constant name='vertical' value='vertical'/>
<cd:constant name='vfactor' value='vfactor'/>
<cd:constant name='vfil' value='vfil'/>
<cd:constant name='viewerprefix' value='viewerprefix'/>
@@ -1295,6 +1312,7 @@
<cd:constant name='white' value='alb'/>
<cd:constant name='width' value='latime'/>
<cd:constant name='words' value='words'/>
+ <cd:constant name='xanchor' value='xanchor'/>
<cd:constant name='xfactor' value='xfactor'/>
<cd:constant name='xhtml' value='xhtml'/>
<cd:constant name='xmax' value='xmax'/>
@@ -1302,6 +1320,7 @@
<cd:constant name='xoffset' value='xoffset'/>
<cd:constant name='xscale' value='xscala'/>
<cd:constant name='xstep' value='xstep'/>
+ <cd:constant name='yanchor' value='yanchor'/>
<cd:constant name='yfactor' value='yfactor'/>
<cd:constant name='ymax' value='ymax'/>
<cd:constant name='yoffset' value='yoffset'/>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/context-en.xml b/Master/texmf-dist/tex/context/interface/mkiv/context-en.xml
index 73af42a963d..0ebeb7d8777 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/context-en.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/context-en.xml
@@ -238,6 +238,7 @@
<cd:constant type="lesshyphenation"/>
<cd:constant type="morehyphenation"/>
<cd:constant type="hanging"/>
+ <cd:constant type="hangingboth"/>
<cd:constant type="nothanging"/>
<cd:constant type="hz"/>
<cd:constant type="fullhz"/>
@@ -652,6 +653,9 @@
<cd:parameter name="buffer">
<cd:constant type="cd:buffer"/>
</cd:parameter>
+ <cd:parameter name="type">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
<cd:parameter name="state">
<cd:constant default="yes" type="start"/>
<cd:constant type="stop"/>
@@ -1933,6 +1937,26 @@
<cd:content/>
</cd:arguments>
</cd:command>
+ <cd:command file="supp-box.mkiv" level="system" name="hpackbox">
+ <cd:arguments>
+ <cd:dimension/>
+ </cd:arguments>
+ </cd:command>
+ <cd:command file="supp-box.mkiv" level="system" name="vpackbox">
+ <cd:arguments>
+ <cd:dimension/>
+ </cd:arguments>
+ </cd:command>
+ <cd:command file="supp-box.mkiv" level="system" name="hpackedbox">
+ <cd:arguments>
+ <cd:dimension/>
+ </cd:arguments>
+ </cd:command>
+ <cd:command file="supp-box.mkiv" level="system" name="vpackedbox">
+ <cd:arguments>
+ <cd:dimension/>
+ </cd:arguments>
+ </cd:command>
<cd:command file="supp-box.mkiv" level="system" name="inlinedbox">
<cd:arguments>
<cd:content/>
@@ -2432,7 +2456,7 @@
<cd:content/>
</cd:arguments>
</cd:command>
- <cd:command file="supp-box.mkiv" level="system" name="naturalhbox">
+ <cd:command file="supp-dir.mkiv" level="system" name="naturalhbox">
<cd:arguments>
<cd:keywords delimiters="none" optional="yes">
<cd:constant type="cd:text"/>
@@ -2440,7 +2464,7 @@
<cd:content/>
</cd:arguments>
</cd:command>
- <cd:command file="supp-box.mkiv" level="system" name="naturalvbox">
+ <cd:command file="supp-dir.mkiv" level="system" name="naturalvbox">
<cd:arguments>
<cd:keywords delimiters="none" optional="yes">
<cd:constant type="cd:text"/>
@@ -2448,7 +2472,7 @@
<cd:content/>
</cd:arguments>
</cd:command>
- <cd:command file="supp-box.mkiv" level="system" name="naturalvtop">
+ <cd:command file="supp-dir.mkiv" level="system" name="naturalvtop">
<cd:arguments>
<cd:keywords delimiters="none" optional="yes">
<cd:constant type="cd:text"/>
@@ -2464,7 +2488,7 @@
<cd:content/>
</cd:arguments>
</cd:command>
- <cd:command file="supp-box.mkiv" level="system" name="naturalhpack">
+ <cd:command file="supp-dir.mkiv" level="system" name="naturalhpack">
<cd:arguments>
<cd:keywords delimiters="none" optional="yes">
<cd:constant type="cd:text"/>
@@ -2472,7 +2496,63 @@
<cd:content/>
</cd:arguments>
</cd:command>
- <cd:command file="supp-box.mkiv" level="system" name="naturalvpack">
+ <cd:command file="supp-dir.mkiv" level="system" name="naturalvpack">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+ <cd:command file="supp-dir.mkiv" level="system" name="naturaltpack">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+ <cd:command file="supp-dir.mkiv" level="system" name="reversehbox">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+ <cd:command file="supp-dir.mkiv" level="system" name="reversevbox">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+ <cd:command file="supp-dir.mkiv" level="system" name="reversevtop">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+ <cd:command file="supp-dir.mkiv" level="system" name="reversehpack">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+ <cd:command file="supp-dir.mkiv" level="system" name="reversevpack">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+ <cd:command file="supp-dir.mkiv" level="system" name="reversetpack">
<cd:arguments>
<cd:keywords delimiters="none" optional="yes">
<cd:constant type="cd:text"/>
@@ -2711,6 +2791,14 @@
<cd:content/>
</cd:arguments>
</cd:command>
+ <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="rtlhbox">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
<cd:command category="alignment" file="spac-ali.mkiv" level="system" name="lefttorighthbox">
<cd:arguments>
<cd:keywords delimiters="none" optional="yes">
@@ -2719,6 +2807,14 @@
<cd:content/>
</cd:arguments>
</cd:command>
+ <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="ltrhbox">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
<cd:command category="alignment" file="spac-ali.mkiv" level="system" name="righttoleftvbox">
<cd:arguments>
<cd:keywords delimiters="none" optional="yes">
@@ -2727,6 +2823,14 @@
<cd:content/>
</cd:arguments>
</cd:command>
+ <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="rtlvbox">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
<cd:command category="alignment" file="spac-ali.mkiv" level="system" name="lefttorightvbox">
<cd:arguments>
<cd:keywords delimiters="none" optional="yes">
@@ -2735,6 +2839,14 @@
<cd:content/>
</cd:arguments>
</cd:command>
+ <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="ltrvbox">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
<cd:command category="alignment" file="spac-ali.mkiv" level="system" name="righttoleftvtop">
<cd:arguments>
<cd:keywords delimiters="none" optional="yes">
@@ -2743,6 +2855,14 @@
<cd:content/>
</cd:arguments>
</cd:command>
+ <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="rtlvtop">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
<cd:command category="alignment" file="spac-ali.mkiv" level="system" name="lefttorightvtop">
<cd:arguments>
<cd:keywords delimiters="none" optional="yes">
@@ -2751,6 +2871,14 @@
<cd:content/>
</cd:arguments>
</cd:command>
+ <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="ltrvtop">
+ <cd:arguments>
+ <cd:keywords delimiters="none" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
<cd:command category="alignment" file="spac-ali.mkiv" level="system" name="autodirhbox">
<cd:arguments>
<cd:keywords delimiters="none" optional="yes">
@@ -3574,6 +3702,13 @@
</cd:keywords>
</cd:arguments>
</cd:command>
+ <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="cap">
+ <cd:arguments>
+ <cd:keywords delimiters="braces">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
<cd:command category="fonts" file="typo-cap.mkiv" level="style" name="mixedcaps">
<cd:arguments>
<cd:keywords delimiters="braces">
@@ -3595,6 +3730,20 @@
</cd:keywords>
</cd:arguments>
</cd:command>
+ <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="capital">
+ <cd:arguments>
+ <cd:keywords delimiters="braces">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+ <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="smallcaps">
+ <cd:arguments>
+ <cd:keywords delimiters="braces">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
<cd:command category="fonts" file="typo-cap.mkiv" level="style" name="uppercased">
<cd:arguments>
<cd:keywords delimiters="braces">
@@ -5190,106 +5339,6 @@
</cd:arguments>
</cd:command>
</cd:interface>
- <cd:interface file="i-columns.xml">
- <cd:command category="columns" file="page-mul.mkiv" level="style" name="setupcolumns">
- <cd:arguments>
- <cd:assignments list="yes">
- <cd:parameter name="n">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="distance">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="option">
- <cd:constant type="background"/>
- </cd:parameter>
- <cd:parameter name="offset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="command">
- <cd:constant type="cd:oneargument"/>
- </cd:parameter>
- <cd:parameter name="height">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="direction">
- <cd:constant type="left"/>
- <cd:constant default="yes" type="right"/>
- </cd:parameter>
- <cd:parameter name="balance">
- <cd:constant default="yes" type="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="align">
- <cd:inherit type="setupalign"/>
- </cd:parameter>
- <cd:parameter name="tolerance">
- <cd:inherit type="setuptolerance"/>
- </cd:parameter>
- <cd:parameter name="blank">
- <cd:inherit name="blank"/>
- </cd:parameter>
- <cd:parameter name="ntop">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="rule">
- <cd:constant type="on"/>
- <cd:constant default="yes" type="off"/>
- <cd:constant type="cd:command"/>
- </cd:parameter>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
- <cd:command category="columns" file="page-mul.mkiv" level="document" name="columns" type="environment">
- <cd:arguments>
- <cd:assignments list="yes" optional="yes">
- <cd:inherit name="setupcolumns"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
- <cd:command category="columns" file="page-mul.mkiv" level="style" name="setupcolumnspan">
- <cd:arguments>
- <cd:assignments list="yes">
- <cd:parameter name="n">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:inherit name="setupframed"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
- <cd:command category="columns" file="page-mul.mkiv" level="document" name="columnspan" type="environment">
- <cd:arguments>
- <cd:assignments list="yes" optional="yes">
- <cd:inherit name="setupcolumnspan"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
- <cd:command category="columns" file="page-mul.mkiv" level="system" name="setsimplecolumnhsize">
- <cd:arguments>
- <cd:assignments list="yes">
- <cd:parameter name="n">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="width">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="distance">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="lines">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
- <cd:command category="columns" file="page-mul.mkiv" level="system" name="simplecolumns" type="environment">
- <cd:arguments>
- <cd:assignments list="yes" optional="yes">
- <cd:inherit name="setsimplecolumnhsize"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
- </cd:interface>
<cd:interface file="i-combination.xml">
<cd:command category="tables" file="pack-com.mkiv" level="style" name="definecombination">
<cd:arguments>
@@ -6336,7 +6385,7 @@
</cd:command>
<cd:command category="counter language" file="core-con.mkiv" level="document" name="date">
<cd:arguments>
- <cd:assignments list="yes" optional="yes">
+ <cd:assignments list="yes">
<cd:parameter name="d">
<cd:constant type="cd:number"/>
</cd:parameter>
@@ -6493,6 +6542,7 @@
<cd:constant type="setâ£2"/>
<cd:constant type="setâ£3"/>
<cd:constant type="continued"/>
+ <cd:constant type="zero"/>
<cd:constant type="cd:name"/>
</cd:keywords>
<cd:keywords delimiters="braces">
@@ -6673,6 +6723,16 @@
</cd:keywords>
</cd:arguments>
</cd:command>
+ <cd:command category="counter" file="core-con.mkiv" level="style" name="zeronumberconversion">
+ <cd:arguments>
+ <cd:keywords delimiters="braces">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+ <cd:command category="system" file="core-con.mkiv" level="style" name="actualyear"/>
+ <cd:command category="system" file="core-con.mkiv" level="style" name="actualmonth"/>
+ <cd:command category="system" file="core-con.mkiv" level="style" name="actualday"/>
</cd:interface>
<cd:interface file="i-counter.xml">
<cd:command category="counter" file="strc-num.mkiv" level="system" name="definecounter">
@@ -7857,22 +7917,6 @@
</cd:command>
<cd:command category="language alignment" file="typo-dir.mkiv" level="style" name="resetdirection"/>
<cd:command category="alignment" file="supp-dir.mkiv" level="document" name="showdirsinmargin"/>
- <cd:command category="alignment" file="supp-dir.mkiv" level="system" name="istltdir">
- <cd:arguments>
- <cd:keywords delimiters="none">
- <cd:constant type="TLT"/>
- <cd:constant type="TRT"/>
- </cd:keywords>
- </cd:arguments>
- </cd:command>
- <cd:command category="alignment" file="supp-dir.mkiv" level="system" name="istrtdir">
- <cd:arguments>
- <cd:keywords delimiters="none">
- <cd:constant type="TLT"/>
- <cd:constant type="TRT"/>
- </cd:keywords>
- </cd:arguments>
- </cd:command>
</cd:interface>
<cd:interface file="i-document.xml">
<cd:command category="structure" file="file-job.mkvi" level="document" name="text" type="environment"/>
@@ -10068,14 +10112,50 @@
<cd:command category="background layout" file="page-app.mkiv" level="style" name="setupTEXpage">
<cd:arguments>
<cd:assignments list="yes">
- <cd:inherit name="setupfittingpage"/>
+ <cd:parameter name="pagestate">
+ <cd:constant type="start"/>
+ <cd:constant default="yes" type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="page"/>
+ </cd:parameter>
+ <cd:parameter name="scale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="paper">
+ <cd:constant type="auto"/>
+ <cd:constant default="yes" type="default"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed"/>
</cd:assignments>
</cd:arguments>
</cd:command>
<cd:command category="background layout metapost" file="meta-fig.mkiv" level="style" name="setupMPpage">
<cd:arguments>
<cd:assignments list="yes">
- <cd:inherit name="setupfittingpage"/>
+ <cd:parameter name="pagestate">
+ <cd:constant type="start"/>
+ <cd:constant default="yes" type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="page"/>
+ </cd:parameter>
+ <cd:parameter name="scale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="paper">
+ <cd:constant type="auto"/>
+ <cd:constant default="yes" type="default"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed"/>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -10311,6 +10391,13 @@
<cd:constant default="yes" type="yes"/>
<cd:constant type="no"/>
</cd:parameter>
+ <cd:parameter name="compress">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="compressdistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
<cd:inherit name="setupframed"/>
</cd:assignments>
</cd:arguments>
@@ -10397,6 +10484,9 @@
<cd:parameter name="headseparator">
<cd:constant type="cd:text"/>
</cd:parameter>
+ <cd:parameter name="headcommand">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
<cd:parameter name="inbetween">
<cd:constant type="cd:command"/>
</cd:parameter>
@@ -10535,6 +10625,17 @@
<cd:constant type="effective"/>
<cd:constant type="header"/>
<cd:constant type="footer"/>
+ <cd:constant type="tblr"/>
+ <cd:constant type="lrtb"/>
+ <cd:constant type="tbrl"/>
+ <cd:constant type="rltb"/>
+ <cd:constant type="fxtb"/>
+ <cd:constant type="btlr"/>
+ <cd:constant type="lrbt"/>
+ <cd:constant type="btrl"/>
+ <cd:constant type="rlbt"/>
+ <cd:constant type="fxbt"/>
+ <cd:constant type="fixd"/>
</cd:keywords>
<cd:keywords list="yes" optional="yes">
<cd:constant type="cd:reference"/>
@@ -10613,6 +10714,17 @@
<cd:constant type="effective"/>
<cd:constant type="header"/>
<cd:constant type="footer"/>
+ <cd:constant type="tblr"/>
+ <cd:constant type="lrtb"/>
+ <cd:constant type="tbrl"/>
+ <cd:constant type="rltb"/>
+ <cd:constant type="fxtb"/>
+ <cd:constant type="btlr"/>
+ <cd:constant type="lrbt"/>
+ <cd:constant type="btrl"/>
+ <cd:constant type="rlbt"/>
+ <cd:constant type="fxbt"/>
+ <cd:constant type="fixd"/>
</cd:keywords>
<cd:keywords list="yes" optional="yes">
<cd:constant type="cd:reference"/>
@@ -10698,6 +10810,17 @@
<cd:constant type="effective"/>
<cd:constant type="header"/>
<cd:constant type="footer"/>
+ <cd:constant type="tblr"/>
+ <cd:constant type="lrtb"/>
+ <cd:constant type="tbrl"/>
+ <cd:constant type="rltb"/>
+ <cd:constant type="fxtb"/>
+ <cd:constant type="btlr"/>
+ <cd:constant type="lrbt"/>
+ <cd:constant type="btrl"/>
+ <cd:constant type="rlbt"/>
+ <cd:constant type="fxbt"/>
+ <cd:constant type="fixd"/>
</cd:parameter>
<cd:parameter name="reference">
<cd:constant type="cd:reference"/>
@@ -10791,6 +10914,17 @@
<cd:constant type="effective"/>
<cd:constant type="header"/>
<cd:constant type="footer"/>
+ <cd:constant type="tblr"/>
+ <cd:constant type="lrtb"/>
+ <cd:constant type="tbrl"/>
+ <cd:constant type="rltb"/>
+ <cd:constant type="fxtb"/>
+ <cd:constant type="btlr"/>
+ <cd:constant type="lrbt"/>
+ <cd:constant type="btrl"/>
+ <cd:constant type="rlbt"/>
+ <cd:constant type="fxbt"/>
+ <cd:constant type="fixd"/>
</cd:parameter>
<cd:parameter name="reference">
<cd:constant type="cd:reference"/>
@@ -10865,6 +10999,17 @@
<cd:constant type="effective"/>
<cd:constant type="header"/>
<cd:constant type="footer"/>
+ <cd:constant type="tblr"/>
+ <cd:constant type="lrtb"/>
+ <cd:constant type="tbrl"/>
+ <cd:constant type="rltb"/>
+ <cd:constant type="fxtb"/>
+ <cd:constant type="btlr"/>
+ <cd:constant type="lrbt"/>
+ <cd:constant type="btrl"/>
+ <cd:constant type="rlbt"/>
+ <cd:constant type="fxbt"/>
+ <cd:constant type="fixd"/>
</cd:keywords>
<cd:keywords list="yes" optional="yes">
<cd:constant type="cd:reference"/>
@@ -11123,6 +11268,17 @@
<cd:constant type="effective"/>
<cd:constant type="header"/>
<cd:constant type="footer"/>
+ <cd:constant type="tblr"/>
+ <cd:constant type="lrtb"/>
+ <cd:constant type="tbrl"/>
+ <cd:constant type="rltb"/>
+ <cd:constant type="fxtb"/>
+ <cd:constant type="btlr"/>
+ <cd:constant type="lrbt"/>
+ <cd:constant type="btrl"/>
+ <cd:constant type="rlbt"/>
+ <cd:constant type="fxbt"/>
+ <cd:constant type="fixd"/>
</cd:keywords>
<cd:keywords list="yes" optional="yes">
<cd:constant type="cd:reference"/>
@@ -14615,7 +14771,7 @@
<cd:constant type="frame"/>
<cd:constant type="empty"/>
</cd:parameter>
- <cd:parameter name="forgroundcolor">
+ <cd:parameter name="foregroundcolor">
<cd:constant type="cd:color"/>
</cd:parameter>
<cd:parameter name="reset">
@@ -16818,6 +16974,9 @@
<cd:constant type="attachment"/>
<cd:constant type="layer"/>
<cd:constant type="title"/>
+ <cd:constant type="lefttoright"/>
+ <cd:constant type="righttoleft"/>
+ <cd:constant type="nomenubar"/>
</cd:parameter>
<cd:parameter name="copies">
<cd:constant type="cd:number"/>
@@ -17496,6 +17655,7 @@
<cd:constant type="inmargin"/>
<cd:constant type="atmargin"/>
<cd:constant type="intext"/>
+ <cd:constant type="headintext"/>
<cd:constant type="loose"/>
<cd:constant type="fit"/>
<cd:constant type="nofit"/>
@@ -17582,6 +17742,18 @@
<cd:constant type="standard"/>
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="leftmargindistance">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargindistance">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
<cd:parameter name="align">
<cd:inherit name="setupalign"/>
</cd:parameter>
@@ -17678,6 +17850,9 @@
<cd:parameter name="grid">
<cd:inherit name="definegridsnapping"/>
</cd:parameter>
+ <cd:parameter name="packcriterium">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
<cd:inherit name="setupcounter"/>
</cd:assignments>
</cd:arguments>
@@ -17788,6 +17963,18 @@
<cd:constant type="standard"/>
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="leftmargindistance">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargindistance">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
<cd:parameter name="align">
<cd:inherit name="setupalign"/>
</cd:parameter>
@@ -17895,7 +18082,214 @@
<cd:constant method="range" prefix="cd:name" type="cd:number"/>
</cd:keywords>
<cd:assignments list="yes">
- <cd:inherit name="setupitemgroup"/>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="beforehead">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="afterhead">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="lefttext">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="righttext">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="step">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="intro"/>
+ <cd:constant type="random"/>
+ <cd:constant type="continue"/>
+ <cd:constant type="packed"/>
+ <cd:constant type="autointro"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="text"/>
+ <cd:constant type="before"/>
+ <cd:constant type="after"/>
+ <cd:constant type="nowhite"/>
+ <cd:constant type="margin"/>
+ <cd:constant type="inmargin"/>
+ <cd:constant type="atmargin"/>
+ <cd:constant type="intext"/>
+ <cd:constant type="loose"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="nofit"/>
+ <cd:constant type="paragraph"/>
+ <cd:constant type="joinedup"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="stopper"/>
+ <cd:constant type="unpacked"/>
+ <cd:constant type="repeat"/>
+ <cd:constant type="norepeat"/>
+ <cd:constant type="reverse"/>
+ <cd:constant type="columns"/>
+ <cd:constant type="one"/>
+ <cd:constant type="two"/>
+ <cd:constant type="three"/>
+ <cd:constant type="four"/>
+ <cd:constant type="five"/>
+ <cd:constant type="six"/>
+ <cd:constant type="seven"/>
+ <cd:constant type="eight"/>
+ <cd:constant type="nine"/>
+ <cd:constant type="standard"/>
+ <cd:constant method="factor" prefix="cd:number" type="broad"/>
+ <cd:constant method="factor" prefix="cd:number" type="serried"/>
+ <cd:constant type="horizontal"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargin">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargin">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargindistance">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargindistance">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:inherit name="setupalign"/>
+ </cd:parameter>
+ <cd:parameter name="indenting">
+ <cd:inherit name="setupindenting"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="symalign">
+ <cd:constant type="left"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="right"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="center"/>
+ <cd:constant type="flushright"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="indentnext">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="auto"/>
+ </cd:parameter>
+ <cd:parameter name="inner">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:csname"/>
+ </cd:parameter>
+ <cd:parameter name="items">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="maxwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="itemalign">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="inner"/>
+ <cd:constant type="outer"/>
+ </cd:parameter>
+ <cd:parameter name="alignsymbol">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ </cd:parameter>
+ <cd:parameter name="textdistance">
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="none"/>
+ <cd:constant default="yes" type="space"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="placestopper">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="headstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="headcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="marstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="marcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="symstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="symcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="grid">
+ <cd:inherit name="definegridsnapping"/>
+ </cd:parameter>
+ <cd:inherit name="setupcounter"/>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -17910,10 +18304,219 @@
<cd:constant type="cd:number"/>
</cd:keywords>
<cd:keywords list="yes" optional="yes">
- <cd:inherit name="setupitemgroup"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="random"/>
+ <cd:constant type="continue"/>
+ <cd:constant type="packed"/>
+ <cd:constant type="autointro"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="text"/>
+ <cd:constant type="before"/>
+ <cd:constant type="after"/>
+ <cd:constant type="nowhite"/>
+ <cd:constant type="margin"/>
+ <cd:constant type="inmargin"/>
+ <cd:constant type="atmargin"/>
+ <cd:constant type="intext"/>
+ <cd:constant type="headintext"/>
+ <cd:constant type="loose"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="nofit"/>
+ <cd:constant type="paragraph"/>
+ <cd:constant type="joinedup"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="stopper"/>
+ <cd:constant type="nostopper"/>
+ <cd:constant type="unpacked"/>
+ <cd:constant type="repeat"/>
+ <cd:constant type="norepeat"/>
+ <cd:constant type="reverse"/>
+ <cd:constant type="columns"/>
+ <cd:constant type="one"/>
+ <cd:constant type="two"/>
+ <cd:constant type="three"/>
+ <cd:constant type="four"/>
+ <cd:constant type="five"/>
+ <cd:constant type="six"/>
+ <cd:constant type="seven"/>
+ <cd:constant type="eight"/>
+ <cd:constant type="nine"/>
+ <cd:constant type="standard"/>
+ <cd:constant method="factor" prefix="cd:number" type="broad"/>
+ <cd:constant method="factor" prefix="cd:number" type="serried"/>
+ <cd:constant type="horizontal"/>
+ <cd:constant type="cd:name"/>
</cd:keywords>
<cd:assignments list="yes" optional="yes">
- <cd:inherit name="setupitemgroup"/>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="beforehead">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="afterhead">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="lefttext">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="righttext">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="step">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargin">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargin">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargindistance">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargindistance">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:inherit name="setupalign"/>
+ </cd:parameter>
+ <cd:parameter name="indenting">
+ <cd:inherit name="setupindenting"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="symalign">
+ <cd:constant type="left"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="right"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="center"/>
+ <cd:constant type="flushright"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="indentnext">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="auto"/>
+ </cd:parameter>
+ <cd:parameter name="inner">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:csname"/>
+ </cd:parameter>
+ <cd:parameter name="items">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="maxwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="itemalign">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="inner"/>
+ <cd:constant type="outer"/>
+ </cd:parameter>
+ <cd:parameter name="alignsymbol">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ </cd:parameter>
+ <cd:parameter name="textdistance">
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="none"/>
+ <cd:constant default="yes" type="space"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="placestopper">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="headstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="headcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="marstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="marcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="symstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="symcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="grid">
+ <cd:inherit name="definegridsnapping"/>
+ </cd:parameter>
+ <cd:parameter name="packcriterium">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:inherit name="setupcounter"/>
</cd:assignments>
</cd:arguments>
<cd:instances>
@@ -19542,6 +20145,10 @@
<cd:parameter name="artoffset">
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="direction">
+ <cd:constant default="yes" type="normal"/>
+ <cd:constant type="reverse"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -20945,28 +21552,16 @@
</cd:interface>
<cd:interface file="i-logo.xml">
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="TeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="ConTeXt"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PPCHTeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PRAGMA"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LaTeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="TaBlE"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PiCTeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="AmSTeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LamSTeX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="TEX"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="Context"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="ConTeXt"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="CONTEXT"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="MetaFont"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="METAFONT"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="MetaPost"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="METAPOST"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="MetaFun"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="eTeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="pdfTeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="pdfeTeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="Lua"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="luaTeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="luajitTeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="metaTeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="XeTeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LuaTeX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LuajitTeX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="METAFUN"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="MKII"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="MKIV"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="MKVI"/>
@@ -20975,23 +21570,37 @@
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="MPII"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="MPIV"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="MPVI"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="METAFONT"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="METAPOST"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PPCHTeX"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="PPCHTEX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="CONTEXT"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="METAFUN"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="TEX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PRAGMA"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LaTeX"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="LATEX"/>
- <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PICTEX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="TaBlE"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="TABLE"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PiCTeX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PICTEX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="AmSTeX"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="AMSTEX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LamSTeX"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="LAMSTEX"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="INRSTEX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="eTeX"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="ETEX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="pdfTeX"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="PDFTEX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="pdfeTeX"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="PDFETEX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="Lua"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="luaTeX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LuaTeX"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="LUATEX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="luajitTeX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LuajitTeX"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="LUAJITTEX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="luametaTeX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LuaMetaTeX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LUAMETATEX"/>
+ <cd:command category="symbols" file="cont-log.mkiv" level="document" name="XeTeX"/>
<cd:command category="symbols" file="cont-log.mkiv" level="document" name="XETEX"/>
</cd:interface>
<cd:interface file="i-lohi.xml">
@@ -22282,6 +22891,14 @@
<cd:content/>
</cd:arguments>
</cd:command>
+ <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathematics" variant="assignment">
+ <cd:arguments>
+ <cd:assignments list="yes" optional="yes">
+ <cd:inherit name="setupmathematics"/>
+ </cd:assignments>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
<cd:command category="mathematics" file="math-ini.mkiv" level="document" name="math">
<cd:arguments>
<cd:keywords optional="yes">
@@ -22290,6 +22907,14 @@
<cd:content/>
</cd:arguments>
</cd:command>
+ <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="math" variant="assignment">
+ <cd:arguments>
+ <cd:assignments list="yes" optional="yes">
+ <cd:inherit name="setupmathematics"/>
+ </cd:assignments>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
<cd:command category="mathematics" file="math-ini.mkiv" level="document" name="m">
<cd:arguments>
<cd:keywords optional="yes">
@@ -22298,6 +22923,14 @@
<cd:content/>
</cd:arguments>
</cd:command>
+ <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="m" variant="assignment">
+ <cd:arguments>
+ <cd:assignments list="yes" optional="yes">
+ <cd:inherit name="setupmathematics"/>
+ </cd:assignments>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
<cd:command category="mathematics" file="math-ini.mkiv" level="style" name="definemathcommand">
<cd:arguments>
<cd:keywords>
@@ -22693,6 +23326,8 @@
</cd:keywords>
</cd:arguments>
</cd:command>
+ <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="stackscripts"/>
+ <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="unstackscripts"/>
</cd:interface>
<cd:interface file="i-mathalignment.xml">
<cd:command category="mathematics alignment" file="math-ali.mkiv" level="style" name="definemathalignment">
@@ -22900,6 +23535,38 @@
<cd:command category="mathematics" file="math-fen.mkiv" level="document" name="fenced">
<cd:arguments>
<cd:keywords>
+ <cd:constant type="parenthesis"/>
+ <cd:constant type="bracket"/>
+ <cd:constant type="brace"/>
+ <cd:constant type="bar"/>
+ <cd:constant type="doublebar"/>
+ <cd:constant type="triplebar"/>
+ <cd:constant type="angle"/>
+ <cd:constant type="doubleangle"/>
+ <cd:constant type="solidus"/>
+ <cd:constant type="ceiling"/>
+ <cd:constant type="floor"/>
+ <cd:constant type="moustache"/>
+ <cd:constant type="uppercorner"/>
+ <cd:constant type="lowercorner"/>
+ <cd:constant type="group"/>
+ <cd:constant type="openbracket"/>
+ <cd:constant type="mirroredparenthesis"/>
+ <cd:constant type="mirroredbracket"/>
+ <cd:constant type="mirroredbrace"/>
+ <cd:constant type="mirroredbar"/>
+ <cd:constant type="mirroreddoublebar"/>
+ <cd:constant type="mirroredtriplebar"/>
+ <cd:constant type="mirroredangle"/>
+ <cd:constant type="mirroreddoubleangle"/>
+ <cd:constant type="mirroredsolidus"/>
+ <cd:constant type="mirroredceiling"/>
+ <cd:constant type="mirroredfloor"/>
+ <cd:constant type="mirroredmoustache"/>
+ <cd:constant type="mirroreduppercorner"/>
+ <cd:constant type="mirroredlowercorner"/>
+ <cd:constant type="mirroredgroup"/>
+ <cd:constant type="mirroredopenbracket"/>
<cd:constant type="cd:name"/>
</cd:keywords>
<cd:content/>
@@ -22909,6 +23576,56 @@
<cd:command category="mathematics" file="math-fen.mkiv" level="document" name="left">
<cd:arguments>
<cd:keywords delimiters="none">
+ <cd:constant type="\\\\\\\\bgroup"/>
+ <cd:constant type="\\\\\\\\egroup"/>
+ <cd:constant type="\\\\\\\\letteropenbrace"/>
+ <cd:constant type="["/>
+ <cd:constant type="]"/>
+ <cd:constant type="("/>
+ <cd:constant type=")"/>
+ <cd:constant type="&lt;"/>
+ <cd:constant type="&gt;"/>
+ <cd:constant type="/"/>
+ <cd:constant type="|"/>
+ <cd:constant type="⌊"/>
+ <cd:constant type="⌋"/>
+ <cd:constant type="⌈"/>
+ <cd:constant type="⌉"/>
+ <cd:constant type="⟨"/>
+ <cd:constant type="⟩"/>
+ <cd:constant type="⟪"/>
+ <cd:constant type="⟫"/>
+ <cd:constant type="‖"/>
+ <cd:constant type="⦀"/>
+ <cd:constant type="⦗"/>
+ <cd:constant type="\\\\\\\\lbrace"/>
+ <cd:constant type="\\\\\\\\lbracket"/>
+ <cd:constant type="\\\\\\\\lbrack"/>
+ <cd:constant type="\\\\\\\\lparenthesis"/>
+ <cd:constant type="\\\\\\\\lparent"/>
+ <cd:constant type="\\\\\\\\lparen"/>
+ <cd:constant type="\\\\\\\\langle"/>
+ <cd:constant type="\\\\\\\\llangle"/>
+ <cd:constant type="\\\\\\\\lVert"/>
+ <cd:constant type="\\\\\\\\vert"/>
+ <cd:constant type="\\\\\\\\solidus"/>
+ <cd:constant type="\\\\\\\\lfloor"/>
+ <cd:constant type="\\\\\\\\lceiling"/>
+ <cd:constant type="\\\\\\\\lceil"/>
+ <cd:constant type="\\\\\\\\ulcorner"/>
+ <cd:constant type="\\\\\\\\llcorner"/>
+ <cd:constant type="\\\\\\\\lmoustache"/>
+ <cd:constant type="\\\\\\\\llbracket"/>
+ <cd:constant type="\\\\\\\\lgroup"/>
+ <cd:constant type="\\\\\\\\linterval"/>
+ <cd:constant type="\\\\\\\\lointerval"/>
+ <cd:constant type="\\\\\\\\llointerval"/>
+ <cd:constant type="\\\\\\\\lrointerval"/>
+ <cd:constant type="\\\\\\\\{"/>
+ <cd:constant type="\\\\\\\\["/>
+ <cd:constant type="\\\\\\\\("/>
+ <cd:constant type="\\\\\\\\&lt;"/>
+ <cd:constant type="\\\\\\\\|"/>
<cd:constant type="cd:character"/>
</cd:keywords>
</cd:arguments>
@@ -22923,6 +23640,56 @@
<cd:command category="mathematics" file="math-fen.mkiv" level="document" name="right">
<cd:arguments>
<cd:keywords delimiters="none">
+ <cd:constant type="\\\\\\\\egroup"/>
+ <cd:constant type="\\\\\\\\bgroup"/>
+ <cd:constant type="\\\\\\\\letterclosebrace"/>
+ <cd:constant type="]"/>
+ <cd:constant type="["/>
+ <cd:constant type=")"/>
+ <cd:constant type="("/>
+ <cd:constant type="&gt;"/>
+ <cd:constant type="&lt;"/>
+ <cd:constant type="/"/>
+ <cd:constant type="|"/>
+ <cd:constant type="⌋"/>
+ <cd:constant type="⌊"/>
+ <cd:constant type="⌉"/>
+ <cd:constant type="⌈"/>
+ <cd:constant type="⟩"/>
+ <cd:constant type="⟨"/>
+ <cd:constant type="⟫"/>
+ <cd:constant type="⟪"/>
+ <cd:constant type="‖"/>
+ <cd:constant type="⦀"/>
+ <cd:constant type="⦘"/>
+ <cd:constant type="\\\\\\\\rbrace"/>
+ <cd:constant type="\\\\\\\\rbracket"/>
+ <cd:constant type="\\\\\\\\rbracket"/>
+ <cd:constant type="\\\\\\\\rparenthesis"/>
+ <cd:constant type="\\\\\\\\rparent"/>
+ <cd:constant type="\\\\\\\\rparen"/>
+ <cd:constant type="\\\\\\\\rangle"/>
+ <cd:constant type="\\\\\\\\rrangle"/>
+ <cd:constant type="\\\\\\\\rVert"/>
+ <cd:constant type="\\\\\\\\vert"/>
+ <cd:constant type="\\\\\\\\solidus"/>
+ <cd:constant type="\\\\\\\\rfloor"/>
+ <cd:constant type="\\\\\\\\rceiling"/>
+ <cd:constant type="\\\\\\\\rceil"/>
+ <cd:constant type="\\\\\\\\urcorner"/>
+ <cd:constant type="\\\\\\\\lrcorner"/>
+ <cd:constant type="\\\\\\\\rmoustache"/>
+ <cd:constant type="\\\\\\\\rrbracket"/>
+ <cd:constant type="\\\\\\\\rgroup"/>
+ <cd:constant type="\\\\\\\\rinterval"/>
+ <cd:constant type="\\\\\\\\rointerval"/>
+ <cd:constant type="\\\\\\\\rlointerval"/>
+ <cd:constant type="\\\\\\\\rrointerval"/>
+ <cd:constant type="\\\\\\\\}"/>
+ <cd:constant type="\\\\\\\\]"/>
+ <cd:constant type="\\\\\\\\)"/>
+ <cd:constant type="\\\\\\\\&gt;"/>
+ <cd:constant type="\\\\\\\\|"/>
<cd:constant type="cd:character"/>
</cd:keywords>
</cd:arguments>
@@ -23042,6 +23809,56 @@
<cd:command category="mathematics" file="math-fen.mkiv" level="document" name="lfence">
<cd:arguments>
<cd:keywords delimiters="braces">
+ <cd:constant type="\\\\\\\\bgroup"/>
+ <cd:constant type="\\\\\\\\egroup"/>
+ <cd:constant type="\\\\\\\\letteropenbrace"/>
+ <cd:constant type="["/>
+ <cd:constant type="]"/>
+ <cd:constant type="("/>
+ <cd:constant type=")"/>
+ <cd:constant type="&lt;"/>
+ <cd:constant type="&gt;"/>
+ <cd:constant type="/"/>
+ <cd:constant type="|"/>
+ <cd:constant type="⌊"/>
+ <cd:constant type="⌋"/>
+ <cd:constant type="⌈"/>
+ <cd:constant type="⌉"/>
+ <cd:constant type="⟨"/>
+ <cd:constant type="⟩"/>
+ <cd:constant type="⟪"/>
+ <cd:constant type="⟫"/>
+ <cd:constant type="‖"/>
+ <cd:constant type="⦀"/>
+ <cd:constant type="⦗"/>
+ <cd:constant type="\\\\\\\\lbrace"/>
+ <cd:constant type="\\\\\\\\lbracket"/>
+ <cd:constant type="\\\\\\\\lbrack"/>
+ <cd:constant type="\\\\\\\\lparenthesis"/>
+ <cd:constant type="\\\\\\\\lparent"/>
+ <cd:constant type="\\\\\\\\lparen"/>
+ <cd:constant type="\\\\\\\\langle"/>
+ <cd:constant type="\\\\\\\\llangle"/>
+ <cd:constant type="\\\\\\\\lVert"/>
+ <cd:constant type="\\\\\\\\vert"/>
+ <cd:constant type="\\\\\\\\solidus"/>
+ <cd:constant type="\\\\\\\\lfloor"/>
+ <cd:constant type="\\\\\\\\lceiling"/>
+ <cd:constant type="\\\\\\\\lceil"/>
+ <cd:constant type="\\\\\\\\ulcorner"/>
+ <cd:constant type="\\\\\\\\llcorner"/>
+ <cd:constant type="\\\\\\\\lmoustache"/>
+ <cd:constant type="\\\\\\\\llbracket"/>
+ <cd:constant type="\\\\\\\\lgroup"/>
+ <cd:constant type="\\\\\\\\linterval"/>
+ <cd:constant type="\\\\\\\\lointerval"/>
+ <cd:constant type="\\\\\\\\llointerval"/>
+ <cd:constant type="\\\\\\\\lrointerval"/>
+ <cd:constant type="\\\\\\\\{"/>
+ <cd:constant type="\\\\\\\\["/>
+ <cd:constant type="\\\\\\\\("/>
+ <cd:constant type="\\\\\\\\&lt;"/>
+ <cd:constant type="\\\\\\\\|"/>
<cd:constant type="cd:character"/>
</cd:keywords>
</cd:arguments>
@@ -23056,6 +23873,56 @@
<cd:command category="mathematics" file="math-fen.mkiv" level="document" name="rfence">
<cd:arguments>
<cd:keywords delimiters="braces">
+ <cd:constant type="\\\\\\\\egroup"/>
+ <cd:constant type="\\\\\\\\bgroup"/>
+ <cd:constant type="\\\\\\\\letterclosebrace"/>
+ <cd:constant type="]"/>
+ <cd:constant type="["/>
+ <cd:constant type=")"/>
+ <cd:constant type="("/>
+ <cd:constant type="&gt;"/>
+ <cd:constant type="&lt;"/>
+ <cd:constant type="/"/>
+ <cd:constant type="|"/>
+ <cd:constant type="⌋"/>
+ <cd:constant type="⌊"/>
+ <cd:constant type="⌉"/>
+ <cd:constant type="⌈"/>
+ <cd:constant type="⟩"/>
+ <cd:constant type="⟨"/>
+ <cd:constant type="⟫"/>
+ <cd:constant type="⟪"/>
+ <cd:constant type="‖"/>
+ <cd:constant type="⦀"/>
+ <cd:constant type="⦘"/>
+ <cd:constant type="\\\\\\\\rbrace"/>
+ <cd:constant type="\\\\\\\\rbracket"/>
+ <cd:constant type="\\\\\\\\rbracket"/>
+ <cd:constant type="\\\\\\\\rparenthesis"/>
+ <cd:constant type="\\\\\\\\rparent"/>
+ <cd:constant type="\\\\\\\\rparen"/>
+ <cd:constant type="\\\\\\\\rangle"/>
+ <cd:constant type="\\\\\\\\rrangle"/>
+ <cd:constant type="\\\\\\\\rVert"/>
+ <cd:constant type="\\\\\\\\vert"/>
+ <cd:constant type="\\\\\\\\solidus"/>
+ <cd:constant type="\\\\\\\\rfloor"/>
+ <cd:constant type="\\\\\\\\rceiling"/>
+ <cd:constant type="\\\\\\\\rceil"/>
+ <cd:constant type="\\\\\\\\urcorner"/>
+ <cd:constant type="\\\\\\\\lrcorner"/>
+ <cd:constant type="\\\\\\\\rmoustache"/>
+ <cd:constant type="\\\\\\\\rrbracket"/>
+ <cd:constant type="\\\\\\\\rgroup"/>
+ <cd:constant type="\\\\\\\\rinterval"/>
+ <cd:constant type="\\\\\\\\rointerval"/>
+ <cd:constant type="\\\\\\\\rlointerval"/>
+ <cd:constant type="\\\\\\\\rrointerval"/>
+ <cd:constant type="\\\\\\\\}"/>
+ <cd:constant type="\\\\\\\\]"/>
+ <cd:constant type="\\\\\\\\)"/>
+ <cd:constant type="\\\\\\\\&gt;"/>
+ <cd:constant type="\\\\\\\\|"/>
<cd:constant type="cd:character"/>
</cd:keywords>
</cd:arguments>
@@ -24424,8 +25291,16 @@
<cd:instances>
<cd:constant value="itemgroupcolumns"/>
<cd:constant value="boxedcolumns"/>
+ <cd:constant value="columns"/>
</cd:instances>
</cd:command>
+ <cd:command category="structure layout" file="page-smp.mkiv" level="style" name="setupcolumns">
+ <cd:arguments>
+ <cd:assignments list="yes">
+ <cd:inherit name="setupmixedcolumns"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
</cd:interface>
<cd:interface file="i-modes.xml">
<cd:command category="structure" file="core-env.mkiv" level="system" name="newmode">
@@ -25656,6 +26531,13 @@
</cd:assignments>
</cd:arguments>
</cd:command>
+ <cd:command category="structure notes" file="strc-not.mkvi" level="style" name="setupfootnotes">
+ <cd:arguments>
+ <cd:assignments list="yes">
+ <cd:inherit name="setupnote"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
<cd:command category="structure notes" file="strc-not.mkvi" level="document" name="setnote">
<cd:arguments>
<cd:keywords>
@@ -25952,6 +26834,54 @@
</cd:keywords>
</cd:arguments>
</cd:command>
+ <cd:command category="structure notes" file="strc-tnt.mkiv" level="style" name="definetextnote">
+ <cd:arguments>
+ <cd:keywords>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments list="yes" optional="yes">
+ <cd:inherit name="setuptextnote"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+ <cd:command category="structure notes" file="strc-tnt.mkiv" level="style" name="setuptextnote">
+ <cd:arguments>
+ <cd:keywords list="yes" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments list="yes">
+ <cd:parameter name="rule">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="note">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="*"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="empty">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ <cd:constant type="none"/>
+ <cd:constant type="number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+ <cd:command category="structure notes" file="strc-tnt.mkiv" generated="yes" level="document" name="textnote">
+ <cd:arguments>
+ <cd:assignments list="yes" optional="yes">
+ <cd:inherit name="setuptextnote"/>
+ </cd:assignments>
+ <cd:keywords delimiters="braces">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
</cd:interface>
<cd:interface file="i-object.xml">
<cd:command category="pdf" file="pack-obj.mkiv" level="system" name="ifinobject">
@@ -26903,7 +27833,29 @@
<cd:constant type="cd:name"/>
</cd:keywords>
<cd:assignments list="yes" optional="yes">
- <cd:inherit name="setupcolumnsetspan"/>
+ <cd:parameter name="c">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="r">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="method">
+ <cd:constant type="tblr"/>
+ <cd:constant type="lrtb"/>
+ <cd:constant type="tbrl"/>
+ <cd:constant type="rltb"/>
+ <cd:constant type="fxtb"/>
+ <cd:constant type="btlr"/>
+ <cd:constant type="lrbt"/>
+ <cd:constant type="btrl"/>
+ <cd:constant type="rlbt"/>
+ <cd:constant type="fxbt"/>
+ <cd:constant type="fixd"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant default="yes" type="none"/>
+ <cd:constant type="wide"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -27179,7 +28131,17 @@
<cd:command category="counter" file="strc-pag.mkiv" level="style" name="setuppagenumber">
<cd:arguments>
<cd:assignments list="yes">
- <cd:inherit name="setupuserpagenumber"/>
+ <cd:parameter name="viewerprefix">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="none"/>
+ <cd:constant type="keep"/>
+ <cd:constant type="empty"/>
+ </cd:parameter>
+ <cd:inherit name="setupcounter"/>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -28142,6 +29104,7 @@
<cd:command category="tables" file="tabl-mis.mkiv" level="style" name="setupparagraphs" variant="assignment">
<cd:arguments>
<cd:keywords optional="yes">
+ <cd:constant type="cd:name"/>
<cd:constant method="range" prefix="cd:name" type="cd:number"/>
</cd:keywords>
<cd:assignments list="yes">
@@ -33538,6 +34501,7 @@
<cd:constant default="yes" type="no"/>
<cd:constant type="all"/>
<cd:constant type="packed"/>
+ <cd:constant type="text"/>
</cd:parameter>
<cd:parameter name="check">
<cd:constant default="yes" type="yes"/>
@@ -33702,6 +34666,10 @@
<cd:parameter name="numberorder">
<cd:constant default="yes" type="numbers"/>
</cd:parameter>
+ <cd:parameter name="pagemethod">
+ <cd:constant default="yes" type="page"/>
+ <cd:constant type="section"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -33752,6 +34720,8 @@
<cd:constant type="yes"/>
<cd:constant default="yes" type="no"/>
<cd:constant type="all"/>
+ <cd:constant type="packed"/>
+ <cd:constant type="text"/>
</cd:parameter>
<cd:parameter name="check">
<cd:constant default="yes" type="yes"/>
@@ -33916,6 +34886,10 @@
<cd:parameter name="numberorder">
<cd:constant default="yes" type="numbers"/>
</cd:parameter>
+ <cd:parameter name="pagemethod">
+ <cd:constant default="yes" type="page"/>
+ <cd:constant type="section"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -33928,7 +34902,216 @@
<cd:constant type="cd:number"/>
</cd:keywords>
<cd:assignments list="yes">
- <cd:inherit name="setupregister"/>
+ <cd:parameter name="referencemethod">
+ <cd:constant type="forward"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ <cd:constant type="xml"/>
+ </cd:parameter>
+ <cd:parameter name="ownnumber">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ </cd:parameter>
+ <cd:parameter name="xmlsetup">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="A"/>
+ <cd:constant type="B"/>
+ </cd:parameter>
+ <cd:parameter name="method">
+ <cd:constant type="default"/>
+ <cd:constant type="before"/>
+ <cd:constant type="after"/>
+ <cd:constant type="first"/>
+ <cd:constant type="last"/>
+ <cd:constant type="ch"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="zm"/>
+ <cd:constant type="pm"/>
+ <cd:constant type="mc"/>
+ <cd:constant type="zc"/>
+ <cd:constant type="pc"/>
+ <cd:constant type="uc"/>
+ </cd:parameter>
+ <cd:parameter name="compress">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ <cd:constant type="all"/>
+ <cd:constant type="packed"/>
+ <cd:constant type="text"/>
+ </cd:parameter>
+ <cd:parameter name="check">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="local"/>
+ <cd:constant type="text"/>
+ <cd:constant type="current"/>
+ <cd:constant type="previous"/>
+ <cd:constant default="yes" type="all"/>
+ <cd:constant type="cd:section"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixseparatorset">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixconversionset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixstarter">
+ <cd:constant type="cd:command"/>
+ <cd:constant method="apply" prefix="cd:processor" type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixstopper">
+ <cd:constant type="cd:command"/>
+ <cd:constant method="apply" prefix="cd:processor" type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixsegments">
+ <cd:constant type="cd:number"/>
+ <cd:constant method="range" prefix="cd:number" type="cd:number"/>
+ <cd:constant method="range" prefix="cd:number" type="*"/>
+ <cd:constant method="range" prefix="cd:number" type="all"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant method="range" prefix="cd:section" type="cd:section"/>
+ <cd:constant method="range" prefix="cd:section" type="*"/>
+ <cd:constant method="range" prefix="cd:section" type="all"/>
+ <cd:constant type="current"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixconnector">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefix">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="pageseparatorset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageconversionset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pagestarter">
+ <cd:constant type="cd:command"/>
+ <cd:constant method="apply" prefix="cd:processor" type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pagestopper">
+ <cd:constant type="cd:command"/>
+ <cd:constant method="apply" prefix="cd:processor" type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pagesegments">
+ <cd:constant type="cd:number"/>
+ <cd:constant method="range" prefix="cd:number" type="cd:number"/>
+ <cd:constant method="range" prefix="cd:number" type="*"/>
+ <cd:constant method="range" prefix="cd:number" type="all"/>
+ </cd:parameter>
+ <cd:parameter name="maxwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="indicator">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="pagecommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="text"/>
+ <cd:constant default="yes" type="pagenumber"/>
+ </cd:parameter>
+ <cd:parameter name="pagenumber">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="a"/>
+ <cd:constant default="yes" type="n"/>
+ <cd:constant type="none"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="language">
+ <cd:constant type="default"/>
+ <cd:constant type="DINâ£5007-1"/>
+ <cd:constant type="DINâ£5007-2"/>
+ <cd:constant type="Duden"/>
+ <cd:constant type="de-DE"/>
+ <cd:constant type="de-CH"/>
+ <cd:constant type="de-AT"/>
+ <cd:constant type="ru-iso9"/>
+ <cd:constant type="ocs-scn"/>
+ <cd:constant type="cd:language"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="textstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="textcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="pagestyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pagecolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="pageleft">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageright">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="balance">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:inherit name="setupalign"/>
+ </cd:parameter>
+ <cd:parameter name="numberorder">
+ <cd:constant default="yes" type="numbers"/>
+ </cd:parameter>
+ <cd:parameter name="pagemethod">
+ <cd:constant default="yes" type="page"/>
+ <cd:constant type="section"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -33939,7 +35122,216 @@
<cd:constant method="range" prefix="cd:name" type="cd:number"/>
</cd:keywords>
<cd:assignments list="yes">
- <cd:inherit name="setupregister"/>
+ <cd:parameter name="referencemethod">
+ <cd:constant type="forward"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ <cd:constant type="xml"/>
+ </cd:parameter>
+ <cd:parameter name="ownnumber">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ </cd:parameter>
+ <cd:parameter name="xmlsetup">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="A"/>
+ <cd:constant type="B"/>
+ </cd:parameter>
+ <cd:parameter name="method">
+ <cd:constant type="default"/>
+ <cd:constant type="before"/>
+ <cd:constant type="after"/>
+ <cd:constant type="first"/>
+ <cd:constant type="last"/>
+ <cd:constant type="ch"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="zm"/>
+ <cd:constant type="pm"/>
+ <cd:constant type="mc"/>
+ <cd:constant type="zc"/>
+ <cd:constant type="pc"/>
+ <cd:constant type="uc"/>
+ </cd:parameter>
+ <cd:parameter name="compress">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ <cd:constant type="all"/>
+ <cd:constant type="packed"/>
+ <cd:constant type="text"/>
+ </cd:parameter>
+ <cd:parameter name="check">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="local"/>
+ <cd:constant type="text"/>
+ <cd:constant type="current"/>
+ <cd:constant type="previous"/>
+ <cd:constant default="yes" type="all"/>
+ <cd:constant type="cd:section"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixseparatorset">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixconversionset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixstarter">
+ <cd:constant type="cd:command"/>
+ <cd:constant method="apply" prefix="cd:processor" type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixstopper">
+ <cd:constant type="cd:command"/>
+ <cd:constant method="apply" prefix="cd:processor" type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixsegments">
+ <cd:constant type="cd:number"/>
+ <cd:constant method="range" prefix="cd:number" type="cd:number"/>
+ <cd:constant method="range" prefix="cd:number" type="*"/>
+ <cd:constant method="range" prefix="cd:number" type="all"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant method="range" prefix="cd:section" type="cd:section"/>
+ <cd:constant method="range" prefix="cd:section" type="*"/>
+ <cd:constant method="range" prefix="cd:section" type="all"/>
+ <cd:constant type="current"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixconnector">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefix">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="pageseparatorset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageconversionset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pagestarter">
+ <cd:constant type="cd:command"/>
+ <cd:constant method="apply" prefix="cd:processor" type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pagestopper">
+ <cd:constant type="cd:command"/>
+ <cd:constant method="apply" prefix="cd:processor" type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pagesegments">
+ <cd:constant type="cd:number"/>
+ <cd:constant method="range" prefix="cd:number" type="cd:number"/>
+ <cd:constant method="range" prefix="cd:number" type="*"/>
+ <cd:constant method="range" prefix="cd:number" type="all"/>
+ </cd:parameter>
+ <cd:parameter name="maxwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="indicator">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="pagecommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="text"/>
+ <cd:constant default="yes" type="pagenumber"/>
+ </cd:parameter>
+ <cd:parameter name="pagenumber">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="a"/>
+ <cd:constant default="yes" type="n"/>
+ <cd:constant type="none"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="language">
+ <cd:constant type="default"/>
+ <cd:constant type="DINâ£5007-1"/>
+ <cd:constant type="DINâ£5007-2"/>
+ <cd:constant type="Duden"/>
+ <cd:constant type="de-DE"/>
+ <cd:constant type="de-CH"/>
+ <cd:constant type="de-AT"/>
+ <cd:constant type="ru-iso9"/>
+ <cd:constant type="ocs-scn"/>
+ <cd:constant type="cd:language"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="textstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="textcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="pagestyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pagecolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="pageleft">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageright">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="balance">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:inherit name="setupalign"/>
+ </cd:parameter>
+ <cd:parameter name="numberorder">
+ <cd:constant default="yes" type="numbers"/>
+ </cd:parameter>
+ <cd:parameter name="pagemethod">
+ <cd:constant default="yes" type="page"/>
+ <cd:constant type="section"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -34034,7 +35426,216 @@
<cd:constant type="cd:number"/>
</cd:keywords>
<cd:assignments list="yes">
- <cd:inherit name="setupregister"/>
+ <cd:parameter name="referencemethod">
+ <cd:constant type="forward"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ <cd:constant type="xml"/>
+ </cd:parameter>
+ <cd:parameter name="ownnumber">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ </cd:parameter>
+ <cd:parameter name="xmlsetup">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="A"/>
+ <cd:constant type="B"/>
+ </cd:parameter>
+ <cd:parameter name="method">
+ <cd:constant type="default"/>
+ <cd:constant type="before"/>
+ <cd:constant type="after"/>
+ <cd:constant type="first"/>
+ <cd:constant type="last"/>
+ <cd:constant type="ch"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="zm"/>
+ <cd:constant type="pm"/>
+ <cd:constant type="mc"/>
+ <cd:constant type="zc"/>
+ <cd:constant type="pc"/>
+ <cd:constant type="uc"/>
+ </cd:parameter>
+ <cd:parameter name="compress">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ <cd:constant type="all"/>
+ <cd:constant type="packed"/>
+ <cd:constant type="text"/>
+ </cd:parameter>
+ <cd:parameter name="check">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="local"/>
+ <cd:constant type="text"/>
+ <cd:constant type="current"/>
+ <cd:constant type="previous"/>
+ <cd:constant default="yes" type="all"/>
+ <cd:constant type="cd:section"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixseparatorset">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixconversionset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixstarter">
+ <cd:constant type="cd:command"/>
+ <cd:constant method="apply" prefix="cd:processor" type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixstopper">
+ <cd:constant type="cd:command"/>
+ <cd:constant method="apply" prefix="cd:processor" type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixsegments">
+ <cd:constant type="cd:number"/>
+ <cd:constant method="range" prefix="cd:number" type="cd:number"/>
+ <cd:constant method="range" prefix="cd:number" type="*"/>
+ <cd:constant method="range" prefix="cd:number" type="all"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant method="range" prefix="cd:section" type="cd:section"/>
+ <cd:constant method="range" prefix="cd:section" type="*"/>
+ <cd:constant method="range" prefix="cd:section" type="all"/>
+ <cd:constant type="current"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixconnector">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefix">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="pageseparatorset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageconversionset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pagestarter">
+ <cd:constant type="cd:command"/>
+ <cd:constant method="apply" prefix="cd:processor" type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pagestopper">
+ <cd:constant type="cd:command"/>
+ <cd:constant method="apply" prefix="cd:processor" type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pagesegments">
+ <cd:constant type="cd:number"/>
+ <cd:constant method="range" prefix="cd:number" type="cd:number"/>
+ <cd:constant method="range" prefix="cd:number" type="*"/>
+ <cd:constant method="range" prefix="cd:number" type="all"/>
+ </cd:parameter>
+ <cd:parameter name="maxwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="indicator">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="pagecommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="text"/>
+ <cd:constant default="yes" type="pagenumber"/>
+ </cd:parameter>
+ <cd:parameter name="pagenumber">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="a"/>
+ <cd:constant default="yes" type="n"/>
+ <cd:constant type="none"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="language">
+ <cd:constant type="default"/>
+ <cd:constant type="DINâ£5007-1"/>
+ <cd:constant type="DINâ£5007-2"/>
+ <cd:constant type="Duden"/>
+ <cd:constant type="de-DE"/>
+ <cd:constant type="de-CH"/>
+ <cd:constant type="de-AT"/>
+ <cd:constant type="ru-iso9"/>
+ <cd:constant type="ocs-scn"/>
+ <cd:constant type="cd:language"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="textstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="textcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="pagestyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pagecolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="pageleft">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageright">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="balance">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:inherit name="setupalign"/>
+ </cd:parameter>
+ <cd:parameter name="numberorder">
+ <cd:constant default="yes" type="numbers"/>
+ </cd:parameter>
+ <cd:parameter name="pagemethod">
+ <cd:constant default="yes" type="page"/>
+ <cd:constant type="section"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
<cd:instances>
@@ -34057,10 +35658,10 @@
<cd:constant method="apply" prefix="cd:processor" type="cd:text"/>
</cd:keywords>
<cd:index list="yes"/>
- </cd:arguments>
- </cd:command>
- <cd:command category="structure" file="strc-reg.mkiv" level="document" name="stopregister">
- <cd:arguments>
+ <cd:keywords delimiters="none">
+ <cd:constant type="cd:content"/>
+ </cd:keywords>
+ <cd:delimiter name="stopregister"/>
<cd:keywords>
<cd:constant type="cd:name"/>
</cd:keywords>
@@ -34236,10 +35837,10 @@
<cd:constant type="cd:value"/>
</cd:parameter>
</cd:assignments>
- </cd:arguments>
- </cd:command>
- <cd:command category="structure" file="strc-reg.mkiv" level="document" name="stopstructurepageregister">
- <cd:arguments>
+ <cd:keywords delimiters="none">
+ <cd:constant type="cd:content"/>
+ </cd:keywords>
+ <cd:delimiter name="stopstructurepageregister"/>
<cd:keywords>
<cd:constant type="cd:name"/>
</cd:keywords>
@@ -35106,6 +36707,10 @@
<cd:constant type="positive"/>
<cd:constant type="all"/>
</cd:parameter>
+ <cd:parameter name="hidenumber">
+ <cd:constant type="yes"/>
+ <cd:constant default="yes" type="no"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -35299,6 +36904,34 @@
</cd:assignments>
</cd:arguments>
</cd:command>
+ <cd:command category="structure" file="strc-sec.mkiv" level="system" name="placerawheaddata">
+ <cd:arguments>
+ <cd:keywords>
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+ <cd:command category="structure" file="strc-sec.mkiv" level="system" name="placerawheadtext">
+ <cd:arguments>
+ <cd:keywords>
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+ <cd:command category="structure" file="strc-sec.mkiv" level="system" name="placerawheadnumber">
+ <cd:arguments>
+ <cd:keywords>
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+ <cd:command category="structure" file="strc-sec.mkiv" level="document" name="repeathead">
+ <cd:arguments>
+ <cd:keywords>
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
<cd:command category="structure" file="strc-sec.mkiv" level="system" name="definesection">
<cd:arguments>
<cd:keywords>
@@ -36140,6 +37773,33 @@
</cd:arguments>
</cd:command>
</cd:interface>
+ <cd:interface file="i-simplecolumns.xml">
+ <cd:command category="structure layout" file="page-smp.mkiv" level="system" name="setsimplecolumnshsize">
+ <cd:arguments>
+ <cd:assignments list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="lines">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+ <cd:command category="structure layout" file="page-smp.mkiv" level="system" name="simplecolumns" type="environment">
+ <cd:arguments>
+ <cd:assignments list="yes" optional="yes">
+ <cd:inherit name="setsimplecolumnshsize"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+ </cd:interface>
<cd:interface file="i-smash.xml">
<cd:command file="supp-box.mkiv" level="system" name="smashbox">
<cd:arguments>
@@ -36964,6 +38624,16 @@
</cd:keywords>
</cd:arguments>
</cd:command>
+ <cd:command category="symbols" file="symb-ini.mkiv" level="style" name="setupsymbols">
+ <cd:arguments>
+ <cd:assignments list="yes">
+ <cd:parameter name="stylealternative">
+ <cd:constant default="yes" type="text"/>
+ <cd:constant type="math"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
</cd:interface>
<cd:interface file="i-synctex.xml">
<cd:command category="pdf" file="cont-run.mkiv" level="system" name="synctexsetfilename">
@@ -43029,7 +44699,59 @@
<cd:constant type="edge"/>
</cd:keywords>
<cd:assignments list="yes">
- <cd:inherit name="setuplayouttext"/>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="high"/>
+ <cd:constant type="none"/>
+ <cd:constant default="yes" type="normal"/>
+ <cd:constant type="nomarking"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rightstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="rightcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -43041,7 +44763,59 @@
<cd:constant type="edge"/>
</cd:keywords>
<cd:assignments list="yes">
- <cd:inherit name="setuplayouttext"/>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="high"/>
+ <cd:constant type="none"/>
+ <cd:constant default="yes" type="normal"/>
+ <cd:constant type="nomarking"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rightstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="rightcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -43053,7 +44827,59 @@
<cd:constant type="edge"/>
</cd:keywords>
<cd:assignments list="yes">
- <cd:inherit name="setuplayouttext"/>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="high"/>
+ <cd:constant type="none"/>
+ <cd:constant default="yes" type="normal"/>
+ <cd:constant type="nomarking"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rightstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="rightcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -43065,7 +44891,59 @@
<cd:constant type="edge"/>
</cd:keywords>
<cd:assignments list="yes">
- <cd:inherit name="setuplayouttext"/>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="high"/>
+ <cd:constant type="none"/>
+ <cd:constant default="yes" type="normal"/>
+ <cd:constant type="nomarking"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rightstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="rightcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -43077,7 +44955,59 @@
<cd:constant type="edge"/>
</cd:keywords>
<cd:assignments list="yes">
- <cd:inherit name="setuplayouttext"/>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="high"/>
+ <cd:constant type="none"/>
+ <cd:constant default="yes" type="normal"/>
+ <cd:constant type="nomarking"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant default="yes" type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rightstyle">
+ <cd:constant type="cd:style"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="rightcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -45800,6 +47730,9 @@
</cd:keywords>
</cd:arguments>
</cd:command>
+ <cd:command category="whitespace" file="typo-wrp.mkiv" level="document" name="crlf"/>
+ <cd:command category="whitespace" file="typo-wrp.mkiv" level="document" name="settestcrlf"/>
+ <cd:command category="whitespace" file="typo-wrp.mkiv" level="document" name="crlfplaceholder"/>
</cd:interface>
<cd:interface file="i-whitespace.xml">
<cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setupwhitespace">
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-align.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-align.xml
index 669b845b918..eaebaa698f2 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-align.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-align.xml
@@ -42,6 +42,7 @@
<cd:constant type="lesshyphenation"/>
<cd:constant type="morehyphenation"/>
<cd:constant type="hanging"/>
+ <cd:constant type="hangingboth"/>
<cd:constant type="nothanging"/>
<cd:constant type="hz"/>
<cd:constant type="fullhz"/>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-attachment.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-attachment.xml
index 85cf8843bc4..550cc57ce66 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-attachment.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-attachment.xml
@@ -36,6 +36,9 @@
<cd:parameter name="buffer">
<cd:constant type="cd:buffer"/>
</cd:parameter>
+ <cd:parameter name="type">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
<cd:parameter name="state">
<cd:constant type="start" default="yes"/>
<cd:constant type="stop"/>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-boxes.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-boxes.xml
index e89be4fd06c..8c6c6c74a7a 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-boxes.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-boxes.xml
@@ -259,6 +259,30 @@
</cd:arguments>
</cd:command>
+ <cd:command name="hpackbox" level="system" file="supp-box.mkiv">
+ <cd:arguments>
+ <cd:dimension/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="vpackbox" level="system" file="supp-box.mkiv">
+ <cd:arguments>
+ <cd:dimension/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hpackedbox" level="system" file="supp-box.mkiv">
+ <cd:arguments>
+ <cd:dimension/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="vpackedbox" level="system" file="supp-box.mkiv">
+ <cd:arguments>
+ <cd:dimension/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="inlinedbox" level="system" file="supp-box.mkiv">
<cd:arguments>
<cd:content/>
@@ -725,21 +749,21 @@
</cd:arguments>
</cd:command>
- <cd:command name="naturalhbox" level="system" file="supp-box.mkiv">
+ <cd:command name="naturalhbox" level="system" file="supp-dir.mkiv">
<cd:arguments>
<cd:resolve name="string-boxoptions"/>
<cd:content/>
</cd:arguments>
</cd:command>
- <cd:command name="naturalvbox" level="system" file="supp-box.mkiv">
+ <cd:command name="naturalvbox" level="system" file="supp-dir.mkiv">
<cd:arguments>
<cd:resolve name="string-boxoptions"/>
<cd:content/>
</cd:arguments>
</cd:command>
- <cd:command name="naturalvtop" level="system" file="supp-box.mkiv">
+ <cd:command name="naturalvtop" level="system" file="supp-dir.mkiv">
<cd:arguments>
<cd:resolve name="string-boxoptions"/>
<cd:content/>
@@ -753,14 +777,63 @@
</cd:arguments>
</cd:command>
- <cd:command name="naturalhpack" level="system" file="supp-box.mkiv">
+ <cd:command name="naturalhpack" level="system" file="supp-dir.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="naturalvpack" level="system" file="supp-dir.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="naturaltpack" level="system" file="supp-dir.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reversehbox" level="system" file="supp-dir.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reversevbox" level="system" file="supp-dir.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reversevtop" level="system" file="supp-dir.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reversehpack" level="system" file="supp-dir.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reversevpack" level="system" file="supp-dir.mkiv">
<cd:arguments>
<cd:resolve name="string-boxoptions"/>
<cd:content/>
</cd:arguments>
</cd:command>
- <cd:command name="naturalvpack" level="system" file="supp-box.mkiv">
+ <cd:command name="reversetpack" level="system" file="supp-dir.mkiv">
<cd:arguments>
<cd:resolve name="string-boxoptions"/>
<cd:content/>
@@ -950,6 +1023,13 @@
</cd:arguments>
</cd:command>
+ <cd:command name="rtlhbox" level="system" category="alignment" file="spac-ali.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="lefttorighthbox" level="system" category="alignment" file="spac-ali.mkiv">
<cd:arguments>
<cd:resolve name="string-boxoptions"/>
@@ -957,6 +1037,13 @@
</cd:arguments>
</cd:command>
+ <cd:command name="ltrhbox" level="system" category="alignment" file="spac-ali.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="righttoleftvbox" level="system" category="alignment" file="spac-ali.mkiv">
<cd:arguments>
<cd:resolve name="string-boxoptions"/>
@@ -964,6 +1051,13 @@
</cd:arguments>
</cd:command>
+ <cd:command name="rtlvbox" level="system" category="alignment" file="spac-ali.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="lefttorightvbox" level="system" category="alignment" file="spac-ali.mkiv">
<cd:arguments>
<cd:resolve name="string-boxoptions"/>
@@ -971,6 +1065,13 @@
</cd:arguments>
</cd:command>
+ <cd:command name="ltrvbox" level="system" category="alignment" file="spac-ali.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="righttoleftvtop" level="system" category="alignment" file="spac-ali.mkiv">
<cd:arguments>
<cd:resolve name="string-boxoptions"/>
@@ -978,6 +1079,13 @@
</cd:arguments>
</cd:command>
+ <cd:command name="rtlvtop" level="system" category="alignment" file="spac-ali.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="lefttorightvtop" level="system" category="alignment" file="spac-ali.mkiv">
<cd:arguments>
<cd:resolve name="string-boxoptions"/>
@@ -985,6 +1093,13 @@
</cd:arguments>
</cd:command>
+ <cd:command name="ltrvtop" level="system" category="alignment" file="spac-ali.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="autodirhbox" level="system" category="alignment" file="spac-ali.mkiv">
<cd:arguments>
<cd:resolve name="string-boxoptions"/>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-capitals.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-capitals.xml
index 4cfb4a08020..6115b1519ba 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-capitals.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-capitals.xml
@@ -167,6 +167,12 @@
</cd:arguments>
</cd:command>
+ <cd:command name="cap" level="style" category="fonts" file="typo-cap.mkiv">
+ <cd:arguments>
+ <cd:resolve name="argument-text"/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="mixedcaps" level="style" category="fonts" file="typo-cap.mkiv">
<cd:arguments>
<cd:resolve name="argument-text"/>
@@ -185,6 +191,18 @@
</cd:arguments>
</cd:command>
+ <cd:command name="capital" level="style" category="fonts" file="typo-cap.mkiv">
+ <cd:arguments>
+ <cd:resolve name="argument-text"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="smallcaps" level="style" category="fonts" file="typo-cap.mkiv">
+ <cd:arguments>
+ <cd:resolve name="argument-text"/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="uppercased" level="style" category="fonts" file="typo-cap.mkiv">
<cd:arguments>
<cd:resolve name="argument-text"/>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-chart.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-chart.xml
index 2b73f132253..43672efa043 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-chart.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-chart.xml
@@ -119,6 +119,9 @@
<cd:parameter name="offset">
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="clipoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
<cd:parameter name="dx">
<cd:constant type="cd:dimension"/>
</cd:parameter>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-columns.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-columns.xml
index bbc022ac67a..aa290a0a959 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-columns.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-columns.xml
@@ -34,10 +34,10 @@
<cd:constant type="no"/>
</cd:parameter>
<cd:parameter name="align">
- <cd:inherit type="setupalign"/>
+ <cd:inherit name="setupalign"/>
</cd:parameter>
<cd:parameter name="tolerance">
- <cd:inherit type="setuptolerance"/>
+ <cd:inherit name="setuptolerance"/>
</cd:parameter>
<cd:parameter name="blank">
<cd:inherit name="blank"/>
@@ -81,7 +81,7 @@
</cd:arguments>
</cd:command>
- <cd:command name="setsimplecolumnhsize" level="system" category="columns" file="page-mul.mkiv">
+ <cd:command name="setsimplecolumnshsize" level="system" category="columns" file="page-mul.mkiv">
<cd:arguments>
<cd:assignments list="yes">
<cd:parameter name="n">
@@ -103,9 +103,9 @@
<cd:command name="simplecolumns" type="environment" level="system" category="columns" file="page-mul.mkiv">
<cd:arguments>
<cd:assignments list="yes" optional="yes">
- <cd:inherit name="setsimplecolumnhsize"/>
+ <cd:inherit name="setsimplecolumnshsize"/>
</cd:assignments>
</cd:arguments>
</cd:command>
-</cd:interface>
+</cd:interface> \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-common-argument.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-common-argument.xml
index de000148be3..da821c516cc 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-common-argument.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-common-argument.xml
@@ -524,7 +524,7 @@
<!-- * -->
<!-- \... {...} -->
<!-- -->
- <!-- * TOCHAR -->
+ <!-- * TOCHAR -->
<cd:define name="argument-tochar">
<cd:keywords delimiters="braces">
@@ -532,4 +532,26 @@
</cd:keywords>
</cd:define>
+ <!-- * -->
+ <!-- \... {...} -->
+ <!-- -->
+ <!-- * LEFTFENCE -->
+
+ <cd:define name="argument-leftfence">
+ <cd:keywords delimiters="braces">
+ <cd:resolve name="value-leftfence"/>
+ </cd:keywords>
+ </cd:define>
+
+ <!-- * -->
+ <!-- \... {...} -->
+ <!-- -->
+ <!-- * RIGHTFENCE -->
+
+ <cd:define name="argument-rightfence">
+ <cd:keywords delimiters="braces">
+ <cd:resolve name="value-rightfence"/>
+ </cd:keywords>
+ </cd:define>
+
</cd:interface> \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-common-instance.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-common-instance.xml
index dc8cead7925..3d4864de76e 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-common-instance.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-common-instance.xml
@@ -187,6 +187,7 @@
<cd:define name="instance-mixedcolumns">
<cd:constant value="itemgroupcolumns"/>
<cd:constant value="boxedcolumns"/>
+ <cd:constant value="columns"/>
</cd:define>
<cd:define name="instance-note">
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-common-string.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-common-string.xml
index 5ef1fc71a7c..0c0bb2ef356 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-common-string.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-common-string.xml
@@ -169,4 +169,26 @@
</cd:keywords>
</cd:define>
+ <!-- * -->
+ <!-- \... ... -->
+ <!-- -->
+ <!-- * LEFTFENCE -->
+
+ <cd:define name="string-leftfence">
+ <cd:keywords delimiters="none">
+ <cd:resolve name="value-leftfence"/>
+ </cd:keywords>
+ </cd:define>
+
+ <!-- * -->
+ <!-- \... ... -->
+ <!-- -->
+ <!-- * RIGHTFENCE -->
+
+ <cd:define name="string-rightfence">
+ <cd:keywords delimiters="none">
+ <cd:resolve name="value-rightfence"/>
+ </cd:keywords>
+ </cd:define>
+
</cd:interface> \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-common-value.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-common-value.xml
index a6884185ff2..253a03ccf2c 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-common-value.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-common-value.xml
@@ -301,6 +301,17 @@
<cd:constant type="effective"/>
<cd:constant type="header"/>
<cd:constant type="footer"/>
+ <cd:constant type="tblr"/>
+ <cd:constant type="lrtb"/>
+ <cd:constant type="tbrl"/>
+ <cd:constant type="rltb"/>
+ <cd:constant type="fxtb"/>
+ <cd:constant type="btlr"/>
+ <cd:constant type="lrbt"/>
+ <cd:constant type="btrl"/>
+ <cd:constant type="rlbt"/>
+ <cd:constant type="fxbt"/>
+ <cd:constant type="fixd"/>
</cd:define>
<!-- sortorder = ... -->
@@ -770,4 +781,120 @@
<cd:constant type="cd:name"/>
</cd:define>
+ <cd:define name="value-leftfence">
+ <!--
+ <cd:constant type="||"/>
+ <cd:constant type="|||"/>
+ -->
+ <cd:constant type="\bgroup"/>
+ <cd:constant type="\egroup"/>
+ <cd:constant type="\letteropenbrace"/>
+ <cd:constant type="["/>
+ <cd:constant type="]"/>
+ <cd:constant type="("/>
+ <cd:constant type=")"/>
+ <cd:constant type="<"/>
+ <cd:constant type=">"/>
+ <cd:constant type="/"/>
+ <cd:constant type="|"/>
+ <cd:constant type="⌊"/>
+ <cd:constant type="⌋"/>
+ <cd:constant type="⌈"/>
+ <cd:constant type="⌉"/>
+ <cd:constant type="⟨"/>
+ <cd:constant type="⟩"/>
+ <cd:constant type="⟪"/>
+ <cd:constant type="⟫"/>
+ <cd:constant type="‖"/>
+ <cd:constant type="⦀"/>
+ <cd:constant type="⦗"/>
+ <cd:constant type="\lbrace"/>
+ <cd:constant type="\lbracket"/>
+ <cd:constant type="\lbrack"/>
+ <cd:constant type="\lparenthesis"/>
+ <cd:constant type="\lparent"/>
+ <cd:constant type="\lparen"/>
+ <cd:constant type="\langle"/>
+ <cd:constant type="\llangle"/>
+ <cd:constant type="\lVert"/>
+ <cd:constant type="\vert"/>
+ <cd:constant type="\solidus"/>
+ <cd:constant type="\lfloor"/>
+ <cd:constant type="\lceiling"/>
+ <cd:constant type="\lceil"/>
+ <cd:constant type="\ulcorner"/>
+ <cd:constant type="\llcorner"/>
+ <cd:constant type="\lmoustache"/>
+ <cd:constant type="\llbracket"/>
+ <cd:constant type="\lgroup"/>
+ <cd:constant type="\linterval"/>
+ <cd:constant type="\lointerval"/>
+ <cd:constant type="\llointerval"/>
+ <cd:constant type="\lrointerval"/>
+ <cd:constant type="\{"/>
+ <cd:constant type="\["/>
+ <cd:constant type="\("/>
+ <cd:constant type="\<"/>
+ <cd:constant type="\|"/>
+ <cd:constant type="cd:character"/>
+ </cd:define>
+
+ <cd:define name="value-rightfence">
+ <!--
+ <cd:constant type="||"/>
+ <cd:constant type="|||"/>
+ -->
+ <cd:constant type="\egroup"/>
+ <cd:constant type="\bgroup"/>
+ <cd:constant type="\letterclosebrace"/>
+ <cd:constant type="]"/>
+ <cd:constant type="["/>
+ <cd:constant type=")"/>
+ <cd:constant type="("/>
+ <cd:constant type=">"/>
+ <cd:constant type="<"/>
+ <cd:constant type="/"/>
+ <cd:constant type="|"/>
+ <cd:constant type="⌋"/>
+ <cd:constant type="⌊"/>
+ <cd:constant type="⌉"/>
+ <cd:constant type="⌈"/>
+ <cd:constant type="⟩"/>
+ <cd:constant type="⟨"/>
+ <cd:constant type="⟫"/>
+ <cd:constant type="⟪"/>
+ <cd:constant type="‖"/>
+ <cd:constant type="⦀"/>
+ <cd:constant type="⦘"/>
+ <cd:constant type="\rbrace"/>
+ <cd:constant type="\rbracket"/>
+ <cd:constant type="\rbracket"/>
+ <cd:constant type="\rparenthesis"/>
+ <cd:constant type="\rparent"/>
+ <cd:constant type="\rparen"/>
+ <cd:constant type="\rangle"/>
+ <cd:constant type="\rrangle"/>
+ <cd:constant type="\rVert"/>
+ <cd:constant type="\vert"/>
+ <cd:constant type="\solidus"/>
+ <cd:constant type="\rfloor"/>
+ <cd:constant type="\rceiling"/>
+ <cd:constant type="\rceil"/>
+ <cd:constant type="\urcorner"/>
+ <cd:constant type="\lrcorner"/>
+ <cd:constant type="\rmoustache"/>
+ <cd:constant type="\rrbracket"/>
+ <cd:constant type="\rgroup"/>
+ <cd:constant type="\rinterval"/>
+ <cd:constant type="\rointerval"/>
+ <cd:constant type="\rlointerval"/>
+ <cd:constant type="\rrointerval"/>
+ <cd:constant type="\}"/>
+ <cd:constant type="\]"/>
+ <cd:constant type="\)"/>
+ <cd:constant type="\>"/>
+ <cd:constant type="\|"/>
+ <cd:constant type="cd:character"/>
+ </cd:define>
+
</cd:interface>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-context.pdf b/Master/texmf-dist/tex/context/interface/mkiv/i-context.pdf
index c4450ad71c7..a877fa0eafc 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-context.pdf
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-context.pdf
Binary files differ
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-context.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-context.xml
index 01adac436e1..53741ad5571 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-context.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-context.xml
@@ -53,7 +53,6 @@
<cd:interfacefile filename="i-clipping.xml"/>
<cd:interfacefile filename="i-collector.xml"/>
<cd:interfacefile filename="i-color.xml"/>
- <cd:interfacefile filename="i-columns.xml"/>
<cd:interfacefile filename="i-combination.xml"/>
<cd:interfacefile filename="i-commandhandler.xml"/>
<cd:interfacefile filename="i-comment.xml"/>
@@ -198,6 +197,7 @@
<cd:interfacefile filename="i-setups.xml"/>
<cd:interfacefile filename="i-shift.xml"/>
<cd:interfacefile filename="i-sidebar.xml"/>
+ <cd:interfacefile filename="i-simplecolumns.xml"/>
<cd:interfacefile filename="i-smash.xml"/>
<cd:interfacefile filename="i-sort.xml"/>
<cd:interfacefile filename="i-soundtrack.xml"/>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-conversion.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-conversion.xml
index a2e97536894..b97b638066a 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-conversion.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-conversion.xml
@@ -360,7 +360,7 @@
<cd:command name="date" level="document" category="counter language" file="core-con.mkiv">
<cd:arguments>
- <cd:assignments list="yes" optional="yes">
+ <cd:assignments list="yes">
<cd:parameter name="d">
<cd:constant type="cd:number"/>
</cd:parameter>
@@ -502,6 +502,7 @@
<cd:constant type="setâ£2"/>
<cd:constant type="setâ£3"/>
<cd:constant type="continued"/>
+ <cd:constant type="zero"/>
<cd:constant type="cd:name"/>
</cd:keywords>
<cd:resolve name="argument-number"/>
@@ -642,4 +643,14 @@
</cd:arguments>
</cd:command>
-</cd:interface> \ No newline at end of file
+ <cd:command name="zeronumberconversion" level="style" category="counter" file="core-con.mkiv">
+ <cd:arguments>
+ <cd:resolve name="argument-number"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="actualyear" level="style" category="system" file="core-con.mkiv" />
+ <cd:command name="actualmonth" level="style" category="system" file="core-con.mkiv" />
+ <cd:command name="actualday" level="style" category="system" file="core-con.mkiv" />
+
+</cd:interface>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-direction.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-direction.xml
index 3b2d937a435..87e64e4572d 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-direction.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-direction.xml
@@ -52,22 +52,4 @@
<cd:command name="showdirsinmargin" level="document" category="alignment" file="supp-dir.mkiv"/>
- <cd:command name="istltdir" level="system" category="alignment" file="supp-dir.mkiv">
- <cd:arguments>
- <cd:keywords delimiters="none">
- <cd:constant type="TLT"/>
- <cd:constant type="TRT"/>
- </cd:keywords>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="istrtdir" level="system" category="alignment" file="supp-dir.mkiv">
- <cd:arguments>
- <cd:keywords delimiters="none">
- <cd:constant type="TLT"/>
- <cd:constant type="TRT"/>
- </cd:keywords>
- </cd:arguments>
- </cd:command>
-
</cd:interface> \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-fittingpage.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-fittingpage.xml
index 7fc3a6cffcc..f5daafcf1b0 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-fittingpage.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-fittingpage.xml
@@ -4,6 +4,30 @@
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands">
+ <cd:define name="assignment-setupfittingpage">
+ <cd:assignments list="yes">
+ <cd:parameter name="pagestate">
+ <cd:constant type="start"/>
+ <cd:constant type="stop" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="page"/>
+ </cd:parameter>
+ <cd:parameter name="scale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="paper">
+ <cd:constant type="auto"/>
+ <cd:constant type="default" default="yes"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed"/>
+ </cd:assignments>
+ </cd:define>
+
<cd:command name="definefittingpage" level="style" category="background layout" file="page-app.mkiv">
<cd:arguments>
<cd:resolve name="keyword-name"/>
@@ -17,27 +41,7 @@
<cd:command name="setupfittingpage" level="style" category="background layout" file="page-app.mkiv">
<cd:arguments>
<cd:resolve name="keyword-name-list-optional"/>
- <cd:assignments list="yes">
- <cd:parameter name="pagestate">
- <cd:constant type="start"/>
- <cd:constant type="stop" default="yes"/>
- </cd:parameter>
- <cd:parameter name="command">
- <cd:constant type="cd:oneargument"/>
- </cd:parameter>
- <cd:parameter name="margin">
- <cd:constant type="page"/>
- </cd:parameter>
- <cd:parameter name="scale">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="paper">
- <cd:constant type="auto"/>
- <cd:constant type="default" default="yes"/>
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:inherit name="setupframed"/>
- </cd:assignments>
+ <cd:resolve name="assignment-setupfittingpage"/>
</cd:arguments>
</cd:command>
@@ -66,17 +70,17 @@
<!--
- <cd:command name="TEXpage" type="environment" level="document" category="background layout" file="page-app.mkiv">
+ <cd:command name="setupTEXpage" level="style" category="background layout" file="page-app.mkiv">
<cd:arguments>
- <cd:assignments list="yes" optional="yes">
+ <cd:assignments list="yes">
<cd:inherit name="setupfittingpage"/>
</cd:assignments>
</cd:arguments>
</cd:command>
- <cd:command name="MPpage" type="environment" level="document" category="background layout metapost" file="meta-fig.mkiv">
+ <cd:command name="setupMPpage" level="style" category="background layout metapost" file="meta-fig.mkiv">
<cd:arguments>
- <cd:assignments list="yes" optional="yes">
+ <cd:assignments list="yes">
<cd:inherit name="setupfittingpage"/>
</cd:assignments>
</cd:arguments>
@@ -86,17 +90,13 @@
<cd:command name="setupTEXpage" level="style" category="background layout" file="page-app.mkiv">
<cd:arguments>
- <cd:assignments list="yes">
- <cd:inherit name="setupfittingpage"/>
- </cd:assignments>
+ <cd:resolve name="assignment-setupfittingpage"/>
</cd:arguments>
</cd:command>
<cd:command name="setupMPpage" level="style" category="background layout metapost" file="meta-fig.mkiv">
<cd:arguments>
- <cd:assignments list="yes">
- <cd:inherit name="setupfittingpage"/>
- </cd:assignments>
+ <cd:resolve name="assignment-setupfittingpage"/>
</cd:arguments>
</cd:command>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-floats.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-floats.xml
index 77a0f00a1b6..7714e5ccc23 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-floats.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-floats.xml
@@ -205,6 +205,13 @@
<cd:constant type="yes" default="yes"/>
<cd:constant type="no"/>
</cd:parameter>
+ <cd:parameter name="compress">
+ <cd:constant type="yes" default="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="compressdistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
<!-- end root only -->
<cd:inherit name="setupframed"/>
</cd:assignments>
@@ -445,6 +452,9 @@
<cd:parameter name="headseparator">
<cd:constant type="cd:text"/>
</cd:parameter>
+ <cd:parameter name="headcommand">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
<cd:parameter name="inbetween">
<cd:constant type="cd:command"/>
</cd:parameter>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-graphics.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-graphics.xml
index a71291a2a60..924616474af 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-graphics.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-graphics.xml
@@ -159,7 +159,7 @@
<cd:constant type="frame"/>
<cd:constant type="empty"/>
</cd:parameter>
- <cd:parameter name="forgroundcolor">
+ <cd:parameter name="foregroundcolor">
<cd:constant type="cd:color"/>
</cd:parameter>
<cd:parameter name="reset">
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-interactionscreen.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-interactionscreen.xml
index 7ead396b843..2f2d550e99e 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-interactionscreen.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-interactionscreen.xml
@@ -48,6 +48,9 @@
<cd:constant type="attachment"/>
<cd:constant type="layer"/>
<cd:constant type="title"/>
+ <cd:constant type="lefttoright"/>
+ <cd:constant type="righttoleft"/>
+ <cd:constant type="nomenubar"/>
</cd:parameter>
<cd:parameter name="copies">
<cd:constant type="cd:number"/>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-itemgroup.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-itemgroup.xml
index 84cae20bbc0..a3271d12f72 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-itemgroup.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-itemgroup.xml
@@ -4,24 +4,242 @@
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands">
- <cd:command name="defineitemgroup" level="style" category="structure" file="strc-itm.mkvi">
- <cd:arguments>
- <cd:resolve name="keyword-name"/>
- <cd:resolve name="keyword-name-optional"/>
- <cd:assignments list="yes" optional="yes">
- <cd:inherit name="setupitemgroup"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="setupitemgroup" level="style" category="structure counter" file="strc-itm.mkvi">
- <cd:arguments>
- <cd:resolve name="keyword-name"/>
- <cd:keywords list="yes" optional="yes">
- <cd:constant type="each"/>
+ <cd:define name="keyword-setupitemgroup">
+ <cd:keywords list="yes" optional="yes">
+ <cd:constant type="intro"/>
+ <cd:constant type="random"/>
+ <cd:constant type="continue"/>
+ <cd:constant type="packed"/>
+ <cd:constant type="autointro"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="text"/>
+ <cd:constant type="before"/>
+ <cd:constant type="after"/>
+ <cd:constant type="nowhite"/>
+ <cd:constant type="margin"/>
+ <cd:constant type="inmargin"/>
+ <cd:constant type="atmargin"/>
+ <cd:constant type="intext"/>
+ <cd:constant type="headintext"/>
+ <cd:constant type="loose"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="nofit"/>
+ <cd:constant type="paragraph"/>
+ <cd:constant type="joinedup"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="stopper"/>
+ <cd:constant type="nostopper"/>
+ <cd:constant type="unpacked"/>
+ <cd:constant type="repeat"/>
+ <cd:constant type="norepeat"/>
+ <cd:constant type="reverse"/>
+ <cd:constant type="columns"/>
+ <cd:constant type="one"/>
+ <cd:constant type="two"/>
+ <cd:constant type="three"/>
+ <cd:constant type="four"/>
+ <cd:constant type="five"/>
+ <cd:constant type="six"/>
+ <cd:constant type="seven"/>
+ <cd:constant type="eight"/>
+ <cd:constant type="nine"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="broad" prefix="cd:number" method="factor"/>
+ <cd:constant type="serried" prefix="cd:number" method="factor"/>
+ <cd:constant type="horizontal"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:define>
+
+ <cd:define name="assignment-setupitemgroup">
+ <cd:assignments list="yes" optional="yes">
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="beforehead">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="afterhead">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="lefttext">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="righttext">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
<cd:constant type="cd:number"/>
- </cd:keywords>
- <cd:keywords list="yes" optional="yes">
+ </cd:parameter>
+ <cd:parameter name="step">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:resolve name="value-leftskip"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargin">
+ <cd:resolve name="value-leftskip"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargin">
+ <cd:resolve name="value-rightskip"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargindistance">
+ <cd:resolve name="value-leftskip"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargindistance">
+ <cd:resolve name="value-rightskip"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:inherit name="setupalign"/>
+ </cd:parameter>
+ <cd:parameter name="indenting">
+ <cd:inherit name="setupindenting"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="symalign">
+ <cd:constant type="left"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="right"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="center"/>
+ <cd:constant type="flushright"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="indentnext">
+ <cd:resolve name="value-indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="inner">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:csname"/>
+ </cd:parameter>
+ <cd:parameter name="items">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="maxwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="itemalign">
+ <cd:resolve name="value-alignsimple"/>
+ </cd:parameter>
+ <cd:parameter name="alignsymbol">
+ <cd:constant type="yes"/>
+ <cd:constant type="no" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="textdistance">
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="none"/>
+ <cd:constant type="space" default="yes"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="placestopper">
+ <cd:constant type="yes" default="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="headstyle">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="headcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="marstyle">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="marcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="symstyle">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="symcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="grid">
+ <cd:inherit name="definegridsnapping"/>
+ </cd:parameter>
+ <cd:parameter name="packcriterium">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:inherit name="setupcounter"/>
+ </cd:assignments>
+ </cd:define>
+
+ <cd:define name="mixed-setupitemgroup">
+ <cd:assignments list="yes">
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="beforehead">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="afterhead">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="lefttext">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="righttext">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="step">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="option">
<cd:constant type="intro"/>
<cd:constant type="random"/>
<cd:constant type="continue"/>
@@ -43,7 +261,6 @@
<cd:constant type="joinedup"/>
<cd:constant type="serried"/>
<cd:constant type="stopper"/>
- <cd:constant type="nostopper"/>
<cd:constant type="unpacked"/>
<cd:constant type="repeat"/>
<cd:constant type="norepeat"/>
@@ -63,328 +280,139 @@
<cd:constant type="serried" prefix="cd:number" method="factor"/>
<cd:constant type="horizontal"/>
<cd:constant type="cd:name"/>
- </cd:keywords>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:resolve name="value-leftskip"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargin">
+ <cd:resolve name="value-leftskip"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargin">
+ <cd:resolve name="value-rightskip"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargindistance">
+ <cd:resolve name="value-leftskip"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargindistance">
+ <cd:resolve name="value-rightskip"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:inherit name="setupalign"/>
+ </cd:parameter>
+ <cd:parameter name="indenting">
+ <cd:inherit name="setupindenting"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="symalign">
+ <cd:constant type="left"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="right"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="center"/>
+ <cd:constant type="flushright"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="indentnext">
+ <cd:resolve name="value-indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="inner">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:csname"/>
+ </cd:parameter>
+ <cd:parameter name="items">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="maxwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="itemalign">
+ <cd:resolve name="value-alignsimple"/>
+ </cd:parameter>
+ <cd:parameter name="alignsymbol">
+ <cd:constant type="yes"/>
+ <cd:constant type="no" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="textdistance">
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="none"/>
+ <cd:constant type="space" default="yes"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="placestopper">
+ <cd:constant type="yes" default="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="headstyle">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="headcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="marstyle">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="marcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="symstyle">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="symcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="grid">
+ <cd:inherit name="definegridsnapping"/>
+ </cd:parameter>
+ <cd:inherit name="setupcounter"/>
+ </cd:assignments>
+ </cd:define>
+
+ <cd:command name="defineitemgroup" level="style" category="structure" file="strc-itm.mkvi">
+ <cd:arguments>
+ <cd:resolve name="keyword-name"/>
+ <cd:resolve name="keyword-name-optional"/>
<cd:assignments list="yes" optional="yes">
- <cd:parameter name="before">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="after">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="inbetween">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="beforehead">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="afterhead">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="lefttext">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="righttext">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="left">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="right">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="factor">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="step">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="width">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="distance">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="margin">
- <cd:resolve name="value-leftskip"/>
- </cd:parameter>
- <cd:parameter name="leftmargin">
- <cd:resolve name="value-leftskip"/>
- </cd:parameter>
- <cd:parameter name="rightmargin">
- <cd:resolve name="value-rightskip"/>
- </cd:parameter>
- <cd:parameter name="align">
- <cd:inherit name="setupalign"/>
- </cd:parameter>
- <cd:parameter name="indenting">
- <cd:inherit name="setupindenting"/>
- </cd:parameter>
- <cd:parameter name="start">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="symalign">
- <cd:constant type="left"/>
- <cd:constant type="middle"/>
- <cd:constant type="right"/>
- <cd:constant type="flushleft"/>
- <cd:constant type="center"/>
- <cd:constant type="flushright"/>
- </cd:parameter>
- <cd:parameter name="symbol">
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="n">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="indentnext">
- <cd:resolve name="value-indentnext"/>
- </cd:parameter>
- <cd:parameter name="inner">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="command">
- <cd:constant type="cd:csname"/>
- </cd:parameter>
- <cd:parameter name="items">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="maxwidth">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="itemalign">
- <cd:resolve name="value-alignsimple"/>
- </cd:parameter>
- <cd:parameter name="alignsymbol">
- <cd:constant type="yes"/>
- <cd:constant type="no" default="yes"/>
- </cd:parameter>
- <cd:parameter name="textdistance">
- <cd:constant type="small"/>
- <cd:constant type="medium"/>
- <cd:constant type="big"/>
- <cd:constant type="none"/>
- <cd:constant type="space" default="yes"/>
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="placestopper">
- <cd:constant type="yes" default="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="style">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="color">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="headstyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="headcolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="marstyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="marcolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="symstyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="symcolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="grid">
- <cd:inherit name="definegridsnapping"/>
- </cd:parameter>
- <cd:inherit name="setupcounter"/>
+ <cd:inherit name="setupitemgroup"/>
</cd:assignments>
</cd:arguments>
</cd:command>
+ <cd:command name="setupitemgroup" level="style" category="structure counter" file="strc-itm.mkvi">
+ <cd:arguments>
+ <cd:resolve name="keyword-name"/>
+ <cd:keywords list="yes" optional="yes">
+ <cd:constant type="each"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:resolve name="keyword-setupitemgroup"/>
+ <cd:resolve name="assignment-setupitemgroup"/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="setupitemgroup" variant="assignment" level="style" category="structure counter" file="strc-itm.mkvi">
<cd:arguments>
<cd:keywords list="yes" optional="yes">
<cd:constant type="cd:name"/>
<cd:constant type="cd:number" prefix="cd:name" method="range"/>
</cd:keywords>
- <cd:assignments list="yes">
- <cd:parameter name="before">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="after">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="inbetween">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="beforehead">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="afterhead">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="lefttext">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="righttext">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="left">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="right">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="factor">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="step">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="width">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="distance">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="option">
- <cd:constant type="intro"/>
- <cd:constant type="random"/>
- <cd:constant type="continue"/>
- <cd:constant type="packed"/>
- <cd:constant type="autointro"/>
- <cd:constant type="broad"/>
- <cd:constant type="text"/>
- <cd:constant type="before"/>
- <cd:constant type="after"/>
- <cd:constant type="nowhite"/>
- <cd:constant type="margin"/>
- <cd:constant type="inmargin"/>
- <cd:constant type="atmargin"/>
- <cd:constant type="intext"/>
- <cd:constant type="loose"/>
- <cd:constant type="fit"/>
- <cd:constant type="nofit"/>
- <cd:constant type="paragraph"/>
- <cd:constant type="joinedup"/>
- <cd:constant type="serried"/>
- <cd:constant type="stopper"/>
- <cd:constant type="unpacked"/>
- <cd:constant type="repeat"/>
- <cd:constant type="norepeat"/>
- <cd:constant type="reverse"/>
- <cd:constant type="columns"/>
- <cd:constant type="one"/>
- <cd:constant type="two"/>
- <cd:constant type="three"/>
- <cd:constant type="four"/>
- <cd:constant type="five"/>
- <cd:constant type="six"/>
- <cd:constant type="seven"/>
- <cd:constant type="eight"/>
- <cd:constant type="nine"/>
- <cd:constant type="standard"/>
- <cd:constant type="broad" prefix="cd:number" method="factor"/>
- <cd:constant type="serried" prefix="cd:number" method="factor"/>
- <cd:constant type="horizontal"/>
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="margin">
- <cd:resolve name="value-leftskip"/>
- </cd:parameter>
- <cd:parameter name="leftmargin">
- <cd:resolve name="value-leftskip"/>
- </cd:parameter>
- <cd:parameter name="rightmargin">
- <cd:resolve name="value-rightskip"/>
- </cd:parameter>
- <cd:parameter name="align">
- <cd:inherit name="setupalign"/>
- </cd:parameter>
- <cd:parameter name="indenting">
- <cd:inherit name="setupindenting"/>
- </cd:parameter>
- <cd:parameter name="start">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="symalign">
- <cd:constant type="left"/>
- <cd:constant type="middle"/>
- <cd:constant type="right"/>
- <cd:constant type="flushleft"/>
- <cd:constant type="center"/>
- <cd:constant type="flushright"/>
- </cd:parameter>
- <cd:parameter name="symbol">
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="n">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="indentnext">
- <cd:resolve name="value-indentnext"/>
- </cd:parameter>
- <cd:parameter name="inner">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="command">
- <cd:constant type="cd:csname"/>
- </cd:parameter>
- <cd:parameter name="items">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="maxwidth">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="itemalign">
- <cd:resolve name="value-alignsimple"/>
- </cd:parameter>
- <cd:parameter name="alignsymbol">
- <cd:constant type="yes"/>
- <cd:constant type="no" default="yes"/>
- </cd:parameter>
- <cd:parameter name="textdistance">
- <cd:constant type="small"/>
- <cd:constant type="medium"/>
- <cd:constant type="big"/>
- <cd:constant type="none"/>
- <cd:constant type="space" default="yes"/>
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="placestopper">
- <cd:constant type="yes" default="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="style">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="color">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="headstyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="headcolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="marstyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="marcolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="symstyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="symcolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="grid">
- <cd:inherit name="definegridsnapping"/>
- </cd:parameter>
- <cd:inherit name="setupcounter"/>
- </cd:assignments>
+ <cd:resolve name="mixed-setupitemgroup"/>
</cd:arguments>
</cd:command>
@@ -394,9 +422,7 @@
<cd:constant type="cd:name"/>
<cd:constant type="cd:number" prefix="cd:name" method="range"/>
</cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setupitemgroup"/>
- </cd:assignments>
+ <cd:resolve name="mixed-setupitemgroup"/>
</cd:arguments>
</cd:command>
@@ -410,12 +436,8 @@
<cd:constant type="each"/>
<cd:constant type="cd:number"/>
</cd:keywords>
- <cd:keywords list="yes" optional="yes">
- <cd:inherit name="setupitemgroup"/>
- </cd:keywords>
- <cd:assignments list="yes" optional="yes">
- <cd:inherit name="setupitemgroup"/>
- </cd:assignments>
+ <cd:resolve name="keyword-setupitemgroup"/>
+ <cd:resolve name="assignment-setupitemgroup"/>
</cd:arguments>
<cd:instances>
<cd:resolve name="instance-itemgroup"/>
@@ -570,34 +592,4 @@
</cd:arguments>
</cd:command>
- <!--
-
- <cd:command name="itemize" type="environment" level="document" category="structure" file="strc-itm.mkvi">
- <cd:arguments>
- <cd:keywords list="yes" optional="yes">
- <cd:inherit name="setupitemgroup"/>
- </cd:keywords>
- <cd:assignments list="yes" optional="yes">
- <cd:inherit name="setupitemgroup"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="setupitemize" level="style" category="structure" file="strc-itm.mkvi">
- <cd:arguments>
- <cd:keywords list="yes" optional="yes">
- <cd:constant type="each"/>
- <cd:constant type="cd:number"/>
- </cd:keywords>
- <cd:keywords list="yes" optional="yes">
- <cd:inherit name="setupitemgroup"/>
- </cd:keywords>
- <cd:assignments list="yes" optional="yes">
- <cd:inherit name="setupitemgroup"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- -->
-
</cd:interface>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-layout.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-layout.xml
index 4370cc4f558..0d256e967db 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-layout.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-layout.xml
@@ -208,6 +208,10 @@
<cd:parameter name="artoffset">
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="direction">
+ <cd:constant type="normal" default="yes"/>
+ <cd:constant type="reverse"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -382,4 +386,4 @@
</cd:arguments>
</cd:command>
-</cd:interface> \ No newline at end of file
+</cd:interface>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-logo.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-logo.xml
index 8f8186a83e4..3208555e079 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-logo.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-logo.xml
@@ -5,101 +5,77 @@
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands">
<cd:command name="TeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="ConTeXt" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="PPCHTeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="PRAGMA" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="LaTeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="TaBlE" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="PiCTeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="AmSTeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="LamSTeX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="TEX" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="Context" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="ConTeXt" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="CONTEXT" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="MetaFont" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="METAFONT" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="MetaPost" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="METAPOST" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="MetaFun" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="eTeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="pdfTeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="pdfeTeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="Lua" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="luaTeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="luajitTeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="metaTeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="XeTeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="LuaTeX" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="LuajitTeX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="METAFUN" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="MKII" level="document" category="symbols" file="cont-log.mkiv"/>
-
<cd:command name="MKIV" level="document" category="symbols" file="cont-log.mkiv"/>
-
<cd:command name="MKVI" level="document" category="symbols" file="cont-log.mkiv"/>
-
<cd:command name="MKIX" level="document" category="symbols" file="cont-log.mkiv"/>
-
<cd:command name="MKXI" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="MPII" level="document" category="symbols" file="cont-log.mkiv"/>
-
<cd:command name="MPIV" level="document" category="symbols" file="cont-log.mkiv"/>
-
<cd:command name="MPVI" level="document" category="symbols" file="cont-log.mkiv"/>
- <cd:command name="METAFONT" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="METAPOST" level="document" category="symbols" file="cont-log.mkiv"/>
-
+ <cd:command name="PPCHTeX" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="PPCHTEX" level="document" category="symbols" file="cont-log.mkiv"/>
- <cd:command name="CONTEXT" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="METAFUN" level="document" category="symbols" file="cont-log.mkiv"/>
-
- <cd:command name="TEX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="PRAGMA" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="LaTeX" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="LATEX" level="document" category="symbols" file="cont-log.mkiv"/>
- <cd:command name="PICTEX" level="document" category="symbols" file="cont-log.mkiv"/>
-
+ <cd:command name="TaBlE" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="TABLE" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="PiCTeX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="PICTEX" level="document" category="symbols" file="cont-log.mkiv"/>
+
+ <cd:command name="AmSTeX" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="AMSTEX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="LamSTeX" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="LAMSTEX" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="INRSTEX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="eTeX" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="ETEX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="pdfTeX" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="PDFTEX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="pdfeTeX" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="PDFETEX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="Lua" level="document" category="symbols" file="cont-log.mkiv"/>
+
+ <cd:command name="luaTeX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="LuaTeX" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="LUATEX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="luajitTeX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="LuajitTeX" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="LUAJITTEX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="luametaTeX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="LuaMetaTeX" level="document" category="symbols" file="cont-log.mkiv"/>
+ <cd:command name="LUAMETATEX" level="document" category="symbols" file="cont-log.mkiv"/>
+
+ <cd:command name="XeTeX" level="document" category="symbols" file="cont-log.mkiv"/>
<cd:command name="XETEX" level="document" category="symbols" file="cont-log.mkiv"/>
-</cd:interface> \ No newline at end of file
+</cd:interface>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-math.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-math.xml
index ae8fa1c3e4c..888d2bac509 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-math.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-math.xml
@@ -139,6 +139,15 @@
</cd:arguments>
</cd:command>
+ <cd:command name="mathematics" variant="assignment" level="document" category="mathematics" file="math-ini.mkiv">
+ <cd:arguments>
+ <cd:assignments list="yes" optional="yes">
+ <cd:inherit name="setupmathematics"/>
+ </cd:assignments>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="math" level="document" category="mathematics" file="math-ini.mkiv">
<cd:arguments>
<cd:resolve name="keyword-name-optional"/>
@@ -146,6 +155,15 @@
</cd:arguments>
</cd:command>
+ <cd:command name="math" variant="assignment" level="document" category="mathematics" file="math-ini.mkiv">
+ <cd:arguments>
+ <cd:assignments list="yes" optional="yes">
+ <cd:inherit name="setupmathematics"/>
+ </cd:assignments>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="m" level="document" category="mathematics" file="math-ini.mkiv">
<cd:arguments>
<cd:resolve name="keyword-name-optional"/>
@@ -153,6 +171,15 @@
</cd:arguments>
</cd:command>
+ <cd:command name="m" variant="assignment" level="document" category="mathematics" file="math-ini.mkiv">
+ <cd:arguments>
+ <cd:assignments list="yes" optional="yes">
+ <cd:inherit name="setupmathematics"/>
+ </cd:assignments>
+ <cd:content/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="definemathcommand" level="style" category="mathematics" file="math-ini.mkiv">
<cd:arguments>
<cd:resolve name="keyword-name"/>
@@ -310,6 +337,31 @@
</cd:arguments>
</cd:command>
+ <!--
+
+ <cd:command name="text" level="document" category="mathematics" file="math-ini.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:resolve name="argument-text"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="t" level="document" category="mathematics" file="math-ini.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:resolve name="argument-text"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="w" level="document" category="mathematics" file="math-ini.mkiv">
+ <cd:arguments>
+ <cd:resolve name="string-boxoptions"/>
+ <cd:resolve name="argument-text"/>
+ </cd:arguments>
+ </cd:command>
+
+ -->
+
<cd:command name="mathtexttf" level="document" category="mathematics" file="math-ini.mkiv">
<cd:arguments>
<cd:resolve name="string-boxoptions"/>
@@ -511,4 +563,8 @@
</cd:arguments>
</cd:command>
+ <cd:command name="stackscripts" level="document" category="mathematics" file="math-ini.mkiv"/>
+
+ <cd:command name="unstackscripts" level="document" category="mathematics" file="math-ini.mkiv"/>
+
</cd:interface> \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-mathfence.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-mathfence.xml
index 5e1abec2b64..a214c3bfd30 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-mathfence.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-mathfence.xml
@@ -69,7 +69,48 @@
<cd:command name="fenced" level="document" category="mathematics" file="math-fen.mkiv">
<cd:arguments>
- <cd:resolve name="keyword-name"/>
+ <cd:keywords>
+ <cd:constant type="parenthesis"/>
+ <cd:constant type="bracket"/>
+ <cd:constant type="brace"/>
+ <cd:constant type="bar"/>
+ <cd:constant type="doublebar"/>
+ <cd:constant type="triplebar"/>
+ <cd:constant type="angle"/>
+ <cd:constant type="doubleangle"/>
+ <cd:constant type="solidus"/>
+ <cd:constant type="ceiling"/>
+ <cd:constant type="floor"/>
+ <cd:constant type="moustache"/>
+ <cd:constant type="uppercorner"/>
+ <cd:constant type="lowercorner"/>
+ <cd:constant type="group"/>
+ <cd:constant type="openbracket"/>
+ <!--
+ <cd:constant type="nothing"/>
+ <cd:constant type="mirrored"/>
+ -->
+ <cd:constant type="mirroredparenthesis"/>
+ <cd:constant type="mirroredbracket"/>
+ <cd:constant type="mirroredbrace"/>
+ <cd:constant type="mirroredbar"/>
+ <cd:constant type="mirroreddoublebar"/>
+ <cd:constant type="mirroredtriplebar"/>
+ <cd:constant type="mirroredangle"/>
+ <cd:constant type="mirroreddoubleangle"/>
+ <cd:constant type="mirroredsolidus"/>
+ <cd:constant type="mirroredceiling"/>
+ <cd:constant type="mirroredfloor"/>
+ <cd:constant type="mirroredmoustache"/>
+ <cd:constant type="mirroreduppercorner"/>
+ <cd:constant type="mirroredlowercorner"/>
+ <cd:constant type="mirroredgroup"/>
+ <cd:constant type="mirroredopenbracket"/>
+ <!--
+ <cd:constant type="mirrorednothing"/>
+ -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
<cd:content/>
</cd:arguments>
</cd:command>
@@ -78,7 +119,7 @@
<cd:command name="left" level="document" category="mathematics" file="math-fen.mkiv">
<cd:arguments>
- <cd:resolve name="string-character"/>
+ <cd:resolve name="string-leftfence"/>
</cd:arguments>
</cd:command>
@@ -90,7 +131,7 @@
<cd:command name="right" level="document" category="mathematics" file="math-fen.mkiv">
<cd:arguments>
- <cd:resolve name="string-character"/>
+ <cd:resolve name="string-rightfence"/>
</cd:arguments>
</cd:command>
@@ -192,7 +233,7 @@
<cd:command name="lfence" level="document" category="mathematics" file="math-fen.mkiv">
<cd:arguments>
- <cd:resolve name="argument-character"/>
+ <cd:resolve name="argument-leftfence"/>
</cd:arguments>
</cd:command>
@@ -204,7 +245,7 @@
<cd:command name="rfence" level="document" category="mathematics" file="math-fen.mkiv">
<cd:arguments>
- <cd:resolve name="argument-character"/>
+ <cd:resolve name="argument-rightfence"/>
</cd:arguments>
</cd:command>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-mixedcolumns.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-mixedcolumns.xml
index 4e1ab96258e..701375237ed 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-mixedcolumns.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-mixedcolumns.xml
@@ -131,4 +131,12 @@
-->
-</cd:interface> \ No newline at end of file
+ <cd:command name="setupcolumns" level="style" category="structure layout" file="page-smp.mkiv">
+ <cd:arguments>
+ <cd:assignments list="yes">
+ <cd:inherit name="setupmixedcolumns"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+</cd:interface>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-note.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-note.xml
index 03e53a0e3f5..ee1ac5a3181 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-note.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-note.xml
@@ -413,6 +413,14 @@
</cd:arguments>
</cd:command>
+ <cd:command name="setupfootnotes" level="style" category="structure notes" file="strc-not.mkvi">
+ <cd:arguments>
+ <cd:assignments list="yes">
+ <cd:inherit name="setupnote"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="setnote" level="document" category="structure notes" file="strc-not.mkvi">
<cd:arguments>
<cd:resolve name="keyword-name"/>
@@ -708,4 +716,47 @@
-->
+ <cd:command name="definetextnote" level="style" category="structure notes" file="strc-tnt.mkiv">
+ <cd:arguments>
+ <cd:resolve name="keyword-name"/>
+ <cd:resolve name="keyword-name-optional"/>
+ <cd:assignments list="yes" optional="yes">
+ <cd:inherit name="setuptextnote"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptextnote" level="style" category="structure notes" file="strc-tnt.mkiv">
+ <cd:arguments>
+ <cd:resolve name="keyword-name-list-optional"/>
+ <cd:assignments list="yes">
+ <cd:parameter name="rule">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="note">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="*"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="empty">
+ <cd:constant type="yes"/>
+ <cd:constant type="no" default="yes"/>
+ <cd:constant type="none"/>
+ <cd:constant type="number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textnote" generated="yes" level="document" category="structure notes" file="strc-tnt.mkiv">
+ <cd:arguments>
+ <cd:assignments list="yes" optional="yes">
+ <cd:inherit name="setuptextnote"/>
+ </cd:assignments>
+ <cd:resolve name="argument-text"/>
+ </cd:arguments>
+ </cd:command>
+
</cd:interface> \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-pagegrid.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-pagegrid.xml
index f25e72f7255..8b2cd86b900 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-pagegrid.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-pagegrid.xml
@@ -277,7 +277,29 @@
<cd:arguments>
<cd:resolve name="keyword-name"/>
<cd:assignments list="yes" optional="yes">
- <cd:inherit name="setupcolumnsetspan"/>
+ <cd:parameter name="c">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="r">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="method">
+ <cd:constant type="tblr"/>
+ <cd:constant type="lrtb"/>
+ <cd:constant type="tbrl"/>
+ <cd:constant type="rltb"/>
+ <cd:constant type="fxtb"/>
+ <cd:constant type="btlr"/>
+ <cd:constant type="lrbt"/>
+ <cd:constant type="btrl"/>
+ <cd:constant type="rlbt"/>
+ <cd:constant type="fxbt"/>
+ <cd:constant type="fixd"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="none" default="yes"/>
+ <cd:constant type="wide"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-pagenumber.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-pagenumber.xml
index 4c262db4be6..91c0d8f5948 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-pagenumber.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-pagenumber.xml
@@ -4,6 +4,22 @@
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands">
+ <cd:define name="assignment-setupuserpagenumber">
+ <cd:assignments list="yes">
+ <cd:parameter name="viewerprefix">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="none"/>
+ <cd:constant type="keep"/>
+ <cd:constant type="empty"/>
+ </cd:parameter>
+ <cd:inherit name="setupcounter"/>
+ </cd:assignments>
+ </cd:define>
+
<cd:command name="setuprealpagenumber" level="system" category="counter" file="strc-pag.mkiv">
<cd:arguments>
<cd:assignments list="yes">
@@ -14,19 +30,7 @@
<cd:command name="setupuserpagenumber" level="style" category="counter" file="strc-pag.mkiv">
<cd:arguments>
- <cd:assignments list="yes">
- <cd:parameter name="viewerprefix">
- <cd:constant type="cd:text"/>
- </cd:parameter>
- <cd:parameter name="state">
- <cd:constant type="start"/>
- <cd:constant type="stop"/>
- <cd:constant type="none"/>
- <cd:constant type="keep"/>
- <cd:constant type="empty"/>
- </cd:parameter>
- <cd:inherit name="setupcounter"/>
- </cd:assignments>
+ <cd:resolve name="assignment-setupuserpagenumber"/>
</cd:arguments>
</cd:command>
@@ -40,9 +44,7 @@
<cd:command name="setuppagenumber" level="style" category="counter" file="strc-pag.mkiv">
<cd:arguments>
- <cd:assignments list="yes">
- <cd:inherit name="setupuserpagenumber"/>
- </cd:assignments>
+ <cd:resolve name="assignment-setupuserpagenumber"/>
</cd:arguments>
</cd:command>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-paragraphs.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-paragraphs.xml
index 0d8ae3d2e95..e2fc9116e76 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-paragraphs.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-paragraphs.xml
@@ -79,6 +79,7 @@
<cd:command name="setupparagraphs" variant="assignment" level="style" category="tables" file="tabl-mis.mkiv">
<cd:arguments>
<cd:keywords optional="yes">
+ <cd:constant type="cd:name"/>
<cd:constant type="cd:number" prefix="cd:name" method="range"/>
</cd:keywords>
<cd:assignments list="yes">
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-readme.pdf b/Master/texmf-dist/tex/context/interface/mkiv/i-readme.pdf
index 8bc3240c452..9d01bdf5ef9 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-readme.pdf
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-readme.pdf
Binary files differ
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-register.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-register.xml
index 7ba3a0f7c8e..e8d7ab07dfb 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-register.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-register.xml
@@ -4,6 +4,182 @@
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands">
+ <cd:define name="assignment-setupregister">
+ <cd:assignments list="yes">
+ <cd:parameter name="referencemethod">
+ <cd:constant type="forward"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="yes"/>
+ <cd:constant type="no" default="yes"/>
+ <cd:constant type="xml"/>
+ </cd:parameter>
+ <cd:parameter name="ownnumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="no" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="xmlsetup">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="A"/>
+ <cd:constant type="B"/>
+ </cd:parameter>
+ <cd:parameter name="method">
+ <cd:resolve name="value-sortmethod"/>
+ </cd:parameter>
+ <cd:parameter name="compress">
+ <cd:constant type="yes"/>
+ <cd:constant type="no" default="yes"/>
+ <cd:constant type="all"/>
+ <cd:constant type="packed"/>
+ <cd:constant type="text"/>
+ </cd:parameter>
+ <cd:parameter name="check">
+ <cd:constant type="yes" default="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="local"/>
+ <cd:constant type="text"/>
+ <cd:constant type="current"/>
+ <cd:constant type="previous"/>
+ <cd:constant type="all" default="yes"/>
+ <cd:constant type="cd:section"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixseparatorset">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixconversionset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixstarter">
+ <cd:resolve name="value-starter"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixstopper">
+ <cd:resolve name="value-stopper"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixsegments">
+ <cd:resolve name="value-prefixsegments"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefixconnector">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageprefix">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="pageseparatorset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageconversionset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pagestarter">
+ <cd:resolve name="value-starter"/>
+ </cd:parameter>
+ <cd:parameter name="pagestopper">
+ <cd:resolve name="value-stopper"/>
+ </cd:parameter>
+ <cd:parameter name="pagesegments">
+ <cd:resolve name="value-numbersegments"/>
+ </cd:parameter>
+ <cd:parameter name="maxwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="indicator">
+ <cd:constant type="yes" default="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="pagecommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="text"/>
+ <cd:constant type="pagenumber" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="pagenumber">
+ <cd:constant type="yes" default="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="a"/>
+ <cd:constant type="n" default="yes"/>
+ <cd:constant type="none"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="language">
+ <cd:resolve name="value-sortorder"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="textstyle">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="textcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="pagestyle">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="pagecolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="pageleft">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pageright">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="balance">
+ <cd:constant type="yes" default="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:inherit name="setupalign"/>
+ </cd:parameter>
+ <cd:parameter name="numberorder">
+ <cd:constant type="numbers" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="pagemethod">
+ <cd:constant type="page" default="yes"/>
+ <cd:constant type="section"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:define>
+
<cd:command name="defineregister" level="style" category="structure" file="strc-reg.mkiv">
<cd:arguments>
<cd:resolve name="keyword-name"/>
@@ -18,174 +194,7 @@
<cd:arguments>
<cd:resolve name="keyword-name-list-optional"/>
<cd:resolve name="keyword-number-list-optional"/>
- <cd:assignments list="yes">
- <cd:parameter name="referencemethod">
- <cd:constant type="forward"/>
- </cd:parameter>
- <cd:parameter name="expansion">
- <cd:constant type="yes"/>
- <cd:constant type="no" default="yes"/>
- <cd:constant type="xml"/>
- </cd:parameter>
- <cd:parameter name="ownnumber">
- <cd:constant type="yes"/>
- <cd:constant type="no" default="yes"/>
- </cd:parameter>
- <cd:parameter name="xmlsetup">
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="alternative">
- <cd:constant type="a"/>
- <cd:constant type="b"/>
- <cd:constant type="A"/>
- <cd:constant type="B"/>
- </cd:parameter>
- <cd:parameter name="method">
- <cd:resolve name="value-sortmethod"/>
- </cd:parameter>
- <cd:parameter name="compress">
- <cd:constant type="yes"/>
- <cd:constant type="no" default="yes"/>
- <cd:constant type="all"/>
- <cd:constant type="packed"/>
- </cd:parameter>
- <cd:parameter name="check">
- <cd:constant type="yes" default="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="criterium">
- <cd:constant type="local"/>
- <cd:constant type="text"/>
- <cd:constant type="current"/>
- <cd:constant type="previous"/>
- <cd:constant type="all" default="yes"/>
- <cd:constant type="cd:section"/>
- </cd:parameter>
- <cd:parameter name="pageprefixseparatorset">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="pageprefixconversionset">
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="pageprefixstarter">
- <cd:resolve name="value-starter"/>
- </cd:parameter>
- <cd:parameter name="pageprefixstopper">
- <cd:resolve name="value-stopper"/>
- </cd:parameter>
- <cd:parameter name="pageprefixset">
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="pageprefixsegments">
- <cd:resolve name="value-prefixsegments"/>
- </cd:parameter>
- <cd:parameter name="pageprefixconnector">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="pageprefix">
- <cd:constant type="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="pageseparatorset">
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="pageconversionset">
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="pagestarter">
- <cd:resolve name="value-starter"/>
- </cd:parameter>
- <cd:parameter name="pagestopper">
- <cd:resolve name="value-stopper"/>
- </cd:parameter>
- <cd:parameter name="pagesegments">
- <cd:resolve name="value-numbersegments"/>
- </cd:parameter>
- <cd:parameter name="maxwidth">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="indicator">
- <cd:constant type="yes" default="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="before">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="after">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="command">
- <cd:constant type="cd:oneargument"/>
- </cd:parameter>
- <cd:parameter name="textcommand">
- <cd:constant type="cd:oneargument"/>
- </cd:parameter>
- <cd:parameter name="deeptextcommand">
- <cd:constant type="cd:oneargument"/>
- </cd:parameter>
- <cd:parameter name="pagecommand">
- <cd:constant type="cd:oneargument"/>
- </cd:parameter>
- <cd:parameter name="distance">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="interaction">
- <cd:constant type="text"/>
- <cd:constant type="pagenumber" default="yes"/>
- </cd:parameter>
- <cd:parameter name="pagenumber">
- <cd:constant type="yes" default="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="symbol">
- <cd:constant type="a"/>
- <cd:constant type="n" default="yes"/>
- <cd:constant type="none"/>
- <cd:constant type="1"/>
- <cd:constant type="2"/>
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="language">
- <cd:resolve name="value-sortorder"/>
- </cd:parameter>
- <cd:parameter name="style">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="color">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="textstyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="textcolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="pagestyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="pagecolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="pageleft">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="pageright">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="n">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="balance">
- <cd:constant type="yes" default="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="align">
- <cd:inherit name="setupalign"/>
- </cd:parameter>
- <cd:parameter name="numberorder">
- <cd:constant type="numbers" default="yes"/>
- </cd:parameter>
- </cd:assignments>
+ <cd:resolve name="assignment-setupregister"/>
</cd:arguments>
</cd:command>
@@ -195,173 +204,7 @@
<cd:constant type="cd:name"/>
<cd:constant type="cd:number" prefix="cd:name" method="range"/>
</cd:keywords>
- <cd:assignments list="yes">
- <cd:parameter name="referencemethod">
- <cd:constant type="forward"/>
- </cd:parameter>
- <cd:parameter name="expansion">
- <cd:constant type="yes"/>
- <cd:constant type="no" default="yes"/>
- <cd:constant type="xml"/>
- </cd:parameter>
- <cd:parameter name="ownnumber">
- <cd:constant type="yes"/>
- <cd:constant type="no" default="yes"/>
- </cd:parameter>
- <cd:parameter name="xmlsetup">
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="alternative">
- <cd:constant type="a"/>
- <cd:constant type="b"/>
- <cd:constant type="A"/>
- <cd:constant type="B"/>
- </cd:parameter>
- <cd:parameter name="method">
- <cd:resolve name="value-sortmethod"/>
- </cd:parameter>
- <cd:parameter name="compress">
- <cd:constant type="yes"/>
- <cd:constant type="no" default="yes"/>
- <cd:constant type="all"/>
- </cd:parameter>
- <cd:parameter name="check">
- <cd:constant type="yes" default="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="criterium">
- <cd:constant type="local"/>
- <cd:constant type="text"/>
- <cd:constant type="current"/>
- <cd:constant type="previous"/>
- <cd:constant type="all" default="yes"/>
- <cd:constant type="cd:section"/>
- </cd:parameter>
- <cd:parameter name="pageprefixseparatorset">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="pageprefixconversionset">
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="pageprefixstarter">
- <cd:resolve name="value-starter"/>
- </cd:parameter>
- <cd:parameter name="pageprefixstopper">
- <cd:resolve name="value-stopper"/>
- </cd:parameter>
- <cd:parameter name="pageprefixset">
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="pageprefixsegments">
- <cd:resolve name="value-prefixsegments"/>
- </cd:parameter>
- <cd:parameter name="pageprefixconnector">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="pageprefix">
- <cd:constant type="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="pageseparatorset">
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="pageconversionset">
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="pagestarter">
- <cd:resolve name="value-starter"/>
- </cd:parameter>
- <cd:parameter name="pagestopper">
- <cd:resolve name="value-stopper"/>
- </cd:parameter>
- <cd:parameter name="pagesegments">
- <cd:resolve name="value-numbersegments"/>
- </cd:parameter>
- <cd:parameter name="maxwidth">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="indicator">
- <cd:constant type="yes" default="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="before">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="after">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="command">
- <cd:constant type="cd:oneargument"/>
- </cd:parameter>
- <cd:parameter name="textcommand">
- <cd:constant type="cd:oneargument"/>
- </cd:parameter>
- <cd:parameter name="deeptextcommand">
- <cd:constant type="cd:oneargument"/>
- </cd:parameter>
- <cd:parameter name="pagecommand">
- <cd:constant type="cd:oneargument"/>
- </cd:parameter>
- <cd:parameter name="distance">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="interaction">
- <cd:constant type="text"/>
- <cd:constant type="pagenumber" default="yes"/>
- </cd:parameter>
- <cd:parameter name="pagenumber">
- <cd:constant type="yes" default="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="symbol">
- <cd:constant type="a"/>
- <cd:constant type="n" default="yes"/>
- <cd:constant type="none"/>
- <cd:constant type="1"/>
- <cd:constant type="2"/>
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="language">
- <cd:resolve name="value-sortorder"/>
- </cd:parameter>
- <cd:parameter name="style">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="color">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="textstyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="textcolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="pagestyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="pagecolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="pageleft">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="pageright">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="n">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="balance">
- <cd:constant type="yes" default="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="align">
- <cd:inherit name="setupalign"/>
- </cd:parameter>
- <cd:parameter name="numberorder">
- <cd:constant type="numbers" default="yes"/>
- </cd:parameter>
- </cd:assignments>
+ <cd:resolve name="assignment-setupregister"/>
</cd:arguments>
</cd:command>
@@ -369,9 +212,7 @@
<cd:arguments>
<cd:resolve name="keyword-name-list-optional"/>
<cd:resolve name="keyword-number-list-optional"/>
- <cd:assignments list="yes">
- <cd:inherit name="setupregister"/>
- </cd:assignments>
+ <cd:resolve name="assignment-setupregister"/>
</cd:arguments>
</cd:command>
@@ -381,9 +222,7 @@
<cd:constant type="cd:name"/>
<cd:constant type="cd:number" prefix="cd:name" method="range"/>
</cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setupregister"/>
- </cd:assignments>
+ <cd:resolve name="assignment-setupregister"/>
</cd:arguments>
</cd:command>
@@ -478,9 +317,7 @@
</cd:sequence>
<cd:arguments>
<cd:resolve name="keyword-number-list-optional"/>
- <cd:assignments list="yes">
- <cd:inherit name="setupregister"/>
- </cd:assignments>
+ <cd:resolve name="assignment-setupregister"/>
</cd:arguments>
<cd:instances>
<cd:resolve name="instance-register"/>
@@ -489,63 +326,25 @@
<!--
- <cd:command name="index" level="document" category="structure" file="strc-reg.mkiv">
+ <cd:command name="startregister" level="document" category="structure" file="strc-reg.mkiv">
<cd:arguments>
+ <cd:resolve name="keyword-name"/>
+ <cd:resolve name="keyword-name"/>
<cd:keywords optional="yes">
<cd:constant type="cd:text"/>
- <cd:constant type="cd:text" prefix="cd:processor" method="apply"/>
</cd:keywords>
- <cd:index list="yes"/>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="index" variant="ownnumber" level="document" category="structure" file="strc-reg.mkiv">
- <cd:arguments>
<cd:keywords optional="yes">
<cd:constant type="cd:text"/>
<cd:constant type="cd:text" prefix="cd:processor" method="apply"/>
</cd:keywords>
- <cd:resolve name="argument-text"/>
<cd:index list="yes"/>
</cd:arguments>
</cd:command>
- <cd:command name="seeindex" level="document" category="structure" file="strc-reg.mkiv">
- <cd:arguments>
- <cd:keywords optional="yes">
- <cd:constant type="cd:text"/>
- <cd:constant type="cd:text" prefix="cd:processor" method="apply"/>
- </cd:keywords>
- <cd:index list="yes"/>
- <cd:keywords delimiters="braces">
- <cd:constant type="cd:text"/>
- <cd:constant type="cd:text" prefix="cd:processor" method="apply"/>
- </cd:keywords>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="placeindex" level="document" category="structure" file="strc-reg.mkiv">
- <cd:arguments>
- <cd:assignments list="yes" optional="yes">
- <cd:inherit name="setupregister"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="completeindex" level="document" category="structure" file="strc-reg.mkiv">
- <cd:arguments>
- <cd:assignments list="yes" optional="yes">
- <cd:inherit name="setupregister"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="setupindex" level="style" category="structure" file="strc-reg.mkiv">
+ <cd:command name="stopregister" level="document" category="structure" file="strc-reg.mkiv">
<cd:arguments>
- <cd:resolve name="keyword-number-list-optional"/>
- <cd:assignments list="yes">
- <cd:inherit name="setupregister"/>
- </cd:assignments>
+ <cd:resolve name="keyword-name"/>
+ <cd:resolve name="keyword-name"/>
</cd:arguments>
</cd:command>
@@ -563,11 +362,8 @@
<cd:constant type="cd:text" prefix="cd:processor" method="apply"/>
</cd:keywords>
<cd:index list="yes"/>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="stopregister" level="document" category="structure" file="strc-reg.mkiv">
- <cd:arguments>
+ <cd:resolve name="string-content"/>
+ <cd:delimiter name="stopregister"/>
<cd:resolve name="keyword-name"/>
<cd:resolve name="keyword-name"/>
</cd:arguments>
@@ -612,17 +408,34 @@
</cd:arguments>
</cd:command>
+ <!--
+
+ <cd:command name="startstructurepageregister" level="document" category="structure" file="strc-reg.mkiv">
+ <cd:arguments>
+ <cd:resolve name="keyword-name"/>
+ <cd:resolve name="keyword-name"/>
+ <cd:resolve name="assignment-registerdata-list"/>
+ <cd:resolve name="assignment-userdata-list-optional"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="stopstructurepageregister" level="document" category="structure" file="strc-reg.mkiv">
+ <cd:arguments>
+ <cd:resolve name="keyword-name"/>
+ <cd:resolve name="keyword-name"/>
+ </cd:arguments>
+ </cd:command>
+
+ -->
+
<cd:command name="startstructurepageregister" level="document" category="structure" file="strc-reg.mkiv">
<cd:arguments>
<cd:resolve name="keyword-name"/>
<cd:resolve name="keyword-name"/>
<cd:resolve name="assignment-registerdata-list"/>
<cd:resolve name="assignment-userdata-list-optional"/>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="stopstructurepageregister" level="document" category="structure" file="strc-reg.mkiv">
- <cd:arguments>
+ <cd:resolve name="string-content"/>
+ <cd:delimiter name="stopstructurepageregister"/>
<cd:resolve name="keyword-name"/>
<cd:resolve name="keyword-name"/>
</cd:arguments>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-section.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-section.xml
index b4229d5fd7f..0ec20a80452 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-section.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-section.xml
@@ -246,6 +246,10 @@
<cd:constant type="positive"/>
<cd:constant type="all"/>
</cd:parameter>
+ <cd:parameter name="hidenumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="no" default="yes"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -319,6 +323,30 @@
</cd:arguments>
</cd:command>
+ <cd:command name="placerawheaddata" level="system" category="structure" file="strc-sec.mkiv">
+ <cd:arguments>
+ <cd:resolve name="keyword-section"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placerawheadtext" level="system" category="structure" file="strc-sec.mkiv">
+ <cd:arguments>
+ <cd:resolve name="keyword-section"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placerawheadnumber" level="system" category="structure" file="strc-sec.mkiv">
+ <cd:arguments>
+ <cd:resolve name="keyword-section"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="repeathead" level="document" category="structure" file="strc-sec.mkiv">
+ <cd:arguments>
+ <cd:resolve name="keyword-section"/>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="definesection" level="system" category="structure" file="strc-sec.mkiv">
<cd:arguments>
<cd:resolve name="keyword-name"/>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-simplecolumns.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-simplecolumns.xml
new file mode 100644
index 00000000000..caefa9fbbb9
--- /dev/null
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-simplecolumns.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?context-directive job ctxfile x-setups.ctx ?>
+
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands">
+
+ <cd:command name="setsimplecolumnshsize" level="system" category="structure layout" file="page-smp.mkiv">
+ <cd:arguments>
+ <cd:assignments list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="lines">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="simplecolumns" type="environment" level="system" category="structure layout" file="page-smp.mkiv">
+ <cd:arguments>
+ <cd:assignments list="yes" optional="yes">
+ <cd:inherit name="setsimplecolumnshsize"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+</cd:interface> \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-symbol.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-symbol.xml
index 498684cad77..64a6f27dd17 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-symbol.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-symbol.xml
@@ -147,4 +147,15 @@
</cd:arguments>
</cd:command>
-</cd:interface> \ No newline at end of file
+ <cd:command name="setupsymbols" level="style" category="symbols" file="symb-ini.mkiv">
+ <cd:arguments>
+ <cd:assignments list="yes">
+ <cd:parameter name="stylealternative">
+ <cd:constant type="text" default="yes"/>
+ <cd:constant type="math"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+</cd:interface>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-texts.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-texts.xml
index f0f515fbc2c..f13d8802115 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-texts.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-texts.xml
@@ -4,97 +4,68 @@
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands">
- <!--
-
- <cd:command name="definelayoutelement" level="system" category="layout" file="page-txt.mkvi">
- <cd:arguments>
- <cd:resolve name="keyword-name"/>
- <cd:resolve name="keyword-name-optional"/>
- <cd:assignments list="yes" optional="yes">
- <cd:inherit name="setuplayoutelement"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="setuplayoutelement" level="system" category="layout" file="page-txt.mkvi">
- <cd:arguments>
- <cd:resolve name="keyword-name-list-optional"/>
- <cd:assignments list="yes">
- <cd:parameter name="state">
- <cd:constant type="start"/>
- <cd:constant type="stop"/>
- <cd:constant type="empty"/>
- <cd:constant type="high"/>
- <cd:constant type="none"/>
- <cd:constant type="normal" default="yes"/>
- <cd:constant type="nomarking"/>
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="style">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="color">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="strut">
- <cd:constant type="yes" default="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="n">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="before">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="after">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="leftstyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="rightstyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="leftcolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="rightcolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="width">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="leftwidth">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="rightwidth">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="setuplayouttext" level="system" category="layout" file="page-txt.mkvi">
- <cd:arguments>
- <cd:keywords>
- <cd:constant type="top"/>
- <cd:constant type="header"/>
- <cd:constant type="text"/>
- <cd:constant type="footer"/>
- <cd:constant type="bottom"/>
- </cd:keywords>
- <cd:keywords optional="yes">
- <cd:constant type="text"/>
- <cd:constant type="margin"/>
- <cd:constant type="edge"/>
- </cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setuplayoutelement"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- -->
+ <cd:define name="keyword-setuplayouttext">
+ <cd:keywords optional="yes">
+ <cd:constant type="text"/>
+ <cd:constant type="margin"/>
+ <cd:constant type="edge"/>
+ </cd:keywords>
+ </cd:define>
+
+ <cd:define name="assignment-setuplayouttext">
+ <cd:assignments list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="high"/>
+ <cd:constant type="none"/>
+ <cd:constant type="normal" default="yes"/>
+ <cd:constant type="nomarking"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="yes" default="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftstyle">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="rightstyle">
+ <cd:resolve name="value-style"/>
+ </cd:parameter>
+ <cd:parameter name="leftcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="rightcolor">
+ <cd:constant type="cd:color"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:define>
<cd:command name="setuplayouttext" level="style" category="layout" file="page-txt.mkvi">
<cd:arguments>
@@ -105,197 +76,43 @@
<cd:constant type="footer"/>
<cd:constant type="bottom"/>
</cd:keywords>
- <cd:keywords optional="yes">
- <cd:constant type="text"/>
- <cd:constant type="margin"/>
- <cd:constant type="edge"/>
- </cd:keywords>
- <cd:assignments list="yes">
- <cd:parameter name="state">
- <cd:constant type="start"/>
- <cd:constant type="stop"/>
- <cd:constant type="empty"/>
- <cd:constant type="high"/>
- <cd:constant type="none"/>
- <cd:constant type="normal" default="yes"/>
- <cd:constant type="nomarking"/>
- <cd:constant type="cd:name"/>
- </cd:parameter>
- <cd:parameter name="style">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="color">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="strut">
- <cd:constant type="yes" default="yes"/>
- <cd:constant type="no"/>
- </cd:parameter>
- <cd:parameter name="n">
- <cd:constant type="cd:number"/>
- </cd:parameter>
- <cd:parameter name="before">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="after">
- <cd:constant type="cd:command"/>
- </cd:parameter>
- <cd:parameter name="leftstyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="rightstyle">
- <cd:resolve name="value-style"/>
- </cd:parameter>
- <cd:parameter name="leftcolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="rightcolor">
- <cd:constant type="cd:color"/>
- </cd:parameter>
- <cd:parameter name="width">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="leftwidth">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="rightwidth">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- </cd:assignments>
+ <cd:resolve name="keyword-setuplayouttext"/>
+ <cd:resolve name="assignment-setuplayouttext"/>
</cd:arguments>
</cd:command>
- <!--
-
- <cd:command name="setuptop" level="style" category="layout" file="page-txt.mkvi">
- <cd:arguments>
- <cd:keywords optional="yes">
- <cd:constant type="text"/>
- <cd:constant type="margin"/>
- <cd:constant type="edge"/>
- </cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setuplayoutelement"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="setupheader" level="style" category="layout" file="page-txt.mkvi">
- <cd:arguments>
- <cd:keywords optional="yes">
- <cd:constant type="text"/>
- <cd:constant type="margin"/>
- <cd:constant type="edge"/>
- </cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setuplayoutelement"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="setuptext" level="style" category="layout" file="page-txt.mkvi">
- <cd:arguments>
- <cd:keywords optional="yes">
- <cd:constant type="text"/>
- <cd:constant type="margin"/>
- <cd:constant type="edge"/>
- </cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setuplayoutelement"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="setupfooter" level="style" category="layout" file="page-txt.mkvi">
- <cd:arguments>
- <cd:keywords optional="yes">
- <cd:constant type="text"/>
- <cd:constant type="margin"/>
- <cd:constant type="edge"/>
- </cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setuplayoutelement"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- <cd:command name="setupbottom" level="style" category="layout" file="page-txt.mkvi">
- <cd:arguments>
- <cd:keywords optional="yes">
- <cd:constant type="text"/>
- <cd:constant type="margin"/>
- <cd:constant type="edge"/>
- </cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setuplayoutelement"/>
- </cd:assignments>
- </cd:arguments>
- </cd:command>
-
- -->
-
<cd:command name="setuptop" level="style" category="layout" file="page-txt.mkvi">
<cd:arguments>
- <cd:keywords optional="yes">
- <cd:constant type="text"/>
- <cd:constant type="margin"/>
- <cd:constant type="edge"/>
- </cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setuplayouttext"/>
- </cd:assignments>
+ <cd:resolve name="keyword-setuplayouttext"/>
+ <cd:resolve name="assignment-setuplayouttext"/>
</cd:arguments>
</cd:command>
<cd:command name="setupheader" level="style" category="layout" file="page-txt.mkvi">
<cd:arguments>
- <cd:keywords optional="yes">
- <cd:constant type="text"/>
- <cd:constant type="margin"/>
- <cd:constant type="edge"/>
- </cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setuplayouttext"/>
- </cd:assignments>
+ <cd:resolve name="keyword-setuplayouttext"/>
+ <cd:resolve name="assignment-setuplayouttext"/>
</cd:arguments>
</cd:command>
<cd:command name="setuptext" level="style" category="layout" file="page-txt.mkvi">
<cd:arguments>
- <cd:keywords optional="yes">
- <cd:constant type="text"/>
- <cd:constant type="margin"/>
- <cd:constant type="edge"/>
- </cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setuplayouttext"/>
- </cd:assignments>
+ <cd:resolve name="keyword-setuplayouttext"/>
+ <cd:resolve name="assignment-setuplayouttext"/>
</cd:arguments>
</cd:command>
<cd:command name="setupfooter" level="style" category="layout" file="page-txt.mkvi">
<cd:arguments>
- <cd:keywords optional="yes">
- <cd:constant type="text"/>
- <cd:constant type="margin"/>
- <cd:constant type="edge"/>
- </cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setuplayouttext"/>
- </cd:assignments>
+ <cd:resolve name="keyword-setuplayouttext"/>
+ <cd:resolve name="assignment-setuplayouttext"/>
</cd:arguments>
</cd:command>
<cd:command name="setupbottom" level="style" category="layout" file="page-txt.mkvi">
<cd:arguments>
- <cd:keywords optional="yes">
- <cd:constant type="text"/>
- <cd:constant type="margin"/>
- <cd:constant type="edge"/>
- </cd:keywords>
- <cd:assignments list="yes">
- <cd:inherit name="setuplayouttext"/>
- </cd:assignments>
+ <cd:resolve name="keyword-setuplayouttext"/>
+ <cd:resolve name="assignment-setuplayouttext"/>
</cd:arguments>
</cd:command>
diff --git a/Master/texmf-dist/tex/context/interface/mkiv/i-vspace.xml b/Master/texmf-dist/tex/context/interface/mkiv/i-vspace.xml
index 5e970d317c6..e79e4e73623 100644
--- a/Master/texmf-dist/tex/context/interface/mkiv/i-vspace.xml
+++ b/Master/texmf-dist/tex/context/interface/mkiv/i-vspace.xml
@@ -140,4 +140,10 @@
</cd:arguments>
</cd:command>
+ <cd:command name="crlf" level="document" category="whitespace" file="typo-wrp.mkiv"/>
+
+ <cd:command name="settestcrlf" level="document" category="whitespace" file="typo-wrp.mkiv"/>
+
+ <cd:command name="crlfplaceholder" level="document" category="whitespace" file="typo-wrp.mkiv"/>
+
</cd:interface>
diff --git a/Master/texmf-dist/tex/context/modules/common/s-abbreviations-logos.tex b/Master/texmf-dist/tex/context/modules/common/s-abbreviations-logos.tex
index 203ee936b98..11c5b9725d2 100644
--- a/Master/texmf-dist/tex/context/modules/common/s-abbreviations-logos.tex
+++ b/Master/texmf-dist/tex/context/modules/common/s-abbreviations-logos.tex
@@ -20,10 +20,13 @@
\logo [MKVI] {MkVI}
\logo [MKIX] {MkIX}
\logo [MKXI] {MkXI}
-\logo [MKIC] {MkIC}
-\logo [MKCI] {MkCI}
+\logo [MKXL] {MkXL}
+\logo [MKLX] {MkLX}
\logo [MPII] {MpII}
\logo [MPIV] {MpIV}
+\logo [MPVI] {MpVI}
+\logo [MPLX] {MpLX}
+\logo [MPXL] {MpXL}
\logo [LMTX] {lmtx}
\logo [ACROBAT] {Acro\-bat}
@@ -43,6 +46,7 @@
\logo [ASCIIMATH] {AsciiMath}
\logo [ASCIITEX] {ascii\TeXsuffix}
\logo [BACHOTEX] {Bacho\TeXsuffix}
+\logo [BASIC] {Basic}
\logo [BIBTEX] {bib\TeXsuffix}
\logo [BLUESKY] {BlueSky}
\logo [BMP] {bmp}
@@ -53,7 +57,7 @@
\logo [CDROM] {cdrom}
\logo [CID] {cid}
\logo [CJK] {cjk}
-\logo [CLD] {cld}
+\logo [CLANG] {clang}
\logo [CLD] {cld}
\logo [CMAKE] {cmake}
\logo [CMR] {cmr}
@@ -66,8 +70,10 @@
\logo [CPLUSPLUS] {C\high{++}}
\logo [CPU] {cpu}
\logo [CSS] {css}
+\logo [CSV] {csv}
\logo [CTAN] {ctan}
\logo [CTXTOOLS] {ctxtools}
+\logo [CURL] {Curl}
\logo [CWEB] {cweb}
\logo [DAC] {dac}
\logo [DARWIN] {Darwin}
@@ -91,6 +97,7 @@
\logo [DVIWINDO] {dviwindo}
\logo [EBCDIC] {ebcdic}
\logo [EC] {ec}
+\logo [ECMASCRIPT] {ecmascript}
\logo [EIFFEL] {Eiffel}
\logo [EMACS] {emacs}
\logo [EMTEX] {em\TeXsuffix}
@@ -127,6 +134,7 @@
\logo [GIF] {gif}
\logo [GNU] {gnu}
\logo [GNUPLOT] {gnuplot}
+\logo [GRAPHICSMAGICK]{GraphicsMagick}
\logo [GS] {Ghost\-Script}
\logo [GUST] {Gust}
\logo [GWTEX] {gw\TeXsuffix}
@@ -141,14 +149,17 @@
\logo [INITEX] {ini\TeXsuffix}
\logo [INRSTEX] {inrs\TeXsuffix}
\logo [IO] {io}
+\logo [INKSCAPE] {Inkscape}
\logo [IRCNET] {IRCnet}
\logo [ISO] {iso}
\logo [JAVA] {Java}
\logo [JAVASCRIPT] {Java\-Script}
\logo [JBIG] {jbig}
+\logo [JIT] {jit}
\logo [JPEG] {jpeg}
\logo [JPG] {jpg}
\logo [JSON] {json}
+\logo [KB] {KB}
\logo [KPATHSEA] {kpathsea}
\logo [KPSE] {kpse}
\logo [KPSEWHICH] {kpsewhich}
@@ -163,9 +174,10 @@
\logo [LMX] {lmx}
\logo [LPEG] {lpeg}
\logo [LUA] {Lua}
-\logo [LUAJIT] {LuaJIT}
-\logo [LUAJITTEX] {Luajit\TeXsuffix}
-\logo [LUATEX] {Lua\TeXsuffix}
+\logo [LUAJIT] {Lua\wordboundary JIT}
+\logo [LUAJITTEX] {Lua\wordboundary jit\TeXsuffix}
+\logo [LUAMETATEX] {\Lua\wordboundary Meta\wordboundary\TeXsuffix}
+\logo [LUATEX] {Lua\wordboundary\TeXsuffix}
\logo [LUATOOLS] {luatools}
\logo [MACOSX] {MacOSX}
%logo [MACROTEX] {Macro\TeXsuffix}
@@ -174,6 +186,7 @@
\logo [MAPS] {Maps}
\logo [MATHML] {MathML}
\logo [METAFONT] {\MetaFont}
+\logo [LUAMETAFUN] {\Lua\wordboundary\MetaFun}
\logo [METAFUN] {\MetaFun}
\logo [METAPOST] {\MetaPost}
\logo [METATEX] {Meta\TeXsuffix}
@@ -192,6 +205,7 @@
\logo [MPTOPDF] {mptopdf}
\logo [MSDOS] {msdos}
\logo [MSEXCEL] {MS~Excel}
+\logo [MSVC] {MSVC}
\logo [MSWINDOWS] {MS~Windows}
\logo [MSWORD] {MS~Word}
\logo [MTXRUN] {mtxrun}
@@ -206,6 +220,7 @@
\logo [OPENBSD] {OpenBSD}
\logo [OPENMATH] {OpenMath}
\logo [OPENTYPE] {OpenType}
+\logo [OPENOFFICE] {OpenOffice}
\logo [OPI] {opi}
\logo [OSX] {os-x}
\logo [OTEX] {Oriental \TeXsuffix}
@@ -213,6 +228,7 @@
\logo [OTP] {otp}
\logo [OVF] {ovf}
\logo [PASCAL] {Pascal}
+\logo [PATGEN] {Patgen}
\logo [PCTEX] {pc\TeXsuffix}
\logo [PDF] {pdf}
\logo [PDFETEX] {pdfe\TeXsuffix}
@@ -228,6 +244,7 @@
\logo [PLAIN] {Plain}
\logo [PNG] {png}
\logo [POSIX] {posix}
+\logo [POSTGRESS] {Post\-gress}
\logo [POSTSCRIPT] {Post\-Script}
\logo [PPCHTEX] {\PPCHTeX}
\logo [PRAGMA] {Pragma ADE}
@@ -261,6 +278,7 @@
\logo [SWIG] {swig}
\logo [SWIGLIB] {SwigLib}
\logo [SYNCTEX] {Sync\TeX}
+\logo [SQLITE] {SQLite}
\logo [TABLE] {\TaBlE}
\logo [TCPIP] {tcp/ip}
\logo [TDS] {tds} % no sc te
@@ -304,6 +322,7 @@
\logo [TUGBOAT] {Tug\-Boat}
\logo [TUGNEWS] {Tug\-News}
\logo [TYPEONE] {Type1}
+\logo [TYPETHREE] {Type3}
\logo [UCS] {ucs}
\logo [UNICODE] {Uni\-code}
\logo [UNIX] {Unix}
@@ -325,6 +344,7 @@
%logo [WINNX] {Win9x}
\logo [WTHREEC] {W3C}
\logo [WWW] {www}
+\logo [WIKIPEDIA] {Wikipedia} % WikipediA (looks too weird)
\logo [WYSIWYG] {wysiwyg}
%logo [XDVI] {Xdvi}
\logo [XETEX] {\XeTeX}
@@ -344,5 +364,11 @@
\logo [YandY] {y\&y}
\logo [YOUTUBE] {YouTube}
\logo [ZIP] {zip}
+\logo [ZINT] {zint}
+
+\logo [KB] {KB}
+\logo [MB] {MB}
+\logo [GB] {GB}
+\logo [TB] {TB}
\stopmodule
diff --git a/Master/texmf-dist/tex/context/modules/common/s-abbreviations-mixed.mkiv b/Master/texmf-dist/tex/context/modules/common/s-abbreviations-mixed.mkiv
index f7b2121d042..d5294fd56e2 100644
--- a/Master/texmf-dist/tex/context/modules/common/s-abbreviations-mixed.mkiv
+++ b/Master/texmf-dist/tex/context/modules/common/s-abbreviations-mixed.mkiv
@@ -1,5 +1,5 @@
%D \module
-%D [ file= s-abbreviations-mixed, % was: s-abr-04
+%D [ file=s-abbreviations-mixed, % was: s-abr-04
%D version=1996.01.01,
%D title=\CONTEXT\ Style File,
%D subtitle=General Abbreviations Mixed,
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/m-asymptote.lua b/Master/texmf-dist/tex/context/modules/mkiv/m-asymptote.lua
index 39a0d987bee..31a81433fba 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/m-asymptote.lua
+++ b/Master/texmf-dist/tex/context/modules/mkiv/m-asymptote.lua
@@ -17,7 +17,7 @@ sandbox.registerrunner {
name = "asymptote prc",
program = "asy",
method = "execute",
- template = '-noV -config="" -tex=context -outformat="prc" "%filename%"',
+ template = [[-noV -config="" -tex=context -outformat="prc" %filename%]],
checkers = { filename = "readable" },
}
@@ -25,7 +25,7 @@ sandbox.registerrunner {
name = "asymptote pdf",
program = "asy",
method = "execute",
- template = '-noV -config="" -tex=context -outformat="pdf" "%filename%"',
+ template = [[-noV -config="" -tex=context -outformat="pdf" %filename%]],
checkers = { filename = "readable" },
}
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/m-catchword.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/m-catchword.mkiv
new file mode 100644
index 00000000000..70d713e44c1
--- /dev/null
+++ b/Master/texmf-dist/tex/context/modules/mkiv/m-catchword.mkiv
@@ -0,0 +1,136 @@
+%D \module
+%D [ file=m-catchword,
+%D version=2019.08.09,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Catchwords,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startluacode
+
+-- If someone realy need it there probably is no need for speed, so we do
+-- it quick and dirty.
+
+local nodecodes = nodes.nodecodes
+local kerncodes = nodes.kerncodes
+
+local glyph_code = nodecodes.glyph
+local disc_code = nodecodes.disc
+local kern_code = nodecodes.kern
+local hlist_code = nodecodes.hlist
+
+local fontkern_code = kerncodes.fontkern
+
+local function set_catchword(t)
+ local nextpage = tex.lists.contrib_head
+ if not nextpage then
+ return
+ end
+ local firstline = nil
+ for n in nodes.traverse_id(hlist_code,nextpage) do
+ firstline = n
+ break
+ end
+ if not firstline then
+ return
+ end
+ local list = firstline.list
+ if not list then
+ return
+ end
+ local first = nil
+ local last = nil
+ for n, id, subtype in nodes.traverse(list) do
+ if id == glyph_code or id == disc_code or (id == kern_code and subtype == fontkern_code) then
+ if not first then
+ first = n
+ end
+ last = n
+ elseif first then
+ break
+ end
+ end
+ if not first then
+ return
+ end
+ local page = tex.getbox(t.box)
+ local head = nodes.copy_list(first,last.next)
+ head = nodes.insert_before(head,head,nodes.pool.glue(1,1,1))
+ local line = nodes.hpack(head,page.width,"exactly")
+ if CONTEXTLMTXMODE > 0 then
+ line.yoffset = -t.voffset
+ line.xoffset = t.hoffset
+ else
+ line.shift = t.hoffset
+ line = nodes.insert_before(line,line,nodes.pool.kern(t.voffset-line.height))
+ line = nodes.vpack(line)
+ end
+ line.height = 0
+ line.depth = 0
+ node.insert_after(page.list,nodes.tail(page.list),line)
+ logs.report("catchword","appending %a on page %i",nodes.toutf(head),tex.getcount("realpageno"))
+end
+
+interfaces.implement {
+ name = "set_catchword",
+ actions = set_catchword,
+ arguments = {
+ {
+ { "box", "integer" },
+ { "hoffset", "dimension" },
+ { "voffset", "dimension" },
+ },
+ },
+}
+
+\stopluacode
+
+\unprotect
+
+\installcorenamespace {catchword}
+
+\installsimplecommandhandler \??catchword {catchword}
+
+\setupcatchword
+ [\c!state=\v!stop,
+ \c!hoffset=\zeropoint,
+ \c!voffset=\lineheight]
+
+\def\page_check_catchword_yes#1%
+ {\clf_set_catchword
+ box #1
+ hoffset \catchwordparameter\c!hoffset
+ voffset \catchwordparameter\c!voffset
+ \relax}
+
+\let\page_check_catchword_nop\gobbleoneargument
+
+\appendtoks
+ \doifelse{\catchwordparameter\c!state}\v!start
+ {\let\page_check_catchword\page_check_catchword_yes}%
+ {\let\page_check_catchword\page_check_catchword_nop}%
+\to \everysetupcatchword
+
+\appendtoks
+ \page_check_catchword\b_page_postprocessor
+\to \t_page_postprocessors_page
+
+\protect
+
+\continueifinputfile{m-catchword.mkiv}
+
+\setupcatchword
+ [state=start,
+ hoffset=.75em,
+ voffset=1cm]
+
+\starttext
+
+ \dorecurse{100}{\input ward }
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/m-chart.lua b/Master/texmf-dist/tex/context/modules/mkiv/m-chart.lua
index 7973640a783..1cdfd9f65d8 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/m-chart.lua
+++ b/Master/texmf-dist/tex/context/modules/mkiv/m-chart.lua
@@ -648,8 +648,8 @@ end
-- todo : make lpeg for splitter
-local sign = S("+p") / "1"
- + S("-m") / "-1"
+local sign = S("+p") / "1"
+ + S("-mn") / "-1"
local full = C(P("left"))
+ C(P("right"))
@@ -962,6 +962,7 @@ local function makechart_indeed(chart)
local labeloffset = chartsettings.labeloffset
local exitoffset = chartsettings.exitoffset
local commentoffset = chartsettings.commentoffset
+ local clipoffset = chartsettings.clipoffset
ctx_tographic(g,"flow_grid_width := %p ;", gridwidth)
ctx_tographic(g,"flow_grid_height := %p ;", gridheight)
ctx_tographic(g,"flow_shape_width := %p ;", shapewidth)
@@ -996,6 +997,7 @@ local function makechart_indeed(chart)
offset = radius -- or rulethickness?
end
ctx_tographic(g,"flow_chart_offset := %p ;",offset)
+ ctx_tographic(g,"flow_chart_clip_offset := %p ;",clipoffset)
--
ctx_tographic(g,"flow_reverse_y := true ;")
if chartsettings.option == v_test then
@@ -1126,6 +1128,7 @@ implement {
{ "ny", "integer" },
{ "x", "integer" },
{ "y", "integer" },
+ { "clipoffset", "dimension" },
{ "labeloffset", "dimension" },
{ "commentoffset", "dimension" },
{ "exitoffset", "dimension" },
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/m-chart.mkvi b/Master/texmf-dist/tex/context/modules/mkiv/m-chart.mkvi
index 4c5ea7e021c..a9d3dfdd931 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/m-chart.mkvi
+++ b/Master/texmf-dist/tex/context/modules/mkiv/m-chart.mkvi
@@ -52,6 +52,7 @@
[\c!width=12\bodyfontsize,
\c!height=7\bodyfontsize,
\c!offset=\FLOWlineparameter\c!rulethickness,
+ \c!clipoffset=\bodyfontsize,
\c!dx=2\bodyfontsize,
\c!dy=2\bodyfontsize,
\c!nx=0,
@@ -203,6 +204,7 @@
dx \dimexpr\FLOWchartparameter\c!dx\relax
dy \dimexpr\FLOWchartparameter\c!dy\relax
offset \dimexpr\FLOWchartparameter\c!offset\relax
+ clipoffset \dimexpr\FLOWchartparameter\c!clipoffset\relax
% bodyfont {\FLOWchartparameter\c!bodyfont}
dot {\FLOWchartparameter\c!dot} % private option
hcompact {\FLOWchartparameter\c!hcompact} % undocumented option
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/m-markdown.lua b/Master/texmf-dist/tex/context/modules/mkiv/m-markdown.lua
deleted file mode 100644
index 1f9402f60e3..00000000000
--- a/Master/texmf-dist/tex/context/modules/mkiv/m-markdown.lua
+++ /dev/null
@@ -1,824 +0,0 @@
-if not modules then modules = { } end modules ['m-markdown'] = {
- version = 1.002,
- comment = "companion to m-markdown.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "see below",
- license = "see context related readme files"
-}
-
---[[
-Copyright (C) 2009 John MacFarlane / Khaled Hosny / Hans Hagen
-
-The main parser is derived from the lunamark parser written by John MacFarlane. You
-can download lunamark from:
-
- http://github.com/jgm/lunamark.git
-
-Khaled Hosny provided the context writer for lunamark and that was used as starting
-point for the mapping. The original code can be fetched from the above location.
-
-While playing with the original code I got the feeling that lpeg could perform better.
-The slowdown was due to the fact that the parser's lpeg was reconstructed each time a
-nested parse was needed. After changing that code a bit I could bring down parsing of
-some test code from 2 seconds to less than 0.1 second so I decided to stick to this
-parser instead of writing my own. After all, the peg code looks pretty impressive and
-visiting Johns pandoc pages is worth the effort:
-
- http://johnmacfarlane.net/pandoc/
-
-The code here is mostly meant for processing snippets embedded in a context
-documents and is no replacement for pandoc at all. Therefore an alternative is to use
-pandoc in combination with Aditya's filter module.
-
-As I changed (and optimized) the original code, it will be clear that all errors
-are mine. Eventually I might also adapt the parser code a bit more. When I ran into of
-closure stack limitations I decided to flatten the code. The following implementation
-seems to be a couple of hundred times faster than what I started with which is not that
-bad.
-
-This is a second rewrite. The mentioned speed gain largely depended on the kind of
-content: blocks, references and items can be rather demanding. Also, There were
-some limitations with respect to the captures. So, table storage has been removed in
-favor of strings, and nesting has been simplified. The first example at the end of this
-file now takes .33 seconds for 567KB code (resulting in over 1MB) so we're getting there.
-
-There will be a third rewrite eventually.
-]]--
-
--- todo: we have better quote and tag scanners in ctx
--- todo: provide an xhtml mapping
--- todo: add a couple of extensions
--- todo: check patches to the real peg
-
-local type, next, tonumber = type, next, tonumber
-local lower, upper, gsub, rep, gmatch, format, length = string.lower, string.upper, string.gsub, string.rep, string.gmatch, string.format, string.len
-local concat = table.concat
-local P, R, S, V, C, Ct, Cg, Cb, Cmt, Cc, Cf, Cs = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Cg, lpeg.Cb, lpeg.Cmt, lpeg.Cc, lpeg.Cf, lpeg.Cs
-local lpegmatch = lpeg.match
-local utfbyte, utfchar = utf.byte, utf.char
-
-moduledata = moduledata or { }
-moduledata.markdown = moduledata.markdown or { }
-local markdown = moduledata.markdown
-
-local nofruns, nofbytes, nofhtmlblobs = 0, 0, 0
-
----------------------------------------------------------------------------------------------
-
-local nestedparser
-local syntax
-
-nestedparser = function(str) return lpegmatch(syntax,str) end
-
----------------------------------------------------------------------------------------------
-
-local asterisk = P("*")
-local dash = P("-")
-local plus = P("+")
-local underscore = P("_")
-local period = P(".")
-local hash = P("#")
-local ampersand = P("&")
-local backtick = P("`")
-local less = P("<")
-local more = P(">")
-local space = P(" ")
-local squote = P("'")
-local dquote = P('"')
-local lparent = P("(")
-local rparent = P(")")
-local lbracket = P("[")
-local rbracket = P("]")
-local slash = P("/")
-local equal = P("=")
-local colon = P(":")
-local semicolon = P(";")
-local exclamation = P("!")
-
-local digit = R("09")
-local hexdigit = R("09","af","AF")
-local alphanumeric = R("AZ","az","09")
-
-local doubleasterisks = P("**")
-local doubleunderscores = P("__")
-local fourspaces = P(" ")
-
-local any = P(1)
-local always = P("")
-
-local tab = P("\t")
-local spacechar = S("\t ")
-local spacing = S(" \n\r\t")
-local newline = P("\r")^-1 * P("\n")
-local spaceornewline = spacechar + newline
-local nonspacechar = any - spaceornewline
-local optionalspace = spacechar^0
-local spaces = spacechar^1
-local eof = - any
-local nonindentspace = space^-3
-local blankline = optionalspace * C(newline)
-local blanklines = blankline^0
-local skipblanklines = (optionalspace * newline)^0
-local linechar = P(1 - newline)
-local indent = fourspaces + (nonindentspace * tab) / ""
-local indentedline = indent /"" * C(linechar^1 * (newline + eof))
-local optionallyindentedline = indent^-1 /"" * C(linechar^1 * (newline + eof))
-local spnl = optionalspace * (newline * optionalspace)^-1
-local specialchar = S("*_`*&[]<!\\")
-local normalchar = any - (specialchar + spaceornewline)
-local line = C((any - newline)^0 * newline)
- + C(any^1 * eof)
-local nonemptyline = (any - newline)^1 * newline
-
----------------------------------------------------------------------------------------------
-
-local function lineof(c)
- return (nonindentspace * (P(c) * optionalspace)^3 * newline * blankline^1)
-end
-
-local lineof_asterisks = lineof(asterisk)
-local lineof_dashes = lineof(dash)
-local lineof_underscores = lineof(underscore)
-
-local bullet = nonindentspace * (plus + (asterisk - lineof_asterisks) + (dash - lineof_dashes)) * spaces
-local enumerator = nonindentspace * digit^1 * period * spaces
-
----------------------------------------------------------------------------------------------
-
-local openticks = Cg(backtick^1, "ticks")
-local closeticks = space^-1 * Cmt(C(backtick^1) * Cb("ticks"), function(s,i,a,b) return #a == #b and i end)
-local intickschar = (any - S(" \n\r`"))
- + (newline * -blankline)
- + (space - closeticks)
- + (backtick^1 - closeticks)
-local inticks = openticks * space^-1 * C(intickschar^1) * closeticks
-
----------------------------------------------------------------------------------------------
-
-local leader = space^-3
-local nestedbrackets = P { lbracket * ((1 - lbracket - rbracket) + V(1))^0 * rbracket }
-local tag = lbracket * C((nestedbrackets + 1 - rbracket)^0) * rbracket
-local url = less * C((1-more)^0) * more
- + C((1-spacing- rparent)^1) -- sneaky: ) for resolver
-local title_s = squote * lpeg.C((1-squote )^0) * squote
-local title_d = dquote * lpeg.C((1-dquote )^0) * dquote
-local title_p = lparent * lpeg.C((1-rparent)^0) * rparent
-local title = title_s + title_d + title_p
-local optionaltitle = ((spacing^0 * title * spacechar^0) + lpeg.Cc(""))
-
-local references = { }
-
-local function register_link(tag,url,title)
- tag = lower(gsub(tag, "[ \n\r\t]+", " "))
- references[tag] = { url, title }
-end
-
-local function direct_link(label,url,title) -- title is typical html thing
- return label, url, title
-end
-
-local function indirect_link(label,tag)
- if tag == "" then
- tag = label
- end
- tag = lower(gsub(tag, "[ \n\r\t]+", " "))
- local r = references[tag]
- if r then
- return label, r[1], r[2]
- else
- return label, tag, ""
- end
-end
-
-local define_reference_parser = (leader * tag * colon * spacechar^0 * url * optionaltitle) / register_link
-local direct_link_parser = tag * spacechar^0 * lparent * (url + Cc("")) * optionaltitle * rparent / direct_link
-local indirect_link_parser = tag * spacechar^0 * tag / indirect_link
-
-local rparser = (define_reference_parser+1)^0
-
-local function referenceparser(str)
- references = { }
- lpegmatch(rparser,str)
-end
-
--- local reftest = [[
--- [1]: <http://example.com/>
--- [3]:http://example.com/ (Optional Title Here)
--- [2]: http://example.com/ 'Optional Title Here'
--- [a]: http://example.com/ "Optional *oeps* Title Here"
--- ]]
---
--- local linktest = [[
--- [This link] (http://example.net/)
--- [an example] (http://example.com/ "Title")
--- [an example][1]
--- [an example] [2]
--- ]]
---
--- lpeg.match((define_reference_parser+1)^0,reftest)
---
--- inspect(references)
---
--- lpeg.match((direct_link_parser/print + indirect_link_parser/print + 1)^0,linktest)
-
----------------------------------------------------------------------------------------------
-
-local blocktags = table.tohash {
- "address", "blockquote" , "center", "dir", "div", "p", "pre",
- "li", "ol", "ul", "dl", "dd",
- "form", "fieldset", "isindex", "menu", "noframes", "frameset",
- "h1", "h2", "h3", "h4", "h5", "h6",
- "hr", "ht", "script", "noscript",
- "table", "tbody", "tfoot", "thead", "th", "td", "tr",
-}
-
------ htmlattributevalue = squote * C((any - (blankline + squote))^0) * squote
------ + dquote * C((any - (blankline + dquote))^0) * dquote
------ + (any - S("\t >"))^1 -- any - tab - space - more
------ htmlattribute = (alphanumeric + S("_-"))^1 * spnl * (equal * spnl * htmlattributevalue)^-1 * spnl
------ htmlcomment = P("<!--") * (any - P("-->"))^0 * P("-->")
-
------ htmltag = less * spnl * slash^-1 * alphanumeric^1 * spnl * htmlattribute^0 * slash^-1 * spnl * more
------
------ blocktag = Cmt(C(alphanumeric^1), function(s,i,a) return blocktags[lower(a)] and i, a end)
------
------ openblocktag = less * Cg(blocktag, "opentag") * spnl * htmlattribute^0 * more
------ closeblocktag = less * slash * Cmt(C(alphanumeric^1) * Cb("opentag"), function(s,i,a,b) return lower(a) == lower(b) and i end) * spnl * more
------ selfclosingblocktag = less * blocktag * spnl * htmlattribute^0 * slash * more
------
------ displayhtml = Cs { "HtmlBlock",
------ InBlockTags = openblocktag * (V("HtmlBlock") + (any - closeblocktag))^0 * closeblocktag,
------ HtmlBlock = C(V("InBlockTags") + selfclosingblocktag + htmlcomment),
------ }
------
------ inlinehtml = Cs(htmlcomment + htmltag)
-
--- There is no reason to support crappy html, so we expect proper attributes.
-
-local htmlattributevalue = squote * C((any - (blankline + squote))^0) * squote
- + dquote * C((any - (blankline + dquote))^0) * dquote
-local htmlattribute = (alphanumeric + S("_-"))^1 * spnl * equal * spnl * htmlattributevalue * spnl
-
-local htmlcomment = P("<!--") * (any - P("-->"))^0 * P("-->")
-local htmlinstruction = P("<?") * (any - P("?>" ))^0 * P("?>" )
-
--- We don't care too much about matching elements and there is no reason why display elements could not
--- have inline elements so the above should be patched then. Well, markdown mixed with html is not meant
--- for anything else than webpages anyway.
-
-local blocktag = Cmt(C(alphanumeric^1), function(s,i,a) return blocktags[lower(a)] and i, a end)
-
-local openelement = less * alphanumeric^1 * spnl * htmlattribute^0 * more
-local closeelement = less * slash * alphanumeric^1 * spnl * more
-local emptyelement = less * alphanumeric^1 * spnl * htmlattribute^0 * slash * more
-
-local displaytext = (any - less)^1
-local inlinetext = displaytext / nestedparser
-
-local displayhtml = #(less * blocktag * spnl * htmlattribute^0 * more)
- * Cs { "HtmlBlock",
- InBlockTags = openelement * (V("HtmlBlock") + displaytext)^0 * closeelement,
- HtmlBlock = (V("InBlockTags") + emptyelement + htmlcomment + htmlinstruction),
- }
-
-local inlinehtml = Cs { "HtmlBlock",
- InBlockTags = openelement * (V("HtmlBlock") + inlinetext)^0 * closeelement,
- HtmlBlock = (V("InBlockTags") + emptyelement + htmlcomment + htmlinstruction),
- }
-
----------------------------------------------------------------------------------------------
-
-local hexentity = ampersand * hash * S("Xx") * C(hexdigit ^1) * semicolon
-local decentity = ampersand * hash * C(digit ^1) * semicolon
-local tagentity = ampersand * C(alphanumeric^1) * semicolon
-
----------------------------------------------------------------------------------------------
-
--- --[[
-
-local escaped = {
- ["{" ] = "",
- ["}" ] = "",
- ["$" ] = "",
- ["&" ] = "",
- ["#" ] = "",
- ["~" ] = "",
- ["|" ] = "",
- ["%%"] = "",
- ["\\"] = "",
-}
-
-for k, v in next, escaped do
- escaped[k] = "\\char" .. utfbyte(k) .. "{}"
-end
-
-local function c_string(s) -- has to be done more often
- return (gsub(s,".",escaped))
-end
-
-local c_linebreak = "\\crlf\n" -- is this ok?
-local c_space = " "
-
-local function c_paragraph(c)
- return c .. "\n\n" -- { "\\startparagraph ", c, " \\stopparagraph\n" }
-end
-
-local function listitem(c)
- return format("\n\\startitem\n%s\n\\stopitem\n",nestedparser(c))
-end
-
-local function c_tightbulletlist(c)
- return format("\n\\startmarkdownitemize[packed]\n%s\\stopmarkdownitemize\n",c)
-end
-
-local function c_loosebulletlist(c)
- return format("\n\\startmarkdownitemize\n\\stopmarkdownitemize\n",c)
-end
-
-local function c_tightorderedlist(c)
- return format("\n\\startmarkdownitemize[n,packed]\n%s\\stopmarkdownitemize\n",c)
-end
-
-local function c_looseorderedlist(c)
- return format("\n\\startmarkdownitemize[n]\n%s\\stopmarkdownitemize\n",c)
-end
-
-local function c_inline_html(content)
- nofhtmlblobs = nofhtmlblobs + 1
- return format("\\markdowninlinehtml{%s}",content)
-end
-
-local function c_display_html(content)
- nofhtmlblobs = nofhtmlblobs + 1
- return format("\\startmarkdowndisplayhtml\n%s\n\\stopmarkdowndisplayhtml",content)
-end
-
-local function c_emphasis(c)
- return format("\\markdownemphasis{%s}",c)
-end
-
-local function c_strong(c)
- return format("\\markdownstrong{%s}",c)
-end
-
-local function c_blockquote(c)
- return format("\\startmarkdownblockquote\n%s\\stopmarkdownblockquote\n",nestedparser(c))
-end
-
-local function c_verbatim(c)
- return format("\\startmarkdowntyping\n%s\\stopmarkdowntyping\n",c)
-end
-
-local function c_code(c)
- return format("\\markdowntype{%s}",c)
-end
-
-local levels = { "", "", "", "", "", "" }
-
-local function c_start_document()
- levels = { "", "", "", "", "", "" }
- return ""
-end
-
-local function c_stop_document()
- return concat(levels,"\n") or ""
-end
-
-local function c_heading(level,c)
- if level > #levels then
- level = #levels
- end
- local finish = concat(levels,"\n",level) or ""
- for i=level+1,#levels do
- levels[i] = ""
- end
- levels[level] = "\\stopstructurelevel"
- return format("%s\\startstructurelevel[markdown][title={%s}]\n",finish,c)
-end
-
-local function c_hrule()
- return "\\markdownrule\n"
-end
-
-local function c_link(lab,src,tit)
- return format("\\goto{%s}[url(%s)]",nestedparser(lab),src)
-end
-
-local function c_image(lab,src,tit)
- return format("\\externalfigure[%s]",src)
-end
-
-local function c_email_link(address)
- return format("\\goto{%s}[url(mailto:%s)]",c_string(address),address)
-end
-
-local function c_url_link(url)
- return format("\\goto{%s}[url(%s)]",c_string(url),url)
-end
-
-local function f_heading(c,n)
- return c_heading(n,c)
-end
-
-local function c_hex_entity(s)
- return utfchar(tonumber(s,16))
-end
-
-local function c_dec_entity(s)
- return utfchar(tonumber(s))
-end
-
-local function c_tag_entity(s)
- return s -- we can use the default resolver
-end
-
---]]
-
----------------------------------------------------------------------------------------------
-
---[[
-
-local escaped = {
- ["<"] = "&lt;",
- [">"] = "&gt;",
- ["&"] = "&amp;",
- ['"'] = "&quot;",
-}
-
-local function c_string(s) -- has to be done more often
- return (gsub(s,".",escaped))
-end
-
-local c_linebreak = "<br/>"
-local c_space = " "
-
-local function c_paragraph(c)
- return format("<p>%s</p>\n", c)
-end
-
-local function listitem(c)
- return format("<li>%s</li>",nestedparser(c))
-end
-
-local function c_tightbulletlist(c)
- return format("<ul>\n%s\n</ul>\n",c)
-end
-
-local function c_loosebulletlist(c)
- return format("<ul>\n%s\n</ul>\n",c)
-end
-
-local function c_tightorderedlist(c)
- return format("<ol>\n%s\n</ol>\n",c)
-end
-
-local function c_looseorderedlist(c)
- return format("<ol>\n%s\n</ol>\n",c)
-end
-
-local function c_inline_html(content)
- nofhtmlblobs = nofhtmlblobs + 1
- return content
-end
-
-local function c_display_html(content)
- nofhtmlblobs = nofhtmlblobs + 1
- return format("\n%s\n",content)
-end
-
-local function c_emphasis(c)
- return format("<em>%s</em>",c)
-end
-
-local function c_strong(c)
- return format("<strong>%s</strong>",c)
-end
-
-local function c_blockquote(c)
- return format("<blockquote>\n%s\n</blockquote>",nestedparser(c))
-end
-
-local function c_verbatim(c)
- return format("<pre><code>%s</code></pre>",c)
-end
-
-local function c_code(c)
- return format("<code>%s</code>",c)
-end
-
-local c_start_document = ""
-local c_stop_document = ""
-
-local function c_heading(level,c)
- return format("<h%d>%s</h%d>\n",level,c,level)
-end
-
-local function c_hrule()
- return "<hr/>\n"
-end
-
-local function c_link(lab,src,tit)
- local titattr = #tit > 0 and format(" title=%q",tit) or ""
- return format("<a href=%q%s>%s</a>",src,titattr,nestedparser(lab))
-end
-
-local function c_image(lab,src,tit)
- return format("<img href=%q title=%q>%s</a>",src,tit,nestedparser(lab))
-end
-
-local function c_email_link(address)
- return format("<a href=%q>%s</a>","mailto:",address,c_escape(address))
-end
-
-local function c_url_link(url)
- return format("<a href=%q>%s</a>",url,c_string(url))
-end
-
-local function f_heading(c,n)
- return c_heading(n,c)
-end
-
-local function c_hex_entity(s)
- return utfchar(tonumber(s,16))
-end
-
-local function c_dec_entity(s)
- return utfchar(tonumber(s))
-end
-
-local function c_tag_entity(s)
- return format("&%s;",s)
-end
-
---]]
-
----------------------------------------------------------------------------------------------
-
-local Str = normalchar^1 / c_string
-local Space = spacechar^1 / c_space
-local Symbol = specialchar / c_string
-local Code = inticks / c_code
-
-local HeadingStart = C(hash * hash^-5) / length
-local HeadingStop = optionalspace * hash^0 * optionalspace * newline * blanklines
-local HeadingLevel = equal^3 * Cc(1)
- + dash ^3 * Cc(2)
-
-local NormalEndline = optionalspace * newline * -(
- blankline
- + more
- + HeadingStart
- + ( line * (P("===")^3 + P("---")^3) * newline )
- ) / c_space
-
-local LineBreak = P(" ") * NormalEndline / c_linebreak
-
-local TerminalEndline = optionalspace * newline * eof / ""
-
-local Endline = LineBreak
- + TerminalEndline
- + NormalEndline
-
-local AutoLinkUrl = less * C(alphanumeric^1 * P("://") * (any - (newline + more))^1) * more / c_url_link
-local AutoLinkEmail = less * C((alphanumeric + S("-_+"))^1 * P("@") * (any - (newline + more))^1) * more / c_email_link
-
-local DirectLink = direct_link_parser / c_link
-local IndirectLink = indirect_link_parser / c_link
-
-local ImageLink = exclamation * (direct_link_parser + indirect_link_parser) / c_image -- we can combine this with image ... smaller lpeg
-
-local UlOrStarLine = asterisk^4
- + underscore^4
- + (spaces * S("*_")^1 * #spaces) / c_string
-
-local EscapedChar = P("\\") * C(P(1 - newline)) / c_string
-
-local InlineHtml = inlinehtml / c_inline_html
-local DisplayHtml = displayhtml / c_display_html
-local HtmlEntity = hexentity / c_hex_entity
- + decentity / c_dec_entity
- + tagentity / c_tag_entity
-
-local NestedList = Cs(optionallyindentedline - (bullet + enumerator))^1 / nestedparser
-
-local ListBlockLine = -blankline * -(indent^-1 * (bullet + enumerator)) * optionallyindentedline
-
-local Verbatim = Cs(blanklines * (indentedline - blankline)^1) / c_verbatim
- * (blankline^1 + eof) -- not really needed, probably capture trailing? we can do that beforehand
-
-local Blockquote = Cs((
- ((nonindentspace * more * space^-1)/"" * linechar^0 * newline)^1
- * ((linechar - blankline)^1 * newline)^0
- * blankline^0
- )^1) / c_blockquote
-
-local HorizontalRule = (lineof_asterisks + lineof_dashes + lineof_underscores) / c_hrule
-
-local Reference = define_reference_parser / ""
-
--- could be a mini grammar
-
-local ListBlock = line * ListBlockLine^0
-local ListContinuationBlock = blanklines * indent * ListBlock
-local ListItem = Cs(ListBlock * (NestedList + ListContinuationBlock^0)) / listitem
-
----- LeadingLines = blankline^0 / ""
----- TrailingLines = blankline^1 * #(any) / "\n"
-
-syntax = Cs { "Document",
-
- Document = V("Display")^0,
-
- Display = blankline -- ^1/"\n"
- + Blockquote
- + Verbatim
- + Reference
- + HorizontalRule
- + HeadingStart * optionalspace * Cs((V("Inline") - HeadingStop)^1) * HeadingStop / c_heading
- + Cs((V("Inline") - Endline)^1) * newline * HeadingLevel * newline * blanklines / f_heading
- + Cs((bullet /"" * ListItem)^1) * blanklines * -bullet / c_tightbulletlist
- + Cs((bullet /"" * ListItem * C(blanklines))^1) / c_loosebulletlist
- + Cs((enumerator /"" * ListItem)^1) * blanklines * -enumerator / c_tightorderedlist
- + Cs((enumerator /"" * ListItem * C(blanklines))^1) / c_looseorderedlist
- + DisplayHtml
- + nonindentspace * Cs(V("Inline")^1)* newline * blankline^1 / c_paragraph
- + V("Inline")^1,
-
- Inline = Str
- + Space
- + Endline
- + UlOrStarLine -- still needed ?
- + doubleasterisks * -spaceornewline * Cs((V("Inline") - doubleasterisks )^1) * doubleasterisks / c_strong
- + doubleunderscores * -spaceornewline * Cs((V("Inline") - doubleunderscores)^1) * doubleunderscores / c_strong
- + asterisk * -spaceornewline * Cs((V("Inline") - asterisk )^1) * asterisk / c_emphasis
- + underscore * -spaceornewline * Cs((V("Inline") - underscore )^1) * underscore / c_emphasis
- + ImageLink
- + DirectLink
- + IndirectLink
- + AutoLinkUrl
- + AutoLinkEmail
- + Code
- + InlineHtml
- + HtmlEntity
- + EscapedChar
- + Symbol,
-
-}
-
----------------------------------------------------------------------------------------------
-
-local function convert(str)
- nofruns = nofruns + 1
- nofbytes = nofbytes + #str
- statistics.starttiming(markdown)
- referenceparser(str)
- local result = c_start_document() .. nestedparser(str) .. c_stop_document()
- statistics.stoptiming(markdown)
- return result
-end
-
-markdown.convert = convert
-
-function markdown.typesetstring(data)
- if data and data ~= "" then
- local result = convert(data)
- context.viafile(result)
- end
-end
-
-function markdown.typesetbuffer(name)
- markdown.typesetstring(buffers.getcontent(name))
-end
-
-function markdown.typesetfile(name)
- local fullname = resolvers.findctxfile(name)
- if fullname and fullname ~= "" then
- markdown.typesetstring(io.loaddata(fullname))
- end
-end
-
-statistics.register("markdown",function()
- if nofruns > 0 then
- return format("%s bytes converted, %s runs, %s html blobs, %s seconds used",
- nofbytes, nofruns, nofhtmlblobs, statistics.elapsedtime(markdown))
- end
-end)
-
----------------------------------------------------------------------------------------------
-
---~ context.starttext()
---~ moduledata.markdown.convert(str)
---~ context.stoptext()
-
-if not tex.jobname then
-
- local one = [[
-Test *123*
-==========
-
-<b>BOLD *BOLD* BOLD</b>
-
-<pre>PRE <b>PRE</b> PRE</pre>
-
-
-* Test
-** Test
-* Test1
- * Test2
-* Test
-
-Test
-====
-
-> test
-> test **123** *123*
-> test `code`
-
-test
-
-Test
-====
-
-> test
-> test
-> test
-
-test
-oeps
-
-more
-
- code
- code
-
-oeps
-
-[an example][a]
-
-[an example] [2]
-
-[a]: http://example.com/ "Optional *oeps* Title Here"
-[2]: http://example.com/ 'Optional Title Here'
-[3]: http://example.com/ (Optional Title Here)
-
-[an example][a]
-
-[an example] [2]
-
-[an [tricky] example](http://example.com/ "Title")
-
-[This **xx** link](http://example.net/)
- ]]
-
--- This snippet takes some 4 seconds in the original parser (the one that is
--- a bit clearer from the perspective of grammars but somewhat messy with
--- respect to the captures. In the above parser it takes .1 second. Also,
--- in the later case only memory is the limit.
-
- local two = [[
-Test
-====
-* Test
-** Test
-* Test
-** Test
-* Test
-
-Test
-====
-
-> test
-> test
-> test
-
-test
-
-Test
-====
-
-> test
-> test
-> test
-
-test
- ]]
-
- local function test(str)
- local n = 1 -- 000
- local t = os.clock()
- local one = convert(str)
- -- print("runtime",1,#str,#one,os.clock()-t)
- str = string.rep(str,n)
- local t = os.clock()
- local two = convert(str)
- print(two)
- -- print("runtime",n,#str,#two,os.clock()-t)
- -- print(format("==============\n%s\n==============",one))
- end
-
- -- test(one)
- -- test(two)
- -- test(io.read("*all"))
-
-
-end
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/m-markdown.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/m-markdown.mkiv
deleted file mode 100644
index 29d41341e4e..00000000000
--- a/Master/texmf-dist/tex/context/modules/mkiv/m-markdown.mkiv
+++ /dev/null
@@ -1,88 +0,0 @@
-%D \module
-%D [ file=x-markdown,
-%D version=2011.07.19,
-%D title=\CONTEXT\ Modules,
-%D subtitle=Processing MarkDown,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\writestatus{loading}{ConTeXt Modules / MarkDown Renderer}
-
-%D This module deals with markdown which is a document encoding that
-%D some \CONTEXT\ like much. It reminds me of the kind of minimal coding
-%D we used before we ran into \TEX\ and were using a somewhat simple
-%D rendering (pagination, etc) of documents. As I'm no user myself, it
-%D is up to others to provide documentation and examples.
-
-\registerctxluafile{m-markdown}{}
-
-\unprotect
-
-% basic interface
-
-\definebuffer[markdown]
-
-\unexpanded\def\stopmarkdown
- {\ctxlua{moduledata.markdown.typesetbuffer("\thedefinedbuffer{markdown}")}}
-
-\unexpanded\def\processmarkdownfile#1% maybe [] or both
- {\ctxlua{moduledata.markdown.typesetfile("#1")}}
-
-\unexpanded\def\markdown#1% maybe [] or both
- {\ctxlua{moduledata.markdown.typesetstring(\!!bs#1\!!es)}}
-
-% commands
-
-\defineitemgroup
- [markdownitemize]
-
-\definetyping
- [markdowntyping]
-
-\definetype
- [markdowntype]
-
-\definetype
- [markdowninlinehtml]
-
-\definetyping
- [markdowndisplayhtml]
-
-\definedelimitedtext
- [markdownblockquote]
- [quotation]
-
-\definehighlight
- [markdownemphasis]
- [style=\em]
-
-\definehighlight
- [markdownstrong]
- [style=\bf]
-
-\definestructurelevels
- [markdown]
- [\v!chapter,
- \v!section,
- \v!subsection,
- \v!subsubsection,
- \v!subsubsubsection,
- \v!subsubsubsubsection]
-
-\unexpanded\def\markdownrule
- {\hairline\par}
-
-\protect
-
-\continueifinputfile{m-markdown.mkiv}
-
-\starttext
- \startmarkdown
- % some examples needed
- \stopmarkdown
-\stoptext
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/m-punk.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/m-punk.mkiv
index 29a6d8cca75..47f1a0177ff 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/m-punk.mkiv
+++ b/Master/texmf-dist/tex/context/modules/mkiv/m-punk.mkiv
@@ -63,8 +63,8 @@ local flusher = {
boundingbox = { 0, -d, w, h },
}
characters[n] = {
- commands = { -- todo: xforms, should happen in backend
- { "special", "pdf: " .. concat(l," ") },
+ commands = { -- todo: type 3 in lmtx
+ { "pdf", concat(l," ") },
}
}
else
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/m-scite.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/m-scite.mkiv
index 9182fa2ecb5..315cb3bed8b 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/m-scite.mkiv
+++ b/Master/texmf-dist/tex/context/modules/mkiv/m-scite.mkiv
@@ -289,6 +289,7 @@ visualizers.register("cld", visualizer)
visualizers.register("tex", visualizer)
visualizers.register("lua", visualizer)
visualizers.register("mps", visualizer)
+visualizers.register("mp", visualizer)
visualizers.register("pdf", visualizer)
visualizers.register("xml", visualizer)
visualizers.register("bibtex",visualizer)
@@ -300,13 +301,21 @@ visualizers.register("bnf", visualizer)
visualizers.register("sql", visualizer)
visualizers.register("json", visualizer)
+visualizers.register("sas", visualizer)
+
+function scite.register(name)
+ visualizers.register(name,visualizer)
+end
+
+moduledata.scite = scite
+
\stopluacode
\definetyping[TEX] [option=cld]
\definetyping[LUA] [option=lua]
\definetyping[BTX] [option=bibtex]
\definetyping[MPS] [option=mps]
-\definetyping[MP] [option=mps]
+\definetyping[MP] [option=mp]
\definetyping[PDF] [option=pdf]
\definetyping[CPP] [option=web]
\definetyping[WEB] [option=web]
@@ -316,6 +325,8 @@ visualizers.register("json", visualizer)
\definetyping[JSON][option=json] % To be tested in an upcoming manual.
\definetyping[NONE][option=none]
+\definetyping[SAS] [option=sas]
+
% This is a preliminary interface.
\unprotect
@@ -323,9 +334,12 @@ visualizers.register("json", visualizer)
\newdimen\scitespaceskip
\unexpanded\def\buff_scite_slxb#1%
- {\hangindent\numexpr#1+2\relax\scitespaceskip
+ {% we can have a side float
+ \advance\hangindent\numexpr#1+2\relax\scitespaceskip
\begstrut\hskip#1\scitespaceskip
- \hangafter 1\relax}
+ \ifcase\hangafter
+ \hangafter\plusone\relax
+ \fi}
\unexpanded\def\buff_scite_slxe
{\endstrut\par}
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/m-simulate.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/m-simulate.mkiv
new file mode 100644
index 00000000000..dc444890308
--- /dev/null
+++ b/Master/texmf-dist/tex/context/modules/mkiv/m-simulate.mkiv
@@ -0,0 +1,222 @@
+%D \module
+%D [ file=m-simulate,
+%D version=2016.02.18, % follow up on m-visual of 2000.01.10
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Visualization and Faking Redone,
+%D author={Hans Hagen \& Ton Otten},
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\definepalet
+ [fakerule]
+ [fr1c=darkred,
+ fr2c=darkgreen,
+ fr3c=darkblue,
+ fr4c=darkyellow,
+ fr5c=darkgray,
+ fr6c=darkred,
+ fr7c=darkgreen,
+ fr8c=darkblue,
+ fr9c=darkyellow,
+ fr0c=darkgray]
+
+\installcorenamespace {simulatewords}
+
+\installcommandhandler \??simulatewords {simulatewords} \??simulatewords
+
+\setupsimulatewords
+ [\c!n =\plusten,
+ \c!m =40,
+ \c!min =\plusone,
+ \c!max =\plusfive,
+ \c!minwidth=0.50\emwidth,
+ \c!maxwidth=1.25\emwidth,
+ \c!color =\empty,
+ \c!hyphen =\v!yes,
+ \c!distance=-.2\onebasepoint]
+
+\unexpanded\def\dosimulatedword
+ {\clf_fakeword
+ factor \exheight
+ name {\p_line}
+ min \scratchdimenone
+ max \scratchdimentwo
+ \relax}
+
+\def\simulatedhyphen
+ {\kern.2\points-\kern.2\points}
+
+\unexpanded\def\simulatewords
+ {\dodoubleempty\dosimulatewords}
+
+\unexpanded\def\dosimulatewords[#1][#2]%
+ {\dontleavehmode
+ \begingroup
+ \begstrut
+ \ifsecondargument
+ \edef\currentsimulatewords{#1}%
+ \setupcurrentsimulatewords[#2]%
+ \else
+ \doifassignmentelse{#1}
+ {\let\currentsimulatewords\empty
+ \setupcurrentsimulatewords[#1]}
+ {\edef\currentsimulatewords{#1}%
+ \setupcurrentsimulatewords[#2]}%
+ \fi
+ \scratchcounterone\simulatewordsparameter\c!n
+ \scratchcountertwo\simulatewordsparameter\c!m
+ \scratchmin \simulatewordsparameter\c!min
+ \scratchmax \simulatewordsparameter\c!max
+ \scratchdimenone \simulatewordsparameter\c!minwidth
+ \scratchdimentwo \simulatewordsparameter\c!maxwidth
+ \scratchdimenthree\simulatewordsparameter\c!distance
+ \edef\p_random{\simulatewordsparameter\c!random}%
+ \edef\p_color {\simulatewordsparameter\c!color}%
+ \edef\p_line {\simulatewordsparameter\c!line}%
+ \edef\p_hyphen{\simulatewordsparameter\c!hyphen}%
+ \edef\p_line {fake:\ifx\p_line\v!yes word\else rule\fi}%
+ \ifx\p_color\v!text
+ % no need
+ \else
+ \setuppalet[fakerule]%
+ \ifx\p_color\empty
+ \directcolored[fakerulecolor]%
+ \else\ifx\p_color\v!auto
+ % different
+ \else
+ \directcolored[\p_color]%
+ \fi\fi
+ \fi
+ \edef\p_hyphen
+ {\ifx\p_hyphen\v!yes
+ \discretionary{\bf\simulatedhyphen}{}{\kern\scratchdimenthree}%
+ \else\ifx\p_hyphen\v!margin
+ \discretionary{\hpack to \zeropoint{\bf\simulatedhyphen\hss}}{}{\kern\scratchdimenthree}%
+ \else\ifx\p_hyphen\v!none
+ \allowbreak\kern\scratchdimenthree
+ \else\ifx\p_hyphen\v!no
+ \allowbreak\kern\scratchdimenthree
+ \else\ifx\p_hyphen\v!both
+ \discretionary{\bf\simulatedhyphen}{\bf\simulatedhyphen}{\kern\scratchdimenthree}%
+ \else\ifx\p_hyphen\empty
+ \allowbreak\kern\scratchdimenthree
+ \else
+ \discretionary{\p_hyphen}{}{\kern\scratchdimenthree}%
+ \fi\fi\fi\fi\fi\fi}%
+ \edef\truncated##1##2\relax{##1}%
+ % trialtypesetting: tricky
+ \ifx\p_random\empty \else
+ \pushrandomseed
+ \setrandomseed\p_random
+ \fi
+ \dorecurse{\randomnumber\scratchcounterone\scratchcountertwo} {%
+ \let\dosimulatedhyphen\relax
+ \dorecurse{\randomnumber\scratchmin\scratchmax} {%
+ \dosimulatedhyphen
+ \begingroup
+ \ifx\p_color\v!auto
+ \directcolored[fr\truncated####1\relax c]%
+ \fi
+ \dosimulatedword
+ \endgroup
+ \let\dosimulatedhyphen\p_hyphen
+ }%
+ \relax
+ \space
+ }%
+ \ifx\p_random\empty \else
+ \poprandomseed
+ \fi
+ \removeunwantedspaces
+ \endstrut
+ \endgroup}
+
+%D For old times sake:
+
+\unexpanded\def\fakewords#1#2%
+ {\simulatewords[\c!n=#1,\c!m=#2,\c!min=1,\c!max=5,\c!hyphen=\v!none,\c!color=\v!text,\c!line=\v!yes]}
+
+%D Lines
+
+\unexpanded\def\fakeline
+ {\dosingleempty\dofakeline}
+
+\unexpanded\def\dofakeline[#1]%
+ {\par
+ \dontleavehmode
+ \hpack\bgroup
+ \scratchwidth \availablehsize
+ \scratchheight.8\strutht
+ \scratchdepth .8\strutdp
+ \iffirstargument
+ \letsimulatewordsparameter\c!width \scratchwidth
+ \letsimulatewordsparameter\c!height\scratchheight
+ \letsimulatewordsparameter\c!depth \scratchdepth
+ \getcurrentsimulatewords[#1]%
+ \scratchwidth \simulatewordsparameter\c!width
+ \scratchheight\simulatewordsparameter\c!height
+ \scratchdepth \simulatewordsparameter\c!depth
+ \fi
+ \edef\p_color{\simulatewordsparameter\c!color}%
+ \begingroup
+ \ifx\p_color\empty
+ \directcolored[fakerulecolor]%
+ \else\ifx\p_color\v!auto
+ % text color
+ \else
+ \directcolored[\p_color]%
+ \fi\fi
+ \vrule
+ \s!width \scratchwidth
+ \s!height\scratchheight
+ \s!depth \scratchdepth
+ \endgroup
+ \hskip-\scratchwidth
+ \directcolored[\s!white]%
+ \scratchdimen.5\onepoint
+ \vrule
+ \s!width \scratchwidth
+ \s!height\scratchdimen
+ \s!depth \scratchdimen
+ \egroup
+ \par}
+
+\protect
+
+\continueifinputfile{m-simulate.mkiv}
+
+\starttext
+
+ \simulatewords[n=50,m=100,min=1,max=5,color=auto,hyphen=margin,line=yes]\par
+ \simulatewords[n=50,m=100,min=3,max=9,color=auto,hyphen=margin,line=yes]\par
+ \simulatewords[n=50,m=100,min=3,max=9,color=auto,hyphen=margin,line=yes]\par
+ \page
+ \simulatewords[n=50,m=100,min=2,max=6,hyphen=yes]\par
+ \simulatewords[n=50,m=100,min=2,max=6,hyphen=both]\par
+ \simulatewords[n=50,m=100,min=2,max=6,hyphen=both]\par
+
+ \startcolor[red]
+ \simulatewords[n=50,m=100,min=2,max=6,color=text]\par
+ \stopcolor
+
+ \definesimulatewords[foo][n=50,m=100,min=2,max=6,color=text]
+
+ \startcolor[green]
+ \simulatewords[foo][color=darkyellow,random=1234]
+ \stopcolor
+
+ \page
+
+ \fakeline
+
+ \startnarrower
+ \fakeline
+ \stopnarrower
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/m-sql.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/m-sql.mkiv
index f1df2833a00..ed9dae99a4e 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/m-sql.mkiv
+++ b/Master/texmf-dist/tex/context/modules/mkiv/m-sql.mkiv
@@ -16,6 +16,11 @@
\registerctxluafile{util-tpl}{}
\registerctxluafile{util-sql}{}
+\ifcase\contextlmtxmode\else
+ \registerctxluafile{libs-imp-mysql}{}
+ \registerctxluafile{libs-imp-sqlite}{}
+\fi
+
\setupmodule
\doifsomething {\currentmoduleparameter{method}}{
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/m-zint.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/m-zint.mkiv
deleted file mode 100644
index 4957c846173..00000000000
--- a/Master/texmf-dist/tex/context/modules/mkiv/m-zint.mkiv
+++ /dev/null
@@ -1,112 +0,0 @@
-%D \module
-%D [ file=m-zint,
-%D version=2010.12.07,
-%D title=\CONTEXT\ Extra Modules,
-%D subtitle=Zint Barcode Generator,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-%D Using \type {zint} seems to be the easiest way to generate
-%D (PDF417) barcodes so therefore we now have this module. There
-%D are proper (also windows) binaries at:
-%D
-%D \starttyping
-%D http://www.zint.org.uk
-%D \stoptyping
-%D
-%D There is a bit more code than needed as we want to be able to
-%D feed names.
-
-\startluacode
-
-moduledata.zint = { }
-
-local format, lower, gsub = string.format, string.lower, string.gsub
-local patterns = lpeg.patterns
-
-local zint = "zint" -- '"c:/program files/zint/zint.exe"'
-local defaultcode = "PDF417"
-
-local whitespace = patterns.whitespace
-local spaces = whitespace^0
-local key = (spaces / "") * patterns.digit^0 * (patterns.colon * spaces / "")
-local value = (whitespace / "" + (1 - key))^1
-local pattern = lpeg.Cf(lpeg.Ct("") * (lpeg.Cg((lpeg.Cs(key) / tonumber) * (lpeg.Cs(value) / lower)) + patterns.anything)^0,rawset)
-
-local reverse
-
-local function cleancode(code)
- if not code or code == "" then
- code = defaultcode
- end
- return lower(gsub(code," ",""))
-end
-
-local function numberofcode(code)
- if not reverse then
- local types = os.resultof(format("%s --types",zint)) or ""
- local formats = lpeg.match(pattern,types)
- if not formats or not next(formats) then
- return code
- end
- reverse = table.swapped(formats) or { }
- end
- code = cleancode(code)
- return reverse[code] or code
-end
-
-function moduledata.zint.generate(code,data,suffix,options)
- if not data or data == "" then
- data = "unset"
- end
- local code = cleancode(code)
- local base = format("zint-%s-%s",code,md5.hex(data))
- local name = file.addsuffix(base,suffix or "eps")
- if not lfs.isfile(name) then
- local temp = file.addsuffix(base,"tmp")
- local code = numberofcode(code)
- logs.simple("using 'zint' to generate '%s'",base)
- io.savedata(temp,data)
- os.execute(format('%s --barcode=%s --output="%s" --input="%s" %s',zint,code,name,temp,options or ""))
- os.remove(temp)
- end
- return name
-end
-
-\stopluacode
-
-\unprotect
-
-\unexpanded\def\barcode[#1]% [alternative=,text=]
- {\bgroup
- \getdummyparameters
- [\c!alternative=,\c!text=,#1]%
- \externalfigure
- [\cldcontext{moduledata.zint.generate("\dummyparameter\c!alternative",\!!bs\dummyparameter\c!text\!!es)}]%
- [#1,\c!alternative=,\c!text=]%
- \egroup}
-
-\protect
-
-\continueifinputfile{m-zint.mkiv}
-
-\starttext
-
- \externalfigure[\cldcontext{moduledata.zint.generate("PDF417",[[Hans Hagen]])}]
- \blank
- \externalfigure[\cldcontext{moduledata.zint.generate("PDF417","Ton Otten")}]
- \blank
- \externalfigure[\cldcontext{moduledata.zint.generate("ISBN","9789490688011")}]
- \blank
- \barcode[text=Does It Work?,width=\textwidth]
- \blank
- \barcode[alternative=isbn,text=9789490688011,width=3cm]
-
-\stoptext
-
-
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/s-abbreviations-mixed.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/s-abbreviations-mixed.mkiv
index f7b2121d042..d5294fd56e2 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/s-abbreviations-mixed.mkiv
+++ b/Master/texmf-dist/tex/context/modules/mkiv/s-abbreviations-mixed.mkiv
@@ -1,5 +1,5 @@
%D \module
-%D [ file= s-abbreviations-mixed, % was: s-abr-04
+%D [ file=s-abbreviations-mixed, % was: s-abr-04
%D version=1996.01.01,
%D title=\CONTEXT\ Style File,
%D subtitle=General Abbreviations Mixed,
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/s-cgj.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/s-cgj.mkiv
index 2950a799d9b..3e7518777b9 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/s-cgj.mkiv
+++ b/Master/texmf-dist/tex/context/modules/mkiv/s-cgj.mkiv
@@ -1,258 +1,231 @@
-%D \module
-%D [file=s-cgj.mkiv,
-%D version=2018.09.28,
-%D title=Context group style file,
-%D subtitle=CG-journal base style,
-%D author={Adrian Egger, W. Egger, Taco Hoekwater},
-%D date=\currentdate,
-%D copyright={Context Group}]
-
-%D \type {\enablemode[draft]} has to come before loading the style. Maybe some
-%D day I'll make something more official and then some \type {everydraft} or so.
+%\module [
+% file=s-cgj.mkiv,
+% version=2012.12.05,
+% title=Context group style file,
+% subtitle=CG-journal base style,
+% author={Adrian Egger, W. Egger, Taco Hoekwater},
+% date=\currentdate,
+% copyright={Context Group}%
+%]
+
+\enablemode[cgjpagecolumns]
% Fixme and todo ...
-\startmodule[cgj]
+\definecolor[NoteColor] [g=1,r=.25,b=.25]
+\definecolor[WarnColor] [r=1,g=.25,b=.25]
-\definecolor[NoteColor][g=1,r=.25,b=.25]
-\definecolor[WarnColor][r=1,g=.25,b=.25]
+\def\todo#1%
+ {\startframedtext
+ [background=color,backgroundcolor=NoteColor]
+ {\bf TODO:}~~#1\par
+ \stopframedtext }
-\unexpanded\def\todo#1%
- {\startframedtext[background=color,backgroundcolor=NoteColor]
- \dontleavehmode\start\bf TODO:\stop~~#1\par
- \stopframedtext}
+\def\fixme#1%
+ {\startframedtext
+ [background=color,backgroundcolor=WarnColor]
+ {\bf FIXME:}~~#1\par
+ \stopframedtext }
-\unexpanded\def\fixme#1%
- {\startframedtext[background=color,backgroundcolor=WarnColor]
- \dontleavehmode\start\bf FIXME:\stop~~#1\par
- \stopframedtext }
+% There is a draft mode, which enables all frames
+% \enablemode[draft]
-%D Base set of variables. The actual values are set in the file
-%D CG-journal.
+\doifmodeelse
+ {draft}
+ {\def\OnOff{on}\showframe}
+ {\def\OnOff{off}}
+
+% Base set of variables
+% The actual values are set in the file CG-journal
\setvariables
[CG-Journal]
[Title={Journal},
RunningTitle={Journal},
SubTitle={From the base set of variables},
Version=1.0,
- NOFColumns=2]
+ NOFColumns=2,
+ ]
+\setupinteraction[
+ state=start,
+ color=,
+ contrastcolor=,
+ style=,
+ title=Journal,
+ author=context group,
+]
+\placebookmarks[title,chapter,subject,section][chapter]
+\setupinteractionscreen[option={doublesided,bookmark}]
\startmode[onecolumn,fullwidth]
- \setvariables
- [CG-Journal]
- [NOFColumns=1]
+\setvariables
+ [CG-Journal]
+ [NOFColumns=1]
\stopmode
-% Fonts setup.
-
+% Fonts setup
\usetypescriptfile[plex]
+%\usetypescriptfile[type-inconsolata]
\starttypescript [cgj]
- \definetypeface [cgj] [rm] [serif][ibmplex-light] [default]
- \definetypeface [cgj] [ss] [sans] [ibmplex-light] [default]
- \definetypeface [cgj] [mm] [math] [palatino] [default]
- \definetypeface [cgj] [tt] [mono] [ibmplex] [default][rscale=0.9]
+ \definetypeface [cgj] [rm] [serif][ibmplex] [default]
+ \definetypeface [cgj] [ss] [sans] [ibmplex] [default]
+ \definetypeface [cgj] [mm] [math] [palatino] [default]
+ \definetypeface [cgj] [tt] [mono] [ibmplex] [default] [rscale=0.9]
\stoptypescript
\starttypescript [cgj-light]
- \definetypeface [cgj-light] [rm] [serif][ibmplex-extralight] [default]
- \definetypeface [cgj-light] [ss] [sans] [ibmplex-extralight] [default]
- \definetypeface [cgj-light] [mm] [math] [palatino] [default]
- \definetypeface [cgj-light] [tt] [mono] [ibmplex-extralight] [default][rscale=0.9]
+ \definetypeface [cgj-light] [rm] [serif][ibmplex] [default]
+ \definetypeface [cgj-light] [ss] [sans] [ibmplex-light] [default]
+ \definetypeface [cgj-light] [mm] [math] [palatino] [default]
+ \definetypeface [cgj-light] [tt] [mono] [ibmplex] [default] [rscale=0.9]
\stoptypescript
-\starttypescript [cgj-extralight]
- \definetypeface [cgj-extralight] [rm] [serif][ibmplex-thin] [default]
- \definetypeface [cgj-extralight] [ss] [sans] [ibmplex-thin] [default]
- \definetypeface [cgj-extralight] [mm] [math] [palatino] [default]
- \definetypeface [cgj-extralight] [tt] [mono] [ibmplex-thin] [default][rscale=0.9]
-\stoptypescript
-
-\usebodyfont
- [cgj-light,cgj-extralight]
-
-\setupbodyfont
- [cgj,ss,10pt]
+\usebodyfont[cgj-light,ss,10pt]
+\setupbodyfont[cgj,ss,10pt]
-\definebodyfontenvironment[10pt][interlinespace=13pt]
+\definebodyfontenvironment[10pt][interlinespace=12pt]
\definebodyfontenvironment[12pt][interlinespace=16pt]
\definebodyfontenvironment[16pt][interlinespace=20pt]
-
-\setupinterlinespace
- [line=13pt]
-
+\setupinterlinespace[line=12pt]
\let\sl\it
-%D Path to the logos
-
-\setupexternalfigures
- [directory=./Logos,
- location={global,local,default}]
-
-%D Logos: black logo only.
+% Path to the logos
+\setupexternalfigures[directory=./Logos]
+% Logos
+% Black logo only
\useexternalfigure
[Logo]
[cg_corp_logo_loop_black_cmyk]
- [width=30mm,
- height=19mm]
-
-%D Black logo with text
-
+ [width=30mm,height=19mm]
+%Black logo with text
\useexternalfigure
[LogoText]
[cg_corp_logo_text_black_cmyk]
- [width=50mm,
- height=35.2mm]
-
-%D Colors
+ [width=50mm,height=35.2mm]
+% Colors
\definecolor[CGlightblue][c=1,m=.15,y=0,k=0]
-\definecolor[CGdeepblue] [c=1,m=.8,y=0,k=.3]
-\definecolor[CGgray] [c=0,m=0,y=0,k=.1]
-
-%D Article styles
+\definecolor[CGdeepblue][c=1,m=.8,y=0,k=.3]
+\definecolor[CGgray][c=0,m=0,y=0,k=.1]
+% Article styles
\definealternativestyle
[Articleheading]
[{\switchtobodyfont[16pt,ss]\bf}]
-
\definealternativestyle
[Articlesubheading]
[{\switchtobodyfont[16pt,ss]\tf}]
-
\definealternativestyle
[Authorname]
[{\switchtobodyfont[12pt,ss]\it}]
-
\definealternativestyle
[Sectionheading]
[{\switchtobodyfont[12pt,ss]\bf\setupinterlinespace[line=12pt]}]
-
\definealternativestyle
[Subsectionheading]
[{\switchtobodyfont[cgj-light,10pt,ss]\bf\setupinterlinespace[line=10pt]}]
-
\definealternativestyle
[IntroCopy]
[{\switchtobodyfont[12pt,ss]\tf}]
-
\definealternativestyle
[PagenumberStyle]
[{\switchtobodyfont[cgj-light,10pt,ss]\bf}]
-%D Headerstyles:Breadcrumbs
-
+% Headerstyles - Breadcrumbs
\definealternativestyle
[BreadcrumbMd]
- [{\switchtobodyfont[cgj-light,10pt,ss]\bf}]
-
+ [{\switchtobodyfont[10pt,ss]\bf}]
\definealternativestyle
[BreadcrumbRg]
- [{\switchtobodyfont[cgj,10pt,ss]}]
-
+ [{\switchtobodyfont[cgj-light,10pt,ss]\bf}]
\definealternativestyle
[BreadcrumbLt]
[{\switchtobodyfont[10pt,ss]\tf}]
-
\definealternativestyle
[BreadcrumbTh]
[{\switchtobodyfont[cgj-light,10pt,ss]\tf}]
-%D Captionstyles
-
+% Captionstyles
\definealternativestyle
[Captionheading]
[{\switchtobodyfont[8pt,ss]\bf\setupinterlinespace[line=8pt]}]
-
\definealternativestyle
[Captiontext]
[{\switchtobodyfont[8pt,ss]\tf\setupinterlinespace[line=8pt]}]
-%D Article signature
-
+% Article signature
\definealternativestyle
[Signaturestyle]
[{\switchtobodyfont[10pt,ss]\it}]
-%D Article footnotes
-
+% Article footnotes
\definealternativestyle
[Articlefootnotes]
[{\switchtobodyfont[8pt,ss]\tf}]
-%D Index and TOC styles
-
+% Index /TOC styles
+% It looks like the inheritance is gone.
+%\definealternativestyle
+% [IndexContents][Articleheading]
\definealternativestyle
[IndexContents]
[{\switchtobodyfont[16pt,ss]\bf\setupinterlinespace[line=18pt]}]
-
\definealternativestyle
[IndexArticleTitle]
[{\switchtobodyfont[12pt,ss]\tf\setupinterlinespace[line=20pt]}]
-
\definealternativestyle
[IndexNumber]
[{\switchtobodyfont[12pt,ss]\bf\setupinterlinespace[line=20pt]}]
-
\definealternativestyle
[IndexAuthor]
[{\switchtobodyfont[12pt,ss]\it\setupinterlinespace[line=20pt]}]
-%D Math: still missing.
-
-%D Verbatim
+% Math
+% --> still missing
+% Verbatim
\definealternativestyle
[DisplayMonospaced]
- [\tt]
-
+ [{\switchtobodyfont[10pt,tt]\setupinterlinespace[line=12pt]}]
\definealternativestyle
[DisplayMonospacedX]
- [{\switchtobodyfont[8pt,tt]}]
-
+ [{\switchtobodyfont[8pt,tt]\setupinterlinespace[line=11pt]}]
\definealternativestyle
[DisplayMonospacedS]
- [{\switchtobodyfont[9pt,tt]\setupinterlinespace[line=10pt]}]
-
-%D Blank adjustment
+ [{\switchtobodyfont[9pt,tt]\setupinterlinespace[line=12pt]}]
-\defineblank[CGblank] [6pt]
-\defineblank[BigCGblank] [24pt]
+% \blank adjustment
+\defineblank[CGblank][6pt]
+\defineblank[BigCGblank][24pt]
\defineblank[MediumCGblank][12pt]
-%D Paper definition
+% Paper definition
+\definepapersize[Journal][width=210mm,height=266mm]
+\setuppapersize[Journal][Journal]
-\definepapersize
- [Journal]
- [width=210mm,
- height=266mm]
-
-\setuppapersize
- [Journal]
- [Journal]
-
-%D General layout
+% General layout
\definelayout
[General]
- [topspace=18mm,
+ [topspace=20mm,
backspace=28mm,
header=5mm,
- headerdistance=7mm,
- footer=5mm,
+ headerdistance=5mm,
+ footer=3mm,
footerdistance=5mm,
width=157mm,
height=224mm,
- marking=on]
+ marking=on,
+ ]
\definelayout
[Content]
- [topspace=18mm,
+ [topspace=20mm,
backspace=28mm,
header=5mm,
- headerdistance=7mm,
+ headerdistance=5mm,
footer=0mm,
footerdistance=0mm,
width=157mm,
@@ -260,52 +233,62 @@
margindistance=4mm,
rightmargin=21mm,
leftmargin=21mm,
- marking=on]
+ marking=on,
+ ]
\definelayout
[Imprint]
- [topspace=18mm,
+ [topspace=20mm,
backspace=28mm,
header=5mm,
- headerdistance=7mm,
- footer=5mm,
+ headerdistance=5mm,
+ footer=3mm,
footerdistance=5mm,
width=107mm,
height=224mm,
margindistance=4mm,
rightmargin=45.3mm,
leftmargin=21mm,
- marking=on]
+ marking=on,
+ ]
\definelayout
[SingleColumn]
- [topspace=18mm,
+ [topspace=20mm,
backspace=55mm,
header=5mm,
- headerdistance=7mm,
- footer=5mm,
+ headerdistance=5mm,
+ footer=3mm,
footerdistance=5mm,
width=130mm,
height=224mm,
margindistance=4mm,
leftmargin=48mm,
rightmargin=21mm,
- marking=on]
-
-%D Pagenumbering: Pagenumber is set in the footer
-
-\setuppagenumbering
- [location=,
- alternative=doublesided]
-
-%D Head-definitions
+ marking=on,
+ ]
+
+% Pagenumbering: Pagenumber is set in the footer
+\setuppagenumbering[location=,alternative=doublesided]
+
+% Head-definitions
+% The distances according to the style-guide
+% H1 = Article title
+% H2 = Section title (1. Bla bla)
+% H3 = Subsection title (1.1 Bla bla)
+% H4 = Subsubsection title (1.1.1 Bla bla)
+%
+% Between abstract and body: 2 lines 10/12pt --> 24 pt: BigCGblank
+% Between H2 and bodycopy/H3: 1 line 6/6pt --> 6 pt: CGblank
+% Between H3 and bodycopy/H4: 1 line 6/6pt --> 6 pt: CGblank
+% End H2 paragraph: 2 lines 10/12pt --> 24 pt: BigCGblank
+% End H3 paragraph: 1 line 6/6pt --> 6 pt: CGblank
\setuphead
[title]
[style=Articleheading,
after={\blank[BigCGblank]},
page=yes]
-
\setuphead
[part]
[placehead=no,
@@ -314,9 +297,8 @@
page=no,
numbercommand=,
expansion=yes]
-
\setuphead
- [section]
+ [section,subject]
[style=Sectionheading,
before={\blank[BigCGblank]},
after={\blank[CGblank]},
@@ -324,8 +306,8 @@
distance=4pt,
align={flushleft,nothyphenated},
resetnumber=yes,
- continue=yes]
-
+ continue=yes,
+ ]
\setuphead
[subsection]
[style=Subsectionheading,
@@ -335,49 +317,41 @@
distance=4pt,
align={flushleft,nothyphenated},
resetnumber=yes,
- continue=yes]
-
-\setuphead
- [subject]
- [style=Sectionheading,
- before={\blank[BigCGblank]},
- after=]
-
+ continue=yes,
+ ]
+%\setuphead
+% [subject]
+% [style=Sectionheading,before={\blank[BigCGblank]},after=]
\setuphead
[subsubject]
[style=Subsectionheading,
before={\blank[CGblank]},
after={\blank[CGblank]},
- sectionstopper=]
+ sectionstopper=,
+ ]
+% Columns
+% The setup of the columns is done at the moment columns are started (see end of file)
-%D A special head for the footnote section in multicolumn mode excuse the low-level
-%D rule, I wanted it to look like the start of footnotes in single column mode. (TH)
+% Index/TOC page setups
+\unprotect
-\definehead
- [footnotesubject]
- [subject]
+ \def\listboxproperties {\strc_lists_get_reference_attribute}
+ \def\listrenderingsetup {\the\t_lists_every_renderingtext}
+ \def\listrenderingsynchronize{\the\t_lists_every_renderingsynchronize}
-\setuphead
- [footnotesubject]
- [style=Sectionheading,
- before={\kern -13pt},
- after={\smash{\lower 13pt\hbox{\vrule width 2.5cm height 1pt depth 0pt}}}]
+\protect
-
-%D The setup of the columns is done at the moment columns are started (see end
-%D of file)
-
-%D Index/TOC page setups
+% now you can say:
\definelistalternative
- [CGJ:Index]
- [renderingsetup=CGJ:Indexheading]
-
+ [CGJ:Index]
+ [renderingsetup=CGJ:Indexheading]
\definelistalternative
- [CGJ:Index:Chapter]
- [renderingsetup=CGJ:Indexheading:Chapter]
+ [CGJ:Index:Chapter]
+ [renderingsetup=CGJ:Indexheading:Chapter]
-\startsetups[CGJ:Indexheading:Chapter]
+
+ \startsetups[CGJ:Indexheading:Chapter]
\listparameter{before}
\vbox \listboxproperties{all} {
\forgetall
@@ -388,14 +362,20 @@
\useliststyleandcolor{numberstyle}{numbercolor}
\currentlistentrypagenumber
\egroup}
+ % \bgroup
+ % \useliststyleandcolor{numberstyle}{numbercolor}
+ % \currentlistsymbol
+ % \egroup
+ % .\space
\bgroup
\useliststyleandcolor{textstyle}{textcolor}
\smash{\currentlistentrytitle}%
\egroup
+ % \par
}
\par
\listparameter{after}
-\stopsetups
+ \stopsetups
\startsetups[CGJ:Indexheading]
\listparameter{before}
@@ -405,9 +385,15 @@
\listrenderingsynchronize
\hbox to 15mm{
\bgroup
+ %\useliststyleandcolor{pagestyle}{pagecolor}
\useliststyleandcolor{numberstyle}{numbercolor}
\currentlistentrypagenumber
\egroup}
+ % \bgroup
+ % \useliststyleandcolor{numberstyle}{numbercolor}
+ % \currentlistsymbol
+ % \egroup
+ % .\space
\bgroup
\useliststyleandcolor{textstyle}{textcolor}
\currentlistentrytitle
@@ -419,45 +405,71 @@
\stopsetups
\setuplist
- [part]
- [before={\blank[CGblank]},
- after=,
- style=IndexContents,
- numberstyle=\IndexNumber,
- textstyle=\IndexArticleTitle,
- prefix=no,
- alternative=CGJ:Index:Chapter]
-
-%D Captions
-
+ [part]
+ [before={\blank[CGblank]},
+ after=,
+ style=IndexContents,
+ numberstyle=\IndexNumber,
+ textstyle=\IndexArticleTitle,
+ prefix=no,
+ alternative=CGJ:Index:Chapter]
+
+%\setuplist
+% [section]
+% [before={\blank[CGblank]},
+% after={},
+% style=IndexHeaderB,
+% % numberstyle=\bf,
+% % textstyle=\bfa,
+% prefix=no,
+% alternative=CGJ:Index]
+%
+%\setuplist
+% [subsection]
+% [before={},
+% after={},
+% style=IndexHeaderC,
+% % numberstyle=\bf,
+% % textstyle=\bfa,
+% prefix=no,
+% alternative=CGJ:Index]
+
+% Floats
+
+% \setupfloat
+% [figure]
+% []
+
+% Captions
\setupcaptions
[suffix={.},
+ width=max,
headstyle=\Captionheading,
style=\Captiontext,
- distance=6pt]
+ distance=2pt
+ ]
\setupcaption[figure][way=bypart]
\setupcaption[table] [way=bypart]
-%D Datacollection: article parameters (other fields and defaults)
-
-\unexpanded\def\CGJBibData[#1]%
+% Datacollection: article parameters (other fields and defaults)
+\def\CGJBibData[#1]%
{\getparameters
- [CGJ]
- [SubTitle=,
- RunningAuthor=,
- RunningTitle=Example,
- Email=,
- Address=,
- Page=1,
- Title={My Article},
- Author={Example Author},
- Period=,
- Number=,
- Year=,
- TocAuthor=,
- TocTitle=,
- #1]%
+ [CGJ]
+ [SubTitle=,
+ RunningAuthor=,
+ RunningTitle=Example,
+ Email=,
+ Address=,
+ Page=1,
+ Title={My Article},
+ Author={Example Author},
+ Period=,
+ Number=,
+ Year=,
+ TocAuthor=,
+ TocTitle=,
+ #1]%
\doifnothing
{\CGJRunningTitle}
{\let\CGJRunningTitle\CGJTitle}%
@@ -470,116 +482,130 @@
\doifnothing
{\CGJTocTitle}
{\let\CGJTocTitle\CGJTitle}%
- \setvariables
- [CGJToc]
- [Author=\CGJTocAuthor,
- Title=\CGJTocTitle]% for TOC
+ \setvariables[CGJToc][Author=\CGJTocAuthor,
+ Title=\CGJTocTitle]% for TOC
}
-\unexpanded\def\dostartArticle[#1]
- {\CGJBibData[#1]
- \doifelse
- {\getvariable{CG-Journal}{NOFColumns}}
- {1}
- {\doifmodeelse{fullwidth}
- {\setuplayout[General]}
- {\setuplayout[SingleColumn]}}
- {\setupnotes[location=none]
- \setuplayout[General]}%
- \bgroup
- {\switchtobodyfont[16pt]\Articleheading\CGJTitle\par}
- {\doifsomething{\CGJSubTitle}
- {\switchtobodyfont[16pt]\Articlesubheading\CGJSubTitle\par}}
- {\doifsomething{\CGJAuthor}
- {\switchtobodyfont[12pt]\Authorname \CGJAuthor}\par}
- \part
- {\getvariable{CGJToc}{Title}%
- \doifsomething{\getvariable{CGJToc}{Author}}{ \emdash\ }%
- \IndexAuthor\getvariable{CGJToc}{Author}}
- \godown[13pt]%
- \egroup
- \par
- \hyphenpenalty1000\relax}
-
-\unexpanded\def\startArticle
- {\dosingleempty\dostartArticle}
-
-\def\signArticle
- {}
-
-%D In multicolumn mode, footnotes come are at the end of the article:
-
-\startsetups article:after
- \startfootnotesubject[title=]
- \placefootnotes
- \stopfootnotesubject
-\stopsetups
-
-\unexpanded\def\stopArticle
- {\doifelse{\getvariable{CG-Journal}{NOFColumns}}{1}
- {\par
- \signArticle}
- {\setups{article:after}
- \par
- \signArticle
- \stoppagecolumns}
- \page}
-
-\unexpanded\def\startAbstract
- {\bgroup
- \switchtobodyfont[12pt]
- \IntroCopy}
-
-\unexpanded\def\stopAbstract
- {\par
- \egroup
- \finishAbstract}
-
-\unexpanded\def\finishAbstract
- {\doifelse {\getvariable{CG-Journal}{NOFColumns}} {1}
- {\blank[BigCGblank]}
- {\vbox{\blank[BigCGblank]}%
- \par
- \startpagecolumns[balance=yes,distance=12pt,page=no,n=\getvariable{CG-Journal}{NOFColumns}]
- \setupitemgroup[itemize][packed]
- \setuplayout[grid=yes]} % grid mode only in columns
+\def\dostartArticle[#1]{%
+ \CGJBibData[#1]
+ % \pageno=\CGJPage
+ % \setupuserpagenumber[start=\CGJPage]
+ \doifelse
+ {\getvariable{CG-Journal}{NOFColumns}}
+ {1}
+ {\doifmodeelse{fullwidth}
+ {\setuplayout[General]}
+ {\setuplayout[SingleColumn]}}
+ {\setuplayout
+ [General]}%
+ \doifmode{cgjpagecolumns}
+ {\definepagecolumns [cgjpagecolumns][n=\getvariable{CG-Journal}{NOFColumns},distance=12pt,page=no]}
+ \bgroup
+ {\switchtobodyfont[16pt]\Articleheading\CGJTitle\par}
+ {\doifsomething{\CGJSubTitle}
+ {\switchtobodyfont[16pt]\Articlesubheading\CGJSubTitle\par}}
+ {\doifsomething
+ {\CGJAuthor}
+ {\switchtobodyfont[12pt]\Authorname \CGJAuthor}\par}
+ \part{\getvariable{CGJToc}{Title}%
+ \doifsomething{\getvariable{CGJToc}{Author}}{ \emdash\ }%
+ \IndexAuthor\getvariable{CGJToc}{Author}}
+ \godown[16pt]
+ \egroup
+ \hyphenpenalty1000}
+
+\def\startArticle{\dosingleempty\dostartArticle}
+
+\def\signArticle{}
+
+\def\CGJRunningTitle {}
+\def\CGJRunningAuthor {}
+\unprotect
+\def\mystoppagecolumns%
+ {\page \endgroup \page_otr_command_set_vsize \page_otr_command_set_hsize \page \endgroup}
+\protect
+
+\def\stopArticle{%
+ \par\signArticle
+ \doifmodeelse{cgjcolumnsets}
+ {\stopcolumnset \page}
+ {\doifmodeelse{cgjpagecolumns}
+ {\mystoppagecolumns}
+ {\doifmodeelse{cgjmixedcolumns}
+ {\stopmixedcolumns \page}
+ {\stopcolumns \page}%
+ }%
+ }%
}
-
-\unexpanded\def\noAbstract
- {\kern -24pt
- \finishAbstract}
-
-%D Headertexts
-
+\def\startAbstract{%
+ \bgroup
+ \switchtobodyfont[12pt]
+ \IntroCopy}
+
+
+\def\finishAbstract{%
+ \blank[BigCGblank]%
+ \doif
+ {\getvariable{CG-Journal}{NOFColumns}}
+ {>1}
+ {\setupcolumns
+ [n=\getvariable{CG-Journal}{NOFColumns},
+ distance=4mm,
+ balance=yes,
+ ]
+ }
+ \doifmodeelse{cgjcolumnsets}
+ {\definecolumnset[cgjcolumnsets][n=\getvariable{CG-Journal}{NOFColumns},balance=yes]%
+ \startcolumnset[cgjcolumnsets]}
+ {\doifmodeelse{cgjpagecolumns}
+ {\par\ifnum \getvariable{CG-Journal}{NOFColumns}>1 \hbox{}\par\fi\startpagecolumns[cgjpagecolumns]}
+ {\doifmodeelse{cgjmixedcolumns}
+ {\definemixedcolumns[cgjmixedcolumns][n=\getvariable{CG-Journal}{NOFColumns},balance=yes,blank={line,fixed}]%
+ \startmixedcolumns[cgjmixedcolumns]}
+ {\startcolumns[n=\getvariable{CG-Journal}{NOFColumns}]}%
+ }%
+ }%
+}
+
+\def\stopAbstract{%
+ \par
+ \egroup
+ \finishAbstract}
+
+\def\noAbstract{\kern -24pt \finishAbstract}
+
+
+% Headertexts
\startsetups[Header:texts]
- \setupheadertexts
- [] [{{\BreadcrumbLt\CGJRunningTitle}{\BreadcrumbTh\doifsomething{\CGJRunningAuthor}{\ > }\CGJRunningAuthor}}] %odd
- [{\BreadcrumbMd contextgroup}{\BreadcrumbRg\ > \getvariable{CG-Journal}{RunningTitle}}] [] %even
+ \setupheadertexts
+ []
+ [{{\BreadcrumbLt\CGJRunningTitle}{\BreadcrumbTh\doifsomething{\CGJRunningAuthor}{\ > }\CGJRunningAuthor}}] %odd
+ [{\BreadcrumbMd contextgroup}{\BreadcrumbRg\ > \getvariable{CG-Journal}{RunningTitle}}] %even
+ []
\stopsetups
-%D Footertexts
+% Footertexts
\startsetups[Footer:texts]
\setupfootertexts
- [] [\PagenumberStyle\pagenumber]
- [\PagenumberStyle\pagenumber] []
+ []
+ [\PagenumberStyle\pagenumber]
+ [\PagenumberStyle\pagenumber]
+ []
\stopsetups
-%D Setup tolerance, stretch.
-
-\setuptolerance
- [tolerant,stretch]
+% Setup tolerance, stretch
+\setuptolerance[tolerant,stretch]
-%D Setting up footnotes.
+% Setting up footnotes
\setupnotation
[footnote]
[way=bypart,
- rule=on]
-
-%D Adjustments to the container containing the footnotes.
+ rule=on]
+% Adjustments to the container containing the footnotes
\setupnote
[footnote]
[frame=off,
@@ -588,62 +614,64 @@
background=,
rulecolor=black, %% the line above the inserts
rulethickness=1pt,
- next={ },
- split=verystrict,
- scope=page,
style=Articlefootnotes]
-\doifmodeelse {draft} {\setupnote[footnote][frame=on]}
-
-% Setup typing.
-\setupnarrower
- [middle=3mm,
- left=5mm]
+% Setup typing
+\setupnarrower[middle=3mm]
+\setupnarrower[left=5mm]
\definetextbackground
- [verbatim]
+ [typingbg]
[frame=off,
+ location=paragraph,
background=color,
backgroundcolor=CGgray,
- leftoffset=2mm,rightoffset=2mm,
- topoffset=2mm,bottomoffset=2mm,
- location=paragraph,
+ width=\hsize,
+ leftoffset=2mm, % doesnt work in the current beta
align=flushleft]
-
-\doifmodeelse {draft} {\definetextbackground[verbatim][frame=on]}
-
-\definetextbackground
- [verbatimitem]
- [verbatim]
-
-\setuptextbackground
- [verbatimitem]
- [before=,
- after=,
- width=\the\dimexpr\hsize-10.5mm\relax]
-
+
\startsetups typing:before
- \blank[MediumCGblank]
- \starttextbackground[verbatim]
+ \blank[MediumCGblank]
+ \starttextbackground[typingbg][style=DisplayMonospacedS]
+ \hfuzz=7.02pt % don't care if it bleeds in to the frame a little
+ \setupnarrower[left=2mm] % because leftoffset does not work in the current beta
+ \startnarrower[left]
\stopsetups
\startsetups typing:before:small
- \blank[MediumCGblank]
- \starttextbackground[verbatim]
+ \blank[MediumCGblank]
+ \starttextbackground[typingbg][style=DisplayMonospacedX]
+ \hfuzz=6.3pt % don't care if it bleeds in to the frame a little
+ \setupnarrower[left=2mm]
+ \startnarrower[left]
\stopsetups
\startsetups typing:after
- \stoptextbackground
- \blank[MediumCGblank]
+ \stopnarrower\par
+ \stoptextbackground
+ \blank[MediumCGblank]
\stopsetups
\startsetups typing:before:item
- \starttextbackground[verbatimitem]
+% \blank[3pt]
+ \startframedtext
+ [frame=off,
+ before=,
+ after=,
+ background=color,
+ backgroundcolor=CGgray,
+ width=\the\dimexpr\hsize-10.5mm\relax,
+ offset=3mm,
+ align=flushleft,
+ style=DisplayMonospacedS,
+ ]
+ \hfuzz=7.02pt % don't care if it bleeds in to the frame a little
\stopsetups
\startsetups typing:after:item
- \stoptextbackground
+ \stopframedtext
+% \blank[3pt]
\stopsetups
\setuptyping
@@ -652,24 +680,15 @@
before=\setups{typing:before},
after=\setups{typing:after}]
-\setuptype
- [style=DisplayMonospaced]
-
-%D When verbatim becomes too large:
-
-\definetyping
- [smalltyping]
-
+\definetyping[smalltyping]
\setuptyping
[smalltyping]
[style=DisplayMonospacedX,
before=\setups{typing:before:small},
after=\setups{typing:after}]
-\unexpanded\def\smalltypefile{\typefile[smalltyping][]}
-
-%D Bullet lists.
+% Bullet lists
\setupitemgroup
[itemize]
[each]
@@ -679,7 +698,15 @@
align=right,
before={\blank[MediumCGblank]\startnarrower[left]},
after={\stopnarrower\blank[MediumCGblank]},
- inbetween={\blank[CGblank]}]
+ inbetween={\blank[CGblank]},
+ ]
+
+\def\Href#1{\underbar{\hyphenatedurl{#1}}}
+
+\setupformulas[align=flushleft,margin=5mm]
+
+\setupquotation[before={\blank[CGblank]\switchtobodyfont[8pt]\setupinterlinespace[line=12pt]},
+ after={\par\blank[CGblank]}]
\definedescription
[description]
@@ -688,27 +715,8 @@
before={\blank},
after={\blank}]
-\setupformula
- [align=flushleft,
- margin=5mm]
-
-\setupquotation
- [before={\blank[CGblank]\switchtobodyfont[10pt]},
- after={\blank[CGblank]}]
-
-\setupwhitespace
- [medium]
-
-\usemodule[abr-02,abr-03,abr-04]
-
-\unexpanded\def\Href#1{\underbar{\hyphenatedurl{#1}}}
\unexpanded\def\CG {\ConTeXt\ group}
-\setnewconstant\kindofpagetextareas\plusone % partial page. HH: low level, no high level switch (yet)
-
-%D There is a draft mode, which enables all frames:
-
-\doifmode {draft} {\showframe}
-
-\stopmodule
+\usemodule[abr-02]
+\endinput
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-features.lua b/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-features.lua
index 6c676ce2d24..34268c1716a 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-features.lua
+++ b/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-features.lua
@@ -11,6 +11,7 @@ moduledata.fonts.features = moduledata.fonts.features or { }
-- for the moment only otf
+local rawget = rawget
local insert, remove, sortedhash = table.insert, table.remove, table.sortedhash
local v_yes = interfaces.variables.yes
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-system.lua b/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-system.lua
index dc0f2e6a3f8..8e55184e04a 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-system.lua
+++ b/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-system.lua
@@ -123,7 +123,7 @@ function moduledata.fonts.system.showinstalledglyphnames(specification)
local names = table.setmetatableindex("table")
local f_u = formatters["%04X"]
for i=1,#paths do
- local list = dir.glob(paths[i].."/fonts/o*/**.tmc")
+ local list = dir.glob(paths[i].."/fonts/o*/**." .. utilities.lua.suffixes.tmc)
for i=1,#list do
files[list[i]] = true
end
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-tables.lua b/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-tables.lua
index 33cbc924c36..d9d7205dec1 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-tables.lua
+++ b/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-tables.lua
@@ -9,6 +9,8 @@ if not modules then modules = { } end modules ['s-fonts-tables'] = {
moduledata.fonts = moduledata.fonts or { }
moduledata.fonts.tables = moduledata.fonts.tables or { }
+local rawget, type = rawget, type
+
local setmetatableindex = table.setmetatableindex
local sortedhash = table.sortedhash
local sortedkeys = table.sortedkeys
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.mkiv
index 2cd612c7577..5336f602472 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.mkiv
+++ b/Master/texmf-dist/tex/context/modules/mkiv/s-fonts-variable.mkiv
@@ -49,6 +49,8 @@
% \enabletrackers[modules.fonts.variables.glyphs]
% \enabletrackers[modules.fonts.variables.kerns]
+\nopdfcompression
+
\starttext
\startbuffer[zycon]
@@ -81,9 +83,9 @@
% \showfontvariations
% [font=file:DecoVar-VF.ttf]
- % \showfontvariations
- % [font=file:VotoSerifGX.ttf,
- % max=15]
+% \showfontvariations
+% [font=file:VotoSerifGX.ttf,
+% max=15]
% \showfontvariations
% [font=file:Selawik-Variable.ttf]
@@ -91,23 +93,23 @@
% \showfontvariations
% [font=file:LibreFranklinGX-Romans.ttf]
- % \showfontvariations
- % [font=file:Zycon.ttf,
- % sample={\getbuffer[zycon]}]
+% \showfontvariations
+% [font=file:Zycon.ttf,
+% sample={\getbuffer[zycon]}]
- % \showfontvariations
- % [font=file:kairossansvariable.ttf]
+% \showfontvariations
+% [font=file:kairossansvariable.ttf]
- % \showfontvariations
- % [font=file:sourcecode-regular.otf]
+% \showfontvariations
+% [font=file:sourcecode-regular.otf]
- % \showfontvariations
- % [font=file:AmstelvarAlpha-VF.ttf]
+% \showfontvariations
+% [font=file:AmstelvarAlpha-VF.ttf]
- % \showfontvariations
- % [font=file:bahnschrift.ttf]
+ \showfontvariations
+ [font=file:bahnschrift.ttf]
- % \showfontvariations
- % [font=file:sitka.ttc]
+% \showfontvariations
+% [font=file:sitka.ttc]
\stoptext
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/s-inf-01.mkvi b/Master/texmf-dist/tex/context/modules/mkiv/s-inf-01.mkvi
index 2fda9997a69..67fc45d46fc 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/s-inf-01.mkvi
+++ b/Master/texmf-dist/tex/context/modules/mkiv/s-inf-01.mkvi
@@ -26,8 +26,13 @@
\startluacode
local format, gsub, find, match = string.format, string.gsub, string.find, string.match
+ local setmetatableindex = table.setmetatableindex
- local list, size, comp, used, nope = { }, { }, { }, { mkii = { }, mkiv = { }, mkvi = { } }, { 0, 0, 0, 0, 0 }
+ local list = { }
+ local size = { }
+ local comp = { }
+ local used = setmetatableindex("table")
+ local nope = setmetatableindex("number")
local omit = {
"char%-def%.lua",
@@ -39,7 +44,7 @@
"colo%-pan.tex", ".*test.*"
}
local types = {
- "tex", "mkii", "mkiv", "mkvi", "lua", -- "mpiv"
+ "tex", "mkii", "mkiv", "mkvi", "mkxl", "mklx", "lua", -- "mpiv"
}
local patterns = {
"^([a-z][a-z][a-z][a-z])%-[a-z0-9%-]+%.[a-z]+",
@@ -64,10 +69,16 @@
end
end
if okay then
- local lm, sm, cm = list[category], size[category], comp[category]
+ local lm = list[category]
+ local sm = size[category]
+ local cm = comp[category]
if not lm then
- lm, sm, cm = { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }
- list[category], size[category], comp[category] = lm, sm, cm
+ lm = setmetatableindex("number")
+ sm = setmetatableindex("number")
+ cm = setmetatableindex("number")
+ list[category] = lm
+ size[category] = sm
+ comp[category] = cm
end
lm[n] = lm[n] + 1
local done = true
@@ -90,7 +101,7 @@
logs.report("error","unknown file %a",name)
data = ""
end
- sm[n+5] = sm[n+5] + #data
+ sm[n+#types] = sm[n+#types] + #data
if done then
sm[n] = sm[n] + #data
else
@@ -121,7 +132,7 @@
end
local max, what = 0, (what == "size" and size) or list
for k, v in table.sortedpairs(what) do
- for i=1,5 do if v[i] > max then max = v[i] end end
+ for i=1,7 do if v[i] > max then max = v[i] end end
end
return max, what, function(n) return (max == 0 and 0) or (n == 0 and 0) or n/max end
end
@@ -130,14 +141,15 @@
function document.context_state_1(what)
local max, what, norm = prepare(what)
- context.starttabulate { "|Tl|T|T|T|T|T|" }
+ context.starttabulate { "|Tl|T|T|T|T|T|T|T|" }
context.NC()
context(category)
context.NC()
for i=1,#types do
local n, m = 0, 0
for k, v in next, list do
- local nn, mm = what[k][i], what[k][i+5]
+ local nn = what[k][i]
+ local mm = what[k][i+#types]
n = n + nn
m = m + (mm or nn)
end
@@ -150,18 +162,14 @@
for k, v in table.sortedpairs(what) do
local c = what == size and comp[k] or nope
context.NC()
- context("\\bf %s~%s~~%s~~%s",
+ context("\\bf %s~%s~~%s~~%s~~%s~~%s",
(used.mkii[k] and "ii") or "~~",
(used.mkiv[k] and "iv") or "~~",
(used.mkvi[k] and "vi") or "~~",
+ (used.mkiv[k] and "xl") or "~~",
+ (used.mkvi[k] and "lx") or "~~",
k
)
- -- context("%s\\enspace %s\\quad %s\\quad %s",
- -- (used.mkii[k] and "ii") or "\\quad",
- -- (used.mkiv[k] and "iv") or "\\quad",
- -- (used.mkvi[k] and "vi") or "\\quad",
- -- k
- -- )
context.NC()
for i=1,#types do
context.Bar(types[i],v[i],c[i],f_norm(norm(v[i])))
@@ -190,19 +198,21 @@
\definecolor[bar:mkii][middleblue]
\definecolor[bar:mkiv][middlered]
\definecolor[bar:mkvi][middleyellow]
+\definecolor[bar:mkxl][middlemagenta]
+\definecolor[bar:mklx][middlecyan]
\definecolor[bar:lua] [middlegray]
\newcount\UpCounter
\starttexdefinition Top #what#fraction#total#bigones
- \hbox to 5em{\hss#total}%
+ \hbox to 7em{\hss#total}%
\enspace
\hbox {{\bf#what}\ifnum#total=#bigones\else~#bigones\rlap{~+}\fi\hss}%
\stoptexdefinition
\starttexdefinition Bar #color#size#nobigones#fraction
\ifcase#size\else
- \hbox to 5em{\hss\ifcase#nobigones\else\llap{-~}\fi#size}%
+ \hbox to 7em{\hss\ifcase#nobigones\else\llap{-~}\fi#size}%
\enspace
\blackrule[color=bar:#color,width=#fraction\dimexpr 20em\relax,height=.8\strutht]%
\fi
@@ -214,7 +224,7 @@
\stoptexdefinition
\starttexdefinition StopUp
- \par\nointerlineskip\blackrule[height=1pt,width=5em,depth=0pt,color=darkgray]
+ \par\nointerlineskip\blackrule[height=1pt,width=7em,depth=0pt,color=darkgray]
\par\tttf\strut\UpName\par
\egroup
\ifnum\UpCounter=17
@@ -259,9 +269,9 @@
{The size of (core) files used in ConTeXt (- : large data files excluded; + : large data files included; comment and spaces removed)}
{1}{size}
\Show
- {The relative number of files used in ConTeXt (tex, mkii, mkiv, mkvi, lua).}
+ {The relative number of files used in ConTeXt (tex, mkii, mkiv, mkvi, mkxl, mklx, lua).}
{2}{number}
\Show
- {The relative size of files used in ConTeXt (tex, mkii, mkiv, mkvi, lua).}
+ {The relative size of files used in ConTeXt (tex, mkii, mkiv, mkvi, mkxl, mklx, lua).}
{2}{size}
\stoptext
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/s-inf-03.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/s-inf-03.mkiv
index d2acb734158..8bd7b36993c 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/s-inf-03.mkiv
+++ b/Master/texmf-dist/tex/context/modules/mkiv/s-inf-03.mkiv
@@ -58,11 +58,18 @@
\quad\pagenumber\quad
\rlap{\goto{\hbox to 5cm{next\hss}}[nextpage]}]
+\ifcase\contextlmtxmode
+ \setupinteraction
+ [title={ConTeXt MkIV}]
+\else
+ \setupinteraction
+ [title={ConTeXt LMTX}]
+\fi
+
\setupinteraction
[state=start,
style=,
color=,
- title={ConTeXt MkIV},
subtitle={Lua modules and functions},
author={Hans Hagen - automatically generated},
contrastcolor=]
@@ -128,7 +135,7 @@ end
\stopnarrower
\vfill
\vfill
- \hskip10mm\scale[width=\dimexpr\paperwidth-20mm\relax]{\ttbf\white\ConTeXt\ MkIV}
+ \hskip10mm\scale[width=\dimexpr\paperwidth-20mm\relax]{\ttbf\white\ConTeXt\ \ifcase\contextlmtxmode MkIV\else LMTX\fi}
\par
% \hskip10mm\scale[width=\dimexpr\paperwidth-20mm\relax]{\white \strut Lua infrastructure \emdash\ \currentdate}
\vfill
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/s-magazine-basic.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/s-magazine-basic.mkiv
index 267bf50d898..d45fe6f601a 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/s-magazine-basic.mkiv
+++ b/Master/texmf-dist/tex/context/modules/mkiv/s-magazine-basic.mkiv
@@ -24,6 +24,8 @@
%D will produce unwanted side effects. So, if some feature or settings is needed,
%D let me know.
+%D By now (2019) it's an old style that needs an overhaul ...
+
% These are reserved for PRAGMA-ADE, don't use them yourself!
% \setupdocument[main=Tricky]
@@ -67,21 +69,21 @@
\startreusableMPgraphic{middlepaper}
fill OverlayBox
withshademethod "circular"
- withshadecenter center (0.5,0.5)
+ withshadecenter center (0,0.5)
withshadecolors ("InnerColor","OuterColor") ;
\stopreusableMPgraphic
-\startreusableMPgraphic{rightpaper}
+\startreusableMPgraphic{leftpaper}
fill OverlayBox
withshademethod "circular"
- withshadecenter center (0,0.5)
+ withshadecenter center (-0.5,0.5)
withshadecolors ("InnerColor","OuterColor") ;
\stopreusableMPgraphic
-\startreusableMPgraphic{leftpaper}
+\startreusableMPgraphic{rightpaper}
fill OverlayBox
withshademethod "circular"
- withshadecenter center (1,0.5)
+ withshadecenter center (0.5,0.5)
withshadecolors ("InnerColor","OuterColor") ;
\stopreusableMPgraphic
@@ -472,7 +474,7 @@
before={\setups[titlepage,title]},
after={\setups[cleanup,listing,lastpage]}]
-\continueifinputfile {s-mag-01.mkiv}
+\continueifinputfile {s-magazine-basic.mkiv}
\startbuffer[abstract]
This is the zero issue of a semi periodical. The associated style can be used
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/s-maps.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/s-maps.mkiv
index 28e88af987f..af646b2e1ee 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/s-maps.mkiv
+++ b/Master/texmf-dist/tex/context/modules/mkiv/s-maps.mkiv
@@ -7,30 +7,38 @@
%D date=\currentdate,
%D copyright=NTG/MAPS]
-% This module implements the MAPS style for use with the Context
-% macro package. The original MAPS layout was designed and
-% implemented in LaTeX by Taco Hoekwater and Siep Kroonenberg.
-
-% - three layouts:
-% 1. two columns
-% 2. one column, with wide outer margins (option onecolumn)
-% 3. one column, with wide left margin (option asym)
-% - font sizes deviate from TeX's usual geometric progression
-% - use of sans-serif for headers and various details
-% - option realfonts uses Linux Libertine, Euler Math and Inconsolata.
-% This is used for final typesetting.
-% The default font setup, intended for authors, uses Computer
-% Modern Math instead of Euler Math (which is still in beta),
-% and LM Mono instead of Inconsolata.
-
-% A mode nosubsub defines only two levels of sectioning. If you
-% don't need more and use the two-column layout, then this option
-% will probably improve the looks of your paper.
+%D This module implements the MAPS style for use with the Context macro package. The
+%D original MAPS layout was designed and implemented in LaTeX by Taco Hoekwater and
+%D Siep Kroonenberg.
+%D
+%D \startitemize
+%D \startitem
+%D four layouts:
+%D \startitemize
+%D \startitem two columns \stopitem
+%D \startitem one column, with wide outer margins (option onecolumn) \stopitem
+%D \startitem one column, with wide left margin (option asym) \stopitem
+%D \startitem one column, with wide right margin (option single) \stopitem
+%D \stopitemize
+%D \stopitem
+%D \startitem
+%D font sizes deviate from TeX's usual geometric progression
+%D \stopitem
+%D \startitem
+%D use of sans-serif for headers and various details
+%D \stopitem
+%D \stopitemize
+%D
+%D A mode nosubsub defines only two levels of sectioning. If you don't need more and
+%D use the two-column layout, then this option will probably improve the looks of
+%D your paper.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newif\ifMapsInColumns
-\doifmode{asym}{\enablemode[onecolumn]} % implies onecolumn
+
+\doifmode {asym} {\enablemode[onecolumn]} % implies onecolumn
+\doifmode {single} {\enablemode[asym,onecolumn]} % implies onecolumn
\doifnotmode{onecolumn}{\MapsInColumnstrue}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -98,31 +106,31 @@
%%% font families
-\starttypescript [maps]
-\definetypeface [maps] [rm] [serif] [modern] [default] [rscale=0.95]
-\definetypeface [maps] [mm] [math] [modern] [latin-modern]
-\definetypeface [maps] [tt] [mono] [modern] [default] [rscale=0.90]
-\definetypeface [maps] [ss] [sans] [modern] [default] [rscale=0.95]
+\definefontfeature[mapsdef][default][mode=node,onum=yes,lnum=no]
+
+\starttypescript [serif] [libertine] [name]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [file:LinLibertine_R.otf] [features=mapsdef]
+ \definefontsynonym [SerifItalic] [file:LinLibertine_RI.otf] [features=mapsdef]
+ \definefontsynonym [SerifSlanted] [file:LinLibertine_RI.otf] [features=mapsdef]
+ \definefontsynonym [SerifBold] [file:LinLibertine_RB.otf] [features=mapsdef]
+ \definefontsynonym [SerifBoldItalic] [file:LinLibertine_RBI.otf] [features=mapsdef]
+ \definefontsynonym [SerifBoldSlanted] [file:LinLibertine_RBI.otf] [features=mapsdef]
+ \definefontsynonym [SerifCaps] [file:LinLibertine_R.otf] [features=smallcaps]
\stoptypescript
-\startmode[realfonts]
-\usetypescriptfile[type-libertine]
-
-\usetypescriptfile[type-inconsolata]
-
\starttypescript [maps]
-\definetypeface [maps] [rm] [serif] [libertine] [default]
-\definetypeface [maps] [mm] [math] [euler] [default] [rscale=0.9]
-\definetypeface [maps] [tt] [mono] [inconsolata] [default] [rscale=0.92]
-\definetypeface [maps] [ss] [sans] [modern] [default] [rscale=0.95]
+ \definetypeface [maps] [rm] [serif] [libertine] [default]
+ \definetypeface [maps] [mm] [math] [euler] [default] [rscale=0.9]
+ \definetypeface [maps] [tt] [mono] [modern] [default]
+ \definetypeface [maps] [ss] [sans] [modern] [default] [rscale=0.95]
\stoptypescript
-\stopmode
\setupbodyfont[maps,10pt,rm]
-% activate protruding
\setupinterlinespace[line=11pt]
+% activate protruding
\setupfontsynonym[handling=pure]
\setupalign[hanging]
@@ -142,7 +150,7 @@
\setuppapersize
[maps][maps]
-\setuplayout[
+\setuplayout
[topspace=40pt,
height=688pt,
header=33pt,
@@ -166,154 +174,137 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% sectioning
-\setupheads[sectionnumber=no, align=right]
-
-\def\hfonti{\ssbfa}
-\def\hfontii{\ssbf}
-\def\hfontiii{\rm\it}
+\setupheads
+ [number=no,
+ align=flushleft]
+
+\unexpanded\def\hfonti {\ssbfa}
+\unexpanded\def\hfontii {\ssbf}
+\unexpanded\def\hfontiii {\rm\bi}
+\unexpanded\def\runin #1{#1.}
+
+\setuphead [section,subject]
+ [style=\hfonti,
+ before={\blank[line]},
+ after={\blank[halfline]}]
+\setuphead [subsection,subsubject]
+ [style=\hfontii,
+ before={\blank[halfline]},
+ after={}]
+\setuphead [subsubsection,subsubsubject]
+ [style=\hfontiii,
+ deeptextcommand=\runin,
+ distance=6pt,
+ alternative=text,
+ before={\blank[halfline]}]
+
+\startmode[nosubsub]
+\setuphead [section,subject]
+ [style=\hfontii,
+ before={\blank[line]},
+ after={}]
+\setuphead [subsection,subsubject]
+ [style=\hfontiii,
+ deeptextcommand=\runin,
+ alternative=text,
+ distance=6pt,
+ before={\blank[halfline]}]
+\stopmode
-\doifelsemode{nosubsub}{%
-\setuphead [section][%
- style=\hfontii,
- before={\blank[line]},
- after={}%
-]
-\setuphead [subsection][%
- style=\hfontiii,
- alternative=text,
- distance=6pt,
- before={\blank[halfline]}%
-]}{%
-\setuphead [section][%
- style=\hfonti,
- before={\blank[line]},
- after={\blank[halfline]}%
-]
-\setuphead [subsection][%
- style=\hfontii,
- before={\blank[halfline]},
- after={}%
-]
-\setuphead [subsubsection][%
- style=\hfontiii,
- distance=6pt,
- alternative=text,
- before={\blank[halfline]}%
-]}
-
-\doifelsemode{nosubsub}{%
-\setuphead [subject][%
- style=\hfontii,
- before={\blank[halfline]},
- after={}%
-]
-\setuphead [subsubject][%
- style=\hfontiii,
- alternative=text,
- before={\blank[halfline]}%
-]}{%
-\setuphead [subject][%
- style=\hfonti,
- before={\blank},
- after={\blank[halfline]}%
-]
-\setuphead [subsubject][%
- style=\hfontii,
- before={\blank[halfline]},
- after={}%
-]
-\setuphead [subsubsubject][%
- style=\hfontiii,
- alternative=text,
- before={\blank[halfline]}%
-]}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% floats
-\setupfloats [location=center, before={\ss}]
-\setupcaptions [headstyle={\ssbf},style={\ssx},
- suffix=.,distance=6pt,
+\setupfloats
+ [location=left,
+ before={\ss}]
+
+\setupcaptions
+ [align=flushleft,
+ headstyle={\ssbf},
+ style={\ssx},
+ suffix=.,
+ distance=6pt,
inbetween={\blank[halfline]}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% various document elements
-\definesymbol [1][\getnamedglyphdirect{file:stmary10}{boxempty}]
+\setupitemize
+ [1]
+ [symbol=8]
-\setupitemize[1][packed]
-
-\setupitemize [each][%
- indentnext=no,
- align=right,
- width=1em,
- distance=0pt%
-]
+\setupitemize
+ [each]
+ [before={\blank[line]},
+ after={\blank[line]},
+ inbetween=,
+ indentnext=no,
+ width=12pt,
+ distance=0pt]
% an outer form of itemize that does not indent
% the paragraph.
\definecomplexorsimpleempty\startouteritemize
-\def\complexstartouteritemize[#1]{\begingroup
- \startitemize[width=1sp,#1]
- \let\doitem\item
- \def\item{\doitem[]\hbox{}\kern12pt\rightskip=0pt}%
-}
-
-\def\stopouteritemize{\stopitemize\endgroup}
-
-\setupenumerations [indentnext=no]
+\def\complexstartouteritemize[#1]%
+ {\begingroup
+ \setupitemize[width=0pt,inbetween={\blank},before={\blank},after={\blank}]
+ \startitemize[#1]
+ \let\doitem\item
+ \def\item{\doitem[]\hbox{}\kern12pt\rightskip=0pt}}
-\setupdescriptions [indentnext=no]
+\def\stopouteritemize
+ {\stopitemize\endgroup}
-\unexpanded\def\smalltyping{%
- \switchtobodyfont[tt]%
- \parindent=0pt
-}
+\definedescription
+ [description]
+ [alternative=hanging,width=fit]
% typing:
% - prettyverbatim is NOT the default
-% - smaller size
-\unexpanded\def
- \XeTeX{X\lower.5ex\hbox{\kern-.1em\mirror{E}}\kern-.1667em\TeX}
+\setuptyping
+ [style={\switchtobodyfont[small,tt]},
+ option=none,
+ indentnext=no]
-\setuptyping [%
- style={\smalltyping},
- option=none,
- indentnext=no%
-]
-
-\def\footnum#1{#1.}
+% normally we have endnotes, but in the title there
+% could be a \thanks command. Since the new column mode
+% does not deal with footnotes all that well, we more
+% or less have to roll our own.
\setupnotation
- [footnote]
- [alternative=serried,
- before=,
- after=,
- location=none,
- width=\textwidth,
- before={\blank},
- numbercommand=,
- command=\footnum,
- distance=0.5em]
+ [footnote]
+ [margin=0cm,
+ before={},
+ after={},
+ way=bypage,
+ number=no]
+
+\setupnote
+ [footnote]
+ [location=page,
+ spacebefore=,
+ before=,
+ after=]
+
+\unexpanded\def\thanks#1{\xdef\MapsThanks{#1}*}
\setuptabulate
- [before=\blank,
- inner=\ss,
- after=\blank]
+ [before=\blank,
+ inner=\ss,
+ after=\blank]
\def\startIntroEntry#1%
- {\startlinecorrection
- \bgroup
+ {\bgroup
\setupalign[right]
\setuptolerance[verytolerant]
\setupindenting[no]
\noindent
\switchtobodyfont[9pt]%
\setuplocalinterlinespace[line=10pt]%
- %\hyphenpenalty10000
\parfillskip 0pt plus 1fill
\rightskip6pt plus 1fill
\ss
@@ -321,15 +312,15 @@
\ignorespaces }
\def\stopIntroEntry
- {\par\egroup \stoplinecorrection
+ {\par\egroup
\blank[line] }
-\def\defineIntroEntry[#1][#2][#3]%
+\def\defineIntroEntry[#1][#2]
{\setvalue{start#1}{\startIntroEntry{#2}}%
- \setvalue {stop#1}{\stopIntroEntry#3}}
+ \setvalue {stop#1}{\stopIntroEntry}}
-\defineIntroEntry[Keywords][Keywords][]
-\defineIntroEntry[Abstract][Abstract][]
+\defineIntroEntry[Keywords][Keywords]
+\defineIntroEntry[Abstract][Abstract]
% article parameters (other fields and defaults)
\def\MapsBibData[#1]%
@@ -345,82 +336,141 @@
Period=,
Number=,
Year=,
+ SkipHeader=,
+ SkipFooter=,
+ Abstract=,
+ Keywords=,
+ Thanks=,
#1]%
- \doifnothing{\MapsPeriod}{%
- \ifnum \normalmonth<6 \gdef\MapsPeriod{VOORJAAR}\else \gdef\MapsPeriod{NAJAAR}\fi}
- \doifelseinstring{oorjaar}{\MapsPeriod}{\gdef\MapsPeriod{VOORJAAR}}{}%
- \doifelseinstring{pring}{\MapsPeriod}{\gdef\MapsPeriod{VOORJAAR}}{}%
- \doifelseinstring{ajaar}{\MapsPeriod}{\gdef\MapsPeriod{NAJAAR}}{}%
- \doifelseinstring{utumn}{\MapsPeriod}{\gdef\MapsPeriod{NAJAAR}}{}%
+ \doifnothing{\MapsPeriod}%
+ {\ifnum \normalmonth<6 \gdef\MapsPeriod{VOORJAAR}\else \gdef\MapsPeriod{NAJAAR}\fi}
+ \doifinstringelse{oorjaar}{\MapsPeriod}{\gdef\MapsPeriod{VOORJAAR}}{}%
+ \doifinstringelse{pring}{\MapsPeriod}{\gdef\MapsPeriod{VOORJAAR}}{}%
+ \doifinstringelse{ajaar}{\MapsPeriod}{\gdef\MapsPeriod{NAJAAR}}{}%
+ \doifinstringelse{utumn}{\MapsPeriod}{\gdef\MapsPeriod{NAJAAR}}{}%
\doifnothing{\MapsYear}{\gdef\MapsYear{\the\year}}%
- \doifnothing{\MapsNumber}{%
- \ifnum \normalmonth<6
+ \doifnothing{\MapsNumber}%
+ {\ifnum \normalmonth<6
\xdef\MapsNumber{\the\numexpr (\the\year-1990)*2\relax}%
- \else
+ \else
\xdef\MapsNumber{\the\numexpr (\the\year-1990)*2+1\relax}%
- \fi }%
+ \fi }%
\doifnothing\MapsRunningAuthor
- {\glet\MapsRunningAuthor\MapsAuthor}%
+ {\global\let\MapsRunningAuthor\MapsAuthor}%
\doifnothing\MapsRunningTitle
- {\glet\MapsRunningTitle\MapsTitle}}%
-
-\def\dostartArticle[#1]{%
- \MapsBibData[#1]
- \pageno=\MapsPage
- \setupuserpagenumber[start=\MapsPage]
- \startbaselinecorrection
- \bgroup
- \hsize = 457pt
- \let\\\crlf
- \blank[35pt,force]
- \switchtobodyfont[24pt]
- \setupalign[right]
- {\noindent\bf\MapsTitle\par}
- \ifx\MapsSubTitle\empty
- \blank[30pt]
- \else
- \bgroup
- \blank[12pt]
- \switchtobodyfont[18pt]\noindent \it
- \advance \rightskip 0pt plus 2em
- \MapsSubTitle\par
- \egroup
- \blank[30pt]
- \fi
- \egroup
- \setupalign[width]
- \switchtobodyfont[rm,10pt]
- \stopbaselinecorrection
- \ifMapsInColumns
- \startcolumns\hyphenpenalty1000
- \else
- \clubpenalty10000
- \widowpenalty10000
- \fi
-}
-
-\def\startArticle{\dosingleempty\dostartArticle}
-
-\def\signArticle{%
- \blank\let\\\crlf
- \noindent\switchtobodyfont[ss,9pt]%
- \MapsAuthor
- \doifsomething{\MapsAddress}{\\\MapsAddress}%
- \doifsomething{\MapsEmail}{\\\MapsEmail}%
- \switchtobodyfont[10pt]%
- \def\signArticle{}%
-}
-
-\def\stopArticle{%
- \par\signArticle
- \ifMapsInColumns \stopcolumns \fi
- \page
-}
+ {\global\let\MapsRunningTitle\MapsTitle}}%
+
+\def\doarticleheader
+ {\startbaselinecorrection
+ \bgroup
+ \hsize = 457pt
+ \let\\\crlf
+ \blank[35pt,force]
+ \switchtobodyfont[24pt]
+ \startalign[flushleft,verytolerant,extremestretch]
+ {\noindent\bf\language=-1\MapsTitle\par}
+ \ifx\MapsSubTitle\empty
+ \blank[line]
+ \else
+ \bgroup
+ \blank[12pt]
+ \switchtobodyfont[14pt]\noindent \it
+ \advance \rightskip 0pt plus 2em
+ \MapsSubTitle\par
+ \egroup
+ \blank[line]
+ \fi
+ \stopalign
+ \egroup
+ \setupalign[width]
+ \switchtobodyfont[rm,10pt]
+ \stopbaselinecorrection }
+
+\newif\ifintroentries
+
+\def\dostartArticle[#1]%
+ {\MapsBibData[#1]
+ \pageno=\MapsPage
+ \setnumber[realpage][\MapsPage]
+ \setnumber[userpage][\MapsPage]
+ \doifnothing{\MapsSkipHeader}{\doarticleheader}%
+ \ifMapsInColumns
+ \startcolumns\hyphenpenalty1000
+ \else
+ \clubpenalty10000
+ \widowpenalty10000
+ \fi
+ \introentriesfalse
+ \startbaselinecorrection
+ \doifsomething{\MapsAbstract}{\startAbstract \MapsAbstract \stopAbstract \introentriestrue }
+ \doifsomething{\MapsKeywords}{\startKeywords \MapsKeywords \stopKeywords \introentriestrue }
+ \stopbaselinecorrection
+ \ifintroentries
+ \blank[2*line]
+ \fi
+ \doifsomething\MapsThanks
+ {\expanded{\footnote[thanks]{*\quad\strut\MapsThanks}}%
+ \kern -22pt }% need to unskip because of the silent \footnote
+ \let\footnote\endnote }
+
+\def\startArticle
+ {\dosingleempty\dostartArticle}
+
+\def\signArticle
+ {\doifnothing
+ {\MapsSkipFooter}
+ {\blank[line]\let\\\crlf
+ \noindent\switchtobodyfont[ss,9pt]%
+ \MapsAuthor
+ \doifsomething{\MapsAddress}{\\\MapsAddress}%
+ \doifsomething{\MapsEmail}{\\\MapsEmail}}%
+ \switchtobodyfont[10pt]%
+ \def\signArticle{}}
+
+% endnotes aka footnotes
+
+\def\footnum#1{#1.}
+
+\setupnotation
+ [endnote]
+ [alternative=serried,
+ style={\switchtobodyfont[9pt]},
+ margin=0cm,
+ width=12pt,
+ before=,
+ after=,
+ margin=0cm,
+ numbercommand=\footnum]
+
+\setupnote
+ [endnote]
+ [location=none]
+
+\def\endnotessubjectname{Footnotes}
+\def\endnotesubjectname{Footnote}
+
+\def\stopArticle
+ {\ifcase\rawcountervalue[endnote]\relax
+ \or
+ \startsubject[title=\endnotesubjectname] % single
+ \placenotes[endnote]
+ \stopsubject
+ \else
+ \startsubject[title=\endnotessubjectname]
+ \placenotes[endnote]
+ \stopsubject
+ \fi
+ \par\signArticle
+ \ifMapsInColumns \stopcolumns \fi
+ \page }
\installpagebreakmethod{last}{}
%%% `logos' %%%%%%%%%%%%%%%%%%%%%%%%%%
+\unexpanded\def\XeTeX
+ {X\lower.5ex\hbox{\kern-.1em\mirror{E}}\kern-.1667em\TeX}
+
\unexpanded\def\LaTeX % requested by erik frambach
{{\setbox\scratchbox\hbox{L}%
\scratchdimen\ht\scratchbox
@@ -429,66 +479,304 @@
\raise\scratchdimen\hbox{\lower\ht\scratchbox\copy\scratchbox}%
\kern-.2\wd\scratchbox\TeX}}
+\unexpanded\def\CONTEXT {Con{\TeX}t}
+\unexpanded\def\ConTeXt {Con{\TeX}t}
+\unexpanded\def\METAFONT {Metafont}
+\unexpanded\def\METAPOST {MetaPost}
+\unexpanded\def\POSTSCRIPT{PostScript}
-\def\CONTEXT{Con{\TeX}t}
-\def\ConTeXt{Con{\TeX}t}
-\def\METAFONT{Metafont}
-\def\METAPOST{MetaPost}
-\def\POSTSCRIPT{PostScript}
+\unexpanded\def\acro#1{{\switchtobodyfont[9pt]#1}}
-\def\acro#1{{\switchtobodyfont[9pt]#1}}
+\definefontfeature[smallcapitals] [smcp=yes]
+\def\sc{\addff{smallcapitals}}
+\def\NTG{{\sc ntg}}
+\def\TUG{{\sc tug}}
%%%%%%%%%%%
+% headers and footers and other mode-related things
+\setuplayout
+ [width=457pt]
-\doifelsemode{onecolumn}{%
- \setuplayout[width=340pt]
- \doifelsemode{asym}{% one col, asymmetric
- \setuplayout[backspace=187.3pt]%
- \setuptyping [widetyping][oddmargin=-117pt]
- \setuppagenumbering [alternative={singlesided,doublesided}]
- \setupheadertexts
- [{\hbox{}\hskip-117pt\TiHead}]
- [{\cap{\MapsPeriod\ \MapsYear}\quad\bf \pagenumber\hskip-30pt\hbox{}}]
- [{\hbox{}\hskip-147pt{\bf \pagenumber}\quad \cap {maps\ \MapsNumber}}]
- [\AuHead]
- \setupfootertexts
- }{% one col, symmetric
- \setuplayout[backspace=70.3pt]
- \setuppagenumbering [alternative=doublesided]
- \setuptyping[blank=halfline]
- \setupheadertexts
+\setupcolumns
+ [n=2,tolerance=verytolerant,distance=11pt]
+
+\setuplayout
+ [backspace=70.3pt,grid=yes]
+
+\setuppagenumbering
+ [alternative=doublesided]
+
+\setuptyping
+ [blank=halfline]
+
+\setupheadertexts
+ [\TiHead]
+ [{\cap{\MapsPeriod\ \MapsYear}\quad\bf \pagenumber\hskip-30pt\hbox{}}]
+ [{\hbox{}\hskip-30pt{\bf \pagenumber}\quad \cap {maps\ \MapsNumber}}]
+ [\AuHead]
+
+\setupfootertexts % empty
+
+\startmode[onecolumn]
+
+\setuplayout[width=340pt]
+
+\startmode[asym]% one col, asymmetric
+ \setuppagenumbering
+ [alternative={singlesided,doublesided}]
+ \doifmodeelse
+ {single}
+ {\setupheadertexts
[\TiHead]
[{\cap{\MapsPeriod\ \MapsYear}\quad\bf \pagenumber\hskip-147pt\hbox{}}]
+ [{\hbox{}\hskip-30pt{\bf \pagenumber}\quad \cap {maps\ \MapsNumber}}]
+ [\AuHead\hskip-110pt]}
+ {\setuptyping
+ [widetyping]
+ [oddmargin=-117pt]
+ \setuplayout[backspace=187.3pt]
+ \setupheadertexts
+ [{\hbox{}\hskip-117pt\TiHead}]
+ [{\cap{\MapsPeriod\ \MapsYear}\quad\bf \pagenumber\hskip-30pt\hbox{}}]
[{\hbox{}\hskip-147pt{\bf \pagenumber}\quad \cap {maps\ \MapsNumber}}]
- [\AuHead]
- \setupfootertexts
-}}{% two col
- \setuplayout[width=457pt]
- \setupcolumns[n=2,tolerance=verytolerant,distance=11pt]
- \setuplayout[backspace=70.3pt,grid=yes]
- \setuppagenumbering [alternative=doublesided]
- \setuptyping[blank=halfline]
- \setupheadertexts
+ [\AuHead]}
+\stopmode
+
+\startnotmode[asym]
+ \setupheadertexts
[\TiHead]
- [{\cap{\MapsPeriod\ \MapsYear}\quad\bf \pagenumber\hskip-30pt\hbox{}}]
- [{\hbox{}\hskip-30pt{\bf \pagenumber}\quad \cap {maps\ \MapsNumber}}]
+ [{\cap{\MapsPeriod\ \MapsYear}\quad\bf \pagenumber\hskip-147pt\hbox{}}]
+ [{\hbox{}\hskip-147pt{\bf \pagenumber}\quad \cap {maps\ \MapsNumber}}]
[\AuHead]
- \setupfootertexts
-}
+\stopnotmode
+
+\stopmode % onecolumn
+
\def\fulltextwidth{457pt}
-\def\startdescription
- {\blank
- \bgroup
- \def\sym##1{\par\noindent\hbox{\bf\kern -16pt ##1}\hskip 12pt}
- \startnarrower[left]
- }
-\def\stopdescription
- {\par \stopnarrower \egroup \blank \noindentation }
+\def\startfullwidth
+ {\par\begingroup
+ \doifmode
+ {onecolumn}
+ {\hsize=\fulltextwidth
+ \doifmodeelse
+ {asym}
+ {\doifmodeelse{single}{\textwidth=\fulltextwidth }{\leftskip-117pt }}
+ {\ifodd\pageno \else \leftskip-117pt \hsize=340pt \fi }}}
+
+\def\stopfullwidth
+ {\par\endgroup}
+
+% Taco: \setupalign[tolerant,fixed} where fixed is french spacing
+
+\setupalign
+ [tolerant,fixed]
+
+\continueifinputfile{s-maps.mkiv}
+
+% \enablemode[nosubsub] % if you need at most two levels of sectioning
+% \enablemode[onecolumn] % for symmetric single-column layout
+% \enablemode[asym] % for asymmetric single-column layout, left aligned
+% \enablemode[single] % for asymmetric single-column layout, right aligned
+
+% \usemodule[map-20]
+
+\usebtxdataset[samplmaps.bib]
+\usebtxdefinitions[apa]
+
+\starttext
+\startArticle[% Use {} if argument contains comma's!
+% titel
+ Title={An example document for the Maps module, demonstrating its
+ various features\thanks{Thanks should be short}
+ },
+ RunningTitle=An example document,
+ SubTitle=with an optional subtitle,
+% auteur
+ Author=Anton Ulrich Thor,
+ Email=a.u.thor@uu.am.dw,
+ Address=Institute of Indefinite Studies\\
+ Unseen University\\
+ Ankh Morpork,
+% tijdstip
+ Period=voorjaar,
+ Number=36,
+ Year=2008,
+ Page=1,
+% Taal
+ Language=english,
+% Intro
+ Abstract={%
+This is a sample input file for the Maps module version 2.0,
+which mimics the associated \LaTeX\ class file.
+It demonstrates various standard and non-standard features.
+\crlf
+Use of the abstract- and keywords environments is highly appreciated.},
+ Keywords={Maps, \ConTeXt\ module, sample}]
+
+\startsection[title=Ordinary Text]
+
+The ends of words and sentences are marked
+ by spaces. It doesn't matter how many
+spaces you type; one is as good as 100. The
+end of a line counts as a space.
+
+One or more blank lines denote the end
+of a paragraph.
+
+Footnotes\footnote{This is an example of an endnote.} are converted to
+endnotes\endnote{This is another one, with more text to it, to see how
+it will wrap to the next line.}. These will automatically be typeset at
+the end of the article. The title of the notes section is defined by the
+command \type{\endnotessubjectname} (for multiple notes) or
+\type{\endnotesubjectname} (in case of a single note).
+
+\stopsection
+
+\startsection[title=Fonts]
+The Maps uses Linux Libertine for main text,
+with Latin Modern Sans and Mono, and Euler for math. The Linux Libertine
+OpenType fonts are part of \TeX\ Live. If they are not found,
+Latin Modern Serif fallbacks will be used.
+
+\stopsection
+
+\startsection[title=Sectioning]
+
+The maps module defaults to unnumbered sections. If you really must,
+you can restore section numbering with \emph{e.g.}
+\type{\setupheads[number=yes]}
+
+\startsubsection[title=Subsection]
+This is a second-level section header. You can go down one more
+level:
+
+% \penalty0
+
+\startsubsubsection[title=A subsubsection]
+This is supposed to be a run-in header, so make sure you start the
+text right after \type{\startsubsubsection}.
+
+\stopsubsubsection
+
+\startsubsubsection[title=Tip]
+If you only need one or two levels of header, then you can get a
+better layout with the \type{nosubsub} document option.
+The Maps editors may decide to turn on this option for you.
+\stopsubsubsection
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title=Lists]
+
+Another frequently-displayed structure is a list.
+The following is an example of an \emph{itemized}
+list.
+\startitemize
+ \item This is the first item of an itemized list.
+ Each item in the list is marked with a \quote{tick}.
+ \item This is the second item of the list. It
+ contains another list nested inside it. The inner
+ list is an \emph{enumerated} list.
+
+ \startitemize[n]
+ \startitem This is the first item of an enumerated
+ list that is nested within the itemized list.
+ \stopitem
+ \item This is the second item of the inner list.
+ \ConTeXt\ allows you to nest lists deeper than
+ you really should.
+ \stopitem
+ \stopitemize
+
+ \noindent
+ This is the rest of the second item of the outer
+ list. It is no more interesting than any other
+ part of the item.
+ \startitem This is the third item of the list. \stopitem
+\stopitemize
+
+In a two-column layout, protracted indenting doesn't look very
+good. Therefore, the Maps module provides an \type{outeritemize}
+environment:
+
+\startouteritemize
+\item This is the first item of a non-indented itemized list,
+ produced with the \mono{outeritemize} environment.
+\item This is the second item.
+\stopouteritemize
+
+Now an enumerated version:
+
+\startouteritemize[n]
+\item This is the first item of a non-indented enumerated list,
+ produced with the \mono{outeritemize} environment.
+\item This is the second item.
+\stopouteritemize
+
+There is also a definition for description lists:
+
+\startdescription{cow}
+A milk-producing animal that grazes grass and has multiple stomachs
+\stopdescription
+\startdescription{kangoroo}
+An Australian hopping animal
+\stopdescription
+
+\stopsection
+
+\startsection[title=Wide typesetting in single-column layout]
+
+For both single-column layouts, there are environments \type{fullwidth} and
+\type{widetyping} which typeset their content across the full page,
+including most of the wide margin.
+
+\startfullwidth
+x x x x x x x x x x x x x x x x x x x x x
+x x x x x x x x x x x x x x x x x x x x x
+x x x x x x x x x x x x x x x x x x x x x
+x x x x x x x x x x x x x x x x x x x x x
+\stopfullwidth
-\frenchspacing
-\setuptolerance[tolerant]
+\startwidetyping
+{}\/$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+\stopwidetyping
+The implementation of \type{fullwidth} is rather simplistic and
+may easily break, in which case more sophisticated hackery will be
+needed.
+
+\stopsection
+
+\startsection[title=Assembling your submission]
+
+Please check whether all non-standard modules and all
+non-standard fonts are included. We do have a current \TeX{} Live but,
+although we do have access to CTAN, finding the right stuff by
+name can occasionally be a challenge.
+
+Avoid jpeg compression for screenshots. Conversion to pdf may
+sometimes result in jpeg compression as well. Use \emph{e.g.} png
+format instead.
+
+Finally, a pdf of your article is appreciated. This way, we can
+check more reliably whether your article compiles
+correctly on our own systems.
+
+\stopsection
+\startsection[title=References]
+
+If you have references, use whatever suits you. A few sample references:
+see \cite[knuth], or \cite[lamport].
+
+\stopsection
+
+\startsection[title=References]
+ \placelistofpublications
+\stopsection
+\stopArticle
+\stoptext
-\endinput
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/s-present-luatex.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/s-present-luatex.mkiv
new file mode 100644
index 00000000000..079860bf9e5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/modules/mkiv/s-present-luatex.mkiv
@@ -0,0 +1,118 @@
+%D \module
+%D [ file=s-present-luatex,
+%D version=2016.04.30, % around
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment Banner,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D As with older presentations we use the \LUA\ moon as page counter. The rest
+%D of the style is simple because I got bored of all this fancy stepping for
+%D simple presentations.
+
+%D Beware: this presentation is meant for my own use and not a general purpose
+%D presentation style. It is a rather dumb module but served its purpose well.
+
+\startmodule[present-luatex]
+
+\useMPlibrary[lua]
+
+\setupbodyfont
+ [dejavu,17.3pt]
+
+\startuseMPgraphic{page}
+ StartPage ;
+ luaorbitcolor := white ;
+ fill Page withcolor (.5white - luaplanetcolor) ;
+ draw anchored.urt(image(drawluapagenumbergoround) xsized 150pt,urcorner Page shifted (-15pt,-10pt)) ;
+ if RealPageNumber > 1 :
+ begingroup;
+ save p, q; picture p, q;
+ p := textext("\ssbf\setstrut\strut \documentvariable{mp:title}") xsized 150pt ;
+ q := textext("\ssbf\setstrut\strut \documentvariable{mp:subtitle}") xsized 150pt ;
+ setbounds q to boundingbox(p);
+ draw anchored.lrt(p,lrcorner Page shifted (-15pt, 90pt)) withcolor luaplanetcolor ;
+ draw anchored.lrt(q,lrcorner Page shifted (-15pt, 55pt)) withcolor luaholecolor ;
+ endgroup;
+ fi ;
+ fill Field[Text][Text] enlarged 10pt withcolor (.5white - luaplanetcolor)/1.5 ;
+ StopPage ;
+\stopuseMPgraphic
+
+\defineoverlay
+ [page]
+ [\useMPgraphic{page}]
+
+\setupbackgrounds
+ [page]
+ [background=page]
+
+\setuppapersize
+ [S6]
+
+\setuplayout
+ [backspace=50pt,
+ cutspace=200pt,
+ topspace=40pt,
+ bottomspace=40pt,
+ margin=0pt,
+ footer=0pt,
+ header=0pt,
+ width=middle,
+ height=middle]
+
+\setupmakeup
+ [standard]
+ [top=\vfil,
+ bottom=\vfilll,
+ setups=standardmakeup,
+ align=middle,
+ color=white]
+
+\setupcolors
+ [textcolor=white]
+
+\startsetups standardmakeup
+ \setupwhitespace
+ [big]
+\stopsetups
+
+\setupdocument
+ [title=Title,
+ subtitle=Subtitle,
+ location=\currentdate,
+ mp:title=title,
+ mp:subtitle=subtitle]
+
+\startsetups document:start
+
+ \startstandardmakeup[bottom=,top=]
+
+ \raggedcenter
+
+ \vfil\vfil
+ \dontleavehmode\scale[width=1.00\textwidth]{\ssbf\documentvariable{title}}
+ \vfil
+ \dontleavehmode\scale[width=0.75\textwidth]{\ssbf\documentvariable{subtitle}}
+ \vfil
+ \dontleavehmode\scale[width=0.65\textwidth]{\ssbf\documentvariable{location}}
+ \vfil
+ \dontleavehmode\scale[width=0.45\textwidth]{\ssbf\documentvariable{author}}
+ \vfil\vfil\vfil
+
+ \stopstandardmakeup
+
+\stopsetups
+
+\stopmodule
+
+\continueifinputfile{s-present-luatex.mkiv}
+
+\usemodule[present-common]
+
+\inputpresentationfile{context/2016/context-2016-luatex.tex}
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/s-tugboat.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/s-tugboat.mkiv
index d3d15c3e735..e243dc4879b 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/s-tugboat.mkiv
+++ b/Master/texmf-dist/tex/context/modules/mkiv/s-tugboat.mkiv
@@ -1,32 +1,33 @@
%D \module
%D [ file=t-tugboat
-%D version=$Id: t-tugboat.tex 111 2013-02-25 17:56:22Z bnb $
+%D version=$Id: s-tugboat.mkiv 246 2019-09-09 18:22:19Z karl $
%D title=\CONTEXT\ Style File,
%D subtitle=\TUGBOAT\ base style,
-%D author=Aditya Mahajan,
+%D author=Aditya Mahajan and others,
%D date=\currentdate,
%D copyright=Public Domain]
-%D This file is derived from \filename{s-tug-02} written by Hans Hagen
-%D and Steve Grathwohl. Karl Berry asked me for some changes in the
-%D \TUGBOAT\ style files. The original file had an option of typesetting
-%D on a grid. That was too clever for me to understand, and hence to
-%D modify. Since \TUGBOAT\ usually does not typeset on a grid, I redid the
-%D style, borrowing parts from \filename{s-tug-02} and redoing some
-%D parts from scratch.
+%D \filename {s-tug-02} was originally written by Hans Hagen and Steve Grathwohl,
+%D and used grid typesetting. \filename {t-tugboat} was a major revision by Aditya
+%D Mahajan, no grid. \filename {s-tugboat.mkiv} was another major revision by Taco
+%D Hoekwater and Alan Braslau, now with pagecolumns. The latest version has been
+%D adapted by Karl Berry.
-%D \section Variables %<<<1
+%D HH: most articles are not that demanding, otherwise I'd probably redefine some
+%D of the code below. So, for now things gets adapted when needed.
+
+%D \section{Variables}
%D
%D We store the information about the article in variables.
\setvariables
[tugboat]
[type=article,
- columns=no,
- grid=yes]
+ columns=yes,
+ grid=no]
\setvariables
- [tugboat]
+ [tugboat] % overridden from ../tugboat.dates if present.
[year=1900,
volume=0,
number=0,
@@ -38,45 +39,44 @@
subtitle=,
keywords=,
author=T. Boat,
- address=Pragmatically Advanced tugboats \\
- 314 Pi Ave. \\
- 8061GH Hasselt NL,
- email={tugboat@tug.org}]
+ address=Pragmatically Advanced tugboats\\314 Pi Ave.\\8061GH Hasselt NL,
+ email={pragboat@tug.org}]
-%D \section Font Setup %<<<1
+%D \section{Font Setup}
%D
-%D \TUGBOAT\ uses slightly different interline space than the default.
-%D So we change the interline space.
+%D \TUGBOAT\ uses standard CM interline spacing.
-\definebodyfontenvironment [8pt] [interlinespace=9.5pt, big=9pt, small=7pt]
-\definebodyfontenvironment [9pt] [interlinespace=11pt, big=10pt, small=8pt]
-\definebodyfontenvironment [10pt] [interlinespace=12pt, big=12pt, small=9pt]
-\definebodyfontenvironment [12pt] [interlinespace=14pt,big=14.4pt,small=10pt]
-\definebodyfontenvironment [14.4pt] [interlinespace=18pt,big=14.4pt,small=12pt]
-\definebodyfontenvironment [9.8pt] % Because 9.8pt is used in typing environments
+\definebodyfontenvironment [8pt] [interlinespace=9.5pt, big=9pt, small=7pt]
+\definebodyfontenvironment [9pt] [interlinespace=11pt, big=10pt, small=8pt]
+\definebodyfontenvironment [10pt] [interlinespace=12pt, big=12pt, small=9pt]
+\definebodyfontenvironment [12pt] [interlinespace=14pt, big=14.4pt,small=10pt]
+\definebodyfontenvironment [14.4pt] [interlinespace=18pt, big=14.4pt,small=12pt]
-%D \TUGBOAT\ uses Computer Modern fonts, and \CONTEXT\ uses Latin Modern
-%D by default. So, we just specify the font size.
+%D \TUGBOAT\ uses Computer Modern fonts, and \CONTEXT\ uses Latin Modern by default,
+%D which is fine. So, we just specify the font size.
\setupbodyfont [10pt]
-% Italic rather than slanted for emphasis.
-\setupbodyfontenvironment[default][em=italic]
+%D \TUGBOAT\ uses italic rather than slanted for emphasis.
+
+\setupbodyfontenvironment
+ [default]
+ [em=italic]
+
+%D Break after these chars in urls, not before.
-% Break after these chars in urls, not before.
\sethyphenatedurlafter /
\sethyphenatedurlafter .
\sethyphenatedurlafter _
-%D \section Layout Setup %<<<1
+%D \section{Layout Setup}
%D
-%D The original layout used in the \LATEX\ style for \TUGBOAT\ is a bit
-%D ambiguous. It uses low|-|level \TEX\ syntax, rather than changing the
-%D layout in a human understandable way (for example, by using the
-%D \mono{geometry} package. I have tried to translate it to \CONTEXT\ as
-%D far as I understand.
+%D The original layout used in the \LATEX\ style for \TUGBOAT\ uses low|-|level
+%D \TEX\ syntax.
-\setuppapersize[letter][letter]
+\setuppapersize
+ [letter]
+ [letter]
\setuplayout
[topspace=3.8pc,% was 3.5pc
@@ -95,32 +95,43 @@
margindistance=1pc,
]
-\setupcolumns[distance=1.5pc]
+%D With pagecolumns, seemingly can't get single-column floats. (HH: not sure
+%D what is meant but probably that it can't be done in the running text.)
+
+\enablemode [pagecolumns]
+
+%D KB: With columnsets, get unwanted gridsetting and blank last pages. HH: can
+%D be solved but columnsets normally get set up beforehand (figures and such).
+
+% \enablemode [columnsets]
+% \startmode [columnsets]
+% \usemodule [newcolumnsets]
+% \stopmode
\setuppagenumbering
[location=,
alternative=doublesided]
-%D In \TUGBOAT\ different articles are glued together to form the final
-%D journal, so we do not want each article to occupy even number of
-%D pages.
+%D In \TUGBOAT\ different articles are glued together to form the final journal, so
+%D we do not want each article to occupy an even number of pages. (Except this seems
+%D to have no effect with pagecolumns.) HH: page columns are actually just single
+%D columns but combined, so it supports side floats and such.
\installpagebreakhandler {last} {}
-%D \section Indentation %<<<1
+%D \section{Indentation}
%D
-%D We use automatic indentation control, that is: no
-%D indentation after titles and skips.
+%D We use automatic indentation control, that is: no indentation after titles and
+%D skips.
\setupindenting[20pt,yes]
-%D We do not want indentation after lists.
+%D We do not usually want indentation after lists.
\setupenumerations [indentnext=no]
-
\setupdescriptions [indentnext=no]
-%D \section Itemize
+%D \section{Itemize}
%D
%D And these. We typeset itemizations ragged right.
@@ -144,70 +155,112 @@
[1]
[packed]
-%D \section Section Headings %<<<1
+%D \section{Section Headings}
%D
-%D We follow the \TUGBOAT\ style for sections. I do not know if
-%D \type{align=right} also disables hyphenation. Lets wait and see on
-%D this. Rest all is straight forward. It took me a while to realize
-%D that in \LATEX\ \type{\@startsection} the absolute value of before
-%D skip (fourth argument) is important and not the sign.
+%D We follow the \TUGBOAT\ style for sections. I do not know if \type {align=right}
+%D also disables hyphenation (HH: no that is independent). Let's wait and see on
+%D this. The rest is straightforward. It took me a while to realize that in \LATEX\
+%D \type {\@startsection} the absolute value of before skip (fourth argument) is
+%D important and not the sign.
\setuphead
- [section,subsection, subsubsection,
- subject, subsubject, subsubsubject]
+ [section,subsection,subsubsection,
+ subject,subsubject,subsubsubject]
[style=bold,
align=right,
before={\blank[8pt]},
after={\blank[4pt]}]
-%D \section Spacing <<<1
+%D \section{Spacing}
%D
-%D We define a logical skip. This is equal to the \tex{topsep} in latex,
-%D and most environments should have this skip.
+%D We define a logical skip. This is equal to the \type {\topsep} in \LATEX, and
+%D most environments should have this skip.
+
+\defineblank
+ [tugblank]
+ [3pt]
-\defineblank[tugblank][3pt]
-\setupblank[3pt]
+%D HH: In fact, \type \setupblank[tugblank] would deal with most of the blanks
+%D anyway, but let's not change this now.
+\setupblank
+ [3pt]
-\setupitemize[1][before={\blank[tugblank]},after={\blank[tugblank]},
- inbetween={\blank[tugblank]}]
+\setupitemize
+ [1]
+ [before={\blank[tugblank]},
+ after={\blank[tugblank]},
+ inbetween={\blank[tugblank]}]
-\setuplines[before={\blank[tugblank]},after={\blank[tugblank]},
- inbetween={\blank[tugblank]}]
+\setuplines
+ [before={\blank[tugblank]},
+ after={\blank[tugblank]},
+ inbetween={\blank[tugblank]}]
%D \section Typing %<<<1
%D
-%D \TUGBOAT\ uses a smaller font size for verbatim typesetting.
+%D \TUGBOAT\ uses a smaller font size for verbatim typesetting. Not sure why
+%D \type {nowhite} is used here.
\setuptyping
[option=none,
- % mkiv arbitrarily scales lm somehow randomly; 10pt gets 9pt back,
- % we make it a little smaller.
- bodyfont=9.8pt,
- before={\blank[nowhite]}, % AM: If this is too small, use \blank[nowhite,tugblank]}
+ bodyfont=9pt,
+ before={\blank[nowhite,tugblank]},
after={\blank[back,nowhite,tugblank]}]
-%D \section Footnotes %<<<1
+%D Do not colorize code.
+
+\setuptyping[LUA][option=]
+\setuptyping[TEX][option=]
+\setuptyping[MP] [option=]
+
+%D Tiny line numbers in numbered code (not text size)
+
+\setuplinenumbering[style=\tfxx] % \infofont would be really tiny
+
+%D \section{Figure captions}
+%D
+%D \TUGBOAT\ uses a smaller font size for captions, too; \type {\small} gives 8pt,
+%D and we want 9pt, so we have to manually fix the baselines.
+
+\setupcaptions
+ [headstyle=\AcroFontBold,
+ style={\AcroFont\advance\baselineskip by -1pt},
+ align=right]
+
+%D We like a colon after the caption label.
+
+\let\floatcaptionsuffix=:
+
+% Prefer floats in text.
+
+\setupfloat[figure][align=middle,default=here]
+\setupfloat[table] [align=middle,default=here]
+
+%D \section{Footnotes}
%D
%D Not entirely a la \TUGBOAT:
+% rule={\hrule width 5pc height .4pt depth 0pt\relax \kern \strutdepth},
+
\setupfootnotes
- [bodyfont=9pt,
- location=columns%,
-% rule={\hrule width 5pc height .4pt depth 0pt\relax \kern \strutdepth}
-]
+ [bodyfont=9pt]
+
+\doif {\getvariable{tugboat}{columns}} {yes} {
+ \setupfootnotes
+ [location=columns]
+}
-\setupnotation[footnote]
+\setupnotation
+ [footnote]
[location=joinedup,
width=fit,
headstyle=normal,
distance=.5em]
-%>>>
-%D \section List %<<<
+%D \section{List}
%D
-%D We define a standard description and enumeration
-%D environment.
+%D We define a standard description and enumeration environment.
\definedescription
[description]
@@ -223,31 +276,26 @@
before={\blank[tugblank]},
after={\blank[tugblank]}]
-
-% >>>
-%D \section References %<<<
+%D \section{References}
%D
-%D The bib does not handle urls nicely. So we provide a stop gap solution.
-
-\definereferenceformat[cite][left={[},right={]}]
-\defineitemgroup [bibliography] [levels=1]
-\setupitemgroup [bibliography]
- [symbol=n,
- left={[},
- right={]},
- width=1.5em,
- stopper=,
- itemalign=flushright,
- inbetween={\blank[small]}]
+%D More or less like plain BibTeX + ltugboat.
+
+\setupbtx
+ [default:list:numbering]
+ [left={[},
+ right={]}]
+
+\setupbtxlist
+ [default]
+ [width=2em,
+ style={\frenchspacing},
+ align={raggedright,verystrict}]
%D Instead of color, we use weighted gray scales:
+
\setupcolors
[conversion=always]
-%D English it is.
-\mainlanguage
- [en]
-
%D We define some logical skips
\defineblank [tugbefore] [big]
@@ -261,26 +309,28 @@
\startsetups tugboat:abstract:setup
- \setuptolerance
- [horizontal, tolerant]
+ % \setuptolerance
+ % [horizontal, tolerant]
+
+ \setupnarrower
+ [before={\blank[.5\baselineskip]},
+ % after={\blank[10pt plus4pt minus4pt]},
+ after={\blank[10pt]},
+ middle=4.875pc]
- \setupnarrower
- [before={\blank[.5\baselineskip]},
-% after={\blank[10pt plus4pt minus4pt]},
- after={\blank[10pt]},
- middle=4.875pc]
+ \setupindenting
+ [20pt,yes]
\stopsetups
-%D Headers and footers are different for normal issues
-%D and proceedings.
+%D Headers and footers.
\startsetups tugboat:banner:text:article
- {\sl TUGboat},\space
- Volume \getvariable{tugboat}{volume}\space
- (\getvariable{tugboat}{year}),\space
- No.\space\getvariable{tugboat}{number}
+ {\sl TUGboat},\space
+ Volume \getvariable{tugboat}{volume}\space
+ (\getvariable{tugboat}{year}),\space
+ No.\space\getvariable{tugboat}{number}
\stopsetups
@@ -288,9 +338,9 @@
\startsetups tugboat:banner:text:proceedings
- \setups{tugboat:banner:text:article}
- \thinspace---\thinspace
- \postissno
+ \setups{tugboat:banner:text:article}
+ \thinspace---\thinspace
+ \postissno
\stopsetups
@@ -300,26 +350,15 @@
[\setups{tugboat:banner:text:article}]
[\pagenumber]
-% no footer in regular articles
-% \setupfootertexts
-% [][\getvariable{tugboat}{author}]
-% [\getvariable{tugboat}{title}][]
-
-\stopsetups
-
-\startsetups tugboat:banner:setup:proceedings
-
- \setupheadertexts
- [][\getvariable{tugboat}{title}]
- [\getvariable{tugboat}{author}][]
+ % no footer in regular articles
\setupfootertexts
- [\setups{tugboat:banner:text:proceedings}]
- [\pagenumber]
+ [][\getvariable{tugboat}{author}]
+ [\getvariable{tugboat}{title}][]
\stopsetups
-%D article is default so,
+%D article is default.
\setups{tugboat:banner:setup:article}
@@ -330,333 +369,334 @@
\startsetups tugboat:grid:setup:settings:yes
- \setupblank
- [line]
+ \setupblank
+ [line]
- \defineblank [tugbefore] [halfline]
- \defineblank [tuginbetween] [halfline]
+ \defineblank [tugbefore] [halfline]
+ \defineblank [tuginbetween] [halfline]
\stopsetups
-\startsetups tugboat:grid:setup:no
-
+% \startsetups tugboat:grid:setup:no
+%
% \setupblank
% [halfline]
-
+%
% \defineblank [medium] [halfline]
% \defineblank [tugbefore] [halfline]
% \defineblank [tuginbetween] [halfline]
-
-\stopsetups
+%
+% \stopsetups
\startsetups tugboat:introduction:article
-% \blank[halfline]
-
- \start
- \def\\{\unskip\space\&\space\ignorespaces}
- \hbox{\indent\getvariable{tugboat}{author}}
- \par
- \stop
-
-
-\stopsetups
-
-\startsetups tugboat:introduction:proceedings
-
- \blank[20pt]
-
- \start
- \switchtobodyfont[12pt]
- \def\\{\unskip\space\&\space\ignorespaces}
- \getvariable{tugboat}{author}
- \par
- \stop
+ % \blank[halfline]
\start
- \switchtobodyfont[9pt]
- \def\\{\unskip,\space\ignorespaces}
- \getvariable{tugboat}{address}
- \par
- {\tt\getvariable{tugboat}{email}}
- \par
- \stop
-
+ \def\\{\unskip\space\&\space\ignorespaces}
+ \hbox{\indent\getvariable{tugboat}{author}}
+ \par
+ \stop
\stopsetups
\startsetups tugboat:article:start
- \starttext
-
- \setups{tugboat:columns:\getvariable{tugboat}{columns}}
- \setups{tugboat:banner:setup:\getvariable{tugboat}{type}}
-
- \doif{\getvariable{tugboat}{columns}}{yes}{\startcolumns}
+ \starttext
+
+ \setups{tugboat:columns:\getvariable{tugboat}{columns}}
+ \setups{tugboat:banner:setup:\getvariable{tugboat}{type}}
+
+ \doif {\getvariable{tugboat}{columns}} {yes} {
+ \doifmodeelse {columnset} {
+ \startcolumnset
+ } {
+ \doifmodeelse {pagecolumns} {
+ \startpagecolumns
+ } {
+ \startcolumns
+ }
+ }
+ }
+
+ \setcounter
+ [userpage]
+ [\getvariable{tugboat}{page}]
+
+ \setups{tugboat:grid:setup:\getvariable{tugboat}{grid}}
+
+ \snaptogrid \vbox \bgroup
+
+ \forgetall
+ \hrule height .6pt
+ \blank[halfline]
+ \start
+ \let\\=\par
+ {\bf\getvariable{tugboat}{title}}
+ \par
+ \blank[halfline]
+ \hskip20pt\getvariable{tugboat}{author}
+ \stop
+
+ \blank[line]
+
+ \doiftext {\getbuffer[abstract]} {
+ \let\\=\endgraf
+ \setups{tugboat:abstract:setup}
+ \subject{Abstract}
+ \getbuffer[abstract]
+ }
+
+ \egroup
+\stopsetups
- % AM: Why set these again?
- % \setupheadertexts
- % [\setups{tugboat:banner:text:article}]
- % [pagenumber]
-
- % \setuppagenumber
- % [number=\getvariable{tugboat}{page}]
- \setcounter[userpage][\getvariable{tugboat}{page}]
-
- % \setuplayout
- % [grid=\getvariable{tugboat}{grid}]
-
- % % instead of \startmode [*grid] ... \stopmode
- % % instead of \startnotmode[*grid] ... \stopnotmode
-
- \setups{tugboat:grid:setup:\getvariable{tugboat}{grid}}
-
- \snaptogrid \vbox \bgroup
-
- \forgetall
-\hrule height .6pt
-\blank[halfline]
- \start
- \let\\=\par
- {\bf\getvariable{tugboat}{title}}
- \par
- \blank[halfline]
- \hskip20pt\getvariable{tugboat}{author}
- \stop
-
-% \setups{tugboat:introduction:\getvariable{tugboat}{type}}
+\startsetups tugboat:affiliation:article
\blank[line]
+ \begingroup
+ \leftskip=5.7pc
+ \noindent
+ \llap{\sym{\diamond}\enspace}
+ \getvariable{tugboat}{author}
+ \\
+ \getvariable{tugboat}{address}
+ \\
+ {\tt\getvariable{tugboat}{email}}
+ \par
+ \endgroup
- \doiftext{\getbuffer[abstract]}
- {\let\\=\endgraf
- \setups{tugboat:abstract:setup}
- \subject{Abstract}
- \getbuffer[abstract]}
- \egroup
\stopsetups
-\startsetups tugboat:proceedings:start
-
- \starttext
-
- \setups{tugboat:columns:\getvariable{tugboat}{columns}}
- \setups{tugboat:banner:setup:\getvariable{tugboat}{type}}
-
- \setupheader
- [state=empty]
-
- \setuppagenumber
- [number=\getvariable{tugboat}{page}]
-
- \setuplayout
- [grid=\getvariable{tugboat}{grid}]
-
- % instead of \startmode [*grid] ... \stopmode
- % instead of \startnotmode[*grid] ... \stopnotmode
- \doifmodeelse{*grid}{\setups{tugboat:grid:setup:yes}}{\setups{tugboat:grid:setup:no}}
-% \setups{tugboat:grid:setup:\systemmodevalue{grid}{yes}{no}}
-
- \snaptogrid \vbox \bgroup
-
- \forgetall
-
- \start
- \switchtobodyfont[14.4pt]
- \let\\=\par
- \getvariable{tugboat}{title}
- \par
- \stop
-
- \setups{tugboat:introduction:\getvariable{tugboat}{type}}
-
- \blank[9pt]% plus3pt minus3pt]
-
- \let\\=\par
- \setups{tugboat:abstract:setup}
- \midaligned{\bf Abstract}
+\startsetups tugboat:article:stop
- \startnarrower[middle]
- \getbuffer[abstract]
- \stopnarrower
+ \setups{tugboat:affiliation:\getvariable{tugboat}{type}}
- % \blank[10pt plus4pt minus4pt]
+ % article joining in the issue.
- \egroup
+ \ifx\writelastpage\undefined \else
+ \begingroup
+ \count0=\count1 % because context uses \count0
+ \writelastpage{+1}%
+ \endgroup
+ \fi
- \doif{\getvariable{tugboat}{columns}}{yes}{\startcolumns}
+ \stoptext
\stopsetups
-\def\signaturewidth{13pc}
+%D Normal word spacing, please.
-\definefontsynonym[LMSY][lmsy10]
-\def\mydiamond{\getglyph{LMSY}{\char5}}
+\setuptolerance
+ [strict]
-\startsetups tugboat:affiliation:article
+%D Hz is fine but hanging can hang quotes out too far.
- \blank[line]
+\setupalign[hz]
- \snaptogrid \vbox \bgroup
+%D Let's see boxes overfull by >.5pt
- \forgetall
+\overfullrule = 2pt % yes, I want to see
+\hfuzz = .5pt
- \leftskip=\textwidth \advance\leftskip by -\signaturewidth
+%D One can use the following setups (in the article) to collect settings specific to
+%D normal and|/|or multi column typesetting.
- \let\\=\par
- \leavevmode\llap{\mydiamond\enspace}\getvariable{tugboat}{author}
- \par
- \getvariable{tugboat}{address}
- \par
- {\tt\getvariable{tugboat}{email}}
+\startsetups tugboat:columns:yes
- \egroup
+ \doifmodeelse {columnset} {
+ \setuplayout
+ [grid=no]
+ \setupcolumnset
+ [distance=1.5pc]
+ } {
+ \doifmodeelse {pagecolumns} {
+ \setuplayout
+ [grid=no]
+ \setuppagecolumns
+ [distance=1.5pc]
+ } {
+ \setupcolumns
+ [distance=1.5pc]
+ }
+ }
\stopsetups
-\startsetups tugboat:affiliation:proceedings
-
- % nothing fancy at the end
-
-\stopsetups
+% \startsetups tugboat:columns:no
+%
+% \stopsetups
-\startsetups tugboat:article:stop
+%D Logos, abbreviations: lots could be better here.
- \setups{tugboat:affiliation:\getvariable{tugboat}{type}}
+\font\mflogo=logo10 % hm, better use \definefont
- \doif{\getvariable{tugboat}{columns}}{yes}{\stopcolumns}
+%D HH: I'm pretty sure that this doesn't really work as it probably assumes some
+%D specific math family setup and that's not how \MKIV\ works. The TB definition
+%D doesn't scale with font changes and also doesn't adapt itself to style changes.
- \page
+\newcount\TestCount
+\newbox \TestBox
+
+\def\La
+ {\dontleavehmode
+ \begingroup
+ \TestCount=\the\fam % no meaningful fams in text mode in ConTeXt
+ \setbox\TestBox=\hbox{$\fam\TestCount\scriptstyle A$}%
+ L\kern-.5\wd\TestBox\raise.42ex\box\TestBox
+ \endgroup}
+
+%D Probably this will do a better job:
+
+% \def\La
+% {\dontleavehmode
+% \begingroup
+% \setbox\scratchbox\hbox{\tx A}% % or \txx
+% L\kern-.5\wd\scratchbox\raise.42ex\scratchbox
+% \endgroup}
+
+\def\ALEPH {Aleph}
+\def\API {\acro{API}}
+\def\CCODE {C}
+\def\CD {\acro{CD}}
+\def\CMYK {\acro{CMYK}}
+\def\CONTEXT {C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt}
+\def\Cplusplus {C\plusplus}
+\def\CPU {\acro{CPU}}
+\def\DVI {\acro{DVI}}
+\def\DVIPDFMX {dvipdfmx}
+\def\DVIPS {dvips}
+\def\ETEX {$\varepsilon$-\kern-.125em\TeX}
+\def\FTP {\acro{FTP}}
+\def\HTTP {\acro{HTTP}}
+\def\IO {\acro{I/O}}
+\def\ISO {\acro{ISO}}
+\def\KPSE {\acro{KPSE}}
+\def\KPSEWHICH {kpsewhich}
+\def\LATEX {\La\kern-.15em\TeX}
+\def\LATEXE {\LaTeX{}\kern.05em2$_{\textstyle\varepsilon}$}
+\def\LINUX {Linux}
+\def\LPEG {Lpeg}
+\def\LUA {Lua}
+\def\LUAJIT {Lua\acro{JIT}}
+\def\LUATEX {Lua\-\TeX}
+\def\LUATOOLS {lua\-tools}
+\def\MATHML {Math\acro{ML}}
+\def\METAFUN {Metafun}
+\def\METAPOST {MetaPost}
+\def\METATEX {Meta\TeX{}}
+\def\MF {{\mflogo META\-FONT}}
+\def\MKII {Mk\acro{II}}
+\def\MKIV {Mk\acro{IV}}
+\def\MPLIB {\acro{MP}lib}
+\def\MPTOPDF {mp\-to\-pdf}
+\def\MSWINDOWS {Windows}
+\def\MTXTOOLS {mtx\-tools}
+\def\NFSS {\acro{NFSS}}
+\def\OPENMATH {Open\-Math}
+\def\OPENTYPE {Open\-Type}
+\def\PASCAL {Pascal}
+\def\PDF {\acro{PDF}}
+\def\PDFTEX {pdf\/\-\TeX}
+\def\plusplus {\lower.45ex\hbox{$^{++}$}}
+\def\POSIX {\acro{POSIX}}
+\def\POSTSCRIPT{Post\-Script}
+\def\PRAGMA {Pragma \acro{ADE}}
+\def\RGB {\acro{RGB}}
+\def\RUBY {Ruby}
+\def\SCITE {Sci\acro{TE}}
+\def\TDS {\acro{TDS}}
+\def\TEX {\TeX}
+\def\TEXBOOK {{\sl The \TeX book}}
+\def\TEXEXEC {\TeX exec}
+\def\TFM {\acro{TFM}}
+\def\TRUETYPE {True\-Type}
+\def\TYPEONE {Type~1}
+\def\UTF {\acro{UTF}}
+\def\WEBC {Web2C}
+\def\XETEX {X\lower.5ex\hbox{\kern-.15em\mirror{E}}\kern-.1667em\TeX}
+\def\XML {\acro{XML}}
+\def\XPATH {\acro{XP}ath}
+\def\XSLT {\acro{XSLT}}
+\def\XSLTPROC {\acro{XSLTPROC}}
+\def\ZIP {zip}
+
+\def\Dash {\unskip\nobreak\thinspace---\thinspace\ignorespaces}
+\def\slash {/\penalty0 \hskip0pt \relax}
+
+% \acro for one point size smaller. Don't know how to do this for real.
+
+\definefont[AcroFont] [Serif*default sa .91]
+\definefont[AcroFontBold] [SerifBold*default sa .91]
+\definefont[AcroFontSmall][Serif*default sa .80]
+
+\unexpanded\def\acro #1{{\AcroFont #1}} % could be a style definition
+\unexpanded\def\acrobf #1{{\AcroFontBold #1}} % could be a style definition
+\unexpanded\def\acrosmall#1{{\AcroFontSmall #1}} % could be a style definition
+
+%D This is English; disallow x- or -xx breaks. (These are already the defaults
+%D but let's keep this anyway.)
+
+\setuplanguage
+ [en]
+ [lefthyphenmin=2,
+ righthyphenmin=3]
- \stoptext
+% \lefthyphenmin = 2
+% \righthyphenmin = 3
-\stopsetups
+\mainlanguage
+ [en]
-%D Normal word spacing, please.
+\hyphenation {
+ Post-Script
+ data-base
+ data-bases
+}
-\setuptolerance
- [strict]
+%D A hack to read \type {tugboat.dates} settings.
-%D One can use the following setups (in the article) to
-%D collect settings specific to normal and/or multi
-%D column typesetting.
+\doifelsefileexists {../tugboat.dates} {
-\startsetups tugboat:columns:yes
+ \newif \ifPrelimDraft
+ \newcount\issueseqno
-\stopsetups
+ \def\vol #1, #2.{\gdef\tubvol {#1}%
+ \gdef\tubnum {#2}}
+ \def\issyear #1.{\gdef\tubyear{#1}}
-\startsetups tugboat:columns:no
+ \input ../tugboat.dates
-\stopsetups
+ \setevariables
+ [tugboat]
+ [year=\tubyear,
+ volume=\tubvol,
+ number=\tubnum,
+ page=\the\count0]
-% >>> Logos, abbreviations: TODO: Clean up <<<
-\font\mflogo = logo10
-\def\MF{{\mflogo META\-FONT}}
-
-\def\ALEPH{Aleph}
-\def\API{\acro{API}}
-\def\CCODE{C}
-\def\CD{\acro{CD}}
-\def\CMYK{\acro{CMYK}}
-\def\CONTEXT{C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt}
-\def\CPU{\acro{CPU}}
-\def\DVI{\acro{DVI}}
-\def\DVIPDFMX{dvipdfmx}
-\def\DVIPS{dvips}
-\def\ETEX{$\varepsilon$-\kern-.125em\TeX}
-\def\FTP{\acro{FTP}}
-\def\HTTP{\acro{HTTP}}
-\def\IO{\acro{I/O}}
-\def\ISO{\acro{ISO}}
-\def\KPSEWHICH{kpsewhich}
-\def\KPSE{\acro{KPSE}}
-\newcount\TestCount
-\newbox\TestBox
-\def\La{\TestCount=\the\fam \leavevmode L%
- \setbox\TestBox=\hbox{$\fam\TestCount\scriptstyle A$}%
- \kern-.5\wd\TestBox\raise.42ex\box\TestBox}
-\def\LATEX{\La\kern-.15em\TeX}
-\def\LATEXE{\LaTeX{}\kern.05em2$_{\textstyle\varepsilon}$}
-\def\LINUX{Linux}
-\def\LPEG{Lpeg}
-\def\LUAJIT{Lua\acro{JIT}}
-\def\LUATEX{Lua\-\TeX}
-\def\LUATOOLS{lua\-tools}
-\def\LUA{Lua}
-\def\MATHML{Math\acro{ML}}
-\def\METAFUN{Metafun}
-\def\METAPOST{MetaPost}
-\def\METATEX{Meta\TeX{}}
-\def\MKII{Mk\acro{II}}
-\def\MKIV{Mk\acro{IV}}
-\def\MPLIB{\acro{MP}lib}
-\def\MPTOPDF{mp\-to\-pdf}
-\def\MSWINDOWS{Windows}
-\def\MTXTOOLS{mtx\-tools}
-\def\NFSS{\acro{NFSS}}
-\def\OPENMATH{Open\-Math}
-\def\OPENTYPE{Open\-Type}
-\def\PASCAL{Pascal}
-\def\PDFTEX{pdf\/\-\TeX}
-\def\PDF{\acro{PDF}}
-\def\POSIX{\acro{POSIX}}
-\def\PRAGMA{Pragma \acro{ADE}}
-\def\POSTSCRIPT{Post\-Script}
-\def\RGB{\acro{RGB}}
-\def\RUBY{Ruby}
-\def\SCITE{Sci\acro{TE}}
-\def\TDS{\acro{TDS}}
-\def\TEXBOOK{{\sl The \TeX book}}
-\def\TEXEXEC{\TeX exec}
-\def\TEX{\TeX}
-\def\TFM{\acro{TFM}}
-\def\TRUETYPE{True\-Type}
-\def\TYPEONE{Type~1}
-\def\UTF{\acro{UTF}}
-\def\WEBC{Web2C}
-\def\XETEX{X\lower.5ex\hbox{\kern-.15em\mirror{E}}\kern-.1667em\TeX}
-\def\XML{\acro{XML}}
-\def\XPATH{\acro{XP}ath}
-\def\XSLT{\acro{XSLT}}
-\def\XSLTPROC{\acro{XSLTPROC}}
-\def\ZIP{zip}
-
-\def\Dash{\unskip\thinspace---\thinspace\ignorespaces}
-\def\slash{/\penalty0 \hskip0pt \relax}
-
-\definefont[AcroFont][Serif sa .91]
-\def\acro#1{{\AcroFont #1}}
-
-\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks
-
-\hyphenation{Post-Script data-base data-bases}
-
-% hack to read tugboat.dates settings.
-\def\vol#1, #2.{\def\tubvol{#1}\def\tubnum{#2}}
-\def\issyear#1.{\def\tubyear{#1}}
-\newcount\issueseqno
+} {
+ % nothing
+}
-% >>>
-%D Good bye. <<<
+%D Good bye.
-\doifnotmode{demo}{\endinput}
+\continueifinputfile{s-tugboat.mkiv}
-\showgrid
+% \showgrid
\starttext
\StartArticle
\StartAbstract
- \input bryson
+ \samplefile{bryson}
\StopAbstract
\dorecurse{30}{\input ward \endgraf} \page
\startitemize
-\item \input ward
-\item \input ward
+ \startitem \samplefile{ward} \stopitem
+ \startitem \samplefile{ward} \stopitem
\stopitemize
\StopArticle
@@ -666,15 +706,15 @@
\StartArticle
\StartAbstract
- \input bryson
+ \samplefile{bryson}
\StopAbstract
-\dorecurse{30}{\input ward \endgraf} \page
+\dorecurse {30} {
+ \samplefile{ward}\endgraf
+} \page
\StopArticle
\stoptext
% >>>
-
-% vim: foldmethod=marker foldmarker=<<<,>>>
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/x-asciimath.lua b/Master/texmf-dist/tex/context/modules/mkiv/x-asciimath.lua
index 677ab0ce562..edad3f575b1 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/x-asciimath.lua
+++ b/Master/texmf-dist/tex/context/modules/mkiv/x-asciimath.lua
@@ -20,7 +20,7 @@ ugly and unsatisfying code mess down here. Don't take this as an example.</p>
-- todo: filter from files listed in tuc file
local trace_mapping = false if trackers then trackers.register("modules.asciimath.mapping", function(v) trace_mapping = v end) end
-local trace_detail = false if trackers then trackers.register("modules.asciimath.detail", function(v) trace_detail = v end) end
+local trace_details = false if trackers then trackers.register("modules.asciimath.details", function(v) trace_details = v end) end
local trace_digits = false if trackers then trackers.register("modules.asciimath.digits", function(v) trace_digits = v end) end
local report_asciimath = logs.reporter("mathematics","asciimath")
@@ -35,7 +35,7 @@ if not characters then
require("char-ent")
end
-local rawget, next, type = rawget, next, type
+local next, type = next, type
local concat, insert, remove = table.concat, table.insert, table.remove
local rep, gmatch, gsub, find = string.rep, string.gmatch, string.gsub, string.find
local utfchar, utfbyte = utf.char, utf.byte
@@ -776,6 +776,7 @@ local isunary = { -- can be taken from reserved
["\\widehat"] = true, -- widehat
["\\bar"] = true, --
["\\overbar"] = true, --
+ ["\\overline"] = true, --
["\\underline"] = true, --
["\\vec"] = true, -- overrightarrow
["\\overrightarrow"] = true, -- overrightarrow
@@ -1775,7 +1776,7 @@ collapse = function(t,level)
return ""
end
-- tracing
- if trace_detail then
+ if trace_details then
if level then
level = level + 1
else
@@ -1784,19 +1785,19 @@ collapse = function(t,level)
show_state(t,level,"parsed")
end
-- steps
- t = collapse_matrices (t) if trace_detail then show_state(t,level,"matrices") end
- t = collapse_bars (t) if trace_detail then show_state(t,level,"bars") end
- t = collapse_stupids (t) if trace_detail then show_state(t,level,"stupids") end
- t = collapse_pairs (t) if trace_detail then show_state(t,level,"pairs") end
- t = collapse_parentheses(t) if trace_detail then show_state(t,level,"parentheses") end
- t = collapse_signs (t) if trace_detail then show_state(t,level,"signs") end
- t = collapse_binaries (t) if trace_detail then show_state(t,level,"binaries") end
- t = collapse_infixes_1 (t) if trace_detail then show_state(t,level,"infixes (1)") end
- t = collapse_limits (t) if trace_detail then show_state(t,level,"limits") end
- t = collapse_tables (t) if trace_detail then show_state(t,level,"tables") end
- t = collapse_infixes_2 (t) if trace_detail then show_state(t,level,"infixes (2)") end
- t = collapse_fractions_1(t) if trace_detail then show_state(t,level,"fractions (1)") end
- t = collapse_fractions_2(t) if trace_detail then show_state(t,level,"fractions (2)") end
+ t = collapse_matrices (t) if trace_details then show_state(t,level,"matrices") end
+ t = collapse_bars (t) if trace_details then show_state(t,level,"bars") end
+ t = collapse_stupids (t) if trace_details then show_state(t,level,"stupids") end
+ t = collapse_pairs (t) if trace_details then show_state(t,level,"pairs") end
+ t = collapse_parentheses(t) if trace_details then show_state(t,level,"parentheses") end
+ t = collapse_signs (t) if trace_details then show_state(t,level,"signs") end
+ t = collapse_binaries (t) if trace_details then show_state(t,level,"binaries") end
+ t = collapse_infixes_1 (t) if trace_details then show_state(t,level,"infixes (1)") end
+ t = collapse_limits (t) if trace_details then show_state(t,level,"limits") end
+ t = collapse_tables (t) if trace_details then show_state(t,level,"tables") end
+ t = collapse_infixes_2 (t) if trace_details then show_state(t,level,"infixes (2)") end
+ t = collapse_fractions_1(t) if trace_details then show_state(t,level,"fractions (1)") end
+ t = collapse_fractions_2(t) if trace_details then show_state(t,level,"fractions (2)") end
-- done
return collapse_result(t)
end
@@ -2009,7 +2010,7 @@ local context = context
if not context then
-- trace_mapping = true
--- trace_detail = true
+-- trace_details = true
-- report_asciimath(cleanedup([[ac+sinx+xsqrtx+sinsqrtx+sinsqrt(x)]]))
-- report_asciimath(cleanedup([[a "αsinsqrtx" b]]))
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/x-pandoc.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/x-pandoc.mkiv
new file mode 100644
index 00000000000..18bea9e7c94
--- /dev/null
+++ b/Master/texmf-dist/tex/context/modules/mkiv/x-pandoc.mkiv
@@ -0,0 +1,152 @@
+%D \module
+%D [ file=m-pandoc,
+%D version=2019.05.30,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Pandoc Docbook Rendering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% just a test
+
+\startxmlsetups xml:docbook:article
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:section
+ \startsectionlevel[title={\xmltext{#1}{/title}},reference={\xmlatt{#1}{xml:id}}]
+ \xmlall{#1}{./!title}
+ \stopsectionlevel
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:para
+ \dontleavehmode\ignorespaces
+ \xmlflush{#1}
+ \removeunwantedspaces\par
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:emphasis
+ \dontleavehmode\begingroup
+ \em \xmlflush{#1}
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:literal
+ \doifelse {\xmlatt{#1}{class}} {math} {
+ % what kind of math? inline or display?
+ \starttexcode
+ \startimath
+ \xmlflush{#1}
+ \stopimath
+ \stoptexcode
+ } {
+ \dontleavehmode\begingroup
+ \tttf \xmlflush{#1}
+ % \xmlinlineverbatim{#1}
+ \endgroup
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:programlisting
+ \xmldisplayverbatim{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:link
+ \doifsomethingelse {\xmlatt{#1}{xlink:href}} {
+ \goto{\xmlflush{#1}}[url(\xmllastatt)]
+ } {
+ \doifsomethingelse {\xmlatt{#1}{linkend}} {
+ \in{\xmlflush{#1}}[\xmllastatt]
+ } {
+ \xmlflush{#1}
+ }
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:anchor
+ \pagereference[\xmlatt{id}]
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:itemizedlist
+ \doifelse {\xmlatt{#1}{spacing}} {compact} {
+ \startitemize[packed]
+ \xmlflush{#1}
+ \stopitemize
+ } {
+ \startitemize
+ \xmlflush{#1}
+ \stopitemize
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:orderedlist
+ \doifelse {\xmlatt{#1}{spacing}} {compact} {
+ \startitemize[n,packed]
+ \xmlflush{#1}
+ \stopitemize
+ } {
+ \startitemize[n]
+ \xmlflush{#1}
+ \stopitemize
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:listitem
+ \startitem
+ \xmlflush{#1}
+ \stopitem
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:variablelist
+ \startitemize
+ \xmlflush{#1}
+ \stopitemize
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:varlistentry
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:docbook:term
+ \xmlflush{#1}
+\stopxmlsetups
+
+\usemodule[cals]
+
+\startxmlsetups cals:table:before
+ \startlinecorrection
+\stopxmlsetups
+
+\startxmlsetups cals:table:after
+ \stoplinecorrection
+\stopxmlsetups
+
+\startxmlsetups xml:docbook
+ \xmlsetsetup {#1} {*} {xml:docbook:*}
+ \xmlsetfunction {#1} {informaltable} {moduledata.cals.table}
+\stopxmlsetups
+
+\continueifinputfile{x-pandoc.mkiv}
+
+\usemodule[article-basic]
+
+\setupinteraction
+ [state=start]
+
+\setupalign
+ [flushleft,tolerant]
+
+\starttext
+
+ % running:
+ %
+ % pandoc -s -t docbook5 pandoc.txt
+
+ \xmlregisterdocumentsetup{main}{xml:docbook}
+ \xmlprocessfile{main}{d:/pandoc/pandoc.xml}{}
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/x-setups-basics.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/x-setups-basics.mkiv
index 51c9253975b..4e960f4287c 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/x-setups-basics.mkiv
+++ b/Master/texmf-dist/tex/context/modules/mkiv/x-setups-basics.mkiv
@@ -15,7 +15,6 @@
%D We can make this module a bit cleaner using more recent features or we go \LUA\
%D completely but as this style evolved over 15 years it's a waste of time.
%D
-%D
%D Thanks to Wolfgang these descriptions have become quite complete! In the process
%D of covering more commands and expecially different instances of the same command,
%D either or not generated, the supporting macros became more complex. I must admit
@@ -32,6 +31,9 @@
%D
%D Currently we load the \XML\ file and when not in the english interface we just
%D remap the relevant words to their translation.
+%D
+%D If you notice something that needs fixing, you can send a message to the mailing
+%D list.
%D \startbuffer
%D \usemodule[x-setups-basics]
diff --git a/Master/texmf-dist/tex/context/modules/mkiv/x-setups-overview.mkiv b/Master/texmf-dist/tex/context/modules/mkiv/x-setups-overview.mkiv
index 512db3bd14f..24ee63fe02b 100644
--- a/Master/texmf-dist/tex/context/modules/mkiv/x-setups-overview.mkiv
+++ b/Master/texmf-dist/tex/context/modules/mkiv/x-setups-overview.mkiv
@@ -53,12 +53,12 @@
}
-\startinterface dutch \definecolor[LocalColor][r=.75,g=.25,b=.25] \stopinterface
\startinterface english \definecolor[LocalColor][r=.25,g=.75,b=.25] \stopinterface
+\startinterface dutch \definecolor[LocalColor][r=.75,g=.25,b=.25] \stopinterface
\startinterface german \definecolor[LocalColor][r=.25,g=.25,b=.75] \stopinterface
\startinterface french \definecolor[LocalColor][r=.75,g=.75,b=.25] \stopinterface
-\startinterface czech \definecolor[LocalColor][r=.75,g=.25,b=.75] \stopinterface
\startinterface italian \definecolor[LocalColor][r=.25,g=.75,b=.75] \stopinterface
+\startinterface czech \definecolor[LocalColor][r=.75,g=.25,b=.75] \stopinterface
\startinterface romanian \definecolor[LocalColor][r=.5,g=.4,b=.3] \stopinterface
% \definecolor[LocalColor][r=.5,g=.3,b=.4]
% \definecolor[LocalColor][r=.4,g=.3,b=.5]
@@ -99,7 +99,7 @@
[\hbox to \paperwidth{\reuseMPgraphic{cover+back}\hss}]
\startreusableMPgraphic{cover+back}
- numeric h, w; boolean mapping ; path p, q, r ; color f, d ; pair s ;
+ numeric h, w; boolean mapping ; path p, q, r ; color f, d , c ; pair s ;
h := OverlayHeight ; w := 2*OverlayWidth ;
r := unitsquare xyscaled (w,h) ;
fill r withcolor resolvedcolor("lightgray") ;
@@ -115,8 +115,9 @@
forever :
s := center r randomized (w,h) ;
if new_on_grid(xpart s, ypart s) :
- d := .5[resolvedcolor("LocalColor"),resolvedcolor("lightgray")] randomized (.5,.9) ;
- f := resolvedcolor("lightgray") randomized (.5,.9) ;
+ c := resolvedcolor("lightgray") ;
+ d := .5[resolvedcolor("LocalColor"),c] randomized (.5,.9) ;
+ f := c randomized (.5,.9) ;
s := (dx,dy) ;
if mapping :
p := (-w/4,0) -- (w/4,0) ;
@@ -139,6 +140,7 @@
fi ;
exitif grid_full ;
endfor ;
+
setbounds currentpicture to r ;
\stopreusableMPgraphic
@@ -248,16 +250,25 @@
\startmakeup[\v!standard]
\dontcomplain
\startcolor[TitleColor]
- \definedfont[RegularBold at 100pt]\setstrut
- \setupalign[\v!left]
- \strut Con\TeX t \par
- \definedfont[RegularBold at 50pt]\setstrut
- \setups[text:commands]
- \vfill
- \definedfont[RegularBold at 24pt]\setupinterlinespace
- \setups[text:lowercase]
- \par \strut \currentdate \par
+ \definedfont[RegularBold at 100pt]\setstrut
+ \setupalign[\v!flushright]
+ \strut Con\TeX t \par
+ \definedfont[RegularBold at 50pt]\setstrut
+ \setups[text:commands]
\stopcolor
+ \vfill
+ \start
+ \switchtobodyfont[15pt]
+ \setuptabulate[before=,after=]
+ \dontleavehmode \hfill \hbox \bgroup
+ \starttabulate[|l|l|]
+ \BC language \EQ \setups[text:lowercase] \NC \NR
+ \BC version \EQ \currentdate \NC \NR
+ \BC maintainer \EQ Wolfgang Schuster \NC\NR
+ \BC comments \EQ \tt ntg-context@ntg.nl \NC \NR
+ \stoptabulate
+ \egroup
+ \stop
\stopmakeup
\protect
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-af.rme b/Master/texmf-dist/tex/context/patterns/common/lang-af.rme
index bd9bf2a937e..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-af.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-af.rme
@@ -1,29 +1,3 @@
% generated by mtxrun --script pattern --convert
-% Hyphenation patterns for Afrikaans
-%
-% 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.
-% -----------------------------------------------------------------
-% These patterns were generated with Opatgen from a lexicon
-% of 183 000 syllabified Afrikaans words.
-% -----------------------------------------------------------------
-% VERSION: 1.0 (September 2013)
-%
-% AUTHORS: Tilla Fick (fickm@unisa.ac.za)
-% and
-% Chris Swanepoel (swanecj@unisa.ac.za)
-%
-% -----------------------------------------------------------------
-%
-% Define lefthyphenmin to one and righthyphenmin to two
-% (although righthyphenmin could technically be made one,
-% in allmost all cases a value of two gives better results):
-% \lefthyphenmin=1 \righthyphenmin=2
-%
-% -----------------------------------------------------------------
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-agr.rme b/Master/texmf-dist/tex/context/patterns/common/lang-agr.rme
index 39c557d1624..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-agr.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-agr.rme
@@ -1,59 +1,3 @@
% generated by mtxrun --script pattern --convert
-% title: Unicode hyphenation patterns for Ancient Greek.
-% copyright: Dimitrios Filippou, (c) 2008-2016
-% notice: >
-% This file is part of the hyph-utf8 package.
-% See http://www.hyphenation.org for more information.
-% language:
-% name: Ancient Greek
-% tag: grc
-% licence:
-% name: LPPL
-% url: http://www.latex-project.org/lppl/
-% changes:
-% -
-% date: 2016-05-12
-% author: Arthur Reutenauer
-% description: added support for curly beta
-% -
-% date: 2011-09-12
-% author: Dimitrios Filippou
-% description: updated headers and added the LPPL licence statement
-% -
-% date: 2008-06-06
-% author: Dimitrios Filippou
-% description: removed guillemets (»)
-% -
-% date: 2008-05-27
-% author: Dimitrios Filippou
-%
-% ==========================================
-% This file was first created by mechanical translation from
-% GRAhyph5.tex via "elhyph-utf8 -a -c" (version 0.1 by Peter
-% Heslin -- p.j.heslin at durham dot ac dot uk). Some additions
-% were also made by hand.
-%
-% Created by Dimitrios Filippou with some ideas borrowed from
-% Yannis Haralambous, Kostis Dryllerakis and Claudio Beccari.
-% Mojca Miklavec adapted it for the "hyph-utf8" package.
-%
-% These hyphenation patterns are explained in "ancient.pdf", which
-% can be found in the "elhyphen" or "hyphenation-greek" package.
-% Hyphenation examples are given in the file "anc-test.pdf", also
-% to be found in the "elhyphen" or "hyphenation-greek" package.
-% Questionable patterns are marked by three question marks "???".
-%
-% Documentation in English can be found in: D. Filippou,
-% "Hyphenation patterns for Ancient and Modern Greek," in
-% "TeX, XML, and Digital Typography" (A. Syropoulos et al.,
-% eds.), Lecture Notes in Computer Science 3130, Springer-Verlag
-% Berlin-Heidelberg, 2004. ISBN 3-540-22801-2.
-%
-% Thanks to Thomas Schmitz (thomas.schmitz at uni-bonn dot de)
-% for pointing out a few mistakes. (Marked by %%%TS%%%)
-%
-% ****************************************************************
-%
-% \message{UTF-8 hyphenation patterns for Ancient Greek}
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-ala.rme b/Master/texmf-dist/tex/context/patterns/common/lang-ala.rme
index b4967d78a4e..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-ala.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-ala.rme
@@ -1,37 +1,3 @@
% generated by mtxrun --script pattern --convert
-%
-% ********** hyph-la-x-classic.tex *************
-%
-% Copyright 2014 Claudio Beccari
-% [classical latin hyphenation patterns]
-%
-% -----------------------------------------------------------------
-% IMPORTANT NOTICE:
-%
-% This program can be redistributed and/or modified under the terms
-% of the LaTeX Project Public License Distributed from CTAN
-% archives in directory macros/latex/base/lppl.txt; either
-% version 1 of the License, or any later version.
-% -----------------------------------------------------------------
-%
-% Patterns for the classical Latin language; classical spelling
-% with the (uncial) lowercase `v' written as a `u' is supported.
-% Classical Latin hyphenation patterns are different from those of
-% "plain" Latin, the latter being more adapted to modern Latin.
-%
-%
-% Prepared by Claudio Beccari
-% e-mail claudio dot beccari at gmail dot com
-%
-% Aknowledgements: This file has been substantially upgraded with
-% the contributions of Francisco Gracia.
-%
-% \versionnumber{1.2} \versiondate{2014/10/06}
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% \message{Classical Latin hyphenation patterns `hyph-la-x-classic'
-% Version 1.2 <2014/10/06>}
-%
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-bg.rme b/Master/texmf-dist/tex/context/patterns/common/lang-bg.rme
index 25a3e2ca5a5..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-bg.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-bg.rme
@@ -1,890 +1,3 @@
% generated by mtxrun --script pattern --convert
-% copyright: Copyright (C) 2000, 2004, 2017 by Anton Zinoviev <anton@lml.bas.bg>
-% title: Bulgarian hyphenation patterns
-% version: 21 October 2017
-% language:
-% name: Bulgarian
-% tag: bg
-% notice: >
-% This file is part of the hyph-utf8 package.
-% See http://www.hyphenation.org for more information.
-% authors:
-% -
-% name: Anton Zinoviev
-% contact: anton:lml.bas.bg
-% licence:
-% text: >
-% This software may be used, modified, copied, distributed, and sold,
-% both in source and binary form provided that the above copyright
-% notice and these terms are retained. The name of the author may not
-% be used to endorse or promote products derived from this software
-% without prior permission. THIS SOFTWARE IS PROVIDES "AS IS" AND
-% ANY EXPRESS OR IMPLIED WARRANTIES ARE DISCLAIMED. IN NO EVENT
-% SHALL THE AUTHOR BE LIABLE FOR ANY DAMAGES ARISING IN ANY WAY OUT
-% OF THE USE OF THIS SOFTWARE.
-% hyphenmins:
-% typesetting:
-% left: 2
-% right: 2
-% changes: See below
-% ==========================================
-% Copyright (C) 2000,2004,2017 by Anton Zinoviev <anton@lml.bas.bg>
-%
-% This software may be used, modified, copied, distributed, and sold,
-% both in source and binary form provided that the above copyright
-% notice and these terms are retained. The name of the author may not
-% be used to endorse or promote products derived from this software
-% without prior permission. THIS SOFTWARE IS PROVIDES "AS IS" AND
-% ANY EXPRESS OR IMPLIED WARRANTIES ARE DISCLAIMED. IN NO EVENT
-% SHALL THE AUTHOR BE LIABLE FOR ANY DAMAGES ARISING IN ANY WAY OUT
-% OF THE USE OF THIS SOFTWARE.
-%
-% Bulgarian hyphenation patterns
-%
-% Generated by ./hyph-bg.sh --safe-morphology --standalone-tex
-%
-% Both left and right hyphenmins should be set to 2.
-%
-% % Automated Bulgarian Hyphenation
-% % Anton Zinoviev
-% % 21 October 2017
-%
-% Principles of the Bulgarian hyphenation
-% =======================================
-%
-% One specificity of the Bulgarian language is that the average length
-% of the words is greater than in English. When typesetting a Bulgarian
-% text, hyphenation is more important than when typesetting an English
-% text. Knuth's algorithm for line-breaking is such that in most
-% English paragraphs no hyphenation will be used. With a Bulgarian
-% text, however, even the Knuth's algorithm will use hyphenation in most
-% paragraphs. Hyphenation becomes an absolute necessity if we want to
-% obtain nice, justified paragraphs when using a software with dumb
-% line-breaking algorithm, such as LibreOffice.
-%
-% According to Decree 936 of the Council of Ministers promulgated on 27
-% November 1950, the Institute for Bulgarian Language at the Bulgarian
-% Academy of Sciences is authorised to publish the rules of the
-% orthography of the Bulgarian language (within certain limits).
-%
-% Hyphenation rules between 1945 and 1983
-% ---------------------------------------
-%
-% Between 1945 and 1983 Bulgarian used syllable hyphenation with two
-% morphological exceptions: hyphenation is preferred between a prefix
-% and a stem and at the boundary of compound words. The following were
-% the rules governing the hyphenation:
-%
-% 1. One letter does not stay alone. Words of one syllable can not be
-% hyphenated.
-% 2. No hyphenation before or after ь.
-% 3. In a sequence of vowels at least one vowel stays before the
-% hyphen.
-% 4. A single consonant between two vowels links with the second vowel.
-% For example по-ле /po-le/, ра-бо-та /ra-bo-ta/.
-% 5. In a sequence of consonants between two vowels, at least one
-% consonant stays with the second vowel. For example те-Ñто /te-sto/
-% or теÑ-то /tes-to/.[^b]
-% 6. In a sequence of consonants between two vowels, if the first
-% consonant is sonorant (й /y/, л /l/, м /m/, н /n/, р /r/), then it
-% stays with the first vowel. For example гер-дан /ger-dan/, Ñен-ки
-% /sen-ki/.
-% 7. The hyphenation separates two successive equal consonants. For
-% example времен-но /vremen-no/, пролет-та /prolet-ta/.
-% 8. When the letters дж /dzh/ and дз /dz/ denote a single consonant,
-% then they are not separated. For example боÑ-Ð´Ð¶Ð¸Ñ /boya-dzhiya/
-% but not боÑд-Ð¶Ð¸Ñ /boyad-zhiya/. When these letters denote two
-% consonants, then the normal rules apply: над-живÑвам
-% /nad-zhivyavam/.
-% 9. Word prefixes may not be broken. Compound words are hyphenated
-% either at the boundary of the components or the hyphenation rules
-% are applied to each of the components separately. For example:
-% пред-упреждавам /pred-uprezhdavam/ (not пре-дупреждавам
-% /pre-duprezhdavam/), пред-извеÑтие /pred-izvestie/ (not
-% пре-дизвеÑтие /pre-dizvestie/), за-движвам /za-dvizhvam/ (not
-% зад-вижвам /zad-vizhvam/), авто-клуб /avto-klub/ (not авток-луб
-% /avtok-lub/), вакуум-апарат /vakuum-aparat/ (not вакуу-мапарат
-% /vakuu-maparat/).
-%
-% In some rare cases the proper application of rule 9 depends on the
-% semantics of the word. For example пре-дреша /pre-dresha/ 'change
-% clothes' but пред-реша /pred-resha/ 'predetermine' or преÑ-пите
-% /pres-pite/ 'the snow-drifts' but пре-Ñпите /pre-spite/ 'sleep for a
-% while/overnight'.
-%
-% [^b]: In several publications this rule is formulated with the
-% additional restriction that the sequence of consonants begins with
-% an obstruent. I believe this restriction is unintentional. It
-% makes no sense to forbid a hyphenation of the form AB-A but to
-% permit ABB-A (A denotes a vowel and B – a consonant).
-%
-% Hyphenation rules between 1983 and 2012
-% ---------------------------------------
-%
-% The Orthographic dictionary published by the Institute for Bulgarian
-% language in 1983 introduced new hyphenation rules. The complexity of
-% the previous rules was the main reason for the change. The new rules
-% aimed at two objectives: simplicity and unambiguity.
-%
-% The new rules are:
-%
-% 1. A consonant between two vowels links with the second vowel. For
-% example ви-Ñо-чи-на /vi-so-chi-na/.
-% 2. In a sequence of two or more consonants between two vowels, at
-% least one consonant stays with first vowel and at least one with
-% the second vowel. For example ÑеÑ-тра /ses-tra/ and ÑеÑÑ‚-ра
-% /sest-ra/.
-% 3. Two equal consonants are separated. For example плен-ник
-% /plen-nik/.
-% 4. In a sequence of two or more vowels, the first vowel stays before
-% the hyphen. For example пре-Ð¾Ð´Ð¾Ð»ÐµÑ /pre-odoleya/ and прео-долеÑ
-% /preo-doleya/.
-% 5. In a sequence of three or more vowels, the last vowel stays after
-% the hyphen. For example мао-изъм /mao-izam/ but not маои-зъм
-% /maoi-zam/.
-% 6. The letter й /y/ between a vowel and a consonant stays with the
-% vowel. For example май-ка /may-ka/.
-% 7. When a sequence of two or more consonants follows й /y/ then at
-% least one consonant links with й /y/. For example айÑ-берг
-% /ays-berg/ (not ай-Ñберг /ay-sberg/).
-% 8. The letter й /y/ between two vowels links with the second vowel.
-% For example ма-йор /ma-yor/.
-% 9. No hyphenation before or after ь.
-% 10. When the letters дж /dzh/ denote a single consonant, then they are
-% not separated. For example Ñу-джук /su-dzhuk/ (not Ñуд-жук
-% /sud-zhuk/) but над-Ð¶Ð¸Ð²ÐµÑ /nad-zhiveya/.
-% 11. There must be at least one vowel before and after the hyphen.
-% 12. One letter does not stay alone.
-%
-% The total disregard of the morphology by these rules leads to some
-% strange results. For example пре-дизвеÑтие /pre-dizvestie/ is
-% permitted and пред-извеÑтие /pred-izvestie/ is forbidden, зад-вижвам
-% /zad-vizhvam/ is permitted and за-движвам /za-dvizhvam/ is forbidden,
-% авток-луб /avtok-lub/ is permitted and авто-клуб /avto-klub/ is
-% forbidden, вакуу-мапарат /vakuu-maparat/ is permitted and
-% вакуум-апарат /vakuum-aparat/ is forbidden. Because of this, the new
-% rules were not universally accepted. The old rules are still
-% mentioned in various places in Internet, they are included even in
-% some grammar books published by the publishing houses of the Ministry
-% of Education and of Sofia University. The software developers,
-% however, soon came into love with the new hyphenation rules.
-%
-% Hyphenation rules after 2012
-% ----------------------------
-%
-% In 2012 new rules came into force. There are two differences with
-% respect to the previous rules:
-%
-% 1. Rule 5 of the previous rules is revoked. For example маои-зъм
-% /maoi-zam/ becomes a valid hyphenation.
-% 2. The new rules permit morphologically based hyphenation (however it
-% is not obligatory). For example пред-извеÑтие /pred-izvestie/,
-% за-движвам /za-dvizhvam/, авто-клуб /avto-klub/, вакуум-апарат
-% /vakuum-aparat/ are valid hyphenations.
-%
-% Good hyphenation is a complex matter and it seems the linguists at the
-% Institute for Bulgarian Language have recognised this. They no longer
-% attempt to provide universal rules about everything. Instead, they
-% provide some very permissible rules while the good application of
-% these rules is leaved to the discretion and the experience of the
-% printers and the developers of hyphenation software.
-%
-% It makes sense to use at least two different sets of hyphenation rules
-% for Bulgarian. In most cases a more restrictive version should be
-% used, one which attempts to eliminate the controversial cases of
-% hyphenation. When typesetting a Bulgarian text in a narrow newspaper
-% column, however, it will be appropriate to use more liberal
-% hyphenation rules. It should be noted that one of the reasons for the
-% hyphenation reform in 1983 was the desire to fix the chaotic
-% hyphenation in the Bulgarian newspapers at that time.
-%
-% Computer implementations
-% ========================
-%
-% Mathematical analysis of the Bulgarian hyphenation
-% --------------------------------------------------
-%
-% The earliest mathematical analysis of the Bulgarian hyphenation rules
-% belongs to Veska Noncheva.[^1] In 1988 she proposed a mathematical
-% formalisation of the hyphenation rules in a table with 22 rows.[^2]
-%
-% [^1]: <http://www.researchgate.net/profile/Veska_Noncheva>
-%
-% [^2]: Ðончева Ð’. Ðлгоритъм за автоматично пренаÑÑне на думи в
-% българÑÐºÐ¸Ñ ÐµÐ·Ð¸Ðº. Математика и математичеÑко
-% образование. Сб. доклади на 17. ПК на СМБ. С., БÐÐ, 1988, 479-482.
-%
-% In the same year Eugene Belogay[^3] proposed an alternative
-% formalisation with only 9 rules.[^4] Belogay proved that his rules are
-% consistent and that they form a minimal set. The rules of Belogay
-% have negative character – every hyphenation which is not forbidden by
-% a rule is possible hyphenation.
-%
-% [^3]: <http://www.linkedin.com/in/belogay>
-%
-% [^4]: Белогай Е. Ðлгоритъм за автоматично пренаÑÑне на думи. Компютър
-% за Ð²Ð°Ñ (1988) 3, 12-14.
-%
-% The following are the first 7 rules, as formulated by Belogay:
-%
-% 1. Б-Ð
-% 2. Ð-ББ
-% 3. Б-ТТ, ТТ-Б
-% 4. ÐÐÐ-Б
-% 5. й-ББ
-% 6. Б-ь
-% 7. д-ж
-%
-% Here Рdenotes an arbitrary vowel letter, Б denotes an arbitrary
-% consonant letter (including ь and й), ТТ denotes a sequence of two
-% equal consonant letters and the letters й, ь, д and ж denote
-% themselves. For example the rule "Б-Ð" says that we are not permitted
-% to separate a consonant letter from immediately following vowel
-% letter.
-%
-% The eighth rule of Belogay says that hyphenation is forbidden before
-% the first and after the last vowel letter. The ninth rule of Belogay
-% says that hyphenation is forbidden immediately after the first or
-% immediately before the last letter of the word.
-%
-% Notice that is is very easy to translate the rules of Belogay in the
-% form, required for the hyphenation algorithm of Knuth and Liang used
-% in TeX.[^a] Let us remind that this algorithm matches the word with a
-% set of string patterns in which the odd numbers say hyphenation is
-% permitted in this position and even numbers say the hyphenation is
-% forbidden. When two patterns give conflicting numbers for the same
-% position, then the greater number wins.
-%
-% First, since the rules of Belogay are negative (they say where
-% hyphenation is forbidden, not where it is permitted), we have to
-% permit the hyphenation everywhere:
-%
-% 1. Ð1
-% 2. Б1
-%
-% Then, the first seven rules of Belogay obtain the form:
-%
-% 1. Б2Ð
-% 2. Ð2ББ
-% 3. Б2ТТ ТТ2Б
-% 4. ÐÐÐ2Б
-% 5. й2ББ
-% 6. Б2ь
-% 7. д2ж
-%
-% Since no Bulgarian word starts with more that four consonants and no
-% Bulgarian word ends with more than three consonants, the eighth rule
-% of Belogay can be translated in the following way:
-%
-% 1. .Б2
-% 2. .ББ2
-% 3. .БББ2
-% 4. 2Б.
-% 5. 2ББ.
-%
-% The ninth rule of Belogay means that left and right hyphen mins should
-% be set to 2.
-%
-% The work of Eugene Belogay was not limited to merely a mathematical
-% analysis of the Bulgarian hyphenation rules. In his paper he
-% published a short algorithm in Pascal which implements these rules.
-% It didn't take long for this algorithm to be used in various text
-% processing software. The algorithm of Belogay was famous for many
-% years. Even as late as 1997 in one book about TeX, the author didn't
-% care to give any explanations but simply wrote about "the algorithm of
-% Belogay" as something well known to the reader.[^5]
-%
-% [^a]: Liang, Franklin Mark. Word Hy-phen-a-tion by
-% Com-put-er (Doctoral Dissertation). Stanford University, 1983
-%
-% [^5]: ВаÑилев Ð’. УлтимативниÑÑ‚ ТеХ. УдоволÑтвието да правим
-% предпечатна подготовка Ñами. СофиÑ, Интела, 1997, 36
-%
-% Bulgarian hyphenation in TeX
-% ----------------------------
-%
-% One unfortunate design decision of Knuth was that the hyphenation
-% algorithm of TeX applied the hyphenation patterns not to the input
-% character codes but to the internal codes of the glyphs in the font.
-% This created a problem for the Cyrillic languages because in TeX the
-% Cyrillic fonts did not have standardised encoding. Perhaps this is
-% one of the reasons why the earliest implementations of the Bulgarian
-% hyphenation in TeX did not rely on the internal hyphenation algorithm
-% of TeX. Instead, external tools were used to insert soft hyphens in
-% all Bulgarian words. For example such a tool would replace the word
-% ÑричкопренаÑÑне /srichkoprenasyane/ with
-% Ñрич\\-коп\\-ре\\-на\\-ÑÑ\\-не /srich\\-kop\\-re\\-na\\-sya\\-ne/.
-% The saying "To every disadvantage there is a corresponding advantage"
-% is true – since Cyrillic and Latin letters use different character
-% codes, an external tool could easily insert soft hyphens in all
-% Bulgarian words while leaving the TeX commands intact.
-%
-% The earliest known attempt to use the hyphenation algorithm of TeX for
-% Bulgarian was made by Ognyan Tonev in 1990.[^6] He described his work
-% as "a not very good translation of the rules. I work in this
-% direction. But I don't have a 100% working complect of patterns. So,
-% the copy I send to you[^7] is only a beta-version." The hyphenation
-% patterns of Tonev don't work correctly and it seems he never completed
-% his work.
-%
-% [^6]: The author of this text was unable to find current information
-% about Ognyan Tonev in Internet. Apparently in 1990 he worked in
-% the Center of Informatics and Computer Technology of the Bulgarian
-% Academy of Sciences.
-%
-% [^7]: To Yannis Haralambous,
-% <http://perso.telecom-bretagne.eu/yannisharalambous>
-%
-% The first usable Bulgarian hyphenation patterns for TeX were developed
-% by Georgi Boshnakov[^8] in 1994. In order to solve the encoding
-% problem, Boshnakov had developed TeX fonts supporting the MIK encoding
-% (the prevalent encoding at that time in Bulgaria). This allowed him
-% to introduce a fully working implementation only a few months after
-% LaTeX2e became the official LaTeX version. Later Boshnakov modified
-% his work with the Babel system. The hyphenation patterns of Boshnakov
-% did their job well enough, so that for almost quarter a century after
-% their initial creation, they remained the only Bulgarian hyphenation
-% patterns in the standard distributions of TeX and CTAN.
-%
-% [^8]: <http://www.maths.manchester.ac.uk/~gb/>
-%
-% There are some similarities between the patterns of Boshnakov and the
-% patterns of Belogay. The following are the main differences.
-%
-% First, Boshnakov used an ingenious and more compact implementation of
-% the second and the third rule. Instead of {Ð2ББ, Б2ТТ, ТТ2Б}, or
-% 8×22×22+22×22+22×22=4840 patterns in total, Boshnakov has patterns of
-% the form 2Б3Б2 and 4Т3Т4, or only 22×22=484 in total, with the same
-% effect.
-%
-% The second main difference between the patterns of Boshnakov and the
-% patterns of Belogay concerns the letter combination дж /dzh/. In
-% Bulgarian this letter combination can denote either a single
-% consonant, or a sequence of two consonants and the hyphenation rules
-% change respectively. Unfortunately, it is impossible to know the
-% meaning of дж /dzh/ without a vocabulary. The solution of Belogay was
-% a cautious one – his rules do the hyphenation in a way which will be
-% correct regardless of whether дж /dzh/ is a single consonant or a
-% sequence of two consonant. On the other hand, the approach of
-% Boshnakov is a bold one – since дж /dzh/ is more often a single
-% consonant, his rules assume that it is always a single consonant. The
-% number of the cases when this decision leads to bad hyphenations is
-% insignificant in comparison with the cases in which we obtain improved
-% hyphenation.
-%
-% The third main difference between the patterns of Boshnakov and the
-% patterns of Belogay concerns the eighth rule – its implementation in
-% the rules of Boshnakov is rather limited which leads to wrong
-% hyphenations like бри-дж /bri-dzh/. A full implementation of this
-% rule would require 11660 patterns in total and this would be too much
-% for the computers in 1994.
-%
-% Later developments
-% ------------------
-%
-% In 1995 Atanas Topalov defended a Masters thesis in the Faculty of
-% Mathematics and Informatics at Sofia University titled "Algorithms and
-% software about text processing".[^9] One of the main topics in his
-% thesis was the Bulgarian hyphenation. Topalov criticised vehemently
-% the official hyphenation rules and their total disregard of the
-% morphology. He wrote:
-%
-% > If we look at the history of the problems of the hyphenation, we
-% > will discover something very strange. Instead of the expected
-% > involvement with the depths and aspiration for more admissible and
-% > satisfactory style, we can find a growing tendency for
-% > simplification. One unpleasant discovery is that the development of
-% > the hyphenation software stays firmly on the principle "let us do
-% > the easiest thing". The earliest works which have been studied are
-% > from 1978. It turned out that they present the best approach
-% > concerning the automated hyphenation. The authors have chosen the
-% > most difficult but the most correct (from literary point of view)
-% > method for hyphenation, namely the morphological approach.
-%
-% Topalov proposed his own hyphenation algorithm. The hyphenation it
-% generated was smooth and easy to read. One obvious defect of the
-% algorithm of Topalov was that it contradicted the official hyphenation
-% rules at that time. One can argue, however, that his algorithm is
-% compatible with the current hyphenation rules.
-%
-% [^9]: The thesis of Atanas Topalov can be accessed at the author's
-% website <http://www.mind-print.com>
-%
-% In 1999 Svetla Koeva[^10] wrote a paper about the automated Bulgarian
-% hyphenation.[^11] At that time she was a junior member of the
-% Department of Computational Linguistics at the Institute for Bulgarian
-% Language but now she is a director of the whole institute. The paper
-% of Koeva contains a list of hyphenation patterns which can be used as
-% a basis of automated hyphenation. In 2004 with the help of Stoyan
-% Mihov[^12] the rules of Koeva were formalised with regular relations
-% and rewriting rules. They were implemented in a software product
-% named ItaEst which provided Bulgarian hyphenation and grammar checking
-% for various software products of Microsoft and Apple.
-%
-% [^10]: <http://dcl.bas.bg/svetla_koeva/>
-%
-% [^11]: Коева, Светла. Правила за пренаÑÑне на чаÑти от думите на нов
-% ред. БългарÑки език. 1999/2000, 1, 84-86
-%
-% [^12]: <http://lml.bas.bg/~stoyan/>
-%
-% The main differences between the hyphenation of Koeva and the official
-% hyphenation rules effective after 2012 is that the separation of a
-% long sequence of consonants between two vowels is done according to
-% the rules valid before 1983. For example Ñе-Ñтра /se-stra/ and
-% ай-Ñберг /ay-sberg/ are permitted. The main difference between the
-% hyphenation of Koeva and the official hyphenation rules effective
-% before 1983 is that the rules of Koeva disregard the morphology of the
-% words. The following rule of Koeva is specific: in a sequence of two
-% sonorant consonants between two vowels, we are permitted to separate
-% the first vowel from the first consonant, for example материа-лна
-% /materia-lna/.
-%
-% In 2000 Anton Zinoviev[^13] created new hyphenation patterns for TeX.
-% He didn't know about the previous work of Boshnakov and he didn't
-% bother to make his work available in the various TeX distributions and
-% CTAN. His work was used mostly by the local Linux enthusiasts and the
-% colleagues of Zinoviev. In 2001 Radostin Radnev[^14] created a free
-% grammar dictionary of Bulgarian[^15] where he used the hyphenation
-% patterns of Zinoviev. From there the work of Zinoviev propagated to
-% OpenOffice, LibreOffice and various online dictionaries, including
-% <http://bg.wiktionary.org> and <http://rechnik.chitanka.info>.
-%
-% [^13]: The author of this text.
-%
-% [^14]: <http://bg.linkedin.com/in/radostinradnev>
-%
-% [^15]: <http://bgoffice.sourceforge.net/>
-%
-% The following are the main differences between the hyphenation of
-% Zinoviev and the hyphenation of Boshnakov.
-%
-% First, the eighth rule of Belogay is fully implemented.
-%
-% Second, the rules of Zinoviev try to detect when the letters дж /dzh/
-% (and дз /dz/) denote a single consonant and when they denote a
-% sequence of two consonants. By default, however, Zinoviev (like
-% Boshnakov) assumes that дж /dzh/ is a single consonant and hyphenates
-% accordingly.
-%
-% Third, the rules of Zinoviev disable some cases of unpleasant
-% hyphenations:
-%
-% 1. In a consonant sequence like Ñ‚ÑÑ‚ /tst/, the two equal consonants Ñ‚
-% /t/ are separated. For example братÑÑ‚-во /bratst-vo/ is forbidden
-% while братÑ-тво /brats-tvo/ and брат-Ñтво /brat-stvo/ are
-% permitted.
-% 2. The hyphenation is forbidden after a sonorant consonant following
-% an obstruent consonant. For example отм-ра /otm-ra/ is forbidden
-% and от-мра /ot-mra/ is permitted.
-% 3. The hyphenation separates two consecutive kindred voiced/voiceless
-% consonants. For example Ñубп-родукт /subp-roduct/ is forbidden and
-% Ñуб-продукт /sub-product/ is permitted.
-%
-% At the start of his work on the Bulgarian hyphenation, Zinoviev had
-% the opportunity to discuss the hyphenation with Svetla Koeva. He
-% remembers that some cases of unpleasant hyphenation were suggested to
-% him by Koeva. Unfortunately, he hasn't taken notes so now he doesn't
-% know which cases of unpleasant hyphenation have been suggested to him
-% by Koeva and which are his own findings.
-%
-% The present work
-% ================
-%
-% Motivation
-% ----------
-%
-% The present work was carried out on the initiative of the leader of
-% the Bulgarian localisation team of Mozilla, who contacted Zinoviev,
-% Boshnakov and the maintainers of the TeX hyphenation patterns.[^17]
-% This work pursues the following main objectives:
-%
-% 1. to update the hyphenation patterns in accordance with the current
-% hyphenation rules;
-% 2. to generate the hyphenation patterns by a publicly available
-% script;
-% 3. to make the hyphenation patterns customisable;
-% 4. to provide documentation for the future developers.
-%
-% [^16]: <http://mozillians.org/en-US/u/stoyan/>
-%
-% [^17]: <http://hyphenation.org>
-%
-% The current official hyphenating rules for Bulgarian are rather
-% liberal. Very often, in a long sequence of consonants we are
-% permitted to split the word at any position, for example аген-Ñ‚-Ñ-Ñ‚-во
-% /agen-t-s-t-vo/. This is prone to many unusual and unexpected results
-% that interrupt the attention of the reader or deceive his expectations
-% during the movement of his eyes to the next line. On the other hand,
-% in order to produce nice justified paragraphs there is no need for so
-% many hyphenation possibilities. It would be sufficient even if only
-% one possible separation between any two syllables was permitted.
-%
-% Therefore, it makes sense to use a more restrictive version of the
-% Bulgarian hyphenation, one which eliminates the controversial cases of
-% hyphenation. Only when typesetting a Bulgarian text in a very narrow
-% newspaper column it will be appropriate to use a more liberal version.
-% It should be noted that some specialised English dictionaries also
-% separate the word-division positions into two categories – preferred
-% positions and less recommended positions.
-%
-% There are two methods to determine the optimal division within a
-% sequence of consonants between two vowels:
-%
-% * we can hyphenate according to the syllables in the word or
-% * we can hyphenate morphologically.
-%
-% Hyphenation according to the syllables in the word
-% --------------------------------------------------
-%
-% Let us look at the properties of the Bulgarian syllables. All
-% syllables have the following structure:
-%
-% > onset - nucleus - code
-%
-% The nucleus in Bulgarian is always a vowel. Both the onset and the
-% code are (possibly empty) sequences of consonants.
-%
-% The Bulgarian syllables adhere to the Sonority Sequencing Principle.
-% According to this principle, the consonants within the onset have
-% raising sonority and the consonants within the code have decreasing
-% sonority.
-%
-% Several grammar books agree that the following sonority scale is valid
-% for Bulgarian:
-%
-% > voiceless obtrusive < voiced obtrusive < sonorant consonant < vowel
-%
-% According to the investigations of the author, the only exception to
-% this law is due to the letter в /v/ which is a voiced obtrusive but it
-% can be used also as a voiceless obtrusive. This exception is due to a
-% spelling particularity of the Bulgarian language. Whenever the letter
-% в /v/ seemingly violates the Sonority Sequencing Principle, in the
-% spoken language this letter is read as Ñ„ /f/, that is as a voiceless
-% obtrusive (for example the word отвÑÑкъде /otvsyakade/ is read as
-% отфÑÑкъде /otfsyakade/).[^18]
-%
-% [^18]: No Primitive Slavonic word contains the phoneme Ñ„ /f/.
-% Therefore, we can safely assume that in the Primitive Slavonic
-% language the consonant Ñ„ /f/ was a positional variant of the consonant
-% в /v/.
-%
-% The author has found that the sonorant consonants in Bulgarian have
-% their own sonority scale:
-%
-% > м /m/ < н /n/ < л /l/ < р /r/ < й /y/
-%
-% Only a few words such as жанр /zhanr/ and химн /himn/ violate this
-% scale. Such words are always loan-words and their pronunciation is
-% somewhat problematic for the native Bulgarian speakers.
-%
-% In addition to the Sonority Sequencing Principle, the consonant
-% clusters within the Bulgarian syllable adhere to the following
-% additional principles:
-%
-% 1. Both in the onset and in the code, the labial and dorsal plosives
-% precede the coronal plosives and affricates.
-% 2. If the onset or the code contains two plosives or affricates, then
-% there are no fricatives between them. Few words with the Latin
-% root 'text' are exceptions: контекÑÑ‚ /kontekst/.
-% 3. If the onset or the code contains two fricatives other than в /v/,
-% then there are no plosives or affricates between them.
-% 4. If the onset or the code contains two plosives or affricates, then
-% they both have equal sonority (both are voiced, or both are
-% voiceless).
-% 5. If the onset or the code contains two fricatives other than в /v/,
-% then they both have equal sonority (both are voiced, or both are
-% voiceless).
-% 6. Neither the onset, nor the code may contain two labial plosives, or
-% two coronal plosives or affricates or two dorsal plosives.
-% 7. Neither the onset, nor the code may contain two equal consonants
-% with the exception of в /v/ (for example втвърди /vtvardi/).[^19]
-%
-% [^19]: Actually, the letter в /v/ is not a real exception because in
-% all such cases this letter denotes two different consonants – в /v/
-% and ф /f/. Only in the Russian loan-word взвод /vzvod/ the two
-% letters в /v/ denote a repeating consonant в /v/.
-%
-% From all these properties of the Bulgarian syllable we can deduce the
-% following hyphenation rules:
-%
-% 1. In a sequence МК where М is a consonant with higher sonority than
-% K, we are not permitted to hyphenate before М. Exception: when М
-% is в /v/ and К is a voiceless consonant.
-% 2. In a sequence КМ where М is a consonant with higher sonority than
-% K, we are not permitted to hyphenate after М.
-% 3. In a sequence KBT where K and T are plosives or affricates and B is
-% fricative, we separate K from T.
-% 4. In a sequence CKB where K is a plosive or affricate and C and B are
-% fricatives other than в /v/, we separate C from B.
-% 5. If in a consonant sequence a coronal plosive or affricate Т is
-% followed by a labial or dorsal plosive К, then we separate Т from К.
-% 6. If a consonant sequence contains two plosives or affricates, one
-% voiced and one voiceless, then we separate them.
-% 7. If a consonant sequence contains two fricatives other than в /v/,
-% one voiced and one voiceless, then we separate them.
-% 8. If a consonant sequence contains two labial plosives or two coronal
-% plosives or affricates or two dorsal plosives then they are
-% separated.
-% 9. If a consonant sequence contains two equal consonants (not
-% necessarily consecutive), then they are separated.
-%
-% With so many prohibitive rules, a question arises: if we apply all
-% these rules, aren't we going to eliminate too many hyphenation
-% possibilities? The answer is no. It can be demonstrated that between
-% any two consecutive syllables at least one separation point will be
-% permitted.
-%
-%
-% Hyphenation according to the morphology
-% ---------------------------------------
-%
-% Between 1983 and 2012 the official orthographic rules of the
-% Bulgarian language forbade morphologically based hyphenation. After
-% 2012 such hyphenation is permitted (but not obligatory).
-%
-% The most important case when it is very desirable to use
-% morphologically based hyphenation is the case of the compound words.
-% Divisions such as авток-луб /avtok-lub/ and вакуу-мапарат
-% /vakuu-maparat/ are extremely irritating even if they are formally
-% correct. Unfortunately, we do not have a vocabulary of the compound
-% Bulgarian words that would permit us to produce rules for automated
-% hyphenation. Therefore, the current Bulgarian hyphenation patterns do
-% not attempt to apply morphological hyphenation to such words.
-%
-% Second in importance (but far more significant in terms of numbers) is
-% the case with the word prefixes. While the eyes of the reader still
-% look at the start of the word, the word is still unknown to him. At
-% this point, it is very important not to deceive his expectations. For
-% example, when the reader sees над- /nad-/ at the end of the line, he
-% will expect that this is the prefix над- /nad-/ with semantics 'attain
-% more than'. This expectation will be fooled if this wasn't really a
-% prefix, but a deceiving (while formally correct) hyphenation of the
-% word Ð½Ð°Ð´Ñ€ÐµÐ¼Ñ /nadremya/ 'have dozed enough' where the real prefix is
-% not над- /nad-/ but на- /na-/ with semantics 'achieve a state after
-% accumulation'. Such hyphenation distracts the reader and makes the
-% reading more difficult.
-%
-% Third in importance is the case with the word suffixes. With respect
-% to the hyphenation rules we can divide the suffixes into three
-% categories:
-%
-% 1. Suffixes starting with a vowel, for example -ар /-ar/. It is not
-% appropriate to follow the morphology with such suffixes because
-% this will contradict the whole hyphenation tradition of the
-% Bulgarian language. For example крав-ар /krav-ar/ is unwarranted.
-% 2. Suffixes starting with one consonant, for example -ка /-ka/.
-% Usually with such suffixes the syllable boundary in the word
-% coincides with morpheme boundary so no specific cares are
-% necessary, for example кравар-ка /kravar-ka/. The exceptions are
-% rare, for example: обек-тната /obek-tnata/ instead of обект-ната
-% /obekt-nata/.
-% 3. Suffixes starting with more than one consonant (-Ñки /-ski/, -Ñтво
-% /-stvo/). It is possible to use morphological hyphenation rules
-% with such suffixes.
-%
-% Even if it is possible to use morphological hyphenation with the
-% suffixes of the third category, it turns out, this is not as useful as
-% it is with the case of the prefixes. When the eyes of the reader have
-% reached this part of the word, the word is already more or less known
-% to the reader. Therefore, at this point the morphological hyphenation
-% does not provide any significant advantages in comparison to the
-% simpler hyphenation based only on the syllables in the word. Consider
-% for example the word геройÑ-тво /geroys-tvo/ with suffix -Ñтво
-% /-stvo/. When the reader sees геройÑ- /geroys-/ at the end of the
-% line this will give him an early clue that the suffix of the word is
-% -Ñтво /-stvo/. Such non-morphological hyphenation does not deceive
-% the expectations of the reader. On the contrary, it makes the reading
-% easier because it gives clues to the reader about what follows on the
-% next line.
-%
-% Because of these considerations, the current Bulgarian hyphenation
-% patterns do not attempt to use morphological hyphenation with respect
-% to the suffixes of the words. Though it would be useful to implement
-% rules about the suffixes of the second cateogory. Hopefully, some
-% future version will have such rules.
-%
-% Occasionally,[^20] a fourth morphological requirement is stated: that
-% hyphenation should conform with the boundary between the word and the
-% definitive articles -та /-ta/ and -те /-te/ (postfixed in Bulgarian).
-% There is no need to pay attention to this rule because it seems to be
-% satisfied by its own nature. The author has searched in a dictionary
-% with over 860000 Bulgarian words for cases when the hyphenation rules
-% would hyphenate badly with respect to the definitive article. He was
-% unable to find even one such case with the hyphenation rules valid
-% after 1983 and only about 10 cases with the rules valid before 1983
-% (one of them is живопи-Ñта /zhivopi-sta/ instead of живопиÑ-та
-% /zhivopis-ta/).
-%
-% One unavoidable characteristic of any morphologically based automated
-% hyphenation is that it can create wrong hyphenations. Because of
-% this, one useful option is to use the morphology in a safe way – to
-% use it in order to forbid bad hyphenations but to create no new
-% hyphenation possibilities solely on the basis of the morphology.
-%
-% Take for example the word Ð´Ð¾Ð·Ñ€ÐµÑ /dozreya/ 'ripen fully'. According
-% to the phonological rules, we should hyphenate it as доз-реÑ
-% /doz-reya/. According to the morphology, however, we should hyphenate
-% as до-Ð·Ñ€ÐµÑ /do-zreyq/ because this word is formed with the prefix до-
-% /do-/ with semantics 'complete or supplement' and this semantics would
-% be lost if the reader sees доз- /doz-/ at the end of the line.
-% Therefore, there are three methods to hyphenate this word:
-%
-% 1. доз-Ñ€ÐµÑ /doz-reya/ when morphology is not used;
-% 2. до-Ð·Ñ€ÐµÑ /do-zreya/ when morphology is fully used;
-% 3. Ð´Ð¾Ð·Ñ€ÐµÑ /dozreya/ (no hyphenation) when morphology is used in a safe
-% way.
-%
-% The option to use the morphology in a safe way is very attractive when
-% the software uses a smart line-breaking algorithm which can produce
-% good results even with less hyphenation possibilities. TeX is one
-% such software. It should be noted that this option does not eliminate
-% too many hyphenation possibilities because the morpheme boundaries
-% most of the time are also syllable boundaries.
-%
-% [^20]: ПравопиÑен и правоговорен наръчник. СъÑтав. Иван Хаджов,
-% Цв. Минков; Ред. Ив. Хаджов и др. СофиÑ, Бълг. кн., 1945
-%
-% The following are results of a statistics about the quality of the
-% morphological rules (the number after the sign ± is the expected
-% standard deviation of our estimations):
-%
-% With the option `--morphology`:
-%
-% * in 0.1% ±0.3% of the dictionary words the morphological patterns
-% create very wrong hyphenation;
-% * in 89.8% ±0.1% of the dictionary words the morphological patterns
-% hyphenate identically with the case when no morphology patterns are
-% used;
-% * in 0.3% ±0.2% of the dictionary words the morphological patterns
-% hyphenate differently in comparison to the case when no morphology
-% patterns are used and the word is hyphenated in a way which
-% contradicts the morphology;
-% * in 0.6% ±0.1% of the dictionary words the morphological patterns
-% hyphenate differently in comparison to the case when no morphology
-% patterns are used and there is a possible hyphenation which is
-% compatible with the word morphology but which is nevertheless
-% forbidden by the morphology patterns.
-%
-% With the option `--safe-morphology`:
-%
-% * in 0% of the dictionary words the morphological patterns create very
-% wrong hyphenation;
-% * in 90.0% ±0.1% of the dictionary words the morphological patterns
-% hyphenate identically with the case when no morphology patterns are
-% used;
-% * in 0.3% ±0.2% of the dictionary words the morphological patterns
-% hyphenate differently in comparison to the case when no morphology
-% patterns are used and the word is hyphenated in a way which
-% contradicts the morphology;
-% * in 0.6% ±0.1% of the dictionary words the morphological patterns
-% hyphenate differently in comparison to the case when no morphology
-% patterns are used and there is a possible hyphenation which is
-% compatible both with the word morphology and with the syllable
-% boundaries but which is nevertheless forbidden by the morphology
-% patterns.
-%
-% Notice that the morphological patterns create a different hyphenation
-% only in about 10% of the words. The following explanation can be
-% given for this surprising fact. First, the natural evolution of the
-% human languages tends to simplify the complex sequences of consonants.
-% Therefore, no morpheme contains a complex sequence of consonants. And
-% second, the Bulgarian orthography is morphological. This means that
-% the morphemes are written according to their actual pronunciation,
-% however the simplifications in the spoken languages which take place
-% at the morpheme boundaries are not taken into account in the
-% orthography. The independent operation of these two factors leads to
-% the result that most of the time the morpheme boundaries coincide with
-% the conventional syllable boundaries. The main exception to this is
-% when a morpheme starts with a vowel, in this case its syllable will
-% include one or more consonants of the preceeding morpheme. The second
-% exception is when a morpheme ends with a vowel and the next morpheme
-% starts with a sequence of two or more consonants.
-%
-% Usage of the script `hyph-bg.sh`
-% --------------------------------
-%
-% The `hyph-bg.sh` is all-in-one script which can generate both
-% documentation (this text) and Bulgarian hyphenation patterns. When
-% given the option `--help` the script gives short usage instructions:
-%
-% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-% hyph-bg.sh --help
-% Show this info
-% hyph-bg.sh [--doc-html | --doc-latex | --doc-txt]
-% Print documentation in various formats
-% hyph-bg.sh [other options]
-% Generate Bulgarian hyphenation patterns
-%
-% Options when generating hyphenation patterns:
-%
-% --standalone-tex
-% Produce hyphenation patterns for TeX with \patterns{ ... }.
-%
-% --no-hyphen-mins
-% Hyphenation patterns which do not require hyphen mins.
-% Otherwise: both left and right hyphen mins should be set to 2.
-%
-% --safe-dz
-% Do not try to guess whether DZ is a single consonant or not.
-% Only use hyphenation which will be correct in both cases.
-%
-% --permissible
-% Permit any formally correct hyphenation, including unnatural
-% divisions, such as studen-tstvo. Useful for educational tools
-% or when typesetting Bulgarian text in a very short column.
-%
-% --morphology
-% Apply morphology when hyphenating, for example: za-dvizhvam.
-% May hyphenate incorrectly in some cases.
-%
-% --safe-morphology
-% Apply morphology when hyphenating. Never hyphenates incorrectly
-% but may prohibit some correct hyphenations.
-%
-% --no-morphology
-% Disregard the morphology. Default.
-%
-% --1945
-% Hyphenate according to the rules effective between 1945 and 1982
-%
-% --1983
-% Hyphenate according to the rules effective between 1983 and 2011
-%
-% --2012
-% Hyphenate according to the rules effective after 2012. Default.
-% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-%
-% The following are the recommended ways to generate hyphenation
-% patterns by this script:
-%
-% `hyph-bg.sh --standalone-tex --safe-morphology`
-% : For TeX. Apply the morphology in a safe way when the software
-% uses a smart line-breaking algorithm.
-%
-% `hyph-bg.sh`
-% : For most other software.
-%
-% `hyph-bg.sh --no-hyphen-mins`
-% : The current versions of Mozilla (as of 2017) seem to ignore the
-% hyphen mins in words that contain a dash.
-%
-% `hyph-bg.sh --morphology`
-% : For professional typography with human proof-reader.
-%
-% `hyph-bg.sh --permissible`
-% : For educational tools and online dictionaries which can show only one
-% kind of hyphenation.
-%
-% Notice that some specialised English dictionaries separate the
-% word-division positions into two categories – preferred positions and
-% less recommended positions. It would be best if the Bulgarian online
-% dictionaries could do the same. For example hyphen "-" can be used to
-% display the preferred positions and dot "." – the less recommended
-% positions. If a word-division position is permitted only by the
-% patterns of `hyph-bg.sh --permissible`, then this position is less
-% recommended.
-%
-
-\message{Bulgarian hyphenation patterns (options: --safe-morphology --standalone-tex, version 21 October 2017)}
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-ca.rme b/Master/texmf-dist/tex/context/patterns/common/lang-ca.rme
index c19e89b1e69..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-ca.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-ca.rme
@@ -1,72 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project from cahyph.tex, whose
-% author has been identified as Gonçal Badenes <g.badenes at ieee.org>
-% (2003-09-08). The licence terms are unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-% Hyphenation patterns for Catalan.
-% This is version 1.11
-% Compiled by Gonçal Badenes and Francina Turon,
-% December 1991-January 1995.
-%
-% Copyright (C) 1991-2003 Gonçal Badenes
-%
-% -----------------------------------------------------------------
-% IMPORTANT NOTICE:
-%
-% This program can be redistributed and/or modified under the terms
-% of the LaTeX Project Public License Distributed from CTAN
-% archives in directory macros/latex/base/lppl.txt; either
-% version 1 of the License, or any later version.
-% -----------------------------------------------------------------
-%
-%%% ====================================================================
-%%% @TeX-hyphen-file{
-%%% author = "Gonçal Badenes",
-%%% version = "1.11",
-%%% date = "15 July 2003",
-%%% time = "15:08:12 CET",
-%%% filename = "cahyph.tex",
-%%% email = "g.badenes@ieee.org",
-%%% codetable = "UTF-8",
-%%% keywords = "TeX, hyphen, catalan",
-%%% supported = "yes",
-%%% abstract = "Catalan hyphenation patterns",
-%%% docstring = "This file contains the hyphenation patterns
-%%% for the catalan language",
-%%% }
-%%% ====================================================================
-%
-% NOTICE: Version 1.11 is identical to version 1.10 (issued on January 17,
-% 1995) except for the updated copyright notice above.
-%
-% The macros used were created for ghyph31.tex by Bernd Raichle (see the
-% German hyphenation pattern files for further details)
-%
-% This patterns have been created using standard, conservative
-% hyphenation rules for catalan. The results have refined running them
-% through patgen. In that way, the number of hits has been increased.
-%
-% These rules produce no wrong patterns (Results checked against the
-% ``Diccionari Ortogr\`afic i de Pron\'uncia'', Enciclop\`edia
-% Catalana. The percentage of valid hyphen misses is lower than 1%
-%
-% Some of the patterns below represent combinations that never
-% happen in Catalan. We have tried to keep them to a minimum.
-%
-% *** IMPORTANT ***
-% \lefthyphenmin and \righthyphenmin should be set to 2 and 2
-% respectively. If you set them below these values incorrect breaks
-% will happen (specially at the beginning of foreign words and words
-% which begin with some prefixes).
-% *** IMPORTANT ***
-%
-% Please report any problem you might have to the authors!!!
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \message{Catalan Hyphenation Patterns `cahyphen' Version 1.11 <2003/07/15>}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-cs.rme b/Master/texmf-dist/tex/context/patterns/common/lang-cs.rme
index 6c6430ab08a..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-cs.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-cs.rme
@@ -1,32 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project from czhyphen.tex and
-% czhyphen.ex, whose author has been identified as Pavel Å eveÄek <pavel at
-% lingea.cz>. The licence terms are unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-%%% ====================================================================
-% This is CZHYPHEN.TEX, containing czech hyphenation patterns.
-% Prepared by:
-% Pavel Å eveÄek
-% Lingea s.r.o., Brno, Czech Republic
-% E-mail: pavel@lingea.cz
-%
-% This is free software; you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation; either version 2 of the License, or
-% (at your option) any later version.
-%
-% This file is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this program; if not, write to the Free Software
-% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-%%% --------------------------------------------------------------------
-% \message {Czech Hyphenation Patterns (Pavel Sevecek, v3, 1995)}
-%\lefthyphenmin=2\righthyphenmin=2
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-cy.rme b/Master/texmf-dist/tex/context/patterns/common/lang-cy.rme
index cd1003d842c..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-cy.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-cy.rme
@@ -1,47 +1,3 @@
% generated by mtxrun --script pattern --convert
-% copyright: Copyright 1996 Yannis Haralambous
-% title: Welsh hyphenation patterns
-% version: 1996
-% notice: >
-% This file is part of the hyph-utf8 package.
-% See http://www.hyphenation.org for more information.
-% license:
-% - This file is available under any of these licences:
-% -
-% name: LPPL
-% status: maintained
-% maintainer: Yannis Haralambous
-% version: 1.0
-% or_later: true
-% url: http://www.latex-project.org/lppl/lppl-1-0.html
-% -
-% name: MIT
-% url: https://opensource.org/licences/MIT
-% text: >
-% Permission is hereby granted, free of charge, to any person
-% obtaining a copy of this software and associated documentation
-% files (the "Software"), to deal in the Software without
-% restriction, including without limitation the rights to use,
-% copy, modify, merge, publish, distribute, sublicense, and/or sell
-% copies of the Software, and to permit persons to whom the
-% Software is furnished to do so, subject to the following
-% conditions:
-%
-% The above copyright notice and this permission notice shall be
-% included in all copies or substantial portions of the Software.
-%
-% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-% OTHER DEALINGS IN THE SOFTWARE.
-% changes:
-% - 1996 - last change to patterns
-% - 2008 - inclusion into hyph-utf8 and file rename (cyhyph.tex -> hyph-cy.tex)
-% - June 2011 - added LPPL licence
-% - March 2016 - added MIT licence
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-da.rme b/Master/texmf-dist/tex/context/patterns/common/lang-da.rme
index 382761f46f7..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-da.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-da.rme
@@ -1,42 +1,3 @@
% generated by mtxrun --script pattern --convert
-% copyright: Copyright 1994 Frank Jensen
-% title: Hyphenation patterns for Danish
-% version: 2011-01-11
-% notice: >
-% This file is part of the hyph-utf8 package.
-% See http://www.hyphenation.org for more information.
-% license:
-% - This file is available under any of these licences:
-% -
-% name: LPPL
-% version: 1.3
-% or_later: true
-% url: http://www.latex-project.org/lppl/lppl-1-3.html
-% -
-% name: MIT
-% url: https://opensource.org/licenses/MIT
-% text: >
-% Permission is hereby granted, free of charge, to any person
-% obtaining a copy of this software and associated documentation
-% files (the "Software"), to deal in the Software without
-% restriction, including without limitation the rights to use,
-% copy, modify, merge, publish, distribute, sublicense, and/or sell
-% copies of the Software, and to permit persons to whom the
-% Software is furnished to do so, subject to the following
-% conditions:
-%
-% The above copyright notice and this permission notice shall be
-% included in all copies or substantial portions of the Software.
-%
-% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-% OTHER DEALINGS IN THE SOFTWARE.
-% changes:
-% - 2011-01-11 - remove support for OT1 encoding
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-de.rme b/Master/texmf-dist/tex/context/patterns/common/lang-de.rme
index 241a9312c10..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-de.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-de.rme
@@ -1,73 +1,3 @@
% generated by mtxrun --script pattern --convert
-% title: German Hyphenation Patterns (Reformed Orthography, 2006)
-%
-% notice: TeX-Trennmuster für die reformierte (2006) deutsche Rechtschreibung
-%
-% version: 2018-03-31
-%
-% authors:
-% -
-% name: Deutschsprachige Trennmustermannschaft
-% contact: trennmuster@dante.de
-%
-% copyright: Copyright (c) 2013-2018
-% Stephan Hennig, Werner Lemberg, Günter Milde,
-% Sander van Geloven, Georg Pfeiffer, Gisbert W. Selke,
-% Tobias Wendorf
-%
-% licence:
-% name: MIT
-% url: http://opensource.org/licenses/mit-license.php
-% text: >
-% Permission is hereby granted, free of charge, to any person
-% obtaining a copy of this software and associated documentation
-% files (the “Softwareâ€), to deal in the Software without
-% restriction, including without limitation the rights to use,
-% copy, modify, merge, publish, distribute, sublicense, and/or
-% sell copies of the Software, and to permit persons to whom the
-% Software is furnished to do so, subject to the following
-% conditions:
-%
-% The above copyright notice and this permission notice shall be
-% included in all copies or substantial portions of the Software.
-%
-% THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND,
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-% OTHER DEALINGS IN THE SOFTWARE.
-%
-% source: http://repo.or.cz/w/wortliste.git?a=commit;h=8b9a428c271e064f0047a364c532308f0fd4051f
-%
-% language:
-% name: German, reformed spelling
-% tag: de-1996
-%
-% hyphenmins:
-% generation:
-% left: 2
-% right: 2
-% typesetting:
-% left: 2
-% right: 2
-%
-% ===========================================================================
-
-\message{German Hyphenation Patterns (Reformed Orthography, 2006) `dehyphn-x' 2018-03-31 (WL)}
-
-%
-% The used patgen parameters are
-%
-% 1 1 | 2 5 | 1 1 1
-% 2 2 | 2 5 | 1 2 1
-% 3 3 | 2 6 | 1 1 1
-% 4 4 | 2 6 | 1 4 1
-% 5 5 | 2 7 | 1 1 1
-% 6 6 | 2 7 | 1 6 1
-% 7 7 | 2 13 | 1 4 1
-% 8 8 | 2 13 | 1 8 1
-
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-deo.rme b/Master/texmf-dist/tex/context/patterns/common/lang-deo.rme
index 87bf0b9aeeb..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-deo.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-deo.rme
@@ -1,73 +1,3 @@
% generated by mtxrun --script pattern --convert
-% title: German Hyphenation Patterns (Traditional Orthography)
-%
-% notice: TeX-Trennmuster für die traditionelle deutsche Rechtschreibung
-%
-% version: 2018-03-31
-%
-% authors:
-% -
-% name: Deutschsprachige Trennmustermannschaft
-% contact: trennmuster@dante.de
-%
-% copyright: Copyright (c) 2013-2018
-% Stephan Hennig, Werner Lemberg, Günter Milde,
-% Sander van Geloven, Georg Pfeiffer, Gisbert W. Selke,
-% Tobias Wendorf
-%
-% licence:
-% name: MIT
-% url: http://opensource.org/licenses/mit-license.php
-% text: >
-% Permission is hereby granted, free of charge, to any person
-% obtaining a copy of this software and associated documentation
-% files (the “Softwareâ€), to deal in the Software without
-% restriction, including without limitation the rights to use,
-% copy, modify, merge, publish, distribute, sublicense, and/or
-% sell copies of the Software, and to permit persons to whom the
-% Software is furnished to do so, subject to the following
-% conditions:
-%
-% The above copyright notice and this permission notice shall be
-% included in all copies or substantial portions of the Software.
-%
-% THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND,
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-% OTHER DEALINGS IN THE SOFTWARE.
-%
-% source: http://repo.or.cz/w/wortliste.git?a=commit;h=8b9a428c271e064f0047a364c532308f0fd4051f
-%
-% language:
-% name: German, traditional spelling
-% tag: de-1901
-%
-% hyphenmins:
-% generation:
-% left: 2
-% right: 2
-% typesetting:
-% left: 2
-% right: 2
-%
-% ===========================================================================
-
-\message{German Hyphenation Patterns (Traditional Orthography) `dehypht-x' 2018-03-31 (WL)}
-
-%
-% The used patgen parameters are
-%
-% 1 1 | 2 5 | 1 1 1
-% 2 2 | 2 5 | 1 2 1
-% 3 3 | 2 6 | 1 1 1
-% 4 4 | 2 6 | 1 4 1
-% 5 5 | 2 7 | 1 1 1
-% 6 6 | 2 7 | 1 6 1
-% 7 7 | 2 13 | 1 4 1
-% 8 8 | 2 13 | 1 8 1
-
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-es.rme b/Master/texmf-dist/tex/context/patterns/common/lang-es.rme
index 39dffb94635..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-es.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-es.rme
@@ -1,44 +1,3 @@
% generated by mtxrun --script pattern --convert
-% GUIONIZADO DE PALABRAS
-% ~~~~~~~~~~~~~~~~~~~~~
-% hyph-es.tex 4.7
-%
-% License: MIT/X11
-%
-% Copyright (c) 1993, 1997 Javier Bezos
-% Copyright (c) 2001-2015 Javier Bezos and CervanTeX
-%
-% Permission is hereby granted, free of charge, to any person obtaining a copy
-% of this software and associated documentation files (the "Software"), to deal
-% in the Software without restriction, including without limitation the rights
-% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-% copies of the Software, and to permit persons to whom the Software is
-% furnished to do so, subject to the following conditions:
-%
-% The above copyright notice and this permission notice shall be included in
-% all copies or substantial portions of the Software.
-%
-% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-% SOFTWARE.
-%
-% For further info, bug reports and comments:
-%
-% http://www.tex-tipografia.com/spanish_hyphen.html
-%
-% I would like to thanks Francesc Carmona for his permission
-% to steal parts of his work without restrictions. For his
-% patterns, (c) by Francesc Carmona
-%
-% 2015-11-12
-%
-% _____________________________________________________________
-% Javier Bezos | http://www.cervantex.es/
-% .............................................................
-% TeX y tipografia | http://www.tex-tipografia.com/
-
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-et.rme b/Master/texmf-dist/tex/context/patterns/common/lang-et.rme
index ef916a03798..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-et.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-et.rme
@@ -1,47 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file is part of hyph-utf8 package and resulted from
-% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
-%
-% Source: eehyph.tex (2015-12-22)
-% Author: Een Saar <saar at aai dot ee>
-%------------------------------------------------------------------------------
-% Estonian hyphenation patterns (T1 encoding).
-% Copyright (c) 2004-2015 Enn Saar <saar at aai dot ee>
-%
-% The Estonian pattern data is dual-licensed under the MIT License or
-% the LaTeX Project Public License Version 1.3 or later at your discretion.
-%
-% MIT License (https://opensource.org/licenses/MIT):
-%
-% Permission is hereby granted, free of charge, to any person obtaining a copy
-% of this software and associated documentation files (the "Software"), to deal
-% in the Software without restriction, including without limitation the rights
-% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-% copies of the Software, and to permit persons to whom the Software is
-% furnished to do so, subject to the following conditions:
-%
-% The above copyright notice and this permission notice shall be included in
-% all copies or substantial portions of the Software.
-%
-% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-% THE SOFTWARE.
-%
-% LaTeX Project Public License:
-%
-% The latest version 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
-% 2003/12/01 or later.
-%
-% This work has the LPPL maintenance status "author-maintained".
-% This work consists of this file only.
-%
-% The patterns were generated long ago by applying patgen to
-% an Estonian dictionary; a few patterns were added later manually
-% to prohibit aa-bits type cases.
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-eu.rme b/Master/texmf-dist/tex/context/patterns/common/lang-eu.rme
index 8eeb0e00b32..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-eu.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-eu.rme
@@ -1,59 +1,3 @@
% generated by mtxrun --script pattern --convert
-% copyright: Copyright (c) Juan M. Aguirregabiria 1997, 2008
-% title: Hyphenation patterns for Basque.
-% version: June 2008
-% notice: >
-% This file is part of the hyph-utf8 package.
-% See http://www.hyphenation.org for more information on the package,
-% and http://tp.lc.ehu.es/jma/basque.html for details on Basque hyphenation.
-% license: >
-% Permission is hereby granted, free of charge, to any person obtaining
-% a copy of this file and any associated documentation
-% (the "Data Files") to deal in the Data Files
-% without restriction, including without limitation the rights to use,
-% copy, modify, merge, publish, distribute, and/or sell copies of
-% the Data Files, and to permit persons to whom the Data Files
-% are furnished to do so, provided that
-% (a) this copyright and permission notice appear with all copies
-% of the Data Files,
-% (b) this copyright and permission notice appear in associated
-% documentation, and
-% (c) there is clear notice in each modified Data File
-% as well as in the documentation associated with the Data File(s)
-% that the data has been modified.
-%
-% THE DATA FILES ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
-% ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-% WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-% NONINFRINGEMENT OF THIRD PARTY RIGHTS.
-% IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
-% NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
-% DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-% DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-% TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-% PERFORMANCE OF THE DATA FILES.
-%
-% Except as contained in this notice, the name of a copyright holder
-% shall not be used in advertising or otherwise to promote the sale,
-% use or other dealings in these Data Files without prior
-% written authorization of the copyright holder.
-% changes:
-% - >
-% February 1997 Patterns created by Juan M. Aguirregabiria, based on the
-% shyphen.sh script for Spanish by Julio Sanchez, September 1991.
-% - >
-% June 2008 Generating script rewritten in Ruby and adapted for native
-% UTF-8 TeX engines, patterns renamed from bahyph.tex to
-% hyph-eu.tex and added to the hyph-utf8 package. Functionality should
-% not change apart from adding ñ by default.
-% ==========================================
-%
-% Open vowels: a e o
-% Closed vowels: i u
-% Consonants: b c d f g j k l m n ñ p q r s t v w x y z
-%
-% Some of the patterns below represent combinations that never
-% happen in Basque. Would they happen, they would be hyphenated
-% according to the rules.
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-fi.rme b/Master/texmf-dist/tex/context/patterns/common/lang-fi.rme
index 58acc4b9baa..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-fi.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-fi.rme
@@ -1,24 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project from fihyph.tex, whose
-% author has been identified as Kauko Saarinen. The licence terms are unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-% -----> Finnish hyphenation patterns for MLPCTeX <------
-% First release January -86 by Kauko Saarinen,
-% Computing Centre, University of Jyvaskyla, Finland
-%
-% Completely rewritten January -88. The new patterns make
-% much less mistakes with foreign and compound words.
-% The article "Automatic Hyphenation of Finnish"
-% by Professor Fred Karlsson is also referred
-% ---------------------------------------------------------
-%
-% 8th March -89 (vers. 2.2), some vowel triples by Fred Karlsson added.
-% 9th January - 95: added \uccode and \lccode by Thomas Esser
-%
-% ********* Patterns may be freely distributed **********
-%
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-fr.rme b/Master/texmf-dist/tex/context/patterns/common/lang-fr.rme
index 7ca6aa0359e..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-fr.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-fr.rme
@@ -1,50 +1,3 @@
% generated by mtxrun --script pattern --convert
-% copyright: Daniel Flipo and Bernard Gaulle 1994-2002, Arthur Reutenauer 2016
-% title: French hyphenation patterns
-% version: V2.13 2016/05/12
-% language:
-% name: French
-% tag: fr
-% notice: >
-% This file is part of the hyph-utf8 package.
-% See http://www.hyphenation.org for more information.
-% licence:
-% name: MIT
-% url: https://opensource.org/licenses/MIT
-% text: >
-% Permission is hereby granted, free of charge, to any person obtaining
-% a copy of this software and associated documentation files (the
-% "Software"), to deal in the Software without restriction, including
-% without limitation the rights to use, copy, modify, merge, publish,
-% distribute, sublicense, and/or sell copies of the Software, and to
-% permit persons to whom the Software is furnished to do so, subject to
-% the following conditions:
-%
-% The above copyright notice and this permission notice shall be
-% included in all copies or substantial portions of the Software.
-%
-% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-% MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-% BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-% ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-% CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-% SOFTWARE.
-% ==========================================
-%%%%%%%% The most famous good guys who worked hard to obtain something usable.
-% Jacques Desarmenien, Universite de Strasbourg :
-% - << how to run TeX in a French environment: hyphenation, fonts,
-% typography. >> in Tugboat, 5 (1984) 91-102. and TeX85 conference
-% - << La division par ordinateur des mots francais :
-% application a TeX >> in TSI vol. 5 No 4, 1986 (C) AFCET-
-% Gauthier-Villars
-% Norman Buckle, UQAH (nb; many additions)
-% Michael Ferguson, INRS-Telecommunications (mjf) June 1988
-% Justin Bur, Universite de Montreal (jbb; checked against original list)
-% all patterns including apostrophe missing from nb list
-% after that, GUTenberg and specially Daniel Flipo and Bernard Gaulle
-% did their best effort to improve the list of patterns.
-%
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-gb.rme b/Master/texmf-dist/tex/context/patterns/common/lang-gb.rme
index 222dfc969da..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-gb.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-gb.rme
@@ -1,60 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been renamed from ukhyphen.tex to hyph-en-gb.tex in June 2008
-% for consistency with other files with hyphenation patterns in hyph-utf8 package.
-% No other changes made. See http://www.tug.org/tex-hyphen for more details.
-
-% File: ukhyphen.tex
-% TeX hyphenation patterns for UK English
-
-% Unlimited copying and redistribution of this file
-% is permitted so long as the file is not modified
-% in any way.
-%
-% Modifications may be made for private purposes (though
-% this is discouraged, as it could result in documents
-% hyphenating differently on different systems) but if
-% such modifications are re-distributed, the modified
-% file must not be capable of being confused with the
-% original. In particular, this means
-%
-%(a) the filename (the portion before the extension, if any)
-% must not match any of :
-%
-% UKHYPH UK-HYPH
-% UKHYPHEN UK-HYPHEN
-% UKHYPHENS UK-HYPHENS
-% UKHYPHENATION UK-HYPHENATION
-% UKHYPHENISATION UK-HYPHENISATION
-% UKHYPHENIZATION UK-HYPHENIZATION
-%
-% regardless of case, and
-%
-%(b) the file must contain conditions identical to these,
-% except that the modifier/distributor may, if he or she
-% wishes, augment the list of proscribed filenames.
-
-% $Log: ukhyph.tex $
-% Revision 2.0 1996/09/10 15:04:04 ucgadkw
-% o added list of hyphenation exceptions at the end of this file.
-%
-%
-% Version 1.0a. Released 18th October 2005/PT.
-%
-% Created by Dominik Wujastyk and Graham Toal using Frank Liang's PATGEN 1.0.
-% Like the US patterns, these UK patterns correctly hyphenate about 90% of
-% the words in the input list, and produce no hyphens not in the list
-% (see TeXbook pp. 451--2).
-%
-% These patterns are based on a file of 114925 British-hyphenated words
-% generously made available to Dominik Wujastyk by Oxford University Press.
-% This list of words is copyright to the OUP and may not be redistributed.
-% The hyphenation break points in the words in the abovementioned file is
-% also copyright to the OUP.
-%
-% We are very grateful to Oxford University Press for allowing us to use
-% their list of hyphenated words to produce the following TeX hyphenation
-% patterns. This file of hyphenation patterns may be freely distributed.
-%
-% These patterns require a value of about 14000 for TeX's pattern memory size.
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-hr.rme b/Master/texmf-dist/tex/context/patterns/common/lang-hr.rme
index 5b98b319729..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-hr.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-hr.rme
@@ -1,53 +1,3 @@
% generated by mtxrun --script pattern --convert
-% copyright: Copyright (C) 1994, 1996, 2011, 2015 Igor Marinović
-% title: Hyphenation patterns for Croatian language
-% notice: >
-% This file is part of the hyph-utf8 package.
-% See http://www.hyphenation.org for more information.
-%
-% license:
-% - This file is available under any of these licences:
-% -
-% name: LPPL
-% version: 1
-% or_later: true
-% url: http://www.latex-project.org/lppl/lppl-1-0.html
-% -
-% text: >
-% Permission is hereby granted, free of charge, to any person obtaining
-% a copy of this file and any associated documentation
-% (the "Data Files") to deal in the Data Files
-% without restriction, including without limitation the rights to use,
-% copy, modify, merge, publish, distribute, and/or sell copies of
-% the Data Files, and to permit persons to whom the Data Files
-% are furnished to do so, provided that
-% (a) this copyright and permission notice appear with all copies
-% of the Data Files,
-% (b) this copyright and permission notice appear in associated
-% documentation, and
-% (c) there is clear notice in each modified Data File
-% as well as in the documentation associated with the Data File(s)
-% that the data has been modified.
-%
-% THE DATA FILES ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
-% ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-% WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-% NONINFRINGEMENT OF THIRD PARTY RIGHTS.
-% IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
-% NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
-% DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-% DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-% TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-% PERFORMANCE OF THE DATA FILES.
-%
-% Except as contained in this notice, the name of a copyright holder
-% shall not be used in advertising or otherwise to promote the sale,
-% use or other dealings in these Data Files without prior
-% written authorization of the copyright holder.
-% changes:
-% - Late 1994 first version
-% - Beginning of 1996 much more improved version (date of last change: 19.03.1996).
-% - In summer 2008 patterns incorporated into hyph-utf8 and renamed from hrhyph.tex to hyph-hr.tex.
-% - 06.06.2011 LPPL licence added.
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-hu.rme b/Master/texmf-dist/tex/context/patterns/common/lang-hu.rme
index d4055e743c4..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-hu.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-hu.rme
@@ -1,46 +1,3 @@
% generated by mtxrun --script pattern --convert
-% from https://github.com/nagybence/huhyphn/
-% ------------------------------------------
-% Huhyphn - hungarian hyphenation patterns v20110815
-%
-% ***** BEGIN LICENSE BLOCK *****
-% Version: MPL 1.1/GPL 2.0/LGPL 2.1
-%
-% The contents of this file are subject to the Mozilla Public License Version
-% 1.1 (the "License"); you may not use this file except in compliance with
-% the License. You may obtain a copy of the License at
-% http://www.mozilla.org/MPL/
-%
-% Software distributed under the License is distributed on an "AS IS" basis,
-% WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-% for the specific language governing rights and limitations under the
-% License.
-%
-% The Original Code is the Huhyphn - hungarian hyphenation patterns.
-%
-% The Initial Developer of the Original Code is
-% Bence Nagy.
-% Portions created by the Initial Developer are Copyright (C) 2003
-% the Initial Developer. All Rights Reserved.
-%
-% Contributor(s):
-% Bence Nagy <bence.nagy@gmail.com>
-%
-% Alternatively, the contents of this file may be used under the terms of
-% either the GNU General Public License Version 2 or later (the "GPL"), or
-% the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-% in which case the provisions of the GPL or the LGPL are applicable instead
-% of those above. If you wish to allow use of your version of this file only
-% under the terms of either the GPL or the LGPL, and not to allow others to
-% use your version of this file under the terms of the MPL, indicate your
-% decision by deleting the provisions above and replace them with the notice
-% and other provisions required by the GPL or the LGPL. If you do not delete
-% the provisions above, a recipient may use your version of this file under
-% the terms of any one of the MPL, the GPL or the LGPL.
-%
-% ***** END LICENSE BLOCK *****
-%
-% Encoding: UTF8
-%
-\message{Huhyphn - hungarian hyphenation patterns v20110815}
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-is.rme b/Master/texmf-dist/tex/context/patterns/common/lang-is.rme
index cd570a0c510..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-is.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-is.rme
@@ -1,26 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project from icehyph.tex,
-% whose author has been identified as Jorgen Pind <jorgen at lexis.hi.is>
-% (2004-03-08). The licence terms are unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-% The Icelandic Plain TeX hyphenation tables
-% as of Nov 2 1988.
-% Jorgen Pind, Institute of Lexicography, Univ. of Iceland
-% jorgen@lexis.hi.is (Internet)
-%
-% Mar 2 2004: Uploaded a new version to CTAN, with a clarified license
-% statement, at the request of the author, Jorgen Pind.
-% Kristinn Gylfason (kristgy@ieee.org)
-
-% This file may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.2
-% 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.2 or later is part of all distributions of LaTeX
-% version 1999/12/01 or later.
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-it.rme b/Master/texmf-dist/tex/context/patterns/common/lang-it.rme
index d5111a609b9..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-it.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-it.rme
@@ -1,45 +1,3 @@
% generated by mtxrun --script pattern --convert
-% hyph-it.tex
-%
-% Italian hyphenation patterns
-%
-% This file is part of the hyph-utf8 package.
-% For more unformation see
-%
-% http://tug.org/tex-hyphen
-%
-%------------------------------------------------------------------------------
-%
-%% Copyright 2008-2011 Claudio Beccari
-%
-% 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 2003/12/01 or later.
-%
-% This work has the LPPL maintenance status "maintained".
-%
-% This Current Maintainer of this work is Claudio Beccari
-% e-mail: claudio dot beccari at gmail dot com
-%
-% This work consists of the single file hyph-it.tex.
-%
-% \versionnumber{4.9} \versiondate{2014/04/22}
-%
-% These hyphenation patterns for the Italian language are supposed to comply
-% with the Recommendation UNI 6461 on hyphenation issued by the Italian
-% Standards Institution (Ente Nazionale di Unificazione UNI). No guarantee
-% or declaration of fitness to any particular purpose is given and any
-% liability is disclaimed.
-%
-% ChangeLog:
-% - 2014-04-22 - Add few patterns involving `h'
-% - 2011-08-16 - Change the licence from GNU LGPL into LPPL v1.3.
-% - 2010-05-24 - Fix for Italian patterns for proper hyphenation of -ich and Ljubljana.
-% - 2008-06-09 - Import of original ithyph.tex into hyph-utf8 package.
-% - 2008-03-08 - (last change in ithyph.tex)
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-la.rme b/Master/texmf-dist/tex/context/patterns/common/lang-la.rme
index 98435331f2a..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-la.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-la.rme
@@ -1,148 +1,3 @@
% generated by mtxrun --script pattern --convert
-% title: Hyphenation patterns for modern and medieval Latin
-% copyright: Copyright (c) 1999-2016 Claudio Beccari
-% e-mail claudio dot beccari at gmail dot com
-% notice: This file is part of the hyph-utf8 package.
-% See http://www.hyphenation.org for more information.
-% language:
-% name: Latin
-% tag: la
-% version: 3.201 2016-08-28
-% licence:
-% - This file is available under any of the following licences:
-% -
-% name: MIT
-% url: https://opensource.org/licenses/MIT
-% text: >
-% Permission is hereby granted, free of charge, to any person
-% obtaining a copy of this software and associated documentation
-% files (the “Softwareâ€), to deal in the Software without
-% restriction, including without limitation the rights to use,
-% copy, modify, merge, publish, distribute, sublicense, and/or sell
-% copies of the Software, and to permit persons to whom the
-% Software is furnished to do so, subject to the following
-% conditions:
-%
-% The above copyright notice and this permission notice shall be
-% included in all copies or substantial portions of the Software.
-%
-% THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND,
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-% OTHER DEALINGS IN THE SOFTWARE.
-% -
-% name: LPPL
-% version: 1
-% or_later: true
-% url: https://latex-project.org/lppl/
-% changes:
-% -
-% date: 1999
-% version: 1.0
-% author: Claudio Beccari
-% description: First public release
-% -
-% date: 2007-04-16
-% version: 3.1
-% author: Claudio Beccari
-% -
-% date: 2010-05-31
-% author: Claudio Beccari
-% description: Removal of OT1 support
-% -
-% date: 2010-06-01
-% version: 3.2
-% author: Claudio Beccari
-% description: Removal of pattern 2'2
-% -
-% date: 2016-08-28
-% version: 3.201
-% author: Claudio Beccari
-% description: updated header with MIT licence notice;
-% added few missing patterns
-%
-% ==========================================
-% Patterns for the latin language mainly in modern spelling
-% (u when u is needed and v when v is needed); medieval spelling
-% with the ligatures \ae and \oe and the (uncial) lowercase `v'
-% written as a `u' is also supported; apparently there is no conflict
-% between the patterns of modern Latin and those of medieval Latin.
-%
-% For more information please read the babel-latin documentation.
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% For documentation see:
-% C. Beccari, "Computer aided hyphenation for Italian and Modern
-% Latin", TUG vol. 13, n. 1, pp. 23-33 (1992)
-%
-% see also
-%
-% C. Beccari, "Typesetting of ancient languages",
-% TUG vol.15, n.1, pp. 9-16 (1994)
-%
-% In the former paper the code was described as being contained in file
-% ITALAT.TEX; this is substantially the same code, but the file has been
-% renamed and included in hyph-utf8.
-%
-% A corresponding file (ITHYPH.TEX) has been extracted in order to eliminate
-% the (few) patterns specific to Latin and leave those specific to Italian;
-% ITHYPH.TEX has been further extended with many new patterns in order to
-% cope with the many neologisms and technical terms with foreign roots.
-%
-% Should you find any word that gets hyphenated in a wrong way, please, AFTER
-% CHECKING ON A RELIABLE MODERN DICTIONARY, report to the author, preferably
-% by e-mail. Please do not report about wrong break points concerning
-% prefixes and/or suffixes; see at the bottom of this file.
-%
-% Compared with the previous versions, this file has been extended so as to
-% cope also with the medieval Latin spelling, where the letter `V' played the
-% roles of both `U' and `V', as in the Roman times, save that the Romans used
-% only capitals. In the middle ages the availability of soft writing supports
-% and the necessity of copying books with a reasonable speed, several scripts
-% evolved in (practically) all of which there was a lower case alphabet
-% different from the upper case one, and where the lower case `v' had the
-% rounded shape of our modern lower case `u', and where the Latin diphthongs
-% `AE' and `OE', both in upper and lower case, where written as ligatures,
-% not to mention the habit of substituting them with their sound, that is a
-% simple `E'.
-%
-% According to Leon Battista Alberti, who in 1466 wrote a book on
-% cryptography where he thoroughly analyzed the hyphenation of the Latin
-% language of his (still medieval) times, the differences from the Tuscan
-% language (the Italian language, as it was named at his time) were very
-% limited, in particular for what concerns the handling of the ascending and
-% descending diphthongs; in Central and Northern Europe, and later on in
-% North America, the Scholars perceived the above diphthongs as made of two
-% distinct vowels; the hyphenation of medieval Latin, therefore, was quite
-% different in the northern countries compared to the southern ones, at least
-% for what concerns these diphthongs. If you need hyphenation patterns for
-% medieval Latin that suite you better according to the habits of Northern
-% Europe you should resort to the hyphenation patterns prepared by Yannis
-% Haralambous (TUGboat, vol.13 n.4 (1992)).
-%
-%
-%
-% PREFIXES AND SUFFIXES
-%
-% For what concerns prefixes and suffixes, the latter are generally separated
-% according to "natural" syllabification, while the former are generally
-% divided etimologically. In order to avoid an excessive number of patterns,
-% care has been paid to some prefixes, especially "ex", "trans", "circum",
-% "prae", but this set of patterns is NOT capable of separating the prefixes
-% in all circumstances.
-%
-% BABEL SHORTCUTS AND FACILITIES
-%
-% Read the documentation coming with the discription of the Latin language
-% interface of Babel in order to see the shortcuts and the facilities
-% introduced in order to facilitate the insertion of "compound word marks"
-% which are very useful for inserting etymological break points.
-%
-% Happy Latin and multilingual typesetting!
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-lt.rme b/Master/texmf-dist/tex/context/patterns/common/lang-lt.rme
index bb4e084d7eb..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-lt.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-lt.rme
@@ -1,47 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file is part of hyph-utf8 package and resulted from
-% semi-manual conversions of hyphenation patterns into UTF-8
-% in October 2008 by Mojca & Arthur.
-%
-% Source available on:
-% - http://www.vtex.lt/tex/littex/index.html
-%
-% Authors:
-%
-% First version in LT encoding (modified T1):
-% - Vytas StatuleviÄius <vytas at vtex.lt>
-% - Yannis Haralambous
-% (Vilnius, March 4, 1992)
-% Conversion into Latin 7 and aditional support files (babel, fonts):
-% - Sigitas Tolušis <sigitas at vtex.lt>
-% (2002-11-20)
-% Adaptation for hyph-utf8:
-% - Mojca & Arthur (see below), October 2008
-%
-% The copyright statement of this file is:
-%
-% Do with this file whatever needs to be done in future for the sake of
-% "a better world" as long as you respect the copyright of original file.
-%
-% If you want to change this file, rather than uploading directly to CTAN,
-% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
-% or ask for credentials for SVN repository and commit it yourself;
-% we will then upload the whole "package" to CTAN.
-%
-% For more unformation see
-%
-% http://tug.org/tex-hyphen
-%
-%------------------------------------------------------------------------------
-%
-% A note about lefthyphenmin/righthyphenmin (by Sigitas, February 2009):
-%
-% At the moment the lefthyphenmin & righthyphenmin are both set to 2.
-% The Lithuanian patterns were build earlier then the latest grammatical rules
-% took place in 1997. At that time it was forbidden to leave one character at boundary.
-% One may change it to one now, but from typographical point of view there is no need to do
-% any changes. Even more, changing lefthyphen and righthyphen to 1 requires
-% to review and maybe rebuild the patterns file.
-%
-%------------------------------------------------------------------------------
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-lv.rme b/Master/texmf-dist/tex/context/patterns/common/lang-lv.rme
index a07ecb997f6..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-lv.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-lv.rme
@@ -1,15 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file is part if hyph-utf8 package and resulted from semi-manual
-% conversions of hyphenation patterns into UTF-8 in November 2008 by Mojca &
-% Arthur.
-%
-% This file is available under the term of the GNU GPL, version 2.
-%
-% Source: Latvian Lingucomponents for OpenOffice
-% Homepage: http://sourceforge.net/projects/openoffice-lv
-% File: hyph_lv_lv.dic (version 0.3, 2005-09-14)
-% Author: Copyright (C) 2004-2005 Janis Vilims, jvilims@apollo.lv
-% License: Lesser General Public Licence (LGPL) 2.1
-%
-
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-mk.rme b/Master/texmf-dist/tex/context/patterns/common/lang-mk.rme
new file mode 100644
index 00000000000..fff218f7178
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-mk.rme
@@ -0,0 +1,3 @@
+% generated by mtxrun --script pattern --convert
+
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-ml.rme b/Master/texmf-dist/tex/context/patterns/common/lang-ml.rme
index 687df564470..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-ml.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-ml.rme
@@ -1,28 +1,3 @@
% generated by mtxrun --script pattern --convert
-% These patterns originate from
-% https://github.com/santhoshtr/hyphenation/)
-% and have been adapted for hyph-utf8 (for use in TeX).
-%
-% Hyphenation for Malayalam
-% Copyright (C) 2016 Santhosh Thottingal (santhosh dot thottingal at gmail dot com)
-%
-% Permission is hereby granted, free of charge, to any person obtaining
-% a copy of this software and associated documentation files (the
-% "Software"), to deal in the Software without restriction, including
-% without limitation the rights to use, copy, modify, merge, publish,
-% distribute, sublicense, and/or sell copies of the Software, and to
-% permit persons to whom the Software is furnished to do so, subject to
-% the following conditions:
-%
-% The above copyright notice and this permission notice shall be
-% included in all copies or substantial portions of the Software.
-%
-% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-% MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-% LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-% OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-% WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-mn.rme b/Master/texmf-dist/tex/context/patterns/common/lang-mn.rme
index cd95a72b934..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-mn.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-mn.rme
@@ -1,53 +1,3 @@
% generated by mtxrun --script pattern --convert
-% copyright: Copyright 2007-2015 by Dorjgotov Batmunkh, National University of Mongolia
-% title: Hyphenation patterns for Mongolian language
-% version: v1.2 2008/03/23
-% notice: >
-% This file is part of the hyph-utf8 package.
-% See http://www.hyphenation.org for more information.
-% license:
-% - This file is available under any of the following licenses:
-% -
-% name: LPPL
-% version: 1.3
-% or_later: true
-% url: http://www.latex-project.org/lppl/lppl-1-3.txt
-% -
-% name: MIT
-% url: https://opensource.org/licenses/MIT
-% text: >
-% Permission is hereby granted, free of charge, to any person obtaining a copy
-% of this software and associated documentation files (the "Software"), to deal
-% in the Software without restriction, including without limitation the rights
-% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-% copies of the Software, and to permit persons to whom the Software is
-% furnished to do so, subject to the following conditions:
-%
-% The above copyright notice and this permission notice shall be included in
-% all copies or substantial portions of the Software.
-%
-% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-% THE SOFTWARE.
-% changes:
-% - 2008/03/23 v1.2
-% - 2008/06/08 Patterns added to hyph-utf8
-% - 2015/12/05 Patterns released under the MIT license
-% ==========================================
-% Special thanks to: Jim Hefferon and Robin Fairbairns
-%
-% There are few basic rules in mongolian
-%
-% 1. If there is a consonant then it can use hyphen before it.
-% And if there're two consonants then it can use hyphen before second consonant.
-% Are there three consonants then it can put hyphen before third consonant,
-% also are there four consonants then it can use hyphen before fourth consonant.
-% 2. In the case of hardsign or softsign, it's possible to hyphen after these signs.
-% For instance, байгуулъ-Ñ, үзүүль-е
-% 3. However one vowel can be belong to a syllable, it's not possible to use hyphen.
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-nb.rme b/Master/texmf-dist/tex/context/patterns/common/lang-nb.rme
index 5b955af53a9..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-nb.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-nb.rme
@@ -1,35 +1,3 @@
% generated by mtxrun --script pattern --convert
-% Adapted to the new pattern-loading scheme.
-% Original file name was nbhyph.tex
-
-% TeX hyphenation patterns for Norwegian Bokmal
-%
-% Version 2007-02-10
-%
-% Copyright (C) 2007 Karl Ove Hufthammer.
-% Copying and distribution of this file, with or without modification,
-% are permitted in any medium without royalty, provided the copyright
-% notice and this notice are preserved.
-%
-% This file contains hyphenation patterns for Norwegian Bokmal.
-% It uses the Norwegian hyphenation patterns from nohyphbx.tex,
-% created by Rune Kleveland and Ole Michael Selberg. Please see
-% that file for copyright information on those patterns.
-%
-% The patterns in nohyphbx are based on both Norwegian Bokmal
-% and Norwegian Nynorsk, and works about equally well for both
-% languages. This file, nbhyph.tex, contains only a few hyphenation
-% exceptions, for words that needs to be hyphenated differently for
-% the two languages.
-%
-% Please send bugs or suggestions to karl@huftis.org.
-%
-
-\input hyph-no.tex
-
-\hyphenation{
-at-ten-de
-be-tre
-}
-
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-nl.rme b/Master/texmf-dist/tex/context/patterns/common/lang-nl.rme
index b8b8b0ff699..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-nl.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-nl.rme
@@ -1,45 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project from nehyph96.tex,
-% whose author has been identified as Piet Tutelaers. The licence terms are
-% unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-% PURPOSE: 8-bit hyphenation patterns for TeX based upon the new Dutch
-% spelling, officially since 1 August 1996. These patterns follow
-% the new hyphenation rules in the `Woordenlijst Nederlandse
-% Taal, SDU Uitgevers, Den Haag 1995' (the so called `Groene
-% Boekje') described in section 5.2 (Het afbreekteken).
-%
-% The main differences with our earlier patterns based upon the
-% CELEX dictionary are:
-% (1) provide 8-bit patterns based upon the T1 character encoding
-% (the encoding for DC/EC compatible TeX fonts)
-% (2) don't hyphenate if this results in a syllable of one letter
-% before or after the hyphen (hence hyphens in a-drenaline,
-% studi-o, mensa-pen and vide-oachtig are invalid)
-% (3) handle words derived from other languages (`bastaard
-% woorden') according to the new rules
-%
-% Like the CELEX patterns these patterns don't hyphenate:
-% (4) in a changing syllable (menuutje can not be hyphenated as
-% menu-tje)
-% (5) in words that have different hyphenations according to
-% there meaning (buur-tje/buurt-je)
-%
-% COPYRIGHT (C) 1996: Piet Tutelaers
-%
-% -----------------------------------------------------------------
-% IMPORTANT NOTICE:
-%
-% This program can be redistributed and/or modified under the terms
-% of the LaTeX Project Public License Distributed from CTAN
-% archives in directory macros/latex/base/lppl.txt; either
-% version 1 of the License, or any later version.
-% -----------------------------------------------------------------
-% VERSION: 1.1 (November 1996) Copyright changed March 2000
-%
-% AUTHOR: Piet Tutelaers P.T.H.Tutelaers@tue.nl
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-nn.rme b/Master/texmf-dist/tex/context/patterns/common/lang-nn.rme
index 0974004ae4d..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-nn.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-nn.rme
@@ -1,35 +1,3 @@
% generated by mtxrun --script pattern --convert
-% Adapted to the new pattern-loading scheme.
-% Original file name was nnhyph.tex
-
-% TeX hyphenation patterns for Norwegian Nynorsk
-%
-% Version 2007-02-10
-%
-% Copyright (C) 2007 Karl Ove Hufthammer.
-% Copying and distribution of this file, with or without modification,
-% are permitted in any medium without royalty, provided the copyright
-% notice and this notice are preserved.
-%
-% This file contains hyphenation patterns for Norwegian Nynorsk.
-% It uses the Norwegian hyphenation patterns from nohyphbx.tex,
-% created by Rune Kleveland and Ole Michael Selberg. Please see
-% that file for copyright information on those patterns.
-%
-% The patterns in nohyphbx are based on both Norwegian Bokmal
-% and Norwegian Nynorsk, and works about equally well for both
-% languages. This file, nnhyph.tex, contains only a few hyphenation
-% exceptions, for words that needs to be hyphenated differently for
-% the two languages.
-%
-% Please send bugs or suggestions to karl@huftis.org.
-%
-
-\input hyph-no.tex
-
-\hyphenation{
-att-en-de
-bet-re
-}
-
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-pl.rme b/Master/texmf-dist/tex/context/patterns/common/lang-pl.rme
index 815b3df4ea9..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-pl.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-pl.rme
@@ -1,36 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project from plhyph.tex, whose
-% authors have been identified as Hanna Kołodziejska, Bogusław Jackowski, Marek
-% Ryćko (1995-06-26). The licence terms are unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-% This is PLHYPH.TeX - the Polish hyphenation patterns
-% version 3.0a, Wednesday, May 17th, 1995
-% to be used for the inclusion of Polish hyphenation patterns in any format,
-% not necessarily in the MeX or LaMeX ones. The patterns are exactly
-% the same as in the version 3.0 being the part of the MeX package,
-% only the surrounding of the \pattern command is changed. The authors
-% claim the upward compatibility, i.e., the version 3.0a can also be used
-% with the MeX or LaMeX formats.
-
-% The history of development of the Polish hyphenation patterns:
-%
-% The first version of the patterns was developed
-% by Hanna Kołodziejska (1987).
-%
-% The adaptation to the LeX format (see below) and extensive modification
-% were done by Bogusław Jackowski & Marek Ryćko (1987--1989).
-%
-% The hyphenation rules were further improved and adapted to the
-% TeX 3.x requirements by Hanna Kołodziejska (1991).
-%
-% Lone-standing version (3.0a) of patterns was prepared (under pressure
-% from LaTeX users) by Bogusław Jackowski and Marek Ryćko, following
-% Mariusz Olko's suggestions, 1995.
-
-% The LeX format mentioned above was the first version of the adaptation
-% of TeX to the Polish language. The next version is called MeX.
-
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-pt.rme b/Master/texmf-dist/tex/context/patterns/common/lang-pt.rme
index b74ab3637d0..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-pt.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-pt.rme
@@ -1,58 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project from pthyph.tex
-% (Version 1.2, 1996-07-21), whose authors have been identified as Pedro J. de
-% Rezende <rezende at dcc.unicamp.br> and J.Joao Dias Almeida <jj at
-% di.uminho.pt>. The licence terms are unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-% ---------------------------------------------------------------------
-% BSD 3-Clause License (https://opensource.org/licenses/BSD-3-Clause):
-%
-% Copyright (c) 1987, Pedro J. de Rezende (rezende@ic.unicamp.br) and J.Joao Dias Almeida (jj@di.uminho.pt)
-%
-% All rights reserved.
-%
-% Redistribution and use in source and binary forms, with or without
-% modification, are permitted provided that the following conditions are met:
-% * Redistributions of source code must retain the above copyright
-% notice, this list of conditions and the following disclaimer.
-% * Redistributions in binary form must reproduce the above copyright
-% notice, this list of conditions and the following disclaimer in the
-% documentation and/or other materials provided with the distribution.
-% * Neither the name of the University of Campinas, of the University of
-% Minho nor the names of its contributors may be used to endorse or
-% promote products derived from this software without specific prior
-% written permission.
-%
-% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-% ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-% DISCLAIMED. IN NO EVENT SHALL PEDRO J. DE REZENDE OR J.JOAO DIAS ALMEIDA BE
-% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-% HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-% OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% The Portuguese TeX hyphenation table.
-% (C) 2015 by Pedro J. de Rezende (rezende@ic.unicamp.br)
-% and J.Joao Dias Almeida (jj@di.uminho.pt)
-% Version: 1.3 Release date: 12/08/2015
-%
-% (C) 1996 by Pedro J. de Rezende (rezende@ic.unicamp.br)
-% and J.Joao Dias Almeida (jj@di.uminho.pt)
-% Version: 1.2 Release date: 07/21/1996
-%
-% (C) 1994 by Pedro J. de Rezende (rezende@ic.unicamp.br)
-% Version: 1.1 Release date: 04/12/1994
-%
-% (C) 1987 by Pedro J. de Rezende
-% Version: 1.0 Release date: 02/13/1987
-%
-% -----------------------------------------------------------------
-% Remember! If you *must* change it, then call the resulting file
-% something else and attach your name to your *documented* changes.
-% =================================================================
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-ro.rme b/Master/texmf-dist/tex/context/patterns/common/lang-ro.rme
index 0b4e45a8362..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-ro.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-ro.rme
@@ -1,57 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 package from rohyphen.tex,
-% whose author has been identified as Adrian Rezus <adriaan at {sci,cs}.kun.nl>
-% (1996-11-11). The licence terms are unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% ROHYPHEN.TEX, version 1.1 <29.10.1996> R [7.11.1996] %%
-%% (C) 1995-1996 Adrian Rezus [adriaan@{sci,cs}.kun.nl] %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% Romanian TeX hyphenation table: NFSS 2 encoding, medium.
-%% Contents: 647 Romanian hyphen patterns, with diacritics.
-%%
-%% This file is part of the Romanian TeX system.
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Romanian TeX, version 1.3R <29.10.1996> %%
-%% (C) 1994-1996 Adrian Rezus %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% History:
-%% ROHYPHEN.TEX 1.0 <10.02.1995>: Plain TeX and LaTeX 2.09.
-%% ROHYPHEN.TEX 1.1 <29.10.1996>: Plain TeX and LaTeX2e.
-%
-% -------------------------------------------------------------------
-
-% TODO: fix the notice below - it only holds for the old patterns
-
-% NB This file must be used in conjunction with either one of
-%
-% (1) ROMANIAN.TEX v1.2(R) [1994-1995] [(La)TeX] or
-% (2) ROMANIAN.STY v1.3R [1996] [(La)TeX(2e)]
-%
-% NB Romanian has LR-HYPHEN-MINs [2 2] (like German)!
-% NB Romanian has STRUCTURAL HYPHEN-AMBIGUA:
-% i.e., words that canNOT be hyphenated correctly without
-% additional (e.g., semantic, stress-mark) information.
-% --------------------------------------------------------
-% The Romanian TeX encoding of the Romanian diacritics:
-% --------------------------------------------------------
-% Romanian TeX DQ-macro encodings = (La)TeX macros
-% --------------------------------------------------------
-% ă = \u{a} [-] \u{A} [not encoded]
-% â = \^{a} [-] \^{A} [not encoded]
-% î = \^{\i} "I = \^{I}
-% È™ = \c{s} "S = \c{S}
-% È› = \c{t} "T = \c{T}
-% -------------------------------------------------------------
-% NB Romanian \^{a} behaves like \^{\i} as regards hyphenation.
-% NB The capital \u{A} and \^{A} are rare in script; as such,
-% they occur only in records of the Romanian substandard.
-% -------------------------------------------------------------------
-%
-% original patterns generated by PatGen2-output hyphen-level 9: do NOT modify the list by hand!
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-ru.rme b/Master/texmf-dist/tex/context/patterns/common/lang-ru.rme
index 33ca915e7da..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-ru.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-ru.rme
@@ -1,24 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project from various files
-% [FIXME document] whose author has been identified as Alexander I. Lebedev
-% <swan at scon155.phys.msu.su> (2003-03-10). The licence terms are unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-% Russian hyphenation patterns, version 2003/03/10
-% Copyright 1999-2003 Alexander I. Lebedev <swan@scon155.phys.msu.su>
-%
-% This program may be distributed and/or modified under the conditions
-% of the LaTeX Project Public License, either version 1.2 or any later
-% version.
-%
-% Patterns were generated with patgen from a 990,000-word list and then
-% manually corrected.
-%
-% The program consists of the files ruhyphal.tex, cyryoal.tex and two
-% document files README.ruhyphal and hyphen.rules. The file cyryoal.tex
-% can be regenerated using mkcyryo script (a part of ruhyphen package)
-% and the latest release of rus-ispell dictionaries
-% <ftp://scon155.phys.msu.su/pub/russian/ispell/>.
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-sk.rme b/Master/texmf-dist/tex/context/patterns/common/lang-sk.rme
index c7653e43d79..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-sk.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-sk.rme
@@ -1,30 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project from
-% skhyphen.tex and skhyphen.ex, whose author has been identified as Jana
-% Chlebíková <chlebikj at dcs.fmph.uniba.sk>. The licence terms are unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-% Slovak hyphenation (version 2.0) 24.4.1992
-% Autor: Jana Chlebíková, department of Informatics Education,
-% Comenius University, 842 15 Bratislava, Slovakia
-% <chlebikj@dcs.fmph.uniba.sk>
-%
-% This is free software; you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation; either version 2 of the License, or
-% (at your option) any later version.
-%
-% This file is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this program; if not, write to the Free Software
-% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-%%% --------------------------------------------------------------------
-% \message {Loading SK hyphenation patterns: Jana Chlebikova, 1992}
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-sl.rme b/Master/texmf-dist/tex/context/patterns/common/lang-sl.rme
index 2c59b7ce436..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-sl.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-sl.rme
@@ -1,57 +1,3 @@
% generated by mtxrun --script pattern --convert
-% copyright: Copyright (C) 1990 Matjaž VreÄko, TeXCeX (SLO)
-% title: Slovenian hyphenation patterns
-% version: 2007-01-29
-% notice: >
-% This file is part of the hyph-utf8 package.
-% See http://www.hyphenation.org for more information.
-% license:
-% - This file is available under any of these licences:
-% -
-% name: LPPL
-% version: 1
-% or_later: true
-% url: http://www.latex-project.org/lppl/lppl-1-0.html
-% -
-% name: MIT
-% url: https://opensource.org/licences/MIT
-% text: >
-% Permission is hereby granted, free of charge, to any person
-% obtaining a copy of this software and associated documentation
-% files (the "Software"), to deal in the Software without
-% restriction, including without limitation the rights to use,
-% copy, modify, merge, publish, distribute, sublicense, and/or sell
-% copies of the Software, and to permit persons to whom the
-% Software is furnished to do so, subject to the following
-% conditions:
-%
-% The above copyright notice and this permission notice shall be
-% included in all copies or substantial portions of the Software.
-%
-% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-% OTHER DEALINGS IN THE SOFTWARE.
-% changes:
-% - 1990 First version of `hyphen.si' (Matjaž VreÄko, TeXCeX)
-%
-% - >
-% Some cosmetic changes done later on, but none of these apply any more;
-% the patterns are still the same as they were originally:
-% - 1994-05-17 Use of code page 852 in patterns (Leon Žlajpah)
-% - 1995-04-06 Release of `sihyph21.tex'
-% - 1995-06-20 >
-% Added \slovenehyphenmins
-% Release of `sihyph22.tex'
-% - 1997-15-04 >
-% Some changes concerning "c, "s, "z and ...
-% Release of `sihyph23.tex'
-% - 2007-01-20 >
-% `sihyph23.tex' renamed to `slhyph.tex'
-% (sl is the proper language code for Slovenian)
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-sr.rme b/Master/texmf-dist/tex/context/patterns/common/lang-sr.rme
index 1826488acdc..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-sr.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-sr.rme
@@ -1,27 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project from srhyphc.tex,
-% whose authors have been identified as Aleksandar Jelenak <ajelenak AT
-% yahoo.com>, Dejan Muhamedagić (2003-06-09). The licence terms are unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-% This is `srhyphc.tex' file. It contains hyphenation patterns for Serbian
-% language in the Cyrillic alphabet. TeX font encoding is T2A.
-%
-% This file is distributed under the terms of the GNU General Public License.
-% Latest version of the license is at <http://www.gnu.org/copyleft/gpl.html>.
-%
-% Version: 1.0a
-% Last change: 2003-06-09
-%
-% Credits:
-% - Initial hyphenation patterns for T1 font encoding by Dejan Muhamedagić
-% - Improvements and adaptation to T2A font encoding by Strahinja Radić
-% - Further improvements and integration into one file by Aleksandar Jelenak
-%
-% Current maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com>
-%
-% \message{Serbian Cyrillic Hyphenation Patterns `srhyphc.tex' v1.0a <2003-06-09>}
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-sv.rme b/Master/texmf-dist/tex/context/patterns/common/lang-sv.rme
index e1cab58cdbe..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-sv.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-sv.rme
@@ -1,59 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project from sehyph.tex, whose
-% author has been identified as Jan Michael Rynning (2003-09-08). The licence
-% terms are unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-% Swedish hyphenation patterns.
-%
-% Copyright 1994 by Jan Michael Rynning. All rights reserved.
-% This program may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, either version 1.2 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.2 or later is
-% part of all distributions of LaTeX version 1999/12/01 or later.
-%
-% Last update: 1994-03-03 (March 3, 1994).
-% Revision history:
-% 1991-01-08: First version available for anonymous FTP.
-% 1991-08-08: Changed \aa to \aa0 at end of line, to stop TeX from
-% concatenating the patterns.
-% 1991-09-03: Cleaned up lots of inconsistencies in the dictionary.
-% As a consequence, the patterns shrunk a lot. Also
-% added some 4000 one-syllable words, some of which were
-% hyphenated by the old patterns, and some 1500 compound
-% words, about half of which were incorrectly hyphenated
-% by the old patterns.
-% 1991-11-01: Added another some 6200 compound words, all of which were
-% incorrectly hyphenated by the old patterns.
-% 1991-11-13: Added another some 6500 compound words, all of which were
-% incorrectly hyphenated by the old patterns.
-% 1992-01-30: Changed macros to ^^, for use with LaTeX and dc fonts.
-% 1994-03-03: The hyphenated dictionary now contains about 118,000 words.
-% The hyphenation now works much better for compound words.
-% Patgen parameters: 1 2 20, 2 1 8, 1 4 7, 3 2 1, 1 10000 4.
-%
-% This file contains Swedish hyphenation patterns for TeX. It assumes
-% that you have fonts with the Swedish letters in the positions where
-% they occur in ISO Latin 1 (ISO 8859/1):
-% Letter: \AA \"A \"O \'E \aa \"a \"o \'e
-% Position: "C5 "C4 "D6 "C9 "E5 "E4 "F6 "E9
-%
-% Load this file into initex after plain.tex (or lplain.tex, splain.tex,
-% or whatever).
-%
-% The patterns were generated in such a way that they will hyphenate
-% correctly if \lefthyphenmin>=1 and \righthyphenmin>=2.
-%
-% These hyphenation patterns work quite well for simple words, but not
-% quite as well for compound words. I'm working on improving the quality,
-% by adding more words. If you know any Swedish words which are not
-% correctly hypheneted using these patterns, or if you have questions or
-% comments, please contact me:
-%
-% Jan Michael Rynning <jmr@incolumitas.se>
-% --------------------------------------------------------------------------
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-th.rme b/Master/texmf-dist/tex/context/patterns/common/lang-th.rme
index 69b66fa7502..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-th.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-th.rme
@@ -1,20 +1,3 @@
% generated by mtxrun --script pattern --convert
-% title: Hyphenation patterns for Thai
-% copyright: Copyright 2012-2013 Theppitak Karoonboonyanan <theppitak at gmail.com>
-% notice: This file is part of the hyph-utf8 package.
-% See http://www.hyphenation.org for more information.
-% language:
-% name: Thai
-% tag: th
-% licence:
-% name: LPPL
-% version: 1.3
-% or_later: true
-% status: maintained
-% maintainer: Theppitak Karoonboonyanan
-% url: https://latex-project.org/lppl/
-% ==========================================
-% https://linux.thai.net/projects/thailatex
-% https://github.com/tlwg/thailatex
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-tk.rme b/Master/texmf-dist/tex/context/patterns/common/lang-tk.rme
index 5dd107e401c..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-tk.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-tk.rme
@@ -1,30 +1,3 @@
% generated by mtxrun --script pattern --convert
-% copyright: Copyright (c) 2010-2015 Nazar Annagurban
-% title: Hyphenation patterns for Turkmen language
-% version: 0.1 16 March 2010
-% notice: >
-% This file is part of the hyph-utf8 package.
-% See http://www.hyphenation.org for more information.
-% license:
-% name: MIT
-% url: https://opensource.org/licenses/MIT
-% text: >
-% Permission is hereby granted, free of charge, to any person obtaining a copy
-% of this software and associated documentation files (the "Software"), to deal
-% in the Software without restriction, including without limitation the rights
-% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-% copies of the Software, and to permit persons to whom the Software is
-% furnished to do so, subject to the following conditions:
-%
-% The above copyright notice and this permission notice shall be included in
-% all copies or substantial portions of the Software.
-%
-% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-% THE SOFTWARE.
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-tr.rme b/Master/texmf-dist/tex/context/patterns/common/lang-tr.rme
index 6f451214b2e..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-tr.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-tr.rme
@@ -1,36 +1,3 @@
% generated by mtxrun --script pattern --convert
-% hyph-tr.tex
-%
-% Turkish hyphenation patterns
-%
-% This file is auto-generated from source/generic/hyph-utf8/languages/tr/generate_patterns_tr.rb that is part of hyph-utf8.
-% Please don't modify this file; modify the generating script instead.
-%
-% Copyright (C) 1987 Pierre A. MacKay
-% 2008, 2011 TUG
-%
-% This program can redistributed and/or modified under the terms
-% of the LaTeX Project Public License Distributed from CTAN
-% archives in directory macros/latex/base/lppl.txt; either
-% version 1 of the License, or (at your option) any later version.
-%
-% Credits:
-% - algorithm developed by P. A. MacKay for the Ottoman Texts Project in 1987
-% - rules adapted for modern Turkish by H. Turgut Uyar <uyar at itu.edu.tr>
-% - initiative to improve Turkish patterns by S. Ekin Kocabas <kocabas at stanford.edu>
-% - script written by Mojca Miklavec <mojca.miklavec.lists at gmail.com> in June 2008
-%
-% See also:
-% - http://mirror.ctan.org/language/turkish/hyphen/turk_hyf.c
-% - http://www.tug.org/TUGboat/Articles/tb09-1/tb20mackay.pdf
-%
-% Differences with Ottoman patterns:
-% - adapted for the use on modern TeX engines, using UTF-8 charactes
-% - only letters for Modern Turkish + âîû (the first one often needed, the other two don't hurt)
-% - (if needed, support for Ottoman Turkish might be provided separately under language code 'ota')
-%
-% Changes:
-% - 2008-06-25/27/28 - create this file by adapting Ottoman rules for modern Turkish
-% - 2011-08-10 - add LPPL licence with permission of Pierre A. MacKay
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-uk.rme b/Master/texmf-dist/tex/context/patterns/common/lang-uk.rme
index b34fde0b77d..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-uk.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-uk.rme
@@ -1,18 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project, from various files
-% [FIXME document], whose authors have been identified as Maksym Polyakov
-% <polyama at auburn.edu> and <mpoliak at i.com.ua>. The licence terms are
-% unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-% Ukrainian hyphenation patterns in LCY (cp866nav) encoding.
-% Copyright 1998-2001 Maksym Polyakov.
-% Released 2001/05/10.
-% This file can be redistributed and/or modified
-% under the terms of the LaTeX Project Public License (lppl).
-% Please, send bug reports via e-mail:
-% polyama@auburn.edu
-% mpoliak@i.com.ua
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-us.rme b/Master/texmf-dist/tex/context/patterns/common/lang-us.rme
index 28ce7fec954..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-us.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-us.rme
@@ -1,40 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been renamed from ushyphmax.tex to hyph-en-us.tex in June 2008
-% for consistency with other files with hyphenation patterns in hyph-utf8 package.
-% No other changes made. See http://www.tug.org/tex-hyphen for more details.
-
-% ushyphmax.tex -- patterns for more hyphenation pattern memory (12000+).
-% Also known as ushyphen.max.
-%
-% version of 2005-05-30.
-% Patterns of March 1, 1990.
-%
-% Copyright (C) 1990, 2004, 2005 Gerard D.C. Kuiken.
-% Copying and distribution of this file, with or without modification,
-% are permitted in any medium without royalty provided the copyright
-% notice and this notice are preserved.
-%
-% Needs extended pattern memory.
-% Hyphenation trie becomes 7283 with 377 ops.
-%
-% These patterns are based on the Hyphenation Exception Log
-% published in TUGboat, Volume 10 (1989), No. 3, pp. 337-341,
-% and a large number of incorrectly hyphenated words not yet published.
-% If added to Liang's before the closing bracket } of \patterns,
-% the patterns run errorfree as far as known at this moment.
-%
-% These patterns find all admissible hyphens of the words in
-% the Exception Log. ushyph2.tex is a smaller set.
-%
-% Please send bugs or suggestions to tex-live (at) tug.org.
-%
-% 2005-05-30 (karl): in the past, ushyphmax.tex was a file containing
-% only the additional patterns, without the \patterns command, etc.
-% This turned out not to be very useful, since in practice the TeX
-% distributions need one self-contained file for a language. Therefore,
-% ushyphmax.tex now contains both the additional patterns from
-% Dr. Kuiken, and the original patterns and hyphenations from Knuth's
-% hyphen.tex.
-%
-% The Plain TeX hyphenation tables.
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/common/lang-zh.rme b/Master/texmf-dist/tex/context/patterns/common/lang-zh.rme
index 4045ba86e7b..fff218f7178 100644
--- a/Master/texmf-dist/tex/context/patterns/common/lang-zh.rme
+++ b/Master/texmf-dist/tex/context/patterns/common/lang-zh.rme
@@ -1,35 +1,3 @@
% generated by mtxrun --script pattern --convert
-% This file has been converted for the hyph-utf8 project from pyhyph.tex, whose
-% author has been identified as Werner Lemberg <wl at gnu.org>. The licence
-% terms are unchanged.
-%
-% See http://www.hyphenation.org for details on the project.
-%------------------------------------------------------------------------------
-%
-% This is the file pyhyph.tex of the CJK package
-% for hyphenating Chinese pinyin syllables.
-%
-% created by Werner Lemberg <wl@gnu.org>
-%
-% Version 4.8.0 (22-May-2008)
-%
-% Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org>
-%
-% This program is free software; you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation; either version 2 of the License, or
-% (at your option) any later version.
-%
-% This program is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this program in doc/COPYING; if not, write to the Free
-% Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-% MA 02110-1301 USA
-%
-% \message{Hyphenation patterns for unaccented pinyin syllables (CJK 4.7.0)}
-%
+% no comment \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/mkii/lang-de.pat b/Master/texmf-dist/tex/context/patterns/mkii/lang-de.pat
index 86885faac18..4968ac4c8e9 100644
--- a/Master/texmf-dist/tex/context/patterns/mkii/lang-de.pat
+++ b/Master/texmf-dist/tex/context/patterns/mkii/lang-de.pat
@@ -2,7 +2,7 @@
% for comment and copyright, see lang-de.rme
-% used: 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 ß à á â ä ç è é ê ë í ñ ó ô ö ü
+% used: 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 ß à á â ä ç è é ê ë í ï ñ ó ô ö ü
\patterns{
.ab1a
@@ -10,34 +10,39 @@
.abo2
.ab3ol
.ab1or
-.ab3s2
+.abs2
+.ab3si
.ab3u
+.ach2sp
.ade3n
.ae3
.aft2
+.ago1
.ag4r
.ag2u
.ai2s
.akt2a
.al2e
-.al3k
+.ale3u4
.al3lei
-.al5len
+.al3len
.al3li
.al3se
-.al4tei
+.al4st
+.al2tei
.al4tel
-.alter6s5
+.al4terp
+.alter4s3
+.al2tra
.alt3s4
-.al4tu
+.al2tu
.ampe4
.amt2s1
-.amt4sc
.ana1c
.an4a3t
.an3d2
-.anden6k
-.an1er
+.anden4k
+.an1e
.ang2
.an3g4li
.an3go
@@ -45,68 +50,81 @@
.angst3
.ani2s
.an3k4
-.an3na
.an3s2
.an4si.
-.an4tar
-.an3z2
-.ap5p6le.
+.an2tar
+.an3z4
+.ap3p4le.
.ari1e
.ar3k2a
-.ar4m3ac
+.ar2m3ac
.ar4mun
.ar2sc
-.ar4tan
+.ar2tan
.ar4t3ei
-.arter4
-.ar6t5erh
+.ar4t3erh
.ar2t1r
.arz2
+.as4b
.asbe2
-.as4ta
+.as2ko
+.as3ta
+.as4ta.
+.as4tat
.as3tr
+.as2zen
.ata1
.at2h
-.at4r
.au3d
.au4f3
+.au6fac
+.au6fas
+.aufs4
.au2s3
+.aussen6du
.auß2
.ax2
-.äm3
-.är6schl
+.är4schl
.ät2h
.ät2s
.bahn3
-.bah6ner
-.bal3t
.baus4
.be3erb
-.beige4
+.beige2
+.bei4ge.
+.beige4s
.bel2a
.be3r2a
.ber2e
-.ber4g3a
-.ber6g5e6b
-.ber4g3r
-.ber4tr
+.ber2g3a
+.ber4g3e4b
+.ber4gin
+.ber2g3r
+.ber2tr
.bi4os
.bi2t
.bit1a
.blau3
+.bleis4
.boge2
.bogen3
-.bogens6
+.bogens4
.bo4s3k
-.bu4ser
-.bu3ta
+.brut3s
+.bu4cher
+.bu2ser
+.bü3b
+.bübe3
.by4t
.ca2s3t
.ce2ra
-.ch6
-.char8mes
+.ch2
+.champi4o
+.char4mes
.chi3er
+.ch6lor
.dab4
+.da4ch3en
.da2r1
.dar3in
.dar2m1
@@ -116,40 +134,42 @@
.de1i
.dein2
.de3lo
-.de8ments
.de3na
-.den4ka
-.den4kl
-.den4ko
+.den2ka
+.den2kl
+.den2ko
.de1o2
.de3r4en
.de1s
-.de3sk
+.des4pe
.des2t
+.diä2r
.di3el
-.di4en
-.dien4e
-.dien6st
-.dienst7a8d
+.die3n2e
+.diens2
+.dien4st
+.diensta6d
.do3b
-.do2mo
-.do1pe
+.do4mo
+.do3pe
.dor2f1
.do2tr
-.dy2s3
+.dys3
.ebe2r1
.eg2o
.eh2e
.ehe1i
.ehe5n
-.ei3e2
+.eichs4
+.ei3e4
.ei3f2e
+.ei4fr
.ei3k
.ei4na
.ein3d
.ei2ne2
.ein3eb
-.ein6erl
+.ei3n4erl
.ein3sp
.eise4
.ei2sp
@@ -162,12 +182,12 @@
.el2bi
.el2bl
.elb3s
-.el4fei
+.el2fei
.el2fl
.em3m2
.en1
.en4da
-.en4d3er4
+.en2d3er2
.en2d3r
.end3s
.en4dü
@@ -177,34 +197,34 @@
.enn2
.enns3
.ent3
-.en2ta
+.en4ta
.en4tei
-.en7thalp
+.en5thalp
.en4tio
.en4t1r
.en5trop
.ents4
-.er4bei
-.er8brecht
+.epi3c
+.er2bei
+.er6brecht
.er2bu
-.er4dan
-.erden6k
-.er4d3er
+.er2dan
+.erden4k
+.er2d3er
.er1e
.ere3c
.er2em
.erf4
.er1i
-.ers2
-.er8stein
-.erster6
-.er8stritt.
+.er4stein
+.erster4
+.er6stritt.
.er8stritten.
-.er4z3el
-.er4zen4
+.er2z3el
+.er2zen2
.es3p
.es3ta2
-.est6e
+.est4e
.es3th
.es3t3r
.et2s
@@ -212,66 +232,70 @@
.eug4
.eur4
.ext4
-.fe3la
-.fer4no
+.fe3la3
+.feri3
+.fer2no
+.fe2st
.fi3d
.fi3est
-.fi4le.
-.fi4len
+.fi2le.
+.fi2len
.fi2s
.flu2g1
-.fs4
+.fs2
.fu2sc
-.ga2me
-.gan4ga
+.ga4me.
+.gan2ga
.ga2s1
.gas3e
.ga4sp
.ga4t
.gd2
-.gebe4a
+.gebe2a
.geb2l
.gee4
-.gel4b3r
+.gel2b3r
.gel2d1
.ge3lu
-.ge3m
.ge5nar
+.gen4aug
.ge3n4e
-.gene7cke
+.gene5cke
.ge3n2o
-.ge3r4a
+.ge3r2a
.ger2e
.ge3ro
.ger4s
.ge3sa
+.ge3ste
.glan2
.glanz3
-.gol6der
-.gs4
+.gs4t
.gus2
.halt4e
+.han2f
.hau2t1
-.he2
-.he4bei
-.he3fe
-.he3le
+.he2bei
+.he2r
.he4r3an
.he3rat
-.her6b5ra
+.her4b3ra
.he3rer
.he3ri
-.he6r5inn
+.he4r3inn
.hin3u
.hips4
.hi4s
.hof1
.ho4fen
.ho4met
-.ia4
+.hus3s
+.ia2
+.ia4t
.im2a
-.ima4ge
-.im5m2
+.ima2ge
+.imm2
+.im5mu
.in1
.ind2
.in3gl
@@ -285,44 +309,48 @@
.ire3
.is2a
.is3ta
+.istri3
.it2h
.iv2
.joni1
.ka2b3l
.ka2i
+.ka5ka
.kal2a
.ka3le
.ka3t2a
.kat3i
.ka4ti4o
-.ki4e
-.klang3
+.ki2e
.ko3b
.kopf1
-.kor4da
+.kor2da
.kraf2
-.ks4
+.ks2
.kus2
.la3be
-.lan8de8mi
+.lan4de4mi
+.lat3s
.le4ar
-.le4gas
+.le2gas
+.leh4me
.le3n2i
-.lich8t7er8s
-.li2f
-.li4ve.
-.lo4g3in
+.lich6ter6sc
+.li4f
+.li2ve.
+.lo2g3in
.lo2sc
-.los3s4
+.lo4sk
+.loss4
.lo2tr
.lo3ver
-.luster6
+.luster4
.lus4tr
.lut2h
.ly2s3
.ma3d
-.ma3ge
.mal4e
+.mani2e
.ma2st
.mat4c
.ma5tr
@@ -331,8 +359,9 @@
.mel2a
.me3ne
.me3no
-.men8schl
-.men8schw
+.men4schl
+.men4schw
+.ment2
.mes4sp
.mi2f
.mik4
@@ -340,7 +369,6 @@
.mi2s
.mi4t1
.mm2
-.mutter5
.na3no
.na3t
.näs1c
@@ -349,20 +377,20 @@
.ne1ro
.ne2s
.nich2
-.nicht5e
-.ni4e
+.nicht3e
+.ni2e
.ni3k4l
-.no2th
.nul2
.nus2
.oa3
.ob1a
.obe2
-.ober5ei
+.ober3ei
.ob3i4t
.och3
.of2e
.oper4
+.op3fe
.or2a
.ord4e
.or3g
@@ -370,17 +398,18 @@
.ort2
.orts3e
.os3s
-.os4ta4
+.os4t1a4
.oste2
-.ost5end
-.os8ten8de
-.oste6re
-.os8terwe
+.ost3end
+.os4ten4de
+.os4teng
+.oste4re
+.ost5erwe
.os4tes
.os2t3i
.os4tig
.os4t3r
-.os4tu
+.os2tu
.ot1a
.ou2t
.ou4te
@@ -388,86 +417,91 @@
.öd2
.öl3l
.pab4
-.part4h
+.par2kl
+.part2h
.pe2c
-.pe3la
.pe3le
.pe3na
-.pf4
-.ph4
+.pf2
+.pf4l
+.pf4r
+.ph2
+.ph4t
.poka2
.po4st
-.postei6
+.postei4
.pro1
.ps2
.rabe4
-.ra3ch4e
-.ra3me
+.ra3ch2e
+.ra3e2
+.ra5me
.rau2m
-.rau8schl
-.räu3sc
+.rau4schl
.re3ale
.reb3s2
.re3cha
-.re5insz
-.reis6e5i
-.rei4s5t
-.reli1
+.re3insz
+.reis4e3i
+.rei2s5t
+.re3ke
.res6tr
.ri4as
-.richt6e
+.richt4e
.ro4a
.ro3be
.ro2e
.ro2h
-.ro3m
.rom4a
.ro2st
.ro2t3r
.rö2s
.ruf3s
.ruh2r1
-.runder6
-.rü1b
-.rü6cker6
+.runder4
+.rü3b
+.rü4cker4
.sa3br
.sali3e
.sami1
.sau1c
-.sau4er
-.sau5er.
.sch4
-.schaf8t7end
-.scheiner8
+.schaf6t7end
.se3ck
-.se2e
-.seein4
+.se2ei
+.seein2
.se2ha
-.sen4f
-.sen5s
+.sen3de
+.sen4f3
+.sen3s
.se3re
+.seri3e
.se1ro
+.ser2u
.se2t1
-.sha2
+.sha4
.si4en
+.si1er
.si3gn
.si4te
.ski1e
.skis2
.sour2
-.spani7er.
-.spiege8lei
-.st4
+.spani5er.
+.spiege6lei
+.st2
+.st4a
.stau8be8cken.
+.st4e
.ste2i
-.steiner8k
+.steiner6k
.sto4re
-.stro6ma
-.sucher6
+.st4r
+.st4u
+.sui4te.
.tage4s
-.ta3mi
-.tan4k3a
-.tan4k3l
+.tan2k3a
+.tank3l
.ta3ra
.tar3t2
.ta2t1h
@@ -477,30 +511,29 @@
.te2e
.te2f
.tehe3
-.teiler8s
-.tei8l7ersc
+.teiler4s
+.tei6l5ersc
.te3le
.te3no
+.tens4
.te1ra
.te2s
-.te4st
.test3r
-.th4
.ti2a
.ti2e
.ti2me
.ti4mes
.ti3r
.ti2s
-.tischen8
-.ti8sch7end
+.tischen4
+.ti6sch5end
.tite4
.tode4
-.to4der
+.to2der
.todes3
.to2n
.to4nat
-.ton3i
+.ton1i
.to4nin
.tons2
.to4pl
@@ -508,12 +541,13 @@
.to2w
.tri3es
.tro2s
-.ts4
+.ts2
.tse3
+.ts4u
.tu3ra
.tu3ri
.turm1
-.tur4ma
+.tur2ma
.ub2
.ufe2
.ufer3
@@ -522,70 +556,74 @@
.uma2
.ume2
.umo2
-.un3a2
+.un3a4
.un3d
+.une2
.un3g2
.uni4t
.un3s
.uns4t
.ur3a2d
-.uran6fa
+.ural4
+.uran4fa
.ur1c
.ur1e
-.ur4inf
+.ur2e3t
+.ur2inf
+.urin2s
.ur3o4m
.ur1o2p
-.ur3s2
+.ur3s4
.ut2a
.ut3r
.ve5n2e
+.ves3t
.voll1
.vo4r
.wah4l
.wa2s
.weg5s
-.weine4
-.wei4ta
-.welter8e
-.welter8k
-.wer6ker
+.weine2
+.wei2ta
+.welter4e
+.wer4ker
.wer4kr
-.wer4tr
-.wetterer8
+.wer2tr
+.wetterer6
.wi4e
.wor2
-.wort5en6
-.wor8tend
-.wor4tu
+.wort3en4
+.wor4tend
.wur2f1
.xe3
.ya4l
.zel4la
-.zelle4
-.zel6leb
-.zeug4i
+.zelle2
+.zel4leb
+.zeug2i
.zi2e
-.zie4l3u
-.zin4ka
-.zin4s3c
-.zin4st
+.zie2l3u
+.zin2ka
+.zin2s3c
+.zin2st
.zuch2
.zug3l
-.zu4gra
-.zu2pf
+.zu2gra
.zwe2
-.zweigen8
-.zwei8g7end
+.zweigen4
+.zwei6g5end
a1ab
-aa2be
aa1c
a1a2ce
aa2gr
a1akt
+a2al
+aa2l1a
+aa3lep
aals2t
-a1a2n
-a2ans
-a1aq
+a1an
+a3an.
+a1a2q
2a2ar
aa2r3a
aar3b
@@ -595,19 +633,17 @@ aa2rei
aarf4
aar3g2
aar3k4
+aar3s
aart4
1aas
-aas5t
aata2
aa2th
aa4t3r
aat4s3
2a3au
-a1ä
-a1b
+a1ä2
2aba
3abad
-abais4
ab1alt
a3b2am
ab2ant
@@ -618,33 +654,32 @@ ab2äu
2abbat
2abbin
1abd
-2a3be.
-2a3bec
-2abee
+ab5dec
+2abe.
+2abec
ab1eic
-abe3i4d
+abe3id
ab1eil
ab1ein
2ab2el
-abe2la2
+abe2l1a
+abela2d
2a3ben.
1abent
2aber
a2berd
-a3bere
-a3beri
ab1er2k
ab1er2r
ab1er2z
4abes
abe2s1e
ab3esse
-2abet
+2a3bet
2abew
1abf
-1abg
-3abga
+3abg
1abh
+ab5hän
2abi
4abil
ab1ins
@@ -675,27 +710,28 @@ ab2of
4abot
2abö
ab3r
-a4brä
a2bre
ab4ros
-2abrö
-a4bs
-1ab5sc
-1ab3s2p
+2ab4rö
+ab3sau
+1absc
+1abse
+1ab3sp
abst2
3absta
+ab3s4te
1abstu
ab3sz
-1abtei
+3abtei
abte2s
3abtr
2abu
-abu3g4
+abu3g
a2bum
ab1ur
2abü
1abw
-2aby
+2a3by
aby4t
3abz
2ac.
@@ -705,23 +741,22 @@ aby4t
a1cem
a1cen
a2ceo
+a4ch.
ach1a
-a1chal
a3chari
ach3as
ach3au
2achb
2a1che
-a2ch1e4c
+a2ch1e2c
ach1ei
-ach4ei.
+ach2ei.
a2chep
-a4cherf
-ach5erfa
-a4ch3erh
-a4ch3erl
-a4cherö
-a4ch3erw
+a2cherf
+a2ch3erh
+a2ch3erl
+a2cherö
+a2ch3erw
2achf
2a1chi
a2chim
@@ -733,42 +768,40 @@ a3cho.
a2cho2r
ach3öf
4ach3r
+a4chs
2achsc
-achs4el
+achs2el
ach3s2i
-ach3skr
-achs4or
+achs2or
ach3su
a4cht
-ach4tak
-ach6terf
-ach8tersp
-ach6t5erw
+ach2tak
+ach4terh
+ach4tersp
+ach4t3erw
ach4t1o
-acht5rat
-ach8traum
-ach8träume.
+acht3rat
+ach4traum
+ach6träume.
ach8träumen.
-ach6trit
-acht6s5al
-ach4tum
+ach4trit
+acht4s3al
+ach2tum
a1chu
-ach1u2f
+ach1u4f
ach3ü
2achv
-4ach1w
-a2chy
+4ach3w
a1ci
-a1ckar
+2acke.
a3ckel
+ack3erz
a2ckin
ack2sp
-acksta4
+acksta2
2a1cl
acon4n
2acu
-a1ç
-a1d
2ad.
2ada.
4adab
@@ -781,7 +814,7 @@ ad1an
2adat
a2d1au
a3dau.
-1a2dä
+1a2dä1
ad1c
1add
2ade.
@@ -791,31 +824,29 @@ a3dee
adefi2
2adeg
a3dell
-4a3den
+2aden
aden1a
ade4nat
-adeo2
+adeo4
ade1ra
a2d1erk
4ade1s
-ade3s2p
-ades4s
+ade3s4p
+ades2s
2adf
-4adh
-4adi
+2adh
+2adi
adi3en
adi3er.
-adie4sc
+adie2sc
adi4st
3adj
2adli
-3admi
4admu
ad2ob
ado2n
ado4na
a2dop
-ad2os
2adp
2adq
a2dre
@@ -825,10 +856,11 @@ ad3run
2ads2
ad3st
ad3sz
-2ad2t1
+ad2t1
ad4te2
+ad5tea
1adv
-2a3dy
+2ady
2a1e1
ae2b
a2ec
@@ -839,46 +871,50 @@ a2ek
a2el
a3el.
a4ela
-a4ele
-a4eli
a3els
ae2m
+ae2n1
ae2o3
aeop2
ae2p
-a3er.
3a2er2o1
aes2a
-ae2sc
-aes5t
+ae4sc
+aes3t
+aes5tr
+ae4ta
+a2e3u
a2ew
ae2x
-2afa
-af1ab
-a2f1a2n
-a3far
-a2f1au
-2afä
-a2f1än
-2afe
-a2f1ec
+a2f
+2a3fa
+a4f1ab
+a4f1a2n
+a4fap
+a4f1au
+2a3fä
+a4f1än
+2a3fe
+a4f1ec
a4fentl
a4f1ep
+a4fex
+a3fé
aff4a
af2f3l
aff2s
aff4th
-2afi
-afi6kanz
-afi4kat
+2a3fi
+afi4kanz
+afi2kat
afi2t
2af3l
af1la
-a1f4lu
-2afo
-a2f3oc
-a2ford
-a2f1ort
+a3f4lu
+2a3fo
+a4f3oc
+a4ford
+a4f1ort
afo1s
2afra
af3rau
@@ -896,7 +932,7 @@ af2t1a
af3tat
af2tei
af2te2l
-aft4erk
+aft2erk
af2t1o
af2tö
aft3r
@@ -904,10 +940,11 @@ af2tra
aft5rei
aft4stä
af2tur
-a2f3ur
-2afü
+af4tü
+a3fu
+a4f3ur
+2a3fü
afür3
-a1g
2ag.
2aga
ag1a2b
@@ -918,32 +955,40 @@ ag2del
ag2dr
ag2du
4age.
-age4l3ei
-age4ler
-4a3gen.
-age4neb
-a2gent
+age2l3ei
+age2ler
+4agen.
+agend2
+age2neb
+a2gentu
2ages
age4sam
+age3sc
age4s3in
+age4so
ages3p
-ages6sen
+ages4sen
+age3ste
ages3ti
3aggr
a2g1id
a2gim
+ag1inn
2a2gl
ag4lan
ag4las
ag3le
a4glö
2agm
-ag2n
+ag2n2
ag4nat
a4gnä
-ag4ne.
+ag4ne
+ag5neh
ag4nu
ago3b
+ag1op
+agori2
ag3rat
a2g3re
a2gri
@@ -952,11 +997,12 @@ ag3rin
2ags
ag3s2ah
ag4sam
-ag3s4eid
-ag7s8porta
+ag3s2eid
+ag5s4porta
agst2
ag1ste
ag3stö
+ags3tr
2agt
ag2th
2agu
@@ -984,7 +1030,7 @@ ahl1o2
ah2lö
ahl3sz
ahme1i
-ahme3s
+ahme3s4
ah3mu
ah4n3a
ah3nee
@@ -992,115 +1038,125 @@ ah2nef
ahn3el
ah4nerd
ahner4e
-ahner6le
-ahner4n
-ah2nin
+ah2nerl
+ah4ner4le
+ahner2n
+ah4nin
ah2no
+ahn3ste
+ahn3t
1a2hor
ah1os
ah3ös
-4ahr
ahr1a
ah3r2e
-ahren6sc
ahre4s
-ahr6tage
-ahr6teng
+ah3ri
+ahrta2
+ahr4tage
+ahr4teng
ahr2ti
-ahr4tro
-ahr4tun
+ahr2tri
+ahr2tro
+ahr2tun
ah2ta
ah2te2l
ah2t1ex
ah4t3r
-aht3s6
-a1hu
-ah1w
+aht3s4
+2a1hu
+ah3w
a1hy
2ai.
-ai1a4
+ai1a2
a1ia.
2aib
ai2bl
aid2s
-ai1e4
-ai3en3
-aif4
-ai1fr
-a4i3g4
+ai1e2
+ai3e4n3
+aif2
+ai3fr
+ai3g2
+aig4r
a3ik.
-ai3ke
+a4i3ke
ai2lar
ail3d4
ai2lei
ail3g
ai2lo
-4ain
+2ain
ain2a
a1ind
-ai5n4e
+ai3n4e
+ai4neb
ain3s
-ains2p
3airb
ai2sa
a3isch.
-ai5schw
+ai3schw
ai3s2e
-ais4se.
-ait4
+a2it
+ait4r
a3iv.
a3ivl
a3ivs
-a1j
a2jat
aje2
ajekt4o
+a2k
2ak.
+a3ka
2aka.
2aka3b
akab4r
-a2kad
+a4kad
2akal
-2a3kam
+2akam
2akan
2akar
ak4at
akat1a
-aka4tak
-1akaz
-4akä
+aka2tak
+1a4kaz
+2a3kä
2akb
2akc
2akd
-2a1ke
-a2kef
-a2k1em
-a2kent
-a2kes
+2a3ke
+a4kef
+a4k1em
+a4keo
ak2et
-a2keu
-2a1ki
+a4keu
+2a3ki
ak1ins
aki1s
1akku
2ak3l
-a1k4la
+a3k4la
+ak5lad
+ak5lan
ak4li
3aklö
-a1kna
-2ako
-2a1kr
+ak4lu
+ak5lun
+a3kna
+ak3no
+2a3ko
+2a3kr
4akra
ak3res
-a3k4ri
+ak4ri
3akro
-ak3rü
+a4k3rü
2aks
ak3sh
ak2t1a2b
2aktb
ak2tel
-akt2er
+ak3t2er
2aktg
2aktik
2aktis
@@ -1112,51 +1168,51 @@ ak5t4ri
2aktsi
2aktsp
2aktst
+2aktun
2aktw
-a1ku
+a3ku
2akun
-a2kup
+a4kup
2akur
aku2s
-4akü
+2a3kü
1akz
3akze
a1la
2ala.
-2alabo
+4alabo
+a2l3abt
+al1ac
al1af
-al1age
2alai
al1akr
al1am
al1ana
2aland
-a2lang
+a2l1ang
al1anz
al1app
a3lar.
al3arc
a3lare
+al2arm
2al1arr
a2lart
ala2s
-al1asi
-al1ass
a3lat.
-al4atm
+alat3s
alat3z
al1au
al3aug
a1lä
a2l1äm
al1än
-al1ärm
+al1är
al1äu
3albat
al2bär
-alber4e
-al4berh
-al4b3er4w
+al2berh
+al2b3er2w
al2b1l
al2boh
al2bon
@@ -1164,11 +1220,11 @@ alb3ru
alb3st
al4dan
al2dä
-al4d3erl
-al4d3ern
+al2d3erl
+al2d3ern
alde2s
ald3inn
-al2dra
+ald1r
al2drä
alds2
2ale
@@ -1181,47 +1237,48 @@ a2l1ei
a3l2eic
a4lein
a2l1el
-3a2lema
+5a2lema
a2l1e2mi
+al1emp
4a3len.
-alende4
+alende2
al3endr
-a4l3ends
+al3ends
a2leng
al2enn
-ale2p
-al1epo
-4aler.
+al1e2po
+4a3ler.
a2l1erb
aler2e
a2l1erf
a2l1er2h
-aler4kl
+aler2kl
a2l3erl
al1erm
aler4mi
a2l1er4r
-al2ers
+aler3s
a2l1ert
-3a4l3erwä
+aler3w
+3a2l3erwä
4ales
a2l1e4sk
a2less
a4leth
a2l1eu
alf4r
+1alge.
3algi
al2gli
al3glo
1algo
3algor
-alg4r
2ali
al2imb
al1imm
-ali4nal
+ali2nal
al1ind
-alin4ge
+alin2ge
a2l1in2q
al1ins
alken1
@@ -1235,22 +1292,21 @@ al2lab
al3lad
al2l1an
al2l1a2r
-al3le.
al4lec
3allee
al3lend
-all3erk
-aller4z
-al3les
+aller2z
+al5les
al2lid
-alli5er.
-alli7ers.
+alli3er.
+alli5ers.
al2lob
+allo3c
al2lop
al2löf
al2map
al4m3ast
-almo6de.
+almo4de.
2alo.
a2l1ob
3a2loe
@@ -1258,7 +1314,9 @@ a2l1of
4alog
alo2ga
alo2gr
+alo3is.
al1ont
+alori2
al1ort
2alos
a2l1ö
@@ -1267,13 +1325,12 @@ al2ös
3alpe.
1alph
al2pho
-alrat4
al3sak
-al6schei
-alsch3s
+al2schm
al3ska
-al5s6terb
-al2stu
+als2p
+al3sterb
+al3str
al2sum
al2t1ak
alt3alg
@@ -1282,83 +1339,90 @@ al2tan
al2tat
al2tau
1altä
+al4tb
+al4td
alt3eis
alt3elt
-al4temu
-al4t3er5f
+al2temu
+alter3f
+alt3er4pr
al2teu
al2tid
al2tin
alt1op
al2tö
-al4t3rat
+alt3rad
+al2t3rat
al2tre
al4t3ri
al2t3ro
-alt4stü
a1lu
alu3b4
-al2u3f
+al2uf
alu3g
al1u2k
a2lum
al1umb
a2l1ur
a3lus
-4aly
+2aly
al2zar
al2zau
al3zen
-alz4erk
+alz2erk
al2zw
+a2m
2am.
-am2a
+a3m2a
ama2ba
ama3d2
ama3g
-a2malg
-2a3m4an
-1a2maz
-2amä
+1amal
+a4malg
+2am4an
+1a4maz
+2a3mä
+a3me
4ame.
-a2meb
2amel
-am4e4n1
-amen6spr
+2am4e4n1
+amen4spr
+amen2t3r
+a5mer.
ame3r2a
amera3u
-a2m1erf
-1a2meri
+a4m1erf
+1a4meri
ame5r2u
2ame1s
a4mesh
-2a3met
+2amet
+a3mé
2amf
-a3mi.
-a3mie
+a3mi
ami2k
am4ing
-2a3mir
-2a3mis
+2amir
2amit
2amk
2aml
2amm.
am2mab
am2m1ac
-2ammal
-am4mant
+2am2mal
+am2mant
am2mar
am2mei
ammes3
am2mid
ammi2e
am2min
+4amml
am2mor
am2m1ö
ammu2
amni1
-a2mö
+a3mo
2ampe.
2ampen
am4pf
@@ -1366,12 +1430,14 @@ amp2f1a2
2am2ple
2ampo
am3pr
+am5pre
amp3s2
2am2s
am3sa
4amsc
am4schl
-3amse
+3am3se
+ams3en
am3s2h
am3so
am3sp
@@ -1380,37 +1446,41 @@ am3su
am2t1a2
am4tau
am2t1ä
-am2tei
amt3eig
am4tel
am2tem
amter4
-am4terh
-am4t3ern
+am2terh
+am2t3ern
am2t1ex
am2tis
am2tit
am2to
-am6tou
+am4tou
am2tö
am2t3r
am4tre
am4tri
+am4ts
am2t1u
-2amtv
-2amu
-3a2mul
+am4tü
+2am4tv
+2a3mu
+3a4mul
+am4us
+a3mü
+a3my
2ana.
2anab
ana3c
-4an2ad
+2an2ad
+ana2der
anadi1
an2ag
2a3nak
an1alg
-ana4lin
-2anam
-an2a3ma
+ana2lin
+an2a5ma
2anan
an4and
2ana1s
@@ -1429,23 +1499,26 @@ an3aug
an3ch
2and.
3an3d2ac
-and3arm
and3ei
-anden6ga
-an4d3ent
-and5erob
-ande4sc
+an2deng
+anden4ga
+an2d3ent
+ander2e
+and3erob
+an3des
+ande2sc
an2d1ex
-and4sas
-and4seh
+and2sas
+and2seh
and2so
-and6spar
-and6spas
+and4spar
+and4spas
and2su
4andu2
an2d1ur
andy1
2ane
+4ane.
an3e2c
a3nee
an2ei.
@@ -1453,106 +1526,114 @@ an3eif
3aneig
a4neis
3a2n1e4k
-ane2l
+ane4l
an1e2mi
a2nemo
-aner4fa
-a3nerg
+4anen
+anen3s4
+4aner.
+aner2fa
an2erh
-a4nerke
+a2nerke
4anern
a4nerz.
-an4erze
+an2erze
an1eth
3anex
1anf
2anf.
2anfab
3anfä
-an3fe
2anfi
-an4fj
anf3le
-4anfors
-anf5rau
+2anfors
2anfs
an3f2u
+2anfun
4ang.
1anga
2anga.
an2g1ar
2angas
+2angd
2ange.
1angeb
an2g1ei
-an4g3erf
-an4g3er4h
-an4g3er4w
-an4g3erz
+an3gen
+an2g3erf
+an2g3er2h
+an2g3er2w
+an2g3erz
+2angf
2angh
2angie
ang1l
an2gla
-ang5n
+ang3n
+ang5na
ang1r
ang3ra
-1an3gri
+an3gri
2angs.
ang4sto
angt2
-1anh
+1an3h
+2anhau
2a3ni
an2i3d
+aniel2l
ani3els
-ani5ers.
+ani3ers.
anig2
+ani2ka
ani3ke
3a4nim
a4nind
ani2o
an3i4on
-a4niso
+a4n3iso
2anj
2ank.
-an2kab
+an2kag
an2k1ak
an2kan
an2kei
-2an3ken
-ank5erfa
+2anken
+ank3erfa
an3kes
2anki
an2kid
an2klö
an2klu
ank3no
-an4k3opf
+an2k3opf
an2kor
ank1r
ank3ra
-an4kras
+an2kras
ank3rä
an2kro
2anks
ank3se
-anks2p
2ankt4
+1ankü
1anl
2anlad
3anlag
2anmo
1anmu
2ann.
+an3na
1annah
-an2nar
+an4nar
an3ne
an4nef
an4nei
an4nene
-annen3s4
+annen3s2
ann2er
2anns
-ann4s3p
+ann4sp
2annt
2ano.
1an1od
@@ -1563,6 +1644,7 @@ ano2la
1a2nom
a3nom.
2anoo
+an1op
a2n1or
ano2ri
2a3nos
@@ -1573,10 +1655,11 @@ ano2ri
an4same
an3sar
1an3s2ä
+an4sb
3anschr
+an4sf
+an4sg
an3skr
-ans1pa
-ans3pon
1anspr
1anst
an3s2z
@@ -1586,20 +1669,21 @@ anta4re
an3t2ä
1antá
3antei
+anteri2
an3tha
+1anthr
+an3ti
2antie
3antise
anton2
1antr
-ant3rin
1antw
2anu
anu3r
-anu1s
a1nü
1anw
2anwi
-an2zä
+an2z1ä
2anzb
2anzd
1anzei
@@ -1619,28 +1703,28 @@ an2z1i4n
3anzün
2anzv
2anzw
+an2zwä
an2zwi
2anzy
2ao
-aof4
ao3i
a1op
+ao2pe
aopf4
a1or
-a1os5
-aost2
+a1os3
+aos5ta
a3ot.
-ao3t4s
-2a1ö2
-a1p
-4ap.
-ap4a
+ao3t2s
+2a1ö
+aö4fe
+2ap.
+ap2a
apa3b
+ap4an
a2pe.
-a3pel
-a2pé
-a2pf
-ap2fa
+3a2pé
+a3p2fa
1apfel
2apfes
a3pfl
@@ -1648,17 +1732,15 @@ a2pht
2api
2apl
ap4la
-a3plä
ap3le
ap3li
ap2n
-3a2pos
a2pot
ap3pu
2apr
-ap2so
-aps4ter
-ap5t2
+aps2ter
+ap3t2
+ap5tag
2a3pu
2ar.
a1ra
@@ -1666,15 +1748,16 @@ a3ra.
ar2ab
2ar3abb
ar3abf
+ar3abr
ar3abt
+2arac
ara3d2
ar3adr
-ara3ge
+2arak
2a2r3al
-a3r4ale
+a3rale
a3rali
a3ralo
-2aran
a2r1ang
a2r1anz
2arap
@@ -1690,10 +1773,10 @@ ar1äs
2arb.
2arba
ar2bak
-ar2b3at
+ar2b1at
ar2bau
4arbef
-ar4b3ein
+ar2b3ein
2arbek
2arben
2arber
@@ -1703,21 +1786,21 @@ arb3erl
2arbo
2arb1r
2arbs2
+arb3se
arb3sk
arb3so
2arb3t2
2arbu
1ar1c
2archl
-2archr
+2ar3chr
ar2dau
arde4i
ar2dop
ar2d3r
-ar2du
a2rea
-are5aler
-a2reb4
+are3aler
+a2reb
aree2
ar1eff
a2reh
@@ -1730,15 +1813,18 @@ a3reih
areim3
a2rein
arein4b
-arein4s
-arein4t
+arein2s
+arein2t
a2rele
4arem
+are2mi
4aren.
-aren6sem
+aren4sem
+a2rentn
are3r2a
+arerau5
arer2e
-a4r3erei
+a2rerei
a2rerg
a2rer3h
a2reri
@@ -1747,6 +1833,7 @@ a2rerl
a2rert
ar2erw
2ares
+are3sc
ar2et
are3u
a2rev
@@ -1763,11 +1850,9 @@ arg4s
2arh
2ari
ar2ia
-a2rid
-ari3e2n
+ari3en
ari3erd
ari3erg
-arin3it
arin3s4
ar1int
a3r4io
@@ -1781,13 +1866,14 @@ ark3aue
arker2
ar2kil
2ark3l
-ar4klag
ar2kle
ar2klo
ark4lö
+ar2kn
+2arko
ar2koa
ar2kor
-ark3s4a
+ark3s2a
ark2se
ark3she
ark4tre
@@ -1800,53 +1886,56 @@ ar2m1ei
arm2or
ar2mum
4armü
-4arn
+2arn
ar2nan
arn2el
ar3ni
a1ro
arob2
4aroc
-aro8ckeng
+aro4ckeng
ar1o2d
ar1of
-aro2fe
+aro2i
2a3rol
-aro3m
a2r1op
a2ror
aros3
aro4st
1a2rou
-a2r1ö4
+aro2w
+2a2r1ö
+arö4l
2arp
arr1ac
-ar2r1ad
+ar2r3ad
ar2r1as
arre4n1
-ar2rh
2arri
ar2r3or
+ar2schl
ar3se
-ar3s2h
-ar3s2i
-ars3ka
-ars4kat
+arseri2
+ar3sh
+ar3s4i
+ars5ka
+ar3spe
ar3sta
ar2tau
2artb
-ar3t2e
-2artei
+art2e
+2ar3tei
+arter2e
2artex
ar3t2i
2arto
art3r
art4res
ar2tri
-2arts
art3ske
art2sp
2artuc
+2artü
2arty
2aru
a2r1uh
@@ -1864,13 +1953,11 @@ ar2zä
ar2zö
1arzt
arz4tei
-arz4tem
arz4ti
arz2t3r
2arzu
-ar2z1w
+ar2z3w
2asa
-a4s3aa
a2s3af
a3sag
a3s2al
@@ -1884,18 +1971,18 @@ a4s3aug
a2sä
as3ät
asbes2
-a6sca
+a2sca
a4schec
a4schef
-a4sch3ei
-a6scher6g
+a4scherg
a3s4chi
a2schm
+asch3ru
2ascht
a3schu
a4schum
2asd
-4ase
+2ase
a2seb
a2sec
a2s1ef
@@ -1904,14 +1991,14 @@ as1emi
a3sen.
ase4na
ase4n3o
-asen6sem
+a2sen2se
+as2ep
as2er
-as4erd
ase2re
-aser6geb
-a4s3erke
+a2s3erke
as4es
-ase4t
+ase4ta
+a2s1ev
a2sex
2asf
asges4
@@ -1924,46 +2011,46 @@ a2s3i2k
asin2g
as1inn
2asis
+2asiu
aska3s
-as3ku
2aso
-as3ob
-as1of
+as1o4f
a3sol
a3som
as1o2p
as1or
-a4soz
+a2soz
a2sö
-a2s1p
-aspek6to
+a2sp
+as3pan
+aspek4to
as2ph
-a3s2pi
+a3spi
as3pik
as3pio
a4spir
2aspr
-as2pra
2as3sa
ass2a3b
-ass6aus.
-ass2e
-ass3ein
+ass4aus.
asse3le
ass2i
as3ski
as3so
+ass3p
as2spo
as2spr
+as4sr
+as4ss
as2st
-as3sta
+as3stau
as3stei
as3sti
as3str
as3stu
-2asta
+4asta
a3stad
-a1stas
+a1st2as
as3tat
a3stä
as3te
@@ -1972,48 +2059,49 @@ ast2er
as4t3ese
as4tex
as2th
-ast2id
+ast2i3d
as3tie
as3til
+as4tl
as3to
as4tof
ast3orc
a1str
ast3re
as3t4ren
-as6t5ritt
-ast5roll
+as5tri
+as6t3ritt
+ast3roll
as3tub
2asu
as2ur
-asu4s3
+asu4s
+as4ut
a2sü
aswa2s
1asy
3asyl
2asys
-a1ß
-aße4
+aße2
aß2en3
-2a1t
-4ata
-at1abe
-at1abr
-at2a1f
-a5ta3g
+2at
+at1ab
+ata2be
+at2a3f
+ata3g
at2ago
ata3la
a3tam
+atan3k
at1apf
+ata3ra
at2ast
-at3att
+at1att
a2t1au
at1än
-4atb
at2c
a2teb
-a3tec
-ateien6d
+ateien2
at1eig
3a2teli
3a2temg
@@ -2023,35 +2111,36 @@ aten3s4e
a2tep
4ater
ate3r4al
-ate3ran
at4ere
atern2
ater3st
ate2ru
4ates
-ates4sa
-a3tet
+ates2sa
at2eu
a2tew
+a4th.
4atha
at3hag
at3hal
-a3t2heb
+at2heb
ath3in.
3athl
+a4thm
a4thr
at2hu
at3hü
-4a3ti
-ati4kab
-ati6k5erw
+a3ti
+at4ia
+ati2kab
+ati4k3erw
a4tinf
at2is
ati2sa
ati2se
a4tiso
atis3s
-ati6v5erf
+ati4v3erf
3atla
4atli
3atm
@@ -2059,9 +2148,11 @@ ati6v5erf
4atmä
4atmus
a2t1ob
+a3tol
3a2t4om
+ato4man
atom1e
-ato2mo
+ato4mo
at1op
at1ort
a3to3s
@@ -2075,13 +2166,15 @@ at4ron
at3rot
at3rü
at2sa
-at4schn
+at3sche
+at2schn
at2se
ats1e2h
at2si
ats1in
at2s1o
-at2s1p
+at2sp
+a4tst
ats3tät
at2su
at3ta
@@ -2095,19 +2188,17 @@ at4tang
at4tar
at4tau
at2tä
-4atte.
at2t3ec
at2tei
at3t2el
-4at5ter
at3thä
-at3ti
4atto
at2tob
+3attr
+att3rat
at2t3rä
att3s2
at3t2u
-4atu
a3tub
atu2n
a3tü
@@ -2117,12 +2208,13 @@ atz3elt
at2zem
at2z1er
a3tzere
+atzer2h
at2z1in
atz3t2
-at2z1w
+at2z3w
a2u
2au.
-2au3a2
+2au3a
2aub
au2bab
au2ban
@@ -2134,56 +2226,67 @@ au2bli
au2blo
au2blu
aub2si
+aub2str
2auc
+auch4str
au2dr
2aue
aue2b
+au3er.
au2ere
aue3rei
auer3ö
-au5erst.
+au3erq
+au3ersc
+au3erst.
au3ert
aue2s
-au2fa
+au4fa
+au5fac
+au5fah
auf1ak
+au5fal
+au5fam
auf1an
+au5fas
2aufe.
2aufeh
-4aufen.
+2aufen.
3aufent
auf1er
-au4fer4k
-au2feu
+au4fer2k
+au4feu
auff4
auf3ind
1aufla
-1aufn
+1au4fn
2aufo
+4aufö
auf3ski
auf3t2
2auft.
2aug
au2ga
au3g2ar
+aug2e
4augeb
4augeh
4augel
-aug2er
4augl
+au4gn
4augr
au3gu
-au3h
+au3h2
2au1i
au2is
-4auj
+2auj
auk3t
aule2s
-aul4les
+aul2les
au3lü
-4aum
-au2mal
+2aum
aume4n
-au4m3ent
+au2m3ent
au2m1e2r1
aum3eri
au2m1id
@@ -2192,50 +2295,51 @@ au4mit
au2m1o
aumo2r
aum3p2
-aum3s6
+aum3s2
au4mun
-4aun
+2aun
au3n2a
aun2e
-au4n3ei
au2nio
au2no
au3nu
a4unz
2aup2
+au3pf
2aur2
au1rh
+au3ru
aurü3
au2s1ah
-ausan8ne.
+ausan4ne.
au2sas
au2sau
2ausc
-au6schmi
+au4schmi
+au2scho
1ausd
2ause.
-au4s1eh
+au2s1eh
2ausen
-au4s3erb
-au4serf
-au4s3erk
+au2s3erb
+au2serf
+aus3erk
aus3erp
-au4serw
+au2serw
1ausg
au2sin
au2sis
-1ausl
au2so
aus1or
au2spr
1ausr
-auss2
3aussag
-aus4se.
-aus3st
+aus2se.
+aus3s2el
+aus3s2t
aust2a
2auste
-au5stein
+au3stein
aust2o
aus5tri
3ausü
@@ -2248,59 +2352,65 @@ au2t1äu
2autb
2aute
au4t1e2l
-au4ten4g
-au4t3erh
+au4ten2g
+au2t3erh
aut5ero
+au2tev
2autg
au2thy
+2auti
1auto
au4trö
-2auts
+2auts2
2auu
2auv
auve4
2auw
2aux
2auz
-auz2w
+auz4w
2a1ü
-a1v
av2a
-a3vang
+avari4e
avas4
ava3t2
-avener4
+avener2
2avi
a2v3r
-2a1w
+2aw
awi3e
a2wr
a1x
-ax2am
+ax4am
a2xans
-a3x2e
-a3xid
+ax2e
a2xio
axis1
+ay1
2a1ya
+ay2al
+ay2am
+ay2as
a1yeu
ayma4
-ay1of
ays2
aysi1
-ay3t
-a1z
-az4a
+ays4t
+ay5tes
+ay2u
+az2
a3za3d
3azal
-a3z2i
-az2o
-a3z2u
-az2zen
-az2zw
+azare3n
+az4at
+a3zi
+az3t
+a3zu
+azz3a
+az4zab
+az4zin
ä1a
-1ää
-2ä1b
+2äb
ä2b3l
äb2s
äbte1
@@ -2312,25 +2422,29 @@ az2zw
äch3l
ä2chr
äch4sa
-äch2s1o
+äch2so
äch2sp
äch2st
ächt4e
ä1chu
ä1ck
-ä1d
ä2da
+ädel1i
äde1s2
ä2d1ia
+ädi4e
ä2d3r
äd2s
-äd3te
+äd5tet
2ä1e
-äe4k
-ä3eu
+äe2k3
+äe4kl
äe2x
+ä2f
+ä3fe
äfe4n
äf2fl
+ä3fi
äfig3
äf3l
äf3r
@@ -2338,13 +2452,13 @@ az2zw
äf2s
äf3t2e
äft4s3
-ä1g
ä2g1a
1ä2gä
ägd2
+äg2e
ägen4e
äge2r3a
-äge3s
+äge3s4
ä2g3l
äg2n
ä2g3r
@@ -2356,13 +2470,12 @@ az2zw
äh1a
2ä3he
ä4h1ei
-äher8gebn
-äher5t
+äher3t
ä1hi
äh1in
ähl1a
äh3l2e
-äh4l3e4be
+äh4l3e2be
äh5ler
2ähm
äh3na
@@ -2371,55 +2484,61 @@ az2zw
2ähr
äh2rel
äh3ri
+ähr5sa
2ähs
2äht
ä1hu
-äh1w
+äh3w
2äi
ä1im
-ä2is
-ä3is.
+ä1is.
ä3isch.
-ä3isk
-ä1j
-ä1k
+ä1isk
äka2la
äk3l
ä2kle
äk4li
ä2k3r
ä1la
+äl4bc
älbe2
äl4bl
älk3
älks4
äl2l1a
äl2p3
-äl4schl
+äl2schl
äl2st
ält2e
älte1i
+äl5tet
ä1lu
-2äm4a3
+ä2m
+2ä3ma3
+äm4at
ä3me
ämer2s
+ä3mi
ämi3en
2äml
+ä3mo
ämoni3e
2ämp
-ämp7f4e
+ämp5f4e
äm2s
-ämt2e
+äm3t2e2
ämter3
+ä3mu
2än.
+änd4e
än2dr
-2än2e
+2ä3n2e
äne2n1
äne1s
-2än2f5
+2än2f3
änft2
4än3g2e
-änge4ra
+änge2ra
2än2gl
äng3le
än2gr
@@ -2431,6 +2550,7 @@ az2zw
änk2s
2änn
än3n4e2
+änner1
2äns
än4s1a
än2s1c
@@ -2438,36 +2558,47 @@ az2zw
2änz
ä1on
äo3s2
-ä1pa
+ä2p
+ä3pa
1äpfel
+ä3po
äp2pl
äp2pr
äp2s1c
äp4st
-1äq
-ä2r3a4
+ä3pu
+1ä2q
+ä2r3a2
är4af
+ära4r
är1ä
+2ärb
är2b3le
är1c
2ärd
ärde4s
2äre
+4äre.
ä2r1ei
ä2r1e2l
-äre2m
+4äre2m
är1emi
-äre2n
+4äre2n
ä2rene
+4ärer
ä2rerh
är2es
+4äres.
+ä2rese
ärf2s
är3ge
ärg4s
+äri2e
ä2r1ind
är1int
-är3ke
+är3k4e
ärk2s
+2ärm.
ärm3arm
ärm3at
ärme1e
@@ -2479,42 +2610,44 @@ az2zw
är3re
ärse2
är2seb
-är4seh
-ärs1er
-är2si
+är2s3eh
+ärs3er
+är2s3i
är3spu
är2st
är3str
2ärt
-ärt4e
+ärt2e
är2th
-ärt2s3
+ärt4s3
ä2rü
-1ärz
är2zu
-är2zw
+är2z3w
+ä3sa
2ä3s2e
äse3g
äse1i4
äse5ref
-äser4ei
-äse4ren
+äser2ei
+äse2ren
äser2i
ä3s2kr
-ä2s1p
+ä2sp
2äs2s1c
äss2e
-äss5erkr
-äss5ersa
+äss3erkr
+äss3ersa
äss3erw
-äs2sp
+äs2s3p
äs2s3t
-ä4s3t
-äst4e
+ä2s3t
+äs4tc
+äst2e
+äs5tet
1ästh
+äs4tl
äs4tr
ä3su
-ä1ß
äß1erk
äß1ers
ä2t3a2
@@ -2525,19 +2658,23 @@ az2zw
äte3l2
äte2n
äteo2
-äter4bl
-ät2et
+äte4pi
+äter2bl
+ät2e3t
+ä2th
+ä4thc
ät1id
ät1ob
ä2t3r
-ät4s3a
+ät4sa
+äts3au
ät2sä
-ät4schl
-ät4schr
+ät2schl
+ät2schr
ät2s1i2
äts3l
äts1or
-ät2s1p
+ät2s3p
ät2s3t
ät2su
ät2tei
@@ -2560,7 +2697,8 @@ az2zw
äu2ma
äum3p
äumpf4
-äum4s5
+äum4s3
+äums5t
2ä2un
äun2e
äu3nu
@@ -2569,24 +2707,22 @@ az2zw
2ä3us.
2äusc
äu4schi
-äu4schm
+äu2schm
äu3s2e
äuse1i
ä3usg
ä3usk
ä3usn
-äu2s1p
+äu2sp
äus2s1c
1äuß
äut2e
äu2tr
-ä1v
ä2vi
1äx
-ä1z
ä3ze
-â1t
-á1n
+á1
+1b
3ba.
b2aa
b3a2ba
@@ -2595,57 +2731,63 @@ b3a2ba
ba2bl
ba2br
2b1abs
-bach7t4e
-ba4ck3er
+bach5t4e
+ba2ck3er
back3s4
-ba3d2e
+ba3de
bade1i
2b1adel
+bader4
2b1adl
2b1adm
b1a2dr
ba2du
2b1af
3bah
-bah6nene
+bah4nene
bai3d
bais2
b2ak
-ba2ka
-ba2k1er
-ba2k1i
-ba2k5l
-ba2k3r
+ba4k1a
+ba4k1er
+ba4k1i
+ba4k1l
+bak3r
+ba4kra
+ba4kre
ba2lab
ba2l1ak
ba3lal
ba2lau
baler2
-ba4l3erk
+ba2l3erk
balk4a
balke4
bal4l3eh
-bal4l3ei
-bal6lerg
-ball6erk
+bal2l3ei
+ball4erk
+ball3s
+bal3tin
+bal2tr
2b1am
-b2a3ma
-ba2me
+b2ama
+ba5maz
+ba4me
4bamt
ban2a
3b2and
band1a
-ban4dal
-ban4dan
-ban4dar
-ban6deng
+ban2dal
+ban2dan
+ban2dar
+ban4derk
+ban4derz
ban2dr
ba3n2e
2banf
b1ang
ban3gl
ban4k1a
-banker4
ban2kl
ban2kn
ban2kr
@@ -2663,10 +2805,8 @@ bar3ast
ba2rat
bar3de
ba2rei
-ba3r2en
-barer5ei
-barer4t
-barf4
+barer3ei
+barer2t
3bar2s
bar3sc
b1arz
@@ -2680,17 +2820,18 @@ bas4st
ba2st
ba4t3ent
bat2o
+bau1
3bau.
bau3b
-bauer4l
-bauer4s
-bauer4w
-bau1fl
-bau1fr
-bau3g2
+bauer2l
+bauer2s
+bauer2w
+bau5fa
+bau3fl
+bau3f4r
+bau3g
b2auk
bau3r
-bau1s
bau3s2k
baus4t
b1a2x
@@ -2699,10 +2840,10 @@ ba1yo
3b2äd
2b1äh
b2äl
-2bärz
+2b1ärz
b2äs
2bäug
-4b1b
+2bb
b3be
bbe4n3
bbens2
@@ -2710,74 +2851,72 @@ bbe4p
bb3le.
bb2lö
b3brec
-b3bru
-bbru2c
+b3bru2
bb2s
bbu1
-4b1c
-2b5d2
-bdä4
+2b1c
+2bd2
+b3da
+bdä2
bdän3
bde1s
bdome4
-1be.
+3be.
3bea
be3ab
be3an
+be3as
beat2m
be3au
be4au.
-3beb
b1ebb
-1be1c
-2becht
+3be1c
+4becht
2b1e2del
bedi4
be1e2h
bee2l
be3ela
+be1en
bee4rei
be1erh
be1erl
be1ert
be1eta
-bef4
2b1eff
-be3g4
+be3g2
be2he.
beh5ri
bei3b
2b1eier
-bei1f4
-bei4ge.
-beige4l
+bei3f4
+beige4be
+beige4ge
+beige2l
beige4p
bei3k4
bei3l2a
2b1eime
be1ind
be1inh
-bein6hal
-bein4hi
+bein4hal
+bein2hi
bei3sc
beis2e
bei1s4t
beit4e
beit2s
-beit4sk
-beits3p
-3bek
+beit4s3k
3bel
-be3lag
+b4el.
+be3l2ag
be3las
bel3d
be3lec
4be2lek
be2l1en
-bel3ere
be2let
bel3f
-beli4e
bel3la
belle4n3
bel3li
@@ -2785,13 +2924,11 @@ bel3om
be2löf
bel3sz
belt2
-bel4un
-1bem4
+bem2
3b2em.
3b2e3ma
2b1emp
2bemul
-1ben
be5nabe
ben3ar
be4nas
@@ -2800,58 +2937,59 @@ be2nä
b2ene
be3nei
be4n3end
-be4ners
ben2eu
3beng
be2nid
+be2nik
be4nis
ben3n
-5benp
+3benp
b2ens
-ben4s3pa
-ben4spr
+ben2spa
+ben2spr
benst4
3bensz
2b1entb
2bentd
-4benteu
+2benteu
2bentf
ben3th
-ben6thei
+ben4thei
ben5t4r
2b1ents
-2b3entw
+2bentw
ben3un
b2en3z2
be1o
2b1epi
2bepoc
be1ra
+ber3a2d
be2rak
be2r3am
be2ran
bera2s
berb2
-berbla4
ber3d
be2r1e2b
-be4reck
-be4r3eiw
+be2reck
+be2r3eiw
+ber3ell
bere2m
-be4rene
-ber4erg
-ber4erw
+be2rene
+ber2er
+ber3erk
bere4sc
bere4t
berf4
-ber4g3af
-ber4gal
-ber4gli
-ber4hab
+ber2g3af
+ber2gal
+ber2gli
+ber2hab
beri2d
-ber4in.
-be5r6inne
-berin4s
+be3r4in.
+berin2g
+be3r4inne
be2ri4o
ber3iss
ber3ko
@@ -2859,17 +2997,19 @@ ber3kr
ber3n2a
bern2e
b1ernt
+be4roh
be2rö
3bers.
ber5se
-ber3st4a
+bers4k
+ber3st2a
bert2a
bert2e
bert2i
berz2
ber3ze
ber2zö
-3b2e1s
+b2e1s
be3sa
bes4abb
bes2am
@@ -2880,28 +3020,27 @@ bes2au
be2sep
be2s1er
be2s1id
-bes2po
bes3sa
-bess4e
+bes3s4e
b3esst.
bes3sz
-be4stab
+be2stab
beste2
-be6stein
-bester4
-bes6terh
-be4s5tol
-bes4t3o4r
+bester2
+bes4terh
+besti3en
+be2s3tol
+bes4t3o2r
bes3tos
best4r
-be4s3trä
-be4s3tur
+be2s3trä
+be2s3tur
be2sur
be3s4ze
-3bet
be3tam
be3tha
be3thi
+bet4o
bet2sp
be1un
be1ur
@@ -2909,24 +3048,27 @@ be1ur
3b2ew2
2b3e2x
3b2ez
-2b5f4
+2bf2
bfal2
bfal3t
-2b1g2
-b5ga
+bfang3s
+bf4lö
+bf4ri
+bf4ro
+bf4rü
+2bg2
bge3
bgel2e
-bge5n
+bge5na
bges4
2b1h2
-b5hä
-1bi
bi1ak
bi2ar
3bib2
-bibe2
+bibe4
biber1
bi2c
+bid2
bi3do
bien3s
bieres4
@@ -2939,9 +3081,8 @@ bi2ke.
bi2kes
bi2kre
3bil
-bil2an
-bil3ans
-bil4deb
+bil2deb
+bil3der
bi2lei
4billu
bi2lu
@@ -2952,39 +3093,44 @@ bine4n
b1inf
bin4fo
bin2g3a
+bin3gl
2b1inh
-bi2n3ok
+bino2
+bi2n1ok
bin4ol
2b1int
2b1inv
bi2o3
-bioi2
biri1
3bis
bi3si
b1iso
bi2sp
+bis4sa
bis2s1c
bi2st
-bi3sta
-bi1s4tr
-b2it.
+bi3s4ta
+bi1s5tr
+bis6tre
+3b2it.
b2ita
b2ite
b2iti
bit4r
bi2tu
bi3z2
-4b1j
+2bj
bjek4to
-2b5k4
-bl4
+2bk2
+bk4ne
+bk4nu
+bl2
2bl.
bla3b4
2b1lac
b3lad
b2lanc
-blas3er
+bl4at
b2latt
b2lau.
b3laus4
@@ -2999,12 +3145,14 @@ b3leb
b3leg
4bleh
b4lei.
+3bleib
2b3leid
2bleih
b3lein
blei3sc
2bleit
ble3l
+blem3p
ble2n
b3lenk
b3lese
@@ -3025,45 +3173,50 @@ b2lit
b3lite
b2lo
b4lo.
-3b4loc
+b4loc
+2b5loch
b4loi
+blo2id
b3los
3b4lum
2blun
b2lus
3blut
-blu4tem
blut1o
+blut3sc
3blü
-2b1m
-4b5n2
+2bm
+2b1n2
+b3na
bnas4
-bni2
+b3ne
+b3ni2
bnis1
-bo4a
-bo5as
+bo3as
b1o2b
bo3ben
bob3r
bo2c
bo3ch2
bo3d2
+bo4dd
boe1
-bo2e3i
+bo2ei
2b1of
-bo3fe
bo3he
boh2ra
-boh3rer
boh2u
bo1is
bo2lan
bo2lau
-bol5le
+boli2e
+bol3le
+bol3za
3bon.
bo3n2a
+bond1
bon2da
-bon2d1e
+bon2de
bo2ne
3bons
boo4l
@@ -3077,94 +3230,105 @@ bo2rau
bo4rä
bor2da
bor2d3r
-bo2rei
bo4rig
bor3m
bor2s
b1ort
-bor4ter
-bor6t5rat
+bor2ter
+bor4t3rat
bo4ruh
bo2sc
bo3se
bo4s3p
bos3t
3bot
-bote3n4e
+bot2e
+bote3n2e
bo3th
bot2st
-bot5t
-bo2xo
+bot3t
+bo3v
b1oz
bö2b3
2böf
2b1öl
-bölk3
-2b1p4
+2bp2
bpa2g
-2b1q
-b2r4
+b3pf
+bp4rä
+bpri2
+2bq
+b2r2
2br.
b4ra.
2b3rad
2b4rah
-b4ra3k
+b4rak
+bra5ka
+br4al
+b4r4am4
brast4
2b3rat.
-brat3er4
-bra6terg
-2b3ratg
-3brä
-4bräd
+brat3er2
+bra4terg
+2bratg
+2bräd
brä4u
2bre.
-6b5rechte
+4b3rechte
2b3red
2b3ref
2breg
+b3reic
b3reif
+b3reiz
2brek
-breli1
-b4rem
b4ren.
2b3rent
2breo
2b3rep
b4rer
b4res.
+b3rese
b3rest
-b4ret
-bret6t5en
+bret4t3en
+2b3reu
b4rez
bri2da
-brie4fa
+brie2fa
2b3riem
b4rien
bri2er
b3ries
2brigk
+b4rik
+bril3
b4rina
-2b3rind
+2b5rind
b4rio
b4risc
b3ritt
+b4riz
brob2
2b3roh
2b3rol
-bro2ma
+bro4ma
b4ron
2b3rost
+bro4tei
bro4tr
brot3t4
2b3rou
-3b4rö
+3brö
b4ruc
2bruf
b4rum
2b3rund
-brus4
-brust3
+brun4e
+bru2s4
+brust1
bru2th
+b4ruz
3brü
4b3rüb
2b1s
@@ -3178,10 +3342,12 @@ b3s2äu
b3sc
bsch2
b4schan
-b6schef
+b4schef
bs2chi
+b5schl
b4sco
bs2cu
+b3se.
bse2b
b3sel.
bse2n1
@@ -3189,7 +3355,7 @@ b3sen.
b2s1ent
bs1erf
bs1erg
-bs3e4r3in
+bs3e2r3in
bs1erk
bs1ers
b3s2es
@@ -3203,31 +3369,33 @@ b3sol
b4sop
bso2r
b2sö
-b3s2pi
-bs2pl
-bs2pu
+bs2p
+b3s4pi
+bs3po
bss2
bs2t
+b4st.
bst1a2b
bst1ak
-bst3ank
+bst1al
+bst3an3k
bs4t1as
b3stä
+b5stär
bs3tät
bst3emi
bst1er
+b3s4tet
bst1h
bst3ink
b2stip
b3sto
b4stob
b4stod
-bs4tol
b4stor
b3stö
-b4strac
+bs3trau
b2s3trä
-b4s3treu
bs4tri
bst3ro
b3stü
@@ -3235,26 +3403,27 @@ b4stüb
b2s1un
bs2zep
bs2zi
-4b1t
+b4szü
+2bt
b3t2a
bta2s
btast3r
-b5te
+b3te
b2t1h
bt2i
bti2s
-bt4r
+bt4ra
btran2
bts2
b3tü1
-buche4
-bu4chec
-bucher4
-bu6ch5ers
+buche2
+bu2chec
+bucher2
+bu4ch3er4s
bu2chi
-buch3s4p
+buch3sp
bu2e3
-bu2f
+bu4fe
bug3
bu2gr
bul2l3a
@@ -3263,8 +3432,8 @@ bul2l3a
2buml
2b3umr
bun4a
-bun4d3er
-bunde4s
+bun2d3er
+bunde2s
b1une
bung4
b3un3gn
@@ -3273,43 +3442,51 @@ bur1c
b2ure
b2urg
burg1a
-bur4gan
-bur4gar
-bur4gin
-bur2gr
+bur2gan
+bur2gar
+bur2gin
+bur4gr
bu3r2i
2burn
b3ursa
burts3
+bu3ru
bu2sa
bu2sc
bus3cha
bu3sche
-bu6schei
-bu6sch5el
+bu4schei
+bu4sch3el
+bu4scheu
+bu3schu
busch3w
bu3shi
bu2sin
-bu2s1p
-buster4
+bu2s3p
+buster2
bu2su
but2a
+bu3tan
buto3re
2büb
+bü4bc
bü1c
bügel3e
-2b1v
-4b5w
-3b2y1
+2bv
+2bw
+bwur2
+b2y1
bya2
byo2
by3p2
-bys4
-2b1z4
-b5ze
+bys2
+bys4t
+by5tau
+by2te
+2bz2
bzeit1
+bz4wa
1c2a
-cab4
ca3bl
3ca2c
ca2e3
@@ -3317,22 +3494,22 @@ ca3g2
ca1h
cal2a
cala3b
-cal2f3
cal3t
3cam
2can
cana3
ca2pe
-car5n2
+ca3r2a
+car3n2
+car5nu
carri1
car2s
ca3s2a3
cas5to
ca3t2h
ca1y2
-cä3
+cä1
cäs2
-c1b
2cc
c1ce
c1ch2
@@ -3342,11 +3519,13 @@ c3do
1ced
ce2dr
2cef
+2ceh
ce1i
ce3in
2cek
3cels
cen3a
+cens2
ce3nu
cen3un
ceo2
@@ -3354,31 +3533,30 @@ ceo2
cer3a
cere1
cere3u
-ce3r2i
-ce4ris
+cer2i
+ce2ris
ce1ro
ce3s4h
1cet
-ceta2
+ceta4
cet1am
ce1u
1cé
-c1f
-c1g4
+cg4re
c2h
-4ch.
+2ch.
2chab
ch3a2b3i
cha2ck
2chaf
2ch1a2g
2ch1ak
-chal6l5ei
+chal4l3ei
chan4a
3chanc
-chan3f
ch1ang
4chanl
+ch3ansa
4chanz
3chao
4char.
@@ -3388,8 +3566,8 @@ ch1ang
cha2sc
chasi1
1chato
-2chatt
-ch5austr
+4chatt
+ch3austr
chau3t
ch1äh
ch1ärm
@@ -3398,36 +3576,39 @@ ch1äs
2chb
2chc
2chd
-che3b4
-ch3e4ben
+cheb4
+ch3e2ben
+che3bl
ch3echt
ch1edi
che2el
1chef
3chef.
-che4fer
+che2fer
3chefs
2cheh
2chei
ch1eim
-4chelem
-che4ler
+2chelem
+che2ler
3chemi
2chemp
-che4neb
-che4nid
+che2neb
+che2nid
che2no
-4chents
-4chentw
+2chents
+2chentw
che2r3a
-4ch3erbs
-6chergeb
-4cherke
-cher6zie
-ch3es4s
+2ch3erbs
+2ch3er2de
+2ch3erfa
+4chergeb
+2cherke
+cher4zie
+ch3ess
ches5t
-4ch1e4ta
-2ch3e4x
+2ch1eta
+2ch3e2x
1ché
2chf
2chg
@@ -3446,31 +3627,35 @@ chi3na
2chiso
2chj
2chk
-2chl4
+2chl2
+chl4a
ch2le
chle2i
ch3lein
ch4len
4chli
ch2lu
-4ch2m4
-4chn4
-chner8ei.
+2ch2m
+2chn2
+chn4a
+chn4e
+chner4ei.
2chob
-cho2f
+cho3ch
+cho4f
ch1off
+cho5fr
chof4s
ch1oh
cho3l2a
ch1orc
-cho4rei
ch1ori
ch2os
ch3öl
3chör
2chp
-ch2r4
-2chra
+ch2r2
+2chr4a
ch3rad
2chre
ch3rh
@@ -3478,11 +3663,17 @@ ch3rh
3chromo
3chron
ch5ros
-4chs
-ch2spo
-ch4stal
+ch4ry
+2chs
+ch2stal
2cht
-ch2tru
+ch4tb
+ch4tg
+ch4tm
+ch2truh
+ch4ts
+chts3trä
+ch4tw
2chuf
2chuh
2chum
@@ -3493,11 +3684,11 @@ ch2tru
ch1urs
2chut
chut4t
-4chü
+2chü
2chv
-4chw
-1chy
+2chw
2chz
+ci2al
ci1c
ci1es
c1ind
@@ -3505,20 +3696,21 @@ cins2
c1int
ci2s1
1ci3t2
-c1j
c2k
-4ck.
-c4k1a
+2ck.
+ck1a
1cka.
2cka2b
2cka2c
ck2ad
-1ck2ag
+1ckag
+ck2age
2ckal
-cka2m
+cka4m
2ckan
2ckap
cka4r1
+1ckard
1ckat
ck1ä
2ckb
@@ -3528,23 +3720,26 @@ ck1ä
2cke2c
2ck1ef
4ckeff
+2ck1eg
2ck1eh
4ck1ei
+3ckem.
2ckemp
cke4na
-6ckensem
-4ckentf
+4ckensem
+2ckentf
4ckentw
cke2ra
-ck2ere
-6ckergeb
-4ck3er4hö
+4ckeremi
+4ckergeb
+2ck3er2hö
ckerk4
-cker6lau
+2ckerke
+3ckerl
ck2ern
2cke2ro
-ck1err
-6ckerzeu
+2ckerz
+3ckerzen
4ckese
ck2et
4ckex
@@ -3554,19 +3749,26 @@ ck2et
1cki
2ck1i2d
ck1in
+4ckinn
4ckint
3ck4is
2ckk
2ck3l
2ckm
-2ck5n
+2ck3n
+ck5nac
2ck3o2
-ckos6t
-ck3ö2
+cko4f
+cko4p
+ckos4t
+ckos6te
+ck3ö
+ckö4f
2ckp
2ck3r
-4cks
+2cks
cks2al
+ck4ske
ck4spen
2ckt
ck3te
@@ -3574,6 +3776,7 @@ ck3t2i
1cku
2ck1uh
ck1um
+2ckuni
2ckunt
2ck1up
2ckü
@@ -3586,12 +3789,9 @@ cle4a
clet4
clin2g
cli2p1
-clip3a
clo1c
clo2ck
-clo3f
1clu
-clu4b
c2m2
c3me
c3mu
@@ -3599,63 +3799,74 @@ c3mu
co2c
co3ch
co2d2
+co4de.
co3di
cof3f2
-coi4
-co1it
co2ke
-co3la3
+cola3
co2leu
co3l2o
+co4mp
com4te.
-comtes4
+comtes2
con2ne
+continuati6
co2o
-coo1p
-co1p
+coo3p
+co3p
+co4ps
co1ra
+4corb
cor2da
+cor3de
co4re
+co5ree
cor3t
cos3t
co4te
cou3si
-cô4
-2cp
-2c1q
+cô2
+cô4te
+2c2p
+2cq
1c2r2
+c4ras
c3rä
-c4re2
-cre4mes
+cre2
+cre4me
3crew
2cri
-cros4
2cry
2cs
cs2a
-cs4f
-c4si
+cs2f
+cs4fr
+c2si
cst2
c1s2ti
c1s4tr
-4c5t
-cti2
+2ct
cti4o2
ction3
-ctur6
-c6tz
-1c4u
+ctur4
+1c2u
2cua
cu2e
-cu2p3
-cup1e
+cup3
+cu4pa
+cu4p1e
+cu4pl
+cu4pr
cussi4
-c1w
+c2v
+c3ve
2cx
1cy
-c1z
+1ç
+1d
3da.
da1a
+2d1aal
2d1ab
d3a2bak
d2abä
@@ -3670,28 +3881,30 @@ da3brie
d2ab4rü
d1ac
dach3a
+dache4
da2cho
-4d3achse
+dach3s
+2d3achse
2d1ad
da2de
da2do
da2d4r
d1af
-2daff
-da1f4l
+da5fab
+2da4ff
+da3f4l
dafo4n
d1ag
dagi4
dag2o
da1h
dah3l
-dail5
+dail3
da1in
2d1air
da1is
-da2kro
-dal2a
-2d1a2lar
+da4kro
+2d1alar
dal3b2
4d1all
da2lop
@@ -3701,19 +3914,19 @@ d1al3t
2dalte
da1lü
3dam
-da2mei
+d1a4mei
d1amma
4d1ammä
damo3
d2amp
-damp7f8erf
+damp5f4erf
4d1amt
3d2an.
d1ana
da2nan
da4n4at
2danb
-dan4ce.
+dan2ce.
d1and2
2danda
d2andy
@@ -3723,6 +3936,7 @@ d2andy
d1ang
2danh
dan2kl
+dan3kla
dan2k1o
dan2kr
2danl
@@ -3730,6 +3944,7 @@ d1ann
2danna
d1a2no
2d1ans
+danti3e
2dantw
2danw
d1anz
@@ -3743,31 +3958,37 @@ da2po
da3pos
4dapp
d3apte
-4daq
+2daq
da4r1a
2darb2
2d3arc
dar2d1e
-dare2
+2d1area
daren1
dar3g
+d3a2rist
dark2a
3darl
dar2m1a
dar2m1i
-dar4mu
+dar4mun
da2r3o
-3dars
+d1arr
+2darres
+3d2ars
2d1art
dar2th
+4d3arti
dar2tr
da2ru
d1arz
da1s2
da3sh
-d1as3p
+d1asp
das3s
-das4t
+2d1assi
+2d1as4t
+da2s5tr
dat2e2
da3tei
4d3a2tel
@@ -3782,8 +4003,8 @@ dat2st
2daud
dau3e2
dauer3e
-daue6rei
-2d3au2f
+daue4rei
+2d3au4f
2d3aug
2dauk
da3unt
@@ -3795,44 +4016,56 @@ d1ax
2d1äg
2d1äh
2d1ämt
-dän3a
+dä4n3a
2d1änd
2d1äp
2däq
-2därz
+2d1ärz
2d1ä2u
dä3us
2däx
-4d1b4
+2db2
dbau2c
dbauch3
dbe2e
+db4la
+db4ri
dbu2c
2dc
d3ch
-4d1d2
+2dd2
d3da
+ddar4m1
d3dä
d3de
d3dh
-1de
dea2d
+3dean
de3ar
+de3as
de3a2t
-deb4
+deb2
+deb4r
3debü
de1c
de4ca.
de2cka
-de2del
+deco3
+2d1e2del
de2dit
-2de3e4
+2dee2
+de1eb
+de1e4g
+de1em
+dee4n
+de1er
+de1es
def4a
de2fa.
2d1eff
def4l
deg2
-degene7
+degene3
de3gl
deh2a
dehe2
@@ -3840,16 +4073,18 @@ dehe2
de3ho
2d1ehr
d1ei
-3d2eic
-de3i4den
+3d2e4ic
+de3i2den
de3il
3d2eim
4deime
dein2d
-de3inse
+d2einfr
+4deinr
+d2e3inse
de3inst
-dein6sta
-dein6sti
+dein4sta
+dein4sti
4d3einw
de3io
2deise
@@ -3857,15 +4092,16 @@ d4e1ism
dei2sp
2dekz
de2l1ac
-del4ade
de3lak
-de4l3aug
+dela4t
+del3ate
+de2l3aug
del3änd
del3b2
del3d
del1ec
3de3leg
-delei4g
+delei2g
2delek
2delem
de2len
@@ -3875,44 +4111,43 @@ deler4r
2delfm
3delik
del2la
-dell3au
+dell3auf
del2l1ä
delle2
-del4l3eb
-del4lei
-del4l3er
+del2l3eb
+del2lei
+del2l3er
de2l1ob
de2lop
del2se
del2so
-del2s1p
+del2s3p
del3t4
dem2ar
2d1emb
-dement4
-de6mentg
-dem5ents
-de3min
+dement2
+de4mentg
+dem3ents
+demi2e
2d1emot
2d1emp
d2emu
d4en.
-den2am
dend2
de2n1e2d
de4n3end
de2nep
-4denerg
+2denerg
de3n2es
-4d3en4ge.
+d3en2ge.
de2ni
denk3li
-dens4am
-den6scho
-dense2
-4den4sem
-den6sere
-den6s5tau
+dens2am
+den4scho
+2den2sem
+den2ser
+dens3tau
+den4stie
2dentd
2dentf
2dentg
@@ -3920,93 +4155,102 @@ den3th
2dentn
2dentw
2dentz
-den6zers
+den4zerf
+den4zers
de2ob
2deol
dep4l
2depoc
d4er.
+dera2b
der3af
de2rak
dera2n
de3rand
de2r3ap
-de1r2a4s
-de4r3asi
+dera4s
+de3r2ass
der2bl
-4d1erbs
+2d1erbs
2derdb
de2r1e2b
-de4reck
-de4r3ei4s
-5d4erem
+de2reck
+der3eis
+3d4erem
d4eren
-de4r3end
-5d4erer
-der4erf
+de2r3end
+3d4erer
+der2erf
+der3erl
derer3n
der3ero
-derer4t
-derer6ze
-5d4eres
-de2r3eu
+derer2t
+3d4eres
+der3ess
+de2r1eu
derf4
d4erfl
d3erheb
d2erhü
de2r3id
-derin4f
-de6rinnu
-derin8teg
+de4rinnu
+derin4teg
der3k2
-4derklä
+d3erken
+2derklä
+3derlan
d2erm
+de4rn
de1ro
derö2
der3r
+de4rs
+der3san
+2dersat
derst2
-der3sta
-dert7ende.
-derter6e
+der3stau
+dert5ende.
+derter4e
dert4ra
-6dertrag
-der8trage
-3de3ru
+4der4trag
+de3ru
de4ruh
de4rum
2d1erz.
+d3erzeu
2d1erzv
d2es.
de2sa
+desa2g
des1ah
de4sam
de2s1än
de2seb
-de4se2h
+de2se2h
de2sei
-de4seil
2d1esel
des3elt
de3sem
-de3s4end
+de3s2end
desen3e
de2set
de2sin
-des1o
-de2sor
-de2s1p
+de2s1o
+de2s3p
de3spe
de3spu
dess2
+dess4e
dess4t
-dest5alt
-des6temp
-de5stern
-des4tex
+dest3alt
+des4temp
+des4terg
+de3stern
+des2tex
de1sto
-dest5rat
+dest3rat
de3stri
-des4tum
+des2tum
de2su
des1un
3desw
@@ -4019,35 +4263,51 @@ deten4t
de1un
de1url
de3us
+de4ut
2d1e2vid
devil2
-de1x2a
+de1x4a
de2xer
de2xis
2dexpe
2dexpo
-2d1f6
-2d1g2
+2df2
+df4la
+df4ru
+df4rü
+2dg2
dgas3tr
d2ge.
dger2
-dge3s
d2gesh
dge2t3a
dge4t1e
2d1h2
dha1s4
-4dho
d3hu
-1di
+di4aa
+di4ab
+di4ad
+di4ae
+di4af
+di4ag
+di4aj
+di4ak
+di4ale
+di4am
+di4ao
di4ap
di2a3s4
-diat4
-di4ath
+di4at4
+di5at.
+di4au
+di4av
+di4az
+di3äre
3dic
di1ce
di3chl
-dicht6er
+dicht4er
di4ck3el
4d3i2co
3dida
@@ -4057,18 +4317,20 @@ di2den
2didy
di2e
di3e4d
-di3enb
-die4neb
-diener6l
+di3en.
+di3end
+die2neb
+diener4l
di3e2ni
-dienst5r
+dienst3r
die2p
di3ers.
dies1c
di3e4th
3dif
-3dig
+di4ff
dige2s
+di4gk
dig4n
dik2a
dil2s3
@@ -4078,25 +4340,28 @@ din4a
2d1ind
di3n2e
2d1inf
-3ding
+di4ng
2d1inh
di3ni
2d1inj
2d1ink
+di4nn
2d1ins
2d3int
2d1inv
di2o3b
+di2odi
+di4ok
dion3in
dion3s4
di3ora
-dios2
-di2osk
-di1p2
+d4ios2
+dip2
di3pt
d1i2ra
di4re.
di2ren
+di5rig
di2rin
di2ris
2d1irl
@@ -4109,60 +4374,73 @@ di3s4per
dist2
di1s4ta
di2s3te
-di4stra
+di2stra
di4sz
di2ta
dite1c
-di4t3erl
-di4t3erm
-di4t3ers
-di1the
+di2t3erl
+di2t3erm
+di2t3ers
+di3the
di2tin
di2tob
di4t3r
dit3s
di2t1u
-di5v2
+di5vid
di3z2
-2d1j
+2dj
d2jar
-2d1k4
-4d1l2
+2dk2
+d3kl
+dk4le
+dk4na
+dk4ne
+2d1l2
d3la
-dla3g
dlap4
d3le
dle2ra
+dl3f
dli4f
dl3m
dl3s
-2d3m2
-4d3n2
-dni2
+2dm2
+d3ma
+d3me
+2d1n2
+d3na
+d3ne
+d3ni2
+dni3g
dnis1
-do5at
+d3nu
+do3a
+doa4k
2d1ob
3d2oba
+d2obo
dob2s
d1of
-do2fe
+do4fe
2d1oh
do3ha
dole4
-doll2
-dol3la
+dol3l2
d3o2ly
3dom
-do2mal
-do2mar
+do4mal
+do4mar
domen1
do4ming
4domn
-do2mu
+do4mu
don2a
do3nan
doni1e
4dony
+do2o
+do3op
2dope
2d1opf
do1r4a
@@ -4174,49 +4452,62 @@ dor2f1i
dor2fl
dor2fo
dor2fr
-dor2f3u
+dor4f3u
2d1org
d2orn
-2dort
-dor4ter
+2d3orna
+2d1ort
+dor2ta
+dor2t3ei
+dor2ter
dor4tr
-d1os2
+dos2
d2os.
-2d3osm
+2dosm
dos3s
-dos4t1
+dost1
+d1ost.
dost3a
-dosten4
+dosten2
+dos4ti
do4stu
do3ta
+do3th
do2tof
do3un
dow2s
-d2o3x2
+d2o1x2
d1ö
dö2d
-dö2f
+dö4fe
döl1
döll2
d2ön
3d2ör
dö2s1c
-4d3p2
-dpass3
+2dp2
+dpass1
+dpas2se
+d3pf
+d3po
dpol4n
dpost1
-2d1q
-d2r4
+d3ps
+2dq
+d2r2
3d4ra.
3d4rab
4d3rad
2drahm
2d3rak
3d4ral
+d4rama
+d3ramm
d3ramp
d3rand
dran3k
2d3rast
+dr4at
dra4tin
2draub
2d3rauc
@@ -4236,11 +4527,11 @@ d4reas
4dreg
3d4reh
dre2ha
+dr4ei
2d3reic
-3d4reie
+3d4rei3e
d4reiv
d4rej
-dreli1
4drem
4d3ren
d4reo
@@ -4248,8 +4539,9 @@ d4reo
4d3rer
4dres.
d4resc
-dres6sei
-dres6sel
+dres4sei
+dres4ser4
+dres2st
d4rew
2drez
2d3rh
@@ -4269,6 +4561,7 @@ d3rod
2drogg
2drohr
3d4rohu
+dro2id.
2d3roll
2d3rose
d4ross
@@ -4278,18 +4571,16 @@ d4ross
2d3rov
d3row
drö2sc
-d5rub
3d4ruc
2d3rud
2d3ruh
-2d5rut
-drü1b
-drü5cke
+dr4un
+2d3rut
+drü3b
+drü3cke
3d4rüs
2d1s
-4ds.
-4dsa
-ds3ab
+ds3a2b
d2s1ad
ds1al
d2salk
@@ -4298,27 +4589,26 @@ d4s1amt
d2san
ds3ane
ds3assi
-dsau2
d2saut
ds1än
ds2äu
-4dsb
-d4schef
-d4schin
+d2schef
+d2schin
d3s4co
d2scr
d2s1e2b
dse2e
d2s1ef
ds1ehr
-ds4eign
+ds2eign
d2sein
d2s1emb
dsen3er
d2s1eng
+dsen3s
d2s1ent
d2s1erf
-d2serh
+d2s1erh
d2s1erk
d2s1erl
ds1err
@@ -4329,75 +4619,69 @@ dse4t
d2s1eta
d2s1ev
d2sex
-d3sha2
+d3sha4
ds2hak
d4shal
d3sho
d4shor
-4dsi
d2sid
d2s1im
d3s2inf
ds2kal
d3s2kel
d4sko
-4dsl
d4sli
d3soh
d2sop
dso2r
ds1ori
d2sö
-ds1pas
-d2s1pat
+d2spat
d2spä
-d2s1pec
-ds2pen
-d4speri
+d2speri
d2s3ph
-d3s2pi
+d3spi
ds2por
-d6sporto
+d4sporto
d3spri
d2spro
ds2pu
-dss4
+dss2
+dss4t
dst2
d4stag
d2stas
ds3tauf
-d4s3täti
+d2s3täti
d2ste
d3stec
d3stei
d4steil
-d5stell
+d3stell
d4stem
d4sten
-d3s4tern
+d3s2tern
ds2ti
ds4til
-d4stoch
-ds4tol
-d5strei
+ds4tip
+d2stoch
+d3strei
d3s4tro
ds2tur
dsu2m
d2sun
ds1url
ds2zen
-2d1t
+2dt
dta2be
d3t2ac
-dtach3
dta2d
dt2ag
dta2n
dt3ane
d3t2as
dt2ax
-d5tea
-dte3mo
+d3tea
dt2et
d2th
d4thei
@@ -4405,26 +4689,27 @@ d3to2
d4tob
dt2op
d3tö
+d4tök
dt3r
dtran2
+dts2
dt3sa
-dt5st
-dtt4
+dtt4r
dt2un
d3t2ur
d3tü
d3ty
-1du
+dua2ler
+du1all
du1alv
du1ar
du2b3li
du1ce
-duel3la
-du2f
-2d1ufe
-duf4ter
+2d1u4fe
+duf2ter
duf4to
duf2tr
+d3u2g
2d1uh
du1i
du2in
@@ -4446,6 +4731,7 @@ du2n
2d3und
2d1unf
dung4
+d1unga
2dungl
2d1uni
dun3ke
@@ -4458,7 +4744,6 @@ dunst3r
2dunw
2d3unz
du1os
-dup4
dur2
dur3au
durch3
@@ -4467,26 +4752,28 @@ durch3
2d1urn
2d1ursa
2d1ur3t
-du4schn
-du4schr
-du4sch3w
-1dü
+du2schn
+du2schr
+du2sch3w
2düb
d3über
-2d1v2
-2d1w
+düns3
+2dv2
+2dw
dwa2
-dwa4r
dwer3te
dwes2
dwest1
-1dy
-dy2l1
+dy2le
dym3
3dyn
-dy2s1c
-dy2sp
-4d3z2
+dy2s
+dys1c
+dy4sl
+dys3t
+2dz2
+d3zw
+dz4we
2e1a
ea2be
ea2b3l
@@ -4497,16 +4784,16 @@ e3a2dr
ea2g
ea3ga4
ea3g4l
+ea4ka
eakt2
e2akta
-e3akto
ea2la
e3alei
e4alem
-ea4l3ent
-ealen4z
+ea2l3ent
+ealen2z
ealer2
-e3a4lerg
+e3a2lerg
e3alex
e3a2lin
eal1o
@@ -4516,11 +4803,10 @@ e2alti2
eal3tr
ea2l3u2
eam3
+ea4ma
e2am4e
-eam1o
+ea4m1o
eamt2
-ea4na
-ean3a2r
e3anf
e2ano
e3ar.
@@ -4529,52 +4815,55 @@ ea3rat
e2are
e4are.
ea2r1ei
-ea4rene
+ea2rene
e4arer
e4ares
+e3ark
+e4arn2
ea2ro
e3arz
-e3a2sc
-e3asf
+e2as
+e3a4sc
easin4
ea4sp
eas3s
eate2
-eater1
eat4mes
eat2mu
eat4mun
-ea5tr
+ea4to
+ea5tri
eat3s2
-e3at5t2
-eatu2
+e3at3t2
+e4atu2
e3aue
e3auf
-eau2fe
+eau4fe
eau4fl
e4aufo
+e4auj
eau3n
e2av
e2az
-e3ä2
-e1b
+e1ä2
+e3äh
2eba
e3bak
eba2p
e3bän
2ebec
ebe1er
-ebein7h
+ebein5h
eb2el
-ebe4ler
+ebe2ler
ebe2lo
-ebels4t
-ebel5ste
+ebels2t
+ebel3ste
ebenen3
-ebe4ras
+ebe2ras
ebert4
ebese2
-ebe4s3eh
+ebe2s3eh
ebe2so
2ebet
ebet4s
@@ -4587,24 +4876,26 @@ eb3ler
eb4leu
e3blie
eb3lo
-eb2lö
+e3b2lö
2ebo
e2bob
ebot2
ebö2s
2ebr
-e5brau
-eb4rea
+eb5rah
+e3brau
eb2s1
eb4sche
ebse2
-ebs7panne
+ebs3p
+eb4spanne
+eb3stan
ebs3tau
eb4stät
-ebs3tem
ebs3t2h
ebs3ti
eb3str
+ebs3treu
2ebu
e2bunt
ebu2t3
@@ -4616,31 +4907,34 @@ ech1ä
2e1che
ech1ei
ech2en1
-e6ch5erzi
+echer4fa
+e4ch3erzi
e1chi
+echi3e
ech3l
ech3m
ech3n
e2cho.
-ech3ö2
-ech3r
-ech4ri
-echs4er
-echst5re
+ech3ö4
+ech3re
+e1chri
+ech3sel
+echs2er
+echst3re
ech3tab
-ech3t4ei
-ech6terh
-echter8ha
+ech3t2ei
+ech3ter
+ech4terh
e1chu
-ech1w
+ech3w
2echz
e1ci
-eci2a
-ec4k
+e4ck.
ecke4n1
-e4ckerr
+e2ck3err
+ec4kl
+e4cks
eck3ser
-eck4sta
2eckt
3eckty
2e1cl
@@ -4648,46 +4942,48 @@ eck4sta
2e3cr
ec1s
2ect
-e1d
ed2a
ed2dr
-ed4e
+ed2e
ede2al
-ede3n4er
+e3dee
+ede3n2er
edens1
eden4sa
-eden4se
-eden4sp
+eden2se
+eden2sp
+eden4sta
edeo2
-ede2r
+ed4e2r
eder3a
ede3rat
+ederer2
eder3t2
edes2t
ed2i
-e3di.
2edip
-edi6teng
+edi4teng
e3d2o
ed2ö
e3drei
ed4rö
ed2sal
-ed4seh
+ed2seh
ed2s1es
ed2si
ed2s1o
-ed2s1p
+ed2sp
ed2sto
ed2s3tr
ed2s1u
edun3
edund2
-e3dy3
+edy3
edys4
2ee
-ee3a4
+ee3a2
eeb2l
+ee3bs
ee1c
ee4ce
ee2cho
@@ -4698,10 +4994,12 @@ eed3s2
ee1e2
e1eff
eef4l
-eeg4
+ee3fo
+eeg2
+eeg4r
e1ei
ee2i3e
-eein4se
+eein2se
eei4sc
eeis3s
e2ela
@@ -4711,30 +5009,25 @@ eele4n
eel2ö
e2e3m2a
e1emb
-ee3min
e1emp
-e1en
eena2g
-e2enä
-e2enc
+e1end
een1e
-e3eng
-ee3ni
-e3enk
-e3enl
-e2eno4
+e2e3n2i
+ee3n2o4
een3s
-een2z
-ee3o
+e1ent
+e1en2z
+ee3o2
+eeo4l
e2ep
ee3po
-eer4at
e1erbt
e1erd
-ee3re
-eer1ei
+ee3r2e
+eer3ei
ee4r3en4g
-eer2e2s
+eere2s
eere2t
eer3eti
e1ermä
@@ -4742,6 +5035,8 @@ ee1ro
ee1rö
e1eröf
eer2ös
+eer3sh
+eer3str
ee3r2un
e1erz
ee1s2
@@ -4756,45 +5051,45 @@ ee2th
eet2i
ee3t4r
ee2tu
-ee1u2
+ee1u
+eeu4f
eewa4r
e1e2x
-e1f
e2f1ad
+e2f1a2g
e3fah
ef1ana
ef1ar
e2farc
ef3arm
e2fat
+ef1aus
2efä
ef2äl
e2fäu
2efe
e2f1e2b
-e3fef
-efe4l3ei
+efe2l3ei
ef1em
-e2femi
efe2n1
3e2f1ene
e2fent
-efer5f
-eferin6d
-efeuil4
+efer3f
+eferin4d
+efeuil2
3effek
1effi
ef2fl
-ef3flu
2efi
ef1id
e2f1ins
efi2s
2efl
ef4le
+ef5le.
e3f4lu
-e3flü
-2e3f2o
+e3f4lü
+2ef2o
2efr
ef4reih
ef3rol
@@ -4809,52 +5104,62 @@ ef2tan
ef2tei
ef2tro
2efu
-e2fum
-e1g
-ega2m
+2efü
+ega4m
e3g2anz
-egd4
e3ge
+eg1eil
egein3
-ege4lan
-ege4l3au
-ege8l7ei8er
-ege4ler
+ege2lan
+ege2l3au
+ege4l5ei4er
+ege2ler
ege2lo
eg2en
-ege4n1a
-ege6nero
+ege4n1a2
+egene3ra
+ege4nero
+egen3z
+eg2er
ege2ra
-ege5stal
-ege4s3tr
+ege3stal
+ege2s3tr
ege1u
+e4gex
2egi
2egl
e2glo
e2glu
+egmen4ta
e2gn
eg3nä
eg3ni
-ego1p
+ego3p
+egori2e
+egs2ag
eg4sal
-egsau3g
eg3se
eg4sei
-egse3l
+egs2e3l
eg3si
eg4sk
+eg4sm
+egs2of
+egs4pe
+eg4ss
egst2
eg4sto
eg2th
egung4
egus3
+eg5ver
2e1ha
eh1ach
eh1ad
eh2ade
e3h2ah
eh2al
-ehalt4s
+ehalt2s
e3hand
e2harz
e3haut
@@ -4862,9 +5167,10 @@ e1hä
e1he
eh1eff
eh1ein
+e3helf
eh1elt
-e4hense
-e4h3ente
+e2hense
+e2h3ente
ehen6tr
ehe3o
1e2hep
@@ -4879,51 +5185,55 @@ eh1lam
eh2l3au
eh1lä
ehl3ein
-eh4lent
+eh2lent
eh5l2er
ehlo2
ehl1or
eh2lö
ehl2se
+ehl4sl
ehls2t
2ehm
-eh2mab
eh4mant
+ehme2s
eh3mu
eh3na
eh3no
2e1ho
-eho2f
+eho4f
eho2l
eh3oly
2e3hö
-ehö4rer
+ehö2rer
eh2r1a2
ehr1ä
ehr1e2c
eh2rei
eh2rel
-ehr6erle
ehr4ern
ehre3s
eh4rin
eh1roc
ehr1of
eh1rö
+ehr3sch
ehs2
eh3sh
+eh3sk
+ehs4p
+ehst4
eh1ste
2eh3t2
eht3h
eht4r
+eh4ts
2e1hu
e2hum
eh1unf
e2huni
-e3hur
e1hü
eh3üb
-eh1w
+eh3w
e1hy
2ei3a2
eia4t
@@ -4931,29 +5241,27 @@ ei2bar
ei2bli
ei4blu
eibu4t
-ei4b3ute
-e4ic
+ei2b3ute
ei1ce
ei2cho
e2id
ei2d1a
-ei3de
-ei4deis
-eid5erre
+ei4db
+ei4dl
2eidn
-ei3do
ei3dr
ei1e
eie2b
eie2d
ei3e2l
eie2m
-4ei3e2n3
+4ei3e2n1
eienge4
+eien3s
ei3es
eie2t
4eif.
-ei1flo
+ei3flo
1eifr
eif3t
2eig.
@@ -4963,15 +5271,15 @@ eig2ar
2eige.
2eigeb
2eigeh
-4eigeno
-5eigensc
+2eigeno
+3eigensc
4eig2er
2eiges
2eigew
2eigi
1ei2g3n
ei2go
-ei4g3rat
+ei2g3rat
2eigre
2eigrö
2eigru
@@ -4979,7 +5287,7 @@ ei4g3rat
2eigs
2eigt
2eigu
-4eih
+2eih
ei2hum
ei2kab
ei2kak
@@ -4995,13 +5303,13 @@ e2il
ei4l3ab
ei2lam
eila2n
-ei4l3ane
-ei4lang
-ei4lanz
+ei2l3ane
+ei2lang
+ei2l3anz
ei2lar
2eilb
eil3d4
-ei4lein
+ei2lein
eile2n1
ei2let
eil3f4
@@ -5010,7 +5318,7 @@ ei2lob
eil2ö
2eim.
ei2mab
-ei2m1ag
+ei2m1a2g
eim3all
eim3alp
ei2m1or
@@ -5025,19 +5333,20 @@ ei4nae
ei4n3an
ei4na4s
ei4n3at
-ei2n3ä
+ei2n1ä
ein3d2e
-ein6derk
+ein4derk
e1indu
2eineb
-einen4e
-ei4n3en4g
-ei6nen6se
-ein5erbe
-ei4nerf
-ei4nerk
-ein5er6la
-einer6sc
+einen2e
+ei4n3en2g
+einen2s
+ei4nen4se
+ein3erbe
+ei2nerf
+ei2nerk
+ein3er4la
+ei4ness
ei2neu
ein4fiz
2einfo
@@ -5045,31 +5354,37 @@ ein4fo.
ein4fos
ein3g2
3einger
-e2ingr
+ei4nh
+ein2hab
e2inhä
ei2nie
-e1init
+e1in2it
ein3k4
-ein6karn
+ein4karn
3einkä
e2inl
ein3n2
3einna
ei2n1o2
1einri
-e6insa
+e4insa
3einsat
e2insc
-5einschä
-ein6stal
-ein6terv
+3einschä
+ein4stal
+ein2teg
+ein4terv
+3eintop
3eintö
+3einträ
1einu
+ein3zw
ei3o
-eio2p
-eio4s
-ei1p
+eio2s
+ei3p
eip2f
+ei4pp
+ei4pz
2eir
eir2c
ei3re
@@ -5077,19 +5392,19 @@ e1irr
e4is.
ei2sa
ei3sas
-ei6schwu
-e4ise
-ei4ser4g
-ei4s3er4l
-ei6s5erst
-ei4s3erw
+ei4sau
+ei2ser2g
+ei2s3er2l
+ei4s3erst
+ei2s3erw
1eisho
ei3s2ky
ei2so
-eis2pe
+eis4pe
e2iss
-eisser6s
-4ei1sto
+eist4e
+ei1sto
+eis4tol
ei2sum
ei2sur
1eiswo
@@ -5102,52 +5417,59 @@ ei2tar
ei4tat
2eitä
ei2tän
+ei2teli
eite4ra
ei4tess
-ei2t1h
+eit1h
ei2tin
-eito2
-ei4trau
+ei2trau
ei4tro
-eitsa4g
eit3t4
4eitu
ei4t1um
ei2t1ur
-eit3z2
+eit3z4
eiv2
eive4
ei2zar
eiz1in
-2e3j
-e1k
+2ej
+e3ju
2ek.
2e3k2a
1ekd
ek2e
e3ke.
e3ke4n
+eker3z
e3kes
e3key
+e3ki
e3k2l
ek4lo
-ek4n
+ek4na
+ek4ne
+ek4ni
+ek4nu
e3k2o
-ekor4da
+ekor2da
2e3kr
-ek4s1p
-4ekt
+ek4s3p
+2ekt
ek2tan
-ek5t6ante
-ekt3at
+ek4tank
+ek3t4ante
+ek2t3at
ek2t1ä
ek2te2l
+ek2tep
ekt3erf
ekt3erk
-ek4t3er4z
+ek2t3er2z
ekt2o
ek2t3o4b
ek5tri
+ekts2
2e3ku
ekur2a
e3k2w
@@ -5156,15 +5478,15 @@ e1la
el2abt
el3abu
ela2ck
-el3ader
-el1af
+e2l1af
ela4h
e2l1ak
-e2l1a2m
-el2a3mi
-e3lamp
+e2l1a4m
+e4lame
+el2a5mi
el1ana
e4landa
+el1ank
e2lanm
e4l1ans
e2l1ant
@@ -5178,24 +5500,24 @@ ela2s
el1a4si
el1asp
ela3su
-el3aufw
2e1lä
2elbil
2elbr
2eld
elda2r
eld3ari
-eld4arm
-el4d3erf
-elder4p
-elder4s
-eld5erst
+eld2arm
+el2d3erf
+el2derl
+el3dern
+elder2s
+eld3erst
el3des
elds2
4e3le.
2e3lea
elea2r
-2e3leb
+2eleb
4ele2c
el1ech
1elefa
@@ -5203,78 +5525,80 @@ eleg3s
4eleh
el3ehe.
2elei
-e6l5ei6ern
+e4l3ei4ern
e2l1ein
e3leine
-e5leit
+e3leit
+el1eiw
1elek
2eleko
e2l1el
+ele3ler
1e2lem
2e3lem.
e3lema
-ele2mi
+el1emb
+el1e2mi
e3lemm
-2el1emp
+4el1emp
2e3len.
-elen4k3l
-e4lense
+elen2k3l
+e2lense
e2l1ent
e3lep
-2eler
+4eler
e3ler.
eler2a
el1erd
-e6lereig
el1erf
-e4ler4fa
-e4lerfi
+e2ler2fa
+e2lerfi
e2lerg
el1erh
-el1erk
+e2l1erk
e2l1erl
-e4l3ernä
+eler2la
+e2l3ernä
eler2ö
e2l1err
el3eru
el1erw
e2l1ess
+eles2t
e2l1e4ta
+el2eth
ele2ti
-elet4ta
-2el1ex
+elet2ta
+el1e2x
e3lex.
1elf.
elf2er
1elfm
elf4r
1elft
-elgi5er.
-elgi5ers
+elgi3
el3g2l
elg4r
e2l1id
2e3lie
-eli3ef.
+elif3
2elig
e2lim
elin3a
+el3inka
eli3no
el1ins
+4elis
2elk
-el4larb
+el2larb
ellar4t
-el3lär
-el5le.
ell2ei
ell3ein
ell3eis
el4lel
-el5lend
-ellenen5
ell2er
-eller8fas
-eller7g
+eller4fas
+eller5g
ell3erh
el3les
el2lim
@@ -5282,14 +5606,13 @@ el2lim
el2lor
ell2ö
ell3sp
-el3ma
elm2e
elm3ein
-2eln
el3na
2elo
e2l3oa
e2lof
+elo4fe
e2lol
e2lom
e2lonk
@@ -5301,28 +5624,31 @@ e3lot
e3l2ov
2elö
elö2s
-el3p4
-el4s5ein
+el3p2
+el4sb
+el2s3ein
el3sen
els4tri
el2sum
-el4tans
+el3tar
elte4m
el5ten.
el4t3ent
elter4b
-elter4f
+elter2f
elt3erh
-elter6le
+elter2k
+elter4le
3elter4n
elt5ero
-elter6sc
-elte2s
+elter2s
+elte4s
el4tesc
elt3eth
el3the
el5tri
-elts3pa
+el4ts
+elt3se
2e1lu
el1uf
e2l1um
@@ -5330,28 +5656,26 @@ e2l3u2r
elu2s
el3use
elu2t
+el3ute
el3uto
e1lü
2ely
e2lya
-el3z2ac
el2zar
-el4zene
+el2zene
elz1in
-el2zwa
-2elzy
-e1m
e2m3a2b
+em4ak
+e2m3alar
e2m1alk
em3anf
e2m1ano
em1ans
1emanz
-e4m1a4s3p
+e4m1a4sp
em1au
2e3mä
em2äh
-1emba
1embo
1embry
em2dä
@@ -5363,14 +5687,14 @@ e2mef
eme2i
e2mele
em2en
-emen6gel
-emen4t3h
-eme3r2i
+emen4gel
+emen2t3h
+e4mentsp
+emer2i
e2m1er2l
em1erw
-e4mesu
3e2meti
-e2m1i2d
+em1i2d
emi2ei
e2mig
emik2
@@ -5380,12 +5704,12 @@ emi3n2a
e3mind
em1int
1e2mir
-e3misc
+4emisc
+emi4scha
emi3tr
emma3u
em2m1ei
-e2moa
-e3mol
+e2mof
emo3s
1empf4
em3pfl
@@ -5393,16 +5717,15 @@ em3po
empo1s
em2sa
em4scha
-em4sei
em2sim
em2spr
em2st
ems5tr
-ems3tro
+ems6tra
em3t2
1e2mul
3emuls
-emune7
+emu3ne3
e3mur
2emü
e2na
@@ -5412,21 +5735,21 @@ en3aba
en3abo
4ena2c
en3ache
-e4n3ack
+e4n1ack
enadi4
e4naf
4enah
en3ak
+ena4ke
en1al
-enal2a
e4nalb
e3nale
-en2alg
ena3l2i
e4nalk
e4nalm
e4nalo
enal3p
+enal4s
4en1am
ena4n
e4nand
@@ -5437,54 +5760,60 @@ en1ap
ena2pa
en3are
en3ark
+4enarm
en3aro
en1as
-ena2sc
-e4nast
+ena4sc
+e4na2st
2enat
4e5nati
e4natl
enat4s
e4n3att
4enatu
-e4nau2f
+e4nau4f
en3aug
+e5naui
e4n3aur
-e6nausta
+e4nausta
e4naut
-en1a2x
+e4n1ax
en1a4z
en1ä
en3äb
-e3näi
+en4äc
e2när
en2ä3s
en3äst
+2enbew
+2enbom
en2ce.
end2ac
en2dal
-en4dang
+en2dang
+4endef
2endel
-ende4lä
-en4d3es4s
+ende2lä
+en2d3es4s
en2dex
en2did
-en3d4ort
-end3s4au
+en3d2ort
+en2dost
+en3d4rü
+end3s2au
end3s2l
end3s2p
end3sz
en3d2um
en3d2ü
2ene.
-en3e4ben
+en3e2ben
en1e2c
e2neff
-ene2h
+ene3hen
en2eid
e3neien
e4neige
-4eneigu
e4nein
e4neis
e2n1el
@@ -5492,36 +5821,34 @@ ene4le
2ene2m
e2n1emi
2enen
-e4nense
e4n1ent
-en4entr
en3envi
en1ep
4e3ner.
-en2era
e2n1erd
-en3erei
e2nerf
-en4erfr
+en2erfr
1energ
+3energi
e2nerh
e2nerk
e2n1erl
-e4nermi
-e4n3ermo
+e2nermi
+e2n3ermo
4enern
-e4n3erne
+e2n3erne
ene2ro
+e2n1erp
e2n1err
-en1ers
+e2n1ers
4eners.
e2n1ert
-en4ert.
+en2ert.
e2n3eru
e2n1erw
2enes
e3nes.
-e2n1e2sc
+e2n1e4sc
e2n1esk
e2n1ess
en1eta
@@ -5530,33 +5857,47 @@ en1eul
e2n1e2v
e4ne2x
en3f
+en4fb
+en4ff
+en4fg
+en4fh
+en4fk
+en4fm
+en4fp
+en4fs
+en4ft
enf2u
+en4fw
+en4fz
1engad
1engag
-en3g2al
-enge3r4a
-en3g2i
+eng2al
+en3geb
+enge3r2a
+eng2i
en3gn
en3g2o
1engp
eng4ra
eng3se
-2eni
e3ni.
-e3nic
-4e3nie
+2e3nic
+2e3nie
eni3er.
+eni3era
eni3erp
-eni5ers.
+eni3ers.
en3i2ko
en3ill
eni4m
en1ima
en1imi
e2n1in
+en3inh
e3nio
-eni2ö
+en3ion
e2nir
+2enis
eni4sa
e4n3iso
e3nit2
@@ -5564,15 +5905,16 @@ e3niv
enk3aus
3enkeli
enk3erg
-en4k3erk
+en2k3erk
en3k2ü
+en5mil
en2nef
en2nel
-en4ner4f
+enner2e
+en2ner2f
enn3erg
-en4n3erl
enn2i
-enni6ger
+enni4ger
2enniv
enns2
enn3ste
@@ -5581,8 +5923,10 @@ e2n1ob
e3nobel
eno2br
e2nof
+e2noh
+en3oli
en3olm
-eno2ma
+eno4ma
eno4n
e2n1op
e2n1o2r
@@ -5592,33 +5936,44 @@ eno4ri
e2n1ost
4e3not
eno2w
-2e1nö
+e1nö
en1ö2d
+e4nöf
+e4nök
+e4nöl
+4enred
en3sabb
en2san
-en5sche
+en3sche
en2seb
+ense2e
1ensem
ensen3e
-ens3ere
+en3s4pen
en3spo
-ens4por
-enst5alt
-en4s3tät
+ens2por
+4enst.
+enst3alt
+en2stät
ens4tel
-ens6temp
+ens4temp
ens2th
+4enstl
2ensto
enst2ü
+2entab
+en2tad
+2entaf
en5t2ag
-en4tanm
-en4tanw
-en3t4ark
+en2tanm
+en2tanw
+en3tar
+ent2ark
1entd
en3t2el
ente2n
3entera
-en4terb
+en2terb
1entf
2entfo
1entg
@@ -5626,44 +5981,49 @@ en4terb
en2thi
1enthu
1enthü
-en4t1id
+en2t1id
3entla
1entn
en2tob
entopf3
en2t1os
2entö
-en4t3rol
+en5tré
+en4ts
1entsc
1entso
-ent4sto
-1entw
+2entss
+ent2sto
+3en4tw
4entwet
-3entwic
1entz
e2n1u
e3nu.
-e4nu4r
-2enu4t
+e4nur
+enu4t
e4nuto
e1nü
-enü1st
4enwü
-2e1ny
+e1ny
en3zare
-enz2äp
-1enzep
+en2zene
+enz3erf
enz3erg
-en4z3erk
-en4zerl
-en4z3erm
-enz5ersc
+enz3erk
+enzer2l
+enz3erm
+enz3ersc
+en4zf
enzi2d
-enzlan4
+enzlan2
enzo2l
+en4zp
+en4zr
+en4zs
+4enzuf
1enzy
-e1ñ
-4eo
+2eo
+eo3a
e1o2b1
eo3ben
eo3bl
@@ -5671,7 +6031,6 @@ eo3bo
eo3br
eo1c
eoch2
-eo3dr
e1of
eo3g2
e1oh
@@ -5679,13 +6038,17 @@ eo3la
e3o2ly
e1on
e3o2nat
+eon2i
eo1o
+eo2pe
e1opf
+e4oph
eop4r
e1or
e3or.
eo1ra
e3orb
+e3o4r3ei
eorgi1
e3ors
eort2
@@ -5694,83 +6057,94 @@ eo1s2
e3os.
eo3se
e1oste
-e1ou4
+e1ou2
eo1ul
-e1ö4
-e1p
+eou4t
+e1ö2
+eö4fe
2ep2a
epa2g
-epas6ser
+epas4ser
+2epeg
2eper
-e3p2f4
-e5pfi
-1e2pid
-e2pig
+e3p2f
+ep4fl
+2epia
+e2pid
+e4pig
e2pik
-1e2pile
+3e4pile
e3pio
+e4pip
1epis
2epist
1e2pit
ep3le
+ep4lu
1epoc
eport4
-1e2pos.
-ep2p1a
+epor3te
+3e2pos.
+ep4p1a
eppe3l
-ep2pl
+ep4pl
ep2pr
2epr
+ep4rä
ep3sh
ep2tal
-ept2an
ep2tau
+ep2tä
2e3pu
epu2s
-4e3q
+2eq
+e3qu
er1a
e3ra.
-era2be
e2r3a2ch
e3rad.
-e3radi
+e3ra3di
e2radj
-e2radm
+e2r3adm
e4radmi
e4r3adr
eraf4a
era2g
+era3ges
e1rah
e1rai
er3aic
e3rake
+era4ku
e1rald
-eral4eb
+eral2eb
er3alke
e2r3all
er2an.
era4n4a
eran3d
e3rand.
-e4rangr
+e2rangr
e2ranh
e2rano
e1rap
er3apa
er3apf
+er3apo
e2rar
er3are
e3rari
+era2rie
e3ras.
era2si
-e1rast
era2ß
-e4ratel
+e2ratel
+e3rativ
e2ratl
e1raub
e1rauc
er3aue
-erau2f
+erau4f
er3aug
e2ra2v
e1raw
@@ -5779,128 +6153,134 @@ e1raz
e1rä
er1äf
er1äh
-er1ä2m
+er1ä4m
er1äp
e2r1äs
er1ätz
3erbarm
erb2au
erb2e
+er3blo
2erbru
erb2sp
er1c
+erche3i
er3chl
erch2o
erd2am
-erda3me
+erda5me
1erdb
2erdec
-2erdel
-er4d3en4g
+er2d3en4g
erd3erw
-erdes4t
+erdes2t
erdeu2
1erdg
erd3st
2erdy
4ere.
-er3e4ben
+er3e2ben
e3r2ech
er3echs
er1e2ck
er1edi
-ere4dit
+ere2dit
er1eff
e2r1e2h
-ere4i
+ere3ho
4e3rei.
e3reib
-er1eig
-4ereih
-e4r3eime
+1er1eig
+er3eime
e4reink
er3eis.
-er5eisar
+er3eisar
er3eisb
er3eisf
er3eisr
-erei5str
+erei3str
+er3eisv
e4rek
er1e2l
e2rele
ere3lev
-ereli1
2erem
4erem.
er1emi
-ere4mis
+ere2mis
e2remp
2eren
4e3ren.
e3rena
eren1e
-e4rense
-e4rentn
-e4rents
+e2rense
+e2rentn
+e4r3ents
e3renz
-eren8z7en8d
+eren4z5en4d
+er4eo
er1epe
4erer.
2ererb
-erer3fa
-e4r3erfo
+e2r1erd
+e4rerfo
e2rerh
e2rerk
e2rer2l
-erer5lau
-4erern.
-e4rerne
+erer3lau
+e2rerm
+2erern.
+e2rerne
e2rer2o
-erer4ri
+erer2ri
er1ers
-4erers.
-e8rersche
+2erers.
+e4rersche
e2rert
2ererv
2ererw
+e4r3erze
2eres
4eres.
ere2sp
er1ess
eres3sk
er1eta
-er1eu
-ere4vid
+eretri3
+er1eul
+ere3un
+ere2vid
erf2e
+2erfir
4erform
erf4r
4erfür
-er4g3are
+er2g3are
4ergebi
3ergebn
4ergebü
-4ergeha
-4ergehä
+2ergeha
+2ergehä
ergel4s3
-erg5elst
-4ergeni
+erg3elst
+2ergeni
2ergn
er2gop
4ergrem
erg1s
erg3s2o
-ergs2p
+ergs4p
ergs4t
-e4rh
+e2rh
1erhab
er3hag
2erhai
-4erhals
+2erhals
2erham
-2erhan
2erhas
er3hei
2erher
+4erhöc
er3hu
2eri
e2riat
@@ -5909,17 +6289,21 @@ e3rib
e4r3ico
er1id
4e3rie
-eri3en1
-e3ri3k
-erik4l
-4e3rin.
+erien1
+erie2ne
+e4rij
+e3rik
+eri3k4l
+4erin.
e2r1ind
-e2r1ini
-er1ink
+erin2fo
+e2r1in2i
+er1in3k
er1inl
er1int
er1inz
e2ri2on
+e4rir
4eris
e2riso
e2risr
@@ -5929,24 +6313,28 @@ e3riv
2erk.
2erkaj
er3ker
+er3kla
1erklä
2erkm
-2erkre
-erk5t4
+erk3t4
+erk5to
er2kum
2erl.
2erlag
3erlebn
-4erleh
2erln
-er3m2
-ermen4s
-er4m3ers
-er4n3alt
-er3ne
+erm2
+er3ma
+1ermah
+er3men
+ermen2s
+erm3ers
+er2nalg
+er2n3alt
+er2nau
er4nene
-er4nerf
-er4nerk
+er2nerf
+er2nerk
3erneue
er2nob
erno2r
@@ -5956,7 +6344,8 @@ e1roa
er1ob
ero2bl
ero2br
-e2r1o2f
+e2r1of
+e3rofr
e1rog
e1roh
e1rok
@@ -5973,50 +6362,51 @@ e1ros
1erosi
e3rosit
e1rou
+e2r1o2v
e1row
-er1o2x
+er1ox
er1oz
erö2d
2eröh
erö4l
er1ös
erö2sc
-er3p
+er3pl
+3erprobu
er3rä
-2erren
-er3ro
-2errü
-er3s2a
+4erren
ers4ana
ersch4
-er5schn
-4ersei
-ers2el
+er3schm
+er3schn
er3sen
-er5s2i
+ers3hal
+er3s4i
er3sk
-4ersted
+ers4por
er3stel
-erst5ers
-4erstil
+erst3ers
+2erstil
ers4tod
-ers6tr
+ers6tri
er3swi
er3sz
ert1ab
-er3tat
-er4t3erf
-er4t3er4g
-er4ter4h
-er4ter4k
-er4ters
+4erteig
+er2t3erf
+er2t3er2g
+er2ter2h
+er2ter2k
+er2ters
ert1h
er2tho
4ertö
+er3trau
er5tri
4ertru
-erts2e
-erts2p
+er4ts
+ert3s2e
+ert3s2p
2eru
eruf4s3
e4r3uhr
@@ -6025,13 +6415,14 @@ er1und
e4rundu
erung4
er1up.
-er3ur
+e4r3ur
er3use
+eru4t
+er3ute
e2r3uz
erü4b
3erweck
-er4zerk
-er4z3ers
+6erweib
es3ab
e4sabe
e2s1a2d
@@ -6049,168 +6440,188 @@ es2apa
esa2ra
e3sa2s
es2ast
+e3satz
esa2v
es1ax
2esb
-esbi5er.
+esbi3er.
e3s2ce
esch2
es4chi
e2s3ec
es1ehr
-esein4s
+esein2s
+es4ek
es2el
+ese3lam
+4esen
ese4nal
-ese4neu
+ese2neu
esen3o
-es2ens
+e3s2ens
esen3sk
esen3th
-eser4at
-ese4r1u2
+ese4r1u4
eses2k
e2s3e2x
2esf
2esh
es2har
-es3he
2esi
esi1er
e2s3i2k
e2s1il
esi2st
+e4sk.
es2kat
+e4skä
e4s3ke
e4s3kl
+e4skö
es3ku
e4s3ky
es3l
2esm
e2s3oa
e4s3ob
-e2s1od
-es2oh
+es1od
+eso4f
+e3s2oh
+e3sol
+esonan2
eso2r
es1ora
eso3re
es2ort
e3sot
e3s2ö
-4esp
-e3spal
+2es2p
+e3s4pal
es4park
-es2pek
+es4pec
e4spers
-e2sph
-e3s2pi
-e3s2por
+e2s3ph
+e3spi
+e3s4por
+es4pru
+es4put
2esr
2ess.
-es2s1ag
+es2s1a2g
essali3
-essau4s
+essau2s
1essay
-2essä
-2es3sc
-ess6ere
-ess4erf
-ess3erg
-ess5er6la
-2essk
+es3sc
+ess2ere
+ess2erf
+es2s3er2g
+ess3er4la
+es5sie
2esso
es2sof
-2essp
-es2s1pa
+es2sorg
+es2s3pa
es2spu
-es4stab
ess3tie
es3stu
+es4sü
+e4st.
estab4b
esta3ge
est1ak
es4tanb
es4tang
-e4stant
-e1st4ap
+e2stant
+e1stap
e1star
-e4starb
-e2st1a4s
+e2starb
+e2sta4s
+est3asc
e1stat
-e4stat.
-e4staum
-e4staus
+e2stat.
+e2staum
+es5te.
es2tec
este4i
-est5eing
-est5eink
-est5einl
+est3eing
+est3eink
+est3einl
+est3eint
e1ste2l
es4t3emi
e4sten
es4t3eng
-est5entr
-est5erha
-es4ter4ö
-es4t3erz
-es4t3ess
+est3entr
+es2tep
+est3ergi
+est3erha
+es2ter2ö
+es4t3es4s
es2th
es2tid
-e4stig
e1stil
e2stip
es2tis
-estmo6de
+e4stl
+estmo4de.
1estn
e2stom
e3strec
es4tri
e1strö
-e1stu
+es4ts
est3ums
es2tur
-e1s6tü
+est3urk
+e1s4tü
e3sty
+es4uc
e3suh
e2s1um
es3ums
+es2und
es3unt
es1ur
esu4s
-2es3w
+es4ut
+2esw
e3sy
+es4ym
es3z
es4zene
-2e1ß
+es4zk
+2eß
e2ß1el
e2ßent
-eße3re
+eß2e3re
e2ß1er2g
e2ß1erl
eß3t
-e1t
etab4
eta2c
2e3taf
2etal
-et1ami
+et1a4mi
et4an.
+e3tas
+et2ast
et4at
etat3r
et1äh
-2e3te
+2ete
ete2e
-e4t1ef
-e4t1ein
+e2t1ef
+et1ein
ete3ke
eten3d2
ete2o
-eter4hö
-ete1ro
-eter4tr
+eter1ä
+eter2hö
+eter2tr
ete2s
2eth.
et2ha
-e4t3hal
+et3hal
e3the
et2hi
e4thik
@@ -6218,37 +6629,37 @@ e4thik
et2hu
e4t1i2d
eti2m
-etin1
+eti3na
et1ini
et2it
eti2ta
-eti2th
+eti4th
et3l
-2e3to
-e2tob
-e4t1o2f
-et4on
+2eto
+e2t1o4f
eto4n3al
+eto2ner
etons4
+et1orc
e4torg
eto2s
2etr
et3rad
-e4traum
+e2traum
et3rec
-e2t3res
+e4t3res
et4ros
ets2c
-etscher7e
+etscher5e
etsch3w
-ets1p
-et2spe
+et2s3pe
et2ste
ett1a
et2ta2b
et2tad
et2tak
-et4tans
+etta4m
+et2tans
ett2as
et2tau
et2tei
@@ -6260,49 +6671,48 @@ et2t1um
3e2tui
e3tur
e3tü
+e4tüb
etwa4r
+ety2l1
1e2tym
2etz
-et2zw
+et2z3w
eu1a2
-eu3b4
+eu3b
+eub4r
2euc
euch4ta
2eud
eude1s
eudi4e
-2eue
eu2eb
-eue6r5eif
-eue6reis
-euerer6s
-euerer6t
+eue2r3ei
+eueren2
+euerer4s
+euerer4t
eu3eri
-eu3erk
-eu3err
+euer2ri
eu2esc
-4euf
-eu2fer
+2euf
+eu4fer
eu2g1a
-euge4mi
-eu6gense
-eu3g2er
+euge2mi
+eu4gense
eugin2
eugin4f
-eu4gin4g
+eu2ging
eu2gre
eu2gri
eugs4
eug3sp
eu3h
eu1id
-eu1in1
-e4uk
+eu1in
1eukal
eu2kä
eulan2
euland3
-eu3l2e
+eul2e
eul2i
2e1um
e3um.
@@ -6310,59 +6720,62 @@ eu3m4a
e3umb
e3umf
e3uml
-e3um2s1
-eum5st
+e3um2s
+eum4s3p
e3umw
-2eun
-eu2na
+2eu2na
eun2e
-eu4nei
e3un2g
eu2nio
eu4nis
eunk2
eun3ka
eu1o2
-eu1p
+eu3p
e1up.
-eu3p2f
-e3upg
+eu4pd
+eup2f
+e3u4pg
eu4r1an
-eu4r3ast
+eu2r3ast
eura3t
eu2rau
eur1c
e2ure
euren2
-eu4rens
+eu2rens
eur4er
-eur3f4
+eurf4
1euro
-2eus
+eu4rs
+eur4so
e3usar
-eusch4o
+eusch2o
eus2i
eu4sk
-eu3sp
+eu3s2p
eust4
eu1sta
eu1sto
eu1s4tr
-2eut
eut2e
+eute3r2e
eut2h
-3eu3tha
+1eu3tha
eut2i
-eu5t2o
-eut6scha
-eut6schn
-eut6schr
+eut2o
+eu5tor
+euts4
+eut4schn
+eut4schr
2eux
+eu1y
eu2za
+euz3eic
eu2zo
-eu2z1w
-e3ü
-e1v
+eu2z3w
+e1ü
+e3üb
e2vak
e3var
eva4s3
@@ -6370,17 +6783,15 @@ eva4s3
eve5ri
evie3le
2e3vor
-e1w
ewä2s
e2we.
ewei4sc
-ewert4
+ewert2
ewer3te
-e3wir
ewi2s
e3wit
2ex.
-1exam
+1exa4m
ex3at
2exc
2exd
@@ -6396,7 +6807,6 @@ e3xio
ex3l
1exp
2expu
-2exs
2ext.
2ex2ta
ex2tin
@@ -6410,91 +6820,82 @@ e2xum
eyl2
ey2n
ey3no
-eys4
-e1z
+eys2
e3z2a
ez2ä
e2z1enn
e3zi
ezi2s
-e3z2o
-ez2w
-ez3z2
-é1b
-é1c
-é1g
+ez2o
+ez4wa
+ez4wi
+ezz2
+é1
+é2e
égi2
-é1h
-é1l2
+él2
élu2
-é1m2
-é1n
-é1o
-é1p
-é1r2
-é1s
+ém2
+ér2
ési2s
-é1t
-é1u2
-é1v
-é1z2
-è1c
-è1m
+éu2
+éz2
+è1
ène1
ènes4
-è1r
-1ën
-ë1t
-ê1p
-ê4t
-1fa
-fab4
-2f1ab5b
+2ët
+ê2t
+1f
+2f1abb
fa2ben
2fabf
2fabg
-2f1a2b5l
+2f1a2bl
2fabn
3f2abr
-2f1ab5s
+2f1abs
2fabw
-fa4cheb
-fa4chel
+fa2cheb
+fa2chel
fa2ch1i
fa2cho
-fach3s4p
+fachs4p
fa2dan
fa2del
+f4aden
f1ader
fa2di
fa2dr
fa3e
-fah6l5ent
-3fahre
-5fahrt
+fa4eli
+2faf
+fah4l3ent
+3fahrt
fai3b
-f1a2ka
-fa2ke
+f1a4ka
+fa4ke
f3aktio
f4akto
-3f2aku
-fa3la
+f2aku
+fa3l2a
fa3le
fal2kl
fal2l1a
-fal4l3ei
-fall5ent
-fal6lerk
-faller6s
-fal6scha
-fal6schl
-fal6schm
+fal3le.
+fal2l3ei
+fall3ent
+fal2ler
+fall3er4s
+fal4scha
+fal4schei
+fal4schl
fal2tr
-fa2mei
-f1amp
+fa4mei
+4f1amp
f1amt
-3f2an.
+f2an.
fa2nar
+2fanb
fand2a
f2anf
fan2ga
@@ -6510,15 +6911,17 @@ f1anp
f2ar
far2b1a
far4bel
-far4b3er
-far4bin
+far2b3er
+far2bin
farb1l
far2bo
-far2b3r
+far4b3r
far2b3u
f3arc
-3fa5ri
+3fa3ri
+farm2e
far2r1a
+far2rh
farr3s
2f3art
2f3arz
@@ -6531,14 +6934,15 @@ f3at
f4at.
fa2to
f4ats
+4fatt
+2f1aue
2f1auf
f3aug
fau2s
f1ausb
faus4t3r
-3f4av
+3fav
fa2xa
-1fä
3fä1c
fäh4rin
fäh2ru
@@ -6546,148 +6950,154 @@ f1älte
2fäq
3färb
2f1ärm
-2färz
-fässer4
-fäs6serk
-fäs6serw
+4f1ärz
+fässer2
+fäs4serk
+fäs4serw
fä2ßer
2f1ätz
2fäug
2fäx
-4f1b4
-fbau1
+2fb2
fber2
+fb4re
2f1c
f3ch
-2f3d4
+2fd2
+f3da
fdien2
-1fe
+fd4rö
+f3ds
3fe.
featu4
fe2c
f2ech
fe3che
+fech5t2e
fe2del
fe2dr
fe2e1i
-feein5
+feein3
fe1em
-2f1e2he
+4f1e2he
fehle2
-feh4lei
-f2eie
+feh2lei
+fei3le
f2eind
+fe3infr
2f1eing
fe3ini
fe3ins.
fei4nu
2f1einw
f1eis
-fek4tin
+fek2tin
+fek2t3r
fe2l3a2
fe2l1ä
fel2da
felde4m
-feld6erh
+feld2er
fel2dr
2fe2lek
-2felem
fe2l1er
fe2les
+fel3le.
fe2l1o
-fel4s3oh
fels2t
felt4
-6fel6tern
+4fel4tern
f2em.
2femb
fem4m
2femp
-fen3a
+3fen.
+fen3a2
fe2nä
fend2
4fenerg
+fene4t
fe2ni
fe2no
fen3s2a
-fen5s2c
+fens2c
fenst2
f1ent
fen3t2a
2f3entf
f2enti
-4fentla
+2fentla
f2ento
-2f3entw
+2fentw
4f3entz
-3fep
-fe2pi
+fe4pi
f2er.
-fe1ra
-fe2rab
-fer3a2d
-fe2ral
-fe4rang
-fer4ant
-fe4ranz
-fe2rau
+fe2r3a2d
+fer3al
+fe1ran
+fe2rang
+fer2ant
+fe2ranz
fe2r1ä
2ferd.
fer3da
fer3d2e3
-f2ere
+2ferde.
+2ferden
fe2r1e2b
fe2rec
-3fer2ei
+fer2ei
4f3ereig
fer3eis
-f4erel
fer3ell
-fe4rer4g
-fer4fah
-fer4fol
+fe3rerf
+fe2rer2g
+fer2fah
+fer2fol
ferg4
+2fer2geb
+f4erges
f4ergr
-feri2d
+fe2ri2d
ferie4n3
feri4on
-4fer4leb
+fer2leb
+fer3m
f2ern.
fer4nei
fe2rö
f4erpa
f4erpf
f4erpl
-f4erra
-fer4reg
+f4er5ra
+fer2reg
ferri2
f2ers.
f2ert
fert4r
f2erz
-fess2e
-fe2st
-fest3a4b
+fer2zeu
+3fes
+fes3s2e
+fe2sta
+fest3a2b
fest3an
fest3ei
fes4tel
+fester2
fes4t1o
-fes4t3r
+fe2s4t3r
2f1e2ta
fe4tag
-3fete
fe2th
fet4t3a
fetti3s
2feu.
feuer3ö
-3few
2f1ex
fe1y2
-3fez
-1fé
-4f1f
-ffab6s
+2ff
+ffab2s
ff1a2d
f3f2ak
ff3ar
@@ -6695,52 +7105,57 @@ f3fas
ffa2t
ff1au
f2f1e2b
-ffe2e
f2f1ef
f2f1ei
ffe3in.
-f5fek
ff1e2m
f2femi
ff2en
ff3erle
-fff4
+ffer3z
+fff4a
ffi3k
-f2fim
ffin3s
ff1lag
ff3le
ff3li
+ff5lon
f3flü
ffo2r
ff1ox
f3f4rä
ff3ro
+ff4rü
ffs2am
-ff2s1p
+ff2s3p
ffs3tie
ffs3tut
ff3stü
ff3t2
ffus3s
-f2fy
-4f3g2
+2fg2
fgeb2
fge3s
+f3gh
fglim2
-4f3h2
-1fi
-3fi.
+f3gü
+2f1h2
+fh4eu
+f3hu
fi4ak
fi2ar
fi3at
-fid4
+fid2
fi2do
-f2ie
-fi2e1i
+fid4s
+f2i2e
+fi4eb
+fie1i
fien3
fi1er2f
-fi2gr
+fi4es.
+2fif
+fi2g3r
fi2k1as
fi2kel
fi2kin
@@ -6748,31 +7163,33 @@ fi2kn
fi2k1o4
fi4k3r
f2il
-fi2l1an
+fi2l3an
fil3d
fi2les
fil2et
-filg4
fi3li
fi4lin
fil2ip
fil2ma
fil2mä
-fil4med
-fil4mei
-fi2lo
-2fimp
+fil2med
+fil2mei
+fi2l1o
+2f1im
+fi4mi
+4f3imp
3f2in2a
fin2e
2f1inf
fing2
-fing4s4
+fing4s
+2f1inh
fi3ni
-f2ink
fin2s
fin3sc
fin3sti
-2f1int
+4f1int
+4f1inv
fi2o
fi3ol
fi2r
@@ -6780,12 +7197,12 @@ fi3ra
fi4re
fir3me
fi3s2a
-fi4sch3a
-fi6schei
+fi2sch3a
+fi4schei
fisch3o
-fi4schr
-fi4sch3w
-fi3s2h
+fi2schr
+fi2sch3w
+fi3s4h
2f1iso
fis2p
fi2s3t
@@ -6796,10 +7213,12 @@ fi4tor
five4
fi2xel
fi2za
-2f1j
-3f2jo
-4f1k4
+2fj
+f2jo
+2fk2
+fkaken4
fka4t3
+fk4ne
f2l2
2fl.
f3lad
@@ -6807,17 +7226,19 @@ f5land
f4lans
f3lap
f4lasc
-f3lats
-flauma4
-1flä
-3f4läc
+fl4at
+f3lat3s
+flauma2
+3flä
+f4läc
4fläd
-2fläh
-2f3län
-2flär
-2f3läu
-f5le.
+4fläh
+4f3län
+4flär
+4f3läu
+f3le.
2f3leb
+f4lec
f4lee
2f5lein
flek3
@@ -6830,119 +7251,142 @@ f3lind
fli4ne
f3ling
2f3lins
-2f5lon
-1f4lop
-1floß
-1f4lot
+f4log
+2f3lon
+3f4lop
+3f4loß
+3f4lot
flo2w
f3lö
4flöf
f4lög
+f4löß
+f4löz
3f4luc
f3luf
-1f4lug
-1f4luss
+3f4lug
+3f4luss
f4lut
flut1o
-f4lü
-f5lüm
+f3lüm
fly1
-4f3m2
-fma5che
+2fm2
+f3ma
+fma3che
fma2d
-4f3n2
+2f1n2
+f3na
+f3ne
+fnerz2
+f3ni
fni2s
-1fo
f1ob
fo2be
-2fober
+4fober
fob2l
-2f1o2f
-5foli3
+2f3of
+fo4fe
+3foli3
+3fon
fo2na
fo4nan
fon3au
fon3dr
-fo4n3in
+foni2e
+fo4n1in
fo2nop
fons4
fo2nu
-2f1op
+f1o2p
+fo3po
4f3org
+fo3rin
3form
-for4m3a4g
+for2m3a2g
for4mas
-for4m3ei
-for4min
-forni7er.
-for6schl
+for2m3ei
+for2min
+forni5er.
for4st
-for4t3ei
-for4ter
-for2t1h
+3fortb
+for2t3ei
+for2ter
+for2th
for2t3r
fort3s2
for3tu
for2u
fot4r
-1fö
-2fö2f
+2föf
+fö4fe
2f1ök
-4f1öl
-för4s5
-4f3p4
-2f1q
-f2r4
+2f1öl
+för4s
+2fp2
+f3pf
+f3pl
+fp4lu
+2fq
+f2r2
f3ra.
-frach6tr
+frach4tr
2f3rad
2f3rah
fra4m
+fr4an
f3rand
-f5rap
+f3rap
+f3rase
fras3ta
f3rat
-1frau.
+3frau.
f3rauc
2fräd
-1f4rän
+3f4rän
2fre.
f3rec
f3red
-2fref
+4fref
f4rei.
f3reic
f4reie
-frei1f
+frei3f
f4reig
frei3k2
-2frein
+4frein
2frek
2f3rep
-2frest
+f4req
+f3resi
+4frest
3f4reu
2f3ric
-fricht6e
+fricht4e
fri3d
-fri2e
+f4ri2e
+f5rieb
+f5rief
2frig
f4ri3k
+2f3rin
f3rip
-1fris
+fr4is
f4risc
f4rist
2f3roc
+f3rok
2frol
-1f4ro2n
+3f4ro2n
fro4n1a
-f4rop
-fro2s
+f4ror
+f4ro2s
f3rot
+f3roz
frös2
f3ru
f4ruc
f3rü
-4f1s
+2f1s
f2s1al
f2sa2n
fs3ane
@@ -6961,47 +7405,52 @@ f4schro
f4scr
f2s1e2b
fse2ei
-f4s1ehr
+fs1ehr
fse2n
fs1en1e
f2s1ent
f2s1er
+fser2u
fse4t
f2s1eta
-f2s1i4d
+f2s1i2d
f3s2ky
f2s1o2
f3soh
f3sol
-f3spann
-f2s1pas
+fs2pa
+f2s3pas
f2sph
f3s2pl
f3s2por
+fs2prä
f2spre
f2spro
fs2pul
-fs3s4
+fs3s2
+fss4h
fs2t
+f4st.
fst2a
fs3tak
f2stas
f3stat
fs3tät
-f4stäti
+f2stäti
+f2stech
+fste2i
f3stel
f3stern
fs3th
f2stip
-fs4tol
fs4tor
fst4r
-f4s3tres
+f2s3tres
fs3trü
-f4stüte
+f2stüte
f2s1un
f3sy
-4f1t
+2ft
f4ta.
ft1a2be
ft1abl
@@ -7028,8 +7477,9 @@ f4t1ent
ft3erfü
ft1erk
f2t1erl
+fter2le
f2t1erz
-f2t1e2ti
+f4t1eti
f2t1ex
f2t1h
f4t3hei
@@ -7037,93 +7487,92 @@ f2t1id
f3tik
f2tim
f2t1in
-ft2ing
+f3t2ing
fto2
f2t1of
f2t3ot
f3t4ran
-f2t3res
+f2tres
f3treu
ft4rit
ft3ro
-ft3ruh
+ft4ru
+ft5rud
+ft5ruh
ft2s1
+ftsa2g
ft4sam
ft3s2c
ft4sche
ftse2
-ft4seh
ftsen1
ft3st
ft4staf
fts3tät
ft4stei
ft4stem
-ft6stier
-ft6s5treu
-ftstro4
-ft4stru
+ft4stier
+ft4streu
f2tum
ft1urk
ft1url
-f3tü
+f3tü1
+f4tüb
ftwa4
-ftwa6r
ft3z2
ftze3d
-1fu
+ftz4w
3fuc
3fug
-f2uh
+fugi3
+3f2uh
fuku3
fulb4
f1um1
fu2mei
f2umm
-fund3er
-fun6derg
-fun6derh
+2fums
+fun2d3er
2f1unf
fung4
2fungl
2f1u2ni
-fun2kl
+fun2k3l
fun2ko
fun2k3r
fun2ku
-2f1unm
-2funr
-2funt
+4funm
+4funr
+4funt
f2ur
furch2
fu4re.
2f3url
fus2sa
-fus2s1p
+fus2s3p
fus2st
fu2ß1er
3fut
-1fü
2füb
-fühl4sc
+fühl2sc
fün2
fü2r
-2f1v
-4f1w
-f1y
-4f1z
+2fv
+2fw
+fwur2
+2f1y
+2fz
fz2a
-fzeiten6
-fzei8t7end
+fzeiten4
+fzei4tend
fz2ö
-fzu2ga
-fz2w
+fz4wi
+1g
3ga.
2gabf
2gabg
2g1a2b3l
gab2o
-g1abr
gab4ri
2gabsc
g2abt.
@@ -7137,40 +7586,37 @@ ga3d2i
gadi4e
ga2dr
gae2
-ga1fl
-5gag.
-ga1k
-ga2ka
-ga2ku
+ga3fl
+3gag.
+ga3k
+ga4kt
+ga4ku
gal2a
-ga3laf
-ga2lar
2g1alau
2g1alb
-2g1alg
+g1alg
gal3lo
2g1alp
2g1alta
2g1altd
g1a2lu
-ga2mec
-ga3mel
+ga4mec
gam3ma
-5g4amo
+3g4amo
2g1amt
g1a2na
2ganal
-gan3d4
+gan3d2
2ganf
2ganga
-4gangeb
+2gangeb
gan2gr
gang4sp
gan2g1u
2g1ank
2ganl
2ganmu
-3g2ano
+3gano
ga2nob
2ganr
gans2
@@ -7182,7 +7628,6 @@ ga1ny
2g1anz
ga3pe
2g1app
-ga1q
3gar.
g2ara
2garc
@@ -7199,17 +7644,19 @@ g2as.
ga2sa
ga4s3al
ga4sam
-gasche4
+gasche2
gase2
+ga3se.
ga2sei
ga2sel
ga2se4m
ga2si
ga2sor
+gas3pe
gas3s2
-5g4asse.
+3g4asse.
g3asses
-6gassess
+4gassess
ga2st
ga4ste
gas4t3el
@@ -7222,49 +7669,53 @@ gau1c
2g1auf
2g3aug
g2auk
-gau5ne
+gau3ne
2g1aus
2g1aut
ga3z
+gäm3
2g1äp
gär3th
-2gärz
-gä4u
-2g5b4
+2g1ärz
+gä4st
+2g1ät
+gä4us
+2gb2
gber2
gbi2
+gb4ri
gby4t
2g1c
2gd
-g1da
g3d2ad
gda3de
g2d1ak
g2d1an
-g2d1ar
g2d1au
-g1dä1
-g2dei4
+gdä1
+g2dei2
gd1els
g2dent
g2d1er
g2d1et
g2d1in
-g1do
g2dop
-g1dö
-g1dr
gd3re
gd3ru
gd3s2
-gdt4
+gdt4r
ge3a2
+ge4at.
ge4ate
geb2a
+3gebä
+ge4bb
+3gebi
ge3ble
-geb4lin
+geb2lin
geb4lo
gebot4
+ge4bt
3gebü
ge1c
ge3ck
@@ -7272,56 +7723,61 @@ ge1e2
ge3ec
ge2es
geest3
-ge5fa
+ge3fa
+2gefak
3gefä
4g1eff
gef4l
gef4r
-ge3fu
-g4eg
-gege2n1
+gege2n
gegene4
gegen3s4
ge3g2l
geg4r
+3geha
+3gehä
geher3l
ge3ho
+ge4hs
+ge4ht
+ge3hur
2g1eid
ge4ie2
ge4ig
-g2eil
-ge1in1
+ge1in
ge2inf
-gein4h
+gein2h
+gein3i
2g1einr
gein2s
gein2v
ge1ir
2g1eise
gei3sh
-geis4s3c
+geis2s3c
gei2st
geist3r
+ge4iz
2gek.
-ge4lanz
+ge2lanz
gelb1r
-gel4b3ra
+gel2b3ra
gelb3s
-gel4den
-gelder4
-gel6derh
-gel6ders
+3ge4ld
+gel2den
+gelder2
+gel4derh
+gel4ders
ge3lec
-gele5cke
+gele3cke
ge2lef
-2ge2lek
+2g3e2lek
2gelem
gelen1
-ge4lene
-gel3ere
-ge4lerk
+ge2lene
+geler3l
geler3ö
-ge4l3ers
+ge2l3ers
ge2l1ev
gel3f
gel1i4m
@@ -7333,163 +7789,180 @@ gels2p
gels2t
gel3ste
gel3sz
-gel3ta
+ge4lt
+gel2ta
gelt4r
-gel3z2
+gel3z4
gem2
-ge4ma.
-gem6e
+ge2ma.
+ge3mau
+gem4e
4g1emp
+gem3s
ge3mu
-g4en.
+3g4en.
ge3na
ge4n1ac
ge4nad
ge4nak
-ge4n3al
+ge4nal
ge4nam
ge4nap
ge4nar
ge4nat
-gen4aug
-4genda.
-gend3in3
-4g3endmo
+2genda.
+gend3in
+2g3endmo
gen2d3r
+gen2eh
gen3eid
-gener4f
-4generg
-ge4n3ern
-gen6erwe
-gener4z
+2generg
+ge2n3ern
+gen4erwe
+gener2z
ge2nim
gen3k4
gen3n
+3geno
ge2noc
+ge4nr
gen4sam
-gen6semb
+gen4semb
gen3sk
gen3sz
gen3tä
2gentf
gen3t2h
-gen5tr
+gen3tr
2gentw
-gen3zw
ge1oo
geo2ri
-g2ep4
+g2ep
+ge5pfi
ge3pl
ge3po
ge1ra
-ge2rab
+ge2ra2b
ge2rak
ge2r3al
ge3rann
-ge4rant
+ge2rant
ge4r3a2r
ger2as
+ge4rb
2gerdg
ge3rem
-ge4rene
-ge4reng
-ge4ren4s
-ge4r3ent
+ge2rene
+ge2reng
+ge2ren2s
+ge2r3ent
ger2er
-gerin4d
+gerin2d
gerin4f
-ger4inn
-gerin4t
-4ger4klä
+ger2inn
+gerin2t
+2ger2klä
g3erlas
-ger5me
+3g2erlä
ger3no
2g1ernt
ge1ro
ge2rob
ge1r2ö
-ger4sat
-4g3er4seh
+4g3erprob
+ger2sat
+2g3er2seh
ge3r2u
+ger2zeu
ge1s2
g4es.
ges3auf
-3ge3sc
gesch4
-ge6sche.
+ge4sche.
ge2s3eb
-4g3e4sel.
+2g3e2sel.
ges3elt
ge2s3er
ge3sha
ge3si
+ges3k
ge3so
-ge3spa
-ges4pi
+ges3s2a
ges3se
ges3s4t
gest2
gest4a
ge3stak
ges4tan
-ge3st6e
+gest4e
+ges4tem
ge4s3ter
ges3th
-ges6tier
-ge4s3tur
+ges4tier
+ge2s3tur
ge3t2a
ge4tang
ge4tant
g1etap
ge2thi
-ge5trei
ge5tri
-ge5t4u
+ge3t4u
+ge5tun
2g1e1ul
ge3unk
ge1urt
ge3u4t
-4g1e2x
-2g5f4
+ge3we
+2g1e2x
+2gf2
+g3fe
gfi2l
-2g1g
+gf4rü
+2gg
gga4t
-g5ge
+g3ge
gge2ne
+gge3sa
+ggi3e
gg2l
g3gla
g3glo
g2g3n
-gg4r
+gg4re
+gg5re.
ggs2
2g1h
-4gh.
gh2a
3ghale
gh2e
+gheit4
3g2het
3g2hie
gh1l
+gho3re
3gh2r
-ghs4
+ghs2
gh3sc
g2hu
-gh1w
+gh3w
gi3alo
gich2
gicht1
+gi2e
+gi4eb
gie3g
-gi2e1i
-gi2e3l
+gie1i
+gie3l
giel2a
gie5n2e
gi4eno
+gi3ens
gie3res
+gi3ern
gie1st
gift5s
gi2gu
gi2kel
-2g1ill
gi2me.
gi4mes
gi2met
@@ -7497,52 +7970,63 @@ gi2met
2gin2d
gi3ne
2g1inf
-2gin4h
-2g1ins
+4gingeni
+2gin2h
+g1i4ns
gin2sa
+2ginsf
2g3int
2gin2v
gi2ob
2giok
2g3isel
+gist4
+giste4
git2a
+gitt2
gitt4e
gi3tu
-gi4us
-2g1j
-4g5k4
+gi4u3s
+2gj
+2gk2
+gk4ne
+g3ko
gl2
-4gl.
-4g1lab
+2gl.
+2g1lab
2g1lac
2gladu
2g1lag
2g1lam
2gland
gla2s1c
+glas3p
glas3t4
+gl4at
3g2laub
2g1lauf
2gländ
+3gläs
2gläuf
gl3b
-g2l4e
+g2le
2g3le.
3glea
2g3leb
g3lec
-4g3led
+3gled
g3lee
2g3leg
2gleh
g4leic
4g3lein
-gleiter8s
+glei4st
+gleiter6sc
glei4t5r
g3len
4glenk
4g3ler
-glerei4
+glerei2
2gles
3gles.
g3lese
@@ -7566,7 +8050,7 @@ g2loa
g2lob
g2loc
2g3loch
-g2lok
+g5loks
g2lom
g2lop
2glorb
@@ -7585,8 +8069,8 @@ g2lut
g3lüg
2glw
3g2ly
-2g1m2
-gmen4tr
+2gm2
+gmen2tr
gmi2s
g1n
2gn.
@@ -7594,9 +8078,9 @@ g2n2a
g4na.
2gnac
g4nad
-2g5nah
+2gnah
gn4al
-gna4l3er3
+gna2ler3
2gnanl
3g2nä
2gnb
@@ -7612,9 +8096,10 @@ gneu1
2gnh
g2nie
g2nif
-g4nin
+g4n1in
+2gning
2gnint
-2gni4s3
+2gni2s3
gnise2
2gnk
2gnl
@@ -7634,23 +8119,30 @@ g2nü
2gnw
g2ny
2gnz
-go4a
-goa3li
+3go.
+go2a3
+go4al
g1ob
gobe3l
-2gobj
+2go4bj
g2ob2l
-gob2s
-2g1o2f
+go4b2s
+go4ch
+goe3
+2g1of
+go4fe
2gog
+go4gh
2g1oh2
goh3ren
go1i
gol2a
gol2da
gol2fr
+go4mn
3gon.
go4nat
+go4nd
gon2e
3gons
3g2opa
@@ -7658,79 +8150,92 @@ gopf4
go2pos
2gopt
gor2a
-2g1ord
-2g1org
+2g1o4rd
+g1org
+go4rt
+3gos
go2si
-go2s3p
+go2sp
+go4ss
go1ste
-2g1osz
-go3t2h
-got6terb
-got6t5erg
-gotte4s
+4g1osz
+go3th
+go4tt
+got4terb
+got4t3erg
3gou
go1y
-gö2f
+gö4fe
g1öl
3göt
-2g3p4
-2g1q
-g2r4
-g4rab
+2gp2
+g3pf
+gp4fu
+gp4la
+g3ps
+g3pü
+2gq
+g2r2
+g4r4ab
gra2ba
gra2bi
gra4bl
2g3radl
2g3rah
+g3rai
2g3rak
+gr4al
gram1
-grammen6
-gram8m7end
-gram6mer
-g3rand.
+grammen4
+gram4m5end
+gram4mer
+g3rand
+g4rande
2gra2r
grar1e
+gra3rie
gra4s3a
gra4sh
gra4sp
gra2st
2g3raub
-grau3f
+grau5f
2graum
grau3sk
2gräd
+g3rän
gräs1c
g3räu
-2g5re.
+2gre.
g4reb
2g3rec
g3rede
-g4re2e
+g4ree
2g3ref
gre2fr
2grege
2g3reic
grei4fr
2g3reih
+g3reim
g3rein
g3reit
3g4rem
-3gren
-4g3renn
+3g4ren
+4g5renn
gre3no
-gren6z5ei
+gren4z3ei
grenz3w
g4rer
-2grese
-gres6ser6
+2g3rese
g3ret
g3rev
2g3ric
gri2e
-2g3riem
+4g3riem
g3riese
2grig
-gril4la
+gril2la
4g3ring
4g3rinn
gro2b3a
@@ -7740,28 +8245,30 @@ gro2b3r
2groc
2groh
2g3rol
+gr4om
2g3rose
g4ross
-gros6sel
+gros4sel
+g4roß
g4rot
+2g3röc
2gröh
2gruf.
g4ruft
2g3ruh
g3rui
2g3rum
+grunder5n
grun2g
3grup
-3grus
-3gruß
-2g3rut
+4g3rut
2g3rüc
-4g2s1
-gs3a2b
+2g2s1
+gsa2
+gs3ab
g4sac
-g5sack
-gsa2d
-gs3a2k
+g5sa3ck
+gs3a4k
g3sal
g4s3alb
g4sall
@@ -7772,11 +8279,11 @@ g4s3ama
gs3amb
g4s3amp
gs3a4p
-gs3a2r
+gs3ar
g3sat
+gsa3te
gsau2g
gsau4r
-gsa2v
g3säu
g3s2c
g4sca
@@ -7784,58 +8291,63 @@ g4s3ce
gsch4
g4schef
gs4chi
+g4scl
g4sco
gse2
gs2e3h
-gs4eil
+g3s4eil
gse4kl
g3sel.
g4sela
g3seln
gs3em
gsen1
-g4s3ent
-g4s3er
+g4ser
g3sere
-gser1i
+gs3er1i
g4se4s
gse4t
g4seu
gsfi2l
-gsgene4
gs3ha
gsi2d
gs3i2k
-g3sil
+g3s4il
gs3io
g4s3ita
gs2ki1e
-gs3kr
gso2
-g4s3o4b
+g4so4b
+gso4f
g3sol
gs4on
g4s3op
-g5s4orge
+g3s4oz
+gs3p
+gs4pac
gs4pant
-g4s3pas
g3spei
-g3s2pek
-g3s2pi
-g5s6pie
-g4s3pl
-g5s6port.
-g4s3pru
-gsrat4
+g3spek
+g4spf
+g3spi
+gs4pir
+g4spl
+g3s4port.
+g4spru
gsrü2c
-gs3s4
+gs3s2
+gss4t
+gss4w
+g4st.
gs3ta
g3s4tad
g4stag
g3s4tan
+gs6tand
g4stanz
g3star
gs4tati
+gst1au
gs3tä
g3steh
g3s4tein
@@ -7852,23 +8364,23 @@ g3stir
g3sto
g4stoch
g4stod
+gs4tof
g4stor
gs3tö
gs4tör
-gs3tr
-gst4ra
-gs4tras
-gs4trat
-gst5reit
-gst4res
-g4streu
-gst3rit
+gst3reit
+gs3t4res
+g4s3treu
+gs4t3rit
gst3ros
+gs3trü
g3stun
gs3tü
+gs4uc
gs3un
g3sy
-2g1t
+gs4ys
+2gt
g3te
gtei3s
gt1h
@@ -7876,12 +8388,11 @@ gt2hy
gt2i
gti2m
g3to
-gt4r
-gt4s
+gt4ra
+gt2s
g3tü
gu4ale
gu3am
-gu1an.
gu1ant
gu1as
gu1c
@@ -7889,58 +8400,60 @@ gu4d3r
gu2e
2gued
guet4
-2g1u2f
+2g1uf
+gu4fe
2g1uh
gu3ins
gu1is
-gum2e
+gum4e
3gumm
gummi1
gun2e
2g1unf
gunge2
-4gungew
+2gungew
2gungl
2g1u2ni
2g3unk
2gunr
gun2s
2gunt
-3gur
gure4
-4g1url
+2g1url
gur2t3h
gur2tr
gurt3s
-guru1
gu2s
gu4s3a
gu3sc
-guschi5
+guschi3
gu3se
+gus3se.
guss1o
gus2sp
gus2st
gu4st
-gust3a4b
+gust3a2b
gus3te
-gus6t5en6d
-gus6terl
+gus4t3en4d
+gus4terl
gus4tr
gu2t
gut1a
-gut3er4h
+gut3er2h
gut1h
gut2s3p
2güb
3gür3
gü2s3
-2g1v
-2g1w
+2gv
+2gw
+gy2a
gy3n
gy4na
-2g3z2
-gzeu4gi
+2gz2
+gzeu2gi
+g3zh
2ha.
hab2a
hab2e
@@ -7951,12 +8464,11 @@ h1ablu
h1a2br
h1abs
2habw
-ha4ch3en
+ha2ch3en
ha2cho
hacks4
2hada
ha2del
-hade2n
h1adle
h1a2dr
ha3dri
@@ -7980,32 +8492,33 @@ h2ai
3hai.
h2aj
2haka
-ha1kl
+ha4kes
+ha3kl
2h2al.
ha3l2al
-halan4c
+halan2c
h1a2lar
ha2lau
hal2ba
hal4bel
-hal4bin
+hal2bin
hal2b3r
hal2bu
2hale
2halh
hal2i
hal2l1a
-hal6lere
-haller6f
-hal6lerg
+haller2
ha3lo
4halp
hal4sk
hal2sp
-hal4tal
-hal4tei
-hal2t3r
+hal2st
+hal2tal
+hal2tei
+hal2t5r
hamot4
+hampi4ons
2h1amt
h2an.
2hana
@@ -8016,13 +8529,15 @@ han2au
h2anbe
h2and
han2da
-han4d3er
+han3den
+han2d3er
han2d3r
hand3s
ha2nem
-han2f1
-han6g5end
-han4gro
+hanf1
+han2fl
+han4g3end
+han2gro
han2k1
2hanl
2hano
@@ -8034,8 +8549,8 @@ h1ansc
ha2pl
ha2po
ha2pr
-h2a3ra
-ha4rab
+ha3ra
+h1a4rab
2harb
2harc
h2ard
@@ -8043,22 +8558,23 @@ har2fr
h1arm.
har3ma
h2arme
-har4me.
+har2me.
har4ne
ha2rom
2hars
-hart4e
har2th
h1arti
har4tr
+h2arts
har2za
h2as
2has.
2ha3sa
has4c
has2h3
+has2p
has4sa
-hasser4
+has2ser2
has4s3t
ha2str
h1a2ß
@@ -8067,11 +8583,11 @@ hat2i
h3atl
ha2t3r
2hats
-hat5t2
-h3attr
+hatt2
+hat5tr
h1audi
h1aufb
-hau5f6lie
+hau3f4lie
hau3f4lo
2h1aufm
h1aufs
@@ -8081,90 +8597,97 @@ hau2sa
hau4san
hau2s1c
h2ause
-hau4sel
-hau6s5ent
-hau4spa
-hau4spe
-haussen6
-hau4sur
+hau2sel
+hau4s3ent
+hau2spa
+hau2spe
+haussen4
+hau2sur
hau2t1a
+hauten4
+hauto2
hau4t3r
ha2ve.
+havil2
häde2
h1äff
2häi
hä2kl
-2härz
-hä6s5chen
+2h1ärz
+hä4s3chen
2h1äst
2häug
häu2s1c
hä3usp
-2h3b4
-hba4ras
+2hb2
+hba2ras
hber2e
+h3bo
+hb4ri
2h1c
-2h3d2
+2hd2
hdan2
+hdä1
+h3ds
2hea
he2ad
-he3be
+he3as
heb3eis
he2b3l
-he3br
-he3bu
+he3bla
he3ch2e
-he3chi
he1cho
h3echs
-he3cke
hed2g
he2dit
he1e4m
-hee2n
+he1e2n
+he2en.
hee2s
he1e2t
h2ef.
he2fan
he2fau
he2f1ei
-he3f2em
+hef2em
hef3erm
2heff
he2fid
-he4f3in4g
+he2f3in2g
he2f5le
2hefr
hef4ra
he2fre
3heft
he2fu
-he3gu
he2hel
hei4a
h4eib
h1eie
h1eif
+hei4fr
h1eig
he2im
-hei4mal
-hei4man
-hei4mar
-hei4mei
+hei2mal
+hei2man
+hei2mei
heim3p
hei4mu
2hein
hei4na
heine2
-hei4n3eb
-hei6nene
-hei4n3er
-h3eintr
+hei2n3eb
+hei2neh
+hei4nene
+hei2n3er2
+he2inf
+h3einsp
2heio
2he1ism
he1ist
h2eit
-heit4s3
+he3i4ti
+heit2s3
h1eiw
hekt3a
he2la
@@ -8174,25 +8697,25 @@ hel3au
hel1ec
he2lek
h3elem
-he2len
h2elf
-he3li
hell2a
-hel4l3au
-hel4mei
+hel2l3au
+helm1a
+hel2man
+hel2mei
he3lo
he4lof
hel2or
he2lö
+helsau2
4helt
h4em.
2hema
hem2b
1hemd
-2heme2
-h2e3m2i
-he4mia
-h3e4miss
+2heme
+h2em2i
+h3e2miss
1hemm
2h3emp
h2en.
@@ -8203,34 +8726,33 @@ henen1
hen3end
he4nene
he4nens
+he4nenz
hen3erg
-he4nerm
+he2nerm
he2n1e4t
2henga
-hen4gag
-hen4kan
-hen4kau
+hen2gag
+hen2kan
+hen2kau
2heno
heno3t
-hen4sem
+hen2sem
henst2
hen3str
hent2a
-hen3te
-hen4ter
+hen2ter
hen5tr
-hen4tri
h1ents
-2h3entw
+2hentw
h3entz
he4n3u
hen3z2
2he2o
he3on
he3op
-he3pa
-he3ph
+heori2e
h1e2pi
+h1epo
hept2
h2er.
her3a2b
@@ -8239,155 +8761,190 @@ he2rad
he4r3a2r
herau2
herb2
+her3c
+her2dri
+h2ere
he2r1e2b
-he4reck
-her4eif
-4he3reig
-he6reis.
-her7eises
+he2reck
+her2eif
+2he3reig
+herein3
+he4reis.
+her5eises
he2rel
-he4rene
-he6rersc
-he4rerw
+he2rene
+herer3s
+he4rersc
+he2rerw
+h4erfam
h1erfo
-her4fol
-6hergebn
-2herif
-herin4d
+her2fol
+herg2
+4her4gebn
+he2rid
+heri2e
+4herif
+herin2d
herin4f
-he6rin6nu
-herin4s
+he4rin4nu
+herin2s
+herin4ter
h1erke
-her4klä
-h5er6kran
-h6erlad
+her2klä
+h3er4kran
+h4erlad
2herm
+h1ernt
he3ro
he4r3o2b
he4rof
he4rop
he4rot
h1erör
+hers4k
+her3sta
hert4
her3th
her3um
-her4zap
-her6zeng
+he2rut
+h1erwä
+her2zap
+her4zeng
+her2zer
h3erzeu
-her2z1w
-he3s4a
+her2z3w
+he3s2a
2hese
he3si
-he3s2p
-hes6tä
+hesi2e
+hes4p
+hes4ser
+hes6tän
+hes6tro
+hes6trö
+hes6tüc
he2tap
-he3tä
+hete1
heter2
-he3th
het2i
-he3t4s
+he3t2s
he2u
heu3g
+h3eule.
he3unt
3heusc
-he3x
-he1x2a
+he1x4a
2hexp
hey2
he1ye
1hè
-2h3f4
-hfaller6
+2hf2
+hfaller4
hfan2
hfel2l3
hfi2s
+h3fl
+hf4la
hflei2
-2h3g4
+hf4rü
+2hg2
+h3ga
hga2s1
+h3gr
+hg4ru
+h3gu
2h1h2
hhoh2
-4hi.
+2hi.
2hia
hi2ar
h1iat
2hic
hi1ce
-hich6t5er
-hicht6sp
+hich4t3er
+hicht4sp
hi3d
+hi4db
+hi4dd
hid4e
hi4dio
2hido
hi2e
hi3ens
-hie4rei
+hie2rei
hier3i
-hie4rin
-hiers2
+hie2rin
+hiers4
hif3f4r
hi2k3r
hi2l3a4
-hile3n2
+hi3l4au
+hilen2
hil2fr
+hili2e
h2im
2hima
h3i4mit
h4imm
h3impe
+h3impl
hi2n
hi3nak
-hi3nam
+hi3n2am
hi3nap
hi5n2as
-h2inde
+hinau2
hine2i
hi3nel
-hin2en5
+hin2en
h1inf
h1inh
2hi3n2i
hin3n2
-hi3n2o
+hi3n2o3
hin3s2
hin2t1a
2hio
hi3ob
hi4on
+hio3p
hi2p3
hi4pl
hips2
hi4pu
hi2r
hi3ra
-2hi3re
+hir3b4
+4hi3re
hi3ri
hir2m1a
hir2mi
hirn1
-hir4ner
+hir2ner
hir2s
1hirt
2his.
his2a
-hi4se
+hi2se
h1i2so
+his2p
hi3tac
-hi2tan
-hi2tel
-hi1th
+hi3th
hi3t2i
hit1r
-hi2tro
hit3z2e
hi2v1o
-2h1j
-2h1k4
+2hj
+2hk2
hkamp2
h2keu
hki2n1
+h3kl
+hklat3
+hk4ne
h3kö
+hk4re
2hl
-h4laf
hl2ag
hla2gr
hlan4d3a
@@ -8398,10 +8955,14 @@ h1lat
h1laut
h1lay
h3läche
+h4läf
+hl1är
h1läs
h1läu
-hlb4
-hl3d4
+hlb4l
+hl3d2
+hld4a
+hld4r
h3le.
hle3a
h3leb
@@ -8412,32 +8973,29 @@ h3leist
hl1el
h5len.
hle4nas
-hlenen3
hl2enn
-h4l3entr
-h4lents
+hl3entr
+h2lents
hl2enz
h3ler
hle2r3a
-hl4ere
+hl2ere
h2lerg
-hler4hö
+hler2hö
hl2erk
-h6l3er4nä
+h6l3er2nä
hle3run
hl1erw
h4lerz
h3les
h4lesi
h4leud
-hlf4
-hlg4
h2lie
h3lied
h2lif
h2lim
hl1ind
-hling4s3
+hling4s
h2lip
h2lis
h2lit1
@@ -8446,20 +9004,23 @@ hl3m2
h2lo
hl1ob
h3loc
-hl1o2f
+hl1o4f
h3log
h4lor
hlo2ra
+h5lorb
h3los.
h3losi
h4loss
hlos4st
h2lös
+hl2sal
hl4sar
hl2ser
hl3ska
-hl3s2lo
-hl5s6tern
+hl3slo
+hls2tec
+hl3s4tern
hls3tie
hl5str
hl2su
@@ -8468,13 +9029,13 @@ h3luf
h3luk
h3lumpe
h1lüf
-hlz2
-2h1m
+hlz4w
+2hm
hm2a
hm3abl
h3mad
h3mag
-h3mak
+h3m4ak
h3man
h2mant
h3mar
@@ -8487,33 +9048,38 @@ hm2e
h3me.
h3med
hme1e4
-hmeer4s
+hmeer2s
h3mein
+h3meise
h3meld
hme3le
h3men
hmen2s
-hme4ran
-hme4rei
+hmen4s3p
+hme2ran
+hme2rei
+hme2rid
hme1s2t
+hm3estr
h3mex
hmi2e
h3mind
-h3mini
-h3minz
h3mirr
+h3misc
h2mo
h3mop
h3mot
h3m2ö
+h4mök
h4möl
hm3p2
hm2s
hm3sa
-hms1p
+hms3p
h2mu
h3mul
hmut4s
+h3my
2hn
h2na
hna2c
@@ -8525,8 +9091,10 @@ h4natt
h3nau.
h2nä
hn1äh
+hn1är
h3näs
-hn3d4
+hn3d
+hnd4r
hn2e
hne3b
hne2e3
@@ -8538,14 +9106,16 @@ hne4n
hn4eng
hne4pf
h3ner
-hner4de
+hner2de
hner3ei
h4n3e2ro
h4n3ersa
+hn3eur
hn3ex
-hn3f4
+hn3f2
+hnf4l
hnflei4
-hnhof8stras
+hnhof6stras
h2nic
h2nid
h2nie
@@ -8553,101 +9123,117 @@ hn1im
hn1in
h2nip
hni4sa
-hnk4
-hnno2
+hnk2
+hn1ob
h2no2r
hnra2
+hns2
hn3sa
-hn3s2p
+hn3sp
hnst2
-hns4to
-hnsuch4
+hnsuch2
+hn2th
hnts2
h2nul
h2n1unf
-hn3z2
-ho4ar
+hnz2
+h4oben
ho3bern
ho2b3l
ho2ch3
ho4cha
-hoche2
ho2cka
-ho6ckerl
-hock3t
+ho4ckerl
+2hocy
2hod
2ho2e
hoe3n
ho3er
-ho2f1a2
-ho2fä
-ho2fed
-ho2feu
+ho4f3a2
+ho4fä
+ho4fed
+ho4feu
hof3f4a
-ho2f3l
-ho2f1o
-ho2f3r
-ho2fu
+hofi4
+ho4f3l
+ho4f1o
+ho4f3r
+ho4fu
+ho4fü
2hoi
ho2l1a2
hol3ar
+hol3dr
1hole
ho2l1ei
ho2lem
-hol3g4
+hol3g
+holin4
hol3k
-holl4
+hol3l4
hol3s
2holy
h3olym
1holz
-hol6zene
+hol4zene
hom2e
-ho2me.
-ho2mec
-ho2med
+ho4me.
+ho4mec
+ho4med
+ho4mel
h2on
hon2er
+honi2e
ho1on
hoo2r
2hop
+ho2pe
ho1ra
+ho2rak
h1o2r2an
ho2rau
h1or3d
2hore
-ho4rens
+ho2rens
ho3ret
+hor2fr
2h1org
hor3ta
-hor4ter
+hor2ter
h1ortu
h2os.
hose2
ho2sei
ho3sl
ho4sla
+2hosö
ho2sp
ho3spr
ho4ßene
2hot.
-ho3th
2hotr
2hot3s2
-1hou
+ho3un
hou4s
2ho2w1
+ho3wer
h1ox
ho1y2
+2hoz
1h2ö
2hö.
hö2c
hö3ck
-5höhe
-2hö2s1
+2höe
+3höhe
+hörs4
+hö2s1
+h4ösc
h3öst
-2h3p4
-h1q
+2hp2
+h3pf
+hp4lä
+h3pu
2hr
hra2b
hr3a2c
@@ -8655,10 +9241,11 @@ hr3ad
hr1a2g
h1r4ah
h1rai
+h3ramp
h1rane
hr3ap
+hrau2c
h3räu
-hrb4
hr1c
hr3d
h2rec
@@ -8668,28 +9255,36 @@ h3ref
hr3eff
h2r1eh
h4rei.
-hrei4ba
-hrei4br
+h4reib
+hrei2ba
+hrei2br
h3reic
h3reif
h4r3eig
-hr4eini
-h4reinl
+hr2eini
+h2reinl
hrei3th
-hreli1
+h4r3ele
+hren3z
h3rep
-hrer6geb
+hrer2fo
+h4rer4geb
hr2erh
hr2erk
h4rerla
-h6rer6leb
+hr2erle
+h4rer4leb
+hrer2lö
hr2erm
-hrer3s
-hrer4sa
+hrer2sa
+hrer3st
+hrer2tr
+hrer4trä
+hrer4tüc
hr2erw
hr2erz
h3re2s3
-hress2
+hress4
hrest2
hre2t
h2r1eta
@@ -8699,18 +9294,16 @@ hrg2
h2ri
h3ric
h4rick
-hri4e
+hri2e
h3riesl
h3rin
-h4r1ind
hr1int
h4rist
-h5ritter
-hr3l
+h3ritter
hr3m2
h3rog
h3roh
-h1ro2l
+h3ro2l
h4romat
h4rome
h4romi
@@ -8720,21 +9313,21 @@ h1ropa
hro4r
h3rou
h3rö2s
-hrr4
-hr4s1ac
+hr4s3ac
hr4s3and
-hr3schl
-hr2s1em
+hr4s3au
+hr2s3em
hr2sen
-hr2s1er
+hr2s3er
hr2set
hr4sh
-hr2sin
-hrs3k
-hrs3l
-hr4s1of
+hr2s3in
+hrs5ka
+hrs5kl
+hr4s3of
hrst2
hr2su
+hrs3z
hr2tab
hr2tan
hr2te2l
@@ -8744,77 +9337,85 @@ hrt3ric
hrt2s
h3ruh
hr1ums
+h3rus
h3rut
h3rü
h4rüb
-h4ry
+h2ry
hrz2
-4hs
+2hs
+hsa2b
h4s3acht
h2s1a2d
h2s1alk
-h2sall
+hs2alt
h4samt
h2san
hs3and
+h3sann
h2s1as
h2sath
h2sato
h2saud
-h4s3aur
h2saut
h2säh
h2säug
-h4schan
+h2schan
+hs4co
hs2cr
+h3se.
h2s3ec
-hse4e
-h4s1ehr
+hse2e
+h2s1ehr
h2s1eie
-h4seind
-h6seinst
-h3sele
-hse4lin
+h2seind
+h2seins
+hsela2
+hse2lin
hs1emi
-h4sendw
-hsen5erg
+h2sendw
+hsen3erg
h2s1ent
+h2s1erb
h2s1erf
hs1erg
-h2serh
-h4serkl
+h2s1erh
+h2serkl
h2s1erl
-hs1ern
-h4sernä
-hs4erne
+h2s1ern
h2serö
+h2s1ers
+hser2u
h2s1erw
h2serz
h2sex
h3s2ext
-hsha2k
+hsha4k
h2s1i2d
hs2im
h2s1ing
-h3s4inni
+h3s2inni
h4s3ita
hs2kal
h3skand
hs1of
h2sop
-hs1org
-h2spac
+hs1or
+hs2p
+h2s3pac
+h3span
h4s3pani
-h2s1par
-h2s1pat
+hs3par
+hs3pat
h3spec
h3spei
h3sperb
-h2sph
-h3spoi
-h2sprä
-h2spro
-hss4
+h2s3ph
+hs3po
+h3spra
+h3spü
+hss2
+h4st.
h1st2a
hs3tabl
h3stad
@@ -8827,35 +9428,36 @@ h2s3täu
h1stec
h1stei
h1stel
-h4stele
-h3s4terb
-h3s4tern
+h2stele
+h3stemp
+h3s2terb
+h3s2tern
h1s2ti
+h2stier
h2stit
h1sto
h2stol
h2stor
h1str
-h4s3treu
-hstro2
-hs3tum
+hs3treue
+hstro4
h1stun
h1stü
h2s1u
hs2ung
-4h1t
+2ht
ht1a
h2tab
hta2bl
h2ta2d
ht2ag
-ht4akt.
-ht4akte
+ht2akt.
+ht2akte
h2tall
h4talo
h2talp
h2talt
-h4ta2m
+h4ta4m
h2ta2n
ht3ane
ht2ank
@@ -8872,10 +9474,11 @@ h3taum
h4tax
ht1ä
h2tär
-ht3e4ber
+hte2ber
ht1e2c
hte3cha
-h2t1e2d
+hte2d
+h2t1ede
ht1eff
ht1e2he
h2teif
@@ -8886,112 +9489,119 @@ ht1ein
h2t1eis
h2t1eke
h4t3elas
-hte6l5ei.
-h4telek
-h4t3elfe
-h4t3elit
-hte4m
-h2t1emi
+hte4l3ei.
+h2telek
+h2t3elfe
+h2telit
+h2t1e4mi
h2temp
h4tenga
h4t3engl
-h4t3enta
+h4t3en4ta
h4tentf
h4tents
-hter6de.
-hterer6s
-ht3erfo
+hte3rel
+hterer2
+h2t3erfo
ht3erfü
-h6terfül
-h6tergeb
+h4terfül
+h4tergeb
ht3ergr
-hter6gri
ht1erh
-hter6häl
-hter8höhu
-h6terleb
-h6t5erleu
-h6terneu
-ht5erspa
-hter8spar
-ht3erst
-h6tersta
-hter6tra
+hter4häl
+hter4höhu
+h2terkl
+h4terleb
+h4t3erleu
+h4terneu
+h2t3ernt
+h4ter4prob
+hter4reg
+ht3erspa
+hter4spar
+ht3er2st
+h4tersta
+ht4erstr
+hter4tra
ht3erwä
-ht3erze
+h2t3erze
h4t1e2se
h4t1ess
-h2teta
+h4teta
hte4th
h2t1eu
-h4textr
+h2textr
h2t1h
h4thei
h3thera
h3thes
+h4thi
h4tho
h2t1i2d
h2t1im
-h2t1i6n3
+h2t1i4n3
ht3ine
h2t1is
-hti5t2
+hti3t2
htni2
+hto2
h2t1ob
-hto4d1
-h2t1o2f
-h4t3oly
+htod1
+h2t1o4f
+h2t3oly
+h2ton.
h2tope
h4tord
ht3rak
h3tran
ht3rand
h4t3ras
-ht6rates
+ht4rates
ht3rau
-h4traub
-ht6raume
+h2traub
+ht4raume
ht3rec
-h5treck
+h3treck
ht3rei
h2t3res
ht3ric
h4t3rieg
h4t3rin
+h4t3riv
h2t3rol
h2t3ros
ht3röm
ht3ru
-h2t3rü
-h4ts
ht2sah
ht2sal
ht4s3a4n
ht2scr
-ht4sein
+ht2sein
ht2sel
-ht4s3end
-ht4seng
+ht2s3end
+ht2seng
htse2r1
-ht4s3eri
-htsha2
-ht3s4hak
-hts3kr
+hts3eri
+htsha4
+ht3s2hak
+ht4s3kr
ht2s1o
ht2sp
-hts3par
+ht3spen
hts3tät
hts4tie
-hts5trau
-ht4s3tur
-ht4s3tür
+hts3trau
+ht2stri
+ht2s3tur
+ht2s3tür
ht2su
-htt4
htti2
+htt4r
h3tub
htu2e
h2t1urs
h3tü
+h4tüb
ht3z2
hu2b1a
hu2b1ei
@@ -8999,18 +9609,19 @@ hu4bel
hu2b1en2
hu2bi
hu2b3l
-hu4b5r
+hu2b3r
hu2bu
hu1c
-hu2fa
-hu2h3a
+hu4fa
+hu2h1a
hu2h1i
+hu2ho
h1uhr
h1uhu
hu2kä
hu2k1in
huko1
-huk3t4
+huk3t2
hu2l3a2
hu4lab
hu2lä
@@ -9018,32 +9629,29 @@ hule2
hu2l1eb
hu2l1ei
hu2lem
-hu4l3eng
-hu4lent
-hu2l1er
+hu2l3eng
+hu2lent
+hu2l1er2
hu2let
hu2lid
hu2l1in
hul3l2
hu2lo
-hu2lö
-hul3s2
+hu2l3ö
+hul3s4
hu3m2a
h1umh
h1ums
hu2n
h1una
hun3d2e
-hunde3i
hunde3s
-hun2e
+hu3n2e
2hunf
hung2
hun3ge
hung4s
-hungsa4
h1uni
-h1unm
2hunt
h1ups
2hur
@@ -9052,8 +9660,7 @@ hur2t3h
hu3sa
hu2so
hus2s3a
-hus3se
-hus4ser4
+hus2ser2
hus2s1o
hus2sp
hus2st
@@ -9063,8 +9670,8 @@ hu2t1o
hu2t3r
hut2t
hut3te
-hut4zen
-hut4z3er
+hut2zen
+hut2z3er
hut2zu
h2ü
h3über
@@ -9074,42 +9681,52 @@ hüf2
hüft1
hühne4
hüs3
-2h1v
+2hv
hvil2
-2hw2
-h2wall
+2h2w2
+h4wall
hwe1c
-h1weib
-h1weih
+h3weib
+hwei4fr
+h3weih
hweins3
-hwein6sa
-h2wirr
-1hyd4
+hwein4sa
+hwen2ka
+h3werbu
+h4werp
+hwes3t
+h4wirr
+h3woh
+1hyd
+hy2de
hy3dr
hy2lor
+4hyme
1hymn
h1yo
hy3os
1hyp
hy2pe.
+hysteri4e
2hy2t
-2h1z
+2hz
hz2a
h3z2o
hzug4
-h3z2w
+h3zw
+hz4we
+iaa2
i3ad.
iad2a
i1adn
-ia3do
+ia3e2
iaf4l
i2ago
ia1h2
i1ai
i3ak.
i3ake
-ia2kei
-ia2kr
+ia4kei
i1akt
i1al
ia2l1a2
@@ -9123,30 +9740,30 @@ i3alef
i3alei
ia3lek
i3alel
+i3alemp
i3aleng
i3alent
+i3alep
i3alerb
-i3aler4f
+i3aler2f
i3alerh
-i3a4lerm
+i3a2lerm
i3a2l1et
i3alex
i3a2lia
i3alim
i3a2lin
-i3al3l
-ial4ler
iall2i
i2alo
ia2lon
ia2lop
ia2l1o2r
ial3p
+ial3sc
ial3t2
ia2l3u4
-ial3z2
+ial3z4
i3am.
-ia3ma
iampe4
i1ams
i1an.
@@ -9156,30 +9773,31 @@ ian3alt
ia2nau
i1anc
i3and2
-i3a2n1e2b
-ian2er
+i1a2n1e2b
+ia3n2er
i1ann
i1ans
-ian2s1p
+ian2s3p
i3ant
i3anz
ianza4
ia1o
ia2op
-ia3p
-ia1q
i1ar
i3ar.
ia2ra
i2are
-iar3r
-i1as
+2i1as
i3as.
-ia3sh
+i4asc
+i4a3sh
i2asi
-ia3s2p
+i4aso
+i4a3s2p
ias3s
iast4
+i4asu
+i4asy
i3at.
i3at2h
i4athe
@@ -9188,40 +9806,43 @@ i3ats
i3au
ia3un
i2az
-2iä
-i1ä2m
-i1äp
+ia4zz
+2i1ä
+iä4mi
iär2
-i1är.
+i3är.
iär3m
-i1ärs
-iär3z
-i1ät
+i3är3z
i3ä4tem
iä2ti
iä4tr
-iät5s4
-i1äv
-4i1b
+iät3s2
+iät5sa
+2ib
ib1art
i2b1auf
i2b1aus
i2baut
ib2bli
+ibe2i
i2b1eig
+ib3einh
i2b1eis
-ibe4n1
-i6ber6geb
-i4b3er4la
+ibel4u
+iben1
+ibe4na
+i4ber4geb
+i2b3er2la
ibe1ro
i2bim
i2b1in
i2blad
+i2bläh
+ib3leis
i2bleu
i3blu
i3b2o
i2bö
-i2b3rau
ib3ric
i2b3roc
ib2ser
@@ -9235,7 +9856,7 @@ i3ca
ic1c
ice1
ich1a2
-ich6art.
+ich4art.
ich1ä
i1che
ich1ei
@@ -9245,27 +9866,28 @@ i1chi
ich1l
ich3le
ich3li
-i3ch6lo
-ich5m
+ich6lor
+ich3m
+ich5mä
ich3n
i1cho
ich3ort
i2ch3r
-ich6sele
+ich2sa
+ich4sele
ich2s1i
-ich4spe
-ich6stie
+ich2sp
+i4cht
ich2tr
i1chu
-ich1w
+ich3w
i1ci
i3cke
+icks2p
ickt2
i1cl
ic3la
ic3ra
-i3cu
-i1d
2ida
id2ab
i3d2ac
@@ -9277,30 +9899,30 @@ id1au
id2ax
idä1
id2e
-2i3de.
i2dea
1idee
+ide2en
id3eis
2idel
idel4ä
-i4demul
-4i3den.
+i2demul
ide4n1o
-iden4se
ide3ran
-iderin8nu
+iderin4f
+iderin4nu
ide1rö
-ider6reg
-2i3des
+id3er4reg
+i3des
ide5sa
ide3so
-ides2p
+ides4p
+2idf
+idge3
1i2di2o
idi4on
i4diot
2idk
idni3
-id2o
i2dol
2idoo
i2dö
@@ -9309,16 +9931,15 @@ id4rä
id4rit
id4ro
id4ru
-id2s1p
-idt4
+id2sp
1i2dy
ie3a2
ie2bä
ie2bl
-ieb3re
ie2bri
ie4b3rü
ieb4sto
+ieb4stre
ie1c
ie2cho
iech3t
@@ -9333,8 +9954,8 @@ ie2far
ie2fau
ie2fäh
iefe2m
+ie3fer
ief3f4
-ief2i
ie2f3l
ie4fonk
ief1r
@@ -9346,125 +9967,125 @@ ie2g3re
ieg4s5c
ieg4se
ieg4si
-ieg4st
+ieg4s3t
ie3her
ie2h1in
ieh3r2
i1ei
+iein3
ie1ind
i2e2l1a
-iela2r
+ie3lam
+ie4la2r
ie2läs
iel3d4
i2ele
-ie4l1e2b
+iel3ebe
iel1ec
+ie2l3eic
iel3eid
ie2lek
i4elen
-ie4lene
-ie4leng
-ieler4e
-ieler6fi
-ieler8geb
-ieler6ke
-ieler6la
-ieler8lebn
-iel4erw
-ieles2
+ie2lene
+ie2leng
+iel2erd
+ieler2e
+ieler4fi
+ieler2g
+ieler6lebn
+iel2erw
+ieles4
i2eli
ieli2d
-i1ell2
+i1e4ll2
ie2lo2b
ie2lop
-ie6lor
+ie4lor
i2els2
iel3sz
ielt2
iem2e
iemis2
i1en
-i3en.
i3ena
-ien1ag
+ien1a2g
ien4am
ie4nas
+ien3au
i3enä
-i3end
i2ene
ien1eb
-i3enec
-i3e2n1e4k
-iener6fo
-ien3er4g
-iener6la
-i3enex
+ie2n1e4k
+iener4fo
+iener4la
i3enf
i3eng4
-ienge4f
-ienge4z
+ienge2f
+ienge2z
i3enh
ie2nid
ie2nim
-ie4n3in
+ie4nin
i3enj
i3enk
-i3enla
-i3enle
i3enm
i3enn
i3e2no
i3enö
i3enp
i3enr
-ien2s
+ie4n2s
i3ens.
-i3ensa
-i3en3sc
-i3en3s2e
+ien3sc
+ien3s2e
ien3si
ien3s2k
-i3en3s2p
-iens6t5er
-ienst5rä
-i3en3sz
+ien3s2p
+ienst5ade
+ienst3er
+ienst3rä
+ien3sz
ien4t3ar
-i3enth
+i3enti
ien3tr
-i3enty
ie3nu
ie4num
i3env
i3enw
i3enz
-ie1o4
-ier3a
-ie2ra2d
+ie1o2
+ieo4b
+ieo4f
+ier3a2
+ie2rad
ie2rap
ierb4
i3erbun
ier3d
i2ere
-ie4reck
-iere5ins
-ie4r3eis
+ie2reck
+iere3ins
+ie2r3eis
+ie5rek
ie3r2er
+ier3erf
ierer3k
-ie4r3erz
ierf4
ierg4
-i1ergi
+i3ergi
i4eri
+ie2rid
+ierin3
ierk2
+ier3l
i1ern
i3ern.
-iern2a
+ier3n2a
i2erni
ie2rö
ier4re.
-ier4s3eh
+ier2s3eh
ier3sei
-iers2t
ier3sta
ier3ste
ier3te
@@ -9474,43 +10095,45 @@ ier3z2
ie2san
i2esc
i2ese
-iesen3s4
+iesen3s2
ie3s4pa
-ies2pe
ie2spu
-ies6ser6g
-ies6serl
+ies4serl
ies2st
-iest6e
-ie4stin
+iest4e
+ie2stin
ie1str
+ie1stu
ie3su
-ie4t1ag
+ie4t1a2g
ie2t1ak
ie2tan
ie2t1ap
ie2tat
ie2tau
ie4tent
-ie4t3erh
-ie4t3ert
+ie2t3erh
+ie2t3ert
i4ethe
iet3her
ie2t1ho
ie2thy
-ie4tob
-ie2t1ö4s
+ie2to
+ie2t1ö2s
ie2t3ri
ie2t3ru
iet2se
-i1ett
+i3ett
iet3zw
ieu2e
-ie1un
+i2e1un
+ieu1s
ie2w3u
i1e2x
+ie3zo
2if
-if3ange
+i3fam
+if1ang
if1ar
i2f3arm
if4at
@@ -9520,24 +10143,31 @@ i2fec
i2f1ef
ife4i
if1ein
-if2e4n
+i2felem
+ifel2s3o
+if2e4n1
+ifens2
i2f1erg
if1erh
+ife2s
if2far
if2f3l
if2fro
iff2s
iff4ste
-if3l
+if1in3s
+i2f3l
if1lac
if4lä
iflo4
if4los
-i1flü
-if3r
-i1fre
-i2freg
+i3f4lü
+i2f3r
+i3fre
+i4fre.
+i4freg
if4rev
+if4rö
if2s
if3sa
if3se
@@ -9549,117 +10179,129 @@ if2t3ef
if4t1ei
if2te2l
if2tep
-if4terk
-ifte2s
+if2terk
+ifte4s
if4t3esc
if4th
if2t1op
-if2t1r
-if4t3ri
+if2t3r
+if4tri
ift3sp
ifts2t
ift3sz
if2tur
-i1fy
-2i1g
+i3fy
+2ig
i2ganb
+i4g1ano
i2garb
ig1art
iga1s
i2g3att
igd2
-i6gebrau
-i4gefar
-ige4füg
+i4gebrau
+i2gefar
+ige2füg
3i2gel.
-ige5lau
+ige3lau
i2geln
ige4me
-ige4mis
+ige2mis
ige4na
-ige6nene
-ige4nid
+ige4nene
+igener4f
+ige2nid
ige2o
ige2pa
ige2ra
-ig5erwer
+ig3erwer
ig1erz
-iger4ze
-ige4sel
+ige2sel
+ige4spru
i2g1ess
-ige4tra
-ige4tre
-ige4woh
+ige4steu
+ige2tra
+ige2tre
+ige2woh
+ig3hu
i2gim
i2gl
ig1lau
-i3glä
+ig1län
i3gle
+i4g3led
ig3lim
ig4na
+ig5nah
i4gnä
i3g4neu
ig4no
-igo1p
-ig3rad
+igo3p
+i2g3rad
i2g3re
-ig4ren
i2grou
-ig3s2ag
+ig3s2a3g
ig4sal
ig3sä
+ig4scha
ig4schr
ig3s2o
ig3sp
ig4spa
+igs2pr
ig3stei
ig4sti
ig4s3to
ig3str
-ig6stras
+ig4stras
ig3s4tü
+ig2t3r
igung4
2i1h
+i2hans
i2har
+ih1auf
i3he
ihe1e
ih1elt
ihe4n
+ihenk4
ihe3u
ih3m
ih3n
ih3r2
ihs2
ih1um.
-ih1w
+ih3w
ii2
-ii3a4
+i1ia
i1ie
i3ig
+ii4ge
i1im
i3in
-i1i4s
-i2is.
+i1is
+ii4sc
ii3t
i1it.
-i1j
1i2js
-2i1k
-ika2ge
+2ik
ik1aka
ikaken3
i2k1akt
+i2k1alb
+i2k1alt
ik3amt
+i2k1ana
i2k1ang
-i6kantei
-ikanten8n
+i4kantei
+ikanten4n
+i2kanth
ik1art
ik3att
i2k1au
-i3kaz
ik1äh
-i2kär
-4ike
+i2k1är
i2keb
ik1ebe
ike2c
@@ -9671,19 +10313,20 @@ ike2n1
ik1en2s
ik1ent
ike2ra
-i2k1e4r2e
+i2k3e4r2e
i2k1er2f
-i5kerfam
+i3kerfam
i2k1er2h
i2ker2l
i2kero
i2ke3ru
+ike4t
i2k1eta
-4iki
i3ki.
ik1i2d
i3kie
ik1in
+i3kin.
i2kins
iki1s
i2k3l
@@ -9696,46 +10339,49 @@ i2kne
ik3nu
iko3be
i2k1off
-iko1p2
-ik1or
-iko2ri
+iko3p2
+ik1o2r
iko1s
i2köl
ik3rä
ik3re
i2kres
+ik3rin
ik4ris
i3kro
i2krö
iks2
ik3sa
+iks4t
ik3ste
ik3sz
ikt3erk
ik4t3esk
ik2t3re
+ik5tri
ikt2u
i2k1uh
i2kup
-i3kus
i2kü
i1la
i2lab
i2l1ac
i2l1ak
-il1a2ma
+il1a4ma
+il1ana
il1ang
i2l1anm
i2lano
il1ans
-ilan6zer
+il2anz
+ilan4zer
i2larb
il1asp
i2l1au
i3laub
-i3l4aufb
+i3l2aufb
i1lä1
-i2lär
+i2l1är
2ilb
ilb4l
il2c
@@ -9743,70 +10389,69 @@ il5chen
il2da
il2dä
ild3ebe
-il4d3en4t
-il3der
-ild4erp
+il2d3en4t
+ild2erp
ilde2s
-ildi2
ild1o
il2dor
-il2dr
-4ile
+il2d1r
+ild3t
+2ile
il1e2c
il1ein
il1el
-i2lemb
+i2l1emb
i2l1e2mi
+ile3ni
il1ent
-i4lentl
-i4lents
-i2l1erd
-iler4ei
-i6lereig
+i2lentl
+i2lents
+i2l1er2d
+iler2ei
il1erf
-iler4fo
+iler2fo
i2ler2g
i2l1er2h
-i4ler4kl
+i2ler2kl
il1err
-i4lerri
+i2lerri
+i2l1er2w
i3l2erz
ile4th
il1ex
ilf2
-ilfe3s
il2f3l
il2f3re
ilf4s3
il2gl
2ilh
2ili
-ili3e4n3
+ilie4n3
iliga2
-ili4g3ab
+ili2g3ab
ilik4
i2l1ind
-i4l3init
+i2l3init
il1ins
i2l1ip
-ili1pf
-il3la
+ili3pf
ill2an
-il4lenn
+il2lenn
il3l2er
+il4lt
1illu
il2mak
il2m1ap
il2m1au
ilm1ei
il2min
-il2mor
+il2m1or
2ilo
-il1ob
il2oh
+il4on
il2op
i2l1o2r
-i3lou
+i3l2ou
i3lov
il1ox
ils3ent
@@ -9817,9 +10462,8 @@ i1lu
i2lum
ilung4
i2l1ur
-i3lus
-ilü4
-2ilv4
+ilü4b
+2ilv
il2zar
il2zau
ilz3erk
@@ -9827,7 +10471,7 @@ il2zwa
imad2
ima1i
im2al
-i2m3anh
+im3anh
im1ans
i2marc
im3aren
@@ -9836,8 +10480,8 @@ i2m1art
im2as
im4at
ima2tr
-imat5sc
-ima4tur
+imat3sc
+ima2tur
im1aus
i2maut
im3b
@@ -9863,16 +10507,14 @@ i2mim
i2m1ind
i2minf
i2m1ins
-im2mä
im2mei
immen1
-imm3ent
-im6menth
+im2m3ent
1immo
im2mor
2imo
i2m1ob
-i2mo2p
+i2mop
imo3re
i2mö
1imp
@@ -9880,14 +10522,13 @@ imp2fa
im3pf2o
imp2s
im3pse
-im4set
im3sph
2imt
imt2e
im3t2i
imt3s2
imtu2
-4imu
+2imu
im2um
im1urk
2in.
@@ -9897,20 +10538,23 @@ in1a2c
i4nack
in1ad
i3nald
-inaler4
-ina6lere
+inaler2
+ina2lin
in2alp
i2n1am
in2an
in3an.
in3ana
in3ann
+i5nar.
+in2ara
i2narb
+inas4
+i4n1asb
in3att
-i2n3au2
+i2n3au
2inä
i2n1äh
-in2är
in1äs
2ind.
inda2
@@ -9920,60 +10564,78 @@ in2dan
2indä
2inde.
2inden
-ind5erke
+in2dene
+inderer4t
inder3t
inde3sp
1index
+in4dh
ind2i
1indik
in3dö
2indr
ind3se
+ind2spe
1indus
in3d2ü
2ine
in1e2c
i3nee
+ine2en
i2neff
-in4elen
+in2elen
ine2n1
ine3nä
-i4nen4zy
-i5ner.
-i4n3erbi
-in4erha
-i4ner4he
-i3nerk
-i3n3erle
-i6ner6leb
-iner4lö
-i4n3er4tr
+i2nener
+inen3s
+i4nen2zy
+ineo4
+i3ner.
+i2n3erbi
+in2erha
+i2ner2he
+in3erle
+i4ner4leb
+iner2lö
+i2nersa
+i2n3er2tr
+iner4trä
i3nes
+inesi2e
i4nesk
+ines2t
in2et
in1eu
ine3un
-in3f4
+i3né
+in3f2
1infek
1infiz
+4inflü
1info
+inf4r
+2infre
2inga
in2g1af
-in2g1ag
+in2g1a2g
in2g1al
in2gam
ing1ar
2ingä
3ingeni
in3g2er
-in4g3er4w
+in4g3er2w
inges4
+2ingi
2in2gl
-in3gla
-in3glä
-ing4s3am
-ings6por
+2ingr
+2ings
+ing4sam
+ings4por
+in4gt
+2inhaa
1inhab
+4inhaltu
2inhar
2inhau
2inhe
@@ -9983,28 +10645,27 @@ ini3de
2inie
2inig
inig2a
-ini3k4r
+ini3kr
2inis
ini3se
init2
i3nitz
3inkarn
-1inkas
-inkels6t
-in4k3ent
+inkels4t
+in2k3ent
ink4er
in2kro
in3k2ü
inma4le
2inn.
+in4nas
inne4n
-in4ner4m
2innl
in2nor
1innta
2ino
in1od
-ino3e4
+ino3e2
in3ols
in1or
ino1s
@@ -10015,23 +10676,30 @@ in1ö2d
2inr
2ins.
ins2am
-in6samt.
+in4samt.
+in3sat
insch2
2inse.
in2seb
2insed
2insen
2insk
+in3skor
+in4sl
+in4sm
in3sof
+ins2p
3instal
-in4s3tät
+in2s3tät
4inst2e
+ins2tec
in3s4tip
3instit
-ins4to
-4instra
-in4strü
+2instra
+in2st3ro
+in2strü
1insuf
+in2s3umw
ins3umz
in2sur
in3sz
@@ -10042,6 +10710,7 @@ in3tei
2intep
2int2h
inthi1
+in3ti
int2o
2intö
2in3t4r
@@ -10052,58 +10721,62 @@ int3s
i2n1u
i4nuh
in3unz
-4inverm
+2inverm
invil2
i1ny2
in3z2e
-inzel8ler
+inzel4ler
in3z2i
in3z2sc
inz2u
-in3zw
-i1ñ
2i1o
+io3a
iob2l
io1c
io2d
io3da
-io3e4
+io3e2
i2of
iof4l
i2oh
-io1i
-io3k6r
+i2ok
+io3k4r
i3ol.
+io3li
i3ols
i3om.
-io3me
i3oms
ion2
i3on.
+ional3a
ion3an
io2n3au
+i2onc
ion3d2
io4nee
+i2onf
+i4oni
i3ono
io2nor
-i3ons3
+i3o4ns3
ion4sa
-ion4sen
+i2on3t
i2ony
-i2oo
-i2o1p
+i2o1o
+i2op
i3o4pf
+iopi3
i3opt
i2or
i3or.
i3orc
ior2e
iore4n
+i3org
io1r2h
i3orp
i3ors
i3ort
-4ios
i3os.
io3sh
ios2p
@@ -10113,8 +10786,10 @@ i2o3sz
io3t
i3ot.
iote3l
+i4oth
iot4r
-i3ots
+i3o4ts
+io4tt
i2ou
i2ov
i3ox
@@ -10124,26 +10799,25 @@ i1ö2k
i1ön
i1ös.
i1öst
-i1pa
ip2an
-i1pe
i3ped
+ip4el
i3per
2ipf2
i3pfan
ipfe2
iph2
-2i1pi
+2ipi
ipi3a
ipi3el
ipi3en
ip4lu
ip2pan
ip3pe
-ipp1f
+ipp3f
ip4pl
+ip4ps
ip3pu
-i1pr
ip2sa
ip2sei
ip2sp
@@ -10151,37 +10825,41 @@ ips3t
ip4sta
ip4stü
ipt2a
+ip2ter
+ipt3ers
ipt2i
ipt2u
2ipu
-2i1q
-i1r4a
+2iq
+i1r2a
i3ra.
2i3rad
+ir4al
i3ras
-irat4
+irat2
i1rä
ir1äh
ir2b3l
ir1c
+ir2ch3i
ir2ch1o
-ir4e
+ir2e
i3ree
2irek
ire4na
+ir4er
i3ré
-irg4
-ir2he
+irg4s
ir2i
-2i5rig
+2irig
2irk
irke4n
-ir4kene
+ir2kene
ir2k3l
irk4s3c
-ir3k2u
+irk2u
irli4n
-ir2m1ag
+ir2m1a2g
ir2mak
irm1au
ir2mä
@@ -10194,19 +10872,19 @@ ir4munt
2irn
ir2n3a
ir4nat
+ir4nei
ir2no
i3ro
i1rö
irpla2
irre4l
ir2rh
-ir3sche
-ir4schl
-ir4schm
-ir4sch3r
-ir4sch3w
+ir2schl
+ir2schm
+ir2sch3r
+ir2sch3w
ir3se3
-ir3s2h
+ir3sh
ir2st
irt2s3t
2iru
@@ -10214,73 +10892,76 @@ ir1u2m
iru2s1
i3r2ü
i2sac
-isa2m3
+isa4m3
i4samp
i4s1amt
is2ap
isa2r
is3are
i3sat
-is3att
-i2sau
-is3auf
-isau2g
+is1att
+i2s3au
i2säh
i2s1än
2isb
i2sca
-i4schar
+i2schab
+i2schan
+i2schar
i3s2che
i4schef
-i4sch3e4h
+i4sch3e2h
isch3ei
-ische4m
-i6schemi
-i6scher6z
-i4schin
-i5sching
+ische2m
+i4schemi
+i4scher4z
+i2schin
+i3sching
i2sch3l
i2schm
isch3ma
-i4schna
-i4sch3re
+i2schna
+isch3ob
+isch3re
isch3ru
-i3schu
-i4schüb
-i4schwa
-i6schwir
-i4schwo
-isch3wu
-i4schwü
+i2schüb
+i2schwa
+i4schwir
+i2schwo
+i2sch3wu
+i2schwü
i2scr
2ise
ise3a
ise1e
iseh2a
-ise3hi
-is4eind
+ise3h2i
+is2eind
is4eli
-i6sel6ter
+i4sel4ter
ise2n1
-ise4na
+ise4nal
is2end
-i4senho
+i2senho
isen3s
-ise4r3ei
+is2ep
+ise2r3ei
is1erg
-i2serh
-iser4he
+i2s1erh
+iser2he
i2s1erm
+iser2u
i2s1es4s
-i3s2et
-i4s3etat
+is2et
+i2s3etat
+i3seth
i3s2eu
2isf
-4ish
+2ish
2isi
+i3si.
isi2a
i2s1i2d
-isi4de
isik2
i2sim
isin3g4
@@ -10296,27 +10977,26 @@ is1of
i3soh
1i2sol
2is4o2n1
-isonen4
-iso6nend
+iso4nend
isono2
i2sop
is1ort
3isot
i2s1ou
+is1o2v
2isp
-is1pa
+is3pan
i2spar
-is2pat
-is1pe
-is1pic
-is2por
+is3pe
+is3pic
i2spro
is3sa
is4s1ac
is4sau
-is6s5chen
-isser4f
-iss2po
+is4s3chen
+issen4s5tü
+isseri4e
+isser2s
is2st
is3sta
is3sto
@@ -10324,95 +11004,121 @@ iss3tr
is3strä
is3stu
is2sum
-is4tab
+is3tab
ist3a2c
ist2an
is3tang
+ist1ap
i1stat
is3täu
-ist4e
+is4tb
+is4tc
+is4td
+ist2e
i1stel
iste4n
-istes3
+ister4ras
i1steu
+is4tf
+is4tg
+ist2id
i1stil
istin4f
-is3t6o
+is4tk
+is4tl
+is4tm
+is4tn
+is3t4o
is4toc
is3tör
is3tr
ist4ra
+i3s4tram
+istri3en
is4tro
is4tru
+is4ts
+is4tt
i1stü
-i3suf
+is4tv
isu2m
isum3p
+isumpf4
i2sü
2isy
-i1ß
ißer2s
iß3ersc
+i2ßerse
it1ab.
it1abs
-ital1a
+ital3a
it1alt
-it1am
+it1a4m
ita3ne
it3anr
+ita2po
it1app
+itar5b
it1a2re
it1art
i3tat
it1au
i3tauc
i2taut
-4itä
+2itä
it1änd
i2t1äs
ität2
it1eff
+it1e2he
i2t1ei
-it2eic
+i4teic
2itel
ite4l1a
-i4telek
+i2telek
i2t1emi
i2temp
ite2n
iten3s2
i4tents
i2tepo
-i6tereig
-i4t3er4fo
-iterin6d
-iter6klä
+i2t3er2fo
+iterin4d
+i4ter4klä
it2erö
-i8t7ersche
+i4tersche
i4t1esk
i2t1ex
i3text
-i5thr
-i2thy
-i5tic
+2i2th
+i4th.
+i4thä
+i3thr
+i4ths
+i4thü
+i4thy
+1itia
+i3tic
i2t1id
-i5tig
1itii
-it1in1
+iti2kr
+it1in
i3tis
i4tiso
iti3sp
iti2v5a
-it5le
+itiver3f
+it3le
itmen2
-4ito
+2ito
it1ob
-i5toc
-ito3d
+i3toc
i2t1of
ito2p
+it1orc
it2os
-4itr
+2itr
+i5tra.
i2t3rad
i3tradi
it3raf
@@ -10428,68 +11134,72 @@ i2t3run
it3rut
2its
it2sa
-its1ag
+its1a2g
it2s1e
-it4se2h
-it4s3e2r1
+itse2h
+its3e2r1
it4sh
+it4sm
its1or
-it6stras
+it4stras
+its3trau
it2sur
2itt
+itt3ac
it2tan
it2teb
+it3ter
itt3hä
it2tob
it2top
it4tri
-itt3ric
-itt6schi
-itt4se4h
-itt4sei
-itt4sor
+itt4schi
+itt2se2h
+itt2sei
itt2sp
-itt4sti
+itt2sti
+itt4sz
it1uh
it1ums
it2ung
i2tuns
-ituran4
+ituran2
it1urg
itut4
i3tü
-4ity1
+i4tüb
+ity1
ityl2
-it2ze2c
-itz2er
+2itz
itz3erg
-it6zergr
-it4z3erl
+itz3erl
+itz2erw
it2zö
-it2z1w
-2i3u2
-i4u3l
-iu4m3
-iuma2
+it2z3w
+2i1u2
+i2u3l
+i3um3
+iu4ma4
+iump2
ium4se
ium4ste
-iun2
-i4up
-iu4r
-ius3t
-i1ü4
-2i1v
+i3un2
+i2up
+i3us
+i1ü
+iü4be
+2iv
i2v1ad
+i2v1a2g
i2v1ak
i2v1am
iv1an
+iv4at
i2v1ä
i2veb
i2v1ef
iv1ei
iv1elt
-ive4n
-iv1ene
i2v1ent
i2v1ep
ive3re
@@ -10508,26 +11218,28 @@ i2v1r
i2vun
i2v1ur
i2vü
-2i1w
+2iw
+iwur2
2i1x
i2xa
ix2em
i3xi
ixt2
i1y
-4i1z
+2iz
iz1a
iz2ac
i2zag
i2zan
i2zap
+iz2arr
i3z2as
+i2zat
i2zau
i2zä
i3ze
iz2ei
-izei3c
-izeits4
+izeits2
i2zele
ize2n
i4zener
@@ -10535,43 +11247,50 @@ i4zentz
i4z1erl
izid3
iz1ir
-izo2f
+izi4th
+izo4f
i2zö
i2zuna
-i2z1w
-i3z2wi
-í1l
+i2z3w
+i3z4wi
+í1
+ï1
+1j
j2a
-jab4
+jab4r
ja1c
jah4r3ei
-jahr2s
+jahr2s5
ja3l
jal2a
+ja4lt
ja3ne
-jani1
jani3t4
-ja5ru
jas2o
ja1st
jat2
-2j1d4
+2jd2
jda3
+jd4an
je2a
jean2s
je2g
-jek4ta
-jek4ter
-jek4tin
+jek2ta
+jek2ter
+jek2tin
jekt3o2
jektor4
-jek6t3r
+jek4t3r
+jek6tri
je3na
je2p
je3r
jer2e
+je4rr
+je4rs
jes3t
je2t1a
+je2t1e
je4t3h
je2tin
je4tor
@@ -10582,7 +11301,7 @@ je2t1u2
je3v
je3wo
ji2v
-2j1m
+2jm
joa3
jo2b1
job3r
@@ -10593,18 +11312,17 @@ jong2
jo2p3
jo1r2a
jor3d2
-jo1s4
+jo1s
jo2sc
-jost2
+jos4t
3jou
jou2l
-2j1t
+2jt
jty1
j2u
ju2b3l
-jugen6
+jugen4
jugend3
-ju1i
ju2k
jul2i
jung3s4
@@ -10612,11 +11330,13 @@ ju3ni
ju3r
jur4a
jur2o
+ju4rt
jus3t
-ju3t2e1
-2j1v
-1ka
-3ka.
+ju3t2e3
+jutel2
+2jv
+1k
+ka2ans
ka3ar
2k1abb
kab2bl
@@ -10627,7 +11347,8 @@ kab2bl
2kabh
2kabn
2k3a2bo
-2k1abs
+2kabr
+2k1a4bs
2k1abt
2kabw
2kabz
@@ -10635,42 +11356,41 @@ ka1c
kade2r
2k1adm
2k3a2dr
-3kadu
2kadv
-ka1f4l
-ka1fr
+ka3f4l
+ka3fr
kaf3t2
-kag2
-kaga3
-2k1age
-3kah
-ka1ho
+kag2a3
ka1in
kaken2
-ka1kl
+ka3kl
+kak6lan
2k1akt.
-2kala.
+4kala.
kala3b
ka2l1a2d
ka2lan
-kal3d
+ka4l3d
ka4l1eh
-ka4lens
+ka2lens
kal3eri
-3k2alk
+k2alk
kal2k1a
kal4kan
kal2k3l
kall2i
2k1allt
+ka2l1on
ka2lop
ka2l1os
-kal4tex
+kal2tex
kal4th
ka2lu
+ka4mat
+kamp4f3en
k2amt
kan4al
-ka4n1a2s
+ka4n1a4s
ka2nau
2kanb
kan3d2
@@ -10685,91 +11405,96 @@ kank4
2k1anor
2k1ans
k2ans.
-kan4tar
-6k5antenn
-2k1anth
+4k3antenn
ka3nu
kan2um
2kanw
2k1anzu
2kanzü
-ka2o1
-3kape
-ka3po
+ka2o3
+ka3pr
3kara
2karbe
2karc
k2ard
kar3d2a
-k1area
+3kare
+4k1area
+ka2r3ent
k2arg
ka3r2i
kari3es
k2ark
2k1arm
-kar2pf
+kar4pf
k2ars
k2ar3ta
k1arti
-4kartik
-karu2
+2kartik
+karu4
k2arw
3k2asc
-kas2e
-kase1i
+kas2e1i
kasi1
kas2o
-ka4sp
+ka4s3p
ka2s3t
2k1ast.
ka4ste
-kas6tras
+kas4tras
3kasu
ka3sz
+ka2tab
ka2tan
-3kateg
k3atel
+kate2n
ka3t2h
ka4t3r
-2katt4
+kat3se
+katt4
+ka4ue
kau4fer
-kau2f1o
-kauf6s5ag
-kauf4sp
-kaufs7tem
-kauf6sti
+kau4f1o
+kauf4s3ag
+kauf2sp
+kauf4sti
k2aus.
2k1auss
-kau2st
2kausw
kau3t2
2kauto
ka3ve
-2kaz
-1kä
+3kaz
käl3
-k1ämi
+k1ä4mi4
2k1änd
kär2
2k1ärg
kä2s1c
käse3
-4k3b4
+kä3th
+2kb2
+k3be
kbo4n
+kb4ri
kbu2s
-kby4
-2k3c
-2k3d4
+kby2
+kby4t
+2k1c
+k3ch
+2kd2
+k3da
+kd4rö
ke2ben
2k1e1c
ke2di
2k1eff
kefi2
kege2
+kegel3e
ke2gl
ke2he.
ke2hen
-kehrer4
kehr2s
kehr4s3o
2k1eic
@@ -10777,15 +11502,14 @@ kehr4s3o
kei2li
ke2im
2k1ein
-kein4du
+kein2du
kein4e
k1ei1s
2keise
keit2
-keits1
ke2l1a
ke3l2ag
-ke4l3am
+kel3am
ke2lä
kelb4
keld4
@@ -10793,12 +11517,12 @@ kel3eis
2ke2lek
ke2l1en
ke2l1er
-kel7l4e
+kel3l4e
kell2i
ke2l1o2
ke2lö
kel3sk
-kel7s8tern
+kels4tern
k4elt
kelt4e
2k1e2mi
@@ -10813,66 +11537,72 @@ ke2n1e2b
kenen1
ke4nene
ke4nens
-kener4n
+kener2n
kene4t
-4ken4gag
-k5en6gel.
+2ken2gag
+k3en4gel.
ke2nim
ken3in
-4kenlad
-4kenläd
+2kenlad
+2kenläd
kenn2a
kenn2e
ke2no
k2ensa
-4ken4sem
-ken3si
+2ken2sem
+ken3s2i
ken3s2k
-ken5s6tei
+ken3s4tei
ken3sz
k3en4te.
-ken6ten.
+k3en2ten
+ken4ten.
2kentf
-2kentg
+4kentg
ken3th
2kentl
2k1ents
2kentw
2kentz
+kenvo2
ke3ny
-k2en3z2
-2ke1o2
+k2enz2
+ke1o2
2kep
ke2pl
k2er.
ke1ra
ke2ran
+ke2ras
ke2rau
ke2r1ä
-ker4ble
+ker2ble
k2erc
2kerd
+k2ere
ke2r1e2b
ke2rec
ke3reig
ker3ein
-4kerfah
-k4erfam
+k3eremi
+2kerfah
+k2erfam
ker2fo
-k3ergeb
+k3er2geb
2kergu
-ke6rin6nu
-kerin6st
-kerin4t
+ke4rin4nu
+kerin4st
+kerin2t
k3erken
k2erko
-k3erlau
-k3er4leb
-k6erlebe
+k3er2lau
+k3er2leb
+k4erlebe
+ker3m
ker2na
ker4nei
-4k3er4neu
-kern5eur
+2k3er2neu
+kern3eur
k1ero
k2e1rod
2keros
@@ -10880,80 +11610,89 @@ ker4reg
k2ers.
2kersa
kert2
-ker6werb
+ker4werb
kerz2
k1erz.
-ker4zeu
+ker2zeu
2k1er2zi
k2es.
ke2sa
k2esc
k1ese
ke2sel
+kes3pa
kes2sa
-ke4t1a
+ke2t1a
ket2ag
kete4
-ke4t1eb
-ke4tel
+ke2t1eb
+ke2tel
2k1e2th
ket3ha
-ke2tu
-keu6schl
+ket3s
+2ke2tu
+keu4schl
2k1e2va
2k1e2x
-4k3f4
-2k3g2
+2kf2
+kflei2
+kf4lö
+k3fu
+2kg2
kga2s1
kge3s
-2k1h4
+k3go
+2k1h2
k3he
-kho3m
k3hu
ki1a
ki2ad
ki2ag
-ki3ak
+ki3a4k
ki3a2r
ki1c
+4kicl
ki3d4r
k2ids
2kidy
ki2el
-kie4lei
+kie2lei
kiel3o
2kiern
kier2s
-kier4st
kie4z
-ki1f4l
-ki1f4r
-ki3k4
+2kif
+ki3f4l
+ki3f4r
+ki3k
+kik4l
2ki3l2a
2kilä
+4kile
+4kili
2kim
-3kin.
ki2nä
-4kindex
+2kindex
2k1indi
2k1indu
2k1inf
k2ing
kin2ga
+kin4g3ent
king3s
2kinh
k2ini3
kinik2
-k2inn
ki3n4o3
kinos2
+kinot4
kin3s
2k1inse
k1inst
2k1int
ki3or
kio4s
-3kir
+3kirc
2k1i2so
kis2p
kis3s
@@ -10962,13 +11701,17 @@ kis4to
kiv2
kive4
2kiz
-2k3j
-2k1k4
+2kj
+k3jo
+2kk2
+k3ka
kkab4
-kl4
-4kl.
+kk4ne
+kl2
+2kl.
4kla.
2k1lac
+k3lamp
klan2
2kland
klan3du
@@ -10983,9 +11726,11 @@ k2le
kle2br
k3leg
2kleh
+kl4ei
klei2e
k3leit
k3lem.
+3klemp
kle2o
2k3ler
kle2ra
@@ -10999,6 +11744,7 @@ k2lif
k2lin
k3lin.
3k4lina
+2k3lind
k4link
k2lip
k2lir
@@ -11010,13 +11756,13 @@ klit2s
2klok
3k4lop
k3lor
-klost6
+klost4
2klöc
2klöf
k2löst
k4löt
k1lu
-klu4b
+k4lub
k2lud
k2lug
k2lum
@@ -11024,8 +11770,7 @@ klung4
2klux
2k1lüc
2kly
-2k1m
-4kma
+2km
kma2la
k2n2
k4nac
@@ -11033,32 +11778,37 @@ k4nac
2k3nad
2knah
2k3nam
+2k3nar
+kn4at
+2knav
2k3näp
k3ne
k4nec
kne1e
2knes
+kne3tu
2knetz
-2k5neu
4kney
+kni2e
2k3niv
kno2b3l
k4nol
2knorm
2knov
2k3num
-1ko
-ko5ad
+ko3a
ko2al
kobal2
2kobj
kob4s
+koe2
kof3f2
koffe3i
kohl2e
kohle3i
koh3lu
koka3
+ko2kl
ko3l2a
ko3le
kol2k3
@@ -11070,28 +11820,35 @@ k2on
kone2
ko2nem
kon3s4
-kont6e
+kont6en
ko2nu
ko3on
2kop.
-ko1pe
+ko2pal
+ko3pat
+ko3pe
2koper
+ko4pf
kopfa2
-kop4fen
-kop6f5err
+kop2fen
+kop4f3err
+3kopp
kop3s
-ko3pte
ko3r2a
kor2ba
kor2bl
kor2br
2k1orc
-korder4
-kor6derg
-ko2rel
+korder2
+kor4derg
+ko3re
+ko4rel
2k1org
+ko3rin
kor2k1a
+kor4kr
kor3m
+k1orna
kor4nac
kor2n3ä
kor4no2
@@ -11101,23 +11858,27 @@ k4os.
ko4sk
ko2sp
3k4ost
+ko3stei
ko2stü
ko4ter
-ko3ti
+ko3t2i
+koti4n
+koti6ne
kot4r
kot3s2
-kot4tak
+kot2tak
k1ou
ko3un
3kow
ko2we
2k1ox
-1kö
köde2
k2öf
k1öl
-2k1p2
-2k3q
+2kp2
+k3pf
+2kq
+k3qu
k2r2
2k3rad
2k3rah
@@ -11128,13 +11889,15 @@ k4raw
k4raz
k4räc
2kräd
+k4räf
+k4räm
k4rän
2k3räum
-2k5re.
+2kre.
2k3reak
2k3real
k4reb
-2k3rec
+4k3rec
2kred.
2k3rede
2kredn
@@ -11146,10 +11909,11 @@ kre1i2e4
kreier4
k3reif
2k3reih
-2kreim
-krei6sei
-krei4st
-kreli1
+2k3reim
+krei4sei
+krei2s3i
+krei2st
+2krel
k3ren
2kresu
2k3rh
@@ -11158,27 +11922,30 @@ k3ren
2k3ries
2krip
k3risi
-krob4
+k4roa
+kro3a4d
+kro3b4
k4roch
4k3roh
k4rok
k4ron
k4rop
2krot
-3kroth
+krot4r
k3rou
2kröh
2kruf
2k3run
-4k1s
+2k1s
ks3a2b
-ksa2k
+ksa4k
k4s1amt
k2san
ks3a2r
ksa2s
k2sau
-ksau2f
+ksau4e
+ksau4f
k2sav
k2säh
k3s2c
@@ -11189,7 +11956,7 @@ k3s2ed
ks1ei
ks2eid
ks2eif
-k4seind
+k2seind
kse2le
k2s1eng
k2s1ent
@@ -11201,7 +11968,7 @@ k2serk
k2serl
k2sers
k2serw
-k2s1e2v
+k2s1ev
k2sex
ks3ha
k4s1i2d
@@ -11209,43 +11976,46 @@ ks2im
k2s1in
k2s1is
k3s2ke
+ks3ket
ks3kl
-ks1o
+ks1o2
+kso4f
ks4on
k2sop
-k2so2r
+k2sor
k2sö
-ks1pa
k2spal
k3s2pat
k2spä
k3spe
-ks2pel
-ks2pen
+ks4pel
k2sph
ks2por
ks2pul
-ks3s4
+ks3s2
+kss4t
kst2
-k2stal
-k4s3tanz
-k3stat4
+k4st.
+kst4a
+k2s3tal
+k2s3tanz
+kstat4
k3stäl
+k3stei
+k4steil
ks4tel
ks2tep
-k4stier
+k2stier
k2stit
-ks4tol
k2stor
-k4strop
+k2strop
k2stuc
k2stum
k2stur
k2stüt
k2s1u
-k3sul
ks2zen
-4k1t
+2kt
kt1abr
kt1abs
k2t1ad
@@ -11264,21 +12034,24 @@ kt1ein
k2tek
k4t1ela
kte4n1
-kten3s2
+kten3s4
k2tent
k4tentf
k4tents
kten3z
+kte4pi
kte2ra
kte3ran
kt4ere
-k4t3erfo
kt1erg
k2t1erh
+kter3m
k2terö
kte3ru
+k4t1eti
k2tex
k2t1h
+k3ther
k2t1i2d
kti2me
kt3ind
@@ -11288,10 +12061,11 @@ kt3inn
k2tint
kti2s1e
k2tiso
-kti4ter
+kti2ter
kto3b
k2t1of
-kto5ren.
+kto3ren.
+k2t3ram
k3t4ran
kt3ras
k2t3rau
@@ -11301,23 +12075,25 @@ kt3run
kt3rü
kt3s4a
kt3sä
-kt3se
kts2el
ktsen1
kt3si
kts1o
kt2sor
+kts2p
+kts4t
kt3s2z
ktt2
k3tub
kt1ums
k2tuns
k3tü
-kt3z2
+k4tüb
+kt3z
+ktz4w
ku2al
ku1c
kud4r
-3kug
ku2h
2k1uhr
ku3la
@@ -11327,19 +12103,22 @@ ku3l2i
kul4to
kul2tr
k2um.
+2k1umb
k2um4e
2kumg
2kuml
kum2sa
-kum2sp
+kum2s3p
k2u3n2a
kun3da
kund2e
kunden3
+kunft4s
kung4
+2kunm
kun4s4
kunst3
-2kunt
+4kunt
2kunw
4k1up.
kur2bl
@@ -11347,31 +12126,35 @@ ku2rei
kuri2e
kuri4er
2k1urk
+2k1url
ku2ro
-kurs1c
-kur2sp
+kurs3c
+kur2s3p
kur2st
+kur3sti
2k1urt4
kur3tsc
+3kus
kus3a2r
-ku4schl
+ku2schl
ku2sp
-2ku2s3t2
+ku2s3t2
ku2su
-2kut.
+4kut.
kut2a
kuto3
-1kü
kü1c
3küne
3kür
kür4s
-2k3v
-2k1w
-k3wa
-2k3z2
+2kv
+k3ve
+2kw
+2kz2
kze3l
+k3zu
3la.
+laa2
la3ar
l1ab
3l2ab.
@@ -11382,7 +12165,7 @@ l2abä
lab2br
2labd
lab2e
-4la2ben
+2la2ben
4labf
2labg
2labh
@@ -11395,14 +12178,14 @@ l3a2bit
la3b4ra
lab4res
la2bri
-2labs
+2la4bs
la2bus
2labw
2labz
la1ce
la2ce.
-l4a3che
-lachter8f
+l4ache
+lachter4f
lacks2
1lad
2l1ad2a
@@ -11414,110 +12197,125 @@ la3d2i
2ladm
2l1a2dr
3l2adu
-2laf
-la2fa
-la2f1ei
-la2f1er
+2ladv
+4laf.
+la4f1ei
+la4f1er
laf1r
-laf3s
+4laf3s
laf3t4
-la2fu
+la4fu
la2g1a
lag3d
+lagen3d
l2ager
-lagerin5
+lagerin3
4lagg
+la2gil
+la2gin
la2gio
lag3l
la4g3n
-lago4
-la2gob
+la2go4
lag3str
2la3ho
3lai
+2l1akad
lake2
-la2kin
+la4kes
+la4kin
l2akk
-la1k4l
-la2kro
-lak3t2
+la3k4l
+la4kro
+lakt2
2l1al
la2la
-3lala.
+3la5la.
3lali
+4lalo
4lalt
lami3t
+l4amm
lam2m1a
1lammf
-la2mor
+la4mor
l2amp
2l1amt
-lamt4s
+lamt2s
la4mun
la2na
la3nan
-la4n4at
+4l1a4n4at
la4nau
2la2nä
3l2and
l4and.
-lan2da
+lan2d1a
lan4dam
land3au
l4ande
-lan6derh
-lan6d5erw
-lan6d5erz
-lan6d5inn
+lan4derh
+lan4d3erw
+lan4d3erz
+lan4d3inn
l4an2dr
lan3dri
land3rü
lan3erd
-laner4f
+laner2f
2lanf
-lan4gan
-lan6g5esc
+2langa
+lan2gan
+2l3angel
+lan4g3esc
lang3s4
-2lanha
l2anhe
3lan2i
+4lanim
4lanl
2l1ann
l1ano
la2nof
2l1anp
-2lans2
+2lans
l1ansi
+3lansw
2lantr
2lantw
2lanw
-lan2z1w
+lan4zerg
+lan2z3w
3lao
2l1apf
la2ph
2l1a2po
lap2pl
+la2q
la2r1an
2larc
lar1e2b
la2r1ei
la2rel
-la4rene
+la2rene
larf4
-lar3g
+3lar3g
lar3ini
-4l1a2rom
+lark4l
+2larm
+2l1a2rom
l1art
2lart.
+lar2ter
lart2h
l3arti
lart4r
3laru
l2as.
la2sa
+la4s3aa
la4sam
la4sä
-lasche4
+lasche2
4lasd
la3seb
la2sei
@@ -11530,13 +12328,14 @@ la2so
3lasser
l2a2st
las4t3an
+last3ar
la4ste
-last3ri
+las6t3ri
la4stu
la3t2e
2l3a4tel
-la5t2i
-2l3atl
+l4at2i
+la5tio
2latm
lat2o
la2tö
@@ -11546,29 +12345,31 @@ lat2s
lat3st
2lat2ta
lat4tan
-lat4tex
-lat4t3in
+lat2tex
+lat2t3in
lat2t3r
-latzer4
+latzer2
1laub.
-lauben6s5
+lauben4s3
lau2b3r
-laub4se
+laub2se
+lau4fel
+lau4ferl
lau4fin
2laufn
-lau2fo
-lau4fri
+lau4fo
1laug
lau3gl
+lau3i
2laun.
la4us
3l2aus.
2l1ausb
-lau6scha
+lau4scha
2lausd
2l1ausf
2lausg
-2lausl
+2l1ausl
2lausr
2l1auss
lau2st
@@ -11581,20 +12382,21 @@ lave4n
1law
lawa4
1l2ax
-la4xel
+la2xel
l2ay
-lay1s
lä1c
3läd
-4läf
+1lähm
2l1ähn
+lä2i
2lämt
1länd
2l1äpf
2läq
+l2är.
lär2ma
l1ärme
-2lärz
+2l1ärz
lä2s1c
2lät
2läub
@@ -11604,21 +12406,21 @@ lä2s1c
2läug
2läx
1là
-2l1b
+2lb
l3bac
l2bant
lb3a2ri
-lbau1c
lb1ärm
-lbb4
+lbb2
+lbb4r
lbby4
lb2ei
-l4b3eink
-l4b3eise
-lbe4ral
-lberin5
-lbe7s
-l4b1e4ta
+lbei4ge.
+l2b3eink
+l2b3eise
+lbe2ral
+lber2ei
+l2b1e4ta
l2b1id
l2b1ins
lb4lad
@@ -11636,6 +12438,7 @@ lb2s
lb3sa
lb3se
lb3si
+lb3sla
lb3sp
lbs4t
lbst3ac
@@ -11658,11 +12461,11 @@ lch3n
lch3r
lch3s2
lch3ü
-lch1w
+lch3w
l2ck
l3cl
l3co
-4l1d
+2ld
ld3a2b1
ld2ac
ld3a2ck
@@ -11672,6 +12475,7 @@ l2d1ah
lda2i
l2d1ak
l2d1al
+ld1ams
l2d3a4n
ld1arm
ld1ass
@@ -11682,26 +12486,25 @@ ld1är
ld1äs
ld1ät
l3de.
-lde4ben
+lde2ben
l2dei
-ldein7
+ldein5
l2d1elf
l2d1e2mi
l2d1ems
-lde4na
-lden5erg
-l4dentl
+lden3erg
+l2dentl
l3der.
-l4d3er4fa
-l6der6geb
+l4d3er2fa
+l4der4geb
ld1erh
-l4der4he
-l3d2erl
-l6d5erlas
-l3d2ern
+l2der2he
+ld2erl
+ld3erlas
+ld2ern
l2d1er2p
lder4tr
-lde3sa
+lde5sa
l2d1es2s
l2dex
l2d1id
@@ -11713,33 +12516,34 @@ l2dop
ldo2r
l2d1ori
ld2os
-ldos5t
-ld2ö2
+ldos3t
+ld2ö
ld3r
ld4ram
-l2dran
+ld1ran
+ld1rä
l2dre
l3d4ris
+ld1rol
ld4ru
+ld5rub
+ld5rut
l2drüc
ld3sa
-lds4an
ld3ska
+lds2p
ld3st
-ldt4
-ld3th
-ldt5s
+ldt4r
ld3tu
l2d1ul
l2d1um
ldwes4
-ldy2
1le
le2ad
+le2an.
le3ar
-le2as
3leba
-leben4s3
+leben2s3
le2bl
3lebr
le2b3re
@@ -11747,8 +12551,10 @@ lebs2
2lec
lech1a
le2chi
-lech7t6e
+lech5t4e
+le2dit
le2dr
+le1en
le2er
lee4ret
le3f2a
@@ -11757,65 +12563,63 @@ lef4o
le2g1ab
leg1as
le2gä
+legi3en
le2gl
leg4r
-legs4
3leh
4lehe.
leh3r2e
4lehs
4leht
-lei4ble
l2eid
lei3ere
-lei4fan
-lei4fei
-leifer6g
+lei2fan
+lei2fei
+lei2fi
leif3s
2l1eig
lei3gl
3leih
-lei4hau
+lei2hau
lei3l2
leim3p
3l2ein.
-l2eind
-lein4du
+lein2du
l4eine
-lei6nerb
+lei4nerb
le2inf
le2ini
2leink
-4l3einsa
+2l3einsa
2leint
l2einu
le2is
-leisch5a
-lei8schei
-lei6scho
-lei6sern
+leisch3a
+lei4schei
+lei4scho
+lei4schr
+lei4sern
l1eisf
-leis6s5er
+leis4s3er
l4eist
-lei4str
-lei4ßer
+lei2ßer
l2eit
lei2ta
+leit5ersc
lei4to
lei5tri
leit3s2
leits4t
+2leiw
3leko
2lektr
2lekz
3l2ela
le2le
-le3lei
2lelek
-4leleme
+2leleme
le3len
leler2
-leler4s
le3les
2lelf.
2l1elfe
@@ -11824,52 +12628,65 @@ l2em.
le3mal
le2mau
le2m1ei
+lem4en
3lemes
3lemet
+le2mid
lem1o2
le2mor
-2lemp
+4lemp
lem3s
le2mu
le4mun
l4en.
-len1a
+len1a2
len3ab
-le4na2d
+le4nad
le4n3an
le4n3a4t
le2nä
-4lendet
+2lendet
+4lendl
l1endp
4lendun
le2n1ed
+lenen3er
4lenerg
-le4neur
-4leneuv
-len4gag
-len4kau
-len4k3lo
-len4klu
+le2neur
+2leneuv
+len2gag
+len2kau
+len2k3lo
+len2klu
l1enni
-len6sein
-4len4sem
+le2no
+len4sein
+2len2sem
len3ska
len3sz
+3lenta
2lentg
2l1entk
-4lentla
+2lentla
2lentn
-4l3en4tro
-4l3entw
+l3entro
+2lentrü
+2lentw
lent4wä
-5lentwet
+3lentwet
2lentz
+le4nz
+lenz2a
+len4z3eig
2lenzy
-leo2f
+leo4f
le1o2s
2lep
+l1epe
+le2pen
3lepf
4l1e2pi
+le4pil
4lepoc
3lepr
l2er.
@@ -11881,60 +12698,65 @@ le2rau
le2r1ä
le2r1e2b
ler2e3c
-l3ereig
-le4r3ei4m
-le4r3eis
+2lereig
+le2r3ei2m
+le2r3eis
le2rel
-le4reng
-le4rerg
-le4rers
+le2reng
+l2erer
+le2rerg
+le2rers
le2re4t
-4l3erfas
+2l3erfas
2l1erfo
l2erfr
-l2erfü
+l2erfüh
l1erg
l2erga
-l4ergef
+2lergeb
+l2ergef
3lergeh
-6lergen.
-l4erger
-l4erges
-3l4ergew
+4lergen.
+l2erger
+l2erges
+3l2ergew
2lergi
l2ergl
l2ergr
-4ler4heb
-4lerhol
-lerin4s
+2ler2heb
+2lerhol
+leri2e
+lerin2s
lerk2
-l2erka
-2lerke
+3l2erka
l1erkl
-4lerklä
-l4erkle
-l2erko
+l2erkle
+3l2erko
ler3kr
-ler3l
-5l6erlebe
-3l4erlei
+3l2erkre
+3l4erlebe
+3l2erlei
2lermä
-ler4nal
-ler4nar
-3l4erne
+2l3ermüd
+ler2nal
+ler2nar
+l4erne
ler4nei
2l1erö
3l2erra
-ler4ric
+ler2ric
+l2errü
l4ers.
l1ersa
-lers2t
-ler4sto
-lert2
+2lersat
+lers4k
+3l4ersl
+ler2sto
+lert4
ler4trä
le2rup
l4erwa
-ler4wer
+ler2wer
2ler2wo
2l1erz
ler2zä
@@ -11948,13 +12770,13 @@ lese1i
le3s4h
lesi1
le3s2k
-les4ki
le3so
le2spo
-lest6
+le4ss
+lest4
le1sta
-les2te3
-lester6i
+leste3
+lester4i
le1sto
le1str
3lesu
@@ -11967,24 +12789,27 @@ l1e2th
le3tha
2lethi
let2i
-letsche6
-let4top
+letsche4
+let2top
lett1r
letts2
le2u
4leue
-3le3u2f
+3le3u4f
+le4uk
2l1eul
le3unt
+le4ur
2leuro
-3leut
+3l2eut
l1e2vol
2lex
3lexd
3lexik
le2xis
1lé
-2l1f
+2lf
+l3fac
l3fah
lf4at
l2f1ec
@@ -11992,11 +12817,11 @@ lfe1e
lf3einh
l2feis
lf2en
-l4ferei
-lfe4rel
+l2ferei
+lfe2rel
lf1erl
-l3fi
-l3f4lä
+l3fjo
+lf4lä
lf3led
lf4lö
l3f4lu
@@ -12009,25 +12834,28 @@ lf2sti
lf2su
lfun2
lfur1
-2l1g
+2lg
+lgab4
l3gas
lga3t
-lgen2a
lgene2
lgeräu3
l2geti
-l3g2i
+lg2i
+l3gle
lg2lö
l3go
-lg4p
-l3gra
+lg2p
+l3g4ra
lg3re
l3gro
+lgs3t
lgung4
-2l3h2
-4lhe
+2l1h2
+l3he
3lhi.
-4lhu
+l3ho
+l3hu
1li
li1a
lia2b
@@ -12035,10 +12863,12 @@ li2ad
li4am.
lian2g
li2ast
-3lib4
+3lib
libi1
+lib4r
li1c
-lich4ta
+lich2ta
+licht5ersc
lich4to
4lick
li2cka
@@ -12046,35 +12876,38 @@ li2cl
li3d2a
l1ido
l2idy
-3lie.
liebe4s3
lie2br
-li1efa
3liefer
-li1efk
li3efl
lie4n1a2
li3ene
-lien3s
+li3en3s
lien3t
-lie4rei
-lier4sp
+li2er
+lie2rei
+li3ern
lie2s1c
+lif3ti
3lig
liga3s
-li4g3ers
-li4gl
+li2g3ers
+lig1l
lig4n
li3ker
+lik2i
lik2o
likop4
lik2sp
-lik4ter
+lik2ter
+lik4th
lik2ti
lik4t1o2
lik2u
li3l
lil2a
+li5lie
+li4ll
li3m2a1
limas4
lima3t4
@@ -12082,29 +12915,34 @@ lima3t4
3limo
2limp
lin2a
+lin3all
li3nar
-2lindi
+4lindi
2l1indu
li2nef
li2neh
li2nep
li2nes
2l1inf
+ling3l
+lings3
+lingst4
2l1inh
li5nie
-lin1it
2l1inj
-lin4kan
-lin4kar
-link2s
+lin2kan
+lin2kar
+link2s3
+lino2
li2nol
l2insa
-4linsel
+2linsel
2linsp
2linst
2linsu
2linsz
2l1int
+l2intu
li3n2u
2l1inv
2linz
@@ -12116,39 +12954,41 @@ li3o2st
3lis.
li3s2a
li3schm
-li4schu
+li2schu
lis2h
li3shi
3lisk
2l1isl
2l1i2so
-li2sp
+li2s2p
liss4
-3list
-lit4a
+3li2st
+li2t1a2d
l1i2tal
+lit4an
li3t2ä
l2i3t2e
3liter
+li3th
li4t3r
lit1s2
lit3se
lit3sz
li3tu
-li6tun
li4tur
litz4er
3liu
-liv2e
li2vea
+live4n
li2ves
livi3e
li3vr
-2lixi
+4lixi
li4z3ä
lizei3
-2l3j
-2l1k
+2lj
+l3ja
+2lk
l3kale
lk1alp
l3k2an
@@ -12161,48 +13001,55 @@ lk3lad
l3k4las
lk3lic
l3k4lu
-lk2men
lk4ne
lk5ner
-lko2f
+lko4f
lk1ofe
lkor2b1
lk3roc
lk2s1
lk3sän
+lk4sb
lk3si
+lk4sm
lk4spe
lks3t
lkt2
lk2ü
-4l1l
+2l1l
l2labk
l2labt
l3labu
+lla2der
l3lage
lla3gl
l2l1am
-lla2ma
+lla4ma
l3lame
ll2ami
ll2anb
-lla4ner
-l4lani
+lla2ner
+lla4ni
l3lans.
-ll4anwa
ll1anz
-l4l3appl
+l2l3appl
ll1arm
+ll1a4sc
l4latm
-ll3att
+ll1att
+l3laub
ll3aufg
+llau4m
ll1aus
+ll3axt
ll1äm
-l2lär
-llb4
+ll1är
+llb2
+llb4l
llch4
-ll3d4
-ll5ebene
+ll3d
+lld4r
+ll3ebene
l3lec
ll1ech
lle3er
@@ -12210,56 +13057,61 @@ l2l1ef
ll1eic
ll1eim
ll2eis
-l4leise
+l2leise
lle2la
lle2m
l2l1emi
l3len.
lle4na
+ll3endl
llen3dr
-ll5en6dun
+ll3en4dun
+lle4nens
l4lentf
-l4lents
+l2lents
l3lep
l3ler.
lle2ra
-ll2ere
-l6ler6eig
-ller4fo
-ller6geb
-l8lergene
-l4lergo
+ller4eig
+l4lerfas
+ller2fo
+ller4geb
+l4lergene
+l2lergo
ll3erho
-l4l3ermi
-l4l3ernt
+ll3erkr
+ll3ermi
+ller4müd
+l2l3ernt
ll3ertr
ll2es
lle4th
ll1exe
-llg4
-lli4gan
+llg2
+lli2gan
l2limb
l2l1ind
l4linf
+l4l1ink
ll1ins
-ll3k4
+ll3k
ll3l2
-ll5m2
+ll3m2
+ll5mit
ll3n2
ll1ob
l2lobe
-l2l1o2f
+l2l1o4f
ll3ol
l2lope
ll1opf
ll1or
-l6lorb
+l4lorb
llor2g
l2lo2ri
l2l1ou
l3low
ll1ox
-ll2säu
ll2s1es
ll3ska
ll2spr
@@ -12267,29 +13119,32 @@ ll3t
llt2e
llt2i
llti2m
-ll5t4r
-llts2
+llt4r
+ll5tri
+ll4ts2
ll1ur
-llus5t6
+llus5t4
l3ly
ll3z2
-2l1m
+llz4w
+2lm
+l3ma.
l2m3a2b
l2m1ad
lm1a2ge
lm1aka
-l2m1a2m
+l2m1a4m
l3mana
lm1apf
lm1art
-lm3att
+lm1att
lm1äst
lmbu2
lm1c
lmd2
-lm3e4dit
+lm3e2dit
l2m1ef
-l2ment
+l2m1ent
l2m1e2p
lmer2
l2m1erf
@@ -12307,7 +13162,8 @@ lm3s2k
lms2t
lm3ste
lm3s2z
-lm3t4
+lm3t
+lmt4r
l2mum
l4munt
2ln
@@ -12322,7 +13178,6 @@ lnus2
l1nü
l1ny
1lo
-lo4ak
3lob.
l2oba
3lobb
@@ -12331,36 +13186,41 @@ lobe2s
l1o2bl
l2obr
lob4ri
-lo4chel
+lo2chel
+lodi4e
l1ofe
-lo2fen
+lo3fj
lo4gh
lo2gl
lo2gor
lo2gre
-lo3ha
+lo2ha
loh2e
+loh2ner
4l1ohr
+loi4d
loi4r
3lok
-4l3okk
+4l1okk
lo2k3r
-5loks
+l4olä
l4ole
2l3o2ly
lomä3
-lo2min
+lo4mel
+lo4min
lo2ner
lo4nin
lo2n1o
-lo2o
+lo2o3
2lopf
lop2p1a
2lopt
+lo2rak
lor3am
lor2an
lo4rä
-5lorb
+3lorb
2l1orc
2l1ord
lo3r2en
@@ -12371,15 +13231,19 @@ l2os.
lo4sa
3lose
lo4ske
+los3p
lo2spe
lo2spr
-los3t
+los3sa
lo4ste
-lo2st4r
-4loß
+lo2s3t4r
+2loß
lo2ta
+lo2th
lo3tha
loti4o
+lo5tos
+lots2e
2l1ov
lo2ve
2lox
@@ -12387,38 +13251,45 @@ lo2ve
lö2b3
2löck
2löd
-lö2f
-2l3öfe
+2l3ö4fe
2l1öhr
2lök
2l1öl3
2löp
3lösc
3lösu
-4löß
-4löz
-2l1p
+lö4ta
+2lp
lp2ar
lpar2k1
-l4p1är
-lp2f
-lph4
+l2p1är
+l3p2f
+lp4fu
l3phä
l2phir
lp1ho
l3phr
-lpt4
+lph4t
+lpi4p
+lp4lu
+lp4rä
+lpt4r
l3pu
-2l1q
-2l3r2
+l3pü
+2lq
+2l1r2
lrau2s
+l3re
lrebs2
lro2h
lrö2
-4l1s
+l3ru
+l3rü
+2l1s
ls3a2b
+lsa2ck
+ls3acke
l2s1a2d
-ls2al
l4s1amb
l4samp
ls2amt
@@ -12427,27 +13298,33 @@ ls3ane
l3sare
ls3a2ri
l3sark
-lsau2
+l4s3au.
lsau4m
-lsau4r
+lsau4rer
+ls3aus
+l2saut
l3s2äm
ls2äug
-ls1äus
+l2s1äus
+lsby4
ls2c
-l4schin
-l4schmü
-lschs2
+l2schin
+lschs4
l2s1e2b
+l3seil
ls2ele
ls1eli
+ls1emb
l2sent
ls1er
+ls2erb
l2serf
l2serg
l2serh
l2serk
l2serl
l2sers
+lser2u
l2serw
lse2t
ls1eta
@@ -12456,31 +13333,32 @@ ls3ha
l2s1id
l2simp
ls2kal
-l3s4kele
+l3s2kele
ls2ky
lso4b
l2sop
-l4s3ort.
+l2s3ort.
l3s2öl
-l2spac
-ls2pe
+ls2pa
+l2s3pac
l2s3ph
-l2s1pir
-l3s2pit
+l2s3pir
+l3spit
+l2spiz
ls2po
-l3spri
ls2pu
-l3spul
-ls3s4
+l3s4pul
+ls3s2
+lss4t
+l4st.
lst2a
-lstab6
+lstab4
ls3tabl
-ls4taf
lstahl3
l2stas
-l4stat.
-l4state
-l4s3täti
+l2stat.
+l2state
+l2s3täti
l2ste
l3stea
l3stec
@@ -12490,26 +13368,30 @@ l4steil
l3stel
l3stemp
l4sten
-ls4t3erk
-l5s6terne
-l5s6terns
+l6ster.
+ls2t3erk
+ls4terne
+ls4terns
ls2tie
+ls4tip
l2stit
-l4stoch
+l2stoch
ls4toi
-ls4tol
+lstro4
ls4tru
l2s3trü
ls2tu
ls4tüm
-l3suf
ls1um
l2s1un
ls2und
ls3unk
-4l1t
+l4szu
+2lt
l2tab
+l3tabl
lt1abs
+lt2a3d
ltag4
lt1am
l4tame
@@ -12518,16 +13400,13 @@ l3tan.
ltan3d
l2t1ap
lt1ara
-ltar8beitn
l3tark
lt1art
-ltar6tik
-l3tartu
+l3tarta
+ltar4tik
lt1au
-l4tauf
lt3aut
lt1äh
-ltbau1
lte2c
lt1eh
l3tehu
@@ -12535,28 +13414,29 @@ lt1eig
lt1ein
lte3mi
lt2en
-lten6gel
-lten4sp
+lten4gel
+lten2sp
lt3ents
-lte4ral
-lter4fa
+lte2ral
+l2t3er2fa
l3t2erg
-l4terhe
-lter6ken
-lter4ku
-lter4nä
+l2terhe
+lter2ku
+lter2nä
lte2ro
lt2erö
-lter4se
+lter2se
l4t1es3k
lt2est
lte3str
lt2et
+lt3g
l2t1h
lt3hag
l3thas
l4t3hei
lthol2
+l3thr
l3t2hu
lt1ide
ltimo4
@@ -12564,7 +13444,7 @@ l3tine
l2tiso
l3t2i3t
l2t1ob
-l2t1o2f
+l2t1o4f
l4tord
l4torg
l4t1o2ri
@@ -12572,40 +13452,41 @@ lto2w
lt1öl
lt1ös
l4t1öt
-ltra3l
+ltra3l2
lt3räu
lt3rec
lt3rei
lt3ris
lt3rol
l2t3rö
+lt3rum
l2t3rus
-l4ts
lt2se2l
-lt4s3ort
-lt2s1pe
+lt2s3ort
lt3s2ph
lt2sti
+lt2stüt
lt3t
l3tub
lt1uh
l2t1um
-lturan4
-lturen4
+lturan2
+lturen2
+ltu4r3ent
ltu2ri
l3tü
lu1an
-4lu2b3
+2lu2b3
luba2
lubs2
lu2dr
lu2ec
lu2es
lu2et
-1lu2f2
-2l1ufe
+1luf2
+2l1u4fe
+lu5fel
2luff
-lu3fo
luft1a
luft3e
luf4tei
@@ -12618,13 +13499,14 @@ lu2gi
lug3l
lu2go
lu2g3r
+lug3se
lug3sp
lu2gu
2l1uh
-lu1id.
+lu1id
+lui2de
lu4ig
lu1is.
-lul2ö
2lumd
lume4
2lumf
@@ -12650,10 +13532,11 @@ lung4sc
2l1uns
2lunt
2lunw
-4luo
+lu4pf
l2ura
lu2r1an
lu2rat
+3lurc
lu2rei
2lurg
l2uri
@@ -12662,59 +13545,64 @@ l1urn
lu2ro
2lurs
l1urt
-lu4ru
lu3sak
2luse
lu3si
lu2sp
lus4s3a
lus2s1c
-lus4sel
-lus4s3er4
+lus2sel
+lus2s3er4
lus2s1o
-lus4s1p
+lus4s3p
lus2s3t
lus4stä
luss5tr
1lu2st
-lus6terl
+lus4terl
lus4t1o2
lust3re
-lu2s1u
+lu4s1u
lu2t1a4
lu4tas
lu4t3au
lu2tä
lu2t1e4g
-lu2tel
+lu2t1el
luter2
-lu4t3erg
-luter4s
-lu6t5ersa
+lu2t3er4b
+lu2t3erg
+lu4t3ersa
lu2thy
2luto
lu2tob
-lu2t1o2f
+lu2t1o4f
lu2top
lu4t1or
lu4t3r
-lut5schl
+lut3schl
+lu4tü
+3lux
2lüb
3lübd
lück4e2
lücker3
-5lüd
lüf3te
lü2hel
lüh1l
-2l1v2
+lü2s
+2lv2
lva3
l3vl
lv3r
-4l3w4
+2lw2
+l3wa
+lw4ei
+l3wi
2lx
1ly
-ly1a2
+ly1a
+lya4m
ly3c
ly3es
ly1l
@@ -12722,85 +13610,91 @@ ly1l
3lyn
ly3no
ly1o
-ly3t
-ly1u
-2l1z
+ly3onn
+ly3th
+2lz
l2z1ac
l2z1ag
l2zan
l2z1ap
l2zat
lz1aus
-l2zäp
+l2z1äp
l2zär
+l2z1eim
lze2l
l2zele
-l4z3enth
+l2z3enth
l2z1ep
l2z1er2h
l2zerz
l2z1id
lzi4m
lz1imi
+lz1ing
+lz1inn
lz3l
-lzo2f
+lzo4f
l2zö
lz3t2
l2z1u4fe
lzvol2
-lz1w
-lz2wec
+lz3w
+l2zwar
+lz4wec
l2zwu
-1ma
-3ma.
+1m
maa2
m1ab
m3a2bar
m2abä
2m3abb
m2abe
-2m3abf
-2mabg
+4m3abf
+4mabg
2mabh
-2mabk
+4mabk
+2mabl
m2abli
2mabm
+4mabn
ma2br
m2a3b4ra
-2mabs
+4mabs
2mabt
+4mabw
2mabz
ma3chan
mach2e
-mach8terh
-mach8t7ers
-mach4tr
+mach4t5ers
+mach2tr
ma2ci
mack2s
2m1act
-mada2m
+mada4m
m2adä
ma2del
ma3dj
+ma4dl
2m1adm
2m1a2d4r
ma4d2s
-mae4
-ma1f4
+mae2
+ma3f
+maf4r
mag2a
ma2ge.
-ma2geb
-ma2gef
+ma4geb
ma2geg
ma2gek
ma2gep
-ma4ges.
+ma2ges.
ma2get
ma2gev
ma2gew
-2m1agg
-magi5er.
-magi5ers
+4m1agg
+magi3er.
+magi3ers
ma3gl
ma3g4n
2m1ago
@@ -12808,33 +13702,36 @@ ma3ha
mahl4st
ma1ho
mai4s3e
-ma2ke.
+ma4ke.
+ma4kes
2m1akt
-mal2ag
mal1ak
-ma4lakt
-ma2lan
+ma2lakt
+ma2l1an
ma2lau
ma2lär
2mal2de
m2aldi
ma3le
ma4leb
+ma4lent
mal2er
ma4lex
-mali1e
+mali2e
+mali3er
mal3lo
2mallt
ma2lon
ma2lop
m2alp
+mals4terb
mal3t
malu4
ma2l3ut
3malv
-ma2mid
+ma4mid
mam3m
-2m1a2nal
+4m1a2nal
ma2nar
2m1a4n4at
ma2nau
@@ -12842,23 +13739,25 @@ ma2nau
2manb
man2ce
3man3d4
+man2en
ma2net
-m2anf
+2m2anf
mang2
2man3ga
-m4angel
+m2angel
2m1angr
-m2anh
+2m2anh
3manip
2manl
+4manla
m2anle
-3m2ann
-2manod
+3m2a4nn
+4manod
+2manr
2m1ansa
2mansä
man2t1h
2mantr
-manu3
ma4n1ut
2manw
2manz
@@ -12866,11 +13765,10 @@ m1anza
ma2or
ma2phr
ma2po
-ma1q
m2ara
4marag
-mar2an
-2marb
+4marb
+2maren
mar3g2
3ma1rh
ma3r2i
@@ -12879,17 +13777,17 @@ mar2kr
4mar2o
maro3d
4marr
-mar6schl
-mar6schm
-mar6schr
+mar4schm
+mar4schn
+mar4schr
mar2sp
mar2su
-2m1arti
+2mart.
ma3r2u
m1arz
3mas
ma3s4a
-mas2e
+ma3s2e
ma3s2p
masse4n3
mas4ta
@@ -12897,14 +13795,16 @@ mas4tel
mas2ti
mas4to
mas4tr
+mas6tri
ma4s3z
3maß
-ma2ta2b
+ma2tab
ma2tan
ma2tä
m3a2tel
-ma4t3erd
-ma4t3erz
+ma2t3erd
+ma2t3erz
+ma3the
m4atme
2matmo
ma2to
@@ -12912,43 +13812,45 @@ ma4tort
mat3se
mat3sp
matt4r
+matur2a
mat3url
-2m1au2f
+2m1au4f
3maul
ma3un
mau3r
2maus
+m1auss
mau2ta
-m4ay
+m2ay
ma1yo
-1mä
2m1ähn
mäh1r
4m1änd
-2mäo
2m1äp
2mäq
mär1
+2m1ära
mär2kl
mär2z1
mä3t4r
mäu2s1c
-2m1b2
+2mb2
mbe2e
+mbera2
mber2e
mbe3ri
mbert4
mbi3er.
-mb4l
+mb4le
mble1i
-mb4r
+mb4re
mbu3sc
mby4t
2mc
m3ch
-4m1d
+2md
m2dan
-m2d1a2s
+m2d1a4s
md1är
mde2a
m2dei
@@ -12957,39 +13859,37 @@ m2d1emi
m2d1ent
mder2
m2d1erl
+mdien4
md2ö
md3ras
md3s2e
-mdt4
+mdt4r
m2d1um
-1me
me3an
me3at
-meb4
me2ben
-3mebr
+4mebo
me1c
-medi3e4
+medi3
+medie4
me1e2m
-mee2n
-mee4r3ei
+me1e2n
+mee4rei
2m1eff
mega3
me4gel
3meh
meh6l3er
-mehrer4
2m1eif
2m1eig
-m2ei3l2
+m2e4i3l2
mein4da
meinde3
-meiner6k
-mei6nerl
-3m2einu
-3m2eist
+meiner4k
+mei4nerl
+5m2eist
me3lam
-me3l4ant
+me3l2ant
me2l1au
melb2
mel3d2
@@ -12999,14 +13899,17 @@ me2lek
me2ler
melet4
2melf.
+mel3ink
3melk
-mel4k3ei
+mel2k3ei
mell2
3melo
me2lob
+mel4sac
mel2se
-mel5t4
-6mel6tern
+mel2spa
+melt4
+4mel4tern
2m1e2mis
2m1emp
2m1e2mu
@@ -13017,93 +13920,105 @@ me4n3an
men3ar
me4nas
men3au
-2m1endl
+4m1endl
menen1
-4men4gag
+meng2a
+2men2gag
men3ge
+me4nh
+me2nid
me2nim
-men3k4
+me4n3k4
men2on
-men4se.
-men4sem
-6mensemb
-men4sen
+me4ns
+men2se.
+men2sem
+4mensemb
+men2sen
men4ser
men4ses
-mensi4d
-men2so
+mensi2d
menst4
-m4enta
-men4t3ak
-m4entei
-ment5eig
-men6t5ers
-2mentn
+3m4enta
+men2t3ak
+men4tanz
+mentar6ten
+3m4entei
+ment3eig
+men4t3ers
+4mentn
ment4sp
+menü1
me1o
2meou
2meö
-2mepa
+4mepa
2m1e2pi
-3m4er.
+m4er.
me1ra
mera3l
mer2a3s4
me2r1e2b
-me4rens
-mer4err
-mer4erw
-4m3er4gän
-merin4d
-merin4t
-4mer4klä
-mern3s2
+2mer2eig
+me2rens
+mer2err
+mer2erw
+2m3er2gän
+meri2e
+merin2d
+merin2t
+2mer2klä
+3merkm
+mern3s4
m4ersh
-mer5sm
-mer6stel
-mer4sto
+mer3sm
+mer4stel
mert4r
-merz6eng
+merz4eng
3mes
me2sal
me4sä
4meser
-mes2po
-mes1pr
+mes3pr
2mes4sa
mess3an
-mes6ser6g
+messe2r
mes4s1o
mes2sp
mes2st
mes3ta
me1sto
+mest3ri
me3su
me3sze
me3ta
-meta1s
+met3abe
+meta1s4
+mete2
me3th
-meto1
+me2to
me2tö
+me3tr
me4trig
-met6t5en6d
+met4t3en4d
me3tu
meu1
2m1ex
me2xe
-1mé
-2m1f4
+2mf
mfi2le
-4m1g2
+mf4rü
+2mg2
mgang4
mglim2
-4m1h2
-1mi
+2m1h2
+m3hu
mi1a
mia2b
-mi2am
+mi3ak
+mia4m
+2mian
2m1iat
-mi1ä
mibi1
mic1e
mi1ch
@@ -13116,20 +14031,20 @@ mie3dr
mi3ele
mi4e3no
mien3s
-mierer4
+mierer2
mie1s
mie2ti
mie4to
-mie2tr
-mi1f4
+mie2t3r
+mi3f4l
3mige
+mig4r
mi3h
mik1an
mi3ke
mi4kel
mi4kens
mi3k4l
-mi2ku
3mil
mi3l2a
milch1
@@ -13140,30 +14055,32 @@ mi3l2u
4milz
m2im2a
2m1imm
-2mimp
+4mimp
min2ac
mi3nak
-min5anze
-m2inde
+min3anze
+m2in3de
minde4s
-2m1indu
+4m1indu
mi2nef
miner1
-mi4n3e4ri
+mi4n3e2ri
min2eu
-2minfo
+4minfo
min2ga
ming3s
2minh
-mi3ni
+3mi3ni
mini3k4
mi3nod
mi2nof
2m1inse
m1inst
mi3nu
+3minz
mioni1
-mi1p
+mi3p
+mi4ps
3mir.
3miri
3mirs
@@ -13171,14 +14088,15 @@ mi1p
3mirz
3mis.
mi2sa
-mi4scha
+mis4au2
+mi3schu
misch3w
mi3se1
2m1i2so
-mis2pa
+mis2p
mi2spe
mis5sar
-mis4ser
+mis2ser
mis4st
mis3te
mi1sto
@@ -13186,54 +14104,63 @@ mi1s4tr
3misu
3mit
mi2ta
-mi2t1h
+mit1h
+mi5thr
+mi5tic
+mi5tig
mi2to
+mi5toc
mi2tr
-mit3s2
+mit3s4
mit5sa
-mit3ta
+mit3tan
mit3t2e
mitte3s
mi2t1u
4mitz
mi3v2
-2m1j
-4m1k4
+2mj
+2mk2
m3kn
-4m1l2
+mk4na
+mk4ne
+mk4nu
+2m1l2
ml3c
m3le
ml3f
ml3k
m3lo
ml3p
-ml3s
-4m1m
+ml3s2
+2mm
mma3a
m2m1ak
-m2m1al
+mma4kr
+mm1all
+m2mank
m2m1ans
mm1anz
m2m1ap
mm1art
mma1st
mm1aus
-mm1äu
+m2m1äu
mmd2
m2m1e2b
+m2m1e2di
m2m1ef
mm1ein
mme2l1a2
-mme4lin
+mme2lin
mm2ene
-mmen6te.
-mmen6ten
-m4mentl
-m4ments
-m4mentw
-mme2r3a
-mme4rec
-mmer6geb
+mmen4te.
+mmen4ten
+m2ments
+m2mentw
+mme2r3a2
+mme2rec
+mmer4geb
mme2s
mme3sc
mme4sz
@@ -13247,26 +14174,29 @@ mm2is
mmi3sc
mmisch4
mmi1s4t
-mmi5tw
+mmi3tw
mm3m2
-mm3p2
+mm3p
mmpf4
mm2s
mm3sa
+mm3se
mm3s2i
mm3so
-mm3s2p
+mm3sp
mm3sta
mm3sti
mm3te
m2mum
mm2un
mmu3r
+mmuts2
mmül2
mmüll1
-2m3n2
-m4nesi
-1mo
+2m1n2
+m2nesi2
+m3ni
+m3nu
2m1o2be
3mobi
2mobj
@@ -13275,9 +14205,7 @@ mo3de
mode1s
mo2dr
m1of
-mo2fe
-3mog
-2mog.
+mo4fe
mo2g1al
3m2oh
moh2a
@@ -13285,172 +14213,188 @@ moi3r
mo2k1l
mol3d
3mom
-mom2e
+mom4e
3m2on
mo2nan
mo2nä
-mon4dac
-mon4del
+mon2dac
+mon2del
+mon2d3er
mon2do
mond3r
mo2ner
+moni2en
mon2s3
mon3sa
-mons4e
+mon3s4e
mon3s4u
mont2a
mon3th
mo1ny
3m2o2o
-2mo1pe
-mo2per
+2mope
2m1opf
2mopt
mo1ra
+mo2rak
mor2an
mor2d3a
+mor4derm
mor2dr
-mo2rei
mor3g
-morgen5s6
+morgen3s4
mor3t2
+mor5to
+mo4ru
3mos
mo4ska
mos3s
moster4
mos2ti
+mo2su
mo3t2h
-mo5to
+2motio
+mo5tor
mot4r
-mous4
-2m1ox
-mo1y
-1mö
+motte3s
+mous2
+m1ox
+moy3
möbe2
mö2c
-2mö2f
-4mök
+2möf
+mö4fe
+3mög
2m1öl
-4m1p
+2mp
mpa3ne
mpe2la
-mpe4lin
+mpe2lin
mpe2n
m2p1ene
-m2pf
+m4pf.
+mpf3au
mpf1ef
-mp4f3erf
+mp2f3erf
mpf3erg
-mp6fer6ge
-mpf3erp
-mp6ferpr
-mp4f3err
-mp4f3er4z
-mp2f3l
+mpf3er2p
+mp4ferpr
+mp2f3er4r
+mp2f3erz
+mp4f3l
mpf1or
-mp2fr
+m4ph.
mp1haf
+m4phb
+m4phf
+m4phg
+m4phm
mp1hos
+m4phs
+m4phz
mpin2
-m3plä
mp3lei
-m4p3lem.
+m2p3lem.
m2p3len
m2p3les
mp4lis
-m3pon
-mpor6tag
-mpor6ter6
+mpor4tag
+mpor4ter4
+m2p3ra
+mp4rä
mp3sh
+mps2p
mp3str
m3pu
-2m1q
-2m3r4
-4m1s
+2mq
+2m1r2
+m3ra
+m3ru
+2m1s
m2sam
m2san
m4sap
ms1as
m3sat
m2sau
-msau3e
m3sä
m4s1än
m3sc
-msch2
+msch2l
m4sco
-m3se
-m4s1e2d
-m4s1ef
-m4seig
-m4sein
-m4se2le
+m3se.
+m2s1e2d
+m2s1ef
+m2sein
+m2se2le
mse2n
-m4s1ene
-m4sent
+m2s1ene
+m2sent
ms1erf
-ms2erh
mse2t
-m4s1eu
-m4sex
-m2s1o2d
-mso2r
+ms1eti
+m2s1eu
+m2sex
+mso2
+m2s1od
+ms1orc
ms1ori
+ms2p
m2spä
m2sped
m4spl
-ms2po
m2spot
m2spro
-ms2pu
-ms3s4
+ms3s2
+mss4a
mst2
-m6stag
+m4st.
m3stä
m3steh
m3stei
m3stel
ms2ti
m2stit
-m3s4to
+m3sto
m3s4tr
ms5trä
+ms6trän
m3s2tu
ms4tü
m2sü
-m4sw
m3sy
m4szi
-4m1t
+2mt
mt1ab
mt1ak
-mta2m
+mta4m
mt1ar
mt3aug
m2t1e2d
+m2teig
mt1ein
-mt1eis
+m2t1eis
+m2teiw
mt1elt
+m3tem.
mt1emi
m4tenga
m4t3engl
m4tentf
m4tentg
-m4t3en4tr
+m4t3en2tr
m4tents
mter2
-m2t1erb
-m4t3erei
+m2t1er4b
m2t1erf
m2t1erg
mt1erh
m2t3e2r4i
m2t1erk
m2t1erl
-mter4n
m2t1ers
m2t1ert
-m2teta
+m4teta
m2t1eu
m2t1ev
m2t1h
@@ -13467,35 +14411,32 @@ m2t1öl
mt1ös
m2t3ro
m2trö
-m4ts
mt2sa
mt3sco
mt2s1e
mt3send
mt3s2ka
-mt3s4kel
+mt3s2kel
mts3tät
mt3stu
-mtt4
+mtt4r
mt1um
mtu3re
m3tü
mt3z
-1mu
mu1a
-mu3cke
-mu4ckel
+mu2ckel
2m1uh
mu3la
3muld
-mul4lau
+mul2lau
3mult
3mumi
m1ums
-mum2s1p
+mum2s3p
3mun
mundan4
-mun6derf
+mun4derf
mu2ner2
4m1unf
4m3ungeb
@@ -13504,8 +14445,9 @@ mu4nin
4mu4niv
4munw
4munz
-mu4r1u2f
-3m4us
+mu3ru
+mu4r1u4f
+3mus
mu4s1a
mu2s1o
mu2sp
@@ -13513,39 +14455,40 @@ mu2s3t2
4must.
must4e
mu2su
+muße1
mut1au
mut2st
-1mü
2müb
3müh
mü2her
mühl1a
-mül4len
+3mül
+mül2len
3mün
3müt
mütter3
-2m1v
+2mv
mvoll1
-2m1w2
+2mw2
mwa2
-mwa4r
-mweg4s
+mweg4
mwel4
mwelt3
+mwelter3
mwu1
-3my
-my1al
+my1a
+my1on
my2s3
-2m1z2
+2mz2
mzug4
1na
3na.
+na2a
2n1ab
3naba
na2bä
-naben3s4
+naben3s2
n3abh
-3nabi
n3abk
na2b3l
na2bor
@@ -13553,28 +14496,29 @@ na2br
nab4rü
4n3abs2
na2bus
+4nabz
3nac
n4ac.
na2ch1
nachen6
-na5chen.
+na3chen.
n3achse
-nach3sp
-nach8t7ersc
-nacht8raum
+nacht5ers
+nach6tersc
+nacht6raum
n1ada
na3dab
3nade
na3de.
nadel1
-na2der
+na3den
4n1adl
4n3adm
n1a2dr
3nae
na3el
2n1af
-na1fra
+na3fra
nag2a
na3ge.
na2gem
@@ -13583,21 +14527,25 @@ n1a2gi
na3gin
na3g4r
3n2ah
-na2h1a
+nah1a
+na2hau
n4ahm
4n3ahn
4n3aho
+na2hö
3nai
+na1i2d
nai2e
n1aig
4n3air
nai4re
n2ais
2n1ak
-3nakä
+3n4akä
3nako
-na2kro
+na4kro
4nakt
+na4kus
n2al.
na2l1a2
nal3am
@@ -13606,12 +14554,12 @@ na2lä
2n1albk
n2ald
nal3da
+na2l1ed
nal3ei
-na4l3ent
-na6lerei
-na4ler4g
-na4lerm
-na4l3erw
+na2l3ent
+na2ler2g
+na2lerm
+na2l3erw
nales2
nal1et
nal1ex
@@ -13622,25 +14570,25 @@ nal2ph
n2als.
nal3t
nalt2a
-nal5tr
+nal5t4r
n2alty
na2lu
2naly
-na2mat
+na4mal
+na4mat
3name
-na3me.
-4na2mei
-n4a3men
+4na4mei
+n4amen
namens3
-4n1a2mer
-na2mid
-na2min
-na3m4n
+4n1a4mer
+na4mid
+na4min
+na3m2n
3n2amo
n1amp
nam4sp
2n1amt
-namt4s
+namt2s
na4my
n1an
4na2n4a
@@ -13665,18 +14613,20 @@ nan2o3b
2nantr
2nanw
n2anz.
-nanzen4
-nan6zene
-nan6zeng
-nanzer4
+nanzen2
+nan4zeng
+nanzer2
+nan4zerg
+nan2zw
na3ot
na2per
n1apfe
-4napfel
+2napfel
+na2pos
n3a2pr
-n1aq
+n1a2q
n1ar
-5nar.
+3nar.
na2r1a
2narc
n2ard
@@ -13688,7 +14638,9 @@ n2arle
2narm
n2aro
na2rom
+na3rö
n2arr
+nar2rh
n2ars
2nart
n2arta
@@ -13697,16 +14649,17 @@ na3r2u
3nas
n4as.
na3sä
-na4schw
+na2schw
4n1a4sp
nas2s1c
4n1assi
nas4ta
-na2str
4na2sy
nasyl2
3nat
n4at.
+n4ata
+na2tat
na4t3au
nat1ei
na2tem
@@ -13714,16 +14667,17 @@ na2t2h
4natm
nat2o
4natom
-5nator
nat1r
nat4sa
nats1e
-na3tu
+na4tt
+n4a3tu
n1au
-nauf4fr
-nau2fr
-5naui
+nauf2fr
+4nauge.
3n2aul
+3naum
+na3um.
4nausb
4nausd
4nausf
@@ -13734,13 +14688,15 @@ n2auso
4n3auss
4nausw
4nausz
+nau5te
3nav
nave4
-navi5er.
-navi5ers
+navi3er.
+navi3ers
+na2x
1nä
2näb
-3n4äc
+3n2äc
3näe
2n1äf
3näg
@@ -13748,41 +14704,52 @@ nä2hi
3nähm
2n1ähn
nä2hu
-2n1ä2m
+3näi
+2n1äm
+nä4mi
2n1än
-4näpfel
+2näpfel
2näq
när4s5t
nä2sc
n2äss
+nä4st
2näu
3nä1um
-2n3b4
-nbais4
+2nb2
+n3ba
+n3be
nbe2in
nber2e
+nber2gr
nbes4
-nby4
+nb4la
+nb4le
+nb4ri
+nbruch4s5t
+n3bs
+nby4t
2n1c
n2c3ab
n3can
n3ce4n
n3ces.
+n4ch.
+nchi3en
n3chl
-nch3m
+n4ch3m
n2ck
ncor2
n3cr
n3cu
-4n1d
-nda1f
+2nd
+nda3f
nd2ag
-n3dai
+n3d2ai
n2d1ak
n2dana
n2dani
n2danz
-nd1arr
n3dat
nd3att
nd1au
@@ -13790,30 +14757,32 @@ n2daut
n2dax
nd1äng
nd1c
-nde4al.
-n2d1ede
-n3dee
+nde2al.
+n3de1e
n2dei
+nde3inf
+nde2lat
+nde3l2ec
nd3elfe
ndel3l
ndel4s3a
-ndel6s5en
-ndel7ster
-nde4mot
+ndel4s3en
+ndel3ste
nden3sk
-n4dentl
-n4dents
+n2dentl
+n2dents
nde3o2
-n5der.
-n5deren
+n3der.
+nde4rei4s
+n3deren
nd2erh
-n5deri
-nder6läs
-nde4rob
-n4de4ros
-n6der6sat
-nder5ste
-n3d2es1
+n3deri
+nder4läs
+nde2rob
+n2de2ros
+nder4sat
+nder3ste
+nd2es1
nde2se
ndes3s
ndi2a3
@@ -13824,12 +14793,11 @@ ndo2n3a
n2dopt
nd1or
n2do2ri
-nd2os
ndo1st
n2d3ott
+n2dout
n2dö
nd2ös
-nd4ram
n2d3rat
nd3rau
n2d3re
@@ -13839,20 +14807,25 @@ n2drod
n2d3rö
n2drui
n2d3run
-nd4sene
+n4dsb
+nd2sene
+nd4sf
+nd4sg
+n4dsl
+nd4sm
nd2spr
nd3th
ndt4r
n2duns
-ndwa5re
ndy3
+ndys2
1ne
3ne.
ne2ap
-3neas
+3ne3as
ne3at
ne3au
-4n3ebene
+2n3ebene
ne2bl
2n1ebn
neb4r
@@ -13864,12 +14837,13 @@ ne1ck
neck2a
ne2dit
2nee
-neei2
+neei4
ne3ein
ne3eis
neen2
+ne1en.
nee1r
-neer2e
+neer4e
n1ef
n2ef.
n2e3f2a
@@ -13878,17 +14852,16 @@ n2e3f2a
neg4l
n1e2go
neg4r
-n1ehe
-2ne2he.
+n1e2he
+2nehe.
2nehem
-2nehen2
-nehe2r
+nehen2
+ne3he2r
3nehm
-4n3ehr
+2n1ehr
2n1ei
3neia
4neic
-nei4dei
nei4dr
4neier
3neigt
@@ -13898,44 +14871,45 @@ nei4la
4neinh
4neink
4neinl
+4neinr
4neinz
-4neip
neiss4
ne2ke
2n1eks
nek3t2
2nekz
-ne2la
+ne2l
+ne3lä
nel3b
-n1e2le
-4nelek
-4nelem
+n1ele
+ne3leb
+2nelek
+2nelem
ne3len
-ne3lex
-nel2i
-ne3lid
-ne2lit
+ne3l2i
+ne4lim
+ne4lit
3nelk
n2ell
nel2l1a
-nel4lei
-neller6f
+nel2lei
+neller4f
+n2eln
3ne3l2o
-3nelu
+3ne3lu
3n2em.
-4n1emb
+2n1emb
+ne5men
+n2emo
4n3emp
2n1ems
-4nemu
3nen
n4en.
n2en3a
nen4am
-ne4nan
ne2nä
n2enb
n2enc
-nen4dar
4n1endb
4n1endd
4n1endf
@@ -13952,21 +14926,26 @@ nene4m
nenen1
ne4nene
nen3erb
-ne2n3eu
+2nenerg
+ne2n1eu
n2enf
4n1engb
-nen4gen
+nen2gen
+nen4gen.
4n1engs
4n1engt
n1engu
+nen2gun
n2enh
-ne4n3i
+ne2ni
n2enj
n2enk2
n2enm
-nen4nar
+n2enn
+nen2nar
ne2no4
-nen3s4e
+nen3s2e
+2nensem
nen3sk
nen3s2p
5n2en3t2a
@@ -13974,29 +14953,30 @@ nen3s2p
4nentd
4nentf
5n2enti
-4n1entl
+2n1entl
4nentn
-5nentr
+5n2entra
+nen2tri
4n1ents
-4n3entw
-4nentz
+4nentw
+4n3entz
ne4n3u
n2env
n2enw
-nenz4er
-ne2o3b
+nenz2er
+neo3b2
ne2oh
ne2or
neos4
ne2pen
2nepf
-2ne2pi
+2ne4pi
2nepo
ne2pos
nept4
n4er.
ne1ra
-ne2rab
+ne2ra2b
ne2rac
ne2r3af
ne2rag
@@ -14005,114 +14985,119 @@ ne2ram
ne2ran
ne2r3ap
n2erat
-ne6ratio
+ne2rati
ne3rato
ne2rau
n2erb2a
-4n3erbe.
-4n3erben
+2n3erbe.
+2n3erben
2nerdb
-ner4dig
+ner2dig
nere2
ne2r1eb
ne2rec
n1erf
-4nerfas
+2nerfas
+nerfor2
3nerfr
2nerfü
2ner3g4
+n3ergeb
+4nergi
3nergr
n1erh
-4n3erhö
+n3erhö
+4nerhöh
3neri
+neri2e
n2erj
n1erk
-5nerka
+3nerka
n2erkö
+n4erleh
n2erli
2n1erlö
n1ermi
+2nermit
2n1ernä
4n3erneu
2n1ernt
n1eros
n1eröf
ne1rös
-n2ers.
-2n1ersa
+3n2ers.
+n1ersa
3nerse
ner4sk
-4n3ersts
+2n3ersts
nert4
3nert.
ne2rup
3n2erv
-4nerwar
+2nerwar
2n1erz
n2es.
ne2sal
nes2an
-n4ese
ne2sei
+n1e2sel
ne2s1ev
2ne3sh
-ne3si
ne3ska
ne2s1of
ne2s1or
-ne2s1pa
-4n1es2si
-nes4sig
+ne2s3pa
+2n1es4si
ne1sta
ne2ste
nes3ti
2n1est3r
+ne1stu
4nesyn
-3neß
ne2tab
2ne4tag
net1ak
ne2t1an
2ne2tap
2ne2tat
-ne4te2l
+ne2te2l
ne2th
net3ha
ne3ti
+ne4tim
ne4tin
-ne4tob
+ne2tob
n2ett
net3ta
net3te
-net3tr
+net3t4r
2n1e2tu
-net4zer
+net2zer
net2z1i
ne2u
neu1c
-neu4ere
-neuer4f
-neuer4k
-neuer4r
+neu2ere
+neuer2f
+neuer2k
neuer4s
-neuer4w
+neuer2w
+neuf4
neu3g4
+n2eun
2n1eup
neur2
neu2ra
neu3t
3n2evi
n2ew
-ne3wa
2n1ex
ne2xi
-5ney
3nez
-3né
-2n1f
-n3f2al
+1né
+2nf
+nf2al
nfalt4
-n3f2ang
+nf2ang
nf4ar
n3f2ä
nfe2i
@@ -14120,28 +15105,37 @@ n3f2en
n3f2er
nf2es
n4fex
-nff4
-n3fi
-nfi4le.
+n3f2i
+nfi2le.
nf4le
+nf4lö
+nf5löf
nf2o
nfo1s
-nf4r
+n4föl
+nf4re
+nfres3
+nf4ri
+nf4ru
+nf4rü
nf3s2
nf2tan
+nf5ten
nf2t3r
nft4st
nfts3tr
nf3tu
n2f1u
-4n1g
+2ng
n3gabe
ng1abt
n2g1a2c
n2g1ad
n2g1ak
-ng1a2me
+ng1a4me
+ng1ams
ng3anda
+ng3angl
n2ganh
n4ganl
ng1ans
@@ -14154,22 +15148,25 @@ ng3d
n2g1eif
n2g1ein
ngelb4
-nge3l4ei
-ngelt2
-n3g4en
-n5gene
-nge5nerw
+nge3l2ei
+ngel3t4
+n3gene
+nge3nerw
ngen3sa
-nge4ram
+nge2ram
n2g1erg
-nger4zä
-n3g4es
+nger2zä
+nger3ze
+n3ges
nge3sa
-nge5t
+ng5füh
+ng5get
ngg3s
ng3hu
n2g1id
+ng5käf
ng2lad
+n3glas
ng2läs
n2glic
ng4lok
@@ -14181,80 +15178,93 @@ ng4nom
ng2nu
ng2ob
n2g1op
-n2g1or
-ngo2ri
+n2g1o2r
n2gö
-n2g3rai
+n2grai
ng4ran
n2g3rat
ng3roc
ng3rost
ng4s3au
ng4scr
-ng4s3e4h
+ng4sd
+ngs3e4h
ng4sek
-ng4sens
+ng4sf
+ng3span
ng4spar
ngs5tan
ngs4teu
-n4gt
ng3ts
n2gum
ngung4
ngzei4t
-4n3h2
+2n1h2
+n3ha.
+nhabe4r3e
+n5haltu
+n3he
nhe2r
+n3ho
1ni
3n2ia
ni3alo
ni2ar
nibb4
-nic4
ni1ce
n1id
3n2id.
ni3da
ni2de
+n2i3de.
2nidea
+ni3den.
ni3d4r
2n3idy
n2ie
nie3b
+3nied
+ni2e1i
ni1el
nie3l2a
nie4n3
ni3ene
-ni3eni
-nie4rei
-ni4erna
+nie2rei
+nie4rerg
+ni2erna
nie2sa
ni2eu
nife4s3
-ni1fl
-niga2
+ni3fl
+niga4
ni2g1ab
ni2g1am
ni2g1an
4n3i2gel
-n4igen
2niget
+n4igk
ni4gl
nig3li
ni2gn
+nigs3c
nig4sp
nihi3
ni2kar
-3nike
-ni2kel
-ni3kerh
+4nikei
+4ni2kel
+ni3k2erh
+4nikh
ni2ki
nik3ing
ni2kor
ni2k3r
+ni4ks
nik3t4
+4nikun
3n2il
ni3l2a
ni3l2i
+nil3l
4nimp
nin1
3nin.
@@ -14264,7 +15274,9 @@ ni2nal
3n2inb
2n1ind
2ninf
-3n2ing
+3ning
+n2ing.
+n2ingo
ning4s
2n1inh
4n1ink2
@@ -14289,8 +15301,9 @@ ni4sam
ni2san
ni2sä
nis3cha
-ni4schw
+ni2schw
ni2s1e
+ni3se.
4n3isol
ni2som
4nisot
@@ -14301,29 +15314,28 @@ nis3tha
ni2s1u
2nit
3nita
+ni3th
ni2ti
4ni4tia
nit2o
-3nitr
+3nit4r
nit3s
-nit6ter6g
-nit6t5er6k
-nit4tra
+nit4ter4g
+nit4t3er4k
+nit2t3r
nitt4sa
-3niu
ni3v2
3nix
-2n1j
-4n1k
+2nj
+2nk
nk1abr
n2k1ac
-nka2ge
+nk1a2ge
n3kal
n4kalg
nk1ang
nk1apf
nk3art.
-nka3sc
n2katm
n2kato
nk1aus
@@ -14333,27 +15345,30 @@ n2k1äp
nke2c
nk1ei
nk2eil
-nke4lei
-n4kelem
+nke2lei
+n2kelem
+nkel5ster
+n3ken.
nke4na
nken4te
-n4k3erle
-nke4ros
+nker4fah
+nker3la
+n2k3erle
+nke2ros
nk3ersa
+n2k3erwe
n3kesc
nke2t
nk1eti
-n2ketu
nk1i2d
n2kide
nk1inh
n2k1ins
-n4klade
-n3klag
+n2klade
+n2k1laf
nk3leis
n2k3len
nk3les
-n3klin
nk2lo
nk4neb
n2knis
@@ -14368,8 +15383,8 @@ n2k1ort
n2köl
nk4rab
nk3rät
-n4kre.
-n2k3rel
+n4k5re.
+nk3rel
n2kren
nk3rep
n2krez
@@ -14379,14 +15394,16 @@ nk2sal
nk2se
nk3sen
nk2so
+nks2p
nks2ti
nk3s2z
nk2tak
nk2tan
nk4tau
+nk3tek
nk4tent
-nk4terg
-nk4t3ern
+nk2terg
+nk2t3ern
nkte3sk
nkt2et
nk2tin
@@ -14396,53 +15413,57 @@ nkt1r
nkt3ric
nk2tro
nk2tru
-nkt4sen
+nkt2sen
n2k1um
nku2n
nk1urh
n2küb
-2n3l2
-nla3ge
+2n1l2
+n3la
+n3le
nle2ga
-2n1m2
+nleit6e
+n3li
+2nm2
n3ma
n3mä
nmen2s
-n5mi
-4n1n
+2n1n
n2nada
nna2g
n2nalg
-n2n1all
-nna3m
-n2nan
-nna3st
+n4n1all
+n2n1amb
+n4nan
+nn1a2sc
n2nau
n3nec
+n3n2eh
nn2ei.
n3nelb
nne4le
nne4na
nn2ens
-nner4ei
-n6n5ereig
-nner4fü
-nner6geb
+n4nentl
+n4nereig
+nner2fü
+nner4geb
nn4ergr
nn2erh
nn2erk
-nner4la
+n2n3er2la
+nner4mit
nn2ero
nne2rö
nn3erwa
-nner6war
nner2z
-nne4s1e
+nne2s1e
nn2eu
nn2ex
nn3f
-nng4
+nng4r
n3ni
+n4nid
nnk2
nn2o3b
nn3obl
@@ -14452,21 +15473,22 @@ n2nop
nno2r
nn1ori
nn4sam
-nn3ser
nn3s2p
-nnst4
-nn4stoc
+nnst2
+nn2stoc
nn2stö
-nn5t2a
+nnst4r
+nnt2a
+nn5tag
nn2th
n2n1uf
n2n1unf
nn1ur
nnvoll4
-nnvol5le
+nnvol3le
1no
3no.
-no5at
+no3at
3n2oba
n2obel
2nobj
@@ -14474,31 +15496,32 @@ no2bla
n2oble
3noblo
3noblö
-2n1ob2s
-nobu2
-nobut3
+2n1o4b2s
3noby
no1c
noche4
noch4r
2nod
no2de
+nodi3
no2ed
n1of
-no2fe
+no4fe
+no5fes
2noff
-2n1oh
-3n2ohe
+n1oh
+n2ohe
+no3id
no2kel
-2n3okk
+2n1okk
no3kr
+nola4
+no2lam
n3ole
-no2leu
no4lig
no2liv
2n3o2ly
-3no3me3
-no3mi
+3nome3
3nomp
non2e
n1onk
@@ -14508,21 +15531,22 @@ n1ont
no2o
3n2opa
3nopä
-no2per
-2n1o2pi
+no2pe
+2no2pi
2n1ops
no3p2te
3nor.
nor2a
no2rad
-n2o3rak
+n2o1rak
no3ral
no3rar
2norc
nor4da
3nordb
-nor4des
+nor2des
nor2d3r
+nor2du
no3r2e
2n1org
3norh
@@ -14536,7 +15560,8 @@ nor3mal
3n2os.
nos2e1
no3sh
-no5s2k
+nos2k
+no5ski
no2s3p
2no2sti
nost1r
@@ -14546,57 +15571,73 @@ no2tan
no3tart
no2tä
no4t1e2i
-no6t5entr
-no4ter2
+no4t3entr
+no4ter4
noterb3
no4tex
not1h
no2tho
-no2t3in
+n4oti
+no2tin
+no4tl
no2t3op
no2t3r
3nov
2n1o2x
3noz
2nöd
-4nö2f
-4n1ök
-4n1öl
+2nöf
+nö4fe
+2n1ök
+2n1öl
n2ör
1n2öt
-4n3p4
+2np2
+n3pa
npa2ge
npa2s
-npf4
+n3pf
+np4fu
+n3pl
+np4lä
+np4lu
+n3pr
npro1
+n3ps
npsy3
-2n1q
-6n3r2
-nran2
-nrau4ma
+n3pü
+2nq
+2n1r2
+n3ra
+nra3di
+nran2d
nräu3s
+n3re
nrebe2
-nreli1
nre3s4z
nro2h
nrö2s
-nrücker6
-4n1s
+n3ru
+nrücker4
+2n1s
+nsa2b
n3sabo
n2s1a2d
n2s1a2gi
-nsa2kr
+n3saka
+nsa4kr
n2sall
ns4alp
n2salt
-ns4anat
+ns2anat
ns3ane
n2sanm
nsa2r
ns2arg
n3sark
-nsa2s
+nsa2st
ns4ath
+nsau4e
nsau4r
nsau2s
n2saut
@@ -14605,49 +15646,53 @@ ns2ax
n2s1än
ns2äug
n2s1äus
-n3sche.
-n4schef
-nsch5eul
+n4schemi
+nscher5g
n4schl.
nsch2o
nscht4
n3schu
-nsch7werd
+nsch5werd
ns2cr
ns1eb
-nse4ein
+n3sed
ns2eh
nse2ha2
-nseh5ere
-n4seinf
+nseh3ere
+n2seinf
ns2ele
-ns3elem
+nse2l3en
n2sem.
n2sene
-nsen4sp
+nsen2sp
n2sepo
+ns4eq
+nse2rei
+nser4en
n2s1erf
n2s1erg
-n2serh
+n2s1erh
n2s1erk
-ns4erko
+ns2erko
ns1erl
-n4serle
-n4s3erne
+n2serle
+n2s3erne
n2serö
ns1ers
-n4sersc
ns3ertr
+nser2u
n2s1erw
n2serz
n2sety
n2s1eu
ns2ext
nsfi2l
+ns4ic
ns3iden
+ns4ie
+ns4ig
n3sim
n4simp
-ns2inf
n2sini
nsinn2
nsinns3
@@ -14655,106 +15700,119 @@ n3sis
n4siso
nsi4te
nsi2tr
-n3s2kal
+n3skal
n3s2kel
ns2kis
n3skle
+n4skü
n3s2ky
-n5smara
+n3smara
+ns3ob
n2s1o2d
ns1of
n4soff
ns4om
n4s3ont
n2s1op
-n4s3ort.
+n2s3ort.
ns2pac
nspa2g
-ns4pek
-ns2pel
-n5s4pen
-n4speri
-n2sph
-n3s2pi
-ns4pie
+n4sparti
+ns2pas
+ns4pel
+n2speri
+n2s3ph
+n3spi
ns4pir
n2spo
n2sprä
-n4s3prie
+n2s3prie
n2spro
n2sput
nsrü2
-ns3s4
+ns3s2
+nss4t
+n4st.
ns3tabl
n3stad
-ns8tagent
+ns4tagent
nst1ak
-n4stale
+n2stale
ns4ta2n1
n3stand
nst3ane
-n3s4tar
+n3star
n2stas
-n4stat.
-n6staten
+n2stat.
+n4staten
ns4tati
-n4stats
+n2stats
n3stäm
-n3s4tän
-nst5eife
-nst7einhe
+ns3täti
+nst3eife
+nst5einhe
+ns2temp
ns4tent
ns2tep
-nst5erge
-n5s6terne
-n5s6terns
+nst3erge
+n3s4terne
+n3s4terns
ns4teu
ns2ti
n3s4tic
n3stif
-n4stilg
+n2stilg
n3stim
n2stob
-nst5opfe
+nst3opfe
ns4tor
-n4strie
-n4strik
+n2strie
+n2strik
ns4trip
ns4trun
ns2tu
nst3u4t
ns4tüm
-n3suf
+nsuli2
ns2um
ns1un
ns2ung
ns4unk
ns2unw
ns4unz
-ns1urs
n2s1ut
n3sy
+ns4ys
+n4sza
ns4zene
-2n1t
+n4szo
+n4szu
+n4szü
+n4szw
+2nt
n3t2a3c
-ntak4ta
-ntal1a
-nta4lin
+ntags4t
+ntak2ta
+ntal3ar
+nta2lin
n4t1all
nta2lo
nt2alp
-n3ta3m
+n3tam
n3t2anb
nta3ne
-n4tansp
nt1ant
-n4tanza
-n3t2arb
+n2tanza
+ntar3ak
+nt2arb
+ntar2c
nt1ark
-n3t2arm
+nt2arm
nt1art
-ntar6tik
-nt3artu
+n4tarti
+ntar4tik
+n4t3artu
+ntasi2
n2t1ass
n2tath
n3tatl
@@ -14762,76 +15820,86 @@ nt1äm
n2t1äu
nte3au
nte1e
-nte3g6
+nte3g4
nt1eh
n3tehe
n2teig
nt1ein
n2t1eis
-nte4lin
-n2t1emo
+nte2lin
+n2temä
+n2t1e2mo
nt4en
nte4na
-nten6te.
+n4tenpä
+nten4te.
ntera2
-nte6r5eis
+nte4r3eis
+nter3g
nt4erh
nt4erk
nt4erm
nt4ern
-ntern4e
-nt4ers
+ntern2e
+nt4erp
nt4ert
nte3sa
n4t1es4s
nte2st
-n6testri
-n2te4ta
+n4testri
+n4te4ta
nteu3
-nteu6eri
+nteu4eri
nte3v
nt1hel
nt1hie
+nt1ho
+nt2hos
n2thot
-n3thr
nt4hu
n2t5hum
-nt4hy
-n3t2i
+nt2i
nti3c
+nti2en
ntim3p
-n4t3ind
-n4t3inf
-n4t3inh
+n2t3ind
+nt3inf
+nting2
+nt3inh
ntini1
-n5t2lem
+nt4i3t
+n3t2lem
ntmen2
-ntmo4
ntni2
ntnis1
+nt4od
+nt4om
nto3re
n4torg
-n4t3o4rie
+n4t3o2rie
+nt4ou
+n4t1ox
n2t1öl
nt4ral
nt1rau
nt4raum
+nt5re.
nt3rea
nt3rec
n5t4ree
nt3reif
n5trep
nt4repr
+nt4ré
nt3rich
n4t3rieg
+nt3ring
n2troh
-n3trop
-n4tropi
+n2tropi
n2t3rü
-n4ts
nts2ah
+nts3k
nt3s2p
-nts3par
nt5spe
nts2t
nt2sur
@@ -14839,11 +15907,11 @@ ntt2
n3tub
ntu4re.
ntu1s
-n3tü
+n3t2ü
nt3z
+nt4zk
1nu
3nu1a
-nu4ale
nu3a2r3
nubi1
2nu1c
@@ -14851,13 +15919,13 @@ nubi1
nude2
3nue
nu2es
-nu2fe
+nu4fe
3nug
2n1uh
3nuhi
3nui
-n2uk4
-nu3kl
+n2uk
+nu3k4l
n3u2kr
null1a
nulle2
@@ -14869,11 +15937,12 @@ n2ume
4numg
2numl
3n2umm
+4n3umma
4numr
2n1ums
2n1umv
2n3umz
-nu4n
+nu2n
4nuna
2n1une
3n2ung4
@@ -14894,28 +15963,31 @@ nur2z
3nu2s
nu3sc
nu3se
-nus1p
+nu3sk
nu3spo
-nuss3er4
-nus6serl
+nus2s3er2
+nuss3p
3nut
nu2t1a
+nuti2v
n3uto
-nu4top
+nu2top
nu4t3r
3nuu
3nux
3nuz
3nü.
-2nü4b
+2nüb
+nü4be
nür1c
3nüs
1nüt
-2n1v2
+2nv2
n3ver
n3vl
-nvoran4
-2n3w
+nvoran2
+2nw
+nweis3s
1ny.
2n1ya
n2ya.
@@ -14924,33 +15996,31 @@ n1yo
1nyr
1nys
1nyw
-4n1z
+2nz
n2zac
n2z1a2g
-n2z3a2k
-n2zan
-nz3a4ne
-n3zani
+n2z3a4k
+n2z3a4ne
+n2zant
n2zar
+nz3a2ri
nza2s
n2zat
n2z1au
n2zän
n2zär
nze4la
-nzel6lig
-n6zenerg
+nzel4lig
n3zeni
-n4zense
-n4zentl
-n4zents
-nz3erem
+n2zense
+n2zentl
+n2zents
n2z1erh
nz1erl
-nzer4lö
-n5z4err
-nz5erste
-nzer6tra
+nzer2lö
+nz4err
+nz3erste
+nzer4tra
n3z4es
nze3sk
nze2t
@@ -14967,50 +16037,57 @@ n2z1op
n2zöl
nz3st
nzt4r
-n2z1wa
-n2z1wä
+nzu3p
+n2z3wa
+nz3wä
n2zwet
n2zwir
n2zwö
-n2z1wu
+n2z3wu
+1ñ
ño1
ñor2
-2o3a2
-o4a3bi
-o4ac
+2o1a2
+oa3bi
+o2ac
oa3che
oa3chi
-o4ad
+o2ad
oa3de
oad4st
+o3ah
oa3in
-o4a3ke
-oa4k5l
+oa4k1l
+oa4ku
+o3al
o4a3la
-o4a3mi
-oa4n
-oan4a
-o4a3q
-o2a4r
+oa4lg
+oa4ls
+oa4me
+oa4mé
+o2ami
+oa4n4a
+oa4nn
+o2a3q
+o2ar
+oa4re
o2as
-3oa3se
-o5ass
-o4at
+3o4a3se
+o3ass
oa4tr
-o5au
2o1ä
-o1b
2ob.
o3b2al
ob2am
-ob2ar
+2ob2ar
+2obau
ob1auf
2o3b2ä
2obb
ob2e
2obe.
2obea
-2o3bec
+2obec
2obef
o2b3ein
2oben
@@ -15018,36 +16095,36 @@ obe4na
oben3d4
1o2ber
2o3ber.
-ober5eis
+ober3eis
ober3in
-oberin6g
obe4ris
2obev
2obez
2o3b2i
+obi2e
3obj
ob1la
ob3lei
1ob3li
+ob4lit
2oblo2
2ob2lö
ob2lu
-2obo
+o2boe
ob1or
+2obot
2obö
ob3rei
2obrü
-o4bs
ob3s2h
ob3sk
-obs2p
-ob3sz
+obs4p
2o3bu
o4bunt
obu2s
2o3bü
o4büb
-2oby
+2o3by
oby4t
2oc
o3ca
@@ -15058,138 +16135,157 @@ och1a
ocha2b
ocha2r
o1che
-oche4b
-o2ch1e4c
+oche2b
+o2ch1e2c
och1eh
och1ei
oche2l
-ocher4k
+ocher2k
ochi4d
+ochi3e
och3l
och3m
och1o
-ochö2f
+ochö4f
och3r
och1s
-ocht4
+ochs4p
+och3t4e
o1chu
-ochu2f
+ochu4f
och3u4t
-och1w
+och3w
o1ci
-o1c4k
+o1ck
o2ckar
o2ckau
o3cke
-o6ck5er6sc
+o4ck3er4sc
o3cki
+oc4ko
+o4cks
ock3sz
ock3ta
o1cl
o3cu
-o1ç
-o1d
2od2a
od3ak
od2dr
o3dec
o3d2e3i
odein3
-ode4l3ag
-ode4man
+ode2l3ag
+ode2man
ode2n1
-o3der
ode2s1e
ode3sp
od2et
o3dex
od2i
2o3dia
-2odi3c
+2odic
2odif
2o3dir
2odn
-od2o
o2don
-o2d3op
+o2d1op
odo4s
od2ö
2odr
-o2dre
-odt4
+odt4r
2o3du
o3dy
-ody2m
-2o1e2
-oe3di
-oe4m
+ody4m
+2o1e
+oe2b
+oe2c
+oe3de
+oe2h
+oe2l
+oe2m
+oe4mi
oen1e
-oe3ri
-o2e3s
-oe4sc
-o2e3t2
+oe4nz
+oe2p
+o2es
+oe2sc
+o2et2
o3et.
+oe4ta
o3ets
-2ofa
+oe2v
+oe2x
+o1ë
+o2f
+2o3fa
ofa2c
of1a2d
of1a2g
of2an
of1au
-2ofä
-o2f1e2b
-o2f1ec
+2o3fä
+of1är
+ofdie3
+o3fe
+o4f1e2b
+o4f1ec
2ofee
-o2f1ei
+o4f1ei
2ofem
-o2fent
-2o3fer
+o4fent
+2ofer
o4ferb
-2o3f2es
-o2f1e2t
+o4f1err
+2of2es
+o4f1e2t
2ofeu
-of3eun
of2f1a
off3erz
of2f1in
1offiz
of2f3l
+2offn
of2f1o
of2f3r
offs2
off3sh
off3si
off3sp
-of2fu
-2ofi
-ofi3e2i
+2o3f2i
+ofi3e
+ofie2i
ofi3k4l
ofi3s4
-2o1fl
+2o3fl
of3le
of3li
of4lö
-2ofo
-2ofö
-2o1fr
+2o3fo
+2o3fö
+2o3fr
of3rä
+of4ru
of4rü
of2s1
of4sam
of3sä
ofs2ch
-of4sen
+ofs3p
of3sta
of4staf
+ofs3te
+of3sti
of3str
2oft
oft2a
of2tei
of3th
oft4r
-2ofu
+2o3fu
+of3uh
of3ur
-2o1g
+o3fü
+2og
o2g1ab
o2g1ac
oga3d
@@ -15197,26 +16293,32 @@ og1ang
og1ans
o2g1e2i
oge2li
-ogener4
-ogerätein8
+ogener2
+ogen2id
+ogerätein6
+ogeri2
o2g1eth
og2gl
o3gh
-ogi2er
-ogin1
+ogi4e
o2g1ini
-og3ins
+o2g3ins
og1l
og3le
og2lo
-o3g4n
+o3g2n
+og4na
+og4ne
+og4ni
og1o2ri
ogs2
-og3sp
+og3s4p
og1ste
og3sti
2o1ha
+o3ha.
oh1alk
+oh1ar
o1hä
o1he
o3he.
@@ -15236,6 +16338,7 @@ oh2la2d
oh2lä
oh3lec
ohl1ei
+ohle3l
oh3lep
ohler2
oh4lerg
@@ -15264,42 +16367,44 @@ oh2rel
oh2rem
ohren3s
ohrer2
-oh4rerg
+oh2rerg
+oh3rers
oh3ri
oh4rin
-oh2rol
+oh4rol
+1ohrr
ohr5t4r
oh1s
oh3sa
oh3t
o1hu
-oh1w
+oh3w
2o1hy
2oi
-o1id.
-o3i2da
-o1ids
-o3ie
+o1i2d
+o3ida
o1i2m
o1in
o4ine
oi2r
o3isch.
-o4ische
+o2ische
o1ism
oiss2
-oi1th
-o1i4tu
-2o1j
-ojek8tori
-2o1k
+o1i2t
+oi4ta
+oi3te
+oi3th
+oi3ti
+oi4tu
+2oj
+ojek4tori
ok2a
oka3b2
o2k3ac
oka3i
oka2la
okale2
-oka6lere
okas4t
ok2e
oki4o
@@ -15307,37 +16412,39 @@ ok2la
ok3lau
ok1lä
ok2li
+ok4na
ok2o
-oko4pt
+2okr
ok2so
-ok2s1p
-ok5t2
+ok2sp
+ok3t2
+ok5tor
3okw
2ol
o1la
ol3abu
olaf4
-o2l1a2m
+ol1ami
ol1ant
ol2ar
-olar3s2
+olar3s
o3l2as
olast4
-ol1a2v
-4o1lä
+o1lä
ol1ät
ol2chr
ol4d1am
ol2dä
ol2d1ed
-ol4d3eng
-old5ersa
+ol2d3eng
+old3ersa
olde2s
ol2deu
ol2dim
ol2d3o
-ol2dr
+ol2d1r
4o3le.
+ole2e
o2l1ef
ol1eie
o2l1eis
@@ -15347,26 +16454,26 @@ ol1erk
ol1er3t
ole3s
ol1ess
-ole2st
+ole2s2t
ole4sti
ole3u2
ol1exz
ol2fa
ol2fem
-olf3ere
+ol2ferl
ol2f3l
olf1r
-ol2f3ra
+ol2fra
olft4
olgege3
-olge4ne
ol2gl
ol2gr
-ol2i
olie4n1
-oli2er
+oli4er
oli3k4
+o4l1ind
oli5tu
+oli6tun
3oliv
ol3ke
ol2kl
@@ -15379,97 +16486,117 @@ ol2l1ac
ol2l1ad
ol2l1ak
oll3am
-ol4lang
+ol2lanh
ol2l1au
ol2l1e2b
ol4l1e2c
ol2l1ei
ol2lel
-ol4l3erh
-ol4ler4k
-oll3erl
-ol4l3erw
-ol4l3ess
+ol2lent
+ol2l3erh
+ol2ler2k
+ol2l3er2l
+ol2l3erw
+ol2l3ess
+ol4lk
ol2lop
oll3s2a
oll3sp
-4olo
ol2of
-olo1p
+oloni2e
+olo3p
ol1ort
+olo1st
+olo3t
ol2ov
ol3s2k
ol4ster
ol3t2h
o1lu
-olu2th
-ol2y
+ol2y1
4o3lys
ol2z1a2
-ol3zan
+olzer2
ol4z3ern
+ol2zers
ol2zim
+ol2zin
ol2zo
ol2zw
ol2zy
-2om
-o2mab
-oma2bl
-o2m1a2ge
+2o2m
+o3ma
+o4ma2bl
+o4m1a2ge
om1alg
om1all
-oma4n3er
-o2m1ang
+o5man.
+oma2n3er
+o4m1ang
+omani2e
om2anr
om3ansc
-o4mante
-o2m1ap
-o2m1ar4s
-o2m1art
+o4m1ap
+o4m1ar4s
+o4m1art
omar4te
o4ma2sy
omat2i
o4matom
-o2m1au
-o2meb
+o4m1au
+o3mä
+o3me
+o4meb
om1ebe
-o2m1ef
-o2m1ei
-o2mel
-o3meld
-omen5t6an
+o4m1ef
+om1ei
+o4meis
+o4mele
+omen3t4an
o4mep
omer2
+o5mer.
om1erh
-o2meru
+o4meru
om1erz
+o4mex
+o3mi
omi2c3
+omi2e
omiet1
-o3mig
om1ind
om1ing
-om1ins
-o2m1int
+o4m1inn
+o4m1ins
+o4m1int
+o4miso
+om2it
om3ma
omm2e
-3o4mn
-4omo
-o2m3oa
-o2m1org
+3omn
+o3mo
+o4m3oa
+o4m1org
om1o2ri
+o4mox
+o3mö
+ompani2
om3pf
oms2
om3sk
-om3t2
-o2mum
+omt2
+om3th
+o3mu
+o4mum
o4munt
+o3my
2ona
on3a2b
on2ac
ona3g
o3nal
on3ann
-onan6z5ei
+onanz3ei
o2n1ap
o2n3arb
ona3th
@@ -15479,33 +16606,36 @@ o4n3at4t
on2au
2onä
on1äh
-2onc
on2dan
-onde8rers
-onderer7t
+onde4rers
ond1r
on2dra
-on4drin
+on2drin
+on2d3rü
ond3sk
2one
+o2n1e2b
on1ec
one2ck
o3nee
o2nef
+one3h
o3neig
on3ein
+on3ele
on1ema
-one2n1
+one4n1
o4n3ends
on2eng
onen3s2
+onenz4
on1ep
o3ner.
on1erb
o2n1erd
-oner4fa
+oner2fa
o2nerh
-on4erka
+on2erka
on1ers
o3nes
o3nett
@@ -15516,54 +16646,63 @@ ong4le
ong4r
ong3s2
on2gue
-4o3ni
-on2i3d
+2o3ni
+oni3de
onie3g
oni2ga
-on4ik
+o4nikan
+o4nikb
+o4nikf
+o4nikg
+o4nikk
+o4nikl
+o4nikm
+o4nikp
o4nikr
+o4niks
o4nim
o4nind
o4ninh
o4nins
-on3k4
+on3k2
3onke
+onk4n
onli4
onlo2c
onna2
-on3n2an
+on5n2an
on3n2e
2ono1
o3nod
o2nof
-ono2i
-o2n3oke
+o2n1oke
o3nom
on1orc
on3ord
ono3s
ono3t2
-onrad3
ons1a
+onsa2g
on4sam
+onsau3c
+onsch2
on2seb
+on4sed
onsen1
onse4t
onsi2d
ons3ing
ons3l
-ons1p
on4spin
onst2a
onst4r
ons5tri
on3ta
on2t1eb
-on2te2l
ont5end
-on4t3erl
+on2t3erl
on2th
-on4t3rat
+on2t3rat
2onuk
o3nur
2onut
@@ -15572,17 +16711,19 @@ on3v
o3ny.
on3z2
onze3in
-o1ñ
oo1c
ooch2
oo2gl
oo2k3l
oo2kn
-oo2mo
+oo4mb
+oo4mo
oo2ne
-o1op
+o1o2p
+oo3pa
oop2s
o1or
+oor3a
oor3d
oo4sk
oos3s4
@@ -15590,99 +16731,99 @@ oo2su
oo2t1a
oo4t1ei
oo2t1h
+oo2t3o
oo2tr
oot2st
oot3t
oo2tur
2o1ö2
2op.
-o1pa
op3adr
op1akt
opa2le
op1ang
-opa5s
-opa3s4t
+opa1s
+opa5s4t
2opä
1ope
-o1pec
-2o1ped
-op1ef
-2o1pei
-o1pek
+2o3ped
+o4p1ef
+2opei
2opel
2open
2opep
-o2pera
+o2per
+o4pera
op1erh
-o1pes
-2opf.
+2o4pf.
op2f3a
op3fah
-op2fä
-o2pfe
+o3p2fä
+o4pfe
op2fem
op2fin
opf3la
-op1flü
+op3flü
op2fo
-4oph2
+2oph2
o3phe
-o1pi
-opi5a4
-opi3er.
-opi5ers.
-opie4r3u
+opi3a2
+opia4t
+opie2r3u
opin2
2opl
op3lag
-o2p5le
-o3p2n
+op3le
+op5leu
+op2ne
2opo
-opo2la
+opo4la
op2pan
op4pl
1oppo
op2p3r
2oppt
-2o1pr
+2opr
+op3rec
3o4psi
op3sz
-1opt4
+1opt2
2opte
op3th
+o4pti
+opt4r
o2pum
-2opy
-2o1q
+2o3py
+2oq
2or.
or1a
-2ora.
+2o3ra.
o1raa
2or3a2b
o2rabb
o2r3add
or3adr
o1r2ag
-o2rak
1orake
+ora4ku
o1ral
o4r3alm
or4alt
or2am
-or3a2mi
+or3a4mi
o1ran3d
or4ane
oran2f
oran2m
-oran4ze
-or3ap
+oran2ze
+or3app
2orar
o1r2as
-o2ratt
-2orau4
-oraus6wa
+o2r3att
+2orau
+oraus4wa
or2av
-2o1raw
+2o3raw
o1ray
o3rä
or1änd
@@ -15690,43 +16831,45 @@ or1ät
orb2l
or1c
2orca
-or2ce
2ord.
4orda
ord1am
-or2dar
+or2d1ar
or2dau
2ordb
+or3de.
ord3eng
+ord3ermi
+or2d3erw
orde4s
or2deu
-or4d3ing
+or2d3ing
or2d1ir
or2dit
-1ordn
+1or4dn
or2do2
2ordr
+or4ds
ord3s2t
ord3t
2ordu
2ordw
2ore
-ore2a
+ore4as
o2r1e2b
o2r1e2ck
-ore2di
-o5ree
+or1e2di
o3ref
or1eff
ore2h
-or1ei
+o2r1ei
o3rei.
o3reie
o3r2eif
o3r2eis
-oreli1
orems2
o3renn
+oren4ne
o3rep
o2r1er
o3r2ere
@@ -15735,12 +16878,12 @@ ore4th
o2r1eu
2orf
or2fac
-or2far
org4a
org2e
2orget
or3ghi
2orgia
+1orgi3e
or2gl
or3gla
or3gle
@@ -15749,45 +16892,51 @@ or3gne
2orgr
2orh
2o3ria
-2o3r2id
+2or2id
orid3i
4o3rie.
o3rien.
-o6rienti
+ori4eng
+ori4enr
+o4rienti
+ori4env
o3rier
o3ril
+ori3m
or1ima
ori4mi
-2o3rin1
-o4r1ind
-o4rins
+2orin
+o2r1ind
2or4io
o2riso
2orit
2ork
-ork4r
-ork2s
ork3sh
2orm
or2mam
-or4mang
-or4mans
+or2mang
+or2mans
orm3asp
or2m1eb
-or4m3erf
-or4m3er4g
+or2m3erf
+or2mer2g
or2mor
orm3ord
+orm3org
or2mum
ormu4n
or4muni
or4munt
-ormwa5
-or2n1a2c
+ormwa5r
+orna2c
+orn3ack
or2nal
or2nan
or2nar
+or2nau
or5ne.
+or4nei
+or5nes
or3ni
or4nin
or3no1
@@ -15805,44 +16954,48 @@ or1ox
2orr
orr4a
or3r2e
-2ors2
+2ors
or3s4a
+or3sche
or3sh
or3si
-or3sk
-ors4tin
+or3s4k
+ors3tun
or3sz
or2t1ak
or2t1an
orta2r
or2tef
orte4n
-or4ten5g
+or4ten3g
ort3erb
-or4t3ere
-ort3erf
-ort3erg
-or4terk
-or4t3erl
-orter6sc
+or2tere
+or2t3erf
+or2t3erg
+or2terk
+or2t3erl
+orter4sc
or2t3e2v
or2the
+orti3en
or2tin
-or4t3off
+or2t3off
or4t1o2r
or2tö
ort3rad
-or4trau
-or4t3räu
+or2trau
+or2t3räu
ort3re
+or2tro
or2t1um
+or4tü
+or5tün
2o3ru
or2uf
or1uh
orum4s
o4r3un
oru2r
-o5rus
o2rü
or3z2e
orzel5
@@ -15862,80 +17015,89 @@ os4co
ose1e
ose1in2
os2el
-ose2n
+ose3l2a
o2s1er2k
os2ex
2osh
+o4sh.
o3s2hi
os2ho
+o4shö
+o4shs
os4hu
2osi
os4it
o3sk
+o4sk.
+2oska
os2kal
+o4skb
o4ski
2os2kl
2os2ko
o4skr
+o4sks
+o4skv
o4sky
1osm
os4mog
2oso
osol1
o2sö
-2os1p
-os2pac
-os2pe
-os3pec
-os3pero
+2osp
+os5pfa
o3sphä
+os3pi
o3s2po
os4pot
-os2pra
-2oss
+os4pt
+os4pü
os2sa
-os6s3a2c
+oss2abb
+os4s3a2c
os3sag
oss3ala
oss3and
os4sä
os2sei
-oss5enke
+oss3enke
os4s3enz
os2s1ep
-os4s3er4b
-osser4e
-os4ser4f
+os2s3er4b
+osser2e
+os2serf
+osseri2
+os2serz
+os5set
os4sik
os4sim
os2s1o2
os4son
-os2sp
-oss1pa
+os2s3p
os2s3t
-ost1a
+os4sü
+ost3abl
+ost1am
ost3ang
+ost1ap
os5tarr
-ost4art
os4tat
-ost3aut
-os4tä
+ost1a2v
oste2c
oste2n
+ost3engl
oster3e
-ost5erwe
-oster8wei
-ostes5s
-os4teu
+os6ter6weit
ost3eur
os2t1h
os2tid
+osti3en
os3til
-os4tim
os2tin
os3tina
os2tit
-os3toc
+os3to
+os4tob
os4tor
ost3ran
ost3rä
@@ -15943,32 +17105,37 @@ ost3re
ost3rot
ost3uf
os2tug
-os4tüc
-2osu4
+2osu2
os1um
+osu4r
2o3sy
+osyri5
o3s4ze
-2oß
-o2ß1el
-o2ß1ent
-o2ß1en2z
+2o2ß
+o3ße
+o4ßef
+o4ßei
+o4ß1el
+oß1ent
+o4ß1en2z
+o4ßep
oßer2
-o2ß1erb
-o2ß1ere
-o2ß1erf
+o4ß1erb
+o4ß1ere
+o4ß1erf
+o4ßex
+o3ßi
oß1is
-2o1t
+2ot
o3tabe
o2t3abi
o2t1ah
o2t1ak
-o3tal
o3tam
ot1ant
o3tark
-o2tarz
-ota2s
-ot1ast
+ot1a2st
+o2t1att
o2t1au
o3tau.
ot1ä
@@ -15978,14 +17145,19 @@ ote1i
o4t1eib
o4t1eic
otei4n
+ote3in.
+ote3ine
+ot3einh
+ote3inr
o4t1eis
ot2el
ote4l1a
-ote4lin
+ote2lin
otel3s2
o4t1emi
ot2em3p2
ote4na
+otens4
o4tentb
ot1erb
o4t1er2l
@@ -15994,44 +17166,36 @@ ot2e2s
ot2har
o2them
o2t1hi
-o2thr
-4oti
+o2thu
o2til
o2t1i2m
-ot2in
-ot3inh
otli4
ot2o
-oto3b4
+oto3b
ot3off
oto2ph
o2t1ö
otra3c
o3t4ran
ot3rat
-ot4rau
ot3re
ot3ric
ot4rig
ot3rin
-ot3rus
ot2s3at
ot3sch
-ots2en
ots1o
-ots1p
-ots2pe
-ot2spr
+ot2s3pr
ots3tau
ot3sti
ot3stra
ot2su
ott1a
ot4tan
-ot4ta2s
+ot4ta4s
ot2teb
-ot4terh
-ot4ter4k
+ot2terh
+ot2ter2k
otte2s
ot2t1h
ot2tim
@@ -16042,8 +17206,7 @@ ot4tri
ot3t4ru
ot1url
o3tü
-ouff6
-ou1f4l
+ou3f4l
oug2
ou4ge
ou3gl
@@ -16055,8 +17218,7 @@ ou2les
ou4li
2o1um
2o2u2n
-oun4ge.
-4our
+oun2ge.
oure2
ou2ret
ouri4
@@ -16065,90 +17227,93 @@ ourme4
our4ne.
ou3sa
ous2i
+ousi2e
+1outf
ou3ti
3outp
out3s2
ou3tu4
2o1ü
-o1v
ov2a
2ovel
o3ven
-ove3s
+ove3s4
oviso3
2ovo
-2o1w
-o2w3al
+2ow
+o4w3al
o3wec
+ow2er
+o2wer.
o2wh
-o3wi
+owi3en
+o3wj
+ow4su
o2wu
2ox.
o1x2a
2oxe
o2x1el
+o2xid
2oxk
ox3l
-o1xo
o2x1u
-1o2xy
+1oxy
o1yo
oy1s2
-o1z2
+oz2
o3za
1ozea
-2o3zen
-ozen4ta
+2o3z4en
+ozen2ta
ozes4sc
-4o3zi
+2o3zi
ozir3
ozon1a
2ozy
-oz3z
-ór3
-órd2
-ö1b
-ö3b4a
+ó2k
+ór3d2
+ö3ba
+öb4au
öb2l
ö2b3le
ö2b3r
öb2s3
-ö1c
+2ö1c
öch1l
ö2chr
öch2s
öch4ste
-öchst5ei
+öchst3ei
öchst3r
-öchs4tu
+öchs2tu
ö3cke
-ö1d
ödel3l
öde1r
ödi3
-ödien3
+ödienst6
öd2st
1ödu
ö1e
-1öf
+1ö2f
+ö3fe
öf2fl
+ö3fi
öf3l
-ö1g
öge3le
ögen2s1
ö2g3l
ö2g3r
ö1he
öhe4n1
-öhl2e4
+öhl4e4
öhre4
öh3ri
ö1hu
ö3ig.
ö3isch.
-ö1ke
1ö2k2o3
-ök3r
+ö2k3r
ök2s
ö2l
3öl.
@@ -16166,14 +17331,14 @@ oz3z
öl3le
3ölm
öl2nar
-öl1o2
+öl1o
+ölo4f
öls2
öl3sa
öl3sz
öl3tu
1ölu
-ölz2w
-ö1m
+ölz4w
öm2s
ön2e
ö3ni
@@ -16182,16 +17347,17 @@ oz3z
ön2s
ön3sc
ön3sp
-öo1
-öo2ta
+ö3o2ta
öoti1
-2öp
-ö1pe
+2ö2p
+ö3pe
öpf3l
öp4s3t
ör3a2
+öra4k
ör2b3l
ör1c
+ör3de
ör2dr
ör3dra
ö2r1ec
@@ -16202,7 +17368,7 @@ oz3z
ö2r1ene
ö2rent
ö3r2erb
-ö2r1er2e
+ö2r1e2r2e
ö2rer2f
ö2rer2g
ör2erh
@@ -16216,23 +17382,25 @@ oz3z
ö2rim
ör2kl
örn2e
-örner4v
-ör1o
+örner2v
+ör1o2
örpe2
-örs2e
-ör3sk
+örs4e
+ör3s4k
+örs3t
ört2e
ör5tri
-öru4
+öru2
ö2r1une
ö2sa
2ösc
ö2sch3a
ösche2
-ö4sch3ei
+ö2sch3ei
+ö4schen4e
öscher4
-ö6sch5erf
-ö6sch5eri
+ö4sch3erf
+ö4sch3eri
ö2schi
ö2sch1l
ö2sch3m
@@ -16252,176 +17420,168 @@ oz3z
ös2th
ös3tr
ö3su
-ö1ß
ößen3
öß2ti
-ö1t
-ö4t3a
+ö2t3a
öte4n1
ö2t3r
öts2
öt2sc
öt2tr
-ö1v2
-ö1w
-ö1z
+öv2
+öwe2
öze3
özes4
-1pa.
-1paa
+1p
+3paa
p1ab
p2abe
pab2l
pab4rü
2pabw
-1pac
-1p2ad
+3p2ad
+2padr
pae2
pa3el
pa2es
-pa1fr
-1pag4
+pa3fr
+3pag2
pa3gh
pa1ho
-1pak
-pa3ke
-pa1kl
+3pak
+pa3kl
pak4to
-3pala
-pala3t
+3pal2a
+pala3t4
3palä
3pal2e
pa3l2i
-1palm
pal2ma
pal2mä
pal2m1o
2palt
pal2t1a
-pal4tei
+pal2tei
pal2tr
-pa2m3a
+pa4m3a
pa2nar
pa4n3at
pan3d
pand2a
pan4ds
pa2neu
-panf4
pang4
+2pange
pa4nisl
pank4
2panl
-2pann
panne2
pan4n3eb
4pannu
-1pa2no
+3pa2no
pan3sl
-pan3t2h
-1panto
+3pan3t2h
+3panto
2pantr
-panz2
+3panz2
pan3ze
-1pap
-papi2
-papieren8
-papie8r7end
+3pap
+papieren4
+papie6r5end
pap2pr
pap4s
papst1
-pa1q
-1para
-pa4r3aff
+pa2r3aff
par3akt
-pa4rant
+pa2rant
pa3rap
pa2rä
2parb
-1p2arc
+p2arc
par3d
-parer8geb
-1parf
-2parfö
-pargel6d
-1park.
+2parer
+parer2g
+2parg
+pargel4d
+pa2rid
+3park.
park3am
-par4kau
+par2kau
par4kr
-1parks
+3parks
par3m2
-par3ne
-1pa2ro
+pa2ro
2parp
-2parr
+4parr
4parta
3partei
-1parti
-1partn
+3parti
+3partn
3party
-par3z
+2parv
+2parw
+par3z4
pas2e
-pa3sp
+pa3s2p
pa4spe
-passer4
-pas6serg
-pas2s1p
+passer2
+pas2sp
pa4st
+pa5str
2paß
+2pat.
pat1a
+pa5tag
pat4c
-pa5t4e2
-2patel
-1pat2h
-1pati
-1pa5t4r
-1pau
-2p1auf
+pat4e2
+pa5ten
+pat2h
+3pati
+3pat4r
+pa5tri
+3pau
+4p1auf
pa3uni
-2pausz
-1pav
-1pä
+4pausz
+pay2
3pä2c
pä3cke
pä4ck3er
3päd
-päde2
pä2d1er
-3pär
3päs
+pä4ta
pä4t1e2h
pä4tent
pä4tep
pä4t3erb
-pä2t1h
+pät1h
pä2to
pä4tr
pät3s4
-2p1b
-2p3c
-2p1d2
-pda4
-1pe.
+2pb
+2p1c
+p3ch
+2pd2
+pda2
+pda4t
pe2a2
pea4r
p1e2b
pech1
-1peda
-1peel
-pe2en
+3pech.
+3peda
+3peel
2pef
4p1eff
-1peg
+3peg
pege2l
pei1
4peic
-1peil
p2eim
-2peis
-1peit
+4peis
pekt2i
-1p4el
-3pel.
+3p2el
pe4l3ab
pe4lai
pe2l1au
@@ -16429,81 +17589,78 @@ pe2l3ax
pe2l1ä
pelb2
pel3d4
-3pele
pe4l1e2h
pe2l1er
pe2let
pe2leu
+pe4lh
peli2d
peli4n
-pe4l3ink
+pe2l3ink
pel3inn
-pel4ins
+pel2ins
pel3k
pel3l2a
pell4e
pell2i
pe2lob
-3pels2
+pels2
pel3sp
pel3t2a
-pel4zin
-1pem
-1pen
+pe2lut
+pel2zin
pena2r
pe4nas
pe2nä
pen3d2a
pe4nen1
+3penh
pe4ni2t
pe2n1o
pens2a
-3pen3si
+3pen3s2i
pen3s2o3
pens2p
+3pensu
pen3sz
pent2a
2pentw
penty2
penu2
-pen3z
-1pep
+pen3z4
+3pep
pe3pi
+pept2
pe1ra
+4perad
pe2rak
-per2am
pe2rau
pe2r1ä
per1e2b
perer2
+perer3s
perer3z
-pe3r2id
-3pe3r4io
-1perle
-1perlh
-per4r3an
-1pers
-2perse
-2persi
-3perso
-3persp
-peru2
+pere1s
+per2id
+pe3r4io
+3perle
+per2r3an
+3pers
+4persi
+peru4
pe3run
-1perü
+3perü
perwa4r
pe3s2a
-pese2n
-1pes5s2
-pe2st
-pes4ter
+3pes3s2
+pes2ter
pest1o
3pet
pet4r
-1pé
-4pf.
+2pf
p2f1ab
p2fad
-p2faf
+pf4ah
pf1ai
p2f1ak
pf1am
@@ -16511,8 +17668,8 @@ pf1ans
p2fa2r
pf3are
p2f1au
-1pfä
-p2fär
+pf4av
+p2f1är
p2f1äu
4pfe.
p2fef
@@ -16520,140 +17677,156 @@ p2fei
pf1eim
pf1ein
pf1e2m
-p3fen.
-p4fener
+p2fener
p3fens
p3fent
-p4f1ep
-pfer5a
-p4ferde
-pfer6pro
+p2f1enz
+p2f1ep
+pfer3a
+pfer4pro
pf4es
p2f1et
-pff4
+pff4l
+pff4r
p2f1i2d
pf1inn
p2f1in3s
pfi2s
+p2fl
pf1lam
pf4lan
pf4leg
pf3lei
pf3lo
+pf4lü
+4pf5lüm
+pf4lw
pfo2
p2fob
p2fom
p2for
pf1ori
-pf3r
+p2f3r
pf1ra
+pf4rä
+pf4ro
+pf5roc
+pf5roh
pf4rü
-2pfs2
+pfs2
pf3sa
pf3se
pf3sl
pfs4ti
pf3sz
-2pf3t2
+pf3t2
pft4r
+p4fuh
p2fum
-2p3g2
+2pg2
+p3gl
pgra2
-1ph
-4ph.
+2ph.
ph2a
phal4te4
p1hand
-3pha1s
+3pha3s
p1hau
phä1
-3phän
4phär
-4phb
+2phb
2phd
2p1hei
phen3d2
phe4n1e
-phen3s2
+phen3s4
2ph1ers
-4phf
-4phg
+2phf
+2phg
p2hid
phik1a
-phi4kan
+phi2kan
+3phil
+phi2t
2phk
ph2l
-4phm
+2phm
2phn
p2ho.
p2hob
2phö
ph2r
-4phs
+2phs
ph3t2
2phthe
phu4s
phu3t
2p1hü
3p2hy
-4phz
-p2i2a1
+4phyk
+2phz
+p2i2a3
piab4
-pia3k
+pia5ka
pi4ali
-pia3n
+pi4an
piap2
+pia4tr
pi1ce
pid2
-pi2e1i
-pi2el
-piel3a
+pi2e
+pie1i
+piela2
+pieler4ke
+pi3ent
3pier
pie2ra
-pie4reb
-pie4rei
+pie2reb
+pie2rei
+3pig
pi3gl
-1pil
+3pil
pi3le
-3pilo
-pil4zer
+pill2
+pil2zer
pil2zw
p2im
-3pin.
pi2nad
-3ping
-pingen4
+4pind
+pingen2
ping3s
-3pins.
3pinse
-pin3s2p
+pin3sp
pi2o
-pi3oide
pi3onu
pi3os
-1pip
+3pip
pi2pe
+pi4pel
3pirate
pi3ri
-3pirin
-1pis
+pi3s2k
2piso
pit2a
pi3t2h
pit2s
+4pitz
pit3z2e
pi2z1in
-2p1j
-2p1k2
+3pizz
+2pj
+2pk2
pku2
-1p2l2
+p2l2
2pl.
3pla
4p3lad
p1lah
+p4lak
pla3na
p4lau
-pla2y1
+pla2y
+3plä
2p3le.
ple1c
ple2e
@@ -16661,180 +17834,197 @@ p4leg
ple3n2
2p3ler
p4leu
+p4lex
2plig
3p4lik
p4liz
plo3n
2p3lu
plu2s
-2p3m2
+2pm2
+p3mö
2p1n2
-1p2o
pob2
2po1c
3pock
3pod
3poe
po2el
+2p1of
+3pog
2poh
-po2i
-po3id.
-po3ids
-3poin
+4poil
+3po2in
+po2it
+poka2le
3pol
po2lan
+po3lar
po2l1au
pold2e
+pol3f
po3li
-po3lo3p
-pol3z2
+po3lo5p
+pol3z4
pom2ph
-2pond
-pont2
+poni2
+3pont2
po1ob
-po2p1ak
+3p2op
+po4p1ak
po2p1ar
-po2p3l
+pop3l
+po2pli
po3p2t
po1rau
+po3re
porf4
+pori2e
+pork4
por3s
3portal
-por2t1h
+por2th
3portio
3porto.
3portos
3portr
-por4tre
+por2tre
+port3ric
3posi
poss2
po2sta
-pos4tag
+pos4t3ag
po2stä
post3ei
pos3tel
pos4tem
pos4tr
post3ra
-po2ta
+post3ri
pot1ar
3potä
3pote
pot2h
-po2t3in
+poti2e
+po2tin
pott1r
po2t1u
po3un
po2w
powe2
-po3x
+p2o1x
pö2bl
pö2c
-4p1p
+2pp
p2pab
pp1ans
p2pat
pp1au
ppe3e
p2p1ei
-ppe2l1a
+ppe2l1a2
ppeli5ne
ppel3s
+ppel3z
pp2e2n1
p2p1erz
-p2pf4
-pp1fr
+pp3fr
p2p1h
pp3he
pp3l
p4p1lac
p4plan
-p2p1lä
+p4p1lä
p2ple
-pp3oh
-p2p1ö4
-pp3p4
+pp1oh
+p2p1ö2
+pp3p
+ppp4f
p2p3ra
-p2p5rä
+p2prä
p2pri
pp3rol
pp3rot
-p2p3ru
-p4ps
-pp3s4a
+pp3ru
+pp3s2a
pps2p
pp3sy
-ppt4
+ppt2
+ppt4r
p4p1um
ppyl2
-p2r4
-1prak
-1prax
-p4rä
-1präd
-1präf
-1präg
-1präl
+p2r2
+2pr.
+3prak
+3prax
+3präl
3präm
-1präp
+3präp
3präs
-1präv
-2pre.
-2prec
+4pre.
+4prec
3pred
-2pree1
+4pree1
pre2ei
2preg
-1prei
3preis
-prei4s3c
-prei6sei
-prei4s5t
+prei2s3c
+prei4sei
+prei2s5t
2preiz
-1prem
-pren4ga
+3prem
+pren2ga
2p3rer
-1pres
pre3sa
-press4e
-pri4e
+pres3s2e
+pri2e
2prig
pri2l1
-2pring
+p4rin
+4pring
prings4
-1prinz
+3prinz
+pr4io
+pri3o4n
+3pris
pri2t1
-priter4
+priter2
prit5t4
-2pritz
-1priv
-1pro
+4pritz
+3priv
3prob
pro3be
-2proc
-7p4rod
+3p4rod
3p4rog
3proj
+3pr4om
+3prop
+pro3pe
+3prosa
4pross
pro1st
+3prot
prot2e
-3proto
-2prott
-pro3x
+prote3i
+4prott
+3prov
+pro1x
+3proz
2prö
-1prüf
-1prüg
-2prüh
+2pru
+2prüc
+3prüf
+4prüh
2prün
2p1s
-4ps.
ps1ad
ps2hi
-ps1od
+psi2e
p2sö
-ps4pi
-pss4
+pss2
+pss4t
p2st
+p4st.
p3sta
pst1au
p3stä
@@ -16849,89 +18039,106 @@ p3stü
3p2sy
4psys
ps2ze
-2p1t
+2pt
pt1a
pt2ab
pta2g
+p2tana
p2t3a4t
+pt1ä
+ptde1
p2t1e2b
pt3ec
pt1ef
pt1ei
pt1emi
-4pten
p4t1en2g
p4t1ent
pt1ep
-pt3erei
+pt3ernt
pt1erw
pt1erz
-p3tet
p4teta
-p4t1e2ti
+p4t1eti
p2t1h
pt1id
pti2de
-pt1in1
-pto2mo
+pt1in
+pto4mo
pto4na
pto2p
pto2w
pt3r
+ptri4e
p2tro
pt3s2
pt4sl
pts4t
pt1uh
pt1um
+p3tung
pt1urs
-ptü4
+ptü4b
3p2ty
-pt3z2
-1pu
+pt3z
+ptz4w
pu1a
-pub4
+3pub
+pub4l
2puc
pu2dr
2p1uh
2puk
pu2kl
pu2k1o
+pu3la
pu2lin
pul2sp
pul2st
-2pulw
+3pulv
+4pulw
pum2pl
3pun
4pund
pun2e
pun2s
4punt
+3pup
2pur
pu2ra
pu2rei
-pus2h
+pur3m
+pus4h
pu3she
+pus3s
pu2s3t
-pu5t2e
-3put2s
-3putz
+3put
+put2e
+put2s
puzi3
-1püf
-2pül
+2pü
+3püf
+pü4lei
pül3l2
-2p1v
-2p1w
+2pv
+2pw
pwa4r
-3p4y1
+py1
py3s
py3t
-2p1z2
-qu4
+2pz2
+1q
+2qs
+qu2
+qu4ac
+qu4ar
+qu4at
+qu4en
+qu4er
que3rel
-quer5n
que4te.
-1queu
+3queu
+qu4in
1ra.
r1aa
ra2ab
@@ -16945,7 +18152,6 @@ r2abä
1rabbi
rab2b3l
2rabd
-rabdru4
ra2bei
rab2er
rab3erd
@@ -16953,59 +18159,63 @@ rab3erd
2rabg
2rabh
1rabi
-2rabk
r2able
ra2bli
-ra4b5lo
+ra2b5lo
2ra2br
-2rabs4
+2rabs2
2rabt
2r3abw
1raby
2rabz
ra2ce
2r1acet
-ra4cheb
+ra2cheb
ra2cho
2rachs
-rach6t5rä
+rach4t3rä
ra2chu
r2ack
1r2ad
r4ad.
-rada2
+rada4
ra2dac
ra4d1am
ra2dan
2radap
3radar
ra2de4i
+ra2d3end
3radf
-3radh
+3r4adh
+r4adi
3radio
4radit
3rado
3radp
ra4d1r
rad3ri
-rad5t4
+rad3t4
+rad5te
+rad5tr
r2af
raf3ahn
raf3ar
rafe2
-ra2f1er
+ra4f1er
raf3r
raft5s
rag2a
-ragein4
+ragein2
rages4
2ragg
ra3g4le
4ragm
ra2gn
+rag5ne
r2ago
rahle4n
-5r4ahm
+3r4ahm
r1ahn
2ra1ho
4raht
@@ -17014,63 +18224,64 @@ r2ai
rail2l
2r3air
raka3
-1r4a3ke
+1r4ake
2rakk
-3ra1k4l
-ra2kre
-ra2kro
+3ra3k4l
+ra4kre
+ra4kro
+ra4kt
2rakti
-1rakü
+1r4akü
2rakz
r2al
r4al.
-ra2la2
+ra2l1a4
ra4l3ab
-ral1ak
-rala4s
ra2lä
ral3b4
-3r4ald
-ra4l3end
-ra4lent
-ra4l5ern
+3r4a4ld
+r4ale
+ra2l3end
+ra2lent
+ra2l5ern
ra3lex
r4ali
ra2lid
rali3er
-ra4lin4d
-ra4l3ing
-ralin6sp
+ra2lin2d
+ra2l3ing
+ralin4sp
ralin4t
2r3alk.
2r3alm.
2ralp.
4ralpe
r4als
+ral3sc
ral3sk
ral3su
r3alt
-3r4al5t2h
+3r4al3t2h
ra2l3u
-3raly
+3r4aly
rama3s
-ra2mei
-ra2mer
+ra4mei
+ra4mer
r2ami
r2amm
-ram4man
-ram6mens
-ram6m5ers
+ram2man
+ram4mens
+ram4m3ers
ram4m3u
2ramn
3ramsc
2r1amt
-ramt4s
+ramt2s
2ramu
2rana
ran1ad
ran3ade
-r1a2nal
+ra2nal
ra2nan
ra2nar
ra2nau
@@ -17078,25 +18289,27 @@ ra2nau
r2anbe
r4anda
r4ande
-ran4dep
-ran4d3er
+ran2dep
+ran2d3er
3r2andi
rand3s
1raner
2ranf
+ra4ng
2ranga
-ran6g5e6be
+ran2gan
+ran4g3e4be
3rangi
r2angl
-rangs2
+rangs4
rang3sp
-rang5ste
+rang3ste
rani3e
r3a4nil
ran3ka
ran2kr
ran2kü
-4ranl
+2ranl
2r1anm
r2anmi
r2anmu
@@ -17106,10 +18319,9 @@ ran5ne
2ranr
2rans
r2ans.
-r1ansc
-ran4spa
-4r5antei
-r1anth
+ran2sam
+ran2spa
+2rantei
r2anto
2rantr
1ranu
@@ -17121,9 +18333,10 @@ ra2par
2rapf
2rapo
ra2pok
-rap2pr
+ra2pos
+rap4pr
2r3a2pri
-2r1aq
+2r1a2q
r1ar
r2ar1a
2rarb
@@ -17133,21 +18346,22 @@ raren1
rar3et
rar1e2v
r2arf4
-ra3rie
rar3in
ra3ris
r3a4rist
4r3arit
r2ark
+2rarm
raro2
ra2rom
+rar3r
2rart
2rarz
rar3zw
r4as.
ras2a
ra3san
-ra4schl
+ra2schl
r2asm
ra3spr
r2ast
@@ -17159,67 +18373,73 @@ ras4to
2raß
1rat
r4at.
+r4ata
ra2t1an
ra2t1ei
r3a2tel
+3ratg
+r4ati
ra4tid
+rati2e
2ratm
rat2o
2ratom
ra5tor
-rat4r
-r3att
-2ratta
+rat3r
+ra2tra
+rat4re
+rat5schl
+2r3atta
2rattr
4ratz
rat3ze
4rau.
3raub.
+rau2bri
rau3e4n
2rauf
-rau3fä
+rauf3sa
2rau3g2
-3raum
-rau4m3ag
-rau5mes
+3r4aum
+rau2m3ag
+rau2man
+rau3me.
rau2mi
3raup
4raur
2rausb
3raus2c
2rausd
-rau3se
2rausf
2rausg
-raus8gewä
+raus4gewä
2raush
2rausl
rau2sp
2rauss
-raus8sche
-raus5se
+raus4sche
+raus3se
2rausv
2rausw
rau3ße
2rauto
raut1r
-rau4tra
-rau4tro
-raut5s
+rau2tra
+rau2tro
+raut3s
1raü
r2ax
raxi2
r3axt
r2ay
-ray1o
r2az
räch2s
3r2äd
-4räf
-rä1fr
-4räg
+2räf
+rä3fr
+2räg
2räh
-4räm
+2räm
3rän.
3räni
3räns
@@ -17229,7 +18449,8 @@ rä1fr
r2är.
rä3ra
rä1ro
-rä2sc
+rä4sa
+rä4sc
räse2
räte1s
3rätse
@@ -17238,12 +18459,12 @@ rä2u
4räue
räu2s
räus4c
-räu7schen.
+räu5schen.
2räuss
2räuß
4räut
2räx
-4r1b
+2rb
r2b3a2b1
r3bac
rba4del
@@ -17265,7 +18486,6 @@ r4belä
rbel2o
r3ben.
rbe3r2e
-rber6gin
rbe3rum
rbe3sl
r2bim
@@ -17275,8 +18495,8 @@ rbit2a
rbi3tu
rb4la2d
r2blan
-r8blasser
-r4b3last
+r4blasser
+r2b3last
r3blat
r3blau
r2b3le.
@@ -17289,7 +18509,8 @@ rb2ob
r2bonk
rb3ras
rb3rea
-r8b7rechts
+r4b5rechts
+rb4ri
rb4sam
rb2sei
rb2ser
@@ -17301,8 +18522,9 @@ rbü4b
rby4t
2rc
r1ce
+r2cer
r1che.
-r1chen
+r1che2n
r1ch2i
rch3l
r3chlo
@@ -17310,15 +18532,13 @@ rch3m
rch3r
rch4ro
rch1s4
-rch3sp
rch3t2a
-rchter6r
-rch1w
+rch3w
r1ci
r2ck
+r3cki
r1cl
-r1ç
-4r1d
+2rd
rd2ac
r2daf
r2d1ak
@@ -17331,31 +18551,33 @@ rd1ara
rd1ark
r2darz
rdär2
-r3de.
r3dee
r2dei
rd2ei.
r2d1elb
r2de2le
r2delf
-rdem6
+rdem4
rden3d
-r4dengl
-r4dents
+r2dengl
+r2dents
rde3ob
rde3ono
rde3r4er
-rderin6s
-r4d3ernt
-r3des
+rderin4s
+r2d3ernt
+rder3w
rde3sp
r2d1e2x
+rdie3ne
+rdien4s
+rdiensta4
r2d1inn
rd1iri
rd1ita
r2dof
r3don
-rd3oss
+rd1os4
rdo4st
r2d1oz
r2dö
@@ -17364,44 +18586,51 @@ r2drau
rd3ris
rd4rö
r3d4rü
+rd3s2a
rd2sän
rd3s2k
rd3s2z
-rdt4
rd3t2a
rd3th
+rdt4r
rdt2s
r2d1uk
-rdwa6r
+rduns3
+rdwa4
1re
3re.
-rea2d
-rea6l5erw
+re2ade
+rea4l3erw
4re2am
+re3as
re3at.
re3ats
reatu3
2reä
re2b1a
re2b1l
-reb1r
-reb3ra
reb3so
rech3ar
4rechs
+rechter4
+2rechth
2reck.
2recki
+reck2st
+re4ct
3red.
re3da
4redd
-2redi
+re2del
+rede3r2
+2redi1
re2dik
3redn
3redu
re1ebe
re1el
re1em
-ree4mi
+re1eng
re1er
3refe
4reff
@@ -17409,99 +18638,103 @@ r2eff.
3refl
3refo
3reg
-rege4l3ä
-regene7ra
+rege2l3ä
4r1egg
re3gi
re2hac
re2h1ar
-re4hen4e
-re4h3ent
+re2h1ei
+re2hen4e
+re2h3ent
re2hi
reh1l4
re2h1o
re3hol
3rehö
+2rehr
+reh3re
+reh1ro
reh4th
re2hü
r2ei.
r2eib
+rei2bei
rei4bel
-rei4ble
+rei2ble
+reib1r
+rei2bra
r2eic
-2reid
+2rei3d
r2eie
4reier.
-rei4fei
-4reifel
+reier2t
+rei2fei
2reig
3reigä
3reigeh
-r4eigel
-6reigens
+r2eigel
+4reigens
3reigi
4reign
3reigru
+r4eih
rei3l2a
rei3l2i
2r1eilt
-3reim
reim2p
r1ein
2rein2a
rei3nal
2reinb
-rein4du
-rei3n4e3c
-reinen5
+rein2du
+rei3n2e3c
+reinen3
2reinf
rein4fe
-re4info
+re2info
2reing
2reinh
4reinn
4r3einr
2reins
4reinsa
-rein6sel
-rein8s7tre
+rein4sel
rein4sz
2reint
-rein6teg
re1in2v
2reinw
2reinz
-4reisar
-4reisb
+2reisar
+2reisb
reises4
2reisf
2reish
2reisr
-reister6
4reisu
+2reisv
2reisw
reit3s2
3rek
4re2ke
4rekk
-5rekn
2rekz
r2el.
r2ela
re3lat
2relb
rel2e
-relea4
+relea2
re5lei
re2lek
4relem
r2elev
2relf
+reli1
2relit
2relix
r2ell
-rel4lar
-rel4lei
+rel2lar
+rel2lei
re3lo
r2els
2relt
@@ -17510,9 +18743,10 @@ relu2
2r1emb
rem2da
re2m1ei
-re3men
+re5men
2remi
re3mig
+r2emit
2rempf
rems1c
rem4str
@@ -17528,34 +18762,39 @@ re2nä
2r1endg
3rendi
ren3dr
-4renerg
-4rengag
-ren4gan
+2renerg
+2rengag
+ren2gan
2rengp
3renh
re2ni
+re3nik
3renm
-ren4nar
-ren6nene
+ren2nar
+ren4nene
+renns4
renrü2
-ren6sein
+ren4sein
rens2p
+r4ent.
2rentd
-6rentera
+4rentera
2rentf
3rentfo
2rentg
-r3enthä
2r1entl
+rentmo4
2r1ents
-2r3entw
+3rentss
+2rentw
2rentz
r2enz
-ren6z5er6f
-renzer6l
-ren6z5er6s
-renzer6w
-ren4z3in
+ren2zan
+ren2zer
+renzer4f
+renz3er4s
+renzer4w
+ren2z3in
ren2zw
re2ob
re3or
@@ -17570,100 +18809,98 @@ re2pis
3r2er.
rera2
2r1erb
-3r4erber
+3r2erber
rer2bi
-2r1erd
rere2
-4r3ereig
+2rereig
r1erek
re2r1ep
-r2erer
+3r2erer
r1erf
-r3erfa
4rerfah
+r4erfe
2rerfi
2rerfo
r2erfr
-rer2fü
+r3er2fü
r1erg
-4r3ergeb
-5rergebü
-r4ergen
-3r4erges
+2r3ergeb
+3rergebü
+r2ergen
+3r2erges
2rer2go
rer2gr
-r4ergru
+r2ergru
r1erh
rer2hö
+re2rid
r1erk
-rer4kan
+rer2kan
rer2ke
4r3erken
3r2erki
3r2erko
+r2erkre
r1erl
2r3er2la
5r4erlag
-r3erleb
+2r3erleb
r2erli
2rerlö
-2r1erm
+r1erm
+3rermo
rer2n
2r1ernä
-r1erne
-2r1erni
+r1er3ne
+2r1er4ni
4r3erns
-4r1ernt
-re1ro
-re2rob
-re4rosi
+4r3ernt
+re2rosi
2r1er2ö
r1erre
rer4reg
-rer4rei
+rer2rei
r1erri
-5r2ers.
+3r2ers.
2r1ersa
-rer3sc
-r6erschi
r2erse
2rersp
-rer2st
-r6erstad
+rer2spa
+rer2sta
+r2erstr
2rer4su
r1ert4
r2erte
2rertr
r1erw
-2rerwa
-rer4wac
-rer4wec
-r4erwes
+2r3erwa
+rer2wac
+rer2wec
+r2erwes
2r1erz
rer2zä
3r2erzy
3r2es.
re2sa
re4sam
-resche4
-re4schw
-3rese
-re4se2h
+resche2
+re2schm
+re2schw
+rese2h
re2s1of
3resol
3reson
re2spa
-res2po
2ress
4resse
res3sei
-res6s5erw
+res4s3erw
4ressu
re1sta
res4tas
-res6tent
-res4tex
-2res4tu
+res4tent
+res2tex
+2res2tu
3resu
re2t1ak
2re2tap
@@ -17671,41 +18908,44 @@ re2tau
ret2e
2r1e2th
re2tra
-re4trol
+re2trol
re2u
reu4eri
reu3g2
2reul
re3uni
-2reur
-4reuu
+2r1eur
+reu2zei
2reü
4r3eva
2r1evid
rewa4r
re2wi
-2rewo
+4rewo
2r1e2x1
3rez
2rezi
1ré
-4r1f
+2rf
rf1a2ck
r3fam
+rf3aue
rfe2i
r2fent
-r3f2es
+rfer3g
+rf2es
rff2
rf3fe
-rfi4le.
-r4fland
-r3f4lä
+rfi2le.
+r2fland
+rf4lä
rf3lic
rf4lö
+rf4lu
r3flü
r2fo2b
rfolg4s
-r4frauc
+r2frauc
rf4ru
rf4rü
rf2sa
@@ -17714,31 +18954,36 @@ rf2s1ä
rf2su
rf2ta
rft4r
-rf2u
-rfzu3
-2r1g
+r3f2u
+2rg
r2g1a2d
r2g1ah
r2g1ak
-rga4ner
+rga2ner
r2g1ap
r2garb
rg3art.
r2g1ask
+rg4at
rgd2
rge4an
rge2bl
+r3gebo
r2g1e2c
-r3gel
-r4gelef
-rge4l3er
-rgen4z3w
-r4ge4tap
+rg1ein
+rge2l3er
+rge2li
+rgen2ge
+rgen2z3w
+r3ges
+r2ge4tap
r2geto
-rgi4sel
+r3gew
+rg2ins
+rgi2sel
+r4gl.
r2glan
r3glanz
-rg5le.
r2gleu
r2glig
r2g3lit
@@ -17757,11 +19002,13 @@ rgö2
r2g1öd
r2g3ral
rg4rau
+r2grän
r2greg
r2g3res
r2gret
rg3rin
-r3grun
+r3grö
+r3gru
rg3rüs
rg3sä
rg3se
@@ -17769,33 +19016,40 @@ rgs2ei
rg4sel
rg3s2i
rg3sp
-rgs2pe
-rgs2po
+rgs4pe
+rgs4pi
+rgs4po
rg3st
-rgs4tr
rgs2tu
rg3su
-r1h4
+r1h2
2rh.
r2hag
2rhah
2rhak
-r4haltb
+r3halt.
+r2haltb
r3han
-2rhau
+r3has
+2r3hau
2r3hä
-3r2he.
+r2he.
r3hea
2rheb
2rhef
+rh4ei
+2rheit
+2rher
2rhi
+2rhof
+rho2i3
2rhol
r3hop
2rhot
2rhöl
2rhs
rhu2s
-2rhü
+2r3hü
1ri
ri3ams
ri1an
@@ -17806,28 +19060,29 @@ rib2bl
ri1ce
ri1cha
ri3chl
-richt8spo
-3richtu
+rich3ter
+richt4spo
+ri2cki
ri2con
ri2dau
-2ride
+r2ide.
+2ridee
ri2d3e2l
-ri4dent
+ri2dent
r2i3di
2ridol
2ridy
r2ie
+rie2fem
4riefm
rie2f3r
rieg4s3
ri2e1i
-riein1
ri1el
rie3l2a
ri3els
ri4enä
riene2
-ri3eni
rien3s
rie4nu
ri1er.
@@ -17836,36 +19091,37 @@ riere4n
ri3ers.
rie3sa
ri1eu
-ri2f1a
+ri2fa
ri2fä
ri2fei
-ri2fer
-rif6f5end
-rif4fer
+ri2fer3
+rif4f3end
+rif2fer
ri2f1o
-ri2fr
+ri4fr
rif3s
-rif4ter
+rif2ter
3rig
4riga
4r3i2gel
-ri4gene
+ri2gene
4rigg
-5rigj
rig1l
ri4glä
ri3g2o3
-4rigr
-4rij
+ri1i
+rii4t
ri2kar
ri2kä
ri2kin
ri2kn
-ri4kone
+ri2kone
rik2op
ri2kor
+ri4kt
+ri3kü
2rima
-ri2mag
+ri4mag
ri2me.
2rimm
4rimp
@@ -17878,10 +19134,11 @@ rin2c
2r1indu
ri3n2e
rine1i
+rine3s
2r1inf
-rin2fo
-3r2infr
+3rinfr
r2ing
+3ring.
rin2ga
ring3le
rin2gr
@@ -17889,24 +19146,27 @@ ring3sp
2r1inh
2rinit
4rinj
-4rink
+2rink
rin2kl
rin2ko
rin2kr
2rinl
-6r5innenm
-4r3inner
+4r3innenm
+2r3inner
2r1innr
r1innu
+ri3n2o3
2r1in2q
2r1ins
rin4si
rin2so
-r4inspi
+rin2spe
+r2inspi
+rin3stei
+rin3str
3r2insy
2rint
-4rinte
-rin6tent
+rin4tent
rin4t5re
2r1inv
rin2va
@@ -17916,55 +19176,58 @@ r3ion
ri3o2st
ri2pl
ri3po
-4r1ir
+2r1ir
r2is
ris2a
ri3san
-ri4sch3o
-ri4schw
+ri2scho
+ri2schw
3risik
ri3s2ko
r3iso
ri4s3p
+ris5pi
r3isr
3riss
ri4s3t
-ris6t5ers
+ris4t3ers
ris4th
rist3r
r2it
-r3i2tal
+2r3i2tal
rit3ant
rit2i
2ri3t4r
+rits2
ritt3a
-rit4tau
-rit6ter6f
+rit2tau
+rit4ter4f
rit4to
rit2t3r
+ritt2so
rit2u
-r1i4tum
+r3i4tum
rix1
1rí
-2r1j
-2r1k
+2rj
+2rk
rka2b3l
-rk1ah
+r2k1ah
r2k1ak
rk1all
rk2am
rk1are
rk1asp
-rkauf4s
+r2k1att
r2k1äh
-r3kel
-r4kelem
+r2kelem
+r3kell
rke2n1
-rken4er
+rken2er
rken3s4t
r2k1er2l
-rk5ersta
-r2k1er4w
+rk3ersta
+r2k1er2w
r3k2es
r3ket
rk1im
@@ -17973,8 +19236,10 @@ rk4lau
rk4lim
r2klis
rk2lo
-rk2lu
+rk4lu
rk4ne
+rk5neu
+rk5ney
r2kob
r3kol
r3kon
@@ -17993,20 +19258,20 @@ rk2sel
rk2ser
rk2so
rk2sp
-rkstati6
-rk4stec
-rk4stoc
+rkstati4
+rk2stec
+rk2stoc
rk2ta
rk2tel
rk4t3eng
rk4tent
-rk4t3erf
-rk4terg
-rk4t3erl
+rk2t3erf
+rk2terg
+rk2t3erl
rkt3ers
-rk6tersc
-rk4t3erw
-rk4t3erz
+rk4tersc
+rk2t3erw
+rk2t3erz
rk4teta
rkt2i
rk2t3in
@@ -18015,29 +19280,28 @@ rkto4b
rk2t3r
rk4tri
rk2tum
+rk4tü
rk1ums
rku2n
r3kup
rkur3s
-r3kus
rku2sa
r2küb
2r1l
rl2ab
r3lag
-r5land
-rlan4d3i
+rlan2d3i
r2l1ar
-r2l1a2sc
+r2l1a4sc
r2l3aug
rle2a
r3lec
-r5lei.
+r3leg
r3lep
rl2et
r3lex
-rlg4
r3l2i
+rlicht6e
rli4ne.
rli2s
r3l2o
@@ -18050,31 +19314,33 @@ rl3ste
rl2s5to
rl3t
r3l2u
+rlus6tr
r3ly
-rlz2
-4r1m
+rlz4w
+2rm
r2mab
r2m1ad
rma2la
rm1ald
+rmali3e
rm1ami
r2m1ank
rm1anz
r4m3aph
r2marc
r2marz
-rma4s3pe
+rma4spe
rmas3se
rmat2o
-rm2är
rm3d2
rm1ef
-r4m3einh
+r2m3einh
rme4na
rm2ene
r2ment
r2meo
-rmer4fo
+rmer2fo
+rm1erg
r2m1erh
r2m1erl
r2m1erp
@@ -18084,10 +19350,10 @@ rme1st
rmes4z
rmeta2
r2mide
-rmi6nanz
-rminen4
-rmi6neng
-r4mn
+rmi4nanz
+rminen2
+rmi4neng
+r3minh
r2m1ob
rmon3s4
rm1o2ri
@@ -18095,13 +19361,16 @@ rmo1s
rm3p2
rm3sa
rm3s2k
+rm3sta
rm3t
rmt2a
rmu2n
r4muna
r2muni
-4rn
+rmwa4
+2rn
rna2b
+rn3ab2i
r3nad
rn4ade
r3nage
@@ -18113,58 +19382,62 @@ r2nanz
rna2r
rn3are
r4n3ari
-r4n1ast
+rn3arra
+r4n1a2st
r4n3att
-r2nau
rn3aug
-rnd4
+rnd2
rn3de
-rn3dr
-r4nef
+rn3d4r
+r2nef
+r3neho
+r3nei
rn2eid
r4neif
r4neis
+r2n1elf
rn1ema
+r2nemu
rne2n
r2n1ene
rn2eng
-r4n1e2p
-r4n1erg
-rn4erhi
-rner4ke
-rner4ku
-r4n1erl
-r4n1ert
-r4n1erw
-r4nerz
-r5nes
-rn2e2t
+r2n1e2p
+rn1erg
+rn2erhi
+rner2ke
+rner2ku
+r2n1erl
+r2n1ert
+r2n1erw
+r3nes
+r3n2e2t
rnet1e
-rne4tem
-rne4ter
rne4to
+rnet3r
rn2eu
rne3uf
-r4nex
rn3f
rn3g2
-rngene4
r2nid
r2n1in
r4ninf
+rn2ing
r3nit
rnk2
rnn2
+rn1ob
+rn2obr
r3nod
rn2oh
r2n1op
r2n1or
+rno2w
rn1ö
rnö2d
rn3sa
rn3s2ä
rnse4ha
-rn3s4p
+rn3s2p
rns2u
rn3s2z
rn3t2a
@@ -18173,9 +19446,11 @@ rn1ur
r1nü
r1ny
rnz2
+ro3ar
+ro3as
r2oba
2robj
-1robo
+1r2obo
ro2bo2r
2robr
ro2bre
@@ -18184,10 +19459,12 @@ ro1c
roch2a
3rock.
r2o3de
+rodi4e
rod4r
-roe4
+roe2
+ro2ed
+ro4fen
2roff
-ro3fl
4rog.
ro3g2a
3rogg
@@ -18199,22 +19476,26 @@ ro2hö
1roi
ro3in
ro1ir
+ro2it
rok2l
ro3le
ro2liv
-rol4lan
+rol2lan
rolle4
-rol6lerg
-rolls2
+rol3len
+rolls4
+r4olo
rol3s
2roly
4rom.
-ro2mad
-ro2mal
+ro4mad
+ro4mal
3roman.
2romb
+ro4mei
romen3e
-ro2m1er
+ro4m1er
+ro5mes
4romm
2romn
rom3s
@@ -18223,53 +19504,60 @@ r2on
ro3n4ab
ro2nan
3rond
-ro4nerb
+ro2nerb
+roni2e
+ro2nika
+ro4niki
4ronk
3ronn
-rons2
ron4tan
-ron6tend
+ron2tel
+ron4tend
ron4t3r
ron2t1u
ro1ny
-ro1o2f
+ro1o4f
rop2a
2rope
2ropf
1ropl
+ro3pn
2ropt
r1or
ro2r3al
ro2rat
2rorc
ro2rel
+2r3orga
ro2ro
ror3th
rort2s
ror2ü
+ro3se
ro3sh
-ro5s2i
+ro3s2i
+ro5sin
ros4ko
+ros4p
+ros6sac
ros4sal
ros4san
ros2s1c
-ros6senk
+ros4senk
ros4st
ro1sta
-ros6t1r
+ros4t1r
+ros6tri
ro2sum
4r3osz
-4roß
roßen2
ro4ßenk
-ro2ßi
+ro4ßi
ro2tan
ro4tas
ro4t3au
ro2tä
-ro2te3i
-ro2t1ho
-ro2tru
+ro2tei
rot3s
rots2o
rot2ta
@@ -18277,11 +19565,12 @@ ro3tu
3roul
ro3unt
3rout
-2ro1x
-4roy
+ro5win
+2rox
rö2b3l
rö2du
-2rö2f
+2röf
+rö4fe
3röh
2r1ök
1röl
@@ -18296,23 +19585,29 @@ rös1c
r2öse
1rösl
3rötu
-2r1p2
+2rp2
r3pa
-r3pe
+rper1e
+rperer3
rper3in
-rpf4
+r3pf2
+rpf4l
+rp4fu
r2pli
rp4lu
r3po
+rp4rä
+r3pri
rpro1
+r5prod
+r3prü
rp3se
rps3t
-r4p3t
+rp3t
r3pu
-2r1q
-4r1r
+2rq
+2r1r
rr2ab
-rr4at
rrat2s
rr1auf
rr1äm
@@ -18320,159 +19615,174 @@ rrb2
rr1c
r5rega
r5regi
+r5regl
rr2ei
rre2le
rre2pa
rrer2
r2rerh
r2rerl
-rrer4s
-r3res
rre2ve
r4rezi
-r3r2hen
+rr2hen
rr2hos
-r3r4i
+rri3erm
rri3k2
+rr4is
rrm2
-rrn3au
+rr2n3au
rr2o
rr3obs
-rro3m
-rro2re
rrr2
rr2st
+rr3sto
rr3str
rr3stu
rr2th
r3r2u
r3r2ü
+rrücker4
rrz2
-6r1s
+2r1s2
+rs3ab
r3sabo
-r2s1a2d
-rs2al
-r4samp
-r4s1amt
-rs2an
-r4sanf
-r2s3ang
+r2s3a2d
+rsa4lin
+r4s3amp
+r4s3amt
+rs3ana
+r2sanf
+rs3ang
rs3anm
-r4sanp
rs3ant
rs3anz
rs3ar
-rs4ark
-r4sarm
-r4sch3e4b
-r6scherl
+r3s4ark
+r3sau
+rs4au.
+rs4aue
+rs3äm
+rsch3e2b
+rscheiner5
+r3schen
+r4scherl
r3schu
-r2s1ebe
+r2s3ebe
rse2e
-r2s1ef
-r2sein
+r2s3ef
+r2s3ein
rse2n
-rs2end
rse4ne
r2sepi
-rs1ere
-r2serh
-rs1ers
-r2serz
+rs3ere
+r2s3erh
+rs3erö
+rs3ers
+r2s3erz
rse2t
-rs1eta
-rs2ext
-r3s2hav
+rs3eta
+rs3eth
+rsha4k
+r3shav
+rs3hi
r3shir
r3sho
-rs2hor
r4shu
-rs2il
-rs2ka
-rs2kel
-rs2ki
+rs3inf
+rs3ins
+rs3k
+rs4kal
+rs4kan
+rs4kel
+rs4kie
r4skir
-rs2kl
+rs4kis
+rs4kla
+r4skn
+rs4kop
r4skor
r3s4kri
r4sky
-rs4mog
-r3s4no
+rs3l
+r3s4mog
+r3sno
r3so
-r4sob
+r4s3ob
rs4om
-r4s1op
-r4sorie
+r4s3op
+r4sord
+r4s3orie
r4s3ort.
rso2s
-rs1ost
-rs2p
+rs3ost
r3span
-r3spe
+rs4pel
r2s3ph
+r3sphä
r3spi
r3spl
-rs4por
r2sput
+r3spü
rs3s2
+r4st.
rst3abl
r3stad
rst3ala
-r4stale
-r4stans
-r4stant
+r2stale
+r2stans
+r2stant
r2stas
-r7stati
-r7statu
+r3statu
r3stä
-rst5eing
-r6st5eint
-rst3emi
+r3sted
+rst2ei
+rst3eing
+rst3eint
+rs4t3emi
rs4temp
+r4sten
rster2
-rs4t4erb
+rst2erb
rst3erl
-r3s4tern
-rst3erw
-rs2tev
-rs2t1h
-rs2ti
+r3stern
+rst3er4w
+rst1h
r3s4tie
r2stin
rst3ing
r3stink
r2stip
r2stit
-r3sto
rs4tob
-rs4tol
rs4tor
-r4stot
+r2stot
rs4tr
-r3stra
-r6strang
+r2stran
rs5tren
-rs2tu
rs4tuc
r3s4tü
-rsuch4s
-r3suf
-rs2ums
+rs3uml
+rs3un
+rs4ung
r3sy
-r1ß
-4r1t
+r4szä
+rs3zi
+rs4zin
+2rt
r2tabo
rt1abs
rta2ck
r2t1a2d
r2t3ae
+rt1aff
+rtag4s
rt1akr
-r4t3albe
+r2t3albe
rta3l2e
r2t1all
-rtal4s3e
+rtals1
+rtal2se
rt1am
-rt2ame
rt1ann
rt1ant
r2tanw
@@ -18482,14 +19792,16 @@ r2taut
rt3äh
rt1änd
rt1ärm
+r3tea
rte1e2
r3teh
rt1ein
-rt4eind
+rt2eind
r4t3einh
-rte2i1s4
+rte2i3s4
r2telf
-rtels4t
+rtels2t
+rtem4e
r2temo
rte2n1
rte4na
@@ -18497,26 +19809,25 @@ rten3s4
r4t3ents
rten3z
rteo2
-rt3erei
-r6tereig
-r4ter4fa
-r4ter4fo
+rt2ep
+rter2fa
rt1erh
+rter2ha
rt1erk
-r4t3er4la
-rter6mit
-r4t3ernä
+r2t3er2la
+rter4mit
+r2t3ernä
r2ter2ö
rter4re
rt1ers
-rt4ersp
+rt2ersp
rt1erz
rte3sk
rt1he
-r2thel
r2t1hi
rt2hum
r2t1id
+rti2en
rtik2
r2t1ima
r4t3inf
@@ -18525,15 +19836,17 @@ rt2it
rt3l
rt3m
r2t1ob
-rto1pf
+rto3pf
rt1orc
r4torg
+r5tork
r4trak
+rt3ram.
rt3rams
rt3rand
rt3rati
rt3rec
-rtre1s
+rt3re1s
r4t3ris
rt3rol
rt3roma
@@ -18541,24 +19854,28 @@ r3trop
r2trou
rtrü2c
rt3sc
-rt4s1eh
+rt2s1eh
rts2el
rt3sex
rts3ing
rts1o
-rts1pa
-rt4s3tan
-rts4tie
+rts2tie
rt2su
-rt3t4
+rt3t
+rtt4r
rt1umb
rt2u3na
r2t1urt
rtu4t
r2t3ute
r3tü
+r4tüb
+rt3w
rty1
-rt3z2
+rt3z
+rtz2a
+rt4zb
+rtz4w
1ru
ru1a
ru4ale
@@ -18567,17 +19884,22 @@ rube4
ruben3
rubens4
rub2i
-rucht3s4
-ru6ckerl
+ruchter4
+rucht3s2
+ru2cka
+ru4ckerl
ru2cku
+ru3de
rude2a
ru2dr
ru2et
3ruf
-ru2f1a
+ru4f1a
ruff4
+ru4fo
ruf2s
-ruf4ter
+rufs3p
+ruf2ter
ru2g3r
3ruhm
2r1uhr
@@ -18587,103 +19909,112 @@ ru1is
2rum
ruma2
4r3umd
-4r3umf
-4r3umg
+4rumf
+4rumg
ru2mi
-4r3uml
+4ruml
+r2ums.
4r3umsa
-4r3umw
+4rumsc
+4rumw
4rumz
2r1una
2rund
run4d1a
-runden5e
-run4d3er
-run2e
-runei2
+runden3e
+run2d3er
+runder4n
+runder5t
+run2do
+ru3nei2
+2r1unem
+run2en
4r1unf
run2ga
2rungl
+run2gla
4r1u2ni
r3unio
ru4nis.
run2kr
-4r1unl
-2r1unm
+2r1unl
+2runm
4runn
4runr
r1unse
4r3unt
4runw
2rupd
-ru3pr
-4r1ur
+rupi3
+ru5pre
+2r1ur
ru2ra
ru2r1e
-5ruro
r4us.
-ru2si
-rus2p
-rus2s1p
+rus4p
+rus2s3p
rus4st
-ru2st
ru2tab
rute4
ru4tei
ru4t1el
ru2t1er
-ru4t1o2
+ru4t1o4
ru2t3r
-rut6scha
-4ruz
-ru2z1w
+ru2z3w
1rü
2rüb
+rü4bc
+rü4bs
4rübu
rü1ch
-rü4ckel
+rü2ckel
+rück3sta
rü2hel
rüher2
rüh1l
4rümm
+rü4na
rün3z
-2r1v
-r3ve
+2rv
rv2el
rve4n1e
-rvenen4
-r4ventz
+r2ventz
+r3veo
+r3ver
rve3s
r3v2o
-2r1w
+2rw
rwe4gel
-r3wei
-rwelt4s
-r5werk
-r5wert
+r5weis
+rwelt2s
+r3werk
+r3wert
r2wo.
r3woh
r3wort
rwun3s
-4r1x
+2r1x
1ry
-2r1ya
+2r1y2a
ry2c
rygi3
ry1la
ry2le
ry1os
ry3sth
-rysti1
-2r1z
-rz2an
-rz3ant
+rysti3
+2rz
+rz2ans
r2zar
r2zat
rz2än
-r5zene
+r3zeic
+rzell2
+r3zene
rz1eng
-r4zents
+r2z3ente
+r2zents
rze2p
rze2ra
r2z1erd
@@ -18691,9 +20022,10 @@ r2z1erf
r2z1erg
rz1erk
r2z1erl
+rz3ersc
r2z1erw
r2z1ess
-rz1id
+r2z1id
rz1int
rzir3
r3z2of
@@ -18702,8 +20034,8 @@ rz2tan
rz3te
rz2th
rzu4g3l
-r2zwä
-r3z2wec
+r3z4wec
+rz4wer
r2zwir
1sa
3sa.
@@ -18711,19 +20043,19 @@ r2zwir
2s1ab
sab2ä
4sabd
-sa2be
+sa2ben
3sabet
sa2bit
sa2bl
4sabm
-sa2bor
sa2br
-4s3abs
+4sabs
+4s3a4bw
3sac
4sacc
+sa3chal
5sache
sa2cho
-sachs2
sach3t
s2ack
2s1ada
@@ -18732,58 +20064,58 @@ s1adm
2s1a2dr
3safa
sa4fe
-4s3aff
-sa1f4r
+4s1aff
+sa3f4r
3s2aft
saf4tr
3saga
sag2e
-5sage.
+5sa3ge.
5sagen.
-4s3agent
+2s3a2gent
2s1agg
sa2gio
-sag4n
s1a2gr
+sah3l
s2ahs
3s2ai
sa3i2k1
sail2
sai4r
2s1ak
-sa2ka
+sa4ka
+sa5ka.
+sa5kar
sak2e
3saki
-4sakk
3sako
4sakt
+sa4kus
3s2al.
3s2al2a
sa2l3an
-sa2lar
-sa3lat
+sa3l4at
+sal2ä
3s2alb
sal3bl
3s2ald
-sa4lerk
-3sali
-sa2l1id
+sa2lerk
+3sa3li
+sa4l1id
s1all
sal3la
-sal4le.
-3sal2o
+sal2le.
+3s2al2o
sal3or
sal2se
s1alt
-s2al3t2h
+s2alth
3salz
3sam
-4s1a2mat
-4s1a2mei
-s2amen
-sa2min
-5samm
-6s1amma
+4s3a4mat
+4s1a4mei
+sa4min
+4s1amma
4s1amn
s1am3p4
4samph
@@ -18792,66 +20124,65 @@ sam4to
samt3st
s1an
s2an.
-2s3a2na
+2sa2na
san4at
sa2nä
2s3anb
s2an2c
3s2and
s4and.
-san4dan
-san4d3ri
+san2dan
+san2dri
sand3s
sa2ner
3sang.
-4sanga
+2sanga
2s3anh
3sani
3sanken
-2s3anl
+4s3anl
2sa2no
2s3anp
2s3ans
s4anse
san4sk
san3sp
-4santei
+2santei
4s3antr
-4s3anw
+2s3anw
2sanz
2s1ap
sa2pe
s2aph
+sapi3
sap3p
3sapr
-2s1aq
+2s1a2q
2s1ar
3s4ar.
3sara
4s3arb
3s2ard
s2are
-s3area
+4s3area
3sarg
sar2ga
sa3rin
-s2ark
sa2rom
s2ars
-4sart
-sa4r1u2
+4sarti
+sa4r1u4
3sas.
sas2a
s1asc
s1a4si
2s1a4sp
-sas2tu
4sa2sy
sat2a
satan4
-sa4t3ant
+sa2t3ant
sat1ei
-2s3a4tem
+2s3a2tem
s3ath
3sat2i
4s3atl
@@ -18861,11 +20192,10 @@ sa4tol
sa2tr
sa3ts
s3atta
-4s3attr
-3satz
-5satza
-sat4zel
-sat4z3en
+4s1attr
+3satza
+sat2zel
+sat2z3en
s1au
3sau.
3sauc
@@ -18877,6 +20207,7 @@ saug3le
sau2gr
3saum
3saur
+4s3aura
sauri1
2saus
3saus.
@@ -18885,13 +20216,12 @@ sauri1
4sausg
sau2sp
4sauss
-3sauste
4s3ausw
2sauß
s1av
sa2ve
sa2xi
-sa2y1
+sa2y
1sä
3säb
3s2äc
@@ -18902,17 +20232,30 @@ s1äh
4s1ält
2s1äm
4s3änd
-4s3äp
+2s3äp
2säq
2s1är
3s2ärg
+4s3ärm
3s2ät
3säul
4säuß
-4s3b4
+2sb2
+s3ba
sba4ne
-sbau6men
+sbau4men
+s3bä
+s3be
sber2e
+s3bi
+s3bl
+s3bo
+s3br
+sb4ra
+sb4ri
+s3bu
+s3bü
+sby3
1sc
2sc.
2scab
@@ -18924,181 +20267,194 @@ sber2e
2s1ce
4s3cei
4sch.
-3s4chal
+3schaf
+s4chal
sch3ana
4schanc
-4schang
+2schang
4schao
4schara
-4sch3ar5m
+sch3ar3m
s2chä
2schäq
4schb
4schc
2schd
sch2e
+3sche.
4schech
sche2f
-6schef.
-6schefi
-6schefs
+4schef.
+4schefi
+4schefs
s4chei
4sch3ei.
-sch6ein.
-s4chema
+sch4ein.
+s2chema
4schemp
-sch5erfü
-sch5erla
+sch3erfü
+2scherk
+sch3erla
3sches
-4schess
+4sches4s
4schex
2schf
2schg
2schh
-schi4d
-schi4e
-4schiru
+2schi4d
+2schiru
3schis
+2schj
2schk
s4chl
sch4lac
-sch4lag
-4schle.
-6schlein
-4schloc
-4schlöc
-4schmas
-4schmed
+2schle.
+4schlein
+2schmed
2schmö
-4schmüh
2schmy
+s4chn
2schn.
-4schneb
-4schobj
-4schorc
+2schneb
+2schnum
+3schop
+2schorc
4schör
4schp
2schq
-4schrad
-4schre.
-4schrin
+2schrad
+2schre.
+2schres
+2schrin
4s3chris
sch3rom
-4schron
-4schrou
+2schron
+2schrou
+2schrus
4schs
-schs2e
+sch3s2e
sch3s2k
-schs4ti
+schs2o
+sch3s4ti
4sch3t
scht2a
scht2i
s4chu
-4schunt
+2schunt
+s4chü
2schv
+s4chw
sch4web
-4schweg
-6schwerk
-4schwet
-4schwid
-3schwu
+2schweg
+4schwerk
+2schwet
+2schwid
2schz
2scj
-4s3cl
+2s3cl
2s3co
4scoa
-3s4co2p
-scre4m
+4scom
+3s4co4p
+s2cor
2scs
2scu
2scy
-4s3d2
-sda3me
+2sd2
+s3da
+sda5me
+s4daq
+sdä1
+s3de
sde1s2
-sdien4e
+s3di
+sdie3n2e
sdi1st
+s3do
+s3dr
+s3du
1se
-3se.
+sea2n
se3at.
seb2
3sebä
2s1e2ben
2s1echo
-sech4st
+sech2st
2s1echt
2s1e2ck
se2dik
3see
see1i2
-see3ig
+se2e3ig
se2el
+se3elem
see3len
se3en.
see3n2e
-se3enp
-se3er.
+se1eng
+se1enk
+se1enl
+se1enp
see1ra
-seer2e
+seer4e
se1erf
se3e2r1i
se1erk
-se1ers
-see3s4
-2s3eff
+se2e3s4
+2s1eff
sef4l
3s2eg
4s3e2gal
se2gl
seg4r
-3seh
seh1a
-se2hag
+se2ha2g
se2hak
se2hel
-seher4e
-se4herk
+seher2e
+se2herk
se2h1in
seh3l
se4h3ö
seh3ra
seh3re
-seh5r2i
+seh5ri
seh1s
+se4ht
+seh1ur
se2hüb
-2sei.
-2s1eic
+2s1ei.
2s1eid.
sei3da
-4s3eifer
+2s3eifer
2s1eig
-3seil
s2eim
s1ein
-5s4ein.
+3s4ein.
2seinb
-sein4du
+sein2du
2sei3n2e
seine3i
-4seinfl
+2seinfl
sein4fo
2seing
-2s3einh
+2seinh
2seini
2seink
2seinl
2seinn
sein4ne
2s3einr
-s4eins.
-4seinsc
-4seinsp
-sein8stit
-sein6str
+s2eins.
+2seinsc
+sein4stit
+sein4str
2seint
sein4to
4seintr
2seinw
-2s3einz
+2seinz
2s1eis
3s2eism
3s2eit
@@ -19113,27 +20469,27 @@ sel3d4
sel1ec
se2lef
2s3e2leg
-6selektr
-2selem
+2s3elem
se2ler
sel3ers
2self.
-selin4s
+selin2s
s3e2lit
2s1elix
-s2ell
+sel3m
+s2eln
se2lob
s2els
sel3sz
selt2e
-selz2
sem2e
2s1e2mis
2s3emp
s4en.
3sena
-se4nad
+se4na2d
se3nal
+sen2alg
se4nas
sen3au
se2nä
@@ -19143,28 +20499,28 @@ sen3d4r
s1endw
senen1
4senerg
-se4ners
s2enf
3s4eni
se2nid
se2n1im
3s2enk
-sen6keli
+sen4keli
se2no
se4nott
se4noz
-3sens
s2ensa
-sen4s3e4h
+sen2s3e2h
4sensem
+sen4sers
s4ensi
-sen4si4d
+sen2si2d
+s2enso
senst2
-sen8s7turm
-sent2a
+sen4s5turm
+sen3t2a
sen3tä
2sentd
-4sentf
+4s3entf
2sentg
4sentla
2sentn
@@ -19177,42 +20533,47 @@ sen3tr
4sentz
se4n3u2
sen3za
-sen4zer
+sen2zer
sen3zw
seo2r
+3sepa
se2pen
+s1epi
3seq
-s4er.
+3s4er.
se2r3a2d
ser3al
se3rand
+se1ras
ser3äus
serb2
s3erbe.
serd2
se2r1e2b
+se2r1ed
se3reie
-6sereign
-se4r3eim
-se4rein
+4sereign
+ser3eim
sere2m
-5s4eren
-se4r3enk
+5seren
+se2r3enk
+ser3ent
s4erfe
s1erfo
s2erfr
-s3erfü
-4serfül
+s1erfü
serg2
ser3ga
ser3gl
s2ergr
-s1erh
-2serhö
-3seri
+2s1erhö
+se2rid
5serie
+se4rinf
serk4
-4s3ermit
+se4rm
+ser4mah
+2s3ermit
s2ern.
s3erneu
2s3ernt
@@ -19221,85 +20582,121 @@ sero4b
s1erot
s1erö
2seröf
-s2ers.
+ser3r
+s4ers.
2sersa
-4serseh
-ser6sehn
-4ser4set
-se3ru
-se4ruh
-ser2um
-s3e4rup
-5s4er3v
+2s3erseh
+s3erset
+sers4p
+se3rum
+ser2um.
+se3rund
+se3rung
+s3e2rup
+3s4er3v
s1erz
-3s4es.
-se3s4a
+3s2es.
+se3s2a
se2sel
se3sk
2s1essa
se1sta
se3stec
se3stei
-se5stemp
-sest3ri
+se3stemp
+se1sto
+se1stu
se3su
4s3e4tap
se2tat
2s1e2th
set2i
4s1e2tik
+se3tun
3setz
3seuc
2s1eul
-seum4
+seum4sc
se1u2n
+se2va
+4s3evan
s1ex
3sex.
2sexa
+sex4am
se2xe
sex3en
s2exi
s2exo
-4sexp
+4s3exp
sex3t4r
+3sexu
2sexz
1sé
-4s3f4
-sfal6l5er
-4s3g4
+2sf2
+s3fa
+sf4ak
+s3fe
+s3fi
+s3fl
+sf4la
+sf4lö
+s3fo
+s3fö
+s3fr
+sf4ru
+sf4rü
+s3fu
+s3fü
+2sg2
+s3ga
sgang4
+s3gä
+s3ge
+sgeha2
+sge2h3ab
sge3sa
-sge5t
+s3gi
+s3gl
+s4gl.
+s3gm
+sg4mü
+sg4na
+s3gö
+s3gr
+s3gu
+s3gü
2s1h
-4sh.
sh2a
3sha.
-shal4li
+s3halb
+shal2li
shalt2
-shalt4s
4shan
+s3hau
s3hä
-sh2e
+s3h2e
sh2i
-3shi.
+3s4hi.
s2hip
shi4r
sh3n
4s3hoc
4s3hof
+s3hoh
+s3hol
4shom
-3shop
+3sho2p
sho4re
3s4how
-4s3hö
-sh4r2
-4shs
+s3hö
+sh2r2
+sh4re
s3hu
1si
-3si.
si3ach.
2siat
-5s4i1c
+3si1c
si2cha
2s1idea
2sidee
@@ -19307,28 +20704,30 @@ si2cha
si3der
s2i3do
2sidy
-3s4ie
+3s2ie
+sieben3s4
sie2bu
-siege4s
+siege2s
sien3
si3ene
-si1err
-si1f4
-3s4ig
+si3f
+sif4l
+3sig
si2g1a2
si2g1ei
sig4n
si2g3r
sig4st
si2k1ab
+si2k1a2g
si2kak
si2kar
si2k1ä
si2k1el
-si4kens
+si2kens
+si2k3er4b
sik3erl
-si2k3i
-sikin1
+s4i2k3i
si2k3n
si2k3r
sik3s
@@ -19341,39 +20740,39 @@ sil2e
s1ill
3silo
2s1imm
+2s3impf
sim4st
-3simu
+3s4imu
si3n4a
2s1ind
+si3n2e
2s1inf
-4s3infe
-s3infor
+4sinfe
sing1a
sin3g4le
sin2g3r
-sings2
-sing3sa
-sing3so
-2s1inh
+sing3s2
+2s3inh
s1in1i
sini1e
s2ink
-sinner4
+sinner2
2s1inno
4s1inq
2s1ins
4sinso
4sinst
2s1int
-4s1inv
+4s3inv
sion4
+s2ire
sirn4
2sirr
3siru
si2sa
si4sam
s2isc
-si4schu
+si2schu
si2s1e2
si2si
s1i2so
@@ -19387,57 +20786,67 @@ si2tal
si2tau
si2tra
sit2u
+sit4zerg
si2va
sive3
siver2
-si4v3erf
+si2v3erf
si2vin
siv1o4
si2vor
siz2
1sí
-4s3j
-2s1k2
-4sk.
-sk4a
-4s3kab
-s3kad
+2sj
+s3ja
+s3je
+s3ju
+2sk2
+s3ka.
+4skab
+sk4al
4skalk
s3kalt
-4s3kam
+4skam
4skana
4skanä
3skanda
+skani3e
4skann
+s3kanz
4skap
4s3kar
4s3kas
+sk4at
ska4te.
4skateg
+s6kater
ska4tes
ska4to
4skau
-4s3kä
-4skb
+s3kä
ske2li
-4sken
+4ske2n1
3skep
4sker
-4s3ket
s3kh
-3s2ki.
-3s2kif
+3s4ki.
+s4kia
+3s4kif
+s4kig
3s2kik
s3kim
-s3kin
+s4kip
ski1s
s2kis.
3skiz
-sk4l
-4s3klas
+4s5klas
+sklat3
3s2klav
-4s3klu
-4sk4n
+sk4le
+4sklu
+s3kn
+sk4na
+sk4ne
4skoh
4skol
4skom
@@ -19446,29 +20855,27 @@ sk4l
sko2pr
4skos
4skow
-4s3kö
-sk4r
+s3kö
4s3kra
-s3kre
+s3k4re
+3skrip
4s3kro
-4sks
-4sk3t2
+sk3t2
skto2
3skulp
4skun
sku2s1
-4skü
-4skv
+s3kü
2s1l2
-sl4a
s3lab
3slal
-sla2ma
+sl4am
+sla4ma
sla2ve
s2law
s3lä
sl3b
-4s3le
+s3le
sler3s
s3li
3s4lip
@@ -19476,31 +20883,46 @@ slo3be
s3loc
s4loga
3s2low
+s3lö
s3ly
-4s3m4
+2sm2
+s3ma
sma3b4
sma3sc
+s3mä
+s3me
+s4me.
sme3na
+s3mi
smi2t3
-2s3n2
+s3mo
+s3mu
+s3mü
+2s1n2
+s3na
snab4
+s3ne
+s3ni
sni4a
sni3er.
sni3ers
-4s5not
+4s3not
+s3nö
1so
3so.
2s3oas
2s1o2b
3s2o3ba
4sobj
-4s3obo
+4soboe
so1c
-so2di
+so3ck
+sodi4
so2do
so3et
-2s1o2fe
-2soffi
+2s1ofe
+so4fen
+s3offi
3soft
3sog
sog4l
@@ -19509,9 +20931,9 @@ s1o2he
sohle2
2s3ohng
2s1ohr
-3soi2
+3soi
so3id
-2s3ok
+2s1ok
3sol.
so3la
so4lau
@@ -19520,40 +20942,43 @@ so4lau
so2l1ei
so3li
sol2la
-sol4ler
+sol2ler
+3solm
so3l2o
-4s3o2ly
+so3lu
+4s3oly
+2s3omb
3somm
3s2on
son2a
son3au
-sone2
+sond2
+sone4
+sonen2d
son4gl
son3sä
son2s1o
so3o
-2sope
-2s1opf
+so2pe
+s1opf
3sopr
sop3s
-4s3ord
+2s3ord
sore2
-so2rei
so2rel
-4s1orga
+4s3orga
so1rh
2s1o2rie
so2ro
3sorp
3s2orti
so4ru
-3sos
-s2os.
-4so4sk
-4sosm
+3s2os
+4s3o4sk
+4s3osm
4so1st
-4s1osz
-3so3ß
+4s3osz
+3soß
2sot
so3t2h
3sott
@@ -19562,88 +20987,92 @@ sound1
so3unds
so3unt
2s1out
-3sov
3sow
2s1o2x
-3soz
-s1oze
+2s1oze
1sö
sö2c
2s1ö2d
-2sö2f
+2söf
+sö4fe
2s1ök
2s1öl
2s1ös
1sp2
2sp.
+s3pa.
4spaa
-s2pace
-2spack
+2s3pack
2spag
2spak
2spala
2spalä
-3spalt
-spa2m
-s2pan.
-3spannu
-s2pans
-3spant
+s2pali
+3s4palt
+spa4m
+s2pan
+3spann
2spanz
2spap
2s3para
+s2parka
2sparo
-5s6parten
-4spartn
-4sparty
-3spaß
+5s4parten
+2spartn
+2sparty
+3s4paß
3spat.
2spati
4spatr
+s2patz
2spau
3s2paz
s2pä
2späd
3späh
-2spär
+2s3pär
2späs
+s2pe
2s3pe.
2speg
4spein
-4spensi
+s4pek
+2spensi
spe3p4
-s2pera
-3s2perg
-s1peri
-4sperle
-2spero
-s2perr
+3s4perg
+s3peri
+2sperle
+s3pern
+s4perr
2spers
2sperü
4spet
+s4pex
3s4pez
-4s3pf4
+2s3pf
+spf4l
2spha
s2phä
3sphär
s3phe
s4phin
-3s2pi4e
-4spier
+s2pi
+3s4pie
+4s5pier
spier4r
spi2k
-4s3pil
+4spil
+s4pinn
3spio
-4s3pip
+4spi4p
4s3pis
-2sp4l
+2spl
4spla
-4s3plä
+4sp4lä
4sple
-sp5le.
-3s2pli
-4s3plu
-2s3pn
+3s4pli
+4s3p4lu
+s3pn
2spod
4spoe
2spog
@@ -19654,60 +21083,78 @@ s2pons
4spoo
2spop
s2pore
-3s2porn
-spor6tag
+3s4porn
+spor4tag
4s3pos
4spote
+s2pö
4spr.
-3s2prac
+s2pra
+3sprac
2sprak
+s4pran
2sprax
+sp4rä
2spräm
+s4prän
4spräs
-3s4prec
+3sprec
4spred
-4spreis
-5s2pren
+3s4pren
2s3pres
-s2pric
+s2pri
+s4pric
3spring
-4sprinz
+2sprinz
+3sprit
2sprob
+2sprod
2sprog
4sproj
4sprop
3spross
2sprot
2sproz
-3sprö
-3s2pru
+3s4prö
+3spru
3sprüc
2sprüf
3sprün
-4s3ps
-2s4p3t
+2s3ps
+s4ps.
+2sp3t
2spub
2spud
3spuk
-3s2pule
+3s4pule
2spun
2spup
3s4pur
-spu4rer
-2spy
-2s1q
-4s3r4
+spu2rer
+s4putt
+2s3py
+2sq
+s3qu
+2s1r2
+s3ra
+sr4at
srat2s
+srat4sc
+s3re
sre3cha
-sreli1
+s3rh
+s3ri
+s3ro
sro2h
srö2s
-srücker6
-6s1s
+s3ru
+s3rü
+srücker4
+2s1s
ss3abi
ssa3bo
s5sack
-ss4agi
+ss2agi
ss1aj
s3sal
ss3alba
@@ -19715,47 +21162,50 @@ s4sall
s4samt
s2sanf
s4sang
+ss2ann
s4sano
s4sans
ss2ant
s4sanz
ss2ara
ss2arg
-s3sars
-ssa1s
+ssa1s2
s2s3att
-ssau3e
ssau4r
+ssau5ri
s3s2ä
s4sce
ssch2
-sschanker8
+sschanker6
s3schw
+s4scl
s4sco
s2scr
sse3a
ss1ec
sse1ec
+s3seh
sseh2a
s2sein
-ss4eind
+ss2eind
sse3int
+s2selek
sse2lö
s3sen
-ssen6kel
-ssen6sem
+ssen4kel
+ssen4sem
ss1epe
-sse6ratt
-ss5ereig
+sser3att
+sser2fo
ss4ergr
-sser4hö
-sser6mit
-sser4öf
-ss3erse
-ss4eru
-sser6wei
-sses4sa
-s4s3estr
+sser2hö
+sser4mit
+sser2öf
+s3s4eru
+sser4wei
+sser2ze
+sses2sa
+s2s3estr
s3set
sse3ta
s3si
@@ -19764,39 +21214,43 @@ s4sill
s4simp
s4sind
s4sinf
-ssing3s
s4sint
s4s1isr
s3skala
ss3l
ssmut4
+sso4f
ss1off
ssoi4
s3sol
s4sop
-ss2pen
-ss2phi
-s3spi
-s3sprä
+ss3ost
+ss2p
+ss4pat
+ss4pec
+ss4pin
+s3s4prä
s3spri
s2spro
-ssquet4
-ss3s4
+ss4pü
+ssquet2
+ss3s2
sssau4
+sss4p
+sss4t
+s4st.
sst2a
s3stad
-s4stag
ss3tak
s3stä
sst2e
s3stel
s3s2tep
-s3s4tern
+s3s2tern
ss4teu
sst2i
ss2tie
ss2t3in
-s3stof
s3stop
ss4tör
s3stran
@@ -19807,91 +21261,102 @@ s3strom
s3strö
ss2tur
s3stü
+ss4tw
+s2suf
s2sumg
s2sumr
-ss2ur
+s3sü
s3sy
-s1t
-4st.
+2st.
s2ta
2sta.
-3staa
+3s4t4aa
3stab.
2stabb
-4stabel
-4stabit
+2stabel
+1s4tabi
+2stabit
2stabl
4stabt
+2stabu
st2ac
1stadt
+2stafel
1staff
2stag
-3stagl
+3s4tagl
3s4tagr
3s4tah
+s3tai
2stak
3staks
2stala
sta3lak
-2stalb
+2st1alb
s3ta3l2i
2stalk
+st1alm
st1alp
st1alr
-st1ami
+st1alv
+st1a4mi
1stamm
1stan
2stanb
-s6tand
+s4tand
2stanf
st2ang
+st3anges
2stanl
s4tanm
4st1ann
s4tano
st3ansp
2stanw
-sta3po1
+s4tap
+stapo1
stapos4
st1app
s4tar.
-sta6rens
+sta4rens
4stari
s4tark
-s4t2ars
-s4tart
+s4tars
+st1asi
sta4sie
stast4
s3tat.
+s4tata
2statb
3stati
-s4tatis
-7statth
s4tau.
2stauf
+s4taufs
3s4taur
-4stausb
-4stausg
-4stausr
-4stauss
+2staus
s4taut
+2stauto
s4t1a2ve
4stax
1s2tä
-3stäb
-3städ
+3s4täb
+3s4täd
4stäg
-4stäp
-5s4tär
+s4täm
+s4tänd
+2stänz
+4s4täp
+3s4tär
3stätt
2s3täus
2stb
2st3c
+st4ck
2std
-4s5te.
+4ste.
4steam
4stechn
-s2te2d
+ste2d
st1edi
2stee
3s2teg
@@ -19902,24 +21367,25 @@ st4ei.
4steic
st1eid
3steig
-stei4gr
+stei2gr
2steil
stei4na
-6steinga
+2steing
s4teins
-stein6sp
+2steint
s2tel
2stel.
st1elb
s3tele
s3telf
st2ell
-stel6l5än
+stel4l3än
2steln
2stels
-2stem
-ste4mar
-ste6ment
+2s3tem
+4stem.
+ste2mar
+ste4ment
3stemm
2sten
s5ten.
@@ -19932,38 +21398,42 @@ st1e2po
2ster
4s5ter.
ste2r3a
-s6terben
-3sterbo
+s4terben
s3teren
3stereo
+s3teres
st3erfü
3steril
-4sterm
-3s4ternb
-ster4zo
+4s3term
+3s2ternb
+s2t3er2zo
4ste2s1
ste3sc
-stes4se
+stes2se
+stes3ta
s4testn
2stet
-ste4tab
+s4teta
+ste2tab
ste4tag
-3s2teti
+3s4teti
3s4tett
3s2teu
1steue
4steuf
-st3eun
+st1eun
st1ev
s2tew
4stex
s2texa
2stf
+stf6lan
2stg
2sth
st2hen
s2t1hi
st3ho
+s4thö
s2thu
st1hy
2stia
@@ -19971,19 +21441,21 @@ st1hy
s2tic
1stich
st1i2d
+sti2e
2stie.
-4stief.
-4stiefl
+2stief.
+2stiefl
2stien
1s2tif
2stig
-sti4gel
+sti2gel
3s4tigm
2s3tik
+sti2kr
s2t2il
+sti2la
1s2tim
-3stimm
-4stimma
+2stimma
2stimp
st1inb
2s4tinf
@@ -19992,6 +21464,7 @@ s2tins
2s2tint
2stio
2stip.
+s4tipe
2stipp
s2ti2r
st1ira
@@ -20003,39 +21476,39 @@ st1iro
2stiv
2stj
2stk
-4stl
+2stl
st3le
2stm
2stn
s2to
2sto.
sto2bl
-4stocht
+2stocht
2stod
-4stod.
-1stof
+3stof
s4toff
2stok
-4stole
-s4toll
-sto3mi
+2stole
+s3tom
2s3ton
4stona
3s4to4ne
4stonl
4stoo
+s4tope
2stopo
-4stor.
+4s5tor.
s4torb
-2store
+2s5tore
2storf
2s4torg
2stori
2storp
2stors
2stort
-stos2t
-1stoß
+s4tory
+sto3s2t
+3s4toß
4stote
2stotr
4stou
@@ -20043,6 +21516,7 @@ stos2t
2stoz
1s2tö
4stöch
+2stöf
2s3töl
2stön
3stör
@@ -20055,9 +21529,9 @@ s2tr
st4rade
stra4fa
4s3trag
-3strah
-4strahi
-4strai
+1strah
+2strahi
+4s5trai
4strak
2s5tral
s3trank
@@ -20065,29 +21539,34 @@ s3trank
1strap
3stras
3straß
-4straum
+2straum
4sträc
4s5träg
-4sträne
+2sträne
+2sträum
2stre.
s4trea
+s4trec
4stref
+2streg
4streib
-3st6reif
+3st4reif
2strep
2stret
4streuh
+s4treuu
+2strez
2strib
-strie3s4
+strie3s2
2s4trig
1s4trik
2s5tris
1stro
s3troc
-s3trog
3s4troh
+stro4ma
s4trome
-4stropf
+2stropf
2stros
st4ross
2ströp
@@ -20095,42 +21574,40 @@ st4ross
2strua
2strub
s4trud
+2strug
3struk
2strun
-4strup
+4s5trup
2strut
1strü
-4s4t3s2
-stsi4d
+2st3s2
+st4sb
sts4t
-2st3t4
+2st3t2
+stt4r
st2u
1stub
4stuch
3s4tud
2stue
3stuf
-2stug
st3uga
-3stuh
+3s4tuh
s2t3uk
-2stumo
-2stum2s
-stum4sc
-2stumt
+4stumo
+stum2s
+s3tum4sc
2stun.
st3una
5stund
2stune
-2stung
s2t3uni
4stunn
2stuns
2stunt
-2stuö
stu3ra
stu5re
-2st3url
+st3url
4sturn
2st3urt
3s2turz
@@ -20139,7 +21616,7 @@ stu5re
1stüc
4stüch
3s4tück
-3stüh
+3s4tüh
4stür.
4stüre
3stürz
@@ -20154,33 +21631,35 @@ stwor2
4styp
4stys
2st3z2
+stze3c
1su
su1an
3su2b3
su4ba
4subi
-su4br
3su1c
su2cha
+su2chi
su2cho
+suchs3p
3sud
su2eb
-2s1u2f
-su3fi
+s1uf
+su4fe
2s1uh
su1is
su1it.
su2k
+3sul
su3l2i
-3sulta
sum1a
su2man
su2mar
3s2ume
su2mei
su2mel
-sument4
-su6ments
+sument2
+su4ments
su2m1et
2s3umf
su2m1id
@@ -20192,25 +21671,23 @@ s2ump
s1ums
s3umsa
2sumse
-s2umsp
2s3umst
-2s3umwa
su2n
-3sun.
+3s4un.
2s1una
-sunder4
-sun6d5erh
-su4ne
+sunder2
+sun4d3erh
2s1unf
-6sungena
+4sungena
2sungl
sung4s
4s1uni
-2s1unm
+2sunm
2s1uns
s4uns.
s4unst
2sunt
+2sunv
2sunw
s4unwa
3sup
@@ -20223,39 +21700,47 @@ su2rer
3surf
2s1urk
su2r1o
-2surs
+2s1ursa
s1urt
-su2s
+su2s3
su3s2a
-sus1e
-sus3i
s3u2t
su4te
su3tr
3suv
suz2
-1sü
-2sü4b
+1sü2
+2s3üb
+sü4be
3süc
-sü2d1
-süden4
+süd1
+sü4da
+süden2
3süf
3sün
3s2üs
3süß
-4s3v2
-svoran4
-2s1w
-4s3we
-swe6gers
+2sv2
+s3ve
+s3vi
+s3vl
+s3vo
+svoran2
+2sw
+s3wa
+s3we
+swe4gers
sweh2
+s3wi
4swie
4swil
4swink
-4swis
+s4wist
4swit
+s3wo
s3wü
-1s4y
+1s2y
+s3ya
2syl1
sy2lo
sy2lu
@@ -20263,115 +21748,147 @@ sym3
sy2n3
3synd
sy4no
-3sy4s3
-2s1z2
-4s3za
-4szä
+3sys
+sy4ste
+sy3sto
+2sz2
+s3za
+s3zä
+s4ze.
4s3zei
4szel
3s2zena
+s2zend
3s2ze3n2e
-4szent
-4szer
+4s3zent
+4s3zer
s2zes
-4szet
-4szeu
+s3zet
+4s3zeu
3s2zew
4s3zie
-4s3zo
+4szim
+s3zo
s3zs
-4s3zu
-4s3zü
-4szw
-2ß3a4
+sz3t
+sz4ts
+s3zu
+s3zü
+1ß
+2ß1a2
+ßa4si
+ß3at
+ß3au
2ß1ä
-2ß1b4
+2ßb2
+ßb4ri
2ß1c
-2ß1d2
-1ße
+2ßd2
2ß1e2b
2ß1ec
-2ß1ef
+ß1ef
2ß1e2g
2ß1ei
2ß1ek
ße2la
ße2le
2ßelek
-2ß1emp
+4ß1emp
ße4n3a2
4ßenerg
ße2ni
ß1enke
ße2no
-3ß2ente
+ß2ente
+4ßentl
+4ßents
2ßentz
-2ß1e2p
+ß1e2p
ßer3b
ßer2ei
ßer2la
-2ß1er4se
+ß1erse
ßer3t
ß1erw
-2ß1es2s
-2ß1est3r
-2ß1ex
-2ß1f4
-2ß3g2
+4ß1er2z
+4ß1es2s
+2ß1estr
+ß1ex
+2ßf
+ßf4ru
+2ßg2
ßge2bl
+ß3gm
2ß1h
-1ßi
ßi2g1a2
ßig4s
-2ß3i2k
-2ß1il
-2ß1im
-2ß1in
-2ß1j
-2ß3k4
+ß3i2k
+ß1il
+ß1im
+ß1in
+2ßj
+2ßk2
+ß3kh
+ßk4le
+ßk4ne
2ß1l
ßler3s
-2ß1m
+2ßm
ßmut4
-2ß3n2
-2ß3o2
+2ß1n2
+ß3ni
+2ß1o2
+ßo4fe
ßos2
-2ß1ö2
-2ß1p2
-ß1q
-2ß3r2
+2ß1ö
+ßö4fe
+2ßp2
+ß3pf
+2ßq
+2ß1r2
ßrö2
-2ß3s4
+ß3ru
+2ß1s2
+ß3sa
ßsau4
ßsch2
+ß3sk
ßst2
-2ß1t
+ßs4to
+ßs4tü
+2ßt
ßt1in
ß3tü
2ß1um
ß1unf
2ßunt
-2ß1ü4
-2ß1v
-2ß1w
-2ß3z2
-1ta
+2ßunv
+2ß1ü
+ßü4be
+2ßv
+2ßw
+2ßz2
+ß3zs
+1t
3ta.
-4taa
-5taan
+t2aa
+3taan
+ta3ar
4tab.
3taba
ta2b3an
2t1abb
+tab2bau
4tabd
3tabel
2taben
2tabf
2tabg
-2tabh
+4tabh
2t3a2bit
2tabk
-2tabla
+4tabla
+4tablä
4tabm
2t3abn
2ta4br
@@ -20390,8 +21907,8 @@ ta2der
tadi3
tadi5o4
t1adm
-ta2dol
-2t1a2dr
+t1a2dol
+t1a2dr
ta3d2s
4tadt
tad4tr
@@ -20405,28 +21922,27 @@ t1afr
3tag
ta2ga
ta2g1e2i
-t3agent
+2t3a2gent
tage2s
4t1agg
-4ta3gl
+ta3gl
4t1a2go
tag4san
tags3c
-tag4st
tah2
-tahls4t
+tahls2t
ta3i2k
tai2l1
ta1ins
tai4r
ta1ir.
ta1i2s
-2t1a2ka
-ta3kes
+2t1a4ka
2t1akk
-ta2kro
+2t1akq
+ta4kro
+tak4t3erf
tak4t1o2
-t2aktu
2takz
3t2al.
ta2la
@@ -20435,24 +21951,24 @@ ta3lag
tal3au
3talbr
tald4
-3tale
-tal2en
-ta4l3end
+3tal2en
+ta2l3end
tal3eng
-ta4l3ens
-taler2
-ta4ler3g
+ta2l3ens
+3taler2
+ta2ler3g
ta2let
tal2ga
-tali6ene
-tal4l3ac
+tali4ene
+tal2l3ac
tall3ei
-tal2l1ö4
-tall3s2
+tal2l1ö2
+tall3s4
2t1alm.
3talo
ta2lop
ta2l1o2r
+3t2als
t1alta
tal3th
talt4r
@@ -20460,11 +21976,9 @@ ta2lu
2tam
3tam.
3tame
-t2amen
-t1a2mer
-ta2mi
+t1a4mer
tamm1a
-tam4m3er
+tam2m3er
t1ampl
3tams
4t1amt
@@ -20474,17 +21988,17 @@ tan3ab
ta4nat
2t1a2nä
2tanb
-3tanc
-tan3d4ar
+3tan2c
+tan3d2ar
tan2d3r
-tand4st
-ta4nerf
+tand2st
+ta2nerf
4tanf
2t1ang
-3tang.
t3angeh
+t3angel
t2ango
-tan4gra
+tan2gra
2tanh
t2anho
t4ani
@@ -20492,6 +22006,7 @@ t4ani
3tank
tan2kl
4tankr
+4tankü
4t3anl
t1anm
2t1anna
@@ -20502,46 +22017,48 @@ t1ano
t1ans
t2ans.
4tansi
-tan4tan
-t4ante.
-4tantei
+2tanspr
+tan2tan
+t2ante.
+2tantei
2tantr
2tanwa
2tanwä
t2anz.
t1anza
-4tanzei
3tanzk
+t2anzp
3tanzr
2t1anzu
2tanzü
-tan2z1w
+tan2z3w
tao2
ta3or
t4ape
ta2pes
2tapf
ta2pl
-ta4poka
+ta2poka
t2appe
ta2ra
2tarab
3tarabb
-ta3rak
3tar5al
2taram
+t2aran
+ta3rant
tar3ap
ta3ras
t2arau
2tarb
3tarba
+tar4beitn
3tarbek
3tarber
3tarbi
3tar3bl
2tarc
-3tarchl
-3tarchr
+4tarchi
3t2ard
ta2rel
ta2r1er
@@ -20549,40 +22066,44 @@ tar3g
ta1r2h
3tari
2tark
-3tark4l
-3t2arko
+tark4l
t2arl
2t1arm
t2armä
+tar4nei
ta2rom
-2tarot
+4tarot
2tart
-3t2arta
-3tartei
-tar6ter6e
-3tartex
-3t2arth
+4tart.
+t2arta
+4tarten
+t2arth
t1arti
-3t4artis
+3t2artis
tar4to
tar2tr
-3tarty
+4tarts
+3tartu
+3tartü
ta2ru
-t1arz
-2tarzt
+2t1arz
+3tarzu
3t2as.
ta3s2a
+tasau1
3tasc
-4t1asp
+t1asp
+4taspe
+ta3spr
2t3assi
3tast
-tas4tem
tas4to
t2asy
+2t1as2z
t4at.
-ta2ta2b
+ta2tab
ta2tan
-3tatb
+3t4atb
t4ate
tat1ei
t5a2tel
@@ -20593,13 +22114,17 @@ ta2t1er
2tatom
2ta2tr
3tatsa
-2tatt
+2tatta
+2tatti
+4tatue
+tat3zw
tau2b1a
3taubh
tau2bl
tau2b3r
+4taubs
tauchs4
-tauch5sp
+tauch3sp
4taud
2t1auf
3taufe.
@@ -20607,9 +22132,10 @@ tauch5sp
4t3aufl
tau3f4li
4taufm
-t3au2f1o
+4taufn
+t3au4f1o
4taufp
-taufs2
+tau3fr
4taufw
3taug
4t3auge
@@ -20617,33 +22143,29 @@ t1auk
3taume
4t1ausb
3tausc
-tau6scha
-tau6schm
-tau6schr
-tau6schw
+tau4scha
+tau4schm
+tau4schr
+tau4schw
2tausd
t2aus2e
+4tausee
4t1ausf
4t3ausg
t1ausk
-4tausl
+4t1ausl
2tausr
4t3auss
2tausü
-2t5ausw
+2tausw
4t3ausz
4tauu
3tav
4tava
-ta2van
3tax
4t1axt
3taz
-1tä
-2tää
-4täb
tä1c
-4täd
t2äf
3täg
4tägä
@@ -20651,15 +22173,16 @@ t2äf
2täh
4täll
2t1ält
-4tä2m
+2täm
+tä4mi
t1ämt
t1ängs
3tänz
-4t1äp
+2t1äp
2täq
-tä4reng
+tä2reng
tä2ru
-2tärz
+2t1ärz
tä2s
t2ät
3tätigk
@@ -20667,28 +22190,39 @@ t2ät
2täug
2täuß
2täx
-1tà
-4t3b4
-tbauer4
+2tb2
+t3ba
+tbauer2
+t3be
tber2e
-tblocken8
+t3bh
+tblocken4
+tb4ra
+tb4ri
+t3bs
tby4t
-4t1c
+2t1c
t3cha
t3che
+tchen3
tch2i
tch3l
t3chr
t2ch1u
-tch1w
-t4ck
+tch3w
+t2ck
t3cl
+t3co
tcor2
t3cr
-4t3d2
+tc4up
+2td2
tdar2m1
+tdä1
+tdes2t
+t3do
+t3ds
tdun2
-1te
3te.
te2a2
te3ab
@@ -20697,15 +22231,13 @@ te3ag
2teak
te3al
3team
-te3an
+3te3an
te3ar
-tea4s
3teba
t4ebb
2t1e2ben
t2ech
2techd
-2teche
2techk
2techm
3techn
@@ -20716,6 +22248,8 @@ te3cker
te2cki
2t1ecu
te2dit
+3tee
+tee3id
te1em
teen1
te2er.
@@ -20735,25 +22269,22 @@ t1ehr
te3hu
3tei.
3teic
-tei1fl
+tei3fl
2teign
teik4
3t2eil
-tei6lent
-teim2
+tei4lent
+tei3m2
2tein
teinen4
-tei6nens
-tein6hab
+tei4nens
t3einkü
2t1eis.
t1eisb
-te5isch.
-teit4
+te3isch.
t1eiw
-tei3z
+tei3z4
te2kel
-3teko
tekt4
3tel.
3te2la
@@ -20777,16 +22308,16 @@ te2leu
3telg
3telh
tel1in
-te2lit
+t1e2lit
3telk
tel3le
-tel6lein
+tel4lein
tel3li
4tellu
3teln
te2lob
te3lom
-te4lost
+te2lost
te2l1ö
3telp
3tels
@@ -20794,10 +22325,10 @@ tel3s2k
3telt4
tel3ta
3telw
-3tem.
-3t2ema
+t2ema
te2man
te2m1ap
+tem3art
te2mau
2tem2bo
te2m1ei
@@ -20805,19 +22336,21 @@ te2m1er
te2mi
tem3i2m
tem3ing
-2temm
-te2mo
-tem1o2r
-3temper
-2tempf
-4tempfi
-tem3s6
+te3misc
+4temm
+3temod
+te2m1o2r
+te4mp
+5temper
+4tempf
+tem3s
te2mu
te4mun
3ten
-t6en.
-ten1a2
-te4nad
+t4en.
+ten1a
+te4na2d
+tena2g
te4n3an
ten3ar
te4nas
@@ -20826,19 +22359,20 @@ ten3au
te2n3ä
ten3da
4t3endal
-tend4an
+tend2an
4tendap
4t5endf
+t4endi
4t1endl
-t6endo
+t4endo
4t5endp
-ten3d4r
+t4en3d4r
te2n1e2b
te2nef
te2neh
ten3ei
te3n4ei.
-tenei4d
+tenei2d
tene4m
tenen1
te4n3end
@@ -20846,18 +22380,18 @@ te4nene
te4neng
te4nens
4t3energ
-te4n3ern
-tenf4
+te2n3ern
+4tenerp
4t1eng.
teng2a
-ten4gag
-4t3engla
+2ten2gag
te2ni
te4nil
ten1im
-te4n3in
+te4nin
tenk4
ten3n2
+4tenog
te2nol
te2nos
te3nö
@@ -20872,171 +22406,188 @@ t1ents
4t5entw
4tentz
t2enz
-ten4z3er
-teo2f
+ten2z3er
+teo4f
2tep.
-2t1e2pi
-2teppu
+t1epi
+te2pil
+3tepr
tept2
3t4er.
t4era
+tera2b
ter3a2c
te2rad
te1ral
-ter3alg
-te3r4ane
+te2r3alg
+te3ran.
+te3ranb
+te3rane
te2r3ap
tera4s
-4terbos
2t1erbs
2t1erbt
3terc
-4t3erde.
+2t3erde.
ter3d2s
3tere.
te2r1e2b
te2rec
-t3ereig
+2t3ereig
+ter3ein
te5rek
+te2rel
+ter3ell
3tere2m
-te4rema
-te4r3end
-te4rene
-te4reng
-te4r3ent
-teren5th
+te2rema
+te2r3end
+te2rene
+te2reng
+te2r3ent
+teren3th
2tereo
3terer
terer3k
-terer6ku
+terer4ku
terer3l
-te4r3erp
-te4rers
-te4rerw
-3teres
-t4erfr
+te2r3erp
+te2rers
+te2rerw
+3t4erfr
terg2
ter3ga
-6tergebn
-t6ergem
-t6erges
-t6ergew
+t4ergem
+t4erges
+t4ergew
+ter4gieb
ter3gl
-6tergrei
+4tergrei
+ter2gri
t4ergru
-t6erhall
-t6erhau
-t4erhäu
-t4erhei
-7t2erhi
-t2erho
-6terhöhu
+te4rh
+t4erhall
+t2erhan
+t4erhau
+t2erhäu
+t2erhei
+5t2erhi
+5t2erho
t2erhu
te3ria
-4terii
+te2rid
ter3iko
2teril
teri4o
-te2r3it
-teri4ta
-4terklä
+te2rit
+ter3i4ta
+3terkla
t4erlä
+ter3lei
t4erli
-ter4lös
-3term
+ter2lös
+ter2mer
t2ern.
-ter4nar
-2t6ernc
+ter2nar
+2t4ernc
t4ero
te1rob
-ter4obe
-2teros
+ter2obe
t1e2r1ö
-t4erp
+ter3r2
t4erra
ter4re.
t4erro
t4ers.
t2erse
t4erst.
-t6erstad
-ter6stat
+5t4erstad
t4erstä
-t4ersti
-t4erstr
+t6ersted
+ter5sterb
+t4er3sti
+ter3sto
+ter3str
t4erstu
t4erstü
+ter4sw
tert2
ter3ta
ter4trä
-t4eru2
+t4eru4
te4r1uf
te3rung
+t4erü
t4erv
-4t3erwäh
+2t3erwäh
ter3z2a
2t1erzb
-t4erzei
-4terzeu
+3t4erzei
ter3zw
3tes
t2es.
-tesa2k
+tesa4k
tes2c
tes2ka
-tes4pen
-te2spr
+te2s3pr
2t1essa
tes3tan
-te3stei
+tes3tät
tes4tel
-tester4
-tes6terg
-tes6t5erh
-tes6terk
+tester2
+tes4terg
+tes4t3erh
+tes4terk
2testn
-testo3
t3est3ri
te2su
-tet2
-3tet.
+3tet2
t1eta
-te4tabl
-2te2tap
+te2tabl
+4te2tap
2te2tat
-3tete
teten3
-2t1e2th
+4t1e2th
te3tho
+te2tik
4tetl
tet3ti
-3teuf
+teuer5b
+teuer3r
+3t4euf
+teu4fa
3teum
3te1u2n
4teunu
-2t1eup
+2t3eup
3teur.
+teu2rob
te2va
te2vi
tewa2s
3tewo
2texam
2t1e2xe
+te3xel
2t1e2xi
-4texp
+2texp
tex4ta
2t1exz
tè2
-4t3f6
-4t1g2
-tga4s3er
+tê4te
+2tf2
+t3fj
+tf4la
+tf4lö
+tf4rö
+tf4rü
+2tg2
+tga2s3er
tga2su
-t3ge
tge4nen3
tger2a
tger2i
-tg4r
-4th.
+tg4ra
+2th.
2t1h2a
3tha.
3t2hag
@@ -21045,37 +22596,39 @@ tg4r
3thalh
t4hali
t2hals
+4tham
t2han.
t3hand
-t3hap
+4t3hap
4t3hau
2t1hä
3thäi
4thäl
2thb
th2e
-1the.
3t4hea
2t1heb
-2t1hef
+4t1hef
2t1hei
the1in
4theit
t2hek
+2thel
3thema
2themd
+t1hemi
2themm
-1then
t1henn
3theo
t1herd
+3therm
thero1
-t1herr
+2t1herr
2t1herz
4t1hess
t2heu
2thf
-1th2i
+th2i
3thi.
thic3k4
thi3er.
@@ -21086,84 +22639,88 @@ thi3nu
2t1hir
2thk
2th3l
-4th3m
+2th3m
thmu2
2th3n2
-1tho
2t1hob
+t1hoc
tho3chr
t1hof
2t1hoh
+t2hol.
+t2holo
+t1hols
t1holt
2tholz
+t2hom
t2hon
4thops
+tho3ra
tho1s
-t1hose
+2t1hose
t1hot
4thote
2thou
t1hov
-4thö
+2thö
2thp
-1th2r2
+th2r2
+th4ro
2ths
2tht2
t1hu
2thub
-2thuh
4t3hun
-2thut
2t1hü
2thv
-1ti
-t4ia
ti3ac
ti1ag
-tial2l
+4t3iago
ti3alo
-ti1a2m
+ti1a4m
+ti2ä
3tib
3ticc
ti1ce
3ticket
t2id.
+ti3de.
2tidee
-ti4d3en4d
+ti2d3en2d
ti3dy
3tief.
-4tiefel
+3tiefe.
+2tiefel
+3tiefen
3tiefl
tie2fr
2tieg4
2tieh
ti2e1i
ti1el
-ti2el.
tiel3a
-ti3e4n1
+tie4n1
+ti3ene
tien3s
3tier
-tie4rei
-tie4reu
-ti2ern
-tie3s2t
+tie2rei
+tie2reu
+tie3s4t
2tieß
ti1eu
3tif.
ti3fe
-ti1f4r
-tifter6k
+ti3f4r
+tifter4k
3tig
-ti4gerz
+ti2gerz
ti2git
-tigs4tr
tih2
3tij
ti2kam
ti2kar
tiken2
-ti4kent
+ti2kent
ti3k4ere
ti3kerl
ti2kin
@@ -21173,8 +22730,8 @@ ti2kop
tik1r
ti2kra
ti2krä
-ti4krei
-tik5t
+ti2krei
+ti4kro
ti2lar
til3d
ti2lei
@@ -21183,12 +22740,11 @@ ti2lel
2tillu
ti2lö
tilt4
-ti2lu
ti2ma2g
-tim4man
+tim2man
t3immat
-timmer4
-tim6merg
+timmer2
+tim4merg
3timo
2timp
tim2s
@@ -21198,50 +22754,50 @@ ti3naf
ti3nak
ti2n3an
t1ind
-ti5n2e
+ti3n2e
tine1i
+ti5nen
2t1inf
-3ting
+3ting.
tin2ga
+tin3gen
+tin2gi
ting3l
ting3s
+tings4p
2t1inh
3tinis
-t1in1it
+t1init
t1inka
tin2k1l
tin2kn
-tin2kr
t1inku
t2inn
ti2nor
t1ins
3tins.
-t3insa
t2insä
4t3inse
-tin4spa
-tin4sum
+tin2spa
+tin2sum
t1int
3tinte.
+2t3inter
ti3nu
tin2um
4t1inv
3tio
-ti2osk
tioxi3
-3tip.
+3tip
2tipe
ti3p4l
-3tipp
-3tips
-ti4que.
+ti2que.
3tirad
-ti1rh
+ti1r2h
ti4ron
3t2isc
-ti6schei
-ti4schu
+ti4schei
+ti2schr
tisch3w
ti2sei
tis2el
@@ -21257,68 +22813,78 @@ ti1s4tr
ti2s1u
t1it2a
ti2tal
-3ti3te
-ti1th
-3titi
+3tite
+ti3th
+3t2iti
2ti3tu
3tiu
tium4s
+tiu4s
3tiv
ti2van
ti2vel
-ti4vene
tiver2
-ti4verh
-ti4verk
-ti4verl
+ti2verh
+ti2verk
+ti2verl
ti2v1o
ti4v3r
ti2za
ti2zir
-2t1j
-4t3k4
-4t1l2
+2tj
+2tk2
+tklat3
+tk4ne
+t3kr
+2t1l2
tlan2g
-tl4e
t2lef
-tlei6der
+tlei2bl
+tlei4der
+tl4er
tle2ra
-6t3li
+t3li
tlings5
+tli3sc
tlit1
t3lo
-t5lö
tlung4
-4t1m4
+2tm2
tmal2
+tm4am
tma2st
-tmen8schl
-tmen6t5
-tments4
+tmen4schl
+tmen4t5
+tmen6tr
t3mo
tmo4des
-4t3n4
-t5na
+t3mö
+2t1n2
+t3na
+tn4an
+t3ne
tnes2
-1to
+t3ni
3to.
-to4as
-to5at
+to3ar
+to3at
t2oba
-4tobj
+2to4bj
tob2l
t1obs
3tobt
to1c
t3ochs
3tocht
-to6ck5ent
-3t4od
+to2cka
+to4ckent
+3tod
tod1er2
to4dun
+toe2
tof4fa
-tof6f5ent
-tof4f3er
+tof4f3ent
+tof2f3er
2toffi
toff3s
3tog
@@ -21327,34 +22893,32 @@ toff3s
4toi.
toi4r
4toiz
-5toj
-3tok4
-3tol
-to3le
-4tolp
-4tolz
-tomar4b
+3toj
+3tok
+tok4l
+3to3le
+tomar2b
to4mene
3tomi
-to2min
-3tomo
-to2m1u
-to4mun
+4tomn
+to4m1u
+to5mus
to2nan
ton3au
tond2
to2n2eh
-toner6ke
+toner4ke
+to4nid
to2nob
2tony
3too
3top.
-to2pad
-to2pak
-to2pan
+to4pad
+to4pak
to3pas
to2pat
top1hi
+to2ple
3topo
2to4pt
3tor
@@ -21366,72 +22930,79 @@ t1ord
t2ordi
4t3ordn
t4ore
-to2rei
to2rel
to2rem
-to6renna
-tor4fan
+to4renna
+tor2fan
t1or3g
4torga
-t5orient
-torin4s
+t3orient
+torin2s
tor3int
-5tork
to2rö
-t4ors
+t4o4rs
4t1ort.
tor3t2a
-t1orth
+4t1orth
4tortn
4tort2s
to4ru
+to5rus
to3rü
to4rüb
-4tory
to3sc
to3s2e
to3s2h
to4ska
to3s2p
4toss
-3to1st2
-4toß
-to1ßu
+3to1st
+4t1osz
+to4ßi
+to3ßu
to2tä
3tote
+to5tem
to2tho
3totr
-tots2
-5t2ou
+tot3s2
+3t2ou
touil2
to3un
3tow
-to1x
+3to1x
3toz
-1tö
3töch
4töck
2t1ö2d
-2tö2f
-4t1ök
+2töf
+tö4fe
+2t1ö2k
2töl.
3tön
t2ör
+törs4
t1öst
3töt
-2t3p4
-tpf4
+2tp2
+t3pf
+tpf4l
tpi2n
-2t1q
-1t2r4
+t3pl
+tp4lu
+tp4rä
+t3ps
+2tq
+t2r2
2tr.
-5tra.
+3tra.
+t4rab
3trac
tra3cha
tra3chl
2t3rad.
2trade
-tra4dem
+tra2dem
4t3radie
tra4fah
tra4far
@@ -21439,45 +23010,41 @@ t4rag
3trahi
4trahl
2trahm
-5t4rai
+3t4rai
3trak
4t3rake
t4rakt
-3tral
+3tr4al
tral3l
+tra5me
3t4ran.
4trand
4trang
t3rann
5t4rans
+tra3po
tra2st
4traß
-4traub.
-4trauc
+2traub.
t4raue
t4rauf
2traup
-4trauß
-5träc
+3träc
2träd
-3träg
+3t4räg
3träne
4träng
-4träs
-4träß
2träuc
-4träus
-4träuß
-4t5re.
+4tre.
2trea
t3reak
-4treb
-tre2br
-4trec
+2treb
+tre2b3r
+2trec
t3rech
t4reck
5treck.
-tre5cke
+tre3cke
2t3red
3tref
4trefe
@@ -21492,10 +23059,10 @@ t4rei.
4treif
2t3reig
2t3reih
-2treim
+2t3reim
4t3rein
2t3reis
-tre7isch.
+tre5isch.
4treit
t3reiz
2trek
@@ -21506,21 +23073,25 @@ t4ren.
4trendi
3trennu
t3rent
+t3repa
2trepe
2t3repo
3trepp
t3repr
t4rer
5t4res.
+t3rese
tre2ta
t4rete
tret3r
+tre2tri
2t3rett
+t4reu
3treuh
4t3rev
t4rex
4trez
-5t4ré
+3tré
2t3rh
3tri
t4rib
@@ -21529,7 +23100,9 @@ t4rick
t4rid2
5trieb
trie3fr
+tri2en
tri4ena
+tri3ent
tri2er
tri4ers
trie1s
@@ -21537,44 +23110,41 @@ trie1s
5trigg
tri3gl
t4rik
-tri4ke.
-tri4kes
+tri2ke.
+tri2kes
5triko
4t3rind
4tring
tri3ni
4t3rinn
-t4rip
4tript
-4t3riv
+tr4is
tri2x
trizi1
-5tro.
+3tro.
tro3b4
-4trock.
+2trock.
3troe
-tro4kes
-trol4la
-6trom.
+3trog
+tro2kes
+trol2la
+tr4om
tro4men
-tro2mi
4tromk
4troms
-4tromv
3tron
tro3na
t4rop
-tro1pe
+tro3pe
3tropf
-5tros.
-tro5sm
+tro3sm
3trost
t1rot.
2trout
-3troy
+3t4roy
4t3röc
2tröh
-6tröm
+4tröm
3tröp
3trös
4t3röss
@@ -21583,141 +23153,149 @@ t1rot.
3trub
2t3ruc
4truf
+t4rug
4truk
-trum2
+trum4
t3rumä
-trums1
+trums5
t3rund
3trunk
-5t4rup
+3t4rup
t3russ
2trut1
tru2th
4truw
-trü1be
-trü1bu
+trü3be
+trü3bu
2t3rüc
-trücker6
+trücker4
t4rüg
3trümm
-try1
+3try1
2ts
-4ts.
-ts3ab
+ts3a2b
t4sachs
t2s1a2d
ts1ahn
+t3s2akk
t2sall
t2salt
t4samp
t4s1amt
t2san
ts3ane
+tsa2p
tsa2r
ts3are
ts3ari
-t2s1a2s3
+t2s1a2s
+tsas3t
+t3satz
t2sau
+tsau1c
ts2av
t2säh
ts1än
ts1äus
-t4scham
-t6schart
-t3sche
+t4schart
t4schef
-t3schl
-tsch4li
+tsch2li
t4schro
t3schü
ts4cor
t2s1e2b
tse2e
t2sef
-tse4he.
-ts2eil
+tse2he.
+t2s1eic
+t3seil
t3seme
ts1eng
-ts2ens
+t3s2ens
t2s1ent
t2s1ep
t2s1er
-t6s5essen
+tser2u
+t4s3essen
tse2t
ts1eta
t2s1eti
-t2s1e2v
+t2s1ev
t2sex
t3sexi
-ts3he
t2s1i2d
t2s3i2k
t2sim
tsing4
t2sini
ts1ir
-4tsk
-t3skal
-ts4kele
+t3s2kal
+ts2kele
tski2
-t4s3ko
-t1slal
+t4sko
+tso2
ts1off
t2s1op
-tso2r
ts1orc
t2s1ori
ts3ort.
+t3soz
t2sö
t2spac
t2spal
-ts1pas
+ts2pare
t2spat
-ts3pate
t2spä
t3sped
t3spei
-t3s2pek
-ts4pend
+t3spek
t2sph
-t3s2pi
+t3spi
t4s3pic
t4spins
ts3ple
t2spo
t3s2pon
t3s2por
+t2sprei
t2spro
+t4sps
ts2pul
-ts2put
-ts3s4
-4t1st4
-t4stabe
+ts3s2
+tsser2
+tss4t
+t1st2
+t2stabe
t2staf
t4stag
ts3tak
-t4stale
+t2stale
t4s3tanz
t4stas
-t4stat.
-t4s3täti
+t2stat.
+t2s3täti
t2stea
t3stein
-ts4terb
-t3s4tern
-t3s4tero
+t4stele
+ts2terb
+t3s2tern
+t3s2tero
t4sth
+ts5the
t3stif
t3stim
t4stit
-t4stoch
+t2stoch
t4stoi
-ts4tol
t4ston
+tst4r
t3strec
t4stren
+ts3treu
+t3stric
t4strie
-ts2tu
+t4strun
+ts2t4u
t5stub
ts4tüm
t4sty
@@ -21731,20 +23309,23 @@ t2sumz
t2s3un
tswa2s
t3sy
-4t1t
+t4sza
+2tt
tt1ab
tt2ac
tt3achs
tt1ad
tt2ag
-tta6g5ess
+tta4g3ess
t4t1ah
-tta2ke
+tta4ke
tt2al
t4tan4a
+ttank3l
t2tanm
tt2ant
-t4t1ap
+t2t1ap
+t4tapp
tt1art
tt3atr
tt1äh
@@ -21753,23 +23334,26 @@ tt1eif
tt1ein
t2t1eis
tte4l1a2
-tte4l3e4b
-tte4len
-tte4lin
+tte2l3e2b
+tte2len
+tt2eli
+tte2lin
ttel1o
-ttels4t
-ttel5ste
+ttels2t
+ttel3ste
t2temu
tte4na
-tten6sem
+tten4sem
t4tentb
tten3te
t4tentf
t4tents
tten3z
t2teo
+tte4r3ar
tt4ere
tt3erfo
+tteri2e
tte4rik
tte2ro
tt2erö
@@ -21779,6 +23363,7 @@ tte4s3ä2
tte2so
ttest4r
tt2häu
+tthä3us
tt1hi
t2t1ho
t2ti4d
@@ -21786,24 +23371,27 @@ t4t3igi
t2tins
tt2int
t2tiso
-t6t3la
+t3tit
+t4t3la
+t4tli
+tt5nan
t4torg
-t2trou
tt3rü
ttschi4
tts1eh
tt2sen
-tts1p
tt2spe
tt2spr
-tt4s3tät
+tt2s3tät
tt2sum
-tt3s2z
-tt5t2
-tt1u2f
-t3tü
+tt3sz
+tt3t2
+tt5tri
+tt1u4f
+t3tü1
+t4tüb
tt3z2
-1tu
+ttz4w
3tua
tu4ale
tu1alm
@@ -21820,11 +23408,11 @@ tudie4n3
tu2ere
2tuf
tuf2e
-tu3fen
-t3u2fer
+tu5fen
+t3u4fer
3tuff
tu2gan
-4tuh
+2tuh
tuh4ler
tu1ist
tu2kr
@@ -21839,7 +23427,7 @@ tum2b5l
2tuml
3t2umo
2t3umr
-4t3umsat
+2t3umsat
2t1umsc
tum2si
tum2so
@@ -21853,23 +23441,25 @@ tum4s5tr
tund2e
tun2en
2t3unf
-3tung
+3tung.
t3unga
tung4s5
+tun2i
2tunif
2tu2nio
2tuniv
-2t1unm
+2tunm
3tunn
t1u2no
+2t3unr
t3uns
3tuns.
4t3unt
-2t1unv
+2tunv
2t1up.
t1upg
-tu2r1ag
-tu2ran
+tu2r1a2g
+tu2r1an
turan4l
tu2ras
tu2rau
@@ -21878,33 +23468,33 @@ tur1c
tu2r1e2b
tu2rei
tur3eis
-tu4rene
+tu2rene
tu2r1er
tu4res
tu2re4t
tu2r3e2v
-tur3f4
+turf4
tur3g2
-tur1in1
+tu2rid
+tur1in
tur4mun
3turn
tu2r3o
-tu4ru
+tur3s
+tur5sa
+tu2ru
3tus
tu2sa
-tu4schl
-tu2se
+tu2schl
+tu2s1e
tu2so
-tu3t2a
-tuto5
-tuto3re
+tut2a
+tuto3
2tü
-4tüb
tü3ber.
3tüch
tück2s
3tüf
-4tüh
3tüm
3tür.
tür1c
@@ -21916,41 +23506,47 @@ tür1c
3tütc
3tüte
4tütz
-4t1v2
+2tv2
t3vo
-tvoran4
-4t3w4
-t5wa2
-twi4e
-t4wist
-1ty
+t4vo.
+tvoran2
+2tw
+t3wa2
+twegs2
+t2wist
+tw4ri
2t1ya
3typ
ty2p1a
+ty4ps
ty1s2
-2t1z
+2tz
t2za2
tz1ag
+tz1ap
tz3ar
tz1au
t2z1ä
t3zäh
-tz1ec
+t2z1e2c
t2z1e2d
tz1ehr
t2z1eie
+t2z1eig
t4z1eis
+tzei4tend
tze2m
tz1emi
tze4n1
tz2ene
-tzen5s4t
+tzen3s4t
tzen3ta
-t4zentg
-t4zentl
-t4zents
-tze4reb
-tzer6gre
+t2zentg
+t2zentl
+t2zents
+tze2reb
+tzer4gre
+t2z1er2m
tz1erw
tz2er3z
tz3erzi
@@ -21966,27 +23562,29 @@ t2zop
tz2th
tz4tin
tzu2gu
+tz1unf
t2zuni
-tzwan4d3
-tz1wä
-tz1wi
+tzwan2d3
+tz3wä
+tz3wi
t3zwie
-tz1wu
+tz3wu
2ua
u3a2b
u3a2c
ua2dan
uad4r
-ua2g
+u1a2g
+u1ah
+ua4ka
u1al.
u1a2l1a
u1a2l1ä
u1alb
u1ald
u3aleb
-u3a4lent
+u3a2lent
u3aler2
-ua4lerg
ual3erk
u3a2let
u1alf
@@ -21998,70 +23596,81 @@ ua2l1o2
u1alp
u1alr
u1als
-u1al5t4
+u1alt4
+ual5tr
ua2lu
u1alw
-u1alz
+u1al3z4
u1am
-uan2a
+u1an.
+ua3n2a4
u1ans
+uant2
u3ar.
uara2b
u1ars
-uar4t3an
+uar2t3an
ua3sa
uasi1
ua2th
uat2i
+uati4ons.
uat2o
u3au
u1ay
u1äm
+u1än
uä2s
u1äu
-2u1b
+2ub
u2barb
ubb4l
ube2be
ube2e
u2b1ehe
-u4b3eins
+u2b3eins
u2b1e2m
ube4n1a
uben3o
ub2er
-u4b3erde
+u2b3erde
ubert4
-ub4es
+u3b4es
ub1eul
-u3bit
+ub4is
+u3b4it
ub2l
ub3läu
ub3lic
ub3lu
ub4lut
u2bob
+u2b1ok
u2bop
u2boz
+ub5rah
u2b3rit
+ub4ro
ub4rü
ub2san
-ubsau2
+ubsau4
ub4s3che
ub2s1o
-ub2sp
-ubst2
+ub2s3p
+ubst4
ub3t2h
-4uc
+2uc
uc1c
+u4ch.
uch1a
u1cha.
+u2chan
uch1ä
u1che
uch1ec
u2ched
uch1ei
-ucherin8t
+ucher3f
u3ches
u1chi
uch3im
@@ -22071,187 +23680,207 @@ uch3m
uch3n
uch1op
u2ch3r
-uch4sel
+uch2sel
uch2so
uch2sp
-uch2ta
+uch4stem
+uch2tak
uch3tan
-uch6t5erf
-uch6t5ert
+uch4t3erf
+uch4t3ert
u1chu
uch3ü
-uch1w
+uch3w
u1ci
uck3elf
u2ckem
-u4ckent
-uck2er
-ucker8geb
+u2ckent
u2ck3i
-uck4sti
+uck2sti
u1cl
-2u1d
-u3d4a
+uc4re
+2ud
+u3d2a
uda3d
+ud4at
ud2e
-ude3i4
-udein7
+ude1e
+ude3i2
+udein5
ude2n1
uden3e
uden3s2
udert4
-udes2
udi3en
+udiener4
+udio3
uditi4
-ud2o
-u3dob
-u2d3on
+u3d2ob
+u2don
+udo1s
ud3ra
u3dru
-4u1e
+2u1e
ueb4l
ue1ch
ue2ck
u2ed
-ue2en4
+ueen4
u2eg
u2eh
ue2ke
-u4ela
+u2ela
ue2lek
ueli4
-uel2la
-u3eln
+uel2lau
+uel4lent
ue2mi
uen1
u3en.
ue4n3a2
ue2nä
+u3enb
u3end
uene2
ue2neb
ue2ner
-uen4gag
+uen2gag
uenge2
uenge4m
-uengene7
-uenge4s
+uengene3
uen2gl
-u3e2ni
+ue2ni
uenk4
ue2no
-uen6zene
uen2zu
u2ep
ue2r3a2
-uera4t
ue2r1ä
uerb2
-uer6baut
+uer4baut
+u3erbu
uer3d2
uere2
ue2rec
-u5ereinn
-uer3eis
+uer4ei.
+u3ereinn
+uerei3s2
uer3ela
u3eremp
-u3e4r3ent
-ue3r4erb
+u3e2r3ent
+ue3r2erb
u3ererf
-ue4rer4g
-uerer4h
-uerer4k
+ue2rer2g
+uerer2h
+uerer2k
uerer4m
-ue6rersc
-uerer6sp
-ue6rerst
+ue2rers
+uerer4sa
uer3esk
ue2re4t
u3erex
-uer3g2
-uer4geb
-u3erh
-ueri2d
+uerg2
+uer3ga
+uer2geb
+ue2ri2d
ue2r1i4m
-u3erin4t
+uerin3s
+u3erin2t
u3erl.
u3ern
uer4nan
-uer4nar
-uer4ne
-uern3s4t
+uer2nar
+uer2ne
+uern3s2t
ue2r3o4
uer2ö
-u3errü
-uer3sc
-uerst6
+uerrü2
+uers4p
+uerst4
+uer3stei
+u3ersti
uer3t2
u3eruh
u3erum
u3erunf
u3erunt
+u3erur
+uer2wec
uer3z2
ue2ta
-ue4tek
+ue2tek
ue2tik
uety2
u2ev
ue2x1
+u2f
+u3fa
uf1ab
-u3fac
ufa2ck
-u3fah
-u3fal
-ufall4
-u3fam
+ufall2
ufa2n
uf3ane
-u2f3a2r
-u3fas
+uf3a2r
uf1aß
ufa2t
uf1au
-u2f1än
-u2f1äs
-u2f1ä2ß
-u2f1ei
+u3fä
+u4f1än
+uf1är
+uf1äs
+u4f1ä2ß
+u3fe
+u4f1ei
ufel4s3a
-u2f1em
+u4f1em
4ufen
-u3fen.
-u2fent
-u2ferf
-u2f1erh
-u4ferla
+u4fent
+uf2ere
+u4ferf
+u4f1erh
+ufer4lau
u4ferle
u4ferne
-u2f1et
+u4f1et
+u4fex
2uff
-uf3fe
+uf3f2e
uff4l
uf2fro
-u2f1id
-u2fim
-u2f1ins
+u3fi
+u4f1id
+u4fim
+u4f1ins
uf3l
-u2fob
+u4fläs
+uf4lü
+uf5lüd
+uf5lüm
+u3fo
+u4fob
+u4fof
+u4fop
ufo2r
uf1ori
+u3fö
uf3r
-uf5sä
+u4fru
+uf3sä
uf2spo
-uf4stab
+uf2stab
2uft
ufta2b
uft1eb
uft3erd
-uft3er4g
-ufter4l
+uft3er2g
+uf5tri
uft3s4
-u2fum
-2u1g
+u3fu
+u4fum
+u3fü
+2ug
ug2abe
-u4gabte
+u2gabte
ug1a2d
ug1ak
u2gana
@@ -22261,60 +23890,63 @@ u2g1ans
u2gant
ug1ap
u2g1ar
-uga2s
+uga4s
ug1au
ug3d2
u3ge.
u2g1ec
+ug4eg
ug1e2i
u2geig
-u2gein
-uge4lob
+ug2eil
+u2g3ein
+uge2lob
ug1emi
ugene2
ugen3s2
u2g1erf
+u2g1erk
u2g1erl
u2gerr
u2gerv
+uges4
u3ges.
u2g1esk
ug2et
-ugg2
ugge4st
ug2gl
-ugg4t
+ug4gt
ug3hu
u2g1i2d
u2gim
ug1in
+u2gins
u2g1l
u4glä
-u6gleitb
-u6gleitu
+u4gleitb
+u4gleitu
u4glic
u4glis
ug3liz
u4g3lo
u4glu
-u4g3n
+u2g3n
ugo3
u2go4b
ug3oc
u3gon
ugo4p
-ug1o4r
-u3gos
+u2g1o4r
u2gö
+u2g3ram
u2g3rä
u2greg
-u4g3reis
-u2gres
+u2g3reis
+u2g3res
u2g3rie
ug3ro
u2grou
ug3rüs
-ug3span
ug4spe
ugs4por
ug4spr
@@ -22322,8 +23954,7 @@ ug4spu
ugst2
ug3sta
ug3stä
-ugs4to
-ug3s4tr
+ug3str
ug3stu
ug4stur
ug3s4tü
@@ -22331,8 +23962,7 @@ u2gum
ugu3te
u2gü
u1h
-uh2a
-2u3he
+2u3h2e
uhe3a2
uhe1e2
uhe1s
@@ -22341,36 +23971,39 @@ uhe1s
uh1la
uh2lar
uh1lä
-uh4l3ent
+uh2l1ei
+uh2l3ent
uhl3erb
uh2li
uhl2ö
2uhm
uhme2
+uh1or
uhr1a
-uhrei4s
+uhrei2s
uh2r3er3
2uh3ri
-uh4rin
-uh2r3o
+uh4r1in
+uh4r3o
uh2ru
uh4rü
-uhs4
+uhs4t
uh3t2
u2hu
2uhü
-uh1w
+uh3w
2ui
ui2a
ui1ch
ui2che
ui4cker
-u1idd
+u2idi
+ui2du
u1ie
ui1em
u3ig
u4ige
-uil4les
+uil2les
u1im
u3in.
u3isch.
@@ -22379,32 +24012,31 @@ uis2e
uisi4n
uis3t
uit3s
-u1j
uji3
uk2a
-ukä2
uk1äh
u3käu
-u1k2e
+uk2e
uke2n1
-u1ki
-u1k2l
+uk2l
ukle1
-uk4n
+uk4na
+uk4ne
+uk4nu
u2k1ob
-uko2m1
+uko4m1
ukom3a
uk2ö
-u1k4r
+uk4re
uk2ta
uk2t1el
uk4tent
uk2t1er
uk2tin
-uk4t3o4ri
+uk4t3o2ri
uk4t3r
uk2tum
-u1ku
+uk4tü
uku2s
uk2ü
u1l
@@ -22415,23 +24047,25 @@ ula2s
ul1äm
ulb4l
ul4dan
+ul2dar
ul2dr
+ul3dra
uld2se
2ule
u2l1el
ul1emb
-ule4n
+ule4n1
ul1er2h
-ules3t
+ul1er2r
ule2t
ul1eta
-2ul3f4
-ulg4
+2ul3f
2uli
ul1id
uli2k
+ulin1a
ul1ins
-uli1p
+uli3p
ul3ka
ul2kn
ull1au
@@ -22444,6 +24078,7 @@ ulni2
ulo2i
u2lop
u2l1or
+ul2ö
ulp1h
ul2pha
ul2sa
@@ -22457,20 +24092,21 @@ ul2sum
ul3tan
ult3ar
ul2tau
-ulter4m
-ul3ti
+ulter2m
ul4tri
ult3s
u2lü
ul2vr
-ulz2w
+ul3z2e
+ulz4w
2uma.
u2maa3
u2mab
u2m1ad
-u2m1a2k
-um1all
+u2m1a4k
+u2m1all
um1ang
+u2m1ant
um1anz
u2m1ap
um1ar
@@ -22481,13 +24117,16 @@ u2matl
u2matm
um1aus
u2maut
+um4ay
u2m1äh
1umd2
-u3me.
+u2m1e2b
+u2m1e2ck
u2m1ef
u2m1ein
ume2n1e
-um5engel
+um3engel
+u3mer.
umer2a
u2m1erf
um1erg
@@ -22508,27 +24147,39 @@ um1ite
2umme
um2mei
um3mi
+um3n
um1ob
u3mol
um3ot
ump2fa
-ump4fin
-umpf4li
-um2pho
+ump2fin
+um5pit
1umr
+um4sam
um4s3an
1umsat
-um4s1er
+um4sd
+um2s1er
+1umset
+um4sf
+um4sg
um2sim
+um4sj
um4sk
-um2s1pe
-um2sum
+um4sm
+um2s3pe
+2umspf
+um4ss
+um2su
+um4sv
+um4sw
um3t2
+um4ts
u2mum
u2m1u2r
1umz
un1
-4un.
+2un.
2una.
1unab
un2a3br
@@ -22541,18 +24192,18 @@ u2narb
2un2a1s4
un3at
un2är
-2und.
+4und.
un2da
unda2b
un2dän
1undd
2unde
un3de.
-underer6
+underer4
und3erf
und3erö
-underten8
-under8tend
+underten4
+under6tend
und3erz
un2dex
1undf
@@ -22562,43 +24213,48 @@ un2dim
1undn
undo2b
un2dop
-un2dor
4un2d3r
und3s
4unds.
2undsc
+unds2p
un2d1um
undü4
1undv
-1undz
-u3ne2
+1un4dz
+une2b
+une2d
+un2ei.
un3eid
un3ein
+un3eis
un2emi
une4n1
+un2ens
unen2t
-une3re
-une3ri
-u4nerk
-u4n3erz.
+un2enz
+u3ner.
+un3erz.
un2es4
unf2
un3fa
-unft4s
un2gab
un2gam
+ungar4
un2gat
+1ungeh
3ungena
-unger4e
+unger2e
1unget
1ungew
-ung5h
+ung5ha
1ungl
+ung3lat
un2glu
un2go
un2gr
ung3ri
-ungs3
+un4gs3
ung4sa
ungs5tr
u3nic
@@ -22615,20 +24271,22 @@ un3isl
u3n2it
1u2niv
2unk
-un2k1a2
+un2k1a
+4unke
un3ker
un2k1es
un2ket
un2kne
-un2ko2p
+un2ko4p
un2kro
unk3s2
unk4tit
unk2tr
unlö2
+1unm
unna2
un4n1ad
-unn2e
+unn2e2
unne4n
u2nob
uno4r
@@ -22636,21 +24294,23 @@ un2os
1unr
uns2
2uns.
-unsch5el
+unsch3el
un3se
1un3si
un3sk
un4ski
-un3sp
-unsta4g
-unste4c
+un3s4p
+un4sr
+unsta2g
+unste2c
uns4t1r
4unsy
4unsz
1unt
un3ta
un3te
-unte4ri
+unte2ri
+3unterr
4unti
un3tr
unt3s
@@ -22658,6 +24318,9 @@ unt3s
3unty
2u2nu
u3nuc
+unu4s
+u1nü
+1unv
unvol2
unvoll3
1unw
@@ -22670,6 +24333,7 @@ unz2e
2uo
u1o2b
u3of
+u1op
u1or
u3or.
uo2r3a
@@ -22677,30 +24341,35 @@ uor3c
u3oret
uo2ris
u3ors
-uor5t
+uor5tr
uos2
u1os.
uote2
u1ox
-uö2d
+u1ö2d
u1ök
-u1pa
+u2p
+u3pa
+u3pä
3upd
-u1pe2
+u3pe2
uper1
uperer4
+u3pé
up2fa
-u2pfe2
-u2pfi
-up2fu
-u3p4i
+upfe2
+u3p4fl
+u3p2fu
+u3ph
+u3pi
+up4id
+u3pl
up4lu
u3po
2upp
up2pl
-u1pr
+u3pr
upra3
-u2p3ras
up4t3a2
upten1
up4tene
@@ -22708,235 +24377,251 @@ upt3erf
upt3erg
upt3erk
upt3ers
-up4tin
+upti2m
+upt3in
up4t1o
up4tr
-u1q
-4ur.
+u3pu
+u3py
+up4yb
+2ur.
u1ra
u2rab
u3raba
ura2be
+u2r1aka
u2r1akt
-u2ral4t
+u2ral2t
u2r1am
ura4na
-u3rand
-uran6fän
+u3r2and
+uran4fän
ur1ang
-uran4ge
+uran2ge
ur2anh
-uran5s
+ur2anr
+uran3s
+ur2anti
ur1anz
ur3ap
u2r3ar
ura4ri
u3rasc
ur1asp
-ura4str
+ura2str
ur4ate
-u2r1att
+u2r3att
ur1au
2u1rä
ur1äl
-ur1ä2m
+ur1ä4m
ur1än
ur3b2a
2urc
urch1
+urch3s
urcht3e
urd2
ur3da
ur3di
ure1e
ur1eff
+ur1ehr
ur1eig
u2rele
ure2n
ure4na
-u4ren4se
-u4rentn
+u2ren2se
+u2rentn
u2r1ep
urer3h
urer3k
ur2ert
u2rerw
ur1eta
-ur2e3th
ure3u
2urf
-ur2f3l
+urf3l
+ur2fli
ur2fro
-urf4spr
+urf2spr
urf3t
-ur6gense
+ur2gei
+ur4gense
urg3inn
urg1l
ur2gla
ur2gri
-urgros4
+urgros2
urg1s4
uri2c
ur1ide
uri3en
u2r1ind
-urin6sek
-urin8stin
+urin2se
+urin4sek
u2ri2so
ur3ku
ur3l
-ur4matt
+ur4ls
+ur2m1ar
+ur2matt
ur2m1au
urm2ei
-ur4mern
-urmet1
+ur2mern
+urme2t
ur2mum
ur2mun
ur3n2e
+urn2o
2u1ro
urob2l
ur1off
uroh2
uro1s4
-urost2
2u1rö
-ur3p4
+ur3p
2urr
ur3re
ur2rh
3ursac
ur2san
-ursau4
-ur2s1er
-ur4s1of
+ur4s3au4
+ur2s3er
+urs3int
ur2spa
-ur3sze
urt2
2urta
ur2tai
urt3ein
ur2tro
urts2c
-u3ru
+2urtu
uruf4
+uru3fl
+ur1umh
+ur1ums
urü2
ur2z1a2
ur2zä
ur2z1ec
ur2zep
-ur2zi
ur2z1op
urzt4
-ur2z1w
+ur2z3w
2us
us3a2b
usa2gi
+usal3t
u4s1amb
u4samt
u2sang
-us2ann
-us3ark
+us4ann
usa2s3
us1ast
u2säh
u2s1äs
-u4schab
-u4schak
-u3sche.
-u4schef
-usch5eic
-u4sch3eu
+u2schab
+u2schak
+u2schar
+u3schart
+u2schef
+usch3eic
+u4schen4e
u3schi
usch3mü
-u3schu
-usch5wer
+usch3wer
+u3se.
u3s2e3b
u2s1ec
+use1e
use2ei
u2s1ei
-u4sen4se
-u4sentl
-u3sep
-use4rec
+u3seid
+u2sen2se
+usen4te.
+u2sentl
+use2rec
u2s1erl
u2serp
us1erw
u2s1ese
u2sex
+u3si.
u2sid
usi3er.
-usi5ers.
+usi3ers.
u3sik
-usi4kat
+usi2kat
us1inn
+u4ske
us3kl
+u4sko
+u4skö
+u4sku
us3oc
us1oh
u3sol
u2sop
us1orc
us1ou
+u3sov
u2spac
+us2par
us3part
-u2s1pas
-u3spec
+u2spas
+us3pe
+u3s4pec
u3spek
u2sph
-us1pic
+us3pic
u3spit
u3s4piz
u2spo
us2por
u2spu
-usrich7
+usrich5
us2s1ad
-us2s3eb
+us2s1eb
usse4g
usse4n
us2sep
-us5ser.
uss3erf
-usser4z
-us4sesp
+us2sesp
us2sez
-uss3k
us2sof
us2sum
+us4sw
+us5taa
u1stad
u1stal
us3tau
us4tein
u1stel
ust3erl
-us2th
-us3ther
us3tin
us3tr
us4tras
-us6tris
-u1stu
-u2stun
-u2stur
+u2suf
+u2s1umb
u2sumd
u2sumg
u2sumz
-u3sur
3usus
u2sü
2uß
-uß1u
-2u1t
-4ut.
+u2ß1u
+2ut
u3taf
u2t1alt
-u4t1a2m
+u4t1a4m
ut2ans
u2t1ap
-u2t1ar
-uta2s
+ut1ar
+uta4s
u2taut
ut1äh
-u2tär
+u2t1är
ut3c
ut1e2d
u3teh
@@ -22950,15 +24635,14 @@ ute2n1
uten2a
u2tent
u4tentf
-utera2
-ute4ral
-ute5r4er
-ute6ring
+ute2ra4
+ute3ras
+ute4ring
uter3k
-ute4ros
+ute2ros
ut2es
ut2et
-u2t2ev
+ut2ev
u2t1ex
utfi2
ut3hal
@@ -22972,114 +24656,125 @@ u4tigel
uti2vi
utli4n
uto3c
-u5to3m
-uto1p
-uto3pa
+uto3p
u2tops
utor2a
u4tord
uto2re
-uto4rin
-uto3s2
+uto2rin
+uto3s4
4utou
u2töl
-4utr
ut3rea
u2trou
ut3rü
-4uts
utsau2
ut2säu
-ut4schl
-ut4schm
-ut4scho
-ut4schö
+ut2scha
+ut3sche
+ut2schl
+ut2schm
+ut2scho
+ut2schö
ut3ser
-ut3s2k
+u4t3sk
uts2p
ut3sta
utt4er
-ut5t2l
+ut3t2l
utts2
-utu2b
+utu4b
u2tum
-utu4n
+utu2n
u2t1une
utu4re
utu3ro
-utu5ru
+utu3ru
u3tü
-u6tz
+utz3a
ut2zeh
utz3eng
utz2er
+utz4erg
ut2zet
ut2z1in
ut2zis
ut2zö
-ut2z1w
-2u1u4
-uufe2
+ut2z3w
+2u1u2
+uu4fe
uum1
-uuma4
+uu4ma4
uume2
-u1ü2
-2u1v4
+u1ü
+uü4be
+uv2
u2ve.
uve3rä
-u1w
+uv4re
2u1x
ux2e
ux2o
ux3oe
-ux3t4
-u1y
-u2yo
-2u1z
+ux3t2
+u1ya
+2uz
uze2
u2z1ec
u2z1ene
uz2er
-uzo2f
+uzo4f
uz3ot
-uz1we
+uz3we
uz3z2
-1üb
+uz4zb
+1ü2b
üb1ä
2übc
2übd
-übe2
+üb2e2
übe3c
übe3le
+ü3bem
+ü3ben
übe4na
übe3ne
über1
-ü4bet
+ü3bes
+ü3bi
üb3l
-üb5r
+üb3r
+üb5rig
üb2s3t
2üc
ü1che
üch3l
üch2s1c
ücht4e
-ü3cke4n
+ü3cke4n1
ück1er
ück3eri
-ücker6ke
-ü4ckers
+ücker4ke
+ücker2l
+ü2ckers
ü2ckin
ü2ckum
-ü4d3a4
+üd3a2
+üda4m
+üda4s
üde2c
üde2l
ü3den.
üden2g
ü3d2ens
-üd3o4
-üd3r
+üdf6lan
+üd1o2
+üdo4s4
+ü2d3r
üd3s2
-üd3t4
+üdsa1c
+üdsau2
+üd3t2
üdu2
üe2
üeb3
@@ -23093,15 +24788,14 @@ uz3z2
ü2f1erg
üf2fl
ü2f1i
-üf3l
+ü2f3l
ü2fo
ü2fum
-ü1g
üg2e
üge2l1a2
üge2lä
üge4lec
-üge6lei6s
+üge4lei4s
üge2lo
ügen3s
ü2g3l
@@ -23111,7 +24805,7 @@ uz3z2
üh3a2
ü1he
ü2h1ei
-ü2h3e4m
+ü2h3e2m
ü3hem.
ü2h1eng
ü2h1ent
@@ -23119,19 +24813,25 @@ uz3z2
ü2h1er2k
ü2h1er2z
ü2hex
-üh1i4
+üh1i2
+ühi4r
ühla2
+ühl1au
üh1lä
üh2lel
+ühlen1
+üh2lene
ühl2er
üh2lö
+ühl2se
ühl4sk
-ühl4sta
-ühl4sti
+ühl2sta
+ühl2sti
üh3mo
üh3ne
ühn2s
-üh1o2
+üh1o
+üho4f
üh3r2e
ühr3ei.
ühre2n1
@@ -23139,36 +24839,42 @@ uz3z2
üh1ro
ühr3ta
üh1s
-ühs2p
+ühs4p
üh3t
üht2a
üht4r
ü1hu
-üh1w
-ü1k2
+üh3w
+ük2
ül1a
ül2c
ü3l2e
ü4l3ef
+ül3eim
üle2r3a2
ül2l1a2
ül2l1ei
-üll2er
+üll2erg
+üller2z
ül2lid
ül2lo
ül2lö
ülls2
ü2lö
ü1lu
-ü2ma
-ü2ment
+ü2m
+ü3me
+ü4ment
+ü4m1e2p
üme2ra
-ü2m1id
-ü2m1in
-ü2m1u
+ü3mi
+ü4m1id
+ü4m1in
+üm1u
2ün
-ü4n3a2
+ü2n3a2
ün2da
+ün3di
ün2dr
ünd3s
ü2n1erd
@@ -23177,34 +24883,41 @@ uz3z2
ün2g3l
ün2s
ün3sc
+ün4sd
ün3se
ün3sp
ün3sta
-ünster3
+ünste2r3
ün3str
ün2za
ün2z1i
ünzu2
ün2zun
ün2zw
-ü1pe
+ü2p
+ü3pe
üpf3l
-ü1pi
+ü3pi
+ü3pl
üp2pl
+ü3pu
2ür
ür1a
ü2r1ei
ü2r1e2l
-ür2f1er
+ür2f1er2
ür2fl
ür2fr
-ür4g3en4g
-ürge4ra
+ür2g3eng
+ürge2ra
ürk2e
ü3r2o3
+üro5fe
ürom2
+üro5ma
üror2
ürr2
+ür2r3h
ür2s
ür3sc
ür3se
@@ -23213,10 +24926,12 @@ uz3z2
ür3sta
ürte2l3
ürt2h
+ürz2a
ür2z1in
ür2zö
-ür2z1w
+ür2z3w
üs2a
+ü3schi
ü2schl
ü3s2e
üse1e2
@@ -23224,24 +24939,29 @@ uz3z2
üse4n
üse3r4
üse1s
+üs2p
üs4s3a
+üs4sä
üs2s1c
-üss2e
üs4s3o
üs2st
üst3a
üste2n
-2ü1ß
+üs4tl
+2üß
+ü3ße
+ü3ßi
2üt
ü2t1al
üte3m
üte4n
-üten3s
+üten3s2
ütent4
üten3z2
üte2ra
-üte2r1e
-üterich6
+üte2re
+üter3ei
+üterich4
üter3n
ü2t1h
ü2t3r
@@ -23251,30 +24971,25 @@ uz3z2
üt2tr
üt3zen
üt2zw
-ü1v
-ü1z
+1v
3va.
2v1ab
vab4r
va1c
-va1f4
-va3g
-vag2a
-va4gh
+va3f
+va3g2a
va2la
2valu
v2an.
2vanb
-2vang
v2ans
2varb
v1arm
vas2
2v1ass
va1st
-v4at
va2t1a4
-va6tag
+va4tag
va4tan
va2tei
va4t3eng
@@ -23284,23 +24999,27 @@ va4tid
vati3k2
va4tim
va4t1in
-vati8ons.
+vati4ons.
va4tord
va4t3r
-vat3s4
+vat3s2
va2t1u
2v1au
-2v1b
+2vb
2v1c
-2v1d2
-1ve2
+2vd2
+ve2
+ve3ak
+2ve3al
ve3an
ve3ar
veau3
-veau1s
-ve3b4
+ve3b
+veb4r
ve3d
-ve3fa
+ve3e2
+ve3f
+ve4ff
ve3g
ve3h2
2veig
@@ -23316,66 +25035,74 @@ v1ele
ve3lei
ve3l2i
ve3lo
-vel2o1p
+vel2o3p
ve3ma
ve3me
2v1emp
2vemu
ve3nal
ve4nas
-ven2c
+v1endu
ve3ne
+venen2d
+2venerg
ve3ni
ve4nin
ve3nö
ven6t3ag
vent4sk
+ven2za
2veo
ve3of
+ve3pa
ve4pi
ver1
ver3a
ve3rad
2veral
ve3rand
-ve3r4ane
+ve3rane
vera4s
-ver6bart
+ver4bart
ver3b2l
-ver3d2
+ver3d4
vere2
-verf4
+vere4i
+verein4s5t
+ve4rf4
ver3g4
ve3ri
ve4rin
ver3k
vern2
-ver4sep
+ver2sep
+ver3sta
vert4
-ver5te
+ver3te
ver3u4
ve3rus
-ves1
ve3sa
-2ve3s2c
-2ve3s2e
+2ve3sc
+2ve3se
+ves3p
ves3ti
-ve3ta
+ve3t
vete1
vete3r
-ve3ti
-ve3tr
-ve3t2s
+ve4tl
+ve4ts
+ve4tt
2veü
ve3v
ve3w
-2v1f4
-2v1g
+ve3z
+2vf2
+vf4gh
+2vg
2v1h
vi1an
vi3ar
vi4a3t
-vi2ä
vi2c
vi3de
vid3s2t
@@ -23385,7 +25112,7 @@ vi2el
viela2
viele2
vi2er
-vie4rec
+vie2rec
vie2w1
vig2
2vii
@@ -23394,8 +25121,8 @@ vi2l1a
vi2lä
vi4l1e2h
vi2lei
-viler4
-vi4lers
+viler2
+vi2lers
vi2l1in
vi2ma2
vi4na
@@ -23411,45 +25138,51 @@ vi2sp
vis2u
viv2
viz2
-vize5
-2v1k
-2v1l4
+vize1
+2vk
+2v1l2
v3le
v2lie
-2v1m
+2vm
vm2e
+vmwa4
2v1n2
-1vo
2v1ob
vo2be
vob4l
voge2l3
vo2gu
+vo2i
vol2a
vol4l1a
-vollen6
-vol6lend
-vol6ler6t
+vollen4
+vol4lend
+vol4ler4t
vol2li
2v1op
+vo2pe
vo2r1
vo4r3a
-voran8schl
+voran6schl
vor3g
vo3ri
vo4rie
vo5rig
vorm2
-vormen4
+vormen2
vor3o
-vort4
+vor3t4
+vo4ru
+vo5ruf
vot2a
-voy1
vö2c
-2v1p
+2vp2
+v3pf
+2vq
vr2
v1ra
v2ree
+v4ret
3v2ri
2vs
vs2c
@@ -23457,8 +25190,9 @@ vs2e
vs2p
v1sta
v1steu
+v1str
v3s2z
-2v1t
+2vt
vue3
vu2enu
vu2et
@@ -23466,87 +25200,92 @@ vu2et
2vumg
2vumk
v1ü
-2v1v
-2v1w
-2v1z
+2vv
+2vw
+2vz
+1w
w2a
-1waa
+3waa
wab2bl
wa3che
-wach8stub
-wach4t4r
-1wack
+wach4stub
+wach2t4r
+3wack
waffe2
waffel3
-1wag
-wa5ge
-3wage4n
+3wag
+wa3ge
+wa5ge4n
wa2g3n
+wag5ne
wa3go
-1wah
-wahl5ent
+wag4r
+3wah
+wahl3ent
wah4ler
wah2l1i
-1wal
+wa4ig
+3wal
+wala3c
wa2lar
-2walb
+4walb
wal4d3a
-wal4din
+wal2din
wal2dr
wa2les
wa3li
+wa5lis
wal2m1
wals2
-walt1a
-wal6tere
-wal6terl
+wal4t1a
+wal4terl
wal4to
-wal4tur
-3walz
+wal2tur
wa3na
wan2d1a2
-wandels6
+wandels4
wan2dr
w3anf
-2wang
wan3g2e
-wang4s
-1wann
-wan6z5en6d
-wan4zer
+wang4s3
+3wann
+wan4z3en4d
+wan2z3er
wa2p
-1war2e
+3war2e
ware1i
-wa5ren
-1warn
+wa3ren
+3warn
war4ni
-wart4e
war2th
+wart2st
war2za
-1was
+3was
wa3sa
was2c
-wa4scha
+wa2scha
wa3sche
-wa4sch3l
-wa4schw
+wa4schei
+wa2sch3l
+wa2schw
wa3se
wa3sh
-was3s
+was3s2
wass4e2
wa3su
-w2ä
-1wäh
-1wäl
-2wäng
-1wäs
+wäch3s2e
+3wäh
+3wäl
+wäm3
+4wäng
+3wäs
wäs2c
wäss4e
-2w3äu
-2w1b2
+2w1äu
+2wb2
wbu2
2w1c
-2w1d
+2wd
we2a
we2b1a
webe1i
@@ -23555,257 +25294,271 @@ we2bo
we2b3r
webs2c
we3cke.
-we5cken.
+we3cken.
we3ckes
-we2e2
+wee2
weed3
+wef2e
we2fl
-1weg
+3weg
we2g1a
we4g1ei
-weg5ersc
+weg3ersc
we4g3l
we4gn
-we2g1o2
+we2g1o4
we4g3r
-weg3s2
+weg5re
+weg3s
+wegs2a
wegs4t
-1weh
-weh4r3er4
+3weh
+weh2r3er2
wei2bl
weib4r
-2weie
-weifel6d
-wei4fre
+4weie
+weifel4d
wei2gr
-weigs4
+wei2ha
wei3k4
3weil
-weinsau6
+wei3le
+weinsau4
wei3sc
-weis6sel
-weis6spi
+weisch4
+weis2sp
wei2t1r
wei5ze
wel5le4
-wel6schl
-wel6schr
+wel4schl
+wel4schr
wel2t1
wel4t3a2
welte4
-wel6t5en6d
+wel4t3en4d
wel4th
welt3i
wel4to
-wel6t3r
+welt3r
+wel6tri
wen3a2
-wendes4
+wendes2
wen2gl
we3n2i
-wen2ka
-wen4kla
-wen4k3ri
+wen2kau
+wen2kla
+wen2k3ri
we2r3a2
wer5be
werbe3i
wer2bl
werb2s
-1werbu
wer3d2
-5werdens
-1werdu
+3werdens
+3werdu
werer2
wer2fl
-2werg
wer2ga
-wer6gels
+wer2gel
wer2g3o
wer2gr
werin2
we3rins
we2ri4o
-1werk.
-wer2k1a
-1werke
+3werk.
+wer4k1a
+3werke
wer2ki
wer2k3l
wer2kn
wer2k3o
-wer4k3re
+wer2k3re
wer2ku
we2rö
wer2s
+wer3sc
wer3sp
wer2t1a
wer2tä
-wert3ei
-wer6teig
-wer6t5erm
+wer2tei
+wert3eig
+wer4t3erm
wer2th
-wer4tin
+wer2tin
wer4t1o2
-wer4tre
+wer2tre
wer6t3ri
-wer4tum
-1wes2e
-we2sp
+wer2tum
+3wese
+we2s3p
we4st
wes4t1a
weste2
west3ei
-wes6ten6d
-wes4tex
+wes4ten4d
+wes2tex
wes2ti
-wes4t1o2
+wes4t1o4
wes4t3r
-wes4tu
-1wet
-2wets
+wes2tu
+3wet
+4wets
wett3s
2w3ey
-2w1f
-2w1g
-whi4
+2wf
+2wg
+whi2
+whi4t
w3ho
w2i
wicht4s
wi1cka
-1wid
+3wid
wi2e
-2wieb
-1wied
+4wieb
+3wied
wie3l
wie3n2e
wik2
-1wild
+3wild
wim2ma
-wim6ment
wim4m3u
win2a
-win4d3e4c
+win2d3e2c
win3del
-win6d5erz
-1win2d3r
-2wing
+win4derz
+3win2d3r
+4wing
win2g3r
win2kl
-win8n7er8sc
+winner2
+win4n5ersc
win2no
win3s
wint2
-1wi4r
-wire3
-wi5s2e
-wi2sp
-1wiss
+3wi2r
+wi4re3
+wi3s2e
+wi5sen
+wi2s2p
+3wiss
wiss4z
wi3th
-1witz.
-1witzl
+3witz.
+wit2zer
+3witzl
wiz2
-2w1k
+w2j
+2wk
2w1l
-2w1m
+2wm
2wn
wns2a
wn3sh
-1wo1c
+3wo1c
wo2cha
woch2e4
-1woh
-woh4lei
+woh2lei
woh4na
-1wolf
+3wolf
+wol3fe
wolf2s3
wol2la
-wol4ler
+wol2ler
wor3a
wor3d
-wo4r3i
-worn2
+wo2r3i
wort1a
-wor4tel
-wor6terh
+wor2tel
+wor4terh
wor4t3r
-wort3s2
+wort3s
wo4r3u
wor3ü
3wos
wot2
-1wöc
+3wöc
wöl2fo
wört2h
-2w1p
+2wp
w2r
w3re
w3ro
2w1s
-ws2e
w3s2h
w3s2k
+w4sk.
ws2t
-w4s1u
-2w1t
+w2s1u
+2wt
wti2
w2u
-1wuc
-wuch4sc
-wuch4st
-w3u2f
+3wuc
+wuch2sc
+wuch2st
+w3uf
+wu4fe
wul2
wul3se
wund4e
wung3r
wungs4
wun2s
-wunsch5l
+wunsch3l
4wur.
wur2fa
-wur2f1o
+wurf1o
wur2fr
wur2s
-1wurst
+3wurst
wus2
wus3te
-1wu4t1
-1wüh
+3wu2t1
+wu4te
+3wüh
wül2
wün3
-1würf
-1würst
-2w1w
-2w1z
+3würf
+3würst
+2ww
+2wz
x1a
1xa.
2xa2b
1x2ac
1x2ad
1xae
-xa1fl
+xa3fl
1x2a3g2
2xal
xal2l
-xa2m
+x3am
+xa5met
+xa4mi
+x2an.
1xane
1xani
x2an3t2
+xanti3
x2anz
xa2r
1x2as
xa2z
-2x1b4
+2xb
+xb4ri
+xcal2
x1ce
x1ch
x1cl
-4x1d
-xda4
-xdy2
+2xd
+xda2
+xda4t
1xe
3xe.
-2x1e4g
+2x1e2g
+xe4ge
2xek
xe2l
-3xel.
x1ele
xe3lei
x1em
@@ -23820,36 +25573,39 @@ x2ere
2x1erl
xer2la
x2ern
-xers2
x2ers.
+xe4rx
3xes
2x1eu
2x1ex
-2x1f
-2x1g
+2xf
+2xg
2x1h
xi1c
xich2
-2xid
xi2dan
xide2
xi2dei
xi2d3em
x1i2do
-3x2ie
+3x2i2e
xie3l
+xi4en
xi3g
+3xi3k
+xik4l
xi2ler
xili3a
xi2lo
xi2l1u
-xim2
+1xim2
xin3s2
x2is
xi2sa
xi2s1e
+xiso2
xi2sp
-xis3s2
+xis3s4
xis3t
xis4tä
xi2su
@@ -23857,26 +25613,28 @@ xi2su
xi3te
x1i4tu
xive4
-x1j
-4x1k2
+2xk2
xkal2
-4x2l2
+2x2l2
x3lä
x3le
-2x1m
+2xm
2x1n
-2xod
-2xoe4
+2xoe
+x3o2l
x1o2r
-xos2
+3xos2
2x1ö2
-4x1p
-xpor6ter
-xpor4t3r
-x1q
+2xp
+xpor4ter4
+xpor2t3r
x1r
-2x3s2
-4x1t
+2x1s2
+x3sh
+x3sk
+x3st
+x3sz
+2xt
xt1a
xta2b3
x3tan
@@ -23885,7 +25643,7 @@ x3tas
x2t1ä
x3tät
xtblo4
-xtblock5
+xtblock3
x2t1e2d
xt1ein
x2t1el
@@ -23896,9 +25654,9 @@ xtfi2
x2t1h
x2t1id
xti2la
-x2til2l
-x2t1o4
-x4tor
+xtil2lu
+x2t1o2
+x4to4r
xtra3b4
x2t3ran
x2trau
@@ -23912,34 +25670,39 @@ xu2n
2xunt
xu2s3
xusa2
-xuss4
-2xv
-2x1w
-3xy.
-x1z
-2y1ab
+xuss2
+2x2v
+x3ve
+x3vo
+2xw
+1xy.
+2yab
1ya2c
y2ach
+y2ag
ya1h
y1al.
+ya4mo
+y1an.
+y2ana
yan2g
y1ank
-ya1q
-ya3ra
+y2aq
+y1ar
+y2a3ra
+y2are
yas2
yas3t
y1ät
-y1b
ybe2r
y1c
y2chi
y3chis
ych3n
-y1d
-yd2o
+ydi3e
ydri2
ydrid3
-ydro3
+yd4ro3
y1e
y2ec
ye2d
@@ -23951,56 +25714,65 @@ y2ere
yer2n1
y2es
y4es.
-yes2p
+y4esp
ye2th
-y1f2
-y1g
-ygi2
+yf2
ygie3
yg2l
y1h
y3ho
yhr2
-2y1i4
-y1j
-y1k2
+2y1i2
+yi4sc
+yk2
yke3n
-yk4l
-yk3s2
-yl1a2
-yl2a3g
+yk4la
+yk4ni
+yk4no
+yk3s
+yk3t
+yl1a
+yla2c
+yl2ag
y1l2ak
yla4l
-y2lam
+y2la4m
+yla2n
yl3ane
y1lant
-yl4ante
-yl4anti
+yl2ante
+yl2anti
yl2as
-ylau2
+y1lä
yl3c
yle2
y2le.
yl1em
-y2l1es3
+y2l1es
y2l1e4t
yli4n
-ylo1i2
yloid3
yloni1
yl2op
yl1ora
yl3s2
-yl5t
-ym2a
+yl5tri
+y2m
+y3m2a
ym4an
ym4ar
ym4as
-ym4e
-ymp4
+y3mä
+y3me
+ym4el
+y3mi
+y3mo
+ymp2
ym2pha
-ympi1e
-ynä4r
+ympi3e
+ymp4t
+y3mu
+ynä2r
yn2eu
ynk2
y2n1o2
@@ -24012,28 +25784,27 @@ y2od
yoga3
yom2
yon2a
+y2onn
y1ont
yo2pe
yo1s
y2ost
+y3ot.
y1ou
-2y1p
+2yp
ypa2b3
ypa2n
yp2e2
ype4r3o2
-y2pf
y2p1i2d
y2p1in
y2plo
y3po3
-y4p3s
yp3th
ypu2
y2p1um
-y1q
y1r
-y3r2e
+yr2e
y3ri
yri1e
yri3en
@@ -24045,36 +25816,39 @@ ys2an
ysch4
ys2e1
ysein2
-y4s3l
+ys3l
ysme3
ys2po
-ys1pr
-yst2e
+ys3pr
+ys3t2e
+ys5tem
yst2h
ys2the
-ys3to
+y1sto
+ys4tol
+ysto4le
ys3tr
ys4tra
y4stro
-y3s2ty
+y3s4ty
ysu2
-y2s1ur
+ys1ur
y3s2z
-y1t
-y2te.
-y2tes
+y4tes
yt2h
ythe1
+ythi3e
y3to1
ytos2
-y4t3r
-yu2r
+y2t3r
+y1u2r
yur2e3
-y1v
-y1w
+yvet4
+yvon4
y1y
-y1z2
+yz2
yze3r2i
+1z
2z1a2b
zab3l
za1c
@@ -24085,42 +25859,48 @@ zach2s
za3gr
3z2ah
zah3len
-zah4ner4
+zah4ner2
z1ak
4z3akk
2z1al
+4z3alb
4z3ald
3zali
-2z1a2m
+2z1am
+za4me
z1a2n
-4z3a4n4a
-2z3anb
+z2an.
+2za4n4a
+2zanb
za3ne
-2z3anf
-2z3angs
-3z2ank
+2zanf
+2zangs
+2zanh
+z2ank
zan2ka
-z3anl
-2z3anr
+2zanl
+2zanp
+2zanr
zanti1
+2zanw
za4pf
-z1aq
+z1a2q
z1ar
3zar.
2zarb
za3re
2zarm
3z2aro
-z2arr
zar2t1r
2z1as
-za2sc
+zas4b
+za4sc
zast4
z3at
zat2e
za2to
3zaub
-2z1au2f
+2z1au4f
2z3aug
3zaun
z3aur
@@ -24132,33 +25912,42 @@ zä3hi
3zähn
2z1äm
z1än
-z1äp
z1är
2z1äus
2zäuß
-4z3b4
+2zb2
+zbah2
zber2e
-zbü1b
+z3bo
+zb4ri
+z3bü
+zbü3b
zbübe3
-2z3c
-2z3d2
+2z1c
+z3ca
+z3ch
+2zd2
+z3da
zdan2
zdä1
zdi1st
+z3dü
3ze.
2zea
+ze2ana
2z1e2ben
ze1c
2z1e2cho
ze1e2
-zeeu3
2z1eff
z1e2ga
zehe4
zehen1
zeh2l
+zeh4n1a
+zeh4n3en
ze3ho
-zei1f4
+zei3f4
zeik4
zeil2
zei3la
@@ -24173,13 +25962,15 @@ ze2i1s4
zei3sk
3zeit
zei2t1a
-zei4t3er
+zeit3end
+zei2t3er
zei4to
zei2tr
zeit3ri
-zek4
+zek4l
ze2l1a
zela2d
+zel3am
zel3a2n
ze2l1ä
zel3d4
@@ -24193,9 +25984,9 @@ zel3la
zel4lab
zel4l3ac
zel4lar
-zel6lein
-zel6ler6t
-zeller6z
+zel4lein
+zel4ler4t
+zeller4z
zell3s2
zelm4
ze2l1o
@@ -24203,16 +25994,19 @@ zels2
zel3sa
zel3sz
zel2ti
+zelu4
zembe2
+zem4e
2z1emp
-5zen.
+3zen.
ze4n1ac
ze4nas
zen3au
ze2nä
ze3n2em
zenen1
-4zenge.
+3zenerk
+2zenge.
z4engl
2zengp
2zeni
@@ -24221,17 +26015,18 @@ zenk2
zen3n
ze2n3o
ze4not
-4zen4sem
-zen4ser
+2zen2sem
+zen2ser
zens2p
z2entn
z1ents
2zentw
2zentz
-zen4z3er
+zen2z3er
zen2zw
zeo4r
3z2er.
+zer3a
ze2rad
ze1ral
ze2rat
@@ -24241,130 +26036,146 @@ zer2em
z2erfe
z3erfül
2z1ergä
-4z3ergeb
-z4erges
+z3ergeb
+5z4erges
z4ergl
-zer4gon
+zer2gon
4z1ergu
3z2erhe
-2z3erhö
-zerin6te
+2z1er3hö
+zerin2t
z2erko
3zerl.
-zer4lau
-zer4le.
-4zerleb
-zer4len
+zer2lau
+zer2le.
+2zerleb
+zer2len
2zerlö
3z2ern
-zer4nan
-zer4n3e4b
+zer2nan
+zer2n3e2b
zer4nei
2z1erö
zer2öf
+ze1rös
2z1erq
+3zerr
4z3erreg
-zers2
z2ers.
-2z1er4sa
+z1ersa
zerta2
zer4t3ag
-zert4an
-zer6teng
-zer6tere
-zer6terl
-zer4tin
+zert2an
+zer4teng
+zer2ter
+zer2tin
zer2to
-6z5ertrag
-zer6trau
+z3ertrag
+zer4trau
z1erwe
-4zerwei
z1erz
zer2ze
3z2es.
ze2sä
ze3sch
zes1e
-ze2sp
-ze4spo
+zes3p
+ze4s5po
zes2sa
-zessen4
-zes6s5end
-zes6sent
-zes4ser4
+zessen2
+zes4s3end
+zes4sent
+zes2ser
zes2sp
zes2st
+zes2sum
ze1sta
ze3stau
ze1str
+ze3stra
z2et.
2zeta
2ze2th
ze2tr
2zetts
-zeu4gem
+zeu2gem
zeu2g3r
2z1eul
ze1ur
2z1e2x1
-4z3f4
+2zf
+zf4at
+z3fe
zfeue2
-2z3g4
+zf4la
+zf4le
+zf4re
+zf4rü
+2zg2
zger2a
zger4s3
+z3gn
+zg4nu
2z1h2
-z2hen
+zhau2t1
zhir3
zi3alo
zi2ar
zich2o
zi2dei
-zie4ler
+ziele2
+zie2leb
zie2l1i
+zi3en
zien3s
zi1erh
zi1es
-zi3ess
zig4s
-z2il
+2z3ik
+zi2ko
zil2e
-2zimp
+4zimp
zim4t3
2z1ind
zin2e
zin3ei
2z1inf
z1inh
-zi4n3in
-zin1it
+zi4n1in
2z1inj
zin4na
zin4o
zin2sa
-zin4ser
-4zinsuf
+zin2ser
+zin4sk
+2zinsuf
2zint
zi2o3
zirk2
-zirk6s
+zirk4s
z1iso
zi2sp
zisse4
zi3s2z
-zi1th
+zi3th
zithe2
zi4t1o2
zit2u
ziv2
-2z1j
-4z1k4
+2zj
+2zk2
+zk4ne
+z3ky
2z1l2
zlei3ti
zle1s
z3ly
-2z3m2
+2zm2
+z3ma
zme2e
-2z3n2
+2z1n2
+z3na
+z3ne
z3oas
2z1ob
2z1of
@@ -24372,46 +26183,57 @@ zo2gl
zog4s3
2z1oh
zol2la
-zoller4
-zol6lerl
-zol6lert
-zonal2
+zoller2
+zol4lert
zon3au
-zon5s4
-zon4t3er
+zon3s4
+zon2t3er
zo2o
-2zope
+2zo2pe
2z1o2r
zo3re
3z2orn
zor4ne
2z1osz
2z1ou
+zo2w
2z1o2z
-2zö2f
+2zöf
+zö4fe
2z1ök
z1öl
2zöl.
3z2öll
2zöls
-2zön
-4z3p4
-2z1q
-4z3r2
-2z1s4
+2zp2
+z3pf
+z3pl
+zp4lu
+2zq
+2z1r2
+z3re
+zreb3
+zrebs2
+z3ru
+2z1s2
z3sa
zsau2
+zse1e
z3sh
+z3si
z3sk
zspor2
-4zst2
+zst2
+z4st.
+z3ste
+zs4to
z3sz
-2z1t
+2zt
zta2n
zt3ane
z2t1au
z4tehe
-ztein1
+ztein3
zt3eins
zt2el
zte3ma
@@ -24431,20 +26253,25 @@ zt3rec
zt3ric
zt3s2
z3tü
-zu1
zu3a
-zub4
-3zuc
+zu1ä
+zub4l
+3zu1c
zuch2e
-zucht3r
-zud4
+zucht3
+zu3cke
zudi4
+zud4r
zu2el
zu3e2r1
zue2t
-zu3f4
+zu3f2
+zu5fei
+zuf4l
+zuf4r
zug2em
-zu4gent
+zu2gent
+zug3g
zug2i
zu3gl
zu4gla
@@ -24452,15 +26279,16 @@ zu4glö
zu2go
2z1uhr
zu3hu
-zui2
+zu1i2
zu3k
-zul2
+zu3l2
2z1um.
zum2a
2z1umb
zumen2
2zumf
2zumg
+2z1umh
zum2i
2zumk
2zuml
@@ -24468,11 +26296,11 @@ zum2i
2z1ums
zum2u
2zunab
-zun2e
+zu3n2e
2z1unem
zunf4
zung4
-4zunget
+2zunget
2zungl
z1uni
2zu2nio
@@ -24482,62 +26310,75 @@ z1uni
2zunt
zuo2
zup2fi
-zu3pl
+zu3pfr
zu3r2a
2z1urk
2z1url
2z1urn
2z1urs
2z1urt
-zu3s4
+zu3ru
+zu3s2
zusch4
-zu5t2
+zus4p
+zus4t
+zu3t2
zut4r
+zu5tri
zut4u
-zut3z
-zuz2
-2zü4b
+zu4t3z
+zuz4w
+2züb
+zü4be
3züc
zür1c
-2z1v
-zw2
-z1wac
+2zv
+z2w2
+z3wac
2zwag
-4zwah
-4zwap
-z1war
+2zwah
+z4wang
+z3war
2zwa2s
+2zwäc
+2zwär
2zwäs
-2z1wed
+z3wech
+z4weck
+2z3wed
2zweg
2zweh
-z2weig
+z4weig
2zweil
-zweiter6
-2z1wel
-2z1wen
-2z1wer
-2z1wes
-z2wic
+zweiter4
+2z3wel
+2z3wen
+2z3wer
+z4werg
+2z3wes
+z4wic
zwi4e
3zwing
2zwirt
-z2wisc
+z4wisc
2zwiss
-z2wit
-2z1wo
-z1wör
-z1wur
-2z1wü
-zy1an.
+z4wit
+2z3wo
+z3wör
+z3wur
+2z3wü
zy2le
-2z1z
+2zz
z3z2a
-zza3b4
-z4z3al
+zzab4
zz4at
-z2z1id
-z2z1in1
+z3zer
+z3zi
+z4z1id
+zz1in
zzi1s4
+z3zo
+z4zor
zz2ö
+z3zu
zzug4s} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/mkii/lang-deo.pat b/Master/texmf-dist/tex/context/patterns/mkii/lang-deo.pat
index cc2d7f1e10e..95ea425d49a 100644
--- a/Master/texmf-dist/tex/context/patterns/mkii/lang-deo.pat
+++ b/Master/texmf-dist/tex/context/patterns/mkii/lang-deo.pat
@@ -2,7 +2,7 @@
% for comment and copyright, see lang-deo.rme
-% used: 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 ß à á â ä ç è é ê ë í ñ ó ô ö ü
+% used: 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 ß à á â ä ç è é ê ë í ï ñ ó ô ö ü
\patterns{
.ab1a
@@ -13,270 +13,289 @@
.ab3s2
.ab3u
.ade3n
-.ae3
.aft2
.ag2a
+.ago1
.ag4r
.ag2u
.ai2s
.akt2a
.al2e
-.al3k
+.ale3u2
.al3lei
-.al5len
+.al3len
+.al3lo3
.al3se
-.al4tei
-.al4tel
-.alter6s5
-.alt1s
+.al2tei
+.al2tel
+.al4terp
+.alter4s3
+.al2tra
.al2tu
.ampe4
-.amt2s
-.amt4sc
+.amt2s1
.ana1c
.an4a3t
.an3d2
-.anden6k
+.anden4k
.and4ri
-.an1er
+.an1e
.ang2
.an3gli
.an3go
-.ang4s2
+.ang4s4
.angst3
.ani2s
.an3k4
-.an3na
.an3s2
.an4si.
-.an4tar
-.an3z2
-.aos4
-.ap5p6le.
-.ari1e
+.an2tar
+.an3z4
+.ap3p4le.
+.ari1
.ar3k2a
-.ar4m3ac
+.ar2m3ac
.ar4mun
.ar2sc
-.ar4tan
.ar4t3ei
-.arter4
-.ar6t5erh
+.arter2
+.ar4t3erh
.ar2t1r
.arz2
-.as6sest
-.as2t
+.as2b
+.as2ko
+.as4sest
+.as4t
+.as2zen
.ata1
.at2h
-.at4r
.au3d
.au4f3
-.aufs2
+.au6fac
+.aufs4
.au2s1
-.au6stes
+.aussen6du
+.au4s3tes
.auß2
.ax2
-.äm3
-.är6schl
+.är4schl
.ät2h
.ät2s
.äu3
.bahn3
-.bah6ner
-.bal3t
.baus4
.be3erb
-.beige4
+.beige2
+.bei4ge.
+.beige4s
.bel2a
.be3r2a
.ber2e
-.ber4g3a
-.berga6s
-.ber6g5e6b
-.ber4g3r
+.ber2g3a
+.berga4s
+.ber4g3e4b
+.ber4gin
+.ber2g3r
.ber4tr
+.be4ster
.bi4os
.bi2t
.bit1a
.boge2
.bo4s3k
-.bu4ser
+.brut3s
+.bu4cher
+.bu2ser
.bus3se
.bussy4
-.bu3ta
+.bü3b
+.bübe3
.ce2ra
-.ch6
-.char8mes
+.ch2
+.champi4o
+.char4mes
.chi3er
+.ch6lor
.dab4
+.da4ch3en
.da2r1
.dar3in
.dar2m1
-.da4te.
-.da4tes
+.da2te.
+.da2tes
.de2al
.de1i
.dein2
-.de8ments
+.de3lo
.de3na
-.den4ka
-.den4kl
-.den4ko
+.den2ka
+.den2kl
+.den2ko
.de1o2
-.de3r4en
+.de3r2en
.derma3
-.dermas6
-.de3sk
+.dermas4
+.des4pe
+.des3s
+.diä2r
.di3el
-.di4en2
-.dienst7a8d
+.dien2
+.diensta6d
.do3b
-.do2mo
-.do1pe
+.do4mo
+.do3pe
.dor2f1
.do2tr
-.dys3
+.dys1
.ebe2r1
+.eg2o
.eh2e
.ehe1i
.ehe5n
-.ei3e2
+.ei3e4
.ei3f2e
+.ei4fr
.ei3k
.ei4na
-.einbus6
.ein3d
.ei2ne2
.ein3eb
-.ein6erl
-.eins2
+.ei3n4erl
+.eins4
.ein3sp
.eise4
.ei2sp
.eis3s2
-.ei4s1t
+.ei4s3t
.ei2tr
.eke2
.ek3li
.el2bi
.el2bl
-.el4fei
+.elb3s
+.el2fei
.el2fl
.em3m2
.en1
.en4da
-.en4d3er4
+.en2d3er2
.en2d3r
.en4dü
.en3ga
.en2gl
.enk2
.enn2
-.ent3
-.en2ta
-.en4tei
-.en7thalp
-.en4tio
-.en2t1r
+.enns3
+.en4ta
+.en4t3ei
+.en5thalp
+.en4t3io
+.en2t3r
+.en3trop
.ents2
.epi1
+.epi3c
.ep3p
-.er4bei
-.er8brecht
+.er2bei
+.er6brecht
.er2bu
-.er4dan
-.erden6k
-.er4d3er
+.er2dan
+.erden4k
+.er2d3er
.er1e
.ere3c
.er2em
.erf4
.er1i
-.ers2
-.er8stein
-.erster6
-.er8sterb
-.er8stritt.
+.ers4
+.er4stein
+.erster4
+.er4sterb
+.er6stritt.
.er8stritten.
-.ert2
-.er4z3el
-.er4zen4
+.er2z3el
+.er2zen2
.es3p
.es2st
-.es2t
+.es4t
.esta2
-.est6e
+.est4e
.est3r
.et2s
.eu3
.eug4
.eur4
+.ever3
.ext4
.fäs3se
-.fe3la
-.fer4no
+.fe3la3
+.feri3
+.fer2no
.fi3d4
-.fi4le.
-.fi4len
+.fi2le.
+.fi2len
.fi2s
-.flö8s7se.
-.flö8s7sen.
-.flö8s7ses
+.flö4s5se.
+.flö6s5sen.
+.flö4sses
.flu2g1
-.fs4
+.fs2
.fu2sc
-.ga2me
-.gan4ga
-.gangs4
+.ga4me.
+.gan2ga
+.gas1
.ga4s3e
-.ga6sten
+.ga4sp
+.ga4sten
.ga4su
.ga2t
.gd2
-.gebe4a
+.gebe2a
.geb2l
-.gel4b3r
+.gel2b3r
.gel2d1
.ge3lu
-.ge3m
.ge5nar
+.gen4aug
.ge3n4e
.ge3n2o
.gente4
-.ge3r4a
+.ge3r2a
.ger2e
.ge3ro
-.ge3s2
+.ge3s4
.glan2
.glanz3
-.gla4s3t
-.gol6der
-.grif8fes
+.gla2s3t
+.grif4fes
+.gs4t
.gus2
-.haft3s
-.hal5le
+.hal3le
.halt4e
+.han2f
.hau2t1
.he2
.he4bei
-.he3fe
.he3le
.he4r3an
.he3rat
-.her6b5ra
+.her4b3ra
.he3rer
.he3ri
-.he6r5inn
+.he4r3inn
.hin3u
+.ho4c
.hof1
.ho4fen
.ho4met
+.hou2
.höch2
.ia2
.il3
.im2a
-.ima4ge
-.im5m2
+.ima2ge
+.imm2
+.im5mu
.in1
.ind2
.in3gl
@@ -289,59 +308,64 @@
.ioni1
.ire3
.is2a
+.istri3
.it2h
.iv2
.joni1
.ka2b3l
.ka2i
+.ka5ka
.kal2a
.ka3le
.ka3t2a
.kat3i
.ka4ti4o
-.ken6num
+.ken4num
.ker3s
-.ki4e
-.klang3
+.ki2e
.ko3b
.kopf1
-.kor4da
+.kor2da
.kraf2
-.ks4
+.ks2
.kus2
.la3be
-.lan8de8mi
+.lan4de4mi
+.lat3s
.le4ar
-.le4gas
+.le2gas
+.leh4me
.le3n2i
-.lich8t7er8s
+.lich6ter6sc
.li2f
-.li3po
-.li4ve.
-.lo4g3in
+.li2ve.
+.lo2g3in
.lo2sc
-.los3s2
+.lo4sk
+.los3s4
.lo2tr
.lo3ver
.lö4ss
-.lus2
-.luster6
-.lu4str
+.lös3se
+.lus4
+.lu2ste
+.luster4
+.lu2str
.lut2h
-.ly2s3
+.ly2s1
.ma3d
-.ma3ge
.mal4e
-.mas8sen.
-.ma4str
+.mani2e
+.ma2str
.mat4c
.matu3
.md2
.mel2a
.me3ne
.me3no
-.men8schl
-.men8schw
+.men4schl
+.men4schw
+.ment2
.mes4sp
.mi2f
.mik4
@@ -355,23 +379,23 @@
.ner2f
.ne1ro
.nich2
-.nicht5e
+.nicht3e
.ni2e
.ni3k4l
.no2c
.no2s
-.no2th
.nul2
.nus2
-.oa5s
.ob1a
.obe2
-.ober5ei
+.ober3ei
.ob3i2t
.och3
+.oe2
.of2e
.ohr5s
.oper4
+.op3fe
.or2a
.ord4e
.or3g
@@ -379,11 +403,13 @@
.ort2
.orts3e
.os3s
-.osta4
+.os4t
+.ost1a4
.oste2
-.ost5end
-.osten8de
-.oste6re
+.ost3end
+.osten4de
+.oste4re
+.ost5erwe
.ost3i
.ost3r
.ot1a
@@ -391,104 +417,108 @@
.ozo4
.öl3l
.pab4
-.part4h
+.par2kl
+.part2h
.pe2c
-.pe3la
.pe3le
.pe3na
.pe4ste
-.pf4
-.ph4
+.pf2
+.pf4l
+.pf4r
+.ph2
+.ph4t
.poka2
-.postei6
-.po8steig
-.po4sto
-.po4str
+.po4stei4
+.po6steig
+.po2str
.ps2
.rabe4
-.ra3ch4e
-.ra3me
+.ra3ch2e
+.ra3e2
+.ra5me
.ra4sp
.ra4s3s
.rau2m
-.rau8schl
-.räu3sc
+.rau4schl
.re3ale
.rebs2
.re3cha
-.re5insz
-.reis6e5i
-.rei6str
-.res2t
-.re4stu
-.ri4as
-.richt6e
-.ri4f
+.re3insz
+.reis4e3i
+.rei4str
+.re3ke
+.re2stu
+.ri2as
+.richt4e
.ro4a
.ro3be
.ro2e
.ro2ha
-.ro3m
.rom4a
-.ro2t3r
+.ro4t3r
.ro3tu
.rö2sc
.rö4ss
.rös3se
.ruf3s
.ruh2r1
-.runder6
-.ru5s6ses
-.rü1b
-.rücker6
+.runder4
+.ru3s4ses
+.rü3b
+.rücker4
.rü4ss
.sa3br
.sali1
.sali3e
.sami1
-.sas2
-.sa5sse
-.sau1c
-.sau4er
-.sau5er.
-.sä5s4
+.sa3sse
+.sas4sen.
+.sau1
+.säs4
.sch4
-.schaf8t7end
-.scheiner8
-.scho7s8se.
-.scho7s8ses.
-.se2e
-.seein4
+.schaf6t7end
+.scho5s6se.
+.scho7s6ses.
+.se2ei
+.seein2
.se2ha
.sein2
-.sen4f
+.sen3de
+.sen4f3
.sen3s
.se3re
+.seri3e
.se1ro
+.ser2u
.se2t1
-.sha2
+.sha4
.si4en
+.si1er
.si3gn
.sini3
.si2te
.ski1e
.sour2
-.spani7er.
+.spani5er.
.spä5s4
-.spiege8lei
-.st4
+.spiege6lei
+.st2
+.st4a
.stau8becken.
+.st4e
.ste2i
-.steiner8k
+.steiner6k
.sto4re
+.st4r
.stras4
-.stro6ma
-.sucher6
-.sy5s
-.tage4s
-.ta3mi
-.tan4k3a
-.tan4k3l
+.st4u
+.sui4te.
+.sy5st
+.tage4s5
+.tal3l
+.tan2k3a
+.tank3l
.ta3ra
.tar3t2
.ta2t1h
@@ -498,47 +528,43 @@
.te2e
.te2f
.tehe3
-.teiler8s
-.tei8l7ersc
+.teiler4s
+.tei6l5ersc
.te3le
.te3no
+.tens4
.te1ra
-.tes4t
-.te6stei
-.te6stel
+.te4stei
+.te4stel
.test3r
-.th4
.ti2a
.ti2e
.ti2me
.ti4mes
.ti3r
.ti2s
-.tischen8
-.ti8sch7end
+.tischen4
+.ti6sch5end
.tite4
.tode2
-.to4der
-.todes3
+.to2der
.to2n
.to4nat
.to3nes
-.ton3i
+.ton1i
.to4nin
.tons2
.to4pl
.to2pr
.to2w
-.tras3
-.tra4ss
-.tri3e4s
-.trockenmas8
-.ts4
+.tra4s3
+.ts2
.tse3
+.ts4u
.tu3ra
.tu3ri
.turm1
-.tur4ma
+.tur2ma
.ub2
.ufe2
.ufer3
@@ -546,18 +572,19 @@
.um3
.ume2
.umo2
-.ums2
-.un3a2
+.un3a4
.un3d
.une4
.un3g2
.uni2t
.ur3a2d
.ural4
-.uran6fa
+.uran4fa
.ur1c
.ur1e
-.ur4inf
+.ur2e3t
+.ur2inf
+.urin2s
.ur3o4m
.ur1o2p
.ur3s2
@@ -569,47 +596,46 @@
.wah4l
.wa2s
.weg5s
-.weine4
-.wei4ta
-.welter8e
-.welter8k
-.wer6ker
+.weine2
+.wei2ta
+.welter4e
+.wer4ker
.wer4kr
-.wer4tr
-.wetterer8
+.wer2tr
+.wetterer6
.wi4e
.wor2
-.wort5en6
+.wort3en4
.wur2f1
.xe3
.ya4l
-.zeit3s
.zel4la4
.zelle4
-.zel6lei
-.zel4li
-.zeug4i
+.zel4lei
+.zeug2i
.zi2e
-.zie4l3u
-.zin4ka
-.zin4s3c
-.zin4st
+.zie2l3u
+.zin2ka
+.zin2s3c
+.zin2st
.zol2
.zuch2
.zug3l
-.zu4gra
-.zu2pf
-.zweigen8
-.zwei8g7end
+.zu2gra
+.zweigen4
+.zwei6g5end
a1ab
-aa2be
aa1c
a1a2ce
aa2gr
a1akt
-a1a2n
-a2ans
-a1aq
+a2al
+aa2l1a
+aale3ne
+aa3lep
+a1an
+a3an.
+a1a2q
2a2ar
aa2r3a
aar3b
@@ -621,13 +647,12 @@ aar3g2
aar3k4
aart4
1aas
-aas1t
+aas3t
aa2th
aa2t3r
-aat4s1
+aat4s3
2a3au
-a1ä
-a1b
+a1ä2
2aba
3abad
ab1alt
@@ -641,41 +666,41 @@ ab2äu
2abbat
2abbin
1abd
-2a3be.
-2a3bec
-2abee
+ab5dec
+2abe.
+2abec
ab1eic
-abe3i4d
+abe3id
ab1eil
ab1ein
2ab2el
-abe2la
-abela4d
+abe2l1a
+abela2d
abe2le
2aben.
1abent
2aber
a2berd
-a3beri
ab1er2k
ab1er2r
ab1er2z
4abes
abe2s1e
ab3esse
-abes2t
ab1eß
-2abet
+2a3bet
2abew
1abf
1abg
3abga
1abh
+ab5hän
2abi
4abil
ab1ins
ab1ir
ab1it
+abi4tur
1abk
ab1l
1a2bla
@@ -703,47 +728,46 @@ ab3r
a4brä
a2bre
ab4ros
-2abrö
-a4bs
+2ab4rö
1absc
-1ab3s2p
-abs2t2
+1abse
+1ab3sp
+abs4t2
+3absta
1abstu
-1abtei
+3abtei
3abtr
2abu
-abu3g4
+abu3g
a2bum
ab1ur
2abü
1abw
-2aby
+2a3by
3abz
2ac.
2a3ca
1ac1c
2acci
-ace1
a1cem
a1cen
a1cet
+a4ch.
ach1a
-a1chal
a3chari
ach3as
ach3au
2achb
-a1che
+2a1che
a2ch1e2c
ach1ei
-ach4ei.
+ach2ei.
a2chep
-a4cherf
-ach5erfa
-a4ch3erh
-a4ch3erl
-a4cherö
-a4ch3erw
+a2cherf
+a2ch3erh
+a2ch3erl
+a2cherö
+a2ch3erw
2achf
2a1chi
a2chim
@@ -755,42 +779,41 @@ a3cho.
a2cho2r
ach3öf
4ach3r
+a4chs
2achsc
-achs4el
+achs2el
ach3s2i
-ach3skr
-achs4or
+achs2or
ach3su
a4cht
-ach4tak
-ach6terf
-ach8tersp
-ach6t5erw
+ach2tak
+ach4terh
+ach4tersp
+ach4t3erw
ach2t1o
-acht5rat
-ach8traum
-ach8träume.
+acht3rat
+ach4traum
+ach6träume.
ach8träumen.
-ach6trit
-acht6s5al
-ach4tum
+ach4trit
+acht4s3al
+ach2tum
a1chu
-ach1u2f
+ach1u4f
ach3ü
2achv
-4ach1w
-a2chy
+4ach3w
a1ci
+2acke.
+ack3erz
ackmu4
ackmus3
ack2sp
-acksta4
+acksta2
2a1cl
a3co
acon4n
2acu
-a1ç
-a1d
2ad.
2ada.
4adab
@@ -804,7 +827,7 @@ ad1an
2adat
a2d1au
a3dau.
-1a2dä
+1a2dä1
ad1c
1add
2ade.
@@ -814,18 +837,18 @@ a3dee
adefi2
2adeg
a3dell
-4aden
+2aden
a3den1a
ade4nat
-adeo2
+adeo4
ade1ra
a2d1erk
-4ades2
-ade3sp
-ades4s
+4ades
+ade3s4p
+ades2s
2adf
-4adh
-4adi
+2adh
+2adi
adi3en
adi3er.
adie4sc
@@ -844,58 +867,64 @@ ad3rei
ad3run
2ads2
ad3sz
-2ad2t1
+ad2t1
adte2
ad4tor
+ad4tro
1adv
-2a3dy
+2ady
2a1e1
ae2b
a2ec
-ae2d4
+ae2d
+aed4r
ae2i
a2ek
a2el
a3el.
a4ela
-a4ele
-a4eli
a3els
ae2m
+ae2n1
ae2o3
aeop2
ae2p
-3a4er2o
-a2es2
-ae2sc
-ae2ta
+3a2er2o
+a2es
+aes4a
+ae4sc
+ae4ta
+a2e3u
a2ew
ae2x
-2afa
-af1ab
-a2f1a2n
-a3far
-a2f1au
-2afä
-a2f1än
-2afe
-a2f1ec
+a2f
+2a3fa
+a4f1ab
+a4f1a2n
+a4fap
+a4f1au
+2a3fä
+a4f1än
+2a3fe
+a4f1ec
a4fentl
a4f1ep
+a4fex
+a3fé
aff4a
af2f3l
aff4th
-2afi
-afi6kanz
-afi4kat
+2a3fi
+afi4kanz
+afi2kat
afi2t
2af3l
af1la
-a1f4lu
-2afo
-a2f3oc
-a2ford
-a2f1ort
+a3f4lu
+2a3fo
+a4f3oc
+a4ford
+a4f1ort
2afra
af3rau
af3rä
@@ -907,22 +936,25 @@ af3s2a
af3sh
af2si
af2sp
+afs4t
af2t1a
af3tat
af2tei
af2te2l
-aft4erk
+aft2erk
af2t1o
af2tö
aft3r
af2tra
aft5rei
+aft4stä
af2tur
-a2f3ur
-2afü
-a1g
+a3fu
+a4f3ur
+2a3fü
2ag.
2aga
+a3ga.
ag1a2b
ag1a2d
ag1am
@@ -932,46 +964,52 @@ ag2del
ag2dr
ag2du
4age.
-age4l3ei
-age4ler
-2agen.
-age4neb
-a2gent
+age2l3ei
+age2ler
+4a3gen.
+age2neb
+a2gentu
2ages
age4sam
+age3sc
age4s3in
age4so
ages3p
-ages5s
-ages6sen
+ages4sen
age4s3ti
3aggr
a2g1id
a2gim
+ag1inn
2a2gl
ag4lan
ag4las
ag3le
a4glö
2agm
-ag2n
+ag2n2
ag4nat
a4gnä
-ag4ne.
+ag4ne
+ag5neh
ag4nu
ago3b
+ag1op
+agori2
ag3rat
a2g3re
a2gri
ag3rie
ag3rin
2ags
-ag3sah
+ag3s2ah
ag4sam
-ag3s4eid
-ag2sp
-ag7s8porta
-ag2s1tr
+ag3schi
+ag3s2eid
+ag5s4porta
+agst2
+ags4tan
+ag2str
2agt
ag2th
2agu
@@ -1006,117 +1044,126 @@ ah2nef
ahn3el
ah4nerd
ahner4e
-ahner6le
-ahner4n
-ah2nin
+ah2nerl
+ah4ner4le
+ahner2n
+ah4nin
ah2no
+ahn3t
1a2hor
ah1os
ah3ös
-4ahr
ahr1a
ah3r2e
-ahren6sc
-ahre4s3
+ahre4s5
+ah3ri
+ahrta2
ahr2ti
-ahr4tri
-ahr4tro
-ahr4tun
+ahr2tri
+ahr2tro
+ahr2tun
ah2ta
ah2te2l
ah2t1ex
ah2t3r
-aht1s
-a1hu
-ah1w
+aht3s4
+2a1hu
+ah3w
a1hy
2ai.
-ai1a4
+ai1a2
a1ia.
+aia4p
2aib
ai2bl
aid4s
-aids1t
-ai1e4
-ai3en1
-aif4
-ai1fr
-a4i3g4
+aids3t
+ai1e2
+ai3e4n1
+aif2
+ai3fr
+ai3g2
+aig4r
a3ik.
-ai3ke
+a4i3ke
ai2lar
ail3d4
ai2lei
ail3g
ai2lo
-4ain
+2ain
ain2a
a1ind
-ai5n4e
+ai3n4e
+ai4neb
ain3s
-ains2p
3airb
ai2sa
a3isch.
-ai5schw
+ai3schw
ai3s2e
ais3sen
ais5st
ai2sti
-ait4
+a2it
+ait4r
a3iv.
a3ivl
a3ivs
-a1j
a2jat
ajekt4o
+a2k
2ak.
+a3ka
2aka.
2aka3b
akab4r
-a2kad
+a4kad
2akal
-2a3kam
+2akam
2akan
2akar
ak4at
akat1a
-aka4tak
-1akaz
-4akä
+aka2tak
+1a4kaz
+2a3kä
2akb
2akc
2akd
-2a1ke
-a2kef
-a2k1em
-a2kent
-a2kes
+2a3ke
+a4kef
+a4k1em
+a4keo
ak2et
-a2keu
-2a1ki
+a4keu
+2a3ki
ak1ins
1akku
2ak3l
-a1k4la
+a3k4la
+ak5lad
+ak5lan
ak4li
3aklö
-a1kna
-2ako
-2a1kr
+ak4lu
+ak5lun
+a3kna
+ak3no
+2a3ko
+2a3kr
ak3res
-a3k4ri
+ak4ri
3akro3
-ak3rü
+a4k3rü
2aks
ak3sh
ak2t1a2b
-ak4tag
ak3tan
2aktb
ak2tel
ak3ten
-akt2er
+ak3t2er
2aktg
2aktik
2aktis
@@ -1128,37 +1175,38 @@ ak3t4ri
2aktsi
2aktsp
2aktst
+2aktun
2aktw
-a1ku
+a3ku
2akun
-a2kup
+a4kup
2akur
-2akü
+2a3kü
1akz
3akze
a1la
2ala.
-2alabo
+4alabo
+a2l3abt
+al1ac
al1af
-al1age
2alai
al1akr
al1am
al1ana
2aland
-a2lang
+a2l1ang
al1anz
al1app
a3lar.
al3arc
a3lare
+al2arm
2al1arr
a2lart
ala2s
-al1asi
-al1ass
a3lat.
-al4atm
+alat3s
alat5t
alat3z
al1au
@@ -1166,27 +1214,27 @@ al3aug
a1lä
a2l1äm
al1än
-al1ärm
+al1är
+a3läs
al1äu
3albat
al2bär
-alber4e
-al4berh
-al4b3er4w
+al2berh
+al2b3er2w
al2b1l
al2boh
al2bon
alb3ru
alb5st
+alb6st.
al4dan
al2dä
-al4d3erl
-al4d3ern
+al2d3erl
+al2d3ern
alde2s
ald3inn
-al2dra
+ald1r
al2drä
-alds2
2ale
4a3le.
ale4ar
@@ -1199,45 +1247,46 @@ a4lein
a2l1el
5a2lema
a2l1e2mi
+al1emp
4a3len.
-alende4
+alende2
al3endr
-a4l3ends
+al3ends
a2leng
al2enn
-ale2p
al1epo
-4aler.
+4a3ler.
a2l1erb
aler2e
a2l1erf
a2l1er2h
-aler4kl
+aler2kl
a2l3erl
al1erm
aler4mi
a2l1er4r
-al2ers
+aler3s
a2l1ert
-3a4l3erwä
+aler3w
+3a2l3erwä
4ales
a2l1e4sk
a2less
a4leth
a2l1eu
alf4r
+1alge.
3algi
al2gli
al3glo
1algo
3algor
-alg4r
2ali
al2imb
al1imm
-ali4nal
+ali2nal
al1ind
-alin4ge
+alin2ge
a2l1in2q
al1ins
alken1
@@ -1251,143 +1300,151 @@ al3la3d
alla4me
al2lan
al2l1a2r
-al6later
+al4later
al2lä
al3läu
-al3le.
al4lec
3allee
-alle4gi
+alle2gi
al4leh
al3lend
-all3erk
-aller4z
-al3les
+aller2z
+al5les
alle3se
al2leu
al2lid
-alli5er.
-alli7ers.
+alli3er.
+alli5ers.
al2lob
al2lo2c
al2lop
al2lo2s
al2lö2
all3öse
+al4lt
al2luf
allu4s
al2lü4s
al2map
-al3mas
al4m3ast
-almo6de.
-2alo.
+almo4de.
+2alo
+4alo.
a2l1ob
3a2loe
a2l1of
4alog
alo2ga
alo2gr
+alo3is.
al1ont
+alori2
al1ort
-2alos
+4alos
a2l1ö
al2ös
3alp.
3alpe.
1alph
al2pho
-alrat4
al3sak
-al6schei
+al2schm
al4sh
al3skl
-al2stu
+als2p
+al4ss
+als4te
al2sum
al2t1ak
alt3alg
-al2t1an
+al2tan
al2tat
al2tau
1altä
+al4tb
+al4td
alt3eis
alt3elt
-al4temu
-al4t3er5f
+al2temu
+alter3f
+alt3er4pr
al2teu
al2tid
al2tin
alt1op
al2tö
-al4t3rat
+alt3rad
+al2t3rat
al2tre
al2t3ri
-al2t3ro
-alt4stü
+al4t3ro
a1lu
alu3b4
-al2u3f
+al2uf
alu3g
al1u2k
a2lum
al1umb
a2l1ur
a3lus
-4aly
+2aly
al2zar
al2zau
al3zen
-alz4erk
+alz2erk
al2zw
-am2a
+a2m
+2am.
+a3m2a
ama2ba
ama3d2
ama3g
-2amah
-a2malg
-2a3m4an
-2amar
-ama4sta
-1a2maz
-2amä
+1amal
+a4malg
+2am4an
+ama2sta
+1a4maz
+2a3mä
+a3me
4ame.
-a2meb
2amel
-am2e4n1
-amen6s5pr
+2am2e4n1
+amen4spr
+amen2t3r
+a5mer.
ame3r2a
amera3u
-a2m1erf
-3a2meri
+a4m1erf
+1a4meri
ame5r2u
2ames
a4mesh
-2a3met
+2amet
+a3mé
2amf
-a3mi.
-a3mie
+a3mi
ami2k
-2a3mir
-2a3mis
+2amir
2amit
2amk
2aml
2amm.
-am2mab
am2ma2c
-2ammal
+2am2mal
amma2n
am2mar
am2mas
-amma4sc
+amma2sc
am2maß
-am4ma4te
-ammen8ge.
+am2ma2te
+am2mä
+ammen4ge.
ammes3
am2mid
ammi2e
am2min
am2mit
+4amml
am4mo2d
am2m1ö
ammu2
@@ -1395,26 +1452,29 @@ amm3unt
am4mus
am4mü
amni1
-a2mö
+a3mo
2ampe.
2ampen
amp2f1a2
2am2ple
2ampo
am3pr
+am5pre
+2ams
4amsc
-am4schl
-1amse
+am2schl
+3amse
+ams1en
am3sh
1amt.
am2t1a2
+am4tau
am2t1ä
-am2tei
amt3eig
am2tel
-2amtem
-am4terh
-am4t3ern
+amter4
+am2terh
+am2t3ern
am2t1ex
am2tis
am2tit
@@ -1422,10 +1482,14 @@ am2to
am4tou
am2tö
am2t3r
+am4tre
+am4ts
am2t1u
-2amtv
-2amu
-3a2mul
+2am4tv
+2a3mu
+3a4mul
+a3mü
+a3my
2ana.
2anab
ana3c
@@ -1434,9 +1498,8 @@ anadi1
an2ag
2a3nak
an1alg
-ana4lin
-2anam
-an2a3ma
+ana2lin
+an2a5ma
2anan
an4and
2anas
@@ -1455,23 +1518,25 @@ an3aug
an3ch
2and.
3an3d2ac
-and3arm
and3ei
-anden6ga
-an4d3ent
-and5erob
-ande2s
+an2deng
+anden4ga
+an2d3ent
+ander2e
+and3erob
+an3de2s
an2d1ex
-and4sas
-and4seh
+and2sas
+and2seh
and2so
-and6spar
-and6spas
-and6s5paß
+and4spar
+and4spas
+and4s3paß
and2su
4andu2
an2d1ur
2ane
+4ane.
an3ec
a3nee
an2ei.
@@ -1479,16 +1544,17 @@ an3eif
3aneig
a4neis
3a2n1e4k
-ane2l
+ane4l
an1e2mi
a2nemo
-aner4fa
-a3nerg
+4anen
+4aner.
+aner2fa
an2erh
-a4nerke
+a2nerke
4anern
a4nerz.
-an4erze
+an2erze
an1eth
3anex
1anf
@@ -1497,72 +1563,78 @@ an1eth
3anfä
an3fe
2anfi
-an4fj
anf3le
-4anfors
-anf5rau
+2anfors
2anfs
an3f2u
+2anfun
4ang.
1anga
2anga.
an2g1ar
2angas
+2angd
2ange.
1angeb
-1angeh
an2g1ei
-an4g3erf
-an4g3er4h
-an4g3er4w
-an4g3erz
+an3gen
+an2g3erf
+an2g3er2h
+an2g3er2w
+an2g3erz
+2anges.
+2angf
2angh
2angie
ang1l
an2gla
-ang5n
+ang3n
+ang5na
ang1r
ang3ra
-1an3gri
-4angs.
+an3gri
+2angs.
ang4sto
angt2
-1anh
+1an3h
+2anhau
2a3ni
an2i3d
4anie
+aniel2l
ani3els
-ani5ers.
+ani3ers.
anig2
+ani2ka
ani3ke
3a4nim
a4nind
ani2o
an3i4on
-a4niso
-anis2t
+a4n3iso
+anis4t
2anj
2ank.
-an2kab
+an2kag
an2k1ak
an2kan
an2kei
-2an3ken
-ank5erfa
+2anken
+ank3erfa
an3kes
2anki
an2kid
an2klö
an2klu
ank3no
-an4k3opf
+an2k3opf
an2kor
ank1r
ank3ra
-an4kras
+an2kras
ank3rä
an2kro
-2anks2
+2anks
ank3se
2ankt4
3ankü
@@ -1573,15 +1645,16 @@ anma3s2
2anmo
1anmu
2ann.
+an3na
1annah
-an2nar
+an4nar
an3ne
an4nef
an4nei
an4nene
ann2er
2anns
-ann4s3p
+ann4sp
2annt
2ano.
1an1od
@@ -1592,6 +1665,7 @@ ano2la
1a2nom
a3nom.
2anoo
+an1op
a2n1or
ano2ri
2a3nos
@@ -1600,14 +1674,16 @@ ano2ri
1anr
2anrö
an4same
-an3s4ar
+an3sar
1an3s2ä
+an4sb
1ansc
+an4sf
+an4sg
an3skr
-ans1pa
-ans3pon
1anspr
1anst
+ans4te
an3s2z
2ant.
ant3ar
@@ -1616,20 +1692,19 @@ an3t2ä
1antá
3antei
an3tha
+1anthr
2antie
3antise
anton2
3antr
-ant3rin
1antw
2anu
anu3r
-anu3s
anus3s
a1nü
1anw
2anwi
-an2zä
+an2z1ä
2anzb
2anzd
1anzei
@@ -1649,27 +1724,26 @@ an2z1i4n
3anzün
2anzv
2anzw
+an2zwä
an2zwi
2anzy
2ao
-aof4
-ao3i4
+ao3i2
a1op
+ao2pe
aopf4
a1or
-a1os3
-aost2
+a1os
a3ot.
ao3t2s
-2a1ö2
-a1p
-4ap.
-ap4a
+2a1ö
+aö4fe
+2ap.
+ap2a
apa3b
+ap4an
a2pe.
-a3pel
a2pé
-a2pf
ap2fa
1apfel
2apfes
@@ -1678,17 +1752,15 @@ a2pht
2api
2apl
ap4la
-a3plä
ap3le
ap3li
ap2n
-3a2pos
a2pot
1appro
2apr
-ap2so
ap4ster
ap3t2
+ap5tag
2a3pu
2ar.
a1ra
@@ -1696,15 +1768,16 @@ a3ra.
ar2ab
2ar3abb
ar3abf
+ar3abr
ar3abt
+2arac
ara3d2
ar3adr
-ara3ge
+2arak
2a2r3al
a3rale
a3ra3li
a3ralo
-2aran
a2r1ang
a2r1anz
2arap
@@ -1719,10 +1792,10 @@ ar1äs
2arb.
2arba
ar2bak
-ar2b3at
+ar2b1at
ar2bau
-4arbef
-ar4b3ein
+2arbef
+ar2b3ein
2arbek
2arben
2arber
@@ -1738,16 +1811,14 @@ arb3so
2arbu
1ar1c
2archl
-2archr
+2ar3chr
ar2dau
arde4i
ar2dop
ar2d3r
-ar2du
-2are.
a2rea
-are5aler
-a2reb4
+are3aler
+a2reb
aree2
ar1eff
a2reh
@@ -1760,15 +1831,18 @@ a3reih
areim3
a2rein
arein4b
-arein4s
-arein4t
+arein2s
+arein2t
a2rele
4arem
+are2mi
4aren.
-aren6sem
+aren4sem
+a2rentn
are3r2a
+arerau5
arer2e
-a4r3erei
+a2rerei
a2rerg
a2rer3h
a2reri
@@ -1777,6 +1851,7 @@ a2rerl
a2rert
ar2erw
2ares
+are3sc
ar2et
are3u
a2rev
@@ -1792,11 +1867,9 @@ ar3g4r
2arh
2ari
ar2ia
-a2rid
ari3e2n
ari3erd
ari3erg
-arin3it
ar1int
a3r4io
ar2ir
@@ -1809,26 +1882,26 @@ ark3aue
arker2
ar2kil
2ark3l
-ar4klag
ar2kle
ar2klo
ark4lö
+ar2kn
ar2koa
ar2kor
ark3s2a
ark2se
ark3she
+ark4tre
arku2
ar2les
ar3mad
-arm1au
ar3m2ä
ar2m1eg
ar2m1ei
arm2or
ar2mum
4armü
-4arn
+2arn
ar2nan
arn2el
ar3ni
@@ -1837,39 +1910,46 @@ arob2
4aroc
ar1o2d
ar1of
-aro2fe
+aro2i
2a3rol
-aro3m
a2r1op
a2ror
1a2rou
-a2r1ö4
+aro2w
+2a2r1ö
+arö4l
2arp
arr1ac
ar2r3ad
ar2r1as
ar4rek
arre4n1
-ar2rh
2arri
ar2r3or
+arseri2
ar3s2h
ar3s2i
+ars3k
ar3sse
ar2tau
2artb
-ar3t2e
-2artei
-artel6li6
+art2e
+2ar3tei
+artel4li4
+ar3tem
+arter2e
2artex
+2arth
art2i
2arto
art3r
+ar4tram
art4res
ar2tri
-2arts
art3ske
+art2sp
2artuc
+2artü
2arty
2aru
a2r1uh
@@ -1888,10 +1968,8 @@ ar2zö
1arzt
arz2t3r
2arzu
-ar2z1w
+ar2z3w
2asa
-a4s3aa
-as2ad
a4s3af
a3s2al
asal2t1
@@ -1902,154 +1980,166 @@ asa3sse
as3at
asau4f
a4s3aug
-asau2s1
+asau2s
+a2sä
as3ät
a2sca
a4schec
a4schef
-a4sch3ei
-a6scher6g
+a4scherg
as4chi
a2schm
+asch3ru
2ascht
a3schu
a4schum
2asd
-4a3se
+2a3se
a4seb
a4sec
a4s1ef
as1eie
+as1emi
a5sen.
ase4na
ase4n3o
asens2
-asen6sem
-as1ent
+a2sen2se
+as4eo
+as2ep
as2er
-as4erd
ase2re
-aser6geb
a4s3erke
as4es
-ase2t
-as1eta
+ase4ta
+a4s1ev
a4sex
2asf
-2ash
-a4s3ha
+as3ha
+as4hf
as2hi
as3hir
+as4ie
2asig
a2s3i2k
2asim
asin2g
as1inn
2asis
-as3ku
-a4s3l
-a4sn
-2a1so
-as3ob
-as1of
+2asiu
+as3ka
+aska2r
+as3l
+as1o4f
a3sol
a3som
-aso2p
+as1o2p
as1or
a4soz
-as1p
-as3pe
-aspek6to
+a2sö
+a2sp
+as3pan
+aspek4to
a4spel
a4s2ph
-as2pi
as3pik
as4pin
as3pio
-a4spir
a4spl
2aspr
-as2pra
-as3sa
+a5spra
+a4ss.
+a4s3sa
ass2a3b
-ass6aus.
-ass2e
-ass3ein
+ass4aus.
+a4ssb
as3sel
asse3le
-as3ser
-asserma6
+asserma4
a4ss2i
as3sin
+a4ssk
as3ski
-as3so
+a4s4sl
+a4ssn
+a4s3so
+a4ss3p
as2spo
as2spr
-as4st
+a4s4ss
+a4s4st
as5sta
+as6staf
+as6stag
+as3stau
as5stei
+as5sti
as5str
as5stu
-2asta
-a4stab
+a4st.
+4asta
+ast2as
a3stä
-a4s1tec
-as2tee
+a4stb
+a4std
+a4stec
+as4tee
ast2el
a4stemp
-a4s3tep
-ast2er
+a4s5tep
+as4t2er
a4st3ese
-as2tex
-a4s2th
-ast2id
-as2to
+as4tex
+a4sth
+ast2i3d
+a4stl
+a4stm
a2stoc
ast3orc
-as4trau
+a4stp
a2st3re
-ast4ren
-a6stritt
+as3t4ren
+a4stritt
a3stro
a4strol
-ast5roll
-a4s1tub
-a4stuf
+ast3roll
+a4sts
+a4s3tub
+a4s5tuf
a2stum
-2a1su
+as4ty
+2asu
+a4suh
as2ur
-a3su4s3
-a4sw
+asu4s
+as4ut
+a2sü
aswa2s
1asy
3a4syl
2asys
-as3z
-aße4
+aße2
aß2en3
a2ß1er
aß2th
-2a1t
-4ata
-at1abe
-at1abr
-at2a1f
-a3ta3g
+2at
+at1ab
+ata2be
+at2a3f
+ata3g
at2ago
-a3tah
ata3la
a3tam
-at1ang
-at3ank
+at3an3k
at1apf
+ata3ra
at2ast
-at3att
+at1att
a2t1au
at1än
-4atb
at2c
a2teb
-ateien6d
+ateien2
at1eig
3a2teli
a3tell
@@ -2060,31 +2150,33 @@ atens4
a2tep
4ater
ate3r4al
-ate3ran
at4ere
atern2
ate2ru
at2eu
a2tew
+a4th.
4atha
at3hag
at3hal
-a3t2heb
+at2heb
ath3in.
3athl
+a4thm
a4thr
at2hu
at3hü
-4a3ti
-ati4kab
-ati6k5erw
+a3ti
+at4ia
+ati2kab
+ati4k3erw
a4tinf
at2is
ati2sa
ati2se
a4tiso
atis3s
-ati6v5erf
+ati4v3erf
3atla
4atli
3atm
@@ -2093,12 +2185,12 @@ ati6v5erf
at3mu
4atmus
a2t1ob
-a3tod
a3tog
a3tol
3a2t4om
+ato4man
atom1e
-ato2mo
+ato4mo
at1op
a3tor
at1ort
@@ -2114,14 +2206,17 @@ a3t4ron
at3rot
at3rü
at2sa
-at4schn
+at3sche
+at2schn
at2se
ats1e2h
at2si
ats1in
at2s1o
-ats1p
+at2sp
+a4tst
ats3tät
+at2su
at3ta
3attac
at4tad
@@ -2132,22 +2227,19 @@ at4tang
at4tar
at4tau
at2tä
-4atte.
-at2tec
-at2tei
-at3t2el
+at4tec
+at4tei
+att2el
at4temp
-4at5ter
-attes2
at3thä
4atto
at2tob
+3attr
+att3rat
at2t3rä
-att3s2
+att3s4
at3t2u
at2ty2
-at4typ
-4atu
atu2n
atze4l
atz3ela
@@ -2155,12 +2247,13 @@ atz3elt
at2zem
at2z1er
a3tzere
+atzer2h
at2z1i
atz3t2
-at2z1w
+at2z3w
a2u
2au.
-2au1a2
+2au3a
2aub
au2bab
au2ban
@@ -2172,48 +2265,62 @@ au2blä
au2bli
au2blo
au2blu
+aub3rin
aub2si
+aub2str
aubu4s
2auc
+auch4str
au2dr
2aue
aue2b
+au3er.
au2ere
aue3rei
auer3ö
-au5erst.
+au3erq
+au3ersc
+au3erst.
au3ert
-au2fa
+aue2sc
+au4fa
+au5fac
+au5fah
auf1ak
+au5fal
+au5fam
auf1an
aufas2
3aufber
2aufe.
2aufeh
-4aufen.
+2aufen.
3aufent
auf1er
-au4fer4k
-au2feu
+au4fer2k
+au4feu
auff4
auf3ind
1aufla
-1aufn
+1au4fn
2aufo
+4aufö
+1aufru
auf3ski
auf3t2
2auft.
-5aufzeic
+3aufzeic
3aufzug
1aufzü
2aug
au2ga
au3g2ar
+aug2e
4augeb
4augeh
4augel
-aug2er
4augl
+au4gn
4augr
au3gu
2auh
@@ -2221,15 +2328,14 @@ au3ha
auh1u
2au1i
au2is
-4auj
+2auj
auk3t
aule2s
-aul4les
+aul2les
au3lü
2aum
-au2mal
aume4n
-au4m3ent
+au2m3ent
au2m1e2r1
aum3eri
au2m1id
@@ -2238,121 +2344,123 @@ au4mit
au2m1o
aumo2r
aum3p2
-aum3s2
+aum3s4
au4mun
-4aun
+2aun
au3n2a
aun2e
-au4n3ei
+au4nei
au2nio
au2no
au3nu
a4unz
2aup2
+au3pf
2aur2
au1rh
+au3ru
au4sag
au2s1ah
-ausan8ne.
+ausan4ne.
au2sas
au2sau
2ausc
-au6schmi
+au4schmi
+au2scho
1ausd
2ause.
-au4s1eh
-2au3sen
-au4s3erb
-au4serf
-au4s3erk
+au2s1eh
+2ausen
+au2s3erb
+au2serf
+aus3erk
aus3erp
-au4serw
+au2serw
1ausg
au2sin
au4sis
-1ausl
au2so
aus1or
au2spr
1ausr
-auss2
3aussag
au3sse
-aus4se.
-au8ssende
+aus2se.
+auss2el
+au4ssende
aus4ser
-aus4ses
+aus2ses
+auss4t
au2st2a
-aus3tau
2auste
au4stec
aus3tie
aust2o
au2stö
-aus3tri
+aus3tr
+au2stri
3ausü
1ausw
1ausz
auße2
-a4ut
au2tab
au2t1äu
2autb
au2t1e2l
au3ten.
-auten4g
-au4t3erh
-aut5ero
+auten2g
+au2t3erh
au3tet
+au2tev
2autg
au2thy
+2auti
1auto
-au2trö
-2auts
+aut3rin
+au4trö
+2auts2
2auu
2auv
auve4
2auw
2aux
2auz
-auz2w
+auz4w
2a1ü
-a1v
av2a
-a3vang
+avari4e
ava3t2
-avener4
+avener2
2avi
a2v3r
av2s
-2a1w
+2aw
awi3e
a2wr
a1x
-ax2am
+ax4am
a2xans
-a3x2e
-a3xid
+ax2e
a2xio
axi2s1
2a1ya
a1yeu
ayma2
-ay1of
+ay3o
aysi1
-ay3t
-a1z
-az4a
+ay2u
+az2
a3za3d
3azal
-a3z2i
-az2o
-a3z2u
-az2zen
-az2zw
+az4at
+a3zi
+az3t
+a3zu
+azz3a
+az4zab
+az4zin
ä1a
-1ää
-2ä1b
+2äb
ä2b3l
äb2s
äbte3
@@ -2360,119 +2468,129 @@ az2zw
ä1che
äche1e
äche4n
-ächenma5
-ächenmas8
+ächenma3
+ächenmas4
ä1chi
äch3l
ä2chr
äch4sa
-äch2s1o
+äch2so
äch2sp
ächt4e
ä1chu
-ä1d
ä2da
+ädel1i
ä2d1ia
+ädi4e
ä2dr
äd2s
äd3te
2ä1e
-äe4k
-ä3eu
+äe2k3
+äe4kl
äe2x
+ä2f
+ä3fe
äfe4n
äf2fl
+ä3fi
äf3l
äf3r
äf4ro
äf2s
-äft2
-äft4s
-ä1g
+äft2e
+äft4s3
ä2g1a
1ä2gä
ägd2
-ä5ge
+äg2e
ägen4e
äge2r3a
ä2g3l
äg2n
ä2g3r
äg4ra
-äg2s
+äg2s2
+äg3sc
+ägs4t2
äg3sta
äg3str
1ä2gy
äh1a
2ä1he
äh1ein
-äher8gebn
-äher3t
+äher5t
ä1hi
äh1in
ähl1a
äh3l2e
-äh4l3e4be
+äh4l3e2be
äh5ler
-4ähm
+2ähm
äh3na
äh3ne
1ähnl
2ähr
äh2rel
äh3ri
+ähr5sa
2äh2s
+ähs4t
2äht
ä1hu
-äh1w
+äh3w
2äi
ä1im
-ä2is
-ä3is.
+ä1is.
ä3isch.
-ä3isk
-ä1j
-ä1k
+ä1isk
äka2la
äk3l
ä2kle
äk4li
ä2k3r
ä1la
+äl4bc
älbe2
äl4bl
älk3
-älks2
+älks4
äl2l1a
äl2p3
-äl4schl
+äl2schl
ält2e
älte1i
ä1lu
-2äm4a3
+ä2m
+2ä3ma3
+äm4at
+ä3me
ämer2s
+ä3mi
ämi3en
2äml
äm2ma4
ämmas2
+ä3mo
ämoni3e
2ämp
-ämp7f4e
+ämp5f4e
äm2s
-ämt2e
+äm3t2e2
ämter3
+ä3mu
2än.
+änd4e
än2dr
-2än2e
+2ä3n2e
äne2n1
2än2f3
änft2
4än3g2e
-änge4ra
+änge2ra
2än2gl
äng3le
än2gr
-ängs2
äng3se
2ä3ni
än3k2e
@@ -2480,6 +2598,7 @@ az2zw
än2kr
2änn
än3n4e2
+änner1
2äns
än4s1a
än2s1c
@@ -2487,81 +2606,100 @@ az2zw
2änz
ä1on
äo3s2
-ä1pa
+ä2p
+ä3pa
1äpfel
+ä3po
äp2pl
äp2pr
äp2s1c
-1äq
-ä2r3a4
+ä3pu
+1ä2q
+ä2r3a2
är4af
+ära4r
är1ä
+2ärb
är2b3le
är1c
2ärd
ärde4s
2äre
+4äre.
ä2r1ei
ä2r1e2l
-äre2m
+4äre2m
är1emi
-äre2n
+4äre2n
ä2rene
+4ärer
ä2rerh
är2es
+4äres.
+ä2rese
är3ge
+äri2e
ä2r1ind
är1int
-är3ke
+är3k4e
+2ärm.
ärm3arm
+är3mas
ärm3at
ärme1e
ärm3ent
ärno2
är1ob
är1of
-är1op
ä1rö
är3re
ärse2
är2seb
-är4seh
+är2seh
ärs1er
är2si
är3spu
2ärt
-ärt4e
+ärt2e
är2th
-ärt4s1
+ärt4s3
ä2rü
-1ärz
ärz3te
är2zu
-är2zw
-ä1s
-äs4c
-2ä3s2e
+är2z3w
+äs2
+ä3sa
+äs4ch
+2ä3se
äse3g
äse1i4
äse5ref
-äser4ei
-äse4ren
+äser2ei
+äse2ren
äser2i
-ä5si
-ä3s2kr
-ä2s1p
-ä3s2s
-2äs4s1c
+äs3k
+ä3s4kr
+ä2s3p
+ä3ss
+ä4ss.
+äs4sb
+2ä4s4s1c
äss2e
-äss5erkr
+äss3erkr
äs3sern
-äss5ersa
+äss3ersa
äss3erw
ä5sses
-äs4sh
-äs4s1t
-äs4t4e
-1ästh
+äs4sf
+ä4s4sh
+ä4s4sl
+äss3p
+äs4sr
+äs4ss
+äs4s3t
+äs4t2e
+1äs3th
+äs4ti
ä2str
ä1ß
2äßc
@@ -2575,77 +2713,78 @@ az2zw
äte3l2
äte2n
äteo2
-äter4bl
-äte3se
-ät2et
+äte4pi
+äter2bl
+äte3s
+ät2e3t
ä2th
-ä1ti
+ä4thc
ät1id
-ä1to
ät1ob
-ät3r
+ä2t3r
ät4sa
äts3au
ät2sä
-ät4schl
-ät4schr
+ät2schl
+ät2schr
ät2s1i2
äts3l
äts1or
-äts1p
-ät4s1t
-äts3te
+ät2s3p
+ät4s3t
+äts5te
+ät2su
ät2tei
ätte4n
ät2tr
-ä1tu
ätze3l
ät2zw
+äu1
+2äub
äu2b3l
äu2br
-äu1c
äu3d
äude3
äuder2
2ä2uf
1äug
äu4g3l
+äu4gs
+äu4gt
2äul
2äum
äu2ma
äum3p
äumpf4
-äum2s1
+äum2s3
2ä2un
äun2e
äu3nu
2äu3r2
äure1
-äu1s
+äus2
2ä3us.
2äusc
äu4schi
-äu4schm
-äu6schü
-äu3s2e
+äu2schm
+äu3se
äuse1i
ä3usg
ä3usk
ä3usn
-äu2s1p
-äu3s2s
+äu2sp
+äu3ss
äuss1c
1äuß
+äu4ßr
äut2e
äu2tr
-ä1v
ä2vi
1äx
-ä1z
ä3ze
-â1t
-á1n
-5ba.
+á1
+1b
+3ba.
b2aa
b3a2ba
2babf
@@ -2653,61 +2792,67 @@ b3a2ba
ba2bl
ba2br
2b1abs
-bach7t4e
+bach5t4e
back3er
-back3s2
-ba3d2e
+back3s4
+ba3de
bade1i
2b1adel
+bader4
2b1adl
2b1adm
b1a2dr
ba2du
2b1af
3bah
-bah6nene
+bah4nene
bai3d
bais2
b2ak
-ba2ka
-ba2k1er
-ba2k1i
-ba2k5l
-ba2k3r
+ba4k1a
+ba4k1er
+ba4k1i
+ba4k1l
+bak3r
+ba4kra
+ba4kre
ba2lab
ba2l1ak
ba3lal
ba2lau
baler2
-ba4l3erk
+ba2l3erk
balk4a
balke4
bal4lan
balle4b
-bal4l3ei
-bal6lerg
-ball6erk
-bal4li4g
-bal4lo4k
+bal2l3ei
+ball4erk
+bal4li2g
+bal4lo2k
ballö3s
+ball3s
+bal3tin
+bal2tr
2b1am
-b2a3ma
-ba2me
+b2ama
+ba5maz
+ba4me
4bamt
ban2a
3b2and
band1a
-ban4dal
-ban4dan
-ban4dar
-ban6deng
+ban2dal
+ban2dan
+ban2dar
+ban4derk
+ban4derz
ban2dr
ba3n2e
2banf
b1ang
ban3gl
ban4k1a
-banker4
ban2kl
ban2kn
ban2kr
@@ -2725,135 +2870,134 @@ bar3ast
ba2rat
bar3de
ba2rei
-ba3r2en
-barer5ei
-barer4t
-barf4
+barer3ei
+barer2t
3bars
b1arz
bar3zw
3b2as
-ba3s2a
+ba3sa
ba2sc
bas2i
bas4sa
-bas6st
-bas4t
+bas6str
+bas6tel
ba2str
ba2ß1
-ba4t3ent
+ba2t3ent
bat2o
3bau.
bau3b
-bauer4l
-bauer4s
-bauer4w
-bau3fa
-bau1fl
-bau1fr
-bau3g2
+bauer2l
+bauer2s
+bauer2w
+bau5fa
+bau3fl
+bau3f4r
+bau3g
b2auk
bau3r
bau3s2k
+baus4t
bau3sta
b1a2x
-ba1yo
+ba1y4o
3b2äc
bä1ch
3b2äd
2b1äh
b2äl
-2bärz
-b2ä4s3
+2b1ärz
+b2äs3
+bä4ss
2bäug
-4b1b
+2bb
bbe4n
bbe4p
-b4be2se
+b2be2se
bb3le.
bb2lö
b3brec
-b3bru
-bbru2c
+b3bru2
bb2s
bbu1
-4b1c
-2b5d4
-bdä4
+2b1c
+2bd2
+b3da
+bdä2
bdän3
bdome4
-1be.
+bd4ri
+3be.
3bea
be3ab
be3an
+be3as
beat2m
be3au
be4au.
3beb
b1ebb
-1bec
+3bec
be1ch
-2becht
+4becht
2b1e2del
bedi4
be1e2h
bee2l
be3ela
+be1en
bee4rei
be1erh
be1erl
be1ert
be1eta
-bef4
2b1eff
-be3g4
+be3g2
be2he.
beh5ri
bei3b
2b1eier
-bei1f4
-bei4ge.
-beige4l
+bei3f4
+beige4be
+beige4ge
+beige2l
beige4p
bei3k4
bei3l2a
2b1eime
be1ind
be1inh
-bein6hal
-bein4hi
+bein4hal
+bein2hi
bei3s2
-bei5st
+bei5s4t
beit4e
beit2s
-beit4sk
-beit4sp
+beit4s3k
3bek
3bel
-be3lag
+b4el.
+be3l2ag
be3las
bel3d
be3lec
4be2lek
be2l1en
-bel3ere
be2let
bel3f
bel3la
belle4n3
bel3li
bel3om
-be2lor
be2löf
bel3sz
belt2
-bel4un
-1bem4
+bem2
3b2em.
3b2e3ma
2b1emp
2bemul
-1ben
3ben.
be5nabe
ben3ar
@@ -2864,25 +3008,26 @@ bend3s2
b2ene
be3nei
be4n3end
-be4ners
+be2ners
ben2eu
3beng
be2nid
+be2nik
be4nis
ben3n
-5benp
+3benp
b2ens
-ben4s3pa
-ben4spr
+ben2spa
+ben2spr
benst4
3bensv
3bensz
2b1entb
2bentd
-4benteu
+2benteu
2bentf
ben3th
-ben6thei
+ben4thei
bent4r
2b1ents
2b3entw
@@ -2893,51 +3038,53 @@ be1o
2b1epi
2bepoc
be1ra
+ber3a2d
be2rak
be2r3am
be2ran
bera4s
berb2
-berbla4
ber3d
be2r1e2b
-be4reck
-be4r3eiw
+be2reck
+be2r3eiw
+ber3ell
bere2m
-be4rene
-ber4erg
-ber4erw
+be2rene
+ber2er
+ber3erk
bere4sc
-bere2t
+bere4t
berf4
-ber4g3af
-ber4gal
-ber4gli
-ber4hab
+ber2g3af
+ber2gal
+ber2gli
+ber2hab
beri2d
-ber4in.
-be5r6inne
-berin4s
+be3r4in.
+berin2g
+be3r4inne
be2ri4o
ber3iss
ber3ko
ber3kr
-bermas4
-berma7sse
+bermas2
+berma5sse
ber3n2a
bern2e
b1ernt
+be4roh
be2rö4
3bers.
ber5se
-ber3st4a
+ber3st2a
ber3t2a
bert2e
bert2i
berz2
ber3ze
ber2zö
-3b2es
+b2es
be3sa
bes4abb
bes2am
@@ -2947,26 +3094,27 @@ bes2au
be2sep
be2s1er
be2s1id
-bes2po
bes3sa
bess4e
b3esst.
bes3sz
beste2
-be6stein
-bester4
-be6sterh
-be4s3tol
-be4st3o4r
+be4stein
+bester2
+be5ster.
+besti3en
+be2s3tol
+be2st3o2r
best4r
-be4strä
-be4s3tur
+be2s3trä
+be2s3tur
be2sur
be3s2ze
-3bet
be3tam
be3tha
be3thi
+bet4o
+bet2sp
bet2to
be1un
be1ur
@@ -2974,30 +3122,32 @@ be1ur
3b2ew2
2b3e2x
3b2ez
-2b5f4
+2bf2
bfal2
-bflö4
+bfang3s
+bf4lö4
bflös3
-2b1g2
-b5ga
-bgas1
-bga4st
+bf4ri
+bf4ro
+bf4rü
+2bg2
+bga4s3t
bga4su
bge3
bgel2e
-bge5n
-bges2
+bge5na
+bges4
2b1h2
-b5hä
-1bi
bi1ak
bi2ar
+bi1as
3bib2
-bibe2
+bibe4
biber1
bi2c
+bid2
bi3do
-bieres4
+bieres2
bie4str
biet4s
3bietu
@@ -3007,7 +3157,8 @@ bi2ke.
bi2kes
bi2kre
3bil
-bil4deb
+bil2deb
+bil3der
bi2lei
4billu
bi2lu
@@ -3018,50 +3169,53 @@ bine4n
b1inf
bin4fo
bin2g3a
+bin3gl
2b1inh
+bino2
bi2n3ok
bin4ol
2b1int
2b1inv
bi2o3
-bioi2
biri1
3bis
-bis2a
bi3si
b1iso
bi2sp
+bis4sa
bis4s1c
-bi3sta
-bi2s1to
-bi3str
+bis3t
+bi3s4ta
+bi2sto
+bi3s4tr
bi2stu
bi2stü
-b2it.
+3b2it.
b2ita
b2ite
b2iti
bit4r
-bit2ta2
+bit4ta4
bi2tu
bi3tum
bi3z2
-2b1j
-bjek4to
-2b5k4
-bl4
+2bj
+bjek2to
+2bk2
+bk4ne
+bk4nu
+bl2
2bl.
bla3b4
2b3lac
b3lad
b2lanc
-blas3er
+bl4at
b2latt
b2lau.
b3laus
2b3law
2b1län
-b2läse
3blät
b2le
3ble2a
@@ -3070,12 +3224,15 @@ b3leb
b3leg
4bleh
b4lei.
+3bleib
2b3leid
2bleih
b3lein
-blei3s
+blei3s4
+bleistras6
2bleit
ble3l
+blem3p
ble2n
b3lenk
b3lese
@@ -3096,45 +3253,52 @@ b2lit
b3lite
b2lo
b4lo.
-3b4loc
+b4loc
+2b5loch
b4loi
+blo2id
b3los2
blo3sse
+blös4s
3b4lum
2blun
b2lus
3blut
blut1o
+blut3sc
3blü
-2b1m
+2bm
bmas2
-4b5n2
+2b1n2
+b3na
bnas4
-bni2
+b3ne
+b3ni2
bnis1
-bo4a
-bo5as
+bo3as
b1o2b
bo3ben
bob3r
bo1ch2
bo3d2
+bo4dd
boe1
-bo2e3i
+bo2ei
2b1of
-bo3fe
bo3he
boh2ra
-boh3rer
boh2u
bo1is
bo2lan
bo2lau
+boli2e
bol3le
+bol3za
3bon.
bo3n2a
+bond1
bon2da
-bon2d1e
+bon2de
bo2ne
3bons
boo4l
@@ -3147,144 +3311,165 @@ bo2r3as
bo4rä
bor2da
bor2d3r
-bo2rei
bo4rig
-bor3m
+bor3m2
b1ort
-bor4ter
-bor6t5rat
+bor2ter
+bor4t3rat
bo4ruh
bo2sc
bo3se
bo4s3p
3bot
-bote3n4e
+bot2e
+bote3n2e
bo3th
-bot2so
bot2st
bot3t
-bo2xo
+bo3v
b1oz
bö2b3
2böf
2b1öl
-2b1p4
+2bp2
bpa2g
-2b1q
-b2r4
+b3pf
+bp4rä
+bpri2
+2bq
+b2r2
2br.
b4ra.
2b3rad
2b4rah
-b4ra3k
+b4rak
+bra5ka
+br4al
+b4r4am2
bra4ss
brast4
2b3rat.
-brat3er4
-bra6terg
-2b3ratg
+brat3er2
+bra4terg
+2bratg
3brä
4bräd
brä4u
2bre.
-6b5rechte
+4b3rechte
2b3red
2b3ref
2breg
+b3reic
b3reif
+b3reiz
2brek
-b4rem
b4ren.
2b3rent
2breo
2b3rep
b4rer
b4res.
+b3rese
b3rest
-b4ret
-bret6t5en
+bret4t3en
+2b3reu
b4rez
bri2da
-brie4fa
+brie2fa
2b3riem
b4rien
bri2er
b3ries
2brigk
+b4rik
b4rina
-2b3rind
+2b5rind
b4rio
b4risc
2briß
b3ritt
+b4riz
brob2
2b3roh
2b3rol
-bro2ma
+bro4ma
b4ron
2b3rost
+bro4tei
bro2tr
-brot3t4
+brott4
2b3rou
-3b4rö
+3brö
b4ruc
2bruf
b4rum
2b3rund
-bru4s
-brust3
+brun4e
+bru4s4
+brust1
bru2th
+b4ruz
3brü
4b3rüb
brü4ss
-2b1s
-b2sad
-bs1amb
-b4samt
+2bs
+b2s1ad
+bs2am
+bs3amb
+b4s3amt
bsas2
bsa3sse
bsau2r
b4s3är
-b3säu
-b5sc
+b3s2äu
+b3sc
bsch2a
-b6schan
-b6schef
-b6sco
+b4schan
+b4schef
+bs2chi
+b5schl
+b4sco
+bs2cu
b3se.
-bs1e2b
+bse2b
b3sel.
bse2n1
b3sen.
b2s1ent
-bs1er
-bs3e4r3in
-b3ses
+bs1erf
+bs1erg
+bs3e2r3in
+bs1erk
+bs1ers
+b3s2es
b2sim
bsi2t
-b4s3ki
-bs3kr
+b4ski
+bs2ku
b2s1of
b3s2oh
b3sol
b4sop
bso2r
b2sö
-b3s2pi
-bs2pl
-bs2pu
-bss2
+bs2p
+bs4pi
+bs3po
+bss4t
+b4st.
bst1a2b
-bs2t1ak
-bst3ank
-bs2t1a4s
-bs2tau
+bst1ak
+bst1al
+bst3an3k
+bst1a4s
b3stä
-bs1tät
+b5stär
+bs3tät
bst3emi
bst1er
b4stern
-bs2t1h
+bst1h
bst3ink
b2stip
b3sto
@@ -3292,37 +3477,36 @@ b4stob
b4stod
b4stor
b3stö
-bs2tr
-b3stra
+bs3trau
b2s3trä
-b4s3treu
+bst3rep
bst3ro
-bs2tu
b3stü
b4stüb
b2s1un
b3sz
bs2zep
bs2zi
-4b1t
-b3ta
-bta4st3r
-b5te
+b4szü
+2bt
+b3t2a
+bta2st3r
+b3te
b2t1h
bt2i
bti2s
-bt4r
+bt4ra
btran2
bts2
btü1
-bu4chec
-bucher4
-bu6ch5ers
+bu2chec
+bucher2
+bu4ch3er4s
bu3ches
bu2chi
-buch3s4p
+buch3sp
bu2e3
-bu2f
+bu4fe
bug3
bu2gr
bull3a
@@ -3331,8 +3515,8 @@ bull3a
2buml
2b3umr
bun4a
-bun4d3er
-bunde4s
+bun2d3er
+bunde2s
b1une
b3un3gn
2b1unh
@@ -3340,49 +3524,55 @@ bur1c
b2ure
b2urg
burg1a
-bur4gan
-bur4gar
-bur4gin
-bur2gr
+bur2gan
+bur2gar
+bur2gin
+bur4gr
bu3r2i
2burn
b3ursa
-burt4s
+burt4s3
+bu3ru
bu2sa
bu2sc
bus3cha
bu3sche
-bu6schei
-bu6sch5el
+bu4schei
+bu4sch3el
+bu4scheu
+bu3schu
busch3w
bu3shi
bu2si
-bu2s1p
-bu4sses
+bu2s3p
+bu4s3ses
bussy2
-buster4
-bu6s5term
-bu2s1tr
+buster2
+bu4sterm
+bu2s3tr
bu2su
but2a
+bu3tan
buto3re
2büb
+bü4bc
bü1c
bügel3e
-bü3s4
-2b1v
-4b5w
-3b2y1
-bya4
-byo2
+bü3s2
+2bv
+2bw
+bwur2
+b2y
+by3a2
+by3o2
by3p2
bys2
-2b1z4
-b5ze
+bys4c
+by2te
+2bz2
bzeit1
-bzu1
+bz4wa
1c2a
-cab4
ca3bl
3ca2c
ca2e3
@@ -3390,20 +3580,20 @@ ca3g2
ca1h
cal2a
cala3b
-cal2f3
-cal3t2
+cal3t
+3cam
2can
cana3
ca2pe
+ca3r2a
car3n2
carri1
car3tr
ca3s2a3
+ca3sto
ca3t2h
ca1y2
-cä3
-cäs2
-c1b
+cä1
2cc
c1ce
c1ch2
@@ -3414,11 +3604,13 @@ c3do
ce2dr
ce1e
2cef
+2ceh
ce1i
ce3in
2cek
3cels
cen3a
+cens2
ce3nu
cen3un
ceo2
@@ -3433,69 +3625,66 @@ ce3s4h
cet1am
ce1u
1cé
-c1f
-c1g4
+cg4re
c2h
-4ch.
+2ch.
2chab
ch3a2b3i
-2chac
+2chaf
2ch1a2g
ch1ah
2ch1ak
chan4a
3chanc
-chan3f
ch1ang
4chanl
-2chanz
-1chao
-2char.
-1chara
+ch3ansa
+4chanz
+3chao
+4char.
+3chara
3chard
3charta
cha2sc
chasi1
1chato
2chatt
-2chatu
-ch5austr
+ch3austr
chau3t
ch1äh
ch1ärm
ch1äs
1châ
2chb
-6chc
+2chc
2chd
che3b4
ch3e4ben
ch3echt
ch1edi
che2el
-1chef
-3chef.
-che4fer
-3chefs
+3chef
+che2fer
2chei
ch1eim
-4chelem
-che4ler
-1chemi
-3chemik
+2chelem
+che2ler
+3chemi
2chemp
-che4neb
-che4nid
+che2neb
+che2nid
che2no
-4chents
-4chentw
+2chents
+2chentw
che2r3a
-4ch3erbs
-6chergeb
-4cherke
-cher6zie
-ch3es2s
-4ch1e2ta
+2ch3erbs
+2ch3er2de
+2ch3erfa
+4chergeb
+2cherke
+cher4zie
+ch3ess
+2ch1eta
2ch3e4x
1ché
2chf
@@ -3515,45 +3704,50 @@ chi3na
2chiso
2chj
2chk
-2chl4
+2chl2
+chl4a
ch2le
chle2i
ch3lein
+ch4len
4chli
ch2lu
-4ch2m4
-2chn4
-chner8ei.
+2ch2m
+2chn2
+chn4a
+chn4e
+chner4ei.
ch2neu
2chob
-cho2f
+cho3ch
+cho4f
ch1off
+cho5fr
chof2s
ch1oh
cho3l2a
ch1orc
-cho4rei
ch1ori
ch2os
ch3öl
-2chön
3chör
2chp
-ch2r4
-2chra
+ch2r2
+2chr4a
ch3rad
-chra3g
2chre
chre3s
ch3rh
-2chrit
+4chrit
3chromo
3chron
ch5ros
-4chs
-ch4stal
+ch4ry
+2chs
+ch2stal
2cht
-ch2tru
+ch2truh
+chts3trä
2chuf
2chuh
2ch1unf
@@ -3565,47 +3759,51 @@ ch1urs
2chü
2chv
2chw
-1chy
2chz
+ci2al
+ci1as
ci1c
ci1es
c1ind
-cins2
+cins4
c1int
ci2s1
1ci3t2
-c1j
-4c2k
-c4k1a
+2c2k
+ck1a
cka2b
ck2ad
-ck2ag
-cka2m
+ck2age
+cka4m
cka4r1
ck1ä
ck1ef
+ck1eg
ck1eh
ck1ei
cke4na
cke2ra
-ck2ere
-ck3er4hö
+ck3er2hö
ckerk4
-cker6lau
ck2ern
cke2ro
-ck1err
ck2et
-cket2t
+cket4t
ck1i2d
ck1in
ck4is
ck3l
-ck5n
-ck3o4
-ck3ö2
+ck3n
+ck5nac
+ck3o2
+cko4f
+cko4p
+cko4s
+ck3ö
+ckö4f
ck3r
cks2al
+ck4ske
ck4spen
ck3te
ck3t2i
@@ -3617,71 +3815,78 @@ cle4a
clet2
clin2g
cli2p1
-clip3a
clo1c
-clo3f
1clu
clu4b
c2m2
c3me
c3mu
-1co
+1c2o
+3coa
co1ch
3co2d2
co4de.
co3di
cof3f2
-coi4
-co1it
co2ke
-co3la1
+cola3
co2leu
co3l2o
-com4te.
-comtes4
+3com
+co4mp
+com2te.
+comtes2
con2ne
+continuati6
co2o
-coo1p
-co1p
+coo3p
+co3p
+co4ps
co1ra
+2corb
cor2da
+cor3de
co4re
+co5ree
cor3t
-cos4
+cos4t
co2te
cou3si
-2cp
-c1q
+cô2
+2c2p
1c2r2
-cra4s
+c4ra4s
c3rä
-c4re2
-2cree
+cre2
cre4me
+3crew
2cri
-cros4
2cry
-2c1s2
-cs4f
-c4si
+2cs2
+c2si
cst2
-4c1t
-cti2
+2ct
cti4o2
ction5
-ctur6
-1c4u
+ctur4
+1c2u
2cua
cu2e
-cu2p3
-cup1e
+cup3
+cu4pa
+cu4p1e
+cu4pl
+cu4pr
cussi4
-c1w
+c2v
+c3ve
2cx
-3cy
-c1z
+1cy
+1ç
+1d
3da.
da1a
+2d1aal
2d1ab
d3a2bak
d2abä
@@ -3696,50 +3901,52 @@ da3brie
d2ab4rü
d1ac
dach3a
+dache4
da2cho
-4d3achse
+2d3achse
2d1ad
da2de
da2do
da2d4r
d1af
-2daff
-da1f4l
+da5fab
+2da4ff
+da3f4l
dafo4n
d1ag
dagi4o
dag2o
da1h
dah3l
-dail5
+dail3
da1in
2d1air
da1is
-da2kro
-dal2a
-2d1a2lar
+da4kro
+2d1alar
dal3b2
4d1all
da2lop
da3lö
2d1alp
-d1al3t2
+d1al3t
2dalte
da1lü
3dam
-da2mei
+d1a4mei
d1amma
4d1ammä
damo3
+da3mö
d2amp
-damp7f8erf
+damp5f4erf
4d1amt
3d2an.
d1ana
da2nan
da4n4at
2danb
-dan4ce.
+dan2ce.
d1and2
2danda
d2andy
@@ -3749,6 +3956,7 @@ d2andy
d1ang
2danh
dan2kl
+dan3kla
dan2k1o
dan2kr
2danl
@@ -3756,6 +3964,7 @@ d1ann
2danna
d1a2no
2d1ans
+danti3e
2dantw
2danw
d1anz
@@ -3775,18 +3984,22 @@ dara4s
2darb2
2d3arc
dar2d1e
-dare2
+2d1area
daren1
dar3g
+d3a2rist
dark2a
3darl
dar2m1a
dar2m1i
-dar4mu
+dar4mun
da2r3o
-3dars4
+d1arr
+2darres
+3d2ars4
2d1art
-dar2th
+d3ar2th
+4d3arti
dar2tr
da2ru
d1arz
@@ -3794,6 +4007,9 @@ das2
da3sh
d1asp
das3s
+2d1assi
+2d1ast
+da4str
dat2e2
da3tei
4d3a2tel
@@ -3808,8 +4024,8 @@ dat2st
2daud
dau3e2
dauer3e
-daue6rei
-2d3au2f
+daue4rei
+2d3au4f
2d3aug
2dauk
da3unt
@@ -3822,78 +4038,93 @@ d1ax
2d1äg
2d1äh
2d1ämt
-dän3a
+dä4n3a
2d1änd
2d1äp
2däq
-2därz
+2d1ärz
2d1ä2u
dä3us
2däx
-4d1b4
+2db2
dbau2c
dbauch3
dbe2e
+db4la
+db4ri
dbu2c
dbu3s
2dc
d3ch
-4d1d2
+2dd2
d3da
+ddar4m1
d3dä
d3de
d3dh
-d5do
-1de
dea2d
+3dean
de3ar
+de3as
de3a2t
-deb4
+deb2
+deb4r
3debü
de1ch
+de4ck
deco3
-de2del
+2d1e2del
de2dit
-2de3e4
+2dee2
+de1eb
+de1e4g
+de1em
+dee4n
+de1er
+de1es
def4a
de2fa.
2d1eff
def4l
deg2
-degene7
+degene3
de3gl
deh2a
+dehas3
dehe2
3dehn
de3ho
2d1ehr
d1ei
-3d2eic
-de3i4den
+3d2e4ic
+de3i2den
de3il
3d2eim
4deime
dein2d
-de3inse
+d2einfr
+4deinr
+d2e3inse
de3inst
-dein6sta
-dein6sti
+dein4sta
+dein4sti
4d3einw
de3io
2deise
d4e1ism
-dei2sp
+dei4sp
2dekz
de2l1ac
-del4ade
de3lak
-de4l3aug
+dela4t
+del3ate
+de2l3aug
del3änd
del3b2
del3d
del1ec
3de3leg
-delei4g
+delei2g
2delek
2delem
de2len
@@ -3904,152 +4135,155 @@ deler4r
3delik
della3d
del4lan
-del4lar
-dell3au
+del2lar
+dell3auf
del2l1ä
dell3eb
-del4lei
-del4ler
+del2lei
+del2ler
del2lö2
de2l1ob
de2lop
del2se
del2so
-del2s1p
+del2s3p
del3t
dem2ar
2d1emb
-dement4
-de6mentg
-dem5ents
-de3min
+dement2
+de4mentg
+dem3ents
+demi2e
2d1emot
2d1emp
d2emu
d4en.
-den2am
de2n1e2d
de4n3end
de2nep
-4denerg
+2denerg
de3n2es
-4d3en4ge.
+d3en2ge.
de2ni
denk3li
-deno2s
-deno4st
-dens4am
-den6s5cho
-dense2
-4den4sem
-den6sere
-den6s5tau
+dens2am
+den4scho
+2den2sem
+den2ser
+dens3tau
+den4s3tie
2dentd
-den3te
2dentf
2dentg
den3th
2dentn
2dentw
2dentz
-den6zers
+den4zerf
+den4zers
de2ob
2deol
dep4l
2depoc
d4er.
+dera2b
der3af
de2rak
dera2n
de3rand
de2r3ap
-de1r2as
-de4r3asi
+de3r2ass
der2bl
-4d1erbs
+2d1erbs
2derdb
de2r1e2b
-de4reck
-de3reie
-de4r3ei4s
-5d4erem
+de2reck
+der3eis
+3d4erem
d4eren
-de4r3end
-5d4erer
-der4erf
+de2r3end
+3d4erer
+der2erf
+der3erl
derer3n
der3ero
-derer4t
-5d4eres
-de2r3eu
+derer2t
+3d4eres
+der3ess
+de2r1eu
derf4
d4erfl
d3erheb
d2erhü
+de5ric
de2r3id
-derin4f
-de6rinnu
-derin8teg
+de4rinnu
+derin4teg
der3k2
-4derklä
-d4erlan
+d3erken
+2derklä
+3d4erlan
d2erm
+de4rn
de1ro
derö4
der3r
+de4rs
+der3san
+2dersat
derst2
-der3sta
-dert7ende.
-derter6e
+der3stau
+dert5ende.
+derter4e
dert4ra
-6dertrag
-der8trage
+4der4trag
3de3ru
de4ruh
de4rum
2d1erz.
+d3erzeu
2d1erzv
d2es.
de2sa
-de4s1ag
+de4sa2g
des1ah
-de4s1am
+de4sam
des3an
de2s1än
de2seb
-de4s1e2h
+de2se2h
de2sei
-de4s3eil
2d1esel
des3elt
de3sem
-de3s4end
+de3s2end
desen3e
de3sens
-des3erm
-de2s1et
-de2s1in
+de2set
+de2sin
3desk
-des1o
-de2sor
-de2s1p
+de2s1o
+de2s3p
de3spe
+de3spru
dess2
-des3se
+des3sau
des5st
-de6st5alt
-de6stant
-de8steige
-de8steins
-des4tex
+dest3alt
+de4stant
+de4statt
+de6steige
+de4steins
+de4sterg
+des6tex
de4stit
-de6st5rat
-de4stre
+dest3rat
+de2stre
de2su
des1un
3desw
de3ta
-deten4t
+deten2t
2d1e2th
2d1etw
2d1eul
@@ -4059,32 +4293,48 @@ de1url
de3us
2d1e2vid
devil2
-de1x2a
+de1x4a
de2xer
de2xis
2dexpe
2dexpo
-2d1f6
-2d1g2
+2df2
+df4la
+df4ru
+df4rü
+2dg2
dga4s3tr
d2ge.
dger2
dge3s
d2gesh
-dge2t3a
+dge4t3a
dge4t1e
2d1h2
-4dho
d3hu
-1di
+di4aa
+di4ab
+di4ad
+di4ae
+di4af
+di4ag
+di4aj
+di4ak
+di4ale
+di4am
+di4ao
di4ap
-di2a3s
-diat4
-di4ath
+dia3s
+di4at4
+di5at.
+di4au
+di4av
+di4az
+di3äre
3dic
di1ce
di3chl
-dicht6er
+dich3t4er
dick3el
4d3i2co
3dida
@@ -4094,46 +4344,51 @@ di2den
2didy
di2e
di3e4d
-di3enb
+di3en.
di3end
-die4neb
-diener6l
+die2neb
+diener4l
di3e2ni
-dienst5r
+dienst3r
die2p
di3ers.
dies3c
di3e4th
3dif
-3dig
+di4ff
+di4gk
dig4n
dik2a
-dil2s1
+dil2s3
2d1imb
2dimp
din4a
2d1ind
di3n2e
2d1inf
-3ding
+di4ng
2d1inh
di3ni
2d1inj
2d1ink
+di4nn
2d1ins
2d3int
2d1inv
di2o3b
+di2odi
+di4ok
dion3in
-dion5s2
+dion5s4
di3ora
-dios2
+d4ios2
di2osk
-di1p2
+dip2
di3pt
d1i2ra
di4re.
di2ren
+di5rig
di2rin
di2ris
2d1irl
@@ -4144,61 +4399,76 @@ di2sp
di3s4per
2d1isr
dist2
-di2s1to
-di4s3tra
+di2s3to
+di2s3tra
di4sz
di2ta
dite1c
-di4t3erl
+di2t3erl
di4t3erm
-di4t3ers
+di2t3ers
+di3the
di2tin
di2tob
di2t3r
dit3s
di2t1u
-di5v2
+di5vid
diz2
-2d1j
+2dj
d2jar
-2d1k4
-4d1l2
-dla3g
+2dk2
+d3kl
+dk4le
+dk4na
+dk4ne
+2d1l2
dlap4
d3le
dle2ra
+dl3f
dli4f
dl3m
dl3s
-2d3m2
-4d3n2
+2dm2
+d3ma
+d3me
+2d1n2
+d3na
+d3ne
dni2
+dni3g
dnis1
+dnis3t
dni3v
-do5at
+d3nu
+do3a
+doa4k
2d1ob
3d2oba
+do5ba.
+d2obo
do1chi
d1of
-do2fe
+do4fe
2d1oh
do3ha
-doll2
-dol3la
+dol3l2
d3oly
3dom
-do2mal
-do2mar
+do4mal
+do4mar
domen1
-do3mi
do4ming
4domn
-do2mu
+do4mu
do3n2a
do5nan
doni1
4dony
-2d1ope
+do2o
+do3op
+2dope
2d1opf
do1r4a
2d1orc
@@ -4209,49 +4479,62 @@ dor2f1i
dor2fl
dor2fo
dor2fr
-dor2f3u
+dor4f3u
2d1org
d2orn
-2dort
-dor4ter
+2d3orna
+2d1ort
+dor2ta
+dor2t3ei
+dor2ter
dor2tr
d2os.
do3se
dos2k
2dosm
dost1
+d1ost.
dost3a
-dosten4
+dosten2
do3ta
+do3th
do2tof
do3un
-dow2s
-d2o3x2
+dow2s3
+d2o1x2
d1ö
dö2d
-dö2f
+dö4fe
döl3
dölla3
d2ön
3d2ör
dö2s1c
-2d3p2
-dpass3
+2dp2
+dpass1
+dpas2se
+dpas3ses
+d3pf
+d3po
dpol4n
dpo4st1
-2d1q
-d2r4
+d3ps
+2dq
+d2r2
3d4ra.
3d4rab
4d3rad
2drahm
2d3rak
3d4ral
+d4rama
+d3ramm
d3ramp
d3rand
dran3k
dra4s3s
2d3rast
+dr4at
dra4tin
2draub
2d3rauc
@@ -4271,8 +4554,9 @@ d4reas
4dreg
3d4reh
dre2ha
+dr4ei
2d3reic
-3d4reie
+3d4rei3e
drei3s
d4reiv
d4rej
@@ -4283,8 +4567,9 @@ d4reo
4d3rer
4dres.
d4resc
-dres6sei
-dres6sel
+dres4sei
+dres4ser4
+dres2st
d4rew
2drez
2d3rh
@@ -4292,13 +4577,12 @@ d3ri
3d4ri.
d4ria
d4rib
-4d5ric
+4dric
d4rid
d4rie
d5rieg
-3drif
-4driff
-d4rift
+3d4rif
+4d5riff
d4rik
d4ril
d4rin.
@@ -4316,6 +4600,7 @@ d3rod
2drogg
2drohr
3d4rohu
+dro2id.
2d3roll
2d3rose
d4ross
@@ -4325,17 +4610,16 @@ d4ross
2d3rov
d3row
drö2sc
-d5rub
3d4ruc
2d3rud
2d3ruh
-2d5rut
-drü1b
+dr4un
+2d3rut
+drü3b
3d4rüs
-2d1s
-4ds.
-ds3ab
-d2sad
+2ds
+ds3a2b
+d2s1ad
ds1al
d2salk
d2sall
@@ -4343,39 +4627,38 @@ d4s1amt
d2san
ds3ane
ds3assi
-dsau2
d2saut
ds1än
ds2äu
-4dsb
-d4schef
-d4schin
+d2schef
+d2schin
+d2schun
d3s2co
d2scr
d2s1e2b
dse2e
d2s1ef
ds1ehr
-ds4eign
+ds2eign
d2sein
d2s1emb
dsen3er
d2s1eng
+dsen3s
d2s1ent
d2s1erf
-d2serh
+d2s1erh
d2s1erk
d2s1erl
ds1err
d2s1ers
d2s1ert
d2serz
-dse2t
+dse4t
d2s1eta
d2s1ev
d2sex
-d3sha2
-ds2hak
+d3sha4
d4shal
d3sho
d4shor
@@ -4384,56 +4667,50 @@ d2s1im
d3s2inf
d3s2kal
d3s2kel
-4dsl
d4sli
d3soh
d2sop
dso2r
ds1ori
d2sö
-ds1pa4s3
-d2s1pat
+dspa4s3
+d2spat
d2spä
-d2s1pec
-ds2pen
-d4speri
+d2speri
d2s3ph
-d3s2pi
ds2por
-d6sporto
+d4sporto
d3spri
d2spro
+d3spru
ds2pu
-dss2
dst2
-d4stabe
-d2stas
+d2s3tas
ds3tauf
-d4s3täti
+d2s3täti
d4stea
d4stele
-ds2til
-d2s1tis
-d4stoch
+ds3th
+ds4til
+d2s3tis
+d2stoch
d2stod
-dstras4
-d4stren
-d3s2tro
+ds3tor
+d3strei
+d3s4tro
dsu2m
d2sun
+ds1url
ds2zen
-2d1t
+2dt
dta2be
d3t2ac
-dtach3
dta2d
-d3t2ag
+dt2ag
dta2n
dt3ane
d3t2as
dt2ax
-d3tea
-dte3mo
dt2et
d2th
d4thei
@@ -4441,26 +4718,27 @@ d3to2
d4tob
dt2op
d3tö
+d4tök
dt3r
dtran2
-dt1s
+dts2
dt3sa
-dt5st
-dtt4
+dtt4r
dt2un
d3t2ur
d3ty
-1du
+dua2ler
+du1all
du1alv
du1ar
du2b3li
du1ce
duel3la
-du2f
-2d1ufe
-duf4ter
+2d1u4fe
+duf2ter
duf2to
duf2tr
+d3u2g
2d1uh
du1i
du2in
@@ -4481,18 +4759,18 @@ d2ums.
du2n
2d3und
2d1unf
+d1unga
2dungl
2d1uni
dun3ke
dun2kl
2dunr
2dunsi
-dun4st3r
+dun2st3r
2dunt
2dunw
2d3unz
du1os
-dup4
dur2c
durch3
2d1urk
@@ -4500,26 +4778,28 @@ durch3
2d1urn
2d1ursa
2d1urt
-du4schn
-du4schr
-du4sch3w
-dus2t
-1dü
+du2schn
+du2schr
+du2sch3w
+dus4t
2düb
d3über
-2d1v2
-2d1w
+dü2str
+2dv2
+2dw
dwa2
-dwa4r
dwer3te
dwe2s
dwe4st1
-1dy
-dy2l1
+dy2le
dym3
3dyn
-dy2s1
-4d3z2
+dy2s3
+dys1c
+dy4sl
+2dz2
+d3zw
+dz4we
2e1a
ea2be
ea2b3l
@@ -4529,34 +4809,31 @@ e3a2dr
ea2g
ea3ga2
ea3g4l
+ea4ka
eakt2
e2akta
-e3akto
ea2la
e3alei
e4alem
-ea4l3ent
-ealen4z
+ea2l3ent
+ealen2z
ealer2
-e3a4lerg
+e3a2lerg
e3alex
e3a2lin
eal5le
eal3lö
eallö3s
-eal1o
+e3al1o
ea2lon
ea2lop
e2alti2
eal3tr
ea2l3u2
-eam3a
+ea4m3a
e2ame
-eam1o
-eams2
+ea4m1o
eam3t2
-ea4na
-ean3a2r
e3anf
e2ano
e3ar.
@@ -4565,53 +4842,56 @@ ea3rat
e2are
e4are.
ea2r1ei
-ea4rene
+ea2rene
e4arer
e4ares
+e4arn2
ea2ro
e3arz
-e3a2sc
-e3asf
+e2as
+e3as.
+e3a4sc
easin4
-ea2sp
-eas5s
+ea4sp
+eas3s
eate2
ea3te.
ea3ten
-eater1
eat4mes
eat2mu
eat4mun
+ea4to
eat3s
-e3at3t4
-eatu2
+e3at3t2
+e4atu2
e3aue
e3auf
-eau2fe
+eau4fe
eau4fl
e4aufo
+e4auj
eau3n
eaus3s
e2av
e2az
-e3ä4
-e1b
+e1ä2
+e3äh
+eä4st
2eba
e3bak
eba2p
e3bän
2ebec
ebe1er
-ebein7h
+ebein5h
eb2el
-ebe4ler
+ebe2ler
ebe2lo
ebenen3
-e3ber
-ebe4ras
+ebe2ras
ebert4
ebese2
-ebe4s3eh
+ebe2s3eh
ebe2so
2ebet
ebet4s
@@ -4625,26 +4905,27 @@ eb3ler
eb4leu
e3blie
eb3lo
-eb2lö
+e3b2lö
2ebo
e2bob
+ebot2
ebö2s
2ebr
-e5brau
-eb4rea
-eb2s
-eb6sche
+eb5rah
+e3brau
+eb2s1
+eb4sche
ebse2
-ebs1in
-ebs1o
-ebs1p
-ebs7panne
+ebs3p
+eb4spanne
+eb3stan
ebs3tau
eb4stät
ebs3t2h
-ebs1ti
-eb4stot
+ebs3ti
+eb4s3tot
eb3str
+ebs3treu
eb4sz
2ebu
e2bunt
@@ -4657,51 +4938,57 @@ ech1ä
2e1che
ech1ei
ech2en1
-e6ch5erzi
+echer4fa
+e4ch3erzi
e1chi
+echi3e
ech3l
ech3m
ech3n
e2cho.
-ech3ö2
-ech3r
-ech4ri
-echs4er
-echst5re
+ech3ö4
+ech3re
+e1chri
+ech3sel
+echs2er
+echst3re
ech3tab
-ech3t4ei
-ech6terh
-echter8ha
+ech3t2ei
+ech3ter
+ech4terh
e1chu
-ech1w
+ech3w
2echz
e1ci
-eci2a
-ec4k
ecke4n1
+eck3err
+ec4kl
eck3ser
-eck4sta
2eckt
3eckty
2e1cl
2eco
2e3cr
2ect
-e1d
ed2a
ed2dr
-ed4e
+ed2e
ede2al
-ede3n4er
+e3dee
+edel3l
+ede3n2er
+edens1
eden4sa
-eden4s3e
-eden4s3p
+eden2se
+eden2sp
+eden4sta
edeo2
-ede2r
+ed4e2r
eder3a
ede3rat
ederer4
-edert2
+eder3t2
+edhof4
ed2i
e3di.
2edip
@@ -4710,34 +4997,39 @@ edmas2
e3d2o
ed2ö
e3drei
+ed4rö
ed2sal
-ed4seh
+ed2seh
ed2s1es
ed2si
ed2s1o
-ed2s1p
+ed2sp
ed2sto
-ed2s1tr
+ed2s3tr
ed2s1u
edun3
edund2
e3dy3
-edys2
+edys4
2ee
-ee3a4
+ee3a2
eeb2l
+ee3bs
ee1c
ee2ce
ee2cho
e1eck
+eede3
eed3s2
ee1e2
e1eff
eef4l
-eeg4
+ee3fo
+eeg2
+eeg4r
e1ei
ee2i3e
-eein4se
+eein2se
eei4sc
eei3se
eeis3s
@@ -4749,41 +5041,39 @@ eel2ö
e2e3m2a
eemas3s
e1emb
-ee3min
e1emp
-e1en
eena2g
-e2enä
-e2enc
+e1end
een1e
-e3eng
-ee3ni
-e3enk
-e3enl
-e2eno
+e2e3n2i
+ee3n2o4
een3s
-een2z
-ee3o
+e1ent
+e1en2z
+ee3o2
+eeo4l
e2ep
ee3po
-eer4at
e1erbt
e1erd
-ee3re2
-eer1ei
-ee4r3en4g
-eer2e4s1
+ee3r2e2
+eer3ei
+ee4r3en2g
+eere4s5
eer3eti
e1ermä
ee1ro
ee1rö
e1eröf
eer2ös
+eer3sh
+eer3str
ee3r2un
e1erz
ee3sh
ee3sp
-ees2t
+ee5ste
+ees6tei
e2et.
ee3t2a
ee4tat
@@ -4791,18 +5081,20 @@ ee2th
eet2i
ee3t4r
ee2tu
-ee1u2
+ee1u
+eeu4f
eewa4r
eeweis4
e1e2x
-e1f
e2f1ad
+e2f1a2g
e3fah
ef1ana
ef1ar
e2farc
ef3arm
e2fat
+ef1aus
2efä
ef2äl
efä5sse
@@ -4810,30 +5102,29 @@ e2fäu
2efe
e2f1e2b
e3fef
-efe4l3ei
+efe2l3ei
ef1em
e2femi
efe2n1
3e2f1ene
e2fent
-efer5f
-eferin6d
-efer5r
-efeuil4
+efer3f
+eferin4d
+efeuil2
ef2fä2
3effek
1effi
ef2fl
-ef3flu
2efi
ef1id
e2f1ins
efi2s
2efl
ef4le
+ef5le.
e3f4lu
-e3flü
-2e3f2o
+e3f4lü
+2ef2o
2efr
ef4reih
ef3rol
@@ -4844,58 +5135,71 @@ efs2
ef3sc
ef3so
ef3sp
+efs4t
ef2tan
ef2tei
ef2tro
2efu
-e2fum
-e1g
-ega2m
+2efü
+ega4m
e3g2anz
-egd4
e3ge
+eg1eil
egein3
-ege4lan
-ege4l3au
-ege8l7ei8er
-ege4ler
+ege2lan
+ege2l3au
+ege4l5ei4er
+ege2ler
ege2lo
eg2en
-ege4n1a
-ege6nero
+ege4n1a2
+egene3ra
+ege4nero
+egenma6s
+egen3z
+eg2er
ege2ra
-ege5stal
-ege4s3to
-ege4s3tr
+ege3stal
+ege2s3to
+ege2s3tr
ege1u
+e4gex
2egi
e3gio
2egl
e2glo
e2glu
+egmen4ta
e2gn
eg3nä
eg3ni
-ego1p
-egro5sse
+ego3p
+egori2e
+egro3sse
+egs2ag
eg4sal
egsau3g
eg3se
eg4sei
egs2e3l
+egs3er
eg3si
+eg4sk
+eg4sm
egs2of
-egs2pe
+egs4pe
+eg4ss
egst2
eg4sto
eg2th
+eg5ver
2e1ha
eh1ach
eh1ad
eh2ade
e3h2ah
eh2al
-ehalt4s
+ehalt2s
e3hand
e2harz
e3haut
@@ -4904,10 +5208,11 @@ ehäs3
e1he
eh1eff
eh1ein
+e3helf
eh1elt
-e4hense
-e4h3ente
-ehen4tr
+e2hense
+e2h3ente
+ehen2tr
ehe3o
1e2hep
2eher
@@ -4917,35 +5222,33 @@ e2h1er2l
2e1hi
eh3im
ehis4
-ehl1a
eh1lam
eh2l3au
eh1lä
ehl3ein
-eh4lent
+eh2lent
eh5l2er
ehlo2
ehl1or
eh2lö
ehl2se
+ehl4sl
2ehm
-eh2mab
eh4mant
eh3mu
eh3na
eh3no
2e1ho
-eho2f
+eho4f
eho2l
eh3oly
2e3hö
-ehö4rer
+ehö2rer
eh2r1a4
ehr1ä
ehr1ec
eh2rei
eh2rel
-ehr6erle
ehr4ern
ehre3s
eh4rin
@@ -4957,23 +5260,23 @@ eh3sa
eh3se
eh3sh
eh3si
+eh3sk
eh3so
-eh3sp
-ehst2
+eh3s4p
eh3sta
eh3sto
eh3str
2eh3t2
eht3h
eht4r
+eh4ts
2e1hu
e2hum
eh1unf
e2huni
-e3hur
e1hü
eh3üb
-eh1w
+eh3w
e1hy
2ei3a2
eia4t
@@ -4981,17 +5284,14 @@ ei2bar
ei2bli
ei4blu
eibu2t
-ei4b3ute
-e4ic
+ei2b3ute
ei1ce
ei2cho
e2id
ei2d1a
-ei3de
-ei4deis
-eid5erre
+ei4db
+ei4dl
2eidn
-ei3do
ei3dr
ei1e
eie2b
@@ -5000,10 +5300,9 @@ ei3e2l
eie2m
4ei3e2n1
eienge4
-ei3e4s
eie2t
4eif.
-ei1flo
+ei3flo
1eifr
eif3t
2eig.
@@ -5013,23 +5312,23 @@ eig2ar
2eige.
2eigeb
2eigeh
-4eigeno
-5eigensc
+2eigeno
+3eigensc
4eig2er
2eiges
2eigew
2eigi
1ei2g3n
ei2go
-ei4g3rat
+ei2g3rat
2eigre
2eigrö
2eigru
2eigrü
-2eigs
+2eigs4
2eigt
2eigu
-4eih
+2eih
ei2hum
ei2kab
ei2kak
@@ -5041,17 +5340,18 @@ ei3k4la
ei3klä
eik2o
e2il
-2eil.
+4eil.
ei4l3ab
ei2lam
eila2n
-ei4l3ane
-ei4lang
-ei4l3anz
+ei2l3ane
+ei2lang
+ei2lant
+ei2l3anz
ei2lar
2eilb
eil3d4
-ei4lein
+ei2lein
eile2n1
ei2let
eil3f4
@@ -5059,8 +5359,7 @@ eilm2
ei2lob
eil2ö
2eim.
-ei2mab
-ei2m1ag
+ei2m1a2g
eim3all
eim3alp
eima4to
@@ -5076,55 +5375,62 @@ ei4nae
ei4n3an
ei4na4s
ei4n3at
-ei2n3ä
+ei2n1ä
+einbus2
ein3d2e
-ein6derk
+ein4derk
e1indu
2eineb
-einen4e
-ei4n3en4g
-ei6nen6se
-ein5erbe
-ei4nerf
-ei4nerk
-ein5er6la
-einer6sc
+einen2e
+ei4n3en2g
+einen2s
+ei4nen4se
+ein3erbe
+ei2nerf
+ei2nerk
+ein3er4la
+ei4ness
ei2neu
ein4fiz
-5einflus
-5einfluß
+3einflus
+3einfluß
2einfo
ein4fo.
ein4fos
ein3g2
3einger
-e2ingr
+ei4nh
+ein2hab
e2inhä
ei2nie
-e1init
+e1in2it
ein3k4
-ein6karn
+ein4karn
3einkä
e2inl
ein3n2
ei2n1o4
1einri
-e6insa
-einsas6s
-einsa7sse
+e4insa
+einsas2
+einsa5sse
3einsat
e2insc
-5einschä
-ein6stal
-ein6terv
+3einschä
+ein4stal
+ein2teg
+ein4terv
+3eintop
3eintö
3einträ
1einu
+ein3zw
ei3o
-eio2p
eio2s
-ei1p
+ei3p
eip2f
+ei4pp
+ei4pz
2eir
eir2c
ei3re
@@ -5132,20 +5438,20 @@ e1irr
e4is.
ei2sa
ei3sas
-ei6schwu
-e4ise
-ei4ser4g
-ei4s3er4l
-ei6s5erst
-ei4s3erw
+ei4sau
+ei2ser2g
+ei2s3er2l
+ei4s3erst
+ei2s3erw
1eisho
ei3s2ky
+ei4sl
ei2so
-eis2pe
+eis4pe
+ei3spru
e2i3s2s
-eisser6s
-4eisto
-eistra6s
+eist4e
+eis3tras3
ei2sum
ei2sur
1eiswo
@@ -5158,49 +5464,56 @@ ei2tar
ei4tat
2eitä
ei2tän
-ei3tei
+ei2teli
eite4ra
-ei2t1h
+eit1h
ei2tin
-eito2
-ei4trau
+ei2trau
ei2tro
-eit4sa4g
+eit4sag
eit3t4
ei2t1um
ei2t1ur
-eit3z2
+eit3z4
eiv2
eive4
ei2zar
ei2z1in
-2e3j
-e1k
+2ej
+e3ju
2ek.
2e3k2a
1ekd
ek2e
e3ke.
e3ke4n
+eker3z
e3kes
e3key
+e3ki
e3k2l
ek4lo
-ek4n
-e3k2o
-ekor4da
-e3kr
-ek4s1p
+ek4na
+ek4ne
+ek4ni
+ek4nu
+2e3k2o
+ekor2da
+2e3kr
+ek4s3p
2ekt
-ek5t6ante
-ekt3at
+ek4tank
+ek3t4ante
+ek2t3at
ek2t1ä
ek2te2l
+ek2tep
ekt3erf
ekt3erk
-ek4t3er4z
+ek2t3er2z
ekt2o
ek2t3o4b
+ekts2
2e3ku
ekur2a
e3k2w
@@ -5208,15 +5521,16 @@ e3k2w
e1la
el2abt
el3abu
-el3ader
-el1af
+e2l1af
ela4h
e2l1ak
-e2l1a2m
-el2a3mi
-e3lamp
+el3al
+e2l1a4m
+e4lame
+el2a5mi
el1ana
e4landa
+el1ank
e2lanm
e4lans
e2l1ant
@@ -5228,7 +5542,6 @@ e2l1ar
el3a2ri
el1a4si
el1asp
-el3aufw
2e1lä
e3läd
2elbil
@@ -5236,72 +5549,75 @@ e3läd
2eld
elda2r
eld3ari
-eld4arm
-el4d3erf
-eld3erl
-elder4p
-elder4s
-eld5erst
+eld2arm
+el2d3erf
+el2d3erl
+el3dern
+elder2s
+eld3erst
el3des
elds2
4e3le.
2e3lea
elea2r
-2e3leb
-4ele2c
+2eleb
+ele2c
el1ech
1elefa
4eleh
el3ehe.
2elei
-e6l5ei6ern
+e4l3ei4ern
e2l1ein
e3leine
-e5leit
+e3leit
+el1eiw
1elek
2eleko
e2l1el
+ele3ler
1e2lem
2e3lem.
e3lema
-ele2mi
+el1emb
+el1e2mi
e3lemm
2el1emp
2e3len.
-elen4k3l
-e4lense
+elen2k3l
+e2lense
e2l1ent
e3lep
-2eler
+4eler
e3ler.
eler2a
el1erd
-e6lereig
el1erf
-e4ler4fa
-e4lerfi
+e2ler2fa
+e2lerfi
e2lerg
el1erh
-el1erk
+e2l1erk
e2l1erl
-e4l3ernä
+eler2la
+e2l3ernä
eler2ö
e2l1err
el3eru
el1erw
e2l1ess
-e2l1e2ta
+e2l1e4ta
+el2eth
ele2ti
elet4ta
-2el1ex
+el1e2x
e3lex.
1elf.
elf2er
1elfm
elf4r
1elft
-elgi5er.
-elgi5ers
+elgi3
el3g2l
elg4r
e2l1id
@@ -5310,23 +5626,24 @@ elif3
2elig
e2lim
elin3a
+el3inka
eli3no
el1ins
+4elis
2elk
-elks2
-ella5den
+elks4
+ella3den
+el2lant
el2lap
-el4larb
-ellar4t
+el2larb
+ellar2t
ella2s
-el3le.
ell2ei
ell3ein
el4lel
-ellenen5
ell2er
-eller8fas
-eller7g
+eller4fas
+eller5g
ell3erh
el3lie
el2lil
@@ -5335,45 +5652,49 @@ el2lo2g
el2lor
el2lot
ell2ö
+el4ls
ell3sp
ellu2m
el2lü
-el3m2a
elm2e
elm3ein
-2eln
el3na
2elo
e2l3oa
e2lof
+elo4fe
e2lol
e2lom
e2lonk
el1opf
-el1or
+e2l1or
+e3lore
elo2ri
e3lot
e3l2ov
2elö
-el3p4
-el4s5ein
+el3p2
+el2s3ein
el3sent
+el2stor
el2sum
-el4tans
+el3tar
el3te.
elte4m
el5ten.
el4t3ent
elter4b
-elter4f
+elter2f
elt3erh
-elter6le
+elter2k
+elter4le
3elter4n
-elt5ero
-elter6sc
+elter2s
+el3test
elt3eth
el3the
elt1r
+el4ts
elt3se
2e1lu
el1uf
@@ -5381,31 +5702,29 @@ e2l1um
e2l3u2r
el3use
elu2t
+el3ute
el3uto
e1lü
2ely
e2lya
-el3z2ac
el2zar
-el4zene
+el2zene
elz1in
-el2zwa
-2elzy
-e1m
-e2m3a2b
+em3a2b
+em4ak
+e2m3alar
e2m1alk
em3anf
e2m1ano
e2m1ans
1emanz
-e4m3a2sp
+e2m3a4sp
emas2s
ema3sse
e3maß
em1au
2e3mä
em2äh
-1emba
1embo
1embry
em2dä
@@ -5417,8 +5736,9 @@ e2mef
eme2i
e2mele
em2en
-emen6gel
-emen4t3h
+emen4gel
+emen2t3h
+e4mentsp
eme3r2i
e2m1er2l
em1erw
@@ -5433,24 +5753,24 @@ emi3n2a
e3mind
em1int
1e2mir
-e3misc
+4emisc
emma3u
em2mec
-e2moa
-e3mol
+e2mof
emo3s
1empf4
+3empfä
em3pfl
em3po
em2sa
-em4scha
+em2scha
em2sim
em2spr
-ems1tr
+em2s3tr
em3t2
1e2mul
3emuls
-emune7
+emune3
e3mur
e3mus
2emü
@@ -5461,16 +5781,16 @@ e4na2b
en3aba
en3abo
4enac
-e4n3ack
+en3ache
+e4n1ack
enadi4
e4naf
4enah
en3ak
+ena4ke
en1al
-enal2a
e4nalb
e3nale
-en2alg
ena3l2i
e4nalk
e4nalm
@@ -5486,9 +5806,10 @@ en1ap
ena2pa
en3are
en3ark
+4enarm
en3aro
en1as
-ena2sc
+ena4sc
e4na4st
2enat
4e5nati
@@ -5496,16 +5817,17 @@ e4natl
enat4s
e4n3att
4enatu
-e4nau2f
+e4nau4f
en3aug
+e5naui
e4n3aur
-e6nausta
+e4nausta
e4naut
-en1a2x
+e4n1ax
en1a4z
en1ä
en3äb
-e3näi
+en4äc
e2när
en2ä3s
en3äst
@@ -5513,29 +5835,31 @@ enbu4s3
en2ce.
end2ac
en2dal
-en4dang
+en2dang
+4endef
2endel
-ende4lä
-endermas8
-en4d3es4s
+ende2lä
+endermas4
+en2d3es2s
en2dex
en2did
-en3d4ort
+en3d2ort
+en2dost
end3rom
+en3drü
end3s2l
end3s2p
end3sz
en3d2um
en3d2ü
2ene.
-en3e4ben
+en3e2ben
en1ec
e2neff
-ene2h
+ene3hen
en2eid
e3neien
e4neige
-4eneigu
e4nein
e4neis
e2n1el
@@ -5543,36 +5867,34 @@ ene4le
2ene2m
e2n1emi
2enen
-e4nense
e4n1ent
-en4entr
en3envi
en1ep
4e3ner.
-en2era
e2n1erd
-en3erei
e2nerf
-en4erfr
+en2erfr
1energ
+3energi
e2nerh
e2nerk
e2n1erl
-e4nermi
-e4n3ermo
+e2nermi
+e2n3ermo
4enern
-e4n3erne
+e2n3erne
ene2ro
+e2n1erp
e2n1err
en1ers
4eners.
e2n1ert
-en4ert.
+en2ert.
e2n3eru
e2n1erw
2enes
e3nes.
-e2n1e2sc
+e2n1e4sc
e2n1esk
e2n1ess
en1eta
@@ -5581,35 +5903,47 @@ en1eul
e2n1e2v
e4ne2x
en3f
-enft2
+en4fb
+en4ff
+en4fg
+en4fh
+en4fk
+en4fm
+en4fp
+en4fs
+en4ft
enf2u
+en4fw
+en4fz
1engad
1engag
-en3g2al
-enge3r4a
-en3g2i
+eng2al
+en3geb
+enge3r2a
+eng2i
en3gn
en3g2o
1engp
eng4ra
-eng1s2
eng3se
-2eni
e3ni.
-e3nic
-4e3nie
+2e3nic
+2e3nie
eni3er.
+eni3era
eni3erp
-eni5ers.
+eni3ers.
en3i2ko
en3ill
eni4m
en1ima
en1imi
e2n1in
+en3inh
e3nio
-eni2ö
+en3ion
e2nir
+2enis
eni4sa
e4n3iso
e3nit2
@@ -5617,65 +5951,77 @@ e3niv
enk3aus
3enkeli
enk3erg
-en4k3erk
+en2k3erk
en3k2ü
+en5mil
en2nef
en2nel
-en4ner4f
+enner2e
+en2ner2f
enn3erg
-en4n3erl
enn2i
-enni6ger
+enni4ger
2enniv
e2n3oa
e2n1ob
e3nobel
eno2br
e2nof
+e2noh
en3oli
en3olm
-eno2ma
+eno4ma
eno4n
e2n1op
e2n1o2r
en2ora
eno4ri
4enorm
-e2n1ost
+eno2s
+e2n1o4st
4e3not
eno2w
-2e1nö
+e1nö
en1ö2d
+e4nöf
+e4nök
+e4nöl
+4enred
en3sabb
+en3sac
en2san
-ensas4s
-ensa5sse
-en5sche
+ensas2
+ensa3sse
+en3sche
en2seb
+ense2e
1ensem
-en4sen3e
-ens3ere
+en2sen3e
+en3s4pen
en3spo
-ens4por
-ens4tak
-enst5alt
-en4s3tät
-ens4tel
-en6stele
-en6s5test
+ens2por
+4enst.
+enst3alt
+ens6tel
+en4stele
+en4s3test
+4enstl
2ensto
enst2ü
en2sun
-en3t2ag
-2entan
-en4tanm
-en4tanw
-en3t4ark
+2entab
+en2tad
+2entaf
+en5t2ag
+en2tanm
+en2tanw
+en3tar
+ent2ark
1entd
en3t2el
ente2n
3entera
-en4terb
+en2t3erb
en3tes
1entf
2entfo
@@ -5684,44 +6030,46 @@ en3tes
en2thi
1enthu
1enthü
-en2t1id
+en2t3id
3entla
1entn
en2tob
entopf3
en2t1os
2entö
-en4t3rol
+en4ts
1entsc
1entso
-ent4sto
-1entw
+2entss
+ent2sto
+1en4tw
4entwet
3entwic
1entz
en1u
e2nuf
e2num
-enu4r
-2enu2t
+enu2t
e4nuto
e1nü
4enwü
-2e1ny
+e1ny2
en3zare
-enz2äp
-1enzep
+en2zene
+enz3erf
enz3erg
-en4z3erk
-en4zerl
-en4z3erm
-enz5ersc
+enz3erk
+enzer2l
+enz3erm
+enz3ersc
enzi2d
-enzlan4
+enzlan2
enzo2l
+en4zs
+4enzuf
1enzy
-e1ñ
-4eo
+2eo
+eo3a
e1o2b1
eo3ben
eo3bl
@@ -5729,7 +6077,6 @@ eo3bo
eo3br
eo1c
eoch2
-eo3dr
e1of
eo3g2
e1oh
@@ -5737,14 +6084,17 @@ eo3la
e3o2ly
e1on
e3o2nat
+eon2i
eo1o
-e1ope
+eo2pe
e1opf
+e4oph
eop4r
e1or
e3or.
eo1ra
e3orb
+e3o4r3ei
eorgi1
e3ors
eort4
@@ -5756,59 +6106,67 @@ e1o4ste
e1ou2
eo1ul
e1ö2
-e1p
+eö4fe
+e3ös
2ep2a
epa2g
-epas6ser
+epas4ser
+2epeg
2eper
-e3p2f4
-e5pfi
+e3p2f
+ep4fl
eph2
-1e2pid
-e2pig
+2epia
+e2pid
+e4pig
e2pik
-1e2pile
+e4pile
e3pio
+e4pip
1epis
2epist
1e2pit
ep3le
+ep4lu
1epoc
eport4
+epor3te
1e2pos.
-ep2pa
+ep4pa
eppe3l
ep2pin
-ep2pl
+ep4pl
ep2pr
2epr
+ep4rä
ep3sh
ep2tal
-ept2an
ep2tau
+ep2tä
2e3pu
epu2s
-2e3q
+2eq
+e3qu
er1a
e3ra.
-era2be
-era3ber
era2c
-e2rach
+e2r3ach
e3rad.
-e3radi
+e3ra3di
e2radj
e2r3adm
e4radmi
e4r3adr
eraf4a
era2g
+era3ges
e1rah
e1rai
er3aic
e3rake
+era4ku
e1rald
-eral4eb
+eral2eb
er3alke
e2r3all
era4mat
@@ -5816,27 +6174,30 @@ er2an.
era4n4a
eran3d4
e3rand.
-e4rangr
+e2rangr
e2ranh
e2rano
e1rap
er3apa
er3apf
+er3apo
e2rar
er3are
e3rari
+era2rie
e3ras.
era2si
era4sie
-era2sp
+era4sp
era4s3s
-e1rast
era2ß
-e4ratel
+era3te.
+e2ratel
+e3rativ
e1raub
e1rauc
er3aue
-erau2f
+erau4f
er3aug
e2ra2v
e1raw
@@ -5845,51 +6206,52 @@ e1raz
e1rä
er1äf
er1äh
-er1ä2m
+er1ä4m
er1äp
e2r1ä4s
er1ätz
3erbarm
erb2au
erb2e
+er3blo
2erbru
erb2sp
er1c
+erche3i
er3chl
erch2o
-erd4am
-erda3me
+erd2am
+erda5me
1erdb
2erdec
-2erdel
-er4d3en4g
+er2d3en2g
erd3erw
erdeu2
1erdg
+erd5rin
2erdy
4ere.
-er3e4ben
+er3e2ben
e3r2ech
er3echs
er1eck
er1edi
-ere4dit
+ere2dit
er1eff
e2r1e2h
-ere4i
+ere3ho
4e3rei.
e3reib
-er1eig
-4ereih
-e3reik
-e4r3eime
+1er1eig
+er3eime
e4reink
er3eis.
-er5eisar
+er3eisar
er3eisb
er3eisf
er3eisr
-erei5str
+erei3str
+er3eisv
e4rek
er1e2l
e2rele
@@ -5897,70 +6259,76 @@ ere3lev
2erem
4erem.
er1emi
-ere4mis
+ere2mis
e2remp
2eren
4e3ren.
e3rena
eren1e
-e4rense
-e4rentn
-e4rents
+e2rense
+e2rentn
+e4r3ents
e3renz
-eren8z7en8d
+eren4z5en4d
+er4eo
er1epe
4erer.
2ererb
-e4r3erfo
+e2r1erd
+e4rerfo
e2rerh
e2rerk
e2rer2l
-erer5lau
-4erern.
-e4rerne
+erer3lau
+e2rerm
+2erern.
+e2rerne
e2rer2o
-erer4ri
+erer2ri
er1ers
-4erers.
-e8rersche
+2erers.
+e4rersche
e2rert
2ererv
2ererw
+e4r3erze
2eres
4eres.
er1ess
-eres3sk
er1eß
er1eta
-er1eu
-ere4vid
+eretri3
+er1eul
+ere3un
+ere2vid
erf2e
+2erfir
4erform
erf4r
4erfür
-er4g3are
+er2g3are
4ergebi
3ergebn
4ergebü
-4ergeha
-4ergehä
-erg5elst
-4ergeni
+2ergeha
+2ergehä
+erg3elst
+2ergeni
2ergn
er2gop
4ergrem
-erg1s2o
-ergs2p
-e4rh
+erg3s2o
+ergs4p
+e2rh
1erhab
er3hag
2erhai
-4erhals
+2erhals
2erham
-2erhan
2erhas
er3hei
2erher
+4erhöc
er3hu
2eri
e2riat
@@ -5969,18 +6337,23 @@ e3rib
e4r3ico
er1id
4e3rie
-eri3en1
-erien7s
-e3ri3k
-erik4l
-4e3rin.
+erien1
+eri3enb
+erie2ne
+erien5s
+e4rij
+e3rik
+eri3k4l
+4erin.
e2r1ind
-e2r1ini
-er1ink
+erin2fo
+e2r1in2i
+er1in3k
er1inl
er1int
er1inz
e2ri2on
+e4rir
4eris
e2riso
e2risr
@@ -5990,24 +6363,27 @@ e3riv
2erk.
2erkaj
er3ker
+er3kla
1erklä
2erkm
-2erkre
erk3t4
er2kum
2erl.
2erlag
3erlebn
-4erleh
2erln
-er3m2
-ermen4s
-er4m3ers
-er4n3alt
-er3ne
+erm2
+er3ma
+1ermah
+er3men
+ermen2s
+erm3ers
+er2nalg
+er2n3alt
+er2nau
er4nene
-er4nerf
-er4nerk
+er2nerf
+er2nerk
3erneue
er2nob
erno2r
@@ -6017,7 +6393,7 @@ e1roa
er1ob
ero2bl
ero2br
-e2r1o2f
+er1of
e1rog
e1roh
e1rok
@@ -6034,102 +6410,106 @@ e1ros
1erosi
e3rosit
e1rou
+e2r1o2v
e1row
-er1o2x
+er1ox
er1oz
erö2d
2eröh
erö4l
er1ö2s
-er3p
-er4rade
+er3pl
+3erprobu
er3rä
-2erren
-er3ro
-2errü
-er3s2a
+er5regi
+4erren
+ers2a
+er5sam
ers4ana
ersch4
-er5schn
-4ersei
+er3schm
+er3schn
ers2el
-er5s2i
+er3s2i
er3sk
-ersma3s4
-4ersted
-er6st5ers
-4erstil
+ersma3s2
+ers4por
+er3stä
+er4st3ers
+2erstil
er3swi
er3sz
er2t1ab
-er3tat
-er4t3erf
-er4t3er4g
-er4ter4h
-er4ter4k
-er4ters
+4erteig
+er2t3erf
+er2t3er2g
+er2ter2h
+er2ter2k
+er2ters
ert1h
er2tho
4ertö
+er3trau
4ertru
+er4ts
ert3s2e
-ert1s2p
+ert3s2p
2eru
-eruf4s
+eruf4s3
e4r3uhr
er1u2m1
er1und
e4rundu
er1up.
-er3ur
-er3use
+e4r3ur
+eru2t
+er3ute
e2r3uz
erü4b
3erweck
-er4zerk
-er4z3ers
-e1s
+6erweib
es3ab
es2abb
e4sabe
e3sac
-esa2d
+es1a2d
e3saf
e4sall
es1ami
es2an
es4and
-es3anf
es3ant
esa2ra
-e3sa1s2
+e3sas2
esa3ss
esa5sse
+es2ast
+e3satz
esa2v
es1ax
esäs4
es2äu
-2esb
-esbi5er.
+2es3b
+esbi3er.
e3s2ce
-es2chi
esch2l
esch2n
e4sco
e3se.
-es1ebe
e2s1ec
es1ehr
-esein4s
+esein2s
+es4ek
es2el
+ese3lam
ese4nal
-ese4neu
-e3senk
+ese2neu
+e3s2enk
esen3o
+es2ens
esen3sk
esen3th
-eser4at
-ese4r1u2
+ese4r1u4
eses2k
es3e2x
2esf
@@ -6144,120 +6524,147 @@ e4s3i2k
e2s1il
e4s3ins
e4siso
+e4sk.
es2kat
+e4skä
e4s3ke
e4s3kl
+e4skö
e4s3ky
-e4s3l
+es3l
2esm
-e4sn
e2s3oa
e4sob
-e2s1od
-es2oh
-es2opa
+es1od
+eso4f
+e3s2oh
+e3sol
+esonan2
eso2r
es1ora
eso3re
es2ort
e3sot
e3s2ö
-4esp
-e3spal
+2es2p
+e3s4pal
es4park
-es2pek
+es4paß
+es4pec
e4spers
-e4sph
-e3s2pi
-e3s2por
-e3s2pu
+e2s3ph
+e3s4por
+es4pru
+e3spu
2esr
-2ess.
-es4s1ag
+2e4ss.
+e4ssa
+es4s1a2g
essali3
-essau4s
+essau2s
1essay
-2essä
-2essc
+e4ssb
e4ssel
e4ssent
-ess6ere
-ess4erf
-e4ss3erg
-es4serh
+ess2ere
+ess2erf
+e4ss3er2g
e4sserl
-ess5er6la
-2essk
-2esso
+ess3er4la
+e4ssf
+e4ssg
+e4ssh
+e4ssj
+e4ssk
+e4ssl
+e4ssm
+e4ssn
+2e4sso
es2sof
-2essp
-es2s1pa
-es2spu
-es4stab
+es2sorg
+e4ssö
+e4ssp
+es2s3pa
+e4ssr
+e4sss
+e4sst
es4ste
+e4ssü
+e4ssv
+e4ssw
+e4ssz
+2est
+e4st.
estab4b
-e4stabs
+e2stabs
esta3ge
est1ak
-es2tan
-est4ap
-e4starb
-es2t1a4s
+es4tan
+e2stant
+e2starb
+es4ta4s
+est3asc
e3stat
-es2tau
-e4staum
-es2te.
+e2stat.
+e2staum
+es4te
este2c
este4i
-est5eing
-e6st5eink
-e6st5einl
+es5teil
+est3eing
+e4st3eink
+e4st3einl
+est3eint
este2l
e4stele
e4st3emi
e4st3eng
-est5entr
-est5erha
-e4ster4ö
-e4st3erz
+e5stens
+est3entr
+e4sterei
+est3ergi
+est3erha
+e4ster2ö
estes2
e4st3ess
+e4stf
e3sti
e4stid
e4stip
-estmo6de
-1estn
+e4stm
+estmo4de.
+3estn
e2stod
-e4strad
-es3trak
-e5strec
-e5strick
-es2tu
+e2strad
+e3strec
+e3strick
est3ums
-e3s2tü
-e3s2ty
+est3urk
+e3s4tü
+e3sty
e3suh
e2s1um
+es2und
es1ur
esu4s
-2e4sw
+es4ut
+2esw
e3sy
e2ß1el
e2ßent
-eße3re
+eß2e3r2e
e2ß1erg
-e2ß1erl
-e1t
+e2ß1er2l
e3ta.
etab4
et2a2c
2e3taf
2etal
-etalla4
-etal6lag
-etal6li6n
-et1ami
-e3t4an.
+etal4li4n
+et1a4mi
+e5t4an.
+e3tas
+et2ast
et4at
etat3r
et1äh
@@ -6268,13 +6675,12 @@ e4t1ein
ete3ke
eten3d2
ete2o
-eter4hö
-ete1ro
-eter4tr
-ete4sp
+eter1ä
+eter2hö
+eter2tr
2eth.
et2ha
-e4t3hal
+et3hal
e3the
et2hi
e4thik
@@ -6282,90 +6688,85 @@ e4thik
et2hu
e4t1i2d
eti2m
-etin1
+eti3na
et1ini
et2it
eti2ta
-eti2th
-2e3to
-e2tob
-e4t1o2f
-et4on
+eti4th
+2eto
+e2t1o4f
eto4n3al
-etons4
-e4torg
+et1orc
+e2torg
2etr
et3rad
-e4traum
+e2traum
et3rec
e2t3res
et4ros
ets2c
-etscher7e
+etscher5e
etsch3w
-ets1p
-et1su
+et2s3pe
ett1a
et2ta2b
et2tad
et2tak
+etta4m
ett2as
et2tau
et2tä
-et2tei
+et4tei
ette4n1
et4th
-et2tö4
+et4tö4
et2t3r
et2t1um
-et2tur
-et2tü4
+et4tur
+et4tü4
3e2tui
e3tur
etwa4r
+ety2l1
1e2tym
2etz
-etze4s
-et2zw
+etze4s5
+et2z3w
eu1a2
-eu3b4
+eu3b
+eub4r
2euc
euch4ta
2eud
eudi4e
-2eue
eu2eb
-eue6r5eif
-eue6reis
-eueren4
-euerer6s
-euerer6t
+eue2r3ei
+eueren2
+euerer4s
+euerer4t
eu3eri
-eu3erk
-eu3err
-eue3s
-eu2e5sc
-4euf
-eu2fer
+euer2ri
+eu2esc
+2euf
+eu4fer
eu2g1a
-euge4mi
-eu6gense
-eu3g2er
+euge2mi
+eu4gense
eugin2
eugin4f
-eu4gin4g
+eu2ging
eu2gre
eu2gri
-eug1s2
+eugs4
+eug3sp
eu3h
eu1id
-eu1in1
-e4uk
+eu1in
1eukal
eu2kä
eulan2
euland3
-eu3l2e
+eul2e
eul2i
2e1um
e3um.
@@ -6375,11 +6776,10 @@ e3umb
e3umf
e3uml
e3um2s
-eums1p
+eum4s3p
eum3st
e3umw
-2eun
-eu2na
+2eu2na
eun2e
eu4nei
e3un2g
@@ -6388,44 +6788,49 @@ eu4nis
eunk2
eun3ka
eu1o2
-eu1p
+eu3p
e1up.
+eu4pd
eup2f
-e3upg
+e3u4pg
eu4r1an
-eu4r3ast
+eu2r3ast
eura3t
eu2rau
eur1c
e2ure
euren2
-eu4rens
+eu2rens
eur4er
-eur3f4
+eurf4
1euro
-2eu1s4
+eu4rs
+eur2so
+eus2
e3usar
-eusch4o
-eu4s5k
+eusch2o
+eu4sk
eu3sp
-eu3ss
+eu3s4s
eust4
-2eut
-eut2e
eu5ted
+eu3tem
+eute3r2e
eut2h
-3eu3tha
+1eu3tha
eut2i
eu3t2o
-eut6scha
-eut6schn
-eut6schr
+euts4
+eut4schn
+eut4schr
2eux
+eu1y
eu2za
+euz3eic
eu2zo
-eu2z1w
-e3ü
-e1v
+eu2z3w
+e1ü
+e3üb
e2vak
e3var
2ev2e
@@ -6433,18 +6838,15 @@ eve5ri
evie3le
2e3vor
ev2s
-e1w
-ewä4
-ewä6s
+ewä2s
e2we.
ewei4sc
-ewert4
+ewert2
ewer3te
-e3wir
ewi2s
e3wit
2ex.
-1exam
+1exa4m
ex3at
2exc
2exd
@@ -6470,97 +6872,91 @@ ex2tin
2exu
e2xum
2e1xy
-ey1l2
+eyl2
ey2n
ey3no
eys2
-e1z
e3z2a
ez2ä
e2z1enn
e3zi
ezi2s
-e3z2o
-ez2w
-ez3z2
-é1b
-é1c
-é1g
+ez2o
+ez4wa
+ez4wi
+ezz2
+é1
+é2e
égi2
-é1h
-é1l2
+él2
élu2
-é1m2
-é1n
-é1o
-é1p
-é1r2
-é1s
-é1t
-é1u2
-é1v
-é1z2
-è1c
-è1m
-è1r
-1ën
-ë1t
-ê1p
-1fa
-fab4
-2f1ab5b
+ém2
+ér2
+éu2
+éz2
+è1
+2ët
+ê2t
+1f
+2f1abb
fa2ben
2fabf
2fabg
-2f1a2b5l
+2f1a2bl
2fabn
f2abr
-2f1ab5s
+2f1abs
2fabw
-fa4cheb
-fa4chel
+fa2cheb
+fa2chel
fa2ch1i
fa2cho
-fachs2
+fachs4
fach3sp
fa2ci
fa2dan
fa2del
+f4aden
f1ader
fa2di
fa2dr
fa3e
-fah6l5ent
+fa4eli
+2faf
+fah4l3ent
fai3b
-f1a2ka
-fa2ke
+f1a4ka
+fa4ke
f3aktio
f4akto
-3f2aku
-fa3la
+f2aku
+fa3l2a
fa3le
fal2kl
-falla4g
-fal4lei
-fal6lenk
-fall5ent
-fal6lerk
-faller6s
+fal2la
+falla2g
+fal3le.
+fal2lei
+fal4lenk
+fall3ent
+fal2ler
+fall3er4s
falli4
-fal6lini
-fal4lis
-fal6scha
-fal6schl
-fal6schm
+fal4lini
+fal2lis
+fal4scha
+fal4schei
+fal4schl
fal3te
fal4tei
fal2tr
3fam
-fa2mei
-f1amp
+fa4mei
+4f1amp
f1amt
-3f2an.
+f2an.
fa2nar
+2fanb
fand2a
f2anf
fan2ga
@@ -6576,25 +6972,27 @@ f1anp
f2ar
far2b1a
far4bel
-far4b3er
-far4bin
+far2b3er
+far2bin
farb3l
far2bo
-far2b3r
+far4b3r
far2b3u
f3arc
-3fa5ri
+3fa3ri
+farm2e
far2r1a
farre2
-far4rec
+far2rec
far4reg
+far2rh
2f3art
2f3arz
3fas.
fa3s4a
fa3sh
f1assi
-fas2t
+fas4t
2f1a4str
fa2ß
f1aße
@@ -6602,14 +7000,17 @@ f3at
f4at.
fa2to
f4ats
+4fatt
+fau1
+2f1aue
2f1auf
f3aug
fau2s
f1ausb
+faus4t
faust3r
-3f4av
+3fav
fa2xa
-1fä
3fä1c
fäh4rin
fäh2ru
@@ -6617,138 +7018,153 @@ f1älte
2fäq
3färb
2f1ärm
-2färz
-fä4s
-fä6sser4
-3fäßc
+4f1ärz
+fä4ss
+fä6sser2
fä2ßer
2f1ätz
2fäug
2fäx
-4f1b4
+2fb2
fbau1
fber2
+fb4re
2f1c
f3ch
-2f3d4
-fdien4e
-1fe
+2fd2
+f3da
+fdien2e
+fd4ri
+fd4rö
+f3ds
3fe.
featu4
f2ech
+fech5t2e
fe2del
fe2dr
fe2e1i
-feein5
+feein3
fe1em
-2f1e2he
+4f1e2he
fehle2
-feh4lei
-f2eie
+feh2lei
+fei3le
f2eind
+fe3infr
2f1eing
fe3ini
fe3ins.
2f1einw
f1eis
-fek4tin
+fek2tin
+fek2t3r
fe2l3a2
fe2l1ä
fel2da
felde4m
-feld6erh
+feld2er
fel2dr
feld5ri
2fe2lek
-2felem
fe2l1er
fe2les
fel3la
fel4lan
fel2lä
+fel3le.
+fel3les
fe2l1o
-fel4s3oh
-6fel6tern
+4fel4tern
felt4r
fel3tu
f2em.
2femb
fem4m
2femp
-fen3a
+3fen.
+fen3a2
fe2nä
fend2a
4fenerg
+fene4t
fe2ni
fe2no
fen3s2a
-fen5s2c
+fens4c
fenst2
-fen6stri
+fen4stri
f1ent
fen3t2a
2f3entf
f2enti
-4fentla
+2fentla
f2ento
2f3entw
4f3entz
fe2nu
3fep
-fe2pi
+fe4pi
f2er.
-fe1ra
-fe2rab
-fer3a2d
-fe2ral
-fe4rang
-fer4ant
-fe4ranz
-fe2rau
+fe2r3a2d
+fer3al
+fe1ran
+fe2rang
+fer2ant
+fe2ranz
fe2r1ä
2ferd.
fer3da
-fer3d2e3
-f2ere
+fer3d2e1
+2ferde.
+2ferden
fe2r1e2b
fe2rec
-3fer2ei
+fer2ei
4f3ereig
fer3eis
-f4erel
fer3ell
-fe4rer4g
-fer4fah
-fer4fol
+fe3rerf
+fe2rer2g
+fer2fah
+fer2fol
ferg4
+2fer2geb
+f4erges
f4ergr
feri2d
ferie4n3
feri4on
-4fer4leb
+fer2leb
+fer3m
f2ern.
fer4nei
fe2rö
f4erpa
f4erpf
f4erpl
-f4erra
-fer4reg
+f4er5ra
+fer2reg
ferri2
f2ers.
+fers4t
f2ert
fert4r
f2erz
-fess2e
+fer2zeu
+fes3s2e
fes4t
fe2sta
-fest3a4b
+fest3a2b
fest3an
fe4st3ei
+fes6tel
+fester2
fe4stin
fe2st1o
fe2st3r
2f1e2ta
+fe4tag
3fete
fe2th
fet4t3a
@@ -6759,8 +7175,7 @@ feuer3ö
2f1ex
fe1y2
3fez
-1fé
-4f1f
+2ff
f3fa.
ffa2b
ffa2ce
@@ -6776,25 +7191,23 @@ ffa2t
ff1au
ffa4z
f2f1e2b
-ffe2e
f2f1ef
f2f1ei
ffe3in.
-f5fek
ffel3l
ff1e2m
f2femi
ff2en
ff3erle
+ffer3z
f2fetz
-fff4
ffi3k
f2fil
-f2fim
ffi4xi
ff1lag
ff3le
ff3li
+ff5lon
f3flü
ffo2
ff1ori
@@ -6802,32 +7215,38 @@ ff1ox
f2fö
f3f4rä
ff3ro
+ff4rü
ffs2am
ff3sch
-ff2s1p
-ffs4tau
+ff2s3p
ffs3tie
ffs3tut
ff3stü
ff3t2
-ffus3s
-f2fy
-4f3g2
+ffus5s
+2fg2
fgeb2
fge3s2
+f3gh
fglim2
-4f3h2
-1fi
-3fi.
+f3gü
+2f1h2
+fh4eu
+f3hu
fi4ak
fi2ar
+fi1as
fi3at
fiden2
fi2do
-f2ie
-fi2e1i
+f2i2e
+fi4eb
+fie1i
fi1er2f
-fi2gr
+fi4es
+2fif
+fi2g3r
+figs4
fi2k1as
fi2kel
fi2kin
@@ -6839,25 +7258,27 @@ fi2l3an
fil3d
fi2les
fil2et
-filg4
fi3li
fi4lin
fil2ip
fil2ma
fil2mä
-fil4med
-fil4mei
-fi2lo
-2fimp
+fil2med
+fil2mei
+fi2l1o
+2f1im
+fi4mi
+4f3imp
3f2in2a
fin2e
2f1inf
fing2
-fings2
+fings4
+2f1inh
fi3ni
-f2ink
fin2sp
-2f1int
+4f1int
+4f1inv
fi2o
fi3ol
fi2r
@@ -6865,12 +7286,11 @@ fi3ra
fi4re
fir3me
fi3s4a
-fi4sch3a
-fi6schei
-fisch3l
+fi2sch3a
+fi4schei
fisch3o
-fi4schr
-fi4sch3w
+fi2schr
+fi2sch3w
fi3s2h
2f1iso
fis2p
@@ -6881,10 +7301,11 @@ fi2tor
five4
fi2xel
fi2za
-2f1j
-3f2jo
-4f1k4
+2fj
+f2jo
+2fk2
fka4t3
+fk4ne
f2l2
2fl.
f3lad
@@ -6892,18 +7313,20 @@ f5land
f4lans
f3lap
f4lasc
-f3lats
-flauma4
-1flä
-3f4läc
+fl4at
+f3lat3s
+flauma2
+3flä
+f4läc
4f3läd
-2fläh
-2f3län
-2flär
-2fläß
-2f3läu
-f5le.
+4fläh
+4f3län
+4flär
+4fläß
+4f3läu
+f3le.
2f3leb
+f4lec
f4lee
2f5lein
flek3
@@ -6916,121 +7339,145 @@ f3lind
fli4ne
f3ling
2f3lins
-2f5lon
-1f4lop
-flo7s8ses.
-1f4loß
-1f4lot
+f4log
+2f3lon
+3f4lop
+flo5s4ses.
+3f4loß
+3f4lot
flo2w
f3lö
4flöf
+f4lög
+f4löß
+f4löz
3f4luc
f3luf
-1f4lug
-1f4luss
-1fluß
+3f4lug
+3f4luss
+3f4luß
f4lut
flut1o
-f4lü
-f5lüd
-f5lüm
-4f3m2
-fma5che
+f3lüm
+2fm2
+f3ma
+fma3che
fma2d
fmas2s
fma3sse
-4f3n2
+2f1n2
+f3na
+f3ne
+fnerz2
+f3ni
fni2s
-1fo
f1ob
fo2be
-2fober
+4fober
fob2l
-2f1o2f
+2f3of
+fo4fe
foli3
fo2na
fo4nan
fon3au
fon3dr
-fo4n3in
+foni2e
+fo4n1in
fo2nop
-fons2
+fons4
fo2nu
-2f1op
+f1o2p
+fo3po
4f3org
-for4m3a4g
-for4mas
-for4m3ei
-for4min
-forni7er.
-for6schl
-for4sta
-for4sti
-for4t3ei
-for4ter5
-for2t1h
+fo3rin
+for2m3a2g
+for2mas
+for2m3ei
+for2min
+forni5er.
+for2sta
+for2sti
+3fortb
+for2t3ei
+for2ter5
+for2th
for2t3r
fort3s2
for3tu
for2u
fot4r
-1fö
-2fö2f
+2föf
+fö4fe
2f1ök
-4f1öl
-4f3p4
-2f1q
-f2r4
+2f1öl
+2fp2
+f3pf
+f3pl
+fp4lu
+2fq
+f2r2
f3ra.
-frach6tr
+frach4tr
2f3rad
2f3rah
fra4m
+fr4an
f3rand
-f5rap
+f3rap
+f3rase
f3rat
-1frau.
+3frau.
f3rauc
2fräd
-1f4rän
+3f4rän
2fre.
f3rec
f3red
-2fref
+4fref
f4rei.
f3reic
f4reie
-frei1f
+frei3f
f4reig
frei3k2
-2frein
+4frein
+freis4
2frek
2f3rep
-2frest
+f4req
+f3resi
+4frest
3f4reu
2f3ric
-fricht6e
+fricht4e
fri3d
-fri2e
+f4ri2e
+f5rieb
+f5rief
2frig
f4ri3k
+2f3rin
f3rip
-1fris
+fr4is
f4risc
f4rist
-fri6ster
+fri4ster
2f3roc
+f3rok
2frol
-1f4ro2n
+3f4ro2n
fro4n1a
-f4rop
+f4ror
+f4ros
fro2sc
f3rot
+f3roz
frös2
f3ru
f4ruc
f3rü
-4f1s
+2fs
f3sac
f2s1al
f2sa2n
@@ -7042,54 +7489,61 @@ fs3ate
f2saut
fs2än
f2sca
-f4sce
-f4schan
-f4schef
+f2sce
+f2schan
+f2schef
f4schro
f2scr
f2s1e2b
fse2ei
-f4sehr
+fs1ehr
fse2n
fs1en1e
f2s1ent
f2s1er
-fse2t
+fser2u
+fse4t
f2s1eta
-f2s1i4d
+f2s1i2d
f3s2ky
f2s1o2
f3soh
f3sol
-fsp4
-f3spann
-f2s1pas
+fs2pa
+f2s3pas
f2sph
-fs2pie
f3s2pl
f3s2por
+fs2prä
f2spre
f2spro
fs2pul
fs3s2
-fs2tal
+f4st.
+fst2a
+fs3tak
f2stas
-f3s2tat
-f4s3täti
+f3stat
+fs3tät
+f2stäti
+f2stech
+fste2i
+fs3terr
+fs3th
f2stip
-f2s1tis
+f2s3tis
fst4r
-f4s3tres
-fs1trü
-f4stüte
+f2s3tres
+fs3trü
+f2stüte
f2s1un
f3sy
-4f1t
+2ft
f2ta.
ft1a2be
ft1abl
ft1af
-f3t2ag
+ft2ag
ft1ala
ft1an
f2t1ap
@@ -7111,8 +7565,9 @@ f2t1ent
ft3erfü
ft1erk
f2t1erl
+fter2le
f2t1erz
-f2t1e2ti
+f2t1eti
f2t1ex
f2t1h
f4t3hei
@@ -7122,100 +7577,97 @@ f2t1in
f3t2ing
fto2
f2t1of
-fton1
-ft1op
f3tor.
f2t3ot
f3t4ran
-f2t3res
+f2tres
f3treu
ft4rit
ft3ro
-ft3ruh
-fts1
-ft2sa2
+ft4ru
+ft5rud
+ft5ruh
+ft2s1
+ftsa2
ft4sag
ft4sam
-ft2sän
-fts2c
+ft3s2c
ft4sche
-ft2se2
-ft4seh
+ftse2
ftsen1
-ft2si
-ft2so
-fts3tei
-ft4stem
+ft3st
+ft4staf
+ft4star
+fts3tät
+ft4s3tem
ft4ster
-ft4stes
-ft3stie
-ft6stier
-ft3stri
+ft4s3tes
+ft4stier
+ft4stor
+ft4streu
+ft3t
fttra4
f2tum
ft1urk
ft1url
+ftü1
ftwa4
-ftwa6r
ft3z2
ftze3d
-1fu
+ftz4w
3fuc
3fug
-f2uh
+fugi3
+3f2uh
fuku3
fulb4
f1um1
fu2mei
f2umm
-fund3er
-fun6derg
-fun6derh
+2fums
+fun2d3er
2f1unf
2fungl
2f1u2ni
-fun2kl
+fun2k3l
fun2ko
fun2k3r
fun2ku
-2f1unm
-2funr
-2funt
+4funm
+4funr
+4funt
f2ur
furch2
fu4re.
2f3url
fus2
+fus4s
fu3sse
-fus6sen
fu4sser
-fuss1p
-fuss1t
-fus4ste
+fuss3p
+fuss3t
fu2ß1er
3fut
-1fü
2füb
-fühl4sc
+fühl2sc
fün2
fü2r
fü3s2
-2f1v
-4f1w
-f1y
-4f1z
+2fv
+2fw
+fwur2
+2f1y
+2fz
fz2a
-fzeiten6
-fzei8t7end
+fzeiten4
+fzei4tend
fz2ö
-fzu2ga
-fz2w
-3ga.
+fz4wi
+1g
2gabf
2gabg
2g1a2b3l
gab2o
-g1abr
gab4ri
2gabsc
g2abt.
@@ -7228,41 +7680,38 @@ ga3d2i
gadi4e
ga2dr
gae2
-ga1fl
-5gag.
-ga1k
-ga2ka
-ga2ku
+ga3fl
+3gag.
+ga3k
+ga4kt
+ga4ku
gal2a
-ga3laf
-ga2lar
2g1alau
2g1alb
-2g1alg
+g1alg
gall4e
gal3lo
2g1alp
2g1alta
2g1altd
g1a2lu
-ga2mec
-ga3mel
+ga4mec
gam3ma
-5g4amo
+3g4amo
2g1amt
g1a2na
2ganal
-gan3d4
+gan3d2
2ganf
2ganga
-4gangeb
+2gangeb
gan2gr
gang4sp
gan2g1u
2g1ank
2ganl
2ganmu
-3g2ano
+3gano
ga2nob
2ganr
gans2
@@ -7273,7 +7722,6 @@ ga1ny
2g1anz
ga3pe
2g1app
-ga1q
3gar.
g2ara
2garc
@@ -7289,29 +7737,32 @@ ga2s
g2as.
ga4s3al
ga4sam
-gasche4
+gasche2
gase2
ga5se.
ga4sei
ga4sel
-ga4s1e4m
+ga4se4m
ga5ses
ga4set
-gas5s2
-5g4asse.
+gas3pe
+gas3s4
+3g4asse.
g3asses
-6gassess
-ga5ssest
+4gassess
+ga3ssest
+gas5st
+gas6st.
ga4st3el
ga3sti
ga4stin
gastra4
-ga6stras5
-gas4t3rä
+ga4stras3
+gast3rä
ga3stri
-ga6strom
-gas1tu
-ga3sun
+ga4strom
+gas3tu
+ga3su
ga3t2a
2gatm
gat4r
@@ -7325,73 +7776,79 @@ gau5ne
ga3z
2g1äp
gär3th
-2gärz
-gä3s2
-gä5st
-gä4u
-2g3b4
+2g1ärz
+gä3s
+gä5ste
+2g1ät
+gä4us
+2gb2
gbau5s
+g3be
gber2
gbi2
+gb4ri
2g1c
2gd
-g1da
g3d2ad
gda3de
g2d1ak
g2d1an
-g2d1ar
g2d1au
-g1dä1
-g2dei4
+gdä1
+g2dei2
gd1els
g2dent
g2d1er
g2d1et
g2d1in
-g1do
g2dop
-g1dö
-g1dr
gd3re
+gd4ri
gd3ru
gd3s2
-gdt4
-1ge
+gdt4r
ge3a2
+ge4at.
ge4ate
geb2a
+3gebä
+ge4bb
+3gebi
ge3ble
-geb4lin
+geb2lin
geb4lo
-gebot2
+gebot4
+ge4bt
3gebü
ge1ch
-ged4
ge1e2
ge3ec
ge2es
geest3
-ge5fa
+ge3fa
+2gefak
3gefä
4g1eff
gef4l
gef4r
-ge3fu
-g4eg
-gege2n1
+gege2n
gegene4
ge3g2l
geg4r
+3geha
+3gehä
geher3l
ge3ho
+ge4hs
+ge4ht
+ge3hur
2g1eid
ge4ie2
ge4ig
-g2eil
-ge1in1
+ge1in
ge2inf
-gein4h
+gein2h
+gein3i
2g1einr
gein2s
gein2v
@@ -7400,27 +7857,28 @@ geis4
2g1eise
gei3sh
geiss3c
-gei4sta
+gei2sta
geist3r
+ge4iz
2gek.
-ge4lanz
+ge2lanz
gelb1r
-gel4b3ra
+gel2b3ra
gelb5s
-gel4den
-gelder4
-gel6derh
-gel6ders
+3ge4ld
+gel2den
+gelder2
+gel4derh
+gel4ders
ge3lec
ge2lef
-2ge2lek
+2g3e2lek
2gelem
gelen1
-ge4lene
-gel3ere
-ge4lerk
+ge2lene
+geler3l
geler3ö
-ge4l3ers
+ge2l3ers
ge2l1ev
gel3f
gel1i4m
@@ -7430,13 +7888,16 @@ gell2i
gel2ö
gel3s2a
gels2p
+gels4t
gel3sz
-gel3ta
+ge4lt
+gel2ta
gelt4r
-gel3z2
+gel3z4
gem2
-ge4ma.
-gem6e
+ge2ma.
+ge3mau
+gem4e
4g1emp
gem3s
ge3mu
@@ -7444,143 +7905,156 @@ ge3na
ge4n1ac
ge4nad
ge4nak
-ge4n3al
+ge4nal
ge4nam
ge4nap
ge4nar
ge4nat
-gen4aug
-4genda.
-gend3in3
-4g3endmo
+2genda.
+gend3in
+2g3endmo
gen2dr
+gen2eh
gen3eid
-gener4f
-4generg
-ge4n3ern
-gen6erwe
-gener4z
+2generg
+ge2n3ern
+gen4erwe
+gener2z
ge2nim
gen3k4
-genma7sse.
+genmas2
+genma5sse
gen3n
+3geno
ge2noc
-gen6semb
+ge4nr
+gen4semb
gen3sk
gen3sz
gen3tä
2gentf
gen3t2h
-gen3tr
+gen5tr
2gentw
ge2nun
genzma3
-genzmas6
-gen3zw
+genzmas4
ge1oo
geo2ri
-g2ep4
+g2ep
+ge5pfi
ge3pl
ge3po
ge1ra
-ge2rab
+ge2ra2b
ge2rak
ge2r3al
ge3rann
-ge4rant
+ge2rant
ge4r3a2r
ger2as
+ge4rb
2gerdg
ge3rem
-ge4rene
-ge4reng
-ge4ren4s
-ge4r3ent
+ge2rene
+ge2reng
+ge2ren2s
+ge2r3ent
ger2er
-gerin4d
+gerin2d
gerin4f
-ger4inn
-gerin4t
-4ger4klä
+ger2inn
+gerin2t
+2ger2klä
g3erlas
-germas6s
-ger5me
+3g2erlä
+germas4s
ger3no
2g1ernt
ge1ro
ge2rob
ge1r2ö
-ger4sat
-4g3er4seh
+4g3erprob
+ger2sat
+2g3er2seh
ge3r2u
-g6es.
-3ge3s2c
-ge6sche.
-ge2seb
-4g3e4sel.
+ger2zeu
+g4es.
+ges2c
+ge4sche.
+ge2s1eb
+2g3e2sel.
ges3elt
ge2s1er
ge3sha
ge3s2i
ge3so
-ges2p
-ge3spa
-ges4pi
-gess2t
+ges3s2a
+gess4t
+ges5ste
gest2
gest4a
-gest6e
-ge4s3tur
-get2a
+gest4e
+ges3th
+ge2s3tur
+ge3t2a
g1etap
ge2thi
ge5trei
-get1s
ge3t4u
2g1e1ul
ge3unk
ge1urt
ge3u2t
-4g1e2x
-2g3f4
+ge3we
+2g1e2x
+2gf2
+g3fe
gfi2l
-2g1g
+gf4rü
+2gg
gga2t
-g5ge
+g3ge
gge2ne
+gges2
+gge3sa
+ggi3e
gg2l
g3gla
g3glo
g2g3n
-gg4r
+gg4re
+gg5re.
2g1h
-4gh.
gh2a
3ghale
gh2e
3g2het
3g2hie
gh1l
+gho3re
3gh2r
ghs2
g2hu
-gh1w
+gh3w
gi3alo
-gia2s
gich2
gicht1
+gi2e
+gi4eb
gie3g
-gi2e1i
-gi2e3l
+gie1i
+gie3l
giel2a
gie5n2e
gi4eno
+gi3ens
gie3res
+gi3ern
gies4
gift5s
gi2gu
gi2kel
-2g1ill
3gime
gi2me.
gi4mes
@@ -7589,56 +8063,66 @@ gi2met
2gin2d
gi3ne
2g1inf
-2gin4h
-2g1ins
+4gingeni
+2gin2h
+g1i4ns
gin2sa
+2ginsf
2g3int
2gin2v
gi2ob
2giok
2g3isel
+gist4
+giste4
git2a
-gitt6e
-gi4us
-2g1j
-4g3k4
+gitt2
+gitt4e
+gi4u3s
+2gj
+2gk2
+gk4ne
+g3ko
gl2
-4gl.
-4g1lab
+2gl.
+2g1lab
2g1lac
2gladu
2g1lag
2g1lam
2gland
gla2s1c
+glas3p
glast4
gla4str
-gla4stu
+gla2stu
+gl4at
3g2laub
2g1lauf
-g1läd
2gländ
3gläs
g1läß
2gläuf
gl3b
-g2l4e
+g2le
2g3le.
3glea
2g3leb
g3lec
-4g3led
+3gled
g3lee
2g3leg
2gleh
g4leic
4g3lein
-gleiter8s
+glei4str
+gleistra4
+gleiter6sc
glei4t5r
g3len
4glenk
4g3ler
-glerei4
+glerei2
2gles
3gles.
g3lese
@@ -7662,7 +8146,7 @@ g2loa
g2lob
g2loc
2g3loch
-g2lok
+g5loks
g2lom
g2lop
2glorb
@@ -7681,8 +8165,8 @@ g2lut
g3lüg
2glw
3g2ly
-2g1m2
-gmen4tr
+2gm2
+gmen2tr
gmi2s
g1n
2gn.
@@ -7690,9 +8174,9 @@ g2n2a
g4na.
2gnac
g4nad
-2g5nah
+2gnah
gn4al
-gna4l3er3
+gna2ler3
2gnanl
3g2nä
2gnb
@@ -7707,7 +8191,8 @@ gne2tr
2gnh
g2nie
g2nif
-g4nin
+g4n1in
+2gning
2gnint
2gni2s3
gnise2
@@ -7728,22 +8213,31 @@ g2nü
2gnw
g2ny
2gnz
-go4a
+3go.
+go2a
+go4al
goa3li
g1ob
gobe3l
-2gobj
+2go4bj
g2ob2l
-2g1o2f
+go4bs
+go4ch
+goe3
+2g1of
+go4fe
2gog
+go4gh
2g1oh2
goh3ren
go1i2
gol2a
gol2da
gol2fr
+go4mn
3gon.
go4nat
+go4nd
gon2e
3gons
3g2opa
@@ -7751,255 +8245,284 @@ gopf4
go2pos
2gopt
gor2a
-2g1ord
-2g1org
+2g1o4rd
+g1org
+go4rt
+3gos
go2si
-go3sl
go2sp
-2g1osz
+go4ss
+4g1osz
3goß
-go3t2h
-got6terb
-got6t5erg
+go3th
+go4tt
+got4terb
+got4t3erg
3gou
go1y
-gö2f
+gö4fe
g1öl
3göt
-2g3p4
-2g1q
-g2r4
+2gp2
+g3pf
+gp4fu
+gp4la
+g3ps
+g3pü
+2gq
+g2r2
g4rab
gra2ba
gra2bi
gra4bl
2g3radl
2g3rah
+g3rai
2g3rak
+gr4al
gram1
-grammen6
-gram8m7end
-gram6mer
-g3rand.
+grammen4
+gram4m5end
+gram4mer
+g3rand
+g4rande
2gra2r
grar1e
+gra3rie
gra4s3a
-gra4sh
+gra6shi
gra4sp
gra4str
2g3raub
-grau3f
+grau5f
2graum
grau3sk
2gräd
+g3rän
gräs5c
g3räu
-2g5re.
+2gre.
g4reb
2g3rec
g3rede
-g4re2e
+g4ree
2g3ref
gre2fr
2grege
2g3reic
grei4fr
2g3reih
+g3reim
g3rein
g3reit
3g4rem
-3gren
-4g3renn
+3g4ren
+4g5renn
gre3no
-gren6z5ei
+gren4z3ei
grenz3w
g4rer
-2grese
-gres6ser6
+2g3rese
+gres4ser
g3ret
g3rev
2g3ric
gri2e
-2g3riem
+4g3riem
g3riese
2grig
-gril4la
+gril2la
4g3ring
4g3rinn
gro2b3a
gro3ber
gro2bl
gro2b3r
+grob3s
2groc
2groh
2g3rol
+gr4om
gros4
2g3rose
g4ross
-gro5sse.
-gro7ssen.
-gro7sser.
-gro7sses.
+gro3sse.
+gro5ssen.
+gro5sser.
+gro5sses.
g4roß
g4rot
+2g3röc
2gröh
2gruf.
g4ruft
2g3ruh
g3rui
2g3rum
+grunder5n
grun2g
3grup
-3grus
grus2s
gru3sse
-3gruß
-2g3rut
+4g3rut
2g3rüc
grüs2
-4gs
-g2sa
-gs3a2b
-gs3ach
+2gs1
+g2sa2
+gs3ab
g3sack
-gsa2d
-gs3a2k
-g3s1al
+gs3a4k
+g3sal
g4s3alb
g4sall
g4salm
g4salt
-g4sama
-gs1amb
-g4samp
-gs3ane
+gs2am
+g4s3ama
+g4s3amb
+g4s3amp
gs3a4p
-gs3a2r
-gs1as
+gs3ar
g3sat
-gs3ato
+gsa3te
gsau2g
gsau4r
-gsa2v
-gs1ä
-g3sc
+g2sä
+gs4ät
+g3säu
+gs2c
g4sca
-g4sce
+g4s3ce
gsch4
+g5schal
g4schef
-g5s2chi
+g5s4chi
g5schn
-g4sco
+g3schu
+g5schü
+g4scl
+g4s3co
gs3d
-g2s1e2
+gs5dor
+g2se2
gs2e3h
-g5s2eil
+g5s4eil
gse4kl
g3sel.
-g4s3ela
+g4sela
g3seln
gs3em
gsen1
+g5seni
gs2enk
-g4sent
g4ser
g3sere
-gs3er1i
+gser1i
g4se4s
+gse4t
g4seu
gsfi2l
-gsgene4
+gsh2
gs3ha
-g2s1i
+g2si
gsi2d
g3sig
gs3i2k
g3sil
g4s3io
g4sis
-g4sita
+g4s3ita
gs2ki1e
-gsmas8sen
-gs1o2
-gso4b
-g5son
-g2s3op
-g5s4orge
-g5soz
-gs1p4
-gs2pac
+gsmas4sen
+g2so2
+g4so4b
+gso4f
+g3sol
+gs4on
+g4s3op
+gs4oz
+g2sö
+g2s3p
+gs4pac
gs4pant
g5spei
-g3s2pek
-g3s2pi
-g5spie
-gs3pl
-g5s6port.
-g4s3pru
-gsrat4
-gs3s4
-g2s1tab
+g3spek
+g4spf
+gs4pir
+g4spl
+g3s4port.
+gs3s2
+gss4t
+gss4w
+g4st.
+gs3ta
+g2stab
g3stad
g2staf
-g2s1tät
-gs2te.
+gst1au
+gs3tä
+g2stät
+g4stee
g5stein
gst2el
g5stell
-gs4tem.
-g4stemp
-gs4ten.
+g4s3temp
gste2r
-gs4ter.
-gs4tere
-g6sterei
+g4sterei
g4sterm
gst3err
-gs4tes.
-g4stest
+g4s3test
g5steu
-gs2thy
-g3s2ti
-gs3tie
-gs3tis
+gs3th
+gs4tha
+gs4thy
+g3sti
+gs3tier
+g4stis
g3sto
g4stoch
g4stod
-g4stor
-gs1tot
-gst4ra
-gst5reit
+gs3top
+g4s3tor
+gs3tot
+gs3tö
+g5stör
+gs3tr
+gs4tras
+gst3reit
gst4res
-g4s3treu
+g2streu
gst3rit
gst3ros
g2stru
-gs1trü
-gs1tur
-gs1u
+gs3tu
+gs3tü
+g2su
+gs4uc
gs3un
gsü3s
g3sy
-4g1t
+2gt
g3te
gt1h
gt2hy
gt2i
gti2m
g3to
-gt4r
+gt4ra
gt2se
-1gu
gu4ale
-gu1an.
+gu3am
gu1ant
gu1as
gu4d3r
gu2e
2gued
guet2
-2g1u2f
+2g1uf
+gu4fe
2g1uh
+guil3
gu3ins
gu1i4s
gum2e
@@ -8008,7 +8531,7 @@ gummi1
gun2e
2g1unf
gunge2
-4gungew
+2gungew
2gungl
2g1u2ni
2g3unk
@@ -8018,39 +8541,38 @@ gunge2
gure4
4g1url
gur2t3h
-gur2tr
+gur4tr
gurt3s
gu4s3a
gu2sä
-guschi5
+guschi3
gus3se.
gus3ses
guss1o
gus2sp
-gus4st
-gust3a4b
-gu4stap
-gu6stein
-gu6st5en6d
+gus4s3t
+gust3a2b
+gu2stap
+gu4stein
+gu4st3en4d
gu3sti
gu2str
gu2ß1
gußt2
-gu2t
-gut1a
+gu2t1
gu3te
-gu4t3er4h
-gut1h
+gu4ter2h
gut2s3p
2güb
3gür3
-gü3st
-2g3v
-2g1w
+2gv
+2gw
+gy4ar
gy3n
gy4na
-2g3z2
-gzeu4gi
+2gz2
+gzeu2gi
+g3zh
2ha.
hab2a
hab2e
@@ -8060,7 +8582,7 @@ h1ablu
h1a2br
h1abs
2habw
-ha4ch3en
+ha2ch3en
ha2cho
2hada
ha2del
@@ -8076,8 +8598,8 @@ h1affä
haf3f4l
h2aft
haf2tr
-haft2s
-hafts3p
+haf4tre
+haft4s3p
hag2a
h2agg
ha3ha
@@ -8086,36 +8608,35 @@ h2ai
3hai.
h2aj
2haka
-ha1kl
+ha4kes
+ha3kl
2h2al.
ha3l2al
-halan4c
+halan2c
h1a2lar
ha2lau
hal2ba
hal4bel
-hal4bin
+hal2bin
hal2b3r
hal2bu
2hale
2halh
hal2i
2halk
-hal4lei
-hal6lere
-haller6f
-hal6lerg
+hal2lei
+haller2
hal4leu
-hal4lo4k
+hal4lo2k
ha3lo
-4halp
+2halp
hal2sp
-hal4tal
-hal4tei
-hal2t3r
+hal2tal
+hal2tei
+hal2t5r
hamot2
+hampi4ons
2h1amt
-ham3te
h2an.
2hana
ha2nal
@@ -8125,13 +8646,15 @@ han2au
h2anbe
h2and
han2da
-han4d3er
+han3den
+han2d3er
han2d3r
ha2nem
-han2f1
-han6g5end
-han4gro
-hang3s
+hanf1
+han2fl
+han4g3end
+han2gro
+hang3s3
han2k1
2hanl
2hano
@@ -8143,8 +8666,8 @@ hao2s
ha2pl
ha2po
ha2pr
-h2a3ra
-ha4rab
+ha3ra
+h1a4rab
2harb
2harc
h2ard
@@ -8152,22 +8675,24 @@ har2fr
h1arm.
har3ma
h2arme
-har4me.
+har2me.
har4ne
ha2rom
2hars
-hart4e
har2th
h1arti
+h2arts
har2za
h2as
2has.
2ha3sa
-has2c
-has4h3
+has4c
+has4h
+has2p
has4sa
-hasser4
-hass1t
+has2ser2
+hass3t
+has6sti
ha4str
ha2ß1
h1aße
@@ -8177,10 +8702,9 @@ h3atl
ha2t3r
2hats
hatt2
-h3attr
h1audi
h1aufb
-hau5f6lie
+hau3f4lie
hau3f4lo
2h1aufm
h1aufs
@@ -8190,39 +8714,46 @@ hau2sa
hau4san
hau2s1c
h2ause
-hau4sel
-hau6s5ent
-hau4spa
-hau4spe
+hau2sel
+hau4s3ent
+hau2spa
+hau2spe
hau4ss
-haus5sen6
+haus3sen4
hau4s3ti
-hau4sto
-hau4sur
+hau2sto
+hau2sur
h2aut.
hau2t1a
+hauten4
+hauto2
hau2t3r
ha2ve.
+havil2
häde2
h1äff
2häi
hä2kl
-2härz
-hä4s
-hä5sc
-hä6s5chen
+2h1ärz
+hä4s5chen
+hä4ss
2h1äst
2häug
-häu2s1c
+häu2s3c
hä3usp
-2h1b4
-hba4ras
+2hb2
+hba2ras
hber2e
+hb4ri
2h1c
-2h3d4
+2hd2
hdan2
+hdä1
+hd4ri
+h3ds
2hea
he2ad
+he3as
he3be
heb3eis
he2b3l
@@ -8235,7 +8766,8 @@ h3echs
hed2g
he2dit
he1e4m
-hee2n
+he1e2n
+he2en.
hee2s
he1e2t
h2ef.
@@ -8247,7 +8779,7 @@ he3f2em
hef3erm
2heff
he2fid
-he4f3in4g
+he2f3in2g
he2f5le
2hefr
hef4ra
@@ -8260,26 +8792,29 @@ hei4a
h4eib
h1eie
h1eif
+hei4fr
h1eig
he2im
-hei4mal
-hei4mar
-hei4mei
+hei2mal
+hei2mei
heim3p
hei4mu
2hein
hei4na
heine2
-hei4n3eb
-hei6nene
-hei4n3er
-h3eintr
+hei2n3eb
+hei2neh
+hei4nene
+hei2n3er2
+he2inf
+h3einsp
2heio
2he1ism
heis4s
he1i4st
h2eit
-heit4s1
+he3i4ti
+heit4s3
h1eiw
hekt3a
he2la
@@ -8294,9 +8829,13 @@ h2elf
he3li
hell2a
hell3au
-hel4lic
-hel4mei
-he3l2or
+hel2lic
+helm1a
+hel2man
+hel2mei
+he3lo
+he4lof
+hel2or
he2lö
4helt
h4em.
@@ -8305,9 +8844,9 @@ hema4s3
hem2b
1hemd
2heme2
-h2e3m2i
-he4mia
-h3e4miss
+h2em2i
+he3mid
+h3e2miss
1hemm
2h3emp
h2en.
@@ -8318,21 +8857,21 @@ henen1
hen3end
he4nene
he4nens
+he4nenz
hen3erg
-he4nerm
+he2nerm
he2n1e4t
2henga
-hen4gag
-hen4kan
-hen4kau
+hen2gag
+hen2kan
+hen2kau
2heno
heno3t
-hen4sem
+hen2sem
hen3st2
hent2a
-hen3te
-hen4ter
-hen3tr
+hen2ter
+hent4ra
h1ents
2h3entw
h3entz
@@ -8341,9 +8880,11 @@ hen3z2
2he2o
he3on
he3op
+heori2e
he3pa
he3ph
h1e2pi
+h1epo
hept2
h2er.
her3a2b
@@ -8352,114 +8893,145 @@ he2rad
he4r3a2r
herau2
herb2
+her3c
+her2dri
+h2ere
he2r1e2b
-he4reck
-her4eif
-4he3reig
-he6reis.
-her7eises
+he2reck
+her2eif
+2he3reig
+herein3
+he4reis.
+her5eises
he2rel
-he4rene
-he6rersc
-he4rerw
+he2rene
+herer3s
+he4rersc
+he2rerw
+h4erfam
h1erfo
-her4fol
-6hergebn
+her2fol
+herg2
+4her4gebn
+heri2e
2herif
-herin4d
+herin2d
herin4f
-he6rin6nu
-herin4s
+he4rin4nu
+herin2s
+herin4ter
h1erke
-her4klä
-h5er6kran
-h6erlad
+her2klä
+h3er4kran
+h4erlad
2herm
herma3s
+h1ernt
he3ro
he4r3o4b
he4rof
he4rop
he4rot
h1erör
+hers4t
her3sta
hert4
her3th
her3um
-her4zap
-her6zeng
-4h3erzeu
-her2z1w
+he2rut
+h1erwä
+her2zap
+her4zeng
+her2zer
+h3erzeu
+her2z3w
he3sa
2hese
he3si
-he3s2p
-hes2t
+hesi2e
+he3s4p
+hes2ser
he2tap
he3tä
+hete1
heter2
he3th
het2i
-he3t4s
+he3t2s
he2u
heu3g
+h3eule.
he3unt
3heusc
he3x
-he1x2a
-2hexp
+he1x4a
+he4xd
+he4xk
+he4xl
+2he4xp
+he4xt
hey2
he1ye
1hè
-4h1f4
-hfaller6
+2hf2
+hfaller4
hfan2
hfel2l3
hfi2s
+hf4la
hflei2
-2h3g4
+hf4rü
+2hg2
+h3ga
hgas1
hga4sen
+h3gr
+hg4ru
2h1h2
hhoh2
-4hi.
+2hi.
2hia
hi2ar
+hi1as
h1iat
2hic
hi1ce
-hich6t5er
-hicht6sp
+hich4t3er
+hicht4sp
hi3d
+hi4db
+hi4dd
hid4e
hi4dio
2hido
hi2e
hi3ens
-hie4rei
+hie2rei
hier3i
-hie4rin
+hie2rin
hiers2
hif3f4r
hi2k3r
hi2l3a4
-hile3n2
+hi3l4au
+hilen2
hil2fr
+hili2e
h2im
2hima
h1imb
h3i4mit
h4imm
h3impe
+h3impl
hi2n
hi3nak
-hi3nam
+hi3n2am
hi3nap
hi5n2as
-h2inde
hine2i
hi3nel
-hin2en5
+hin2en
h1inf
h1inh
2hi3n2i
@@ -8469,53 +9041,64 @@ hin2t1a
2hio
hi3ob
hi4on
+hio3p
hi2p3
hi4pl
+hi4pu
hi2r
hi3ra
+hir3b4
hi3re
hi3ri
hir2m1a
hir2mi
hirn1
-hir4ner
+hir2ner
hir2s
1hirt
2his.
his2a
hi2se
h1i2so
+his2p
hi2spa
hi3tac
-hi2tan
-hi2tel
+hi3th
hi3t2i
hit1r
-hi2tro
hit3z2e
hi2v1o
-2h1j
-2h1k4
+2hj
+2hk2
hkamp2
h2keu
hki2n1
+h3kl
+hklat3
hklo3s
+hk4ne
+hk4re
2hl
hl2ag
hla2gr
-hlam8meng
+hlam4meng
hlan4d3a
+hl1anz
h1las
h1lat
h1laut
h1lay
h3läche
h3läd
+h4läf
+hl1är
h1läs
h1läß
h1läu
-hlb4
-hl3d4
+hlb4l
+hl3d2
+hld4a
+hld4r
h3le.
hle3a
h3leb
@@ -8526,31 +9109,29 @@ h3leist
hl1el
h5len.
hle4nas
-hlenen3
hl2enn
-h4l3entr
-h4lents
+hl3entr
+h2lents
hl2enz
h3ler
hle2r3a
-hl4ere
+hl2ere
h2lerg
-hler4hö
+hler2hö
hl2erk
-h6l3er4nä
+h6l3er2nä
hle3run
hl1erw
h4lerz
h3les
h4lesi
-hlf4
-hlg4
+h4leud
h2lie
h3lied
h2lif
h2lim
hl1ind
-hling4s3
+hling4s
h2lip
h2lis
h3list
@@ -8562,21 +9143,24 @@ hlma3s2
h2lo
hl1ob
h3loc
-hl1o2f
+hl1o4f
h3log
-hl1op
h4lor
hlo2ra
+h5lorb
h3los.
h3losi
+h4loss
hlos4st
-hlo2ß1
+h4lo2ß1
h2lös3
hlö4ss
+hl2sal
hl4sar
hl2ser
hl3ska
-hl3s2lo
+hl3slo
+hls4tec
hls3tie
hl3str
hl2su
@@ -8585,11 +9169,11 @@ h3luf
h3luk
h3lumpe
h1lüf
-hlz2
-2h1m
+hlz4w
+2hm
h3mad
h3mag
-h3mak
+h3m4ak
h3man
h2mant
h3mar
@@ -8605,32 +9189,36 @@ hm2e
h3me.
h3med
hme1e4
-hmeer4s
+hmeer2s
h3mein
+h3meise
h3meist
h3meld
hme3le
h3men
hmen2s
-hme4ran
-hme4rei
+hmen4s3p
+hme2ran
+hme2rei
+hm3estr
h3mex
hmi2e
h3mind
-h3mini
-h3minz
h3mirr
+h3misc
h2mo
h3mop
h3mot
h3m2ö
+h4mök
h4möl
hm3p2
-hm2s1p
+hm2s3p
h2mu
h3mul
h3musi
hmut4s
+h3my
2hn
h2na
h3nag
@@ -8640,7 +9228,11 @@ hn3a2te
h4natt
h3nau.
hn1äh
-hn3d4
+hn1är
+hnä6sse
+hnbau3
+hn3d
+hnd4r
hn2e
hne3b
hne2e3
@@ -8652,14 +9244,16 @@ hne4n
hn4eng
hne4pf
h3ner
-hner4de
+hner2de
hner3ei
h4n3e2ro
h4n3ersa
+hn3eur
hn3ex
-hn3f4
+hn3f2
+hnf4l
hnflei4
-hnhof8stra8s
+hnhof6stra6s
h2nic
h2nid
h2nie
@@ -8667,102 +9261,114 @@ hn1im
hn1in
h2nip
hni4sa
-hnk4
-hnno2
+hnk2
+hn1ob
h2no2r
hnra2
hn3sa
hn3s2p
-hns2t
-hnsuch4
+hnst2
+hnsuch2
+hn2th
hntra4
hnts2
h2nul
h2n1unf
-hn3z2
-ho4ar
+hnz2
+h4oben
ho3bern
ho2b3l
ho2c
hoch3
-hoche2
-hock3t
+2hocy
2hod
2ho2e
hoe3n
ho3er
-ho4f1a4
-ho2fä
-ho2fed
-ho2feu
+ho4f3a4
+ho4fä
+ho4fed
+ho4feu
hof3f4a
-ho2f3l
-ho2f1o
-ho2f3r
-ho2fu
+hofi4
+ho4f3l
+ho4f1o
+ho4f3r
+ho4fu
+ho4fü
2hoi
ho2l1a
hol3ar
+hol3dr
1hole
ho2l1ei
ho2lem
-hol3g4
+hol3g
+holin2
hol3k
holl4
2holy
h3olym
1holz
-hol6zene
+hol4zene
hom2e
-ho2me.
-ho2mec
-ho2med
+ho4me.
+ho4mec
+ho4med
+ho4mel
h2on
hond4
hon2er
+honi2e
ho1on
hoo2r
2hop
-h1ope
+ho2pe
ho1ra
+ho2rak
h1o2r2an
ho2rau
h1or3d
2hore
-ho4rens
+ho2rens
ho3ret
+hor2fr
2h1org
hor3ta
-hor4ter
-hort3s
+hor2ter
h1ortu
h2os.
+hos3a
ho3se2
ho4sei
ho3sl
ho4sla
+2hosö
+hos4t
ho2str
-ho4ßene
+ho2ßene
2hot.
-ho3th
2hotr
-2hot1s2
-1hou
-hou4s
+2hot3s2
+ho3un
2ho2w1
+ho3wer
h1ox
ho1y2
-hô1
+2hoz
1h2ö
2hö.
hö2c
-5höhe
-2hö4s
-hös1c
+2höe
+3höhe
+hö2s1
+h4ösc
+hö4ss
hös3se
-h3öst
-2h3p2
-h1q
+h3ö4st
+2hp2
+h3pf
+h3pu
2hr
hra2b
hr3ac
@@ -8770,11 +9376,12 @@ hr3ad
hr1a2g
h1r4ah
h1rai
+h3ramp
h1rane
hr3ap
hras3s
+hrau2c
h3räu
-hrb4
hr1c
hr3d
h2rec
@@ -8784,27 +9391,36 @@ h3ref
hr3eff
h2r1eh
h4rei.
-hrei4ba
-hrei4br
+h4reib
+hrei2ba
+hrei2br
h3reic
h3reif
h4r3eig
-hr4eini
-h4reinl
+hr2eini
+h2reinl
hrei3th
+h4r3ele
+hren3z
h3rep
-hrer6geb
+hrer2fo
+h4rer4geb
hr2erh
hr2erk
h4rerla
-h6rer6leb
+hr2erle
+h4rer4leb
+hrer2lö
hr2erm
-hrer4sa
-hrer5st
+hrer2sa
+hrer3st
+hrer2tr
+hrer4trä
+hrer4tüc
hr2erw
hr2erz
-h3re2s1
-hres5s2
+h3re2s3
+hres5s4
hrest2
hre2t
h2r1eta
@@ -8815,18 +9431,15 @@ hrga4
hrgu4
h2ri
h3ric
-h4rick
-hri4e
+hri2e
h3riesl
h3rin
-h4r1ind
hr1int
h4rist
-hr3l
hr3m2
h3rog
h3roh
-h1ro2l
+h3ro2l
h4romat
h4rome
h4romi
@@ -8838,6 +9451,7 @@ h3rou
h3rö2s
hr2s1ac
hr4s3and
+hr4sau
hr3sch
hr2s1em
hr2sen
@@ -8851,7 +9465,7 @@ hrs3l
hr2s1of
hrst2
hr4stec
-hr6stele
+hr4stele
hr2su
hr2tab
hr2tan
@@ -8863,24 +9477,26 @@ hrt2s
hrt4ste
h3ruh
hr1ums
+h3rus
h3rut
h3rü
h4rüb
-h4ry
+h2ry
hrz2
-4h1s
-h4s3acht
-h2sa2d
+2hs
+hsa2b
+hs3acht
+h2s1a2d
h2s1alk
-h2sall
+hs2alt
h4samt
h2san
hs3and
+h3sann
h2s1as
h2sath
h2sato
h2saud
-h4s3aur
h2saut
h2säh
h2säug
@@ -8889,92 +9505,99 @@ h4schan
hs2cr
h3se.
h2s3ec
-hse4e
-h4s1ehr
+hse2e
+h2s1ehr
h2s1eie
-h4seind
-h6seinst
-h3sele
-hse4lin
+h2seind
+h2seins
+hsela2
+hse2lin
hs1emi
-hsen5erg
+hsen3erg
h2s1ent
+h2s1erb
h2s1erf
hs1erg
-h2serh
-h4serkl
+h2s1erh
+h2serkl
h2s1erl
-hs1ern
-hs4erne
+h2s1ern
h2serö
+h2s1ers
+hser2u
h2s1erw
h2serz
h2sex
h3s2ext
-hsha2k
+hsha4k
h2s1i2d
hs2im
h2s1ing
-h3s4inni
-h4s1ita
+h3s2inni
+h4s3ita
hs2kal
h3skand
hs1of
h2sofe
h2sop
-hs1org
-h2spac
-h4s3pani
-h2s1par
-h2s1pat
-h3spec
+hs1or
+hs2p
+h2s3pac
+h2s3pani
+h2s3par
+h2s3pat
h3spei
h2sper
-h2sph
-h2spo
+h2s3ph
+h2s3po
h3spoi
h2sprä
h2spro
-hss2
+hss4t
+h4st.
+hst2a
+hs3tabl
h2staf
hst3alt
-hst2an
-h2stau
+hst3arb
+h2s3tau
h2stäl
-h2stäu
+h2s3täu
h4stea
h4stele
h4sterm
-hs3tier
+hs3the
+h2s3tier
h2stin
h2stit
-h2s1tol
-h2s1tor
+h2s3tol
+h2s3tor
h3stö
-h4s3treu
-hstro2
-h2stu
-h3stun
+hs3treue
+hstro4
+h2s3tu
+hs4tub
+h3s4tun
h3stü
h2s1u
hs2ung
h3sy
-4h1t
+2ht
ht1a
h2tab
hta2bl
h2ta2d
ht2ag
-ht4akt.
-ht4akte
-h2tall
+ht2akt.
+ht2akte
+ht2al
+h2t3all
h2talo
h2talp
-h2talt
-hta2m
+h2t3alt
+hta4m
h2ta2n
ht3ane
-h3tank
h2tap
h2ta2r
ht2as
@@ -8984,15 +9607,16 @@ h2t3at
h3tat.
h3tate
h2tau
-h3taug
+h3taum
h4tax
ht1ä
h2tär
h3te.
-ht3e4ber
+hte2ber
ht1ec
hte3cha
-h2t1e2d
+hte2d
+h2t1ede
ht1eff
ht1e2he
h2teif
@@ -9003,38 +9627,41 @@ ht1ein
h2t1eis
h2t1eke
ht3elas
-hte6l5ei.
-h4telek
-h4t3elfe
-h4t3elit
-hte4m
-ht1emi
+hte4l3ei.
+h2telek
+h2t3elfe
+h2telit
+ht1e4mi
h2temp
h3ten.
ht3engl
-ht3enta
-h4tentf
-hter6de.
-hterer6s
-ht3erfo
+ht3en4ta
+h2tentf
+hte3rel
+hterer2
+h2t3erfo
ht3erfü
-h6terfül
-h6tergeb
+h4terfül
+h4tergeb
ht3ergr
-hter6gri
ht1erh
-hter6häl
-hter8höhu
-h6terleb
-h6t5erleu
-h6terneu
-ht5erspa
-hter8spar
-ht3erst
-h6tersta
-hter6tra
+hter4häl
+hter4höhu
+h2terkl
+h4terleb
+h4t3erleu
+h4terneu
+h2t3ernt
+h4ter4prob
+hter4reg
+ht3erspa
+hter4spar
+ht3er2st
+h4tersta
+ht4erstr
+hter4tra
ht3erwä
-ht3erze
+h2t3erze
h2t1ese
h2t1ess
h2teta
@@ -9042,93 +9669,100 @@ hte4th
h2t1eu
h3teum
h3teun
-h4textr
+h2textr
h2t1h
h4thei
h3thera
h3thes
+h4thi
h4tho
h2t1i2d
h3tig
h2t1im
-h2t1i6n3
+h2t1i4n3
ht3ine
h2t1is
h3tisc
-hti3t4
+hti3t2
htni2
+hto2
h2t1ob
-hto2d1
-h2t1o2f
+htod1
+h2t1o4f
h2t3oly
+h2ton.
h2tope
h2tord
ht3rak
h3tran
ht3rand
-h4t3ras
-ht6rates
+h2t3ras
+ht4rates
ht3rau
-h4traub
-ht6raume
+h2traub
+ht4raume
ht3rec
-h3treck
+h5treck
ht3rei
h2t3res
ht3ric
-h4t3rieg
+h2t3rieg
h2t3rin
h3trit
+h2t3riv
h2t3rol
h2t3ros
h2t3roß
ht3röm
ht3ru
-h2t3rü
-h4ts
ht2sah
ht2sal
ht4s3a4n
ht2scr
-ht4sein
+ht2sein
ht2sel
-ht4s3end
-ht4seng
+ht2s3end
+ht2seng
htse2r1
hts3eri
-htsha2
-ht3s4hak
-hts3kr
+htsha4
+ht3shak
+ht4s3kr
ht2s1o
-hts3par
+ht2sp
+ht3spen
+ht3spre
hts3tät
ht4s3tem
hts4tie
-ht4stip
-ht4s3tur
-ht4s3tür
-htt4
+ht2stip
+hts3trau
+ht2stri
+ht2s3tur
+ht2s3tür
+ht2su
htti2
+htt4r
htu2e
h2t1urs
ht3z2
-hu2a
hu2b1a
hu2bei
hu4bel
hu2b1en2
hu2bi
hu2b3l
-hu4b5r
+hu4b3r
hu2bu
-hu2fa
-hu2h3a
+hu4fa
+hu2h1a
hu2h1i
+hu2ho
h1uhr
h1uhu
hu2kä
hu2k1in
-huk3t4
+huk3t2
hu2l3a2
hu4lab
hu2lä
@@ -9136,16 +9770,16 @@ hule2
hu2l1eb
hu2l1ei
hu2lem
-hu4l3eng
-hu4lent
-hu2l1er
+hu2l3eng
+hu2lent
+hu2l1er2
hu2let
hu2lid
hu2l1in
hul3l2
hu2lo
-hu2lö
-hul3s
+hu2l3ö
+hul3s2
hu3m2a
h1umh
h1ums
@@ -9153,25 +9787,22 @@ hu2n
h1una
h2und
hun3d2e
-hunde3i
hun2e
2hunf
hung2
hun3ge
-hungsa4
h1uni
-h1unm
2hunt
h1ups
2hur
hur3g2
hur2t3h
-hu3s2a
+hu3sa
hus3h
hu2so
hus2s3a
hus3se
-hus4ser4
+hus4ser2
hus2s1o
hus2sp
hus4st
@@ -9181,8 +9812,8 @@ hu2ti
hu2t1o
hu2t3r
hut2t
-hut4zen
-hut4z3er
+hut2zen
+hut2z3er
hut2zu
h2ü
h3über
@@ -9191,18 +9822,25 @@ h3übu
hüf2
hüft1
hühne4
-2h1v
+hüs6tel
+2hv
hvil2
-2hw2
-h2wall
+2h2w2
+h4wall
hwe1c
-h1weib
-h1weih
+h3weib
+hwei4fr
+h3weih
hweins3
-hwein6sa
+hwein4sa
hweis4s
-h2wirr
+hwen2ka
+h3werbu
+h4werp
+h4wirr
+h3woh
1hyd
+hy2de
hy3dr
hy2lor
1hymn
@@ -9210,24 +9848,27 @@ h1yo
hy3os
1hyp
hy2pe.
+hysteri4e
2hy2t
-2h1z
+2hz
hz2a
h3z2o
hzug4
-h3z2w
+h3zw
+hz4we
+iaa2
i3ad.
iad2a
i1adn
ia3do
-iaf4l
+ia3e2
+ia3f4l
i2ago
ia1h2
i1ai
i3ak.
i3ake
-ia2kei
-ia2kr
+ia4kei
i1akt
i1al
ia2l1a2
@@ -9241,21 +9882,22 @@ i3alef
i3alei
ia3lek
i3alel
+i3alemp
i3aleng
i3alent
+i3alep
i3alerb
-i3aler4f
+i3aler2f
i3alerh
-i3a4lerm
+i3a2lerm
i3a2l1et
i3alex
i3a2lia
i3alim
i3a2lin
-i3al3l
+ial3l
ial4ler
iall2i
-i2alo
ia2lon
ia2lop
ia2l1o2r
@@ -9263,9 +9905,8 @@ ial3p
ial3s
ial3t2
ia2l3u2
-ial3z2
-i1am.
-ia3ma
+ial3z4
+i3am.
iampe4
i1ams
i1an.
@@ -9275,30 +9916,35 @@ ian3alt
ia2nau
i1anc
i3and2
-i3a2n1e2b
-ian2er
+i1a2n1e2b
+ia3n2er
i1ann
i1ans
-ian2s1p
+ian2s3p
i3ant
i3anz
ianza4
ia1o
ia2op
-ia3p
-ia1q
+ia3pf
i1ar
i3ar.
ia2ra
i2are
-iar3r
-i1as
-i3as.
-ia3sh
+2ias
+i1as.
+i4asc
+i1asg
+i4a3sh
i2asi
-ia1s2p
-ias5s
+i1asm
+i4aso
+i4a3s2p
+i1as3s
iast4
+i1ast.
+i4asu
+i4asy
i3at.
i3at2h
i4athe
@@ -9306,89 +9952,94 @@ i4athe
i3ats
i3au
ia3un
-iau2s1
+iau2s3
i2az
-2iä
-i1ä2m
-i1äp
-i1är.
-i1ärs
-i1ät
+2i1ä
+iä4mi
+i3är.
+i3ärz
i3ä4tem
iä2ti
-iät5s2
-i1äv
-4i1b
+iät3s2
+iät5sa
+2ib
ib1art
i2b1auf
i2b1aus
i2baut
ib3be
ib2bli
+ibe2i
i2b1eig
+ib3einh
i2b1eis
-ibe4n1
-i6ber6geb
-i4b3er4la
+ibel4u
+iben1
+ibe4na
+i4ber4geb
+i2b3er2la
ibe1ro
i2bim
i2b1in
i2blad
+i2bläh
+ib3leis
i2bleu
i3blu
i3b2o
i2bö
-i2b3rau
ib3ric
i2b3roc
ib2ser
-ib4ste
+ib4s5te
ib2un
i2b3unk
i2b3unt
ibus3
ibus1c
+ibus4t
2ic
i3ca
ic1c
ich1a2
-ich6art.
+ich4art.
ich1ä
i1che
ich1ei
ich2er
icherin5
-ichermas8
+ichermas4
ichgro3
i1chi
ich1l
ich3le
ich3li
-i3ch6lo
-ich5m
-ichmas4
+ich6lor
+ich3m
+ichmas2
+ich5mä
ich3n
i1cho
ich3ort
i2ch3r
-ich6sele
+ich2sa
+ich4sele
ich2s1i
-ich6stie
+i4cht
+ich3terz
ich2tr
i1chu
-ich1w
+ich3w
i1ci
+icks2p
ickt2
i1cl
ic3la
ic3ra
-i3cu
-i1d
2ida
id2ab
i3d2ac
id4al
-id2am
id1a2n
i3d2ans
i3d4at
@@ -9397,45 +10048,44 @@ id2ax
idä1
idbu4
id2e
-2i3de.
i2dea
1idee
+ide2en
id3eis
2idel
idel4ä
-i4demul
-4i3den.
+i2demul
ide4n1o
-iden4se
+iden3te
ide3ran
-iderin8nu
+iderin4f
+iderin4nu
ide1rö
-ider6reg
-2i3des
+id3er4reg
+i3des
ide5sa
ide3so
-ides2p
+ides4p
+2idf
1i2di2o
idi4on
i4diot
2idk
idni3
-id2o
i2dol
2idoo
i2dö
i2dr
id4ro
-id2s1p
-idt4
+id2sp
1i2dy
ie3a2
ie2bä
ie2bl
-ieb3re
ie2bri
ie4b3rü
ieb4sto
+ieb4stre
ie1c
ie2cho
iech3t
@@ -9449,112 +10099,110 @@ ie2far
ie2fau
ie2fäh
iefe2m
+ie3fer
ief3f4
-ief2i
ie2f3l
-ie4fonk
+ie2fonk
ief1r
ie2fro
ie2gl
-ieg5li
+ieg3li
ie3g4n
ie2g3re
ieg2s
-ieg6s3c
+iegs5c
+ieg6sch
ieg4se
ieg4si
-ieg6s1t
+ieg4st
+ieg6ste
ie3her
ie2h1in
ieh3r2
i1ei
+iein3
ie1ind
i2e2l1a
-iela2r
+ie3lam
+ie4la2r
ie2läs
iel3d4
i2ele
-ie4l1e2b
+iel3ebe
iel1ec
+ie2l3eic
iel3eid
ie2lek
i4elen
-ie4lene
-ie4leng
-ieler4e
-ieler6fi
-ieler8geb
-ieler6ke
-ieler6la
-ieler8lebn
-iel4erw
+ie2lene
+ie2leng
+iel2erd
+ieler2e
+ieler4fi
+ieler2g
+ieler6lebn
+iel2erw
ieles2
i2eli
ieli2d
-i1ell
+i1e4ll
ie2lo4b
ie2lop
-ie6lor
+ie4lor
i2els2
iel3sz
ielt2
iem2e
iemis2
i1en
-i3en.
i3ena
-ien1ag
-ien2am
+ien1a2g
ie4nas
+ien3au
i3enä
+i3enbr
i2ene
ien1eb
-i3enec
-i3e2n1e4k
-iener6fo
-ien3er4g
-iener6la
-i3enex
+ie2n1e4k
+iener4fo
+iener4la
i3enf
i3eng4
-ienge4f
-ienge4z
+ienge2f
+ienge2z
i3enh
ie2nid
ie2nim
-ie4n3in
+ie4nin
i3enj
i3enk
-i3enla
-i3enle
i3enm
-ienma3s4
+ienma3s2
i3enn
i3e2no
i3enö
i3enp
i3enr
+ie4ns2
i3ens.
-i3ensa
-i3ensc
-i3ens2e
-ien3s2k
-i3ens2p
-ien6st5er
-ien6stop
-iens4tr
-ienst5rä
-i3en3sz
+ien3sk
+ienst5ade
+ien4st3er
+ien4stop
+ienst3rä
+ien3sz
ien4t3ar
ien3te
-i3enth
+i3enti
ien3tr
-i3enty
i3env
i3enw
i3enz
-ie1o4
-ie2r3a2d
+ie1o2
+ieo4b
+ieo4f
+iera2
+ie2r3ad
ier3al
ier3an
ie2r3ap
@@ -9562,47 +10210,58 @@ ierb4
i3erbun
ier3d
i2ere
-ie4reck
-iere5ins
-ie4r3eis
+ie2reck
+iere3ins
+ie2r3eis
+ie5rek
ie3r2er
+ier3erf
ierer3k
-ie4r3erz
ierf4
ierg4
-i1ergi
+i3ergi
i4eri
+ierin3
ierk4
ierken4
-ierma6ss
+ier3l
+ierma4ss
i1ern
i3ern.
-iern2a
+ier3n2a
i2erni
ie2rö
ier4re.
-ier4s3eh
+ier2s3eh
ier3sei
ier3sta
ier3te
iert2i
ier3z2
2ie3s2
-ie4san
+ie4s3an
+ie4sb
i2esc
i2ese
+ie4sf
+ie4sg
ie4sh
+ie4sj
ie4s3k
+ie4sl
+ie4sm
+ie4sn
ies3o
ie4sof
ie4spu
-iesser6g
ie5sset
iess3ti
-iest6e
-ie4stin
-ießer4g
-ie2t1ag
+iest4e
+ie4sv
+ie4sw
+ie4sz
+ießer2g
+ie4t1a2g
ie2t1ak
ie2tan
ie2t1ap
@@ -9615,20 +10274,21 @@ i4ethe
iet3her
ie2t1ho
ie2thy
-ie4tob
-ie2t1ö2s
+ie2to
+ie2t3ö2s
ie2t3ri
ie2t3ru
iet2se
-i1ett
+i3ett
iet3zw
ieu2e
-ie1un
+i2e1un
ie2w3u
i1e2x
+ie3zo
2if
if1ab
-if3ange
+if1ang
if1ar
i2f3arm
if4at
@@ -9638,148 +10298,164 @@ i2fec
i2f1ef
ife4i
if1ein
-if2e4n
+i2felem
+ifel2s3o
+if2e4n1
+ifens4
i2f1erg
if1erh
if2fa
iffe4s
-if6feste
+if4feste
if2f3l
-if4form
+if2form
if2fro
iff2s
iff4ste
-if3l
+if1ins
+i2f3l
if1lac
if4lä
iflo4
if4los
-i1flü
-if3r
-i1fre
-i2freg
+i3f4lü
+i2f3r
+i3fre
+i4fre.
+i4freg
if4rev
+if4rö
ifrü4
if3sa
if2t3a
if2ted
if2t3ef
-if2t1ei
+if4t1ei
if2te2l
if2tep
-if4terk
+if2terk
ifte4s
-if4t3esc
+if2t3esc
if4th
-if2top
-if2t1r
-ift3ri
-ift1sp
-ifts2t
+if2t1op
+if2t3r
+ift3sp
ift3sz
if2tur
-i1fy
-2i1g
+i3fy
+2ig
i2ganb
+i4g1ano
i2garb
ig1art
iga3s
i2g3att
igd2
-i6gebrau
-i4gefar
-ige4füg
+i4gebrau
+i2gefar
+ige2füg
3i2gel.
-ige5lau
+ige3lau
i2geln
ige4me
-ige4mis
+ige2mis
ige4na
-ige6nene
-ige4nid
+ige4nene
+igener4f
+ige2nid
igen5s
ige2o
ige2pa
ige2ra
igerma3
-ig5erwer
+ig3erwer
ig1erz
-iger4ze
-ige4sel
+ige2sel
i2g1ess
-ige4tra
+ige4steu
+ige4stim
+ige2tra
ige4tre
-ige4woh
+ige2woh
+ig3hu
i2gim
i2gl
ig1lau
+ig1lä
i3gle
+i4g3led
ig3lim
ig4na
+ig5nah
i4gnä
i3g4neu
ig4no
-igo1p
-ig3rad
+igo3p
+i2g3rad
i2g3re
-ig4ren
igro3
i2grou
+igs2a3g
ig4sal
ig3sä
-ig4schr
-ig1s2o
-ig1sp
-ig2spa
+ig2scha
+ig2schr
+ig3s2o
+ig3sp
+ig4spa
ig4sti
-ig4s1to
+ig4s3to
ig2stö
-ig6stra6s
-ig4stur
+ig4stra4s
+ig2stur
+igs4tü
+ig2t3r
2i1h
+i2hans
i2har
+ih1auf
i3he
ihe1e
ih1elt
ihe4n
+ihenk4
ihe3u
ih3m
ih3n
ih3r2
ih2s
-ih3sp
ih3sti
ih1um.
-ih1w
+ih3w
ii2
-ii3a4
+i1ia
i1ie
i3ig
i1im
i3in
-i1i4s
-i2is.
+i1is
+ii4sc
ii3t
i1it.
-i1j
1i2js
-2i1k
-ika2ge
+2ik
ik1aka
ikaken3
i2k1akt
+i2k1alb
+i2k1alt
ik3amt
+i2k1ana
i2k1ang
-i6kantei
-ikanten8n
+i4kantei
+ikanten4n
+i2kanth
ik1art
ik3att
i2k1au
-i3kaz
ik1äh
i2k1än
-i2kär
-4ike
+i2k1är
i2keb
ik1ebe
i2k1ed
@@ -9790,15 +10466,15 @@ ike2n1
ik1en2s
ik1ent
ike2ra
-i2k1e4r2e
+i2k3e4r2e
i2k1er2f
-i5kerfam
+i3kerfam
i2k1er2h
i2ker2l
i2kero
i2ke3ru
+ike4t
i2k1eta
-4iki
i3ki.
ik1i2d
i3kie
@@ -9814,47 +10490,46 @@ i2kne
ik3nu
iko3be
i2k1off
-iko1p2
-ik1or
-iko2ri
-ikot3t
+iko3p2
+ik1o2r
i2köl
ik3rä
ik3re
i2kres
+ik3rin
ik4ris
-i3kro
-ikro3s
+i3kro3
i2krö
ik3sa
+iks2p
ik3s2z
ik3ta
ikt3erk
-ik4t3esk
+ik2t3esk
ik2t3re
ikt2u
i2k1uh
i2kup
-i3kus
i2kü
i1la
i2lab
i2l1ac
i2l1ak
-il1a2ma
+il1a4ma
+il1ana
il1ang
i2l1anm
i2lano
il2anz
-ilan6zer
+ilan4zer
i2larb
il1asp
i2l1au
i3laub
-i3l4aufb
-ilau2s1
+i3l2aufb
+ilau2s
i1lä1
-i2lär
+i2l1är
2ilb
ilb4l
il2c
@@ -9862,88 +10537,89 @@ il5chen
il2da
il2dä
ild3ebe
-il4d3en4t
-il3der
-ild4erp
-ildi2
+il2d3en2t
+ild2erp
ild1o
il2dor
-il2dr
-4ile
+il2d1r
+ild3t
+2ile
il1ec
ileid4
il1ein
il1el
-i2lemb
+i2l1emb
i2l1e2mi
+ile3ni
il1ent
-i4lentl
-i4lents
-i2l1erd
-iler4ei
-i6lereig
+i2lentl
+i2lents
+i2l1er2d
+iler2ei
il1erf
-iler4fo
+iler2fo
i2ler2g
i2l1er2h
-i4ler4kl
+i2ler2kl
il1err
-i4lerri
+i2lerri
+i2l1er2w
i3l2erz
ile4th
il1ex
ilf2
il2f3l
il2f3re
-ilf4s1
+ilf4s3
il2gl
2ilh
2ili
-ili3e4n3
+il4ia
+ilie4n3
iliga2
-ili4g3ab
+ili2g3ab
ilik4
i2l1ind
-i4l3init
+i2l3init
il1ins
i2l1ip
-ili1pf
-il3la
-il4lad
+ili3pf
+il2lad
ill2an
ill4ant
il2lä2
+il4lb
il2leg
ille4ge
-il4lenn
+il2lenn
il3l2er
+il4lm
1illu
+illu3s
il2mak
il2m1ap
il2m1au
ilm1ei
il2min
-il2mor
+il2m1or
2ilo
-il1ob
il2oh
il4on
il2op
i2l1o2r
-i3lou
+i3l2ou
i3lov
il1ox
ils3ent
-ils2to
+ils4to
ilt2
il3th
i1lu
iluf4
i2lum
i2l1ur
-i3lus
-ilü4
-2ilv4
+ilü4b
+2ilv
il2zar
il2zau
ilz3erk
@@ -9951,7 +10627,7 @@ il2zwa
imad2
ima1i
im2al
-i2m3anh
+im3anh
i2mans
i2marc
im3aren
@@ -9959,8 +10635,8 @@ i2m1arm
i2m1art
im4at
ima2tr
-imat5sc
-ima4tur
+imat3sc
+ima2tur
im1aus
i2maut
im3b
@@ -9975,7 +10651,7 @@ i2m1er2f
i2m1er2l
i2m1er2z
i4me3sh
-imes3s
+imes3s4
i2meti
i2mew
imhau2
@@ -9987,8 +10663,7 @@ i2minf
i2m1ins
3immatr
immen1
-imm3ent
-im6menth
+im2m3ent
im2mit
1immo
im4mo2d
@@ -9996,7 +10671,7 @@ im2mö
imni2
2imo
i2m1ob
-i2m1o2p
+i2mop
imo3re
i2mö
1imp
@@ -10018,21 +10693,23 @@ in1ac
i4nack
in1ad
i3nald
-inaler4
-ina6lere
+inaler2
+ina2lin
in2alp
i2n1am
in2an
in3an.
in3ana
in3ann
+i5nar.
+in2ara
i2narb
+inas2
+i4n1asb
in3att
i2n3au2
-inaus1
2inä
i2n1äh
-in2är
in1äs
2ind.
inda2
@@ -10042,59 +10719,78 @@ in2dan
2indä
2inde.
2inden
-ind5erke
+in2dene
+inderer4t
+inder3t
inde3sp
indes4t
1index
+in4dh
ind2i
1indik
in3dö
2indr
ind4ri
ind3se
+ind3sp
+ind4spe
1indus
in3d2ü
2ine
in1ec
i3nee
+ine2en
i2neff
-in4elen
+in2elen
ine2n1
ine3nä
-i4nen4zy
-i5ner.
-i4n3erbi
-in4erha
-i4ner4he
-i3nerk
-i3n3erle
-i6ner6leb
-iner4lö
-i4n3er4tr
+i2nener
+i4nen2zy
+ineo4
+i3ner.
+i2n3erbi
+in2erha
+i2ner2he
+in3erle
+i4ner4leb
+iner2lö
+i2n3er2tr
+iner4trä
i3nes
+inesi2e
in2et
in1eu
ine3un
-in3f4
+i3né
+in3f2
1infek
1infiz
+4inflü
1info
+inf4r
+2infre
2inga
in2g1af
-in2g1ag
+in2g1a2g
in2g1al
in2gam
ing1ar
2ingä
+in3gen.
3ingeni
in3g2er
-in4g3er4w
+in4g3er2w
+2ingi
2in2gl
-in3gla
-ingmas4
-ing4sam
-ings6por
+ingmas2
+2ingr
+2ings
+ing4s3am
+ings4por
+in4gt
+2inhaa
1inhab
+4inhaltu
2inhar
2inhau
2inhe
@@ -10104,23 +10800,23 @@ ini3de
2inie
2inig
inig2a
-ini3k4r
+ini3kr
2inis
ini3se
+inis4t
init2
i3nitz
3inkarn
-1inkas
-in4k3ent
+in2k3ent
ink4er
in2kro
-inks1t
+inks3t
ink4ste
in3k2ü
inma4le
2inn.
+in4nas
inne4n
-in4ner4m
in2neu
in4ni2v
2innl
@@ -10128,9 +10824,10 @@ in2nor
1innta
2ino
in1od
-ino3e4
+ino3e2
in3ols
in1or
+inos4
i3no3t
i2n1ou
i1nö
@@ -10138,24 +10835,32 @@ in1ö2d
2inr
2ins.
ins2am
-in6samt.
+in4samt.
+in3sat
insch2
2inse.
in2seb
2insed
2insen
2insk
+in3skor
+in4sl
+in4sm
+ins2p
3instal
-in4s3tät
+in2s3tät
4inst2e
3instit
-4instra
-in4strü
+2instra
+in2st3ro
+in2strü
1insuf
+in2s3umw
ins3umz
in2sur
in3sz
2inta
+int4e
2inte.
1integ
in3tei
@@ -10173,70 +10878,77 @@ i2n1u
i4nuh
in3unz
inu3t
-4inverm
+2inverm
invil2
i1ny2
in3z2e
-inzel8ler
+inzel4ler
in3z2i
in3z2sc
inz2u
-in3zw
-i1ñ
2i1o
-ioa4
+io3a
+ioa4s
iob2l
io1c
io2d
io3da
io3du
-io3e4
+io3e2
i2of
iof4l
i2oh
-io1i
-io3k6r
+io3k4r
i3ol.
+io3li
i3ols
i3om.
-io3me
i3oms
ion2
i3on.
+ional3a
ion3an
io2n3au
+i2onc
ion3d2
io4nee
+i2onf
+i4oni
i3ono
io2nor
-i3on4s1
-ions3a
-ions3el
+i3o4n4s3
+ion6scl
+ion6sfi
+i2on3t
i2ony
-i2oo
-i2o1p
+i2o1o
+i2op
i3o4pf
+iopi3
i3opt
i2or
i3or.
i3orc
ior2e
iore4n
+i3org
io1r2h
i3orp
i3ors
i3ort
-4ios
i3os.
io3sh
+ios2p
i2ost
ios2u
i2o3sz
io3t
i3ot.
iote3l
+i4oth
iot4r
-i3ots
+i3o4ts
+io4tt
i2ou
i2ov
i3ox
@@ -10246,67 +10958,68 @@ i1ö2k
i1ön
i1ös.
i1ö4st
-i1pa
ip2an
-i1pe
i3ped
+ip4el
i3per
2ipf2
ip5fam
i3pfan
ipfe2
iph2
-2i1pi
-ipi3a
+2ipi
ipi3el
ipi3en
ip4lu
-i2poi
ip2pan
ip3pe
-ipp1f
+ipp3f
ip4pl
-i1pr
+ip4ps
+ip3pu
ip2sa
ip2sei
ip2sp
ip2sta
ip4stü
ipt2a
+ip2ter
+ipt3ers
ipt2i
ipt2u
2ipu
-2i1q
-i1r4a
+2iq
+i1r2a
i3ra.
2i3rad
+ir4al
i3ras
-irat4
+irat2
i1rä
ir1äh
ir2b3l
ir1c
+ir2ch3i
ir2ch1o
-ir4e
+ir2e
i3ree
2irek
ire4na
+ir4er
i3ré
irg2
irg4s
-ir2he
ir2i
-2i5rig
+2irig
2irk
irke4n
-ir4kene
+ir2kene
ir2k3l
-irk4s3c
-ir3k2u
+irk4sc
+irk2u
irli4n
-ir2m1ag
+ir2m1a2g
ir2mak
-irm1au
ir2mä
ir2m1ei
irme4n1
@@ -10317,97 +11030,101 @@ ir4munt
2irn
ir2n3a
ir4nat
+ir4nei
ir2no
i3ro
i1rö
irpla2
ir2rei
irre4l
-ir4reli
+ir2reli
ir2rh
irs2
-ir3sche
-ir4schl
-ir4schm
-ir4sch3r
-ir4sch3w
+ir2schl
+ir2schm
+ir2sch3r
+ir2sch3w
ir3se3
ir3sh
-irt2s1t
+irt2s3t
2iru
ir1u2m
iru2s1
iru3te
i3r2ü
-i1s
i3sac
-isa2m3
+isa4m3
i4samp
i4s1amt
is2ap
isa2r
+is3are
i3sat
-is3att
-i2sau
-is3auf
-isau2g
+is1att
+i2s3au
i2säh
i2s1än
2isb
i2sca
i2sce
-i4schar
+i2schab
+i2schan
+i2schar
i3s2che
i4schef
-i4sch3e4h
+i4sch3e2h
isch3ei
-ische4m
-i6schemi
-i6scher6z
-i4schin
-i5sching
-i2schl
+ische2m
+i4schemi
+i4scher4z
+i2schin
+i3sching
+i2sch3l
i2schm
isch3ma
-i4schna
-i4sch3re
+i2schna
+isch3ob
+isch3re
isch3ru
-i6schüb
-i4schwa
-i6schwir
-i4schwo
-isch3wu
-i4schwü
+i2schüb
+i2schwa
+i4schwir
+i2schwo
+i2sch3wu
+i2schwü
i2scr
2ise
ise3a
ise1e
iseh2a
-ise3hi
-is4eind
-is2el
+ise3h2i
+is2eind
ise3lad
-i6sel6ter
+is4eli
+i4sel4ter
ise2n1
-ise4na
+ise4nal
is2end
-i4senho
+i2senho
isen3s
-ise4r3ei
+is2ep
+ise2r3ei
is1erg
-i2serh
-iser4he
+i2s1erh
+iser2he
i2s1erm
+iser2u
i2s1es2s
-i3s2et
-i4s3etat
+is2et
+i2s3etat
+i3seth
i3s2eu
2isf
-4ish
+2ish
2isi
+i3si.
isi2a
i2s1i2d
-isi4de
isik2
i2sim
i3sin3g4
@@ -10422,140 +11139,169 @@ is1of
i3soh
1i2sol
2is4o2n1
-isonen4
-iso6nend
+iso4nend
isono2
i2sop
is1ort
3isot
i2s1ou
+is1o2v
2isp
-is1pa
+is3pan
i2spar
-is2pat
-is1pe
-is1pic
-is2por
+is3pe
+i4s3pic
i2spro
-is3sa
+i4ss.
+i4s3sa
is4s1ac
is4sau
-is3sc
-iss5chen
+i4ssä
+i4ssb
+i4s3sc
+iss3chen
+i4ssd
is3senk
-isser4f
-issermas8
-is3so
-is3sp
-iss2po
-is2st
+issen4s5tü
+isseri4e
+issermas4
+isser2s
+i4sserse
+i4ssf
+i4ssg
+i4ssh
+i4ssk
+i4ssl
+i4ssm
+i4ssn
+i4s3so
+i4s3sp
+i4ssq
+i4ssr
+i4sss
+i4s2st
is3sta
is4ste
+iss6tel
is3sto
-iss1tr
+iss3tr
is3strä
+is3stric
is3stu
is2su
+i4ssv
+i4ssw
+i4ssy
+i4ssz
+i4st.
i2stab
ist3ac
is4tal
i4stam
ist2an
-i4s3tang
-ist4e
+i2s3tang
+i2st1ap
+is3täu
+ist2e
i4stea
-i4s1tec
-iste4n
+i4stec
+is4te4n
+ister4ras
+is4ti
+ist2id
istin4f
-ist6o
+ist4o
ist4ra
-is3tras3
i2strä
i2stre
-is5tromm
+istri3en
+is3tromm
i2stur
-is1tüm
-i3suf
isu2m
isum3p
+isumpf4
i2sü
2isy
i1ß
-ißer4s
+ißer2s
iß3ersc
-i1ta
+i2ßerse
it1ab.
it1abs
-i3t2ag
-ital1a
-ital5l
+ital3a
+ital3l
it1alt
-it1am
+it1a4m
ita3ne
-it1ang
it3anr
+ita2po
it1app
+itar5b
it1a2re
it1art
i3tat
it1au
i3tauc
-i2tauf
i2taut
-4i1tä
+2itä
it1änd
i2t1äs
ität2
-i1te
it1eff
+it1e2he
i2t1ei
-it2eic
-i4teig
-i4tein
-i4teis
+i4teic
2itel
ite4l1a
-i4telek
+i2telek
it1emi
i2temp
ite2n
i3ten.
-i4tents
+itens4
+i2tents
i2tepo
-i6tereig
-i4t3er4fo
-iterin6d
-iter6klä
+i2t3er2fo
+iterin4d
+i4ter4klä
it2erö
-i8t7ersche
+i4tersche
i2t1es2k
+ite3sp
i2t1ex
i3text
+2i2th
+i4th.
+i4thä
i3thr
-i1ti
+i4ths
+i4thü
+i4thy
+1itia
i3tic
i2t1id
i3tig
1itii
-it1in1
+iti2kr
+it1in
i3tis
i4tiso
iti3sp
i4tiss
i3tiv
iti2v5a
-it5le
+itiver3f
+it3le
itmen2
-4i1to
+2ito
i3to.
it1ob
i3toc
-ito3d
i2t1of
ito2p
+it1orc
it2os
-i1tö
-4i1tr
+2itr
i2t3rad
i3tradi
it3raf
@@ -10563,84 +11309,83 @@ it3ras
it3rau
it3räu
it3re
+i4tren
it4ret
i3trie
it3rob
it3rom
i2t3run
-i2t3rut
+it3rut
2its
it2sa
-its1ag
+its1a2g
it2s1e
-it4se2h
+itse2h
its3e2r1
it4sh
+it4sm
its1or
-it3spen
it4stec
it4s3tem
-it4sten
it4s3tes
-it6stra6s
+it4stra4s
+its3trau
+it2sur
2itt
+itt3ac
it2teb
it4temp
it3ter
-itt5erfo
+itt3erfo
itt3hä
it2tob
it2top
it2tri
-itt3ric
-itt6schi
-itt4se4h
-itt4sei
-itt4sor
-itt4sti
-i1tu
+itt4schi
+itt2se2h
+itt2sei
+itt2sp
+itt2sti
+itt4sz
it1uh
it1ums
it2ung
i2tuns
-ituran4
+ituran2
it1urg
i3tus
itut4
-i1tü
-4ity1
ityl2
2itz
-it2zec
-itz2er
itz3erg
-it6zergr
-it4z3erl
+itz3erl
+itz2erw
it2zö
-it2z1w
-2i3u2
-i4u3l
-ium3
-iuma2
+it2z3w
+2i1u2
+i2u3l
+i3um3
+iuma4
+iump2
ium4se
-iun2
-iungs3
-i4up
-iu4r
-ius1t
-i1ü4
-2i1v
+i3un2
+i2up
+i3us
+ius3t
+i1ü
+iü4be
+2iv
i2v1ad
+i2v1a2g
i2v1ak
i2v1am
iv1an
+iv4at
i2v1ä
i2veb
i2v1ef
iv1ei
iv1elt
-ive4n
-iv1ene
i2v1ent
i2v1ep
ive3re
@@ -10659,25 +11404,27 @@ i2v1r
i2vun
i2v1ur
i2vü
-2i1w
+2iw
+iwur2
2i1x
i2xa
ix2em
ixt2
i1y
-4i1z
+2iz
iz1a
iz2ac
i2zag
i2zan
i2zap
+iz2arr
i3z2as
+i2zat
i2zau
i2zä
i3ze
iz2ei
-izei3c
-izeit3s4
+izeits2
i2zele
ize2n
i4zener
@@ -10686,32 +11433,35 @@ iz1erg
i4z1erl
izid3
iz1ir
-izo2f
+izi4th
+izo4f
i2zö
i2zuna
-i2z1w
-i3z2wi
-í1l
+i2z3w
+i3z4wi
+í1
+ï1
+1j
j2a
-jab4
+jab4r
jah4r3ei
jahr4s
ja3l
jal2a
+ja4lt
ja3ne
-jani1
jani3t4
-ja5ru
jas2o
jat2
-2j1d4
+2jd2
jda3
+jd4an
je2a
jean2s
je2g
jek2t3a
-jek4ter
-jek4tin
+jek2ter
+jek2tin
jekt3o2
jektor4
jek2t3r
@@ -10719,15 +11469,18 @@ je3na
je2p
je3r
jer2e
+je4rr
+je4rs
je2t1a
+je4t1e
je4t3h
je2tin
-je4tor
+je2tor
je2t3r
jet3t
je2t1u2
ji2v
-2j1m
+2jm
joa3
jo2b1
job3r
@@ -10739,28 +11492,28 @@ jo2p3
jo1r2a
jor3d2
jo2sc
-jost2
3jou
jou2l
-2j1t
-jty1
+j2s
+2jt
j2u
ju2b3l
jude2
-jugen6
+jugen4
jugend3
-ju1i
ju2k
jul2i
-jung5s2
+jung5s4
ju3ni
ju3r
jur4a
jur2o
-ju3t2e1
-2j1v
-1ka
-3ka.
+ju4rt
+ju3t2e3
+jutel2
+2jv
+1k
+ka2ans
ka3ar
2k1abb
kab2bl
@@ -10771,7 +11524,8 @@ kab2bl
2kabh
2kabn
2k3a2bo
-2k1abs
+2kabr
+2k1a4bs
2k1abt
2kabw
2kabz
@@ -10779,27 +11533,24 @@ ka1c
kade2r
2k1adm
2k3a2dr
-3kadu
2kadv
ka3e
-ka1f4l
-ka1fr
+ka3f4l
+ka3fr
kaf3t2
-kag2
-2k1age
-3kah
-ka1ho
+kag2a
ka1in
kaken2
-ka1kl
+ka3kl
+kak6lan
2k1akt.
-2kala.
+4kala.
kala3b
ka2l1a2d
ka2lan
-kal3d
+ka4l3d
ka4l1eh
-ka4lens
+ka2lens
kal3eri
3k2alk
kal2k1a
@@ -10809,16 +11560,18 @@ kal3l
kall2i
kallö3
2k1allt
+ka2l1on
ka2lop
ka2l1os
kals2
-kal4tex
+kal2tex
kal4th
ka2lu
+ka4mat
+kamp4f3en
k2amt
-3kana
kan4al
-ka4n1a2s
+ka4n1a4s
ka2nau
2kanb
kan3d2
@@ -10833,98 +11586,104 @@ kank4
2k1anor
2k1ans
k2ans.
-kan4tar
-6k5antenn
-2k1anth
+4k3antenn
ka3nu
kan2um
2kanw
2k1anzu
2kanzü
-ka2o1
-3kape
-ka3po
+ka2o3
+ka3pr
3kara
2karbe
2karc
k2ard
kar3d2a
-k1area
+3kare
+4k1area
+kar3ent
k2arg
ka3r2i
kari3es
k2ark
2k1arm
-kar2pf
+kar4pf
k2ars
k2ar3ta
k1arti
-4kartik
-karu2
+2kartik
+karu4
k2arw
3k2asc
-kas2e
-kase1i
+kas2e1i
kasi1
kas2o
-ka2sp
-kas2t
+ka4s3p
+kas4t
2k1ast.
ka3sta
ka4ster
3kasu
ka3sz
+ka2tab
ka2tan
3kateg
k3atel
+kate2n
ka3t2h
ka2t3r
kat3se
-2katt4
+katt4
+ka4ue
kau4fer
-kau2f1o
-kauf6s5ag
-kauf4sp
-kauf8s7tem
-kauf6sti
+kau4f1o
+kauf4s3ag
+kauf2sp
+kauf4s5tem
+kauf4sti
k2aus.
2k1auss
2kausw
kau3t2
2kauto
ka3ve
-2kaz
-1kä
+3kaz
käl3
-k1ä2mi
+k1ä4mi4
kär2
2k1ärg
-kä2s5c
+kä2s3c
+käs5ch
käse3
kä3th
-4k3b4
-kbe1
+2kb2
+k3be1
kbo4n
+kb4ri
kby2
-2k3c
-2k3d4
+2k1c
+k3ch
+2kd2
+k3da
+kd4rö
ke2ben
2k1ec
ke2di
2k1eff
kefi2
kege2
+kegel3e
ke2gl
ke2he.
ke2hen
-kehrer4
+kehls4
kehr2s
kehrs3o
2k1eic
2k1eig
kei2li
2k1ein
-kein4du
+kein2du
kein4e
k1eis
2keise
@@ -10932,7 +11691,7 @@ keit2
ke2l1a
ke3lade
ke3l2ag
-ke4l3am
+kel3am
ke2lä
kelb4
keld4
@@ -10941,7 +11700,7 @@ kel3eis
ke2l1en
ke2l1er
kel3la
-kel7l4e
+kel3l4e
kell2i
ke2l1o2
ke2lö
@@ -10959,66 +11718,71 @@ ke2n1e2b
kenen1
ke4nene
ke4nens
-kener4n
+kener2n
kene4t
-4ken4gag
-k5en6gel.
+2ken2gag
+k3en4gel.
ke2nim
ken3in
-4kenlad
-4kenläd
+2kenlad
+2kenläd
kenn2a
kenn2e
ke2no
k2ensa
-4ken4sem
+2ken2sem
ken3s2i
ken3s2k
ken5s4te
ken3sz
-k3en4te.
-ken6ten.
+k3en2te.
+k3en2ten
4kentf
-2kentg
+4kentg
ken3th
2kentl
2k1ents
2kentw
2kentz
+kenvo2
ke3ny
-k2en3z2
-2ke1o2
+k2enz2
+ke1o2
2kep
ke2pl
k2er.
ke1ra
ke2ran
+ke2ras
ke2rau
ke2r1ä
-ker4ble
+ker2ble
k2erc
4kerd
+k2ere
ke2r1e2b
ke2rec
ke3reig
ker3ein
-4kerfah
-k4erfam
+k3eremi
+2kerfah
+k2erfam
ker2fo
-k3ergeb
+k3er2geb
2kergu
-ke6rin6nu
-kerin6st
-kerin4t
+ke4rin4nu
+kerin4st
+kerin2t
k3erken
k2erko
-k3erlau
-k3er4leb
-k6erlebe
+k3er2lau
+k3er2leb
+k4erlebe
+ker3m
ker2na
ker4nei
-4k3er4neu
-kern5eur
+2k3er2neu
+kern3eur
k1ero
k2e1rod
2keros
@@ -11026,16 +11790,17 @@ ker4reg
k2ers.
2kersa
kert2i
-ker6werb
+ker4werb
kerz2
k1erz.
-ker4zeu
+ker2zeu
2k1er2zi
k2es.
ke2s3a
k2esc
k1ese
ke2sel
+kes3pa
kes2sa
ke2t1a
ket2ag
@@ -11047,54 +11812,60 @@ ket3ha
ket3s
ketta4s
kett1h
-ke2tu
-keu6schl
+2ke2tu
+keu4schl
2k1e2va
2k1e2x
-4k3f4
-2k3g2
+2kf2
+kflei2
+kf4lö
+k3fu
+2kg2
kga4s1
kge3s2
-2k1h4
+k3go
+2k1h2
k3he
-kho3m
k3hu
ki1a
ki2ad
ki2ag
-ki3ak
+ki3a4k
ki3a2r
ki1ch
ki3dr
k2ids
2kidy
ki2el
-kie4lei
+kie2lei
kiel3o
2kiern
kier2s
kie4sa
kie4z
-ki1f4l
-ki1f4r
-ki3k4
+2kif
+ki3f4l
+ki3f4r
+ki3k
+kik4l
2ki3l2a
2kilä
2kim
3kin.
ki2nä
-4kindex
+2kindex
2k1indi
2k1indu
2k1inf
k2ing
kin2ga
+kin4g3ent
king3s
2kinh
k2ini3
kinik2
-k2inn
ki3n4o
+kinot4
kin3s
2k1inse
k1inst
@@ -11104,18 +11875,23 @@ kio4s
3kir
2k1i2so
kis2p
-kis5s
+kiss4
+kis5st
kist2
kiv2
kive4
2kiz
-2k3j
-2k1k4
+2kj
+k3jo
+2kk2
+k3ka
kkab4
-kl4
-4kl.
+kk4ne
+kl2
+2kl.
4kla.
2k1lac
+k3lamp
klan2
2kland
klan3du
@@ -11130,9 +11906,11 @@ k2le
kle2br
k3leg
2kleh
+kl4ei
klei2e
k3leit
k3lem.
+3klemp
kle2o
2k3ler
kle2ra
@@ -11146,6 +11924,7 @@ k2lif
k2lin
k3lin.
3k4lina
+2k3lind
k4link
k2lip
k2lir
@@ -11157,23 +11936,22 @@ klit2s
2klok
3k4lop
k3lor
-klos2
+klos4
klo3sse
-klost6
+klost4
2klöc
2klöf
k2löst
k4löt
k1lu
-klu4b
+k4lu4b
k2lud
k2lug
k2lum
2klux
2k1lüc
2kly
-2k1m2
-4kma
+2km2
kma2la
kmas2
kma3sse
@@ -11183,6 +11961,9 @@ k4nac
2k3nad
2knah
2k3nam
+2k3nar
+kn4at
+2knav
2k3näp
k3ne
k4nec
@@ -11190,29 +11971,31 @@ kne1e
2knes
kne3tu
2knetz
-2k5neu
4kney
-kni4e
+kni2e
2k3niv
kno2b3l
k4nol
2knorm
+kno4s
2knov
2k3num
-1ko
-ko5ad
+ko3a
ko2al
kobal2
2kobj
kob4s
+koe2
kof3f2
koffe3i
kohl2e
kohle3i
koh3lu
+ko2kl
ko3l2a
ko3le
kol2k3
+kol2lan
3kom
komer3
4komn
@@ -11221,27 +12004,34 @@ k2on
kone2
ko2nem
kon3s4
-kont6e
+kont4e
ko2nu
ko3on
2kop.
-ko1pe
+ko2pal
+ko3pat
+ko3pe
2koper
+ko4pf
kopfa2
-kop4fen
-kop6f5err
-ko3pte
+kop2fen
+kop4f3err
+3kopp
ko3r2a
kor2ba
kor2bl
kor2br
2k1orc
-korder4
-kor6derg
-ko2rel
+korder2
+kor4derg
+ko3re
+ko4rel
2k1org
+ko3rin
kor2k1a
+kor4kr
kor3m
+k1orna
kor4nac
kor2n3ä
kor4no2
@@ -11249,24 +12039,27 @@ kor4no2
k2os
k4os.
ko4sk
-ko2s1p
+ko2sp
3k4ost
ko2ter
-ko3ti
+ko3t2i
+koti4n
+koti6ne
kot4r
-kot1s2
-kot4tak
+kot3s2
+kot2tak
k1ou
ko3un
3kow
ko2we
2k1ox
-1kö
köde2
k2öf
k1öl
-2k1p2
-2k3q
+2kp2
+k3pf
+2kq
+k3qu
k2r2
2k3rad
2k3rah
@@ -11279,13 +12072,15 @@ k4raw
k4raz
k4räc
2kräd
+k4räf
+k4räm
k4rän
2k3räum
-2k5re.
+2kre.
2k3reak
2k3real
k4reb
-2k3rec
+4k3rec
2kred.
2k3rede
2kredn
@@ -11297,8 +12092,10 @@ kre1i2e4
kreier4
k3reif
2k3reih
-2kreim
-krei6sei
+2k3reim
+krei4sei
+krei2s3i
+2krel
k3ren
2kresu
2k3rh
@@ -11307,7 +12104,9 @@ k3ren
2k3ries
2krip
k3risi
-krob4
+k4roa
+kroa4d
+kro3b4
k4roch
4k3roh
k4rok
@@ -11315,21 +12114,22 @@ k4ron
k4rop
kro4ss
2krot
-3kroth
+krot4r
k3rou
2kröh
2kruf
2k3run
-4k1s
+2ks
ks3a2b
k3sac
-ksa2k
+ksa4k
k4s1amt
k2san
ks3a2r
ksa4s
k2sau
-ksau2f
+ksau4e
+ksau4f
k2sav
k2säh
k3s2c
@@ -11340,7 +12140,7 @@ k3s2ed
ks1ei
ks2eid
ks2eif
-k4seind
+k2seind
kse2le
k2s1eng
k2s1ent
@@ -11352,62 +12152,64 @@ k2serk
k2serl
k2sers
k2serw
-k2s1e2v
+k2s1ev
k2sex
k4s1i2d
ks2im
k2s1in
k4s1is
k3s2ke
+ks3ket
ks3kl
-kso2
+ks1o2
+kso4f
ks4on
k2sop
-k2s1or
+k2sor
k2sö
-ks1pa
k2spal
k3s2pat
k2spä
k3spe
-ks2pel
-ks2pen
+ks4pel
k2sph
ks2por
ks2pul
-ks5s2
+ks3s
+kss4t
+ks5ste
kst2
-k2stal
-k4s3tanz
+k4st.
+kst4a
+k2s3tal
+k2s3tanz
kstat4
ks3tat.
k3stäl
-ks4tel
-ks1tie
-k4stier
-k2s1tis
+ks3th
+ks3tie
+k2stier
+k2s3tis
k2stit
-k2s1tor
-k4strop
+k2s3tor
+k2strop
k2stuc
-k2stum
-k2s1tur
+k2s3tum
+k2s3tur
k2stüt
k2s1u
-k3sul
ks2zen
-4k1t
+2kt
kt1abr
kt1abs
k2t1ad
-k3tag
kt1akt
k3tal
kt1am
k2t1an
kt2and
k2t1a2r
-kt3a4re
+kta4re
kta3ri
k2t1au
kt3aug
@@ -11421,17 +12223,21 @@ kte4n1
k2t1ent
k4tentl
kten3z
+kte4pi
kte2ra
kte3ran
kt4ere
-k4t3erfo
kt1erg
k2t1erh
+kter3m
k2terö
kte3ru
ktes2
+kte3sta
+k2t1eti
k2tex
k2t1h
+k3ther
k2t1i2d
kti2me
kt3ind
@@ -11442,34 +12248,35 @@ k2tint
kti2s1e
k2tiso
kti2st
-kti4ter
+kti2ter
kto3b
k2t1of
-kto5ren.
+kto3ren.
+k4t3ram
k3t4ran
kt3ras
k2t3rau
-ktro3me
+k4tref
+ktro5me
kt3run
kt3rü
-kt1s
kt3s4a
kt3sä
-kt3se
kts2el
ktsen1
kt3si
kts1o
kt2sor
+kts2p
kt3s2z
ktt2
kt1ums
k2tuns
-kt3z2
+kt3z
+ktz4w
ku2al
ku1c
kud4r
-3kug
ku2h
2k1uhr
kuh3s
@@ -11480,16 +12287,19 @@ ku3l2i
kul2to
kul2tr
k2um.
+2k1umb
k2um4e
2kumg
2kuml
-kum2sp
+kum2s3p
k2u3n2a
kun3da
kund2e
+kunft4s
+2kunm
kun4s
kunst3
-2kunt
+4kunt
2kunw
4k1up.
kur2bl
@@ -11497,36 +12307,39 @@ ku2rei
kuri2e
kuri4er
2k1urk
+2k1url
ku2ro
kurs1c
-kur2sp
+kur2s3p
kur2st
kur4ste
2k1urt4
kur3tsc
-kusa2r
-ku4schl
+3kus
+kus3a2r
+ku2schl
ku2sp
kus3ses
-2kust
+kust2
kus3ta
ku2su
ku2ß
-2kut.
+4kut.
kut2a
kuto3
-1kü
kü1c
3küne
künf3
3kür
kür2s
-2k3v
-2k1w
-k3wa
-2k3z2
+2kv
+k3ve
+2kw
+2kz2
kze3l
+k3zu
3la.
+laa2
la3ar
l1ab
3l2ab.
@@ -11537,7 +12350,7 @@ l2abä
lab2br
2labd
lab2e
-4la2ben
+2la2ben
4labf
2labg
2labh
@@ -11550,14 +12363,14 @@ l3a2bit
la3b4ra
lab4res
la2bri
-2labs
+2la4bs
la2bus
2labw
2labz
la1ceb
-l4a3che
-lachter8f
-lacks2
+l4ache
+lachter4f
+lacks4
1lad
2l1ad2a
2ladd
@@ -11569,113 +12382,125 @@ la3d2i
l1adop
2l1a2dr
3l2adu
-2laf
-la2fa
-la2f1ei
-la2f1er
+2ladv
+4laf.
+la4f1ei
+la4f1er
laf1r
+4lafs
laf3t4
-la2fu
+la4fu
la2ga
lag3d
+lagen3d
l2ager
-lagerin5
+lagerin3
4lagg
+la2gil
+la2gin
la2gio
lag3l
la4g3n
-lago4
-la2gob
+la2go4
lag3str
2la3ho
3lai
-lai4s1t
+lai4s3t
+2l1akad
lake2
-la2kin
+la4kes
+la4kin
l2akk
-la1k4l
-la2kro
-lak3t2
+la3k4l
+la4kro
+lakt2
2l1al
la2la
-3lala.
+3la5la.
3lali
4lalt
-l2am.
lami3t
+l4amm
lam2m1a
-lammen8ge
+lammen4ge
1lammf
-la2mor
+la4mor
l2amp
l3ampu
2l1amt
-lamt4s
+lamt2s
la4mun
la2na
l1anal
la3nan
-la4n4at
+4l1a4n4at
la4nau
2la2nä
3l2and
l4and.
-lan2da
+lan2d1a
lan4dam
land3au
l4ande
-lan6derh
-lan6d5erw
-lan6d5erz
-lan6d5inn
+lan4derh
+lan4d3erw
+lan4d3erz
+lan4d3inn
l4an2d3r
lan3dri
lan3erd
-laner4f
+laner2f
2lanf
-lan4gan
-lan6g5esc
-lang3s2
-2lanha
+lan2gan
+2l3angel
+lan4g3esc
+lang3s4
l2anhe
3lan2i
+4lanim
4lanl
2l1ann
l1ano
la2nof
2l1anp
-2lans2
+2lans
l1ansi
-2lantr
+3lansw
2lantw
2lanw
-lan2z1w
+lan4zerg
+lan2z3w
3lao
2l1apf
la2ph
2l1a2po
lap2pl
+la2q
la2r1an
2larc
lar1e2b
la2r1ei
la2rel
-la4rene
+la2rene
larf4
-lar3g
+3lar3g
lar3ini
-4l1a2rom
+lark4l
+2larm
+2l1a2rom
l1art
2lart.
+lar2ter
lart2h
l3arti
lart4r
3laru
l2as.
la2sa
+la4s3aa
la4sam
la4sä
-lasche4
+lasche2
4lasd
la5seb
la4sei
@@ -11684,12 +12509,14 @@ la4s1e2l
la2sin
la4sis
la2so
-2la2sp
+2la4sp
3lasser
l2ast
la4sta
last3an
+last3ar
la4steu
+las4to
la2str
last3ri
las3tro
@@ -11698,8 +12525,8 @@ la2stü
1la2ß3
la3t2e
2l3a4tel
-la5t2i
-2l3atl
+l4at2i
+la5tio
2latm
lat2o
la2tö
@@ -11708,31 +12535,34 @@ lat4ri
lat2s
lat3st
2lat4ta
-lat4tex
-lat4t3in
+lat2tex
+lat2t3in
lat2t3r
-latzer4
+lat4tro
+latzer2
1laub.
-lauben6s5
+lauben4s3
lau2b3r
-laub4se
+laub2se
laub4st
+lau4fel
+lau4ferl
lau4fin
2laufn
-lau2fo
-lau4fri
+lau4fo
1laug
lau3gl
+lau3i
3laun
4laun.
la4us
3l2aus.
2l1ausb
-lau6scha
+lau4scha
2lausd
2l1ausf
2lausg
-2lausl
+2l1ausl
2lausr
2l1auss
2lausz
@@ -11742,18 +12572,24 @@ la3va
lave4n
1law
lawa4
-1l2ax
-la4xel
+l2ax
+la2xel
l2ay
lä1c
+1lähm
2l1ähn
+lä2i
1länd
l1äpf
2läq
+l2är.
lär2ma
l1ärme
-2lärz
-lä2s5c
+2l1ärz
+lä2s3c
+läs5ch
+läs6chc
+2läse
lä4s3s
2lät
2läub
@@ -11763,20 +12599,22 @@ lä4s3s
2läug
2läx
1là
-4l1b
+2lb
l3bac
l2bant
lb3a2ri
-lbau1c
+lbau1
lb1ärm
-lbb4
+lbb2
+lbb4r
lb2ei
-l4b3eink
-l4b3eise
-lbe4ral
-lberin5
-lbe7s
-l4b1e2ta
+lbei4ge.
+l2b3eink
+l2b3eise
+lbe2ral
+lber2ei
+lbe5st
+l2b1e4ta
l2b1id
l2b1ins
lb4lad
@@ -11794,8 +12632,9 @@ lb2s
lb3sa
lb3se
lb3si
+lb3sla
lb3sp
-lbs2t
+lbs4t
lbst3ac
lb4ste
lbst3ei
@@ -11810,19 +12649,19 @@ l3ca
l3che
l4chei
l4chent
-lchermas8
+lchermas4
l3chi
lch3le
lch3li
l3chlo
lch3n
lch3r
-lch3s2
+lch3s4
lch3ü
-lch1w
+lch3w
l3cl
l3co
-4l1d
+2ld
ld3a2b1
ld2ac
ld3ack
@@ -11832,6 +12671,7 @@ l2d1ah
lda2i
l2d1ak
l2d1al
+ld1ams
l2d3a4n
ld1arm
ld1ass
@@ -11843,28 +12683,25 @@ ld1äs
ld1ät
ldbus2
l3de.
-lde4ben
+lde2ben
l2dei
-ldein7
+ldein5
l2d1elf
l2d1e2mi
l2d1ems
-lde4na
-lden5erg
-l4dentl
+lden3erg
+l2dentl
l3der.
-l4d3er4fa
-l6der6geb
+l4d3er2fa
+l4der4geb
ld1erh
-l4der4he
-l3d2erl
-l6derlas
-l6derlaß
-l3d2ern
+l2der2he
+ld2erl
+ld2ern
l2d1er2p
lder4tr
-lde3sa
-lde4sel
+lde5sa
+lde2sel
l2d1es2s
l2dex
ldi2c
@@ -11877,37 +12714,46 @@ l2dop
ldo2r
l2d1ori
ld2os
-ld2ö2
+ld2ö
ld3r
ld4ram
-l2dran
+ld1ran
+ld1rä
l2dre
ld5rie
l3d4ris
+ld1rol
ld4ru
+ld5rub
+ld5rut
l2drüc
ld3sa
+lds2an
ld3ska
-ldt4
-ld3th
-ldt5s
+lds2p
+lds4t
+ldt4r
ld3tu
l2d1ul
l2d1um
1le
le2ad
+le2an.
le3ar
-le2as
3le3ba
-leben4s3
+leben2s3
+le3ber
le2bl
3lebr
le2b3re
+lebs2
2lec
lech1a
le2chi
-lech7t6e
+lech5t4e
+le2dit
le2dr
+le1en
le2er
lee4ret
le3f2a
@@ -11916,64 +12762,66 @@ lef4o
le2g1ab
leg1as
le2gä
+legi3en
le2gl
-3leg4r
+leg4r
+legs4
3leh
4lehe.
leh3r2e
4lehs
4leht
-lei4ble
l2eid
lei3ere
-lei4fan
-lei4fei
-leifer6g
+lei2fan
+lei2fei
+lei2fi
2l1eig
lei3gl
3leih
-lei4hau
+lei2hau
lei3l2
leim3p
3l2ein.
leinbu4
-leinbus5
-3l2eind
-lein4du
+leinbus3
+lein2du
l4eine
-lei6nerb
+lei4nerb
le2inf
le2ini
2leink
l1einn
+leins2
l3einsa
2leint
l2einu
le2is
-leisch5a
-lei8schei
-lei6scho
-lei6sern
+leisch3a
+lei4schei
+lei4scho
+lei4schr
+lei4sern
l1eisf
-lei6ss5er
+lei4ss3er
leis3st
-lei4str
-lei4ßer
+lei2ßer
l2eit
lei2ta
+leit5ersc
lei2to
leit3s2
+leits4t
+2leiw
3leko
2lektr
2lekz
3l2ela
le2le
-le3lei
2lelek
-6leleme
+4leleme
le3len
leler2
-leler4s
le3les
2lelf.
2l1elfe
@@ -11987,50 +12835,61 @@ le2m1ei
3lemet
lem1o2
le2mor
-2lemp
+4lemp
le2mu
le4mun
l4en.
-len1a
+len1a2
len3ab
-le4na2d
+le4nad
le4n3an
le4n3a4t
le2nä
+2lendet
+4lendl
l1endp
4lendun
l4endur
le2n1ed
+lenen3er
4lenerg
-le4neur
-4leneuv
-len4gag
-len4kau
-len4k3lo
-len4klu
+le2ners
+le2neur
+2leneuv
+len2gag
+len2kau
+len2k3lo
+len2klu
l1enni
-len6sein
-4len4sem
-len6serk
+le2no
+len4sein
+2len2sem
+len4serk
len3ska
len3sz
2lentg
2l1entk
-4lentla
+2lentla
2lentn
-4l3en4tro
-4l3entw
+l3entro
+2lentrü
+2l3entw
lent4wä
-5lentwet
+3lentwet
2lentz
+le4nz
+lenz2a
+len4z3eig
2lenzy
-leo2f
+leo4f
le1o4s
2lep
-3lepa
+l1epe
+le2pen
3lepf
4l1e2pi
4lepoc
+le2pos
lep4pi
3lepr
l2er.
@@ -12042,60 +12901,65 @@ le2rau
le2r1ä
le2r1e2b
ler2ec
-l3ereig
-le4r3ei4m
-le4r3eis
+2lereig
+le2r3ei2m
+le2r3eis
le2rel
-le4reng
-le4rerg
-le4rers
-le2re2t
-4l3erfas
+le2reng
+le2rerg
+le2rers
+le2re4t
+2l3erfas
2l1erfo
l2erfr
-l2erfü
+l2erfüh
l1erg
l2erga
-l4ergef
+2lergeb
+l2ergef
3lergeh
-6lergen.
-l4erger
-l4erges
-3l4ergew
+4lergen.
+l2erger
+l2erges
+3l2ergew
2lergi
l2ergl
l2ergr
lergro3
-4ler4heb
-4lerhol
-lerin4s
+2ler2heb
+2lerhol
+leri2e
+lerin2s
lerk2
-l2erka
-2lerke
+3l2erka
l1erkl
-4lerklä
-l4erkle
-l2erko
+l2erkle
+3l2erko
ler3kr
-ler3l
-5l6erlebe
-3l4erlei
+3l2erkre
+3l4erlebe
+3l2erlei
2lermä
+2l3ermüd
3lerna
-ler4nal
-ler4nar
-3l4erne
+ler2nal
+ler2nar
+l4erne
ler4nei
2l1erö
3l2erra
-ler4ric
+ler2ric
+l2errü
l4ers.
l1ersa
-ler4sto
-lert2
+2lersat
+3l4ersl
+ler2sto
+lert4
+ler4trä
le2rup
l4erwa
-ler4wer
+ler2wer
2ler2wo
2l1erz
ler2zä
@@ -12107,15 +12971,16 @@ les2e
le3seb
lese1i
2l1esel
-le5s4h
+l4e3s4h
+le5she
lesi1
le3s2k
les4ki
le3so
le2spo
-lest6
+lest4
leste3
-lester6i
+lester4i
3lesu
4lesw
2lesy
@@ -12126,16 +12991,18 @@ l1e2th
le3tha
2lethi
let2i
-letsche6
+letsche4
let2to2
lett1r
-lett1s4
+letts2
le2u
4leue
-3le3u2f
+3le3u4f
+le4uk
2l1eul
le3unt
-3leut
+le4ur
+3l2eut
l1e2vol
2lex
3lexd
@@ -12143,7 +13010,8 @@ l1e2vol
le2xis
3ley
1lé
-2l1f
+2lf
+l3fac
l3fah
lf4at
lfäs3
@@ -12152,13 +13020,13 @@ lfe1e
lf3einh
l2feis
lf2en
-l4ferei
-lfe4rel
+l2ferei
+lfe2rel
lf1erl
-l3fi
-l3f4lä
+l3fjo
+lf4lä
lf3led
-lflo7sses
+lflo5sses
lf4lö
l3f4lu
lf3ram
@@ -12166,43 +13034,50 @@ lf3res
lf4ru
lf4rü
lf2spe
-lf2s1ti
+lf2s3ti
lf2su
lfun2
lfur1
-2l1g
+2lg
+lgab4
l3gas
lga3t
-lgen2a
lgene2
lgeräu3
l2geti
-l3g2i
+lg2i
+l3gle
lg2lö
l3go
lgoa3
-lg4p
-l3gra
+lg2p
+l3g4ra
lg3re
l3gro
lgro3s
lg2s
+lg3sch
lg4s3t
-4l3h2
-5lhi.
+2l1h2
+l3he
+3lhi.
+l3ho
+l3hu
1li
-l4i1a
+li1a
lia2b
li2ad
-li2am.
-li2ams
+li4am.
lian2g
li2ast
-3lib4
+3lib
libi3
+lib4r
li1c
-lich4ta
-lich4to
+lich2ta
+lich5ters
+licht5ersc
+lich2to
4lick
li2cl
li3d2a
@@ -12214,29 +13089,34 @@ lie2br
li3efl
lie4n1a2
li3ene
+li3ens
lien3t
li2er
-lie4rei
+lie2rei
li3ern
lie4s3c
lie4sta
-lif4fes
+lif2fes
lif2fo
lif3ti
3lig
-li4g3ers
+li2g3ers
+lig1l
lig4n
-ligs2
+ligs4
li3ker
+lik2i
li3k2o
lik2sp
lik4tau
-lik4ter
+lik2ter
+lik4th
lik2ti
lik2t1o2
lik2u
li3l
lil2a
+li4ll
li3m2a
lima1c
lima3t4
@@ -12245,75 +13125,81 @@ lima3t4
3limo
2limp
lin2a
+lin3all
li3nar
-2lindi
+4lindi
2l1indu
li2nef
li2neh
li2nep
li5ner
+li6nere
li2nes
2l1inf
+ling3l
+lingst4
2l1inh
-lin1it
2l1inj
-lin4kan
-lin4kar
-link2s
+lin2kan
+lin2kar
+link2s3
+lino2
li2nol
l2insa
-4linsel
+2linsel
2linsp
2linst
2linsu
2linsz
2l1int
+l2intu
li3n2u
2l1inv
2linz
li2o
li4om
lion5s
-li3o2st
3lipf
3lipt
3lis.
li3s2a
li3schm
-li4schu
+li2schu
lis2h
li3shi
3lisk
2l1isl
2l1i2so
3lison
-li2sp
+li2s2p
liss4
2liß
-lit4a
+li2t1a2d
l1i2tal
+lit4an
li3t2ä
-l2i3t2e
+l2it2e
3liter
-li1th
+li3th
li2t3r
-lit1s2
+lits2
lit3se
lit3sz
li4tun
li2tur
litz4er
3liu
-liv2e
li2vea
+live4n
li2ves
livi3e
li3vr
-2lixi
+4lixi
li4z3ä
lizei3
-4l3j
-2l1k
+2lj
+l3ja
+2lk
l3kale
lk1alp
l3k2an
@@ -12327,22 +13213,25 @@ lk3lad
l3k4las
lk3lic
l3k4lu
-lk2men
lk4ne
lk5ner
lk3nu
-lko2f
+lko4f
lk1ofe
lkor2b
lk3roc
lk2s1
lk3sän
+lk4sb
lk4set
lk3si
+lk4sm
lk4spe
+lks3t
+lks4te
lkt2
lk2ü
-4l1l
+2l1l
lla2be
l2labk
l2labt
@@ -12352,44 +13241,53 @@ lla2de
ll1aff
lla3gl
l2l1am
-lla2ma
+lla4ma
ll2ami
ll2anb
-lla4ner
-l4lani
+lla2ner
+lla4ni
l3lans.
-ll4anwa
+l3lant.
ll1anz
-l4l3appl
+l2l3appl
ll1arm
-lla6tern
+ll1a4sc
+lla4tern
l2lath
+l2latl
l4latm
-l2l3att
+l2l1att
l2lau
ll3aufg
ll3aufk
-ll1au2s1
+llau4m
+ll1au2s
l4lausf
l2la2w
+ll3axt
+ll4äh
l2l1äm
+ll1är
l3läs
l2läu
-llb4
+llb2
+llb4l
llch4
-ll3d4
+ll3d
+lld4r
l2le2b
-ll5ebene
+ll3ebene
l3lec
ll1ech
lle3er
l2l1ef
+l3legr
lle2gu
lle2he
l2leib
ll1eic
ll1eim
-l4l3eise
+l2l3eise
lle2la
lle2m
l2l1emi
@@ -12398,54 +13296,58 @@ lle4na
ll3endl
llen3dr
ll3endu
-llen6dun
+llen4dun
+lle4nens
l4lentf
-l4lents
+l2lents
l3lep
l3ler.
lle2ra
-l3lere
-l6ler6eig
-ller4fo
-ller6geb
-l8lergene
-l4lergo
+ller4eig
+l4lerfas
+ller2fo
+ller4geb
+l4lergene
+l2lergo
ll3erho
-l4l3ermi
-l4l3ernt
+ll3erkr
+ll3ermi
+ller4müd
+l2l3ernt
ll3ertr
-ll6erwei
+ll4erwei
ll2es
-l3les.
l2le2se
lle4th
l2leuc
l3leur.
ll1exe
-llg4
+llg2
l2lieb
l2lieg
-lli4gan
+lli2gan
l3lik
lli4la
l2l1ind
l4linf
+l2l1ink
ll1ins
-llin6sen
-l2lipo
-ll3k4
-ll5m2
+llin4sen
+l2li2po
+ll3k
+ll3m2
+ll5mit
ll3n2
ll1ob
l2lobe
l2lo2d4
-l2l1o2f
+l2l1o4f
llo2ge
ll3ol
l2lope
ll1opf
ll1or
-l6lorb
+l4lorb
llor2g
l2lo2ri
llo2te
@@ -12454,46 +13356,47 @@ l3low
ll1ox
llö2g
l3löh
-ll2säu
ll2s1es
ll3ska
ll2spr
-ll4stor
+ll2stor
ll3t
llt2e
llt2i
llti2m
llt4r
-llts2
+ll4ts2
llu2d
l2lu2me
l3lung
-l2lu2p
+l2lu4p
ll1ur
-llust6
+llust4
l3lut
l2lüc
-llü2d
+llü4d
l2lü2g
l3ly
ll3z2
-4l1m
-l2m3a2b
+llz4w
+2lm
+l3ma.
+lm3a2b
l2m1ad
lm1a2ge
lm1aka
-l2m1a2m
+l2m1a4m
l3mana
lm1apf
lm1art
-lm3att
+lm1att
lmä2s
lm1ä4st
lm1c
lmd2
-lm3e4dit
+lm3e2dit
l2m1ef
-l2ment
+l2m1ent
l2m1e2p
lmer2
l2m1erf
@@ -12509,13 +13412,14 @@ lm1orc
lm3p2
lmpf4
lm3s2k
-lms2t
+lms4t
lm3str
lm3s2z
-lm3t4
+lm3t
+lmt4r
l2mum
l4munt
-4ln
+2ln
ln2ab
lna2r
ln3are
@@ -12526,7 +13430,6 @@ lnus2
l1nü
l1ny
1lo
-lo4ak
3lob.
l2oba
3lobb
@@ -12535,40 +13438,43 @@ lobe4s
l1o2bl
l2obr
lob4ri
-lo4chel
+lo2chel
+lodi4e
3lodr
lo3dri
l1ofe
-lo2fen
+lo3fj
lo4gh
lo2gl
lo2gor
lo2gre
-lo3ha
+lo2ha
lo3h2e
4l1ohr
+loi4d
loi4r
3lok
4l3okk
lo2k3r
-5loks
+l4olä
l4ole
2l3o2ly
lomä3
-lo2min
+lo4mel
+lo4min
lo2ner
lo4nin
lo2n1o
-lo2o
-l1ope
+lo2o3
2lopf
lop2p1a
lop2pr
2lopt
+lo2rak
lor3am
lor2an
lo4rä
-5lorb
+3lorb
2l1orc
2l1ord
lo3r2en
@@ -12579,15 +13485,15 @@ l2os.
lo4sa
3lose
lo4ske
-lo2spe
-lo2s1pr
-los3ta
+lo4spe
+lo2s3pr
lo4stel
lo4steu
lo2s3to
lo2s3t4r
lo2ßu
lo2t1a
+lo2th
lo3tha
loti4o
lots2
@@ -12598,41 +13504,48 @@ lo2ve
lö2b3
2löck
2löd
-lö2f
-2l3öfe
-4lög
+2l3ö4fe
+2lög
2l1öhr
2lök
2l1öl
2löp
3lösc
-4löß
-4löz
-2l1p
+2löß
+lö4ta
+2lp
lp2ar
lpar2k1
-l4p1är
-lp2f
-lph4
+l2p1är
+l3p2f
+lp4fu
+lph2
l3phä
l2phir
lp1ho
l3phr
-lpt4
+lph4t
+lpi4p
+lp4lu
+lp4rä
+lpt4r
l3pu
-2l1q
-2l3r2
+l3pü
+2lq
+2l1r2
lra4ss
lrau2s
+l3re
lrebs2
lro2h
-lrö4
-lrös3
-4l1s
+lrö2
+lrö4s3
+l3ru
+l3rü
+2ls
ls3a2b
-l3sac
-l2sa2d
-ls2al
+ls3acke
+l2s1a2d
l4s1amb
l4samp
l2san
@@ -12641,26 +13554,33 @@ l3sare
ls3a2ri
l3sark
lsau2
+l4s3au.
lsau4m
-lsau4r
+lsau4rer
+ls3au4s
+l2saut
l3s2äm
-lsä6s
+lsä6sse
ls2äug
-ls1äus
+l2s1äus
+lsby4
ls2c
-l4schin
-l4schmü
+l2schin
l2s1e2b
+l3seil
ls2ele
ls1eli
+ls1emb
l2sent
ls1er
+ls2erb
l2serf
l2serg
l2serh
l2serk
l2serl
l2sers
+lser2u
l2serw
lse2t
ls1eta
@@ -12668,67 +13588,65 @@ ls3ha
l2s1id
l2simp
ls2kal
-l3s4kele
+l3s2kele
l4skla
l4sko
ls2ky
lso4b
l2sop
-l4s3ort.
-l3sos
+l2s3ort.
l3s2öl
-l2spac
-ls2pe
+ls2pa
+l2s3pac
l2s3ph
-l2s1pir
+l4s3pir
+l4spiz
ls2po
-l3spri
ls2pu
-l3spul
-l2spun
-l4s3s2
+l3s4pul
+ls3s2
+l4st.
lst2a
-lstab6
-ls2taf
-l2stas
-l4s3tat.
-l4state
-l3stau
-l4s3täti
+lstab4
+ls3tabl
+l2s3tas
+l2s3tat.
+l2state
+l2s3täti
l4st3erk
l4s3terr
-l2s1tis
+l2s3tis
l2stit
-l4stoch
-ls1tor
-l4stor.
-l4store
-l4stors
-l2s1trü
-l3suf
+l2stoch
+ls3tor
+lstro4
+ls4tru
+l2s3trü
+l2stuc
ls1um
l2s1un
ls2und
ls3unk
-4l1t
+l4szu
+2lt
l3ta.
l2tab
+l3tabl
lt1abs
+lt2a3d
ltag4
lt1am
l3tami
ltampe4
-l3t2an.
+l3tan.
ltan3d
l2t1ap
lt1ara
-ltar8beitn
l3tark
lt1art
-ltar6tik
-l3tartu
+l3tarta
+ltar4tik
lt1au
-l4tauf
lt3aut
lt1äh
ltbau1
@@ -12737,30 +13655,30 @@ lt1eig
lt1ein
lte3mi
l3t2en
-lten6gel
-lten4sp
+lten4gel
+lten2sp
l4tentl
lt3ents
-lte4ral
-lter4fa
+lte2ral
+l2t3er2fa
l3t2erg
-l4terhe
-lter6ken
-lter4ku
-lter4nä
+l2terhe
+lter2ku
+lter2nä
lte2ro
lt2erö
-lter4se
+lter2se
l2t1esk
-l3t2est
lte3sta
lt2et
l3tet.
+lt3g
l2t1h
lt3hag
l3thas
l4t3hei
lthol2
+l3thr
l3t2hu
lt1ide
ltimo4
@@ -12769,16 +13687,15 @@ l3tine
l2tiso
l3t2i3t
l2t1ob
-l2t1o2f
+l2t1o4f
l2tord
l2torg
l2t1o2ri
lto2w
lt1öl
-l3tön
lt1ös
-lt1öt
-ltra3l
+l4t1öt
+ltra3l2
lt3räu
lt3rec
lt3rei
@@ -12786,36 +13703,40 @@ lt3ris
lt1roc
lt3rol
l2t3rö
+lt3rum
l2t3rus
-l4ts
lt2se2l
-lt4s3ort
-lts1pe
-lt1s2ph
+lt2s3ort
+lt3s2ph
lt4stec
lt2sti
+lt2stüt
lt3t
lt1uh
l2t1um
lt2um.
-lturan4
-lturen4
+lturan2
+lturen2
+ltu4r3ent
ltu2ri
lu1an
-4lu2b3
+2lu2b3
luba2
-lub5s2
+lu3be
+lubs2
+lub5sz
lu2dr
lu2ec
lu2es
lu2et
-1lu2f2
-2l1ufe
+1luf2
+2l1u4fe
+lu5fel
2luff
-lu3fo
luft1a
luft3e
-luft3r
+luf4tei
+luf4t3r
lu2g1a
lu2g1e2b
lu2gei
@@ -12825,12 +13746,14 @@ lug3l
lu2go
lu2g3r
lug3se
+lug3sp
+lug3sta
lu2gu
2l1uh
-lu1id.
+lu1id
+lui2de
lu4ig
lu1is.
-lul2ö
lume4
2lumf
2lumg
@@ -12854,11 +13777,11 @@ lund4
2l1uns
2lunt
2lunw
-4luo
-lu2pf
+lu4pf
l2ura
lu2r1an
lu2rat
+3lurc
lu2rei
2lurg
l2uri
@@ -12867,45 +13790,46 @@ l1urn
lu2ro
2lurs
l1urt
-lu4ru
lu3sak
lu2san
2luse
lu2sp
lus4s3a
lus2s1c
-lus4sel
+lus6sel
lus3sen
-luss3er6
+luss3er4
lus2s1o
-lus2s1p
-lus4s1t
+lus4s3p
+lus4s3t
1lust
lu2sta
lu2stä
-lu6sterl
-lu2st1o2
-lu3str
+lu4sterl
+lu2s4t1o2
+lus4tr
lust3re
-lu2s1u
-4lu2ß1
+lu4s1u
+lu2ß1
lu2t1a4
-lut3au
+lu4tas
+lu4t3au
lu2tä
lu2t1e4g
-lu2tel
+lu2t1el
luter2
+lu2t3er4b
lut3erg
-luter4s
-lu6t5ersa
+lu4t3ersa
lu2thy
2luto
lu2tob
-lu2t1o2f
+lu2t1o4f
lu2top
lu2t1or
lu2t3r
-lut5schl
+lut3schl
+3lux
2lüb
3lübd
lück4e2
@@ -12914,27 +13838,30 @@ lücker3
lüf3te
lü2hel
lüh1l
-2l1v2
+lü2str
+2lv2
lva3
l3vl
l3vo
lv3r
-4l3w4
+2lw2
+l3wa
+lw4ei
lweis4s
+l3wi
2lx
1ly
-ly1a2
+ly3a
+lya4m
ly3c
ly3es
-ly1l
2lymp
3lyn
ly3no
-ly1o
+ly3o
lys2
-ly3t
-ly1u
-2l1z
+ly3th
+2lz
lza2
l2z1ac
l2z1ag
@@ -12942,76 +13869,78 @@ l2zan
l2z1ap
l2zat
lz1aus
-l2zäp
+l2z1äp
l2zär
+l2z1eim
lze2l
l2zele
-l4z3enth
+l2z3enth
l2z1ep
l2z1er2h
l2zerz
l2z1id
lzi4m
lz1imi
+lz1ing
+lz1inn
lz3l
-lzo2f
+lzo4f
l2zö
lz3t2
l2z1u4fe
lzug4s
lzvol2
-lz1w
-lz2wec
+lz3w
+l2zwar
+lz4wec
l2zwu
-1ma
-3ma.
+1m
maa2
-m1ab
-m3a2bar
+2m1ab
+3maba
+4m3a2bar
m2abä
-2mabb
m2abe
-2m3abf
-2mabg
-2mabh
-2mabk
+4m3abf
+4mabg
+4mabk
m2abli
-2mabm
+4mabn
ma2br
m2a3b4ra
-2mabs
-2mabt
-2mabz
+4mabs
+4mabw
ma3chan
mach2e
-mach8terh
-mach8t7ers
-mach4tr
+mach4t5ers
+mach2tr
ma2ci
mack2s
2m1act
-mada2m
+mada4m
m2adä
ma2del
ma3dj
+ma4dl
2m1adm
2m1a2d4r
ma4d2s
-ma1f4
+ma3f
+maf4r
mag2a
ma2ge.
-ma2geb
-ma2gef
+ma4geb
ma2geg
ma2gek
ma2gep
-ma4ges.
+ma2ges.
ma2get
ma2gev
ma2gew
-2m1agg
-magi5er.
-magi5ers
+4m1agg
+magi1
+magi3er.
+magi3ers
ma3gl
2magm
ma3g4n
@@ -13020,22 +13949,24 @@ ma3ha
mahl2s
ma1ho
mai4s3e
-ma2ke.
+ma4ke.
+ma4kes
2m1akt
-mal2ag
mal1ak
-ma4lakt
-ma2lan
+ma2lakt
+ma2l1an
ma2lau
ma2lär
2mal2de
m2aldi
ma3le
ma4leb
+ma4lent
mal2er
ma4lex
mali1
-mali3e
+mali2e
+mali3er
mal3lo
mal3lö3
2mallt
@@ -13046,9 +13977,9 @@ mal3t
malu2
ma2l3ut
3malv
-ma2mid
+ma4mid
mam3m
-2m1a2nal
+4m1a2nal
ma2nar
2m1a4n4at
ma2nau
@@ -13056,18 +13987,21 @@ ma2nau
2manb
man2ce
3man3d4
+man2en
ma2net
-m2anf
+2m2anf
mang2
2man3ga
-m4angel
+m2angel
2m1angr
-m2anh
+2m2anh
3manip
2manl
+4manla
m2anle
-3mann
-2manod
+3ma4nn
+4manod
+2manr
man3s
2m1ansa
2mansä
@@ -13081,93 +14015,95 @@ m1anza
ma2or
ma2phr
ma2po
-ma1q
m2ara
4marag
mar2an
-2m3arb
+4m3arb
+2maren
mar3g2
3ma1rh
ma3r2i
-m2ark
+m2a4rk
mar2kr
4mar2o
maro3d
4marr
-mar6schl
-mar6schm
-mar6schr
+mar4schl
+mar4schm
+mar4schn
+mar4schr
mar2sp
mar2su
-2m1arti
+2mart.
ma3r2u
m1arz
m2as
+3mas.
ma3s4a
mas2e
-3ma1s2p
+ma3s2p
masse4n
-ma3sses
-mas6ses.
-mas6sest
+ma3s2ses
ma5sset
-mass1t
+mass3t
ma3s2su
-3mas2t
+3mas4t
ma2sti
-ma4sz
-ma2ta2b
+ma4s3z
+ma2tab
ma2tan
ma2tä
m3a2tel
-ma4t3erd
-ma4t3erz
+ma2t3erd
+ma2t3erz
+ma3the
m4atme
2matmo
ma2to
ma4tort
mat3se
-mat1sp
+mat3sp
matta3g
matt4r
mat3url
-2m1au2f
+2m1au4f
3maul
ma3un
mau3r
2maus
+ma4ut
mau2ta
-m4ay
-ma1yo
-1mä
-3mäc
+m2ay
+ma1y4o
mä3he
2m1ähn
mäh1r
3män
4m1änd
-2mäo
2m1äp
+2mäq
mär1
+2m1ära
mär2kl
mär2z1
-mä1t4r
-mäu2s1c
-2m1b2
+mä3t4r
+mäu2s3c
+2mb2
mbe2e
+mbera2
mber2e
mbe3ri
mbert4
mbi3er.
-mb4l
+mb4le
mble1i
-mb4r
+mb4re
mbu3sc
2mc
m3ch
-4m1d
+2md
m2dan
-m2d1a2s
+m2d1a4s
md1är
mde2a
m2dei
@@ -13179,36 +14115,33 @@ m2d1erl
md2ö
md3ras
md3s2e
-mdt4
+mdt4r
m2d1um
-1me
me3an
me3at
meau2
-meb4
me2ben
-3mebr
+4mebo
me1c
-medi3e4
+medi3
+medie4
me1e2m
-mee2n
-mee4r3ei
+me1e2n
+mee4rei
2m1eff
mega3
me4gel
3meh
meh6l3er
-mehrer4
2m1eif
2m1eig
-m2ei3l2
+m2e4i3l2
mein4da
-meiner6k
-mei6nerl
-3m2einu
-m2eist
+meiner4k
+mei4nerl
+m2eis4t
me3lam
-me3l4ant
+me3l2ant
me2l1au
melb2
mel3d2
@@ -13218,14 +14151,18 @@ me2lek
me2ler
melet2
2melf.
+mel3ink
3melk
mel4k3ei
mell2i
+melm2
3melo
me2lob
+mel2sac
mel2se
+mel2spa
melt4
-6mel6tern
+4mel4tern
2m1e2mis
2m1emp
2m1e2mu
@@ -13236,90 +14173,103 @@ me4n3an
men3ar
me4nas
men3au
-2m1endl
+4m1endl
menen1
-4men4gag
+meng2a
+2men2gag
men3ge
+me4nh
me2nim
-men3k4
+me4n3k4
men2on
-men4se.
-men4sem
-6mensemb
-men4sen
+me4ns
+men2se.
+men2sem
+4mensemb
+men2sen
men4ser
-men4ses
-mensi4d
-men2so
+men2ses
+mensi2d
menst4
-m4enta
-men4t3ak
-m4entei
-ment5eig
-men6t5ers
-2mentn
-ment4sp
+3m4enta
+men2t3ak
+men4tanz
+mentar6ten
+3m4entei
+ment3eig
+men4t3ers
+4mentn
+ment2sp
me1o
2meou
2meö
-2mepa
+4mepa
2m1e2pi
-3m2er.
+m2er.
me1ra
mera3l
mer2as
me2r1e2b
-me4rens
-mer4err
-mer4erw
-4m3er4gän
-merin4d
-merin4t
-4mer4klä
+2mer2eig
+me2rens
+mer2err
+mer2erw
+2m3er2gän
+me5ric
+meri2e
+merin2d
+merin2t
+2mer2klä
+3merkm
m4ersh
-mer5sm
-mer6stel
+mer3sm
+mer4stel
mert4r
-merz6eng
+merz4eng
3mes
me2sal
me2sä
-mes2e
4meser
-mes2po
+mes3pr
2mes2sa
mess3an
-mes6ser6g
+messe2r
+mes4serg
mes4s1o
mes2sp
-mes2s1t
-mes1ta
+mes2s3t
+mes3ta
+mes3tä
me2str
+mest3ri
me3su
me3sze
3me2ß3
me3ta
+met3abe
+mete2
me3th
-meto1
+me2to
me2tö
-me4trig
-met6t5en6d
+me2trig
+me3tro
+met4t3en4d
meu1
2m1ex
me2xe
-1mé
-2m1f4
+2mf
mfi2le
-4m1g2
+mf4rü
+2mg2
mgang4
mglim2
-4m1h2
-1mi
+2m1h2
+m3hu
mi1a
mia2b
-mi2am
+mi3ak
+mia4m
2m1iat
-mi1ä
mibi1
mic1e
mi1ch
@@ -13331,52 +14281,54 @@ mi3dr
mie3dr
mi3ele
mi4e3no
-mierer4
+mierer2
mie2ti
-mie4to
-mie2tr
-mi1f4
+mie4t3r
+mif2
+mi3f4l
3mige
+mig4r
mi3h
mik1an
mi3ke
mi4kel
mi4kens
mi3k4l
-mi2ku
3mil
mi3la
milch1
mil4che
mi3l2i
-mil3le
mi3l2u
4milz
m2im2a
2m1imm
-2mimp
+4mimp
min2ac
mi3nak
-min5anze
-m2inde
-2m1indu
+min3anze
+m2in3de
+minde2s
+4m1indu
mi2nef
miner1
-mi4n3e4ri
+mi4n3e2ri
min2eu
-2minfo
+4minfo
+3ming
min2ga
-mings2
2minh
-mi3ni
+3mi3ni
mini3k4
mi3nod
mi2nof
2m1inse
m1inst
mi3nu
+3minz
mioni1
-mi1p
+mi3p
+mi4ps
3mir.
3miri
3mirs
@@ -13384,81 +14336,88 @@ mi1p
3mirz
3mis.
mi2sa
-mi4scha
-mi4schr
-mi4sch3w
+mis4au2
+mi2scha
+mi2scho
+mi2schr
+mi2sch3w
mise1
2m1i2so
-mis2pa
+3mis2p
mi2spe
mis5sar
-mis4ser
+mis2ser
mis4st
mi2sta
mi3str
3misu
mi2ß1
3mit
-mi2t1a
-mi2t1h
+mi2ta
+mit1h
mi2to
mi2tr
mi3tra
mit3s2
mit5sa
-mit3ta
+mit3tan
mit3t2e
mitte3s
mi2t1u
4mitz
mi3v2
-2m1j
-4m1k4
+2mj
+2mk2
m3kn
-4m1l2
+mk4na
+mk4ne
+mk4nu
+2m1l2
ml3c
m3le
ml3f
ml3k
m3lo
ml3p
-ml3s
-4m1m
+ml3s2
+2mm
mma3a
mm3achs
m2m1ak
-m2m1al
+mma4kr
+mm1all
+m2mank
m2mans
mm1anz
m2m1ap
mm2app
mm1art
-mmas4p
mma2ß
mm1aus
-m2mä4
-mm1äu
+mmä2
+mmä4s
+m2m1äu
mmd2
m2m1e2b
mme2c
+m2m1e2di
m2m1ef
m4meh
m2mei
mm1ein
mm3eise
mme2l1a2
-mme4lin
+mme2lin
mm2ene
-mmen6te.
-mmen6ten
-m4mentl
-m4ments
-m4mentw
+mmen4te.
+mmen4ten
+m2ments
+m2mentw
m2me2nü
-mme2r3a
-mme4rec
-mmer6geb
-mme2s1
+mme2r3a2
+mme2rec
+mmer4geb
+mme2s
mmes3a
mme3sc
mme4sz
@@ -13473,11 +14432,12 @@ m2m1ins
mm1int
mm2is
mmi3sc
+mmisch4
m4mita
-mmi5tw
+mmi3tw
m2mo2l
m2mor
-mm3p2
+mm3p
mmpf4
mms2
mm3sa
@@ -13487,10 +14447,12 @@ m2mum
mm2un
mmu3r
m2mus
+mmuts2
mmül2
-2m3n2
-m4nesi
-1mo
+2m1n2
+m2nesi2
+m3ni
+m3nu
2m1o2be
3mobi
2mobj
@@ -13498,97 +14460,108 @@ m4nesi
mo3de
mo2dr
m1of
-mo2fe
-3mog
+mo4fe
2mog.
mo2g1al
3m2oh
moh2a
moi3r
mo2k1l
-2mol.
+4mol.
mol3d
3mom
mom2e
3m2on
mo2nan
mo2nä
-mon4dac
-mon4del
+mon2dac
+mon2del
+mon2d3er
mon2do
mo2ner
+moni2en
mon3s2
mont2a
mon3th
mo1ny
3m2o2o
-2m1o1pe
-mo2per
+2mope
2m1opf
2mopt
mo1ra
+mo2rak
mor2an
mor2d3a
+mor4derm
mor2dr
-mo2rei
mor3g
mor3t2
+mo4ru
3mos
mo4ska
+mos4t
moster4
mo2sto
+mo2su
mo3t2h
+2motio
mot4r
mous2
-2m1ox
-mo1y
-1mö
+m1ox
+moy3
möbe2
mö2c
-2mö2f
-4mök
+2möf
+mö4fe
2m1öl
-4m1p
+2mp
mpa3ne
mpe2la
-mpe4lin
+mpe2lin
mpe2n
m2p1ene
-m2pf
+m4pf.
+mpf3au
mpf1ef
-mp4f3erf
+mp2f3erf
mpf3erg
-mp6fer6ge
-mpf3erp
-mp6ferpr
-mp4f3err
-mp4f3er4z
-mp2f3l
+mpf3er2p
+mp4ferpr
+mp2f3er4r
+mp2f3erz
+mp4f3l
mpf1or
-mp2fr
+m4ph.
mp1haf
+m4phb
+m4phf
+m4phg
+m4phm
mp1hos
+m4phs
+m4phz
mpin2
-m3plä
mp3lei
-m4p3lem.
+m2p3lem.
m2p3len
m2p3les
-m3pon
-mpor6ter
+mpor4ter
mpot2
-mps2
+m2p3ra
+mp4rä
mp3sh
+mps2p
m3pu
-2m1q
-2m3r4
-4m1s
+2mq
+2m1r2
+m3ra
+m3ru
+2ms
m2san
ms1as
m3sat
-msau3e
m2s1än
-msch2
+msch2l
m3se.
m2s1e2d
m2s1ef
@@ -13598,57 +14571,57 @@ mse2n
m2s1ene
m2sent
ms1erf
-ms2erh
mse2t
ms1eti
m2s1eu
m2sex
-m2s1o2d
-mso2r
+mso2
+m2s1od
ms1orc
ms1ori
+ms2p
m2spä
m2sped
m4spl
-ms2por
m2spot
m2spro
-ms2pu
-m4s3s4
+ms3s
+mss4a
+mss4t
+mst2
+m4st.
m4stag
m2stal
m2stit
m2sü
-m4sw
m4szi
-4m1t
+2mt
mt1ab
mt1ak
-mta2m
+mta4m
mt1ar
mt3aug
m2t1e2d
-m3tei.
+m2teig
mt1ein
-mt1eis
+m2t1eis
+m2teiw
mt1elt
mt1emi
-m4tenga
-m4t3engl
-m4tentf
-m4tentg
-m4t3en4tr
-m4tents
+m2tenga
+m2t3engl
+m2tentf
+m2tentg
+m2t3en2tr
+m2tents
mter2
-m2t1erb
-m4t3erei
+m2t1er4b
m2t1erf
m2t1erg
mt1erh
m2t3e2r4i
m2t1erk
m2t1erl
-mter4n
m2t1ers
m2t1ert
m2teta
@@ -13669,20 +14642,17 @@ mt1ös
mtra4s3
m2t3ro
m2trö
-m4ts
mt2sa
-mts3chi
mt3sco
mt2s1e
mt3send
mt3s2ka
-mt3s4kel
+mt3s2kel
mts3tät
-mtt4
+mtt4r
mt1um
mtu3re
mt3z
-1mu
mu1a
2m1uh
mu3la
@@ -13690,10 +14660,10 @@ mu3la
3mult
3mumi
m1ums
-mum2s1p
+mum2s3p
3mun
-mundan4
-mun6derf
+mundan2
+mun4derf
mu2ner2
4m1unf
4m3ungeb
@@ -13702,52 +14672,54 @@ mu4nin
4mu4niv
4munw
4munz
-mu4r1u2f
+mu3ru
+mu4r1u4f
3mus.
mu4s1a
3musc
mu2s1o
mu2sp
-mu3s4se.
-mu3s4ses
+mu3s2se.
+mu3s2ses
mus4ste
+must2
must4e
-mu2s1to
+mus4ter
+mu2s3to
mu2str
mu2su
muße3
mut1au
mut2st
-1mü
2müb
3müh
mü2her
mühl1a
-mül4len
+3mül
+mül2len
3mün
mü3s2si
3müt
-2m1v
+2mv
mvoll1
-2m1w2
+2mw2
mwa2
-mwa4r
-mweg2
-mwel4t3
+mweg4
+mwel4
+mwelt3
+mwelter3
mwu1
-3my
-my1al
-2m1z2
-mzel4li
-mzu1
+my3a
+my3on
+2mz2
mzug4
1na
3na.
+na2a
2n1ab
3naba
na2bä
n3abh
-3nabi
n3abk
na2b3l
na2bor
@@ -13755,15 +14727,17 @@ na2br
nab4rü
4n3abs2
na2bus
+4nabz
3na2c
n4ac.
nach1
-nachen4
-na5chen.
+nachen2
+na3chen.
n3achse
nach3sp
-nach8t7ersc
-nacht8raum
+nacht5ers
+nach6tersc
+nacht6raum
n1ada
na3dab
3nade
@@ -13774,9 +14748,11 @@ na2der
4n1adl
4n3adm
n1a2dr
-3na3e
+3nae
+na3el
+na3es
2n1af
-na1fra
+na3fra
nag2a
na3ge.
na2gem
@@ -13785,21 +14761,25 @@ n1a2gi
na3gin
na3g4r
3n2ah
-na2h1a
+nah1a
+na2hau
n4ahm
4n3ahn
4n3aho2
+na2hö
3nai
+na1i2d
nai2e
n1aig
4n3air
nai4re
n2ais
2n1ak
-3nakä
+3n4akä
3nako
-na2kro
+na4kro
4nakt
+na4kus
n2al.
na2l1a2
nal3am
@@ -13808,12 +14788,12 @@ na2lä
2n1albk
n2ald
nal3da
+na2l1ed
nal3ei
-na4l3ent
-na6lerei
-na4ler4g
-na4lerm
-na4l3erw
+na2l3ent
+na2ler2g
+na2lerm
+na2l3erw
nales2
nal1et
nal1ex
@@ -13824,25 +14804,27 @@ na2lop
nal2ph
nal3s
n2als.
-nal3t2
+nal3t
+nalt2a
+nalt4r
n2alty
na2lu
2naly
-n2am.
-na2mat
+na4mal
+na4mat
3name
-na3me.
-4na2mei
-n4a3men
-4n1a2mer
-na2mid
-na2min
-na3m4n
+4na4mei
+n4amen
+namens3
+4n1a4mer
+na4mid
+na4min
+na3m2n
3n2amo
n1amp
nam2sp
2n1amt
-namt4s
+namt2s
na4my
n1an
4na2n4a
@@ -13867,18 +14849,20 @@ nan2o3b
2nantr
2nanw
n2anz.
-nanzen4
-nan6zene
-nan6zeng
-nanzer4
+nanzen2
+nan4zeng
+nanzer2
+nan4zerg
+nan2zw
na3ot
na2per
n1apfe
-4napfel
+2napfel
+na2pos
n3a2pr
-n1aq
+n1a2q
n1ar
-5nar.
+3nar.
na2r1a
2narc
n2ard
@@ -13890,41 +14874,45 @@ n2arle
2narm
n2aro
na2rom
+na3rö
n2arr
+nar2rh
n2ars
2nart
n2arta
-n2arth
na3r2u
3nas
n4as.
-na4schw
-4n1a2sp
+na3sä
+na2schw
+4n1a4sp
nas2s1c
4n1assi
-na2str
4na2sy
nasyl2
3naß
3nat
n4at.
-nat3au
+n4ata
+na2tat
+na4t3au
nat1ei
na3ten
na2t2h
4natm
nat2o
4natom
-5nator
nat1r
nat4sa
nats1e
-na3tu
+na4tt
+n4a3tu
n1au
-nauf4fr
-nau2fr
-5naui
+nauf2fr
+4nauge.
3n2aul
+3naum
+na3um.
4nausb
4nausd
4nausf
@@ -13938,11 +14926,12 @@ n2auso
nau3te
3nav
nave4
-navi5er.
-navi5ers
+navi3er.
+navi3ers
+na2x
1nä
2näb
-3n4äc
+3n2äc
3näe
2n1äf
3näg
@@ -13950,38 +14939,48 @@ nä2hi
3nähm
2n1ähn
nä2hu
-2n1ä2m
+3näi
+2n1äm
+nä4mi
2n1än
2näp
2näq
nä2sc
-n2ä6s3s
+n2ä4s3s
2näu
3nä1um
-2n3b4
+2nb2
+n3ba
+n3be
nbe2in
nber2e
+nber2gr
+nb4la
+nb4le
+nb4ri
+nbruch4s5t
+n3bs
nbu3s
-nby2
2n1c
n2c3ab
n3can
n3ce4n
n3ces.
+n4ch.
+nchi3en
n3chl
-nch3m
+n4ch3m
ncor2
n3cr
n3cu
-2n1d
-nda1f
+2nd
+nda3f
nd2ag
-n3dai
+n3d2ai
n2d1ak
n2dana
n2dani
n2danz
-nd1arr
n3dat
nd3att
nd1au
@@ -13989,30 +14988,32 @@ n2daut
n2dax
nd1äng
nd1c
-nde4al.
-n2d1ede
-n3dee
+nde2al.
+n3de1e
n2dei
+nde3inf
+nde2lat
+nde3l2ec
nd3elfe
ndel3l
ndel4sa
-ndels5en
-nde4mot
+ndels3en
nden3sk
-n4dentl
-n4dents
+n2dentl
+n2dents
nde3o2
-n5der.
-n5deren
+n3der.
+nde4rei4s
+n3deren
nd2erh
-n5deri
-nder6läs
-nde4rob
-n4de4ros
-n6der6sat
-n3d2es
+n3deri
+nder4läs
+nde2rob
+n2de2ros
+nder4sat
+nd2es1
nde2se
-ndes3s
+nd4est
ndi2a3
nd1imm
n2dof
@@ -14021,33 +15022,37 @@ n2dopt
nd1or
n2do2ri
n2d3ott
+n2dout
n2dö
-nd2ös
-nd4ram
n2d3rat
nd3rau
n2d3re
+nd5ric
n2drif
n2d3roc
n2drod
n2d3rö
n2drui
n2d3run
-nd4sene
+n4dsb
+nd2sene
+n4dsl
nd2spr
nd3th
ndt4r
n2duns
-ndwa5re
ndy3
-ndys2p
+ndys2
+ndys4p
1ne
3ne.
ne2ap
-3nea4s
+3neas
+ne3ast.
ne3at
ne3au
-4n3ebene
+2n3ebene
+neben3s
ne2bl
2n1ebn
neb4r
@@ -14063,8 +15068,9 @@ ne3ein
ne3eis
neema4
neen2
+ne1en.
nee1r
-neer2e
+neer4e
n1ef
n2ef.
n2e3f2a
@@ -14073,17 +15079,16 @@ n2e3f2a
neg4l
n1e2go
neg4r
-n1ehe
-2ne2he.
+n1e2he
+2nehe.
2nehem
-2nehen2
-nehe2r
+nehen2
+ne3he2r
3nehm
-4n3ehr
+2n1ehr
2n1ei
3neia
4neic
-nei4dei
nei4dr
4neier
3neigt
@@ -14093,46 +15098,46 @@ nei4la
4neinh
4neink
4neinl
+4neinr
4neinz
-4neip
-neiss4
ne2ke
2n1eks
nek3t2
2nekz
-ne2la
+ne2l
+ne3lä
nel3b
-n1e2le
-4nelek
-4nelem
+n1ele
+ne3leb
+2nelek
+2nelem
ne3len
-ne3lex
-nel2i
-ne3lid
-ne2lit
+ne3l2i
+ne4lim
+ne4lit
3nelk
n2ell
nel4la4
-nel4lei
-neller6f
-nel4lif
-3nel2o
-3nelu
+nel2lei
+neller4f
+nel2lif
+n2eln
+3ne3l2o
+3ne3lu
3n2em.
ne3mas
-4n1emb
+2n1emb
+ne5men
+n2emo
4n3emp
2n1ems
-4nemu
3nen
n4en.
n2en3a
nen4am
-ne4nan
ne2nä
n2enb
n2enc
-nen4dar
4n1endb
4n1endd
4n1endf
@@ -14149,52 +15154,57 @@ nene4m
nenen1
ne4nene
nen3erb
-ne2n3eu
+2nenerg
+ne2n1eu
n2enf
4n1engb
-nen4gen
+nen2gen
4n1engs
4n1engt
n1engu
-nen4gun
+nen2gun
n2enh
-ne4n3i
+ne2ni
n2enj
n2enk2
n2enm
-nen4nar
+n2enn
+nen2nar
ne2no4
-nen3s4e
+nen3s2e
+2nensem
nen3sk
nen3s2p
+nen3s4t
5n2en3t2a
4n1entb
4nentd
4nentf
5n2enti
-4n1entl
+2n1entl
4nentn
nen3to
-5nentr
+5n2entra
+nen2tri
4n1ents
4n3entw
-4nentz
+4n3entz
ne4n3u
n2env
n2enw
-nenz4er
-ne2o3b
+nenz2er
+neo3b2
ne2oh
ne2or
ne2pen
2nepf
-2ne2pi
+2ne4pi
2nepo
ne2pos
nept4
n4er.
ne1ra
-ne2rab
+ne2ra2b
ne2rac
ne2r3af
ne2rag
@@ -14203,34 +15213,41 @@ ne2ram
ne2ran
ne2r3ap
n2erat
-ne6ratio
+ne2rati
ne3rato
ne2rau
n2erb2a
-4n3erbe.
-4n3erben
+2n3erbe.
+2n3erben
2nerdb
-ner4dig
+ner2dig
ne2r1e2b
ne2rec
n1erf
-4nerfas
+2nerfas
+nerfor2
3nerfr
2nerfü
2ner3g4
+n3ergeb
+4nergi
3nergr
n1erh
-4n3erhö
+n3erhö
+4nerhöh
3neri
+neri2e
n2erj
n1erk
-5nerka
+3nerka
n2erkö
+n4erleh
n2erli
2n1erlö
nerma3
-nermas4
+nermas2
n1ermi
+2nermit
2n1ernä
4n3erneu
2n1ernt
@@ -14241,102 +15258,112 @@ n2ers.
2n1ersa
3nerse
ner4sk
-4n3ersts
+2n3ersts
nert4
3nert.
ne2rup
3n2erv
-4nerwar
+2nerwar
2n1erz
n2es.
ne2sal
ne2sei
+n1e2sel
ne2s1ev
2ne3sh
ne3ska
ne2s1of
ne2s1or
-ne2s1pa
-4n1es2si
-2n1e2st3r
+ne2s3pa
+2n1es2si
+nes5tei
+2n3e2st3r
4nesyn
-3n2eß
+n2eß
ne2tab
-2ne2tag
+2ne4tag
net1ak
ne2t1an
2ne2tap
2ne2tat
-ne2tau
ne4te2l
+ne5ten
ne2th
net3ha
ne3ti
+ne4tim
ne4tin
-ne4tob
-net1s2
+ne2tob
+nets2
n2ett
net3ta
-net3te
-net3tr
+net5te
+net3t4r
2n1e2tu
-net4zer
+net2zer
net2z1i
ne2u
neu1c
-neu4ere
-neuer4f
-neuer4k
-neuer4r
+neu2ere
+neuer2f
+neuer2k
neuer4s
-neuer4w
+neuer2w
+neuf4
neu3g4
+n2eun
2n1eup
neur2
neu2ra
neu3t
3n2evi
n2ew
-ne3wa
2n1ex
ne2xi
-5ney
3nez
-3né
-2n1f
-n3f2al
-nfalt2
-n3f2ang
+1né
+2nf
+nf2al
+nfalt4
+nf2ang
nf4ar
n3f2ä
nfäs3
nfe2i
n3f2en
n3f2er
-nf2es
+nf4es
n4fex
-nff4
-n3fi
-nfi4le.
+n3f2i
+nfi2le.
nf4le
+nf4lö
+nf5löf
+nflös4
nf2o
-nf4r
+n4föl
+nf4re
+nf4ri
+nf4ru
+nf4rü
nf3s2
nf2tan
nf3tei
nf2t3r
-nft2st
-nft4ste
+nft4st
+nfts3tr
n2f1u
-4n1g
+2ng
n3gabe
ng1abt
n2g1ac
n2g1ad
n2g1ak
-ng1a2me
+ng1a4me
+ng1ams
ng3anda
-ngang6st
+ng3angl
+ngang4st
n2ganh
n4ganl
ng1ant
@@ -14344,29 +15371,30 @@ ng1are
n3g2ars
n2g1a2v
n2g1äl
-ng3d4
+ng3d
n2g1eif
n2g1ein
ngelb4
-nge3l4ei
-n3g4en
-n5gene
-nge5nerw
-ngenmas6
+nge3l2ei
+ngel3t4
+n3gene
+nge3nerw
ngen3s2
-nge4ram
+nge2ram
n2g1erg
-nger4zä
-n3g4es
+nger2zä
+nger3ze
+n3ges
nge3s2a
+ng5get
ng3hu
n2g1id
ng2lad
-ng2läs
+n3glas
n2glic
ng4lok
n3glot
-ngma7sse.
+ngma5sse.
n2gn
ng3ne
n4g3ni
@@ -14374,80 +15402,99 @@ ng4nom
ng2nu
ng2ob
n2g1op
-n2g1or
-ngo2ri
+n2g1o2r
n2gö
-n2g3rai
+n2grai
ng4ran
n2g3rat
ng3roc
ngro3s
ng3rost
-ng2s1
-ngs3an
+ng2s
ng4s3au
+ng3sc
ng5schr
-ng4s3e4h
-ngs3pa
+ng4sd
+ngs3e4h
+ng4sf
+ng5son
+ng5soz
+ng3span
ng4spar
ng4stec
+ng5suc
ng3ts
n2gum
-ngzei4t
-4n3h2
+ngzei2t
+2n1h2
+n3ha.
+nhabe4r3e
+n5haltu
+nhas3
+n3he
nhe2r
+n3ho
1ni
3n2ia
ni3alo
ni2ar
+ni1as
nibb4
-nic4
ni1ce
n1id
3n2id.
ni3da
ni2de
+n2i3de.
2nidea
+ni3den.
ni3dr
2n3idy
n2ie
nie3b
+3nied
+ni2e1i
ni1el
nie3l2a
nie4n
ni3ene
-ni3eni
-nie4rei
-ni4erna
+nie2rei
+nie4rerg
+ni2erna
nie4sa
nie5sse
ni2eu
-ni1fl
-niga2
+ni3fl
+niga4
ni2g1ab
ni2g1am
ni2g1an
4n3i2gel
-n4igen
2niget
+n4igk
ni4gl
nig3li
ni2gn
+nigs3c
nig4sp
nihi3
ni2kar
-3nike
-ni2kel
-ni3kerh
+4nikei
+4ni2kel
+ni3k2erh
+4nikh
ni2ki
nik3ing
ni2kor
ni2k3r
+ni4ks
nik3t4
+4nikun
3n2il
ni3l2a
ni3l2i
nil3l
+ni3mo
4nimp
nin1
3nin.
@@ -14457,7 +15504,9 @@ ni2nal
3n2inb
2n1ind
2ninf
-3n2ing
+3ning
+n2ing.
+n2ingo
ning4s
2n1inh
4n1ink2
@@ -14482,49 +15531,46 @@ ni4sam
ni2san
ni2sä
nis3cha
-ni4schw
+ni2schw
ni2s1e
ni3se.
-nis3el
4n3isol
ni2som
4nisot
ni2sp
-ni3spi
-nis5s4
+nis3s4
+nis5st
nis3tha
ni2stu
ni3stun
ni2s1u
2nit
3nita
-ni1th
+ni3th
ni2ti
4ni4tia
nit2o
-3nitr
+3nit4r
nit3s
nit4tec
-nit6tell
-nit6ter6g
-nit6t5er6k
-nit4tie
-nit4tra
+nit4tell
+nit4ter4g
+nit4t3er4k
+nit2tie
+nit2t3r
nitt4sa
-3niu
niv2
3nix
-2n1j
-4n1k
+2nj
+2nk
nk1abr
n2k1ac
-nka2ge
+nk1a2ge
n3kal
n4kalg
nk1ang
nk1apf
nk3art.
-nka3sc
n2katm
n2kato
nk1aus
@@ -14533,36 +15579,36 @@ n2k1äh
n2k1äp
nk1ei
nk2eil
-nke4lei
-n4kelem
+nke2lei
+n2kelem
nkelma3
-nkelmas6
+nkelmas4
+n3ken.
nke4na
-nken4te
-n4k3erle
-nke4ros
+nker4fah
+nker3la
+n2k3erle
+nke2ros
nk3ersa
+n2k3erwe
n3kesc
nke2t
nk1eti
-n2ketu
nk1i2d
n2kide
nk1inh
n2k1ins
-n4klade
-n3klag
+n2klade
+n2k1laf
nk3leis
n2k3len
nk3les
-n3klin
nk2lo
nk4neb
n2knis
n2knit
n2knu
n2k1o4be
-nk1ope
n2kopt
nko2r
nkord2
@@ -14571,8 +15617,8 @@ n2k1ort
n2köl
nk4rab
nk3rät
-n4kre.
-n2k3rel
+n4k5re.
+nk3rel
n2kren
nk3rep
n2krez
@@ -14582,11 +15628,14 @@ nk2sal
nk2se
nk3sen
nk2so
-nks2ti
+nks2p
+nks6tel
+nks4ti
nk3s2z
nk2tak
-nk4terg
-nk4t3ern
+nk4tau
+nk2terg
+nk2t3ern
nkte3sk
nkt2et
nk2tin
@@ -14596,79 +15645,86 @@ nkt1r
nkt3ric
nk2tro
nk2tru
-nkt4sen
+nkt2sen
n2k1um
nku2n
nk1urh
n2küb
-2n3l2
-nla3ge
+2n1l2
+n3la
+n3le
nle2ga
+nleit6e
+n3li
nli4ne
-2n1m2
+2nm2
n3ma
n3mä
nmen2s
-n5mi
-4n1n
+2n1n
n2nada
nna2g
n2nalg
-n2n1all
-nna3m
-n2nan
-nna3st
+n4n1all
+n2n1amb
+n4nan
+nn1a2sc
n2nau
n3nä
n3nec
+n3n2eh
nn2ei.
n3nelb
nne4le
nne4na
nn2ens
-nner4ei
-n6n5ereig
-nner4fü
-nner6geb
+n4nentl
+n4nereig
+nner2fü
+nner4geb
nn4ergr
nn2erh
nn2erk
-nner4la
+n2n3er2la
+nner4mit
nn2ero
nne2rö4
nn3erwa
-nner6war
nner2z
-nne4s1e
+nne2s1e
n2ness
nn2eu
nn2ex
nn3f
-nng4
+nng4r
n3ni
+n4nid
nnk2
nn2o3b
nn3obl
nn3obs
n2nof
-n2n1op
+n2nop
nno2r
nn1ori
nn4sam
nn3ser
nn3s2p
-nnst4
+nnst2
nns3tat
-nn4stoc
+nn2stoc
nn2stö
-nn3t2a
+nnst4r
+nnt2a
+nn5tag
nn2th
n2n1uf
n2n1unf
nn1ur
+nnvol3le
1no
3no.
-no5at
+no3at
3n2oba
n2obel
2nobj
@@ -14676,31 +15732,32 @@ no2bla
n2oble
3noblo
3noblö
-2n1obs
-nobu2
-nobut3
+2n1o4bs
3noby
no1c
noche4
noch4r
2nod
no2de
+nodi3
no2ed
n1of
-no2fe
+no4fe
+no5fes
2noff
-2n1oh
-3n2ohe
+n1oh
+n2ohe
+no3id
no2kel
2n3okk
no3kr
+nola4
+no2lam
n3ole
-no2leu
no4lig
no2liv
2n3o2ly
-3no3me3
-no3mi
+3nome3
3nomp
non2e
n1onk
@@ -14709,21 +15766,22 @@ n1ont
no2o
3n2opa
3nopä
-no2per
-2n1o2pi
+no2pe
+2no2pi
2n1ops
no3p2te
3nor.
nor2a
no2rad
-n2o3rak
+n2o1rak
no3ral
no3rar
2norc
nor4da
3nordb
-nor4des
+nor2des
nor2d5r
+nor2du
no3r2e
2n1org
3norh
@@ -14737,8 +15795,9 @@ nor3mal
3n2os.
nos2e1
no3sh
-no5s2k
-no2sp
+nos2k
+no5ski
+no2s3p
2nosti
nost1r
2nostv
@@ -14747,281 +15806,317 @@ no2tan
no3tart
no2tä
not1e2i
-no6t5entr
-no2ter2
+no4t3entr
+no2ter4
noterb3
no2tex
not1h
no2tho
-no2t3in
+n4oti
+no2tin
+no4tl
no2t3op
no2t3r
-not3tr
3nov
2n1o2x
3noz
2nöd
-4nö2f
-4n1ök
-4n1öl
+2nöf
+nö4fe
+2n1ök
+2n1öl
n2ör
nö4s3s
1n2öt
-4n3p4
+2np2
+n3pa
npa2ge
-npf4
+n3pf
+np4fu
+n3pl
+np4lu
+n3pr
+n3ps
npsy3
-2n1q
-6n3r2
-nran2
+n3pü
+2nq
+2n1r2
+n3ra
+nra3di
+nran2d
nra4s3s
-nrau4ma
nräu3s
+n3re
nrebe2
nre3sz
nro2h
nrö2s
-nrücker6
-4n1s
+n3ru
+nrücker4
+2ns
+nsa2b
n3sabo
-n2sa2d
+n2s1a2d
n4s1a2gi
+n3saka
+nsa4kr
n2sall
n2salt
ns3ane
nsa2r
ns2arg
-ns3ari
n3sark
-nsa4s
+nsa4st
ns4ath
+nsau4e
nsau4r
-nsau4se
+nsau2se
n2saut
ns2av
ns2ax
n2s1än
ns2äug
n2s1äus
-n3sche.
-n4schef
-nsch5eul
+n4schemi
+nscher5g
n4schl.
nsch2o
nscht4
n3schu
-nsch7werd
+nsch5werd
ns2cr
ns1eb
-nse4ein
+n3sed
ns2eh
nse2ha2
-nseh5ere
-n4seinf
+nseh3ere
+n2seinf
ns2ele
ns3elem
+nse2l3en
n2sem.
-nsen4sp
+nsen2sp
n2sepo
+ns4eq
+n3ser.
+nse2rei
+nser4en
n2s1erf
n2s1erg
-n2serh
-n3seri
+n2s1erh
ns1erk
ns1erl
-n4serle
-n4s3erne
+n2serle
+n2s3erne
n2serö
ns1ers
-n4sersc
ns3ertr
+nser2u
n2s1erw
n2serz
n4sety
n2s1eu
nsfi2l
ns3hor
+n5show
+ns4ic
ns3iden
-n5sim
-n6simp
+n3sim
+n4simp
n2sini
nsinn2
+nsinns3
nsi2te
nsi2tr
+n4sk.
n3s2kal
n3s2kel
ns2kis
n3skle
+n4skü
n3s2ky
-n5smara
+n3smara
n2s1o2d
ns1of
n2soff
ns4om
n4s3ont
-n2sop
-n4s3ort.
-nsp4
+n2s1op
+n2s3ort.
ns2pac
-ns2pek
-ns2pel
-n5s4pen
-n4speri
-n2sph
-ns2pi
+n4sparti
+ns2pas
+ns4pel
+n2speri
+n2s3ph
n5spie
n2spo
n2sprä
-n4s3prie
+n2s3prie
n2spro
n2sput
ns3s2
+nss4t
+n4st.
+ns3tabl
nst1ak
-n4stale
+n2stale
ns4ta2n1
nst3ane
-ns4tar
n2stas
-n4s3tat.
-n6staten
-n4stats
-ns2tau
-n5s2te.
+n2s3tat.
+n4staten
+n2stats
+n2s3täti
+n5s4te.
n4steif
-nst5eife
-nst7einhe
+nst3eife
+nst5einhe
ns4tem.
ns4ten.
n4stent
ns4ter.
-nst5erge
+nst3erge
ns4tes.
n5steu
-n5s2tic
+n5s4tic
n4stilg
n2stob
-n4stole
-nst5opfe
-ns2tor
-n4strac
-n4strad
-n6strieb
-n4strik
+n2s3tole
+nst3opfe
+ns3tor.
+ns3tore
+n2strac
+n2strad
+n4strieb
+n2strik
ns4trun
-ns2tum
nst3u2t
-n3suf
+nsuli2
ns2um
ns1un
ns2ung
-n2s1urs
-n2sut
+n2s1ut
n3sy
+n4sza
+ns4zene
ns2zin
-2n1t
+n4szo
+n4szu
+n4szü
+n4szw
+2nt
n3t2a3c
ntak4ta
-ntal1a
-nta4lin
+ntal3ar
+nta2lin
n4t1all
nta2lo
nt2alp
-n3ta3m
+n3tam
nt2anb
nta3ne
-nt1ang
-n4tansp
nt1ant
-n4tanza
-n3t2arb
+ntar3ak
+nt2arb
+ntar2c
nt1ark
-n3t2arm
+nt2arm
nt1art
-ntar6tik
-nt3artu
+n4tarti
+ntar4tik
+n4t3artu
+ntasi2
n2t1ass
n2tath
n3tatl
-n2tauf
nt1äm
n2t1äu
nte3au
nte1e
-nte3g6
+nte3g4
n2t1eh
n3tehe
n2teig
+nt3eilt
nt1ein
n2t1eis
-nt1emo
-nt4en
+n2temä
+n2t1e2mo
nte4na
-nten6te.
+n3tens
+nten4te.
ntera4
-nte6r5eis
-nt4erh
-nt4erk
-nt4erm
-nt4ern
-ntern4e
-nt4ers
-nt4ert
+nte4r3eis
+nter3g
+nteri4en
+ntern2e
ntes2
nte3sa
-n2t1ess
-n6testri
-n2te2ta
+n2t5ess
+n4testri
+n2te4ta
nteu3
-nteu6eri
+nteu4eri
nte3v
nt1hel
nt1hie
+nt1ho
+nt2hos
n2thot
-n3thr
-nt4hu
-n2t5hum
-nt4hy
+nt2hu
+n2t3hum
nt2i
+nti2en
ntim3p
n2t3ind
nt3inf
+nting2
nt3inh
ntini1
-n3t4lem
+nti3t
+n3t2lem
ntmen2
-ntmo4
ntni2
ntnis1
nto3re
n2torg
-n4t3o4rie
+n2t3o2rie
+n4t1ox
n2t1öl
nt4ral
ntras3s
-nt1rau
+nt3rau
nt4raum
+nt5re.
nt3rea
nt3rec
n3t4ree
nt3reif
n3trep
nt4repr
-nt3rich
-n4t3rieg
+nt4ré
+nt3ric
+n2t3rieg
+nt3rin
n2troh
-n3trop
+n2tropi
+nt3run
n2t3rü
-n4t1s
nts2ah
+nt3san
+nt4sang
+nts3k
nts2p
-nts3par
-nt5spe
-nts2ti
+nt3spe
+nts4ti
nt2sur
ntt2
nttü3
ntu4re.
+n3t2ü
nt3z
+nt4zk
1nu
3nu1a
nu3a2r3
@@ -15030,12 +16125,12 @@ nubi1
nude2
3nue
nu2es
-nu2fe
+nu4fe
2n1uh
3nuhi
3nui
-n2uk4
-nu3kl
+n2uk
+nu3k4l
n3u2kr
null3eb
nul4lin
@@ -15046,13 +16141,14 @@ n2ume
2numg
2numl
3n2umm
+4n3umma
4numr
2n1ums
2n1umv
2n3umz
-nu4n
+nu2n
2nuna
-2n1une
+2n1u4ne
3n2ung
4n3ungl
4n1uni
@@ -15065,34 +16161,36 @@ n3unk
2nup
2nu2r
nur2i
-nurs2
+nurs4
nur2z
3nu2s
nu3sc
nu3se
-nu4si
-nus1p
-nu4ss
-nuss3er4
-nu4s1t
+nu3sk
+nu3spo
+nuss3er2
+nuss3p
+nu4s3t
nu2ß1
3nut
nu2t1a
+nuti2v
n3uto
nu2top
nu2t3r
3nuu
3nux
3nuz
-2nü4b
+2nüb
+nü4be
nür1c
1nüt
-2n1v2
+2nv2
n3ver
n3vl
-nvoran4
-2n3w
-nwei4st
+nvoran2
+2nw
+nwei2st
1ny.
2n1ya
n2ya.
@@ -15101,14 +16199,14 @@ n1yo
1nyr
1nys
1nyw
-4n1z
+2nz
n2zac
n2z1a2g
-n2z3a2k
-n2zan
-nz3a4ne
-n3zani
+n2z3a4k
+n2z3a4ne
+n2zant
n2zar
+nz3a2ri
nza4s
n2zat
n2z1au
@@ -15116,19 +16214,17 @@ n2zän
n2zär
nze4la
nzel3l
-nzel6lig
-n6zenerg
+nzel4lig
n3zeni
-n4zense
-n4zentl
-n4zents
-nz3erem
+n2zense
+n2zentl
+n2zents
n2z1erh
nz1erl
-nzer4lö
-n5z4err
-nz5erste
-nzer6tra
+nzer2lö
+nz4err
+nz3erste
+nzer4tra
n3z4es
nze3sk
nze2t
@@ -15145,53 +16241,59 @@ nzlei3
n2z1op
n2zöl
nzt4r
-nzug2s
-n2z1wa
-n2z1wä
+nzu3p
+n2z3wa
+nz3wä
n2zwet
n2zwir
n2zwö
-n2z1wu
+n2z3wu
+1ñ
ño1
ñor2
-2o3a2
-o4a3bi
-o4ac
+2o1a2
+oa3bi
+o2ac
oa3che
oa3chi
-o4ad
+o2ad
oa3de
+o3ah
oa3in
-o4a3ke
-oak5l
+oa4k1l
+oa4ku
+o3al
o4a3la
-o4a3mi
-oa4n
-oan4a
-o4a3q
-o2a4r
+oa4me
+oa4mé
+o2ami
+oa4n4a
+oa4nn
+o2a3q
+o2ar
+oa4re
o2a3s
-3oase
+3o4ase
oa4si
+oa5sis
oa4sp
-o5ass
-o4at
+o3a4ss
oa3te
-o5au
2o1ä2
-o1b
+oäs3
2ob.
o3b2al
obal3l
ob2am
-ob2ar
+2ob2ar
+2obau
ob1auf
2o3b2ä
2obb
ob2e
2obe.
2obea
-2o3bec
+2obec
2obef
o2b3ein
2oben
@@ -15199,34 +16301,37 @@ obe4na
oben3d4
1o2ber
2o3ber.
-ober5eis
+ober3eis
ober3in
-oberin6g
obe4ris
2obev
2obez
2o3b2i
+obi2e
3obj
ob1la
ob3lei
1ob3li
+ob4lit
2oblo
2ob2lö
ob2lu
-2obo
+o2boe
ob1or
+2obot
2obö
ob3rei
2obrü
-o4bs2
-ob3sh
+ob3s2h
ob3sk
+obs4p
+ob2sta
2o3bu
o4bunt
obus3s
2o3bü
o4büb
-2oby
+2o3by
2oc
o3ca
oc1c
@@ -15241,34 +16346,35 @@ o2ch1ec
och1eh
och1ei
oche2l
-ocher4k
+ocher2k
ochi4d
+ochi3e
och3l
och3m
och1o
-ochö2f
+ochö4f
och3r
-ocht4
+ochs4p
+och3t4e
o1chu
-ochu2f
+ochu4f
och3u2t
-och1w
+och3w
o3ci
-oc4k
-ock5er6sc
+ock3er4sc
+oc4ko
ock3sz
ock3ta
o1cl
o3co
-o1ç
-o1d
+o3cy
2od2a
od3ak
od2dr
o3de2c
o3d2e3i
odein3
-ode4l3ag
+ode2l3ag
ode2n1
ode2s1e
ode3sp
@@ -15276,7 +16382,7 @@ od2et
o3dex
od2i
2o3dia
-2odi3c
+2odic
2odif
2o3dir
2odn
@@ -15285,40 +16391,52 @@ o2d1op
odo4s
od2ö
2odr
-o2dre
-odt4
+odt4r
2odu
o3dy
-ody2m
-2o1e2
-oe4b
-oe3di
-oe4m
+ody4m
+2o1e
+oe2b
+oe4be
+oe3de
+oe2h
+oe2l
+oe2m
+oe4mi
oen1e
-oe3ri
-o2e3s
-oe4sc
-o2e3t2
+oe4nz
+oe2p
+o2es
+oe2sc
+o2et2
o3et.
+oe4ta
o3ets
-2ofa
+oe2v
+oe2x
+o1ë
+o2f
+2o3fa
of1a2d
of1a2g
of2an
of1au
-2ofä
-o2f1e2b
-o2f1ec
+2o3fä
+of1är
+o3fe
+o4f1e2b
+o4f1ec
2ofee
-o2f1ei
+o4f1ei
2ofem
-o2fent
-2o3fer
+o4fent
+2ofer
o4ferb
-2o3f2es
-o2f1e2t
+o4f1err
+2of2es
+o4f1e2t
2ofeu
-of3eun
+2off.
of2fa4
of4fal
of4fam
@@ -15328,25 +16446,27 @@ of2fir
of2fix
1offiz
of2f3l
+2offn
of2fo
of2f3r
offs2
off3sh
off3si
off3sp
-of2fu
of2fü
-2ofi
-ofi3e2i
+2o3f2i
+ofi3e
+ofie2i
ofi3k4l
-2o1fl
+2o3fl
of3le
of3li
of4lö
-2ofo
-2ofö
-2o1fr
+2o3fo
+2o3fö
+2o3fr
of3rä
+of4ru
of4rü
ofs1
of2sa
@@ -15354,20 +16474,21 @@ of4sam
ofs2ch
of2se
of2si
-of2sp
-of4staf
+of2s3p
+of2staf
of2sto
-ofs2tr
-ofstra8ssen
+ofstra6ssen
of2su
2oft
oft2a
of2tei
of3th
oft4r
-2ofu
+2o3fu
+of3uh
of3ur
-2o1g
+o3fü
+2og
o2g1ab
o2g1ac
oga3d
@@ -15375,33 +16496,39 @@ og1ang
o2g1e2i
ogel3dr
oge2li
-ogener4
-ogenmas6
-ogerätein8
+ogener2
+ogen2id
+ogerätein6
+ogeri2
o2g1eth
og2gl
o3gh
-ogi2er
-ogin1
+ogi4e
o2g1ini
-og3ins
+o2g3ins
og1l
og3le
og2lo
-o3g4n
+o3g2n
+og4na
+og4ne
+og4ni
ogoi3
og1o2ri
og2s
+og3sc
og3si
-og3s2p
-ogs1t
+og3s4p
2o1ha
+o3ha.
oh1alk
+oh1ar
o1hä
o1he
o2h1eis
-o2h1er2t
+o2h1er4t
oh1er2z
+o2herze
2o1hi
2ohl
ohl1a
@@ -15409,6 +16536,7 @@ oh2la2d
oh2lä
oh3lec
ohl1ei
+ohle3l
oh3lep
ohler2
oh4lerg
@@ -15416,7 +16544,7 @@ oh4l3erh
oh4lerw
oh3lo2
ohl1or
-ohls2
+ohls2e
oh2lu
ohm2a
1ohmi
@@ -15439,53 +16567,56 @@ oh2rel
oh2rem
ohren3s
ohrer2
-oh4rerg
+oh2rerg
+oh3rers
oh3ri
oh4rin
-ohr1o
-oh2rol
+oh4rol
+1ohrr
ohrt4r
ohs2
oh3sa
oh3t
o1hu
-oh1w
+oh3w
2o1hy
2oi
-o1id.
-o3i2da
-o1ids
-o3ie
+o1i2d
+o3ida
o1i2m
o1in
o4ine
oi2r
o3isch.
-o4ische
+o2ische
oi3se
o1ism
oiss2
oi4st
-o1i4tu
-2o1j
-2o1k
+o1i2t
+oi4ta
+oi3te
+oi3th
+oi3ti
+oi4tu
+2oj
+2ok
ok2a
oka3b2
o2k3ac
oka3i
oka2la
okale2
-oka6lere
ok2e
oki4o
ok2la
ok3lau
ok1lä
ok2li
+ok4na
ok2o
-oko4pt
ok2so
-ok2s1p
+ok2sp
ok3t2
o3ku
3okw
@@ -15493,29 +16624,31 @@ o3ku
o1la
ol3abu
olaf4
-o2l1a2m
+ol1ami
ol1ant
ol2ar
o3l2a3s
olast4
-ol1a2v
-4o1lä
+ola2ve
+o1lä
ol1ät
ol2chr
ol4d1am
ol2dä
ol2d1ed
-ol4d3eng
-old5ersa
+ol2d3eng
+old3ersa
ol2deu
ol2dim
ol2d3o
-ol2dr
+ol2d1r
4o3le.
+ole2e
o2l1ef
ol1eie
o2l1eis
ol1emb
+ole4p
oler2
ol1erk
ol1er3t
@@ -15524,19 +16657,19 @@ ole3u2
ol1exz
ol2fa
ol2fem
-olf3ere
+ol2ferl
ol2f3l
olf1r
-ol2f3ra
+ol2fra
olft4
olgege3
-olge4ne
+olge2ne
ol2gl
ol2gr
-ol2i
olie4n1
oli4er
oli3k4
+o4l1ind
oli3tu
3oliv
ol2kl
@@ -15548,7 +16681,6 @@ olk4si
oll1ac
ol4la4d
ol2l1ak
-ol4lang
ol4lau
ollä2
ol2läd
@@ -15558,104 +16690,123 @@ ol4l1ec
ol2lei
oll3ein
ol3lem
+ol3lere
oll3erh
-oller4k
-oll3erl
-oll3erw
+oller2k
+oll3er2l
+ol2l3erw
+ol3les.
oll3ess
ol2lic
-ol4li4st
+olli4st
+ol4lk
ol2lo2c
ol2lo2g
ol2lop
ol2lö2
-olls2
+olls4
oll3sa
oll3sp
ol2lu
ol3lus
-4olo
ol2of
-olo1p
+oloni2e
+olo3p
ol1ort
olo3st
+olo3t
ol2ov
ol3s2k
+ols4t
ol3te
ol3t2h
ol3ti
o1lu
-olu2th
ol2y
4o3lys
ol2z1a
-ol3zan
+olzer2
ol4z3ern
+ol2zers
ol2zim
+ol2zin
ol2zo
ol2zw
ol2zy
-2om
-o2mab
-oma2bl
-o2m1a2ge
+2o2m
+o3ma
+o4ma2bl
+o4m1a2ge
om1alg
om1all
-oma4n3er
-o2m1ang
+o5man.
+oma2n3er
+o4m1ang
+omani2e
om2anr
-o4mante
-o2m1ap
-o2m1ar2s
-o2m1art
-omar4te
-o2m3a2sy
+o4m1ap
+o4m1ar2s
+o4m1art
+omar2te
+o4m3a2sy
omat2i
o4matom
-o2m1au
+o4m1au
o3mä
-o2meb
+o3me
+o4meb
om1ebe
-o2m1ef
-o2m1ei
-o2mel
-o3meld
-omen5t6an
+o4m1ef
+om1ei
+o4meis
+o4mele
+omen3t4an
o4mep
omer2
+o5mer.
om1erh
-o2meru
+o4meru
om1erz
-omi2c3
+o4mex
+o3mi
+omi4c3
+omi2e
omiet1
-o3mig
+omil3l
om1ind
om1ing
-om1ins
-o2m1int
+o4m1inn
+o4m1ins
+o4m1int
+o4miso
+om2it
om3ma
-om3mä
om3m2e
om3mu
3omn
-4omo
-o2m3oa
-o2m1org
+o3mo
+o4m3oa
+o4m1org
om1o2ri
+o4mox
+o3mö
+ompani2
om3pf
oms2
om3sk
-om3t2
-o2mum
+omt2
+om3th
+o3mu
+o4mum
o4munt
-o3mus
+o3my
2ona
on3a2b
on2ac
ona3g
o3nal
on3ann
-onan6z5ei
+onanz3ei
o2n1ap
o2n3arb
ona3th
@@ -15665,31 +16816,34 @@ o4n3at4t
on2au
2onä
on1äh
-2onc
on2dan
-onde8rers
-onderer7t
+onde4rers
ond1r
on2dra
-on4drin
+on2drin
+on2d3rü
ond3sk
2one
+o2n1e2b
on1ec
o3nee
o2nef
+one3h
o3neig
on3ein
+on3ele
on1ema
-one2n1
+one4n1
o4n3ends
on2eng
+onenz4
on1ep
o3ner.
on1erb
o2n1erd
-oner4fa
+oner2fa
o2nerh
-on4erka
+on2erka
on1ers
o3nett
on2eu
@@ -15697,58 +16851,66 @@ on3f2
on3gl
ong4le
ong4r
-ong3s
+ong3s2
on2gue
-4o3ni
-on2i3d
+2o3ni
+oni3de
onie3g
oni2ga
-on4ik
+o4nikan
+o4nikb
+o4nikf
+o4nikg
+o4nikk
+o4nikl
+o4nikm
+o4nikp
o4nikr
+o4niks
o4nim
o4nind
o4ninh
o4nins
-on3k4
+on3k2
3onke
+onk4n
onli2
-onli6n
onlo2c
onna2
-onna3g
-on3n2an
+on5n2an
on3n2e
2ono1
o3nod
o2nof
-ono2i
o2n3oke
o3nom
-on1ope
on1orc
on3ord
ono3s
ono3t2
-onrad3
ons1a2
+onsau1
+onsch2
on2seb
onsen1
-onse2t
+on5seq
+onse4t
on4sho
+on5sic
onsi2d
+on5sim
ons3ing
ons3l
-ons1p
onst2a
ons3tie
onst4r
on3ta
on2t1eb
-on2te2l
-ont5end
-on4t3erl
+ont3end
+on2t3erl
on2th
-on4t3rat
+on2t3rat
+ont3s
2onuk
o3nur
2onut
@@ -15757,115 +16919,120 @@ on3v
o3ny.
on3z2
onze3in
-o1ñ
oo1c
ooch2
-oofs2
oo2gl
oo2k3l
oo2kn
-oo2mo
+oo4mb
+oo4mo
oo2ne
-o1op
+o1o2p
+oo3pa
oop2s
o1or
+oor3a
oor3d
oo4sk
+ooss4
oo2su
oo2t1a
oot1ei
oo2t1h
+oo2t3o
oo2tr
-oot2s1t
+oot2s3t
oot3t
oo2tur
2o1ö2
2op.
-o1pa
op3adr
op1akt
opa2le
op1ang
-2opax
2opä
-o1pec
-o1ped
-op1ef
-o1pei
-o1pek
+1ope
+2ope.
+2o3ped
+o4p1ef
+2opei
+2opel
2open
-o2pera
+2opep
+o2per
+o4pera
op1erh
-o1pes
-2opf.
+2o4pf.
op2f3a
op3fah
-op2fä
-o2pfe
+o3p2fä
+o4pfe
op2fem
op2fin
opf3la
-op1flü
+op3flü
op2fo
op3for
-4oph2
+2oph2
o3phe
-o1pi
-opi5a2
-opi3er.
-opi5ers.
-opie4r3u
+opi3a2
+opie2r3u
opin2
2opl
op3lag
-o2p5le
-o3p2n
+op3le
+op5leu
+op2ne
2opo
-opo2la
+opo4la
op2pan
op4pl
1oppo
2oppt
-2o1pr
+2opr
+op3rec
3o4psi
op3sz
-1opt4
+1opt2
2opte
op3th
+o4pti
+opt4r
+op3ty
o2pum
-2opy
-2o1q
+2o3py
+2oq
2or.
or1a
-2ora.
+2o3ra.
o1raa
2or3a2b
o2rabb
o2r3add
or3adr
o1r2ag
-o2rak
1orake
+ora4ku
o1ral
oral5l
o4r3alm
or4alt
or2am
-or3a2mi
+or3a4mi
o1ran3d4
or4ane
oran2f
oran2m
-oran4ze
-or3ap
+oran2ze
+or3app
2orar
o1r2as
-o2ratt
-2orau4
+o2r3att
+2orau
orau2s
-oraus6wa
+oraus4wa
or2av
-2o1raw
+2o3raw
o1ray
o3rä
or1änd
@@ -15873,41 +17040,44 @@ or1ät
orb2l
or1c
2orca
-or2ce
2ord.
2orda
ord1am
-or2dar
+or2d1ar
or2dau
2ordb
+or3de.
ord3eng
+ord3ermi
+or2d3erw
orde4s
or2deu
-or4d3ing
+or2d3ing
or2d1ir
or2dit
-1ordn
+1or4dn
or2do4
2ordr
+or4ds
ord3t
2ordu
2ordw
2ore
-ore2a
+ore4as
o2r1e2b
o2r1eck
-ore2di
-o5ree
+or1e2di
o3ref
or1eff
ore2h
-or1ei
+o2r1ei
o3rei.
o3reie
o3r2eif
o3r2eis
orems2
o3renn
+oren4ne
o3rep
o2r1er
o3r2ere
@@ -15916,12 +17086,12 @@ ore4th
o2r1eu
2orf
or2fac
-or2far
org4a
org2e
2orget
or3ghi
2orgia
+1orgi3e
or2gl
or3gla
or3gle
@@ -15934,41 +17104,46 @@ or3gne
orid3i
4o3rie.
o3rien.
-o6rienti
+ori4eng
+ori4enr
+o4rienti
+ori4env
o3rier
o3ril
+ori3m
or1ima
ori4mi
-2o3rin1
-o4r1ind
-o4rins
+2orin
+o2r1ind
2or4io
o2riso
2orit
2ork
-ork4r
ork3s
2orm
or2mam
-or4mang
-or4mans
+or2mang
+or2mans
orm3asp
or2m1eb
-or4m3erf
-or4m3er4g
+or2m3erf
+or2mer2g
or2mor
orm3ord
+orm3org
or2mum
ormu4n
or4muni
or4munt
-ormvol4
-ormwa5
-or2n1ac
+ormwa5r
+orn3ack
or2nal
or2nan
or2nar
+or2nau
or5ne.
+or4nei
+or5nes
or3ni
or4nin
or3no
@@ -15976,7 +17151,6 @@ or3no
o2r1ob
or3oly
oro3n2a
-or1ope
or1opf
o2ro2r
o3rou
@@ -15989,33 +17163,40 @@ orr4a
or3r2e
2ors2
or3s4a
+ors4c
+or3sche
or3sh
or3si
or3sk
+ors4t
or3sz
or2t1ak
-or2tan
+or2t1an
orta2r
-or2t1au
+or3te.
or2tef
orte4n
-or4ten5g
+or3ten.
+or2ten3g
ort3erb
-or4t3ere
-ort3erf
-ort3erg
-or4terk
-or4t3erl
+or2tere
+or2t3erf
+or2t3erg
+or2terk
+or2t3erl
+or3tes
or2t3e2v
or2the
+orti3en
or2tin
-or4t3off
+or2t3off
or2t1o2r
or2tö
ort3rad
-or4trau
-or4t3räu
+or2trau
+or2t3räu
ort3re
+or2tro
or2t1um
2o3ru
or2uf
@@ -16023,12 +17204,11 @@ or1uh
orum4s
o4r3un
oru2r
-o5rus3
+orus3
o2rü
or3z2e
orzel5
or2zw
-o1s
2o3s2a
os3ad
osal2
@@ -16042,76 +17222,107 @@ osch3le
ose1e
ose1in2
os2el
-ose2n
+ose3l2a
o2s1er2k
os2ex
2osh
+o4sh.
+os3hak
o3s2hi
+o4shö
+o4shs
os4hu
2osi
os2im
o3sk
+o4sk.
os2kal
+o4skb
o4ski
2os2kl
2os2ko
o4skr
+o4sks
+o4skv
o4sky
1osm
-os4mog
-2os2o
+os5ny.
+2oso
osol1
o2sö
2osp
-os1pec
-os3pero
+os3pec
+os5pfa
o3s2po
+os4pt
2oss
-os6s3ac
+o4ss.
+o4ssa
+oss2abb
+os2s3ac
oss3ala
oss3and
os4sä
-o6ssel
+o4ssb
+o4ssd
+o4ssel
o3ssem.
-oss5enke
+oss3enke
o3ssent
oss3enz
oss1ep
oss3er4b
-osser4e
-osser4f
+osser2e
+osseri2
+o4ssf
+o4ssg
+o4ssh
o4ssi
+os5sis
+os6sisr
+o4ssk
+o4ssl
+o4ssm
os2s1o2
-os2sp
-oss1pa
-os2s1t
+o4s2s3p
+o4ssr
+o4sss
+o4s2s3t
os2su
-os2t
-ost1a
+o4ssv
+o4ssw
+o4ssz
+o4st.
+ost3abl
o3stal.
-ost4art
-ost3aut
+ost1am
+ost3ang
+ost1ap
+ost1a2v
oste2n
+ost3engl
o4s3tep
o4sterd
oster3e
-ost5erwe
-oster8wei
+oster6weit
ost3eur
ost1h
o2stid
+osti3en
o2stin
-os3ton
-osto4s
+o3sting
+os4tö
ost3ran
o2st3rä
ost3re
ost3rot
os4tru
ost3uf
-2osu4
+2osu2
os1um
+osu4r
2o3sy
+osyri5
o3s4ze
2oß
o2ß1el
@@ -16123,17 +17334,15 @@ o2ß1ere
o2ß1erf
oß1is
oß1u
-2o1t
+2ot
o2t3abi
-ot1ah
+o2t1ah
o2t1ak
-o3tal
o3tam
ot1ant
o3tark
-o2tarz
-ota4s
-ot1ast
+ot1a4st
+o2t1att
o2t1au
o3tau.
ot2ax
@@ -16143,6 +17352,10 @@ ote1i
o4t1eib
o4t1eic
otei4n
+ote3in.
+ote3ine
+ot3einh
+ote3inr
o4t1eis
ot2el
ote4l1a
@@ -16150,24 +17363,21 @@ o3tem
o4t1emi
ot2em3p2
ote4na
-o4tentb
+otens4
+o2tentb
ot1erb
o4t1er2l
o4t1erw
-ot2es
+ot4es
ot2har
o2them
o2t1hi
-o2thr
-4oti
+o2thu
o2til
o2t1i2m
-ot2in
-ot3inh
-o4tl
otli4
ot2o
-oto3b4
+oto3b
ot3off
oto2ph
o2t1ö
@@ -16175,24 +17385,23 @@ otra3c
o3t4ran
otra4s3
ot3rat
-ot4rau
ot3re
ot3ric
ot4rig
ot3rin
-ot3rus
ot2s3at
+ot3sch
ots1o
-ots1p
-ots2pe
+ot2s3pr
+ot3sti
ot3s4tra
+ot2su
ott3akt
-ott3an
-ot2t1a2s
-ot2tau
+ot4t3an
+ot4t1a4s
ot2teb
-ot4terh
-ot4ter4k
+ot2terh
+ot2ter2k
ot2t1h
ot2tim
ott2o
@@ -16200,8 +17409,7 @@ ot2t3r
ot3t4ra
ot3t4ru
ot1url
-ouff6
-ou1f4l
+ou3f4l
oug2
ou4ge
ou3gl
@@ -16213,11 +17421,8 @@ ou2les
ou4li
2o1um
2o2u2n
-oung5
-oun4ge.
-oungs2
-o4up
-4our
+oun2ge.
+oung5s4
oure2
ou2ret
ouri4e4
@@ -16225,85 +17430,90 @@ ourme4
our4ne.
ou3sa
ous2i
-ou2s2t
-o4ut
+ousi2e
+ou3s4t
+1outf
ou3ti
3outp
out3s2
outu4
2o1ü
-o1v
ov2a
2ovel
o3ven
oviso3
2ovo
-2o1w
-o2w3al
+2ow
+o4w3al
o3wec
+ow2er
+o2wer.
o2wh
-o5wi
+o3wi
+owi3en
+ow4su
o2wu
2ox.
o1x2a
2oxe
o2x1el
+o2xid
2oxk
ox3l
-o1xo
o2x1u
-1o2xy
+1oxy
o1yo
-o1z2
+oz2
o3za
1ozea
2o3zen
-ozen4ta
-ozes4sc
+ozen2ta
+ozes2sc
2o3zi
ozir3
ozon1a
2ozy
-oz3z
-ór3
-órd2
-ö1b
-ö3b4a
+ó2k
+ór3d2
+ö3ba
+öb4au
öb2l
ö2b3le
ö2b3r
+2öc
ö1ch
öch3l
ö2chr
-öchs2t
-öch6st5ei
+öchs4t
+öch6st3ei
öchst3r
-ö1d
öde1r
ödi3
+ödienst6
1ödu
ö1e
-1öf
+1ö2f
+ö3fe
öf2fa
öf2fl
+ö3fi
öf3l
öge3le
ögen4s1
-ög3l
-ög3r
+ö2g3l
+ö2g3r
ög2s
ö1he
öhe4n1
-öhl2e4
+öhl4e4
öhre4
öh3ri
öh2s
ö1hu
ö3ig.
ö3isch.
-ö1ke
1ö2k2o3
-ök3r
+ö2k3r
ök2s
ö2l
3öl.
@@ -16319,29 +17529,30 @@ oz3z
öll1an
3ölm
öl2nar
-öl1o2
+öl1o
+ölo4f
öls2
öl3sa
öl3sz
öl3tu
1ölu
-ölz2w
-ö1m
+ölz4w
öm2s
ön2e
ö3ni
önizi1
önn2e
-öo1
-öo2ta
+ö3o2ta
öoti1
-2öp
-ö1pe
+2ö2p
+ö3pe
öpf3l
ör3a2
+öra4k
örb2e
ör2b3l
ör1c
+ör3de
ör2dr
ör3dra
ö2r1ec
@@ -16352,7 +17563,7 @@ oz3z
ö2r1ene
ö2rent
ö3r2erb
-ö2r1er2e
+ö2r1e2r2e
ö2rer2f
ö2rer2g
ör2erh
@@ -16366,209 +17577,208 @@ oz3z
ö2rim
ör2kl
örn2e
-örner4v
-ör1o
+örner2v
+ör1o2
örpe2
örs2e
ör3sk
ört2e
-öru4
+öru2
+öru4n
ö2r1une
-ö1s
ö2sa
2ösc
ö2sch3a
ösche2
-ö4sch3ei
+ö2sch3ei
+ö4schen4e
öscher4
-ö6sch5erf
-ö6sch5eri
+ö4sch3erf
+ö4sch3eri
ö2schi
ö2sch1l
ö2sch3m
ö2schn
ö2schw
+2öse
ös1ei
ö2sein
ös4en
ös4es
2ösl
-ös2o
ö2sp
ö3s2s
-ös4s1c
+ö4ss.
+ö4ssb
+ö4s4s1c
+ö4ssd
+ös3ses
ös3set
-ös4st
-ös4t
+ö4ssl
+ö4ssn
+ö4ssr
+ö4sss
+ö4s4st
ö2st1a2
-ös4u
+ös4te
+ös4un
ö1ß
ößen3
öß2ti
-ö1t
ö2t3a
öte4n1
ö2t3r
öt2sc
öt2tr
-ö1v2
-ö1w
-ö1z
+öv2
+öwe2
öze3
özes4
-1pa.
-1paa
+1p
+3paa
p1ab
p2abe
pab2l
pab4rü
2pabw
-1pac
-1p2ad
+3p2ad
+2padr
pa3el
-pa1fr
-1pag4
+pa3fr
+3pag2
pa3gh
pa1ho
-1pak
-pa3ke
-pa1kl
+3pak
+pa3kl
pak2to
-3pala
-pala3t
+3pal2a
+pala3t4
3palä
3pal2e
pa3l2i
-1palm
pal2ma
pal2mä
pal2m1o
2palt
pal2t1a
-pal4tei
+pal2tei
pal2tr
-pa2m3a
+pa4m3a
pa2nar
pa4n3at
pan3d
pand2a
pan4ds
pa2neu
-panf4
pang4
+2pange
pa4nisl
pank4
2panl
-2pann
panne2
pan4n3eb
4pannu
-1pa2no
+3pa2no
pan3sl
-pan3t2h
-1panto
+3pan3t2h
+3panto
2pantr
-panz2
+3panz2
pan3ze
-1pap
-papi2
-papieren8
-papie8r7end
+3pap
+papieren4
+papie6r5end
pap2pr
pap2s
papst1
-pa1q
-1para
-pa4r3aff
+pa2r3aff
par3akt
-pa4rant
+pa2rant
pa3rap
pa2rä
2parb
-1p2arc
+p2arc
par3d
-parer8geb
-1parf
-2parfö
-pargel6d
-1park.
+2parer
+parer2g
+2parg
+pargel4d
+3park.
park3am
-par4kau
+par2kau
+3parke
par4kr
-1parks
+3parks
par3m2
-par3ne
-1pa2ro
+pa2ro
2parp
-2parr
+4parr
4parta
3partei
-1parti
-1partn
+3parti
+3partn
3party
-par3z
-pa1sp
-pa2spe
-passer4
-pas6serg
-pas2s1p
-pas2t
+2parv
+2parw
+par3z4
+pas2e
+pa3s2p
+pa4spe
+passer2
+pa6ssio
+pas2sp
pa2ßu
+2pat.
pat1a
+pa5tag
pat4c
pa3t4e2
-2patel
-1pat2h
-1pati
-1pat4r
-1pau
-2p1auf
+pat2h
+3pati
+3pat4r
+3pau
+4p1auf
pa3uni
-2pausz
-1pav
-1pä
+4pausz
3päc
päck3er
3päd
-päde2
pä2d1er
-3pär
-3pä4s3
+3päs3
+pä4ss
+pä4ta
pä4t1e2h
pä4tent
pä4tep
pä4t3erb
pät1h
pä2to
-pä2tr
-pät5s
-2p1b
+pät3s4
+pät5st
+2pb
pbe1
-2p3c
-2p1d2
+2p1c
+p3ch
+2pd2
pda2
-1pe.
pe2a2
pea4r
pea4s
p1e2b
pech1
-1peda
-1peel
-pe2en
+3pech.
+3peda
+3peel
2pef
4p1eff
-1peg
+3peg
pege2l
pei1
-2peic
-1peil
+4peic
p2eim
-2peis
-1peit
+4peis
pekt2i
-1p4el
-3pel.
+3p2el
pe4l3ab
pe4lai
pe2l1au
@@ -16576,83 +17786,81 @@ pe2l3ax
pe2l1ä
pelb2
pel3d4
-3pele
pe4l1e2h
pe2l1er
pe2let
pe2leu
+pe4lh
peli2d
peli4n
-pe4l3ink
+pe2l3ink
pel3inn
-pel4ins
+pel2ins
pel3k
pel3l2a
pel3lä
pel3l4e
pell2i
pe2lob
-3pels4
+pels4
pel3sp
-pel3ta
-pel4zin
-1pem
-1pen
+pel3sta
+pel3t2a
+pe2lut
+pel2zin
pena2
pe4nas
pe2nä
pen3d2a
pe4nen1
+3penh
pe4ni2t
-pe2n1o2
-pens2
+pe2n1o
+pens4
3pen3si
pen3so3
+3pensu
pen3sz
pent2a
2pentw
penty2
pe2nu2
-pen3z
-1pep
+pen3z4
+3pep
pe3pi
+pept2
pe1ra
+4perad
pe2rak
-per2am
pe2r1ä
per1e2b
-perer4f
+perer2f
pe3r2id
-3pe3r4io
-1perle
-1perlh
+pe3r4io
+3perle
perra2
-per4r3an
+per2rad
+per2r3an
per4rä2
-per4ric
-per6rieg
-1pers
-2perse
-2persi
-3perso
-3persp
+per2ric
+per2rie
+3pers
+4persi
peru2
pe3run
-1perü
+3perü
perwa4r
pe3s2a
pese2n
-1pes5s2
-pes2t
+3pes3s2
pest1o
-pe4stop
+pe2stop
3pet
pet4r
-1pé
-4pf.
+2pf
p2f1ab
p2fad
-p2faf
+pf4ah
pf1ai
p2f1ak
p4f1am
@@ -16660,150 +17868,166 @@ pf1ans
p2fa2r
pf3are
p2f1au
-1pfä
-p2fär
+pf4av
+p2f1är
p2f1äu
4pfe.
p2fef
p2fei
pf1eim
pf1ein
+pfels4
pf1e2m
-p3fen.
-p4fener
+p2fener
p3fens
p3fent
+p2f1enz
p4f1ep
-pfer5a
-p4ferde
-pfer6pro
+pfer3a
+pfer4pro
pf4es
p2f1et
-pff4
pffa3
+pff4l
+pff4r
p2f1i2d
pf1inn
p2f1ins
+p2fl
pf1lam
pf4lan
pf4leg
pf3lei
pf3lo
+pf4lü
+4pf5lüm
+pf4lw
p2fob
p2fom
p2fo2r
pf1ori
-pf3r
+p2f3r
pf1ra
+pf4rä
+pf4ro
+pf5roc
+pf5roh
pf4rü
pfs2
pf3sa
pf3se
pf3sl
+pfs4t
pf3sz
pf3t2
pft4r
+p4fuh
p2fum
-2p3g2
+2pg2
+p3gl
pgra2
-1ph
-4ph.
+2ph.
phal4te
p1hand
-3phas
+3pha3s
p1hau
phä1
-3phän
-4phb
+4phär
+2phb
2phd
2p1hei
phen3d2
phe4n1e
phen3s
2ph1ers
-4phf
-4phg
+2phf
+2phg
p2hid
phik1a
-phi4kan
+phi2kan
+3phil
+phi2t
2phk
ph2l
-4phm
+2phm
2phn
p2ho.
p2hob
pho2s
2phö
ph2r
-4phs
+2phs
ph3t2
2phthe
phu4s
phu3t
2p1hü
3p2hy
-4phz
-p2i2a1
+4phyk
+2phz
+p2ia1
piab4
-pia3k
+pia5ka
pi4ali
-pia3n
+pi4a3n
piap2
+pi2ar
pia3s
pi1ce
-pi2e1i
-pi2el
-piel3a
-1pier
+pi2e
+pie1i
+piela2
+pieler4ke
+pi3ent
pie2ra
-pie4reb
-pie4rei
+pie2reb
+pie2rei
pies4
-1pig
+3pig
pi3gl
-1pil
+3pil
pi3le
-3pilo
-pil4zer
+pill2
+pil2zer
pil2zw
p2im
-3pin.
pi2nad
-3ping
-pingen4
+4pind
+pingen2
ping3s
-3pins.
3pinse
-pin3s2p
+pin3sp
pi2o
-pi3oide
pi3onu
pi3os
-1pip
+3pip
pi2pe
+pi4pel
3pirate
pi3ri
-3pirin
-1pis
+pi3s2k
2piso
-pis2t
+pis4t
pi3sto
pit2a
pi3t2h
pit2s
pit3z2e
pi2z1in
-2p1j
-2p1k2
+3pizz
+2pj
+2pk2
pku2
-1p2l2
+p2l2
2pl.
3pla
4p3lad
p1lah
+p4lak
pla3na
p4lau
-pla2y1
+pla2y
+3plä
2p3le.
ple1c
ple2e
@@ -16811,75 +18035,89 @@ p4leg
ple3n2
2p3ler
p4leu
+p4lex
2plig
3p4lik
p4liz
plo3n
2p3lu
-2p3m2
+plü2
+2pm2
+p3mö
2p1n2
-1p2o
pob2
2po1c
3pock
3pod
3poe
po2el
+2p1of
+3pog
2poh
-po2i
-po3id.
-po3ids
-3poin
+4poil
+3po2in
+po2it
+poka2le
3pol
po2lan
+po3lar
po2l1au
pold2e
+pol3f
po3li
pol3lo
-po3lo3p
-pol3z2
+po3lo5p
+pol3z4
pom2ph
-2pond
-pont2
+poni2e
+3pont2
po1ob
-po2p1ak
+3p2op
+po4p1ak
po2p1ar
-po2p3l
+pop3l
+po2pli
po3p2t
po1rau
+po3re
porf4
+pori2e
+pork4
3portal
-por2t1h
+por2th
3portio
3porto.
3portos
3portr
-por4tre
-por6tric
+por2tre
+por4t3ric
3posi
pos3s2
pos4t
po2sta
+post3ag
po2stä
-post3ei
-po6stein
+po2st3ei
+po5stei.
+pos6tel
po4stem
post3ra
-po2ta
+post3ri
pot1ar
3potä
3pote
pot2h
-po2t3in
+poti2e
+po2tin
pott1r
po2t1u
po3un
po2w
powe2
-po3x
+p2o1x
pö2bl
pö2c
-4p1p
+2pp
p2pab
pp1ang
pp1ans
@@ -16888,200 +18126,221 @@ p2pat
pp1au
ppe3e
p2p1ei
-ppe2l1a
+ppe2l1a2
ppeli5ne
+ppel3z
pp2e2n1
+pper3r
p2p1erz
-p2pf4
-pp1fr
+pp3fr
p2p1h
pp3he
pp3l
p4p1lac
p4plan
-p2p1lä
+p4p1lä
p2ple
-pp3oh
-p2p1ö2
-pp3p4
+pp1oh
+p2p3ö2
+pp3p
+ppp4f
p2p3ra
-p2p5rä
+p2prä
pp3ren
p2pri
pp3rol
pp3rot
-p2p3ru
-p4ps2
+pp3ru
+pps2
pp3sa
pp3sy
-ppt4
+ppt2
+ppt4r
p3puc
p2pul
p2p1um
-p2punk
-p3pur
+p4punk
ppyl2
-p2r4
-1prak
+p2r2
+2pr.
+3prak
pra4s3
pra5sp
-1prax
-p4rä
-1präd
-1präf
-1präg
-1präl
+3prax
+3präl
3präm
-1präp
+3präp
3präs
-1präv
-2pre.
-2prec
+4pre.
+4prec
3pred
-2pree1
+4pree1
pre2ei
2preg
-1prei
3preis
-prei4s3c
-prei6sei
+prei2s3c
+prei4sei
prei4ss
-prei4s3t
+prei2s3t
2preiz
-1prem
-pren4ga
+3prem
+pren2ga
2p3rer
-1pres
pre3sa
-press4e
-1preß
-pri4e
+press2e
+pri2e
2prig
pri2l1
-2pring
+4pring
prings4
-1prinz
+3prinz
+pr4io
+pri3o4n
+3pris
pri2t1
-priter4
+priter2
prit3t4
-1priv
-1pro1
+4pritz
+3priv
+pro1
3prob
pro3be
-2proc
-7prod
+3prod
3prog
3proj
-2pross
+3pr4om
+3prop
+pro3pe
+3prosa
+4pross
2proß
+3prot
prot2e
-3proto
-2prott
-pro3x
+prote3i
+4prott
+3prov
+3proz
2prö
-1prüf
-1prüg
-2prüh
+2pru
+2prüc
+3prüf
+4prüh
2prün
-2p1s
-4ps.
-ps3k
-ps1od
+2ps
+ps1ad
+ps2hi
+psi2e
p2sö
-ps4pi
-pss2
+pss4t
pst1au
+ps4te
p2stu
3p2sy
4psys
ps2ze
-2p1t
+2pt
pt1a
pt2ab
pta2g
+p2tana
p2t3a4t
+pt1ä
p3te.
p2t1e2b
-pt3ec
+p4t3ec
pt1ef
pt1ei
pt1emi
-4p3ten
+p3ten
p4t1en2g
p4t1ent
pt1ep
-pt3erei
+pt3ernt
pt1erw
pt1erz
p3tes
p3tet
p4teta
-p4t1e2ti
+p4t1eti
p2t1h
pt1id
pti2de
-pt1in1
-pto2mo
+pt1in
+pto4mo
pto4na
pto2p
pto2w
ptpo4
pt3r
+ptri4e
p2tro
-pt1s2
-pt3si
-pts4t
+pt3s2
+pt4sl
pt1uh
pt1um
p3tung
pt1urs
-p2tü4
+p2tü
+ptü4b
3p2ty
-pt3z2
-1pu
+pt3z
+ptz4w
pu1a
-pub4
+3pub
+pub4l
2puc
pu2dr
2p1uh
2puk
pu2kl
pu2k1o
+pu3la
pu2lin
pul2sp
-pul2s1t
+pul2s3t
3pulv
-2pulw
+4pulw
pum2pl
+3pun
4pund
pun2e
pun2s
-2punt
+4punt
3pup
2pur
pu2ra
pu2rei
+pur3m
pus2h
pu3she
-pu5t2e
-3put2s
-3putz
+pus3s
+3put
+put2e
+put2s
puzi3
-1püf
+2pü
+3püf
+pü4lei
pül3l
-2p1v
-2p1w
+2pv
+2pw
pwa4r
-3p4y1
py3s
py3t
-2p1z2
-qu4
+2pz2
+1q
+2qs
+qu2
+qu4ac
+qu4ar
+qu4at
quel4la
+qu4en
+qu4er
que3rel
-quer5n
que4te.
-1queu
+3queu
+qu4in
1ra.
r1aa
ra2ab
@@ -17102,10 +18361,9 @@ rab3erd
2rabg
2rabh
1rabi
-2rabk
r2able
ra2bli
-ra4b5lo
+ra2b5lo
2ra2br
2rabs2
2rabt
@@ -17114,24 +18372,26 @@ ra4b5lo
2rabz
ra2ce
2r1acet
-ra4cheb
+ra2cheb
ra2cho
2rachs
-rach6t5rä
+rach4t3rä
ra2chu
r2ack
1r2ad
r4ad.
-rada2
+rada4
ra2dac
ra4d1am
ra2dan
2radap
3radar
ra2de4i
-rade5s
+ra2d3end
+rade3s
3radf
-3radh
+3r4adh
+r4adi
3radio
4radit
3rado
@@ -17143,18 +18403,19 @@ r2af
raf3ahn
raf3ar
rafe2
-ra2f1er
+ra4f1er
raf3r
rag2a
-ragein4
+ragein2
rages4
2ragg
ra3g4le
4ragm
ra2gn
+rag5ne
r2ago
rahle4n
-5r2ahm
+3r2ahm
r1ahn
2ra1ho
4raht
@@ -17163,58 +18424,58 @@ r2ai
rail2l
2r3air
raka3
-1ra3ke
+1rake
2rakk
-3ra1k4l
-ra2kre
-ra2kro
+3ra3k4l
+ra4kre
+ra4kro
+ra4kt
2rakti
1rakü
2rakz
r2al
r4al.
-ra2la2
+ra2l1a4
ra4l3ab
-ral1ak
-rala4s
ra2lä
ral3b4
-3r4ald
+3r4a4ld
r4ale
-ra4l3end
-ra4lent
-ra4l5ern
+ra2l3end
+ra2lent
+ra2l5ern
ra3lex
r4ali
ra2lid
rali3er
-ra4lin4d
-ra4l3ing
-ralin6sp
-ralin4t
+ra2lin2d
+ra2l3ing
+ralin4sp
+ralin2t
2r3alk.
2r3alm.
2ralp.
4ralpe
r4als
+ral3sc
ral3su
r3alt
3r4al3t2h
ra2l3u
-3raly
-ra2mei
-ra2mer
+3r4aly
+ra4mei
+ra4mer
r2ami
r2amm
-ram4man
-ram6mens
-ram6m5ers
+ram2man
+ram4mens
+ram4m3ers
ram4mit
ram4mu
2ramn
3ramsc
2r1amt
-ramt4s
+ramt2s
2ramu
2rana
ran1ad
@@ -17227,24 +18488,26 @@ ra2nau
r2anbe
r4anda
r4ande
-ran4dep
-ran4d3er
+ran2dep
+ran2d3er
3r2andi
rand3s
1raner
2ranf
+ra4ng
2ranga
-ran6g5e6be
+ran2gan
+ran4g3e4be
3rangi
r2angl
-rangs2
+rangs4
rang3sp
rani3e
r3a4nil
ran3ka
ran2kr
ran2kü
-4ranl
+2ranl
2r1anm
r2anmi
r2anmu
@@ -17254,8 +18517,9 @@ ran5ne
2ranr
2rans
r2ans.
-ran4spa
-4r5antei
+ran2sam
+ran2spa
+2rantei
r1anth
r2anto
2rantr
@@ -17268,9 +18532,10 @@ ra2par
2rapf
2rapo
ra2pok
-rap2pr
+ra2pos
+rap4pr
2r3a2pri
-2r1aq
+2r1a2q
r1ar
r2ar1a
2rarb
@@ -17280,94 +18545,112 @@ raren1
rar3et
rar1e2v
r2arf4
-ra3rie
rar3in
ra3ris
r3a4rist
4r3arit
r2ark
+2rarm
raro2
ra2rom
+rar3r
2rart
2rarz
rar3zw
ra3s2
r4as.
+ra4sar
+ra4sb
ra4schl
+ra4sd
+ra5seo
+ra5sex
+ra4sf
+ra4sg
+ra4sh
+ra5shi
ra4sk
-r2asm
+ra4sl
+r2a4sm
+ra4sn
ras3si
-ras3sp
-r2ast
+r2as4t
ra4st3ei
r3asth
ra4sto
-ras3tri
+ras5tri
+ra4sw
2rasyl
2raß
1rat
+r4ata
ra2t1an
ra2t1ei
r3a2tel
+ra3tes
+3ratg
+r4ati
ra4tid
+rati2e
2ratla
2ratm
rat2o
2ratom
-rat4r
-r3att
-2ratta
+rat3r
+ra2tra
+rat4re
+rat5schl
+2r3atta
2rattr
4ratz
rat3ze
4rau.
3raub.
+rau2bri
4raue
rau3e4n
2rauf
-rau3fä
+rauf3sa
2rau3g2
3raum
-rau4m3ag
-rau5mes
+rau2m3ag
+rau2man
+rau3me.
rau2mi
3raup
4raur
2rausb
-3raus2c
+3raus4c
2rausd
-rau3se
2rausf
2rausg
-raus8gewä
+raus4gewä
2raush
2rausl
-rau2sp
+rau4sp
2rauss
-raus8sche
-raus3tr
+raus4sche
2rausv
2rausw
rau3ße
2raut
raut1r
-rau4tra
+rau2tra
rau4tro
-raut5s
+raut3s
1raü
r2ax
-raxi4s
+raxi4s3
r3axt
r2ay
-ray1o
r2az
räch4s
3r2äd
-4räf
-rä1fr
-4räg
+2räf
+rä3fr
+2räg
2räh
-4räm
+2räm
3rän.
3räni
3räns
@@ -17377,22 +18660,24 @@ rä1fr
r2är.
rä3ra
rä1ro
-rä2sc
+rä4sa
+rä4sc
räse2
rä5sse
rä2st
+räs6tel
3rätse
4rätz
rä2u
4räue
räu2s
-räus2c
-räu7schen.
+räus4c
+räu5schen.
2räuss
2räuß
4räut
2räx
-4r1b
+2rb
r2b3a2b1
r3bac
rba4del
@@ -17413,10 +18698,9 @@ rbe3int
r4belä
rbel2o
rbe3r2e
-rber6gin
rb1erl
rbe3rum
-rbe5sl
+rbe3sl
r2bim
r2binf
r3bit
@@ -17425,8 +18709,8 @@ rbi3tu
rb2la
rb4la2d
r2blan
-r8blasser
-r4b3last
+r4blasser
+r2b3last
r3blat
r3blau
r2b3le.
@@ -17441,21 +18725,22 @@ rb2ob
r2bonk
rb3ras
rb3rea
-r8b7rechts
+r4b5rechts
+rb4ri
rb4sam
rb2sei
rb2ser
rb2s1o
rb4stä
-rbs3tri
rb2su
rb4sz
rb2u
rbü4b
2rc
r1ce
+r2cer
r1che.
-r1chen
+r1che2n
r1ch2i
rch3l
r3chlo
@@ -17465,12 +18750,10 @@ rch4ro
rchs4
rch3sp
rch3t2a
-rchter6r
-rch1w
+rch3w
r1ci
r1cl
-r1ç
-2r1d
+2rd
rd2ac
r2daf
r2d1ak
@@ -17483,7 +18766,6 @@ rd1ara
rd1ark
r2darz
rdär2
-r3de.
r3dee
r2dei
rd2ei.
@@ -17491,18 +18773,21 @@ r2d1elb
r2de2le
r2delf
rdels2
-rdem6
+rdem4
+rde3nar
rden3d2
-r4dengl
-r4dents
+r2dengl
+r2dents
rde3ob
rde3ono
rde3r4er
-rderin6s
-r4d3ernt
-r3des
+rderin4s
+r2d3ernt
+rder3w
rde3sp
r2d1e2x
+rdie3ne
+rdien4sta4
r2d1inn
rd1iri
rd1ita
@@ -17516,127 +18801,138 @@ r2dö
rd3rat
r2drau
rd4ri
+rd5ric
rd5ris
rd4rö
r3d4rü
+rds2a
rd2sän
rd3s2k
rd3s2z
-rdt4
-rd3ta
+rd3t2a
rd3th
+rdt4r
rdt2s
r2d1uk
-rdwa6r
+rdwa4
1re
3re.
-rea2d
-rea6l5erw
+re2ade
+rea4l3erw
4re2am
+re3as
re3at.
re3ats
reatu3
2reä
re2b1a
re2b1l
-reb1r
-reb3ra
reb3so
rech3ar
4rechs
+rechter4
+2rechth
2reck.
2recki
+reck2st
+re4ct
3red.
4redd
-2redi
+re2del
+rede3r2
+2redi1
re2dik
3redn
3redu
re1ebe
re1el
re1em
-ree4mi
+re1eng
re1er
3refe
4reff
r2eff.
3refl
-3refo
+3re3fo
3reg
-rege4l3ä
-regene7ra
+rege2l3ä
+regenmas5
4r1egg
re2hac
re2h1ar
-re4hen4e
-re4h3ent
+re2h1ei
+re2hen4e
+re2h3ent
re2hi
reh1l4
re2h1o
re3hol
3rehö
+2rehr
+reh3re
+reh1ro
reh4th
re2hü
r2ei.
r2eib
+rei2bei
rei4bel
-rei4ble
+rei2ble
+reib1r
+rei2bra
r2eic
-2reid
+2rei3d
r2eie
4reier.
-rei4fei
-4reifel
+reier2t
+rei2fei
2reig
3reigä
3reigeh
-r4eigel
-6reigens
+r2eigel
+4reigens
3reigi
4reign
3reigru
+r4eih
rei3l2a
rei3l2i
2r1eilt
-3reim
reim2p
r1ein
2rein2a
rei3nal
2reinb
-rein4du
-rei3n4ec
-reinen5
+rein2du
+rei3n2ec
+reinen3
2reinf
rein4fe
-re4info
+re2info
2reing
2reinh
4reinn
4r3einr
2reins
4reinsa
-rein6sel
-rein8s7tre
+rein4sel
rein4sz
2reint
-rein6teg
re1in2v
2reinw
2reinz
-4reisar
-4reisb
+2reisar
+2reisb
2reisf
2reish
2reisr
-reister6
4reisu
+2reisv
2reisw
-reit3s2
+reit3s4
3rek
4re2ke
4rekk
-5rekn
2rekz
r2el.
r2ela
@@ -17653,8 +18949,8 @@ reli1
2relit
2relix
r2ell
-rel4lar
-rel4lei
+rel2lar
+rel2lei
re3lo
r2els
2relt
@@ -17666,9 +18962,9 @@ re2m1ei
re5men
2remi
re3mig
+r2emit
2rempf
rems1c
-rem4str
2rem2u
r2en.
r2ena
@@ -17681,33 +18977,37 @@ re2nä
r1endg
3rendi
ren3dr
-4renerg
-4rengag
-ren4gan
+2renerg
+2rengag
+ren2gan
2rengp
3renh
re2ni
+re3nik
3renm
-ren4nar
-ren6nene
-ren6sein
+ren2nar
+ren4nene
+ren4sein
rens2p
+r4ent.
2rentd
-6rentera
+4rentera
2rentf
3rentfo
2rentg
-r3enthä
2r1entl
+rentmo4
2r1ents
-2r3entw
+3rentss
+2rentw
2rentz
r2enz
-ren6z5er6f
-renzer6l
-ren6z5er6s
-renzer6w
-ren4z3in
+ren2zan
+ren2zer
+renzer4f
+renz3er4s
+renzer4w
+ren2z3in
ren2zw
re2ob
re3or
@@ -17722,98 +19022,101 @@ re2pis
3r2er.
rera2
2r1erb
-3r4erber
+3r2erber
rer2bi
-2r1erd
rere2
-4r3ereig
+2rereig
r1erek
re2r1ep
-r2erer
+3r2erer
r1erf
-r3erfa
4rerfah
+r4erfe
2rerfi
2rerfo
r2erfr
-rer2fü
+r3er2fü
r1erg
-4r3ergeb
-5rergebü
-r4ergen
-3r4erges
+2r3ergeb
+3rergebü
+r2ergen
+3r2erges
2rer2go
rer2gr
-r4ergru
+r2ergru
r1erh
rer2hö
re3ri
re4rid
r1erk
-rer4kan
+rer2kan
rer2ke
4r3erken
3r2erki
3r2erko
+r2erkre
r1erl
2r3er2la
5r4erlag
-r3erleb
+2r3erleb
r2erli
2rerlö
-2r1erm
+r1erm
+3rermo
rer2n
2r1ernä
-r1erne
-2r1erni
+r1er3ne
+2r1er4ni
4r3erns
-4r1ernt
-re1ro
-re2rob
-re4rosi
+4r3ernt
+re2rosi
2r1er2ö
r1erre
rer4reg
-rer4rei
+rer2rei
r1erri
-5r2ers.
+3r2ers.
2r1ersa
-r6erschi
+rer5scha
r2erse
2rersp
-rer4sta
-r6erstad
-2rer6su
-r1er3t4
+rer2spa
+rer2sta
+r2erstr
+2rer4su
+r1ert4
r2erte
2rertr
+rer3tu
r1erw
-rer4wac
-rer4wec
-r4erwes
+r3erwa
+rer2wac
+rer2wec
+r2erwes
2r1erz
rer2zä
3r2erzy
3r2es.
re2sa
re4sam
-resche4
-re4schw
-3rese
-re4se2h
+resche2
+re2schm
+re2schw
+rese2h
res1of
3resol
3reson
-res2po
-2ress
+2re4ss
4resse
res3sei
-res6s5erw
-res4sto
+res4serh
+res4s3erw
+res2sto
4ressu
-resten4
-re6stent
-re4stra
+res6tau
+re4stent
+res6tex
+re2stra
2restu
3resu
2re2ß1
@@ -17823,46 +19126,50 @@ re2tau
ret2e
2r1e2th
re2tra
-re4trol
+re2trol
re2u
reu4eri
reu3g2
2reul
re3uni
-2reur
-4reuu
+2r1eur
+reu2zei
2reü
4r3eva
2r1evid
rewa4r
re2wi
-2rewo
+4rewo
2r1e2x1
3rez
2rezi
1ré
-4r1f
+2rf
rf1ack
-r3fahre
-r5fahrt
+r3fahrt
rfall4s
+rf3aue
rfäs3
rfe2i
r2fent
+rfer3g
r3f2es
rff2
rffa3
rf3fe
-rfi4le.
-r4fland
-r3f4lä
+rfi2le.
+r2fland
+rf4lä
rf3lic
rf4lö
+rf4lu
r3flü
r2fo2b
rfolg4s
-r5foli
-r4frauc
+r3foli
+r3fon
+r3form
+r2frauc
rf4ru
rf4rü
rf2sa
@@ -17871,34 +19178,38 @@ rf2s1ä
rf2su
rf2ta
rft4r
-rf2u
-rfzu3
-2r1g
+r3f2u
+2rg
r2g1a2d
r2g1ah
r2g1ak
-rga4ner
+rga2ner
r2g1ap
r2garb
rg3art.
r2g1ask
-rgas2t
rga5stes
+rg4at
rgd2
rge4an
rge2bl
+r3gebo
r2g1e2c
-r3gel
-r4gelef
-rge4l3er
-rgen4z3w
-r4ge4tap
+rg1ein
+rge2l3er
+rge2li
+rgen2ge
+rgen2z3w
+r3ges
+r2ge4tap
r2geto
-rgi4sel
-rg2lad
+r3gew
+rg2ins
+rgi2sel
+r4gl.
r2glan
r3glanz
-rgleich8s7
+rgleich4s5
r2gleu
r2glig
r2g3lit
@@ -17917,109 +19228,123 @@ rgö2
r2g1öd
r2g3ral
rg4rau
+r2grän
r2greg
r2g3res
r2gret
rg3rin
-rgro5sse
-r3grun
+rgro3sse
+r3grö
+r3gru
rg3rüs
+rg3sä
rg3se
rgs2ei
rg4sel
rg3s2i
-rg1sp
-rgs2pe
-rgs2po
-rgs4ti
-rgs2tu
-rg1su
-r1h4
+rg3sp
+rgs4pe
+rgs4pi
+rgs4po
+rgs4tr
+rgs4tu
+rg3su
+r1h2
2rh.
r2hag
2rhah
2rhak
-r4haltb
+r2haltb
r3han
2rhau
2r3hä
-3r2he.
+r2he.
r3hea
2rheb
2rhef
+rh4ei
+2rheit
+2rher
2rhi
+2rhof
+rho2i3
2rhol
r3hop
2rhot
2rhöl
2rhs
-2rhü
+2r3hü
1ri
+ri3ams
ri1an
ri2ano
+ri1as
ri2ast
rib2bl
ri1ce
ri1cha
ri3chl
-richt8spo
-3richtu
+rich3ter
+richt4spo
+4rick
ri2con
ri2dau
2ride
+r2ide.
ri2d3e2l
-ri4dent
+ri2dent
r2i3di
2ridol
rid3r
2ridy
r2ie
-rieb6ste
+rieb4ste
4riefm
rie2f3r
rieg4s3
ri2e1i
-riein1
ri1el
rie3l2a
ri3els
ri4enä
+ri2enb
riene2
-ri3eni
rie2nu
ri1er.
rie3r2e
riere4n
ri3ers.
ri1eu
-ri2f1a
+ri2fa
ri2fä
ri2fei
-ri2fer
-rif6f5end
-rif4fer
+ri2fer3
+rif4f3end
+rif2fer
ri2f1o
-ri2fr
-rif4ter
+ri4fr
+rif2ter
3rig
4riga
4r3i2gel
-ri4gene
+ri2gene
4rigg
-5rigj
rig1l
ri4glä
ri3g2o3
-4rigr
-4rij
+rigs4
+ri1i
+rii4t
ri2kar
ri2kä
ri2kin
ri2kn
-ri4kone
+ri2kone
ri2kor
+ri4kt
+ri3kü
2rima
-ri2mag
+ri4mag
ri2me.
2rimm
4rimp
@@ -18031,8 +19356,7 @@ rin2c
ri3n2e
rine1i
2r1inf
-rin2fo
-3r2infr
+3rinfr
r2ing
rin2ga
ring3le
@@ -18046,80 +19370,86 @@ rin2kl
rin2ko
rin2kr
2rinl
-6r5innenm
-4r3inner
+4r3innenm
+2r3inner
2r1innr
r1innu
+ri3n2o3
4r1in2q
2r1ins
rin2si
rin2so
-r4inspi
+rin2spe
+r2inspi
+rin3str
3r2insy
2rint
4rinte
-rin6tent
+rin4tent
rin4t5re
2r1inv
rin2va
2rinz
ri2ob
r3ion
+r4ior
ri3o2st
ri2pl
ri3po
-4r1ir
+2r1ir
r2is
ris2a
ri3s4an
-ri4sch3o
-ri4schw
+ri2scho
+ri2schw
3risik
ri3s2ko
r3iso
ri4s3p
+ris5pi
r3isr
3riss
-ris2t
-rist5ers
-ristes4
+rist3ers
+ristes2
ri2st3r
3ri2ß1
r2it
-r3i2tal
+2r3i2tal
rit3ant
rit2i
2ri3t4r
-rit1s
-rit4t3au
+rits2
+rit2t3au
rit4tei
3ritter
-rit6ter6f
+rit4ter4f
rit2to
rit2t3r
+ritt2so
rit2u
-r1i2tum
+r3i2tum
rix1
ri3xi
1rí
-2r1j
-4r1k
+2rj
+2rk
rka2b3l
-rk1ah
+r2k1ah
r2k1ak
rk1all
rk2am
rk1are
rk1asp
+r2k1att
rkauf4s
r2k1äh
-r3kel
-r4kelem
+r2kelem
+r3kell
rke2n1
-rken4er
+rken2er
r2k1er2l
-rk5ersta
-r2k1er4w
+rk3ersta
+r2k1er2w
r3k2es
r3ket
rk1im
@@ -18128,8 +19458,10 @@ rk4lau
rk4lim
r2klis
rk2lo
-rk2lu
+rk4lu
rk4ne
+rk5neu
+rk5ney
r2kob
r3kol
r3kon
@@ -18148,21 +19480,20 @@ rk2sel
rk2ser
rk2so
rk2sp
-rk3spi
-rkstati6
+rkstati4
rk4stec
-rk4stoc
+rk2stoc
rk2ta
rk2tel
-rk4t3eng
-rk4t3erf
-rk4terg
-rk4t3erl
+rk2t3eng
+rk2t3erf
+rk2terg
+rk2t3erl
rkt3ers
-rk6tersc
-rk4t3erw
-rk4t3erz
-rk4teta
+rk4tersc
+rk2t3erw
+rk2t3erz
+rk2teta
rkt2i
rk2t3in
rk2t1o2
@@ -18172,28 +19503,27 @@ rk2tum
rk1ums
rku2n
r3kup
-r3kus
+rkur3s
rku2sa
rkus3s
-rku2s1t
+rku2s3t
r2küb
2r1l
rl2ab
r3lag
-r5land
-rlan4d3i
+rlan2d3i
r2l1ar
-r2l1a2sc
-rlas2t
+r2l1a4sc
+rlas4t
r2l3aug
rle2a
r3lec
-r5lei.
+r3leg
r3lep
rl2et
r3lex
-rlg4
r3l2i
+rlicht6e
rli4ne.
r3l2o
rlou1
@@ -18204,36 +19534,35 @@ rl2spr
rl2sto
rl3t
r3l2u
-rlus2t
-rlu6ster
-rlu4str
+rlus4t
+rlu4ster
+rlu2str
r3ly
-rlz2
-4r1m
-r2mab
+rlz4w
+2rm
r2m1ad
rma2la
rm1ald
+rmali3e
rm1ami
r2m1ank
rm1anz
r4m3aph
r2marc
r2marz
-r3mas
rma4spe
-rmas3se
-rma5ssen
-rmas8sens
+rma3ssen
+rmas4sens
rmat2o
-rm2är
+rm1aus
rm3d2
-r4m3einh
+r2m3einh
rme4na
rm2ene
r2ment
r2meo
-rmer4fo
+rmer2fo
+rm1erg
r2m1erh
r2m1erl
r2m1erp
@@ -18243,25 +19572,26 @@ rme3sa
rme3st
rmeta2
r2mide
-rmi6nanz
-rminen4
-rmi6neng
+rmi4nanz
+rminen2
+rmi4neng
+r3minh
rm3m
-r4mn
r2m1ob
rm1o2ri
rm3p2
-rms2
rm3sa
-rm3sk
+rm3s2k
rm3sta
rm3t
rmt2a
rmu2n
r4muna
r2muni
+rmwa4
2rn
rna2b
+rn3ab2i
r3nad
rn4ade
r3nage
@@ -18273,57 +19603,60 @@ r2nanz
rna2r
rn3are
r4n3ari
+rn3arra
r4n1a4st
r4n3att
-r2nau
rn3aug
rn3de
rn3d4r
-r4nef
+r2nef
+r3neho
+r3nei
rn2eid
r4neif
r4neis
+r2n1elf
rn1ema
+r2nemu
rne2n
r2n1ene
rn2eng
-r4n1e2p
-r4n1erg
-rn4erhi
-rner4ke
-rner4ku
-r4n1erl
-r4n1ert
-r4n1erw
-r4nerz
-r5nes
-rn2e2t
-rnet1e
-rne4tem
-rne4ter
-rne4to
+r2n1e2p
+rn1erg
+rn2erhi
+rner2ke
+rner2ku
+r2n1erl
+r2n1ert
+r2n1erw
+r3nes
+r3n2e2t
+rne4t1e
+rnet3r
rn2eu
rne3uf
-r4nex
rn3f
rn3g2
-rngene4
r2nid
r2n1in
r4ninf
+rn2ing
r3nit
rnk2
rnn2
+rn1ob
+rn2obr
r3nod
rn2oh
r2n1op
r2n1or
+rno2w
rn1ö
rnö2d
rn3sa
rn3s2ä
rnse4ha
-rn3s4p
+rn3s2p
rns2u
rn3s2z
rn3t2a
@@ -18332,9 +19665,11 @@ rn1ur
r1nü
r1ny
rnz2
+ro3ar
+ro3as
r2oba
2robj
-1robo
+1r2obo
ro2bo2r
2robr
ro2bre
@@ -18343,10 +19678,12 @@ ro1ch
roch2a
3rock.
r2o3de
+rodi4e
rod4r
-roe4
+roe2
+ro2ed
+ro4fen
2roff
-ro3fl
4rog.
ro3g2a
3rogg
@@ -18355,26 +19692,31 @@ roh1l2
4rohn
ro2hö
3rohr
+ro4hs
1roi
ro3in
+ro2it
rok2l
ro3le
ro2liv
-rol4lan
+ro4ll
+rol2lan
rolle4
roll4en
-rol6lerg
-rol6lerw
-rolli4n
-rol6lini
+rolli2n
+rol4lini
+rol2lis
+r4olo
2roly
4rom.
-ro2mad
-ro2mal
+ro4mad
+ro4mal
3roman.
2romb
+ro4mei
romen3e
-ro2m1er
+ro4m1er
+ro5mes
4romm
2romn
4romt
@@ -18382,140 +19724,155 @@ r2on
ro3n4ab
ro2nan
3rond
-ro4nerb
+ro2nerb
+roni2e
+ro2nika
+ro4niki
4ronk
3ronn
-rons2
ron4tan
-ron6tend
-ron2t3r
+ron2tel
+ron4tend
+ron2tr
ron2t1u
ro1ny
-ro1o2f
+ro1o4f
rop2a
2rope
-2ro2pf
+2ropf
1ropl
+ro3pn
2ropt
r1or
ro2r3al
ro2rat
2rorc
ro2rel
+2r3orga
ro2ro
ror3th
rort4s
ror2ü
+ro3se
ro3sh
ro3s2i
-ros2p
+ros4p
+ros6sac
ross1c
ros4st
+ros4t
ro3sta
-ros3tel
+ros5tel
ro2st1r
ro2sum
4r3osz
roßen2
-ro4ßenk
+ro2ßenk
ro2ßi
ro2ßu
ro2tan
-rot3au
+ro4t3au
ro2tä
ro3te
-ro2te3i
-ro2t1ho
-ro2tru
-rot1s
-rots2o
+ro2tei
+rot3s2
+rot2ta
3roul
ro3unt
-3rout
-2ro1x
-4roy
+ro4up
+3ro4ut
+2rox
rö2b3l
rö2du
-2rö2f
+2röf
+rö4fe
3röh
2r1ök
1röl
2röl.
rö3le
+rölla4
r1ölp
3römi
r1ör
r2ös.
rös1c
-r2ö3se
+rö3se
1rösl
+rös6tel
3rötu
-2r1p2
+2rp2
r3pa
-r3pe
-rperer5
+rper1e
+rperer3
rper3in
-rpf4
+r3pf2
+rpf4l
+rp4fu
r2pli
rp4lu
r3po
-rpo4str
+rpo2str
+rp4rä
+r3pri
+r5prod
+r3prü
rp3se
-rps1t
-r4p3t
+rps3t
+rp3t
r3pu
-2r1q
-4r1r
+2rq
+2r1r
rr2ab
rra4s3s
-rr4at
rrat2s
rr1auf
rr1äm
rrb2
rr1c
r5rega
+r5regl
rr2ei
rre2le
rre2pa
rrer2
r2rerh
r2rerl
-r3res
-rres2t
rre2ve
r4rezi
-r3r2hen
+rr2hen
rr2hos
-rr4i
+rri3erm
rri3k2
+rr4is
rrm2
-rrn3au
+rr2n3au
rr2o
rr3obs
-rro3m
-rro2re
rr2th
r3r2u
r3r2ü
+rrücker4
rrz2
-6r1s
+2rs
r3sabo
-r2sa2d
+r2s1a2d
rs2al
+rsa4lin
r4samp
r4s1amt
rs2an
rs3ana
-r4sanf
-r2s3ang
+r2sanf
+rs3ang
rs3anm
-r4sanp
rs3ar
-rs4ark
-r4sarm
-r4sch3e4b
-r6scherl
+r3s4ark
+r3sau
+rsch3e4b
+rscheiner5
+r3schen
+r4scherl
r5schu
r5schwu
r5schwü
@@ -18523,17 +19880,19 @@ r2s1ebe
rse2e
r2s1ef
r2sein
+r5seit
rse2n
rs2end
rse4ne
r2sepi
rs1ere
-r2serh
+r2s1erh
rs1ers
r2serz
rse2t
rs1eta
rs2ext
+rsha4k
r3s2hav
r3shir
r3sho
@@ -18545,159 +19904,168 @@ rs2kel
rs2ki
r4skir
rs2kl
+r4skn
r4skor
r3s4kri
r4sky
-rs4mog
-r3s4no
+r3smog
+r3s2no
rs4om
-r2sop
-r4s3ort.
+r2s1op
+r2s3ort.
rso4s
rs1ost
-rs2p4
+rs2p
r3span
rspa3s
+rs4pel
r2s3ph
-r3spi
+r3sphä
r3spl
-rs4por
-r2spun
r2sput
+r3spü
rs3s2
+rss4t
rst3abl
-r5stad
+r3stad
rst3ala
-r4stale
-r4stans
+r2stale
+r2stans
r4stant
r2stas
-r3stat
-rs2tau
-rs2tea
-rs2tee
-rst5eing
-r6st5eint
+rs4tea
+rs4tee
+rst2ei
+rst3eing
+r4st3eint
r4st3emi
rster2
-rst4erb
-r6sterbt
+rst2erb
+r4sterbt
r4st3erl
r4sterö
-r4st3erw
-rs2t1h
+r4st3er4w
+rst1h
rst3ing
r2stip
r2stit
-rs2tob
-r2s1tot
-r6strang
-r4stris
-rs2tu
-rsuch4s
-r3suf
+rs4tob
+r2s3tot
+r2stran
+r2stris
+rs4tuc
+r3stü
rs2ums
rsü3s
r3sy
+r4szä
rs2zin
r1ß
-4r1t
+2rt
rt1abs
r2t1a2d
r2t3ae
+rt1aff
rt1akr
-r4t3albe
+r2t3albe
rta3l2e
r2t1all
-rtal4s3e
+rtals1
+rtal2se
rt1am
-r3t2ame
-rt1an
+r3tame
+rt1ann
+rt1ant
r2tanw
r2t1ar
rt3att
-r4tauft
+r2taut
rt3äh
rt1änd
rt1ärm
-r3te.
rte1e2
rt1ein
-rt4eind
+rt2eind
r4t3einh
-rte2is
+rte2i3s
r2telf
rte3li
-rtel6lei
+rtel4lei
+r2temo
rte2n1
-r3ten.
rte4na
-rten3s2
-r4t3ents
+rten3s4
+r2t3ents
rten3z
rteo2
-rt3erei
-r6tereig
-r4ter4fa
-r4ter4fo
+rt2ep
+r3ter.
+rter2fa
rt1erh
rt1erk
-r4t3er4la
-rter6mit
-r4t3ernä
+r2t3er2la
+rter4mit
+r2t3ernä
r2ter2ö
rter4re
rt1er4s
-rt4er5sp
+rt2er5sp
rt1erz
-r3tes2
+rtes2
rte3sk
+rte3sta
rt1he
-r2thel
r2t1hi
rt2hum
r2t1id
+rti2en
rtik2
r2t1ima
rt3inf
rt2is
rt2it
+rt3l
rt3m
r2t1ob
r3top.
-rto1pf
+rto3pf
rt1orc
r2torg
r3tork
+rt3ram.
rt3rams
rt3rand
rtra4s3
rt3rati
rt3rec
+rt3res
rt3ris
rt3rol
rt3roma
r3trop
r2trou
rt3sc
-rt4s1eh
+rt2s1eh
rts2el
rt3sex
+rts3h
rts3ing
rts1o
-rts1pa
-rt1spe
-rt4s3tan
rts4tie
-rt3t4
+rt2su
+rt3t
+rtt4r
rt1umb
rt2u3na
r4tunt
r2t1urt
rtu2t
r2t3ute
-rty1
-rt3z2
+rt3w
+rt3z
+rtz2a
+rt4zb
+rtz4w
1ru
ru1a
ru4ale
@@ -18705,15 +20073,20 @@ ru3a2r3
rube4
rub2i
ru3ches
-rucht3s4
+ruchter4
+rucht3s2
+ru3de
rude2a
ru2dr
ru2et
3ruf
-ru2f1a
+ru4f1a
ruff4
-ruf2s1
-ruf4ter
+ru4fo
+ruf2s
+ruf3sc
+rufs3p
+ruf2ter
ru2g3r
3ruhm
2r1uhr
@@ -18723,109 +20096,117 @@ ru1is
2rum
ruma2
4r3umd
-4r3umf
-4r3umg
+4rumf
+4rumg
ru2mi
-4r3uml
+4ruml
+rum2mes
+r2ums.
4r3umsa
-4r3umw
+4rumsc
+4rumw
4rumz
2r1una
2rund
run4d1a
-runden5e
-run4d3er
-run2e
+runden3e
+run2d3er
+runder4n
+runder5t
+run2do
runei2
+2r1unem
+run2en
4r1unf
run2ga
2rungl
+run2gla
4r1u2ni
r3unio
ru4nis.
run2kr
-4r1unl
-2r1unm
+2r1unl
+2runm
4runn
4runr
r1unse
4r3unt
4runw
2rupd
-ru3pr
-4r1ur
+rupi3
+ru5pre
+2r1ur
ru2ra
ru2r1e
-5ruro
r4us.
-ru2si
-rus2p
+rus4p
rus3sen
-rus2s1p
-rus6st
-rus2t
+rus2s3p
+rus4st
+rus6ste
ru2tab
rute4
ru2tei
ru2t1el
ru2t1er
-ru2t1o2
+ru2t1o4
ru2t3r
-rut6scha
-4ruz
-ru2z1w
+ru2z3w
1rü
2rüb
+rü4bc
+rü4bs
4rübu
rü1ch
-rücks2
-rück5sta
+rück3sta
+rü4fa
rü2hel
rüher2
rüh1l
4rümm
+rü4na
rün3z
rü3ss
rü4ssi
-2r1v
-r3ve
+2rv
rv2el
rve4n1e
-rvenen4
-r4ventz
-rve5s
+r2ventz
+r3veo
+r3ver
r3v2o
rv2s
-2r1w
+2rw
rwe4gel
-r3wei
-rwelt4s
-r5werk
-r5wert
+r5weis
+rwelt2s
+r3werk
+r3wert
r2wo.
r3woh
r3wort
rwun3s
-4r1x
+2r1x
1ry
2r1ya
+ry4an
ry2c
rygi3
-ry1la
ry2le
-ry1os
-ry3s2t
-rysti1
-2r1z
-rz2an
-rz3ant
+ry3os
+ry3st
+rysti3
+2rz
+rz2ans
r2zar
r2zat
rz2än
-rzell4a
-r5zene
+r3zeic
+rzell2
+r3zene
rz1eng
-r4zents
+r2z3ente
+r2zents
rze2p
rze2ra
r2z1erd
@@ -18833,10 +20214,11 @@ r2z1erf
r2z1erg
rz1erk
r2z1erl
+rz3ersc
r2z1erw
rzes2
r2z1ess
-rz1id
+r2z1id
rz1int
rzir3
r3z2of
@@ -18844,93 +20226,89 @@ r2z3ot
rz2tan
rz2th
rzu4g3l
-r2zwä
-r3z2wec
+r3z4wec
+rz4wer
r2zwir
-1sa
+1s
3sa.
3s2aa
2s1ab
sab2ä
4sabd
-sa2be
+sa2ben
3sabet
sa2bit
sa2bl
4sabm
sa2br
4s3abs
+4s3a4bw
4sacc
-5s2ache
+sa3chal
+5sache
sa2cho
-sachs2
sach3t
s2ack
-s1ad
-2s3ada
+2s1ada
sa2der
-2s3adm
-2s3a2dr
+2s1adm
+2s1a2dr
sa4fe
-4s3aff
-sa1f4r
-3saft
+4s1aff
+sa3f4r
+3s2aft
saf2tr
3sag
sag2e
-5sage.
+5sa3ge.
5sagen.
-4s3agent
+4s3a2gent
4s1agg
-sag4n
4s1a2gr
-3sahs
+sah3l
+s2ahs
3s2ai
sa3i2k1
-sail4
+sail2
sai4r
2s1ak
-sa2ka
+sa4ka
+sa5ka.
+sa5kar
sak2e
3saki
-4sakk
3sako
4sakt
+sa4kus
3s2al.
s2al2a
sa2l3an
-sa2lar
-sa3lat
+sa3l4at
+sal2ä
3s2alb
sal3bl
3s2ald
-sa4lerk
-3sali
-sa2l1id
+sa2lerk
+3sa3li
+sa4l1id
s1all
sal3la
-sal4le.
+sal2le.
sallo3
3sal2o
sal3or
sal2se
s1alt
-s2al3t2h
+s2alth
3salz
3sam
-s2am.
-s1ama
-4sa2mat
-s2ame
-4s3a2mei
-sa3men
-sa2min
-5s2amm
-6s3amma
+4s1a4mat
+4s1a4mei
+sa4min
+4s1amma
4s1amn
s1am3p4
4samph
-s2ams
s1an
s2an.
2sa2na
@@ -18939,12 +20317,12 @@ sa2nä
2s3anb
s2an2c
3s2and
-san4dan
-san4dri
+san2dan
+san2dri
sand3s
sa2ner
3sang.
-4sanga
+2sanga
2s3anh
3sani
3sanken
@@ -18956,39 +20334,47 @@ sa2ner
s4anse
san4sk
san3sp
-4santei
+2santei
4santr
-4s3anw
+2s3anw
2s3anz
s4anz.
s4anzt
2s1ap
sa2pe
s2aph
+sapi3
sap3p
3sapr
-2s1aq
+2s1a2q
2s1ar
3s4ar.
3sara
-4s3arb
+4sarb
3s2ard
+s2are
+s3area
3sarg
sar2ga
sa3rin
s2ark
+s3arm
sa2rom
s2ars
-4sart
-sa4r1u2
+4sarti
+sa4r1u4
+sas2a
s1asc
2s1a4si
-2s1a2sp
+2s1a4sp
+sa4ssenb
+sas4sest
+sa5s2set
4sa2sy
3saß
sat2a
satan2
-sa4t3ant
+sa2t3ant
sat1ei
2s3a2tem
s3ath
@@ -19000,11 +20386,12 @@ sa4tol
sa2tr
sa3ts
s3atta
-4s3attr
-3satz
-5satza
-sat4zel
-sat4z3en
+sat3te
+4s1attr
+s4atz
+3satza
+sat2zel
+sat2z3en
s1au
3sau.
3sauc
@@ -19017,23 +20404,22 @@ sau2gr
sau3h
3saum
3saur
+4s3aura
sauri1
2saus
-3saus.
4s3ausb
4sausf
4sausg
sau2sp
4sauss
-3sauste
4s3ausw
2sauß
s1av
sa2ve
sa2xi
sa3xo
-sa2y1
-1säb
+sa2y
+3säb
3s2äc
3s2äg
s1äh
@@ -19041,21 +20427,30 @@ s1äh
2s1ält
2s1äm
4s3änd
-4s3äp
+2s3äp
2säq
2s1är
3s2ärg
-sä4s3
+4s3ärm
+sä2s3
+sä4ss
sä5sse
3s2ät
-1säu
2säuß
-4s3b4
+2sb2
+s3ba
sba4ne
-sbau6men
+sbau4men
sber2e
+s3bl
+s3bo
+s3br
+sb4ra
+sb4ri
+s3bu
sbus3
-1sc
+s3bü
+sby3
2sc.
2scab
2scac
@@ -19066,188 +20461,193 @@ sbus3
2scat
s1ce
4s3cei
-6sch.
-5schaf
-5s2chal
+4s4ch.
+3schaf
+s4chal
sch3ana
-4schanc
-4schang
+2schanc
+2schang
5schanz
4schao
-4s3chara
-4sch3ar5m
+4schara
+sch3ar3m
s2chä
2schäq
2schb
2schc
2schd
sch2e
+3sche.
4schech
sche2f
-6schef.
-6schefi
-6schefs
+4schef.
+4schefi
+4schefs
+s4chei
4sch3ei.
-sch6ein.
+sch4ein.
+s2chema
4schemp
-sch5erfü
-sch5erla
+sch3erfü
+2scherk
+sch3erla
3sches
-4schess
+4sches2s
4schex
2schf
2schg
2schh
-schi4d
-schi4e
-4schiru
+2schi4d
+2schiru
3schis
+2schj
2schk
+s4chl
sch4lac
-4schle.
-6schlein
-4schloc
-4schlöc
-4schmas
-4schmed
+2schle.
+4schlein
+2schloc
+2schlöc
+2schmed
2schmö
-4schmüh
2schmy
+s4chn
2schn.
-4schneb
-4schnut
-4schobj
-4schorc
+2schneb
+2schnum
+2schnut
+3schop
+2schorc
2schox
4schör
4schp
2schq
-4schrad
-4schre.
-4schrin
-s3chris
+2schrad
+2schre.
+2schres
+2schrin
+4s3chris
sch3rom
-4schron
-4schrou
-6schs4
+2schron
+2schrou
+2schrus
+4schs4
+sch3se
sch3sk
-6sch3t
-scht2a
-scht2i
-scht1s
+sch3sti
+4scht
+sch3t2a
+sch3t2i
s4chu
-4schunt
-5schü
+2schunt
+s4chü
2schv
sch4web
-4schweg
-6schwerk
-4schwet
-4schwid
-3schwü
-s5chy
+2schweg
+4schwerk
+2schwet
+2schwid
2schz
2scj
-6s1cl
+2s3cl
2sco
4scoa
-3s2co2p
+4scom
+3s2co4p
2scs
2scu
2scy
-4s1d2
-sd4a
-sda3me
+2sd2
+sda5me
+sdä1
sdes4
-sdien4e
+sdien2e
s3do
-sd4r
-1se
+sd4ri
+sea2n
se3at.
seau4
seb2
-5sebä
2s1e2ben
2s1echo
-sech6str
+sech4str
2s1echt
2s1eck
se2dik
3see
see1i2
-see3ig
+se2e3ig
se2el
+se3elem
see3len
se3en.
see3n2e
-se3enp
-se3er.
+se1eng
+se1enk
+se1enl
+se1enp
see1ra
-seer2e
+seer4e
se1erf
se3e2r1i
se1erk
-se1ers
-see5s2
-2s3eff
+se2e3s2
+2s1eff
sef4l
3s2eg
s3e2gal
se2gl
seg4r
-3seh
seh1a
-se2hag
+se2ha2g
se2hak
se2hel
-seher4e
-se4herk
+seher2e
+se2herk
se2h1in
seh3l
se4h3ö
seh3ra
seh3re
-seh5r2i
+seh5ri
seh3s
+se4ht
+seh1ur
se2hüb
-2sei.
-2s1eic
+2s1ei.
2s1eid.
sei3da
-4s3eifer
+2s3eifer
2s1eig
-3seil
s2eim
s1ein
-5s2ein.
+5s4ein.
2seinb
-seinbus6
-sein4du
+sein2du
2sei3ne
seine3i
-4seinfl
+2seinfl
sein4fo
2seing
-2s3einh
+2seinh
2seini
2seink
2seinl
2seinn
sein4ne
2seinr
-s4eins.
-4seinsc
-4seinsp
-sein8stit
-sein6str
+s2eins.
+2seinsc
+sein4stit
+sein4str
2seint
4seintr
2seinw
-2s3einz
+2seinz
2s1eis
3s2eism
-5s2eit
-seits1
+3s4eit
+seit2s
3sek
4s1e2kel
4sekz
@@ -19258,27 +20658,27 @@ sel3d4
sel1ec
se2lef
2s3e2leg
-6selektr
2selem
se2ler
sel3ers
2self.
-selin4s
-s1e2lit
+selin2s
+s3e2lit
2s1elix
-s2ell
sel3le
+sel3m
+s2eln
se2lob
s2els
sel3sz
selt2e
-selz2
sem2e
2s1e2mis
-2s3emp
+2s1emp
s4en.
se4nad
se3nal
+sen2alg
se4nas
sen3au
se2nä
@@ -19288,26 +20688,26 @@ s2enb
sen3d4r
2s1endw
senen1
-4senerg
-se4ners
+2senerg
+se2ners
s2enf
-5seni
+3s4eni
se2nid
se2n1im
-sen6keli
+sen4keli
3senku
se2no
se4nott
se4noz
s2ensa
-sen4s3e4h
+sen2s3e2h
4sensem
-sen4si4d
+sen4sers
+sen2si2d
s2enso
senst2
-sen8s7turm
-sent2a
-sen3tan
+sen4s5turm
+sen3t2a
sen3tä
2sentd
2sentf
@@ -19321,134 +20721,148 @@ sen3tr
se4n3u2
3senva
sen3za
-sen4zer
+sen2zer
sen3zw
-5seo
seo2r
+3sepa
se2pen
-5seq
+s1epi
+3seq
s4er.
se2r3a2d
ser3al
se3rand
+se1ras
ser3äus
serb2
s3erbe.
serd2
se2r1e2b
+se2r1ed
se3reie
-se4r3eim
-se4rein
+ser3eim
sere2m
-s4eren
-se4r3enk
+se2r3enk
+ser3ent
s4erfe
s1erfo
s2erfr
-s3erfü
-4serfül
-ser3g2a
-s1ergä
+s1erfü
+serg2
+ser3ga
ser3gl
s2ergr
-s1erh
+s1erhö
5serie
+se4rinf
serk4
3serl.
-4s3ermit
+se4rm
+ser4mah
+2s3ermit
s2ern.
-2s1ernä
s3erneu
4s3ernt
sero4b
s1e2ros
s1erot
s1erö
+ser3r
s2ers.
2sersa
-ser6sehn
-4ser4set
-se3ru
-se4ruh
-ser2um
-s3e4rup
+s3erseh
+s3erset
+sers4p
+sers4t
+se3rum
+ser2um.
+se3rund
+se3rung
+s3e2rup
3s4er3v
s1erz
-s4es.
+s2es.
se3s2a
+3sesc
se2sel
2sesh
se3sk
s1essa
-sest3ri
se3su
2s1e4tap
se2tat
2s1e2th
set2i
2s1e2tik
-set1s
se3tun
3sety
3setz
3seuc
4s3eul
se1u2n
+se2va
+4s3evan
s1ex
-5sex.
2sexa
+sex4am
se2xe
sex3en
s2exi
s2exo
4sexp
sex3t4r
+3sexu
2sexz
-6s3f4
-sfal6l5er
-4s3g4
+2sf2
+s3fa
+sf4ak
+s3fe
+s3fi
+s3fl
+sf4la
+sf4lö
+sf4ru
+sf4rü
+s3fü
+2sg2
+s3ga
sgang4
-sge3s2
+s3ge
+sgeha2
+sge2h3ab
+sge3s4
+s3gm
+sg4mü
+sg4na
+s3gr
sgro3
2s1h
-4sh.
-sh2a
3sha.
-shal4li
+s2hak
+shal2li
shalt2
-shalt4s
4shan
-4shc
sh2e
-1shen
-4shf
sh2i
-3shi.
-1shid
+3s4hi.
s4hig
s2hip
s2hi4r
-4shk
sh3n
4shoc
4shof
4shom
-3shop
+3sho2p
sho4re
-5show
-4s3hö
-sh4r2
-4shs
-4sht
+3s4how
+sh2r2
+sh4re
s3hu
-4s3hü
-1si
-3si.
+s3hü
si3ach.
sial5l
-sia4s
2siat
-5si1c
+3si1c
si2cha
2s1idea
2sidee
@@ -19456,29 +20870,30 @@ si2cha
si3der
s2i3do
2sidy
-3s4ie
+3s2ie
sie2bu
-siege4s
+siege2s
si3ene
-si1err
-si1f4
+si3f
+sif4l
si2g1a
si2g1ei
sig4n
si2g3r
-sigs2
+sigs4
si2k1ab
+si2k1a2g
si2kak
si2kar
si2k1ä
si2k1el
-si4kens
+si2kens
+si2k3er4b
sik3erl
-si2k3i
-sikin1
+s4i2k3i
si2k3n
si2k3r
-sik3s2
+sik3s
3sik3t2
si2ku
sil2br
@@ -19487,10 +20902,12 @@ sil2e
s1ill
3silo
2s1imm
+2s3impf
sim2st
-3simu
+3s4imu
si3n4a
2s1ind
+si3n2e
2s1inf
4sinfe
sing1a
@@ -19500,89 +20917,94 @@ sing3s2
2s1inh
s1in1i1
s2ink
-sinner4
+sinner2
2s1inno
2s1inq
2s1ins
2s1int
2s1inv
3sio
+s2ire
sirn4
2sirr
3siru
3sis
si2sa
si4sam
-si4schu
+s2isc
+si2schu
si2s1e2
si2si
si4sis
s1i2so
sis1or
si2s3p
-sis3s2
-5s2ist
-si4star
+sis3s4
+s4ist
+si2star
si3sto
si2stu
si2su
-3sit
+3s2it
si2tal
si2tau
si2tra
-s2it2u
+sit2u
+sit4zerg
3siu
si2va
sive3
siver2
-si4v3erf
+si2v3erf
si2vin
siv1o4
si2vor
siz2
-1sí
-4s3j
-2s1k2
-4sk.
-sk4a
+2sj
+s3jä
+s3je
+2sk2
4s3kab
s3kad
-1skala
+sk4al
4skalk
s3kalt
4s3kam
4skana
-4s3kanä
+4skanä
3skanda
+skani3e
4skann
4skap
4s3kar
4s3kas
-ska4te.
+sk4at
+ska2te.
4skateg
-ska4tes
+s4kater
+ska2tes
ska4to
4skau
-4s3kä
-4skb
+s3kä
ske2li
-4sken
+4ske2n1
3skep
4sker
-4s3ket
s3kh
-3s2ki.
-3s2kif
+3s4ki.
+3skif
3s2kik
s3kim
s3kin
s2kis.
3skiz
-sk4l
4s3klas
+sklat3
3s2klav
+sk4le
4s3klu
-4sk4n
+sk4na
+sk4ne
4skoh
4skol
4skom
@@ -19591,73 +21013,75 @@ sk4l
sko2pr
4skos
4skow
-4s3kö
-sk4r
+s3kö
4s3kra
+sk4re
+3skrip
4skro
-4sks
-4sk3t2
+sk3t2
skto2
3skulp
4skun
sku2s3
-4skü
-4skv
2s1l2
-4sl.
s3lab
3slal
-sla2ma
-4slar
+sl4am
+sla4ma
sla2ve
s2law
sl3b
-4s5le
+s3le
s3li
3s4lip
-4sln
slo3be
s3loc
s4loga
3s2low
s3lu
s3ly
-4s3m4
+2sm2
+s3ma
sma3b4
sma3sc
-smas4p
sme3na
smi2t3
-2s3n2
+s3mu
+s3mü
+2s1n2
+s3na
snab4
+s3ne
+s3ni
sni4a
sni3er.
sni3ers
-4s5not
-s5ny
+4s3not
+s3ny
3so.
2s3oas
2s1o2b
3s2o3ba
4sobj
-4s3obo
+4soboe
so1ch
-so2di
+sodi4
so2do
so3et
-s1o2fe
+s1ofe
+so4fen
+s1offi
3soft
3sog
sog4l
s1o2he
3sohl
sohle2
-2s3ohng
+4s3ohng
2s1ohr
-3soi2
+3soi
so3id
2s3ok
-1sol
3sol.
so3la
so4lau
@@ -19665,43 +21089,44 @@ so4lau
3sole
so2l1ei
so3li
-sol2la2
-sol4ler
+sol2la4
+sol2ler
+3solm
so3l2o
+so3lu
4s3o2ly
-1somm
+2s3omb
+3somm
3s2on
son2a
son3au
-sone2
+sond2
+sone4
+sonen2d
son4gl
son3sä
son2s1o
so3o
-s1op
-2sope
-2sopf
+so2pe
+s1opf
3sopr
2s1ord
sore2
-so2rei
so2rel
2s1orga
-1sorge
so1rh
2s1o2rie
so2ro
3sorp
3s2orti
so4ru
-1so3s2
-3s2os.
-3sosc
+3so3s2
+s2os.
so4sk
-2sosm
-2sost
+4so4sm
+4sost
so4sth
-s1o4sz
+4s1o4sz
3so3ß
2sot
so3t2h
@@ -19711,405 +21136,422 @@ sound1
so3unds
so3unt
2s1out
-3sov
3sow
2s1o2x
3soz
-s1oze
+4s1oze
2s1ö2d
-2sö2f
+2söf
+sö4fe
2s1ök
2s1öl
-2s1ö4s
+2s1ö2s
+sö4st
sp2
2sp.
-2spaa
-s2pace
-2spack
+s3pa.
+4spaa
+2s3pack
2spag
spa2ge
2spak
2spala
2spalä
-3spalt
-spa2m
-1span
-s2pan.
-3spannu
-2spano
-s2pans
-3spant
+s2pali
+3s4palt
+spa4m
+s2pan
+3spann
2spanz
4spap
2s3para
-1spare
+s2parka
2sparo
-1sparr
-5s6parten
-4spartn
+5s4parten
+2spartn
+2sparty
spas2
spa3sse
spa5ssi
-1spat.
+s2paß
+3spat.
2spati
-2spatr
+4spatr
+s2patz
2spau
3s2paz
s2pä
2späd
3späh
-2spär
+2s3pär
2späs
-2spe.
+spä6ssc
+s2pe
+2s3pe.
+3spec
2speg
-1spei
4spein
-4spensi
+s4pek
+2spensi
spe3p4
-s2pera
3sperb
-3s2perg
-s1peri
-4sperle
-2spero
-s2perr
-sper4ra
+3s4perg
+s3peri
+2sperle
+s3pern
+s4perr
2spers
4spet
+s4pex
3s4pez
-2s3pf4
+2s3pf
+spf4l
4spha
s2phä
3sphär
s3phe
-1spi
-3spi4e
-4s3pier
+3s2pi
+s4pie
+4s5pier
spier4r
spi2k
-4s3pil
-2s3pip
+4spil
+s4pinn
+4spi4p
4s3pis
-3s2pit
-3s2piz
+s4pit
2spl
4spla
-4s3plä
-3s2pli
+4splä
+3s4pli
4s3p4lu
s3pn
2spod
4spoe
s2poi
-2s3pok
+4s3pok
4spol
-1spon
s2pons
4spoo
2spop
-1spor
s2pore
-3s2porn
+3s4porn
4s3pos
4spote
-4spr.
-3s2prac
+s2pö
+2spr.
+s2pra
+3sprac
2sprak
-s2pran
+s4pran
2sprax
+sp4rä
2spräm
-s2prän
+s4prän
2spräs
-3sprec
-2spred
-5s2pren
+4spred
+4spreis
+3s4pren
2s3pres
+s2pri
3spring
-4sprinz
-s2prit
+2sprinz
+3sprit
4sprob
4sprod
2sprog
4sproj
-2sprop
+4sprop
5spross
2sprot
2sproz
-3sprö
-3s2pru
+3s4prö
3sprüc
2sprüf
-1sprün
+3sprün
2s3ps
+s4ps.
2sp3t
2spub
2spud
-1spuk
-3s2pule
-s3pun
+3spuk
+3s4pule
+2spun
4spup
-3spur
-spu4rer
-1spü
-2spy
-2s1q
-4s3r4
+3s4pur
+spu2rer
+s4putt
+2s3py
+2sq
+2s1r2
+s3ra
sra4s3s
+sr4at
srat2s
+srat4sc
+s3re
sre3cha
+s3ri
sro2h
sro3tu
srö2s
-srücker6
-2s1s
-6ss.
-4ssa
+s3ru
+s3rü
+srücker4
+2ss
s3saba
ss3abi
ssa3bo
s5sack
-ss2ad
-ss4agi
+ss2agi
s2s1aj
ss3alba
s2sall
s4samt
s2sanf
s4sang
+ss2ann
s4sano
s4sans
ss2ant
s4sanz
ss2ara
ss2arg
+ss3ark
s3sars
s2s3att
-ssau3e
ssau4r
-4s3s2ä
-4ssb
-6ssc
+ssau5ri
+s3s2ä
s2sce
ssch2
-sschanker8
+sschanker6
s2scr
-4ssd
sse3a
4ss1ec
4ssee
sse1ec
4ssef
4sseg
-4sseh
+4s3seh
sseh2a
4ssei
s2sein
-ss4eind
+s3s2eind
sse3int
4ssek
-4sselek
+4s2selek
sse2lö
4ssemp
-6ssendet
+4ssendet
4s3sendu
-6ssenerg
-ssen6kel
-ssenmas6
-ssen6sem
+4ssenerg
+ssen4kel
+ssenmas4
+ssen4sem
4ssentl
4ssents
4ssentz
ss1epe
-sse6ratt
-ss5ereig
+sser3att
+sser2fo
ss4ergr
-sser4hö
-sser6mit
+sser2hö
+sser4mit
s2serö
-sser4öf
-4ss3erse
+sser2öf
ss4eru
-sser6wei
+sser4wei
+sser2ze
4ssesc
3ssesh
-sses4sa
-4ss3e4str
+sses2sa
+4ss3e2str
4sset
sse3ta
s3seth
4ssez
-4ssf
-4ssg
-4ssh
ss3hi
4ssic
ss3i2ko
s2simp
-6ssio
ss1isr
4ssit
-4ssj
-4ssk
s3skala
-4s4s3l
-4ssm
+ss3l
ssmut2
-4ssn
-4sso
+sso4f
ss1off
ssoi4
s3sol
s4sop
-4ssö
-4ssp
-ss2pen
-ss2phi
-s3sprä
+ss2p
+ss4pat
+ss4pec
+ss4pin
+s3s4prä
s3spri
-ssquet4
-4ssr
-4s4s3s4
+s3spru
+ss4pü
+ssquet2
+ss3s2
sssau4
-4sst
+sss4p
+sss4t
+s4st.
sst2a
s5stad
-s6stag
+ss3tak
s3stä
-ss1t2e
+ss3t2e
s4ste.
s5stel
-s5s2tep
+s5s4tep
s5stern
s4stes
s4stet
s5steu
sst2i
sst3in
-ss1tis
+ss3tis
+ss3tole
s5stop
-ss1tor
+ss3tor
+s5stör
+ss4tras
s3s4trat
s3strö
s3stü
+ss4tw
+s2suf
4ssum
s2sumg
s2sumr
4ssunt
+4ssunv
4ssup
-ss2ur
s3sus
-4ssü
-4ssv
-4ssw
-4s3sy
-4ssz
-1st
-6st.
-3s4ta.
-5staa
+s3sy
+s2t
+2st.
+3sta.
+3s4t4aa
5stab.
2stabb
-4stabel
+2stabel
2stabg
2stabh
-4stabit
+s4tabi
+2stabit
2stabl
2stabn
2stabt
+2stabu
2stabz
st2ac
-s2tad
+s4tad
2stada
+2stafel
3staff
2stag
-3s2tagr
-3stah
+3s4tagr
+3s4tah
+s4tai
2stak
2stala
sta3lak
-2stalb
+2st1alb
2stalg
3sta3l2i
2stalk
+st1alm
st1alp
st1alr
+st1alv
3stam
-st1ami
+st1a4mi
stam4ma
4stampl
4stamt
-2stanb
-3s2tand
+s4tand
4stanf
-6stangeh
+st2ang
+4stangeh
+st3anges
4stanh
4stanl
4st1ann
st3ansp
-4stanst
3stant
4stantr
2stanw
-4stanza
-sta3po
2st1app
-s2tar.
-sta6rens
-s2t2ars
+s4tar.
+sta4rens
+s4tark
+s4tars
s4tart
2stasc
+st1asi
sta4sie
-stast4
+sta3st4
2statb
-7s2tati
-7statth
-7statu
+3s4tati
+3s4tatu
+s4tau.
2stauf
-5staur
+5s4taur
2staus
+2stauto
st1a2ve
-2stax
-3stäb
-3städ
+4stax
+3s4täb
+3s4täd
2stäg
2stält
+s4täm
2stämt
3ständ
+2s3tänz
4stäp
-5s2tär
+s4tär
3stätt
-2stäus
-4stb
+2s3täus
+2stb
2st3c
-4std
+st4ck
+2std
3ste
4steam
-s2tean
+s4tean
+s4teche
4stechn
ste2d
st1edi
+s4teg
ste2g3r
-s2teh
+s4teh
4stehr
st4ei.
4steic
4st1eid
5s4teig
-stei4gr
+stei2gr
4steil
-s3teilc
+s4tein
stei4na
-6steinga
-6steinhe
-stein6sp
-s2tel
+4steinga
+4steinhe
+s4tel
st1elb
-s3tele
+s5tele
+s6telen
st2ell
-stel6l5än
-ste4mar
-ste6ment
-6stemper
+stel4l3än
+ste2mar
+ste4ment
+ste4min
+4stemper
4stempf
ste4na
4st3ends
@@ -20118,63 +21560,67 @@ st2ens
4stentl
4stents
4stentw
+4steo
4stepi
st1e2po
ste2r3a
-s2terb
+s4terb
4sterbs
-6stereig
-s2terf
+4stereig
st3erfü
st2erg
-s2terh
-s2terj
-s2terk
-sterma7sse
-s2tern
-6sterras
-s2ters
-ster4zo
-ste4s1e
+sterma5sse
+s4tern
+4sterras
+s4ters
+4st3er2zo
+st2es1
+ste4se
stes3ta
4stestb
+st3estl
4stestn
4stests
4steta
-ste4tab
+ste2tab
ste4tag
-s2teu
-4steuf
-st3eun
+s4teu
+4s5teuf
+st1eun
st1ev
-4stex
-s2texa
-4stf
+4s3tex
+s4texa
+s5text
+2stf
+stf6lan
2stg
2sth
st2hen
st1hi
st3ho
+s3thr
st1hy
st1i2d
-4stief.
+sti2e
+2stief.
4stiefl
-5s4tiel
-5stif
-sti4gel
+3stiel
+3stif
+sti2gel
+sti2kr
st2il
+sti2la
3stimm
4stimma
2stimp
2st1inb
4stinf
-3sting
4stinh
2stins
4stint
s4tio
2stip.
-4stipps
+2stipps
sti2r
st1ira
st1iri
@@ -20182,102 +21628,118 @@ st1iro
2stite
2stj
2stk
-4stl
-4stm
+2stl
+st3le
+2stm
stma3s2
2stn
sto2bl
-4stocht
-s2tode
-3s2tof
-stoffen6
-stof8fens
-6stoffiz
-sto3mi
+2stocht
+s4tode
+3s4tof
+stoffen4
+stof4fens
+4stoffiz
2stomn
-2ston
+2s3ton
4stona
-3s2to4ne
+3s4to4ne
4stonl
2stope
2stopo
2stord
2storf
2storg
-s2tory
+2storp
+2stort
+3s4tory
+3stos
4stou
4stöch
-2stöl
-5s2tör
+2stöf
+2s3töl
+3s4tör
2stöst
2stöt
-4stp
+2stp
2stq
+s3trac
+s3trad
st4rade
stra4fa
-2strag
-s2trah
-2strai
-3s2tral
+4s3trag
+4strai
+3s4tral
+s3trank
4strans
-3s2tras
+3stras
3straß
-4straum
+2straum
2sträc
-2s3träg
-4sträne
+2sträg
+2sträne
+2sträum
2stre.
-4strech
-2stref
+2strech
+4stref
2streg
4streib
-5st6reif
+3st4reif
2strep
2stret
+4streuh
+s4treuu
2strev
+2strez
3s4tria
2strib
4strig
-4strisi
+s3tril
+2strisi
+s3triu
4stroc
-3s2trof
-3s2troh
-3s2trok
-4stropf
-3s4tropo
+3s4trof
+3s4troh
+3s4trok
+stro4ma
+s4trome
+2stropf
+3stropo
st4ross
-4strost
+2strost
3stroy
2ströp
2strub
+s4trud
3struk
-s2trum
+s4trum
2strun
-2strup
+4strup
2strut
-4st3s2
+2st3s2
stsas2
-stsi4d
-sts4p
-2st3t4
+st4sb
+2st3t2
+stt4r
st2u
3stub
+s3tuc
4stuch
-3stud
+3s4tud
2stue
-3stuf
+3s4tuf
2stug
st3uga
-3stuh
+3s4tuh
2stuk
-2stumo
+4stumo
2stumr
2stum2s
-s3tumsc
2stumt
2stumz
2stun.
2st3una
+s4tund
2stune
2stunf
2st3uni
@@ -20287,12 +21749,12 @@ s3tumsc
stu3ra
stu5re
2st3url
-2s3turn
+4sturn
2st3urt
-3s2turz
+3s4turz
4stüch
-3s2tück
-3stüh
+3s4tück
+3s4tüh
2stür.
2stüre
2stürg
@@ -20302,8 +21764,9 @@ stu5re
2stv
2stw
stwor2
-2sty
+2s3ty
4sty.
+s4tyl
4styp
4stys
2st3z2
@@ -20312,19 +21775,20 @@ su1an
su4ba
4subi
su4br
-subs4
-5su1c
+3su1c
su2cha
+su2chi
su2cho
+suchs3p
3sud
su2eb
-2s1u2f
-su3fi
+s1uf
+su4fe
2s1uh
-1sui
su1is
su1it.
su2k
+3sul
su3l2i
sum1a
su2man
@@ -20332,8 +21796,8 @@ su2mar
3s2ume
su2mei
su2mel
-sument4
-su6ments
+sument2
+su4ments
su2m1et
2s3umf
su2m1id
@@ -20345,19 +21809,17 @@ s2ump
s1ums
s3umsa
2sumse
-s2umsp
2s3umst
-2s3umwa
su2n
2s1una
-sunder4
-sun6d5erh
+sunder2
+sun4d3erh
su4ne
4s1unf
-6sungena
-2s3ungl
+4sungena
+2sungl
4s1uni
-2s1unm
+2sunm
s1uns
2sunt
3sup
@@ -20369,53 +21831,60 @@ su2rei
su2rer
3surf
2s1urk
-s1url
su2r1o
+2s1ursa
s1urt
-su2s
+su2s3
su3s2a
-sus1e
-sus3i
s3u2t
su3tr
suz2
-2sü4b
+2süb
+sü4be
3süc
-sü2d1
-süden4
-sü3den.
-1süf
+süd1
+sü4da
+sü4de
+süden2
+sü5den.
+sü4di
+sü4du
3sün
-1süs4
+s2üs2
sü3sse
sü3ssi
-1süß
-4s3v2
-svoran4
-2s3w
-swe6gers
+2sv2
+s3vl
+s3vo
+svoran2
+s3vö
+2sw
+s3wa
+s3we
+swe4gers
sweh2
-swe5s
+swe5st
4swie
4swil
4swink
-4swis
+s2wist
4swit
-1s2y
-2syl1
-sy2lo
-sy2lu
+s3wö
+s3wu
+s2y
+s3ya
+2sy2l1
sym3
sy2n3
3synd
sy4no
3sys
-2s1z2
-4s3za
-4szä
+2sz2
+s4ze.
4s3zei
-4szel
+4s3zel
3s2zena
+s2zend
3s2ze3n2e
4szent
4szer
@@ -20423,22 +21892,27 @@ s2zes
s2zeß
s4zew
4s3zie
+4szim
s3zins
-4s3zo
+s3zo
s3zs
-sz3ta
-4s3zu
-4szü
-4szw
-4szy
-2ß3a4
+sz3t
+sz4ts
+s3zu
+2ß1a2
+ß3ab
ßan1
-ßat3
+ßas2
+ßa4si
+ß3at3
+ß3au
2ß1ä
-2ß1b4
+2ßb2
+ßb4ri
ßbus3
2ß1c
-2ß1d4
+2ßd2
+ßd4ri
1ße
2ß1e2b
2ß1ec
@@ -20451,30 +21925,31 @@ sz3ta
ße3lu
2ß1emp
ße4n3a4
-4ßenerg
+2ßenerg
ße2ni
ß1enke
ße2no
-3ß2en3te
+3ß2ente
2ßentz
ße2nu
2ß1e2p
3ß2er.
ßer3b
-ßer2ei
-ßer2la
ße2ro
-2ß1erse
+ß1erse
ßer3t
ß1erw
+2ß1erz
ße2s
2ß1es2s
-2ß1est3r
+2ß3estr
ße2t
2ß1ex
-2ß1f4
-2ß3g2
+2ßf
+ßf4ru
+2ßg2
ßge2bl
+ß3gm
2ß1h
1ßi
ßi2g1a
@@ -20482,52 +21957,76 @@ sz3ta
2ß1il
2ß1im
2ß1in
-ß1j
-2ß3k4
+2ßk2
+ß3kh
+ßk4le
+ßk4na
+ßk4ne
2ß1l2
-2ß1m2
+2ßm2
ßmut2
-2ß3n2
-2ß3o4
-ß1ö4
-2ß1p2
-2ß1q
+2ß1n2
+ß3ni
+2ß1o2
+ß3oa
+ßo4fe
+ß3ok
+ß1ö2
+ßö4fe
+ßö4st
+2ßp2
+ß3pf
+2ßq
ßquet2
-4ß3r2
+2ß1r2
ßrö2
+ß3ru
ßrus3
-2ß3s4
+2ßs2
+ß3sa
ßsau4
ßsch2
-2ß1t
+ß3sk
+ß3sp
+ßs4pu
+ßst2
+ß3sz
+2ßt
ßt1h
ßt1in
ßts2
1ßu2
ß1uf
+ßu4fe
2ß1uh
2ß1um
ß2ung
ß1uni
2ßunt
-ß1ü4
-2ß1v
-2ß1w
-2ß3z2
-2taa
-2tab.
+2ßunv
+ß1ur
+ß1ü
+ßü4be
+2ßv
+2ßw
+2ßz2
+ß3zs
+1t
+t2aa
+ta3ar
+4tab.
3taba
ta2b3an
2t1abb
+tab2bau
4tabd
-1tabel
+3tabel
2tabf
2tabg
2tabh
2t3a2bit
2tabk
2tabla
-1table
4tabm
2t3abn
2ta4br
@@ -20538,7 +22037,7 @@ t1abst
4tabw
4tabz
2t1ac
-t2ache
+tach5te
3tacu
t1ada
2tadd
@@ -20547,26 +22046,26 @@ tadi3
tadi5o4
tadi4s
t1adm
-ta2dol
-2t1a2dr
+t1a2dol
+t1a2dr
ta3d2s
ta2er
-1tafe
-2tafet
+3tafe
+4tafet
+4taff
t1afg
t1afr
-1tag
+3tag
ta2ga
ta2g1e2i
-4t3agent
+4t3a2gent
tage2s
-2t1agg
+4t1agg
ta3gl
-2t1a2go
-tag2s1
+4t1a2go
+tag2s3
tag4san
-tag4st
-2tah2
+tah2
3tai
ta3i2k
tai2l1
@@ -20574,79 +22073,81 @@ ta1ins
tai4r
ta1ir.
ta1i2s
-1tak
-2t1a2ka
-ta3kes
+2t1a4ka
2t1akk
-ta2kro
-2taks
+2t1akq
+ta4kro
+tak4t3erf
tak2t1o2
-t2aktu
2takz
3t2al.
ta2la
ta3lad
ta3lag
tal3au
-1talbr
-1talbu
-tald4
-1tale
-tal2en
-ta4l3end
+3talbr
+3tal2en
+ta2l3end
tal3eng
-ta4l3ens
-taler2
-ta4ler3g
+ta2l3ens
+3taler2
+ta2ler3g
ta2let
tal2ga
-tali6ene
-tal4l3ac
-tal4leg
-tal4lei
-tal4let
-tal6leut
-tal6lin6s
+tali4ene
+tal2l3ac
+tal2la2g
+tal2leg
+tal2lei
+tal2let
+tal4leut
+tal4lin4s
tal4los
tall2ö
tall3s
-tal4lus
+tal2lus
2t1alm.
ta2lop
ta2l1o2r
-t1al3ta
+3tals
+t1alta
tal3th
talt4r
ta2lu
2tam
-3t2am.
-t2amen
-t1a2mer
-ta2mi
+3tam.
+t1a4mer
tam2ma2
-tam4m3er
+tam2m3er
tam4mi
-tam4mut
+tam2mut
t1ampl
-3t2ams
+3tams
4t1amt
t1a2na
tan3ab
4tanal
ta4nat
2t1a2nä
-tan3d4ar
+tan2c
+tan3d2ar
tan2dr
-ta4nerf
+tand2st
+ta2nerf
4tanf
-2tang
-tan4gra
+2t1ang
+t3angeh
+t3angel
+t2ango
+tan2gra
+t2angs
2tanh
t2anho
t4ani
3tanj
-1t2ank
+3t2ank
tan2kl
+4tankü
4t3anl
t1anm
2t1anna
@@ -20656,46 +22157,47 @@ t1ano
t1ans
t2ans.
4tansi
-tan4tan
-t4ante.
-4tantei
+2tanspr
+tan2tan
+t2ante.
+2tantei
2tantr
-tanu4
2tanwa
2tanwä
t2anz.
-t1anza
-4tanzei
+2t1anza
3tanzk
+t2anzp
3tanzr
t1anzu
-tan2z1w
+tan2z3w
tao2
ta3or
t4ape
ta2pes
2tapf
ta2pl
-ta4poka
+ta2poka
t2appe
ta2ra
2tarab
3tarabb
-ta3rak
3tar5al
2taram
+t2aran
+ta3rant
tar3ap
ta3ras
t2arau
2tarb
3tarba
+tar4beitn
3tarbek
3tarber
3tarbi
3tar3bl
2tarc
-3tarchl
-3tarchr
+4tarchi
t2ard
ta2rel
ta2r1er
@@ -20703,162 +22205,180 @@ tar3g
ta1r2h
3tari
2tark
-3tark4l
-3t2arko
+tark4l
+t2arko
t2arl
2t1arm
t2armä
+tar4nei
ta2rom
-2tarot
+4tarot
2tart
-3t2arta
-3tartei
-tar6ter6e
-3tartex
-3t2arth
+4tart.
+t2arta
+4tarten
t1arti
-3t4artis
+3t2artis
tar2to
tar2tr
-3tarty
+3tartu
+3tartü
ta2ru
-t1arz
-2tarzt
+2t1arz
+3tarzu
t2as.
ta3s2a
-1tasc
-4t1asp
+tasau1
+3tasc
+t1asp
+4taspe
+ta3spr
2t3assi
-1tast
ta4stem
-ta2sto
-ta3str
+ta4sto
t2asy
+2t1as2z
t4at.
-ta2ta2b
+ta2tab
ta2tan
-3tatb
+3t4atb
t4ate
tat1ei
t5a2tel
ta2tem
-1taten
+3taten
ta2t1er
2t3atl
2tatom
2ta2tr
-1tatsa
-2tatt
+3tatsa
+2tatta4
+2tatti
+tat3zw
tau2b1a
-1taubh
+3taubh
tau2bl
tau2b3r
+4taubs
tauchs4
-tauch5sp
-2taud
-t1auf
+tauch3sp
+4taud
+2t1auf
3taufe.
+t3aufl
tau3f4li
4taufm
-2taufn
-t3au2f1o
+4taufn
+t3au4f1o
4taufp
-taufs2
+tau3fr
4taufw
-1taug
+3taug
4t3auge
t1auk
-3taum
-4tauma
-1taume
-1taus
+3taume
4t1ausb
-tau6scha
-tau6schm
-tau6schr
-tau6schw
+3tausc
+tau4scha
+tau4schm
+tau4schr
+tau4schw
2tausd
-t2aus2e
-2t1ausf
+t2au3s2e
+4tausee
+4t1ausf
t3ausg
t1ausk
-2tausl
+4t1ausl
2tausr
2t3auss
-2t5ausw
-2tausz
-ta2van
+2tausü
+2tausw
+2t3ausz
+4tauu
3tax
taxi3s
4t1axt
-2tää
-2täb
tä1c
-2täd
t2äf
-1täg
-2tägy
+3täg
+4tägy
2täh
-3täle
-2täll
+4täll
2t1ält
-2tä2m
+2täm
+tä4mi
t1ämt
t1ängs
-1tänz
2t1äp
2täq
-tä4reng
+tä2reng
tä2ru
-2tärz
+2t1ärz
tä2s
+tä4ss
+tä4st
t2ät
3tätigk
4tätt
2täug
-1täus
2täuß
2täx
-1tà
-4t3b4
-tbauer4
+2tb2
+t3ba
+tbauer2
+t3be
tber2e
-tblocken8
+t3bh
+tblocken4
+tb4ra
+tb4ri
+t3bs
tbus3
2t1c
t3cha
t3che
+tchen3
tch2i
tch3l
t3chr
t2ch1u
-tch1w
+tch3w
t3cl
+t3co
tcor2
t3cr
-4t3d4
+tc4up
+2td2
tdar2m1
+tdä1
+t3do
+td4ri
+t3ds
tdun2
-1te2a2
+3te2a2
te3ab
tea3c
te3ag
-2teak
+4teak
te3al
teamma3
te3an
te3ar
tea4s
3teba
-t4ebb
2t1e2ben
-t2ech
-1techn
+3t2ech
+4techd
+4techk
+4techm
+4techt
te2chu
2teck
t1ecu
te2dit
-1tee
+3tee
+tee3id
te1em
teen1
te2er.
@@ -20872,26 +22392,23 @@ te2hac
te2him
2t1ehr
te3hu
-1teic
-tei1fl
+3teic
+tei3fl
2teign
teik4
-1t2eil
-tei6lent
-teim2
+3t2eil
+tei4lent
+tei3m2
2tein
-teinbus6
teinen4
-tei6nens
-tein6hab
+tei4nens
t3einkü
2t1eis.
t1eisb
tei3sc
-te5isch.
-teit4
+te3isch.
t1eiw
-tei3z
+tei3z4
te2kel
3teko
tek3t4
@@ -20905,24 +22422,22 @@ te2lä
telb4
tel3d4
tel1ec
-1telef
-1teleg
tel3ehr
2telem
tel3eng
te2ler
te2leu
-4t3elf.
+2t3elf.
te4lim
te2l1in
-te2lit
+t1e2lit
tel3le
-tel6lein
+tel4lein
tel3li
-tel6li6st
+tel4li4st
te2lob
te3lom
-te4lost
+te2lost
te2l1ö
tel3s2k
tel3ta
@@ -20930,6 +22445,7 @@ telt4r
t2ema
te2man
te2m1ap
+tem3art
te2mau
2tem2bo
te2m1ei
@@ -20938,40 +22454,45 @@ te2m1er
2te2mi
tem3i2m
tem3ing
+te3misc
2teml
2temn
-2te2mo
-tem1o2r
+3temod
+te2m1o2r
+te4mp
3temper
2tempf
-1tempo
-tems2
+3tempo
+tem3s4
te2mu
te4mun
-t6en.
-ten1a2
-te4nad
+t4en.
+t2en1a
+te4na2d
+tena2g
te4n3an
ten3ar
te4nas
te4nat
ten3au
te2n3ä4
+t2enb
ten3da
t3endal
-tend4an
-4tendap
-2t5endf
+tend2an
+2tendap
+2t1endf
+t4endi
2t1endl
-t6endo
-2t5endp
-ten3d4r
+t4endo
+2t1endp
+t4en3d4r
te2n1e2b
te2nef
te2neh
ten3ei
te3n4ei.
-tenei4d
+tenei2d
tene4m
tenen1
te4n3end
@@ -20979,109 +22500,117 @@ te4nene
te4neng
te4nens
4t3energ
-te4n3ern
-tenf4
+te2n3ern
+te2ners
t1eng.
teng2a
-4ten4gag
-t3engla
+2ten2gag
te2ni
te4nil
ten1im
-te4n3in
+te4nin
tenk4
ten3n2
te2nol
te2nos
te3nö
-4t3ensem
-1tenso
+2t3ensem
+3tenso
tens2p
+tens3th
t2enta
t1entb
2tentd
2t3entl
2t3entn
-ten6tric
+ten4tric
t1ents
-4t5entw
+4t3entw
2tentz
te2nu
t2enz
-ten4z3er
-teo2f
-2t1e2pi
+ten2z3er
+teo4f
+t1epi
+te2pil
tept2
-t4er.
-t4era
+t2er.
+t2era
+tera2b
ter3ac
te2rad
te1ral
-ter3alg
-te3r4ane
+te2r3alg
+te3ran.
+te3ranb
+te3rane
te2r3ap
2t1erbs
2t1erbt
-4t3erde.
+2t3erde.
ter3d2s
te2r1e2b
te2rec
-t3ereig
+2t3ereig
+ter3ein
te5rek
+te2rel
+ter3ell
tere2m
-te4rema
-te4r3end
-te4rene
-te4reng
-te4r3ent
-teren5th
+te2rema
+te2r3end
+te2rene
+te2reng
+te2r3ent
+teren3th
terer3k
-terer6ku
+terer4ku
terer3l
-te4r3erp
-te4rers
-te4rerw
+te2r3erp
+te2rers
+te2rerw
t4erfr
terg2
ter3ga
-6tergebn
-t6ergem
-t6erges
-t6ergew
+t4ergem
+t4erges
+t4ergew
+ter4gieb
ter3gl
-6tergrei
+4tergrei
+ter2gri
t4ergru
2t1ergu
2tergü
-t6erhall
-t6erhau
-t4erhäu
-t4erhei
+te4rh
+t4erhall
+t2erhan
+t4erhau
+t2erhäu
+t2erhei
t2erhi
t2erho
-6terhöhu
t2erhu
te3ria
-4terii
ter3iko
teri4o
-te2r3it
-teri4ta
-4terklä
+te2rit
+ter3i2ta
t4erlä
+ter3lei
t4erli
-ter4lös
-termas4
-1termi
+ter2lös
+3term
+termas2
+ter2mer
t2ern.
-ter4nar
-t6ernc
-t4ero
+ter2nar
+t4ernc
te1rob
-ter4obe
+ter2obe
2teros
t1e2r1ö
-t4erp
+ter3r2
t4erra
3terras
ter4re.
@@ -21089,86 +22618,87 @@ t4erro
t4ers.
t2erse
t4erst.
-t6erstad
-ter6stat
+t4erstad
t4erstä
+t6ersted
t4ersti
-t4erstr
+ter3str
t4erstu
t4erstü
+ter4sw
ter3t4a
ter4trä
-t4eru2
+teru4
te4r1uf
te3rung
-t4erv
-4t3erwäh
+2t3erwäh
ter3z2a
2t1erzb
t4erzei
-4terzeu
ter3zw
te2s
-t2es.
-tesa2k
+tesa4k
te3sä
-te3sc
-tes3eli
+te3s2c
te3ser
te3si
te3so
-te3sp
-tes1pe
-te4sper
-te4spr
+te3spen
+tes3pr
2t1essa
tes3si
-tes2t
tes3tät
-1testb
-tester4
-te6sterg
-te6st5erh
-te6sterk
-te3sto
-tes3tra
+3testb
+tester2
+te4sterg
+te4st3erh
+te4sterk
t3est3ri
-1tests
+3tests
t1eta
-te4tabl
+te2tabl
2te2tap
te2tat
teten3
2t1e2th
te3tho
-4tetl
-3teuf
+te2tik
+2tetl
+teuer5b
+teuer3r
+3t4euf
+teu4fa
te1u2n
-2t1eup
+2t3eup
+teu2rob
te2va
te2vi
tewa2s
3tewo
-1tex
2texam
2t1e2xe
+te3xel
2t1e2xi
4texp
tex4ta
2t1exz
tè2
-2t3f6
+2tf2
tfäs3
-4t1g2
+t3fj
+tf4la
+tf4lö
+tf4rö
+tf4rü
+2tg2
tga4s3er
tga4su
-t3ge
tge4nen3
tger2a
tger2i
-tg4r
+tg4ra
tgro3
-4th.
+2th.
2t1h2a
3tha.
3t2hag
@@ -21176,32 +22706,37 @@ tgro3
3thal.
3thalh
t4hali
-1t2hals
+t2hals
+4tham
t2han.
t3hand
-t3hap
+4t3hap
4t3hau
2t1hä
3thäi
4thäl
2thb
-4thc
-1th2e
+th2e
3t4hea
2t1heb
-2t1hef
+4t1hef
2t1hei
the1in
4theit
-t2hek
+3t2hek
+2thel
+3thema
2themd
+t1hemi
2themm
t1henn
3theo
t1herd
+3therm
thero1
2t1herr
2t1herz
+3these
4t1hess
t2heu
2thf
@@ -21216,103 +22751,108 @@ thi3nu
2t1hir
2thk
2th3l
-4th3m2
+2th3m2
thmu2
2th3n2
2t1hob
+t1hoc
tho3chr
t1hof
2t1hoh
+t2hol.
+t2holo
+t1hols
t1holt
2tholz
+t2hom
t2hon
4thops
-t1hose
+tho3ra
+2t1hose
t1hot
4thote
-2thou
+2thou4
t1hov
2thö
2thp
-1th2r2
+th2r2
+th4ro
2ths
2tht2
t1hu
2thub
-2thuh
4t3hun
-2thut
2t1hü
2thv
-t4ia
ti3ac
ti1ag
+2t3iago
tial2l
ti3alo
-ti1a2m
+ti1a4m
+ti1as
+ti2ä
ti1ce
ti3chr
3ticket
t2id.
+ti3de.
2tidee
-ti4d3en4d
+ti2d3en2d
ti3dy
-1tief.
+3tief.
4tiefel
-1tiefl
+3tiefl
tie2fr
-tieg4
ti2e1i
ti1el
-ti2el.
tiel3a
-ti3e2n1
-tie4rei
-tie4reu
-tiermas6
-ti2ern
-1tierr
+tie2n1
+ti3ene
+tie2rei
+tie2reu
+3tierr
tie5sse
ti1eu
ti3fe
tif3f
-ti1f4r
-tifter6k
-ti4gerz
+ti3f4r
+tifter4k
+ti2gerz
ti2git
+tigs4
tih2
tihi4
ti2kam
ti2kar
tiken2
-ti4kent
+ti2kent
ti3k4ere
ti3kerl
ti2kin
ti4klu
ti2kn
-ti2k1op
+ti2kop
tik1r
ti2kra
ti2krä
-ti4krei
-tiks2
+ti2krei
+ti4kro
+ti2lant
ti2lar
til3d
ti2lei
ti2lel
-1tilg
-3tilgu
+3tilg
tille4b
2tillu
ti2lö
tilt4
-ti2lu
ti2ma2g
-tim4man
-tim6ma6te
-timmer4
-tim6merg
+tim2man
+tim4ma4te
+timmer2
+tim4merg
tim4mit
2timp
t4ina
@@ -21320,145 +22860,156 @@ ti3naf
ti3nak
ti2n3an
t1ind
-ti5n2e
+ti3n2e
tine1i
+ti5nen
2t1inf
tin2ga
+tin3gen
+tin2gi
ting3l
-ting3s2
+ting3s4
2t1inh
3tinis
-t1in1it
+t1init
t1inka
tin2k1l
tin2kn
-tin2kr
t1inku
t2inn
ti2nor
t1ins
-t3insa
t2insä
4t3inse
-tin4spa
-tin4sum
+tin2spa
+tin2sum
t1int
3tinte.
+2t3inter
ti3nu
tin2um
4t1inv
3tio
ti2osk
tioxi3
-1tip.
+3tip.
ti3p4l
-1tipp
+3tipp
3tips
-ti4que.
-1tirad
-ti1rh
+ti2que.
+3tirad
+ti1r2h
ti4ron
t2isc
-ti6schei
-tisch3l
+ti4schei
+ti2schr
tisch3w
ti2sei
+tis2el
ti3sk
t1isl
t1iso
ti2sp
t1isr
-ti3s2th
-ti4s3tic
-ti2su
+tiss4
+ti3sth
+ti2s5tic
+ti2s1u
2t1iß
t1it2a
ti2tal
-3ti3te
+3tite
+ti3th
+t2iti
3tiu
tium4s
ti2van
ti2vel
-ti4vene
tiver2
-ti4verh
-ti4verk
-ti4verl
+ti2verh
+ti2verk
+ti2verl
ti2v1o
ti4v3r
ti2za
ti2zir
-2t1j
-4t3k4
-2t3l2
+2tj
+2tk2
+tklat3
+tk4ne
+t3kr
+2t1l2
tlan2g
-tl4e
-tlei6der
-t4lep
+tlei2bl
+tlei4der
+tl4er
tle2ra
-4t5li
-tlings3
+t3li
+tlings5
tli5ni
+tli3s
tlit1
-t5lö
-4t1m2
+t3lo
+2tm2
tmal2
-tmen8schl
-tmen4t5
-tments4
+tm4am
+tmen4schl
+tmen4t3
tmo4des
-2t3n4
-t5na
+t3mö
+2t1n2
+t3na
+tn4an
+t3nä
+t3ne
tnes4
+t3ni
tni3v
-to4as
-to5a4t
+to3ar
+to3a4t
t2oba
-4tobj
+4to4bj
tob2l
t1obs
-1tobt
+3tobt
to1ch
-2t3ochs
-1tocht
-2tock
-tock5ent
-1t4od
-3tod.
+t3ochs
+3tocht
+3tod
tod1er2
+todes3t
to2dun
-tof6f5ent
-tof4f3er
+toe2
+tof4f3ent
+tof2f3er
2toffi
2t3ohr
+3toil
toi4r
-tok4
+tok4l
to3le
-1toler
-tomar4b
+tomar2b
to4mene
3tomi
-to2min
-1tomo
-to2m1u
-to4mun
-1ton
+3tomo
+to4m1u
+to5mus
to2nan
ton3au
tond2
to2n2eh
-toner6ke
+toner4ke
+to4nid
to2nob
2tony
3too
-to2pad
-to2pak
-to2pan
+to4pad
+to4pak
to3pas
to2pat
-t1ope
top1hi
-1topo
+to2ple
+3topo
2to4pt
t4or.
tora2g
@@ -21467,276 +23018,290 @@ t1ord
t2ordi
2t3ordn
t4ore
-to2rei
+3tore.
to2rel
to2rem
-to6renna
-1torf
-tor4fan
+to4renna
+3torf
+tor2fan
t1or3g
2torga
-6t5orient
-torin4s
+4t3orient
+torin2s
tor3int
to2rö
-1torp
-t4ors
-1tort
+3torp
+t4o4rs
2t1ort.
tor3t2a
-t1orth
+2t1orth
4tortn
4tort4s
to4ru
+to5rus
to3rü
to4rüb
to3s2
+to4sb
to4s3ka
-tost2
+t1o4sz
to2tä
-1toten
to2tho
+tot3s4
3t2ou
touil2
to3un
-to1x
+3to1x
tö2c
-1töch
-2töck
+3töch
+4töck
2t1ö2d
-2tö2f
-4t1ök
-1töl
+2töf
+tö4fe
+2t1ö2k
2töl.
-1tön
+3tön
t2ör
t1ö4st
-1töt
-2t3p4
-tpf4
+3töt
+2tp2
+t3pf
+tpf4l
tpi2n
-2t1q
-t2r4
+t3pl
+tp4lu
+tp4rä
+t3ps
+2tq
+t2r2
2tr.
-1trac
+t4rab
tra3cha
tra3chl
2t3rad.
2trade
-tra4dem
-1tradi
+tra2dem
t3radie
tra4fah
tra4far
-2traff
-1t4rag
+t4rag
tra5gen
+4trahl
2trahm
3t4rai
2t3rake
t4rakt
+tr4al
tral3l
-1tram
+3tram
+tra5me
3t4ran.
4trand
-2trang
-1trank
+4trang
t3rann
-5t4rans
-1trapp
+3t4rans
+tra3po
+3trapp
tra4sta
tra4str
-2traß
+4traß
t1raub
-4traub.
+2traub.
4trauc
t4rauf
-1traum
2traup
traus2
-1träc
+3träc
2träd
-1träg
-1träne
-2träng
+3t4räg
+3träne
+4träng
+4träs
+4träß
2träuc
-1träum
-4t5re.
+4tre.
2trea
t3reak
-2treb
-tre2br
-2trec
+4treb
+tre2b3r
+4trec
t3rech
t4reck
-3treck.
+5treck.
2t3red
-1tref
-2trefe
-2trefl
-2trefo
-2treg
+3tref
+4trefe
+4trefl
+4trefo
+4treg
t3reh
t4rei.
-1t4reib
-2treif
+3t4reib
+4treif
2t3reig
2t3reih
-2treim
+2t3reim
2t3rein
2t3reis
-tre7isch.
-2treit
+tre5isch.
+t3reiß
+4treit
t3reiz
2trek
2t3rel
t4rem
t4ren.
-1trend
-1trenn
+3trend
+3trennu
t3rent
+t3repa
2trepe
2t3repo
-1trepp
-t3repr
+3trepp
t4rer
t4res.
-1tret
+t3rese
+3tret
tre2ta
t4rete
tret3r
-tre4tri
-2t3rett
+tre2tri
+4t3rett
+t4reu
+3treuh
2t3rev
t4rex
2trez
-3t4ré
+3tré
2t3rh
3t4rib
-t4rick
+4trich.
t4rid2
-1trieb
+3trieb
trie3fr
+tri2en
tri4ena
+tri3ent
tri2er
tri4ers
+tri3est.
2trig.
tri3gl
t4rik
-tri4ke.
-tri4kes
-1triko
-1tril
-1trin
+tri2ke.
+tri2kes
+3triko
t3rind
2tring
tri3ni
-t3rinn
+3trink
3trio
-t4rip
+tr4is
2triß
-1triu
-2t3riv
tri2x
trizi1
tro3b4
-1troc
+3troc
4trock.
-tro4kes
-trol4la
-2trom.
+tro2kes
+trol2la
+tr4om
tro4men
-tro2mi
-2tromk
+4tromk
+4troms
tro3na
t4rop
-tro1pe
-3tropf
-tro5sm
-1trost
+tro3pe
+5tropf
+tro3sm
+3trost
t1rot.
2trout
+t4roy
4t3röc
2tröh
-2tröm
-1tröp
+4tröm
+3tröp
2t3rö4s3s
-1tröt
-1trub
+3tröt
+3trub
2t3ruc
4truf
-1trug
-2truk
+3t4rug
+4truk
trum2
t3rumä
-trums1
+trums3
t3rund
-1trunk
+3trunk
3t4rup
t3russ
2t3ruß
-1trut1
+2trut1
tru2th
-trü1be
-trü1bu
+trü3be
+trü3bu
2t3rüc
-trücker6
+trücker4
t4rüg
3trümm
-try1
+3try
+try3o
2ts
-4ts.
-ts3ab
+ts3a2b
t3sac
tsa3che
t4sachs
-t2sa2d
+t2s1a2d
ts1ahn
+t3s2akk
t2sall
t2salt
t4samp
t4s1amt
t2san
ts3ane
+tsa2p
tsa2r
+ts3are
ts3ari
-t2s1a4s
-tsa5ssen
-t2sau
+t2s1a2s
+tsa3ssen
+tsa4st
+t3satz
+t2sau1
ts2av
-t1sä
t2säh
ts1än
ts1äus
t2sce
-t4scham
-t6schart
-t3sche
+t4schart
t4schef
-t3schl
-tsch4li
-t3schra
+tsch2li
t4schro
t3schü
ts2cor
t2s1e2b
tse2e
t2sef
-tse4he.
-ts2eil
+tse2he.
+t2s1eic
+t3seil
t3seme
ts1eng
t3s2ens
t2s1ent
t2s1ep
t2s1er
-t6s5essen
+tser2u
+t4s3essen
tse2t
ts1eta
t2s1eti
-t2s1e2v
+t2s1ev
t2sex
t3sexi
+tsh2
ts3he
t2s1i2d
t2s3i2k
@@ -21744,88 +23309,112 @@ t2sim
tsing4
t2sini
ts1ir
-4tsk
-t3skal
-ts4kele
+t3s2kal
+ts2kele
tski2
-t4s3ko
-tsmas4s
-tsma5sse
-t1so
+t4sko
+tsmas2s
+tsma3sse
ts1off
-t2sop
+t2s1op
tso2r
ts1orc
t2s1ori
ts3ort.
-t3sos
-ts3part
-ts1pas
-ts3pate
-t1sped
-t1s2pek
-ts4pend
-ts2pi
-t2s3pic
+t2sö
+t2spac
+t2spal
+ts2pare
+t2spat
+t2spä
+t3sped
+t3spei
+t3spek
+t2sph
+t4s3pic
t4spins
ts3ple
-ts2pon
-ts2por
-ts2put
-ts5s4
-4tst4
-t4stabe
+t2spo
+t3s2pon
+t3s2por
+t2sprei
+t3spru
+ts3s2
+tsser2
+tss4k
+tss4t
+ts5ste
+tst2
+t2stabe
t2staf
-t4stale
+t4stag
+ts3tak
+t2stale
t4s3tanz
-t2stas
-t4s3tat.
-t4s3täti
+t4stas
+t2s3tat.
+t2s3täti
+t2stea
t4stee
-t4s1tep
+t4stele
+t4stens
+t4s3tep
t4sterm
t4s3terr
-ts1tie
-t3s2til
+t4s3th
+ts3tie
+ts4til
t3stim
-t2s1tis
-t2stit
-t4stoch
-t2stoi
-t2stor
-t4strac
+t4s3tis
+t4stit
+t2stoch
+t4stoi
+t4ston
+ts3tor
+tst4r
+t2strac
t4strad
-t3s4traf
+t4s3trak
t3strec
t4stren
-ts4tric
+ts3treu
+t3stric
t4strie
-ts2tro2
-ts2tub
-ts2tüm
+t4strun
+tst4u
+t5stub
+t4sty
ts1u
+t2su.
3tsubi
+t2sumg
+t2sums
+t2sumv
t2sumz
-ts3un
-t1sü
+t2s3un
tsü3s
tswa2s
-4t1t
+t3sy
+t4sza
+ts2zin
+2tt
tt1ab
tt2ac
tt3achs
tt1ad
tt2ag
-tta6g5ess
+tta4g3ess
t4t1ah
-tta2ke
+tta4ke
tt2al
t2tan
ttan4a
tt4anke
+ttank3l
t3t2ant
-t4t1ap
+t2t1ap
tt1art
+tta3st
tt3atr
tt1äh
t2tän
@@ -21835,36 +23424,40 @@ tt1eif
tt1ein
t2t1eis
tte4l1a2
-tte4l3e4b
-t4te4leg
-tte4len
+tte2l3e2b
+t2te2leg
+tte2len
+tt2eli
ttel3l
ttel1o
t2temu
tte4na
ttens2
-tten6sem
-t4tentb
+tten4sem
+t2tentb
tten3te
-t4tentf
-t4tents
+t2tentf
+t2tents
tten3z
t2teo
+tte4r3ar
t3t4ere
tt2erg
+tteri2e
tte4rik
-ttermas7s
+ttermas5s
tter3nä
tte2ro
tt2erö
-tt4es
+tt4es1
tte4s3a
tte4s3ä
-tte4s1o
+tte4so
t3tess
ttest4r
t4teuf
tt2häu
+tthä3us
tt1hi
t2t1ho
t2ti4d
@@ -21872,29 +23465,32 @@ t2t3igi
t2tins
tt2int
t2tiso
-t4t5la
+t4t3la
+t4tli
+tt5nan
t3to.
t2torg
t3tos
ttras3s
-t2trou
-tt3rü1
+t3trog
+tt3rü3
ttschi4
tts1eh
tt2sen
-tts1p
-tt4s3tät
+tt2spe
+tt2spr
+tt2s3tät
tt4s3tem
tt4ster
-tt3s2z
-ttu2
-ttu3b
-t2tuc
-tt1uf
+tt2sum
+tt3sz
+t2tu2c
+tt1u4f
t4tunt
t2tu4s
ttü2
tt3z2
+ttz4w
3tua
tu4ale
tu1alm
@@ -21902,17 +23498,15 @@ tu1alv
tu3ant
tub2
tuba3b
-1tuc
tu2chi
tu1cho
tudie4n3
3tue
-tu3en
tu2ere
2tuf
tuf2e
-tu3fen
-t3u2fer
+tu5fen
+t3u4fer
3tuff
tuf4fel
tu2gan
@@ -21922,7 +23516,6 @@ tuh4ler
tu1ist
t3u2kr
tul2i
-1tum
tum2b5l
4t3umf
2t3umg
@@ -21930,38 +23523,41 @@ tum2b5l
2t3umk
2tuml
3t2umo
-2tump
2t3umr
-4t3umsat
+2t3umsat
2t1umsc
tum2si
tum2so
2t3umt
2t1umw
t3umz
-1tun.
+3tun.
2t1una
2t1und
tund2e
-1tune
+3tune
tun2en
2t3unf
t3unga
+tungs5
+tun2i
2tunif
2tu2nio
2tuniv
-2t1unm
+2tunm
3tunn
t1u2no
+t3unr
t3uns
-1tuns.
+3tuns.
2t3unt
-2t1unv
+2tunv
2t1up.
t1upg
-tu2r1ag
+tu2r1a2g
tu2ran
turan4l
+tur3ans
tu2ras
tu2rau
tu2rä
@@ -21969,82 +23565,84 @@ tur1c
tu2r1e2b
tu2rei
tur3eis
-tu4rene
+tu2rene
tu2r1er
tu4res
-tu2re2t
+tu2re4t
tu2r3e2v
-tur3f4
+turf4
tur3g2
-tur1in1
+tur1in
tur4mun
-1turn
+3turn
tu2r3o
tur3s2
-tu4ru
+tur5sa
+tu2ru
tu2sa
-tu4schl
-tu2se
+tu2schl
+tu2s1e
tu2so
-tu3t2a
-tuto5
-tuto3re
+tut2a
+tuto3
+4tutz
2tüb
tü3ber.
-1tüch
+3tüch
tück2s
-1tüf
-2tüh
-1tür.
+3tüf
+3tür.
tür1c
-1türe
-1türg
-1türs
-1türw
-2türz
-1tütc
-1tüte
-2tütz
-4t1v2
+3türe
+3türg
+3türs
+3türw
+4türz
+3tütc
+3tüte
+4tütz
+2tv2
t3vo
-tvoran4
-4t3w4
-t5wa2
-twä4
+t4vo.
+tvoran2
+2tw
+t3wa2
twegs2
-twi4e
-t4wist
-1ty
+t2wist
+tw4ri
3ty.
-2t1ya
-3typ
+t1ya
ty2p1a
-3tys
-2t1z
+ty4ps
+2tz
t2za2
tz1ag
+tz1ap
tz3ar
tz1au
t2z1ä
t3zäh
-tz1ec
+t2z1ec
t2z1e2d
tz1ehr
t2z1eie
+t2z1eig
t4z1eis
+tzei4tend
tze2m
tz1emi
tze4n1
tz2ene
tzen3ta
-t4zentg
-t4zentl
-t4zents
-tzer6gre
+t2zentg
+t2zentl
+t2zents
+tzer4gre
+t2z1er2m
tz1erw
tz2er3z
tz3erzi
-tzes1
+tzes3t
tz1e2t
tz1i2d
tzi4m
@@ -22056,28 +23654,30 @@ t2zop
tz2th
tz2tin
tzu2gu
+tz1unf
t2zuni
-tzwan4d3
-tz1wä
-tz1wi
+tzwan2d3
+tz3wä
+tz3wi
t3zwie
-tz1wu
+tz3wu
2ua
u3a2b
-u1a2c
+u3a2c
+ua4ch
ua2dan
uad4r
u1a2g
u1ah
+ua4ka
u1al.
u1a2l1a
-u1a2l1ä
+u1a4l1ä
u1alb
u1ald
u3aleb
-u3a4lent
+u3a2lent
u3aler2
-ua4lerg
ual3erk
u3a2let
u1alf
@@ -22086,34 +23686,37 @@ u1alh
u3a2lid
ual3l
ualle2
+uallö3
u1aln
-ua2l1o2
+u3a2l1o2
u1alp
u1alr
u1als
u1al3t4
ua2lu
u1alw
-u1alz
+u1al3z4
u1am
-uan2a
+u1an.
+ua3n2a4
u1ans
+uant2
u3ar.
uara2b
u1ars
-uar4t3an
-ua3s2a
+uar2t3an
+ua3sa
ua2th
uat2i
+uati4ons.
uat2o
u3au
-uau2s
+uau2s3
u1ay
u1äm
u1än
-uäs4
u1äu
-2u1b
+2ub
u2barb
ubb4l
ube2be
@@ -22124,32 +23727,37 @@ u2b1e2m
ube4n1a
uben3o
ub2er
-u4b3erde
+u2b3erde
ubert4
ub4es
ub1eul
-u3bit
+ub4is
+u3b4it
ub2l
ub3läu
ub3lic
ub3lu
ub4lut
u2bob
+u2b3ok
u2bop
u2boz
+ub5rah
u2b3rit
+ub4ro
ub4rü
ub2san
ubsau2
-ub6s3che
+ub4s3che
ub2s1o
-ub2sp
-ubst2
+ub2s3p
+ubst4
ub4sz
ub3t2h
ubu3s
2uc
uc1c
+u4ch.
uch1a
u1cha.
uch1ä
@@ -22157,58 +23765,60 @@ u1che
uch1ec
u2ched
uch1ei
-ucherin8t
-ucherma8s
+ucher3f
+ucherma4s
u1chi
uch3im
uch1in
uch3l
uch3m
-uchma6ss
+uchma4ss
uch3n
uch1op
u2ch3r
-uch4sel
+uch2sel
uch2so
uch2sp
-uchst2
-uch2ta
+uch2tak
uch3tan
-uch6t5erf
-uch6t5ert
+uch4t3erf
+uch4t3ert
u1chu
u2chum
uch3ü
-uch1w
+uch3w
u1ci
uck3elf
-uck2er
-ucker8geb
uck3i
-uck4sti
+uck2sti
uck3t
u1cl
-2u1d
-u3d4a
+uc4re
+2ud
+u3d2a
uda3d
+ud4at
ud2e
-ude3i4
-udein7
+ude1e
+ude3i2
+udein5
udel3se
uden1
uden3e
udert4
udi3en
+udiener4
+udio3
uditi4
u3d2ob
u2don
ud3ra
u3dru
-4u1e
+2u1e
ueb4l
ue1ch
u2ed
-ue2en4
+ueen4
u2eg
u2eh
ue2ke
@@ -22217,7 +23827,7 @@ ue2lek
ueli4
uel2la
uel2lä
-u3eln
+uel4lent
ue2mi
uen1
u3en.
@@ -22227,134 +23837,150 @@ u3end
uene2
ue2neb
ue2ner
-uen4gag
+uen2gag
uenge2
uenge4m
-uengene7
-uenge4s
+uengene3
uen2gl
-u3e2ni
+ue2ni
uenk4
ue2no
ue2nu
-uen6zene
uen2zu
u2ep
ue2r3a2
ue2r1ä
uerb2
-uer6baut
+uer4baut
+u3erbu
uer3d2
uere2
ue2rec
-u5ereinn
-uer3eis
+uer4ei.
+u3ereinn
uer3ela
u3eremp
-u3e4r3ent
-ue3r4erb
+u3e2r3ent
+ue3r2erb
u3ererf
-ue4rer4g
-uerer4h
-uerer4k
+ue2rer2g
+uerer2h
+uerer2k
uerer4m
-ue6rersc
-uerer6sp
-ue6rerst
+ue2rers
+uerer4sa
uer3esk
-ue2ret
+ue2re4t
u3erex
-uer3g2
-uer4geb
-u3erh
+uerg2
+uer3ga
+uer2geb
ueri2d
ue2r1i4m
-u3erin4t
+uerin3s
+u3erin2t
u3erl.
-uerma6s
+uerma4s
u3ern
uer4nan
-uer4nar
-uer4ne
+uer2nar
+uer2ne
ue2r3o4
uer2ö
-uer3r
-u3errü
-uer3sc
-uerst6
+uer3ra
+uers4p
+uerst4
+u3ersti
uer3t2
u3eruh
u3erum
u3erunf
u3erunt
+u3erur
+uer2wec
uer3z2
-ue4s
-ue5se
-ue5sp
+u3est.
ue2ta
ue4tek
ue2tik
uety2
u2ev
ue2x1
+u2f
+u3fa
uf1ab
-u3fac
-u3fah
-u3fal
-ufall4
+ufall2
ufa2n
uf3ane
-u2f3a2r
+uf3a2r
ufa2t
uf1au
-u2f1än
-u2f1ä6s
-u2f1ä2ß
-u2f1ei
+u3fä
+u4f1än
+uf1är
+uf1äs
+ufä6sse
+uf1ä2ß
+u3fe
+u4f1ei
ufel4s3a
-u2f1em
+u4f1em
4ufen
-u3fen.
-u2fent
-u2ferf
-u2f1erh
-u4ferla
+u4fent
+uf2ere
+u4ferf
+u4f1erh
+ufer4lau
u4ferle
u4ferne
-u2f1eß
-u2f1et
+u4f1eß
+u4f1et
+u4fex
2uff
-uf3fe
+uf3f2e
uffel2
uff4l
uf2fro
-u2f1id
-u2fim
-u2f1ins
+u3fi
+u4f1id
+u4fim
+u4f1ins
uf3l
-u2fob
+u4fläs
+uflos3
+uf4lü
+uf5lüd
+uf5lüm
+u3fo
+u4fob
+u4fof
+u4fop
ufo2r
uf1ori
+u3fö
uf3r
-uf5sä
-uf3sc
+u4fru
+uf3sä
+uf5sät
uf2spo
-uf4stab
+uf2stab
uf4ster
2uft
ufta2b
uft1eb
uf3ten
uft3erd
-uft3er4g
-ufter4l
+uft3er2g
uf3ti
uf4tin
uft3s2
-u2fum
-2u1g
+u3fu
+u4fum
+u3fü
+2ug
+u3ga.
ug2abe
-u4gabte
+u2gabte
ug1a2d
ug1ak
u2gana
@@ -22365,19 +23991,22 @@ u2gans
u2gant
ug1ap
u2g1ar
+uga4s
ug1au
ug3d2
u3ge.
u2g1ec
+ug4eg
ug1e2i
u2geig
-u2gein
-uge4lob
+ug2eil
+u2g3ein
+uge2lob
ug1emi
ugene2
ugenma3
-ugenmas6
u2g1erf
+u2g1erk
u2g1erl
u2gerr
u2gerv
@@ -22385,52 +24014,60 @@ uges2
u3ges.
u2g1esk
ug2et
-ugg2
ug2gl
-ug5g4t
+ug4gt
ug3hu
u2g1i2d
u2gim
ug1in
+u2gins
u2g1l
u4glä
-u6gleitb
-u6gleitu
+u4gleitb
+u4gleitu
u4glic
u4glis
ug3liz
u4g3lo
u4glu
-u4g3n
-u2gob
+u2g3n
+ugo3
+u2go4b
ug3oc
u3gon
-ug1op
-ug1o2r
-u3gos
+ugo4p
+u2g1o4r
u2gö
+u2g3ram
u2g3rä
u2greg
-u4g3reis
-u2gres
+u2g3reis
+u2g3res
u2g3rie
ug3ro
ugro3s
u2grou
ug3rüs
ugsma3
-ugsmas4
-ug6spe
+ugsmas2
+ug4spe
ugs4por
+ug4spr
+ug4spu
+ugs3t2
+ugs4tan
ug3stä
-ugs1te
-ug4stur
+ug2ste
+ugs4to
+ugs4tr
+ug2stur
+ugs4tü
u2gum
-ugu6ster
+ugu4ster
u2gü
u1h
-uh2a
-2u3he
+uh2au
+2u3h2e
uhe3a
uhe1e2
2uhi
@@ -22438,35 +24075,38 @@ uhe1e2
uh1la
uh2lar
uh1lä
-uh4l3ent
+uh2l1ei
+uh2l3ent
uhl3erb
uh2li
uhl2ö
2uhm
uhme4
+uh1or
uhr1a
-uhrei4s
-uh2r3er5
+uhrei2s
+uh2r3er3
2uh3ri
-uh4rin
-uh2r3o
+uh4r1in
+uh4r3o
uh2ru
uh4rü
-uhs4
+uh3s4p
uh3t2
u2hu
2uhü
-uh1w
+uh3w
2ui
ui2a
ui1ch
ui2che
-u1idd
+u2idi
+ui2du
u1ie
ui1em
u3ig
u4ige
-uil4les
+uil2les
u1im
u3in.
uin3n
@@ -22477,31 +24117,29 @@ uisi4n
ui2st
ui3sta
uit3s
-u1j
uji3
uk2a
uk1äh
u3käu
-u1k2e
+uk2e
uke2n1
-u1ki
-u1k2l
+uk2l
ukle1
-u1k4n
+uk4na
+uk4ne
+uk4nu
u2k1ob
-uko2m1
+uko4m1
ukom3a
uk2ö
-u1k4r
+uk4re
uk2ta
uk2t1el
uk2t1er
uk2tin
-uk4t3o4ri
+uk2t3o2ri
uk2t3r
-ukts4
uk2tum
-u1ku
uku2s
uk2ü
u1l
@@ -22512,23 +24150,26 @@ ula2sc
ul1äm
ulb4l
ul4dan
+ul2dar
ul2dr
+ul3dra
uld2se
2ule
u2l1el
ul1emb
-ule4n
+ule4n1
ul1er2h
-ule4s1t
+ul1er2r
+ule4s5t
ule2t
ul1eta
-2ulf4
-ulg4
+2ulf
2uli
ul1id
uli2k
+ulin1a
ul1ins
-uli1p
+uli3p
ul3ka
ul2kn
ulla2g
@@ -22543,8 +24184,9 @@ ull3s2
ulm2e
ulni2
ulo2i
-u2l1op
+u2lop
u2l1or
+ul2ö
ulp1h
ul2pha
ul2sa
@@ -22553,23 +24195,24 @@ ul2s1ec
ul2sei
ul2ser
ul2sum
-2ult2a
+4ult2a
ul3tan
ult3ar
ul2tau
-ulter4m
+ulter2m
ul2tri
ult3s
u2lü
ul2vr
-ulz2w
+ul3z2e
+ulz4w
2uma.
u2maa
-u2mab
u2m1ad
-u2m1a2k
-um1all
+u2m1a4k
+u2m1all
um1ang
+u2m1ant
um1anz
u2m1ap
um1ar
@@ -22580,13 +24223,16 @@ u2matl
u2matm
um1aus
u2maut
+um4ay
u2m1äh
1umd2
-u3me.
+u2m1e2b
+u2m1eck
u2m1ef
u2m1ein
ume2n1e
-um5engel
+um3engel
+u3mer.
umer2a
u2m1erf
um1erg
@@ -22608,24 +24254,34 @@ umm4a
2umme
um4mess
um3mi
+um3n
um1ob
u3mol
um3ot
ump2fa
-ump4fin
-umpf4li
-um2pho
+ump2fin
1umr
um4sam
um4s3an
1umsat
+um4sd
um2s1er
+1umset
+um4sf
+um4sg
um2sim
+um4sj
um4sk
-um2s1pe
+um4sm
+um2s3pe
+2umspf
+um4ss
um4stem
-um2sum
+um2su
+um4sv
+um4sw
um3t2
+um4ts
u2mum
u2m1u2r
1umz
@@ -22652,11 +24308,11 @@ un2dän
1undd
2unde
un3de.
-underer6
+underer4
und3erf
und3erö
-underten8
-under8tend
+underten4
+under6tend
und3erz
un2dex
1undf
@@ -22666,44 +24322,49 @@ un2dim
1undn
undo2b
un2dop
-un2dor
2un2d3r
4unds.
2undsc
-und3sp
+und3s2p
un2d1um
undü4
1undv
-1undz
-u3ne2
+1un4dz
+u3ne
+une2b
+une2d
+un2ei.
un3eid
un3ein
+un3eis
un2emi
une4n1
+un2ens
unen2t
-une3re
-une3ri
+un2enz
u4nerk
u4n3erz.
un2es2
unf2
un3fa
-unft2s
un2gab
un2gam
+ungar4
un2gat
+1ungeh
+un3gen
3ungena
-unger4e
+unger2e
1unget
1ungew
1ungl
+ung3lat
un2glu
un2go
un2gr
ung3ri
-ung4s
-ungs3tr
-ungstra8s7
+un4g4s3
+ungstra4s5
u3nic
un2id
un3ide
@@ -22718,19 +24379,20 @@ un3isl
u3n2it
1u2niv
2unk
-un2k1a2
+un2k1a
un3ker
un2k1es
un2ket
un2kne
-un2ko2p
+un2ko4p
un2kro
unk3s2
unk4tit
unk2tr
unlö2
+1unm
un4n1ad
-unn2e
+unn2e2
unne4n
u2nob
uno4r
@@ -22738,20 +24400,22 @@ un2os
1unr
uns2
2uns.
-unsch5el
+unsch3el
1unsi
un3sk
un4ski
-un3sp
+un3s4p
uns4t
-unsta4g
+unsta2g
+uns6tel
unst1r
2unsy
2unsz
1unt
un3ta
un3te
-unte4ri
+unte2ri
+3unterr
2unti
un3tr
unt3s
@@ -22759,7 +24423,9 @@ unt3s
3unty
2u2nu
u3nuc
+unu4s
u1nü
+1unv
unvol2
unvoll3
1unw
@@ -22784,23 +24450,29 @@ uote2
u1ox
u1ö2d
u1ök
-u1pa
+u2p
+u3pa
+u3pä
3upd
-u1pe2
-uper1
+u3pe2
+uper3
uperer4
+u3pé
up2fa
upfe2
-u1pfl
-u1p2fu
-u3p4i
+u3p4fl
+u3p2fu
+u3ph
+u3pi
+up4id
+u3pl
up4lu
u3po
2upp
up2pl
-u1pr
+up5pun
+u3pr
upra3
-u2p3ras
up4t3a2
upten1
up4tene
@@ -22808,23 +24480,30 @@ upt3erf
upt3erg
upt3erk
upt3ers
+upti2m
+upt3in
upt1o
-u1q
-4ur.
+up4tr
+u3pu
+u3py
+up4yb
+2ur.
u1ra
u2rab
u3raba
ura2be
+u2r1aka
u2r1akt
u2ral2t
u2r1am
ura4na
u3rand
-uran6fän
+uran4fän
ur1ang
-uran4ge
+uran2ge
ur2anh
-uran5s
+ur2anr
+uran3s
ur1anz
ur3ap
u2r3ar
@@ -22833,77 +24512,79 @@ u3rasc
ur1a4sp
ura4str
ur4a3te
-u2r1att
+u2r3att
ur1au
2u1rä
ur1äl
-ur1ä2m
+ur1ä4m
ur1än
ur3b2a
2urc
urch1
-urchas4
+urchas2
+urch3s
urcht3e
ur3d2a
ur3d2i
ure1e
ur1eff
+ur1ehr
ur1eig
u2rele
ure2n
ure4na
-u4ren4se
-u4rentn
+u2ren2se
+u2rentn
u2r1ep
urer3h
urer3k
ur2ert
u2rerw
ur1eta
-ur2e3th
ure3u
2urf
-ur2f3l
+urf3l
+ur2fli
ur2fro
-urf4spr
+urf2spr
urf3t
-ur6gense
+ur2gei
+ur4gense
urg3inn
urg1l
ur2gla
ur2gri
+urgs4
uri2c
ur1ide
uri3en
u2r1ind
-urin6sek
-urin8stin
+urin2se
+urin4sek
u2ri2so
-2urli
-ur4matt
-ur2m1au
+ur2m1ar
+ur2matt
+ur2mau
urm2ei
-ur4mern
-urmet1
+ur2mern
+urme2t
ur2mum
ur2mun
ur3n2e
+urn2o
2u1ro
urob2l
ur1off
-uroh2
-uros4
-urost2
+uro3h2
2u1rö
-ur3p4
+ur3p
2urr
ur3re
ur2rh
3ursac
ur2san
-ursau4
+ur4sau4
ur2s1er
-ur2s1of
ur2spa
ur2sun
urt2
@@ -22912,152 +24593,170 @@ ur4tai
urt3ein
ur2tro
urts2c
-urts1t
-u3ru
+2urtu
+ur1umh
+ur1ums
ur2z1a
ur2zä
ur2z1ec
ur2zep
-ur2zi
ur2z1op
urzt4
-ur2z1w
+ur2z3w
2us
us3a2b
usa2gi
+usal3t
u4s1amb
u4samt
u2sang
-us2ann
+us4ann
us3ark
-us5art
+us3art
usa4s
us1ast
us3ate
-u1sä
u2säh
u2s1äs
+us3b
u2sce
-u4schab
-u4schak
-u3sche.
-u4schef
-usch5eic
-u4sch3eu
+u2schab
+u2schak
+u2schar
+u3schart
+u2schef
+usch3eic
+u4schen4e
u3schi
usch3mü
-u3schu
-usch5wer
+usch3wer
u3se.
u3s2e3b
u2s1ec
+use1e
use2ei
u2s1ei
-u4sen4se
-u4sentl
-u3sep
-use4rec
+u3seid
+u2sen2se
+usen4te.
+u2sentl
+use2rec
u2s1erl
u2serp
us1erw
u2s1ese
u2sex
+u3si.
u2sid
usi3er.
-usi5ers.
+usi3ers.
u3sig
-usi4kat
+usi2kat
us1inn
+u4ske
us3kl
u4sko
+u4skö
+u4sku
usmas2
-usma5sse
-u1so
+usma3sse
us3oc
us1oh
u3sol
u2sop
us1orc
us1ou
-u1sö
-u1sp
+u3sov
u2spac
+us2par
us3part
-u2s1pas
-u3spec
+u2s3pas
+us3pe
+u5s4pec
u3spek
u2sph
-us1pic
+us3pic
+u5spit
u2spo
us2por
u2spu
-usrich7
-us2s3ad
-us2s3eb
+usrich5
+u4ss.
+us2s1ad
+u4ssc
+us2s1eb
usse4g
-u4s3sel
+u4s5sel
us2se4n
-us5sende
-us6seni
+us3sende
+us4seni
us2sep
us2ser
us3ser.
uss3erf
-usser4z
us2sez
u3s2sig
-uss3k
+u4ssl
us2sof
+u4ssr
+u4sst
us2sum
u2stab
u3stad
u3stal
-us2ten
-us4ter
+us3tas
+us3tau
ust3erl
+us3ther
+us3tic
u3stis
-u2s1tor
-u2s3trä
-u4strit
-us2tum
-u2s1tur
-u1su
+us3tob
+us4tod
+u2s3tor
+us4tras
+u2strä
+us4trop
+u2s3tur
+u2suf
+u2s1umb
u2sumd
u2sumg
u2sumz
3usus
+u2sü
2uß
u2ß1u
-2u1t
-4ut.
+2ut
u3ta.
u3taf
u2t1alt
-ut1a2m
+ut1a4m
ut2ans
u2t1ap
-u2t1ar
+ut1ar
u2taut
ut1äh
-u2tär
+u2t1är
ut3c
u3te.
-u4t1e2d
+u4te2d
ut1ei.
ut1eie
ut1ein
ut1ela
+ut2em
ute2n1
uten2a
u2tent
-ute4ral
-ute5r4er
-ute6ring
+ute2ra
+ute3ras
+ute4ring
uter3k
-ute4ros
+ut2erl
+ute2ros
u3t2es
ut2et
-u2t2ev
+ut2ev
u2t1ex
utfi2
ut3hal
@@ -23067,122 +24766,141 @@ u2t1hi
u2t1ho
u2thu
u2t1id
-u4tigel
+u2tigel
uti2vi
utli4n
utmas2
-utma5sse
+utma3sse
u3to.
uto3c
-u5to3m
-uto1p
-uto3pa
+u3tom
+uto3p
u2tops
utor2a
u2tord
uto2re
-uto4rin
+uto2rin
4utou
u2töl
-4utr
ut3rea
u2trou
ut3rü
utsau2
ut2säu
-ut4schl
-ut4schm
-ut4scho
-ut4schö
+ut2scha
+ut3sche
+ut2schl
+ut2schm
+ut2scho
+ut2schö
ut3ser
-ut3s2k
-ut1s2p
+u4t3sk
+uts2p
ut3sta
-ut3sto
-ut3tan
-ut3t4l
-utt1s2
-utu2b
+uts4to
+ut3t2l
+utts2
+utu4b
u2tum
utu4n
-u2t1une
+u4t1une
utu4re
utu3ro
-utu5ru
-u4tz
+utu3ru
+utz3a
utze2
ut2zeh
utz3eng
utz2er
+utz4erg
ut2zet
ut2z1in
ut2zis
ut2zö
-ut2z1w
-2u1u4
+ut2z3w
+2u1u2
+uu4fe
uum1
-uum3a2
+uum3a4
uume2
-uungsma5
-uungsmas8
-u1ü4
-u1v4
+uungsma3
+uungsmas4
+u1ü
+uü4be
+uv2
u2ve.
uve3rä
-u1w
+uv4re
2u1x
ux2e
+uxi3
ux2o
ux3oe
-uxt4
-u1y
-u2yo
-2u1z
+uxt2
+u1ya
+2uz
uze2
u2z1ec
u2z1ene
uz2er
-uzo2f
+uzo4f
uz3ot
-uz1we
+uz3we
uz3z2
-1üb
+uz4zb
+1ü2b
üb1ä
2übc
2übd
-übe2
+üb2e2
übe3le
+ü3bem
+ü3ben
übe4na
übe3ne
über1
überas4
-ü4bet
+ü3bes
+ü3bi
üb3l
-üb5r
+üb3r
+üb5rig
2üc
ü1che
üch3l
üch4s1c
ücht4e
-ücke4n
+ücke4n1
ück1er
ück3eri
-ücker6ke
-ü4d3a4
+ücker4ke
+ücker2l
+ü2d
+üd3a2
+üda4m
+üda4s
+ü3de
üde2l
üden2g
-ü3d2ens
-üd3o4
-üdö4
+ü5d2ens
+üdf6lan
+ü3di
+üd3o2
+üdo4s
+üdö2
+üdö4s
üd3r
üd3s2
-üd3t4
-üdu2
+üdsa1c
+üdsau2
+üd3t2
+ü3du2
üdwe4
üe2
üeb3
ü1ei
-ü4f1a
+2üf
+ü2f1a
ü2f1ä
ü2f1ei
ü2fent
@@ -23190,25 +24908,24 @@ uz3z2
ü2f1erg
üf2fl
ü2f1i
-üf3l
+ü2f3l
ü2fo
üf3ten
ü2fum
-ü1g
üg2e
üge2l1a2
üge2lä
üge4lec
-üge6lei6s
+üge4lei4s
üge2lo
ügen3s
ü2g3l
ü2gn
-üg3s
+üg3s2
üh3a2
ü1he
ü2h1ei
-ü2h3e4m
+ü2h3e2m
ü3hem.
ü2h1eng
ü2h1ent
@@ -23216,41 +24933,49 @@ uz3z2
ü2h1er2k
ü2h1er2z
ü2hex
-üh1i4
+üh1i2
+ühi4r
+ühl1au
üh1lä
üh2lel
+ühlen1
+üh2lene
ühl2er
üh2lö
+ühl2se
ühl4sk
-ühl4sta
-ühl4sti
+ühl2sta
+ühl2sti
üh3mo
üh3ne
-üh1o2
+üh1o
+üho4f
üh3r2e
ühr3ei.
ühre2n1
üh1ro
ühr3ta
-ühs2
-üh3sp
+üh3s4p
+ühs4t
üh3stu
üh3t
üht2a
üht4r
ü1hu
-üh1w
-ü1k2
+üh3w
+ük2
ül1a
ül2c
ü3l2e
ü4l3ef
+ül3eim
üle2r3a2
ül2la4
üll1ad
üll1au
ül2lei
-üll2er
+üll2erg
+üller2z
ül4leu
ül2lic
ül2lid
@@ -23260,128 +24985,133 @@ uz3z2
ülls2
ü2lö
ü1lu
-ü2ma
-ü2ment
+ü2m
+ü3me
+ü4ment
+ü4m1e2p
üme2ra
-ü2m1id
-ü2m1in
-ü2m1u
+ü3mi
+ü4m1id
+ü4m1in
+üm1u
2ün
-ü4n3a
+ü2n3a
ün2da
+ün3di
ün2dr
ü2n1erd
ünf1
ünf3li
ün2g3l
-üngs2
-ünster3
+ünste2r3
ün2za
ün2z1i
ünzu2
ün2zun
ün2zw
-ü1pe
+ü2p
+ü3pe
üpf3l
-ü1pi
+ü3pi
+ü3pl
üp2pl
+ü3pu
2ür
ür1a
ü2r1ei
ü2r1e2l
-ür2f1er
+ür2f1er2
ür2fl
ür2fr
-ür4g3en4g
-ürge4ra
+ür2g3eng
+ürge2ra
ürk2e
ü3r2o3
+üro5fe
ürom2
+üro5ma
üror2
+ür2rh
ür4ster
ürte2l1
ürt2h
+ürz2a
ür2z1in
ür2zö
-ür2z1w
+ür2z3w
üs2a
+ü3schi
ü2schl
ü3s2e
üse1e2
üse3l2
üse4n
üse3r4
-ü1sp
-üs4s3a
-üs2s1c
-üss2e
+üs2p
+ü4ss.
+ü4s4s3a
+üs4sä
+ü4s2s1c
ü4s3sel
-üs4s3o
-üs4st
+ü4ssl
+ü4s4s3o
+ü4s4st
üs2su
-üs4t
ü2st3a
+üs4te
ü4stei
üste2n
-ü2str
-ü1su
-ü1ß
+2ü1ß
2üt
-ü1ta
ü2t1al
-ü1te
üte3m
üte4n
-üten3s
+üten3s4
ütent4
üten3z2
üte2ra
-üte2r1e
-üterich6
+üte2re
+üter3ei
+üterich4
üter3n
ü2t1h
-ü1ti
-üt3r
+ü2t3r
üt2se
-üt2s1t
+üt2s3t
ütte4n
üt2tr
-ü1tu
üt3zen
üt2zw
-ü1v
-ü1z
+1v
3va.
2v1ab
vab4r
va1c
-va1f4
-va3g
-vag2a
-va4gh
+va3f
+va3g2a
va2la
2valu
v2an.
2vanb
-2vang
v2ans
2varb
+vari2e
v1arm
vas2
2v1ass
va2s3to
-v4at
va2t1a4
va4tag
+va4tan
va2tei
-va4t3eng
+va2t3eng
vates2
va2t3h
va4tid
vati3k2
va4tim
va4t1in
-vati8ons.
+vati4ons.
va4tord
va4torg
va2t3r
@@ -23389,25 +25119,29 @@ vat3s2
va2t1u
vat3z
2v1au
-vä1
-2v1b
+2vb
2v1c
-2v1d2
-1ve2
+2vd2
+ve2
+ve3ak
+2ve3al
ve3an
ve3ar
veau3
-ve3b4
+ve3b
+veb4r
ve3c
ve3d
-ve3fa
+ve3e2
+ve3f
+ve4ff
ve3g
ve3h
2veig
v2eil
2vein
veit2
-veits1
+veits3
ve3la
2velan
vel2ar
@@ -23416,73 +25150,81 @@ v1ele
ve3lei
ve3l2i
ve3lo
-vel2o1p
+vel2o3p
ve3ma
ve3me
2v1emp
2ve3mu
ve3nal
ve4nas
-ven2c
+v1endu
ve3ne
+venen2d
+2venerg
ve3ni
ve4nin
ve3nö
ven5st
-ven4t3ag
+ven6t3ag
vent4sk
ve3nü
+ven2za
2veo
ve3of
+ve3pa
ve4pi
ver1
ver3a
ve3rad
2veral
ve3rand
-ve3r4ane
+ve3rane
vera4s
-ver6bart
+ver4bart
ver3b2l
-ver3d2
+ver3d4
vere2
-verf4
+vere4i
+verein4s5t
+ve4rf4
ver3g4
-vergas6
-verga7sse
+vergas4
+verga5sse
ve3ri
ve4rin
ver3k
-vermas8sen
+vermas6sen
vern2
-ver4sep
+ver2sep
ver3sta
vert4
-ver5te
+ver3te
ver3u4
ve3rus
ve3s
2vesc
2vese
ve4sh
-ve4s1p
+ve4s3p
+ve5spi
ves4t
-ve3ta
+ve3t
vete1
vete3r
-ve3ti
-ve3tr
-ve3t2s
+ve4tl
+ve4ts
+ve4tt
2veü
ve3v
ve3w
-2v1f4
-2v1g
+ve3z
+2vf2
+vf4gh
+2vg
2v1h
vi1an
vi3ar
vi4a3t
-vi2ä
vi3de
3vie
vie2h1a
@@ -23490,7 +25232,7 @@ vi2el
viela2
viele2
vi2er
-vie4rec
+vie2rec
vie2w1
vig2
2vii
@@ -23499,14 +25241,14 @@ vi2l1a
vi2lä
vi4l1e2h
vi2lei
-viler4
-vi4lers
+viler2
+vi2lers
vi2l1in
vi2ma2
vi4na
vin3d
ving3
-vings2
+vings4
v1ins
vi3sa
vise4
@@ -23516,50 +25258,56 @@ vi2sp
vis2u
viv2
viz2
-vize5
-2v1k
-2v1l4
+vize3
+2vk
+2v1l2
v3le
v2lie
-2v1m
+2vm
vm2e
+vmwa4
2v1n2
-1vo
2v1ob
vo2be
vob4l
voge2l1
vo2gu
+vo2i
vol2a
vol4la
voll3ar
-voll7auf.
-vollen6
-voll5end
-voller6t
+voll5auf.
+vollen4
+voll3end
+voller4t
2v1op
+vo2pe
vo2r1
vo4r3a
-voran8schl
+voran6schl
vor3g
vo3ri
vo4rie
vo5rig
vorm2
-vormen4
+vormen2
vor3o
vorö4
-vort4
+vor3t4
+vo4ru
+vo5ruf
vot2a
-voy1
-2v1p
+2vp2
+v3pf
+2vq
vr2
v1ra
v2ree
+v4ret
3v2ri
-2v1s2
+2vs2
v3sz
-2v1t
+2vt
vue3
vu2enu
vu2et
@@ -23567,128 +25315,138 @@ vu2et
2vumg
2vumk
v1ü
-2v1v
-2v1w
-2v1z
+2vv
+2vw
+2vz
+1w
w2a
-1waa
+3waa
wab2bl
wa3che
-wach8stub
-wach4t4r
-1wack
+wach4stub
+wach2t4r
+3wack
waffe2
waffel3
-1wag
-wa5ge
-wage4n
+3wag
+wa3ge
+wa5ge4n
wa2g3n
+wag5ne
wa3go
-1wah
-wahl5ent
+wag4r
+3wah
+wahl3ent
wah4ler
wah2l1i
-1wal
+wa4ig
+3wal
+wala3c
wa2lar
-2walb
+4walb
wal4d3a
-wal4din
+wal2din
wal2dr
wa2les
wa3li
-wal4li4n
+wa5lis
+wal2li2n
wal2m1
wals2
-walt1a
-wal6tere
-wal6terl
+wal4t1a
+wal4terl
wal2to
-wal4tur
+wal2tur
wa3na
wan2d1a2
wan2dr
w3anf
-2wang
wan3g2e
wang4s
-1wann
-wan6z5en6d
-wan4zer
+3wann
+wan4z3en4d
+wan2z3er
wa2p
-1war2e
+3war2e
ware1i
-wa5ren
-1warn
+wa3ren
+3warn
war4ni
-wart4e
war2th
+wart2st
war2za
-1was
+3was
wa3sa
-was2c
-wa4scha
+was4c
+wa2scha
wa3sche
+wa4schei
wa3schi
-wa4sch3l
-wa4schw
+wa2sch3l
+wa2schw
wa3sh
-wass4e2
+wass2
+was3s4e2
wa3su
-w2ä
-1wäh
-1wäl
+wäch3s2e
+3wäh
+3wäl
wäm3
-2wäng
-1wäs3
-wä5sc
+4wäng
+3wäs3
wä4ss
wäss4e
-2w3äu3
-2w1b2
+2w1äu3
+2wb2
wbu2
2w1c
-2w1d
+2wd
we2a
we2b1a
webe1i
we2b3l
we2bo
we2b3r
-we2e2
+webs2c
+wee2
weed3
+wef2e
we2fl
-1weg
+3weg
we2g1a
we4g1ei
-weg5ersc
+weg3ersc
we4g3l
we4gn
-we2g1o2
+we2g1o4
we4g3r
-weg1s
-weg3s2a
-1weh
-weh4r3er4
+weg5re
+weg3s
+wegs2a
+wegs4t
+3weh
+weh2r3er2
wei2bl
weib4r
-2weie
-weifel6d
-wei4fre
+4weie
+weifel4d
wei2gr
+wei2ha
wei3k4
-1weil
-weinsau6
+3weil
+wei3le
+weinsau4
wei3sc
+weisch4
wei2t1r
-weit1s
wei5ze
-welle4
-wel6schl
-wel6schr
+wel5le4
+wel4schl
+wel4schr
wel2t1
-welt3a2
+wel4t3a2
welte4
-wel6t5en6d
+wel4t3en4d
wel4th
welt3i
welt3r
@@ -23696,213 +25454,221 @@ wem2ma2
wen3a2
wen2gl
we3n2i
-wen2ka
-wen4kla
-wen4k3ri
+wen2kau
+wen2kla
+wen2k3ri
we2r3a2
wer5be
werbe3i
wer2bl
werb2s
-1werbu
wer3d2
-5werdens
-1werdu
+3werdens
+3werdu
werer2
wer2fl
-2werg
wer2ga
-wer6gels
+wer2gel
wer2g3o
wer2gr
werin2
we3rins
we2ri4o
-1werk.
+3werk.
wer4k1a
-1werke
+3werke
wer2ki
wer2k3l
wer2kn
wer2k3o
-wer4k3re
+wer2k3re
wer2ku
we2rö
-wer4sta
-wer2ta
+wer2sta
+wer2t1a
wer2tä
-wert3ei
-wer6teig
-wer6t5erm
+wer2tei
+wert3eig
+wer4t3erm
wer2th
-wer4tin
+wer2tin
wer2t1o2
-wer4tre
-wer4t3ri
-wer4tum
-1we3s2e
+wer2tre
+wer2t3ri
+wer2tum
+3we3se
wesen4s3
-we2sp
+we2s3p
wes4t
we4st1a
we4st3ei
+wes6tel
we5sten.
-we6sten6d
-we5stens
+we4sten4d
we4steu
+wes6tex
we4sti
-we2st1o4
+we4st1o4
we2st3r
we4stu
-1wet
-2wets
+3wet
+4wets
wett3s
2w1ey
-2w1f
-2w1g
+2wf
+2wg
whi2
w3ho
w2i
wicht4s
-1wid
+3wid
wi2e
-2wieb
-1wied
+4wieb
+3wied
wie3l2
wie3n2e
wie4st
wik2
-1wild
+3wild
wim2ma
-wim6ment
wim4m3u
win2a
-win4d3ec
+win2d3ec
win3del
-win6d5erz
-1win2d5r
-4wing
+win4derz
+3win2d5r
+2wing
win2g3r
win2kl
-win8n7er8sc
+winner2
+win4n5ersc
win2no
win4num
win3s
wint2
-1wi4r
-wire3
-wisch3l
+3wi2r
+wi4re3
+wis4ch
wi3s2e
-wi2sp
-1wiss
+wi2s2p
+3wiss
wiss4z
wi3st
wi3th
-1witz.
-1witzl
+3witz.
+wit2zer
+3witzl
wiz2
-2w1k
+w2j
+2wk
2w1l
-2w1m
+2wm
2wn
wns2a
wn3sh
-1wo1c
+3wo1c
wo2cha
woch2e4
-1woh
-woh4lei
+woh2lei
woh4na
-1wolf
+3wolf
+wol3fe
wolf2s
wol4la
wol2lä
-wol4ler
+wol2ler
wor3a
wor3d
-wo4r3i
-worn2
+wo2r3i
wort1a
-wor4tel
-wor6terh
-wor2t3r
-worts2
+wor2tel
+wor4terh
+wor4t3r
wo4r3u
wor3ü
wot2
-1wöc
+3wöc
wöl2fo
wört2h
-2w1p
+2wp
w2r
w3re
w3ro
-2w1s
-ws2e
+2ws
w3s2h
w3s2k
-w4s1u
-2w1t
+w4sk.
+w2s1u
+2wt
wti2
w2u
-1wuc
+3wuc
wuch4sc
-wuch4st
-w3u2f
+wuch2st
+w3uf
+wu4fe
wuls2
wul3se
wund4e
wung3r
-wung5s2
+wung5s4
wun2s
-wunsch5l
+wunsch3l
4wur.
wur2fa
-wur2f1o
+wurf1o
wur2fr
-wurs4
-1wurst
-wus4
-1wu2t1
-1wüh
-1würf
-1würst
-wüs4
-2w1w
-2w1z
+3wurst
+wur2sta
+wurs6te
+wus2
+wus4s
+3wu2t1
+3wüh
+3würf
+3würst
+wüs2
+2ww
+2wz
x1a
1xa.
2xa2b
1x2ac
1x2ad
1xae
-xa1fl
+xa3fl
1x2a3g2
2xal
xal2l
-xa2m
+x3am
+xa5met
+xa4mi
+x2an.
xand4
1xane
1xani
x2an3t2
+xanti3
x2anz
xa2r
1x2as
xau3
xaus2
xa2z
-2x1b4
+2xb
+xb4ri
+xcal2
x1ce
x1ch
x1cl
-4x1d
+2xd
xda2
1xe
3xe.
-2x1e4g
+2x1e2g
+xe4ge
2xek
xe2l
-3xel.
x1ele
xe3lei
x1em
@@ -23919,59 +25685,65 @@ xer2la
x2ern
xers2
x2ers.
+xe4rx
3xes
2x1eu
2x1ex
-2x1f
-2x1g
+2xf
+2xg
2x1h
xi1c
xich2
-2xid
xi2dan
xide2
xi2dei
xi2d3em
x1i2do
-3x2ie
+3x2i2e
xie3l
+xi4en
xi3g
+3xi3k
+xik4l
xi2ler
xili3a
xi2lo
xi2l1u
-xim2
+1xim2
xin3s2
x2is
xi2sa
xi2s1e
+xiso2
xi2sp
-xis5s2
-xi3s2tä
+xiss4
+xis5st
+xi3stä
xi2su
3xit
x1i4tu
xive4
-x1j
-4x1k2
+2xk2
xkal2
-4x2l2
+2x2l2
x3lä
x3le
-2x1m
+2xm
2x1n
-2xod
-2xoe4
+2xoe
+x3o2l
x1o2r
-xos2
+3xos2
2x1ö2
-4x1p
-xpor6ter
-xpor4t3r
-x1q
+2xp
+xpor4ter4
+xpor2t3r
x1r
-2x3s2
-4x1t
+2xs2
+x3sh
+x3sk
+x3sz
+2xt
xt1a
x3ta.
xta2b3
@@ -23980,7 +25752,7 @@ xt2ant
x3tas
x2t1ä
x3tät
-xtblock5
+xtblock3
x2t1e2d
xt1ein
x2t1el
@@ -23991,8 +25763,9 @@ xtfi2
x2t1h
x2t1id
xti2la
-x2til2l
-x2t1o4
+xtil2lu
+x2t1o2
+xto4r
xtra3b4
x2t3ran
x2trau
@@ -24000,39 +25773,44 @@ xt3rec
xt3s2
x2t1um
x2t1un
-1xu
-xu1a
+1xu1
xu2n
2xunt
xu2s3
xusa2
xuss2
-2xv
-2x1w
-3xy.
-x1z
-2y1ab
+2x2v
+x3ve
+x3vo
+2xw
+1xy.
+y1
+y2a
+2y3ab
1ya2c
-y2ach
+y4ach
ya1h
-y1al.
+y3al.
+ya4mo
+y3an.
yan2g
-y1ank
-ya1q
-ya3ra
-y1ät
-y1b
+y3ank
+y3anz
+y3ar
+y4a3ra
+y4are
+yas2
+ya4st
+y2än
ybe2r
-y1c
y2chi
y3chis
ych3n
-y1d
-yd4r
-ydri2
+ydi3e
+yd4ri2
+yd5ric
ydrid3
-ydro3
-y1e
+yd4ro3
y2ec
ye2d
y2ef
@@ -24043,124 +25821,134 @@ y2ere
yer2n1
y2e2s
y4es.
-ye3s2p
+y4e3sp
ye4st
ye2th
-y1f2
-y1g
-ygi2
+yf2
ygie3
yg2l
-y1h
y3ho
yhr2
-2y1i4
-y1j
-y1k2
+2yi2
+yi4sc
+yi4st
+yk2
yke3n
-yk3s
-yl1a2
-yl2a3g
-y1l2ak
+yk4ni
+yk4no
+yk3s2
+yk3t
+yl1a
+y2la2c
+yl2ag
+yl2ak
yla4l
-y2lam
+y2la4m
+yla2n
yl3ane
-y1lant
-yl4ante
-yl4anti
+y3lant
+yl2ante
+yl2anti
+y4lantr
yl2as
-ylau2
yl3c
-yle4
+yle2
y2le.
yl1em
-y2l1es
-y2l1et
+y2l3e4s
+y2l1e4t
yli4n
yl4lo2s
yl2lö2
-ylo1i2
yloid3
yloni1
yl2op
yl1ora
-ym2a
+y2m
+y3m2a
ym4an
ym4ar
ym4as
-ym4e
+y3mä
+y3me
+ym4el
+y3mi
+y3mo
ymp2
ym2pha
-ympi1e
-ynä4r
+ympi3e
+ymp4t
+y3mu
+ynä2r
yn2eu
ynk2
y2n1o2
yn2oz
yn3t2
+y2o
yob2
-y2od
yoga3
yom2
yon2a
-y1ont
-y1o2pe
-y2ost
-y1ou
-2y1p
+y4one
+y3ont
+y3o2pe
+y4ost
+y3ot.
+y3ou
+y2ö
+2yp
ypa2b3
ypa2n
yp2e2
ype4r3o2
-y2pf
y2p1i2d
y2p1in
y2plo
y3po3
-y4p3s
yp3th
ypu2
y2p1um
-y1q
-y1r
-y3r2e
+yr2e
y3ri
yri1e
yri3en
y3ro
yro4ste
yrr2
-2y1s
+2ys
ys2an
ysch4
ys2e1
+ys4ei
ysein2
-ys1er
-y4s3l
+ys3er
+ys4ho
+ys3l
ysme3
-ys2o
-ys2pi
+ys4pi
yst2e
yst2h
-ys2tra
+ysto4le
+ys4tra
y4stro
-y3s2ty
+y3s4ty
ysu2
+ys4ub
+ys1ur
y3s2z
-y1t
-y2te.
-y2tes
yt2h
ythe1
+ythi3e
y3to
-y4t3r
+y2t3r
yu2r
yur2e3
-y1v
-y1w
-y1y
-y1z2
+yvet2
+yvon4
+yz2
yzer2i
+1z
2z1a2b
zab3l
2z1ach
@@ -24172,42 +25960,49 @@ zach2s
za3gr
3z2ah
zah3len
-zah4ner4
+zah4ner2
z1ak
4z3akk
2z1al
+4z3alb
4z3ald
3zali
-2z1a2m
+2z1am
+za4me
z1a2n
-4z3a4n4a
-2z3anb
+z2an.
+2za4n4a
+2zanb
za3ne
-2z3anf
-2z3angs
-3z2ank
+2zanf
+2zangs
+2zanh
+z2ank
zan2ka
-z3anl
-2z3anr
+2zanl
+2zanp
+2zanr
zanti1
+2zanw
za4pf
-z1aq
+z1a2q
z1ar
3zar.
2zarb
za3re
2zarm
3z2aro
-z2arr
zar2t1r
2z1as
+zas2b
+za4sc
za3st4
2z1aß
z3at
zat2e
za2to
3zaub
-2z1au2f
+2z1au4f
2z3aug
3zaun
z3aur
@@ -24217,56 +26012,65 @@ z2äh
3zähn
2z1äm
z1än
-z1äp
z1är
2z1äus
2zäuß
-4z3b4
+2zb2
+zbah2
zber2e
-zbü1b
+z3bo
+zb4ri
+z3bü
+zbü3b
zbübe3
-2z3c
-2z3d2
+2z1c
+z3ca
+z3ch
+2zd2
+z3da
zdan2
zdä1
+z3dü
3ze.
2zea
+ze2ana
zeau3
zeaus4
2z1e2ben
2z1echo
ze1e2
-zeeu3
2z1eff
z1e2ga
zehe4
zehen1
zeh2l
+zeh4n1a
+zeh4n3en
ze3ho
-zei1f4
+zei3f4
zeik4
zeil2
zei3la
zeile4
2z1ein
ze3in.
-zeinbus6
z2e1ind
zei4ne
4z3einh
ze3inse
-ze2i3s2
+ze2i3s4
3zeit
zei2t1a
+zeit3end
zei4t3er
zei2to
zei2tr
zeit3ri
-zek4
+zek4l
ze2l1a
zela2d
+zel3am
zel3a2n
-zelau2
ze2l1ä
zel3d4
4ze2lek
@@ -24281,11 +26085,11 @@ zel4l3ac
zel4lar
zel2lä
zel4leh
-zel6lein
-zel6ler6t
-zeller6z
-zelli4n
-zel4lum
+zel4lein
+zel4ler4t
+zeller4z
+zel2li2n
+zel2lum
zelm4
ze2l1o
zels2
@@ -24295,14 +26099,15 @@ zel2ti
zelu2
zembe2
2z1emp
-5zen.
+3zen.
ze4n1ac
ze4nas
zen3au
ze2nä
ze3n2em
zenen1
-4zenge.
+3zenerk
+2zenge.
z4engl
2zengp
2zeni
@@ -24311,15 +26116,15 @@ zenk2
zen3n
ze2n3o
ze4not
-4zen4sem
-zen4ser
+2zen2sem
+zen2ser
zens2p
z2entn
z1ents
2zentw
2zentz
ze2nu
-zen4z3er
+zen2z3er
zen2zw
zeo4r
3z2er.
@@ -24333,44 +26138,44 @@ z2erfe
z3erfül
z2erga
2z1ergä
-4z3ergeb
-z4erges
+z3ergeb
+5z4erges
z4ergl
-zer4gon
+zer2gon
4zergu
3z2erhe
-2z3erhö
+2z1er3hö
ze3ri
-zerin6te
+zerin2t
z2erko
3zerl.
-zer4lau
-zer4le.
-4zerleb
-zer4len
+zer2lau
+zer2le.
+2zerleb
+zer2len
2zerlö
3z2ern
-zer4nan
-zer4n3e4b
+zer2nan
+zer2n3e2b
zer4nei
2z1erö
zer2öf
+ze1rös
2z1erq
+3zerr
4z3erreg
z2ers.
-2z1er4sa
+z1ersa
+zers4t
zerta2
zer4t3ag
-zert4an
-zer4tau
-zer6tere
-zer6terl
-zer4tin
+zert2an
+zer2ter
+zer2tin
zer2to
-6z5ertrag
-zer6trau
+z3ertrag
+zer4trau
z1erwe
-4zerwei
z1erz
zer2ze
ze2s
@@ -24378,14 +26183,15 @@ ze2s
ze3sc
zes1e
zes3er
-ze4s3po
+zes3p
+ze4s5po
zes2sa
-zessen4
-zes6s5end
-zes4ser4
+zessen2
+zes4s3end
+zes2ser
zes2sp
+zes2sum
ze3sta
-zes2th
ze3str
ze2ß1
z2et.
@@ -24393,20 +26199,28 @@ z2et.
2ze2th
ze2tr
2zetts
-zeu4gem
+zeu2gem
zeu2g3r
2z1eul
ze1ur
2z1e2x1
-2z3f4
+2zf
+zf4at
zfäs3
+z3fe
zfeue2
-2z3g4
+zf4la
+zf4le
+zf4re
+zf4rü
+2zg2
zgang5
zger2a
zger2s1
+z3gn
+zg4nu
2z1h2
-z2hen
+zhau2t1
zhir3
3zi.
zial5l
@@ -24415,99 +26229,117 @@ zi2ar
zich2o
zi2dei
zid3r
-zie4ler
+ziele2
+zie2leb
zie2l1i
zi1erh
zi1es
-zi3ess
3zig
-3z2il
+zigs4
+2z3ik
+zi2ko
+3zil
zil2e
z2imm
-2zimp
+4zimp
zim2t3
2z1ind
zin2e
zin3ei
2z1inf
z1inh
-zi4n3in
-zin1it
+zi4n1in
2z1inj
zin4na
zin4o
zin2sa
-zin4ser
-4zinsuf
+zin2ser
+zin4sk
+2zinsuf
zi2o3
zirk2
-zirk6s
+zirk4s
z1iso
zi2sp
zisse4
-zis4t
-zistras6
+zi4stern
zi3s2z
zite4
+zi3th
zithe2
zi2t1o2
zit2u
ziv2
-2z1j
-4z1k4
+2zj
+2zk2
+zk4ne
+z3ky
2z1l2
z3ly
-2z3m2
-zmas6sen
+2zm2
+z3ma
+zmas4sen
zme2e
-2z3n2
+2z1n2
+z3na
+z3ne
z3oas
2z1ob
2z1of
zo2gl
-zog4s
+zog4s3
2z1oh
zolla2
zol3len
-zoller4
+zoller2
zol2li2
-zonal2
zon3au
-zon5s4
-zon4t3er
+zon3s
+zon2t3er
zo2o
-2z1ope
+2zo2pe
2z1o2r
zo3re
3z2orn
zor4ne
2z1osz
2z1ou
+zo2w
2z1o2z
-2zö2f
+2zöf
+zö4fe
2z1ök
z1öl
2zöl.
3z2öll
2zöls
2zön
-2z3p4
-2z1q
-2z3r2
-2z1s2
+2zp2
+z3pf
+z3pl
+zp4lu
+2zq
+2z1r2
+z3re
+zreb3
+zrebs2
+z3ru
+2zs2
z3sa
zsau2
+zse1e
z3sh
+z3si
z3sk
zspor2
-4zst
+zst2
z3str
z3sz
-2z1t
+2zt
zta2n
zt3ane
z2t1au
-ztein1
+ztein3
zt3eins
zt2el
zte3ma
@@ -24528,36 +26360,42 @@ zt3ric
zt3s
zu3a
zu1ä2
-zub4
+zub4l
zubus2
3zuc
zuch2e
-zucht3r
-zud4
+zucht3
zudi4
+zud4r
zu2el
zu3e2r1
zue2t
-zu3f4
+zu3f2
+zu5fei
+zuf4l
+zuf4r
zug2em
-zu4gent
+zu2gent
+zug3g
zug2i
zu3gl
zu4gla
zu4glö
zu2go
+zug6spe
zug4ste
2z1uhr
zu3hu
zu1i2
zu3k
-zul2
+zu3l2
2z1um.
zum2a
2z1umb
zumen2
2zumf
2zumg
+2z1umh
zum2i
2zumk
2zuml
@@ -24567,7 +26405,7 @@ zum2u
2zunab
zun2e
2z1unem
-4zunget
+2zunget
2zungl
z1uni
2zu2nio
@@ -24577,62 +26415,74 @@ z1uni
2zunt
zuo2
zup2fi
-zu3pl
+zu3pfr
zu3r2a
2z1urk
2z1url
2z1urn
2z1urs
2z1urt
+zu3ru
zu3s2
zusch4
+zus4p
+zus4t
zu3t2
zut4r
zut4u
-zut3z
-zuz2
-2zü4b
+zu4t3z
+zuz4w
+2züb
+zü4be
3züc
zür1c
-2z1v
-zw2
-z1wac
+2zv
+z2w2
+z3wac
2zwag
-4zwah
-4zwap
-z1war
+2zwah
+z4wang
+z3war
2zwa2s
+2zwäc
+2zwär
2zwäs
-2z1wed
+z3wech
+z4weck
+2z3wed
2zweg
2zweh
-z2weig
+z4weig
2zweil
-zweiter6
-2z1wel
-2z1wen
-2z1wer
-2z1wes
-z2wic
+zweiter4
+2z3wel
+2z3wen
+2z3wer
+z4werg
+2z3wes
+z4wic
zwi4e
3zwing
2zwirt
-z2wisc
+z4wisc
2zwiss
-z2wit
-2z1wo
-z1wör
-z1wur
-2z1wü
-zy1an.
+z4wit
+2z3wo
+z3wör
+z3wur
+2z3wü
zy2le
-2z1z
+2zz
z3z2a
-zza3b4
-z4z3al
+zzab4
zz4at
+z3zer
zze3s
-z2z1id
-z2z1in1
+z3zi
+z4z1id
+zz1in
+z3zo
+z4zor
zz2ö
-zzug4s} \ No newline at end of file
+z3zu
+zzug2s} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/mkii/lang-mk.hyp b/Master/texmf-dist/tex/context/patterns/mkii/lang-mk.hyp
new file mode 100644
index 00000000000..96d2b2d5a79
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/mkii/lang-mk.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see lang-mk.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/mkii/lang-mk.pat b/Master/texmf-dist/tex/context/patterns/mkii/lang-mk.pat
new file mode 100644
index 00000000000..f1a5b7e9311
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/mkii/lang-mk.pat
@@ -0,0 +1,732 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see lang-mk.rme
+
+% used: а б в г д е ж з и к л м н о п Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ч ш Ñ“ Ñ• ј Ñ™ Ñš Ñœ ÑŸ
+
+\patterns{
+.б2
+.в2
+.вр5зан.
+.г2
+.д2
+.др5жат
+.др5жи.
+.з2
+.к2
+.м2
+.оÑ3в
+.оÑ3л
+.п2
+.поÑ2
+.по3ÑÑ€
+.по5Ñта
+.по5Ñтв
+.Ñ2
+.Ñтап5к
+.Ñ‚2
+.ш2
+а1а
+аб1л
+аб1р2
+а1ва
+а1ве
+ав1л
+а1во
+ав1р2
+ав1т
+аг1л
+аг1р
+ад1в
+ад1л
+ад1р
+а1е
+а1жа
+а1жи
+а1жу
+аз1д
+а1зу
+а1и
+а1ји
+а1ка
+ак1в
+а1ки
+ак1л
+а1ко
+ак1р
+а1ла
+а1ле
+а1ло
+а1лу
+а1м
+а1о
+а1па
+а1пе
+а3пкат
+а3пки
+ап1л
+ап1р
+а1ра
+ар1в
+ар1д
+а1ре
+а1ри
+ар1л
+а1ро
+арт2
+ар3тн
+ар3ту
+а1ру
+аÑ1в
+аÑ1к
+аÑ1л
+аÑ1п
+аÑ1Ñ€
+аÑ1Ñ‚
+а1т
+а2т1в
+а2тн
+а2т1р
+а1у
+а1фа
+а1фо
+ах1р
+а2ц1р
+ач1л
+аш1т
+1ба
+б1в
+б1д
+1бе
+б1з
+1би
+2б1ј
+б1м
+б1н
+1бо
+б1р2н
+1бу
+в1г
+в1д
+в2з
+1ви
+в2ју
+в1ка
+в1ки
+в1м
+2в1н
+2вњ
+воÑ1
+в1па
+вр3ве
+вр2з
+в1ро
+вр4Ñкат
+вр4Ñкит
+вр2х
+2в1Ñ
+в1тр
+1ву
+в1ш
+1га
+г2б
+г1в
+1ге
+г1з
+1ги
+г1м
+3г4нато
+1го
+гоÑ3л
+г1рв
+гр4цит
+1гу
+1да
+да2Ñ
+д1б
+д1ве
+д1вл
+д1вр
+д1г
+д1д
+1де
+д1з
+1ди
+4дицио
+д1ј
+д1к
+д1ле
+д1ло
+д1лу
+д1м
+д1н
+3д2нив
+1до
+до5з4нае
+доÑ3л
+д1п
+д1ре
+д1ри
+д1Ñ2
+д1т2
+1ду
+1Ñ“
+е1а
+еб1л
+еб1р
+е1ва
+е1ве
+ев1к
+е1во
+ев1р
+ег1л
+ег1р
+ед1в
+ед4нот
+ед1р
+е1е
+е1жа
+е1жи
+е1жу
+ез1г
+е1зу
+2е1и
+е1ка
+ек1в
+е1ки
+ек1л
+е1ко
+ек1р
+е1ла
+е1ле
+е1ло
+е1лу
+е1м
+ем1р
+е2м1Ñ
+е1о
+е1па
+е1пе
+еп1к
+еп1л
+епоÑ3Ñ€
+епо4ÑÑ‚
+еп1р
+е1ра
+ер1в
+е1ре
+ер1з
+е1ри
+е1ро
+ер1п
+е1ру
+еÑ1в
+еÑ1к
+еÑ1л
+еÑ1п
+еÑ1Ñ€
+еÑ1Ñ‚
+е1та
+ет1в
+е1те
+ет1р
+е1ту
+е1у
+е1фо
+еф1р2
+ех1р
+еш1т
+ж1б
+ж1д
+1же
+жи1
+ж1ј
+ж2л
+2ж1н
+1жо
+ж1т
+1за
+зб2
+збе3Ñ
+з1бр
+з1в
+звр2
+з1гл
+зд2
+з1дн
+1зе
+1зи
+з1ј
+з1ле
+з1м
+1зо
+з1ре
+з1ри
+1Ñ•
+и1а
+иб1р
+и1ва
+и1ве
+ив1к
+ив1л
+и1во
+ив1р
+ив1т
+иг1л
+иг1р
+ид1р
+и1е
+и1ж
+из1г
+из1д
+из1л
+из1р
+и1зу
+и1и
+и1ј
+и1к
+и2кв
+и2к1л
+и2кн
+и2к1р
+и2кт
+и1ла
+и1ле
+и1ло
+и1лу
+им1Ñ
+и2нÑ
+и1о
+и1па
+и1пе
+ип1к
+ип1л
+ип1р
+и1р
+и2рг
+и2рл
+и2рн
+и2р1т
+иÑ1к
+иÑ1л
+иÑ1п
+иÑ3Ñ‚2
+и1т
+и2тн
+и2т1р
+и1у
+и1ф
+и1х
+и2ш1т
+1ја
+ј1б2
+ј1в
+ј1г
+ј1д2
+1је
+ј1ж
+ј1з2
+2ј1к
+ј1л
+ј1м2
+ј3мн
+ј1н2
+1јо
+ј1п
+јпо4Ñ3
+ј1р
+2ј1Ñ
+2ј1т
+2јќ
+1ју
+ј1ф
+2јц
+ј1ч
+2јш2
+ј1шт
+1кам
+кап3к
+1кар
+к1ве
+к1во
+1ке
+к2ј
+кл2
+к1ле
+к1лÑ
+к1м
+к1р2д
+кр2Ñ
+кр1ш
+кр2ше
+кр2ши
+2к1Ñ2
+к1т2
+2кт.
+1ку
+к1ф
+л1б
+л1в
+л1г
+л1д
+л1ж
+л1з
+1ли
+л1ј
+л1к2
+л1м
+л1н
+л1п
+л1Ñ2
+л1т
+л1ф
+л1ч2
+л1ш
+1Ñ™
+ља1
+1ма
+2м1б
+2м1в
+м1д
+1ме
+1ми
+2м1ј
+2м1к
+2мн
+1мо
+2м1п2
+2мр
+м3рм
+мр2т
+мр3т2в
+м1ÑÑ‚
+2м1т2
+м3тл
+1му
+м1ф
+м1ч
+м1ш
+1на
+н1б
+н1в
+н1г2
+2н1д2
+1не
+н1ж2
+н1з
+1ни
+2н1к2
+н1л
+н1м
+1но
+н1п2
+н1р
+н1Ñ2
+2н1т2
+н3Ñ‚Ñ
+1ну
+н1ф2
+н1х
+2нц
+н1ч
+1Ñš
+ња1
+њаÑ2
+ње1
+о1а
+об1л
+об1р2
+о1ва
+о1ве
+ов1л
+о1во
+ов1р2
+ов1т
+ог1л
+ог1р
+од1в
+од1л
+од1р
+о1е
+о1жа
+о1жи
+ож1р
+о1жу
+оз1д
+оз1р
+о1зу
+о1и
+о1ка
+ок1в
+о1ки
+ок1л
+о1ко
+ок1р
+о1ла
+о1ле
+о1ло
+о1лу
+ом1р
+ом1Ñ
+о1о
+о1па
+о1пе
+оп1к
+оп1л
+оп1р
+о1ра
+о1ре
+о1ри
+о1ро
+ор3та
+о1ру
+оÑ3во
+оÑле3
+оÑлед4
+оÑ3ло
+оÑлу3
+оÑ1п
+оÑре3
+оÑред4
+оÑ1Ñ‚
+оÑ5тави
+оÑта5пк
+о1та
+от1в
+отвр2
+о1те
+от1р2
+о1ту
+о1у
+о1ф
+о1хе
+ох1р
+о2ц1р2
+ош1т
+1пи
+п1ко
+п1кр
+п1н
+1по
+по3Ñв
+по3Ñк
+по3Ñл
+по3Ñ2м
+по3Ñп
+по3Ñти3
+поÑтиг4
+по3Ñто
+пр2в
+пр2к
+п1Ñ2
+п1т
+1пу
+п1ф
+п1х
+п1ч
+п1ш2
+р1б2
+р2биј
+р1вј
+рв1т
+р1г2
+рд2
+р2да.
+р2дил
+р2дим
+р2ду
+рз2
+р2зат
+р2зин
+р3зно
+2р1к2
+р2кн
+р1ло
+2р1м2
+р3мн
+р2мо
+р1н
+роÑ3в
+р1па
+рп2л
+Ñ€1Ñ2
+рт1в
+рт4вит
+рт2ву
+р3теа
+р2тин
+р2тио
+рт2л
+рт2ни
+р2тов
+Ñ€1Ñ‚Ñ€
+Ñ€1Ñ„
+Ñ€1Ñ…
+рч2
+р2ча
+рш2
+р2шеш
+р2шим
+р2шу
+1Ñа
+Ñвр3зе
+1Ñе
+1Ñи
+Ñ1ј
+Ñк2
+Ñ1кн
+Ñма3Ñ‚
+Ñ2мел
+Ñ1н
+Ñ2наа
+1Ñо
+Ñ2пок
+Ñ1рд
+2ÑÑ‚.
+3Ñтавт
+3Ñтапк
+ÑÑ‚2в
+3Ñтеп
+2Ñтеш
+Ñ1Ñ‚2н
+Ñ2Ñ‚Ñ‚
+1Ñу
+Ñ1Ñ„Ñ€2
+Ñ1Ñ…Ñ€
+Ñцр2
+Ñ1ч
+1та.
+2тапк
+т1г
+2т1д
+1теж
+2теп
+1ти
+2т1к
+2т1л
+2т1м
+1то
+2тоел
+2тоеч
+2тоја
+2т1п
+т2ра.
+тр2в
+тр1л
+тр2п
+2Ñ‚1Ñ2
+Ñ‚1Ñ‚
+Ñ‚Ñ‚Ñ€2
+Ñ‚1Ñ„
+Ñ‚Ñ„Ñ€2
+Ñ‚1Ñ…
+2т1ч
+1ќ
+ќа1
+2ќ1н
+2ќ1т
+у1а
+уб1л
+уб1р
+у1в
+у2в1р
+уг1л
+уг1р
+уд1р
+у1е
+у1жа
+у1жи
+у1жу
+у1и
+у1ка
+ук1в
+у1ки
+ук1л
+ук1р
+у1ла
+у1ле
+у1ло
+у1лу
+ум1р
+ум1Ñ
+у1н
+у1о
+у1па
+у1пе
+уп1к
+уп1л
+уп1р
+у1ра
+ур1д
+у1ре
+у1ри
+у1ро
+у1ру
+уÑ1к
+уÑ1л
+уÑ1п
+уÑ1Ñ‚
+у1та
+ут1в
+утвр2
+у1те
+ут1р
+уф1
+у1х
+у1ч
+уш4ниц
+уш4но.
+уш1т
+1фе
+1фи
+ф1к
+фл2
+ф1ле
+ф2н
+ф1ри
+ф1ро
+2Ñ„1Ñ
+Ñ„1Ñ‚
+1ха
+1хи
+х1м
+х1н
+1хо
+Ñ…1Ñ‚
+1ху
+1ц
+2ц1в
+цвр2
+2цк
+ц1ки
+2ц1н
+цр2к
+цр2на
+цр2не
+2ц1х
+1ча
+ч1в
+1че
+1чи
+2ч1к
+2ч1н
+1чо1
+2ч1т
+1чу
+1ÑŸ
+џа1
+2џ1м
+1ша
+шап1
+1ше
+2шел
+1ши
+ш1к
+ш1л
+ш1м
+ш1н
+1шо1
+ш1та
+ш1тв
+ш1ту
+1шу} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/mkii/lang-zh.pat b/Master/texmf-dist/tex/context/patterns/mkii/lang-zh.pat
index 7fde63bc0f9..c00eaeccdf2 100644
--- a/Master/texmf-dist/tex/context/patterns/mkii/lang-zh.pat
+++ b/Master/texmf-dist/tex/context/patterns/mkii/lang-zh.pat
@@ -2,51 +2,212 @@
% for comment and copyright, see lang-zh.rme
-% used: ' a b c d e f g h i j k l m n o p q r s t u w x y z ü
+% used: a b c d e f g h i j k l m n o p q r s t u w x y z à á è é ì í ò ó ù ú ü Ä Ä“ Ä› Ä« Å Å« ÇŽ Ç Ç’ Ç” Ç– ǘ Çš Çœ
\patterns{
a1b
+Ä1b
+á1b
+ÇŽ1b
+à1b
a1c
+Ä1c
+á1c
+ÇŽ1c
+à1c
a1d
+Ä1d
+á1d
+ÇŽ1d
+à1d
a1f
+Ä1f
+á1f
+ÇŽ1f
+à1f
a1g
+Ä1g
+á1g
+ÇŽ1g
+à1g
a1h
+Ä1h
+á1h
+ÇŽ1h
+à1h
a1j
+Ä1j
+á1j
+ÇŽ1j
+à1j
a1k
+Ä1k
+á1k
+ÇŽ1k
+à1k
a1l
+Ä1l
+á1l
+ÇŽ1l
+à1l
a1m
+Ä1m
+á1m
+ÇŽ1m
+à1m
a1p
+Ä1p
+á1p
+ÇŽ1p
+à1p
a1q
+Ä1q
+á1q
+ÇŽ1q
+à1q
a1r
+Ä1r
+á1r
+ÇŽ1r
+à1r
a1s
+Ä1s
+á1s
+ÇŽ1s
+à1s
a1t
+Ä1t
+á1t
+ÇŽ1t
+à1t
a1w
+Ä1w
+á1w
+ÇŽ1w
+à1w
a1x
+Ä1x
+á1x
+ÇŽ1x
+à1x
a1y
+Ä1y
+á1y
+ÇŽ1y
+à1y
a1z
+Ä1z
+á1z
+ÇŽ1z
+à1z
e1b
+Ä“1b
+é1b
+ě1b
+è1b
e1c
+Ä“1c
+é1c
+ě1c
+è1c
e1d
+Ä“1d
+é1d
+ě1d
+è1d
e1f
+Ä“1f
+é1f
+ě1f
+è1f
e1g
+Ä“1g
+é1g
+ě1g
+è1g
e1h
+Ä“1h
+é1h
+ě1h
+è1h
e1j
+Ä“1j
+é1j
+ě1j
+è1j
e1k
+Ä“1k
+é1k
+ě1k
+è1k
e1l
+Ä“1l
+é1l
+ě1l
+è1l
e1m
+Ä“1m
+é1m
+ě1m
+è1m
e1p
+Ä“1p
+é1p
+ě1p
+è1p
e1q
+Ä“1q
+é1q
+ě1q
+è1q
+e1r
+Ä“1r
+é1r
+ě1r
+è1r
e1s
+Ä“1s
+é1s
+ě1s
+è1s
e1t
+Ä“1t
+é1t
+ě1t
+è1t
e1w
+Ä“1w
+é1w
+ě1w
+è1w
e1x
+Ä“1x
+é1x
+ě1x
+è1x
e1y
+Ä“1y
+é1y
+ě1y
+è1y
e1z
+Ä“1z
+é1z
+ě1z
+è1z
1ga
+1gÄ
+1gá
+1gÇŽ
+1gà
g1b
g1c
g1d
1ge
+1gē
+1gé
+1gÄ›
+1gè
g1f
g1g
g1h
@@ -56,143 +217,475 @@ g1l
g1m
g1n
1go
+1gÅ
+1gó
+1gÇ’
+1gò
g1p
g1q
g1r
g1s
g1t
1gu
+1gū
+1gú
+1gÇ”
+1gù
g1w
g1x
g1y
g1z
i1b
+Ä«1b
+í1b
+Ç1b
+ì1b
i1c
+Ä«1c
+í1c
+Ç1c
+ì1c
i1d
+Ä«1d
+í1d
+Ç1d
+ì1d
i1f
+Ä«1f
+í1f
+Ç1f
+ì1f
i1g
+Ä«1g
+í1g
+Ç1g
+ì1g
i1h
+Ä«1h
+í1h
+Ç1h
+ì1h
i1j
+Ä«1j
+í1j
+Ç1j
+ì1j
i1k
+Ä«1k
+í1k
+Ç1k
+ì1k
i1l
+Ä«1l
+í1l
+Ç1l
+ì1l
i1m
+Ä«1m
+í1m
+Ç1m
+ì1m
i1p
+Ä«1p
+í1p
+Ç1p
+ì1p
i1q
+Ä«1q
+í1q
+Ç1q
+ì1q
i1r
+Ä«1r
+í1r
+Ç1r
+ì1r
i1s
+Ä«1s
+í1s
+Ç1s
+ì1s
i1t
+Ä«1t
+í1t
+Ç1t
+ì1t
i1w
+Ä«1w
+í1w
+Ç1w
+ì1w
i1x
+Ä«1x
+í1x
+Ç1x
+ì1x
i1y
+Ä«1y
+í1y
+Ç1y
+ì1y
i1z
+Ä«1z
+í1z
+Ç1z
+ì1z
1na
+1nÄ
+1ná
+1nÇŽ
+1nà
n1b
n1c
n1d
1ne
+1nē
+1né
+1nÄ›
+1nè
n1f
n1h
1ni
+1nī
+1ní
+1nÇ
+1nì
n1j
n1k
n1l
n1m
n1n
1no
+1nÅ
+1nó
+1nÇ’
+1nò
n1p
n1q
n1r
n1s
n1t
1nu
+1nū
+1nú
+1nÇ”
+1nù
1nü
+1nÇ–
+1nǘ
+1nÇš
+1nǜ
n1w
n1x
n1y
n1z
o1b
+Å1b
+ó1b
+Ç’1b
+ò1b
o1c
+Å1c
+ó1c
+Ç’1c
+ò1c
o1d
+Å1d
+ó1d
+Ç’1d
+ò1d
o1f
+Å1f
+ó1f
+Ç’1f
+ò1f
o1g
+Å1g
+ó1g
+Ç’1g
+ò1g
o1h
+Å1h
+ó1h
+Ç’1h
+ò1h
o1j
+Å1j
+ó1j
+Ç’1j
+ò1j
o1k
+Å1k
+ó1k
+Ç’1k
+ò1k
o1l
+Å1l
+ó1l
+Ç’1l
+ò1l
o1m
+Å1m
+ó1m
+Ç’1m
+ò1m
o1p
+Å1p
+ó1p
+Ç’1p
+ò1p
o1q
+Å1q
+ó1q
+Ç’1q
+ò1q
o1r
+Å1r
+ó1r
+Ç’1r
+ò1r
o1s
+Å1s
+ó1s
+Ç’1s
+ò1s
o1t
+Å1t
+ó1t
+Ç’1t
+ò1t
o1w
+Å1w
+ó1w
+Ç’1w
+ò1w
o1x
+Å1x
+ó1x
+Ç’1x
+ò1x
o1y
+Å1y
+ó1y
+Ç’1y
+ò1y
o1z
-1ra
-r1b
-r1c
-r1d
-1re
-r1f
-r1g
-r1h
-1ri
-r1j
-r1k
-r1l
-r1m
-r1n
-1ro
-r1p
-r1q
-r1r
-r1s
-r1t
-1ru
-r1w
-r1x
-r1y
-r1z
+Å1z
+ó1z
+Ç’1z
+ò1z
+2r1b
+2r1c
+2r1d
+2r1f
+2r1g
+2r1h
+2r1j
+2r1k
+2r1l
+2r1m
+2r1n
+2r1p
+2r1q
+2r1r
+2r1s
+2r1t
+2r1w
+2r1x
+2r1y
+2r1z
u1b
+Å«1b
+ú1b
+ǔ1b
+ù1b
u1c
+Å«1c
+ú1c
+ǔ1c
+ù1c
u1d
+Å«1d
+ú1d
+ǔ1d
+ù1d
u1f
+Å«1f
+ú1f
+ǔ1f
+ù1f
u1g
+Å«1g
+ú1g
+ǔ1g
+ù1g
u1h
+Å«1h
+ú1h
+ǔ1h
+ù1h
u1j
+Å«1j
+ú1j
+ǔ1j
+ù1j
u1k
+Å«1k
+ú1k
+ǔ1k
+ù1k
u1l
+Å«1l
+ú1l
+ǔ1l
+ù1l
u1m
+Å«1m
+ú1m
+ǔ1m
+ù1m
u1p
+Å«1p
+ú1p
+ǔ1p
+ù1p
u1q
+Å«1q
+ú1q
+ǔ1q
+ù1q
u1r
+Å«1r
+ú1r
+ǔ1r
+ù1r
u1s
+Å«1s
+ú1s
+ǔ1s
+ù1s
u1t
+Å«1t
+ú1t
+ǔ1t
+ù1t
u1w
+Å«1w
+ú1w
+ǔ1w
+ù1w
u1x
+Å«1x
+ú1x
+ǔ1x
+ù1x
u1y
+Å«1y
+ú1y
+ǔ1y
+ù1y
u1z
+Å«1z
+ú1z
+ǔ1z
+ù1z
ü1b
+Ç–1b
+ǘ1b
+Çš1b
+ǜ1b
ü1c
+Ç–1c
+ǘ1c
+Çš1c
+ǜ1c
ü1d
+Ç–1d
+ǘ1d
+Çš1d
+ǜ1d
ü1f
+Ç–1f
+ǘ1f
+Çš1f
+ǜ1f
ü1g
+Ç–1g
+ǘ1g
+Çš1g
+ǜ1g
ü1h
+Ç–1h
+ǘ1h
+Çš1h
+ǜ1h
ü1j
+Ç–1j
+ǘ1j
+Çš1j
+ǜ1j
ü1k
+Ç–1k
+ǘ1k
+Çš1k
+ǜ1k
ü1l
+Ç–1l
+ǘ1l
+Çš1l
+ǜ1l
ü1m
+Ç–1m
+ǘ1m
+Çš1m
+ǜ1m
ü1n
+Ç–1n
+ǘ1n
+Çš1n
+ǜ1n
ü1p
+Ç–1p
+ǘ1p
+Çš1p
+ǜ1p
ü1q
+Ç–1q
+ǘ1q
+Çš1q
+ǜ1q
ü1r
+Ç–1r
+ǘ1r
+Çš1r
+ǜ1r
ü1s
+Ç–1s
+ǘ1s
+Çš1s
+ǜ1s
ü1t
+Ç–1t
+ǘ1t
+Çš1t
+ǜ1t
ü1w
+Ç–1w
+ǘ1w
+Çš1w
+ǜ1w
ü1x
+Ç–1x
+ǘ1x
+Çš1x
+ǜ1x
ü1y
+Ç–1y
+ǘ1y
+Çš1y
+ǜ1y
ü1z
-'1a
-'1e
-'1o} \ No newline at end of file
+Ç–1z
+ǘ1z
+Çš1z
+ǜ1z} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-af.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-af.lua
index 91fb63e0808..4ada49a3242 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-af.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-af.lua
@@ -9,34 +9,7 @@ return {
["metadata"]={
["mnemonic"]="af",
["source"]="hyph-af",
- ["texcomment"]="% Hyphenation patterns for Afrikaans\
-%\
-% 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.\
-% -----------------------------------------------------------------\
-% These patterns were generated with Opatgen from a lexicon\
-% of 183 000 syllabified Afrikaans words.\
-% -----------------------------------------------------------------\
-% VERSION: 1.0 (September 2013)\
-%\
-% AUTHORS: Tilla Fick (fickm@unisa.ac.za)\
-% and\
-% Chris Swanepoel (swanecj@unisa.ac.za)\
-%\
-% -----------------------------------------------------------------\
-%\
-% Define lefthyphenmin to one and righthyphenmin to two\
-% (although righthyphenmin could technically be made one,\
-% in allmost all cases a value of two gives better results):\
-% \\lefthyphenmin=1 \\righthyphenmin=2\
-%\
-% -----------------------------------------------------------------\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="'-abcdefghijklmnopqrstuvwxyzäèêëîïôöûü’",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-agr.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-agr.lua
index 311502a66ff..1f45f63fc5f 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-agr.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-agr.lua
@@ -6,64 +6,7 @@ return {
["metadata"]={
["mnemonic"]="agr",
["source"]="hyph-grc",
- ["texcomment"]="% title: Unicode hyphenation patterns for Ancient Greek.\
-% copyright: Dimitrios Filippou, (c) 2008-2016\
-% notice: >\
-% This file is part of the hyph-utf8 package.\
-% See http://www.hyphenation.org for more information.\
-% language:\
-% name: Ancient Greek\
-% tag: grc\
-% licence:\
-% name: LPPL\
-% url: http://www.latex-project.org/lppl/\
-% changes:\
-% -\
-% date: 2016-05-12\
-% author: Arthur Reutenauer\
-% description: added support for curly beta\
-% -\
-% date: 2011-09-12\
-% author: Dimitrios Filippou\
-% description: updated headers and added the LPPL licence statement\
-% -\
-% date: 2008-06-06\
-% author: Dimitrios Filippou\
-% description: removed guillemets (»)\
-% -\
-% date: 2008-05-27\
-% author: Dimitrios Filippou\
-%\
-% ==========================================\
-% This file was first created by mechanical translation from\
-% GRAhyph5.tex via \"elhyph-utf8 -a -c\" (version 0.1 by Peter\
-% Heslin -- p.j.heslin at durham dot ac dot uk). Some additions\
-% were also made by hand.\
-%\
-% Created by Dimitrios Filippou with some ideas borrowed from\
-% Yannis Haralambous, Kostis Dryllerakis and Claudio Beccari.\
-% Mojca Miklavec adapted it for the \"hyph-utf8\" package.\
-%\
-% These hyphenation patterns are explained in \"ancient.pdf\", which\
-% can be found in the \"elhyphen\" or \"hyphenation-greek\" package.\
-% Hyphenation examples are given in the file \"anc-test.pdf\", also\
-% to be found in the \"elhyphen\" or \"hyphenation-greek\" package.\
-% Questionable patterns are marked by three question marks \"???\".\
-%\
-% Documentation in English can be found in: D. Filippou,\
-% \"Hyphenation patterns for Ancient and Modern Greek,\" in\
-% \"TeX, XML, and Digital Typography\" (A. Syropoulos et al.,\
-% eds.), Lecture Notes in Computer Science 3130, Springer-Verlag\
-% Berlin-Heidelberg, 2004. ISBN 3-540-22801-2.\
-%\
-% Thanks to Thomas Schmitz (thomas.schmitz at uni-bonn dot de)\
-% for pointing out a few mistakes. (Marked by %%%TS%%%)\
-%\
-% ****************************************************************\
-%\
-% \\message{UTF-8 hyphenation patterns for Ancient Greek}\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="'ʼÎάέήίΰαβγδεζηθικλμνξοπÏςστυφχψωϊϋόÏÏŽÏϲἀá¼á¼‚ἃἄἅἆἇá¼á¼‘ἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀá½á½‚ὃὄὅá½á½‘ὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀá¾á¾‚ᾃᾄᾅᾆᾇá¾á¾‘ᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾲᾳᾴᾶᾷ᾽᾿ῂῃῄῆῇῒΐῖῗῢΰῤῥῦῧῲῳῴῶῷ’",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-ala.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-ala.lua
index 950e254c2f9..360b311b0a8 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-ala.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-ala.lua
@@ -6,42 +6,7 @@ return {
["metadata"]={
["mnemonic"]="ala",
["source"]="hyph-la-x-classic",
- ["texcomment"]="%\
-% ********** hyph-la-x-classic.tex *************\
-%\
-% Copyright 2014 Claudio Beccari\
-% [classical latin hyphenation patterns]\
-%\
-% -----------------------------------------------------------------\
-% IMPORTANT NOTICE:\
-%\
-% This program can be redistributed and/or modified under the terms\
-% of the LaTeX Project Public License Distributed from CTAN\
-% archives in directory macros/latex/base/lppl.txt; either\
-% version 1 of the License, or any later version.\
-% -----------------------------------------------------------------\
-%\
-% Patterns for the classical Latin language; classical spelling\
-% with the (uncial) lowercase `v' written as a `u' is supported.\
-% Classical Latin hyphenation patterns are different from those of\
-% \"plain\" Latin, the latter being more adapted to modern Latin.\
-%\
-%\
-% Prepared by Claudio Beccari\
-% e-mail claudio dot beccari at gmail dot com\
-%\
-% Aknowledgements: This file has been substantially upgraded with\
-% the contributions of Francisco Gracia. \
-%\
-% \\versionnumber{1.2} \\versiondate{2014/10/06}\
-%\
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
-%\
-% \\message{Classical Latin hyphenation patterns `hyph-la-x-classic'\
-% Version 1.2 <2014/10/06>}\
-%\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghiklmnopqrstuxyz",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-bg.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-bg.lua
index 7bcc691086b..36ee29044e2 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-bg.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-bg.lua
@@ -6,895 +6,7 @@ return {
["metadata"]={
["mnemonic"]="bg",
["source"]="hyph-bg",
- ["texcomment"]="% copyright: Copyright (C) 2000, 2004, 2017 by Anton Zinoviev <anton@lml.bas.bg>\
-% title: Bulgarian hyphenation patterns\
-% version: 21 October 2017\
-% language:\
-% name: Bulgarian\
-% tag: bg\
-% notice: >\
-% This file is part of the hyph-utf8 package.\
-% See http://www.hyphenation.org for more information.\
-% authors:\
-% -\
-% name: Anton Zinoviev\
-% contact: anton:lml.bas.bg\
-% licence:\
-% text: >\
-% This software may be used, modified, copied, distributed, and sold,\
-% both in source and binary form provided that the above copyright\
-% notice and these terms are retained. The name of the author may not\
-% be used to endorse or promote products derived from this software\
-% without prior permission. THIS SOFTWARE IS PROVIDES \"AS IS\" AND\
-% ANY EXPRESS OR IMPLIED WARRANTIES ARE DISCLAIMED. IN NO EVENT\
-% SHALL THE AUTHOR BE LIABLE FOR ANY DAMAGES ARISING IN ANY WAY OUT\
-% OF THE USE OF THIS SOFTWARE.\
-% hyphenmins:\
-% typesetting:\
-% left: 2\
-% right: 2\
-% changes: See below\
-% ==========================================\
-% Copyright (C) 2000,2004,2017 by Anton Zinoviev <anton@lml.bas.bg>\
-%\
-% This software may be used, modified, copied, distributed, and sold,\
-% both in source and binary form provided that the above copyright\
-% notice and these terms are retained. The name of the author may not\
-% be used to endorse or promote products derived from this software\
-% without prior permission. THIS SOFTWARE IS PROVIDES \"AS IS\" AND\
-% ANY EXPRESS OR IMPLIED WARRANTIES ARE DISCLAIMED. IN NO EVENT\
-% SHALL THE AUTHOR BE LIABLE FOR ANY DAMAGES ARISING IN ANY WAY OUT\
-% OF THE USE OF THIS SOFTWARE.\
-%\
-% Bulgarian hyphenation patterns\
-%\
-% Generated by ./hyph-bg.sh --safe-morphology --standalone-tex\
-%\
-% Both left and right hyphenmins should be set to 2.\
-%\
-% % Automated Bulgarian Hyphenation\
-% % Anton Zinoviev\
-% % 21 October 2017\
-% \
-% Principles of the Bulgarian hyphenation\
-% =======================================\
-% \
-% One specificity of the Bulgarian language is that the average length\
-% of the words is greater than in English. When typesetting a Bulgarian\
-% text, hyphenation is more important than when typesetting an English\
-% text. Knuth's algorithm for line-breaking is such that in most\
-% English paragraphs no hyphenation will be used. With a Bulgarian\
-% text, however, even the Knuth's algorithm will use hyphenation in most\
-% paragraphs. Hyphenation becomes an absolute necessity if we want to\
-% obtain nice, justified paragraphs when using a software with dumb\
-% line-breaking algorithm, such as LibreOffice.\
-% \
-% According to Decree 936 of the Council of Ministers promulgated on 27\
-% November 1950, the Institute for Bulgarian Language at the Bulgarian\
-% Academy of Sciences is authorised to publish the rules of the\
-% orthography of the Bulgarian language (within certain limits).\
-% \
-% Hyphenation rules between 1945 and 1983\
-% ---------------------------------------\
-% \
-% Between 1945 and 1983 Bulgarian used syllable hyphenation with two\
-% morphological exceptions: hyphenation is preferred between a prefix\
-% and a stem and at the boundary of compound words. The following were\
-% the rules governing the hyphenation:\
-% \
-% 1. One letter does not stay alone. Words of one syllable can not be\
-% hyphenated.\
-% 2. No hyphenation before or after ь.\
-% 3. In a sequence of vowels at least one vowel stays before the\
-% hyphen.\
-% 4. A single consonant between two vowels links with the second vowel.\
-% For example по-ле /po-le/, ра-бо-та /ra-bo-ta/.\
-% 5. In a sequence of consonants between two vowels, at least one\
-% consonant stays with the second vowel. For example те-Ñто /te-sto/\
-% or теÑ-то /tes-to/.[^b]\
-% 6. In a sequence of consonants between two vowels, if the first\
-% consonant is sonorant (й /y/, л /l/, м /m/, н /n/, р /r/), then it\
-% stays with the first vowel. For example гер-дан /ger-dan/, Ñен-ки\
-% /sen-ki/.\
-% 7. The hyphenation separates two successive equal consonants. For\
-% example времен-но /vremen-no/, пролет-та /prolet-ta/.\
-% 8. When the letters дж /dzh/ and дз /dz/ denote a single consonant,\
-% then they are not separated. For example боÑ-Ð´Ð¶Ð¸Ñ /boya-dzhiya/\
-% but not боÑд-Ð¶Ð¸Ñ /boyad-zhiya/. When these letters denote two\
-% consonants, then the normal rules apply: над-живÑвам\
-% /nad-zhivyavam/.\
-% 9. Word prefixes may not be broken. Compound words are hyphenated\
-% either at the boundary of the components or the hyphenation rules\
-% are applied to each of the components separately. For example:\
-% пред-упреждавам /pred-uprezhdavam/ (not пре-дупреждавам\
-% /pre-duprezhdavam/), пред-извеÑтие /pred-izvestie/ (not\
-% пре-дизвеÑтие /pre-dizvestie/), за-движвам /za-dvizhvam/ (not\
-% зад-вижвам /zad-vizhvam/), авто-клуб /avto-klub/ (not авток-луб\
-% /avtok-lub/), вакуум-апарат /vakuum-aparat/ (not вакуу-мапарат\
-% /vakuu-maparat/).\
-% \
-% In some rare cases the proper application of rule 9 depends on the\
-% semantics of the word. For example пре-дреша /pre-dresha/ 'change\
-% clothes' but пред-реша /pred-resha/ 'predetermine' or преÑ-пите\
-% /pres-pite/ 'the snow-drifts' but пре-Ñпите /pre-spite/ 'sleep for a\
-% while/overnight'.\
-% \
-% [^b]: In several publications this rule is formulated with the\
-% additional restriction that the sequence of consonants begins with\
-% an obstruent. I believe this restriction is unintentional. It\
-% makes no sense to forbid a hyphenation of the form AB-A but to\
-% permit ABB-A (A denotes a vowel and B – a consonant).\
-% \
-% Hyphenation rules between 1983 and 2012\
-% ---------------------------------------\
-% \
-% The Orthographic dictionary published by the Institute for Bulgarian\
-% language in 1983 introduced new hyphenation rules. The complexity of\
-% the previous rules was the main reason for the change. The new rules\
-% aimed at two objectives: simplicity and unambiguity.\
-% \
-% The new rules are:\
-% \
-% 1. A consonant between two vowels links with the second vowel. For\
-% example ви-Ñо-чи-на /vi-so-chi-na/.\
-% 2. In a sequence of two or more consonants between two vowels, at\
-% least one consonant stays with first vowel and at least one with\
-% the second vowel. For example ÑеÑ-тра /ses-tra/ and ÑеÑÑ‚-ра\
-% /sest-ra/.\
-% 3. Two equal consonants are separated. For example плен-ник\
-% /plen-nik/.\
-% 4. In a sequence of two or more vowels, the first vowel stays before\
-% the hyphen. For example пре-Ð¾Ð´Ð¾Ð»ÐµÑ /pre-odoleya/ and прео-долеÑ\
-% /preo-doleya/.\
-% 5. In a sequence of three or more vowels, the last vowel stays after\
-% the hyphen. For example мао-изъм /mao-izam/ but not маои-зъм\
-% /maoi-zam/.\
-% 6. The letter й /y/ between a vowel and a consonant stays with the\
-% vowel. For example май-ка /may-ka/.\
-% 7. When a sequence of two or more consonants follows й /y/ then at\
-% least one consonant links with й /y/. For example айÑ-берг\
-% /ays-berg/ (not ай-Ñберг /ay-sberg/).\
-% 8. The letter й /y/ between two vowels links with the second vowel.\
-% For example ма-йор /ma-yor/.\
-% 9. No hyphenation before or after ь.\
-% 10. When the letters дж /dzh/ denote a single consonant, then they are\
-% not separated. For example Ñу-джук /su-dzhuk/ (not Ñуд-жук\
-% /sud-zhuk/) but над-Ð¶Ð¸Ð²ÐµÑ /nad-zhiveya/.\
-% 11. There must be at least one vowel before and after the hyphen.\
-% 12. One letter does not stay alone.\
-% \
-% The total disregard of the morphology by these rules leads to some\
-% strange results. For example пре-дизвеÑтие /pre-dizvestie/ is\
-% permitted and пред-извеÑтие /pred-izvestie/ is forbidden, зад-вижвам\
-% /zad-vizhvam/ is permitted and за-движвам /za-dvizhvam/ is forbidden,\
-% авток-луб /avtok-lub/ is permitted and авто-клуб /avto-klub/ is\
-% forbidden, вакуу-мапарат /vakuu-maparat/ is permitted and\
-% вакуум-апарат /vakuum-aparat/ is forbidden. Because of this, the new\
-% rules were not universally accepted. The old rules are still\
-% mentioned in various places in Internet, they are included even in\
-% some grammar books published by the publishing houses of the Ministry\
-% of Education and of Sofia University. The software developers,\
-% however, soon came into love with the new hyphenation rules.\
-% \
-% Hyphenation rules after 2012\
-% ----------------------------\
-% \
-% In 2012 new rules came into force. There are two differences with\
-% respect to the previous rules:\
-% \
-% 1. Rule 5 of the previous rules is revoked. For example маои-зъм\
-% /maoi-zam/ becomes a valid hyphenation.\
-% 2. The new rules permit morphologically based hyphenation (however it\
-% is not obligatory). For example пред-извеÑтие /pred-izvestie/,\
-% за-движвам /za-dvizhvam/, авто-клуб /avto-klub/, вакуум-апарат\
-% /vakuum-aparat/ are valid hyphenations.\
-% \
-% Good hyphenation is a complex matter and it seems the linguists at the\
-% Institute for Bulgarian Language have recognised this. They no longer\
-% attempt to provide universal rules about everything. Instead, they\
-% provide some very permissible rules while the good application of\
-% these rules is leaved to the discretion and the experience of the\
-% printers and the developers of hyphenation software.\
-% \
-% It makes sense to use at least two different sets of hyphenation rules\
-% for Bulgarian. In most cases a more restrictive version should be\
-% used, one which attempts to eliminate the controversial cases of\
-% hyphenation. When typesetting a Bulgarian text in a narrow newspaper\
-% column, however, it will be appropriate to use more liberal\
-% hyphenation rules. It should be noted that one of the reasons for the\
-% hyphenation reform in 1983 was the desire to fix the chaotic\
-% hyphenation in the Bulgarian newspapers at that time.\
-% \
-% Computer implementations\
-% ========================\
-% \
-% Mathematical analysis of the Bulgarian hyphenation\
-% --------------------------------------------------\
-% \
-% The earliest mathematical analysis of the Bulgarian hyphenation rules\
-% belongs to Veska Noncheva.[^1] In 1988 she proposed a mathematical\
-% formalisation of the hyphenation rules in a table with 22 rows.[^2]\
-% \
-% [^1]: <http://www.researchgate.net/profile/Veska_Noncheva>\
-% \
-% [^2]: Ðончева Ð’. Ðлгоритъм за автоматично пренаÑÑне на думи в\
-% българÑÐºÐ¸Ñ ÐµÐ·Ð¸Ðº. Математика и математичеÑко\
-% образование. Сб. доклади на 17. ПК на СМБ. С., БÐÐ, 1988, 479-482.\
-% \
-% In the same year Eugene Belogay[^3] proposed an alternative\
-% formalisation with only 9 rules.[^4] Belogay proved that his rules are\
-% consistent and that they form a minimal set. The rules of Belogay\
-% have negative character – every hyphenation which is not forbidden by\
-% a rule is possible hyphenation.\
-% \
-% [^3]: <http://www.linkedin.com/in/belogay>\
-% \
-% [^4]: Белогай Е. Ðлгоритъм за автоматично пренаÑÑне на думи. Компютър\
-% за Ð²Ð°Ñ (1988) 3, 12-14.\
-% \
-% The following are the first 7 rules, as formulated by Belogay:\
-% \
-% 1. Б-Ð\
-% 2. Ð-ББ\
-% 3. Б-ТТ, ТТ-Б\
-% 4. ÐÐÐ-Б\
-% 5. й-ББ\
-% 6. Б-ь\
-% 7. д-ж\
-% \
-% Here Рdenotes an arbitrary vowel letter, Б denotes an arbitrary\
-% consonant letter (including ь and й), ТТ denotes a sequence of two\
-% equal consonant letters and the letters й, ь, д and ж denote\
-% themselves. For example the rule \"Б-Ð\" says that we are not permitted\
-% to separate a consonant letter from immediately following vowel\
-% letter.\
-% \
-% The eighth rule of Belogay says that hyphenation is forbidden before\
-% the first and after the last vowel letter. The ninth rule of Belogay\
-% says that hyphenation is forbidden immediately after the first or\
-% immediately before the last letter of the word.\
-% \
-% Notice that is is very easy to translate the rules of Belogay in the\
-% form, required for the hyphenation algorithm of Knuth and Liang used\
-% in TeX.[^a] Let us remind that this algorithm matches the word with a\
-% set of string patterns in which the odd numbers say hyphenation is\
-% permitted in this position and even numbers say the hyphenation is\
-% forbidden. When two patterns give conflicting numbers for the same\
-% position, then the greater number wins.\
-% \
-% First, since the rules of Belogay are negative (they say where\
-% hyphenation is forbidden, not where it is permitted), we have to\
-% permit the hyphenation everywhere:\
-% \
-% 1. Ð1\
-% 2. Б1\
-% \
-% Then, the first seven rules of Belogay obtain the form:\
-% \
-% 1. Б2Ð\
-% 2. Ð2ББ\
-% 3. Б2ТТ ТТ2Б\
-% 4. ÐÐÐ2Б\
-% 5. й2ББ\
-% 6. Б2ь\
-% 7. д2ж\
-% \
-% Since no Bulgarian word starts with more that four consonants and no\
-% Bulgarian word ends with more than three consonants, the eighth rule\
-% of Belogay can be translated in the following way:\
-% \
-% 1. .Б2\
-% 2. .ББ2\
-% 3. .БББ2\
-% 4. 2Б.\
-% 5. 2ББ.\
-% \
-% The ninth rule of Belogay means that left and right hyphen mins should\
-% be set to 2.\
-% \
-% The work of Eugene Belogay was not limited to merely a mathematical\
-% analysis of the Bulgarian hyphenation rules. In his paper he\
-% published a short algorithm in Pascal which implements these rules.\
-% It didn't take long for this algorithm to be used in various text\
-% processing software. The algorithm of Belogay was famous for many\
-% years. Even as late as 1997 in one book about TeX, the author didn't\
-% care to give any explanations but simply wrote about \"the algorithm of\
-% Belogay\" as something well known to the reader.[^5]\
-% \
-% [^a]: Liang, Franklin Mark. Word Hy-phen-a-tion by\
-% Com-put-er (Doctoral Dissertation). Stanford University, 1983\
-% \
-% [^5]: ВаÑилев Ð’. УлтимативниÑÑ‚ ТеХ. УдоволÑтвието да правим\
-% предпечатна подготовка Ñами. СофиÑ, Интела, 1997, 36\
-% \
-% Bulgarian hyphenation in TeX\
-% ----------------------------\
-% \
-% One unfortunate design decision of Knuth was that the hyphenation\
-% algorithm of TeX applied the hyphenation patterns not to the input\
-% character codes but to the internal codes of the glyphs in the font.\
-% This created a problem for the Cyrillic languages because in TeX the\
-% Cyrillic fonts did not have standardised encoding. Perhaps this is\
-% one of the reasons why the earliest implementations of the Bulgarian\
-% hyphenation in TeX did not rely on the internal hyphenation algorithm\
-% of TeX. Instead, external tools were used to insert soft hyphens in\
-% all Bulgarian words. For example such a tool would replace the word\
-% ÑричкопренаÑÑне /srichkoprenasyane/ with\
-% Ñрич\\\\-коп\\\\-ре\\\\-на\\\\-ÑÑ\\\\-не /srich\\\\-kop\\\\-re\\\\-na\\\\-sya\\\\-ne/.\
-% The saying \"To every disadvantage there is a corresponding advantage\"\
-% is true – since Cyrillic and Latin letters use different character\
-% codes, an external tool could easily insert soft hyphens in all\
-% Bulgarian words while leaving the TeX commands intact.\
-% \
-% The earliest known attempt to use the hyphenation algorithm of TeX for\
-% Bulgarian was made by Ognyan Tonev in 1990.[^6] He described his work\
-% as \"a not very good translation of the rules. I work in this\
-% direction. But I don't have a 100% working complect of patterns. So,\
-% the copy I send to you[^7] is only a beta-version.\" The hyphenation\
-% patterns of Tonev don't work correctly and it seems he never completed\
-% his work.\
-% \
-% [^6]: The author of this text was unable to find current information\
-% about Ognyan Tonev in Internet. Apparently in 1990 he worked in\
-% the Center of Informatics and Computer Technology of the Bulgarian\
-% Academy of Sciences.\
-% \
-% [^7]: To Yannis Haralambous,\
-% <http://perso.telecom-bretagne.eu/yannisharalambous>\
-% \
-% The first usable Bulgarian hyphenation patterns for TeX were developed\
-% by Georgi Boshnakov[^8] in 1994. In order to solve the encoding\
-% problem, Boshnakov had developed TeX fonts supporting the MIK encoding\
-% (the prevalent encoding at that time in Bulgaria). This allowed him\
-% to introduce a fully working implementation only a few months after\
-% LaTeX2e became the official LaTeX version. Later Boshnakov modified\
-% his work with the Babel system. The hyphenation patterns of Boshnakov\
-% did their job well enough, so that for almost quarter a century after\
-% their initial creation, they remained the only Bulgarian hyphenation\
-% patterns in the standard distributions of TeX and CTAN.\
-% \
-% [^8]: <http://www.maths.manchester.ac.uk/~gb/>\
-% \
-% There are some similarities between the patterns of Boshnakov and the\
-% patterns of Belogay. The following are the main differences.\
-% \
-% First, Boshnakov used an ingenious and more compact implementation of\
-% the second and the third rule. Instead of {Ð2ББ, Б2ТТ, ТТ2Б}, or\
-% 8×22×22+22×22+22×22=4840 patterns in total, Boshnakov has patterns of\
-% the form 2Б3Б2 and 4Т3Т4, or only 22×22=484 in total, with the same\
-% effect.\
-% \
-% The second main difference between the patterns of Boshnakov and the\
-% patterns of Belogay concerns the letter combination дж /dzh/. In\
-% Bulgarian this letter combination can denote either a single\
-% consonant, or a sequence of two consonants and the hyphenation rules\
-% change respectively. Unfortunately, it is impossible to know the\
-% meaning of дж /dzh/ without a vocabulary. The solution of Belogay was\
-% a cautious one – his rules do the hyphenation in a way which will be\
-% correct regardless of whether дж /dzh/ is a single consonant or a\
-% sequence of two consonant. On the other hand, the approach of\
-% Boshnakov is a bold one – since дж /dzh/ is more often a single\
-% consonant, his rules assume that it is always a single consonant. The\
-% number of the cases when this decision leads to bad hyphenations is\
-% insignificant in comparison with the cases in which we obtain improved\
-% hyphenation.\
-% \
-% The third main difference between the patterns of Boshnakov and the\
-% patterns of Belogay concerns the eighth rule – its implementation in\
-% the rules of Boshnakov is rather limited which leads to wrong\
-% hyphenations like бри-дж /bri-dzh/. A full implementation of this\
-% rule would require 11660 patterns in total and this would be too much\
-% for the computers in 1994.\
-% \
-% Later developments\
-% ------------------\
-% \
-% In 1995 Atanas Topalov defended a Masters thesis in the Faculty of\
-% Mathematics and Informatics at Sofia University titled \"Algorithms and\
-% software about text processing\".[^9] One of the main topics in his\
-% thesis was the Bulgarian hyphenation. Topalov criticised vehemently\
-% the official hyphenation rules and their total disregard of the\
-% morphology. He wrote:\
-% \
-% > If we look at the history of the problems of the hyphenation, we\
-% > will discover something very strange. Instead of the expected\
-% > involvement with the depths and aspiration for more admissible and\
-% > satisfactory style, we can find a growing tendency for\
-% > simplification. One unpleasant discovery is that the development of\
-% > the hyphenation software stays firmly on the principle \"let us do\
-% > the easiest thing\". The earliest works which have been studied are\
-% > from 1978. It turned out that they present the best approach\
-% > concerning the automated hyphenation. The authors have chosen the\
-% > most difficult but the most correct (from literary point of view)\
-% > method for hyphenation, namely the morphological approach.\
-% \
-% Topalov proposed his own hyphenation algorithm. The hyphenation it\
-% generated was smooth and easy to read. One obvious defect of the\
-% algorithm of Topalov was that it contradicted the official hyphenation\
-% rules at that time. One can argue, however, that his algorithm is\
-% compatible with the current hyphenation rules.\
-% \
-% [^9]: The thesis of Atanas Topalov can be accessed at the author's\
-% website <http://www.mind-print.com>\
-% \
-% In 1999 Svetla Koeva[^10] wrote a paper about the automated Bulgarian\
-% hyphenation.[^11] At that time she was a junior member of the\
-% Department of Computational Linguistics at the Institute for Bulgarian\
-% Language but now she is a director of the whole institute. The paper\
-% of Koeva contains a list of hyphenation patterns which can be used as\
-% a basis of automated hyphenation. In 2004 with the help of Stoyan\
-% Mihov[^12] the rules of Koeva were formalised with regular relations\
-% and rewriting rules. They were implemented in a software product\
-% named ItaEst which provided Bulgarian hyphenation and grammar checking\
-% for various software products of Microsoft and Apple.\
-% \
-% [^10]: <http://dcl.bas.bg/svetla_koeva/>\
-% \
-% [^11]: Коева, Светла. Правила за пренаÑÑне на чаÑти от думите на нов\
-% ред. БългарÑки език. 1999/2000, 1, 84-86\
-% \
-% [^12]: <http://lml.bas.bg/~stoyan/>\
-% \
-% The main differences between the hyphenation of Koeva and the official\
-% hyphenation rules effective after 2012 is that the separation of a\
-% long sequence of consonants between two vowels is done according to\
-% the rules valid before 1983. For example Ñе-Ñтра /se-stra/ and\
-% ай-Ñберг /ay-sberg/ are permitted. The main difference between the\
-% hyphenation of Koeva and the official hyphenation rules effective\
-% before 1983 is that the rules of Koeva disregard the morphology of the\
-% words. The following rule of Koeva is specific: in a sequence of two\
-% sonorant consonants between two vowels, we are permitted to separate\
-% the first vowel from the first consonant, for example материа-лна\
-% /materia-lna/.\
-% \
-% In 2000 Anton Zinoviev[^13] created new hyphenation patterns for TeX.\
-% He didn't know about the previous work of Boshnakov and he didn't\
-% bother to make his work available in the various TeX distributions and\
-% CTAN. His work was used mostly by the local Linux enthusiasts and the\
-% colleagues of Zinoviev. In 2001 Radostin Radnev[^14] created a free\
-% grammar dictionary of Bulgarian[^15] where he used the hyphenation\
-% patterns of Zinoviev. From there the work of Zinoviev propagated to\
-% OpenOffice, LibreOffice and various online dictionaries, including\
-% <http://bg.wiktionary.org> and <http://rechnik.chitanka.info>.\
-% \
-% [^13]: The author of this text.\
-% \
-% [^14]: <http://bg.linkedin.com/in/radostinradnev>\
-% \
-% [^15]: <http://bgoffice.sourceforge.net/>\
-% \
-% The following are the main differences between the hyphenation of\
-% Zinoviev and the hyphenation of Boshnakov.\
-% \
-% First, the eighth rule of Belogay is fully implemented.\
-% \
-% Second, the rules of Zinoviev try to detect when the letters дж /dzh/\
-% (and дз /dz/) denote a single consonant and when they denote a\
-% sequence of two consonants. By default, however, Zinoviev (like\
-% Boshnakov) assumes that дж /dzh/ is a single consonant and hyphenates\
-% accordingly.\
-% \
-% Third, the rules of Zinoviev disable some cases of unpleasant\
-% hyphenations:\
-% \
-% 1. In a consonant sequence like Ñ‚ÑÑ‚ /tst/, the two equal consonants Ñ‚\
-% /t/ are separated. For example братÑÑ‚-во /bratst-vo/ is forbidden\
-% while братÑ-тво /brats-tvo/ and брат-Ñтво /brat-stvo/ are\
-% permitted.\
-% 2. The hyphenation is forbidden after a sonorant consonant following\
-% an obstruent consonant. For example отм-ра /otm-ra/ is forbidden\
-% and от-мра /ot-mra/ is permitted.\
-% 3. The hyphenation separates two consecutive kindred voiced/voiceless\
-% consonants. For example Ñубп-родукт /subp-roduct/ is forbidden and\
-% Ñуб-продукт /sub-product/ is permitted.\
-% \
-% At the start of his work on the Bulgarian hyphenation, Zinoviev had\
-% the opportunity to discuss the hyphenation with Svetla Koeva. He\
-% remembers that some cases of unpleasant hyphenation were suggested to\
-% him by Koeva. Unfortunately, he hasn't taken notes so now he doesn't\
-% know which cases of unpleasant hyphenation have been suggested to him\
-% by Koeva and which are his own findings.\
-% \
-% The present work\
-% ================\
-% \
-% Motivation\
-% ----------\
-% \
-% The present work was carried out on the initiative of the leader of\
-% the Bulgarian localisation team of Mozilla, who contacted Zinoviev,\
-% Boshnakov and the maintainers of the TeX hyphenation patterns.[^17]\
-% This work pursues the following main objectives:\
-% \
-% 1. to update the hyphenation patterns in accordance with the current\
-% hyphenation rules;\
-% 2. to generate the hyphenation patterns by a publicly available\
-% script;\
-% 3. to make the hyphenation patterns customisable;\
-% 4. to provide documentation for the future developers.\
-% \
-% [^16]: <http://mozillians.org/en-US/u/stoyan/>\
-% \
-% [^17]: <http://hyphenation.org>\
-% \
-% The current official hyphenating rules for Bulgarian are rather\
-% liberal. Very often, in a long sequence of consonants we are\
-% permitted to split the word at any position, for example аген-Ñ‚-Ñ-Ñ‚-во\
-% /agen-t-s-t-vo/. This is prone to many unusual and unexpected results\
-% that interrupt the attention of the reader or deceive his expectations\
-% during the movement of his eyes to the next line. On the other hand,\
-% in order to produce nice justified paragraphs there is no need for so\
-% many hyphenation possibilities. It would be sufficient even if only\
-% one possible separation between any two syllables was permitted.\
-% \
-% Therefore, it makes sense to use a more restrictive version of the\
-% Bulgarian hyphenation, one which eliminates the controversial cases of\
-% hyphenation. Only when typesetting a Bulgarian text in a very narrow\
-% newspaper column it will be appropriate to use a more liberal version.\
-% It should be noted that some specialised English dictionaries also\
-% separate the word-division positions into two categories – preferred\
-% positions and less recommended positions.\
-% \
-% There are two methods to determine the optimal division within a\
-% sequence of consonants between two vowels:\
-% \
-% * we can hyphenate according to the syllables in the word or\
-% * we can hyphenate morphologically.\
-% \
-% Hyphenation according to the syllables in the word\
-% --------------------------------------------------\
-% \
-% Let us look at the properties of the Bulgarian syllables. All\
-% syllables have the following structure:\
-% \
-% > onset - nucleus - code\
-% \
-% The nucleus in Bulgarian is always a vowel. Both the onset and the\
-% code are (possibly empty) sequences of consonants.\
-% \
-% The Bulgarian syllables adhere to the Sonority Sequencing Principle.\
-% According to this principle, the consonants within the onset have\
-% raising sonority and the consonants within the code have decreasing\
-% sonority.\
-% \
-% Several grammar books agree that the following sonority scale is valid\
-% for Bulgarian:\
-% \
-% > voiceless obtrusive < voiced obtrusive < sonorant consonant < vowel\
-% \
-% According to the investigations of the author, the only exception to\
-% this law is due to the letter в /v/ which is a voiced obtrusive but it\
-% can be used also as a voiceless obtrusive. This exception is due to a\
-% spelling particularity of the Bulgarian language. Whenever the letter\
-% в /v/ seemingly violates the Sonority Sequencing Principle, in the\
-% spoken language this letter is read as Ñ„ /f/, that is as a voiceless\
-% obtrusive (for example the word отвÑÑкъде /otvsyakade/ is read as\
-% отфÑÑкъде /otfsyakade/).[^18]\
-% \
-% [^18]: No Primitive Slavonic word contains the phoneme Ñ„ /f/.\
-% Therefore, we can safely assume that in the Primitive Slavonic\
-% language the consonant Ñ„ /f/ was a positional variant of the consonant\
-% в /v/.\
-% \
-% The author has found that the sonorant consonants in Bulgarian have\
-% their own sonority scale:\
-% \
-% > м /m/ < н /n/ < л /l/ < р /r/ < й /y/\
-% \
-% Only a few words such as жанр /zhanr/ and химн /himn/ violate this\
-% scale. Such words are always loan-words and their pronunciation is\
-% somewhat problematic for the native Bulgarian speakers.\
-% \
-% In addition to the Sonority Sequencing Principle, the consonant\
-% clusters within the Bulgarian syllable adhere to the following\
-% additional principles:\
-% \
-% 1. Both in the onset and in the code, the labial and dorsal plosives\
-% precede the coronal plosives and affricates.\
-% 2. If the onset or the code contains two plosives or affricates, then\
-% there are no fricatives between them. Few words with the Latin\
-% root 'text' are exceptions: контекÑÑ‚ /kontekst/.\
-% 3. If the onset or the code contains two fricatives other than в /v/,\
-% then there are no plosives or affricates between them.\
-% 4. If the onset or the code contains two plosives or affricates, then\
-% they both have equal sonority (both are voiced, or both are\
-% voiceless).\
-% 5. If the onset or the code contains two fricatives other than в /v/,\
-% then they both have equal sonority (both are voiced, or both are\
-% voiceless).\
-% 6. Neither the onset, nor the code may contain two labial plosives, or\
-% two coronal plosives or affricates or two dorsal plosives.\
-% 7. Neither the onset, nor the code may contain two equal consonants\
-% with the exception of в /v/ (for example втвърди /vtvardi/).[^19]\
-% \
-% [^19]: Actually, the letter в /v/ is not a real exception because in\
-% all such cases this letter denotes two different consonants – в /v/\
-% and ф /f/. Only in the Russian loan-word взвод /vzvod/ the two\
-% letters в /v/ denote a repeating consonant в /v/.\
-% \
-% From all these properties of the Bulgarian syllable we can deduce the\
-% following hyphenation rules:\
-% \
-% 1. In a sequence МК where М is a consonant with higher sonority than\
-% K, we are not permitted to hyphenate before М. Exception: when М\
-% is в /v/ and К is a voiceless consonant.\
-% 2. In a sequence КМ where М is a consonant with higher sonority than\
-% K, we are not permitted to hyphenate after М.\
-% 3. In a sequence KBT where K and T are plosives or affricates and B is\
-% fricative, we separate K from T.\
-% 4. In a sequence CKB where K is a plosive or affricate and C and B are\
-% fricatives other than в /v/, we separate C from B.\
-% 5. If in a consonant sequence a coronal plosive or affricate Т is\
-% followed by a labial or dorsal plosive К, then we separate Т from К.\
-% 6. If a consonant sequence contains two plosives or affricates, one\
-% voiced and one voiceless, then we separate them.\
-% 7. If a consonant sequence contains two fricatives other than в /v/,\
-% one voiced and one voiceless, then we separate them.\
-% 8. If a consonant sequence contains two labial plosives or two coronal\
-% plosives or affricates or two dorsal plosives then they are\
-% separated.\
-% 9. If a consonant sequence contains two equal consonants (not\
-% necessarily consecutive), then they are separated.\
-% \
-% With so many prohibitive rules, a question arises: if we apply all\
-% these rules, aren't we going to eliminate too many hyphenation\
-% possibilities? The answer is no. It can be demonstrated that between\
-% any two consecutive syllables at least one separation point will be\
-% permitted.\
-% \
-% \
-% Hyphenation according to the morphology\
-% ---------------------------------------\
-% \
-% Between 1983 and 2012 the official orthographic rules of the\
-% Bulgarian language forbade morphologically based hyphenation. After\
-% 2012 such hyphenation is permitted (but not obligatory).\
-% \
-% The most important case when it is very desirable to use\
-% morphologically based hyphenation is the case of the compound words.\
-% Divisions such as авток-луб /avtok-lub/ and вакуу-мапарат\
-% /vakuu-maparat/ are extremely irritating even if they are formally\
-% correct. Unfortunately, we do not have a vocabulary of the compound\
-% Bulgarian words that would permit us to produce rules for automated\
-% hyphenation. Therefore, the current Bulgarian hyphenation patterns do\
-% not attempt to apply morphological hyphenation to such words.\
-% \
-% Second in importance (but far more significant in terms of numbers) is\
-% the case with the word prefixes. While the eyes of the reader still\
-% look at the start of the word, the word is still unknown to him. At\
-% this point, it is very important not to deceive his expectations. For\
-% example, when the reader sees над- /nad-/ at the end of the line, he\
-% will expect that this is the prefix над- /nad-/ with semantics 'attain\
-% more than'. This expectation will be fooled if this wasn't really a\
-% prefix, but a deceiving (while formally correct) hyphenation of the\
-% word Ð½Ð°Ð´Ñ€ÐµÐ¼Ñ /nadremya/ 'have dozed enough' where the real prefix is\
-% not над- /nad-/ but на- /na-/ with semantics 'achieve a state after\
-% accumulation'. Such hyphenation distracts the reader and makes the\
-% reading more difficult.\
-% \
-% Third in importance is the case with the word suffixes. With respect\
-% to the hyphenation rules we can divide the suffixes into three\
-% categories:\
-% \
-% 1. Suffixes starting with a vowel, for example -ар /-ar/. It is not\
-% appropriate to follow the morphology with such suffixes because\
-% this will contradict the whole hyphenation tradition of the\
-% Bulgarian language. For example крав-ар /krav-ar/ is unwarranted.\
-% 2. Suffixes starting with one consonant, for example -ка /-ka/.\
-% Usually with such suffixes the syllable boundary in the word\
-% coincides with morpheme boundary so no specific cares are\
-% necessary, for example кравар-ка /kravar-ka/. The exceptions are\
-% rare, for example: обек-тната /obek-tnata/ instead of обект-ната\
-% /obekt-nata/.\
-% 3. Suffixes starting with more than one consonant (-Ñки /-ski/, -Ñтво\
-% /-stvo/). It is possible to use morphological hyphenation rules\
-% with such suffixes.\
-% \
-% Even if it is possible to use morphological hyphenation with the\
-% suffixes of the third category, it turns out, this is not as useful as\
-% it is with the case of the prefixes. When the eyes of the reader have\
-% reached this part of the word, the word is already more or less known\
-% to the reader. Therefore, at this point the morphological hyphenation\
-% does not provide any significant advantages in comparison to the\
-% simpler hyphenation based only on the syllables in the word. Consider\
-% for example the word геройÑ-тво /geroys-tvo/ with suffix -Ñтво\
-% /-stvo/. When the reader sees геройÑ- /geroys-/ at the end of the\
-% line this will give him an early clue that the suffix of the word is\
-% -Ñтво /-stvo/. Such non-morphological hyphenation does not deceive\
-% the expectations of the reader. On the contrary, it makes the reading\
-% easier because it gives clues to the reader about what follows on the\
-% next line.\
-% \
-% Because of these considerations, the current Bulgarian hyphenation\
-% patterns do not attempt to use morphological hyphenation with respect\
-% to the suffixes of the words. Though it would be useful to implement\
-% rules about the suffixes of the second cateogory. Hopefully, some\
-% future version will have such rules.\
-% \
-% Occasionally,[^20] a fourth morphological requirement is stated: that\
-% hyphenation should conform with the boundary between the word and the\
-% definitive articles -та /-ta/ and -те /-te/ (postfixed in Bulgarian).\
-% There is no need to pay attention to this rule because it seems to be\
-% satisfied by its own nature. The author has searched in a dictionary\
-% with over 860000 Bulgarian words for cases when the hyphenation rules\
-% would hyphenate badly with respect to the definitive article. He was\
-% unable to find even one such case with the hyphenation rules valid\
-% after 1983 and only about 10 cases with the rules valid before 1983\
-% (one of them is живопи-Ñта /zhivopi-sta/ instead of живопиÑ-та\
-% /zhivopis-ta/).\
-% \
-% One unavoidable characteristic of any morphologically based automated\
-% hyphenation is that it can create wrong hyphenations. Because of\
-% this, one useful option is to use the morphology in a safe way – to\
-% use it in order to forbid bad hyphenations but to create no new\
-% hyphenation possibilities solely on the basis of the morphology.\
-% \
-% Take for example the word Ð´Ð¾Ð·Ñ€ÐµÑ /dozreya/ 'ripen fully'. According\
-% to the phonological rules, we should hyphenate it as доз-реÑ\
-% /doz-reya/. According to the morphology, however, we should hyphenate\
-% as до-Ð·Ñ€ÐµÑ /do-zreyq/ because this word is formed with the prefix до-\
-% /do-/ with semantics 'complete or supplement' and this semantics would\
-% be lost if the reader sees доз- /doz-/ at the end of the line.\
-% Therefore, there are three methods to hyphenate this word:\
-% \
-% 1. доз-Ñ€ÐµÑ /doz-reya/ when morphology is not used;\
-% 2. до-Ð·Ñ€ÐµÑ /do-zreya/ when morphology is fully used;\
-% 3. Ð´Ð¾Ð·Ñ€ÐµÑ /dozreya/ (no hyphenation) when morphology is used in a safe\
-% way.\
-% \
-% The option to use the morphology in a safe way is very attractive when\
-% the software uses a smart line-breaking algorithm which can produce\
-% good results even with less hyphenation possibilities. TeX is one\
-% such software. It should be noted that this option does not eliminate\
-% too many hyphenation possibilities because the morpheme boundaries\
-% most of the time are also syllable boundaries.\
-% \
-% [^20]: ПравопиÑен и правоговорен наръчник. СъÑтав. Иван Хаджов,\
-% Цв. Минков; Ред. Ив. Хаджов и др. СофиÑ, Бълг. кн., 1945\
-% \
-% The following are results of a statistics about the quality of the\
-% morphological rules (the number after the sign ± is the expected\
-% standard deviation of our estimations):\
-% \
-% With the option `--morphology`:\
-% \
-% * in 0.1% ±0.3% of the dictionary words the morphological patterns\
-% create very wrong hyphenation;\
-% * in 89.8% ±0.1% of the dictionary words the morphological patterns\
-% hyphenate identically with the case when no morphology patterns are\
-% used;\
-% * in 0.3% ±0.2% of the dictionary words the morphological patterns\
-% hyphenate differently in comparison to the case when no morphology\
-% patterns are used and the word is hyphenated in a way which\
-% contradicts the morphology;\
-% * in 0.6% ±0.1% of the dictionary words the morphological patterns\
-% hyphenate differently in comparison to the case when no morphology\
-% patterns are used and there is a possible hyphenation which is\
-% compatible with the word morphology but which is nevertheless\
-% forbidden by the morphology patterns.\
-% \
-% With the option `--safe-morphology`:\
-% \
-% * in 0% of the dictionary words the morphological patterns create very\
-% wrong hyphenation;\
-% * in 90.0% ±0.1% of the dictionary words the morphological patterns\
-% hyphenate identically with the case when no morphology patterns are\
-% used;\
-% * in 0.3% ±0.2% of the dictionary words the morphological patterns\
-% hyphenate differently in comparison to the case when no morphology\
-% patterns are used and the word is hyphenated in a way which\
-% contradicts the morphology;\
-% * in 0.6% ±0.1% of the dictionary words the morphological patterns\
-% hyphenate differently in comparison to the case when no morphology\
-% patterns are used and there is a possible hyphenation which is\
-% compatible both with the word morphology and with the syllable\
-% boundaries but which is nevertheless forbidden by the morphology\
-% patterns.\
-% \
-% Notice that the morphological patterns create a different hyphenation\
-% only in about 10% of the words. The following explanation can be\
-% given for this surprising fact. First, the natural evolution of the\
-% human languages tends to simplify the complex sequences of consonants.\
-% Therefore, no morpheme contains a complex sequence of consonants. And\
-% second, the Bulgarian orthography is morphological. This means that\
-% the morphemes are written according to their actual pronunciation,\
-% however the simplifications in the spoken languages which take place\
-% at the morpheme boundaries are not taken into account in the\
-% orthography. The independent operation of these two factors leads to\
-% the result that most of the time the morpheme boundaries coincide with\
-% the conventional syllable boundaries. The main exception to this is\
-% when a morpheme starts with a vowel, in this case its syllable will\
-% include one or more consonants of the preceeding morpheme. The second\
-% exception is when a morpheme ends with a vowel and the next morpheme\
-% starts with a sequence of two or more consonants.\
-% \
-% Usage of the script `hyph-bg.sh`\
-% --------------------------------\
-% \
-% The `hyph-bg.sh` is all-in-one script which can generate both\
-% documentation (this text) and Bulgarian hyphenation patterns. When\
-% given the option `--help` the script gives short usage instructions:\
-% \
-% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\
-% hyph-bg.sh --help\
-% Show this info\
-% hyph-bg.sh [--doc-html | --doc-latex | --doc-txt]\
-% Print documentation in various formats\
-% hyph-bg.sh [other options]\
-% Generate Bulgarian hyphenation patterns\
-% \
-% Options when generating hyphenation patterns:\
-% \
-% --standalone-tex\
-% Produce hyphenation patterns for TeX with \\patterns{ ... }.\
-% \
-% --no-hyphen-mins\
-% Hyphenation patterns which do not require hyphen mins.\
-% Otherwise: both left and right hyphen mins should be set to 2.\
-% \
-% --safe-dz\
-% Do not try to guess whether DZ is a single consonant or not.\
-% Only use hyphenation which will be correct in both cases.\
-% \
-% --permissible\
-% Permit any formally correct hyphenation, including unnatural\
-% divisions, such as studen-tstvo. Useful for educational tools\
-% or when typesetting Bulgarian text in a very short column.\
-% \
-% --morphology\
-% Apply morphology when hyphenating, for example: za-dvizhvam.\
-% May hyphenate incorrectly in some cases.\
-% \
-% --safe-morphology\
-% Apply morphology when hyphenating. Never hyphenates incorrectly\
-% but may prohibit some correct hyphenations.\
-% \
-% --no-morphology\
-% Disregard the morphology. Default.\
-% \
-% --1945\
-% Hyphenate according to the rules effective between 1945 and 1982\
-% \
-% --1983\
-% Hyphenate according to the rules effective between 1983 and 2011\
-% \
-% --2012\
-% Hyphenate according to the rules effective after 2012. Default.\
-% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\
-% \
-% The following are the recommended ways to generate hyphenation\
-% patterns by this script:\
-% \
-% `hyph-bg.sh --standalone-tex --safe-morphology`\
-% : For TeX. Apply the morphology in a safe way when the software\
-% uses a smart line-breaking algorithm.\
-% \
-% `hyph-bg.sh`\
-% : For most other software.\
-% \
-% `hyph-bg.sh --no-hyphen-mins`\
-% : The current versions of Mozilla (as of 2017) seem to ignore the\
-% hyphen mins in words that contain a dash.\
-% \
-% `hyph-bg.sh --morphology`\
-% : For professional typography with human proof-reader.\
-% \
-% `hyph-bg.sh --permissible`\
-% : For educational tools and online dictionaries which can show only one\
-% kind of hyphenation.\
-% \
-% Notice that some specialised English dictionaries separate the\
-% word-division positions into two categories – preferred positions and\
-% less recommended positions. It would be best if the Bulgarian online\
-% dictionaries could do the same. For example hyphen \"-\" can be used to\
-% display the preferred positions and dot \".\" – the less recommended\
-% positions. If a word-division position is permitted only by the\
-% patterns of `hyph-bg.sh --permissible`, then this position is less\
-% recommended.\
-% \
-% \
-% \\message{Bulgarian hyphenation patterns (options: --safe-morphology --standalone-tex, version 21 October 2017)}\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="абвгдежзийклмнопрÑтуфхцчшщъюÑ",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-ca.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-ca.lua
index 8d84ebb430e..c0fabb46fb3 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-ca.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-ca.lua
@@ -9,77 +9,7 @@ return {
["metadata"]={
["mnemonic"]="ca",
["source"]="hyph-ca",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project from cahyph.tex, whose\
-% author has been identified as Gonçal Badenes <g.badenes at ieee.org>\
-% (2003-09-08). The licence terms are unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-% Hyphenation patterns for Catalan.\
-% This is version 1.11\
-% Compiled by Gonçal Badenes and Francina Turon,\
-% December 1991-January 1995.\
-%\
-% Copyright (C) 1991-2003 Gonçal Badenes\
-%\
-% -----------------------------------------------------------------\
-% IMPORTANT NOTICE:\
-%\
-% This program can be redistributed and/or modified under the terms\
-% of the LaTeX Project Public License Distributed from CTAN\
-% archives in directory macros/latex/base/lppl.txt; either\
-% version 1 of the License, or any later version.\
-% -----------------------------------------------------------------\
-%\
-%%% ====================================================================\
-%%% @TeX-hyphen-file{\
-%%% author = \"Gonçal Badenes\",\
-%%% version = \"1.11\",\
-%%% date = \"15 July 2003\",\
-%%% time = \"15:08:12 CET\",\
-%%% filename = \"cahyph.tex\",\
-%%% email = \"g.badenes@ieee.org\",\
-%%% codetable = \"UTF-8\",\
-%%% keywords = \"TeX, hyphen, catalan\",\
-%%% supported = \"yes\",\
-%%% abstract = \"Catalan hyphenation patterns\",\
-%%% docstring = \"This file contains the hyphenation patterns\
-%%% for the catalan language\",\
-%%% }\
-%%% ====================================================================\
-%\
-% NOTICE: Version 1.11 is identical to version 1.10 (issued on January 17,\
-% 1995) except for the updated copyright notice above.\
-%\
-% The macros used were created for ghyph31.tex by Bernd Raichle (see the\
-% German hyphenation pattern files for further details)\
-%\
-% This patterns have been created using standard, conservative\
-% hyphenation rules for catalan. The results have refined running them\
-% through patgen. In that way, the number of hits has been increased.\
-%\
-% These rules produce no wrong patterns (Results checked against the\
-% ``Diccionari Ortogr\\`afic i de Pron\\'uncia'', Enciclop\\`edia\
-% Catalana. The percentage of valid hyphen misses is lower than 1%\
-%\
-% Some of the patterns below represent combinations that never\
-% happen in Catalan. We have tried to keep them to a minimum.\
-%\
-% *** IMPORTANT ***\
-% \\lefthyphenmin and \\righthyphenmin should be set to 2 and 2\
-% respectively. If you set them below these values incorrect breaks\
-% will happen (specially at the beginning of foreign words and words\
-% which begin with some prefixes).\
-% *** IMPORTANT ***\
-%\
-% Please report any problem you might have to the authors!!!\
-%\
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
-% \\message{Catalan Hyphenation Patterns `cahyphen' Version 1.11 <2003/07/15>}\
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijlmnopqrstuvxyzàçèéíïòóúü",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-cs.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-cs.lua
index ab6042db430..088c24d18a5 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-cs.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-cs.lua
@@ -9,37 +9,7 @@ return {
["metadata"]={
["mnemonic"]="cs",
["source"]="hyph-cs",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project from czhyphen.tex and\
-% czhyphen.ex, whose author has been identified as Pavel Å eveÄek <pavel at\
-% lingea.cz>. The licence terms are unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-%%% ====================================================================\
-% This is CZHYPHEN.TEX, containing czech hyphenation patterns.\
-% Prepared by:\
-% Pavel Å eveÄek\
-% Lingea s.r.o., Brno, Czech Republic\
-% E-mail: pavel@lingea.cz\
-%\
-% This is free software; you can redistribute it and/or modify\
-% it under the terms of the GNU General Public License as published by\
-% the Free Software Foundation; either version 2 of the License, or\
-% (at your option) any later version.\
-%\
-% This file is distributed in the hope that it will be useful,\
-% but WITHOUT ANY WARRANTY; without even the implied warranty of\
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\
-% GNU General Public License for more details.\
-%\
-% You should have received a copy of the GNU General Public License\
-% along with this program; if not, write to the Free Software\
-% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\
-%%% --------------------------------------------------------------------\
-% \\message {Czech Hyphenation Patterns (Pavel Sevecek, v3, 1995)}\
-%\\lefthyphenmin=2\\righthyphenmin=2\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvwxyzáéíóúýÄÄěňřšťůž",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-cy.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-cy.lua
index 1120644459e..d81c8f38cac 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-cy.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-cy.lua
@@ -6,52 +6,7 @@ return {
["metadata"]={
["mnemonic"]="cy",
["source"]="hyph-cy",
- ["texcomment"]="% copyright: Copyright 1996 Yannis Haralambous\
-% title: Welsh hyphenation patterns\
-% version: 1996\
-% notice: >\
-% This file is part of the hyph-utf8 package.\
-% See http://www.hyphenation.org for more information.\
-% license:\
-% - This file is available under any of these licences:\
-% -\
-% name: LPPL\
-% status: maintained\
-% maintainer: Yannis Haralambous\
-% version: 1.0\
-% or_later: true\
-% url: http://www.latex-project.org/lppl/lppl-1-0.html\
-% -\
-% name: MIT\
-% url: https://opensource.org/licences/MIT\
-% text: >\
-% Permission is hereby granted, free of charge, to any person\
-% obtaining a copy of this software and associated documentation\
-% files (the \"Software\"), to deal in the Software without\
-% restriction, including without limitation the rights to use,\
-% copy, modify, merge, publish, distribute, sublicense, and/or sell\
-% copies of the Software, and to permit persons to whom the\
-% Software is furnished to do so, subject to the following\
-% conditions:\
-%\
-% The above copyright notice and this permission notice shall be\
-% included in all copies or substantial portions of the Software.\
-%\
-% THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\
-% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\
-% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\
-% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\
-% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\
-% OTHER DEALINGS IN THE SOFTWARE.\
-% changes:\
-% - 1996 - last change to patterns\
-% - 2008 - inclusion into hyph-utf8 and file rename (cyhyph.tex -> hyph-cy.tex)\
-% - June 2011 - added LPPL licence\
-% - March 2016 - added MIT licence\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghilmnoprstuwyáâêëïôö",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-da.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-da.lua
index 4ff8259823c..136755b4fb2 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-da.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-da.lua
@@ -6,47 +6,7 @@ return {
["metadata"]={
["mnemonic"]="da",
["source"]="hyph-da",
- ["texcomment"]="% copyright: Copyright 1994 Frank Jensen\
-% title: Hyphenation patterns for Danish\
-% version: 2011-01-11\
-% notice: >\
-% This file is part of the hyph-utf8 package.\
-% See http://www.hyphenation.org for more information.\
-% license:\
-% - This file is available under any of these licences:\
-% -\
-% name: LPPL\
-% version: 1.3\
-% or_later: true\
-% url: http://www.latex-project.org/lppl/lppl-1-3.html\
-% -\
-% name: MIT\
-% url: https://opensource.org/licenses/MIT\
-% text: >\
-% Permission is hereby granted, free of charge, to any person\
-% obtaining a copy of this software and associated documentation\
-% files (the \"Software\"), to deal in the Software without\
-% restriction, including without limitation the rights to use,\
-% copy, modify, merge, publish, distribute, sublicense, and/or sell\
-% copies of the Software, and to permit persons to whom the\
-% Software is furnished to do so, subject to the following\
-% conditions:\
-%\
-% The above copyright notice and this permission notice shall be\
-% included in all copies or substantial portions of the Software.\
-%\
-% THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\
-% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\
-% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\
-% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\
-% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\
-% OTHER DEALINGS IN THE SOFTWARE.\
-% changes:\
-% - 2011-01-11 - remove support for OT1 encoding\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvwxyzåæø",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-de.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-de.lua
index 6cba95f5369..65661c4aa3e 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-de.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-de.lua
@@ -6,85 +6,14 @@ return {
["metadata"]={
["mnemonic"]="de",
["source"]="hyph-de-1996",
- ["texcomment"]="% title: German Hyphenation Patterns (Reformed Orthography, 2006)\
-%\
-% notice: TeX-Trennmuster für die reformierte (2006) deutsche Rechtschreibung\
-%\
-% version: 2018-03-31\
-%\
-% authors:\
-% -\
-% name: Deutschsprachige Trennmustermannschaft\
-% contact: trennmuster@dante.de\
-%\
-% copyright: Copyright (c) 2013-2018\
-% Stephan Hennig, Werner Lemberg, Günter Milde,\
-% Sander van Geloven, Georg Pfeiffer, Gisbert W. Selke,\
-% Tobias Wendorf\
-%\
-% licence:\
-% name: MIT\
-% url: http://opensource.org/licenses/mit-license.php\
-% text: >\
-% Permission is hereby granted, free of charge, to any person\
-% obtaining a copy of this software and associated documentation\
-% files (the “Softwareâ€), to deal in the Software without\
-% restriction, including without limitation the rights to use,\
-% copy, modify, merge, publish, distribute, sublicense, and/or\
-% sell copies of the Software, and to permit persons to whom the\
-% Software is furnished to do so, subject to the following\
-% conditions:\
-%\
-% The above copyright notice and this permission notice shall be\
-% included in all copies or substantial portions of the Software.\
-%\
-% THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND,\
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\
-% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\
-% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\
-% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\
-% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\
-% OTHER DEALINGS IN THE SOFTWARE.\
-%\
-% source: http://repo.or.cz/w/wortliste.git?a=commit;h=8b9a428c271e064f0047a364c532308f0fd4051f\
-%\
-% language:\
-% name: German, reformed spelling\
-% tag: de-1996\
-%\
-% hyphenmins:\
-% generation:\
-% left: 2\
-% right: 2\
-% typesetting:\
-% left: 2\
-% right: 2\
-%\
-% ===========================================================================\
-% \
-% \\message{German Hyphenation Patterns (Reformed Orthography, 2006) `dehyphn-x' 2018-03-31 (WL)}\
-% \
-%\
-% The used patgen parameters are\
-%\
-% 1 1 | 2 5 | 1 1 1\
-% 2 2 | 2 5 | 1 2 1\
-% 3 3 | 2 6 | 1 1 1\
-% 4 4 | 2 6 | 1 4 1\
-% 5 5 | 2 7 | 1 1 1\
-% 6 6 | 2 7 | 1 6 1\
-% 7 7 | 2 13 | 1 4 1\
-% 8 8 | 2 13 | 1 8 1\
-% \
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
- ["characters"]="abcdefghijklmnopqrstuvwxyzßàáâäçèéêëíñóôöü",
- ["data"]=".ab1a .ab3l .abo2 .ab3ol .ab1or .ab3s2 .ab3u .ade3n .ae3 .aft2 .ag4r .ag2u .ai2s .akt2a .al2e .al3k .al3lei .al5len .al3li .al3se .al4tei .al4tel .alter6s5 .alt3s4 .al4tu .ampe4 .amt2s1 .amt4sc .ana1c .an4a3t .an3d2 .anden6k .an1er .ang2 .an3g4li .an3go .angs4 .angst3 .ani2s .an3k4 .an3na .an3s2 .an4si. .an4tar .an3z2 .ap5p6le. .ari1e .ar3k2a .ar4m3ac .ar4mun .ar2sc .ar4tan .ar4t3ei .arter4 .ar6t5erh .ar2t1r .arz2 .asbe2 .as4ta .as3tr .ata1 .at2h .at4r .au3d .au4f3 .au2s3 .auß2 .ax2 .äm3 .är6schl .ät2h .ät2s .bahn3 .bah6ner .bal3t .baus4 .be3erb .beige4 .bel2a .be3r2a .ber2e .ber4g3a .ber6g5e6b .ber4g3r .ber4tr .bi4os .bi2t .bit1a .blau3 .boge2 .bogen3 .bogens6 .bo4s3k .bu4ser .bu3ta .by4t .ca2s3t .ce2ra .ch6 .char8mes .chi3er .dab4 .da2r1 .dar3in .dar2m1 .da4te. .da4tes .de2al .de1i .dein2 .de3lo .de8ments .de3na .den4ka .den4kl .den4ko .de1o2 .de3r4en .de1s .de3sk .des2t .di3el .di4en .dien4e .dien6st .dienst7a8d .do3b .do2mo .do1pe .dor2f1 .do2tr .dy2s3 .ebe2r1 .eg2o .eh2e .ehe1i .ehe5n .ei3e2 .ei3f2e .ei3k .ei4na .ein3d .ei2ne2 .ein3eb .ein6erl .ein3sp .eise4 .ei2sp .eis3s2 .ei2s5t .ei4tr .eke2 .ek3li .el2a .el2bi .el2bl .elb3s .el4fei .el2fl .em3m2 .en1 .en4da .en4d3er4 .en2d3r .end3s .en4dü .en3ga .en2gl .enk2 .enn2 .enns3 .ent3 .en2ta .en4tei .en7thalp .en4tio .en4t1r .en5trop .ents4 .er4bei .er8brecht .er2bu .er4dan .erden6k .er4d3er .er1e .ere3c .er2em .erf4 .er1i .ers2 .er8stein .erster6 .er8stritt. .er8stritten. .er4z3el .er4zen4 .es3p .es3ta2 .est6e .es3th .es3t3r .et2s .eu3 .eug4 .eur4 .ext4 .fe3la .fer4no .fi3d .fi3est .fi4le. .fi4len .fi2s .flu2g1 .fs4 .fu2sc .ga2me .gan4ga .ga2s1 .gas3e .ga4sp .ga4t .gd2 .gebe4a .geb2l .gee4 .gel4b3r .gel2d1 .ge3lu .ge3m .ge5nar .ge3n4e .gene7cke .ge3n2o .ge3r4a .ger2e .ge3ro .ger4s .ge3sa .glan2 .glanz3 .gol6der .gs4 .gus2 .halt4e .hau2t1 .he2 .he4bei .he3fe .he3le .he4r3an .he3rat .her6b5ra .he3rer .he3ri .he6r5inn .hin3u .hips4 .hi4s .hof1 .ho4fen .ho4met .ia4 .im2a .ima4ge .im5m2 .in1 .ind2 .in3gl .ink2 .in3n2e .in3sk .in3t2 .inu1 .io4d .ioni1 .ire3 .is2a .is3ta .it2h .iv2 .joni1 .ka2b3l .ka2i .kal2a .ka3le .ka3t2a .kat3i .ka4ti4o .ki4e .klang3 .ko3b .kopf1 .kor4da .kraf2 .ks4 .kus2 .la3be .lan8de8mi .le4ar .le4gas .le3n2i .lich8t7er8s .li2f .li4ve. .lo4g3in .lo2sc .los3s4 .lo2tr .lo3ver .luster6 .lus4tr .lut2h .ly2s3 .ma3d .ma3ge .mal4e .ma2st .mat4c .ma5tr .matu3 .md2 .mel2a .me3ne .me3no .men8schl .men8schw .mes4sp .mi2f .mik4 .mil2z1 .mi2s .mi4t1 .mm2 .mutter5 .na3no .na3t .näs1c .nebe4n .ner2f .ne1ro .ne2s .nich2 .nicht5e .ni4e .ni3k4l .no2th .nul2 .nus2 .oa3 .ob1a .obe2 .ober5ei .ob3i4t .och3 .of2e .oper4 .or2a .ord4e .or3g .or3k2 .ort2 .orts3e .os3s .os4ta4 .oste2 .ost5end .os8ten8de .oste6re .os8terwe .os4tes .os2t3i .os4tig .os4t3r .os4tu .ot1a .ou2t .ou4te .ozo4 .öd2 .öl3l .pab4 .part4h .pe2c .pe3la .pe3le .pe3na .pf4 .ph4 .poka2 .po4st .postei6 .pro1 .ps2 .rabe4 .ra3ch4e .ra3me .rau2m .rau8schl .räu3sc .re3ale .reb3s2 .re3cha .re5insz .reis6e5i .rei4s5t .reli1 .res6tr .ri4as .richt6e .ro4a .ro3be .ro2e .ro2h .ro3m .rom4a .ro2st .ro2t3r .rö2s .ruf3s .ruh2r1 .runder6 .rü1b .rü6cker6 .sa3br .sali3e .sami1 .sau1c .sau4er .sau5er. .sch4 .schaf8t7end .scheiner8 .se3ck .se2e .seein4 .se2ha .sen4f .sen5s .se3re .se1ro .se2t1 .sha2 .si4en .si3gn .si4te .ski1e .skis2 .sour2 .spani7er. .spiege8lei .st4 .stau8be8cken. .ste2i .steiner8k .sto4re .stro6ma .sucher6 .tage4s .ta3mi .tan4k3a .tan4k3l .ta3ra .tar3t2 .ta2t1h .ta2to .ta4tor .ta2t1u .te2e .te2f .tehe3 .teiler8s .tei8l7ersc .te3le .te3no .te1ra .te2s .te4st .test3r .th4 .ti2a .ti2e .ti2me .ti4mes .ti3r .ti2s .tischen8 .ti8sch7end .tite4 .tode4 .to4der .todes3 .to2n .to4nat .ton3i .to4nin .tons2 .to4pl .to2pr .to2w .tri3es .tro2s .ts4 .tse3 .tu3ra .tu3ri .turm1 .tur4ma .ub2 .ufe2 .ufer3 .ul2b3 .um3 .uma2 .ume2 .umo2 .un3a2 .un3d .un3g2 .uni4t .un3s .uns4t .ur3a2d .uran6fa .ur1c .ur1e .ur4inf .ur3o4m .ur1o2p .ur3s2 .ut2a .ut3r .ve5n2e .voll1 .vo4r .wah4l .wa2s .weg5s .weine4 .wei4ta .welter8e .welter8k .wer6ker .wer4kr .wer4tr .wetterer8 .wi4e .wor2 .wort5en6 .wor8tend .wor4tu .wur2f1 .xe3 .ya4l .zel4la .zelle4 .zel6leb .zeug4i .zi2e .zie4l3u .zin4ka .zin4s3c .zin4st .zuch2 .zug3l .zu4gra .zu2pf .zwe2 .zweigen8 .zwei8g7end a1ab aa2be aa1c a1a2ce aa2gr a1akt aals2t a1a2n a2ans a1aq 2a2ar aa2r3a aar3b aar3d aa3rea aa2rei aarf4 aar3g2 aar3k4 aart4 1aas aas5t aata2 aa2th aa4t3r aat4s3 2a3au a1ä a1b 2aba 3abad abais4 ab1alt a3b2am ab2ant ab1au ab1ä ab2är ab2äu 2abbat 2abbin 1abd 2a3be. 2a3bec 2abee ab1eic abe3i4d ab1eil ab1ein 2ab2el abe2la2 2a3ben. 1abent 2aber a2berd a3bere a3beri ab1er2k ab1er2r ab1er2z 4abes abe2s1e ab3esse 2abet 2abew 1abf 1abg 3abga 1abh 2abi 4abil ab1ins ab1ir abi3st ab1it abi4tur 1abk ab1l 1a2bla a3blat 1a2blä a2b3led 3ab3lei a3blem 2ablet ab3li a2blin ab4lit 2ablo 1a2blö a2blu 1abn 2abo 3a2bo. ab2of 3a2bon 4abot 2abö ab3r a4brä a2bre ab4ros 2abrö a4bs 1ab5sc 1ab3s2p abst2 3absta 1abstu ab3sz 1abtei abte2s 3abtr 2abu abu3g4 a2bum ab1ur 2abü 1abw 2aby aby4t 3abz 2ac. 2a3ca 1ac1c 2acci a1cem a1cen a2ceo ach1a a1chal a3chari ach3as ach3au 2achb 2a1che a2ch1e4c ach1ei ach4ei. a2chep a4cherf ach5erfa a4ch3erh a4ch3erl a4cherö a4ch3erw 2achf 2a1chi a2chim ach3l 2ach3m ach3n a1cho a3cho. a2cho2r ach3öf 4ach3r 2achsc achs4el ach3s2i ach3skr achs4or ach3su a4cht ach4tak ach6terf ach8tersp ach6t5erw ach4t1o acht5rat ach8traum ach8träume. ach8träumen. ach6trit acht6s5al ach4tum a1chu ach1u2f ach3ü 2achv 4ach1w a2chy a1ci a1ckar a3ckel a2ckin ack2sp acksta4 2a1cl acon4n 2acu a1ç a1d 2ad. 2ada. 4adab ad2abr ad2ag ad1an 3adap 4a3d2a2r3 2adas 2adat a2d1au a3dau. 1a2dä ad1c 1add 2ade. ade2al a3dec a3dee adefi2 2adeg a3dell 4a3den aden1a ade4nat adeo2 ade1ra a2d1erk 4ade1s ade3s2p ades4s 2adf 4adh 4adi adi3en adi3er. adie4sc adi4st 3adj 2adli 3admi 4admu ad2ob ado2n ado4na a2dop ad2os 2adp 2adq a2dre 2ad3rec ad3rei ad3run 2ads2 ad3st ad3sz 2ad2t1 ad4te2 1adv 2a3dy 2a1e1 ae2b a2ec ae2ck ae2d ae2i a2ek a2el a3el. a4ela a4ele a4eli a3els ae2m ae2o3 aeop2 ae2p a3er. 3a2er2o1 aes2a ae2sc aes5t a2ew ae2x 2afa af1ab a2f1a2n a3far a2f1au 2afä a2f1än 2afe a2f1ec a4fentl a4f1ep aff4a af2f3l aff2s aff4th 2afi afi6kanz afi4kat afi2t 2af3l af1la a1f4lu 2afo a2f3oc a2ford a2f1ort afo1s 2afra af3rau af3rä af3re 2afro af3rö af4rü af3s2a af3s2h af2si af2sp afs4t af2t1a af3tat af2tei af2te2l aft4erk af2t1o af2tö aft3r af2tra aft5rei aft4stä af2tur a2f3ur 2afü afür3 a1g 2ag. 2aga ag1a2b ag1a2d ag1ar a2g1au ag2del ag2dr ag2du 4age. age4l3ei age4ler 4a3gen. age4neb a2gent 2ages age4sam age4s3in ages3p ages6sen ages3ti 3aggr a2g1id a2gim 2a2gl ag4lan ag4las ag3le a4glö 2agm ag2n ag4nat a4gnä ag4ne. ag4nu ago3b ag3rat a2g3re a2gri ag3rie ag3rin 2ags ag3s2ah ag4sam ag3s4eid ag7s8porta agst2 ag1ste ag3stö 2agt ag2th 2agu a2gund 2ah. 2a1ha ah2an ah4at a1hä 2a1he ahe1in a2h1er2h ahe1s ahe3u a1h2i ahin3 ah2l3a2 ah2l1ä ah2l1ei ah2lel ahle4na ah4l3erd ah4l3erh ahl1o2 ah2lö ahl3sz ahme1i ahme3s ah3mu ah4n3a ah3nee ah2nef ahn3el ah4nerd ahner4e ahner6le ahner4n ah2nin ah2no 1a2hor ah1os ah3ös 4ahr ahr1a ah3r2e ahren6sc ahre4s ahr6tage ahr6teng ahr2ti ahr4tro ahr4tun ah2ta ah2te2l ah2t1ex ah4t3r aht3s6 a1hu ah1w a1hy 2ai. ai1a4 a1ia. 2aib ai2bl aid2s ai1e4 ai3en3 aif4 ai1fr a4i3g4 a3ik. ai3ke ai2lar ail3d4 ai2lei ail3g ai2lo 4ain ain2a a1ind ai5n4e ain3s ains2p 3airb ai2sa a3isch. ai5schw ai3s2e ais4se. ait4 a3iv. a3ivl a3ivs a1j a2jat aje2 ajekt4o 2ak. 2aka. 2aka3b akab4r a2kad 2akal 2a3kam 2akan 2akar ak4at akat1a aka4tak 1akaz 4akä 2akb 2akc 2akd 2a1ke a2kef a2k1em a2kent a2kes ak2et a2keu 2a1ki ak1ins aki1s 1akku 2ak3l a1k4la ak4li 3aklö a1kna 2ako 2a1kr 4akra ak3res a3k4ri 3akro ak3rü 2aks ak3sh ak2t1a2b 2aktb ak2tel akt2er 2aktg 2aktik 2aktis 2aktm ak2to4b ak2tö ak2t3r ak5t4ri 2aktsi 2aktsp 2aktst 2aktw a1ku 2akun a2kup 2akur aku2s 4akü 1akz 3akze a1la 2ala. 2alabo al1af al1age 2alai al1akr al1am al1ana 2aland a2lang al1anz al1app a3lar. al3arc a3lare 2al1arr a2lart ala2s al1asi al1ass a3lat. al4atm alat3z al1au al3aug a1lä a2l1äm al1än al1ärm al1äu 3albat al2bär alber4e al4berh al4b3er4w al2b1l al2boh al2bon alb3ru alb3st al4dan al2dä al4d3erl al4d3ern alde2s ald3inn al2dra al2drä alds2 2ale 4a3le. ale4ar a2l1e2b al1eck a4l1ef a2l1ei a3l2eic a4lein a2l1el 3a2lema a2l1e2mi 4a3len. alende4 al3endr a4l3ends a2leng al2enn ale2p al1epo 4aler. a2l1erb aler2e a2l1erf a2l1er2h aler4kl a2l3erl al1erm aler4mi a2l1er4r al2ers a2l1ert 3a4l3erwä 4ales a2l1e4sk a2less a4leth a2l1eu alf4r 3algi al2gli al3glo 1algo 3algor alg4r 2ali al2imb al1imm ali4nal al1ind alin4ge a2l1in2q al1ins alken1 al2klö al2kne al2kof 1alkoh alk3s2 alks4t al2lab al3lad al2l1an al2l1a2r al3le. al4lec 3allee al3lend all3erk aller4z al3les al2lid alli5er. alli7ers. al2lob al2lop al2löf al2map al4m3ast almo6de. 2alo. a2l1ob 3a2loe a2l1of 4alog alo2ga alo2gr al1ont al1ort 2alos a2l1ö al2ös 3alp. 3alpe. 1alph al2pho alrat4 al3sak al6schei alsch3s al3ska al5s6terb al2stu al2sum al2t1ak alt3alg al3tam al2tan al2tat al2tau 1altä alt3eis alt3elt al4temu al4t3er5f al2teu al2tid al2tin alt1op al2tö al4t3rat al2tre al4t3ri al2t3ro alt4stü a1lu alu3b4 al2u3f alu3g al1u2k a2lum al1umb a2l1ur a3lus 4aly al2zar al2zau al3zen alz4erk al2zw 2am. am2a ama2ba ama3d2 ama3g a2malg 2a3m4an 1a2maz 2amä 4ame. a2meb 2amel am4e4n1 amen6spr ame3r2a amera3u a2m1erf 1a2meri ame5r2u 2ame1s a4mesh 2a3met 2amf a3mi. a3mie ami2k am4ing 2a3mir 2a3mis 2amit 2amk 2aml 2amm. am2mab am2m1ac 2ammal am4mant am2mar am2mei ammes3 am2mid ammi2e am2min am2mor am2m1ö ammu2 amni1 a2mö 2ampe. 2ampen am4pf amp2f1a2 2am2ple 2ampo am3pr amp3s2 2am2s am3sa 4amsc am4schl 3amse am3s2h am3so am3sp am3su 1amt. am2t1a2 am4tau am2t1ä am2tei amt3eig am4tel am2tem amter4 am4terh am4t3ern am2t1ex am2tis am2tit am2to am6tou am2tö am2t3r am4tre am4tri am2t1u 2amtv 2amu 3a2mul 2ana. 2anab ana3c 4an2ad anadi1 an2ag 2a3nak an1alg ana4lin 2anam an2a3ma 2anan an4and 2ana1s a5nat. ana4th a5n4atm a2nato ana4tr a5nats an3aug 1a2n1äs 1anb 2anbas 2anbö 2anbu an3ch 2and. 3an3d2ac and3arm and3ei anden6ga an4d3ent and5erob ande4sc an2d1ex and4sas and4seh and2so and6spar and6spas and2su 4andu2 an2d1ur andy1 2ane an3e2c a3nee an2ei. an3eif 3aneig a4neis 3a2n1e4k ane2l an1e2mi a2nemo aner4fa a3nerg an2erh a4nerke 4anern a4nerz. an4erze an1eth 3anex 1anf 2anf. 2anfab 3anfä an3fe 2anfi an4fj anf3le 4anfors anf5rau 2anfs an3f2u 4ang. 1anga 2anga. an2g1ar 2angas 2ange. 1angeb an2g1ei an4g3erf an4g3er4h an4g3er4w an4g3erz 2angh 2angie ang1l an2gla ang5n ang1r ang3ra 1an3gri 2angs. ang4sto angt2 1anh 2a3ni an2i3d ani3els ani5ers. anig2 ani3ke 3a4nim a4nind ani2o an3i4on a4niso 2anj 2ank. an2kab an2k1ak an2kan an2kei 2an3ken ank5erfa an3kes 2anki an2kid an2klö an2klu ank3no an4k3opf an2kor ank1r ank3ra an4kras ank3rä an2kro 2anks ank3se anks2p 2ankt4 1anl 2anlad 3anlag 2anmo 1anmu 2ann. 1annah an2nar an3ne an4nef an4nei an4nene annen3s4 ann2er 2anns ann4s3p 2annt 2ano. 1an1od 2anof 2anog 2a3nol ano2la 1a2nom a3nom. 2anoo a2n1or ano2ri 2a3nos 2a1nö 2anpu 1anr 2anrö an4same an3sar 1an3s2ä 3anschr an3skr ans1pa ans3pon 1anspr 1anst an3s2z 2ant. ant3ar anta4re an3t2ä 1antá 3antei an3tha 2antie 3antise anton2 1antr ant3rin 1antw 2anu anu3r anu1s a1nü 1anw 2anwi an2zä 2anzb 2anzd 1anzei anz3elf anze2n 2anzes 2anzg 2anzh anzi2d an2z1i4n 2anzk 2anzm 2anzr 2anzs 2anzt 1anzü 3anzün 2anzv 2anzw an2zwi 2anzy 2ao aof4 ao3i a1op aopf4 a1or a1os5 aost2 a3ot. ao3t4s 2a1ö2 a1p 4ap. ap4a apa3b a2pe. a3pel a2pé a2pf ap2fa 1apfel 2apfes a3pfl a2pht 2api 2apl ap4la a3plä ap3le ap3li ap2n 3a2pos a2pot ap3pu 2apr ap2so aps4ter ap5t2 2a3pu 2ar. a1ra a3ra. ar2ab 2ar3abb ar3abf ar3abt ara3d2 ar3adr ara3ge 2a2r3al a3r4ale a3rali a3ralo 2aran a2r1ang a2r1anz 2arap a4r3app 2a2rar ara2st ar2asy 4arat a2r1au a1rä ar1äs 1arb 2arb. 2arba ar2bak ar2b3at ar2bau 4arbef ar4b3ein 2arbek 2arben 2arber arb3erl 4arbi 2ar2bl 2arbo 2arb1r 2arbs2 arb3sk arb3so 2arb3t2 2arbu 1ar1c 2archl 2archr ar2dau arde4i ar2dop ar2d3r ar2du a2rea are5aler a2reb4 aree2 ar1eff a2reh ar1ehr 2arei a3rei. ar1eid a3reie a3reih areim3 a2rein arein4b arein4s arein4t a2rele 4arem 4aren. aren6sem are3r2a arer2e a4r3erei a2rerg a2rer3h a2reri a2rerk a2rerl a2rert ar2erw 2ares ar2et are3u a2rev arf1r arf3ra arf2sp 4arg. ar3gan ar2gl ar4gn 2arg4o ar3g4r arg4s 2arh 2ari ar2ia a2rid ari3e2n ari3erd ari3erg arin3it arin3s4 ar1int a3r4io ar2ir ar4is ari2su a3riu ar2kal ar2k1ar ark3aue arker2 ar2kil 2ark3l ar4klag ar2kle ar2klo ark4lö ar2koa ar2kor ark3s4a ark2se ark3she ark4tre ar2les ar3mad arm1au ar3m2ä ar2m1eg ar2m1ei arm2or ar2mum 4armü 4arn ar2nan arn2el ar3ni a1ro arob2 4aroc aro8ckeng ar1o2d ar1of aro2fe 2a3rol aro3m a2r1op a2ror aros3 aro4st 1a2rou a2r1ö4 2arp arr1ac ar2r1ad ar2r1as arre4n1 ar2rh 2arri ar2r3or ar3se ar3s2h ar3s2i ars3ka ars4kat ar3sta ar2tau 2artb ar3t2e 2artei 2artex ar3t2i 2arto art3r art4res ar2tri 2arts art3ske art2sp 2artuc 2arty 2aru a2r1uh ar1um a3rumm a2rü 2arv arwa2 2a3r2y 2arza ar2zau ar2zä 2arze 2arzi ar2zö 1arzt arz4tei arz4tem arz4ti arz2t3r 2arzu ar2z1w 2asa a4s3aa a2s3af a3sag a3s2al asal2t1 as1am as3art asa2s as3at asau4f a4s3aug a2sä as3ät asbes2 a6sca a4schec a4schef a4sch3ei a6scher6g a3s4chi a2schm 2ascht a3schu a4schum 2asd 4ase a2seb a2sec a2s1ef as1eie as1emi a3sen. ase4na ase4n3o asen6sem as2er as4erd ase2re aser6geb a4s3erke as4es ase4t a2sex 2asf asges4 2ash a3s2hi as3hir 2asig a2s3i2k 2asim asin2g as1inn 2asis aska3s as3ku 2aso as3ob as1of a3sol a3som as1o2p as1or a4soz a2sö a2s1p aspek6to as2ph a3s2pi as3pik as3pio a4spir 2aspr as2pra 2as3sa ass2a3b ass6aus. ass2e ass3ein asse3le ass2i as3ski as3so as2spo as2spr as2st as3sta as3stei as3sti as3str as3stu 2asta a3stad a1stas as3tat a3stä as3te ast2el ast2er as4t3ese as4tex as2th ast2id as3tie as3til as3to as4tof ast3orc a1str ast3re as3t4ren as6t5ritt ast5roll as3tub 2asu as2ur asu4s3 a2sü aswa2s 1asy 3asyl 2asys a1ß aße4 aß2en3 2a1t 4ata at1abe at1abr at2a1f a5ta3g at2ago ata3la a3tam at1apf at2ast at3att a2t1au at1än 4atb at2c a2teb a3tec ateien6d at1eig 3a2teli 3a2temg at2en ate4na aten3s4e a2tep 4ater ate3r4al ate3ran at4ere atern2 ater3st ate2ru 4ates ates4sa a3tet at2eu a2tew 4atha at3hag at3hal a3t2heb ath3in. 3athl a4thr at2hu at3hü 4a3ti ati4kab ati6k5erw a4tinf at2is ati2sa ati2se a4tiso atis3s ati6v5erf 3atla 4atli 3atm 4atma 4atmä 4atmus a2t1ob 3a2t4om atom1e ato2mo at1op at1ort a3to3s atra4t a2t3rau a2t3rä at3re at3rin at3rom at4ron at3rot at3rü at2sa at4schn at2se ats1e2h at2si ats1in at2s1o at2s1p ats3tät at2su at3ta 3attac at4tad at4t1ak atta2l at4tale at4tals at4tang at4tar at4tau at2tä 4atte. at2t3ec at2tei at3t2el 4at5ter at3thä at3ti 4atto at2tob at2t3rä att3s2 at3t2u 4atu a3tub atu2n a3tü atze4l atz3ela atz3elt at2zem at2z1er a3tzere at2z1in atz3t2 at2z1w a2u 2au. 2au3a2 2aub au2bab au2ban au2b1au aube4n au2beu au2blä au2bli au2blo au2blu aub2si 2auc au2dr 2aue aue2b au2ere aue3rei auer3ö au5erst. au3ert aue2s au2fa auf1ak auf1an 2aufe. 2aufeh 4aufen. 3aufent auf1er au4fer4k au2feu auff4 auf3ind 1aufla 1aufn 2aufo auf3ski auf3t2 2auft. 2aug au2ga au3g2ar 4augeb 4augeh 4augel aug2er 4augl 4augr au3gu au3h 2au1i au2is 4auj auk3t aule2s aul4les au3lü 4aum au2mal aume4n au4m3ent au2m1e2r1 aum3eri au2m1id au4mil au4mit au2m1o aumo2r aum3p2 aum3s6 au4mun 4aun au3n2a aun2e au4n3ei au2nio au2no au3nu a4unz 2aup2 2aur2 au1rh aurü3 au2s1ah ausan8ne. au2sas au2sau 2ausc au6schmi 1ausd 2ause. au4s1eh 2ausen au4s3erb au4serf au4s3erk aus3erp au4serw 1ausg au2sin au2sis 1ausl au2so aus1or au2spr 1ausr auss2 3aussag aus4se. aus3st aust2a 2auste au5stein aust2o aus5tri 3ausü 1ausw 1ausz auße2 2aut. au2tab au2t1äu 2autb 2aute au4t1e2l au4ten4g au4t3erh aut5ero 2autg au2thy 1auto au4trö 2auts 2auu 2auv auve4 2auw 2aux 2auz auz2w 2a1ü a1v av2a a3vang avas4 ava3t2 avener4 2avi a2v3r 2a1w awi3e a2wr a1x ax2am a2xans a3x2e a3xid a2xio axis1 2a1ya a1yeu ayma4 ay1of ays2 aysi1 ay3t a1z az4a a3za3d 3azal a3z2i az2o a3z2u az2zen az2zw ä1a 1ää 2ä1b ä2b3l äb2s äbte1 ä1ce ä1che äche1e äche4n ä1chi äch3l ä2chr äch4sa äch2s1o äch2sp äch2st ächt4e ä1chu ä1ck ä1d ä2da äde1s2 ä2d1ia ä2d3r äd2s äd3te 2ä1e äe4k ä3eu äe2x äfe4n äf2fl äfig3 äf3l äf3r äf4ro äf2s äf3t2e äft4s3 ä1g ä2g1a 1ä2gä ägd2 ägen4e äge2r3a äge3s ä2g3l äg2n ä2g3r äg4ra ägst2 äg3sta äg3str 1ä2gy äh1a 2ä3he ä4h1ei äher8gebn äher5t ä1hi äh1in ähl1a äh3l2e äh4l3e4be äh5ler 2ähm äh3na äh3ne 1ähnl 2ähr äh2rel äh3ri 2ähs 2äht ä1hu äh1w 2äi ä1im ä2is ä3is. ä3isch. ä3isk ä1j ä1k äka2la äk3l ä2kle äk4li ä2k3r ä1la älbe2 äl4bl älk3 älks4 äl2l1a äl2p3 äl4schl äl2st ält2e älte1i ä1lu 2äm4a3 ä3me ämer2s ämi3en 2äml ämoni3e 2ämp ämp7f4e äm2s ämt2e ämter3 2än. än2dr 2än2e äne2n1 äne1s 2än2f5 änft2 4än3g2e änge4ra 2än2gl äng3le än2gr äng3se 2ä3ni än3k2e än2k3l än2kr änk2s 2änn än3n4e2 2äns än4s1a än2s1c äns2e 2änz ä1on äo3s2 ä1pa 1äpfel äp2pl äp2pr äp2s1c äp4st 1äq ä2r3a4 är4af är1ä är2b3le är1c 2ärd ärde4s 2äre ä2r1ei ä2r1e2l äre2m är1emi äre2n ä2rene ä2rerh är2es ärf2s är3ge ärg4s ä2r1ind är1int är3ke ärk2s ärm3arm ärm3at ärme1e ärm3ent ärm2s är1ob är1of ä1rö är3re ärse2 är2seb är4seh ärs1er är2si är3spu är2st är3str 2ärt ärt4e är2th ärt2s3 ä2rü 1ärz är2zu är2zw 2ä3s2e äse3g äse1i4 äse5ref äser4ei äse4ren äser2i ä3s2kr ä2s1p 2äs2s1c äss2e äss5erkr äss5ersa äss3erw äs2sp äs2s3t ä4s3t äst4e 1ästh äs4tr ä3su ä1ß äß1erk äß1ers ä2t3a2 2ä3te äte3a äte1e äte1i äte3l2 äte2n äteo2 äter4bl ät2et ät1id ät1ob ä2t3r ät4s3a ät2sä ät4schl ät4schr ät2s1i2 äts3l äts1or ät2s1p ät2s3t ät2su ät2tei ätte4n ät4tr ätze3l ät2zw 2äub äu2b3l äu2br äu1c äu3d äude3 äuder2 2ä2uf 1äug äug3l 2äul 2äum äu2ma äum3p äumpf4 äum4s5 2ä2un äun2e äu3nu 2äu3r2 äure1 2ä3us. 2äusc äu4schi äu4schm äu3s2e äuse1i ä3usg ä3usk ä3usn äu2s1p äus2s1c 1äuß äut2e äu2tr ä1v ä2vi 1äx ä1z ä3ze â1t á1n 3ba. b2aa b3a2ba 2babf 2babg ba2bl ba2br 2b1abs bach7t4e ba4ck3er back3s4 ba3d2e bade1i 2b1adel 2b1adl 2b1adm b1a2dr ba2du 2b1af 3bah bah6nene bai3d bais2 b2ak ba2ka ba2k1er ba2k1i ba2k5l ba2k3r ba2lab ba2l1ak ba3lal ba2lau baler2 ba4l3erk balk4a balke4 bal4l3eh bal4l3ei bal6lerg ball6erk 2b1am b2a3ma ba2me 4bamt ban2a 3b2and band1a ban4dal ban4dan ban4dar ban6deng ban2dr ba3n2e 2banf b1ang ban3gl ban4k1a banker4 ban2kl ban2kn ban2kr ban2ku 2banl b1anna ban2o 2b1ans b1ant 2banw b1anz ba2r3ab ba2rad bar3ast ba2rat bar3de ba2rei ba3r2en barer5ei barer4t barf4 3bar2s bar3sc b1arz bar3zw 3b2as ba3sa ba2sc bas2i bas4sa bas4st ba2st ba4t3ent bat2o 3bau. bau3b bauer4l bauer4s bauer4w bau1fl bau1fr bau3g2 b2auk bau3r bau1s bau3s2k baus4t b1a2x ba1yo 3b2ä1c 3b2äd 2b1äh b2äl 2bärz b2äs 2bäug 4b1b b3be bbe4n3 bbens2 bbe4p bb3le. bb2lö b3brec b3bru bbru2c bb2s bbu1 4b1c 2b5d2 bdä4 bdän3 bde1s bdome4 1be. 3bea be3ab be3an beat2m be3au be4au. 3beb b1ebb 1be1c 2becht 2b1e2del bedi4 be1e2h bee2l be3ela bee4rei be1erh be1erl be1ert be1eta bef4 2b1eff be3g4 be2he. beh5ri bei3b 2b1eier bei1f4 bei4ge. beige4l beige4p bei3k4 bei3l2a 2b1eime be1ind be1inh bein6hal bein4hi bei3sc beis2e bei1s4t beit4e beit2s beit4sk beits3p 3bek 3bel be3lag be3las bel3d be3lec 4be2lek be2l1en bel3ere be2let bel3f beli4e bel3la belle4n3 bel3li bel3om be2löf bel3sz belt2 bel4un 1bem4 3b2em. 3b2e3ma 2b1emp 2bemul 1ben be5nabe ben3ar be4nas be4nat be2nä b2ene be3nei be4n3end be4ners ben2eu 3beng be2nid be4nis ben3n 5benp b2ens ben4s3pa ben4spr benst4 3bensz 2b1entb 2bentd 4benteu 2bentf ben3th ben6thei ben5t4r 2b1ents 2b3entw ben3un b2en3z2 be1o 2b1epi 2bepoc be1ra be2rak be2r3am be2ran bera2s berb2 berbla4 ber3d be2r1e2b be4reck be4r3eiw bere2m be4rene ber4erg ber4erw bere4sc bere4t berf4 ber4g3af ber4gal ber4gli ber4hab beri2d ber4in. be5r6inne berin4s be2ri4o ber3iss ber3ko ber3kr ber3n2a bern2e b1ernt be2rö 3bers. ber5se ber3st4a bert2a bert2e bert2i berz2 ber3ze ber2zö 3b2e1s be3sa bes4abb bes2am bes2an be4sap be4sar bes2au be2sep be2s1er be2s1id bes2po bes3sa bess4e b3esst. bes3sz be4stab beste2 be6stein bester4 bes6terh be4s5tol bes4t3o4r bes3tos best4r be4s3trä be4s3tur be2sur be3s4ze 3bet be3tam be3tha be3thi bet2sp be1un be1ur 3bev 3b2ew2 2b3e2x 3b2ez 2b5f4 bfal2 bfal3t 2b1g2 b5ga bge3 bgel2e bge5n bges4 2b1h2 b5hä 1bi bi1ak bi2ar 3bib2 bibe2 biber1 bi2c bi3do bien3s bieres4 bie2s biet2s 3bietu biga1 bik2a bi2ke. bi2kes bi2kre 3bil bil2an bil3ans bil4deb bi2lei 4billu bi2lu 2bimp 2b1inb bin2e bine4n b1inf bin4fo bin2g3a 2b1inh bi2n3ok bin4ol 2b1int 2b1inv bi2o3 bioi2 biri1 3bis bi3si b1iso bi2sp bis2s1c bi2st bi3sta bi1s4tr b2it. b2ita b2ite b2iti bit4r bi2tu bi3z2 4b1j bjek4to 2b5k4 bl4 2bl. bla3b4 2b1lac b3lad b2lanc blas3er b2latt b2lau. b3laus4 2b3law 2b1län b2läse 3blät b2le 3ble2a b3leb 3blec b3leg 4bleh b4lei. 2b3leid 2bleih b3lein blei3sc 2bleit ble3l ble2n b3lenk b3lese 2blesu ble3s4z 3blet b3leu 2blich 3blick b2lie 2blief 4blig b2lind 2b5ling4 b2lis 2blis. b2lit b3lite b2lo b4lo. 3b4loc b4loi b3los 3b4lum 2blun b2lus 3blut blu4tem blut1o 3blü 2b1m 4b5n2 bnas4 bni2 bnis1 bo4a bo5as b1o2b bo3ben bob3r bo2c bo3ch2 bo3d2 boe1 bo2e3i 2b1of bo3fe bo3he boh2ra boh3rer boh2u bo1is bo2lan bo2lau bol5le 3bon. bo3n2a bon2da bon2d1e bo2ne 3bons boo4l boo2ti b1op 3bor. bo1ra bor2an bo2r3as bo2rau bo4rä bor2da bor2d3r bo2rei bo4rig bor3m bor2s b1ort bor4ter bor6t5rat bo4ruh bo2sc bo3se bo4s3p bos3t 3bot bote3n4e bo3th bot2st bot5t bo2xo b1oz bö2b3 2böf 2b1öl bölk3 2b1p4 bpa2g 2b1q b2r4 2br. b4ra. 2b3rad 2b4rah b4ra3k brast4 2b3rat. brat3er4 bra6terg 2b3ratg 3brä 4bräd brä4u 2bre. 6b5rechte 2b3red 2b3ref 2breg b3reif 2brek breli1 b4rem b4ren. 2b3rent 2breo 2b3rep b4rer b4res. b3rest b4ret bret6t5en b4rez bri2da brie4fa 2b3riem b4rien bri2er b3ries 2brigk b4rina 2b3rind b4rio b4risc b3ritt brob2 2b3roh 2b3rol bro2ma b4ron 2b3rost bro4tr brot3t4 2b3rou 3b4rö b4ruc 2bruf b4rum 2b3rund brus4 brust3 bru2th 3brü 4b3rüb 2b1s b2s1ad bs2am bs3amb b4s3amt bsau2r b4s3är b3s2äu b3sc bsch2 b4schan b6schef bs2chi b4sco bs2cu bse2b b3sel. bse2n1 b3sen. b2s1ent bs1erf bs1erg bs3e4r3in bs1erk bs1ers b3s2es b2sim bsi4t b4ski bs2ku b2s1of b3s2oh b3sol b4sop bso2r b2sö b3s2pi bs2pl bs2pu bss2 bs2t bst1a2b bst1ak bst3ank bs4t1as b3stä bs3tät bst3emi bst1er bst1h bst3ink b2stip b3sto b4stob b4stod bs4tol b4stor b3stö b4strac b2s3trä b4s3treu bs4tri bst3ro b3stü b4stüb b2s1un bs2zep bs2zi 4b1t b3t2a bta2s btast3r b5te b2t1h bt2i bti2s bt4r btran2 bts2 b3tü1 buche4 bu4chec bucher4 bu6ch5ers bu2chi buch3s4p bu2e3 bu2f bug3 bu2gr bul2l3a 2bumf 2b3umk 2buml 2b3umr bun4a bun4d3er bunde4s b1une bung4 b3un3gn 2b1unh bur1c b2ure b2urg burg1a bur4gan bur4gar bur4gin bur2gr bu3r2i 2burn b3ursa burts3 bu2sa bu2sc bus3cha bu3sche bu6schei bu6sch5el busch3w bu3shi bu2sin bu2s1p buster4 bu2su but2a buto3re 2büb bü1c bügel3e 2b1v 4b5w 3b2y1 bya2 byo2 by3p2 bys4 2b1z4 b5ze bzeit1 1c2a cab4 ca3bl 3ca2c ca2e3 ca3g2 ca1h cal2a cala3b cal2f3 cal3t 3cam 2can cana3 ca2pe car5n2 carri1 car2s ca3s2a3 cas5to ca3t2h ca1y2 cä3 cäs2 c1b 2cc c1ce c1ch2 c2d2 c3do 2cec 1ced ce2dr 2cef ce1i ce3in 2cek 3cels cen3a ce3nu cen3un ceo2 1cer cer3a cere1 cere3u ce3r2i ce4ris ce1ro ce3s4h 1cet ceta2 cet1am ce1u 1cé c1f c1g4 c2h 4ch. 2chab ch3a2b3i cha2ck 2chaf 2ch1a2g 2ch1ak chal6l5ei chan4a 3chanc chan3f ch1ang 4chanl 4chanz 3chao 4char. 3chara 3chard 3charta cha2sc chasi1 1chato 2chatt ch5austr chau3t ch1äh ch1ärm ch1äs 1châ 2chb 2chc 2chd che3b4 ch3e4ben ch3echt ch1edi che2el 1chef 3chef. che4fer 3chefs 2cheh 2chei ch1eim 4chelem che4ler 3chemi 2chemp che4neb che4nid che2no 4chents 4chentw che2r3a 4ch3erbs 6chergeb 4cherke cher6zie ch3es4s ches5t 4ch1e4ta 2ch3e4x 1ché 2chf 2chg 2chh 1chia chi3na 4chind 3chines 2chinf 2chinh 2ch1ins 2ch1int 2ch1inv 1chip. 1chiru 2chiso 2chj 2chk 2chl4 ch2le chle2i ch3lein ch4len 4chli ch2lu 4ch2m4 4chn4 chner8ei. 2chob cho2f ch1off chof4s ch1oh cho3l2a ch1orc cho4rei ch1ori ch2os ch3öl 3chör 2chp ch2r4 2chra ch3rad 2chre ch3rh 4chrit 3chromo 3chron ch5ros 4chs ch2spo ch4stal 2cht ch2tru 2chuf 2chuh 2chum 2ch1unf 2chunm 2chunt 2chur ch1urs 2chut chut4t 4chü 2chv 4chw 1chy 2chz ci1c ci1es c1ind cins2 c1int ci2s1 1ci3t2 c1j c2k 4ck. c4k1a 1cka. 2cka2b 2cka2c ck2ad 1ck2ag 2ckal cka2m 2ckan 2ckap cka4r1 1ckat ck1ä 2ckb 2ckc 2ckd 1cke 2cke2c 2ck1ef 4ckeff 2ck1eh 4ck1ei 2ckemp cke4na 6ckensem 4ckentf 4ckentw cke2ra ck2ere 6ckergeb 4ck3er4hö ckerk4 cker6lau ck2ern 2cke2ro ck1err 6ckerzeu 4ckese ck2et 4ckex 2ckf 2ckg 2ckh 1cki 2ck1i2d ck1in 4ckint 3ck4is 2ckk 2ck3l 2ckm 2ck5n 2ck3o2 ckos6t ck3ö2 2ckp 2ck3r 4cks cks2al ck4spen 2ckt ck3te ck3t2i 1cku 2ck1uh ck1um 2ckunt 2ck1up 2ckü 2ckv 2ckw 1cky 2ckz c2l2 cle4a clet4 clin2g cli2p1 clip3a clo1c clo2ck clo3f 1clu clu4b c2m2 c3me c3mu 1c2o co2c co3ch co2d2 co3di cof3f2 coi4 co1it co2ke co3la3 co2leu co3l2o com4te. comtes4 con2ne co2o coo1p co1p co1ra cor2da co4re cor3t cos3t co4te cou3si cô4 2cp 2c1q 1c2r2 c3rä c4re2 cre4mes 3crew 2cri cros4 2cry 2cs cs2a cs4f c4si cst2 c1s2ti c1s4tr 4c5t cti2 cti4o2 ction3 ctur6 c6tz 1c4u 2cua cu2e cu2p3 cup1e cussi4 c1w 2cx 1cy c1z 3da. da1a 2d1ab d3a2bak d2abä d2abe d3a2ben d3a2bi da3blu d3a2bo dab4ra da2bri da3brie d2ab4rü d1ac dach3a da2cho 4d3achse 2d1ad da2de da2do da2d4r d1af 2daff da1f4l dafo4n d1ag dagi4 dag2o da1h dah3l dail5 da1in 2d1air da1is da2kro dal2a 2d1a2lar dal3b2 4d1all da2lop da3lö 2d1alp d1al3t 2dalte da1lü 3dam da2mei d1amma 4d1ammä damo3 d2amp damp7f8erf 4d1amt 3d2an. d1ana da2nan da4n4at 2danb dan4ce. d1and2 2danda d2andy 3dane 4d3anei 2danf d1ang 2danh dan2kl dan2k1o dan2kr 2danl d1ann 2danna d1a2no 2d1ans 2dantw 2danw d1anz d2anz. 2danzi 2danzü 2d1ap d2apa d2aph da2po da3pos 4dapp d3apte 4daq da4r1a 2darb2 2d3arc dar2d1e dare2 daren1 dar3g dark2a 3darl dar2m1a dar2m1i dar4mu da2r3o 3dars 2d1art dar2th dar2tr da2ru d1arz da1s2 da3sh d1as3p das3s das4t dat2e2 da3tei 4d3a2tel date4n da2th 2d3atl 4datm d3ato dat2st 2d3atta 3daub 2daud dau3e2 dauer3e daue6rei 2d3au2f 2d3aug 2dauk da3unt 2d1aus3 dau2ß 3daw d1ax 3däc 2d1äg 2d1äh 2d1ämt dän3a 2d1änd 2d1äp 2däq 2därz 2d1ä2u dä3us 2däx 4d1b4 dbau2c dbauch3 dbe2e dbu2c 2dc d3ch 4d1d2 d3da d3dä d3de d3dh 1de dea2d de3ar de3a2t deb4 3debü de1c de4ca. de2cka de2del de2dit 2de3e4 def4a de2fa. 2d1eff def4l deg2 degene7 de3gl deh2a dehe2 3dehn de3ho 2d1ehr d1ei 3d2eic de3i4den de3il 3d2eim 4deime dein2d de3inse de3inst dein6sta dein6sti 4d3einw de3io 2deise d4e1ism dei2sp 2dekz de2l1ac del4ade de3lak de4l3aug del3änd del3b2 del3d del1ec 3de3leg delei4g 2delek 2delem de2len deler2 deler4r 2delf. 2delfm 3delik del2la dell3au del2l1ä delle2 del4l3eb del4lei del4l3er de2l1ob de2lop del2se del2so del2s1p del3t4 dem2ar 2d1emb dement4 de6mentg dem5ents de3min 2d1emot 2d1emp d2emu d4en. den2am dend2 de2n1e2d de4n3end de2nep 4denerg de3n2es 4d3en4ge. de2ni denk3li dens4am den6scho dense2 4den4sem den6sere den6s5tau 2dentd 2dentf 2dentg den3th 2dentn 2dentw 2dentz den6zers de2ob 2deol dep4l 2depoc d4er. der3af de2rak dera2n de3rand de2r3ap de1r2a4s de4r3asi der2bl 4d1erbs 2derdb de2r1e2b de4reck de4r3ei4s 5d4erem d4eren de4r3end 5d4erer der4erf derer3n der3ero derer4t derer6ze 5d4eres de2r3eu derf4 d4erfl d3erheb d2erhü de2r3id derin4f de6rinnu derin8teg der3k2 4derklä d2erm de1ro derö2 der3r derst2 der3sta dert7ende. derter6e dert4ra 6dertrag der8trage 3de3ru de4ruh de4rum 2d1erz. 2d1erzv d2es. de2sa des1ah de4sam de2s1än de2seb de4se2h de2sei de4seil 2d1esel des3elt de3sem de3s4end desen3e de2set de2sin des1o de2sor de2s1p de3spe de3spu dess2 dess4t dest5alt des6temp de5stern des4tex de1sto dest5rat de3stri des4tum de2su des1un 3desw det2 de3ta deten4t 2d1e2th 2d1etw 2d1eul de1un de1url de3us 2d1e2vid devil2 de1x2a de2xer de2xis 2dexpe 2dexpo 2d1f6 2d1g2 dgas3tr d2ge. dger2 dge3s d2gesh dge2t3a dge4t1e 2d1h2 dha1s4 4dho d3hu 1di di4ap di2a3s4 diat4 di4ath 3dic di1ce di3chl dicht6er di4ck3el 4d3i2co 3dida d1ide 2didee di2den 2didy di2e di3e4d di3enb die4neb diener6l di3e2ni dienst5r die2p di3ers. dies1c di3e4th 3dif 3dig dige2s dig4n dik2a dil2s3 2d1imb 2dimp din4a 2d1ind di3n2e 2d1inf 3ding 2d1inh di3ni 2d1inj 2d1ink 2d1ins 2d3int 2d1inv di2o3b dion3in dion3s4 di3ora dios2 di2osk di1p2 di3pt d1i2ra di4re. di2ren di2rin di2ris 2d1irl 2d1irr di2s1a2 2d1iso di2sp di3s4per 2d1isr dist2 di1s4ta di2s3te di4stra di4sz di2ta dite1c di4t3erl di4t3erm di4t3ers di1the di2tin di2tob di4t3r dit3s di2t1u di5v2 di3z2 2d1j d2jar 2d1k4 4d1l2 d3la dla3g dlap4 d3le dle2ra dli4f dl3m dl3s 2d3m2 4d3n2 dni2 dnis1 do5at 2d1ob 3d2oba dob2s d1of do2fe 2d1oh do3ha dole4 doll2 dol3la d3o2ly 3dom do2mal do2mar domen1 do4ming 4domn do2mu don2a do3nan doni1e 4dony 2dope 2d1opf do1r4a 2d1orc 2d1ord dor2f1a dor2fä dor2f1i dor2fl dor2fo dor2fr dor2f3u 2d1org d2orn 2dort dor4ter dor4tr d1os2 d2os. 2d3osm dos3s dos4t1 dost3a dosten4 do4stu do3ta do2tof do3un dow2s d2o3x2 d1ö dö2d dö2f döl1 döll2 d2ön 3d2ör dö2s1c 4d3p2 dpass3 dpol4n dpost1 2d1q d2r4 3d4ra. 3d4rab 4d3rad 2drahm 2d3rak 3d4ral d3ramp d3rand dran3k 2d3rast dra4tin 2draub 2d3rauc d4rauf 2draum 2draup 2dräd d4räh 2d3rät 2d3räu 4dre. 2d3rea d4rea. d4reas 3d4reck 2d3ref 4dreg 3d4reh dre2ha 2d3reic 3d4reie d4reiv d4rej dreli1 4drem 4d3ren d4reo 4d3rep 4d3rer 4dres. d4resc dres6sei dres6sel d4rew 2drez 2d3rh d4ria 4d3ric d3rieg 3drif 4d3riff d4rift 4d3rind 2d3rip 2d3risi 2driss 2d3ritu 2d3rob d3rod 2drogg 2drohr 3d4rohu 2d3roll 2d3rose d4ross 2d3rost 2d3rot 2d3rou 2d3rov d3row drö2sc d5rub 3d4ruc 2d3rud 2d3ruh 2d5rut drü1b drü5cke 3d4rüs 2d1s 4ds. 4dsa ds3ab d2s1ad ds1al d2salk d2sall d4s1amt d2san ds3ane ds3assi dsau2 d2saut ds1än ds2äu 4dsb d4schef d4schin d3s4co d2scr d2s1e2b dse2e d2s1ef ds1ehr ds4eign d2sein d2s1emb dsen3er d2s1eng d2s1ent d2s1erf d2serh d2s1erk d2s1erl ds1err d2s1ers d2s1ert d2serz dse4t d2s1eta d2s1ev d2sex d3sha2 ds2hak d4shal d3sho d4shor 4dsi d2sid d2s1im d3s2inf ds2kal d3s2kel d4sko 4dsl d4sli d3soh d2sop dso2r ds1ori d2sö ds1pas d2s1pat d2spä d2s1pec ds2pen d4speri d2s3ph d3s2pi ds2por d6sporto d3spri d2spro ds2pu dss4 dst2 d4stag d2stas ds3tauf d4s3täti d2ste d3stec d3stei d4steil d5stell d4stem d4sten d3s4tern ds2ti ds4til d4stoch ds4tol d5strei d3s4tro ds2tur dsu2m d2sun ds1url ds2zen 2d1t dta2be d3t2ac dtach3 dta2d dt2ag dta2n dt3ane d3t2as dt2ax d5tea dte3mo dt2et d2th d4thei d3to2 d4tob dt2op d3tö dt3r dtran2 dt3sa dt5st dtt4 dt2un d3t2ur d3tü d3ty 1du du1alv du1ar du2b3li du1ce duel3la du2f 2d1ufe duf4ter duf4to duf2tr 2d1uh du1i du2in du2kr dul3art 2d1umb 2dumd 2d1u2m1e 2dumf 2dumg 4d3umk 2duml d2ump 2dumr 2d1ums d2ums. 2d1umv du2n 2d3und 2d1unf dung4 2dungl 2d1uni dun3ke dun2kl 2dunr dun2s 2dunsi dunst3r 2dunt 2dunw 2d3unz du1os dup4 dur2 dur3au durch3 2d1urk 2d1url 2d1urn 2d1ursa 2d1ur3t du4schn du4schr du4sch3w 1dü 2düb d3über 2d1v2 2d1w dwa2 dwa4r dwer3te dwes2 dwest1 1dy dy2l1 dym3 3dyn dy2s1c dy2sp 4d3z2 2e1a ea2be ea2b3l ea4br ea2c eadli4 e3a2dr ea2g ea3ga4 ea3g4l eakt2 e2akta e3akto ea2la e3alei e4alem ea4l3ent ealen4z ealer2 e3a4lerg e3alex e3a2lin eal1o ea2lon ea2lop e2alti2 eal3tr ea2l3u2 eam3 e2am4e eam1o eamt2 ea4na ean3a2r e3anf e2ano e3ar. ea2ra ea3rat e2are e4are. ea2r1ei ea4rene e4arer e4ares ea2ro e3arz e3a2sc e3asf easin4 ea4sp eas3s eate2 eater1 eat4mes eat2mu eat4mun ea5tr eat3s2 e3at5t2 eatu2 e3aue e3auf eau2fe eau4fl e4aufo eau3n e2av e2az e3ä2 e1b 2eba e3bak eba2p e3bän 2ebec ebe1er ebein7h eb2el ebe4ler ebe2lo ebels4t ebel5ste ebenen3 ebe4ras ebert4 ebese2 ebe4s3eh ebe2so 2ebet ebet4s 2ebh 2ebi 2ebl e3blä eb3le. eb3ler eb4leu e3blie eb3lo eb2lö 2ebo e2bob ebot2 ebö2s 2ebr e5brau eb4rea eb2s1 eb4sche ebse2 ebs7panne ebs3tau eb4stät ebs3tem ebs3t2h ebs3ti eb3str 2ebu e2bunt ebu2t3 eby4t 2e3ca 2e3ce ech1am ech1ä 2e1che ech1ei ech2en1 e6ch5erzi e1chi ech3l ech3m ech3n e2cho. ech3ö2 ech3r ech4ri echs4er echst5re ech3tab ech3t4ei ech6terh echter8ha e1chu ech1w 2echz e1ci eci2a ec4k ecke4n1 e4ckerr eck3ser eck4sta 2eckt 3eckty 2e1cl 2eco 2e3cr ec1s 2ect e1d ed2a ed2dr ed4e ede2al ede3n4er edens1 eden4sa eden4se eden4sp edeo2 ede2r eder3a ede3rat eder3t2 edes2t ed2i e3di. 2edip edi6teng e3d2o ed2ö e3drei ed4rö ed2sal ed4seh ed2s1es ed2si ed2s1o ed2s1p ed2sto ed2s3tr ed2s1u edun3 edund2 e3dy3 edys4 2ee ee3a4 eeb2l ee1c ee4ce ee2cho e1e2ck eede3 eede1s eed3s2 ee1e2 e1eff eef4l eeg4 e1ei ee2i3e eein4se eei4sc eeis3s e2ela eel2e e3e2lek eele4n eel2ö e2e3m2a e1emb ee3min e1emp e1en eena2g e2enä e2enc een1e e3eng ee3ni e3enk e3enl e2eno4 een3s een2z ee3o e2ep ee3po eer4at e1erbt e1erd ee3re eer1ei ee4r3en4g eer2e2s eere2t eer3eti e1ermä ee1ro ee1rö e1eröf eer2ös ee3r2un e1erz ee1s2 ee3sh ees3k ee3sp ee3s4t e2et. ee3t2a ee4tat ee2th eet2i ee3t4r ee2tu ee1u2 eewa4r e1e2x e1f e2f1ad e3fah ef1ana ef1ar e2farc ef3arm e2fat 2efä ef2äl e2fäu 2efe e2f1e2b e3fef efe4l3ei ef1em e2femi efe2n1 3e2f1ene e2fent efer5f eferin6d efeuil4 3effek 1effi ef2fl ef3flu 2efi ef1id e2f1ins efi2s 2efl ef4le e3f4lu e3flü 2e3f2o 2efr ef4reih ef3rol ef3rom ef4ru ef4rü efs2 efs4c ef3so ef3sp ef2tan ef2tei ef2tro 2efu e2fum e1g ega2m e3g2anz egd4 e3ge egein3 ege4lan ege4l3au ege8l7ei8er ege4ler ege2lo eg2en ege4n1a ege6nero ege2ra ege5stal ege4s3tr ege1u 2egi 2egl e2glo e2glu e2gn eg3nä eg3ni ego1p eg4sal egsau3g eg3se eg4sei egse3l eg3si eg4sk egst2 eg4sto eg2th egung4 egus3 2e1ha eh1ach eh1ad eh2ade e3h2ah eh2al ehalt4s e3hand e2harz e3haut e1hä e1he eh1eff eh1ein eh1elt e4hense e4h3ente ehen6tr ehe3o 1e2hep 2eher ehe1ra e2h1er2f e2h1er2l ehe3str 2e1hi eh3im eh1lam eh2l3au eh1lä ehl3ein eh4lent eh5l2er ehlo2 ehl1or eh2lö ehl2se ehls2t 2ehm eh2mab eh4mant eh3mu eh3na eh3no 2e1ho eho2f eho2l eh3oly 2e3hö ehö4rer eh2r1a2 ehr1ä ehr1e2c eh2rei eh2rel ehr6erle ehr4ern ehre3s eh4rin eh1roc ehr1of eh1rö ehs2 eh3sh eh1ste 2eh3t2 eht3h eht4r 2e1hu e2hum eh1unf e2huni e3hur e1hü eh3üb eh1w e1hy 2ei3a2 eia4t ei2bar ei2bli ei4blu eibu4t ei4b3ute e4ic ei1ce ei2cho e2id ei2d1a ei3de ei4deis eid5erre 2eidn ei3do ei3dr ei1e eie2b eie2d ei3e2l eie2m 4ei3e2n3 eienge4 ei3es eie2t 4eif. ei1flo 1eifr eif3t 2eig. 2eiga eig2ar 2eigä 2eige. 2eigeb 2eigeh 4eigeno 5eigensc 4eig2er 2eiges 2eigew 2eigi 1ei2g3n ei2go ei4g3rat 2eigre 2eigrö 2eigru 2eigrü 2eigs 2eigt 2eigu 4eih ei2hum ei2kab ei2kak eik4am eik2ar eik2i eik2l ei3k4la ei3klä eik2o e2il 4eil. ei4l3ab ei2lam eila2n ei4l3ane ei4lang ei4lanz ei2lar 2eilb eil3d4 ei4lein eile2n1 ei2let eil3f4 eilm2 ei2lob eil2ö 2eim. ei2mab ei2m1ag eim3all eim3alp ei2m1or 2eimö 2eimp eim2p4l eim3sa ei2mur e4i2n1a ei4na2d ei4nae ei4n3an ei4na4s ei4n3at ei2n3ä ein3d2e ein6derk e1indu 2eineb einen4e ei4n3en4g ei6nen6se ein5erbe ei4nerf ei4nerk ein5er6la einer6sc ei2neu ein4fiz 2einfo ein4fo. ein4fos ein3g2 3einger e2ingr e2inhä ei2nie e1init ein3k4 ein6karn 3einkä e2inl ein3n2 3einna ei2n1o2 1einri e6insa 3einsat e2insc 5einschä ein6stal ein6terv 3eintö 1einu ei3o eio2p eio4s ei1p eip2f 2eir eir2c ei3re e1irr e4is. ei2sa ei3sas ei6schwu e4ise ei4ser4g ei4s3er4l ei6s5erst ei4s3erw 1eisho ei3s2ky ei2so eis2pe e2iss eisser6s 4ei1sto ei2sum ei2sur 1eiswo e2it ei2t1a2b ei2tal ei2t1an ei2tap ei2tar ei4tat 2eitä ei2tän eite4ra ei4tess ei2t1h ei2tin eito2 ei4trau ei4tro eitsa4g eit3t4 4eitu ei4t1um ei2t1ur eit3z2 eiv2 eive4 ei2zar eiz1in 2e3j e1k 2ek. 2e3k2a 1ekd ek2e e3ke. e3ke4n e3kes e3key e3k2l ek4lo ek4n e3k2o ekor4da 2e3kr ek4s1p 4ekt ek2tan ek5t6ante ekt3at ek2t1ä ek2te2l ekt3erf ekt3erk ek4t3er4z ekt2o ek2t3o4b ek5tri 2e3ku ekur2a e3k2w 1ekz e1la el2abt el3abu ela2ck el3ader el1af ela4h e2l1ak e2l1a2m el2a3mi e3lamp el1ana e4landa e2lanm e4l1ans e2l1ant e4lanw el1anz 2elao e2l1ap e2l1ar el3a2ri ela2s el1a4si el1asp ela3su el3aufw 2e1lä 2elbil 2elbr 2eld elda2r eld3ari eld4arm el4d3erf elder4p elder4s eld5erst el3des elds2 4e3le. 2e3lea elea2r 2e3leb 4ele2c el1ech 1elefa eleg3s 4eleh el3ehe. 2elei e6l5ei6ern e2l1ein e3leine e5leit 1elek 2eleko e2l1el 1e2lem 2e3lem. e3lema ele2mi e3lemm 2el1emp 2e3len. elen4k3l e4lense e2l1ent e3lep 2eler e3ler. eler2a el1erd e6lereig el1erf e4ler4fa e4lerfi e2lerg el1erh el1erk e2l1erl e4l3ernä eler2ö e2l1err el3eru el1erw e2l1ess e2l1e4ta ele2ti elet4ta 2el1ex e3lex. 1elf. elf2er 1elfm elf4r 1elft elgi5er. elgi5ers el3g2l elg4r e2l1id 2e3lie eli3ef. 2elig e2lim elin3a eli3no el1ins 2elk el4larb ellar4t el3lär el5le. ell2ei ell3ein ell3eis el4lel el5lend ellenen5 ell2er eller8fas eller7g ell3erh el3les el2lim 1ellip el2lor ell2ö ell3sp el3ma elm2e elm3ein 2eln el3na 2elo e2l3oa e2lof e2lol e2lom e2lonk el1opf e2l1or e3lore elo2ri e3lot e3l2ov 2elö elö2s el3p4 el4s5ein el3sen els4tri el2sum el4tans elte4m el5ten. el4t3ent elter4b elter4f elt3erh elter6le 3elter4n elt5ero elter6sc elte2s el4tesc elt3eth el3the el5tri elts3pa 2e1lu el1uf e2l1um e2l3u2r elu2s el3use elu2t el3uto e1lü 2ely e2lya el3z2ac el2zar el4zene elz1in el2zwa 2elzy e1m e2m3a2b e2m1alk em3anf e2m1ano em1ans 1emanz e4m1a4s3p em1au 2e3mä em2äh 1emba 1embo 1embry em2dä emd1r em2dra 2eme e2m1e2b e2mef eme2i e2mele em2en emen6gel emen4t3h eme3r2i e2m1er2l em1erw e4mesu 3e2meti e2m1i2d emi2ei e2mig emik2 em1im 2emin emi3n2a e3mind em1int 1e2mir e3misc emi3tr emma3u em2m1ei e2moa e3mol emo3s 1empf4 em3pfl em3po empo1s em2sa em4scha em4sei em2sim em2spr em2st ems5tr ems3tro em3t2 1e2mul 3emuls emune7 e3mur 2emü e2na 4ena. e4na2b en3aba en3abo 4ena2c en3ache e4n3ack enadi4 e4naf 4enah en3ak en1al enal2a e4nalb e3nale en2alg ena3l2i e4nalk e4nalm e4nalo enal3p 4en1am ena4n e4nand en3ane e4nant e4nanz en1ap ena2pa en3are en3ark en3aro en1as ena2sc e4nast 2enat 4e5nati e4natl enat4s e4n3att 4enatu e4nau2f en3aug e4n3aur e6nausta e4naut en1a2x en1a4z en1ä en3äb e3näi e2när en2ä3s en3äst en2ce. end2ac en2dal en4dang 2endel ende4lä en4d3es4s en2dex en2did en3d4ort end3s4au end3s2l end3s2p end3sz en3d2um en3d2ü 2ene. en3e4ben en1e2c e2neff ene2h en2eid e3neien e4neige 4eneigu e4nein e4neis e2n1el ene4le 2ene2m e2n1emi 2enen e4nense e4n1ent en4entr en3envi en1ep 4e3ner. en2era e2n1erd en3erei e2nerf en4erfr 1energ e2nerh e2nerk e2n1erl e4nermi e4n3ermo 4enern e4n3erne ene2ro e2n1err en1ers 4eners. e2n1ert en4ert. e2n3eru e2n1erw 2enes e3nes. e2n1e2sc e2n1esk e2n1ess en1eta e2n1eth en1eul e2n1e2v e4ne2x en3f enf2u 1engad 1engag en3g2al enge3r4a en3g2i en3gn en3g2o 1engp eng4ra eng3se 2eni e3ni. e3nic 4e3nie eni3er. eni3erp eni5ers. en3i2ko en3ill eni4m en1ima en1imi e2n1in e3nio eni2ö e2nir eni4sa e4n3iso e3nit2 e3niv enk3aus 3enkeli enk3erg en4k3erk en3k2ü en2nef en2nel en4ner4f enn3erg en4n3erl enn2i enni6ger 2enniv enns2 enn3ste e2n3oa e2n1ob e3nobel eno2br e2nof en3olm eno2ma eno4n e2n1op e2n1o2r en2ora eno4ri 4enorm e2n1ost 4e3not eno2w 2e1nö en1ö2d en3sabb en2san en5sche en2seb 1ensem ensen3e ens3ere en3spo ens4por enst5alt en4s3tät ens4tel ens6temp ens2th 2ensto enst2ü en5t2ag en4tanm en4tanw en3t4ark 1entd en3t2el ente2n 3entera en4terb 1entf 2entfo 1entg 3entgeg en2thi 1enthu 1enthü en4t1id 3entla 1entn en2tob entopf3 en2t1os 2entö en4t3rol 1entsc 1entso ent4sto 1entw 4entwet 3entwic 1entz e2n1u e3nu. e4nu4r 2enu4t e4nuto e1nü enü1st 4enwü 2e1ny en3zare enz2äp 1enzep enz3erg en4z3erk en4zerl en4z3erm enz5ersc enzi2d enzlan4 enzo2l 1enzy e1ñ 4eo e1o2b1 eo3ben eo3bl eo3bo eo3br eo1c eoch2 eo3dr e1of eo3g2 e1oh eo3la e3o2ly e1on e3o2nat eo1o e1opf eop4r e1or e3or. eo1ra e3orb eorgi1 e3ors eort2 e3orw eo1s2 e3os. eo3se e1oste e1ou4 eo1ul e1ö4 e1p 2ep2a epa2g epas6ser 2eper e3p2f4 e5pfi 1e2pid e2pig e2pik 1e2pile e3pio 1epis 2epist 1e2pit ep3le 1epoc eport4 1e2pos. ep2p1a eppe3l ep2pl ep2pr 2epr ep3sh ep2tal ept2an ep2tau 2e3pu epu2s 4e3q er1a e3ra. era2be e2r3a2ch e3rad. e3radi e2radj e2radm e4radmi e4r3adr eraf4a era2g e1rah e1rai er3aic e3rake e1rald eral4eb er3alke e2r3all er2an. era4n4a eran3d e3rand. e4rangr e2ranh e2rano e1rap er3apa er3apf e2rar er3are e3rari e3ras. era2si e1rast era2ß e4ratel e2ratl e1raub e1rauc er3aue erau2f er3aug e2ra2v e1raw e2r3ax e1raz e1rä er1äf er1äh er1ä2m er1äp e2r1äs er1ätz 3erbarm erb2au erb2e 2erbru erb2sp er1c er3chl erch2o erd2am erda3me 1erdb 2erdec 2erdel er4d3en4g erd3erw erdes4t erdeu2 1erdg erd3st 2erdy 4ere. er3e4ben e3r2ech er3echs er1e2ck er1edi ere4dit er1eff e2r1e2h ere4i 4e3rei. e3reib er1eig 4ereih e4r3eime e4reink er3eis. er5eisar er3eisb er3eisf er3eisr erei5str e4rek er1e2l e2rele ere3lev ereli1 2erem 4erem. er1emi ere4mis e2remp 2eren 4e3ren. e3rena eren1e e4rense e4rentn e4rents e3renz eren8z7en8d er1epe 4erer. 2ererb erer3fa e4r3erfo e2rerh e2rerk e2rer2l erer5lau 4erern. e4rerne e2rer2o erer4ri er1ers 4erers. e8rersche e2rert 2ererv 2ererw 2eres 4eres. ere2sp er1ess eres3sk er1eta er1eu ere4vid erf2e 4erform erf4r 4erfür er4g3are 4ergebi 3ergebn 4ergebü 4ergeha 4ergehä ergel4s3 erg5elst 4ergeni 2ergn er2gop 4ergrem erg1s erg3s2o ergs2p ergs4t e4rh 1erhab er3hag 2erhai 4erhals 2erham 2erhan 2erhas er3hei 2erher er3hu 2eri e2riat e3rib 4e3ric e4r3ico er1id 4e3rie eri3en1 e3ri3k erik4l 4e3rin. e2r1ind e2r1ini er1ink er1inl er1int er1inz e2ri2on 4eris e2riso e2risr er1ita 3eritr e3riv 2erk. 2erkaj er3ker 1erklä 2erkm 2erkre erk5t4 er2kum 2erl. 2erlag 3erlebn 4erleh 2erln er3m2 ermen4s er4m3ers er4n3alt er3ne er4nene er4nerf er4nerk 3erneue er2nob erno2r ern1os 2e1ro. e1roa er1ob ero2bl ero2br e2r1o2f e1rog e1roh e1rok e1rol er3oly e1rom er3omb 2e3ron e2r1oo er1op 2e4ro4r eror2a e1ros 1erosi e3rosit e1rou e1row er1o2x er1oz erö2d 2eröh erö4l er1ös erö2sc er3p er3rä 2erren er3ro 2errü er3s2a ers4ana ersch4 er5schn 4ersei ers2el er3sen er5s2i er3sk 4ersted er3stel erst5ers 4erstil ers4tod ers6tr er3swi er3sz ert1ab er3tat er4t3erf er4t3er4g er4ter4h er4ter4k er4ters ert1h er2tho 4ertö er5tri 4ertru erts2e erts2p 2eru eruf4s3 e4r3uhr er1u2m1 er1und e4rundu erung4 er1up. er3ur er3use e2r3uz erü4b 3erweck er4zerk er4z3ers es3ab e4sabe e2s1a2d e3saf es3ak e4s3all es1ami es3ampl es2ank es2anm es2anr es3anz e3sap es2apa esa2ra e3sa2s es2ast esa2v es1ax 2esb esbi5er. e3s2ce esch2 es4chi e2s3ec es1ehr esein4s es2el ese4nal ese4neu esen3o es2ens esen3sk esen3th eser4at ese4r1u2 eses2k e2s3e2x 2esf 2esh es2har es3he 2esi esi1er e2s3i2k e2s1il esi2st es2kat e4s3ke e4s3kl es3ku e4s3ky es3l 2esm e2s3oa e4s3ob e2s1od es2oh eso2r es1ora eso3re es2ort e3sot e3s2ö 4esp e3spal es4park es2pek e4spers e2sph e3s2pi e3s2por 2esr 2ess. es2s1ag essali3 essau4s 1essay 2essä 2es3sc ess6ere ess4erf ess3erg ess5er6la 2essk 2esso es2sof 2essp es2s1pa es2spu es4stab ess3tie es3stu estab4b esta3ge est1ak es4tanb es4tang e4stant e1st4ap e1star e4starb e2st1a4s e1stat e4stat. e4staum e4staus es2tec este4i est5eing est5eink est5einl e1ste2l es4t3emi e4sten es4t3eng est5entr est5erha es4ter4ö es4t3erz es4t3ess es2th es2tid e4stig e1stil e2stip es2tis estmo6de 1estn e2stom e3strec es4tri e1strö e1stu est3ums es2tur e1s6tü e3sty e3suh e2s1um es3ums es3unt es1ur esu4s 2es3w e3sy es3z es4zene 2e1ß e2ß1el e2ßent eße3re e2ß1er2g e2ß1erl eß3t e1t etab4 eta2c 2e3taf 2etal et1ami et4an. et4at etat3r et1äh 2e3te ete2e e4t1ef e4t1ein ete3ke eten3d2 ete2o eter4hö ete1ro eter4tr ete2s 2eth. et2ha e4t3hal e3the et2hi e4thik 3ethn et2hu e4t1i2d eti2m etin1 et1ini et2it eti2ta eti2th et3l 2e3to e2tob e4t1o2f et4on eto4n3al etons4 e4torg eto2s 2etr et3rad e4traum et3rec e2t3res et4ros ets2c etscher7e etsch3w ets1p et2spe et2ste ett1a et2ta2b et2tad et2tak et4tans ett2as et2tau et2tei ette4n1 ett4er et2t1h et2t3r et2t1um 3e2tui e3tur e3tü etwa4r 1e2tym 2etz et2zw eu1a2 eu3b4 2euc euch4ta 2eud eude1s eudi4e 2eue eu2eb eue6r5eif eue6reis euerer6s euerer6t eu3eri eu3erk eu3err eu2esc 4euf eu2fer eu2g1a euge4mi eu6gense eu3g2er eugin2 eugin4f eu4gin4g eu2gre eu2gri eugs4 eug3sp eu3h eu1id eu1in1 e4uk 1eukal eu2kä eulan2 euland3 eu3l2e eul2i 2e1um e3um. eu3m4a e3umb e3umf e3uml e3um2s1 eum5st e3umw 2eun eu2na eun2e eu4nei e3un2g eu2nio eu4nis eunk2 eun3ka eu1o2 eu1p e1up. eu3p2f e3upg eu4r1an eu4r3ast eura3t eu2rau eur1c e2ure euren2 eu4rens eur4er eur3f4 1euro 2eus e3usar eusch4o eus2i eu4sk eu3sp eust4 eu1sta eu1sto eu1s4tr 2eut eut2e eut2h 3eu3tha eut2i eu5t2o eut6scha eut6schn eut6schr 2eux eu2za eu2zo eu2z1w e3ü e1v e2vak e3var eva4s3 2ev2e eve5ri evie3le 2e3vor e1w ewä2s e2we. ewei4sc ewert4 ewer3te e3wir ewi2s e3wit 2ex. 1exam ex3at 2exc 2exd e2xel ex1er 2exes e1xi 2exik e2xil e2x1in e3xio 1exis ex3l 1exp 2expu 2exs 2ext. 2ex2ta ex2tin 1extr 2extu 2extv 2exu e2xum 2e1xy 2ey1 eyl2 ey2n ey3no eys4 e1z e3z2a ez2ä e2z1enn e3zi ezi2s e3z2o ez2w ez3z2 é1b é1c é1g égi2 é1h é1l2 élu2 é1m2 é1n é1o é1p é1r2 é1s ési2s é1t é1u2 é1v é1z2 è1c è1m ène1 ènes4 è1r 1ën ë1t ê1p ê4t 1fa fab4 2f1ab5b fa2ben 2fabf 2fabg 2f1a2b5l 2fabn 3f2abr 2f1ab5s 2fabw fa4cheb fa4chel fa2ch1i fa2cho fach3s4p fa2dan fa2del f1ader fa2di fa2dr fa3e fah6l5ent 3fahre 5fahrt fai3b f1a2ka fa2ke f3aktio f4akto 3f2aku fa3la fa3le fal2kl fal2l1a fal4l3ei fall5ent fal6lerk faller6s fal6scha fal6schl fal6schm fal2tr fa2mei f1amp f1amt 3f2an. fa2nar fand2a f2anf fan2ga fan2gr 2f1an3k 2fanl 4fann f1anp 2fanr 2fanw 2f1an3z 2f1a2p f2ar far2b1a far4bel far4b3er far4bin farb1l far2bo far2b3r far2b3u f3arc 3fa5ri far2r1a farr3s 2f3art 2f3arz fa3s4a fa3sh fa2st 2f1astr fa2ß f3at f4at. fa2to f4ats 2f1auf f3aug fau2s f1ausb faus4t3r 3f4av fa2xa 1fä 3fä1c fäh4rin fäh2ru f1älte 2fäq 3färb 2f1ärm 2färz fässer4 fäs6serk fäs6serw fä2ßer 2f1ätz 2fäug 2fäx 4f1b4 fbau1 fber2 2f1c f3ch 2f3d4 fdien2 1fe 3fe. featu4 fe2c f2ech fe3che fe2del fe2dr fe2e1i feein5 fe1em 2f1e2he fehle2 feh4lei f2eie f2eind 2f1eing fe3ini fe3ins. fei4nu 2f1einw f1eis fek4tin fe2l3a2 fe2l1ä fel2da felde4m feld6erh fel2dr 2fe2lek 2felem fe2l1er fe2les fe2l1o fel4s3oh fels2t felt4 6fel6tern f2em. 2femb fem4m 2femp fen3a fe2nä fend2 4fenerg fe2ni fe2no fen3s2a fen5s2c fenst2 f1ent fen3t2a 2f3entf f2enti 4fentla f2ento 2f3entw 4f3entz 3fep fe2pi f2er. fe1ra fe2rab fer3a2d fe2ral fe4rang fer4ant fe4ranz fe2rau fe2r1ä 2ferd. fer3da fer3d2e3 f2ere fe2r1e2b fe2rec 3fer2ei 4f3ereig fer3eis f4erel fer3ell fe4rer4g fer4fah fer4fol ferg4 f4ergr feri2d ferie4n3 feri4on 4fer4leb f2ern. fer4nei fe2rö f4erpa f4erpf f4erpl f4erra fer4reg ferri2 f2ers. f2ert fert4r f2erz fess2e fe2st fest3a4b fest3an fest3ei fes4tel fes4t1o fes4t3r 2f1e2ta fe4tag 3fete fe2th fet4t3a fetti3s 2feu. feuer3ö 3few 2f1ex fe1y2 3fez 1fé 4f1f ffab6s ff1a2d f3f2ak ff3ar f3fas ffa2t ff1au f2f1e2b ffe2e f2f1ef f2f1ei ffe3in. f5fek ff1e2m f2femi ff2en ff3erle fff4 ffi3k f2fim ffin3s ff1lag ff3le ff3li f3flü ffo2r ff1ox f3f4rä ff3ro ffs2am ff2s1p ffs3tie ffs3tut ff3stü ff3t2 ffus3s f2fy 4f3g2 fgeb2 fge3s fglim2 4f3h2 1fi 3fi. fi4ak fi2ar fi3at fid4 fi2do f2ie fi2e1i fien3 fi1er2f fi2gr fi2k1as fi2kel fi2kin fi2kn fi2k1o4 fi4k3r f2il fi2l1an fil3d fi2les fil2et filg4 fi3li fi4lin fil2ip fil2ma fil2mä fil4med fil4mei fi2lo 2fimp 3f2in2a fin2e 2f1inf fing2 fing4s4 fi3ni f2ink fin2s fin3sc fin3sti 2f1int fi2o fi3ol fi2r fi3ra fi4re fir3me fi3s2a fi4sch3a fi6schei fisch3o fi4schr fi4sch3w fi3s2h 2f1iso fis2p fi2s3t fite2 fi2tin fit1o2 fi4tor five4 fi2xel fi2za 2f1j 3f2jo 4f1k4 fka4t3 f2l2 2fl. f3lad f5land f4lans f3lap f4lasc f3lats flauma4 1flä 3f4läc 4fläd 2fläh 2f3län 2flär 2f3läu f5le. 2f3leb f4lee 2f5lein flek3 flekt2 f3ler f4lex f3li. 3f4lim f3lind fli4ne f3ling 2f3lins 2f5lon 1f4lop 1floß 1f4lot flo2w f3lö 4flöf f4lög 3f4luc f3luf 1f4lug 1f4luss f4lut flut1o f4lü f5lüm fly1 4f3m2 fma5che fma2d 4f3n2 fni2s 1fo f1ob fo2be 2fober fob2l 2f1o2f 5foli3 fo2na fo4nan fon3au fon3dr fo4n3in fo2nop fons4 fo2nu 2f1op 4f3org 3form for4m3a4g for4mas for4m3ei for4min forni7er. for6schl for4st for4t3ei for4ter for2t1h for2t3r fort3s2 for3tu for2u fot4r 1fö 2fö2f 2f1ök 4f1öl för4s5 4f3p4 2f1q f2r4 f3ra. frach6tr 2f3rad 2f3rah fra4m f3rand f5rap fras3ta f3rat 1frau. f3rauc 2fräd 1f4rän 2fre. f3rec f3red 2fref f4rei. f3reic f4reie frei1f f4reig frei3k2 2frein 2frek 2f3rep 2frest 3f4reu 2f3ric fricht6e fri3d fri2e 2frig f4ri3k f3rip 1fris f4risc f4rist 2f3roc 2frol 1f4ro2n fro4n1a f4rop fro2s f3rot frös2 f3ru f4ruc f3rü 4f1s f2s1al f2sa2n fs3ane f4s3ar f2s1a2s fsa2t fs3ate f2saut fs2än f3sc f4sca f4sce f4schan f4schef f4schro f4scr f2s1e2b fse2ei f4s1ehr fse2n fs1en1e f2s1ent f2s1er fse4t f2s1eta f2s1i4d f3s2ky f2s1o2 f3soh f3sol f3spann f2s1pas f2sph f3s2pl f3s2por f2spre f2spro fs2pul fs3s4 fs2t fst2a fs3tak f2stas f3stat fs3tät f4stäti f3stel f3stern fs3th f2stip fs4tol fs4tor fst4r f4s3tres fs3trü f4stüte f2s1un f3sy 4f1t f4ta. ft1a2be ft1abl ft1af ft2ag ft1ala ft1an f2t1ap ft1a2r ft3att f2t1äu fte2c ft1eck ft1edi ft1eh fte2he ft1eig ft1ein ft1eis ft1eli fte3ma ft1emi f4t1ent ft3erfü ft1erk f2t1erl f2t1erz f2t1e2ti f2t1ex f2t1h f4t3hei f2t1id f3tik f2tim f2t1in ft2ing fto2 f2t1of f2t3ot f3t4ran f2t3res f3treu ft4rit ft3ro ft3ruh ft2s1 ft4sam ft3s2c ft4sche ftse2 ft4seh ftsen1 ft3st ft4staf fts3tät ft4stei ft4stem ft6stier ft6s5treu ftstro4 ft4stru f2tum ft1urk ft1url f3tü ftwa4 ftwa6r ft3z2 ftze3d 1fu 3fuc 3fug f2uh fuku3 fulb4 f1um1 fu2mei f2umm fund3er fun6derg fun6derh 2f1unf fung4 2fungl 2f1u2ni fun2kl fun2ko fun2k3r fun2ku 2f1unm 2funr 2funt f2ur furch2 fu4re. 2f3url fus2sa fus2s1p fus2st fu2ß1er 3fut 1fü 2füb fühl4sc fün2 fü2r 2f1v 4f1w f1y 4f1z fz2a fzeiten6 fzei8t7end fz2ö fzu2ga fz2w 3ga. 2gabf 2gabg 2g1a2b3l gab2o g1abr gab4ri 2gabsc g2abt. 2gabtr ga3bu 2gabw 2gabz ga1c gade2r ga3d2i gadi4e ga2dr gae2 ga1fl 5gag. ga1k ga2ka ga2ku gal2a ga3laf ga2lar 2g1alau 2g1alb 2g1alg gal3lo 2g1alp 2g1alta 2g1altd g1a2lu ga2mec ga3mel gam3ma 5g4amo 2g1amt g1a2na 2ganal gan3d4 2ganf 2ganga 4gangeb gan2gr gang4sp gan2g1u 2g1ank 2ganl 2ganmu 3g2ano ga2nob 2ganr gans2 g2ans. 2g1ansi 2ganst 2ganw ga1ny 2g1anz ga3pe 2g1app ga1q 3gar. g2ara 2garc 3g2ard ga3ret ga3r2i 2g3arm ga3r2o gar2s 2g1arti ga3ru 2g1arz g2as. ga2sa ga4s3al ga4sam gasche4 gase2 ga2sei ga2sel ga2se4m ga2si ga2sor gas3s2 5g4asse. g3asses 6gassess ga2st ga4ste gas4t3el ga4str gast3rä ga3t2a 2gatm gat4r gau1c 2g1auf 2g3aug g2auk gau5ne 2g1aus 2g1aut ga3z 2g1äp gär3th 2gärz gä4u 2g5b4 gber2 gbi2 gby4t 2g1c 2gd g1da g3d2ad gda3de g2d1ak g2d1an g2d1ar g2d1au g1dä1 g2dei4 gd1els g2dent g2d1er g2d1et g2d1in g1do g2dop g1dö g1dr gd3re gd3ru gd3s2 gdt4 ge3a2 ge4ate geb2a ge3ble geb4lin geb4lo gebot4 3gebü ge1c ge3ck ge1e2 ge3ec ge2es geest3 ge5fa 3gefä 4g1eff gef4l gef4r ge3fu g4eg gege2n1 gegene4 gegen3s4 ge3g2l geg4r geher3l ge3ho 2g1eid ge4ie2 ge4ig g2eil ge1in1 ge2inf gein4h 2g1einr gein2s gein2v ge1ir 2g1eise gei3sh geis4s3c gei2st geist3r 2gek. ge4lanz gelb1r gel4b3ra gelb3s gel4den gelder4 gel6derh gel6ders ge3lec gele5cke ge2lef 2ge2lek 2gelem gelen1 ge4lene gel3ere ge4lerk geler3ö ge4l3ers ge2l1ev gel3f gel1i4m gel3la gell2i gel2ö gel3sa gels2p gels2t gel3ste gel3sz gel3ta gelt4r gel3z2 gem2 ge4ma. gem6e 4g1emp ge3mu g4en. ge3na ge4n1ac ge4nad ge4nak ge4n3al ge4nam ge4nap ge4nar ge4nat gen4aug 4genda. gend3in3 4g3endmo gen2d3r gen3eid gener4f 4generg ge4n3ern gen6erwe gener4z ge2nim gen3k4 gen3n ge2noc gen4sam gen6semb gen3sk gen3sz gen3tä 2gentf gen3t2h gen5tr 2gentw gen3zw ge1oo geo2ri g2ep4 ge3pl ge3po ge1ra ge2rab ge2rak ge2r3al ge3rann ge4rant ge4r3a2r ger2as 2gerdg ge3rem ge4rene ge4reng ge4ren4s ge4r3ent ger2er gerin4d gerin4f ger4inn gerin4t 4ger4klä g3erlas ger5me ger3no 2g1ernt ge1ro ge2rob ge1r2ö ger4sat 4g3er4seh ge3r2u ge1s2 g4es. ges3auf 3ge3sc gesch4 ge6sche. ge2s3eb 4g3e4sel. ges3elt ge2s3er ge3sha ge3si ge3so ge3spa ges4pi ges3se ges3s4t gest2 gest4a ge3stak ges4tan ge3st6e ge4s3ter ges3th ges6tier ge4s3tur ge3t2a ge4tang ge4tant g1etap ge2thi ge5trei ge5tri ge5t4u 2g1e1ul ge3unk ge1urt ge3u4t 4g1e2x 2g5f4 gfi2l 2g1g gga4t g5ge gge2ne gg2l g3gla g3glo g2g3n gg4r ggs2 2g1h 4gh. gh2a 3ghale gh2e 3g2het 3g2hie gh1l 3gh2r ghs4 gh3sc g2hu gh1w gi3alo gich2 gicht1 gie3g gi2e1i gi2e3l giel2a gie5n2e gi4eno gie3res gie1st gift5s gi2gu gi2kel 2g1ill gi2me. gi4mes gi2met 2gimp 2gin2d gi3ne 2g1inf 2gin4h 2g1ins gin2sa 2g3int 2gin2v gi2ob 2giok 2g3isel git2a gitt4e gi3tu gi4us 2g1j 4g5k4 gl2 4gl. 4g1lab 2g1lac 2gladu 2g1lag 2g1lam 2gland gla2s1c glas3t4 3g2laub 2g1lauf 2gländ 2gläuf gl3b g2l4e 2g3le. 3glea 2g3leb g3lec 4g3led g3lee 2g3leg 2gleh g4leic 4g3lein gleiter8s glei4t5r g3len 4glenk 4g3ler glerei4 2gles 3gles. g3lese g2lia 2glib 3g2lid 3g2lie 4g3lieb 2glif g2lik 4glil g2lim 2glin g2lio 2glis g2lit g3lite g2liz g3lize g2loa g2lob g2loc 2g3loch g2lok g2lom g2lop 2glorb 2glos g2lot 2glöch 2glös 2glöw 2gls g1lu 2g3luf 2gluk 2g3lun g2lut 3g2lü g3lüg 2glw 3g2ly 2g1m2 gmen4tr gmi2s g1n 2gn. g2n2a g4na. 2gnac g4nad 2g5nah gn4al gna4l3er3 2gnanl 3g2nä 2gnb 2gnc 2gnd gn2e g3neh 2gn3ent gne2tr gneu1 2gnf 2gng 2gnh g2nie g2nif g4nin 2gnint 2gni4s3 gnise2 2gnk 2gnl 2gnm g2no 3g4non gno1r g3not 2gnp 2gnr 2gns 2gnt 2gnu 3g2num. g2nü 2gnv 2gnw g2ny 2gnz go4a goa3li g1ob gobe3l 2gobj g2ob2l gob2s 2g1o2f 2gog 2g1oh2 goh3ren go1i gol2a gol2da gol2fr 3gon. go4nat gon2e 3gons 3g2opa gopf4 go2pos 2gopt gor2a 2g1ord 2g1org go2si go2s3p go1ste 2g1osz go3t2h got6terb got6t5erg gotte4s 3gou go1y gö2f g1öl 3göt 2g3p4 2g1q g2r4 g4rab gra2ba gra2bi gra4bl 2g3radl 2g3rah 2g3rak gram1 grammen6 gram8m7end gram6mer g3rand. 2gra2r grar1e gra4s3a gra4sh gra4sp gra2st 2g3raub grau3f 2graum grau3sk 2gräd gräs1c g3räu 2g5re. g4reb 2g3rec g3rede g4re2e 2g3ref gre2fr 2grege 2g3reic grei4fr 2g3reih g3rein g3reit 3g4rem 3gren 4g3renn gre3no gren6z5ei grenz3w g4rer 2grese gres6ser6 g3ret g3rev 2g3ric gri2e 2g3riem g3riese 2grig gril4la 4g3ring 4g3rinn gro2b3a gro3ber gro2bl gro2b3r 2groc 2groh 2g3rol 2g3rose g4ross gros6sel g4rot 2gröh 2gruf. g4ruft 2g3ruh g3rui 2g3rum grun2g 3grup 3grus 3gruß 2g3rut 2g3rüc 4g2s1 gs3a2b g4sac g5sack gsa2d gs3a2k g3sal g4s3alb g4sall g4salm g4salt gs2am g4s3ama gs3amb g4s3amp gs3a4p gs3a2r g3sat gsau2g gsau4r gsa2v g3säu g3s2c g4sca g4s3ce gsch4 g4schef gs4chi g4sco gse2 gs2e3h gs4eil gse4kl g3sel. g4sela g3seln gs3em gsen1 g4s3ent g4s3er g3sere gser1i g4se4s gse4t g4seu gsfi2l gsgene4 gs3ha gsi2d gs3i2k g3sil gs3io g4s3ita gs2ki1e gs3kr gso2 g4s3o4b g3sol gs4on g4s3op g5s4orge gs4pant g4s3pas g3spei g3s2pek g3s2pi g5s6pie g4s3pl g5s6port. g4s3pru gsrat4 gsrü2c gs3s4 gs3ta g3s4tad g4stag g3s4tan g4stanz g3star gs4tati gs3tä g3steh g3s4tein g3st2el gs4tell gste2r gst3err g1steu gs2thy g3stif g3stil g3stim g3stir g3sto g4stoch g4stod g4stor gs3tö gs4tör gs3tr gst4ra gs4tras gs4trat gst5reit gst4res g4streu gst3rit gst3ros g3stun gs3tü gs3un g3sy 2g1t g3te gtei3s gt1h gt2hy gt2i gti2m g3to gt4r gt4s g3tü gu4ale gu3am gu1an. gu1ant gu1as gu1c gu4d3r gu2e 2gued guet4 2g1u2f 2g1uh gu3ins gu1is gum2e 3gumm gummi1 gun2e 2g1unf gunge2 4gungew 2gungl 2g1u2ni 2g3unk 2gunr gun2s 2gunt 3gur gure4 4g1url gur2t3h gur2tr gurt3s guru1 gu2s gu4s3a gu3sc guschi5 gu3se guss1o gus2sp gus2st gu4st gust3a4b gus3te gus6t5en6d gus6terl gus4tr gu2t gut1a gut3er4h gut1h gut2s3p 2güb 3gür3 gü2s3 2g1v 2g1w gy3n gy4na 2g3z2 gzeu4gi 2ha. hab2a hab2e h3abf hab2i h1ablu 2habn h1a2br h1abs 2habw ha4ch3en ha2cho hacks4 2hada ha2del hade2n h1adle h1a2dr ha3dri 2hae ha3el ha4far haf2e h1affä haf3f4l h2aft haf4to haf2tr haf4tre haft4s3p hag2a h2agg h1ah ha3ha h2ahs h2ai 3hai. h2aj 2haka ha1kl 2h2al. ha3l2al halan4c h1a2lar ha2lau hal2ba hal4bel hal4bin hal2b3r hal2bu 2hale 2halh hal2i hal2l1a hal6lere haller6f hal6lerg ha3lo 4halp hal4sk hal2sp hal4tal hal4tei hal2t3r hamot4 2h1amt h2an. 2hana ha2nal ha2nan han2au 2hanb h2anbe h2and han2da han4d3er han2d3r hand3s ha2nem han2f1 han6g5end han4gro han2k1 2hanl 2hano 2hanr h1ansc 2hanz 2h1ap 3h2ape ha2pl ha2po ha2pr h2a3ra ha4rab 2harb 2harc h2ard har2fr h1arm. har3ma h2arme har4me. har4ne ha2rom 2hars hart4e har2th h1arti har4tr har2za h2as 2has. 2ha3sa has4c has2h3 has4sa hasser4 has4s3t ha2str h1a2ß ha2ta hat2i h3atl ha2t3r 2hats hat5t2 h3attr h1audi h1aufb hau5f6lie hau3f4lo 2h1aufm h1aufs h3au3g2 h1aukt hau2sa hau4san hau2s1c h2ause hau4sel hau6s5ent hau4spa hau4spe haussen6 hau4sur hau2t1a hau4t3r ha2ve. häde2 h1äff 2häi hä2kl 2härz hä6s5chen 2h1äst 2häug häu2s1c hä3usp 2h3b4 hba4ras hber2e 2h1c 2h3d2 hdan2 2hea he2ad he3be heb3eis he2b3l he3br he3bu he3ch2e he3chi he1cho h3echs he3cke hed2g he2dit he1e4m hee2n hee2s he1e2t h2ef. he2fan he2fau he2f1ei he3f2em hef3erm 2heff he2fid he4f3in4g he2f5le 2hefr hef4ra he2fre 3heft he2fu he3gu he2hel hei4a h4eib h1eie h1eif h1eig he2im hei4mal hei4man hei4mar hei4mei heim3p hei4mu 2hein hei4na heine2 hei4n3eb hei6nene hei4n3er h3eintr 2heio 2he1ism he1ist h2eit heit4s3 h1eiw hekt3a he2la he3lag hel1an hel3au hel1ec he2lek h3elem he2len h2elf he3li hell2a hel4l3au hel4mei he3lo he4lof hel2or he2lö 4helt h4em. 2hema hem2b 1hemd 2heme2 h2e3m2i he4mia h3e4miss 1hemm 2h3emp h2en. he4n3a2 he2nä hen3ebe henen1 hen3end he4nene he4nens hen3erg he4nerm he2n1e4t 2henga hen4gag hen4kan hen4kau 2heno heno3t hen4sem henst2 hen3str hent2a hen3te hen4ter hen5tr hen4tri h1ents 2h3entw h3entz he4n3u hen3z2 2he2o he3on he3op he3pa he3ph h1e2pi hept2 h2er. her3a2b he2rad 2herap he4r3a2r herau2 herb2 he2r1e2b he4reck her4eif 4he3reig he6reis. her7eises he2rel he4rene he6rersc he4rerw h1erfo her4fol 6hergebn 2herif herin4d herin4f he6rin6nu herin4s h1erke her4klä h5er6kran h6erlad 2herm he3ro he4r3o2b he4rof he4rop he4rot h1erör hert4 her3th her3um her4zap her6zeng h3erzeu her2z1w he3s4a 2hese he3si he3s2p hes6tä he2tap he3tä heter2 he3th het2i he3t4s he2u heu3g he3unt 3heusc he3x he1x2a 2hexp hey2 he1ye 1hè 2h3f4 hfaller6 hfan2 hfel2l3 hfi2s hflei2 2h3g4 hga2s1 2h1h2 hhoh2 4hi. 2hia hi2ar h1iat 2hic hi1ce hich6t5er hicht6sp hi3d hid4e hi4dio 2hido hi2e hi3ens hie4rei hier3i hie4rin hiers2 hif3f4r hi2k3r hi2l3a4 hile3n2 hil2fr h2im 2hima h3i4mit h4imm h3impe hi2n hi3nak hi3nam hi3nap hi5n2as h2inde hine2i hi3nel hin2en5 h1inf h1inh 2hi3n2i hin3n2 hi3n2o hin3s2 hin2t1a 2hio hi3ob hi4on hi2p3 hi4pl hips2 hi4pu hi2r hi3ra 2hi3re hi3ri hir2m1a hir2mi hirn1 hir4ner hir2s 1hirt 2his. his2a hi4se h1i2so hi3tac hi2tan hi2tel hi1th hi3t2i hit1r hi2tro hit3z2e hi2v1o 2h1j 2h1k4 hkamp2 h2keu hki2n1 h3kö 2hl h4laf hl2ag hla2gr hlan4d3a hl1ans hl1anz h1las h1lat h1laut h1lay h3läche h1läs h1läu hlb4 hl3d4 h3le. hle3a h3leb h3led hle3e h2leis h3leist hl1el h5len. hle4nas hlenen3 hl2enn h4l3entr h4lents hl2enz h3ler hle2r3a hl4ere h2lerg hler4hö hl2erk h6l3er4nä hle3run hl1erw h4lerz h3les h4lesi h4leud hlf4 hlg4 h2lie h3lied h2lif h2lim hl1ind hling4s3 h2lip h2lis h2lit1 hl3l2 hl3m2 h2lo hl1ob h3loc hl1o2f h3log h4lor hlo2ra h3los. h3losi h4loss hlos4st h2lös hl4sar hl2ser hl3ska hl3s2lo hl5s6tern hls3tie hl5str hl2su hl3t2 h3luf h3luk h3lumpe h1lüf hlz2 2h1m hm2a hm3abl h3mad h3mag h3mak h3man h2mant h3mar h4m3arc h3mä h4mäc h4mäh h4mäl hm2e h3me. h3med hme1e4 hmeer4s h3mein h3meld hme3le h3men hmen2s hme4ran hme4rei hme1s2t h3mex hmi2e h3mind h3mini h3minz h3mirr h2mo h3mop h3mot h3m2ö h4möl hm3p2 hm2s hm3sa hms1p h2mu h3mul hmut4s 2hn h2na hna2c h3nag h3nam h4nar hn3a2te h4natt h3nau. h2nä hn1äh h3näs hn3d4 hn2e hne3b hne2e3 hn3eff hn3eig hn3ein h2nel hne4n hn4eng hne4pf h3ner hner4de hner3ei h4n3e2ro h4n3ersa hn3ex hn3f4 hnflei4 hnhof8stras h2nic h2nid h2nie hn1im hn1in h2nip hni4sa hnk4 hnno2 h2no2r hnra2 hn3sa hn3s2p hnst2 hns4to hnsuch4 hnts2 h2nul h2n1unf hn3z2 ho4ar ho3bern ho2b3l ho2ch3 ho4cha hoche2 ho2cka ho6ckerl hock3t 2hod 2ho2e hoe3n ho3er ho2f1a2 ho2fä ho2fed ho2feu hof3f4a ho2f3l ho2f1o ho2f3r ho2fu 2hoi ho2l1a2 hol3ar 1hole ho2l1ei ho2lem hol3g4 hol3k holl4 hol3s 2holy h3olym 1holz hol6zene hom2e ho2me. ho2mec ho2med h2on hon2er ho1on hoo2r 2hop ho1ra h1o2r2an ho2rau h1or3d 2hore ho4rens ho3ret 2h1org hor3ta hor4ter h1ortu h2os. hose2 ho2sei ho3sl ho4sla ho2sp ho3spr ho4ßene 2hot. ho3th 2hotr 2hot3s2 1hou hou4s 2ho2w1 h1ox ho1y2 1h2ö 2hö. hö2c hö3ck 5höhe 2hö2s1 h3öst 2h3p4 h1q 2hr hra2b hr3a2c hr3ad hr1a2g h1r4ah h1rai h1rane hr3ap h3räu hrb4 hr1c hr3d h2rec h3r2ech h3red h3ref hr3eff h2r1eh h4rei. hrei4ba hrei4br h3reic h3reif h4r3eig hr4eini h4reinl hrei3th hreli1 h3rep hrer6geb hr2erh hr2erk h4rerla h6rer6leb hr2erm hrer3s hrer4sa hr2erw hr2erz h3re2s3 hress2 hrest2 hre2t h2r1eta h2r1eu h2rev hrg2 h2ri h3ric h4rick hri4e h3riesl h3rin h4r1ind hr1int h4rist h5ritter hr3l hr3m2 h3rog h3roh h1ro2l h4romat h4rome h4romi h4romo h4ron h1ropa hro4r h3rou h3rö2s hrr4 hr4s1ac hr4s3and hr3schl hr2s1em hr2sen hr2s1er hr2set hr4sh hr2sin hrs3k hrs3l hr4s1of hrst2 hr2su hr2tab hr2tan hr2te2l hr2th hr2top hrt3ric hrt2s h3ruh hr1ums h3rut h3rü h4rüb h4ry hrz2 4hs h4s3acht h2s1a2d h2s1alk h2sall h4samt h2san hs3and h2s1as h2sath h2sato h2saud h4s3aur h2saut h2säh h2säug h4schan hs2cr h2s3ec hse4e h4s1ehr h2s1eie h4seind h6seinst h3sele hse4lin hs1emi h4sendw hsen5erg h2s1ent h2s1erf hs1erg h2serh h4serkl h2s1erl hs1ern h4sernä hs4erne h2serö h2s1erw h2serz h2sex h3s2ext hsha2k h2s1i2d hs2im h2s1ing h3s4inni h4s3ita hs2kal h3skand hs1of h2sop hs1org h2spac h4s3pani h2s1par h2s1pat h3spec h3spei h3sperb h2sph h3spoi h2sprä h2spro hss4 h1st2a hs3tabl h3stad h2staf hst3alt h3stan hst3arb h2s3tau h2s3täu h1stec h1stei h1stel h4stele h3s4terb h3s4tern h1s2ti h2stit h1sto h2stol h2stor h1str h4s3treu hstro2 hs3tum h1stun h1stü h2s1u hs2ung 4h1t ht1a h2tab hta2bl h2ta2d ht2ag ht4akt. ht4akte h2tall h4talo h2talp h2talt h4ta2m h2ta2n ht3ane ht2ank h2tap h2ta2r ht2a2s h2t3asi h2tasy h2t3at h3tat. h3tate h2tau h3taum h4tax ht1ä h2tär ht3e4ber ht1e2c hte3cha h2t1e2d ht1eff ht1e2he h2teif h2t1eig h4t3eilz h2t1eim ht1ein h2t1eis h2t1eke h4t3elas hte6l5ei. h4telek h4t3elfe h4t3elit hte4m h2t1emi h2temp h4tenga h4t3engl h4t3enta h4tentf h4tents hter6de. hterer6s ht3erfo ht3erfü h6terfül h6tergeb ht3ergr hter6gri ht1erh hter6häl hter8höhu h6terleb h6t5erleu h6terneu ht5erspa hter8spar ht3erst h6tersta hter6tra ht3erwä ht3erze h4t1e2se h4t1ess h2teta hte4th h2t1eu h4textr h2t1h h4thei h3thera h3thes h4tho h2t1i2d h2t1im h2t1i6n3 ht3ine h2t1is hti5t2 htni2 h2t1ob hto4d1 h2t1o2f h4t3oly h2tope h4tord ht3rak h3tran ht3rand h4t3ras ht6rates ht3rau h4traub ht6raume ht3rec h5treck ht3rei h2t3res ht3ric h4t3rieg h4t3rin h2t3rol h2t3ros ht3röm ht3ru h2t3rü h4ts ht2sah ht2sal ht4s3a4n ht2scr ht4sein ht2sel ht4s3end ht4seng htse2r1 ht4s3eri htsha2 ht3s4hak hts3kr ht2s1o ht2sp hts3par hts3tät hts4tie hts5trau ht4s3tur ht4s3tür ht2su htt4 htti2 h3tub htu2e h2t1urs h3tü ht3z2 hu2b1a hu2b1ei hu4bel hu2b1en2 hu2bi hu2b3l hu4b5r hu2bu hu1c hu2fa hu2h3a hu2h1i h1uhr h1uhu hu2kä hu2k1in huko1 huk3t4 hu2l3a2 hu4lab hu2lä hule2 hu2l1eb hu2l1ei hu2lem hu4l3eng hu4lent hu2l1er hu2let hu2lid hu2l1in hul3l2 hu2lo hu2lö hul3s2 hu3m2a h1umh h1ums hu2n h1una hun3d2e hunde3i hunde3s hun2e 2hunf hung2 hun3ge hung4s hungsa4 h1uni h1unm 2hunt h1ups 2hur hur3g2 hur2t3h hu3sa hu2so hus2s3a hus3se hus4ser4 hus2s1o hus2sp hus2st hu2tab hu2ti hu2t1o hu2t3r hut2t hut3te hut4zen hut4z3er hut2zu h2ü h3über h4übs h3übu hüf2 hüft1 hühne4 hüs3 2h1v hvil2 2hw2 h2wall hwe1c h1weib h1weih hweins3 hwein6sa h2wirr 1hyd4 hy3dr hy2lor 1hymn h1yo hy3os 1hyp hy2pe. 2hy2t 2h1z hz2a h3z2o hzug4 h3z2w i3ad. iad2a i1adn ia3do iaf4l i2ago ia1h2 i1ai i3ak. i3ake ia2kei ia2kr i1akt i1al ia2l1a2 ial3ar ial3as ia2lä ial3b4 ial3d4 i3aleb i3alef i3alei ia3lek i3alel i3aleng i3alent i3alerb i3aler4f i3alerh i3a4lerm i3a2l1et i3alex i3a2lia i3alim i3a2lin i3al3l ial4ler iall2i i2alo ia2lon ia2lop ia2l1o2r ial3p ial3t2 ia2l3u4 ial3z2 i3am. ia3ma iampe4 i1ams i1an. i1an2a ia2nal ian3alt ia2nau i1anc i3and2 i3a2n1e2b ian2er i1ann i1ans ian2s1p i3ant i3anz ianza4 ia1o ia2op ia3p ia1q i1ar i3ar. ia2ra i2are iar3r i1as i3as. ia3sh i2asi ia3s2p ias3s iast4 i3at. i3at2h i4athe 1iatr i3ats i3au ia3un i2az 2iä i1ä2m i1äp iär2 i1är. iär3m i1ärs iär3z i1ät i3ä4tem iä2ti iä4tr iät5s4 i1äv 4i1b ib1art i2b1auf i2b1aus i2baut ib2bli i2b1eig i2b1eis ibe4n1 i6ber6geb i4b3er4la ibe1ro i2bim i2b1in i2blad i2bleu i3blu i3b2o i2bö i2b3rau ib3ric i2b3roc ib2ser ib4ste ib2un i2b3unk i2b3unt ibus1c 2ic i3ca ic1c ice1 ich1a2 ich6art. ich1ä i1che ich1ei ich2er icherin5 i1chi ich1l ich3le ich3li i3ch6lo ich5m ich3n i1cho ich3ort i2ch3r ich6sele ich2s1i ich4spe ich6stie ich2tr i1chu ich1w i1ci i3cke ickt2 i1cl ic3la ic3ra i3cu i1d 2ida id2ab i3d2ac id4al id1a2n i3d2ans i3d4at id1au id2ax idä1 id2e 2i3de. i2dea 1idee id3eis 2idel idel4ä i4demul 4i3den. ide4n1o iden4se ide3ran iderin8nu ide1rö ider6reg 2i3des ide5sa ide3so ides2p 1i2di2o idi4on i4diot 2idk idni3 id2o i2dol 2idoo i2dö i2d3r id4rä id4rit id4ro id4ru id2s1p idt4 1i2dy ie3a2 ie2bä ie2bl ieb3re ie2bri ie4b3rü ieb4sto ie1c ie2cho iech3t ie2ck ie2d3an ie3de ie2dr ie1e2 ief3akt ie2f1an ie2far ie2fau ie2fäh iefe2m ief3f4 ief2i ie2f3l ie4fonk ief1r ie2fro ie2gl ieg5li ie3g4n ie2g3re ieg4s5c ieg4se ieg4si ieg4st ie3her ie2h1in ieh3r2 i1ei ie1ind i2e2l1a iela2r ie2läs iel3d4 i2ele ie4l1e2b iel1ec iel3eid ie2lek i4elen ie4lene ie4leng ieler4e ieler6fi ieler8geb ieler6ke ieler6la ieler8lebn iel4erw ieles2 i2eli ieli2d i1ell2 ie2lo2b ie2lop ie6lor i2els2 iel3sz ielt2 iem2e iemis2 i1en i3en. i3ena ien1ag ien4am ie4nas i3enä i3end i2ene ien1eb i3enec i3e2n1e4k iener6fo ien3er4g iener6la i3enex i3enf i3eng4 ienge4f ienge4z i3enh ie2nid ie2nim ie4n3in i3enj i3enk i3enla i3enle i3enm i3enn i3e2no i3enö i3enp i3enr ien2s i3ens. i3ensa i3en3sc i3en3s2e ien3si ien3s2k i3en3s2p iens6t5er ienst5rä i3en3sz ien4t3ar i3enth ien3tr i3enty ie3nu ie4num i3env i3enw i3enz ie1o4 ier3a ie2ra2d ie2rap ierb4 i3erbun ier3d i2ere ie4reck iere5ins ie4r3eis ie3r2er ierer3k ie4r3erz ierf4 ierg4 i1ergi i4eri ierk2 i1ern i3ern. iern2a i2erni ie2rö ier4re. ier4s3eh ier3sei iers2t ier3sta ier3ste ier3te iert2i ier3z2 2ies ie2san i2esc i2ese iesen3s4 ie3s4pa ies2pe ie2spu ies6ser6g ies6serl ies2st iest6e ie4stin ie1str ie3su ie4t1ag ie2t1ak ie2tan ie2t1ap ie2tat ie2tau ie4tent ie4t3erh ie4t3ert i4ethe iet3her ie2t1ho ie2thy ie4tob ie2t1ö4s ie2t3ri ie2t3ru iet2se i1ett iet3zw ieu2e ie1un ie2w3u i1e2x 2if if3ange if1ar i2f3arm if4at i2f1au if1än i2fec i2f1ef ife4i if1ein if2e4n i2f1erg if1erh if2far if2f3l if2fro iff2s iff4ste if3l if1lac if4lä iflo4 if4los i1flü if3r i1fre i2freg if4rev if2s if3sa if3se if3sp if3sta if2t3a if2ted if2t3ef if4t1ei if2te2l if2tep if4terk ifte2s if4t3esc if4th if2t1op if2t1r if4t3ri ift3sp ifts2t ift3sz if2tur i1fy 2i1g i2ganb i2garb ig1art iga1s i2g3att igd2 i6gebrau i4gefar ige4füg 3i2gel. ige5lau i2geln ige4me ige4mis ige4na ige6nene ige4nid ige2o ige2pa ige2ra ig5erwer ig1erz iger4ze ige4sel i2g1ess ige4tra ige4tre ige4woh i2gim i2gl ig1lau i3glä i3gle ig3lim ig4na i4gnä i3g4neu ig4no igo1p ig3rad i2g3re ig4ren i2grou ig3s2ag ig4sal ig3sä ig4schr ig3s2o ig3sp ig4spa ig3stei ig4sti ig4s3to ig3str ig6stras ig3s4tü igung4 2i1h i2har i3he ihe1e ih1elt ihe4n ihe3u ih3m ih3n ih3r2 ihs2 ih1um. ih1w ii2 ii3a4 i1ie i3ig i1im i3in i1i4s i2is. ii3t i1it. i1j 1i2js 2i1k ika2ge ik1aka ikaken3 i2k1akt ik3amt i2k1ang i6kantei ikanten8n ik1art ik3att i2k1au i3kaz ik1äh i2kär 4ike i2keb ik1ebe ike2c i2k1ed i2k1ef i2k1ei ike4l1 ike2n1 ik1en2s ik1ent ike2ra i2k1e4r2e i2k1er2f i5kerfam i2k1er2h i2ker2l i2kero i2ke3ru i2k1eta 4iki i3ki. ik1i2d i3kie ik1in i2kins iki1s i2k3l ik4län i3k4leri i3k4let ik4lim i3klu i2kne ik3nu iko3be i2k1off iko1p2 ik1or iko2ri iko1s i2köl ik3rä ik3re i2kres ik4ris i3kro i2krö iks2 ik3sa ik3ste ik3sz ikt3erk ik4t3esk ik2t3re ikt2u i2k1uh i2kup i3kus i2kü i1la i2lab i2l1ac i2l1ak il1a2ma il1ang i2l1anm i2lano il1ans ilan6zer i2larb il1asp i2l1au i3laub i3l4aufb i1lä1 i2lär 2ilb ilb4l il2c il5chen il2da il2dä ild3ebe il4d3en4t il3der ild4erp ilde2s ildi2 ild1o il2dor il2dr 4ile il1e2c il1ein il1el i2lemb i2l1e2mi il1ent i4lentl i4lents i2l1erd iler4ei i6lereig il1erf iler4fo i2ler2g i2l1er2h i4ler4kl il1err i4lerri i3l2erz ile4th il1ex ilf2 ilfe3s il2f3l il2f3re ilf4s3 il2gl 2ilh 2ili ili3e4n3 iliga2 ili4g3ab ilik4 i2l1ind i4l3init il1ins i2l1ip ili1pf il3la ill2an il4lenn il3l2er 1illu il2mak il2m1ap il2m1au ilm1ei il2min il2mor 2ilo il1ob il2oh il2op i2l1o2r i3lou i3lov il1ox ils3ent ils4to ilt2 il3th i1lu i2lum ilung4 i2l1ur i3lus ilü4 2ilv4 il2zar il2zau ilz3erk il2zwa imad2 ima1i im2al i2m3anh im1ans i2marc im3aren i2m1arm i2m1art im2as im4at ima2tr imat5sc ima4tur im1aus i2maut im3b 1imbi i2meg im1ein i2mej i2mek i2mele i2melf im2en i2m1er2f i2m1er2l i2m1er2z i4me3sh imes3s i2meti i2mew imhau2 i2mid im1i2de i2mim i2m1ind i2minf i2m1ins im2mä im2mei immen1 imm3ent im6menth 1immo im2mor 2imo i2m1ob i2mo2p imo3re i2mö 1imp imp2fa im3pf2o imp2s im3pse im4set im3sph 2imt imt2e im3t2i imt3s2 imtu2 4imu im2um im1urk 2in. ina2be in3abu in1a2c i4nack in1ad i3nald inaler4 ina6lere in2alp i2n1am in2an in3an. in3ana in3ann i2narb in3att i2n3au2 2inä i2n1äh in2är in1äs 2ind. inda2 ind2ac in2dal in2dan 2indä 2inde. 2inden ind5erke inder3t inde3sp 1index ind2i 1indik in3dö 2indr ind3se 1indus in3d2ü 2ine in1e2c i3nee i2neff in4elen ine2n1 ine3nä i4nen4zy i5ner. i4n3erbi in4erha i4ner4he i3nerk i3n3erle i6ner6leb iner4lö i4n3er4tr i3nes i4nesk in2et in1eu ine3un in3f4 1infek 1infiz 1info 2inga in2g1af in2g1ag in2g1al in2gam ing1ar 2ingä 3ingeni in3g2er in4g3er4w inges4 2in2gl in3gla in3glä ing4s3am ings6por 1inhab 2inhar 2inhau 2inhe 2ini. in2id ini3de 2inie 2inig inig2a ini3k4r 2inis ini3se init2 i3nitz 3inkarn 1inkas inkels6t in4k3ent ink4er in2kro in3k2ü inma4le 2inn. inne4n in4ner4m 2innl in2nor 1innta 2ino in1od ino3e4 in3ols in1or ino1s i3no3t i2n1ou i1nö in1ö2d 2inr 2ins. ins2am in6samt. insch2 2inse. in2seb 2insed 2insen 2insk in3sof 3instal in4s3tät 4inst2e in3s4tip 3instit ins4to 4instra in4strü 1insuf ins3umz in2sur in3sz 2inta 2inte. 1integ in3tei 2intep 2int2h inthi1 int2o 2intö 2in3t4r 4inträ in5tri 3intrig int3s i2n1u i4nuh in3unz 4inverm invil2 i1ny2 in3z2e inzel8ler in3z2i in3z2sc inz2u in3zw i1ñ 2i1o iob2l io1c io2d io3da io3e4 i2of iof4l i2oh io1i io3k6r i3ol. i3ols i3om. io3me i3oms ion2 i3on. ion3an io2n3au ion3d2 io4nee i3ono io2nor i3ons3 ion4sa ion4sen i2ony i2oo i2o1p i3o4pf i3opt i2or i3or. i3orc ior2e iore4n io1r2h i3orp i3ors i3ort 4ios i3os. io3sh ios2p i2o1st ios2u i2o3sz io3t i3ot. iote3l iot4r i3ots i2ou i2ov i3ox i2oz i3oz. i1ö2k i1ön i1ös. i1öst i1pa ip2an i1pe i3ped i3per 2ipf2 i3pfan ipfe2 iph2 2i1pi ipi3a ipi3el ipi3en ip4lu ip2pan ip3pe ipp1f ip4pl ip3pu i1pr ip2sa ip2sei ip2sp ips3t ip4sta ip4stü ipt2a ipt2i ipt2u 2ipu 2i1q i1r4a i3ra. 2i3rad i3ras irat4 i1rä ir1äh ir2b3l ir1c ir2ch1o ir4e i3ree 2irek ire4na i3ré irg4 ir2he ir2i 2i5rig 2irk irke4n ir4kene ir2k3l irk4s3c ir3k2u irli4n ir2m1ag ir2mak irm1au ir2mä ir2m1ei irme4n1 ir2m1o2 irm4th ir2mum ir4munt 2irn ir2n3a ir4nat ir2no i3ro i1rö irpla2 irre4l ir2rh ir3sche ir4schl ir4schm ir4sch3r ir4sch3w ir3se3 ir3s2h ir2st irt2s3t 2iru ir1u2m iru2s1 i3r2ü i2sac isa2m3 i4samp i4s1amt is2ap isa2r is3are i3sat is3att i2sau is3auf isau2g i2säh i2s1än 2isb i2sca i4schar i3s2che i4schef i4sch3e4h isch3ei ische4m i6schemi i6scher6z i4schin i5sching i2sch3l i2schm isch3ma i4schna i4sch3re isch3ru i3schu i4schüb i4schwa i6schwir i4schwo isch3wu i4schwü i2scr 2ise ise3a ise1e iseh2a ise3hi is4eind is4eli i6sel6ter ise2n1 ise4na is2end i4senho isen3s ise4r3ei is1erg i2serh iser4he i2s1erm i2s1es4s i3s2et i4s3etat i3s2eu 2isf 4ish 2isi isi2a i2s1i2d isi4de isik2 i2sim isin3g4 isi1s i4ski i4sku is3la 3islam 2isma 2ismi ismu2 is1of i3soh 1i2sol 2is4o2n1 isonen4 iso6nend isono2 i2sop is1ort 3isot i2s1ou 2isp is1pa i2spar is2pat is1pe is1pic is2por i2spro is3sa is4s1ac is4sau is6s5chen isser4f iss2po is2st is3sta is3sto iss3tr is3strä is3stu is2sum is4tab ist3a2c ist2an is3tang i1stat is3täu ist4e i1stel iste4n istes3 i1steu i1stil istin4f is3t6o is4toc is3tör is3tr ist4ra is4tro is4tru i1stü i3suf isu2m isum3p i2sü 2isy i1ß ißer2s iß3ersc it1ab. it1abs ital1a it1alt it1am ita3ne it3anr it1app it1a2re it1art i3tat it1au i3tauc i2taut 4itä it1änd i2t1äs ität2 it1eff i2t1ei it2eic 2itel ite4l1a i4telek i2t1emi i2temp ite2n iten3s2 i4tents i2tepo i6tereig i4t3er4fo iterin6d iter6klä it2erö i8t7ersche i4t1esk i2t1ex i3text i5thr i2thy i5tic i2t1id i5tig 1itii it1in1 i3tis i4tiso iti3sp iti2v5a it5le itmen2 4ito it1ob i5toc ito3d i2t1of ito2p it2os 4itr i2t3rad i3tradi it3raf it3ras it3rau it3räu it3re i4tren it4ret it3rob it3rom i2t3run it3rut 2its it2sa its1ag it2s1e it4se2h it4s3e2r1 it4sh its1or it6stras it2sur 2itt it2tan it2teb itt3hä it2tob it2top it4tri itt3ric itt6schi itt4se4h itt4sei itt4sor itt2sp itt4sti it1uh it1ums it2ung i2tuns ituran4 it1urg itut4 i3tü 4ity1 ityl2 it2ze2c itz2er itz3erg it6zergr it4z3erl it2zö it2z1w 2i3u2 i4u3l iu4m3 iuma2 ium4se ium4ste iun2 i4up iu4r ius3t i1ü4 2i1v i2v1ad i2v1ak i2v1am iv1an i2v1ä i2veb i2v1ef iv1ei iv1elt ive4n iv1ene i2v1ent i2v1ep ive3re iv1erh iver4kl iv1erl iver3s ive3s i2v1ex i2v1im i2v1ind iv1int i3vol ivo3re i2v1r i2vun i2v1ur i2vü 2i1w 2i1x i2xa ix2em i3xi ixt2 i1y 4i1z iz1a iz2ac i2zag i2zan i2zap i3z2as i2zau i2zä i3ze iz2ei izei3c izeits4 i2zele ize2n i4zener i4zentz i4z1erl izid3 iz1ir izo2f i2zö i2zuna i2z1w i3z2wi í1l j2a jab4 ja1c jah4r3ei jahr2s ja3l jal2a ja3ne jani1 jani3t4 ja5ru jas2o ja1st jat2 2j1d4 jda3 je2a jean2s je2g jek4ta jek4ter jek4tin jekt3o2 jektor4 jek6t3r je3na je2p je3r jer2e jes3t je2t1a je4t3h je2tin je4tor je2t3r jet3s2 jet3t je2t1u2 je3v je3wo ji2v 2j1m joa3 jo2b1 job3r jo2da jo2i jol2a jong2 jo2p3 jo1r2a jor3d2 jo1s4 jo2sc jost2 3jou jou2l 2j1t jty1 j2u ju2b3l jugen6 jugend3 ju1i ju2k jul2i jung3s4 ju3ni ju3r jur4a jur2o jus3t ju3t2e1 2j1v 1ka 3ka. ka3ar 2k1abb kab2bl 2kabd 2k1a2ben 2kabf 2kabg 2kabh 2kabn 2k3a2bo 2k1abs 2k1abt 2kabw 2kabz ka1c kade2r 2k1adm 2k3a2dr 3kadu 2kadv ka1f4l ka1fr kaf3t2 kag2 kaga3 2k1age 3kah ka1ho ka1in kaken2 ka1kl 2k1akt. 2kala. kala3b ka2l1a2d ka2lan kal3d ka4l1eh ka4lens kal3eri 3k2alk kal2k1a kal4kan kal2k3l kall2i 2k1allt ka2lop ka2l1os kal4tex kal4th ka2lu k2amt kan4al ka4n1a2s ka2nau 2kanb kan3d2 2kanda 2kandä kan2e 2kanf 2kanim kank4 2kanl 2kanom 2k1anor 2k1ans k2ans. kan4tar 6k5antenn 2k1anth ka3nu kan2um 2kanw 2k1anzu 2kanzü ka2o1 3kape ka3po 3kara 2karbe 2karc k2ard kar3d2a k1area k2arg ka3r2i kari3es k2ark 2k1arm kar2pf k2ars k2ar3ta k1arti 4kartik karu2 k2arw 3k2asc kas2e kase1i kasi1 kas2o ka4sp ka2s3t 2k1ast. ka4ste kas6tras 3kasu ka3sz ka2tan 3kateg k3atel ka3t2h ka4t3r 2katt4 kau4fer kau2f1o kauf6s5ag kauf4sp kaufs7tem kauf6sti k2aus. 2k1auss kau2st 2kausw kau3t2 2kauto ka3ve 2kaz 1kä käl3 k1ämi 2k1änd kär2 2k1ärg kä2s1c käse3 4k3b4 kbo4n kbu2s kby4 2k3c 2k3d4 ke2ben 2k1e1c ke2di 2k1eff kefi2 kege2 ke2gl ke2he. ke2hen kehrer4 kehr2s kehr4s3o 2k1eic 2k1eig kei2li ke2im 2k1ein kein4du kein4e k1ei1s 2keise keit2 keits1 ke2l1a ke3l2ag ke4l3am ke2lä kelb4 keld4 kel3eis 2ke2lek ke2l1en ke2l1er kel7l4e kell2i ke2l1o2 ke2lö kel3sk kel7s8tern k4elt kelt4e 2k1e2mi 2k1emp k2en. ken1a ken3au ke2nä kend4 ken3dr ke2n1e2b kenen1 ke4nene ke4nens kener4n kene4t 4ken4gag k5en6gel. ke2nim ken3in 4kenlad 4kenläd kenn2a kenn2e ke2no k2ensa 4ken4sem ken3si ken3s2k ken5s6tei ken3sz k3en4te. ken6ten. 2kentf 2kentg ken3th 2kentl 2k1ents 2kentw 2kentz ke3ny k2en3z2 2ke1o2 2kep ke2pl k2er. ke1ra ke2ran ke2rau ke2r1ä ker4ble k2erc 2kerd ke2r1e2b ke2rec ke3reig ker3ein 4kerfah k4erfam ker2fo k3ergeb 2kergu ke6rin6nu kerin6st kerin4t k3erken k2erko k3erlau k3er4leb k6erlebe ker2na ker4nei 4k3er4neu kern5eur k1ero k2e1rod 2keros ker4reg k2ers. 2kersa kert2 ker6werb kerz2 k1erz. ker4zeu 2k1er2zi k2es. ke2sa k2esc k1ese ke2sel kes2sa ke4t1a ket2ag kete4 ke4t1eb ke4tel 2k1e2th ket3ha ke2tu keu6schl 2k1e2va 2k1e2x 4k3f4 2k3g2 kga2s1 kge3s 2k1h4 k3he kho3m k3hu ki1a ki2ad ki2ag ki3ak ki3a2r ki1c ki3d4r k2ids 2kidy ki2el kie4lei kiel3o 2kiern kier2s kier4st kie4z ki1f4l ki1f4r ki3k4 2ki3l2a 2kilä 2kim 3kin. ki2nä 4kindex 2k1indi 2k1indu 2k1inf k2ing kin2ga king3s 2kinh k2ini3 kinik2 k2inn ki3n4o3 kinos2 kin3s 2k1inse k1inst 2k1int ki3or kio4s 3kir 2k1i2so kis2p kis3s kist2 kis4to kiv2 kive4 2kiz 2k3j 2k1k4 kkab4 kl4 4kl. 4kla. 2k1lac klan2 2kland klan3du k4lar k1last k1lauf k3laug 2kläd k2lär k2le 4k3le. kle2br k3leg 2kleh klei2e k3leit k3lem. kle2o 2k3ler kle2ra 2k3leu kle3us 2klic k2lien k2lif 2klig 3k2lim k2lin k3lin. 3k4lina k4link k2lip k2lir k2lisc 2klist klit2s 2k3liz 2k3loc 2klok 3k4lop k3lor klost6 2klöc 2klöf k2löst k4löt k1lu klu4b k2lud k2lug k2lum klung4 2klux 2k1lüc 2kly 2k1m 4kma kma2la k2n2 k4nac 2k5nach 2k3nad 2knah 2k3nam 2k3näp k3ne k4nec kne1e 2knes 2knetz 2k5neu 4kney 2k3niv kno2b3l k4nol 2knorm 2knov 2k3num 1ko ko5ad ko2al kobal2 2kobj kob4s kof3f2 koffe3i kohl2e kohle3i koh3lu koka3 ko3l2a ko3le kol2k3 3kom komer3 4komn ko4mu k2on kone2 ko2nem kon3s4 kont6e ko2nu ko3on 2kop. ko1pe 2koper kopfa2 kop4fen kop6f5err kop3s ko3pte ko3r2a kor2ba kor2bl kor2br 2k1orc korder4 kor6derg ko2rel 2k1org kor2k1a kor3m kor4nac kor2n3ä kor4no2 2korpi k2os k4os. ko4sk ko2sp 3k4ost ko2stü ko4ter ko3ti kot4r kot3s2 kot4tak k1ou ko3un 3kow ko2we 2k1ox 1kö köde2 k2öf k1öl 2k1p2 2k3q k2r2 2k3rad 2k3rah k4ral k3rats 2kraum k4raw k4raz k4räc 2kräd k4rän 2k3räum 2k5re. 2k3reak 2k3real k4reb 2k3rec 2kred. 2k3rede 2kredn 2kredu 2k3ref 2kreg 2k3reic kre1i2e4 kreier4 k3reif 2k3reih 2kreim krei6sei krei4st kreli1 k3ren 2kresu 2k3rh 2krib 2k3ric 2k3ries 2krip k3risi krob4 k4roch 4k3roh k4rok k4ron k4rop 2krot 3kroth k3rou 2kröh 2kruf 2k3run 4k1s ks3a2b ksa2k k4s1amt k2san ks3a2r ksa2s k2sau ksau2f k2sav k2säh k3s2c ksch4 k2s1e2b k2s1ec k3s2ed ks1ei ks2eid ks2eif k4seind kse2le k2s1eng k2s1ent ks1er ks2ere k2serf k2serg k2serk k2serl k2sers k2serw k2s1e2v k2sex ks3ha k4s1i2d ks2im k2s1in k2s1is k3s2ke ks3kl ks1o ks4on k2sop k2so2r k2sö ks1pa k2spal k3s2pat k2spä k3spe ks2pel ks2pen k2sph ks2por ks2pul ks3s4 kst2 k2stal k4s3tanz k3stat4 k3stäl ks4tel ks2tep k4stier k2stit ks4tol k2stor k4strop k2stuc k2stum k2stur k2stüt k2s1u k3sul ks2zen 4k1t kt1abr kt1abs k2t1ad kt1akt k3tal kt1am kt1an kt2and k2t1a2r kta4re kta3ri k2t1au kt3aug ktä3s kt1ein k2tek k4t1ela kte4n1 kten3s2 k2tent k4tentf k4tents kten3z kte2ra kte3ran kt4ere k4t3erfo kt1erg k2t1erh k2terö kte3ru k2tex k2t1h k2t1i2d kti2me kt3ind kt1ing kt1ini kt3inn k2tint kti2s1e k2tiso kti4ter kto3b k2t1of kto5ren. k3t4ran kt3ras k2t3rau k4tref ktro1s kt3run kt3rü kt3s4a kt3sä kt3se kts2el ktsen1 kt3si kts1o kt2sor kt3s2z ktt2 k3tub kt1ums k2tuns k3tü kt3z2 ku2al ku1c kud4r 3kug ku2h 2k1uhr ku3la ku3l2e ku3l2i 4kulp kul4to kul2tr k2um. k2um4e 2kumg 2kuml kum2sa kum2sp k2u3n2a kun3da kund2e kunden3 kung4 kun4s4 kunst3 2kunt 2kunw 4k1up. kur2bl ku2rei kuri2e kuri4er 2k1urk ku2ro kurs1c kur2sp kur2st 2k1urt4 kur3tsc kus3a2r ku4schl ku2sp 2ku2s3t2 ku2su 2kut. kut2a kuto3 1kü kü1c 3küne 3kür kür4s 2k3v 2k1w k3wa 2k3z2 kze3l 3la. la3ar l1ab 3l2ab. lab2a la2bad l2abä 2labb lab2br 2labd lab2e 4la2ben 4labf 2labg 2labh 3labi l3a2bit 2la2b3l 2labn 3lab2o 4labo. la3b4ra lab4res la2bri 2labs la2bus 2labw 2labz la1ce la2ce. l4a3che lachter8f lacks2 1lad 2l1ad2a 2ladd 3laden la3d2i 2ladj 2l1adl 2ladm 2l1a2dr 3l2adu 2laf la2fa la2f1ei la2f1er laf1r laf3s laf3t4 la2fu la2g1a lag3d l2ager lagerin5 4lagg la2gio lag3l la4g3n lago4 la2gob lag3str 2la3ho 3lai lake2 la2kin l2akk la1k4l la2kro lak3t2 2l1al la2la 3lala. 3lali 4lalt lami3t lam2m1a 1lammf la2mor l2amp 2l1amt lamt4s la4mun la2na la3nan la4n4at la4nau 2la2nä 3l2and l4and. lan2da lan4dam land3au l4ande lan6derh lan6d5erw lan6d5erz lan6d5inn l4an2dr lan3dri land3rü lan3erd laner4f 2lanf lan4gan lan6g5esc lang3s4 2lanha l2anhe 3lan2i 4lanl 2l1ann l1ano la2nof 2l1anp 2lans2 l1ansi 2lantr 2lantw 2lanw lan2z1w 3lao 2l1apf la2ph 2l1a2po lap2pl la2r1an 2larc lar1e2b la2r1ei la2rel la4rene larf4 lar3g lar3ini 4l1a2rom l1art 2lart. lart2h l3arti lart4r 3laru l2as. la2sa la4sam la4sä lasche4 4lasd la3seb la2sei la2s1e2l 2lash la2sin la2sis la2so 2la4sp 3lasser l2a2st las4t3an la4ste last3ri la4stu la3t2e 2l3a4tel la5t2i 2l3atl 2latm lat2o la2tö la2t3ra lat4ri lat2s lat3st 2lat2ta lat4tan lat4tex lat4t3in lat2t3r latzer4 1laub. lauben6s5 lau2b3r laub4se lau4fin 2laufn lau2fo lau4fri 1laug lau3gl 2laun. la4us 3l2aus. 2l1ausb lau6scha 2lausd 2l1ausf 2lausg 2lausl 2lausr 2l1auss lau2st 2lausw 2lausz 2lauto lau2tr la3va lave4n 1law lawa4 1l2ax la4xel l2ay lay1s lä1c 3läd 4läf 2l1ähn 2lämt 1länd 2l1äpf 2läq lär2ma l1ärme 2lärz lä2s1c 2lät 2läub 2läuc 2läue 1läuf 2läug 2läx 1là 2l1b l3bac l2bant lb3a2ri lbau1c lb1ärm lbb4 lbby4 lb2ei l4b3eink l4b3eise lbe4ral lberin5 lbe7s l4b1e4ta l2b1id l2b1ins lb4lad l3b2lat l3blä lb3le l2bled l2blic l3blo l3b2lö l3b2lu l2b1o2ra lb3rea lb2s lb3sa lb3se lb3si lb3sp lbs4t lbst3ac lbst3ei lbst1u l2b1uf l3bum lbu4n lbzei2 2l1c l3ca l3che l4chei l4chent l3chi lch3le lch3li l3chlo lch3n lch3r lch3s2 lch3ü lch1w l2ck l3cl l3co 4l1d ld3a2b1 ld2ac ld3a2ck l2daf lda2g l2d1ah lda2i l2d1ak l2d1al l2d3a4n ld1arm ld1ass l2d1au ld3aus l3däm ld1är ld1äs ld1ät l3de. lde4ben l2dei ldein7 l2d1elf l2d1e2mi l2d1ems lde4na lden5erg l4dentl l3der. l4d3er4fa l6der6geb ld1erh l4der4he l3d2erl l6d5erlas l3d2ern l2d1er2p lder4tr lde3sa l2d1es2s l2dex l2d1id ld1i4mi l2d3ion ldo2b ld2on l2dop ldo2r l2d1ori ld2os ldos5t ld2ö2 ld3r ld4ram l2dran l2dre l3d4ris ld4ru l2drüc ld3sa lds4an ld3ska ld3st ldt4 ld3th ldt5s ld3tu l2d1ul l2d1um ldwes4 ldy2 1le le2ad le3ar le2as 3leba leben4s3 le2bl 3lebr le2b3re lebs2 2lec lech1a le2chi lech7t6e le2dr le2er lee4ret le3f2a 2l1eff lef4o le2g1ab leg1as le2gä le2gl leg4r legs4 3leh 4lehe. leh3r2e 4lehs 4leht lei4ble l2eid lei3ere lei4fan lei4fei leifer6g leif3s 2l1eig lei3gl 3leih lei4hau lei3l2 leim3p 3l2ein. l2eind lein4du l4eine lei6nerb le2inf le2ini 2leink 4l3einsa 2leint l2einu le2is leisch5a lei8schei lei6scho lei6sern l1eisf leis6s5er l4eist lei4str lei4ßer l2eit lei2ta lei4to lei5tri leit3s2 leits4t 3leko 2lektr 2lekz 3l2ela le2le le3lei 2lelek 4leleme le3len leler2 leler4s le3les 2lelf. 2l1elfe l2eli l2em. le3mal le2mau le2m1ei 3lemes 3lemet lem1o2 le2mor 2lemp lem3s le2mu le4mun l4en. len1a len3ab le4na2d le4n3an le4n3a4t le2nä 4lendet l1endp 4lendun le2n1ed 4lenerg le4neur 4leneuv len4gag len4kau len4k3lo len4klu l1enni len6sein 4len4sem len3ska len3sz 2lentg 2l1entk 4lentla 2lentn 4l3en4tro 4l3entw lent4wä 5lentwet 2lentz 2lenzy leo2f le1o2s 2lep 3lepf 4l1e2pi 4lepoc 3lepr l2er. l2e1ra le2rag le2r3ap le2ra2s le2rau le2r1ä le2r1e2b ler2e3c l3ereig le4r3ei4m le4r3eis le2rel le4reng le4rerg le4rers le2re4t 4l3erfas 2l1erfo l2erfr l2erfü l1erg l2erga l4ergef 3lergeh 6lergen. l4erger l4erges 3l4ergew 2lergi l2ergl l2ergr 4ler4heb 4lerhol lerin4s lerk2 l2erka 2lerke l1erkl 4lerklä l4erkle l2erko ler3kr ler3l 5l6erlebe 3l4erlei 2lermä ler4nal ler4nar 3l4erne ler4nei 2l1erö 3l2erra ler4ric l4ers. l1ersa lers2t ler4sto lert2 ler4trä le2rup l4erwa ler4wer 2ler2wo 2l1erz ler2zä l3erzeu ler2zo l4es. les2am les2e lese1i 2l1esel le3s4h lesi1 le3s2k les4ki le3so le2spo lest6 le1sta les2te3 lester6i le1sto le1str 3lesu 4lesw 2lesy le2tab 2le2tap 2le2tat l1e2th le3tha 2lethi let2i letsche6 let4top lett1r letts2 le2u 4leue 3le3u2f 2l1eul le3unt 2leuro 3leut l1e2vol 2lex 3lexd 3lexik le2xis 1lé 2l1f l3fah lf4at l2f1ec lfe1e lf3einh l2feis lf2en l4ferei lfe4rel lf1erl l3fi l3f4lä lf3led lf4lö l3f4lu lf3ram lf3res lf4ru lf4rü lf2spe lf2sti lf2su lfun2 lfur1 2l1g l3gas lga3t lgen2a lgene2 lgeräu3 l2geti l3g2i lg2lö l3go lg4p l3gra lg3re l3gro lgung4 2l3h2 4lhe 3lhi. 4lhu 1li li1a lia2b li2ad li4am. lian2g li2ast 3lib4 libi1 li1c lich4ta lich4to 4lick li2cka li2cl li3d2a l1ido l2idy 3lie. liebe4s3 lie2br li1efa 3liefer li1efk li3efl lie4n1a2 li3ene lien3s lien3t lie4rei lier4sp lie2s1c 3lig liga3s li4g3ers li4gl lig4n li3ker lik2o likop4 lik2sp lik4ter lik2ti lik4t1o2 lik2u li3l lil2a li3m2a1 limas4 lima3t4 2limm 3limo 2limp lin2a li3nar 2lindi 2l1indu li2nef li2neh li2nep li2nes 2l1inf 2l1inh li5nie lin1it 2l1inj lin4kan lin4kar link2s li2nol l2insa 4linsel 2linsp 2linst 2linsu 2linsz 2l1int li3n2u 2l1inv 2linz li2o li4om li3o2st 3lipf 3lipt 3lis. li3s2a li3schm li4schu lis2h li3shi 3lisk 2l1isl 2l1i2so li2sp liss4 3list lit4a l1i2tal li3t2ä l2i3t2e 3liter li4t3r lit1s2 lit3se lit3sz li3tu li6tun li4tur litz4er 3liu liv2e li2vea li2ves livi3e li3vr 2lixi li4z3ä lizei3 2l3j 2l1k l3kale lk1alp l3k2an l3kap l3kar. lk1erd lke3r2e lk2l lk3lad l3k4las lk3lic l3k4lu lk2men lk4ne lk5ner lko2f lk1ofe lkor2b1 lk3roc lk2s1 lk3sän lk3si lk4spe lks3t lkt2 lk2ü 4l1l l2labk l2labt l3labu l3lage lla3gl l2l1am lla2ma l3lame ll2ami ll2anb lla4ner l4lani l3lans. ll4anwa ll1anz l4l3appl ll1arm l4latm ll3att ll3aufg ll1aus ll1äm l2lär llb4 llch4 ll3d4 ll5ebene l3lec ll1ech lle3er l2l1ef ll1eic ll1eim ll2eis l4leise lle2la lle2m l2l1emi l3len. lle4na llen3dr ll5en6dun l4lentf l4lents l3lep l3ler. lle2ra ll2ere l6ler6eig ller4fo ller6geb l8lergene l4lergo ll3erho l4l3ermi l4l3ernt ll3ertr ll2es lle4th ll1exe llg4 lli4gan l2limb l2l1ind l4linf ll1ins ll3k4 ll3l2 ll5m2 ll3n2 ll1ob l2lobe l2l1o2f ll3ol l2lope ll1opf ll1or l6lorb llor2g l2lo2ri l2l1ou l3low ll1ox ll2säu ll2s1es ll3ska ll2spr ll3t llt2e llt2i llti2m ll5t4r llts2 ll1ur llus5t6 l3ly ll3z2 2l1m l2m3a2b l2m1ad lm1a2ge lm1aka l2m1a2m l3mana lm1apf lm1art lm3att lm1äst lmbu2 lm1c lmd2 lm3e4dit l2m1ef l2ment l2m1e2p lmer2 l2m1erf l2m1erl l2m1erz l4messa l2m1i2d lm1ind lm1ins l2mof lm1orc lm3p2 lmpf4 lm3s2k lms2t lm3ste lm3s2z lm3t4 l2mum l4munt 2ln ln2ab lna2r ln3are lnd2 l3n2e lnes2s l2n1in lnus2 l1nü l1ny 1lo lo4ak 3lob. l2oba 3lobb lobe2s 2lobj l1o2bl l2obr lob4ri lo4chel l1ofe lo2fen lo4gh lo2gl lo2gor lo2gre lo3ha loh2e 4l1ohr loi4r 3lok 4l3okk lo2k3r 5loks l4ole 2l3o2ly lomä3 lo2min lo2ner lo4nin lo2n1o lo2o 2lopf lop2p1a 2lopt lor3am lor2an lo4rä 5lorb 2l1orc 2l1ord lo3r2en 2l1org2 lori4di 2lort2 l2os. lo4sa 3lose lo4ske lo2spe lo2spr los3t lo4ste lo2st4r 4loß lo2ta lo3tha loti4o 2l1ov lo2ve 2lox 1lö lö2b3 2löck 2löd lö2f 2l3öfe 2l1öhr 2lök 2l1öl3 2löp 3lösc 3lösu 4löß 4löz 2l1p lp2ar lpar2k1 l4p1är lp2f lph4 l3phä l2phir lp1ho l3phr lpt4 l3pu 2l1q 2l3r2 lrau2s lrebs2 lro2h lrö2 4l1s ls3a2b l2s1a2d ls2al l4s1amb l4samp ls2amt l2san ls3ane l3sare ls3a2ri l3sark lsau2 lsau4m lsau4r l3s2äm ls2äug ls1äus ls2c l4schin l4schmü lschs2 l2s1e2b ls2ele ls1eli l2sent ls1er l2serf l2serg l2serh l2serk l2serl l2sers l2serw lse2t ls1eta ls2ext ls3ha l2s1id l2simp ls2kal l3s4kele ls2ky lso4b l2sop l4s3ort. l3s2öl l2spac ls2pe l2s3ph l2s1pir l3s2pit ls2po l3spri ls2pu l3spul ls3s4 lst2a lstab6 ls3tabl ls4taf lstahl3 l2stas l4stat. l4state l4s3täti l2ste l3stea l3stec l3steh l3stei l4steil l3stel l3stemp l4sten ls4t3erk l5s6terne l5s6terns ls2tie l2stit l4stoch ls4toi ls4tol ls4tru l2s3trü ls2tu ls4tüm l3suf ls1um l2s1un ls2und ls3unk 4l1t l2tab lt1abs ltag4 lt1am l4tame ltampe4 l3tan. ltan3d l2t1ap lt1ara ltar8beitn l3tark lt1art ltar6tik l3tartu lt1au l4tauf lt3aut lt1äh ltbau1 lte2c lt1eh l3tehu lt1eig lt1ein lte3mi lt2en lten6gel lten4sp lt3ents lte4ral lter4fa l3t2erg l4terhe lter6ken lter4ku lter4nä lte2ro lt2erö lter4se l4t1es3k lt2est lte3str lt2et l2t1h lt3hag l3thas l4t3hei lthol2 l3t2hu lt1ide ltimo4 l3tine l2tiso l3t2i3t l2t1ob l2t1o2f l4tord l4torg l4t1o2ri lto2w lt1öl lt1ös l4t1öt ltra3l lt3räu lt3rec lt3rei lt3ris lt3rol l2t3rö l2t3rus l4ts lt2se2l lt4s3ort lt2s1pe lt3s2ph lt2sti lt3t l3tub lt1uh l2t1um lturan4 lturen4 ltu2ri l3tü lu1an 4lu2b3 luba2 lubs2 lu2dr lu2ec lu2es lu2et 1lu2f2 2l1ufe 2luff lu3fo luft1a luft3e luf4tei luft3r lu2g1a lu2g1e2b lu2gei lugen1 lu2gi lug3l lu2go lu2g3r lug3sp lu2gu 2l1uh lu1id. lu4ig lu1is. lul2ö 2lumd lume4 2lumf 2lumg 2l1umh 2lumk 2luml l2ump 1lumpe lum2ph 2lumr 2l1ums lu3mu 2l1umw 2lumz 1lu2n 2l1una lund4 2l1unf lung4sc 2l1uni 2lunr 2l1uns 2lunt 2lunw 4luo l2ura lu2r1an lu2rat lu2rei 2lurg l2uri lu2ris l1urn lu2ro 2lurs l1urt lu4ru lu3sak 2luse lu3si lu2sp lus4s3a lus2s1c lus4sel lus4s3er4 lus2s1o lus4s1p lus2s3t lus4stä luss5tr 1lu2st lus6terl lus4t1o2 lust3re lu2s1u lu2t1a4 lu4tas lu4t3au lu2tä lu2t1e4g lu2tel luter2 lu4t3erg luter4s lu6t5ersa lu2thy 2luto lu2tob lu2t1o2f lu2top lu4t1or lu4t3r lut5schl 2lüb 3lübd lück4e2 lücker3 5lüd lüf3te lü2hel lüh1l 2l1v2 lva3 l3vl lv3r 4l3w4 2lx 1ly ly1a2 ly3c ly3es ly1l 2lymp 3lyn ly3no ly1o ly3t ly1u 2l1z l2z1ac l2z1ag l2zan l2z1ap l2zat lz1aus l2zäp l2zär lze2l l2zele l4z3enth l2z1ep l2z1er2h l2zerz l2z1id lzi4m lz1imi lz3l lzo2f l2zö lz3t2 l2z1u4fe lzvol2 lz1w lz2wec l2zwu 1ma 3ma. maa2 m1ab m3a2bar m2abä 2m3abb m2abe 2m3abf 2mabg 2mabh 2mabk m2abli 2mabm ma2br m2a3b4ra 2mabs 2mabt 2mabz ma3chan mach2e mach8terh mach8t7ers mach4tr ma2ci mack2s 2m1act mada2m m2adä ma2del ma3dj 2m1adm 2m1a2d4r ma4d2s mae4 ma1f4 mag2a ma2ge. ma2geb ma2gef ma2geg ma2gek ma2gep ma4ges. ma2get ma2gev ma2gew 2m1agg magi5er. magi5ers ma3gl ma3g4n 2m1ago ma3ha mahl4st ma1ho mai4s3e ma2ke. 2m1akt mal2ag mal1ak ma4lakt ma2lan ma2lau ma2lär 2mal2de m2aldi ma3le ma4leb mal2er ma4lex mali1e mal3lo 2mallt ma2lon ma2lop m2alp mal3t malu4 ma2l3ut 3malv ma2mid mam3m 2m1a2nal ma2nar 2m1a4n4at ma2nau 2m1anä 2manb man2ce 3man3d4 ma2net m2anf mang2 2man3ga m4angel 2m1angr m2anh 3manip 2manl m2anle 3m2ann 2manod 2m1ansa 2mansä man2t1h 2mantr manu3 ma4n1ut 2manw 2manz m1anza ma2or ma2phr ma2po ma1q m2ara 4marag mar2an 2marb mar3g2 3ma1rh ma3r2i m2ark mar2kr 4mar2o maro3d 4marr mar6schl mar6schm mar6schr mar2sp mar2su 2m1arti ma3r2u m1arz 3mas ma3s4a mas2e ma3s2p masse4n3 mas4ta mas4tel mas2ti mas4to mas4tr ma4s3z 3maß ma2ta2b ma2tan ma2tä m3a2tel ma4t3erd ma4t3erz m4atme 2matmo ma2to ma4tort mat3se mat3sp matt4r mat3url 2m1au2f 3maul ma3un mau3r 2maus mau2ta m4ay ma1yo 1mä 2m1ähn mäh1r 4m1änd 2mäo 2m1äp 2mäq mär1 mär2kl mär2z1 mä3t4r mäu2s1c 2m1b2 mbe2e mber2e mbe3ri mbert4 mbi3er. mb4l mble1i mb4r mbu3sc mby4t 2mc m3ch 4m1d m2dan m2d1a2s md1är mde2a m2dei mde2m m2d1emi m2d1ent mder2 m2d1erl md2ö md3ras md3s2e mdt4 m2d1um 1me me3an me3at meb4 me2ben 3mebr me1c medi3e4 me1e2m mee2n mee4r3ei 2m1eff mega3 me4gel 3meh meh6l3er mehrer4 2m1eif 2m1eig m2ei3l2 mein4da meinde3 meiner6k mei6nerl 3m2einu 3m2eist me3lam me3l4ant me2l1au melb2 mel3d2 melde3i me2lek 2melem me2ler melet4 2melf. 3melk mel4k3ei mell2 3melo me2lob mel2se mel5t4 6mel6tern 2m1e2mis 2m1emp 2m1e2mu m2en. men3ab me3nage me4n3an men3ar me4nas men3au 2m1endl menen1 4men4gag men3ge me2nim men3k4 men2on men4se. men4sem 6mensemb men4sen men4ser men4ses mensi4d men2so menst4 m4enta men4t3ak m4entei ment5eig men6t5ers 2mentn ment4sp me1o 2meou 2meö 2mepa 2m1e2pi 3m4er. me1ra mera3l mer2a3s4 me2r1e2b me4rens mer4err mer4erw 4m3er4gän merin4d merin4t 4mer4klä mern3s2 m4ersh mer5sm mer6stel mer4sto mert4r merz6eng 3mes me2sal me4sä 4meser mes2po mes1pr 2mes4sa mess3an mes6ser6g mes4s1o mes2sp mes2st mes3ta me1sto me3su me3sze me3ta meta1s me3th meto1 me2tö me4trig met6t5en6d me3tu meu1 2m1ex me2xe 1mé 2m1f4 mfi2le 4m1g2 mgang4 mglim2 4m1h2 1mi mi1a mia2b mi2am 2m1iat mi1ä mibi1 mic1e mi1ch mi2ci mi3da mi2di. mi3dr 2midy mie3dr mi3ele mi4e3no mien3s mierer4 mie1s mie2ti mie4to mie2tr mi1f4 3mige mi3h mik1an mi3ke mi4kel mi4kens mi3k4l mi2ku 3mil mi3l2a milch1 mil4che mild4s mi3l2i mi3l2u 4milz m2im2a 2m1imm 2mimp min2ac mi3nak min5anze m2inde minde4s 2m1indu mi2nef miner1 mi4n3e4ri min2eu 2minfo min2ga ming3s 2minh mi3ni mini3k4 mi3nod mi2nof 2m1inse m1inst mi3nu mioni1 mi1p 3mir. 3miri 3mirs 3mirw 3mirz 3mis. mi2sa mi4scha misch3w mi3se1 2m1i2so mis2pa mi2spe mis5sar mis4ser mis4st mis3te mi1sto mi1s4tr 3misu 3mit mi2ta mi2t1h mi2to mi2tr mit3s2 mit5sa mit3ta mit3t2e mitte3s mi2t1u 4mitz mi3v2 2m1j 4m1k4 m3kn 4m1l2 ml3c m3le ml3f ml3k m3lo ml3p ml3s 4m1m mma3a m2m1ak m2m1al m2m1ans mm1anz m2m1ap mm1art mma1st mm1aus mm1äu mmd2 m2m1e2b m2m1ef mm1ein mme2l1a2 mme4lin mm2ene mmen6te. mmen6ten m4mentl m4ments m4mentw mme2r3a mme4rec mmer6geb mme2s mme3sc mme4sz m2m1eu mmi3el mm1inb mm1inh m2m1ins mm1int mm2is mmi3sc mmisch4 mmi1s4t mmi5tw mm3m2 mm3p2 mmpf4 mm2s mm3sa mm3s2i mm3so mm3s2p mm3sta mm3sti mm3te m2mum mm2un mmu3r mmül2 mmüll1 2m3n2 m4nesi 1mo 2m1o2be 3mobi 2mobj 3m2od mo3de mode1s mo2dr m1of mo2fe 3mog 2mog. mo2g1al 3m2oh moh2a moi3r mo2k1l mol3d 3mom mom2e 3m2on mo2nan mo2nä mon4dac mon4del mon2do mond3r mo2ner mon2s3 mon3sa mons4e mon3s4u mont2a mon3th mo1ny 3m2o2o 2mo1pe mo2per 2m1opf 2mopt mo1ra mor2an mor2d3a mor2dr mo2rei mor3g morgen5s6 mor3t2 3mos mo4ska mos3s moster4 mos2ti mo3t2h mo5to mot4r mous4 2m1ox mo1y 1mö möbe2 mö2c 2mö2f 4mök 2m1öl 4m1p mpa3ne mpe2la mpe4lin mpe2n m2p1ene m2pf mpf1ef mp4f3erf mpf3erg mp6fer6ge mpf3erp mp6ferpr mp4f3err mp4f3er4z mp2f3l mpf1or mp2fr mp1haf mp1hos mpin2 m3plä mp3lei m4p3lem. m2p3len m2p3les mp4lis m3pon mpor6tag mpor6ter6 mp3sh mp3str m3pu 2m1q 2m3r4 4m1s m2sam m2san m4sap ms1as m3sat m2sau msau3e m3sä m4s1än m3sc msch2 m4sco m3se m4s1e2d m4s1ef m4seig m4sein m4se2le mse2n m4s1ene m4sent ms1erf ms2erh mse2t m4s1eu m4sex m2s1o2d mso2r ms1ori m2spä m2sped m4spl ms2po m2spot m2spro ms2pu ms3s4 mst2 m6stag m3stä m3steh m3stei m3stel ms2ti m2stit m3s4to m3s4tr ms5trä m3s2tu ms4tü m2sü m4sw m3sy m4szi 4m1t mt1ab mt1ak mta2m mt1ar mt3aug m2t1e2d mt1ein mt1eis mt1elt mt1emi m4tenga m4t3engl m4tentf m4tentg m4t3en4tr m4tents mter2 m2t1erb m4t3erei m2t1erf m2t1erg mt1erh m2t3e2r4i m2t1erk m2t1erl mter4n m2t1ers m2t1ert m2teta m2t1eu m2t1ev m2t1h mt3ho m2t1i2d m2tim m2t1in m2t1i2r mti2s mtmen2 mt1ob mt1op m2t1öl mt1ös m2t3ro m2trö m4ts mt2sa mt3sco mt2s1e mt3send mt3s2ka mt3s4kel mts3tät mt3stu mtt4 mt1um mtu3re m3tü mt3z 1mu mu1a mu3cke mu4ckel 2m1uh mu3la 3muld mul4lau 3mult 3mumi m1ums mum2s1p 3mun mundan4 mun6derf mu2ner2 4m1unf 4m3ungeb mu3ni mu4nin 4mu4niv 4munw 4munz mu4r1u2f 3m4us mu4s1a mu2s1o mu2sp mu2s3t2 4must. must4e mu2su mut1au mut2st 1mü 2müb 3müh mü2her mühl1a mül4len 3mün 3müt mütter3 2m1v mvoll1 2m1w2 mwa2 mwa4r mweg4s mwel4 mwelt3 mwu1 3my my1al my2s3 2m1z2 mzug4 1na 3na. 2n1ab 3naba na2bä naben3s4 n3abh 3nabi n3abk na2b3l na2bor na2br nab4rü 4n3abs2 na2bus 3nac n4ac. na2ch1 nachen6 na5chen. n3achse nach3sp nach8t7ersc nacht8raum n1ada na3dab 3nade na3de. nadel1 na2der 4n1adl 4n3adm n1a2dr 3nae na3el 2n1af na1fra nag2a na3ge. na2gem 4n1agg n1a2gi na3gin na3g4r 3n2ah na2h1a n4ahm 4n3ahn 4n3aho 3nai nai2e n1aig 4n3air nai4re n2ais 2n1ak 3nakä 3nako na2kro 4nakt n2al. na2l1a2 nal3am na4lar na2lä 2n1albk n2ald nal3da nal3ei na4l3ent na6lerei na4ler4g na4lerm na4l3erw nales2 nal1et nal1ex nalg2 na2lid na2lop nal2ph n2als. nal3t nalt2a nal5tr n2alty na2lu 2naly na2mat 3name na3me. 4na2mei n4a3men namens3 4n1a2mer na2mid na2min na3m4n 3n2amo n1amp nam4sp 2n1amt namt4s na4my n1an 4na2n4a na4nat n3a2nä 4n3anb n3and2 nan1eu 4n3anf 4n3ang 4nanh 2nani 4n3ank 4n3anl 3n2ann 4n3anna 4nano nan2o3b 4n3anp 2nanr 4n3ans 2nantr 2nanw n2anz. nanzen4 nan6zene nan6zeng nanzer4 na3ot na2per n1apfe 4napfel n3a2pr n1aq n1ar 5nar. na2r1a 2narc n2ard n2are n4are. 3nari n2ark n2arle 2narm n2aro na2rom n2arr n2ars 2nart n2arta n2arth na3r2u 3nas n4as. na3sä na4schw 4n1a4sp nas2s1c 4n1assi nas4ta na2str 4na2sy nasyl2 3nat n4at. na4t3au nat1ei na2tem na2t2h 4natm nat2o 4natom 5nator nat1r nat4sa nats1e na3tu n1au nauf4fr nau2fr 5naui 3n2aul 4nausb 4nausd 4nausf 4nausg 4nausl n2auso 4nausr 4n3auss 4nausw 4nausz 3nav nave4 navi5er. navi5ers 1nä 2näb 3n4äc 3näe 2n1äf 3näg nä2hi 3nähm 2n1ähn nä2hu 2n1ä2m 2n1än 4näpfel 2näq när4s5t nä2sc n2äss 2näu 3nä1um 2n3b4 nbais4 nbe2in nber2e nbes4 nby4 2n1c n2c3ab n3can n3ce4n n3ces. n3chl nch3m n2ck ncor2 n3cr n3cu 4n1d nda1f nd2ag n3dai n2d1ak n2dana n2dani n2danz nd1arr n3dat nd3att nd1au n2daut n2dax nd1äng nd1c nde4al. n2d1ede n3dee n2dei nd3elfe ndel3l ndel4s3a ndel6s5en ndel7ster nde4mot nden3sk n4dentl n4dents nde3o2 n5der. n5deren nd2erh n5deri nder6läs nde4rob n4de4ros n6der6sat nder5ste n3d2es1 nde2se ndes3s ndi2a3 nd1imm ndo1c n2dof ndo2n3a n2dopt nd1or n2do2ri nd2os ndo1st n2d3ott n2dö nd2ös nd4ram n2d3rat nd3rau n2d3re n2drif n2d3roc n2drod n2d3rö n2drui n2d3run nd4sene nd2spr nd3th ndt4r n2duns ndwa5re ndy3 1ne 3ne. ne2ap 3neas ne3at ne3au 4n3ebene ne2bl 2n1ebn neb4r 2nec 3neca 3nece ne2ch ne1ck neck2a ne2dit 2nee neei2 ne3ein ne3eis neen2 nee1r neer2e n1ef n2ef. n2e3f2a 2nefr 2n1egg neg4l n1e2go neg4r n1ehe 2ne2he. 2nehem 2nehen2 nehe2r 3nehm 4n3ehr 2n1ei 3neia 4neic nei4dei nei4dr 4neier 3neigt 3neigu nei4la 4neing 4neinh 4neink 4neinl 4neinz 4neip neiss4 ne2ke 2n1eks nek3t2 2nekz ne2la nel3b n1e2le 4nelek 4nelem ne3len ne3lex nel2i ne3lid ne2lit 3nelk n2ell nel2l1a nel4lei neller6f 3ne3l2o 3nelu 3n2em. 4n1emb 4n3emp 2n1ems 4nemu 3nen n4en. n2en3a nen4am ne4nan ne2nä n2enb n2enc nen4dar 4n1endb 4n1endd 4n1endf n1endg 4n1endh 4n1endk n1endl 4n1endp 4n1endt 4n1endw nene2b nen3ei nene4m nenen1 ne4nene nen3erb ne2n3eu n2enf 4n1engb nen4gen 4n1engs 4n1engt n1engu n2enh ne4n3i n2enj n2enk2 n2enm nen4nar ne2no4 nen3s4e nen3sk nen3s2p 5n2en3t2a 4n1entb 4nentd 4nentf 5n2enti 4n1entl 4nentn 5nentr 4n1ents 4n3entw 4nentz ne4n3u n2env n2enw nenz4er ne2o3b ne2oh ne2or neos4 ne2pen 2nepf 2ne2pi 2nepo ne2pos nept4 n4er. ne1ra ne2rab ne2rac ne2r3af ne2rag ne3r4al ne2ram ne2ran ne2r3ap n2erat ne6ratio ne3rato ne2rau n2erb2a 4n3erbe. 4n3erben 2nerdb ner4dig nere2 ne2r1eb ne2rec n1erf 4nerfas 3nerfr 2nerfü 2ner3g4 3nergr n1erh 4n3erhö 3neri n2erj n1erk 5nerka n2erkö n2erli 2n1erlö n1ermi 2n1ernä 4n3erneu 2n1ernt n1eros n1eröf ne1rös n2ers. 2n1ersa 3nerse ner4sk 4n3ersts nert4 3nert. ne2rup 3n2erv 4nerwar 2n1erz n2es. ne2sal nes2an n4ese ne2sei ne2s1ev 2ne3sh ne3si ne3ska ne2s1of ne2s1or ne2s1pa 4n1es2si nes4sig ne1sta ne2ste nes3ti 2n1est3r 4nesyn 3neß ne2tab 2ne4tag net1ak ne2t1an 2ne2tap 2ne2tat ne4te2l ne2th net3ha ne3ti ne4tin ne4tob n2ett net3ta net3te net3tr 2n1e2tu net4zer net2z1i ne2u neu1c neu4ere neuer4f neuer4k neuer4r neuer4s neuer4w neu3g4 2n1eup neur2 neu2ra neu3t 3n2evi n2ew ne3wa 2n1ex ne2xi 5ney 3nez 3né 2n1f n3f2al nfalt4 n3f2ang nf4ar n3f2ä nfe2i n3f2en n3f2er nf2es n4fex nff4 n3fi nfi4le. nf4le nf2o nfo1s nf4r nf3s2 nf2tan nf2t3r nft4st nfts3tr nf3tu n2f1u 4n1g n3gabe ng1abt n2g1a2c n2g1ad n2g1ak ng1a2me ng3anda n2ganh n4ganl ng1ans ng1ant ng1are n3g2ars n2g1a2v n2g1äl ng3d n2g1eif n2g1ein ngelb4 nge3l4ei ngelt2 n3g4en n5gene nge5nerw ngen3sa nge4ram n2g1erg nger4zä n3g4es nge3sa nge5t ngg3s ng3hu n2g1id ng2lad ng2läs n2glic ng4lok n3glot n2gn ng3ne n4g3ni ng4nom ng2nu ng2ob n2g1op n2g1or ngo2ri n2gö n2g3rai ng4ran n2g3rat ng3roc ng3rost ng4s3au ng4scr ng4s3e4h ng4sek ng4sens ng4spar ngs5tan ngs4teu n4gt ng3ts n2gum ngung4 ngzei4t 4n3h2 nhe2r 1ni 3n2ia ni3alo ni2ar nibb4 nic4 ni1ce n1id 3n2id. ni3da ni2de 2nidea ni3d4r 2n3idy n2ie nie3b ni1el nie3l2a nie4n3 ni3ene ni3eni nie4rei ni4erna nie2sa ni2eu nife4s3 ni1fl niga2 ni2g1ab ni2g1am ni2g1an 4n3i2gel n4igen 2niget ni4gl nig3li ni2gn nig4sp nihi3 ni2kar 3nike ni2kel ni3kerh ni2ki nik3ing ni2kor ni2k3r nik3t4 3n2il ni3l2a ni3l2i 4nimp nin1 3nin. 3n2ina nin2ac ni2nal 3n2inb 2n1ind 2ninf 3n2ing ning4s 2n1inh 4n1ink2 3nino ni2nor 3n2inp 2n1ins 4ninse 4ninsu 4n1int ni3nu 4n1inv 3n2inw ni2ob ni3ok ni3ora n2ip ni4ron n1irr 3n2is ni4sam ni2san ni2sä nis3cha ni4schw ni2s1e 4n3isol ni2som 4nisot ni2sp ni3spi nis3s4 nis3tha ni2s1u 2nit 3nita ni2ti 4ni4tia nit2o 3nitr nit3s nit6ter6g nit6t5er6k nit4tra nitt4sa 3niu ni3v2 3nix 2n1j 4n1k nk1abr n2k1ac nka2ge n3kal n4kalg nk1ang nk1apf nk3art. nka3sc n2katm n2kato nk1aus n2kaut n2k1äh n2k1äp nke2c nk1ei nk2eil nke4lei n4kelem nke4na nken4te n4k3erle nke4ros nk3ersa n3kesc nke2t nk1eti n2ketu nk1i2d n2kide nk1inh n2k1ins n4klade n3klag nk3leis n2k3len nk3les n3klin nk2lo nk4neb n2knis n2knit n2knu n2k1o4be n2kopt nko2r nkord2 nk1ori n2k1ort n2köl nk4rab nk3rät n4kre. n2k3rel n2kren nk3rep n2krez nk3ro n2krol nk2sal nk2se nk3sen nk2so nks2ti nk3s2z nk2tak nk2tan nk4tau nk4tent nk4terg nk4t3ern nkte3sk nkt2et nk2tin nkt1it nk2top nkt1r nkt3ric nk2tro nk2tru nkt4sen n2k1um nku2n nk1urh n2küb 2n3l2 nla3ge nle2ga 2n1m2 n3ma n3mä nmen2s n5mi 4n1n n2nada nna2g n2nalg n2n1all nna3m n2nan nna3st n2nau n3nec nn2ei. n3nelb nne4le nne4na nn2ens nner4ei n6n5ereig nner4fü nner6geb nn4ergr nn2erh nn2erk nner4la nn2ero nne2rö nn3erwa nner6war nner2z nne4s1e nn2eu nn2ex nn3f nng4 n3ni nnk2 nn2o3b nn3obl nn3obs n2nof n2nop nno2r nn1ori nn4sam nn3ser nn3s2p nnst4 nn4stoc nn2stö nn5t2a nn2th n2n1uf n2n1unf nn1ur nnvoll4 nnvol5le 1no 3no. no5at 3n2oba n2obel 2nobj no2bla n2oble 3noblo 3noblö 2n1ob2s nobu2 nobut3 3noby no1c noche4 noch4r 2nod no2de no2ed n1of no2fe 2noff 2n1oh 3n2ohe no2kel 2n3okk no3kr n3ole no2leu no4lig no2liv 2n3o2ly 3no3me3 no3mi 3nomp non2e n1onk nons4 n1ont 2nony no2o 3n2opa 3nopä no2per 2n1o2pi 2n1ops no3p2te 3nor. nor2a no2rad n2o3rak no3ral no3rar 2norc nor4da 3nordb nor4des nor2d3r no3r2e 2n1org 3norh 3n2orl 3norm norm2a nor3mal 3norö 3nors 2n1ort 3n2os. nos2e1 no3sh no5s2k no2s3p 2no2sti nost1r 2nostv nos2u no2tan no3tart no2tä no4t1e2i no6t5entr no4ter2 noterb3 no4tex not1h no2tho no2t3in no2t3op no2t3r 3nov 2n1o2x 3noz 2nöd 4nö2f 4n1ök 4n1öl n2ör 1n2öt 4n3p4 npa2ge npa2s npf4 npro1 npsy3 2n1q 6n3r2 nran2 nrau4ma nräu3s nrebe2 nreli1 nre3s4z nro2h nrö2s nrücker6 4n1s n3sabo n2s1a2d n2s1a2gi nsa2kr n2sall ns4alp n2salt ns4anat ns3ane n2sanm nsa2r ns2arg n3sark nsa2s ns4ath nsau4r nsau2s n2saut ns2av ns2ax n2s1än ns2äug n2s1äus n3sche. n4schef nsch5eul n4schl. nsch2o nscht4 n3schu nsch7werd ns2cr ns1eb nse4ein ns2eh nse2ha2 nseh5ere n4seinf ns2ele ns3elem n2sem. n2sene nsen4sp n2sepo n2s1erf n2s1erg n2serh n2s1erk ns4erko ns1erl n4serle n4s3erne n2serö ns1ers n4sersc ns3ertr n2s1erw n2serz n2sety n2s1eu ns2ext nsfi2l ns3iden n3sim n4simp ns2inf n2sini nsinn2 nsinns3 n3sis n4siso nsi4te nsi2tr n3s2kal n3s2kel ns2kis n3skle n3s2ky n5smara n2s1o2d ns1of n4soff ns4om n4s3ont n2s1op n4s3ort. ns2pac nspa2g ns4pek ns2pel n5s4pen n4speri n2sph n3s2pi ns4pie ns4pir n2spo n2sprä n4s3prie n2spro n2sput nsrü2 ns3s4 ns3tabl n3stad ns8tagent nst1ak n4stale ns4ta2n1 n3stand nst3ane n3s4tar n2stas n4stat. n6staten ns4tati n4stats n3stäm n3s4tän nst5eife nst7einhe ns4tent ns2tep nst5erge n5s6terne n5s6terns ns4teu ns2ti n3s4tic n3stif n4stilg n3stim n2stob nst5opfe ns4tor n4strie n4strik ns4trip ns4trun ns2tu nst3u4t ns4tüm n3suf ns2um ns1un ns2ung ns4unk ns2unw ns4unz ns1urs n2s1ut n3sy ns4zene 2n1t n3t2a3c ntak4ta ntal1a nta4lin n4t1all nta2lo nt2alp n3ta3m n3t2anb nta3ne n4tansp nt1ant n4tanza n3t2arb nt1ark n3t2arm nt1art ntar6tik nt3artu n2t1ass n2tath n3tatl nt1äm n2t1äu nte3au nte1e nte3g6 nt1eh n3tehe n2teig nt1ein n2t1eis nte4lin n2t1emo nt4en nte4na nten6te. ntera2 nte6r5eis nt4erh nt4erk nt4erm nt4ern ntern4e nt4ers nt4ert nte3sa n4t1es4s nte2st n6testri n2te4ta nteu3 nteu6eri nte3v nt1hel nt1hie n2thot n3thr nt4hu n2t5hum nt4hy n3t2i nti3c ntim3p n4t3ind n4t3inf n4t3inh ntini1 n5t2lem ntmen2 ntmo4 ntni2 ntnis1 nto3re n4torg n4t3o4rie n2t1öl nt4ral nt1rau nt4raum nt3rea nt3rec n5t4ree nt3reif n5trep nt4repr nt3rich n4t3rieg n2troh n3trop n4tropi n2t3rü n4ts nts2ah nt3s2p nts3par nt5spe nts2t nt2sur ntt2 n3tub ntu4re. ntu1s n3tü nt3z 1nu 3nu1a nu4ale nu3a2r3 nubi1 2nu1c 3nud nude2 3nue nu2es nu2fe 3nug 2n1uh 3nuhi 3nui n2uk4 nu3kl n3u2kr null1a nulle2 null3eb n2um. 2n3umb n2ume 2numf 4numg 2numl 3n2umm 4numr 2n1ums 2n1umv 2n3umz nu4n 4nuna 2n1une 3n2ung4 4n3ungl 4n1uni n3unk 2nunr nun3s 4nunt 4nunv 3nunz 3nuo 2nup 2nu2r nur2i nur3s nur2z 3nu2s nu3sc nu3se nus1p nu3spo nuss3er4 nus6serl 3nut nu2t1a n3uto nu4top nu4t3r 3nuu 3nux 3nuz 3nü. 2nü4b nür1c 3nüs 1nüt 2n1v2 n3ver n3vl nvoran4 2n3w 1ny. 2n1ya n2ya. 1nyh n1yo 1nyr 1nys 1nyw 4n1z n2zac n2z1a2g n2z3a2k n2zan nz3a4ne n3zani n2zar nza2s n2zat n2z1au n2zän n2zär nze4la nzel6lig n6zenerg n3zeni n4zense n4zentl n4zents nz3erem n2z1erh nz1erl nzer4lö n5z4err nz5erste nzer6tra n3z4es nze3sk nze2t nz1eta nze3u4t n2z1id nzi2ga n2zinh n2z1ini nz1int nz1inv nz3le n2z1op n2zöl nz3st nzt4r n2z1wa n2z1wä n2zwet n2zwir n2zwö n2z1wu ño1 ñor2 2o3a2 o4a3bi o4ac oa3che oa3chi o4ad oa3de oad4st oa3in o4a3ke oa4k5l o4a3la o4a3mi oa4n oan4a o4a3q o2a4r o2as 3oa3se o5ass o4at oa4tr o5au 2o1ä o1b 2ob. o3b2al ob2am ob2ar ob1auf 2o3b2ä 2obb ob2e 2obe. 2obea 2o3bec 2obef o2b3ein 2oben obe4na oben3d4 1o2ber 2o3ber. ober5eis ober3in oberin6g obe4ris 2obev 2obez 2o3b2i 3obj ob1la ob3lei 1ob3li 2oblo2 2ob2lö ob2lu 2obo ob1or 2obö ob3rei 2obrü o4bs ob3s2h ob3sk obs2p ob3sz 2o3bu o4bunt obu2s 2o3bü o4büb 2oby oby4t 2oc o3ca oc1c 3occl o1ce och1a ocha2b ocha2r o1che oche4b o2ch1e4c och1eh och1ei oche2l ocher4k ochi4d och3l och3m och1o ochö2f och3r och1s ocht4 o1chu ochu2f och3u4t och1w o1ci o1c4k o2ckar o2ckau o3cke o6ck5er6sc o3cki ock3sz ock3ta o1cl o3cu o1ç o1d 2od2a od3ak od2dr o3dec o3d2e3i odein3 ode4l3ag ode4man ode2n1 o3der ode2s1e ode3sp od2et o3dex od2i 2o3dia 2odi3c 2odif 2o3dir 2odn od2o o2don o2d3op odo4s od2ö 2odr o2dre odt4 2o3du o3dy ody2m 2o1e2 oe3di oe4m oen1e oe3ri o2e3s oe4sc o2e3t2 o3et. o3ets 2ofa ofa2c of1a2d of1a2g of2an of1au 2ofä o2f1e2b o2f1ec 2ofee o2f1ei 2ofem o2fent 2o3fer o4ferb 2o3f2es o2f1e2t 2ofeu of3eun of2f1a off3erz of2f1in 1offiz of2f3l of2f1o of2f3r offs2 off3sh off3si off3sp of2fu 2ofi ofi3e2i ofi3k4l ofi3s4 2o1fl of3le of3li of4lö 2ofo 2ofö 2o1fr of3rä of4rü of2s1 of4sam of3sä ofs2ch of4sen of3sta of4staf of3str 2oft oft2a of2tei of3th oft4r 2ofu of3ur 2o1g o2g1ab o2g1ac oga3d og1ang og1ans o2g1e2i oge2li ogener4 ogerätein8 o2g1eth og2gl o3gh ogi2er ogin1 o2g1ini og3ins og1l og3le og2lo o3g4n og1o2ri ogs2 og3sp og1ste og3sti 2o1ha oh1alk o1hä o1he o3he. oh1eis o3hem o3hen. ohen3s o3her. o3here oh1er4t oh1er2z o3hes 2o1hi 2ohl ohl1a oh2la2d oh2lä oh3lec ohl1ei oh3lep ohler2 oh4lerg oh4l3erh oh4lerw oh3lo ohl1o2r ohls2e oh2lu 1ohmi ohn1a oh4nac oh3nee oh2ni 1ohnm oh2n1o ohn3sk 2o1ho oho2l1e ohol1o oh1o2p 2ohö oh3öl ohr3a oh2rel oh2rem ohren3s ohrer2 oh4rerg oh3ri oh4rin oh2rol ohr5t4r oh1s oh3sa oh3t o1hu oh1w 2o1hy 2oi o1id. o3i2da o1ids o3ie o1i2m o1in o4ine oi2r o3isch. o4ische o1ism oiss2 oi1th o1i4tu 2o1j ojek8tori 2o1k ok2a oka3b2 o2k3ac oka3i oka2la okale2 oka6lere okas4t ok2e oki4o ok2la ok3lau ok1lä ok2li ok2o oko4pt ok2so ok2s1p ok5t2 3okw 2ol o1la ol3abu olaf4 o2l1a2m ol1ant ol2ar olar3s2 o3l2as olast4 ol1a2v 4o1lä ol1ät ol2chr ol4d1am ol2dä ol2d1ed ol4d3eng old5ersa olde2s ol2deu ol2dim ol2d3o ol2dr 4o3le. o2l1ef ol1eie o2l1eis ol1emb oler2 ol1erk ol1er3t ole3s ol1ess ole2st ole4sti ole3u2 ol1exz ol2fa ol2fem olf3ere ol2f3l olf1r ol2f3ra olft4 olgege3 olge4ne ol2gl ol2gr ol2i olie4n1 oli2er oli3k4 oli5tu 3oliv ol3ke ol2kl ol2k3re ol2kro olks3 olk4sc olk4si ol2l1ac ol2l1ad ol2l1ak oll3am ol4lang ol2l1au ol2l1e2b ol4l1e2c ol2l1ei ol2lel ol4l3erh ol4ler4k oll3erl ol4l3erw ol4l3ess ol2lop oll3s2a oll3sp 4olo ol2of olo1p ol1ort ol2ov ol3s2k ol4ster ol3t2h o1lu olu2th ol2y 4o3lys ol2z1a2 ol3zan ol4z3ern ol2zim ol2zo ol2zw ol2zy 2om o2mab oma2bl o2m1a2ge om1alg om1all oma4n3er o2m1ang om2anr om3ansc o4mante o2m1ap o2m1ar4s o2m1art omar4te o4ma2sy omat2i o4matom o2m1au o2meb om1ebe o2m1ef o2m1ei o2mel o3meld omen5t6an o4mep omer2 om1erh o2meru om1erz omi2c3 omiet1 o3mig om1ind om1ing om1ins o2m1int om3ma omm2e 3o4mn 4omo o2m3oa o2m1org om1o2ri om3pf oms2 om3sk om3t2 o2mum o4munt 2ona on3a2b on2ac ona3g o3nal on3ann onan6z5ei o2n1ap o2n3arb ona3th 4onatol onat2s o4n3at4t on2au 2onä on1äh 2onc on2dan onde8rers onderer7t ond1r on2dra on4drin ond3sk 2one on1ec one2ck o3nee o2nef o3neig on3ein on1ema one2n1 o4n3ends on2eng onen3s2 on1ep o3ner. on1erb o2n1erd oner4fa o2nerh on4erka on1ers o3nes o3nett on2eu on3f2 on3gl ong4le ong4r ong3s2 on2gue 4o3ni on2i3d onie3g oni2ga on4ik o4nikr o4nim o4nind o4ninh o4nins on3k4 3onke onli4 onlo2c onna2 on3n2an on3n2e 2ono1 o3nod o2nof ono2i o2n3oke o3nom on1orc on3ord ono3s ono3t2 onrad3 ons1a on4sam on2seb onsen1 onse4t onsi2d ons3ing ons3l ons1p on4spin onst2a onst4r ons5tri on3ta on2t1eb on2te2l ont5end on4t3erl on2th on4t3rat 2onuk o3nur 2onut on3v 1ony o3ny. on3z2 onze3in o1ñ oo1c ooch2 oo2gl oo2k3l oo2kn oo2mo oo2ne o1op oop2s o1or oor3d oo4sk oos3s4 oo2su oo2t1a oo4t1ei oo2t1h oo2tr oot2st oot3t oo2tur 2o1ö2 2op. o1pa op3adr op1akt opa2le op1ang opa5s opa3s4t 2opä 1ope o1pec 2o1ped op1ef 2o1pei o1pek 2opel 2open 2opep o2pera op1erh o1pes 2opf. op2f3a op3fah op2fä o2pfe op2fem op2fin opf3la op1flü op2fo 4oph2 o3phe o1pi opi5a4 opi3er. opi5ers. opie4r3u opin2 2opl op3lag o2p5le o3p2n 2opo opo2la op2pan op4pl 1oppo op2p3r 2oppt 2o1pr 3o4psi op3sz 1opt4 2opte op3th o2pum 2opy 2o1q 2or. or1a 2ora. o1raa 2or3a2b o2rabb o2r3add or3adr o1r2ag o2rak 1orake o1ral o4r3alm or4alt or2am or3a2mi o1ran3d or4ane oran2f oran2m oran4ze or3ap 2orar o1r2as o2ratt 2orau4 oraus6wa or2av 2o1raw o1ray o3rä or1änd or1ät orb2l or1c 2orca or2ce 2ord. 4orda ord1am or2dar or2dau 2ordb ord3eng orde4s or2deu or4d3ing or2d1ir or2dit 1ordn or2do2 2ordr ord3s2t ord3t 2ordu 2ordw 2ore ore2a o2r1e2b o2r1e2ck ore2di o5ree o3ref or1eff ore2h or1ei o3rei. o3reie o3r2eif o3r2eis oreli1 orems2 o3renn o3rep o2r1er o3r2ere o3r2ero ore4th o2r1eu 2orf or2fac or2far org4a org2e 2orget or3ghi 2orgia or2gl or3gla or3gle or2gn or3gne 2orgr 2orh 2o3ria 2o3r2id orid3i 4o3rie. o3rien. o6rienti o3rier o3ril or1ima ori4mi 2o3rin1 o4r1ind o4rins 2or4io o2riso 2orit 2ork ork4r ork2s ork3sh 2orm or2mam or4mang or4mans orm3asp or2m1eb or4m3erf or4m3er4g or2mor orm3ord or2mum ormu4n or4muni or4munt ormwa5 or2n1a2c or2nal or2nan or2nar or5ne. or3ni or4nin or3no1 2o1ro o2r1ob or3oly oro3n2a or1opf o2ro2r o3rou or1ox 2o1rö 2orp 2orq 2orr orr4a or3r2e 2ors2 or3s4a or3sh or3si or3sk ors4tin or3sz or2t1ak or2t1an orta2r or2tef orte4n or4ten5g ort3erb or4t3ere ort3erf ort3erg or4terk or4t3erl orter6sc or2t3e2v or2the or2tin or4t3off or4t1o2r or2tö ort3rad or4trau or4t3räu ort3re or2t1um 2o3ru or2uf or1uh orum4s o4r3un oru2r o5rus o2rü or3z2e orzel5 or2zw 2o3s2a os3ad osal2 o4s3ami osa1s 2osc o4s3ca osch3ar o3sche osch3le os4co 2ose ose1e ose1in2 os2el ose2n o2s1er2k os2ex 2osh o3s2hi os2ho os4hu 2osi os4it o3sk os2kal o4ski 2os2kl 2os2ko o4skr o4sky 1osm os4mog 2oso osol1 o2sö 2os1p os2pac os2pe os3pec os3pero o3sphä o3s2po os4pot os2pra 2oss os2sa os6s3a2c os3sag oss3ala oss3and os4sä os2sei oss5enke os4s3enz os2s1ep os4s3er4b osser4e os4ser4f os4sik os4sim os2s1o2 os4son os2sp oss1pa os2s3t ost1a ost3ang os5tarr ost4art os4tat ost3aut os4tä oste2c oste2n oster3e ost5erwe oster8wei ostes5s os4teu ost3eur os2t1h os2tid os3til os4tim os2tin os3tina os2tit os3toc os4tor ost3ran ost3rä ost3re ost3rot ost3uf os2tug os4tüc 2osu4 os1um 2o3sy o3s4ze 2oß o2ß1el o2ß1ent o2ß1en2z oßer2 o2ß1erb o2ß1ere o2ß1erf oß1is 2o1t o3tabe o2t3abi o2t1ah o2t1ak o3tal o3tam ot1ant o3tark o2tarz ota2s ot1ast o2t1au o3tau. ot1ä o3te o4teb ote1i o4t1eib o4t1eic otei4n o4t1eis ot2el ote4l1a ote4lin otel3s2 o4t1emi ot2em3p2 ote4na o4tentb ot1erb o4t1er2l o4t1erw ot2e2s ot2har o2them o2t1hi o2thr 4oti o2til o2t1i2m ot2in ot3inh otli4 ot2o oto3b4 ot3off oto2ph o2t1ö otra3c o3t4ran ot3rat ot4rau ot3re ot3ric ot4rig ot3rin ot3rus ot2s3at ot3sch ots2en ots1o ots1p ots2pe ot2spr ots3tau ot3sti ot3stra ot2su ott1a ot4tan ot4ta2s ot2teb ot4terh ot4ter4k otte2s ot2t1h ot2tim ott2o ot2t3r ot3t4ra ot4tri ot3t4ru ot1url o3tü ouff6 ou1f4l oug2 ou4ge ou3gl o1uh ou1is. 2oul ou2le. ou2les ou4li 2o1um 2o2u2n oun4ge. 4our oure2 ou2ret ouri4 ourie4 ourme4 our4ne. ou3sa ous2i ou3ti 3outp out3s2 ou3tu4 2o1ü o1v ov2a 2ovel o3ven ove3s oviso3 2ovo 2o1w o2w3al o3wec o2wh o3wi o2wu 2ox. o1x2a 2oxe o2x1el 2oxk ox3l o1xo o2x1u 1o2xy o1yo oy1s2 o1z2 o3za 1ozea 2o3zen ozen4ta ozes4sc 4o3zi ozir3 ozon1a 2ozy oz3z ór3 órd2 ö1b ö3b4a öb2l ö2b3le ö2b3r öb2s3 ö1c öch1l ö2chr öch2s öch4ste öchst5ei öchst3r öchs4tu ö3cke ö1d ödel3l öde1r ödi3 ödien3 öd2st 1ödu ö1e 1öf öf2fl öf3l ö1g öge3le ögen2s1 ö2g3l ö2g3r ö1he öhe4n1 öhl2e4 öhre4 öh3ri ö1hu ö3ig. ö3isch. ö1ke 1ö2k2o3 ök3r ök2s ö2l 3öl. öl1a2 öl1ei öl1em öl4en öl2f1ei ölf2er öl1in ölk4e öl2k3l ölks4 öll1a öl3le 3ölm öl2nar öl1o2 öls2 öl3sa öl3sz öl3tu 1ölu ölz2w ö1m öm2s ön2e ö3ni önizi1 önn2e ön2s ön3sc ön3sp öo1 öo2ta öoti1 2öp ö1pe öpf3l öp4s3t ör3a2 ör2b3l ör1c ör2dr ör3dra ö2r1ec ö2r1ei ö2r1e2l ö2r1e2m öre2n ö2r1ene ö2rent ö3r2erb ö2r1er2e ö2rer2f ö2rer2g ör2erh ö2rer2l ör2err ör2erw ö3r2erz ör1ess ör2f3l ör2gl ö2rim ör2kl örn2e örner4v ör1o örpe2 örs2e ör3sk ört2e ör5tri öru4 ö2r1une ö2sa 2ösc ö2sch3a ösche2 ö4sch3ei öscher4 ö6sch5erf ö6sch5eri ö2schi ö2sch1l ö2sch3m ö2schn ö2schw ös1ei ö2sein öse3str ö3set 2ösl ö2sp ös2s1c ös2st ö2st öst1a2 ös3te ös2th ös3tr ö3su ö1ß ößen3 öß2ti ö1t ö4t3a öte4n1 ö2t3r öts2 öt2sc öt2tr ö1v2 ö1w ö1z öze3 özes4 1pa. 1paa p1ab p2abe pab2l pab4rü 2pabw 1pac 1p2ad pae2 pa3el pa2es pa1fr 1pag4 pa3gh pa1ho 1pak pa3ke pa1kl pak4to 3pala pala3t 3palä 3pal2e pa3l2i 1palm pal2ma pal2mä pal2m1o 2palt pal2t1a pal4tei pal2tr pa2m3a pa2nar pa4n3at pan3d pand2a pan4ds pa2neu panf4 pang4 pa4nisl pank4 2panl 2pann panne2 pan4n3eb 4pannu 1pa2no pan3sl pan3t2h 1panto 2pantr panz2 pan3ze 1pap papi2 papieren8 papie8r7end pap2pr pap4s papst1 pa1q 1para pa4r3aff par3akt pa4rant pa3rap pa2rä 2parb 1p2arc par3d parer8geb 1parf 2parfö pargel6d 1park. park3am par4kau par4kr 1parks par3m2 par3ne 1pa2ro 2parp 2parr 4parta 3partei 1parti 1partn 3party par3z pas2e pa3sp pa4spe passer4 pas6serg pas2s1p pa4st 2paß pat1a pat4c pa5t4e2 2patel 1pat2h 1pati 1pa5t4r 1pau 2p1auf pa3uni 2pausz 1pav 1pä 3pä2c pä3cke pä4ck3er 3päd päde2 pä2d1er 3pär 3päs pä4t1e2h pä4tent pä4tep pä4t3erb pä2t1h pä2to pä4tr pät3s4 2p1b 2p3c 2p1d2 pda4 1pe. pe2a2 pea4r p1e2b pech1 1peda 1peel pe2en 2pef 4p1eff 1peg pege2l pei1 4peic 1peil p2eim 2peis 1peit pekt2i 1p4el 3pel. pe4l3ab pe4lai pe2l1au pe2l3ax pe2l1ä pelb2 pel3d4 3pele pe4l1e2h pe2l1er pe2let pe2leu peli2d peli4n pe4l3ink pel3inn pel4ins pel3k pel3l2a pell4e pell2i pe2lob 3pels2 pel3sp pel3t2a pel4zin 1pem 1pen pena2r pe4nas pe2nä pen3d2a pe4nen1 pe4ni2t pe2n1o pens2a 3pen3si pen3s2o3 pens2p pen3sz pent2a 2pentw penty2 penu2 pen3z 1pep pe3pi pe1ra pe2rak per2am pe2rau pe2r1ä per1e2b perer2 perer3z pe3r2id 3pe3r4io 1perle 1perlh per4r3an 1pers 2perse 2persi 3perso 3persp peru2 pe3run 1perü perwa4r pe3s2a pese2n 1pes5s2 pe2st pes4ter pest1o 3pet pet4r 1pé 4pf. p2f1ab p2fad p2faf pf1ai p2f1ak pf1am pf1ans p2fa2r pf3are p2f1au 1pfä p2fär p2f1äu 4pfe. p2fef p2fei pf1eim pf1ein pf1e2m p3fen. p4fener p3fens p3fent p4f1ep pfer5a p4ferde pfer6pro pf4es p2f1et pff4 p2f1i2d pf1inn p2f1in3s pfi2s pf1lam pf4lan pf4leg pf3lei pf3lo pfo2 p2fob p2fom p2for pf1ori pf3r pf1ra pf4rü 2pfs2 pf3sa pf3se pf3sl pfs4ti pf3sz 2pf3t2 pft4r p2fum 2p3g2 pgra2 1ph 4ph. ph2a phal4te4 p1hand 3pha1s p1hau phä1 3phän 4phär 4phb 2phd 2p1hei phen3d2 phe4n1e phen3s2 2ph1ers 4phf 4phg p2hid phik1a phi4kan 2phk ph2l 4phm 2phn p2ho. p2hob 2phö ph2r 4phs ph3t2 2phthe phu4s phu3t 2p1hü 3p2hy 4phz p2i2a1 piab4 pia3k pi4ali pia3n piap2 pi1ce pid2 pi2e1i pi2el piel3a 3pier pie2ra pie4reb pie4rei pi3gl 1pil pi3le 3pilo pil4zer pil2zw p2im 3pin. pi2nad 3ping pingen4 ping3s 3pins. 3pinse pin3s2p pi2o pi3oide pi3onu pi3os 1pip pi2pe 3pirate pi3ri 3pirin 1pis 2piso pit2a pi3t2h pit2s pit3z2e pi2z1in 2p1j 2p1k2 pku2 1p2l2 2pl. 3pla 4p3lad p1lah pla3na p4lau pla2y1 2p3le. ple1c ple2e p4leg ple3n2 2p3ler p4leu 2plig 3p4lik p4liz plo3n 2p3lu plu2s 2p3m2 2p1n2 1p2o pob2 2po1c 3pock 3pod 3poe po2el 2poh po2i po3id. po3ids 3poin 3pol po2lan po2l1au pold2e po3li po3lo3p pol3z2 pom2ph 2pond pont2 po1ob po2p1ak po2p1ar po2p3l po3p2t po1rau porf4 por3s 3portal por2t1h 3portio 3porto. 3portos 3portr por4tre 3posi poss2 po2sta pos4tag po2stä post3ei pos3tel pos4tem pos4tr post3ra po2ta pot1ar 3potä 3pote pot2h po2t3in pott1r po2t1u po3un po2w powe2 po3x pö2bl pö2c 4p1p p2pab pp1ans p2pat pp1au ppe3e p2p1ei ppe2l1a ppeli5ne ppel3s pp2e2n1 p2p1erz p2pf4 pp1fr p2p1h pp3he pp3l p4p1lac p4plan p2p1lä p2ple pp3oh p2p1ö4 pp3p4 p2p3ra p2p5rä p2pri pp3rol pp3rot p2p3ru p4ps pp3s4a pps2p pp3sy ppt4 p4p1um ppyl2 p2r4 1prak 1prax p4rä 1präd 1präf 1präg 1präl 3präm 1präp 3präs 1präv 2pre. 2prec 3pred 2pree1 pre2ei 2preg 1prei 3preis prei4s3c prei6sei prei4s5t 2preiz 1prem pren4ga 2p3rer 1pres pre3sa press4e pri4e 2prig pri2l1 2pring prings4 1prinz pri2t1 priter4 prit5t4 2pritz 1priv 1pro 3prob pro3be 2proc 7p4rod 3p4rog 3proj 4pross pro1st prot2e 3proto 2prott pro3x 2prö 1prüf 1prüg 2prüh 2prün 2p1s 4ps. ps1ad ps2hi ps1od p2sö ps4pi pss4 p2st p3sta pst1au p3stä p3stea p3stel ps2th p3s2ti ps4to p3stö ps2tu p3stü 3p2sy 4psys ps2ze 2p1t pt1a pt2ab pta2g p2t3a4t p2t1e2b pt3ec pt1ef pt1ei pt1emi 4pten p4t1en2g p4t1ent pt1ep pt3erei pt1erw pt1erz p3tet p4teta p4t1e2ti p2t1h pt1id pti2de pt1in1 pto2mo pto4na pto2p pto2w pt3r p2tro pt3s2 pt4sl pts4t pt1uh pt1um pt1urs ptü4 3p2ty pt3z2 1pu pu1a pub4 2puc pu2dr 2p1uh 2puk pu2kl pu2k1o pu2lin pul2sp pul2st 2pulw pum2pl 3pun 4pund pun2e pun2s 4punt 2pur pu2ra pu2rei pus2h pu3she pu2s3t pu5t2e 3put2s 3putz puzi3 1püf 2pül pül3l2 2p1v 2p1w pwa4r 3p4y1 py3s py3t 2p1z2 qu4 que3rel quer5n que4te. 1queu 1ra. r1aa ra2ab 2raac 2raal ra3ar r2a1as r1ab ra2b1ar r2abä 1rabbi rab2b3l 2rabd rabdru4 ra2bei rab2er rab3erd 2rabf 2rabg 2rabh 1rabi 2rabk r2able ra2bli ra4b5lo 2ra2br 2rabs4 2rabt 2r3abw 1raby 2rabz ra2ce 2r1acet ra4cheb ra2cho 2rachs rach6t5rä ra2chu r2ack 1r2ad r4ad. rada2 ra2dac ra4d1am ra2dan 2radap 3radar ra2de4i 3radf 3radh 3radio 4radit 3rado 3radp ra4d1r rad3ri rad5t4 r2af raf3ahn raf3ar rafe2 ra2f1er raf3r raft5s rag2a ragein4 rages4 2ragg ra3g4le 4ragm ra2gn r2ago rahle4n 5r4ahm r1ahn 2ra1ho 4raht r2ai 2raic rail2l 2r3air raka3 1r4a3ke 2rakk 3ra1k4l ra2kre ra2kro 2rakti 1rakü 2rakz r2al r4al. ra2la2 ra4l3ab ral1ak rala4s ra2lä ral3b4 3r4ald ra4l3end ra4lent ra4l5ern ra3lex r4ali ra2lid rali3er ra4lin4d ra4l3ing ralin6sp ralin4t 2r3alk. 2r3alm. 2ralp. 4ralpe r4als ral3sk ral3su r3alt 3r4al5t2h ra2l3u 3raly rama3s ra2mei ra2mer r2ami r2amm ram4man ram6mens ram6m5ers ram4m3u 2ramn 3ramsc 2r1amt ramt4s 2ramu 2rana ran1ad ran3ade r1a2nal ra2nan ra2nar ra2nau 2ranb r2anbe r4anda r4ande ran4dep ran4d3er 3r2andi rand3s 1raner 2ranf 2ranga ran6g5e6be 3rangi r2angl rangs2 rang3sp rang5ste rani3e r3a4nil ran3ka ran2kr ran2kü 4ranl 2r1anm r2anmi r2anmu 2ranna ran5ne 2r1anp 2ranr 2rans r2ans. r1ansc ran4spa 4r5antei r1anth r2anto 2rantr 1ranu 2ranw r2anz. r2ap 2rapa ra2par 2rapf 2rapo ra2pok rap2pr 2r3a2pri 2r1aq r1ar r2ar1a 2rarb r2are 3r4arei raren1 rar3et rar1e2v r2arf4 ra3rie rar3in ra3ris r3a4rist 4r3arit r2ark raro2 ra2rom 2rart 2rarz rar3zw r4as. ras2a ra3san ra4schl r2asm ra3spr r2ast ra2sta ras4t3ei r3asth ras4to 2rasyl 2raß 1rat r4at. ra2t1an ra2t1ei r3a2tel ra4tid 2ratm rat2o 2ratom ra5tor rat4r r3att 2ratta 2rattr 4ratz rat3ze 4rau. 3raub. rau3e4n 2rauf rau3fä 2rau3g2 3raum rau4m3ag rau5mes rau2mi 3raup 4raur 2rausb 3raus2c 2rausd rau3se 2rausf 2rausg raus8gewä 2raush 2rausl rau2sp 2rauss raus8sche raus5se 2rausv 2rausw rau3ße 2rauto raut1r rau4tra rau4tro raut5s 1raü r2ax raxi2 r3axt r2ay ray1o r2az räch2s 3r2äd 4räf rä1fr 4räg 2räh 4räm 3rän. 3räni 3räns 2räp 2räq 2r1är r2är. rä3ra rä1ro rä2sc räse2 räte1s 3rätse 4rätz rä2u 4räue räu2s räus4c räu7schen. 2räuss 2räuß 4räut 2räx 4r1b r2b3a2b1 r3bac rba4del rb2al r3bam r2bang r2bant rb1art r2barz rb1auf rbb2 rb1ech rbe3erf rbei3d2 rbe3inf rb3einh rbe3int r4belä rbel2o r3ben. rbe3r2e rber6gin rbe3rum rbe3sl r2bim r2binf r3bit rbit2a rbi3tu rb4la2d r2blan r8blasser r4b3last r3blat r3blau r2b3le. r3blen rb3ler r2bleu rb2lin rb2lö rb2ob r2bonk rb3ras rb3rea r8b7rechts rb4sam rb2sei rb2ser rb2s1o rb4stä rb2su rb2u rbü4b rby4t 2rc r1ce r1che. r1chen r1ch2i rch3l r3chlo rch3m rch3r rch4ro rch1s4 rch3sp rch3t2a rchter6r rch1w r1ci r2ck r1cl r1ç 4r1d rd2ac r2daf r2d1ak r2d1a2l rd2amm rdani1 r2dann rd1ant rd1ara rd1ark r2darz rdär2 r3de. r3dee r2dei rd2ei. r2d1elb r2de2le r2delf rdem6 rden3d r4dengl r4dents rde3ob rde3ono rde3r4er rderin6s r4d3ernt r3des rde3sp r2d1e2x r2d1inn rd1iri rd1ita r2dof r3don rd3oss rdo4st r2d1oz r2dö rd3rat r2drau rd3ris rd4rö r3d4rü rd2sän rd3s2k rd3s2z rdt4 rd3t2a rd3th rdt2s r2d1uk rdwa6r 1re 3re. rea2d rea6l5erw 4re2am re3at. re3ats reatu3 2reä re2b1a re2b1l reb1r reb3ra reb3so rech3ar 4rechs 2reck. 2recki 3red. re3da 4redd 2redi re2dik 3redn 3redu re1ebe re1el re1em ree4mi re1er 3refe 4reff r2eff. 3refl 3refo 3reg rege4l3ä regene7ra 4r1egg re3gi re2hac re2h1ar re4hen4e re4h3ent re2hi reh1l4 re2h1o re3hol 3rehö reh4th re2hü r2ei. r2eib rei4bel rei4ble r2eic 2reid r2eie 4reier. rei4fei 4reifel 2reig 3reigä 3reigeh r4eigel 6reigens 3reigi 4reign 3reigru rei3l2a rei3l2i 2r1eilt 3reim reim2p r1ein 2rein2a rei3nal 2reinb rein4du rei3n4e3c reinen5 2reinf rein4fe re4info 2reing 2reinh 4reinn 4r3einr 2reins 4reinsa rein6sel rein8s7tre rein4sz 2reint rein6teg re1in2v 2reinw 2reinz 4reisar 4reisb reises4 2reisf 2reish 2reisr reister6 4reisu 2reisw reit3s2 3rek 4re2ke 4rekk 5rekn 2rekz r2el. r2ela re3lat 2relb rel2e relea4 re5lei re2lek 4relem r2elev 2relf 2relit 2relix r2ell rel4lar rel4lei re3lo r2els 2relt relu2 3r2em. 2r1emb rem2da re2m1ei re3men 2remi re3mig 2rempf rems1c rem4str 2rem2u r2en. r2ena 2rena. re4nac re3nad re3nal re4n3an re2nä 2r1endg 3rendi ren3dr 4renerg 4rengag ren4gan 2rengp 3renh re2ni 3renm ren4nar ren6nene renrü2 ren6sein rens2p 2rentd 6rentera 2rentf 3rentfo 2rentg r3enthä 2r1entl 2r1ents 2r3entw 2rentz r2enz ren6z5er6f renzer6l ren6z5er6s renzer6w ren4z3in ren2zw re2ob re3or 3repe 4re2pen 2repi re2pis 2repoc 2r1e2pos 4repp 3repu 3r2er. rera2 2r1erb 3r4erber rer2bi 2r1erd rere2 4r3ereig r1erek re2r1ep r2erer r1erf r3erfa 4rerfah 2rerfi 2rerfo r2erfr rer2fü r1erg 4r3ergeb 5rergebü r4ergen 3r4erges 2rer2go rer2gr r4ergru r1erh rer2hö r1erk rer4kan rer2ke 4r3erken 3r2erki 3r2erko r1erl 2r3er2la 5r4erlag r3erleb r2erli 2rerlö 2r1erm rer2n 2r1ernä r1erne 2r1erni 4r3erns 4r1ernt re1ro re2rob re4rosi 2r1er2ö r1erre rer4reg rer4rei r1erri 5r2ers. 2r1ersa rer3sc r6erschi r2erse 2rersp rer2st r6erstad 2rer4su r1ert4 r2erte 2rertr r1erw 2rerwa rer4wac rer4wec r4erwes 2r1erz rer2zä 3r2erzy 3r2es. re2sa re4sam resche4 re4schw 3rese re4se2h re2s1of 3resol 3reson re2spa res2po 2ress 4resse res3sei res6s5erw 4ressu re1sta res4tas res6tent res4tex 2res4tu 3resu re2t1ak 2re2tap re2tau ret2e 2r1e2th re2tra re4trol re2u reu4eri reu3g2 2reul re3uni 2reur 4reuu 2reü 4r3eva 2r1evid rewa4r re2wi 2rewo 2r1e2x1 3rez 2rezi 1ré 4r1f rf1a2ck r3fam rfe2i r2fent r3f2es rff2 rf3fe rfi4le. r4fland r3f4lä rf3lic rf4lö r3flü r2fo2b rfolg4s r4frauc rf4ru rf4rü rf2sa rf4sam rf2s1ä rf2su rf2ta rft4r rf2u rfzu3 2r1g r2g1a2d r2g1ah r2g1ak rga4ner r2g1ap r2garb rg3art. r2g1ask rgd2 rge4an rge2bl r2g1e2c r3gel r4gelef rge4l3er rgen4z3w r4ge4tap r2geto rgi4sel r2glan r3glanz rg5le. r2gleu r2glig r2g3lit rg2log rg2lu r2g3na r2gne r2g3ni r2g3no r2g3oa r2gob r3gog rg3op r2g1or rgö2 r2g1öd r2g3ral rg4rau r2greg r2g3res r2gret rg3rin r3grun rg3rüs rg3sä rg3se rgs2ei rg4sel rg3s2i rg3sp rgs2pe rgs2po rg3st rgs4tr rgs2tu rg3su r1h4 2rh. r2hag 2rhah 2rhak r4haltb r3han 2rhau 2r3hä 3r2he. r3hea 2rheb 2rhef 2rhi 2rhol r3hop 2rhot 2rhöl 2rhs rhu2s 2rhü 1ri ri3ams ri1an ri2ano ria1s ri2ast rib2bl ri1ce ri1cha ri3chl richt8spo 3richtu ri2con ri2dau 2ride ri2d3e2l ri4dent r2i3di 2ridol 2ridy r2ie 4riefm rie2f3r rieg4s3 ri2e1i riein1 ri1el rie3l2a ri3els ri4enä riene2 ri3eni rien3s rie4nu ri1er. rie3r2e riere4n ri3ers. rie3sa ri1eu ri2f1a ri2fä ri2fei ri2fer rif6f5end rif4fer ri2f1o ri2fr rif3s rif4ter 3rig 4riga 4r3i2gel ri4gene 4rigg 5rigj rig1l ri4glä ri3g2o3 4rigr 4rij ri2kar ri2kä ri2kin ri2kn ri4kone rik2op ri2kor 2rima ri2mag ri2me. 2rimm 4rimp rim2s rim4sc rim4st ri3na r1inbe rin2c 2r1indu ri3n2e rine1i 2r1inf rin2fo 3r2infr r2ing rin2ga ring3le rin2gr ring3sp 2r1inh 2rinit 4rinj 4rink rin2kl rin2ko rin2kr 2rinl 6r5innenm 4r3inner 2r1innr r1innu 2r1in2q 2r1ins rin4si rin2so r4inspi 3r2insy 2rint 4rinte rin6tent rin4t5re 2r1inv rin2va 2rinz ri2ob r3ion ri3o2st ri2pl ri3po 4r1ir r2is ris2a ri3san ri4sch3o ri4schw 3risik ri3s2ko r3iso ri4s3p r3isr 3riss ri4s3t ris6t5ers ris4th rist3r r2it r3i2tal rit3ant rit2i 2ri3t4r ritt3a rit4tau rit6ter6f rit4to rit2t3r rit2u r1i4tum rix1 1rí 2r1j 2r1k rka2b3l rk1ah r2k1ak rk1all rk2am rk1are rk1asp rkauf4s r2k1äh r3kel r4kelem rke2n1 rken4er rken3s4t r2k1er2l rk5ersta r2k1er4w r3k2es r3ket rk1im rk4las rk4lau rk4lim r2klis rk2lo rk2lu rk4ne r2kob r3kol r3kon rk2op rk1o2ri r2kou rk2ö rk3räu r3kri rk3rin r2k3rom r2krou rk2sal rk2sei rk2sel rk2ser rk2so rk2sp rkstati6 rk4stec rk4stoc rk2ta rk2tel rk4t3eng rk4tent rk4t3erf rk4terg rk4t3erl rkt3ers rk6tersc rk4t3erw rk4t3erz rk4teta rkt2i rk2t3in rk4t1o2 rkto4b rk2t3r rk4tri rk2tum rk1ums rku2n r3kup rkur3s r3kus rku2sa r2küb 2r1l rl2ab r3lag r5land rlan4d3i r2l1ar r2l1a2sc r2l3aug rle2a r3lec r5lei. r3lep rl2et r3lex rlg4 r3l2i rli4ne. rli2s r3l2o rlou1 rl2ö rlös3s rls2a rl2spr rl3ste rl2s5to rl3t r3l2u r3ly rlz2 4r1m r2mab r2m1ad rma2la rm1ald rm1ami r2m1ank rm1anz r4m3aph r2marc r2marz rma4s3pe rmas3se rmat2o rm2är rm3d2 rm1ef r4m3einh rme4na rm2ene r2ment r2meo rmer4fo r2m1erh r2m1erl r2m1erp r2m1erw rm2es rme1st rmes4z rmeta2 r2mide rmi6nanz rminen4 rmi6neng r4mn r2m1ob rmon3s4 rm1o2ri rmo1s rm3p2 rm3sa rm3s2k rm3t rmt2a rmu2n r4muna r2muni 4rn rna2b r3nad rn4ade r3nage r2n1all rna4n rn4and rn3ani r2nanz rna2r rn3are r4n3ari r4n1ast r4n3att r2nau rn3aug rnd4 rn3de rn3dr r4nef rn2eid r4neif r4neis rn1ema rne2n r2n1ene rn2eng r4n1e2p r4n1erg rn4erhi rner4ke rner4ku r4n1erl r4n1ert r4n1erw r4nerz r5nes rn2e2t rnet1e rne4tem rne4ter rne4to rn2eu rne3uf r4nex rn3f rn3g2 rngene4 r2nid r2n1in r4ninf r3nit rnk2 rnn2 r3nod rn2oh r2n1op r2n1or rn1ö rnö2d rn3sa rn3s2ä rnse4ha rn3s4p rns2u rn3s2z rn3t2a rn3t2e rn1ur r1nü r1ny rnz2 r2oba 2robj 1robo ro2bo2r 2robr ro2bre 2robs ro1c roch2a 3rock. r2o3de rod4r roe4 2roff ro3fl 4rog. ro3g2a 3rogg ro2h1in roh1l2 4rohn ro2hö 3rohr 1roi ro3in ro1ir rok2l ro3le ro2liv rol4lan rolle4 rol6lerg rolls2 rol3s 2roly 4rom. ro2mad ro2mal 3roman. 2romb romen3e ro2m1er 4romm 2romn rom3s 4romt r2on ro3n4ab ro2nan 3rond ro4nerb 4ronk 3ronn rons2 ron4tan ron6tend ron4t3r ron2t1u ro1ny ro1o2f rop2a 2rope 2ropf 1ropl 2ropt r1or ro2r3al ro2rat 2rorc ro2rel ro2ro ror3th rort2s ror2ü ro3sh ro5s2i ros4ko ros4sal ros4san ros2s1c ros6senk ros4st ro1sta ros6t1r ro2sum 4r3osz 4roß roßen2 ro4ßenk ro2ßi ro2tan ro4tas ro4t3au ro2tä ro2te3i ro2t1ho ro2tru rot3s rots2o rot2ta ro3tu 3roul ro3unt 3rout 2ro1x 4roy rö2b3l rö2du 2rö2f 3röh 2r1ök 1röl 2röl. rö3le röl2l r1ölp 3römi r1ör r2ös. rös1c r2öse 1rösl 3rötu 2r1p2 r3pa r3pe rper3in rpf4 r2pli rp4lu r3po rpro1 rp3se rps3t r4p3t r3pu 2r1q 4r1r rr2ab rr4at rrat2s rr1auf rr1äm rrb2 rr1c r5rega r5regi rr2ei rre2le rre2pa rrer2 r2rerh r2rerl rrer4s r3res rre2ve r4rezi r3r2hen rr2hos r3r4i rri3k2 rrm2 rrn3au rr2o rr3obs rro3m rro2re rrr2 rr2st rr3str rr3stu rr2th r3r2u r3r2ü rrz2 6r1s r3sabo r2s1a2d rs2al r4samp r4s1amt rs2an r4sanf r2s3ang rs3anm r4sanp rs3ant rs3anz rs3ar rs4ark r4sarm r4sch3e4b r6scherl r3schu r2s1ebe rse2e r2s1ef r2sein rse2n rs2end rse4ne r2sepi rs1ere r2serh rs1ers r2serz rse2t rs1eta rs2ext r3s2hav r3shir r3sho rs2hor r4shu rs2il rs2ka rs2kel rs2ki r4skir rs2kl r4skor r3s4kri r4sky rs4mog r3s4no r3so r4sob rs4om r4s1op r4sorie r4s3ort. rso2s rs1ost rs2p r3span r3spe r2s3ph r3spi r3spl rs4por r2sput rs3s2 rst3abl r3stad rst3ala r4stale r4stans r4stant r2stas r7stati r7statu r3stä rst5eing r6st5eint rst3emi rs4temp rster2 rs4t4erb rst3erl r3s4tern rst3erw rs2tev rs2t1h rs2ti r3s4tie r2stin rst3ing r3stink r2stip r2stit r3sto rs4tob rs4tol rs4tor r4stot rs4tr r3stra r6strang rs5tren rs2tu rs4tuc r3s4tü rsuch4s r3suf rs2ums r3sy r1ß 4r1t r2tabo rt1abs rta2ck r2t1a2d r2t3ae rt1akr r4t3albe rta3l2e r2t1all rtal4s3e rt1am rt2ame rt1ann rt1ant r2tanw r2t1ar rt3att r2taut rt3äh rt1änd rt1ärm rte1e2 r3teh rt1ein rt4eind r4t3einh rte2i1s4 r2telf rtels4t r2temo rte2n1 rte4na rten3s4 r4t3ents rten3z rteo2 rt3erei r6tereig r4ter4fa r4ter4fo rt1erh rt1erk r4t3er4la rter6mit r4t3ernä r2ter2ö rter4re rt1ers rt4ersp rt1erz rte3sk rt1he r2thel r2t1hi rt2hum r2t1id rtik2 r2t1ima r4t3inf rt2is rt2it rt3l rt3m r2t1ob rto1pf rt1orc r4torg r4trak rt3rams rt3rand rt3rati rt3rec rtre1s r4t3ris rt3rol rt3roma r3trop r2trou rtrü2c rt3sc rt4s1eh rts2el rt3sex rts3ing rts1o rts1pa rt4s3tan rts4tie rt2su rt3t4 rt1umb rt2u3na r2t1urt rtu4t r2t3ute r3tü rty1 rt3z2 1ru ru1a ru4ale ru3a2r3 rube4 ruben3 rubens4 rub2i rucht3s4 ru6ckerl ru2cku rude2a ru2dr ru2et 3ruf ru2f1a ruff4 ruf2s ruf4ter ru2g3r 3ruhm 2r1uhr 3ruin ru3ins ru1is 2rum ruma2 4r3umd 4r3umf 4r3umg ru2mi 4r3uml 4r3umsa 4r3umw 4rumz 2r1una 2rund run4d1a runden5e run4d3er run2e runei2 4r1unf run2ga 2rungl 4r1u2ni r3unio ru4nis. run2kr 4r1unl 2r1unm 4runn 4runr r1unse 4r3unt 4runw 2rupd ru3pr 4r1ur ru2ra ru2r1e 5ruro r4us. ru2si rus2p rus2s1p rus4st ru2st ru2tab rute4 ru4tei ru4t1el ru2t1er ru4t1o2 ru2t3r rut6scha 4ruz ru2z1w 1rü 2rüb 4rübu rü1ch rü4ckel rü2hel rüher2 rüh1l 4rümm rün3z 2r1v r3ve rv2el rve4n1e rvenen4 r4ventz rve3s r3v2o 2r1w rwe4gel r3wei rwelt4s r5werk r5wert r2wo. r3woh r3wort rwun3s 4r1x 1ry 2r1ya ry2c rygi3 ry1la ry2le ry1os ry3sth rysti1 2r1z rz2an rz3ant r2zar r2zat rz2än r5zene rz1eng r4zents rze2p rze2ra r2z1erd r2z1erf r2z1erg rz1erk r2z1erl r2z1erw r2z1ess rz1id rz1int rzir3 r3z2of r2z3ot rz2tan rz3te rz2th rzu4g3l r2zwä r3z2wec r2zwir 1sa 3sa. 3s2aa 2s1ab sab2ä 4sabd sa2be 3sabet sa2bit sa2bl 4sabm sa2bor sa2br 4s3abs 3sac 4sacc 5sache sa2cho sachs2 sach3t s2ack 2s1ada sa2der s1adm 2s1a2dr 3safa sa4fe 4s3aff sa1f4r 3s2aft saf4tr 3saga sag2e 5sage. 5sagen. 4s3agent 2s1agg sa2gio sag4n s1a2gr s2ahs 3s2ai sa3i2k1 sail2 sai4r 2s1ak sa2ka sak2e 3saki 4sakk 3sako 4sakt 3s2al. 3s2al2a sa2l3an sa2lar sa3lat 3s2alb sal3bl 3s2ald sa4lerk 3sali sa2l1id s1all sal3la sal4le. 3sal2o sal3or sal2se s1alt s2al3t2h 3salz 3sam 4s1a2mat 4s1a2mei s2amen sa2min 5samm 6s1amma 4s1amn s1am3p4 4samph sam4ta sam4to samt3st s1an s2an. 2s3a2na san4at sa2nä 2s3anb s2an2c 3s2and s4and. san4dan san4d3ri sand3s sa2ner 3sang. 4sanga 2s3anh 3sani 3sanken 2s3anl 2sa2no 2s3anp 2s3ans s4anse san4sk san3sp 4santei 4s3antr 4s3anw 2sanz 2s1ap sa2pe s2aph sap3p 3sapr 2s1aq 2s1ar 3s4ar. 3sara 4s3arb 3s2ard s2are s3area 3sarg sar2ga sa3rin s2ark sa2rom s2ars 4sart sa4r1u2 3sas. sas2a s1asc s1a4si 2s1a4sp sas2tu 4sa2sy sat2a satan4 sa4t3ant sat1ei 2s3a4tem s3ath 3sat2i 4s3atl 4satm sat2o sa4tol sa2tr sa3ts s3atta 4s3attr 3satz 5satza sat4zel sat4z3en s1au 3sau. 3sauc 3sau2e 2sauf 4s3aufb 3saug saug3le sau2gr 3saum 3saur sauri1 2saus 3saus. 4s3ausb 4s3ausf 4sausg sau2sp 4sauss 3sauste 4s3ausw 2sauß s1av sa2ve sa2xi sa2y1 1sä 3säb 3s2äc 3s2äg s1äh 4s3ähn 3säl 4s1ält 2s1äm 4s3änd 4s3äp 2säq 2s1är 3s2ärg 3s2ät 3säul 4säuß 4s3b4 sba4ne sbau6men sber2e 1sc 2sc. 2scab 2scac 2scal 2scam 2scar 2scat 2s1ce 4s3cei 4sch. 3s4chal sch3ana 4schanc 4schang 4schao 4schara 4sch3ar5m s2chä 2schäq 4schb 4schc 2schd sch2e 4schech sche2f 6schef. 6schefi 6schefs s4chei 4sch3ei. sch6ein. s4chema 4schemp sch5erfü sch5erla 3sches 4schess 4schex 2schf 2schg 2schh schi4d schi4e 4schiru 3schis 2schk s4chl sch4lac sch4lag 4schle. 6schlein 4schloc 4schlöc 4schmas 4schmed 2schmö 4schmüh 2schmy 2schn. 4schneb 4schobj 4schorc 4schör 4schp 2schq 4schrad 4schre. 4schrin 4s3chris sch3rom 4schron 4schrou 4schs schs2e sch3s2k schs4ti 4sch3t scht2a scht2i s4chu 4schunt 2schv sch4web 4schweg 6schwerk 4schwet 4schwid 3schwu 2schz 2scj 4s3cl 2s3co 4scoa 3s4co2p scre4m 2scs 2scu 2scy 4s3d2 sda3me sde1s2 sdien4e sdi1st 1se 3se. se3at. seb2 3sebä 2s1e2ben 2s1echo sech4st 2s1echt 2s1e2ck se2dik 3see see1i2 see3ig se2el see3len se3en. see3n2e se3enp se3er. see1ra seer2e se1erf se3e2r1i se1erk se1ers see3s4 2s3eff sef4l 3s2eg 4s3e2gal se2gl seg4r 3seh seh1a se2hag se2hak se2hel seher4e se4herk se2h1in seh3l se4h3ö seh3ra seh3re seh5r2i seh1s se2hüb 2sei. 2s1eic 2s1eid. sei3da 4s3eifer 2s1eig 3seil s2eim s1ein 5s4ein. 2seinb sein4du 2sei3n2e seine3i 4seinfl sein4fo 2seing 2s3einh 2seini 2seink 2seinl 2seinn sein4ne 2s3einr s4eins. 4seinsc 4seinsp sein8stit sein6str 2seint sein4to 4seintr 2seinw 2s3einz 2s1eis 3s2eism 3s2eit seit2s 3sek 4s1e2kel 4sekz s2el. se2l1a 3s2elb sel3d4 sel1ec se2lef 2s3e2leg 6selektr 2selem se2ler sel3ers 2self. selin4s s3e2lit 2s1elix s2ell se2lob s2els sel3sz selt2e selz2 sem2e 2s1e2mis 2s3emp s4en. 3sena se4nad se3nal se4nas sen3au se2nä s2enb 4s1endl sen3d4r s1endw senen1 4senerg se4ners s2enf 3s4eni se2nid se2n1im 3s2enk sen6keli se2no se4nott se4noz 3sens s2ensa sen4s3e4h 4sensem s4ensi sen4si4d senst2 sen8s7turm sent2a sen3tä 2sentd 4sentf 2sentg 4sentla 2sentn s2ento sen3tr 4s1ents 2sentw 4sentwu 4sentwü 4sentz se4n3u2 sen3za sen4zer sen3zw seo2r se2pen 3seq s4er. se2r3a2d ser3al se3rand ser3äus serb2 s3erbe. serd2 se2r1e2b se3reie 6sereign se4r3eim se4rein sere2m 5s4eren se4r3enk s4erfe s1erfo s2erfr s3erfü 4serfül serg2 ser3ga ser3gl s2ergr s1erh 2serhö 3seri 5serie serk4 4s3ermit s2ern. s3erneu 2s3ernt sero4b 2s1e2ros s1erot s1erö 2seröf s2ers. 2sersa 4serseh ser6sehn 4ser4set se3ru se4ruh ser2um s3e4rup 5s4er3v s1erz 3s4es. se3s4a se2sel se3sk 2s1essa se1sta se3stec se3stei se5stemp sest3ri se3su 4s3e4tap se2tat 2s1e2th set2i 4s1e2tik 3setz 3seuc 2s1eul seum4 se1u2n s1ex 3sex. 2sexa se2xe sex3en s2exi s2exo 4sexp sex3t4r 2sexz 1sé 4s3f4 sfal6l5er 4s3g4 sgang4 sge3sa sge5t 2s1h 4sh. sh2a 3sha. shal4li shalt2 shalt4s 4shan s3hä sh2e sh2i 3shi. s2hip shi4r sh3n 4s3hoc 4s3hof 4shom 3shop sho4re 3s4how 4s3hö sh4r2 4shs s3hu 1si 3si. si3ach. 2siat 5s4i1c si2cha 2s1idea 2sidee 2s1ideo si3der s2i3do 2sidy 3s4ie sie2bu siege4s sien3 si3ene si1err si1f4 3s4ig si2g1a2 si2g1ei sig4n si2g3r sig4st si2k1ab si2kak si2kar si2k1ä si2k1el si4kens sik3erl si2k3i sikin1 si2k3n si2k3r sik3s sik3t2 si2ku 3silb sil2br sil2e 3sili s1ill 3silo 2s1imm sim4st 3simu si3n4a 2s1ind 2s1inf 4s3infe s3infor sing1a sin3g4le sin2g3r sings2 sing3sa sing3so 2s1inh s1in1i sini1e s2ink sinner4 2s1inno 4s1inq 2s1ins 4sinso 4sinst 2s1int 4s1inv sion4 sirn4 2sirr 3siru si2sa si4sam s2isc si4schu si2s1e2 si2si s1i2so sis1or si2s3p sis3s4 3s4ist si2su 3s2it si2tal si2tau si2tra sit2u si2va sive3 siver2 si4v3erf si2vin siv1o4 si2vor siz2 1sí 4s3j 2s1k2 4sk. sk4a 4s3kab s3kad 4skalk s3kalt 4s3kam 4skana 4skanä 3skanda 4skann 4skap 4s3kar 4s3kas ska4te. 4skateg ska4tes ska4to 4skau 4s3kä 4skb ske2li 4sken 3skep 4sker 4s3ket s3kh 3s2ki. 3s2kif 3s2kik s3kim s3kin ski1s s2kis. 3skiz sk4l 4s3klas 3s2klav 4s3klu 4sk4n 4skoh 4skol 4skom 4s3kon 3skop. sko2pr 4skos 4skow 4s3kö sk4r 4s3kra s3kre 4s3kro 4sks 4sk3t2 skto2 3skulp 4skun sku2s1 4skü 4skv 2s1l2 sl4a s3lab 3slal sla2ma sla2ve s2law s3lä sl3b 4s3le sler3s s3li 3s4lip slo3be s3loc s4loga 3s2low s3ly 4s3m4 sma3b4 sma3sc sme3na smi2t3 2s3n2 snab4 sni4a sni3er. sni3ers 4s5not 1so 3so. 2s3oas 2s1o2b 3s2o3ba 4sobj 4s3obo so1c so2di so2do so3et 2s1o2fe 2soffi 3soft 3sog sog4l s1o2he 3sohl sohle2 2s3ohng 2s1ohr 3soi2 so3id 2s3ok 3sol. so3la so4lau 3sold 3sole so2l1ei so3li sol2la sol4ler so3l2o 4s3o2ly 3somm 3s2on son2a son3au sone2 son4gl son3sä son2s1o so3o 2sope 2s1opf 3sopr sop3s 4s3ord sore2 so2rei so2rel 4s1orga so1rh 2s1o2rie so2ro 3sorp 3s2orti so4ru 3sos s2os. 4so4sk 4sosm 4so1st 4s1osz 3so3ß 2sot so3t2h 3sott soun2 sound1 so3unds so3unt 2s1out 3sov 3sow 2s1o2x 3soz s1oze 1sö sö2c 2s1ö2d 2sö2f 2s1ök 2s1öl 2s1ös 1sp2 2sp. 4spaa s2pace 2spack 2spag 2spak 2spala 2spalä 3spalt spa2m s2pan. 3spannu s2pans 3spant 2spanz 2spap 2s3para 2sparo 5s6parten 4spartn 4sparty 3spaß 3spat. 2spati 4spatr 2spau 3s2paz s2pä 2späd 3späh 2spär 2späs 2s3pe. 2speg 4spein 4spensi spe3p4 s2pera 3s2perg s1peri 4sperle 2spero s2perr 2spers 2sperü 4spet 3s4pez 4s3pf4 2spha s2phä 3sphär s3phe s4phin 3s2pi4e 4spier spier4r spi2k 4s3pil 3spio 4s3pip 4s3pis 2sp4l 4spla 4s3plä 4sple sp5le. 3s2pli 4s3plu 2s3pn 2spod 4spoe 2spog s2poi 4s3pok 4spol s2pons 4spoo 2spop s2pore 3s2porn spor6tag 4s3pos 4spote 4spr. 3s2prac 2sprak 2sprax 2spräm 4spräs 3s4prec 4spred 4spreis 5s2pren 2s3pres s2pric 3spring 4sprinz 2sprob 2sprog 4sproj 4sprop 3spross 2sprot 2sproz 3sprö 3s2pru 3sprüc 2sprüf 3sprün 4s3ps 2s4p3t 2spub 2spud 3spuk 3s2pule 2spun 2spup 3s4pur spu4rer 2spy 2s1q 4s3r4 srat2s sre3cha sreli1 sro2h srö2s srücker6 6s1s ss3abi ssa3bo s5sack ss4agi ss1aj s3sal ss3alba s4sall s4samt s2sanf s4sang s4sano s4sans ss2ant s4sanz ss2ara ss2arg s3sars ssa1s s2s3att ssau3e ssau4r s3s2ä s4sce ssch2 sschanker8 s3schw s4sco s2scr sse3a ss1ec sse1ec sseh2a s2sein ss4eind sse3int sse2lö s3sen ssen6kel ssen6sem ss1epe sse6ratt ss5ereig ss4ergr sser4hö sser6mit sser4öf ss3erse ss4eru sser6wei sses4sa s4s3estr s3set sse3ta s3si ss3i2ko s4sill s4simp s4sind s4sinf ssing3s s4sint s4s1isr s3skala ss3l ssmut4 ss1off ssoi4 s3sol s4sop ss2pen ss2phi s3spi s3sprä s3spri s2spro ssquet4 ss3s4 sssau4 sst2a s3stad s4stag ss3tak s3stä sst2e s3stel s3s2tep s3s4tern ss4teu sst2i ss2tie ss2t3in s3stof s3stop ss4tör s3stran ss4tras s3s4trat s3strec s3strom s3strö ss2tur s3stü s2sumg s2sumr ss2ur s3sy s1t 4st. s2ta 2sta. 3staa 3stab. 2stabb 4stabel 4stabit 2stabl 4stabt st2ac 1stadt 1staff 2stag 3stagl 3s4tagr 3s4tah 2stak 3staks 2stala sta3lak 2stalb s3ta3l2i 2stalk st1alp st1alr st1ami 1stamm 1stan 2stanb s6tand 2stanf st2ang 2stanl s4tanm 4st1ann s4tano st3ansp 2stanw sta3po1 stapos4 st1app s4tar. sta6rens 4stari s4tark s4t2ars s4tart sta4sie stast4 s3tat. 2statb 3stati s4tatis 7statth s4tau. 2stauf 3s4taur 4stausb 4stausg 4stausr 4stauss s4taut s4t1a2ve 4stax 1s2tä 3stäb 3städ 4stäg 4stäp 5s4tär 3stätt 2s3täus 2stb 2st3c 2std 4s5te. 4steam 4stechn s2te2d st1edi 2stee 3s2teg ste2g3r 1steh s2tei st4ei. 4steic st1eid 3steig stei4gr 2steil stei4na 6steinga s4teins stein6sp s2tel 2stel. st1elb s3tele s3telf st2ell stel6l5än 2steln 2stels 2stem ste4mar ste6ment 3stemm 2sten s5ten. ste4na s4t3ends s5t2ens s4tentf s4tents st1e2po 2ster 4s5ter. ste2r3a s6terben 3sterbo s3teren 3stereo st3erfü 3steril 4sterm 3s4ternb ster4zo 4ste2s1 ste3sc stes4se s4testn 2stet ste4tab ste4tag 3s2teti 3s4tett 3s2teu 1steue 4steuf st3eun st1ev s2tew 4stex s2texa 2stf 2stg 2sth st2hen s2t1hi st3ho s2thu st1hy 2stia 2stib s2tic 1stich st1i2d 2stie. 4stief. 4stiefl 2stien 1s2tif 2stig sti4gel 3s4tigm 2s3tik s2t2il 1s2tim 3stimm 4stimma 2stimp st1inb 2s4tinf s3tinn s2tins 2s2tint 2stio 2stip. 2stipp s2ti2r st1ira st1iri st1iro 4stis 2stite 1stitu 2stiv 2stj 2stk 4stl st3le 2stm 2stn s2to 2sto. sto2bl 4stocht 2stod 4stod. 1stof s4toff 2stok 4stole s4toll sto3mi 2s3ton 4stona 3s4to4ne 4stonl 4stoo 2stopo 4stor. s4torb 2store 2storf 2s4torg 2stori 2storp 2stors 2stort stos2t 1stoß 4stote 2stotr 4stou 2stow 2stoz 1s2tö 4stöch 2s3töl 2stön 3stör 2stöt 2stp 2stq s2tr 2strac 4s3trad st4rade stra4fa 4s3trag 3strah 4strahi 4strai 4strak 2s5tral s3trank 4strans 1strap 3stras 3straß 4straum 4sträc 4s5träg 4sträne 2stre. s4trea 4stref 4streib 3st6reif 2strep 2stret 4streuh 2strib strie3s4 2s4trig 1s4trik 2s5tris 1stro s3troc s3trog 3s4troh s4trome 4stropf 2stros st4ross 2ströp 1stru 2strua 2strub s4trud 3struk 2strun 4strup 2strut 1strü 4s4t3s2 stsi4d sts4t 2st3t4 st2u 1stub 4stuch 3s4tud 2stue 3stuf 2stug st3uga 3stuh s2t3uk 2stumo 2stum2s stum4sc 2stumt 2stun. st3una 5stund 2stune 2stung s2t3uni 4stunn 2stuns 2stunt 2stuö stu3ra stu5re 2st3url 4sturn 2st3urt 3s2turz 2stus 1s2tut 1stüc 4stüch 3s4tück 3stüh 4stür. 4stüre 3stürz 1stüt 2stütc 2stv 2stw stwor2 2sty 4sty. 1s2tyl 4styp 4stys 2st3z2 1su su1an 3su2b3 su4ba 4subi su4br 3su1c su2cha su2cho 3sud su2eb 2s1u2f su3fi 2s1uh su1is su1it. su2k su3l2i 3sulta sum1a su2man su2mar 3s2ume su2mei su2mel sument4 su6ments su2m1et 2s3umf su2m1id su2min 3s2umm sum1o2 su2mor s2ump s1ums s3umsa 2sumse s2umsp 2s3umst 2s3umwa su2n 3sun. 2s1una sunder4 sun6d5erh su4ne 2s1unf 6sungena 2sungl sung4s 4s1uni 2s1unm 2s1uns s4uns. s4unst 2sunt 2sunw s4unwa 3sup 4supd sup3p4 su2ra sure4 su2rei su2rer 3surf 2s1urk su2r1o 2surs s1urt su2s su3s2a sus1e sus3i s3u2t su4te su3tr 3suv suz2 1sü 2sü4b 3süc sü2d1 süden4 3süf 3sün 3s2üs 3süß 4s3v2 svoran4 2s1w 4s3we swe6gers sweh2 4swie 4swil 4swink 4swis 4swit s3wü 1s4y 2syl1 sy2lo sy2lu sym3 sy2n3 3synd sy4no 3sy4s3 2s1z2 4s3za 4szä 4s3zei 4szel 3s2zena 3s2ze3n2e 4szent 4szer s2zes 4szet 4szeu 3s2zew 4s3zie 4s3zo s3zs 4s3zu 4s3zü 4szw 2ß3a4 2ß1ä 2ß1b4 2ß1c 2ß1d2 1ße 2ß1e2b 2ß1ec 2ß1ef 2ß1e2g 2ß1ei 2ß1ek ße2la ße2le 2ßelek 2ß1emp ße4n3a2 4ßenerg ße2ni ß1enke ße2no 3ß2ente 2ßentz 2ß1e2p ßer3b ßer2ei ßer2la 2ß1er4se ßer3t ß1erw 2ß1es2s 2ß1est3r 2ß1ex 2ß1f4 2ß3g2 ßge2bl 2ß1h 1ßi ßi2g1a2 ßig4s 2ß3i2k 2ß1il 2ß1im 2ß1in 2ß1j 2ß3k4 2ß1l ßler3s 2ß1m ßmut4 2ß3n2 2ß3o2 ßos2 2ß1ö2 2ß1p2 ß1q 2ß3r2 ßrö2 2ß3s4 ßsau4 ßsch2 ßst2 2ß1t ßt1in ß3tü 2ß1um ß1unf 2ßunt 2ß1ü4 2ß1v 2ß1w 2ß3z2 1ta 3ta. 4taa 5taan 4tab. 3taba ta2b3an 2t1abb 4tabd 3tabel 2taben 2tabf 2tabg 2tabh 2t3a2bit 2tabk 2tabla 4tabm 2t3abn 2ta4br 4tabs t1abst 2t3abt 3tabu 4tabw 4tabz 2t1ac 4tachs 3tacu t1ada 2tadd ta2der tadi3 tadi5o4 t1adm ta2dol 2t1a2dr ta3d2s 4tadt tad4tr ta2er 3taf. 3tafe 4tafet 4taff t1afg t1afr 3tag ta2ga ta2g1e2i t3agent tage2s 4t1agg 4ta3gl 4t1a2go tag4san tags3c tag4st tah2 tahls4t ta3i2k tai2l1 ta1ins tai4r ta1ir. ta1i2s 2t1a2ka ta3kes 2t1akk ta2kro tak4t1o2 t2aktu 2takz 3t2al. ta2la ta3lad ta3lag tal3au 3talbr tald4 3tale tal2en ta4l3end tal3eng ta4l3ens taler2 ta4ler3g ta2let tal2ga tali6ene tal4l3ac tall3ei tal2l1ö4 tall3s2 2t1alm. 3talo ta2lop ta2l1o2r t1alta tal3th talt4r ta2lu 2tam 3tam. 3tame t2amen t1a2mer ta2mi tamm1a tam4m3er t1ampl 3tams 4t1amt t1a2na tan3ab 4tanal ta4nat 2t1a2nä 2tanb 3tanc tan3d4ar tan2d3r tand4st ta4nerf 4tanf 2t1ang 3tang. t3angeh t2ango tan4gra 2tanh t2anho t4ani 3tanj 3tank tan2kl 4tankr 4t3anl t1anm 2t1anna 3t2anne t1ano 2tanom 2tanp t1ans t2ans. 4tansi tan4tan t4ante. 4tantei 2tantr 2tanwa 2tanwä t2anz. t1anza 4tanzei 3tanzk 3tanzr 2t1anzu 2tanzü tan2z1w tao2 ta3or t4ape ta2pes 2tapf ta2pl ta4poka t2appe ta2ra 2tarab 3tarabb ta3rak 3tar5al 2taram tar3ap ta3ras t2arau 2tarb 3tarba 3tarbek 3tarber 3tarbi 3tar3bl 2tarc 3tarchl 3tarchr 3t2ard ta2rel ta2r1er tar3g ta1r2h 3tari 2tark 3tark4l 3t2arko t2arl 2t1arm t2armä ta2rom 2tarot 2tart 3t2arta 3tartei tar6ter6e 3tartex 3t2arth t1arti 3t4artis tar4to tar2tr 3tarty ta2ru t1arz 2tarzt 3t2as. ta3s2a 3tasc 4t1asp 2t3assi 3tast tas4tem tas4to t2asy t4at. ta2ta2b ta2tan 3tatb t4ate tat1ei t5a2tel ta2tem 3taten ta2t1er 2t3atl 2tatom 2ta2tr 3tatsa 2tatt tau2b1a 3taubh tau2bl tau2b3r tauchs4 tauch5sp 4taud 2t1auf 3taufe. 4taufk 4t3aufl tau3f4li 4taufm t3au2f1o 4taufp taufs2 4taufw 3taug 4t3auge t1auk 3taume 4t1ausb 3tausc tau6scha tau6schm tau6schr tau6schw 2tausd t2aus2e 4t1ausf 4t3ausg t1ausk 4tausl 2tausr 4t3auss 2tausü 2t5ausw 4t3ausz 4tauu 3tav 4tava ta2van 3tax 4t1axt 3taz 1tä 2tää 4täb tä1c 4täd t2äf 3täg 4tägä 4tägy 2täh 4täll 2t1ält 4tä2m t1ämt t1ängs 3tänz 4t1äp 2täq tä4reng tä2ru 2tärz tä2s t2ät 3tätigk 4tätt 2täug 2täuß 2täx 1tà 4t3b4 tbauer4 tber2e tblocken8 tby4t 4t1c t3cha t3che tch2i tch3l t3chr t2ch1u tch1w t4ck t3cl tcor2 t3cr 4t3d2 tdar2m1 tdun2 1te 3te. te2a2 te3ab tea3c te3ag 2teak te3al 3team te3an te3ar tea4s 3teba t4ebb 2t1e2ben t2ech 2techd 2teche 2techk 2techm 3techn 2techt te2chu 2teck te3cker te2cki 2t1ecu te2dit te1em teen1 te2er. te1erw te2es 3tefa 2teff 2t1egg 2teh 3teha te2hac 3tehä 3tehi te2him 3tehö t1ehr te3hu 3tei. 3teic tei1fl 2teign teik4 3t2eil tei6lent teim2 2tein teinen4 tei6nens tein6hab t3einkü 2t1eis. t1eisb te5isch. teit4 t1eiw tei3z te2kel 3teko tekt4 3tel. 3te2la tel3ab tel1ac te3lan te4lant tel1au te2lä telb4 3telbr 3tel3d4 tel1ec tel3ehr 2telem tel3eng te2ler tele3s te2leu 4t3elf. 3telg 3telh tel1in te2lit 3telk tel3le tel6lein tel3li 4tellu 3teln te2lob te3lom te4lost te2l1ö 3telp 3tels tel3s2k 3telt4 tel3ta 3telw 3tem. 3t2ema te2man te2m1ap te2mau 2tem2bo te2m1ei te2m1er te2mi tem3i2m tem3ing 2temm te2mo tem1o2r 3temper 2tempf 4tempfi tem3s6 te2mu te4mun 3ten t6en. ten1a2 te4nad te4n3an ten3ar te4nas te4nat ten3au te2n3ä ten3da 4t3endal tend4an 4tendap 4t5endf 4t1endl t6endo 4t5endp ten3d4r te2n1e2b te2nef te2neh ten3ei te3n4ei. tenei4d tene4m tenen1 te4n3end te4nene te4neng te4nens 4t3energ te4n3ern tenf4 4t1eng. teng2a ten4gag 4t3engla te2ni te4nil ten1im te4n3in tenk4 ten3n2 te2nol te2nos te3nö 6t3ensem tens2p tens3th t1entb 4tentd 4t3entl 4t3entn t1ents 4t5entw 4tentz t2enz ten4z3er teo2f 2tep. 2t1e2pi 2teppu tept2 3t4er. t4era ter3a2c te2rad te1ral ter3alg te3r4ane te2r3ap tera4s 4terbos 2t1erbs 2t1erbt 3terc 4t3erde. ter3d2s 3tere. te2r1e2b te2rec t3ereig te5rek 3tere2m te4rema te4r3end te4rene te4reng te4r3ent teren5th 2tereo 3terer terer3k terer6ku terer3l te4r3erp te4rers te4rerw 3teres t4erfr terg2 ter3ga 6tergebn t6ergem t6erges t6ergew ter3gl 6tergrei t4ergru t6erhall t6erhau t4erhäu t4erhei 7t2erhi t2erho 6terhöhu t2erhu te3ria 4terii ter3iko 2teril teri4o te2r3it teri4ta 4terklä t4erlä t4erli ter4lös 3term t2ern. ter4nar 2t6ernc t4ero te1rob ter4obe 2teros t1e2r1ö t4erp t4erra ter4re. t4erro t4ers. t2erse t4erst. t6erstad ter6stat t4erstä t4ersti t4erstr t4erstu t4erstü tert2 ter3ta ter4trä t4eru2 te4r1uf te3rung t4erv 4t3erwäh ter3z2a 2t1erzb t4erzei 4terzeu ter3zw 3tes t2es. tesa2k tes2c tes2ka tes4pen te2spr 2t1essa tes3tan te3stei tes4tel tester4 tes6terg tes6t5erh tes6terk 2testn testo3 t3est3ri te2su tet2 3tet. t1eta te4tabl 2te2tap 2te2tat 3tete teten3 2t1e2th te3tho 4tetl tet3ti 3teuf 3teum 3te1u2n 4teunu 2t1eup 3teur. te2va te2vi tewa2s 3tewo 2texam 2t1e2xe 2t1e2xi 4texp tex4ta 2t1exz tè2 4t3f6 4t1g2 tga4s3er tga2su t3ge tge4nen3 tger2a tger2i tg4r 4th. 2t1h2a 3tha. 3t2hag 4thak 3thal. 3thalh t4hali t2hals t2han. t3hand t3hap 4t3hau 2t1hä 3thäi 4thäl 2thb th2e 1the. 3t4hea 2t1heb 2t1hef 2t1hei the1in 4theit t2hek 3thema 2themd 2themm 1then t1henn 3theo t1herd thero1 t1herr 2t1herz 4t1hess t2heu 2thf 1th2i 3thi. thic3k4 thi3er. 2t1hil 2t1him 2t1hin thi3nu 2t1hir 2thk 2th3l 4th3m thmu2 2th3n2 1tho 2t1hob tho3chr t1hof 2t1hoh t1holt 2tholz t2hon 4thops tho1s t1hose t1hot 4thote 2thou t1hov 4thö 2thp 1th2r2 2ths 2tht2 t1hu 2thub 2thuh 4t3hun 2thut 2t1hü 2thv 1ti t4ia ti3ac ti1ag tial2l ti3alo ti1a2m 3tib 3ticc ti1ce 3ticket t2id. 2tidee ti4d3en4d ti3dy 3tief. 4tiefel 3tiefl tie2fr 2tieg4 2tieh ti2e1i ti1el ti2el. tiel3a ti3e4n1 tien3s 3tier tie4rei tie4reu ti2ern tie3s2t 2tieß ti1eu 3tif. ti3fe ti1f4r tifter6k 3tig ti4gerz ti2git tigs4tr tih2 3tij ti2kam ti2kar tiken2 ti4kent ti3k4ere ti3kerl ti2kin ti4klu ti2kn ti2kop tik1r ti2kra ti2krä ti4krei tik5t ti2lar til3d ti2lei ti2lel 3tilg 2tillu ti2lö tilt4 ti2lu ti2ma2g tim4man t3immat timmer4 tim6merg 3timo 2timp tim2s 3tin. t4ina ti3naf ti3nak ti2n3an t1ind ti5n2e tine1i 2t1inf 3ting tin2ga ting3l ting3s 2t1inh 3tinis t1in1it t1inka tin2k1l tin2kn tin2kr t1inku t2inn ti2nor t1ins 3tins. t3insa t2insä 4t3inse tin4spa tin4sum t1int 3tinte. ti3nu tin2um 4t1inv 3tio ti2osk tioxi3 3tip. 2tipe ti3p4l 3tipp 3tips ti4que. 3tirad ti1rh ti4ron 3t2isc ti6schei ti4schu tisch3w ti2sei tis2el ti3sk 2t1isl t1iso ti2sp t1isr tiss4 ti3s2th tis3ti ti1s4tr ti2s1u t1it2a ti2tal 3ti3te ti1th 3titi 2ti3tu 3tiu tium4s 3tiv ti2van ti2vel ti4vene tiver2 ti4verh ti4verk ti4verl ti2v1o ti4v3r ti2za ti2zir 2t1j 4t3k4 4t1l2 tlan2g tl4e t2lef tlei6der tle2ra 6t3li tlings5 tlit1 t3lo t5lö tlung4 4t1m4 tmal2 tma2st tmen8schl tmen6t5 tments4 t3mo tmo4des 4t3n4 t5na tnes2 1to 3to. to4as to5at t2oba 4tobj tob2l t1obs 3tobt to1c t3ochs 3tocht to6ck5ent 3t4od tod1er2 to4dun tof4fa tof6f5ent tof4f3er 2toffi toff3s 3tog 2t3ohr 3toi 4toi. toi4r 4toiz 5toj 3tok4 3tol to3le 4tolp 4tolz tomar4b to4mene 3tomi to2min 3tomo to2m1u to4mun to2nan ton3au tond2 to2n2eh toner6ke to2nob 2tony 3too 3top. to2pad to2pak to2pan to3pas to2pat top1hi 3topo 2to4pt 3tor t4or. tora2g to4rän 4torc t1ord t2ordi 4t3ordn t4ore to2rei to2rel to2rem to6renna tor4fan t1or3g 4torga t5orient torin4s tor3int 5tork to2rö t4ors 4t1ort. tor3t2a t1orth 4tortn 4tort2s to4ru to3rü to4rüb 4tory to3sc to3s2e to3s2h to4ska to3s2p 4toss 3to1st2 4toß to1ßu to2tä 3tote to2tho 3totr tots2 5t2ou touil2 to3un 3tow to1x 3toz 1tö 3töch 4töck 2t1ö2d 2tö2f 4t1ök 2töl. 3tön t2ör t1öst 3töt 2t3p4 tpf4 tpi2n 2t1q 1t2r4 2tr. 5tra. 3trac tra3cha tra3chl 2t3rad. 2trade tra4dem 4t3radie tra4fah tra4far t4rag 3trahi 4trahl 2trahm 5t4rai 3trak 4t3rake t4rakt 3tral tral3l 3t4ran. 4trand 4trang t3rann 5t4rans tra2st 4traß 4traub. 4trauc t4raue t4rauf 2traup 4trauß 5träc 2träd 3träg 3träne 4träng 4träs 4träß 2träuc 4träus 4träuß 4t5re. 2trea t3reak 4treb tre2br 4trec t3rech t4reck 5treck. tre5cke 2t3red 3tref 4trefe 5treff 4trefl 4trefo 4treg t3reh t4rei. 3t4reib 4treic 4treif 2t3reig 2t3reih 2treim 4t3rein 2t3reis tre7isch. 4treit t3reiz 2trek 4t3rel t4rem t4ren. 3trend 4trendi 3trennu t3rent 2trepe 2t3repo 3trepp t3repr t4rer 5t4res. tre2ta t4rete tret3r 2t3rett 3treuh 4t3rev t4rex 4trez 5t4ré 2t3rh 3tri t4rib 4tric t4rick t4rid2 5trieb trie3fr tri4ena tri2er tri4ers trie1s 4trig. 5trigg tri3gl t4rik tri4ke. tri4kes 5triko 4t3rind 4tring tri3ni 4t3rinn t4rip 4tript 4t3riv tri2x trizi1 5tro. tro3b4 4trock. 3troe tro4kes trol4la 6trom. tro4men tro2mi 4tromk 4troms 4tromv 3tron tro3na t4rop tro1pe 3tropf 5tros. tro5sm 3trost t1rot. 2trout 3troy 4t3röc 2tröh 6tröm 3tröp 3trös 4t3röss 3tröt 3trua 3trub 2t3ruc 4truf 4truk trum2 t3rumä trums1 t3rund 3trunk 5t4rup t3russ 2trut1 tru2th 4truw trü1be trü1bu 2t3rüc trücker6 t4rüg 3trümm try1 2ts 4ts. ts3ab t4sachs t2s1a2d ts1ahn t2sall t2salt t4samp t4s1amt t2san ts3ane tsa2r ts3are ts3ari t2s1a2s3 t2sau ts2av t2säh ts1än ts1äus t4scham t6schart t3sche t4schef t3schl tsch4li t4schro t3schü ts4cor t2s1e2b tse2e t2sef tse4he. ts2eil t3seme ts1eng ts2ens t2s1ent t2s1ep t2s1er t6s5essen tse2t ts1eta t2s1eti t2s1e2v t2sex t3sexi ts3he t2s1i2d t2s3i2k t2sim tsing4 t2sini ts1ir 4tsk t3skal ts4kele tski2 t4s3ko t1slal ts1off t2s1op tso2r ts1orc t2s1ori ts3ort. t2sö t2spac t2spal ts1pas t2spat ts3pate t2spä t3sped t3spei t3s2pek ts4pend t2sph t3s2pi t4s3pic t4spins ts3ple t2spo t3s2pon t3s2por t2spro ts2pul ts2put ts3s4 4t1st4 t4stabe t2staf t4stag ts3tak t4stale t4s3tanz t4stas t4stat. t4s3täti t2stea t3stein ts4terb t3s4tern t3s4tero t4sth t3stif t3stim t4stit t4stoch t4stoi ts4tol t4ston t3strec t4stren t4strie ts2tu t5stub ts4tüm t4sty ts1u t2su. 5tsubi t2sumg t2sums t2sumv t2sumz t2s3un tswa2s t3sy 4t1t tt1ab tt2ac tt3achs tt1ad tt2ag tta6g5ess t4t1ah tta2ke tt2al t4tan4a t2tanm tt2ant t4t1ap tt1art tt3atr tt1äh tt1ebe tt1eif tt1ein t2t1eis tte4l1a2 tte4l3e4b tte4len tte4lin ttel1o ttels4t ttel5ste t2temu tte4na tten6sem t4tentb tten3te t4tentf t4tents tten3z t2teo tt4ere tt3erfo tte4rik tte2ro tt2erö tt4es1 tte4s3a2 tte4s3ä2 tte2so ttest4r tt2häu tt1hi t2t1ho t2ti4d t4t3igi t2tins tt2int t2tiso t6t3la t4torg t2trou tt3rü ttschi4 tts1eh tt2sen tts1p tt2spe tt2spr tt4s3tät tt2sum tt3s2z tt5t2 tt1u2f t3tü tt3z2 1tu 3tua tu4ale tu1alm tu1alv tu3ant 2tub2 tuba3b 3tuc tu2chi tu1cho 2tud tudie4n3 3tue tu2ere 2tuf tuf2e tu3fen t3u2fer 3tuff tu2gan 4tuh tuh4ler tu1ist tu2kr tul2i 3tum. tum2b5l 3tume 4t3umf 2t3umg 2t1umh 2t3umk 2tuml 3t2umo 2t3umr 4t3umsat 2t1umsc tum2si tum2so tum4s5tr 2t3umt 2t1umw 2t3umz 3tun. 2t1una 2t1und tund2e tun2en 2t3unf 3tung t3unga tung4s5 2tunif 2tu2nio 2tuniv 2t1unm 3tunn t1u2no t3uns 3tuns. 4t3unt 2t1unv 2t1up. t1upg tu2r1ag tu2ran turan4l tu2ras tu2rau tu2rä tur1c tu2r1e2b tu2rei tur3eis tu4rene tu2r1er tu4res tu2re4t tu2r3e2v tur3f4 tur3g2 tur1in1 tur4mun 3turn tu2r3o tu4ru 3tus tu2sa tu4schl tu2se tu2so tu3t2a tuto5 tuto3re 2tü 4tüb tü3ber. 3tüch tück2s 3tüf 4tüh 3tüm 3tür. tür1c 3türe 3türg 3tür3s 3türw 4türz 3tütc 3tüte 4tütz 4t1v2 t3vo tvoran4 4t3w4 t5wa2 twi4e t4wist 1ty 2t1ya 3typ ty2p1a ty1s2 2t1z t2za2 tz1ag tz3ar tz1au t2z1ä t3zäh tz1ec t2z1e2d tz1ehr t2z1eie t4z1eis tze2m tz1emi tze4n1 tz2ene tzen5s4t tzen3ta t4zentg t4zentl t4zents tze4reb tzer6gre tz1erw tz2er3z tz3erzi tze2s3 tz1e2t t2z1i2d tzi4m tz1imi tz1int tz1inv t2z3om t2zop tz2th tz4tin tzu2gu t2zuni tzwan4d3 tz1wä tz1wi t3zwie tz1wu 2ua u3a2b u3a2c ua2dan uad4r ua2g u1al. u1a2l1a u1a2l1ä u1alb u1ald u3aleb u3a4lent u3aler2 ua4lerg ual3erk u3a2let u1alf u1alg u1alh u3a2lid u1aln ua2l1o2 u1alp u1alr u1als u1al5t4 ua2lu u1alw u1alz u1am uan2a u1ans u3ar. uara2b u1ars uar4t3an ua3sa uasi1 ua2th uat2i uat2o u3au u1ay u1äm uä2s u1äu 2u1b u2barb ubb4l ube2be ube2e u2b1ehe u4b3eins u2b1e2m ube4n1a uben3o ub2er u4b3erde ubert4 ub4es ub1eul u3bit ub2l ub3läu ub3lic ub3lu ub4lut u2bob u2bop u2boz u2b3rit ub4rü ub2san ubsau2 ub4s3che ub2s1o ub2sp ubst2 ub3t2h 4uc uc1c uch1a u1cha. uch1ä u1che uch1ec u2ched uch1ei ucherin8t u3ches u1chi uch3im uch1in uch3l uch3m uch3n uch1op u2ch3r uch4sel uch2so uch2sp uch2ta uch3tan uch6t5erf uch6t5ert u1chu uch3ü uch1w u1ci uck3elf u2ckem u4ckent uck2er ucker8geb u2ck3i uck4sti u1cl 2u1d u3d4a uda3d ud2e ude3i4 udein7 ude2n1 uden3e uden3s2 udert4 udes2 udi3en uditi4 ud2o u3dob u2d3on ud3ra u3dru 4u1e ueb4l ue1ch ue2ck u2ed ue2en4 u2eg u2eh ue2ke u4ela ue2lek ueli4 uel2la u3eln ue2mi uen1 u3en. ue4n3a2 ue2nä u3end uene2 ue2neb ue2ner uen4gag uenge2 uenge4m uengene7 uenge4s uen2gl u3e2ni uenk4 ue2no uen6zene uen2zu u2ep ue2r3a2 uera4t ue2r1ä uerb2 uer6baut uer3d2 uere2 ue2rec u5ereinn uer3eis uer3ela u3eremp u3e4r3ent ue3r4erb u3ererf ue4rer4g uerer4h uerer4k uerer4m ue6rersc uerer6sp ue6rerst uer3esk ue2re4t u3erex uer3g2 uer4geb u3erh ueri2d ue2r1i4m u3erin4t u3erl. u3ern uer4nan uer4nar uer4ne uern3s4t ue2r3o4 uer2ö u3errü uer3sc uerst6 uer3t2 u3eruh u3erum u3erunf u3erunt uer3z2 ue2ta ue4tek ue2tik uety2 u2ev ue2x1 uf1ab u3fac ufa2ck u3fah u3fal ufall4 u3fam ufa2n uf3ane u2f3a2r u3fas uf1aß ufa2t uf1au u2f1än u2f1äs u2f1ä2ß u2f1ei ufel4s3a u2f1em 4ufen u3fen. u2fent u2ferf u2f1erh u4ferla u4ferle u4ferne u2f1et 2uff uf3fe uff4l uf2fro u2f1id u2fim u2f1ins uf3l u2fob ufo2r uf1ori uf3r uf5sä uf2spo uf4stab 2uft ufta2b uft1eb uft3erd uft3er4g ufter4l uft3s4 u2fum 2u1g ug2abe u4gabte ug1a2d ug1ak u2gana u2ganb u2gani u2g1ans u2gant ug1ap u2g1ar uga2s ug1au ug3d2 u3ge. u2g1ec ug1e2i u2geig u2gein uge4lob ug1emi ugene2 ugen3s2 u2g1erf u2g1erl u2gerr u2gerv u3ges. u2g1esk ug2et ugg2 ugge4st ug2gl ugg4t ug3hu u2g1i2d u2gim ug1in u2g1l u4glä u6gleitb u6gleitu u4glic u4glis ug3liz u4g3lo u4glu u4g3n ugo3 u2go4b ug3oc u3gon ugo4p ug1o4r u3gos u2gö u2g3rä u2greg u4g3reis u2gres u2g3rie ug3ro u2grou ug3rüs ug3span ug4spe ugs4por ug4spr ug4spu ugst2 ug3sta ug3stä ugs4to ug3s4tr ug3stu ug4stur ug3s4tü u2gum ugu3te u2gü u1h uh2a 2u3he uhe3a2 uhe1e2 uhe1s 2uhi 2uhl uh1la uh2lar uh1lä uh4l3ent uhl3erb uh2li uhl2ö 2uhm uhme2 uhr1a uhrei4s uh2r3er3 2uh3ri uh4rin uh2r3o uh2ru uh4rü uhs4 uh3t2 u2hu 2uhü uh1w 2ui ui2a ui1ch ui2che ui4cker u1idd u1ie ui1em u3ig u4ige uil4les u1im u3in. u3isch. u3ischs uis2e uisi4n uis3t uit3s u1j uji3 uk2a ukä2 uk1äh u3käu u1k2e uke2n1 u1ki u1k2l ukle1 uk4n u2k1ob uko2m1 ukom3a uk2ö u1k4r uk2ta uk2t1el uk4tent uk2t1er uk2tin uk4t3o4ri uk4t3r uk2tum u1ku uku2s uk2ü u1l ul1am ulan2e ul2ar ula2s ul1äm ulb4l ul4dan ul2dr uld2se 2ule u2l1el ul1emb ule4n ul1er2h ules3t ule2t ul1eta 2ul3f4 ulg4 2uli ul1id uli2k ul1ins uli1p ul3ka ul2kn ull1au ul3len ul3l2i ul2lo ull3s2 ulm2e ulni2 ulo2i u2lop u2l1or ulp1h ul2pha ul2sa ul4sam ul2s1ec ul2sei ul2ser uls2th ul2sum 4ult2a ul3tan ult3ar ul2tau ulter4m ul3ti ul4tri ult3s u2lü ul2vr ulz2w 2uma. u2maa3 u2mab u2m1ad u2m1a2k um1all um1ang um1anz u2m1ap um1ar u2marc u2marm u2mart u2matl u2matm um1aus u2maut u2m1äh 1umd2 u3me. u2m1ef u2m1ein ume2n1e um5engel umer2a u2m1erf um1erg u3merk u2m1erl um1erw umes2t 1umf 4umfi 1umg um1ind um1inh um1ir umi2t um1ite 1umk 1uml 2umme um2mei um3mi um1ob u3mol um3ot ump2fa ump4fin umpf4li um2pho 1umr um4s3an 1umsat um4s1er um2sim um4sk um2s1pe um2sum um3t2 u2mum u2m1u2r 1umz un1 4un. 2una. 1unab un2a3br un2ag un2al u3n2am u2n3an u2nap u2narb 2un2a1s4 un3at un2är 2und. un2da unda2b un2dän 1undd 2unde un3de. underer6 und3erf und3erö underten8 under8tend und3erz un2dex 1undf 2undg un2did un2dim 1undn undo2b un2dop un2dor 4un2d3r und3s 4unds. 2undsc un2d1um undü4 1undv 1undz u3ne2 un3eid un3ein un2emi une4n1 unen2t une3re une3ri u4nerk u4n3erz. un2es4 unf2 un3fa unft4s un2gab un2gam un2gat 3ungena unger4e 1unget 1ungew ung5h 1ungl un2glu un2go un2gr ung3ri ungs3 ung4sa ungs5tr u3nic un2id un3ide 4unie 3u2nif uni3k4 un2im 1unio un2ir un3iro un3isl u3n2it 1u2niv 2unk un2k1a2 un3ker un2k1es un2ket un2kne un2ko2p un2kro unk3s2 unk4tit unk2tr unlö2 unna2 un4n1ad unn2e unne4n u2nob uno4r un2os 1unr uns2 2uns. unsch5el un3se 1un3si un3sk un4ski un3sp unsta4g unste4c uns4t1r 4unsy 4unsz 1unt un3ta un3te unte4ri 4unti un3tr unt3s 2untu 3unty 2u2nu u3nuc unvol2 unvoll3 1unw 4unwä 3unwe u2ny 2unz un3z2a unz2e 2uo u1o2b u3of u1or u3or. uo2r3a uor3c u3oret uo2ris u3ors uor5t uos2 u1os. uote2 u1ox uö2d u1ök u1pa 3upd u1pe2 uper1 uperer4 up2fa u2pfe2 u2pfi up2fu u3p4i up4lu u3po 2upp up2pl u1pr upra3 u2p3ras up4t3a2 upten1 up4tene upt3erf upt3erg upt3erk upt3ers up4tin up4t1o up4tr u1q 4ur. u1ra u2rab u3raba ura2be u2r1akt u2ral4t u2r1am ura4na u3rand uran6fän ur1ang uran4ge ur2anh uran5s ur1anz ur3ap u2r3ar ura4ri u3rasc ur1asp ura4str ur4ate u2r1att ur1au 2u1rä ur1äl ur1ä2m ur1än ur3b2a 2urc urch1 urcht3e urd2 ur3da ur3di ure1e ur1eff ur1eig u2rele ure2n ure4na u4ren4se u4rentn u2r1ep urer3h urer3k ur2ert u2rerw ur1eta ur2e3th ure3u 2urf ur2f3l ur2fro urf4spr urf3t ur6gense urg3inn urg1l ur2gla ur2gri urgros4 urg1s4 uri2c ur1ide uri3en u2r1ind urin6sek urin8stin u2ri2so ur3ku ur3l ur4matt ur2m1au urm2ei ur4mern urmet1 ur2mum ur2mun ur3n2e 2u1ro urob2l ur1off uroh2 uro1s4 urost2 2u1rö ur3p4 2urr ur3re ur2rh 3ursac ur2san ursau4 ur2s1er ur4s1of ur2spa ur3sze urt2 2urta ur2tai urt3ein ur2tro urts2c u3ru uruf4 urü2 ur2z1a2 ur2zä ur2z1ec ur2zep ur2zi ur2z1op urzt4 ur2z1w 2us us3a2b usa2gi u4s1amb u4samt u2sang us2ann us3ark usa2s3 us1ast u2säh u2s1äs u4schab u4schak u3sche. u4schef usch5eic u4sch3eu u3schi usch3mü u3schu usch5wer u3s2e3b u2s1ec use2ei u2s1ei u4sen4se u4sentl u3sep use4rec u2s1erl u2serp us1erw u2s1ese u2sex u2sid usi3er. usi5ers. u3sik usi4kat us1inn us3kl us3oc us1oh u3sol u2sop us1orc us1ou u2spac us3part u2s1pas u3spec u3spek u2sph us1pic u3spit u3s4piz u2spo us2por u2spu usrich7 us2s1ad us2s3eb usse4g usse4n us2sep us5ser. uss3erf usser4z us4sesp us2sez uss3k us2sof us2sum u1stad u1stal us3tau us4tein u1stel ust3erl us2th us3ther us3tin us3tr us4tras us6tris u1stu u2stun u2stur u2sumd u2sumg u2sumz u3sur 3usus u2sü 2uß uß1u 2u1t 4ut. u3taf u2t1alt u4t1a2m ut2ans u2t1ap u2t1ar uta2s u2taut ut1äh u2tär ut3c ut1e2d u3teh ut1ei. ut1eie ut1ein u3tek ut1ela u3tem ute2n1 uten2a u2tent u4tentf utera2 ute4ral ute5r4er ute6ring uter3k ute4ros ut2es ut2et u2t2ev u2t1ex utfi2 ut3hal ut3hei ut1hel u2t1hi u2t1ho u2thu u2t1id u4tigel uti2vi utli4n uto3c u5to3m uto1p uto3pa u2tops utor2a u4tord uto2re uto4rin uto3s2 4utou u2töl 4utr ut3rea u2trou ut3rü 4uts utsau2 ut2säu ut4schl ut4schm ut4scho ut4schö ut3ser ut3s2k uts2p ut3sta utt4er ut5t2l utts2 utu2b u2tum utu4n u2t1une utu4re utu3ro utu5ru u3tü u6tz ut2zeh utz3eng utz2er ut2zet ut2z1in ut2zis ut2zö ut2z1w 2u1u4 uufe2 uum1 uuma4 uume2 u1ü2 2u1v4 u2ve. uve3rä u1w 2u1x ux2e ux2o ux3oe ux3t4 u1y u2yo 2u1z uze2 u2z1ec u2z1ene uz2er uzo2f uz3ot uz1we uz3z2 1üb üb1ä 2übc 2übd übe2 übe3c übe3le übe4na übe3ne über1 ü4bet üb3l üb5r üb2s3t 2üc ü1che üch3l üch2s1c ücht4e ü3cke4n ück1er ück3eri ücker6ke ü4ckers ü2ckin ü2ckum ü4d3a4 üde2c üde2l ü3den. üden2g ü3d2ens üd3o4 üd3r üd3s2 üd3t4 üdu2 üe2 üeb3 ü1ei 2üf ü2f1a ü2f1ä ü2f1ei ü2fent üfer2 ü2f1erg üf2fl ü2f1i üf3l ü2fo ü2fum ü1g üg2e üge2l1a2 üge2lä üge4lec üge6lei6s üge2lo ügen3s ü2g3l ü2gn üg3s2 üg4s3t üh3a2 ü1he ü2h1ei ü2h3e4m ü3hem. ü2h1eng ü2h1ent ü2h1erf ü2h1er2k ü2h1er2z ü2hex üh1i4 ühla2 üh1lä üh2lel ühl2er üh2lö ühl4sk ühl4sta ühl4sti üh3mo üh3ne ühn2s üh1o2 üh3r2e ühr3ei. ühre2n1 ühren3s4 üh1ro ühr3ta üh1s ühs2p üh3t üht2a üht4r ü1hu üh1w ü1k2 ül1a ül2c ü3l2e ü4l3ef üle2r3a2 ül2l1a2 ül2l1ei üll2er ül2lid ül2lo ül2lö ülls2 ü2lö ü1lu ü2ma ü2ment üme2ra ü2m1id ü2m1in ü2m1u 2ün ü4n3a2 ün2da ün2dr ünd3s ü2n1erd ünf1 ünf3li ün2g3l ün2s ün3sc ün3se ün3sp ün3sta ünster3 ün3str ün2za ün2z1i ünzu2 ün2zun ün2zw ü1pe üpf3l ü1pi üp2pl 2ür ür1a ü2r1ei ü2r1e2l ür2f1er ür2fl ür2fr ür4g3en4g ürge4ra ürk2e ü3r2o3 ürom2 üror2 ürr2 ür2s ür3sc ür3se ür3si ür3sp ür3sta ürte2l3 ürt2h ür2z1in ür2zö ür2z1w üs2a ü2schl ü3s2e üse1e2 üse3l2 üse4n üse3r4 üse1s üs4s3a üs2s1c üss2e üs4s3o üs2st üst3a üste2n 2ü1ß 2üt ü2t1al üte3m üte4n üten3s ütent4 üten3z2 üte2ra üte2r1e üterich6 üter3n ü2t1h ü2t3r üt2se üt2st ütte4n üt2tr üt3zen üt2zw ü1v ü1z 3va. 2v1ab vab4r va1c va1f4 va3g vag2a va4gh va2la 2valu v2an. 2vanb 2vang v2ans 2varb v1arm vas2 2v1ass va1st v4at va2t1a4 va6tag va4tan va2tei va4t3eng va4tess va2t3h va4tid vati3k2 va4tim va4t1in vati8ons. va4tord va4t3r vat3s4 va2t1u 2v1au 2v1b 2v1c 2v1d2 1ve2 ve3an ve3ar veau3 veau1s ve3b4 ve3d ve3fa ve3g ve3h2 2veig v2eil 2vein veit2 veits3 ve3la 2velan vel2ar ve4l1au v1ele ve3lei ve3l2i ve3lo vel2o1p ve3ma ve3me 2v1emp 2vemu ve3nal ve4nas ven2c ve3ne ve3ni ve4nin ve3nö ven6t3ag vent4sk 2veo ve3of ve4pi ver1 ver3a ve3rad 2veral ve3rand ve3r4ane vera4s ver6bart ver3b2l ver3d2 vere2 verf4 ver3g4 ve3ri ve4rin ver3k vern2 ver4sep vert4 ver5te ver3u4 ve3rus ves1 ve3sa 2ve3s2c 2ve3s2e ves3ti ve3ta vete1 vete3r ve3ti ve3tr ve3t2s 2veü ve3v ve3w 2v1f4 2v1g 2v1h vi1an vi3ar vi4a3t vi2ä vi2c vi3de vid3s2t 3vie vie2h1a vi2el viela2 viele2 vi2er vie4rec vie2w1 vig2 2vii v2il vi2l1a vi2lä vi4l1e2h vi2lei viler4 vi4lers vi2l1in vi2ma2 vi4na vin3d ving3 vings4 v1ins vi3sa vise4 vi3s2i vi3s2o vi2sp vis2u viv2 viz2 vize5 2v1k 2v1l4 v3le v2lie 2v1m vm2e 2v1n2 1vo 2v1ob vo2be vob4l voge2l3 vo2gu vol2a vol4l1a vollen6 vol6lend vol6ler6t vol2li 2v1op vo2r1 vo4r3a voran8schl vor3g vo3ri vo4rie vo5rig vorm2 vormen4 vor3o vort4 vot2a voy1 vö2c 2v1p vr2 v1ra v2ree 3v2ri 2vs vs2c vs2e vs2p v1sta v1steu v3s2z 2v1t vue3 vu2enu vu2et 2vumf 2vumg 2vumk v1ü 2v1v 2v1w 2v1z w2a 1waa wab2bl wa3che wach8stub wach4t4r 1wack waffe2 waffel3 1wag wa5ge 3wage4n wa2g3n wa3go 1wah wahl5ent wah4ler wah2l1i 1wal wa2lar 2walb wal4d3a wal4din wal2dr wa2les wa3li wal2m1 wals2 walt1a wal6tere wal6terl wal4to wal4tur 3walz wa3na wan2d1a2 wandels6 wan2dr w3anf 2wang wan3g2e wang4s 1wann wan6z5en6d wan4zer wa2p 1war2e ware1i wa5ren 1warn war4ni wart4e war2th war2za 1was wa3sa was2c wa4scha wa3sche wa4sch3l wa4schw wa3se wa3sh was3s wass4e2 wa3su w2ä 1wäh 1wäl 2wäng 1wäs wäs2c wäss4e 2w3äu 2w1b2 wbu2 2w1c 2w1d we2a we2b1a webe1i we2b3l we2bo we2b3r webs2c we3cke. we5cken. we3ckes we2e2 weed3 we2fl 1weg we2g1a we4g1ei weg5ersc we4g3l we4gn we2g1o2 we4g3r weg3s2 wegs4t 1weh weh4r3er4 wei2bl weib4r 2weie weifel6d wei4fre wei2gr weigs4 wei3k4 3weil weinsau6 wei3sc weis6sel weis6spi wei2t1r wei5ze wel5le4 wel6schl wel6schr wel2t1 wel4t3a2 welte4 wel6t5en6d wel4th welt3i wel4to wel6t3r wen3a2 wendes4 wen2gl we3n2i wen2ka wen4kla wen4k3ri we2r3a2 wer5be werbe3i wer2bl werb2s 1werbu wer3d2 5werdens 1werdu werer2 wer2fl 2werg wer2ga wer6gels wer2g3o wer2gr werin2 we3rins we2ri4o 1werk. wer2k1a 1werke wer2ki wer2k3l wer2kn wer2k3o wer4k3re wer2ku we2rö wer2s wer3sp wer2t1a wer2tä wert3ei wer6teig wer6t5erm wer2th wer4tin wer4t1o2 wer4tre wer6t3ri wer4tum 1wes2e we2sp we4st wes4t1a weste2 west3ei wes6ten6d wes4tex wes2ti wes4t1o2 wes4t3r wes4tu 1wet 2wets wett3s 2w3ey 2w1f 2w1g whi4 w3ho w2i wicht4s wi1cka 1wid wi2e 2wieb 1wied wie3l wie3n2e wik2 1wild wim2ma wim6ment wim4m3u win2a win4d3e4c win3del win6d5erz 1win2d3r 2wing win2g3r win2kl win8n7er8sc win2no win3s wint2 1wi4r wire3 wi5s2e wi2sp 1wiss wiss4z wi3th 1witz. 1witzl wiz2 2w1k 2w1l 2w1m 2wn wns2a wn3sh 1wo1c wo2cha woch2e4 1woh woh4lei woh4na 1wolf wolf2s3 wol2la wol4ler wor3a wor3d wo4r3i worn2 wort1a wor4tel wor6terh wor4t3r wort3s2 wo4r3u wor3ü 3wos wot2 1wöc wöl2fo wört2h 2w1p w2r w3re w3ro 2w1s ws2e w3s2h w3s2k ws2t w4s1u 2w1t wti2 w2u 1wuc wuch4sc wuch4st w3u2f wul2 wul3se wund4e wung3r wungs4 wun2s wunsch5l 4wur. wur2fa wur2f1o wur2fr wur2s 1wurst wus2 wus3te 1wu4t1 1wüh wül2 wün3 1würf 1würst 2w1w 2w1z x1a 1xa. 2xa2b 1x2ac 1x2ad 1xae xa1fl 1x2a3g2 2xal xal2l xa2m 1xane 1xani x2an3t2 x2anz xa2r 1x2as xa2z 2x1b4 x1ce x1ch x1cl 4x1d xda4 xdy2 1xe 3xe. 2x1e4g 2xek xe2l 3xel. x1ele xe3lei x1em 3x2em. 2xemp x2ems x2en 3xen. xen3s2 3x2er. x2ere 2x1erl xer2la x2ern xers2 x2ers. 3xes 2x1eu 2x1ex 2x1f 2x1g 2x1h xi1c xich2 2xid xi2dan xide2 xi2dei xi2d3em x1i2do 3x2ie xie3l xi3g xi2ler xili3a xi2lo xi2l1u xim2 xin3s2 x2is xi2sa xi2s1e xi2sp xis3s2 xis3t xis4tä xi2su 3xit xi3te x1i4tu xive4 x1j 4x1k2 xkal2 4x2l2 x3lä x3le 2x1m 2x1n 2xod 2xoe4 x1o2r xos2 2x1ö2 4x1p xpor6ter xpor4t3r x1q x1r 2x3s2 4x1t xt1a xta2b3 x3tan xt2ant x3tas x2t1ä x3tät xtblo4 xtblock5 x2t1e2d xt1ein x2t1el x4tent x2t1er2f x2t1ev xtfi2 x2t1h x2t1id xti2la x2til2l x2t1o4 x4tor xtra3b4 x2t3ran x2trau xt3rec xt3s2 x2t1um x2t1un 1xu xu1a xu2n 2xunt xu2s3 xusa2 xuss4 2xv 2x1w 3xy. x1z 2y1ab 1ya2c y2ach ya1h y1al. yan2g y1ank ya1q ya3ra yas2 yas3t y1ät y1b ybe2r y1c y2chi y3chis ych3n y1d yd2o ydri2 ydrid3 ydro3 y1e y2ec ye2d y2ef y2el2 yen4n yera2 y2ere yer2n1 y2es y4es. yes2p ye2th y1f2 y1g ygi2 ygie3 yg2l y1h y3ho yhr2 2y1i4 y1j y1k2 yke3n yk4l yk3s2 yl1a2 yl2a3g y1l2ak yla4l y2lam yl3ane y1lant yl4ante yl4anti yl2as ylau2 yl3c yle2 y2le. yl1em y2l1es3 y2l1e4t yli4n ylo1i2 yloid3 yloni1 yl2op yl1ora yl3s2 yl5t ym2a ym4an ym4ar ym4as ym4e ymp4 ym2pha ympi1e ynä4r yn2eu ynk2 y2n1o2 yno4t yn2oz yn3t2 yob2 y2od yoga3 yom2 yon2a y1ont yo2pe yo1s y2ost y1ou 2y1p ypa2b3 ypa2n yp2e2 ype4r3o2 y2pf y2p1i2d y2p1in y2plo y3po3 y4p3s yp3th ypu2 y2p1um y1q y1r y3r2e y3ri yri1e yri3en y3ro yros3t yrr2 2ys ys2an ysch4 ys2e1 ysein2 y4s3l ysme3 ys2po ys1pr yst2e yst2h ys2the ys3to ys3tr ys4tra y4stro y3s2ty ysu2 y2s1ur y3s2z y1t y2te. y2tes yt2h ythe1 y3to1 ytos2 y4t3r yu2r yur2e3 y1v y1w y1y y1z2 yze3r2i 2z1a2b zab3l za1c 2z1ach zach2s 2z1a2d 2z1af za3gr 3z2ah zah3len zah4ner4 z1ak 4z3akk 2z1al 4z3ald 3zali 2z1a2m z1a2n 4z3a4n4a 2z3anb za3ne 2z3anf 2z3angs 3z2ank zan2ka z3anl 2z3anr zanti1 za4pf z1aq z1ar 3zar. 2zarb za3re 2zarm 3z2aro z2arr zar2t1r 2z1as za2sc zast4 z3at zat2e za2to 3zaub 2z1au2f 2z3aug 3zaun z3aur 2z1aut zä2 2z1äc z2äh zä3hi 3zähn 2z1äm z1än z1äp z1är 2z1äus 2zäuß 4z3b4 zber2e zbü1b zbübe3 2z3c 2z3d2 zdan2 zdä1 zdi1st 3ze. 2zea 2z1e2ben ze1c 2z1e2cho ze1e2 zeeu3 2z1eff z1e2ga zehe4 zehen1 zeh2l ze3ho zei1f4 zeik4 zeil2 zei3la zeile4 2z1ein ze3in. z2e1ind zei4ne 4z3einh ze3inse ze2i1s4 zei3sk 3zeit zei2t1a zei4t3er zei4to zei2tr zeit3ri zek4 ze2l1a zela2d zel3a2n ze2l1ä zel3d4 4ze2lek 4zelem ze2len ze2l1er ze2l1in 2z1e2lit zel3la zel4lab zel4l3ac zel4lar zel6lein zel6ler6t zeller6z zell3s2 zelm4 ze2l1o zels2 zel3sa zel3sz zel2ti zembe2 2z1emp 5zen. ze4n1ac ze4nas zen3au ze2nä ze3n2em zenen1 4zenge. z4engl 2zengp 2zeni ze2nid zenk2 zen3n ze2n3o ze4not 4zen4sem zen4ser zens2p z2entn z1ents 2zentw 2zentz zen4z3er zen2zw zeo4r 3z2er. ze2rad ze1ral ze2rat z2ere ze5rek zer2em z2erfe z3erfül 2z1ergä 4z3ergeb z4erges z4ergl zer4gon 4z1ergu 3z2erhe 2z3erhö zerin6te z2erko 3zerl. zer4lau zer4le. 4zerleb zer4len 2zerlö 3z2ern zer4nan zer4n3e4b zer4nei 2z1erö zer2öf 2z1erq 4z3erreg zers2 z2ers. 2z1er4sa zerta2 zer4t3ag zert4an zer6teng zer6tere zer6terl zer4tin zer2to 6z5ertrag zer6trau z1erwe 4zerwei z1erz zer2ze 3z2es. ze2sä ze3sch zes1e ze2sp ze4spo zes2sa zessen4 zes6s5end zes6sent zes4ser4 zes2sp zes2st ze1sta ze3stau ze1str z2et. 2zeta 2ze2th ze2tr 2zetts zeu4gem zeu2g3r 2z1eul ze1ur 2z1e2x1 4z3f4 zfeue2 2z3g4 zger2a zger4s3 2z1h2 z2hen zhir3 zi3alo zi2ar zich2o zi2dei zie4ler zie2l1i zien3s zi1erh zi1es zi3ess zig4s z2il zil2e 2zimp zim4t3 2z1ind zin2e zin3ei 2z1inf z1inh zi4n3in zin1it 2z1inj zin4na zin4o zin2sa zin4ser 4zinsuf 2zint zi2o3 zirk2 zirk6s z1iso zi2sp zisse4 zi3s2z zi1th zithe2 zi4t1o2 zit2u ziv2 2z1j 4z1k4 2z1l2 zlei3ti zle1s z3ly 2z3m2 zme2e 2z3n2 z3oas 2z1ob 2z1of zo2gl zog4s3 2z1oh zol2la zoller4 zol6lerl zol6lert zonal2 zon3au zon5s4 zon4t3er zo2o 2zope 2z1o2r zo3re 3z2orn zor4ne 2z1osz 2z1ou 2z1o2z 2zö2f 2z1ök z1öl 2zöl. 3z2öll 2zöls 2zön 4z3p4 2z1q 4z3r2 2z1s4 z3sa zsau2 z3sh z3sk zspor2 4zst2 z3sz 2z1t zta2n zt3ane z2t1au z4tehe ztein1 zt3eins zt2el zte3ma z4t1ent z4t1erz zte3str zt2et zt1he z3them z3t2her zt1hi zt3ho z3thr z3thy z3ti zt3rec zt3ric zt3s2 z3tü zu1 zu3a zub4 3zuc zuch2e zucht3r zud4 zudi4 zu2el zu3e2r1 zue2t zu3f4 zug2em zu4gent zug2i zu3gl zu4gla zu4glö zu2go 2z1uhr zu3hu zui2 zu3k zul2 2z1um. zum2a 2z1umb zumen2 2zumf 2zumg zum2i 2zumk 2zuml 2zumr 2z1ums zum2u 2zunab zun2e 2z1unem zunf4 zung4 4zunget 2zungl z1uni 2zu2nio 2zuniv 2zunr 2z1uns 2zunt zuo2 zup2fi zu3pl zu3r2a 2z1urk 2z1url 2z1urn 2z1urs 2z1urt zu3s4 zusch4 zu5t2 zut4r zut4u zut3z zuz2 2zü4b 3züc zür1c 2z1v zw2 z1wac 2zwag 4zwah 4zwap z1war 2zwa2s 2zwäs 2z1wed 2zweg 2zweh z2weig 2zweil zweiter6 2z1wel 2z1wen 2z1wer 2z1wes z2wic zwi4e 3zwing 2zwirt z2wisc 2zwiss z2wit 2z1wo z1wör z1wur 2z1wü zy1an. zy2le 2z1z z3z2a zza3b4 z4z3al zz4at z2z1id z2z1in1 zzi1s4 zz2ö zzug4s",
+ ["characters"]="abcdefghijklmnopqrstuvwxyzßàáâäçèéêëíïñóôöü",
+ ["data"]=".ab1a .ab3l .abo2 .ab3ol .ab1or .abs2 .ab3si .ab3u .ach2sp .ade3n .ae3 .aft2 .ago1 .ag4r .ag2u .ai2s .akt2a .al2e .ale3u4 .al3lei .al3len .al3li .al3se .al4st .al2tei .al4tel .al4terp .alter4s3 .al2tra .alt3s4 .al2tu .ampe4 .amt2s1 .ana1c .an4a3t .an3d2 .anden4k .an1e .ang2 .an3g4li .an3go .angs4 .angst3 .ani2s .an3k4 .an3s2 .an4si. .an2tar .an3z4 .ap3p4le. .ari1e .ar3k2a .ar2m3ac .ar4mun .ar2sc .ar2tan .ar4t3ei .ar4t3erh .ar2t1r .arz2 .as4b .asbe2 .as2ko .as3ta .as4ta. .as4tat .as3tr .as2zen .ata1 .at2h .au3d .au4f3 .au6fac .au6fas .aufs4 .au2s3 .aussen6du .auß2 .ax2 .är4schl .ät2h .ät2s .bahn3 .baus4 .be3erb .beige2 .bei4ge. .beige4s .bel2a .be3r2a .ber2e .ber2g3a .ber4g3e4b .ber4gin .ber2g3r .ber2tr .bi4os .bi2t .bit1a .blau3 .bleis4 .boge2 .bogen3 .bogens4 .bo4s3k .brut3s .bu4cher .bu2ser .bü3b .bübe3 .by4t .ca2s3t .ce2ra .ch2 .champi4o .char4mes .chi3er .ch6lor .dab4 .da4ch3en .da2r1 .dar3in .dar2m1 .da4te. .da4tes .de2al .de1i .dein2 .de3lo .de3na .den2ka .den2kl .den2ko .de1o2 .de3r4en .de1s .des4pe .des2t .diä2r .di3el .die3n2e .diens2 .dien4st .diensta6d .do3b .do4mo .do3pe .dor2f1 .do2tr .dys3 .ebe2r1 .eg2o .eh2e .ehe1i .ehe5n .eichs4 .ei3e4 .ei3f2e .ei4fr .ei3k .ei4na .ein3d .ei2ne2 .ein3eb .ei3n4erl .ein3sp .eise4 .ei2sp .eis3s2 .ei2s5t .ei4tr .eke2 .ek3li .el2a .el2bi .el2bl .elb3s .el2fei .el2fl .em3m2 .en1 .en4da .en2d3er2 .en2d3r .end3s .en4dü .en3ga .en2gl .enk2 .enn2 .enns3 .ent3 .en4ta .en4tei .en5thalp .en4tio .en4t1r .en5trop .ents4 .epi3c .er2bei .er6brecht .er2bu .er2dan .erden4k .er2d3er .er1e .ere3c .er2em .erf4 .er1i .er4stein .erster4 .er6stritt. .er8stritten. .er2z3el .er2zen2 .es3p .es3ta2 .est4e .es3th .es3t3r .et2s .eu3 .eug4 .eur4 .ext4 .fe3la3 .feri3 .fer2no .fe2st .fi3d .fi3est .fi2le. .fi2len .fi2s .flu2g1 .fs2 .fu2sc .ga4me. .gan2ga .ga2s1 .gas3e .ga4sp .ga4t .gd2 .gebe2a .geb2l .gee4 .gel2b3r .gel2d1 .ge3lu .ge5nar .gen4aug .ge3n4e .gene5cke .ge3n2o .ge3r2a .ger2e .ge3ro .ger4s .ge3sa .ge3ste .glan2 .glanz3 .gs4t .gus2 .halt4e .han2f .hau2t1 .he2bei .he2r .he4r3an .he3rat .her4b3ra .he3rer .he3ri .he4r3inn .hin3u .hips4 .hi4s .hof1 .ho4fen .ho4met .hus3s .ia2 .ia4t .im2a .ima2ge .imm2 .im5mu .in1 .ind2 .in3gl .ink2 .in3n2e .in3sk .in3t2 .inu1 .io4d .ioni1 .ire3 .is2a .is3ta .istri3 .it2h .iv2 .joni1 .ka2b3l .ka2i .ka5ka .kal2a .ka3le .ka3t2a .kat3i .ka4ti4o .ki2e .ko3b .kopf1 .kor2da .kraf2 .ks2 .kus2 .la3be .lan4de4mi .lat3s .le4ar .le2gas .leh4me .le3n2i .lich6ter6sc .li4f .li2ve. .lo2g3in .lo2sc .lo4sk .loss4 .lo2tr .lo3ver .luster4 .lus4tr .lut2h .ly2s3 .ma3d .mal4e .mani2e .ma2st .mat4c .ma5tr .matu3 .md2 .mel2a .me3ne .me3no .men4schl .men4schw .ment2 .mes4sp .mi2f .mik4 .mil2z1 .mi2s .mi4t1 .mm2 .na3no .na3t .näs1c .nebe4n .ner2f .ne1ro .ne2s .nich2 .nicht3e .ni2e .ni3k4l .nul2 .nus2 .oa3 .ob1a .obe2 .ober3ei .ob3i4t .och3 .of2e .oper4 .op3fe .or2a .ord4e .or3g .or3k2 .ort2 .orts3e .os3s .os4t1a4 .oste2 .ost3end .os4ten4de .os4teng .oste4re .ost5erwe .os4tes .os2t3i .os4tig .os4t3r .os2tu .ot1a .ou2t .ou4te .ozo4 .öd2 .öl3l .pab4 .par2kl .part2h .pe2c .pe3le .pe3na .pf2 .pf4l .pf4r .ph2 .ph4t .poka2 .po4st .postei4 .pro1 .ps2 .rabe4 .ra3ch2e .ra3e2 .ra5me .rau2m .rau4schl .re3ale .reb3s2 .re3cha .re3insz .reis4e3i .rei2s5t .re3ke .res6tr .ri4as .richt4e .ro4a .ro3be .ro2e .ro2h .rom4a .ro2st .ro2t3r .rö2s .ruf3s .ruh2r1 .runder4 .rü3b .rü4cker4 .sa3br .sali3e .sami1 .sau1c .sch4 .schaf6t7end .se3ck .se2ei .seein2 .se2ha .sen3de .sen4f3 .sen3s .se3re .seri3e .se1ro .ser2u .se2t1 .sha4 .si4en .si1er .si3gn .si4te .ski1e .skis2 .sour2 .spani5er. .spiege6lei .st2 .st4a .stau8be8cken. .st4e .ste2i .steiner6k .sto4re .st4r .st4u .sui4te. .tage4s .tan2k3a .tank3l .ta3ra .tar3t2 .ta2t1h .ta2to .ta4tor .ta2t1u .te2e .te2f .tehe3 .teiler4s .tei6l5ersc .te3le .te3no .tens4 .te1ra .te2s .test3r .ti2a .ti2e .ti2me .ti4mes .ti3r .ti2s .tischen4 .ti6sch5end .tite4 .tode4 .to2der .todes3 .to2n .to4nat .ton1i .to4nin .tons2 .to4pl .to2pr .to2w .tri3es .tro2s .ts2 .tse3 .ts4u .tu3ra .tu3ri .turm1 .tur2ma .ub2 .ufe2 .ufer3 .ul2b3 .um3 .uma2 .ume2 .umo2 .un3a4 .un3d .une2 .un3g2 .uni4t .un3s .uns4t .ur3a2d .ural4 .uran4fa .ur1c .ur1e .ur2e3t .ur2inf .urin2s .ur3o4m .ur1o2p .ur3s4 .ut2a .ut3r .ve5n2e .ves3t .voll1 .vo4r .wah4l .wa2s .weg5s .weine2 .wei2ta .welter4e .wer4ker .wer4kr .wer2tr .wetterer6 .wi4e .wor2 .wort3en4 .wor4tend .wur2f1 .xe3 .ya4l .zel4la .zelle2 .zel4leb .zeug2i .zi2e .zie2l3u .zin2ka .zin2s3c .zin2st .zuch2 .zug3l .zu2gra .zwe2 .zweigen4 .zwei6g5end a1ab aa1c a1a2ce aa2gr a1akt a2al aa2l1a aa3lep aals2t a1an a3an. a1a2q 2a2ar aa2r3a aar3b aar3d aa3rea aa2rei aarf4 aar3g2 aar3k4 aar3s aart4 1aas aata2 aa2th aa4t3r aat4s3 2a3au a1ä2 2aba 3abad ab1alt a3b2am ab2ant ab1au ab1ä ab2är ab2äu 2abbat 2abbin 1abd ab5dec 2abe. 2abec ab1eic abe3id ab1eil ab1ein 2ab2el abe2l1a abela2d 2a3ben. 1abent 2aber a2berd ab1er2k ab1er2r ab1er2z 4abes abe2s1e ab3esse 2a3bet 2abew 1abf 3abg 1abh ab5hän 2abi 4abil ab1ins ab1ir abi3st ab1it abi4tur 1abk ab1l 1a2bla a3blat 1a2blä a2b3led 3ab3lei a3blem 2ablet ab3li a2blin ab4lit 2ablo 1a2blö a2blu 1abn 2abo 3a2bo. ab2of 3a2bon 4abot 2abö ab3r a2bre ab4ros 2ab4rö ab3sau 1absc 1abse 1ab3sp abst2 3absta ab3s4te 1abstu ab3sz 3abtei abte2s 3abtr 2abu abu3g a2bum ab1ur 2abü 1abw 2a3by aby4t 3abz 2ac. 2a3ca 1ac1c 2acci a1cem a1cen a2ceo a4ch. ach1a a3chari ach3as ach3au 2achb 2a1che a2ch1e2c ach1ei ach2ei. a2chep a2cherf a2ch3erh a2ch3erl a2cherö a2ch3erw 2achf 2a1chi a2chim ach3l 2ach3m ach3n a1cho a3cho. a2cho2r ach3öf 4ach3r a4chs 2achsc achs2el ach3s2i achs2or ach3su a4cht ach2tak ach4terh ach4tersp ach4t3erw ach4t1o acht3rat ach4traum ach6träume. ach8träumen. ach4trit acht4s3al ach2tum a1chu ach1u4f ach3ü 2achv 4ach3w a1ci 2acke. a3ckel ack3erz a2ckin ack2sp acksta2 2a1cl acon4n 2acu 2ad. 2ada. 4adab ad2abr ad2ag ad1an 3adap 4a3d2a2r3 2adas 2adat a2d1au a3dau. 1a2dä1 ad1c 1add 2ade. ade2al a3dec a3dee adefi2 2adeg a3dell 2aden aden1a ade4nat adeo4 ade1ra a2d1erk 4ade1s ade3s4p ades2s 2adf 2adh 2adi adi3en adi3er. adie2sc adi4st 3adj 2adli 4admu ad2ob ado2n ado4na a2dop 2adp 2adq a2dre 2ad3rec ad3rei ad3run 2ads2 ad3st ad3sz ad2t1 ad4te2 ad5tea 1adv 2ady 2a1e1 ae2b a2ec ae2ck ae2d ae2i a2ek a2el a3el. a4ela a3els ae2m ae2n1 ae2o3 aeop2 ae2p 3a2er2o1 aes2a ae4sc aes3t aes5tr ae4ta a2e3u a2ew ae2x a2f 2a3fa a4f1ab a4f1a2n a4fap a4f1au 2a3fä a4f1än 2a3fe a4f1ec a4fentl a4f1ep a4fex a3fé aff4a af2f3l aff2s aff4th 2a3fi afi4kanz afi2kat afi2t 2af3l af1la a3f4lu 2a3fo a4f3oc a4ford a4f1ort afo1s 2afra af3rau af3rä af3re 2afro af3rö af4rü af3s2a af3s2h af2si af2sp afs4t af2t1a af3tat af2tei af2te2l aft2erk af2t1o af2tö aft3r af2tra aft5rei aft4stä af2tur af4tü a3fu a4f3ur 2a3fü afür3 2ag. 2aga ag1a2b ag1a2d ag1ar a2g1au ag2del ag2dr ag2du 4age. age2l3ei age2ler 4agen. agend2 age2neb a2gentu 2ages age4sam age3sc age4s3in age4so ages3p ages4sen age3ste ages3ti 3aggr a2g1id a2gim ag1inn 2a2gl ag4lan ag4las ag3le a4glö 2agm ag2n2 ag4nat a4gnä ag4ne ag5neh ag4nu ago3b ag1op agori2 ag3rat a2g3re a2gri ag3rie ag3rin 2ags ag3s2ah ag4sam ag3s2eid ag5s4porta agst2 ag1ste ag3stö ags3tr 2agt ag2th 2agu a2gund 2ah. 2a1ha ah2an ah4at a1hä 2a1he ahe1in a2h1er2h ahe1s ahe3u a1h2i ahin3 ah2l3a2 ah2l1ä ah2l1ei ah2lel ahle4na ah4l3erd ah4l3erh ahl1o2 ah2lö ahl3sz ahme1i ahme3s4 ah3mu ah4n3a ah3nee ah2nef ahn3el ah4nerd ahner4e ah2nerl ah4ner4le ahner2n ah4nin ah2no ahn3ste ahn3t 1a2hor ah1os ah3ös ahr1a ah3r2e ahre4s ah3ri ahrta2 ahr4tage ahr4teng ahr2ti ahr2tri ahr2tro ahr2tun ah2ta ah2te2l ah2t1ex ah4t3r aht3s4 2a1hu ah3w a1hy 2ai. ai1a2 a1ia. 2aib ai2bl aid2s ai1e2 ai3e4n3 aif2 ai3fr ai3g2 aig4r a3ik. a4i3ke ai2lar ail3d4 ai2lei ail3g ai2lo 2ain ain2a a1ind ai3n4e ai4neb ain3s 3airb ai2sa a3isch. ai3schw ai3s2e a2it ait4r a3iv. a3ivl a3ivs a2jat aje2 ajekt4o a2k 2ak. a3ka 2aka. 2aka3b akab4r a4kad 2akal 2akam 2akan 2akar ak4at akat1a aka2tak 1a4kaz 2a3kä 2akb 2akc 2akd 2a3ke a4kef a4k1em a4keo ak2et a4keu 2a3ki ak1ins aki1s 1akku 2ak3l a3k4la ak5lad ak5lan ak4li 3aklö ak4lu ak5lun a3kna ak3no 2a3ko 2a3kr 4akra ak3res ak4ri 3akro a4k3rü 2aks ak3sh ak2t1a2b 2aktb ak2tel ak3t2er 2aktg 2aktik 2aktis 2aktm ak2to4b ak2tö ak2t3r ak5t4ri 2aktsi 2aktsp 2aktst 2aktun 2aktw a3ku 2akun a4kup 2akur aku2s 2a3kü 1akz 3akze a1la 2ala. 4alabo a2l3abt al1ac al1af 2alai al1akr al1am al1ana 2aland a2l1ang al1anz al1app a3lar. al3arc a3lare al2arm 2al1arr a2lart ala2s a3lat. alat3s alat3z al1au al3aug a1lä a2l1äm al1än al1är al1äu 3albat al2bär al2berh al2b3er2w al2b1l al2boh al2bon alb3ru alb3st al4dan al2dä al2d3erl al2d3ern alde2s ald3inn ald1r al2drä alds2 2ale 4a3le. ale4ar a2l1e2b al1eck a4l1ef a2l1ei a3l2eic a4lein a2l1el 5a2lema a2l1e2mi al1emp 4a3len. alende2 al3endr al3ends a2leng al2enn al1e2po 4a3ler. a2l1erb aler2e a2l1erf a2l1er2h aler2kl a2l3erl al1erm aler4mi a2l1er4r aler3s a2l1ert aler3w 3a2l3erwä 4ales a2l1e4sk a2less a4leth a2l1eu alf4r 1alge. 3algi al2gli al3glo 1algo 3algor 2ali al2imb al1imm ali2nal al1ind alin2ge a2l1in2q al1ins alken1 al2klö al2kne al2kof 1alkoh alk3s2 alks4t al2lab al3lad al2l1an al2l1a2r al4lec 3allee al3lend aller2z al5les al2lid alli3er. alli5ers. al2lob allo3c al2lop al2löf al2map al4m3ast almo4de. 2alo. a2l1ob 3a2loe a2l1of 4alog alo2ga alo2gr alo3is. al1ont alori2 al1ort 2alos a2l1ö al2ös 3alp. 3alpe. 1alph al2pho al3sak al2schm al3ska als2p al3sterb al3str al2sum al2t1ak alt3alg al3tam al2tan al2tat al2tau 1altä al4tb al4td alt3eis alt3elt al2temu alter3f alt3er4pr al2teu al2tid al2tin alt1op al2tö alt3rad al2t3rat al2tre al4t3ri al2t3ro a1lu alu3b4 al2uf alu3g al1u2k a2lum al1umb a2l1ur a3lus 2aly al2zar al2zau al3zen alz2erk al2zw a2m 2am. a3m2a ama2ba ama3d2 ama3g 1amal a4malg 2am4an 1a4maz 2a3mä a3me 4ame. 2amel 2am4e4n1 amen4spr amen2t3r a5mer. ame3r2a amera3u a4m1erf 1a4meri ame5r2u 2ame1s a4mesh 2amet a3mé 2amf a3mi ami2k am4ing 2amir 2amit 2amk 2aml 2amm. am2mab am2m1ac 2am2mal am2mant am2mar am2mei ammes3 am2mid ammi2e am2min 4amml am2mor am2m1ö ammu2 amni1 a3mo 2ampe. 2ampen am4pf amp2f1a2 2am2ple 2ampo am3pr am5pre amp3s2 2am2s am3sa 4amsc am4schl 3am3se ams3en am3s2h am3so am3sp am3su 1amt. am2t1a2 am4tau am2t1ä amt3eig am4tel am2tem amter4 am2terh am2t3ern am2t1ex am2tis am2tit am2to am4tou am2tö am2t3r am4tre am4tri am4ts am2t1u am4tü 2am4tv 2a3mu 3a4mul am4us a3mü a3my 2ana. 2anab ana3c 2an2ad ana2der anadi1 an2ag 2a3nak an1alg ana2lin an2a5ma 2anan an4and 2ana1s a5nat. ana4th a5n4atm a2nato ana4tr a5nats an3aug 1a2n1äs 1anb 2anbas 2anbö 2anbu an3ch 2and. 3an3d2ac and3ei an2deng anden4ga an2d3ent ander2e and3erob an3des ande2sc an2d1ex and2sas and2seh and2so and4spar and4spas and2su 4andu2 an2d1ur andy1 2ane 4ane. an3e2c a3nee an2ei. an3eif 3aneig a4neis 3a2n1e4k ane4l an1e2mi a2nemo 4anen anen3s4 4aner. aner2fa an2erh a2nerke 4anern a4nerz. an2erze an1eth 3anex 1anf 2anf. 2anfab 3anfä 2anfi anf3le 2anfors 2anfs an3f2u 2anfun 4ang. 1anga 2anga. an2g1ar 2angas 2angd 2ange. 1angeb an2g1ei an3gen an2g3erf an2g3er2h an2g3er2w an2g3erz 2angf 2angh 2angie ang1l an2gla ang3n ang5na ang1r ang3ra an3gri 2angs. ang4sto angt2 1an3h 2anhau 2a3ni an2i3d aniel2l ani3els ani3ers. anig2 ani2ka ani3ke 3a4nim a4nind ani2o an3i4on a4n3iso 2anj 2ank. an2kag an2k1ak an2kan an2kei 2anken ank3erfa an3kes 2anki an2kid an2klö an2klu ank3no an2k3opf an2kor ank1r ank3ra an2kras ank3rä an2kro 2anks ank3se 2ankt4 1ankü 1anl 2anlad 3anlag 2anmo 1anmu 2ann. an3na 1annah an4nar an3ne an4nef an4nei an4nene annen3s2 ann2er 2anns ann4sp 2annt 2ano. 1an1od 2anof 2anog 2a3nol ano2la 1a2nom a3nom. 2anoo an1op a2n1or ano2ri 2a3nos 2a1nö 2anpu 1anr 2anrö an4same an3sar 1an3s2ä an4sb 3anschr an4sf an4sg an3skr 1anspr 1anst an3s2z 2ant. ant3ar anta4re an3t2ä 1antá 3antei anteri2 an3tha 1anthr an3ti 2antie 3antise anton2 1antr 1antw 2anu anu3r a1nü 1anw 2anwi an2z1ä 2anzb 2anzd 1anzei anz3elf anze2n 2anzes 2anzg 2anzh anzi2d an2z1i4n 2anzk 2anzm 2anzr 2anzs 2anzt 1anzü 3anzün 2anzv 2anzw an2zwä an2zwi 2anzy 2ao ao3i a1op ao2pe aopf4 a1or a1os3 aos5ta a3ot. ao3t2s 2a1ö aö4fe 2ap. ap2a apa3b ap4an a2pe. 3a2pé a3p2fa 1apfel 2apfes a3pfl a2pht 2api 2apl ap4la ap3le ap3li ap2n a2pot ap3pu 2apr aps2ter ap3t2 ap5tag 2a3pu 2ar. a1ra a3ra. ar2ab 2ar3abb ar3abf ar3abr ar3abt 2arac ara3d2 ar3adr 2arak 2a2r3al a3rale a3rali a3ralo a2r1ang a2r1anz 2arap a4r3app 2a2rar ara2st ar2asy 4arat a2r1au a1rä ar1äs 1arb 2arb. 2arba ar2bak ar2b1at ar2bau 4arbef ar2b3ein 2arbek 2arben 2arber arb3erl 4arbi 2ar2bl 2arbo 2arb1r 2arbs2 arb3se arb3sk arb3so 2arb3t2 2arbu 1ar1c 2archl 2ar3chr ar2dau arde4i ar2dop ar2d3r a2rea are3aler a2reb aree2 ar1eff a2reh ar1ehr 2arei a3rei. ar1eid a3reie a3reih areim3 a2rein arein4b arein2s arein2t a2rele 4arem are2mi 4aren. aren4sem a2rentn are3r2a arerau5 arer2e a2rerei a2rerg a2rer3h a2reri a2rerk a2rerl a2rert ar2erw 2ares are3sc ar2et are3u a2rev arf1r arf3ra arf2sp 4arg. ar3gan ar2gl ar4gn 2arg4o ar3g4r arg4s 2arh 2ari ar2ia ari3en ari3erd ari3erg arin3s4 ar1int a3r4io ar2ir ar4is ari2su a3riu ar2kal ar2k1ar ark3aue arker2 ar2kil 2ark3l ar2kle ar2klo ark4lö ar2kn 2arko ar2koa ar2kor ark3s2a ark2se ark3she ark4tre ar2les ar3mad arm1au ar3m2ä ar2m1eg ar2m1ei arm2or ar2mum 4armü 2arn ar2nan arn2el ar3ni a1ro arob2 4aroc aro4ckeng ar1o2d ar1of aro2i 2a3rol a2r1op a2ror aros3 aro4st 1a2rou aro2w 2a2r1ö arö4l 2arp arr1ac ar2r3ad ar2r1as arre4n1 2arri ar2r3or ar2schl ar3se arseri2 ar3sh ar3s4i ars5ka ar3spe ar3sta ar2tau 2artb art2e 2ar3tei arter2e 2artex ar3t2i 2arto art3r art4res ar2tri art3ske art2sp 2artuc 2artü 2arty 2aru a2r1uh ar1um a3rumm a2rü 2arv arwa2 2a3r2y 2arza ar2zau ar2zä 2arze 2arzi ar2zö 1arzt arz4tei arz4ti arz2t3r 2arzu ar2z3w 2asa a2s3af a3sag a3s2al asal2t1 as1am as3art asa2s as3at asau4f a4s3aug a2sä as3ät asbes2 a2sca a4schec a4schef a4scherg a3s4chi a2schm asch3ru 2ascht a3schu a4schum 2asd 2ase a2seb a2sec a2s1ef as1eie as1emi a3sen. ase4na ase4n3o a2sen2se as2ep as2er ase2re a2s3erke as4es ase4ta a2s1ev a2sex 2asf asges4 2ash a3s2hi as3hir 2asig a2s3i2k 2asim asin2g as1inn 2asis 2asiu aska3s 2aso as1o4f a3sol a3som as1o2p as1or a2soz a2sö a2sp as3pan aspek4to as2ph a3spi as3pik as3pio a4spir 2aspr 2as3sa ass2a3b ass4aus. asse3le ass2i as3ski as3so ass3p as2spo as2spr as4sr as4ss as2st as3stau as3stei as3sti as3str as3stu 4asta a3stad a1st2as as3tat a3stä as3te ast2el ast2er as4t3ese as4tex as2th ast2i3d as3tie as3til as4tl as3to as4tof ast3orc a1str ast3re as3t4ren as5tri as6t3ritt ast3roll as3tub 2asu as2ur asu4s as4ut a2sü aswa2s 1asy 3asyl 2asys aße2 aß2en3 2at at1ab ata2be at2a3f ata3g at2ago ata3la a3tam atan3k at1apf ata3ra at2ast at1att a2t1au at1än at2c a2teb ateien2 at1eig 3a2teli 3a2temg at2en ate4na aten3s4e a2tep 4ater ate3r4al at4ere atern2 ater3st ate2ru 4ates ates2sa at2eu a2tew a4th. 4atha at3hag at3hal at2heb ath3in. 3athl a4thm a4thr at2hu at3hü a3ti at4ia ati2kab ati4k3erw a4tinf at2is ati2sa ati2se a4tiso atis3s ati4v3erf 3atla 4atli 3atm 4atma 4atmä 4atmus a2t1ob a3tol 3a2t4om ato4man atom1e ato4mo at1op at1ort a3to3s atra4t a2t3rau a2t3rä at3re at3rin at3rom at4ron at3rot at3rü at2sa at3sche at2schn at2se ats1e2h at2si ats1in at2s1o at2sp a4tst ats3tät at2su at3ta 3attac at4tad at4t1ak atta2l at4tale at4tals at4tang at4tar at4tau at2tä at2t3ec at2tei at3t2el at3thä 4atto at2tob 3attr att3rat at2t3rä att3s2 at3t2u a3tub atu2n a3tü atze4l atz3ela atz3elt at2zem at2z1er a3tzere atzer2h at2z1in atz3t2 at2z3w a2u 2au. 2au3a 2aub au2bab au2ban au2b1au aube4n au2beu au2blä au2bli au2blo au2blu aub2si aub2str 2auc auch4str au2dr 2aue aue2b au3er. au2ere aue3rei auer3ö au3erq au3ersc au3erst. au3ert aue2s au4fa au5fac au5fah auf1ak au5fal au5fam auf1an au5fas 2aufe. 2aufeh 2aufen. 3aufent auf1er au4fer2k au4feu auff4 auf3ind 1aufla 1au4fn 2aufo 4aufö auf3ski auf3t2 2auft. 2aug au2ga au3g2ar aug2e 4augeb 4augeh 4augel 4augl au4gn 4augr au3gu au3h2 2au1i au2is 2auj auk3t aule2s aul2les au3lü 2aum aume4n au2m3ent au2m1e2r1 aum3eri au2m1id au4mil au4mit au2m1o aumo2r aum3p2 aum3s2 au4mun 2aun au3n2a aun2e au2nio au2no au3nu a4unz 2aup2 au3pf 2aur2 au1rh au3ru aurü3 au2s1ah ausan4ne. au2sas au2sau 2ausc au4schmi au2scho 1ausd 2ause. au2s1eh 2ausen au2s3erb au2serf aus3erk aus3erp au2serw 1ausg au2sin au2sis au2so aus1or au2spr 1ausr 3aussag aus2se. aus3s2el aus3s2t aust2a 2auste au3stein aust2o aus5tri 3ausü 1ausw 1ausz auße2 2aut. au2tab au2t1äu 2autb 2aute au4t1e2l au4ten2g au2t3erh aut5ero au2tev 2autg au2thy 2auti 1auto au4trö 2auts2 2auu 2auv auve4 2auw 2aux 2auz auz4w 2a1ü av2a avari4e avas4 ava3t2 avener2 2avi a2v3r 2aw awi3e a2wr a1x ax4am a2xans ax2e a2xio axis1 ay1 2a1ya ay2al ay2am ay2as a1yeu ayma4 ays2 aysi1 ays4t ay5tes ay2u az2 a3za3d 3azal azare3n az4at a3zi az3t a3zu azz3a az4zab az4zin ä1a 2äb ä2b3l äb2s äbte1 ä1ce ä1che äche1e äche4n ä1chi äch3l ä2chr äch4sa äch2so äch2sp äch2st ächt4e ä1chu ä1ck ä2da ädel1i äde1s2 ä2d1ia ädi4e ä2d3r äd2s äd5tet 2ä1e äe2k3 äe4kl äe2x ä2f ä3fe äfe4n äf2fl ä3fi äfig3 äf3l äf3r äf4ro äf2s äf3t2e äft4s3 ä2g1a 1ä2gä ägd2 äg2e ägen4e äge2r3a äge3s4 ä2g3l äg2n ä2g3r äg4ra ägst2 äg3sta äg3str 1ä2gy äh1a 2ä3he ä4h1ei äher3t ä1hi äh1in ähl1a äh3l2e äh4l3e2be äh5ler 2ähm äh3na äh3ne 1ähnl 2ähr äh2rel äh3ri ähr5sa 2ähs 2äht ä1hu äh3w 2äi ä1im ä1is. ä3isch. ä1isk äka2la äk3l ä2kle äk4li ä2k3r ä1la äl4bc älbe2 äl4bl älk3 älks4 äl2l1a äl2p3 äl2schl äl2st ält2e älte1i äl5tet ä1lu ä2m 2ä3ma3 äm4at ä3me ämer2s ä3mi ämi3en 2äml ä3mo ämoni3e 2ämp ämp5f4e äm2s äm3t2e2 ämter3 ä3mu 2än. änd4e än2dr 2ä3n2e äne2n1 äne1s 2än2f3 änft2 4än3g2e änge2ra 2än2gl äng3le än2gr äng3se 2ä3ni än3k2e än2k3l än2kr änk2s 2änn än3n4e2 änner1 2äns än4s1a än2s1c äns2e 2änz ä1on äo3s2 ä2p ä3pa 1äpfel ä3po äp2pl äp2pr äp2s1c äp4st ä3pu 1ä2q ä2r3a2 är4af ära4r är1ä 2ärb är2b3le är1c 2ärd ärde4s 2äre 4äre. ä2r1ei ä2r1e2l 4äre2m är1emi 4äre2n ä2rene 4ärer ä2rerh är2es 4äres. ä2rese ärf2s är3ge ärg4s äri2e ä2r1ind är1int är3k4e ärk2s 2ärm. ärm3arm ärm3at ärme1e ärm3ent ärm2s är1ob är1of ä1rö är3re ärse2 är2seb är2s3eh ärs3er är2s3i är3spu är2st är3str 2ärt ärt2e är2th ärt4s3 ä2rü är2zu är2z3w ä3sa 2ä3s2e äse3g äse1i4 äse5ref äser2ei äse2ren äser2i ä3s2kr ä2sp 2äs2s1c äss2e äss3erkr äss3ersa äss3erw äs2s3p äs2s3t ä2s3t äs4tc äst2e äs5tet 1ästh äs4tl äs4tr ä3su äß1erk äß1ers ä2t3a2 2ä3te äte3a äte1e äte1i äte3l2 äte2n äteo2 äte4pi äter2bl ät2e3t ä2th ä4thc ät1id ät1ob ä2t3r ät4sa äts3au ät2sä ät2schl ät2schr ät2s1i2 äts3l äts1or ät2s3p ät2s3t ät2su ät2tei ätte4n ät4tr ätze3l ät2zw 2äub äu2b3l äu2br äu1c äu3d äude3 äuder2 2ä2uf 1äug äug3l 2äul 2äum äu2ma äum3p äumpf4 äum4s3 äums5t 2ä2un äun2e äu3nu 2äu3r2 äure1 2ä3us. 2äusc äu4schi äu2schm äu3s2e äuse1i ä3usg ä3usk ä3usn äu2sp äus2s1c 1äuß äut2e äu2tr ä2vi 1äx ä3ze á1 1b 3ba. b2aa b3a2ba 2babf 2babg ba2bl ba2br 2b1abs bach5t4e ba2ck3er back3s4 ba3de bade1i 2b1adel bader4 2b1adl 2b1adm b1a2dr ba2du 2b1af 3bah bah4nene bai3d bais2 b2ak ba4k1a ba4k1er ba4k1i ba4k1l bak3r ba4kra ba4kre ba2lab ba2l1ak ba3lal ba2lau baler2 ba2l3erk balk4a balke4 bal4l3eh bal2l3ei ball4erk ball3s bal3tin bal2tr 2b1am b2ama ba5maz ba4me 4bamt ban2a 3b2and band1a ban2dal ban2dan ban2dar ban4derk ban4derz ban2dr ba3n2e 2banf b1ang ban3gl ban4k1a ban2kl ban2kn ban2kr ban2ku 2banl b1anna ban2o 2b1ans b1ant 2banw b1anz ba2r3ab ba2rad bar3ast ba2rat bar3de ba2rei barer3ei barer2t 3bar2s bar3sc b1arz bar3zw 3b2as ba3sa ba2sc bas2i bas4sa bas4st ba2st ba4t3ent bat2o bau1 3bau. bau3b bauer2l bauer2s bauer2w bau5fa bau3fl bau3f4r bau3g b2auk bau3r bau3s2k baus4t b1a2x ba1yo 3b2ä1c 3b2äd 2b1äh b2äl 2b1ärz b2äs 2bäug 2bb b3be bbe4n3 bbens2 bbe4p bb3le. bb2lö b3brec b3bru2 bb2s bbu1 2b1c 2bd2 b3da bdä2 bdän3 bde1s bdome4 3be. 3bea be3ab be3an be3as beat2m be3au be4au. b1ebb 3be1c 4becht 2b1e2del bedi4 be1e2h bee2l be3ela be1en bee4rei be1erh be1erl be1ert be1eta 2b1eff be3g2 be2he. beh5ri bei3b 2b1eier bei3f4 beige4be beige4ge beige2l beige4p bei3k4 bei3l2a 2b1eime be1ind be1inh bein4hal bein2hi bei3sc beis2e bei1s4t beit4e beit2s beit4s3k 3bel b4el. be3l2ag be3las bel3d be3lec 4be2lek be2l1en be2let bel3f bel3la belle4n3 bel3li bel3om be2löf bel3sz belt2 bem2 3b2em. 3b2e3ma 2b1emp 2bemul be5nabe ben3ar be4nas be4nat be2nä b2ene be3nei be4n3end ben2eu 3beng be2nid be2nik be4nis ben3n 3benp b2ens ben2spa ben2spr benst4 3bensz 2b1entb 2bentd 2benteu 2bentf ben3th ben4thei ben5t4r 2b1ents 2bentw ben3un b2en3z2 be1o 2b1epi 2bepoc be1ra ber3a2d be2rak be2r3am be2ran bera2s berb2 ber3d be2r1e2b be2reck be2r3eiw ber3ell bere2m be2rene ber2er ber3erk bere4sc bere4t berf4 ber2g3af ber2gal ber2gli ber2hab beri2d be3r4in. berin2g be3r4inne be2ri4o ber3iss ber3ko ber3kr ber3n2a bern2e b1ernt be4roh be2rö 3bers. ber5se bers4k ber3st2a bert2a bert2e bert2i berz2 ber3ze ber2zö b2e1s be3sa bes4abb bes2am bes2an be4sap be4sar bes2au be2sep be2s1er be2s1id bes3sa bes3s4e b3esst. bes3sz be2stab beste2 bester2 bes4terh besti3en be2s3tol bes4t3o2r bes3tos best4r be2s3trä be2s3tur be2sur be3s4ze be3tam be3tha be3thi bet4o bet2sp be1un be1ur 3bev 3b2ew2 2b3e2x 3b2ez 2bf2 bfal2 bfal3t bfang3s bf4lö bf4ri bf4ro bf4rü 2bg2 bge3 bgel2e bge5na bges4 2b1h2 bi1ak bi2ar 3bib2 bibe4 biber1 bi2c bid2 bi3do bien3s bieres4 bie2s biet2s 3bietu biga1 bik2a bi2ke. bi2kes bi2kre 3bil bil2deb bil3der bi2lei 4billu bi2lu 2bimp 2b1inb bin2e bine4n b1inf bin4fo bin2g3a bin3gl 2b1inh bino2 bi2n1ok bin4ol 2b1int 2b1inv bi2o3 biri1 3bis bi3si b1iso bi2sp bis4sa bis2s1c bi2st bi3s4ta bi1s5tr bis6tre 3b2it. b2ita b2ite b2iti bit4r bi2tu bi3z2 2bj bjek4to 2bk2 bk4ne bk4nu bl2 2bl. bla3b4 2b1lac b3lad b2lanc bl4at b2latt b2lau. b3laus4 2b3law 2b1län b2läse 3blät b2le 3ble2a b3leb 3blec b3leg 4bleh b4lei. 3bleib 2b3leid 2bleih b3lein blei3sc 2bleit ble3l blem3p ble2n b3lenk b3lese 2blesu ble3s4z 3blet b3leu 2blich 3blick b2lie 2blief 4blig b2lind 2b5ling4 b2lis 2blis. b2lit b3lite b2lo b4lo. b4loc 2b5loch b4loi blo2id b3los 3b4lum 2blun b2lus 3blut blut1o blut3sc 3blü 2bm 2b1n2 b3na bnas4 b3ne b3ni2 bnis1 bo3as b1o2b bo3ben bob3r bo2c bo3ch2 bo3d2 bo4dd boe1 bo2ei 2b1of bo3he boh2ra boh2u bo1is bo2lan bo2lau boli2e bol3le bol3za 3bon. bo3n2a bond1 bon2da bon2de bo2ne 3bons boo4l boo2ti b1op 3bor. bo1ra bor2an bo2r3as bo2rau bo4rä bor2da bor2d3r bo4rig bor3m bor2s b1ort bor2ter bor4t3rat bo4ruh bo2sc bo3se bo4s3p bos3t 3bot bot2e bote3n2e bo3th bot2st bot3t bo3v b1oz bö2b3 2böf 2b1öl 2bp2 bpa2g b3pf bp4rä bpri2 2bq b2r2 2br. b4ra. 2b3rad 2b4rah b4rak bra5ka br4al b4r4am4 brast4 2b3rat. brat3er2 bra4terg 2bratg 2bräd brä4u 2bre. 4b3rechte 2b3red 2b3ref 2breg b3reic b3reif b3reiz 2brek b4ren. 2b3rent 2breo 2b3rep b4rer b4res. b3rese b3rest bret4t3en 2b3reu b4rez bri2da brie2fa 2b3riem b4rien bri2er b3ries 2brigk b4rik bril3 b4rina 2b5rind b4rio b4risc b3ritt b4riz brob2 2b3roh 2b3rol bro4ma b4ron 2b3rost bro4tei bro4tr brot3t4 2b3rou 3brö b4ruc 2bruf b4rum 2b3rund brun4e bru2s4 brust1 bru2th b4ruz 3brü 4b3rüb 2b1s b2s1ad bs2am bs3amb b4s3amt bsau2r b4s3är b3s2äu b3sc bsch2 b4schan b4schef bs2chi b5schl b4sco bs2cu b3se. bse2b b3sel. bse2n1 b3sen. b2s1ent bs1erf bs1erg bs3e2r3in bs1erk bs1ers b3s2es b2sim bsi4t b4ski bs2ku b2s1of b3s2oh b3sol b4sop bso2r b2sö bs2p b3s4pi bs3po bss2 bs2t b4st. bst1a2b bst1ak bst1al bst3an3k bs4t1as b3stä b5stär bs3tät bst3emi bst1er b3s4tet bst1h bst3ink b2stip b3sto b4stob b4stod b4stor b3stö bs3trau b2s3trä bs4tri bst3ro b3stü b4stüb b2s1un bs2zep bs2zi b4szü 2bt b3t2a bta2s btast3r b3te b2t1h bt2i bti2s bt4ra btran2 bts2 b3tü1 buche2 bu2chec bucher2 bu4ch3er4s bu2chi buch3sp bu2e3 bu4fe bug3 bu2gr bul2l3a 2bumf 2b3umk 2buml 2b3umr bun4a bun2d3er bunde2s b1une bung4 b3un3gn 2b1unh bur1c b2ure b2urg burg1a bur2gan bur2gar bur2gin bur4gr bu3r2i 2burn b3ursa burts3 bu3ru bu2sa bu2sc bus3cha bu3sche bu4schei bu4sch3el bu4scheu bu3schu busch3w bu3shi bu2sin bu2s3p buster2 bu2su but2a bu3tan buto3re 2büb bü4bc bü1c bügel3e 2bv 2bw bwur2 b2y1 bya2 byo2 by3p2 bys2 bys4t by5tau by2te 2bz2 bzeit1 bz4wa 1c2a ca3bl 3ca2c ca2e3 ca3g2 ca1h cal2a cala3b cal3t 3cam 2can cana3 ca2pe ca3r2a car3n2 car5nu carri1 car2s ca3s2a3 cas5to ca3t2h ca1y2 cä1 cäs2 2cc c1ce c1ch2 c2d2 c3do 2cec 1ced ce2dr 2cef 2ceh ce1i ce3in 2cek 3cels cen3a cens2 ce3nu cen3un ceo2 1cer cer3a cere1 cere3u cer2i ce2ris ce1ro ce3s4h 1cet ceta4 cet1am ce1u 1cé cg4re c2h 2ch. 2chab ch3a2b3i cha2ck 2chaf 2ch1a2g 2ch1ak chal4l3ei chan4a 3chanc ch1ang 4chanl ch3ansa 4chanz 3chao 4char. 3chara 3chard 3charta cha2sc chasi1 1chato 4chatt ch3austr chau3t ch1äh ch1ärm ch1äs 1châ 2chb 2chc 2chd cheb4 ch3e2ben che3bl ch3echt ch1edi che2el 1chef 3chef. che2fer 3chefs 2cheh 2chei ch1eim 2chelem che2ler 3chemi 2chemp che2neb che2nid che2no 2chents 2chentw che2r3a 2ch3erbs 2ch3er2de 2ch3erfa 4chergeb 2cherke cher4zie ch3ess ches5t 2ch1eta 2ch3e2x 1ché 2chf 2chg 2chh 1chia chi3na 4chind 3chines 2chinf 2chinh 2ch1ins 2ch1int 2ch1inv 1chip. 1chiru 2chiso 2chj 2chk 2chl2 chl4a ch2le chle2i ch3lein ch4len 4chli ch2lu 2ch2m 2chn2 chn4a chn4e chner4ei. 2chob cho3ch cho4f ch1off cho5fr chof4s ch1oh cho3l2a ch1orc ch1ori ch2os ch3öl 3chör 2chp ch2r2 2chr4a ch3rad 2chre ch3rh 4chrit 3chromo 3chron ch5ros ch4ry 2chs ch2stal 2cht ch4tb ch4tg ch4tm ch2truh ch4ts chts3trä ch4tw 2chuf 2chuh 2chum 2ch1unf 2chunm 2chunt 2chur ch1urs 2chut chut4t 2chü 2chv 2chw 2chz ci2al ci1c ci1es c1ind cins2 c1int ci2s1 1ci3t2 c2k 2ck. ck1a 1cka. 2cka2b 2cka2c ck2ad 1ckag ck2age 2ckal cka4m 2ckan 2ckap cka4r1 1ckard 1ckat ck1ä 2ckb 2ckc 2ckd 1cke 2cke2c 2ck1ef 4ckeff 2ck1eg 2ck1eh 4ck1ei 3ckem. 2ckemp cke4na 4ckensem 2ckentf 4ckentw cke2ra 4ckeremi 4ckergeb 2ck3er2hö ckerk4 2ckerke 3ckerl ck2ern 2cke2ro 2ckerz 3ckerzen 4ckese ck2et 4ckex 2ckf 2ckg 2ckh 1cki 2ck1i2d ck1in 4ckinn 4ckint 3ck4is 2ckk 2ck3l 2ckm 2ck3n ck5nac 2ck3o2 cko4f cko4p ckos4t ckos6te ck3ö ckö4f 2ckp 2ck3r 2cks cks2al ck4ske ck4spen 2ckt ck3te ck3t2i 1cku 2ck1uh ck1um 2ckuni 2ckunt 2ck1up 2ckü 2ckv 2ckw 1cky 2ckz c2l2 cle4a clet4 clin2g cli2p1 clo1c clo2ck 1clu c2m2 c3me c3mu 1c2o co2c co3ch co2d2 co4de. co3di cof3f2 co2ke cola3 co2leu co3l2o co4mp com4te. comtes2 con2ne continuati6 co2o coo3p co3p co4ps co1ra 4corb cor2da cor3de co4re co5ree cor3t cos3t co4te cou3si cô2 cô4te 2c2p 2cq 1c2r2 c4ras c3rä cre2 cre4me 3crew 2cri 2cry 2cs cs2a cs2f cs4fr c2si cst2 c1s2ti c1s4tr 2ct cti4o2 ction3 ctur4 1c2u 2cua cu2e cup3 cu4pa cu4p1e cu4pl cu4pr cussi4 c2v c3ve 2cx 1cy 1ç 1d 3da. da1a 2d1aal 2d1ab d3a2bak d2abä d2abe d3a2ben d3a2bi da3blu d3a2bo dab4ra da2bri da3brie d2ab4rü d1ac dach3a dache4 da2cho dach3s 2d3achse 2d1ad da2de da2do da2d4r d1af da5fab 2da4ff da3f4l dafo4n d1ag dagi4 dag2o da1h dah3l dail3 da1in 2d1air da1is da4kro 2d1alar dal3b2 4d1all da2lop da3lö 2d1alp d1al3t 2dalte da1lü 3dam d1a4mei d1amma 4d1ammä damo3 d2amp damp5f4erf 4d1amt 3d2an. d1ana da2nan da4n4at 2danb dan2ce. d1and2 2danda d2andy 3dane 4d3anei 2danf d1ang 2danh dan2kl dan3kla dan2k1o dan2kr 2danl d1ann 2danna d1a2no 2d1ans danti3e 2dantw 2danw d1anz d2anz. 2danzi 2danzü 2d1ap d2apa d2aph da2po da3pos 4dapp d3apte 2daq da4r1a 2darb2 2d3arc dar2d1e 2d1area daren1 dar3g d3a2rist dark2a 3darl dar2m1a dar2m1i dar4mun da2r3o d1arr 2darres 3d2ars 2d1art dar2th 4d3arti dar2tr da2ru d1arz da1s2 da3sh d1asp das3s 2d1assi 2d1as4t da2s5tr dat2e2 da3tei 4d3a2tel date4n da2th 2d3atl 4datm d3ato dat2st 2d3atta 3daub 2daud dau3e2 dauer3e daue4rei 2d3au4f 2d3aug 2dauk da3unt 2d1aus3 dau2ß 3daw d1ax 3däc 2d1äg 2d1äh 2d1ämt dä4n3a 2d1änd 2d1äp 2däq 2d1ärz 2d1ä2u dä3us 2däx 2db2 dbau2c dbauch3 dbe2e db4la db4ri dbu2c 2dc d3ch 2dd2 d3da ddar4m1 d3dä d3de d3dh dea2d 3dean de3ar de3as de3a2t deb2 deb4r 3debü de1c de4ca. de2cka deco3 2d1e2del de2dit 2dee2 de1eb de1e4g de1em dee4n de1er de1es def4a de2fa. 2d1eff def4l deg2 degene3 de3gl deh2a dehe2 3dehn de3ho 2d1ehr d1ei 3d2e4ic de3i2den de3il 3d2eim 4deime dein2d d2einfr 4deinr d2e3inse de3inst dein4sta dein4sti 4d3einw de3io 2deise d4e1ism dei2sp 2dekz de2l1ac de3lak dela4t del3ate de2l3aug del3änd del3b2 del3d del1ec 3de3leg delei2g 2delek 2delem de2len deler2 deler4r 2delf. 2delfm 3delik del2la dell3auf del2l1ä delle2 del2l3eb del2lei del2l3er de2l1ob de2lop del2se del2so del2s3p del3t4 dem2ar 2d1emb dement2 de4mentg dem3ents demi2e 2d1emot 2d1emp d2emu d4en. dend2 de2n1e2d de4n3end de2nep 2denerg de3n2es d3en2ge. de2ni denk3li dens2am den4scho 2den2sem den2ser dens3tau den4stie 2dentd 2dentf 2dentg den3th 2dentn 2dentw 2dentz den4zerf den4zers de2ob 2deol dep4l 2depoc d4er. dera2b der3af de2rak dera2n de3rand de2r3ap dera4s de3r2ass der2bl 2d1erbs 2derdb de2r1e2b de2reck der3eis 3d4erem d4eren de2r3end 3d4erer der2erf der3erl derer3n der3ero derer2t 3d4eres der3ess de2r1eu derf4 d4erfl d3erheb d2erhü de2r3id de4rinnu derin4teg der3k2 d3erken 2derklä 3derlan d2erm de4rn de1ro derö2 der3r de4rs der3san 2dersat derst2 der3stau dert5ende. derter4e dert4ra 4der4trag de3ru de4ruh de4rum 2d1erz. d3erzeu 2d1erzv d2es. de2sa desa2g des1ah de4sam de2s1än de2seb de2se2h de2sei 2d1esel des3elt de3sem de3s2end desen3e de2set de2sin de2s1o de2s3p de3spe de3spu dess2 dess4e dess4t dest3alt des4temp des4terg de3stern des2tex de1sto dest3rat de3stri des2tum de2su des1un 3desw det2 de3ta deten4t 2d1e2th 2d1etw 2d1eul de1un de1url de3us de4ut 2d1e2vid devil2 de1x4a de2xer de2xis 2dexpe 2dexpo 2df2 df4la df4ru df4rü 2dg2 dgas3tr d2ge. dger2 d2gesh dge2t3a dge4t1e 2d1h2 dha1s4 d3hu di4aa di4ab di4ad di4ae di4af di4ag di4aj di4ak di4ale di4am di4ao di4ap di2a3s4 di4at4 di5at. di4au di4av di4az di3äre 3dic di1ce di3chl dicht4er di4ck3el 4d3i2co 3dida d1ide 2didee di2den 2didy di2e di3e4d di3en. di3end die2neb diener4l di3e2ni dienst3r die2p di3ers. dies1c di3e4th 3dif di4ff dige2s di4gk dig4n dik2a dil2s3 2d1imb 2dimp din4a 2d1ind di3n2e 2d1inf di4ng 2d1inh di3ni 2d1inj 2d1ink di4nn 2d1ins 2d3int 2d1inv di2o3b di2odi di4ok dion3in dion3s4 di3ora d4ios2 dip2 di3pt d1i2ra di4re. di2ren di5rig di2rin di2ris 2d1irl 2d1irr di2s1a2 2d1iso di2sp di3s4per 2d1isr dist2 di1s4ta di2s3te di2stra di4sz di2ta dite1c di2t3erl di2t3erm di2t3ers di3the di2tin di2tob di4t3r dit3s di2t1u di5vid di3z2 2dj d2jar 2dk2 d3kl dk4le dk4na dk4ne 2d1l2 d3la dlap4 d3le dle2ra dl3f dli4f dl3m dl3s 2dm2 d3ma d3me 2d1n2 d3na d3ne d3ni2 dni3g dnis1 d3nu do3a doa4k 2d1ob 3d2oba d2obo dob2s d1of do4fe 2d1oh do3ha dole4 dol3l2 d3o2ly 3dom do4mal do4mar domen1 do4ming 4domn do4mu don2a do3nan doni1e 4dony do2o do3op 2dope 2d1opf do1r4a 2d1orc 2d1ord dor2f1a dor2fä dor2f1i dor2fl dor2fo dor2fr dor4f3u 2d1org d2orn 2d3orna 2d1ort dor2ta dor2t3ei dor2ter dor4tr dos2 d2os. 2dosm dos3s dost1 d1ost. dost3a dosten2 dos4ti do4stu do3ta do3th do2tof do3un dow2s d2o1x2 d1ö dö2d dö4fe döl1 döll2 d2ön 3d2ör dö2s1c 2dp2 dpass1 dpas2se d3pf d3po dpol4n dpost1 d3ps 2dq d2r2 3d4ra. 3d4rab 4d3rad 2drahm 2d3rak 3d4ral d4rama d3ramm d3ramp d3rand dran3k 2d3rast dr4at dra4tin 2draub 2d3rauc d4rauf 2draum 2draup 2dräd d4räh 2d3rät 2d3räu 4dre. 2d3rea d4rea. d4reas 3d4reck 2d3ref 4dreg 3d4reh dre2ha dr4ei 2d3reic 3d4rei3e d4reiv d4rej 4drem 4d3ren d4reo 4d3rep 4d3rer 4dres. d4resc dres4sei dres4ser4 dres2st d4rew 2drez 2d3rh d4ria 4d3ric d3rieg 3drif 4d3riff d4rift 4d3rind 2d3rip 2d3risi 2driss 2d3ritu 2d3rob d3rod 2drogg 2drohr 3d4rohu dro2id. 2d3roll 2d3rose d4ross 2d3rost 2d3rot 2d3rou 2d3rov d3row drö2sc 3d4ruc 2d3rud 2d3ruh dr4un 2d3rut drü3b drü3cke 3d4rüs 2d1s ds3a2b d2s1ad ds1al d2salk d2sall d4s1amt d2san ds3ane ds3assi d2saut ds1än ds2äu d2schef d2schin d3s4co d2scr d2s1e2b dse2e d2s1ef ds1ehr ds2eign d2sein d2s1emb dsen3er d2s1eng dsen3s d2s1ent d2s1erf d2s1erh d2s1erk d2s1erl ds1err d2s1ers d2s1ert d2serz dse4t d2s1eta d2s1ev d2sex d3sha4 ds2hak d4shal d3sho d4shor d2sid d2s1im d3s2inf ds2kal d3s2kel d4sko d4sli d3soh d2sop dso2r ds1ori d2sö d2spat d2spä d2speri d2s3ph d3spi ds2por d4sporto d3spri d2spro ds2pu dss2 dss4t dst2 d4stag d2stas ds3tauf d2s3täti d2ste d3stec d3stei d4steil d3stell d4stem d4sten d3s2tern ds2ti ds4til ds4tip d2stoch d3strei d3s4tro ds2tur dsu2m d2sun ds1url ds2zen 2dt dta2be d3t2ac dta2d dt2ag dta2n dt3ane d3t2as dt2ax d3tea dt2et d2th d4thei d3to2 d4tob dt2op d3tö d4tök dt3r dtran2 dts2 dt3sa dtt4r dt2un d3t2ur d3tü d3ty dua2ler du1all du1alv du1ar du2b3li du1ce 2d1u4fe duf2ter duf4to duf2tr d3u2g 2d1uh du1i du2in du2kr dul3art 2d1umb 2dumd 2d1u2m1e 2dumf 2dumg 4d3umk 2duml d2ump 2dumr 2d1ums d2ums. 2d1umv du2n 2d3und 2d1unf dung4 d1unga 2dungl 2d1uni dun3ke dun2kl 2dunr dun2s 2dunsi dunst3r 2dunt 2dunw 2d3unz du1os dur2 dur3au durch3 2d1urk 2d1url 2d1urn 2d1ursa 2d1ur3t du2schn du2schr du2sch3w 2düb d3über düns3 2dv2 2dw dwa2 dwer3te dwes2 dwest1 dy2le dym3 3dyn dy2s dys1c dy4sl dys3t 2dz2 d3zw dz4we 2e1a ea2be ea2b3l ea4br ea2c eadli4 e3a2dr ea2g ea3ga4 ea3g4l ea4ka eakt2 e2akta ea2la e3alei e4alem ea2l3ent ealen2z ealer2 e3a2lerg e3alex e3a2lin eal1o ea2lon ea2lop e2alti2 eal3tr ea2l3u2 eam3 ea4ma e2am4e ea4m1o eamt2 e3anf e2ano e3ar. ea2ra ea3rat e2are e4are. ea2r1ei ea2rene e4arer e4ares e3ark e4arn2 ea2ro e3arz e2as e3a4sc easin4 ea4sp eas3s eate2 eat4mes eat2mu eat4mun ea4to ea5tri eat3s2 e3at3t2 e4atu2 e3aue e3auf eau4fe eau4fl e4aufo e4auj eau3n e2av e2az e1ä2 e3äh 2eba e3bak eba2p e3bän 2ebec ebe1er ebein5h eb2el ebe2ler ebe2lo ebels2t ebel3ste ebenen3 ebe2ras ebert4 ebese2 ebe2s3eh ebe2so 2ebet ebet4s 2ebh 2ebi 2ebl e3blä eb3le. eb3ler eb4leu e3blie eb3lo e3b2lö 2ebo e2bob ebot2 ebö2s 2ebr eb5rah e3brau eb2s1 eb4sche ebse2 ebs3p eb4spanne eb3stan ebs3tau eb4stät ebs3t2h ebs3ti eb3str ebs3treu 2ebu e2bunt ebu2t3 eby4t 2e3ca 2e3ce ech1am ech1ä 2e1che ech1ei ech2en1 echer4fa e4ch3erzi e1chi echi3e ech3l ech3m ech3n e2cho. ech3ö4 ech3re e1chri ech3sel echs2er echst3re ech3tab ech3t2ei ech3ter ech4terh e1chu ech3w 2echz e1ci e4ck. ecke4n1 e2ck3err ec4kl e4cks eck3ser 2eckt 3eckty 2e1cl 2eco 2e3cr ec1s 2ect ed2a ed2dr ed2e ede2al e3dee ede3n2er edens1 eden4sa eden2se eden2sp eden4sta edeo2 ed4e2r eder3a ede3rat ederer2 eder3t2 edes2t ed2i 2edip edi4teng e3d2o ed2ö e3drei ed4rö ed2sal ed2seh ed2s1es ed2si ed2s1o ed2sp ed2sto ed2s3tr ed2s1u edun3 edund2 edy3 edys4 2ee ee3a2 eeb2l ee3bs ee1c ee4ce ee2cho e1e2ck eede3 eede1s eed3s2 ee1e2 e1eff eef4l ee3fo eeg2 eeg4r e1ei ee2i3e eein2se eei4sc eeis3s e2ela eel2e e3e2lek eele4n eel2ö e2e3m2a e1emb e1emp eena2g e1end een1e e2e3n2i ee3n2o4 een3s e1ent e1en2z ee3o2 eeo4l e2ep ee3po e1erbt e1erd ee3r2e eer3ei ee4r3en4g eere2s eere2t eer3eti e1ermä ee1ro ee1rö e1eröf eer2ös eer3sh eer3str ee3r2un e1erz ee1s2 ee3sh ees3k ee3sp ee3s4t e2et. ee3t2a ee4tat ee2th eet2i ee3t4r ee2tu ee1u eeu4f eewa4r e1e2x e2f1ad e2f1a2g e3fah ef1ana ef1ar e2farc ef3arm e2fat ef1aus 2efä ef2äl e2fäu 2efe e2f1e2b efe2l3ei ef1em efe2n1 3e2f1ene e2fent efer3f eferin4d efeuil2 3effek 1effi ef2fl 2efi ef1id e2f1ins efi2s 2efl ef4le ef5le. e3f4lu e3f4lü 2ef2o 2efr ef4reih ef3rol ef3rom ef4ru ef4rü efs2 efs4c ef3so ef3sp ef2tan ef2tei ef2tro 2efu 2efü ega4m e3g2anz e3ge eg1eil egein3 ege2lan ege2l3au ege4l5ei4er ege2ler ege2lo eg2en ege4n1a2 egene3ra ege4nero egen3z eg2er ege2ra ege3stal ege2s3tr ege1u e4gex 2egi 2egl e2glo e2glu egmen4ta e2gn eg3nä eg3ni ego3p egori2e egs2ag eg4sal eg3se eg4sei egs2e3l eg3si eg4sk eg4sm egs2of egs4pe eg4ss egst2 eg4sto eg2th egung4 egus3 eg5ver 2e1ha eh1ach eh1ad eh2ade e3h2ah eh2al ehalt2s e3hand e2harz e3haut e1hä e1he eh1eff eh1ein e3helf eh1elt e2hense e2h3ente ehen6tr ehe3o 1e2hep 2eher ehe1ra e2h1er2f e2h1er2l ehe3str 2e1hi eh3im eh1lam eh2l3au eh1lä ehl3ein eh2lent eh5l2er ehlo2 ehl1or eh2lö ehl2se ehl4sl ehls2t 2ehm eh4mant ehme2s eh3mu eh3na eh3no 2e1ho eho4f eho2l eh3oly 2e3hö ehö2rer eh2r1a2 ehr1ä ehr1e2c eh2rei eh2rel ehr4ern ehre3s eh4rin eh1roc ehr1of eh1rö ehr3sch ehs2 eh3sh eh3sk ehs4p ehst4 eh1ste 2eh3t2 eht3h eht4r eh4ts 2e1hu e2hum eh1unf e2huni e1hü eh3üb eh3w e1hy 2ei3a2 eia4t ei2bar ei2bli ei4blu eibu4t ei2b3ute ei1ce ei2cho e2id ei2d1a ei4db ei4dl 2eidn ei3dr ei1e eie2b eie2d ei3e2l eie2m 4ei3e2n1 eienge4 eien3s ei3es eie2t 4eif. ei3flo 1eifr eif3t 2eig. 2eiga eig2ar 2eigä 2eige. 2eigeb 2eigeh 2eigeno 3eigensc 4eig2er 2eiges 2eigew 2eigi 1ei2g3n ei2go ei2g3rat 2eigre 2eigrö 2eigru 2eigrü 2eigs 2eigt 2eigu 2eih ei2hum ei2kab ei2kak eik4am eik2ar eik2i eik2l ei3k4la ei3klä eik2o e2il 4eil. ei4l3ab ei2lam eila2n ei2l3ane ei2lang ei2l3anz ei2lar 2eilb eil3d4 ei2lein eile2n1 ei2let eil3f4 eilm2 ei2lob eil2ö 2eim. ei2mab ei2m1a2g eim3all eim3alp ei2m1or 2eimö 2eimp eim2p4l eim3sa ei2mur e4i2n1a ei4na2d ei4nae ei4n3an ei4na4s ei4n3at ei2n1ä ein3d2e ein4derk e1indu 2eineb einen2e ei4n3en2g einen2s ei4nen4se ein3erbe ei2nerf ei2nerk ein3er4la ei4ness ei2neu ein4fiz 2einfo ein4fo. ein4fos ein3g2 3einger ei4nh ein2hab e2inhä ei2nie e1in2it ein3k4 ein4karn 3einkä e2inl ein3n2 3einna ei2n1o2 1einri e4insa 3einsat e2insc 3einschä ein4stal ein2teg ein4terv 3eintop 3eintö 3einträ 1einu ein3zw ei3o eio2s ei3p eip2f ei4pp ei4pz 2eir eir2c ei3re e1irr e4is. ei2sa ei3sas ei4sau ei2ser2g ei2s3er2l ei4s3erst ei2s3erw 1eisho ei3s2ky ei2so eis4pe e2iss eist4e ei1sto eis4tol ei2sum ei2sur 1eiswo e2it ei2t1a2b ei2tal ei2t1an ei2tap ei2tar ei4tat 2eitä ei2tän ei2teli eite4ra ei4tess eit1h ei2tin ei2trau ei4tro eit3t4 4eitu ei4t1um ei2t1ur eit3z4 eiv2 eive4 ei2zar eiz1in 2ej e3ju 2ek. 2e3k2a 1ekd ek2e e3ke. e3ke4n eker3z e3kes e3key e3ki e3k2l ek4lo ek4na ek4ne ek4ni ek4nu e3k2o ekor2da 2e3kr ek4s3p 2ekt ek2tan ek4tank ek3t4ante ek2t3at ek2t1ä ek2te2l ek2tep ekt3erf ekt3erk ek2t3er2z ekt2o ek2t3o4b ek5tri ekts2 2e3ku ekur2a e3k2w 1ekz e1la el2abt el3abu ela2ck e2l1af ela4h e2l1ak e2l1a4m e4lame el2a5mi el1ana e4landa el1ank e2lanm e4l1ans e2l1ant e4lanw el1anz 2elao e2l1ap e2l1ar el3a2ri ela2s el1a4si el1asp ela3su 2e1lä 2elbil 2elbr 2eld elda2r eld3ari eld2arm el2d3erf el2derl el3dern elder2s eld3erst el3des elds2 4e3le. 2e3lea elea2r 2eleb 4ele2c el1ech 1elefa eleg3s 4eleh el3ehe. 2elei e4l3ei4ern e2l1ein e3leine e3leit el1eiw 1elek 2eleko e2l1el ele3ler 1e2lem 2e3lem. e3lema el1emb el1e2mi e3lemm 4el1emp 2e3len. elen2k3l e2lense e2l1ent e3lep 4eler e3ler. eler2a el1erd el1erf e2ler2fa e2lerfi e2lerg el1erh e2l1erk e2l1erl eler2la e2l3ernä eler2ö e2l1err el3eru el1erw e2l1ess eles2t e2l1e4ta el2eth ele2ti elet2ta el1e2x e3lex. 1elf. elf2er 1elfm elf4r 1elft elgi3 el3g2l elg4r e2l1id 2e3lie elif3 2elig e2lim elin3a el3inka eli3no el1ins 4elis 2elk el2larb ellar4t ell2ei ell3ein ell3eis el4lel ell2er eller4fas eller5g ell3erh el3les el2lim 1ellip el2lor ell2ö ell3sp elm2e elm3ein el3na 2elo e2l3oa e2lof elo4fe e2lol e2lom e2lonk el1opf e2l1or e3lore elo2ri e3lot e3l2ov 2elö elö2s el3p2 el4sb el2s3ein el3sen els4tri el2sum el3tar elte4m el5ten. el4t3ent elter4b elter2f elt3erh elter2k elter4le 3elter4n elt5ero elter2s elte4s el4tesc elt3eth el3the el5tri el4ts elt3se 2e1lu el1uf e2l1um e2l3u2r elu2s el3use elu2t el3ute el3uto e1lü 2ely e2lya el2zar el2zene elz1in e2m3a2b em4ak e2m3alar e2m1alk em3anf e2m1ano em1ans 1emanz e4m1a4sp em1au 2e3mä em2äh 1embo 1embry em2dä emd1r em2dra 2eme e2m1e2b e2mef eme2i e2mele em2en emen4gel emen2t3h e4mentsp emer2i e2m1er2l em1erw 3e2meti em1i2d emi2ei e2mig emik2 em1im 2emin emi3n2a e3mind em1int 1e2mir 4emisc emi4scha emi3tr emma3u em2m1ei e2mof emo3s 1empf4 em3pfl em3po empo1s em2sa em4scha em2sim em2spr em2st ems5tr ems6tra em3t2 1e2mul 3emuls emu3ne3 e3mur 2emü e2na 4ena. e4na2b en3aba en3abo 4ena2c en3ache e4n1ack enadi4 e4naf 4enah en3ak ena4ke en1al e4nalb e3nale ena3l2i e4nalk e4nalm e4nalo enal3p enal4s 4en1am ena4n e4nand en3ane e4nant e4nanz en1ap ena2pa en3are en3ark 4enarm en3aro en1as ena4sc e4na2st 2enat 4e5nati e4natl enat4s e4n3att 4enatu e4nau4f en3aug e5naui e4n3aur e4nausta e4naut e4n1ax en1a4z en1ä en3äb en4äc e2när en2ä3s en3äst 2enbew 2enbom en2ce. end2ac en2dal en2dang 4endef 2endel ende2lä en2d3es4s en2dex en2did en3d2ort en2dost en3d4rü end3s2au end3s2l end3s2p end3sz en3d2um en3d2ü 2ene. en3e2ben en1e2c e2neff ene3hen en2eid e3neien e4neige e4nein e4neis e2n1el ene4le 2ene2m e2n1emi 2enen e4n1ent en3envi en1ep 4e3ner. e2n1erd e2nerf en2erfr 1energ 3energi e2nerh e2nerk e2n1erl e2nermi e2n3ermo 4enern e2n3erne ene2ro e2n1erp e2n1err e2n1ers 4eners. e2n1ert en2ert. e2n3eru e2n1erw 2enes e3nes. e2n1e4sc e2n1esk e2n1ess en1eta e2n1eth en1eul e2n1e2v e4ne2x en3f en4fb en4ff en4fg en4fh en4fk en4fm en4fp en4fs en4ft enf2u en4fw en4fz 1engad 1engag eng2al en3geb enge3r2a eng2i en3gn en3g2o 1engp eng4ra eng3se e3ni. 2e3nic 2e3nie eni3er. eni3era eni3erp eni3ers. en3i2ko en3ill eni4m en1ima en1imi e2n1in en3inh e3nio en3ion e2nir 2enis eni4sa e4n3iso e3nit2 e3niv enk3aus 3enkeli enk3erg en2k3erk en3k2ü en5mil en2nef en2nel enner2e en2ner2f enn3erg enn2i enni4ger 2enniv enns2 enn3ste e2n3oa e2n1ob e3nobel eno2br e2nof e2noh en3oli en3olm eno4ma eno4n e2n1op e2n1o2r en2ora eno4ri 4enorm e2n1ost 4e3not eno2w e1nö en1ö2d e4nöf e4nök e4nöl 4enred en3sabb en2san en3sche en2seb ense2e 1ensem ensen3e en3s4pen en3spo ens2por 4enst. enst3alt en2stät ens4tel ens4temp ens2th 4enstl 2ensto enst2ü 2entab en2tad 2entaf en5t2ag en2tanm en2tanw en3tar ent2ark 1entd en3t2el ente2n 3entera en2terb 1entf 2entfo 1entg 3entgeg en2thi 1enthu 1enthü en2t1id 3entla 1entn en2tob entopf3 en2t1os 2entö en5tré en4ts 1entsc 1entso 2entss ent2sto 3en4tw 4entwet 1entz e2n1u e3nu. e4nur enu4t e4nuto e1nü 4enwü e1ny en3zare en2zene enz3erf enz3erg enz3erk enzer2l enz3erm enz3ersc en4zf enzi2d enzlan2 enzo2l en4zp en4zr en4zs 4enzuf 1enzy 2eo eo3a e1o2b1 eo3ben eo3bl eo3bo eo3br eo1c eoch2 e1of eo3g2 e1oh eo3la e3o2ly e1on e3o2nat eon2i eo1o eo2pe e1opf e4oph eop4r e1or e3or. eo1ra e3orb e3o4r3ei eorgi1 e3ors eort2 e3orw eo1s2 e3os. eo3se e1oste e1ou2 eo1ul eou4t e1ö2 eö4fe 2ep2a epa2g epas4ser 2epeg 2eper e3p2f ep4fl 2epia e2pid e4pig e2pik 3e4pile e3pio e4pip 1epis 2epist 1e2pit ep3le ep4lu 1epoc eport4 epor3te 3e2pos. ep4p1a eppe3l ep4pl ep2pr 2epr ep4rä ep3sh ep2tal ep2tau ep2tä 2e3pu epu2s 2eq e3qu er1a e3ra. e2r3a2ch e3rad. e3ra3di e2radj e2r3adm e4radmi e4r3adr eraf4a era2g era3ges e1rah e1rai er3aic e3rake era4ku e1rald eral2eb er3alke e2r3all er2an. era4n4a eran3d e3rand. e2rangr e2ranh e2rano e1rap er3apa er3apf er3apo e2rar er3are e3rari era2rie e3ras. era2si era2ß e2ratel e3rativ e2ratl e1raub e1rauc er3aue erau4f er3aug e2ra2v e1raw e2r3ax e1raz e1rä er1äf er1äh er1ä4m er1äp e2r1äs er1ätz 3erbarm erb2au erb2e er3blo 2erbru erb2sp er1c erche3i er3chl erch2o erd2am erda5me 1erdb 2erdec er2d3en4g erd3erw erdes2t erdeu2 1erdg erd3st 2erdy 4ere. er3e2ben e3r2ech er3echs er1e2ck er1edi ere2dit er1eff e2r1e2h ere3ho 4e3rei. e3reib 1er1eig er3eime e4reink er3eis. er3eisar er3eisb er3eisf er3eisr erei3str er3eisv e4rek er1e2l e2rele ere3lev 2erem 4erem. er1emi ere2mis e2remp 2eren 4e3ren. e3rena eren1e e2rense e2rentn e4r3ents e3renz eren4z5en4d er4eo er1epe 4erer. 2ererb e2r1erd e4rerfo e2rerh e2rerk e2rer2l erer3lau e2rerm 2erern. e2rerne e2rer2o erer2ri er1ers 2erers. e4rersche e2rert 2ererv 2ererw e4r3erze 2eres 4eres. ere2sp er1ess eres3sk er1eta eretri3 er1eul ere3un ere2vid erf2e 2erfir 4erform erf4r 4erfür er2g3are 4ergebi 3ergebn 4ergebü 2ergeha 2ergehä ergel4s3 erg3elst 2ergeni 2ergn er2gop 4ergrem erg1s erg3s2o ergs4p ergs4t e2rh 1erhab er3hag 2erhai 2erhals 2erham 2erhas er3hei 2erher 4erhöc er3hu 2eri e2riat e3rib 4e3ric e4r3ico er1id 4e3rie erien1 erie2ne e4rij e3rik eri3k4l 4erin. e2r1ind erin2fo e2r1in2i er1in3k er1inl er1int er1inz e2ri2on e4rir 4eris e2riso e2risr er1ita 3eritr e3riv 2erk. 2erkaj er3ker er3kla 1erklä 2erkm erk3t4 erk5to er2kum 2erl. 2erlag 3erlebn 2erln erm2 er3ma 1ermah er3men ermen2s erm3ers er2nalg er2n3alt er2nau er4nene er2nerf er2nerk 3erneue er2nob erno2r ern1os 2e1ro. e1roa er1ob ero2bl ero2br e2r1of e3rofr e1rog e1roh e1rok e1rol er3oly e1rom er3omb 2e3ron e2r1oo er1op 2e4ro4r eror2a e1ros 1erosi e3rosit e1rou e2r1o2v e1row er1ox er1oz erö2d 2eröh erö4l er1ös erö2sc er3pl 3erprobu er3rä 4erren ers4ana ersch4 er3schm er3schn er3sen ers3hal er3s4i er3sk ers4por er3stel erst3ers 2erstil ers4tod ers6tri er3swi er3sz ert1ab 4erteig er2t3erf er2t3er2g er2ter2h er2ter2k er2ters ert1h er2tho 4ertö er3trau er5tri 4ertru er4ts ert3s2e ert3s2p 2eru eruf4s3 e4r3uhr er1u2m1 er1und e4rundu erung4 er1up. e4r3ur er3use eru4t er3ute e2r3uz erü4b 3erweck 6erweib es3ab e4sabe e2s1a2d e3saf es3ak e4s3all es1ami es3ampl es2ank es2anm es2anr es3anz e3sap es2apa esa2ra e3sa2s es2ast e3satz esa2v es1ax 2esb esbi3er. e3s2ce esch2 es4chi e2s3ec es1ehr esein2s es4ek es2el ese3lam 4esen ese4nal ese2neu esen3o e3s2ens esen3sk esen3th ese4r1u4 eses2k e2s3e2x 2esf 2esh es2har 2esi esi1er e2s3i2k e2s1il esi2st e4sk. es2kat e4skä e4s3ke e4s3kl e4skö es3ku e4s3ky es3l 2esm e2s3oa e4s3ob es1od eso4f e3s2oh e3sol esonan2 eso2r es1ora eso3re es2ort e3sot e3s2ö 2es2p e3s4pal es4park es4pec e4spers e2s3ph e3spi e3s4por es4pru es4put 2esr 2ess. es2s1a2g essali3 essau2s 1essay es3sc ess2ere ess2erf es2s3er2g ess3er4la es5sie 2esso es2sof es2sorg es2s3pa es2spu ess3tie es3stu es4sü e4st. estab4b esta3ge est1ak es4tanb es4tang e2stant e1stap e1star e2starb e2sta4s est3asc e1stat e2stat. e2staum es5te. es2tec este4i est3eing est3eink est3einl est3eint e1ste2l es4t3emi e4sten es4t3eng est3entr es2tep est3ergi est3erha es2ter2ö es4t3es4s es2th es2tid e1stil e2stip es2tis e4stl estmo4de. 1estn e2stom e3strec es4tri e1strö es4ts est3ums es2tur est3urk e1s4tü e3sty es4uc e3suh e2s1um es3ums es2und es3unt es1ur esu4s es4ut 2esw e3sy es4ym es3z es4zene es4zk 2eß e2ß1el e2ßent eß2e3re e2ß1er2g e2ß1erl eß3t etab4 eta2c 2e3taf 2etal et1a4mi et4an. e3tas et2ast et4at etat3r et1äh 2ete ete2e e2t1ef et1ein ete3ke eten3d2 ete2o eter1ä eter2hö eter2tr ete2s 2eth. et2ha et3hal e3the et2hi e4thik 3ethn et2hu e4t1i2d eti2m eti3na et1ini et2it eti2ta eti4th et3l 2eto e2t1o4f eto4n3al eto2ner etons4 et1orc e4torg eto2s 2etr et3rad e2traum et3rec e4t3res et4ros ets2c etscher5e etsch3w et2s3pe et2ste ett1a et2ta2b et2tad et2tak etta4m et2tans ett2as et2tau et2tei ette4n1 ett4er et2t1h et2t3r et2t1um 3e2tui e3tur e3tü e4tüb etwa4r ety2l1 1e2tym 2etz et2z3w eu1a2 eu3b eub4r 2euc euch4ta 2eud eude1s eudi4e eu2eb eue2r3ei eueren2 euerer4s euerer4t eu3eri euer2ri eu2esc 2euf eu4fer eu2g1a euge2mi eu4gense eugin2 eugin4f eu2ging eu2gre eu2gri eugs4 eug3sp eu3h eu1id eu1in 1eukal eu2kä eulan2 euland3 eul2e eul2i 2e1um e3um. eu3m4a e3umb e3umf e3uml e3um2s eum4s3p e3umw 2eu2na eun2e e3un2g eu2nio eu4nis eunk2 eun3ka eu1o2 eu3p e1up. eu4pd eup2f e3u4pg eu4r1an eu2r3ast eura3t eu2rau eur1c e2ure euren2 eu2rens eur4er eurf4 1euro eu4rs eur4so e3usar eusch2o eus2i eu4sk eu3s2p eust4 eu1sta eu1sto eu1s4tr eut2e eute3r2e eut2h 1eu3tha eut2i eut2o eu5tor euts4 eut4schn eut4schr 2eux eu1y eu2za euz3eic eu2zo eu2z3w e1ü e3üb e2vak e3var eva4s3 2ev2e eve5ri evie3le 2e3vor ewä2s e2we. ewei4sc ewert2 ewer3te ewi2s e3wit 2ex. 1exa4m ex3at 2exc 2exd e2xel ex1er 2exes e1xi 2exik e2xil e2x1in e3xio 1exis ex3l 1exp 2expu 2ext. 2ex2ta ex2tin 1extr 2extu 2extv 2exu e2xum 2e1xy 2ey1 eyl2 ey2n ey3no eys2 e3z2a ez2ä e2z1enn e3zi ezi2s ez2o ez4wa ez4wi ezz2 é1 é2e égi2 él2 élu2 ém2 ér2 ési2s éu2 éz2 è1 ène1 ènes4 2ët ê2t 1f 2f1abb fa2ben 2fabf 2fabg 2f1a2bl 2fabn 3f2abr 2f1abs 2fabw fa2cheb fa2chel fa2ch1i fa2cho fachs4p fa2dan fa2del f4aden f1ader fa2di fa2dr fa3e fa4eli 2faf fah4l3ent 3fahrt fai3b f1a4ka fa4ke f3aktio f4akto f2aku fa3l2a fa3le fal2kl fal2l1a fal3le. fal2l3ei fall3ent fal2ler fall3er4s fal4scha fal4schei fal4schl fal2tr fa4mei 4f1amp f1amt f2an. fa2nar 2fanb fand2a f2anf fan2ga fan2gr 2f1an3k 2fanl 4fann f1anp 2fanr 2fanw 2f1an3z 2f1a2p f2ar far2b1a far4bel far2b3er far2bin farb1l far2bo far4b3r far2b3u f3arc 3fa3ri farm2e far2r1a far2rh farr3s 2f3art 2f3arz fa3s4a fa3sh fa2st 2f1astr fa2ß f3at f4at. fa2to f4ats 4fatt 2f1aue 2f1auf f3aug fau2s f1ausb faus4t3r 3fav fa2xa 3fä1c fäh4rin fäh2ru f1älte 2fäq 3färb 2f1ärm 4f1ärz fässer2 fäs4serk fäs4serw fä2ßer 2f1ätz 2fäug 2fäx 2fb2 fber2 fb4re 2f1c f3ch 2fd2 f3da fdien2 fd4rö f3ds 3fe. featu4 fe2c f2ech fe3che fech5t2e fe2del fe2dr fe2e1i feein3 fe1em 4f1e2he fehle2 feh2lei fei3le f2eind fe3infr 2f1eing fe3ini fe3ins. fei4nu 2f1einw f1eis fek2tin fek2t3r fe2l3a2 fe2l1ä fel2da felde4m feld2er fel2dr 2fe2lek fe2l1er fe2les fel3le. fe2l1o fels2t felt4 4fel4tern f2em. 2femb fem4m 2femp 3fen. fen3a2 fe2nä fend2 4fenerg fene4t fe2ni fe2no fen3s2a fens2c fenst2 f1ent fen3t2a 2f3entf f2enti 2fentla f2ento 2fentw 4f3entz fe4pi f2er. fe2r3a2d fer3al fe1ran fe2rang fer2ant fe2ranz fe2r1ä 2ferd. fer3da fer3d2e3 2ferde. 2ferden fe2r1e2b fe2rec fer2ei 4f3ereig fer3eis fer3ell fe3rerf fe2rer2g fer2fah fer2fol ferg4 2fer2geb f4erges f4ergr fe2ri2d ferie4n3 feri4on fer2leb fer3m f2ern. fer4nei fe2rö f4erpa f4erpf f4erpl f4er5ra fer2reg ferri2 f2ers. f2ert fert4r f2erz fer2zeu 3fes fes3s2e fe2sta fest3a2b fest3an fest3ei fes4tel fester2 fes4t1o fe2s4t3r 2f1e2ta fe4tag fe2th fet4t3a fetti3s 2feu. feuer3ö 2f1ex fe1y2 2ff ffab2s ff1a2d f3f2ak ff3ar f3fas ffa2t ff1au f2f1e2b f2f1ef f2f1ei ffe3in. ff1e2m f2femi ff2en ff3erle ffer3z fff4a ffi3k ffin3s ff1lag ff3le ff3li ff5lon f3flü ffo2r ff1ox f3f4rä ff3ro ff4rü ffs2am ff2s3p ffs3tie ffs3tut ff3stü ff3t2 ffus3s 2fg2 fgeb2 fge3s f3gh fglim2 f3gü 2f1h2 fh4eu f3hu fi4ak fi2ar fi3at fid2 fi2do fid4s f2i2e fi4eb fie1i fien3 fi1er2f fi4es. 2fif fi2g3r fi2k1as fi2kel fi2kin fi2kn fi2k1o4 fi4k3r f2il fi2l3an fil3d fi2les fil2et fi3li fi4lin fil2ip fil2ma fil2mä fil2med fil2mei fi2l1o 2f1im fi4mi 4f3imp 3f2in2a fin2e 2f1inf fing2 fing4s 2f1inh fi3ni fin2s fin3sc fin3sti 4f1int 4f1inv fi2o fi3ol fi2r fi3ra fi4re fir3me fi3s2a fi2sch3a fi4schei fisch3o fi2schr fi2sch3w fi3s4h 2f1iso fis2p fi2s3t fite2 fi2tin fit1o2 fi4tor five4 fi2xel fi2za 2fj f2jo 2fk2 fkaken4 fka4t3 fk4ne f2l2 2fl. f3lad f5land f4lans f3lap f4lasc fl4at f3lat3s flauma2 3flä f4läc 4fläd 4fläh 4f3län 4flär 4f3läu f3le. 2f3leb f4lec f4lee 2f5lein flek3 flekt2 f3ler f4lex f3li. 3f4lim f3lind fli4ne f3ling 2f3lins f4log 2f3lon 3f4lop 3f4loß 3f4lot flo2w f3lö 4flöf f4lög f4löß f4löz 3f4luc f3luf 3f4lug 3f4luss f4lut flut1o f3lüm fly1 2fm2 f3ma fma3che fma2d 2f1n2 f3na f3ne fnerz2 f3ni fni2s f1ob fo2be 4fober fob2l 2f3of fo4fe 3foli3 3fon fo2na fo4nan fon3au fon3dr foni2e fo4n1in fo2nop fons4 fo2nu f1o2p fo3po 4f3org fo3rin 3form for2m3a2g for4mas for2m3ei for2min forni5er. for4st 3fortb for2t3ei for2ter for2th for2t3r fort3s2 for3tu for2u fot4r 2föf fö4fe 2f1ök 2f1öl för4s 2fp2 f3pf f3pl fp4lu 2fq f2r2 f3ra. frach4tr 2f3rad 2f3rah fra4m fr4an f3rand f3rap f3rase fras3ta f3rat 3frau. f3rauc 2fräd 3f4rän 2fre. f3rec f3red 4fref f4rei. f3reic f4reie frei3f f4reig frei3k2 4frein 2frek 2f3rep f4req f3resi 4frest 3f4reu 2f3ric fricht4e fri3d f4ri2e f5rieb f5rief 2frig f4ri3k 2f3rin f3rip fr4is f4risc f4rist 2f3roc f3rok 2frol 3f4ro2n fro4n1a f4ror f4ro2s f3rot f3roz frös2 f3ru f4ruc f3rü 2f1s f2s1al f2sa2n fs3ane f4s3ar f2s1a2s fsa2t fs3ate f2saut fs2än f3sc f4sca f4sce f4schan f4schef f4schro f4scr f2s1e2b fse2ei fs1ehr fse2n fs1en1e f2s1ent f2s1er fser2u fse4t f2s1eta f2s1i2d f3s2ky f2s1o2 f3soh f3sol fs2pa f2s3pas f2sph f3s2pl f3s2por fs2prä f2spre f2spro fs2pul fs3s2 fss4h fs2t f4st. fst2a fs3tak f2stas f3stat fs3tät f2stäti f2stech fste2i f3stel f3stern fs3th f2stip fs4tor fst4r f2s3tres fs3trü f2stüte f2s1un f3sy 2ft f4ta. ft1a2be ft1abl ft1af ft2ag ft1ala ft1an f2t1ap ft1a2r ft3att f2t1äu fte2c ft1eck ft1edi ft1eh fte2he ft1eig ft1ein ft1eis ft1eli fte3ma ft1emi f4t1ent ft3erfü ft1erk f2t1erl fter2le f2t1erz f4t1eti f2t1ex f2t1h f4t3hei f2t1id f3tik f2tim f2t1in f3t2ing fto2 f2t1of f2t3ot f3t4ran f2tres f3treu ft4rit ft3ro ft4ru ft5rud ft5ruh ft2s1 ftsa2g ft4sam ft3s2c ft4sche ftse2 ftsen1 ft3st ft4staf fts3tät ft4stei ft4stem ft4stier ft4streu f2tum ft1urk ft1url f3tü1 f4tüb ftwa4 ft3z2 ftze3d ftz4w 3fuc 3fug fugi3 3f2uh fuku3 fulb4 f1um1 fu2mei f2umm 2fums fun2d3er 2f1unf fung4 2fungl 2f1u2ni fun2k3l fun2ko fun2k3r fun2ku 4funm 4funr 4funt f2ur furch2 fu4re. 2f3url fus2sa fus2s3p fus2st fu2ß1er 3fut 2füb fühl2sc fün2 fü2r 2fv 2fw fwur2 2f1y 2fz fz2a fzeiten4 fzei4tend fz2ö fz4wi 1g 3ga. 2gabf 2gabg 2g1a2b3l gab2o gab4ri 2gabsc g2abt. 2gabtr ga3bu 2gabw 2gabz ga1c gade2r ga3d2i gadi4e ga2dr gae2 ga3fl 3gag. ga3k ga4kt ga4ku gal2a 2g1alau 2g1alb g1alg gal3lo 2g1alp 2g1alta 2g1altd g1a2lu ga4mec gam3ma 3g4amo 2g1amt g1a2na 2ganal gan3d2 2ganf 2ganga 2gangeb gan2gr gang4sp gan2g1u 2g1ank 2ganl 2ganmu 3gano ga2nob 2ganr gans2 g2ans. 2g1ansi 2ganst 2ganw ga1ny 2g1anz ga3pe 2g1app 3gar. g2ara 2garc 3g2ard ga3ret ga3r2i 2g3arm ga3r2o gar2s 2g1arti ga3ru 2g1arz g2as. ga2sa ga4s3al ga4sam gasche2 gase2 ga3se. ga2sei ga2sel ga2se4m ga2si ga2sor gas3pe gas3s2 3g4asse. g3asses 4gassess ga2st ga4ste gas4t3el ga4str gast3rä ga3t2a 2gatm gat4r gau1c 2g1auf 2g3aug g2auk gau3ne 2g1aus 2g1aut ga3z gäm3 2g1äp gär3th 2g1ärz gä4st 2g1ät gä4us 2gb2 gber2 gbi2 gb4ri gby4t 2g1c 2gd g3d2ad gda3de g2d1ak g2d1an g2d1au gdä1 g2dei2 gd1els g2dent g2d1er g2d1et g2d1in g2dop gd3re gd3ru gd3s2 gdt4r ge3a2 ge4at. ge4ate geb2a 3gebä ge4bb 3gebi ge3ble geb2lin geb4lo gebot4 ge4bt 3gebü ge1c ge3ck ge1e2 ge3ec ge2es geest3 ge3fa 2gefak 3gefä 4g1eff gef4l gef4r gege2n gegene4 gegen3s4 ge3g2l geg4r 3geha 3gehä geher3l ge3ho ge4hs ge4ht ge3hur 2g1eid ge4ie2 ge4ig ge1in ge2inf gein2h gein3i 2g1einr gein2s gein2v ge1ir 2g1eise gei3sh geis2s3c gei2st geist3r ge4iz 2gek. ge2lanz gelb1r gel2b3ra gelb3s 3ge4ld gel2den gelder2 gel4derh gel4ders ge3lec gele3cke ge2lef 2g3e2lek 2gelem gelen1 ge2lene geler3l geler3ö ge2l3ers ge2l1ev gel3f gel1i4m gel3la gell2i gel2ö gel3sa gels2p gels2t gel3ste gel3sz ge4lt gel2ta gelt4r gel3z4 gem2 ge2ma. ge3mau gem4e 4g1emp gem3s ge3mu 3g4en. ge3na ge4n1ac ge4nad ge4nak ge4nal ge4nam ge4nap ge4nar ge4nat 2genda. gend3in 2g3endmo gen2d3r gen2eh gen3eid 2generg ge2n3ern gen4erwe gener2z ge2nim gen3k4 gen3n 3geno ge2noc ge4nr gen4sam gen4semb gen3sk gen3sz gen3tä 2gentf gen3t2h gen3tr 2gentw ge1oo geo2ri g2ep ge5pfi ge3pl ge3po ge1ra ge2ra2b ge2rak ge2r3al ge3rann ge2rant ge4r3a2r ger2as ge4rb 2gerdg ge3rem ge2rene ge2reng ge2ren2s ge2r3ent ger2er gerin2d gerin4f ger2inn gerin2t 2ger2klä g3erlas 3g2erlä ger3no 2g1ernt ge1ro ge2rob ge1r2ö 4g3erprob ger2sat 2g3er2seh ge3r2u ger2zeu ge1s2 g4es. ges3auf gesch4 ge4sche. ge2s3eb 2g3e2sel. ges3elt ge2s3er ge3sha ge3si ges3k ge3so ges3s2a ges3se ges3s4t gest2 gest4a ge3stak ges4tan gest4e ges4tem ge4s3ter ges3th ges4tier ge2s3tur ge3t2a ge4tang ge4tant g1etap ge2thi ge5tri ge3t4u ge5tun 2g1e1ul ge3unk ge1urt ge3u4t ge3we 2g1e2x 2gf2 g3fe gfi2l gf4rü 2gg gga4t g3ge gge2ne gge3sa ggi3e gg2l g3gla g3glo g2g3n gg4re gg5re. ggs2 2g1h gh2a 3ghale gh2e gheit4 3g2het 3g2hie gh1l gho3re 3gh2r ghs2 gh3sc g2hu gh3w gi3alo gich2 gicht1 gi2e gi4eb gie3g gie1i gie3l giel2a gie5n2e gi4eno gi3ens gie3res gi3ern gie1st gift5s gi2gu gi2kel gi2me. gi4mes gi2met 2gimp 2gin2d gi3ne 2g1inf 4gingeni 2gin2h g1i4ns gin2sa 2ginsf 2g3int 2gin2v gi2ob 2giok 2g3isel gist4 giste4 git2a gitt2 gitt4e gi3tu gi4u3s 2gj 2gk2 gk4ne g3ko gl2 2gl. 2g1lab 2g1lac 2gladu 2g1lag 2g1lam 2gland gla2s1c glas3p glas3t4 gl4at 3g2laub 2g1lauf 2gländ 3gläs 2gläuf gl3b g2le 2g3le. 3glea 2g3leb g3lec 3gled g3lee 2g3leg 2gleh g4leic 4g3lein glei4st gleiter6sc glei4t5r g3len 4glenk 4g3ler glerei2 2gles 3gles. g3lese g2lia 2glib 3g2lid 3g2lie 4g3lieb 2glif g2lik 4glil g2lim 2glin g2lio 2glis g2lit g3lite g2liz g3lize g2loa g2lob g2loc 2g3loch g5loks g2lom g2lop 2glorb 2glos g2lot 2glöch 2glös 2glöw 2gls g1lu 2g3luf 2gluk 2g3lun g2lut 3g2lü g3lüg 2glw 3g2ly 2gm2 gmen2tr gmi2s g1n 2gn. g2n2a g4na. 2gnac g4nad 2gnah gn4al gna2ler3 2gnanl 3g2nä 2gnb 2gnc 2gnd gn2e g3neh 2gn3ent gne2tr gneu1 2gnf 2gng 2gnh g2nie g2nif g4n1in 2gning 2gnint 2gni2s3 gnise2 2gnk 2gnl 2gnm g2no 3g4non gno1r g3not 2gnp 2gnr 2gns 2gnt 2gnu 3g2num. g2nü 2gnv 2gnw g2ny 2gnz 3go. go2a3 go4al g1ob gobe3l 2go4bj g2ob2l go4b2s go4ch goe3 2g1of go4fe 2gog go4gh 2g1oh2 goh3ren go1i gol2a gol2da gol2fr go4mn 3gon. go4nat go4nd gon2e 3gons 3g2opa gopf4 go2pos 2gopt gor2a 2g1o4rd g1org go4rt 3gos go2si go2sp go4ss go1ste 4g1osz go3th go4tt got4terb got4t3erg 3gou go1y gö4fe g1öl 3göt 2gp2 g3pf gp4fu gp4la g3ps g3pü 2gq g2r2 g4r4ab gra2ba gra2bi gra4bl 2g3radl 2g3rah g3rai 2g3rak gr4al gram1 grammen4 gram4m5end gram4mer g3rand g4rande 2gra2r grar1e gra3rie gra4s3a gra4sh gra4sp gra2st 2g3raub grau5f 2graum grau3sk 2gräd g3rän gräs1c g3räu 2gre. g4reb 2g3rec g3rede g4ree 2g3ref gre2fr 2grege 2g3reic grei4fr 2g3reih g3reim g3rein g3reit 3g4rem 3g4ren 4g5renn gre3no gren4z3ei grenz3w g4rer 2g3rese g3ret g3rev 2g3ric gri2e 4g3riem g3riese 2grig gril2la 4g3ring 4g3rinn gro2b3a gro3ber gro2bl gro2b3r 2groc 2groh 2g3rol gr4om 2g3rose g4ross gros4sel g4roß g4rot 2g3röc 2gröh 2gruf. g4ruft 2g3ruh g3rui 2g3rum grunder5n grun2g 3grup 4g3rut 2g3rüc 2g2s1 gsa2 gs3ab g4sac g5sa3ck gs3a4k g3sal g4s3alb g4sall g4salm g4salt gs2am g4s3ama gs3amb g4s3amp gs3a4p gs3ar g3sat gsa3te gsau2g gsau4r g3säu g3s2c g4sca g4s3ce gsch4 g4schef gs4chi g4scl g4sco gse2 gs2e3h g3s4eil gse4kl g3sel. g4sela g3seln gs3em gsen1 g4ser g3sere gs3er1i g4se4s gse4t g4seu gsfi2l gs3ha gsi2d gs3i2k g3s4il gs3io g4s3ita gs2ki1e gso2 g4so4b gso4f g3sol gs4on g4s3op g3s4oz gs3p gs4pac gs4pant g3spei g3spek g4spf g3spi gs4pir g4spl g3s4port. g4spru gsrü2c gs3s2 gss4t gss4w g4st. gs3ta g3s4tad g4stag g3s4tan gs6tand g4stanz g3star gs4tati gst1au gs3tä g3steh g3s4tein g3st2el gs4tell gste2r gst3err g1steu gs2thy g3stif g3stil g3stim g3stir g3sto g4stoch g4stod gs4tof g4stor gs3tö gs4tör gst3reit gs3t4res g4s3treu gs4t3rit gst3ros gs3trü g3stun gs3tü gs4uc gs3un g3sy gs4ys 2gt g3te gtei3s gt1h gt2hy gt2i gti2m g3to gt4ra gt2s g3tü gu4ale gu3am gu1ant gu1as gu1c gu4d3r gu2e 2gued guet4 2g1uf gu4fe 2g1uh gu3ins gu1is gum4e 3gumm gummi1 gun2e 2g1unf gunge2 2gungew 2gungl 2g1u2ni 2g3unk 2gunr gun2s 2gunt gure4 2g1url gur2t3h gur2tr gurt3s gu2s gu4s3a gu3sc guschi3 gu3se gus3se. guss1o gus2sp gus2st gu4st gust3a2b gus3te gus4t3en4d gus4terl gus4tr gu2t gut1a gut3er2h gut1h gut2s3p 2güb 3gür3 gü2s3 2gv 2gw gy2a gy3n gy4na 2gz2 gzeu2gi g3zh 2ha. hab2a hab2e h3abf hab2i h1ablu 2habn h1a2br h1abs 2habw ha2ch3en ha2cho hacks4 2hada ha2del h1adle h1a2dr ha3dri 2hae ha3el ha4far haf2e h1affä haf3f4l h2aft haf4to haf2tr haf4tre haft4s3p hag2a h2agg h1ah ha3ha h2ahs h2ai 3hai. h2aj 2haka ha4kes ha3kl 2h2al. ha3l2al halan2c h1a2lar ha2lau hal2ba hal4bel hal2bin hal2b3r hal2bu 2hale 2halh hal2i hal2l1a haller2 ha3lo 4halp hal4sk hal2sp hal2st hal2tal hal2tei hal2t5r hamot4 hampi4ons 2h1amt h2an. 2hana ha2nal ha2nan han2au 2hanb h2anbe h2and han2da han3den han2d3er han2d3r hand3s ha2nem hanf1 han2fl han4g3end han2gro han2k1 2hanl 2hano 2hanr h1ansc 2hanz 2h1ap 3h2ape ha2pl ha2po ha2pr ha3ra h1a4rab 2harb 2harc h2ard har2fr h1arm. har3ma h2arme har2me. har4ne ha2rom 2hars har2th h1arti har4tr h2arts har2za h2as 2has. 2ha3sa has4c has2h3 has2p has4sa has2ser2 has4s3t ha2str h1a2ß ha2ta hat2i h3atl ha2t3r 2hats hatt2 hat5tr h1audi h1aufb hau3f4lie hau3f4lo 2h1aufm h1aufs h3au3g2 h1aukt hau2sa hau4san hau2s1c h2ause hau2sel hau4s3ent hau2spa hau2spe haussen4 hau2sur hau2t1a hauten4 hauto2 hau4t3r ha2ve. havil2 häde2 h1äff 2häi hä2kl 2h1ärz hä4s3chen 2h1äst 2häug häu2s1c hä3usp 2hb2 hba2ras hber2e h3bo hb4ri 2h1c 2hd2 hdan2 hdä1 h3ds 2hea he2ad he3as heb3eis he2b3l he3bla he3ch2e he1cho h3echs hed2g he2dit he1e4m he1e2n he2en. hee2s he1e2t h2ef. he2fan he2fau he2f1ei hef2em hef3erm 2heff he2fid he2f3in2g he2f5le 2hefr hef4ra he2fre 3heft he2fu he2hel hei4a h4eib h1eie h1eif hei4fr h1eig he2im hei2mal hei2man hei2mei heim3p hei4mu 2hein hei4na heine2 hei2n3eb hei2neh hei4nene hei2n3er2 he2inf h3einsp 2heio 2he1ism he1ist h2eit he3i4ti heit2s3 h1eiw hekt3a he2la he3lag hel1an hel3au hel1ec he2lek h3elem h2elf hell2a hel2l3au helm1a hel2man hel2mei he3lo he4lof hel2or he2lö helsau2 4helt h4em. 2hema hem2b 1hemd 2heme h2em2i h3e2miss 1hemm 2h3emp h2en. he4n3a2 he2nä hen3ebe henen1 hen3end he4nene he4nens he4nenz hen3erg he2nerm he2n1e4t 2henga hen2gag hen2kan hen2kau 2heno heno3t hen2sem henst2 hen3str hent2a hen2ter hen5tr h1ents 2hentw h3entz he4n3u hen3z2 2he2o he3on he3op heori2e h1e2pi h1epo hept2 h2er. her3a2b he2rad 2herap he4r3a2r herau2 herb2 her3c her2dri h2ere he2r1e2b he2reck her2eif 2he3reig herein3 he4reis. her5eises he2rel he2rene herer3s he4rersc he2rerw h4erfam h1erfo her2fol herg2 4her4gebn he2rid heri2e 4herif herin2d herin4f he4rin4nu herin2s herin4ter h1erke her2klä h3er4kran h4erlad 2herm h1ernt he3ro he4r3o2b he4rof he4rop he4rot h1erör hers4k her3sta hert4 her3th her3um he2rut h1erwä her2zap her4zeng her2zer h3erzeu her2z3w he3s2a 2hese he3si hesi2e hes4p hes4ser hes6tän hes6tro hes6trö hes6tüc he2tap hete1 heter2 het2i he3t2s he2u heu3g h3eule. he3unt 3heusc he1x4a 2hexp hey2 he1ye 1hè 2hf2 hfaller4 hfan2 hfel2l3 hfi2s h3fl hf4la hflei2 hf4rü 2hg2 h3ga hga2s1 h3gr hg4ru h3gu 2h1h2 hhoh2 2hi. 2hia hi2ar h1iat 2hic hi1ce hich4t3er hicht4sp hi3d hi4db hi4dd hid4e hi4dio 2hido hi2e hi3ens hie2rei hier3i hie2rin hiers4 hif3f4r hi2k3r hi2l3a4 hi3l4au hilen2 hil2fr hili2e h2im 2hima h3i4mit h4imm h3impe h3impl hi2n hi3nak hi3n2am hi3nap hi5n2as hinau2 hine2i hi3nel hin2en h1inf h1inh 2hi3n2i hin3n2 hi3n2o3 hin3s2 hin2t1a 2hio hi3ob hi4on hio3p hi2p3 hi4pl hips2 hi4pu hi2r hi3ra hir3b4 4hi3re hi3ri hir2m1a hir2mi hirn1 hir2ner hir2s 1hirt 2his. his2a hi2se h1i2so his2p hi3tac hi3th hi3t2i hit1r hit3z2e hi2v1o 2hj 2hk2 hkamp2 h2keu hki2n1 h3kl hklat3 hk4ne h3kö hk4re 2hl hl2ag hla2gr hlan4d3a hl1ans hl1anz h1las h1lat h1laut h1lay h3läche h4läf hl1är h1läs h1läu hlb4l hl3d2 hld4a hld4r h3le. hle3a h3leb h3led hle3e h2leis h3leist hl1el h5len. hle4nas hl2enn hl3entr h2lents hl2enz h3ler hle2r3a hl2ere h2lerg hler2hö hl2erk h6l3er2nä hle3run hl1erw h4lerz h3les h4lesi h4leud h2lie h3lied h2lif h2lim hl1ind hling4s h2lip h2lis h2lit1 hl3l2 hl3m2 h2lo hl1ob h3loc hl1o4f h3log h4lor hlo2ra h5lorb h3los. h3losi h4loss hlos4st h2lös hl2sal hl4sar hl2ser hl3ska hl3slo hls2tec hl3s4tern hls3tie hl5str hl2su hl3t2 h3luf h3luk h3lumpe h1lüf hlz4w 2hm hm2a hm3abl h3mad h3mag h3m4ak h3man h2mant h3mar h4m3arc h3mä h4mäc h4mäh h4mäl hm2e h3me. h3med hme1e4 hmeer2s h3mein h3meise h3meld hme3le h3men hmen2s hmen4s3p hme2ran hme2rei hme2rid hme1s2t hm3estr h3mex hmi2e h3mind h3mirr h3misc h2mo h3mop h3mot h3m2ö h4mök h4möl hm3p2 hm2s hm3sa hms3p h2mu h3mul hmut4s h3my 2hn h2na hna2c h3nag h3nam h4nar hn3a2te h4natt h3nau. h2nä hn1äh hn1är h3näs hn3d hnd4r hn2e hne3b hne2e3 hn3eff hn3eig hn3ein h2nel hne4n hn4eng hne4pf h3ner hner2de hner3ei h4n3e2ro h4n3ersa hn3eur hn3ex hn3f2 hnf4l hnflei4 hnhof6stras h2nic h2nid h2nie hn1im hn1in h2nip hni4sa hnk2 hn1ob h2no2r hnra2 hns2 hn3sa hn3sp hnst2 hnsuch2 hn2th hnts2 h2nul h2n1unf hnz2 h4oben ho3bern ho2b3l ho2ch3 ho4cha ho2cka ho4ckerl 2hocy 2hod 2ho2e hoe3n ho3er ho4f3a2 ho4fä ho4fed ho4feu hof3f4a hofi4 ho4f3l ho4f1o ho4f3r ho4fu ho4fü 2hoi ho2l1a2 hol3ar hol3dr 1hole ho2l1ei ho2lem hol3g holin4 hol3k hol3l4 hol3s 2holy h3olym 1holz hol4zene hom2e ho4me. ho4mec ho4med ho4mel h2on hon2er honi2e ho1on hoo2r 2hop ho2pe ho1ra ho2rak h1o2r2an ho2rau h1or3d 2hore ho2rens ho3ret hor2fr 2h1org hor3ta hor2ter h1ortu h2os. hose2 ho2sei ho3sl ho4sla 2hosö ho2sp ho3spr ho4ßene 2hot. 2hotr 2hot3s2 ho3un hou4s 2ho2w1 ho3wer h1ox ho1y2 2hoz 1h2ö 2hö. hö2c hö3ck 2höe 3höhe hörs4 hö2s1 h4ösc h3öst 2hp2 h3pf hp4lä h3pu 2hr hra2b hr3a2c hr3ad hr1a2g h1r4ah h1rai h3ramp h1rane hr3ap hrau2c h3räu hr1c hr3d h2rec h3r2ech h3red h3ref hr3eff h2r1eh h4rei. h4reib hrei2ba hrei2br h3reic h3reif h4r3eig hr2eini h2reinl hrei3th h4r3ele hren3z h3rep hrer2fo h4rer4geb hr2erh hr2erk h4rerla hr2erle h4rer4leb hrer2lö hr2erm hrer2sa hrer3st hrer2tr hrer4trä hrer4tüc hr2erw hr2erz h3re2s3 hress4 hrest2 hre2t h2r1eta h2r1eu h2rev hrg2 h2ri h3ric h4rick hri2e h3riesl h3rin hr1int h4rist h3ritter hr3m2 h3rog h3roh h3ro2l h4romat h4rome h4romi h4romo h4ron h1ropa hro4r h3rou h3rö2s hr4s3ac hr4s3and hr4s3au hr2s3em hr2sen hr2s3er hr2set hr4sh hr2s3in hrs5ka hrs5kl hr4s3of hrst2 hr2su hrs3z hr2tab hr2tan hr2te2l hr2th hr2top hrt3ric hrt2s h3ruh hr1ums h3rus h3rut h3rü h4rüb h2ry hrz2 2hs hsa2b h4s3acht h2s1a2d h2s1alk hs2alt h4samt h2san hs3and h3sann h2s1as h2sath h2sato h2saud h2saut h2säh h2säug h2schan hs4co hs2cr h3se. h2s3ec hse2e h2s1ehr h2s1eie h2seind h2seins hsela2 hse2lin hs1emi h2sendw hsen3erg h2s1ent h2s1erb h2s1erf hs1erg h2s1erh h2serkl h2s1erl h2s1ern h2serö h2s1ers hser2u h2s1erw h2serz h2sex h3s2ext hsha4k h2s1i2d hs2im h2s1ing h3s2inni h4s3ita hs2kal h3skand hs1of h2sop hs1or hs2p h2s3pac h3span h4s3pani hs3par hs3pat h3spec h3spei h3sperb h2s3ph hs3po h3spra h3spü hss2 h4st. h1st2a hs3tabl h3stad h2staf hst3alt h3stan hst3arb h2s3tau h2s3täu h1stec h1stei h1stel h2stele h3stemp h3s2terb h3s2tern h1s2ti h2stier h2stit h1sto h2stol h2stor h1str hs3treue hstro4 h1stun h1stü h2s1u hs2ung 2ht ht1a h2tab hta2bl h2ta2d ht2ag ht2akt. ht2akte h2tall h4talo h2talp h2talt h4ta4m h2ta2n ht3ane ht2ank h2tap h2ta2r ht2a2s h2t3asi h2tasy h2t3at h3tat. h3tate h2tau h3taum h4tax ht1ä h2tär hte2ber ht1e2c hte3cha hte2d h2t1ede ht1eff ht1e2he h2teif h2t1eig h4t3eilz h2t1eim ht1ein h2t1eis h2t1eke h4t3elas hte4l3ei. h2telek h2t3elfe h2telit h2t1e4mi h2temp h4tenga h4t3engl h4t3en4ta h4tentf h4tents hte3rel hterer2 h2t3erfo ht3erfü h4terfül h4tergeb ht3ergr ht1erh hter4häl hter4höhu h2terkl h4terleb h4t3erleu h4terneu h2t3ernt h4ter4prob hter4reg ht3erspa hter4spar ht3er2st h4tersta ht4erstr hter4tra ht3erwä h2t3erze h4t1e2se h4t1ess h4teta hte4th h2t1eu h2textr h2t1h h4thei h3thera h3thes h4thi h4tho h2t1i2d h2t1im h2t1i4n3 ht3ine h2t1is hti3t2 htni2 hto2 h2t1ob htod1 h2t1o4f h2t3oly h2ton. h2tope h4tord ht3rak h3tran ht3rand h4t3ras ht4rates ht3rau h2traub ht4raume ht3rec h3treck ht3rei h2t3res ht3ric h4t3rieg h4t3rin h4t3riv h2t3rol h2t3ros ht3röm ht3ru ht2sah ht2sal ht4s3a4n ht2scr ht2sein ht2sel ht2s3end ht2seng htse2r1 hts3eri htsha4 ht3s2hak ht4s3kr ht2s1o ht2sp ht3spen hts3tät hts4tie hts3trau ht2stri ht2s3tur ht2s3tür ht2su htti2 htt4r h3tub htu2e h2t1urs h3tü h4tüb ht3z2 hu2b1a hu2b1ei hu4bel hu2b1en2 hu2bi hu2b3l hu2b3r hu2bu hu1c hu4fa hu2h1a hu2h1i hu2ho h1uhr h1uhu hu2kä hu2k1in huko1 huk3t2 hu2l3a2 hu4lab hu2lä hule2 hu2l1eb hu2l1ei hu2lem hu2l3eng hu2lent hu2l1er2 hu2let hu2lid hu2l1in hul3l2 hu2lo hu2l3ö hul3s4 hu3m2a h1umh h1ums hu2n h1una hun3d2e hunde3s hu3n2e 2hunf hung2 hun3ge hung4s h1uni 2hunt h1ups 2hur hur3g2 hur2t3h hu3sa hu2so hus2s3a hus2ser2 hus2s1o hus2sp hus2st hu2tab hu2ti hu2t1o hu2t3r hut2t hut3te hut2zen hut2z3er hut2zu h2ü h3über h4übs h3übu hüf2 hüft1 hühne4 hüs3 2hv hvil2 2h2w2 h4wall hwe1c h3weib hwei4fr h3weih hweins3 hwein4sa hwen2ka h3werbu h4werp hwes3t h4wirr h3woh 1hyd hy2de hy3dr hy2lor 4hyme 1hymn h1yo hy3os 1hyp hy2pe. hysteri4e 2hy2t 2hz hz2a h3z2o hzug4 h3zw hz4we iaa2 i3ad. iad2a i1adn ia3e2 iaf4l i2ago ia1h2 i1ai i3ak. i3ake ia4kei i1akt i1al ia2l1a2 ial3ar ial3as ia2lä ial3b4 ial3d4 i3aleb i3alef i3alei ia3lek i3alel i3alemp i3aleng i3alent i3alep i3alerb i3aler2f i3alerh i3a2lerm i3a2l1et i3alex i3a2lia i3alim i3a2lin iall2i i2alo ia2lon ia2lop ia2l1o2r ial3p ial3sc ial3t2 ia2l3u4 ial3z4 i3am. iampe4 i1ams i1an. i1an2a ia2nal ian3alt ia2nau i1anc i3and2 i1a2n1e2b ia3n2er i1ann i1ans ian2s3p i3ant i3anz ianza4 ia1o ia2op i1ar i3ar. ia2ra i2are 2i1as i3as. i4asc i4a3sh i2asi i4aso i4a3s2p ias3s iast4 i4asu i4asy i3at. i3at2h i4athe 1iatr i3ats i3au ia3un i2az ia4zz 2i1ä iä4mi iär2 i3är. iär3m i3är3z i3ä4tem iä2ti iä4tr iät3s2 iät5sa 2ib ib1art i2b1auf i2b1aus i2baut ib2bli ibe2i i2b1eig ib3einh i2b1eis ibel4u iben1 ibe4na i4ber4geb i2b3er2la ibe1ro i2bim i2b1in i2blad i2bläh ib3leis i2bleu i3blu i3b2o i2bö ib3ric i2b3roc ib2ser ib4ste ib2un i2b3unk i2b3unt ibus1c 2ic i3ca ic1c ice1 ich1a2 ich4art. ich1ä i1che ich1ei ich2er icherin5 i1chi ich1l ich3le ich3li ich6lor ich3m ich5mä ich3n i1cho ich3ort i2ch3r ich2sa ich4sele ich2s1i ich2sp i4cht ich2tr i1chu ich3w i1ci i3cke icks2p ickt2 i1cl ic3la ic3ra 2ida id2ab i3d2ac id4al id1a2n i3d2ans i3d4at id1au id2ax idä1 id2e i2dea 1idee ide2en id3eis 2idel idel4ä i2demul ide4n1o ide3ran iderin4f iderin4nu ide1rö id3er4reg i3des ide5sa ide3so ides4p 2idf idge3 1i2di2o idi4on i4diot 2idk idni3 i2dol 2idoo i2dö i2d3r id4rä id4rit id4ro id4ru id2sp 1i2dy ie3a2 ie2bä ie2bl ie2bri ie4b3rü ieb4sto ieb4stre ie1c ie2cho iech3t ie2ck ie2d3an ie3de ie2dr ie1e2 ief3akt ie2f1an ie2far ie2fau ie2fäh iefe2m ie3fer ief3f4 ie2f3l ie4fonk ief1r ie2fro ie2gl ieg5li ie3g4n ie2g3re ieg4s5c ieg4se ieg4si ieg4s3t ie3her ie2h1in ieh3r2 i1ei iein3 ie1ind i2e2l1a ie3lam ie4la2r ie2läs iel3d4 i2ele iel3ebe iel1ec ie2l3eic iel3eid ie2lek i4elen ie2lene ie2leng iel2erd ieler2e ieler4fi ieler2g ieler6lebn iel2erw ieles4 i2eli ieli2d i1e4ll2 ie2lo2b ie2lop ie4lor i2els2 iel3sz ielt2 iem2e iemis2 i1en i3ena ien1a2g ien4am ie4nas ien3au i3enä i2ene ien1eb ie2n1e4k iener4fo iener4la i3enf i3eng4 ienge2f ienge2z i3enh ie2nid ie2nim ie4nin i3enj i3enk i3enm i3enn i3e2no i3enö i3enp i3enr ie4n2s i3ens. ien3sc ien3s2e ien3si ien3s2k ien3s2p ienst5ade ienst3er ienst3rä ien3sz ien4t3ar i3enti ien3tr ie3nu ie4num i3env i3enw i3enz ie1o2 ieo4b ieo4f ier3a2 ie2rad ie2rap ierb4 i3erbun ier3d i2ere ie2reck iere3ins ie2r3eis ie5rek ie3r2er ier3erf ierer3k ierf4 ierg4 i3ergi i4eri ie2rid ierin3 ierk2 ier3l i1ern i3ern. ier3n2a i2erni ie2rö ier4re. ier2s3eh ier3sei ier3sta ier3ste ier3te iert2i ier3z2 2ies ie2san i2esc i2ese iesen3s2 ie3s4pa ie2spu ies4serl ies2st iest4e ie2stin ie1str ie1stu ie3su ie4t1a2g ie2t1ak ie2tan ie2t1ap ie2tat ie2tau ie4tent ie2t3erh ie2t3ert i4ethe iet3her ie2t1ho ie2thy ie2to ie2t1ö2s ie2t3ri ie2t3ru iet2se i3ett iet3zw ieu2e i2e1un ieu1s ie2w3u i1e2x ie3zo 2if i3fam if1ang if1ar i2f3arm if4at i2f1au if1än i2fec i2f1ef ife4i if1ein i2felem ifel2s3o if2e4n1 ifens2 i2f1erg if1erh ife2s if2far if2f3l if2fro iff2s iff4ste if1in3s i2f3l if1lac if4lä iflo4 if4los i3f4lü i2f3r i3fre i4fre. i4freg if4rev if4rö if2s if3sa if3se if3sp if3sta if2t3a if2ted if2t3ef if4t1ei if2te2l if2tep if2terk ifte4s if4t3esc if4th if2t1op if2t3r if4tri ift3sp ifts2t ift3sz if2tur i3fy 2ig i2ganb i4g1ano i2garb ig1art iga1s i2g3att igd2 i4gebrau i2gefar ige2füg 3i2gel. ige3lau i2geln ige4me ige2mis ige4na ige4nene igener4f ige2nid ige2o ige2pa ige2ra ig3erwer ig1erz ige2sel ige4spru i2g1ess ige4steu ige2tra ige2tre ige2woh ig3hu i2gim i2gl ig1lau ig1län i3gle i4g3led ig3lim ig4na ig5nah i4gnä i3g4neu ig4no igo3p i2g3rad i2g3re i2grou ig3s2a3g ig4sal ig3sä ig4scha ig4schr ig3s2o ig3sp ig4spa igs2pr ig3stei ig4sti ig4s3to ig3str ig4stras ig3s4tü ig2t3r igung4 2i1h i2hans i2har ih1auf i3he ihe1e ih1elt ihe4n ihenk4 ihe3u ih3m ih3n ih3r2 ihs2 ih1um. ih3w ii2 i1ia i1ie i3ig ii4ge i1im i3in i1is ii4sc ii3t i1it. 1i2js 2ik ik1aka ikaken3 i2k1akt i2k1alb i2k1alt ik3amt i2k1ana i2k1ang i4kantei ikanten4n i2kanth ik1art ik3att i2k1au ik1äh i2k1är i2keb ik1ebe ike2c i2k1ed i2k1ef i2k1ei ike4l1 ike2n1 ik1en2s ik1ent ike2ra i2k3e4r2e i2k1er2f i3kerfam i2k1er2h i2ker2l i2kero i2ke3ru ike4t i2k1eta i3ki. ik1i2d i3kie ik1in i3kin. i2kins iki1s i2k3l ik4län i3k4leri i3k4let ik4lim i3klu i2kne ik3nu iko3be i2k1off iko3p2 ik1o2r iko1s i2köl ik3rä ik3re i2kres ik3rin ik4ris i3kro i2krö iks2 ik3sa iks4t ik3ste ik3sz ikt3erk ik4t3esk ik2t3re ik5tri ikt2u i2k1uh i2kup i2kü i1la i2lab i2l1ac i2l1ak il1a4ma il1ana il1ang i2l1anm i2lano il1ans il2anz ilan4zer i2larb il1asp i2l1au i3laub i3l2aufb i1lä1 i2l1är 2ilb ilb4l il2c il5chen il2da il2dä ild3ebe il2d3en4t ild2erp ilde2s ild1o il2dor il2d1r ild3t 2ile il1e2c il1ein il1el i2l1emb i2l1e2mi ile3ni il1ent i2lentl i2lents i2l1er2d iler2ei il1erf iler2fo i2ler2g i2l1er2h i2ler2kl il1err i2lerri i2l1er2w i3l2erz ile4th il1ex ilf2 il2f3l il2f3re ilf4s3 il2gl 2ilh 2ili ilie4n3 iliga2 ili2g3ab ilik4 i2l1ind i2l3init il1ins i2l1ip ili3pf ill2an il2lenn il3l2er il4lt 1illu il2mak il2m1ap il2m1au ilm1ei il2min il2m1or 2ilo il2oh il4on il2op i2l1o2r i3l2ou i3lov il1ox ils3ent ils4to ilt2 il3th i1lu i2lum ilung4 i2l1ur ilü4b 2ilv il2zar il2zau ilz3erk il2zwa imad2 ima1i im2al im3anh im1ans i2marc im3aren i2m1arm i2m1art im2as im4at ima2tr imat3sc ima2tur im1aus i2maut im3b 1imbi i2meg im1ein i2mej i2mek i2mele i2melf im2en i2m1er2f i2m1er2l i2m1er2z i4me3sh imes3s i2meti i2mew imhau2 i2mid im1i2de i2mim i2m1ind i2minf i2m1ins im2mei immen1 im2m3ent 1immo im2mor 2imo i2m1ob i2mop imo3re i2mö 1imp imp2fa im3pf2o imp2s im3pse im3sph 2imt imt2e im3t2i imt3s2 imtu2 2imu im2um im1urk 2in. ina2be in3abu in1a2c i4nack in1ad i3nald inaler2 ina2lin in2alp i2n1am in2an in3an. in3ana in3ann i5nar. in2ara i2narb inas4 i4n1asb in3att i2n3au 2inä i2n1äh in1äs 2ind. inda2 ind2ac in2dal in2dan 2indä 2inde. 2inden in2dene inderer4t inder3t inde3sp 1index in4dh ind2i 1indik in3dö 2indr ind3se ind2spe 1indus in3d2ü 2ine in1e2c i3nee ine2en i2neff in2elen ine2n1 ine3nä i2nener inen3s i4nen2zy ineo4 i3ner. i2n3erbi in2erha i2ner2he in3erle i4ner4leb iner2lö i2nersa i2n3er2tr iner4trä i3nes inesi2e i4nesk ines2t in2et in1eu ine3un i3né in3f2 1infek 1infiz 4inflü 1info inf4r 2infre 2inga in2g1af in2g1a2g in2g1al in2gam ing1ar 2ingä 3ingeni in3g2er in4g3er2w inges4 2ingi 2in2gl 2ingr 2ings ing4sam ings4por in4gt 2inhaa 1inhab 4inhaltu 2inhar 2inhau 2inhe 2ini. in2id ini3de 2inie 2inig inig2a ini3kr 2inis ini3se init2 i3nitz 3inkarn inkels4t in2k3ent ink4er in2kro in3k2ü inma4le 2inn. in4nas inne4n 2innl in2nor 1innta 2ino in1od ino3e2 in3ols in1or ino1s i3no3t i2n1ou i1nö in1ö2d 2inr 2ins. ins2am in4samt. in3sat insch2 2inse. in2seb 2insed 2insen 2insk in3skor in4sl in4sm in3sof ins2p 3instal in2s3tät 4inst2e ins2tec in3s4tip 3instit 2instra in2st3ro in2strü 1insuf in2s3umw ins3umz in2sur in3sz 2inta 2inte. 1integ in3tei 2intep 2int2h inthi1 in3ti int2o 2intö 2in3t4r 4inträ in5tri 3intrig int3s i2n1u i4nuh in3unz 2inverm invil2 i1ny2 in3z2e inzel4ler in3z2i in3z2sc inz2u 2i1o io3a iob2l io1c io2d io3da io3e2 i2of iof4l i2oh i2ok io3k4r i3ol. io3li i3ols i3om. i3oms ion2 i3on. ional3a ion3an io2n3au i2onc ion3d2 io4nee i2onf i4oni i3ono io2nor i3o4ns3 ion4sa i2on3t i2ony i2o1o i2op i3o4pf iopi3 i3opt i2or i3or. i3orc ior2e iore4n i3org io1r2h i3orp i3ors i3ort i3os. io3sh ios2p i2o1st ios2u i2o3sz io3t i3ot. iote3l i4oth iot4r i3o4ts io4tt i2ou i2ov i3ox i2oz i3oz. i1ö2k i1ön i1ös. i1öst ip2an i3ped ip4el i3per 2ipf2 i3pfan ipfe2 iph2 2ipi ipi3a ipi3el ipi3en ip4lu ip2pan ip3pe ipp3f ip4pl ip4ps ip3pu ip2sa ip2sei ip2sp ips3t ip4sta ip4stü ipt2a ip2ter ipt3ers ipt2i ipt2u 2ipu 2iq i1r2a i3ra. 2i3rad ir4al i3ras irat2 i1rä ir1äh ir2b3l ir1c ir2ch3i ir2ch1o ir2e i3ree 2irek ire4na ir4er i3ré irg4s ir2i 2irig 2irk irke4n ir2kene ir2k3l irk4s3c irk2u irli4n ir2m1a2g ir2mak irm1au ir2mä ir2m1ei irme4n1 ir2m1o2 irm4th ir2mum ir4munt 2irn ir2n3a ir4nat ir4nei ir2no i3ro i1rö irpla2 irre4l ir2rh ir2schl ir2schm ir2sch3r ir2sch3w ir3se3 ir3sh ir2st irt2s3t 2iru ir1u2m iru2s1 i3r2ü i2sac isa4m3 i4samp i4s1amt is2ap isa2r is3are i3sat is1att i2s3au i2säh i2s1än 2isb i2sca i2schab i2schan i2schar i3s2che i4schef i4sch3e2h isch3ei ische2m i4schemi i4scher4z i2schin i3sching i2sch3l i2schm isch3ma i2schna isch3ob isch3re isch3ru i2schüb i2schwa i4schwir i2schwo i2sch3wu i2schwü i2scr 2ise ise3a ise1e iseh2a ise3h2i is2eind is4eli i4sel4ter ise2n1 ise4nal is2end i2senho isen3s is2ep ise2r3ei is1erg i2s1erh iser2he i2s1erm iser2u i2s1es4s is2et i2s3etat i3seth i3s2eu 2isf 2ish 2isi i3si. isi2a i2s1i2d isik2 i2sim isin3g4 isi1s i4ski i4sku is3la 3islam 2isma 2ismi ismu2 is1of i3soh 1i2sol 2is4o2n1 iso4nend isono2 i2sop is1ort 3isot i2s1ou is1o2v 2isp is3pan i2spar is3pe is3pic i2spro is3sa is4s1ac is4sau is4s3chen issen4s5tü isseri4e isser2s is2st is3sta is3sto iss3tr is3strä is3stu is2sum is3tab ist3a2c ist2an is3tang ist1ap i1stat is3täu is4tb is4tc is4td ist2e i1stel iste4n ister4ras i1steu is4tf is4tg ist2id i1stil istin4f is4tk is4tl is4tm is4tn is3t4o is4toc is3tör is3tr ist4ra i3s4tram istri3en is4tro is4tru is4ts is4tt i1stü is4tv isu2m isum3p isumpf4 i2sü 2isy ißer2s iß3ersc i2ßerse it1ab. it1abs ital3a it1alt it1a4m ita3ne it3anr ita2po it1app itar5b it1a2re it1art i3tat it1au i3tauc i2taut 2itä it1änd i2t1äs ität2 it1eff it1e2he i2t1ei i4teic 2itel ite4l1a i2telek i2t1emi i2temp ite2n iten3s2 i4tents i2tepo i2t3er2fo iterin4d i4ter4klä it2erö i4tersche i4t1esk i2t1ex i3text 2i2th i4th. i4thä i3thr i4ths i4thü i4thy 1itia i3tic i2t1id 1itii iti2kr it1in i3tis i4tiso iti3sp iti2v5a itiver3f it3le itmen2 2ito it1ob i3toc i2t1of ito2p it1orc it2os 2itr i5tra. i2t3rad i3tradi it3raf it3ras it3rau it3räu it3re i4tren it4ret it3rob it3rom i2t3run it3rut 2its it2sa its1a2g it2s1e itse2h its3e2r1 it4sh it4sm its1or it4stras its3trau it2sur 2itt itt3ac it2tan it2teb it3ter itt3hä it2tob it2top it4tri itt4schi itt2se2h itt2sei itt2sp itt2sti itt4sz it1uh it1ums it2ung i2tuns ituran2 it1urg itut4 i3tü i4tüb ity1 ityl2 2itz itz3erg itz3erl itz2erw it2zö it2z3w 2i1u2 i2u3l i3um3 iu4ma4 iump2 ium4se ium4ste i3un2 i2up i3us i1ü iü4be 2iv i2v1ad i2v1a2g i2v1ak i2v1am iv1an iv4at i2v1ä i2veb i2v1ef iv1ei iv1elt i2v1ent i2v1ep ive3re iv1erh iver4kl iv1erl iver3s ive3s i2v1ex i2v1im i2v1ind iv1int i3vol ivo3re i2v1r i2vun i2v1ur i2vü 2iw iwur2 2i1x i2xa ix2em i3xi ixt2 i1y 2iz iz1a iz2ac i2zag i2zan i2zap iz2arr i3z2as i2zat i2zau i2zä i3ze iz2ei izeits2 i2zele ize2n i4zener i4zentz i4z1erl izid3 iz1ir izi4th izo4f i2zö i2zuna i2z3w i3z4wi í1 ï1 1j j2a jab4r ja1c jah4r3ei jahr2s5 ja3l jal2a ja4lt ja3ne jani3t4 jas2o ja1st jat2 2jd2 jda3 jd4an je2a jean2s je2g jek2ta jek2ter jek2tin jekt3o2 jektor4 jek4t3r jek6tri je3na je2p je3r jer2e je4rr je4rs jes3t je2t1a je2t1e je4t3h je2tin je4tor je2t3r jet3s2 jet3t je2t1u2 je3v je3wo ji2v 2jm joa3 jo2b1 job3r jo2da jo2i jol2a jong2 jo2p3 jo1r2a jor3d2 jo1s jo2sc jos4t 3jou jou2l 2jt jty1 j2u ju2b3l jugen4 jugend3 ju2k jul2i jung3s4 ju3ni ju3r jur4a jur2o ju4rt jus3t ju3t2e3 jutel2 2jv 1k ka2ans ka3ar 2k1abb kab2bl 2kabd 2k1a2ben 2kabf 2kabg 2kabh 2kabn 2k3a2bo 2kabr 2k1a4bs 2k1abt 2kabw 2kabz ka1c kade2r 2k1adm 2k3a2dr 2kadv ka3f4l ka3fr kaf3t2 kag2a3 ka1in kaken2 ka3kl kak6lan 2k1akt. 4kala. kala3b ka2l1a2d ka2lan ka4l3d ka4l1eh ka2lens kal3eri k2alk kal2k1a kal4kan kal2k3l kall2i 2k1allt ka2l1on ka2lop ka2l1os kal2tex kal4th ka2lu ka4mat kamp4f3en k2amt kan4al ka4n1a4s ka2nau 2kanb kan3d2 2kanda 2kandä kan2e 2kanf 2kanim kank4 2kanl 2kanom 2k1anor 2k1ans k2ans. 4k3antenn ka3nu kan2um 2kanw 2k1anzu 2kanzü ka2o3 ka3pr 3kara 2karbe 2karc k2ard kar3d2a 3kare 4k1area ka2r3ent k2arg ka3r2i kari3es k2ark 2k1arm kar4pf k2ars k2ar3ta k1arti 2kartik karu4 k2arw 3k2asc kas2e1i kasi1 kas2o ka4s3p ka2s3t 2k1ast. ka4ste kas4tras 3kasu ka3sz ka2tab ka2tan k3atel kate2n ka3t2h ka4t3r kat3se katt4 ka4ue kau4fer kau4f1o kauf4s3ag kauf2sp kauf4sti k2aus. 2k1auss 2kausw kau3t2 2kauto ka3ve 3kaz käl3 k1ä4mi4 2k1änd kär2 2k1ärg kä2s1c käse3 kä3th 2kb2 k3be kbo4n kb4ri kbu2s kby2 kby4t 2k1c k3ch 2kd2 k3da kd4rö ke2ben 2k1e1c ke2di 2k1eff kefi2 kege2 kegel3e ke2gl ke2he. ke2hen kehr2s kehr4s3o 2k1eic 2k1eig kei2li ke2im 2k1ein kein2du kein4e k1ei1s 2keise keit2 ke2l1a ke3l2ag kel3am ke2lä kelb4 keld4 kel3eis 2ke2lek ke2l1en ke2l1er kel3l4e kell2i ke2l1o2 ke2lö kel3sk kels4tern k4elt kelt4e 2k1e2mi 2k1emp k2en. ken1a ken3au ke2nä kend4 ken3dr ke2n1e2b kenen1 ke4nene ke4nens kener2n kene4t 2ken2gag k3en4gel. ke2nim ken3in 2kenlad 2kenläd kenn2a kenn2e ke2no k2ensa 2ken2sem ken3s2i ken3s2k ken3s4tei ken3sz k3en4te. k3en2ten ken4ten. 2kentf 4kentg ken3th 2kentl 2k1ents 2kentw 2kentz kenvo2 ke3ny k2enz2 ke1o2 2kep ke2pl k2er. ke1ra ke2ran ke2ras ke2rau ke2r1ä ker2ble k2erc 2kerd k2ere ke2r1e2b ke2rec ke3reig ker3ein k3eremi 2kerfah k2erfam ker2fo k3er2geb 2kergu ke4rin4nu kerin4st kerin2t k3erken k2erko k3er2lau k3er2leb k4erlebe ker3m ker2na ker4nei 2k3er2neu kern3eur k1ero k2e1rod 2keros ker4reg k2ers. 2kersa kert2 ker4werb kerz2 k1erz. ker2zeu 2k1er2zi k2es. ke2sa k2esc k1ese ke2sel kes3pa kes2sa ke2t1a ket2ag kete4 ke2t1eb ke2tel 2k1e2th ket3ha ket3s 2ke2tu keu4schl 2k1e2va 2k1e2x 2kf2 kflei2 kf4lö k3fu 2kg2 kga2s1 kge3s k3go 2k1h2 k3he k3hu ki1a ki2ad ki2ag ki3a4k ki3a2r ki1c 4kicl ki3d4r k2ids 2kidy ki2el kie2lei kiel3o 2kiern kier2s kie4z 2kif ki3f4l ki3f4r ki3k kik4l 2ki3l2a 2kilä 4kile 4kili 2kim ki2nä 2kindex 2k1indi 2k1indu 2k1inf k2ing kin2ga kin4g3ent king3s 2kinh k2ini3 kinik2 ki3n4o3 kinos2 kinot4 kin3s 2k1inse k1inst 2k1int ki3or kio4s 3kirc 2k1i2so kis2p kis3s kist2 kis4to kiv2 kive4 2kiz 2kj k3jo 2kk2 k3ka kkab4 kk4ne kl2 2kl. 4kla. 2k1lac k3lamp klan2 2kland klan3du k4lar k1last k1lauf k3laug 2kläd k2lär k2le 4k3le. kle2br k3leg 2kleh kl4ei klei2e k3leit k3lem. 3klemp kle2o 2k3ler kle2ra 2k3leu kle3us 2klic k2lien k2lif 2klig 3k2lim k2lin k3lin. 3k4lina 2k3lind k4link k2lip k2lir k2lisc 2klist klit2s 2k3liz 2k3loc 2klok 3k4lop k3lor klost4 2klöc 2klöf k2löst k4löt k1lu k4lub k2lud k2lug k2lum klung4 2klux 2k1lüc 2kly 2km kma2la k2n2 k4nac 2k5nach 2k3nad 2knah 2k3nam 2k3nar kn4at 2knav 2k3näp k3ne k4nec kne1e 2knes kne3tu 2knetz 4kney kni2e 2k3niv kno2b3l k4nol 2knorm 2knov 2k3num ko3a ko2al kobal2 2kobj kob4s koe2 kof3f2 koffe3i kohl2e kohle3i koh3lu koka3 ko2kl ko3l2a ko3le kol2k3 3kom komer3 4komn ko4mu k2on kone2 ko2nem kon3s4 kont6en ko2nu ko3on 2kop. ko2pal ko3pat ko3pe 2koper ko4pf kopfa2 kop2fen kop4f3err 3kopp kop3s ko3r2a kor2ba kor2bl kor2br 2k1orc korder2 kor4derg ko3re ko4rel 2k1org ko3rin kor2k1a kor4kr kor3m k1orna kor4nac kor2n3ä kor4no2 2korpi k2os k4os. ko4sk ko2sp 3k4ost ko3stei ko2stü ko4ter ko3t2i koti4n koti6ne kot4r kot3s2 kot2tak k1ou ko3un 3kow ko2we 2k1ox köde2 k2öf k1öl 2kp2 k3pf 2kq k3qu k2r2 2k3rad 2k3rah k4ral k3rats 2kraum k4raw k4raz k4räc 2kräd k4räf k4räm k4rän 2k3räum 2kre. 2k3reak 2k3real k4reb 4k3rec 2kred. 2k3rede 2kredn 2kredu 2k3ref 2kreg 2k3reic kre1i2e4 kreier4 k3reif 2k3reih 2k3reim krei4sei krei2s3i krei2st 2krel k3ren 2kresu 2k3rh 2krib 2k3ric 2k3ries 2krip k3risi k4roa kro3a4d kro3b4 k4roch 4k3roh k4rok k4ron k4rop 2krot krot4r k3rou 2kröh 2kruf 2k3run 2k1s ks3a2b ksa4k k4s1amt k2san ks3a2r ksa2s k2sau ksau4e ksau4f k2sav k2säh k3s2c ksch4 k2s1e2b k2s1ec k3s2ed ks1ei ks2eid ks2eif k2seind kse2le k2s1eng k2s1ent ks1er ks2ere k2serf k2serg k2serk k2serl k2sers k2serw k2s1ev k2sex ks3ha k4s1i2d ks2im k2s1in k2s1is k3s2ke ks3ket ks3kl ks1o2 kso4f ks4on k2sop k2sor k2sö k2spal k3s2pat k2spä k3spe ks4pel k2sph ks2por ks2pul ks3s2 kss4t kst2 k4st. kst4a k2s3tal k2s3tanz kstat4 k3stäl k3stei k4steil ks4tel ks2tep k2stier k2stit k2stor k2strop k2stuc k2stum k2stur k2stüt k2s1u ks2zen 2kt kt1abr kt1abs k2t1ad kt1akt k3tal kt1am kt1an kt2and k2t1a2r kta4re kta3ri k2t1au kt3aug ktä3s kt1ein k2tek k4t1ela kte4n1 kten3s4 k2tent k4tentf k4tents kten3z kte4pi kte2ra kte3ran kt4ere kt1erg k2t1erh kter3m k2terö kte3ru k4t1eti k2tex k2t1h k3ther k2t1i2d kti2me kt3ind kt1ing kt1ini kt3inn k2tint kti2s1e k2tiso kti2ter kto3b k2t1of kto3ren. k2t3ram k3t4ran kt3ras k2t3rau k4tref ktro1s kt3run kt3rü kt3s4a kt3sä kts2el ktsen1 kt3si kts1o kt2sor kts2p kts4t kt3s2z ktt2 k3tub kt1ums k2tuns k3tü k4tüb kt3z ktz4w ku2al ku1c kud4r ku2h 2k1uhr ku3la ku3l2e ku3l2i 4kulp kul4to kul2tr k2um. 2k1umb k2um4e 2kumg 2kuml kum2sa kum2s3p k2u3n2a kun3da kund2e kunden3 kunft4s kung4 2kunm kun4s4 kunst3 4kunt 2kunw 4k1up. kur2bl ku2rei kuri2e kuri4er 2k1urk 2k1url ku2ro kurs3c kur2s3p kur2st kur3sti 2k1urt4 kur3tsc 3kus kus3a2r ku2schl ku2sp ku2s3t2 ku2su 4kut. kut2a kuto3 kü1c 3küne 3kür kür4s 2kv k3ve 2kw 2kz2 kze3l k3zu 3la. laa2 la3ar l1ab 3l2ab. lab2a la2bad l2abä 2labb lab2br 2labd lab2e 2la2ben 4labf 2labg 2labh 3labi l3a2bit 2la2b3l 2labn 3lab2o 4labo. la3b4ra lab4res la2bri 2la4bs la2bus 2labw 2labz la1ce la2ce. l4ache lachter4f lacks2 1lad 2l1ad2a 2ladd 3laden la3d2i 2ladj 2l1adl 2ladm 2l1a2dr 3l2adu 2ladv 4laf. la4f1ei la4f1er laf1r 4laf3s laf3t4 la4fu la2g1a lag3d lagen3d l2ager lagerin3 4lagg la2gil la2gin la2gio lag3l la4g3n la2go4 lag3str 2la3ho 3lai 2l1akad lake2 la4kes la4kin l2akk la3k4l la4kro lakt2 2l1al la2la 3la5la. 3lali 4lalo 4lalt lami3t l4amm lam2m1a 1lammf la4mor l2amp 2l1amt lamt2s la4mun la2na la3nan 4l1a4n4at la4nau 2la2nä 3l2and l4and. lan2d1a lan4dam land3au l4ande lan4derh lan4d3erw lan4d3erz lan4d3inn l4an2dr lan3dri land3rü lan3erd laner2f 2lanf 2langa lan2gan 2l3angel lan4g3esc lang3s4 l2anhe 3lan2i 4lanim 4lanl 2l1ann l1ano la2nof 2l1anp 2lans l1ansi 3lansw 2lantr 2lantw 2lanw lan4zerg lan2z3w 3lao 2l1apf la2ph 2l1a2po lap2pl la2q la2r1an 2larc lar1e2b la2r1ei la2rel la2rene larf4 3lar3g lar3ini lark4l 2larm 2l1a2rom l1art 2lart. lar2ter lart2h l3arti lart4r 3laru l2as. la2sa la4s3aa la4sam la4sä lasche2 4lasd la3seb la2sei la2s1e2l 2lash la2sin la2sis la2so 2la4sp 3lasser l2a2st las4t3an last3ar la4ste las6t3ri la4stu la3t2e 2l3a4tel l4at2i la5tio 2latm lat2o la2tö la2t3ra lat4ri lat2s lat3st 2lat2ta lat4tan lat2tex lat2t3in lat2t3r latzer2 1laub. lauben4s3 lau2b3r laub2se lau4fel lau4ferl lau4fin 2laufn lau4fo 1laug lau3gl lau3i 2laun. la4us 3l2aus. 2l1ausb lau4scha 2lausd 2l1ausf 2lausg 2l1ausl 2lausr 2l1auss lau2st 2lausw 2lausz 2lauto lau2tr la3va lave4n 1law lawa4 1l2ax la2xel l2ay lä1c 3läd 1lähm 2l1ähn lä2i 2lämt 1länd 2l1äpf 2läq l2är. lär2ma l1ärme 2l1ärz lä2s1c 2lät 2läub 2läuc 2läue 1läuf 2läug 2läx 1là 2lb l3bac l2bant lb3a2ri lb1ärm lbb2 lbb4r lbby4 lb2ei lbei4ge. l2b3eink l2b3eise lbe2ral lber2ei l2b1e4ta l2b1id l2b1ins lb4lad l3b2lat l3blä lb3le l2bled l2blic l3blo l3b2lö l3b2lu l2b1o2ra lb3rea lb2s lb3sa lb3se lb3si lb3sla lb3sp lbs4t lbst3ac lbst3ei lbst1u l2b1uf l3bum lbu4n lbzei2 2l1c l3ca l3che l4chei l4chent l3chi lch3le lch3li l3chlo lch3n lch3r lch3s2 lch3ü lch3w l2ck l3cl l3co 2ld ld3a2b1 ld2ac ld3a2ck l2daf lda2g l2d1ah lda2i l2d1ak l2d1al ld1ams l2d3a4n ld1arm ld1ass l2d1au ld3aus l3däm ld1är ld1äs ld1ät l3de. lde2ben l2dei ldein5 l2d1elf l2d1e2mi l2d1ems lden3erg l2dentl l3der. l4d3er2fa l4der4geb ld1erh l2der2he ld2erl ld3erlas ld2ern l2d1er2p lder4tr lde5sa l2d1es2s l2dex l2d1id ld1i4mi l2d3ion ldo2b ld2on l2dop ldo2r l2d1ori ld2os ldos3t ld2ö ld3r ld4ram ld1ran ld1rä l2dre l3d4ris ld1rol ld4ru ld5rub ld5rut l2drüc ld3sa ld3ska lds2p ld3st ldt4r ld3tu l2d1ul l2d1um ldwes4 1le le2ad le2an. le3ar 3leba leben2s3 le2bl 3lebr le2b3re lebs2 2lec lech1a le2chi lech5t4e le2dit le2dr le1en le2er lee4ret le3f2a 2l1eff lef4o le2g1ab leg1as le2gä legi3en le2gl leg4r 3leh 4lehe. leh3r2e 4lehs 4leht l2eid lei3ere lei2fan lei2fei lei2fi leif3s 2l1eig lei3gl 3leih lei2hau lei3l2 leim3p 3l2ein. lein2du l4eine lei4nerb le2inf le2ini 2leink 2l3einsa 2leint l2einu le2is leisch3a lei4schei lei4scho lei4schr lei4sern l1eisf leis4s3er l4eist lei2ßer l2eit lei2ta leit5ersc lei4to lei5tri leit3s2 leits4t 2leiw 3leko 2lektr 2lekz 3l2ela le2le 2lelek 2leleme le3len leler2 le3les 2lelf. 2l1elfe l2eli l2em. le3mal le2mau le2m1ei lem4en 3lemes 3lemet le2mid lem1o2 le2mor 4lemp lem3s le2mu le4mun l4en. len1a2 len3ab le4nad le4n3an le4n3a4t le2nä 2lendet 4lendl l1endp 4lendun le2n1ed lenen3er 4lenerg le2neur 2leneuv len2gag len2kau len2k3lo len2klu l1enni le2no len4sein 2len2sem len3ska len3sz 3lenta 2lentg 2l1entk 2lentla 2lentn l3entro 2lentrü 2lentw lent4wä 3lentwet 2lentz le4nz lenz2a len4z3eig 2lenzy leo4f le1o2s 2lep l1epe le2pen 3lepf 4l1e2pi le4pil 4lepoc 3lepr l2er. l2e1ra le2rag le2r3ap le2ra2s le2rau le2r1ä le2r1e2b ler2e3c 2lereig le2r3ei2m le2r3eis le2rel le2reng l2erer le2rerg le2rers le2re4t 2l3erfas 2l1erfo l2erfr l2erfüh l1erg l2erga 2lergeb l2ergef 3lergeh 4lergen. l2erger l2erges 3l2ergew 2lergi l2ergl l2ergr 2ler2heb 2lerhol leri2e lerin2s lerk2 3l2erka l1erkl l2erkle 3l2erko ler3kr 3l2erkre 3l4erlebe 3l2erlei 2lermä 2l3ermüd ler2nal ler2nar l4erne ler4nei 2l1erö 3l2erra ler2ric l2errü l4ers. l1ersa 2lersat lers4k 3l4ersl ler2sto lert4 ler4trä le2rup l4erwa ler2wer 2ler2wo 2l1erz ler2zä l3erzeu ler2zo l4es. les2am les2e lese1i 2l1esel le3s4h lesi1 le3s2k le3so le2spo le4ss lest4 le1sta leste3 lester4i le1sto le1str 3lesu 4lesw 2lesy le2tab 2le2tap 2le2tat l1e2th le3tha 2lethi let2i letsche4 let2top lett1r letts2 le2u 4leue 3le3u4f le4uk 2l1eul le3unt le4ur 2leuro 3l2eut l1e2vol 2lex 3lexd 3lexik le2xis 1lé 2lf l3fac l3fah lf4at l2f1ec lfe1e lf3einh l2feis lf2en l2ferei lfe2rel lf1erl l3fjo lf4lä lf3led lf4lö l3f4lu lf3ram lf3res lf4ru lf4rü lf2spe lf2sti lf2su lfun2 lfur1 2lg lgab4 l3gas lga3t lgene2 lgeräu3 l2geti lg2i l3gle lg2lö l3go lg2p l3g4ra lg3re l3gro lgs3t lgung4 2l1h2 l3he 3lhi. l3ho l3hu 1li li1a lia2b li2ad li4am. lian2g li2ast 3lib libi1 lib4r li1c lich2ta licht5ersc lich4to 4lick li2cka li2cl li3d2a l1ido l2idy liebe4s3 lie2br 3liefer li3efl lie4n1a2 li3ene li3en3s lien3t li2er lie2rei li3ern lie2s1c lif3ti 3lig liga3s li2g3ers lig1l lig4n li3ker lik2i lik2o likop4 lik2sp lik2ter lik4th lik2ti lik4t1o2 lik2u li3l lil2a li5lie li4ll li3m2a1 limas4 lima3t4 2limm 3limo 2limp lin2a lin3all li3nar 4lindi 2l1indu li2nef li2neh li2nep li2nes 2l1inf ling3l lings3 lingst4 2l1inh li5nie 2l1inj lin2kan lin2kar link2s3 lino2 li2nol l2insa 2linsel 2linsp 2linst 2linsu 2linsz 2l1int l2intu li3n2u 2l1inv 2linz li2o li4om li3o2st 3lipf 3lipt 3lis. li3s2a li3schm li2schu lis2h li3shi 3lisk 2l1isl 2l1i2so li2s2p liss4 3li2st li2t1a2d l1i2tal lit4an li3t2ä l2i3t2e 3liter li3th li4t3r lit1s2 lit3se lit3sz li3tu li4tur litz4er 3liu li2vea live4n li2ves livi3e li3vr 4lixi li4z3ä lizei3 2lj l3ja 2lk l3kale lk1alp l3k2an l3kap l3kar. lk1erd lke3r2e lk2l lk3lad l3k4las lk3lic l3k4lu lk4ne lk5ner lko4f lk1ofe lkor2b1 lk3roc lk2s1 lk3sän lk4sb lk3si lk4sm lk4spe lks3t lkt2 lk2ü 2l1l l2labk l2labt l3labu lla2der l3lage lla3gl l2l1am lla4ma l3lame ll2ami ll2anb lla2ner lla4ni l3lans. ll1anz l2l3appl ll1arm ll1a4sc l4latm ll1att l3laub ll3aufg llau4m ll1aus ll3axt ll1äm ll1är llb2 llb4l llch4 ll3d lld4r ll3ebene l3lec ll1ech lle3er l2l1ef ll1eic ll1eim ll2eis l2leise lle2la lle2m l2l1emi l3len. lle4na ll3endl llen3dr ll3en4dun lle4nens l4lentf l2lents l3lep l3ler. lle2ra ller4eig l4lerfas ller2fo ller4geb l4lergene l2lergo ll3erho ll3erkr ll3ermi ller4müd l2l3ernt ll3ertr ll2es lle4th ll1exe llg2 lli2gan l2limb l2l1ind l4linf l4l1ink ll1ins ll3k ll3l2 ll3m2 ll5mit ll3n2 ll1ob l2lobe l2l1o4f ll3ol l2lope ll1opf ll1or l4lorb llor2g l2lo2ri l2l1ou l3low ll1ox ll2s1es ll3ska ll2spr ll3t llt2e llt2i llti2m llt4r ll5tri ll4ts2 ll1ur llus5t4 l3ly ll3z2 llz4w 2lm l3ma. l2m3a2b l2m1ad lm1a2ge lm1aka l2m1a4m l3mana lm1apf lm1art lm1att lm1äst lmbu2 lm1c lmd2 lm3e2dit l2m1ef l2m1ent l2m1e2p lmer2 l2m1erf l2m1erl l2m1erz l4messa l2m1i2d lm1ind lm1ins l2mof lm1orc lm3p2 lmpf4 lm3s2k lms2t lm3ste lm3s2z lm3t lmt4r l2mum l4munt 2ln ln2ab lna2r ln3are lnd2 l3n2e lnes2s l2n1in lnus2 l1nü l1ny 1lo 3lob. l2oba 3lobb lobe2s 2lobj l1o2bl l2obr lob4ri lo2chel lodi4e l1ofe lo3fj lo4gh lo2gl lo2gor lo2gre lo2ha loh2e loh2ner 4l1ohr loi4d loi4r 3lok 4l1okk lo2k3r l4olä l4ole 2l3o2ly lomä3 lo4mel lo4min lo2ner lo4nin lo2n1o lo2o3 2lopf lop2p1a 2lopt lo2rak lor3am lor2an lo4rä 3lorb 2l1orc 2l1ord lo3r2en 2l1org2 lori4di 2lort2 l2os. lo4sa 3lose lo4ske los3p lo2spe lo2spr los3sa lo4ste lo2s3t4r 2loß lo2ta lo2th lo3tha loti4o lo5tos lots2e 2l1ov lo2ve 2lox 1lö lö2b3 2löck 2löd 2l3ö4fe 2l1öhr 2lök 2l1öl3 2löp 3lösc 3lösu lö4ta 2lp lp2ar lpar2k1 l2p1är l3p2f lp4fu l3phä l2phir lp1ho l3phr lph4t lpi4p lp4lu lp4rä lpt4r l3pu l3pü 2lq 2l1r2 lrau2s l3re lrebs2 lro2h lrö2 l3ru l3rü 2l1s ls3a2b lsa2ck ls3acke l2s1a2d l4s1amb l4samp ls2amt l2san ls3ane l3sare ls3a2ri l3sark l4s3au. lsau4m lsau4rer ls3aus l2saut l3s2äm ls2äug l2s1äus lsby4 ls2c l2schin lschs4 l2s1e2b l3seil ls2ele ls1eli ls1emb l2sent ls1er ls2erb l2serf l2serg l2serh l2serk l2serl l2sers lser2u l2serw lse2t ls1eta ls2ext ls3ha l2s1id l2simp ls2kal l3s2kele ls2ky lso4b l2sop l2s3ort. l3s2öl ls2pa l2s3pac l2s3ph l2s3pir l3spit l2spiz ls2po ls2pu l3s4pul ls3s2 lss4t l4st. lst2a lstab4 ls3tabl lstahl3 l2stas l2stat. l2state l2s3täti l2ste l3stea l3stec l3steh l3stei l4steil l3stel l3stemp l4sten l6ster. ls2t3erk ls4terne ls4terns ls2tie ls4tip l2stit l2stoch ls4toi lstro4 ls4tru l2s3trü ls2tu ls4tüm ls1um l2s1un ls2und ls3unk l4szu 2lt l2tab l3tabl lt1abs lt2a3d ltag4 lt1am l4tame ltampe4 l3tan. ltan3d l2t1ap lt1ara l3tark lt1art l3tarta ltar4tik lt1au lt3aut lt1äh lte2c lt1eh l3tehu lt1eig lt1ein lte3mi lt2en lten4gel lten2sp lt3ents lte2ral l2t3er2fa l3t2erg l2terhe lter2ku lter2nä lte2ro lt2erö lter2se l4t1es3k lt2est lte3str lt2et lt3g l2t1h lt3hag l3thas l4t3hei lthol2 l3thr l3t2hu lt1ide ltimo4 l3tine l2tiso l3t2i3t l2t1ob l2t1o4f l4tord l4torg l4t1o2ri lto2w lt1öl lt1ös l4t1öt ltra3l2 lt3räu lt3rec lt3rei lt3ris lt3rol l2t3rö lt3rum l2t3rus lt2se2l lt2s3ort lt3s2ph lt2sti lt2stüt lt3t l3tub lt1uh l2t1um lturan2 lturen2 ltu4r3ent ltu2ri l3tü lu1an 2lu2b3 luba2 lubs2 lu2dr lu2ec lu2es lu2et 1luf2 2l1u4fe lu5fel 2luff luft1a luft3e luf4tei luft3r lu2g1a lu2g1e2b lu2gei lugen1 lu2gi lug3l lu2go lu2g3r lug3se lug3sp lu2gu 2l1uh lu1id lui2de lu4ig lu1is. 2lumd lume4 2lumf 2lumg 2l1umh 2lumk 2luml l2ump 1lumpe lum2ph 2lumr 2l1ums lu3mu 2l1umw 2lumz 1lu2n 2l1una lund4 2l1unf lung4sc 2l1uni 2lunr 2l1uns 2lunt 2lunw lu4pf l2ura lu2r1an lu2rat 3lurc lu2rei 2lurg l2uri lu2ris l1urn lu2ro 2lurs l1urt lu3sak 2luse lu3si lu2sp lus4s3a lus2s1c lus2sel lus2s3er4 lus2s1o lus4s3p lus2s3t lus4stä luss5tr 1lu2st lus4terl lus4t1o2 lust3re lu4s1u lu2t1a4 lu4tas lu4t3au lu2tä lu2t1e4g lu2t1el luter2 lu2t3er4b lu2t3erg lu4t3ersa lu2thy 2luto lu2tob lu2t1o4f lu2top lu4t1or lu4t3r lut3schl lu4tü 3lux 2lüb 3lübd lück4e2 lücker3 lüf3te lü2hel lüh1l lü2s 2lv2 lva3 l3vl lv3r 2lw2 l3wa lw4ei l3wi 2lx 1ly ly1a lya4m ly3c ly3es ly1l 2lymp 3lyn ly3no ly1o ly3onn ly3th 2lz l2z1ac l2z1ag l2zan l2z1ap l2zat lz1aus l2z1äp l2zär l2z1eim lze2l l2zele l2z3enth l2z1ep l2z1er2h l2zerz l2z1id lzi4m lz1imi lz1ing lz1inn lz3l lzo4f l2zö lz3t2 l2z1u4fe lzvol2 lz3w l2zwar lz4wec l2zwu 1m maa2 m1ab m3a2bar m2abä 2m3abb m2abe 4m3abf 4mabg 2mabh 4mabk 2mabl m2abli 2mabm 4mabn ma2br m2a3b4ra 4mabs 2mabt 4mabw 2mabz ma3chan mach2e mach4t5ers mach2tr ma2ci mack2s 2m1act mada4m m2adä ma2del ma3dj ma4dl 2m1adm 2m1a2d4r ma4d2s mae2 ma3f maf4r mag2a ma2ge. ma4geb ma2geg ma2gek ma2gep ma2ges. ma2get ma2gev ma2gew 4m1agg magi3er. magi3ers ma3gl ma3g4n 2m1ago ma3ha mahl4st ma1ho mai4s3e ma4ke. ma4kes 2m1akt mal1ak ma2lakt ma2l1an ma2lau ma2lär 2mal2de m2aldi ma3le ma4leb ma4lent mal2er ma4lex mali2e mali3er mal3lo 2mallt ma2lon ma2lop m2alp mals4terb mal3t malu4 ma2l3ut 3malv ma4mid mam3m 4m1a2nal ma2nar 2m1a4n4at ma2nau 2m1anä 2manb man2ce 3man3d4 man2en ma2net 2m2anf mang2 2man3ga m2angel 2m1angr 2m2anh 3manip 2manl 4manla m2anle 3m2a4nn 4manod 2manr 2m1ansa 2mansä man2t1h 2mantr ma4n1ut 2manw 2manz m1anza ma2or ma2phr ma2po m2ara 4marag 4marb 2maren mar3g2 3ma1rh ma3r2i m2ark mar2kr 4mar2o maro3d 4marr mar4schm mar4schn mar4schr mar2sp mar2su 2mart. ma3r2u m1arz 3mas ma3s4a ma3s2e ma3s2p masse4n3 mas4ta mas4tel mas2ti mas4to mas4tr mas6tri ma4s3z 3maß ma2tab ma2tan ma2tä m3a2tel ma2t3erd ma2t3erz ma3the m4atme 2matmo ma2to ma4tort mat3se mat3sp matt4r matur2a mat3url 2m1au4f 3maul ma3un mau3r 2maus m1auss mau2ta m2ay ma1yo 2m1ähn mäh1r 4m1änd 2m1äp 2mäq mär1 2m1ära mär2kl mär2z1 mä3t4r mäu2s1c 2mb2 mbe2e mbera2 mber2e mbe3ri mbert4 mbi3er. mb4le mble1i mb4re mbu3sc mby4t 2mc m3ch 2md m2dan m2d1a4s md1är mde2a m2dei mde2m m2d1emi m2d1ent mder2 m2d1erl mdien4 md2ö md3ras md3s2e mdt4r m2d1um me3an me3at me2ben 4mebo me1c medi3 medie4 me1e2m me1e2n mee4rei 2m1eff mega3 me4gel 3meh meh6l3er 2m1eif 2m1eig m2e4i3l2 mein4da meinde3 meiner4k mei4nerl 5m2eist me3lam me3l2ant me2l1au melb2 mel3d2 melde3i me2lek 2melem me2ler melet4 2melf. mel3ink 3melk mel2k3ei mell2 3melo me2lob mel4sac mel2se mel2spa melt4 4mel4tern 2m1e2mis 2m1emp 2m1e2mu m2en. men3ab me3nage me4n3an men3ar me4nas men3au 4m1endl menen1 meng2a 2men2gag men3ge me4nh me2nid me2nim me4n3k4 men2on me4ns men2se. men2sem 4mensemb men2sen men4ser men4ses mensi2d menst4 3m4enta men2t3ak men4tanz mentar6ten 3m4entei ment3eig men4t3ers 4mentn ment4sp menü1 me1o 2meou 2meö 4mepa 2m1e2pi m4er. me1ra mera3l mer2a3s4 me2r1e2b 2mer2eig me2rens mer2err mer2erw 2m3er2gän meri2e merin2d merin2t 2mer2klä 3merkm mern3s4 m4ersh mer3sm mer4stel mert4r merz4eng 3mes me2sal me4sä 4meser mes3pr 2mes4sa mess3an messe2r mes4s1o mes2sp mes2st mes3ta me1sto mest3ri me3su me3sze me3ta met3abe meta1s4 mete2 me3th me2to me2tö me3tr me4trig met4t3en4d me3tu meu1 2m1ex me2xe 2mf mfi2le mf4rü 2mg2 mgang4 mglim2 2m1h2 m3hu mi1a mia2b mi3ak mia4m 2mian 2m1iat mibi1 mic1e mi1ch mi2ci mi3da mi2di. mi3dr 2midy mie3dr mi3ele mi4e3no mien3s mierer2 mie1s mie2ti mie4to mie2t3r mi3f4l 3mige mig4r mi3h mik1an mi3ke mi4kel mi4kens mi3k4l 3mil mi3l2a milch1 mil4che mild4s mi3l2i mi3l2u 4milz m2im2a 2m1imm 4mimp min2ac mi3nak min3anze m2in3de minde4s 4m1indu mi2nef miner1 mi4n3e2ri min2eu 4minfo min2ga ming3s 2minh 3mi3ni mini3k4 mi3nod mi2nof 2m1inse m1inst mi3nu 3minz mioni1 mi3p mi4ps 3mir. 3miri 3mirs 3mirw 3mirz 3mis. mi2sa mis4au2 mi3schu misch3w mi3se1 2m1i2so mis2p mi2spe mis5sar mis2ser mis4st mis3te mi1sto mi1s4tr 3misu 3mit mi2ta mit1h mi5thr mi5tic mi5tig mi2to mi5toc mi2tr mit3s4 mit5sa mit3tan mit3t2e mitte3s mi2t1u 4mitz mi3v2 2mj 2mk2 m3kn mk4na mk4ne mk4nu 2m1l2 ml3c m3le ml3f ml3k m3lo ml3p ml3s2 2mm mma3a m2m1ak mma4kr mm1all m2mank m2m1ans mm1anz m2m1ap mm1art mma1st mm1aus m2m1äu mmd2 m2m1e2b m2m1e2di m2m1ef mm1ein mme2l1a2 mme2lin mm2ene mmen4te. mmen4ten m2ments m2mentw mme2r3a2 mme2rec mmer4geb mme2s mme3sc mme4sz m2m1eu mmi3el mm1inb mm1inh m2m1ins mm1int mm2is mmi3sc mmisch4 mmi1s4t mmi3tw mm3m2 mm3p mmpf4 mm2s mm3sa mm3se mm3s2i mm3so mm3sp mm3sta mm3sti mm3te m2mum mm2un mmu3r mmuts2 mmül2 mmüll1 2m1n2 m2nesi2 m3ni m3nu 2m1o2be 3mobi 2mobj 3m2od mo3de mode1s mo2dr m1of mo4fe mo2g1al 3m2oh moh2a moi3r mo2k1l mol3d 3mom mom4e 3m2on mo2nan mo2nä mon2dac mon2del mon2d3er mon2do mond3r mo2ner moni2en mon2s3 mon3sa mon3s4e mon3s4u mont2a mon3th mo1ny 3m2o2o 2mope 2m1opf 2mopt mo1ra mo2rak mor2an mor2d3a mor4derm mor2dr mor3g morgen3s4 mor3t2 mor5to mo4ru 3mos mo4ska mos3s moster4 mos2ti mo2su mo3t2h 2motio mo5tor mot4r motte3s mous2 m1ox moy3 möbe2 mö2c 2möf mö4fe 3mög 2m1öl 2mp mpa3ne mpe2la mpe2lin mpe2n m2p1ene m4pf. mpf3au mpf1ef mp2f3erf mpf3erg mpf3er2p mp4ferpr mp2f3er4r mp2f3erz mp4f3l mpf1or m4ph. mp1haf m4phb m4phf m4phg m4phm mp1hos m4phs m4phz mpin2 mp3lei m2p3lem. m2p3len m2p3les mp4lis mpor4tag mpor4ter4 m2p3ra mp4rä mp3sh mps2p mp3str m3pu 2mq 2m1r2 m3ra m3ru 2m1s m2sam m2san m4sap ms1as m3sat m2sau m3sä m4s1än m3sc msch2l m4sco m3se. m2s1e2d m2s1ef m2sein m2se2le mse2n m2s1ene m2sent ms1erf mse2t ms1eti m2s1eu m2sex mso2 m2s1od ms1orc ms1ori ms2p m2spä m2sped m4spl m2spot m2spro ms3s2 mss4a mst2 m4st. m3stä m3steh m3stei m3stel ms2ti m2stit m3sto m3s4tr ms5trä ms6trän m3s2tu ms4tü m2sü m3sy m4szi 2mt mt1ab mt1ak mta4m mt1ar mt3aug m2t1e2d m2teig mt1ein m2t1eis m2teiw mt1elt m3tem. mt1emi m4tenga m4t3engl m4tentf m4tentg m4t3en2tr m4tents mter2 m2t1er4b m2t1erf m2t1erg mt1erh m2t3e2r4i m2t1erk m2t1erl m2t1ers m2t1ert m4teta m2t1eu m2t1ev m2t1h mt3ho m2t1i2d m2tim m2t1in m2t1i2r mti2s mtmen2 mt1ob mt1op m2t1öl mt1ös m2t3ro m2trö mt2sa mt3sco mt2s1e mt3send mt3s2ka mt3s2kel mts3tät mt3stu mtt4r mt1um mtu3re m3tü mt3z mu1a mu2ckel 2m1uh mu3la 3muld mul2lau 3mult 3mumi m1ums mum2s3p 3mun mundan4 mun4derf mu2ner2 4m1unf 4m3ungeb mu3ni mu4nin 4mu4niv 4munw 4munz mu3ru mu4r1u4f 3mus mu4s1a mu2s1o mu2sp mu2s3t2 4must. must4e mu2su muße1 mut1au mut2st 2müb 3müh mü2her mühl1a 3mül mül2len 3mün 3müt mütter3 2mv mvoll1 2mw2 mwa2 mweg4 mwel4 mwelt3 mwelter3 mwu1 my1a my1on my2s3 2mz2 mzug4 1na 3na. na2a 2n1ab 3naba na2bä naben3s2 n3abh n3abk na2b3l na2bor na2br nab4rü 4n3abs2 na2bus 4nabz 3nac n4ac. na2ch1 nachen6 na3chen. n3achse nacht5ers nach6tersc nacht6raum n1ada na3dab 3nade na3de. nadel1 na3den 4n1adl 4n3adm n1a2dr 3nae na3el 2n1af na3fra nag2a na3ge. na2gem 4n1agg n1a2gi na3gin na3g4r 3n2ah nah1a na2hau n4ahm 4n3ahn 4n3aho na2hö 3nai na1i2d nai2e n1aig 4n3air nai4re n2ais 2n1ak 3n4akä 3nako na4kro 4nakt na4kus n2al. na2l1a2 nal3am na4lar na2lä 2n1albk n2ald nal3da na2l1ed nal3ei na2l3ent na2ler2g na2lerm na2l3erw nales2 nal1et nal1ex nalg2 na2lid na2lop nal2ph n2als. nal3t nalt2a nal5t4r n2alty na2lu 2naly na4mal na4mat 3name 4na4mei n4amen namens3 4n1a4mer na4mid na4min na3m2n 3n2amo n1amp nam4sp 2n1amt namt2s na4my n1an 4na2n4a na4nat n3a2nä 4n3anb n3and2 nan1eu 4n3anf 4n3ang 4nanh 2nani 4n3ank 4n3anl 3n2ann 4n3anna 4nano nan2o3b 4n3anp 2nanr 4n3ans 2nantr 2nanw n2anz. nanzen2 nan4zeng nanzer2 nan4zerg nan2zw na3ot na2per n1apfe 2napfel na2pos n3a2pr n1a2q n1ar 3nar. na2r1a 2narc n2ard n2are n4are. 3nari n2ark n2arle 2narm n2aro na2rom na3rö n2arr nar2rh n2ars 2nart n2arta n2arth na3r2u 3nas n4as. na3sä na2schw 4n1a4sp nas2s1c 4n1assi nas4ta 4na2sy nasyl2 3nat n4at. n4ata na2tat na4t3au nat1ei na2tem na2t2h 4natm nat2o 4natom nat1r nat4sa nats1e na4tt n4a3tu n1au nauf2fr 4nauge. 3n2aul 3naum na3um. 4nausb 4nausd 4nausf 4nausg 4nausl n2auso 4nausr 4n3auss 4nausw 4nausz nau5te 3nav nave4 navi3er. navi3ers na2x 1nä 2näb 3n2äc 3näe 2n1äf 3näg nä2hi 3nähm 2n1ähn nä2hu 3näi 2n1äm nä4mi 2n1än 2näpfel 2näq när4s5t nä2sc n2äss nä4st 2näu 3nä1um 2nb2 n3ba n3be nbe2in nber2e nber2gr nbes4 nb4la nb4le nb4ri nbruch4s5t n3bs nby4t 2n1c n2c3ab n3can n3ce4n n3ces. n4ch. nchi3en n3chl n4ch3m n2ck ncor2 n3cr n3cu 2nd nda3f nd2ag n3d2ai n2d1ak n2dana n2dani n2danz n3dat nd3att nd1au n2daut n2dax nd1äng nd1c nde2al. n3de1e n2dei nde3inf nde2lat nde3l2ec nd3elfe ndel3l ndel4s3a ndel4s3en ndel3ste nden3sk n2dentl n2dents nde3o2 n3der. nde4rei4s n3deren nd2erh n3deri nder4läs nde2rob n2de2ros nder4sat nder3ste nd2es1 nde2se ndes3s ndi2a3 nd1imm ndo1c n2dof ndo2n3a n2dopt nd1or n2do2ri ndo1st n2d3ott n2dout n2dö nd2ös n2d3rat nd3rau n2d3re n2drif n2d3roc n2drod n2d3rö n2drui n2d3run n4dsb nd2sene nd4sf nd4sg n4dsl nd4sm nd2spr nd3th ndt4r n2duns ndy3 ndys2 1ne 3ne. ne2ap 3ne3as ne3at ne3au 2n3ebene ne2bl 2n1ebn neb4r 2nec 3neca 3nece ne2ch ne1ck neck2a ne2dit 2nee neei4 ne3ein ne3eis neen2 ne1en. nee1r neer4e n1ef n2ef. n2e3f2a 2nefr 2n1egg neg4l n1e2go neg4r n1e2he 2nehe. 2nehem nehen2 ne3he2r 3nehm 2n1ehr 2n1ei 3neia 4neic nei4dr 4neier 3neigt 3neigu nei4la 4neing 4neinh 4neink 4neinl 4neinr 4neinz neiss4 ne2ke 2n1eks nek3t2 2nekz ne2l ne3lä nel3b n1ele ne3leb 2nelek 2nelem ne3len ne3l2i ne4lim ne4lit 3nelk n2ell nel2l1a nel2lei neller4f n2eln 3ne3l2o 3ne3lu 3n2em. 2n1emb ne5men n2emo 4n3emp 2n1ems 3nen n4en. n2en3a nen4am ne2nä n2enb n2enc 4n1endb 4n1endd 4n1endf n1endg 4n1endh 4n1endk n1endl 4n1endp 4n1endt 4n1endw nene2b nen3ei nene4m nenen1 ne4nene nen3erb 2nenerg ne2n1eu n2enf 4n1engb nen2gen nen4gen. 4n1engs 4n1engt n1engu nen2gun n2enh ne2ni n2enj n2enk2 n2enm n2enn nen2nar ne2no4 nen3s2e 2nensem nen3sk nen3s2p 5n2en3t2a 4n1entb 4nentd 4nentf 5n2enti 2n1entl 4nentn 5n2entra nen2tri 4n1ents 4nentw 4n3entz ne4n3u n2env n2enw nenz2er neo3b2 ne2oh ne2or neos4 ne2pen 2nepf 2ne4pi 2nepo ne2pos nept4 n4er. ne1ra ne2ra2b ne2rac ne2r3af ne2rag ne3r4al ne2ram ne2ran ne2r3ap n2erat ne2rati ne3rato ne2rau n2erb2a 2n3erbe. 2n3erben 2nerdb ner2dig nere2 ne2r1eb ne2rec n1erf 2nerfas nerfor2 3nerfr 2nerfü 2ner3g4 n3ergeb 4nergi 3nergr n1erh n3erhö 4nerhöh 3neri neri2e n2erj n1erk 3nerka n2erkö n4erleh n2erli 2n1erlö n1ermi 2nermit 2n1ernä 4n3erneu 2n1ernt n1eros n1eröf ne1rös 3n2ers. n1ersa 3nerse ner4sk 2n3ersts nert4 3nert. ne2rup 3n2erv 2nerwar 2n1erz n2es. ne2sal nes2an ne2sei n1e2sel ne2s1ev 2ne3sh ne3ska ne2s1of ne2s1or ne2s3pa 2n1es4si ne1sta ne2ste nes3ti 2n1est3r ne1stu 4nesyn ne2tab 2ne4tag net1ak ne2t1an 2ne2tap 2ne2tat ne2te2l ne2th net3ha ne3ti ne4tim ne4tin ne2tob n2ett net3ta net3te net3t4r 2n1e2tu net2zer net2z1i ne2u neu1c neu2ere neuer2f neuer2k neuer4s neuer2w neuf4 neu3g4 n2eun 2n1eup neur2 neu2ra neu3t 3n2evi n2ew 2n1ex ne2xi 3nez 1né 2nf nf2al nfalt4 nf2ang nf4ar n3f2ä nfe2i n3f2en n3f2er nf2es n4fex n3f2i nfi2le. nf4le nf4lö nf5löf nf2o nfo1s n4föl nf4re nfres3 nf4ri nf4ru nf4rü nf3s2 nf2tan nf5ten nf2t3r nft4st nfts3tr nf3tu n2f1u 2ng n3gabe ng1abt n2g1a2c n2g1ad n2g1ak ng1a4me ng1ams ng3anda ng3angl n2ganh n4ganl ng1ans ng1ant ng1are n3g2ars n2g1a2v n2g1äl ng3d n2g1eif n2g1ein ngelb4 nge3l2ei ngel3t4 n3gene nge3nerw ngen3sa nge2ram n2g1erg nger2zä nger3ze n3ges nge3sa ng5füh ng5get ngg3s ng3hu n2g1id ng5käf ng2lad n3glas ng2läs n2glic ng4lok n3glot n2gn ng3ne n4g3ni ng4nom ng2nu ng2ob n2g1op n2g1o2r n2gö n2grai ng4ran n2g3rat ng3roc ng3rost ng4s3au ng4scr ng4sd ngs3e4h ng4sek ng4sf ng3span ng4spar ngs5tan ngs4teu ng3ts n2gum ngung4 ngzei4t 2n1h2 n3ha. nhabe4r3e n5haltu n3he nhe2r n3ho 1ni 3n2ia ni3alo ni2ar nibb4 ni1ce n1id 3n2id. ni3da ni2de n2i3de. 2nidea ni3den. ni3d4r 2n3idy n2ie nie3b 3nied ni2e1i ni1el nie3l2a nie4n3 ni3ene nie2rei nie4rerg ni2erna nie2sa ni2eu nife4s3 ni3fl niga4 ni2g1ab ni2g1am ni2g1an 4n3i2gel 2niget n4igk ni4gl nig3li ni2gn nigs3c nig4sp nihi3 ni2kar 4nikei 4ni2kel ni3k2erh 4nikh ni2ki nik3ing ni2kor ni2k3r ni4ks nik3t4 4nikun 3n2il ni3l2a ni3l2i nil3l 4nimp nin1 3nin. 3n2ina nin2ac ni2nal 3n2inb 2n1ind 2ninf 3ning n2ing. n2ingo ning4s 2n1inh 4n1ink2 3nino ni2nor 3n2inp 2n1ins 4ninse 4ninsu 4n1int ni3nu 4n1inv 3n2inw ni2ob ni3ok ni3ora n2ip ni4ron n1irr 3n2is ni4sam ni2san ni2sä nis3cha ni2schw ni2s1e ni3se. 4n3isol ni2som 4nisot ni2sp ni3spi nis3s4 nis3tha ni2s1u 2nit 3nita ni3th ni2ti 4ni4tia nit2o 3nit4r nit3s nit4ter4g nit4t3er4k nit2t3r nitt4sa ni3v2 3nix 2nj 2nk nk1abr n2k1ac nk1a2ge n3kal n4kalg nk1ang nk1apf nk3art. n2katm n2kato nk1aus n2kaut n2k1äh n2k1äp nke2c nk1ei nk2eil nke2lei n2kelem nkel5ster n3ken. nke4na nken4te nker4fah nker3la n2k3erle nke2ros nk3ersa n2k3erwe n3kesc nke2t nk1eti nk1i2d n2kide nk1inh n2k1ins n2klade n2k1laf nk3leis n2k3len nk3les nk2lo nk4neb n2knis n2knit n2knu n2k1o4be n2kopt nko2r nkord2 nk1ori n2k1ort n2köl nk4rab nk3rät n4k5re. nk3rel n2kren nk3rep n2krez nk3ro n2krol nk2sal nk2se nk3sen nk2so nks2p nks2ti nk3s2z nk2tak nk2tan nk4tau nk3tek nk4tent nk2terg nk2t3ern nkte3sk nkt2et nk2tin nkt1it nk2top nkt1r nkt3ric nk2tro nk2tru nkt2sen n2k1um nku2n nk1urh n2küb 2n1l2 n3la n3le nle2ga nleit6e n3li 2nm2 n3ma n3mä nmen2s 2n1n n2nada nna2g n2nalg n4n1all n2n1amb n4nan nn1a2sc n2nau n3nec n3n2eh nn2ei. n3nelb nne4le nne4na nn2ens n4nentl n4nereig nner2fü nner4geb nn4ergr nn2erh nn2erk n2n3er2la nner4mit nn2ero nne2rö nn3erwa nner2z nne2s1e nn2eu nn2ex nn3f nng4r n3ni n4nid nnk2 nn2o3b nn3obl nn3obs n2nof n2nop nno2r nn1ori nn4sam nn3s2p nnst2 nn2stoc nn2stö nnst4r nnt2a nn5tag nn2th n2n1uf n2n1unf nn1ur nnvoll4 nnvol3le 1no 3no. no3at 3n2oba n2obel 2nobj no2bla n2oble 3noblo 3noblö 2n1o4b2s 3noby no1c noche4 noch4r 2nod no2de nodi3 no2ed n1of no4fe no5fes 2noff n1oh n2ohe no3id no2kel 2n1okk no3kr nola4 no2lam n3ole no4lig no2liv 2n3o2ly 3nome3 3nomp non2e n1onk nons4 n1ont 2nony no2o 3n2opa 3nopä no2pe 2no2pi 2n1ops no3p2te 3nor. nor2a no2rad n2o1rak no3ral no3rar 2norc nor4da 3nordb nor2des nor2d3r nor2du no3r2e 2n1org 3norh 3n2orl 3norm norm2a nor3mal 3norö 3nors 2n1ort 3n2os. nos2e1 no3sh nos2k no5ski no2s3p 2no2sti nost1r 2nostv nos2u no2tan no3tart no2tä no4t1e2i no4t3entr no4ter4 noterb3 no4tex not1h no2tho n4oti no2tin no4tl no2t3op no2t3r 3nov 2n1o2x 3noz 2nöd 2nöf nö4fe 2n1ök 2n1öl n2ör 1n2öt 2np2 n3pa npa2ge npa2s n3pf np4fu n3pl np4lä np4lu n3pr npro1 n3ps npsy3 n3pü 2nq 2n1r2 n3ra nra3di nran2d nräu3s n3re nrebe2 nre3s4z nro2h nrö2s n3ru nrücker4 2n1s nsa2b n3sabo n2s1a2d n2s1a2gi n3saka nsa4kr n2sall ns4alp n2salt ns2anat ns3ane n2sanm nsa2r ns2arg n3sark nsa2st ns4ath nsau4e nsau4r nsau2s n2saut ns2av ns2ax n2s1än ns2äug n2s1äus n4schemi nscher5g n4schl. nsch2o nscht4 n3schu nsch5werd ns2cr ns1eb n3sed ns2eh nse2ha2 nseh3ere n2seinf ns2ele nse2l3en n2sem. n2sene nsen2sp n2sepo ns4eq nse2rei nser4en n2s1erf n2s1erg n2s1erh n2s1erk ns2erko ns1erl n2serle n2s3erne n2serö ns1ers ns3ertr nser2u n2s1erw n2serz n2sety n2s1eu ns2ext nsfi2l ns4ic ns3iden ns4ie ns4ig n3sim n4simp n2sini nsinn2 nsinns3 n3sis n4siso nsi4te nsi2tr n3skal n3s2kel ns2kis n3skle n4skü n3s2ky n3smara ns3ob n2s1o2d ns1of n4soff ns4om n4s3ont n2s1op n2s3ort. ns2pac nspa2g n4sparti ns2pas ns4pel n2speri n2s3ph n3spi ns4pir n2spo n2sprä n2s3prie n2spro n2sput nsrü2 ns3s2 nss4t n4st. ns3tabl n3stad ns4tagent nst1ak n2stale ns4ta2n1 n3stand nst3ane n3star n2stas n2stat. n4staten ns4tati n2stats n3stäm ns3täti nst3eife nst5einhe ns2temp ns4tent ns2tep nst3erge n3s4terne n3s4terns ns4teu ns2ti n3s4tic n3stif n2stilg n3stim n2stob nst3opfe ns4tor n2strie n2strik ns4trip ns4trun ns2tu nst3u4t ns4tüm nsuli2 ns2um ns1un ns2ung ns4unk ns2unw ns4unz n2s1ut n3sy ns4ys n4sza ns4zene n4szo n4szu n4szü n4szw 2nt n3t2a3c ntags4t ntak2ta ntal3ar nta2lin n4t1all nta2lo nt2alp n3tam n3t2anb nta3ne nt1ant n2tanza ntar3ak nt2arb ntar2c nt1ark nt2arm nt1art n4tarti ntar4tik n4t3artu ntasi2 n2t1ass n2tath n3tatl nt1äm n2t1äu nte3au nte1e nte3g4 nt1eh n3tehe n2teig nt1ein n2t1eis nte2lin n2temä n2t1e2mo nt4en nte4na n4tenpä nten4te. ntera2 nte4r3eis nter3g nt4erh nt4erk nt4erm nt4ern ntern2e nt4erp nt4ert nte3sa n4t1es4s nte2st n4testri n4te4ta nteu3 nteu4eri nte3v nt1hel nt1hie nt1ho nt2hos n2thot nt4hu n2t5hum nt2i nti3c nti2en ntim3p n2t3ind nt3inf nting2 nt3inh ntini1 nt4i3t n3t2lem ntmen2 ntni2 ntnis1 nt4od nt4om nto3re n4torg n4t3o2rie nt4ou n4t1ox n2t1öl nt4ral nt1rau nt4raum nt5re. nt3rea nt3rec n5t4ree nt3reif n5trep nt4repr nt4ré nt3rich n4t3rieg nt3ring n2troh n2tropi n2t3rü nts2ah nts3k nt3s2p nt5spe nts2t nt2sur ntt2 n3tub ntu4re. ntu1s n3t2ü nt3z nt4zk 1nu 3nu1a nu3a2r3 nubi1 2nu1c 3nud nude2 3nue nu2es nu4fe 3nug 2n1uh 3nuhi 3nui n2uk nu3k4l n3u2kr null1a nulle2 null3eb n2um. 2n3umb n2ume 2numf 4numg 2numl 3n2umm 4n3umma 4numr 2n1ums 2n1umv 2n3umz nu2n 4nuna 2n1une 3n2ung4 4n3ungl 4n1uni n3unk 2nunr nun3s 4nunt 4nunv 3nunz 3nuo 2nup 2nu2r nur2i nur3s nur2z 3nu2s nu3sc nu3se nu3sk nu3spo nus2s3er2 nuss3p 3nut nu2t1a nuti2v n3uto nu2top nu4t3r 3nuu 3nux 3nuz 3nü. 2nüb nü4be nür1c 3nüs 1nüt 2nv2 n3ver n3vl nvoran2 2nw nweis3s 1ny. 2n1ya n2ya. 1nyh n1yo 1nyr 1nys 1nyw 2nz n2zac n2z1a2g n2z3a4k n2z3a4ne n2zant n2zar nz3a2ri nza2s n2zat n2z1au n2zän n2zär nze4la nzel4lig n3zeni n2zense n2zentl n2zents n2z1erh nz1erl nzer2lö nz4err nz3erste nzer4tra n3z4es nze3sk nze2t nz1eta nze3u4t n2z1id nzi2ga n2zinh n2z1ini nz1int nz1inv nz3le n2z1op n2zöl nz3st nzt4r nzu3p n2z3wa nz3wä n2zwet n2zwir n2zwö n2z3wu 1ñ ño1 ñor2 2o1a2 oa3bi o2ac oa3che oa3chi o2ad oa3de oad4st o3ah oa3in oa4k1l oa4ku o3al o4a3la oa4lg oa4ls oa4me oa4mé o2ami oa4n4a oa4nn o2a3q o2ar oa4re o2as 3o4a3se o3ass oa4tr 2o1ä 2ob. o3b2al ob2am 2ob2ar 2obau ob1auf 2o3b2ä 2obb ob2e 2obe. 2obea 2obec 2obef o2b3ein 2oben obe4na oben3d4 1o2ber 2o3ber. ober3eis ober3in obe4ris 2obev 2obez 2o3b2i obi2e 3obj ob1la ob3lei 1ob3li ob4lit 2oblo2 2ob2lö ob2lu o2boe ob1or 2obot 2obö ob3rei 2obrü ob3s2h ob3sk obs4p 2o3bu o4bunt obu2s 2o3bü o4büb 2o3by oby4t 2oc o3ca oc1c 3occl o1ce och1a ocha2b ocha2r o1che oche2b o2ch1e2c och1eh och1ei oche2l ocher2k ochi4d ochi3e och3l och3m och1o ochö4f och3r och1s ochs4p och3t4e o1chu ochu4f och3u4t och3w o1ci o1ck o2ckar o2ckau o3cke o4ck3er4sc o3cki oc4ko o4cks ock3sz ock3ta o1cl o3cu 2od2a od3ak od2dr o3dec o3d2e3i odein3 ode2l3ag ode2man ode2n1 ode2s1e ode3sp od2et o3dex od2i 2o3dia 2odic 2odif 2o3dir 2odn o2don o2d1op odo4s od2ö 2odr odt4r 2o3du o3dy ody4m 2o1e oe2b oe2c oe3de oe2h oe2l oe2m oe4mi oen1e oe4nz oe2p o2es oe2sc o2et2 o3et. oe4ta o3ets oe2v oe2x o1ë o2f 2o3fa ofa2c of1a2d of1a2g of2an of1au 2o3fä of1är ofdie3 o3fe o4f1e2b o4f1ec 2ofee o4f1ei 2ofem o4fent 2ofer o4ferb o4f1err 2of2es o4f1e2t 2ofeu of2f1a off3erz of2f1in 1offiz of2f3l 2offn of2f1o of2f3r offs2 off3sh off3si off3sp 2o3f2i ofi3e ofie2i ofi3k4l ofi3s4 2o3fl of3le of3li of4lö 2o3fo 2o3fö 2o3fr of3rä of4ru of4rü of2s1 of4sam of3sä ofs2ch ofs3p of3sta of4staf ofs3te of3sti of3str 2oft oft2a of2tei of3th oft4r 2o3fu of3uh of3ur o3fü 2og o2g1ab o2g1ac oga3d og1ang og1ans o2g1e2i oge2li ogener2 ogen2id ogerätein6 ogeri2 o2g1eth og2gl o3gh ogi4e o2g1ini o2g3ins og1l og3le og2lo o3g2n og4na og4ne og4ni og1o2ri ogs2 og3s4p og1ste og3sti 2o1ha o3ha. oh1alk oh1ar o1hä o1he o3he. oh1eis o3hem o3hen. ohen3s o3her. o3here oh1er4t oh1er2z o3hes 2o1hi 2ohl ohl1a oh2la2d oh2lä oh3lec ohl1ei ohle3l oh3lep ohler2 oh4lerg oh4l3erh oh4lerw oh3lo ohl1o2r ohls2e oh2lu 1ohmi ohn1a oh4nac oh3nee oh2ni 1ohnm oh2n1o ohn3sk 2o1ho oho2l1e ohol1o oh1o2p 2ohö oh3öl ohr3a oh2rel oh2rem ohren3s ohrer2 oh2rerg oh3rers oh3ri oh4rin oh4rol 1ohrr ohr5t4r oh1s oh3sa oh3t o1hu oh3w 2o1hy 2oi o1i2d o3ida o1i2m o1in o4ine oi2r o3isch. o2ische o1ism oiss2 o1i2t oi4ta oi3te oi3th oi3ti oi4tu 2oj ojek4tori ok2a oka3b2 o2k3ac oka3i oka2la okale2 okas4t ok2e oki4o ok2la ok3lau ok1lä ok2li ok4na ok2o 2okr ok2so ok2sp ok3t2 ok5tor 3okw 2ol o1la ol3abu olaf4 ol1ami ol1ant ol2ar olar3s o3l2as olast4 o1lä ol1ät ol2chr ol4d1am ol2dä ol2d1ed ol2d3eng old3ersa olde2s ol2deu ol2dim ol2d3o ol2d1r 4o3le. ole2e o2l1ef ol1eie o2l1eis ol1emb oler2 ol1erk ol1er3t ole3s ol1ess ole2s2t ole4sti ole3u2 ol1exz ol2fa ol2fem ol2ferl ol2f3l olf1r ol2fra olft4 olgege3 ol2gl ol2gr olie4n1 oli4er oli3k4 o4l1ind oli5tu oli6tun 3oliv ol3ke ol2kl ol2k3re ol2kro olks3 olk4sc olk4si ol2l1ac ol2l1ad ol2l1ak oll3am ol2lanh ol2l1au ol2l1e2b ol4l1e2c ol2l1ei ol2lel ol2lent ol2l3erh ol2ler2k ol2l3er2l ol2l3erw ol2l3ess ol4lk ol2lop oll3s2a oll3sp ol2of oloni2e olo3p ol1ort olo1st olo3t ol2ov ol3s2k ol4ster ol3t2h o1lu ol2y1 4o3lys ol2z1a2 olzer2 ol4z3ern ol2zers ol2zim ol2zin ol2zo ol2zw ol2zy 2o2m o3ma o4ma2bl o4m1a2ge om1alg om1all o5man. oma2n3er o4m1ang omani2e om2anr om3ansc o4m1ap o4m1ar4s o4m1art omar4te o4ma2sy omat2i o4matom o4m1au o3mä o3me o4meb om1ebe o4m1ef om1ei o4meis o4mele omen3t4an o4mep omer2 o5mer. om1erh o4meru om1erz o4mex o3mi omi2c3 omi2e omiet1 om1ind om1ing o4m1inn o4m1ins o4m1int o4miso om2it om3ma omm2e 3omn o3mo o4m3oa o4m1org om1o2ri o4mox o3mö ompani2 om3pf oms2 om3sk omt2 om3th o3mu o4mum o4munt o3my 2ona on3a2b on2ac ona3g o3nal on3ann onanz3ei o2n1ap o2n3arb ona3th 4onatol onat2s o4n3at4t on2au 2onä on1äh on2dan onde4rers ond1r on2dra on2drin on2d3rü ond3sk 2one o2n1e2b on1ec one2ck o3nee o2nef one3h o3neig on3ein on3ele on1ema one4n1 o4n3ends on2eng onen3s2 onenz4 on1ep o3ner. on1erb o2n1erd oner2fa o2nerh on2erka on1ers o3nes o3nett on2eu on3f2 on3gl ong4le ong4r ong3s2 on2gue 2o3ni oni3de onie3g oni2ga o4nikan o4nikb o4nikf o4nikg o4nikk o4nikl o4nikm o4nikp o4nikr o4niks o4nim o4nind o4ninh o4nins on3k2 3onke onk4n onli4 onlo2c onna2 on5n2an on3n2e 2ono1 o3nod o2nof o2n1oke o3nom on1orc on3ord ono3s ono3t2 ons1a onsa2g on4sam onsau3c onsch2 on2seb on4sed onsen1 onse4t onsi2d ons3ing ons3l on4spin onst2a onst4r ons5tri on3ta on2t1eb ont5end on2t3erl on2th on2t3rat 2onuk o3nur 2onut on3v 1ony o3ny. on3z2 onze3in oo1c ooch2 oo2gl oo2k3l oo2kn oo4mb oo4mo oo2ne o1o2p oo3pa oop2s o1or oor3a oor3d oo4sk oos3s4 oo2su oo2t1a oo4t1ei oo2t1h oo2t3o oo2tr oot2st oot3t oo2tur 2o1ö2 2op. op3adr op1akt opa2le op1ang opa1s opa5s4t 2opä 1ope 2o3ped o4p1ef 2opei 2opel 2open 2opep o2per o4pera op1erh 2o4pf. op2f3a op3fah o3p2fä o4pfe op2fem op2fin opf3la op3flü op2fo 2oph2 o3phe opi3a2 opia4t opie2r3u opin2 2opl op3lag op3le op5leu op2ne 2opo opo4la op2pan op4pl 1oppo op2p3r 2oppt 2opr op3rec 3o4psi op3sz 1opt2 2opte op3th o4pti opt4r o2pum 2o3py 2oq 2or. or1a 2o3ra. o1raa 2or3a2b o2rabb o2r3add or3adr o1r2ag 1orake ora4ku o1ral o4r3alm or4alt or2am or3a4mi o1ran3d or4ane oran2f oran2m oran2ze or3app 2orar o1r2as o2r3att 2orau oraus4wa or2av 2o3raw o1ray o3rä or1änd or1ät orb2l or1c 2orca 2ord. 4orda ord1am or2d1ar or2dau 2ordb or3de. ord3eng ord3ermi or2d3erw orde4s or2deu or2d3ing or2d1ir or2dit 1or4dn or2do2 2ordr or4ds ord3s2t ord3t 2ordu 2ordw 2ore ore4as o2r1e2b o2r1e2ck or1e2di o3ref or1eff ore2h o2r1ei o3rei. o3reie o3r2eif o3r2eis orems2 o3renn oren4ne o3rep o2r1er o3r2ere o3r2ero ore4th o2r1eu 2orf or2fac org4a org2e 2orget or3ghi 2orgia 1orgi3e or2gl or3gla or3gle or2gn or3gne 2orgr 2orh 2o3ria 2or2id orid3i 4o3rie. o3rien. ori4eng ori4enr o4rienti ori4env o3rier o3ril ori3m or1ima ori4mi 2orin o2r1ind 2or4io o2riso 2orit 2ork ork3sh 2orm or2mam or2mang or2mans orm3asp or2m1eb or2m3erf or2mer2g or2mor orm3ord orm3org or2mum ormu4n or4muni or4munt ormwa5r orna2c orn3ack or2nal or2nan or2nar or2nau or5ne. or4nei or5nes or3ni or4nin or3no1 2o1ro o2r1ob or3oly oro3n2a or1opf o2ro2r o3rou or1ox 2o1rö 2orp 2orq 2orr orr4a or3r2e 2ors or3s4a or3sche or3sh or3si or3s4k ors3tun or3sz or2t1ak or2t1an orta2r or2tef orte4n or4ten3g ort3erb or2tere or2t3erf or2t3erg or2terk or2t3erl orter4sc or2t3e2v or2the orti3en or2tin or2t3off or4t1o2r or2tö ort3rad or2trau or2t3räu ort3re or2tro or2t1um or4tü or5tün 2o3ru or2uf or1uh orum4s o4r3un oru2r o2rü or3z2e orzel5 or2zw 2o3s2a os3ad osal2 o4s3ami osa1s 2osc o4s3ca osch3ar o3sche osch3le os4co 2ose ose1e ose1in2 os2el ose3l2a o2s1er2k os2ex 2osh o4sh. o3s2hi os2ho o4shö o4shs os4hu 2osi os4it o3sk o4sk. 2oska os2kal o4skb o4ski 2os2kl 2os2ko o4skr o4sks o4skv o4sky 1osm os4mog 2oso osol1 o2sö 2osp os5pfa o3sphä os3pi o3s2po os4pot os4pt os4pü os2sa oss2abb os4s3a2c os3sag oss3ala oss3and os4sä os2sei oss3enke os4s3enz os2s1ep os2s3er4b osser2e os2serf osseri2 os2serz os5set os4sik os4sim os2s1o2 os4son os2s3p os2s3t os4sü ost3abl ost1am ost3ang ost1ap os5tarr os4tat ost1a2v oste2c oste2n ost3engl oster3e os6ter6weit ost3eur os2t1h os2tid osti3en os3til os2tin os3tina os2tit os3to os4tob os4tor ost3ran ost3rä ost3re ost3rot ost3uf os2tug 2osu2 os1um osu4r 2o3sy osyri5 o3s4ze 2o2ß o3ße o4ßef o4ßei o4ß1el oß1ent o4ß1en2z o4ßep oßer2 o4ß1erb o4ß1ere o4ß1erf o4ßex o3ßi oß1is 2ot o3tabe o2t3abi o2t1ah o2t1ak o3tam ot1ant o3tark ot1a2st o2t1att o2t1au o3tau. ot1ä o3te o4teb ote1i o4t1eib o4t1eic otei4n ote3in. ote3ine ot3einh ote3inr o4t1eis ot2el ote4l1a ote2lin otel3s2 o4t1emi ot2em3p2 ote4na otens4 o4tentb ot1erb o4t1er2l o4t1erw ot2e2s ot2har o2them o2t1hi o2thu o2til o2t1i2m otli4 ot2o oto3b ot3off oto2ph o2t1ö otra3c o3t4ran ot3rat ot3re ot3ric ot4rig ot3rin ot2s3at ot3sch ots1o ot2s3pr ots3tau ot3sti ot3stra ot2su ott1a ot4tan ot4ta4s ot2teb ot2terh ot2ter2k otte2s ot2t1h ot2tim ott2o ot2t3r ot3t4ra ot4tri ot3t4ru ot1url o3tü ou3f4l oug2 ou4ge ou3gl o1uh ou1is. 2oul ou2le. ou2les ou4li 2o1um 2o2u2n oun2ge. oure2 ou2ret ouri4 ourie4 ourme4 our4ne. ou3sa ous2i ousi2e 1outf ou3ti 3outp out3s2 ou3tu4 2o1ü ov2a 2ovel o3ven ove3s4 oviso3 2ovo 2ow o4w3al o3wec ow2er o2wer. o2wh owi3en o3wj ow4su o2wu 2ox. o1x2a 2oxe o2x1el o2xid 2oxk ox3l o2x1u 1oxy o1yo oy1s2 oz2 o3za 1ozea 2o3z4en ozen2ta ozes4sc 2o3zi ozir3 ozon1a 2ozy ó2k ór3d2 ö3ba öb4au öb2l ö2b3le ö2b3r öb2s3 2ö1c öch1l ö2chr öch2s öch4ste öchst3ei öchst3r öchs2tu ö3cke ödel3l öde1r ödi3 ödienst6 öd2st 1ödu ö1e 1ö2f ö3fe öf2fl ö3fi öf3l öge3le ögen2s1 ö2g3l ö2g3r ö1he öhe4n1 öhl4e4 öhre4 öh3ri ö1hu ö3ig. ö3isch. 1ö2k2o3 ö2k3r ök2s ö2l 3öl. öl1a2 öl1ei öl1em öl4en öl2f1ei ölf2er öl1in ölk4e öl2k3l ölks4 öll1a öl3le 3ölm öl2nar öl1o ölo4f öls2 öl3sa öl3sz öl3tu 1ölu ölz4w öm2s ön2e ö3ni önizi1 önn2e ön2s ön3sc ön3sp ö3o2ta öoti1 2ö2p ö3pe öpf3l öp4s3t ör3a2 öra4k ör2b3l ör1c ör3de ör2dr ör3dra ö2r1ec ö2r1ei ö2r1e2l ö2r1e2m öre2n ö2r1ene ö2rent ö3r2erb ö2r1e2r2e ö2rer2f ö2rer2g ör2erh ö2rer2l ör2err ör2erw ö3r2erz ör1ess ör2f3l ör2gl ö2rim ör2kl örn2e örner2v ör1o2 örpe2 örs4e ör3s4k örs3t ört2e ör5tri öru2 ö2r1une ö2sa 2ösc ö2sch3a ösche2 ö2sch3ei ö4schen4e öscher4 ö4sch3erf ö4sch3eri ö2schi ö2sch1l ö2sch3m ö2schn ö2schw ös1ei ö2sein öse3str ö3set 2ösl ö2sp ös2s1c ös2st ö2st öst1a2 ös3te ös2th ös3tr ö3su ößen3 öß2ti ö2t3a öte4n1 ö2t3r öts2 öt2sc öt2tr öv2 öwe2 öze3 özes4 1p 3paa p1ab p2abe pab2l pab4rü 2pabw 3p2ad 2padr pae2 pa3el pa2es pa3fr 3pag2 pa3gh pa1ho 3pak pa3kl pak4to 3pal2a pala3t4 3palä 3pal2e pa3l2i pal2ma pal2mä pal2m1o 2palt pal2t1a pal2tei pal2tr pa4m3a pa2nar pa4n3at pan3d pand2a pan4ds pa2neu pang4 2pange pa4nisl pank4 2panl panne2 pan4n3eb 4pannu 3pa2no pan3sl 3pan3t2h 3panto 2pantr 3panz2 pan3ze 3pap papieren4 papie6r5end pap2pr pap4s papst1 pa2r3aff par3akt pa2rant pa3rap pa2rä 2parb p2arc par3d 2parer parer2g 2parg pargel4d pa2rid 3park. park3am par2kau par4kr 3parks par3m2 pa2ro 2parp 4parr 4parta 3partei 3parti 3partn 3party 2parv 2parw par3z4 pas2e pa3s2p pa4spe passer2 pas2sp pa4st pa5str 2paß 2pat. pat1a pa5tag pat4c pat4e2 pa5ten pat2h 3pati 3pat4r pa5tri 3pau 4p1auf pa3uni 4pausz pay2 3pä2c pä3cke pä4ck3er 3päd pä2d1er 3päs pä4ta pä4t1e2h pä4tent pä4tep pä4t3erb pät1h pä2to pä4tr pät3s4 2pb 2p1c p3ch 2pd2 pda2 pda4t pe2a2 pea4r p1e2b pech1 3pech. 3peda 3peel 2pef 4p1eff 3peg pege2l pei1 4peic p2eim 4peis pekt2i 3p2el pe4l3ab pe4lai pe2l1au pe2l3ax pe2l1ä pelb2 pel3d4 pe4l1e2h pe2l1er pe2let pe2leu pe4lh peli2d peli4n pe2l3ink pel3inn pel2ins pel3k pel3l2a pell4e pell2i pe2lob pels2 pel3sp pel3t2a pe2lut pel2zin pena2r pe4nas pe2nä pen3d2a pe4nen1 3penh pe4ni2t pe2n1o pens2a 3pen3s2i pen3s2o3 pens2p 3pensu pen3sz pent2a 2pentw penty2 penu2 pen3z4 3pep pe3pi pept2 pe1ra 4perad pe2rak pe2rau pe2r1ä per1e2b perer2 perer3s perer3z pere1s per2id pe3r4io 3perle per2r3an 3pers 4persi peru4 pe3run 3perü perwa4r pe3s2a 3pes3s2 pes2ter pest1o 3pet pet4r 2pf p2f1ab p2fad pf4ah pf1ai p2f1ak pf1am pf1ans p2fa2r pf3are p2f1au pf4av p2f1är p2f1äu 4pfe. p2fef p2fei pf1eim pf1ein pf1e2m p2fener p3fens p3fent p2f1enz p2f1ep pfer3a pfer4pro pf4es p2f1et pff4l pff4r p2f1i2d pf1inn p2f1in3s pfi2s p2fl pf1lam pf4lan pf4leg pf3lei pf3lo pf4lü 4pf5lüm pf4lw pfo2 p2fob p2fom p2for pf1ori p2f3r pf1ra pf4rä pf4ro pf5roc pf5roh pf4rü pfs2 pf3sa pf3se pf3sl pfs4ti pf3sz pf3t2 pft4r p4fuh p2fum 2pg2 p3gl pgra2 2ph. ph2a phal4te4 p1hand 3pha3s p1hau phä1 4phär 2phb 2phd 2p1hei phen3d2 phe4n1e phen3s4 2ph1ers 2phf 2phg p2hid phik1a phi2kan 3phil phi2t 2phk ph2l 2phm 2phn p2ho. p2hob 2phö ph2r 2phs ph3t2 2phthe phu4s phu3t 2p1hü 3p2hy 4phyk 2phz p2i2a3 piab4 pia5ka pi4ali pi4an piap2 pia4tr pi1ce pid2 pi2e pie1i piela2 pieler4ke pi3ent 3pier pie2ra pie2reb pie2rei 3pig pi3gl 3pil pi3le pill2 pil2zer pil2zw p2im pi2nad 4pind pingen2 ping3s 3pinse pin3sp pi2o pi3onu pi3os 3pip pi2pe pi4pel 3pirate pi3ri pi3s2k 2piso pit2a pi3t2h pit2s 4pitz pit3z2e pi2z1in 3pizz 2pj 2pk2 pku2 p2l2 2pl. 3pla 4p3lad p1lah p4lak pla3na p4lau pla2y 3plä 2p3le. ple1c ple2e p4leg ple3n2 2p3ler p4leu p4lex 2plig 3p4lik p4liz plo3n 2p3lu plu2s 2pm2 p3mö 2p1n2 pob2 2po1c 3pock 3pod 3poe po2el 2p1of 3pog 2poh 4poil 3po2in po2it poka2le 3pol po2lan po3lar po2l1au pold2e pol3f po3li po3lo5p pol3z4 pom2ph poni2 3pont2 po1ob 3p2op po4p1ak po2p1ar pop3l po2pli po3p2t po1rau po3re porf4 pori2e pork4 por3s 3portal por2th 3portio 3porto. 3portos 3portr por2tre port3ric 3posi poss2 po2sta pos4t3ag po2stä post3ei pos3tel pos4tem pos4tr post3ra post3ri pot1ar 3potä 3pote pot2h poti2e po2tin pott1r po2t1u po3un po2w powe2 p2o1x pö2bl pö2c 2pp p2pab pp1ans p2pat pp1au ppe3e p2p1ei ppe2l1a2 ppeli5ne ppel3s ppel3z pp2e2n1 p2p1erz pp3fr p2p1h pp3he pp3l p4p1lac p4plan p4p1lä p2ple pp1oh p2p1ö2 pp3p ppp4f p2p3ra p2prä p2pri pp3rol pp3rot pp3ru pp3s2a pps2p pp3sy ppt2 ppt4r p4p1um ppyl2 p2r2 2pr. 3prak 3prax 3präl 3präm 3präp 3präs 4pre. 4prec 3pred 4pree1 pre2ei 2preg 3preis prei2s3c prei4sei prei2s5t 2preiz 3prem pren2ga 2p3rer pre3sa pres3s2e pri2e 2prig pri2l1 p4rin 4pring prings4 3prinz pr4io pri3o4n 3pris pri2t1 priter2 prit5t4 4pritz 3priv 3prob pro3be 3p4rod 3p4rog 3proj 3pr4om 3prop pro3pe 3prosa 4pross pro1st 3prot prot2e prote3i 4prott 3prov pro1x 3proz 2prö 2pru 2prüc 3prüf 4prüh 2prün 2p1s ps1ad ps2hi psi2e p2sö pss2 pss4t p2st p4st. p3sta pst1au p3stä p3stea p3stel ps2th p3s2ti ps4to p3stö ps2tu p3stü 3p2sy 4psys ps2ze 2pt pt1a pt2ab pta2g p2tana p2t3a4t pt1ä ptde1 p2t1e2b pt3ec pt1ef pt1ei pt1emi p4t1en2g p4t1ent pt1ep pt3ernt pt1erw pt1erz p4teta p4t1eti p2t1h pt1id pti2de pt1in pto4mo pto4na pto2p pto2w pt3r ptri4e p2tro pt3s2 pt4sl pts4t pt1uh pt1um p3tung pt1urs ptü4b 3p2ty pt3z ptz4w pu1a 3pub pub4l 2puc pu2dr 2p1uh 2puk pu2kl pu2k1o pu3la pu2lin pul2sp pul2st 3pulv 4pulw pum2pl 3pun 4pund pun2e pun2s 4punt 3pup 2pur pu2ra pu2rei pur3m pus4h pu3she pus3s pu2s3t 3put put2e put2s puzi3 2pü 3püf pü4lei pül3l2 2pv 2pw pwa4r py1 py3s py3t 2pz2 1q 2qs qu2 qu4ac qu4ar qu4at qu4en qu4er que3rel que4te. 3queu qu4in 1ra. r1aa ra2ab 2raac 2raal ra3ar r2a1as r1ab ra2b1ar r2abä 1rabbi rab2b3l 2rabd ra2bei rab2er rab3erd 2rabf 2rabg 2rabh 1rabi r2able ra2bli ra2b5lo 2ra2br 2rabs2 2rabt 2r3abw 1raby 2rabz ra2ce 2r1acet ra2cheb ra2cho 2rachs rach4t3rä ra2chu r2ack 1r2ad r4ad. rada4 ra2dac ra4d1am ra2dan 2radap 3radar ra2de4i ra2d3end 3radf 3r4adh r4adi 3radio 4radit 3rado 3radp ra4d1r rad3ri rad3t4 rad5te rad5tr r2af raf3ahn raf3ar rafe2 ra4f1er raf3r raft5s rag2a ragein2 rages4 2ragg ra3g4le 4ragm ra2gn rag5ne r2ago rahle4n 3r4ahm r1ahn 2ra1ho 4raht r2ai 2raic rail2l 2r3air raka3 1r4ake 2rakk 3ra3k4l ra4kre ra4kro ra4kt 2rakti 1r4akü 2rakz r2al r4al. ra2l1a4 ra4l3ab ra2lä ral3b4 3r4a4ld r4ale ra2l3end ra2lent ra2l5ern ra3lex r4ali ra2lid rali3er ra2lin2d ra2l3ing ralin4sp ralin4t 2r3alk. 2r3alm. 2ralp. 4ralpe r4als ral3sc ral3sk ral3su r3alt 3r4al3t2h ra2l3u 3r4aly rama3s ra4mei ra4mer r2ami r2amm ram2man ram4mens ram4m3ers ram4m3u 2ramn 3ramsc 2r1amt ramt2s 2ramu 2rana ran1ad ran3ade ra2nal ra2nan ra2nar ra2nau 2ranb r2anbe r4anda r4ande ran2dep ran2d3er 3r2andi rand3s 1raner 2ranf ra4ng 2ranga ran2gan ran4g3e4be 3rangi r2angl rangs4 rang3sp rang3ste rani3e r3a4nil ran3ka ran2kr ran2kü 2ranl 2r1anm r2anmi r2anmu 2ranna ran5ne 2r1anp 2ranr 2rans r2ans. ran2sam ran2spa 2rantei r2anto 2rantr 1ranu 2ranw r2anz. r2ap 2rapa ra2par 2rapf 2rapo ra2pok ra2pos rap4pr 2r3a2pri 2r1a2q r1ar r2ar1a 2rarb r2are 3r4arei raren1 rar3et rar1e2v r2arf4 rar3in ra3ris r3a4rist 4r3arit r2ark 2rarm raro2 ra2rom rar3r 2rart 2rarz rar3zw r4as. ras2a ra3san ra2schl r2asm ra3spr r2ast ra2sta ras4t3ei r3asth ras4to 2rasyl 2raß 1rat r4at. r4ata ra2t1an ra2t1ei r3a2tel 3ratg r4ati ra4tid rati2e 2ratm rat2o 2ratom ra5tor rat3r ra2tra rat4re rat5schl 2r3atta 2rattr 4ratz rat3ze 4rau. 3raub. rau2bri rau3e4n 2rauf rauf3sa 2rau3g2 3r4aum rau2m3ag rau2man rau3me. rau2mi 3raup 4raur 2rausb 3raus2c 2rausd 2rausf 2rausg raus4gewä 2raush 2rausl rau2sp 2rauss raus4sche raus3se 2rausv 2rausw rau3ße 2rauto raut1r rau2tra rau2tro raut3s 1raü r2ax raxi2 r3axt r2ay r2az räch2s 3r2äd 2räf rä3fr 2räg 2räh 2räm 3rän. 3räni 3räns 2räp 2räq 2r1är r2är. rä3ra rä1ro rä4sa rä4sc räse2 räte1s 3rätse 4rätz rä2u 4räue räu2s räus4c räu5schen. 2räuss 2räuß 4räut 2räx 2rb r2b3a2b1 r3bac rba4del rb2al r3bam r2bang r2bant rb1art r2barz rb1auf rbb2 rb1ech rbe3erf rbei3d2 rbe3inf rb3einh rbe3int r4belä rbel2o r3ben. rbe3r2e rbe3rum rbe3sl r2bim r2binf r3bit rbit2a rbi3tu rb4la2d r2blan r4blasser r2b3last r3blat r3blau r2b3le. r3blen rb3ler r2bleu rb2lin rb2lö rb2ob r2bonk rb3ras rb3rea r4b5rechts rb4ri rb4sam rb2sei rb2ser rb2s1o rb4stä rb2su rb2u rbü4b rby4t 2rc r1ce r2cer r1che. r1che2n r1ch2i rch3l r3chlo rch3m rch3r rch4ro rch1s4 rch3t2a rch3w r1ci r2ck r3cki r1cl 2rd rd2ac r2daf r2d1ak r2d1a2l rd2amm rdani1 r2dann rd1ant rd1ara rd1ark r2darz rdär2 r3dee r2dei rd2ei. r2d1elb r2de2le r2delf rdem4 rden3d r2dengl r2dents rde3ob rde3ono rde3r4er rderin4s r2d3ernt rder3w rde3sp r2d1e2x rdie3ne rdien4s rdiensta4 r2d1inn rd1iri rd1ita r2dof r3don rd1os4 rdo4st r2d1oz r2dö rd3rat r2drau rd3ris rd4rö r3d4rü rd3s2a rd2sän rd3s2k rd3s2z rd3t2a rd3th rdt4r rdt2s r2d1uk rduns3 rdwa4 1re 3re. re2ade rea4l3erw 4re2am re3as re3at. re3ats reatu3 2reä re2b1a re2b1l reb3so rech3ar 4rechs rechter4 2rechth 2reck. 2recki reck2st re4ct 3red. re3da 4redd re2del rede3r2 2redi1 re2dik 3redn 3redu re1ebe re1el re1em re1eng re1er 3refe 4reff r2eff. 3refl 3refo 3reg rege2l3ä 4r1egg re3gi re2hac re2h1ar re2h1ei re2hen4e re2h3ent re2hi reh1l4 re2h1o re3hol 3rehö 2rehr reh3re reh1ro reh4th re2hü r2ei. r2eib rei2bei rei4bel rei2ble reib1r rei2bra r2eic 2rei3d r2eie 4reier. reier2t rei2fei 2reig 3reigä 3reigeh r2eigel 4reigens 3reigi 4reign 3reigru r4eih rei3l2a rei3l2i 2r1eilt reim2p r1ein 2rein2a rei3nal 2reinb rein2du rei3n2e3c reinen3 2reinf rein4fe re2info 2reing 2reinh 4reinn 4r3einr 2reins 4reinsa rein4sel rein4sz 2reint re1in2v 2reinw 2reinz 2reisar 2reisb reises4 2reisf 2reish 2reisr 4reisu 2reisv 2reisw reit3s2 3rek 4re2ke 4rekk 2rekz r2el. r2ela re3lat 2relb rel2e relea2 re5lei re2lek 4relem r2elev 2relf reli1 2relit 2relix r2ell rel2lar rel2lei re3lo r2els 2relt relu2 3r2em. 2r1emb rem2da re2m1ei re5men 2remi re3mig r2emit 2rempf rems1c rem4str 2rem2u r2en. r2ena 2rena. re4nac re3nad re3nal re4n3an re2nä 2r1endg 3rendi ren3dr 2renerg 2rengag ren2gan 2rengp 3renh re2ni re3nik 3renm ren2nar ren4nene renns4 renrü2 ren4sein rens2p r4ent. 2rentd 4rentera 2rentf 3rentfo 2rentg 2r1entl rentmo4 2r1ents 3rentss 2rentw 2rentz r2enz ren2zan ren2zer renzer4f renz3er4s renzer4w ren2z3in ren2zw re2ob re3or 3repe 4re2pen 2repi re2pis 2repoc 2r1e2pos 4repp 3repu 3r2er. rera2 2r1erb 3r2erber rer2bi rere2 2rereig r1erek re2r1ep 3r2erer r1erf 4rerfah r4erfe 2rerfi 2rerfo r2erfr r3er2fü r1erg 2r3ergeb 3rergebü r2ergen 3r2erges 2rer2go rer2gr r2ergru r1erh rer2hö re2rid r1erk rer2kan rer2ke 4r3erken 3r2erki 3r2erko r2erkre r1erl 2r3er2la 5r4erlag 2r3erleb r2erli 2rerlö r1erm 3rermo rer2n 2r1ernä r1er3ne 2r1er4ni 4r3erns 4r3ernt re2rosi 2r1er2ö r1erre rer4reg rer2rei r1erri 3r2ers. 2r1ersa r2erse 2rersp rer2spa rer2sta r2erstr 2rer4su r1ert4 r2erte 2rertr r1erw 2r3erwa rer2wac rer2wec r2erwes 2r1erz rer2zä 3r2erzy 3r2es. re2sa re4sam resche2 re2schm re2schw rese2h re2s1of 3resol 3reson re2spa 2ress 4resse res3sei res4s3erw 4ressu re1sta res4tas res4tent res2tex 2res2tu 3resu re2t1ak 2re2tap re2tau ret2e 2r1e2th re2tra re2trol re2u reu4eri reu3g2 2reul re3uni 2r1eur reu2zei 2reü 4r3eva 2r1evid rewa4r re2wi 4rewo 2r1e2x1 3rez 2rezi 1ré 2rf rf1a2ck r3fam rf3aue rfe2i r2fent rfer3g rf2es rff2 rf3fe rfi2le. r2fland rf4lä rf3lic rf4lö rf4lu r3flü r2fo2b rfolg4s r2frauc rf4ru rf4rü rf2sa rf4sam rf2s1ä rf2su rf2ta rft4r r3f2u 2rg r2g1a2d r2g1ah r2g1ak rga2ner r2g1ap r2garb rg3art. r2g1ask rg4at rgd2 rge4an rge2bl r3gebo r2g1e2c rg1ein rge2l3er rge2li rgen2ge rgen2z3w r3ges r2ge4tap r2geto r3gew rg2ins rgi2sel r4gl. r2glan r3glanz r2gleu r2glig r2g3lit rg2log rg2lu r2g3na r2gne r2g3ni r2g3no r2g3oa r2gob r3gog rg3op r2g1or rgö2 r2g1öd r2g3ral rg4rau r2grän r2greg r2g3res r2gret rg3rin r3grö r3gru rg3rüs rg3sä rg3se rgs2ei rg4sel rg3s2i rg3sp rgs4pe rgs4pi rgs4po rg3st rgs2tu rg3su r1h2 2rh. r2hag 2rhah 2rhak r3halt. r2haltb r3han r3has 2r3hau 2r3hä r2he. r3hea 2rheb 2rhef rh4ei 2rheit 2rher 2rhi 2rhof rho2i3 2rhol r3hop 2rhot 2rhöl 2rhs rhu2s 2r3hü 1ri ri3ams ri1an ri2ano ria1s ri2ast rib2bl ri1ce ri1cha ri3chl rich3ter richt4spo ri2cki ri2con ri2dau r2ide. 2ridee ri2d3e2l ri2dent r2i3di 2ridol 2ridy r2ie rie2fem 4riefm rie2f3r rieg4s3 ri2e1i ri1el rie3l2a ri3els ri4enä riene2 rien3s rie4nu ri1er. rie3r2e riere4n ri3ers. rie3sa ri1eu ri2fa ri2fä ri2fei ri2fer3 rif4f3end rif2fer ri2f1o ri4fr rif3s rif2ter 3rig 4riga 4r3i2gel ri2gene 4rigg rig1l ri4glä ri3g2o3 ri1i rii4t ri2kar ri2kä ri2kin ri2kn ri2kone rik2op ri2kor ri4kt ri3kü 2rima ri4mag ri2me. 2rimm 4rimp rim2s rim4sc rim4st ri3na r1inbe rin2c 2r1indu ri3n2e rine1i rine3s 2r1inf 3rinfr r2ing 3ring. rin2ga ring3le rin2gr ring3sp 2r1inh 2rinit 4rinj 2rink rin2kl rin2ko rin2kr 2rinl 4r3innenm 2r3inner 2r1innr r1innu ri3n2o3 2r1in2q 2r1ins rin4si rin2so rin2spe r2inspi rin3stei rin3str 3r2insy 2rint rin4tent rin4t5re 2r1inv rin2va 2rinz ri2ob r3ion ri3o2st ri2pl ri3po 2r1ir r2is ris2a ri3san ri2scho ri2schw 3risik ri3s2ko r3iso ri4s3p ris5pi r3isr 3riss ri4s3t ris4t3ers ris4th rist3r r2it 2r3i2tal rit3ant rit2i 2ri3t4r rits2 ritt3a rit2tau rit4ter4f rit4to rit2t3r ritt2so rit2u r3i4tum rix1 1rí 2rj 2rk rka2b3l r2k1ah r2k1ak rk1all rk2am rk1are rk1asp r2k1att r2k1äh r2kelem r3kell rke2n1 rken2er rken3s4t r2k1er2l rk3ersta r2k1er2w r3k2es r3ket rk1im rk4las rk4lau rk4lim r2klis rk2lo rk4lu rk4ne rk5neu rk5ney r2kob r3kol r3kon rk2op rk1o2ri r2kou rk2ö rk3räu r3kri rk3rin r2k3rom r2krou rk2sal rk2sei rk2sel rk2ser rk2so rk2sp rkstati4 rk2stec rk2stoc rk2ta rk2tel rk4t3eng rk4tent rk2t3erf rk2terg rk2t3erl rkt3ers rk4tersc rk2t3erw rk2t3erz rk4teta rkt2i rk2t3in rk4t1o2 rkto4b rk2t3r rk4tri rk2tum rk4tü rk1ums rku2n r3kup rkur3s rku2sa r2küb 2r1l rl2ab r3lag rlan2d3i r2l1ar r2l1a4sc r2l3aug rle2a r3lec r3leg r3lep rl2et r3lex r3l2i rlicht6e rli4ne. rli2s r3l2o rlou1 rl2ö rlös3s rls2a rl2spr rl3ste rl2s5to rl3t r3l2u rlus6tr r3ly rlz4w 2rm r2mab r2m1ad rma2la rm1ald rmali3e rm1ami r2m1ank rm1anz r4m3aph r2marc r2marz rma4spe rmas3se rmat2o rm3d2 rm1ef r2m3einh rme4na rm2ene r2ment r2meo rmer2fo rm1erg r2m1erh r2m1erl r2m1erp r2m1erw rm2es rme1st rmes4z rmeta2 r2mide rmi4nanz rminen2 rmi4neng r3minh r2m1ob rmon3s4 rm1o2ri rmo1s rm3p2 rm3sa rm3s2k rm3sta rm3t rmt2a rmu2n r4muna r2muni rmwa4 2rn rna2b rn3ab2i r3nad rn4ade r3nage r2n1all rna4n rn4and rn3ani r2nanz rna2r rn3are r4n3ari rn3arra r4n1a2st r4n3att rn3aug rnd2 rn3de rn3d4r r2nef r3neho r3nei rn2eid r4neif r4neis r2n1elf rn1ema r2nemu rne2n r2n1ene rn2eng r2n1e2p rn1erg rn2erhi rner2ke rner2ku r2n1erl r2n1ert r2n1erw r3nes r3n2e2t rnet1e rne4to rnet3r rn2eu rne3uf rn3f rn3g2 r2nid r2n1in r4ninf rn2ing r3nit rnk2 rnn2 rn1ob rn2obr r3nod rn2oh r2n1op r2n1or rno2w rn1ö rnö2d rn3sa rn3s2ä rnse4ha rn3s2p rns2u rn3s2z rn3t2a rn3t2e rn1ur r1nü r1ny rnz2 ro3ar ro3as r2oba 2robj 1r2obo ro2bo2r 2robr ro2bre 2robs ro1c roch2a 3rock. r2o3de rodi4e rod4r roe2 ro2ed ro4fen 2roff 4rog. ro3g2a 3rogg ro2h1in roh1l2 4rohn ro2hö 3rohr 1roi ro3in ro1ir ro2it rok2l ro3le ro2liv rol2lan rolle4 rol3len rolls4 r4olo rol3s 2roly 4rom. ro4mad ro4mal 3roman. 2romb ro4mei romen3e ro4m1er ro5mes 4romm 2romn rom3s 4romt r2on ro3n4ab ro2nan 3rond ro2nerb roni2e ro2nika ro4niki 4ronk 3ronn ron4tan ron2tel ron4tend ron4t3r ron2t1u ro1ny ro1o4f rop2a 2rope 2ropf 1ropl ro3pn 2ropt r1or ro2r3al ro2rat 2rorc ro2rel 2r3orga ro2ro ror3th rort2s ror2ü ro3se ro3sh ro3s2i ro5sin ros4ko ros4p ros6sac ros4sal ros4san ros2s1c ros4senk ros4st ro1sta ros4t1r ros6tri ro2sum 4r3osz roßen2 ro4ßenk ro4ßi ro2tan ro4tas ro4t3au ro2tä ro2tei rot3s rots2o rot2ta ro3tu 3roul ro3unt 3rout ro5win 2rox rö2b3l rö2du 2röf rö4fe 3röh 2r1ök 1röl 2röl. rö3le röl2l r1ölp 3römi r1ör r2ös. rös1c r2öse 1rösl 3rötu 2rp2 r3pa rper1e rperer3 rper3in r3pf2 rpf4l rp4fu r2pli rp4lu r3po rp4rä r3pri rpro1 r5prod r3prü rp3se rps3t rp3t r3pu 2rq 2r1r rr2ab rrat2s rr1auf rr1äm rrb2 rr1c r5rega r5regi r5regl rr2ei rre2le rre2pa rrer2 r2rerh r2rerl rre2ve r4rezi rr2hen rr2hos rri3erm rri3k2 rr4is rrm2 rr2n3au rr2o rr3obs rrr2 rr2st rr3sto rr3str rr3stu rr2th r3r2u r3r2ü rrücker4 rrz2 2r1s2 rs3ab r3sabo r2s3a2d rsa4lin r4s3amp r4s3amt rs3ana r2sanf rs3ang rs3anm rs3ant rs3anz rs3ar r3s4ark r3sau rs4au. rs4aue rs3äm rsch3e2b rscheiner5 r3schen r4scherl r3schu r2s3ebe rse2e r2s3ef r2s3ein rse2n rse4ne r2sepi rs3ere r2s3erh rs3erö rs3ers r2s3erz rse2t rs3eta rs3eth rsha4k r3shav rs3hi r3shir r3sho r4shu rs3inf rs3ins rs3k rs4kal rs4kan rs4kel rs4kie r4skir rs4kis rs4kla r4skn rs4kop r4skor r3s4kri r4sky rs3l r3s4mog r3sno r3so r4s3ob rs4om r4s3op r4sord r4s3orie r4s3ort. rso2s rs3ost r3span rs4pel r2s3ph r3sphä r3spi r3spl r2sput r3spü rs3s2 r4st. rst3abl r3stad rst3ala r2stale r2stans r2stant r2stas r3statu r3stä r3sted rst2ei rst3eing rst3eint rs4t3emi rs4temp r4sten rster2 rst2erb rst3erl r3stern rst3er4w rst1h r3s4tie r2stin rst3ing r3stink r2stip r2stit rs4tob rs4tor r2stot rs4tr r2stran rs5tren rs4tuc r3s4tü rs3uml rs3un rs4ung r3sy r4szä rs3zi rs4zin 2rt r2tabo rt1abs rta2ck r2t1a2d r2t3ae rt1aff rtag4s rt1akr r2t3albe rta3l2e r2t1all rtals1 rtal2se rt1am rt1ann rt1ant r2tanw r2t1ar rt3att r2taut rt3äh rt1änd rt1ärm r3tea rte1e2 r3teh rt1ein rt2eind r4t3einh rte2i3s4 r2telf rtels2t rtem4e r2temo rte2n1 rte4na rten3s4 r4t3ents rten3z rteo2 rt2ep rter2fa rt1erh rter2ha rt1erk r2t3er2la rter4mit r2t3ernä r2ter2ö rter4re rt1ers rt2ersp rt1erz rte3sk rt1he r2t1hi rt2hum r2t1id rti2en rtik2 r2t1ima r4t3inf rt2is rt2it rt3l rt3m r2t1ob rto3pf rt1orc r4torg r5tork r4trak rt3ram. rt3rams rt3rand rt3rati rt3rec rt3re1s r4t3ris rt3rol rt3roma r3trop r2trou rtrü2c rt3sc rt2s1eh rts2el rt3sex rts3ing rts1o rts2tie rt2su rt3t rtt4r rt1umb rt2u3na r2t1urt rtu4t r2t3ute r3tü r4tüb rt3w rty1 rt3z rtz2a rt4zb rtz4w 1ru ru1a ru4ale ru3a2r3 rube4 ruben3 rubens4 rub2i ruchter4 rucht3s2 ru2cka ru4ckerl ru2cku ru3de rude2a ru2dr ru2et 3ruf ru4f1a ruff4 ru4fo ruf2s rufs3p ruf2ter ru2g3r 3ruhm 2r1uhr 3ruin ru3ins ru1is 2rum ruma2 4r3umd 4rumf 4rumg ru2mi 4ruml r2ums. 4r3umsa 4rumsc 4rumw 4rumz 2r1una 2rund run4d1a runden3e run2d3er runder4n runder5t run2do ru3nei2 2r1unem run2en 4r1unf run2ga 2rungl run2gla 4r1u2ni r3unio ru4nis. run2kr 2r1unl 2runm 4runn 4runr r1unse 4r3unt 4runw 2rupd rupi3 ru5pre 2r1ur ru2ra ru2r1e r4us. rus4p rus2s3p rus4st ru2tab rute4 ru4tei ru4t1el ru2t1er ru4t1o4 ru2t3r ru2z3w 1rü 2rüb rü4bc rü4bs 4rübu rü1ch rü2ckel rück3sta rü2hel rüher2 rüh1l 4rümm rü4na rün3z 2rv rv2el rve4n1e r2ventz r3veo r3ver rve3s r3v2o 2rw rwe4gel r5weis rwelt2s r3werk r3wert r2wo. r3woh r3wort rwun3s 2r1x 1ry 2r1y2a ry2c rygi3 ry1la ry2le ry1os ry3sth rysti3 2rz rz2ans r2zar r2zat rz2än r3zeic rzell2 r3zene rz1eng r2z3ente r2zents rze2p rze2ra r2z1erd r2z1erf r2z1erg rz1erk r2z1erl rz3ersc r2z1erw r2z1ess r2z1id rz1int rzir3 r3z2of r2z3ot rz2tan rz3te rz2th rzu4g3l r3z4wec rz4wer r2zwir 1sa 3sa. 3s2aa 2s1ab sab2ä 4sabd sa2ben 3sabet sa2bit sa2bl 4sabm sa2br 4sabs 4s3a4bw 3sac 4sacc sa3chal 5sache sa2cho sach3t s2ack 2s1ada sa2der s1adm 2s1a2dr 3safa sa4fe 4s1aff sa3f4r 3s2aft saf4tr 3saga sag2e 5sa3ge. 5sagen. 2s3a2gent 2s1agg sa2gio s1a2gr sah3l s2ahs 3s2ai sa3i2k1 sail2 sai4r 2s1ak sa4ka sa5ka. sa5kar sak2e 3saki 3sako 4sakt sa4kus 3s2al. 3s2al2a sa2l3an sa3l4at sal2ä 3s2alb sal3bl 3s2ald sa2lerk 3sa3li sa4l1id s1all sal3la sal2le. 3s2al2o sal3or sal2se s1alt s2alth 3salz 3sam 4s3a4mat 4s1a4mei sa4min 4s1amma 4s1amn s1am3p4 4samph sam4ta sam4to samt3st s1an s2an. 2sa2na san4at sa2nä 2s3anb s2an2c 3s2and s4and. san2dan san2dri sand3s sa2ner 3sang. 2sanga 2s3anh 3sani 3sanken 4s3anl 2sa2no 2s3anp 2s3ans s4anse san4sk san3sp 2santei 4s3antr 2s3anw 2sanz 2s1ap sa2pe s2aph sapi3 sap3p 3sapr 2s1a2q 2s1ar 3s4ar. 3sara 4s3arb 3s2ard s2are 4s3area 3sarg sar2ga sa3rin sa2rom s2ars 4sarti sa4r1u4 3sas. sas2a s1asc s1a4si 2s1a4sp 4sa2sy sat2a satan4 sa2t3ant sat1ei 2s3a2tem s3ath 3sat2i 4s3atl 4satm sat2o sa4tol sa2tr sa3ts s3atta 4s1attr 3satza sat2zel sat2z3en s1au 3sau. 3sauc 3sau2e 2sauf 4s3aufb 3saug saug3le sau2gr 3saum 3saur 4s3aura sauri1 2saus 3saus. 4s3ausb 4s3ausf 4sausg sau2sp 4sauss 4s3ausw 2sauß s1av sa2ve sa2xi sa2y 1sä 3säb 3s2äc 3s2äg s1äh 4s3ähn 3säl 4s1ält 2s1äm 4s3änd 2s3äp 2säq 2s1är 3s2ärg 4s3ärm 3s2ät 3säul 4säuß 2sb2 s3ba sba4ne sbau4men s3bä s3be sber2e s3bi s3bl s3bo s3br sb4ra sb4ri s3bu s3bü sby3 1sc 2sc. 2scab 2scac 2scal 2scam 2scar 2scat 2s1ce 4s3cei 4sch. 3schaf s4chal sch3ana 4schanc 2schang 4schao 4schara sch3ar3m s2chä 2schäq 4schb 4schc 2schd sch2e 3sche. 4schech sche2f 4schef. 4schefi 4schefs s4chei 4sch3ei. sch4ein. s2chema 4schemp sch3erfü 2scherk sch3erla 3sches 4sches4s 4schex 2schf 2schg 2schh 2schi4d 2schiru 3schis 2schj 2schk s4chl sch4lac 2schle. 4schlein 2schmed 2schmö 2schmy s4chn 2schn. 2schneb 2schnum 3schop 2schorc 4schör 4schp 2schq 2schrad 2schre. 2schres 2schrin 4s3chris sch3rom 2schron 2schrou 2schrus 4schs sch3s2e sch3s2k schs2o sch3s4ti 4sch3t scht2a scht2i s4chu 2schunt s4chü 2schv s4chw sch4web 2schweg 4schwerk 2schwet 2schwid 2schz 2scj 2s3cl 2s3co 4scoa 4scom 3s4co4p s2cor 2scs 2scu 2scy 2sd2 s3da sda5me s4daq sdä1 s3de sde1s2 s3di sdie3n2e sdi1st s3do s3dr s3du 1se sea2n se3at. seb2 3sebä 2s1e2ben 2s1echo sech2st 2s1echt 2s1e2ck se2dik 3see see1i2 se2e3ig se2el se3elem see3len se3en. see3n2e se1eng se1enk se1enl se1enp see1ra seer4e se1erf se3e2r1i se1erk se2e3s4 2s1eff sef4l 3s2eg 4s3e2gal se2gl seg4r seh1a se2ha2g se2hak se2hel seher2e se2herk se2h1in seh3l se4h3ö seh3ra seh3re seh5ri seh1s se4ht seh1ur se2hüb 2s1ei. 2s1eid. sei3da 2s3eifer 2s1eig s2eim s1ein 3s4ein. 2seinb sein2du 2sei3n2e seine3i 2seinfl sein4fo 2seing 2seinh 2seini 2seink 2seinl 2seinn sein4ne 2s3einr s2eins. 2seinsc sein4stit sein4str 2seint sein4to 4seintr 2seinw 2seinz 2s1eis 3s2eism 3s2eit seit2s 3sek 4s1e2kel 4sekz s2el. se2l1a 3s2elb sel3d4 sel1ec se2lef 2s3e2leg 2s3elem se2ler sel3ers 2self. selin2s s3e2lit 2s1elix sel3m s2eln se2lob s2els sel3sz selt2e sem2e 2s1e2mis 2s3emp s4en. 3sena se4na2d se3nal sen2alg se4nas sen3au se2nä s2enb 4s1endl sen3d4r s1endw senen1 4senerg s2enf 3s4eni se2nid se2n1im 3s2enk sen4keli se2no se4nott se4noz s2ensa sen2s3e2h 4sensem sen4sers s4ensi sen2si2d s2enso senst2 sen4s5turm sen3t2a sen3tä 2sentd 4s3entf 2sentg 4sentla 2sentn s2ento sen3tr 4s1ents 2sentw 4sentwu 4sentwü 4sentz se4n3u2 sen3za sen2zer sen3zw seo2r 3sepa se2pen s1epi 3seq 3s4er. se2r3a2d ser3al se3rand se1ras ser3äus serb2 s3erbe. serd2 se2r1e2b se2r1ed se3reie 4sereign ser3eim sere2m 5seren se2r3enk ser3ent s4erfe s1erfo s2erfr s1erfü serg2 ser3ga ser3gl s2ergr 2s1erhö se2rid 5serie se4rinf serk4 se4rm ser4mah 2s3ermit s2ern. s3erneu 2s3ernt sero4b 2s1e2ros s1erot s1erö 2seröf ser3r s4ers. 2sersa 2s3erseh s3erset sers4p se3rum ser2um. se3rund se3rung s3e2rup 3s4er3v s1erz 3s2es. se3s2a se2sel se3sk 2s1essa se1sta se3stec se3stei se3stemp se1sto se1stu se3su 4s3e4tap se2tat 2s1e2th set2i 4s1e2tik se3tun 3setz 3seuc 2s1eul seum4sc se1u2n se2va 4s3evan s1ex 3sex. 2sexa sex4am se2xe sex3en s2exi s2exo 4s3exp sex3t4r 3sexu 2sexz 1sé 2sf2 s3fa sf4ak s3fe s3fi s3fl sf4la sf4lö s3fo s3fö s3fr sf4ru sf4rü s3fu s3fü 2sg2 s3ga sgang4 s3gä s3ge sgeha2 sge2h3ab sge3sa s3gi s3gl s4gl. s3gm sg4mü sg4na s3gö s3gr s3gu s3gü 2s1h sh2a 3sha. s3halb shal2li shalt2 4shan s3hau s3hä s3h2e sh2i 3s4hi. s2hip shi4r sh3n 4s3hoc 4s3hof s3hoh s3hol 4shom 3sho2p sho4re 3s4how s3hö sh2r2 sh4re s3hu 1si si3ach. 2siat 3si1c si2cha 2s1idea 2sidee 2s1ideo si3der s2i3do 2sidy 3s2ie sieben3s4 sie2bu siege2s sien3 si3ene si3f sif4l 3sig si2g1a2 si2g1ei sig4n si2g3r sig4st si2k1ab si2k1a2g si2kak si2kar si2k1ä si2k1el si2kens si2k3er4b sik3erl s4i2k3i si2k3n si2k3r sik3s sik3t2 si2ku 3silb sil2br sil2e 3sili s1ill 3silo 2s1imm 2s3impf sim4st 3s4imu si3n4a 2s1ind si3n2e 2s1inf 4sinfe sing1a sin3g4le sin2g3r sing3s2 2s3inh s1in1i sini1e s2ink sinner2 2s1inno 4s1inq 2s1ins 4sinso 4sinst 2s1int 4s3inv sion4 s2ire sirn4 2sirr 3siru si2sa si4sam s2isc si2schu si2s1e2 si2si s1i2so sis1or si2s3p sis3s4 3s4ist si2su 3s2it si2tal si2tau si2tra sit2u sit4zerg si2va sive3 siver2 si2v3erf si2vin siv1o4 si2vor siz2 1sí 2sj s3ja s3je s3ju 2sk2 s3ka. 4skab sk4al 4skalk s3kalt 4skam 4skana 4skanä 3skanda skani3e 4skann s3kanz 4skap 4s3kar 4s3kas sk4at ska4te. 4skateg s6kater ska4tes ska4to 4skau s3kä ske2li 4ske2n1 3skep 4sker s3kh 3s4ki. s4kia 3s4kif s4kig 3s2kik s3kim s4kip ski1s s2kis. 3skiz 4s5klas sklat3 3s2klav sk4le 4sklu s3kn sk4na sk4ne 4skoh 4skol 4skom 4s3kon 3skop. sko2pr 4skos 4skow s3kö 4s3kra s3k4re 3skrip 4s3kro sk3t2 skto2 3skulp 4skun sku2s1 s3kü 2s1l2 s3lab 3slal sl4am sla4ma sla2ve s2law s3lä sl3b s3le sler3s s3li 3s4lip slo3be s3loc s4loga 3s2low s3lö s3ly 2sm2 s3ma sma3b4 sma3sc s3mä s3me s4me. sme3na s3mi smi2t3 s3mo s3mu s3mü 2s1n2 s3na snab4 s3ne s3ni sni4a sni3er. sni3ers 4s3not s3nö 1so 3so. 2s3oas 2s1o2b 3s2o3ba 4sobj 4soboe so1c so3ck sodi4 so2do so3et 2s1ofe so4fen s3offi 3soft 3sog sog4l s1o2he 3sohl sohle2 2s3ohng 2s1ohr 3soi so3id 2s1ok 3sol. so3la so4lau 3sold 3sole so2l1ei so3li sol2la sol2ler 3solm so3l2o so3lu 4s3oly 2s3omb 3somm 3s2on son2a son3au sond2 sone4 sonen2d son4gl son3sä son2s1o so3o so2pe s1opf 3sopr sop3s 2s3ord sore2 so2rel 4s3orga so1rh 2s1o2rie so2ro 3sorp 3s2orti so4ru 3s2os 4s3o4sk 4s3osm 4so1st 4s3osz 3soß 2sot so3t2h 3sott soun2 sound1 so3unds so3unt 2s1out 3sow 2s1o2x 2s1oze 1sö sö2c 2s1ö2d 2söf sö4fe 2s1ök 2s1öl 2s1ös 1sp2 2sp. s3pa. 4spaa 2s3pack 2spag 2spak 2spala 2spalä s2pali 3s4palt spa4m s2pan 3spann 2spanz 2spap 2s3para s2parka 2sparo 5s4parten 2spartn 2sparty 3s4paß 3spat. 2spati 4spatr s2patz 2spau 3s2paz s2pä 2späd 3späh 2s3pär 2späs s2pe 2s3pe. 2speg 4spein s4pek 2spensi spe3p4 3s4perg s3peri 2sperle s3pern s4perr 2spers 2sperü 4spet s4pex 3s4pez 2s3pf spf4l 2spha s2phä 3sphär s3phe s4phin s2pi 3s4pie 4s5pier spier4r spi2k 4spil s4pinn 3spio 4spi4p 4s3pis 2spl 4spla 4sp4lä 4sple 3s4pli 4s3p4lu s3pn 2spod 4spoe 2spog s2poi 4s3pok 4spol s2pons 4spoo 2spop s2pore 3s4porn spor4tag 4s3pos 4spote s2pö 4spr. s2pra 3sprac 2sprak s4pran 2sprax sp4rä 2spräm s4prän 4spräs 3sprec 4spred 3s4pren 2s3pres s2pri s4pric 3spring 2sprinz 3sprit 2sprob 2sprod 2sprog 4sproj 4sprop 3spross 2sprot 2sproz 3s4prö 3spru 3sprüc 2sprüf 3sprün 2s3ps s4ps. 2sp3t 2spub 2spud 3spuk 3s4pule 2spun 2spup 3s4pur spu2rer s4putt 2s3py 2sq s3qu 2s1r2 s3ra sr4at srat2s srat4sc s3re sre3cha s3rh s3ri s3ro sro2h srö2s s3ru s3rü srücker4 2s1s ss3abi ssa3bo s5sack ss2agi ss1aj s3sal ss3alba s4sall s4samt s2sanf s4sang ss2ann s4sano s4sans ss2ant s4sanz ss2ara ss2arg ssa1s2 s2s3att ssau4r ssau5ri s3s2ä s4sce ssch2 sschanker6 s3schw s4scl s4sco s2scr sse3a ss1ec sse1ec s3seh sseh2a s2sein ss2eind sse3int s2selek sse2lö s3sen ssen4kel ssen4sem ss1epe sser3att sser2fo ss4ergr sser2hö sser4mit sser2öf s3s4eru sser4wei sser2ze sses2sa s2s3estr s3set sse3ta s3si ss3i2ko s4sill s4simp s4sind s4sinf s4sint s4s1isr s3skala ss3l ssmut4 sso4f ss1off ssoi4 s3sol s4sop ss3ost ss2p ss4pat ss4pec ss4pin s3s4prä s3spri s2spro ss4pü ssquet2 ss3s2 sssau4 sss4p sss4t s4st. sst2a s3stad ss3tak s3stä sst2e s3stel s3s2tep s3s2tern ss4teu sst2i ss2tie ss2t3in s3stop ss4tör s3stran ss4tras s3s4trat s3strec s3strom s3strö ss2tur s3stü ss4tw s2suf s2sumg s2sumr s3sü s3sy 2st. s2ta 2sta. 3s4t4aa 3stab. 2stabb 2stabel 1s4tabi 2stabit 2stabl 4stabt 2stabu st2ac 1stadt 2stafel 1staff 2stag 3s4tagl 3s4tagr 3s4tah s3tai 2stak 3staks 2stala sta3lak 2st1alb s3ta3l2i 2stalk st1alm st1alp st1alr st1alv st1a4mi 1stamm 1stan 2stanb s4tand 2stanf st2ang st3anges 2stanl s4tanm 4st1ann s4tano st3ansp 2stanw s4tap stapo1 stapos4 st1app s4tar. sta4rens 4stari s4tark s4tars st1asi sta4sie stast4 s3tat. s4tata 2statb 3stati s4tau. 2stauf s4taufs 3s4taur 2staus s4taut 2stauto s4t1a2ve 4stax 1s2tä 3s4täb 3s4täd 4stäg s4täm s4tänd 2stänz 4s4täp 3s4tär 3stätt 2s3täus 2stb 2st3c st4ck 2std 4ste. 4steam 4stechn ste2d st1edi 2stee 3s2teg ste2g3r 1steh s2tei st4ei. 4steic st1eid 3steig stei2gr 2steil stei4na 2steing s4teins 2steint s2tel 2stel. st1elb s3tele s3telf st2ell stel4l3än 2steln 2stels 2s3tem 4stem. ste2mar ste4ment 3stemm 2sten s5ten. ste4na s4t3ends s5t2ens s4tentf s4tents st1e2po 2ster 4s5ter. ste2r3a s4terben s3teren 3stereo s3teres st3erfü 3steril 4s3term 3s2ternb s2t3er2zo 4ste2s1 ste3sc stes2se stes3ta s4testn 2stet s4teta ste2tab ste4tag 3s4teti 3s4tett 3s2teu 1steue 4steuf st1eun st1ev s2tew 4stex s2texa 2stf stf6lan 2stg 2sth st2hen s2t1hi st3ho s4thö s2thu st1hy 2stia 2stib s2tic 1stich st1i2d sti2e 2stie. 2stief. 2stiefl 2stien 1s2tif 2stig sti2gel 3s4tigm 2s3tik sti2kr s2t2il sti2la 1s2tim 2stimma 2stimp st1inb 2s4tinf s3tinn s2tins 2s2tint 2stio 2stip. s4tipe 2stipp s2ti2r st1ira st1iri st1iro 4stis 2stite 1stitu 2stiv 2stj 2stk 2stl st3le 2stm 2stn s2to 2sto. sto2bl 2stocht 2stod 3stof s4toff 2stok 2stole s3tom 2s3ton 4stona 3s4to4ne 4stonl 4stoo s4tope 2stopo 4s5tor. s4torb 2s5tore 2storf 2s4torg 2stori 2storp 2stors 2stort s4tory sto3s2t 3s4toß 4stote 2stotr 4stou 2stow 2stoz 1s2tö 4stöch 2stöf 2s3töl 2stön 3stör 2stöt 2stp 2stq s2tr 2strac 4s3trad st4rade stra4fa 4s3trag 1strah 2strahi 4s5trai 4strak 2s5tral s3trank 4strans 1strap 3stras 3straß 2straum 4sträc 4s5träg 2sträne 2sträum 2stre. s4trea s4trec 4stref 2streg 4streib 3st4reif 2strep 2stret 4streuh s4treuu 2strez 2strib strie3s2 2s4trig 1s4trik 2s5tris 1stro s3troc 3s4troh stro4ma s4trome 2stropf 2stros st4ross 2ströp 1stru 2strua 2strub s4trud 2strug 3struk 2strun 4s5trup 2strut 1strü 2st3s2 st4sb sts4t 2st3t2 stt4r st2u 1stub 4stuch 3s4tud 2stue 3stuf st3uga 3s4tuh s2t3uk 4stumo stum2s s3tum4sc 2stun. st3una 5stund 2stune s2t3uni 4stunn 2stuns 2stunt stu3ra stu5re st3url 4sturn 2st3urt 3s2turz 2stus 1s2tut 1stüc 4stüch 3s4tück 3s4tüh 4stür. 4stüre 3stürz 1stüt 2stütc 2stv 2stw stwor2 2sty 4sty. 1s2tyl 4styp 4stys 2st3z2 stze3c 1su su1an 3su2b3 su4ba 4subi 3su1c su2cha su2chi su2cho suchs3p 3sud su2eb s1uf su4fe 2s1uh su1is su1it. su2k 3sul su3l2i sum1a su2man su2mar 3s2ume su2mei su2mel sument2 su4ments su2m1et 2s3umf su2m1id su2min 3s2umm sum1o2 su2mor s2ump s1ums s3umsa 2sumse 2s3umst su2n 3s4un. 2s1una sunder2 sun4d3erh 2s1unf 4sungena 2sungl sung4s 4s1uni 2sunm 2s1uns s4uns. s4unst 2sunt 2sunv 2sunw s4unwa 3sup 4supd sup3p4 su2ra sure4 su2rei su2rer 3surf 2s1urk su2r1o 2s1ursa s1urt su2s3 su3s2a s3u2t su4te su3tr 3suv suz2 1sü2 2s3üb sü4be 3süc süd1 sü4da süden2 3süf 3sün 3s2üs 3süß 2sv2 s3ve s3vi s3vl s3vo svoran2 2sw s3wa s3we swe4gers sweh2 s3wi 4swie 4swil 4swink s4wist 4swit s3wo s3wü 1s2y s3ya 2syl1 sy2lo sy2lu sym3 sy2n3 3synd sy4no 3sys sy4ste sy3sto 2sz2 s3za s3zä s4ze. 4s3zei 4szel 3s2zena s2zend 3s2ze3n2e 4s3zent 4s3zer s2zes s3zet 4s3zeu 3s2zew 4s3zie 4szim s3zo s3zs sz3t sz4ts s3zu s3zü 1ß 2ß1a2 ßa4si ß3at ß3au 2ß1ä 2ßb2 ßb4ri 2ß1c 2ßd2 2ß1e2b 2ß1ec ß1ef 2ß1e2g 2ß1ei 2ß1ek ße2la ße2le 2ßelek 4ß1emp ße4n3a2 4ßenerg ße2ni ß1enke ße2no ß2ente 4ßentl 4ßents 2ßentz ß1e2p ßer3b ßer2ei ßer2la ß1erse ßer3t ß1erw 4ß1er2z 4ß1es2s 2ß1estr ß1ex 2ßf ßf4ru 2ßg2 ßge2bl ß3gm 2ß1h ßi2g1a2 ßig4s ß3i2k ß1il ß1im ß1in 2ßj 2ßk2 ß3kh ßk4le ßk4ne 2ß1l ßler3s 2ßm ßmut4 2ß1n2 ß3ni 2ß1o2 ßo4fe ßos2 2ß1ö ßö4fe 2ßp2 ß3pf 2ßq 2ß1r2 ßrö2 ß3ru 2ß1s2 ß3sa ßsau4 ßsch2 ß3sk ßst2 ßs4to ßs4tü 2ßt ßt1in ß3tü 2ß1um ß1unf 2ßunt 2ßunv 2ß1ü ßü4be 2ßv 2ßw 2ßz2 ß3zs 1t 3ta. t2aa 3taan ta3ar 4tab. 3taba ta2b3an 2t1abb tab2bau 4tabd 3tabel 2taben 2tabf 2tabg 4tabh 2t3a2bit 2tabk 4tabla 4tablä 4tabm 2t3abn 2ta4br 4tabs t1abst 2t3abt 3tabu 4tabw 4tabz 2t1ac 4tachs 3tacu t1ada 2tadd ta2der tadi3 tadi5o4 t1adm t1a2dol t1a2dr ta3d2s 4tadt tad4tr ta2er 3taf. 3tafe 4tafet 4taff t1afg t1afr 3tag ta2ga ta2g1e2i 2t3a2gent tage2s 4t1agg ta3gl 4t1a2go tag4san tags3c tah2 tahls2t ta3i2k tai2l1 ta1ins tai4r ta1ir. ta1i2s 2t1a4ka 2t1akk 2t1akq ta4kro tak4t3erf tak4t1o2 2takz 3t2al. ta2la ta3lad ta3lag tal3au 3talbr tald4 3tal2en ta2l3end tal3eng ta2l3ens 3taler2 ta2ler3g ta2let tal2ga tali4ene tal2l3ac tall3ei tal2l1ö2 tall3s4 2t1alm. 3talo ta2lop ta2l1o2r 3t2als t1alta tal3th talt4r ta2lu 2tam 3tam. 3tame t1a4mer tamm1a tam2m3er t1ampl 3tams 4t1amt t1a2na tan3ab 4tanal ta4nat 2t1a2nä 2tanb 3tan2c tan3d2ar tan2d3r tand2st ta2nerf 4tanf 2t1ang t3angeh t3angel t2ango tan2gra 2tanh t2anho t4ani 3tanj 3tank tan2kl 4tankr 4tankü 4t3anl t1anm 2t1anna 3t2anne t1ano 2tanom 2tanp t1ans t2ans. 4tansi 2tanspr tan2tan t2ante. 2tantei 2tantr 2tanwa 2tanwä t2anz. t1anza 3tanzk t2anzp 3tanzr 2t1anzu 2tanzü tan2z3w tao2 ta3or t4ape ta2pes 2tapf ta2pl ta2poka t2appe ta2ra 2tarab 3tarabb 3tar5al 2taram t2aran ta3rant tar3ap ta3ras t2arau 2tarb 3tarba tar4beitn 3tarbek 3tarber 3tarbi 3tar3bl 2tarc 4tarchi 3t2ard ta2rel ta2r1er tar3g ta1r2h 3tari 2tark tark4l t2arl 2t1arm t2armä tar4nei ta2rom 4tarot 2tart 4tart. t2arta 4tarten t2arth t1arti 3t2artis tar4to tar2tr 4tarts 3tartu 3tartü ta2ru 2t1arz 3tarzu 3t2as. ta3s2a tasau1 3tasc t1asp 4taspe ta3spr 2t3assi 3tast tas4to t2asy 2t1as2z t4at. ta2tab ta2tan 3t4atb t4ate tat1ei t5a2tel ta2tem 3taten ta2t1er 2t3atl 2tatom 2ta2tr 3tatsa 2tatta 2tatti 4tatue tat3zw tau2b1a 3taubh tau2bl tau2b3r 4taubs tauchs4 tauch3sp 4taud 2t1auf 3taufe. 4taufk 4t3aufl tau3f4li 4taufm 4taufn t3au4f1o 4taufp tau3fr 4taufw 3taug 4t3auge t1auk 3taume 4t1ausb 3tausc tau4scha tau4schm tau4schr tau4schw 2tausd t2aus2e 4tausee 4t1ausf 4t3ausg t1ausk 4t1ausl 2tausr 4t3auss 2tausü 2tausw 4t3ausz 4tauu 3tav 4tava 3tax 4t1axt 3taz tä1c t2äf 3täg 4tägä 4tägy 2täh 4täll 2t1ält 2täm tä4mi t1ämt t1ängs 3tänz 2t1äp 2täq tä2reng tä2ru 2t1ärz tä2s t2ät 3tätigk 4tätt 2täug 2täuß 2täx 2tb2 t3ba tbauer2 t3be tber2e t3bh tblocken4 tb4ra tb4ri t3bs tby4t 2t1c t3cha t3che tchen3 tch2i tch3l t3chr t2ch1u tch3w t2ck t3cl t3co tcor2 t3cr tc4up 2td2 tdar2m1 tdä1 tdes2t t3do t3ds tdun2 3te. te2a2 te3ab tea3c te3ag 2teak te3al 3team 3te3an te3ar 3teba t4ebb 2t1e2ben t2ech 2techd 2techk 2techm 3techn 2techt te2chu 2teck te3cker te2cki 2t1ecu te2dit 3tee tee3id te1em teen1 te2er. te1erw te2es 3tefa 2teff 2t1egg 2teh 3teha te2hac 3tehä 3tehi te2him 3tehö t1ehr te3hu 3tei. 3teic tei3fl 2teign teik4 3t2eil tei4lent tei3m2 2tein teinen4 tei4nens t3einkü 2t1eis. t1eisb te3isch. t1eiw tei3z4 te2kel tekt4 3tel. 3te2la tel3ab tel1ac te3lan te4lant tel1au te2lä telb4 3telbr 3tel3d4 tel1ec tel3ehr 2telem tel3eng te2ler tele3s te2leu 4t3elf. 3telg 3telh tel1in t1e2lit 3telk tel3le tel4lein tel3li 4tellu 3teln te2lob te3lom te2lost te2l1ö 3telp 3tels tel3s2k 3telt4 tel3ta 3telw t2ema te2man te2m1ap tem3art te2mau 2tem2bo te2m1ei te2m1er te2mi tem3i2m tem3ing te3misc 4temm 3temod te2m1o2r te4mp 5temper 4tempf tem3s te2mu te4mun 3ten t4en. ten1a te4na2d tena2g te4n3an ten3ar te4nas te4nat ten3au te2n3ä ten3da 4t3endal tend2an 4tendap 4t5endf t4endi 4t1endl t4endo 4t5endp t4en3d4r te2n1e2b te2nef te2neh ten3ei te3n4ei. tenei2d tene4m tenen1 te4n3end te4nene te4neng te4nens 4t3energ te2n3ern 4tenerp 4t1eng. teng2a 2ten2gag te2ni te4nil ten1im te4nin tenk4 ten3n2 4tenog te2nol te2nos te3nö 6t3ensem tens2p tens3th t1entb 4tentd 4t3entl 4t3entn t1ents 4t5entw 4tentz t2enz ten2z3er teo4f 2tep. t1epi te2pil 3tepr tept2 3t4er. t4era tera2b ter3a2c te2rad te1ral te2r3alg te3ran. te3ranb te3rane te2r3ap tera4s 2t1erbs 2t1erbt 3terc 2t3erde. ter3d2s 3tere. te2r1e2b te2rec 2t3ereig ter3ein te5rek te2rel ter3ell 3tere2m te2rema te2r3end te2rene te2reng te2r3ent teren3th 2tereo 3terer terer3k terer4ku terer3l te2r3erp te2rers te2rerw 3t4erfr terg2 ter3ga t4ergem t4erges t4ergew ter4gieb ter3gl 4tergrei ter2gri t4ergru te4rh t4erhall t2erhan t4erhau t2erhäu t2erhei 5t2erhi 5t2erho t2erhu te3ria te2rid ter3iko 2teril teri4o te2rit ter3i4ta 3terkla t4erlä ter3lei t4erli ter2lös ter2mer t2ern. ter2nar 2t4ernc t4ero te1rob ter2obe t1e2r1ö ter3r2 t4erra ter4re. t4erro t4ers. t2erse t4erst. 5t4erstad t4erstä t6ersted ter5sterb t4er3sti ter3sto ter3str t4erstu t4erstü ter4sw tert2 ter3ta ter4trä t4eru4 te4r1uf te3rung t4erü t4erv 2t3erwäh ter3z2a 2t1erzb 3t4erzei ter3zw 3tes t2es. tesa4k tes2c tes2ka te2s3pr 2t1essa tes3tan tes3tät tes4tel tester2 tes4terg tes4t3erh tes4terk 2testn t3est3ri te2su 3tet2 t1eta te2tabl 4te2tap 2te2tat teten3 4t1e2th te3tho te2tik 4tetl tet3ti teuer5b teuer3r 3t4euf teu4fa 3teum 3te1u2n 4teunu 2t3eup 3teur. teu2rob te2va te2vi tewa2s 3tewo 2texam 2t1e2xe te3xel 2t1e2xi 2texp tex4ta 2t1exz tè2 tê4te 2tf2 t3fj tf4la tf4lö tf4rö tf4rü 2tg2 tga2s3er tga2su tge4nen3 tger2a tger2i tg4ra 2th. 2t1h2a 3tha. 3t2hag 4thak 3thal. 3thalh t4hali t2hals 4tham t2han. t3hand 4t3hap 4t3hau 2t1hä 3thäi 4thäl 2thb th2e 3t4hea 2t1heb 4t1hef 2t1hei the1in 4theit t2hek 2thel 3thema 2themd t1hemi 2themm t1henn 3theo t1herd 3therm thero1 2t1herr 2t1herz 4t1hess t2heu 2thf th2i 3thi. thic3k4 thi3er. 2t1hil 2t1him 2t1hin thi3nu 2t1hir 2thk 2th3l 2th3m thmu2 2th3n2 2t1hob t1hoc tho3chr t1hof 2t1hoh t2hol. t2holo t1hols t1holt 2tholz t2hom t2hon 4thops tho3ra tho1s 2t1hose t1hot 4thote 2thou t1hov 2thö 2thp th2r2 th4ro 2ths 2tht2 t1hu 2thub 4t3hun 2t1hü 2thv ti3ac ti1ag 4t3iago ti3alo ti1a4m ti2ä 3tib 3ticc ti1ce 3ticket t2id. ti3de. 2tidee ti2d3en2d ti3dy 3tief. 3tiefe. 2tiefel 3tiefen 3tiefl tie2fr 2tieg4 2tieh ti2e1i ti1el tiel3a tie4n1 ti3ene tien3s 3tier tie2rei tie2reu tie3s4t 2tieß ti1eu 3tif. ti3fe ti3f4r tifter4k 3tig ti2gerz ti2git tih2 3tij ti2kam ti2kar tiken2 ti2kent ti3k4ere ti3kerl ti2kin ti4klu ti2kn ti2kop tik1r ti2kra ti2krä ti2krei ti4kro ti2lar til3d ti2lei ti2lel 3tilg 2tillu ti2lö tilt4 ti2ma2g tim2man t3immat timmer2 tim4merg 3timo 2timp tim2s 3tin. t4ina ti3naf ti3nak ti2n3an t1ind ti3n2e tine1i ti5nen 2t1inf 3ting. tin2ga tin3gen tin2gi ting3l ting3s tings4p 2t1inh 3tinis t1init t1inka tin2k1l tin2kn t1inku t2inn ti2nor t1ins 3tins. t2insä 4t3inse tin2spa tin2sum t1int 3tinte. 2t3inter ti3nu tin2um 4t1inv 3tio tioxi3 3tip 2tipe ti3p4l ti2que. 3tirad ti1r2h ti4ron 3t2isc ti4schei ti2schr tisch3w ti2sei tis2el ti3sk 2t1isl t1iso ti2sp t1isr tiss4 ti3s2th tis3ti ti1s4tr ti2s1u t1it2a ti2tal 3tite ti3th 3t2iti 2ti3tu 3tiu tium4s tiu4s 3tiv ti2van ti2vel tiver2 ti2verh ti2verk ti2verl ti2v1o ti4v3r ti2za ti2zir 2tj 2tk2 tklat3 tk4ne t3kr 2t1l2 tlan2g t2lef tlei2bl tlei4der tl4er tle2ra t3li tlings5 tli3sc tlit1 t3lo tlung4 2tm2 tmal2 tm4am tma2st tmen4schl tmen4t5 tmen6tr t3mo tmo4des t3mö 2t1n2 t3na tn4an t3ne tnes2 t3ni 3to. to3ar to3at t2oba 2to4bj tob2l t1obs 3tobt to1c t3ochs 3tocht to2cka to4ckent 3tod tod1er2 to4dun toe2 tof4fa tof4f3ent tof2f3er 2toffi toff3s 3tog 2t3ohr 3toi 4toi. toi4r 4toiz 3toj 3tok tok4l 3to3le tomar2b to4mene 3tomi 4tomn to4m1u to5mus to2nan ton3au tond2 to2n2eh toner4ke to4nid to2nob 2tony 3too 3top. to4pad to4pak to3pas to2pat top1hi to2ple 3topo 2to4pt 3tor t4or. tora2g to4rän 4torc t1ord t2ordi 4t3ordn t4ore to2rel to2rem to4renna tor2fan t1or3g 4torga t3orient torin2s tor3int to2rö t4o4rs 4t1ort. tor3t2a 4t1orth 4tortn 4tort2s to4ru to5rus to3rü to4rüb to3sc to3s2e to3s2h to4ska to3s2p 4toss 3to1st 4t1osz to4ßi to3ßu to2tä 3tote to5tem to2tho 3totr tot3s2 3t2ou touil2 to3un 3tow 3to1x 3toz 3töch 4töck 2t1ö2d 2töf tö4fe 2t1ö2k 2töl. 3tön t2ör törs4 t1öst 3töt 2tp2 t3pf tpf4l tpi2n t3pl tp4lu tp4rä t3ps 2tq t2r2 2tr. 3tra. t4rab 3trac tra3cha tra3chl 2t3rad. 2trade tra2dem 4t3radie tra4fah tra4far t4rag 3trahi 4trahl 2trahm 3t4rai 3trak 4t3rake t4rakt 3tr4al tral3l tra5me 3t4ran. 4trand 4trang t3rann 5t4rans tra3po tra2st 4traß 2traub. t4raue t4rauf 2traup 3träc 2träd 3t4räg 3träne 4träng 2träuc 4tre. 2trea t3reak 2treb tre2b3r 2trec t3rech t4reck 5treck. tre3cke 2t3red 3tref 4trefe 5treff 4trefl 4trefo 4treg t3reh t4rei. 3t4reib 4treic 4treif 2t3reig 2t3reih 2t3reim 4t3rein 2t3reis tre5isch. 4treit t3reiz 2trek 4t3rel t4rem t4ren. 3trend 4trendi 3trennu t3rent t3repa 2trepe 2t3repo 3trepp t3repr t4rer 5t4res. t3rese tre2ta t4rete tret3r tre2tri 2t3rett t4reu 3treuh 4t3rev t4rex 4trez 3tré 2t3rh 3tri t4rib 4tric t4rick t4rid2 5trieb trie3fr tri2en tri4ena tri3ent tri2er tri4ers trie1s 4trig. 5trigg tri3gl t4rik tri2ke. tri2kes 5triko 4t3rind 4tring tri3ni 4t3rinn 4tript tr4is tri2x trizi1 3tro. tro3b4 2trock. 3troe 3trog tro2kes trol2la tr4om tro4men 4tromk 4troms 3tron tro3na t4rop tro3pe 3tropf tro3sm 3trost t1rot. 2trout 3t4roy 4t3röc 2tröh 4tröm 3tröp 3trös 4t3röss 3tröt 3trua 3trub 2t3ruc 4truf t4rug 4truk trum4 t3rumä trums5 t3rund 3trunk 3t4rup t3russ 2trut1 tru2th 4truw trü3be trü3bu 2t3rüc trücker4 t4rüg 3trümm 3try1 2ts ts3a2b t4sachs t2s1a2d ts1ahn t3s2akk t2sall t2salt t4samp t4s1amt t2san ts3ane tsa2p tsa2r ts3are ts3ari t2s1a2s tsas3t t3satz t2sau tsau1c ts2av t2säh ts1än ts1äus t4schart t4schef tsch2li t4schro t3schü ts4cor t2s1e2b tse2e t2sef tse2he. t2s1eic t3seil t3seme ts1eng t3s2ens t2s1ent t2s1ep t2s1er tser2u t4s3essen tse2t ts1eta t2s1eti t2s1ev t2sex t3sexi t2s1i2d t2s3i2k t2sim tsing4 t2sini ts1ir t3s2kal ts2kele tski2 t4sko tso2 ts1off t2s1op ts1orc t2s1ori ts3ort. t3soz t2sö t2spac t2spal ts2pare t2spat t2spä t3sped t3spei t3spek t2sph t3spi t4s3pic t4spins ts3ple t2spo t3s2pon t3s2por t2sprei t2spro t4sps ts2pul ts3s2 tsser2 tss4t t1st2 t2stabe t2staf t4stag ts3tak t2stale t4s3tanz t4stas t2stat. t2s3täti t2stea t3stein t4stele ts2terb t3s2tern t3s2tero t4sth ts5the t3stif t3stim t4stit t2stoch t4stoi t4ston tst4r t3strec t4stren ts3treu t3stric t4strie t4strun ts2t4u t5stub ts4tüm t4sty ts1u t2su. 5tsubi t2sumg t2sums t2sumv t2sumz t2s3un tswa2s t3sy t4sza 2tt tt1ab tt2ac tt3achs tt1ad tt2ag tta4g3ess t4t1ah tta4ke tt2al t4tan4a ttank3l t2tanm tt2ant t2t1ap t4tapp tt1art tt3atr tt1äh tt1ebe tt1eif tt1ein t2t1eis tte4l1a2 tte2l3e2b tte2len tt2eli tte2lin ttel1o ttels2t ttel3ste t2temu tte4na tten4sem t4tentb tten3te t4tentf t4tents tten3z t2teo tte4r3ar tt4ere tt3erfo tteri2e tte4rik tte2ro tt2erö tt4es1 tte4s3a2 tte4s3ä2 tte2so ttest4r tt2häu tthä3us tt1hi t2t1ho t2ti4d t4t3igi t2tins tt2int t2tiso t3tit t4t3la t4tli tt5nan t4torg tt3rü ttschi4 tts1eh tt2sen tt2spe tt2spr tt2s3tät tt2sum tt3sz tt3t2 tt5tri tt1u4f t3tü1 t4tüb tt3z2 ttz4w 3tua tu4ale tu1alm tu1alv tu3ant 2tub2 tuba3b 3tuc tu2chi tu1cho 2tud tudie4n3 3tue tu2ere 2tuf tuf2e tu5fen t3u4fer 3tuff tu2gan 2tuh tuh4ler tu1ist tu2kr tul2i 3tum. tum2b5l 3tume 4t3umf 2t3umg 2t1umh 2t3umk 2tuml 3t2umo 2t3umr 2t3umsat 2t1umsc tum2si tum2so tum4s5tr 2t3umt 2t1umw 2t3umz 3tun. 2t1una 2t1und tund2e tun2en 2t3unf 3tung. t3unga tung4s5 tun2i 2tunif 2tu2nio 2tuniv 2tunm 3tunn t1u2no 2t3unr t3uns 3tuns. 4t3unt 2tunv 2t1up. t1upg tu2r1a2g tu2r1an turan4l tu2ras tu2rau tu2rä tur1c tu2r1e2b tu2rei tur3eis tu2rene tu2r1er tu4res tu2re4t tu2r3e2v turf4 tur3g2 tu2rid tur1in tur4mun 3turn tu2r3o tur3s tur5sa tu2ru 3tus tu2sa tu2schl tu2s1e tu2so tut2a tuto3 2tü tü3ber. 3tüch tück2s 3tüf 3tüm 3tür. tür1c 3türe 3türg 3tür3s 3türw 4türz 3tütc 3tüte 4tütz 2tv2 t3vo t4vo. tvoran2 2tw t3wa2 twegs2 t2wist tw4ri 2t1ya 3typ ty2p1a ty4ps ty1s2 2tz t2za2 tz1ag tz1ap tz3ar tz1au t2z1ä t3zäh t2z1e2c t2z1e2d tz1ehr t2z1eie t2z1eig t4z1eis tzei4tend tze2m tz1emi tze4n1 tz2ene tzen3s4t tzen3ta t2zentg t2zentl t2zents tze2reb tzer4gre t2z1er2m tz1erw tz2er3z tz3erzi tze2s3 tz1e2t t2z1i2d tzi4m tz1imi tz1int tz1inv t2z3om t2zop tz2th tz4tin tzu2gu tz1unf t2zuni tzwan2d3 tz3wä tz3wi t3zwie tz3wu 2ua u3a2b u3a2c ua2dan uad4r u1a2g u1ah ua4ka u1al. u1a2l1a u1a2l1ä u1alb u1ald u3aleb u3a2lent u3aler2 ual3erk u3a2let u1alf u1alg u1alh u3a2lid u1aln ua2l1o2 u1alp u1alr u1als u1alt4 ual5tr ua2lu u1alw u1al3z4 u1am u1an. ua3n2a4 u1ans uant2 u3ar. uara2b u1ars uar2t3an ua3sa uasi1 ua2th uat2i uati4ons. uat2o u3au u1ay u1äm u1än uä2s u1äu 2ub u2barb ubb4l ube2be ube2e u2b1ehe u2b3eins u2b1e2m ube4n1a uben3o ub2er u2b3erde ubert4 u3b4es ub1eul ub4is u3b4it ub2l ub3läu ub3lic ub3lu ub4lut u2bob u2b1ok u2bop u2boz ub5rah u2b3rit ub4ro ub4rü ub2san ubsau4 ub4s3che ub2s1o ub2s3p ubst4 ub3t2h 2uc uc1c u4ch. uch1a u1cha. u2chan uch1ä u1che uch1ec u2ched uch1ei ucher3f u3ches u1chi uch3im uch1in uch3l uch3m uch3n uch1op u2ch3r uch2sel uch2so uch2sp uch4stem uch2tak uch3tan uch4t3erf uch4t3ert u1chu uch3ü uch3w u1ci uck3elf u2ckem u2ckent u2ck3i uck2sti u1cl uc4re 2ud u3d2a uda3d ud4at ud2e ude1e ude3i2 udein5 ude2n1 uden3e uden3s2 udert4 udi3en udiener4 udio3 uditi4 u3d2ob u2don udo1s ud3ra u3dru 2u1e ueb4l ue1ch ue2ck u2ed ueen4 u2eg u2eh ue2ke u2ela ue2lek ueli4 uel2lau uel4lent ue2mi uen1 u3en. ue4n3a2 ue2nä u3enb u3end uene2 ue2neb ue2ner uen2gag uenge2 uenge4m uengene3 uen2gl ue2ni uenk4 ue2no uen2zu u2ep ue2r3a2 ue2r1ä uerb2 uer4baut u3erbu uer3d2 uere2 ue2rec uer4ei. u3ereinn uerei3s2 uer3ela u3eremp u3e2r3ent ue3r2erb u3ererf ue2rer2g uerer2h uerer2k uerer4m ue2rers uerer4sa uer3esk ue2re4t u3erex uerg2 uer3ga uer2geb ue2ri2d ue2r1i4m uerin3s u3erin2t u3erl. u3ern uer4nan uer2nar uer2ne uern3s2t ue2r3o4 uer2ö uerrü2 uers4p uerst4 uer3stei u3ersti uer3t2 u3eruh u3erum u3erunf u3erunt u3erur uer2wec uer3z2 ue2ta ue2tek ue2tik uety2 u2ev ue2x1 u2f u3fa uf1ab ufa2ck ufall2 ufa2n uf3ane uf3a2r uf1aß ufa2t uf1au u3fä u4f1än uf1är uf1äs u4f1ä2ß u3fe u4f1ei ufel4s3a u4f1em 4ufen u4fent uf2ere u4ferf u4f1erh ufer4lau u4ferle u4ferne u4f1et u4fex 2uff uf3f2e uff4l uf2fro u3fi u4f1id u4fim u4f1ins uf3l u4fläs uf4lü uf5lüd uf5lüm u3fo u4fob u4fof u4fop ufo2r uf1ori u3fö uf3r u4fru uf3sä uf2spo uf2stab 2uft ufta2b uft1eb uft3erd uft3er2g uf5tri uft3s4 u3fu u4fum u3fü 2ug ug2abe u2gabte ug1a2d ug1ak u2gana u2ganb u2gani u2g1ans u2gant ug1ap u2g1ar uga4s ug1au ug3d2 u3ge. u2g1ec ug4eg ug1e2i u2geig ug2eil u2g3ein uge2lob ug1emi ugene2 ugen3s2 u2g1erf u2g1erk u2g1erl u2gerr u2gerv uges4 u3ges. u2g1esk ug2et ugge4st ug2gl ug4gt ug3hu u2g1i2d u2gim ug1in u2gins u2g1l u4glä u4gleitb u4gleitu u4glic u4glis ug3liz u4g3lo u4glu u2g3n ugo3 u2go4b ug3oc u3gon ugo4p u2g1o4r u2gö u2g3ram u2g3rä u2greg u2g3reis u2g3res u2g3rie ug3ro u2grou ug3rüs ug4spe ugs4por ug4spr ug4spu ugst2 ug3sta ug3stä ug3str ug3stu ug4stur ug3s4tü u2gum ugu3te u2gü u1h 2u3h2e uhe3a2 uhe1e2 uhe1s 2uhi 2uhl uh1la uh2lar uh1lä uh2l1ei uh2l3ent uhl3erb uh2li uhl2ö 2uhm uhme2 uh1or uhr1a uhrei2s uh2r3er3 2uh3ri uh4r1in uh4r3o uh2ru uh4rü uhs4t uh3t2 u2hu 2uhü uh3w 2ui ui2a ui1ch ui2che ui4cker u2idi ui2du u1ie ui1em u3ig u4ige uil2les u1im u3in. u3isch. u3ischs uis2e uisi4n uis3t uit3s uji3 uk2a uk1äh u3käu uk2e uke2n1 uk2l ukle1 uk4na uk4ne uk4nu u2k1ob uko4m1 ukom3a uk2ö uk4re uk2ta uk2t1el uk4tent uk2t1er uk2tin uk4t3o2ri uk4t3r uk2tum uk4tü uku2s uk2ü u1l ul1am ulan2e ul2ar ula2s ul1äm ulb4l ul4dan ul2dar ul2dr ul3dra uld2se 2ule u2l1el ul1emb ule4n1 ul1er2h ul1er2r ule2t ul1eta 2ul3f 2uli ul1id uli2k ulin1a ul1ins uli3p ul3ka ul2kn ull1au ul3len ul3l2i ul2lo ull3s2 ulm2e ulni2 ulo2i u2lop u2l1or ul2ö ulp1h ul2pha ul2sa ul4sam ul2s1ec ul2sei ul2ser uls2th ul2sum 4ult2a ul3tan ult3ar ul2tau ulter2m ul4tri ult3s u2lü ul2vr ul3z2e ulz4w 2uma. u2maa3 u2mab u2m1ad u2m1a4k u2m1all um1ang u2m1ant um1anz u2m1ap um1ar u2marc u2marm u2mart u2matl u2matm um1aus u2maut um4ay u2m1äh 1umd2 u2m1e2b u2m1e2ck u2m1ef u2m1ein ume2n1e um3engel u3mer. umer2a u2m1erf um1erg u3merk u2m1erl um1erw umes2t 1umf 4umfi 1umg um1ind um1inh um1ir umi2t um1ite 1umk 1uml 2umme um2mei um3mi um3n um1ob u3mol um3ot ump2fa ump2fin um5pit 1umr um4sam um4s3an 1umsat um4sd um2s1er 1umset um4sf um4sg um2sim um4sj um4sk um4sm um2s3pe 2umspf um4ss um2su um4sv um4sw um3t2 um4ts u2mum u2m1u2r 1umz un1 2un. 2una. 1unab un2a3br un2ag un2al u3n2am u2n3an u2nap u2narb 2un2a1s4 un3at un2är 4und. un2da unda2b un2dän 1undd 2unde un3de. underer4 und3erf und3erö underten4 under6tend und3erz un2dex 1undf 2undg un2did un2dim 1undn undo2b un2dop 4un2d3r und3s 4unds. 2undsc unds2p un2d1um undü4 1undv 1un4dz une2b une2d un2ei. un3eid un3ein un3eis un2emi une4n1 un2ens unen2t un2enz u3ner. un3erz. un2es4 unf2 un3fa un2gab un2gam ungar4 un2gat 1ungeh 3ungena unger2e 1unget 1ungew ung5ha 1ungl ung3lat un2glu un2go un2gr ung3ri un4gs3 ung4sa ungs5tr u3nic un2id un3ide 4unie 3u2nif uni3k4 un2im 1unio un2ir un3iro un3isl u3n2it 1u2niv 2unk un2k1a 4unke un3ker un2k1es un2ket un2kne un2ko4p un2kro unk3s2 unk4tit unk2tr unlö2 1unm unna2 un4n1ad unn2e2 unne4n u2nob uno4r un2os 1unr uns2 2uns. unsch3el un3se 1un3si un3sk un4ski un3s4p un4sr unsta2g unste2c uns4t1r 4unsy 4unsz 1unt un3ta un3te unte2ri 3unterr 4unti un3tr unt3s 2untu 3unty 2u2nu u3nuc unu4s u1nü 1unv unvol2 unvoll3 1unw 4unwä 3unwe u2ny 2unz un3z2a unz2e 2uo u1o2b u3of u1op u1or u3or. uo2r3a uor3c u3oret uo2ris u3ors uor5tr uos2 u1os. uote2 u1ox u1ö2d u1ök u2p u3pa u3pä 3upd u3pe2 uper1 uperer4 u3pé up2fa upfe2 u3p4fl u3p2fu u3ph u3pi up4id u3pl up4lu u3po 2upp up2pl u3pr upra3 up4t3a2 upten1 up4tene upt3erf upt3erg upt3erk upt3ers upti2m upt3in up4t1o up4tr u3pu u3py up4yb 2ur. u1ra u2rab u3raba ura2be u2r1aka u2r1akt u2ral2t u2r1am ura4na u3r2and uran4fän ur1ang uran2ge ur2anh ur2anr uran3s ur2anti ur1anz ur3ap u2r3ar ura4ri u3rasc ur1asp ura2str ur4ate u2r3att ur1au 2u1rä ur1äl ur1ä4m ur1än ur3b2a 2urc urch1 urch3s urcht3e urd2 ur3da ur3di ure1e ur1eff ur1ehr ur1eig u2rele ure2n ure4na u2ren2se u2rentn u2r1ep urer3h urer3k ur2ert u2rerw ur1eta ure3u 2urf urf3l ur2fli ur2fro urf2spr urf3t ur2gei ur4gense urg3inn urg1l ur2gla ur2gri urgros2 urg1s4 uri2c ur1ide uri3en u2r1ind urin2se urin4sek u2ri2so ur3ku ur3l ur4ls ur2m1ar ur2matt ur2m1au urm2ei ur2mern urme2t ur2mum ur2mun ur3n2e urn2o 2u1ro urob2l ur1off uroh2 uro1s4 2u1rö ur3p 2urr ur3re ur2rh 3ursac ur2san ur4s3au4 ur2s3er urs3int ur2spa urt2 2urta ur2tai urt3ein ur2tro urts2c 2urtu uruf4 uru3fl ur1umh ur1ums urü2 ur2z1a2 ur2zä ur2z1ec ur2zep ur2z1op urzt4 ur2z3w 2us us3a2b usa2gi usal3t u4s1amb u4samt u2sang us4ann usa2s3 us1ast u2säh u2s1äs u2schab u2schak u2schar u3schart u2schef usch3eic u4schen4e u3schi usch3mü usch3wer u3se. u3s2e3b u2s1ec use1e use2ei u2s1ei u3seid u2sen2se usen4te. u2sentl use2rec u2s1erl u2serp us1erw u2s1ese u2sex u3si. u2sid usi3er. usi3ers. u3sik usi2kat us1inn u4ske us3kl u4sko u4skö u4sku us3oc us1oh u3sol u2sop us1orc us1ou u3sov u2spac us2par us3part u2spas us3pe u3s4pec u3spek u2sph us3pic u3spit u3s4piz u2spo us2por u2spu usrich5 us2s1ad us2s1eb usse4g usse4n us2sep uss3erf us2sesp us2sez us2sof us2sum us4sw us5taa u1stad u1stal us3tau us4tein u1stel ust3erl us3tin us3tr us4tras u2suf u2s1umb u2sumd u2sumg u2sumz 3usus u2sü 2uß u2ß1u 2ut u3taf u2t1alt u4t1a4m ut2ans u2t1ap ut1ar uta4s u2taut ut1äh u2t1är ut3c ut1e2d u3teh ut1ei. ut1eie ut1ein u3tek ut1ela u3tem ute2n1 uten2a u2tent u4tentf ute2ra4 ute3ras ute4ring uter3k ute2ros ut2es ut2et ut2ev u2t1ex utfi2 ut3hal ut3hei ut1hel u2t1hi u2t1ho u2thu u2t1id u4tigel uti2vi utli4n uto3c uto3p u2tops utor2a u4tord uto2re uto2rin uto3s4 4utou u2töl ut3rea u2trou ut3rü utsau2 ut2säu ut2scha ut3sche ut2schl ut2schm ut2scho ut2schö ut3ser u4t3sk uts2p ut3sta utt4er ut3t2l utts2 utu4b u2tum utu2n u2t1une utu4re utu3ro utu3ru u3tü utz3a ut2zeh utz3eng utz2er utz4erg ut2zet ut2z1in ut2zis ut2zö ut2z3w 2u1u2 uu4fe uum1 uu4ma4 uume2 u1ü uü4be uv2 u2ve. uve3rä uv4re 2u1x ux2e ux2o ux3oe ux3t2 u1ya 2uz uze2 u2z1ec u2z1ene uz2er uzo4f uz3ot uz3we uz3z2 uz4zb 1ü2b üb1ä 2übc 2übd üb2e2 übe3c übe3le ü3bem ü3ben übe4na übe3ne über1 ü3bes ü3bi üb3l üb3r üb5rig üb2s3t 2üc ü1che üch3l üch2s1c ücht4e ü3cke4n1 ück1er ück3eri ücker4ke ücker2l ü2ckers ü2ckin ü2ckum üd3a2 üda4m üda4s üde2c üde2l ü3den. üden2g ü3d2ens üdf6lan üd1o2 üdo4s4 ü2d3r üd3s2 üdsa1c üdsau2 üd3t2 üdu2 üe2 üeb3 ü1ei 2üf ü2f1a ü2f1ä ü2f1ei ü2fent üfer2 ü2f1erg üf2fl ü2f1i ü2f3l ü2fo ü2fum üg2e üge2l1a2 üge2lä üge4lec üge4lei4s üge2lo ügen3s ü2g3l ü2gn üg3s2 üg4s3t üh3a2 ü1he ü2h1ei ü2h3e2m ü3hem. ü2h1eng ü2h1ent ü2h1erf ü2h1er2k ü2h1er2z ü2hex üh1i2 ühi4r ühla2 ühl1au üh1lä üh2lel ühlen1 üh2lene ühl2er üh2lö ühl2se ühl4sk ühl2sta ühl2sti üh3mo üh3ne ühn2s üh1o üho4f üh3r2e ühr3ei. ühre2n1 ühren3s4 üh1ro ühr3ta üh1s ühs4p üh3t üht2a üht4r ü1hu üh3w ük2 ül1a ül2c ü3l2e ü4l3ef ül3eim üle2r3a2 ül2l1a2 ül2l1ei üll2erg üller2z ül2lid ül2lo ül2lö ülls2 ü2lö ü1lu ü2m ü3me ü4ment ü4m1e2p üme2ra ü3mi ü4m1id ü4m1in üm1u 2ün ü2n3a2 ün2da ün3di ün2dr ünd3s ü2n1erd ünf1 ünf3li ün2g3l ün2s ün3sc ün4sd ün3se ün3sp ün3sta ünste2r3 ün3str ün2za ün2z1i ünzu2 ün2zun ün2zw ü2p ü3pe üpf3l ü3pi ü3pl üp2pl ü3pu 2ür ür1a ü2r1ei ü2r1e2l ür2f1er2 ür2fl ür2fr ür2g3eng ürge2ra ürk2e ü3r2o3 üro5fe ürom2 üro5ma üror2 ürr2 ür2r3h ür2s ür3sc ür3se ür3si ür3sp ür3sta ürte2l3 ürt2h ürz2a ür2z1in ür2zö ür2z3w üs2a ü3schi ü2schl ü3s2e üse1e2 üse3l2 üse4n üse3r4 üse1s üs2p üs4s3a üs4sä üs2s1c üs4s3o üs2st üst3a üste2n üs4tl 2üß ü3ße ü3ßi 2üt ü2t1al üte3m üte4n üten3s2 ütent4 üten3z2 üte2ra üte2re üter3ei üterich4 üter3n ü2t1h ü2t3r üt2se üt2st ütte4n üt2tr üt3zen üt2zw 1v 3va. 2v1ab vab4r va1c va3f va3g2a va2la 2valu v2an. 2vanb v2ans 2varb v1arm vas2 2v1ass va1st va2t1a4 va4tag va4tan va2tei va4t3eng va4tess va2t3h va4tid vati3k2 va4tim va4t1in vati4ons. va4tord va4t3r vat3s2 va2t1u 2v1au 2vb 2v1c 2vd2 ve2 ve3ak 2ve3al ve3an ve3ar veau3 ve3b veb4r ve3d ve3e2 ve3f ve4ff ve3g ve3h2 2veig v2eil 2vein veit2 veits3 ve3la 2velan vel2ar ve4l1au v1ele ve3lei ve3l2i ve3lo vel2o3p ve3ma ve3me 2v1emp 2vemu ve3nal ve4nas v1endu ve3ne venen2d 2venerg ve3ni ve4nin ve3nö ven6t3ag vent4sk ven2za 2veo ve3of ve3pa ve4pi ver1 ver3a ve3rad 2veral ve3rand ve3rane vera4s ver4bart ver3b2l ver3d4 vere2 vere4i verein4s5t ve4rf4 ver3g4 ve3ri ve4rin ver3k vern2 ver2sep ver3sta vert4 ver3te ver3u4 ve3rus ve3sa 2ve3sc 2ve3se ves3p ves3ti ve3t vete1 vete3r ve4tl ve4ts ve4tt 2veü ve3v ve3w ve3z 2vf2 vf4gh 2vg 2v1h vi1an vi3ar vi4a3t vi2c vi3de vid3s2t 3vie vie2h1a vi2el viela2 viele2 vi2er vie2rec vie2w1 vig2 2vii v2il vi2l1a vi2lä vi4l1e2h vi2lei viler2 vi2lers vi2l1in vi2ma2 vi4na vin3d ving3 vings4 v1ins vi3sa vise4 vi3s2i vi3s2o vi2sp vis2u viv2 viz2 vize1 2vk 2v1l2 v3le v2lie 2vm vm2e vmwa4 2v1n2 2v1ob vo2be vob4l voge2l3 vo2gu vo2i vol2a vol4l1a vollen4 vol4lend vol4ler4t vol2li 2v1op vo2pe vo2r1 vo4r3a voran6schl vor3g vo3ri vo4rie vo5rig vorm2 vormen2 vor3o vor3t4 vo4ru vo5ruf vot2a vö2c 2vp2 v3pf 2vq vr2 v1ra v2ree v4ret 3v2ri 2vs vs2c vs2e vs2p v1sta v1steu v1str v3s2z 2vt vue3 vu2enu vu2et 2vumf 2vumg 2vumk v1ü 2vv 2vw 2vz 1w w2a 3waa wab2bl wa3che wach4stub wach2t4r 3wack waffe2 waffel3 3wag wa3ge wa5ge4n wa2g3n wag5ne wa3go wag4r 3wah wahl3ent wah4ler wah2l1i wa4ig 3wal wala3c wa2lar 4walb wal4d3a wal2din wal2dr wa2les wa3li wa5lis wal2m1 wals2 wal4t1a wal4terl wal4to wal2tur wa3na wan2d1a2 wandels4 wan2dr w3anf wan3g2e wang4s3 3wann wan4z3en4d wan2z3er wa2p 3war2e ware1i wa3ren 3warn war4ni war2th wart2st war2za 3was wa3sa was2c wa2scha wa3sche wa4schei wa2sch3l wa2schw wa3se wa3sh was3s2 wass4e2 wa3su wäch3s2e 3wäh 3wäl wäm3 4wäng 3wäs wäs2c wäss4e 2w1äu 2wb2 wbu2 2w1c 2wd we2a we2b1a webe1i we2b3l we2bo we2b3r webs2c we3cke. we3cken. we3ckes wee2 weed3 wef2e we2fl 3weg we2g1a we4g1ei weg3ersc we4g3l we4gn we2g1o4 we4g3r weg5re weg3s wegs2a wegs4t 3weh weh2r3er2 wei2bl weib4r 4weie weifel4d wei2gr wei2ha wei3k4 3weil wei3le weinsau4 wei3sc weisch4 weis2sp wei2t1r wei5ze wel5le4 wel4schl wel4schr wel2t1 wel4t3a2 welte4 wel4t3en4d wel4th welt3i wel4to welt3r wel6tri wen3a2 wendes2 wen2gl we3n2i wen2kau wen2kla wen2k3ri we2r3a2 wer5be werbe3i wer2bl werb2s wer3d2 3werdens 3werdu werer2 wer2fl wer2ga wer2gel wer2g3o wer2gr werin2 we3rins we2ri4o 3werk. wer4k1a 3werke wer2ki wer2k3l wer2kn wer2k3o wer2k3re wer2ku we2rö wer2s wer3sc wer3sp wer2t1a wer2tä wer2tei wert3eig wer4t3erm wer2th wer2tin wer4t1o2 wer2tre wer6t3ri wer2tum 3wese we2s3p we4st wes4t1a weste2 west3ei wes4ten4d wes2tex wes2ti wes4t1o4 wes4t3r wes2tu 3wet 4wets wett3s 2w3ey 2wf 2wg whi2 whi4t w3ho w2i wicht4s wi1cka 3wid wi2e 4wieb 3wied wie3l wie3n2e wik2 3wild wim2ma wim4m3u win2a win2d3e2c win3del win4derz 3win2d3r 4wing win2g3r win2kl winner2 win4n5ersc win2no win3s wint2 3wi2r wi4re3 wi3s2e wi5sen wi2s2p 3wiss wiss4z wi3th 3witz. wit2zer 3witzl wiz2 w2j 2wk 2w1l 2wm 2wn wns2a wn3sh 3wo1c wo2cha woch2e4 woh2lei woh4na 3wolf wol3fe wolf2s3 wol2la wol2ler wor3a wor3d wo2r3i wort1a wor2tel wor4terh wor4t3r wort3s wo4r3u wor3ü 3wos wot2 3wöc wöl2fo wört2h 2wp w2r w3re w3ro 2w1s w3s2h w3s2k w4sk. ws2t w2s1u 2wt wti2 w2u 3wuc wuch2sc wuch2st w3uf wu4fe wul2 wul3se wund4e wung3r wungs4 wun2s wunsch3l 4wur. wur2fa wurf1o wur2fr wur2s 3wurst wus2 wus3te 3wu2t1 wu4te 3wüh wül2 wün3 3würf 3würst 2ww 2wz x1a 1xa. 2xa2b 1x2ac 1x2ad 1xae xa3fl 1x2a3g2 2xal xal2l x3am xa5met xa4mi x2an. 1xane 1xani x2an3t2 xanti3 x2anz xa2r 1x2as xa2z 2xb xb4ri xcal2 x1ce x1ch x1cl 2xd xda2 xda4t 1xe 3xe. 2x1e2g xe4ge 2xek xe2l x1ele xe3lei x1em 3x2em. 2xemp x2ems x2en 3xen. xen3s2 3x2er. x2ere 2x1erl xer2la x2ern x2ers. xe4rx 3xes 2x1eu 2x1ex 2xf 2xg 2x1h xi1c xich2 xi2dan xide2 xi2dei xi2d3em x1i2do 3x2i2e xie3l xi4en xi3g 3xi3k xik4l xi2ler xili3a xi2lo xi2l1u 1xim2 xin3s2 x2is xi2sa xi2s1e xiso2 xi2sp xis3s4 xis3t xis4tä xi2su 3xit xi3te x1i4tu xive4 2xk2 xkal2 2x2l2 x3lä x3le 2xm 2x1n 2xoe x3o2l x1o2r 3xos2 2x1ö2 2xp xpor4ter4 xpor2t3r x1r 2x1s2 x3sh x3sk x3st x3sz 2xt xt1a xta2b3 x3tan xt2ant x3tas x2t1ä x3tät xtblo4 xtblock3 x2t1e2d xt1ein x2t1el x4tent x2t1er2f x2t1ev xtfi2 x2t1h x2t1id xti2la xtil2lu x2t1o2 x4to4r xtra3b4 x2t3ran x2trau xt3rec xt3s2 x2t1um x2t1un 1xu xu1a xu2n 2xunt xu2s3 xusa2 xuss2 2x2v x3ve x3vo 2xw 1xy. 2yab 1ya2c y2ach y2ag ya1h y1al. ya4mo y1an. y2ana yan2g y1ank y2aq y1ar y2a3ra y2are yas2 yas3t y1ät ybe2r y1c y2chi y3chis ych3n ydi3e ydri2 ydrid3 yd4ro3 y1e y2ec ye2d y2ef y2el2 yen4n yera2 y2ere yer2n1 y2es y4es. y4esp ye2th yf2 ygie3 yg2l y1h y3ho yhr2 2y1i2 yi4sc yk2 yke3n yk4la yk4ni yk4no yk3s yk3t yl1a yla2c yl2ag y1l2ak yla4l y2la4m yla2n yl3ane y1lant yl2ante yl2anti yl2as y1lä yl3c yle2 y2le. yl1em y2l1es y2l1e4t yli4n yloid3 yloni1 yl2op yl1ora yl3s2 yl5tri y2m y3m2a ym4an ym4ar ym4as y3mä y3me ym4el y3mi y3mo ymp2 ym2pha ympi3e ymp4t y3mu ynä2r yn2eu ynk2 y2n1o2 yno4t yn2oz yn3t2 yob2 y2od yoga3 yom2 yon2a y2onn y1ont yo2pe yo1s y2ost y3ot. y1ou 2yp ypa2b3 ypa2n yp2e2 ype4r3o2 y2p1i2d y2p1in y2plo y3po3 yp3th ypu2 y2p1um y1r yr2e y3ri yri1e yri3en y3ro yros3t yrr2 2ys ys2an ysch4 ys2e1 ysein2 ys3l ysme3 ys2po ys3pr ys3t2e ys5tem yst2h ys2the y1sto ys4tol ysto4le ys3tr ys4tra y4stro y3s4ty ysu2 ys1ur y3s2z y4tes yt2h ythe1 ythi3e y3to1 ytos2 y2t3r y1u2r yur2e3 yvet4 yvon4 y1y yz2 yze3r2i 1z 2z1a2b zab3l za1c 2z1ach zach2s 2z1a2d 2z1af za3gr 3z2ah zah3len zah4ner2 z1ak 4z3akk 2z1al 4z3alb 4z3ald 3zali 2z1am za4me z1a2n z2an. 2za4n4a 2zanb za3ne 2zanf 2zangs 2zanh z2ank zan2ka 2zanl 2zanp 2zanr zanti1 2zanw za4pf z1a2q z1ar 3zar. 2zarb za3re 2zarm 3z2aro zar2t1r 2z1as zas4b za4sc zast4 z3at zat2e za2to 3zaub 2z1au4f 2z3aug 3zaun z3aur 2z1aut zä2 2z1äc z2äh zä3hi 3zähn 2z1äm z1än z1är 2z1äus 2zäuß 2zb2 zbah2 zber2e z3bo zb4ri z3bü zbü3b zbübe3 2z1c z3ca z3ch 2zd2 z3da zdan2 zdä1 zdi1st z3dü 3ze. 2zea ze2ana 2z1e2ben ze1c 2z1e2cho ze1e2 2z1eff z1e2ga zehe4 zehen1 zeh2l zeh4n1a zeh4n3en ze3ho zei3f4 zeik4 zeil2 zei3la zeile4 2z1ein ze3in. z2e1ind zei4ne 4z3einh ze3inse ze2i1s4 zei3sk 3zeit zei2t1a zeit3end zei2t3er zei4to zei2tr zeit3ri zek4l ze2l1a zela2d zel3am zel3a2n ze2l1ä zel3d4 4ze2lek 4zelem ze2len ze2l1er ze2l1in 2z1e2lit zel3la zel4lab zel4l3ac zel4lar zel4lein zel4ler4t zeller4z zell3s2 zelm4 ze2l1o zels2 zel3sa zel3sz zel2ti zelu4 zembe2 zem4e 2z1emp 3zen. ze4n1ac ze4nas zen3au ze2nä ze3n2em zenen1 3zenerk 2zenge. z4engl 2zengp 2zeni ze2nid zenk2 zen3n ze2n3o ze4not 2zen2sem zen2ser zens2p z2entn z1ents 2zentw 2zentz zen2z3er zen2zw zeo4r 3z2er. zer3a ze2rad ze1ral ze2rat z2ere ze5rek zer2em z2erfe z3erfül 2z1ergä z3ergeb 5z4erges z4ergl zer2gon 4z1ergu 3z2erhe 2z1er3hö zerin2t z2erko 3zerl. zer2lau zer2le. 2zerleb zer2len 2zerlö 3z2ern zer2nan zer2n3e2b zer4nei 2z1erö zer2öf ze1rös 2z1erq 3zerr 4z3erreg z2ers. z1ersa zerta2 zer4t3ag zert2an zer4teng zer2ter zer2tin zer2to z3ertrag zer4trau z1erwe z1erz zer2ze 3z2es. ze2sä ze3sch zes1e zes3p ze4s5po zes2sa zessen2 zes4s3end zes4sent zes2ser zes2sp zes2st zes2sum ze1sta ze3stau ze1str ze3stra z2et. 2zeta 2ze2th ze2tr 2zetts zeu2gem zeu2g3r 2z1eul ze1ur 2z1e2x1 2zf zf4at z3fe zfeue2 zf4la zf4le zf4re zf4rü 2zg2 zger2a zger4s3 z3gn zg4nu 2z1h2 zhau2t1 zhir3 zi3alo zi2ar zich2o zi2dei ziele2 zie2leb zie2l1i zi3en zien3s zi1erh zi1es zig4s 2z3ik zi2ko zil2e 4zimp zim4t3 2z1ind zin2e zin3ei 2z1inf z1inh zi4n1in 2z1inj zin4na zin4o zin2sa zin2ser zin4sk 2zinsuf 2zint zi2o3 zirk2 zirk4s z1iso zi2sp zisse4 zi3s2z zi3th zithe2 zi4t1o2 zit2u ziv2 2zj 2zk2 zk4ne z3ky 2z1l2 zlei3ti zle1s z3ly 2zm2 z3ma zme2e 2z1n2 z3na z3ne z3oas 2z1ob 2z1of zo2gl zog4s3 2z1oh zol2la zoller2 zol4lert zon3au zon3s4 zon2t3er zo2o 2zo2pe 2z1o2r zo3re 3z2orn zor4ne 2z1osz 2z1ou zo2w 2z1o2z 2zöf zö4fe 2z1ök z1öl 2zöl. 3z2öll 2zöls 2zp2 z3pf z3pl zp4lu 2zq 2z1r2 z3re zreb3 zrebs2 z3ru 2z1s2 z3sa zsau2 zse1e z3sh z3si z3sk zspor2 zst2 z4st. z3ste zs4to z3sz 2zt zta2n zt3ane z2t1au z4tehe ztein3 zt3eins zt2el zte3ma z4t1ent z4t1erz zte3str zt2et zt1he z3them z3t2her zt1hi zt3ho z3thr z3thy z3ti zt3rec zt3ric zt3s2 z3tü zu3a zu1ä zub4l 3zu1c zuch2e zucht3 zu3cke zudi4 zud4r zu2el zu3e2r1 zue2t zu3f2 zu5fei zuf4l zuf4r zug2em zu2gent zug3g zug2i zu3gl zu4gla zu4glö zu2go 2z1uhr zu3hu zu1i2 zu3k zu3l2 2z1um. zum2a 2z1umb zumen2 2zumf 2zumg 2z1umh zum2i 2zumk 2zuml 2zumr 2z1ums zum2u 2zunab zu3n2e 2z1unem zunf4 zung4 2zunget 2zungl z1uni 2zu2nio 2zuniv 2zunr 2z1uns 2zunt zuo2 zup2fi zu3pfr zu3r2a 2z1urk 2z1url 2z1urn 2z1urs 2z1urt zu3ru zu3s2 zusch4 zus4p zus4t zu3t2 zut4r zu5tri zut4u zu4t3z zuz4w 2züb zü4be 3züc zür1c 2zv z2w2 z3wac 2zwag 2zwah z4wang z3war 2zwa2s 2zwäc 2zwär 2zwäs z3wech z4weck 2z3wed 2zweg 2zweh z4weig 2zweil zweiter4 2z3wel 2z3wen 2z3wer z4werg 2z3wes z4wic zwi4e 3zwing 2zwirt z4wisc 2zwiss z4wit 2z3wo z3wör z3wur 2z3wü zy2le 2zz z3z2a zzab4 zz4at z3zer z3zi z4z1id zz1in zzi1s4 z3zo z4zor zz2ö z3zu zzug4s",
["lefthyphenmin"]=1,
- ["length"]=169219,
- ["n"]=24536,
+ ["length"]=181826,
+ ["n"]=26377,
["righthyphenmax"]=1,
},
["version"]="1.001",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-deo.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-deo.lua
index 46516245aa6..1c194407bc2 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-deo.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-deo.lua
@@ -6,85 +6,14 @@ return {
["metadata"]={
["mnemonic"]="deo",
["source"]="hyph-de-1901",
- ["texcomment"]="% title: German Hyphenation Patterns (Traditional Orthography)\
-%\
-% notice: TeX-Trennmuster für die traditionelle deutsche Rechtschreibung\
-%\
-% version: 2018-03-31\
-%\
-% authors:\
-% -\
-% name: Deutschsprachige Trennmustermannschaft\
-% contact: trennmuster@dante.de\
-%\
-% copyright: Copyright (c) 2013-2018\
-% Stephan Hennig, Werner Lemberg, Günter Milde,\
-% Sander van Geloven, Georg Pfeiffer, Gisbert W. Selke,\
-% Tobias Wendorf\
-%\
-% licence:\
-% name: MIT\
-% url: http://opensource.org/licenses/mit-license.php\
-% text: >\
-% Permission is hereby granted, free of charge, to any person\
-% obtaining a copy of this software and associated documentation\
-% files (the “Softwareâ€), to deal in the Software without\
-% restriction, including without limitation the rights to use,\
-% copy, modify, merge, publish, distribute, sublicense, and/or\
-% sell copies of the Software, and to permit persons to whom the\
-% Software is furnished to do so, subject to the following\
-% conditions:\
-%\
-% The above copyright notice and this permission notice shall be\
-% included in all copies or substantial portions of the Software.\
-%\
-% THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND,\
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\
-% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\
-% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\
-% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\
-% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\
-% OTHER DEALINGS IN THE SOFTWARE.\
-%\
-% source: http://repo.or.cz/w/wortliste.git?a=commit;h=8b9a428c271e064f0047a364c532308f0fd4051f\
-%\
-% language:\
-% name: German, traditional spelling\
-% tag: de-1901\
-%\
-% hyphenmins:\
-% generation:\
-% left: 2\
-% right: 2\
-% typesetting:\
-% left: 2\
-% right: 2\
-%\
-% ===========================================================================\
-% \
-% \\message{German Hyphenation Patterns (Traditional Orthography) `dehypht-x' 2018-03-31 (WL)}\
-% \
-%\
-% The used patgen parameters are\
-%\
-% 1 1 | 2 5 | 1 1 1\
-% 2 2 | 2 5 | 1 2 1\
-% 3 3 | 2 6 | 1 1 1\
-% 4 4 | 2 6 | 1 4 1\
-% 5 5 | 2 7 | 1 1 1\
-% 6 6 | 2 7 | 1 6 1\
-% 7 7 | 2 13 | 1 4 1\
-% 8 8 | 2 13 | 1 8 1\
-% \
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
- ["characters"]="abcdefghijklmnopqrstuvwxyzßàáâäçèéêëíñóôöü",
- ["data"]=".ab1a .ab3l .abo2 .ab3ol .ab1or .ab3s2 .ab3u .ade3n .ae3 .aft2 .ag2a .ag4r .ag2u .ai2s .akt2a .al2e .al3k .al3lei .al5len .al3se .al4tei .al4tel .alter6s5 .alt1s .al2tu .ampe4 .amt2s .amt4sc .ana1c .an4a3t .an3d2 .anden6k .and4ri .an1er .ang2 .an3gli .an3go .ang4s2 .angst3 .ani2s .an3k4 .an3na .an3s2 .an4si. .an4tar .an3z2 .aos4 .ap5p6le. .ari1e .ar3k2a .ar4m3ac .ar4mun .ar2sc .ar4tan .ar4t3ei .arter4 .ar6t5erh .ar2t1r .arz2 .as6sest .as2t .ata1 .at2h .at4r .au3d .au4f3 .aufs2 .au2s1 .au6stes .auß2 .ax2 .äm3 .är6schl .ät2h .ät2s .äu3 .bahn3 .bah6ner .bal3t .baus4 .be3erb .beige4 .bel2a .be3r2a .ber2e .ber4g3a .berga6s .ber6g5e6b .ber4g3r .ber4tr .bi4os .bi2t .bit1a .boge2 .bo4s3k .bu4ser .bus3se .bussy4 .bu3ta .ce2ra .ch6 .char8mes .chi3er .dab4 .da2r1 .dar3in .dar2m1 .da4te. .da4tes .de2al .de1i .dein2 .de8ments .de3na .den4ka .den4kl .den4ko .de1o2 .de3r4en .derma3 .dermas6 .de3sk .di3el .di4en2 .dienst7a8d .do3b .do2mo .do1pe .dor2f1 .do2tr .dys3 .ebe2r1 .eh2e .ehe1i .ehe5n .ei3e2 .ei3f2e .ei3k .ei4na .einbus6 .ein3d .ei2ne2 .ein3eb .ein6erl .eins2 .ein3sp .eise4 .ei2sp .eis3s2 .ei4s1t .ei2tr .eke2 .ek3li .el2bi .el2bl .el4fei .el2fl .em3m2 .en1 .en4da .en4d3er4 .en2d3r .en4dü .en3ga .en2gl .enk2 .enn2 .ent3 .en2ta .en4tei .en7thalp .en4tio .en2t1r .ents2 .epi1 .ep3p .er4bei .er8brecht .er2bu .er4dan .erden6k .er4d3er .er1e .ere3c .er2em .erf4 .er1i .ers2 .er8stein .erster6 .er8sterb .er8stritt. .er8stritten. .ert2 .er4z3el .er4zen4 .es3p .es2st .es2t .esta2 .est6e .est3r .et2s .eu3 .eug4 .eur4 .ext4 .fäs3se .fe3la .fer4no .fi3d4 .fi4le. .fi4len .fi2s .flö8s7se. .flö8s7sen. .flö8s7ses .flu2g1 .fs4 .fu2sc .ga2me .gan4ga .gangs4 .ga4s3e .ga6sten .ga4su .ga2t .gd2 .gebe4a .geb2l .gel4b3r .gel2d1 .ge3lu .ge3m .ge5nar .ge3n4e .ge3n2o .gente4 .ge3r4a .ger2e .ge3ro .ge3s2 .glan2 .glanz3 .gla4s3t .gol6der .grif8fes .gus2 .haft3s .hal5le .halt4e .hau2t1 .he2 .he4bei .he3fe .he3le .he4r3an .he3rat .her6b5ra .he3rer .he3ri .he6r5inn .hin3u .hof1 .ho4fen .ho4met .höch2 .ia2 .il3 .im2a .ima4ge .im5m2 .in1 .ind2 .in3gl .ink2 .in3n2e .in3sk .in3t2 .inu1 .io4d .ioni1 .ire3 .is2a .it2h .iv2 .joni1 .ka2b3l .ka2i .kal2a .ka3le .ka3t2a .kat3i .ka4ti4o .ken6num .ker3s .ki4e .klang3 .ko3b .kopf1 .kor4da .kraf2 .ks4 .kus2 .la3be .lan8de8mi .le4ar .le4gas .le3n2i .lich8t7er8s .li2f .li3po .li4ve. .lo4g3in .lo2sc .los3s2 .lo2tr .lo3ver .lö4ss .lus2 .luster6 .lu4str .lut2h .ly2s3 .ma3d .ma3ge .mal4e .mas8sen. .ma4str .mat4c .matu3 .md2 .mel2a .me3ne .me3no .men8schl .men8schw .mes4sp .mi2f .mik4 .mil2z1 .mi2t1 .mm2 .na3no .na3t .näs5c .nebe4n .ner2f .ne1ro .nich2 .nicht5e .ni2e .ni3k4l .no2c .no2s .no2th .nul2 .nus2 .oa5s .ob1a .obe2 .ober5ei .ob3i2t .och3 .of2e .ohr5s .oper4 .or2a .ord4e .or3g .or3k2 .ort2 .orts3e .os3s .osta4 .oste2 .ost5end .osten8de .oste6re .ost3i .ost3r .ot1a .ou2t .ozo4 .öl3l .pab4 .part4h .pe2c .pe3la .pe3le .pe3na .pe4ste .pf4 .ph4 .poka2 .postei6 .po8steig .po4sto .po4str .ps2 .rabe4 .ra3ch4e .ra3me .ra4sp .ra4s3s .rau2m .rau8schl .räu3sc .re3ale .rebs2 .re3cha .re5insz .reis6e5i .rei6str .res2t .re4stu .ri4as .richt6e .ri4f .ro4a .ro3be .ro2e .ro2ha .ro3m .rom4a .ro2t3r .ro3tu .rö2sc .rö4ss .rös3se .ruf3s .ruh2r1 .runder6 .ru5s6ses .rü1b .rücker6 .rü4ss .sa3br .sali1 .sali3e .sami1 .sas2 .sa5sse .sau1c .sau4er .sau5er. .sä5s4 .sch4 .schaf8t7end .scheiner8 .scho7s8se. .scho7s8ses. .se2e .seein4 .se2ha .sein2 .sen4f .sen3s .se3re .se1ro .se2t1 .sha2 .si4en .si3gn .sini3 .si2te .ski1e .sour2 .spani7er. .spä5s4 .spiege8lei .st4 .stau8becken. .ste2i .steiner8k .sto4re .stras4 .stro6ma .sucher6 .sy5s .tage4s .ta3mi .tan4k3a .tan4k3l .ta3ra .tar3t2 .ta2t1h .ta2to .ta4tor .ta2t1u .te2e .te2f .tehe3 .teiler8s .tei8l7ersc .te3le .te3no .te1ra .tes4t .te6stei .te6stel .test3r .th4 .ti2a .ti2e .ti2me .ti4mes .ti3r .ti2s .tischen8 .ti8sch7end .tite4 .tode2 .to4der .todes3 .to2n .to4nat .to3nes .ton3i .to4nin .tons2 .to4pl .to2pr .to2w .tras3 .tra4ss .tri3e4s .trockenmas8 .ts4 .tse3 .tu3ra .tu3ri .turm1 .tur4ma .ub2 .ufe2 .ufer3 .ul2b3 .um3 .ume2 .umo2 .ums2 .un3a2 .un3d .une4 .un3g2 .uni2t .ur3a2d .ural4 .uran6fa .ur1c .ur1e .ur4inf .ur3o4m .ur1o2p .ur3s2 .ut2a .ut3r .ve5n2e .vol2 .vo4r .wah4l .wa2s .weg5s .weine4 .wei4ta .welter8e .welter8k .wer6ker .wer4kr .wer4tr .wetterer8 .wi4e .wor2 .wort5en6 .wur2f1 .xe3 .ya4l .zeit3s .zel4la4 .zelle4 .zel6lei .zel4li .zeug4i .zi2e .zie4l3u .zin4ka .zin4s3c .zin4st .zol2 .zuch2 .zug3l .zu4gra .zu2pf .zweigen8 .zwei8g7end a1ab aa2be aa1c a1a2ce aa2gr a1akt a1a2n a2ans a1aq 2a2ar aa2r3a aar3b aar3d aa3rea aa2rei aarf4 aar3g2 aar3k4 aart4 1aas aas1t aa2th aa2t3r aat4s1 2a3au a1ä a1b 2aba 3abad ab1alt a3b2am ab2ant ab1au ab2aut ab1ä ab2är ab2äu 2abbat 2abbin 1abd 2a3be. 2a3bec 2abee ab1eic abe3i4d ab1eil ab1ein 2ab2el abe2la abela4d abe2le 2aben. 1abent 2aber a2berd a3beri ab1er2k ab1er2r ab1er2z 4abes abe2s1e ab3esse abes2t ab1eß 2abet 2abew 1abf 1abg 3abga 1abh 2abi 4abil ab1ins ab1ir ab1it 1abk ab1l 1a2bla a3blat 1a2blä a2b3led 3ab3lei a3blem 2ablet ab3li a2blin ab4lit 2ablo 1a2blö a2blu abma3s 1abn 2abo 3a2bo. ab2of 3a2bon 4abot 2abö ab3r a4brä a2bre ab4ros 2abrö a4bs 1absc 1ab3s2p abs2t2 1abstu 1abtei 3abtr 2abu abu3g4 a2bum ab1ur 2abü 1abw 2aby 3abz 2ac. 2a3ca 1ac1c 2acci ace1 a1cem a1cen a1cet ach1a a1chal a3chari ach3as ach3au 2achb a1che a2ch1e2c ach1ei ach4ei. a2chep a4cherf ach5erfa a4ch3erh a4ch3erl a4cherö a4ch3erw 2achf 2a1chi a2chim ach3l 2ach3m ach3n a1cho a3cho. a2cho2r ach3öf 4ach3r 2achsc achs4el ach3s2i ach3skr achs4or ach3su a4cht ach4tak ach6terf ach8tersp ach6t5erw ach2t1o acht5rat ach8traum ach8träume. ach8träumen. ach6trit acht6s5al ach4tum a1chu ach1u2f ach3ü 2achv 4ach1w a2chy a1ci ackmu4 ackmus3 ack2sp acksta4 2a1cl a3co acon4n 2acu a1ç a1d 2ad. 2ada. 4adab ad2abr ad2ag adai4 ad1an 3adap 4a3d2a2r3 2adas 2adat a2d1au a3dau. 1a2dä ad1c 1add 2ade. ade2al a3dec a3dee adefi2 2adeg a3dell 4aden a3den1a ade4nat adeo2 ade1ra a2d1erk 4ades2 ade3sp ades4s 2adf 4adh 4adi adi3en adi3er. adie4sc 3adj 2adli 4admu ad2ob ado2n ado4na a2dop 2adp 2adq a2dre 2ad3rec ad3rei ad3run 2ads2 ad3sz 2ad2t1 adte2 ad4tor 1adv 2a3dy 2a1e1 ae2b a2ec ae2d4 ae2i a2ek a2el a3el. a4ela a4ele a4eli a3els ae2m ae2o3 aeop2 ae2p 3a4er2o a2es2 ae2sc ae2ta a2ew ae2x 2afa af1ab a2f1a2n a3far a2f1au 2afä a2f1än 2afe a2f1ec a4fentl a4f1ep aff4a af2f3l aff4th 2afi afi6kanz afi4kat afi2t 2af3l af1la a1f4lu 2afo a2f3oc a2ford a2f1ort 2afra af3rau af3rä af3re 2afro af3rö af4rü af3s2a af3sh af2si af2sp af2t1a af3tat af2tei af2te2l aft4erk af2t1o af2tö aft3r af2tra aft5rei af2tur a2f3ur 2afü a1g 2ag. 2aga ag1a2b ag1a2d ag1am ag1ar a2g1au ag2del ag2dr ag2du 4age. age4l3ei age4ler 2agen. age4neb a2gent 2ages age4sam age4s3in age4so ages3p ages5s ages6sen age4s3ti 3aggr a2g1id a2gim 2a2gl ag4lan ag4las ag3le a4glö 2agm ag2n ag4nat a4gnä ag4ne. ag4nu ago3b ag3rat a2g3re a2gri ag3rie ag3rin 2ags ag3sah ag4sam ag3s4eid ag2sp ag7s8porta ag2s1tr 2agt ag2th 2agu a2gund 2ah. 2a1ha ah2an ah4at a1hä 2a1he ahe1in a2h1er2h ahe3u a1h2i ahin3 ah2l3a2 ah2l1ä ah2l1ei ah2lel ahle4na ah4l3erd ah4l3erh ahl1o2 ah2lö ahl3sz ahme1i ah3mu ah4n3a ah2nä ah3nee ah2nef ahn3el ah4nerd ahner4e ahner6le ahner4n ah2nin ah2no 1a2hor ah1os ah3ös 4ahr ahr1a ah3r2e ahren6sc ahre4s3 ahr2ti ahr4tri ahr4tro ahr4tun ah2ta ah2te2l ah2t1ex ah2t3r aht1s a1hu ah1w a1hy 2ai. ai1a4 a1ia. 2aib ai2bl aid4s aids1t ai1e4 ai3en1 aif4 ai1fr a4i3g4 a3ik. ai3ke ai2lar ail3d4 ai2lei ail3g ai2lo 4ain ain2a a1ind ai5n4e ain3s ains2p 3airb ai2sa a3isch. ai5schw ai3s2e ais3sen ais5st ai2sti ait4 a3iv. a3ivl a3ivs a1j a2jat ajekt4o 2ak. 2aka. 2aka3b akab4r a2kad 2akal 2a3kam 2akan 2akar ak4at akat1a aka4tak 1akaz 4akä 2akb 2akc 2akd 2a1ke a2kef a2k1em a2kent a2kes ak2et a2keu 2a1ki ak1ins 1akku 2ak3l a1k4la ak4li 3aklö a1kna 2ako 2a1kr ak3res a3k4ri 3akro3 ak3rü 2aks ak3sh ak2t1a2b ak4tag ak3tan 2aktb ak2tel ak3ten akt2er 2aktg 2aktik 2aktis 2aktm ak2to4b ak2tö ak2t3r ak3t4ri 2aktsi 2aktsp 2aktst 2aktw a1ku 2akun a2kup 2akur 2akü 1akz 3akze a1la 2ala. 2alabo al1af al1age 2alai al1akr al1am al1ana 2aland a2lang al1anz al1app a3lar. al3arc a3lare 2al1arr a2lart ala2s al1asi al1ass a3lat. al4atm alat5t alat3z al1au al3aug a1lä a2l1äm al1än al1ärm al1äu 3albat al2bär alber4e al4berh al4b3er4w al2b1l al2boh al2bon alb3ru alb5st al4dan al2dä al4d3erl al4d3ern alde2s ald3inn al2dra al2drä alds2 2ale 4a3le. ale4ar a2l1e2b al1eck a4l1ef a2l1ei a3l2eic a4lein a2l1el 5a2lema a2l1e2mi 4a3len. alende4 al3endr a4l3ends a2leng al2enn ale2p al1epo 4aler. a2l1erb aler2e a2l1erf a2l1er2h aler4kl a2l3erl al1erm aler4mi a2l1er4r al2ers a2l1ert 3a4l3erwä 4ales a2l1e4sk a2less a4leth a2l1eu alf4r 3algi al2gli al3glo 1algo 3algor alg4r 2ali al2imb al1imm ali4nal al1ind alin4ge a2l1in2q al1ins alken1 al2klö al2kne al2kof 1alkoh alk3s2 al2lab al3la3d alla4me al2lan al2l1a2r al6later al2lä al3läu al3le. al4lec 3allee alle4gi al4leh al3lend all3erk aller4z al3les alle3se al2leu al2lid alli5er. alli7ers. al2lob al2lo2c al2lop al2lo2s al2lö2 all3öse al2luf allu4s al2lü4s al2map al3mas al4m3ast almo6de. 2alo. a2l1ob 3a2loe a2l1of 4alog alo2ga alo2gr al1ont al1ort 2alos a2l1ö al2ös 3alp. 3alpe. 1alph al2pho alrat4 al3sak al6schei al4sh al3skl al2stu al2sum al2t1ak alt3alg al2t1an al2tat al2tau 1altä alt3eis alt3elt al4temu al4t3er5f al2teu al2tid al2tin alt1op al2tö al4t3rat al2tre al2t3ri al2t3ro alt4stü a1lu alu3b4 al2u3f alu3g al1u2k a2lum al1umb a2l1ur a3lus 4aly al2zar al2zau al3zen alz4erk al2zw am2a ama2ba ama3d2 ama3g 2amah a2malg 2a3m4an 2amar ama4sta 1a2maz 2amä 4ame. a2meb 2amel am2e4n1 amen6s5pr ame3r2a amera3u a2m1erf 3a2meri ame5r2u 2ames a4mesh 2a3met 2amf a3mi. a3mie ami2k 2a3mir 2a3mis 2amit 2amk 2aml 2amm. am2mab am2ma2c 2ammal amma2n am2mar am2mas amma4sc am2maß am4ma4te ammen8ge. ammes3 am2mid ammi2e am2min am2mit am4mo2d am2m1ö ammu2 amm3unt am4mus am4mü amni1 a2mö 2ampe. 2ampen amp2f1a2 2am2ple 2ampo am3pr 4amsc am4schl 1amse am3sh 1amt. am2t1a2 am2t1ä am2tei amt3eig am2tel 2amtem am4terh am4t3ern am2t1ex am2tis am2tit am2to am4tou am2tö am2t3r am2t1u 2amtv 2amu 3a2mul 2ana. 2anab ana3c an2ad anadi1 an2ag 2a3nak an1alg ana4lin 2anam an2a3ma 2anan an4and 2anas a5nat. ana4th a5n4atm a2nato ana2tr a5nats an3aug 1a2n1äs 1anb 2anbas 2anbö 2anbu an3ch 2and. 3an3d2ac and3arm and3ei anden6ga an4d3ent and5erob ande2s an2d1ex and4sas and4seh and2so and6spar and6spas and6s5paß and2su 4andu2 an2d1ur 2ane an3ec a3nee an2ei. an3eif 3aneig a4neis 3a2n1e4k ane2l an1e2mi a2nemo aner4fa a3nerg an2erh a4nerke 4anern a4nerz. an4erze an1eth 3anex 1anf 2anf. 2anfab 3anfä an3fe 2anfi an4fj anf3le 4anfors anf5rau 2anfs an3f2u 4ang. 1anga 2anga. an2g1ar 2angas 2ange. 1angeb 1angeh an2g1ei an4g3erf an4g3er4h an4g3er4w an4g3erz 2angh 2angie ang1l an2gla ang5n ang1r ang3ra 1an3gri 4angs. ang4sto angt2 1anh 2a3ni an2i3d 4anie ani3els ani5ers. anig2 ani3ke 3a4nim a4nind ani2o an3i4on a4niso anis2t 2anj 2ank. an2kab an2k1ak an2kan an2kei 2an3ken ank5erfa an3kes 2anki an2kid an2klö an2klu ank3no an4k3opf an2kor ank1r ank3ra an4kras ank3rä an2kro 2anks2 ank3se 2ankt4 3ankü 1anl 2anlad 3anlag anma3s2 2anmo 1anmu 2ann. 1annah an2nar an3ne an4nef an4nei an4nene ann2er 2anns ann4s3p 2annt 2ano. 1an1od 2anof 2anog 2a3nol ano2la 1a2nom a3nom. 2anoo a2n1or ano2ri 2a3nos 2a1nö 2anpu 1anr 2anrö an4same an3s4ar 1an3s2ä 1ansc an3skr ans1pa ans3pon 1anspr 1anst an3s2z 2ant. ant3ar anta4re an3t2ä 1antá 3antei an3tha 2antie 3antise anton2 3antr ant3rin 1antw 2anu anu3r anu3s anus3s a1nü 1anw 2anwi an2zä 2anzb 2anzd 1anzei anz3elf anze2n 2anzes 2anzg 2anzh anzi2d an2z1i4n 2anzk 2anzm 2anzr 2anzs 2anzt 1anzü 3anzün 2anzv 2anzw an2zwi 2anzy 2ao aof4 ao3i4 a1op aopf4 a1or a1os3 aost2 a3ot. ao3t2s 2a1ö2 a1p 4ap. ap4a apa3b a2pe. a3pel a2pé a2pf ap2fa 1apfel 2apfes a3pfl a2pht 2api 2apl ap4la a3plä ap3le ap3li ap2n 3a2pos a2pot 1appro 2apr ap2so ap4ster ap3t2 2a3pu 2ar. a1ra a3ra. ar2ab 2ar3abb ar3abf ar3abt ara3d2 ar3adr ara3ge 2a2r3al a3rale a3ra3li a3ralo 2aran a2r1ang a2r1anz 2arap a4r3app 2a2rar ar2asy 4arat a2r1au a1rä ar1äs 1arb 2arb. 2arba ar2bak ar2b3at ar2bau 4arbef ar4b3ein 2arbek 2arben 2arber 4arbi 2ar2bl 2arbo 2arb1r 2arbs2 arb3se arb3sk arb3so 2arb3t2 2arbu 1ar1c 2archl 2archr ar2dau arde4i ar2dop ar2d3r ar2du 2are. a2rea are5aler a2reb4 aree2 ar1eff a2reh ar1ehr 2arei a3rei. ar1eid a3reie a3reih areim3 a2rein arein4b arein4s arein4t a2rele 4arem 4aren. aren6sem are3r2a arer2e a4r3erei a2rerg a2rer3h a2reri a2rerk a2rerl a2rert ar2erw 2ares ar2et are3u a2rev arf1r arf3ra arf2sp 4arg. ar3gan ar2gl ar4gn 2arg4o ar3g4r 2arh 2ari ar2ia a2rid ari3e2n ari3erd ari3erg arin3it ar1int a3r4io ar2ir ar4is ari2su a3riu ar2kal ar2k1ar ark3aue arker2 ar2kil 2ark3l ar4klag ar2kle ar2klo ark4lö ar2koa ar2kor ark3s2a ark2se ark3she arku2 ar2les ar3mad arm1au ar3m2ä ar2m1eg ar2m1ei arm2or ar2mum 4armü 4arn ar2nan arn2el ar3ni a1ro arob2 4aroc ar1o2d ar1of aro2fe 2a3rol aro3m a2r1op a2ror 1a2rou a2r1ö4 2arp arr1ac ar2r3ad ar2r1as ar4rek arre4n1 ar2rh 2arri ar2r3or ar3s2h ar3s2i ar3sse ar2tau 2artb ar3t2e 2artei artel6li6 2artex art2i 2arto art3r art4res ar2tri 2arts art3ske 2artuc 2arty 2aru a2r1uh ar1um a3rumm a2rü 2arv arwa2 2a3r2y 2arza ar2zau ar2zä 2arze 2arzi ar2zö 1arzt arz2t3r 2arzu ar2z1w 2asa a4s3aa as2ad a4s3af a3s2al asal2t1 as1am as3art asa2s2 asa3sse as3at asau4f a4s3aug asau2s1 as3ät a2sca a4schec a4schef a4sch3ei a6scher6g as4chi a2schm 2ascht a3schu a4schum 2asd 4a3se a4seb a4sec a4s1ef as1eie a5sen. ase4na ase4n3o asens2 asen6sem as1ent as2er as4erd ase2re aser6geb a4s3erke as4es ase2t as1eta a4sex 2asf 2ash a4s3ha as2hi as3hir 2asig a2s3i2k 2asim asin2g as1inn 2asis as3ku a4s3l a4sn 2a1so as3ob as1of a3sol a3som aso2p as1or a4soz as1p as3pe aspek6to a4spel a4s2ph as2pi as3pik as4pin as3pio a4spir a4spl 2aspr as2pra as3sa ass2a3b ass6aus. ass2e ass3ein as3sel asse3le as3ser asserma6 a4ss2i as3sin as3ski as3so as2spo as2spr as4st as5sta as5stei as5str as5stu 2asta a4stab a3stä a4s1tec as2tee ast2el a4stemp a4s3tep ast2er a4st3ese as2tex a4s2th ast2id as2to a2stoc ast3orc as4trau a2st3re ast4ren a6stritt a3stro a4strol ast5roll a4s1tub a4stuf a2stum 2a1su as2ur a3su4s3 a4sw aswa2s 1asy 3a4syl 2asys as3z aße4 aß2en3 a2ß1er aß2th 2a1t 4ata at1abe at1abr at2a1f a3ta3g at2ago a3tah ata3la a3tam at1ang at3ank at1apf at2ast at3att a2t1au at1än 4atb at2c a2teb ateien6d at1eig 3a2teli a3tell 3atemg at2en ate4na atens4 a2tep 4ater ate3r4al ate3ran at4ere atern2 ate2ru at2eu a2tew 4atha at3hag at3hal a3t2heb ath3in. 3athl a4thr at2hu at3hü 4a3ti ati4kab ati6k5erw a4tinf at2is ati2sa ati2se a4tiso atis3s ati6v5erf 3atla 4atli 3atm 4atma 4atmä at3mu 4atmus a2t1ob a3tod a3tog a3tol 3a2t4om atom1e ato2mo at1op a3tor at1ort a3tos a3tra. atra2t a2t3rau a2t3rä at3re at3rin at3rom a3t4ron at3rot at3rü at2sa at4schn at2se ats1e2h at2si ats1in at2s1o ats1p ats3tät at3ta 3attac at4tad at2ta2g at4t1ak at2ta2l at4tang at4tar at4tau at2tä 4atte. at2tec at2tei at3t2el at4temp 4at5ter attes2 at3thä 4atto at2tob at2t3rä att3s2 at3t2u at2ty2 at4typ 4atu atu2n atze4l atz3ela atz3elt at2zem at2z1er a3tzere at2z1i atz3t2 at2z1w a2u 2au. 2au1a2 2aub au2bab au2ban au2b1au au2bei aube4n au2beu au2blä au2bli au2blo au2blu aub2si aubu4s 2auc au2dr 2aue aue2b au2ere aue3rei auer3ö au5erst. au3ert au2fa auf1ak auf1an aufas2 3aufber 2aufe. 2aufeh 4aufen. 3aufent auf1er au4fer4k au2feu auff4 auf3ind 1aufla 1aufn 2aufo auf3ski auf3t2 2auft. 5aufzeic 3aufzug 1aufzü 2aug au2ga au3g2ar 4augeb 4augeh 4augel aug2er 4augl 4augr au3gu 2auh au3ha auh1u 2au1i au2is 4auj auk3t aule2s aul4les au3lü 2aum au2mal aume4n au4m3ent au2m1e2r1 aum3eri au2m1id au4mil au4mit au2m1o aumo2r aum3p2 aum3s2 au4mun 4aun au3n2a aun2e au4n3ei au2nio au2no au3nu a4unz 2aup2 2aur2 au1rh au4sag au2s1ah ausan8ne. au2sas au2sau 2ausc au6schmi 1ausd 2ause. au4s1eh 2au3sen au4s3erb au4serf au4s3erk aus3erp au4serw 1ausg au2sin au4sis 1ausl au2so aus1or au2spr 1ausr auss2 3aussag au3sse aus4se. au8ssende aus4ser aus4ses au2st2a aus3tau 2auste au4stec aus3tie aust2o au2stö aus3tri 3ausü 1ausw 1ausz auße2 a4ut au2tab au2t1äu 2autb au2t1e2l au3ten. auten4g au4t3erh aut5ero au3tet 2autg au2thy 1auto au2trö 2auts 2auu 2auv auve4 2auw 2aux 2auz auz2w 2a1ü a1v av2a a3vang ava3t2 avener4 2avi a2v3r av2s 2a1w awi3e a2wr a1x ax2am a2xans a3x2e a3xid a2xio axi2s1 2a1ya a1yeu ayma2 ay1of aysi1 ay3t a1z az4a a3za3d 3azal a3z2i az2o a3z2u az2zen az2zw ä1a 1ää 2ä1b ä2b3l äb2s äbte3 ä1ce ä1che äche1e äche4n ächenma5 ächenmas8 ä1chi äch3l ä2chr äch4sa äch2s1o äch2sp ächt4e ä1chu ä1d ä2da ä2d1ia ä2dr äd2s äd3te 2ä1e äe4k ä3eu äe2x äfe4n äf2fl äf3l äf3r äf4ro äf2s äft2 äft4s ä1g ä2g1a 1ä2gä ägd2 ä5ge ägen4e äge2r3a ä2g3l äg2n ä2g3r äg4ra äg2s äg3sta äg3str 1ä2gy äh1a 2ä1he äh1ein äher8gebn äher3t ä1hi äh1in ähl1a äh3l2e äh4l3e4be äh5ler 4ähm äh3na äh3ne 1ähnl 2ähr äh2rel äh3ri 2äh2s 2äht ä1hu äh1w 2äi ä1im ä2is ä3is. ä3isch. ä3isk ä1j ä1k äka2la äk3l ä2kle äk4li ä2k3r ä1la älbe2 äl4bl älk3 älks2 äl2l1a äl2p3 äl4schl ält2e älte1i ä1lu 2äm4a3 ämer2s ämi3en 2äml äm2ma4 ämmas2 ämoni3e 2ämp ämp7f4e äm2s ämt2e ämter3 2än. än2dr 2än2e äne2n1 2än2f3 änft2 4än3g2e änge4ra 2än2gl äng3le än2gr ängs2 äng3se 2ä3ni än3k2e än2k3l än2kr 2änn än3n4e2 2äns än4s1a än2s1c äns2e 2änz ä1on äo3s2 ä1pa 1äpfel äp2pl äp2pr äp2s1c 1äq ä2r3a4 är4af är1ä är2b3le är1c 2ärd ärde4s 2äre ä2r1ei ä2r1e2l äre2m är1emi äre2n ä2rene ä2rerh är2es är3ge ä2r1ind är1int är3ke ärm3arm ärm3at ärme1e ärm3ent ärno2 är1ob är1of är1op ä1rö är3re ärse2 är2seb är4seh ärs1er är2si är3spu 2ärt ärt4e är2th ärt4s1 ä2rü 1ärz ärz3te är2zu är2zw ä1s äs4c 2ä3s2e äse3g äse1i4 äse5ref äser4ei äse4ren äser2i ä5si ä3s2kr ä2s1p ä3s2s 2äs4s1c äss2e äss5erkr äs3sern äss5ersa äss3erw ä5sses äs4sh äs4s1t äs4t4e 1ästh ä2str ä1ß 2äßc äß1erk äß1ers ä2t3a2 2ä3te äte3a äte1e äte1i äte3l2 äte2n äteo2 äter4bl äte3se ät2et ä2th ä1ti ät1id ä1to ät1ob ät3r ät4sa äts3au ät2sä ät4schl ät4schr ät2s1i2 äts3l äts1or äts1p ät4s1t äts3te ät2tei ätte4n ät2tr ä1tu ätze3l ät2zw äu2b3l äu2br äu1c äu3d äude3 äuder2 2ä2uf 1äug äu4g3l 2äul 2äum äu2ma äum3p äumpf4 äum2s1 2ä2un äun2e äu3nu 2äu3r2 äure1 äu1s 2ä3us. 2äusc äu4schi äu4schm äu6schü äu3s2e äuse1i ä3usg ä3usk ä3usn äu2s1p äu3s2s äuss1c 1äuß äut2e äu2tr ä1v ä2vi 1äx ä1z ä3ze â1t á1n 5ba. b2aa b3a2ba 2babf 2babg ba2bl ba2br 2b1abs bach7t4e back3er back3s2 ba3d2e bade1i 2b1adel 2b1adl 2b1adm b1a2dr ba2du 2b1af 3bah bah6nene bai3d bais2 b2ak ba2ka ba2k1er ba2k1i ba2k5l ba2k3r ba2lab ba2l1ak ba3lal ba2lau baler2 ba4l3erk balk4a balke4 bal4lan balle4b bal4l3ei bal6lerg ball6erk bal4li4g bal4lo4k ballö3s 2b1am b2a3ma ba2me 4bamt ban2a 3b2and band1a ban4dal ban4dan ban4dar ban6deng ban2dr ba3n2e 2banf b1ang ban3gl ban4k1a banker4 ban2kl ban2kn ban2kr ban2ku 2banl b1anna ban2o 2b1ans b1ant 2banw b1anz ba2r3ab ba2rad bar3ast ba2rat bar3de ba2rei ba3r2en barer5ei barer4t barf4 3bars b1arz bar3zw 3b2as ba3s2a ba2sc bas2i bas4sa bas6st bas4t ba2str ba2ß1 ba4t3ent bat2o 3bau. bau3b bauer4l bauer4s bauer4w bau3fa bau1fl bau1fr bau3g2 b2auk bau3r bau3s2k bau3sta b1a2x ba1yo 3b2äc bä1ch 3b2äd 2b1äh b2äl 2bärz b2ä4s3 2bäug 4b1b bbe4n bbe4p b4be2se bb3le. bb2lö b3brec b3bru bbru2c bb2s bbu1 4b1c 2b5d4 bdä4 bdän3 bdome4 1be. 3bea be3ab be3an beat2m be3au be4au. 3beb b1ebb 1bec be1ch 2becht 2b1e2del bedi4 be1e2h bee2l be3ela bee4rei be1erh be1erl be1ert be1eta bef4 2b1eff be3g4 be2he. beh5ri bei3b 2b1eier bei1f4 bei4ge. beige4l beige4p bei3k4 bei3l2a 2b1eime be1ind be1inh bein6hal bein4hi bei3s2 bei5st beit4e beit2s beit4sk beit4sp 3bek 3bel be3lag be3las bel3d be3lec 4be2lek be2l1en bel3ere be2let bel3f bel3la belle4n3 bel3li bel3om be2lor be2löf bel3sz belt2 bel4un 1bem4 3b2em. 3b2e3ma 2b1emp 2bemul 1ben 3ben. be5nabe ben3ar be4nas be4nat be2nä4 bend3s2 b2ene be3nei be4n3end be4ners ben2eu 3beng be2nid be4nis ben3n 5benp b2ens ben4s3pa ben4spr benst4 3bensv 3bensz 2b1entb 2bentd 4benteu 2bentf ben3th ben6thei bent4r 2b1ents 2b3entw be2nu ben3un b2en3z2 be1o 2b1epi 2bepoc be1ra be2rak be2r3am be2ran bera4s berb2 berbla4 ber3d be2r1e2b be4reck be4r3eiw bere2m be4rene ber4erg ber4erw bere4sc bere2t berf4 ber4g3af ber4gal ber4gli ber4hab beri2d ber4in. be5r6inne berin4s be2ri4o ber3iss ber3ko ber3kr bermas4 berma7sse ber3n2a bern2e b1ernt be2rö4 3bers. ber5se ber3st4a ber3t2a bert2e bert2i berz2 ber3ze ber2zö 3b2es be3sa bes4abb bes2am be4sap be4sar bes2au be2sep be2s1er be2s1id bes2po bes3sa bess4e b3esst. bes3sz beste2 be6stein bester4 be6sterh be4s3tol be4st3o4r best4r be4strä be4s3tur be2sur be3s2ze 3bet be3tam be3tha be3thi bet2to be1un be1ur 3bev 3b2ew2 2b3e2x 3b2ez 2b5f4 bfal2 bflö4 bflös3 2b1g2 b5ga bgas1 bga4st bga4su bge3 bgel2e bge5n bges2 2b1h2 b5hä 1bi bi1ak bi2ar 3bib2 bibe2 biber1 bi2c bi3do bieres4 bie4str biet4s 3bietu biga1 bik2a bi2ke. bi2kes bi2kre 3bil bil4deb bi2lei 4billu bi2lu 2bimp 2b1inb bin2e bine4n b1inf bin4fo bin2g3a 2b1inh bi2n3ok bin4ol 2b1int 2b1inv bi2o3 bioi2 biri1 3bis bis2a bi3si b1iso bi2sp bis4s1c bi3sta bi2s1to bi3str bi2stu bi2stü b2it. b2ita b2ite b2iti bit4r bit2ta2 bi2tu bi3tum bi3z2 2b1j bjek4to 2b5k4 bl4 2bl. bla3b4 2b3lac b3lad b2lanc blas3er b2latt b2lau. b3laus 2b3law 2b1län b2läse 3blät b2le 3ble2a b3leb 3blec b3leg 4bleh b4lei. 2b3leid 2bleih b3lein blei3s 2bleit ble3l ble2n b3lenk b3lese 2blesu ble3sz 3blet b3leu 2blich 3blick b2lie 2blief 4blig b2lind 2b5ling4 b2lis 2blis. b2lit b3lite b2lo b4lo. 3b4loc b4loi b3los2 blo3sse 3b4lum 2blun b2lus 3blut blut1o 3blü 2b1m bmas2 4b5n2 bnas4 bni2 bnis1 bo4a bo5as b1o2b bo3ben bob3r bo1ch2 bo3d2 boe1 bo2e3i 2b1of bo3fe bo3he boh2ra boh3rer boh2u bo1is bo2lan bo2lau bol3le 3bon. bo3n2a bon2da bon2d1e bo2ne 3bons boo4l boo2ti b1op 3bor. bo1ra bor2an bo2r3as bo4rä bor2da bor2d3r bo2rei bo4rig bor3m b1ort bor4ter bor6t5rat bo4ruh bo2sc bo3se bo4s3p 3bot bote3n4e bo3th bot2so bot2st bot3t bo2xo b1oz bö2b3 2böf 2b1öl 2b1p4 bpa2g 2b1q b2r4 2br. b4ra. 2b3rad 2b4rah b4ra3k bra4ss brast4 2b3rat. brat3er4 bra6terg 2b3ratg 3brä 4bräd brä4u 2bre. 6b5rechte 2b3red 2b3ref 2breg b3reif 2brek b4rem b4ren. 2b3rent 2breo 2b3rep b4rer b4res. b3rest b4ret bret6t5en b4rez bri2da brie4fa 2b3riem b4rien bri2er b3ries 2brigk b4rina 2b3rind b4rio b4risc 2briß b3ritt brob2 2b3roh 2b3rol bro2ma b4ron 2b3rost bro2tr brot3t4 2b3rou 3b4rö b4ruc 2bruf b4rum 2b3rund bru4s brust3 bru2th 3brü 4b3rüb brü4ss 2b1s b2sad bs1amb b4samt bsas2 bsa3sse bsau2r b4s3är b3säu b5sc bsch2a b6schan b6schef b6sco b3se. bs1e2b b3sel. bse2n1 b3sen. b2s1ent bs1er bs3e4r3in b3ses b2sim bsi2t b4s3ki bs3kr b2s1of b3s2oh b3sol b4sop bso2r b2sö b3s2pi bs2pl bs2pu bss2 bst1a2b bs2t1ak bst3ank bs2t1a4s bs2tau b3stä bs1tät bst3emi bst1er b4stern bs2t1h bst3ink b2stip b3sto b4stob b4stod b4stor b3stö bs2tr b3stra b2s3trä b4s3treu bst3ro bs2tu b3stü b4stüb b2s1un b3sz bs2zep bs2zi 4b1t b3ta bta4st3r b5te b2t1h bt2i bti2s bt4r btran2 bts2 btü1 bu4chec bucher4 bu6ch5ers bu3ches bu2chi buch3s4p bu2e3 bu2f bug3 bu2gr bull3a 2bumf 2b3umk 2buml 2b3umr bun4a bun4d3er bunde4s b1une b3un3gn 2b1unh bur1c b2ure b2urg burg1a bur4gan bur4gar bur4gin bur2gr bu3r2i 2burn b3ursa burt4s bu2sa bu2sc bus3cha bu3sche bu6schei bu6sch5el busch3w bu3shi bu2si bu2s1p bu4sses bussy2 buster4 bu6s5term bu2s1tr bu2su but2a buto3re 2büb bü1c bügel3e bü3s4 2b1v 4b5w 3b2y1 bya4 byo2 by3p2 bys2 2b1z4 b5ze bzeit1 bzu1 1c2a cab4 ca3bl 3ca2c ca2e3 ca3g2 ca1h cal2a cala3b cal2f3 cal3t2 2can cana3 ca2pe car3n2 carri1 car3tr ca3s2a3 ca3t2h ca1y2 cä3 cäs2 c1b 2cc c1ce c1ch2 c2d2 c3do 2cec 1ced ce2dr ce1e 2cef ce1i ce3in 2cek 3cels cen3a ce3nu cen3un ceo2 1cer cer3a cere1 cere3u ce3r2i ce4ris ce1ro ce3s4h cet1am ce1u 1cé c1f c1g4 c2h 4ch. 2chab ch3a2b3i 2chac 2ch1a2g ch1ah 2ch1ak chan4a 3chanc chan3f ch1ang 4chanl 2chanz 1chao 2char. 1chara 3chard 3charta cha2sc chasi1 1chato 2chatt 2chatu ch5austr chau3t ch1äh ch1ärm ch1äs 1châ 2chb 6chc 2chd che3b4 ch3e4ben ch3echt ch1edi che2el 1chef 3chef. che4fer 3chefs 2chei ch1eim 4chelem che4ler 1chemi 3chemik 2chemp che4neb che4nid che2no 4chents 4chentw che2r3a 4ch3erbs 6chergeb 4cherke cher6zie ch3es2s 4ch1e2ta 2ch3e4x 1ché 2chf 2chg 2chh 1chia chi3na 4chind 3chines 2chinf 2chinh 2ch1ins 2ch1int 2ch1inv 1chip. 1chiru 2chiso 2chj 2chk 2chl4 ch2le chle2i ch3lein 4chli ch2lu 4ch2m4 2chn4 chner8ei. ch2neu 2chob cho2f ch1off chof2s ch1oh cho3l2a ch1orc cho4rei ch1ori ch2os ch3öl 2chön 3chör 2chp ch2r4 2chra ch3rad chra3g 2chre chre3s ch3rh 2chrit 3chromo 3chron ch5ros 4chs ch4stal 2cht ch2tru 2chuf 2chuh 2ch1unf 2chunm 2chunt 2chur ch1urs 2chut 2chü 2chv 2chw 1chy 2chz ci1c ci1es c1ind cins2 c1int ci2s1 1ci3t2 c1j 4c2k c4k1a cka2b ck2ad ck2ag cka2m cka4r1 ck1ä ck1ef ck1eh ck1ei cke4na cke2ra ck2ere ck3er4hö ckerk4 cker6lau ck2ern cke2ro ck1err ck2et cket2t ck1i2d ck1in ck4is ck3l ck5n ck3o4 ck3ö2 ck3r cks2al ck4spen ck3te ck3t2i ck1uh ck1um ck1up c2l2 cle4a clet2 clin2g cli2p1 clip3a clo1c clo3f 1clu clu4b c2m2 c3me c3mu 1co co1ch 3co2d2 co4de. co3di cof3f2 coi4 co1it co2ke co3la1 co2leu co3l2o com4te. comtes4 con2ne co2o coo1p co1p co1ra cor2da co4re cor3t cos4 co2te cou3si 2cp c1q 1c2r2 cra4s c3rä c4re2 2cree cre4me 2cri cros4 2cry 2c1s2 cs4f c4si cst2 4c1t cti2 cti4o2 ction5 ctur6 1c4u 2cua cu2e cu2p3 cup1e cussi4 c1w 2cx 3cy c1z 3da. da1a 2d1ab d3a2bak d2abä d2abe d3a2ben d3a2bi da3blu d3a2bo dab4ra da2bri da3brie d2ab4rü d1ac dach3a da2cho 4d3achse 2d1ad da2de da2do da2d4r d1af 2daff da1f4l dafo4n d1ag dagi4o dag2o da1h dah3l dail5 da1in 2d1air da1is da2kro dal2a 2d1a2lar dal3b2 4d1all da2lop da3lö 2d1alp d1al3t2 2dalte da1lü 3dam da2mei d1amma 4d1ammä damo3 d2amp damp7f8erf 4d1amt 3d2an. d1ana da2nan da4n4at 2danb dan4ce. d1and2 2danda d2andy 3dane 4d3anei 2danf d1ang 2danh dan2kl dan2k1o dan2kr 2danl d1ann 2danna d1a2no 2d1ans 2dantw 2danw d1anz d2anz. 2danzi 2danzü 2d1ap d2apa d2aph da2po da3pos 4dapp d3apte 2daq da4r1a dara4s 2darb2 2d3arc dar2d1e dare2 daren1 dar3g dark2a 3darl dar2m1a dar2m1i dar4mu da2r3o 3dars4 2d1art dar2th dar2tr da2ru d1arz das2 da3sh d1asp das3s dat2e2 da3tei 4d3a2tel date4n da2th 2d3atl 4datm d3ato dat2st 2d3atta 3daub 2daud dau3e2 dauer3e daue6rei 2d3au2f 2d3aug 2dauk da3unt 2d1aus dau4ss dau2ß 3daw d1ax 3däc 2d1äg 2d1äh 2d1ämt dän3a 2d1änd 2d1äp 2däq 2därz 2d1ä2u dä3us 2däx 4d1b4 dbau2c dbauch3 dbe2e dbu2c dbu3s 2dc d3ch 4d1d2 d3da d3dä d3de d3dh d5do 1de dea2d de3ar de3a2t deb4 3debü de1ch deco3 de2del de2dit 2de3e4 def4a de2fa. 2d1eff def4l deg2 degene7 de3gl deh2a dehe2 3dehn de3ho 2d1ehr d1ei 3d2eic de3i4den de3il 3d2eim 4deime dein2d de3inse de3inst dein6sta dein6sti 4d3einw de3io 2deise d4e1ism dei2sp 2dekz de2l1ac del4ade de3lak de4l3aug del3änd del3b2 del3d del1ec 3de3leg delei4g 2delek 2delem de2len deler2 deler4r 2delf. 2delfm 3delik della3d del4lan del4lar dell3au del2l1ä dell3eb del4lei del4ler del2lö2 de2l1ob de2lop del2se del2so del2s1p del3t dem2ar 2d1emb dement4 de6mentg dem5ents de3min 2d1emot 2d1emp d2emu d4en. den2am de2n1e2d de4n3end de2nep 4denerg de3n2es 4d3en4ge. de2ni denk3li deno2s deno4st dens4am den6s5cho dense2 4den4sem den6sere den6s5tau 2dentd den3te 2dentf 2dentg den3th 2dentn 2dentw 2dentz den6zers de2ob 2deol dep4l 2depoc d4er. der3af de2rak dera2n de3rand de2r3ap de1r2as de4r3asi der2bl 4d1erbs 2derdb de2r1e2b de4reck de3reie de4r3ei4s 5d4erem d4eren de4r3end 5d4erer der4erf derer3n der3ero derer4t 5d4eres de2r3eu derf4 d4erfl d3erheb d2erhü de2r3id derin4f de6rinnu derin8teg der3k2 4derklä d4erlan d2erm de1ro derö4 der3r derst2 der3sta dert7ende. derter6e dert4ra 6dertrag der8trage 3de3ru de4ruh de4rum 2d1erz. 2d1erzv d2es. de2sa de4s1ag des1ah de4s1am des3an de2s1än de2seb de4s1e2h de2sei de4s3eil 2d1esel des3elt de3sem de3s4end desen3e de3sens des3erm de2s1et de2s1in 3desk des1o de2sor de2s1p de3spe dess2 des3se des5st de6st5alt de6stant de8steige de8steins des4tex de4stit de6st5rat de4stre de2su des1un 3desw de3ta deten4t 2d1e2th 2d1etw 2d1eul deum3 de1un de1url de3us 2d1e2vid devil2 de1x2a de2xer de2xis 2dexpe 2dexpo 2d1f6 2d1g2 dga4s3tr d2ge. dger2 dge3s d2gesh dge2t3a dge4t1e 2d1h2 4dho d3hu 1di di4ap di2a3s diat4 di4ath 3dic di1ce di3chl dicht6er dick3el 4d3i2co 3dida d1ide 2didee di2den 2didy di2e di3e4d di3enb di3end die4neb diener6l di3e2ni dienst5r die2p di3ers. dies3c di3e4th 3dif 3dig dig4n dik2a dil2s1 2d1imb 2dimp din4a 2d1ind di3n2e 2d1inf 3ding 2d1inh di3ni 2d1inj 2d1ink 2d1ins 2d3int 2d1inv di2o3b dion3in dion5s2 di3ora dios2 di2osk di1p2 di3pt d1i2ra di4re. di2ren di2rin di2ris 2d1irl 2d1irr di4s1a2 2d1iso di2sp di3s4per 2d1isr dist2 di2s1to di4s3tra di4sz di2ta dite1c di4t3erl di4t3erm di4t3ers di2tin di2tob di2t3r dit3s di2t1u di5v2 diz2 2d1j d2jar 2d1k4 4d1l2 dla3g dlap4 d3le dle2ra dli4f dl3m dl3s 2d3m2 4d3n2 dni2 dnis1 dni3v do5at 2d1ob 3d2oba do1chi d1of do2fe 2d1oh do3ha doll2 dol3la d3oly 3dom do2mal do2mar domen1 do3mi do4ming 4domn do2mu do3n2a do5nan doni1 4dony 2d1ope 2d1opf do1r4a 2d1orc 2d1ord dor2f1a dor2fä dor2f1i dor2fl dor2fo dor2fr dor2f3u 2d1org d2orn 2dort dor4ter dor2tr d2os. do3se dos2k 2dosm dost1 dost3a dosten4 do3ta do2tof do3un dow2s d2o3x2 d1ö dö2d dö2f döl3 dölla3 d2ön 3d2ör dö2s1c 2d3p2 dpass3 dpol4n dpo4st1 2d1q d2r4 3d4ra. 3d4rab 4d3rad 2drahm 2d3rak 3d4ral d3ramp d3rand dran3k dra4s3s 2d3rast dra4tin 2draub 2d3rauc d4rauf 2draum 2draup 2dräd d4räh 2d3rät 2d3räu 4dre. 2d3rea d4rea. d4reas 3d4reck 2d3ref 4dreg 3d4reh dre2ha 2d3reic 3d4reie drei3s d4reiv d4rej 4drem 4d3ren d4reo 4d3rep 4d3rer 4dres. d4resc dres6sei dres6sel d4rew 2drez 2d3rh d3ri 3d4ri. d4ria d4rib 4d5ric d4rid d4rie d5rieg 3drif 4driff d4rift d4rik d4ril d4rin. 4d5rind 2drip d4risc 2drisi 2driss 2driß d4rit 2d5ritu d4rix 2d3rob d3rod 2drogg 2drohr 3d4rohu 2d3roll 2d3rose d4ross 2d3rost 2d3rot 2d3rou 2d3rov d3row drö2sc d5rub 3d4ruc 2d3rud 2d3ruh 2d5rut drü1b 3d4rüs 2d1s 4ds. ds3ab d2sad ds1al d2salk d2sall d4s1amt d2san ds3ane ds3assi dsau2 d2saut ds1än ds2äu 4dsb d4schef d4schin d3s2co d2scr d2s1e2b dse2e d2s1ef ds1ehr ds4eign d2sein d2s1emb dsen3er d2s1eng d2s1ent d2s1erf d2serh d2s1erk d2s1erl ds1err d2s1ers d2s1ert d2serz dse2t d2s1eta d2s1ev d2sex d3sha2 ds2hak d4shal d3sho d4shor d2sid d2s1im d3s2inf d3s2kal d3s2kel 4dsl d4sli d3soh d2sop dso2r ds1ori d2sö ds1pa4s3 d2s1pat d2spä d2s1pec ds2pen d4speri d2s3ph d3s2pi ds2por d6sporto d3spri d2spro ds2pu dss2 dst2 d4stabe d2stas ds3tauf d4s3täti d4stea d4stele ds2til d2s1tis d4stoch d2stod dstras4 d4stren d3s2tro dsu2m d2sun ds2zen 2d1t dta2be d3t2ac dtach3 dta2d d3t2ag dta2n dt3ane d3t2as dt2ax d3tea dte3mo dt2et d2th d4thei d3to2 d4tob dt2op d3tö dt3r dtran2 dt1s dt3sa dt5st dtt4 dt2un d3t2ur d3ty 1du du1alv du1ar du2b3li du1ce duel3la du2f 2d1ufe duf4ter duf2to duf2tr 2d1uh du1i du2in du2kr dul3art 2d1umb 2dumd 2d1u2m1e 2dumf 2dumg 4d3umk 2duml d2ump 2dumr 2d1ums d2ums. 2d1umv du2n 2d3und 2d1unf 2dungl 2d1uni dun3ke dun2kl 2dunr 2dunsi dun4st3r 2dunt 2dunw 2d3unz du1os dup4 dur2c durch3 2d1urk 2d1url 2d1urn 2d1ursa 2d1urt du4schn du4schr du4sch3w dus2t 1dü 2düb d3über 2d1v2 2d1w dwa2 dwa4r dwer3te dwe2s dwe4st1 1dy dy2l1 dym3 3dyn dy2s1 4d3z2 2e1a ea2be ea2b3l ea4br eadli4 e3a2dr ea2g ea3ga2 ea3g4l eakt2 e2akta e3akto ea2la e3alei e4alem ea4l3ent ealen4z ealer2 e3a4lerg e3alex e3a2lin eal5le eal3lö eallö3s eal1o ea2lon ea2lop e2alti2 eal3tr ea2l3u2 eam3a e2ame eam1o eams2 eam3t2 ea4na ean3a2r e3anf e2ano e3ar. ea2ra ea3rat e2are e4are. ea2r1ei ea4rene e4arer e4ares ea2ro e3arz e3a2sc e3asf easin4 ea2sp eas5s eate2 ea3te. ea3ten eater1 eat4mes eat2mu eat4mun eat3s e3at3t4 eatu2 e3aue e3auf eau2fe eau4fl e4aufo eau3n eaus3s e2av e2az e3ä4 e1b 2eba e3bak eba2p e3bän 2ebec ebe1er ebein7h eb2el ebe4ler ebe2lo ebenen3 e3ber ebe4ras ebert4 ebese2 ebe4s3eh ebe2so 2ebet ebet4s 2ebh 2ebi 2ebl eb2laß e3blä eb3le. eb3ler eb4leu e3blie eb3lo eb2lö 2ebo e2bob ebö2s 2ebr e5brau eb4rea eb2s eb6sche ebse2 ebs1in ebs1o ebs1p ebs7panne ebs3tau eb4stät ebs3t2h ebs1ti eb4stot eb3str eb4sz 2ebu e2bunt ebus3s ebu2t3 2eca 2e1ce ech1am ech1ä 2e1che ech1ei ech2en1 e6ch5erzi e1chi ech3l ech3m ech3n e2cho. ech3ö2 ech3r ech4ri echs4er echst5re ech3tab ech3t4ei ech6terh echter8ha e1chu ech1w 2echz e1ci eci2a ec4k ecke4n1 eck3ser eck4sta 2eckt 3eckty 2e1cl 2eco 2e3cr 2ect e1d ed2a ed2dr ed4e ede2al ede3n4er eden4sa eden4s3e eden4s3p edeo2 ede2r eder3a ede3rat ederer4 edert2 ed2i e3di. 2edip edma3 edmas2 e3d2o ed2ö e3drei ed2sal ed4seh ed2s1es ed2si ed2s1o ed2s1p ed2sto ed2s1tr ed2s1u edun3 edund2 e3dy3 edys2 2ee ee3a4 eeb2l ee1c ee2ce ee2cho e1eck eed3s2 ee1e2 e1eff eef4l eeg4 e1ei ee2i3e eein4se eei4sc eei3se eeis3s e2ela eel2e e3e2lek eele4n eel2ö e2e3m2a eemas3s e1emb ee3min e1emp e1en eena2g e2enä e2enc een1e e3eng ee3ni e3enk e3enl e2eno een3s een2z ee3o e2ep ee3po eer4at e1erbt e1erd ee3re2 eer1ei ee4r3en4g eer2e4s1 eer3eti e1ermä ee1ro ee1rö e1eröf eer2ös ee3r2un e1erz ee3sh ee3sp ees2t e2et. ee3t2a ee4tat ee2th eet2i ee3t4r ee2tu ee1u2 eewa4r eeweis4 e1e2x e1f e2f1ad e3fah ef1ana ef1ar e2farc ef3arm e2fat 2efä ef2äl efä5sse e2fäu 2efe e2f1e2b e3fef efe4l3ei ef1em e2femi efe2n1 3e2f1ene e2fent efer5f eferin6d efer5r efeuil4 ef2fä2 3effek 1effi ef2fl ef3flu 2efi ef1id e2f1ins efi2s 2efl ef4le e3f4lu e3flü 2e3f2o 2efr ef4reih ef3rol ef3rom ef4ru ef4rü efs2 ef3sc ef3so ef3sp ef2tan ef2tei ef2tro 2efu e2fum e1g ega2m e3g2anz egd4 e3ge egein3 ege4lan ege4l3au ege8l7ei8er ege4ler ege2lo eg2en ege4n1a ege6nero ege2ra ege5stal ege4s3to ege4s3tr ege1u 2egi e3gio 2egl e2glo e2glu e2gn eg3nä eg3ni ego1p egro5sse eg4sal egsau3g eg3se eg4sei egs2e3l eg3si egs2of egs2pe egst2 eg4sto eg2th 2e1ha eh1ach eh1ad eh2ade e3h2ah eh2al ehalt4s e3hand e2harz e3haut e1hä ehäs3 e1he eh1eff eh1ein eh1elt e4hense e4h3ente ehen4tr ehe3o 1e2hep 2eher ehe1ra e2h1er2f e2h1er2l 2e1hi eh3im ehis4 ehl1a eh1lam eh2l3au eh1lä ehl3ein eh4lent eh5l2er ehlo2 ehl1or eh2lö ehl2se 2ehm eh2mab eh4mant eh3mu eh3na eh3no 2e1ho eho2f eho2l eh3oly 2e3hö ehö4rer eh2r1a4 ehr1ä ehr1ec eh2rei eh2rel ehr6erle ehr4ern ehre3s eh4rin eh1roc ehr1of eh1rö eh2s2 eh3sa eh3se eh3sh eh3si eh3so eh3sp ehst2 eh3sta eh3sto eh3str 2eh3t2 eht3h eht4r 2e1hu e2hum eh1unf e2huni e3hur e1hü eh3üb eh1w e1hy 2ei3a2 eia4t ei2bar ei2bli ei4blu eibu2t ei4b3ute e4ic ei1ce ei2cho e2id ei2d1a ei3de ei4deis eid5erre 2eidn ei3do ei3dr ei1e eie2b eie2d ei3e2l eie2m 4ei3e2n1 eienge4 ei3e4s eie2t 4eif. ei1flo 1eifr eif3t 2eig. 2eiga eig2ar 2eigä 2eige. 2eigeb 2eigeh 4eigeno 5eigensc 4eig2er 2eiges 2eigew 2eigi 1ei2g3n ei2go ei4g3rat 2eigre 2eigrö 2eigru 2eigrü 2eigs 2eigt 2eigu 4eih ei2hum ei2kab ei2kak eik4am eik2ar eik2i eik2l ei3k4la ei3klä eik2o e2il 2eil. ei4l3ab ei2lam eila2n ei4l3ane ei4lang ei4l3anz ei2lar 2eilb eil3d4 ei4lein eile2n1 ei2let eil3f4 eilm2 ei2lob eil2ö 2eim. ei2mab ei2m1ag eim3all eim3alp eima4to ei2m1or 2eimö 2eimp eim2p4l eim3sa ei2mur e4i2n1a ei4na2d ei4nae ei4n3an ei4na4s ei4n3at ei2n3ä ein3d2e ein6derk e1indu 2eineb einen4e ei4n3en4g ei6nen6se ein5erbe ei4nerf ei4nerk ein5er6la einer6sc ei2neu ein4fiz 5einflus 5einfluß 2einfo ein4fo. ein4fos ein3g2 3einger e2ingr e2inhä ei2nie e1init ein3k4 ein6karn 3einkä e2inl ein3n2 ei2n1o4 1einri e6insa einsas6s einsa7sse 3einsat e2insc 5einschä ein6stal ein6terv 3eintö 3einträ 1einu ei3o eio2p eio2s ei1p eip2f 2eir eir2c ei3re e1irr e4is. ei2sa ei3sas ei6schwu e4ise ei4ser4g ei4s3er4l ei6s5erst ei4s3erw 1eisho ei3s2ky ei2so eis2pe e2i3s2s eisser6s 4eisto eistra6s ei2sum ei2sur 1eiswo e2it ei2t1a2b ei2tal ei2t1an ei2tap ei2tar ei4tat 2eitä ei2tän ei3tei eite4ra ei2t1h ei2tin eito2 ei4trau ei2tro eit4sa4g eit3t4 ei2t1um ei2t1ur eit3z2 eiv2 eive4 ei2zar ei2z1in 2e3j e1k 2ek. 2e3k2a 1ekd ek2e e3ke. e3ke4n e3kes e3key e3k2l ek4lo ek4n e3k2o ekor4da e3kr ek4s1p 2ekt ek5t6ante ekt3at ek2t1ä ek2te2l ekt3erf ekt3erk ek4t3er4z ekt2o ek2t3o4b 2e3ku ekur2a e3k2w 1ekz e1la el2abt el3abu el3ader el1af ela4h e2l1ak e2l1a2m el2a3mi e3lamp el1ana e4landa e2lanm e4lans e2l1ant e4lanw el1anz 2elao e2l1ap e2l1ar el3a2ri el1a4si el1asp el3aufw 2e1lä e3läd 2elbil 2elbr 2eld elda2r eld3ari eld4arm el4d3erf eld3erl elder4p elder4s eld5erst el3des elds2 4e3le. 2e3lea elea2r 2e3leb 4ele2c el1ech 1elefa 4eleh el3ehe. 2elei e6l5ei6ern e2l1ein e3leine e5leit 1elek 2eleko e2l1el 1e2lem 2e3lem. e3lema ele2mi e3lemm 2el1emp 2e3len. elen4k3l e4lense e2l1ent e3lep 2eler e3ler. eler2a el1erd e6lereig el1erf e4ler4fa e4lerfi e2lerg el1erh el1erk e2l1erl e4l3ernä eler2ö e2l1err el3eru el1erw e2l1ess e2l1e2ta ele2ti elet4ta 2el1ex e3lex. 1elf. elf2er 1elfm elf4r 1elft elgi5er. elgi5ers el3g2l elg4r e2l1id 2e3lie elif3 2elig e2lim elin3a eli3no el1ins 2elk elks2 ella5den el2lap el4larb ellar4t ella2s el3le. ell2ei ell3ein el4lel ellenen5 ell2er eller8fas eller7g ell3erh el3lie el2lil 1ellip el2lo2g el2lor el2lot ell2ö ell3sp ellu2m el2lü el3m2a elm2e elm3ein 2eln el3na 2elo e2l3oa e2lof e2lol e2lom e2lonk el1opf el1or elo2ri e3lot e3l2ov 2elö el3p4 el4s5ein el3sent el2sum el4tans el3te. elte4m el5ten. el4t3ent elter4b elter4f elt3erh elter6le 3elter4n elt5ero elter6sc elt3eth el3the elt1r elt3se 2e1lu el1uf e2l1um e2l3u2r el3use elu2t el3uto e1lü 2ely e2lya el3z2ac el2zar el4zene elz1in el2zwa 2elzy e1m e2m3a2b e2m1alk em3anf e2m1ano e2m1ans 1emanz e4m3a2sp emas2s ema3sse e3maß em1au 2e3mä em2äh 1emba 1embo 1embry em2dä emd1r em2dra 2eme e2m1e2b e2mef eme2i e2mele em2en emen6gel emen4t3h eme3r2i e2m1er2l em1erw 3e2meti e2m1i2d emi2ei e2mig emik2 em1im 2emin emi3n2a e3mind em1int 1e2mir e3misc emma3u em2mec e2moa e3mol emo3s 1empf4 em3pfl em3po em2sa em4scha em2sim em2spr ems1tr em3t2 1e2mul 3emuls emune7 e3mur e3mus 2emü emü3s2 e2na 4ena. e4na2b en3aba en3abo 4enac e4n3ack enadi4 e4naf 4enah en3ak en1al enal2a e4nalb e3nale en2alg ena3l2i e4nalk e4nalm e4nalo enal3p 4en1am ena4n e4nand en3ane e4nant e4nanz en1ap ena2pa en3are en3ark en3aro en1as ena2sc e4na4st 2enat 4e5nati e4natl enat4s e4n3att 4enatu e4nau2f en3aug e4n3aur e6nausta e4naut en1a2x en1a4z en1ä en3äb e3näi e2när en2ä3s en3äst enbu4s3 en2ce. end2ac en2dal en4dang 2endel ende4lä endermas8 en4d3es4s en2dex en2did en3d4ort end3rom end3s2l end3s2p end3sz en3d2um en3d2ü 2ene. en3e4ben en1ec e2neff ene2h en2eid e3neien e4neige 4eneigu e4nein e4neis e2n1el ene4le 2ene2m e2n1emi 2enen e4nense e4n1ent en4entr en3envi en1ep 4e3ner. en2era e2n1erd en3erei e2nerf en4erfr 1energ e2nerh e2nerk e2n1erl e4nermi e4n3ermo 4enern e4n3erne ene2ro e2n1err en1ers 4eners. e2n1ert en4ert. e2n3eru e2n1erw 2enes e3nes. e2n1e2sc e2n1esk e2n1ess en1eta e2n1eth en1eul e2n1e2v e4ne2x en3f enft2 enf2u 1engad 1engag en3g2al enge3r4a en3g2i en3gn en3g2o 1engp eng4ra eng1s2 eng3se 2eni e3ni. e3nic 4e3nie eni3er. eni3erp eni5ers. en3i2ko en3ill eni4m en1ima en1imi e2n1in e3nio eni2ö e2nir eni4sa e4n3iso e3nit2 e3niv enk3aus 3enkeli enk3erg en4k3erk en3k2ü en2nef en2nel en4ner4f enn3erg en4n3erl enn2i enni6ger 2enniv e2n3oa e2n1ob e3nobel eno2br e2nof en3oli en3olm eno2ma eno4n e2n1op e2n1o2r en2ora eno4ri 4enorm e2n1ost 4e3not eno2w 2e1nö en1ö2d en3sabb en2san ensas4s ensa5sse en5sche en2seb 1ensem en4sen3e ens3ere en3spo ens4por ens4tak enst5alt en4s3tät ens4tel en6stele en6s5test 2ensto enst2ü en2sun en3t2ag 2entan en4tanm en4tanw en3t4ark 1entd en3t2el ente2n 3entera en4terb en3tes 1entf 2entfo 1entg 3entgeg en2thi 1enthu 1enthü en2t1id 3entla 1entn en2tob entopf3 en2t1os 2entö en4t3rol 1entsc 1entso ent4sto 1entw 4entwet 3entwic 1entz en1u e2nuf e2num enu4r 2enu2t e4nuto e1nü 4enwü 2e1ny en3zare enz2äp 1enzep enz3erg en4z3erk en4zerl en4z3erm enz5ersc enzi2d enzlan4 enzo2l 1enzy e1ñ 4eo e1o2b1 eo3ben eo3bl eo3bo eo3br eo1c eoch2 eo3dr e1of eo3g2 e1oh eo3la e3o2ly e1on e3o2nat eo1o e1ope e1opf eop4r e1or e3or. eo1ra e3orb eorgi1 e3ors eort4 e3orw eos2 e3os. eo3se e1o4ste e1ou2 eo1ul e1ö2 e1p 2ep2a epa2g epas6ser 2eper e3p2f4 e5pfi eph2 1e2pid e2pig e2pik 1e2pile e3pio 1epis 2epist 1e2pit ep3le 1epoc eport4 1e2pos. ep2pa eppe3l ep2pin ep2pl ep2pr 2epr ep3sh ep2tal ept2an ep2tau 2e3pu epu2s 2e3q er1a e3ra. era2be era3ber era2c e2rach e3rad. e3radi e2radj e2r3adm e4radmi e4r3adr eraf4a era2g e1rah e1rai er3aic e3rake e1rald eral4eb er3alke e2r3all era4mat er2an. era4n4a eran3d4 e3rand. e4rangr e2ranh e2rano e1rap er3apa er3apf e2rar er3are e3rari e3ras. era2si era4sie era2sp era4s3s e1rast era2ß e4ratel e1raub e1rauc er3aue erau2f er3aug e2ra2v e1raw e2r3ax e1raz e1rä er1äf er1äh er1ä2m er1äp e2r1ä4s er1ätz 3erbarm erb2au erb2e 2erbru erb2sp er1c er3chl erch2o erd4am erda3me 1erdb 2erdec 2erdel er4d3en4g erd3erw erdeu2 1erdg 2erdy 4ere. er3e4ben e3r2ech er3echs er1eck er1edi ere4dit er1eff e2r1e2h ere4i 4e3rei. e3reib er1eig 4ereih e3reik e4r3eime e4reink er3eis. er5eisar er3eisb er3eisf er3eisr erei5str e4rek er1e2l e2rele ere3lev 2erem 4erem. er1emi ere4mis e2remp 2eren 4e3ren. e3rena eren1e e4rense e4rentn e4rents e3renz eren8z7en8d er1epe 4erer. 2ererb e4r3erfo e2rerh e2rerk e2rer2l erer5lau 4erern. e4rerne e2rer2o erer4ri er1ers 4erers. e8rersche e2rert 2ererv 2ererw 2eres 4eres. er1ess eres3sk er1eß er1eta er1eu ere4vid erf2e 4erform erf4r 4erfür er4g3are 4ergebi 3ergebn 4ergebü 4ergeha 4ergehä erg5elst 4ergeni 2ergn er2gop 4ergrem erg1s2o ergs2p e4rh 1erhab er3hag 2erhai 4erhals 2erham 2erhan 2erhas er3hei 2erher er3hu 2eri e2riat e3rib 4e3ric e4r3ico er1id 4e3rie eri3en1 erien7s e3ri3k erik4l 4e3rin. e2r1ind e2r1ini er1ink er1inl er1int er1inz e2ri2on 4eris e2riso e2risr er1ita 3eritr e3riv 2erk. 2erkaj er3ker 1erklä 2erkm 2erkre erk3t4 er2kum 2erl. 2erlag 3erlebn 4erleh 2erln er3m2 ermen4s er4m3ers er4n3alt er3ne er4nene er4nerf er4nerk 3erneue er2nob erno2r ern1os 2e1ro. e1roa er1ob ero2bl ero2br e2r1o2f e1rog e1roh e1rok e1rol er3oly e1rom er3omb 2e3ron e2r1oo er1op 2e4ro4r eror2a e1ros 1erosi e3rosit e1rou e1row er1o2x er1oz erö2d 2eröh erö4l er1ö2s er3p er4rade er3rä 2erren er3ro 2errü er3s2a ers4ana ersch4 er5schn 4ersei ers2el er5s2i er3sk ersma3s4 4ersted er6st5ers 4erstil er3swi er3sz er2t1ab er3tat er4t3erf er4t3er4g er4ter4h er4ter4k er4ters ert1h er2tho 4ertö 4ertru ert3s2e ert1s2p 2eru eruf4s e4r3uhr er1u2m1 er1und e4rundu er1up. er3ur er3use e2r3uz erü4b 3erweck er4zerk er4z3ers e1s es3ab es2abb e4sabe e3sac esa2d e3saf e4sall es1ami es2an es4and es3anf es3ant esa2ra e3sa1s2 esa3ss esa5sse esa2v es1ax esäs4 es2äu 2esb esbi5er. e3s2ce es2chi esch2l esch2n e4sco e3se. es1ebe e2s1ec es1ehr esein4s es2el ese4nal ese4neu e3senk esen3o esen3sk esen3th eser4at ese4r1u2 eses2k es3e2x 2esf 2esh es3ha es4ham es4har es3he 2esi esi1er e4s3i2k e2s1il e4s3ins e4siso es2kat e4s3ke e4s3kl e4s3ky e4s3l 2esm e4sn e2s3oa e4sob e2s1od es2oh es2opa eso2r es1ora eso3re es2ort e3sot e3s2ö 4esp e3spal es4park es2pek e4spers e4sph e3s2pi e3s2por e3s2pu 2esr 2ess. es4s1ag essali3 essau4s 1essay 2essä 2essc e4ssel e4ssent ess6ere ess4erf e4ss3erg es4serh e4sserl ess5er6la 2essk 2esso es2sof 2essp es2s1pa es2spu es4stab es4ste estab4b e4stabs esta3ge est1ak es2tan est4ap e4starb es2t1a4s e3stat es2tau e4staum es2te. este2c este4i est5eing e6st5eink e6st5einl este2l e4stele e4st3emi e4st3eng est5entr est5erha e4ster4ö e4st3erz estes2 e4st3ess e3sti e4stid e4stip estmo6de 1estn e2stod e4strad es3trak e5strec e5strick es2tu est3ums e3s2tü e3s2ty e3suh e2s1um es1ur esu4s 2e4sw e3sy e2ß1el e2ßent eße3re e2ß1erg e2ß1erl e1t e3ta. etab4 et2a2c 2e3taf 2etal etalla4 etal6lag etal6li6n et1ami e3t4an. et4at etat3r et1äh 2e3te ete2e e4t1ef e4t1ein ete3ke eten3d2 ete2o eter4hö ete1ro eter4tr ete4sp 2eth. et2ha e4t3hal e3the et2hi e4thik 3ethn et2hu e4t1i2d eti2m etin1 et1ini et2it eti2ta eti2th 2e3to e2tob e4t1o2f et4on eto4n3al etons4 e4torg 2etr et3rad e4traum et3rec e2t3res et4ros ets2c etscher7e etsch3w ets1p et1su ett1a et2ta2b et2tad et2tak ett2as et2tau et2tä et2tei ette4n1 et4th et2tö4 et2t3r et2t1um et2tur et2tü4 3e2tui e3tur etwa4r 1e2tym 2etz etze4s et2zw eu1a2 eu3b4 2euc euch4ta 2eud eudi4e 2eue eu2eb eue6r5eif eue6reis eueren4 euerer6s euerer6t eu3eri eu3erk eu3err eue3s eu2e5sc 4euf eu2fer eu2g1a euge4mi eu6gense eu3g2er eugin2 eugin4f eu4gin4g eu2gre eu2gri eug1s2 eu3h eu1id eu1in1 e4uk 1eukal eu2kä eulan2 euland3 eu3l2e eul2i 2e1um e3um. eu3m4a euma3s2 e3umb e3umf e3uml e3um2s eums1p eum3st e3umw 2eun eu2na eun2e eu4nei e3un2g eu2nio eu4nis eunk2 eun3ka eu1o2 eu1p e1up. eup2f e3upg eu4r1an eu4r3ast eura3t eu2rau eur1c e2ure euren2 eu4rens eur4er eur3f4 1euro 2eu1s4 e3usar eusch4o eu4s5k eu3sp eu3ss eust4 2eut eut2e eu5ted eut2h 3eu3tha eut2i eu3t2o eut6scha eut6schn eut6schr 2eux eu2za eu2zo eu2z1w e3ü e1v e2vak e3var 2ev2e eve5ri evie3le 2e3vor ev2s e1w ewä4 ewä6s e2we. ewei4sc ewert4 ewer3te e3wir ewi2s e3wit 2ex. 1exam ex3at 2exc 2exd e2xel ex1er 2exes e1xi 2exik e2xil e2x1in e3xio 1exis ex3l 1exp 2expu 2exs 2ext. 2ex2ta ex2tin 1extr 2extu 2extv 2exu e2xum 2e1xy ey1l2 ey2n ey3no eys2 e1z e3z2a ez2ä e2z1enn e3zi ezi2s e3z2o ez2w ez3z2 é1b é1c é1g égi2 é1h é1l2 élu2 é1m2 é1n é1o é1p é1r2 é1s é1t é1u2 é1v é1z2 è1c è1m è1r 1ën ë1t ê1p 1fa fab4 2f1ab5b fa2ben 2fabf 2fabg 2f1a2b5l 2fabn f2abr 2f1ab5s 2fabw fa4cheb fa4chel fa2ch1i fa2cho fachs2 fach3sp fa2ci fa2dan fa2del f1ader fa2di fa2dr fa3e fah6l5ent fai3b f1a2ka fa2ke f3aktio f4akto 3f2aku fa3la fa3le fal2kl falla4g fal4lei fal6lenk fall5ent fal6lerk faller6s falli4 fal6lini fal4lis fal6scha fal6schl fal6schm fal3te fal4tei fal2tr 3fam fa2mei f1amp f1amt 3f2an. fa2nar fand2a f2anf fan2ga fan2gr 2f1an3k 2fanl 4fann f1anp 2fanr 2fanw 2f1an3z 2f1a2p f2ar far2b1a far4bel far4b3er far4bin farb3l far2bo far2b3r far2b3u f3arc 3fa5ri far2r1a farre2 far4rec far4reg 2f3art 2f3arz 3fas. fa3s4a fa3sh f1assi fas2t 2f1a4str fa2ß f1aße f3at f4at. fa2to f4ats 2f1auf f3aug fau2s f1ausb faust3r 3f4av fa2xa 1fä 3fä1c fäh4rin fäh2ru f1älte 2fäq 3färb 2f1ärm 2färz fä4s fä6sser4 3fäßc fä2ßer 2f1ätz 2fäug 2fäx 4f1b4 fbau1 fber2 2f1c f3ch 2f3d4 fdien4e 1fe 3fe. featu4 f2ech fe2del fe2dr fe2e1i feein5 fe1em 2f1e2he fehle2 feh4lei f2eie f2eind 2f1eing fe3ini fe3ins. 2f1einw f1eis fek4tin fe2l3a2 fe2l1ä fel2da felde4m feld6erh fel2dr feld5ri 2fe2lek 2felem fe2l1er fe2les fel3la fel4lan fel2lä fe2l1o fel4s3oh 6fel6tern felt4r fel3tu f2em. 2femb fem4m 2femp fen3a fe2nä fend2a 4fenerg fe2ni fe2no fen3s2a fen5s2c fenst2 fen6stri f1ent fen3t2a 2f3entf f2enti 4fentla f2ento 2f3entw 4f3entz fe2nu 3fep fe2pi f2er. fe1ra fe2rab fer3a2d fe2ral fe4rang fer4ant fe4ranz fe2rau fe2r1ä 2ferd. fer3da fer3d2e3 f2ere fe2r1e2b fe2rec 3fer2ei 4f3ereig fer3eis f4erel fer3ell fe4rer4g fer4fah fer4fol ferg4 f4ergr feri2d ferie4n3 feri4on 4fer4leb f2ern. fer4nei fe2rö f4erpa f4erpf f4erpl f4erra fer4reg ferri2 f2ers. f2ert fert4r f2erz fess2e fes4t fe2sta fest3a4b fest3an fe4st3ei fe4stin fe2st1o fe2st3r 2f1e2ta 3fete fe2th fet4t3a fetti3s 2feu. feuer3ö 3few 2f1ex fe1y2 3fez 1fé 4f1f f3fa. ffa2b ffa2ce ff1a2d f3fak f3fal ff1alt ff1ans ff3ar ff4arb ffa4s ffa2t ff1au ffa4z f2f1e2b ffe2e f2f1ef f2f1ei ffe3in. f5fek ffel3l ff1e2m f2femi ff2en ff3erle f2fetz fff4 ffi3k f2fil f2fim ffi4xi ff1lag ff3le ff3li f3flü ffo2 ff1ori ff1ox f2fö f3f4rä ff3ro ffs2am ff3sch ff2s1p ffs4tau ffs3tie ffs3tut ff3stü ff3t2 ffus3s f2fy 4f3g2 fgeb2 fge3s2 fglim2 4f3h2 1fi 3fi. fi4ak fi2ar fi3at fiden2 fi2do f2ie fi2e1i fi1er2f fi2gr fi2k1as fi2kel fi2kin fi2kn fi2k1o4 fi4k3r f2il fi2l3an fil3d fi2les fil2et filg4 fi3li fi4lin fil2ip fil2ma fil2mä fil4med fil4mei fi2lo 2fimp 3f2in2a fin2e 2f1inf fing2 fings2 fi3ni f2ink fin2sp 2f1int fi2o fi3ol fi2r fi3ra fi4re fir3me fi3s4a fi4sch3a fi6schei fisch3l fisch3o fi4schr fi4sch3w fi3s2h 2f1iso fis2p fite2 fi2tin fit1o2 fi2tor five4 fi2xel fi2za 2f1j 3f2jo 4f1k4 fka4t3 f2l2 2fl. f3lad f5land f4lans f3lap f4lasc f3lats flauma4 1flä 3f4läc 4f3läd 2fläh 2f3län 2flär 2fläß 2f3läu f5le. 2f3leb f4lee 2f5lein flek3 flekt2 f3ler f4lex f3li. 3f4lim f3lind fli4ne f3ling 2f3lins 2f5lon 1f4lop flo7s8ses. 1f4loß 1f4lot flo2w f3lö 4flöf 3f4luc f3luf 1f4lug 1f4luss 1fluß f4lut flut1o f4lü f5lüd f5lüm 4f3m2 fma5che fma2d fmas2s fma3sse 4f3n2 fni2s 1fo f1ob fo2be 2fober fob2l 2f1o2f foli3 fo2na fo4nan fon3au fon3dr fo4n3in fo2nop fons2 fo2nu 2f1op 4f3org for4m3a4g for4mas for4m3ei for4min forni7er. for6schl for4sta for4sti for4t3ei for4ter5 for2t1h for2t3r fort3s2 for3tu for2u fot4r 1fö 2fö2f 2f1ök 4f1öl 4f3p4 2f1q f2r4 f3ra. frach6tr 2f3rad 2f3rah fra4m f3rand f5rap f3rat 1frau. f3rauc 2fräd 1f4rän 2fre. f3rec f3red 2fref f4rei. f3reic f4reie frei1f f4reig frei3k2 2frein 2frek 2f3rep 2frest 3f4reu 2f3ric fricht6e fri3d fri2e 2frig f4ri3k f3rip 1fris f4risc f4rist fri6ster 2f3roc 2frol 1f4ro2n fro4n1a f4rop fro2sc f3rot frös2 f3ru f4ruc f3rü 4f1s f3sac f2s1al f2sa2n fs3ane f4s3ar f2s1a4s fsa2t fs3ate f2saut fs2än f2sca f4sce f4schan f4schef f4schro f2scr f2s1e2b fse2ei f4sehr fse2n fs1en1e f2s1ent f2s1er fse2t f2s1eta f2s1i4d f3s2ky f2s1o2 f3soh f3sol fsp4 f3spann f2s1pas f2sph fs2pie f3s2pl f3s2por f2spre f2spro fs2pul fs3s2 fs2tal f2stas f3s2tat f4s3täti f2stip f2s1tis fst4r f4s3tres fs1trü f4stüte f2s1un f3sy 4f1t f2ta. ft1a2be ft1abl ft1af f3t2ag ft1ala ft1an f2t1ap ft1a2r ft3att f2t1äu f3te. ft1eck ft1edi ft1eh fte2he ft1eig ft1ein ft1eis ft1eli fte3ma ft1emi f2t1ent ft3erfü ft1erk f2t1erl f2t1erz f2t1e2ti f2t1ex f2t1h f4t3hei f2t1id f4tim f2t1in f3t2ing fto2 f2t1of fton1 ft1op f3tor. f2t3ot f3t4ran f2t3res f3treu ft4rit ft3ro ft3ruh fts1 ft2sa2 ft4sag ft4sam ft2sän fts2c ft4sche ft2se2 ft4seh ftsen1 ft2si ft2so fts3tei ft4stem ft4ster ft4stes ft3stie ft6stier ft3stri fttra4 f2tum ft1urk ft1url ftwa4 ftwa6r ft3z2 ftze3d 1fu 3fuc 3fug f2uh fuku3 fulb4 f1um1 fu2mei f2umm fund3er fun6derg fun6derh 2f1unf 2fungl 2f1u2ni fun2kl fun2ko fun2k3r fun2ku 2f1unm 2funr 2funt f2ur furch2 fu4re. 2f3url fus2 fu3sse fus6sen fu4sser fuss1p fuss1t fus4ste fu2ß1er 3fut 1fü 2füb fühl4sc fün2 fü2r fü3s2 2f1v 4f1w f1y 4f1z fz2a fzeiten6 fzei8t7end fz2ö fzu2ga fz2w 3ga. 2gabf 2gabg 2g1a2b3l gab2o g1abr gab4ri 2gabsc g2abt. 2gabtr ga3bu 2gabw 2gabz gade2r ga3d2i gadi4e ga2dr gae2 ga1fl 5gag. ga1k ga2ka ga2ku gal2a ga3laf ga2lar 2g1alau 2g1alb 2g1alg gall4e gal3lo 2g1alp 2g1alta 2g1altd g1a2lu ga2mec ga3mel gam3ma 5g4amo 2g1amt g1a2na 2ganal gan3d4 2ganf 2ganga 4gangeb gan2gr gang4sp gan2g1u 2g1ank 2ganl 2ganmu 3g2ano ga2nob 2ganr gans2 2g1ansi 2ganst 2ganw ga1ny 2g1anz ga3pe 2g1app ga1q 3gar. g2ara 2garc 3g2ard ga3ret ga3r2i 2g3arm ga3r2o 2g1arti ga3ru 2g1arz ga2s g2as. ga4s3al ga4sam gasche4 gase2 ga5se. ga4sei ga4sel ga4s1e4m ga5ses ga4set gas5s2 5g4asse. g3asses 6gassess ga5ssest ga4st3el ga3sti ga4stin gastra4 ga6stras5 gas4t3rä ga3stri ga6strom gas1tu ga3sun ga3t2a 2gatm gat4r gau1c 2g1auf 2g3aug g2auk gau5ne 2g1au4s 2g1aut ga3z 2g1äp gär3th 2gärz gä3s2 gä5st gä4u 2g3b4 gbau5s gber2 gbi2 2g1c 2gd g1da g3d2ad gda3de g2d1ak g2d1an g2d1ar g2d1au g1dä1 g2dei4 gd1els g2dent g2d1er g2d1et g2d1in g1do g2dop g1dö g1dr gd3re gd3ru gd3s2 gdt4 1ge ge3a2 ge4ate geb2a ge3ble geb4lin geb4lo gebot2 3gebü ge1ch ged4 ge1e2 ge3ec ge2es geest3 ge5fa 3gefä 4g1eff gef4l gef4r ge3fu g4eg gege2n1 gegene4 ge3g2l geg4r geher3l ge3ho 2g1eid ge4ie2 ge4ig g2eil ge1in1 ge2inf gein4h 2g1einr gein2s gein2v ge1ir geis4 2g1eise gei3sh geiss3c gei4sta geist3r 2gek. ge4lanz gelb1r gel4b3ra gelb5s gel4den gelder4 gel6derh gel6ders ge3lec ge2lef 2ge2lek 2gelem gelen1 ge4lene gel3ere ge4lerk geler3ö ge4l3ers ge2l1ev gel3f gel1i4m gel3l2a gel3le gell2i gel2ö gel3s2a gels2p gel3sz gel3ta gelt4r gel3z2 gem2 ge4ma. gem6e 4g1emp gem3s ge3mu ge3na ge4n1ac ge4nad ge4nak ge4n3al ge4nam ge4nap ge4nar ge4nat gen4aug 4genda. gend3in3 4g3endmo gen2dr gen3eid gener4f 4generg ge4n3ern gen6erwe gener4z ge2nim gen3k4 genma7sse. gen3n ge2noc gen6semb gen3sk gen3sz gen3tä 2gentf gen3t2h gen3tr 2gentw ge2nun genzma3 genzmas6 gen3zw ge1oo geo2ri g2ep4 ge3pl ge3po ge1ra ge2rab ge2rak ge2r3al ge3rann ge4rant ge4r3a2r ger2as 2gerdg ge3rem ge4rene ge4reng ge4ren4s ge4r3ent ger2er gerin4d gerin4f ger4inn gerin4t 4ger4klä g3erlas germas6s ger5me ger3no 2g1ernt ge1ro ge2rob ge1r2ö ger4sat 4g3er4seh ge3r2u g6es. 3ge3s2c ge6sche. ge2seb 4g3e4sel. ges3elt ge2s1er ge3sha ge3s2i ge3so ges2p ge3spa ges4pi gess2t gest2 gest4a gest6e ge4s3tur get2a g1etap ge2thi ge5trei get1s ge3t4u 2g1e1ul ge3unk ge1urt ge3u2t 4g1e2x 2g3f4 gfi2l 2g1g gga2t g5ge gge2ne gg2l g3gla g3glo g2g3n gg4r 2g1h 4gh. gh2a 3ghale gh2e 3g2het 3g2hie gh1l 3gh2r ghs2 g2hu gh1w gi3alo gia2s gich2 gicht1 gie3g gi2e1i gi2e3l giel2a gie5n2e gi4eno gie3res gies4 gift5s gi2gu gi2kel 2g1ill 3gime gi2me. gi4mes gi2met 2gimp 2gin2d gi3ne 2g1inf 2gin4h 2g1ins gin2sa 2g3int 2gin2v gi2ob 2giok 2g3isel git2a gitt6e gi4us 2g1j 4g3k4 gl2 4gl. 4g1lab 2g1lac 2gladu 2g1lag 2g1lam 2gland gla2s1c glast4 gla4str gla4stu 3g2laub 2g1lauf g1läd 2gländ 3gläs g1läß 2gläuf gl3b g2l4e 2g3le. 3glea 2g3leb g3lec 4g3led g3lee 2g3leg 2gleh g4leic 4g3lein gleiter8s glei4t5r g3len 4glenk 4g3ler glerei4 2gles 3gles. g3lese g2lia 2glib 3g2lid 3g2lie 4g3lieb 2glif g2lik 4glil g2lim 2glin g2lio 2glis g2lit g3lite g2liz g3lize g2loa g2lob g2loc 2g3loch g2lok g2lom g2lop 2glorb 2glos g2lot 2glöch 2glös 2glöw 2gls g1lu 2g3luf 2gluk 2g3lun g2lut 3g2lü g3lüg 2glw 3g2ly 2g1m2 gmen4tr gmi2s g1n 2gn. g2n2a g4na. 2gnac g4nad 2g5nah gn4al gna4l3er3 2gnanl 3g2nä 2gnb 2gnc 2gnd gn2e g3neh 2gn3ent gne2tr 2gnf 2gng 2gnh g2nie g2nif g4nin 2gnint 2gni2s3 gnise2 2gnk 2gnl 2gnm g2no1 3g4non g3not 2gnp 2gnr 2gns 2gnt 2gnu 3g2num. g2nü 2gnv 2gnw g2ny 2gnz go4a goa3li g1ob gobe3l 2gobj g2ob2l 2g1o2f 2gog 2g1oh2 goh3ren go1i2 gol2a gol2da gol2fr 3gon. go4nat gon2e 3gons 3g2opa gopf4 go2pos 2gopt gor2a 2g1ord 2g1org go2si go3sl go2sp 2g1osz 3goß go3t2h got6terb got6t5erg 3gou go1y gö2f g1öl 3göt 2g3p4 2g1q g2r4 g4rab gra2ba gra2bi gra4bl 2g3radl 2g3rah 2g3rak gram1 grammen6 gram8m7end gram6mer g3rand. 2gra2r grar1e gra4s3a gra4sh gra4sp gra4str 2g3raub grau3f 2graum grau3sk 2gräd gräs5c g3räu 2g5re. g4reb 2g3rec g3rede g4re2e 2g3ref gre2fr 2grege 2g3reic grei4fr 2g3reih g3rein g3reit 3g4rem 3gren 4g3renn gre3no gren6z5ei grenz3w g4rer 2grese gres6ser6 g3ret g3rev 2g3ric gri2e 2g3riem g3riese 2grig gril4la 4g3ring 4g3rinn gro2b3a gro3ber gro2bl gro2b3r 2groc 2groh 2g3rol gros4 2g3rose g4ross gro5sse. gro7ssen. gro7sser. gro7sses. g4roß g4rot 2gröh 2gruf. g4ruft 2g3ruh g3rui 2g3rum grun2g 3grup 3grus grus2s gru3sse 3gruß 2g3rut 2g3rüc grüs2 4gs g2sa gs3a2b gs3ach g3sack gsa2d gs3a2k g3s1al g4s3alb g4sall g4salm g4salt g4sama gs1amb g4samp gs3ane gs3a4p gs3a2r gs1as g3sat gs3ato gsau2g gsau4r gsa2v gs1ä g3sc g4sca g4sce gsch4 g4schef g5s2chi g5schn g4sco gs3d g2s1e2 gs2e3h g5s2eil gse4kl g3sel. g4s3ela g3seln gs3em gsen1 gs2enk g4sent g4ser g3sere gs3er1i g4se4s g4seu gsfi2l gsgene4 gs3ha g2s1i gsi2d g3sig gs3i2k g3sil g4s3io g4sis g4sita gs2ki1e gsmas8sen gs1o2 gso4b g5son g2s3op g5s4orge g5soz gs1p4 gs2pac gs4pant g5spei g3s2pek g3s2pi g5spie gs3pl g5s6port. g4s3pru gsrat4 gs3s4 g2s1tab g3stad g2staf g2s1tät gs2te. g5stein gst2el g5stell gs4tem. g4stemp gs4ten. gste2r gs4ter. gs4tere g6sterei g4sterm gst3err gs4tes. g4stest g5steu gs2thy g3s2ti gs3tie gs3tis g3sto g4stoch g4stod g4stor gs1tot gst4ra gst5reit gst4res g4s3treu gst3rit gst3ros g2stru gs1trü gs1tur gs1u gs3un gsü3s g3sy 4g1t g3te gt1h gt2hy gt2i gti2m g3to gt4r gt2se 1gu gu4ale gu1an. gu1ant gu1as gu4d3r gu2e 2gued guet2 2g1u2f 2g1uh gu3ins gu1i4s gum2e 3gumm gummi1 gun2e 2g1unf gunge2 4gungew 2gungl 2g1u2ni 2g3unk 2gunr 2gunt 3gur gure4 4g1url gur2t3h gur2tr gurt3s gu4s3a gu2sä guschi5 gus3se. gus3ses guss1o gus2sp gus4st gust3a4b gu4stap gu6stein gu6st5en6d gu3sti gu2str gu2ß1 gußt2 gu2t gut1a gu3te gu4t3er4h gut1h gut2s3p 2güb 3gür3 gü3st 2g3v 2g1w gy3n gy4na 2g3z2 gzeu4gi 2ha. hab2a hab2e hab2i h1ablu 2habn h1a2br h1abs 2habw ha4ch3en ha2cho 2hada ha2del hade2n h1adle h1a2dr ha3dri 2hae ha3el ha4far haf2e h1affä haf3f4l h2aft haf2tr haft2s hafts3p hag2a h2agg ha3ha h2ahs h2ai 3hai. h2aj 2haka ha1kl 2h2al. ha3l2al halan4c h1a2lar ha2lau hal2ba hal4bel hal4bin hal2b3r hal2bu 2hale 2halh hal2i 2halk hal4lei hal6lere haller6f hal6lerg hal4leu hal4lo4k ha3lo 4halp hal2sp hal4tal hal4tei hal2t3r hamot2 2h1amt ham3te h2an. 2hana ha2nal ha2nan han2au 2hanb h2anbe h2and han2da han4d3er han2d3r ha2nem han2f1 han6g5end han4gro hang3s han2k1 2hanl 2hano 2hanr 2hanz hao2s 2h1ap 3h2ape ha2pl ha2po ha2pr h2a3ra ha4rab 2harb 2harc h2ard har2fr h1arm. har3ma h2arme har4me. har4ne ha2rom 2hars hart4e har2th h1arti har2za h2as 2has. 2ha3sa has2c has4h3 has4sa hasser4 hass1t ha4str ha2ß1 h1aße ha2ta hat2i h3atl ha2t3r 2hats hatt2 h3attr h1audi h1aufb hau5f6lie hau3f4lo 2h1aufm h1aufs h3au3g2 h1aukt hau2sa hau4san hau2s1c h2ause hau4sel hau6s5ent hau4spa hau4spe hau4ss haus5sen6 hau4s3ti hau4sto hau4sur h2aut. hau2t1a hau2t3r ha2ve. häde2 h1äff 2häi hä2kl 2härz hä4s hä5sc hä6s5chen 2h1äst 2häug häu2s1c hä3usp 2h1b4 hba4ras hber2e 2h1c 2h3d4 hdan2 2hea he2ad he3be heb3eis he2b3l he3br he3bu he3ch2e he3chi he1cho h3echs hed2g he2dit he1e4m hee2n hee2s he1e2t h2ef. he3fab he2fan he2fau he2f1ei he3f2em hef3erm 2heff he2fid he4f3in4g he2f5le 2hefr hef4ra he2fre 3heft he2fu he3gu he2hel hei4a h4eib h1eie h1eif h1eig he2im hei4mal hei4mar hei4mei heim3p hei4mu 2hein hei4na heine2 hei4n3eb hei6nene hei4n3er h3eintr 2heio 2he1ism heis4s he1i4st h2eit heit4s1 h1eiw hekt3a he2la he3lag hel1an hel3au hel1ec he2lek h3elem he2len h2elf he3li hell2a hell3au hel4lic hel4mei he3l2or he2lö 4helt h4em. 2hema hema4s3 hem2b 1hemd 2heme2 h2e3m2i he4mia h3e4miss 1hemm 2h3emp h2en. he4n3a2 he2nä hen3ebe henen1 hen3end he4nene he4nens hen3erg he4nerm he2n1e4t 2henga hen4gag hen4kan hen4kau 2heno heno3t hen4sem hen3st2 hent2a hen3te hen4ter hen3tr h1ents 2h3entw h3entz he4n3u hen3z2 2he2o he3on he3op he3pa he3ph h1e2pi hept2 h2er. her3a2b he2rad 2herap he4r3a2r herau2 herb2 he2r1e2b he4reck her4eif 4he3reig he6reis. her7eises he2rel he4rene he6rersc he4rerw h1erfo her4fol 6hergebn 2herif herin4d herin4f he6rin6nu herin4s h1erke her4klä h5er6kran h6erlad 2herm herma3s he3ro he4r3o4b he4rof he4rop he4rot h1erör her3sta hert4 her3th her3um her4zap her6zeng 4h3erzeu her2z1w he3sa 2hese he3si he3s2p hes2t he2tap he3tä heter2 he3th het2i he3t4s he2u heu3g he3unt 3heusc he3x he1x2a 2hexp hey2 he1ye 1hè 4h1f4 hfaller6 hfan2 hfel2l3 hfi2s hflei2 2h3g4 hgas1 hga4sen 2h1h2 hhoh2 4hi. 2hia hi2ar h1iat 2hic hi1ce hich6t5er hicht6sp hi3d hid4e hi4dio 2hido hi2e hi3ens hie4rei hier3i hie4rin hiers2 hif3f4r hi2k3r hi2l3a4 hile3n2 hil2fr h2im 2hima h1imb h3i4mit h4imm h3impe hi2n hi3nak hi3nam hi3nap hi5n2as h2inde hine2i hi3nel hin2en5 h1inf h1inh 2hi3n2i hin3n2 hi3n2o3 hin2t1a 2hio hi3ob hi4on hi2p3 hi4pl hi2r hi3ra hi3re hi3ri hir2m1a hir2mi hirn1 hir4ner hir2s 1hirt 2his. his2a hi2se h1i2so hi2spa hi3tac hi2tan hi2tel hi3t2i hit1r hi2tro hit3z2e hi2v1o 2h1j 2h1k4 hkamp2 h2keu hki2n1 hklo3s 2hl hl2ag hla2gr hlam8meng hlan4d3a h1las h1lat h1laut h1lay h3läche h3läd h1läs h1läß h1läu hlb4 hl3d4 h3le. hle3a h3leb h3led hle3e h2leis h3leist hl1el h5len. hle4nas hlenen3 hl2enn h4l3entr h4lents hl2enz h3ler hle2r3a hl4ere h2lerg hler4hö hl2erk h6l3er4nä hle3run hl1erw h4lerz h3les h4lesi hlf4 hlg4 h2lie h3lied h2lif h2lim hl1ind hling4s3 h2lip h2lis h3list h2lit1 hl3l2 hlle3b hl3m2 hlma3s2 h2lo hl1ob h3loc hl1o2f h3log hl1op h4lor hlo2ra h3los. h3losi hlos4st hlo2ß1 h2lös3 hlö4ss hl4sar hl2ser hl3ska hl3s2lo hls3tie hl3str hl2su hl3t2 h3luf h3luk h3lumpe h1lüf hlz2 2h1m h3mad h3mag h3mak h3man h2mant h3mar h4marc h3mas hma3sse h3maß h3mä h4mäc h4mäh h4mäl hm2e h3me. h3med hme1e4 hmeer4s h3mein h3meist h3meld hme3le h3men hmen2s hme4ran hme4rei h3mex hmi2e h3mind h3mini h3minz h3mirr h2mo h3mop h3mot h3m2ö h4möl hm3p2 hm2s1p h2mu h3mul h3musi hmut4s 2hn h2na h3nag h3nam h4nar hn3a2te h4natt h3nau. hn1äh hn3d4 hn2e hne3b hne2e3 hn3eff hn3eig hn3ein h2nel hne4n hn4eng hne4pf h3ner hner4de hner3ei h4n3e2ro h4n3ersa hn3ex hn3f4 hnflei4 hnhof8stra8s h2nic h2nid h2nie hn1im hn1in h2nip hni4sa hnk4 hnno2 h2no2r hnra2 hn3sa hn3s2p hns2t hnsuch4 hntra4 hnts2 h2nul h2n1unf hn3z2 ho4ar ho3bern ho2b3l ho2c hoch3 hoche2 hock3t 2hod 2ho2e hoe3n ho3er ho4f1a4 ho2fä ho2fed ho2feu hof3f4a ho2f3l ho2f1o ho2f3r ho2fu 2hoi ho2l1a hol3ar 1hole ho2l1ei ho2lem hol3g4 hol3k holl4 2holy h3olym 1holz hol6zene hom2e ho2me. ho2mec ho2med h2on hond4 hon2er ho1on hoo2r 2hop h1ope ho1ra h1o2r2an ho2rau h1or3d 2hore ho4rens ho3ret 2h1org hor3ta hor4ter hort3s h1ortu h2os. ho3se2 ho4sei ho3sl ho4sla ho2str ho4ßene 2hot. ho3th 2hotr 2hot1s2 1hou hou4s 2ho2w1 h1ox ho1y2 hô1 1h2ö 2hö. hö2c 5höhe 2hö4s hös1c hös3se h3öst 2h3p2 h1q 2hr hra2b hr3ac hr3ad hr1a2g h1r4ah h1rai h1rane hr3ap hras3s h3räu hrb4 hr1c hr3d h2rec h3r2ech h3red h3ref hr3eff h2r1eh h4rei. hrei4ba hrei4br h3reic h3reif h4r3eig hr4eini h4reinl hrei3th h3rep hrer6geb hr2erh hr2erk h4rerla h6rer6leb hr2erm hrer4sa hrer5st hr2erw hr2erz h3re2s1 hres5s2 hrest2 hre2t h2r1eta h2r1eu h2rev hrg2 hrga4 hrgu4 h2ri h3ric h4rick hri4e h3riesl h3rin h4r1ind hr1int h4rist hr3l hr3m2 h3rog h3roh h1ro2l h4romat h4rome h4romi h4romo h4ron h1ropa hro4r h3rou h3rö2s hr2s1ac hr4s3and hr3sch hr2s1em hr2sen hr3sena hr2s1er hr2set hr4sh hr2sin hrs3k hrs3l hr2s1of hrst2 hr4stec hr6stele hr2su hr2tab hr2tan hr2te2l hr2th hr2top hrt3ric hrt2s hrt4ste h3ruh hr1ums h3rut h3rü h4rüb h4ry hrz2 4h1s h4s3acht h2sa2d h2s1alk h2sall h4samt h2san hs3and h2s1as h2sath h2sato h2saud h4s3aur h2saut h2säh h2säug h3sc h4schan hs2cr h3se. h2s3ec hse4e h4s1ehr h2s1eie h4seind h6seinst h3sele hse4lin hs1emi hsen5erg h2s1ent h2s1erf hs1erg h2serh h4serkl h2s1erl hs1ern hs4erne h2serö h2s1erw h2serz h2sex h3s2ext hsha2k h2s1i2d hs2im h2s1ing h3s4inni h4s1ita hs2kal h3skand hs1of h2sofe h2sop hs1org h2spac h4s3pani h2s1par h2s1pat h3spec h3spei h2sper h2sph h2spo h3spoi h2sprä h2spro hss2 h2staf hst3alt hst2an h2stau h2stäl h2stäu h4stea h4stele h4sterm hs3tier h2stin h2stit h2s1tol h2s1tor h3stö h4s3treu hstro2 h2stu h3stun h3stü h2s1u hs2ung h3sy 4h1t ht1a h2tab hta2bl h2ta2d ht2ag ht4akt. ht4akte h2tall h2talo h2talp h2talt hta2m h2ta2n ht3ane h3tank h2tap h2ta2r ht2as h2t3asi h2tasy h2t3at h3tat. h3tate h2tau h3taug h4tax ht1ä h2tär h3te. ht3e4ber ht1ec hte3cha h2t1e2d ht1eff ht1e2he h2teif h2t1eig h4t3eilz h2t1eim ht1ein h2t1eis h2t1eke ht3elas hte6l5ei. h4telek h4t3elfe h4t3elit hte4m ht1emi h2temp h3ten. ht3engl ht3enta h4tentf hter6de. hterer6s ht3erfo ht3erfü h6terfül h6tergeb ht3ergr hter6gri ht1erh hter6häl hter8höhu h6terleb h6t5erleu h6terneu ht5erspa hter8spar ht3erst h6tersta hter6tra ht3erwä ht3erze h2t1ese h2t1ess h2teta hte4th h2t1eu h3teum h3teun h4textr h2t1h h4thei h3thera h3thes h4tho h2t1i2d h3tig h2t1im h2t1i6n3 ht3ine h2t1is h3tisc hti3t4 htni2 h2t1ob hto2d1 h2t1o2f h2t3oly h2tope h2tord ht3rak h3tran ht3rand h4t3ras ht6rates ht3rau h4traub ht6raume ht3rec h3treck ht3rei h2t3res ht3ric h4t3rieg h2t3rin h3trit h2t3rol h2t3ros h2t3roß ht3röm ht3ru h2t3rü h4ts ht2sah ht2sal ht4s3a4n ht2scr ht4sein ht2sel ht4s3end ht4seng htse2r1 hts3eri htsha2 ht3s4hak hts3kr ht2s1o hts3par hts3tät ht4s3tem hts4tie ht4stip ht4s3tur ht4s3tür htt4 htti2 htu2e h2t1urs ht3z2 hu2a hu2b1a hu2bei hu4bel hu2b1en2 hu2bi hu2b3l hu4b5r hu2bu hu2fa hu2h3a hu2h1i h1uhr h1uhu hu2kä hu2k1in huk3t4 hu2l3a2 hu4lab hu2lä hule2 hu2l1eb hu2l1ei hu2lem hu4l3eng hu4lent hu2l1er hu2let hu2lid hu2l1in hul3l2 hu2lo hu2lö hul3s hu3m2a h1umh h1ums hu2n h1una h2und hun3d2e hunde3i hun2e 2hunf hung2 hun3ge hungsa4 h1uni h1unm 2hunt h1ups 2hur hur3g2 hur2t3h hu3s2a hus3h hu2so hus2s3a hus3se hus4ser4 hus2s1o hus2sp hus4st hu2ß1 hu2tab hu2ti hu2t1o hu2t3r hut2t hut4zen hut4z3er hut2zu h2ü h3über h4übs h3übu hüf2 hüft1 hühne4 2h1v hvil2 2hw2 h2wall hwe1c h1weib h1weih hweins3 hwein6sa hweis4s h2wirr 1hyd hy3dr hy2lor 1hymn h1yo hy3os 1hyp hy2pe. 2hy2t 2h1z hz2a h3z2o hzug4 h3z2w i3ad. iad2a i1adn ia3do iaf4l i2ago ia1h2 i1ai i3ak. i3ake ia2kei ia2kr i1akt i1al ia2l1a2 ial3ar ial3as ia2lä ial3b4 ial3d4 i3aleb i3alef i3alei ia3lek i3alel i3aleng i3alent i3alerb i3aler4f i3alerh i3a4lerm i3a2l1et i3alex i3a2lia i3alim i3a2lin i3al3l ial4ler iall2i i2alo ia2lon ia2lop ia2l1o2r ial3p ial3s ial3t2 ia2l3u2 ial3z2 i1am. ia3ma iampe4 i1ams i1an. i1an2a ia2nal ian3alt ia2nau i1anc i3and2 i3a2n1e2b ian2er i1ann i1ans ian2s1p i3ant i3anz ianza4 ia1o ia2op ia3p ia1q i1ar i3ar. ia2ra i2are iar3r i1as i3as. ia3sh i2asi ia1s2p ias5s iast4 i3at. i3at2h i4athe 1iatr i3ats i3au ia3un iau2s1 i2az 2iä i1ä2m i1äp i1är. i1ärs i1ät i3ä4tem iä2ti iät5s2 i1äv 4i1b ib1art i2b1auf i2b1aus i2baut ib3be ib2bli i2b1eig i2b1eis ibe4n1 i6ber6geb i4b3er4la ibe1ro i2bim i2b1in i2blad i2bleu i3blu i3b2o i2bö i2b3rau ib3ric i2b3roc ib2ser ib4ste ib2un i2b3unk i2b3unt ibus3 ibus1c 2ic i3ca ic1c ich1a2 ich6art. ich1ä i1che ich1ei ich2er icherin5 ichermas8 ichgro3 i1chi ich1l ich3le ich3li i3ch6lo ich5m ichmas4 ich3n i1cho ich3ort i2ch3r ich6sele ich2s1i ich6stie ich2tr i1chu ich1w i1ci ickt2 i1cl ic3la ic3ra i3cu i1d 2ida id2ab i3d2ac id4al id2am id1a2n i3d2ans i3d4at id1au id2ax idä1 idbu4 id2e 2i3de. i2dea 1idee id3eis 2idel idel4ä i4demul 4i3den. ide4n1o iden4se ide3ran iderin8nu ide1rö ider6reg 2i3des ide5sa ide3so ides2p 1i2di2o idi4on i4diot 2idk idni3 id2o i2dol 2idoo i2dö i2dr id4ro id2s1p idt4 1i2dy ie3a2 ie2bä ie2bl ieb3re ie2bri ie4b3rü ieb4sto ie1c ie2cho iech3t ie2d3an ie3de ie2dr ie1e2 ief3akt ie2f1an ie2far ie2fau ie2fäh iefe2m ief3f4 ief2i ie2f3l ie4fonk ief1r ie2fro ie2gl ieg5li ie3g4n ie2g3re ieg2s ieg6s3c ieg4se ieg4si ieg6s1t ie3her ie2h1in ieh3r2 i1ei ie1ind i2e2l1a iela2r ie2läs iel3d4 i2ele ie4l1e2b iel1ec iel3eid ie2lek i4elen ie4lene ie4leng ieler4e ieler6fi ieler8geb ieler6ke ieler6la ieler8lebn iel4erw ieles2 i2eli ieli2d i1ell ie2lo4b ie2lop ie6lor i2els2 iel3sz ielt2 iem2e iemis2 i1en i3en. i3ena ien1ag ien2am ie4nas i3enä i2ene ien1eb i3enec i3e2n1e4k iener6fo ien3er4g iener6la i3enex i3enf i3eng4 ienge4f ienge4z i3enh ie2nid ie2nim ie4n3in i3enj i3enk i3enla i3enle i3enm ienma3s4 i3enn i3e2no i3enö i3enp i3enr i3ens. i3ensa i3ensc i3ens2e ien3s2k i3ens2p ien6st5er ien6stop iens4tr ienst5rä i3en3sz ien4t3ar ien3te i3enth ien3tr i3enty i3env i3enw i3enz ie1o4 ie2r3a2d ier3al ier3an ie2r3ap ierb4 i3erbun ier3d i2ere ie4reck iere5ins ie4r3eis ie3r2er ierer3k ie4r3erz ierf4 ierg4 i1ergi i4eri ierk4 ierken4 ierma6ss i1ern i3ern. iern2a i2erni ie2rö ier4re. ier4s3eh ier3sei ier3sta ier3te iert2i ier3z2 2ie3s2 ie4san i2esc i2ese ie4sh ie4s3k ies3o ie4sof ie4spu iesser6g ie5sset iess3ti iest6e ie4stin ießer4g ie2t1ag ie2t1ak ie2tan ie2t1ap ie2tat ie2tau ie4tent ie4t3erh ie4t3ert i4ethe iet3her ie2t1ho ie2thy ie4tob ie2t1ö2s ie2t3ri ie2t3ru iet2se i1ett iet3zw ieu2e ie1un ie2w3u i1e2x 2if if1ab if3ange if1ar i2f3arm if4at i2f1au if1än i2fec i2f1ef ife4i if1ein if2e4n i2f1erg if1erh if2fa iffe4s if6feste if2f3l if4form if2fro iff2s iff4ste if3l if1lac if4lä iflo4 if4los i1flü if3r i1fre i2freg if4rev ifrü4 if3sa if2t3a if2ted if2t3ef if2t1ei if2te2l if2tep if4terk ifte4s if4t3esc if4th if2top if2t1r ift3ri ift1sp ifts2t ift3sz if2tur i1fy 2i1g i2ganb i2garb ig1art iga3s i2g3att igd2 i6gebrau i4gefar ige4füg 3i2gel. ige5lau i2geln ige4me ige4mis ige4na ige6nene ige4nid igen5s ige2o ige2pa ige2ra igerma3 ig5erwer ig1erz iger4ze ige4sel i2g1ess ige4tra ige4tre ige4woh i2gim i2gl ig1lau i3gle ig3lim ig4na i4gnä i3g4neu ig4no igo1p ig3rad i2g3re ig4ren igro3 i2grou ig4sal ig3sä ig4schr ig1s2o ig1sp ig2spa ig4sti ig4s1to ig2stö ig6stra6s ig4stur 2i1h i2har i3he ihe1e ih1elt ihe4n ihe3u ih3m ih3n ih3r2 ih2s ih3sp ih3sti ih1um. ih1w ii2 ii3a4 i1ie i3ig i1im i3in i1i4s i2is. ii3t i1it. i1j 1i2js 2i1k ika2ge ik1aka ikaken3 i2k1akt ik3amt i2k1ang i6kantei ikanten8n ik1art ik3att i2k1au i3kaz ik1äh i2k1än i2kär 4ike i2keb ik1ebe i2k1ed i2k1ef i2k1ei ike4l1 ike2n1 ik1en2s ik1ent ike2ra i2k1e4r2e i2k1er2f i5kerfam i2k1er2h i2ker2l i2kero i2ke3ru i2k1eta 4iki i3ki. ik1i2d i3kie ik1in i2kins i2k3l ik4län i3k4leri i3k4let ik4lim i3klu i2kne ik3nu iko3be i2k1off iko1p2 ik1or iko2ri ikot3t i2köl ik3rä ik3re i2kres ik4ris i3kro ikro3s i2krö ik3sa ik3s2z ik3ta ikt3erk ik4t3esk ik2t3re ikt2u i2k1uh i2kup i3kus i2kü i1la i2lab i2l1ac i2l1ak il1a2ma il1ang i2l1anm i2lano il2anz ilan6zer i2larb il1asp i2l1au i3laub i3l4aufb ilau2s1 i1lä1 i2lär 2ilb ilb4l il2c il5chen il2da il2dä ild3ebe il4d3en4t il3der ild4erp ildi2 ild1o il2dor il2dr 4ile il1ec ileid4 il1ein il1el i2lemb i2l1e2mi il1ent i4lentl i4lents i2l1erd iler4ei i6lereig il1erf iler4fo i2ler2g i2l1er2h i4ler4kl il1err i4lerri i3l2erz ile4th il1ex ilf2 il2f3l il2f3re ilf4s1 il2gl 2ilh 2ili ili3e4n3 iliga2 ili4g3ab ilik4 i2l1ind i4l3init il1ins i2l1ip ili1pf il3la il4lad ill2an ill4ant il2lä2 il2leg ille4ge il4lenn il3l2er 1illu il2mak il2m1ap il2m1au ilm1ei il2min il2mor 2ilo il1ob il2oh il4on il2op i2l1o2r i3lou i3lov il1ox ils3ent ils2to ilt2 il3th i1lu iluf4 i2lum i2l1ur i3lus ilü4 2ilv4 il2zar il2zau ilz3erk il2zwa imad2 ima1i im2al i2m3anh i2mans i2marc im3aren i2m1arm i2m1art im4at ima2tr imat5sc ima4tur im1aus i2maut im3b i2meg im1ein i2mej i2mek i2mele i2melf im2en i2m1er2f i2m1er2l i2m1er2z i4me3sh imes3s i2meti i2mew imhau2 i2mid im1i2de i2mim i2m1ind i2minf i2m1ins 3immatr immen1 imm3ent im6menth im2mit 1immo im4mo2d im2mö imni2 2imo i2m1ob i2m1o2p imo3re i2mö 1imp imp2fa im3pf2o imp2s im3pse 2imt imt2e im3t2i imtu2 2imu im2um im1urk 2in. ina2be in3abu in1ac i4nack in1ad i3nald inaler4 ina6lere in2alp i2n1am in2an in3an. in3ana in3ann i2narb in3att i2n3au2 inaus1 2inä i2n1äh in2är in1äs 2ind. inda2 ind2ac in2dal in2dan 2indä 2inde. 2inden ind5erke inde3sp indes4t 1index ind2i 1indik in3dö 2indr ind4ri ind3se 1indus in3d2ü 2ine in1ec i3nee i2neff in4elen ine2n1 ine3nä i4nen4zy i5ner. i4n3erbi in4erha i4ner4he i3nerk i3n3erle i6ner6leb iner4lö i4n3er4tr i3nes in2et in1eu ine3un in3f4 1infek 1infiz 1info 2inga in2g1af in2g1ag in2g1al in2gam ing1ar 2ingä 3ingeni in3g2er in4g3er4w 2in2gl in3gla ingmas4 ing4sam ings6por 1inhab 2inhar 2inhau 2inhe 2ini. in2id ini3de 2inie 2inig inig2a ini3k4r 2inis ini3se init2 i3nitz 3inkarn 1inkas in4k3ent ink4er in2kro inks1t ink4ste in3k2ü inma4le 2inn. inne4n in4ner4m in2neu in4ni2v 2innl in2nor 1innta 2ino in1od ino3e4 in3ols in1or i3no3t i2n1ou i1nö in1ö2d 2inr 2ins. ins2am in6samt. insch2 2inse. in2seb 2insed 2insen 2insk 3instal in4s3tät 4inst2e 3instit 4instra in4strü 1insuf ins3umz in2sur in3sz 2inta 2inte. 1integ in3tei 2intep 2int2h inthi1 in3ti int2o 2intö 2in3t4r 4inträ 3intrig int3s i2n1u i4nuh in3unz inu3t 4inverm invil2 i1ny2 in3z2e inzel8ler in3z2i in3z2sc inz2u in3zw i1ñ 2i1o ioa4 iob2l io1c io2d io3da io3du io3e4 i2of iof4l i2oh io1i io3k6r i3ol. i3ols i3om. io3me i3oms ion2 i3on. ion3an io2n3au ion3d2 io4nee i3ono io2nor i3on4s1 ions3a ions3el i2ony i2oo i2o1p i3o4pf i3opt i2or i3or. i3orc ior2e iore4n io1r2h i3orp i3ors i3ort 4ios i3os. io3sh i2ost ios2u i2o3sz io3t i3ot. iote3l iot4r i3ots i2ou i2ov i3ox i2oz i3oz. i1ö2k i1ön i1ös. i1ö4st i1pa ip2an i1pe i3ped i3per 2ipf2 ip5fam i3pfan ipfe2 iph2 2i1pi ipi3a ipi3el ipi3en ip4lu i2poi ip2pan ip3pe ipp1f ip4pl i1pr ip2sa ip2sei ip2sp ip2sta ip4stü ipt2a ipt2i ipt2u 2ipu 2i1q i1r4a i3ra. 2i3rad i3ras irat4 i1rä ir1äh ir2b3l ir1c ir2ch1o ir4e i3ree 2irek ire4na i3ré irg2 irg4s ir2he ir2i 2i5rig 2irk irke4n ir4kene ir2k3l irk4s3c ir3k2u irli4n ir2m1ag ir2mak irm1au ir2mä ir2m1ei irme4n1 ir2m1o2 irm4th ir2mum ir4munt 2irn ir2n3a ir4nat ir2no i3ro i1rö irpla2 ir2rei irre4l ir4reli ir2rh irs2 ir3sche ir4schl ir4schm ir4sch3r ir4sch3w ir3se3 ir3sh irt2s1t 2iru ir1u2m iru2s1 iru3te i3r2ü i1s i3sac isa2m3 i4samp i4s1amt is2ap isa2r i3sat is3att i2sau is3auf isau2g i2säh i2s1än 2isb i2sca i2sce i4schar i3s2che i4schef i4sch3e4h isch3ei ische4m i6schemi i6scher6z i4schin i5sching i2schl i2schm isch3ma i4schna i4sch3re isch3ru i6schüb i4schwa i6schwir i4schwo isch3wu i4schwü i2scr 2ise ise3a ise1e iseh2a ise3hi is4eind is2el ise3lad i6sel6ter ise2n1 ise4na is2end i4senho isen3s ise4r3ei is1erg i2serh iser4he i2s1erm i2s1es2s i3s2et i4s3etat i3s2eu 2isf 4ish 2isi isi2a i2s1i2d isi4de isik2 i2sim i3sin3g4 i4ski i4sku is3la 3islam 2isma 2ismi ismu2 is1of i3soh 1i2sol 2is4o2n1 isonen4 iso6nend isono2 i2sop is1ort 3isot i2s1ou 2isp is1pa i2spar is2pat is1pe is1pic is2por i2spro is3sa is4s1ac is4sau is3sc iss5chen is3senk isser4f issermas8 is3so is3sp iss2po is2st is3sta is4ste is3sto iss1tr is3strä is3stu is2su i2stab ist3ac is4tal i4stam ist2an i4s3tang ist4e i4stea i4s1tec iste4n istin4f ist6o ist4ra is3tras3 i2strä i2stre is5tromm i2stur is1tüm i3suf isu2m isum3p i2sü 2isy i1ß ißer4s iß3ersc i1ta it1ab. it1abs i3t2ag ital1a ital5l it1alt it1am ita3ne it1ang it3anr it1app it1a2re it1art i3tat it1au i3tauc i2tauf i2taut 4i1tä it1änd i2t1äs ität2 i1te it1eff i2t1ei it2eic i4teig i4tein i4teis 2itel ite4l1a i4telek it1emi i2temp ite2n i3ten. i4tents i2tepo i6tereig i4t3er4fo iterin6d iter6klä it2erö i8t7ersche i2t1es2k i2t1ex i3text i3thr i1ti i3tic i2t1id i3tig 1itii it1in1 i3tis i4tiso iti3sp i4tiss i3tiv iti2v5a it5le itmen2 4i1to i3to. it1ob i3toc ito3d i2t1of ito2p it2os i1tö 4i1tr i2t3rad i3tradi it3raf it3ras it3rau it3räu it3re it4ret i3trie it3rob it3rom i2t3run i2t3rut 2its it2sa its1ag it2s1e it4se2h its3e2r1 it4sh its1or it3spen it4stec it4s3tem it4sten it4s3tes it6stra6s 2itt it2teb it4temp it3ter itt5erfo itt3hä it2tob it2top it2tri itt3ric itt6schi itt4se4h itt4sei itt4sor itt4sti i1tu it1uh it1ums it2ung i2tuns ituran4 it1urg i3tus itut4 i1tü 4ity1 ityl2 2itz it2zec itz2er itz3erg it6zergr it4z3erl it2zö it2z1w 2i3u2 i4u3l ium3 iuma2 ium4se iun2 iungs3 i4up iu4r ius1t i1ü4 2i1v i2v1ad i2v1ak i2v1am iv1an i2v1ä i2veb i2v1ef iv1ei iv1elt ive4n iv1ene i2v1ent i2v1ep ive3re iv1erh iver4kl iv1erl iver3s i2v1ex ivil3l i2v1im i2v1ind iv1int i3vol ivo3re i2v1r i2vun i2v1ur i2vü 2i1w 2i1x i2xa ix2em ixt2 i1y 4i1z iz1a iz2ac i2zag i2zan i2zap i3z2as i2zau i2zä i3ze iz2ei izei3c izeit3s4 i2zele ize2n i4zener i4zentz iz1erg i4z1erl izid3 iz1ir izo2f i2zö i2zuna i2z1w i3z2wi í1l j2a jab4 jah4r3ei jahr4s ja3l jal2a ja3ne jani1 jani3t4 ja5ru jas2o jat2 2j1d4 jda3 je2a jean2s je2g jek2t3a jek4ter jek4tin jekt3o2 jektor4 jek2t3r je3na je2p je3r jer2e je2t1a je4t3h je2tin je4tor je2t3r jet3t je2t1u2 ji2v 2j1m joa3 jo2b1 job3r jo2da jo2i jol2a jong2 jo2p3 jo1r2a jor3d2 jo2sc jost2 3jou jou2l 2j1t jty1 j2u ju2b3l jude2 jugen6 jugend3 ju1i ju2k jul2i jung5s2 ju3ni ju3r jur4a jur2o ju3t2e1 2j1v 1ka 3ka. ka3ar 2k1abb kab2bl 2kabd 2k1a2ben 2kabf 2kabg 2kabh 2kabn 2k3a2bo 2k1abs 2k1abt 2kabw 2kabz ka1c kade2r 2k1adm 2k3a2dr 3kadu 2kadv ka3e ka1f4l ka1fr kaf3t2 kag2 2k1age 3kah ka1ho ka1in kaken2 ka1kl 2k1akt. 2kala. kala3b ka2l1a2d ka2lan kal3d ka4l1eh ka4lens kal3eri 3k2alk kal2k1a kal4kan kal2k3l kal3l kall2i kallö3 2k1allt ka2lop ka2l1os kals2 kal4tex kal4th ka2lu k2amt 3kana kan4al ka4n1a2s ka2nau 2kanb kan3d2 2kanda 2kandä kan2e 2kanf 2kanim kank4 2kanl 2kanom 2k1anor 2k1ans k2ans. kan4tar 6k5antenn 2k1anth ka3nu kan2um 2kanw 2k1anzu 2kanzü ka2o1 3kape ka3po 3kara 2karbe 2karc k2ard kar3d2a k1area k2arg ka3r2i kari3es k2ark 2k1arm kar2pf k2ars k2ar3ta k1arti 4kartik karu2 k2arw 3k2asc kas2e kase1i kasi1 kas2o ka2sp kas2t 2k1ast. ka3sta ka4ster 3kasu ka3sz ka2tan 3kateg k3atel ka3t2h ka2t3r kat3se 2katt4 kau4fer kau2f1o kauf6s5ag kauf4sp kauf8s7tem kauf6sti k2aus. 2k1auss 2kausw kau3t2 2kauto ka3ve 2kaz 1kä käl3 k1ä2mi kär2 2k1ärg kä2s5c käse3 kä3th 4k3b4 kbe1 kbo4n kby2 2k3c 2k3d4 ke2ben 2k1ec ke2di 2k1eff kefi2 kege2 ke2gl ke2he. ke2hen kehrer4 kehr2s kehrs3o 2k1eic 2k1eig kei2li 2k1ein kein4du kein4e k1eis 2keise keit2 ke2l1a ke3lade ke3l2ag ke4l3am ke2lä kelb4 keld4 kel3eis 2ke2lek ke2l1en ke2l1er kel3la kel7l4e kell2i ke2l1o2 ke2lö kel3sk k4elt kelt4e 2k1e2mi 2k1emp k2en. ken1a ken3au ke2nä ken3dr ke2n1e2b kenen1 ke4nene ke4nens kener4n kene4t 4ken4gag k5en6gel. ke2nim ken3in 4kenlad 4kenläd kenn2a kenn2e ke2no k2ensa 4ken4sem ken3s2i ken3s2k ken5s4te ken3sz k3en4te. ken6ten. 4kentf 2kentg ken3th 2kentl 2k1ents 2kentw 2kentz ke3ny k2en3z2 2ke1o2 2kep ke2pl k2er. ke1ra ke2ran ke2rau ke2r1ä ker4ble k2erc 4kerd ke2r1e2b ke2rec ke3reig ker3ein 4kerfah k4erfam ker2fo k3ergeb 2kergu ke6rin6nu kerin6st kerin4t k3erken k2erko k3erlau k3er4leb k6erlebe ker2na ker4nei 4k3er4neu kern5eur k1ero k2e1rod 2keros ker4reg k2ers. 2kersa kert2i ker6werb kerz2 k1erz. ker4zeu 2k1er2zi k2es. ke2s3a k2esc k1ese ke2sel kes2sa ke2t1a ket2ag kete4 ke4t1eb ke4tel 2k1e2th ket3ha ket3s ketta4s kett1h ke2tu keu6schl 2k1e2va 2k1e2x 4k3f4 2k3g2 kga4s1 kge3s2 2k1h4 k3he kho3m k3hu ki1a ki2ad ki2ag ki3ak ki3a2r ki1ch ki3dr k2ids 2kidy ki2el kie4lei kiel3o 2kiern kier2s kie4sa kie4z ki1f4l ki1f4r ki3k4 2ki3l2a 2kilä 2kim 3kin. ki2nä 4kindex 2k1indi 2k1indu 2k1inf k2ing kin2ga king3s 2kinh k2ini3 kinik2 k2inn ki3n4o kin3s 2k1inse k1inst 2k1int ki3or kio4s 3kir 2k1i2so kis2p kis5s kist2 kiv2 kive4 2kiz 2k3j 2k1k4 kkab4 kl4 4kl. 4kla. 2k1lac klan2 2kland klan3du k4lar k1last k1lauf k3laug 2k1läd k2lär k2le 4k3le. kle2br k3leg 2kleh klei2e k3leit k3lem. kle2o 2k3ler kle2ra 2k3leu kle3us 2klic k2lien k2lif 2klig 3k2lim k2lin k3lin. 3k4lina k4link k2lip k2lir k2lisc 2klist klit2s 2k3liz 2k3loc 2klok 3k4lop k3lor klos2 klo3sse klost6 2klöc 2klöf k2löst k4löt k1lu klu4b k2lud k2lug k2lum 2klux 2k1lüc 2kly 2k1m2 4kma kma2la kmas2 kma3sse k2n2 k4nac 2k5nach 2k3nad 2knah 2k3nam 2k3näp k3ne k4nec kne1e 2knes kne3tu 2knetz 2k5neu 4kney kni4e 2k3niv kno2b3l k4nol 2knorm 2knov 2k3num 1ko ko5ad ko2al kobal2 2kobj kob4s kof3f2 koffe3i kohl2e kohle3i koh3lu ko3l2a ko3le kol2k3 3kom komer3 4komn ko4mu k2on kone2 ko2nem kon3s4 kont6e ko2nu ko3on 2kop. ko1pe 2koper kopfa2 kop4fen kop6f5err ko3pte ko3r2a kor2ba kor2bl kor2br 2k1orc korder4 kor6derg ko2rel 2k1org kor2k1a kor3m kor4nac kor2n3ä kor4no2 2korpi k2os k4os. ko4sk ko2s1p 3k4ost ko2ter ko3ti kot4r kot1s2 kot4tak k1ou ko3un 3kow ko2we 2k1ox 1kö köde2 k2öf k1öl 2k1p2 2k3q k2r2 2k3rad 2k3rah k4ral kras3 kra4ss k3rats 2kraum k4raw k4raz k4räc 2kräd k4rän 2k3räum 2k5re. 2k3reak 2k3real k4reb 2k3rec 2kred. 2k3rede 2kredn 2kredu 2k3ref 2kreg 2k3reic kre1i2e4 kreier4 k3reif 2k3reih 2kreim krei6sei k3ren 2kresu 2k3rh 2krib 2k3ric 2k3ries 2krip k3risi krob4 k4roch 4k3roh k4rok k4ron k4rop kro4ss 2krot 3kroth k3rou 2kröh 2kruf 2k3run 4k1s ks3a2b k3sac ksa2k k4s1amt k2san ks3a2r ksa4s k2sau ksau2f k2sav k2säh k3s2c ksch4 k2s1e2b k2s1ec k3s2ed ks1ei ks2eid ks2eif k4seind kse2le k2s1eng k2s1ent ks1er ks2ere k2serf k2serg k2serk k2serl k2sers k2serw k2s1e2v k2sex k4s1i2d ks2im k2s1in k4s1is k3s2ke ks3kl kso2 ks4on k2sop k2s1or k2sö ks1pa k2spal k3s2pat k2spä k3spe ks2pel ks2pen k2sph ks2por ks2pul ks5s2 kst2 k2stal k4s3tanz kstat4 ks3tat. k3stäl ks4tel ks1tie k4stier k2s1tis k2stit k2s1tor k4strop k2stuc k2stum k2s1tur k2stüt k2s1u k3sul ks2zen 4k1t kt1abr kt1abs k2t1ad k3tag kt1akt k3tal kt1am k2t1an kt2and k2t1a2r kt3a4re kta3ri k2t1au kt3aug ktau2s ktä3s kt1ein k2tek k2t1ela kte3li kte4n1 k2t1ent k4tentl kten3z kte2ra kte3ran kt4ere k4t3erfo kt1erg k2t1erh k2terö kte3ru ktes2 k2tex k2t1h k2t1i2d kti2me kt3ind kt1ing kt1ini kt3inn k2tint kti2s1e k2tiso kti2st kti4ter kto3b k2t1of kto5ren. k3t4ran kt3ras k2t3rau ktro3me kt3run kt3rü kt1s kt3s4a kt3sä kt3se kts2el ktsen1 kt3si kts1o kt2sor kt3s2z ktt2 kt1ums k2tuns kt3z2 ku2al ku1c kud4r 3kug ku2h 2k1uhr kuh3s ku3la ku3l2e2 ku3l2i 2kulp kul2to kul2tr k2um. k2um4e 2kumg 2kuml kum2sp k2u3n2a kun3da kund2e kun4s kunst3 2kunt 2kunw 4k1up. kur2bl ku2rei kuri2e kuri4er 2k1urk ku2ro kurs1c kur2sp kur2st kur4ste 2k1urt4 kur3tsc kusa2r ku4schl ku2sp kus3ses 2kust kus3ta ku2su ku2ß 2kut. kut2a kuto3 1kü kü1c 3küne künf3 3kür kür2s 2k3v 2k1w k3wa 2k3z2 kze3l 3la. la3ar l1ab 3l2ab. lab2a la2bad l2abä 2labb lab2br 2labd lab2e 4la2ben 4labf 2labg 2labh 3labi l3a2bit 2la2b3l 2labn 3lab2o 4labo. la3b4ra lab4res la2bri 2labs la2bus 2labw 2labz la1ceb l4a3che lachter8f lacks2 1lad 2l1ad2a 2ladd la3de. la3d2i 2ladj 2l1adl 2ladm l1adop 2l1a2dr 3l2adu 2laf la2fa la2f1ei la2f1er laf1r laf3t4 la2fu la2ga lag3d l2ager lagerin5 4lagg la2gio lag3l la4g3n lago4 la2gob lag3str 2la3ho 3lai lai4s1t lake2 la2kin l2akk la1k4l la2kro lak3t2 2l1al la2la 3lala. 3lali 4lalt l2am. lami3t lam2m1a lammen8ge 1lammf la2mor l2amp l3ampu 2l1amt lamt4s la4mun la2na l1anal la3nan la4n4at la4nau 2la2nä 3l2and l4and. lan2da lan4dam land3au l4ande lan6derh lan6d5erw lan6d5erz lan6d5inn l4an2d3r lan3dri lan3erd laner4f 2lanf lan4gan lan6g5esc lang3s2 2lanha l2anhe 3lan2i 4lanl 2l1ann l1ano la2nof 2l1anp 2lans2 l1ansi 2lantr 2lantw 2lanw lan2z1w 3lao 2l1apf la2ph 2l1a2po lap2pl la2r1an 2larc lar1e2b la2r1ei la2rel la4rene larf4 lar3g lar3ini 4l1a2rom l1art 2lart. lart2h l3arti lart4r 3laru l2as. la2sa la4sam la4sä lasche4 4lasd la5seb la4sei la4s1e2l 2lash la2sin la4sis la2so 2la2sp 3lasser l2ast la4sta last3an la4steu la2str last3ri las3tro las3tur la2stü 1la2ß3 la3t2e 2l3a4tel la5t2i 2l3atl 2latm lat2o la2tö la2t3ra lat4ri lat2s lat3st 2lat4ta lat4tex lat4t3in lat2t3r latzer4 1laub. lauben6s5 lau2b3r laub4se laub4st lau4fin 2laufn lau2fo lau4fri 1laug lau3gl 3laun 4laun. la4us 3l2aus. 2l1ausb lau6scha 2lausd 2l1ausf 2lausg 2lausl 2lausr 2l1auss 2lausz 2lauto lau2tr la3va lave4n 1law lawa4 1l2ax la4xel l2ay lä1c 2l1ähn 1länd l1äpf 2läq lär2ma l1ärme 2lärz lä2s5c lä4s3s 2lät 2läub 2läuc 2läue 1läuf 2läug 2läx 1là 4l1b l3bac l2bant lb3a2ri lbau1c lb1ärm lbb4 lb2ei l4b3eink l4b3eise lbe4ral lberin5 lbe7s l4b1e2ta l2b1id l2b1ins lb4lad l3b2lat l3blä lb3le l2bled l2blic l3blo l3b2lö l3b2lu l2b1o2ra lb3rea lb2s lb3sa lb3se lb3si lb3sp lbs2t lbst3ac lb4ste lbst3ei lbst1u l2b1uf l3bum lbu4n lbus3s lbzei2 2l1c l3ca l3che l4chei l4chent lchermas8 l3chi lch3le lch3li l3chlo lch3n lch3r lch3s2 lch3ü lch1w l3cl l3co 4l1d ld3a2b1 ld2ac ld3ack l2daf lda2g l2d1ah lda2i l2d1ak l2d1al l2d3a4n ld1arm ld1ass l2d1au ld3au4s l3däm ld1är ld1äs ld1ät ldbus2 l3de. lde4ben l2dei ldein7 l2d1elf l2d1e2mi l2d1ems lde4na lden5erg l4dentl l3der. l4d3er4fa l6der6geb ld1erh l4der4he l3d2erl l6derlas l6derlaß l3d2ern l2d1er2p lder4tr lde3sa lde4sel l2d1es2s l2dex ldi2c l2d1id ld1i4mi l2d3ion ldo2b ld2on l2dop ldo2r l2d1ori ld2os ld2ö2 ld3r ld4ram l2dran l2dre ld5rie l3d4ris ld4ru l2drüc ld3sa ld3ska ldt4 ld3th ldt5s ld3tu l2d1ul l2d1um 1le le2ad le3ar le2as 3le3ba leben4s3 le2bl 3lebr le2b3re 2lec lech1a le2chi lech7t6e le2dr le2er lee4ret le3f2a 2l1eff lef4o le2g1ab leg1as le2gä le2gl 3leg4r 3leh 4lehe. leh3r2e 4lehs 4leht lei4ble l2eid lei3ere lei4fan lei4fei leifer6g 2l1eig lei3gl 3leih lei4hau lei3l2 leim3p 3l2ein. leinbu4 leinbus5 3l2eind lein4du l4eine lei6nerb le2inf le2ini 2leink l1einn l3einsa 2leint l2einu le2is leisch5a lei8schei lei6scho lei6sern l1eisf lei6ss5er leis3st lei4str lei4ßer l2eit lei2ta lei2to leit3s2 3leko 2lektr 2lekz 3l2ela le2le le3lei 2lelek 6leleme le3len leler2 leler4s le3les 2lelf. 2l1elfe l2eli lel3s l2em. le3mal le2mau le2m1ei 3lemes 3lemet lem1o2 le2mor 2lemp le2mu le4mun l4en. len1a len3ab le4na2d le4n3an le4n3a4t le2nä l1endp 4lendun l4endur le2n1ed 4lenerg le4neur 4leneuv len4gag len4kau len4k3lo len4klu l1enni len6sein 4len4sem len6serk len3ska len3sz 2lentg 2l1entk 4lentla 2lentn 4l3en4tro 4l3entw lent4wä 5lentwet 2lentz 2lenzy leo2f le1o4s 2lep 3lepa 3lepf 4l1e2pi 4lepoc lep4pi 3lepr l2er. l2e1ra le2rag le2r3ap le2ra4s le2rau le2r1ä le2r1e2b ler2ec l3ereig le4r3ei4m le4r3eis le2rel le4reng le4rerg le4rers le2re2t 4l3erfas 2l1erfo l2erfr l2erfü l1erg l2erga l4ergef 3lergeh 6lergen. l4erger l4erges 3l4ergew 2lergi l2ergl l2ergr lergro3 4ler4heb 4lerhol lerin4s lerk2 l2erka 2lerke l1erkl 4lerklä l4erkle l2erko ler3kr ler3l 5l6erlebe 3l4erlei 2lermä 3lerna ler4nal ler4nar 3l4erne ler4nei 2l1erö 3l2erra ler4ric l4ers. l1ersa ler4sto lert2 le2rup l4erwa ler4wer 2ler2wo 2l1erz ler2zä l3erzeu ler2zo l4es. les2am les2e le3seb lese1i 2l1esel le5s4h lesi1 le3s2k les4ki le3so le2spo lest6 leste3 lester6i 3lesu 4lesw 2lesy le2tab 2le2tap 2le2tat l1e2th le3tha 2lethi let2i letsche6 let2to2 lett1r lett1s4 le2u 4leue 3le3u2f 2l1eul le3unt 3leut l1e2vol 2lex 3lexd 3lexik le2xis 3ley 1lé 2l1f l3fah lf4at lfäs3 l2f1ec lfe1e lf3einh l2feis lf2en l4ferei lfe4rel lf1erl l3fi l3f4lä lf3led lflo7sses lf4lö l3f4lu lf3ram lf3res lf4ru lf4rü lf2spe lf2s1ti lf2su lfun2 lfur1 2l1g l3gas lga3t lgen2a lgene2 lgeräu3 l2geti l3g2i lg2lö l3go lgoa3 lg4p l3gra lg3re l3gro lgro3s lg2s lg4s3t 4l3h2 5lhi. 1li l4i1a lia2b li2ad li2am. li2ams lian2g li2ast 3lib4 libi3 li1c lich4ta lich4to 4lick li2cl li3d2a l1ido l2idy liebe4s3 lie2br 3liefer li3efl lie4n1a2 li3ene lien3t li2er lie4rei li3ern lie4s3c lie4sta lif4fes lif2fo lif3ti 3lig li4g3ers lig4n ligs2 li3ker li3k2o lik2sp lik4tau lik4ter lik2ti lik2t1o2 lik2u li3l lil2a li3m2a lima1c lima3t4 2l1imb 2limm 3limo 2limp lin2a li3nar 2lindi 2l1indu li2nef li2neh li2nep li5ner li2nes 2l1inf 2l1inh lin1it 2l1inj lin4kan lin4kar link2s li2nol l2insa 4linsel 2linsp 2linst 2linsu 2linsz 2l1int li3n2u 2l1inv 2linz li2o li4om lion5s li3o2st 3lipf 3lipt 3lis. li3s2a li3schm li4schu lis2h li3shi 3lisk 2l1isl 2l1i2so 3lison li2sp liss4 2liß lit4a l1i2tal li3t2ä l2i3t2e 3liter li1th li2t3r lit1s2 lit3se lit3sz li4tun li2tur litz4er 3liu liv2e li2vea li2ves livi3e li3vr 2lixi li4z3ä lizei3 4l3j 2l1k l3kale lk1alp l3k2an l3kap l3kar. l3ke lk1erd lke3r2e lk2l lk3lad l3k4las lk3lic l3k4lu lk2men lk4ne lk5ner lk3nu lko2f lk1ofe lkor2b lk3roc lk2s1 lk3sän lk4set lk3si lk4spe lkt2 lk2ü 4l1l lla2be l2labk l2labt l3labu ll3acht lla2de ll1aff lla3gl l2l1am lla2ma ll2ami ll2anb lla4ner l4lani l3lans. ll4anwa ll1anz l4l3appl ll1arm lla6tern l2lath l4latm l2l3att l2lau ll3aufg ll3aufk ll1au2s1 l4lausf l2la2w l2l1äm l3läs l2läu llb4 llch4 ll3d4 l2le2b ll5ebene l3lec ll1ech lle3er l2l1ef lle2gu lle2he l2leib ll1eic ll1eim l4l3eise lle2la lle2m l2l1emi l3len. lle4na ll3endl llen3dr ll3endu llen6dun l4lentf l4lents l3lep l3ler. lle2ra l3lere l6ler6eig ller4fo ller6geb l8lergene l4lergo ll3erho l4l3ermi l4l3ernt ll3ertr ll6erwei ll2es l3les. l2le2se lle4th l2leuc l3leur. ll1exe llg4 l2lieb l2lieg lli4gan l3lik lli4la l2l1ind l4linf ll1ins llin6sen l2lipo ll3k4 ll5m2 ll3n2 ll1ob l2lobe l2lo2d4 l2l1o2f llo2ge ll3ol l2lope ll1opf ll1or l6lorb llor2g l2lo2ri llo2te l2l1ou l3low ll1ox llö2g l3löh ll2säu ll2s1es ll3ska ll2spr ll4stor ll3t llt2e llt2i llti2m llt4r llts2 llu2d l2lu2me l3lung l2lu2p ll1ur llust6 l3lut l2lüc llü2d l2lü2g l3ly ll3z2 4l1m l2m3a2b l2m1ad lm1a2ge lm1aka l2m1a2m l3mana lm1apf lm1art lm3att lmä2s lm1ä4st lm1c lmd2 lm3e4dit l2m1ef l2ment l2m1e2p lmer2 l2m1erf l2m1erl l2m1erz l4messa l2m1i2d lm1ind lm1ins lm3m l2mof lm1orc lm3p2 lmpf4 lm3s2k lms2t lm3str lm3s2z lm3t4 l2mum l4munt 4ln ln2ab lna2r ln3are l3n2e lnes2 l2n1in lnus2 l1nü l1ny 1lo lo4ak 3lob. l2oba 3lobb lobe4s 2lobj l1o2bl l2obr lob4ri lo4chel 3lodr lo3dri l1ofe lo2fen lo4gh lo2gl lo2gor lo2gre lo3ha lo3h2e 4l1ohr loi4r 3lok 4l3okk lo2k3r 5loks l4ole 2l3o2ly lomä3 lo2min lo2ner lo4nin lo2n1o lo2o l1ope 2lopf lop2p1a lop2pr 2lopt lor3am lor2an lo4rä 5lorb 2l1orc 2l1ord lo3r2en 2l1org2 lori4di 2lort4 l2os. lo4sa 3lose lo4ske lo2spe lo2s1pr los3ta lo4stel lo4steu lo2s3to lo2s3t4r lo2ßu lo2t1a lo3tha loti4o lots2 2l1ov lo2ve 2lox 1lö lö2b3 2löck 2löd lö2f 2l3öfe 4lög 2l1öhr 2lök 2l1öl 2löp 3lösc 4löß 4löz 2l1p lp2ar lpar2k1 l4p1är lp2f lph4 l3phä l2phir lp1ho l3phr lpt4 l3pu 2l1q 2l3r2 lra4ss lrau2s lrebs2 lro2h lrö4 lrös3 4l1s ls3a2b l3sac l2sa2d ls2al l4s1amb l4samp l2san ls3ane l3sare ls3a2ri l3sark lsau2 lsau4m lsau4r l3s2äm lsä6s ls2äug ls1äus ls2c l4schin l4schmü l2s1e2b ls2ele ls1eli l2sent ls1er l2serf l2serg l2serh l2serk l2serl l2sers l2serw lse2t ls1eta ls3ha l2s1id l2simp ls2kal l3s4kele l4skla l4sko ls2ky lso4b l2sop l4s3ort. l3sos l3s2öl l2spac ls2pe l2s3ph l2s1pir ls2po l3spri ls2pu l3spul l2spun l4s3s2 lst2a lstab6 ls2taf l2stas l4s3tat. l4state l3stau l4s3täti l4st3erk l4s3terr l2s1tis l2stit l4stoch ls1tor l4stor. l4store l4stors l2s1trü l3suf ls1um l2s1un ls2und ls3unk 4l1t l3ta. l2tab lt1abs ltag4 lt1am l3tami ltampe4 l3t2an. ltan3d l2t1ap lt1ara ltar8beitn l3tark lt1art ltar6tik l3tartu lt1au l4tauf lt3aut lt1äh ltbau1 lt1eh lt1eig lt1ein lte3mi l3t2en lten6gel lten4sp l4tentl lt3ents lte4ral lter4fa l3t2erg l4terhe lter6ken lter4ku lter4nä lte2ro lt2erö lter4se l2t1esk l3t2est lte3sta lt2et l3tet. l2t1h lt3hag l3thas l4t3hei lthol2 l3t2hu lt1ide ltimo4 l3tin. l3tine l2tiso l3t2i3t l2t1ob l2t1o2f l2tord l2torg l2t1o2ri lto2w lt1öl l3tön lt1ös lt1öt ltra3l lt3räu lt3rec lt3rei lt3ris lt1roc lt3rol l2t3rö l2t3rus l4ts lt2se2l lt4s3ort lts1pe lt1s2ph lt4stec lt2sti lt3t lt1uh l2t1um lt2um. lturan4 lturen4 ltu2ri lu1an 4lu2b3 luba2 lub5s2 lu2dr lu2ec lu2es lu2et 1lu2f2 2l1ufe 2luff lu3fo luft1a luft3e luft3r lu2g1a lu2g1e2b lu2gei lugen1 lu2gi lug3l lu2go lu2g3r lug3se lu2gu 2l1uh lu1id. lu4ig lu1is. lul2ö lume4 2lumf 2lumg l1umh 2lumk 2luml l2ump 1lumpe lum2ph 2lumr 2l1ums lu3mu 2l1umw 2lumz 1lu2n 2l1una lund4 2l1unf 2l1uni 2lunr 2l1uns 2lunt 2lunw 4luo lu2pf l2ura lu2r1an lu2rat lu2rei 2lurg l2uri lu2ris l1urn lu2ro 2lurs l1urt lu4ru lu3sak lu2san 2luse lu2sp lus4s3a lus2s1c lus4sel lus3sen luss3er6 lus2s1o lus2s1p lus4s1t 1lust lu2sta lu2stä lu6sterl lu2st1o2 lu3str lust3re lu2s1u 4lu2ß1 lu2t1a4 lut3au lu2tä lu2t1e4g lu2tel luter2 lut3erg luter4s lu6t5ersa lu2thy 2luto lu2tob lu2t1o2f lu2top lu2t1or lu2t3r lut5schl 2lüb 3lübd lück4e2 lücker3 2lüd lüf3te lü2hel lüh1l 2l1v2 lva3 l3vl l3vo lv3r 4l3w4 lweis4s 2lx 1ly ly1a2 ly3c ly3es ly1l 2lymp 3lyn ly3no ly1o lys2 ly3t ly1u 2l1z lza2 l2z1ac l2z1ag l2zan l2z1ap l2zat lz1aus l2zäp l2zär lze2l l2zele l4z3enth l2z1ep l2z1er2h l2zerz l2z1id lzi4m lz1imi lz3l lzo2f l2zö lz3t2 l2z1u4fe lzug4s lzvol2 lz1w lz2wec l2zwu 1ma 3ma. maa2 m1ab m3a2bar m2abä 2mabb m2abe 2m3abf 2mabg 2mabh 2mabk m2abli 2mabm ma2br m2a3b4ra 2mabs 2mabt 2mabz ma3chan mach2e mach8terh mach8t7ers mach4tr ma2ci mack2s 2m1act mada2m m2adä ma2del ma3dj 2m1adm 2m1a2d4r ma4d2s ma1f4 mag2a ma2ge. ma2geb ma2gef ma2geg ma2gek ma2gep ma4ges. ma2get ma2gev ma2gew 2m1agg magi5er. magi5ers ma3gl 2magm ma3g4n 2m1ago ma3ha mahl2s ma1ho mai4s3e ma2ke. 2m1akt mal2ag mal1ak ma4lakt ma2lan ma2lau ma2lär 2mal2de m2aldi ma3le ma4leb mal2er ma4lex mali1 mali3e mal3lo mal3lö3 2mallt ma2lon ma2lop m2alp mal3t malu2 ma2l3ut 3malv ma2mid mam3m 2m1a2nal ma2nar 2m1a4n4at ma2nau 2m1anä 2manb man2ce 3man3d4 ma2net m2anf mang2 2man3ga m4angel 2m1angr m2anh 3manip 2manl m2anle 3mann 2manod man3s 2m1ansa 2mansä man4sh man2t1h 2mantr ma4n1ut 2manw 2manz m1anza ma2or ma2phr ma2po ma1q m2ara 4marag mar2an 2m3arb mar3g2 3ma1rh ma3r2i m2ark mar2kr 4mar2o maro3d 4marr mar6schl mar6schm mar6schr mar2sp mar2su 2m1arti ma3r2u m1arz m2as ma3s4a mas2e 3ma1s2p masse4n ma3sses mas6ses. mas6sest ma5sset mass1t ma3s2su 3mas2t ma2sti ma4sz ma2ta2b ma2tan ma2tä m3a2tel ma4t3erd ma4t3erz m4atme 2matmo ma2to ma4tort mat3se mat1sp matta3g matt4r mat3url 2m1au2f 3maul ma3un mau3r 2maus mau2ta m4ay ma1yo 1mä 3mäc mä3he 2m1ähn mäh1r 3män 4m1änd 2mäo 2m1äp mär1 mär2kl mär2z1 mä1t4r mäu2s1c 2m1b2 mbe2e mber2e mbe3ri mbert4 mbi3er. mb4l mble1i mb4r mbu3sc 2mc m3ch 4m1d m2dan m2d1a2s md1är mde2a m2dei mde2m m2d1emi m2d1ent mder2 m2d1erl md2ö md3ras md3s2e mdt4 m2d1um 1me me3an me3at meau2 meb4 me2ben 3mebr me1c medi3e4 me1e2m mee2n mee4r3ei 2m1eff mega3 me4gel 3meh meh6l3er mehrer4 2m1eif 2m1eig m2ei3l2 mein4da meiner6k mei6nerl 3m2einu m2eist me3lam me3l4ant me2l1au melb2 mel3d2 melde3i me2lek 2melem me2ler melet2 2melf. 3melk mel4k3ei mell2i 3melo me2lob mel2se melt4 6mel6tern 2m1e2mis 2m1emp 2m1e2mu m2en. men3ab me3nage me4n3an men3ar me4nas men3au 2m1endl menen1 4men4gag men3ge me2nim men3k4 men2on men4se. men4sem 6mensemb men4sen men4ser men4ses mensi4d men2so menst4 m4enta men4t3ak m4entei ment5eig men6t5ers 2mentn ment4sp me1o 2meou 2meö 2mepa 2m1e2pi 3m2er. me1ra mera3l mer2as me2r1e2b me4rens mer4err mer4erw 4m3er4gän merin4d merin4t 4mer4klä m4ersh mer5sm mer6stel mert4r merz6eng 3mes me2sal me2sä mes2e 4meser mes2po 2mes2sa mess3an mes6ser6g mes4s1o mes2sp mes2s1t mes1ta me2str me3su me3sze 3me2ß3 me3ta me3th meto1 me2tö me4trig met6t5en6d meu1 2m1ex me2xe 1mé 2m1f4 mfi2le 4m1g2 mgang4 mglim2 4m1h2 1mi mi1a mia2b mi2am 2m1iat mi1ä mibi1 mic1e mi1ch mi2ci mi3da mi2di. mi3dr 2midy mie3dr mi3ele mi4e3no mierer4 mie2ti mie4to mie2tr mi1f4 3mige mi3h mik1an mi3ke mi4kel mi4kens mi3k4l mi2ku 3mil mi3la milch1 mil4che mi3l2i mil3le mi3l2u 4milz m2im2a 2m1imm 2mimp min2ac mi3nak min5anze m2inde 2m1indu mi2nef miner1 mi4n3e4ri min2eu 2minfo min2ga mings2 2minh mi3ni mini3k4 mi3nod mi2nof 2m1inse m1inst mi3nu mioni1 mi1p 3mir. 3miri 3mirs 3mirw 3mirz 3mis. mi2sa mi4scha mi4schr mi4sch3w mise1 2m1i2so mis2pa mi2spe mis5sar mis4ser mis4st mi2sta mi3str 3misu mi2ß1 3mit mi2t1a mi2t1h mi2to mi2tr mi3tra mit3s2 mit5sa mit3ta mit3t2e mitte3s mi2t1u 4mitz mi3v2 2m1j 4m1k4 m3kn 4m1l2 ml3c m3le ml3f ml3k m3lo ml3p ml3s 4m1m mma3a mm3achs m2m1ak m2m1al m2mans mm1anz m2m1ap mm2app mm1art mmas4p mma2ß mm1aus m2mä4 mm1äu mmd2 m2m1e2b mme2c m2m1ef m4meh m2mei mm1ein mm3eise mme2l1a2 mme4lin mm2ene mmen6te. mmen6ten m4mentl m4ments m4mentw m2me2nü mme2r3a mme4rec mmer6geb mme2s1 mmes3a mme3sc mme4sz m2me4te m2m1eu mmga4s mmi3el mmi3m mm1inb mm1inh m2m1ins mm1int mm2is mmi3sc m4mita mmi5tw m2mo2l m2mor mm3p2 mmpf4 mms2 mm3sa mm3si mm3te m2mum mm2un mmu3r m2mus mmül2 2m3n2 m4nesi 1mo 2m1o2be 3mobi 2mobj 3m2od mo3de mo2dr m1of mo2fe 3mog 2mog. mo2g1al 3m2oh moh2a moi3r mo2k1l 2mol. mol3d 3mom mom2e 3m2on mo2nan mo2nä mon4dac mon4del mon2do mo2ner mon3s2 mont2a mon3th mo1ny 3m2o2o 2m1o1pe mo2per 2m1opf 2mopt mo1ra mor2an mor2d3a mor2dr mo2rei mor3g mor3t2 3mos mo4ska moster4 mo2sto mo3t2h mot4r mous2 2m1ox mo1y 1mö möbe2 mö2c 2mö2f 4mök 2m1öl 4m1p mpa3ne mpe2la mpe4lin mpe2n m2p1ene m2pf mpf1ef mp4f3erf mpf3erg mp6fer6ge mpf3erp mp6ferpr mp4f3err mp4f3er4z mp2f3l mpf1or mp2fr mp1haf mp1hos mpin2 m3plä mp3lei m4p3lem. m2p3len m2p3les m3pon mpor6ter mpot2 mps2 mp3sh m3pu 2m1q 2m3r4 4m1s m2san ms1as m3sat msau3e m2s1än msch2 m3se. m2s1e2d m2s1ef m2sein m2se2le mse2n m2s1ene m2sent ms1erf ms2erh mse2t ms1eti m2s1eu m2sex m2s1o2d mso2r ms1orc ms1ori m2spä m2sped m4spl ms2por m2spot m2spro ms2pu m4s3s4 m4stag m2stal m2stit m2sü m4sw m4szi 4m1t mt1ab mt1ak mta2m mt1ar mt3aug m2t1e2d m3tei. mt1ein mt1eis mt1elt mt1emi m4tenga m4t3engl m4tentf m4tentg m4t3en4tr m4tents mter2 m2t1erb m4t3erei m2t1erf m2t1erg mt1erh m2t3e2r4i m2t1erk m2t1erl mter4n m2t1ers m2t1ert m2teta m2t1eu m2t1ev m2t1h mt3ho m2t1i2d m2tim m2t1in m2t1i2r mti2s mtmen2 mt1ob mt1op m2t1öl mt1ös mtra4s3 m2t3ro m2trö m4ts mt2sa mts3chi mt3sco mt2s1e mt3send mt3s2ka mt3s4kel mts3tät mtt4 mt1um mtu3re mt3z 1mu mu1a 2m1uh mu3la 3muld 3mult 3mumi m1ums mum2s1p 3mun mundan4 mun6derf mu2ner2 4m1unf 4m3ungeb mu3ni mu4nin 4mu4niv 4munw 4munz mu4r1u2f 3mus. mu4s1a 3musc mu2s1o mu2sp mu3s4se. mu3s4ses mus4ste must4e mu2s1to mu2str mu2su muße3 mut1au mut2st 1mü 2müb 3müh mü2her mühl1a mül4len 3mün mü3s2si 3müt 2m1v mvoll1 2m1w2 mwa2 mwa4r mweg2 mwel4t3 mwu1 3my my1al 2m1z2 mzel4li mzu1 mzug4 1na 3na. 2n1ab 3naba na2bä n3abh 3nabi n3abk na2b3l na2bor na2br nab4rü 4n3abs2 na2bus 3na2c n4ac. nach1 nachen4 na5chen. n3achse nach3sp nach8t7ersc nacht8raum n1ada na3dab 3nade na3de. nadel1 na3den na2der 4n1adl 4n3adm n1a2dr 3na3e 2n1af na1fra nag2a na3ge. na2gem 4n1agg n1a2gi na3gin na3g4r 3n2ah na2h1a n4ahm 4n3ahn 4n3aho2 3nai nai2e n1aig 4n3air nai4re n2ais 2n1ak 3nakä 3nako na2kro 4nakt n2al. na2l1a2 nal3am na4lar na2lä 2n1albk n2ald nal3da nal3ei na4l3ent na6lerei na4ler4g na4lerm na4l3erw nales2 nal1et nal1ex nalg2 na2lid nal3la na2lop nal2ph nal3s n2als. nal3t2 n2alty na2lu 2naly n2am. na2mat 3name na3me. 4na2mei n4a3men 4n1a2mer na2mid na2min na3m4n 3n2amo n1amp nam2sp 2n1amt namt4s na4my n1an 4na2n4a na4nat n3a2nä 4n3anb n3and2 nan1eu 4n3anf 4n3ang 4nanh 2nani 4n3ank 4n3anl 3n2ann 4n3anna 4nano nan2o3b 4n3anp 2nanr 4n3ans 2nantr 2nanw n2anz. nanzen4 nan6zene nan6zeng nanzer4 na3ot na2per n1apfe 4napfel n3a2pr n1aq n1ar 5nar. na2r1a 2narc n2ard n2are n4are. 3nari n2ark n2arle 2narm n2aro na2rom n2arr n2ars 2nart n2arta n2arth na3r2u 3nas n4as. na4schw 4n1a2sp nas2s1c 4n1assi na2str 4na2sy nasyl2 3naß 3nat n4at. nat3au nat1ei na3ten na2t2h 4natm nat2o 4natom 5nator nat1r nat4sa nats1e na3tu n1au nauf4fr nau2fr 5naui 3n2aul 4nausb 4nausd 4nausf 4nausg 4nausl n2auso 4nausr 4n3auss 4nausw 4nausz nau3te 3nav nave4 navi5er. navi5ers 1nä 2näb 3n4äc 3näe 2n1äf 3näg nä2hi 3nähm 2n1ähn nä2hu 2n1ä2m 2n1än 2näp 2näq nä2sc n2ä6s3s 2näu 3nä1um 2n3b4 nbe2in nber2e nbu3s nby2 2n1c n2c3ab n3can n3ce4n n3ces. n3chl nch3m ncor2 n3cr n3cu 2n1d nda1f nd2ag n3dai n2d1ak n2dana n2dani n2danz nd1arr n3dat nd3att nd1au n2daut n2dax nd1äng nd1c nde4al. n2d1ede n3dee n2dei nd3elfe ndel3l ndel4sa ndels5en nde4mot nden3sk n4dentl n4dents nde3o2 n5der. n5deren nd2erh n5deri nder6läs nde4rob n4de4ros n6der6sat n3d2es nde2se ndes3s ndi2a3 nd1imm n2dof ndo4n3a n2dopt nd1or n2do2ri n2d3ott n2dö nd2ös nd4ram n2d3rat nd3rau n2d3re n2drif n2d3roc n2drod n2d3rö n2drui n2d3run nd4sene nd2spr nd3th ndt4r n2duns ndwa5re ndy3 ndys2p 1ne 3ne. ne2ap 3nea4s ne3at ne3au 4n3ebene ne2bl 2n1ebn neb4r 2nec 3neca 3nece ne2ch neck2a ne2dit 2nee neei2 ne3ein ne3eis neema4 neen2 nee1r neer2e n1ef n2ef. n2e3f2a 2nefr 2n1egg neg4l n1e2go neg4r n1ehe 2ne2he. 2nehem 2nehen2 nehe2r 3nehm 4n3ehr 2n1ei 3neia 4neic nei4dei nei4dr 4neier 3neigt 3neigu nei4la 4neing 4neinh 4neink 4neinl 4neinz 4neip neiss4 ne2ke 2n1eks nek3t2 2nekz ne2la nel3b n1e2le 4nelek 4nelem ne3len ne3lex nel2i ne3lid ne2lit 3nelk n2ell nel4la4 nel4lei neller6f nel4lif 3nel2o 3nelu 3n2em. ne3mas 4n1emb 4n3emp 2n1ems 4nemu 3nen n4en. n2en3a nen4am ne4nan ne2nä n2enb n2enc nen4dar 4n1endb 4n1endd 4n1endf n1endg 4n1endh 4n1endk n1endl 4n1endp 4n1endt 4n1endw nene2b nen3ei nene4m nenen1 ne4nene nen3erb ne2n3eu n2enf 4n1engb nen4gen 4n1engs 4n1engt n1engu nen4gun n2enh ne4n3i n2enj n2enk2 n2enm nen4nar ne2no4 nen3s4e nen3sk nen3s2p 5n2en3t2a 4n1entb 4nentd 4nentf 5n2enti 4n1entl 4nentn nen3to 5nentr 4n1ents 4n3entw 4nentz ne4n3u n2env n2enw nenz4er ne2o3b ne2oh ne2or ne2pen 2nepf 2ne2pi 2nepo ne2pos nept4 n4er. ne1ra ne2rab ne2rac ne2r3af ne2rag ne3r4al ne2ram ne2ran ne2r3ap n2erat ne6ratio ne3rato ne2rau n2erb2a 4n3erbe. 4n3erben 2nerdb ner4dig ne2r1e2b ne2rec n1erf 4nerfas 3nerfr 2nerfü 2ner3g4 3nergr n1erh 4n3erhö 3neri n2erj n1erk 5nerka n2erkö n2erli 2n1erlö nerma3 nermas4 n1ermi 2n1ernä 4n3erneu 2n1ernt n1eros n1eröf ne1rös n2ers. 2n1ersa 3nerse ner4sk 4n3ersts nert4 3nert. ne2rup 3n2erv 4nerwar 2n1erz n2es. ne2sal ne2sei ne2s1ev 2ne3sh ne3ska ne2s1of ne2s1or ne2s1pa 4n1es2si 2n1e2st3r 4nesyn 3n2eß ne2tab 2ne2tag net1ak ne2t1an 2ne2tap 2ne2tat ne2tau ne4te2l ne2th net3ha ne3ti ne4tin ne4tob net1s2 n2ett net3ta net3te net3tr 2n1e2tu net4zer net2z1i ne2u neu1c neu4ere neuer4f neuer4k neuer4r neuer4s neuer4w neu3g4 2n1eup neur2 neu2ra neu3t 3n2evi n2ew ne3wa 2n1ex ne2xi 5ney 3nez 3né 2n1f n3f2al nfalt2 n3f2ang nf4ar n3f2ä nfäs3 nfe2i n3f2en n3f2er nf2es n4fex nff4 n3fi nfi4le. nf4le nf2o nf4r nf3s2 nf2tan nf3tei nf2t3r nft2st nft4ste n2f1u 4n1g n3gabe ng1abt n2g1ac n2g1ad n2g1ak ng1a2me ng3anda ngang6st n2ganh n4ganl ng1ant ng1are n3g2ars n2g1a2v n2g1äl ng3d4 n2g1eif n2g1ein ngelb4 nge3l4ei n3g4en n5gene nge5nerw ngenmas6 ngen3s2 nge4ram n2g1erg nger4zä n3g4es nge3s2a ng3hu n2g1id ng2lad ng2läs n2glic ng4lok n3glot ngma7sse. n2gn ng3ne n4g3ni ng4nom ng2nu ng2ob n2g1op n2g1or ngo2ri n2gö n2g3rai ng4ran n2g3rat ng3roc ngro3s ng3rost ng2s1 ngs3an ng4s3au ng5schr ng4s3e4h ngs3pa ng4spar ng4stec ng3ts n2gum ngzei4t 4n3h2 nhe2r 1ni 3n2ia ni3alo ni2ar nibb4 nic4 ni1ce n1id 3n2id. ni3da ni2de 2nidea ni3dr 2n3idy n2ie nie3b ni1el nie3l2a nie4n ni3ene ni3eni nie4rei ni4erna nie4sa nie5sse ni2eu ni1fl niga2 ni2g1ab ni2g1am ni2g1an 4n3i2gel n4igen 2niget ni4gl nig3li ni2gn nig4sp nihi3 ni2kar 3nike ni2kel ni3kerh ni2ki nik3ing ni2kor ni2k3r nik3t4 3n2il ni3l2a ni3l2i nil3l 4nimp nin1 3nin. 3n2ina nin2ac ni2nal 3n2inb 2n1ind 2ninf 3n2ing ning4s 2n1inh 4n1ink2 3nino ni2nor 3n2inp 2n1ins 4ninse 4ninsu 4n1int ni3nu 4n1inv 3n2inw ni2ob ni3ok ni3ora n2ip ni4ron n1irr 3n2is ni4sam ni2san ni2sä nis3cha ni4schw ni2s1e ni3se. nis3el 4n3isol ni2som 4nisot ni2sp ni3spi nis5s4 nis3tha ni2stu ni3stun ni2s1u 2nit 3nita ni1th ni2ti 4ni4tia nit2o 3nitr nit3s nit4tec nit6tell nit6ter6g nit6t5er6k nit4tie nit4tra nitt4sa 3niu niv2 3nix 2n1j 4n1k nk1abr n2k1ac nka2ge n3kal n4kalg nk1ang nk1apf nk3art. nka3sc n2katm n2kato nk1aus n2kaut n2k1äh n2k1äp nk1ei nk2eil nke4lei n4kelem nkelma3 nkelmas6 nke4na nken4te n4k3erle nke4ros nk3ersa n3kesc nke2t nk1eti n2ketu nk1i2d n2kide nk1inh n2k1ins n4klade n3klag nk3leis n2k3len nk3les n3klin nk2lo nk4neb n2knis n2knit n2knu n2k1o4be nk1ope n2kopt nko2r nkord2 nk1ori n2k1ort n2köl nk4rab nk3rät n4kre. n2k3rel n2kren nk3rep n2krez nk3ro n2krol nk2sal nk2se nk3sen nk2so nks2ti nk3s2z nk2tak nk4terg nk4t3ern nkte3sk nkt2et nk2tin nkt1it nk2top nkt1r nkt3ric nk2tro nk2tru nkt4sen n2k1um nku2n nk1urh n2küb 2n3l2 nla3ge nle2ga nli4ne 2n1m2 n3ma n3mä nmen2s n5mi 4n1n n2nada nna2g n2nalg n2n1all nna3m n2nan nna3st n2nau n3nä n3nec nn2ei. n3nelb nne4le nne4na nn2ens nner4ei n6n5ereig nner4fü nner6geb nn4ergr nn2erh nn2erk nner4la nn2ero nne2rö4 nn3erwa nner6war nner2z nne4s1e n2ness nn2eu nn2ex nn3f nng4 n3ni nnk2 nn2o3b nn3obl nn3obs n2nof n2n1op nno2r nn1ori nn4sam nn3ser nn3s2p nnst4 nns3tat nn4stoc nn2stö nn3t2a nn2th n2n1uf n2n1unf nn1ur 1no 3no. no5at 3n2oba n2obel 2nobj no2bla n2oble 3noblo 3noblö 2n1obs nobu2 nobut3 3noby no1c noche4 noch4r 2nod no2de no2ed n1of no2fe 2noff 2n1oh 3n2ohe no2kel 2n3okk no3kr n3ole no2leu no4lig no2liv 2n3o2ly 3no3me3 no3mi 3nomp non2e n1onk n1ont 2nony no2o 3n2opa 3nopä no2per 2n1o2pi 2n1ops no3p2te 3nor. nor2a no2rad n2o3rak no3ral no3rar 2norc nor4da 3nordb nor4des nor2d5r no3r2e 2n1org 3norh 3n2orl 3norm norm2a nor3mal 3norö 3nors 2n1ort 3n2os. nos2e1 no3sh no5s2k no2sp 2nosti nost1r 2nostv nos2u no2tan no3tart no2tä not1e2i no6t5entr no2ter2 noterb3 no2tex not1h no2tho no2t3in no2t3op no2t3r not3tr 3nov 2n1o2x 3noz 2nöd 4nö2f 4n1ök 4n1öl n2ör nö4s3s 1n2öt 4n3p4 npa2ge npf4 npsy3 2n1q 6n3r2 nran2 nra4s3s nrau4ma nräu3s nrebe2 nre3sz nro2h nrö2s nrücker6 4n1s n3sabo n2sa2d n4s1a2gi n2sall n2salt ns3ane nsa2r ns2arg ns3ari n3sark nsa4s ns4ath nsau4r nsau4se n2saut ns2av ns2ax n2s1än ns2äug n2s1äus n3sche. n4schef nsch5eul n4schl. nsch2o nscht4 n3schu nsch7werd ns2cr ns1eb nse4ein ns2eh nse2ha2 nseh5ere n4seinf ns2ele ns3elem n2sem. nsen4sp n2sepo n2s1erf n2s1erg n2serh n3seri ns1erk ns1erl n4serle n4s3erne n2serö ns1ers n4sersc ns3ertr n2s1erw n2serz n4sety n2s1eu nsfi2l ns3hor ns3iden n5sim n6simp n2sini nsinn2 nsi2te nsi2tr n3s2kal n3s2kel ns2kis n3skle n3s2ky n5smara n2s1o2d ns1of n2soff ns4om n4s3ont n2sop n4s3ort. nsp4 ns2pac ns2pek ns2pel n5s4pen n4speri n2sph ns2pi n5spie n2spo n2sprä n4s3prie n2spro n2sput ns3s2 nst1ak n4stale ns4ta2n1 nst3ane ns4tar n2stas n4s3tat. n6staten n4stats ns2tau n5s2te. n4steif nst5eife nst7einhe ns4tem. ns4ten. n4stent ns4ter. nst5erge ns4tes. n5steu n5s2tic n4stilg n2stob n4stole nst5opfe ns2tor n4strac n4strad n6strieb n4strik ns4trun ns2tum nst3u2t n3suf ns2um ns1un ns2ung n2s1urs n2sut n3sy ns2zin 2n1t n3t2a3c ntak4ta ntal1a nta4lin n4t1all nta2lo nt2alp n3ta3m nt2anb nta3ne nt1ang n4tansp nt1ant n4tanza n3t2arb nt1ark n3t2arm nt1art ntar6tik nt3artu n2t1ass n2tath n3tatl n2tauf nt1äm n2t1äu nte3au nte1e nte3g6 n2t1eh n3tehe n2teig nt1ein n2t1eis nt1emo nt4en nte4na nten6te. ntera4 nte6r5eis nt4erh nt4erk nt4erm nt4ern ntern4e nt4ers nt4ert ntes2 nte3sa n2t1ess n6testri n2te2ta nteu3 nteu6eri nte3v nt1hel nt1hie n2thot n3thr nt4hu n2t5hum nt4hy nt2i ntim3p n2t3ind nt3inf nt3inh ntini1 n3t4lem ntmen2 ntmo4 ntni2 ntnis1 nto3re n2torg n4t3o4rie n2t1öl nt4ral ntras3s nt1rau nt4raum nt3rea nt3rec n3t4ree nt3reif n3trep nt4repr nt3rich n4t3rieg n2troh n3trop n2t3rü n4t1s nts2ah nts2p nts3par nt5spe nts2ti nt2sur ntt2 nttü3 ntu4re. nt3z 1nu 3nu1a nu3a2r3 nubi1 2nuc nude2 3nue nu2es nu2fe 2n1uh 3nuhi 3nui n2uk4 nu3kl n3u2kr null3eb nul4lin n2um. 2n3umb n2ume 2numf 2numg 2numl 3n2umm 4numr 2n1ums 2n1umv 2n3umz nu4n 2nuna 2n1une 3n2ung 4n3ungl 4n1uni n3unk 2nunr 2nunt 2nunv 2nunw 3nuo 2nup 2nu2r nur2i nurs2 nur2z 3nu2s nu3sc nu3se nu4si nus1p nu4ss nuss3er4 nu4s1t nu2ß1 3nut nu2t1a n3uto nu2top nu2t3r 3nuu 3nux 3nuz 2nü4b nür1c 1nüt 2n1v2 n3ver n3vl nvoran4 2n3w nwei4st 1ny. 2n1ya n2ya. 1nyh n1yo 1nyr 1nys 1nyw 4n1z n2zac n2z1a2g n2z3a2k n2zan nz3a4ne n3zani n2zar nza4s n2zat n2z1au n2zän n2zär nze4la nzel3l nzel6lig n6zenerg n3zeni n4zense n4zentl n4zents nz3erem n2z1erh nz1erl nzer4lö n5z4err nz5erste nzer6tra n3z4es nze3sk nze2t nz1eta nze3u2t n2z1id nzi2ga n2zinh n2z1ini nz1int nz1inv nz3le nzlei3 n2z1op n2zöl nzt4r nzug2s n2z1wa n2z1wä n2zwet n2zwir n2zwö n2z1wu ño1 ñor2 2o3a2 o4a3bi o4ac oa3che oa3chi o4ad oa3de oa3in o4a3ke oak5l o4a3la o4a3mi oa4n oan4a o4a3q o2a4r o2a3s 3oase oa4si oa4sp o5ass o4at oa3te o5au 2o1ä2 o1b 2ob. o3b2al obal3l ob2am ob2ar ob1auf 2o3b2ä 2obb ob2e 2obe. 2obea 2o3bec 2obef o2b3ein 2oben obe4na oben3d4 1o2ber 2o3ber. ober5eis ober3in oberin6g obe4ris 2obev 2obez 2o3b2i 3obj ob1la ob3lei 1ob3li 2oblo 2ob2lö ob2lu 2obo ob1or 2obö ob3rei 2obrü o4bs2 ob3sh ob3sk 2o3bu o4bunt obus3s 2o3bü o4büb 2oby 2oc o3ca oc1c 3occl o1ce och1a ocha2b ocha2r o1che oche4b o2ch1ec och1eh och1ei oche2l ocher4k ochi4d och3l och3m och1o ochö2f och3r ocht4 o1chu ochu2f och3u2t och1w o3ci oc4k ock5er6sc ock3sz ock3ta o1cl o3co o1ç o1d 2od2a od3ak od2dr o3de2c o3d2e3i odein3 ode4l3ag ode2n1 ode2s1e ode3sp od2et o3dex od2i 2o3dia 2odi3c 2odif 2o3dir 2odn o2don o2d1op odo4s od2ö 2odr o2dre odt4 2odu o3dy ody2m 2o1e2 oe4b oe3di oe4m oen1e oe3ri o2e3s oe4sc o2e3t2 o3et. o3ets 2ofa of1a2d of1a2g of2an of1au 2ofä o2f1e2b o2f1ec 2ofee o2f1ei 2ofem o2fent 2o3fer o4ferb 2o3f2es o2f1e2t 2ofeu of3eun of2fa4 of4fal of4fam off3erz of2f1in of2fir of2fix 1offiz of2f3l of2fo of2f3r offs2 off3sh off3si off3sp of2fu of2fü 2ofi ofi3e2i ofi3k4l 2o1fl of3le of3li of4lö 2ofo 2ofö 2o1fr of3rä of4rü ofs1 of2sa of4sam ofs2ch of2se of2si of2sp of4staf of2sto ofs2tr ofstra8ssen of2su 2oft oft2a of2tei of3th oft4r 2ofu of3ur 2o1g o2g1ab o2g1ac oga3d og1ang o2g1e2i ogel3dr oge2li ogener4 ogenmas6 ogerätein8 o2g1eth og2gl o3gh ogi2er ogin1 o2g1ini og3ins og1l og3le og2lo o3g4n ogoi3 og1o2ri og2s og3si og3s2p ogs1t 2o1ha oh1alk o1hä o1he o2h1eis o2h1er2t oh1er2z 2o1hi 2ohl ohl1a oh2la2d oh2lä oh3lec ohl1ei oh3lep ohler2 oh4lerg oh4l3erh oh4lerw oh3lo2 ohl1or ohls2 oh2lu ohm2a 1ohmi oh3mu ohn1a oh4nac oh3nee oh2ni 1ohnm oh2n1o ohn3sk 2o1ho oho2l1e ohol1o oh1o2p 2ohö oh3öl ohr3a oh2rel oh2rem ohren3s ohrer2 oh4rerg oh3ri oh4rin ohr1o oh2rol ohrt4r ohs2 oh3sa oh3t o1hu oh1w 2o1hy 2oi o1id. o3i2da o1ids o3ie o1i2m o1in o4ine oi2r o3isch. o4ische oi3se o1ism oiss2 oi4st o1i4tu 2o1j 2o1k ok2a oka3b2 o2k3ac oka3i oka2la okale2 oka6lere ok2e oki4o ok2la ok3lau ok1lä ok2li ok2o oko4pt ok2so ok2s1p ok3t2 o3ku 3okw 2ol o1la ol3abu olaf4 o2l1a2m ol1ant ol2ar o3l2a3s olast4 ol1a2v 4o1lä ol1ät ol2chr ol4d1am ol2dä ol2d1ed ol4d3eng old5ersa ol2deu ol2dim ol2d3o ol2dr 4o3le. o2l1ef ol1eie o2l1eis ol1emb oler2 ol1erk ol1er3t ol1ess ole3u2 ol1exz ol2fa ol2fem olf3ere ol2f3l olf1r ol2f3ra olft4 olgege3 olge4ne ol2gl ol2gr ol2i olie4n1 oli4er oli3k4 oli3tu 3oliv ol2kl olk3re ol2kro olks3 olk4sc olk4si oll1ac ol4la4d ol2l1ak ol4lang ol4lau ollä2 ol2läd ol3le. oll1eb ol4l1ec ol2lei oll3ein ol3lem oll3erh oller4k oll3erl oll3erw oll3ess ol2lic ol4li4st ol2lo2c ol2lo2g ol2lop ol2lö2 olls2 oll3sa oll3sp ol2lu ol3lus 4olo ol2of olo1p ol1ort olo3st ol2ov ol3s2k ol3te ol3t2h ol3ti o1lu olu2th ol2y 4o3lys ol2z1a ol3zan ol4z3ern ol2zim ol2zo ol2zw ol2zy 2om o2mab oma2bl o2m1a2ge om1alg om1all oma4n3er o2m1ang om2anr o4mante o2m1ap o2m1ar2s o2m1art omar4te o2m3a2sy omat2i o4matom o2m1au o3mä o2meb om1ebe o2m1ef o2m1ei o2mel o3meld omen5t6an o4mep omer2 om1erh o2meru om1erz omi2c3 omiet1 o3mig om1ind om1ing om1ins o2m1int om3ma om3mä om3m2e om3mu 3omn 4omo o2m3oa o2m1org om1o2ri om3pf oms2 om3sk om3t2 o2mum o4munt o3mus 2ona on3a2b on2ac ona3g o3nal on3ann onan6z5ei o2n1ap o2n3arb ona3th 4onatol onat2s o4n3at4t on2au 2onä on1äh 2onc on2dan onde8rers onderer7t ond1r on2dra on4drin ond3sk 2one on1ec o3nee o2nef o3neig on3ein on1ema one2n1 o4n3ends on2eng on1ep o3ner. on1erb o2n1erd oner4fa o2nerh on4erka on1ers o3nett on2eu on3f2 on3gl ong4le ong4r ong3s on2gue 4o3ni on2i3d onie3g oni2ga on4ik o4nikr o4nim o4nind o4ninh o4nins on3k4 3onke onli2 onli6n onlo2c onna2 onna3g on3n2an on3n2e 2ono1 o3nod o2nof ono2i o2n3oke o3nom on1ope on1orc on3ord ono3s ono3t2 onrad3 ons1a2 on2seb onsen1 onse2t on4sho onsi2d ons3ing ons3l ons1p onst2a ons3tie onst4r on3ta on2t1eb on2te2l ont5end on4t3erl on2th on4t3rat 2onuk o3nur 2onut on3v 1ony o3ny. on3z2 onze3in o1ñ oo1c ooch2 oofs2 oo2gl oo2k3l oo2kn oo2mo oo2ne o1op oop2s o1or oor3d oo4sk oo2su oo2t1a oot1ei oo2t1h oo2tr oot2s1t oot3t oo2tur 2o1ö2 2op. o1pa op3adr op1akt opa2le op1ang 2opax 2opä o1pec o1ped op1ef o1pei o1pek 2open o2pera op1erh o1pes 2opf. op2f3a op3fah op2fä o2pfe op2fem op2fin opf3la op1flü op2fo op3for 4oph2 o3phe o1pi opi5a2 opi3er. opi5ers. opie4r3u opin2 2opl op3lag o2p5le o3p2n 2opo opo2la op2pan op4pl 1oppo 2oppt 2o1pr 3o4psi op3sz 1opt4 2opte op3th o2pum 2opy 2o1q 2or. or1a 2ora. o1raa 2or3a2b o2rabb o2r3add or3adr o1r2ag o2rak 1orake o1ral oral5l o4r3alm or4alt or2am or3a2mi o1ran3d4 or4ane oran2f oran2m oran4ze or3ap 2orar o1r2as o2ratt 2orau4 orau2s oraus6wa or2av 2o1raw o1ray o3rä or1änd or1ät orb2l or1c 2orca or2ce 2ord. 2orda ord1am or2dar or2dau 2ordb ord3eng orde4s or2deu or4d3ing or2d1ir or2dit 1ordn or2do4 2ordr ord3t 2ordu 2ordw 2ore ore2a o2r1e2b o2r1eck ore2di o5ree o3ref or1eff ore2h or1ei o3rei. o3reie o3r2eif o3r2eis orems2 o3renn o3rep o2r1er o3r2ere o3r2ero ore4th o2r1eu 2orf or2fac or2far org4a org2e 2orget or3ghi 2orgia or2gl or3gla or3gle or2gn or3gne 2orgr 2orh 2o3ria 2o3r2id orid3i 4o3rie. o3rien. o6rienti o3rier o3ril or1ima ori4mi 2o3rin1 o4r1ind o4rins 2or4io o2riso 2orit 2ork ork4r ork3s 2orm or2mam or4mang or4mans orm3asp or2m1eb or4m3erf or4m3er4g or2mor orm3ord or2mum ormu4n or4muni or4munt ormvol4 ormwa5 or2n1ac or2nal or2nan or2nar or5ne. or3ni or4nin or3no 2o1ro o2r1ob or3oly oro3n2a or1ope or1opf o2ro2r o3rou or1ox 2o1rö 2orp 2orq 2orr orr4a or3r2e 2ors2 or3s4a or3sh or3si or3sk or3sz or2t1ak or2tan orta2r or2t1au or2tef orte4n or4ten5g ort3erb or4t3ere ort3erf ort3erg or4terk or4t3erl or2t3e2v or2the or2tin or4t3off or2t1o2r or2tö ort3rad or4trau or4t3räu ort3re or2t1um 2o3ru or2uf or1uh orum4s o4r3un oru2r o5rus3 o2rü or3z2e orzel5 or2zw o1s 2o3s2a os3ad osal2 o4s3ami 2osc o4s3ca osch3ar o3sche osch3le 2ose ose1e ose1in2 os2el ose2n o2s1er2k os2ex 2osh o3s2hi os4hu 2osi os2im o3sk os2kal o4ski 2os2kl 2os2ko o4skr o4sky 1osm os4mog 2os2o osol1 o2sö 2osp os1pec os3pero o3s2po 2oss os6s3ac oss3ala oss3and os4sä o6ssel o3ssem. oss5enke o3ssent oss3enz oss1ep oss3er4b osser4e osser4f o4ssi os2s1o2 os2sp oss1pa os2s1t os2su os2t ost1a o3stal. ost4art ost3aut oste2n o4s3tep o4sterd oster3e ost5erwe oster8wei ost3eur ost1h o2stid o2stin os3ton osto4s ost3ran o2st3rä ost3re ost3rot os4tru ost3uf 2osu4 os1um 2o3sy o3s4ze 2oß o2ß1el o2ß1ent o2ß1en2z oßer2 o2ß1erb o2ß1ere o2ß1erf oß1is oß1u 2o1t o2t3abi ot1ah o2t1ak o3tal o3tam ot1ant o3tark o2tarz ota4s ot1ast o2t1au o3tau. ot2ax ot1ä o2teb ote1i o4t1eib o4t1eic otei4n o4t1eis ot2el ote4l1a o3tem o4t1emi ot2em3p2 ote4na o4tentb ot1erb o4t1er2l o4t1erw ot2es ot2har o2them o2t1hi o2thr 4oti o2til o2t1i2m ot2in ot3inh o4tl otli4 ot2o oto3b4 ot3off oto2ph o2t1ö otra3c o3t4ran otra4s3 ot3rat ot4rau ot3re ot3ric ot4rig ot3rin ot3rus ot2s3at ots1o ots1p ots2pe ot3s4tra ott3akt ott3an ot2t1a2s ot2tau ot2teb ot4terh ot4ter4k ot2t1h ot2tim ott2o ot2t3r ot3t4ra ot3t4ru ot1url ouff6 ou1f4l oug2 ou4ge ou3gl o1uh ou1is. 2oul ou2le. ou2les ou4li 2o1um 2o2u2n oung5 oun4ge. oungs2 o4up 4our oure2 ou2ret ouri4e4 ourme4 our4ne. ou3sa ous2i ou2s2t o4ut ou3ti 3outp out3s2 outu4 2o1ü o1v ov2a 2ovel o3ven oviso3 2ovo 2o1w o2w3al o3wec o2wh o5wi o2wu 2ox. o1x2a 2oxe o2x1el 2oxk ox3l o1xo o2x1u 1o2xy o1yo o1z2 o3za 1ozea 2o3zen ozen4ta ozes4sc 2o3zi ozir3 ozon1a 2ozy oz3z ór3 órd2 ö1b ö3b4a öb2l ö2b3le ö2b3r ö1ch öch3l ö2chr öchs2t öch6st5ei öchst3r ö1d öde1r ödi3 1ödu ö1e 1öf öf2fa öf2fl öf3l öge3le ögen4s1 ög3l ög3r ög2s ö1he öhe4n1 öhl2e4 öhre4 öh3ri öh2s ö1hu ö3ig. ö3isch. ö1ke 1ö2k2o3 ök3r ök2s ö2l 3öl. öl1a2 öl1ei öl1em öl2f1ei ölf2er öl1in ölk4e öl2k3l öl2la2 öll1an 3ölm öl2nar öl1o2 öls2 öl3sa öl3sz öl3tu 1ölu ölz2w ö1m öm2s ön2e ö3ni önizi1 önn2e öo1 öo2ta öoti1 2öp ö1pe öpf3l ör3a2 örb2e ör2b3l ör1c ör2dr ör3dra ö2r1ec ö2r1ei ö2r1e2l ö2r1e2m öre2n ö2r1ene ö2rent ö3r2erb ö2r1er2e ö2rer2f ö2rer2g ör2erh ö2rer2l ör2err ör2erw ö3r2erz ör1ess ör2f3l ör2gl ö2rim ör2kl örn2e örner4v ör1o örpe2 örs2e ör3sk ört2e öru4 ö2r1une ö1s ö2sa 2ösc ö2sch3a ösche2 ö4sch3ei öscher4 ö6sch5erf ö6sch5eri ö2schi ö2sch1l ö2sch3m ö2schn ö2schw ös1ei ö2sein ös4en ös4es 2ösl ös2o ö2sp ö3s2s ös4s1c ös3set ös4st ös4t ö2st1a2 ös4u ö1ß ößen3 öß2ti ö1t ö2t3a öte4n1 ö2t3r öt2sc öt2tr ö1v2 ö1w ö1z öze3 özes4 1pa. 1paa p1ab p2abe pab2l pab4rü 2pabw 1pac 1p2ad pa3el pa1fr 1pag4 pa3gh pa1ho 1pak pa3ke pa1kl pak2to 3pala pala3t 3palä 3pal2e pa3l2i 1palm pal2ma pal2mä pal2m1o 2palt pal2t1a pal4tei pal2tr pa2m3a pa2nar pa4n3at pan3d pand2a pan4ds pa2neu panf4 pang4 pa4nisl pank4 2panl 2pann panne2 pan4n3eb 4pannu 1pa2no pan3sl pan3t2h 1panto 2pantr panz2 pan3ze 1pap papi2 papieren8 papie8r7end pap2pr pap2s papst1 pa1q 1para pa4r3aff par3akt pa4rant pa3rap pa2rä 2parb 1p2arc par3d parer8geb 1parf 2parfö pargel6d 1park. park3am par4kau par4kr 1parks par3m2 par3ne 1pa2ro 2parp 2parr 4parta 3partei 1parti 1partn 3party par3z pa1sp pa2spe passer4 pas6serg pas2s1p pas2t pa2ßu pat1a pat4c pa3t4e2 2patel 1pat2h 1pati 1pat4r 1pau 2p1auf pa3uni 2pausz 1pav 1pä 3päc päck3er 3päd päde2 pä2d1er 3pär 3pä4s3 pä4t1e2h pä4tent pä4tep pä4t3erb pät1h pä2to pä2tr pät5s 2p1b pbe1 2p3c 2p1d2 pda2 1pe. pe2a2 pea4r pea4s p1e2b pech1 1peda 1peel pe2en 2pef 4p1eff 1peg pege2l pei1 2peic 1peil p2eim 2peis 1peit pekt2i 1p4el 3pel. pe4l3ab pe4lai pe2l1au pe2l3ax pe2l1ä pelb2 pel3d4 3pele pe4l1e2h pe2l1er pe2let pe2leu peli2d peli4n pe4l3ink pel3inn pel4ins pel3k pel3l2a pel3lä pel3l4e pell2i pe2lob 3pels4 pel3sp pel3ta pel4zin 1pem 1pen pena2 pe4nas pe2nä pen3d2a pe4nen1 pe4ni2t pe2n1o2 pens2 3pen3si pen3so3 pen3sz pent2a 2pentw penty2 pe2nu2 pen3z 1pep pe3pi pe1ra pe2rak per2am pe2r1ä per1e2b perer4f pe3r2id 3pe3r4io 1perle 1perlh perra2 per4r3an per4rä2 per4ric per6rieg 1pers 2perse 2persi 3perso 3persp peru2 pe3run 1perü perwa4r pe3s2a pese2n 1pes5s2 pes2t pest1o pe4stop 3pet pet4r 1pé 4pf. p2f1ab p2fad p2faf pf1ai p2f1ak p4f1am pf1ans p2fa2r pf3are p2f1au 1pfä p2fär p2f1äu 4pfe. p2fef p2fei pf1eim pf1ein pf1e2m p3fen. p4fener p3fens p3fent p4f1ep pfer5a p4ferde pfer6pro pf4es p2f1et pff4 pffa3 p2f1i2d pf1inn p2f1ins pf1lam pf4lan pf4leg pf3lei pf3lo p2fob p2fom p2fo2r pf1ori pf3r pf1ra pf4rü pfs2 pf3sa pf3se pf3sl pf3sz pf3t2 pft4r p2fum 2p3g2 pgra2 1ph 4ph. phal4te p1hand 3phas p1hau phä1 3phän 4phb 2phd 2p1hei phen3d2 phe4n1e phen3s 2ph1ers 4phf 4phg p2hid phik1a phi4kan 2phk ph2l 4phm 2phn p2ho. p2hob pho2s 2phö ph2r 4phs ph3t2 2phthe phu4s phu3t 2p1hü 3p2hy 4phz p2i2a1 piab4 pia3k pi4ali pia3n piap2 pia3s pi1ce pi2e1i pi2el piel3a 1pier pie2ra pie4reb pie4rei pies4 1pig pi3gl 1pil pi3le 3pilo pil4zer pil2zw p2im 3pin. pi2nad 3ping pingen4 ping3s 3pins. 3pinse pin3s2p pi2o pi3oide pi3onu pi3os 1pip pi2pe 3pirate pi3ri 3pirin 1pis 2piso pis2t pi3sto pit2a pi3t2h pit2s pit3z2e pi2z1in 2p1j 2p1k2 pku2 1p2l2 2pl. 3pla 4p3lad p1lah pla3na p4lau pla2y1 2p3le. ple1c ple2e p4leg ple3n2 2p3ler p4leu 2plig 3p4lik p4liz plo3n 2p3lu 2p3m2 2p1n2 1p2o pob2 2po1c 3pock 3pod 3poe po2el 2poh po2i po3id. po3ids 3poin 3pol po2lan po2l1au pold2e po3li pol3lo po3lo3p pol3z2 pom2ph 2pond pont2 po1ob po2p1ak po2p1ar po2p3l po3p2t po1rau porf4 3portal por2t1h 3portio 3porto. 3portos 3portr por4tre por6tric 3posi pos3s2 pos4t po2sta po2stä post3ei po6stein po4stem post3ra po2ta pot1ar 3potä 3pote pot2h po2t3in pott1r po2t1u po3un po2w powe2 po3x pö2bl pö2c 4p1p p2pab pp1ang pp1ans ppa2p p2pat pp1au ppe3e p2p1ei ppe2l1a ppeli5ne pp2e2n1 p2p1erz p2pf4 pp1fr p2p1h pp3he pp3l p4p1lac p4plan p2p1lä p2ple pp3oh p2p1ö2 pp3p4 p2p3ra p2p5rä pp3ren p2pri pp3rol pp3rot p2p3ru p4ps2 pp3sa pp3sy ppt4 p3puc p2pul p2p1um p2punk p3pur ppyl2 p2r4 1prak pra4s3 pra5sp 1prax p4rä 1präd 1präf 1präg 1präl 3präm 1präp 3präs 1präv 2pre. 2prec 3pred 2pree1 pre2ei 2preg 1prei 3preis prei4s3c prei6sei prei4ss prei4s3t 2preiz 1prem pren4ga 2p3rer 1pres pre3sa press4e 1preß pri4e 2prig pri2l1 2pring prings4 1prinz pri2t1 priter4 prit3t4 1priv 1pro1 3prob pro3be 2proc 7prod 3prog 3proj 2pross 2proß prot2e 3proto 2prott pro3x 2prö 1prüf 1prüg 2prüh 2prün 2p1s 4ps. ps3k ps1od p2sö ps4pi pss2 pst1au p2stu 3p2sy 4psys ps2ze 2p1t pt1a pt2ab pta2g p2t3a4t p3te. p2t1e2b pt3ec pt1ef pt1ei pt1emi 4p3ten p4t1en2g p4t1ent pt1ep pt3erei pt1erw pt1erz p3tes p3tet p4teta p4t1e2ti p2t1h pt1id pti2de pt1in1 pto2mo pto4na pto2p pto2w ptpo4 pt3r p2tro pt1s2 pt3si pts4t pt1uh pt1um p3tung pt1urs p2tü4 3p2ty pt3z2 1pu pu1a pub4 2puc pu2dr 2p1uh 2puk pu2kl pu2k1o pu2lin pul2sp pul2s1t 3pulv 2pulw pum2pl 4pund pun2e pun2s 2punt 3pup 2pur pu2ra pu2rei pus2h pu3she pu5t2e 3put2s 3putz puzi3 1püf pül3l 2p1v 2p1w pwa4r 3p4y1 py3s py3t 2p1z2 qu4 quel4la que3rel quer5n que4te. 1queu 1ra. r1aa ra2ab 2raac 2raal ra3ar r2a1as r1ab ra2b1ar r2abä 1rabbi rab2b3l 2rabd ra2bei rab2er rab3erd 2rabf 2rabg 2rabh 1rabi 2rabk r2able ra2bli ra4b5lo 2ra2br 2rabs2 2rabt 2r3abw 1raby 2rabz ra2ce 2r1acet ra4cheb ra2cho 2rachs rach6t5rä ra2chu r2ack 1r2ad r4ad. rada2 ra2dac ra4d1am ra2dan 2radap 3radar ra2de4i rade5s 3radf 3radh 3radio 4radit 3rado 3radp ra4d1r rad5ri rad3t4 r2af raf3ahn raf3ar rafe2 ra2f1er raf3r rag2a ragein4 rages4 2ragg ra3g4le 4ragm ra2gn r2ago rahle4n 5r2ahm r1ahn 2ra1ho 4raht r2ai 2raic rail2l 2r3air raka3 1ra3ke 2rakk 3ra1k4l ra2kre ra2kro 2rakti 1rakü 2rakz r2al r4al. ra2la2 ra4l3ab ral1ak rala4s ra2lä ral3b4 3r4ald r4ale ra4l3end ra4lent ra4l5ern ra3lex r4ali ra2lid rali3er ra4lin4d ra4l3ing ralin6sp ralin4t 2r3alk. 2r3alm. 2ralp. 4ralpe r4als ral3su r3alt 3r4al3t2h ra2l3u 3raly ra2mei ra2mer r2ami r2amm ram4man ram6mens ram6m5ers ram4mit ram4mu 2ramn 3ramsc 2r1amt ramt4s 2ramu 2rana ran1ad ran3ade r1a2nal ra2nan ra2nar ra2nau 2ranb r2anbe r4anda r4ande ran4dep ran4d3er 3r2andi rand3s 1raner 2ranf 2ranga ran6g5e6be 3rangi r2angl rangs2 rang3sp rani3e r3a4nil ran3ka ran2kr ran2kü 4ranl 2r1anm r2anmi r2anmu 2ranna ran5ne 2r1anp 2ranr 2rans r2ans. ran4spa 4r5antei r1anth r2anto 2rantr 1ranu 2ranw r2anz. r2ap 2rapa ra2par 2rapf 2rapo ra2pok rap2pr 2r3a2pri 2r1aq r1ar r2ar1a 2rarb r2are 3r4arei raren1 rar3et rar1e2v r2arf4 ra3rie rar3in ra3ris r3a4rist 4r3arit r2ark raro2 ra2rom 2rart 2rarz rar3zw ra3s2 r4as. ra4schl ra4sk r2asm ras3si ras3sp r2ast ra4st3ei r3asth ra4sto ras3tri 2rasyl 2raß 1rat ra2t1an ra2t1ei r3a2tel ra4tid 2ratla 2ratm rat2o 2ratom rat4r r3att 2ratta 2rattr 4ratz rat3ze 4rau. 3raub. 4raue rau3e4n 2rauf rau3fä 2rau3g2 3raum rau4m3ag rau5mes rau2mi 3raup 4raur 2rausb 3raus2c 2rausd rau3se 2rausf 2rausg raus8gewä 2raush 2rausl rau2sp 2rauss raus8sche raus3tr 2rausv 2rausw rau3ße 2raut raut1r rau4tra rau4tro raut5s 1raü r2ax raxi4s r3axt r2ay ray1o r2az räch4s 3r2äd 4räf rä1fr 4räg 2räh 4räm 3rän. 3räni 3räns 2räp 2räq 2r1är r2är. rä3ra rä1ro rä2sc räse2 rä5sse rä2st 3rätse 4rätz rä2u 4räue räu2s räus2c räu7schen. 2räuss 2räuß 4räut 2räx 4r1b r2b3a2b1 r3bac rba4del rb2al r3bam r2bang r2bant rb1art r2barz rb1auf rbb2 rb1ech rbe3erf rbei3d2 rbe3inf rb3einh rbe3int r4belä rbel2o rbe3r2e rber6gin rb1erl rbe3rum rbe5sl r2bim r2binf r3bit rbit2a rbi3tu rb2la rb4la2d r2blan r8blasser r4b3last r3blat r3blau r2b3le. r3blen rb3ler r2bleu rb2lin rb2lö rb3lös rbmas3 rb2ob r2bonk rb3ras rb3rea r8b7rechts rb4sam rb2sei rb2ser rb2s1o rb4stä rbs3tri rb2su rb4sz rb2u rbü4b 2rc r1ce r1che. r1chen r1ch2i rch3l r3chlo rch3m rch3r rch4ro rchs4 rch3sp rch3t2a rchter6r rch1w r1ci r1cl r1ç 2r1d rd2ac r2daf r2d1ak r2d1a2l rd2amm rdani1 r2dann rd1ant rd1ara rd1ark r2darz rdär2 r3de. r3dee r2dei rd2ei. r2d1elb r2de2le r2delf rdels2 rdem6 rden3d2 r4dengl r4dents rde3ob rde3ono rde3r4er rderin6s r4d3ernt r3des rde3sp r2d1e2x r2d1inn rd1iri rd1ita rdo2 r2dof r3don rd1os rd3oss r2d1oz r2dö rd3rat r2drau rd4ri rd5ris rd4rö r3d4rü rd2sän rd3s2k rd3s2z rdt4 rd3ta rd3th rdt2s r2d1uk rdwa6r 1re 3re. rea2d rea6l5erw 4re2am re3at. re3ats reatu3 2reä re2b1a re2b1l reb1r reb3ra reb3so rech3ar 4rechs 2reck. 2recki 3red. 4redd 2redi re2dik 3redn 3redu re1ebe re1el re1em ree4mi re1er 3refe 4reff r2eff. 3refl 3refo 3reg rege4l3ä regene7ra 4r1egg re2hac re2h1ar re4hen4e re4h3ent re2hi reh1l4 re2h1o re3hol 3rehö reh4th re2hü r2ei. r2eib rei4bel rei4ble r2eic 2reid r2eie 4reier. rei4fei 4reifel 2reig 3reigä 3reigeh r4eigel 6reigens 3reigi 4reign 3reigru rei3l2a rei3l2i 2r1eilt 3reim reim2p r1ein 2rein2a rei3nal 2reinb rein4du rei3n4ec reinen5 2reinf rein4fe re4info 2reing 2reinh 4reinn 4r3einr 2reins 4reinsa rein6sel rein8s7tre rein4sz 2reint rein6teg re1in2v 2reinw 2reinz 4reisar 4reisb 2reisf 2reish 2reisr reister6 4reisu 2reisw reit3s2 3rek 4re2ke 4rekk 5rekn 2rekz r2el. r2ela re3lat 2relb rel2e relea4 re5lei re2lek 4relem r2elev 2relf reli1 2relit 2relix r2ell rel4lar rel4lei re3lo r2els 2relt relu2 3r2em. 2r1emb rem2da re2m1ei re5men 2remi re3mig 2rempf rems1c rem4str 2rem2u r2en. r2ena 2rena. re4nac re3nad re3nal re4n3an re2nä r1endg 3rendi ren3dr 4renerg 4rengag ren4gan 2rengp 3renh re2ni 3renm ren4nar ren6nene ren6sein rens2p 2rentd 6rentera 2rentf 3rentfo 2rentg r3enthä 2r1entl 2r1ents 2r3entw 2rentz r2enz ren6z5er6f renzer6l ren6z5er6s renzer6w ren4z3in ren2zw re2ob re3or 3repe 4re2pen 2repi re2pis 2repoc 2r1e2pos 4repp 3repu 3r2er. rera2 2r1erb 3r4erber rer2bi 2r1erd rere2 4r3ereig r1erek re2r1ep r2erer r1erf r3erfa 4rerfah 2rerfi 2rerfo r2erfr rer2fü r1erg 4r3ergeb 5rergebü r4ergen 3r4erges 2rer2go rer2gr r4ergru r1erh rer2hö re3ri re4rid r1erk rer4kan rer2ke 4r3erken 3r2erki 3r2erko r1erl 2r3er2la 5r4erlag r3erleb r2erli 2rerlö 2r1erm rer2n 2r1ernä r1erne 2r1erni 4r3erns 4r1ernt re1ro re2rob re4rosi 2r1er2ö r1erre rer4reg rer4rei r1erri 5r2ers. 2r1ersa r6erschi r2erse 2rersp rer4sta r6erstad 2rer6su r1er3t4 r2erte 2rertr r1erw rer4wac rer4wec r4erwes 2r1erz rer2zä 3r2erzy 3r2es. re2sa re4sam resche4 re4schw 3rese re4se2h res1of 3resol 3reson res2po 2ress 4resse res3sei res6s5erw res4sto 4ressu resten4 re6stent re4stra 2restu 3resu 2re2ß1 re2t1ak 2re2tap re2tau ret2e 2r1e2th re2tra re4trol re2u reu4eri reu3g2 2reul re3uni 2reur 4reuu 2reü 4r3eva 2r1evid rewa4r re2wi 2rewo 2r1e2x1 3rez 2rezi 1ré 4r1f rf1ack r3fahre r5fahrt rfall4s rfäs3 rfe2i r2fent r3f2es rff2 rffa3 rf3fe rfi4le. r4fland r3f4lä rf3lic rf4lö r3flü r2fo2b rfolg4s r5foli r4frauc rf4ru rf4rü rf2sa rf4sam rf2s1ä rf2su rf2ta rft4r rf2u rfzu3 2r1g r2g1a2d r2g1ah r2g1ak rga4ner r2g1ap r2garb rg3art. r2g1ask rgas2t rga5stes rgd2 rge4an rge2bl r2g1e2c r3gel r4gelef rge4l3er rgen4z3w r4ge4tap r2geto rgi4sel rg2lad r2glan r3glanz rgleich8s7 r2gleu r2glig r2g3lit rg2log rg2lu r2g3na r2gne r2g3ni r2g3no r2g3oa r2gob r3gog rg3op r2g1or rgö2 r2g1öd r2g3ral rg4rau r2greg r2g3res r2gret rg3rin rgro5sse r3grun rg3rüs rg3se rgs2ei rg4sel rg3s2i rg1sp rgs2pe rgs2po rgs4ti rgs2tu rg1su r1h4 2rh. r2hag 2rhah 2rhak r4haltb r3han 2rhau 2r3hä 3r2he. r3hea 2rheb 2rhef 2rhi 2rhol r3hop 2rhot 2rhöl 2rhs 2rhü 1ri ri1an ri2ano ri2ast rib2bl ri1ce ri1cha ri3chl richt8spo 3richtu ri2con ri2dau 2ride ri2d3e2l ri4dent r2i3di 2ridol rid3r 2ridy r2ie rieb6ste 4riefm rie2f3r rieg4s3 ri2e1i riein1 ri1el rie3l2a ri3els ri4enä riene2 ri3eni rie2nu ri1er. rie3r2e riere4n ri3ers. ri1eu ri2f1a ri2fä ri2fei ri2fer rif6f5end rif4fer ri2f1o ri2fr rif4ter 3rig 4riga 4r3i2gel ri4gene 4rigg 5rigj rig1l ri4glä ri3g2o3 4rigr 4rij ri2kar ri2kä ri2kin ri2kn ri4kone ri2kor 2rima ri2mag ri2me. 2rimm 4rimp rim2s ri3na r1inbe rin2c 2r1indu ri3n2e rine1i 2r1inf rin2fo 3r2infr r2ing rin2ga ring3le rin2gr ring3sp 2r1inh 2rinit 4rinj 4rink rin2kl rin2ko rin2kr 2rinl 6r5innenm 4r3inner 2r1innr r1innu 4r1in2q 2r1ins rin2si rin2so r4inspi 3r2insy 2rint 4rinte rin6tent rin4t5re 2r1inv rin2va 2rinz ri2ob r3ion ri3o2st ri2pl ri3po 4r1ir r2is ris2a ri3s4an ri4sch3o ri4schw 3risik ri3s2ko r3iso ri4s3p r3isr 3riss ris2t rist5ers ristes4 ri2st3r 3ri2ß1 r2it r3i2tal rit3ant rit2i 2ri3t4r rit1s rit4t3au rit4tei 3ritter rit6ter6f rit2to rit2t3r rit2u r1i2tum rix1 ri3xi 1rí 2r1j 4r1k rka2b3l rk1ah r2k1ak rk1all rk2am rk1are rk1asp rkauf4s r2k1äh r3kel r4kelem rke2n1 rken4er r2k1er2l rk5ersta r2k1er4w r3k2es r3ket rk1im rk4las rk4lau rk4lim r2klis rk2lo rk2lu rk4ne r2kob r3kol r3kon rk2op rk1o2ri r2kou rk2ö rk3räu r3kri rk3rin r2k3rom r2krou rk2sal rk2sei rk2sel rk2ser rk2so rk2sp rk3spi rkstati6 rk4stec rk4stoc rk2ta rk2tel rk4t3eng rk4t3erf rk4terg rk4t3erl rkt3ers rk6tersc rk4t3erw rk4t3erz rk4teta rkt2i rk2t3in rk2t1o2 rkto4b rk2t3r rk2tum rk1ums rku2n r3kup r3kus rku2sa rkus3s rku2s1t r2küb 2r1l rl2ab r3lag r5land rlan4d3i r2l1ar r2l1a2sc rlas2t r2l3aug rle2a r3lec r5lei. r3lep rl2et r3lex rlg4 r3l2i rli4ne. r3l2o rlou1 rl2ö rlös5s rls2a rl2spr rl2sto rl3t r3l2u rlus2t rlu6ster rlu4str r3ly rlz2 4r1m r2mab r2m1ad rma2la rm1ald rm1ami r2m1ank rm1anz r4m3aph r2marc r2marz r3mas rma4spe rmas3se rma5ssen rmas8sens rmat2o rm2är rm3d2 r4m3einh rme4na rm2ene r2ment r2meo rmer4fo r2m1erh r2m1erl r2m1erp r2m1erw rm2es rme3sa rme3st rmeta2 r2mide rmi6nanz rminen4 rmi6neng rm3m r4mn r2m1ob rm1o2ri rm3p2 rms2 rm3sa rm3sk rm3sta rm3t rmt2a rmu2n r4muna r2muni 2rn rna2b r3nad rn4ade r3nage r2n1all rna4n rn4and rn3ani r2nanz rna2r rn3are r4n3ari r4n1a4st r4n3att r2nau rn3aug rn3de rn3d4r r4nef rn2eid r4neif r4neis rn1ema rne2n r2n1ene rn2eng r4n1e2p r4n1erg rn4erhi rner4ke rner4ku r4n1erl r4n1ert r4n1erw r4nerz r5nes rn2e2t rnet1e rne4tem rne4ter rne4to rn2eu rne3uf r4nex rn3f rn3g2 rngene4 r2nid r2n1in r4ninf r3nit rnk2 rnn2 r3nod rn2oh r2n1op r2n1or rn1ö rnö2d rn3sa rn3s2ä rnse4ha rn3s4p rns2u rn3s2z rn3t2a rn3t2e rn1ur r1nü r1ny rnz2 r2oba 2robj 1robo ro2bo2r 2robr ro2bre 2robs ro1ch roch2a 3rock. r2o3de rod4r roe4 2roff ro3fl 4rog. ro3g2a 3rogg ro2h1in roh1l2 4rohn ro2hö 3rohr 1roi ro3in rok2l ro3le ro2liv rol4lan rolle4 roll4en rol6lerg rol6lerw rolli4n rol6lini 2roly 4rom. ro2mad ro2mal 3roman. 2romb romen3e ro2m1er 4romm 2romn 4romt r2on ro3n4ab ro2nan 3rond ro4nerb 4ronk 3ronn rons2 ron4tan ron6tend ron2t3r ron2t1u ro1ny ro1o2f rop2a 2rope 2ro2pf 1ropl 2ropt r1or ro2r3al ro2rat 2rorc ro2rel ro2ro ror3th rort4s ror2ü ro3sh ro3s2i ros2p ross1c ros4st ro3sta ros3tel ro2st1r ro2sum 4r3osz roßen2 ro4ßenk ro2ßi ro2ßu ro2tan rot3au ro2tä ro3te ro2te3i ro2t1ho ro2tru rot1s rots2o 3roul ro3unt 3rout 2ro1x 4roy rö2b3l rö2du 2rö2f 3röh 2r1ök 1röl 2röl. rö3le r1ölp 3römi r1ör r2ös. rös1c r2ö3se 1rösl 3rötu 2r1p2 r3pa r3pe rperer5 rper3in rpf4 r2pli rp4lu r3po rpo4str rp3se rps1t r4p3t r3pu 2r1q 4r1r rr2ab rra4s3s rr4at rrat2s rr1auf rr1äm rrb2 rr1c r5rega rr2ei rre2le rre2pa rrer2 r2rerh r2rerl r3res rres2t rre2ve r4rezi r3r2hen rr2hos rr4i rri3k2 rrm2 rrn3au rr2o rr3obs rro3m rro2re rr2th r3r2u r3r2ü rrz2 6r1s r3sabo r2sa2d rs2al r4samp r4s1amt rs2an rs3ana r4sanf r2s3ang rs3anm r4sanp rs3ar rs4ark r4sarm r4sch3e4b r6scherl r5schu r5schwu r5schwü r2s1ebe rse2e r2s1ef r2sein rse2n rs2end rse4ne r2sepi rs1ere r2serh rs1ers r2serz rse2t rs1eta rs2ext r3s2hav r3shir r3sho rs2hor r4shu rs2il rs2ka rs2kel rs2ki r4skir rs2kl r4skor r3s4kri r4sky rs4mog r3s4no rs4om r2sop r4s3ort. rso4s rs1ost rs2p4 r3span rspa3s r2s3ph r3spi r3spl rs4por r2spun r2sput rs3s2 rst3abl r5stad rst3ala r4stale r4stans r4stant r2stas r3stat rs2tau rs2tea rs2tee rst5eing r6st5eint r4st3emi rster2 rst4erb r6sterbt r4st3erl r4sterö r4st3erw rs2t1h rst3ing r2stip r2stit rs2tob r2s1tot r6strang r4stris rs2tu rsuch4s r3suf rs2ums rsü3s r3sy rs2zin r1ß 4r1t rt1abs r2t1a2d r2t3ae rt1akr r4t3albe rta3l2e r2t1all rtal4s3e rt1am r3t2ame rt1an r2tanw r2t1ar rt3att r4tauft rt3äh rt1änd rt1ärm r3te. rte1e2 rt1ein rt4eind r4t3einh rte2is r2telf rte3li rtel6lei rte2n1 r3ten. rte4na rten3s2 r4t3ents rten3z rteo2 rt3erei r6tereig r4ter4fa r4ter4fo rt1erh rt1erk r4t3er4la rter6mit r4t3ernä r2ter2ö rter4re rt1er4s rt4er5sp rt1erz r3tes2 rte3sk rt1he r2thel r2t1hi rt2hum r2t1id rtik2 r2t1ima rt3inf rt2is rt2it rt3m r2t1ob r3top. rto1pf rt1orc r2torg r3tork rt3rams rt3rand rtra4s3 rt3rati rt3rec rt3ris rt3rol rt3roma r3trop r2trou rt3sc rt4s1eh rts2el rt3sex rts3ing rts1o rts1pa rt1spe rt4s3tan rts4tie rt3t4 rt1umb rt2u3na r4tunt r2t1urt rtu2t r2t3ute rty1 rt3z2 1ru ru1a ru4ale ru3a2r3 rube4 rub2i ru3ches rucht3s4 rude2a ru2dr ru2et 3ruf ru2f1a ruff4 ruf2s1 ruf4ter ru2g3r 3ruhm 2r1uhr 3ruin ru3ins ru1is 2rum ruma2 4r3umd 4r3umf 4r3umg ru2mi 4r3uml 4r3umsa 4r3umw 4rumz 2r1una 2rund run4d1a runden5e run4d3er run2e runei2 4r1unf run2ga 2rungl 4r1u2ni r3unio ru4nis. run2kr 4r1unl 2r1unm 4runn 4runr r1unse 4r3unt 4runw 2rupd ru3pr 4r1ur ru2ra ru2r1e 5ruro r4us. ru2si rus2p rus3sen rus2s1p rus6st rus2t ru2tab rute4 ru2tei ru2t1el ru2t1er ru2t1o2 ru2t3r rut6scha 4ruz ru2z1w 1rü 2rüb 4rübu rü1ch rücks2 rück5sta rü2hel rüher2 rüh1l 4rümm rün3z rü3ss rü4ssi 2r1v r3ve rv2el rve4n1e rvenen4 r4ventz rve5s r3v2o rv2s 2r1w rwe4gel r3wei rwelt4s r5werk r5wert r2wo. r3woh r3wort rwun3s 4r1x 1ry 2r1ya ry2c rygi3 ry1la ry2le ry1os ry3s2t rysti1 2r1z rz2an rz3ant r2zar r2zat rz2än rzell4a r5zene rz1eng r4zents rze2p rze2ra r2z1erd r2z1erf r2z1erg rz1erk r2z1erl r2z1erw rzes2 r2z1ess rz1id rz1int rzir3 r3z2of r2z3ot rz2tan rz2th rzu4g3l r2zwä r3z2wec r2zwir 1sa 3sa. 3s2aa 2s1ab sab2ä 4sabd sa2be 3sabet sa2bit sa2bl 4sabm sa2br 4s3abs 4sacc 5s2ache sa2cho sachs2 sach3t s2ack s1ad 2s3ada sa2der 2s3adm 2s3a2dr sa4fe 4s3aff sa1f4r 3saft saf2tr 3sag sag2e 5sage. 5sagen. 4s3agent 4s1agg sag4n 4s1a2gr 3sahs 3s2ai sa3i2k1 sail4 sai4r 2s1ak sa2ka sak2e 3saki 4sakk 3sako 4sakt 3s2al. s2al2a sa2l3an sa2lar sa3lat 3s2alb sal3bl 3s2ald sa4lerk 3sali sa2l1id s1all sal3la sal4le. sallo3 3sal2o sal3or sal2se s1alt s2al3t2h 3salz 3sam s2am. s1ama 4sa2mat s2ame 4s3a2mei sa3men sa2min 5s2amm 6s3amma 4s1amn s1am3p4 4samph s2ams s1an s2an. 2sa2na san4at sa2nä 2s3anb s2an2c 3s2and san4dan san4dri sand3s sa2ner 3sang. 4sanga 2s3anh 3sani 3sanken 2s3anl 2sanm 2sa2no 2s3anp 2s3ans s4anse san4sk san3sp 4santei 4santr 4s3anw 2s3anz s4anz. s4anzt 2s1ap sa2pe s2aph sap3p 3sapr 2s1aq 2s1ar 3s4ar. 3sara 4s3arb 3s2ard 3sarg sar2ga sa3rin s2ark sa2rom s2ars 4sart sa4r1u2 s1asc 2s1a4si 2s1a2sp 4sa2sy 3saß sat2a satan2 sa4t3ant sat1ei 2s3a2tem s3ath 3sat2i 4s3atl 4satm sat2o sa4tol sa2tr sa3ts s3atta 4s3attr 3satz 5satza sat4zel sat4z3en s1au 3sau. 3sauc 3sau2e 2sauf 4s3aufb 3saug saug3le sau2gr sau3h 3saum 3saur sauri1 2saus 3saus. 4s3ausb 4sausf 4sausg sau2sp 4sauss 3sauste 4s3ausw 2sauß s1av sa2ve sa2xi sa3xo sa2y1 1säb 3s2äc 3s2äg s1äh 4s3ähn 2s1ält 2s1äm 4s3änd 4s3äp 2säq 2s1är 3s2ärg sä4s3 sä5sse 3s2ät 1säu 2säuß 4s3b4 sba4ne sbau6men sber2e sbus3 1sc 2sc. 2scab 2scac 2scaf 2scal 2scam 2scar 2scat s1ce 4s3cei 6sch. 5schaf 5s2chal sch3ana 4schanc 4schang 5schanz 4schao 4s3chara 4sch3ar5m s2chä 2schäq 2schb 2schc 2schd sch2e 4schech sche2f 6schef. 6schefi 6schefs 4sch3ei. sch6ein. 4schemp sch5erfü sch5erla 3sches 4schess 4schex 2schf 2schg 2schh schi4d schi4e 4schiru 3schis 2schk sch4lac 4schle. 6schlein 4schloc 4schlöc 4schmas 4schmed 2schmö 4schmüh 2schmy 2schn. 4schneb 4schnut 4schobj 4schorc 2schox 4schör 4schp 2schq 4schrad 4schre. 4schrin s3chris sch3rom 4schron 4schrou 6schs4 sch3sk 6sch3t scht2a scht2i scht1s s4chu 4schunt 5schü 2schv sch4web 4schweg 6schwerk 4schwet 4schwid 3schwü s5chy 2schz 2scj 6s1cl 2sco 4scoa 3s2co2p 2scs 2scu 2scy 4s1d2 sd4a sda3me sdes4 sdien4e s3do sd4r 1se se3at. seau4 seb2 5sebä 2s1e2ben 2s1echo sech6str 2s1echt 2s1eck se2dik 3see see1i2 see3ig se2el see3len se3en. see3n2e se3enp se3er. see1ra seer2e se1erf se3e2r1i se1erk se1ers see5s2 2s3eff sef4l 3s2eg s3e2gal se2gl seg4r 3seh seh1a se2hag se2hak se2hel seher4e se4herk se2h1in seh3l se4h3ö seh3ra seh3re seh5r2i seh3s se2hüb 2sei. 2s1eic 2s1eid. sei3da 4s3eifer 2s1eig 3seil s2eim s1ein 5s2ein. 2seinb seinbus6 sein4du 2sei3ne seine3i 4seinfl sein4fo 2seing 2s3einh 2seini 2seink 2seinl 2seinn sein4ne 2seinr s4eins. 4seinsc 4seinsp sein8stit sein6str 2seint 4seintr 2seinw 2s3einz 2s1eis 3s2eism 5s2eit seits1 3sek 4s1e2kel 4sekz s2el. se2l1a 3s2elb sel3d4 sel1ec se2lef 2s3e2leg 6selektr 2selem se2ler sel3ers 2self. selin4s s1e2lit 2s1elix s2ell sel3le se2lob s2els sel3sz selt2e selz2 sem2e 2s1e2mis 2s3emp s4en. se4nad se3nal se4nas sen3au se2nä s2enb 3sendet 4s1endl sen3d4r 2s1endw senen1 4senerg se4ners s2enf 5seni se2nid se2n1im sen6keli 3senku se2no se4nott se4noz s2ensa sen4s3e4h 4sensem sen4si4d s2enso senst2 sen8s7turm sent2a sen3tan sen3tä 2sentd 2sentf 4sentg 4sentn s2ento sen3tr 2s1ents 2sentw 2sentz se4n3u2 3senva sen3za sen4zer sen3zw 5seo seo2r se2pen 5seq s4er. se2r3a2d ser3al se3rand ser3äus serb2 s3erbe. serd2 se2r1e2b se3reie se4r3eim se4rein sere2m s4eren se4r3enk s4erfe s1erfo s2erfr s3erfü 4serfül ser3g2a s1ergä ser3gl s2ergr s1erh 5serie serk4 3serl. 4s3ermit s2ern. 2s1ernä s3erneu 4s3ernt sero4b s1e2ros s1erot s1erö s2ers. 2sersa ser6sehn 4ser4set se3ru se4ruh ser2um s3e4rup 3s4er3v s1erz s4es. se3s2a se2sel 2sesh se3sk s1essa sest3ri se3su 2s1e4tap se2tat 2s1e2th set2i 2s1e2tik set1s se3tun 3sety 3setz 3seuc 4s3eul se1u2n s1ex 5sex. 2sexa se2xe sex3en s2exi s2exo 4sexp sex3t4r 2sexz 6s3f4 sfal6l5er 4s3g4 sgang4 sge3s2 sgro3 2s1h 4sh. sh2a 3sha. shal4li shalt2 shalt4s 4shan 4shc sh2e 1shen 4shf sh2i 3shi. 1shid s4hig s2hip s2hi4r 4shk sh3n 4shoc 4shof 4shom 3shop sho4re 5show 4s3hö sh4r2 4shs 4sht s3hu 4s3hü 1si 3si. si3ach. sial5l sia4s 2siat 5si1c si2cha 2s1idea 2sidee 2s1ideo si3der s2i3do 2sidy 3s4ie sie2bu siege4s si3ene si1err si1f4 si2g1a si2g1ei sig4n si2g3r sigs2 si2k1ab si2kak si2kar si2k1ä si2k1el si4kens sik3erl si2k3i sikin1 si2k3n si2k3r sik3s2 3sik3t2 si2ku sil2br sil2e 3sili s1ill 3silo 2s1imm sim2st 3simu si3n4a 2s1ind 2s1inf 4sinfe sing1a sin3g4le sin2g3r sing3s2 2s1inh s1in1i1 s2ink sinner4 2s1inno 2s1inq 2s1ins 2s1int 2s1inv 3sio sirn4 2sirr 3siru 3sis si2sa si4sam si4schu si2s1e2 si2si si4sis s1i2so sis1or si2s3p sis3s2 5s2ist si4star si3sto si2stu si2su 3sit si2tal si2tau si2tra s2it2u 3siu si2va sive3 siver2 si4v3erf si2vin siv1o4 si2vor siz2 1sí 4s3j 2s1k2 4sk. sk4a 4s3kab s3kad 1skala 4skalk s3kalt 4s3kam 4skana 4s3kanä 3skanda 4skann 4skap 4s3kar 4s3kas ska4te. 4skateg ska4tes ska4to 4skau 4s3kä 4skb ske2li 4sken 3skep 4sker 4s3ket s3kh 3s2ki. 3s2kif 3s2kik s3kim s3kin s2kis. 3skiz sk4l 4s3klas 3s2klav 4s3klu 4sk4n 4skoh 4skol 4skom 4skon 3skop. sko2pr 4skos 4skow 4s3kö sk4r 4s3kra 4skro 4sks 4sk3t2 skto2 3skulp 4skun sku2s3 4skü 4skv 2s1l2 4sl. s3lab 3slal sla2ma 4slar sla2ve s2law sl3b 4s5le s3li 3s4lip 4sln slo3be s3loc s4loga 3s2low s3lu s3ly 4s3m4 sma3b4 sma3sc smas4p sme3na smi2t3 2s3n2 snab4 sni4a sni3er. sni3ers 4s5not s5ny 3so. 2s3oas 2s1o2b 3s2o3ba 4sobj 4s3obo so1ch so2di so2do so3et s1o2fe 3soft 3sog sog4l s1o2he 3sohl sohle2 2s3ohng 2s1ohr 3soi2 so3id 2s3ok 1sol 3sol. so3la so4lau 3sold 3sole so2l1ei so3li sol2la2 sol4ler so3l2o 4s3o2ly 1somm 3s2on son2a son3au sone2 son4gl son3sä son2s1o so3o s1op 2sope 2sopf 3sopr 2s1ord sore2 so2rei so2rel 2s1orga 1sorge so1rh 2s1o2rie so2ro 3sorp 3s2orti so4ru 1so3s2 3s2os. 3sosc so4sk 2sosm 2sost so4sth s1o4sz 3so3ß 2sot so3t2h 3sott soun2 sound1 so3unds so3unt 2s1out 3sov 3sow 2s1o2x 3soz s1oze 2s1ö2d 2sö2f 2s1ök 2s1öl 2s1ö4s sp2 2sp. 2spaa s2pace 2spack 2spag spa2ge 2spak 2spala 2spalä 3spalt spa2m 1span s2pan. 3spannu 2spano s2pans 3spant 2spanz 4spap 2s3para 1spare 2sparo 1sparr 5s6parten 4spartn spas2 spa3sse spa5ssi 1spat. 2spati 2spatr 2spau 3s2paz s2pä 2späd 3späh 2spär 2späs 2spe. 2speg 1spei 4spein 4spensi spe3p4 s2pera 3sperb 3s2perg s1peri 4sperle 2spero s2perr sper4ra 2spers 4spet 3s4pez 2s3pf4 4spha s2phä 3sphär s3phe 1spi 3spi4e 4s3pier spier4r spi2k 4s3pil 2s3pip 4s3pis 3s2pit 3s2piz 2spl 4spla 4s3plä 3s2pli 4s3p4lu s3pn 2spod 4spoe s2poi 2s3pok 4spol 1spon s2pons 4spoo 2spop 1spor s2pore 3s2porn 4s3pos 4spote 4spr. 3s2prac 2sprak s2pran 2sprax 2spräm s2prän 2spräs 3sprec 2spred 5s2pren 2s3pres 3spring 4sprinz s2prit 4sprob 4sprod 2sprog 4sproj 2sprop 5spross 2sprot 2sproz 3sprö 3s2pru 3sprüc 2sprüf 1sprün 2s3ps 2sp3t 2spub 2spud 1spuk 3s2pule s3pun 4spup 3spur spu4rer 1spü 2spy 2s1q 4s3r4 sra4s3s srat2s sre3cha sro2h sro3tu srö2s srücker6 2s1s 6ss. 4ssa s3saba ss3abi ssa3bo s5sack ss2ad ss4agi s2s1aj ss3alba s2sall s4samt s2sanf s4sang s4sano s4sans ss2ant s4sanz ss2ara ss2arg s3sars s2s3att ssau3e ssau4r 4s3s2ä 4ssb 6ssc s2sce ssch2 sschanker8 s2scr 4ssd sse3a 4ss1ec 4ssee sse1ec 4ssef 4sseg 4sseh sseh2a 4ssei s2sein ss4eind sse3int 4ssek 4sselek sse2lö 4ssemp 6ssendet 4s3sendu 6ssenerg ssen6kel ssenmas6 ssen6sem 4ssentl 4ssents 4ssentz ss1epe sse6ratt ss5ereig ss4ergr sser4hö sser6mit s2serö sser4öf 4ss3erse ss4eru sser6wei 4ssesc 3ssesh sses4sa 4ss3e4str 4sset sse3ta s3seth 4ssez 4ssf 4ssg 4ssh ss3hi 4ssic ss3i2ko s2simp 6ssio ss1isr 4ssit 4ssj 4ssk s3skala 4s4s3l 4ssm ssmut2 4ssn 4sso ss1off ssoi4 s3sol s4sop 4ssö 4ssp ss2pen ss2phi s3sprä s3spri ssquet4 4ssr 4s4s3s4 sssau4 4sst sst2a s5stad s6stag s3stä ss1t2e s4ste. s5stel s5s2tep s5stern s4stes s4stet s5steu sst2i sst3in ss1tis s5stop ss1tor s3s4trat s3strö s3stü 4ssum s2sumg s2sumr 4ssunt 4ssup ss2ur s3sus 4ssü 4ssv 4ssw 4s3sy 4ssz 1st 6st. 3s4ta. 5staa 5stab. 2stabb 4stabel 2stabg 2stabh 4stabit 2stabl 2stabn 2stabt 2stabz st2ac s2tad 2stada 3staff 2stag 3s2tagr 3stah 2stak 2stala sta3lak 2stalb 2stalg 3sta3l2i 2stalk st1alp st1alr 3stam st1ami stam4ma 4stampl 4stamt 2stanb 3s2tand 4stanf 6stangeh 4stanh 4stanl 4st1ann st3ansp 4stanst 3stant 4stantr 2stanw 4stanza sta3po 2st1app s2tar. sta6rens s2t2ars s4tart 2stasc sta4sie stast4 2statb 7s2tati 7statth 7statu 2stauf 5staur 2staus st1a2ve 2stax 3stäb 3städ 2stäg 2stält 2stämt 3ständ 4stäp 5s2tär 3stätt 2stäus 4stb 2st3c 4std 3ste 4steam s2tean 4stechn ste2d st1edi ste2g3r s2teh 4stehr st4ei. 4steic 4st1eid 5s4teig stei4gr 4steil s3teilc stei4na 6steinga 6steinhe stein6sp s2tel st1elb s3tele st2ell stel6l5än ste4mar ste6ment 6stemper 4stempf ste4na 4st3ends st2ens 4stentf 4stentl 4stents 4stentw 4stepi st1e2po ste2r3a s2terb 4sterbs 6stereig s2terf st3erfü st2erg s2terh s2terj s2terk sterma7sse s2tern 6sterras s2ters ster4zo ste4s1e stes3ta 4stestb 4stestn 4stests 4steta ste4tab ste4tag s2teu 4steuf st3eun st1ev 4stex s2texa 4stf 2stg 2sth st2hen st1hi st3ho st1hy st1i2d 4stief. 4stiefl 5s4tiel 5stif sti4gel st2il 3stimm 4stimma 2stimp 2st1inb 4stinf 3sting 4stinh 2stins 4stint s4tio 2stip. 4stipps sti2r st1ira st1iri st1iro 2stite 2stj 2stk 4stl 4stm stma3s2 2stn sto2bl 4stocht s2tode 3s2tof stoffen6 stof8fens 6stoffiz sto3mi 2stomn 2ston 4stona 3s2to4ne 4stonl 2stope 2stopo 2stord 2storf 2storg s2tory 4stou 4stöch 2stöl 5s2tör 2stöst 2stöt 4stp 2stq st4rade stra4fa 2strag s2trah 2strai 3s2tral 4strans 3s2tras 3straß 4straum 2sträc 2s3träg 4sträne 2stre. 4strech 2stref 2streg 4streib 5st6reif 2strep 2stret 2strev 3s4tria 2strib 4strig 4strisi 4stroc 3s2trof 3s2troh 3s2trok 4stropf 3s4tropo st4ross 4strost 3stroy 2ströp 2strub 3struk s2trum 2strun 2strup 2strut 4st3s2 stsas2 stsi4d sts4p 2st3t4 st2u 3stub 4stuch 3stud 2stue 3stuf 2stug st3uga 3stuh 2stuk 2stumo 2stumr 2stum2s s3tumsc 2stumt 2stumz 2stun. 2st3una 2stune 2stunf 2st3uni 2stuns 2stunt 3stuö stu3ra stu5re 2st3url 2s3turn 2st3urt 3s2turz 4stüch 3s2tück 3stüh 2stür. 2stüre 2stürg 2stürs 2stürw 2stütc 2stv 2stw stwor2 2sty 4sty. 4styp 4stys 2st3z2 su1an 3su2b3 su4ba 4subi su4br subs4 5su1c su2cha su2cho 3sud su2eb 2s1u2f su3fi 2s1uh 1sui su1is su1it. su2k su3l2i sum1a su2man su2mar 3s2ume su2mei su2mel sument4 su6ments su2m1et 2s3umf su2m1id su2min 3s2umm sum1o2 su2mor s2ump s1ums s3umsa 2sumse s2umsp 2s3umst 2s3umwa su2n 2s1una sunder4 sun6d5erh su4ne 4s1unf 6sungena 2s3ungl 4s1uni 2s1unm s1uns 2sunt 3sup 4supd sup3p4 su2ra sure4 su2rei su2rer 3surf 2s1urk s1url su2r1o s1urt su2s su3s2a sus1e sus3i s3u2t su3tr suz2 2sü4b 3süc sü2d1 süden4 sü3den. 1süf 3sün 1süs4 sü3sse sü3ssi 1süß 4s3v2 svoran4 2s3w swe6gers sweh2 swe5s 4swie 4swil 4swink 4swis 4swit 1s2y 2syl1 sy2lo sy2lu sym3 sy2n3 3synd sy4no 3sys 2s1z2 4s3za 4szä 4s3zei 4szel 3s2zena 3s2ze3n2e 4szent 4szer s2zes s2zeß s4zew 4s3zie s3zins 4s3zo s3zs sz3ta 4s3zu 4szü 4szw 4szy 2ß3a4 ßan1 ßat3 2ß1ä 2ß1b4 ßbus3 2ß1c 2ß1d4 1ße 2ß1e2b 2ß1ec 2ß1ef 2ß1e2g 2ß1ei 2ß1ek ße2l 2ßelek ße3lu 2ß1emp ße4n3a4 4ßenerg ße2ni ß1enke ße2no 3ß2en3te 2ßentz ße2nu 2ß1e2p 3ß2er. ßer3b ßer2ei ßer2la ße2ro 2ß1erse ßer3t ß1erw ße2s 2ß1es2s 2ß1est3r ße2t 2ß1ex 2ß1f4 2ß3g2 ßge2bl 2ß1h 1ßi ßi2g1a 2ß3i2k 2ß1il 2ß1im 2ß1in ß1j 2ß3k4 2ß1l2 2ß1m2 ßmut2 2ß3n2 2ß3o4 ß1ö4 2ß1p2 2ß1q ßquet2 4ß3r2 ßrö2 ßrus3 2ß3s4 ßsau4 ßsch2 2ß1t ßt1h ßt1in ßts2 1ßu2 ß1uf 2ß1uh 2ß1um ß2ung ß1uni 2ßunt ß1ü4 2ß1v 2ß1w 2ß3z2 2taa 2tab. 3taba ta2b3an 2t1abb 4tabd 1tabel 2tabf 2tabg 2tabh 2t3a2bit 2tabk 2tabla 1table 4tabm 2t3abn 2ta4br 4tabs t1abst 2t3abt 3tabu 4tabw 4tabz 2t1ac t2ache 3tacu t1ada 2tadd ta2der tadi3 tadi5o4 tadi4s t1adm ta2dol 2t1a2dr ta3d2s ta2er 1tafe 2tafet t1afg t1afr 1tag ta2ga ta2g1e2i 4t3agent tage2s 2t1agg ta3gl 2t1a2go tag2s1 tag4san tag4st 2tah2 3tai ta3i2k tai2l1 ta1ins tai4r ta1ir. ta1i2s 1tak 2t1a2ka ta3kes 2t1akk ta2kro 2taks tak2t1o2 t2aktu 2takz 3t2al. ta2la ta3lad ta3lag tal3au 1talbr 1talbu tald4 1tale tal2en ta4l3end tal3eng ta4l3ens taler2 ta4ler3g ta2let tal2ga tali6ene tal4l3ac tal4leg tal4lei tal4let tal6leut tal6lin6s tal4los tall2ö tall3s tal4lus 2t1alm. ta2lop ta2l1o2r t1al3ta tal3th talt4r ta2lu 2tam 3t2am. t2amen t1a2mer ta2mi tam2ma2 tam4m3er tam4mi tam4mut t1ampl 3t2ams 4t1amt t1a2na tan3ab 4tanal ta4nat 2t1a2nä tan3d4ar tan2dr ta4nerf 4tanf 2tang tan4gra 2tanh t2anho t4ani 3tanj 1t2ank tan2kl 4t3anl t1anm 2t1anna 3t2anne t1ano 2tanom t1ans t2ans. 4tansi tan4tan t4ante. 4tantei 2tantr tanu4 2tanwa 2tanwä t2anz. t1anza 4tanzei 3tanzk 3tanzr t1anzu tan2z1w tao2 ta3or t4ape ta2pes 2tapf ta2pl ta4poka t2appe ta2ra 2tarab 3tarabb ta3rak 3tar5al 2taram tar3ap ta3ras t2arau 2tarb 3tarba 3tarbek 3tarber 3tarbi 3tar3bl 2tarc 3tarchl 3tarchr t2ard ta2rel ta2r1er tar3g ta1r2h 3tari 2tark 3tark4l 3t2arko t2arl 2t1arm t2armä ta2rom 2tarot 2tart 3t2arta 3tartei tar6ter6e 3tartex 3t2arth t1arti 3t4artis tar2to tar2tr 3tarty ta2ru t1arz 2tarzt t2as. ta3s2a 1tasc 4t1asp 2t3assi 1tast ta4stem ta2sto ta3str t2asy t4at. ta2ta2b ta2tan 3tatb t4ate tat1ei t5a2tel ta2tem 1taten ta2t1er 2t3atl 2tatom 2ta2tr 1tatsa 2tatt tau2b1a 1taubh tau2bl tau2b3r tauchs4 tauch5sp 2taud t1auf 3taufe. tau3f4li 4taufm 2taufn t3au2f1o 4taufp taufs2 4taufw 1taug 4t3auge t1auk 3taum 4tauma 1taume 1taus 4t1ausb tau6scha tau6schm tau6schr tau6schw 2tausd t2aus2e 2t1ausf t3ausg t1ausk 2tausl 2tausr 2t3auss 2t5ausw 2tausz ta2van 3tax taxi3s 4t1axt 2tää 2täb tä1c 2täd t2äf 1täg 2tägy 2täh 3täle 2täll 2t1ält 2tä2m t1ämt t1ängs 1tänz 2t1äp 2täq tä4reng tä2ru 2tärz tä2s t2ät 3tätigk 4tätt 2täug 1täus 2täuß 2täx 1tà 4t3b4 tbauer4 tber2e tblocken8 tbus3 2t1c t3cha t3che tch2i tch3l t3chr t2ch1u tch1w t3cl tcor2 t3cr 4t3d4 tdar2m1 tdun2 1te2a2 te3ab tea3c te3ag 2teak te3al teamma3 te3an te3ar tea4s 3teba t4ebb 2t1e2ben t2ech 1techn te2chu 2teck t1ecu te2dit 1tee te1em teen1 te2er. te1erw te2es 3tefa 2teff 2t1egg te2hac 2tehe te2him 2t1ehr te3hu 1teic tei1fl 2teign teik4 1t2eil tei6lent teim2 2tein teinbus6 teinen4 tei6nens tein6hab t3einkü 2t1eis. t1eisb tei3sc te5isch. teit4 t1eiw tei3z te2kel 3teko tek3t4 te2la tel3ab tel1ac te3lan te4lant tel1au te2lä telb4 tel3d4 tel1ec 1telef 1teleg tel3ehr 2telem tel3eng te2ler te2leu 4t3elf. te4lim te2l1in te2lit tel3le tel6lein tel3li tel6li6st te2lob te3lom te4lost te2l1ö tel3s2k tel3ta telt4r t2ema te2man te2m1ap te2mau 2tem2bo te2m1ei te2m1er 2temg 2te2mi tem3i2m tem3ing 2teml 2temn 2te2mo tem1o2r 3temper 2tempf 1tempo tems2 te2mu te4mun t6en. ten1a2 te4nad te4n3an ten3ar te4nas te4nat ten3au te2n3ä4 ten3da t3endal tend4an 4tendap 2t5endf 2t1endl t6endo 2t5endp ten3d4r te2n1e2b te2nef te2neh ten3ei te3n4ei. tenei4d tene4m tenen1 te4n3end te4nene te4neng te4nens 4t3energ te4n3ern tenf4 t1eng. teng2a 4ten4gag t3engla te2ni te4nil ten1im te4n3in tenk4 ten3n2 te2nol te2nos te3nö 4t3ensem 1tenso tens2p t2enta t1entb 2tentd 2t3entl 2t3entn ten6tric t1ents 4t5entw 2tentz te2nu t2enz ten4z3er teo2f 2t1e2pi tept2 t4er. t4era ter3ac te2rad te1ral ter3alg te3r4ane te2r3ap 2t1erbs 2t1erbt 4t3erde. ter3d2s te2r1e2b te2rec t3ereig te5rek tere2m te4rema te4r3end te4rene te4reng te4r3ent teren5th terer3k terer6ku terer3l te4r3erp te4rers te4rerw t4erfr terg2 ter3ga 6tergebn t6ergem t6erges t6ergew ter3gl 6tergrei t4ergru 2t1ergu 2tergü t6erhall t6erhau t4erhäu t4erhei t2erhi t2erho 6terhöhu t2erhu te3ria 4terii ter3iko teri4o te2r3it teri4ta 4terklä t4erlä t4erli ter4lös termas4 1termi t2ern. ter4nar t6ernc t4ero te1rob ter4obe 2teros t1e2r1ö t4erp t4erra 3terras ter4re. t4erro t4ers. t2erse t4erst. t6erstad ter6stat t4erstä t4ersti t4erstr t4erstu t4erstü ter3t4a ter4trä t4eru2 te4r1uf te3rung t4erv 4t3erwäh ter3z2a 2t1erzb t4erzei 4terzeu ter3zw te2s t2es. tesa2k te3sä te3sc tes3eli te3ser te3si te3so te3sp tes1pe te4sper te4spr 2t1essa tes3si tes2t tes3tät 1testb tester4 te6sterg te6st5erh te6sterk te3sto tes3tra t3est3ri 1tests t1eta te4tabl 2te2tap te2tat teten3 2t1e2th te3tho 4tetl 3teuf te1u2n 2t1eup te2va te2vi tewa2s 3tewo 1tex 2texam 2t1e2xe 2t1e2xi 4texp tex4ta 2t1exz tè2 2t3f6 tfäs3 4t1g2 tga4s3er tga4su t3ge tge4nen3 tger2a tger2i tg4r tgro3 4th. 2t1h2a 3tha. 3t2hag 4thak 3thal. 3thalh t4hali 1t2hals t2han. t3hand t3hap 4t3hau 2t1hä 3thäi 4thäl 2thb 4thc 1th2e 3t4hea 2t1heb 2t1hef 2t1hei the1in 4theit t2hek 2themd 2themm t1henn 3theo t1herd thero1 2t1herr 2t1herz 4t1hess t2heu 2thf th2i 3thi. thic3k4 thi3er. 2t1hil 2t1him 2t1hin thi3nu 2t1hir 2thk 2th3l 4th3m2 thmu2 2th3n2 2t1hob tho3chr t1hof 2t1hoh t1holt 2tholz t2hon 4thops t1hose t1hot 4thote 2thou t1hov 2thö 2thp 1th2r2 2ths 2tht2 t1hu 2thub 2thuh 4t3hun 2thut 2t1hü 2thv t4ia ti3ac ti1ag tial2l ti3alo ti1a2m ti1ce ti3chr 3ticket t2id. 2tidee ti4d3en4d ti3dy 1tief. 4tiefel 1tiefl tie2fr tieg4 ti2e1i ti1el ti2el. tiel3a ti3e2n1 tie4rei tie4reu tiermas6 ti2ern 1tierr tie5sse ti1eu ti3fe tif3f ti1f4r tifter6k ti4gerz ti2git tih2 tihi4 ti2kam ti2kar tiken2 ti4kent ti3k4ere ti3kerl ti2kin ti4klu ti2kn ti2k1op tik1r ti2kra ti2krä ti4krei tiks2 ti2lar til3d ti2lei ti2lel 1tilg 3tilgu tille4b 2tillu ti2lö tilt4 ti2lu ti2ma2g tim4man tim6ma6te timmer4 tim6merg tim4mit 2timp t4ina ti3naf ti3nak ti2n3an t1ind ti5n2e tine1i 2t1inf tin2ga ting3l ting3s2 2t1inh 3tinis t1in1it t1inka tin2k1l tin2kn tin2kr t1inku t2inn ti2nor t1ins t3insa t2insä 4t3inse tin4spa tin4sum t1int 3tinte. ti3nu tin2um 4t1inv 3tio ti2osk tioxi3 1tip. ti3p4l 1tipp 3tips ti4que. 1tirad ti1rh ti4ron t2isc ti6schei tisch3l tisch3w ti2sei ti3sk t1isl t1iso ti2sp t1isr ti3s2th ti4s3tic ti2su 2t1iß t1it2a ti2tal 3ti3te 3tiu tium4s ti2van ti2vel ti4vene tiver2 ti4verh ti4verk ti4verl ti2v1o ti4v3r ti2za ti2zir 2t1j 4t3k4 2t3l2 tlan2g tl4e tlei6der t4lep tle2ra 4t5li tlings3 tli5ni tlit1 t5lö 4t1m2 tmal2 tmen8schl tmen4t5 tments4 tmo4des 2t3n4 t5na tnes4 tni3v to4as to5a4t t2oba 4tobj tob2l t1obs 1tobt to1ch 2t3ochs 1tocht 2tock tock5ent 1t4od 3tod. tod1er2 to2dun tof6f5ent tof4f3er 2toffi 2t3ohr toi4r tok4 to3le 1toler tomar4b to4mene 3tomi to2min 1tomo to2m1u to4mun 1ton to2nan ton3au tond2 to2n2eh toner6ke to2nob 2tony 3too to2pad to2pak to2pan to3pas to2pat t1ope top1hi 1topo 2to4pt t4or. tora2g to4rän t1ord t2ordi 2t3ordn t4ore to2rei to2rel to2rem to6renna 1torf tor4fan t1or3g 2torga 6t5orient torin4s tor3int to2rö 1torp t4ors 1tort 2t1ort. tor3t2a t1orth 4tortn 4tort4s to4ru to3rü to4rüb to3s2 to4s3ka tost2 to2tä 1toten to2tho 3t2ou touil2 to3un to1x tö2c 1töch 2töck 2t1ö2d 2tö2f 4t1ök 1töl 2töl. 1tön t2ör t1ö4st 1töt 2t3p4 tpf4 tpi2n 2t1q t2r4 2tr. 1trac tra3cha tra3chl 2t3rad. 2trade tra4dem 1tradi t3radie tra4fah tra4far 2traff 1t4rag tra5gen 2trahm 3t4rai 2t3rake t4rakt tral3l 1tram 3t4ran. 4trand 2trang 1trank t3rann 5t4rans 1trapp tra4sta tra4str 2traß t1raub 4traub. 4trauc t4rauf 1traum 2traup traus2 1träc 2träd 1träg 1träne 2träng 2träuc 1träum 4t5re. 2trea t3reak 2treb tre2br 2trec t3rech t4reck 3treck. 2t3red 1tref 2trefe 2trefl 2trefo 2treg t3reh t4rei. 1t4reib 2treif 2t3reig 2t3reih 2treim 2t3rein 2t3reis tre7isch. 2treit t3reiz 2trek 2t3rel t4rem t4ren. 1trend 1trenn t3rent 2trepe 2t3repo 1trepp t3repr t4rer t4res. 1tret tre2ta t4rete tret3r tre4tri 2t3rett 2t3rev t4rex 2trez 3t4ré 2t3rh 3t4rib t4rick t4rid2 1trieb trie3fr tri4ena tri2er tri4ers 2trig. tri3gl t4rik tri4ke. tri4kes 1triko 1tril 1trin t3rind 2tring tri3ni t3rinn 3trio t4rip 2triß 1triu 2t3riv tri2x trizi1 tro3b4 1troc 4trock. tro4kes trol4la 2trom. tro4men tro2mi 2tromk tro3na t4rop tro1pe 3tropf tro5sm 1trost t1rot. 2trout 4t3röc 2tröh 2tröm 1tröp 2t3rö4s3s 1tröt 1trub 2t3ruc 4truf 1trug 2truk trum2 t3rumä trums1 t3rund 1trunk 3t4rup t3russ 2t3ruß 1trut1 tru2th trü1be trü1bu 2t3rüc trücker6 t4rüg 3trümm try1 2ts 4ts. ts3ab t3sac tsa3che t4sachs t2sa2d ts1ahn t2sall t2salt t4samp t4s1amt t2san ts3ane tsa2r ts3ari t2s1a4s tsa5ssen t2sau ts2av t1sä t2säh ts1än ts1äus t2sce t4scham t6schart t3sche t4schef t3schl tsch4li t3schra t4schro t3schü ts2cor t2s1e2b tse2e t2sef tse4he. ts2eil t3seme ts1eng t3s2ens t2s1ent t2s1ep t2s1er t6s5essen tse2t ts1eta t2s1eti t2s1e2v t2sex t3sexi ts3he t2s1i2d t2s3i2k t2sim tsing4 t2sini ts1ir 4tsk t3skal ts4kele tski2 t4s3ko tsmas4s tsma5sse t1so ts1off t2sop tso2r ts1orc t2s1ori ts3ort. t3sos ts3part ts1pas ts3pate t1sped t1s2pek ts4pend ts2pi t2s3pic t4spins ts3ple ts2pon ts2por ts2put ts5s4 4tst4 t4stabe t2staf t4stale t4s3tanz t2stas t4s3tat. t4s3täti t4stee t4s1tep t4sterm t4s3terr ts1tie t3s2til t3stim t2s1tis t2stit t4stoch t2stoi t2stor t4strac t4strad t3s4traf t3strec t4stren ts4tric t4strie ts2tro2 ts2tub ts2tüm ts1u 3tsubi t2sumz ts3un t1sü tsü3s tswa2s 4t1t tt1ab tt2ac tt3achs tt1ad tt2ag tta6g5ess t4t1ah tta2ke tt2al t2tan ttan4a tt4anke t3t2ant t4t1ap tt1art tt3atr tt1äh t2tän tt1ebe tt3echs tt1eif tt1ein t2t1eis tte4l1a2 tte4l3e4b t4te4leg tte4len ttel3l ttel1o t2temu tte4na ttens2 tten6sem t4tentb tten3te t4tentf t4tents tten3z t2teo t3t4ere tt2erg tte4rik ttermas7s tter3nä tte2ro tt2erö tt4es tte4s3a tte4s3ä tte4s1o t3tess ttest4r t4teuf tt2häu tt1hi t2t1ho t2ti4d t2t3igi t2tins tt2int t2tiso t4t5la t3to. t2torg t3tos ttras3s t2trou tt3rü1 ttschi4 tts1eh tt2sen tts1p tt4s3tät tt4s3tem tt4ster tt3s2z ttu2 ttu3b t2tuc tt1uf t4tunt t2tu4s ttü2 tt3z2 3tua tu4ale tu1alm tu1alv tu3ant tub2 tuba3b 1tuc tu2chi tu1cho tudie4n3 3tue tu3en tu2ere 2tuf tuf2e tu3fen t3u2fer 3tuff tuf4fel tu2gan 3tuge 2tuh tuh4ler tu1ist t3u2kr tul2i 1tum tum2b5l 4t3umf 2t3umg 2t1umh 2t3umk 2tuml 3t2umo 2tump 2t3umr 4t3umsat 2t1umsc tum2si tum2so 2t3umt 2t1umw t3umz 1tun. 2t1una 2t1und tund2e 1tune tun2en 2t3unf t3unga 2tunif 2tu2nio 2tuniv 2t1unm 3tunn t1u2no t3uns 1tuns. 2t3unt 2t1unv 2t1up. t1upg tu2r1ag tu2ran turan4l tu2ras tu2rau tu2rä tur1c tu2r1e2b tu2rei tur3eis tu4rene tu2r1er tu4res tu2re2t tu2r3e2v tur3f4 tur3g2 tur1in1 tur4mun 1turn tu2r3o tur3s2 tu4ru tu2sa tu4schl tu2se tu2so tu3t2a tuto5 tuto3re 2tüb tü3ber. 1tüch tück2s 1tüf 2tüh 1tür. tür1c 1türe 1türg 1türs 1türw 2türz 1tütc 1tüte 2tütz 4t1v2 t3vo tvoran4 4t3w4 t5wa2 twä4 twegs2 twi4e t4wist 1ty 3ty. 2t1ya 3typ ty2p1a 3tys 2t1z t2za2 tz1ag tz3ar tz1au t2z1ä t3zäh tz1ec t2z1e2d tz1ehr t2z1eie t4z1eis tze2m tz1emi tze4n1 tz2ene tzen3ta t4zentg t4zentl t4zents tzer6gre tz1erw tz2er3z tz3erzi tzes1 tz1e2t tz1i2d tzi4m tz1imi tz1int tz1inv t2z3om t2zop tz2th tz2tin tzu2gu t2zuni tzwan4d3 tz1wä tz1wi t3zwie tz1wu 2ua u3a2b u1a2c ua2dan uad4r u1a2g u1ah u1al. u1a2l1a u1a2l1ä u1alb u1ald u3aleb u3a4lent u3aler2 ua4lerg ual3erk u3a2let u1alf u1alg u1alh u3a2lid ual3l ualle2 u1aln ua2l1o2 u1alp u1alr u1als u1al3t4 ua2lu u1alw u1alz u1am uan2a u1ans u3ar. uara2b u1ars uar4t3an ua3s2a ua2th uat2i uat2o u3au uau2s u1ay u1äm u1än uäs4 u1äu 2u1b u2barb ubb4l ube2be ube2e u2b1ehe ub1ein u2b1e2m ube4n1a uben3o ub2er u4b3erde ubert4 ub4es ub1eul u3bit ub2l ub3läu ub3lic ub3lu ub4lut u2bob u2bop u2boz u2b3rit ub4rü ub2san ubsau2 ub6s3che ub2s1o ub2sp ubst2 ub4sz ub3t2h ubu3s 2uc uc1c uch1a u1cha. uch1ä u1che uch1ec u2ched uch1ei ucherin8t ucherma8s u1chi uch3im uch1in uch3l uch3m uchma6ss uch3n uch1op u2ch3r uch4sel uch2so uch2sp uchst2 uch2ta uch3tan uch6t5erf uch6t5ert u1chu u2chum uch3ü uch1w u1ci uck3elf uck2er ucker8geb uck3i uck4sti uck3t u1cl 2u1d u3d4a uda3d ud2e ude3i4 udein7 udel3se uden1 uden3e udert4 udi3en uditi4 u3d2ob u2don ud3ra u3dru 4u1e ueb4l ue1ch u2ed ue2en4 u2eg u2eh ue2ke u2ela ue2lek ueli4 uel2la uel2lä u3eln ue2mi uen1 u3en. ue4n3a2 ue2nä u3end uene2 ue2neb ue2ner uen4gag uenge2 uenge4m uengene7 uenge4s uen2gl u3e2ni uenk4 ue2no ue2nu uen6zene uen2zu u2ep ue2r3a2 ue2r1ä uerb2 uer6baut uer3d2 uere2 ue2rec u5ereinn uer3eis uer3ela u3eremp u3e4r3ent ue3r4erb u3ererf ue4rer4g uerer4h uerer4k uerer4m ue6rersc uerer6sp ue6rerst uer3esk ue2ret u3erex uer3g2 uer4geb u3erh ueri2d ue2r1i4m u3erin4t u3erl. uerma6s u3ern uer4nan uer4nar uer4ne ue2r3o4 uer2ö uer3r u3errü uer3sc uerst6 uer3t2 u3eruh u3erum u3erunf u3erunt uer3z2 ue4s ue5se ue5sp ue2ta ue4tek ue2tik uety2 u2ev ue2x1 uf1ab u3fac u3fah u3fal ufall4 ufa2n uf3ane u2f3a2r ufa2t uf1au u2f1än u2f1ä6s u2f1ä2ß u2f1ei ufel4s3a u2f1em 4ufen u3fen. u2fent u2ferf u2f1erh u4ferla u4ferle u4ferne u2f1eß u2f1et 2uff uf3fe uffel2 uff4l uf2fro u2f1id u2fim u2f1ins uf3l u2fob ufo2r uf1ori uf3r uf5sä uf3sc uf2spo uf4stab uf4ster 2uft ufta2b uft1eb uf3ten uft3erd uft3er4g ufter4l uf3ti uf4tin uft3s2 u2fum 2u1g ug2abe u4gabte ug1a2d ug1ak u2gana u2ganb ugang4 u2gani u2gans u2gant ug1ap u2g1ar ug1au ug3d2 u3ge. u2g1ec ug1e2i u2geig u2gein uge4lob ug1emi ugene2 ugenma3 ugenmas6 u2g1erf u2g1erl u2gerr u2gerv uges2 u3ges. u2g1esk ug2et ugg2 ug2gl ug5g4t ug3hu u2g1i2d u2gim ug1in u2g1l u4glä u6gleitb u6gleitu u4glic u4glis ug3liz u4g3lo u4glu u4g3n u2gob ug3oc u3gon ug1op ug1o2r u3gos u2gö u2g3rä u2greg u4g3reis u2gres u2g3rie ug3ro ugro3s u2grou ug3rüs ugsma3 ugsmas4 ug6spe ugs4por ug3stä ugs1te ug4stur u2gum ugu6ster u2gü u1h uh2a 2u3he uhe3a uhe1e2 2uhi 2uhl uh1la uh2lar uh1lä uh4l3ent uhl3erb uh2li uhl2ö 2uhm uhme4 uhr1a uhrei4s uh2r3er5 2uh3ri uh4rin uh2r3o uh2ru uh4rü uhs4 uh3t2 u2hu 2uhü uh1w 2ui ui2a ui1ch ui2che u1idd u1ie ui1em u3ig u4ige uil4les u1im u3in. uin3n u3isch. u3ischs uis2e uisi4n ui2st ui3sta uit3s u1j uji3 uk2a uk1äh u3käu u1k2e uke2n1 u1ki u1k2l ukle1 u1k4n u2k1ob uko2m1 ukom3a uk2ö u1k4r uk2ta uk2t1el uk2t1er uk2tin uk4t3o4ri uk2t3r ukts4 uk2tum u1ku uku2s uk2ü u1l ul1am ulan2e ul2ar ula2sc ul1äm ulb4l ul4dan ul2dr uld2se 2ule u2l1el ul1emb ule4n ul1er2h ule4s1t ule2t ul1eta 2ulf4 ulg4 2uli ul1id uli2k ul1ins uli1p ul3ka ul2kn ulla2g ull1au ul2lä ul3len ul3l2i ulli2n ul2lo ul2lö2 ull3s2 ulm2e ulni2 ulo2i u2l1op u2l1or ulp1h ul2pha ul2sa ul4sam ul2s1ec ul2sei ul2ser ul2sum 2ult2a ul3tan ult3ar ul2tau ulter4m ul2tri ult3s u2lü ul2vr ulz2w 2uma. u2maa u2mab u2m1ad u2m1a2k um1all um1ang um1anz u2m1ap um1ar u2marc u2marm u2mart u2matl u2matm um1aus u2maut u2m1äh 1umd2 u3me. u2m1ef u2m1ein ume2n1e um5engel umer2a u2m1erf um1erg u3merk u2m1erl um1erw ume4s 1umf 4umfi 1umg um1ind um1inh um1ir umi2t um1ite 1umk 1uml umm4a 2umme um4mess um3mi um1ob u3mol um3ot ump2fa ump4fin umpf4li um2pho 1umr um4sam um4s3an 1umsat um2s1er um2sim um4sk um2s1pe um4stem um2sum um3t2 u2mum u2m1u2r 1umz un1 2un. 2una. 1unab 3unabh un2a3br un2ag un2al u3n2am u2n3an u2nap u2narb 2un2as un3at unau2s un2är 2und. un2da unda2b un2dän 1undd 2unde un3de. underer6 und3erf und3erö underten8 under8tend und3erz un2dex 1undf 2undg un2did un2dim 1undn undo2b un2dop un2dor 2un2d3r 4unds. 2undsc und3sp un2d1um undü4 1undv 1undz u3ne2 un3eid un3ein un2emi une4n1 unen2t une3re une3ri u4nerk u4n3erz. un2es2 unf2 un3fa unft2s un2gab un2gam un2gat 3ungena unger4e 1unget 1ungew 1ungl un2glu un2go un2gr ung3ri ung4s ungs3tr ungstra8s7 u3nic un2id un3ide 4unie 3u2nif uni3k4 un2im 1unio un2ir un3iro un3isl u3n2it 1u2niv 2unk un2k1a2 un3ker un2k1es un2ket un2kne un2ko2p un2kro unk3s2 unk4tit unk2tr unlö2 un4n1ad unn2e unne4n u2nob uno4r un2os 1unr uns2 2uns. unsch5el 1unsi un3sk un4ski un3sp uns4t unsta4g unst1r 2unsy 2unsz 1unt un3ta un3te unte4ri 2unti un3tr unt3s 2untu 3unty 2u2nu u3nuc u1nü unvol2 unvoll3 1unw 2unwä u2ny 2unz un3z2a unz2e 2uo u1o2b u3of u1op u1or u3or. uo2r3a uor3c u3oret uo2ris u3ors u1os. uote2 u1ox u1ö2d u1ök u1pa 3upd u1pe2 uper1 uperer4 up2fa upfe2 u1pfl u1p2fu u3p4i up4lu u3po 2upp up2pl u1pr upra3 u2p3ras up4t3a2 upten1 up4tene upt3erf upt3erg upt3erk upt3ers upt1o u1q 4ur. u1ra u2rab u3raba ura2be u2r1akt u2ral2t u2r1am ura4na u3rand uran6fän ur1ang uran4ge ur2anh uran5s ur1anz ur3ap u2r3ar ura4ri u3rasc ur1a4sp ura4str ur4a3te u2r1att ur1au 2u1rä ur1äl ur1ä2m ur1än ur3b2a 2urc urch1 urchas4 urcht3e ur3d2a ur3d2i ure1e ur1eff ur1eig u2rele ure2n ure4na u4ren4se u4rentn u2r1ep urer3h urer3k ur2ert u2rerw ur1eta ur2e3th ure3u 2urf ur2f3l ur2fro urf4spr urf3t ur6gense urg3inn urg1l ur2gla ur2gri uri2c ur1ide uri3en u2r1ind urin6sek urin8stin u2ri2so 2urli ur4matt ur2m1au urm2ei ur4mern urmet1 ur2mum ur2mun ur3n2e 2u1ro urob2l ur1off uroh2 uros4 urost2 2u1rö ur3p4 2urr ur3re ur2rh 3ursac ur2san ursau4 ur2s1er ur2s1of ur2spa ur2sun urt2 2urta ur4tai urt3ein ur2tro urts2c urts1t u3ru ur2z1a ur2zä ur2z1ec ur2zep ur2zi ur2z1op urzt4 ur2z1w 2us us3a2b usa2gi u4s1amb u4samt u2sang us2ann us3ark us5art usa4s us1ast us3ate u1sä u2säh u2s1äs u2sce u4schab u4schak u3sche. u4schef usch5eic u4sch3eu u3schi usch3mü u3schu usch5wer u3se. u3s2e3b u2s1ec use2ei u2s1ei u4sen4se u4sentl u3sep use4rec u2s1erl u2serp us1erw u2s1ese u2sex u2sid usi3er. usi5ers. u3sig usi4kat us1inn us3kl u4sko usmas2 usma5sse u1so us3oc us1oh u3sol u2sop us1orc us1ou u1sö u1sp u2spac us3part u2s1pas u3spec u3spek u2sph us1pic u2spo us2por u2spu usrich7 us2s3ad us2s3eb usse4g u4s3sel us2se4n us5sende us6seni us2sep us2ser us3ser. uss3erf usser4z us2sez u3s2sig uss3k us2sof us2sum u2stab u3stad u3stal us2ten us4ter ust3erl u3stis u2s1tor u2s3trä u4strit us2tum u2s1tur u1su u2sumd u2sumg u2sumz 3usus 2uß u2ß1u 2u1t 4ut. u3ta. u3taf u2t1alt ut1a2m ut2ans u2t1ap u2t1ar u2taut ut1äh u2tär ut3c u3te. u4t1e2d ut1ei. ut1eie ut1ein ut1ela ute2n1 uten2a u2tent ute4ral ute5r4er ute6ring uter3k ute4ros u3t2es ut2et u2t2ev u2t1ex utfi2 ut3hal ut3hei ut1hel u2t1hi u2t1ho u2thu u2t1id u4tigel uti2vi utli4n utmas2 utma5sse u3to. uto3c u5to3m uto1p uto3pa u2tops utor2a u2tord uto2re uto4rin 4utou u2töl 4utr ut3rea u2trou ut3rü utsau2 ut2säu ut4schl ut4schm ut4scho ut4schö ut3ser ut3s2k ut1s2p ut3sta ut3sto ut3tan ut3t4l utt1s2 utu2b u2tum utu4n u2t1une utu4re utu3ro utu5ru u4tz utze2 ut2zeh utz3eng utz2er ut2zet ut2z1in ut2zis ut2zö ut2z1w 2u1u4 uum1 uum3a2 uume2 uungsma5 uungsmas8 u1ü4 u1v4 u2ve. uve3rä u1w 2u1x ux2e ux2o ux3oe uxt4 u1y u2yo 2u1z uze2 u2z1ec u2z1ene uz2er uzo2f uz3ot uz1we uz3z2 1üb üb1ä 2übc 2übd übe2 übe3le übe4na übe3ne über1 überas4 ü4bet üb3l üb5r 2üc ü1che üch3l üch4s1c ücht4e ücke4n ück1er ück3eri ücker6ke ü4d3a4 üde2l üden2g ü3d2ens üd3o4 üdö4 üd3r üd3s2 üd3t4 üdu2 üdwe4 üe2 üeb3 ü1ei ü4f1a ü2f1ä ü2f1ei ü2fent üfer2 ü2f1erg üf2fl ü2f1i üf3l ü2fo üf3ten ü2fum ü1g üg2e üge2l1a2 üge2lä üge4lec üge6lei6s üge2lo ügen3s ü2g3l ü2gn üg3s üh3a2 ü1he ü2h1ei ü2h3e4m ü3hem. ü2h1eng ü2h1ent ü2h1erf ü2h1er2k ü2h1er2z ü2hex üh1i4 üh1lä üh2lel ühl2er üh2lö ühl4sk ühl4sta ühl4sti üh3mo üh3ne üh1o2 üh3r2e ühr3ei. ühre2n1 üh1ro ühr3ta ühs2 üh3sp üh3stu üh3t üht2a üht4r ü1hu üh1w ü1k2 ül1a ül2c ü3l2e ü4l3ef üle2r3a2 ül2la4 üll1ad üll1au ül2lei üll2er ül4leu ül2lic ül2lid ül2li2n ül2lo ül2lö ülls2 ü2lö ü1lu ü2ma ü2ment üme2ra ü2m1id ü2m1in ü2m1u 2ün ü4n3a ün2da ün2dr ü2n1erd ünf1 ünf3li ün2g3l üngs2 ünster3 ün2za ün2z1i ünzu2 ün2zun ün2zw ü1pe üpf3l ü1pi üp2pl 2ür ür1a ü2r1ei ü2r1e2l ür2f1er ür2fl ür2fr ür4g3en4g ürge4ra ürk2e ü3r2o3 ürom2 üror2 ür4ster ürte2l1 ürt2h ür2z1in ür2zö ür2z1w üs2a ü2schl ü3s2e üse1e2 üse3l2 üse4n üse3r4 ü1sp üs4s3a üs2s1c üss2e ü4s3sel üs4s3o üs4st üs2su üs4t ü2st3a ü4stei üste2n ü2str ü1su ü1ß 2üt ü1ta ü2t1al ü1te üte3m üte4n üten3s ütent4 üten3z2 üte2ra üte2r1e üterich6 üter3n ü2t1h ü1ti üt3r üt2se üt2s1t ütte4n üt2tr ü1tu üt3zen üt2zw ü1v ü1z 3va. 2v1ab vab4r va1c va1f4 va3g vag2a va4gh va2la 2valu v2an. 2vanb 2vang v2ans 2varb v1arm vas2 2v1ass va2s3to v4at va2t1a4 va4tag va2tei va4t3eng vates2 va2t3h va4tid vati3k2 va4tim va4t1in vati8ons. va4tord va4torg va2t3r vat3s2 va2t1u vat3z 2v1au vä1 2v1b 2v1c 2v1d2 1ve2 ve3an ve3ar veau3 ve3b4 ve3c ve3d ve3fa ve3g ve3h 2veig v2eil 2vein veit2 veits1 ve3la 2velan vel2ar ve4l1au v1ele ve3lei ve3l2i ve3lo vel2o1p ve3ma ve3me 2v1emp 2ve3mu ve3nal ve4nas ven2c ve3ne ve3ni ve4nin ve3nö ven5st ven4t3ag vent4sk ve3nü 2veo ve3of ve4pi ver1 ver3a ve3rad 2veral ve3rand ve3r4ane vera4s ver6bart ver3b2l ver3d2 vere2 verf4 ver3g4 vergas6 verga7sse ve3ri ve4rin ver3k vermas8sen vern2 ver4sep ver3sta vert4 ver5te ver3u4 ve3rus ve3s 2vesc 2vese ve4sh ve4s1p ves4t ve3ta vete1 vete3r ve3ti ve3tr ve3t2s 2veü ve3v ve3w 2v1f4 2v1g 2v1h vi1an vi3ar vi4a3t vi2ä vi3de 3vie vie2h1a vi2el viela2 viele2 vi2er vie4rec vie2w1 vig2 2vii v2il vi2l1a vi2lä vi4l1e2h vi2lei viler4 vi4lers vi2l1in vi2ma2 vi4na vin3d ving3 vings2 v1ins vi3sa vise4 vi3s2i vi3s2o vi2sp vis2u viv2 viz2 vize5 2v1k 2v1l4 v3le v2lie 2v1m vm2e 2v1n2 1vo 2v1ob vo2be vob4l voge2l1 vo2gu vol2a vol4la voll3ar voll7auf. vollen6 voll5end voller6t 2v1op vo2r1 vo4r3a voran8schl vor3g vo3ri vo4rie vo5rig vorm2 vormen4 vor3o vorö4 vort4 vot2a voy1 2v1p vr2 v1ra v2ree 3v2ri 2v1s2 v3sz 2v1t vue3 vu2enu vu2et 2vumf 2vumg 2vumk v1ü 2v1v 2v1w 2v1z w2a 1waa wab2bl wa3che wach8stub wach4t4r 1wack waffe2 waffel3 1wag wa5ge wage4n wa2g3n wa3go 1wah wahl5ent wah4ler wah2l1i 1wal wa2lar 2walb wal4d3a wal4din wal2dr wa2les wa3li wal4li4n wal2m1 wals2 walt1a wal6tere wal6terl wal2to wal4tur wa3na wan2d1a2 wan2dr w3anf 2wang wan3g2e wang4s 1wann wan6z5en6d wan4zer wa2p 1war2e ware1i wa5ren 1warn war4ni wart4e war2th war2za 1was wa3sa was2c wa4scha wa3sche wa3schi wa4sch3l wa4schw wa3sh wass4e2 wa3su w2ä 1wäh 1wäl wäm3 2wäng 1wäs3 wä5sc wä4ss wäss4e 2w3äu3 2w1b2 wbu2 2w1c 2w1d we2a we2b1a webe1i we2b3l we2bo we2b3r we2e2 weed3 we2fl 1weg we2g1a we4g1ei weg5ersc we4g3l we4gn we2g1o2 we4g3r weg1s weg3s2a 1weh weh4r3er4 wei2bl weib4r 2weie weifel6d wei4fre wei2gr wei3k4 1weil weinsau6 wei3sc wei2t1r weit1s wei5ze welle4 wel6schl wel6schr wel2t1 welt3a2 welte4 wel6t5en6d wel4th welt3i welt3r wem2ma2 wen3a2 wen2gl we3n2i wen2ka wen4kla wen4k3ri we2r3a2 wer5be werbe3i wer2bl werb2s 1werbu wer3d2 5werdens 1werdu werer2 wer2fl 2werg wer2ga wer6gels wer2g3o wer2gr werin2 we3rins we2ri4o 1werk. wer4k1a 1werke wer2ki wer2k3l wer2kn wer2k3o wer4k3re wer2ku we2rö wer4sta wer2ta wer2tä wert3ei wer6teig wer6t5erm wer2th wer4tin wer2t1o2 wer4tre wer4t3ri wer4tum 1we3s2e wesen4s3 we2sp wes4t we4st1a we4st3ei we5sten. we6sten6d we5stens we4steu we4sti we2st1o4 we2st3r we4stu 1wet 2wets wett3s 2w1ey 2w1f 2w1g whi2 w3ho w2i wicht4s 1wid wi2e 2wieb 1wied wie3l2 wie3n2e wie4st wik2 1wild wim2ma wim6ment wim4m3u win2a win4d3ec win3del win6d5erz 1win2d5r 4wing win2g3r win2kl win8n7er8sc win2no win4num win3s wint2 1wi4r wire3 wisch3l wi3s2e wi2sp 1wiss wiss4z wi3st wi3th 1witz. 1witzl wiz2 2w1k 2w1l 2w1m 2wn wns2a wn3sh 1wo1c wo2cha woch2e4 1woh woh4lei woh4na 1wolf wolf2s wol4la wol2lä wol4ler wor3a wor3d wo4r3i worn2 wort1a wor4tel wor6terh wor2t3r worts2 wo4r3u wor3ü wot2 1wöc wöl2fo wört2h 2w1p w2r w3re w3ro 2w1s ws2e w3s2h w3s2k w4s1u 2w1t wti2 w2u 1wuc wuch4sc wuch4st w3u2f wuls2 wul3se wund4e wung3r wung5s2 wun2s wunsch5l 4wur. wur2fa wur2f1o wur2fr wurs4 1wurst wus4 1wu2t1 1wüh 1würf 1würst wüs4 2w1w 2w1z x1a 1xa. 2xa2b 1x2ac 1x2ad 1xae xa1fl 1x2a3g2 2xal xal2l xa2m xand4 1xane 1xani x2an3t2 x2anz xa2r 1x2as xau3 xaus2 xa2z 2x1b4 x1ce x1ch x1cl 4x1d xda2 1xe 3xe. 2x1e4g 2xek xe2l 3xel. x1ele xe3lei x1em 3x2em. 2xemp x2ems x2en 3xen. xen3s2 3x2er. x2ere 2x1erl xer2la x2ern xers2 x2ers. 3xes 2x1eu 2x1ex 2x1f 2x1g 2x1h xi1c xich2 2xid xi2dan xide2 xi2dei xi2d3em x1i2do 3x2ie xie3l xi3g xi2ler xili3a xi2lo xi2l1u xim2 xin3s2 x2is xi2sa xi2s1e xi2sp xis5s2 xi3s2tä xi2su 3xit x1i4tu xive4 x1j 4x1k2 xkal2 4x2l2 x3lä x3le 2x1m 2x1n 2xod 2xoe4 x1o2r xos2 2x1ö2 4x1p xpor6ter xpor4t3r x1q x1r 2x3s2 4x1t xt1a x3ta. xta2b3 x3tan xt2ant x3tas x2t1ä x3tät xtblock5 x2t1e2d xt1ein x2t1el x2tent x2t1er2f x2t1ev xtfi2 x2t1h x2t1id xti2la x2til2l x2t1o4 xtra3b4 x2t3ran x2trau xt3rec xt3s2 x2t1um x2t1un 1xu xu1a xu2n 2xunt xu2s3 xusa2 xuss2 2xv 2x1w 3xy. x1z 2y1ab 1ya2c y2ach ya1h y1al. yan2g y1ank ya1q ya3ra y1ät y1b ybe2r y1c y2chi y3chis ych3n y1d yd4r ydri2 ydrid3 ydro3 y1e y2ec ye2d y2ef y2el2 yen4n yera2 y2ere yer2n1 y2e2s y4es. ye3s2p ye4st ye2th y1f2 y1g ygi2 ygie3 yg2l y1h y3ho yhr2 2y1i4 y1j y1k2 yke3n yk3s yl1a2 yl2a3g y1l2ak yla4l y2lam yl3ane y1lant yl4ante yl4anti yl2as ylau2 yl3c yle4 y2le. yl1em y2l1es y2l1et yli4n yl4lo2s yl2lö2 ylo1i2 yloid3 yloni1 yl2op yl1ora ym2a ym4an ym4ar ym4as ym4e ymp2 ym2pha ympi1e ynä4r yn2eu ynk2 y2n1o2 yn2oz yn3t2 yob2 y2od yoga3 yom2 yon2a y1ont y1o2pe y2ost y1ou 2y1p ypa2b3 ypa2n yp2e2 ype4r3o2 y2pf y2p1i2d y2p1in y2plo y3po3 y4p3s yp3th ypu2 y2p1um y1q y1r y3r2e y3ri yri1e yri3en y3ro yro4ste yrr2 2y1s ys2an ysch4 ys2e1 ysein2 ys1er y4s3l ysme3 ys2o ys2pi yst2e yst2h ys2tra y4stro y3s2ty ysu2 y3s2z y1t y2te. y2tes yt2h ythe1 y3to y4t3r yu2r yur2e3 y1v y1w y1y y1z2 yzer2i 2z1a2b zab3l 2z1ach za1cha za1chä zach2s 2z1a2d 2z1af za3gr 3z2ah zah3len zah4ner4 z1ak 4z3akk 2z1al 4z3ald 3zali 2z1a2m z1a2n 4z3a4n4a 2z3anb za3ne 2z3anf 2z3angs 3z2ank zan2ka z3anl 2z3anr zanti1 za4pf z1aq z1ar 3zar. 2zarb za3re 2zarm 3z2aro z2arr zar2t1r 2z1as za3st4 2z1aß z3at zat2e za2to 3zaub 2z1au2f 2z3aug 3zaun z3aur 2z1aut 2z1äc z2äh 3zähn 2z1äm z1än z1äp z1är 2z1äus 2zäuß 4z3b4 zber2e zbü1b zbübe3 2z3c 2z3d2 zdan2 zdä1 3ze. 2zea zeau3 zeaus4 2z1e2ben 2z1echo ze1e2 zeeu3 2z1eff z1e2ga zehe4 zehen1 zeh2l ze3ho zei1f4 zeik4 zeil2 zei3la zeile4 2z1ein ze3in. zeinbus6 z2e1ind zei4ne 4z3einh ze3inse ze2i3s2 3zeit zei2t1a zei4t3er zei2to zei2tr zeit3ri zek4 ze2l1a zela2d zel3a2n zelau2 ze2l1ä zel3d4 4ze2lek 4zelem ze2len ze2l1er ze2l1in 2z1e2lit zel3la zel4lab zel4l3ac zel4lar zel2lä zel4leh zel6lein zel6ler6t zeller6z zelli4n zel4lum zelm4 ze2l1o zels2 zel3sa zel3sz zel2ti zelu2 zembe2 2z1emp 5zen. ze4n1ac ze4nas zen3au ze2nä ze3n2em zenen1 4zenge. z4engl 2zengp 2zeni ze2nid zenk2 zen3n ze2n3o ze4not 4zen4sem zen4ser zens2p z2entn z1ents 2zentw 2zentz ze2nu zen4z3er zen2zw zeo4r 3z2er. zer3a ze1ral ze2rat z2ere ze5rek zer2em z2erfe z3erfül z2erga 2z1ergä 4z3ergeb z4erges z4ergl zer4gon 4zergu 3z2erhe 2z3erhö ze3ri zerin6te z2erko 3zerl. zer4lau zer4le. 4zerleb zer4len 2zerlö 3z2ern zer4nan zer4n3e4b zer4nei 2z1erö zer2öf 2z1erq 4z3erreg z2ers. 2z1er4sa zerta2 zer4t3ag zert4an zer4tau zer6tere zer6terl zer4tin zer2to 6z5ertrag zer6trau z1erwe 4zerwei z1erz zer2ze ze2s 3z2es. ze3sc zes1e zes3er ze4s3po zes2sa zessen4 zes6s5end zes4ser4 zes2sp ze3sta zes2th ze3str ze2ß1 z2et. 2zeta 2ze2th ze2tr 2zetts zeu4gem zeu2g3r 2z1eul ze1ur 2z1e2x1 2z3f4 zfäs3 zfeue2 2z3g4 zgang5 zger2a zger2s1 2z1h2 z2hen zhir3 3zi. zial5l zi3alo zi2ar zich2o zi2dei zid3r zie4ler zie2l1i zi1erh zi1es zi3ess 3zig 3z2il zil2e z2imm 2zimp zim2t3 2z1ind zin2e zin3ei 2z1inf z1inh zi4n3in zin1it 2z1inj zin4na zin4o zin2sa zin4ser 4zinsuf zi2o3 zirk2 zirk6s z1iso zi2sp zisse4 zis4t zistras6 zi3s2z zite4 zithe2 zi2t1o2 zit2u ziv2 2z1j 4z1k4 2z1l2 z3ly 2z3m2 zmas6sen zme2e 2z3n2 z3oas 2z1ob 2z1of zo2gl zog4s 2z1oh zolla2 zol3len zoller4 zol2li2 zonal2 zon3au zon5s4 zon4t3er zo2o 2z1ope 2z1o2r zo3re 3z2orn zor4ne 2z1osz 2z1ou 2z1o2z 2zö2f 2z1ök z1öl 2zöl. 3z2öll 2zöls 2zön 2z3p4 2z1q 2z3r2 2z1s2 z3sa zsau2 z3sh z3sk zspor2 4zst z3str z3sz 2z1t zta2n zt3ane z2t1au ztein1 zt3eins zt2el zte3ma z2t1ent z2t1erz z3tes zte3str zt2et zt1he z3them z3t2her zt1hi zt3ho z3thr z3thy zt3rec zt3ric zt3s zu3a zu1ä2 zub4 zubus2 3zuc zuch2e zucht3r zud4 zudi4 zu2el zu3e2r1 zue2t zu3f4 zug2em zu4gent zug2i zu3gl zu4gla zu4glö zu2go zug4ste 2z1uhr zu3hu zu1i2 zu3k zul2 2z1um. zum2a 2z1umb zumen2 2zumf 2zumg zum2i 2zumk 2zuml 2zumr 2z1ums zum2u 2zunab zun2e 2z1unem 4zunget 2zungl z1uni 2zu2nio 2zuniv 2zunr 2z1uns 2zunt zuo2 zup2fi zu3pl zu3r2a 2z1urk 2z1url 2z1urn 2z1urs 2z1urt zu3s2 zusch4 zu3t2 zut4r zut4u zut3z zuz2 2zü4b 3züc zür1c 2z1v zw2 z1wac 2zwag 4zwah 4zwap z1war 2zwa2s 2zwäs 2z1wed 2zweg 2zweh z2weig 2zweil zweiter6 2z1wel 2z1wen 2z1wer 2z1wes z2wic zwi4e 3zwing 2zwirt z2wisc 2zwiss z2wit 2z1wo z1wör z1wur 2z1wü zy1an. zy2le 2z1z z3z2a zza3b4 z4z3al zz4at zze3s z2z1id z2z1in1 zz2ö zzug4s",
+ ["characters"]="abcdefghijklmnopqrstuvwxyzßàáâäçèéêëíïñóôöü",
+ ["data"]=".ab1a .ab3l .abo2 .ab3ol .ab1or .ab3s2 .ab3u .ade3n .aft2 .ag2a .ago1 .ag4r .ag2u .ai2s .akt2a .al2e .ale3u2 .al3lei .al3len .al3lo3 .al3se .al2tei .al2tel .al4terp .alter4s3 .al2tra .al2tu .ampe4 .amt2s1 .ana1c .an4a3t .an3d2 .anden4k .and4ri .an1e .ang2 .an3gli .an3go .ang4s4 .angst3 .ani2s .an3k4 .an3s2 .an4si. .an2tar .an3z4 .ap3p4le. .ari1 .ar3k2a .ar2m3ac .ar4mun .ar2sc .ar4t3ei .arter2 .ar4t3erh .ar2t1r .arz2 .as2b .as2ko .as4sest .as4t .as2zen .ata1 .at2h .au3d .au4f3 .au6fac .aufs4 .au2s1 .aussen6du .au4s3tes .auß2 .ax2 .är4schl .ät2h .ät2s .äu3 .bahn3 .baus4 .be3erb .beige2 .bei4ge. .beige4s .bel2a .be3r2a .ber2e .ber2g3a .berga4s .ber4g3e4b .ber4gin .ber2g3r .ber4tr .be4ster .bi4os .bi2t .bit1a .boge2 .bo4s3k .brut3s .bu4cher .bu2ser .bus3se .bussy4 .bü3b .bübe3 .ce2ra .ch2 .champi4o .char4mes .chi3er .ch6lor .dab4 .da4ch3en .da2r1 .dar3in .dar2m1 .da2te. .da2tes .de2al .de1i .dein2 .de3lo .de3na .den2ka .den2kl .den2ko .de1o2 .de3r2en .derma3 .dermas4 .des4pe .des3s .diä2r .di3el .dien2 .diensta6d .do3b .do4mo .do3pe .dor2f1 .do2tr .dys1 .ebe2r1 .eg2o .eh2e .ehe1i .ehe5n .ei3e4 .ei3f2e .ei4fr .ei3k .ei4na .ein3d .ei2ne2 .ein3eb .ei3n4erl .eins4 .ein3sp .eise4 .ei2sp .eis3s2 .ei4s3t .ei2tr .eke2 .ek3li .el2bi .el2bl .elb3s .el2fei .el2fl .em3m2 .en1 .en4da .en2d3er2 .en2d3r .en4dü .en3ga .en2gl .enk2 .enn2 .enns3 .en4ta .en4t3ei .en5thalp .en4t3io .en2t3r .en3trop .ents2 .epi1 .epi3c .ep3p .er2bei .er6brecht .er2bu .er2dan .erden4k .er2d3er .er1e .ere3c .er2em .erf4 .er1i .ers4 .er4stein .erster4 .er4sterb .er6stritt. .er8stritten. .er2z3el .er2zen2 .es3p .es2st .es4t .esta2 .est4e .est3r .et2s .eu3 .eug4 .eur4 .ever3 .ext4 .fäs3se .fe3la3 .feri3 .fer2no .fi3d4 .fi2le. .fi2len .fi2s .flö4s5se. .flö6s5sen. .flö4sses .flu2g1 .fs2 .fu2sc .ga4me. .gan2ga .gas1 .ga4s3e .ga4sp .ga4sten .ga4su .ga2t .gd2 .gebe2a .geb2l .gel2b3r .gel2d1 .ge3lu .ge5nar .gen4aug .ge3n4e .ge3n2o .gente4 .ge3r2a .ger2e .ge3ro .ge3s4 .glan2 .glanz3 .gla2s3t .grif4fes .gs4t .gus2 .hal3le .halt4e .han2f .hau2t1 .he2 .he4bei .he3le .he4r3an .he3rat .her4b3ra .he3rer .he3ri .he4r3inn .hin3u .ho4c .hof1 .ho4fen .ho4met .hou2 .höch2 .ia2 .il3 .im2a .ima2ge .imm2 .im5mu .in1 .ind2 .in3gl .ink2 .in3n2e .in3sk .in3t2 .inu1 .io4d .ioni1 .ire3 .is2a .istri3 .it2h .iv2 .joni1 .ka2b3l .ka2i .ka5ka .kal2a .ka3le .ka3t2a .kat3i .ka4ti4o .ken4num .ker3s .ki2e .ko3b .kopf1 .kor2da .kraf2 .ks2 .kus2 .la3be .lan4de4mi .lat3s .le4ar .le2gas .leh4me .le3n2i .lich6ter6sc .li2f .li2ve. .lo2g3in .lo2sc .lo4sk .los3s4 .lo2tr .lo3ver .lö4ss .lös3se .lus4 .lu2ste .luster4 .lu2str .lut2h .ly2s1 .ma3d .mal4e .mani2e .ma2str .mat4c .matu3 .md2 .mel2a .me3ne .me3no .men4schl .men4schw .ment2 .mes4sp .mi2f .mik4 .mil2z1 .mi2t1 .mm2 .na3no .na3t .näs5c .nebe4n .ner2f .ne1ro .nich2 .nicht3e .ni2e .ni3k4l .no2c .no2s .nul2 .nus2 .ob1a .obe2 .ober3ei .ob3i2t .och3 .oe2 .of2e .ohr5s .oper4 .op3fe .or2a .ord4e .or3g .or3k2 .ort2 .orts3e .os3s .os4t .ost1a4 .oste2 .ost3end .osten4de .oste4re .ost5erwe .ost3i .ost3r .ot1a .ou2t .ozo4 .öl3l .pab4 .par2kl .part2h .pe2c .pe3le .pe3na .pe4ste .pf2 .pf4l .pf4r .ph2 .ph4t .poka2 .po4stei4 .po6steig .po2str .ps2 .rabe4 .ra3ch2e .ra3e2 .ra5me .ra4sp .ra4s3s .rau2m .rau4schl .re3ale .rebs2 .re3cha .re3insz .reis4e3i .rei4str .re3ke .re2stu .ri2as .richt4e .ro4a .ro3be .ro2e .ro2ha .rom4a .ro4t3r .ro3tu .rö2sc .rö4ss .rös3se .ruf3s .ruh2r1 .runder4 .ru3s4ses .rü3b .rücker4 .rü4ss .sa3br .sali1 .sali3e .sami1 .sa3sse .sas4sen. .sau1 .säs4 .sch4 .schaf6t7end .scho5s6se. .scho7s6ses. .se2ei .seein2 .se2ha .sein2 .sen3de .sen4f3 .sen3s .se3re .seri3e .se1ro .ser2u .se2t1 .sha4 .si4en .si1er .si3gn .sini3 .si2te .ski1e .sour2 .spani5er. .spä5s4 .spiege6lei .st2 .st4a .stau8becken. .st4e .ste2i .steiner6k .sto4re .st4r .stras4 .st4u .sui4te. .sy5st .tage4s5 .tal3l .tan2k3a .tank3l .ta3ra .tar3t2 .ta2t1h .ta2to .ta4tor .ta2t1u .te2e .te2f .tehe3 .teiler4s .tei6l5ersc .te3le .te3no .tens4 .te1ra .te4stei .te4stel .test3r .ti2a .ti2e .ti2me .ti4mes .ti3r .ti2s .tischen4 .ti6sch5end .tite4 .tode2 .to2der .to2n .to4nat .to3nes .ton1i .to4nin .tons2 .to4pl .to2pr .to2w .tra4s3 .ts2 .tse3 .ts4u .tu3ra .tu3ri .turm1 .tur2ma .ub2 .ufe2 .ufer3 .ul2b3 .um3 .ume2 .umo2 .un3a4 .un3d .une4 .un3g2 .uni2t .ur3a2d .ural4 .uran4fa .ur1c .ur1e .ur2e3t .ur2inf .urin2s .ur3o4m .ur1o2p .ur3s2 .ut2a .ut3r .ve5n2e .vol2 .vo4r .wah4l .wa2s .weg5s .weine2 .wei2ta .welter4e .wer4ker .wer4kr .wer2tr .wetterer6 .wi4e .wor2 .wort3en4 .wur2f1 .xe3 .ya4l .zel4la4 .zelle4 .zel4lei .zeug2i .zi2e .zie2l3u .zin2ka .zin2s3c .zin2st .zol2 .zuch2 .zug3l .zu2gra .zweigen4 .zwei6g5end a1ab aa1c a1a2ce aa2gr a1akt a2al aa2l1a aale3ne aa3lep a1an a3an. a1a2q 2a2ar aa2r3a aar3b aar3d aa3rea aa2rei aarf4 aar3g2 aar3k4 aart4 1aas aas3t aa2th aa2t3r aat4s3 2a3au a1ä2 2aba 3abad ab1alt a3b2am ab2ant ab1au ab2aut ab1ä ab2är ab2äu 2abbat 2abbin 1abd ab5dec 2abe. 2abec ab1eic abe3id ab1eil ab1ein 2ab2el abe2l1a abela2d abe2le 2aben. 1abent 2aber a2berd ab1er2k ab1er2r ab1er2z 4abes abe2s1e ab3esse ab1eß 2a3bet 2abew 1abf 1abg 3abga 1abh ab5hän 2abi 4abil ab1ins ab1ir ab1it abi4tur 1abk ab1l 1a2bla a3blat 1a2blä a2b3led 3ab3lei a3blem 2ablet ab3li a2blin ab4lit 2ablo 1a2blö a2blu abma3s 1abn 2abo 3a2bo. ab2of 3a2bon 4abot 2abö ab3r a4brä a2bre ab4ros 2ab4rö 1absc 1abse 1ab3sp abs4t2 3absta 1abstu 3abtei 3abtr 2abu abu3g a2bum ab1ur 2abü 1abw 2a3by 3abz 2ac. 2a3ca 1ac1c 2acci a1cem a1cen a1cet a4ch. ach1a a3chari ach3as ach3au 2achb 2a1che a2ch1e2c ach1ei ach2ei. a2chep a2cherf a2ch3erh a2ch3erl a2cherö a2ch3erw 2achf 2a1chi a2chim ach3l 2ach3m ach3n a1cho a3cho. a2cho2r ach3öf 4ach3r a4chs 2achsc achs2el ach3s2i achs2or ach3su a4cht ach2tak ach4terh ach4tersp ach4t3erw ach2t1o acht3rat ach4traum ach6träume. ach8träumen. ach4trit acht4s3al ach2tum a1chu ach1u4f ach3ü 2achv 4ach3w a1ci 2acke. ack3erz ackmu4 ackmus3 ack2sp acksta2 2a1cl a3co acon4n 2acu 2ad. 2ada. 4adab ad2abr ad2ag adai4 ad1an 3adap 4a3d2a2r3 2adas 2adat a2d1au a3dau. 1a2dä1 ad1c 1add 2ade. ade2al a3dec a3dee adefi2 2adeg a3dell 2aden a3den1a ade4nat adeo4 ade1ra a2d1erk 4ades ade3s4p ades2s 2adf 2adh 2adi adi3en adi3er. adie4sc 3adj 2adli 4admu ad2ob ado2n ado4na a2dop 2adp 2adq a2dre 2ad3rec ad3rei ad3run 2ads2 ad3sz ad2t1 adte2 ad4tor ad4tro 1adv 2ady 2a1e1 ae2b a2ec ae2d aed4r ae2i a2ek a2el a3el. a4ela a3els ae2m ae2n1 ae2o3 aeop2 ae2p 3a2er2o a2es aes4a ae4sc ae4ta a2e3u a2ew ae2x a2f 2a3fa a4f1ab a4f1a2n a4fap a4f1au 2a3fä a4f1än 2a3fe a4f1ec a4fentl a4f1ep a4fex a3fé aff4a af2f3l aff4th 2a3fi afi4kanz afi2kat afi2t 2af3l af1la a3f4lu 2a3fo a4f3oc a4ford a4f1ort 2afra af3rau af3rä af3re 2afro af3rö af4rü af3s2a af3sh af2si af2sp afs4t af2t1a af3tat af2tei af2te2l aft2erk af2t1o af2tö aft3r af2tra aft5rei aft4stä af2tur a3fu a4f3ur 2a3fü 2ag. 2aga a3ga. ag1a2b ag1a2d ag1am ag1ar a2g1au ag2del ag2dr ag2du 4age. age2l3ei age2ler 4a3gen. age2neb a2gentu 2ages age4sam age3sc age4s3in age4so ages3p ages4sen age4s3ti 3aggr a2g1id a2gim ag1inn 2a2gl ag4lan ag4las ag3le a4glö 2agm ag2n2 ag4nat a4gnä ag4ne ag5neh ag4nu ago3b ag1op agori2 ag3rat a2g3re a2gri ag3rie ag3rin 2ags ag3s2ah ag4sam ag3schi ag3s2eid ag5s4porta agst2 ags4tan ag2str 2agt ag2th 2agu a2gund 2ah. 2a1ha ah2an ah4at a1hä 2a1he ahe1in a2h1er2h ahe3u a1h2i ahin3 ah2l3a2 ah2l1ä ah2l1ei ah2lel ahle4na ah4l3erd ah4l3erh ahl1o2 ah2lö ahl3sz ahme1i ah3mu ah4n3a ah2nä ah3nee ah2nef ahn3el ah4nerd ahner4e ah2nerl ah4ner4le ahner2n ah4nin ah2no ahn3t 1a2hor ah1os ah3ös ahr1a ah3r2e ahre4s5 ah3ri ahrta2 ahr2ti ahr2tri ahr2tro ahr2tun ah2ta ah2te2l ah2t1ex ah2t3r aht3s4 2a1hu ah3w a1hy 2ai. ai1a2 a1ia. aia4p 2aib ai2bl aid4s aids3t ai1e2 ai3e4n1 aif2 ai3fr ai3g2 aig4r a3ik. a4i3ke ai2lar ail3d4 ai2lei ail3g ai2lo 2ain ain2a a1ind ai3n4e ai4neb ain3s 3airb ai2sa a3isch. ai3schw ai3s2e ais3sen ais5st ai2sti a2it ait4r a3iv. a3ivl a3ivs a2jat ajekt4o a2k 2ak. a3ka 2aka. 2aka3b akab4r a4kad 2akal 2akam 2akan 2akar ak4at akat1a aka2tak 1a4kaz 2a3kä 2akb 2akc 2akd 2a3ke a4kef a4k1em a4keo ak2et a4keu 2a3ki ak1ins 1akku 2ak3l a3k4la ak5lad ak5lan ak4li 3aklö ak4lu ak5lun a3kna ak3no 2a3ko 2a3kr ak3res ak4ri 3akro3 a4k3rü 2aks ak3sh ak2t1a2b ak3tan 2aktb ak2tel ak3ten ak3t2er 2aktg 2aktik 2aktis 2aktm ak2to4b ak2tö ak2t3r ak3t4ri 2aktsi 2aktsp 2aktst 2aktun 2aktw a3ku 2akun a4kup 2akur 2a3kü 1akz 3akze a1la 2ala. 4alabo a2l3abt al1ac al1af 2alai al1akr al1am al1ana 2aland a2l1ang al1anz al1app a3lar. al3arc a3lare al2arm 2al1arr a2lart ala2s a3lat. alat3s alat5t alat3z al1au al3aug a1lä a2l1äm al1än al1är a3läs al1äu 3albat al2bär al2berh al2b3er2w al2b1l al2boh al2bon alb3ru alb5st alb6st. al4dan al2dä al2d3erl al2d3ern alde2s ald3inn ald1r al2drä 2ale 4a3le. ale4ar a2l1e2b al1eck a4l1ef a2l1ei a3l2eic a4lein a2l1el 5a2lema a2l1e2mi al1emp 4a3len. alende2 al3endr al3ends a2leng al2enn al1epo 4a3ler. a2l1erb aler2e a2l1erf a2l1er2h aler2kl a2l3erl al1erm aler4mi a2l1er4r aler3s a2l1ert aler3w 3a2l3erwä 4ales a2l1e4sk a2less a4leth a2l1eu alf4r 1alge. 3algi al2gli al3glo 1algo 3algor 2ali al2imb al1imm ali2nal al1ind alin2ge a2l1in2q al1ins alken1 al2klö al2kne al2kof 1alkoh alk3s2 al2lab al3la3d alla4me al2lan al2l1a2r al4later al2lä al3läu al4lec 3allee alle2gi al4leh al3lend aller2z al5les alle3se al2leu al2lid alli3er. alli5ers. al2lob al2lo2c al2lop al2lo2s al2lö2 all3öse al4lt al2luf allu4s al2lü4s al2map al4m3ast almo4de. 2alo 4alo. a2l1ob 3a2loe a2l1of 4alog alo2ga alo2gr alo3is. al1ont alori2 al1ort 4alos a2l1ö al2ös 3alp. 3alpe. 1alph al2pho al3sak al2schm al4sh al3skl als2p al4ss als4te al2sum al2t1ak alt3alg al2tan al2tat al2tau 1altä al4tb al4td alt3eis alt3elt al2temu alter3f alt3er4pr al2teu al2tid al2tin alt1op al2tö alt3rad al2t3rat al2tre al2t3ri al4t3ro a1lu alu3b4 al2uf alu3g al1u2k a2lum al1umb a2l1ur a3lus 2aly al2zar al2zau al3zen alz2erk al2zw a2m 2am. a3m2a ama2ba ama3d2 ama3g 1amal a4malg 2am4an ama2sta 1a4maz 2a3mä a3me 4ame. 2amel 2am2e4n1 amen4spr amen2t3r a5mer. ame3r2a amera3u a4m1erf 1a4meri ame5r2u 2ames a4mesh 2amet a3mé 2amf a3mi ami2k 2amir 2amit 2amk 2aml 2amm. am2ma2c 2am2mal amma2n am2mar am2mas amma2sc am2maß am2ma2te am2mä ammen4ge. ammes3 am2mid ammi2e am2min am2mit 4amml am4mo2d am2m1ö ammu2 amm3unt am4mus am4mü amni1 a3mo 2ampe. 2ampen amp2f1a2 2am2ple 2ampo am3pr am5pre 2ams 4amsc am2schl 3amse ams1en am3sh 1amt. am2t1a2 am4tau am2t1ä amt3eig am2tel amter4 am2terh am2t3ern am2t1ex am2tis am2tit am2to am4tou am2tö am2t3r am4tre am4ts am2t1u 2am4tv 2a3mu 3a4mul a3mü a3my 2ana. 2anab ana3c an2ad anadi1 an2ag 2a3nak an1alg ana2lin an2a5ma 2anan an4and 2anas a5nat. ana4th a5n4atm a2nato ana2tr a5nats an3aug 1a2n1äs 1anb 2anbas 2anbö 2anbu an3ch 2and. 3an3d2ac and3ei an2deng anden4ga an2d3ent ander2e and3erob an3de2s an2d1ex and2sas and2seh and2so and4spar and4spas and4s3paß and2su 4andu2 an2d1ur 2ane 4ane. an3ec a3nee an2ei. an3eif 3aneig a4neis 3a2n1e4k ane4l an1e2mi a2nemo 4anen 4aner. aner2fa an2erh a2nerke 4anern a4nerz. an2erze an1eth 3anex 1anf 2anf. 2anfab 3anfä an3fe 2anfi anf3le 2anfors 2anfs an3f2u 2anfun 4ang. 1anga 2anga. an2g1ar 2angas 2angd 2ange. 1angeb an2g1ei an3gen an2g3erf an2g3er2h an2g3er2w an2g3erz 2anges. 2angf 2angh 2angie ang1l an2gla ang3n ang5na ang1r ang3ra an3gri 2angs. ang4sto angt2 1an3h 2anhau 2a3ni an2i3d 4anie aniel2l ani3els ani3ers. anig2 ani2ka ani3ke 3a4nim a4nind ani2o an3i4on a4n3iso anis4t 2anj 2ank. an2kag an2k1ak an2kan an2kei 2anken ank3erfa an3kes 2anki an2kid an2klö an2klu ank3no an2k3opf an2kor ank1r ank3ra an2kras ank3rä an2kro 2anks ank3se 2ankt4 3ankü 1anl 2anlad 3anlag anma3s2 2anmo 1anmu 2ann. an3na 1annah an4nar an3ne an4nef an4nei an4nene ann2er 2anns ann4sp 2annt 2ano. 1an1od 2anof 2anog 2a3nol ano2la 1a2nom a3nom. 2anoo an1op a2n1or ano2ri 2a3nos 2a1nö 2anpu 1anr 2anrö an4same an3sar 1an3s2ä an4sb 1ansc an4sf an4sg an3skr 1anspr 1anst ans4te an3s2z 2ant. ant3ar anta4re an3t2ä 1antá 3antei an3tha 1anthr 2antie 3antise anton2 3antr 1antw 2anu anu3r anus3s a1nü 1anw 2anwi an2z1ä 2anzb 2anzd 1anzei anz3elf anze2n 2anzes 2anzg 2anzh anzi2d an2z1i4n 2anzk 2anzm 2anzr 2anzs 2anzt 1anzü 3anzün 2anzv 2anzw an2zwä an2zwi 2anzy 2ao ao3i2 a1op ao2pe aopf4 a1or a1os a3ot. ao3t2s 2a1ö aö4fe 2ap. ap2a apa3b ap4an a2pe. a2pé ap2fa 1apfel 2apfes a3pfl a2pht 2api 2apl ap4la ap3le ap3li ap2n a2pot 1appro 2apr ap4ster ap3t2 ap5tag 2a3pu 2ar. a1ra a3ra. ar2ab 2ar3abb ar3abf ar3abr ar3abt 2arac ara3d2 ar3adr 2arak 2a2r3al a3rale a3ra3li a3ralo a2r1ang a2r1anz 2arap a4r3app 2a2rar ar2asy 4arat a2r1au a1rä ar1äs 1arb 2arb. 2arba ar2bak ar2b1at ar2bau 2arbef ar2b3ein 2arbek 2arben 2arber 4arbi 2ar2bl 2arbo 2arb1r 2arbs2 arb3se arb3sk arb3so 2arb3t2 2arbu 1ar1c 2archl 2ar3chr ar2dau arde4i ar2dop ar2d3r a2rea are3aler a2reb aree2 ar1eff a2reh ar1ehr 2arei a3rei. ar1eid a3reie a3reih areim3 a2rein arein4b arein2s arein2t a2rele 4arem are2mi 4aren. aren4sem a2rentn are3r2a arerau5 arer2e a2rerei a2rerg a2rer3h a2reri a2rerk a2rerl a2rert ar2erw 2ares are3sc ar2et are3u a2rev arf1r arf3ra arf2sp 4arg. ar3gan ar2gl ar4gn 2arg4o ar3g4r 2arh 2ari ar2ia ari3e2n ari3erd ari3erg ar1int a3r4io ar2ir ar4is ari2su a3riu ar2kal ar2k1ar ark3aue arker2 ar2kil 2ark3l ar2kle ar2klo ark4lö ar2kn ar2koa ar2kor ark3s2a ark2se ark3she ark4tre arku2 ar2les ar3mad ar3m2ä ar2m1eg ar2m1ei arm2or ar2mum 4armü 2arn ar2nan arn2el ar3ni a1ro arob2 4aroc ar1o2d ar1of aro2i 2a3rol a2r1op a2ror 1a2rou aro2w 2a2r1ö arö4l 2arp arr1ac ar2r3ad ar2r1as ar4rek arre4n1 2arri ar2r3or arseri2 ar3s2h ar3s2i ars3k ar3sse ar2tau 2artb art2e 2ar3tei artel4li4 ar3tem arter2e 2artex 2arth art2i 2arto art3r ar4tram art4res ar2tri art3ske art2sp 2artuc 2artü 2arty 2aru a2r1uh ar1um a3rumm a2rü 2arv arwa2 2a3r2y 2arza ar2zau ar2zä 2arze 2arzi ar2zö 1arzt arz2t3r 2arzu ar2z3w 2asa a4s3af a3s2al asal2t1 as1am as3art asa2s2 asa3sse as3at asau4f a4s3aug asau2s a2sä as3ät a2sca a4schec a4schef a4scherg as4chi a2schm asch3ru 2ascht a3schu a4schum 2asd 2a3se a4seb a4sec a4s1ef as1eie as1emi a5sen. ase4na ase4n3o asens2 a2sen2se as4eo as2ep as2er ase2re a4s3erke as4es ase4ta a4s1ev a4sex 2asf as3ha as4hf as2hi as3hir as4ie 2asig a2s3i2k 2asim asin2g as1inn 2asis 2asiu as3ka aska2r as3l as1o4f a3sol a3som as1o2p as1or a4soz a2sö a2sp as3pan aspek4to a4spel a4s2ph as3pik as4pin as3pio a4spl 2aspr a5spra a4ss. a4s3sa ass2a3b ass4aus. a4ssb as3sel asse3le asserma4 a4ss2i as3sin a4ssk as3ski a4s4sl a4ssn a4s3so a4ss3p as2spo as2spr a4s4ss a4s4st as5sta as6staf as6stag as3stau as5stei as5sti as5str as5stu a4st. 4asta ast2as a3stä a4stb a4std a4stec as4tee ast2el a4stemp a4s5tep as4t2er a4st3ese as4tex a4sth ast2i3d a4stl a4stm a2stoc ast3orc a4stp a2st3re as3t4ren a4stritt a3stro a4strol ast3roll a4sts a4s3tub a4s5tuf a2stum as4ty 2asu a4suh as2ur asu4s as4ut a2sü aswa2s 1asy 3a4syl 2asys aße2 aß2en3 a2ß1er aß2th 2at at1ab ata2be at2a3f ata3g at2ago ata3la a3tam at3an3k at1apf ata3ra at2ast at1att a2t1au at1än at2c a2teb ateien2 at1eig 3a2teli a3tell 3atemg at2en ate4na atens4 a2tep 4ater ate3r4al at4ere atern2 ate2ru at2eu a2tew a4th. 4atha at3hag at3hal at2heb ath3in. 3athl a4thm a4thr at2hu at3hü a3ti at4ia ati2kab ati4k3erw a4tinf at2is ati2sa ati2se a4tiso atis3s ati4v3erf 3atla 4atli 3atm 4atma 4atmä at3mu 4atmus a2t1ob a3tog a3tol 3a2t4om ato4man atom1e ato4mo at1op a3tor at1ort a3tos a3tra. atra2t a2t3rau a2t3rä at3re at3rin at3rom a3t4ron at3rot at3rü at2sa at3sche at2schn at2se ats1e2h at2si ats1in at2s1o at2sp a4tst ats3tät at2su at3ta 3attac at4tad at2ta2g at4t1ak at2ta2l at4tang at4tar at4tau at2tä at4tec at4tei att2el at4temp at3thä 4atto at2tob 3attr att3rat at2t3rä att3s4 at3t2u at2ty2 atu2n atze4l atz3ela atz3elt at2zem at2z1er a3tzere atzer2h at2z1i atz3t2 at2z3w a2u 2au. 2au3a 2aub au2bab au2ban au2b1au au2bei aube4n au2beu au2blä au2bli au2blo au2blu aub3rin aub2si aub2str aubu4s 2auc auch4str au2dr 2aue aue2b au3er. au2ere aue3rei auer3ö au3erq au3ersc au3erst. au3ert aue2sc au4fa au5fac au5fah auf1ak au5fal au5fam auf1an aufas2 3aufber 2aufe. 2aufeh 2aufen. 3aufent auf1er au4fer2k au4feu auff4 auf3ind 1aufla 1au4fn 2aufo 4aufö 1aufru auf3ski auf3t2 2auft. 3aufzeic 3aufzug 1aufzü 2aug au2ga au3g2ar aug2e 4augeb 4augeh 4augel 4augl au4gn 4augr au3gu 2auh au3ha auh1u 2au1i au2is 2auj auk3t aule2s aul2les au3lü 2aum aume4n au2m3ent au2m1e2r1 aum3eri au2m1id au4mil au4mit au2m1o aumo2r aum3p2 aum3s4 au4mun 2aun au3n2a aun2e au4nei au2nio au2no au3nu a4unz 2aup2 au3pf 2aur2 au1rh au3ru au4sag au2s1ah ausan4ne. au2sas au2sau 2ausc au4schmi au2scho 1ausd 2ause. au2s1eh 2ausen au2s3erb au2serf aus3erk aus3erp au2serw 1ausg au2sin au4sis au2so aus1or au2spr 1ausr 3aussag au3sse aus2se. auss2el au4ssende aus4ser aus2ses auss4t au2st2a 2auste au4stec aus3tie aust2o au2stö aus3tr au2stri 3ausü 1ausw 1ausz auße2 au2tab au2t1äu 2autb au2t1e2l au3ten. auten2g au2t3erh au3tet au2tev 2autg au2thy 2auti 1auto aut3rin au4trö 2auts2 2auu 2auv auve4 2auw 2aux 2auz auz4w 2a1ü av2a avari4e ava3t2 avener2 2avi a2v3r av2s 2aw awi3e a2wr a1x ax4am a2xans ax2e a2xio axi2s1 2a1ya a1yeu ayma2 ay3o aysi1 ay2u az2 a3za3d 3azal az4at a3zi az3t a3zu azz3a az4zab az4zin ä1a 2äb ä2b3l äb2s äbte3 ä1ce ä1che äche1e äche4n ächenma3 ächenmas4 ä1chi äch3l ä2chr äch4sa äch2so äch2sp ächt4e ä1chu ä2da ädel1i ä2d1ia ädi4e ä2dr äd2s äd3te 2ä1e äe2k3 äe4kl äe2x ä2f ä3fe äfe4n äf2fl ä3fi äf3l äf3r äf4ro äf2s äft2e äft4s3 ä2g1a 1ä2gä ägd2 äg2e ägen4e äge2r3a ä2g3l äg2n ä2g3r äg4ra äg2s2 äg3sc ägs4t2 äg3sta äg3str 1ä2gy äh1a 2ä1he äh1ein äher5t ä1hi äh1in ähl1a äh3l2e äh4l3e2be äh5ler 2ähm äh3na äh3ne 1ähnl 2ähr äh2rel äh3ri ähr5sa 2äh2s ähs4t 2äht ä1hu äh3w 2äi ä1im ä1is. ä3isch. ä1isk äka2la äk3l ä2kle äk4li ä2k3r ä1la äl4bc älbe2 äl4bl älk3 älks4 äl2l1a äl2p3 äl2schl ält2e älte1i ä1lu ä2m 2ä3ma3 äm4at ä3me ämer2s ä3mi ämi3en 2äml äm2ma4 ämmas2 ä3mo ämoni3e 2ämp ämp5f4e äm2s äm3t2e2 ämter3 ä3mu 2än. änd4e än2dr 2ä3n2e äne2n1 2än2f3 änft2 4än3g2e änge2ra 2än2gl äng3le än2gr äng3se 2ä3ni än3k2e än2k3l än2kr 2änn än3n4e2 änner1 2äns än4s1a än2s1c äns2e 2änz ä1on äo3s2 ä2p ä3pa 1äpfel ä3po äp2pl äp2pr äp2s1c ä3pu 1ä2q ä2r3a2 är4af ära4r är1ä 2ärb är2b3le är1c 2ärd ärde4s 2äre 4äre. ä2r1ei ä2r1e2l 4äre2m är1emi 4äre2n ä2rene 4ärer ä2rerh är2es 4äres. ä2rese är3ge äri2e ä2r1ind är1int är3k4e 2ärm. ärm3arm är3mas ärm3at ärme1e ärm3ent ärno2 är1ob är1of ä1rö är3re ärse2 är2seb är2seh ärs1er är2si är3spu 2ärt ärt2e är2th ärt4s3 ä2rü ärz3te är2zu är2z3w äs2 ä3sa äs4ch 2ä3se äse3g äse1i4 äse5ref äser2ei äse2ren äser2i äs3k ä3s4kr ä2s3p ä3ss ä4ss. äs4sb 2ä4s4s1c äss2e äss3erkr äs3sern äss3ersa äss3erw ä5sses äs4sf ä4s4sh ä4s4sl äss3p äs4sr äs4ss äs4s3t äs4t2e 1äs3th äs4ti ä2str ä1ß 2äßc äß1erk äß1ers ä2t3a2 2ä3te äte3a äte1e äte1i äte3l2 äte2n äteo2 äte4pi äter2bl äte3s ät2e3t ä2th ä4thc ät1id ät1ob ä2t3r ät4sa äts3au ät2sä ät2schl ät2schr ät2s1i2 äts3l äts1or ät2s3p ät4s3t äts5te ät2su ät2tei ätte4n ät2tr ätze3l ät2zw äu1 2äub äu2b3l äu2br äu3d äude3 äuder2 2ä2uf 1äug äu4g3l äu4gs äu4gt 2äul 2äum äu2ma äum3p äumpf4 äum2s3 2ä2un äun2e äu3nu 2äu3r2 äure1 äus2 2ä3us. 2äusc äu4schi äu2schm äu3se äuse1i ä3usg ä3usk ä3usn äu2sp äu3ss äuss1c 1äuß äu4ßr äut2e äu2tr ä2vi 1äx ä3ze á1 1b 3ba. b2aa b3a2ba 2babf 2babg ba2bl ba2br 2b1abs bach5t4e back3er back3s4 ba3de bade1i 2b1adel bader4 2b1adl 2b1adm b1a2dr ba2du 2b1af 3bah bah4nene bai3d bais2 b2ak ba4k1a ba4k1er ba4k1i ba4k1l bak3r ba4kra ba4kre ba2lab ba2l1ak ba3lal ba2lau baler2 ba2l3erk balk4a balke4 bal4lan balle4b bal2l3ei ball4erk bal4li2g bal4lo2k ballö3s ball3s bal3tin bal2tr 2b1am b2ama ba5maz ba4me 4bamt ban2a 3b2and band1a ban2dal ban2dan ban2dar ban4derk ban4derz ban2dr ba3n2e 2banf b1ang ban3gl ban4k1a ban2kl ban2kn ban2kr ban2ku 2banl b1anna ban2o 2b1ans b1ant 2banw b1anz ba2r3ab ba2rad bar3ast ba2rat bar3de ba2rei barer3ei barer2t 3bars b1arz bar3zw 3b2as ba3sa ba2sc bas2i bas4sa bas6str bas6tel ba2str ba2ß1 ba2t3ent bat2o 3bau. bau3b bauer2l bauer2s bauer2w bau5fa bau3fl bau3f4r bau3g b2auk bau3r bau3s2k baus4t bau3sta b1a2x ba1y4o 3b2äc bä1ch 3b2äd 2b1äh b2äl 2b1ärz b2äs3 bä4ss 2bäug 2bb bbe4n bbe4p b2be2se bb3le. bb2lö b3brec b3bru2 bb2s bbu1 2b1c 2bd2 b3da bdä2 bdän3 bdome4 bd4ri 3be. 3bea be3ab be3an be3as beat2m be3au be4au. 3beb b1ebb 3bec be1ch 4becht 2b1e2del bedi4 be1e2h bee2l be3ela be1en bee4rei be1erh be1erl be1ert be1eta 2b1eff be3g2 be2he. beh5ri bei3b 2b1eier bei3f4 beige4be beige4ge beige2l beige4p bei3k4 bei3l2a 2b1eime be1ind be1inh bein4hal bein2hi bei3s2 bei5s4t beit4e beit2s beit4s3k 3bek 3bel b4el. be3l2ag be3las bel3d be3lec 4be2lek be2l1en be2let bel3f bel3la belle4n3 bel3li bel3om be2löf bel3sz belt2 bem2 3b2em. 3b2e3ma 2b1emp 2bemul 3ben. be5nabe ben3ar be4nas be4nat be2nä4 bend3s2 b2ene be3nei be4n3end be2ners ben2eu 3beng be2nid be2nik be4nis ben3n 3benp b2ens ben2spa ben2spr benst4 3bensv 3bensz 2b1entb 2bentd 2benteu 2bentf ben3th ben4thei bent4r 2b1ents 2b3entw be2nu ben3un b2en3z2 be1o 2b1epi 2bepoc be1ra ber3a2d be2rak be2r3am be2ran bera4s berb2 ber3d be2r1e2b be2reck be2r3eiw ber3ell bere2m be2rene ber2er ber3erk bere4sc bere4t berf4 ber2g3af ber2gal ber2gli ber2hab beri2d be3r4in. berin2g be3r4inne be2ri4o ber3iss ber3ko ber3kr bermas2 berma5sse ber3n2a bern2e b1ernt be4roh be2rö4 3bers. ber5se ber3st2a ber3t2a bert2e bert2i berz2 ber3ze ber2zö b2es be3sa bes4abb bes2am be4sap be4sar bes2au be2sep be2s1er be2s1id bes3sa bess4e b3esst. bes3sz beste2 be4stein bester2 be5ster. besti3en be2s3tol be2st3o2r best4r be2s3trä be2s3tur be2sur be3s2ze be3tam be3tha be3thi bet4o bet2sp bet2to be1un be1ur 3bev 3b2ew2 2b3e2x 3b2ez 2bf2 bfal2 bfang3s bf4lö4 bflös3 bf4ri bf4ro bf4rü 2bg2 bga4s3t bga4su bge3 bgel2e bge5na bges4 2b1h2 bi1ak bi2ar bi1as 3bib2 bibe4 biber1 bi2c bid2 bi3do bieres2 bie4str biet4s 3bietu biga1 bik2a bi2ke. bi2kes bi2kre 3bil bil2deb bil3der bi2lei 4billu bi2lu 2bimp 2b1inb bin2e bine4n b1inf bin4fo bin2g3a bin3gl 2b1inh bino2 bi2n3ok bin4ol 2b1int 2b1inv bi2o3 biri1 3bis bi3si b1iso bi2sp bis4sa bis4s1c bis3t bi3s4ta bi2sto bi3s4tr bi2stu bi2stü 3b2it. b2ita b2ite b2iti bit4r bit4ta4 bi2tu bi3tum bi3z2 2bj bjek2to 2bk2 bk4ne bk4nu bl2 2bl. bla3b4 2b3lac b3lad b2lanc bl4at b2latt b2lau. b3laus 2b3law 2b1län 3blät b2le 3ble2a b3leb 3blec b3leg 4bleh b4lei. 3bleib 2b3leid 2bleih b3lein blei3s4 bleistras6 2bleit ble3l blem3p ble2n b3lenk b3lese 2blesu ble3sz 3blet b3leu 2blich 3blick b2lie 2blief 4blig b2lind 2b5ling4 b2lis 2blis. b2lit b3lite b2lo b4lo. b4loc 2b5loch b4loi blo2id b3los2 blo3sse blös4s 3b4lum 2blun b2lus 3blut blut1o blut3sc 3blü 2bm bmas2 2b1n2 b3na bnas4 b3ne b3ni2 bnis1 bo3as b1o2b bo3ben bob3r bo1ch2 bo3d2 bo4dd boe1 bo2ei 2b1of bo3he boh2ra boh2u bo1is bo2lan bo2lau boli2e bol3le bol3za 3bon. bo3n2a bond1 bon2da bon2de bo2ne 3bons boo4l boo2ti b1op 3bor. bo1ra bor2an bo2r3as bo4rä bor2da bor2d3r bo4rig bor3m2 b1ort bor2ter bor4t3rat bo4ruh bo2sc bo3se bo4s3p 3bot bot2e bote3n2e bo3th bot2st bot3t bo3v b1oz bö2b3 2böf 2b1öl 2bp2 bpa2g b3pf bp4rä bpri2 2bq b2r2 2br. b4ra. 2b3rad 2b4rah b4rak bra5ka br4al b4r4am2 bra4ss brast4 2b3rat. brat3er2 bra4terg 2bratg 3brä 4bräd brä4u 2bre. 4b3rechte 2b3red 2b3ref 2breg b3reic b3reif b3reiz 2brek b4ren. 2b3rent 2breo 2b3rep b4rer b4res. b3rese b3rest bret4t3en 2b3reu b4rez bri2da brie2fa 2b3riem b4rien bri2er b3ries 2brigk b4rik b4rina 2b5rind b4rio b4risc 2briß b3ritt b4riz brob2 2b3roh 2b3rol bro4ma b4ron 2b3rost bro4tei bro2tr brott4 2b3rou 3brö b4ruc 2bruf b4rum 2b3rund brun4e bru4s4 brust1 bru2th b4ruz 3brü 4b3rüb brü4ss 2bs b2s1ad bs2am bs3amb b4s3amt bsas2 bsa3sse bsau2r b4s3är b3s2äu b3sc bsch2a b4schan b4schef bs2chi b5schl b4sco bs2cu b3se. bse2b b3sel. bse2n1 b3sen. b2s1ent bs1erf bs1erg bs3e2r3in bs1erk bs1ers b3s2es b2sim bsi2t b4ski bs2ku b2s1of b3s2oh b3sol b4sop bso2r b2sö bs2p bs4pi bs3po bss4t b4st. bst1a2b bst1ak bst1al bst3an3k bst1a4s b3stä b5stär bs3tät bst3emi bst1er b4stern bst1h bst3ink b2stip b3sto b4stob b4stod b4stor b3stö bs3trau b2s3trä bst3rep bst3ro b3stü b4stüb b2s1un b3sz bs2zep bs2zi b4szü 2bt b3t2a bta2st3r b3te b2t1h bt2i bti2s bt4ra btran2 bts2 btü1 bu2chec bucher2 bu4ch3er4s bu3ches bu2chi buch3sp bu2e3 bu4fe bug3 bu2gr bull3a 2bumf 2b3umk 2buml 2b3umr bun4a bun2d3er bunde2s b1une b3un3gn 2b1unh bur1c b2ure b2urg burg1a bur2gan bur2gar bur2gin bur4gr bu3r2i 2burn b3ursa burt4s3 bu3ru bu2sa bu2sc bus3cha bu3sche bu4schei bu4sch3el bu4scheu bu3schu busch3w bu3shi bu2si bu2s3p bu4s3ses bussy2 buster2 bu4sterm bu2s3tr bu2su but2a bu3tan buto3re 2büb bü4bc bü1c bügel3e bü3s2 2bv 2bw bwur2 b2y by3a2 by3o2 by3p2 bys2 bys4c by2te 2bz2 bzeit1 bz4wa 1c2a ca3bl 3ca2c ca2e3 ca3g2 ca1h cal2a cala3b cal3t 3cam 2can cana3 ca2pe ca3r2a car3n2 carri1 car3tr ca3s2a3 ca3sto ca3t2h ca1y2 cä1 2cc c1ce c1ch2 c2d2 c3do 2cec 1ced ce2dr ce1e 2cef 2ceh ce1i ce3in 2cek 3cels cen3a cens2 ce3nu cen3un ceo2 1cer cer3a cere1 cere3u ce3r2i ce4ris ce1ro ce3s4h cet1am ce1u 1cé cg4re c2h 2ch. 2chab ch3a2b3i 2chaf 2ch1a2g ch1ah 2ch1ak chan4a 3chanc ch1ang 4chanl ch3ansa 4chanz 3chao 4char. 3chara 3chard 3charta cha2sc chasi1 1chato 2chatt ch3austr chau3t ch1äh ch1ärm ch1äs 1châ 2chb 2chc 2chd che3b4 ch3e4ben ch3echt ch1edi che2el 3chef che2fer 2chei ch1eim 2chelem che2ler 3chemi 2chemp che2neb che2nid che2no 2chents 2chentw che2r3a 2ch3erbs 2ch3er2de 2ch3erfa 4chergeb 2cherke cher4zie ch3ess 2ch1eta 2ch3e4x 1ché 2chf 2chg 2chh 1chia chi3na 4chind 3chines 2chinf 2chinh 2ch1ins 2ch1int 2ch1inv 1chip. 1chiru 2chiso 2chj 2chk 2chl2 chl4a ch2le chle2i ch3lein ch4len 4chli ch2lu 2ch2m 2chn2 chn4a chn4e chner4ei. ch2neu 2chob cho3ch cho4f ch1off cho5fr chof2s ch1oh cho3l2a ch1orc ch1ori ch2os ch3öl 3chör 2chp ch2r2 2chr4a ch3rad 2chre chre3s ch3rh 4chrit 3chromo 3chron ch5ros ch4ry 2chs ch2stal 2cht ch2truh chts3trä 2chuf 2chuh 2ch1unf 2chunm 2chunt 2chur ch1urs 2chut 2chü 2chv 2chw 2chz ci2al ci1as ci1c ci1es c1ind cins4 c1int ci2s1 1ci3t2 2c2k ck1a cka2b ck2ad ck2age cka4m cka4r1 ck1ä ck1ef ck1eg ck1eh ck1ei cke4na cke2ra ck3er2hö ckerk4 ck2ern cke2ro ck2et cket4t ck1i2d ck1in ck4is ck3l ck3n ck5nac ck3o2 cko4f cko4p cko4s ck3ö ckö4f ck3r cks2al ck4ske ck4spen ck3te ck3t2i ck1uh ck1um ck1up c2l2 cle4a clet2 clin2g cli2p1 clo1c 1clu clu4b c2m2 c3me c3mu 1c2o 3coa co1ch 3co2d2 co4de. co3di cof3f2 co2ke cola3 co2leu co3l2o 3com co4mp com2te. comtes2 con2ne continuati6 co2o coo3p co3p co4ps co1ra 2corb cor2da cor3de co4re co5ree cor3t cos4t co2te cou3si cô2 2c2p 1c2r2 c4ra4s c3rä cre2 cre4me 3crew 2cri 2cry 2cs2 c2si cst2 2ct cti4o2 ction5 ctur4 1c2u 2cua cu2e cup3 cu4pa cu4p1e cu4pl cu4pr cussi4 c2v c3ve 2cx 1cy 1ç 1d 3da. da1a 2d1aal 2d1ab d3a2bak d2abä d2abe d3a2ben d3a2bi da3blu d3a2bo dab4ra da2bri da3brie d2ab4rü d1ac dach3a dache4 da2cho 2d3achse 2d1ad da2de da2do da2d4r d1af da5fab 2da4ff da3f4l dafo4n d1ag dagi4o dag2o da1h dah3l dail3 da1in 2d1air da1is da4kro 2d1alar dal3b2 4d1all da2lop da3lö 2d1alp d1al3t 2dalte da1lü 3dam d1a4mei d1amma 4d1ammä damo3 da3mö d2amp damp5f4erf 4d1amt 3d2an. d1ana da2nan da4n4at 2danb dan2ce. d1and2 2danda d2andy 3dane 4d3anei 2danf d1ang 2danh dan2kl dan3kla dan2k1o dan2kr 2danl d1ann 2danna d1a2no 2d1ans danti3e 2dantw 2danw d1anz d2anz. 2danzi 2danzü 2d1ap d2apa d2aph da2po da3pos 4dapp d3apte 2daq da4r1a dara4s 2darb2 2d3arc dar2d1e 2d1area daren1 dar3g d3a2rist dark2a 3darl dar2m1a dar2m1i dar4mun da2r3o d1arr 2darres 3d2ars4 2d1art d3ar2th 4d3arti dar2tr da2ru d1arz das2 da3sh d1asp das3s 2d1assi 2d1ast da4str dat2e2 da3tei 4d3a2tel date4n da2th 2d3atl 4datm d3ato dat2st 2d3atta 3daub 2daud dau3e2 dauer3e daue4rei 2d3au4f 2d3aug 2dauk da3unt 2d1aus dau4ss dau2ß 3daw d1ax 3däc 2d1äg 2d1äh 2d1ämt dä4n3a 2d1änd 2d1äp 2däq 2d1ärz 2d1ä2u dä3us 2däx 2db2 dbau2c dbauch3 dbe2e db4la db4ri dbu2c dbu3s 2dc d3ch 2dd2 d3da ddar4m1 d3dä d3de d3dh dea2d 3dean de3ar de3as de3a2t deb2 deb4r 3debü de1ch de4ck deco3 2d1e2del de2dit 2dee2 de1eb de1e4g de1em dee4n de1er de1es def4a de2fa. 2d1eff def4l deg2 degene3 de3gl deh2a dehas3 dehe2 3dehn de3ho 2d1ehr d1ei 3d2e4ic de3i2den de3il 3d2eim 4deime dein2d d2einfr 4deinr d2e3inse de3inst dein4sta dein4sti 4d3einw de3io 2deise d4e1ism dei4sp 2dekz de2l1ac de3lak dela4t del3ate de2l3aug del3änd del3b2 del3d del1ec 3de3leg delei2g 2delek 2delem de2len deler2 deler4r 2delf. 2delfm 3delik della3d del4lan del2lar dell3auf del2l1ä dell3eb del2lei del2ler del2lö2 de2l1ob de2lop del2se del2so del2s3p del3t dem2ar 2d1emb dement2 de4mentg dem3ents demi2e 2d1emot 2d1emp d2emu d4en. de2n1e2d de4n3end de2nep 2denerg de3n2es d3en2ge. de2ni denk3li dens2am den4scho 2den2sem den2ser dens3tau den4s3tie 2dentd 2dentf 2dentg den3th 2dentn 2dentw 2dentz den4zerf den4zers de2ob 2deol dep4l 2depoc d4er. dera2b der3af de2rak dera2n de3rand de2r3ap de3r2ass der2bl 2d1erbs 2derdb de2r1e2b de2reck der3eis 3d4erem d4eren de2r3end 3d4erer der2erf der3erl derer3n der3ero derer2t 3d4eres der3ess de2r1eu derf4 d4erfl d3erheb d2erhü de5ric de2r3id de4rinnu derin4teg der3k2 d3erken 2derklä 3d4erlan d2erm de4rn de1ro derö4 der3r de4rs der3san 2dersat derst2 der3stau dert5ende. derter4e dert4ra 4der4trag 3de3ru de4ruh de4rum 2d1erz. d3erzeu 2d1erzv d2es. de2sa de4sa2g des1ah de4sam des3an de2s1än de2seb de2se2h de2sei 2d1esel des3elt de3sem de3s2end desen3e de3sens de2set de2sin 3desk de2s1o de2s3p de3spe de3spru dess2 des3sau des5st dest3alt de4stant de4statt de6steige de4steins de4sterg des6tex de4stit dest3rat de2stre de2su des1un 3desw de3ta deten2t 2d1e2th 2d1etw 2d1eul deum3 de1un de1url de3us 2d1e2vid devil2 de1x4a de2xer de2xis 2dexpe 2dexpo 2df2 df4la df4ru df4rü 2dg2 dga4s3tr d2ge. dger2 dge3s d2gesh dge4t3a dge4t1e 2d1h2 d3hu di4aa di4ab di4ad di4ae di4af di4ag di4aj di4ak di4ale di4am di4ao di4ap dia3s di4at4 di5at. di4au di4av di4az di3äre 3dic di1ce di3chl dich3t4er dick3el 4d3i2co 3dida d1ide 2didee di2den 2didy di2e di3e4d di3en. di3end die2neb diener4l di3e2ni dienst3r die2p di3ers. dies3c di3e4th 3dif di4ff di4gk dig4n dik2a dil2s3 2d1imb 2dimp din4a 2d1ind di3n2e 2d1inf di4ng 2d1inh di3ni 2d1inj 2d1ink di4nn 2d1ins 2d3int 2d1inv di2o3b di2odi di4ok dion3in dion5s4 di3ora d4ios2 di2osk dip2 di3pt d1i2ra di4re. di2ren di5rig di2rin di2ris 2d1irl 2d1irr di4s1a2 2d1iso di2sp di3s4per 2d1isr dist2 di2s3to di2s3tra di4sz di2ta dite1c di2t3erl di4t3erm di2t3ers di3the di2tin di2tob di2t3r dit3s di2t1u di5vid diz2 2dj d2jar 2dk2 d3kl dk4le dk4na dk4ne 2d1l2 dlap4 d3le dle2ra dl3f dli4f dl3m dl3s 2dm2 d3ma d3me 2d1n2 d3na d3ne dni2 dni3g dnis1 dnis3t dni3v d3nu do3a doa4k 2d1ob 3d2oba do5ba. d2obo do1chi d1of do4fe 2d1oh do3ha dol3l2 d3oly 3dom do4mal do4mar domen1 do4ming 4domn do4mu do3n2a do5nan doni1 4dony do2o do3op 2dope 2d1opf do1r4a 2d1orc 2d1ord dor2f1a dor2fä dor2f1i dor2fl dor2fo dor2fr dor4f3u 2d1org d2orn 2d3orna 2d1ort dor2ta dor2t3ei dor2ter dor2tr d2os. do3se dos2k 2dosm dost1 d1ost. dost3a dosten2 do3ta do3th do2tof do3un dow2s3 d2o1x2 d1ö dö2d dö4fe döl3 dölla3 d2ön 3d2ör dö2s1c 2dp2 dpass1 dpas2se dpas3ses d3pf d3po dpol4n dpo4st1 d3ps 2dq d2r2 3d4ra. 3d4rab 4d3rad 2drahm 2d3rak 3d4ral d4rama d3ramm d3ramp d3rand dran3k dra4s3s 2d3rast dr4at dra4tin 2draub 2d3rauc d4rauf 2draum 2draup 2dräd d4räh 2d3rät 2d3räu 4dre. 2d3rea d4rea. d4reas 3d4reck 2d3ref 4dreg 3d4reh dre2ha dr4ei 2d3reic 3d4rei3e drei3s d4reiv d4rej 4drem 4d3ren d4reo 4d3rep 4d3rer 4dres. d4resc dres4sei dres4ser4 dres2st d4rew 2drez 2d3rh d3ri 3d4ri. d4ria d4rib 4dric d4rid d4rie d5rieg 3d4rif 4d5riff d4rik d4ril d4rin. 4d5rind 2drip d4risc 2drisi 2driss 2driß d4rit 2d5ritu d4rix 2d3rob d3rod 2drogg 2drohr 3d4rohu dro2id. 2d3roll 2d3rose d4ross 2d3rost 2d3rot 2d3rou 2d3rov d3row drö2sc 3d4ruc 2d3rud 2d3ruh dr4un 2d3rut drü3b 3d4rüs 2ds ds3a2b d2s1ad ds1al d2salk d2sall d4s1amt d2san ds3ane ds3assi d2saut ds1än ds2äu d2schef d2schin d2schun d3s2co d2scr d2s1e2b dse2e d2s1ef ds1ehr ds2eign d2sein d2s1emb dsen3er d2s1eng dsen3s d2s1ent d2s1erf d2s1erh d2s1erk d2s1erl ds1err d2s1ers d2s1ert d2serz dse4t d2s1eta d2s1ev d2sex d3sha4 d4shal d3sho d4shor d2sid d2s1im d3s2inf d3s2kal d3s2kel d4sli d3soh d2sop dso2r ds1ori d2sö dspa4s3 d2spat d2spä d2speri d2s3ph ds2por d4sporto d3spri d2spro d3spru ds2pu dst2 d2s3tas ds3tauf d2s3täti d4stea d4stele ds3th ds4til d2s3tis d2stoch d2stod ds3tor d3strei d3s4tro dsu2m d2sun ds1url ds2zen 2dt dta2be d3t2ac dta2d dt2ag dta2n dt3ane d3t2as dt2ax dt2et d2th d4thei d3to2 d4tob dt2op d3tö d4tök dt3r dtran2 dts2 dt3sa dtt4r dt2un d3t2ur d3ty dua2ler du1all du1alv du1ar du2b3li du1ce duel3la 2d1u4fe duf2ter duf2to duf2tr d3u2g 2d1uh du1i du2in du2kr dul3art 2d1umb 2dumd 2d1u2m1e 2dumf 2dumg 4d3umk 2duml d2ump 2dumr 2d1ums d2ums. 2d1umv du2n 2d3und 2d1unf d1unga 2dungl 2d1uni dun3ke dun2kl 2dunr 2dunsi dun2st3r 2dunt 2dunw 2d3unz du1os dur2c durch3 2d1urk 2d1url 2d1urn 2d1ursa 2d1urt du2schn du2schr du2sch3w dus4t 2düb d3über dü2str 2dv2 2dw dwa2 dwer3te dwe2s dwe4st1 dy2le dym3 3dyn dy2s3 dys1c dy4sl 2dz2 d3zw dz4we 2e1a ea2be ea2b3l ea4br eadli4 e3a2dr ea2g ea3ga2 ea3g4l ea4ka eakt2 e2akta ea2la e3alei e4alem ea2l3ent ealen2z ealer2 e3a2lerg e3alex e3a2lin eal5le eal3lö eallö3s e3al1o ea2lon ea2lop e2alti2 eal3tr ea2l3u2 ea4m3a e2ame ea4m1o eam3t2 e3anf e2ano e3ar. ea2ra ea3rat e2are e4are. ea2r1ei ea2rene e4arer e4ares e4arn2 ea2ro e3arz e2as e3as. e3a4sc easin4 ea4sp eas3s eate2 ea3te. ea3ten eat4mes eat2mu eat4mun ea4to eat3s e3at3t2 e4atu2 e3aue e3auf eau4fe eau4fl e4aufo e4auj eau3n eaus3s e2av e2az e1ä2 e3äh eä4st 2eba e3bak eba2p e3bän 2ebec ebe1er ebein5h eb2el ebe2ler ebe2lo ebenen3 ebe2ras ebert4 ebese2 ebe2s3eh ebe2so 2ebet ebet4s 2ebh 2ebi 2ebl eb2laß e3blä eb3le. eb3ler eb4leu e3blie eb3lo e3b2lö 2ebo e2bob ebot2 ebö2s 2ebr eb5rah e3brau eb2s1 eb4sche ebse2 ebs3p eb4spanne eb3stan ebs3tau eb4stät ebs3t2h ebs3ti eb4s3tot eb3str ebs3treu eb4sz 2ebu e2bunt ebus3s ebu2t3 2eca 2e1ce ech1am ech1ä 2e1che ech1ei ech2en1 echer4fa e4ch3erzi e1chi echi3e ech3l ech3m ech3n e2cho. ech3ö4 ech3re e1chri ech3sel echs2er echst3re ech3tab ech3t2ei ech3ter ech4terh e1chu ech3w 2echz e1ci ecke4n1 eck3err ec4kl eck3ser 2eckt 3eckty 2e1cl 2eco 2e3cr 2ect ed2a ed2dr ed2e ede2al e3dee edel3l ede3n2er edens1 eden4sa eden2se eden2sp eden4sta edeo2 ed4e2r eder3a ede3rat ederer4 eder3t2 edhof4 ed2i e3di. 2edip edma3 edmas2 e3d2o ed2ö e3drei ed4rö ed2sal ed2seh ed2s1es ed2si ed2s1o ed2sp ed2sto ed2s3tr ed2s1u edun3 edund2 e3dy3 edys4 2ee ee3a2 eeb2l ee3bs ee1c ee2ce ee2cho e1eck eede3 eed3s2 ee1e2 e1eff eef4l ee3fo eeg2 eeg4r e1ei ee2i3e eein2se eei4sc eei3se eeis3s e2ela eel2e e3e2lek eele4n eel2ö e2e3m2a eemas3s e1emb e1emp eena2g e1end een1e e2e3n2i ee3n2o4 een3s e1ent e1en2z ee3o2 eeo4l e2ep ee3po e1erbt e1erd ee3r2e2 eer3ei ee4r3en2g eere4s5 eer3eti e1ermä ee1ro ee1rö e1eröf eer2ös eer3sh eer3str ee3r2un e1erz ee3sh ee3sp ee5ste ees6tei e2et. ee3t2a ee4tat ee2th eet2i ee3t4r ee2tu ee1u eeu4f eewa4r eeweis4 e1e2x e2f1ad e2f1a2g e3fah ef1ana ef1ar e2farc ef3arm e2fat ef1aus 2efä ef2äl efä5sse e2fäu 2efe e2f1e2b e3fef efe2l3ei ef1em e2femi efe2n1 3e2f1ene e2fent efer3f eferin4d efeuil2 ef2fä2 3effek 1effi ef2fl 2efi ef1id e2f1ins efi2s 2efl ef4le ef5le. e3f4lu e3f4lü 2ef2o 2efr ef4reih ef3rol ef3rom ef4ru ef4rü efs2 ef3sc ef3so ef3sp efs4t ef2tan ef2tei ef2tro 2efu 2efü ega4m e3g2anz e3ge eg1eil egein3 ege2lan ege2l3au ege4l5ei4er ege2ler ege2lo eg2en ege4n1a2 egene3ra ege4nero egenma6s egen3z eg2er ege2ra ege3stal ege2s3to ege2s3tr ege1u e4gex 2egi e3gio 2egl e2glo e2glu egmen4ta e2gn eg3nä eg3ni ego3p egori2e egro3sse egs2ag eg4sal egsau3g eg3se eg4sei egs2e3l egs3er eg3si eg4sk eg4sm egs2of egs4pe eg4ss egst2 eg4sto eg2th eg5ver 2e1ha eh1ach eh1ad eh2ade e3h2ah eh2al ehalt2s e3hand e2harz e3haut e1hä ehäs3 e1he eh1eff eh1ein e3helf eh1elt e2hense e2h3ente ehen2tr ehe3o 1e2hep 2eher ehe1ra e2h1er2f e2h1er2l 2e1hi eh3im ehis4 eh1lam eh2l3au eh1lä ehl3ein eh2lent eh5l2er ehlo2 ehl1or eh2lö ehl2se ehl4sl 2ehm eh4mant eh3mu eh3na eh3no 2e1ho eho4f eho2l eh3oly 2e3hö ehö2rer eh2r1a4 ehr1ä ehr1ec eh2rei eh2rel ehr4ern ehre3s eh4rin eh1roc ehr1of eh1rö eh2s2 eh3sa eh3se eh3sh eh3si eh3sk eh3so eh3s4p eh3sta eh3sto eh3str 2eh3t2 eht3h eht4r eh4ts 2e1hu e2hum eh1unf e2huni e1hü eh3üb eh3w e1hy 2ei3a2 eia4t ei2bar ei2bli ei4blu eibu2t ei2b3ute ei1ce ei2cho e2id ei2d1a ei4db ei4dl 2eidn ei3dr ei1e eie2b eie2d ei3e2l eie2m 4ei3e2n1 eienge4 eie2t 4eif. ei3flo 1eifr eif3t 2eig. 2eiga eig2ar 2eigä 2eige. 2eigeb 2eigeh 2eigeno 3eigensc 4eig2er 2eiges 2eigew 2eigi 1ei2g3n ei2go ei2g3rat 2eigre 2eigrö 2eigru 2eigrü 2eigs4 2eigt 2eigu 2eih ei2hum ei2kab ei2kak eik4am eik2ar eik2i eik2l ei3k4la ei3klä eik2o e2il 4eil. ei4l3ab ei2lam eila2n ei2l3ane ei2lang ei2lant ei2l3anz ei2lar 2eilb eil3d4 ei2lein eile2n1 ei2let eil3f4 eilm2 ei2lob eil2ö 2eim. ei2m1a2g eim3all eim3alp eima4to ei2m1or 2eimö 2eimp eim2p4l eim3sa ei2mur e4i2n1a ei4na2d ei4nae ei4n3an ei4na4s ei4n3at ei2n1ä einbus2 ein3d2e ein4derk e1indu 2eineb einen2e ei4n3en2g einen2s ei4nen4se ein3erbe ei2nerf ei2nerk ein3er4la ei4ness ei2neu ein4fiz 3einflus 3einfluß 2einfo ein4fo. ein4fos ein3g2 3einger ei4nh ein2hab e2inhä ei2nie e1in2it ein3k4 ein4karn 3einkä e2inl ein3n2 ei2n1o4 1einri e4insa einsas2 einsa5sse 3einsat e2insc 3einschä ein4stal ein2teg ein4terv 3eintop 3eintö 3einträ 1einu ein3zw ei3o eio2s ei3p eip2f ei4pp ei4pz 2eir eir2c ei3re e1irr e4is. ei2sa ei3sas ei4sau ei2ser2g ei2s3er2l ei4s3erst ei2s3erw 1eisho ei3s2ky ei4sl ei2so eis4pe ei3spru e2i3s2s eist4e eis3tras3 ei2sum ei2sur 1eiswo e2it ei2t1a2b ei2tal ei2t1an ei2tap ei2tar ei4tat 2eitä ei2tän ei2teli eite4ra eit1h ei2tin ei2trau ei2tro eit4sag eit3t4 ei2t1um ei2t1ur eit3z4 eiv2 eive4 ei2zar ei2z1in 2ej e3ju 2ek. 2e3k2a 1ekd ek2e e3ke. e3ke4n eker3z e3kes e3key e3ki e3k2l ek4lo ek4na ek4ne ek4ni ek4nu 2e3k2o ekor2da 2e3kr ek4s3p 2ekt ek4tank ek3t4ante ek2t3at ek2t1ä ek2te2l ek2tep ekt3erf ekt3erk ek2t3er2z ekt2o ek2t3o4b ekts2 2e3ku ekur2a e3k2w 1ekz e1la el2abt el3abu e2l1af ela4h e2l1ak el3al e2l1a4m e4lame el2a5mi el1ana e4landa el1ank e2lanm e4lans e2l1ant e4lanw el1anz 2elao e2l1ap e2l1ar el3a2ri el1a4si el1asp 2e1lä e3läd 2elbil 2elbr 2eld elda2r eld3ari eld2arm el2d3erf el2d3erl el3dern elder2s eld3erst el3des elds2 4e3le. 2e3lea elea2r 2eleb ele2c el1ech 1elefa 4eleh el3ehe. 2elei e4l3ei4ern e2l1ein e3leine e3leit el1eiw 1elek 2eleko e2l1el ele3ler 1e2lem 2e3lem. e3lema el1emb el1e2mi e3lemm 2el1emp 2e3len. elen2k3l e2lense e2l1ent e3lep 4eler e3ler. eler2a el1erd el1erf e2ler2fa e2lerfi e2lerg el1erh e2l1erk e2l1erl eler2la e2l3ernä eler2ö e2l1err el3eru el1erw e2l1ess e2l1e4ta el2eth ele2ti elet4ta el1e2x e3lex. 1elf. elf2er 1elfm elf4r 1elft elgi3 el3g2l elg4r e2l1id 2e3lie elif3 2elig e2lim elin3a el3inka eli3no el1ins 4elis 2elk elks4 ella3den el2lant el2lap el2larb ellar2t ella2s ell2ei ell3ein el4lel ell2er eller4fas eller5g ell3erh el3lie el2lil 1ellip el2lo2g el2lor el2lot ell2ö el4ls ell3sp ellu2m el2lü elm2e elm3ein el3na 2elo e2l3oa e2lof elo4fe e2lol e2lom e2lonk el1opf e2l1or e3lore elo2ri e3lot e3l2ov 2elö el3p2 el2s3ein el3sent el2stor el2sum el3tar el3te. elte4m el5ten. el4t3ent elter4b elter2f elt3erh elter2k elter4le 3elter4n elter2s el3test elt3eth el3the elt1r el4ts elt3se 2e1lu el1uf e2l1um e2l3u2r el3use elu2t el3ute el3uto e1lü 2ely e2lya el2zar el2zene elz1in em3a2b em4ak e2m3alar e2m1alk em3anf e2m1ano e2m1ans 1emanz e2m3a4sp emas2s ema3sse e3maß em1au 2e3mä em2äh 1embo 1embry em2dä emd1r em2dra 2eme e2m1e2b e2mef eme2i e2mele em2en emen4gel emen2t3h e4mentsp eme3r2i e2m1er2l em1erw 3e2meti e2m1i2d emi2ei e2mig emik2 em1im 2emin emi3n2a e3mind em1int 1e2mir 4emisc emma3u em2mec e2mof emo3s 1empf4 3empfä em3pfl em3po em2sa em2scha em2sim em2spr em2s3tr em3t2 1e2mul 3emuls emune3 e3mur e3mus 2emü emü3s2 e2na 4ena. e4na2b en3aba en3abo 4enac en3ache e4n1ack enadi4 e4naf 4enah en3ak ena4ke en1al e4nalb e3nale ena3l2i e4nalk e4nalm e4nalo enal3p 4en1am ena4n e4nand en3ane e4nant e4nanz en1ap ena2pa en3are en3ark 4enarm en3aro en1as ena4sc e4na4st 2enat 4e5nati e4natl enat4s e4n3att 4enatu e4nau4f en3aug e5naui e4n3aur e4nausta e4naut e4n1ax en1a4z en1ä en3äb en4äc e2när en2ä3s en3äst enbu4s3 en2ce. end2ac en2dal en2dang 4endef 2endel ende2lä endermas4 en2d3es2s en2dex en2did en3d2ort en2dost end3rom en3drü end3s2l end3s2p end3sz en3d2um en3d2ü 2ene. en3e2ben en1ec e2neff ene3hen en2eid e3neien e4neige e4nein e4neis e2n1el ene4le 2ene2m e2n1emi 2enen e4n1ent en3envi en1ep 4e3ner. e2n1erd e2nerf en2erfr 1energ 3energi e2nerh e2nerk e2n1erl e2nermi e2n3ermo 4enern e2n3erne ene2ro e2n1erp e2n1err en1ers 4eners. e2n1ert en2ert. e2n3eru e2n1erw 2enes e3nes. e2n1e4sc e2n1esk e2n1ess en1eta e2n1eth en1eul e2n1e2v e4ne2x en3f en4fb en4ff en4fg en4fh en4fk en4fm en4fp en4fs en4ft enf2u en4fw en4fz 1engad 1engag eng2al en3geb enge3r2a eng2i en3gn en3g2o 1engp eng4ra eng3se e3ni. 2e3nic 2e3nie eni3er. eni3era eni3erp eni3ers. en3i2ko en3ill eni4m en1ima en1imi e2n1in en3inh e3nio en3ion e2nir 2enis eni4sa e4n3iso e3nit2 e3niv enk3aus 3enkeli enk3erg en2k3erk en3k2ü en5mil en2nef en2nel enner2e en2ner2f enn3erg enn2i enni4ger 2enniv e2n3oa e2n1ob e3nobel eno2br e2nof e2noh en3oli en3olm eno4ma eno4n e2n1op e2n1o2r en2ora eno4ri 4enorm eno2s e2n1o4st 4e3not eno2w e1nö en1ö2d e4nöf e4nök e4nöl 4enred en3sabb en3sac en2san ensas2 ensa3sse en3sche en2seb ense2e 1ensem en2sen3e en3s4pen en3spo ens2por 4enst. enst3alt ens6tel en4stele en4s3test 4enstl 2ensto enst2ü en2sun 2entab en2tad 2entaf en5t2ag en2tanm en2tanw en3tar ent2ark 1entd en3t2el ente2n 3entera en2t3erb en3tes 1entf 2entfo 1entg 3entgeg en2thi 1enthu 1enthü en2t3id 3entla 1entn en2tob entopf3 en2t1os 2entö en4ts 1entsc 1entso 2entss ent2sto 1en4tw 4entwet 3entwic 1entz en1u e2nuf e2num enu2t e4nuto e1nü 4enwü e1ny2 en3zare en2zene enz3erf enz3erg enz3erk enzer2l enz3erm enz3ersc enzi2d enzlan2 enzo2l en4zs 4enzuf 1enzy 2eo eo3a e1o2b1 eo3ben eo3bl eo3bo eo3br eo1c eoch2 e1of eo3g2 e1oh eo3la e3o2ly e1on e3o2nat eon2i eo1o eo2pe e1opf e4oph eop4r e1or e3or. eo1ra e3orb e3o4r3ei eorgi1 e3ors eort4 e3orw eos2 e3os. eo3se e1o4ste e1ou2 eo1ul e1ö2 eö4fe e3ös 2ep2a epa2g epas4ser 2epeg 2eper e3p2f ep4fl eph2 2epia e2pid e4pig e2pik e4pile e3pio e4pip 1epis 2epist 1e2pit ep3le ep4lu 1epoc eport4 epor3te 1e2pos. ep4pa eppe3l ep2pin ep4pl ep2pr 2epr ep4rä ep3sh ep2tal ep2tau ep2tä 2e3pu epu2s 2eq e3qu er1a e3ra. era2c e2r3ach e3rad. e3ra3di e2radj e2r3adm e4radmi e4r3adr eraf4a era2g era3ges e1rah e1rai er3aic e3rake era4ku e1rald eral2eb er3alke e2r3all era4mat er2an. era4n4a eran3d4 e3rand. e2rangr e2ranh e2rano e1rap er3apa er3apf er3apo e2rar er3are e3rari era2rie e3ras. era2si era4sie era4sp era4s3s era2ß era3te. e2ratel e3rativ e1raub e1rauc er3aue erau4f er3aug e2ra2v e1raw e2r3ax e1raz e1rä er1äf er1äh er1ä4m er1äp e2r1ä4s er1ätz 3erbarm erb2au erb2e er3blo 2erbru erb2sp er1c erche3i er3chl erch2o erd2am erda5me 1erdb 2erdec er2d3en2g erd3erw erdeu2 1erdg erd5rin 2erdy 4ere. er3e2ben e3r2ech er3echs er1eck er1edi ere2dit er1eff e2r1e2h ere3ho 4e3rei. e3reib 1er1eig er3eime e4reink er3eis. er3eisar er3eisb er3eisf er3eisr erei3str er3eisv e4rek er1e2l e2rele ere3lev 2erem 4erem. er1emi ere2mis e2remp 2eren 4e3ren. e3rena eren1e e2rense e2rentn e4r3ents e3renz eren4z5en4d er4eo er1epe 4erer. 2ererb e2r1erd e4rerfo e2rerh e2rerk e2rer2l erer3lau e2rerm 2erern. e2rerne e2rer2o erer2ri er1ers 2erers. e4rersche e2rert 2ererv 2ererw e4r3erze 2eres 4eres. er1ess er1eß er1eta eretri3 er1eul ere3un ere2vid erf2e 2erfir 4erform erf4r 4erfür er2g3are 4ergebi 3ergebn 4ergebü 2ergeha 2ergehä erg3elst 2ergeni 2ergn er2gop 4ergrem erg3s2o ergs4p e2rh 1erhab er3hag 2erhai 2erhals 2erham 2erhas er3hei 2erher 4erhöc er3hu 2eri e2riat e3rib 4e3ric e4r3ico er1id 4e3rie erien1 eri3enb erie2ne erien5s e4rij e3rik eri3k4l 4erin. e2r1ind erin2fo e2r1in2i er1in3k er1inl er1int er1inz e2ri2on e4rir 4eris e2riso e2risr er1ita 3eritr e3riv 2erk. 2erkaj er3ker er3kla 1erklä 2erkm erk3t4 er2kum 2erl. 2erlag 3erlebn 2erln erm2 er3ma 1ermah er3men ermen2s erm3ers er2nalg er2n3alt er2nau er4nene er2nerf er2nerk 3erneue er2nob erno2r ern1os 2e1ro. e1roa er1ob ero2bl ero2br er1of e1rog e1roh e1rok e1rol er3oly e1rom er3omb 2e3ron e2r1oo er1op 2e4ro4r eror2a e1ros 1erosi e3rosit e1rou e2r1o2v e1row er1ox er1oz erö2d 2eröh erö4l er1ö2s er3pl 3erprobu er3rä er5regi 4erren ers2a er5sam ers4ana ersch4 er3schm er3schn ers2el er3s2i er3sk ersma3s2 ers4por er3stä er4st3ers 2erstil er3swi er3sz er2t1ab 4erteig er2t3erf er2t3er2g er2ter2h er2ter2k er2ters ert1h er2tho 4ertö er3trau 4ertru er4ts ert3s2e ert3s2p 2eru eruf4s3 e4r3uhr er1u2m1 er1und e4rundu er1up. e4r3ur eru2t er3ute e2r3uz erü4b 3erweck 6erweib es3ab es2abb e4sabe e3sac es1a2d e3saf e4sall es1ami es2an es4and es3ant esa2ra e3sas2 esa3ss esa5sse es2ast e3satz esa2v es1ax esäs4 es2äu 2es3b esbi3er. e3s2ce esch2l esch2n e4sco e3se. e2s1ec es1ehr esein2s es4ek es2el ese3lam ese4nal ese2neu e3s2enk esen3o es2ens esen3sk esen3th ese4r1u4 eses2k es3e2x 2esf 2esh es3ha es4ham es4har es3he 2esi esi1er e4s3i2k e2s1il e4s3ins e4siso e4sk. es2kat e4skä e4s3ke e4s3kl e4skö e4s3ky es3l 2esm e2s3oa e4sob es1od eso4f e3s2oh e3sol esonan2 eso2r es1ora eso3re es2ort e3sot e3s2ö 2es2p e3s4pal es4park es4paß es4pec e4spers e2s3ph e3s4por es4pru e3spu 2esr 2e4ss. e4ssa es4s1a2g essali3 essau2s 1essay e4ssb e4ssel e4ssent ess2ere ess2erf e4ss3er2g e4sserl ess3er4la e4ssf e4ssg e4ssh e4ssj e4ssk e4ssl e4ssm e4ssn 2e4sso es2sof es2sorg e4ssö e4ssp es2s3pa e4ssr e4sss e4sst es4ste e4ssü e4ssv e4ssw e4ssz 2est e4st. estab4b e2stabs esta3ge est1ak es4tan e2stant e2starb es4ta4s est3asc e3stat e2stat. e2staum es4te este2c este4i es5teil est3eing e4st3eink e4st3einl est3eint este2l e4stele e4st3emi e4st3eng e5stens est3entr e4sterei est3ergi est3erha e4ster2ö estes2 e4st3ess e4stf e3sti e4stid e4stip e4stm estmo4de. 3estn e2stod e2strad e3strec e3strick est3ums est3urk e3s4tü e3sty e3suh e2s1um es2und es1ur esu4s es4ut 2esw e3sy e2ß1el e2ßent eß2e3r2e e2ß1erg e2ß1er2l e3ta. etab4 et2a2c 2e3taf 2etal etal4li4n et1a4mi e5t4an. e3tas et2ast et4at etat3r et1äh 2e3te ete2e e4t1ef e4t1ein ete3ke eten3d2 ete2o eter1ä eter2hö eter2tr 2eth. et2ha et3hal e3the et2hi e4thik 3ethn et2hu e4t1i2d eti2m eti3na et1ini et2it eti2ta eti4th 2eto e2t1o4f eto4n3al et1orc e2torg 2etr et3rad e2traum et3rec e2t3res et4ros ets2c etscher5e etsch3w et2s3pe ett1a et2ta2b et2tad et2tak etta4m ett2as et2tau et2tä et4tei ette4n1 et4th et4tö4 et2t3r et2t1um et4tur et4tü4 3e2tui e3tur etwa4r ety2l1 1e2tym 2etz etze4s5 et2z3w eu1a2 eu3b eub4r 2euc euch4ta 2eud eudi4e eu2eb eue2r3ei eueren2 euerer4s euerer4t eu3eri euer2ri eu2esc 2euf eu4fer eu2g1a euge2mi eu4gense eugin2 eugin4f eu2ging eu2gre eu2gri eugs4 eug3sp eu3h eu1id eu1in 1eukal eu2kä eulan2 euland3 eul2e eul2i 2e1um e3um. eu3m4a euma3s2 e3umb e3umf e3uml e3um2s eum4s3p eum3st e3umw 2eu2na eun2e eu4nei e3un2g eu2nio eu4nis eunk2 eun3ka eu1o2 eu3p e1up. eu4pd eup2f e3u4pg eu4r1an eu2r3ast eura3t eu2rau eur1c e2ure euren2 eu2rens eur4er eurf4 1euro eu4rs eur2so eus2 e3usar eusch2o eu4sk eu3sp eu3s4s eust4 eu5ted eu3tem eute3r2e eut2h 1eu3tha eut2i eu3t2o euts4 eut4schn eut4schr 2eux eu1y eu2za euz3eic eu2zo eu2z3w e1ü e3üb e2vak e3var 2ev2e eve5ri evie3le 2e3vor ev2s ewä2s e2we. ewei4sc ewert2 ewer3te ewi2s e3wit 2ex. 1exa4m ex3at 2exc 2exd e2xel ex1er 2exes e1xi 2exik e2xil e2x1in e3xio 1exis ex3l 1exp 2expu 2exs 2ext. 2ex2ta ex2tin 1extr 2extu 2extv 2exu e2xum 2e1xy eyl2 ey2n ey3no eys2 e3z2a ez2ä e2z1enn e3zi ezi2s ez2o ez4wa ez4wi ezz2 é1 é2e égi2 él2 élu2 ém2 ér2 éu2 éz2 è1 2ët ê2t 1f 2f1abb fa2ben 2fabf 2fabg 2f1a2bl 2fabn f2abr 2f1abs 2fabw fa2cheb fa2chel fa2ch1i fa2cho fachs4 fach3sp fa2ci fa2dan fa2del f4aden f1ader fa2di fa2dr fa3e fa4eli 2faf fah4l3ent fai3b f1a4ka fa4ke f3aktio f4akto f2aku fa3l2a fa3le fal2kl fal2la falla2g fal3le. fal2lei fal4lenk fall3ent fal2ler fall3er4s falli4 fal4lini fal2lis fal4scha fal4schei fal4schl fal3te fal4tei fal2tr 3fam fa4mei 4f1amp f1amt f2an. fa2nar 2fanb fand2a f2anf fan2ga fan2gr 2f1an3k 2fanl 4fann f1anp 2fanr 2fanw 2f1an3z 2f1a2p f2ar far2b1a far4bel far2b3er far2bin farb3l far2bo far4b3r far2b3u f3arc 3fa3ri farm2e far2r1a farre2 far2rec far4reg far2rh 2f3art 2f3arz 3fas. fa3s4a fa3sh f1assi fas4t 2f1a4str fa2ß f1aße f3at f4at. fa2to f4ats 4fatt fau1 2f1aue 2f1auf f3aug fau2s f1ausb faus4t faust3r 3fav fa2xa 3fä1c fäh4rin fäh2ru f1älte 2fäq 3färb 2f1ärm 4f1ärz fä4ss fä6sser2 fä2ßer 2f1ätz 2fäug 2fäx 2fb2 fbau1 fber2 fb4re 2f1c f3ch 2fd2 f3da fdien2e fd4ri fd4rö f3ds 3fe. featu4 f2ech fech5t2e fe2del fe2dr fe2e1i feein3 fe1em 4f1e2he fehle2 feh2lei fei3le f2eind fe3infr 2f1eing fe3ini fe3ins. 2f1einw f1eis fek2tin fek2t3r fe2l3a2 fe2l1ä fel2da felde4m feld2er fel2dr feld5ri 2fe2lek fe2l1er fe2les fel3la fel4lan fel2lä fel3le. fel3les fe2l1o 4fel4tern felt4r fel3tu f2em. 2femb fem4m 2femp 3fen. fen3a2 fe2nä fend2a 4fenerg fene4t fe2ni fe2no fen3s2a fens4c fenst2 fen4stri f1ent fen3t2a 2f3entf f2enti 2fentla f2ento 2f3entw 4f3entz fe2nu 3fep fe4pi f2er. fe2r3a2d fer3al fe1ran fe2rang fer2ant fe2ranz fe2r1ä 2ferd. fer3da fer3d2e1 2ferde. 2ferden fe2r1e2b fe2rec fer2ei 4f3ereig fer3eis fer3ell fe3rerf fe2rer2g fer2fah fer2fol ferg4 2fer2geb f4erges f4ergr feri2d ferie4n3 feri4on fer2leb fer3m f2ern. fer4nei fe2rö f4erpa f4erpf f4erpl f4er5ra fer2reg ferri2 f2ers. fers4t f2ert fert4r f2erz fer2zeu fes3s2e fes4t fe2sta fest3a2b fest3an fe4st3ei fes6tel fester2 fe4stin fe2st1o fe2st3r 2f1e2ta fe4tag 3fete fe2th fet4t3a fetti3s 2feu. feuer3ö 3few 2f1ex fe1y2 3fez 2ff f3fa. ffa2b ffa2ce ff1a2d f3fak f3fal ff1alt ff1ans ff3ar ff4arb ffa4s ffa2t ff1au ffa4z f2f1e2b f2f1ef f2f1ei ffe3in. ffel3l ff1e2m f2femi ff2en ff3erle ffer3z f2fetz ffi3k f2fil ffi4xi ff1lag ff3le ff3li ff5lon f3flü ffo2 ff1ori ff1ox f2fö f3f4rä ff3ro ff4rü ffs2am ff3sch ff2s3p ffs3tie ffs3tut ff3stü ff3t2 ffus5s 2fg2 fgeb2 fge3s2 f3gh fglim2 f3gü 2f1h2 fh4eu f3hu fi4ak fi2ar fi1as fi3at fiden2 fi2do f2i2e fi4eb fie1i fi1er2f fi4es 2fif fi2g3r figs4 fi2k1as fi2kel fi2kin fi2kn fi2k1o4 fi4k3r f2il fi2l3an fil3d fi2les fil2et fi3li fi4lin fil2ip fil2ma fil2mä fil2med fil2mei fi2l1o 2f1im fi4mi 4f3imp 3f2in2a fin2e 2f1inf fing2 fings4 2f1inh fi3ni fin2sp 4f1int 4f1inv fi2o fi3ol fi2r fi3ra fi4re fir3me fi3s4a fi2sch3a fi4schei fisch3o fi2schr fi2sch3w fi3s2h 2f1iso fis2p fite2 fi2tin fit1o2 fi2tor five4 fi2xel fi2za 2fj f2jo 2fk2 fka4t3 fk4ne f2l2 2fl. f3lad f5land f4lans f3lap f4lasc fl4at f3lat3s flauma2 3flä f4läc 4f3läd 4fläh 4f3län 4flär 4fläß 4f3läu f3le. 2f3leb f4lec f4lee 2f5lein flek3 flekt2 f3ler f4lex f3li. 3f4lim f3lind fli4ne f3ling 2f3lins f4log 2f3lon 3f4lop flo5s4ses. 3f4loß 3f4lot flo2w f3lö 4flöf f4lög f4löß f4löz 3f4luc f3luf 3f4lug 3f4luss 3f4luß f4lut flut1o f3lüm 2fm2 f3ma fma3che fma2d fmas2s fma3sse 2f1n2 f3na f3ne fnerz2 f3ni fni2s f1ob fo2be 4fober fob2l 2f3of fo4fe foli3 fo2na fo4nan fon3au fon3dr foni2e fo4n1in fo2nop fons4 fo2nu f1o2p fo3po 4f3org fo3rin for2m3a2g for2mas for2m3ei for2min forni5er. for2sta for2sti 3fortb for2t3ei for2ter5 for2th for2t3r fort3s2 for3tu for2u fot4r 2föf fö4fe 2f1ök 2f1öl 2fp2 f3pf f3pl fp4lu 2fq f2r2 f3ra. frach4tr 2f3rad 2f3rah fra4m fr4an f3rand f3rap f3rase f3rat 3frau. f3rauc 2fräd 3f4rän 2fre. f3rec f3red 4fref f4rei. f3reic f4reie frei3f f4reig frei3k2 4frein freis4 2frek 2f3rep f4req f3resi 4frest 3f4reu 2f3ric fricht4e fri3d f4ri2e f5rieb f5rief 2frig f4ri3k 2f3rin f3rip fr4is f4risc f4rist fri4ster 2f3roc f3rok 2frol 3f4ro2n fro4n1a f4ror f4ros fro2sc f3rot f3roz frös2 f3ru f4ruc f3rü 2fs f3sac f2s1al f2sa2n fs3ane f4s3ar f2s1a4s fsa2t fs3ate f2saut fs2än f2sca f2sce f2schan f2schef f4schro f2scr f2s1e2b fse2ei fs1ehr fse2n fs1en1e f2s1ent f2s1er fser2u fse4t f2s1eta f2s1i2d f3s2ky f2s1o2 f3soh f3sol fs2pa f2s3pas f2sph f3s2pl f3s2por fs2prä f2spre f2spro fs2pul fs3s2 f4st. fst2a fs3tak f2stas f3stat fs3tät f2stäti f2stech fste2i fs3terr fs3th f2stip f2s3tis fst4r f2s3tres fs3trü f2stüte f2s1un f3sy 2ft f2ta. ft1a2be ft1abl ft1af ft2ag ft1ala ft1an f2t1ap ft1a2r ft3att f2t1äu f3te. ft1eck ft1edi ft1eh fte2he ft1eig ft1ein ft1eis ft1eli fte3ma ft1emi f2t1ent ft3erfü ft1erk f2t1erl fter2le f2t1erz f2t1eti f2t1ex f2t1h f4t3hei f2t1id f4tim f2t1in f3t2ing fto2 f2t1of f3tor. f2t3ot f3t4ran f2tres f3treu ft4rit ft3ro ft4ru ft5rud ft5ruh ft2s1 ftsa2 ft4sag ft4sam ft3s2c ft4sche ftse2 ftsen1 ft3st ft4staf ft4star fts3tät ft4s3tem ft4ster ft4s3tes ft4stier ft4stor ft4streu ft3t fttra4 f2tum ft1urk ft1url ftü1 ftwa4 ft3z2 ftze3d ftz4w 3fuc 3fug fugi3 3f2uh fuku3 fulb4 f1um1 fu2mei f2umm 2fums fun2d3er 2f1unf 2fungl 2f1u2ni fun2k3l fun2ko fun2k3r fun2ku 4funm 4funr 4funt f2ur furch2 fu4re. 2f3url fus2 fus4s fu3sse fu4sser fuss3p fuss3t fu2ß1er 3fut 2füb fühl2sc fün2 fü2r fü3s2 2fv 2fw fwur2 2f1y 2fz fz2a fzeiten4 fzei4tend fz2ö fz4wi 1g 2gabf 2gabg 2g1a2b3l gab2o gab4ri 2gabsc g2abt. 2gabtr ga3bu 2gabw 2gabz gade2r ga3d2i gadi4e ga2dr gae2 ga3fl 3gag. ga3k ga4kt ga4ku gal2a 2g1alau 2g1alb g1alg gall4e gal3lo 2g1alp 2g1alta 2g1altd g1a2lu ga4mec gam3ma 3g4amo 2g1amt g1a2na 2ganal gan3d2 2ganf 2ganga 2gangeb gan2gr gang4sp gan2g1u 2g1ank 2ganl 2ganmu 3gano ga2nob 2ganr gans2 2g1ansi 2ganst 2ganw ga1ny 2g1anz ga3pe 2g1app 3gar. g2ara 2garc 3g2ard ga3ret ga3r2i 2g3arm ga3r2o 2g1arti ga3ru 2g1arz ga2s g2as. ga4s3al ga4sam gasche2 gase2 ga5se. ga4sei ga4sel ga4se4m ga5ses ga4set gas3pe gas3s4 3g4asse. g3asses 4gassess ga3ssest gas5st gas6st. ga4st3el ga3sti ga4stin gastra4 ga4stras3 gast3rä ga3stri ga4strom gas3tu ga3su ga3t2a 2gatm gat4r gau1c 2g1auf 2g3aug g2auk gau5ne 2g1au4s 2g1aut ga3z 2g1äp gär3th 2g1ärz gä3s gä5ste 2g1ät gä4us 2gb2 gbau5s g3be gber2 gbi2 gb4ri 2g1c 2gd g3d2ad gda3de g2d1ak g2d1an g2d1au gdä1 g2dei2 gd1els g2dent g2d1er g2d1et g2d1in g2dop gd3re gd4ri gd3ru gd3s2 gdt4r ge3a2 ge4at. ge4ate geb2a 3gebä ge4bb 3gebi ge3ble geb2lin geb4lo gebot4 ge4bt 3gebü ge1ch ge1e2 ge3ec ge2es geest3 ge3fa 2gefak 3gefä 4g1eff gef4l gef4r gege2n gegene4 ge3g2l geg4r 3geha 3gehä geher3l ge3ho ge4hs ge4ht ge3hur 2g1eid ge4ie2 ge4ig ge1in ge2inf gein2h gein3i 2g1einr gein2s gein2v ge1ir geis4 2g1eise gei3sh geiss3c gei2sta geist3r ge4iz 2gek. ge2lanz gelb1r gel2b3ra gelb5s 3ge4ld gel2den gelder2 gel4derh gel4ders ge3lec ge2lef 2g3e2lek 2gelem gelen1 ge2lene geler3l geler3ö ge2l3ers ge2l1ev gel3f gel1i4m gel3l2a gel3le gell2i gel2ö gel3s2a gels2p gels4t gel3sz ge4lt gel2ta gelt4r gel3z4 gem2 ge2ma. ge3mau gem4e 4g1emp gem3s ge3mu ge3na ge4n1ac ge4nad ge4nak ge4nal ge4nam ge4nap ge4nar ge4nat 2genda. gend3in 2g3endmo gen2dr gen2eh gen3eid 2generg ge2n3ern gen4erwe gener2z ge2nim gen3k4 genmas2 genma5sse gen3n 3geno ge2noc ge4nr gen4semb gen3sk gen3sz gen3tä 2gentf gen3t2h gen5tr 2gentw ge2nun genzma3 genzmas4 ge1oo geo2ri g2ep ge5pfi ge3pl ge3po ge1ra ge2ra2b ge2rak ge2r3al ge3rann ge2rant ge4r3a2r ger2as ge4rb 2gerdg ge3rem ge2rene ge2reng ge2ren2s ge2r3ent ger2er gerin2d gerin4f ger2inn gerin2t 2ger2klä g3erlas 3g2erlä germas4s ger3no 2g1ernt ge1ro ge2rob ge1r2ö 4g3erprob ger2sat 2g3er2seh ge3r2u ger2zeu g4es. ges2c ge4sche. ge2s1eb 2g3e2sel. ges3elt ge2s1er ge3sha ge3s2i ge3so ges3s2a gess4t ges5ste gest2 gest4a gest4e ges3th ge2s3tur ge3t2a g1etap ge2thi ge5trei ge3t4u 2g1e1ul ge3unk ge1urt ge3u2t ge3we 2g1e2x 2gf2 g3fe gfi2l gf4rü 2gg gga2t g3ge gge2ne gges2 gge3sa ggi3e gg2l g3gla g3glo g2g3n gg4re gg5re. 2g1h gh2a 3ghale gh2e 3g2het 3g2hie gh1l gho3re 3gh2r ghs2 g2hu gh3w gi3alo gich2 gicht1 gi2e gi4eb gie3g gie1i gie3l giel2a gie5n2e gi4eno gi3ens gie3res gi3ern gies4 gift5s gi2gu gi2kel 3gime gi2me. gi4mes gi2met 2gimp 2gin2d gi3ne 2g1inf 4gingeni 2gin2h g1i4ns gin2sa 2ginsf 2g3int 2gin2v gi2ob 2giok 2g3isel gist4 giste4 git2a gitt2 gitt4e gi4u3s 2gj 2gk2 gk4ne g3ko gl2 2gl. 2g1lab 2g1lac 2gladu 2g1lag 2g1lam 2gland gla2s1c glas3p glast4 gla4str gla2stu gl4at 3g2laub 2g1lauf 2gländ 3gläs g1läß 2gläuf gl3b g2le 2g3le. 3glea 2g3leb g3lec 3gled g3lee 2g3leg 2gleh g4leic 4g3lein glei4str gleistra4 gleiter6sc glei4t5r g3len 4glenk 4g3ler glerei2 2gles 3gles. g3lese g2lia 2glib 3g2lid 3g2lie 4g3lieb 2glif g2lik 4glil g2lim 2glin g2lio 2glis g2lit g3lite g2liz g3lize g2loa g2lob g2loc 2g3loch g5loks g2lom g2lop 2glorb 2glos g2lot 2glöch 2glös 2glöw 2gls g1lu 2g3luf 2gluk 2g3lun g2lut 3g2lü g3lüg 2glw 3g2ly 2gm2 gmen2tr gmi2s g1n 2gn. g2n2a g4na. 2gnac g4nad 2gnah gn4al gna2ler3 2gnanl 3g2nä 2gnb 2gnc 2gnd gn2e g3neh 2gn3ent gne2tr 2gnf 2gng 2gnh g2nie g2nif g4n1in 2gning 2gnint 2gni2s3 gnise2 2gnk 2gnl 2gnm g2no1 3g4non g3not 2gnp 2gnr 2gns 2gnt 2gnu 3g2num. g2nü 2gnv 2gnw g2ny 2gnz 3go. go2a go4al goa3li g1ob gobe3l 2go4bj g2ob2l go4bs go4ch goe3 2g1of go4fe 2gog go4gh 2g1oh2 goh3ren go1i2 gol2a gol2da gol2fr go4mn 3gon. go4nat go4nd gon2e 3gons 3g2opa gopf4 go2pos 2gopt gor2a 2g1o4rd g1org go4rt 3gos go2si go2sp go4ss 4g1osz 3goß go3th go4tt got4terb got4t3erg 3gou go1y gö4fe g1öl 3göt 2gp2 g3pf gp4fu gp4la g3ps g3pü 2gq g2r2 g4rab gra2ba gra2bi gra4bl 2g3radl 2g3rah g3rai 2g3rak gr4al gram1 grammen4 gram4m5end gram4mer g3rand g4rande 2gra2r grar1e gra3rie gra4s3a gra6shi gra4sp gra4str 2g3raub grau5f 2graum grau3sk 2gräd g3rän gräs5c g3räu 2gre. g4reb 2g3rec g3rede g4ree 2g3ref gre2fr 2grege 2g3reic grei4fr 2g3reih g3reim g3rein g3reit 3g4rem 3g4ren 4g5renn gre3no gren4z3ei grenz3w g4rer 2g3rese gres4ser g3ret g3rev 2g3ric gri2e 4g3riem g3riese 2grig gril2la 4g3ring 4g3rinn gro2b3a gro3ber gro2bl gro2b3r grob3s 2groc 2groh 2g3rol gr4om gros4 2g3rose g4ross gro3sse. gro5ssen. gro5sser. gro5sses. g4roß g4rot 2g3röc 2gröh 2gruf. g4ruft 2g3ruh g3rui 2g3rum grunder5n grun2g 3grup grus2s gru3sse 4g3rut 2g3rüc grüs2 2gs1 g2sa2 gs3ab g3sack gs3a4k g3sal g4s3alb g4sall g4salm g4salt gs2am g4s3ama g4s3amb g4s3amp gs3a4p gs3ar g3sat gsa3te gsau2g gsau4r g2sä gs4ät g3säu gs2c g4sca g4s3ce gsch4 g5schal g4schef g5s4chi g5schn g3schu g5schü g4scl g4s3co gs3d gs5dor g2se2 gs2e3h g5s4eil gse4kl g3sel. g4sela g3seln gs3em gsen1 g5seni gs2enk g4ser g3sere gser1i g4se4s gse4t g4seu gsfi2l gsh2 gs3ha g2si gsi2d g3sig gs3i2k g3sil g4s3io g4sis g4s3ita gs2ki1e gsmas4sen g2so2 g4so4b gso4f g3sol gs4on g4s3op gs4oz g2sö g2s3p gs4pac gs4pant g5spei g3spek g4spf gs4pir g4spl g3s4port. gs3s2 gss4t gss4w g4st. gs3ta g2stab g3stad g2staf gst1au gs3tä g2stät g4stee g5stein gst2el g5stell g4s3temp gste2r g4sterei g4sterm gst3err g4s3test g5steu gs3th gs4tha gs4thy g3sti gs3tier g4stis g3sto g4stoch g4stod gs3top g4s3tor gs3tot gs3tö g5stör gs3tr gs4tras gst3reit gst4res g2streu gst3rit gst3ros g2stru gs3tu gs3tü g2su gs4uc gs3un gsü3s g3sy 2gt g3te gt1h gt2hy gt2i gti2m g3to gt4ra gt2se gu4ale gu3am gu1ant gu1as gu4d3r gu2e 2gued guet2 2g1uf gu4fe 2g1uh guil3 gu3ins gu1i4s gum2e 3gumm gummi1 gun2e 2g1unf gunge2 2gungew 2gungl 2g1u2ni 2g3unk 2gunr 2gunt 3gur gure4 4g1url gur2t3h gur4tr gurt3s gu4s3a gu2sä guschi3 gus3se. gus3ses guss1o gus2sp gus4s3t gust3a2b gu2stap gu4stein gu4st3en4d gu3sti gu2str gu2ß1 gußt2 gu2t1 gu3te gu4ter2h gut2s3p 2güb 3gür3 2gv 2gw gy4ar gy3n gy4na 2gz2 gzeu2gi g3zh 2ha. hab2a hab2e hab2i h1ablu 2habn h1a2br h1abs 2habw ha2ch3en ha2cho 2hada ha2del hade2n h1adle h1a2dr ha3dri 2hae ha3el ha4far haf2e h1affä haf3f4l h2aft haf2tr haf4tre haft4s3p hag2a h2agg ha3ha h2ahs h2ai 3hai. h2aj 2haka ha4kes ha3kl 2h2al. ha3l2al halan2c h1a2lar ha2lau hal2ba hal4bel hal2bin hal2b3r hal2bu 2hale 2halh hal2i 2halk hal2lei haller2 hal4leu hal4lo2k ha3lo 2halp hal2sp hal2tal hal2tei hal2t5r hamot2 hampi4ons 2h1amt h2an. 2hana ha2nal ha2nan han2au 2hanb h2anbe h2and han2da han3den han2d3er han2d3r ha2nem hanf1 han2fl han4g3end han2gro hang3s3 han2k1 2hanl 2hano 2hanr 2hanz hao2s 2h1ap 3h2ape ha2pl ha2po ha2pr ha3ra h1a4rab 2harb 2harc h2ard har2fr h1arm. har3ma h2arme har2me. har4ne ha2rom 2hars har2th h1arti h2arts har2za h2as 2has. 2ha3sa has4c has4h has2p has4sa has2ser2 hass3t has6sti ha4str ha2ß1 h1aße ha2ta hat2i h3atl ha2t3r 2hats hatt2 h1audi h1aufb hau3f4lie hau3f4lo 2h1aufm h1aufs h3au3g2 h1aukt hau2sa hau4san hau2s1c h2ause hau2sel hau4s3ent hau2spa hau2spe hau4ss haus3sen4 hau4s3ti hau2sto hau2sur h2aut. hau2t1a hauten4 hauto2 hau2t3r ha2ve. havil2 häde2 h1äff 2häi hä2kl 2h1ärz hä4s5chen hä4ss 2h1äst 2häug häu2s3c hä3usp 2hb2 hba2ras hber2e hb4ri 2h1c 2hd2 hdan2 hdä1 hd4ri h3ds 2hea he2ad he3as he3be heb3eis he2b3l he3br he3bu he3ch2e he3chi he1cho h3echs hed2g he2dit he1e4m he1e2n he2en. hee2s he1e2t h2ef. he3fab he2fan he2fau he2f1ei he3f2em hef3erm 2heff he2fid he2f3in2g he2f5le 2hefr hef4ra he2fre 3heft he2fu he3gu he2hel hei4a h4eib h1eie h1eif hei4fr h1eig he2im hei2mal hei2mei heim3p hei4mu 2hein hei4na heine2 hei2n3eb hei2neh hei4nene hei2n3er2 he2inf h3einsp 2heio 2he1ism heis4s he1i4st h2eit he3i4ti heit4s3 h1eiw hekt3a he2la he3lag hel1an hel3au hel1ec he2lek h3elem he2len h2elf he3li hell2a hell3au hel2lic helm1a hel2man hel2mei he3lo he4lof hel2or he2lö 4helt h4em. 2hema hema4s3 hem2b 1hemd 2heme2 h2em2i he3mid h3e2miss 1hemm 2h3emp h2en. he4n3a2 he2nä hen3ebe henen1 hen3end he4nene he4nens he4nenz hen3erg he2nerm he2n1e4t 2henga hen2gag hen2kan hen2kau 2heno heno3t hen2sem hen3st2 hent2a hen2ter hent4ra h1ents 2h3entw h3entz he4n3u hen3z2 2he2o he3on he3op heori2e he3pa he3ph h1e2pi h1epo hept2 h2er. her3a2b he2rad 2herap he4r3a2r herau2 herb2 her3c her2dri h2ere he2r1e2b he2reck her2eif 2he3reig herein3 he4reis. her5eises he2rel he2rene herer3s he4rersc he2rerw h4erfam h1erfo her2fol herg2 4her4gebn heri2e 2herif herin2d herin4f he4rin4nu herin2s herin4ter h1erke her2klä h3er4kran h4erlad 2herm herma3s h1ernt he3ro he4r3o4b he4rof he4rop he4rot h1erör hers4t her3sta hert4 her3th her3um he2rut h1erwä her2zap her4zeng her2zer h3erzeu her2z3w he3sa 2hese he3si hesi2e he3s4p hes2ser he2tap he3tä hete1 heter2 he3th het2i he3t2s he2u heu3g h3eule. he3unt 3heusc he3x he1x4a he4xd he4xk he4xl 2he4xp he4xt hey2 he1ye 1hè 2hf2 hfaller4 hfan2 hfel2l3 hfi2s hf4la hflei2 hf4rü 2hg2 h3ga hgas1 hga4sen h3gr hg4ru 2h1h2 hhoh2 2hi. 2hia hi2ar hi1as h1iat 2hic hi1ce hich4t3er hicht4sp hi3d hi4db hi4dd hid4e hi4dio 2hido hi2e hi3ens hie2rei hier3i hie2rin hiers2 hif3f4r hi2k3r hi2l3a4 hi3l4au hilen2 hil2fr hili2e h2im 2hima h1imb h3i4mit h4imm h3impe h3impl hi2n hi3nak hi3n2am hi3nap hi5n2as hine2i hi3nel hin2en h1inf h1inh 2hi3n2i hin3n2 hi3n2o3 hin2t1a 2hio hi3ob hi4on hio3p hi2p3 hi4pl hi4pu hi2r hi3ra hir3b4 hi3re hi3ri hir2m1a hir2mi hirn1 hir2ner hir2s 1hirt 2his. his2a hi2se h1i2so his2p hi2spa hi3tac hi3th hi3t2i hit1r hit3z2e hi2v1o 2hj 2hk2 hkamp2 h2keu hki2n1 h3kl hklat3 hklo3s hk4ne hk4re 2hl hl2ag hla2gr hlam4meng hlan4d3a hl1anz h1las h1lat h1laut h1lay h3läche h3läd h4läf hl1är h1läs h1läß h1läu hlb4l hl3d2 hld4a hld4r h3le. hle3a h3leb h3led hle3e h2leis h3leist hl1el h5len. hle4nas hl2enn hl3entr h2lents hl2enz h3ler hle2r3a hl2ere h2lerg hler2hö hl2erk h6l3er2nä hle3run hl1erw h4lerz h3les h4lesi h4leud h2lie h3lied h2lif h2lim hl1ind hling4s h2lip h2lis h3list h2lit1 hl3l2 hlle3b hl3m2 hlma3s2 h2lo hl1ob h3loc hl1o4f h3log h4lor hlo2ra h5lorb h3los. h3losi h4loss hlos4st h4lo2ß1 h2lös3 hlö4ss hl2sal hl4sar hl2ser hl3ska hl3slo hls4tec hls3tie hl3str hl2su hl3t2 h3luf h3luk h3lumpe h1lüf hlz4w 2hm h3mad h3mag h3m4ak h3man h2mant h3mar h4marc h3mas hma3sse h3maß h3mä h4mäc h4mäh h4mäl hm2e h3me. h3med hme1e4 hmeer2s h3mein h3meise h3meist h3meld hme3le h3men hmen2s hmen4s3p hme2ran hme2rei hm3estr h3mex hmi2e h3mind h3mirr h3misc h2mo h3mop h3mot h3m2ö h4mök h4möl hm3p2 hm2s3p h2mu h3mul h3musi hmut4s h3my 2hn h2na h3nag h3nam h4nar hn3a2te h4natt h3nau. hn1äh hn1är hnä6sse hnbau3 hn3d hnd4r hn2e hne3b hne2e3 hn3eff hn3eig hn3ein h2nel hne4n hn4eng hne4pf h3ner hner2de hner3ei h4n3e2ro h4n3ersa hn3eur hn3ex hn3f2 hnf4l hnflei4 hnhof6stra6s h2nic h2nid h2nie hn1im hn1in h2nip hni4sa hnk2 hn1ob h2no2r hnra2 hn3sa hn3s2p hnst2 hnsuch2 hn2th hntra4 hnts2 h2nul h2n1unf hnz2 h4oben ho3bern ho2b3l ho2c hoch3 2hocy 2hod 2ho2e hoe3n ho3er ho4f3a4 ho4fä ho4fed ho4feu hof3f4a hofi4 ho4f3l ho4f1o ho4f3r ho4fu ho4fü 2hoi ho2l1a hol3ar hol3dr 1hole ho2l1ei ho2lem hol3g holin2 hol3k holl4 2holy h3olym 1holz hol4zene hom2e ho4me. ho4mec ho4med ho4mel h2on hond4 hon2er honi2e ho1on hoo2r 2hop ho2pe ho1ra ho2rak h1o2r2an ho2rau h1or3d 2hore ho2rens ho3ret hor2fr 2h1org hor3ta hor2ter h1ortu h2os. hos3a ho3se2 ho4sei ho3sl ho4sla 2hosö hos4t ho2str ho2ßene 2hot. 2hotr 2hot3s2 ho3un 2ho2w1 ho3wer h1ox ho1y2 2hoz 1h2ö 2hö. hö2c 2höe 3höhe hö2s1 h4ösc hö4ss hös3se h3ö4st 2hp2 h3pf h3pu 2hr hra2b hr3ac hr3ad hr1a2g h1r4ah h1rai h3ramp h1rane hr3ap hras3s hrau2c h3räu hr1c hr3d h2rec h3r2ech h3red h3ref hr3eff h2r1eh h4rei. h4reib hrei2ba hrei2br h3reic h3reif h4r3eig hr2eini h2reinl hrei3th h4r3ele hren3z h3rep hrer2fo h4rer4geb hr2erh hr2erk h4rerla hr2erle h4rer4leb hrer2lö hr2erm hrer2sa hrer3st hrer2tr hrer4trä hrer4tüc hr2erw hr2erz h3re2s3 hres5s4 hrest2 hre2t h2r1eta h2r1eu h2rev hrg2 hrga4 hrgu4 h2ri h3ric hri2e h3riesl h3rin hr1int h4rist hr3m2 h3rog h3roh h3ro2l h4romat h4rome h4romi h4romo h4ron h1ropa hro4r h3rou h3rö2s hr2s1ac hr4s3and hr4sau hr3sch hr2s1em hr2sen hr3sena hr2s1er hr2set hr4sh hr2sin hrs3k hrs3l hr2s1of hrst2 hr4stec hr4stele hr2su hr2tab hr2tan hr2te2l hr2th hr2top hrt3ric hrt2s hrt4ste h3ruh hr1ums h3rus h3rut h3rü h4rüb h2ry hrz2 2hs hsa2b hs3acht h2s1a2d h2s1alk hs2alt h4samt h2san hs3and h3sann h2s1as h2sath h2sato h2saud h2saut h2säh h2säug h3sc h4schan hs2cr h3se. h2s3ec hse2e h2s1ehr h2s1eie h2seind h2seins hsela2 hse2lin hs1emi hsen3erg h2s1ent h2s1erb h2s1erf hs1erg h2s1erh h2serkl h2s1erl h2s1ern h2serö h2s1ers hser2u h2s1erw h2serz h2sex h3s2ext hsha4k h2s1i2d hs2im h2s1ing h3s2inni h4s3ita hs2kal h3skand hs1of h2sofe h2sop hs1or hs2p h2s3pac h2s3pani h2s3par h2s3pat h3spei h2sper h2s3ph h2s3po h3spoi h2sprä h2spro hss4t h4st. hst2a hs3tabl h2staf hst3alt hst3arb h2s3tau h2stäl h2s3täu h4stea h4stele h4sterm hs3the h2s3tier h2stin h2stit h2s3tol h2s3tor h3stö hs3treue hstro4 h2s3tu hs4tub h3s4tun h3stü h2s1u hs2ung h3sy 2ht ht1a h2tab hta2bl h2ta2d ht2ag ht2akt. ht2akte ht2al h2t3all h2talo h2talp h2t3alt hta4m h2ta2n ht3ane h2tap h2ta2r ht2as h2t3asi h2tasy h2t3at h3tat. h3tate h2tau h3taum h4tax ht1ä h2tär h3te. hte2ber ht1ec hte3cha hte2d h2t1ede ht1eff ht1e2he h2teif h2t1eig h4t3eilz h2t1eim ht1ein h2t1eis h2t1eke ht3elas hte4l3ei. h2telek h2t3elfe h2telit ht1e4mi h2temp h3ten. ht3engl ht3en4ta h2tentf hte3rel hterer2 h2t3erfo ht3erfü h4terfül h4tergeb ht3ergr ht1erh hter4häl hter4höhu h2terkl h4terleb h4t3erleu h4terneu h2t3ernt h4ter4prob hter4reg ht3erspa hter4spar ht3er2st h4tersta ht4erstr hter4tra ht3erwä h2t3erze h2t1ese h2t1ess h2teta hte4th h2t1eu h3teum h3teun h2textr h2t1h h4thei h3thera h3thes h4thi h4tho h2t1i2d h3tig h2t1im h2t1i4n3 ht3ine h2t1is h3tisc hti3t2 htni2 hto2 h2t1ob htod1 h2t1o4f h2t3oly h2ton. h2tope h2tord ht3rak h3tran ht3rand h2t3ras ht4rates ht3rau h2traub ht4raume ht3rec h5treck ht3rei h2t3res ht3ric h2t3rieg h2t3rin h3trit h2t3riv h2t3rol h2t3ros h2t3roß ht3röm ht3ru ht2sah ht2sal ht4s3a4n ht2scr ht2sein ht2sel ht2s3end ht2seng htse2r1 hts3eri htsha4 ht3shak ht4s3kr ht2s1o ht2sp ht3spen ht3spre hts3tät ht4s3tem hts4tie ht2stip hts3trau ht2stri ht2s3tur ht2s3tür ht2su htti2 htt4r htu2e h2t1urs ht3z2 hu2b1a hu2bei hu4bel hu2b1en2 hu2bi hu2b3l hu4b3r hu2bu hu4fa hu2h1a hu2h1i hu2ho h1uhr h1uhu hu2kä hu2k1in huk3t2 hu2l3a2 hu4lab hu2lä hule2 hu2l1eb hu2l1ei hu2lem hu2l3eng hu2lent hu2l1er2 hu2let hu2lid hu2l1in hul3l2 hu2lo hu2l3ö hul3s2 hu3m2a h1umh h1ums hu2n h1una h2und hun3d2e hun2e 2hunf hung2 hun3ge h1uni 2hunt h1ups 2hur hur3g2 hur2t3h hu3sa hus3h hu2so hus2s3a hus3se hus4ser2 hus2s1o hus2sp hus4st hu2ß1 hu2tab hu2ti hu2t1o hu2t3r hut2t hut2zen hut2z3er hut2zu h2ü h3über h4übs h3übu hüf2 hüft1 hühne4 hüs6tel 2hv hvil2 2h2w2 h4wall hwe1c h3weib hwei4fr h3weih hweins3 hwein4sa hweis4s hwen2ka h3werbu h4werp h4wirr h3woh 1hyd hy2de hy3dr hy2lor 1hymn h1yo hy3os 1hyp hy2pe. hysteri4e 2hy2t 2hz hz2a h3z2o hzug4 h3zw hz4we iaa2 i3ad. iad2a i1adn ia3do ia3e2 ia3f4l i2ago ia1h2 i1ai i3ak. i3ake ia4kei i1akt i1al ia2l1a2 ial3ar ial3as ia2lä ial3b4 ial3d4 i3aleb i3alef i3alei ia3lek i3alel i3alemp i3aleng i3alent i3alep i3alerb i3aler2f i3alerh i3a2lerm i3a2l1et i3alex i3a2lia i3alim i3a2lin ial3l ial4ler iall2i ia2lon ia2lop ia2l1o2r ial3p ial3s ial3t2 ia2l3u2 ial3z4 i3am. iampe4 i1ams i1an. i1an2a ia2nal ian3alt ia2nau i1anc i3and2 i1a2n1e2b ia3n2er i1ann i1ans ian2s3p i3ant i3anz ianza4 ia1o ia2op ia3pf i1ar i3ar. ia2ra i2are 2ias i1as. i4asc i1asg i4a3sh i2asi i1asm i4aso i4a3s2p i1as3s iast4 i1ast. i4asu i4asy i3at. i3at2h i4athe 1iatr i3ats i3au ia3un iau2s3 i2az 2i1ä iä4mi i3är. i3ärz i3ä4tem iä2ti iät3s2 iät5sa 2ib ib1art i2b1auf i2b1aus i2baut ib3be ib2bli ibe2i i2b1eig ib3einh i2b1eis ibel4u iben1 ibe4na i4ber4geb i2b3er2la ibe1ro i2bim i2b1in i2blad i2bläh ib3leis i2bleu i3blu i3b2o i2bö ib3ric i2b3roc ib2ser ib4s5te ib2un i2b3unk i2b3unt ibus3 ibus1c ibus4t 2ic i3ca ic1c ich1a2 ich4art. ich1ä i1che ich1ei ich2er icherin5 ichermas4 ichgro3 i1chi ich1l ich3le ich3li ich6lor ich3m ichmas2 ich5mä ich3n i1cho ich3ort i2ch3r ich2sa ich4sele ich2s1i i4cht ich3terz ich2tr i1chu ich3w i1ci icks2p ickt2 i1cl ic3la ic3ra 2ida id2ab i3d2ac id4al id1a2n i3d2ans i3d4at id1au id2ax idä1 idbu4 id2e i2dea 1idee ide2en id3eis 2idel idel4ä i2demul ide4n1o iden3te ide3ran iderin4f iderin4nu ide1rö id3er4reg i3des ide5sa ide3so ides4p 2idf 1i2di2o idi4on i4diot 2idk idni3 i2dol 2idoo i2dö i2dr id4ro id2sp 1i2dy ie3a2 ie2bä ie2bl ie2bri ie4b3rü ieb4sto ieb4stre ie1c ie2cho iech3t ie2d3an ie3de ie2dr ie1e2 ief3akt ie2f1an ie2far ie2fau ie2fäh iefe2m ie3fer ief3f4 ie2f3l ie2fonk ief1r ie2fro ie2gl ieg3li ie3g4n ie2g3re ieg2s iegs5c ieg6sch ieg4se ieg4si ieg4st ieg6ste ie3her ie2h1in ieh3r2 i1ei iein3 ie1ind i2e2l1a ie3lam ie4la2r ie2läs iel3d4 i2ele iel3ebe iel1ec ie2l3eic iel3eid ie2lek i4elen ie2lene ie2leng iel2erd ieler2e ieler4fi ieler2g ieler6lebn iel2erw ieles2 i2eli ieli2d i1e4ll ie2lo4b ie2lop ie4lor i2els2 iel3sz ielt2 iem2e iemis2 i1en i3ena ien1a2g ie4nas ien3au i3enä i3enbr i2ene ien1eb ie2n1e4k iener4fo iener4la i3enf i3eng4 ienge2f ienge2z i3enh ie2nid ie2nim ie4nin i3enj i3enk i3enm ienma3s2 i3enn i3e2no i3enö i3enp i3enr ie4ns2 i3ens. ien3sk ienst5ade ien4st3er ien4stop ienst3rä ien3sz ien4t3ar ien3te i3enti ien3tr i3env i3enw i3enz ie1o2 ieo4b ieo4f iera2 ie2r3ad ier3al ier3an ie2r3ap ierb4 i3erbun ier3d i2ere ie2reck iere3ins ie2r3eis ie5rek ie3r2er ier3erf ierer3k ierf4 ierg4 i3ergi i4eri ierin3 ierk4 ierken4 ier3l ierma4ss i1ern i3ern. ier3n2a i2erni ie2rö ier4re. ier2s3eh ier3sei ier3sta ier3te iert2i ier3z2 2ie3s2 ie4s3an ie4sb i2esc i2ese ie4sf ie4sg ie4sh ie4sj ie4s3k ie4sl ie4sm ie4sn ies3o ie4sof ie4spu ie5sset iess3ti iest4e ie4sv ie4sw ie4sz ießer2g ie4t1a2g ie2t1ak ie2tan ie2t1ap ie2tat ie2tau ie4tent ie4t3erh ie4t3ert i4ethe iet3her ie2t1ho ie2thy ie2to ie2t3ö2s ie2t3ri ie2t3ru iet2se i3ett iet3zw ieu2e i2e1un ie2w3u i1e2x ie3zo 2if if1ab if1ang if1ar i2f3arm if4at i2f1au if1än i2fec i2f1ef ife4i if1ein i2felem ifel2s3o if2e4n1 ifens4 i2f1erg if1erh if2fa iffe4s if4feste if2f3l if2form if2fro iff2s iff4ste if1ins i2f3l if1lac if4lä iflo4 if4los i3f4lü i2f3r i3fre i4fre. i4freg if4rev if4rö ifrü4 if3sa if2t3a if2ted if2t3ef if4t1ei if2te2l if2tep if2terk ifte4s if2t3esc if4th if2t1op if2t3r ift3sp ift3sz if2tur i3fy 2ig i2ganb i4g1ano i2garb ig1art iga3s i2g3att igd2 i4gebrau i2gefar ige2füg 3i2gel. ige3lau i2geln ige4me ige2mis ige4na ige4nene igener4f ige2nid igen5s ige2o ige2pa ige2ra igerma3 ig3erwer ig1erz ige2sel i2g1ess ige4steu ige4stim ige2tra ige4tre ige2woh ig3hu i2gim i2gl ig1lau ig1lä i3gle i4g3led ig3lim ig4na ig5nah i4gnä i3g4neu ig4no igo3p i2g3rad i2g3re igro3 i2grou igs2a3g ig4sal ig3sä ig2scha ig2schr ig3s2o ig3sp ig4spa ig4sti ig4s3to ig2stö ig4stra4s ig2stur igs4tü ig2t3r 2i1h i2hans i2har ih1auf i3he ihe1e ih1elt ihe4n ihenk4 ihe3u ih3m ih3n ih3r2 ih2s ih3sti ih1um. ih3w ii2 i1ia i1ie i3ig i1im i3in i1is ii4sc ii3t i1it. 1i2js 2ik ik1aka ikaken3 i2k1akt i2k1alb i2k1alt ik3amt i2k1ana i2k1ang i4kantei ikanten4n i2kanth ik1art ik3att i2k1au ik1äh i2k1än i2k1är i2keb ik1ebe i2k1ed i2k1ef i2k1ei ike4l1 ike2n1 ik1en2s ik1ent ike2ra i2k3e4r2e i2k1er2f i3kerfam i2k1er2h i2ker2l i2kero i2ke3ru ike4t i2k1eta i3ki. ik1i2d i3kie ik1in i2kins i2k3l ik4län i3k4leri i3k4let ik4lim i3klu i2kne ik3nu iko3be i2k1off iko3p2 ik1o2r i2köl ik3rä ik3re i2kres ik3rin ik4ris i3kro3 i2krö ik3sa iks2p ik3s2z ik3ta ikt3erk ik2t3esk ik2t3re ikt2u i2k1uh i2kup i2kü i1la i2lab i2l1ac i2l1ak il1a4ma il1ana il1ang i2l1anm i2lano il2anz ilan4zer i2larb il1asp i2l1au i3laub i3l2aufb ilau2s i1lä1 i2l1är 2ilb ilb4l il2c il5chen il2da il2dä ild3ebe il2d3en2t ild2erp ild1o il2dor il2d1r ild3t 2ile il1ec ileid4 il1ein il1el i2l1emb i2l1e2mi ile3ni il1ent i2lentl i2lents i2l1er2d iler2ei il1erf iler2fo i2ler2g i2l1er2h i2ler2kl il1err i2lerri i2l1er2w i3l2erz ile4th il1ex ilf2 il2f3l il2f3re ilf4s3 il2gl 2ilh 2ili il4ia ilie4n3 iliga2 ili2g3ab ilik4 i2l1ind i2l3init il1ins i2l1ip ili3pf il2lad ill2an ill4ant il2lä2 il4lb il2leg ille4ge il2lenn il3l2er il4lm 1illu illu3s il2mak il2m1ap il2m1au ilm1ei il2min il2m1or 2ilo il2oh il4on il2op i2l1o2r i3l2ou i3lov il1ox ils3ent ils4to ilt2 il3th i1lu iluf4 i2lum i2l1ur ilü4b 2ilv il2zar il2zau ilz3erk il2zwa imad2 ima1i im2al im3anh i2mans i2marc im3aren i2m1arm i2m1art im4at ima2tr imat3sc ima2tur im1aus i2maut im3b i2meg im1ein i2mej i2mek i2mele i2melf im2en i2m1er2f i2m1er2l i2m1er2z i4me3sh imes3s4 i2meti i2mew imhau2 i2mid im1i2de i2mim i2m1ind i2minf i2m1ins 3immatr immen1 im2m3ent im2mit 1immo im4mo2d im2mö imni2 2imo i2m1ob i2mop imo3re i2mö 1imp imp2fa im3pf2o imp2s im3pse 2imt imt2e im3t2i imtu2 2imu im2um im1urk 2in. ina2be in3abu in1ac i4nack in1ad i3nald inaler2 ina2lin in2alp i2n1am in2an in3an. in3ana in3ann i5nar. in2ara i2narb inas2 i4n1asb in3att i2n3au2 2inä i2n1äh in1äs 2ind. inda2 ind2ac in2dal in2dan 2indä 2inde. 2inden in2dene inderer4t inder3t inde3sp indes4t 1index in4dh ind2i 1indik in3dö 2indr ind4ri ind3se ind3sp ind4spe 1indus in3d2ü 2ine in1ec i3nee ine2en i2neff in2elen ine2n1 ine3nä i2nener i4nen2zy ineo4 i3ner. i2n3erbi in2erha i2ner2he in3erle i4ner4leb iner2lö i2n3er2tr iner4trä i3nes inesi2e in2et in1eu ine3un i3né in3f2 1infek 1infiz 4inflü 1info inf4r 2infre 2inga in2g1af in2g1a2g in2g1al in2gam ing1ar 2ingä in3gen. 3ingeni in3g2er in4g3er2w 2ingi 2in2gl ingmas2 2ingr 2ings ing4s3am ings4por in4gt 2inhaa 1inhab 4inhaltu 2inhar 2inhau 2inhe 2ini. in2id ini3de 2inie 2inig inig2a ini3kr 2inis ini3se inis4t init2 i3nitz 3inkarn in2k3ent ink4er in2kro inks3t ink4ste in3k2ü inma4le 2inn. in4nas inne4n in2neu in4ni2v 2innl in2nor 1innta 2ino in1od ino3e2 in3ols in1or inos4 i3no3t i2n1ou i1nö in1ö2d 2inr 2ins. ins2am in4samt. in3sat insch2 2inse. in2seb 2insed 2insen 2insk in3skor in4sl in4sm ins2p 3instal in2s3tät 4inst2e 3instit 2instra in2st3ro in2strü 1insuf in2s3umw ins3umz in2sur in3sz 2inta int4e 2inte. 1integ in3tei 2intep 2int2h inthi1 in3ti int2o 2intö 2in3t4r 4inträ 3intrig int3s i2n1u i4nuh in3unz inu3t 2inverm invil2 i1ny2 in3z2e inzel4ler in3z2i in3z2sc inz2u 2i1o io3a ioa4s iob2l io1c io2d io3da io3du io3e2 i2of iof4l i2oh io3k4r i3ol. io3li i3ols i3om. i3oms ion2 i3on. ional3a ion3an io2n3au i2onc ion3d2 io4nee i2onf i4oni i3ono io2nor i3o4n4s3 ion6scl ion6sfi i2on3t i2ony i2o1o i2op i3o4pf iopi3 i3opt i2or i3or. i3orc ior2e iore4n i3org io1r2h i3orp i3ors i3ort i3os. io3sh ios2p i2ost ios2u i2o3sz io3t i3ot. iote3l i4oth iot4r i3o4ts io4tt i2ou i2ov i3ox i2oz i3oz. i1ö2k i1ön i1ös. i1ö4st ip2an i3ped ip4el i3per 2ipf2 ip5fam i3pfan ipfe2 iph2 2ipi ipi3el ipi3en ip4lu ip2pan ip3pe ipp3f ip4pl ip4ps ip3pu ip2sa ip2sei ip2sp ip2sta ip4stü ipt2a ip2ter ipt3ers ipt2i ipt2u 2ipu 2iq i1r2a i3ra. 2i3rad ir4al i3ras irat2 i1rä ir1äh ir2b3l ir1c ir2ch3i ir2ch1o ir2e i3ree 2irek ire4na ir4er i3ré irg2 irg4s ir2i 2irig 2irk irke4n ir2kene ir2k3l irk4sc irk2u irli4n ir2m1a2g ir2mak ir2mä ir2m1ei irme4n1 ir2m1o2 irm4th ir2mum ir4munt 2irn ir2n3a ir4nat ir4nei ir2no i3ro i1rö irpla2 ir2rei irre4l ir2reli ir2rh irs2 ir2schl ir2schm ir2sch3r ir2sch3w ir3se3 ir3sh irt2s3t 2iru ir1u2m iru2s1 iru3te i3r2ü i3sac isa4m3 i4samp i4s1amt is2ap isa2r is3are i3sat is1att i2s3au i2säh i2s1än 2isb i2sca i2sce i2schab i2schan i2schar i3s2che i4schef i4sch3e2h isch3ei ische2m i4schemi i4scher4z i2schin i3sching i2sch3l i2schm isch3ma i2schna isch3ob isch3re isch3ru i2schüb i2schwa i4schwir i2schwo i2sch3wu i2schwü i2scr 2ise ise3a ise1e iseh2a ise3h2i is2eind ise3lad is4eli i4sel4ter ise2n1 ise4nal is2end i2senho isen3s is2ep ise2r3ei is1erg i2s1erh iser2he i2s1erm iser2u i2s1es2s is2et i2s3etat i3seth i3s2eu 2isf 2ish 2isi i3si. isi2a i2s1i2d isik2 i2sim i3sin3g4 i4ski i4sku is3la 3islam 2isma 2ismi ismu2 is1of i3soh 1i2sol 2is4o2n1 iso4nend isono2 i2sop is1ort 3isot i2s1ou is1o2v 2isp is3pan i2spar is3pe i4s3pic i2spro i4ss. i4s3sa is4s1ac is4sau i4ssä i4ssb i4s3sc iss3chen i4ssd is3senk issen4s5tü isseri4e issermas4 isser2s i4sserse i4ssf i4ssg i4ssh i4ssk i4ssl i4ssm i4ssn i4s3so i4s3sp i4ssq i4ssr i4sss i4s2st is3sta is4ste iss6tel is3sto iss3tr is3strä is3stric is3stu is2su i4ssv i4ssw i4ssy i4ssz i4st. i2stab ist3ac is4tal i4stam ist2an i2s3tang i2st1ap is3täu ist2e i4stea i4stec is4te4n ister4ras is4ti ist2id istin4f ist4o ist4ra i2strä i2stre istri3en is3tromm i2stur isu2m isum3p isumpf4 i2sü 2isy i1ß ißer2s iß3ersc i2ßerse it1ab. it1abs ital3a ital3l it1alt it1a4m ita3ne it3anr ita2po it1app itar5b it1a2re it1art i3tat it1au i3tauc i2taut 2itä it1änd i2t1äs ität2 it1eff it1e2he i2t1ei i4teic 2itel ite4l1a i2telek it1emi i2temp ite2n i3ten. itens4 i2tents i2tepo i2t3er2fo iterin4d i4ter4klä it2erö i4tersche i2t1es2k ite3sp i2t1ex i3text 2i2th i4th. i4thä i3thr i4ths i4thü i4thy 1itia i3tic i2t1id i3tig 1itii iti2kr it1in i3tis i4tiso iti3sp i4tiss i3tiv iti2v5a itiver3f it3le itmen2 2ito i3to. it1ob i3toc i2t1of ito2p it1orc it2os 2itr i2t3rad i3tradi it3raf it3ras it3rau it3räu it3re i4tren it4ret i3trie it3rob it3rom i2t3run it3rut 2its it2sa its1a2g it2s1e itse2h its3e2r1 it4sh it4sm its1or it4stec it4s3tem it4s3tes it4stra4s its3trau it2sur 2itt itt3ac it2teb it4temp it3ter itt3erfo itt3hä it2tob it2top it2tri itt4schi itt2se2h itt2sei itt2sp itt2sti itt4sz it1uh it1ums it2ung i2tuns ituran2 it1urg i3tus itut4 ityl2 2itz itz3erg itz3erl itz2erw it2zö it2z3w 2i1u2 i2u3l i3um3 iuma4 iump2 ium4se i3un2 i2up i3us ius3t i1ü iü4be 2iv i2v1ad i2v1a2g i2v1ak i2v1am iv1an iv4at i2v1ä i2veb i2v1ef iv1ei iv1elt i2v1ent i2v1ep ive3re iv1erh iver4kl iv1erl iver3s i2v1ex ivil3l i2v1im i2v1ind iv1int i3vol ivo3re i2v1r i2vun i2v1ur i2vü 2iw iwur2 2i1x i2xa ix2em ixt2 i1y 2iz iz1a iz2ac i2zag i2zan i2zap iz2arr i3z2as i2zat i2zau i2zä i3ze iz2ei izeits2 i2zele ize2n i4zener i4zentz iz1erg i4z1erl izid3 iz1ir izi4th izo4f i2zö i2zuna i2z3w i3z4wi í1 ï1 1j j2a jab4r jah4r3ei jahr4s ja3l jal2a ja4lt ja3ne jani3t4 jas2o jat2 2jd2 jda3 jd4an je2a jean2s je2g jek2t3a jek2ter jek2tin jekt3o2 jektor4 jek2t3r je3na je2p je3r jer2e je4rr je4rs je2t1a je4t1e je4t3h je2tin je2tor je2t3r jet3t je2t1u2 ji2v 2jm joa3 jo2b1 job3r jo2da jo2i jol2a jong2 jo2p3 jo1r2a jor3d2 jo2sc 3jou jou2l j2s 2jt j2u ju2b3l jude2 jugen4 jugend3 ju2k jul2i jung5s4 ju3ni ju3r jur4a jur2o ju4rt ju3t2e3 jutel2 2jv 1k ka2ans ka3ar 2k1abb kab2bl 2kabd 2k1a2ben 2kabf 2kabg 2kabh 2kabn 2k3a2bo 2kabr 2k1a4bs 2k1abt 2kabw 2kabz ka1c kade2r 2k1adm 2k3a2dr 2kadv ka3e ka3f4l ka3fr kaf3t2 kag2a ka1in kaken2 ka3kl kak6lan 2k1akt. 4kala. kala3b ka2l1a2d ka2lan ka4l3d ka4l1eh ka2lens kal3eri 3k2alk kal2k1a kal4kan kal2k3l kal3l kall2i kallö3 2k1allt ka2l1on ka2lop ka2l1os kals2 kal2tex kal4th ka2lu ka4mat kamp4f3en k2amt kan4al ka4n1a4s ka2nau 2kanb kan3d2 2kanda 2kandä kan2e 2kanf 2kanim kank4 2kanl 2kanom 2k1anor 2k1ans k2ans. 4k3antenn ka3nu kan2um 2kanw 2k1anzu 2kanzü ka2o3 ka3pr 3kara 2karbe 2karc k2ard kar3d2a 3kare 4k1area kar3ent k2arg ka3r2i kari3es k2ark 2k1arm kar4pf k2ars k2ar3ta k1arti 2kartik karu4 k2arw 3k2asc kas2e1i kasi1 kas2o ka4s3p kas4t 2k1ast. ka3sta ka4ster 3kasu ka3sz ka2tab ka2tan 3kateg k3atel kate2n ka3t2h ka2t3r kat3se katt4 ka4ue kau4fer kau4f1o kauf4s3ag kauf2sp kauf4s5tem kauf4sti k2aus. 2k1auss 2kausw kau3t2 2kauto ka3ve 3kaz käl3 k1ä4mi4 kär2 2k1ärg kä2s3c käs5ch käse3 kä3th 2kb2 k3be1 kbo4n kb4ri kby2 2k1c k3ch 2kd2 k3da kd4rö ke2ben 2k1ec ke2di 2k1eff kefi2 kege2 kegel3e ke2gl ke2he. ke2hen kehls4 kehr2s kehrs3o 2k1eic 2k1eig kei2li 2k1ein kein2du kein4e k1eis 2keise keit2 ke2l1a ke3lade ke3l2ag kel3am ke2lä kelb4 keld4 kel3eis 2ke2lek ke2l1en ke2l1er kel3la kel3l4e kell2i ke2l1o2 ke2lö kel3sk k4elt kelt4e 2k1e2mi 2k1emp k2en. ken1a ken3au ke2nä ken3dr ke2n1e2b kenen1 ke4nene ke4nens kener2n kene4t 2ken2gag k3en4gel. ke2nim ken3in 2kenlad 2kenläd kenn2a kenn2e ke2no k2ensa 2ken2sem ken3s2i ken3s2k ken5s4te ken3sz k3en2te. k3en2ten 4kentf 4kentg ken3th 2kentl 2k1ents 2kentw 2kentz kenvo2 ke3ny k2enz2 ke1o2 2kep ke2pl k2er. ke1ra ke2ran ke2ras ke2rau ke2r1ä ker2ble k2erc 4kerd k2ere ke2r1e2b ke2rec ke3reig ker3ein k3eremi 2kerfah k2erfam ker2fo k3er2geb 2kergu ke4rin4nu kerin4st kerin2t k3erken k2erko k3er2lau k3er2leb k4erlebe ker3m ker2na ker4nei 2k3er2neu kern3eur k1ero k2e1rod 2keros ker4reg k2ers. 2kersa kert2i ker4werb kerz2 k1erz. ker2zeu 2k1er2zi k2es. ke2s3a k2esc k1ese ke2sel kes3pa kes2sa ke2t1a ket2ag kete4 ke4t1eb ke4tel 2k1e2th ket3ha ket3s ketta4s kett1h 2ke2tu keu4schl 2k1e2va 2k1e2x 2kf2 kflei2 kf4lö k3fu 2kg2 kga4s1 kge3s2 k3go 2k1h2 k3he k3hu ki1a ki2ad ki2ag ki3a4k ki3a2r ki1ch ki3dr k2ids 2kidy ki2el kie2lei kiel3o 2kiern kier2s kie4sa kie4z 2kif ki3f4l ki3f4r ki3k kik4l 2ki3l2a 2kilä 2kim 3kin. ki2nä 2kindex 2k1indi 2k1indu 2k1inf k2ing kin2ga kin4g3ent king3s 2kinh k2ini3 kinik2 ki3n4o kinot4 kin3s 2k1inse k1inst 2k1int ki3or kio4s 3kir 2k1i2so kis2p kiss4 kis5st kist2 kiv2 kive4 2kiz 2kj k3jo 2kk2 k3ka kkab4 kk4ne kl2 2kl. 4kla. 2k1lac k3lamp klan2 2kland klan3du k4lar k1last k1lauf k3laug 2k1läd k2lär k2le 4k3le. kle2br k3leg 2kleh kl4ei klei2e k3leit k3lem. 3klemp kle2o 2k3ler kle2ra 2k3leu kle3us 2klic k2lien k2lif 2klig 3k2lim k2lin k3lin. 3k4lina 2k3lind k4link k2lip k2lir k2lisc 2klist klit2s 2k3liz 2k3loc 2klok 3k4lop k3lor klos4 klo3sse klost4 2klöc 2klöf k2löst k4löt k1lu k4lu4b k2lud k2lug k2lum 2klux 2k1lüc 2kly 2km2 kma2la kmas2 kma3sse k2n2 k4nac 2k5nach 2k3nad 2knah 2k3nam 2k3nar kn4at 2knav 2k3näp k3ne k4nec kne1e 2knes kne3tu 2knetz 4kney kni2e 2k3niv kno2b3l k4nol 2knorm kno4s 2knov 2k3num ko3a ko2al kobal2 2kobj kob4s koe2 kof3f2 koffe3i kohl2e kohle3i koh3lu ko2kl ko3l2a ko3le kol2k3 kol2lan 3kom komer3 4komn ko4mu k2on kone2 ko2nem kon3s4 kont4e ko2nu ko3on 2kop. ko2pal ko3pat ko3pe 2koper ko4pf kopfa2 kop2fen kop4f3err 3kopp ko3r2a kor2ba kor2bl kor2br 2k1orc korder2 kor4derg ko3re ko4rel 2k1org ko3rin kor2k1a kor4kr kor3m k1orna kor4nac kor2n3ä kor4no2 2korpi k2os k4os. ko4sk ko2sp 3k4ost ko2ter ko3t2i koti4n koti6ne kot4r kot3s2 kot2tak k1ou ko3un 3kow ko2we 2k1ox köde2 k2öf k1öl 2kp2 k3pf 2kq k3qu k2r2 2k3rad 2k3rah k4ral kras3 kra4ss k3rats 2kraum k4raw k4raz k4räc 2kräd k4räf k4räm k4rän 2k3räum 2kre. 2k3reak 2k3real k4reb 4k3rec 2kred. 2k3rede 2kredn 2kredu 2k3ref 2kreg 2k3reic kre1i2e4 kreier4 k3reif 2k3reih 2k3reim krei4sei krei2s3i 2krel k3ren 2kresu 2k3rh 2krib 2k3ric 2k3ries 2krip k3risi k4roa kroa4d kro3b4 k4roch 4k3roh k4rok k4ron k4rop kro4ss 2krot krot4r k3rou 2kröh 2kruf 2k3run 2ks ks3a2b k3sac ksa4k k4s1amt k2san ks3a2r ksa4s k2sau ksau4e ksau4f k2sav k2säh k3s2c ksch4 k2s1e2b k2s1ec k3s2ed ks1ei ks2eid ks2eif k2seind kse2le k2s1eng k2s1ent ks1er ks2ere k2serf k2serg k2serk k2serl k2sers k2serw k2s1ev k2sex k4s1i2d ks2im k2s1in k4s1is k3s2ke ks3ket ks3kl ks1o2 kso4f ks4on k2sop k2sor k2sö k2spal k3s2pat k2spä k3spe ks4pel k2sph ks2por ks2pul ks3s kss4t ks5ste kst2 k4st. kst4a k2s3tal k2s3tanz kstat4 ks3tat. k3stäl ks3th ks3tie k2stier k2s3tis k2stit k2s3tor k2strop k2stuc k2s3tum k2s3tur k2stüt k2s1u ks2zen 2kt kt1abr kt1abs k2t1ad kt1akt k3tal kt1am k2t1an kt2and k2t1a2r kta4re kta3ri k2t1au kt3aug ktau2s ktä3s kt1ein k2tek k2t1ela kte3li kte4n1 k2t1ent k4tentl kten3z kte4pi kte2ra kte3ran kt4ere kt1erg k2t1erh kter3m k2terö kte3ru ktes2 kte3sta k2t1eti k2tex k2t1h k3ther k2t1i2d kti2me kt3ind kt1ing kt1ini kt3inn k2tint kti2s1e k2tiso kti2st kti2ter kto3b k2t1of kto3ren. k4t3ram k3t4ran kt3ras k2t3rau k4tref ktro5me kt3run kt3rü kt3s4a kt3sä kts2el ktsen1 kt3si kts1o kt2sor kts2p kt3s2z ktt2 kt1ums k2tuns kt3z ktz4w ku2al ku1c kud4r ku2h 2k1uhr kuh3s ku3la ku3l2e2 ku3l2i 2kulp kul2to kul2tr k2um. 2k1umb k2um4e 2kumg 2kuml kum2s3p k2u3n2a kun3da kund2e kunft4s 2kunm kun4s kunst3 4kunt 2kunw 4k1up. kur2bl ku2rei kuri2e kuri4er 2k1urk 2k1url ku2ro kurs1c kur2s3p kur2st kur4ste 2k1urt4 kur3tsc 3kus kus3a2r ku2schl ku2sp kus3ses kust2 kus3ta ku2su ku2ß 4kut. kut2a kuto3 kü1c 3küne künf3 3kür kür2s 2kv k3ve 2kw 2kz2 kze3l k3zu 3la. laa2 la3ar l1ab 3l2ab. lab2a la2bad l2abä 2labb lab2br 2labd lab2e 2la2ben 4labf 2labg 2labh 3labi l3a2bit 2la2b3l 2labn 3lab2o 4labo. la3b4ra lab4res la2bri 2la4bs la2bus 2labw 2labz la1ceb l4ache lachter4f lacks4 1lad 2l1ad2a 2ladd la3de. la3d2i 2ladj 2l1adl 2ladm l1adop 2l1a2dr 3l2adu 2ladv 4laf. la4f1ei la4f1er laf1r 4lafs laf3t4 la4fu la2ga lag3d lagen3d l2ager lagerin3 4lagg la2gil la2gin la2gio lag3l la4g3n la2go4 lag3str 2la3ho 3lai lai4s3t 2l1akad lake2 la4kes la4kin l2akk la3k4l la4kro lakt2 2l1al la2la 3la5la. 3lali 4lalt lami3t l4amm lam2m1a lammen4ge 1lammf la4mor l2amp l3ampu 2l1amt lamt2s la4mun la2na l1anal la3nan 4l1a4n4at la4nau 2la2nä 3l2and l4and. lan2d1a lan4dam land3au l4ande lan4derh lan4d3erw lan4d3erz lan4d3inn l4an2d3r lan3dri lan3erd laner2f 2lanf lan2gan 2l3angel lan4g3esc lang3s4 l2anhe 3lan2i 4lanim 4lanl 2l1ann l1ano la2nof 2l1anp 2lans l1ansi 3lansw 2lantw 2lanw lan4zerg lan2z3w 3lao 2l1apf la2ph 2l1a2po lap2pl la2q la2r1an 2larc lar1e2b la2r1ei la2rel la2rene larf4 3lar3g lar3ini lark4l 2larm 2l1a2rom l1art 2lart. lar2ter lart2h l3arti lart4r 3laru l2as. la2sa la4s3aa la4sam la4sä lasche2 4lasd la5seb la4sei la4s1e2l 2lash la2sin la4sis la2so 2la4sp 3lasser l2ast la4sta last3an last3ar la4steu las4to la2str last3ri las3tro las3tur la2stü 1la2ß3 la3t2e 2l3a4tel l4at2i la5tio 2latm lat2o la2tö la2t3ra lat4ri lat2s lat3st 2lat4ta lat2tex lat2t3in lat2t3r lat4tro latzer2 1laub. lauben4s3 lau2b3r laub2se laub4st lau4fel lau4ferl lau4fin 2laufn lau4fo 1laug lau3gl lau3i 3laun 4laun. la4us 3l2aus. 2l1ausb lau4scha 2lausd 2l1ausf 2lausg 2l1ausl 2lausr 2l1auss 2lausz 2lauto lau2tr la3va lave4n 1law lawa4 l2ax la2xel l2ay lä1c 1lähm 2l1ähn lä2i 1länd l1äpf 2läq l2är. lär2ma l1ärme 2l1ärz lä2s3c läs5ch läs6chc 2läse lä4s3s 2lät 2läub 2läuc 2läue 1läuf 2läug 2läx 1là 2lb l3bac l2bant lb3a2ri lbau1 lb1ärm lbb2 lbb4r lb2ei lbei4ge. l2b3eink l2b3eise lbe2ral lber2ei lbe5st l2b1e4ta l2b1id l2b1ins lb4lad l3b2lat l3blä lb3le l2bled l2blic l3blo l3b2lö l3b2lu l2b1o2ra lb3rea lb2s lb3sa lb3se lb3si lb3sla lb3sp lbs4t lbst3ac lb4ste lbst3ei lbst1u l2b1uf l3bum lbu4n lbus3s lbzei2 2l1c l3ca l3che l4chei l4chent lchermas4 l3chi lch3le lch3li l3chlo lch3n lch3r lch3s4 lch3ü lch3w l3cl l3co 2ld ld3a2b1 ld2ac ld3ack l2daf lda2g l2d1ah lda2i l2d1ak l2d1al ld1ams l2d3a4n ld1arm ld1ass l2d1au ld3au4s l3däm ld1är ld1äs ld1ät ldbus2 l3de. lde2ben l2dei ldein5 l2d1elf l2d1e2mi l2d1ems lden3erg l2dentl l3der. l4d3er2fa l4der4geb ld1erh l2der2he ld2erl ld2ern l2d1er2p lder4tr lde5sa lde2sel l2d1es2s l2dex ldi2c l2d1id ld1i4mi l2d3ion ldo2b ld2on l2dop ldo2r l2d1ori ld2os ld2ö ld3r ld4ram ld1ran ld1rä l2dre ld5rie l3d4ris ld1rol ld4ru ld5rub ld5rut l2drüc ld3sa lds2an ld3ska lds2p lds4t ldt4r ld3tu l2d1ul l2d1um 1le le2ad le2an. le3ar 3le3ba leben2s3 le3ber le2bl 3lebr le2b3re lebs2 2lec lech1a le2chi lech5t4e le2dit le2dr le1en le2er lee4ret le3f2a 2l1eff lef4o le2g1ab leg1as le2gä legi3en le2gl leg4r legs4 3leh 4lehe. leh3r2e 4lehs 4leht l2eid lei3ere lei2fan lei2fei lei2fi 2l1eig lei3gl 3leih lei2hau lei3l2 leim3p 3l2ein. leinbu4 leinbus3 lein2du l4eine lei4nerb le2inf le2ini 2leink l1einn leins2 l3einsa 2leint l2einu le2is leisch3a lei4schei lei4scho lei4schr lei4sern l1eisf lei4ss3er leis3st lei2ßer l2eit lei2ta leit5ersc lei2to leit3s2 leits4t 2leiw 3leko 2lektr 2lekz 3l2ela le2le 2lelek 4leleme le3len leler2 le3les 2lelf. 2l1elfe l2eli lel3s l2em. le3mal le2mau le2m1ei 3lemes 3lemet lem1o2 le2mor 4lemp le2mu le4mun l4en. len1a2 len3ab le4nad le4n3an le4n3a4t le2nä 2lendet 4lendl l1endp 4lendun l4endur le2n1ed lenen3er 4lenerg le2ners le2neur 2leneuv len2gag len2kau len2k3lo len2klu l1enni le2no len4sein 2len2sem len4serk len3ska len3sz 2lentg 2l1entk 2lentla 2lentn l3entro 2lentrü 2l3entw lent4wä 3lentwet 2lentz le4nz lenz2a len4z3eig 2lenzy leo4f le1o4s 2lep l1epe le2pen 3lepf 4l1e2pi 4lepoc le2pos lep4pi 3lepr l2er. l2e1ra le2rag le2r3ap le2ra4s le2rau le2r1ä le2r1e2b ler2ec 2lereig le2r3ei2m le2r3eis le2rel le2reng le2rerg le2rers le2re4t 2l3erfas 2l1erfo l2erfr l2erfüh l1erg l2erga 2lergeb l2ergef 3lergeh 4lergen. l2erger l2erges 3l2ergew 2lergi l2ergl l2ergr lergro3 2ler2heb 2lerhol leri2e lerin2s lerk2 3l2erka l1erkl l2erkle 3l2erko ler3kr 3l2erkre 3l4erlebe 3l2erlei 2lermä 2l3ermüd 3lerna ler2nal ler2nar l4erne ler4nei 2l1erö 3l2erra ler2ric l2errü l4ers. l1ersa 2lersat 3l4ersl ler2sto lert4 ler4trä le2rup l4erwa ler2wer 2ler2wo 2l1erz ler2zä l3erzeu ler2zo l4es. les2am les2e le3seb lese1i 2l1esel l4e3s4h le5she lesi1 le3s2k les4ki le3so le2spo lest4 leste3 lester4i 3lesu 4lesw 2lesy le2tab 2le2tap 2le2tat l1e2th le3tha 2lethi let2i letsche4 let2to2 lett1r letts2 le2u 4leue 3le3u4f le4uk 2l1eul le3unt le4ur 3l2eut l1e2vol 2lex 3lexd 3lexik le2xis 3ley 1lé 2lf l3fac l3fah lf4at lfäs3 l2f1ec lfe1e lf3einh l2feis lf2en l2ferei lfe2rel lf1erl l3fjo lf4lä lf3led lflo5sses lf4lö l3f4lu lf3ram lf3res lf4ru lf4rü lf2spe lf2s3ti lf2su lfun2 lfur1 2lg lgab4 l3gas lga3t lgene2 lgeräu3 l2geti lg2i l3gle lg2lö l3go lgoa3 lg2p l3g4ra lg3re l3gro lgro3s lg2s lg3sch lg4s3t 2l1h2 l3he 3lhi. l3ho l3hu 1li li1a lia2b li2ad li4am. lian2g li2ast 3lib libi3 lib4r li1c lich2ta lich5ters licht5ersc lich2to 4lick li2cl li3d2a l1ido l2idy liebe4s3 lie2br 3liefer li3efl lie4n1a2 li3ene li3ens lien3t li2er lie2rei li3ern lie4s3c lie4sta lif2fes lif2fo lif3ti 3lig li2g3ers lig1l lig4n ligs4 li3ker lik2i li3k2o lik2sp lik4tau lik2ter lik4th lik2ti lik2t1o2 lik2u li3l lil2a li4ll li3m2a lima1c lima3t4 2l1imb 2limm 3limo 2limp lin2a lin3all li3nar 4lindi 2l1indu li2nef li2neh li2nep li5ner li6nere li2nes 2l1inf ling3l lingst4 2l1inh 2l1inj lin2kan lin2kar link2s3 lino2 li2nol l2insa 2linsel 2linsp 2linst 2linsu 2linsz 2l1int l2intu li3n2u 2l1inv 2linz li2o li4om lion5s 3lipf 3lipt 3lis. li3s2a li3schm li2schu lis2h li3shi 3lisk 2l1isl 2l1i2so 3lison li2s2p liss4 2liß li2t1a2d l1i2tal lit4an li3t2ä l2it2e 3liter li3th li2t3r lits2 lit3se lit3sz li4tun li2tur litz4er 3liu li2vea live4n li2ves livi3e li3vr 4lixi li4z3ä lizei3 2lj l3ja 2lk l3kale lk1alp l3k2an l3kap l3kar. l3ke lk1erd lke3r2e lk2l lk3lad l3k4las lk3lic l3k4lu lk4ne lk5ner lk3nu lko4f lk1ofe lkor2b lk3roc lk2s1 lk3sän lk4sb lk4set lk3si lk4sm lk4spe lks3t lks4te lkt2 lk2ü 2l1l lla2be l2labk l2labt l3labu ll3acht lla2de ll1aff lla3gl l2l1am lla4ma ll2ami ll2anb lla2ner lla4ni l3lans. l3lant. ll1anz l2l3appl ll1arm ll1a4sc lla4tern l2lath l2latl l4latm l2l1att l2lau ll3aufg ll3aufk llau4m ll1au2s l4lausf l2la2w ll3axt ll4äh l2l1äm ll1är l3läs l2läu llb2 llb4l llch4 ll3d lld4r l2le2b ll3ebene l3lec ll1ech lle3er l2l1ef l3legr lle2gu lle2he l2leib ll1eic ll1eim l2l3eise lle2la lle2m l2l1emi l3len. lle4na ll3endl llen3dr ll3endu llen4dun lle4nens l4lentf l2lents l3lep l3ler. lle2ra ller4eig l4lerfas ller2fo ller4geb l4lergene l2lergo ll3erho ll3erkr ll3ermi ller4müd l2l3ernt ll3ertr ll4erwei ll2es l2le2se lle4th l2leuc l3leur. ll1exe llg2 l2lieb l2lieg lli2gan l3lik lli4la l2l1ind l4linf l2l1ink ll1ins llin4sen l2li2po ll3k ll3m2 ll5mit ll3n2 ll1ob l2lobe l2lo2d4 l2l1o4f llo2ge ll3ol l2lope ll1opf ll1or l4lorb llor2g l2lo2ri llo2te l2l1ou l3low ll1ox llö2g l3löh ll2s1es ll3ska ll2spr ll2stor ll3t llt2e llt2i llti2m llt4r ll4ts2 llu2d l2lu2me l3lung l2lu4p ll1ur llust4 l3lut l2lüc llü4d l2lü2g l3ly ll3z2 llz4w 2lm l3ma. lm3a2b l2m1ad lm1a2ge lm1aka l2m1a4m l3mana lm1apf lm1art lm1att lmä2s lm1ä4st lm1c lmd2 lm3e2dit l2m1ef l2m1ent l2m1e2p lmer2 l2m1erf l2m1erl l2m1erz l4messa l2m1i2d lm1ind lm1ins lm3m l2mof lm1orc lm3p2 lmpf4 lm3s2k lms4t lm3str lm3s2z lm3t lmt4r l2mum l4munt 2ln ln2ab lna2r ln3are l3n2e lnes2 l2n1in lnus2 l1nü l1ny 1lo 3lob. l2oba 3lobb lobe4s 2lobj l1o2bl l2obr lob4ri lo2chel lodi4e 3lodr lo3dri l1ofe lo3fj lo4gh lo2gl lo2gor lo2gre lo2ha lo3h2e 4l1ohr loi4d loi4r 3lok 4l3okk lo2k3r l4olä l4ole 2l3o2ly lomä3 lo4mel lo4min lo2ner lo4nin lo2n1o lo2o3 2lopf lop2p1a lop2pr 2lopt lo2rak lor3am lor2an lo4rä 3lorb 2l1orc 2l1ord lo3r2en 2l1org2 lori4di 2lort4 l2os. lo4sa 3lose lo4ske lo4spe lo2s3pr lo4stel lo4steu lo2s3to lo2s3t4r lo2ßu lo2t1a lo2th lo3tha loti4o lots2 2l1ov lo2ve 2lox 1lö lö2b3 2löck 2löd 2l3ö4fe 2lög 2l1öhr 2lök 2l1öl 2löp 3lösc 2löß lö4ta 2lp lp2ar lpar2k1 l2p1är l3p2f lp4fu lph2 l3phä l2phir lp1ho l3phr lph4t lpi4p lp4lu lp4rä lpt4r l3pu l3pü 2lq 2l1r2 lra4ss lrau2s l3re lrebs2 lro2h lrö2 lrö4s3 l3ru l3rü 2ls ls3a2b ls3acke l2s1a2d l4s1amb l4samp l2san ls3ane l3sare ls3a2ri l3sark lsau2 l4s3au. lsau4m lsau4rer ls3au4s l2saut l3s2äm lsä6sse ls2äug l2s1äus lsby4 ls2c l2schin l2s1e2b l3seil ls2ele ls1eli ls1emb l2sent ls1er ls2erb l2serf l2serg l2serh l2serk l2serl l2sers lser2u l2serw lse2t ls1eta ls3ha l2s1id l2simp ls2kal l3s2kele l4skla l4sko ls2ky lso4b l2sop l2s3ort. l3s2öl ls2pa l2s3pac l2s3ph l4s3pir l4spiz ls2po ls2pu l3s4pul ls3s2 l4st. lst2a lstab4 ls3tabl l2s3tas l2s3tat. l2state l2s3täti l4st3erk l4s3terr l2s3tis l2stit l2stoch ls3tor lstro4 ls4tru l2s3trü l2stuc ls1um l2s1un ls2und ls3unk l4szu 2lt l3ta. l2tab l3tabl lt1abs lt2a3d ltag4 lt1am l3tami ltampe4 l3tan. ltan3d l2t1ap lt1ara l3tark lt1art l3tarta ltar4tik lt1au lt3aut lt1äh ltbau1 lt1eh lt1eig lt1ein lte3mi l3t2en lten4gel lten2sp l4tentl lt3ents lte2ral l2t3er2fa l3t2erg l2terhe lter2ku lter2nä lte2ro lt2erö lter2se l2t1esk lte3sta lt2et l3tet. lt3g l2t1h lt3hag l3thas l4t3hei lthol2 l3thr l3t2hu lt1ide ltimo4 l3tin. l3tine l2tiso l3t2i3t l2t1ob l2t1o4f l2tord l2torg l2t1o2ri lto2w lt1öl lt1ös l4t1öt ltra3l2 lt3räu lt3rec lt3rei lt3ris lt1roc lt3rol l2t3rö lt3rum l2t3rus lt2se2l lt2s3ort lt3s2ph lt4stec lt2sti lt2stüt lt3t lt1uh l2t1um lt2um. lturan2 lturen2 ltu4r3ent ltu2ri lu1an 2lu2b3 luba2 lu3be lubs2 lub5sz lu2dr lu2ec lu2es lu2et 1luf2 2l1u4fe lu5fel 2luff luft1a luft3e luf4tei luf4t3r lu2g1a lu2g1e2b lu2gei lugen1 lu2gi lug3l lu2go lu2g3r lug3se lug3sp lug3sta lu2gu 2l1uh lu1id lui2de lu4ig lu1is. lume4 2lumf 2lumg l1umh 2lumk 2luml l2ump 1lumpe lum2ph 2lumr 2l1ums lu3mu 2l1umw 2lumz 1lu2n 2l1una lund4 2l1unf 2l1uni 2lunr 2l1uns 2lunt 2lunw lu4pf l2ura lu2r1an lu2rat 3lurc lu2rei 2lurg l2uri lu2ris l1urn lu2ro 2lurs l1urt lu3sak lu2san 2luse lu2sp lus4s3a lus2s1c lus6sel lus3sen luss3er4 lus2s1o lus4s3p lus4s3t 1lust lu2sta lu2stä lu4sterl lu2s4t1o2 lus4tr lust3re lu4s1u lu2ß1 lu2t1a4 lu4tas lu4t3au lu2tä lu2t1e4g lu2t1el luter2 lu2t3er4b lut3erg lu4t3ersa lu2thy 2luto lu2tob lu2t1o4f lu2top lu2t1or lu2t3r lut3schl 3lux 2lüb 3lübd lück4e2 lücker3 2lüd lüf3te lü2hel lüh1l lü2str 2lv2 lva3 l3vl l3vo lv3r 2lw2 l3wa lw4ei lweis4s l3wi 2lx 1ly ly3a lya4m ly3c ly3es 2lymp 3lyn ly3no ly3o lys2 ly3th 2lz lza2 l2z1ac l2z1ag l2zan l2z1ap l2zat lz1aus l2z1äp l2zär l2z1eim lze2l l2zele l2z3enth l2z1ep l2z1er2h l2zerz l2z1id lzi4m lz1imi lz1ing lz1inn lz3l lzo4f l2zö lz3t2 l2z1u4fe lzug4s lzvol2 lz3w l2zwar lz4wec l2zwu 1m maa2 2m1ab 3maba 4m3a2bar m2abä m2abe 4m3abf 4mabg 4mabk m2abli 4mabn ma2br m2a3b4ra 4mabs 4mabw ma3chan mach2e mach4t5ers mach2tr ma2ci mack2s 2m1act mada4m m2adä ma2del ma3dj ma4dl 2m1adm 2m1a2d4r ma4d2s ma3f maf4r mag2a ma2ge. ma4geb ma2geg ma2gek ma2gep ma2ges. ma2get ma2gev ma2gew 4m1agg magi1 magi3er. magi3ers ma3gl 2magm ma3g4n 2m1ago ma3ha mahl2s ma1ho mai4s3e ma4ke. ma4kes 2m1akt mal1ak ma2lakt ma2l1an ma2lau ma2lär 2mal2de m2aldi ma3le ma4leb ma4lent mal2er ma4lex mali1 mali2e mali3er mal3lo mal3lö3 2mallt ma2lon ma2lop m2alp mal3t malu2 ma2l3ut 3malv ma4mid mam3m 4m1a2nal ma2nar 2m1a4n4at ma2nau 2m1anä 2manb man2ce 3man3d4 man2en ma2net 2m2anf mang2 2man3ga m2angel 2m1angr 2m2anh 3manip 2manl 4manla m2anle 3ma4nn 4manod 2manr man3s 2m1ansa 2mansä man4sh man2t1h 2mantr ma4n1ut 2manw 2manz m1anza ma2or ma2phr ma2po m2ara 4marag mar2an 4m3arb 2maren mar3g2 3ma1rh ma3r2i m2a4rk mar2kr 4mar2o maro3d 4marr mar4schl mar4schm mar4schn mar4schr mar2sp mar2su 2mart. ma3r2u m1arz m2as 3mas. ma3s4a mas2e ma3s2p masse4n ma3s2ses ma5sset mass3t ma3s2su 3mas4t ma2sti ma4s3z ma2tab ma2tan ma2tä m3a2tel ma2t3erd ma2t3erz ma3the m4atme 2matmo ma2to ma4tort mat3se mat3sp matta3g matt4r mat3url 2m1au4f 3maul ma3un mau3r 2maus ma4ut mau2ta m2ay ma1y4o mä3he 2m1ähn mäh1r 3män 4m1änd 2m1äp 2mäq mär1 2m1ära mär2kl mär2z1 mä3t4r mäu2s3c 2mb2 mbe2e mbera2 mber2e mbe3ri mbert4 mbi3er. mb4le mble1i mb4re mbu3sc 2mc m3ch 2md m2dan m2d1a4s md1är mde2a m2dei mde2m m2d1emi m2d1ent mder2 m2d1erl md2ö md3ras md3s2e mdt4r m2d1um me3an me3at meau2 me2ben 4mebo me1c medi3 medie4 me1e2m me1e2n mee4rei 2m1eff mega3 me4gel 3meh meh6l3er 2m1eif 2m1eig m2e4i3l2 mein4da meiner4k mei4nerl m2eis4t me3lam me3l2ant me2l1au melb2 mel3d2 melde3i me2lek 2melem me2ler melet2 2melf. mel3ink 3melk mel4k3ei mell2i melm2 3melo me2lob mel2sac mel2se mel2spa melt4 4mel4tern 2m1e2mis 2m1emp 2m1e2mu m2en. men3ab me3nage me4n3an men3ar me4nas men3au 4m1endl menen1 meng2a 2men2gag men3ge me4nh me2nim me4n3k4 men2on me4ns men2se. men2sem 4mensemb men2sen men4ser men2ses mensi2d menst4 3m4enta men2t3ak men4tanz mentar6ten 3m4entei ment3eig men4t3ers 4mentn ment2sp me1o 2meou 2meö 4mepa 2m1e2pi m2er. me1ra mera3l mer2as me2r1e2b 2mer2eig me2rens mer2err mer2erw 2m3er2gän me5ric meri2e merin2d merin2t 2mer2klä 3merkm m4ersh mer3sm mer4stel mert4r merz4eng 3mes me2sal me2sä 4meser mes3pr 2mes2sa mess3an messe2r mes4serg mes4s1o mes2sp mes2s3t mes3ta mes3tä me2str mest3ri me3su me3sze 3me2ß3 me3ta met3abe mete2 me3th me2to me2tö me2trig me3tro met4t3en4d meu1 2m1ex me2xe 2mf mfi2le mf4rü 2mg2 mgang4 mglim2 2m1h2 m3hu mi1a mia2b mi3ak mia4m 2m1iat mibi1 mic1e mi1ch mi2ci mi3da mi2di. mi3dr 2midy mie3dr mi3ele mi4e3no mierer2 mie2ti mie4t3r mif2 mi3f4l 3mige mig4r mi3h mik1an mi3ke mi4kel mi4kens mi3k4l 3mil mi3la milch1 mil4che mi3l2i mi3l2u 4milz m2im2a 2m1imm 4mimp min2ac mi3nak min3anze m2in3de minde2s 4m1indu mi2nef miner1 mi4n3e2ri min2eu 4minfo 3ming min2ga 2minh 3mi3ni mini3k4 mi3nod mi2nof 2m1inse m1inst mi3nu 3minz mioni1 mi3p mi4ps 3mir. 3miri 3mirs 3mirw 3mirz 3mis. mi2sa mis4au2 mi2scha mi2scho mi2schr mi2sch3w mise1 2m1i2so 3mis2p mi2spe mis5sar mis2ser mis4st mi2sta mi3str 3misu mi2ß1 3mit mi2ta mit1h mi2to mi2tr mi3tra mit3s2 mit5sa mit3tan mit3t2e mitte3s mi2t1u 4mitz mi3v2 2mj 2mk2 m3kn mk4na mk4ne mk4nu 2m1l2 ml3c m3le ml3f ml3k m3lo ml3p ml3s2 2mm mma3a mm3achs m2m1ak mma4kr mm1all m2mank m2mans mm1anz m2m1ap mm2app mm1art mma2ß mm1aus mmä2 mmä4s m2m1äu mmd2 m2m1e2b mme2c m2m1e2di m2m1ef m4meh m2mei mm1ein mm3eise mme2l1a2 mme2lin mm2ene mmen4te. mmen4ten m2ments m2mentw m2me2nü mme2r3a2 mme2rec mmer4geb mme2s mmes3a mme3sc mme4sz m2me4te m2m1eu mmga4s mmi3el mmi3m mm1inb mm1inh m2m1ins mm1int mm2is mmi3sc mmisch4 m4mita mmi3tw m2mo2l m2mor mm3p mmpf4 mms2 mm3sa mm3si mm3te m2mum mm2un mmu3r m2mus mmuts2 mmül2 2m1n2 m2nesi2 m3ni m3nu 2m1o2be 3mobi 2mobj 3m2od mo3de mo2dr m1of mo4fe 2mog. mo2g1al 3m2oh moh2a moi3r mo2k1l 4mol. mol3d 3mom mom2e 3m2on mo2nan mo2nä mon2dac mon2del mon2d3er mon2do mo2ner moni2en mon3s2 mont2a mon3th mo1ny 3m2o2o 2mope 2m1opf 2mopt mo1ra mo2rak mor2an mor2d3a mor4derm mor2dr mor3g mor3t2 mo4ru 3mos mo4ska mos4t moster4 mo2sto mo2su mo3t2h 2motio mot4r mous2 m1ox moy3 möbe2 mö2c 2möf mö4fe 2m1öl 2mp mpa3ne mpe2la mpe2lin mpe2n m2p1ene m4pf. mpf3au mpf1ef mp2f3erf mpf3erg mpf3er2p mp4ferpr mp2f3er4r mp2f3erz mp4f3l mpf1or m4ph. mp1haf m4phb m4phf m4phg m4phm mp1hos m4phs m4phz mpin2 mp3lei m2p3lem. m2p3len m2p3les mpor4ter mpot2 m2p3ra mp4rä mp3sh mps2p m3pu 2mq 2m1r2 m3ra m3ru 2ms m2san ms1as m3sat m2s1än msch2l m3se. m2s1e2d m2s1ef m2sein m2se2le mse2n m2s1ene m2sent ms1erf mse2t ms1eti m2s1eu m2sex mso2 m2s1od ms1orc ms1ori ms2p m2spä m2sped m4spl m2spot m2spro ms3s mss4a mss4t mst2 m4st. m4stag m2stal m2stit m2sü m4szi 2mt mt1ab mt1ak mta4m mt1ar mt3aug m2t1e2d m2teig mt1ein m2t1eis m2teiw mt1elt mt1emi m2tenga m2t3engl m2tentf m2tentg m2t3en2tr m2tents mter2 m2t1er4b m2t1erf m2t1erg mt1erh m2t3e2r4i m2t1erk m2t1erl m2t1ers m2t1ert m2teta m2t1eu m2t1ev m2t1h mt3ho m2t1i2d m2tim m2t1in m2t1i2r mti2s mtmen2 mt1ob mt1op m2t1öl mt1ös mtra4s3 m2t3ro m2trö mt2sa mt3sco mt2s1e mt3send mt3s2ka mt3s2kel mts3tät mtt4r mt1um mtu3re mt3z mu1a 2m1uh mu3la 3muld 3mult 3mumi m1ums mum2s3p 3mun mundan2 mun4derf mu2ner2 4m1unf 4m3ungeb mu3ni mu4nin 4mu4niv 4munw 4munz mu3ru mu4r1u4f 3mus. mu4s1a 3musc mu2s1o mu2sp mu3s2se. mu3s2ses mus4ste must2 must4e mus4ter mu2s3to mu2str mu2su muße3 mut1au mut2st 2müb 3müh mü2her mühl1a 3mül mül2len 3mün mü3s2si 3müt 2mv mvoll1 2mw2 mwa2 mweg4 mwel4 mwelt3 mwelter3 mwu1 my3a my3on 2mz2 mzug4 1na 3na. na2a 2n1ab 3naba na2bä n3abh n3abk na2b3l na2bor na2br nab4rü 4n3abs2 na2bus 4nabz 3na2c n4ac. nach1 nachen2 na3chen. n3achse nach3sp nacht5ers nach6tersc nacht6raum n1ada na3dab 3nade na3de. nadel1 na3den na2der 4n1adl 4n3adm n1a2dr 3nae na3el na3es 2n1af na3fra nag2a na3ge. na2gem 4n1agg n1a2gi na3gin na3g4r 3n2ah nah1a na2hau n4ahm 4n3ahn 4n3aho2 na2hö 3nai na1i2d nai2e n1aig 4n3air nai4re n2ais 2n1ak 3n4akä 3nako na4kro 4nakt na4kus n2al. na2l1a2 nal3am na4lar na2lä 2n1albk n2ald nal3da na2l1ed nal3ei na2l3ent na2ler2g na2lerm na2l3erw nales2 nal1et nal1ex nalg2 na2lid nal3la na2lop nal2ph nal3s n2als. nal3t nalt2a nalt4r n2alty na2lu 2naly na4mal na4mat 3name 4na4mei n4amen namens3 4n1a4mer na4mid na4min na3m2n 3n2amo n1amp nam2sp 2n1amt namt2s na4my n1an 4na2n4a na4nat n3a2nä 4n3anb n3and2 nan1eu 4n3anf 4n3ang 4nanh 2nani 4n3ank 4n3anl 3n2ann 4n3anna 4nano nan2o3b 4n3anp 2nanr 4n3ans 2nantr 2nanw n2anz. nanzen2 nan4zeng nanzer2 nan4zerg nan2zw na3ot na2per n1apfe 2napfel na2pos n3a2pr n1a2q n1ar 3nar. na2r1a 2narc n2ard n2are n4are. 3nari n2ark n2arle 2narm n2aro na2rom na3rö n2arr nar2rh n2ars 2nart n2arta na3r2u 3nas n4as. na3sä na2schw 4n1a4sp nas2s1c 4n1assi 4na2sy nasyl2 3naß 3nat n4at. n4ata na2tat na4t3au nat1ei na3ten na2t2h 4natm nat2o 4natom nat1r nat4sa nats1e na4tt n4a3tu n1au nauf2fr 4nauge. 3n2aul 3naum na3um. 4nausb 4nausd 4nausf 4nausg 4nausl n2auso 4nausr 4n3auss 4nausw 4nausz nau3te 3nav nave4 navi3er. navi3ers na2x 1nä 2näb 3n2äc 3näe 2n1äf 3näg nä2hi 3nähm 2n1ähn nä2hu 3näi 2n1äm nä4mi 2n1än 2näp 2näq nä2sc n2ä4s3s 2näu 3nä1um 2nb2 n3ba n3be nbe2in nber2e nber2gr nb4la nb4le nb4ri nbruch4s5t n3bs nbu3s 2n1c n2c3ab n3can n3ce4n n3ces. n4ch. nchi3en n3chl n4ch3m ncor2 n3cr n3cu 2nd nda3f nd2ag n3d2ai n2d1ak n2dana n2dani n2danz n3dat nd3att nd1au n2daut n2dax nd1äng nd1c nde2al. n3de1e n2dei nde3inf nde2lat nde3l2ec nd3elfe ndel3l ndel4sa ndels3en nden3sk n2dentl n2dents nde3o2 n3der. nde4rei4s n3deren nd2erh n3deri nder4läs nde2rob n2de2ros nder4sat nd2es1 nde2se nd4est ndi2a3 nd1imm n2dof ndo4n3a n2dopt nd1or n2do2ri n2d3ott n2dout n2dö n2d3rat nd3rau n2d3re nd5ric n2drif n2d3roc n2drod n2d3rö n2drui n2d3run n4dsb nd2sene n4dsl nd2spr nd3th ndt4r n2duns ndy3 ndys2 ndys4p 1ne 3ne. ne2ap 3neas ne3ast. ne3at ne3au 2n3ebene neben3s ne2bl 2n1ebn neb4r 2nec 3neca 3nece ne2ch neck2a ne2dit 2nee neei2 ne3ein ne3eis neema4 neen2 ne1en. nee1r neer4e n1ef n2ef. n2e3f2a 2nefr 2n1egg neg4l n1e2go neg4r n1e2he 2nehe. 2nehem nehen2 ne3he2r 3nehm 2n1ehr 2n1ei 3neia 4neic nei4dr 4neier 3neigt 3neigu nei4la 4neing 4neinh 4neink 4neinl 4neinr 4neinz ne2ke 2n1eks nek3t2 2nekz ne2l ne3lä nel3b n1ele ne3leb 2nelek 2nelem ne3len ne3l2i ne4lim ne4lit 3nelk n2ell nel4la4 nel2lei neller4f nel2lif n2eln 3ne3l2o 3ne3lu 3n2em. ne3mas 2n1emb ne5men n2emo 4n3emp 2n1ems 3nen n4en. n2en3a nen4am ne2nä n2enb n2enc 4n1endb 4n1endd 4n1endf n1endg 4n1endh 4n1endk n1endl 4n1endp 4n1endt 4n1endw nene2b nen3ei nene4m nenen1 ne4nene nen3erb 2nenerg ne2n1eu n2enf 4n1engb nen2gen 4n1engs 4n1engt n1engu nen2gun n2enh ne2ni n2enj n2enk2 n2enm n2enn nen2nar ne2no4 nen3s2e 2nensem nen3sk nen3s2p nen3s4t 5n2en3t2a 4n1entb 4nentd 4nentf 5n2enti 2n1entl 4nentn nen3to 5n2entra nen2tri 4n1ents 4n3entw 4n3entz ne4n3u n2env n2enw nenz2er neo3b2 ne2oh ne2or ne2pen 2nepf 2ne4pi 2nepo ne2pos nept4 n4er. ne1ra ne2ra2b ne2rac ne2r3af ne2rag ne3r4al ne2ram ne2ran ne2r3ap n2erat ne2rati ne3rato ne2rau n2erb2a 2n3erbe. 2n3erben 2nerdb ner2dig ne2r1e2b ne2rec n1erf 2nerfas nerfor2 3nerfr 2nerfü 2ner3g4 n3ergeb 4nergi 3nergr n1erh n3erhö 4nerhöh 3neri neri2e n2erj n1erk 3nerka n2erkö n4erleh n2erli 2n1erlö nerma3 nermas2 n1ermi 2nermit 2n1ernä 4n3erneu 2n1ernt n1eros n1eröf ne1rös n2ers. 2n1ersa 3nerse ner4sk 2n3ersts nert4 3nert. ne2rup 3n2erv 2nerwar 2n1erz n2es. ne2sal ne2sei n1e2sel ne2s1ev 2ne3sh ne3ska ne2s1of ne2s1or ne2s3pa 2n1es2si nes5tei 2n3e2st3r 4nesyn n2eß ne2tab 2ne4tag net1ak ne2t1an 2ne2tap 2ne2tat ne4te2l ne5ten ne2th net3ha ne3ti ne4tim ne4tin ne2tob nets2 n2ett net3ta net5te net3t4r 2n1e2tu net2zer net2z1i ne2u neu1c neu2ere neuer2f neuer2k neuer4s neuer2w neuf4 neu3g4 n2eun 2n1eup neur2 neu2ra neu3t 3n2evi n2ew 2n1ex ne2xi 3nez 1né 2nf nf2al nfalt4 nf2ang nf4ar n3f2ä nfäs3 nfe2i n3f2en n3f2er nf4es n4fex n3f2i nfi2le. nf4le nf4lö nf5löf nflös4 nf2o n4föl nf4re nf4ri nf4ru nf4rü nf3s2 nf2tan nf3tei nf2t3r nft4st nfts3tr n2f1u 2ng n3gabe ng1abt n2g1ac n2g1ad n2g1ak ng1a4me ng1ams ng3anda ng3angl ngang4st n2ganh n4ganl ng1ant ng1are n3g2ars n2g1a2v n2g1äl ng3d n2g1eif n2g1ein ngelb4 nge3l2ei ngel3t4 n3gene nge3nerw ngen3s2 nge2ram n2g1erg nger2zä nger3ze n3ges nge3s2a ng5get ng3hu n2g1id ng2lad n3glas n2glic ng4lok n3glot ngma5sse. n2gn ng3ne n4g3ni ng4nom ng2nu ng2ob n2g1op n2g1o2r n2gö n2grai ng4ran n2g3rat ng3roc ngro3s ng3rost ng2s ng4s3au ng3sc ng5schr ng4sd ngs3e4h ng4sf ng5son ng5soz ng3span ng4spar ng4stec ng5suc ng3ts n2gum ngzei2t 2n1h2 n3ha. nhabe4r3e n5haltu nhas3 n3he nhe2r n3ho 1ni 3n2ia ni3alo ni2ar ni1as nibb4 ni1ce n1id 3n2id. ni3da ni2de n2i3de. 2nidea ni3den. ni3dr 2n3idy n2ie nie3b 3nied ni2e1i ni1el nie3l2a nie4n ni3ene nie2rei nie4rerg ni2erna nie4sa nie5sse ni2eu ni3fl niga4 ni2g1ab ni2g1am ni2g1an 4n3i2gel 2niget n4igk ni4gl nig3li ni2gn nigs3c nig4sp nihi3 ni2kar 4nikei 4ni2kel ni3k2erh 4nikh ni2ki nik3ing ni2kor ni2k3r ni4ks nik3t4 4nikun 3n2il ni3l2a ni3l2i nil3l ni3mo 4nimp nin1 3nin. 3n2ina nin2ac ni2nal 3n2inb 2n1ind 2ninf 3ning n2ing. n2ingo ning4s 2n1inh 4n1ink2 3nino ni2nor 3n2inp 2n1ins 4ninse 4ninsu 4n1int ni3nu 4n1inv 3n2inw ni2ob ni3ok ni3ora n2ip ni4ron n1irr 3n2is ni4sam ni2san ni2sä nis3cha ni2schw ni2s1e ni3se. 4n3isol ni2som 4nisot ni2sp nis3s4 nis5st nis3tha ni2stu ni3stun ni2s1u 2nit 3nita ni3th ni2ti 4ni4tia nit2o 3nit4r nit3s nit4tec nit4tell nit4ter4g nit4t3er4k nit2tie nit2t3r nitt4sa niv2 3nix 2nj 2nk nk1abr n2k1ac nk1a2ge n3kal n4kalg nk1ang nk1apf nk3art. n2katm n2kato nk1aus n2kaut n2k1äh n2k1äp nk1ei nk2eil nke2lei n2kelem nkelma3 nkelmas4 n3ken. nke4na nker4fah nker3la n2k3erle nke2ros nk3ersa n2k3erwe n3kesc nke2t nk1eti nk1i2d n2kide nk1inh n2k1ins n2klade n2k1laf nk3leis n2k3len nk3les nk2lo nk4neb n2knis n2knit n2knu n2k1o4be n2kopt nko2r nkord2 nk1ori n2k1ort n2köl nk4rab nk3rät n4k5re. nk3rel n2kren nk3rep n2krez nk3ro n2krol nk2sal nk2se nk3sen nk2so nks2p nks6tel nks4ti nk3s2z nk2tak nk4tau nk2terg nk2t3ern nkte3sk nkt2et nk2tin nkt1it nk2top nkt1r nkt3ric nk2tro nk2tru nkt2sen n2k1um nku2n nk1urh n2küb 2n1l2 n3la n3le nle2ga nleit6e n3li nli4ne 2nm2 n3ma n3mä nmen2s 2n1n n2nada nna2g n2nalg n4n1all n2n1amb n4nan nn1a2sc n2nau n3nä n3nec n3n2eh nn2ei. n3nelb nne4le nne4na nn2ens n4nentl n4nereig nner2fü nner4geb nn4ergr nn2erh nn2erk n2n3er2la nner4mit nn2ero nne2rö4 nn3erwa nner2z nne2s1e n2ness nn2eu nn2ex nn3f nng4r n3ni n4nid nnk2 nn2o3b nn3obl nn3obs n2nof n2nop nno2r nn1ori nn4sam nn3ser nn3s2p nnst2 nns3tat nn2stoc nn2stö nnst4r nnt2a nn5tag nn2th n2n1uf n2n1unf nn1ur nnvol3le 1no 3no. no3at 3n2oba n2obel 2nobj no2bla n2oble 3noblo 3noblö 2n1o4bs 3noby no1c noche4 noch4r 2nod no2de nodi3 no2ed n1of no4fe no5fes 2noff n1oh n2ohe no3id no2kel 2n3okk no3kr nola4 no2lam n3ole no4lig no2liv 2n3o2ly 3nome3 3nomp non2e n1onk n1ont 2nony no2o 3n2opa 3nopä no2pe 2no2pi 2n1ops no3p2te 3nor. nor2a no2rad n2o1rak no3ral no3rar 2norc nor4da 3nordb nor2des nor2d5r nor2du no3r2e 2n1org 3norh 3n2orl 3norm norm2a nor3mal 3norö 3nors 2n1ort 3n2os. nos2e1 no3sh nos2k no5ski no2s3p 2nosti nost1r 2nostv nos2u no2tan no3tart no2tä not1e2i no4t3entr no2ter4 noterb3 no2tex not1h no2tho n4oti no2tin no4tl no2t3op no2t3r 3nov 2n1o2x 3noz 2nöd 2nöf nö4fe 2n1ök 2n1öl n2ör nö4s3s 1n2öt 2np2 n3pa npa2ge n3pf np4fu n3pl np4lu n3pr n3ps npsy3 n3pü 2nq 2n1r2 n3ra nra3di nran2d nra4s3s nräu3s n3re nrebe2 nre3sz nro2h nrö2s n3ru nrücker4 2ns nsa2b n3sabo n2s1a2d n4s1a2gi n3saka nsa4kr n2sall n2salt ns3ane nsa2r ns2arg n3sark nsa4st ns4ath nsau4e nsau4r nsau2se n2saut ns2av ns2ax n2s1än ns2äug n2s1äus n4schemi nscher5g n4schl. nsch2o nscht4 n3schu nsch5werd ns2cr ns1eb n3sed ns2eh nse2ha2 nseh3ere n2seinf ns2ele ns3elem nse2l3en n2sem. nsen2sp n2sepo ns4eq n3ser. nse2rei nser4en n2s1erf n2s1erg n2s1erh ns1erk ns1erl n2serle n2s3erne n2serö ns1ers ns3ertr nser2u n2s1erw n2serz n4sety n2s1eu nsfi2l ns3hor n5show ns4ic ns3iden n3sim n4simp n2sini nsinn2 nsinns3 nsi2te nsi2tr n4sk. n3s2kal n3s2kel ns2kis n3skle n4skü n3s2ky n3smara n2s1o2d ns1of n2soff ns4om n4s3ont n2s1op n2s3ort. ns2pac n4sparti ns2pas ns4pel n2speri n2s3ph n5spie n2spo n2sprä n2s3prie n2spro n2sput ns3s2 nss4t n4st. ns3tabl nst1ak n2stale ns4ta2n1 nst3ane n2stas n2s3tat. n4staten n2stats n2s3täti n5s4te. n4steif nst3eife nst5einhe ns4tem. ns4ten. n4stent ns4ter. nst3erge ns4tes. n5steu n5s4tic n4stilg n2stob n2s3tole nst3opfe ns3tor. ns3tore n2strac n2strad n4strieb n2strik ns4trun nst3u2t nsuli2 ns2um ns1un ns2ung n2s1ut n3sy n4sza ns4zene ns2zin n4szo n4szu n4szü n4szw 2nt n3t2a3c ntak4ta ntal3ar nta2lin n4t1all nta2lo nt2alp n3tam nt2anb nta3ne nt1ant ntar3ak nt2arb ntar2c nt1ark nt2arm nt1art n4tarti ntar4tik n4t3artu ntasi2 n2t1ass n2tath n3tatl nt1äm n2t1äu nte3au nte1e nte3g4 n2t1eh n3tehe n2teig nt3eilt nt1ein n2t1eis n2temä n2t1e2mo nte4na n3tens nten4te. ntera4 nte4r3eis nter3g nteri4en ntern2e ntes2 nte3sa n2t5ess n4testri n2te4ta nteu3 nteu4eri nte3v nt1hel nt1hie nt1ho nt2hos n2thot nt2hu n2t3hum nt2i nti2en ntim3p n2t3ind nt3inf nting2 nt3inh ntini1 nti3t n3t2lem ntmen2 ntni2 ntnis1 nto3re n2torg n2t3o2rie n4t1ox n2t1öl nt4ral ntras3s nt3rau nt4raum nt5re. nt3rea nt3rec n3t4ree nt3reif n3trep nt4repr nt4ré nt3ric n2t3rieg nt3rin n2troh n2tropi nt3run n2t3rü nts2ah nt3san nt4sang nts3k nts2p nt3spe nts4ti nt2sur ntt2 nttü3 ntu4re. n3t2ü nt3z nt4zk 1nu 3nu1a nu3a2r3 nubi1 2nuc nude2 3nue nu2es nu4fe 2n1uh 3nuhi 3nui n2uk nu3k4l n3u2kr null3eb nul4lin n2um. 2n3umb n2ume 2numf 2numg 2numl 3n2umm 4n3umma 4numr 2n1ums 2n1umv 2n3umz nu2n 2nuna 2n1u4ne 3n2ung 4n3ungl 4n1uni n3unk 2nunr 2nunt 2nunv 2nunw 3nuo 2nup 2nu2r nur2i nurs4 nur2z 3nu2s nu3sc nu3se nu3sk nu3spo nuss3er2 nuss3p nu4s3t nu2ß1 3nut nu2t1a nuti2v n3uto nu2top nu2t3r 3nuu 3nux 3nuz 2nüb nü4be nür1c 1nüt 2nv2 n3ver n3vl nvoran2 2nw nwei2st 1ny. 2n1ya n2ya. 1nyh n1yo 1nyr 1nys 1nyw 2nz n2zac n2z1a2g n2z3a4k n2z3a4ne n2zant n2zar nz3a2ri nza4s n2zat n2z1au n2zän n2zär nze4la nzel3l nzel4lig n3zeni n2zense n2zentl n2zents n2z1erh nz1erl nzer2lö nz4err nz3erste nzer4tra n3z4es nze3sk nze2t nz1eta nze3u2t n2z1id nzi2ga n2zinh n2z1ini nz1int nz1inv nz3le nzlei3 n2z1op n2zöl nzt4r nzu3p n2z3wa nz3wä n2zwet n2zwir n2zwö n2z3wu 1ñ ño1 ñor2 2o1a2 oa3bi o2ac oa3che oa3chi o2ad oa3de o3ah oa3in oa4k1l oa4ku o3al o4a3la oa4me oa4mé o2ami oa4n4a oa4nn o2a3q o2ar oa4re o2a3s 3o4ase oa4si oa5sis oa4sp o3a4ss oa3te 2o1ä2 oäs3 2ob. o3b2al obal3l ob2am 2ob2ar 2obau ob1auf 2o3b2ä 2obb ob2e 2obe. 2obea 2obec 2obef o2b3ein 2oben obe4na oben3d4 1o2ber 2o3ber. ober3eis ober3in obe4ris 2obev 2obez 2o3b2i obi2e 3obj ob1la ob3lei 1ob3li ob4lit 2oblo 2ob2lö ob2lu o2boe ob1or 2obot 2obö ob3rei 2obrü ob3s2h ob3sk obs4p ob2sta 2o3bu o4bunt obus3s 2o3bü o4büb 2o3by 2oc o3ca oc1c 3occl o1ce och1a ocha2b ocha2r o1che oche4b o2ch1ec och1eh och1ei oche2l ocher2k ochi4d ochi3e och3l och3m och1o ochö4f och3r ochs4p och3t4e o1chu ochu4f och3u2t och3w o3ci ock3er4sc oc4ko ock3sz ock3ta o1cl o3co o3cy 2od2a od3ak od2dr o3de2c o3d2e3i odein3 ode2l3ag ode2n1 ode2s1e ode3sp od2et o3dex od2i 2o3dia 2odic 2odif 2o3dir 2odn o2don o2d1op odo4s od2ö 2odr odt4r 2odu o3dy ody4m 2o1e oe2b oe4be oe3de oe2h oe2l oe2m oe4mi oen1e oe4nz oe2p o2es oe2sc o2et2 o3et. oe4ta o3ets oe2v oe2x o1ë o2f 2o3fa of1a2d of1a2g of2an of1au 2o3fä of1är o3fe o4f1e2b o4f1ec 2ofee o4f1ei 2ofem o4fent 2ofer o4ferb o4f1err 2of2es o4f1e2t 2ofeu 2off. of2fa4 of4fal of4fam off3erz of2f1in of2fir of2fix 1offiz of2f3l 2offn of2fo of2f3r offs2 off3sh off3si off3sp of2fü 2o3f2i ofi3e ofie2i ofi3k4l 2o3fl of3le of3li of4lö 2o3fo 2o3fö 2o3fr of3rä of4ru of4rü ofs1 of2sa of4sam ofs2ch of2se of2si of2s3p of2staf of2sto ofstra6ssen of2su 2oft oft2a of2tei of3th oft4r 2o3fu of3uh of3ur o3fü 2og o2g1ab o2g1ac oga3d og1ang o2g1e2i ogel3dr oge2li ogener2 ogen2id ogerätein6 ogeri2 o2g1eth og2gl o3gh ogi4e o2g1ini o2g3ins og1l og3le og2lo o3g2n og4na og4ne og4ni ogoi3 og1o2ri og2s og3sc og3si og3s4p 2o1ha o3ha. oh1alk oh1ar o1hä o1he o2h1eis o2h1er4t oh1er2z o2herze 2o1hi 2ohl ohl1a oh2la2d oh2lä oh3lec ohl1ei ohle3l oh3lep ohler2 oh4lerg oh4l3erh oh4lerw oh3lo2 ohl1or ohls2e oh2lu ohm2a 1ohmi oh3mu ohn1a oh4nac oh3nee oh2ni 1ohnm oh2n1o ohn3sk 2o1ho oho2l1e ohol1o oh1o2p 2ohö oh3öl ohr3a oh2rel oh2rem ohren3s ohrer2 oh2rerg oh3rers oh3ri oh4rin oh4rol 1ohrr ohrt4r ohs2 oh3sa oh3t o1hu oh3w 2o1hy 2oi o1i2d o3ida o1i2m o1in o4ine oi2r o3isch. o2ische oi3se o1ism oiss2 oi4st o1i2t oi4ta oi3te oi3th oi3ti oi4tu 2oj 2ok ok2a oka3b2 o2k3ac oka3i oka2la okale2 ok2e oki4o ok2la ok3lau ok1lä ok2li ok4na ok2o ok2so ok2sp ok3t2 o3ku 3okw 2ol o1la ol3abu olaf4 ol1ami ol1ant ol2ar o3l2a3s olast4 ola2ve o1lä ol1ät ol2chr ol4d1am ol2dä ol2d1ed ol2d3eng old3ersa ol2deu ol2dim ol2d3o ol2d1r 4o3le. ole2e o2l1ef ol1eie o2l1eis ol1emb ole4p oler2 ol1erk ol1er3t ol1ess ole3u2 ol1exz ol2fa ol2fem ol2ferl ol2f3l olf1r ol2fra olft4 olgege3 olge2ne ol2gl ol2gr olie4n1 oli4er oli3k4 o4l1ind oli3tu 3oliv ol2kl olk3re ol2kro olks3 olk4sc olk4si oll1ac ol4la4d ol2l1ak ol4lau ollä2 ol2läd ol3le. oll1eb ol4l1ec ol2lei oll3ein ol3lem ol3lere oll3erh oller2k oll3er2l ol2l3erw ol3les. oll3ess ol2lic olli4st ol4lk ol2lo2c ol2lo2g ol2lop ol2lö2 olls4 oll3sa oll3sp ol2lu ol3lus ol2of oloni2e olo3p ol1ort olo3st olo3t ol2ov ol3s2k ols4t ol3te ol3t2h ol3ti o1lu ol2y 4o3lys ol2z1a olzer2 ol4z3ern ol2zers ol2zim ol2zin ol2zo ol2zw ol2zy 2o2m o3ma o4ma2bl o4m1a2ge om1alg om1all o5man. oma2n3er o4m1ang omani2e om2anr o4m1ap o4m1ar2s o4m1art omar2te o4m3a2sy omat2i o4matom o4m1au o3mä o3me o4meb om1ebe o4m1ef om1ei o4meis o4mele omen3t4an o4mep omer2 o5mer. om1erh o4meru om1erz o4mex o3mi omi4c3 omi2e omiet1 omil3l om1ind om1ing o4m1inn o4m1ins o4m1int o4miso om2it om3ma om3m2e om3mu 3omn o3mo o4m3oa o4m1org om1o2ri o4mox o3mö ompani2 om3pf oms2 om3sk omt2 om3th o3mu o4mum o4munt o3my 2ona on3a2b on2ac ona3g o3nal on3ann onanz3ei o2n1ap o2n3arb ona3th 4onatol onat2s o4n3at4t on2au 2onä on1äh on2dan onde4rers ond1r on2dra on2drin on2d3rü ond3sk 2one o2n1e2b on1ec o3nee o2nef one3h o3neig on3ein on3ele on1ema one4n1 o4n3ends on2eng onenz4 on1ep o3ner. on1erb o2n1erd oner2fa o2nerh on2erka on1ers o3nett on2eu on3f2 on3gl ong4le ong4r ong3s2 on2gue 2o3ni oni3de onie3g oni2ga o4nikan o4nikb o4nikf o4nikg o4nikk o4nikl o4nikm o4nikp o4nikr o4niks o4nim o4nind o4ninh o4nins on3k2 3onke onk4n onli2 onlo2c onna2 on5n2an on3n2e 2ono1 o3nod o2nof o2n3oke o3nom on1orc on3ord ono3s ono3t2 ons1a2 onsau1 onsch2 on2seb onsen1 on5seq onse4t on4sho on5sic onsi2d on5sim ons3ing ons3l onst2a ons3tie onst4r on3ta on2t1eb ont3end on2t3erl on2th on2t3rat ont3s 2onuk o3nur 2onut on3v 1ony o3ny. on3z2 onze3in oo1c ooch2 oo2gl oo2k3l oo2kn oo4mb oo4mo oo2ne o1o2p oo3pa oop2s o1or oor3a oor3d oo4sk ooss4 oo2su oo2t1a oot1ei oo2t1h oo2t3o oo2tr oot2s3t oot3t oo2tur 2o1ö2 2op. op3adr op1akt opa2le op1ang 2opä 1ope 2ope. 2o3ped o4p1ef 2opei 2opel 2open 2opep o2per o4pera op1erh 2o4pf. op2f3a op3fah o3p2fä o4pfe op2fem op2fin opf3la op3flü op2fo op3for 2oph2 o3phe opi3a2 opie2r3u opin2 2opl op3lag op3le op5leu op2ne 2opo opo4la op2pan op4pl 1oppo 2oppt 2opr op3rec 3o4psi op3sz 1opt2 2opte op3th o4pti opt4r op3ty o2pum 2o3py 2oq 2or. or1a 2o3ra. o1raa 2or3a2b o2rabb o2r3add or3adr o1r2ag 1orake ora4ku o1ral oral5l o4r3alm or4alt or2am or3a4mi o1ran3d4 or4ane oran2f oran2m oran2ze or3app 2orar o1r2as o2r3att 2orau orau2s oraus4wa or2av 2o3raw o1ray o3rä or1änd or1ät orb2l or1c 2orca 2ord. 2orda ord1am or2d1ar or2dau 2ordb or3de. ord3eng ord3ermi or2d3erw orde4s or2deu or2d3ing or2d1ir or2dit 1or4dn or2do4 2ordr or4ds ord3t 2ordu 2ordw 2ore ore4as o2r1e2b o2r1eck or1e2di o3ref or1eff ore2h o2r1ei o3rei. o3reie o3r2eif o3r2eis orems2 o3renn oren4ne o3rep o2r1er o3r2ere o3r2ero ore4th o2r1eu 2orf or2fac org4a org2e 2orget or3ghi 2orgia 1orgi3e or2gl or3gla or3gle or2gn or3gne 2orgr 2orh 2o3ria 2o3r2id orid3i 4o3rie. o3rien. ori4eng ori4enr o4rienti ori4env o3rier o3ril ori3m or1ima ori4mi 2orin o2r1ind 2or4io o2riso 2orit 2ork ork3s 2orm or2mam or2mang or2mans orm3asp or2m1eb or2m3erf or2mer2g or2mor orm3ord orm3org or2mum ormu4n or4muni or4munt ormwa5r orn3ack or2nal or2nan or2nar or2nau or5ne. or4nei or5nes or3ni or4nin or3no 2o1ro o2r1ob or3oly oro3n2a or1opf o2ro2r o3rou or1ox 2o1rö 2orp 2orq 2orr orr4a or3r2e 2ors2 or3s4a ors4c or3sche or3sh or3si or3sk ors4t or3sz or2t1ak or2t1an orta2r or3te. or2tef orte4n or3ten. or2ten3g ort3erb or2tere or2t3erf or2t3erg or2terk or2t3erl or3tes or2t3e2v or2the orti3en or2tin or2t3off or2t1o2r or2tö ort3rad or2trau or2t3räu ort3re or2tro or2t1um 2o3ru or2uf or1uh orum4s o4r3un oru2r orus3 o2rü or3z2e orzel5 or2zw 2o3s2a os3ad osal2 o4s3ami 2osc o4s3ca osch3ar o3sche osch3le 2ose ose1e ose1in2 os2el ose3l2a o2s1er2k os2ex 2osh o4sh. os3hak o3s2hi o4shö o4shs os4hu 2osi os2im o3sk o4sk. os2kal o4skb o4ski 2os2kl 2os2ko o4skr o4sks o4skv o4sky 1osm os5ny. 2oso osol1 o2sö 2osp os3pec os5pfa o3s2po os4pt 2oss o4ss. o4ssa oss2abb os2s3ac oss3ala oss3and os4sä o4ssb o4ssd o4ssel o3ssem. oss3enke o3ssent oss3enz oss1ep oss3er4b osser2e osseri2 o4ssf o4ssg o4ssh o4ssi os5sis os6sisr o4ssk o4ssl o4ssm os2s1o2 o4s2s3p o4ssr o4sss o4s2s3t os2su o4ssv o4ssw o4ssz o4st. ost3abl o3stal. ost1am ost3ang ost1ap ost1a2v oste2n ost3engl o4s3tep o4sterd oster3e oster6weit ost3eur ost1h o2stid osti3en o2stin o3sting os4tö ost3ran o2st3rä ost3re ost3rot os4tru ost3uf 2osu2 os1um osu4r 2o3sy osyri5 o3s4ze 2oß o2ß1el o2ß1ent o2ß1en2z oßer2 o2ß1erb o2ß1ere o2ß1erf oß1is oß1u 2ot o2t3abi o2t1ah o2t1ak o3tam ot1ant o3tark ot1a4st o2t1att o2t1au o3tau. ot2ax ot1ä o2teb ote1i o4t1eib o4t1eic otei4n ote3in. ote3ine ot3einh ote3inr o4t1eis ot2el ote4l1a o3tem o4t1emi ot2em3p2 ote4na otens4 o2tentb ot1erb o4t1er2l o4t1erw ot4es ot2har o2them o2t1hi o2thu o2til o2t1i2m otli4 ot2o oto3b ot3off oto2ph o2t1ö otra3c o3t4ran otra4s3 ot3rat ot3re ot3ric ot4rig ot3rin ot2s3at ot3sch ots1o ot2s3pr ot3sti ot3s4tra ot2su ott3akt ot4t3an ot4t1a4s ot2teb ot2terh ot2ter2k ot2t1h ot2tim ott2o ot2t3r ot3t4ra ot3t4ru ot1url ou3f4l oug2 ou4ge ou3gl o1uh ou1is. 2oul ou2le. ou2les ou4li 2o1um 2o2u2n oun2ge. oung5s4 oure2 ou2ret ouri4e4 ourme4 our4ne. ou3sa ous2i ousi2e ou3s4t 1outf ou3ti 3outp out3s2 outu4 2o1ü ov2a 2ovel o3ven oviso3 2ovo 2ow o4w3al o3wec ow2er o2wer. o2wh o3wi owi3en ow4su o2wu 2ox. o1x2a 2oxe o2x1el o2xid 2oxk ox3l o2x1u 1oxy o1yo oz2 o3za 1ozea 2o3zen ozen2ta ozes2sc 2o3zi ozir3 ozon1a 2ozy ó2k ór3d2 ö3ba öb4au öb2l ö2b3le ö2b3r 2öc ö1ch öch3l ö2chr öchs4t öch6st3ei öchst3r öde1r ödi3 ödienst6 1ödu ö1e 1ö2f ö3fe öf2fa öf2fl ö3fi öf3l öge3le ögen4s1 ö2g3l ö2g3r ög2s ö1he öhe4n1 öhl4e4 öhre4 öh3ri öh2s ö1hu ö3ig. ö3isch. 1ö2k2o3 ö2k3r ök2s ö2l 3öl. öl1a2 öl1ei öl1em öl2f1ei ölf2er öl1in ölk4e öl2k3l öl2la2 öll1an 3ölm öl2nar öl1o ölo4f öls2 öl3sa öl3sz öl3tu 1ölu ölz4w öm2s ön2e ö3ni önizi1 önn2e ö3o2ta öoti1 2ö2p ö3pe öpf3l ör3a2 öra4k örb2e ör2b3l ör1c ör3de ör2dr ör3dra ö2r1ec ö2r1ei ö2r1e2l ö2r1e2m öre2n ö2r1ene ö2rent ö3r2erb ö2r1e2r2e ö2rer2f ö2rer2g ör2erh ö2rer2l ör2err ör2erw ö3r2erz ör1ess ör2f3l ör2gl ö2rim ör2kl örn2e örner2v ör1o2 örpe2 örs2e ör3sk ört2e öru2 öru4n ö2r1une ö2sa 2ösc ö2sch3a ösche2 ö2sch3ei ö4schen4e öscher4 ö4sch3erf ö4sch3eri ö2schi ö2sch1l ö2sch3m ö2schn ö2schw 2öse ös1ei ö2sein ös4en ös4es 2ösl ö2sp ö3s2s ö4ss. ö4ssb ö4s4s1c ö4ssd ös3ses ös3set ö4ssl ö4ssn ö4ssr ö4sss ö4s4st ö2st1a2 ös4te ös4un ö1ß ößen3 öß2ti ö2t3a öte4n1 ö2t3r öt2sc öt2tr öv2 öwe2 öze3 özes4 1p 3paa p1ab p2abe pab2l pab4rü 2pabw 3p2ad 2padr pa3el pa3fr 3pag2 pa3gh pa1ho 3pak pa3kl pak2to 3pal2a pala3t4 3palä 3pal2e pa3l2i pal2ma pal2mä pal2m1o 2palt pal2t1a pal2tei pal2tr pa4m3a pa2nar pa4n3at pan3d pand2a pan4ds pa2neu pang4 2pange pa4nisl pank4 2panl panne2 pan4n3eb 4pannu 3pa2no pan3sl 3pan3t2h 3panto 2pantr 3panz2 pan3ze 3pap papieren4 papie6r5end pap2pr pap2s papst1 pa2r3aff par3akt pa2rant pa3rap pa2rä 2parb p2arc par3d 2parer parer2g 2parg pargel4d 3park. park3am par2kau 3parke par4kr 3parks par3m2 pa2ro 2parp 4parr 4parta 3partei 3parti 3partn 3party 2parv 2parw par3z4 pas2e pa3s2p pa4spe passer2 pa6ssio pas2sp pa2ßu 2pat. pat1a pa5tag pat4c pa3t4e2 pat2h 3pati 3pat4r 3pau 4p1auf pa3uni 4pausz 3päc päck3er 3päd pä2d1er 3päs3 pä4ss pä4ta pä4t1e2h pä4tent pä4tep pä4t3erb pät1h pä2to pät3s4 pät5st 2pb pbe1 2p1c p3ch 2pd2 pda2 pe2a2 pea4r pea4s p1e2b pech1 3pech. 3peda 3peel 2pef 4p1eff 3peg pege2l pei1 4peic p2eim 4peis pekt2i 3p2el pe4l3ab pe4lai pe2l1au pe2l3ax pe2l1ä pelb2 pel3d4 pe4l1e2h pe2l1er pe2let pe2leu pe4lh peli2d peli4n pe2l3ink pel3inn pel2ins pel3k pel3l2a pel3lä pel3l4e pell2i pe2lob pels4 pel3sp pel3sta pel3t2a pe2lut pel2zin pena2 pe4nas pe2nä pen3d2a pe4nen1 3penh pe4ni2t pe2n1o pens4 3pen3si pen3so3 3pensu pen3sz pent2a 2pentw penty2 pe2nu2 pen3z4 3pep pe3pi pept2 pe1ra 4perad pe2rak pe2r1ä per1e2b perer2f pe3r2id pe3r4io 3perle perra2 per2rad per2r3an per4rä2 per2ric per2rie 3pers 4persi peru2 pe3run 3perü perwa4r pe3s2a pese2n 3pes3s2 pest1o pe2stop 3pet pet4r 2pf p2f1ab p2fad pf4ah pf1ai p2f1ak p4f1am pf1ans p2fa2r pf3are p2f1au pf4av p2f1är p2f1äu 4pfe. p2fef p2fei pf1eim pf1ein pfels4 pf1e2m p2fener p3fens p3fent p2f1enz p4f1ep pfer3a pfer4pro pf4es p2f1et pffa3 pff4l pff4r p2f1i2d pf1inn p2f1ins p2fl pf1lam pf4lan pf4leg pf3lei pf3lo pf4lü 4pf5lüm pf4lw p2fob p2fom p2fo2r pf1ori p2f3r pf1ra pf4rä pf4ro pf5roc pf5roh pf4rü pfs2 pf3sa pf3se pf3sl pfs4t pf3sz pf3t2 pft4r p4fuh p2fum 2pg2 p3gl pgra2 2ph. phal4te p1hand 3pha3s p1hau phä1 4phär 2phb 2phd 2p1hei phen3d2 phe4n1e phen3s 2ph1ers 2phf 2phg p2hid phik1a phi2kan 3phil phi2t 2phk ph2l 2phm 2phn p2ho. p2hob pho2s 2phö ph2r 2phs ph3t2 2phthe phu4s phu3t 2p1hü 3p2hy 4phyk 2phz p2ia1 piab4 pia5ka pi4ali pi4a3n piap2 pi2ar pia3s pi1ce pi2e pie1i piela2 pieler4ke pi3ent pie2ra pie2reb pie2rei pies4 3pig pi3gl 3pil pi3le pill2 pil2zer pil2zw p2im pi2nad 4pind pingen2 ping3s 3pinse pin3sp pi2o pi3onu pi3os 3pip pi2pe pi4pel 3pirate pi3ri pi3s2k 2piso pis4t pi3sto pit2a pi3t2h pit2s pit3z2e pi2z1in 3pizz 2pj 2pk2 pku2 p2l2 2pl. 3pla 4p3lad p1lah p4lak pla3na p4lau pla2y 3plä 2p3le. ple1c ple2e p4leg ple3n2 2p3ler p4leu p4lex 2plig 3p4lik p4liz plo3n 2p3lu plü2 2pm2 p3mö 2p1n2 pob2 2po1c 3pock 3pod 3poe po2el 2p1of 3pog 2poh 4poil 3po2in po2it poka2le 3pol po2lan po3lar po2l1au pold2e pol3f po3li pol3lo po3lo5p pol3z4 pom2ph poni2e 3pont2 po1ob 3p2op po4p1ak po2p1ar pop3l po2pli po3p2t po1rau po3re porf4 pori2e pork4 3portal por2th 3portio 3porto. 3portos 3portr por2tre por4t3ric 3posi pos3s2 pos4t po2sta post3ag po2stä po2st3ei po5stei. pos6tel po4stem post3ra post3ri pot1ar 3potä 3pote pot2h poti2e po2tin pott1r po2t1u po3un po2w powe2 p2o1x pö2bl pö2c 2pp p2pab pp1ang pp1ans ppa2p p2pat pp1au ppe3e p2p1ei ppe2l1a2 ppeli5ne ppel3z pp2e2n1 pper3r p2p1erz pp3fr p2p1h pp3he pp3l p4p1lac p4plan p4p1lä p2ple pp1oh p2p3ö2 pp3p ppp4f p2p3ra p2prä pp3ren p2pri pp3rol pp3rot pp3ru pps2 pp3sa pp3sy ppt2 ppt4r p3puc p2pul p2p1um p4punk ppyl2 p2r2 2pr. 3prak pra4s3 pra5sp 3prax 3präl 3präm 3präp 3präs 4pre. 4prec 3pred 4pree1 pre2ei 2preg 3preis prei2s3c prei4sei prei4ss prei2s3t 2preiz 3prem pren2ga 2p3rer pre3sa press2e pri2e 2prig pri2l1 4pring prings4 3prinz pr4io pri3o4n 3pris pri2t1 priter2 prit3t4 4pritz 3priv pro1 3prob pro3be 3prod 3prog 3proj 3pr4om 3prop pro3pe 3prosa 4pross 2proß 3prot prot2e prote3i 4prott 3prov 3proz 2prö 2pru 2prüc 3prüf 4prüh 2prün 2ps ps1ad ps2hi psi2e p2sö pss4t pst1au ps4te p2stu 3p2sy 4psys ps2ze 2pt pt1a pt2ab pta2g p2tana p2t3a4t pt1ä p3te. p2t1e2b p4t3ec pt1ef pt1ei pt1emi p3ten p4t1en2g p4t1ent pt1ep pt3ernt pt1erw pt1erz p3tes p3tet p4teta p4t1eti p2t1h pt1id pti2de pt1in pto4mo pto4na pto2p pto2w ptpo4 pt3r ptri4e p2tro pt3s2 pt4sl pt1uh pt1um p3tung pt1urs p2tü ptü4b 3p2ty pt3z ptz4w pu1a 3pub pub4l 2puc pu2dr 2p1uh 2puk pu2kl pu2k1o pu3la pu2lin pul2sp pul2s3t 3pulv 4pulw pum2pl 3pun 4pund pun2e pun2s 4punt 3pup 2pur pu2ra pu2rei pur3m pus2h pu3she pus3s 3put put2e put2s puzi3 2pü 3püf pü4lei pül3l 2pv 2pw pwa4r py3s py3t 2pz2 1q 2qs qu2 qu4ac qu4ar qu4at quel4la qu4en qu4er que3rel que4te. 3queu qu4in 1ra. r1aa ra2ab 2raac 2raal ra3ar r2a1as r1ab ra2b1ar r2abä 1rabbi rab2b3l 2rabd ra2bei rab2er rab3erd 2rabf 2rabg 2rabh 1rabi r2able ra2bli ra2b5lo 2ra2br 2rabs2 2rabt 2r3abw 1raby 2rabz ra2ce 2r1acet ra2cheb ra2cho 2rachs rach4t3rä ra2chu r2ack 1r2ad r4ad. rada4 ra2dac ra4d1am ra2dan 2radap 3radar ra2de4i ra2d3end rade3s 3radf 3r4adh r4adi 3radio 4radit 3rado 3radp ra4d1r rad5ri rad3t4 r2af raf3ahn raf3ar rafe2 ra4f1er raf3r rag2a ragein2 rages4 2ragg ra3g4le 4ragm ra2gn rag5ne r2ago rahle4n 3r2ahm r1ahn 2ra1ho 4raht r2ai 2raic rail2l 2r3air raka3 1rake 2rakk 3ra3k4l ra4kre ra4kro ra4kt 2rakti 1rakü 2rakz r2al r4al. ra2l1a4 ra4l3ab ra2lä ral3b4 3r4a4ld r4ale ra2l3end ra2lent ra2l5ern ra3lex r4ali ra2lid rali3er ra2lin2d ra2l3ing ralin4sp ralin2t 2r3alk. 2r3alm. 2ralp. 4ralpe r4als ral3sc ral3su r3alt 3r4al3t2h ra2l3u 3r4aly ra4mei ra4mer r2ami r2amm ram2man ram4mens ram4m3ers ram4mit ram4mu 2ramn 3ramsc 2r1amt ramt2s 2ramu 2rana ran1ad ran3ade r1a2nal ra2nan ra2nar ra2nau 2ranb r2anbe r4anda r4ande ran2dep ran2d3er 3r2andi rand3s 1raner 2ranf ra4ng 2ranga ran2gan ran4g3e4be 3rangi r2angl rangs4 rang3sp rani3e r3a4nil ran3ka ran2kr ran2kü 2ranl 2r1anm r2anmi r2anmu 2ranna ran5ne 2r1anp 2ranr 2rans r2ans. ran2sam ran2spa 2rantei r1anth r2anto 2rantr 1ranu 2ranw r2anz. r2ap 2rapa ra2par 2rapf 2rapo ra2pok ra2pos rap4pr 2r3a2pri 2r1a2q r1ar r2ar1a 2rarb r2are 3r4arei raren1 rar3et rar1e2v r2arf4 rar3in ra3ris r3a4rist 4r3arit r2ark 2rarm raro2 ra2rom rar3r 2rart 2rarz rar3zw ra3s2 r4as. ra4sar ra4sb ra4schl ra4sd ra5seo ra5sex ra4sf ra4sg ra4sh ra5shi ra4sk ra4sl r2a4sm ra4sn ras3si r2as4t ra4st3ei r3asth ra4sto ras5tri ra4sw 2rasyl 2raß 1rat r4ata ra2t1an ra2t1ei r3a2tel ra3tes 3ratg r4ati ra4tid rati2e 2ratla 2ratm rat2o 2ratom rat3r ra2tra rat4re rat5schl 2r3atta 2rattr 4ratz rat3ze 4rau. 3raub. rau2bri 4raue rau3e4n 2rauf rauf3sa 2rau3g2 3raum rau2m3ag rau2man rau3me. rau2mi 3raup 4raur 2rausb 3raus4c 2rausd 2rausf 2rausg raus4gewä 2raush 2rausl rau4sp 2rauss raus4sche 2rausv 2rausw rau3ße 2raut raut1r rau2tra rau4tro raut3s 1raü r2ax raxi4s3 r3axt r2ay r2az räch4s 3r2äd 2räf rä3fr 2räg 2räh 2räm 3rän. 3räni 3räns 2räp 2räq 2r1är r2är. rä3ra rä1ro rä4sa rä4sc räse2 rä5sse rä2st räs6tel 3rätse 4rätz rä2u 4räue räu2s räus4c räu5schen. 2räuss 2räuß 4räut 2räx 2rb r2b3a2b1 r3bac rba4del rb2al r3bam r2bang r2bant rb1art r2barz rb1auf rbb2 rb1ech rbe3erf rbei3d2 rbe3inf rb3einh rbe3int r4belä rbel2o rbe3r2e rb1erl rbe3rum rbe3sl r2bim r2binf r3bit rbit2a rbi3tu rb2la rb4la2d r2blan r4blasser r2b3last r3blat r3blau r2b3le. r3blen rb3ler r2bleu rb2lin rb2lö rb3lös rbmas3 rb2ob r2bonk rb3ras rb3rea r4b5rechts rb4ri rb4sam rb2sei rb2ser rb2s1o rb4stä rb2su rb4sz rb2u rbü4b 2rc r1ce r2cer r1che. r1che2n r1ch2i rch3l r3chlo rch3m rch3r rch4ro rchs4 rch3sp rch3t2a rch3w r1ci r1cl 2rd rd2ac r2daf r2d1ak r2d1a2l rd2amm rdani1 r2dann rd1ant rd1ara rd1ark r2darz rdär2 r3dee r2dei rd2ei. r2d1elb r2de2le r2delf rdels2 rdem4 rde3nar rden3d2 r2dengl r2dents rde3ob rde3ono rde3r4er rderin4s r2d3ernt rder3w rde3sp r2d1e2x rdie3ne rdien4sta4 r2d1inn rd1iri rd1ita rdo2 r2dof r3don rd1os rd3oss r2d1oz r2dö rd3rat r2drau rd4ri rd5ric rd5ris rd4rö r3d4rü rds2a rd2sän rd3s2k rd3s2z rd3t2a rd3th rdt4r rdt2s r2d1uk rdwa4 1re 3re. re2ade rea4l3erw 4re2am re3as re3at. re3ats reatu3 2reä re2b1a re2b1l reb3so rech3ar 4rechs rechter4 2rechth 2reck. 2recki reck2st re4ct 3red. 4redd re2del rede3r2 2redi1 re2dik 3redn 3redu re1ebe re1el re1em re1eng re1er 3refe 4reff r2eff. 3refl 3re3fo 3reg rege2l3ä regenmas5 4r1egg re2hac re2h1ar re2h1ei re2hen4e re2h3ent re2hi reh1l4 re2h1o re3hol 3rehö 2rehr reh3re reh1ro reh4th re2hü r2ei. r2eib rei2bei rei4bel rei2ble reib1r rei2bra r2eic 2rei3d r2eie 4reier. reier2t rei2fei 2reig 3reigä 3reigeh r2eigel 4reigens 3reigi 4reign 3reigru r4eih rei3l2a rei3l2i 2r1eilt reim2p r1ein 2rein2a rei3nal 2reinb rein2du rei3n2ec reinen3 2reinf rein4fe re2info 2reing 2reinh 4reinn 4r3einr 2reins 4reinsa rein4sel rein4sz 2reint re1in2v 2reinw 2reinz 2reisar 2reisb 2reisf 2reish 2reisr 4reisu 2reisv 2reisw reit3s4 3rek 4re2ke 4rekk 2rekz r2el. r2ela re3lat 2relb rel2e relea4 re5lei re2lek 4relem r2elev 2relf reli1 2relit 2relix r2ell rel2lar rel2lei re3lo r2els 2relt relu2 3r2em. 2r1emb rem2da re2m1ei re5men 2remi re3mig r2emit 2rempf rems1c 2rem2u r2en. r2ena 2rena. re4nac re3nad re3nal re4n3an re2nä r1endg 3rendi ren3dr 2renerg 2rengag ren2gan 2rengp 3renh re2ni re3nik 3renm ren2nar ren4nene ren4sein rens2p r4ent. 2rentd 4rentera 2rentf 3rentfo 2rentg 2r1entl rentmo4 2r1ents 3rentss 2rentw 2rentz r2enz ren2zan ren2zer renzer4f renz3er4s renzer4w ren2z3in ren2zw re2ob re3or 3repe 4re2pen 2repi re2pis 2repoc 2r1e2pos 4repp 3repu 3r2er. rera2 2r1erb 3r2erber rer2bi rere2 2rereig r1erek re2r1ep 3r2erer r1erf 4rerfah r4erfe 2rerfi 2rerfo r2erfr r3er2fü r1erg 2r3ergeb 3rergebü r2ergen 3r2erges 2rer2go rer2gr r2ergru r1erh rer2hö re3ri re4rid r1erk rer2kan rer2ke 4r3erken 3r2erki 3r2erko r2erkre r1erl 2r3er2la 5r4erlag 2r3erleb r2erli 2rerlö r1erm 3rermo rer2n 2r1ernä r1er3ne 2r1er4ni 4r3erns 4r3ernt re2rosi 2r1er2ö r1erre rer4reg rer2rei r1erri 3r2ers. 2r1ersa rer5scha r2erse 2rersp rer2spa rer2sta r2erstr 2rer4su r1ert4 r2erte 2rertr rer3tu r1erw r3erwa rer2wac rer2wec r2erwes 2r1erz rer2zä 3r2erzy 3r2es. re2sa re4sam resche2 re2schm re2schw rese2h res1of 3resol 3reson 2re4ss 4resse res3sei res4serh res4s3erw res2sto 4ressu res6tau re4stent res6tex re2stra 2restu 3resu 2re2ß1 re2t1ak 2re2tap re2tau ret2e 2r1e2th re2tra re2trol re2u reu4eri reu3g2 2reul re3uni 2r1eur reu2zei 2reü 4r3eva 2r1evid rewa4r re2wi 4rewo 2r1e2x1 3rez 2rezi 1ré 2rf rf1ack r3fahrt rfall4s rf3aue rfäs3 rfe2i r2fent rfer3g r3f2es rff2 rffa3 rf3fe rfi2le. r2fland rf4lä rf3lic rf4lö rf4lu r3flü r2fo2b rfolg4s r3foli r3fon r3form r2frauc rf4ru rf4rü rf2sa rf4sam rf2s1ä rf2su rf2ta rft4r r3f2u 2rg r2g1a2d r2g1ah r2g1ak rga2ner r2g1ap r2garb rg3art. r2g1ask rga5stes rg4at rgd2 rge4an rge2bl r3gebo r2g1e2c rg1ein rge2l3er rge2li rgen2ge rgen2z3w r3ges r2ge4tap r2geto r3gew rg2ins rgi2sel r4gl. r2glan r3glanz rgleich4s5 r2gleu r2glig r2g3lit rg2log rg2lu r2g3na r2gne r2g3ni r2g3no r2g3oa r2gob r3gog rg3op r2g1or rgö2 r2g1öd r2g3ral rg4rau r2grän r2greg r2g3res r2gret rg3rin rgro3sse r3grö r3gru rg3rüs rg3sä rg3se rgs2ei rg4sel rg3s2i rg3sp rgs4pe rgs4pi rgs4po rgs4tr rgs4tu rg3su r1h2 2rh. r2hag 2rhah 2rhak r2haltb r3han 2rhau 2r3hä r2he. r3hea 2rheb 2rhef rh4ei 2rheit 2rher 2rhi 2rhof rho2i3 2rhol r3hop 2rhot 2rhöl 2rhs 2r3hü 1ri ri3ams ri1an ri2ano ri1as ri2ast rib2bl ri1ce ri1cha ri3chl rich3ter richt4spo 4rick ri2con ri2dau 2ride r2ide. ri2d3e2l ri2dent r2i3di 2ridol rid3r 2ridy r2ie rieb4ste 4riefm rie2f3r rieg4s3 ri2e1i ri1el rie3l2a ri3els ri4enä ri2enb riene2 rie2nu ri1er. rie3r2e riere4n ri3ers. ri1eu ri2fa ri2fä ri2fei ri2fer3 rif4f3end rif2fer ri2f1o ri4fr rif2ter 3rig 4riga 4r3i2gel ri2gene 4rigg rig1l ri4glä ri3g2o3 rigs4 ri1i rii4t ri2kar ri2kä ri2kin ri2kn ri2kone ri2kor ri4kt ri3kü 2rima ri4mag ri2me. 2rimm 4rimp rim2s ri3na r1inbe rin2c 2r1indu ri3n2e rine1i 2r1inf 3rinfr r2ing rin2ga ring3le rin2gr ring3sp 2r1inh 2rinit 4rinj 4rink rin2kl rin2ko rin2kr 2rinl 4r3innenm 2r3inner 2r1innr r1innu ri3n2o3 4r1in2q 2r1ins rin2si rin2so rin2spe r2inspi rin3str 3r2insy 2rint 4rinte rin4tent rin4t5re 2r1inv rin2va 2rinz ri2ob r3ion r4ior ri3o2st ri2pl ri3po 2r1ir r2is ris2a ri3s4an ri2scho ri2schw 3risik ri3s2ko r3iso ri4s3p ris5pi r3isr 3riss rist3ers ristes2 ri2st3r 3ri2ß1 r2it 2r3i2tal rit3ant rit2i 2ri3t4r rits2 rit2t3au rit4tei 3ritter rit4ter4f rit2to rit2t3r ritt2so rit2u r3i2tum rix1 ri3xi 1rí 2rj 2rk rka2b3l r2k1ah r2k1ak rk1all rk2am rk1are rk1asp r2k1att rkauf4s r2k1äh r2kelem r3kell rke2n1 rken2er r2k1er2l rk3ersta r2k1er2w r3k2es r3ket rk1im rk4las rk4lau rk4lim r2klis rk2lo rk4lu rk4ne rk5neu rk5ney r2kob r3kol r3kon rk2op rk1o2ri r2kou rk2ö rk3räu r3kri rk3rin r2k3rom r2krou rk2sal rk2sei rk2sel rk2ser rk2so rk2sp rkstati4 rk4stec rk2stoc rk2ta rk2tel rk2t3eng rk2t3erf rk2terg rk2t3erl rkt3ers rk4tersc rk2t3erw rk2t3erz rk2teta rkt2i rk2t3in rk2t1o2 rkto4b rk2t3r rk2tum rk1ums rku2n r3kup rkur3s rku2sa rkus3s rku2s3t r2küb 2r1l rl2ab r3lag rlan2d3i r2l1ar r2l1a4sc rlas4t r2l3aug rle2a r3lec r3leg r3lep rl2et r3lex r3l2i rlicht6e rli4ne. r3l2o rlou1 rl2ö rlös5s rls2a rl2spr rl2sto rl3t r3l2u rlus4t rlu4ster rlu2str r3ly rlz4w 2rm r2m1ad rma2la rm1ald rmali3e rm1ami r2m1ank rm1anz r4m3aph r2marc r2marz rma4spe rma3ssen rmas4sens rmat2o rm1aus rm3d2 r2m3einh rme4na rm2ene r2ment r2meo rmer2fo rm1erg r2m1erh r2m1erl r2m1erp r2m1erw rm2es rme3sa rme3st rmeta2 r2mide rmi4nanz rminen2 rmi4neng r3minh rm3m r2m1ob rm1o2ri rm3p2 rm3sa rm3s2k rm3sta rm3t rmt2a rmu2n r4muna r2muni rmwa4 2rn rna2b rn3ab2i r3nad rn4ade r3nage r2n1all rna4n rn4and rn3ani r2nanz rna2r rn3are r4n3ari rn3arra r4n1a4st r4n3att rn3aug rn3de rn3d4r r2nef r3neho r3nei rn2eid r4neif r4neis r2n1elf rn1ema r2nemu rne2n r2n1ene rn2eng r2n1e2p rn1erg rn2erhi rner2ke rner2ku r2n1erl r2n1ert r2n1erw r3nes r3n2e2t rne4t1e rnet3r rn2eu rne3uf rn3f rn3g2 r2nid r2n1in r4ninf rn2ing r3nit rnk2 rnn2 rn1ob rn2obr r3nod rn2oh r2n1op r2n1or rno2w rn1ö rnö2d rn3sa rn3s2ä rnse4ha rn3s2p rns2u rn3s2z rn3t2a rn3t2e rn1ur r1nü r1ny rnz2 ro3ar ro3as r2oba 2robj 1r2obo ro2bo2r 2robr ro2bre 2robs ro1ch roch2a 3rock. r2o3de rodi4e rod4r roe2 ro2ed ro4fen 2roff 4rog. ro3g2a 3rogg ro2h1in roh1l2 4rohn ro2hö 3rohr ro4hs 1roi ro3in ro2it rok2l ro3le ro2liv ro4ll rol2lan rolle4 roll4en rolli2n rol4lini rol2lis r4olo 2roly 4rom. ro4mad ro4mal 3roman. 2romb ro4mei romen3e ro4m1er ro5mes 4romm 2romn 4romt r2on ro3n4ab ro2nan 3rond ro2nerb roni2e ro2nika ro4niki 4ronk 3ronn ron4tan ron2tel ron4tend ron2tr ron2t1u ro1ny ro1o4f rop2a 2rope 2ropf 1ropl ro3pn 2ropt r1or ro2r3al ro2rat 2rorc ro2rel 2r3orga ro2ro ror3th rort4s ror2ü ro3se ro3sh ro3s2i ros4p ros6sac ross1c ros4st ros4t ro3sta ros5tel ro2st1r ro2sum 4r3osz roßen2 ro2ßenk ro2ßi ro2ßu ro2tan ro4t3au ro2tä ro3te ro2tei rot3s2 rot2ta 3roul ro3unt ro4up 3ro4ut 2rox rö2b3l rö2du 2röf rö4fe 3röh 2r1ök 1röl 2röl. rö3le rölla4 r1ölp 3römi r1ör r2ös. rös1c rö3se 1rösl rös6tel 3rötu 2rp2 r3pa rper1e rperer3 rper3in r3pf2 rpf4l rp4fu r2pli rp4lu r3po rpo2str rp4rä r3pri r5prod r3prü rp3se rps3t rp3t r3pu 2rq 2r1r rr2ab rra4s3s rrat2s rr1auf rr1äm rrb2 rr1c r5rega r5regl rr2ei rre2le rre2pa rrer2 r2rerh r2rerl rre2ve r4rezi rr2hen rr2hos rri3erm rri3k2 rr4is rrm2 rr2n3au rr2o rr3obs rr2th r3r2u r3r2ü rrücker4 rrz2 2rs r3sabo r2s1a2d rs2al rsa4lin r4samp r4s1amt rs2an rs3ana r2sanf rs3ang rs3anm rs3ar r3s4ark r3sau rsch3e4b rscheiner5 r3schen r4scherl r5schu r5schwu r5schwü r2s1ebe rse2e r2s1ef r2sein r5seit rse2n rs2end rse4ne r2sepi rs1ere r2s1erh rs1ers r2serz rse2t rs1eta rs2ext rsha4k r3s2hav r3shir r3sho rs2hor r4shu rs2il rs2ka rs2kel rs2ki r4skir rs2kl r4skn r4skor r3s4kri r4sky r3smog r3s2no rs4om r2s1op r2s3ort. rso4s rs1ost rs2p r3span rspa3s rs4pel r2s3ph r3sphä r3spl r2sput r3spü rs3s2 rss4t rst3abl r3stad rst3ala r2stale r2stans r4stant r2stas rs4tea rs4tee rst2ei rst3eing r4st3eint r4st3emi rster2 rst2erb r4sterbt r4st3erl r4sterö r4st3er4w rst1h rst3ing r2stip r2stit rs4tob r2s3tot r2stran r2stris rs4tuc r3stü rs2ums rsü3s r3sy r4szä rs2zin r1ß 2rt rt1abs r2t1a2d r2t3ae rt1aff rt1akr r2t3albe rta3l2e r2t1all rtals1 rtal2se rt1am r3tame rt1ann rt1ant r2tanw r2t1ar rt3att r2taut rt3äh rt1änd rt1ärm rte1e2 rt1ein rt2eind r4t3einh rte2i3s r2telf rte3li rtel4lei r2temo rte2n1 rte4na rten3s4 r2t3ents rten3z rteo2 rt2ep r3ter. rter2fa rt1erh rt1erk r2t3er2la rter4mit r2t3ernä r2ter2ö rter4re rt1er4s rt2er5sp rt1erz rtes2 rte3sk rte3sta rt1he r2t1hi rt2hum r2t1id rti2en rtik2 r2t1ima rt3inf rt2is rt2it rt3l rt3m r2t1ob r3top. rto3pf rt1orc r2torg r3tork rt3ram. rt3rams rt3rand rtra4s3 rt3rati rt3rec rt3res rt3ris rt3rol rt3roma r3trop r2trou rt3sc rt2s1eh rts2el rt3sex rts3h rts3ing rts1o rts4tie rt2su rt3t rtt4r rt1umb rt2u3na r4tunt r2t1urt rtu2t r2t3ute rt3w rt3z rtz2a rt4zb rtz4w 1ru ru1a ru4ale ru3a2r3 rube4 rub2i ru3ches ruchter4 rucht3s2 ru3de rude2a ru2dr ru2et 3ruf ru4f1a ruff4 ru4fo ruf2s ruf3sc rufs3p ruf2ter ru2g3r 3ruhm 2r1uhr 3ruin ru3ins ru1is 2rum ruma2 4r3umd 4rumf 4rumg ru2mi 4ruml rum2mes r2ums. 4r3umsa 4rumsc 4rumw 4rumz 2r1una 2rund run4d1a runden3e run2d3er runder4n runder5t run2do runei2 2r1unem run2en 4r1unf run2ga 2rungl run2gla 4r1u2ni r3unio ru4nis. run2kr 2r1unl 2runm 4runn 4runr r1unse 4r3unt 4runw 2rupd rupi3 ru5pre 2r1ur ru2ra ru2r1e r4us. rus4p rus3sen rus2s3p rus4st rus6ste ru2tab rute4 ru2tei ru2t1el ru2t1er ru2t1o4 ru2t3r ru2z3w 1rü 2rüb rü4bc rü4bs 4rübu rü1ch rück3sta rü4fa rü2hel rüher2 rüh1l 4rümm rü4na rün3z rü3ss rü4ssi 2rv rv2el rve4n1e r2ventz r3veo r3ver r3v2o rv2s 2rw rwe4gel r5weis rwelt2s r3werk r3wert r2wo. r3woh r3wort rwun3s 2r1x 1ry 2r1ya ry4an ry2c rygi3 ry2le ry3os ry3st rysti3 2rz rz2ans r2zar r2zat rz2än r3zeic rzell2 r3zene rz1eng r2z3ente r2zents rze2p rze2ra r2z1erd r2z1erf r2z1erg rz1erk r2z1erl rz3ersc r2z1erw rzes2 r2z1ess r2z1id rz1int rzir3 r3z2of r2z3ot rz2tan rz2th rzu4g3l r3z4wec rz4wer r2zwir 1s 3sa. 3s2aa 2s1ab sab2ä 4sabd sa2ben 3sabet sa2bit sa2bl 4sabm sa2br 4s3abs 4s3a4bw 4sacc sa3chal 5sache sa2cho sach3t s2ack 2s1ada sa2der 2s1adm 2s1a2dr sa4fe 4s1aff sa3f4r 3s2aft saf2tr 3sag sag2e 5sa3ge. 5sagen. 4s3a2gent 4s1agg 4s1a2gr sah3l s2ahs 3s2ai sa3i2k1 sail2 sai4r 2s1ak sa4ka sa5ka. sa5kar sak2e 3saki 3sako 4sakt sa4kus 3s2al. s2al2a sa2l3an sa3l4at sal2ä 3s2alb sal3bl 3s2ald sa2lerk 3sa3li sa4l1id s1all sal3la sal2le. sallo3 3sal2o sal3or sal2se s1alt s2alth 3salz 3sam 4s1a4mat 4s1a4mei sa4min 4s1amma 4s1amn s1am3p4 4samph s1an s2an. 2sa2na san4at sa2nä 2s3anb s2an2c 3s2and san2dan san2dri sand3s sa2ner 3sang. 2sanga 2s3anh 3sani 3sanken 2s3anl 2sanm 2sa2no 2s3anp 2s3ans s4anse san4sk san3sp 2santei 4santr 2s3anw 2s3anz s4anz. s4anzt 2s1ap sa2pe s2aph sapi3 sap3p 3sapr 2s1a2q 2s1ar 3s4ar. 3sara 4sarb 3s2ard s2are s3area 3sarg sar2ga sa3rin s2ark s3arm sa2rom s2ars 4sarti sa4r1u4 sas2a s1asc 2s1a4si 2s1a4sp sa4ssenb sas4sest sa5s2set 4sa2sy 3saß sat2a satan2 sa2t3ant sat1ei 2s3a2tem s3ath 3sat2i 4s3atl 4satm sat2o sa4tol sa2tr sa3ts s3atta sat3te 4s1attr s4atz 3satza sat2zel sat2z3en s1au 3sau. 3sauc 3sau2e 2sauf 4s3aufb 3saug saug3le sau2gr sau3h 3saum 3saur 4s3aura sauri1 2saus 4s3ausb 4sausf 4sausg sau2sp 4sauss 4s3ausw 2sauß s1av sa2ve sa2xi sa3xo sa2y 3säb 3s2äc 3s2äg s1äh 4s3ähn 2s1ält 2s1äm 4s3änd 2s3äp 2säq 2s1är 3s2ärg 4s3ärm sä2s3 sä4ss sä5sse 3s2ät 2säuß 2sb2 s3ba sba4ne sbau4men sber2e s3bl s3bo s3br sb4ra sb4ri s3bu sbus3 s3bü sby3 2sc. 2scab 2scac 2scaf 2scal 2scam 2scar 2scat s1ce 4s3cei 4s4ch. 3schaf s4chal sch3ana 2schanc 2schang 5schanz 4schao 4schara sch3ar3m s2chä 2schäq 2schb 2schc 2schd sch2e 3sche. 4schech sche2f 4schef. 4schefi 4schefs s4chei 4sch3ei. sch4ein. s2chema 4schemp sch3erfü 2scherk sch3erla 3sches 4sches2s 4schex 2schf 2schg 2schh 2schi4d 2schiru 3schis 2schj 2schk s4chl sch4lac 2schle. 4schlein 2schloc 2schlöc 2schmed 2schmö 2schmy s4chn 2schn. 2schneb 2schnum 2schnut 3schop 2schorc 2schox 4schör 4schp 2schq 2schrad 2schre. 2schres 2schrin 4s3chris sch3rom 2schron 2schrou 2schrus 4schs4 sch3se sch3sk sch3sti 4scht sch3t2a sch3t2i s4chu 2schunt s4chü 2schv sch4web 2schweg 4schwerk 2schwet 2schwid 2schz 2scj 2s3cl 2sco 4scoa 4scom 3s2co4p 2scs 2scu 2scy 2sd2 sda5me sdä1 sdes4 sdien2e s3do sd4ri sea2n se3at. seau4 seb2 2s1e2ben 2s1echo sech4str 2s1echt 2s1eck se2dik 3see see1i2 se2e3ig se2el se3elem see3len se3en. see3n2e se1eng se1enk se1enl se1enp see1ra seer4e se1erf se3e2r1i se1erk se2e3s2 2s1eff sef4l 3s2eg s3e2gal se2gl seg4r seh1a se2ha2g se2hak se2hel seher2e se2herk se2h1in seh3l se4h3ö seh3ra seh3re seh5ri seh3s se4ht seh1ur se2hüb 2s1ei. 2s1eid. sei3da 2s3eifer 2s1eig s2eim s1ein 5s4ein. 2seinb sein2du 2sei3ne seine3i 2seinfl sein4fo 2seing 2seinh 2seini 2seink 2seinl 2seinn sein4ne 2seinr s2eins. 2seinsc sein4stit sein4str 2seint 4seintr 2seinw 2seinz 2s1eis 3s2eism 3s4eit seit2s 3sek 4s1e2kel 4sekz s2el. se2l1a 3s2elb sel3d4 sel1ec se2lef 2s3e2leg 2selem se2ler sel3ers 2self. selin2s s3e2lit 2s1elix sel3le sel3m s2eln se2lob s2els sel3sz selt2e sem2e 2s1e2mis 2s1emp s4en. se4nad se3nal sen2alg se4nas sen3au se2nä s2enb 3sendet 4s1endl sen3d4r 2s1endw senen1 2senerg se2ners s2enf 3s4eni se2nid se2n1im sen4keli 3senku se2no se4nott se4noz s2ensa sen2s3e2h 4sensem sen4sers sen2si2d s2enso senst2 sen4s5turm sen3t2a sen3tä 2sentd 2sentf 4sentg 4sentn s2ento sen3tr 2s1ents 2sentw 2sentz se4n3u2 3senva sen3za sen2zer sen3zw seo2r 3sepa se2pen s1epi 3seq s4er. se2r3a2d ser3al se3rand se1ras ser3äus serb2 s3erbe. serd2 se2r1e2b se2r1ed se3reie ser3eim sere2m se2r3enk ser3ent s4erfe s1erfo s2erfr s1erfü serg2 ser3ga ser3gl s2ergr s1erhö 5serie se4rinf serk4 3serl. se4rm ser4mah 2s3ermit s2ern. s3erneu 4s3ernt sero4b s1e2ros s1erot s1erö ser3r s2ers. 2sersa s3erseh s3erset sers4p sers4t se3rum ser2um. se3rund se3rung s3e2rup 3s4er3v s1erz s2es. se3s2a 3sesc se2sel 2sesh se3sk s1essa se3su 2s1e4tap se2tat 2s1e2th set2i 2s1e2tik se3tun 3sety 3setz 3seuc 4s3eul se1u2n se2va 4s3evan s1ex 2sexa sex4am se2xe sex3en s2exi s2exo 4sexp sex3t4r 3sexu 2sexz 2sf2 s3fa sf4ak s3fe s3fi s3fl sf4la sf4lö sf4ru sf4rü s3fü 2sg2 s3ga sgang4 s3ge sgeha2 sge2h3ab sge3s4 s3gm sg4mü sg4na s3gr sgro3 2s1h 3sha. s2hak shal2li shalt2 4shan sh2e sh2i 3s4hi. s4hig s2hip s2hi4r sh3n 4shoc 4shof 4shom 3sho2p sho4re 3s4how sh2r2 sh4re s3hu s3hü si3ach. sial5l 2siat 3si1c si2cha 2s1idea 2sidee 2s1ideo si3der s2i3do 2sidy 3s2ie sie2bu siege2s si3ene si3f sif4l si2g1a si2g1ei sig4n si2g3r sigs4 si2k1ab si2k1a2g si2kak si2kar si2k1ä si2k1el si2kens si2k3er4b sik3erl s4i2k3i si2k3n si2k3r sik3s 3sik3t2 si2ku sil2br sil2e 3sili s1ill 3silo 2s1imm 2s3impf sim2st 3s4imu si3n4a 2s1ind si3n2e 2s1inf 4sinfe sing1a sin3g4le sin2g3r sing3s2 2s1inh s1in1i1 s2ink sinner2 2s1inno 2s1inq 2s1ins 2s1int 2s1inv 3sio s2ire sirn4 2sirr 3siru 3sis si2sa si4sam s2isc si2schu si2s1e2 si2si si4sis s1i2so sis1or si2s3p sis3s4 s4ist si2star si3sto si2stu si2su 3s2it si2tal si2tau si2tra sit2u sit4zerg 3siu si2va sive3 siver2 si2v3erf si2vin siv1o4 si2vor siz2 2sj s3jä s3je 2sk2 4s3kab s3kad sk4al 4skalk s3kalt 4s3kam 4skana 4skanä 3skanda skani3e 4skann 4skap 4s3kar 4s3kas sk4at ska2te. 4skateg s4kater ska2tes ska4to 4skau s3kä ske2li 4ske2n1 3skep 4sker s3kh 3s4ki. 3skif 3s2kik s3kim s3kin s2kis. 3skiz 4s3klas sklat3 3s2klav sk4le 4s3klu sk4na sk4ne 4skoh 4skol 4skom 4skon 3skop. sko2pr 4skos 4skow s3kö 4s3kra sk4re 3skrip 4skro sk3t2 skto2 3skulp 4skun sku2s3 2s1l2 s3lab 3slal sl4am sla4ma sla2ve s2law sl3b s3le s3li 3s4lip slo3be s3loc s4loga 3s2low s3lu s3ly 2sm2 s3ma sma3b4 sma3sc sme3na smi2t3 s3mu s3mü 2s1n2 s3na snab4 s3ne s3ni sni4a sni3er. sni3ers 4s3not s3ny 3so. 2s3oas 2s1o2b 3s2o3ba 4sobj 4soboe so1ch sodi4 so2do so3et s1ofe so4fen s1offi 3soft 3sog sog4l s1o2he 3sohl sohle2 4s3ohng 2s1ohr 3soi so3id 2s3ok 3sol. so3la so4lau 3sold 3sole so2l1ei so3li sol2la4 sol2ler 3solm so3l2o so3lu 4s3o2ly 2s3omb 3somm 3s2on son2a son3au sond2 sone4 sonen2d son4gl son3sä son2s1o so3o so2pe s1opf 3sopr 2s1ord sore2 so2rel 2s1orga so1rh 2s1o2rie so2ro 3sorp 3s2orti so4ru 3so3s2 s2os. so4sk 4so4sm 4sost so4sth 4s1o4sz 3so3ß 2sot so3t2h 3sott soun2 sound1 so3unds so3unt 2s1out 3sow 2s1o2x 3soz 4s1oze 2s1ö2d 2söf sö4fe 2s1ök 2s1öl 2s1ö2s sö4st sp2 2sp. s3pa. 4spaa 2s3pack 2spag spa2ge 2spak 2spala 2spalä s2pali 3s4palt spa4m s2pan 3spann 2spanz 4spap 2s3para s2parka 2sparo 5s4parten 2spartn 2sparty spas2 spa3sse spa5ssi s2paß 3spat. 2spati 4spatr s2patz 2spau 3s2paz s2pä 2späd 3späh 2s3pär 2späs spä6ssc s2pe 2s3pe. 3spec 2speg 4spein s4pek 2spensi spe3p4 3sperb 3s4perg s3peri 2sperle s3pern s4perr 2spers 4spet s4pex 3s4pez 2s3pf spf4l 4spha s2phä 3sphär s3phe 3s2pi s4pie 4s5pier spier4r spi2k 4spil s4pinn 4spi4p 4s3pis s4pit 2spl 4spla 4splä 3s4pli 4s3p4lu s3pn 2spod 4spoe s2poi 4s3pok 4spol s2pons 4spoo 2spop s2pore 3s4porn 4s3pos 4spote s2pö 2spr. s2pra 3sprac 2sprak s4pran 2sprax sp4rä 2spräm s4prän 2spräs 4spred 4spreis 3s4pren 2s3pres s2pri 3spring 2sprinz 3sprit 4sprob 4sprod 2sprog 4sproj 4sprop 5spross 2sprot 2sproz 3s4prö 3sprüc 2sprüf 3sprün 2s3ps s4ps. 2sp3t 2spub 2spud 3spuk 3s4pule 2spun 4spup 3s4pur spu2rer s4putt 2s3py 2sq 2s1r2 s3ra sra4s3s sr4at srat2s srat4sc s3re sre3cha s3ri sro2h sro3tu srö2s s3ru s3rü srücker4 2ss s3saba ss3abi ssa3bo s5sack ss2agi s2s1aj ss3alba s2sall s4samt s2sanf s4sang ss2ann s4sano s4sans ss2ant s4sanz ss2ara ss2arg ss3ark s3sars s2s3att ssau4r ssau5ri s3s2ä s2sce ssch2 sschanker6 s2scr sse3a 4ss1ec 4ssee sse1ec 4ssef 4sseg 4s3seh sseh2a 4ssei s2sein s3s2eind sse3int 4ssek 4s2selek sse2lö 4ssemp 4ssendet 4s3sendu 4ssenerg ssen4kel ssenmas4 ssen4sem 4ssentl 4ssents 4ssentz ss1epe sser3att sser2fo ss4ergr sser2hö sser4mit s2serö sser2öf ss4eru sser4wei sser2ze 4ssesc 3ssesh sses2sa 4ss3e2str 4sset sse3ta s3seth 4ssez ss3hi 4ssic ss3i2ko s2simp ss1isr 4ssit s3skala ss3l ssmut2 sso4f ss1off ssoi4 s3sol s4sop ss2p ss4pat ss4pec ss4pin s3s4prä s3spri s3spru ss4pü ssquet2 ss3s2 sssau4 sss4p sss4t s4st. sst2a s5stad ss3tak s3stä ss3t2e s4ste. s5stel s5s4tep s5stern s4stes s4stet s5steu sst2i sst3in ss3tis ss3tole s5stop ss3tor s5stör ss4tras s3s4trat s3strö s3stü ss4tw s2suf 4ssum s2sumg s2sumr 4ssunt 4ssunv 4ssup s3sus s3sy s2t 2st. 3sta. 3s4t4aa 5stab. 2stabb 2stabel 2stabg 2stabh s4tabi 2stabit 2stabl 2stabn 2stabt 2stabu 2stabz st2ac s4tad 2stada 2stafel 3staff 2stag 3s4tagr 3s4tah s4tai 2stak 2stala sta3lak 2st1alb 2stalg 3sta3l2i 2stalk st1alm st1alp st1alr st1alv 3stam st1a4mi stam4ma 4stampl 4stamt s4tand 4stanf st2ang 4stangeh st3anges 4stanh 4stanl 4st1ann st3ansp 3stant 4stantr 2stanw 2st1app s4tar. sta4rens s4tark s4tars s4tart 2stasc st1asi sta4sie sta3st4 2statb 3s4tati 3s4tatu s4tau. 2stauf 5s4taur 2staus 2stauto st1a2ve 4stax 3s4täb 3s4täd 2stäg 2stält s4täm 2stämt 3ständ 2s3tänz 4stäp s4tär 3stätt 2s3täus 2stb 2st3c st4ck 2std 3ste 4steam s4tean s4teche 4stechn ste2d st1edi s4teg ste2g3r s4teh 4stehr st4ei. 4steic 4st1eid 5s4teig stei2gr 4steil s4tein stei4na 4steinga 4steinhe s4tel st1elb s5tele s6telen st2ell stel4l3än ste2mar ste4ment ste4min 4stemper 4stempf ste4na 4st3ends st2ens 4stentf 4stentl 4stents 4stentw 4steo 4stepi st1e2po ste2r3a s4terb 4sterbs 4stereig st3erfü st2erg sterma5sse s4tern 4sterras s4ters 4st3er2zo st2es1 ste4se stes3ta 4stestb st3estl 4stestn 4stests 4steta ste2tab ste4tag s4teu 4s5teuf st1eun st1ev 4s3tex s4texa s5text 2stf stf6lan 2stg 2sth st2hen st1hi st3ho s3thr st1hy st1i2d sti2e 2stief. 4stiefl 3stiel 3stif sti2gel sti2kr st2il sti2la 3stimm 4stimma 2stimp 2st1inb 4stinf 4stinh 2stins 4stint s4tio 2stip. 2stipps sti2r st1ira st1iri st1iro 2stite 2stj 2stk 2stl st3le 2stm stma3s2 2stn sto2bl 2stocht s4tode 3s4tof stoffen4 stof4fens 4stoffiz 2stomn 2s3ton 4stona 3s4to4ne 4stonl 2stope 2stopo 2stord 2storf 2storg 2storp 2stort 3s4tory 3stos 4stou 4stöch 2stöf 2s3töl 3s4tör 2stöst 2stöt 2stp 2stq s3trac s3trad st4rade stra4fa 4s3trag 4strai 3s4tral s3trank 4strans 3stras 3straß 2straum 2sträc 2sträg 2sträne 2sträum 2stre. 2strech 4stref 2streg 4streib 3st4reif 2strep 2stret 4streuh s4treuu 2strev 2strez 3s4tria 2strib 4strig s3tril 2strisi s3triu 4stroc 3s4trof 3s4troh 3s4trok stro4ma s4trome 2stropf 3stropo st4ross 2strost 3stroy 2ströp 2strub s4trud 3struk s4trum 2strun 4strup 2strut 2st3s2 stsas2 st4sb 2st3t2 stt4r st2u 3stub s3tuc 4stuch 3s4tud 2stue 3s4tuf 2stug st3uga 3s4tuh 2stuk 4stumo 2stumr 2stum2s 2stumt 2stumz 2stun. 2st3una s4tund 2stune 2stunf 2st3uni 2stuns 2stunt 3stuö stu3ra stu5re 2st3url 4sturn 2st3urt 3s4turz 4stüch 3s4tück 3s4tüh 2stür. 2stüre 2stürg 2stürs 2stürw 2stütc 2stv 2stw stwor2 2s3ty 4sty. s4tyl 4styp 4stys 2st3z2 su1an 3su2b3 su4ba 4subi su4br 3su1c su2cha su2chi su2cho suchs3p 3sud su2eb s1uf su4fe 2s1uh su1is su1it. su2k 3sul su3l2i sum1a su2man su2mar 3s2ume su2mei su2mel sument2 su4ments su2m1et 2s3umf su2m1id su2min 3s2umm sum1o2 su2mor s2ump s1ums s3umsa 2sumse 2s3umst su2n 2s1una sunder2 sun4d3erh su4ne 4s1unf 4sungena 2sungl 4s1uni 2sunm s1uns 2sunt 3sup 4supd sup3p4 su2ra sure4 su2rei su2rer 3surf 2s1urk su2r1o 2s1ursa s1urt su2s3 su3s2a s3u2t su3tr suz2 2süb sü4be 3süc süd1 sü4da sü4de süden2 sü5den. sü4di sü4du 3sün s2üs2 sü3sse sü3ssi 2sv2 s3vl s3vo svoran2 s3vö 2sw s3wa s3we swe4gers sweh2 swe5st 4swie 4swil 4swink s2wist 4swit s3wö s3wu s2y s3ya 2sy2l1 sym3 sy2n3 3synd sy4no 3sys 2sz2 s4ze. 4s3zei 4s3zel 3s2zena s2zend 3s2ze3n2e 4szent 4szer s2zes s2zeß s4zew 4s3zie 4szim s3zins s3zo s3zs sz3t sz4ts s3zu 2ß1a2 ß3ab ßan1 ßas2 ßa4si ß3at3 ß3au 2ß1ä 2ßb2 ßb4ri ßbus3 2ß1c 2ßd2 ßd4ri 1ße 2ß1e2b 2ß1ec 2ß1ef 2ß1e2g 2ß1ei 2ß1ek ße2l 2ßelek ße3lu 2ß1emp ße4n3a4 2ßenerg ße2ni ß1enke ße2no 3ß2ente 2ßentz ße2nu 2ß1e2p 3ß2er. ßer3b ße2ro ß1erse ßer3t ß1erw 2ß1erz ße2s 2ß1es2s 2ß3estr ße2t 2ß1ex 2ßf ßf4ru 2ßg2 ßge2bl ß3gm 2ß1h 1ßi ßi2g1a 2ß3i2k 2ß1il 2ß1im 2ß1in 2ßk2 ß3kh ßk4le ßk4na ßk4ne 2ß1l2 2ßm2 ßmut2 2ß1n2 ß3ni 2ß1o2 ß3oa ßo4fe ß3ok ß1ö2 ßö4fe ßö4st 2ßp2 ß3pf 2ßq ßquet2 2ß1r2 ßrö2 ß3ru ßrus3 2ßs2 ß3sa ßsau4 ßsch2 ß3sk ß3sp ßs4pu ßst2 ß3sz 2ßt ßt1h ßt1in ßts2 1ßu2 ß1uf ßu4fe 2ß1uh 2ß1um ß2ung ß1uni 2ßunt 2ßunv ß1ur ß1ü ßü4be 2ßv 2ßw 2ßz2 ß3zs 1t t2aa ta3ar 4tab. 3taba ta2b3an 2t1abb tab2bau 4tabd 3tabel 2tabf 2tabg 2tabh 2t3a2bit 2tabk 2tabla 4tabm 2t3abn 2ta4br 4tabs t1abst 2t3abt 3tabu 4tabw 4tabz 2t1ac tach5te 3tacu t1ada 2tadd ta2der tadi3 tadi5o4 tadi4s t1adm t1a2dol t1a2dr ta3d2s ta2er 3tafe 4tafet 4taff t1afg t1afr 3tag ta2ga ta2g1e2i 4t3a2gent tage2s 4t1agg ta3gl 4t1a2go tag2s3 tag4san tah2 3tai ta3i2k tai2l1 ta1ins tai4r ta1ir. ta1i2s 2t1a4ka 2t1akk 2t1akq ta4kro tak4t3erf tak2t1o2 2takz 3t2al. ta2la ta3lad ta3lag tal3au 3talbr 3tal2en ta2l3end tal3eng ta2l3ens 3taler2 ta2ler3g ta2let tal2ga tali4ene tal2l3ac tal2la2g tal2leg tal2lei tal2let tal4leut tal4lin4s tal4los tall2ö tall3s tal2lus 2t1alm. ta2lop ta2l1o2r 3tals t1alta tal3th talt4r ta2lu 2tam 3tam. t1a4mer tam2ma2 tam2m3er tam4mi tam2mut t1ampl 3tams 4t1amt t1a2na tan3ab 4tanal ta4nat 2t1a2nä tan2c tan3d2ar tan2dr tand2st ta2nerf 4tanf 2t1ang t3angeh t3angel t2ango tan2gra t2angs 2tanh t2anho t4ani 3tanj 3t2ank tan2kl 4tankü 4t3anl t1anm 2t1anna 3t2anne t1ano 2tanom t1ans t2ans. 4tansi 2tanspr tan2tan t2ante. 2tantei 2tantr 2tanwa 2tanwä t2anz. 2t1anza 3tanzk t2anzp 3tanzr t1anzu tan2z3w tao2 ta3or t4ape ta2pes 2tapf ta2pl ta2poka t2appe ta2ra 2tarab 3tarabb 3tar5al 2taram t2aran ta3rant tar3ap ta3ras t2arau 2tarb 3tarba tar4beitn 3tarbek 3tarber 3tarbi 3tar3bl 2tarc 4tarchi t2ard ta2rel ta2r1er tar3g ta1r2h 3tari 2tark tark4l t2arko t2arl 2t1arm t2armä tar4nei ta2rom 4tarot 2tart 4tart. t2arta 4tarten t1arti 3t2artis tar2to tar2tr 3tartu 3tartü ta2ru 2t1arz 3tarzu t2as. ta3s2a tasau1 3tasc t1asp 4taspe ta3spr 2t3assi ta4stem ta4sto t2asy 2t1as2z t4at. ta2tab ta2tan 3t4atb t4ate tat1ei t5a2tel ta2tem 3taten ta2t1er 2t3atl 2tatom 2ta2tr 3tatsa 2tatta4 2tatti tat3zw tau2b1a 3taubh tau2bl tau2b3r 4taubs tauchs4 tauch3sp 4taud 2t1auf 3taufe. t3aufl tau3f4li 4taufm 4taufn t3au4f1o 4taufp tau3fr 4taufw 3taug 4t3auge t1auk 3taume 4t1ausb 3tausc tau4scha tau4schm tau4schr tau4schw 2tausd t2au3s2e 4tausee 4t1ausf t3ausg t1ausk 4t1ausl 2tausr 2t3auss 2tausü 2tausw 2t3ausz 4tauu 3tax taxi3s 4t1axt tä1c t2äf 3täg 4tägy 2täh 4täll 2t1ält 2täm tä4mi t1ämt t1ängs 2t1äp 2täq tä2reng tä2ru 2t1ärz tä2s tä4ss tä4st t2ät 3tätigk 4tätt 2täug 2täuß 2täx 2tb2 t3ba tbauer2 t3be tber2e t3bh tblocken4 tb4ra tb4ri t3bs tbus3 2t1c t3cha t3che tchen3 tch2i tch3l t3chr t2ch1u tch3w t3cl t3co tcor2 t3cr tc4up 2td2 tdar2m1 tdä1 t3do td4ri t3ds tdun2 3te2a2 te3ab tea3c te3ag 4teak te3al teamma3 te3an te3ar tea4s 3teba 2t1e2ben 3t2ech 4techd 4techk 4techm 4techt te2chu 2teck t1ecu te2dit 3tee tee3id te1em teen1 te2er. te1erw te2es 3tefa 2teff 2t1egg te2hac 2tehe te2him 2t1ehr te3hu 3teic tei3fl 2teign teik4 3t2eil tei4lent tei3m2 2tein teinen4 tei4nens t3einkü 2t1eis. t1eisb tei3sc te3isch. t1eiw tei3z4 te2kel 3teko tek3t4 te2la tel3ab tel1ac te3lan te4lant tel1au te2lä telb4 tel3d4 tel1ec tel3ehr 2telem tel3eng te2ler te2leu 2t3elf. te4lim te2l1in t1e2lit tel3le tel4lein tel3li tel4li4st te2lob te3lom te2lost te2l1ö tel3s2k tel3ta telt4r t2ema te2man te2m1ap tem3art te2mau 2tem2bo te2m1ei te2m1er 2temg 2te2mi tem3i2m tem3ing te3misc 2teml 2temn 3temod te2m1o2r te4mp 3temper 2tempf 3tempo tem3s4 te2mu te4mun t4en. t2en1a te4na2d tena2g te4n3an ten3ar te4nas te4nat ten3au te2n3ä4 t2enb ten3da t3endal tend2an 2tendap 2t1endf t4endi 2t1endl t4endo 2t1endp t4en3d4r te2n1e2b te2nef te2neh ten3ei te3n4ei. tenei2d tene4m tenen1 te4n3end te4nene te4neng te4nens 4t3energ te2n3ern te2ners t1eng. teng2a 2ten2gag te2ni te4nil ten1im te4nin tenk4 ten3n2 te2nol te2nos te3nö 2t3ensem 3tenso tens2p tens3th t2enta t1entb 2tentd 2t3entl 2t3entn ten4tric t1ents 4t3entw 2tentz te2nu t2enz ten2z3er teo4f t1epi te2pil tept2 t2er. t2era tera2b ter3ac te2rad te1ral te2r3alg te3ran. te3ranb te3rane te2r3ap 2t1erbs 2t1erbt 2t3erde. ter3d2s te2r1e2b te2rec 2t3ereig ter3ein te5rek te2rel ter3ell tere2m te2rema te2r3end te2rene te2reng te2r3ent teren3th terer3k terer4ku terer3l te2r3erp te2rers te2rerw t4erfr terg2 ter3ga t4ergem t4erges t4ergew ter4gieb ter3gl 4tergrei ter2gri t4ergru 2t1ergu 2tergü te4rh t4erhall t2erhan t4erhau t2erhäu t2erhei t2erhi t2erho t2erhu te3ria ter3iko teri4o te2rit ter3i2ta t4erlä ter3lei t4erli ter2lös 3term termas2 ter2mer t2ern. ter2nar t4ernc te1rob ter2obe 2teros t1e2r1ö ter3r2 t4erra 3terras ter4re. t4erro t4ers. t2erse t4erst. t4erstad t4erstä t6ersted t4ersti ter3str t4erstu t4erstü ter4sw ter3t4a ter4trä teru4 te4r1uf te3rung 2t3erwäh ter3z2a 2t1erzb t4erzei ter3zw te2s tesa4k te3sä te3s2c te3ser te3si te3so te3spen tes3pr 2t1essa tes3si tes3tät 3testb tester2 te4sterg te4st3erh te4sterk t3est3ri 3tests t1eta te2tabl 2te2tap te2tat teten3 2t1e2th te3tho te2tik 2tetl teuer5b teuer3r 3t4euf teu4fa te1u2n 2t3eup teu2rob te2va te2vi tewa2s 3tewo 2texam 2t1e2xe te3xel 2t1e2xi 4texp tex4ta 2t1exz tè2 2tf2 tfäs3 t3fj tf4la tf4lö tf4rö tf4rü 2tg2 tga4s3er tga4su tge4nen3 tger2a tger2i tg4ra tgro3 2th. 2t1h2a 3tha. 3t2hag 4thak 3thal. 3thalh t4hali t2hals 4tham t2han. t3hand 4t3hap 4t3hau 2t1hä 3thäi 4thäl 2thb th2e 3t4hea 2t1heb 4t1hef 2t1hei the1in 4theit 3t2hek 2thel 3thema 2themd t1hemi 2themm t1henn 3theo t1herd 3therm thero1 2t1herr 2t1herz 3these 4t1hess t2heu 2thf th2i 3thi. thic3k4 thi3er. 2t1hil 2t1him 2t1hin thi3nu 2t1hir 2thk 2th3l 2th3m2 thmu2 2th3n2 2t1hob t1hoc tho3chr t1hof 2t1hoh t2hol. t2holo t1hols t1holt 2tholz t2hom t2hon 4thops tho3ra 2t1hose t1hot 4thote 2thou4 t1hov 2thö 2thp th2r2 th4ro 2ths 2tht2 t1hu 2thub 4t3hun 2t1hü 2thv ti3ac ti1ag 2t3iago tial2l ti3alo ti1a4m ti1as ti2ä ti1ce ti3chr 3ticket t2id. ti3de. 2tidee ti2d3en2d ti3dy 3tief. 4tiefel 3tiefl tie2fr ti2e1i ti1el tiel3a tie2n1 ti3ene tie2rei tie2reu 3tierr tie5sse ti1eu ti3fe tif3f ti3f4r tifter4k ti2gerz ti2git tigs4 tih2 tihi4 ti2kam ti2kar tiken2 ti2kent ti3k4ere ti3kerl ti2kin ti4klu ti2kn ti2kop tik1r ti2kra ti2krä ti2krei ti4kro ti2lant ti2lar til3d ti2lei ti2lel 3tilg tille4b 2tillu ti2lö tilt4 ti2ma2g tim2man tim4ma4te timmer2 tim4merg tim4mit 2timp t4ina ti3naf ti3nak ti2n3an t1ind ti3n2e tine1i ti5nen 2t1inf tin2ga tin3gen tin2gi ting3l ting3s4 2t1inh 3tinis t1init t1inka tin2k1l tin2kn t1inku t2inn ti2nor t1ins t2insä 4t3inse tin2spa tin2sum t1int 3tinte. 2t3inter ti3nu tin2um 4t1inv 3tio ti2osk tioxi3 3tip. ti3p4l 3tipp 3tips ti2que. 3tirad ti1r2h ti4ron t2isc ti4schei ti2schr tisch3w ti2sei tis2el ti3sk t1isl t1iso ti2sp t1isr tiss4 ti3sth ti2s5tic ti2s1u 2t1iß t1it2a ti2tal 3tite ti3th t2iti 3tiu tium4s ti2van ti2vel tiver2 ti2verh ti2verk ti2verl ti2v1o ti4v3r ti2za ti2zir 2tj 2tk2 tklat3 tk4ne t3kr 2t1l2 tlan2g tlei2bl tlei4der tl4er tle2ra t3li tlings5 tli5ni tli3s tlit1 t3lo 2tm2 tmal2 tm4am tmen4schl tmen4t3 tmo4des t3mö 2t1n2 t3na tn4an t3nä t3ne tnes4 t3ni tni3v to3ar to3a4t t2oba 4to4bj tob2l t1obs 3tobt to1ch t3ochs 3tocht 3tod tod1er2 todes3t to2dun toe2 tof4f3ent tof2f3er 2toffi 2t3ohr 3toil toi4r tok4l to3le tomar2b to4mene 3tomi 3tomo to4m1u to5mus to2nan ton3au tond2 to2n2eh toner4ke to4nid to2nob 2tony 3too to4pad to4pak to3pas to2pat top1hi to2ple 3topo 2to4pt t4or. tora2g to4rän t1ord t2ordi 2t3ordn t4ore 3tore. to2rel to2rem to4renna 3torf tor2fan t1or3g 2torga 4t3orient torin2s tor3int to2rö 3torp t4o4rs 2t1ort. tor3t2a 2t1orth 4tortn 4tort4s to4ru to5rus to3rü to4rüb to3s2 to4sb to4s3ka t1o4sz to2tä to2tho tot3s4 3t2ou touil2 to3un 3to1x tö2c 3töch 4töck 2t1ö2d 2töf tö4fe 2t1ö2k 2töl. 3tön t2ör t1ö4st 3töt 2tp2 t3pf tpf4l tpi2n t3pl tp4lu tp4rä t3ps 2tq t2r2 2tr. t4rab tra3cha tra3chl 2t3rad. 2trade tra2dem t3radie tra4fah tra4far t4rag tra5gen 4trahl 2trahm 3t4rai 2t3rake t4rakt tr4al tral3l 3tram tra5me 3t4ran. 4trand 4trang t3rann 3t4rans tra3po 3trapp tra4sta tra4str 4traß t1raub 2traub. 4trauc t4rauf 2traup traus2 3träc 2träd 3t4räg 3träne 4träng 4träs 4träß 2träuc 4tre. 2trea t3reak 4treb tre2b3r 4trec t3rech t4reck 5treck. 2t3red 3tref 4trefe 4trefl 4trefo 4treg t3reh t4rei. 3t4reib 4treif 2t3reig 2t3reih 2t3reim 2t3rein 2t3reis tre5isch. t3reiß 4treit t3reiz 2trek 2t3rel t4rem t4ren. 3trend 3trennu t3rent t3repa 2trepe 2t3repo 3trepp t4rer t4res. t3rese 3tret tre2ta t4rete tret3r tre2tri 4t3rett t4reu 3treuh 2t3rev t4rex 2trez 3tré 2t3rh 3t4rib 4trich. t4rid2 3trieb trie3fr tri2en tri4ena tri3ent tri2er tri4ers tri3est. 2trig. tri3gl t4rik tri2ke. tri2kes 3triko t3rind 2tring tri3ni 3trink 3trio tr4is 2triß tri2x trizi1 tro3b4 3troc 4trock. tro2kes trol2la tr4om tro4men 4tromk 4troms tro3na t4rop tro3pe 5tropf tro3sm 3trost t1rot. 2trout t4roy 4t3röc 2tröh 4tröm 3tröp 2t3rö4s3s 3tröt 3trub 2t3ruc 4truf 3t4rug 4truk trum2 t3rumä trums3 t3rund 3trunk 3t4rup t3russ 2t3ruß 2trut1 tru2th trü3be trü3bu 2t3rüc trücker4 t4rüg 3trümm 3try try3o 2ts ts3a2b t3sac tsa3che t4sachs t2s1a2d ts1ahn t3s2akk t2sall t2salt t4samp t4s1amt t2san ts3ane tsa2p tsa2r ts3are ts3ari t2s1a2s tsa3ssen tsa4st t3satz t2sau1 ts2av t2säh ts1än ts1äus t2sce t4schart t4schef tsch2li t4schro t3schü ts2cor t2s1e2b tse2e t2sef tse2he. t2s1eic t3seil t3seme ts1eng t3s2ens t2s1ent t2s1ep t2s1er tser2u t4s3essen tse2t ts1eta t2s1eti t2s1ev t2sex t3sexi tsh2 ts3he t2s1i2d t2s3i2k t2sim tsing4 t2sini ts1ir t3s2kal ts2kele tski2 t4sko tsmas2s tsma3sse ts1off t2s1op tso2r ts1orc t2s1ori ts3ort. t2sö t2spac t2spal ts2pare t2spat t2spä t3sped t3spei t3spek t2sph t4s3pic t4spins ts3ple t2spo t3s2pon t3s2por t2sprei t3spru ts3s2 tsser2 tss4k tss4t ts5ste tst2 t2stabe t2staf t4stag ts3tak t2stale t4s3tanz t4stas t2s3tat. t2s3täti t2stea t4stee t4stele t4stens t4s3tep t4sterm t4s3terr t4s3th ts3tie ts4til t3stim t4s3tis t4stit t2stoch t4stoi t4ston ts3tor tst4r t2strac t4strad t4s3trak t3strec t4stren ts3treu t3stric t4strie t4strun tst4u t5stub t4sty ts1u t2su. 3tsubi t2sumg t2sums t2sumv t2sumz t2s3un tsü3s tswa2s t3sy t4sza ts2zin 2tt tt1ab tt2ac tt3achs tt1ad tt2ag tta4g3ess t4t1ah tta4ke tt2al t2tan ttan4a tt4anke ttank3l t3t2ant t2t1ap tt1art tta3st tt3atr tt1äh t2tän tt1ebe tt3echs tt1eif tt1ein t2t1eis tte4l1a2 tte2l3e2b t2te2leg tte2len tt2eli ttel3l ttel1o t2temu tte4na ttens2 tten4sem t2tentb tten3te t2tentf t2tents tten3z t2teo tte4r3ar t3t4ere tt2erg tteri2e tte4rik ttermas5s tter3nä tte2ro tt2erö tt4es1 tte4s3a tte4s3ä tte4so t3tess ttest4r t4teuf tt2häu tthä3us tt1hi t2t1ho t2ti4d t2t3igi t2tins tt2int t2tiso t4t3la t4tli tt5nan t3to. t2torg t3tos ttras3s t3trog tt3rü3 ttschi4 tts1eh tt2sen tt2spe tt2spr tt2s3tät tt4s3tem tt4ster tt2sum tt3sz t2tu2c tt1u4f t4tunt t2tu4s ttü2 tt3z2 ttz4w 3tua tu4ale tu1alm tu1alv tu3ant tub2 tuba3b tu2chi tu1cho tudie4n3 3tue tu2ere 2tuf tuf2e tu5fen t3u4fer 3tuff tuf4fel tu2gan 3tuge 2tuh tuh4ler tu1ist t3u2kr tul2i tum2b5l 4t3umf 2t3umg 2t1umh 2t3umk 2tuml 3t2umo 2t3umr 2t3umsat 2t1umsc tum2si tum2so 2t3umt 2t1umw t3umz 3tun. 2t1una 2t1und tund2e 3tune tun2en 2t3unf t3unga tungs5 tun2i 2tunif 2tu2nio 2tuniv 2tunm 3tunn t1u2no t3unr t3uns 3tuns. 2t3unt 2tunv 2t1up. t1upg tu2r1a2g tu2ran turan4l tur3ans tu2ras tu2rau tu2rä tur1c tu2r1e2b tu2rei tur3eis tu2rene tu2r1er tu4res tu2re4t tu2r3e2v turf4 tur3g2 tur1in tur4mun 3turn tu2r3o tur3s2 tur5sa tu2ru tu2sa tu2schl tu2s1e tu2so tut2a tuto3 4tutz 2tüb tü3ber. 3tüch tück2s 3tüf 3tür. tür1c 3türe 3türg 3türs 3türw 4türz 3tütc 3tüte 4tütz 2tv2 t3vo t4vo. tvoran2 2tw t3wa2 twegs2 t2wist tw4ri 3ty. t1ya ty2p1a ty4ps 2tz t2za2 tz1ag tz1ap tz3ar tz1au t2z1ä t3zäh t2z1ec t2z1e2d tz1ehr t2z1eie t2z1eig t4z1eis tzei4tend tze2m tz1emi tze4n1 tz2ene tzen3ta t2zentg t2zentl t2zents tzer4gre t2z1er2m tz1erw tz2er3z tz3erzi tzes3t tz1e2t tz1i2d tzi4m tz1imi tz1int tz1inv t2z3om t2zop tz2th tz2tin tzu2gu tz1unf t2zuni tzwan2d3 tz3wä tz3wi t3zwie tz3wu 2ua u3a2b u3a2c ua4ch ua2dan uad4r u1a2g u1ah ua4ka u1al. u1a2l1a u1a4l1ä u1alb u1ald u3aleb u3a2lent u3aler2 ual3erk u3a2let u1alf u1alg u1alh u3a2lid ual3l ualle2 uallö3 u1aln u3a2l1o2 u1alp u1alr u1als u1al3t4 ua2lu u1alw u1al3z4 u1am u1an. ua3n2a4 u1ans uant2 u3ar. uara2b u1ars uar2t3an ua3sa ua2th uat2i uati4ons. uat2o u3au uau2s3 u1ay u1äm u1än u1äu 2ub u2barb ubb4l ube2be ube2e u2b1ehe ub1ein u2b1e2m ube4n1a uben3o ub2er u2b3erde ubert4 ub4es ub1eul ub4is u3b4it ub2l ub3läu ub3lic ub3lu ub4lut u2bob u2b3ok u2bop u2boz ub5rah u2b3rit ub4ro ub4rü ub2san ubsau2 ub4s3che ub2s1o ub2s3p ubst4 ub4sz ub3t2h ubu3s 2uc uc1c u4ch. uch1a u1cha. uch1ä u1che uch1ec u2ched uch1ei ucher3f ucherma4s u1chi uch3im uch1in uch3l uch3m uchma4ss uch3n uch1op u2ch3r uch2sel uch2so uch2sp uch2tak uch3tan uch4t3erf uch4t3ert u1chu u2chum uch3ü uch3w u1ci uck3elf uck3i uck2sti uck3t u1cl uc4re 2ud u3d2a uda3d ud4at ud2e ude1e ude3i2 udein5 udel3se uden1 uden3e udert4 udi3en udiener4 udio3 uditi4 u3d2ob u2don ud3ra u3dru 2u1e ueb4l ue1ch u2ed ueen4 u2eg u2eh ue2ke u2ela ue2lek ueli4 uel2la uel2lä uel4lent ue2mi uen1 u3en. ue4n3a2 ue2nä u3end uene2 ue2neb ue2ner uen2gag uenge2 uenge4m uengene3 uen2gl ue2ni uenk4 ue2no ue2nu uen2zu u2ep ue2r3a2 ue2r1ä uerb2 uer4baut u3erbu uer3d2 uere2 ue2rec uer4ei. u3ereinn uer3ela u3eremp u3e2r3ent ue3r2erb u3ererf ue2rer2g uerer2h uerer2k uerer4m ue2rers uerer4sa uer3esk ue2re4t u3erex uerg2 uer3ga uer2geb ueri2d ue2r1i4m uerin3s u3erin2t u3erl. uerma4s u3ern uer4nan uer2nar uer2ne ue2r3o4 uer2ö uer3ra uers4p uerst4 u3ersti uer3t2 u3eruh u3erum u3erunf u3erunt u3erur uer2wec uer3z2 u3est. ue2ta ue4tek ue2tik uety2 u2ev ue2x1 u2f u3fa uf1ab ufall2 ufa2n uf3ane uf3a2r ufa2t uf1au u3fä u4f1än uf1är uf1äs ufä6sse uf1ä2ß u3fe u4f1ei ufel4s3a u4f1em 4ufen u4fent uf2ere u4ferf u4f1erh ufer4lau u4ferle u4ferne u4f1eß u4f1et u4fex 2uff uf3f2e uffel2 uff4l uf2fro u3fi u4f1id u4fim u4f1ins uf3l u4fläs uflos3 uf4lü uf5lüd uf5lüm u3fo u4fob u4fof u4fop ufo2r uf1ori u3fö uf3r u4fru uf3sä uf5sät uf2spo uf2stab uf4ster 2uft ufta2b uft1eb uf3ten uft3erd uft3er2g uf3ti uf4tin uft3s2 u3fu u4fum u3fü 2ug u3ga. ug2abe u2gabte ug1a2d ug1ak u2gana u2ganb ugang4 u2gani u2gans u2gant ug1ap u2g1ar uga4s ug1au ug3d2 u3ge. u2g1ec ug4eg ug1e2i u2geig ug2eil u2g3ein uge2lob ug1emi ugene2 ugenma3 u2g1erf u2g1erk u2g1erl u2gerr u2gerv uges2 u3ges. u2g1esk ug2et ug2gl ug4gt ug3hu u2g1i2d u2gim ug1in u2gins u2g1l u4glä u4gleitb u4gleitu u4glic u4glis ug3liz u4g3lo u4glu u2g3n ugo3 u2go4b ug3oc u3gon ugo4p u2g1o4r u2gö u2g3ram u2g3rä u2greg u2g3reis u2g3res u2g3rie ug3ro ugro3s u2grou ug3rüs ugsma3 ugsmas2 ug4spe ugs4por ug4spr ug4spu ugs3t2 ugs4tan ug3stä ug2ste ugs4to ugs4tr ug2stur ugs4tü u2gum ugu4ster u2gü u1h uh2au 2u3h2e uhe3a uhe1e2 2uhi 2uhl uh1la uh2lar uh1lä uh2l1ei uh2l3ent uhl3erb uh2li uhl2ö 2uhm uhme4 uh1or uhr1a uhrei2s uh2r3er3 2uh3ri uh4r1in uh4r3o uh2ru uh4rü uh3s4p uh3t2 u2hu 2uhü uh3w 2ui ui2a ui1ch ui2che u2idi ui2du u1ie ui1em u3ig u4ige uil2les u1im u3in. uin3n u3isch. u3ischs uis2e uisi4n ui2st ui3sta uit3s uji3 uk2a uk1äh u3käu uk2e uke2n1 uk2l ukle1 uk4na uk4ne uk4nu u2k1ob uko4m1 ukom3a uk2ö uk4re uk2ta uk2t1el uk2t1er uk2tin uk2t3o2ri uk2t3r uk2tum uku2s uk2ü u1l ul1am ulan2e ul2ar ula2sc ul1äm ulb4l ul4dan ul2dar ul2dr ul3dra uld2se 2ule u2l1el ul1emb ule4n1 ul1er2h ul1er2r ule4s5t ule2t ul1eta 2ulf 2uli ul1id uli2k ulin1a ul1ins uli3p ul3ka ul2kn ulla2g ull1au ul2lä ul3len ul3l2i ulli2n ul2lo ul2lö2 ull3s2 ulm2e ulni2 ulo2i u2lop u2l1or ul2ö ulp1h ul2pha ul2sa ul4sam ul2s1ec ul2sei ul2ser ul2sum 4ult2a ul3tan ult3ar ul2tau ulter2m ul2tri ult3s u2lü ul2vr ul3z2e ulz4w 2uma. u2maa u2m1ad u2m1a4k u2m1all um1ang u2m1ant um1anz u2m1ap um1ar u2marc u2marm u2mart u2matl u2matm um1aus u2maut um4ay u2m1äh 1umd2 u2m1e2b u2m1eck u2m1ef u2m1ein ume2n1e um3engel u3mer. umer2a u2m1erf um1erg u3merk u2m1erl um1erw ume4s 1umf 4umfi 1umg um1ind um1inh um1ir umi2t um1ite 1umk 1uml umm4a 2umme um4mess um3mi um3n um1ob u3mol um3ot ump2fa ump2fin 1umr um4sam um4s3an 1umsat um4sd um2s1er 1umset um4sf um4sg um2sim um4sj um4sk um4sm um2s3pe 2umspf um4ss um4stem um2su um4sv um4sw um3t2 um4ts u2mum u2m1u2r 1umz un1 2un. 2una. 1unab 3unabh un2a3br un2ag un2al u3n2am u2n3an u2nap u2narb 2un2as un3at unau2s un2är 2und. un2da unda2b un2dän 1undd 2unde un3de. underer4 und3erf und3erö underten4 under6tend und3erz un2dex 1undf 2undg un2did un2dim 1undn undo2b un2dop 2un2d3r 4unds. 2undsc und3s2p un2d1um undü4 1undv 1un4dz u3ne une2b une2d un2ei. un3eid un3ein un3eis un2emi une4n1 un2ens unen2t un2enz u4nerk u4n3erz. un2es2 unf2 un3fa un2gab un2gam ungar4 un2gat 1ungeh un3gen 3ungena unger2e 1unget 1ungew 1ungl ung3lat un2glu un2go un2gr ung3ri un4g4s3 ungstra4s5 u3nic un2id un3ide 4unie 3u2nif uni3k4 un2im 1unio un2ir un3iro un3isl u3n2it 1u2niv 2unk un2k1a un3ker un2k1es un2ket un2kne un2ko4p un2kro unk3s2 unk4tit unk2tr unlö2 1unm un4n1ad unn2e2 unne4n u2nob uno4r un2os 1unr uns2 2uns. unsch3el 1unsi un3sk un4ski un3s4p uns4t unsta2g uns6tel unst1r 2unsy 2unsz 1unt un3ta un3te unte2ri 3unterr 2unti un3tr unt3s 2untu 3unty 2u2nu u3nuc unu4s u1nü 1unv unvol2 unvoll3 1unw 2unwä u2ny 2unz un3z2a unz2e 2uo u1o2b u3of u1op u1or u3or. uo2r3a uor3c u3oret uo2ris u3ors u1os. uote2 u1ox u1ö2d u1ök u2p u3pa u3pä 3upd u3pe2 uper3 uperer4 u3pé up2fa upfe2 u3p4fl u3p2fu u3ph u3pi up4id u3pl up4lu u3po 2upp up2pl up5pun u3pr upra3 up4t3a2 upten1 up4tene upt3erf upt3erg upt3erk upt3ers upti2m upt3in upt1o up4tr u3pu u3py up4yb 2ur. u1ra u2rab u3raba ura2be u2r1aka u2r1akt u2ral2t u2r1am ura4na u3rand uran4fän ur1ang uran2ge ur2anh ur2anr uran3s ur1anz ur3ap u2r3ar ura4ri u3rasc ur1a4sp ura4str ur4a3te u2r3att ur1au 2u1rä ur1äl ur1ä4m ur1än ur3b2a 2urc urch1 urchas2 urch3s urcht3e ur3d2a ur3d2i ure1e ur1eff ur1ehr ur1eig u2rele ure2n ure4na u2ren2se u2rentn u2r1ep urer3h urer3k ur2ert u2rerw ur1eta ure3u 2urf urf3l ur2fli ur2fro urf2spr urf3t ur2gei ur4gense urg3inn urg1l ur2gla ur2gri urgs4 uri2c ur1ide uri3en u2r1ind urin2se urin4sek u2ri2so ur2m1ar ur2matt ur2mau urm2ei ur2mern urme2t ur2mum ur2mun ur3n2e urn2o 2u1ro urob2l ur1off uro3h2 2u1rö ur3p 2urr ur3re ur2rh 3ursac ur2san ur4sau4 ur2s1er ur2spa ur2sun urt2 2urta ur4tai urt3ein ur2tro urts2c 2urtu ur1umh ur1ums ur2z1a ur2zä ur2z1ec ur2zep ur2z1op urzt4 ur2z3w 2us us3a2b usa2gi usal3t u4s1amb u4samt u2sang us4ann us3ark us3art usa4s us1ast us3ate u2säh u2s1äs us3b u2sce u2schab u2schak u2schar u3schart u2schef usch3eic u4schen4e u3schi usch3mü usch3wer u3se. u3s2e3b u2s1ec use1e use2ei u2s1ei u3seid u2sen2se usen4te. u2sentl use2rec u2s1erl u2serp us1erw u2s1ese u2sex u3si. u2sid usi3er. usi3ers. u3sig usi2kat us1inn u4ske us3kl u4sko u4skö u4sku usmas2 usma3sse us3oc us1oh u3sol u2sop us1orc us1ou u3sov u2spac us2par us3part u2s3pas us3pe u5s4pec u3spek u2sph us3pic u5spit u2spo us2por u2spu usrich5 u4ss. us2s1ad u4ssc us2s1eb usse4g u4s5sel us2se4n us3sende us4seni us2sep us2ser us3ser. uss3erf us2sez u3s2sig u4ssl us2sof u4ssr u4sst us2sum u2stab u3stad u3stal us3tas us3tau ust3erl us3ther us3tic u3stis us3tob us4tod u2s3tor us4tras u2strä us4trop u2s3tur u2suf u2s1umb u2sumd u2sumg u2sumz 3usus u2sü 2uß u2ß1u 2ut u3ta. u3taf u2t1alt ut1a4m ut2ans u2t1ap ut1ar u2taut ut1äh u2t1är ut3c u3te. u4te2d ut1ei. ut1eie ut1ein ut1ela ut2em ute2n1 uten2a u2tent ute2ra ute3ras ute4ring uter3k ut2erl ute2ros u3t2es ut2et ut2ev u2t1ex utfi2 ut3hal ut3hei ut1hel u2t1hi u2t1ho u2thu u2t1id u2tigel uti2vi utli4n utmas2 utma3sse u3to. uto3c u3tom uto3p u2tops utor2a u2tord uto2re uto2rin 4utou u2töl ut3rea u2trou ut3rü utsau2 ut2säu ut2scha ut3sche ut2schl ut2schm ut2scho ut2schö ut3ser u4t3sk uts2p ut3sta uts4to ut3t2l utts2 utu4b u2tum utu4n u4t1une utu4re utu3ro utu3ru utz3a utze2 ut2zeh utz3eng utz2er utz4erg ut2zet ut2z1in ut2zis ut2zö ut2z3w 2u1u2 uu4fe uum1 uum3a4 uume2 uungsma3 uungsmas4 u1ü uü4be uv2 u2ve. uve3rä uv4re 2u1x ux2e uxi3 ux2o ux3oe uxt2 u1ya 2uz uze2 u2z1ec u2z1ene uz2er uzo4f uz3ot uz3we uz3z2 uz4zb 1ü2b üb1ä 2übc 2übd üb2e2 übe3le ü3bem ü3ben übe4na übe3ne über1 überas4 ü3bes ü3bi üb3l üb3r üb5rig 2üc ü1che üch3l üch4s1c ücht4e ücke4n1 ück1er ück3eri ücker4ke ücker2l ü2d üd3a2 üda4m üda4s ü3de üde2l üden2g ü5d2ens üdf6lan ü3di üd3o2 üdo4s üdö2 üdö4s üd3r üd3s2 üdsa1c üdsau2 üd3t2 ü3du2 üdwe4 üe2 üeb3 ü1ei 2üf ü2f1a ü2f1ä ü2f1ei ü2fent üfer2 ü2f1erg üf2fl ü2f1i ü2f3l ü2fo üf3ten ü2fum üg2e üge2l1a2 üge2lä üge4lec üge4lei4s üge2lo ügen3s ü2g3l ü2gn üg3s2 üh3a2 ü1he ü2h1ei ü2h3e2m ü3hem. ü2h1eng ü2h1ent ü2h1erf ü2h1er2k ü2h1er2z ü2hex üh1i2 ühi4r ühl1au üh1lä üh2lel ühlen1 üh2lene ühl2er üh2lö ühl2se ühl4sk ühl2sta ühl2sti üh3mo üh3ne üh1o üho4f üh3r2e ühr3ei. ühre2n1 üh1ro ühr3ta üh3s4p ühs4t üh3stu üh3t üht2a üht4r ü1hu üh3w ük2 ül1a ül2c ü3l2e ü4l3ef ül3eim üle2r3a2 ül2la4 üll1ad üll1au ül2lei üll2erg üller2z ül4leu ül2lic ül2lid ül2li2n ül2lo ül2lö ülls2 ü2lö ü1lu ü2m ü3me ü4ment ü4m1e2p üme2ra ü3mi ü4m1id ü4m1in üm1u 2ün ü2n3a ün2da ün3di ün2dr ü2n1erd ünf1 ünf3li ün2g3l ünste2r3 ün2za ün2z1i ünzu2 ün2zun ün2zw ü2p ü3pe üpf3l ü3pi ü3pl üp2pl ü3pu 2ür ür1a ü2r1ei ü2r1e2l ür2f1er2 ür2fl ür2fr ür2g3eng ürge2ra ürk2e ü3r2o3 üro5fe ürom2 üro5ma üror2 ür2rh ür4ster ürte2l1 ürt2h ürz2a ür2z1in ür2zö ür2z3w üs2a ü3schi ü2schl ü3s2e üse1e2 üse3l2 üse4n üse3r4 üs2p ü4ss. ü4s4s3a üs4sä ü4s2s1c ü4s3sel ü4ssl ü4s4s3o ü4s4st üs2su ü2st3a üs4te ü4stei üste2n 2ü1ß 2üt ü2t1al üte3m üte4n üten3s4 ütent4 üten3z2 üte2ra üte2re üter3ei üterich4 üter3n ü2t1h ü2t3r üt2se üt2s3t ütte4n üt2tr üt3zen üt2zw 1v 3va. 2v1ab vab4r va1c va3f va3g2a va2la 2valu v2an. 2vanb v2ans 2varb vari2e v1arm vas2 2v1ass va2s3to va2t1a4 va4tag va4tan va2tei va2t3eng vates2 va2t3h va4tid vati3k2 va4tim va4t1in vati4ons. va4tord va4torg va2t3r vat3s2 va2t1u vat3z 2v1au 2vb 2v1c 2vd2 ve2 ve3ak 2ve3al ve3an ve3ar veau3 ve3b veb4r ve3c ve3d ve3e2 ve3f ve4ff ve3g ve3h 2veig v2eil 2vein veit2 veits3 ve3la 2velan vel2ar ve4l1au v1ele ve3lei ve3l2i ve3lo vel2o3p ve3ma ve3me 2v1emp 2ve3mu ve3nal ve4nas v1endu ve3ne venen2d 2venerg ve3ni ve4nin ve3nö ven5st ven6t3ag vent4sk ve3nü ven2za 2veo ve3of ve3pa ve4pi ver1 ver3a ve3rad 2veral ve3rand ve3rane vera4s ver4bart ver3b2l ver3d4 vere2 vere4i verein4s5t ve4rf4 ver3g4 vergas4 verga5sse ve3ri ve4rin ver3k vermas6sen vern2 ver2sep ver3sta vert4 ver3te ver3u4 ve3rus ve3s 2vesc 2vese ve4sh ve4s3p ve5spi ves4t ve3t vete1 vete3r ve4tl ve4ts ve4tt 2veü ve3v ve3w ve3z 2vf2 vf4gh 2vg 2v1h vi1an vi3ar vi4a3t vi3de 3vie vie2h1a vi2el viela2 viele2 vi2er vie2rec vie2w1 vig2 2vii v2il vi2l1a vi2lä vi4l1e2h vi2lei viler2 vi2lers vi2l1in vi2ma2 vi4na vin3d ving3 vings4 v1ins vi3sa vise4 vi3s2i vi3s2o vi2sp vis2u viv2 viz2 vize3 2vk 2v1l2 v3le v2lie 2vm vm2e vmwa4 2v1n2 2v1ob vo2be vob4l voge2l1 vo2gu vo2i vol2a vol4la voll3ar voll5auf. vollen4 voll3end voller4t 2v1op vo2pe vo2r1 vo4r3a voran6schl vor3g vo3ri vo4rie vo5rig vorm2 vormen2 vor3o vorö4 vor3t4 vo4ru vo5ruf vot2a 2vp2 v3pf 2vq vr2 v1ra v2ree v4ret 3v2ri 2vs2 v3sz 2vt vue3 vu2enu vu2et 2vumf 2vumg 2vumk v1ü 2vv 2vw 2vz 1w w2a 3waa wab2bl wa3che wach4stub wach2t4r 3wack waffe2 waffel3 3wag wa3ge wa5ge4n wa2g3n wag5ne wa3go wag4r 3wah wahl3ent wah4ler wah2l1i wa4ig 3wal wala3c wa2lar 4walb wal4d3a wal2din wal2dr wa2les wa3li wa5lis wal2li2n wal2m1 wals2 wal4t1a wal4terl wal2to wal2tur wa3na wan2d1a2 wan2dr w3anf wan3g2e wang4s 3wann wan4z3en4d wan2z3er wa2p 3war2e ware1i wa3ren 3warn war4ni war2th wart2st war2za 3was wa3sa was4c wa2scha wa3sche wa4schei wa3schi wa2sch3l wa2schw wa3sh wass2 was3s4e2 wa3su wäch3s2e 3wäh 3wäl wäm3 4wäng 3wäs3 wä4ss wäss4e 2w1äu3 2wb2 wbu2 2w1c 2wd we2a we2b1a webe1i we2b3l we2bo we2b3r webs2c wee2 weed3 wef2e we2fl 3weg we2g1a we4g1ei weg3ersc we4g3l we4gn we2g1o4 we4g3r weg5re weg3s wegs2a wegs4t 3weh weh2r3er2 wei2bl weib4r 4weie weifel4d wei2gr wei2ha wei3k4 3weil wei3le weinsau4 wei3sc weisch4 wei2t1r wei5ze wel5le4 wel4schl wel4schr wel2t1 wel4t3a2 welte4 wel4t3en4d wel4th welt3i welt3r wem2ma2 wen3a2 wen2gl we3n2i wen2kau wen2kla wen2k3ri we2r3a2 wer5be werbe3i wer2bl werb2s wer3d2 3werdens 3werdu werer2 wer2fl wer2ga wer2gel wer2g3o wer2gr werin2 we3rins we2ri4o 3werk. wer4k1a 3werke wer2ki wer2k3l wer2kn wer2k3o wer2k3re wer2ku we2rö wer2sta wer2t1a wer2tä wer2tei wert3eig wer4t3erm wer2th wer2tin wer2t1o2 wer2tre wer2t3ri wer2tum 3we3se wesen4s3 we2s3p wes4t we4st1a we4st3ei wes6tel we5sten. we4sten4d we4steu wes6tex we4sti we4st1o4 we2st3r we4stu 3wet 4wets wett3s 2w1ey 2wf 2wg whi2 w3ho w2i wicht4s 3wid wi2e 4wieb 3wied wie3l2 wie3n2e wie4st wik2 3wild wim2ma wim4m3u win2a win2d3ec win3del win4derz 3win2d5r 2wing win2g3r win2kl winner2 win4n5ersc win2no win4num win3s wint2 3wi2r wi4re3 wis4ch wi3s2e wi2s2p 3wiss wiss4z wi3st wi3th 3witz. wit2zer 3witzl wiz2 w2j 2wk 2w1l 2wm 2wn wns2a wn3sh 3wo1c wo2cha woch2e4 woh2lei woh4na 3wolf wol3fe wolf2s wol4la wol2lä wol2ler wor3a wor3d wo2r3i wort1a wor2tel wor4terh wor4t3r wo4r3u wor3ü wot2 3wöc wöl2fo wört2h 2wp w2r w3re w3ro 2ws w3s2h w3s2k w4sk. w2s1u 2wt wti2 w2u 3wuc wuch4sc wuch2st w3uf wu4fe wuls2 wul3se wund4e wung3r wung5s4 wun2s wunsch3l 4wur. wur2fa wurf1o wur2fr 3wurst wur2sta wurs6te wus2 wus4s 3wu2t1 3wüh 3würf 3würst wüs2 2ww 2wz x1a 1xa. 2xa2b 1x2ac 1x2ad 1xae xa3fl 1x2a3g2 2xal xal2l x3am xa5met xa4mi x2an. xand4 1xane 1xani x2an3t2 xanti3 x2anz xa2r 1x2as xau3 xaus2 xa2z 2xb xb4ri xcal2 x1ce x1ch x1cl 2xd xda2 1xe 3xe. 2x1e2g xe4ge 2xek xe2l x1ele xe3lei x1em 3x2em. 2xemp x2ems x2en 3xen. xen3s2 3x2er. x2ere 2x1erl xer2la x2ern xers2 x2ers. xe4rx 3xes 2x1eu 2x1ex 2xf 2xg 2x1h xi1c xich2 xi2dan xide2 xi2dei xi2d3em x1i2do 3x2i2e xie3l xi4en xi3g 3xi3k xik4l xi2ler xili3a xi2lo xi2l1u 1xim2 xin3s2 x2is xi2sa xi2s1e xiso2 xi2sp xiss4 xis5st xi3stä xi2su 3xit x1i4tu xive4 2xk2 xkal2 2x2l2 x3lä x3le 2xm 2x1n 2xoe x3o2l x1o2r 3xos2 2x1ö2 2xp xpor4ter4 xpor2t3r x1r 2xs2 x3sh x3sk x3sz 2xt xt1a x3ta. xta2b3 x3tan xt2ant x3tas x2t1ä x3tät xtblock3 x2t1e2d xt1ein x2t1el x2tent x2t1er2f x2t1ev xtfi2 x2t1h x2t1id xti2la xtil2lu x2t1o2 xto4r xtra3b4 x2t3ran x2trau xt3rec xt3s2 x2t1um x2t1un 1xu1 xu2n 2xunt xu2s3 xusa2 xuss2 2x2v x3ve x3vo 2xw 1xy. y1 y2a 2y3ab 1ya2c y4ach ya1h y3al. ya4mo y3an. yan2g y3ank y3anz y3ar y4a3ra y4are yas2 ya4st y2än ybe2r y2chi y3chis ych3n ydi3e yd4ri2 yd5ric ydrid3 yd4ro3 y2ec ye2d y2ef y2el2 yen4n yera2 y2ere yer2n1 y2e2s y4es. y4e3sp ye4st ye2th yf2 ygie3 yg2l y3ho yhr2 2yi2 yi4sc yi4st yk2 yke3n yk4ni yk4no yk3s2 yk3t yl1a y2la2c yl2ag yl2ak yla4l y2la4m yla2n yl3ane y3lant yl2ante yl2anti y4lantr yl2as yl3c yle2 y2le. yl1em y2l3e4s y2l1e4t yli4n yl4lo2s yl2lö2 yloid3 yloni1 yl2op yl1ora y2m y3m2a ym4an ym4ar ym4as y3mä y3me ym4el y3mi y3mo ymp2 ym2pha ympi3e ymp4t y3mu ynä2r yn2eu ynk2 y2n1o2 yn2oz yn3t2 y2o yob2 yoga3 yom2 yon2a y4one y3ont y3o2pe y4ost y3ot. y3ou y2ö 2yp ypa2b3 ypa2n yp2e2 ype4r3o2 y2p1i2d y2p1in y2plo y3po3 yp3th ypu2 y2p1um yr2e y3ri yri1e yri3en y3ro yro4ste yrr2 2ys ys2an ysch4 ys2e1 ys4ei ysein2 ys3er ys4ho ys3l ysme3 ys4pi yst2e yst2h ysto4le ys4tra y4stro y3s4ty ysu2 ys4ub ys1ur y3s2z yt2h ythe1 ythi3e y3to y2t3r yu2r yur2e3 yvet2 yvon4 yz2 yzer2i 1z 2z1a2b zab3l 2z1ach za1cha za1chä zach2s 2z1a2d 2z1af za3gr 3z2ah zah3len zah4ner2 z1ak 4z3akk 2z1al 4z3alb 4z3ald 3zali 2z1am za4me z1a2n z2an. 2za4n4a 2zanb za3ne 2zanf 2zangs 2zanh z2ank zan2ka 2zanl 2zanp 2zanr zanti1 2zanw za4pf z1a2q z1ar 3zar. 2zarb za3re 2zarm 3z2aro zar2t1r 2z1as zas2b za4sc za3st4 2z1aß z3at zat2e za2to 3zaub 2z1au4f 2z3aug 3zaun z3aur 2z1aut 2z1äc z2äh 3zähn 2z1äm z1än z1är 2z1äus 2zäuß 2zb2 zbah2 zber2e z3bo zb4ri z3bü zbü3b zbübe3 2z1c z3ca z3ch 2zd2 z3da zdan2 zdä1 z3dü 3ze. 2zea ze2ana zeau3 zeaus4 2z1e2ben 2z1echo ze1e2 2z1eff z1e2ga zehe4 zehen1 zeh2l zeh4n1a zeh4n3en ze3ho zei3f4 zeik4 zeil2 zei3la zeile4 2z1ein ze3in. z2e1ind zei4ne 4z3einh ze3inse ze2i3s4 3zeit zei2t1a zeit3end zei4t3er zei2to zei2tr zeit3ri zek4l ze2l1a zela2d zel3am zel3a2n ze2l1ä zel3d4 4ze2lek 4zelem ze2len ze2l1er ze2l1in 2z1e2lit zel3la zel4lab zel4l3ac zel4lar zel2lä zel4leh zel4lein zel4ler4t zeller4z zel2li2n zel2lum zelm4 ze2l1o zels2 zel3sa zel3sz zel2ti zelu2 zembe2 2z1emp 3zen. ze4n1ac ze4nas zen3au ze2nä ze3n2em zenen1 3zenerk 2zenge. z4engl 2zengp 2zeni ze2nid zenk2 zen3n ze2n3o ze4not 2zen2sem zen2ser zens2p z2entn z1ents 2zentw 2zentz ze2nu zen2z3er zen2zw zeo4r 3z2er. zer3a ze1ral ze2rat z2ere ze5rek zer2em z2erfe z3erfül z2erga 2z1ergä z3ergeb 5z4erges z4ergl zer2gon 4zergu 3z2erhe 2z1er3hö ze3ri zerin2t z2erko 3zerl. zer2lau zer2le. 2zerleb zer2len 2zerlö 3z2ern zer2nan zer2n3e2b zer4nei 2z1erö zer2öf ze1rös 2z1erq 3zerr 4z3erreg z2ers. z1ersa zers4t zerta2 zer4t3ag zert2an zer2ter zer2tin zer2to z3ertrag zer4trau z1erwe z1erz zer2ze ze2s 3z2es. ze3sc zes1e zes3er zes3p ze4s5po zes2sa zessen2 zes4s3end zes2ser zes2sp zes2sum ze3sta ze3str ze2ß1 z2et. 2zeta 2ze2th ze2tr 2zetts zeu2gem zeu2g3r 2z1eul ze1ur 2z1e2x1 2zf zf4at zfäs3 z3fe zfeue2 zf4la zf4le zf4re zf4rü 2zg2 zgang5 zger2a zger2s1 z3gn zg4nu 2z1h2 zhau2t1 zhir3 3zi. zial5l zi3alo zi2ar zich2o zi2dei zid3r ziele2 zie2leb zie2l1i zi1erh zi1es 3zig zigs4 2z3ik zi2ko 3zil zil2e z2imm 4zimp zim2t3 2z1ind zin2e zin3ei 2z1inf z1inh zi4n1in 2z1inj zin4na zin4o zin2sa zin2ser zin4sk 2zinsuf zi2o3 zirk2 zirk4s z1iso zi2sp zisse4 zi4stern zi3s2z zite4 zi3th zithe2 zi2t1o2 zit2u ziv2 2zj 2zk2 zk4ne z3ky 2z1l2 z3ly 2zm2 z3ma zmas4sen zme2e 2z1n2 z3na z3ne z3oas 2z1ob 2z1of zo2gl zog4s3 2z1oh zolla2 zol3len zoller2 zol2li2 zon3au zon3s zon2t3er zo2o 2zo2pe 2z1o2r zo3re 3z2orn zor4ne 2z1osz 2z1ou zo2w 2z1o2z 2zöf zö4fe 2z1ök z1öl 2zöl. 3z2öll 2zöls 2zön 2zp2 z3pf z3pl zp4lu 2zq 2z1r2 z3re zreb3 zrebs2 z3ru 2zs2 z3sa zsau2 zse1e z3sh z3si z3sk zspor2 zst2 z3str z3sz 2zt zta2n zt3ane z2t1au ztein3 zt3eins zt2el zte3ma z2t1ent z2t1erz z3tes zte3str zt2et zt1he z3them z3t2her zt1hi zt3ho z3thr z3thy zt3rec zt3ric zt3s zu3a zu1ä2 zub4l zubus2 3zuc zuch2e zucht3 zudi4 zud4r zu2el zu3e2r1 zue2t zu3f2 zu5fei zuf4l zuf4r zug2em zu2gent zug3g zug2i zu3gl zu4gla zu4glö zu2go zug6spe zug4ste 2z1uhr zu3hu zu1i2 zu3k zu3l2 2z1um. zum2a 2z1umb zumen2 2zumf 2zumg 2z1umh zum2i 2zumk 2zuml 2zumr 2z1ums zum2u 2zunab zun2e 2z1unem 2zunget 2zungl z1uni 2zu2nio 2zuniv 2zunr 2z1uns 2zunt zuo2 zup2fi zu3pfr zu3r2a 2z1urk 2z1url 2z1urn 2z1urs 2z1urt zu3ru zu3s2 zusch4 zus4p zus4t zu3t2 zut4r zut4u zu4t3z zuz4w 2züb zü4be 3züc zür1c 2zv z2w2 z3wac 2zwag 2zwah z4wang z3war 2zwa2s 2zwäc 2zwär 2zwäs z3wech z4weck 2z3wed 2zweg 2zweh z4weig 2zweil zweiter4 2z3wel 2z3wen 2z3wer z4werg 2z3wes z4wic zwi4e 3zwing 2zwirt z4wisc 2zwiss z4wit 2z3wo z3wör z3wur 2z3wü zy2le 2zz z3z2a zzab4 zz4at z3zer zze3s z3zi z4z1id zz1in z3zo z4zor zz2ö z3zu zzug2s",
["lefthyphenmin"]=1,
- ["length"]=170328,
- ["n"]=24631,
+ ["length"]=183206,
+ ["n"]=26481,
["righthyphenmax"]=1,
},
["version"]="1.001",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-es.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-es.lua
index 54f9d6b09e8..3c3cd9ef49f 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-es.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-es.lua
@@ -6,49 +6,7 @@ return {
["metadata"]={
["mnemonic"]="es",
["source"]="hyph-es",
- ["texcomment"]="% GUIONIZADO DE PALABRAS\
-% ~~~~~~~~~~~~~~~~~~~~~\
-% hyph-es.tex 4.7\
-%\
-% License: MIT/X11\
-%\
-% Copyright (c) 1993, 1997 Javier Bezos\
-% Copyright (c) 2001-2015 Javier Bezos and CervanTeX\
-%\
-% Permission is hereby granted, free of charge, to any person obtaining a copy\
-% of this software and associated documentation files (the \"Software\"), to deal\
-% in the Software without restriction, including without limitation the rights\
-% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\
-% copies of the Software, and to permit persons to whom the Software is\
-% furnished to do so, subject to the following conditions:\
-%\
-% The above copyright notice and this permission notice shall be included in\
-% all copies or substantial portions of the Software.\
-%\
-% THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\
-% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\
-% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\
-% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\
-% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\
-% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\
-% SOFTWARE.\
-% \
-% For further info, bug reports and comments:\
-%\
-% http://www.tex-tipografia.com/spanish_hyphen.html\
-% \
-% I would like to thanks Francesc Carmona for his permission\
-% to steal parts of his work without restrictions. For his\
-% patterns, (c) by Francesc Carmona\
-% \
-% 2015-11-12\
-% \
-% _____________________________________________________________\
-% Javier Bezos | http://www.cervantex.es/\
-% .............................................................\
-% TeX y tipografia | http://www.tex-tipografia.com/\
-% \
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvwxyzáéíñóú",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-et.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-et.lua
index 29f7f836d0b..f9bb17d2d8c 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-et.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-et.lua
@@ -6,52 +6,7 @@ return {
["metadata"]={
["mnemonic"]="et",
["source"]="hyph-et",
- ["texcomment"]="% This file is part of hyph-utf8 package and resulted from\
-% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
-%\
-% Source: eehyph.tex (2015-12-22)\
-% Author: Een Saar <saar at aai dot ee>\
-%------------------------------------------------------------------------------\
-% Estonian hyphenation patterns (T1 encoding).\
-% Copyright (c) 2004-2015 Enn Saar <saar at aai dot ee>\
-%\
-% The Estonian pattern data is dual-licensed under the MIT License or\
-% the LaTeX Project Public License Version 1.3 or later at your discretion.\
-%\
-% MIT License (https://opensource.org/licenses/MIT):\
-% \
-% Permission is hereby granted, free of charge, to any person obtaining a copy\
-% of this software and associated documentation files (the \"Software\"), to deal\
-% in the Software without restriction, including without limitation the rights\
-% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\
-% copies of the Software, and to permit persons to whom the Software is\
-% furnished to do so, subject to the following conditions:\
-% \
-% The above copyright notice and this permission notice shall be included in\
-% all copies or substantial portions of the Software.\
-% \
-% THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\
-% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\
-% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\
-% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\
-% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\
-% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\
-% THE SOFTWARE.\
-% \
-% LaTeX Project Public License:\
-% \
-% The latest version 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 \
-% 2003/12/01 or later.\
-%\
-% This work has the LPPL maintenance status \"author-maintained\". \
-% This work consists of this file only.\
-%\
-% The patterns were generated long ago by applying patgen to\
-% an Estonian dictionary; a few patterns were added later manually \
-% to prohibit aa-bits type cases. \
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abdefghijklmnoprstuvzäõöüšž",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-eu.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-eu.lua
index 99b446aff5b..55bff42d7a0 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-eu.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-eu.lua
@@ -6,64 +6,7 @@ return {
["metadata"]={
["mnemonic"]="eu",
["source"]="hyph-eu",
- ["texcomment"]="% copyright: Copyright (c) Juan M. Aguirregabiria 1997, 2008\
-% title: Hyphenation patterns for Basque.\
-% version: June 2008\
-% notice: >\
-% This file is part of the hyph-utf8 package.\
-% See http://www.hyphenation.org for more information on the package,\
-% and http://tp.lc.ehu.es/jma/basque.html for details on Basque hyphenation.\
-% license: >\
-% Permission is hereby granted, free of charge, to any person obtaining\
-% a copy of this file and any associated documentation\
-% (the \"Data Files\") to deal in the Data Files\
-% without restriction, including without limitation the rights to use,\
-% copy, modify, merge, publish, distribute, and/or sell copies of\
-% the Data Files, and to permit persons to whom the Data Files\
-% are furnished to do so, provided that\
-% (a) this copyright and permission notice appear with all copies \
-% of the Data Files,\
-% (b) this copyright and permission notice appear in associated \
-% documentation, and\
-% (c) there is clear notice in each modified Data File\
-% as well as in the documentation associated with the Data File(s)\
-% that the data has been modified.\
-%\
-% THE DATA FILES ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF\
-% ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\
-% WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\
-% NONINFRINGEMENT OF THIRD PARTY RIGHTS.\
-% IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS\
-% NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL\
-% DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,\
-% DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\
-% TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\
-% PERFORMANCE OF THE DATA FILES.\
-%\
-% Except as contained in this notice, the name of a copyright holder\
-% shall not be used in advertising or otherwise to promote the sale,\
-% use or other dealings in these Data Files without prior\
-% written authorization of the copyright holder.\
-% changes:\
-% - >\
-% February 1997 Patterns created by Juan M. Aguirregabiria, based on the\
-% shyphen.sh script for Spanish by Julio Sanchez, September 1991.\
-% - >\
-% June 2008 Generating script rewritten in Ruby and adapted for native\
-% UTF-8 TeX engines, patterns renamed from bahyph.tex to\
-% hyph-eu.tex and added to the hyph-utf8 package. Functionality should\
-% not change apart from adding ñ by default.\
-% ==========================================\
-%\
-% Open vowels: a e o\
-% Closed vowels: i u\
-% Consonants: b c d f g j k l m n ñ p q r s t v w x y z\
-%\
-% Some of the patterns below represent combinations that never\
-% happen in Basque. Would they happen, they would be hyphenated\
-% according to the rules.\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefgijklmnopqrstuvwxyzñ",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-fi.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-fi.lua
index 23b3a19a74e..cc8f7549c83 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-fi.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-fi.lua
@@ -6,29 +6,7 @@ return {
["metadata"]={
["mnemonic"]="fi",
["source"]="hyph-fi",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project from fihyph.tex, whose\
-% author has been identified as Kauko Saarinen. The licence terms are unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-% -----> Finnish hyphenation patterns for MLPCTeX <------\
-% First release January -86 by Kauko Saarinen,\
-% Computing Centre, University of Jyvaskyla, Finland\
-%\
-% Completely rewritten January -88. The new patterns make\
-% much less mistakes with foreign and compound words.\
-% The article \"Automatic Hyphenation of Finnish\"\
-% by Professor Fred Karlsson is also referred\
-% ---------------------------------------------------------\
-%\
-% 8th March -89 (vers. 2.2), some vowel triples by Fred Karlsson added.\
-% 9th January - 95: added \\uccode and \\lccode by Thomas Esser\
-%\
-% ********* Patterns may be freely distributed **********\
-%\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvyäö",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-fr.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-fr.lua
index 3e8983588a3..615dd2b9061 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-fr.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-fr.lua
@@ -6,55 +6,7 @@ return {
["metadata"]={
["mnemonic"]="fr",
["source"]="hyph-fr",
- ["texcomment"]="% copyright: Daniel Flipo and Bernard Gaulle 1994-2002, Arthur Reutenauer 2016\
-% title: French hyphenation patterns\
-% version: V2.13 2016/05/12\
-% language:\
-% name: French\
-% tag: fr\
-% notice: >\
-% This file is part of the hyph-utf8 package.\
-% See http://www.hyphenation.org for more information.\
-% licence:\
-% name: MIT\
-% url: https://opensource.org/licenses/MIT\
-% text: >\
-% Permission is hereby granted, free of charge, to any person obtaining\
-% a copy of this software and associated documentation files (the\
-% \"Software\"), to deal in the Software without restriction, including\
-% without limitation the rights to use, copy, modify, merge, publish,\
-% distribute, sublicense, and/or sell copies of the Software, and to\
-% permit persons to whom the Software is furnished to do so, subject to\
-% the following conditions:\
-%\
-% The above copyright notice and this permission notice shall be\
-% included in all copies or substantial portions of the Software.\
-%\
-% THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\
-% MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\
-% BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\
-% ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\
-% CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\
-% SOFTWARE.\
-% ==========================================\
-%%%%%%%% The most famous good guys who worked hard to obtain something usable.\
-% Jacques Desarmenien, Universite de Strasbourg :\
-% - << how to run TeX in a French environment: hyphenation, fonts,\
-% typography. >> in Tugboat, 5 (1984) 91-102. and TeX85 conference\
-% - << La division par ordinateur des mots francais :\
-% application a TeX >> in TSI vol. 5 No 4, 1986 (C) AFCET-\
-% Gauthier-Villars\
-% Norman Buckle, UQAH (nb; many additions)\
-% Michael Ferguson, INRS-Telecommunications (mjf) June 1988\
-% Justin Bur, Universite de Montreal (jbb; checked against original list)\
-% all patterns including apostrophe missing from nb list\
-% after that, GUTenberg and specially Daniel Flipo and Bernard Gaulle\
-% did their best effort to improve the list of patterns.\
-%\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="'abcdefghijklmnopqrstuvwxyzàâçèéêîïôûœ’",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-gb.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-gb.lua
index fa446d1eb55..42be39b8c9c 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-gb.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-gb.lua
@@ -9,65 +9,7 @@ return {
["metadata"]={
["mnemonic"]="gb",
["source"]="hyph-en-gb",
- ["texcomment"]="% This file has been renamed from ukhyphen.tex to hyph-en-gb.tex in June 2008\
-% for consistency with other files with hyphenation patterns in hyph-utf8 package.\
-% No other changes made. See http://www.tug.org/tex-hyphen for more details.\
-% \
-% File: ukhyphen.tex\
-% TeX hyphenation patterns for UK English\
-% \
-% Unlimited copying and redistribution of this file\
-% is permitted so long as the file is not modified\
-% in any way.\
-%\
-% Modifications may be made for private purposes (though\
-% this is discouraged, as it could result in documents\
-% hyphenating differently on different systems) but if\
-% such modifications are re-distributed, the modified\
-% file must not be capable of being confused with the\
-% original. In particular, this means\
-%\
-%(a) the filename (the portion before the extension, if any)\
-% must not match any of :\
-%\
-% UKHYPH UK-HYPH\
-% UKHYPHEN UK-HYPHEN\
-% UKHYPHENS UK-HYPHENS\
-% UKHYPHENATION UK-HYPHENATION\
-% UKHYPHENISATION UK-HYPHENISATION\
-% UKHYPHENIZATION UK-HYPHENIZATION\
-%\
-% regardless of case, and\
-%\
-%(b) the file must contain conditions identical to these,\
-% except that the modifier/distributor may, if he or she\
-% wishes, augment the list of proscribed filenames.\
-% \
-% $Log: ukhyph.tex $\
-% Revision 2.0 1996/09/10 15:04:04 ucgadkw\
-% o added list of hyphenation exceptions at the end of this file.\
-%\
-%\
-% Version 1.0a. Released 18th October 2005/PT.\
-%\
-% Created by Dominik Wujastyk and Graham Toal using Frank Liang's PATGEN 1.0.\
-% Like the US patterns, these UK patterns correctly hyphenate about 90% of\
-% the words in the input list, and produce no hyphens not in the list\
-% (see TeXbook pp. 451--2).\
-%\
-% These patterns are based on a file of 114925 British-hyphenated words\
-% generously made available to Dominik Wujastyk by Oxford University Press.\
-% This list of words is copyright to the OUP and may not be redistributed.\
-% The hyphenation break points in the words in the abovementioned file is\
-% also copyright to the OUP.\
-%\
-% We are very grateful to Oxford University Press for allowing us to use\
-% their list of hyphenated words to produce the following TeX hyphenation\
-% patterns. This file of hyphenation patterns may be freely distributed.\
-%\
-% These patterns require a value of about 14000 for TeX's pattern memory size.\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvwxyz",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-hr.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-hr.lua
index 45dc176af7f..2cb195e9604 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-hr.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-hr.lua
@@ -6,58 +6,7 @@ return {
["metadata"]={
["mnemonic"]="hr",
["source"]="hyph-hr",
- ["texcomment"]="% copyright: Copyright (C) 1994, 1996, 2011, 2015 Igor Marinović\
-% title: Hyphenation patterns for Croatian language\
-% notice: >\
-% This file is part of the hyph-utf8 package.\
-% See http://www.hyphenation.org for more information.\
-%\
-% license:\
-% - This file is available under any of these licences:\
-% -\
-% name: LPPL\
-% version: 1\
-% or_later: true\
-% url: http://www.latex-project.org/lppl/lppl-1-0.html\
-% -\
-% text: >\
-% Permission is hereby granted, free of charge, to any person obtaining\
-% a copy of this file and any associated documentation\
-% (the \"Data Files\") to deal in the Data Files\
-% without restriction, including without limitation the rights to use,\
-% copy, modify, merge, publish, distribute, and/or sell copies of\
-% the Data Files, and to permit persons to whom the Data Files\
-% are furnished to do so, provided that\
-% (a) this copyright and permission notice appear with all copies \
-% of the Data Files,\
-% (b) this copyright and permission notice appear in associated \
-% documentation, and\
-% (c) there is clear notice in each modified Data File\
-% as well as in the documentation associated with the Data File(s)\
-% that the data has been modified.\
-% \
-% THE DATA FILES ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF\
-% ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\
-% WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\
-% NONINFRINGEMENT OF THIRD PARTY RIGHTS.\
-% IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS\
-% NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL\
-% DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,\
-% DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\
-% TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\
-% PERFORMANCE OF THE DATA FILES.\
-% \
-% Except as contained in this notice, the name of a copyright holder\
-% shall not be used in advertising or otherwise to promote the sale,\
-% use or other dealings in these Data Files without prior\
-% written authorization of the copyright holder.\
-% changes:\
-% - Late 1994 first version\
-% - Beginning of 1996 much more improved version (date of last change: 19.03.1996).\
-% - In summer 2008 patterns incorporated into hyph-utf8 and renamed from hrhyph.tex to hyph-hr.tex.\
-% - 06.06.2011 LPPL licence added.\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnoprstuvzćÄđšž",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-hu.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-hu.lua
index 099d46455c6..fb776b8b374 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-hu.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-hu.lua
@@ -6,51 +6,7 @@ return {
["metadata"]={
["mnemonic"]="hu",
["source"]="hyph-hu",
- ["texcomment"]="% from https://github.com/nagybence/huhyphn/\
-% ------------------------------------------\
-% Huhyphn - hungarian hyphenation patterns v20110815\
-%\
-% ***** BEGIN LICENSE BLOCK *****\
-% Version: MPL 1.1/GPL 2.0/LGPL 2.1\
-%\
-% The contents of this file are subject to the Mozilla Public License Version\
-% 1.1 (the \"License\"); you may not use this file except in compliance with\
-% the License. You may obtain a copy of the License at\
-% http://www.mozilla.org/MPL/\
-%\
-% Software distributed under the License is distributed on an \"AS IS\" basis,\
-% WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License\
-% for the specific language governing rights and limitations under the\
-% License.\
-%\
-% The Original Code is the Huhyphn - hungarian hyphenation patterns.\
-%\
-% The Initial Developer of the Original Code is\
-% Bence Nagy.\
-% Portions created by the Initial Developer are Copyright (C) 2003\
-% the Initial Developer. All Rights Reserved.\
-%\
-% Contributor(s):\
-% Bence Nagy <bence.nagy@gmail.com>\
-%\
-% Alternatively, the contents of this file may be used under the terms of\
-% either the GNU General Public License Version 2 or later (the \"GPL\"), or\
-% the GNU Lesser General Public License Version 2.1 or later (the \"LGPL\"),\
-% in which case the provisions of the GPL or the LGPL are applicable instead\
-% of those above. If you wish to allow use of your version of this file only\
-% under the terms of either the GPL or the LGPL, and not to allow others to\
-% use your version of this file under the terms of the MPL, indicate your\
-% decision by deleting the provisions above and replace them with the notice\
-% and other provisions required by the GPL or the LGPL. If you do not delete\
-% the provisions above, a recipient may use your version of this file under\
-% the terms of any one of the MPL, the GPL or the LGPL.\
-%\
-% ***** END LICENSE BLOCK *****\
-%\
-% Encoding: UTF8\
-%\
-% \\message{Huhyphn - hungarian hyphenation patterns v20110815}\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvwxyzáäéíóöúüőű",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-is.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-is.lua
index 4991ecf0f63..16ca04c9a76 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-is.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-is.lua
@@ -6,31 +6,7 @@ return {
["metadata"]={
["mnemonic"]="is",
["source"]="hyph-is",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project from icehyph.tex,\
-% whose author has been identified as Jorgen Pind <jorgen at lexis.hi.is>\
-% (2004-03-08). The licence terms are unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-% The Icelandic Plain TeX hyphenation tables\
-% as of Nov 2 1988.\
-% Jorgen Pind, Institute of Lexicography, Univ. of Iceland\
-% jorgen@lexis.hi.is (Internet)\
-%\
-% Mar 2 2004: Uploaded a new version to CTAN, with a clarified license\
-% statement, at the request of the author, Jorgen Pind.\
-% Kristinn Gylfason (kristgy@ieee.org)\
-% \
-% This file may be distributed and/or modified under the\
-% conditions of the LaTeX Project Public License, either version 1.2\
-% 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.2 or later is part of all distributions of LaTeX\
-% version 1999/12/01 or later.\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvwxyzáæéíðóöúýþ",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-it.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-it.lua
index 5a76d25a0c8..20d8648a031 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-it.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-it.lua
@@ -6,50 +6,7 @@ return {
["metadata"]={
["mnemonic"]="it",
["source"]="hyph-it",
- ["texcomment"]="% hyph-it.tex\
-%\
-% Italian hyphenation patterns\
-%\
-% This file is part of the hyph-utf8 package.\
-% For more unformation see\
-%\
-% http://tug.org/tex-hyphen\
-%\
-%------------------------------------------------------------------------------\
-%\
-%% Copyright 2008-2011 Claudio Beccari\
-%\
-% 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 2003/12/01 or later.\
-%\
-% This work has the LPPL maintenance status \"maintained\".\
-%\
-% This Current Maintainer of this work is Claudio Beccari\
-% e-mail: claudio dot beccari at gmail dot com\
-%\
-% This work consists of the single file hyph-it.tex.\
-%\
-% \\versionnumber{4.9} \\versiondate{2014/04/22}\
-%\
-% These hyphenation patterns for the Italian language are supposed to comply\
-% with the Recommendation UNI 6461 on hyphenation issued by the Italian\
-% Standards Institution (Ente Nazionale di Unificazione UNI). No guarantee\
-% or declaration of fitness to any particular purpose is given and any\
-% liability is disclaimed.\
-%\
-% ChangeLog:\
-% - 2014-04-22 - Add few patterns involving `h'\
-% - 2011-08-16 - Change the licence from GNU LGPL into LPPL v1.3.\
-% - 2010-05-24 - Fix for Italian patterns for proper hyphenation of -ich and Ljubljana.\
-% - 2008-06-09 - Import of original ithyph.tex into hyph-utf8 package.\
-% - 2008-03-08 - (last change in ithyph.tex)\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="'abcdefghijklmnopqrstuvwxyz’",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-la.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-la.lua
index a706c7c3e1b..04d2930f8f2 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-la.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-la.lua
@@ -6,153 +6,7 @@ return {
["metadata"]={
["mnemonic"]="la",
["source"]="hyph-la",
- ["texcomment"]="% title: Hyphenation patterns for modern and medieval Latin\
-% copyright: Copyright (c) 1999-2016 Claudio Beccari\
-% e-mail claudio dot beccari at gmail dot com\
-% notice: This file is part of the hyph-utf8 package.\
-% See http://www.hyphenation.org for more information.\
-% language:\
-% name: Latin\
-% tag: la\
-% version: 3.201 2016-08-28\
-% licence:\
-% - This file is available under any of the following licences:\
-% -\
-% name: MIT\
-% url: https://opensource.org/licenses/MIT\
-% text: >\
-% Permission is hereby granted, free of charge, to any person\
-% obtaining a copy of this software and associated documentation\
-% files (the “Softwareâ€), to deal in the Software without\
-% restriction, including without limitation the rights to use,\
-% copy, modify, merge, publish, distribute, sublicense, and/or sell\
-% copies of the Software, and to permit persons to whom the\
-% Software is furnished to do so, subject to the following\
-% conditions:\
-%\
-% The above copyright notice and this permission notice shall be\
-% included in all copies or substantial portions of the Software.\
-%\
-% THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND,\
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\
-% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\
-% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\
-% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\
-% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\
-% OTHER DEALINGS IN THE SOFTWARE.\
-% -\
-% name: LPPL\
-% version: 1\
-% or_later: true\
-% url: https://latex-project.org/lppl/\
-% changes:\
-% -\
-% date: 1999\
-% version: 1.0\
-% author: Claudio Beccari\
-% description: First public release\
-% -\
-% date: 2007-04-16\
-% version: 3.1\
-% author: Claudio Beccari\
-% -\
-% date: 2010-05-31\
-% author: Claudio Beccari\
-% description: Removal of OT1 support\
-% -\
-% date: 2010-06-01\
-% version: 3.2\
-% author: Claudio Beccari\
-% description: Removal of pattern 2'2\
-% -\
-% date: 2016-08-28\
-% version: 3.201\
-% author: Claudio Beccari\
-% description: updated header with MIT licence notice;\
-% added few missing patterns\
-%\
-% ==========================================\
-% Patterns for the latin language mainly in modern spelling\
-% (u when u is needed and v when v is needed); medieval spelling\
-% with the ligatures \\ae and \\oe and the (uncial) lowercase `v'\
-% written as a `u' is also supported; apparently there is no conflict\
-% between the patterns of modern Latin and those of medieval Latin.\
-%\
-% For more information please read the babel-latin documentation.\
-%\
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
-%\
-% For documentation see:\
-% C. Beccari, \"Computer aided hyphenation for Italian and Modern\
-% Latin\", TUG vol. 13, n. 1, pp. 23-33 (1992)\
-%\
-% see also\
-%\
-% C. Beccari, \"Typesetting of ancient languages\",\
-% TUG vol.15, n.1, pp. 9-16 (1994)\
-%\
-% In the former paper the code was described as being contained in file\
-% ITALAT.TEX; this is substantially the same code, but the file has been\
-% renamed and included in hyph-utf8.\
-%\
-% A corresponding file (ITHYPH.TEX) has been extracted in order to eliminate\
-% the (few) patterns specific to Latin and leave those specific to Italian;\
-% ITHYPH.TEX has been further extended with many new patterns in order to\
-% cope with the many neologisms and technical terms with foreign roots.\
-%\
-% Should you find any word that gets hyphenated in a wrong way, please, AFTER\
-% CHECKING ON A RELIABLE MODERN DICTIONARY, report to the author, preferably\
-% by e-mail. Please do not report about wrong break points concerning\
-% prefixes and/or suffixes; see at the bottom of this file.\
-%\
-% Compared with the previous versions, this file has been extended so as to\
-% cope also with the medieval Latin spelling, where the letter `V' played the\
-% roles of both `U' and `V', as in the Roman times, save that the Romans used\
-% only capitals. In the middle ages the availability of soft writing supports\
-% and the necessity of copying books with a reasonable speed, several scripts\
-% evolved in (practically) all of which there was a lower case alphabet\
-% different from the upper case one, and where the lower case `v' had the\
-% rounded shape of our modern lower case `u', and where the Latin diphthongs\
-% `AE' and `OE', both in upper and lower case, where written as ligatures,\
-% not to mention the habit of substituting them with their sound, that is a\
-% simple `E'.\
-%\
-% According to Leon Battista Alberti, who in 1466 wrote a book on\
-% cryptography where he thoroughly analyzed the hyphenation of the Latin\
-% language of his (still medieval) times, the differences from the Tuscan\
-% language (the Italian language, as it was named at his time) were very\
-% limited, in particular for what concerns the handling of the ascending and\
-% descending diphthongs; in Central and Northern Europe, and later on in\
-% North America, the Scholars perceived the above diphthongs as made of two\
-% distinct vowels; the hyphenation of medieval Latin, therefore, was quite\
-% different in the northern countries compared to the southern ones, at least\
-% for what concerns these diphthongs. If you need hyphenation patterns for\
-% medieval Latin that suite you better according to the habits of Northern\
-% Europe you should resort to the hyphenation patterns prepared by Yannis\
-% Haralambous (TUGboat, vol.13 n.4 (1992)).\
-%\
-%\
-%\
-% PREFIXES AND SUFFIXES\
-%\
-% For what concerns prefixes and suffixes, the latter are generally separated\
-% according to \"natural\" syllabification, while the former are generally\
-% divided etimologically. In order to avoid an excessive number of patterns,\
-% care has been paid to some prefixes, especially \"ex\", \"trans\", \"circum\",\
-% \"prae\", but this set of patterns is NOT capable of separating the prefixes\
-% in all circumstances.\
-%\
-% BABEL SHORTCUTS AND FACILITIES\
-%\
-% Read the documentation coming with the discription of the Latin language\
-% interface of Babel in order to see the shortcuts and the facilities\
-% introduced in order to facilitate the insertion of \"compound word marks\"\
-% which are very useful for inserting etymological break points.\
-%\
-% Happy Latin and multilingual typesetting!\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvxzæœ",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-lt.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-lt.lua
index ac0b277192c..e5918f085a0 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-lt.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-lt.lua
@@ -6,52 +6,7 @@ return {
["metadata"]={
["mnemonic"]="lt",
["source"]="hyph-lt",
- ["texcomment"]="% This file is part of hyph-utf8 package and resulted from\
-% semi-manual conversions of hyphenation patterns into UTF-8\
-% in October 2008 by Mojca & Arthur.\
-%\
-% Source available on:\
-% - http://www.vtex.lt/tex/littex/index.html\
-%\
-% Authors:\
-%\
-% First version in LT encoding (modified T1):\
-% - Vytas StatuleviÄius <vytas at vtex.lt>\
-% - Yannis Haralambous\
-% (Vilnius, March 4, 1992)\
-% Conversion into Latin 7 and aditional support files (babel, fonts):\
-% - Sigitas Tolušis <sigitas at vtex.lt>\
-% (2002-11-20)\
-% Adaptation for hyph-utf8:\
-% - Mojca & Arthur (see below), October 2008\
-%\
-% The copyright statement of this file is:\
-%\
-% Do with this file whatever needs to be done in future for the sake of\
-% \"a better world\" as long as you respect the copyright of original file.\
-%\
-% If you want to change this file, rather than uploading directly to CTAN,\
-% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
-% or ask for credentials for SVN repository and commit it yourself;\
-% we will then upload the whole \"package\" to CTAN.\
-%\
-% For more unformation see\
-%\
-% http://tug.org/tex-hyphen\
-%\
-%------------------------------------------------------------------------------\
-%\
-% A note about lefthyphenmin/righthyphenmin (by Sigitas, February 2009):\
-%\
-% At the moment the lefthyphenmin & righthyphenmin are both set to 2.\
-% The Lithuanian patterns were build earlier then the latest grammatical rules\
-% took place in 1997. At that time it was forbidden to leave one character at boundary.\
-% One may change it to one now, but from typographical point of view there is no need to do\
-% any changes. Even more, changing lefthyphen and righthyphen to 1 requires\
-% to review and maybe rebuild the patterns file.\
-%\
-%------------------------------------------------------------------------------\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnoprstuvwyzÄ…Äėęįšūųž",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-lv.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-lv.lua
index bda2aabbf52..fce915b67c2 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-lv.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-lv.lua
@@ -6,20 +6,7 @@ return {
["metadata"]={
["mnemonic"]="lv",
["source"]="hyph-lv",
- ["texcomment"]="% This file is part if hyph-utf8 package and resulted from semi-manual\
-% conversions of hyphenation patterns into UTF-8 in November 2008 by Mojca &\
-% Arthur.\
-%\
-% This file is available under the term of the GNU GPL, version 2.\
-%\
-% Source: Latvian Lingucomponents for OpenOffice\
-% Homepage: http://sourceforge.net/projects/openoffice-lv\
-% File: hyph_lv_lv.dic (version 0.3, 2005-09-14)\
-% Author: Copyright (C) 2004-2005 Janis Vilims, jvilims@apollo.lv\
-% License: Lesser General Public Licence (LGPL) 2.1\
-%\
-% \
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnoprstuvzÄÄēģīķļņšūž",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-mk.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-mk.lua
new file mode 100644
index 00000000000..d13f1e37faa
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-mk.lua
@@ -0,0 +1,20 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="mk",
+ ["source"]="hyph-mk",
+ ["texcomment"]="% no comment",
+ },
+ ["patterns"]={
+ ["characters"]="абвгдежзиклмнопрÑтуфхцчшѓѕјљњќџ",
+ ["data"]=".б2 .в2 .вр5зан. .г2 .д2 .др5жат .др5жи. .з2 .к2 .м2 .оÑ3в .оÑ3л .п2 .поÑ2 .по3ÑÑ€ .по5Ñта .по5Ñтв .Ñ2 .Ñтап5к .Ñ‚2 .ш2 а1а аб1л аб1Ñ€2 а1ва а1ве ав1л а1во ав1Ñ€2 ав1Ñ‚ аг1л аг1Ñ€ ад1в ад1л ад1Ñ€ а1е а1жа а1жи а1жу аз1д а1зу а1и а1ји а1ка ак1в а1ки ак1л а1ко ак1Ñ€ а1ла а1ле а1ло а1лу а1м а1о а1па а1пе а3пкат а3пки ап1л ап1Ñ€ а1ра ар1в ар1д а1ре а1ри ар1л а1ро арт2 ар3тн ар3ту а1ру аÑ1в аÑ1к аÑ1л аÑ1п аÑ1Ñ€ аÑ1Ñ‚ а1Ñ‚ а2Ñ‚1в а2тн а2Ñ‚1Ñ€ а1у а1фа а1фо ах1Ñ€ а2ц1Ñ€ ач1л аш1Ñ‚ 1ба б1в б1д 1бе б1з 1би 2б1ј б1м б1н 1бо б1Ñ€2н 1бу в1г в1д в2з 1ви в2ју в1ка в1ки в1м 2в1н 2вњ воÑ1 в1па вр3ве вр2з в1ро вр4Ñкат вр4Ñкит вр2Ñ… 2в1Ñ Ð²1Ñ‚Ñ€ 1ву в1ш 1га г2б г1в 1ге г1з 1ги г1м 3г4нато 1го гоÑ3л г1рв гр4цит 1гу 1да да2Ñ Ð´1б д1ве д1вл д1вр д1г д1д 1де д1з 1ди 4дицио д1ј д1к д1ле д1ло д1лу д1м д1н 3д2нив 1до до5з4нае доÑ3л д1п д1ре д1ри д1Ñ2 д1Ñ‚2 1ду 1Ñ“ е1а еб1л еб1Ñ€ е1ва е1ве ев1к е1во ев1Ñ€ ег1л ег1Ñ€ ед1в ед4нот ед1Ñ€ е1е е1жа е1жи е1жу ез1г е1зу 2е1и е1ка ек1в е1ки ек1л е1ко ек1Ñ€ е1ла е1ле е1ло е1лу е1м ем1Ñ€ е2м1Ñ Ðµ1о е1па е1пе еп1к еп1л епоÑ3Ñ€ епо4ÑÑ‚ еп1Ñ€ е1ра ер1в е1ре ер1з е1ри е1ро ер1п е1ру еÑ1в еÑ1к еÑ1л еÑ1п еÑ1Ñ€ еÑ1Ñ‚ е1та ет1в е1те ет1Ñ€ е1ту е1у е1фо еф1Ñ€2 ех1Ñ€ еш1Ñ‚ ж1б ж1д 1же жи1 ж1ј ж2л 2ж1н 1жо ж1Ñ‚ 1за зб2 збе3Ñ Ð·1бр з1в звр2 з1гл зд2 з1дн 1зе 1зи з1ј з1ле з1м 1зо з1ре з1ри 1Ñ• и1а иб1Ñ€ и1ва и1ве ив1к ив1л и1во ив1Ñ€ ив1Ñ‚ иг1л иг1Ñ€ ид1Ñ€ и1е и1ж из1г из1д из1л из1Ñ€ и1зу и1и и1ј и1к и2кв и2к1л и2кн и2к1Ñ€ и2кт и1ла и1ле и1ло и1лу им1Ñ Ð¸2Ð½Ñ Ð¸1о и1па и1пе ип1к ип1л ип1Ñ€ и1Ñ€ и2рг и2рл и2рн и2Ñ€1Ñ‚ иÑ1к иÑ1л иÑ1п иÑ3Ñ‚2 и1Ñ‚ и2тн и2Ñ‚1Ñ€ и1у и1Ñ„ и1Ñ… и2ш1Ñ‚ 1ја ј1б2 ј1в ј1г ј1д2 1је ј1ж ј1з2 2ј1к ј1л ј1м2 ј3мн ј1н2 1јо ј1п јпо4Ñ3 ј1Ñ€ 2ј1Ñ 2ј1Ñ‚ 2јќ 1ју ј1Ñ„ 2јц ј1ч 2јш2 ј1шт 1кам кап3к 1кар к1ве к1во 1ке к2ј кл2 к1ле к1Ð»Ñ Ðº1м к1Ñ€2д кр2Ñ ÐºÑ€1ш кр2ше кр2ши 2к1Ñ2 к1Ñ‚2 2кт. 1ку к1Ñ„ л1б л1в л1г л1д л1ж л1з 1ли л1ј л1к2 л1м л1н л1п л1Ñ2 л1Ñ‚ л1Ñ„ л1ч2 л1ш 1Ñ™ ља1 1ма 2м1б 2м1в м1д 1ме 1ми 2м1ј 2м1к 2мн 1мо 2м1п2 2мр м3рм мр2Ñ‚ мр3Ñ‚2в м1ÑÑ‚ 2м1Ñ‚2 м3тл 1му м1Ñ„ м1ч м1ш 1на н1б н1в н1г2 2н1д2 1не н1ж2 н1з 1ни 2н1к2 н1л н1м 1но н1п2 н1Ñ€ н1Ñ2 2н1Ñ‚2 н3Ñ‚Ñ 1ну н1Ñ„2 н1Ñ… 2нц н1ч 1Ñš ња1 њаÑ2 ње1 о1а об1л об1Ñ€2 о1ва о1ве ов1л о1во ов1Ñ€2 ов1Ñ‚ ог1л ог1Ñ€ од1в од1л од1Ñ€ о1е о1жа о1жи ож1Ñ€ о1жу оз1д оз1Ñ€ о1зу о1и о1ка ок1в о1ки ок1л о1ко ок1Ñ€ о1ла о1ле о1ло о1лу ом1Ñ€ ом1Ñ Ð¾1о о1па о1пе оп1к оп1л оп1Ñ€ о1ра о1ре о1ри о1ро ор3та о1ру оÑ3во оÑле3 оÑлед4 оÑ3ло оÑлу3 оÑ1п оÑре3 оÑред4 оÑ1Ñ‚ оÑ5тави оÑта5пк о1та от1в отвр2 о1те от1Ñ€2 о1ту о1у о1Ñ„ о1хе ох1Ñ€ о2ц1Ñ€2 ош1Ñ‚ 1пи п1ко п1кр п1н 1по по3Ñв по3Ñк по3Ñл по3Ñ2м по3Ñп по3Ñти3 поÑтиг4 по3Ñто пр2в пр2к п1Ñ2 п1Ñ‚ 1пу п1Ñ„ п1Ñ… п1ч п1ш2 Ñ€1б2 Ñ€2биј Ñ€1вј рв1Ñ‚ Ñ€1г2 рд2 Ñ€2да. Ñ€2дил Ñ€2дим Ñ€2ду рз2 Ñ€2зат Ñ€2зин Ñ€3зно 2Ñ€1к2 Ñ€2кн Ñ€1ло 2Ñ€1м2 Ñ€3мн Ñ€2мо Ñ€1н роÑ3в Ñ€1па рп2л Ñ€1Ñ2 рт1в рт4вит рт2ву Ñ€3теа Ñ€2тин Ñ€2тио рт2л рт2ни Ñ€2тов Ñ€1Ñ‚Ñ€ Ñ€1Ñ„ Ñ€1Ñ… рч2 Ñ€2ча рш2 Ñ€2шеш Ñ€2шим Ñ€2шу 1Ñа Ñвр3зе 1Ñе 1Ñи Ñ1ј Ñк2 Ñ1кн Ñма3Ñ‚ Ñ2мел Ñ1н Ñ2наа 1Ñо Ñ2пок Ñ1рд 2ÑÑ‚. 3Ñтавт 3Ñтапк ÑÑ‚2в 3Ñтеп 2Ñтеш Ñ1Ñ‚2н Ñ2Ñ‚Ñ‚ 1Ñу Ñ1Ñ„Ñ€2 Ñ1Ñ…Ñ€ Ñцр2 Ñ1ч 1та. 2тапк Ñ‚1г 2Ñ‚1д 1теж 2теп 1ти 2Ñ‚1к 2Ñ‚1л 2Ñ‚1м 1то 2тоел 2тоеч 2тоја 2Ñ‚1п Ñ‚2ра. Ñ‚Ñ€2в Ñ‚Ñ€1л Ñ‚Ñ€2п 2Ñ‚1Ñ2 Ñ‚1Ñ‚ Ñ‚Ñ‚Ñ€2 Ñ‚1Ñ„ Ñ‚Ñ„Ñ€2 Ñ‚1Ñ… 2Ñ‚1ч 1Ñœ ќа1 2Ñœ1н 2Ñœ1Ñ‚ у1а уб1л уб1Ñ€ у1в у2в1Ñ€ уг1л уг1Ñ€ уд1Ñ€ у1е у1жа у1жи у1жу у1и у1ка ук1в у1ки ук1л ук1Ñ€ у1ла у1ле у1ло у1лу ум1Ñ€ ум1Ñ Ñƒ1н у1о у1па у1пе уп1к уп1л уп1Ñ€ у1ра ур1д у1ре у1ри у1ро у1ру уÑ1к уÑ1л уÑ1п уÑ1Ñ‚ у1та ут1в утвр2 у1те ут1Ñ€ уф1 у1Ñ… у1ч уш4ниц уш4но. уш1Ñ‚ 1фе 1фи Ñ„1к фл2 Ñ„1ле Ñ„2н Ñ„1ри Ñ„1ро 2Ñ„1Ñ Ñ„1Ñ‚ 1ха 1хи Ñ…1м Ñ…1н 1хо Ñ…1Ñ‚ 1ху 1ц 2ц1в цвр2 2цк ц1ки 2ц1н цр2к цр2на цр2не 2ц1Ñ… 1ча ч1в 1че 1чи 2ч1к 2ч1н 1чо1 2ч1Ñ‚ 1чу 1ÑŸ џа1 2ÑŸ1м 1ша шап1 1ше 2шел 1ши ш1к ш1л ш1м ш1н 1шо1 ш1та ш1тв ш1ту 1шу",
+ ["lefthyphenmin"]=1,
+ ["length"]=5524,
+ ["n"]=725,
+ ["righthyphenmax"]=1,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-ml.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-ml.lua
index ab65268fa2b..e914912cc55 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-ml.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-ml.lua
@@ -6,33 +6,7 @@ return {
["metadata"]={
["mnemonic"]="ml",
["source"]="hyph-ml",
- ["texcomment"]="% These patterns originate from\
-% https://github.com/santhoshtr/hyphenation/)\
-% and have been adapted for hyph-utf8 (for use in TeX).\
-%\
-% Hyphenation for Malayalam\
-% Copyright (C) 2016 Santhosh Thottingal (santhosh dot thottingal at gmail dot com)\
-%\
-% Permission is hereby granted, free of charge, to any person obtaining\
-% a copy of this software and associated documentation files (the\
-% \"Software\"), to deal in the Software without restriction, including\
-% without limitation the rights to use, copy, modify, merge, publish,\
-% distribute, sublicense, and/or sell copies of the Software, and to\
-% permit persons to whom the Software is furnished to do so, subject to\
-% the following conditions:\
-%\
-% The above copyright notice and this permission notice shall be\
-% included in all copies or substantial portions of the Software.\
-%\
-% THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\
-% MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\
-% LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\
-% OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\
-% WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="ംഃഅആഇഈഉഊഋഌഎà´à´à´’ഓഔകഖഗഘങചഛജà´à´žà´Ÿà´ à´¡à´¢à´£à´¤à´¥à´¦à´§à´¨à´ªà´«à´¬à´­à´®à´¯à´°à´±à´²à´³à´´à´µà´¶à´·à´¸à´¹à´¾à´¿àµ€àµàµ‚ൃെേൈൊോൌàµàµ—ൠൡൺൻർൽൾൿ‌â€",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-mn.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-mn.lua
index 338667b1c92..8cc86501ce0 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-mn.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-mn.lua
@@ -6,58 +6,7 @@ return {
["metadata"]={
["mnemonic"]="mn",
["source"]="hyph-mn-cyrl",
- ["texcomment"]="% copyright: Copyright 2007-2015 by Dorjgotov Batmunkh, National University of Mongolia\
-% title: Hyphenation patterns for Mongolian language\
-% version: v1.2 2008/03/23\
-% notice: >\
-% This file is part of the hyph-utf8 package.\
-% See http://www.hyphenation.org for more information.\
-% license:\
-% - This file is available under any of the following licenses:\
-% -\
-% name: LPPL\
-% version: 1.3\
-% or_later: true\
-% url: http://www.latex-project.org/lppl/lppl-1-3.txt\
-% -\
-% name: MIT\
-% url: https://opensource.org/licenses/MIT\
-% text: >\
-% Permission is hereby granted, free of charge, to any person obtaining a copy\
-% of this software and associated documentation files (the \"Software\"), to deal\
-% in the Software without restriction, including without limitation the rights\
-% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\
-% copies of the Software, and to permit persons to whom the Software is\
-% furnished to do so, subject to the following conditions:\
-% \
-% The above copyright notice and this permission notice shall be included in\
-% all copies or substantial portions of the Software.\
-% \
-% THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\
-% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\
-% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\
-% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\
-% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\
-% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\
-% THE SOFTWARE.\
-% changes:\
-% - 2008/03/23 v1.2\
-% - 2008/06/08 Patterns added to hyph-utf8\
-% - 2015/12/05 Patterns released under the MIT license\
-% ==========================================\
-% Special thanks to: Jim Hefferon and Robin Fairbairns\
-%\
-% There are few basic rules in mongolian\
-%\
-% 1. If there is a consonant then it can use hyphen before it.\
-% And if there're two consonants then it can use hyphen before second consonant.\
-% Are there three consonants then it can put hyphen before third consonant,\
-% also are there four consonants then it can use hyphen before fourth consonant.\
-% 2. In the case of hardsign or softsign, it's possible to hyphen after these signs.\
-% For instance, байгуулъ-Ñ, үзүүль-е\
-% 3. However one vowel can be belong to a syllable, it's not possible to use hyphen.\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="абвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘Ò¯Ó©",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-nb.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-nb.lua
index 085cc3b89e0..1ee9e55fd35 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-nb.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-nb.lua
@@ -9,40 +9,7 @@ return {
["metadata"]={
["mnemonic"]="nb",
["source"]="hyph-nb",
- ["texcomment"]="% Adapted to the new pattern-loading scheme.\
-% Original file name was nbhyph.tex\
-% \
-% TeX hyphenation patterns for Norwegian Bokmal\
-%\
-% Version 2007-02-10\
-%\
-% Copyright (C) 2007 Karl Ove Hufthammer.\
-% Copying and distribution of this file, with or without modification,\
-% are permitted in any medium without royalty, provided the copyright\
-% notice and this notice are preserved.\
-%\
-% This file contains hyphenation patterns for Norwegian Bokmal.\
-% It uses the Norwegian hyphenation patterns from nohyphbx.tex,\
-% created by Rune Kleveland and Ole Michael Selberg. Please see\
-% that file for copyright information on those patterns.\
-%\
-% The patterns in nohyphbx are based on both Norwegian Bokmal\
-% and Norwegian Nynorsk, and works about equally well for both\
-% languages. This file, nbhyph.tex, contains only a few hyphenation\
-% exceptions, for words that needs to be hyphenated differently for\
-% the two languages.\
-%\
-% Please send bugs or suggestions to karl@huftis.org.\
-%\
-% \
-% \\input hyph-no.tex\
-% \
-% \\hyphenation{\
-% at-ten-de\
-% be-tre\
-% }\
-% \
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvwxyzåæèéêòóôø",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-nl.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-nl.lua
index 3b98563dd1f..5408cbe7e98 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-nl.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-nl.lua
@@ -9,50 +9,7 @@ return {
["metadata"]={
["mnemonic"]="nl",
["source"]="hyph-nl",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project from nehyph96.tex,\
-% whose author has been identified as Piet Tutelaers. The licence terms are\
-% unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-% PURPOSE: 8-bit hyphenation patterns for TeX based upon the new Dutch\
-% spelling, officially since 1 August 1996. These patterns follow\
-% the new hyphenation rules in the `Woordenlijst Nederlandse\
-% Taal, SDU Uitgevers, Den Haag 1995' (the so called `Groene\
-% Boekje') described in section 5.2 (Het afbreekteken).\
-%\
-% The main differences with our earlier patterns based upon the\
-% CELEX dictionary are:\
-% (1) provide 8-bit patterns based upon the T1 character encoding\
-% (the encoding for DC/EC compatible TeX fonts)\
-% (2) don't hyphenate if this results in a syllable of one letter\
-% before or after the hyphen (hence hyphens in a-drenaline,\
-% studi-o, mensa-pen and vide-oachtig are invalid)\
-% (3) handle words derived from other languages (`bastaard\
-% woorden') according to the new rules\
-%\
-% Like the CELEX patterns these patterns don't hyphenate:\
-% (4) in a changing syllable (menuutje can not be hyphenated as\
-% menu-tje)\
-% (5) in words that have different hyphenations according to\
-% there meaning (buur-tje/buurt-je)\
-%\
-% COPYRIGHT (C) 1996: Piet Tutelaers\
-%\
-% -----------------------------------------------------------------\
-% IMPORTANT NOTICE:\
-%\
-% This program can be redistributed and/or modified under the terms\
-% of the LaTeX Project Public License Distributed from CTAN\
-% archives in directory macros/latex/base/lppl.txt; either\
-% version 1 of the License, or any later version.\
-% -----------------------------------------------------------------\
-% VERSION: 1.1 (November 1996) Copyright changed March 2000\
-%\
-% AUTHOR: Piet Tutelaers P.T.H.Tutelaers@tue.nl\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvwxyzäçèéêëîïñöûü",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-nn.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-nn.lua
index 316e440749a..84062f208b2 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-nn.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-nn.lua
@@ -9,40 +9,7 @@ return {
["metadata"]={
["mnemonic"]="nn",
["source"]="hyph-nn",
- ["texcomment"]="% Adapted to the new pattern-loading scheme.\
-% Original file name was nnhyph.tex\
-% \
-% TeX hyphenation patterns for Norwegian Nynorsk\
-%\
-% Version 2007-02-10\
-%\
-% Copyright (C) 2007 Karl Ove Hufthammer.\
-% Copying and distribution of this file, with or without modification,\
-% are permitted in any medium without royalty, provided the copyright\
-% notice and this notice are preserved.\
-%\
-% This file contains hyphenation patterns for Norwegian Nynorsk.\
-% It uses the Norwegian hyphenation patterns from nohyphbx.tex,\
-% created by Rune Kleveland and Ole Michael Selberg. Please see\
-% that file for copyright information on those patterns.\
-%\
-% The patterns in nohyphbx are based on both Norwegian Bokmal\
-% and Norwegian Nynorsk, and works about equally well for both\
-% languages. This file, nnhyph.tex, contains only a few hyphenation\
-% exceptions, for words that needs to be hyphenated differently for\
-% the two languages.\
-%\
-% Please send bugs or suggestions to karl@huftis.org.\
-%\
-% \
-% \\input hyph-no.tex\
-% \
-% \\hyphenation{\
-% att-en-de\
-% bet-re\
-% }\
-% \
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvwxyzåæèéêòóôø",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-pl.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-pl.lua
index aa8fc5026b7..62fe5a69c9b 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-pl.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-pl.lua
@@ -9,41 +9,7 @@ return {
["metadata"]={
["mnemonic"]="pl",
["source"]="hyph-pl",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project from plhyph.tex, whose\
-% authors have been identified as Hanna Kołodziejska, Bogusław Jackowski, Marek\
-% Ryćko (1995-06-26). The licence terms are unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-% This is PLHYPH.TeX - the Polish hyphenation patterns\
-% version 3.0a, Wednesday, May 17th, 1995\
-% to be used for the inclusion of Polish hyphenation patterns in any format,\
-% not necessarily in the MeX or LaMeX ones. The patterns are exactly\
-% the same as in the version 3.0 being the part of the MeX package,\
-% only the surrounding of the \\pattern command is changed. The authors\
-% claim the upward compatibility, i.e., the version 3.0a can also be used\
-% with the MeX or LaMeX formats.\
-% \
-% The history of development of the Polish hyphenation patterns:\
-%\
-% The first version of the patterns was developed\
-% by Hanna Kołodziejska (1987).\
-%\
-% The adaptation to the LeX format (see below) and extensive modification\
-% were done by Bogusław Jackowski & Marek Ryćko (1987--1989).\
-%\
-% The hyphenation rules were further improved and adapted to the\
-% TeX 3.x requirements by Hanna Kołodziejska (1991).\
-%\
-% Lone-standing version (3.0a) of patterns was prepared (under pressure\
-% from LaTeX users) by Bogusław Jackowski and Marek Ryćko, following\
-% Mariusz Olko's suggestions, 1995.\
-% \
-% The LeX format mentioned above was the first version of the adaptation\
-% of TeX to the Polish language. The next version is called MeX.\
-% \
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnoprstuvwxyzóąćęłńśźż",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-pt.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-pt.lua
index 7e7562cb88f..ae45b6f6684 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-pt.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-pt.lua
@@ -9,63 +9,7 @@ return {
["metadata"]={
["mnemonic"]="pt",
["source"]="hyph-pt",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project from pthyph.tex\
-% (Version 1.2, 1996-07-21), whose authors have been identified as Pedro J. de\
-% Rezende <rezende at dcc.unicamp.br> and J.Joao Dias Almeida <jj at\
-% di.uminho.pt>. The licence terms are unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-% ---------------------------------------------------------------------\
-% BSD 3-Clause License (https://opensource.org/licenses/BSD-3-Clause):\
-% \
-% Copyright (c) 1987, Pedro J. de Rezende (rezende@ic.unicamp.br) and J.Joao Dias Almeida (jj@di.uminho.pt)\
-% \
-% All rights reserved.\
-% \
-% Redistribution and use in source and binary forms, with or without\
-% modification, are permitted provided that the following conditions are met:\
-% * Redistributions of source code must retain the above copyright\
-% notice, this list of conditions and the following disclaimer.\
-% * Redistributions in binary form must reproduce the above copyright\
-% notice, this list of conditions and the following disclaimer in the\
-% documentation and/or other materials provided with the distribution.\
-% * Neither the name of the University of Campinas, of the University of\
-% Minho nor the names of its contributors may be used to endorse or\
-% promote products derived from this software without specific prior\
-% written permission.\
-% \
-% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\
-% ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\
-% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\
-% DISCLAIMED. IN NO EVENT SHALL PEDRO J. DE REZENDE OR J.JOAO DIAS ALMEIDA BE\
-% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\
-% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\
-% GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\
-% HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\
-% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\
-% OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
-% The Portuguese TeX hyphenation table.\
-% (C) 2015 by Pedro J. de Rezende (rezende@ic.unicamp.br)\
-% and J.Joao Dias Almeida (jj@di.uminho.pt)\
-% Version: 1.3 Release date: 12/08/2015\
-%\
-% (C) 1996 by Pedro J. de Rezende (rezende@ic.unicamp.br)\
-% and J.Joao Dias Almeida (jj@di.uminho.pt)\
-% Version: 1.2 Release date: 07/21/1996\
-%\
-% (C) 1994 by Pedro J. de Rezende (rezende@ic.unicamp.br)\
-% Version: 1.1 Release date: 04/12/1994\
-%\
-% (C) 1987 by Pedro J. de Rezende\
-% Version: 1.0 Release date: 02/13/1987\
-%\
-% -----------------------------------------------------------------\
-% Remember! If you *must* change it, then call the resulting file\
-% something else and attach your name to your *documented* changes.\
-% =================================================================\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="-abcdefghijklmnopqrstuvwxzáâãçéêíóôõú",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-ro.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-ro.lua
index 6a7b6be6eb3..5fc3ec090d6 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-ro.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-ro.lua
@@ -6,62 +6,7 @@ return {
["metadata"]={
["mnemonic"]="ro",
["source"]="hyph-ro",
- ["texcomment"]="% This file has been converted for the hyph-utf8 package from rohyphen.tex,\
-% whose author has been identified as Adrian Rezus <adriaan at {sci,cs}.kun.nl>\
-% (1996-11-11). The licence terms are unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
-%% ROHYPHEN.TEX, version 1.1 <29.10.1996> R [7.11.1996] %%\
-%% (C) 1995-1996 Adrian Rezus [adriaan@{sci,cs}.kun.nl] %%\
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
-%%\
-%% Romanian TeX hyphenation table: NFSS 2 encoding, medium.\
-%% Contents: 647 Romanian hyphen patterns, with diacritics.\
-%%\
-%% This file is part of the Romanian TeX system.\
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
-%% Romanian TeX, version 1.3R <29.10.1996> %%\
-%% (C) 1994-1996 Adrian Rezus %%\
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
-%% History:\
-%% ROHYPHEN.TEX 1.0 <10.02.1995>: Plain TeX and LaTeX 2.09.\
-%% ROHYPHEN.TEX 1.1 <29.10.1996>: Plain TeX and LaTeX2e.\
-%\
-% -------------------------------------------------------------------\
-% \
-% TODO: fix the notice below - it only holds for the old patterns\
-% \
-%\9NB This file must be used in conjunction with either one of\
-%\
-%\9(1)\9ROMANIAN.TEX v1.2(R) [1994-1995] [(La)TeX] or\
-%\9(2)\9ROMANIAN.STY v1.3R [1996] [(La)TeX(2e)]\
-%\
-%\9NB Romanian has LR-HYPHEN-MINs [2 2] (like German)!\
-%\9NB Romanian has STRUCTURAL HYPHEN-AMBIGUA:\
-%\9 i.e., words that canNOT be hyphenated correctly without\
-%\9 additional (e.g., semantic, stress-mark) information.\
-%\9--------------------------------------------------------\
-%\9The Romanian TeX encoding of the Romanian diacritics:\
-%\9--------------------------------------------------------\
-%\9Romanian TeX \9DQ-macro encodings\9= (La)TeX macros\
-%\9--------------------------------------------------------\
-%\9ă = \\u{a}\9\9\9[-] \\u{A} [not encoded]\
-%\9â = \\^{a}\9\9\9[-] \\^{A} [not encoded]\
-%\9î = \\^{\\i}\9\9\9\"I = \\^{I}\
-%\9È™ = \\c{s}\9\9\9\"S = \\c{S}\
-%\9È› = \\c{t}\9\9\9\"T = \\c{T}\
-%\9-------------------------------------------------------------\
-%\9NB Romanian \\^{a} behaves like \\^{\\i} as regards hyphenation.\
-%\9NB The capital \\u{A} and \\^{A} are rare in script; as such,\
-%\9 they occur only in records of the Romanian substandard.\
-% -------------------------------------------------------------------\
-%\
-% original patterns generated by PatGen2-output hyphen-level 9: do NOT modify the list by hand!\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnoprstuvxzîășț",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-ru.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-ru.lua
index 17dffaacd49..8423d093958 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-ru.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-ru.lua
@@ -9,29 +9,7 @@ return {
["metadata"]={
["mnemonic"]="ru",
["source"]="hyph-ru",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project from various files\
-% [FIXME document] whose author has been identified as Alexander I. Lebedev\
-% <swan at scon155.phys.msu.su> (2003-03-10). The licence terms are unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-% Russian hyphenation patterns, version 2003/03/10\
-% Copyright 1999-2003 Alexander I. Lebedev <swan@scon155.phys.msu.su>\
-%\
-% This program may be distributed and/or modified under the conditions\
-% of the LaTeX Project Public License, either version 1.2 or any later\
-% version.\
-%\
-% Patterns were generated with patgen from a 990,000-word list and then\
-% manually corrected.\
-%\
-% The program consists of the files ruhyphal.tex, cyryoal.tex and two\
-% document files README.ruhyphal and hyphen.rules. The file cyryoal.tex\
-% can be regenerated using mkcyryo script (a part of ruhyphen package)\
-% and the latest release of rus-ispell dictionaries\
-% <ftp://scon155.phys.msu.su/pub/russian/ispell/>.\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="-абвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-sk.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-sk.lua
index d3f2cc8df3a..58f17397de9 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-sk.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-sk.lua
@@ -9,35 +9,7 @@ return {
["metadata"]={
["mnemonic"]="sk",
["source"]="hyph-sk",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project from\
-% skhyphen.tex and skhyphen.ex, whose author has been identified as Jana\
-% Chlebíková <chlebikj at dcs.fmph.uniba.sk>. The licence terms are unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-% Slovak hyphenation (version 2.0) 24.4.1992\
-% Autor: Jana Chlebíková, department of Informatics Education,\
-% Comenius University, 842 15 Bratislava, Slovakia\
-% <chlebikj@dcs.fmph.uniba.sk>\
-%\
-% This is free software; you can redistribute it and/or modify\
-% it under the terms of the GNU General Public License as published by\
-% the Free Software Foundation; either version 2 of the License, or\
-% (at your option) any later version.\
-%\
-% This file is distributed in the hope that it will be useful,\
-% but WITHOUT ANY WARRANTY; without even the implied warranty of\
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\
-% GNU General Public License for more details.\
-%\
-% You should have received a copy of the GNU General Public License\
-% along with this program; if not, write to the Free Software\
-% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\
-%%% --------------------------------------------------------------------\
-% \\message {Loading SK hyphenation patterns: Jana Chlebikova, 1992}\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnoprstuvwxyzáäéíóôúýÄÄľňŕšťž",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-sl.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-sl.lua
index c0077785041..08e5ed121b4 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-sl.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-sl.lua
@@ -6,62 +6,7 @@ return {
["metadata"]={
["mnemonic"]="sl",
["source"]="hyph-sl",
- ["texcomment"]="% copyright: Copyright (C) 1990 Matjaž VreÄko, TeXCeX (SLO)\
-% title: Slovenian hyphenation patterns\
-% version: 2007-01-29\
-% notice: >\
-% This file is part of the hyph-utf8 package.\
-% See http://www.hyphenation.org for more information.\
-% license:\
-% - This file is available under any of these licences:\
-% -\
-% name: LPPL\
-% version: 1\
-% or_later: true\
-% url: http://www.latex-project.org/lppl/lppl-1-0.html\
-% -\
-% name: MIT\
-% url: https://opensource.org/licences/MIT\
-% text: >\
-% Permission is hereby granted, free of charge, to any person\
-% obtaining a copy of this software and associated documentation\
-% files (the \"Software\"), to deal in the Software without\
-% restriction, including without limitation the rights to use,\
-% copy, modify, merge, publish, distribute, sublicense, and/or sell\
-% copies of the Software, and to permit persons to whom the\
-% Software is furnished to do so, subject to the following\
-% conditions:\
-%\
-% The above copyright notice and this permission notice shall be\
-% included in all copies or substantial portions of the Software.\
-%\
-% THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\
-% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\
-% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\
-% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\
-% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\
-% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\
-% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\
-% OTHER DEALINGS IN THE SOFTWARE.\
-% changes:\
-% - 1990 First version of `hyphen.si' (Matjaž VreÄko, TeXCeX)\
-%\
-% - >\
-% Some cosmetic changes done later on, but none of these apply any more;\
-% the patterns are still the same as they were originally:\
-% - 1994-05-17 Use of code page 852 in patterns (Leon Žlajpah)\
-% - 1995-04-06 Release of `sihyph21.tex'\
-% - 1995-06-20 >\
-% Added \\slovenehyphenmins\
-% Release of `sihyph22.tex'\
-% - 1997-15-04 >\
-% Some changes concerning \"c, \"s, \"z and ...\
-% Release of `sihyph23.tex'\
-% - 2007-01-20 >\
-% `sihyph23.tex' renamed to `slhyph.tex'\
-% (sl is the proper language code for Slovenian)\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvwxyzÄšž",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-sr.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-sr.lua
index 8211e4a93c4..d70cd9ab2af 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-sr.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-sr.lua
@@ -9,32 +9,7 @@ return {
["metadata"]={
["mnemonic"]="sr",
["source"]="hyph-sr-cyrl",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project from srhyphc.tex,\
-% whose authors have been identified as Aleksandar Jelenak <ajelenak AT\
-% yahoo.com>, Dejan Muhamedagić (2003-06-09). The licence terms are unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-% This is `srhyphc.tex' file. It contains hyphenation patterns for Serbian\
-% language in the Cyrillic alphabet. TeX font encoding is T2A.\
-%\
-% This file is distributed under the terms of the GNU General Public License.\
-% Latest version of the license is at <http://www.gnu.org/copyleft/gpl.html>.\
-%\
-% Version: 1.0a\
-% Last change: 2003-06-09\
-%\
-% Credits:\
-% - Initial hyphenation patterns for T1 font encoding by Dejan Muhamedagić\
-% - Improvements and adaptation to T2A font encoding by Strahinja Radić\
-% - Further improvements and integration into one file by Aleksandar Jelenak\
-%\
-% Current maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com>\
-%\
-% \\message{Serbian Cyrillic Hyphenation Patterns `srhyphc.tex' v1.0a <2003-06-09>}\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="абвгдежзиклмнопрÑтуфхцчшђјљњћџ",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-sv.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-sv.lua
index a7684bdc57c..43967b0982e 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-sv.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-sv.lua
@@ -6,64 +6,7 @@ return {
["metadata"]={
["mnemonic"]="sv",
["source"]="hyph-sv",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project from sehyph.tex, whose\
-% author has been identified as Jan Michael Rynning (2003-09-08). The licence\
-% terms are unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-% Swedish hyphenation patterns.\
-%\
-% Copyright 1994 by Jan Michael Rynning. All rights reserved.\
-% This program may be distributed and/or modified under the conditions of\
-% the LaTeX Project Public License, either version 1.2 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.2 or later is\
-% part of all distributions of LaTeX version 1999/12/01 or later.\
-%\
-% Last update: 1994-03-03 (March 3, 1994).\
-% Revision history:\
-% 1991-01-08: First version available for anonymous FTP.\
-% 1991-08-08: Changed \\aa to \\aa0 at end of line, to stop TeX from\
-% concatenating the patterns.\
-% 1991-09-03: Cleaned up lots of inconsistencies in the dictionary.\
-% As a consequence, the patterns shrunk a lot. Also\
-% added some 4000 one-syllable words, some of which were\
-% hyphenated by the old patterns, and some 1500 compound\
-% words, about half of which were incorrectly hyphenated\
-% by the old patterns.\
-% 1991-11-01: Added another some 6200 compound words, all of which were\
-% incorrectly hyphenated by the old patterns.\
-% 1991-11-13: Added another some 6500 compound words, all of which were\
-% incorrectly hyphenated by the old patterns.\
-% 1992-01-30: Changed macros to ^^, for use with LaTeX and dc fonts.\
-% 1994-03-03: The hyphenated dictionary now contains about 118,000 words.\
-% The hyphenation now works much better for compound words.\
-% Patgen parameters: 1 2 20, 2 1 8, 1 4 7, 3 2 1, 1 10000 4.\
-%\
-% This file contains Swedish hyphenation patterns for TeX. It assumes\
-% that you have fonts with the Swedish letters in the positions where\
-% they occur in ISO Latin 1 (ISO 8859/1):\
-% Letter: \\AA \\\"A \\\"O \\'E \\aa \\\"a \\\"o \\'e\
-% Position: \"C5 \"C4 \"D6 \"C9 \"E5 \"E4 \"F6 \"E9\
-%\
-% Load this file into initex after plain.tex (or lplain.tex, splain.tex,\
-% or whatever).\
-%\
-% The patterns were generated in such a way that they will hyphenate\
-% correctly if \\lefthyphenmin>=1 and \\righthyphenmin>=2.\
-%\
-% These hyphenation patterns work quite well for simple words, but not\
-% quite as well for compound words. I'm working on improving the quality,\
-% by adding more words. If you know any Swedish words which are not\
-% correctly hypheneted using these patterns, or if you have questions or\
-% comments, please contact me:\
-%\
-% Jan Michael Rynning <jmr@incolumitas.se>\
-% --------------------------------------------------------------------------\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvwxyzäåéö",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-th.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-th.lua
index a9b4bc42036..ef6ba47b47e 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-th.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-th.lua
@@ -6,25 +6,7 @@ return {
["metadata"]={
["mnemonic"]="th",
["source"]="hyph-th",
- ["texcomment"]="% title: Hyphenation patterns for Thai\
-% copyright: Copyright 2012-2013 Theppitak Karoonboonyanan <theppitak at gmail.com>\
-% notice: This file is part of the hyph-utf8 package.\
-% See http://www.hyphenation.org for more information.\
-% language:\
-% name: Thai\
-% tag: th\
-% licence:\
-% name: LPPL\
-% version: 1.3\
-% or_later: true\
-% status: maintained\
-% maintainer: Theppitak Karoonboonyanan\
-% url: https://latex-project.org/lppl/\
-% ==========================================\
-% https://linux.thai.net/projects/thailatex\
-% https://github.com/tlwg/thailatex\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºà¹€à¹à¹‚ใไๅ็่้๊๋์à¹à¹Ž",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-tk.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-tk.lua
index 4d02cadee12..6271a66f765 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-tk.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-tk.lua
@@ -6,35 +6,7 @@ return {
["metadata"]={
["mnemonic"]="tk",
["source"]="hyph-tk",
- ["texcomment"]="% copyright: Copyright (c) 2010-2015 Nazar Annagurban\
-% title: Hyphenation patterns for Turkmen language\
-% version: 0.1 16 March 2010\
-% notice: >\
-% This file is part of the hyph-utf8 package.\
-% See http://www.hyphenation.org for more information.\
-% license:\
-% name: MIT\
-% url: https://opensource.org/licenses/MIT\
-% text: >\
-% Permission is hereby granted, free of charge, to any person obtaining a copy\
-% of this software and associated documentation files (the \"Software\"), to deal\
-% in the Software without restriction, including without limitation the rights\
-% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\
-% copies of the Software, and to permit persons to whom the Software is\
-% furnished to do so, subject to the following conditions:\
-% \
-% The above copyright notice and this permission notice shall be included in\
-% all copies or substantial portions of the Software.\
-% \
-% THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\
-% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\
-% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\
-% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\
-% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\
-% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\
-% THE SOFTWARE.\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="-abdefghijklmnoprstuwyzäçöüýňşž",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-tr.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-tr.lua
index 109889b5efe..042ff5ba2c7 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-tr.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-tr.lua
@@ -6,41 +6,7 @@ return {
["metadata"]={
["mnemonic"]="tr",
["source"]="hyph-tr",
- ["texcomment"]="% hyph-tr.tex\
-%\
-% Turkish hyphenation patterns\
-%\
-% This file is auto-generated from source/generic/hyph-utf8/languages/tr/generate_patterns_tr.rb that is part of hyph-utf8.\
-% Please don't modify this file; modify the generating script instead.\
-%\
-% Copyright (C) 1987 Pierre A. MacKay\
-% 2008, 2011 TUG\
-%\
-% This program can redistributed and/or modified under the terms\
-% of the LaTeX Project Public License Distributed from CTAN\
-% archives in directory macros/latex/base/lppl.txt; either\
-% version 1 of the License, or (at your option) any later version.\
-%\
-% Credits:\
-% - algorithm developed by P. A. MacKay for the Ottoman Texts Project in 1987\
-% - rules adapted for modern Turkish by H. Turgut Uyar <uyar at itu.edu.tr>\
-% - initiative to improve Turkish patterns by S. Ekin Kocabas <kocabas at stanford.edu>\
-% - script written by Mojca Miklavec <mojca.miklavec.lists at gmail.com> in June 2008\
-%\
-% See also:\
-% - http://mirror.ctan.org/language/turkish/hyphen/turk_hyf.c\
-% - http://www.tug.org/TUGboat/Articles/tb09-1/tb20mackay.pdf\
-%\
-% Differences with Ottoman patterns:\
-% - adapted for the use on modern TeX engines, using UTF-8 charactes\
-% - only letters for Modern Turkish + âîû (the first one often needed, the other two don't hurt)\
-% - (if needed, support for Ottoman Turkish might be provided separately under language code 'ota')\
-%\
-% Changes:\
-% - 2008-06-25/27/28 - create this file by adapting Ottoman rules for modern Turkish\
-% - 2011-08-10 - add LPPL licence with permission of Pierre A. MacKay\
-% \
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnoprstuvyzâçîöûüğış",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-uk.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-uk.lua
index e9529c83c08..32634ae76b7 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-uk.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-uk.lua
@@ -6,23 +6,7 @@ return {
["metadata"]={
["mnemonic"]="uk",
["source"]="hyph-uk",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project, from various files\
-% [FIXME document], whose authors have been identified as Maksym Polyakov\
-% <polyama at auburn.edu> and <mpoliak at i.com.ua>. The licence terms are\
-% unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-% Ukrainian hyphenation patterns in LCY (cp866nav) encoding.\
-% Copyright 1998-2001 Maksym Polyakov.\
-% Released 2001/05/10.\
-% This file can be redistributed and/or modified\
-% under the terms of the LaTeX Project Public License (lppl).\
-% Please, send bug reports via e-mail:\
-% polyama@auburn.edu\
-% mpoliak@i.com.ua\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="'-абвгдежзийклмнопрÑтуфхцчшщьюÑєіїґ’",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-us.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-us.lua
index c8fce4d2173..7fe52a2c3f0 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-us.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-us.lua
@@ -9,45 +9,7 @@ return {
["metadata"]={
["mnemonic"]="us",
["source"]="hyph-en-us",
- ["texcomment"]="% This file has been renamed from ushyphmax.tex to hyph-en-us.tex in June 2008\
-% for consistency with other files with hyphenation patterns in hyph-utf8 package.\
-% No other changes made. See http://www.tug.org/tex-hyphen for more details.\
-% \
-% ushyphmax.tex -- patterns for more hyphenation pattern memory (12000+).\
-% Also known as ushyphen.max.\
-%\
-% version of 2005-05-30.\
-% Patterns of March 1, 1990.\
-%\
-% Copyright (C) 1990, 2004, 2005 Gerard D.C. Kuiken.\
-% Copying and distribution of this file, with or without modification,\
-% are permitted in any medium without royalty provided the copyright\
-% notice and this notice are preserved.\
-%\
-% Needs extended pattern memory.\
-% Hyphenation trie becomes 7283 with 377 ops.\
-%\
-% These patterns are based on the Hyphenation Exception Log\
-% published in TUGboat, Volume 10 (1989), No. 3, pp. 337-341,\
-% and a large number of incorrectly hyphenated words not yet published.\
-% If added to Liang's before the closing bracket } of \\patterns,\
-% the patterns run errorfree as far as known at this moment.\
-%\
-% These patterns find all admissible hyphens of the words in\
-% the Exception Log. ushyph2.tex is a smaller set.\
-%\
-% Please send bugs or suggestions to tex-live (at) tug.org.\
-%\
-% 2005-05-30 (karl): in the past, ushyphmax.tex was a file containing\
-% only the additional patterns, without the \\patterns command, etc.\
-% This turned out not to be very useful, since in practice the TeX\
-% distributions need one self-contained file for a language. Therefore,\
-% ushyphmax.tex now contains both the additional patterns from\
-% Dr. Kuiken, and the original patterns and hyphenations from Knuth's\
-% hyphen.tex.\
-%\
-% The Plain TeX hyphenation tables.\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
["characters"]="abcdefghijklmnopqrstuvwxyz",
diff --git a/Master/texmf-dist/tex/context/patterns/mkiv/lang-zh.lua b/Master/texmf-dist/tex/context/patterns/mkiv/lang-zh.lua
index 107eac071fa..ae4ac878dea 100644
--- a/Master/texmf-dist/tex/context/patterns/mkiv/lang-zh.lua
+++ b/Master/texmf-dist/tex/context/patterns/mkiv/lang-zh.lua
@@ -6,47 +6,14 @@ return {
["metadata"]={
["mnemonic"]="zh",
["source"]="hyph-zh-latn-pinyin",
- ["texcomment"]="% This file has been converted for the hyph-utf8 project from pyhyph.tex, whose\
-% author has been identified as Werner Lemberg <wl at gnu.org>. The licence\
-% terms are unchanged.\
-%\
-% See http://www.hyphenation.org for details on the project.\
-%------------------------------------------------------------------------------\
-%\
-% This is the file pyhyph.tex of the CJK package\
-% for hyphenating Chinese pinyin syllables.\
-%\
-% created by Werner Lemberg <wl@gnu.org>\
-%\
-% Version 4.8.0 (22-May-2008)\
-%\
-% Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org>\
-%\
-% This program is free software; you can redistribute it and/or modify\
-% it under the terms of the GNU General Public License as published by\
-% the Free Software Foundation; either version 2 of the License, or\
-% (at your option) any later version.\
-%\
-% This program is distributed in the hope that it will be useful,\
-% but WITHOUT ANY WARRANTY; without even the implied warranty of\
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\
-% GNU General Public License for more details.\
-%\
-% You should have received a copy of the GNU General Public License\
-% along with this program in doc/COPYING; if not, write to the Free\
-% Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,\
-% MA 02110-1301 USA\
-%\
-% \\message{Hyphenation patterns for unaccented pinyin syllables (CJK 4.7.0)}\
-%\
-% ",
+ ["texcomment"]="% no comment",
},
["patterns"]={
- ["characters"]="'abcdefghijklmnopqrstuwxyzü’",
- ["data"]="a1b a1c a1d a1f a1g a1h a1j a1k a1l a1m a1p a1q a1r a1s a1t a1w a1x a1y a1z e1b e1c e1d e1f e1g e1h e1j e1k e1l e1m e1p e1q e1s e1t e1w e1x e1y e1z 1ga g1b g1c g1d 1ge g1f g1g g1h g1j g1k g1l g1m g1n 1go g1p g1q g1r g1s g1t 1gu g1w g1x g1y g1z i1b i1c i1d i1f i1g i1h i1j i1k i1l i1m i1p i1q i1r i1s i1t i1w i1x i1y i1z 1na n1b n1c n1d 1ne n1f n1h 1ni n1j n1k n1l n1m n1n 1no n1p n1q n1r n1s n1t 1nu 1nü n1w n1x n1y n1z o1b o1c o1d o1f o1g o1h o1j o1k o1l o1m o1p o1q o1r o1s o1t o1w o1x o1y o1z 1ra r1b r1c r1d 1re r1f r1g r1h 1ri r1j r1k r1l r1m r1n 1ro r1p r1q r1r r1s r1t 1ru r1w r1x r1y r1z u1b u1c u1d u1f u1g u1h u1j u1k u1l u1m u1p u1q u1r u1s u1t u1w u1x u1y u1z ü1b ü1c ü1d ü1f ü1g ü1h ü1j ü1k ü1l ü1m ü1n ü1p ü1q ü1r ü1s ü1t ü1w ü1x ü1y ü1z '1a ’1a '1e ’1e '1o ’1o",
+ ["characters"]="abcdefghijklmnopqrstuwxyzàáèéìíòóùúüÄēěīÅÅ«ÇŽÇǒǔǖǘǚǜ",
+ ["data"]="a1b Ä1b á1b ÇŽ1b à1b a1c Ä1c á1c ÇŽ1c à1c a1d Ä1d á1d ÇŽ1d à1d a1f Ä1f á1f ÇŽ1f à1f a1g Ä1g á1g ÇŽ1g à1g a1h Ä1h á1h ÇŽ1h à1h a1j Ä1j á1j ÇŽ1j à1j a1k Ä1k á1k ÇŽ1k à1k a1l Ä1l á1l ÇŽ1l à1l a1m Ä1m á1m ÇŽ1m à1m a1p Ä1p á1p ÇŽ1p à1p a1q Ä1q á1q ÇŽ1q à1q a1r Ä1r á1r ÇŽ1r à1r a1s Ä1s á1s ÇŽ1s à1s a1t Ä1t á1t ÇŽ1t à1t a1w Ä1w á1w ÇŽ1w à1w a1x Ä1x á1x ÇŽ1x à1x a1y Ä1y á1y ÇŽ1y à1y a1z Ä1z á1z ÇŽ1z à1z e1b Ä“1b é1b Ä›1b è1b e1c Ä“1c é1c Ä›1c è1c e1d Ä“1d é1d Ä›1d è1d e1f Ä“1f é1f Ä›1f è1f e1g Ä“1g é1g Ä›1g è1g e1h Ä“1h é1h Ä›1h è1h e1j Ä“1j é1j Ä›1j è1j e1k Ä“1k é1k Ä›1k è1k e1l Ä“1l é1l Ä›1l è1l e1m Ä“1m é1m Ä›1m è1m e1p Ä“1p é1p Ä›1p è1p e1q Ä“1q é1q Ä›1q è1q e1r Ä“1r é1r Ä›1r è1r e1s Ä“1s é1s Ä›1s è1s e1t Ä“1t é1t Ä›1t è1t e1w Ä“1w é1w Ä›1w è1w e1x Ä“1x é1x Ä›1x è1x e1y Ä“1y é1y Ä›1y è1y e1z Ä“1z é1z Ä›1z è1z 1ga 1gÄ 1gá 1gÇŽ 1gà g1b g1c g1d 1ge 1gÄ“ 1gé 1gÄ› 1gè g1f g1g g1h g1j g1k g1l g1m g1n 1go 1gÅ 1gó 1gÇ’ 1gò g1p g1q g1r g1s g1t 1gu 1gÅ« 1gú 1gÇ” 1gù g1w g1x g1y g1z i1b Ä«1b í1b Ç1b ì1b i1c Ä«1c í1c Ç1c ì1c i1d Ä«1d í1d Ç1d ì1d i1f Ä«1f í1f Ç1f ì1f i1g Ä«1g í1g Ç1g ì1g i1h Ä«1h í1h Ç1h ì1h i1j Ä«1j í1j Ç1j ì1j i1k Ä«1k í1k Ç1k ì1k i1l Ä«1l í1l Ç1l ì1l i1m Ä«1m í1m Ç1m ì1m i1p Ä«1p í1p Ç1p ì1p i1q Ä«1q í1q Ç1q ì1q i1r Ä«1r í1r Ç1r ì1r i1s Ä«1s í1s Ç1s ì1s i1t Ä«1t í1t Ç1t ì1t i1w Ä«1w í1w Ç1w ì1w i1x Ä«1x í1x Ç1x ì1x i1y Ä«1y í1y Ç1y ì1y i1z Ä«1z í1z Ç1z ì1z 1na 1nÄ 1ná 1nÇŽ 1nà n1b n1c n1d 1ne 1nÄ“ 1né 1nÄ› 1nè n1f n1h 1ni 1nÄ« 1ní 1nÇ 1nì n1j n1k n1l n1m n1n 1no 1nÅ 1nó 1nÇ’ 1nò n1p n1q n1r n1s n1t 1nu 1nÅ« 1nú 1nÇ” 1nù 1nü 1nÇ– 1nǘ 1nÇš 1nÇœ n1w n1x n1y n1z o1b Å1b ó1b Ç’1b ò1b o1c Å1c ó1c Ç’1c ò1c o1d Å1d ó1d Ç’1d ò1d o1f Å1f ó1f Ç’1f ò1f o1g Å1g ó1g Ç’1g ò1g o1h Å1h ó1h Ç’1h ò1h o1j Å1j ó1j Ç’1j ò1j o1k Å1k ó1k Ç’1k ò1k o1l Å1l ó1l Ç’1l ò1l o1m Å1m ó1m Ç’1m ò1m o1p Å1p ó1p Ç’1p ò1p o1q Å1q ó1q Ç’1q ò1q o1r Å1r ó1r Ç’1r ò1r o1s Å1s ó1s Ç’1s ò1s o1t Å1t ó1t Ç’1t ò1t o1w Å1w ó1w Ç’1w ò1w o1x Å1x ó1x Ç’1x ò1x o1y Å1y ó1y Ç’1y ò1y o1z Å1z ó1z Ç’1z ò1z 2r1b 2r1c 2r1d 2r1f 2r1g 2r1h 2r1j 2r1k 2r1l 2r1m 2r1n 2r1p 2r1q 2r1r 2r1s 2r1t 2r1w 2r1x 2r1y 2r1z u1b Å«1b ú1b Ç”1b ù1b u1c Å«1c ú1c Ç”1c ù1c u1d Å«1d ú1d Ç”1d ù1d u1f Å«1f ú1f Ç”1f ù1f u1g Å«1g ú1g Ç”1g ù1g u1h Å«1h ú1h Ç”1h ù1h u1j Å«1j ú1j Ç”1j ù1j u1k Å«1k ú1k Ç”1k ù1k u1l Å«1l ú1l Ç”1l ù1l u1m Å«1m ú1m Ç”1m ù1m u1p Å«1p ú1p Ç”1p ù1p u1q Å«1q ú1q Ç”1q ù1q u1r Å«1r ú1r Ç”1r ù1r u1s Å«1s ú1s Ç”1s ù1s u1t Å«1t ú1t Ç”1t ù1t u1w Å«1w ú1w Ç”1w ù1w u1x Å«1x ú1x Ç”1x ù1x u1y Å«1y ú1y Ç”1y ù1y u1z Å«1z ú1z Ç”1z ù1z ü1b Ç–1b ǘ1b Çš1b Çœ1b ü1c Ç–1c ǘ1c Çš1c Çœ1c ü1d Ç–1d ǘ1d Çš1d Çœ1d ü1f Ç–1f ǘ1f Çš1f Çœ1f ü1g Ç–1g ǘ1g Çš1g Çœ1g ü1h Ç–1h ǘ1h Çš1h Çœ1h ü1j Ç–1j ǘ1j Çš1j Çœ1j ü1k Ç–1k ǘ1k Çš1k Çœ1k ü1l Ç–1l ǘ1l Çš1l Çœ1l ü1m Ç–1m ǘ1m Çš1m Çœ1m ü1n Ç–1n ǘ1n Çš1n Çœ1n ü1p Ç–1p ǘ1p Çš1p Çœ1p ü1q Ç–1q ǘ1q Çš1q Çœ1q ü1r Ç–1r ǘ1r Çš1r Çœ1r ü1s Ç–1s ǘ1s Çš1s Çœ1s ü1t Ç–1t ǘ1t Çš1t Çœ1t ü1w Ç–1w ǘ1w Çš1w Çœ1w ü1x Ç–1x ǘ1x Çš1x Çœ1x ü1y Ç–1y ǘ1y Çš1y Çœ1y ü1z Ç–1z ǘ1z Çš1z Çœ1z",
["lefthyphenmin"]=1,
- ["length"]=802,
- ["n"]=194,
+ ["length"]=3276,
+ ["n"]=684,
["righthyphenmax"]=1,
},
["version"]="1.001",
diff --git a/Master/texmf-dist/tex/context/sample/common/gray.tex b/Master/texmf-dist/tex/context/sample/common/gray.tex
new file mode 100644
index 00000000000..6447de0708b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/common/gray.tex
@@ -0,0 +1,3 @@
+Unfortunately, the theory of memes is science only in the sense that Intelligent
+Design is science. Strictly speaking, it is not even a theory. Talk of memes is
+just the latest in a succession of ill-judged Darwinian metaphors.
diff --git a/Master/texmf-dist/tex/context/sample/common/samples.tex b/Master/texmf-dist/tex/context/sample/common/samples.tex
index d732a240e27..71688270e42 100644
--- a/Master/texmf-dist/tex/context/sample/common/samples.tex
+++ b/Master/texmf-dist/tex/context/sample/common/samples.tex
@@ -59,6 +59,7 @@ used in testing bibliographic references and citations.
their mark on the brain,
Rider, London, 2014. \NC \NR
\NC poe.tex \NC Edgar Allan Poe \NC A dream within a dream, www.poetryfoundation.org. \NC \NR
+\NC gray.tex \NC John Gray \NC https://www.theguardian.com/books/2008/mar/15/society \NC \NR
\stoptabulate
% Tufte: This quote will always produce hyphenated text, apart from the content,
diff --git a/Master/texmf-dist/tex/context/sample/third/dyrynk-cz.tex b/Master/texmf-dist/tex/context/sample/third/dyrynk-cz.tex
index e12a228b950..2a00c2348b6 100644
--- a/Master/texmf-dist/tex/context/sample/third/dyrynk-cz.tex
+++ b/Master/texmf-dist/tex/context/sample/third/dyrynk-cz.tex
@@ -5,9 +5,9 @@ slabou vÄ›tÅ¡iny naÅ¡ich knih. ÄŒasto až pÅ™ekvapí rozpor mezi péÄí, kterou
věnoval umělec výzdobě knihy, a ledabylostí, s jakou ji tiskárna zhotovila.
Bývá to podivná harmonie: výzdoba umělecká a sazba i tisk jako denních
novin. Nejsou to malé závody, jichž výrobkům lze vytknouti tuto řemeslnou
-chybu, i pÅ™ední veliké tiskárny zhotovují takto >>krásné<< knihy. StaÄí
-prohlédnouti si podrobnÄ›ji reprodukce v tomto díle, abychom se pÅ™esvÄ›dÄili,
-že to tvrzení není přehnané.
+chybu, i přední veliké tiskárny zhotovují takto \quotation{krásné} knihy.
+StaÄí prohlédnouti si podrobnÄ›ji reprodukce v tomto díle, abychom se
+pÅ™esvÄ›dÄili, že to tvrzení není pÅ™ehnané.
PÅ™ece vÅ¡ak lze pozorovati potěšitelný obrat k lepšímu: nÄ›které Äeské
knihtiskárny se chlubí už správně vysazenými a dobře vytištěnými knihami.
diff --git a/Master/texmf-dist/tex/context/sample/third/dyrynk-vlnka-cz.tex b/Master/texmf-dist/tex/context/sample/third/dyrynk-vlnka-cz.tex
index 1d4df1e49da..f0a3857295e 100644
--- a/Master/texmf-dist/tex/context/sample/third/dyrynk-vlnka-cz.tex
+++ b/Master/texmf-dist/tex/context/sample/third/dyrynk-vlnka-cz.tex
@@ -1,4 +1,3 @@
-
Čeho jsem si zvlášť všímal při prohlížení knih, je typografické jejich
zhotovení, technické provedení knihtiskařem, které po mém soudu je základem
dobré knižní úpravy. A~tu nelze upřít, že řemeslná stránka je dosud stránkou
@@ -6,9 +5,9 @@ slabou vÄ›tÅ¡iny naÅ¡ich knih. ÄŒasto až pÅ™ekvapí rozpor mezi péÄí, kterou
věnoval umělec výzdobě knihy, a~ledabylostí, s~jakou ji tiskárna zhotovila.
Bývá to podivná harmonie: výzdoba umělecká a~sazba i~tisk jako denních
novin. Nejsou to malé závody, jichž výrobkům lze vytknouti tuto řemeslnou
-chybu, i~pÅ™ední veliké tiskárny zhotovují takto >>krásné<< knihy. StaÄí
-prohlédnouti si podrobnÄ›ji reprodukce v~tomto díle, abychom se pÅ™esvÄ›dÄili,
-že to tvrzení není přehnané.
+chybu, i~přední veliké tiskárny zhotovují takto \quotation{krásné} knihy.
+StaÄí prohlédnouti si podrobnÄ›ji reprodukce v~tomto díle, abychom se
+pÅ™esvÄ›dÄili, že to tvrzení není pÅ™ehnané.
PÅ™ece vÅ¡ak lze pozorovati potěšitelný obrat k~lepšímu: nÄ›které Äeské
knihtiskárny se chlubí už správně vysazenými a~dobře vytištěnými knihami.
diff --git a/Master/texmf-dist/tex/context/sample/third/hviezdoslav-sk.tex b/Master/texmf-dist/tex/context/sample/third/hviezdoslav-sk.tex
new file mode 100644
index 00000000000..7c448241702
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/third/hviezdoslav-sk.tex
@@ -0,0 +1,39 @@
+Pozdravujem vás, lesy, hory,
+z tej duše pozdravujem vás!
+Čo mrcha svet v nás skvári, zmorí,
+zrak jeho urknul, zmámila
+lož, ohlušila presila:
+vy k žitiu privediete zas,
+vy vzkriesite, vy zotavíte,
+z jatrivých vylieÄite rán,
+v opravdu priamom, bratskom cite
+otvoriac lono dokorán,
+a srdeÄnosÅ¥ kde odveká,
+kde nikdy nevyspela zrada,
+bez dotazu, kto on, Äo hľadá,
+na lono to, hľa, v objem sladký
+ramenom láskyplnej matky
+pritúliac verne Äloveka\dots
+Len okamih tam pobudnutia:
+už mŕtvie bôľ, už slabnú putá,
+zrak Äistí sa, tlak voľneje,
+i oživujú nádeje;
+len jeden pokyn, zášum lesný,
+len jeden horskej riavy skok:
+a duša už sa ladí k piesni,
+tkne sa jej biÄík preÄudesný --
+a srdce hupká vozvysok;
+len jedno orla skolotanie,
+len jeden Å¡vihot sokola,
+prez horu mužné zahvízdanie,
+na holiach jeden záblesk vatry:
+a nás už chváce povoľa,
+duch už sa zažal, už sa jatrí,
+plamenným krídlom šibe hor’,
+jak v nebo naspäť meteor;
+len chvíľka, ako vzdušný vlas
+Äo preletí nám ponad hlavu --
+a už ju máme, myseľ hravú:
+zmladenej duše prez dúbravu
+tak strie sa, ako dúhy pás\dots
+\dots Z tej duše pozdravujem vás!
diff --git a/Master/texmf-dist/tex/context/sample/third/hviezdoslav-vlnka-sk.tex b/Master/texmf-dist/tex/context/sample/third/hviezdoslav-vlnka-sk.tex
new file mode 100644
index 00000000000..5602be70f40
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/third/hviezdoslav-vlnka-sk.tex
@@ -0,0 +1,39 @@
+Pozdravujem vás, lesy, hory,
+z~tej duše pozdravujem vás!
+Čo mrcha svet v~nás skvári, zmorí,
+zrak jeho urknul, zmámila
+lož, ohlušila presila:
+vy k~žitiu privediete zas,
+vy vzkriesite, vy zotavíte,
+z~jatrivých vylieÄite rán,
+v~opravdu priamom, bratskom cite
+otvoriac lono dokorán,
+a~srdeÄnosÅ¥ kde odveká,
+kde nikdy nevyspela zrada,
+bez dotazu, kto on, Äo hľadá,
+na lono to, hľa, v~objem sladký
+ramenom láskyplnej matky
+pritúliac verne Äloveka\dots
+Len okamih tam pobudnutia:
+už mŕtvie bôľ, už slabnú putá,
+zrak Äistí sa, tlak voľneje,
+i~oživujú nádeje;
+len jeden pokyn, zášum lesný,
+len jeden horskej riavy skok:
+a~duša už sa ladí k~piesni,
+tkne sa jej biÄík preÄudesný --
+a~srdce hupká vozvysok;
+len jedno orla skolotanie,
+len jeden Å¡vihot sokola,
+prez horu mužné zahvízdanie,
+na holiach jeden záblesk vatry:
+a~nás už chváce povoľa,
+duch už sa zažal, už sa jatrí,
+plamenným krídlom šibe hor’,
+jak v~nebo naspäť meteor;
+len chvíľka, ako vzdušný vlas
+Äo preletí nám ponad hlavu --
+a~už ju máme, myseľ hravú:
+zmladenej duše prez dúbravu
+tak strie sa, ako dúhy pás\dots
+\dots Z~tej duše pozdravujem vás!
diff --git a/Master/texmf-dist/tex/context/sample/third/jaros-sk.tex b/Master/texmf-dist/tex/context/sample/third/jaros-sk.tex
new file mode 100644
index 00000000000..bd2952501a5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/third/jaros-sk.tex
@@ -0,0 +1,5 @@
+Ja viem preÄo si ty tak zrazu ochorel, na spoveÄ sa ti nechce! ÄŒi chce alebo
+nie, to je teraz vedľajÅ¡ie. Sama vidíš, že kľaÄaÅ¥ nemôžem \dots -- Hanbu ti
+do kostola robiÅ¥ nepôjdem, eÅ¡te by som niekoho postojaÄky urazil \dots -- A
+s kým pôjdem na spoveÄ, vari sama? -- KeÄ nemáš s kým ísÅ¥, zober si psa. Aj
+jemu sa možno treba vyspovedať. Nebreše, beťár, ako treba \dots
diff --git a/Master/texmf-dist/tex/context/sample/third/jaros-vlnka-sk.tex b/Master/texmf-dist/tex/context/sample/third/jaros-vlnka-sk.tex
new file mode 100644
index 00000000000..ea564c3ded4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/third/jaros-vlnka-sk.tex
@@ -0,0 +1,5 @@
+Ja viem preÄo si ty tak zrazu ochorel, na spoveÄ sa ti nechce! ÄŒi chce alebo
+nie, to je teraz vedľajÅ¡ie. Sama vidíš, že kľaÄaÅ¥ nemôžem \dots -- Hanbu ti
+do kostola robiÅ¥ nepôjdem, eÅ¡te by som niekoho postojaÄky urazil \dots --
+A~s~kým pôjdem na spoveÄ, vari sama? -- KeÄ nemáš s~kým ísÅ¥, zober si psa. Aj
+jemu sa možno treba vyspovedať. Nebreše, beťár, ako treba \dots
diff --git a/Master/texmf-dist/tex/context/sample/third/kollar-cz.tex b/Master/texmf-dist/tex/context/sample/third/kollar-cz.tex
index 5a4f63695a9..7382dd10288 100644
--- a/Master/texmf-dist/tex/context/sample/third/kollar-cz.tex
+++ b/Master/texmf-dist/tex/context/sample/third/kollar-cz.tex
@@ -1,4 +1,3 @@
-
Aj zde leží zem ta před okem mým slzy ronícím,
někdy kolébka, nyní národu mého rakev.
Stoj noho! posvátná místa jsou, kamkoli kráÄíš,
diff --git a/Master/texmf-dist/tex/context/sample/third/komensky-cz.tex b/Master/texmf-dist/tex/context/sample/third/komensky-cz.tex
index f25bb47d970..96bfa609fb0 100644
--- a/Master/texmf-dist/tex/context/sample/third/komensky-cz.tex
+++ b/Master/texmf-dist/tex/context/sample/third/komensky-cz.tex
@@ -15,7 +15,7 @@ viděl, v levé ruce sázítko, pravou rukou vybírá (z přihrádek) literky a
skládá je do sázítka v slova: když naplní sloupec, přenáší je na desku.
Jakmile pak je naplnÄ›n poÄet sloupců pro jednu stranu archu, rozdÄ›lí je
příložkami, ováže je a stáhne železnými rámy, aby se nerozpadly; a tím se
-podle svého mínění sví povinnosti zhostil.
+podle svého mínění své povinnosti zhostil.
A tak tito vÅ¡ichni pracujíce vzájemnÄ› vykonávající jakoby hraÄkou
podivuhodné dílo, lidem kdysi nepochopitelné, jen když mají vÅ¡ichni to, Äeho
diff --git a/Master/texmf-dist/tex/context/sample/third/komensky-vlnka-cz.tex b/Master/texmf-dist/tex/context/sample/third/komensky-vlnka-cz.tex
index 17a2ab3f7a7..f9998f903b5 100644
--- a/Master/texmf-dist/tex/context/sample/third/komensky-vlnka-cz.tex
+++ b/Master/texmf-dist/tex/context/sample/third/komensky-vlnka-cz.tex
@@ -15,7 +15,7 @@ viděl, v~levé ruce sázítko, pravou rukou vybírá (z~přihrádek) literky
a~skládá je do sázítka v~slova: když naplní sloupec, přenáší je na desku.
Jakmile pak je naplnÄ›n poÄet sloupců pro jednu stranu archu, rozdÄ›lí je
příložkami, ováže je a~stáhne železnými rámy, aby se nerozpadly; a~tím se
-podle svého mínění sví povinnosti zhostil.
+podle svého mínění své povinnosti zhostil.
A~tak tito vÅ¡ichni pracujíce vzájemnÄ› vykonávající jakoby hraÄkou
podivuhodné dílo, lidem kdysi nepochopitelné, jen když mají vÅ¡ichni to, Äeho
diff --git a/Master/texmf-dist/tex/context/sample/third/slova-sk.tex b/Master/texmf-dist/tex/context/sample/third/slova-sk.tex
new file mode 100644
index 00000000000..83d48ade31e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/third/slova-sk.tex
@@ -0,0 +1,5 @@
+SlovenÄina má veľa pekných slov:
+Äateľ, kaÄa, ÄobaÅ¥, loÄka, ÄŽuro, habaÄúra, vľavo, Å¡pľachot, voľby, veľhad,
+veľký, veľmi, voľný , hobľovaÅ¥, Äatľov, ľudový, vľúdne, vyhĺbiÅ¥, tĺcÅ¥, vĺÄa,
+tĺÄik, tĺk, vĺn, vkĺzla, dĺžka, pĺž, vÅ•ba, kÅ•deľ, sÅ•dc, kÅ•miÅ¥, tÅ•nie, tŕň,
+šťava, beťár, šťuka.
diff --git a/Master/texmf-dist/tex/context/sample/third/smrek-sk.tex b/Master/texmf-dist/tex/context/sample/third/smrek-sk.tex
new file mode 100644
index 00000000000..29332cd8695
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/third/smrek-sk.tex
@@ -0,0 +1,40 @@
+Hľa, všetko pokrýva sneh rúškom zimy;
+ženy a panny svieže, rudolíce
+sa vyrojili hluÄné na ulice;
+ja hľadám jednu medzi tisícimi \dots
+
+\dots
+
+Celý svet miluje a vzýva ženu.
+Lež básnik nadovšetko. Dante božský
+i v pekle Beatricu svoju hľadal,
+o Sandovej zas Musset verše skladal
+a Verlaine ospevoval ženské bozky \dots
+
+\quotation{No, hľaÄme, vy už k bozkom veslujete!}
+
+Nie pani, to tak prišlo samo sebou.
+A i tak, bozk je vecou veľkolepou!
+PreÄo mu vyhýbaÅ¥ v tom chladnom svete?
+Rty vaše, pani \dots Lež, ach -- odpustite!
+Nálada táto zimná rozmar tvorí.
+Len Å¡koda, že ten veÄer je tak skorý \dots
+Lež preÄo hľadíte tak rozpaÄite?
+
+\quotation{Rozmýšľam práve, Äi by prijali ste,
+keby vás pozvala aspoň k Äaju.
+VeÄ sa už vÅ¡etci z parku rozchádzajú.
+Kontúry mesta sú už veľmi hmlisté.}
+
+Vidíte, i tak by šiel možno s vami
+a neÄakal by ani na pozvanie.
+Darmo, z vás žien vždy príťažlivosť vanie.
+Ja vzbĺknem pri ženách jak otep slamy.
+
+\dots
+
+Som iba básnik, Älovek nepraktický,
+parazit sÅ•dc, Äo Å¡Å¥astie loví vždycky,
+ale sám záruk šťastia sotva dáva.
+
+\dots
diff --git a/Master/texmf-dist/tex/context/sample/third/smrek-vlnka-sk.tex b/Master/texmf-dist/tex/context/sample/third/smrek-vlnka-sk.tex
new file mode 100644
index 00000000000..eab79aa79d4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/third/smrek-vlnka-sk.tex
@@ -0,0 +1,40 @@
+Hľa, všetko pokrýva sneh rúškom zimy;
+ženy a~panny svieže, rudolíce
+sa vyrojili hluÄné na ulice;
+ja hľadám jednu medzi tisícimi \dots
+
+\dots
+
+Celý svet miluje a~vzýva ženu.
+Lež básnik nadovšetko. Dante božský
+i~v~pekle Beatricu svoju hľadal,
+o~Sandovej zas Musset verše skladal
+a~Verlaine ospevoval ženské bozky \dots
+
+\quotation{No, hľaÄme, vy už k~bozkom veslujete!}
+
+Nie pani, to tak prišlo samo sebou.
+A~i~tak, bozk je vecou veľkolepou!
+PreÄo mu vyhýbaÅ¥ v~tom chladnom svete?
+Rty vaše, pani \dots Lež, ach -- odpustite!
+Nálada táto zimná rozmar tvorí.
+Len Å¡koda, že ten veÄer je tak skorý \dots
+Lež preÄo hľadíte tak rozpaÄite?
+
+\quotation{Rozmýšľam práve, Äi by prijali ste,
+keby vás pozvala aspoň k~Äaju.
+VeÄ sa už vÅ¡etci z~parku rozchádzajú.
+Kontúry mesta sú už veľmi hmlisté.}
+
+Vidíte, i~tak by šiel možno s~vami
+a~neÄakal by ani na pozvanie.
+Darmo, z~vás žien vždy príťažlivosť vanie.
+Ja vzbĺknem pri ženách jak otep slamy.
+
+\dots
+
+Som iba básnik, Älovek nepraktický,
+parazit sÅ•dc, Äo Å¡Å¥astie loví vždycky,
+ale sám záruk šťastia sotva dáva.
+
+\dots
diff --git a/Master/texmf-dist/tex/context/test/mkiv/pdf-a1a-2005.mkiv b/Master/texmf-dist/tex/context/test/mkiv/pdf-a1a-2005.mkiv
index 90ac0c2420d..ec767bf829c 100644
--- a/Master/texmf-dist/tex/context/test/mkiv/pdf-a1a-2005.mkiv
+++ b/Master/texmf-dist/tex/context/test/mkiv/pdf-a1a-2005.mkiv
@@ -1,6 +1,6 @@
% PDF/A-1a:2005
-\enabletrackers[structure.tags,backend.tags]
+\enabletrackers[structure.tags,backend.tags,backend.xmp]
\setupbackend
[format=PDF/A-1a:2005,
@@ -13,17 +13,19 @@
\setupcolors[cmyk=no]
\definecolor[rgbblack][b=0.01]
-\definecolor[transtest][r=1,g=1,t=.5]
+\definecolor[transtest][r=1,g=1,t=0.25]% transparency is not allowed
\placebookmarks[chapter][all][force=yes]
+
+
\starttext
\starttextcolor[rgbblack]
\startchapter[title=aa,bookmark=bb,list=cc,marking=dd]
-Test it
+Test for PDF/A-1a:2005
\stopchapter
diff --git a/Master/texmf-dist/tex/context/test/mkiv/pdf-a1b-2005.mkiv b/Master/texmf-dist/tex/context/test/mkiv/pdf-a1b-2005.mkiv
index f23942a97e0..4df15a13f6b 100644
--- a/Master/texmf-dist/tex/context/test/mkiv/pdf-a1b-2005.mkiv
+++ b/Master/texmf-dist/tex/context/test/mkiv/pdf-a1b-2005.mkiv
@@ -1,6 +1,6 @@
% PDF/A-1b:2005
-\enabletrackers[structure.tags,backend.tags,backend.xmp]
+\enabletrackers[backend.xmp]
\setupbackend
[format=PDF/A-1b:2005,
@@ -9,21 +9,20 @@
% profile={sRGB.icc,default_gray.icc}]
level=0]
-\setuptagging[state=start] % needed even for 'b'-version
-
\setupcolors[cmyk=no]
\definecolor[rgbblack][b=0.01]
-\definecolor[transtest][r=1,g=1,t=.5]
+\definecolor[transtest][r=1,g=1,t=.25]% transparency is not allowed
+
+
\starttext
\starttextcolor[rgbblack] % forced /DeviceGray causes problems; we need a trigger
-Text is needed, otherwise tagging base entries are not applied.
+Test for PDF/A-1b:2005
\stoptextcolor
-%\startTEXpage
\hbox\bgroup
\blackrule[width=1cm,height=1cm,color=red]
\blackrule[width=1cm,height=1cm,color=green]
@@ -32,6 +31,5 @@ Text is needed, otherwise tagging base entries are not applied.
\blackrule[width=1cm,height=1cm,color=transtest]\hskip-.5cm
\blackrule[width=1cm,height=1cm,color=transtest]
\egroup
-%\stopTEXpage
\stoptext
diff --git a/Master/texmf-dist/tex/context/test/mkiv/pdf-a2a.mkiv b/Master/texmf-dist/tex/context/test/mkiv/pdf-a2a.mkiv
index a0e181e6906..cf609dc75df 100644
--- a/Master/texmf-dist/tex/context/test/mkiv/pdf-a2a.mkiv
+++ b/Master/texmf-dist/tex/context/test/mkiv/pdf-a2a.mkiv
@@ -1,6 +1,6 @@
% PDF/A-2a
-\enabletrackers[structure.tags,backend.tags]
+\enabletrackers[structure.tags,backend.tags,backend.xmp]
\setupbackend
[format=PDF/A-2a,
@@ -10,19 +10,24 @@
\setuptagging[state=start]
+\setupinteraction[state=start]% needed for attachment
+%\setupattachment[method=hidden]
+
\setupcolors[cmyk=no]
\definecolor[rgbblack][b=0.01]
-\definecolor[transtest][r=1,g=1,t=.5]
+\definecolor[transtest][r=1,g=1,t=.25]
\placebookmarks[chapter][all][force=yes]
+
+
\starttext
\starttextcolor[rgbblack]
\startchapter[title=aa,bookmark=bb,list=cc,marking=dd]
-Test it
+Test for PDF/A-2a
\stopchapter
@@ -37,4 +42,9 @@ Test it
\blackrule[width=1cm,height=1cm,color=transtest]
\egroup
+
+% inclusion of PDF/A is allowed; TODO: test if ANY version (even newer) is allowed
+%\attachment[file={attachment_pdf-a1a-2005.pdf}, type={application/pdf}]
+\attachment[file={attachment_pdf-a1b-2005.pdf}, type={application/pdf}]
+
\stoptext
diff --git a/Master/texmf-dist/tex/context/test/mkiv/pdf-a2b.mkiv b/Master/texmf-dist/tex/context/test/mkiv/pdf-a2b.mkiv
new file mode 100644
index 00000000000..d51d83025a1
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/mkiv/pdf-a2b.mkiv
@@ -0,0 +1,48 @@
+% PDF/A-2b
+
+\enabletrackers[backend.xmp]
+
+\setupbackend
+ [format=PDF/A-2b,
+ intent=sRGB IEC61966-2.1, % use <info> entry here; otherwise problems with predefined default profile
+ profile={sRGB.icc,default_gray.icc},
+ level=0]
+
+\setupinteraction[state=start]% needed for attachment
+%\setupattachment[method=hidden]
+
+\setupcolors[cmyk=no]
+\definecolor[rgbblack][b=0.01]
+\definecolor[transtest][r=1,g=1,t=.25]
+
+\placebookmarks[chapter][all][force=yes]
+
+
+
+\starttext
+
+\starttextcolor[rgbblack]
+
+\startchapter[title=aa,bookmark=bb,list=cc,marking=dd]
+
+Test for PDF/A-2b
+
+\stopchapter
+
+\stoptextcolor
+
+\hbox\bgroup
+ \blackrule[width=1cm,height=1cm,color=red]
+ \blackrule[width=1cm,height=1cm,color=green]
+ \blackrule[width=1cm,height=1cm,color=blue]
+ \blackrule[width=1cm,height=1cm,color=rgbblack]
+ \blackrule[width=1cm,height=1cm,color=transtest]\hskip-.5cm
+ \blackrule[width=1cm,height=1cm,color=transtest]
+\egroup
+
+
+% inclusion of PDF/A is allowed; TODO: test if ANY version (even newer) is allowed
+\attachment[file={attachment_pdf-a1a-2005.pdf}, type={application/pdf}]
+%\attachment[file={attachment_pdf-a1b-2005.pdf}, type={application/pdf}]
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/test/mkiv/pdf-a2u.mkiv b/Master/texmf-dist/tex/context/test/mkiv/pdf-a2u.mkiv
new file mode 100644
index 00000000000..4ea175df104
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/mkiv/pdf-a2u.mkiv
@@ -0,0 +1,48 @@
+% PDF/A-2u
+
+\enabletrackers[backend.xmp]
+
+\setupbackend
+ [format=PDF/A-2u,
+ intent=sRGB IEC61966-2.1, % use <info> entry here; otherwise problems with predefined default profile
+ profile={sRGB.icc,default_gray.icc},
+ level=0]
+
+\setupinteraction[state=start]% needed for attachment
+%\setupattachment[method=hidden]
+
+\setupcolors[cmyk=no]
+\definecolor[rgbblack][b=0.01]
+\definecolor[transtest][r=1,g=1,t=.25]
+
+\placebookmarks[chapter][all][force=yes]
+
+
+
+\starttext
+
+\starttextcolor[rgbblack]
+
+\startchapter[title=aa,bookmark=bb,list=cc,marking=dd]
+
+Test for PDF/A-2u
+
+\stopchapter
+
+\stoptextcolor
+
+\hbox\bgroup
+ \blackrule[width=1cm,height=1cm,color=red]
+ \blackrule[width=1cm,height=1cm,color=green]
+ \blackrule[width=1cm,height=1cm,color=blue]
+ \blackrule[width=1cm,height=1cm,color=rgbblack]
+ \blackrule[width=1cm,height=1cm,color=transtest]\hskip-.5cm
+ \blackrule[width=1cm,height=1cm,color=transtest]
+\egroup
+
+
+% inclusion of PDF/A is allowed; TODO: test if ANY version (even newer) is allowed
+\attachment[file={attachment_pdf-a1a-2005.pdf}, type={application/pdf}]
+%\attachment[file={attachment_pdf-a1b-2005.pdf}, type={application/pdf}]
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/test/mkiv/pdf-a3a.mkiv b/Master/texmf-dist/tex/context/test/mkiv/pdf-a3a.mkiv
index 7efb28e3cb5..0013d7a3600 100644
--- a/Master/texmf-dist/tex/context/test/mkiv/pdf-a3a.mkiv
+++ b/Master/texmf-dist/tex/context/test/mkiv/pdf-a3a.mkiv
@@ -1,9 +1,6 @@
% PDF/A-3a
-\nopdfcompression
-
-
-\enabletrackers[structure.tags,backend.tags]
+\enabletrackers[structure.tags,backend.tags,backend.xmp]
\setupbackend
[format=PDF/A-3a,
@@ -13,19 +10,24 @@
\setuptagging[state=start]
+\setupinteraction[state=start]% needed for attachment
+%\setupattachment[method=hidden]
+
\setupcolors[cmyk=no]
\definecolor[rgbblack][b=0.01]
-\definecolor[transtest][r=1,g=1,t=.5]
+\definecolor[transtest][r=1,g=1,t=.25]
\placebookmarks[chapter][all][force=yes]
+
+
\starttext
\starttextcolor[rgbblack]
\startchapter[title=aa,bookmark=bb,list=cc,marking=dd]
-Test it
+Test for PDF/A-3a
\stopchapter
@@ -40,4 +42,8 @@ Test it
\blackrule[width=1cm,height=1cm,color=transtest]
\egroup
+
+% inclusion of any file type is allowed
+\attachment[file=cow.pdf, type={application/pdf}]
+
\stoptext
diff --git a/Master/texmf-dist/tex/context/test/mkiv/pdf-a3b.mkiv b/Master/texmf-dist/tex/context/test/mkiv/pdf-a3b.mkiv
new file mode 100644
index 00000000000..2e1d8bbbb31
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/mkiv/pdf-a3b.mkiv
@@ -0,0 +1,47 @@
+% PDF/A-3b
+
+\enabletrackers[backend.xmp]
+
+\setupbackend
+ [format=PDF/A-3b,
+ intent=sRGB IEC61966-2.1, % use <info> entry here; otherwise problems with predefined default profile
+ profile={sRGB.icc,default_gray.icc},
+ level=0]
+
+\setupinteraction[state=start]% needed for attachment
+%\setupattachment[method=hidden]
+
+\setupcolors[cmyk=no]
+\definecolor[rgbblack][b=0.01]
+\definecolor[transtest][r=1,g=1,t=.25]
+
+\placebookmarks[chapter][all][force=yes]
+
+
+
+\starttext
+
+\starttextcolor[rgbblack]
+
+\startchapter[title=aa,bookmark=bb,list=cc,marking=dd]
+
+Test for PDF/A-3b
+
+\stopchapter
+
+\stoptextcolor
+
+\hbox\bgroup
+ \blackrule[width=1cm,height=1cm,color=red]
+ \blackrule[width=1cm,height=1cm,color=green]
+ \blackrule[width=1cm,height=1cm,color=blue]
+ \blackrule[width=1cm,height=1cm,color=rgbblack]
+ \blackrule[width=1cm,height=1cm,color=transtest]\hskip-.5cm
+ \blackrule[width=1cm,height=1cm,color=transtest]
+\egroup
+
+
+% inclusion of any file type is allowed
+\attachment[file=cow.pdf, type={application/pdf}]
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/test/mkiv/pdf-a3u.mkiv b/Master/texmf-dist/tex/context/test/mkiv/pdf-a3u.mkiv
new file mode 100644
index 00000000000..17112b54212
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/mkiv/pdf-a3u.mkiv
@@ -0,0 +1,47 @@
+% PDF/A-3u
+
+\enabletrackers[backend.xmp]
+
+\setupbackend
+ [format=PDF/A-3u,
+ intent=sRGB IEC61966-2.1, % use <info> entry here; otherwise problems with predefined default profile
+ profile={sRGB.icc,default_gray.icc},
+ level=0]
+
+\setupinteraction[state=start]% needed for attachment
+%\setupattachment[method=hidden]
+
+\setupcolors[cmyk=no]
+\definecolor[rgbblack][b=0.01]
+\definecolor[transtest][r=1,g=1,t=.25]
+
+\placebookmarks[chapter][all][force=yes]
+
+
+
+\starttext
+
+\starttextcolor[rgbblack]
+
+\startchapter[title=aa,bookmark=bb,list=cc,marking=dd]
+
+Test for PDF/A-3u
+
+\stopchapter
+
+\stoptextcolor
+
+\hbox\bgroup
+ \blackrule[width=1cm,height=1cm,color=red]
+ \blackrule[width=1cm,height=1cm,color=green]
+ \blackrule[width=1cm,height=1cm,color=blue]
+ \blackrule[width=1cm,height=1cm,color=rgbblack]
+ \blackrule[width=1cm,height=1cm,color=transtest]\hskip-.5cm
+ \blackrule[width=1cm,height=1cm,color=transtest]
+\egroup
+
+
+% inclusion of any file type is allowed
+\attachment[file=cow.pdf, type={application/pdf}]
+
+\stoptext
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-chr.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-chr.lua
index 14a55d7b011..0ac0eab14e1 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-chr.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-chr.lua
@@ -1,4 +1,4 @@
--- automatically generated from context data
+-- automatically generated from context data (luatex-basics-prepare.tex)
characters = characters or { }
@@ -446,7 +446,6 @@ characters.classifiers={
[1803]=6,
[1804]=6,
[1805]=6,
- [1807]=6,
[1808]=3,
[1809]=5,
[1810]=2,
@@ -627,6 +626,9 @@ characters.classifiers={
[2040]=6,
[2041]=6,
[2042]=2,
+ [2045]=5,
+ [2046]=6,
+ [2047]=6,
[2070]=5,
[2071]=5,
[2072]=5,
@@ -716,6 +718,7 @@ characters.classifiers={
[2235]=2,
[2236]=2,
[2237]=2,
+ [2259]=5,
[2260]=5,
[2261]=5,
[2262]=5,
@@ -792,6 +795,7 @@ characters.classifiers={
[2509]=5,
[2530]=5,
[2531]=5,
+ [2558]=5,
[2561]=5,
[2562]=5,
[2620]=5,
@@ -840,6 +844,7 @@ characters.classifiers={
[3008]=5,
[3021]=5,
[3072]=5,
+ [3076]=5,
[3134]=5,
[3135]=5,
[3136]=5,
@@ -901,6 +906,7 @@ characters.classifiers={
[3767]=5,
[3768]=5,
[3769]=5,
+ [3770]=5,
[3771]=5,
[3772]=5,
[3784]=5,
@@ -1139,6 +1145,7 @@ characters.classifiers={
[6261]=2,
[6262]=2,
[6263]=2,
+ [6264]=2,
[6272]=4,
[6273]=4,
[6274]=4,
@@ -1539,6 +1546,7 @@ characters.classifiers={
[43247]=5,
[43248]=5,
[43249]=5,
+ [43263]=5,
[43302]=5,
[43303]=5,
[43304]=5,
@@ -1702,6 +1710,83 @@ characters.classifiers={
[68525]=2,
[68526]=2,
[68527]=4,
+ [68864]=1,
+ [68865]=2,
+ [68866]=2,
+ [68867]=2,
+ [68868]=2,
+ [68869]=2,
+ [68870]=2,
+ [68871]=2,
+ [68872]=2,
+ [68873]=2,
+ [68874]=2,
+ [68875]=2,
+ [68876]=2,
+ [68877]=2,
+ [68878]=2,
+ [68879]=2,
+ [68880]=2,
+ [68881]=2,
+ [68882]=2,
+ [68883]=2,
+ [68884]=2,
+ [68885]=2,
+ [68886]=2,
+ [68887]=2,
+ [68888]=2,
+ [68889]=2,
+ [68890]=2,
+ [68891]=2,
+ [68892]=2,
+ [68893]=2,
+ [68894]=2,
+ [68895]=2,
+ [68896]=2,
+ [68897]=2,
+ [68898]=3,
+ [68899]=2,
+ [68900]=5,
+ [68901]=5,
+ [68902]=5,
+ [68903]=5,
+ [69424]=2,
+ [69425]=2,
+ [69426]=2,
+ [69427]=3,
+ [69428]=2,
+ [69429]=2,
+ [69430]=2,
+ [69431]=2,
+ [69432]=2,
+ [69433]=2,
+ [69434]=2,
+ [69435]=2,
+ [69436]=2,
+ [69437]=2,
+ [69438]=2,
+ [69439]=2,
+ [69440]=2,
+ [69441]=2,
+ [69442]=2,
+ [69443]=2,
+ [69444]=2,
+ [69445]=4,
+ [69446]=5,
+ [69447]=5,
+ [69448]=5,
+ [69449]=5,
+ [69450]=5,
+ [69451]=5,
+ [69452]=5,
+ [69453]=5,
+ [69454]=5,
+ [69455]=5,
+ [69456]=5,
+ [69457]=2,
+ [69458]=2,
+ [69459]=2,
+ [69460]=3,
[69633]=5,
[69688]=5,
[69689]=5,
@@ -1727,6 +1812,8 @@ characters.classifiers={
[69814]=5,
[69817]=5,
[69818]=5,
+ [69821]=4,
+ [69837]=4,
[69888]=5,
[69889]=5,
[69890]=5,
@@ -1776,6 +1863,7 @@ characters.classifiers={
[70378]=5,
[70400]=5,
[70401]=5,
+ [70459]=5,
[70460]=5,
[70464]=5,
[70502]=5,
@@ -1802,6 +1890,7 @@ characters.classifiers={
[70723]=5,
[70724]=5,
[70726]=5,
+ [70750]=5,
[70835]=5,
[70836]=5,
[70837]=5,
@@ -1855,6 +1944,24 @@ characters.classifiers={
[71465]=5,
[71466]=5,
[71467]=5,
+ [71727]=5,
+ [71728]=5,
+ [71729]=5,
+ [71730]=5,
+ [71731]=5,
+ [71732]=5,
+ [71733]=5,
+ [71734]=5,
+ [71735]=5,
+ [71737]=5,
+ [71738]=5,
+ [72148]=5,
+ [72149]=5,
+ [72150]=5,
+ [72151]=5,
+ [72154]=5,
+ [72155]=5,
+ [72160]=5,
[72193]=5,
[72194]=5,
[72195]=5,
@@ -1962,6 +2069,12 @@ characters.classifiers={
[73028]=5,
[73029]=5,
[73031]=5,
+ [73104]=5,
+ [73105]=5,
+ [73109]=5,
+ [73111]=5,
+ [73459]=5,
+ [73460]=5,
[92912]=5,
[92913]=5,
[92914]=5,
@@ -1974,6 +2087,7 @@ characters.classifiers={
[92980]=5,
[92981]=5,
[92982]=5,
+ [94031]=5,
[94095]=5,
[94096]=5,
[94097]=5,
@@ -2170,6 +2284,17 @@ characters.classifiers={
[122920]=5,
[122921]=5,
[122922]=5,
+ [123184]=5,
+ [123185]=5,
+ [123186]=5,
+ [123187]=5,
+ [123188]=5,
+ [123189]=5,
+ [123190]=5,
+ [123628]=5,
+ [123629]=5,
+ [123630]=5,
+ [123631]=5,
[125136]=5,
[125137]=5,
[125138]=5,
@@ -2273,6 +2398,7 @@ characters.indicgroups={
[2632]=true,
[2635]=true,
[2636]=true,
+ [2690]=true,
[2757]=true,
[2759]=true,
[2760]=true,
@@ -2284,7 +2410,6 @@ characters.indicgroups={
[3136]=true,
[3142]=true,
[3143]=true,
- [3144]=true,
[3146]=true,
[3147]=true,
[3148]=true,
@@ -2292,6 +2417,21 @@ characters.indicgroups={
[3263]=true,
[3270]=true,
[3406]=true,
+ [4141]=true,
+ [4142]=true,
+ [4146]=true,
+ [4147]=true,
+ [4148]=true,
+ [4149]=true,
+ [4150]=true,
+ [4154]=true,
+ [4209]=true,
+ [4210]=true,
+ [4211]=true,
+ [4212]=true,
+ [4229]=true,
+ [4230]=true,
+ [4253]=true,
[43232]=true,
[43233]=true,
[43234]=true,
@@ -2310,6 +2450,8 @@ characters.indicgroups={
[43247]=true,
[43248]=true,
[43249]=true,
+ [43493]=true,
+ [43644]=true,
},
["after_half"]={},
["after_main"]={
@@ -2331,6 +2473,7 @@ characters.indicgroups={
[2626]=true,
[2672]=true,
[2673]=true,
+ [2735]=true,
[2750]=true,
[2752]=true,
[2753]=true,
@@ -2494,10 +2637,24 @@ characters.indicgroups={
[3170]=true,
[3171]=true,
[3260]=true,
+ [3286]=true,
[3298]=true,
[3299]=true,
[3426]=true,
[3427]=true,
+ [4143]=true,
+ [4144]=true,
+ [4151]=true,
+ [4153]=true,
+ [4157]=true,
+ [4158]=true,
+ [4184]=true,
+ [4185]=true,
+ [4190]=true,
+ [4191]=true,
+ [4192]=true,
+ [4226]=true,
+ [4237]=true,
},
["consonant"]={
[2325]=true,
@@ -2827,6 +2984,117 @@ characters.indicgroups={
[3384]=true,
[3385]=true,
[3386]=true,
+ [4096]=true,
+ [4097]=true,
+ [4098]=true,
+ [4099]=true,
+ [4100]=true,
+ [4101]=true,
+ [4102]=true,
+ [4103]=true,
+ [4104]=true,
+ [4105]=true,
+ [4106]=true,
+ [4107]=true,
+ [4108]=true,
+ [4109]=true,
+ [4110]=true,
+ [4111]=true,
+ [4112]=true,
+ [4113]=true,
+ [4114]=true,
+ [4115]=true,
+ [4116]=true,
+ [4117]=true,
+ [4118]=true,
+ [4119]=true,
+ [4120]=true,
+ [4121]=true,
+ [4122]=true,
+ [4123]=true,
+ [4124]=true,
+ [4125]=true,
+ [4126]=true,
+ [4127]=true,
+ [4128]=true,
+ [4155]=true,
+ [4156]=true,
+ [4157]=true,
+ [4158]=true,
+ [4159]=true,
+ [4176]=true,
+ [4177]=true,
+ [4186]=true,
+ [4187]=true,
+ [4188]=true,
+ [4189]=true,
+ [4190]=true,
+ [4191]=true,
+ [4192]=true,
+ [4193]=true,
+ [4197]=true,
+ [4198]=true,
+ [4206]=true,
+ [4207]=true,
+ [4208]=true,
+ [4213]=true,
+ [4214]=true,
+ [4215]=true,
+ [4216]=true,
+ [4217]=true,
+ [4218]=true,
+ [4219]=true,
+ [4220]=true,
+ [4221]=true,
+ [4222]=true,
+ [4223]=true,
+ [4224]=true,
+ [4225]=true,
+ [4226]=true,
+ [4238]=true,
+ [43488]=true,
+ [43489]=true,
+ [43490]=true,
+ [43491]=true,
+ [43492]=true,
+ [43495]=true,
+ [43496]=true,
+ [43497]=true,
+ [43498]=true,
+ [43499]=true,
+ [43500]=true,
+ [43501]=true,
+ [43502]=true,
+ [43503]=true,
+ [43514]=true,
+ [43515]=true,
+ [43516]=true,
+ [43517]=true,
+ [43518]=true,
+ [43616]=true,
+ [43617]=true,
+ [43618]=true,
+ [43619]=true,
+ [43620]=true,
+ [43621]=true,
+ [43622]=true,
+ [43623]=true,
+ [43624]=true,
+ [43625]=true,
+ [43626]=true,
+ [43628]=true,
+ [43629]=true,
+ [43630]=true,
+ [43631]=true,
+ [43633]=true,
+ [43634]=true,
+ [43635]=true,
+ [43636]=true,
+ [43637]=true,
+ [43638]=true,
+ [43642]=true,
+ [43646]=true,
+ [43647]=true,
},
["dependent_vowel"]={
[2362]=true,
@@ -2855,13 +3123,14 @@ characters.indicgroups={
[2403]=true,
[2494]=true,
[2495]=true,
- [2496]=true,
[2497]=true,
[2498]=true,
[2499]=true,
[2500]=true,
[2503]=true,
[2504]=true,
+ [2507]=true,
+ [2508]=true,
[2622]=true,
[2623]=true,
[2624]=true,
@@ -2936,6 +3205,8 @@ characters.indicgroups={
[3274]=true,
[3275]=true,
[3276]=true,
+ [3285]=true,
+ [3286]=true,
[3298]=true,
[3299]=true,
[3390]=true,
@@ -2954,6 +3225,35 @@ characters.indicgroups={
[3415]=true,
[3426]=true,
[3427]=true,
+ [4139]=true,
+ [4140]=true,
+ [4141]=true,
+ [4142]=true,
+ [4143]=true,
+ [4144]=true,
+ [4145]=true,
+ [4146]=true,
+ [4147]=true,
+ [4148]=true,
+ [4149]=true,
+ [4182]=true,
+ [4183]=true,
+ [4184]=true,
+ [4185]=true,
+ [4194]=true,
+ [4199]=true,
+ [4200]=true,
+ [4209]=true,
+ [4210]=true,
+ [4211]=true,
+ [4212]=true,
+ [4227]=true,
+ [4228]=true,
+ [4229]=true,
+ [4230]=true,
+ [4252]=true,
+ [4253]=true,
+ [43493]=true,
},
["halant"]={
[2381]=true,
@@ -3111,6 +3411,20 @@ characters.indicgroups={
[3423]=true,
[3424]=true,
[3425]=true,
+ [4129]=true,
+ [4130]=true,
+ [4131]=true,
+ [4132]=true,
+ [4133]=true,
+ [4134]=true,
+ [4135]=true,
+ [4136]=true,
+ [4137]=true,
+ [4138]=true,
+ [4178]=true,
+ [4179]=true,
+ [4180]=true,
+ [4181]=true,
},
["nukta"]={
[2364]=true,
@@ -3132,8 +3446,6 @@ characters.indicgroups={
[2383]=true,
[2494]=true,
[2496]=true,
- [2503]=true,
- [2504]=true,
[2622]=true,
[2624]=true,
[2750]=true,
@@ -3150,16 +3462,12 @@ characters.indicgroups={
[3139]=true,
[3140]=true,
[3262]=true,
- [3264]=true,
[3265]=true,
[3266]=true,
[3267]=true,
[3268]=true,
- [3271]=true,
- [3272]=true,
- [3274]=true,
- [3275]=true,
[3276]=true,
+ [3285]=true,
[3390]=true,
[3391]=true,
[3392]=true,
@@ -3168,25 +3476,58 @@ characters.indicgroups={
[3395]=true,
[3396]=true,
[3415]=true,
+ [4139]=true,
+ [4140]=true,
+ [4152]=true,
+ [4155]=true,
+ [4182]=true,
+ [4183]=true,
+ [4194]=true,
+ [4195]=true,
+ [4196]=true,
+ [4199]=true,
+ [4200]=true,
+ [4201]=true,
+ [4202]=true,
+ [4203]=true,
+ [4204]=true,
+ [4205]=true,
+ [4227]=true,
+ [4231]=true,
+ [4232]=true,
+ [4233]=true,
+ [4234]=true,
+ [4235]=true,
+ [4236]=true,
+ [4239]=true,
+ [4250]=true,
+ [4251]=true,
+ [4252]=true,
+ [43643]=true,
+ [43645]=true,
},
["pre_mark"]={
[2367]=true,
[2382]=true,
[2495]=true,
+ [2503]=true,
+ [2504]=true,
[2623]=true,
[2751]=true,
[2887]=true,
- [2888]=true,
[3014]=true,
[3015]=true,
[3016]=true,
[3398]=true,
[3399]=true,
[3400]=true,
+ [4145]=true,
+ [4228]=true,
},
["ra"]={
[2352]=true,
[2480]=true,
+ [2544]=true,
[2608]=true,
[2736]=true,
[2864]=true,
@@ -3200,17 +3541,43 @@ characters.indicgroups={
[2386]=true,
[2387]=true,
[2388]=true,
- [2507]=true,
- [2508]=true,
- [3277]=true,
- [3405]=true,
+ [4151]=true,
+ [4195]=true,
+ [4196]=true,
+ [4201]=true,
+ [4202]=true,
+ [4203]=true,
+ [4204]=true,
+ [4205]=true,
+ [4231]=true,
+ [4232]=true,
+ [4233]=true,
+ [4234]=true,
+ [4235]=true,
+ [4236]=true,
+ [4237]=true,
+ [4239]=true,
+ [4250]=true,
+ [4251]=true,
+ [43643]=true,
+ [43644]=true,
+ [43645]=true,
},
["twopart_mark"]={
+ [2507]={ 2503, 2494 },
+ [2508]={ 2503, 2519 },
+ [2888]={ 2887, 2902 },
[2891]={ 2887, 2878 },
[2892]={ 2887, 2903 },
[3018]={ 3014, 3006 },
[3019]={ 3015, 3006 },
[3020]={ 3014, 3031 },
+ [3144]={ 3142, 3158 },
+ [3264]={ 3263, 3285 },
+ [3271]={ 3270, 3285 },
+ [3272]={ 3270, 3286 },
+ [3274]={ 3270, 3266 },
+ [3275]={ 3274, 3285 },
[3402]={ 3398, 3390 },
[3403]={ 3399, 3390 },
[3404]={ 3398, 3415 },
@@ -3220,8 +3587,13 @@ characters.indicgroups={
[2305]=true,
[2306]=true,
[2307]=true,
+ [2433]=true,
[3330]=true,
[3331]=true,
+ [4150]=true,
+ [4152]=true,
+ [4153]=true,
+ [4154]=true,
[43232]=true,
[43233]=true,
[43234]=true,
@@ -3238,9 +3610,10 @@ characters.indicgroups={
[43245]=true,
[43246]=true,
[43247]=true,
- [43248]=true,
[43249]=true,
},
}
--- done
+-- done, uncomment for testing:
+
+-- return characters.indicgroups
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua
index 879da4bc792..be82277bd49 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-nod.lua
@@ -12,7 +12,7 @@ end
-- Don't depend on code here as it is only needed to complement the font handler
-- code. I will move some to another namespace as I don't see other macro packages
--- use the context logic. It's a subset anyway.
+-- use the context logic. It's a subset anyway. More will be stripped.
-- Attributes:
@@ -73,80 +73,12 @@ nodes.disccodes = disccodes
nodes.handlers.protectglyphs = node.protect_glyphs -- beware: nodes!
nodes.handlers.unprotectglyphs = node.unprotect_glyphs -- beware: nodes!
--- These are now gone in generic as they are context specific.
-
--- local flush_node = node.flush_node
--- local remove_node = node.remove
--- local traverse_id = node.traverse_id
---
--- function nodes.remove(head, current, free_too)
--- local t = current
--- head, current = remove_node(head,current)
--- if t then
--- if free_too then
--- flush_node(t)
--- t = nil
--- else
--- t.next, t.prev = nil, nil
--- end
--- end
--- return head, current, t
--- end
---
--- function nodes.delete(head,current)
--- return nodes.remove(head,current,true)
--- end
-
------ getfield = node.getfield
------ setfield = node.setfield
-
------.getfield = getfield
------.setfield = setfield
------.getattr = getfield
------.setattr = setfield
-
------.tostring = node.tostring or tostring
------.copy = node.copy
------.copy_node = node.copy
------.copy_list = node.copy_list
------.delete = node.delete
------.dimensions = node.dimensions
------.end_of_math = node.end_of_math
------.flush_list = node.flush_list
------.flush_node = node.flush_node
------.flush = node.flush_node
------.free = node.free
------.insert_after = node.insert_after
------.insert_before = node.insert_before
------.hpack = node.hpack
------.new = node.new
------.tail = node.tail
------.traverse = node.traverse
------.traverse_id = node.traverse_id
------.slide = node.slide
------.vpack = node.vpack
-
------.first_glyph = node.first_glyph
------.has_glyph = node.has_glyph or node.first_glyph
------.current_attr = node.current_attr
------.has_field = node.has_field
------.usedlist = node.usedlist
------.protrusion_skippable = node.protrusion_skippable
------.write = node.write
-
------.has_attribute = node.has_attribute
------.set_attribute = node.set_attribute
------.unset_attribute = node.unset_attribute
-
------.protect_glyphs = node.protect_glyphs
------.unprotect_glyphs = node.unprotect_glyphs
------.mlist_to_hlist = node.mlist_to_hlist
-
-- in generic code, at least for some time, we stay nodes, while in context
-- we can go nuts (e.g. experimental); this split permits us us keep code
-- used elsewhere stable but at the same time play around in context
--- much of this will go away
+-- much of this will go away .. it's part of the context interface and not
+-- officially in luatex-*.lua
local direct = node.direct
local nuts = { }
@@ -165,16 +97,13 @@ nuts.getattr = direct.get_attribute
nuts.getboth = direct.getboth
nuts.getchar = direct.getchar
nuts.getcomponents = direct.getcomponents
-----.getdepth = direct.getdepth
-----.getdir = direct.getdir
nuts.getdirection = direct.getdirection
nuts.getdisc = direct.getdisc
+nuts.getreplace = direct.getreplace
nuts.getfield = direct.getfield
nuts.getfont = direct.getfont
-----.getheight = direct.getheight
nuts.getid = direct.getid
nuts.getkern = direct.getkern
-----.getleader = direct.getleader
nuts.getlist = direct.getlist
nuts.getnext = direct.getnext
nuts.getoffsets = direct.getoffsets
@@ -185,15 +114,11 @@ nuts.setattr = direct.setfield
nuts.setboth = direct.setboth
nuts.setchar = direct.setchar
nuts.setcomponents = direct.setcomponents
-----.setdepth = direct.setdepth
-nuts.setdir = direct.setdir
nuts.setdirection = direct.setdirection
nuts.setdisc = direct.setdisc
+nuts.setreplace = direct.setreplace
nuts.setfield = setfield
-----.setfont = direct.setfont
-----.setheight = direct.setheight
nuts.setkern = direct.setkern
-----.setleader = direct.setleader
nuts.setlink = direct.setlink
nuts.setlist = direct.setlist
nuts.setnext = direct.setnext
@@ -203,8 +128,9 @@ nuts.setsplit = direct.setsplit
nuts.setsubtype = direct.setsubtype
nuts.setwidth = direct.setwidth
-nuts.is_char = direct.is_char
-nuts.is_glyph = direct.is_glyph
+nuts.getglyphdata = nuts.getattr
+nuts.setglyphdata = nuts.setattr
+
nuts.ischar = direct.is_char
nuts.isglyph = direct.is_glyph
@@ -230,26 +156,6 @@ nuts.traverse_char = direct.traverse_char
nuts.traverse_glyph = direct.traverse_glyph
nuts.traverse_id = direct.traverse_id
--- for now
-
-if not nuts.getdirection then
-
- local getdir = direct.getdir
-
- function nuts.getdirection(n)
- local d = getdir(n)
- if d == "TLT" then return 0
- elseif d == "TRT" then return 1
- elseif d == "+TLT" then return 0, false
- elseif d == "+TRT" then return 1, false
- elseif d == "-TLT" then return 0, true
- elseif d == "-TRT" then return 1, true
- else return 0
- end
- end
-
-end
-
-- properties as used in the (new) injector:
local propertydata = direct.get_properties_table()
@@ -357,3 +263,30 @@ do
}
end
+
+if not nuts.setreplace then
+
+ local getdisc = nuts.getdisc
+ local setfield = nuts.setfield
+
+ function nuts.getreplace(n)
+ local _, _, h, _, _, t = getdisc(n,true)
+ return h, t
+ end
+
+ function nuts.setreplace(n,h)
+ setfield(n,"replace",h)
+ end
+
+end
+
+do
+
+ local getsubtype = nuts.getsubtype
+
+ function nuts.start_of_par(n)
+ local s = getsubtype(n)
+ return s == 0 or s == 2 -- sorry, hardcoded, won't change anyway
+ end
+
+end
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-prepare.tex b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-prepare.tex
index 47eaa73416c..069f772f77c 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-prepare.tex
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-prepare.tex
@@ -15,7 +15,8 @@
%D is needed because we don't want to load the (mostly not used in generic) data
%D files.
-%D Indicorder is not yet filled in completely.
+%D Indicorder is not yet filled in completely. Some 'indic=m' are now 'indic=o'
+%D due to patches/analysis by Kai Eigner.
\startluacode
@@ -69,7 +70,7 @@ for k, c in next, chardata do
end
local template = string.formatters [ [[
--- automatically generated from context data
+-- automatically generated from context data (luatex-basics-prepare.tex)
characters = characters or { }
@@ -84,6 +85,8 @@ characters.blockrange = { }
%s
-- done
+
+return characters.indicgroups
]] ]
io.savedata("luatex-basics-chr.lua",template(
@@ -91,8 +94,33 @@ io.savedata("luatex-basics-chr.lua",template(
table.serialize(indicgroups,"characters.indicgroups")
))
+
+-- -- code for comparing patched tables (info we feed back in char-def.lua)
+
+-- local hans = table.load("t:/sources/luatex-basics-chr.lua")
+-- local kai = table.load("e:/tmp/indic/luatex-basics-chr.lua")
+--
+-- for name, h in table.sortedhash(hans) do
+-- for kk, vv in table.sortedhash(kai[name]) do
+-- if h[kk] ~= vv and vv then
+-- local _h = h[kk]
+-- local _k = vv
+-- if type(_h) ~= "table" or type(_k) ~= "table" or not table.identical(_h,_k) then
+-- print("what", name)
+-- print("index",kk)
+-- print("hex ",string.format("%04X",kk))
+-- print("hans ",h[kk])
+-- print("kai ", vv)
+-- print("")
+-- end
+-- end
+-- end
+-- end
+
\stopluacode
+
+
\startTEXpage[offset=10pt]
\tttf generated file: luatex-basics-chr.lua
\stopTEXpage
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-core.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-core.lua
index 6e1b31e9610..a0f46dd2ede 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-core.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-core.lua
@@ -1,13 +1,13 @@
--- luatex-core security and io overloads ...........
+-- luatex-core security and io overloads ..
-- if not modules then modules = { } end modules ['luatex-core'] = {
--- version = 1.080,
+-- version = 1.112,
-- comment = 'companion to luatex',
-- author = 'Hans Hagen & Luigi Scarso',
-- copyright = 'LuaTeX Development Team',
-- }
-LUATEXCOREVERSION = 1.080 -- we reflect the luatex version where changes happened
+LUATEXCOREVERSION = 1.112 -- we reflect the luatex version where changes happened
-- This file overloads some Lua functions. The readline variants provide the same
-- functionality as LuaTeX <= 1.04 and doing it this way permits us to keep the
@@ -16,125 +16,135 @@ LUATEXCOREVERSION = 1.080 -- we reflect the luatex version where changes happene
-- We test for functions already being defined so that we don't overload ones that
-- are provided in the startup script.
-local type, next, getmetatable, require = type, next, getmetatable, require
-local find, gsub, format = string.find, string.gsub, string.format
+local saferoption = status.safer_option
+local shellescape = status.shell_escape -- 0 (disabled) 1 (anything) 2 (restricted)
+local kpseused = status.kpse_used -- 0 1
-local io_open = io.open
-local io_popen = io.popen
-local io_lines = io.lines
+if kpseused == 1 then
-local fio_readline = fio.readline
-local fio_checkpermission = fio.checkpermission
-local fio_recordfilename = fio.recordfilename
+ local type = type
+ local gsub = string.gsub
+ local find = string.find
-local mt = getmetatable(io.stderr)
-local mt_lines = mt.lines
-local saferoption = status.safer_option
-local shellescape = status.shell_escape -- 0 (disabled) 1 (anything) 2 (restricted)
-local kpseused = status.kpse_used -- 0 1
+ local mt = getmetatable(io.stderr)
+ local mt_lines = mt.lines
-local write_nl = texio.write_nl
+ local kpse_checkpermission = kpse.check_permission
+ local kpse_recordinputfile = kpse.record_input_file
+ local kpse_recordoutputfile = kpse.record_output_file
-io.saved_lines = io_lines -- always readonly
-mt.saved_lines = mt_lines -- always readonly
+ local io_open = io.open
+ local io_popen = io.popen
+ local io_lines = io.lines
-local function luatex_io_open(name,how)
- if not how then
- how = 'r'
- end
- local f = io_open(name,how)
- if f then
- if type(how) == 'string' and find(how,'w') then
- fio_recordfilename(name,'w')
- else
- fio_recordfilename(name,'r')
+ local fio_readline = fio.readline
+
+ local write_nl = texio.write_nl
+
+ io.saved_lines = io_lines -- always readonly
+ mt.saved_lines = mt_lines -- always readonly
+
+ local function luatex_io_open(name,how)
+ if not how then
+ how = 'r'
+ end
+ local f = io_open(name,how)
+ if f then
+ if type(how) == 'string' and find(how,'w') then
+ kpse_recordoutputfile(name,'w')
+ else
+ kpse_recordinputfile(name,'r')
+ end
end
+ return f
end
- return f
-end
-local function luatex_io_open_readonly(name,how)
- if not how then
- how = 'r'
- else
- how = gsub(how,'[^rb]','')
- if how == '' then
+ local function luatex_io_open_readonly(name,how)
+ if not how then
how = 'r'
+ else
+ how = gsub(how,'[^rb]','')
+ if how == '' then
+ how = 'r'
+ end
end
+ local f = io_open(name,how)
+ if f then
+ fio_recordfilename(name,'r')
+ end
+ return f
end
- local f = io_open(name,how)
- if f then
- fio_recordfilename(name,'r')
- end
- return f
-end
-local function luatex_io_popen(name,...)
- local okay, found = fio_checkpermission(name)
- if okay and found then
- return io_popen(found,...)
+ local function luatex_io_popen(name,...)
+ local okay, found = kpse_checkpermission(name)
+ if okay and found then
+ return io_popen(found,...)
+ end
end
-end
--- local function luatex_io_lines(name,how)
--- if name then
--- local f = io_open(name,how or 'r')
--- if f then
--- return function()
--- return fio_readline(f)
--- end
--- end
--- else
--- return io_lines()
--- end
--- end
-
--- For some reason the gc doesn't kick in so we need to close explitly
--- so that the handle is flushed.
-
-local error, type = error, type
-
-local function luatex_io_lines(name,how)
- if type(name) == "string" then
- local f = io_open(name,how or 'r')
- if f then
- return function()
- local l = fio_readline(f)
- if not l then
- f:close()
+ -- local function luatex_io_lines(name,how)
+ -- if name then
+ -- local f = io_open(name,how or 'r')
+ -- if f then
+ -- return function()
+ -- return fio_readline(f)
+ -- end
+ -- end
+ -- else
+ -- return io_lines()
+ -- end
+ -- end
+
+ -- For some reason the gc doesn't kick in so we need to close explicitly
+ -- so that the handle is flushed.
+
+ local error, type = error, type
+
+ local function luatex_io_lines(name,how)
+ if type(name) == "string" then
+ local f = io_open(name,how or 'r')
+ if f then
+ return function()
+ local l = fio_readline(f)
+ if not l then
+ f:close()
+ end
+ return l
end
- return l
+ else
+ -- for those who like it this way:
+ error("patched 'io.lines' can't open '" .. name .. "'")
end
else
- -- for those who like it this way:
- error("patched 'io.lines' can't open '" .. name .. "'")
+ return io_lines()
end
- else
- return io_lines()
end
-end
-local function luatex_io_readline(f)
- return function()
- return fio_readline(f)
+ local function luatex_io_readline(f)
+ return function()
+ return fio_readline(f)
+ end
end
-end
-
-io.lines = luatex_io_lines
-mt.lines = luatex_io_readline
--- We assume management to be provided by the replacement of kpse. This is the
--- case in ConTeXt.
-
-if kpseused == 1 then
+ io.lines = luatex_io_lines
+ mt.lines = luatex_io_readline
io.open = luatex_io_open
io.popen = luatex_io_popen
+else
+
+ -- we assume management elsewhere
+
end
+-- maybe also only when in kpse mode
+
if saferoption == 1 then
+ local write_nl = texio.write_nl
+ local format = string.format
+
local function installdummy(str,f)
local reported = false
return function(...)
@@ -176,8 +186,12 @@ if saferoption == 1 then
debug = nil
+ -- os.[execute|os.spawn|os.exec] already are shellescape aware)
+
end
+-- maybe also only when in kpse mode
+
if saferoption == 1 or shellescape ~= 1 then
ffi = require('ffi')
@@ -190,9 +204,6 @@ if saferoption == 1 or shellescape ~= 1 then
end
--- os.[execute|os.spawn|os.exec] already are shellescape aware)
-
-
if md5 then
local sum = md5.sum
@@ -419,25 +430,25 @@ do
end
--- so far
+-- start omit
if utilities and utilities.merger and utilities.merger.compact then
- local byte, format, gmatch = string.byte, string.format, string.gmatch
+ local byte, format, gmatch, gsub = string.byte, string.format, string.gmatch, string.gsub
local concat = table.concat
- local data = gsub(io.loaddata('luatex-core.lua'),'if%s+utilities.*','')
+ local data = io.loaddata('luatex-core.lua')
+
+ data = gsub(data,'%-%-%s*start%s*omit.-%-%-%s*stop%s*omit%s*','')
+ data = gsub(data,'\r\n','\n')
local t = { }
local r = { }
local n = 0
- local d = gsub(data,'\r\n','\n') -- be nice for unix
- local s = utilities.merger.compact(d) -- no comments and less spaces
+ local s = utilities.merger.compact(data) -- no comments and less spaces
t[#t+1] = '/* generated from and by luatex-core.lua */'
t[#t+1] = ''
- -- t[#t+1] = format('/*\n\n%s\n\n*/',d)
- -- t[#t+1] = ''
t[#t+1] = '#include "lua.h"'
t[#t+1] = '#include "lauxlib.h"'
t[#t+1] = ''
@@ -446,7 +457,7 @@ if utilities and utilities.merger and utilities.merger.compact then
t[#t+1] = 'int load_luatex_core_lua (lua_State * L)'
t[#t+1] = '{'
t[#t+1] = ' static unsigned char luatex_core_lua[] = {'
- for c in gmatch(d,'.') do
+ for c in gmatch(data,'.') do
if n == 16 then
n = 1
t[#t+1] = ' ' .. concat(r,', ') .. ','
@@ -467,3 +478,5 @@ if utilities and utilities.merger and utilities.merger.compact then
io.savedata('luatex-core-stripped.lua',s)
end
+
+-- stop omit
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua
index 766b869feef..41fbe10fd2a 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua
-- parent file : c:/data/develop/context/sources/luatex-fonts.lua
--- merge date : 03/21/19 21:39:34
+-- merge date : 2020-02-17 12:06
do -- begin closure to overcome local limits and interference
@@ -121,6 +121,9 @@ elseif not ffi.number then
end
if LUAVERSION>5.3 then
end
+if status and os.setenv then
+ os.setenv("engine",string.lower(status.luatex_engine or "unknown"))
+end
end -- closure
@@ -293,7 +296,7 @@ patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+unders
patterns.somecontent=(anything-newline-space)^1
patterns.beginline=#(1-newline)
patterns.longtostring=Cs(whitespace^0/""*((patterns.quoted+nonwhitespace^1+whitespace^1/""*(endofstring+Cc(" ")))^0))
-function anywhere(pattern)
+local function anywhere(pattern)
return (1-P(pattern))^0*P(pattern)
end
lpeg.anywhere=anywhere
@@ -977,9 +980,11 @@ function string.is_empty(str)
end
end
local anything=patterns.anything
-local allescapes=Cc("%")*S(".-+%?()[]*")
-local someescapes=Cc("%")*S(".-+%()[]")
-local matchescapes=Cc(".")*S("*?")
+local moreescapes=Cc("%")*S(".-+%?()[]*$^{}")
+local allescapes=Cc("%")*S(".-+%?()[]*")
+local someescapes=Cc("%")*S(".-+%()[]")
+local matchescapes=Cc(".")*S("*?")
+local pattern_m=Cs ((moreescapes+anything )^0 )
local pattern_a=Cs ((allescapes+anything )^0 )
local pattern_b=Cs ((someescapes+matchescapes+anything )^0 )
local pattern_c=Cs (Cc("^")*(someescapes+matchescapes+anything )^0*Cc("$") )
@@ -989,6 +994,8 @@ end
function string.topattern(str,lowercase,strict)
if str=="" or type(str)~="string" then
return ".*"
+ elseif strict=="all" then
+ str=lpegmatch(pattern_m,str)
elseif strict then
str=lpegmatch(pattern_c,str)
else
@@ -1042,7 +1049,7 @@ if not modules then modules={} end modules ['l-table']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local type,next,tostring,tonumber,select=type,next,tostring,tonumber,select
+local type,next,tostring,tonumber,select,rawget=type,next,tostring,tonumber,select,rawget
local table,string=table,string
local concat,sort=table.concat,table.sort
local format,lower,dump=string.format,string.lower,string.dump
@@ -1376,13 +1383,13 @@ function table.fromhash(t)
end
return hsh
end
-local noquotes,hexify,handle,compact,inline,functions,metacheck
+local noquotes,hexify,handle,compact,inline,functions,metacheck,accurate
local reserved=table.tohash {
'and','break','do','else','elseif','end','false','for','function','if',
'in','local','nil','not','or','repeat','return','then','true','until','while',
- 'NaN','goto',
+ 'NaN','goto','const',
}
-local function is_simple_table(t,hexify)
+local function is_simple_table(t,hexify,accurate)
local nt=#t
if nt>0 then
local n=0
@@ -1401,6 +1408,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i]=format("0x%X",v)
+ elseif accurate then
+ tt[i]=format("%q",v)
else
tt[i]=v
end
@@ -1421,6 +1430,8 @@ local function is_simple_table(t,hexify)
if tv=="number" then
if hexify then
tt[i+1]=format("0x%X",v)
+ elseif accurate then
+ tt[i+1]=format("%q",v)
else
tt[i+1]=v
end
@@ -1492,6 +1503,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tv=="number" then
if hexify then
handle(format("%s 0x%X,",depth,v))
+ elseif accurate then
+ handle(format("%s %q,",depth,v))
else
handle(format("%s %s,",depth,v))
end
@@ -1501,7 +1514,7 @@ local function do_serialize(root,name,depth,level,indexed)
if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
handle(format("%s { %s },",depth,concat(st,", ")))
else
@@ -1529,12 +1542,16 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
elseif tk=="boolean" then
if hexify then
handle(format("%s [%s]=0x%X,",depth,k and "true" or "false",v))
+ elseif accurate then
+ handle(format("%s [%s]=%q,",depth,k and "true" or "false",v))
else
handle(format("%s [%s]=%s,",depth,k and "true" or "false",v))
end
@@ -1542,12 +1559,16 @@ local function do_serialize(root,name,depth,level,indexed)
elseif noquotes and not reserved[k] and lpegmatch(propername,k) then
if hexify then
handle(format("%s %s=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s %s=%q,",depth,k,v))
else
handle(format("%s %s=%s,",depth,k,v))
end
else
if hexify then
handle(format("%s [%q]=0x%X,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
@@ -1556,6 +1577,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,v))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
@@ -1572,6 +1595,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={},",depth,k))
+ elseif accurate then
+ handle(format("%s [%q]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
@@ -1584,11 +1609,13 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s [%q]={},",depth,k))
end
elseif inline then
- local st=is_simple_table(v,hexify)
+ local st=is_simple_table(v,hexify,accurate)
if st then
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={ %s },",depth,k,concat(st,", ")))
+ elseif accurate then
+ handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
@@ -1610,6 +1637,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%s,",depth,k,v and "true" or "false"))
+ elseif accurate then
+ handle(format("%s [%q]=%s,",depth,k,v and "true" or "false"))
else
handle(format("%s [%s]=%s,",depth,k,v and "true" or "false"))
end
@@ -1629,6 +1658,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=load(%q),",depth,k,f))
+ elseif accurate then
+ handle(format("%s [%q]=load(%q),",depth,k,f))
else
handle(format("%s [%s]=load(%q),",depth,k,f))
end
@@ -1646,6 +1677,8 @@ local function do_serialize(root,name,depth,level,indexed)
if tk=="number" then
if hexify then
handle(format("%s [0x%X]=%q,",depth,k,tostring(v)))
+ elseif accurate then
+ handle(format("%s [%q]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
@@ -1669,6 +1702,7 @@ local function serialize(_handle,root,name,specification)
if type(specification)=="table" then
noquotes=specification.noquotes
hexify=specification.hexify
+ accurate=specification.accurate
handle=_handle or specification.handle or print
functions=specification.functions
compact=specification.compact
@@ -1984,7 +2018,7 @@ end
local function sequenced(t,sep,simple)
if not t then
return ""
- elseif type(t)=="string" then
+ elseif type(t)~="table" then
return t
end
local n=#t
@@ -2023,7 +2057,11 @@ local function sequenced(t,sep,simple)
end
end
end
- return concat(s,sep or " | ")
+ if sep==true then
+ return "{ "..concat(s,", ").." }"
+ else
+ return concat(s,sep or " | ")
+ end
end
table.sequenced=sequenced
function table.print(t,...)
@@ -2163,7 +2201,7 @@ local open,flush,write,read=io.open,io.flush,io.write,io.read
local byte,find,gsub,format=string.byte,string.find,string.gsub,string.format
local concat=table.concat
local type=type
-if string.find(os.getenv("PATH"),";",1,true) then
+if string.find(os.getenv("PATH") or "",";",1,true) then
io.fileseparator,io.pathseparator="\\",";"
else
io.fileseparator,io.pathseparator="/",":"
@@ -2518,15 +2556,24 @@ local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
local attributes=lfs.attributes
function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
+ if name then
+ return attributes(name,"mode")=="directory"
+ end
end
function lfs.isfile(name)
- local a=attributes(name,"mode")
- return a=="file" or a=="link" or nil
+ if name then
+ local a=attributes(name,"mode")
+ return a=="file" or a=="link" or nil
+ end
end
function lfs.isfound(name)
- local a=attributes(name,"mode")
- return (a=="file" or a=="link") and name or nil
+ if name then
+ local a=attributes(name,"mode")
+ return (a=="file" or a=="link") and name or nil
+ end
+end
+function lfs.modification(name)
+ return name and attributes(name,"modification") or nil
end
if sandbox then
sandbox.redefine(lfs.isfile,"lfs.isfile")
@@ -3388,6 +3435,13 @@ local template=[[
%s
return function(%s) return %s end
]]
+local pattern=Cs(Cc('"')*(
+ (1-S('"\\\n\r'))^1+P('"')/'\\"'+P('\\')/'\\\\'+P('\n')/'\\n'+P('\r')/'\\r'
+)^0*Cc('"'))
+patterns.escapedquotes=pattern
+function string.escapedquotes(s)
+ return lpegmatch(pattern,s)
+end
local preamble=""
local environment={
global=global or _G,
@@ -3412,9 +3466,10 @@ local environment={
formattednumber=number.formatted,
sparseexponent=number.sparseexponent,
formattedfloat=number.formattedfloat,
- stripzero=lpeg.patterns.stripzero,
- stripzeros=lpeg.patterns.stripzeros,
- FORMAT=string.f9,
+ stripzero=patterns.stripzero,
+ stripzeros=patterns.stripzeros,
+ escapedquotes=string.escapedquotes,
+ FORMAT=string.f6,
}
local arguments={ "a1" }
setmetatable(arguments,{ __index=function(t,k)
@@ -3465,13 +3520,16 @@ local format_left=function(f)
return format("a%s..utfpadding(a%s,%i)",n,n,-f)
end
end
-local format_q=function()
+local format_q=JITSUPPORTED and function()
n=n+1
return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n)
+end or function()
+ n=n+1
+ return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n)
end
local format_Q=function()
n=n+1
- return format("format('%%q',tostring(a%s))",n)
+ return format("escapedquotes(tostring(a%s))",n)
end
local format_i=function(f)
n=n+1
@@ -3622,12 +3680,25 @@ local format_n=function()
n=n+1
return format("((a%s %% 1 == 0) and format('%%i',a%s) or tostring(a%s))",n,n,n)
end
-local format_N=function(f)
- n=n+1
- if not f or f=="" then
- f=".9"
- end
- return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+local format_N if environment.FORMAT then
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ return format("FORMAT(a%s,'%%.9f')",n)
+ elseif f==".6" or f=="0.6" then
+ return format("FORMAT(a%s)",n)
+ else
+ return format("FORMAT(a%s,'%%%sf')",n,f)
+ end
+ end
+else
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ f=".9"
+ end
+ return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+ end
end
local format_a=function(f)
n=n+1
@@ -3856,9 +3927,9 @@ patterns.xmlescape=Cs((P("<")/"&lt;"+P(">")/"&gt;"+P("&")/"&amp;"+P('"')/"&quot;
patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+anything)^0)
patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0)
patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"'))
-add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=lpeg.patterns.xmlescape })
-add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=lpeg.patterns.texescape })
-add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=lpeg.patterns.luaescape })
+add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],{ xmlescape=patterns.xmlescape })
+add(formatters,"tex",[[lpegmatch(texescape,%s)]],{ texescape=patterns.texescape })
+add(formatters,"lua",[[lpegmatch(luaescape,%s)]],{ luaescape=patterns.luaescape })
local dquote=patterns.dquote
local equote=patterns.escaped+dquote/'\\"'+1
local cquote=Cc('"')
@@ -3890,6 +3961,27 @@ local f_16_16=formatters["%0.5N"]
function number.to16dot16(n)
return f_16_16(n/65536.0)
end
+if not string.explode then
+ local tsplitat=lpeg.tsplitat
+ local p_utf=patterns.utf8character
+ local p_check=C(p_utf)*(P("+")*Cc(true))^0
+ local p_split=Ct(C(p_utf)^0)
+ local p_space=Ct((C(1-P(" ")^1)+P(" ")^1)^0)
+ function string.explode(str,symbol)
+ if symbol=="" then
+ return lpegmatch(p_split,str)
+ elseif symbol then
+ local a,b=lpegmatch(p_check,symbol)
+ if b then
+ return lpegmatch(tsplitat(P(a)^1),str)
+ else
+ return lpegmatch(tsplitat(a),str)
+ end
+ else
+ return lpegmatch(p_space,str)
+ end
+ end
+end
end -- closure
@@ -4649,6 +4741,7 @@ if not modules then modules={} end modules ['data-con']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+local setmetatable=setmetatable
local format,lower,gsub=string.format,string.lower,string.gsub
local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end)
local trace_containers=false trackers.register("resolvers.containers",function(v) trace_containers=v end)
@@ -4656,16 +4749,21 @@ local trace_storage=false trackers.register("resolvers.storage",function(v) tra
containers=containers or {}
local containers=containers
containers.usecache=true
+local getwritablepath=caches.getwritablepath
+local getreadablepaths=caches.getreadablepaths
+local cacheiswritable=caches.is_writable
+local loaddatafromcache=caches.loaddata
+local savedataincache=caches.savedata
local report_containers=logs.reporter("resolvers","containers")
local allocated={}
local mt={
__index=function(t,k)
if k=="writable" then
- local writable=caches.getwritablepath(t.category,t.subcategory) or { "." }
+ local writable=getwritablepath(t.category,t.subcategory) or { "." }
t.writable=writable
return writable
elseif k=="readables" then
- local readables=caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ local readables=getreadablepaths(t.category,t.subcategory) or { "." }
t.readables=readables
return readables
end
@@ -4696,7 +4794,7 @@ function containers.define(category,subcategory,version,enabled)
end
end
function containers.is_usable(container,name)
- return container.enabled and caches and caches.is_writable(container.writable,name)
+ return container.enabled and caches and cacheiswritable(container.writable,name)
end
function containers.is_valid(container,name)
if name and name~="" then
@@ -4710,7 +4808,7 @@ function containers.read(container,name)
local storage=container.storage
local stored=storage[name]
if not stored and container.enabled and caches and containers.usecache then
- stored=caches.loaddata(container.readables,name,container.writable)
+ stored=loaddatafromcache(container.readables,name,container.writable)
if stored and stored.cache_version==container.version then
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","load",container.subcategory,name)
@@ -4726,17 +4824,20 @@ function containers.read(container,name)
end
return stored
end
-function containers.write(container,name,data)
+function containers.write(container,name,data,fast)
if data then
data.cache_version=container.version
if container.enabled and caches then
- local unique,shared=data.unique,data.shared
- data.unique,data.shared=nil,nil
- caches.savedata(container.writable,name,data)
+ local unique=data.unique
+ local shared=data.shared
+ data.unique=nil
+ data.shared=nil
+ savedataincache(container.writable,name,data,fast)
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","save",container.subcategory,name)
end
- data.unique,data.shared=unique,shared
+ data.unique=unique
+ data.shared=shared
end
if trace_cache or trace_containers then
report_containers("action %a, category %a, name %a","store",container.subcategory,name)
@@ -4825,6 +4926,7 @@ nuts.getchar=direct.getchar
nuts.getcomponents=direct.getcomponents
nuts.getdirection=direct.getdirection
nuts.getdisc=direct.getdisc
+nuts.getreplace=direct.getreplace
nuts.getfield=direct.getfield
nuts.getfont=direct.getfont
nuts.getid=direct.getid
@@ -4839,9 +4941,9 @@ nuts.setattr=direct.setfield
nuts.setboth=direct.setboth
nuts.setchar=direct.setchar
nuts.setcomponents=direct.setcomponents
-nuts.setdir=direct.setdir
nuts.setdirection=direct.setdirection
nuts.setdisc=direct.setdisc
+nuts.setreplace=direct.setreplace
nuts.setfield=setfield
nuts.setkern=direct.setkern
nuts.setlink=direct.setlink
@@ -4852,8 +4954,8 @@ nuts.setprev=direct.setprev
nuts.setsplit=direct.setsplit
nuts.setsubtype=direct.setsubtype
nuts.setwidth=direct.setwidth
-nuts.is_char=direct.is_char
-nuts.is_glyph=direct.is_glyph
+nuts.getglyphdata=nuts.getattr
+nuts.setglyphdata=nuts.setattr
nuts.ischar=direct.is_char
nuts.isglyph=direct.is_glyph
nuts.copy=direct.copy
@@ -4877,20 +4979,6 @@ nuts.traverse=direct.traverse
nuts.traverse_char=direct.traverse_char
nuts.traverse_glyph=direct.traverse_glyph
nuts.traverse_id=direct.traverse_id
-if not nuts.getdirection then
- local getdir=direct.getdir
- function nuts.getdirection(n)
- local d=getdir(n)
- if d=="TLT" then return 0
- elseif d=="TRT" then return 1
- elseif d=="+TLT" then return 0,false
- elseif d=="+TRT" then return 1,false
- elseif d=="-TLT" then return 0,true
- elseif d=="-TRT" then return 1,true
- else return 0
- end
- end
-end
local propertydata=direct.get_properties_table()
nodes.properties={ data=propertydata }
if direct.set_properties_mode then
@@ -4973,6 +5061,24 @@ do
node=nuts.traverse(dummy),
}
end
+if not nuts.setreplace then
+ local getdisc=nuts.getdisc
+ local setfield=nuts.setfield
+ function nuts.getreplace(n)
+ local _,_,h,_,_,t=getdisc(n,true)
+ return h,t
+ end
+ function nuts.setreplace(n,h)
+ setfield(n,"replace",h)
+ end
+end
+do
+ local getsubtype=nuts.getsubtype
+ function nuts.start_of_par(n)
+ local s=getsubtype(n)
+ return s==0 or s==2
+ end
+end
end -- closure
@@ -5419,7 +5525,6 @@ characters.classifiers={
[1803]=6,
[1804]=6,
[1805]=6,
- [1807]=6,
[1808]=3,
[1809]=5,
[1810]=2,
@@ -5600,6 +5705,9 @@ characters.classifiers={
[2040]=6,
[2041]=6,
[2042]=2,
+ [2045]=5,
+ [2046]=6,
+ [2047]=6,
[2070]=5,
[2071]=5,
[2072]=5,
@@ -5689,6 +5797,7 @@ characters.classifiers={
[2235]=2,
[2236]=2,
[2237]=2,
+ [2259]=5,
[2260]=5,
[2261]=5,
[2262]=5,
@@ -5765,6 +5874,7 @@ characters.classifiers={
[2509]=5,
[2530]=5,
[2531]=5,
+ [2558]=5,
[2561]=5,
[2562]=5,
[2620]=5,
@@ -5813,6 +5923,7 @@ characters.classifiers={
[3008]=5,
[3021]=5,
[3072]=5,
+ [3076]=5,
[3134]=5,
[3135]=5,
[3136]=5,
@@ -5874,6 +5985,7 @@ characters.classifiers={
[3767]=5,
[3768]=5,
[3769]=5,
+ [3770]=5,
[3771]=5,
[3772]=5,
[3784]=5,
@@ -6112,6 +6224,7 @@ characters.classifiers={
[6261]=2,
[6262]=2,
[6263]=2,
+ [6264]=2,
[6272]=4,
[6273]=4,
[6274]=4,
@@ -6512,6 +6625,7 @@ characters.classifiers={
[43247]=5,
[43248]=5,
[43249]=5,
+ [43263]=5,
[43302]=5,
[43303]=5,
[43304]=5,
@@ -6675,6 +6789,83 @@ characters.classifiers={
[68525]=2,
[68526]=2,
[68527]=4,
+ [68864]=1,
+ [68865]=2,
+ [68866]=2,
+ [68867]=2,
+ [68868]=2,
+ [68869]=2,
+ [68870]=2,
+ [68871]=2,
+ [68872]=2,
+ [68873]=2,
+ [68874]=2,
+ [68875]=2,
+ [68876]=2,
+ [68877]=2,
+ [68878]=2,
+ [68879]=2,
+ [68880]=2,
+ [68881]=2,
+ [68882]=2,
+ [68883]=2,
+ [68884]=2,
+ [68885]=2,
+ [68886]=2,
+ [68887]=2,
+ [68888]=2,
+ [68889]=2,
+ [68890]=2,
+ [68891]=2,
+ [68892]=2,
+ [68893]=2,
+ [68894]=2,
+ [68895]=2,
+ [68896]=2,
+ [68897]=2,
+ [68898]=3,
+ [68899]=2,
+ [68900]=5,
+ [68901]=5,
+ [68902]=5,
+ [68903]=5,
+ [69424]=2,
+ [69425]=2,
+ [69426]=2,
+ [69427]=3,
+ [69428]=2,
+ [69429]=2,
+ [69430]=2,
+ [69431]=2,
+ [69432]=2,
+ [69433]=2,
+ [69434]=2,
+ [69435]=2,
+ [69436]=2,
+ [69437]=2,
+ [69438]=2,
+ [69439]=2,
+ [69440]=2,
+ [69441]=2,
+ [69442]=2,
+ [69443]=2,
+ [69444]=2,
+ [69445]=4,
+ [69446]=5,
+ [69447]=5,
+ [69448]=5,
+ [69449]=5,
+ [69450]=5,
+ [69451]=5,
+ [69452]=5,
+ [69453]=5,
+ [69454]=5,
+ [69455]=5,
+ [69456]=5,
+ [69457]=2,
+ [69458]=2,
+ [69459]=2,
+ [69460]=3,
[69633]=5,
[69688]=5,
[69689]=5,
@@ -6700,6 +6891,8 @@ characters.classifiers={
[69814]=5,
[69817]=5,
[69818]=5,
+ [69821]=4,
+ [69837]=4,
[69888]=5,
[69889]=5,
[69890]=5,
@@ -6749,6 +6942,7 @@ characters.classifiers={
[70378]=5,
[70400]=5,
[70401]=5,
+ [70459]=5,
[70460]=5,
[70464]=5,
[70502]=5,
@@ -6775,6 +6969,7 @@ characters.classifiers={
[70723]=5,
[70724]=5,
[70726]=5,
+ [70750]=5,
[70835]=5,
[70836]=5,
[70837]=5,
@@ -6828,6 +7023,24 @@ characters.classifiers={
[71465]=5,
[71466]=5,
[71467]=5,
+ [71727]=5,
+ [71728]=5,
+ [71729]=5,
+ [71730]=5,
+ [71731]=5,
+ [71732]=5,
+ [71733]=5,
+ [71734]=5,
+ [71735]=5,
+ [71737]=5,
+ [71738]=5,
+ [72148]=5,
+ [72149]=5,
+ [72150]=5,
+ [72151]=5,
+ [72154]=5,
+ [72155]=5,
+ [72160]=5,
[72193]=5,
[72194]=5,
[72195]=5,
@@ -6935,6 +7148,12 @@ characters.classifiers={
[73028]=5,
[73029]=5,
[73031]=5,
+ [73104]=5,
+ [73105]=5,
+ [73109]=5,
+ [73111]=5,
+ [73459]=5,
+ [73460]=5,
[92912]=5,
[92913]=5,
[92914]=5,
@@ -6947,6 +7166,7 @@ characters.classifiers={
[92980]=5,
[92981]=5,
[92982]=5,
+ [94031]=5,
[94095]=5,
[94096]=5,
[94097]=5,
@@ -7143,6 +7363,17 @@ characters.classifiers={
[122920]=5,
[122921]=5,
[122922]=5,
+ [123184]=5,
+ [123185]=5,
+ [123186]=5,
+ [123187]=5,
+ [123188]=5,
+ [123189]=5,
+ [123190]=5,
+ [123628]=5,
+ [123629]=5,
+ [123630]=5,
+ [123631]=5,
[125136]=5,
[125137]=5,
[125138]=5,
@@ -7245,6 +7476,7 @@ characters.indicgroups={
[2632]=true,
[2635]=true,
[2636]=true,
+ [2690]=true,
[2757]=true,
[2759]=true,
[2760]=true,
@@ -7256,7 +7488,6 @@ characters.indicgroups={
[3136]=true,
[3142]=true,
[3143]=true,
- [3144]=true,
[3146]=true,
[3147]=true,
[3148]=true,
@@ -7264,6 +7495,21 @@ characters.indicgroups={
[3263]=true,
[3270]=true,
[3406]=true,
+ [4141]=true,
+ [4142]=true,
+ [4146]=true,
+ [4147]=true,
+ [4148]=true,
+ [4149]=true,
+ [4150]=true,
+ [4154]=true,
+ [4209]=true,
+ [4210]=true,
+ [4211]=true,
+ [4212]=true,
+ [4229]=true,
+ [4230]=true,
+ [4253]=true,
[43232]=true,
[43233]=true,
[43234]=true,
@@ -7282,6 +7528,8 @@ characters.indicgroups={
[43247]=true,
[43248]=true,
[43249]=true,
+ [43493]=true,
+ [43644]=true,
},
["after_half"]={},
["after_main"]={
@@ -7303,6 +7551,7 @@ characters.indicgroups={
[2626]=true,
[2672]=true,
[2673]=true,
+ [2735]=true,
[2750]=true,
[2752]=true,
[2753]=true,
@@ -7466,10 +7715,24 @@ characters.indicgroups={
[3170]=true,
[3171]=true,
[3260]=true,
+ [3286]=true,
[3298]=true,
[3299]=true,
[3426]=true,
[3427]=true,
+ [4143]=true,
+ [4144]=true,
+ [4151]=true,
+ [4153]=true,
+ [4157]=true,
+ [4158]=true,
+ [4184]=true,
+ [4185]=true,
+ [4190]=true,
+ [4191]=true,
+ [4192]=true,
+ [4226]=true,
+ [4237]=true,
},
["consonant"]={
[2325]=true,
@@ -7799,6 +8062,117 @@ characters.indicgroups={
[3384]=true,
[3385]=true,
[3386]=true,
+ [4096]=true,
+ [4097]=true,
+ [4098]=true,
+ [4099]=true,
+ [4100]=true,
+ [4101]=true,
+ [4102]=true,
+ [4103]=true,
+ [4104]=true,
+ [4105]=true,
+ [4106]=true,
+ [4107]=true,
+ [4108]=true,
+ [4109]=true,
+ [4110]=true,
+ [4111]=true,
+ [4112]=true,
+ [4113]=true,
+ [4114]=true,
+ [4115]=true,
+ [4116]=true,
+ [4117]=true,
+ [4118]=true,
+ [4119]=true,
+ [4120]=true,
+ [4121]=true,
+ [4122]=true,
+ [4123]=true,
+ [4124]=true,
+ [4125]=true,
+ [4126]=true,
+ [4127]=true,
+ [4128]=true,
+ [4155]=true,
+ [4156]=true,
+ [4157]=true,
+ [4158]=true,
+ [4159]=true,
+ [4176]=true,
+ [4177]=true,
+ [4186]=true,
+ [4187]=true,
+ [4188]=true,
+ [4189]=true,
+ [4190]=true,
+ [4191]=true,
+ [4192]=true,
+ [4193]=true,
+ [4197]=true,
+ [4198]=true,
+ [4206]=true,
+ [4207]=true,
+ [4208]=true,
+ [4213]=true,
+ [4214]=true,
+ [4215]=true,
+ [4216]=true,
+ [4217]=true,
+ [4218]=true,
+ [4219]=true,
+ [4220]=true,
+ [4221]=true,
+ [4222]=true,
+ [4223]=true,
+ [4224]=true,
+ [4225]=true,
+ [4226]=true,
+ [4238]=true,
+ [43488]=true,
+ [43489]=true,
+ [43490]=true,
+ [43491]=true,
+ [43492]=true,
+ [43495]=true,
+ [43496]=true,
+ [43497]=true,
+ [43498]=true,
+ [43499]=true,
+ [43500]=true,
+ [43501]=true,
+ [43502]=true,
+ [43503]=true,
+ [43514]=true,
+ [43515]=true,
+ [43516]=true,
+ [43517]=true,
+ [43518]=true,
+ [43616]=true,
+ [43617]=true,
+ [43618]=true,
+ [43619]=true,
+ [43620]=true,
+ [43621]=true,
+ [43622]=true,
+ [43623]=true,
+ [43624]=true,
+ [43625]=true,
+ [43626]=true,
+ [43628]=true,
+ [43629]=true,
+ [43630]=true,
+ [43631]=true,
+ [43633]=true,
+ [43634]=true,
+ [43635]=true,
+ [43636]=true,
+ [43637]=true,
+ [43638]=true,
+ [43642]=true,
+ [43646]=true,
+ [43647]=true,
},
["dependent_vowel"]={
[2362]=true,
@@ -7827,13 +8201,14 @@ characters.indicgroups={
[2403]=true,
[2494]=true,
[2495]=true,
- [2496]=true,
[2497]=true,
[2498]=true,
[2499]=true,
[2500]=true,
[2503]=true,
[2504]=true,
+ [2507]=true,
+ [2508]=true,
[2622]=true,
[2623]=true,
[2624]=true,
@@ -7908,6 +8283,8 @@ characters.indicgroups={
[3274]=true,
[3275]=true,
[3276]=true,
+ [3285]=true,
+ [3286]=true,
[3298]=true,
[3299]=true,
[3390]=true,
@@ -7926,6 +8303,35 @@ characters.indicgroups={
[3415]=true,
[3426]=true,
[3427]=true,
+ [4139]=true,
+ [4140]=true,
+ [4141]=true,
+ [4142]=true,
+ [4143]=true,
+ [4144]=true,
+ [4145]=true,
+ [4146]=true,
+ [4147]=true,
+ [4148]=true,
+ [4149]=true,
+ [4182]=true,
+ [4183]=true,
+ [4184]=true,
+ [4185]=true,
+ [4194]=true,
+ [4199]=true,
+ [4200]=true,
+ [4209]=true,
+ [4210]=true,
+ [4211]=true,
+ [4212]=true,
+ [4227]=true,
+ [4228]=true,
+ [4229]=true,
+ [4230]=true,
+ [4252]=true,
+ [4253]=true,
+ [43493]=true,
},
["halant"]={
[2381]=true,
@@ -8083,6 +8489,20 @@ characters.indicgroups={
[3423]=true,
[3424]=true,
[3425]=true,
+ [4129]=true,
+ [4130]=true,
+ [4131]=true,
+ [4132]=true,
+ [4133]=true,
+ [4134]=true,
+ [4135]=true,
+ [4136]=true,
+ [4137]=true,
+ [4138]=true,
+ [4178]=true,
+ [4179]=true,
+ [4180]=true,
+ [4181]=true,
},
["nukta"]={
[2364]=true,
@@ -8104,8 +8524,6 @@ characters.indicgroups={
[2383]=true,
[2494]=true,
[2496]=true,
- [2503]=true,
- [2504]=true,
[2622]=true,
[2624]=true,
[2750]=true,
@@ -8122,16 +8540,12 @@ characters.indicgroups={
[3139]=true,
[3140]=true,
[3262]=true,
- [3264]=true,
[3265]=true,
[3266]=true,
[3267]=true,
[3268]=true,
- [3271]=true,
- [3272]=true,
- [3274]=true,
- [3275]=true,
[3276]=true,
+ [3285]=true,
[3390]=true,
[3391]=true,
[3392]=true,
@@ -8140,25 +8554,58 @@ characters.indicgroups={
[3395]=true,
[3396]=true,
[3415]=true,
+ [4139]=true,
+ [4140]=true,
+ [4152]=true,
+ [4155]=true,
+ [4182]=true,
+ [4183]=true,
+ [4194]=true,
+ [4195]=true,
+ [4196]=true,
+ [4199]=true,
+ [4200]=true,
+ [4201]=true,
+ [4202]=true,
+ [4203]=true,
+ [4204]=true,
+ [4205]=true,
+ [4227]=true,
+ [4231]=true,
+ [4232]=true,
+ [4233]=true,
+ [4234]=true,
+ [4235]=true,
+ [4236]=true,
+ [4239]=true,
+ [4250]=true,
+ [4251]=true,
+ [4252]=true,
+ [43643]=true,
+ [43645]=true,
},
["pre_mark"]={
[2367]=true,
[2382]=true,
[2495]=true,
+ [2503]=true,
+ [2504]=true,
[2623]=true,
[2751]=true,
[2887]=true,
- [2888]=true,
[3014]=true,
[3015]=true,
[3016]=true,
[3398]=true,
[3399]=true,
[3400]=true,
+ [4145]=true,
+ [4228]=true,
},
["ra"]={
[2352]=true,
[2480]=true,
+ [2544]=true,
[2608]=true,
[2736]=true,
[2864]=true,
@@ -8172,17 +8619,43 @@ characters.indicgroups={
[2386]=true,
[2387]=true,
[2388]=true,
- [2507]=true,
- [2508]=true,
- [3277]=true,
- [3405]=true,
+ [4151]=true,
+ [4195]=true,
+ [4196]=true,
+ [4201]=true,
+ [4202]=true,
+ [4203]=true,
+ [4204]=true,
+ [4205]=true,
+ [4231]=true,
+ [4232]=true,
+ [4233]=true,
+ [4234]=true,
+ [4235]=true,
+ [4236]=true,
+ [4237]=true,
+ [4239]=true,
+ [4250]=true,
+ [4251]=true,
+ [43643]=true,
+ [43644]=true,
+ [43645]=true,
},
["twopart_mark"]={
+ [2507]={ 2503,2494 },
+ [2508]={ 2503,2519 },
+ [2888]={ 2887,2902 },
[2891]={ 2887,2878 },
[2892]={ 2887,2903 },
[3018]={ 3014,3006 },
[3019]={ 3015,3006 },
[3020]={ 3014,3031 },
+ [3144]={ 3142,3158 },
+ [3264]={ 3263,3285 },
+ [3271]={ 3270,3285 },
+ [3272]={ 3270,3286 },
+ [3274]={ 3270,3266 },
+ [3275]={ 3274,3285 },
[3402]={ 3398,3390 },
[3403]={ 3399,3390 },
[3404]={ 3398,3415 },
@@ -8192,8 +8665,13 @@ characters.indicgroups={
[2305]=true,
[2306]=true,
[2307]=true,
+ [2433]=true,
[3330]=true,
[3331]=true,
+ [4150]=true,
+ [4152]=true,
+ [4153]=true,
+ [4154]=true,
[43232]=true,
[43233]=true,
[43234]=true,
@@ -8210,7 +8688,6 @@ characters.indicgroups={
[43245]=true,
[43246]=true,
[43247]=true,
- [43248]=true,
[43249]=true,
},
}
@@ -8252,6 +8729,9 @@ fonts.privateoffsets={
mathbase=0xFF000,
keepnames=false,
}
+if node and not tex.getfontoffamily then
+ tex.getfontoffamily=node.family_font
+end
end -- closure
@@ -8318,13 +8798,13 @@ fonts.handlers=handlers
local allocate=utilities.storage.allocate
local setmetatableindex=table.setmetatableindex
constructors.dontembed=allocate()
-constructors.autocleanup=true
constructors.namemode="fullpath"
constructors.version=1.01
constructors.cache=containers.define("fonts","constructors",constructors.version,false)
constructors.privateoffset=fonts.privateoffsets.textbase or 0xF0000
constructors.cacheintex=true
constructors.addtounicode=true
+constructors.fixprotrusion=true
local designsizes=allocate()
constructors.designsizes=designsizes
local loadedfonts=allocate()
@@ -8376,11 +8856,6 @@ function constructors.getmathparameter(tfmdata,name)
end
end
function constructors.cleanuptable(tfmdata)
- if constructors.autocleanup and tfmdata.properties.virtualized then
- for k,v in next,tfmdata.characters do
- if v.commands then v.commands=nil end
- end
- end
end
function constructors.calculatescale(tfmdata,scaledpoints)
local parameters=tfmdata.parameters
@@ -8593,7 +9068,8 @@ function constructors.scale(tfmdata,specification)
local units=parameters.units or 1000
targetproperties.language=properties.language or "dflt"
targetproperties.script=properties.script or "dflt"
- targetproperties.mode=properties.mode or "base"
+ targetproperties.mode=properties.mode or "base"
+ targetproperties.method=properties.method
local askedscaledpoints=scaledpoints
local scaledpoints,delta=constructors.calculatescale(tfmdata,scaledpoints,nil,specification)
local hdelta=delta
@@ -8606,6 +9082,7 @@ function constructors.scale(tfmdata,specification)
properties.direction=direction
target.size=scaledpoints
target.encodingbytes=properties.encodingbytes or 1
+ target.subfont=properties.subfont
target.embedding=properties.embedding or "subset"
target.tounicode=1
target.cidinfo=properties.cidinfo
@@ -8715,7 +9192,7 @@ function constructors.scale(tfmdata,specification)
targetparameters.descender=delta*descender
end
constructors.enhanceparameters(targetparameters)
- local protrusionfactor=(targetquad~=0 and 1000/targetquad) or 0
+ local protrusionfactor=constructors.fixprotrusion and ((targetquad~=0 and 1000/targetquad) or 1) or 1
local scaledwidth=defaultwidth*hdelta
local scaledheight=defaultheight*vdelta
local scaleddepth=defaultdepth*vdelta
@@ -9056,13 +9533,13 @@ function constructors.finalize(tfmdata)
parameters.width=0
end
if not parameters.slantfactor then
- parameters.slantfactor=tfmdata.slant or 0
+ parameters.slantfactor=(tfmdata.slant or 0)/1000
end
if not parameters.extendfactor then
- parameters.extendfactor=tfmdata.extend or 0
+ parameters.extendfactor=(tfmdata.extend or 1000)/1000
end
if not parameters.squeezefactor then
- parameters.squeezefactor=tfmdata.squeeze or 0
+ parameters.squeezefactor=(tfmdata.squeeze or 1000)/1000
end
local designsize=parameters.designsize
if designsize then
@@ -9092,12 +9569,13 @@ function constructors.finalize(tfmdata)
if not properties.virtualized then
properties.virtualized=tfmdata.type=="virtual"
end
- properties.fontname=tfmdata.fontname
- properties.filename=tfmdata.filename
- properties.fullname=tfmdata.fullname
- properties.name=tfmdata.name
- properties.psname=tfmdata.psname
+ properties.fontname=properties.fontname or tfmdata.fontname
+ properties.filename=properties.filename or tfmdata.filename
+ properties.fullname=properties.fullname or tfmdata.fullname
+ properties.name=properties.name or tfmdata.name
+ properties.psname=properties.psname or tfmdata.psname
properties.encodingbytes=tfmdata.encodingbytes or 1
+ properties.subfont=tfmdata.subfont or nil
properties.embedding=tfmdata.embedding or "subset"
properties.tounicode=tfmdata.tounicode or 1
properties.cidinfo=tfmdata.cidinfo or nil
@@ -9123,6 +9601,7 @@ function constructors.finalize(tfmdata)
tfmdata.name=nil
tfmdata.psname=nil
tfmdata.encodingbytes=nil
+ tfmdata.subfont=nil
tfmdata.embedding=nil
tfmdata.tounicode=nil
tfmdata.cidinfo=nil
@@ -9185,6 +9664,7 @@ hashmethods.normal=function(list)
m=m+1
t[m]=k..'='..tostring(v)
end
+ sort(t)
s[n]=k..'={'..concat(t,",").."}"
else
s[n]=k..'='..tostring(v)
@@ -10436,7 +10916,7 @@ if not modules then modules={} end modules ['font-otr']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local next,type,tonumber=next,type,tonumber
+local next,type,tonumber,rawget=next,type,tonumber,rawget
local byte,lower,char,gsub=string.byte,string.lower,string.char,string.gsub
local fullstrip=string.fullstrip
local floor,round=math.floor,math.round
@@ -10449,8 +10929,9 @@ local sortedhash=table.sortedhash
local stripstring=string.nospaces
local utf16_to_utf8_be=utf.utf16_to_utf8_be
local report=logs.reporter("otf reader")
-local trace_cmap=false
-local trace_cmap_detail=false
+local report_cmap=logs.reporter("otf reader","cmap")
+local trace_cmap=false trackers.register("otf.cmap",function(v) trace_cmap=v end)
+local trace_cmap_details=false trackers.register("otf.cmap.details",function(v) trace_cmap_details=v end)
fonts=fonts or {}
local handlers=fonts.handlers or {}
fonts.handlers=handlers
@@ -11112,15 +11593,18 @@ readers.vmtx=function(f,fontdata,specification)
local glyphs=fontdata.glyphs
local nofglyphs=fontdata.nofglyphs
local vheight=0
- local vdefault=verticalheader.ascender+verticalheader.descender
+ local vdefault=verticalheader.ascender-verticalheader.descender
local topsidebearing=0
for i=0,nofmetrics-1 do
local glyph=glyphs[i]
- vheight=readshort(f)
+ vheight=readushort(f)
topsidebearing=readshort(f)
if vheight~=0 and vheight~=vdefault then
glyph.vheight=vheight
end
+ if topsidebearing~=0 then
+ glyph.tsb=topsidebearing
+ end
end
for i=nofmetrics,nofglyphs-1 do
local glyph=glyphs[i]
@@ -11198,11 +11682,14 @@ local sequence={
{ 3,1,4 },
{ 3,10,12 },
{ 0,3,4 },
+ { 0,3,12 },
{ 0,1,4 },
+ { 0,1,12 },
{ 0,0,6 },
{ 3,0,6 },
+ { 3,0,4 },
{ 0,5,14 },
-{ 0,4,12 },
+ { 0,4,12 },
{ 3,10,13 },
}
local supported={}
@@ -11247,7 +11734,7 @@ formatreaders[4]=function(f,fontdata,offset)
elseif startchar==0xFFFF and offset==0 then
elseif offset==0xFFFF then
elseif offset==0 then
- if trace_cmap_detail then
+ if trace_cmap_details then
report("format 4.%i segment %2i from %C upto %C at index %H",1,segment,startchar,endchar,(startchar+delta)%65536)
end
for unicode=startchar,endchar do
@@ -11279,8 +11766,8 @@ formatreaders[4]=function(f,fontdata,offset)
end
else
local shift=(segment-nofsegments+offset/2)-startchar
- if trace_cmap_detail then
- report("format 4.%i segment %2i from %C upto %C at index %H",0,segment,startchar,endchar,(startchar+delta)%65536)
+ if trace_cmap_details then
+ report_cmap("format 4.%i segment %2i from %C upto %C at index %H",0,segment,startchar,endchar,(startchar+delta)%65536)
end
for unicode=startchar,endchar do
local slot=shift+unicode
@@ -11327,8 +11814,8 @@ formatreaders[6]=function(f,fontdata,offset)
local count=readushort(f)
local stop=start+count-1
local nofdone=0
- if trace_cmap_detail then
- report("format 6 from %C to %C",2,start,stop)
+ if trace_cmap_details then
+ report_cmap("format 6 from %C to %C",2,start,stop)
end
for unicode=start,stop do
local index=readushort(f)
@@ -11360,8 +11847,8 @@ formatreaders[12]=function(f,fontdata,offset)
local first=readulong(f)
local last=readulong(f)
local index=readulong(f)
- if trace_cmap_detail then
- report("format 12 from %C to %C starts at index %i",first,last,index)
+ if trace_cmap_details then
+ report_cmap("format 12 from %C to %C starts at index %i",first,last,index)
end
for unicode=first,last do
local glyph=glyphs[index]
@@ -11399,8 +11886,8 @@ formatreaders[13]=function(f,fontdata,offset)
local last=readulong(f)
local index=readulong(f)
if first<privateoffset then
- if trace_cmap_detail then
- report("format 13 from %C to %C get index %i",first,last,index)
+ if trace_cmap_details then
+ report_cmap("format 13 from %C to %C get index %i",first,last,index)
end
local glyph=glyphs[index]
local unicode=glyph.unicode
@@ -11470,27 +11957,46 @@ formatreaders[14]=function(f,fontdata,offset)
end
end
local function checkcmap(f,fontdata,records,platform,encoding,format)
- local data=records[platform]
- if not data then
+ local pdata=records[platform]
+ if not pdata then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","no platform",platform,encoding,format)
+ end
return 0
end
- data=data[encoding]
- if not data then
+ local edata=pdata[encoding]
+ if not edata then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","no encoding",platform,encoding,format)
+ end
return 0
end
- data=data[format]
- if not data then
+ local fdata=edata[format]
+ if not fdata then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","no format",platform,encoding,format)
+ end
+ return 0
+ elseif type(fdata)~="number" then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","already done",platform,encoding,format)
+ end
return 0
end
+ edata[format]=true
local reader=formatreaders[format]
if not reader then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","unsupported format",platform,encoding,format)
+ end
return 0
end
- local p=platforms[platform]
- local e=encodings[p]
- local n=reader(f,fontdata,data) or 0
- if trace_cmap then
- report("cmap checked: platform %i (%s), encoding %i (%s), format %i, new unicodes %i",platform,p,encoding,e and e[encoding] or "?",format,n)
+ local n=reader(f,fontdata,fdata) or 0
+ if trace_cmap_details or trace_cmap then
+ local p=platforms[platform]
+ local e=encodings[p]
+ report_cmap("checked, platform %i (%s), encoding %i (%s), format %i, new unicodes %i",
+ platform,p,encoding,e and e[encoding] or "?",format,n)
end
return n
end
@@ -11685,6 +12191,7 @@ local function getinfo(maindata,sub,platformnames,rawfamilynames,metricstoo,inst
local postscript=fontdata.postscript or {}
local fontheader=fontdata.fontheader or {}
local cffinfo=fontdata.cffinfo or {}
+ local verticalheader=fontdata.verticalheader or {}
local filename=fontdata.filename
local weight=getname(fontdata,"weight") or (cffinfo and cffinfo.weight) or (metrics and metrics.weight)
local width=getname(fontdata,"width") or (cffinfo and cffinfo.width ) or (metrics and metrics.width )
@@ -11750,6 +12257,7 @@ local function getinfo(maindata,sub,platformnames,rawfamilynames,metricstoo,inst
platformnames=platformnames or nil,
instancenames=instancenames or nil,
tableoffsets=fontdata.tableoffsets,
+ defaultvheight=(verticalheader.ascender or 0)-(verticalheader.descender or 0)
}
if metricstoo then
local keys={
@@ -12420,14 +12928,19 @@ otf.tables=tables
local statistics=otf.statistics or {}
otf.statistics=statistics
local scripts=allocate {
+ ["adlm"]="adlam",
+ ["aghb"]="caucasian albanian",
+ ["ahom"]="ahom",
["arab"]="arabic",
["armi"]="imperial aramaic",
["armn"]="armenian",
["avst"]="avestan",
["bali"]="balinese",
["bamu"]="bamum",
+ ["bass"]="bassa vah",
["batk"]="batak",
["beng"]="bengali",
+ ["bhks"]="bhaiksuki",
["bng2"]="bengali variant 2",
["bopo"]="bopomofo",
["brah"]="brahmi",
@@ -12443,23 +12956,33 @@ local scripts=allocate {
["copt"]="coptic",
["cprt"]="cypriot syllabary",
["cyrl"]="cyrillic",
- ["deva"]="devanagari",
["dev2"]="devanagari variant 2",
+ ["deva"]="devanagari",
+ ["dogr"]="dogra",
["dsrt"]="deseret",
+ ["dupl"]="duployan",
["egyp"]="egyptian heiroglyphs",
+ ["elba"]="elbasan",
["ethi"]="ethiopic",
["geor"]="georgian",
+ ["gjr2"]="gujarati variant 2",
["glag"]="glagolitic",
+ ["gong"]="gunjala gondi",
+ ["gonm"]="masaram gondi",
["goth"]="gothic",
+ ["gran"]="grantha",
["grek"]="greek",
["gujr"]="gujarati",
- ["gjr2"]="gujarati variant 2",
- ["guru"]="gurmukhi",
["gur2"]="gurmukhi variant 2",
+ ["guru"]="gurmukhi",
["hang"]="hangul",
["hani"]="cjk ideographic",
["hano"]="hanunoo",
+ ["hatr"]="hatran",
["hebr"]="hebrew",
+ ["hluw"]="anatolian hieroglyphs",
+ ["hmng"]="pahawh hmong",
+ ["hung"]="old hungarian",
["ital"]="old italic",
["jamo"]="hangul jamo",
["java"]="javanese",
@@ -12467,49 +12990,77 @@ local scripts=allocate {
["kana"]="hiragana and katakana",
["khar"]="kharosthi",
["khmr"]="khmer",
- ["knda"]="kannada",
+ ["khoj"]="khojki",
["knd2"]="kannada variant 2",
+ ["knda"]="kannada",
["kthi"]="kaithi",
["lana"]="tai tham",
["lao" ]="lao",
["latn"]="latin",
["lepc"]="lepcha",
["limb"]="limbu",
+ ["lina"]="linear a",
["linb"]="linear b",
["lisu"]="lisu",
["lyci"]="lycian",
["lydi"]="lydian",
+ ["mahj"]="mahajani",
+ ["maka"]="makasar",
["mand"]="mandaic and mandaean",
+ ["mani"]="manichaean",
+ ["marc"]="marchen",
["math"]="mathematical alphanumeric symbols",
+ ["medf"]="medefaidrin",
+ ["mend"]="mende kikakui",
["merc"]="meroitic cursive",
["mero"]="meroitic hieroglyphs",
- ["mlym"]="malayalam",
["mlm2"]="malayalam variant 2",
+ ["mlym"]="malayalam",
+ ["modi"]="modi",
["mong"]="mongolian",
+ ["mroo"]="mro",
["mtei"]="meitei Mayek",
+ ["mult"]="multani",
["musc"]="musical symbols",
["mym2"]="myanmar variant 2",
["mymr"]="myanmar",
+ ["narb"]="old north arabian",
+ ["nbat"]="nabataean",
+ ["newa"]="newa",
["nko" ]='n"ko',
+ ["nshu"]="nüshu",
["ogam"]="ogham",
["olck"]="ol chiki",
["orkh"]="old turkic and orkhon runic",
- ["orya"]="oriya",
["ory2"]="odia variant 2",
+ ["orya"]="oriya",
+ ["osge"]="osage",
["osma"]="osmanya",
+ ["palm"]="palmyrene",
+ ["pauc"]="pau cin hau",
+ ["perm"]="old permic",
["phag"]="phags-pa",
["phli"]="inscriptional pahlavi",
+ ["phlp"]="psalter pahlavi",
["phnx"]="phoenician",
+ ["plrd"]="miao",
["prti"]="inscriptional parthian",
["rjng"]="rejang",
+ ["rohg"]="hanifi rohingya",
["runr"]="runic",
["samr"]="samaritan",
["sarb"]="old south arabian",
["saur"]="saurashtra",
+ ["sgnw"]="sign writing",
["shaw"]="shavian",
["shrd"]="sharada",
+ ["sidd"]="siddham",
+ ["sind"]="khudawadi",
["sinh"]="sinhala",
+ ["sogd"]="sogdian",
+ ["sogo"]="old sogdian",
["sora"]="sora sompeng",
+ ["soyo"]="soyombo",
["sund"]="sundanese",
["sylo"]="syloti nagri",
["syrc"]="syriac",
@@ -12518,20 +13069,24 @@ local scripts=allocate {
["tale"]="tai le",
["talu"]="tai lu",
["taml"]="tamil",
+ ["tang"]="tangut",
["tavt"]="tai viet",
- ["telu"]="telugu",
["tel2"]="telugu variant 2",
+ ["telu"]="telugu",
["tfng"]="tifinagh",
["tglg"]="tagalog",
["thaa"]="thaana",
["thai"]="thai",
["tibt"]="tibetan",
+ ["tirh"]="tirhuta",
["tml2"]="tamil variant 2",
["ugar"]="ugaritic cuneiform",
["vai" ]="vai",
+ ["wara"]="warang citi",
["xpeo"]="old persian cuneiform",
["xsux"]="sumero-akkadian cuneiform",
["yi" ]="yi",
+ ["zanb"]="zanabazar square",
}
local languages=allocate {
["aba" ]="abaza",
@@ -12600,12 +13155,15 @@ local languages=allocate {
["brm" ]="burmese",
["brx" ]="bodo",
["bsh" ]="bashkir",
+ ["bsk" ]="burushaski",
["bti" ]="beti",
["bts" ]="batak simalungun",
["bug" ]="bugis",
+ ["byv" ]="medumba",
["cak" ]="kaqchikel",
["cat" ]="catalan",
["cbk" ]="zamboanga chavacano",
+ ["cchn"]="chinantec",
["ceb" ]="cebuano",
["cgg" ]="chiga",
["cha" ]="chamorro",
@@ -12620,6 +13178,8 @@ local languages=allocate {
["chr" ]="cherokee",
["chu" ]="chuvash",
["chy" ]="cheyenne",
+ ["cja" ]="western cham",
+ ["cjm" ]="eastern cham",
["cmr" ]="comorian",
["cop" ]="coptic",
["cor" ]="cornish",
@@ -12675,6 +13235,7 @@ local languages=allocate {
["fin" ]="finnish",
["fji" ]="fijian",
["fle" ]="dutch (flemish)",
+ ["fmp" ]="fe’fe’",
["fne" ]="forest nenets",
["fon" ]="fon",
["fos" ]="faroese",
@@ -12753,6 +13314,7 @@ local languages=allocate {
["jan" ]="japanese",
["jav" ]="javanese",
["jbo" ]="lojban",
+ ["jct" ]="krymchak",
["jii" ]="yiddish",
["jud" ]="ladino",
["jul" ]="jula",
@@ -12789,6 +13351,7 @@ local languages=allocate {
["kmn" ]="kumaoni",
["kmo" ]="komo",
["kms" ]="komso",
+ ["kmz" ]="khorasani turkic",
["knr" ]="kanuri",
["kod" ]="kodagu",
["koh" ]="korean old hangul",
@@ -12865,6 +13428,7 @@ local languages=allocate {
["mar" ]="marathi",
["maw" ]="marwari",
["mbn" ]="mbundu",
+ ["mbo" ]="mbo",
["mch" ]="manchu",
["mcr" ]="moose cree",
["mde" ]="mende",
@@ -12881,6 +13445,7 @@ local languages=allocate {
["mle" ]="male",
["mlg" ]="malagasy",
["mln" ]="malinke",
+ ["mlr" ]="malayalam reformed",
["mly" ]="malay",
["mnd" ]="mandinka",
["mng" ]="mongolian",
@@ -12934,6 +13499,7 @@ local languages=allocate {
["nto" ]="esperanto",
["nym" ]="nyamwezi",
["nyn" ]="norwegian nynorsk",
+ ["nza" ]="mbembe tigon",
["oci" ]="occitan",
["ocr" ]="oji-cree",
["ojb" ]="ojibway",
@@ -12997,6 +13563,7 @@ local languages=allocate {
["say" ]="sayisi",
["scn" ]="sicilian",
["sco" ]="scots",
+ ["scs" ]="north slavey",
["sek" ]="sekota",
["sel" ]="selkup",
["sga" ]="old irish",
@@ -13041,6 +13608,9 @@ local languages=allocate {
["sxu" ]="upper saxon",
["syl" ]="sylheti",
["syr" ]="syriac",
+ ["syre"]="estrangela syriac",
+ ["syrj"]="western syriac",
+ ["syrn"]="eastern syriac",
["szl" ]="silesian",
["tab" ]="tabasaran",
["taj" ]="tajiki",
@@ -13072,6 +13642,7 @@ local languages=allocate {
["tsj" ]="tshangla",
["tua" ]="turoyo aramaic",
["tul" ]="tulu",
+ ["tum" ]="tulu",
["tuv" ]="tuvin",
["tvl" ]="tuvalu",
["twi" ]="twi",
@@ -13097,6 +13668,7 @@ local languages=allocate {
["wel" ]="welsh",
["wlf" ]="wolof",
["wln" ]="walloon",
+ ["wtm" ]="mewati",
["xbd" ]="lü",
["xhs" ]="xhosa",
["xjb" ]="minjangbal",
@@ -13240,6 +13812,7 @@ local features=allocate {
["vkna"]="vertical kana alternates",
["vkrn"]="vertical kerning",
["vpal"]="proportional alternate vertical metrics",
+ ["vrtr"]="vertical alternates for rotation",
["vrt2"]="vertical rotation",
["zero"]="slashed zero",
["trep"]="traditional tex replacements",
@@ -13462,7 +14035,7 @@ if not modules then modules={} end modules ['font-cff']={
license="see context related readme files"
}
local next,type,tonumber,rawget=next,type,tonumber,rawget
-local byte,char,gmatch=string.byte,string.char,string.gmatch
+local byte,char,gmatch,sub=string.byte,string.char,string.gmatch,string.sub
local concat,remove,unpack=table.concat,table.remove,table.unpack
local floor,abs,round,ceil,min,max=math.floor,math.abs,math.round,math.ceil,math.min,math.max
local P,C,R,S,C,Cs,Ct=lpeg.P,lpeg.C,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Ct
@@ -13569,12 +14142,51 @@ local defaultstrings={ [0]=
"Thornsmall","Ydieresissmall","001.000","001.001","001.002","001.003",
"Black","Bold","Book","Light","Medium","Regular","Roman","Semibold",
}
+local standardnames={ [0]=
+ false,false,false,false,false,false,false,false,false,false,false,
+ false,false,false,false,false,false,false,false,false,false,false,
+ false,false,false,false,false,false,false,false,false,false,
+ "space","exclam","quotedbl","numbersign","dollar","percent",
+ "ampersand","quoteright","parenleft","parenright","asterisk","plus",
+ "comma","hyphen","period","slash","zero","one","two","three","four",
+ "five","six","seven","eight","nine","colon","semicolon","less",
+ "equal","greater","question","at","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","bracketleft","backslash","bracketright","asciicircum",
+ "underscore","quoteleft","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","braceleft","bar","braceright","asciitilde",false,false,false,
+ false,false,false,false,false,false,false,false,false,false,false,
+ false,false,false,false,false,false,false,false,false,false,false,
+ false,false,false,false,false,false,false,false,false,"exclamdown",
+ "cent","sterling","fraction","yen","florin","section","currency",
+ "quotesingle","quotedblleft","guillemotleft","guilsinglleft",
+ "guilsinglright","fi","fl",false,"endash","dagger","daggerdbl",
+ "periodcentered",false,"paragraph","bullet","quotesinglbase",
+ "quotedblbase","quotedblright","guillemotright","ellipsis","perthousand",
+ false,"questiondown",false,"grave","acute","circumflex","tilde",
+ "macron","breve","dotaccent","dieresis",false,"ring","cedilla",false,
+ "hungarumlaut","ogonek","caron","emdash",false,false,false,false,
+ false,false,false,false,false,false,false,false,false,false,false,
+ false,"AE",false,"ordfeminine",false,false,false,false,"Lslash",
+ "Oslash","OE","ordmasculine",false,false,false,false,false,"ae",
+ false,false,false,"dotlessi",false,false,"lslash","oslash","oe",
+ "germandbls",false,false,false,false
+}
local cffreaders={
readbyte,
readushort,
readuint,
readulong,
}
+directives.register("fonts.streamreader",function()
+ cffreaders={
+ readbyte,
+ readushort,
+ readuint,
+ readulong,
+ }
+end)
local function readheader(f)
local offset=getposition(f)
local major=readbyte(f)
@@ -13930,6 +14542,7 @@ do
local x=0
local y=0
local width=false
+ local lsb=0
local r=0
local stems=0
local globalbias=0
@@ -13953,6 +14566,9 @@ do
local factors=false
local axis=false
local vsindex=0
+ local justpass=false
+ local seacs={}
+ local procidx=nil
local function showstate(where)
report("%w%-10s : [%s] n=%i",depth*2,where,concat(stack," ",1,top),top)
end
@@ -14492,14 +15108,14 @@ do
top=0
end
local function divide()
- if version==1 then
+ if version=="cff" then
local d=stack[top]
top=top-1
stack[top]=stack[top]/d
end
end
local function closepath()
- if version==1 then
+ if version=="cff" then
if trace_charstrings then
showstate("closepath")
end
@@ -14507,54 +15123,73 @@ do
top=0
end
local function hsbw()
- if version==1 then
+ if version=="cff" then
if trace_charstrings then
showstate("hsbw")
end
+ lsb=stack[top-1] or 0
width=stack[top]
end
top=0
end
- local function seac()
- if version==1 then
+ local function sbw()
+ if version=="cff" then
if trace_charstrings then
- showstate("seac")
+ showstate("sbw")
end
+ lsb=stack[top-3]
+ width=stack[top-1]
end
top=0
end
- local function sbw()
- if version==1 then
+ local function seac()
+ if version=="cff" then
if trace_charstrings then
- showstate("sbw")
+ showstate("seac")
end
- width=stack[top-1]
end
top=0
end
+ local popped=3
+ local hints=3
local function callothersubr()
- if version==1 then
+ if version=="cff" then
if trace_charstrings then
- showstate("callothersubr (unsupported)")
+ showstate("callothersubr")
+ end
+ if stack[top]==hints then
+ popped=stack[top-2]
+ else
+ popped=3
+ end
+ local t=stack[top-1]
+ if t then
+ top=top-(t+2)
+ if top<0 then
+ top=0
+ end
+ else
+ top=0
end
+ else
+ top=0
end
- top=0
end
local function pop()
- if version==1 then
+ if version=="cff" then
if trace_charstrings then
- showstate("pop (unsupported)")
+ showstate("pop")
end
top=top+1
- stack[top]=0
+ stack[top]=popped
else
top=0
end
end
local function setcurrentpoint()
- if version==1 then
+ if version=="cff" then
if trace_charstrings then
- showstate("pop (unsupported)")
+ showstate("setcurrentpoint (unsupported)")
end
x=x+stack[top-1]
y=y+stack[top]
@@ -14680,6 +15315,39 @@ do
vhcurveto,
hvcurveto,
}
+ local reverse={ [0]="unsupported",
+ "getstem",
+ "unsupported",
+ "getstem",
+ "vmoveto",
+ "rlineto",
+ "hlineto",
+ "vlineto",
+ "rrcurveto",
+ "unsupported",
+ "unsupported",
+ "unsupported",
+ "unsupported",
+ "hsbw",
+ "unsupported",
+ "setvsindex",
+ "blend",
+ "unsupported",
+ "getstem",
+ "getmask",
+ "getmask",
+ "rmoveto",
+ "hmoveto",
+ "getstem",
+ "rcurveline",
+ "rlinecurve",
+ "vvcurveto",
+ "hhcurveto",
+ "unsupported",
+ "unsupported",
+ "vhcurveto",
+ "hvcurveto",
+ }
local subactions={
[000]=dotsection,
[001]=getstem3,
@@ -14793,7 +15461,7 @@ do
local function call(scope,list,bias)
depth=depth+1
if top==0 then
- showstate(formatters["unknown %s call"](scope))
+ showstate(formatters["unknown %s call %s, case %s"](scope,"?",1))
top=0
else
local index=stack[top]+bias
@@ -14805,13 +15473,12 @@ do
if tab then
process(tab)
else
- showstate(formatters["unknown %s call %i"](scope,index))
+ showstate(formatters["unknown %s call %s, case %s"](scope,index,2))
top=0
end
end
depth=depth-1
end
- local justpass=false
process=function(tab)
local i=1
local n=#tab
@@ -14875,13 +15542,24 @@ do
i=i+1
local t=tab[i]
if justpass then
- if t>=34 or t<=37 then
+ if t>=34 and t<=37 then
for i=1,top do
r=r+1;result[r]=encode[stack[i]]
end
r=r+1;result[r]=chars[12]
r=r+1;result[r]=chars[t]
top=0
+ elseif t==6 then
+ seacs[procidx]={
+ asb=stack[1],
+ adx=stack[2],
+ ady=stack[3],
+ base=stack[4],
+ accent=stack[5],
+ width=width,
+ lsb=lsb,
+ }
+ top=0
else
local a=subactions[t]
if a then
@@ -14911,44 +15589,52 @@ do
i=i+s+1
elseif t==1 or t==3 or t==18 or operation==23 then
p_getstem()
-if true then
- if top>0 then
- for i=1,top do
- r=r+1;result[r]=encode[stack[i]]
+ if true then
+ if top>0 then
+ for i=1,top do
+ r=r+1;result[r]=encode[stack[i]]
+ end
+ top=0
end
+ r=r+1;result[r]=chars[t]
+ else
top=0
end
- r=r+1;result[r]=chars[t]
-else
- top=0
-end
i=i+1
elseif t==19 or t==20 then
local s=p_getmask() or 0
-if true then
- if top>0 then
- for i=1,top do
- r=r+1;result[r]=encode[stack[i]]
+ if true then
+ if top>0 then
+ for i=1,top do
+ r=r+1;result[r]=encode[stack[i]]
+ end
+ top=0
+ end
+ r=r+1;result[r]=chars[t]
+ for j=1,s do
+ i=i+1
+ r=r+1;result[r]=chars[tab[i]]
end
+ else
+ i=i+s
top=0
end
- r=r+1;result[r]=chars[t]
- for j=1,s do
- i=i+1
- r=r+1;result[r]=chars[tab[i]]
- end
-else
- i=i+s
- top=0
-end
i=i+1
elseif t==9 then
top=0
i=i+1
elseif t==13 then
- local s=hsbw() or 0
- i=i+s+1
+ hsbw()
+ if version=="cff" then
+ r=r+1;result[r]=encode[lsb]
+ r=r+1;result[r]=chars[22]
+ else
+ end
+ i=i+1
else
+ if trace_charstrings then
+ showstate(reverse[t] or "<action>")
+ end
if top>0 then
for i=1,top do
r=r+1;result[r]=encode[stack[i]]
@@ -14969,7 +15655,7 @@ end
end
else
if trace_charstrings then
- showvalue("<action>",t)
+ showstate(reverse[t] or "<action>")
end
top=0
i=i+1
@@ -14977,14 +15663,18 @@ end
end
end
end
- local function setbias(globals,locals)
+ local function setbias(globals,locals,nobias)
+ if nobias then
+ return 0,0
+ else
local g=#globals
local l=#locals
return
((g<1240 and 107) or (g<33900 and 1131) or 32768)+1,
((l<1240 and 107) or (l<33900 and 1131) or 32768)+1
+ end
end
- local function processshape(tab,index)
+ local function processshape(tab,index,hack)
if not tab then
glyphs[index]={
boundingbox={ 0,0,0,0 },
@@ -14997,10 +15687,13 @@ end
x=0
y=0
width=false
+ lsb=0
r=0
top=0
stems=0
result={}
+ popped=3
+ procidx=index
xmin=0
xmax=0
ymin=0
@@ -15014,6 +15707,9 @@ end
updateregions(vsindex)
end
process(tab)
+ if hack then
+ return x,y
+ end
local boundingbox={
round(xmin),
round(ymin),
@@ -15068,6 +15764,8 @@ end
axis=false
regions=data.regions
justpass=streams==true
+ popped=3
+ seacs={}
if regions then
regions={ regions }
axis=data.factors or false
@@ -15081,6 +15779,8 @@ end
locals=false
globals=false
strings=false
+ popped=3
+ seacs={}
end
local function setwidths(private)
if not private then
@@ -15092,7 +15792,7 @@ end
end
return privatedata.nominalwidthx or 0,privatedata.defaultwidthx or 0
end
- parsecharstrings=function(fontdata,data,glphs,doshapes,tversion,streams)
+ parsecharstrings=function(fontdata,data,glphs,doshapes,tversion,streams,nobias)
local dictionary=data.dictionaries[1]
local charstrings=dictionary.charstrings
keepcurve=doshapes
@@ -15103,13 +15803,36 @@ end
charset=dictionary.charset
vsindex=dictionary.vsindex or 0
glyphs=glphs or {}
- globalbias,localbias=setbias(globals,locals)
+ globalbias,localbias=setbias(globals,locals,nobias)
nominalwidth,defaultwidth=setwidths(dictionary.private)
if charstrings then
startparsing(fontdata,data,streams)
for index=1,#charstrings do
processshape(charstrings[index],index-1)
end
+ if justpass and next(seacs) then
+ local charset=data.dictionaries[1].charset
+ if charset then
+ local lookup=table.swapped(charset)
+ for index,v in next,seacs do
+ local bindex=lookup[standardnames[v.base]]
+ local aindex=lookup[standardnames[v.accent]]
+ local bglyph=bindex and glyphs[bindex]
+ local aglyph=aindex and glyphs[aindex]
+ if bglyph and aglyph then
+ local jp=justpass
+ justpass=false
+ local x,y=processshape(charstrings[bindex+1],bindex,true)
+ justpass=jp
+ local base=bglyph.stream
+ local accent=aglyph.stream
+ local moveto=encode[-x-v.asb+v.adx]..chars[22]..encode[-y+v.ady]..chars[ 4]
+ base=sub(base,1,#base-1)
+ glyphs[index].stream=base..moveto..accent
+ end
+ end
+ end
+ end
stopparsing(fontdata,data)
else
report("no charstrings")
@@ -15125,8 +15848,9 @@ end
charset=false
vsindex=dictionary.vsindex or 0
glyphs=glphs or {}
- justpass=streams==true
- globalbias,localbias=setbias(globals,locals)
+ justpass=streams==true
+ seacs={}
+ globalbias,localbias=setbias(globals,locals,nobias)
nominalwidth,defaultwidth=setwidths(dictionary.private)
processshape(tab,index-1)
end
@@ -15385,8 +16109,8 @@ function readers.cff(f,fontdata,specification)
if private then
local data=private.data
if type(data)=="table" then
- cffinfo.defaultwidth=data.defaultwidth or cffinfo.defaultwidth
- cffinfo.nominalwidth=data.nominalwidth or cffinfo.nominalwidth
+ cffinfo.defaultwidth=data.defaultwidthx or cffinfo.defaultwidth
+ cffinfo.nominalwidth=data.nominalwidthx or cffinfo.nominalwidth
cffinfo.bluevalues=data.bluevalues
cffinfo.otherblues=data.otherblues
cffinfo.familyblues=data.familyblues
@@ -16097,7 +16821,14 @@ local function repackpoints(glyphs,shapes)
currentx=px
currenty=py
if lastflag==fl then
- nofflags=nofflags+1
+ if nofflags==255 then
+ lastflag=lastflag+0x08
+ r=r+1 result[r]=char(lastflag,nofflags-1)
+ nofflags=1
+ lastflag=fl
+ else
+ nofflags=nofflags+1
+ end
else
if nofflags==1 then
r=r+1 result[r]=chars[lastflag]
@@ -17875,6 +18606,7 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly
local sets=readarray(f)
sets=readpairsets(f,tableoffset,sets,format1,format2,mainoffset,getdelta)
coverage=readcoverage(f,tableoffset+coverage)
+ local shared={}
for index,newindex in next,coverage do
local set=sets[newindex+1]
local hash={}
@@ -17882,18 +18614,24 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly
local value=set[i]
if value then
local other=value[1]
- local first=value[2]
- local second=value[3]
- if first or second then
- hash[other]={ first,second or nil }
- else
- hash[other]=nil
+ local share=shared[value]
+ if share==nil then
+ local first=value[2]
+ local second=value[3]
+ if first or second then
+ share={ first,second or nil }
+ else
+ share=false
+ end
+ shared[value]=share
end
+ hash[other]=share or nil
end
end
coverage[index]=hash
end
return {
+ shared=shared and true or nil,
format="pair",
coverage=coverage,
}
@@ -17910,6 +18648,7 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly
classdef1=readclassdef(f,tableoffset+classdef1,coverage)
classdef2=readclassdef(f,tableoffset+classdef2,nofglyphs)
local usedcoverage={}
+ local shared={}
for g1,c1 in next,classdef1 do
if coverage[g1] then
local l1=classlist[c1]
@@ -17921,8 +18660,17 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly
local first=offsets[1]
local second=offsets[2]
if first or second then
- hash[paired]={ first,second or nil }
- else
+ local s1=shared[first]
+ if s1==nil then
+ s1={}
+ shared[first]=s1
+ end
+ local s2=s1[second]
+ if s2==nil then
+ s2={ first,second or nil }
+ s1[second]=s2
+ end
+ hash[paired]=s2
end
end
end
@@ -17931,6 +18679,7 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly
end
end
return {
+ shared=shared and true or nil,
format="pair",
coverage=usedcoverage,
}
@@ -19255,6 +20004,8 @@ function readers.cpal(f,fontdata,specification)
fontdata.colorpalettes=palettes
end
end
+local compress=gzip and gzip.compress
+local compressed=compress and gzip.compressed
function readers.svg(f,fontdata,specification)
local tableoffset=gotodatatable(f,fontdata,"svg",specification.glyphs)
if tableoffset then
@@ -19276,10 +20027,14 @@ function readers.svg(f,fontdata,specification)
for i=1,nofentries do
local entry=entries[i]
setposition(f,entry.offset)
+ local data=readstring(f,entry.length)
+ if compressed and not compressed(data) then
+ data=compress(data)
+ end
entries[i]={
first=entry.first,
last=entry.last,
- data=readstring(f,entry.length)
+ data=data
}
end
fontdata.svgshapes=entries
@@ -19316,6 +20071,7 @@ function readers.sbix(f,fontdata,specification)
end
end)
local glyphs={}
+ local delayed=CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 or fonts.handlers.typethree
for i=1,nofstrikes do
local strike=strikes[i]
local strikeppem=strike.ppem
@@ -19332,13 +20088,25 @@ function readers.sbix(f,fontdata,specification)
local datasize=nextoffset-glyphoffset
if datasize>0 then
setposition(f,strikeoffset+glyphoffset)
+ local x=readshort(f)
+ local y=readshort(f)
+ local tag=readtag(f)
+ local size=datasize-8
+ local data=nil
+ local offset=nil
+ if delayed then
+ offset=getposition(f)
+ data=nil
+ else
+ data=readstring(f,size)
+ size=nil
+ end
shapes[i]={
- x=readshort(f),
- y=readshort(f),
- tag=readtag(f),
- data=readstring(f,datasize-8),
- ppem=strikeppem,
- ppi=strikeppi,
+ x=x,
+ y=y,
+ o=offset,
+ s=size,
+ data=data,
}
done=done+1
if done==nofglyphs then
@@ -19517,29 +20285,46 @@ do
end
local default={ width=0,height=0 }
local glyphs=fontdata.glyphs
+ local delayed=CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 or fonts.handlers.typethree
for index,subtable in sortedhash(shapes) do
if type(subtable)=="table" then
local data=nil
+ local size=nil
local metrics=default
local format=subtable.format
local offset=subtable.offsets[index]
setposition(f,offset)
if format==17 then
metrics=getsmallmetrics(f)
- data=readstring(f,readulong(f))
+ size=true
elseif format==18 then
metrics=getbigmetrics(f)
- data=readstring(f,readulong(f))
+ size=true
elseif format==19 then
metrics=subtable.metrics
- data=readstring(f,readulong(f))
+ size=true
+ else
+ end
+ if size then
+ size=readulong(f)
+ if delayed then
+ offset=getposition(f)
+ data=nil
+ else
+ offset=nil
+ data=readstring(f,size)
+ size=nil
+ end
else
+ offset=nil
end
local x=metrics.width
local y=metrics.height
shapes[index]={
x=x,
y=y,
+ o=offset,
+ s=size,
data=data,
}
local glyph=glyphs[index]
@@ -20541,6 +21326,9 @@ local function checklookups(fontdata,missing,nofmissing)
end
end
end
+local firstprivate=fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000
+local puafirst=0xE000
+local pualast=0xF8FF
local function unifymissing(fontdata)
if not fonts.mappings then
require("font-map")
@@ -20551,18 +21339,19 @@ local function unifymissing(fontdata)
resources.unicodes=unicodes
for unicode,d in next,fontdata.descriptions do
if unicode<privateoffset then
- local name=d.name
- if name then
- unicodes[name]=unicode
+ if unicode>=puafirst and unicode<=pualast then
+ else
+ local name=d.name
+ if name then
+ unicodes[name]=unicode
+ end
end
+ else
end
end
fonts.mappings.addtounicode(fontdata,fontdata.filename,checklookups)
resources.unicodes=nil
end
-local firstprivate=fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000
-local puafirst=0xE000
-local pualast=0xF8FF
local function unifyglyphs(fontdata,usenames)
local private=fontdata.private or privateoffset
local glyphs=fontdata.glyphs
@@ -21222,16 +22011,30 @@ function readers.pack(data)
if kind=="gpos_pair" then
local c=step.coverage
if c then
- if step.format=="pair" then
+ if step.format~="pair" then
+ for g1,d1 in next,c do
+ c[g1]=pack_normal(d1)
+ end
+ elseif step.shared then
+ local shared={}
for g1,d1 in next,c do
for g2,d2 in next,d1 do
- local f=d2[1] if f and f~=true then d2[1]=pack_indexed(f) end
- local s=d2[2] if s and s~=true then d2[2]=pack_indexed(s) end
+ if not shared[d2] then
+ local f=d2[1] if f and f~=true then d2[1]=pack_indexed(f) end
+ local s=d2[2] if s and s~=true then d2[2]=pack_indexed(s) end
+ shared[d2]=true
+ end
end
end
+ if pass==2 then
+ step.shared=nil
+ end
else
for g1,d1 in next,c do
- c[g1]=pack_normal(d1)
+ for g2,d2 in next,d1 do
+ local f=d2[1] if f and f~=true then d2[1]=pack_indexed(f) end
+ local s=d2[2] if s and s~=true then d2[2]=pack_indexed(s) end
+ end
end
end
end
@@ -22517,11 +23320,12 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_d
local report_otf=logs.reporter("fonts","otf loading")
local fonts=fonts
local otf=fonts.handlers.otf
-otf.version=3.107
+otf.version=3.111
otf.cache=containers.define("fonts","otl",otf.version,true)
otf.svgcache=containers.define("fonts","svg",otf.version,true)
otf.pngcache=containers.define("fonts","png",otf.version,true)
otf.pdfcache=containers.define("fonts","pdf",otf.version,true)
+otf.mpscache=containers.define("fonts","mps",otf.version,true)
otf.svgenabled=false
otf.pngenabled=false
local otfreaders=otf.readers
@@ -22879,6 +23683,7 @@ local function copytotfm(data,cache_id)
parameters.ascender=abs(metadata.ascender or 0)
parameters.descender=abs(metadata.descender or 0)
parameters.units=units
+ parameters.vheight=metadata.defaultvheight
properties.space=spacer
properties.encodingbytes=2
properties.format=data.format or formats.otf
@@ -23205,7 +24010,7 @@ if not modules then modules={} end modules ['font-oto']={
local concat,unpack=table.concat,table.unpack
local insert,remove=table.insert,table.remove
local format,gmatch,gsub,find,match,lower,strip=string.format,string.gmatch,string.gsub,string.find,string.match,string.lower,string.strip
-local type,next,tonumber,tostring,rawget=type,next,tonumber,tostring,rawget
+local type,next,tonumber,tostring=type,next,tonumber,tostring
local trace_baseinit=false trackers.register("otf.baseinit",function(v) trace_baseinit=v end)
local trace_singles=false trackers.register("otf.singles",function(v) trace_singles=v end)
local trace_multiples=false trackers.register("otf.multiples",function(v) trace_multiples=v end)
@@ -23703,7 +24508,7 @@ local getboth=nuts.getboth
local getdisc=nuts.getdisc
local setdisc=nuts.setdisc
local setoffsets=nuts.setoffsets
-local ischar=nuts.is_char
+local ischar=nuts.ischar
local getkern=nuts.getkern
local setkern=nuts.setkern
local setlink=nuts.setlink
@@ -25134,7 +25939,7 @@ local getprop=nuts.getprop
local setprop=nuts.setprop
local getsubtype=nuts.getsubtype
local getchar=nuts.getchar
-local ischar=nuts.is_char
+local ischar=nuts.ischar
local end_of_math=nuts.end_of_math
local nodecodes=nodes.nodecodes
local disc_code=nodecodes.disc
@@ -25543,7 +26348,6 @@ registertracker("otf.actions","otf.substitutions","otf.positions")
registertracker("otf.sample","otf.steps","otf.substitutions","otf.positions","otf.analyzing")
registertracker("otf.sample.silent","otf.steps=silent","otf.substitutions","otf.positions","otf.analyzing")
local nuts=nodes.nuts
-local getfield=nuts.getfield
local getnext=nuts.getnext
local setnext=nuts.setnext
local getprev=nuts.getprev
@@ -25551,8 +26355,6 @@ local setprev=nuts.setprev
local getboth=nuts.getboth
local setboth=nuts.setboth
local getid=nuts.getid
-local getattr=nuts.getattr
-local setattr=nuts.setattr
local getprop=nuts.getprop
local setprop=nuts.setprop
local getsubtype=nuts.getsubtype
@@ -25561,11 +26363,14 @@ local getchar=nuts.getchar
local setchar=nuts.setchar
local getdisc=nuts.getdisc
local setdisc=nuts.setdisc
+local getreplace=nuts.getreplace
local setlink=nuts.setlink
local getcomponents=nuts.getcomponents
local setcomponents=nuts.setcomponents
local getwidth=nuts.getwidth
-local ischar=nuts.is_char
+local getattr=nuts.getattr
+local getglyphdata=nuts.getglyphdata
+local ischar=nuts.ischar
local isglyph=nuts.isglyph
local usesfont=nuts.uses_font
local insert_node_after=nuts.insert_after
@@ -25576,6 +26381,7 @@ local find_node_tail=nuts.tail
local flush_node_list=nuts.flush_list
local flush_node=nuts.flush_node
local end_of_math=nuts.end_of_math
+local start_of_par=nuts.start_of_par
local setmetatable=setmetatable
local setmetatableindex=table.setmetatableindex
local nextnode=nuts.traversers.node
@@ -27137,7 +27943,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
if keepdisc then
keepdisc=false
lookaheaddisc=current
- local replace=getfield(current,"replace")
+ local replace=getreplace(current)
if not replace then
sweepoverflow=true
sweepnode=current
@@ -27209,7 +28015,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
if notmatchpre[current]~=notmatchreplace[current] then
lookaheaddisc=current
end
- local replace=getfield(current,"replace")
+ local replace=getreplace(current)
while replace and i<s do
if getid(replace)==glyph_code then
i=i+1
@@ -27253,7 +28059,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
if notmatchpost[current]~=notmatchreplace[current] then
backtrackdisc=current
end
- local replace=getfield(current,"replace")
+ local replace=getreplace(current)
while replace and i>1 do
if getid(replace)==glyph_code then
i=i-1
@@ -28057,7 +28863,7 @@ local function testrun(disc,t_run,c_run,...)
end
local pre,post,replace,pretail,posttail,replacetail=getdisc(disc,true)
local renewed=false
- if (post or replace) and prev then
+ if (post or replace) then
if post then
setlink(posttail,next)
else
@@ -28168,7 +28974,7 @@ local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlm
if char then
local a
if attr then
- a=getattr(start,0)
+ a=getglyphdata(start)
end
if not a or (a==attr) then
local lookupmatch=lookupcache[char]
@@ -28202,7 +29008,7 @@ local function t_run_single(start,stop,font,attr,lookupcache)
if char then
local a
if attr then
- a=getattr(start,0)
+ a=getglyphdata(start)
end
local startnext=getnext(start)
if not a or (a==attr) then
@@ -28217,7 +29023,7 @@ local function t_run_single(start,stop,font,attr,lookupcache)
end
while getid(s)==disc_code do
ss=getnext(s)
- s=getfield(s,"replace")
+ s=getreplace(s)
if not s then
s=ss
ss=nil
@@ -28244,12 +29050,13 @@ local function t_run_single(start,stop,font,attr,lookupcache)
end
while getid(s)==disc_code do
ss=getnext(s)
- s=getfield(s,"replace")
+ s=getreplace(s)
if not s then
s=ss
ss=nil
end
end
+lookupmatch=lg
else
break
end
@@ -28277,7 +29084,7 @@ end
local function k_run_single(sub,injection,last,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler)
local a
if attr then
- a=getattr(sub,0)
+ a=getglyphdata(sub)
end
if not a or (a==attr) then
for n in nextnode,sub do
@@ -28311,7 +29118,7 @@ local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlm
if char then
local a
if attr then
- a=getattr(start,0)
+ a=getglyphdata(start)
end
if not a or (a==attr) then
for i=1,nofsteps do
@@ -28352,7 +29159,7 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
if char then
local a
if attr then
- a=getattr(start,0)
+ a=getglyphdata(start)
end
local startnext=getnext(start)
if not a or (a==attr) then
@@ -28370,7 +29177,7 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
end
while getid(s)==disc_code do
ss=getnext(s)
- s=getfield(s,"replace")
+ s=getreplace(s)
if not s then
s=ss
ss=nil
@@ -28397,12 +29204,13 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
end
while getid(s)==disc_code do
ss=getnext(s)
- s=getfield(s,"replace")
+ s=getreplace(s)
if not s then
s=ss
ss=nil
end
end
+lookupmatch=lg
else
break
end
@@ -28430,7 +29238,7 @@ end
local function k_run_multiple(sub,injection,last,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler)
local a
if attr then
- a=getattr(sub,0)
+ a=getglyphdata(sub)
end
if not a or (a==attr) then
for n in nextnode,sub do
@@ -28544,7 +29352,7 @@ do
checkstep(head)
end
local initialrl=0
- if getid(head)==localpar_code and getsubtype(head)==0 then
+ if getid(head)==localpar_code and start_of_par(head) then
initialrl=pardirstate(head)
elseif direction==1 or direction=="TRT" then
initialrl=-1
@@ -28581,7 +29389,7 @@ do
if m then
local a
if attr then
- a=getattr(start,0)
+ a=getglyphdata(start)
end
if not a or (a==attr) then
for i=m[1],m[2] do
@@ -28625,7 +29433,7 @@ do
if lookupmatch then
local a
if attr then
- if getattr(start,0)==attr and (not attribute or getprop(start,a_state)==attribute) then
+ if getglyphdata(start)==attr and (not attribute or getprop(start,a_state)==attribute) then
a=true
end
elseif not attribute or getprop(start,a_state)==attribute then
@@ -28681,7 +29489,7 @@ do
if m then
local a
if attr then
- if getattr(start,0)==attr and (not attribute or getprop(start,a_state)==attribute) then
+ if getglyphdata(start)==attr and (not attribute or getprop(start,a_state)==attribute) then
a=true
end
elseif not attribute or getprop(start,a_state)==attribute then
@@ -28876,19 +29684,27 @@ registerotffeature {
plug=otf.pluginprocessor,
}
}
+local function markinitializer(tfmdata,value)
+ local properties=tfmdata.properties
+ properties.checkmarks=value
+end
+registerotffeature {
+ name="checkmarks",
+ description="check mark widths",
+ default=true,
+ initializers={
+ node=markinitializer,
+ },
+}
otf.handlers=handlers
+if context then
+
+--removed
+
+else
+end
local setspacekerns=nodes.injections.setspacekerns if not setspacekerns then os.exit() end
-local tag="kern"
-if fontfeatures then
- function handlers.trigger_space_kerns(head,dataset,sequence,initialrl,font,attr)
- local features=fontfeatures[font]
- local enabled=features and features.spacekern and features[tag]
- if enabled then
- setspacekerns(font,sequence)
- end
- return head,enabled
- end
-else
+local tag="kern"
function handlers.trigger_space_kerns(head,dataset,sequence,initialrl,font,attr)
local shared=fontdata[font].shared
local features=shared and shared.features
@@ -28898,7 +29714,6 @@ else
end
return head,enabled
end
-end
local function hasspacekerns(data)
local resources=data.resources
local sequences=resources.sequences
@@ -29083,18 +29898,6 @@ registerotffeature {
node=spaceinitializer,
},
}
-local function markinitializer(tfmdata,value)
- local properties=tfmdata.properties
- properties.checkmarks=value
-end
-registerotffeature {
- name="checkmarks",
- description="check mark widths",
- default=true,
- initializers={
- node=markinitializer,
- },
-}
end -- closure
@@ -29107,7 +29910,7 @@ if not modules then modules={} end modules ['font-osd']={
copyright="TAT Zetwerk / PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-local insert,imerge,copy=table.insert,table.imerge,table.copy
+local insert,imerge,copy,tohash=table.insert,table.imerge,table.copy,table.tohash
local next,type=next,type
local report=logs.reporter("otf","devanagari")
fonts=fonts or {}
@@ -29132,7 +29935,7 @@ local setprev=nuts.setprev
local setchar=nuts.setchar
local getprop=nuts.getprop
local setprop=nuts.setprop
-local ischar=nuts.is_char
+local ischar=nuts.ischar
local insert_node_after=nuts.insert_after
local copy_node=nuts.copy
local remove_node=nuts.remove
@@ -29153,6 +29956,7 @@ local s_half=states.half
local s_pref=states.pref
local s_blwf=states.blwf
local s_pstf=states.pstf
+local s_init=states.init
local replace_all_nbsp=nil
replace_all_nbsp=function(head)
replace_all_nbsp=typesetters and typesetters.characters and typesetters.characters.replacenbspaces or function(head)
@@ -29298,15 +30102,10 @@ local zw_char={
[c_zwj ]=true,
}
local dflt_true={
- dflt=true
-}
-local two_defaults={
- dev2=dflt_true,
-}
-local one_defaults={
- dev2=dflt_true,
- deva=dflt_true,
+ dflt=true,
}
+local two_defaults={}
+local one_defaults={}
local false_flags={ false,false,false,false }
local sequence_reorder_matras={
features={ dv01=two_defaults },
@@ -29335,7 +30134,7 @@ local sequence_reorder_reph={
}
}
local sequence_reorder_pre_base_reordering_consonants={
- features={ dv03=two_defaults },
+ features={ dv03=one_defaults },
flags=false_flags,
name="dv03_reorder_pre_base_reordering_consonants",
order={ "dv03" },
@@ -29371,6 +30170,7 @@ local basic_shaping_forms={
rkrf=true,
rphf=true,
vatu=true,
+ locl=true,
}
local valid={
abvs=true,
@@ -29394,6 +30194,7 @@ local valid={
psts=true,
haln=true,
calt=true,
+ locl=true,
}
local scripts={}
local scripts_one={ "deva","mlym","beng","gujr","guru","knda","orya","taml","telu" }
@@ -29404,7 +30205,7 @@ for i=1,nofscripts do
local two=scripts_two[i]
scripts[one]=true
scripts[two]=true
- two_defaults[one]=dflt_true
+ two_defaults[two]=dflt_true
one_defaults[one]=dflt_true
one_defaults[two]=dflt_true
end
@@ -29420,31 +30221,79 @@ local function initializedevanagi(tfmdata)
local gsubfeatures=resources.features.gsub
local sequences=resources.sequences
local sharedfeatures=tfmdata.shared.features
+ gsubfeatures["dv01"]=two_defaults
+ gsubfeatures["dv02"]=two_defaults
+ gsubfeatures["dv03"]=one_defaults
+ gsubfeatures["dv04"]=one_defaults
+ local reorder_pre_base_reordering_consonants=copy(sequence_reorder_pre_base_reordering_consonants)
+ local reorder_reph=copy(sequence_reorder_reph)
+ local reorder_matras=copy(sequence_reorder_matras)
+ local remove_joiners=copy(sequence_remove_joiners)
local lastmatch=0
for s=1,#sequences do
local features=sequences[s].features
if features then
for k,v in next,features do
+ if k=="locl" then
+ local steps=sequences[s].steps
+ local nofsteps=sequences[s].nofsteps
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ for k,v in next,pre_mark do
+ local locl=coverage[k]
+ if locl then
+ if #locl>0 then
+ for j=1,#locl do
+ local ck=locl[j]
+ local f=ck[4]
+ local chainlookups=ck[6]
+ if chainlookups then
+ local chainlookup=chainlookups[f]
+ for j=1,#chainlookup do
+ local chainstep=chainlookup[j]
+ local steps=chainstep.steps
+ local nofsteps=chainstep.nofsteps
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ locl=coverage[k]
+ end
+ end
+ end
+ end
+ end
+ end
+ if locl then
+ reorder_matras.steps[1].coverage[locl]=true
+ end
+ end
+ end
+ end
+ end
+ end
if basic_shaping_forms[k] then
- lastmatch=s
+ lastmatch=lastmatch+1
+ if s~=lastmatch then
+ table.insert(sequences,lastmatch,table.remove(sequences,s))
+ end
end
end
end
end
local insertindex=lastmatch+1
- gsubfeatures["dv01"]=two_defaults
- gsubfeatures["dv02"]=two_defaults
- gsubfeatures["dv03"]=two_defaults
- gsubfeatures["dv04"]=one_defaults
- local reorder_pre_base_reordering_consonants=copy(sequence_reorder_pre_base_reordering_consonants)
- local reorder_reph=copy(sequence_reorder_reph)
- local reorder_matras=copy(sequence_reorder_matras)
- local remove_joiners=copy(sequence_remove_joiners)
+ if tfmdata.properties.language then
+ dflt_true[tfmdata.properties.language]=true
+ end
insert(sequences,insertindex,reorder_pre_base_reordering_consonants)
insert(sequences,insertindex,reorder_reph)
insert(sequences,insertindex,reorder_matras)
insert(sequences,insertindex,remove_joiners)
local blwfcache={}
+ local vatucache={}
+ local pstfcache={}
local seqsubset={}
local rephstep={
coverage={}
@@ -29453,6 +30302,8 @@ local function initializedevanagi(tfmdata)
reph=false,
vattu=false,
blwfcache=blwfcache,
+ vatucache=vatucache,
+ pstfcache=pstfcache,
seqsubset=seqsubset,
reorderreph=rephstep,
}
@@ -29467,17 +30318,89 @@ local function initializedevanagi(tfmdata)
local features=sequence.features
local has_rphf=features.rphf
local has_blwf=features.blwf
- if has_rphf and has_rphf.deva then
+ local has_vatu=features.vatu
+ local has_pstf=features.pstf
+ if has_rphf and has_rphf[script] then
devanagari.reph=true
- elseif has_blwf and has_blwf.deva then
+ elseif (has_blwf and has_blwf[script] ) or (has_vatu and has_vatu[script] ) then
devanagari.vattu=true
for i=1,nofsteps do
local step=steps[i]
local coverage=step.coverage
if coverage then
for k,v in next,coverage do
- if not blwfcache[k] then
- blwfcache[k]=v
+ for h,w in next,halant do
+ if v[h] then
+ if not blwfcache[k] then
+ blwfcache[k]=v
+ end
+ end
+ if has_vatu and has_vatu[script] and not vatucache[k] then
+ vatucache[k]=v
+ end
+ end
+ end
+ end
+ end
+ elseif has_pstf and has_pstf[script] then
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ for k,v in next,coverage do
+ if not pstfcache[k] then
+ pstfcache[k]=v
+ end
+ end
+ for k,v in next,ra do
+ local r=coverage[k]
+ if r then
+ local found=false
+ if #r>0 then
+ for j=1,#r do
+ local ck=r[j]
+ local f=ck[4]
+ local chainlookups=ck[6]
+ if chainlookups and chainlookups[f] then
+ local chainlookup=chainlookups[f]
+ for j=1,#chainlookup do
+ local chainstep=chainlookup[j]
+ local steps=chainstep.steps
+ local nofsteps=chainstep.nofsteps
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ local h=coverage[k]
+ if h then
+ for k,v in next,h do
+ found=v and v.ligature
+ if found then
+ pre_base_reordering_consonants[found]=true
+ break
+ end
+ end
+ if found then
+ break
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ else
+ for k,v in next,r do
+ found=v and v.ligature
+ if found then
+ pre_base_reordering_consonants[found]=true
+ break
+ end
+ end
+ end
+ if found then
+ break
+ end
end
end
end
@@ -29489,17 +30412,53 @@ local function initializedevanagi(tfmdata)
local step=steps[i]
local coverage=step.coverage
if coverage then
- local reph=false
+ local reph,rephbase=false,false
if kind=="rphf" then
for k,v in next,ra do
local r=coverage[k]
if r then
+ rephbase=k
local h=false
- for k,v in next,halant do
- local h=r[k]
- if h then
- reph=h.ligature or false
- break
+ if #r>0 then
+ for j=1,#r do
+ local ck=r[j]
+ local f=ck[4]
+ local chainlookups=ck[6]
+ if chainlookups then
+ local chainlookup=chainlookups[f]
+ for j=1,#chainlookup do
+ local chainstep=chainlookup[j]
+ local steps=chainstep.steps
+ local nofsteps=chainstep.nofsteps
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ local r=coverage[k]
+ if r then
+ for k,v in next,halant do
+ local h=r[k]
+ if h then
+ reph=h.ligature or false
+ break
+ end
+ end
+ if h then
+ break
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ else
+ for k,v in next,halant do
+ local h=r[k]
+ if h then
+ reph=h.ligature or false
+ break
+ end
end
end
if reph then
@@ -29508,7 +30467,7 @@ local function initializedevanagi(tfmdata)
end
end
end
- seqsubset[#seqsubset+1]={ kind,coverage,reph }
+ seqsubset[#seqsubset+1]={ kind,coverage,reph,rephbase }
end
end
end
@@ -29523,11 +30482,46 @@ local function initializedevanagi(tfmdata)
local h=coverage[k]
if h then
local found=false
- for k,v in next,h do
- found=v and v.ligature
- if found then
- pre_base_reordering_consonants[k]=found
- break
+ if #h>0 then
+ for j=1,#h do
+ local ck=h[j]
+ local f=ck[4]
+ local chainlookups=ck[6]
+ if chainlookups then
+ local chainlookup=chainlookups[f]
+ for j=1,#chainlookup do
+ local chainstep=chainlookup[j]
+ local steps=chainstep.steps
+ local nofsteps=chainstep.nofsteps
+ for i=1,nofsteps do
+ local step=steps[i]
+ local coverage=step.coverage
+ if coverage then
+ local h=coverage[k]
+ if h then
+ for k,v in next,h do
+ found=v and v.ligature
+ if found then
+ pre_base_reordering_consonants[found]=true
+ break
+ end
+ end
+ if found then
+ break
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ else
+ for k,v in next,h do
+ found=v and v.ligature
+ if found then
+ pre_base_reordering_consonants[found]=true
+ break
+ end
end
end
if found then
@@ -29540,27 +30534,17 @@ local function initializedevanagi(tfmdata)
end
end
end
- if script=="deva" then
- sharedfeatures["dv04"]=true
- elseif script=="dev2" then
+ if two_defaults[script] then
sharedfeatures["dv01"]=true
sharedfeatures["dv02"]=true
sharedfeatures["dv03"]=true
sharedfeatures["dv04"]=true
- elseif script=="mlym" then
- sharedfeatures["pstf"]=true
- elseif script=="mlm2" then
- sharedfeatures["pstf"]=true
- sharedfeatures["pref"]=true
+ elseif one_defaults[script] then
sharedfeatures["dv03"]=true
- gsubfeatures ["dv03"]=two_defaults
- insert(sequences,insertindex,sequence_reorder_pre_base_reordering_consonants)
- elseif script=="taml" then
sharedfeatures["dv04"]=true
-sharedfeatures["pstf"]=true
- elseif script=="tml2" then
- else
- report("todo: enable the right features for script %a",script)
+ end
+ if script=="mlym" or script=="taml" then
+ devanagari.left_matra_before_base=true
end
end
end
@@ -29593,6 +30577,8 @@ local function initialize_one(font,attr)
reph=false,
vattu=false,
blwfcache={},
+ vatucache={},
+ pstfcache={},
}
datasets.devanagari=devanagaridata
local resources=tfmdata.resources
@@ -29603,17 +30589,80 @@ local function initialize_one(font,attr)
local kind=dataset[4]
if kind=="rphf" then
devanagaridata.reph=true
- elseif kind=="blwf" then
+ elseif kind=="blwf" or kind=="vatu" then
devanagaridata.vattu=true
devanagaridata.blwfcache=devanagari.blwfcache
+ devanagaridata.vatucache=devanagari.vatucache
+ devanagaridata.pstfcache=devanagari.pstfcache
+ end
+ end
+ end
+ end
+ return devanagaridata.reph,devanagaridata.vattu,devanagaridata.blwfcache,devanagaridata.vatucache,devanagaridata.pstfcache
+end
+local function contextchain(contexts,n)
+ local char=getchar(n)
+ for k=1,#contexts do
+ local ck=contexts[k]
+ local seq=ck[3]
+ local f=ck[4]
+ local l=ck[5]
+ if (l-f)==1 and seq[f+1][char] then
+ local ok=true
+ local c=n
+ for i=l+1,#seq do
+ c=getnext(c)
+ if not c or not seq[i][ischar(c)] then
+ ok=false
+ break
+ end
+ end
+ if ok then
+ c=getprev(n)
+ for i=1,f-1 do
+ c=getprev(c)
+ if not c or not seq[f-i][ischar(c)] then
+ ok=false
+ end
+ end
+ end
+ if ok then
+ return true
+ end
+ end
+ end
+ return false
+end
+local function order_matras(c)
+ local cn=getnext(c)
+ local char=getchar(cn)
+ while dependent_vowel[char] do
+ local next=getnext(cn)
+ local cc=c
+ local cchar=getchar(cc)
+ while cc~=cn do
+ if (above_mark[char] and (below_mark[cchar] or post_mark[cchar])) or (below_mark[char] and (post_mark[cchar])) then
+ local prev,next=getboth(cn)
+ if next then
+ setprev(next,prev)
end
+ setnext(prev,next)
+ setnext(getprev(cc),cn)
+ setprev(cn,getprev(cc))
+ setnext(cn,cc)
+ setprev(cc,cn)
+ break
end
+ cc=getnext(cc)
+ cchar=getchar(cc)
end
+ cn=next
+ char=getchar(cn)
end
- return devanagaridata.reph,devanagaridata.vattu,devanagaridata.blwfcache
end
local function reorder_one(head,start,stop,font,attr,nbspaces)
- local reph,vattu,blwfcache=initialize_one(font,attr)
+ local reph,vattu,blwfcache,vatucache,pstfcache=initialize_one(font,attr)
+ local devanagari=fontdata[font].resources.devanagari
local current=start
local n=getnext(start)
local base=nil
@@ -29696,6 +30745,8 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
base=current
elseif blwfcache[char] then
setprop(current,a_state,s_blwf)
+ elseif pstfcache[char] then
+ setprop(current,a_state,s_pstf)
else
base=current
end
@@ -29764,7 +30815,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
end
current=next
end
- if base~=stop and getprop(base,a_state) then
+ if base~=stop and getprop(base,a_state) then
local next=getnext(base)
if halant[getchar(next)] and not (next~=stop and getchar(getnext(next))==c_zwj) then
setprop(base,a_state,unsetvalue)
@@ -29792,6 +30843,16 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
n=getnext(n)
ch=getchar(n)
end
+ local tpm=twopart_mark[ch]
+ while tpm do
+ local extra=copy_node(n)
+ copyinjection(extra,n)
+ ch=tpm[1]
+ setchar(n,ch)
+ setchar(extra,tpm[2])
+ head=insert_node_after(head,current,extra)
+ tpm=twopart_mark[ch]
+ end
while c~=stop and dependent_vowel[ch] do
c=n
n=getnext(n)
@@ -29815,9 +30876,44 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
local last=getnext(c)
while cn~=last do
if pre_mark[getchar(cn)] then
- if bp then
- setnext(bp,cn)
+ if devanagari.left_matra_before_base then
+ local prev,next=getboth(cn)
+ setlink(prev,next)
+ if cn==stop then
+ stop=getprev(cn)
+ end
+ if base==start then
+ if head==start then
+ head=cn
+ end
+ start=cn
+ end
+ setlink(getprev(base),cn)
+ setlink(cn,base)
+ cn=next
+ else
+ if bp then
+ setnext(bp,cn)
+ end
+ local prev,next=getboth(cn)
+ if next then
+ setprev(next,prev)
+ end
+ setnext(prev,next)
+ if cn==stop then
+ stop=prev
+ end
+ setprev(cn,bp)
+ setlink(cn,firstcons)
+ if firstcons==start then
+ if head==start then
+ head=cn
+ end
+ start=cn
+ end
+ cn=next
end
+ elseif current~=base and dependent_vowel[getchar(cn)] then
local prev,next=getboth(cn)
if next then
setprev(next,prev)
@@ -29826,17 +30922,19 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
if cn==stop then
stop=prev
end
- setprev(cn,bp)
- setlink(cn,firstcons)
- if firstcons==start then
- if head==start then
- head=cn
- end
- start=cn
+ setlink(b,cn,getnext(b))
+ order_matras(cn)
+ cn=next
+ elseif current==base and dependent_vowel[getchar(cn)] then
+ local cnn=getnext(cn)
+ order_matras(cn)
+ cn=cnn
+ while cn~=last and dependent_vowel[getchar(cn)] do
+ cn=getnext(cn)
end
- break
+ else
+ cn=getnext(cn)
end
- cn=getnext(cn)
end
allreordered=c==stop
current=getnext(c)
@@ -29878,7 +30976,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
local cp=getprev(current)
local cnsn=getnext(cns)
setlink(cp,n)
- setlink(cns,current)
+ setlink(cns,current)
setlink(c,cnsn)
if c==stop then
stop=cp
@@ -29894,6 +30992,13 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
if halant[getchar(next)] then
cns=next
end
+ if not vatucache[char] then
+ next=getnext(cns)
+ while dependent_vowel[getchar(next)] do
+ cns=next
+ next=getnext(cns)
+ end
+ end
elseif char==c_nbsp then
nbspaces=nbspaces+1
cns=current
@@ -29901,6 +31006,13 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
if halant[getchar(next)] then
cns=next
end
+ if not vatucache[char] then
+ next=getnext(cns)
+ while dependent_vowel[getchar(next)] do
+ cns=next
+ next=getnext(cns)
+ end
+ end
end
end
current=getnext(current)
@@ -29908,6 +31020,9 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
end
if getchar(base)==c_nbsp then
nbspaces=nbspaces-1
+ if base==stop then
+ stop=getprev(stop)
+ end
head=remove_node(head,base)
flush_node(base)
end
@@ -29921,7 +31036,7 @@ function handlers.devanagari_reorder_matras(head,start)
local char=ischar(current,startfont)
local next=getnext(current)
if char and getprop(current,a_syllabe)==startattr then
- if halant[char] and not getprop(current,a_state) then
+ if halant[char] then
if next then
local char=ischar(next,startfont)
if char and zw_char[char] and getprop(next,a_syllabe)==startattr then
@@ -29943,6 +31058,7 @@ function handlers.devanagari_reorder_matras(head,start)
end
return head,start,true
end
+local rephbase={}
function handlers.devanagari_reorder_reph(head,start)
local current=getnext(start)
local startnext=nil
@@ -29950,44 +31066,29 @@ function handlers.devanagari_reorder_reph(head,start)
local startfont=getfont(start)
local startattr=getprop(start,a_syllabe)
::step_1::
- ::step_2::
- while current do
- local char=ischar(current,startfont)
- if char and getprop(current,a_syllabe)==startattr then
- if halant[char] and not getprop(current,a_state) then
- local next=getnext(current)
- if next then
- local nextchar=ischar(next,startfont)
- if nextchar and zw_char[nextchar] and getprop(next,a_syllabe)==startattr then
- current=next
- next=getnext(current)
- end
- end
- startnext=getnext(start)
- head=remove_node(head,start)
- setlink(start,next)
- setlink(current,start)
- start=startnext
- startattr=getprop(start,a_syllabe)
- break
- end
- current=getnext(current)
- else
- break
- end
+ local char=ischar(start,startfont)
+ local rephbase=rephbase[startfont][char]
+ if char and after_subscript[rephbase] then
+ goto step_5
end
- ::step_3::
- ::step_4::
- if not startnext then
- current=getnext(start)
+ ::step_2::
+ if char and not after_postscript[rephbase] then
while current do
local char=ischar(current,startfont)
if char and getprop(current,a_syllabe)==startattr then
- if getprop(current,a_state)==s_pstf then
+ if halant[char] then
+ local next=getnext(current)
+ if next then
+ local nextchar=ischar(next,startfont)
+ if nextchar and zw_char[nextchar] and getprop(next,a_syllabe)==startattr then
+ current=next
+ next=getnext(current)
+ end
+ end
startnext=getnext(start)
head=remove_node(head,start)
- setlink(getprev(current),start)
- setlink(start,current)
+ setlink(start,next)
+ setlink(current,start)
start=startnext
startattr=getprop(start,a_syllabe)
break
@@ -29998,6 +31099,63 @@ function handlers.devanagari_reorder_reph(head,start)
end
end
end
+ ::step_3::
+ if not startnext then
+ if char and after_main[rephbase] then
+ current=getnext(start)
+ while current do
+ local char=ischar(current,startfont)
+ if char and getprop(current,a_syllabe)==startattr then
+ if consonant[char] and not getprop(current,a_state)==s_pref then
+ startnext=getnext(start)
+ head=remove_node(head,start)
+ setlink(current,start)
+ setlink(start,getnext(current))
+ start=startnext
+ startattr=getprop(start,a_syllabe)
+ break
+ end
+ current=getnext(current)
+ else
+ break
+ end
+ end
+ end
+ end
+ ::step_4::
+ if not startnext then
+ if char and before_postscript[rephbase] then
+ current=getnext(start)
+ local c=nil
+ while current do
+ local char=ischar(current,startfont)
+ if char and getprop(current,a_syllabe)==startattr then
+ if getprop(current,a_state)==s_pstf then
+ startnext=getnext(start)
+ head=remove_node(head,start)
+ setlink(getprev(current),start)
+ setlink(start,current)
+ start=startnext
+ startattr=getprop(start,a_syllabe)
+ break
+ elseif not c and (vowel_modifier[char] or stress_tone_mark[char] ) then
+ c=current
+ end
+ current=getnext(current)
+ else
+ if c then
+ startnext=getnext(start)
+ head=remove_node(head,start)
+ setlink(getprev(c),start)
+ setlink(start,c)
+ start=startnext
+ startattr=getprop(start,a_syllabe)
+ end
+ break
+ end
+ end
+ end
+ end
::step_5::
if not startnext then
current=getnext(start)
@@ -30005,7 +31163,10 @@ function handlers.devanagari_reorder_reph(head,start)
while current do
local char=ischar(current,startfont)
if char and getprop(current,a_syllabe)==startattr then
- if not c and mark_above_below_post[char] and not after_subscript[char] then
+ local state=getprop(current,a_state)
+ if before_subscript[rephbase] and (state==s_blwf or state==s_pstf) then
+ c=current
+ elseif after_subscript[rephbase] and (state==s_pstf) then
c=current
end
current=getnext(current)
@@ -30045,63 +31206,64 @@ function handlers.devanagari_reorder_reph(head,start)
end
return head,start,true
end
+local reordered_pre_base_reordering_consonants={}
function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start)
- local current=start
- local startnext=nil
- local startprev=nil
+ if reordered_pre_base_reordering_consonants[start] then
+ return head,start,true
+ end
+ local current=start
local startfont=getfont(start)
local startattr=getprop(start,a_syllabe)
while current do
local char=ischar(current,startfont)
+ local next=getnext(current)
if char and getprop(current,a_syllabe)==startattr then
- local next=getnext(current)
- if halant[char] and not getprop(current,a_state) then
+ if halant[char] then
if next then
- local nextchar=ischar(next,startfont)
- if nextchar and getprop(next,a_syllabe)==startattr then
- if nextchar==c_zwnj or nextchar==c_zwj then
- current=next
- next=getnext(current)
- end
+ local char=ischar(next,startfont)
+ if char and zw_char[char] and getprop(next,a_syllabe)==startattr then
+ current=next
+ next=getnext(current)
end
end
- startnext=getnext(start)
- removenode(start,start)
+ local startnext=getnext(start)
+ head=remove_node(head,start)
setlink(start,next)
setlink(current,start)
+ reordered_pre_base_reordering_consonants[start]=true
start=startnext
- break
+ return head,start,true
end
- current=next
else
break
end
+ current=next
end
- if not startnext then
- current=getnext(start)
- startattr=getprop(start,a_syllabe)
- while current do
- local char=ischar(current,startfont)
- if char and getprop(current,a_syllabe)==startattr then
- if not consonant[char] and getprop(current,a_state) then
- startnext=getnext(start)
- removenode(start,start)
- setlink(getprev(current),start)
- setlink(start,current)
- start=startnext
- break
- end
- current=getnext(current)
+ local startattr=getprop(start,a_syllabe)
+ local current=getprev(start)
+ while current and getprop(current,a_syllabe)==startattr do
+ local char=ischar(current)
+ if (not dependent_vowel[char] and not getprop(current,a_state) or getprop(current,a_state)==s_init) then
+ startnext=getnext(start)
+ head=remove_node(head,start)
+ if current==head then
+ setlink(start,current)
+ head=start
else
- break
+ setlink(getprev(current),start)
+ setlink(start,current)
end
+ reordered_pre_base_reordering_consonants[start]=true
+ start=startnext
+ break
end
+ current=getprev(current)
end
return head,start,true
end
function handlers.devanagari_remove_joiners(head,start,kind,lookupname,replacement)
local stop=getnext(start)
- local font=getfont(start)
+ local font=getfont(start)
local last=start
while stop do
local char=ischar(stop,font)
@@ -30135,28 +31297,28 @@ local function initialize_two(font,attr)
end
local function reorder_two(head,start,stop,font,attr,nbspaces)
local seqsubset,reorderreph=initialize_two(font,attr)
- local reph=false
local halfpos=nil
local basepos=nil
local subpos=nil
local postpos=nil
- local locl={}
+ reorderreph.coverage={}
+ rephbase[font]={}
for i=1,#seqsubset do
local subset=seqsubset[i]
local kind=subset[1]
local lookupcache=subset[2]
if kind=="rphf" then
- reph=subset[3]
+ reorderreph.coverage[subset[3]]=true
+ rephbase[font][subset[3]]=subset[4]
local current=start
local last=getnext(stop)
while current~=last do
if current~=stop then
- local c=locl[current] or getchar(current)
+ local c=getchar(current)
local found=lookupcache[c]
if found then
local next=getnext(current)
- local n=locl[next] or getchar(next)
- if found[n] then
+ if found[getchar(next)] or contextchain(found,next) then
local afternext=next~=stop and getnext(next)
if afternext and zw_char[getchar(afternext)] then
current=afternext
@@ -30176,15 +31338,16 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
local last=getnext(stop)
while current~=last do
if current~=stop then
- local c=locl[current] or getchar(current)
+ local c=getchar(current)
local found=lookupcache[c]
if found then
local next=getnext(current)
- local n=locl[next] or getchar(next)
- if found[n] then
- setprop(current,a_state,s_pref)
- setprop(next,a_state,s_pref)
- current=next
+ if found[getchar(next)] or contextchain(found,next) then
+ if (not getprop(current,a_state) and not getprop(next,a_state)) then
+ setprop(current,a_state,s_pref)
+ setprop(next,a_state,s_pref)
+ current=next
+ end
end
end
end
@@ -30195,15 +31358,14 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
local last=getnext(stop)
while current~=last do
if current~=stop then
- local c=locl[current] or getchar(current)
+ local c=getchar(current)
local found=lookupcache[c]
if found then
local next=getnext(current)
- local n=locl[next] or getchar(next)
- if found[n] then
+ if found[getchar(next)] or contextchain(found,next) then
if next~=stop and getchar(getnext(next))==c_zwnj then
current=next
- else
+ elseif (not getprop(current,a_state)) then
setprop(current,a_state,s_half)
if not halfpos then
halfpos=current
@@ -30215,21 +31377,22 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
end
current=getnext(current)
end
- elseif kind=="blwf" then
+ elseif kind=="blwf" or kind=="vatu" then
local current=start
local last=getnext(stop)
while current~=last do
if current~=stop then
- local c=locl[current] or getchar(current)
+ local c=getchar(current)
local found=lookupcache[c]
if found then
local next=getnext(current)
- local n=locl[next] or getchar(next)
- if found[n] then
- setprop(current,a_state,s_blwf)
- setprop(next,a_state,s_blwf)
- current=next
- subpos=current
+ if found[getchar(next)] or contextchain(found,next) then
+ if (not getprop(current,a_state) and not getprop(next,a_state)) then
+ setprop(current,a_state,s_blwf)
+ setprop(next,a_state,s_blwf)
+ current=next
+ subpos=current
+ end
end
end
end
@@ -30240,16 +31403,17 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
local last=getnext(stop)
while current~=last do
if current~=stop then
- local c=locl[current] or getchar(current)
+ local c=getchar(current)
local found=lookupcache[c]
if found then
local next=getnext(current)
- local n=locl[next] or getchar(next)
- if found[n] then
- setprop(current,a_state,s_pstf)
- setprop(next,a_state,s_pstf)
- current=next
- postpos=current
+ if found[getchar(next)] or contextchain(found,next) then
+ if (not getprop(current,a_state) and not getprop(next,a_state)) then
+ setprop(current,a_state,s_pstf)
+ setprop(next,a_state,s_pstf)
+ current=next
+ postpos=current
+ end
end
end
end
@@ -30257,7 +31421,6 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
end
end
end
- reorderreph.coverage={ [reph]=true }
local current,base,firstcons=start,nil,nil
if getprop(start,a_state)==s_rphf then
current=getnext(getnext(start))
@@ -30318,7 +31481,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
firstcons=current
end
local a=getprop(current,a_state)
- if not (a==s_pref or a==s_blwf or a==s_pstf) then
+ if not (a==s_blwf or a==s_pstf or (a~=s_rphf and a~=s_blwf and ra[getchar(current)])) then
base=current
end
end
@@ -30335,7 +31498,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
end
return head,stop,nbspaces
else
- if getprop(base,a_state) then
+ if getprop(base,a_state) then
setprop(base,a_state,unsetvalue)
end
basepos=base
@@ -30353,34 +31516,59 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
local current=start
local last=getnext(stop)
while current~=last do
- local char,target,cn=locl[current] or getchar(current),nil,getnext(current)
+ local char=getchar(current)
+ local target=nil
+ local cn=getnext(current)
local tpm=twopart_mark[char]
- if tpm then
+ while tpm do
local extra=copy_node(current)
copyinjection(extra,current)
char=tpm[1]
setchar(current,char)
setchar(extra,tpm[2])
head=insert_node_after(head,current,extra)
+ tpm=twopart_mark[char]
end
if not moved[current] and dependent_vowel[char] then
- if pre_mark[char] then
+ if pre_mark[char] then
moved[current]=true
local prev,next=getboth(current)
setlink(prev,next)
if current==stop then
stop=getprev(current)
end
- if halfpos==start then
+ local pos
+ if before_main[char] then
+ pos=basepos
+ else
+ pos=halfpos
+ end
+ local ppos=getprev(pos)
+ while ppos and getprop(ppos,a_syllabe)==getprop(pos,a_syllabe) do
+ if getprop(ppos,a_state)==s_pref then
+ pos=ppos
+ end
+ ppos=getprev(ppos)
+ end
+ local ppos=getprev(pos)
+ while ppos and getprop(ppos,a_syllabe)==getprop(pos,a_syllabe) and halant[ischar(ppos)] do
+ ppos=getprev(ppos)
+ if ppos and getprop(ppos,a_syllabe)==getprop(pos,a_syllabe) and consonant[ischar(ppos)] then
+ pos=ppos
+ ppos=getprev(ppos)
+ else
+ break
+ end
+ end
+ if pos==start then
if head==start then
head=current
end
start=current
end
- setlink(getprev(halfpos),current)
- setlink(current,halfpos)
- halfpos=current
- elseif above_mark[char] then
+ setlink(getprev(pos),current)
+ setlink(current,pos)
+ elseif above_mark[char] then
target=basepos
if subpos==basepos then
subpos=current
@@ -30389,13 +31577,23 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
postpos=current
end
basepos=current
- elseif below_mark[char] then
+ elseif below_mark[char] then
target=subpos
if postpos==subpos then
postpos=current
end
subpos=current
- elseif post_mark[char] then
+ elseif post_mark[char] then
+ local n=getnext(postpos)
+ while n do
+ local v=ischar(n,font)
+ if nukta[v] or stress_tone_mark[v] or vowel_modifier[v] then
+ postpos=n
+ else
+ break
+ end
+ n=getnext(n)
+ end
target=postpos
postpos=current
end
@@ -30414,7 +31612,35 @@ local function reorder_two(head,start,stop,font,attr,nbspaces)
end
current=cn
end
- local current,c=start,nil
+ local current=getnext(start)
+ local last=getnext(stop)
+ while current~=last do
+ local char=getchar(current)
+ local cn=getnext(current)
+ if halant[char] and ra[ischar(cn)] and getprop(cn,a_state)~=s_rphf and getprop(cn,a_state)~=s_blwf then
+ if after_main[ischar(cn)] then
+ local prev=getprev(current)
+ local next=getnext(cn)
+ local bpn=getnext(basepos)
+ while bpn and dependent_vowel[ischar(bpn)] do
+ basepos=bpn
+ bpn=getnext(bpn)
+ end
+ if basepos~=prev then
+ setlink(prev,next)
+ setlink(cn,getnext(basepos))
+ setlink(basepos,current)
+ if cn==stop then
+ stop=prev
+ end
+ cn=next
+ end
+ end
+ end
+ current=cn
+ end
+ local current=start
+ local c=nil
while current~=stop do
local char=getchar(current)
if halant[char] or stress_tone_mark[char] then
@@ -30533,7 +31759,25 @@ local function analyze_next_chars_one(c,font,variant)
if not v then
return c
end
- if dependent_vowel[v] then
+ local already_pre_mark
+ local already_above_mark
+ local already_below_mark
+ local already_post_mark
+ while dependent_vowel[v] do
+ local vowels=twopart_mark[v] or { v }
+ for k,v in next,vowels do
+ if pre_mark[v] and not already_pre_mark then
+ already_pre_mark=true
+ elseif above_mark[v] and not already_above_mark then
+ already_above_mark=true
+ elseif below_mark[v] and not already_below_mark then
+ already_below_mark=true
+ elseif post_mark[v] and not already_post_mark then
+ already_post_mark=true
+ else
+ return c
+ end
+ end
c=getnext(c)
n=getnext(c)
if not n then
@@ -30699,7 +31943,25 @@ local function analyze_next_chars_two(c,font)
end
end
else
- if dependent_vowel[v] then
+ local already_pre_mark
+ local already_above_mark
+ local already_below_mark
+ local already_post_mark
+ while dependent_vowel[v] do
+ local vowels=twopart_mark[v] or { v }
+ for k,v in next,vowels do
+ if pre_mark[v] and not already_pre_mark then
+ already_pre_mark=true
+ elseif above_mark[v] and not already_above_mark then
+ already_above_mark=true
+ elseif below_mark[v] and not already_below_mark then
+ already_below_mark=true
+ elseif post_mark[v] and not already_post_mark then
+ already_post_mark=true
+ else
+ return c
+ end
+ end
c=n
n=getnext(c)
if not n then
@@ -30766,6 +32028,7 @@ local function method_one(head,font,attr)
local start=true
local done=false
local nbspaces=0
+ local syllabe=0
while current do
local char=ischar(current,font)
if char then
@@ -30902,6 +32165,15 @@ local function method_one(head,font,attr)
end
end
if syllablestart~=syllableend then
+ if syllableend then
+ syllabe=syllabe+1
+ local c=syllablestart
+ local n=getnext(syllableend)
+ while c~=n do
+ setprop(c,a_syllabe,syllabe)
+ c=getnext(c)
+ end
+ end
head,current,nbspaces=reorder_one(head,syllablestart,syllableend,font,attr,nbspaces)
current=getnext(current)
end
@@ -30940,6 +32212,20 @@ local function method_one(head,font,attr)
if nbspaces>0 then
head=replace_all_nbsp(head)
end
+ current=head
+ local n=0
+ while current do
+ local char=ischar(current,font)
+ if char then
+ if n==0 and not getprop(current,a_state) then
+ setprop(current,a_state,s_init)
+ end
+ n=n+1
+ else
+ n=0
+ end
+ current=getnext(current)
+ end
return head,done
end
local function method_two(head,font,attr)
@@ -31008,7 +32294,7 @@ local function method_two(head,font,attr)
end
if not syllableend and show_syntax_errors then
local char=ischar(current,font)
- if char and not getprop(current,a_state) then
+ if char and not getprop(current,a_state) then
local mark=mark_four[char]
if mark then
head,current=inject_syntax_error(head,current,char)
@@ -31021,6 +32307,20 @@ local function method_two(head,font,attr)
if nbspaces>0 then
head=replace_all_nbsp(head)
end
+ current=head
+ local n=0
+ while current do
+ local char=ischar(current,font)
+ if char then
+ if n==0 and not getprop(current,a_state) then
+ setprop(current,a_state,s_init)
+ end
+ n=n+1
+ else
+ n=0
+ end
+ current=getnext(current)
+ end
return head,done
end
for i=1,nofscripts do
@@ -31039,9 +32339,13 @@ if not modules then modules={} end modules ['font-ocl']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 then
+ return
+end
local tostring,tonumber,next=tostring,tonumber,next
local round,max=math.round,math.round
-local sortedkeys,sortedhash=table.sortedkeys,table.sortedhash
+local gsub,find=string.gsub,string.find
+local sortedkeys,sortedhash,concat=table.sortedkeys,table.sortedhash,table.concat
local setmetatableindex=table.setmetatableindex
local formatters=string.formatters
local tounicode=fonts.mappings.tounicode
@@ -31051,6 +32355,7 @@ local rightcommand=helpers.commands.right
local leftcommand=helpers.commands.left
local downcommand=helpers.commands.down
local otf=fonts.handlers.otf
+local otfregister=otf.features.register
local f_color=formatters["%.3f %.3f %.3f rg"]
local f_gray=formatters["%.3f g"]
if context then
@@ -31107,7 +32412,7 @@ end
local start={ "pdf","mode","font" }
local push={ "pdf","page","q" }
local pop={ "pdf","page","Q" }
-local function initialize(tfmdata,kind,value)
+local function initializeoverlay(tfmdata,kind,value)
if value then
local resources=tfmdata.resources
local palettes=resources.colorpalettes
@@ -31149,52 +32454,39 @@ local function initialize(tfmdata,kind,value)
local s=#colorlist
local goback=w~=0 and leftcommand[w] or nil
local t={
- start,
- not u and actualb or { "pdf","page",(getactualtext(tounicode(u))) }
+ not u and actualb or { "pdf","page",(getactualtext(tounicode(u))) },
+ push,
}
local n=2
local l=nil
- local f=false
for i=1,s do
local entry=colorlist[i]
local v=colorvalues[entry.class] or default
if v and l~=v then
- if f then
- n=n+1 t[n]=pop
- end
- n=n+1 t[n]=push
- f=true
n=n+1 t[n]=v
l=v
- else
- if f then
- n=n+1 t[n]=pop
- end
- f=false
- l=nil
end
n=n+1 t[n]=charcommand[entry.slot]
if s>1 and i<s and goback then
n=n+1 t[n]=goback
end
end
- if f then
- n=n+1 t[n]=pop
- end
+ n=n+1 t[n]=pop
n=n+1 t[n]=actuale
character.commands=t
end
end
end
+ return true
end
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name="colr",
description="color glyphs",
manipulators={
- base=initialize,
- node=initialize,
+ base=initializeoverlay,
+ node=initializeoverlay,
}
}
do
@@ -31203,32 +32495,17 @@ do
local f_used=context and formatters[ [[original:///%s]] ] or formatters[ [[%s]] ]
local hashed={}
local cache={}
- if epdf then
- local openpdf=epdf.openMemStream
- function otf.storepdfdata(pdf)
- local done=hashed[pdf]
- if not done then
- nofstreams=nofstreams+1
- local o,n=openpdf(pdf,#pdf,f_name(nofstreams))
- cache[n]=o
- done=f_used(n)
- hashed[pdf]=done
- end
- return done
- end
- else
- local openpdf=pdfe.new
- function otf.storepdfdata(pdf)
- local done=hashed[pdf]
- if not done then
- nofstreams=nofstreams+1
- local f=f_name(nofstreams)
- local n=openpdf(pdf,#pdf,f)
- done=f_used(n)
- hashed[pdf]=done
- end
- return done
+ local openpdf=pdfe.new
+ function otf.storepdfdata(pdf)
+ local done=hashed[pdf]
+ if not done then
+ nofstreams=nofstreams+1
+ local f=f_name(nofstreams)
+ local n=openpdf(pdf,#pdf,f)
+ done=f_used(n)
+ hashed[pdf]=done
end
+ return done
end
end
local function pdftovirtual(tfmdata,pdfshapes,kind)
@@ -31260,14 +32537,20 @@ local function pdftovirtual(tfmdata,pdfshapes,kind)
local data=nil
local dx=nil
local dy=nil
+ local scale=1
if typ=="table" then
data=pdf.data
- dx=pdf.dx or 0
- dy=pdf.dy or 0
+ dx=pdf.x or pdf.dx or 0
+ dy=pdf.y or pdf.dy or 0
+ scale=pdf.scale or 1
elseif typ=="string" then
data=pdf
dx=0
dy=0
+ elseif typ=="number" then
+ data=pdf
+ dx=0
+ dy=0
end
if data then
local bt=unicode and getactualtext(unicode)
@@ -31276,9 +32559,9 @@ local function pdftovirtual(tfmdata,pdfshapes,kind)
local dp=character.depth or 0
character.commands={
not unicode and actualb or { "pdf","page",(getactualtext(unicode)) },
- downcommand[dp+dy*hfactor],
- rightcommand[dx*hfactor],
- vfimage(wd,ht,dp,data,name),
+ downcommand [dp+dy*hfactor],
+ rightcommand[ dx*hfactor],
+ vfimage(scale*wd,ht,dp,data,pdfshapes.filename or ""),
actuale,
}
character[kind]=true
@@ -31312,24 +32595,26 @@ do
name="otfsvg",
program="inkscape",
method="pipeto",
- template="--shell > temp-otf-svg-shape.log",
+ template="--export-area-drawing --shell > temp-otf-svg-shape.log",
reporter=report_svg,
}
if not runner then
runner=function()
- return io.open("inkscape --shell > temp-otf-svg-shape.log","w")
+ return io.popen("inkscape --export-area-drawing --shell > temp-otf-svg-shape.log","w")
end
end
- function otfsvg.topdf(svgshapes)
+ function otfsvg.topdf(svgshapes,tfmdata)
local pdfshapes={}
local inkscape=runner()
if inkscape then
+ local descriptions=tfmdata.descriptions
local nofshapes=#svgshapes
local f_svgfile=formatters["temp-otf-svg-shape-%i.svg"]
local f_pdffile=formatters["temp-otf-svg-shape-%i.pdf"]
local f_convert=formatters["%s --export-pdf=%s\n"]
local filterglyph=otfsvg.filterglyph
local nofdone=0
+ local processed={}
report_svg("processing %i svg containers",nofshapes)
statistics.starttiming()
for i=1,nofshapes do
@@ -31341,24 +32626,51 @@ do
local pdffile=f_pdffile(index)
savedata(svgfile,data)
inkscape:write(f_convert(svgfile,pdffile))
- pdfshapes[index]=true
+ processed[index]=true
nofdone=nofdone+1
- if nofdone%100==0 then
- report_svg("%i shapes processed",nofdone)
+ if nofdone%25==0 then
+ report_svg("%i shapes submitted",nofdone)
end
end
end
end
+ if nofdone%25~=0 then
+ report_svg("%i shapes submitted",nofdone)
+ end
+ report_svg("processing can be going on for a while")
inkscape:write("quit\n")
inkscape:close()
report_svg("processing %i pdf results",nofshapes)
- for index in next,pdfshapes do
+ for index in next,processed do
local svgfile=f_svgfile(index)
local pdffile=f_pdffile(index)
- pdfshapes[index]=loaddata(pdffile)
+ local pdfdata=loaddata(pdffile)
+ if pdfdata and pdfdata~="" then
+ pdfshapes[index]={
+ data=pdfdata,
+ }
+ end
remove(svgfile)
remove(pdffile)
end
+ local characters=tfmdata.characters
+ for k,v in next,characters do
+ local d=descriptions[k]
+ local i=d.index
+ if i then
+ local p=pdfshapes[i]
+ if p then
+ local w=d.width
+ local l=d.boundingbox[1]
+ local r=d.boundingbox[3]
+ p.scale=(r-l)/w
+ p.x=l
+ end
+ end
+ end
+ if not next(pdfshapes) then
+ report_svg("there are no converted shapes, fix your setup")
+ end
statistics.stoptiming()
if statistics.elapsedseconds then
report_svg("svg conversion time %s",statistics.elapsedseconds() or "-")
@@ -31377,19 +32689,20 @@ local function initializesvg(tfmdata,kind,value)
end
local pdffile=containers.read(otf.pdfcache,hash)
local pdfshapes=pdffile and pdffile.pdfshapes
- if not pdfshapes or pdffile.timestamp~=timestamp then
+ if not pdfshapes or pdffile.timestamp~=timestamp or not next(pdfshapes) then
local svgfile=containers.read(otf.svgcache,hash)
local svgshapes=svgfile and svgfile.svgshapes
- pdfshapes=svgshapes and otfsvg.topdf(svgshapes) or {}
+ pdfshapes=svgshapes and otfsvg.topdf(svgshapes,tfmdata,otf.pdfcache.writable,hash) or {}
containers.write(otf.pdfcache,hash,{
pdfshapes=pdfshapes,
timestamp=timestamp,
})
end
pdftovirtual(tfmdata,pdfshapes,"svg")
+ return true
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name="svg",
description="svg glyphs",
manipulators={
@@ -31472,9 +32785,10 @@ local function initializepng(tfmdata,kind,value)
})
end
pdftovirtual(tfmdata,pdfshapes,"png")
+ return true
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name="sbix",
description="sbix glyphs",
manipulators={
@@ -31482,7 +32796,7 @@ fonts.handlers.otf.features.register {
node=initializepng,
}
}
-fonts.handlers.otf.features.register {
+otfregister {
name="cblc",
description="cblc glyphs",
manipulators={
@@ -31490,6 +32804,11 @@ fonts.handlers.otf.features.register {
node=initializepng,
}
}
+if context then
+
+--removed
+
+end
end -- closure
@@ -31513,9 +32832,10 @@ local fonts=fonts
local otf=fonts.handlers.otf
local registerotffeature=otf.features.register
local setmetatableindex=table.setmetatableindex
-local checkmerge=fonts.helpers.checkmerge
-local checkflags=fonts.helpers.checkflags
-local checksteps=fonts.helpers.checksteps
+local fonthelpers=fonts.helpers
+local checkmerge=fonthelpers.checkmerge
+local checkflags=fonthelpers.checkflags
+local checksteps=fonthelpers.checksteps
local normalized={
substitution="substitution",
single="substitution",
@@ -31637,6 +32957,7 @@ local function addfeature(data,feature,specifications)
local done=0
local skip=0
local aglunicodes=false
+ local privateslot=fonthelpers.privateslot
local specifications=validspecification(specifications,feature)
if not specifications then
return
@@ -31659,6 +32980,12 @@ local function addfeature(data,feature,specifications)
return u
end
end
+ if privateslot then
+ u=privateslot(code)
+ if u then
+ return u
+ end
+ end
local u=lpegmatch(p,code)
if u then
return u
@@ -31688,7 +33015,7 @@ local function addfeature(data,feature,specifications)
replacement=replacement[1]
end
replacement=tounicode(replacement)
- if replacement and descriptions[replacement] then
+ if replacement and (nocheck or descriptions[replacement]) then
cover(coverage,unicode,replacement)
done=done+1
else
@@ -32058,7 +33385,6 @@ local function addfeature(data,feature,specifications)
local featuretype=normalized[specification.type or "substitution"] or "substitution"
local featureflags=specification.flags or noflags
local nocheck=specification.nocheck
- local futuresteps=specification.futuresteps
local featureorder=specification.order or { feature }
local featurechain=(featuretype=="chainsubstitution" or featuretype=="chainposition") and 1 or 0
local nofsteps=0
@@ -32255,7 +33581,7 @@ if not modules then modules={} end modules ['font-onr']={
license="see context related readme files"
}
local fonts,logs,trackers,resolvers=fonts,logs,trackers,resolvers
-local next,type,tonumber,rawget,rawset=next,type,tonumber,rawget,rawset
+local next,type,tonumber,rawset=next,type,tonumber,rawset
local match,lower,gsub,strip,find=string.match,string.lower,string.gsub,string.strip,string.find
local char,byte,sub=string.char,string.byte,string.sub
local abs=math.abs
@@ -32410,7 +33736,7 @@ do
}
},
}
- fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,"cff",streams)
+ fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,"cff",streams,true)
else
lpegmatch(p_filternames,binary,1,filename)
end
@@ -33017,8 +34343,9 @@ local function copytotfm(data)
local filename=constructors.checkedfilename(resources)
local fontname=metadata.fontname or metadata.fullname
local fullname=metadata.fullname or metadata.fontname
- local endash=0x0020
+ local endash=0x2013
local emdash=0x2014
+ local space=0x0020
local spacer="space"
local spaceunits=500
local monospaced=metadata.monospaced
@@ -33029,26 +34356,32 @@ local function copytotfm(data)
parameters.italicangle=italicangle
parameters.charwidth=charwidth
parameters.charxheight=charxheight
+ local d_endash=descriptions[endash]
+ local d_emdash=descriptions[emdash]
+ local d_space=descriptions[space]
+ if not d_space or d_space==0 then
+ d_space=d_endash
+ end
+ if d_space then
+ spaceunits,spacer=d_space.width or 0,"space"
+ end
if properties.monospaced then
- if descriptions[endash] then
- spaceunits,spacer=descriptions[endash].width,"space"
- end
- if not spaceunits and descriptions[emdash] then
- spaceunits,spacer=descriptions[emdash].width,"emdash"
- end
- if not spaceunits and charwidth then
- spaceunits,spacer=charwidth,"charwidth"
+ if spaceunits==0 and d_emdash then
+ spaceunits,spacer=d_emdash.width or 0,"emdash"
end
else
- if descriptions[endash] then
- spaceunits,spacer=descriptions[endash].width,"space"
- end
- if not spaceunits and charwidth then
- spaceunits,spacer=charwidth,"charwidth"
+ if spaceunits==0 and d_endash then
+ spaceunits,spacer=d_emdash.width or 0,"endash"
end
end
- spaceunits=tonumber(spaceunits)
- if spaceunits<200 then
+ if spaceunits==0 and charwidth then
+ spaceunits,spacer=charwidth or 0,"charwidth"
+ end
+ if spaceunits==0 then
+ spaceunits=tonumber(spaceunits) or 500
+ end
+ if spaceunits==0 then
+ spaceunits=500
end
parameters.slant=0
parameters.space=spaceunits
@@ -33496,7 +34829,7 @@ end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules={} end modules ['font-tfm']={
+if not modules then modules={} end modules ['luatex-fonts-tfm']={
version=1.001,
comment="companion to font-ini.mkiv",
author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -33532,7 +34865,7 @@ local registertfmenhancer=tfmenhancers.register
local charcommand=helpers.commands.char
constructors.resolvevirtualtoo=false
fonts.formats.tfm="type1"
-fonts.formats.ofm="type1"
+fonts.formats.ofm="type1"
function tfm.setfeatures(tfmdata,features)
local okay=constructors.initializefeatures("tfm",tfmdata,features,trace_features,report_tfm)
if okay then
@@ -33541,191 +34874,156 @@ function tfm.setfeatures(tfmdata,features)
return {}
end
end
-local depth={}
-local read_from_tfm,check_tfm do
- local tfmreaders=context and tfm.readers
- local loadtfmvf=tfmreaders and tfmreaders.loadtfmvf
- local loadtfm=font.read_tfm
- local loadvf=font.read_vf
- directives.register("fonts.tfm.builtin",function(v)
- loadtfmvf=tfmreaders and tfmreaders.loadtfmvf
- if v and loadtfm then
- loadtfmvf=false
- end
- end)
- read_from_tfm=function(specification)
- local filename=specification.filename
- local size=specification.size
- depth[filename]=(depth[filename] or 0)+1
- if trace_defining then
- report_defining("loading tfm file %a at size %s",filename,size)
- end
- local tfmdata
- if loadtfmvf then
- tfmdata=loadtfmvf(filename,size)
- else
- tfmdata=loadtfm(filename,size)
+local depth={}
+local loadtfm=font.read_tfm
+local loadvf=font.read_vf
+local function read_from_tfm(specification)
+ local filename=specification.filename
+ local size=specification.size
+ depth[filename]=(depth[filename] or 0)+1
+ if trace_defining then
+ report_defining("loading tfm file %a at size %s",filename,size)
+ end
+ local tfmdata=loadtfm(filename,size)
+ if tfmdata then
+ local features=specification.features and specification.features.normal or {}
+ local features=constructors.checkedfeatures("tfm",features)
+ specification.features.normal=features
+ local newtfmdata=(depth[filename]==1) and tfm.reencode(tfmdata,specification)
+ if newtfmdata then
+ tfmdata=newtfmdata
end
- if tfmdata then
- local features=specification.features and specification.features.normal or {}
- local features=constructors.checkedfeatures("tfm",features)
- specification.features.normal=features
- local newtfmdata=(depth[filename]==1) and tfm.reencode(tfmdata,specification)
- if newtfmdata then
- tfmdata=newtfmdata
- end
- local resources=tfmdata.resources or {}
- local properties=tfmdata.properties or {}
- local parameters=tfmdata.parameters or {}
- local shared=tfmdata.shared or {}
- shared.features=features
- shared.resources=resources
- properties.name=tfmdata.name
- properties.fontname=tfmdata.fontname
- properties.psname=tfmdata.psname
- properties.fullname=tfmdata.fullname
- properties.filename=specification.filename
- properties.format=tfmdata.format or fonts.formats.tfm
- properties.usedbitmap=tfmdata.usedbitmap
- tfmdata.properties=properties
- tfmdata.resources=resources
- tfmdata.parameters=parameters
- tfmdata.shared=shared
- shared.rawdata={ resources=resources }
- shared.features=features
- if newtfmdata then
- if not resources.marks then
- resources.marks={}
- end
- if not resources.sequences then
- resources.sequences={}
- end
- if not resources.features then
- resources.features={
- gsub={},
- gpos={},
- }
- end
- if not tfmdata.changed then
- tfmdata.changed={}
- end
- if not tfmdata.descriptions then
- tfmdata.descriptions=tfmdata.characters
- end
- otf.readers.addunicodetable(tfmdata)
- tfmenhancers.apply(tfmdata,filename)
- constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm)
- otf.readers.unifymissing(tfmdata)
- fonts.mappings.addtounicode(tfmdata,filename)
- tfmdata.tounicode=1
- local tounicode=fonts.mappings.tounicode
- for unicode,v in next,tfmdata.characters do
- local u=v.unicode
- if u then
- v.tounicode=tounicode(u)
- end
- end
- if tfmdata.usedbitmap then
- tfm.addtounicode(tfmdata)
- end
- end
- shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil
- if size<0 then
- size=idiv(65536*-size,100)
- end
- parameters.factor=1
- parameters.units=1000
- parameters.size=size
- parameters.slant=parameters.slant or parameters[1] or 0
- parameters.space=parameters.space or parameters[2] or 0
- parameters.space_stretch=parameters.space_stretch or parameters[3] or 0
- parameters.space_shrink=parameters.space_shrink or parameters[4] or 0
- parameters.x_height=parameters.x_height or parameters[5] or 0
- parameters.quad=parameters.quad or parameters[6] or 0
- parameters.extra_space=parameters.extra_space or parameters[7] or 0
- constructors.enhanceparameters(parameters)
- properties.private=properties.private or tfmdata.private or privateoffset
- if newtfmdata then
- elseif loadtfmvf then
- local fonts=tfmdata.fonts
- if fonts then
- for i=1,#fonts do
- local font=fonts[i]
- local id=font.id
- if not id then
- local name=font.name
- local size=font.size
- if name and size then
- local data,id=constructors.readanddefine(name,size)
- if id then
- font.id=id
- font.name=nil
- font.size=nil
- end
- end
- end
- end
- end
- elseif constructors.resolvevirtualtoo then
- fonts.loggers.register(tfmdata,file.suffix(filename),specification)
- local vfname=findbinfile(specification.name,'ovf')
- if vfname and vfname~="" then
- local vfdata=loadvf(vfname,size)
- if vfdata then
- local chars=tfmdata.characters
- for k,v in next,vfdata.characters do
- chars[k].commands=v.commands
- end
- properties.virtualized=true
- tfmdata.fonts=vfdata.fonts
- tfmdata.type="virtual"
- local fontlist=vfdata.fonts
- local name=file.nameonly(filename)
- for i=1,#fontlist do
- local n=fontlist[i].name
- local s=fontlist[i].size
- local d=depth[filename]
- s=constructors.scaled(s,vfdata.designsize)
- if d>tfm.maxnestingdepth then
- report_defining("too deeply nested virtual font %a with size %a, max nesting depth %s",n,s,tfm.maxnestingdepth)
- fontlist[i]={ id=0 }
- elseif (d>1) and (s>tfm.maxnestingsize) then
- report_defining("virtual font %a exceeds size %s",n,s)
- fontlist[i]={ id=0 }
- else
- local t,id=constructors.readanddefine(n,s)
- fontlist[i]={ id=id }
- end
+ local resources=tfmdata.resources or {}
+ local properties=tfmdata.properties or {}
+ local parameters=tfmdata.parameters or {}
+ local shared=tfmdata.shared or {}
+ shared.features=features
+ shared.resources=resources
+ properties.name=tfmdata.name
+ properties.fontname=tfmdata.fontname
+ properties.psname=tfmdata.psname
+ properties.fullname=tfmdata.fullname
+ properties.filename=specification.filename
+ properties.format=tfmdata.format or fonts.formats.tfm
+ properties.usedbitmap=tfmdata.usedbitmap
+ tfmdata.properties=properties
+ tfmdata.resources=resources
+ tfmdata.parameters=parameters
+ tfmdata.shared=shared
+ shared.rawdata={ resources=resources }
+ shared.features=features
+ if newtfmdata then
+ if not resources.marks then
+ resources.marks={}
+ end
+ if not resources.sequences then
+ resources.sequences={}
+ end
+ if not resources.features then
+ resources.features={
+ gsub={},
+ gpos={},
+ }
+ end
+ if not tfmdata.changed then
+ tfmdata.changed={}
+ end
+ if not tfmdata.descriptions then
+ tfmdata.descriptions=tfmdata.characters
+ end
+ otf.readers.addunicodetable(tfmdata)
+ tfmenhancers.apply(tfmdata,filename)
+ constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm)
+ otf.readers.unifymissing(tfmdata)
+ fonts.mappings.addtounicode(tfmdata,filename)
+ tfmdata.tounicode=1
+ local tounicode=fonts.mappings.tounicode
+ for unicode,v in next,tfmdata.characters do
+ local u=v.unicode
+ if u then
+ v.tounicode=tounicode(u)
+ end
+ end
+ if tfmdata.usedbitmap then
+ tfm.addtounicode(tfmdata)
+ end
+ end
+ shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil
+ if size<0 then
+ size=idiv(65536*-size,100)
+ end
+ parameters.factor=1
+ parameters.units=1000
+ parameters.size=size
+ parameters.slant=parameters.slant or parameters[1] or 0
+ parameters.space=parameters.space or parameters[2] or 0
+ parameters.space_stretch=parameters.space_stretch or parameters[3] or 0
+ parameters.space_shrink=parameters.space_shrink or parameters[4] or 0
+ parameters.x_height=parameters.x_height or parameters[5] or 0
+ parameters.quad=parameters.quad or parameters[6] or 0
+ parameters.extra_space=parameters.extra_space or parameters[7] or 0
+ constructors.enhanceparameters(parameters)
+ properties.private=properties.private or tfmdata.private or privateoffset
+ if newtfmdata then
+ elseif constructors.resolvevirtualtoo then
+ fonts.loggers.register(tfmdata,file.suffix(filename),specification)
+ local vfname=findbinfile(specification.name,'ovf')
+ if vfname and vfname~="" then
+ local vfdata=loadvf(vfname,size)
+ if vfdata then
+ local chars=tfmdata.characters
+ for k,v in next,vfdata.characters do
+ chars[k].commands=v.commands
+ end
+ properties.virtualized=true
+ tfmdata.fonts=vfdata.fonts
+ tfmdata.type="virtual"
+ local fontlist=vfdata.fonts
+ local name=file.nameonly(filename)
+ for i=1,#fontlist do
+ local n=fontlist[i].name
+ local s=fontlist[i].size
+ local d=depth[filename]
+ s=constructors.scaled(s,vfdata.designsize)
+ if d>tfm.maxnestingdepth then
+ report_defining("too deeply nested virtual font %a with size %a, max nesting depth %s",n,s,tfm.maxnestingdepth)
+ fontlist[i]={ id=0 }
+ elseif (d>1) and (s>tfm.maxnestingsize) then
+ report_defining("virtual font %a exceeds size %s",n,s)
+ fontlist[i]={ id=0 }
+ else
+ local t,id=constructors.readanddefine(n,s)
+ fontlist[i]={ id=id }
end
end
end
end
- properties.haskerns=true
- properties.hasligatures=true
- properties.hasitalics=true
- resources.unicodes={}
- resources.lookuptags={}
- depth[filename]=depth[filename]-1
- return tfmdata
- else
- depth[filename]=depth[filename]-1
end
+ properties.haskerns=true
+ properties.hasligatures=true
+ properties.hasitalics=true
+ resources.unicodes={}
+ resources.lookuptags={}
+ depth[filename]=depth[filename]-1
+ return tfmdata
+ else
+ depth[filename]=depth[filename]-1
end
- check_tfm=function(specification,fullname)
- local foundname=findbinfile(fullname,'tfm') or ""
- if foundname=="" then
- foundname=findbinfile(fullname,'ofm') or ""
- end
- if foundname=="" then
- foundname=fonts.names.getfilename(fullname,"tfm") or ""
- end
- if foundname~="" then
- specification.filename=foundname
- specification.format="ofm"
- return read_from_tfm(specification)
- elseif trace_defining then
- report_defining("loading tfm with name %a fails",specification.name)
- end
+end
+local function check_tfm(specification,fullname)
+ local foundname=findbinfile(fullname,'tfm') or ""
+ if foundname=="" then
+ foundname=findbinfile(fullname,'ofm') or ""
+ end
+ if foundname=="" then
+ foundname=fonts.names.getfilename(fullname,"tfm") or ""
+ end
+ if foundname~="" then
+ specification.filename=foundname
+ specification.format="ofm"
+ return read_from_tfm(specification)
+ elseif trace_defining then
+ report_defining("loading tfm with name %a fails",specification.name)
end
end
readers.check_tfm=check_tfm
@@ -34120,7 +35418,6 @@ local variants=allocate()
specifiers.variants=variants
definers.methods=definers.methods or {}
local internalized=allocate()
-local lastdefined=nil
local loadedfonts=constructors.loadedfonts
local designsizes=constructors.designsizes
local resolvefile=fontgoodies and fontgoodies.filenames and fontgoodies.filenames.resolve or function(s) return s end
@@ -34381,9 +35678,6 @@ function constructors.readanddefine(name,size)
end
return fontdata[id],id
end
-function definers.current()
- return lastdefined
-end
function definers.registered(hash)
local id=internalized[hash]
return id,id and fontdata[id]
@@ -34434,7 +35728,6 @@ function definers.read(specification,size,id)
end
end
end
- lastdefined=tfmdata or id
if not tfmdata then
report_defining("unknown font %a, loading aborted",specification.name)
elseif trace_defining and type(tfmdata)=="table" then
@@ -34450,7 +35743,9 @@ end
function font.getfont(id)
return fontdata[id]
end
-callbacks.register('define_font',definers.read,"definition of fonts (tfmdata preparation)")
+if not context then
+ callbacks.register('define_font',definers.read,"definition of fonts (tfmdata preparation)")
+end
end -- closure
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-tfm.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-tfm.lua
new file mode 100644
index 00000000000..0b6e09a8f95
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-tfm.lua
@@ -0,0 +1,654 @@
+if not modules then modules = { } end modules ['luatex-fonts-tfm'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This is the generic tfm/vf loader. There are no fundamental differences with
+-- the one used in ConTeXt but we save some byte(codes) this way.
+
+local next, type = next, type
+local match, format = string.match, string.format
+local concat, sortedhash = table.concat, table.sortedhash
+local idiv = number.idiv
+
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+local trace_features = false trackers.register("tfm.features", function(v) trace_features = v end)
+
+local report_defining = logs.reporter("fonts","defining")
+local report_tfm = logs.reporter("fonts","tfm loading")
+
+local findbinfile = resolvers.findbinfile
+local setmetatableindex = table.setmetatableindex
+
+local fonts = fonts
+local handlers = fonts.handlers
+local helpers = fonts.helpers
+local readers = fonts.readers
+local constructors = fonts.constructors
+local encodings = fonts.encodings
+
+local tfm = constructors.handlers.tfm
+tfm.version = 1.000
+tfm.maxnestingdepth = 5
+tfm.maxnestingsize = 65536*1024
+
+local otf = fonts.handlers.otf
+local otfenhancers = otf.enhancers
+
+local tfmfeatures = constructors.features.tfm
+local registertfmfeature = tfmfeatures.register
+
+local tfmenhancers = constructors.enhancers.tfm
+local registertfmenhancer = tfmenhancers.register
+
+local charcommand = helpers.commands.char
+
+constructors.resolvevirtualtoo = false -- wil be set in font-ctx.lua
+
+fonts.formats.tfm = "type1" -- we need to have at least a value here
+fonts.formats.ofm = "type1" -- we need to have at least a value here
+
+function tfm.setfeatures(tfmdata,features)
+ local okay = constructors.initializefeatures("tfm",tfmdata,features,trace_features,report_tfm)
+ if okay then
+ return constructors.collectprocessors("tfm",tfmdata,features,trace_features,report_tfm)
+ else
+ return { } -- will become false
+ end
+end
+
+local depth = { } -- table.setmetatableindex("number")
+
+local loadtfm = font.read_tfm
+local loadvf = font.read_vf
+
+local function read_from_tfm(specification)
+ local filename = specification.filename
+ local size = specification.size
+ depth[filename] = (depth[filename] or 0) + 1
+ if trace_defining then
+ report_defining("loading tfm file %a at size %s",filename,size)
+ end
+ local tfmdata = loadtfm(filename,size)
+ if tfmdata then
+
+ local features = specification.features and specification.features.normal or { }
+ local features = constructors.checkedfeatures("tfm",features)
+ specification.features.normal = features
+
+ -- If reencode returns a new table, we assume that we're doing something
+ -- special. An 'auto' reencode picks up its vector from the pfb file.
+
+ local newtfmdata = (depth[filename] == 1) and tfm.reencode(tfmdata,specification)
+ if newtfmdata then
+ tfmdata = newtfmdata
+ end
+
+ local resources = tfmdata.resources or { }
+ local properties = tfmdata.properties or { }
+ local parameters = tfmdata.parameters or { }
+ local shared = tfmdata.shared or { }
+ --
+ shared.features = features
+ shared.resources = resources
+ --
+ properties.name = tfmdata.name -- todo: fallback
+ properties.fontname = tfmdata.fontname -- todo: fallback
+ properties.psname = tfmdata.psname -- todo: fallback
+ properties.fullname = tfmdata.fullname -- todo: fallback
+ properties.filename = specification.filename -- todo: fallback
+ properties.format = tfmdata.format or fonts.formats.tfm -- better than nothing
+ properties.usedbitmap = tfmdata.usedbitmap
+ --
+ tfmdata.properties = properties
+ tfmdata.resources = resources
+ tfmdata.parameters = parameters
+ tfmdata.shared = shared
+ --
+ shared.rawdata = { resources = resources }
+ shared.features = features
+ --
+ -- The next branch is only entered when we have a proper encoded file i.e.
+ -- unicodes and such. It really nakes no sense to do feature juggling when
+ -- we have no names and unicodes.
+ --
+ if newtfmdata then
+ --
+ -- Some opentype processing assumes these to be present:
+ --
+ if not resources.marks then
+ resources.marks = { }
+ end
+ if not resources.sequences then
+ resources.sequences = { }
+ end
+ if not resources.features then
+ resources.features = {
+ gsub = { },
+ gpos = { },
+ }
+ end
+ if not tfmdata.changed then
+ tfmdata.changed = { }
+ end
+ if not tfmdata.descriptions then
+ tfmdata.descriptions = tfmdata.characters
+ end
+ --
+ -- It might be handy to have this:
+ --
+ otf.readers.addunicodetable(tfmdata)
+ --
+ -- We make a pseudo opentype font, e.g. kerns and ligatures etc:
+ --
+ tfmenhancers.apply(tfmdata,filename)
+ --
+ -- Now user stuff can kick in.
+ --
+ constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm)
+ --
+ -- As that can also mess with names and such, we are now ready for finalizing
+ -- the unicode information. This is a different order that for instance type one
+ -- (afm) files. First we try to deduce unicodes from already present information.
+ --
+ otf.readers.unifymissing(tfmdata)
+ --
+ -- Next we fill in the gaps, based on names from teh agl. Probably not much will
+ -- happen here.
+ --
+ fonts.mappings.addtounicode(tfmdata,filename)
+ --
+ -- The tounicode data is passed to the backend that constructs the vectors for us.
+ --
+ tfmdata.tounicode = 1
+ local tounicode = fonts.mappings.tounicode
+ for unicode, v in next, tfmdata.characters do
+ local u = v.unicode
+ if u then
+ v.tounicode = tounicode(u)
+ end
+ end
+ --
+ -- However, when we use a bitmap font those vectors can't be constructed because
+ -- that information is not carried with those fonts (there is no name info, nor
+ -- proper index info, nor unicodes at that end). So, we provide it ourselves.
+ --
+ if tfmdata.usedbitmap then
+ tfm.addtounicode(tfmdata)
+ end
+ end
+ --
+ shared.processes = next(features) and tfm.setfeatures(tfmdata,features) or nil
+ --
+ if size < 0 then
+ size = idiv(65536 * -size,100)
+ end
+ parameters.factor = 1 -- already scaled
+ parameters.units = 1000 -- just in case
+ parameters.size = size
+ parameters.slant = parameters.slant or parameters[1] or 0
+ parameters.space = parameters.space or parameters[2] or 0
+ parameters.space_stretch = parameters.space_stretch or parameters[3] or 0
+ parameters.space_shrink = parameters.space_shrink or parameters[4] or 0
+ parameters.x_height = parameters.x_height or parameters[5] or 0
+ parameters.quad = parameters.quad or parameters[6] or 0
+ parameters.extra_space = parameters.extra_space or parameters[7] or 0
+ --
+ constructors.enhanceparameters(parameters) -- official copies for us
+ --
+ properties.private = properties.private or tfmdata.private or privateoffset
+ --
+ if newtfmdata then
+ --
+ -- We do nothing as we assume flat tfm files. It would become real messy
+ -- otherwise and I don't have something for testing on my system anyway.
+ --
+ elseif constructors.resolvevirtualtoo then
+ fonts.loggers.register(tfmdata,file.suffix(filename),specification) -- strange, why here
+ local vfname = findbinfile(specification.name, 'ovf')
+ if vfname and vfname ~= "" then
+ local vfdata = loadvf(vfname,size)
+ if vfdata then
+ local chars = tfmdata.characters
+ for k,v in next, vfdata.characters do
+ chars[k].commands = v.commands
+ end
+ properties.virtualized = true
+ tfmdata.fonts = vfdata.fonts
+ tfmdata.type = "virtual" -- else nested calls with cummulative scaling
+ local fontlist = vfdata.fonts
+ local name = file.nameonly(filename)
+ for i=1,#fontlist do
+ local n = fontlist[i].name
+ local s = fontlist[i].size
+ local d = depth[filename]
+ s = constructors.scaled(s,vfdata.designsize)
+ if d > tfm.maxnestingdepth then
+ report_defining("too deeply nested virtual font %a with size %a, max nesting depth %s",n,s,tfm.maxnestingdepth)
+ fontlist[i] = { id = 0 }
+ elseif (d > 1) and (s > tfm.maxnestingsize) then
+ report_defining("virtual font %a exceeds size %s",n,s)
+ fontlist[i] = { id = 0 }
+ else
+ local t, id = constructors.readanddefine(n,s)
+ fontlist[i] = { id = id }
+ end
+ end
+ end
+ end
+ end
+ --
+ properties.haskerns = true
+ properties.hasligatures = true
+ properties.hasitalics = true
+ resources.unicodes = { }
+ resources.lookuptags = { }
+ --
+ depth[filename] = depth[filename] - 1
+ --
+ return tfmdata
+ else
+ depth[filename] = depth[filename] - 1
+ end
+end
+
+local function check_tfm(specification,fullname) -- we could split up like afm/otf
+ local foundname = findbinfile(fullname, 'tfm') or ""
+ if foundname == "" then
+ foundname = findbinfile(fullname, 'ofm') or "" -- not needed in context
+ end
+ if foundname == "" then
+ foundname = fonts.names.getfilename(fullname,"tfm") or ""
+ end
+ if foundname ~= "" then
+ specification.filename = foundname
+ specification.format = "ofm"
+ return read_from_tfm(specification)
+ elseif trace_defining then
+ report_defining("loading tfm with name %a fails",specification.name)
+ end
+end
+
+readers.check_tfm = check_tfm
+
+function readers.tfm(specification)
+ local fullname = specification.filename or ""
+ if fullname == "" then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ fullname = specification.name .. "." .. forced
+ else
+ fullname = specification.name
+ end
+ end
+ return check_tfm(specification,fullname)
+end
+
+readers.ofm = readers.tfm
+
+-- The reencoding acts upon the 'reencode' feature which can have values 'auto' or
+-- an enc file. You can also specify a 'pfbfile' feature (but it defaults to the
+-- tfm filename) and a 'bitmap' feature. When no enc file is givven (auto) we will
+-- get the vectors from the pfb file.
+
+do
+
+ local outfiles = { }
+
+ local tfmcache = table.setmetatableindex(function(t,tfmdata)
+ local id = font.define(tfmdata)
+ t[tfmdata] = id
+ return id
+ end)
+
+ local encdone = table.setmetatableindex("table")
+
+ function tfm.reencode(tfmdata,specification)
+
+ local features = specification.features
+
+ if not features then
+ return
+ end
+
+ local features = features.normal
+
+ if not features then
+ return
+ end
+
+ local tfmfile = file.basename(tfmdata.name)
+ local encfile = features.reencode -- or features.enc
+ local pfbfile = features.pfbfile -- or features.pfb
+ local bitmap = features.bitmap -- or features.pk
+
+ if not encfile then
+ return
+ end
+
+ local pfbfile = outfiles[tfmfile]
+
+ if pfbfile == nil then
+ if bitmap then
+ pfbfile = false
+ elseif type(pfbfile) ~= "string" then
+ pfbfile = tfmfile
+ end
+ if type(pfbfile) == "string" then
+ pfbfile = file.addsuffix(pfbfile,"pfb")
+ -- pdf.mapline(tfmfile .. "<" .. pfbfile)
+ report_tfm("using type1 shapes from %a for %a",pfbfile,tfmfile)
+ else
+ report_tfm("using bitmap shapes for %a",tfmfile)
+ pfbfile = false -- use bitmap
+ end
+ outfiles[tfmfile] = pfbfile
+ end
+
+ local encoding = false
+ local vector = false
+
+ if type(pfbfile) == "string" then
+ local pfb = constructors.handlers.pfb
+ if pfb and pfb.loadvector then
+ local v, e = pfb.loadvector(pfbfile)
+ if v then
+ vector = v
+ end
+ if e then
+ encoding = e
+ end
+ end
+ end
+ if type(encfile) == "string" and encfile ~= "auto" then
+ encoding = fonts.encodings.load(file.addsuffix(encfile,"enc"))
+ if encoding then
+ encoding = encoding.vector
+ end
+ end
+ if not encoding then
+ report_tfm("bad encoding for %a, quitting",tfmfile)
+ return
+ end
+
+ local unicoding = fonts.encodings.agl and fonts.encodings.agl.unicodes
+ local virtualid = tfmcache[tfmdata]
+ local tfmdata = table.copy(tfmdata) -- good enough for small fonts
+ local characters = { }
+ local originals = tfmdata.characters
+ local indices = { }
+ local parentfont = { "font", 1 }
+ local private = tfmdata.privateoffset or constructors.privateoffset
+ local reported = encdone[tfmfile][encfile]
+
+ -- create characters table
+
+ local backmap = vector and table.swapped(vector)
+ local done = { } -- prevent duplicate
+
+ for index, name in sortedhash(encoding) do -- predictable order
+ local unicode = unicoding[name]
+ local original = originals[index]
+ if original then
+ if unicode then
+ original.unicode = unicode
+ else
+ unicode = private
+ private = private + 1
+ if not reported then
+ report_tfm("glyph %a in font %a with encoding %a gets unicode %U",name,tfmfile,encfile,unicode)
+ end
+ end
+ characters[unicode] = original
+ indices[index] = unicode
+ original.name = name -- so one can lookup weird names
+ if backmap then
+ original.index = backmap[name]
+ else -- probably bitmap
+ original.commands = { parentfont, charcommand[index] } -- or "slot"
+ original.oindex = index
+ end
+ done[name] = true
+ elseif not done[name] then
+ report_tfm("bad index %a in font %a with name %a",index,tfmfile,name)
+ end
+ end
+
+ encdone[tfmfile][encfile] = true
+
+ -- redo kerns and ligatures
+
+ for k, v in next, characters do
+ local kerns = v.kerns
+ if kerns then
+ local t = { }
+ for k, v in next, kerns do
+ local i = indices[k]
+ if i then
+ t[i] = v
+ end
+ end
+ v.kerns = next(t) and t or nil
+ end
+ local ligatures = v.ligatures
+ if ligatures then
+ local t = { }
+ for k, v in next, ligatures do
+ local i = indices[k]
+ if i then
+ t[i] = v
+ v.char = indices[v.char]
+ end
+ end
+ v.ligatures = next(t) and t or nil
+ end
+ end
+
+ -- wrap up
+
+ tfmdata.fonts = { { id = virtualid } }
+ tfmdata.characters = characters
+ tfmdata.fullname = tfmdata.fullname or tfmdata.name
+ tfmdata.psname = file.nameonly(pfbfile or tfmdata.name)
+ tfmdata.filename = pfbfile
+ tfmdata.encodingbytes = 2
+ -- tfmdata.format = bitmap and "type3" or "type1"
+ tfmdata.format = "type1"
+ tfmdata.tounicode = 1
+ tfmdata.embedding = "subset"
+ tfmdata.usedbitmap = bitmap and virtualid
+ tfmdata.private = private
+
+ return tfmdata
+ end
+
+end
+
+-- This code adds a ToUnicode vector for bitmap fonts. We don't bother about
+-- ranges because we have small fonts. it works ok with acrobat but fails with
+-- the other viewers (they get confused by the bitmaps I guess).
+
+do
+
+ local template = [[
+/CIDInit /ProcSet findresource begin
+ 12 dict begin
+ begincmap
+ /CIDSystemInfo << /Registry (TeX) /Ordering (bitmap-%s) /Supplement 0 >> def
+ /CMapName /TeX-bitmap-%s def
+ /CMapType 2 def
+ 1 begincodespacerange
+ <00> <FF>
+ endcodespacerange
+ %s beginbfchar
+%s
+ endbfchar
+ endcmap
+CMapName currentdict /CMap defineresource pop end
+end
+end
+]]
+
+ local flushstreamobject = lpdf and lpdf.flushstreamobject -- context
+ local setfontattributes = lpdf and lpdf.setfontattributes -- context
+
+ if not flushstreamobject then
+ flushstreamobject = function(data)
+ return pdf.obj { immediate = true, type = "stream", string = data } -- generic
+ end
+ end
+
+ if not setfontattributes then
+ setfontattributes = function(id,data)
+ return pdf.setfontattributes(id,data) -- generic
+ end
+ end
+
+ function tfm.addtounicode(tfmdata)
+ local id = tfmdata.usedbitmap
+ local map = { }
+ local char = { } -- no need for range, hardly used
+ for k, v in next, tfmdata.characters do
+ local index = v.oindex
+ local tounicode = v.tounicode
+ if index and tounicode then
+ map[index] = tounicode
+ end
+ end
+ for k, v in sortedhash(map) do
+ char[#char+1] = format("<%02X> <%s>",k,v)
+ end
+ char = concat(char,"\n")
+ local stream = format(template,id,id,#char,char)
+ local reference = flushstreamobject(stream,nil,true)
+ setfontattributes(id,format("/ToUnicode %i 0 R",reference))
+ end
+
+end
+
+-- Now we implement the regular features handlers. We need to convert the
+-- tfm specific structures to opentype structures. In basemode they are
+-- converted back so that is a bit of a waste but it's fast enough.
+
+do
+
+ local everywhere = { ["*"] = { ["*"] = true } } -- or: { ["*"] = { "*" } }
+ local noflags = { false, false, false, false }
+
+ local function enhance_normalize_features(data)
+ local ligatures = setmetatableindex("table")
+ local kerns = setmetatableindex("table")
+ local characters = data.characters
+ for u, c in next, characters do
+ local l = c.ligatures
+ local k = c.kerns
+ if l then
+ ligatures[u] = l
+ for u, v in next, l do
+ l[u] = { ligature = v.char }
+ end
+ c.ligatures = nil
+ end
+ if k then
+ kerns[u] = k
+ for u, v in next, k do
+ k[u] = v -- { v, 0 }
+ end
+ c.kerns = nil
+ end
+ end
+
+ for u, l in next, ligatures do
+ for k, v in next, l do
+ local vl = v.ligature
+ local dl = ligatures[vl]
+ if dl then
+ for kk, vv in next, dl do
+ v[kk] = vv -- table.copy(vv)
+ end
+ end
+ end
+ end
+
+ local features = {
+ gpos = { },
+ gsub = { },
+ }
+ local sequences = {
+ -- only filled ones
+ }
+ if next(ligatures) then
+ features.gsub.liga = everywhere
+ data.properties.hasligatures = true
+ sequences[#sequences+1] = {
+ features = {
+ liga = everywhere,
+ },
+ flags = noflags,
+ name = "s_s_0",
+ nofsteps = 1,
+ order = { "liga" },
+ type = "gsub_ligature",
+ steps = {
+ {
+ coverage = ligatures,
+ },
+ },
+ }
+ end
+ if next(kerns) then
+ features.gpos.kern = everywhere
+ data.properties.haskerns = true
+ sequences[#sequences+1] = {
+ features = {
+ kern = everywhere,
+ },
+ flags = noflags,
+ name = "p_s_0",
+ nofsteps = 1,
+ order = { "kern" },
+ type = "gpos_pair",
+ steps = {
+ {
+ format = "kern",
+ coverage = kerns,
+ },
+ },
+ }
+ end
+ data.resources.features = features
+ data.resources.sequences = sequences
+ data.shared.resources = data.shared.resources or resources
+ end
+
+ registertfmenhancer("normalize features", enhance_normalize_features)
+ registertfmenhancer("check extra features", otfenhancers.enhance)
+
+end
+
+-- As with type one (afm) loading, we just use the opentype ones:
+
+registertfmfeature {
+ name = "mode",
+ description = "mode",
+ initializers = {
+ base = otf.modeinitializer,
+ node = otf.modeinitializer,
+ }
+}
+
+registertfmfeature {
+ name = "features",
+ description = "features",
+ default = true,
+ initializers = {
+ base = otf.basemodeinitializer,
+ node = otf.nodemodeinitializer,
+ },
+ processors = {
+ node = otf.featuresprocessor,
+ }
+}
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua
index 06fb682f3e5..9f45408b1b7 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua
@@ -257,7 +257,9 @@ if non_generic_context.luatex_fonts.skip_loading ~= true then
loadmodule('font-vfc.lua')
- -- This is the bulk of opentype code.
+ -- This is the bulk of opentype code. The color and variable font support (as for
+ -- emoji) can (and might) actually go away here because it has never been used
+ -- outside context so in retrospect there was no need for it being generic.
loadmodule('font-otr.lua')
loadmodule('font-oti.lua')
@@ -283,7 +285,7 @@ if non_generic_context.luatex_fonts.skip_loading ~= true then
-- And for traditional TeX fonts.
- loadmodule('font-tfm.lua')
+ loadmodule('luatex-fonts-tfm.lua')
-- Some common code.
diff --git a/Master/tlpkg/bin/tlpkginfo b/Master/tlpkg/bin/tlpkginfo
index 79e9d25a14b..bd1fb9e2b60 100755
--- a/Master/tlpkg/bin/tlpkginfo
+++ b/Master/tlpkg/bin/tlpkginfo
@@ -409,7 +409,7 @@ sub prepare {
#warn "prepare: initial tds_path for $pkg = $tds_path\n";
# ...except for heiko, when running on tug.org...
if ($pkg eq "context") {
- $tds_path = "/home/ftp/mirror/www.pragma-ade.nl/context/current/cont-tmf.zip";
+ $tds_path = "/home/ftp/mirror/www.pragma-ade.nl/context/latest/cont-tmf.zip";
} elsif ($pkg eq "cmexb") {
# as with enctex case